pax_global_header00006660000000000000000000000064147747430410014525gustar00rootroot0000000000000052 comment=95686ec8bedce26accb468aa294987c5466efac7 ipython-8.35.0/000077500000000000000000000000001477474304100133145ustar00rootroot00000000000000ipython-8.35.0/.editorconfig000066400000000000000000000005111477474304100157660ustar00rootroot00000000000000# Top-most EditorConfig file root = true [*] # Unix-style newlines with a newline ending every file end_of_line = lf insert_final_newline = true charset = utf-8 # Four-space indentation indent_size = 4 indent_style = space trim_trailing_whitespace = false [*.yml] # Two-space indentation indent_size = 2 indent_style = space ipython-8.35.0/.flake8000066400000000000000000000002171477474304100144670ustar00rootroot00000000000000[flake8] ignore = W293,E301,E271,E265,W291,E722,E302,C901,E225,E128,E122,E226,E231 max-line-length = 160 exclude = tests/* max-complexity = 10 ipython-8.35.0/.git-blame-ignore-revs000066400000000000000000000022561477474304100174210ustar00rootroot00000000000000# When making commits that are strictly formatting/style changes, add the # commit hash here, so git blame can ignore the change. See docs for more # details: # https://git-scm.com/docs/git-config#Documentation/git-config.txt-blameignoreRevsFile # # # You should be able to execute either # ./tools/configure-git-blame-ignore-revs.bat or # ./tools/configure-git-blame-ignore-revs.sh # # Example entries: # # # initial black-format # # rename something internal 6e748726282d1acb9a4f9f264ee679c474c4b8f5 # Apply pygrade --36plus on IPython/core/tests/test_inputtransformer.py. 0233e65d8086d0ec34acb8685b7a5411633f0899 # apply pyupgrade to IPython/extensions/tests/test_autoreload.py a6a7e4dd7e51b892147895006d3a2a6c34b79ae6 # apply black to IPython/extensions/tests/test_autoreload.py c5ca5a8f25432dfd6b9eccbbe446a8348bf37cfa # apply pyupgrade to IPython/extensions/autoreload.py 50624b84ccdece781750f5eb635a9efbf2fe30d6 # apply black to IPython/extensions/autoreload.py b7aaa47412b96379198705955004930c57f9d74a # apply pyupgrade to IPython/extensions/autoreload.py 9c7476a88af3e567426b412f1b3c778401d8f6aa # apply black to IPython/extensions/autoreload.py ipython-8.35.0/.gitattributes000066400000000000000000000001551477474304100162100ustar00rootroot00000000000000IPython/.git_commit_info.ini export-subst * text=auto *.py diff=python *.js diff=javascript *.html diff=html ipython-8.35.0/.github/000077500000000000000000000000001477474304100146545ustar00rootroot00000000000000ipython-8.35.0/.github/ISSUE_TEMPLATE.md000066400000000000000000000007571477474304100173720ustar00rootroot00000000000000--- name: Bug report / Question / Feature about: Anything related to IPython itsel title: '' labels: '' assignees: '' --- ipython-8.35.0/.github/dependabot.yml000066400000000000000000000007671477474304100175160ustar00rootroot00000000000000# 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: "github-actions" directory: "/" schedule: interval: "monthly" groups: actions: patterns: - "*" ipython-8.35.0/.github/workflows/000077500000000000000000000000001477474304100167115ustar00rootroot00000000000000ipython-8.35.0/.github/workflows/docs.yml000066400000000000000000000020221477474304100203600ustar00rootroot00000000000000name: Build docs on: [push, pull_request] permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: 3.x - name: Install Graphviz run: | sudo apt-get update sudo apt-get install graphviz - name: Install Python dependencies run: | python -m pip install --upgrade pip setuptools coverage rstvalidator pip install -r docs/requirements.txt - name: Build docs run: | python -m rstvalidator long_description.rst python tools/fixup_whats_new_pr.py make -C docs/ html SPHINXOPTS="-W" \ PYTHON="coverage run -a" \ SPHINXBUILD="coverage run -a -m sphinx.cmd.build" - name: Generate coverage xml run: | coverage combine `find . -name .coverage\*` && coverage xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: name: Docs ipython-8.35.0/.github/workflows/downstream.yml000066400000000000000000000045751477474304100216320ustar00rootroot00000000000000name: Run Downstream tests on: push: pull_request: # Run weekly on Monday at 1:23 UTC schedule: - cron: '23 1 * * 1' workflow_dispatch: permissions: contents: read jobs: test: runs-on: ${{ matrix.os }} # Disable scheduled CI runs on forks if: github.event_name != 'schedule' || github.repository_owner == 'ipython' strategy: matrix: os: [ubuntu-latest] python-version: ["3.10"] include: - os: macos-13 python-version: "3.10" steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Update Python installer run: | python -m pip install --upgrade pip setuptools wheel - name: Install ipykernel run: | cd .. git clone https://github.com/ipython/ipykernel cd ipykernel pip install -e .[test] cd .. - name: Install and update Python dependencies run: | python -m pip install --upgrade -e file://$PWD#egg=ipython[test] # we must install IPython after ipykernel to get the right versions. python -m pip install --upgrade --upgrade-strategy eager flaky ipyparallel - name: pytest ipykernel env: COLUMNS: 120 run: | cd ../ipykernel pytest - name: Install sagemath-repl run: | # Sept 2024, sage has been failing for a while, # Skipping. # cd .. # git clone --depth 1 https://github.com/sagemath/sage # cd sage # # We cloned it for the tests, but for simplicity we install the # # wheels from PyPI. # # (Avoid 10.3b6 because of https://github.com/sagemath/sage/pull/37178) # pip install --pre sagemath-repl sagemath-environment # # Install optionals that make more tests pass # pip install pillow # pip install --pre sagemath-categories # cd .. - name: Test sagemath-repl run: | # cd ../sage/ # # From https://github.com/sagemath/sage/blob/develop/pkgs/sagemath-repl/tox.ini # sage-runtests -p --environment=sage.all__sagemath_repl --baseline-stats-path=pkgs/sagemath-repl/known-test-failures.json --initial --optional=sage src/sage/repl src/sage/doctest src/sage/misc/sage_input.py src/sage/misc/sage_eval.py ipython-8.35.0/.github/workflows/mypy.yml000066400000000000000000000014521477474304100204340ustar00rootroot00000000000000name: Run MyPy on: push: branches: [ main, 7.x] pull_request: branches: [ main, 7.x] permissions: contents: read jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.x"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install mypy pyflakes flake8 types-decorator - name: Lint with mypy run: | set -e mypy IPython - name: Lint with pyflakes run: | set -e flake8 IPython/core/magics/script.py flake8 IPython/core/magics/packaging.py ipython-8.35.0/.github/workflows/nightly-wheel-build.yml000066400000000000000000000020651477474304100233140ustar00rootroot00000000000000name: Nightly Wheel builder on: workflow_dispatch: schedule: # this cron is ran every Sunday at midnight UTC - cron: '0 0 * * 0' jobs: upload_anaconda: name: Upload to Anaconda runs-on: ubuntu-latest # The artifacts cannot be uploaded on PRs, also disable scheduled CI runs on forks if: github.event_name != 'pull_request' && (github.event_name != 'schedule' || github.repository_owner == 'ipython') steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" cache: pip cache-dependency-path: | pyproject.toml - name: Try building with Python build if: runner.os != 'Windows' # setup.py does not support sdist on Windows run: | python -m pip install build python -m build - name: Upload wheel uses: scientific-python/upload-nightly-action@main with: artifacts_path: dist anaconda_nightly_upload_token: ${{secrets.UPLOAD_TOKEN}} ipython-8.35.0/.github/workflows/python-package.yml000066400000000000000000000022221477474304100223440ustar00rootroot00000000000000# This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions name: Python package permissions: contents: read on: push: branches: [ main, 7.x ] pull_request: branches: [ main, 7.x ] jobs: formatting: runs-on: ubuntu-latest timeout-minutes: 5 steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v5 with: python-version: 3.x - name: Install dependencies run: | python -m pip install --upgrade pip # when changing the versions please update CONTRIBUTING.md too pip install --only-binary ':all:' darker==2.1.1 black==24.10.0 - name: Lint with darker run: | darker -r 60625f241f298b5039cb2debc365db38aa7bb522 --check --diff . || ( echo "Changes need auto-formatting. Run:" echo " darker -r 60625f241f298b5039cb2debc365db38aa7bb522 ." echo "then commit and push changes to fix." exit 1 ) ipython-8.35.0/.github/workflows/test.yml000066400000000000000000000102521477474304100204130ustar00rootroot00000000000000name: Run tests on: push: branches: - main - '*.x' pull_request: # Run weekly on Monday at 1:23 UTC schedule: - cron: '23 1 * * 1' workflow_dispatch: jobs: test: runs-on: ${{ matrix.os }} # Disable scheduled CI runs on forks if: github.event_name != 'schedule' || github.repository_owner == 'ipython' strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] python-version: ["3.10", "3.11", "3.12","3.13"] deps: [test_extra] # Test all on ubuntu, test ends on macos include: - os: macos-latest python-version: "3.10" deps: test_extra - os: macos-latest python-version: "3.11" deps: test_extra # Tests minimal dependencies set - os: ubuntu-latest python-version: "3.11" deps: test # Tests latest development Python version - os: ubuntu-latest python-version: "3.13" deps: test # Installing optional dependencies stuff takes ages on PyPy - os: ubuntu-latest python-version: "pypy-3.10" deps: test - os: windows-latest python-version: "pypy-3.10" deps: test - os: macos-latest python-version: "pypy-3.10" deps: test # Temporary CI run to use entry point compatible code in matplotlib-inline. - os: ubuntu-latest python-version: "3.12" deps: test_extra want-latest-entry-point-code: true 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 cache-dependency-path: | pyproject.toml - name: Install latex if: runner.os == 'Linux' && matrix.deps == 'test_extra' run: echo "disable latex for now, issues in mirros" #sudo apt-get -yq -o Acquire::Retries=3 --no-install-suggests --no-install-recommends install texlive dvipng - name: Install and update Python dependencies (binary only) if: ${{ ! contains( matrix.python-version, 'dev' ) }} run: | python -m pip install --only-binary ':all:' --upgrade pip setuptools wheel build python -m pip install --only-binary ':all:' --no-binary curio --upgrade -e .[${{ matrix.deps }}] python -m pip install --only-binary ':all:' --upgrade check-manifest pytest-cov 'pytest<8' - name: Install and update Python dependencies (dev?) if: ${{ contains( matrix.python-version, 'dev' ) }} run: | python -m pip install --pre --upgrade pip setuptools wheel build python -m pip install --pre --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple --no-binary curio --upgrade -e .[${{ matrix.deps }}] python -m pip install --pre --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple --upgrade check-manifest pytest-cov - name: Try building with Python build if: runner.os != 'Windows' # setup.py does not support sdist on Windows run: | python -m build shasum -a 256 dist/* - name: Check manifest if: runner.os != 'Windows' # setup.py does not support sdist on Windows run: check-manifest - name: Install entry point compatible code (TEMPORARY) if: matrix.want-latest-entry-point-code run: | python -m pip list # Not installing matplotlib's entry point code as building matplotlib from source is complex. # Rely upon matplotlib to test all the latest entry point branches together. python -m pip install --upgrade git+https://github.com/ipython/matplotlib-inline.git@main python -m pip list - name: pytest env: COLUMNS: 120 run: | pytest --color=yes -raXxs ${{ startsWith(matrix.python-version, 'pypy') && ' ' || '--cov --cov-report=xml' }} --maxfail=15 - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: name: Test files: /home/runner/work/ipython/ipython/coverage.xml ipython-8.35.0/.gitignore000066400000000000000000000011031477474304100152770ustar00rootroot00000000000000MANIFEST build dist _build docs/man/*.gz docs/source/api/generated docs/source/config/options docs/source/config/shortcuts/*.csv docs/source/config/shortcuts/table.tsv docs/source/savefig docs/source/interactive/magics-generated.txt docs/gh-pages jupyter_notebook/notebook/static/mathjax jupyter_notebook/static/style/*.map *.py[co] __pycache__ *.egg-info *~ *.bak .ipynb_checkpoints .tox .DS_Store \#*# .#* .cache .coverage *.swp .pytest_cache .python-version .venv*/ venv*/ .mypy_cache/ # jetbrains ide stuff *.iml .idea/ # vscode ide stuff *.code-workspace .history .vscode ipython-8.35.0/.mailmap000066400000000000000000000305771477474304100147510ustar00rootroot00000000000000A. J. Holyoake ajholyoake Alok Singh Alok Singh <8325708+alok@users.noreply.github.com> Aaron Culich Aaron Culich Aron Ahmadia ahmadia Arthur Svistunov <18216480+madbird1304@users.noreply.github.com> Arthur Svistunov <18216480+madbird1304@users.noreply.github.com> Adam Hackbarth Benjamin Ragan-Kelley Benjamin Ragan-Kelley Min RK Benjamin Ragan-Kelley MinRK Barry Wark Barry Wark Ben Edwards Ben Edwards Bradley M. Froehle Bradley M. Froehle Bradley M. Froehle Bradley Froehle Brandon Parsons Brandon Parsons Brian E. Granger Brian Granger Brian E. Granger Brian Granger <> Brian E. Granger bgranger <> Brian E. Granger bgranger Blazej Michalik <6691643+MrMino@users.noreply.github.com> Blazej Michalik Christoph Gohlke cgohlke Cyrille Rossant rossant Damián Avila damianavila Damián Avila damianavila Damon Allen damontallen Darren Dale darren.dale <> Darren Dale Darren Dale <> Dav Clark Dav Clark <> Dav Clark Dav Clark David Hirschfeld dhirschfeld David P. Sanders David P. Sanders David Warde-Farley David Warde-Farley <> Dan Green-Leipciger Doug Blank Doug Blank Eugene Van den Bulke Eugene Van den Bulke Evan Patterson Evan Patterson Evan Patterson Evan Patterson Evan Patterson epatters Evan Patterson epatters Ernie French Ernie French Ernie French ernie french Ernie French ernop Fernando Perez Fernando Perez Fernando Perez Fernando Perez fperez <> Fernando Perez fptest <> Fernando Perez fptest1 <> Fernando Perez Fernando Perez Fernando Perez Fernando Perez <> Fernando Perez Fernando Perez Frank Murphy Frank Murphy Gabriel Becker gmbecker Gael Varoquaux gael.varoquaux <> Gael Varoquaux gvaroquaux Gael Varoquaux Gael Varoquaux <> Ingolf Becker watercrossing Jake Vanderplas Jake Vanderplas Jakob Gager jakobgager Jakob Gager jakobgager Jakob Gager jakobgager Jason Grout Jason Grout Jason Gors jason gors Jason Gors jgors Jens Hedegaard Nielsen Jens Hedegaard Nielsen Jens Hedegaard Nielsen Jens H Nielsen Jens Hedegaard Nielsen Jens H. Nielsen Jez Ng Jez Ng Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic jon Jonathan Frederic U-Jon-PC\Jon Jonathan March Jonathan March Jean Cruypenynck Jean Cruypenynck Jonathan March jdmarch Jörgen Stenarson Jörgen Stenarson Jörgen Stenarson Jorgen Stenarson Jörgen Stenarson Jorgen Stenarson <> Jörgen Stenarson jstenar Jörgen Stenarson jstenar <> Jörgen Stenarson Jörgen Stenarson Juergen Hasch juhasch Juergen Hasch juhasch Julia Evans Julia Evans Kester Tong KesterTong Kyle Kelley Kyle Kelley Kyle Kelley rgbkrk kd2718 Kory Donati kory donati Kory Donati Kory Donati Kory Donati koryd Laurent Dufréchou Laurent Dufréchou Laurent Dufréchou laurent dufrechou <> Laurent Dufréchou laurent.dufrechou <> Laurent Dufréchou Laurent Dufrechou <> Laurent Dufréchou laurent.dufrechou@gmail.com <> Laurent Dufréchou ldufrechou Luciana da Costa Marques luciana Lorena Pantano Lorena Luis Pedro Coelho Luis Pedro Coelho Marc Molla marcmolla Martín Gaitán Martín Gaitán Matthias Bussonnier Matthias BUSSONNIER Matthias Bussonnier Bussonnier Matthias Matthias Bussonnier Matthias BUSSONNIER Matthias Bussonnier Matthias Bussonnier Matthias Bussonnier Matthias Bussonnier Michael Droettboom Michael Droettboom Nicholas Bollweg Nicholas Bollweg (Nick) Nicolas Rougier Nikolay Koldunov Nikolay Koldunov Omar Andrés Zapata Mesa Omar Andres Zapata Mesa Omar Andrés Zapata Mesa Omar Andres Zapata Mesa Pankaj Pandey Pankaj Pandey Pascal Schetelat pascal-schetelat Paul Ivanov Paul Ivanov Paul Ivanov Paul Ivanov Pauli Virtanen Pauli Virtanen <> Pauli Virtanen Pauli Virtanen Pierre Gerold Pierre Gerold Pietro Berkes Pietro Berkes Piti Ongmongkolkul piti118 Prabhu Ramachandran Prabhu Ramachandran <> Puneeth Chaganti Puneeth Chaganti Robert Kern rkern <> Robert Kern Robert Kern Robert Kern Robert Kern Robert Kern Robert Kern <> Robert Marchman Robert Marchman Satrajit Ghosh Satrajit Ghosh Satrajit Ghosh Satrajit Ghosh Scott Sanderson Scott Sanderson smithj1 smithj1 smithj1 smithj1 Sang Min Park Sang Min Park Steven Johnson stevenJohnson Steven Silvester blink1073 S. Weber s8weber Stefan van der Walt Stefan van der Walt Silvia Vinyes Silvia Silvia Vinyes silviav12 Srinivas Reddy Thatiparthy Srinivas Reddy Thatiparthy Sylvain Corlay Sylvain Corlay sylvain.corlay Samuel Gaist Richard Shadrach Juan Luis Cano Rodríguez Tamir Bahar Tamir Bahar Ted Drain TD22057 Théophile Studer Théophile Studer Thomas A Caswell Thomas A Caswell Thomas Kluyver Thomas Thomas Kluyver Thomas Kluyver Thomas Spura Thomas Spura Timo Paulssen timo vds vds2212 vds vds Ville M. Vainio Ville M. Vainio ville Ville M. Vainio ville Ville M. Vainio vivainio <> Ville M. Vainio Ville M. Vainio Ville M. Vainio Ville M. Vainio Walter Doerwald walter.doerwald <> Walter Doerwald Walter Doerwald <> Wieland Hoffmann Wieland Hoffmann W. Trevor King W. Trevor King Yoval P. y-p ipython-8.35.0/.meeseeksdev.yml000066400000000000000000000005741477474304100164230ustar00rootroot00000000000000users: LucianaMarques: can: - tag special: everyone: can: - say - tag - untag - close config: tag: only: - good first issue - async/await - backported - help wanted - documentation - notebook - tab-completion - windows ipython-8.35.0/.pre-commit-config.yaml000066400000000000000000000007171477474304100176020ustar00rootroot00000000000000# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - id: check-added-large-files - repo: https://github.com/akaihola/darker rev: 1.7.2 hooks: - id: darker additional_dependencies: [isort, mypy, flake8] ipython-8.35.0/.readthedocs.yaml000066400000000000000000000005741477474304100165510ustar00rootroot00000000000000version: 2 build: os: ubuntu-22.04 tools: python: "3.11" apt_packages: - graphviz sphinx: configuration: docs/source/conf.py # Optional but recommended, declare the Python requirements required # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - requirements: docs/requirements.txt ipython-8.35.0/CONTRIBUTING.md000066400000000000000000000107131477474304100155470ustar00rootroot00000000000000## Triaging Issues On the IPython repository, we strive to trust users and give them responsibility. By using one of our bots, any user can close issues or add/remove labels by mentioning the bot and asking it to do things on your behalf. To close an issue (or PR), even if you did not create it, use the following: > @meeseeksdev close This command can be in the middle of another comment, but must start on its own line. To add labels to an issue, ask the bot to `tag` with a comma-separated list of tags to add: > @meeseeksdev tag windows, documentation Only already pre-created tags can be added. So far, the list is limited to: `async/await`, `backported`, `help wanted`, `documentation`, `notebook`, `tab-completion`, `windows` To remove a label, use the `untag` command: > @meeseeksdev untag windows, documentation We'll be adding additional capabilities for the bot and will share them here when they are ready to be used. ## Opening an Issue When opening a new Issue, please take the following steps: 1. Search GitHub and/or Google for your issue to avoid duplicate reports. Keyword searches for your error messages are most helpful. 2. If possible, try updating to main and reproducing your issue, because we may have already fixed it. 3. Try to include a minimal reproducible test case. 4. Include relevant system information. Start with the output of: python -c "import IPython; print(IPython.sys_info())" And include any relevant package versions, depending on the issue, such as matplotlib, numpy, Qt, Qt bindings (PyQt/PySide), tornado, web browser, etc. ## Pull Requests Some guidelines on contributing to IPython: * All work is submitted via Pull Requests. * Pull Requests can be submitted as soon as there is code worth discussing. Pull Requests track the branch, so you can continue to work after the PR is submitted. Review and discussion can begin well before the work is complete, and the more discussion the better. The worst case is that the PR is closed. * Pull Requests should generally be made against main * Pull Requests should be tested, if feasible: - bugfixes should include regression tests. - new behavior should at least get minimal exercise. * New features and backwards-incompatible changes should be documented by adding a new file to the [pr](docs/source/whatsnew/pr) directory, see [the README.md there](docs/source/whatsnew/pr/README.md) for details. * Don't make 'cleanup' pull requests just to change code style. We don't follow any style guide strictly, and we consider formatting changes unnecessary noise. If you're making functional changes, you can clean up the specific pieces of code you're working on. [GitHub Actions](https://github.com/ipython/ipython/actions/workflows/test.yml) does a pretty good job testing IPython and Pull Requests, but it may make sense to manually perform tests, particularly for PRs that affect `IPython.parallel` or Windows. For more detailed information, see our [GitHub Workflow](https://github.com/ipython/ipython/wiki/Dev:-GitHub-workflow). ## Running Tests All the tests can be run by using ```shell pytest ``` All the tests for a single module (for example **test_alias**) can be run by using the fully qualified path to the module. ```shell pytest IPython/core/tests/test_alias.py ``` Only a single test (for example **test_alias_lifecycle**) within a single file can be run by adding the specific test after a `::` at the end: ```shell pytest IPython/core/tests/test_alias.py::test_alias_lifecycle ``` ## Code style * Before committing, run `darker -r 60625f241f298b5039cb2debc365db38aa7bb522 ` to apply selective `black` formatting on modified regions using [darker](https://github.com/akaihola/darker)==1.5.1 and black==22.10.0 * As described in the pull requests section, please avoid excessive formatting changes; if a formatting-only commit is necessary, consider adding its hash to [`.git-blame-ignore-revs`](https://github.com/ipython/ipython/blob/main/.git-blame-ignore-revs) file. ## Documentation Sphinx documentation can be built locally using standard sphinx `make` commands. To build HTML documentation from the root of the project, execute: ```shell pip install -r docs/requirements.txt # only needed once make -C docs/ html SPHINXOPTS="-W" ``` To force update of the API documentation, precede the `make` command with: ```shell python3 docs/autogen_api.py ``` Similarly, to force-update the configuration, run: ```shell python3 docs/autogen_config.py ``` ipython-8.35.0/COPYING.rst000066400000000000000000000031471477474304100151630ustar00rootroot00000000000000============================= The IPython licensing terms ============================= IPython is licensed under the terms of the Modified BSD License (also known as New or Revised or 3-Clause BSD). See the LICENSE file. About the IPython Development Team ---------------------------------- Fernando Perez began IPython in 2001 based on code from Janko Hauser and Nathaniel Gray . Fernando is still the project lead. The IPython Development Team is the set of all contributors to the IPython project. This includes all of the IPython subprojects. The core team that coordinates development on GitHub can be found here: https://github.com/ipython/. Our Copyright Policy -------------------- IPython uses a shared copyright model. Each contributor maintains copyright over their contributions to IPython. But, it is important to note that these contributions are typically only changes to the repositories. Thus, the IPython source code, in its entirety is not the copyright of any single person or institution. Instead, it is the collective copyright of the entire IPython Development Team. If individual contributors want to maintain a record of what changes/contributions they have specific copyright on, they should indicate their copyright in the commit message of the change, when they commit the change to one of the IPython repositories. With this in mind, the following banner should be used in any source code file to indicate the copyright and license terms: :: # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. ipython-8.35.0/IPython/000077500000000000000000000000001477474304100147065ustar00rootroot00000000000000ipython-8.35.0/IPython/__init__.py000066400000000000000000000146471477474304100170330ustar00rootroot00000000000000# PYTHON_ARGCOMPLETE_OK """ IPython: tools for interactive and parallel computing in Python. https://ipython.org """ #----------------------------------------------------------------------------- # Copyright (c) 2008-2011, IPython Development Team. # Copyright (c) 2001-2007, Fernando Perez # Copyright (c) 2001, Janko Hauser # Copyright (c) 2001, Nathaniel Gray # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import sys #----------------------------------------------------------------------------- # Setup everything #----------------------------------------------------------------------------- # Don't forget to also update setup.py when this changes! if sys.version_info < (3, 10): raise ImportError( """ IPython 8.19+ supports Python 3.10 and above, following SPEC0. IPython 8.13+ supports Python 3.9 and above, following NEP 29. IPython 8.0-8.12 supports Python 3.8 and above, following NEP 29. When using Python 2.7, please install IPython 5.x LTS Long Term Support version. Python 3.3 and 3.4 were supported up to IPython 6.x. Python 3.5 was supported with IPython 7.0 to 7.9. Python 3.6 was supported with IPython up to 7.16. Python 3.7 was still supported with the 7.x branch. See IPython `README.rst` file for more information: https://github.com/ipython/ipython/blob/main/README.rst """ ) #----------------------------------------------------------------------------- # Setup the top level names #----------------------------------------------------------------------------- from .core.getipython import get_ipython from .core import release from .core.application import Application from .terminal.embed import embed from .core.interactiveshell import InteractiveShell from .utils.sysinfo import sys_info from .utils.frame import extract_module_locals __all__ = ["start_ipython", "embed", "start_kernel", "embed_kernel"] # Release data __author__ = '%s <%s>' % (release.author, release.author_email) __license__ = release.license __version__ = release.version version_info = release.version_info # list of CVEs that should have been patched in this release. # this is informational and should not be relied upon. __patched_cves__ = {"CVE-2022-21699", "CVE-2023-24816"} def embed_kernel(module=None, local_ns=None, **kwargs): """Embed and start an IPython kernel in a given scope. If you don't want the kernel to initialize the namespace from the scope of the surrounding function, and/or you want to load full IPython configuration, you probably want `IPython.start_kernel()` instead. Parameters ---------- module : types.ModuleType, optional The module to load into IPython globals (default: caller) local_ns : dict, optional The namespace to load into IPython user namespace (default: caller) **kwargs : various, optional Further keyword args are relayed to the IPKernelApp constructor, such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), allowing configuration of the kernel. Will only have an effect on the first embed_kernel call for a given process. """ (caller_module, caller_locals) = extract_module_locals(1) if module is None: module = caller_module if local_ns is None: local_ns = dict(**caller_locals) # Only import .zmq when we really need it from ipykernel.embed import embed_kernel as real_embed_kernel real_embed_kernel(module=module, local_ns=local_ns, **kwargs) def start_ipython(argv=None, **kwargs): """Launch a normal IPython instance (as opposed to embedded) `IPython.embed()` puts a shell in a particular calling scope, such as a function or method for debugging purposes, which is often not desirable. `start_ipython()` does full, regular IPython initialization, including loading startup files, configuration, etc. much of which is skipped by `embed()`. This is a public API method, and will survive implementation changes. Parameters ---------- argv : list or None, optional If unspecified or None, IPython will parse command-line options from sys.argv. To prevent any command-line parsing, pass an empty list: `argv=[]`. user_ns : dict, optional specify this dictionary to initialize the IPython user namespace with particular values. **kwargs : various, optional Any other kwargs will be passed to the Application constructor, such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), allowing configuration of the instance (see :ref:`terminal_options`). """ from IPython.terminal.ipapp import launch_new_instance return launch_new_instance(argv=argv, **kwargs) def start_kernel(argv=None, **kwargs): """Launch a normal IPython kernel instance (as opposed to embedded) `IPython.embed_kernel()` puts a shell in a particular calling scope, such as a function or method for debugging purposes, which is often not desirable. `start_kernel()` does full, regular IPython initialization, including loading startup files, configuration, etc. much of which is skipped by `embed_kernel()`. Parameters ---------- argv : list or None, optional If unspecified or None, IPython will parse command-line options from sys.argv. To prevent any command-line parsing, pass an empty list: `argv=[]`. user_ns : dict, optional specify this dictionary to initialize the IPython user namespace with particular values. **kwargs : various, optional Any other kwargs will be passed to the Application constructor, such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), allowing configuration of the kernel. """ import warnings warnings.warn( "start_kernel is deprecated since IPython 8.0, use from `ipykernel.kernelapp.launch_new_instance`", DeprecationWarning, stacklevel=2, ) from ipykernel.kernelapp import launch_new_instance return launch_new_instance(argv=argv, **kwargs) ipython-8.35.0/IPython/__main__.py000066400000000000000000000007521477474304100170040ustar00rootroot00000000000000# PYTHON_ARGCOMPLETE_OK # encoding: utf-8 """Terminal-based IPython entry point. """ # ----------------------------------------------------------------------------- # Copyright (c) 2012, IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- from IPython import start_ipython start_ipython() ipython-8.35.0/IPython/conftest.py000066400000000000000000000050721477474304100171110ustar00rootroot00000000000000import builtins import inspect import os import pathlib import shutil import sys import types import pytest # Must register before it gets imported pytest.register_assert_rewrite("IPython.testing.tools") from .testing import tools def pytest_collection_modifyitems(items): """This function is automatically run by pytest passing all collected test functions. We use it to add asyncio marker to all async tests and assert we don't use test functions that are async generators which wouldn't make sense. """ for item in items: if inspect.iscoroutinefunction(item.obj): item.add_marker("asyncio") assert not inspect.isasyncgenfunction(item.obj) def get_ipython(): from .terminal.interactiveshell import TerminalInteractiveShell if TerminalInteractiveShell._instance: return TerminalInteractiveShell.instance() config = tools.default_config() config.TerminalInteractiveShell.simple_prompt = True # Create and initialize our test-friendly IPython instance. shell = TerminalInteractiveShell.instance(config=config) return shell @pytest.fixture(scope='session', autouse=True) def work_path(): path = pathlib.Path("./tmp-ipython-pytest-profiledir") os.environ["IPYTHONDIR"] = str(path.absolute()) if path.exists(): raise ValueError('IPython dir temporary path already exists ! Did previous test run exit successfully ?') path.mkdir() yield shutil.rmtree(str(path.resolve())) def nopage(strng, start=0, screen_lines=0, pager_cmd=None): if isinstance(strng, dict): strng = strng.get("text/plain", "") print(strng) def xsys(self, cmd): """Replace the default system call with a capturing one for doctest. """ # We use getoutput, but we need to strip it because pexpect captures # the trailing newline differently from commands.getoutput print(self.getoutput(cmd, split=False, depth=1).rstrip(), end="", file=sys.stdout) sys.stdout.flush() # for things to work correctly we would need this as a session fixture; # unfortunately this will fail on some test that get executed as _collection_ # time (before the fixture run), in particular parametrized test that contain # yields. so for now execute at import time. #@pytest.fixture(autouse=True, scope='session') def inject(): builtins.get_ipython = get_ipython builtins._ip = get_ipython() builtins.ip = get_ipython() builtins.ip.system = types.MethodType(xsys, ip) builtins.ip.builtin_trap.activate() from .core import page page.pager_page = nopage # yield inject() ipython-8.35.0/IPython/consoleapp.py000066400000000000000000000006371477474304100174310ustar00rootroot00000000000000""" Shim to maintain backwards compatibility with old IPython.consoleapp imports. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from warnings import warn warn("The `IPython.consoleapp` package has been deprecated since IPython 4.0." "You should import from jupyter_client.consoleapp instead.", stacklevel=2) from jupyter_client.consoleapp import * ipython-8.35.0/IPython/core/000077500000000000000000000000001477474304100156365ustar00rootroot00000000000000ipython-8.35.0/IPython/core/__init__.py000066400000000000000000000000001477474304100177350ustar00rootroot00000000000000ipython-8.35.0/IPython/core/alias.py000066400000000000000000000240011477474304100172760ustar00rootroot00000000000000# encoding: utf-8 """ System command aliases. Authors: * Fernando Perez * Brian Granger """ #----------------------------------------------------------------------------- # Copyright (C) 2008-2011 The IPython Development Team # # Distributed under the terms of the BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import os import re import sys from traitlets.config.configurable import Configurable from .error import UsageError from traitlets import List, Instance from logging import error import typing as t #----------------------------------------------------------------------------- # Utilities #----------------------------------------------------------------------------- # This is used as the pattern for calls to split_user_input. shell_line_split = re.compile(r'^(\s*)()(\S+)(.*$)') def default_aliases() -> t.List[t.Tuple[str, str]]: """Return list of shell aliases to auto-define. """ # Note: the aliases defined here should be safe to use on a kernel # regardless of what frontend it is attached to. Frontends that use a # kernel in-process can define additional aliases that will only work in # their case. For example, things like 'less' or 'clear' that manipulate # the terminal should NOT be declared here, as they will only work if the # kernel is running inside a true terminal, and not over the network. if os.name == 'posix': default_aliases = [('mkdir', 'mkdir'), ('rmdir', 'rmdir'), ('mv', 'mv'), ('rm', 'rm'), ('cp', 'cp'), ('cat', 'cat'), ] # Useful set of ls aliases. The GNU and BSD options are a little # different, so we make aliases that provide as similar as possible # behavior in ipython, by passing the right flags for each platform if sys.platform.startswith('linux'): ls_aliases = [('ls', 'ls -F --color'), # long ls ('ll', 'ls -F -o --color'), # ls normal files only ('lf', 'ls -F -o --color %l | grep ^-'), # ls symbolic links ('lk', 'ls -F -o --color %l | grep ^l'), # directories or links to directories, ('ldir', 'ls -F -o --color %l | grep /$'), # things which are executable ('lx', 'ls -F -o --color %l | grep ^-..x'), ] elif sys.platform.startswith('openbsd') or sys.platform.startswith('netbsd'): # OpenBSD, NetBSD. The ls implementation on these platforms do not support # the -G switch and lack the ability to use colorized output. ls_aliases = [('ls', 'ls -F'), # long ls ('ll', 'ls -F -l'), # ls normal files only ('lf', 'ls -F -l %l | grep ^-'), # ls symbolic links ('lk', 'ls -F -l %l | grep ^l'), # directories or links to directories, ('ldir', 'ls -F -l %l | grep /$'), # things which are executable ('lx', 'ls -F -l %l | grep ^-..x'), ] else: # BSD, OSX, etc. ls_aliases = [('ls', 'ls -F -G'), # long ls ('ll', 'ls -F -l -G'), # ls normal files only ('lf', 'ls -F -l -G %l | grep ^-'), # ls symbolic links ('lk', 'ls -F -l -G %l | grep ^l'), # directories or links to directories, ('ldir', 'ls -F -G -l %l | grep /$'), # things which are executable ('lx', 'ls -F -l -G %l | grep ^-..x'), ] default_aliases = default_aliases + ls_aliases elif os.name in ['nt', 'dos']: default_aliases = [('ls', 'dir /on'), ('ddir', 'dir /ad /on'), ('ldir', 'dir /ad /on'), ('mkdir', 'mkdir'), ('rmdir', 'rmdir'), ('echo', 'echo'), ('ren', 'ren'), ('copy', 'copy'), ] else: default_aliases = [] return default_aliases class AliasError(Exception): pass class InvalidAliasError(AliasError): pass class Alias(object): """Callable object storing the details of one alias. Instances are registered as magic functions to allow use of aliases. """ # Prepare blacklist blacklist = {'cd','popd','pushd','dhist','alias','unalias'} def __init__(self, shell, name, cmd): self.shell = shell self.name = name self.cmd = cmd self.__doc__ = "Alias for `!{}`".format(cmd) self.nargs = self.validate() def validate(self): """Validate the alias, and return the number of arguments.""" if self.name in self.blacklist: raise InvalidAliasError("The name %s can't be aliased " "because it is a keyword or builtin." % self.name) try: caller = self.shell.magics_manager.magics['line'][self.name] except KeyError: pass else: if not isinstance(caller, Alias): raise InvalidAliasError("The name %s can't be aliased " "because it is another magic command." % self.name) if not (isinstance(self.cmd, str)): raise InvalidAliasError("An alias command must be a string, " "got: %r" % self.cmd) nargs = self.cmd.count('%s') - self.cmd.count('%%s') if (nargs > 0) and (self.cmd.find('%l') >= 0): raise InvalidAliasError('The %s and %l specifiers are mutually ' 'exclusive in alias definitions.') return nargs def __repr__(self): return "".format(self.name, self.cmd) def __call__(self, rest=''): cmd = self.cmd nargs = self.nargs # Expand the %l special to be the user's input line if cmd.find('%l') >= 0: cmd = cmd.replace('%l', rest) rest = '' if nargs==0: if cmd.find('%%s') >= 1: cmd = cmd.replace('%%s', '%s') # Simple, argument-less aliases cmd = '%s %s' % (cmd, rest) else: # Handle aliases with positional arguments args = rest.split(None, nargs) if len(args) < nargs: raise UsageError('Alias <%s> requires %s arguments, %s given.' % (self.name, nargs, len(args))) cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:])) self.shell.system(cmd) #----------------------------------------------------------------------------- # Main AliasManager class #----------------------------------------------------------------------------- class AliasManager(Configurable): default_aliases: List = List(default_aliases()).tag(config=True) user_aliases: List = List(default_value=[]).tag(config=True) shell = Instance( "IPython.core.interactiveshell.InteractiveShellABC", allow_none=True ) def __init__(self, shell=None, **kwargs): super(AliasManager, self).__init__(shell=shell, **kwargs) # For convenient access if self.shell is not None: self.linemagics = self.shell.magics_manager.magics["line"] self.init_aliases() def init_aliases(self): # Load default & user aliases for name, cmd in self.default_aliases + self.user_aliases: if ( cmd.startswith("ls ") and self.shell is not None and self.shell.colors == "NoColor" ): cmd = cmd.replace(" --color", "") self.soft_define_alias(name, cmd) @property def aliases(self): return [(n, func.cmd) for (n, func) in self.linemagics.items() if isinstance(func, Alias)] def soft_define_alias(self, name, cmd): """Define an alias, but don't raise on an AliasError.""" try: self.define_alias(name, cmd) except AliasError as e: error("Invalid alias: %s" % e) def define_alias(self, name, cmd): """Define a new alias after validating it. This will raise an :exc:`AliasError` if there are validation problems. """ caller = Alias(shell=self.shell, name=name, cmd=cmd) self.shell.magics_manager.register_function(caller, magic_kind='line', magic_name=name) def get_alias(self, name): """Return an alias, or None if no alias by that name exists.""" aname = self.linemagics.get(name, None) return aname if isinstance(aname, Alias) else None def is_alias(self, name): """Return whether or not a given name has been defined as an alias""" return self.get_alias(name) is not None def undefine_alias(self, name): if self.is_alias(name): del self.linemagics[name] else: raise ValueError('%s is not an alias' % name) def clear_aliases(self): for name, _ in self.aliases: self.undefine_alias(name) def retrieve_alias(self, name): """Retrieve the command to which an alias expands.""" caller = self.get_alias(name) if caller: return caller.cmd else: raise ValueError('%s is not an alias' % name) ipython-8.35.0/IPython/core/application.py000066400000000000000000000447751477474304100205340ustar00rootroot00000000000000# encoding: utf-8 """ An application for IPython. All top-level applications should use the classes in this module for handling configuration and creating configurables. The job of an :class:`Application` is to create the master configuration object and then create the configurable objects, passing the config to them. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import atexit from copy import deepcopy import logging import os import shutil import sys from pathlib import Path from traitlets.config.application import Application, catch_config_error from traitlets.config.loader import ConfigFileNotFound, PyFileConfigLoader from IPython.core import release, crashhandler from IPython.core.profiledir import ProfileDir, ProfileDirError from IPython.paths import get_ipython_dir, get_ipython_package_dir from IPython.utils.path import ensure_dir_exists from traitlets import ( List, Unicode, Type, Bool, Set, Instance, Undefined, default, observe, ) if os.name == "nt": programdata = os.environ.get("PROGRAMDATA", None) if programdata is not None: SYSTEM_CONFIG_DIRS = [str(Path(programdata) / "ipython")] else: # PROGRAMDATA is not defined by default on XP. SYSTEM_CONFIG_DIRS = [] else: SYSTEM_CONFIG_DIRS = [ "/usr/local/etc/ipython", "/etc/ipython", ] ENV_CONFIG_DIRS = [] _env_config_dir = os.path.join(sys.prefix, 'etc', 'ipython') if _env_config_dir not in SYSTEM_CONFIG_DIRS: # only add ENV_CONFIG if sys.prefix is not already included ENV_CONFIG_DIRS.append(_env_config_dir) _envvar = os.environ.get('IPYTHON_SUPPRESS_CONFIG_ERRORS') if _envvar in {None, ''}: IPYTHON_SUPPRESS_CONFIG_ERRORS = None else: if _envvar.lower() in {'1','true'}: IPYTHON_SUPPRESS_CONFIG_ERRORS = True elif _envvar.lower() in {'0','false'} : IPYTHON_SUPPRESS_CONFIG_ERRORS = False else: sys.exit("Unsupported value for environment variable: 'IPYTHON_SUPPRESS_CONFIG_ERRORS' is set to '%s' which is none of {'0', '1', 'false', 'true', ''}."% _envvar ) # aliases and flags base_aliases = {} if isinstance(Application.aliases, dict): # traitlets 5 base_aliases.update(Application.aliases) base_aliases.update( { "profile-dir": "ProfileDir.location", "profile": "BaseIPythonApplication.profile", "ipython-dir": "BaseIPythonApplication.ipython_dir", "log-level": "Application.log_level", "config": "BaseIPythonApplication.extra_config_file", } ) base_flags = dict() if isinstance(Application.flags, dict): # traitlets 5 base_flags.update(Application.flags) base_flags.update( dict( debug=( {"Application": {"log_level": logging.DEBUG}}, "set log level to logging.DEBUG (maximize logging output)", ), quiet=( {"Application": {"log_level": logging.CRITICAL}}, "set log level to logging.CRITICAL (minimize logging output)", ), init=( { "BaseIPythonApplication": { "copy_config_files": True, "auto_create": True, } }, """Initialize profile with default config files. This is equivalent to running `ipython profile create ` prior to startup. """, ), ) ) class ProfileAwareConfigLoader(PyFileConfigLoader): """A Python file config loader that is aware of IPython profiles.""" def load_subconfig(self, fname, path=None, profile=None): if profile is not None: try: profile_dir = ProfileDir.find_profile_dir_by_name( get_ipython_dir(), profile, ) except ProfileDirError: return path = profile_dir.location return super(ProfileAwareConfigLoader, self).load_subconfig(fname, path=path) class BaseIPythonApplication(Application): name = "ipython" description = "IPython: an enhanced interactive Python shell." version = Unicode(release.version) aliases = base_aliases flags = base_flags classes = List([ProfileDir]) # enable `load_subconfig('cfg.py', profile='name')` python_config_loader_class = ProfileAwareConfigLoader # Track whether the config_file has changed, # because some logic happens only if we aren't using the default. config_file_specified = Set() config_file_name = Unicode() @default('config_file_name') def _config_file_name_default(self): return self.name.replace('-','_') + u'_config.py' @observe('config_file_name') def _config_file_name_changed(self, change): if change['new'] != change['old']: self.config_file_specified.add(change['new']) # The directory that contains IPython's builtin profiles. builtin_profile_dir = Unicode( os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default') ) config_file_paths = List(Unicode()) @default('config_file_paths') def _config_file_paths_default(self): return [] extra_config_file = Unicode( help="""Path to an extra config file to load. If specified, load this config file in addition to any other IPython config. """).tag(config=True) @observe('extra_config_file') def _extra_config_file_changed(self, change): old = change['old'] new = change['new'] try: self.config_files.remove(old) except ValueError: pass self.config_file_specified.add(new) self.config_files.append(new) profile = Unicode(u'default', help="""The IPython profile to use.""" ).tag(config=True) @observe('profile') def _profile_changed(self, change): self.builtin_profile_dir = os.path.join( get_ipython_package_dir(), u'config', u'profile', change['new'] ) add_ipython_dir_to_sys_path = Bool( False, """Should the IPython profile directory be added to sys path ? This option was non-existing before IPython 8.0, and ipython_dir was added to sys path to allow import of extensions present there. This was historical baggage from when pip did not exist. This now default to false, but can be set to true for legacy reasons. """, ).tag(config=True) ipython_dir = Unicode( help=""" The name of the IPython directory. This directory is used for logging configuration (through profiles), history storage, etc. The default is usually $HOME/.ipython. This option can also be specified through the environment variable IPYTHONDIR. """ ).tag(config=True) @default('ipython_dir') def _ipython_dir_default(self): d = get_ipython_dir() self._ipython_dir_changed({ 'name': 'ipython_dir', 'old': d, 'new': d, }) return d _in_init_profile_dir = False profile_dir = Instance(ProfileDir, allow_none=True) @default('profile_dir') def _profile_dir_default(self): # avoid recursion if self._in_init_profile_dir: return # profile_dir requested early, force initialization self.init_profile_dir() return self.profile_dir overwrite = Bool(False, help="""Whether to overwrite existing config files when copying""" ).tag(config=True) auto_create = Bool(False, help="""Whether to create profile dir if it doesn't exist""" ).tag(config=True) config_files = List(Unicode()) @default('config_files') def _config_files_default(self): return [self.config_file_name] copy_config_files = Bool(False, help="""Whether to install the default config files into the profile dir. If a new profile is being created, and IPython contains config files for that profile, then they will be staged into the new directory. Otherwise, default config files will be automatically generated. """).tag(config=True) verbose_crash = Bool(False, help="""Create a massive crash report when IPython encounters what may be an internal error. The default is to append a short message to the usual traceback""").tag(config=True) # The class to use as the crash handler. crash_handler_class = Type(crashhandler.CrashHandler) @catch_config_error def __init__(self, **kwargs): super(BaseIPythonApplication, self).__init__(**kwargs) # ensure current working directory exists try: os.getcwd() except: # exit if cwd doesn't exist self.log.error("Current working directory doesn't exist.") self.exit(1) #------------------------------------------------------------------------- # Various stages of Application creation #------------------------------------------------------------------------- def init_crash_handler(self): """Create a crash handler, typically setting sys.excepthook to it.""" self.crash_handler = self.crash_handler_class(self) sys.excepthook = self.excepthook def unset_crashhandler(): sys.excepthook = sys.__excepthook__ atexit.register(unset_crashhandler) def excepthook(self, etype, evalue, tb): """this is sys.excepthook after init_crashhandler set self.verbose_crash=True to use our full crashhandler, instead of a regular traceback with a short message (crash_handler_lite) """ if self.verbose_crash: return self.crash_handler(etype, evalue, tb) else: return crashhandler.crash_handler_lite(etype, evalue, tb) @observe('ipython_dir') def _ipython_dir_changed(self, change): old = change['old'] new = change['new'] if old is not Undefined: str_old = os.path.abspath(old) if str_old in sys.path: sys.path.remove(str_old) if self.add_ipython_dir_to_sys_path: str_path = os.path.abspath(new) sys.path.append(str_path) ensure_dir_exists(new) readme = os.path.join(new, "README") readme_src = os.path.join( get_ipython_package_dir(), "config", "profile", "README" ) if not os.path.exists(readme) and os.path.exists(readme_src): shutil.copy(readme_src, readme) for d in ("extensions", "nbextensions"): path = os.path.join(new, d) try: ensure_dir_exists(path) except OSError as e: # this will not be EEXIST self.log.error("couldn't create path %s: %s", path, e) self.log.debug("IPYTHONDIR set to: %s", new) def load_config_file(self, suppress_errors=IPYTHON_SUPPRESS_CONFIG_ERRORS): """Load the config file. By default, errors in loading config are handled, and a warning printed on screen. For testing, the suppress_errors option is set to False, so errors will make tests fail. `suppress_errors` default value is to be `None` in which case the behavior default to the one of `traitlets.Application`. The default value can be set : - to `False` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '0', or 'false' (case insensitive). - to `True` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '1' or 'true' (case insensitive). - to `None` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '' (empty string) or leaving it unset. Any other value are invalid, and will make IPython exit with a non-zero return code. """ self.log.debug("Searching path %s for config files", self.config_file_paths) base_config = 'ipython_config.py' self.log.debug("Attempting to load config file: %s" % base_config) try: if suppress_errors is not None: old_value = Application.raise_config_file_errors Application.raise_config_file_errors = not suppress_errors; Application.load_config_file( self, base_config, path=self.config_file_paths ) except ConfigFileNotFound: # ignore errors loading parent self.log.debug("Config file %s not found", base_config) pass if suppress_errors is not None: Application.raise_config_file_errors = old_value for config_file_name in self.config_files: if not config_file_name or config_file_name == base_config: continue self.log.debug("Attempting to load config file: %s" % self.config_file_name) try: Application.load_config_file( self, config_file_name, path=self.config_file_paths ) except ConfigFileNotFound: # Only warn if the default config file was NOT being used. if config_file_name in self.config_file_specified: msg = self.log.warning else: msg = self.log.debug msg("Config file not found, skipping: %s", config_file_name) except Exception: # For testing purposes. if not suppress_errors: raise self.log.warning("Error loading config file: %s" % self.config_file_name, exc_info=True) def init_profile_dir(self): """initialize the profile dir""" self._in_init_profile_dir = True if self.profile_dir is not None: # already ran return if 'ProfileDir.location' not in self.config: # location not specified, find by profile name try: p = ProfileDir.find_profile_dir_by_name(self.ipython_dir, self.profile, self.config) except ProfileDirError: # not found, maybe create it (always create default profile) if self.auto_create or self.profile == 'default': try: p = ProfileDir.create_profile_dir_by_name(self.ipython_dir, self.profile, self.config) except ProfileDirError: self.log.fatal("Could not create profile: %r"%self.profile) self.exit(1) else: self.log.info("Created profile dir: %r"%p.location) else: self.log.fatal("Profile %r not found."%self.profile) self.exit(1) else: self.log.debug("Using existing profile dir: %r", p.location) else: location = self.config.ProfileDir.location # location is fully specified try: p = ProfileDir.find_profile_dir(location, self.config) except ProfileDirError: # not found, maybe create it if self.auto_create: try: p = ProfileDir.create_profile_dir(location, self.config) except ProfileDirError: self.log.fatal("Could not create profile directory: %r"%location) self.exit(1) else: self.log.debug("Creating new profile dir: %r"%location) else: self.log.fatal("Profile directory %r not found."%location) self.exit(1) else: self.log.debug("Using existing profile dir: %r", p.location) # if profile_dir is specified explicitly, set profile name dir_name = os.path.basename(p.location) if dir_name.startswith('profile_'): self.profile = dir_name[8:] self.profile_dir = p self.config_file_paths.append(p.location) self._in_init_profile_dir = False def init_config_files(self): """[optionally] copy default config files into profile dir.""" self.config_file_paths.extend(ENV_CONFIG_DIRS) self.config_file_paths.extend(SYSTEM_CONFIG_DIRS) # copy config files path = Path(self.builtin_profile_dir) if self.copy_config_files: src = self.profile cfg = self.config_file_name if path and (path / cfg).exists(): self.log.warning( "Staging %r from %s into %r [overwrite=%s]" % (cfg, src, self.profile_dir.location, self.overwrite) ) self.profile_dir.copy_config_file(cfg, path=path, overwrite=self.overwrite) else: self.stage_default_config_file() else: # Still stage *bundled* config files, but not generated ones # This is necessary for `ipython profile=sympy` to load the profile # on the first go files = path.glob("*.py") for fullpath in files: cfg = fullpath.name if self.profile_dir.copy_config_file(cfg, path=path, overwrite=False): # file was copied self.log.warning("Staging bundled %s from %s into %r"%( cfg, self.profile, self.profile_dir.location) ) def stage_default_config_file(self): """auto generate default config file, and stage it into the profile.""" s = self.generate_config_file() config_file = Path(self.profile_dir.location) / self.config_file_name if self.overwrite or not config_file.exists(): self.log.warning("Generating default config file: %r", (config_file)) config_file.write_text(s, encoding="utf-8") @catch_config_error def initialize(self, argv=None): # don't hook up crash handler before parsing command-line self.parse_command_line(argv) self.init_crash_handler() if self.subapp is not None: # stop here if subapp is taking over return # save a copy of CLI config to re-load after config files # so that it has highest priority cl_config = deepcopy(self.config) self.init_profile_dir() self.init_config_files() self.load_config_file() # enforce cl-opts override configfile opts: self.update_config(cl_config) ipython-8.35.0/IPython/core/async_helpers.py000066400000000000000000000103101477474304100210420ustar00rootroot00000000000000""" Async helper function that are invalid syntax on Python 3.5 and below. This code is best effort, and may have edge cases not behaving as expected. In particular it contain a number of heuristics to detect whether code is effectively async and need to run in an event loop or not. Some constructs (like top-level `return`, or `yield`) are taken care of explicitly to actually raise a SyntaxError and stay as close as possible to Python semantics. """ import ast import asyncio import inspect from functools import wraps _asyncio_event_loop = None def get_asyncio_loop(): """asyncio has deprecated get_event_loop Replicate it here, with our desired semantics: - always returns a valid, not-closed loop - not thread-local like asyncio's, because we only want one loop for IPython - if called from inside a coroutine (e.g. in ipykernel), return the running loop .. versionadded:: 8.0 """ try: return asyncio.get_running_loop() except RuntimeError: # not inside a coroutine, # track our own global pass # not thread-local like asyncio's, # because we only track one event loop to run for IPython itself, # always in the main thread. global _asyncio_event_loop if _asyncio_event_loop is None or _asyncio_event_loop.is_closed(): _asyncio_event_loop = asyncio.new_event_loop() return _asyncio_event_loop class _AsyncIORunner: def __call__(self, coro): """ Handler for asyncio autoawait """ return get_asyncio_loop().run_until_complete(coro) def __str__(self): return "asyncio" _asyncio_runner = _AsyncIORunner() class _AsyncIOProxy: """Proxy-object for an asyncio Any coroutine methods will be wrapped in event_loop.run_ """ def __init__(self, obj, event_loop): self._obj = obj self._event_loop = event_loop def __repr__(self): return f"<_AsyncIOProxy({self._obj!r})>" def __getattr__(self, key): attr = getattr(self._obj, key) if inspect.iscoroutinefunction(attr): # if it's a coroutine method, # return a threadsafe wrapper onto the _current_ asyncio loop @wraps(attr) def _wrapped(*args, **kwargs): concurrent_future = asyncio.run_coroutine_threadsafe( attr(*args, **kwargs), self._event_loop ) return asyncio.wrap_future(concurrent_future) return _wrapped else: return attr def __dir__(self): return dir(self._obj) def _curio_runner(coroutine): """ handler for curio autoawait """ import curio return curio.run(coroutine) def _trio_runner(async_fn): import trio async def loc(coro): """ We need the dummy no-op async def to protect from trio's internal. See https://github.com/python-trio/trio/issues/89 """ return await coro return trio.run(loc, async_fn) def _pseudo_sync_runner(coro): """ A runner that does not really allow async execution, and just advance the coroutine. See discussion in https://github.com/python-trio/trio/issues/608, Credit to Nathaniel Smith """ try: coro.send(None) except StopIteration as exc: return exc.value else: # TODO: do not raise but return an execution result with the right info. raise RuntimeError( "{coro_name!r} needs a real async loop".format(coro_name=coro.__name__) ) def _should_be_async(cell: str) -> bool: """Detect if a block of code need to be wrapped in an `async def` Attempt to parse the block of code, it it compile we're fine. Otherwise we wrap if and try to compile. If it works, assume it should be async. Otherwise Return False. Not handled yet: If the block of code has a return statement as the top level, it will be seen as async. This is a know limitation. """ try: code = compile( cell, "<>", "exec", flags=getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0) ) return inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE except (SyntaxError, MemoryError): return False ipython-8.35.0/IPython/core/autocall.py000066400000000000000000000037071477474304100200230ustar00rootroot00000000000000# encoding: utf-8 """ Autocall capabilities for IPython.core. Authors: * Brian Granger * Fernando Perez * Thomas Kluyver Notes ----- """ #----------------------------------------------------------------------------- # Copyright (C) 2008-2011 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Code #----------------------------------------------------------------------------- class IPyAutocall(object): """ Instances of this class are always autocalled This happens regardless of 'autocall' variable state. Use this to develop macro-like mechanisms. """ _ip = None rewrite = True def __init__(self, ip=None): self._ip = ip def set_ip(self, ip): """Will be used to set _ip point to current ipython instance b/f call Override this method if you don't want this to happen. """ self._ip = ip class ExitAutocall(IPyAutocall): """An autocallable object which will be added to the user namespace so that exit, exit(), quit or quit() are all valid ways to close the shell.""" rewrite = False def __call__(self): self._ip.ask_exit() class ZMQExitAutocall(ExitAutocall): """Exit IPython. Autocallable, so it needn't be explicitly called. Parameters ---------- keep_kernel : bool If True, leave the kernel alive. Otherwise, tell the kernel to exit too (default). """ def __call__(self, keep_kernel=False): self._ip.keepkernel_on_exit = keep_kernel self._ip.ask_exit() ipython-8.35.0/IPython/core/builtin_trap.py000066400000000000000000000057011477474304100207070ustar00rootroot00000000000000""" A context manager for managing things injected into :mod:`builtins`. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import builtins as builtin_mod from traitlets.config.configurable import Configurable from traitlets import Instance class __BuiltinUndefined(object): pass BuiltinUndefined = __BuiltinUndefined() class __HideBuiltin(object): pass HideBuiltin = __HideBuiltin() class BuiltinTrap(Configurable): shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', allow_none=True) def __init__(self, shell=None): super(BuiltinTrap, self).__init__(shell=shell, config=None) self._orig_builtins = {} # We define this to track if a single BuiltinTrap is nested. # Only turn off the trap when the outermost call to __exit__ is made. self._nested_level = 0 self.shell = shell # builtins we always add - if set to HideBuiltin, they will just # be removed instead of being replaced by something else self.auto_builtins = {'exit': HideBuiltin, 'quit': HideBuiltin, 'get_ipython': self.shell.get_ipython, } def __enter__(self): if self._nested_level == 0: self.activate() self._nested_level += 1 # I return self, so callers can use add_builtin in a with clause. return self def __exit__(self, type, value, traceback): if self._nested_level == 1: self.deactivate() self._nested_level -= 1 # Returning False will cause exceptions to propagate return False def add_builtin(self, key, value): """Add a builtin and save the original.""" bdict = builtin_mod.__dict__ orig = bdict.get(key, BuiltinUndefined) if value is HideBuiltin: if orig is not BuiltinUndefined: #same as 'key in bdict' self._orig_builtins[key] = orig del bdict[key] else: self._orig_builtins[key] = orig bdict[key] = value def remove_builtin(self, key, orig): """Remove an added builtin and re-set the original.""" if orig is BuiltinUndefined: del builtin_mod.__dict__[key] else: builtin_mod.__dict__[key] = orig def activate(self): """Store ipython references in the __builtin__ namespace.""" add_builtin = self.add_builtin for name, func in self.auto_builtins.items(): add_builtin(name, func) def deactivate(self): """Remove any builtins which might have been added by add_builtins, or restore overwritten ones to their previous values.""" remove_builtin = self.remove_builtin for key, val in self._orig_builtins.items(): remove_builtin(key, val) self._orig_builtins.clear() self._builtins_added = False ipython-8.35.0/IPython/core/compilerop.py000066400000000000000000000170621477474304100203670ustar00rootroot00000000000000"""Compiler tools with improved interactive support. Provides compilation machinery similar to codeop, but with caching support so we can provide interactive tracebacks. Authors ------- * Robert Kern * Fernando Perez * Thomas Kluyver """ # Note: though it might be more natural to name this module 'compiler', that # name is in the stdlib and name collisions with the stdlib tend to produce # weird problems (often with third-party tools). #----------------------------------------------------------------------------- # Copyright (C) 2010-2011 The IPython Development Team. # # Distributed under the terms of the BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- # Stdlib imports import __future__ from ast import PyCF_ONLY_AST import codeop import functools import hashlib import linecache import operator import time from contextlib import contextmanager #----------------------------------------------------------------------------- # Constants #----------------------------------------------------------------------------- # Roughly equal to PyCF_MASK | PyCF_MASK_OBSOLETE as defined in pythonrun.h, # this is used as a bitmask to extract future-related code flags. PyCF_MASK = functools.reduce(operator.or_, (getattr(__future__, fname).compiler_flag for fname in __future__.all_feature_names)) #----------------------------------------------------------------------------- # Local utilities #----------------------------------------------------------------------------- def code_name(code, number=0): """ Compute a (probably) unique name for code for caching. This now expects code to be unicode. """ hash_digest = hashlib.sha1(code.encode("utf-8")).hexdigest() # Include the number and 12 characters of the hash in the name. It's # pretty much impossible that in a single session we'll have collisions # even with truncated hashes, and the full one makes tracebacks too long return ''.format(number, hash_digest[:12]) #----------------------------------------------------------------------------- # Classes and functions #----------------------------------------------------------------------------- class CachingCompiler(codeop.Compile): """A compiler that caches code compiled from interactive statements. """ def __init__(self): codeop.Compile.__init__(self) # Caching a dictionary { filename: execution_count } for nicely # rendered tracebacks. The filename corresponds to the filename # argument used for the builtins.compile function. self._filename_map = {} def ast_parse(self, source, filename='', symbol='exec'): """Parse code to an AST with the current compiler flags active. Arguments are exactly the same as ast.parse (in the standard library), and are passed to the built-in compile function.""" return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1) def reset_compiler_flags(self): """Reset compiler flags to default state.""" # This value is copied from codeop.Compile.__init__, so if that ever # changes, it will need to be updated. self.flags = codeop.PyCF_DONT_IMPLY_DEDENT @property def compiler_flags(self): """Flags currently active in the compilation process. """ return self.flags def get_code_name(self, raw_code, transformed_code, number): """Compute filename given the code, and the cell number. Parameters ---------- raw_code : str The raw cell code. transformed_code : str The executable Python source code to cache and compile. number : int A number which forms part of the code's name. Used for the execution counter. Returns ------- The computed filename. """ return code_name(transformed_code, number) def format_code_name(self, name): """Return a user-friendly label and name for a code block. Parameters ---------- name : str The name for the code block returned from get_code_name Returns ------- A (label, name) pair that can be used in tracebacks, or None if the default formatting should be used. """ if name in self._filename_map: return "Cell", "In[%s]" % self._filename_map[name] def cache(self, transformed_code, number=0, raw_code=None): """Make a name for a block of code, and cache the code. Parameters ---------- transformed_code : str The executable Python source code to cache and compile. number : int A number which forms part of the code's name. Used for the execution counter. raw_code : str The raw code before transformation, if None, set to `transformed_code`. Returns ------- The name of the cached code (as a string). Pass this as the filename argument to compilation, so that tracebacks are correctly hooked up. """ if raw_code is None: raw_code = transformed_code name = self.get_code_name(raw_code, transformed_code, number) # Save the execution count self._filename_map[name] = number # Since Python 2.5, setting mtime to `None` means the lines will # never be removed by `linecache.checkcache`. This means all the # monkeypatching has *never* been necessary, since this code was # only added in 2010, at which point IPython had already stopped # supporting Python 2.4. # # Note that `linecache.clearcache` and `linecache.updatecache` may # still remove our code from the cache, but those show explicit # intent, and we should not try to interfere. Normally the former # is never called except when out of memory, and the latter is only # called for lines *not* in the cache. entry = ( len(transformed_code), None, [line + "\n" for line in transformed_code.splitlines()], name, ) linecache.cache[name] = entry return name @contextmanager def extra_flags(self, flags): ## bits that we'll set to 1 turn_on_bits = ~self.flags & flags self.flags = self.flags | flags try: yield finally: # turn off only the bits we turned on so that something like # __future__ that set flags stays. self.flags &= ~turn_on_bits def check_linecache_ipython(*args): """Deprecated since IPython 8.6. Call linecache.checkcache() directly. It was already not necessary to call this function directly. If no CachingCompiler had been created, this function would fail badly. If an instance had been created, this function would've been monkeypatched into place. As of IPython 8.6, the monkeypatching has gone away entirely. But there were still internal callers of this function, so maybe external callers also existed? """ import warnings warnings.warn( "Deprecated Since IPython 8.6, Just call linecache.checkcache() directly.", DeprecationWarning, stacklevel=2, ) linecache.checkcache() ipython-8.35.0/IPython/core/completer.py000066400000000000000000003700111477474304100202040ustar00rootroot00000000000000"""Completion for IPython. This module started as fork of the rlcompleter module in the Python standard library. The original enhancements made to rlcompleter have been sent upstream and were accepted as of Python 2.3, This module now support a wide variety of completion mechanism both available for normal classic Python code, as well as completer for IPython specific Syntax like magics. Latex and Unicode completion ============================ IPython and compatible frontends not only can complete your code, but can help you to input a wide range of characters. In particular we allow you to insert a unicode character using the tab completion mechanism. Forward latex/unicode completion -------------------------------- Forward completion allows you to easily type a unicode character using its latex name, or unicode long description. To do so type a backslash follow by the relevant name and press tab: Using latex completion: .. code:: \\alpha α or using unicode completion: .. code:: \\GREEK SMALL LETTER ALPHA α Only valid Python identifiers will complete. Combining characters (like arrow or dots) are also available, unlike latex they need to be put after the their counterpart that is to say, ``F\\\\vec`` is correct, not ``\\\\vecF``. Some browsers are known to display combining characters incorrectly. Backward latex completion ------------------------- It is sometime challenging to know how to type a character, if you are using IPython, or any compatible frontend you can prepend backslash to the character and press :kbd:`Tab` to expand it to its latex form. .. code:: \\α \\alpha Both forward and backward completions can be deactivated by setting the :std:configtrait:`Completer.backslash_combining_completions` option to ``False``. Experimental ============ Starting with IPython 6.0, this module can make use of the Jedi library to generate completions both using static analysis of the code, and dynamically inspecting multiple namespaces. Jedi is an autocompletion and static analysis for Python. The APIs attached to this new mechanism is unstable and will raise unless use in an :any:`provisionalcompleter` context manager. You will find that the following are experimental: - :any:`provisionalcompleter` - :any:`IPCompleter.completions` - :any:`Completion` - :any:`rectify_completions` .. note:: better name for :any:`rectify_completions` ? We welcome any feedback on these new API, and we also encourage you to try this module in debug mode (start IPython with ``--Completer.debug=True``) in order to have extra logging information if :any:`jedi` is crashing, or if current IPython completer pending deprecations are returning results not yet handled by :any:`jedi` Using Jedi for tab completion allow snippets like the following to work without having to execute any code: >>> myvar = ['hello', 42] ... myvar[1].bi Tab completion will be able to infer that ``myvar[1]`` is a real number without executing almost any code unlike the deprecated :any:`IPCompleter.greedy` option. Be sure to update :any:`jedi` to the latest stable version or to try the current development version to get better completions. Matchers ======== All completions routines are implemented using unified *Matchers* API. The matchers API is provisional and subject to change without notice. The built-in matchers include: - :any:`IPCompleter.dict_key_matcher`: dictionary key completions, - :any:`IPCompleter.magic_matcher`: completions for magics, - :any:`IPCompleter.unicode_name_matcher`, :any:`IPCompleter.fwd_unicode_matcher` and :any:`IPCompleter.latex_name_matcher`: see `Forward latex/unicode completion`_, - :any:`back_unicode_name_matcher` and :any:`back_latex_name_matcher`: see `Backward latex completion`_, - :any:`IPCompleter.file_matcher`: paths to files and directories, - :any:`IPCompleter.python_func_kw_matcher` - function keywords, - :any:`IPCompleter.python_matches` - globals and attributes (v1 API), - ``IPCompleter.jedi_matcher`` - static analysis with Jedi, - :any:`IPCompleter.custom_completer_matcher` - pluggable completer with a default implementation in :any:`InteractiveShell` which uses IPython hooks system (`complete_command`) with string dispatch (including regular expressions). Differently to other matchers, ``custom_completer_matcher`` will not suppress Jedi results to match behaviour in earlier IPython versions. Custom matchers can be added by appending to ``IPCompleter.custom_matchers`` list. Matcher API ----------- Simplifying some details, the ``Matcher`` interface can described as .. code-block:: MatcherAPIv1 = Callable[[str], list[str]] MatcherAPIv2 = Callable[[CompletionContext], SimpleMatcherResult] Matcher = MatcherAPIv1 | MatcherAPIv2 The ``MatcherAPIv1`` reflects the matcher API as available prior to IPython 8.6.0 and remains supported as a simplest way for generating completions. This is also currently the only API supported by the IPython hooks system `complete_command`. To distinguish between matcher versions ``matcher_api_version`` attribute is used. More precisely, the API allows to omit ``matcher_api_version`` for v1 Matchers, and requires a literal ``2`` for v2 Matchers. Once the API stabilises future versions may relax the requirement for specifying ``matcher_api_version`` by switching to :any:`functools.singledispatch`, therefore please do not rely on the presence of ``matcher_api_version`` for any purposes. Suppression of competing matchers --------------------------------- By default results from all matchers are combined, in the order determined by their priority. Matchers can request to suppress results from subsequent matchers by setting ``suppress`` to ``True`` in the ``MatcherResult``. When multiple matchers simultaneously request suppression, the results from of the matcher with higher priority will be returned. Sometimes it is desirable to suppress most but not all other matchers; this can be achieved by adding a set of identifiers of matchers which should not be suppressed to ``MatcherResult`` under ``do_not_suppress`` key. The suppression behaviour can is user-configurable via :std:configtrait:`IPCompleter.suppress_competing_matchers`. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. # # Some of this code originated from rlcompleter in the Python standard library # Copyright (C) 2001 Python Software Foundation, www.python.org from __future__ import annotations import builtins as builtin_mod import enum import glob import inspect import itertools import keyword import ast import os import re import string import sys import tokenize import time import unicodedata import uuid import warnings from ast import literal_eval from collections import defaultdict from contextlib import contextmanager from dataclasses import dataclass from functools import cached_property, partial from types import SimpleNamespace from typing import ( Iterable, Iterator, List, Tuple, Union, Any, Sequence, Dict, Optional, TYPE_CHECKING, Set, Sized, TypeVar, Literal, ) from IPython.core.guarded_eval import guarded_eval, EvaluationContext from IPython.core.error import TryNext from IPython.core.inputtransformer2 import ESC_MAGIC from IPython.core.latex_symbols import latex_symbols, reverse_latex_symbol from IPython.core.oinspect import InspectColors from IPython.testing.skipdoctest import skip_doctest from IPython.utils import generics from IPython.utils.decorators import sphinx_options from IPython.utils.dir2 import dir2, get_real_method from IPython.utils.docs import GENERATING_DOCUMENTATION from IPython.utils.path import ensure_dir_exists from IPython.utils.process import arg_split from traitlets import ( Bool, Enum, Int, List as ListTrait, Unicode, Dict as DictTrait, Union as UnionTrait, observe, ) from traitlets.config.configurable import Configurable import __main__ # skip module docstests __skip_doctest__ = True try: import jedi jedi.settings.case_insensitive_completion = False import jedi.api.helpers import jedi.api.classes JEDI_INSTALLED = True except ImportError: JEDI_INSTALLED = False if TYPE_CHECKING or GENERATING_DOCUMENTATION and sys.version_info >= (3, 11): from typing import cast from typing_extensions import TypedDict, NotRequired, Protocol, TypeAlias, TypeGuard else: from typing import Generic def cast(type_, obj): """Workaround for `TypeError: MatcherAPIv2() takes no arguments`""" return obj # do not require on runtime NotRequired = Tuple # requires Python >=3.11 TypedDict = Dict # by extension of `NotRequired` requires 3.11 too Protocol = object # requires Python >=3.8 TypeAlias = Any # requires Python >=3.10 TypeGuard = Generic # requires Python >=3.10 if GENERATING_DOCUMENTATION: from typing import TypedDict # ----------------------------------------------------------------------------- # Globals #----------------------------------------------------------------------------- # ranges where we have most of the valid unicode names. We could be more finer # grained but is it worth it for performance While unicode have character in the # range 0, 0x110000, we seem to have name for about 10% of those. (131808 as I # write this). With below range we cover them all, with a density of ~67% # biggest next gap we consider only adds up about 1% density and there are 600 # gaps that would need hard coding. _UNICODE_RANGES = [(32, 0x323B0), (0xE0001, 0xE01F0)] # Public API __all__ = ["Completer", "IPCompleter"] if sys.platform == 'win32': PROTECTABLES = ' ' else: PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&' # Protect against returning an enormous number of completions which the frontend # may have trouble processing. MATCHES_LIMIT = 500 # Completion type reported when no type can be inferred. _UNKNOWN_TYPE = "" # sentinel value to signal lack of a match not_found = object() class ProvisionalCompleterWarning(FutureWarning): """ Exception raise by an experimental feature in this module. Wrap code in :any:`provisionalcompleter` context manager if you are certain you want to use an unstable feature. """ pass warnings.filterwarnings('error', category=ProvisionalCompleterWarning) @skip_doctest @contextmanager def provisionalcompleter(action='ignore'): """ This context manager has to be used in any place where unstable completer behavior and API may be called. >>> with provisionalcompleter(): ... completer.do_experimental_things() # works >>> completer.do_experimental_things() # raises. .. note:: Unstable By using this context manager you agree that the API in use may change without warning, and that you won't complain if they do so. You also understand that, if the API is not to your liking, you should report a bug to explain your use case upstream. We'll be happy to get your feedback, feature requests, and improvements on any of the unstable APIs! """ with warnings.catch_warnings(): warnings.filterwarnings(action, category=ProvisionalCompleterWarning) yield def has_open_quotes(s: str) -> Union[str, bool]: """Return whether a string has open quotes. This simply counts whether the number of quote characters of either type in the string is odd. Returns ------- If there is an open quote, the quote character is returned. Else, return False. """ # We check " first, then ', so complex cases with nested quotes will get # the " to take precedence. if s.count('"') % 2: return '"' elif s.count("'") % 2: return "'" else: return False def protect_filename(s: str, protectables: str = PROTECTABLES) -> str: """Escape a string to protect certain characters.""" if set(s) & set(protectables): if sys.platform == "win32": return '"' + s + '"' else: return "".join(("\\" + c if c in protectables else c) for c in s) else: return s def expand_user(path:str) -> Tuple[str, bool, str]: """Expand ``~``-style usernames in strings. This is similar to :func:`os.path.expanduser`, but it computes and returns extra information that will be useful if the input was being used in computing completions, and you wish to return the completions with the original '~' instead of its expanded value. Parameters ---------- path : str String to be expanded. If no ~ is present, the output is the same as the input. Returns ------- newpath : str Result of ~ expansion in the input path. tilde_expand : bool Whether any expansion was performed or not. tilde_val : str The value that ~ was replaced with. """ # Default values tilde_expand = False tilde_val = '' newpath = path if path.startswith('~'): tilde_expand = True rest = len(path)-1 newpath = os.path.expanduser(path) if rest: tilde_val = newpath[:-rest] else: tilde_val = newpath return newpath, tilde_expand, tilde_val def compress_user(path:str, tilde_expand:bool, tilde_val:str) -> str: """Does the opposite of expand_user, with its outputs. """ if tilde_expand: return path.replace(tilde_val, '~') else: return path def completions_sorting_key(word): """key for sorting completions This does several things: - Demote any completions starting with underscores to the end - Insert any %magic and %%cellmagic completions in the alphabetical order by their name """ prio1, prio2 = 0, 0 if word.startswith('__'): prio1 = 2 elif word.startswith('_'): prio1 = 1 if word.endswith('='): prio1 = -1 if word.startswith('%%'): # If there's another % in there, this is something else, so leave it alone if "%" not in word[2:]: word = word[2:] prio2 = 2 elif word.startswith('%'): if "%" not in word[1:]: word = word[1:] prio2 = 1 return prio1, word, prio2 class _FakeJediCompletion: """ This is a workaround to communicate to the UI that Jedi has crashed and to report a bug. Will be used only id :any:`IPCompleter.debug` is set to true. Added in IPython 6.0 so should likely be removed for 7.0 """ def __init__(self, name): self.name = name self.complete = name self.type = 'crashed' self.name_with_symbols = name self.signature = "" self._origin = "fake" self.text = "crashed" def __repr__(self): return '' _JediCompletionLike = Union["jedi.api.Completion", _FakeJediCompletion] class Completion: """ Completion object used and returned by IPython completers. .. warning:: Unstable This function is unstable, API may change without warning. It will also raise unless use in proper context manager. This act as a middle ground :any:`Completion` object between the :any:`jedi.api.classes.Completion` object and the Prompt Toolkit completion object. While Jedi need a lot of information about evaluator and how the code should be ran/inspected, PromptToolkit (and other frontend) mostly need user facing information. - Which range should be replaced replaced by what. - Some metadata (like completion type), or meta information to displayed to the use user. For debugging purpose we can also store the origin of the completion (``jedi``, ``IPython.python_matches``, ``IPython.magics_matches``...). """ __slots__ = ['start', 'end', 'text', 'type', 'signature', '_origin'] def __init__( self, start: int, end: int, text: str, *, type: Optional[str] = None, _origin="", signature="", ) -> None: warnings.warn( "``Completion`` is a provisional API (as of IPython 6.0). " "It may change without warnings. " "Use in corresponding context manager.", category=ProvisionalCompleterWarning, stacklevel=2, ) self.start = start self.end = end self.text = text self.type = type self.signature = signature self._origin = _origin def __repr__(self): return '' % \ (self.start, self.end, self.text, self.type or '?', self.signature or '?') def __eq__(self, other) -> bool: """ Equality and hash do not hash the type (as some completer may not be able to infer the type), but are use to (partially) de-duplicate completion. Completely de-duplicating completion is a bit tricker that just comparing as it depends on surrounding text, which Completions are not aware of. """ return self.start == other.start and \ self.end == other.end and \ self.text == other.text def __hash__(self): return hash((self.start, self.end, self.text)) class SimpleCompletion: """Completion item to be included in the dictionary returned by new-style Matcher (API v2). .. warning:: Provisional This class is used to describe the currently supported attributes of simple completion items, and any additional implementation details should not be relied on. Additional attributes may be included in future versions, and meaning of text disambiguated from the current dual meaning of "text to insert" and "text to used as a label". """ __slots__ = ["text", "type"] def __init__(self, text: str, *, type: Optional[str] = None): self.text = text self.type = type def __repr__(self): return f"" class _MatcherResultBase(TypedDict): """Definition of dictionary to be returned by new-style Matcher (API v2).""" #: Suffix of the provided ``CompletionContext.token``, if not given defaults to full token. matched_fragment: NotRequired[str] #: Whether to suppress results from all other matchers (True), some #: matchers (set of identifiers) or none (False); default is False. suppress: NotRequired[Union[bool, Set[str]]] #: Identifiers of matchers which should NOT be suppressed when this matcher #: requests to suppress all other matchers; defaults to an empty set. do_not_suppress: NotRequired[Set[str]] #: Are completions already ordered and should be left as-is? default is False. ordered: NotRequired[bool] @sphinx_options(show_inherited_members=True, exclude_inherited_from=["dict"]) class SimpleMatcherResult(_MatcherResultBase, TypedDict): """Result of new-style completion matcher.""" # note: TypedDict is added again to the inheritance chain # in order to get __orig_bases__ for documentation #: List of candidate completions completions: Sequence[SimpleCompletion] | Iterator[SimpleCompletion] class _JediMatcherResult(_MatcherResultBase): """Matching result returned by Jedi (will be processed differently)""" #: list of candidate completions completions: Iterator[_JediCompletionLike] AnyMatcherCompletion = Union[_JediCompletionLike, SimpleCompletion] AnyCompletion = TypeVar("AnyCompletion", AnyMatcherCompletion, Completion) @dataclass class CompletionContext: """Completion context provided as an argument to matchers in the Matcher API v2.""" # rationale: many legacy matchers relied on completer state (`self.text_until_cursor`) # which was not explicitly visible as an argument of the matcher, making any refactor # prone to errors; by explicitly passing `cursor_position` we can decouple the matchers # from the completer, and make substituting them in sub-classes easier. #: Relevant fragment of code directly preceding the cursor. #: The extraction of token is implemented via splitter heuristic #: (following readline behaviour for legacy reasons), which is user configurable #: (by switching the greedy mode). token: str #: The full available content of the editor or buffer full_text: str #: Cursor position in the line (the same for ``full_text`` and ``text``). cursor_position: int #: Cursor line in ``full_text``. cursor_line: int #: The maximum number of completions that will be used downstream. #: Matchers can use this information to abort early. #: The built-in Jedi matcher is currently excepted from this limit. # If not given, return all possible completions. limit: Optional[int] @cached_property def text_until_cursor(self) -> str: return self.line_with_cursor[: self.cursor_position] @cached_property def line_with_cursor(self) -> str: return self.full_text.split("\n")[self.cursor_line] #: Matcher results for API v2. MatcherResult = Union[SimpleMatcherResult, _JediMatcherResult] class _MatcherAPIv1Base(Protocol): def __call__(self, text: str) -> List[str]: """Call signature.""" ... #: Used to construct the default matcher identifier __qualname__: str class _MatcherAPIv1Total(_MatcherAPIv1Base, Protocol): #: API version matcher_api_version: Optional[Literal[1]] def __call__(self, text: str) -> List[str]: """Call signature.""" ... #: Protocol describing Matcher API v1. MatcherAPIv1: TypeAlias = Union[_MatcherAPIv1Base, _MatcherAPIv1Total] class MatcherAPIv2(Protocol): """Protocol describing Matcher API v2.""" #: API version matcher_api_version: Literal[2] = 2 def __call__(self, context: CompletionContext) -> MatcherResult: """Call signature.""" ... #: Used to construct the default matcher identifier __qualname__: str Matcher: TypeAlias = Union[MatcherAPIv1, MatcherAPIv2] def _is_matcher_v1(matcher: Matcher) -> TypeGuard[MatcherAPIv1]: api_version = _get_matcher_api_version(matcher) return api_version == 1 def _is_matcher_v2(matcher: Matcher) -> TypeGuard[MatcherAPIv2]: api_version = _get_matcher_api_version(matcher) return api_version == 2 def _is_sizable(value: Any) -> TypeGuard[Sized]: """Determines whether objects is sizable""" return hasattr(value, "__len__") def _is_iterator(value: Any) -> TypeGuard[Iterator]: """Determines whether objects is sizable""" return hasattr(value, "__next__") def has_any_completions(result: MatcherResult) -> bool: """Check if any result includes any completions.""" completions = result["completions"] if _is_sizable(completions): return len(completions) != 0 if _is_iterator(completions): try: old_iterator = completions first = next(old_iterator) result["completions"] = cast( Iterator[SimpleCompletion], itertools.chain([first], old_iterator), ) return True except StopIteration: return False raise ValueError( "Completions returned by matcher need to be an Iterator or a Sizable" ) def completion_matcher( *, priority: Optional[float] = None, identifier: Optional[str] = None, api_version: int = 1, ) -> Callable[[Matcher], Matcher]: """Adds attributes describing the matcher. Parameters ---------- priority : Optional[float] The priority of the matcher, determines the order of execution of matchers. Higher priority means that the matcher will be executed first. Defaults to 0. identifier : Optional[str] identifier of the matcher allowing users to modify the behaviour via traitlets, and also used to for debugging (will be passed as ``origin`` with the completions). Defaults to matcher function's ``__qualname__`` (for example, ``IPCompleter.file_matcher`` for the built-in matched defined as a ``file_matcher`` method of the ``IPCompleter`` class). api_version: Optional[int] version of the Matcher API used by this matcher. Currently supported values are 1 and 2. Defaults to 1. """ def wrapper(func: Matcher): func.matcher_priority = priority or 0 # type: ignore func.matcher_identifier = identifier or func.__qualname__ # type: ignore func.matcher_api_version = api_version # type: ignore if TYPE_CHECKING: if api_version == 1: func = cast(MatcherAPIv1, func) elif api_version == 2: func = cast(MatcherAPIv2, func) return func return wrapper def _get_matcher_priority(matcher: Matcher): return getattr(matcher, "matcher_priority", 0) def _get_matcher_id(matcher: Matcher): return getattr(matcher, "matcher_identifier", matcher.__qualname__) def _get_matcher_api_version(matcher): return getattr(matcher, "matcher_api_version", 1) context_matcher = partial(completion_matcher, api_version=2) _IC = Iterable[Completion] def _deduplicate_completions(text: str, completions: _IC)-> _IC: """ Deduplicate a set of completions. .. warning:: Unstable This function is unstable, API may change without warning. Parameters ---------- text : str text that should be completed. completions : Iterator[Completion] iterator over the completions to deduplicate Yields ------ `Completions` objects Completions coming from multiple sources, may be different but end up having the same effect when applied to ``text``. If this is the case, this will consider completions as equal and only emit the first encountered. Not folded in `completions()` yet for debugging purpose, and to detect when the IPython completer does return things that Jedi does not, but should be at some point. """ completions = list(completions) if not completions: return new_start = min(c.start for c in completions) new_end = max(c.end for c in completions) seen = set() for c in completions: new_text = text[new_start:c.start] + c.text + text[c.end:new_end] if new_text not in seen: yield c seen.add(new_text) def rectify_completions(text: str, completions: _IC, *, _debug: bool = False) -> _IC: """ Rectify a set of completions to all have the same ``start`` and ``end`` .. warning:: Unstable This function is unstable, API may change without warning. It will also raise unless use in proper context manager. Parameters ---------- text : str text that should be completed. completions : Iterator[Completion] iterator over the completions to rectify _debug : bool Log failed completion Notes ----- :any:`jedi.api.classes.Completion` s returned by Jedi may not have the same start and end, though the Jupyter Protocol requires them to behave like so. This will readjust the completion to have the same ``start`` and ``end`` by padding both extremities with surrounding text. During stabilisation should support a ``_debug`` option to log which completion are return by the IPython completer and not found in Jedi in order to make upstream bug report. """ warnings.warn("`rectify_completions` is a provisional API (as of IPython 6.0). " "It may change without warnings. " "Use in corresponding context manager.", category=ProvisionalCompleterWarning, stacklevel=2) completions = list(completions) if not completions: return starts = (c.start for c in completions) ends = (c.end for c in completions) new_start = min(starts) new_end = max(ends) seen_jedi = set() seen_python_matches = set() for c in completions: new_text = text[new_start:c.start] + c.text + text[c.end:new_end] if c._origin == 'jedi': seen_jedi.add(new_text) elif c._origin == "IPCompleter.python_matcher": seen_python_matches.add(new_text) yield Completion(new_start, new_end, new_text, type=c.type, _origin=c._origin, signature=c.signature) diff = seen_python_matches.difference(seen_jedi) if diff and _debug: print('IPython.python matches have extras:', diff) if sys.platform == 'win32': DELIMS = ' \t\n`!@#$^&*()=+[{]}|;\'",<>?' else: DELIMS = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?' GREEDY_DELIMS = ' =\r\n' class CompletionSplitter(object): """An object to split an input line in a manner similar to readline. By having our own implementation, we can expose readline-like completion in a uniform manner to all frontends. This object only needs to be given the line of text to be split and the cursor position on said line, and it returns the 'word' to be completed on at the cursor after splitting the entire line. What characters are used as splitting delimiters can be controlled by setting the ``delims`` attribute (this is a property that internally automatically builds the necessary regular expression)""" # Private interface # A string of delimiter characters. The default value makes sense for # IPython's most typical usage patterns. _delims = DELIMS # The expression (a normal string) to be compiled into a regular expression # for actual splitting. We store it as an attribute mostly for ease of # debugging, since this type of code can be so tricky to debug. _delim_expr = None # The regular expression that does the actual splitting _delim_re = None def __init__(self, delims=None): delims = CompletionSplitter._delims if delims is None else delims self.delims = delims @property def delims(self): """Return the string of delimiter characters.""" return self._delims @delims.setter def delims(self, delims): """Set the delimiters for line splitting.""" expr = '[' + ''.join('\\'+ c for c in delims) + ']' self._delim_re = re.compile(expr) self._delims = delims self._delim_expr = expr def split_line(self, line, cursor_pos=None): """Split a line of text with a cursor at the given position. """ cut_line = line if cursor_pos is None else line[:cursor_pos] return self._delim_re.split(cut_line)[-1] class Completer(Configurable): greedy = Bool( False, help="""Activate greedy completion. .. deprecated:: 8.8 Use :std:configtrait:`Completer.evaluation` and :std:configtrait:`Completer.auto_close_dict_keys` instead. When enabled in IPython 8.8 or newer, changes configuration as follows: - ``Completer.evaluation = 'unsafe'`` - ``Completer.auto_close_dict_keys = True`` """, ).tag(config=True) evaluation = Enum( ("forbidden", "minimal", "limited", "unsafe", "dangerous"), default_value="limited", help="""Policy for code evaluation under completion. Successive options allow to enable more eager evaluation for better completion suggestions, including for nested dictionaries, nested lists, or even results of function calls. Setting ``unsafe`` or higher can lead to evaluation of arbitrary user code on :kbd:`Tab` with potentially unwanted or dangerous side effects. Allowed values are: - ``forbidden``: no evaluation of code is permitted, - ``minimal``: evaluation of literals and access to built-in namespace; no item/attribute evaluationm no access to locals/globals, no evaluation of any operations or comparisons. - ``limited``: access to all namespaces, evaluation of hard-coded methods (for example: :any:`dict.keys`, :any:`object.__getattr__`, :any:`object.__getitem__`) on allow-listed objects (for example: :any:`dict`, :any:`list`, :any:`tuple`, ``pandas.Series``), - ``unsafe``: evaluation of all methods and function calls but not of syntax with side-effects like `del x`, - ``dangerous``: completely arbitrary evaluation. """, ).tag(config=True) use_jedi = Bool(default_value=JEDI_INSTALLED, help="Experimental: Use Jedi to generate autocompletions. " "Default to True if jedi is installed.").tag(config=True) jedi_compute_type_timeout = Int(default_value=400, help="""Experimental: restrict time (in milliseconds) during which Jedi can compute types. Set to 0 to stop computing types. Non-zero value lower than 100ms may hurt performance by preventing jedi to build its cache. """).tag(config=True) debug = Bool(default_value=False, help='Enable debug for the Completer. Mostly print extra ' 'information for experimental jedi integration.')\ .tag(config=True) backslash_combining_completions = Bool(True, help="Enable unicode completions, e.g. \\alpha . " "Includes completion of latex commands, unicode names, and expanding " "unicode characters back to latex commands.").tag(config=True) auto_close_dict_keys = Bool( False, help=""" Enable auto-closing dictionary keys. When enabled string keys will be suffixed with a final quote (matching the opening quote), tuple keys will also receive a separating comma if needed, and keys which are final will receive a closing bracket (``]``). """, ).tag(config=True) def __init__(self, namespace=None, global_namespace=None, **kwargs): """Create a new completer for the command line. Completer(namespace=ns, global_namespace=ns2) -> completer instance. If unspecified, the default namespace where completions are performed is __main__ (technically, __main__.__dict__). Namespaces should be given as dictionaries. An optional second namespace can be given. This allows the completer to handle cases where both the local and global scopes need to be distinguished. """ # Don't bind to namespace quite yet, but flag whether the user wants a # specific namespace or to use __main__.__dict__. This will allow us # to bind to __main__.__dict__ at completion time, not now. if namespace is None: self.use_main_ns = True else: self.use_main_ns = False self.namespace = namespace # The global namespace, if given, can be bound directly if global_namespace is None: self.global_namespace = {} else: self.global_namespace = global_namespace self.custom_matchers = [] super(Completer, self).__init__(**kwargs) def complete(self, text, state): """Return the next possible completion for 'text'. This is called successively with state == 0, 1, 2, ... until it returns None. The completion should begin with 'text'. """ if self.use_main_ns: self.namespace = __main__.__dict__ if state == 0: if "." in text: self.matches = self.attr_matches(text) else: self.matches = self.global_matches(text) try: return self.matches[state] except IndexError: return None def global_matches(self, text): """Compute matches when text is a simple name. Return a list of all keywords, built-in functions and names currently defined in self.namespace or self.global_namespace that match. """ matches = [] match_append = matches.append n = len(text) for lst in [ keyword.kwlist, builtin_mod.__dict__.keys(), list(self.namespace.keys()), list(self.global_namespace.keys()), ]: for word in lst: if word[:n] == text and word != "__builtins__": match_append(word) snake_case_re = re.compile(r"[^_]+(_[^_]+)+?\Z") for lst in [list(self.namespace.keys()), list(self.global_namespace.keys())]: shortened = { "_".join([sub[0] for sub in word.split("_")]): word for word in lst if snake_case_re.match(word) } for word in shortened.keys(): if word[:n] == text and word != "__builtins__": match_append(shortened[word]) return matches def attr_matches(self, text): """Compute matches when text contains a dot. Assuming the text is of the form NAME.NAME....[NAME], and is evaluatable in self.namespace or self.global_namespace, it will be evaluated and its attributes (as revealed by dir()) are used as possible completions. (For class instances, class members are also considered.) WARNING: this can still invoke arbitrary C code, if an object with a __getattr__ hook is evaluated. """ return self._attr_matches(text)[0] # we simple attribute matching with normal identifiers. _ATTR_MATCH_RE = re.compile(r"(.+)\.(\w*)$") def _attr_matches( self, text: str, include_prefix: bool = True ) -> Tuple[Sequence[str], str]: m2 = self._ATTR_MATCH_RE.match(text) if not m2: return [], "" expr, attr = m2.group(1, 2) obj = self._evaluate_expr(expr) if obj is not_found: return [], "" if self.limit_to__all__ and hasattr(obj, '__all__'): words = get__all__entries(obj) else: words = dir2(obj) try: words = generics.complete_object(obj, words) except TryNext: pass except AssertionError: raise except Exception: # Silence errors from completion function pass # Build match list to return n = len(attr) # Note: ideally we would just return words here and the prefix # reconciliator would know that we intend to append to rather than # replace the input text; this requires refactoring to return range # which ought to be replaced (as does jedi). if include_prefix: tokens = _parse_tokens(expr) rev_tokens = reversed(tokens) skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE} name_turn = True parts = [] for token in rev_tokens: if token.type in skip_over: continue if token.type == tokenize.NAME and name_turn: parts.append(token.string) name_turn = False elif ( token.type == tokenize.OP and token.string == "." and not name_turn ): parts.append(token.string) name_turn = True else: # short-circuit if not empty nor name token break prefix_after_space = "".join(reversed(parts)) else: prefix_after_space = "" return ( ["%s.%s" % (prefix_after_space, w) for w in words if w[:n] == attr], "." + attr, ) def _trim_expr(self, code: str) -> str: """ Trim the code until it is a valid expression and not a tuple; return the trimmed expression for guarded_eval. """ while code: code = code[1:] try: res = ast.parse(code) except SyntaxError: continue assert res is not None if len(res.body) != 1: continue expr = res.body[0].value if isinstance(expr, ast.Tuple) and not code[-1] == ")": # we skip implicit tuple, like when trimming `fun(a,b` # as `a,b` would be a tuple, and we actually expect to get only `b` continue return code return "" def _evaluate_expr(self, expr): obj = not_found done = False while not done and expr: try: obj = guarded_eval( expr, EvaluationContext( globals=self.global_namespace, locals=self.namespace, evaluation=self.evaluation, ), ) done = True except Exception as e: if self.debug: print("Evaluation exception", e) # trim the expression to remove any invalid prefix # e.g. user starts `(d[`, so we get `expr = '(d'`, # where parenthesis is not closed. # TODO: make this faster by reusing parts of the computation? expr = self._trim_expr(expr) return obj def get__all__entries(obj): """returns the strings in the __all__ attribute""" try: words = getattr(obj, '__all__') except Exception: return [] return [w for w in words if isinstance(w, str)] class _DictKeyState(enum.Flag): """Represent state of the key match in context of other possible matches. - given `d1 = {'a': 1}` completion on `d1['` will yield `{'a': END_OF_ITEM}` as there is no tuple. - given `d2 = {('a', 'b'): 1}`: `d2['a', '` will yield `{'b': END_OF_TUPLE}` as there is no tuple members to add beyond `'b'`. - given `d3 = {('a', 'b'): 1}`: `d3['` will yield `{'a': IN_TUPLE}` as `'a'` can be added. - given `d4 = {'a': 1, ('a', 'b'): 2}`: `d4['` will yield `{'a': END_OF_ITEM & END_OF_TUPLE}` """ BASELINE = 0 END_OF_ITEM = enum.auto() END_OF_TUPLE = enum.auto() IN_TUPLE = enum.auto() def _parse_tokens(c): """Parse tokens even if there is an error.""" tokens = [] token_generator = tokenize.generate_tokens(iter(c.splitlines()).__next__) while True: try: tokens.append(next(token_generator)) except tokenize.TokenError: return tokens except StopIteration: return tokens def _match_number_in_dict_key_prefix(prefix: str) -> Union[str, None]: """Match any valid Python numeric literal in a prefix of dictionary keys. References: - https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals - https://docs.python.org/3/library/tokenize.html """ if prefix[-1].isspace(): # if user typed a space we do not have anything to complete # even if there was a valid number token before return None tokens = _parse_tokens(prefix) rev_tokens = reversed(tokens) skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE} number = None for token in rev_tokens: if token.type in skip_over: continue if number is None: if token.type == tokenize.NUMBER: number = token.string continue else: # we did not match a number return None if token.type == tokenize.OP: if token.string == ",": break if token.string in {"+", "-"}: number = token.string + number else: return None return number _INT_FORMATS = { "0b": bin, "0o": oct, "0x": hex, } def match_dict_keys( keys: List[Union[str, bytes, Tuple[Union[str, bytes], ...]]], prefix: str, delims: str, extra_prefix: Optional[Tuple[Union[str, bytes], ...]] = None, ) -> Tuple[str, int, Dict[str, _DictKeyState]]: """Used by dict_key_matches, matching the prefix to a list of keys Parameters ---------- keys list of keys in dictionary currently being completed. prefix Part of the text already typed by the user. E.g. `mydict[b'fo` delims String of delimiters to consider when finding the current key. extra_prefix : optional Part of the text already typed in multi-key index cases. E.g. for `mydict['foo', "bar", 'b`, this would be `('foo', 'bar')`. Returns ------- A tuple of three elements: ``quote``, ``token_start``, ``matched``, with ``quote`` being the quote that need to be used to close current string. ``token_start`` the position where the replacement should start occurring, ``matches`` a dictionary of replacement/completion keys on keys and values indicating whether the state. """ prefix_tuple = extra_prefix if extra_prefix else () prefix_tuple_size = sum( [ # for pandas, do not count slices as taking space not isinstance(k, slice) for k in prefix_tuple ] ) text_serializable_types = (str, bytes, int, float, slice) def filter_prefix_tuple(key): # Reject too short keys if len(key) <= prefix_tuple_size: return False # Reject keys which cannot be serialised to text for k in key: if not isinstance(k, text_serializable_types): return False # Reject keys that do not match the prefix for k, pt in zip(key, prefix_tuple): if k != pt and not isinstance(pt, slice): return False # All checks passed! return True filtered_key_is_final: Dict[Union[str, bytes, int, float], _DictKeyState] = ( defaultdict(lambda: _DictKeyState.BASELINE) ) for k in keys: # If at least one of the matches is not final, mark as undetermined. # This can happen with `d = {111: 'b', (111, 222): 'a'}` where # `111` appears final on first match but is not final on the second. if isinstance(k, tuple): if filter_prefix_tuple(k): key_fragment = k[prefix_tuple_size] filtered_key_is_final[key_fragment] |= ( _DictKeyState.END_OF_TUPLE if len(k) == prefix_tuple_size + 1 else _DictKeyState.IN_TUPLE ) elif prefix_tuple_size > 0: # we are completing a tuple but this key is not a tuple, # so we should ignore it pass else: if isinstance(k, text_serializable_types): filtered_key_is_final[k] |= _DictKeyState.END_OF_ITEM filtered_keys = filtered_key_is_final.keys() if not prefix: return "", 0, {repr(k): v for k, v in filtered_key_is_final.items()} quote_match = re.search("(?:\"|')", prefix) is_user_prefix_numeric = False if quote_match: quote = quote_match.group() valid_prefix = prefix + quote try: prefix_str = literal_eval(valid_prefix) except Exception: return "", 0, {} else: # If it does not look like a string, let's assume # we are dealing with a number or variable. number_match = _match_number_in_dict_key_prefix(prefix) # We do not want the key matcher to suggest variable names so we yield: if number_match is None: # The alternative would be to assume that user forgort the quote # and if the substring matches, suggest adding it at the start. return "", 0, {} prefix_str = number_match is_user_prefix_numeric = True quote = "" pattern = '[^' + ''.join('\\' + c for c in delims) + ']*$' token_match = re.search(pattern, prefix, re.UNICODE) assert token_match is not None # silence mypy token_start = token_match.start() token_prefix = token_match.group() matched: Dict[str, _DictKeyState] = {} str_key: Union[str, bytes] for key in filtered_keys: if isinstance(key, (int, float)): # User typed a number but this key is not a number. if not is_user_prefix_numeric: continue str_key = str(key) if isinstance(key, int): int_base = prefix_str[:2].lower() # if user typed integer using binary/oct/hex notation: if int_base in _INT_FORMATS: int_format = _INT_FORMATS[int_base] str_key = int_format(key) else: # User typed a string but this key is a number. if is_user_prefix_numeric: continue str_key = key try: if not str_key.startswith(prefix_str): continue except (AttributeError, TypeError, UnicodeError): # Python 3+ TypeError on b'a'.startswith('a') or vice-versa continue # reformat remainder of key to begin with prefix rem = str_key[len(prefix_str) :] # force repr wrapped in ' rem_repr = repr(rem + '"') if isinstance(rem, str) else repr(rem + b'"') rem_repr = rem_repr[1 + rem_repr.index("'"):-2] if quote == '"': # The entered prefix is quoted with ", # but the match is quoted with '. # A contained " hence needs escaping for comparison: rem_repr = rem_repr.replace('"', '\\"') # then reinsert prefix from start of token match = "%s%s" % (token_prefix, rem_repr) matched[match] = filtered_key_is_final[key] return quote, token_start, matched def cursor_to_position(text:str, line:int, column:int)->int: """ Convert the (line,column) position of the cursor in text to an offset in a string. Parameters ---------- text : str The text in which to calculate the cursor offset line : int Line of the cursor; 0-indexed column : int Column of the cursor 0-indexed Returns ------- Position of the cursor in ``text``, 0-indexed. See Also -------- position_to_cursor : reciprocal of this function """ lines = text.split('\n') assert line <= len(lines), '{} <= {}'.format(str(line), str(len(lines))) return sum(len(line) + 1 for line in lines[:line]) + column def position_to_cursor(text:str, offset:int)->Tuple[int, int]: """ Convert the position of the cursor in text (0 indexed) to a line number(0-indexed) and a column number (0-indexed) pair Position should be a valid position in ``text``. Parameters ---------- text : str The text in which to calculate the cursor offset offset : int Position of the cursor in ``text``, 0-indexed. Returns ------- (line, column) : (int, int) Line of the cursor; 0-indexed, column of the cursor 0-indexed See Also -------- cursor_to_position : reciprocal of this function """ assert 0 <= offset <= len(text) , "0 <= %s <= %s" % (offset , len(text)) before = text[:offset] blines = before.split('\n') # ! splitnes trim trailing \n line = before.count('\n') col = len(blines[-1]) return line, col def _safe_isinstance(obj, module, class_name, *attrs): """Checks if obj is an instance of module.class_name if loaded """ if module in sys.modules: m = sys.modules[module] for attr in [class_name, *attrs]: m = getattr(m, attr) return isinstance(obj, m) @context_matcher() def back_unicode_name_matcher(context: CompletionContext): """Match Unicode characters back to Unicode name Same as :any:`back_unicode_name_matches`, but adopted to new Matcher API. """ fragment, matches = back_unicode_name_matches(context.text_until_cursor) return _convert_matcher_v1_result_to_v2( matches, type="unicode", fragment=fragment, suppress_if_matches=True ) def back_unicode_name_matches(text: str) -> Tuple[str, Sequence[str]]: """Match Unicode characters back to Unicode name This does ``☃`` -> ``\\snowman`` Note that snowman is not a valid python3 combining character but will be expanded. Though it will not recombine back to the snowman character by the completion machinery. This will not either back-complete standard sequences like \\n, \\b ... .. deprecated:: 8.6 You can use :meth:`back_unicode_name_matcher` instead. Returns ======= Return a tuple with two elements: - The Unicode character that was matched (preceded with a backslash), or empty string, - a sequence (of 1), name for the match Unicode character, preceded by backslash, or empty if no match. """ if len(text)<2: return '', () maybe_slash = text[-2] if maybe_slash != '\\': return '', () char = text[-1] # no expand on quote for completion in strings. # nor backcomplete standard ascii keys if char in string.ascii_letters or char in ('"',"'"): return '', () try : unic = unicodedata.name(char) return '\\'+char,('\\'+unic,) except KeyError: pass return '', () @context_matcher() def back_latex_name_matcher(context: CompletionContext): """Match latex characters back to unicode name Same as :any:`back_latex_name_matches`, but adopted to new Matcher API. """ fragment, matches = back_latex_name_matches(context.text_until_cursor) return _convert_matcher_v1_result_to_v2( matches, type="latex", fragment=fragment, suppress_if_matches=True ) def back_latex_name_matches(text: str) -> Tuple[str, Sequence[str]]: """Match latex characters back to unicode name This does ``\\ℵ`` -> ``\\aleph`` .. deprecated:: 8.6 You can use :meth:`back_latex_name_matcher` instead. """ if len(text)<2: return '', () maybe_slash = text[-2] if maybe_slash != '\\': return '', () char = text[-1] # no expand on quote for completion in strings. # nor backcomplete standard ascii keys if char in string.ascii_letters or char in ('"',"'"): return '', () try : latex = reverse_latex_symbol[char] # '\\' replace the \ as well return '\\'+char,[latex] except KeyError: pass return '', () def _formatparamchildren(parameter) -> str: """ Get parameter name and value from Jedi Private API Jedi does not expose a simple way to get `param=value` from its API. Parameters ---------- parameter Jedi's function `Param` Returns ------- A string like 'a', 'b=1', '*args', '**kwargs' """ description = parameter.description if not description.startswith('param '): raise ValueError('Jedi function parameter description have change format.' 'Expected "param ...", found %r".' % description) return description[6:] def _make_signature(completion)-> str: """ Make the signature from a jedi completion Parameters ---------- completion : jedi.Completion object does not complete a function type Returns ------- a string consisting of the function signature, with the parenthesis but without the function name. example: `(a, *args, b=1, **kwargs)` """ # it looks like this might work on jedi 0.17 if hasattr(completion, 'get_signatures'): signatures = completion.get_signatures() if not signatures: return '(?)' c0 = completion.get_signatures()[0] return '('+c0.to_string().split('(', maxsplit=1)[1] return '(%s)'% ', '.join([f for f in (_formatparamchildren(p) for signature in completion.get_signatures() for p in signature.defined_names()) if f]) _CompleteResult = Dict[str, MatcherResult] DICT_MATCHER_REGEX = re.compile( r"""(?x) ( # match dict-referring - or any get item object - expression .+ ) \[ # open bracket \s* # and optional whitespace # Capture any number of serializable objects (e.g. "a", "b", 'c') # and slices ((?:(?: (?: # closed string [uUbB]? # string prefix (r not handled) (?: '(?:[^']|(? SimpleMatcherResult: """Utility to help with transition""" result = { "completions": [SimpleCompletion(text=match, type=type) for match in matches], "suppress": (True if matches else False) if suppress_if_matches else False, } if fragment is not None: result["matched_fragment"] = fragment return cast(SimpleMatcherResult, result) class IPCompleter(Completer): """Extension of the completer class with IPython-specific features""" @observe('greedy') def _greedy_changed(self, change): """update the splitter and readline delims when greedy is changed""" if change["new"]: self.evaluation = "unsafe" self.auto_close_dict_keys = True self.splitter.delims = GREEDY_DELIMS else: self.evaluation = "limited" self.auto_close_dict_keys = False self.splitter.delims = DELIMS dict_keys_only = Bool( False, help=""" Whether to show dict key matches only. (disables all matchers except for `IPCompleter.dict_key_matcher`). """, ) suppress_competing_matchers = UnionTrait( [Bool(allow_none=True), DictTrait(Bool(None, allow_none=True))], default_value=None, help=""" Whether to suppress completions from other *Matchers*. When set to ``None`` (default) the matchers will attempt to auto-detect whether suppression of other matchers is desirable. For example, at the beginning of a line followed by `%` we expect a magic completion to be the only applicable option, and after ``my_dict['`` we usually expect a completion with an existing dictionary key. If you want to disable this heuristic and see completions from all matchers, set ``IPCompleter.suppress_competing_matchers = False``. To disable the heuristic for specific matchers provide a dictionary mapping: ``IPCompleter.suppress_competing_matchers = {'IPCompleter.dict_key_matcher': False}``. Set ``IPCompleter.suppress_competing_matchers = True`` to limit completions to the set of matchers with the highest priority; this is equivalent to ``IPCompleter.merge_completions`` and can be beneficial for performance, but will sometimes omit relevant candidates from matchers further down the priority list. """, ).tag(config=True) merge_completions = Bool( True, help="""Whether to merge completion results into a single list If False, only the completion results from the first non-empty completer will be returned. As of version 8.6.0, setting the value to ``False`` is an alias for: ``IPCompleter.suppress_competing_matchers = True.``. """, ).tag(config=True) disable_matchers = ListTrait( Unicode(), help="""List of matchers to disable. The list should contain matcher identifiers (see :any:`completion_matcher`). """, ).tag(config=True) omit__names = Enum( (0, 1, 2), default_value=2, help="""Instruct the completer to omit private method names Specifically, when completing on ``object.``. When 2 [default]: all names that start with '_' will be excluded. When 1: all 'magic' names (``__foo__``) will be excluded. When 0: nothing will be excluded. """ ).tag(config=True) limit_to__all__ = Bool(False, help=""" DEPRECATED as of version 5.0. Instruct the completer to use __all__ for the completion Specifically, when completing on ``object.``. When True: only those names in obj.__all__ will be included. When False [default]: the __all__ attribute is ignored """, ).tag(config=True) profile_completions = Bool( default_value=False, help="If True, emit profiling data for completion subsystem using cProfile." ).tag(config=True) profiler_output_dir = Unicode( default_value=".completion_profiles", help="Template for path at which to output profile data for completions." ).tag(config=True) @observe('limit_to__all__') def _limit_to_all_changed(self, change): warnings.warn('`IPython.core.IPCompleter.limit_to__all__` configuration ' 'value has been deprecated since IPython 5.0, will be made to have ' 'no effects and then removed in future version of IPython.', UserWarning) def __init__( self, shell=None, namespace=None, global_namespace=None, config=None, **kwargs ): """IPCompleter() -> completer Return a completer object. Parameters ---------- shell a pointer to the ipython shell itself. This is needed because this completer knows about magic functions, and those can only be accessed via the ipython instance. namespace : dict, optional an optional dict where completions are performed. global_namespace : dict, optional secondary optional dict for completions, to handle cases (such as IPython embedded inside functions) where both Python scopes are visible. config : Config traitlet's config object **kwargs passed to super class unmodified. """ self.magic_escape = ESC_MAGIC self.splitter = CompletionSplitter() # _greedy_changed() depends on splitter and readline being defined: super().__init__( namespace=namespace, global_namespace=global_namespace, config=config, **kwargs, ) # List where completion matches will be stored self.matches = [] self.shell = shell # Regexp to split filenames with spaces in them self.space_name_re = re.compile(r'([^\\] )') # Hold a local ref. to glob.glob for speed self.glob = glob.glob # Determine if we are running on 'dumb' terminals, like (X)Emacs # buffers, to avoid completion problems. term = os.environ.get('TERM','xterm') self.dumb_terminal = term in ['dumb','emacs'] # Special handling of backslashes needed in win32 platforms if sys.platform == "win32": self.clean_glob = self._clean_glob_win32 else: self.clean_glob = self._clean_glob #regexp to parse docstring for function signature self.docstring_sig_re = re.compile(r'^[\w|\s.]+\(([^)]*)\).*') self.docstring_kwd_re = re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)') #use this if positional argument name is also needed #= re.compile(r'[\s|\[]*(\w+)(?:\s*=?\s*.*)') self.magic_arg_matchers = [ self.magic_config_matcher, self.magic_color_matcher, ] # This is set externally by InteractiveShell self.custom_completers = None # This is a list of names of unicode characters that can be completed # into their corresponding unicode value. The list is large, so we # lazily initialize it on first use. Consuming code should access this # attribute through the `@unicode_names` property. self._unicode_names = None self._backslash_combining_matchers = [ self.latex_name_matcher, self.unicode_name_matcher, back_latex_name_matcher, back_unicode_name_matcher, self.fwd_unicode_matcher, ] if not self.backslash_combining_completions: for matcher in self._backslash_combining_matchers: self.disable_matchers.append(_get_matcher_id(matcher)) if not self.merge_completions: self.suppress_competing_matchers = True @property def matchers(self) -> List[Matcher]: """All active matcher routines for completion""" if self.dict_keys_only: return [self.dict_key_matcher] if self.use_jedi: return [ *self.custom_matchers, *self._backslash_combining_matchers, *self.magic_arg_matchers, self.custom_completer_matcher, self.magic_matcher, self._jedi_matcher, self.dict_key_matcher, self.file_matcher, ] else: return [ *self.custom_matchers, *self._backslash_combining_matchers, *self.magic_arg_matchers, self.custom_completer_matcher, self.dict_key_matcher, self.magic_matcher, self.python_matcher, self.file_matcher, self.python_func_kw_matcher, ] def all_completions(self, text:str) -> List[str]: """ Wrapper around the completion methods for the benefit of emacs. """ prefix = text.rpartition('.')[0] with provisionalcompleter(): return ['.'.join([prefix, c.text]) if prefix and self.use_jedi else c.text for c in self.completions(text, len(text))] return self.complete(text)[1] def _clean_glob(self, text:str): return self.glob("%s*" % text) def _clean_glob_win32(self, text:str): return [f.replace("\\","/") for f in self.glob("%s*" % text)] @context_matcher() def file_matcher(self, context: CompletionContext) -> SimpleMatcherResult: """Same as :any:`file_matches`, but adopted to new Matcher API.""" matches = self.file_matches(context.token) # TODO: add a heuristic for suppressing (e.g. if it has OS-specific delimiter, # starts with `/home/`, `C:\`, etc) return _convert_matcher_v1_result_to_v2(matches, type="path") def file_matches(self, text: str) -> List[str]: """Match filenames, expanding ~USER type strings. Most of the seemingly convoluted logic in this completer is an attempt to handle filenames with spaces in them. And yet it's not quite perfect, because Python's readline doesn't expose all of the GNU readline details needed for this to be done correctly. For a filename with a space in it, the printed completions will be only the parts after what's already been typed (instead of the full completions, as is normally done). I don't think with the current (as of Python 2.3) Python readline it's possible to do better. .. deprecated:: 8.6 You can use :meth:`file_matcher` instead. """ # chars that require escaping with backslash - i.e. chars # that readline treats incorrectly as delimiters, but we # don't want to treat as delimiters in filename matching # when escaped with backslash if text.startswith('!'): text = text[1:] text_prefix = u'!' else: text_prefix = u'' text_until_cursor = self.text_until_cursor # track strings with open quotes open_quotes = has_open_quotes(text_until_cursor) if '(' in text_until_cursor or '[' in text_until_cursor: lsplit = text else: try: # arg_split ~ shlex.split, but with unicode bugs fixed by us lsplit = arg_split(text_until_cursor)[-1] except ValueError: # typically an unmatched ", or backslash without escaped char. if open_quotes: lsplit = text_until_cursor.split(open_quotes)[-1] else: return [] except IndexError: # tab pressed on empty line lsplit = "" if not open_quotes and lsplit != protect_filename(lsplit): # if protectables are found, do matching on the whole escaped name has_protectables = True text0,text = text,lsplit else: has_protectables = False text = os.path.expanduser(text) if text == "": return [text_prefix + protect_filename(f) for f in self.glob("*")] # Compute the matches from the filesystem if sys.platform == 'win32': m0 = self.clean_glob(text) else: m0 = self.clean_glob(text.replace('\\', '')) if has_protectables: # If we had protectables, we need to revert our changes to the # beginning of filename so that we don't double-write the part # of the filename we have so far len_lsplit = len(lsplit) matches = [text_prefix + text0 + protect_filename(f[len_lsplit:]) for f in m0] else: if open_quotes: # if we have a string with an open quote, we don't need to # protect the names beyond the quote (and we _shouldn't_, as # it would cause bugs when the filesystem call is made). matches = m0 if sys.platform == "win32" else\ [protect_filename(f, open_quotes) for f in m0] else: matches = [text_prefix + protect_filename(f) for f in m0] # Mark directories in input list by appending '/' to their names. return [x+'/' if os.path.isdir(x) else x for x in matches] @context_matcher() def magic_matcher(self, context: CompletionContext) -> SimpleMatcherResult: """Match magics.""" text = context.token matches = self.magic_matches(text) result = _convert_matcher_v1_result_to_v2(matches, type="magic") is_magic_prefix = len(text) > 0 and text[0] == "%" result["suppress"] = is_magic_prefix and bool(result["completions"]) return result def magic_matches(self, text: str) -> List[str]: """Match magics. .. deprecated:: 8.6 You can use :meth:`magic_matcher` instead. """ # Get all shell magics now rather than statically, so magics loaded at # runtime show up too. lsm = self.shell.magics_manager.lsmagic() line_magics = lsm['line'] cell_magics = lsm['cell'] pre = self.magic_escape pre2 = pre+pre explicit_magic = text.startswith(pre) # Completion logic: # - user gives %%: only do cell magics # - user gives %: do both line and cell magics # - no prefix: do both # In other words, line magics are skipped if the user gives %% explicitly # # We also exclude magics that match any currently visible names: # https://github.com/ipython/ipython/issues/4877, unless the user has # typed a %: # https://github.com/ipython/ipython/issues/10754 bare_text = text.lstrip(pre) global_matches = self.global_matches(bare_text) if not explicit_magic: def matches(magic): """ Filter magics, in particular remove magics that match a name present in global namespace. """ return ( magic.startswith(bare_text) and magic not in global_matches ) else: def matches(magic): return magic.startswith(bare_text) comp = [ pre2+m for m in cell_magics if matches(m)] if not text.startswith(pre2): comp += [ pre+m for m in line_magics if matches(m)] return comp @context_matcher() def magic_config_matcher(self, context: CompletionContext) -> SimpleMatcherResult: """Match class names and attributes for %config magic.""" # NOTE: uses `line_buffer` equivalent for compatibility matches = self.magic_config_matches(context.line_with_cursor) return _convert_matcher_v1_result_to_v2(matches, type="param") def magic_config_matches(self, text: str) -> List[str]: """Match class names and attributes for %config magic. .. deprecated:: 8.6 You can use :meth:`magic_config_matcher` instead. """ texts = text.strip().split() if len(texts) > 0 and (texts[0] == 'config' or texts[0] == '%config'): # get all configuration classes classes = sorted(set([ c for c in self.shell.configurables if c.__class__.class_traits(config=True) ]), key=lambda x: x.__class__.__name__) classnames = [ c.__class__.__name__ for c in classes ] # return all classnames if config or %config is given if len(texts) == 1: return classnames # match classname classname_texts = texts[1].split('.') classname = classname_texts[0] classname_matches = [ c for c in classnames if c.startswith(classname) ] # return matched classes or the matched class with attributes if texts[1].find('.') < 0: return classname_matches elif len(classname_matches) == 1 and \ classname_matches[0] == classname: cls = classes[classnames.index(classname)].__class__ help = cls.class_get_help() # strip leading '--' from cl-args: help = re.sub(re.compile(r'^--', re.MULTILINE), '', help) return [ attr.split('=')[0] for attr in help.strip().splitlines() if attr.startswith(texts[1]) ] return [] @context_matcher() def magic_color_matcher(self, context: CompletionContext) -> SimpleMatcherResult: """Match color schemes for %colors magic.""" # NOTE: uses `line_buffer` equivalent for compatibility matches = self.magic_color_matches(context.line_with_cursor) return _convert_matcher_v1_result_to_v2(matches, type="param") def magic_color_matches(self, text: str) -> List[str]: """Match color schemes for %colors magic. .. deprecated:: 8.6 You can use :meth:`magic_color_matcher` instead. """ texts = text.split() if text.endswith(' '): # .split() strips off the trailing whitespace. Add '' back # so that: '%colors ' -> ['%colors', ''] texts.append('') if len(texts) == 2 and (texts[0] == 'colors' or texts[0] == '%colors'): prefix = texts[1] return [ color for color in InspectColors.keys() if color.startswith(prefix) ] return [] @context_matcher(identifier="IPCompleter.jedi_matcher") def _jedi_matcher(self, context: CompletionContext) -> _JediMatcherResult: matches = self._jedi_matches( cursor_column=context.cursor_position, cursor_line=context.cursor_line, text=context.full_text, ) return { "completions": matches, # static analysis should not suppress other matchers "suppress": False, } def _jedi_matches( self, cursor_column: int, cursor_line: int, text: str ) -> Iterator[_JediCompletionLike]: """ Return a list of :any:`jedi.api.Completion`\\s object from a ``text`` and cursor position. Parameters ---------- cursor_column : int column position of the cursor in ``text``, 0-indexed. cursor_line : int line position of the cursor in ``text``, 0-indexed text : str text to complete Notes ----- If ``IPCompleter.debug`` is ``True`` may return a :any:`_FakeJediCompletion` object containing a string with the Jedi debug information attached. .. deprecated:: 8.6 You can use :meth:`_jedi_matcher` instead. """ namespaces = [self.namespace] if self.global_namespace is not None: namespaces.append(self.global_namespace) completion_filter = lambda x:x offset = cursor_to_position(text, cursor_line, cursor_column) # filter output if we are completing for object members if offset: pre = text[offset-1] if pre == '.': if self.omit__names == 2: completion_filter = lambda c:not c.name.startswith('_') elif self.omit__names == 1: completion_filter = lambda c:not (c.name.startswith('__') and c.name.endswith('__')) elif self.omit__names == 0: completion_filter = lambda x:x else: raise ValueError("Don't understand self.omit__names == {}".format(self.omit__names)) interpreter = jedi.Interpreter(text[:offset], namespaces) try_jedi = True try: # find the first token in the current tree -- if it is a ' or " then we are in a string completing_string = False try: first_child = next(c for c in interpreter._get_module().tree_node.children if hasattr(c, 'value')) except StopIteration: pass else: # note the value may be ', ", or it may also be ''' or """, or # in some cases, """what/you/typed..., but all of these are # strings. completing_string = len(first_child.value) > 0 and first_child.value[0] in {"'", '"'} # if we are in a string jedi is likely not the right candidate for # now. Skip it. try_jedi = not completing_string except Exception as e: # many of things can go wrong, we are using private API just don't crash. if self.debug: print("Error detecting if completing a non-finished string :", e, '|') if not try_jedi: return iter([]) try: return filter(completion_filter, interpreter.complete(column=cursor_column, line=cursor_line + 1)) except Exception as e: if self.debug: return iter( [ _FakeJediCompletion( 'Oops Jedi has crashed, please report a bug with the following:\n"""\n%s\ns"""' % (e) ) ] ) else: return iter([]) class _CompletionContextType(enum.Enum): ATTRIBUTE = "attribute" # For attribute completion GLOBAL = "global" # For global completion def _determine_completion_context(self, line): """ Determine whether the cursor is in an attribute or global completion context. """ # Cursor in string/comment → GLOBAL. is_string, is_in_expression = self._is_in_string_or_comment(line) if is_string and not is_in_expression: return self._CompletionContextType.GLOBAL # If we're in a template string expression, handle specially if is_string and is_in_expression: # Extract the expression part - look for the last { that isn't closed expr_start = line.rfind("{") if expr_start >= 0: # We're looking at the expression inside a template string expr = line[expr_start + 1 :] # Recursively determine the context of the expression return self._determine_completion_context(expr) # Handle plain number literals - should be global context # Ex: 3. -42.14 but not 3.1. if re.search(r"(? 0, ) @context_matcher() def python_matcher(self, context: CompletionContext) -> SimpleMatcherResult: """Match attributes or global python names""" text = context.text_until_cursor completion_type = self._determine_completion_context(text) if completion_type == self._CompletionContextType.ATTRIBUTE: try: matches, fragment = self._attr_matches(text, include_prefix=False) if text.endswith(".") and self.omit__names: if self.omit__names == 1: # true if txt is _not_ a __ name, false otherwise: no__name = lambda txt: re.match(r".*\.__.*?__", txt) is None else: # true if txt is _not_ a _ name, false otherwise: no__name = ( lambda txt: re.match(r"\._.*?", txt[txt.rindex(".") :]) is None ) matches = filter(no__name, matches) return _convert_matcher_v1_result_to_v2( matches, type="attribute", fragment=fragment ) except NameError: # catches . matches = [] return _convert_matcher_v1_result_to_v2(matches, type="attribute") else: matches = self.global_matches(context.token) # TODO: maybe distinguish between functions, modules and just "variables" return _convert_matcher_v1_result_to_v2(matches, type="variable") @completion_matcher(api_version=1) def python_matches(self, text: str) -> Iterable[str]: """Match attributes or global python names. .. deprecated:: 8.27 You can use :meth:`python_matcher` instead.""" if "." in text: try: matches = self.attr_matches(text) if text.endswith('.') and self.omit__names: if self.omit__names == 1: # true if txt is _not_ a __ name, false otherwise: no__name = (lambda txt: re.match(r'.*\.__.*?__',txt) is None) else: # true if txt is _not_ a _ name, false otherwise: no__name = (lambda txt: re.match(r'\._.*?',txt[txt.rindex('.'):]) is None) matches = filter(no__name, matches) except NameError: # catches . matches = [] else: matches = self.global_matches(text) return matches def _default_arguments_from_docstring(self, doc): """Parse the first line of docstring for call signature. Docstring should be of the form 'min(iterable[, key=func])\n'. It can also parse cython docstring of the form 'Minuit.migrad(self, int ncall=10000, resume=True, int nsplit=1)'. """ if doc is None: return [] #care only the firstline line = doc.lstrip().splitlines()[0] #p = re.compile(r'^[\w|\s.]+\(([^)]*)\).*') #'min(iterable[, key=func])\n' -> 'iterable[, key=func]' sig = self.docstring_sig_re.search(line) if sig is None: return [] # iterable[, key=func]' -> ['iterable[' ,' key=func]'] sig = sig.groups()[0].split(',') ret = [] for s in sig: #re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)') ret += self.docstring_kwd_re.findall(s) return ret def _default_arguments(self, obj): """Return the list of default arguments of obj if it is callable, or empty list otherwise.""" call_obj = obj ret = [] if inspect.isbuiltin(obj): pass elif not (inspect.isfunction(obj) or inspect.ismethod(obj)): if inspect.isclass(obj): #for cython embedsignature=True the constructor docstring #belongs to the object itself not __init__ ret += self._default_arguments_from_docstring( getattr(obj, '__doc__', '')) # for classes, check for __init__,__new__ call_obj = (getattr(obj, '__init__', None) or getattr(obj, '__new__', None)) # for all others, check if they are __call__able elif hasattr(obj, '__call__'): call_obj = obj.__call__ ret += self._default_arguments_from_docstring( getattr(call_obj, '__doc__', '')) _keeps = (inspect.Parameter.KEYWORD_ONLY, inspect.Parameter.POSITIONAL_OR_KEYWORD) try: sig = inspect.signature(obj) ret.extend(k for k, v in sig.parameters.items() if v.kind in _keeps) except ValueError: pass return list(set(ret)) @context_matcher() def python_func_kw_matcher(self, context: CompletionContext) -> SimpleMatcherResult: """Match named parameters (kwargs) of the last open function.""" matches = self.python_func_kw_matches(context.token) return _convert_matcher_v1_result_to_v2(matches, type="param") def python_func_kw_matches(self, text): """Match named parameters (kwargs) of the last open function. .. deprecated:: 8.6 You can use :meth:`python_func_kw_matcher` instead. """ if "." in text: # a parameter cannot be dotted return [] try: regexp = self.__funcParamsRegex except AttributeError: regexp = self.__funcParamsRegex = re.compile(r''' '.*?(?,a=1)", the candidate is "foo" tokens = regexp.findall(self.text_until_cursor) iterTokens = reversed(tokens) openPar = 0 for token in iterTokens: if token == ')': openPar -= 1 elif token == '(': openPar += 1 if openPar > 0: # found the last unclosed parenthesis break else: return [] # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" ) ids = [] isId = re.compile(r'\w+$').match while True: try: ids.append(next(iterTokens)) if not isId(ids[-1]): ids.pop() break if not next(iterTokens) == '.': break except StopIteration: break # Find all named arguments already assigned to, as to avoid suggesting # them again usedNamedArgs = set() par_level = -1 for token, next_token in zip(tokens, tokens[1:]): if token == '(': par_level += 1 elif token == ')': par_level -= 1 if par_level != 0: continue if next_token != '=': continue usedNamedArgs.add(token) argMatches = [] try: callableObj = '.'.join(ids[::-1]) namedArgs = self._default_arguments(eval(callableObj, self.namespace)) # Remove used named arguments from the list, no need to show twice for namedArg in set(namedArgs) - usedNamedArgs: if namedArg.startswith(text): argMatches.append("%s=" %namedArg) except: pass return argMatches @staticmethod def _get_keys(obj: Any) -> List[Any]: # Objects can define their own completions by defining an # _ipy_key_completions_() method. method = get_real_method(obj, '_ipython_key_completions_') if method is not None: return method() # Special case some common in-memory dict-like types if isinstance(obj, dict) or _safe_isinstance(obj, "pandas", "DataFrame"): try: return list(obj.keys()) except Exception: return [] elif _safe_isinstance(obj, "pandas", "core", "indexing", "_LocIndexer"): try: return list(obj.obj.keys()) except Exception: return [] elif _safe_isinstance(obj, 'numpy', 'ndarray') or\ _safe_isinstance(obj, 'numpy', 'void'): return obj.dtype.names or [] return [] @context_matcher() def dict_key_matcher(self, context: CompletionContext) -> SimpleMatcherResult: """Match string keys in a dictionary, after e.g. ``foo[``.""" matches = self.dict_key_matches(context.token) return _convert_matcher_v1_result_to_v2( matches, type="dict key", suppress_if_matches=True ) def dict_key_matches(self, text: str) -> List[str]: """Match string keys in a dictionary, after e.g. ``foo[``. .. deprecated:: 8.6 You can use :meth:`dict_key_matcher` instead. """ # Short-circuit on closed dictionary (regular expression would # not match anyway, but would take quite a while). if self.text_until_cursor.strip().endswith("]"): return [] match = DICT_MATCHER_REGEX.search(self.text_until_cursor) if match is None: return [] expr, prior_tuple_keys, key_prefix = match.groups() obj = self._evaluate_expr(expr) if obj is not_found: return [] keys = self._get_keys(obj) if not keys: return keys tuple_prefix = guarded_eval( prior_tuple_keys, EvaluationContext( globals=self.global_namespace, locals=self.namespace, evaluation=self.evaluation, # type: ignore in_subscript=True, ), ) closing_quote, token_offset, matches = match_dict_keys( keys, key_prefix, self.splitter.delims, extra_prefix=tuple_prefix ) if not matches: return [] # get the cursor position of # - the text being completed # - the start of the key text # - the start of the completion text_start = len(self.text_until_cursor) - len(text) if key_prefix: key_start = match.start(3) completion_start = key_start + token_offset else: key_start = completion_start = match.end() # grab the leading prefix, to make sure all completions start with `text` if text_start > key_start: leading = '' else: leading = text[text_start:completion_start] # append closing quote and bracket as appropriate # this is *not* appropriate if the opening quote or bracket is outside # the text given to this method, e.g. `d["""a\nt can_close_quote = False can_close_bracket = False continuation = self.line_buffer[len(self.text_until_cursor) :].strip() if continuation.startswith(closing_quote): # do not close if already closed, e.g. `d['a'` continuation = continuation[len(closing_quote) :] else: can_close_quote = True continuation = continuation.strip() # e.g. `pandas.DataFrame` has different tuple indexer behaviour, # handling it is out of scope, so let's avoid appending suffixes. has_known_tuple_handling = isinstance(obj, dict) can_close_bracket = ( not continuation.startswith("]") and self.auto_close_dict_keys ) can_close_tuple_item = ( not continuation.startswith(",") and has_known_tuple_handling and self.auto_close_dict_keys ) can_close_quote = can_close_quote and self.auto_close_dict_keys # fast path if closing quote should be appended but not suffix is allowed if not can_close_quote and not can_close_bracket and closing_quote: return [leading + k for k in matches] results = [] end_of_tuple_or_item = _DictKeyState.END_OF_TUPLE | _DictKeyState.END_OF_ITEM for k, state_flag in matches.items(): result = leading + k if can_close_quote and closing_quote: result += closing_quote if state_flag == end_of_tuple_or_item: # We do not know which suffix to add, # e.g. both tuple item and string # match this item. pass if state_flag in end_of_tuple_or_item and can_close_bracket: result += "]" if state_flag == _DictKeyState.IN_TUPLE and can_close_tuple_item: result += ", " results.append(result) return results @context_matcher() def unicode_name_matcher(self, context: CompletionContext): """Same as :any:`unicode_name_matches`, but adopted to new Matcher API.""" fragment, matches = self.unicode_name_matches(context.text_until_cursor) return _convert_matcher_v1_result_to_v2( matches, type="unicode", fragment=fragment, suppress_if_matches=True ) @staticmethod def unicode_name_matches(text: str) -> Tuple[str, List[str]]: """Match Latex-like syntax for unicode characters base on the name of the character. This does ``\\GREEK SMALL LETTER ETA`` -> ``η`` Works only on valid python 3 identifier, or on combining characters that will combine to form a valid identifier. """ slashpos = text.rfind('\\') if slashpos > -1: s = text[slashpos+1:] try : unic = unicodedata.lookup(s) # allow combining chars if ('a'+unic).isidentifier(): return '\\'+s,[unic] except KeyError: pass return '', [] @context_matcher() def latex_name_matcher(self, context: CompletionContext): """Match Latex syntax for unicode characters. This does both ``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` """ fragment, matches = self.latex_matches(context.text_until_cursor) return _convert_matcher_v1_result_to_v2( matches, type="latex", fragment=fragment, suppress_if_matches=True ) def latex_matches(self, text: str) -> Tuple[str, Sequence[str]]: """Match Latex syntax for unicode characters. This does both ``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` .. deprecated:: 8.6 You can use :meth:`latex_name_matcher` instead. """ slashpos = text.rfind('\\') if slashpos > -1: s = text[slashpos:] if s in latex_symbols: # Try to complete a full latex symbol to unicode # \\alpha -> α return s, [latex_symbols[s]] else: # If a user has partially typed a latex symbol, give them # a full list of options \al -> [\aleph, \alpha] matches = [k for k in latex_symbols if k.startswith(s)] if matches: return s, matches return '', () @context_matcher() def custom_completer_matcher(self, context): """Dispatch custom completer. If a match is found, suppresses all other matchers except for Jedi. """ matches = self.dispatch_custom_completer(context.token) or [] result = _convert_matcher_v1_result_to_v2( matches, type=_UNKNOWN_TYPE, suppress_if_matches=True ) result["ordered"] = True result["do_not_suppress"] = {_get_matcher_id(self._jedi_matcher)} return result def dispatch_custom_completer(self, text): """ .. deprecated:: 8.6 You can use :meth:`custom_completer_matcher` instead. """ if not self.custom_completers: return line = self.line_buffer if not line.strip(): return None # Create a little structure to pass all the relevant information about # the current completion to any custom completer. event = SimpleNamespace() event.line = line event.symbol = text cmd = line.split(None,1)[0] event.command = cmd event.text_until_cursor = self.text_until_cursor # for foo etc, try also to find completer for %foo if not cmd.startswith(self.magic_escape): try_magic = self.custom_completers.s_matches( self.magic_escape + cmd) else: try_magic = [] for c in itertools.chain(self.custom_completers.s_matches(cmd), try_magic, self.custom_completers.flat_matches(self.text_until_cursor)): try: res = c(event) if res: # first, try case sensitive match withcase = [r for r in res if r.startswith(text)] if withcase: return withcase # if none, then case insensitive ones are ok too text_low = text.lower() return [r for r in res if r.lower().startswith(text_low)] except TryNext: pass except KeyboardInterrupt: """ If custom completer take too long, let keyboard interrupt abort and return nothing. """ break return None def completions(self, text: str, offset: int)->Iterator[Completion]: """ Returns an iterator over the possible completions .. warning:: Unstable This function is unstable, API may change without warning. It will also raise unless use in proper context manager. Parameters ---------- text : str Full text of the current input, multi line string. offset : int Integer representing the position of the cursor in ``text``. Offset is 0-based indexed. Yields ------ Completion Notes ----- The cursor on a text can either be seen as being "in between" characters or "On" a character depending on the interface visible to the user. For consistency the cursor being on "in between" characters X and Y is equivalent to the cursor being "on" character Y, that is to say the character the cursor is on is considered as being after the cursor. Combining characters may span more that one position in the text. .. note:: If ``IPCompleter.debug`` is :any:`True` will yield a ``--jedi/ipython--`` fake Completion token to distinguish completion returned by Jedi and usual IPython completion. .. note:: Completions are not completely deduplicated yet. If identical completions are coming from different sources this function does not ensure that each completion object will only be present once. """ warnings.warn("_complete is a provisional API (as of IPython 6.0). " "It may change without warnings. " "Use in corresponding context manager.", category=ProvisionalCompleterWarning, stacklevel=2) seen = set() profiler:Optional[cProfile.Profile] try: if self.profile_completions: import cProfile profiler = cProfile.Profile() profiler.enable() else: profiler = None for c in self._completions(text, offset, _timeout=self.jedi_compute_type_timeout/1000): if c and (c in seen): continue yield c seen.add(c) except KeyboardInterrupt: """if completions take too long and users send keyboard interrupt, do not crash and return ASAP. """ pass finally: if profiler is not None: profiler.disable() ensure_dir_exists(self.profiler_output_dir) output_path = os.path.join(self.profiler_output_dir, str(uuid.uuid4())) print("Writing profiler output to", output_path) profiler.dump_stats(output_path) def _completions(self, full_text: str, offset: int, *, _timeout) -> Iterator[Completion]: """ Core completion module.Same signature as :any:`completions`, with the extra `timeout` parameter (in seconds). Computing jedi's completion ``.type`` can be quite expensive (it is a lazy property) and can require some warm-up, more warm up than just computing the ``name`` of a completion. The warm-up can be : - Long warm-up the first time a module is encountered after install/update: actually build parse/inference tree. - first time the module is encountered in a session: load tree from disk. We don't want to block completions for tens of seconds so we give the completer a "budget" of ``_timeout`` seconds per invocation to compute completions types, the completions that have not yet been computed will be marked as "unknown" an will have a chance to be computed next round are things get cached. Keep in mind that Jedi is not the only thing treating the completion so keep the timeout short-ish as if we take more than 0.3 second we still have lots of processing to do. """ deadline = time.monotonic() + _timeout before = full_text[:offset] cursor_line, cursor_column = position_to_cursor(full_text, offset) jedi_matcher_id = _get_matcher_id(self._jedi_matcher) def is_non_jedi_result( result: MatcherResult, identifier: str ) -> TypeGuard[SimpleMatcherResult]: return identifier != jedi_matcher_id results = self._complete( full_text=full_text, cursor_line=cursor_line, cursor_pos=cursor_column ) non_jedi_results: Dict[str, SimpleMatcherResult] = { identifier: result for identifier, result in results.items() if is_non_jedi_result(result, identifier) } jedi_matches = ( cast(_JediMatcherResult, results[jedi_matcher_id])["completions"] if jedi_matcher_id in results else () ) iter_jm = iter(jedi_matches) if _timeout: for jm in iter_jm: try: type_ = jm.type except Exception: if self.debug: print("Error in Jedi getting type of ", jm) type_ = None delta = len(jm.name_with_symbols) - len(jm.complete) if type_ == 'function': signature = _make_signature(jm) else: signature = '' yield Completion(start=offset - delta, end=offset, text=jm.name_with_symbols, type=type_, signature=signature, _origin='jedi') if time.monotonic() > deadline: break for jm in iter_jm: delta = len(jm.name_with_symbols) - len(jm.complete) yield Completion( start=offset - delta, end=offset, text=jm.name_with_symbols, type=_UNKNOWN_TYPE, # don't compute type for speed _origin="jedi", signature="", ) # TODO: # Suppress this, right now just for debug. if jedi_matches and non_jedi_results and self.debug: some_start_offset = before.rfind( next(iter(non_jedi_results.values()))["matched_fragment"] ) yield Completion( start=some_start_offset, end=offset, text="--jedi/ipython--", _origin="debug", type="none", signature="", ) ordered: List[Completion] = [] sortable: List[Completion] = [] for origin, result in non_jedi_results.items(): matched_text = result["matched_fragment"] start_offset = before.rfind(matched_text) is_ordered = result.get("ordered", False) container = ordered if is_ordered else sortable # I'm unsure if this is always true, so let's assert and see if it # crash assert before.endswith(matched_text) for simple_completion in result["completions"]: completion = Completion( start=start_offset, end=offset, text=simple_completion.text, _origin=origin, signature="", type=simple_completion.type or _UNKNOWN_TYPE, ) container.append(completion) yield from list(self._deduplicate(ordered + self._sort(sortable)))[ :MATCHES_LIMIT ] def complete(self, text=None, line_buffer=None, cursor_pos=None) -> Tuple[str, Sequence[str]]: """Find completions for the given text and line context. Note that both the text and the line_buffer are optional, but at least one of them must be given. Parameters ---------- text : string, optional Text to perform the completion on. If not given, the line buffer is split using the instance's CompletionSplitter object. line_buffer : string, optional If not given, the completer attempts to obtain the current line buffer via readline. This keyword allows clients which are requesting for text completions in non-readline contexts to inform the completer of the entire text. cursor_pos : int, optional Index of the cursor in the full line buffer. Should be provided by remote frontends where kernel has no access to frontend state. Returns ------- Tuple of two items: text : str Text that was actually used in the completion. matches : list A list of completion matches. Notes ----- This API is likely to be deprecated and replaced by :any:`IPCompleter.completions` in the future. """ warnings.warn('`Completer.complete` is pending deprecation since ' 'IPython 6.0 and will be replaced by `Completer.completions`.', PendingDeprecationWarning) # potential todo, FOLD the 3rd throw away argument of _complete # into the first 2 one. # TODO: Q: does the above refer to jedi completions (i.e. 0-indexed?) # TODO: should we deprecate now, or does it stay? results = self._complete( line_buffer=line_buffer, cursor_pos=cursor_pos, text=text, cursor_line=0 ) jedi_matcher_id = _get_matcher_id(self._jedi_matcher) return self._arrange_and_extract( results, # TODO: can we confirm that excluding Jedi here was a deliberate choice in previous version? skip_matchers={jedi_matcher_id}, # this API does not support different start/end positions (fragments of token). abort_if_offset_changes=True, ) def _arrange_and_extract( self, results: Dict[str, MatcherResult], skip_matchers: Set[str], abort_if_offset_changes: bool, ): sortable: List[AnyMatcherCompletion] = [] ordered: List[AnyMatcherCompletion] = [] most_recent_fragment = None for identifier, result in results.items(): if identifier in skip_matchers: continue if not result["completions"]: continue if not most_recent_fragment: most_recent_fragment = result["matched_fragment"] if ( abort_if_offset_changes and result["matched_fragment"] != most_recent_fragment ): break if result.get("ordered", False): ordered.extend(result["completions"]) else: sortable.extend(result["completions"]) if not most_recent_fragment: most_recent_fragment = "" # to satisfy typechecker (and just in case) return most_recent_fragment, [ m.text for m in self._deduplicate(ordered + self._sort(sortable)) ] def _complete(self, *, cursor_line, cursor_pos, line_buffer=None, text=None, full_text=None) -> _CompleteResult: """ Like complete but can also returns raw jedi completions as well as the origin of the completion text. This could (and should) be made much cleaner but that will be simpler once we drop the old (and stateful) :any:`complete` API. With current provisional API, cursor_pos act both (depending on the caller) as the offset in the ``text`` or ``line_buffer``, or as the ``column`` when passing multiline strings this could/should be renamed but would add extra noise. Parameters ---------- cursor_line Index of the line the cursor is on. 0 indexed. cursor_pos Position of the cursor in the current line/line_buffer/text. 0 indexed. line_buffer : optional, str The current line the cursor is in, this is mostly due to legacy reason that readline could only give a us the single current line. Prefer `full_text`. text : str The current "token" the cursor is in, mostly also for historical reasons. as the completer would trigger only after the current line was parsed. full_text : str Full text of the current cell. Returns ------- An ordered dictionary where keys are identifiers of completion matchers and values are ``MatcherResult``s. """ # if the cursor position isn't given, the only sane assumption we can # make is that it's at the end of the line (the common case) if cursor_pos is None: cursor_pos = len(line_buffer) if text is None else len(text) if self.use_main_ns: self.namespace = __main__.__dict__ # if text is either None or an empty string, rely on the line buffer if (not line_buffer) and full_text: line_buffer = full_text.split('\n')[cursor_line] if not text: # issue #11508: check line_buffer before calling split_line text = ( self.splitter.split_line(line_buffer, cursor_pos) if line_buffer else "" ) # If no line buffer is given, assume the input text is all there was if line_buffer is None: line_buffer = text # deprecated - do not use `line_buffer` in new code. self.line_buffer = line_buffer self.text_until_cursor = self.line_buffer[:cursor_pos] if not full_text: full_text = line_buffer context = CompletionContext( full_text=full_text, cursor_position=cursor_pos, cursor_line=cursor_line, token=text, limit=MATCHES_LIMIT, ) # Start with a clean slate of completions results: Dict[str, MatcherResult] = {} jedi_matcher_id = _get_matcher_id(self._jedi_matcher) suppressed_matchers: Set[str] = set() matchers = { _get_matcher_id(matcher): matcher for matcher in sorted( self.matchers, key=_get_matcher_priority, reverse=True ) } for matcher_id, matcher in matchers.items(): matcher_id = _get_matcher_id(matcher) if matcher_id in self.disable_matchers: continue if matcher_id in results: warnings.warn(f"Duplicate matcher ID: {matcher_id}.") if matcher_id in suppressed_matchers: continue result: MatcherResult try: if _is_matcher_v1(matcher): result = _convert_matcher_v1_result_to_v2( matcher(text), type=_UNKNOWN_TYPE ) elif _is_matcher_v2(matcher): result = matcher(context) else: api_version = _get_matcher_api_version(matcher) raise ValueError(f"Unsupported API version {api_version}") except BaseException: # Show the ugly traceback if the matcher causes an # exception, but do NOT crash the kernel! sys.excepthook(*sys.exc_info()) continue # set default value for matched fragment if suffix was not selected. result["matched_fragment"] = result.get("matched_fragment", context.token) if not suppressed_matchers: suppression_recommended: Union[bool, Set[str]] = result.get( "suppress", False ) suppression_config = ( self.suppress_competing_matchers.get(matcher_id, None) if isinstance(self.suppress_competing_matchers, dict) else self.suppress_competing_matchers ) should_suppress = ( (suppression_config is True) or (suppression_recommended and (suppression_config is not False)) ) and has_any_completions(result) if should_suppress: suppression_exceptions: Set[str] = result.get( "do_not_suppress", set() ) if isinstance(suppression_recommended, Iterable): to_suppress = set(suppression_recommended) else: to_suppress = set(matchers) suppressed_matchers = to_suppress - suppression_exceptions new_results = {} for previous_matcher_id, previous_result in results.items(): if previous_matcher_id not in suppressed_matchers: new_results[previous_matcher_id] = previous_result results = new_results results[matcher_id] = result _, matches = self._arrange_and_extract( results, # TODO Jedi completions non included in legacy stateful API; was this deliberate or omission? # if it was omission, we can remove the filtering step, otherwise remove this comment. skip_matchers={jedi_matcher_id}, abort_if_offset_changes=False, ) # populate legacy stateful API self.matches = matches return results @staticmethod def _deduplicate( matches: Sequence[AnyCompletion], ) -> Iterable[AnyCompletion]: filtered_matches: Dict[str, AnyCompletion] = {} for match in matches: text = match.text if ( text not in filtered_matches or filtered_matches[text].type == _UNKNOWN_TYPE ): filtered_matches[text] = match return filtered_matches.values() @staticmethod def _sort(matches: Sequence[AnyCompletion]): return sorted(matches, key=lambda x: completions_sorting_key(x.text)) @context_matcher() def fwd_unicode_matcher(self, context: CompletionContext): """Same as :any:`fwd_unicode_match`, but adopted to new Matcher API.""" # TODO: use `context.limit` to terminate early once we matched the maximum # number that will be used downstream; can be added as an optional to # `fwd_unicode_match(text: str, limit: int = None)` or we could re-implement here. fragment, matches = self.fwd_unicode_match(context.text_until_cursor) return _convert_matcher_v1_result_to_v2( matches, type="unicode", fragment=fragment, suppress_if_matches=True ) def fwd_unicode_match(self, text: str) -> Tuple[str, Sequence[str]]: """ Forward match a string starting with a backslash with a list of potential Unicode completions. Will compute list of Unicode character names on first call and cache it. .. deprecated:: 8.6 You can use :meth:`fwd_unicode_matcher` instead. Returns ------- At tuple with: - matched text (empty if no matches) - list of potential completions, empty tuple otherwise) """ # TODO: self.unicode_names is here a list we traverse each time with ~100k elements. # We could do a faster match using a Trie. # Using pygtrie the following seem to work: # s = PrefixSet() # for c in range(0,0x10FFFF + 1): # try: # s.add(unicodedata.name(chr(c))) # except ValueError: # pass # [''.join(k) for k in s.iter(prefix)] # But need to be timed and adds an extra dependency. slashpos = text.rfind('\\') # if text starts with slash if slashpos > -1: # PERF: It's important that we don't access self._unicode_names # until we're inside this if-block. _unicode_names is lazily # initialized, and it takes a user-noticeable amount of time to # initialize it, so we don't want to initialize it unless we're # actually going to use it. s = text[slashpos + 1 :] sup = s.upper() candidates = [x for x in self.unicode_names if x.startswith(sup)] if candidates: return s, candidates candidates = [x for x in self.unicode_names if sup in x] if candidates: return s, candidates splitsup = sup.split(" ") candidates = [ x for x in self.unicode_names if all(u in x for u in splitsup) ] if candidates: return s, candidates return "", () # if text does not start with slash else: return '', () @property def unicode_names(self) -> List[str]: """List of names of unicode code points that can be completed. The list is lazily initialized on first access. """ if self._unicode_names is None: names = [] for c in range(0,0x10FFFF + 1): try: names.append(unicodedata.name(chr(c))) except ValueError: pass self._unicode_names = _unicode_name_compute(_UNICODE_RANGES) return self._unicode_names def _unicode_name_compute(ranges:List[Tuple[int,int]]) -> List[str]: names = [] for start,stop in ranges: for c in range(start, stop) : try: names.append(unicodedata.name(chr(c))) except ValueError: pass return names ipython-8.35.0/IPython/core/completerlib.py000066400000000000000000000305411477474304100206740ustar00rootroot00000000000000# encoding: utf-8 """Implementations for various useful completers. These are all loaded by default by IPython. """ #----------------------------------------------------------------------------- # Copyright (C) 2010-2011 The IPython Development Team. # # Distributed under the terms of the BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- # Stdlib imports import glob import inspect import os import re import sys from importlib import import_module from importlib.machinery import all_suffixes # Third-party imports from time import time from zipimport import zipimporter # Our own imports from .completer import expand_user, compress_user from .error import TryNext from ..utils._process_common import arg_split # FIXME: this should be pulled in with the right call via the component system from IPython import get_ipython from typing import List #----------------------------------------------------------------------------- # Globals and constants #----------------------------------------------------------------------------- _suffixes = all_suffixes() # Time in seconds after which the rootmodules will be stored permanently in the # ipython ip.db database (kept in the user's .ipython dir). TIMEOUT_STORAGE = 2 # Time in seconds after which we give up TIMEOUT_GIVEUP = 20 # Regular expression for the python import statement import_re = re.compile(r'(?P[^\W\d]\w*?)' r'(?P[/\\]__init__)?' r'(?P%s)$' % r'|'.join(re.escape(s) for s in _suffixes)) # RE for the ipython %run command (python + ipython scripts) magic_run_re = re.compile(r'.*(\.ipy|\.ipynb|\.py[w]?)$') #----------------------------------------------------------------------------- # Local utilities #----------------------------------------------------------------------------- def module_list(path: str) -> List[str]: """ Return the list containing the names of the modules available in the given folder. """ # sys.path has the cwd as an empty string, but isdir/listdir need it as '.' if path == '': path = '.' # A few local constants to be used in loops below pjoin = os.path.join if os.path.isdir(path): # Build a list of all files in the directory and all files # in its subdirectories. For performance reasons, do not # recurse more than one level into subdirectories. files: List[str] = [] for root, dirs, nondirs in os.walk(path, followlinks=True): subdir = root[len(path)+1:] if subdir: files.extend(pjoin(subdir, f) for f in nondirs) dirs[:] = [] # Do not recurse into additional subdirectories. else: files.extend(nondirs) else: try: files = list(zipimporter(path)._files.keys()) # type: ignore except Exception: files = [] # Build a list of modules which match the import_re regex. modules = [] for f in files: m = import_re.match(f) if m: modules.append(m.group('name')) return list(set(modules)) def get_root_modules(): """ Returns a list containing the names of all the modules available in the folders of the pythonpath. ip.db['rootmodules_cache'] maps sys.path entries to list of modules. """ ip = get_ipython() if ip is None: # No global shell instance to store cached list of modules. # Don't try to scan for modules every time. return list(sys.builtin_module_names) if getattr(ip.db, "_mock", False): rootmodules_cache = {} else: rootmodules_cache = ip.db.get("rootmodules_cache", {}) rootmodules = list(sys.builtin_module_names) start_time = time() store = False for path in sys.path: try: modules = rootmodules_cache[path] except KeyError: modules = module_list(path) try: modules.remove('__init__') except ValueError: pass if path not in ('', '.'): # cwd modules should not be cached rootmodules_cache[path] = modules if time() - start_time > TIMEOUT_STORAGE and not store: store = True print("\nCaching the list of root modules, please wait!") print("(This will only be done once - type '%rehashx' to " "reset cache!)\n") sys.stdout.flush() if time() - start_time > TIMEOUT_GIVEUP: print("This is taking too long, we give up.\n") return [] rootmodules.extend(modules) if store: ip.db['rootmodules_cache'] = rootmodules_cache rootmodules = list(set(rootmodules)) return rootmodules def is_importable(module, attr: str, only_modules) -> bool: if only_modules: try: mod = getattr(module, attr) except ModuleNotFoundError: # See gh-14434 return False return inspect.ismodule(mod) else: return not(attr[:2] == '__' and attr[-2:] == '__') def is_possible_submodule(module, attr): try: obj = getattr(module, attr) except AttributeError: # Is possibly an unimported submodule return True except TypeError: # https://github.com/ipython/ipython/issues/9678 return False return inspect.ismodule(obj) def try_import(mod: str, only_modules=False) -> List[str]: """ Try to import given module and return list of potential completions. """ mod = mod.rstrip('.') try: m = import_module(mod) except: return [] m_is_init = '__init__' in (getattr(m, '__file__', '') or '') completions = [] if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init: completions.extend( [attr for attr in dir(m) if is_importable(m, attr, only_modules)]) m_all = getattr(m, "__all__", []) if only_modules: completions.extend(attr for attr in m_all if is_possible_submodule(m, attr)) else: completions.extend(m_all) if m_is_init: file_ = m.__file__ file_path = os.path.dirname(file_) # type: ignore if file_path is not None: completions.extend(module_list(file_path)) completions_set = {c for c in completions if isinstance(c, str)} completions_set.discard('__init__') return list(completions_set) #----------------------------------------------------------------------------- # Completion-related functions. #----------------------------------------------------------------------------- def quick_completer(cmd, completions): r""" Easily create a trivial completer for a command. Takes either a list of completions, or all completions in string (that will be split on whitespace). Example:: [d:\ipython]|1> import ipy_completers [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz']) [d:\ipython]|3> foo b bar baz [d:\ipython]|3> foo ba """ if isinstance(completions, str): completions = completions.split() def do_complete(self, event): return completions get_ipython().set_hook('complete_command',do_complete, str_key = cmd) def module_completion(line): """ Returns a list containing the completion possibilities for an import line. The line looks like this : 'import xml.d' 'from xml.dom import' """ words = line.split(' ') nwords = len(words) # from whatever -> 'import ' if nwords == 3 and words[0] == 'from': return ['import '] # 'from xy' or 'import xy' if nwords < 3 and (words[0] in {'%aimport', 'import', 'from'}) : if nwords == 1: return get_root_modules() mod = words[1].split('.') if len(mod) < 2: return get_root_modules() completion_list = try_import('.'.join(mod[:-1]), True) return ['.'.join(mod[:-1] + [el]) for el in completion_list] # 'from xyz import abc' if nwords >= 3 and words[0] == 'from': mod = words[1] return try_import(mod) #----------------------------------------------------------------------------- # Completers #----------------------------------------------------------------------------- # These all have the func(self, event) signature to be used as custom # completers def module_completer(self,event): """Give completions after user has typed 'import ...' or 'from ...'""" # This works in all versions of python. While 2.5 has # pkgutil.walk_packages(), that particular routine is fairly dangerous, # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full # of possibly problematic side effects. # This search the folders in the sys.path for available modules. return module_completion(event.line) # FIXME: there's a lot of logic common to the run, cd and builtin file # completers, that is currently reimplemented in each. def magic_run_completer(self, event): """Complete files that end in .py or .ipy or .ipynb for the %run command. """ comps = arg_split(event.line, strict=False) # relpath should be the current token that we need to complete. if (len(comps) > 1) and (not event.line.endswith(' ')): relpath = comps[-1].strip("'\"") else: relpath = '' #print("\nev=", event) # dbg #print("rp=", relpath) # dbg #print('comps=', comps) # dbg lglob = glob.glob isdir = os.path.isdir relpath, tilde_expand, tilde_val = expand_user(relpath) # Find if the user has already typed the first filename, after which we # should complete on all files, since after the first one other files may # be arguments to the input script. if any(magic_run_re.match(c) for c in comps): matches = [f.replace('\\','/') + ('/' if isdir(f) else '') for f in lglob(relpath+'*')] else: dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') if isdir(f)] pys = [f.replace('\\','/') for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') + lglob(relpath+'*.ipynb') + lglob(relpath + '*.pyw')] matches = dirs + pys #print('run comp:', dirs+pys) # dbg return [compress_user(p, tilde_expand, tilde_val) for p in matches] def cd_completer(self, event): """Completer function for cd, which only returns directories.""" ip = get_ipython() relpath = event.symbol #print(event) # dbg if event.line.endswith('-b') or ' -b ' in event.line: # return only bookmark completions bkms = self.db.get('bookmarks', None) if bkms: return bkms.keys() else: return [] if event.symbol == '-': width_dh = str(len(str(len(ip.user_ns['_dh']) + 1))) # jump in directory history by number fmt = '-%0' + width_dh +'d [%s]' ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])] if len(ents) > 1: return ents return [] if event.symbol.startswith('--'): return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']] # Expand ~ in path and normalize directory separators. relpath, tilde_expand, tilde_val = expand_user(relpath) relpath = relpath.replace('\\','/') found = [] for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*') if os.path.isdir(f)]: if ' ' in d: # we don't want to deal with any of that, complex code # for this is elsewhere raise TryNext found.append(d) if not found: if os.path.isdir(relpath): return [compress_user(relpath, tilde_expand, tilde_val)] # if no completions so far, try bookmarks bks = self.db.get('bookmarks',{}) bkmatches = [s for s in bks if s.startswith(event.symbol)] if bkmatches: return bkmatches raise TryNext return [compress_user(p, tilde_expand, tilde_val) for p in found] def reset_completer(self, event): "A completer for %reset magic" return '-f -s in out array dhist'.split() ipython-8.35.0/IPython/core/crashhandler.py000066400000000000000000000213311477474304100206460ustar00rootroot00000000000000# encoding: utf-8 """sys.excepthook for IPython itself, leaves a detailed report on disk. Authors: * Fernando Perez * Brian E. Granger """ #----------------------------------------------------------------------------- # Copyright (C) 2001-2007 Fernando Perez. # Copyright (C) 2008-2011 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import sys import traceback from pprint import pformat from pathlib import Path import builtins as builtin_mod from IPython.core import ultratb from IPython.core.application import Application from IPython.core.release import author_email from IPython.utils.sysinfo import sys_info from IPython.core.release import __version__ as version from typing import Optional, Dict import types #----------------------------------------------------------------------------- # Code #----------------------------------------------------------------------------- # Template for the user message. _default_message_template = """\ Oops, {app_name} crashed. We do our best to make it stable, but... A crash report was automatically generated with the following information: - A verbatim copy of the crash traceback. - A copy of your input history during this session. - Data on your current {app_name} configuration. It was left in the file named: \t'{crash_report_fname}' If you can email this file to the developers, the information in it will help them in understanding and correcting the problem. You can mail it to: {contact_name} at {contact_email} with the subject '{app_name} Crash Report'. If you want to do it now, the following command will work (under Unix): mail -s '{app_name} Crash Report' {contact_email} < {crash_report_fname} In your email, please also include information about: - The operating system under which the crash happened: Linux, macOS, Windows, other, and which exact version (for example: Ubuntu 16.04.3, macOS 10.13.2, Windows 10 Pro), and whether it is 32-bit or 64-bit; - How {app_name} was installed: using pip or conda, from GitHub, as part of a Docker container, or other, providing more detail if possible; - How to reproduce the crash: what exact sequence of instructions can one input to get the same crash? Ideally, find a minimal yet complete sequence of instructions that yields the crash. To ensure accurate tracking of this issue, please file a report about it at: {bug_tracker} """ _lite_message_template = """ If you suspect this is an IPython {version} bug, please report it at: https://github.com/ipython/ipython/issues or send an email to the mailing list at {email} You can print a more detailed traceback right now with "%tb", or use "%debug" to interactively debug it. Extra-detailed tracebacks for bug-reporting purposes can be enabled via: {config}Application.verbose_crash=True """ class CrashHandler: """Customizable crash handlers for IPython applications. Instances of this class provide a :meth:`__call__` method which can be used as a ``sys.excepthook``. The :meth:`__call__` signature is:: def __call__(self, etype, evalue, etb) """ message_template = _default_message_template section_sep = '\n\n'+'*'*75+'\n\n' info: Dict[str, Optional[str]] def __init__( self, app: Application, contact_name: Optional[str] = None, contact_email: Optional[str] = None, bug_tracker: Optional[str] = None, show_crash_traceback: bool = True, call_pdb: bool = False, ): """Create a new crash handler Parameters ---------- app : Application A running :class:`Application` instance, which will be queried at crash time for internal information. contact_name : str A string with the name of the person to contact. contact_email : str A string with the email address of the contact. bug_tracker : str A string with the URL for your project's bug tracker. show_crash_traceback : bool If false, don't print the crash traceback on stderr, only generate the on-disk report call_pdb Whether to call pdb on crash Attributes ---------- These instances contain some non-argument attributes which allow for further customization of the crash handler's behavior. Please see the source for further details. """ self.crash_report_fname = "Crash_report_%s.txt" % app.name self.app = app self.call_pdb = call_pdb #self.call_pdb = True # dbg self.show_crash_traceback = show_crash_traceback self.info = dict(app_name = app.name, contact_name = contact_name, contact_email = contact_email, bug_tracker = bug_tracker, crash_report_fname = self.crash_report_fname) def __call__( self, etype: type[BaseException], evalue: BaseException, etb: types.TracebackType, ) -> None: """Handle an exception, call for compatible with sys.excepthook""" # do not allow the crash handler to be called twice without reinstalling it # this prevents unlikely errors in the crash handling from entering an # infinite loop. sys.excepthook = sys.__excepthook__ # Report tracebacks shouldn't use color in general (safer for users) color_scheme = 'NoColor' # Use this ONLY for developer debugging (keep commented out for release) # color_scheme = 'Linux' # dbg ipython_dir = getattr(self.app, "ipython_dir", None) if ipython_dir is not None: assert isinstance(ipython_dir, str) rptdir = Path(ipython_dir) else: rptdir = Path.cwd() if not rptdir.is_dir(): rptdir = Path.cwd() report_name = rptdir / self.crash_report_fname # write the report filename into the instance dict so it can get # properly expanded out in the user message template self.crash_report_fname = str(report_name) self.info["crash_report_fname"] = str(report_name) TBhandler = ultratb.VerboseTB( color_scheme=color_scheme, long_header=True, call_pdb=self.call_pdb, ) if self.call_pdb: TBhandler(etype,evalue,etb) return else: traceback = TBhandler.text(etype,evalue,etb,context=31) # print traceback to screen if self.show_crash_traceback: print(traceback, file=sys.stderr) # and generate a complete report on disk try: report = open(report_name, "w", encoding="utf-8") except: print('Could not create crash report on disk.', file=sys.stderr) return with report: # Inform user on stderr of what happened print('\n'+'*'*70+'\n', file=sys.stderr) print(self.message_template.format(**self.info), file=sys.stderr) # Construct report on disk report.write(self.make_report(str(traceback))) builtin_mod.input("Hit to quit (your terminal may close):") def make_report(self, traceback: str) -> str: """Return a string containing a crash report.""" sec_sep = self.section_sep report = ['*'*75+'\n\n'+'IPython post-mortem report\n\n'] rpt_add = report.append rpt_add(sys_info()) try: config = pformat(self.app.config) rpt_add(sec_sep) rpt_add("Application name: %s\n\n" % self.app.name) rpt_add("Current user configuration structure:\n\n") rpt_add(config) except: pass rpt_add(sec_sep+'Crash traceback:\n\n' + traceback) return ''.join(report) def crash_handler_lite( etype: type[BaseException], evalue: BaseException, tb: types.TracebackType ) -> None: """a light excepthook, adding a small message to the usual traceback""" traceback.print_exception(etype, evalue, tb) from IPython.core.interactiveshell import InteractiveShell if InteractiveShell.initialized(): # we are in a Shell environment, give %magic example config = "%config " else: # we are not in a shell, show generic config config = "c." print(_lite_message_template.format(email=author_email, config=config, version=version), file=sys.stderr) ipython-8.35.0/IPython/core/debugger.py000066400000000000000000001141321477474304100177760ustar00rootroot00000000000000""" Pdb debugger class. This is an extension to PDB which adds a number of new features. Note that there is also the `IPython.terminal.debugger` class which provides UI improvements. We also strongly recommend to use this via the `ipdb` package, which provides extra configuration options. Among other things, this subclass of PDB: - supports many IPython magics like pdef/psource - hide frames in tracebacks based on `__tracebackhide__` - allows to skip frames based on `__debuggerskip__` Global Configuration -------------------- The IPython debugger will by read the global ``~/.pdbrc`` file. That is to say you can list all commands supported by ipdb in your `~/.pdbrc` configuration file, to globally configure pdb. Example:: # ~/.pdbrc skip_predicates debuggerskip false skip_hidden false context 25 Features -------- The IPython debugger can hide and skip frames when printing or moving through the stack. This can have a performance impact, so can be configures. The skipping and hiding frames are configurable via the `skip_predicates` command. By default, frames from readonly files will be hidden, frames containing ``__tracebackhide__ = True`` will be hidden. Frames containing ``__debuggerskip__`` will be stepped over, frames whose parent frames value of ``__debuggerskip__`` is ``True`` will also be skipped. >>> def helpers_helper(): ... pass ... ... def helper_1(): ... print("don't step in me") ... helpers_helpers() # will be stepped over unless breakpoint set. ... ... ... def helper_2(): ... print("in me neither") ... One can define a decorator that wraps a function between the two helpers: >>> def pdb_skipped_decorator(function): ... ... ... def wrapped_fn(*args, **kwargs): ... __debuggerskip__ = True ... helper_1() ... __debuggerskip__ = False ... result = function(*args, **kwargs) ... __debuggerskip__ = True ... helper_2() ... # setting __debuggerskip__ to False again is not necessary ... return result ... ... return wrapped_fn When decorating a function, ipdb will directly step into ``bar()`` by default: >>> @foo_decorator ... def bar(x, y): ... return x * y You can toggle the behavior with ipdb> skip_predicates debuggerskip false or configure it in your ``.pdbrc`` License ------- Modified from the standard pdb.Pdb class to avoid including readline, so that the command line completion of other programs which include this isn't damaged. In the future, this class will be expanded with improvements over the standard pdb. The original code in this file is mainly lifted out of cmd.py in Python 2.2, with minor changes. Licensing should therefore be under the standard Python terms. For details on the PSF (Python Software Foundation) standard license, see: https://docs.python.org/2/license.html All the changes since then are under the same license as IPython. """ #***************************************************************************** # # This file is licensed under the PSF license. # # Copyright (C) 2001 Python Software Foundation, www.python.org # Copyright (C) 2005-2006 Fernando Perez. # # #***************************************************************************** from __future__ import annotations import inspect import linecache import os import re import sys from contextlib import contextmanager from functools import lru_cache from IPython import get_ipython from IPython.core.excolors import exception_colors from IPython.utils import PyColorize, coloransi, py3compat from typing import TYPE_CHECKING if TYPE_CHECKING: # otherwise circular import from IPython.core.interactiveshell import InteractiveShell # skip module docstests __skip_doctest__ = True prompt = 'ipdb> ' # We have to check this directly from sys.argv, config struct not yet available from pdb import Pdb as OldPdb # Allow the set_trace code to operate outside of an ipython instance, even if # it does so with some limitations. The rest of this support is implemented in # the Tracer constructor. DEBUGGERSKIP = "__debuggerskip__" # this has been implemented in Pdb in Python 3.13 (https://github.com/python/cpython/pull/106676 # on lower python versions, we backported the feature. CHAIN_EXCEPTIONS = sys.version_info < (3, 13) def make_arrow(pad): """generate the leading arrow in front of traceback or debugger""" if pad >= 2: return '-'*(pad-2) + '> ' elif pad == 1: return '>' return '' def BdbQuit_excepthook(et, ev, tb, excepthook=None): """Exception hook which handles `BdbQuit` exceptions. All other exceptions are processed using the `excepthook` parameter. """ raise ValueError( "`BdbQuit_excepthook` is deprecated since version 5.1. It is still around only because it is still imported by ipdb.", ) RGX_EXTRA_INDENT = re.compile(r'(?<=\n)\s+') def strip_indentation(multiline_string): return RGX_EXTRA_INDENT.sub('', multiline_string) def decorate_fn_with_doc(new_fn, old_fn, additional_text=""): """Make new_fn have old_fn's doc string. This is particularly useful for the ``do_...`` commands that hook into the help system. Adapted from from a comp.lang.python posting by Duncan Booth.""" def wrapper(*args, **kw): return new_fn(*args, **kw) if old_fn.__doc__: wrapper.__doc__ = strip_indentation(old_fn.__doc__) + additional_text return wrapper class Pdb(OldPdb): """Modified Pdb class, does not load readline. for a standalone version that uses prompt_toolkit, see `IPython.terminal.debugger.TerminalPdb` and `IPython.terminal.debugger.set_trace()` This debugger can hide and skip frames that are tagged according to some predicates. See the `skip_predicates` commands. """ shell: InteractiveShell if CHAIN_EXCEPTIONS: MAX_CHAINED_EXCEPTION_DEPTH = 999 default_predicates = { "tbhide": True, "readonly": False, "ipython_internal": True, "debuggerskip": True, } def __init__(self, completekey=None, stdin=None, stdout=None, context=5, **kwargs): """Create a new IPython debugger. Parameters ---------- completekey : default None Passed to pdb.Pdb. stdin : default None Passed to pdb.Pdb. stdout : default None Passed to pdb.Pdb. context : int Number of lines of source code context to show when displaying stacktrace information. **kwargs Passed to pdb.Pdb. Notes ----- The possibilities are python version dependent, see the python docs for more info. """ # Parent constructor: try: self.context = int(context) if self.context <= 0: raise ValueError("Context must be a positive integer") except (TypeError, ValueError) as e: raise ValueError("Context must be a positive integer") from e # `kwargs` ensures full compatibility with stdlib's `pdb.Pdb`. OldPdb.__init__(self, completekey, stdin, stdout, **kwargs) # IPython changes... self.shell = get_ipython() if self.shell is None: save_main = sys.modules['__main__'] # No IPython instance running, we must create one from IPython.terminal.interactiveshell import \ TerminalInteractiveShell self.shell = TerminalInteractiveShell.instance() # needed by any code which calls __import__("__main__") after # the debugger was entered. See also #9941. sys.modules["__main__"] = save_main color_scheme = self.shell.colors self.aliases = {} # Create color table: we copy the default one from the traceback # module and add a few attributes needed for debugging self.color_scheme_table = exception_colors() # shorthands C = coloransi.TermColors cst = self.color_scheme_table # Add a python parser so we can syntax highlight source while # debugging. self.parser = PyColorize.Parser(style=color_scheme) self.set_colors(color_scheme) # Set the prompt - the default prompt is '(Pdb)' self.prompt = prompt self.skip_hidden = True self.report_skipped = True # list of predicates we use to skip frames self._predicates = self.default_predicates if CHAIN_EXCEPTIONS: self._chained_exceptions = tuple() self._chained_exception_index = 0 # def set_colors(self, scheme): """Shorthand access to the color table scheme selector method.""" self.color_scheme_table.set_active_scheme(scheme) self.parser.style = scheme def set_trace(self, frame=None): if frame is None: frame = sys._getframe().f_back self.initial_frame = frame return super().set_trace(frame) def _hidden_predicate(self, frame): """ Given a frame return whether it it should be hidden or not by IPython. """ if self._predicates["readonly"]: fname = frame.f_code.co_filename # we need to check for file existence and interactively define # function would otherwise appear as RO. if os.path.isfile(fname) and not os.access(fname, os.W_OK): return True if self._predicates["tbhide"]: if frame in (self.curframe, getattr(self, "initial_frame", None)): return False frame_locals = self._get_frame_locals(frame) if "__tracebackhide__" not in frame_locals: return False return frame_locals["__tracebackhide__"] return False def hidden_frames(self, stack): """ Given an index in the stack return whether it should be skipped. This is used in up/down and where to skip frames. """ # The f_locals dictionary is updated from the actual frame # locals whenever the .f_locals accessor is called, so we # avoid calling it here to preserve self.curframe_locals. # Furthermore, there is no good reason to hide the current frame. ip_hide = [self._hidden_predicate(s[0]) for s in stack] ip_start = [i for i, s in enumerate(ip_hide) if s == "__ipython_bottom__"] if ip_start and self._predicates["ipython_internal"]: ip_hide = [h if i > ip_start[0] else True for (i, h) in enumerate(ip_hide)] return ip_hide if CHAIN_EXCEPTIONS: def _get_tb_and_exceptions(self, tb_or_exc): """ Given a tracecack or an exception, return a tuple of chained exceptions and current traceback to inspect. This will deal with selecting the right ``__cause__`` or ``__context__`` as well as handling cycles, and return a flattened list of exceptions we can jump to with do_exceptions. """ _exceptions = [] if isinstance(tb_or_exc, BaseException): traceback, current = tb_or_exc.__traceback__, tb_or_exc while current is not None: if current in _exceptions: break _exceptions.append(current) if current.__cause__ is not None: current = current.__cause__ elif ( current.__context__ is not None and not current.__suppress_context__ ): current = current.__context__ if len(_exceptions) >= self.MAX_CHAINED_EXCEPTION_DEPTH: self.message( f"More than {self.MAX_CHAINED_EXCEPTION_DEPTH}" " chained exceptions found, not all exceptions" "will be browsable with `exceptions`." ) break else: traceback = tb_or_exc return tuple(reversed(_exceptions)), traceback @contextmanager def _hold_exceptions(self, exceptions): """ Context manager to ensure proper cleaning of exceptions references When given a chained exception instead of a traceback, pdb may hold references to many objects which may leak memory. We use this context manager to make sure everything is properly cleaned """ try: self._chained_exceptions = exceptions self._chained_exception_index = len(exceptions) - 1 yield finally: # we can't put those in forget as otherwise they would # be cleared on exception change self._chained_exceptions = tuple() self._chained_exception_index = 0 def do_exceptions(self, arg): """exceptions [number] List or change current exception in an exception chain. Without arguments, list all the current exception in the exception chain. Exceptions will be numbered, with the current exception indicated with an arrow. If given an integer as argument, switch to the exception at that index. """ if not self._chained_exceptions: self.message( "Did not find chained exceptions. To move between" " exceptions, pdb/post_mortem must be given an exception" " object rather than a traceback." ) return if not arg: for ix, exc in enumerate(self._chained_exceptions): prompt = ">" if ix == self._chained_exception_index else " " rep = repr(exc) if len(rep) > 80: rep = rep[:77] + "..." indicator = ( " -" if self._chained_exceptions[ix].__traceback__ is None else f"{ix:>3}" ) self.message(f"{prompt} {indicator} {rep}") else: try: number = int(arg) except ValueError: self.error("Argument must be an integer") return if 0 <= number < len(self._chained_exceptions): if self._chained_exceptions[number].__traceback__ is None: self.error( "This exception does not have a traceback, cannot jump to it" ) return self._chained_exception_index = number self.setup(None, self._chained_exceptions[number].__traceback__) self.print_stack_entry(self.stack[self.curindex]) else: self.error("No exception with that number") def interaction(self, frame, tb_or_exc): try: if CHAIN_EXCEPTIONS: # this context manager is part of interaction in 3.13 _chained_exceptions, tb = self._get_tb_and_exceptions(tb_or_exc) if isinstance(tb_or_exc, BaseException): assert tb is not None, "main exception must have a traceback" with self._hold_exceptions(_chained_exceptions): OldPdb.interaction(self, frame, tb) else: OldPdb.interaction(self, frame, tb_or_exc) except KeyboardInterrupt: self.stdout.write("\n" + self.shell.get_exception_only()) def precmd(self, line): """Perform useful escapes on the command before it is executed.""" if line.endswith("??"): line = "pinfo2 " + line[:-2] elif line.endswith("?"): line = "pinfo " + line[:-1] line = super().precmd(line) return line def new_do_quit(self, arg): return OldPdb.do_quit(self, arg) do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit) def print_stack_trace(self, context=None): Colors = self.color_scheme_table.active_colors ColorsNormal = Colors.Normal if context is None: context = self.context try: context = int(context) if context <= 0: raise ValueError("Context must be a positive integer") except (TypeError, ValueError) as e: raise ValueError("Context must be a positive integer") from e try: skipped = 0 for hidden, frame_lineno in zip(self.hidden_frames(self.stack), self.stack): if hidden and self.skip_hidden: skipped += 1 continue if skipped: print( f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n" ) skipped = 0 self.print_stack_entry(frame_lineno, context=context) if skipped: print( f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n" ) except KeyboardInterrupt: pass def print_stack_entry(self, frame_lineno, prompt_prefix='\n-> ', context=None): if context is None: context = self.context try: context = int(context) if context <= 0: raise ValueError("Context must be a positive integer") except (TypeError, ValueError) as e: raise ValueError("Context must be a positive integer") from e print(self.format_stack_entry(frame_lineno, '', context), file=self.stdout) # vds: >> frame, lineno = frame_lineno filename = frame.f_code.co_filename self.shell.hooks.synchronize_with_editor(filename, lineno, 0) # vds: << def _get_frame_locals(self, frame): """ " Accessing f_local of current frame reset the namespace, so we want to avoid that or the following can happen ipdb> foo "old" ipdb> foo = "new" ipdb> foo "new" ipdb> where ipdb> foo "old" So if frame is self.current_frame we instead return self.curframe_locals """ if frame is getattr(self, "curframe", None): return self.curframe_locals else: return frame.f_locals def format_stack_entry(self, frame_lineno, lprefix=': ', context=None): if context is None: context = self.context try: context = int(context) if context <= 0: print("Context must be a positive integer", file=self.stdout) except (TypeError, ValueError): print("Context must be a positive integer", file=self.stdout) import reprlib ret = [] Colors = self.color_scheme_table.active_colors ColorsNormal = Colors.Normal tpl_link = "%s%%s%s" % (Colors.filenameEm, ColorsNormal) tpl_call = "%s%%s%s%%s%s" % (Colors.vName, Colors.valEm, ColorsNormal) tpl_line = "%%s%s%%s %s%%s" % (Colors.lineno, ColorsNormal) tpl_line_em = "%%s%s%%s %s%%s%s" % (Colors.linenoEm, Colors.line, ColorsNormal) frame, lineno = frame_lineno return_value = '' loc_frame = self._get_frame_locals(frame) if "__return__" in loc_frame: rv = loc_frame["__return__"] # return_value += '->' return_value += reprlib.repr(rv) + "\n" ret.append(return_value) #s = filename + '(' + `lineno` + ')' filename = self.canonic(frame.f_code.co_filename) link = tpl_link % py3compat.cast_unicode(filename) if frame.f_code.co_name: func = frame.f_code.co_name else: func = "" call = "" if func != "?": if "__args__" in loc_frame: args = reprlib.repr(loc_frame["__args__"]) else: args = '()' call = tpl_call % (func, args) # The level info should be generated in the same format pdb uses, to # avoid breaking the pdbtrack functionality of python-mode in *emacs. if frame is self.curframe: ret.append('> ') else: ret.append(" ") ret.append("%s(%s)%s\n" % (link, lineno, call)) start = lineno - 1 - context//2 lines = linecache.getlines(filename) start = min(start, len(lines) - context) start = max(start, 0) lines = lines[start : start + context] for i, line in enumerate(lines): show_arrow = start + 1 + i == lineno linetpl = (frame is self.curframe or show_arrow) and tpl_line_em or tpl_line ret.append( self.__format_line( linetpl, filename, start + 1 + i, line, arrow=show_arrow ) ) return "".join(ret) def __format_line(self, tpl_line, filename, lineno, line, arrow=False): bp_mark = "" bp_mark_color = "" new_line, err = self.parser.format2(line, 'str') if not err: line = new_line bp = None if lineno in self.get_file_breaks(filename): bps = self.get_breaks(filename, lineno) bp = bps[-1] if bp: Colors = self.color_scheme_table.active_colors bp_mark = str(bp.number) bp_mark_color = Colors.breakpoint_enabled if not bp.enabled: bp_mark_color = Colors.breakpoint_disabled numbers_width = 7 if arrow: # This is the line with the error pad = numbers_width - len(str(lineno)) - len(bp_mark) num = '%s%s' % (make_arrow(pad), str(lineno)) else: num = '%*s' % (numbers_width - len(bp_mark), str(lineno)) return tpl_line % (bp_mark_color + bp_mark, num, line) def print_list_lines(self, filename, first, last): """The printing (as opposed to the parsing part of a 'list' command.""" try: Colors = self.color_scheme_table.active_colors ColorsNormal = Colors.Normal tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal) tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal) src = [] if filename == "" and hasattr(self, "_exec_filename"): filename = self._exec_filename for lineno in range(first, last+1): line = linecache.getline(filename, lineno) if not line: break if lineno == self.curframe.f_lineno: line = self.__format_line( tpl_line_em, filename, lineno, line, arrow=True ) else: line = self.__format_line( tpl_line, filename, lineno, line, arrow=False ) src.append(line) self.lineno = lineno print(''.join(src), file=self.stdout) except KeyboardInterrupt: pass def do_skip_predicates(self, args): """ Turn on/off individual predicates as to whether a frame should be hidden/skip. The global option to skip (or not) hidden frames is set with skip_hidden To change the value of a predicate skip_predicates key [true|false] Call without arguments to see the current values. To permanently change the value of an option add the corresponding command to your ``~/.pdbrc`` file. If you are programmatically using the Pdb instance you can also change the ``default_predicates`` class attribute. """ if not args.strip(): print("current predicates:") for p, v in self._predicates.items(): print(" ", p, ":", v) return type_value = args.strip().split(" ") if len(type_value) != 2: print( f"Usage: skip_predicates , with one of {set(self._predicates.keys())}" ) return type_, value = type_value if type_ not in self._predicates: print(f"{type_!r} not in {set(self._predicates.keys())}") return if value.lower() not in ("true", "yes", "1", "no", "false", "0"): print( f"{value!r} is invalid - use one of ('true', 'yes', '1', 'no', 'false', '0')" ) return self._predicates[type_] = value.lower() in ("true", "yes", "1") if not any(self._predicates.values()): print( "Warning, all predicates set to False, skip_hidden may not have any effects." ) def do_skip_hidden(self, arg): """ Change whether or not we should skip frames with the __tracebackhide__ attribute. """ if not arg.strip(): print( f"skip_hidden = {self.skip_hidden}, use 'yes','no', 'true', or 'false' to change." ) elif arg.strip().lower() in ("true", "yes"): self.skip_hidden = True elif arg.strip().lower() in ("false", "no"): self.skip_hidden = False if not any(self._predicates.values()): print( "Warning, all predicates set to False, skip_hidden may not have any effects." ) def do_list(self, arg): """Print lines of code from the current stack frame """ self.lastcmd = 'list' last = None if arg and arg != ".": try: x = eval(arg, {}, {}) if type(x) == type(()): first, last = x first = int(first) last = int(last) if last < first: # Assume it's a count last = first + last else: first = max(1, int(x) - 5) except: print('*** Error in argument:', repr(arg), file=self.stdout) return elif self.lineno is None or arg == ".": first = max(1, self.curframe.f_lineno - 5) else: first = self.lineno + 1 if last is None: last = first + 10 self.print_list_lines(self.curframe.f_code.co_filename, first, last) # vds: >> lineno = first filename = self.curframe.f_code.co_filename self.shell.hooks.synchronize_with_editor(filename, lineno, 0) # vds: << do_l = do_list def getsourcelines(self, obj): lines, lineno = inspect.findsource(obj) if inspect.isframe(obj) and obj.f_globals is self._get_frame_locals(obj): # must be a module frame: do not try to cut a block out of it return lines, 1 elif inspect.ismodule(obj): return lines, 1 return inspect.getblock(lines[lineno:]), lineno+1 def do_longlist(self, arg): """Print lines of code from the current stack frame. Shows more lines than 'list' does. """ self.lastcmd = 'longlist' try: lines, lineno = self.getsourcelines(self.curframe) except OSError as err: self.error(err) return last = lineno + len(lines) self.print_list_lines(self.curframe.f_code.co_filename, lineno, last) do_ll = do_longlist def do_debug(self, arg): """debug code Enter a recursive debugger that steps through the code argument (which is an arbitrary expression or statement to be executed in the current environment). """ trace_function = sys.gettrace() sys.settrace(None) globals = self.curframe.f_globals locals = self.curframe_locals p = self.__class__(completekey=self.completekey, stdin=self.stdin, stdout=self.stdout) p.use_rawinput = self.use_rawinput p.prompt = "(%s) " % self.prompt.strip() self.message("ENTERING RECURSIVE DEBUGGER") sys.call_tracing(p.run, (arg, globals, locals)) self.message("LEAVING RECURSIVE DEBUGGER") sys.settrace(trace_function) self.lastcmd = p.lastcmd def do_pdef(self, arg): """Print the call signature for any callable object. The debugger interface to %pdef""" namespaces = [ ("Locals", self.curframe_locals), ("Globals", self.curframe.f_globals), ] self.shell.find_line_magic("pdef")(arg, namespaces=namespaces) def do_pdoc(self, arg): """Print the docstring for an object. The debugger interface to %pdoc.""" namespaces = [ ("Locals", self.curframe_locals), ("Globals", self.curframe.f_globals), ] self.shell.find_line_magic("pdoc")(arg, namespaces=namespaces) def do_pfile(self, arg): """Print (or run through pager) the file where an object is defined. The debugger interface to %pfile. """ namespaces = [ ("Locals", self.curframe_locals), ("Globals", self.curframe.f_globals), ] self.shell.find_line_magic("pfile")(arg, namespaces=namespaces) def do_pinfo(self, arg): """Provide detailed information about an object. The debugger interface to %pinfo, i.e., obj?.""" namespaces = [ ("Locals", self.curframe_locals), ("Globals", self.curframe.f_globals), ] self.shell.find_line_magic("pinfo")(arg, namespaces=namespaces) def do_pinfo2(self, arg): """Provide extra detailed information about an object. The debugger interface to %pinfo2, i.e., obj??.""" namespaces = [ ("Locals", self.curframe_locals), ("Globals", self.curframe.f_globals), ] self.shell.find_line_magic("pinfo2")(arg, namespaces=namespaces) def do_psource(self, arg): """Print (or run through pager) the source code for an object.""" namespaces = [ ("Locals", self.curframe_locals), ("Globals", self.curframe.f_globals), ] self.shell.find_line_magic("psource")(arg, namespaces=namespaces) def do_where(self, arg): """w(here) Print a stack trace, with the most recent frame at the bottom. An arrow indicates the "current frame", which determines the context of most commands. 'bt' is an alias for this command. Take a number as argument as an (optional) number of context line to print""" if arg: try: context = int(arg) except ValueError as err: self.error(err) return self.print_stack_trace(context) else: self.print_stack_trace() do_w = do_where def break_anywhere(self, frame): """ _stop_in_decorator_internals is overly restrictive, as we may still want to trace function calls, so we need to also update break_anywhere so that is we don't `stop_here`, because of debugger skip, we may still stop at any point inside the function """ sup = super().break_anywhere(frame) if sup: return sup if self._predicates["debuggerskip"]: if DEBUGGERSKIP in frame.f_code.co_varnames: return True if frame.f_back and self._get_frame_locals(frame.f_back).get(DEBUGGERSKIP): return True return False def _is_in_decorator_internal_and_should_skip(self, frame): """ Utility to tell us whether we are in a decorator internal and should stop. """ # if we are disabled don't skip if not self._predicates["debuggerskip"]: return False return self._cachable_skip(frame) @lru_cache(1024) def _cached_one_parent_frame_debuggerskip(self, frame): """ Cache looking up for DEBUGGERSKIP on parent frame. This should speedup walking through deep frame when one of the highest one does have a debugger skip. This is likely to introduce fake positive though. """ while getattr(frame, "f_back", None): frame = frame.f_back if self._get_frame_locals(frame).get(DEBUGGERSKIP): return True return None @lru_cache(1024) def _cachable_skip(self, frame): # if frame is tagged, skip by default. if DEBUGGERSKIP in frame.f_code.co_varnames: return True # if one of the parent frame value set to True skip as well. if self._cached_one_parent_frame_debuggerskip(frame): return True return False def stop_here(self, frame): if self._is_in_decorator_internal_and_should_skip(frame) is True: return False hidden = False if self.skip_hidden: hidden = self._hidden_predicate(frame) if hidden: if self.report_skipped: Colors = self.color_scheme_table.active_colors ColorsNormal = Colors.Normal print( f"{Colors.excName} [... skipped 1 hidden frame]{ColorsNormal}\n" ) return super().stop_here(frame) def do_up(self, arg): """u(p) [count] Move the current frame count (default one) levels up in the stack trace (to an older frame). Will skip hidden frames. """ # modified version of upstream that skips # frames with __tracebackhide__ if self.curindex == 0: self.error("Oldest frame") return try: count = int(arg or 1) except ValueError: self.error("Invalid frame count (%s)" % arg) return skipped = 0 if count < 0: _newframe = 0 else: counter = 0 hidden_frames = self.hidden_frames(self.stack) for i in range(self.curindex - 1, -1, -1): if hidden_frames[i] and self.skip_hidden: skipped += 1 continue counter += 1 if counter >= count: break else: # if no break occurred. self.error( "all frames above hidden, use `skip_hidden False` to get get into those." ) return Colors = self.color_scheme_table.active_colors ColorsNormal = Colors.Normal _newframe = i self._select_frame(_newframe) if skipped: print( f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n" ) def do_down(self, arg): """d(own) [count] Move the current frame count (default one) levels down in the stack trace (to a newer frame). Will skip hidden frames. """ if self.curindex + 1 == len(self.stack): self.error("Newest frame") return try: count = int(arg or 1) except ValueError: self.error("Invalid frame count (%s)" % arg) return if count < 0: _newframe = len(self.stack) - 1 else: counter = 0 skipped = 0 hidden_frames = self.hidden_frames(self.stack) for i in range(self.curindex + 1, len(self.stack)): if hidden_frames[i] and self.skip_hidden: skipped += 1 continue counter += 1 if counter >= count: break else: self.error( "all frames below hidden, use `skip_hidden False` to get get into those." ) return Colors = self.color_scheme_table.active_colors ColorsNormal = Colors.Normal if skipped: print( f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n" ) _newframe = i self._select_frame(_newframe) do_d = do_down do_u = do_up def do_context(self, context): """context number_of_lines Set the number of lines of source code to show when displaying stacktrace information. """ try: new_context = int(context) if new_context <= 0: raise ValueError() self.context = new_context except ValueError: self.error( f"The 'context' command requires a positive integer argument (current value {self.context})." ) class InterruptiblePdb(Pdb): """Version of debugger where KeyboardInterrupt exits the debugger altogether.""" def cmdloop(self, intro=None): """Wrap cmdloop() such that KeyboardInterrupt stops the debugger.""" try: return OldPdb.cmdloop(self, intro=intro) except KeyboardInterrupt: self.stop_here = lambda frame: False self.do_quit("") sys.settrace(None) self.quitting = False raise def _cmdloop(self): while True: try: # keyboard interrupts allow for an easy way to cancel # the current command, so allow them during interactive input self.allow_kbdint = True self.cmdloop() self.allow_kbdint = False break except KeyboardInterrupt: self.message('--KeyboardInterrupt--') raise def set_trace(frame=None, header=None): """ Start debugging from `frame`. If frame is not specified, debugging starts from caller's frame. """ pdb = Pdb() if header is not None: pdb.message(header) pdb.set_trace(frame or sys._getframe().f_back) ipython-8.35.0/IPython/core/display.py000066400000000000000000001265241477474304100176670ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Top-level display functions for displaying object in different formats.""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from binascii import b2a_base64, hexlify import html import json import mimetypes import os import struct import warnings from copy import deepcopy from os.path import splitext from pathlib import Path, PurePath from typing import Optional from IPython.testing.skipdoctest import skip_doctest from . import display_functions __all__ = [ "display_pretty", "display_html", "display_markdown", "display_svg", "display_png", "display_jpeg", "display_webp", "display_latex", "display_json", "display_javascript", "display_pdf", "DisplayObject", "TextDisplayObject", "Pretty", "HTML", "Markdown", "Math", "Latex", "SVG", "ProgressBar", "JSON", "GeoJSON", "Javascript", "Image", "set_matplotlib_formats", "set_matplotlib_close", "Video", ] _deprecated_names = ["display", "clear_output", "publish_display_data", "update_display", "DisplayHandle"] __all__ = __all__ + _deprecated_names # ----- warn to import from IPython.display ----- from warnings import warn def __getattr__(name): if name in _deprecated_names: warn( f"Importing {name} from IPython.core.display is deprecated since IPython 7.14, please import from IPython.display", DeprecationWarning, stacklevel=2, ) return getattr(display_functions, name) if name in globals().keys(): return globals()[name] else: raise AttributeError(f"module {__name__} has no attribute {name}") #----------------------------------------------------------------------------- # utility functions #----------------------------------------------------------------------------- def _safe_exists(path): """Check path, but don't let exceptions raise""" try: return os.path.exists(path) except Exception: return False def _display_mimetype(mimetype, objs, raw=False, metadata=None): """internal implementation of all display_foo methods Parameters ---------- mimetype : str The mimetype to be published (e.g. 'image/png') *objs : object The Python objects to display, or if raw=True raw text data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ if metadata: metadata = {mimetype: metadata} if raw: # turn list of pngdata into list of { 'image/png': pngdata } objs = [ {mimetype: obj} for obj in objs ] display_functions.display(*objs, raw=raw, metadata=metadata, include=[mimetype]) #----------------------------------------------------------------------------- # Main functions #----------------------------------------------------------------------------- def display_pretty(*objs, **kwargs): """Display the pretty (default) representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw text data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('text/plain', objs, **kwargs) def display_html(*objs, **kwargs): """Display the HTML representation of an object. Note: If raw=False and the object does not have a HTML representation, no HTML will be shown. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw HTML data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('text/html', objs, **kwargs) def display_markdown(*objs, **kwargs): """Displays the Markdown representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw markdown data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('text/markdown', objs, **kwargs) def display_svg(*objs, **kwargs): """Display the SVG representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw svg data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('image/svg+xml', objs, **kwargs) def display_png(*objs, **kwargs): """Display the PNG representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw png data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('image/png', objs, **kwargs) def display_jpeg(*objs, **kwargs): """Display the JPEG representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw JPEG data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('image/jpeg', objs, **kwargs) def display_webp(*objs, **kwargs): """Display the WEBP representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw JPEG data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype("image/webp", objs, **kwargs) def display_latex(*objs, **kwargs): """Display the LaTeX representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw latex data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('text/latex', objs, **kwargs) def display_json(*objs, **kwargs): """Display the JSON representation of an object. Note that not many frontends support displaying JSON. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw json data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('application/json', objs, **kwargs) def display_javascript(*objs, **kwargs): """Display the Javascript representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw javascript data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('application/javascript', objs, **kwargs) def display_pdf(*objs, **kwargs): """Display the PDF representation of an object. Parameters ---------- *objs : object The Python objects to display, or if raw=True raw javascript data to display. raw : bool Are the data objects raw data or Python objects that need to be formatted before display? [default: False] metadata : dict (optional) Metadata to be associated with the specific mimetype output. """ _display_mimetype('application/pdf', objs, **kwargs) #----------------------------------------------------------------------------- # Smart classes #----------------------------------------------------------------------------- class DisplayObject(object): """An object that wraps data to be displayed.""" _read_flags = 'r' _show_mem_addr = False metadata = None def __init__(self, data=None, url=None, filename=None, metadata=None): """Create a display object given raw data. When this object is returned by an expression or passed to the display function, it will result in the data being displayed in the frontend. The MIME type of the data should match the subclasses used, so the Png subclass should be used for 'image/png' data. If the data is a URL, the data will first be downloaded and then displayed. Parameters ---------- data : unicode, str or bytes The raw data or a URL or file to load the data from url : unicode A URL to download the data from. filename : unicode Path to a local file to load the data from. metadata : dict Dict of metadata associated to be the object when displayed """ if isinstance(data, (Path, PurePath)): data = str(data) if data is not None and isinstance(data, str): if data.startswith('http') and url is None: url = data filename = None data = None elif _safe_exists(data) and filename is None: url = None filename = data data = None self.url = url self.filename = filename # because of @data.setter methods in # subclasses ensure url and filename are set # before assigning to self.data self.data = data if metadata is not None: self.metadata = metadata elif self.metadata is None: self.metadata = {} self.reload() self._check_data() def __repr__(self): if not self._show_mem_addr: cls = self.__class__ r = "<%s.%s object>" % (cls.__module__, cls.__name__) else: r = super(DisplayObject, self).__repr__() return r def _check_data(self): """Override in subclasses if there's something to check.""" pass def _data_and_metadata(self): """shortcut for returning metadata with shape information, if defined""" if self.metadata: return self.data, deepcopy(self.metadata) else: return self.data def reload(self): """Reload the raw data from file or URL.""" if self.filename is not None: encoding = None if "b" in self._read_flags else "utf-8" with open(self.filename, self._read_flags, encoding=encoding) as f: self.data = f.read() elif self.url is not None: # Deferred import from urllib.request import urlopen response = urlopen(self.url) data = response.read() # extract encoding from header, if there is one: encoding = None if 'content-type' in response.headers: for sub in response.headers['content-type'].split(';'): sub = sub.strip() if sub.startswith('charset'): encoding = sub.split('=')[-1].strip() break if 'content-encoding' in response.headers: # TODO: do deflate? if 'gzip' in response.headers['content-encoding']: import gzip from io import BytesIO # assume utf-8 if encoding is not specified with gzip.open( BytesIO(data), "rt", encoding=encoding or "utf-8" ) as fp: encoding = None data = fp.read() # decode data, if an encoding was specified # We only touch self.data once since # subclasses such as SVG have @data.setter methods # that transform self.data into ... well svg. if encoding: self.data = data.decode(encoding, 'replace') else: self.data = data class TextDisplayObject(DisplayObject): """Create a text display object given raw data. Parameters ---------- data : str or unicode The raw data or a URL or file to load the data from. url : unicode A URL to download the data from. filename : unicode Path to a local file to load the data from. metadata : dict Dict of metadata associated to be the object when displayed """ def _check_data(self): if self.data is not None and not isinstance(self.data, str): raise TypeError("%s expects text, not %r" % (self.__class__.__name__, self.data)) class Pretty(TextDisplayObject): def _repr_pretty_(self, pp, cycle): return pp.text(self.data) class HTML(TextDisplayObject): def __init__(self, data=None, url=None, filename=None, metadata=None): def warn(): if not data: return False # # Avoid calling lower() on the entire data, because it could be a # long string and we're only interested in its beginning and end. # prefix = data[:10].lower() suffix = data[-10:].lower() return prefix.startswith("') m_warn.assert_not_called() display.HTML('') m_warn.assert_called_with('Consider using IPython.display.IFrame instead') m_warn.reset_mock() display.HTML('') m_warn.assert_called_with('Consider using IPython.display.IFrame instead') def test_progress(): p = display.ProgressBar(10) assert "0/10" in repr(p) p.html_width = "100%" p.progress = 5 assert ( p._repr_html_() == "" ) def test_progress_iter(): with capture_output(display=False) as captured: for i in display.ProgressBar(5): out = captured.stdout assert "{0}/5".format(i) in out out = captured.stdout assert "5/5" in out def test_json(): d = {'a': 5} lis = [d] metadata = [ {'expanded': False, 'root': 'root'}, {'expanded': True, 'root': 'root'}, {'expanded': False, 'root': 'custom'}, {'expanded': True, 'root': 'custom'}, ] json_objs = [ display.JSON(d), display.JSON(d, expanded=True), display.JSON(d, root='custom'), display.JSON(d, expanded=True, root='custom'), ] for j, md in zip(json_objs, metadata): assert j._repr_json_() == (d, md) with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") j = display.JSON(json.dumps(d)) assert len(w) == 1 assert j._repr_json_() == (d, metadata[0]) json_objs = [ display.JSON(lis), display.JSON(lis, expanded=True), display.JSON(lis, root='custom'), display.JSON(lis, expanded=True, root='custom'), ] for j, md in zip(json_objs, metadata): assert j._repr_json_() == (lis, md) with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") j = display.JSON(json.dumps(lis)) assert len(w) == 1 assert j._repr_json_() == (lis, metadata[0]) def test_video_embedding(): """use a tempfile, with dummy-data, to ensure that video embedding doesn't crash""" v = display.Video("http://ignored") assert not v.embed html = v._repr_html_() assert 'src="data:' not in html assert 'src="http://ignored"' in html with pytest.raises(ValueError): v = display.Video(b'abc') with NamedFileInTemporaryDirectory('test.mp4') as f: f.write(b'abc') f.close() v = display.Video(f.name) assert not v.embed html = v._repr_html_() assert 'src="data:' not in html v = display.Video(f.name, embed=True) html = v._repr_html_() assert 'src="data:video/mp4;base64,YWJj"' in html v = display.Video(f.name, embed=True, mimetype='video/other') html = v._repr_html_() assert 'src="data:video/other;base64,YWJj"' in html v = display.Video(b'abc', embed=True, mimetype='video/mp4') html = v._repr_html_() assert 'src="data:video/mp4;base64,YWJj"' in html v = display.Video(u'YWJj', embed=True, mimetype='video/xyz') html = v._repr_html_() assert 'src="data:video/xyz;base64,YWJj"' in html def test_html_metadata(): s = "

Test

" h = display.HTML(s, metadata={"isolated": True}) assert h._repr_html_() == (s, {"isolated": True}) def test_display_id(): ip = get_ipython() with mock.patch.object(ip.display_pub, 'publish') as pub: handle = display.display('x') assert handle is None handle = display.display('y', display_id='secret') assert isinstance(handle, display.DisplayHandle) handle2 = display.display('z', display_id=True) assert isinstance(handle2, display.DisplayHandle) assert handle.display_id != handle2.display_id assert pub.call_count == 3 args, kwargs = pub.call_args_list[0] assert args == () assert kwargs == { 'data': { 'text/plain': repr('x') }, 'metadata': {}, } args, kwargs = pub.call_args_list[1] assert args == () assert kwargs == { 'data': { 'text/plain': repr('y') }, 'metadata': {}, 'transient': { 'display_id': handle.display_id, }, } args, kwargs = pub.call_args_list[2] assert args == () assert kwargs == { 'data': { 'text/plain': repr('z') }, 'metadata': {}, 'transient': { 'display_id': handle2.display_id, }, } def test_update_display(): ip = get_ipython() with mock.patch.object(ip.display_pub, 'publish') as pub: with pytest.raises(TypeError): display.update_display('x') display.update_display('x', display_id='1') display.update_display('y', display_id='2') args, kwargs = pub.call_args_list[0] assert args == () assert kwargs == { 'data': { 'text/plain': repr('x') }, 'metadata': {}, 'transient': { 'display_id': '1', }, 'update': True, } args, kwargs = pub.call_args_list[1] assert args == () assert kwargs == { 'data': { 'text/plain': repr('y') }, 'metadata': {}, 'transient': { 'display_id': '2', }, 'update': True, } def test_display_handle(): ip = get_ipython() handle = display.DisplayHandle() assert isinstance(handle.display_id, str) handle = display.DisplayHandle("my-id") assert handle.display_id == "my-id" with mock.patch.object(ip.display_pub, "publish") as pub: handle.display("x") handle.update("y") args, kwargs = pub.call_args_list[0] assert args == () assert kwargs == { 'data': { 'text/plain': repr('x') }, 'metadata': {}, 'transient': { 'display_id': handle.display_id, } } args, kwargs = pub.call_args_list[1] assert args == () assert kwargs == { 'data': { 'text/plain': repr('y') }, 'metadata': {}, 'transient': { 'display_id': handle.display_id, }, 'update': True, } def test_image_alt_tag(): """Simple test for display.Image(args, alt=x,)""" thisurl = "http://example.com/image.png" img = display.Image(url=thisurl, alt="an image") assert 'an image' % (thisurl) == img._repr_html_() img = display.Image(url=thisurl, unconfined=True, alt="an image") assert ( 'an image' % (thisurl) == img._repr_html_() ) img = display.Image(url=thisurl, alt='>"& <') assert '>"& <' % (thisurl) == img._repr_html_() img = display.Image(url=thisurl, metadata={"alt": "an image"}) assert img.alt == "an image" here = os.path.dirname(__file__) img = display.Image(os.path.join(here, "2x2.png"), alt="an image") assert img.alt == "an image" _, md = img._repr_png_() assert md["alt"] == "an image" def test_image_bad_filename_raises_proper_exception(): with pytest.raises(FileNotFoundError): display.Image("/this/file/does/not/exist/")._repr_png_() ipython-8.35.0/IPython/core/tests/test_displayhook.py000066400000000000000000000070111477474304100227360ustar00rootroot00000000000000import sys from IPython.testing.tools import AssertPrints, AssertNotPrints from IPython.core.displayhook import CapturingDisplayHook from IPython.utils.capture import CapturedIO def test_output_displayed(): """Checking to make sure that output is displayed""" with AssertPrints('2'): ip.run_cell('1+1', store_history=True) with AssertPrints('2'): ip.run_cell('1+1 # comment with a semicolon;', store_history=True) with AssertPrints('2'): ip.run_cell('1+1\n#commented_out_function();', store_history=True) def test_output_quiet(): """Checking to make sure that output is quiet""" with AssertNotPrints('2'): ip.run_cell('1+1;', store_history=True) with AssertNotPrints('2'): ip.run_cell('1+1; # comment with a semicolon', store_history=True) with AssertNotPrints('2'): ip.run_cell('1+1;\n#commented_out_function()', store_history=True) def test_underscore_no_overwrite_user(): ip.run_cell('_ = 42', store_history=True) ip.run_cell('1+1', store_history=True) with AssertPrints('42'): ip.run_cell('print(_)', store_history=True) ip.run_cell('del _', store_history=True) ip.run_cell('6+6', store_history=True) with AssertPrints('12'): ip.run_cell('_', store_history=True) def test_underscore_no_overwrite_builtins(): ip.run_cell("import gettext ; gettext.install('foo')", store_history=True) ip.run_cell('3+3', store_history=True) with AssertPrints('gettext'): ip.run_cell('print(_)', store_history=True) ip.run_cell('_ = "userset"', store_history=True) with AssertPrints('userset'): ip.run_cell('print(_)', store_history=True) ip.run_cell('import builtins; del builtins._') def test_interactivehooks_ast_modes(): """ Test that ast nodes can be triggered with different modes """ saved_mode = ip.ast_node_interactivity ip.ast_node_interactivity = 'last_expr_or_assign' try: with AssertPrints('2'): ip.run_cell('a = 1+1', store_history=True) with AssertPrints('9'): ip.run_cell('b = 1+8 # comment with a semicolon;', store_history=False) with AssertPrints('7'): ip.run_cell('c = 1+6\n#commented_out_function();', store_history=True) ip.run_cell('d = 11', store_history=True) with AssertPrints('12'): ip.run_cell('d += 1', store_history=True) with AssertNotPrints('42'): ip.run_cell('(u,v) = (41+1, 43-1)') finally: ip.ast_node_interactivity = saved_mode def test_interactivehooks_ast_modes_semi_suppress(): """ Test that ast nodes can be triggered with different modes and suppressed by semicolon """ saved_mode = ip.ast_node_interactivity ip.ast_node_interactivity = 'last_expr_or_assign' try: with AssertNotPrints('2'): ip.run_cell('x = 1+1;', store_history=True) with AssertNotPrints('7'): ip.run_cell('y = 1+6; # comment with a semicolon', store_history=True) with AssertNotPrints('9'): ip.run_cell('z = 1+8;\n#commented_out_function()', store_history=True) finally: ip.ast_node_interactivity = saved_mode def test_capture_display_hook_format(): """Tests that the capture display hook conforms to the CapturedIO output format""" hook = CapturingDisplayHook(ip) hook({"foo": "bar"}) captured = CapturedIO(sys.stdout, sys.stderr, hook.outputs) # Should not raise with RichOutput transformation error captured.outputs ipython-8.35.0/IPython/core/tests/test_events.py000066400000000000000000000043571477474304100217260ustar00rootroot00000000000000import unittest from unittest.mock import Mock from IPython.core import events import IPython.testing.tools as tt @events._define_event def ping_received(): pass @events._define_event def event_with_argument(argument): pass class CallbackTests(unittest.TestCase): def setUp(self): self.em = events.EventManager(get_ipython(), {'ping_received': ping_received, 'event_with_argument': event_with_argument}) def test_register_unregister(self): cb = Mock() self.em.register('ping_received', cb) self.em.trigger('ping_received') self.assertEqual(cb.call_count, 1) self.em.unregister('ping_received', cb) self.em.trigger('ping_received') self.assertEqual(cb.call_count, 1) def test_bare_function_missed_unregister(self): def cb1(): ... def cb2(): ... self.em.register("ping_received", cb1) self.assertRaises(ValueError, self.em.unregister, "ping_received", cb2) self.em.unregister("ping_received", cb1) def test_cb_error(self): cb = Mock(side_effect=ValueError) self.em.register('ping_received', cb) with tt.AssertPrints("Error in callback"): self.em.trigger('ping_received') def test_cb_keyboard_interrupt(self): cb = Mock(side_effect=KeyboardInterrupt) self.em.register('ping_received', cb) with tt.AssertPrints("Error in callback"): self.em.trigger('ping_received') def test_unregister_during_callback(self): invoked = [False] * 3 def func1(*_): invoked[0] = True self.em.unregister('ping_received', func1) self.em.register('ping_received', func3) def func2(*_): invoked[1] = True self.em.unregister('ping_received', func2) def func3(*_): invoked[2] = True self.em.register('ping_received', func1) self.em.register('ping_received', func2) self.em.trigger('ping_received') self.assertEqual([True, True, False], invoked) self.assertEqual([func3], self.em.callbacks['ping_received']) ipython-8.35.0/IPython/core/tests/test_exceptiongroup_tb.py000066400000000000000000000070171477474304100241560ustar00rootroot00000000000000import unittest import re from IPython.utils.capture import capture_output import sys import pytest from tempfile import TemporaryDirectory from IPython.testing import tools as tt def _exceptiongroup_common( outer_chain: str, inner_chain: str, native: bool, ) -> None: pre_raise = "exceptiongroup." if not native else "" pre_catch = pre_raise if sys.version_info < (3, 11) else "" filestr = f""" {"import exceptiongroup" if not native else ""} import pytest def f(): raise ValueError("From f()") def g(): raise BaseException("From g()") def inner(inner_chain): excs = [] for callback in [f, g]: try: callback() except BaseException as err: excs.append(err) if excs: if inner_chain == "none": raise {pre_raise}BaseExceptionGroup("Oops", excs) try: raise SyntaxError() except SyntaxError as e: if inner_chain == "from": raise {pre_raise}BaseExceptionGroup("Oops", excs) from e else: raise {pre_raise}BaseExceptionGroup("Oops", excs) def outer(outer_chain, inner_chain): try: inner(inner_chain) except {pre_catch}BaseExceptionGroup as e: if outer_chain == "none": raise if outer_chain == "from": raise IndexError() from e else: raise IndexError outer("{outer_chain}", "{inner_chain}") """ with capture_output() as cap: ip.run_cell(filestr) match_lines = [] if inner_chain == "another": match_lines += [ "During handling of the above exception, another exception occurred:", ] elif inner_chain == "from": match_lines += [ "The above exception was the direct cause of the following exception:", ] match_lines += [ " + Exception Group Traceback (most recent call last):", f" | {pre_catch}BaseExceptionGroup: Oops (2 sub-exceptions)", " | ValueError: From f()", " | BaseException: From g()", ] if outer_chain == "another": match_lines += [ "During handling of the above exception, another exception occurred:", "IndexError", ] elif outer_chain == "from": match_lines += [ "The above exception was the direct cause of the following exception:", "IndexError", ] error_lines = cap.stderr.split("\n") err_index = match_index = 0 for expected in match_lines: for i, actual in enumerate(error_lines): if actual == expected: error_lines = error_lines[i + 1 :] break else: assert False, f"{expected} not found in cap.stderr" @pytest.mark.skipif( sys.version_info < (3, 11), reason="Native ExceptionGroup not implemented" ) @pytest.mark.parametrize("outer_chain", ["none", "from", "another"]) @pytest.mark.parametrize("inner_chain", ["none", "from", "another"]) def test_native_exceptiongroup(outer_chain, inner_chain) -> None: _exceptiongroup_common(outer_chain, inner_chain, native=True) @pytest.mark.parametrize("outer_chain", ["none", "from", "another"]) @pytest.mark.parametrize("inner_chain", ["none", "from", "another"]) def test_native_exceptiongroup(outer_chain, inner_chain) -> None: pytest.importorskip("exceptiongroup") _exceptiongroup_common(outer_chain, inner_chain, native=False) ipython-8.35.0/IPython/core/tests/test_extension.py000066400000000000000000000057221477474304100224330ustar00rootroot00000000000000import os.path from tempfile import TemporaryDirectory import IPython.testing.tools as tt from IPython.utils.syspathcontext import prepended_to_syspath ext1_content = """ def load_ipython_extension(ip): print("Running ext1 load") def unload_ipython_extension(ip): print("Running ext1 unload") """ ext2_content = """ def load_ipython_extension(ip): print("Running ext2 load") """ ext3_content = """ def load_ipython_extension(ip): ip2 = get_ipython() print(ip is ip2) """ def test_extension_loading(): em = get_ipython().extension_manager with TemporaryDirectory() as td: ext1 = os.path.join(td, "ext1.py") with open(ext1, "w", encoding="utf-8") as f: f.write(ext1_content) ext2 = os.path.join(td, "ext2.py") with open(ext2, "w", encoding="utf-8") as f: f.write(ext2_content) with prepended_to_syspath(td): assert 'ext1' not in em.loaded assert 'ext2' not in em.loaded # Load extension with tt.AssertPrints("Running ext1 load"): assert em.load_extension('ext1') is None assert 'ext1' in em.loaded # Should refuse to load it again with tt.AssertNotPrints("Running ext1 load"): assert em.load_extension('ext1') == 'already loaded' # Reload with tt.AssertPrints("Running ext1 unload"): with tt.AssertPrints("Running ext1 load", suppress=False): em.reload_extension('ext1') # Unload with tt.AssertPrints("Running ext1 unload"): assert em.unload_extension('ext1') is None # Can't unload again with tt.AssertNotPrints("Running ext1 unload"): assert em.unload_extension('ext1') == 'not loaded' assert em.unload_extension('ext2') == 'not loaded' # Load extension 2 with tt.AssertPrints("Running ext2 load"): assert em.load_extension('ext2') is None # Can't unload this assert em.unload_extension('ext2') == 'no unload function' # But can reload it with tt.AssertPrints("Running ext2 load"): em.reload_extension('ext2') def test_extension_builtins(): em = get_ipython().extension_manager with TemporaryDirectory() as td: ext3 = os.path.join(td, "ext3.py") with open(ext3, "w", encoding="utf-8") as f: f.write(ext3_content) assert 'ext3' not in em.loaded with prepended_to_syspath(td): # Load extension with tt.AssertPrints("True"): assert em.load_extension('ext3') is None assert 'ext3' in em.loaded def test_non_extension(): em = get_ipython().extension_manager assert em.load_extension("sys") == "no load function" ipython-8.35.0/IPython/core/tests/test_formatters.py000066400000000000000000000342141477474304100226030ustar00rootroot00000000000000"""Tests for the Formatters.""" from math import pi try: import numpy except: numpy = None import pytest from IPython import get_ipython from traitlets.config import Config from IPython.core.formatters import ( PlainTextFormatter, HTMLFormatter, PDFFormatter, _mod_name_key, DisplayFormatter, JSONFormatter, ) from IPython.utils.io import capture_output class A(object): def __repr__(self): return 'A()' class B(A): def __repr__(self): return 'B()' class C: pass class BadRepr(object): def __repr__(self): raise ValueError("bad repr") class BadPretty(object): _repr_pretty_ = None class GoodPretty(object): def _repr_pretty_(self, pp, cycle): pp.text('foo') def __repr__(self): return 'GoodPretty()' def foo_printer(obj, pp, cycle): pp.text('foo') def test_pretty(): f = PlainTextFormatter() f.for_type(A, foo_printer) assert f(A()) == "foo" assert f(B()) == "B()" assert f(GoodPretty()) == "foo" # Just don't raise an exception for the following: f(BadPretty()) f.pprint = False assert f(A()) == "A()" assert f(B()) == "B()" assert f(GoodPretty()) == "GoodPretty()" def test_deferred(): f = PlainTextFormatter() def test_precision(): """test various values for float_precision.""" f = PlainTextFormatter() assert f(pi) == repr(pi) f.float_precision = 0 if numpy: po = numpy.get_printoptions() assert po["precision"] == 0 assert f(pi) == "3" f.float_precision = 2 if numpy: po = numpy.get_printoptions() assert po["precision"] == 2 assert f(pi) == "3.14" f.float_precision = "%g" if numpy: po = numpy.get_printoptions() assert po["precision"] == 2 assert f(pi) == "3.14159" f.float_precision = "%e" assert f(pi) == "3.141593e+00" f.float_precision = "" if numpy: po = numpy.get_printoptions() assert po["precision"] == 8 assert f(pi) == repr(pi) def test_bad_precision(): """test various invalid values for float_precision.""" f = PlainTextFormatter() def set_fp(p): f.float_precision = p pytest.raises(ValueError, set_fp, "%") pytest.raises(ValueError, set_fp, "%.3f%i") pytest.raises(ValueError, set_fp, "foo") pytest.raises(ValueError, set_fp, -1) def test_for_type(): f = PlainTextFormatter() # initial return, None assert f.for_type(C, foo_printer) is None # no func queries assert f.for_type(C) is foo_printer # shouldn't change anything assert f.for_type(C) is foo_printer # None should do the same assert f.for_type(C, None) is foo_printer assert f.for_type(C, None) is foo_printer def test_for_type_string(): f = PlainTextFormatter() type_str = '%s.%s' % (C.__module__, 'C') # initial return, None assert f.for_type(type_str, foo_printer) is None # no func queries assert f.for_type(type_str) is foo_printer assert _mod_name_key(C) in f.deferred_printers assert f.for_type(C) is foo_printer assert _mod_name_key(C) not in f.deferred_printers assert C in f.type_printers def test_for_type_by_name(): f = PlainTextFormatter() mod = C.__module__ # initial return, None assert f.for_type_by_name(mod, "C", foo_printer) is None # no func queries assert f.for_type_by_name(mod, "C") is foo_printer # shouldn't change anything assert f.for_type_by_name(mod, "C") is foo_printer # None should do the same assert f.for_type_by_name(mod, "C", None) is foo_printer assert f.for_type_by_name(mod, "C", None) is foo_printer def test_lookup(): f = PlainTextFormatter() f.for_type(C, foo_printer) assert f.lookup(C()) is foo_printer with pytest.raises(KeyError): f.lookup(A()) def test_lookup_string(): f = PlainTextFormatter() type_str = '%s.%s' % (C.__module__, 'C') f.for_type(type_str, foo_printer) assert f.lookup(C()) is foo_printer # should move from deferred to imported dict assert _mod_name_key(C) not in f.deferred_printers assert C in f.type_printers def test_lookup_by_type(): f = PlainTextFormatter() f.for_type(C, foo_printer) assert f.lookup_by_type(C) is foo_printer with pytest.raises(KeyError): f.lookup_by_type(A) def test_lookup_by_type_string(): f = PlainTextFormatter() type_str = '%s.%s' % (C.__module__, 'C') f.for_type(type_str, foo_printer) # verify insertion assert _mod_name_key(C) in f.deferred_printers assert C not in f.type_printers assert f.lookup_by_type(type_str) is foo_printer # lookup by string doesn't cause import assert _mod_name_key(C) in f.deferred_printers assert C not in f.type_printers assert f.lookup_by_type(C) is foo_printer # should move from deferred to imported dict assert _mod_name_key(C) not in f.deferred_printers assert C in f.type_printers def test_in_formatter(): f = PlainTextFormatter() f.for_type(C, foo_printer) type_str = '%s.%s' % (C.__module__, 'C') assert C in f assert type_str in f def test_string_in_formatter(): f = PlainTextFormatter() type_str = '%s.%s' % (C.__module__, 'C') f.for_type(type_str, foo_printer) assert type_str in f assert C in f def test_pop(): f = PlainTextFormatter() f.for_type(C, foo_printer) assert f.lookup_by_type(C) is foo_printer assert f.pop(C, None) is foo_printer f.for_type(C, foo_printer) assert f.pop(C) is foo_printer with pytest.raises(KeyError): f.lookup_by_type(C) with pytest.raises(KeyError): f.pop(C) with pytest.raises(KeyError): f.pop(A) assert f.pop(A, None) is None def test_pop_string(): f = PlainTextFormatter() type_str = '%s.%s' % (C.__module__, 'C') with pytest.raises(KeyError): f.pop(type_str) f.for_type(type_str, foo_printer) f.pop(type_str) with pytest.raises(KeyError): f.lookup_by_type(C) with pytest.raises(KeyError): f.pop(type_str) f.for_type(C, foo_printer) assert f.pop(type_str, None) is foo_printer with pytest.raises(KeyError): f.lookup_by_type(C) with pytest.raises(KeyError): f.pop(type_str) assert f.pop(type_str, None) is None def test_error_method(): f = HTMLFormatter() class BadHTML(object): def _repr_html_(self): raise ValueError("Bad HTML") bad = BadHTML() with capture_output() as captured: result = f(bad) assert result is None assert "Traceback" in captured.stdout assert "Bad HTML" in captured.stdout assert "_repr_html_" in captured.stdout def test_nowarn_notimplemented(): f = HTMLFormatter() class HTMLNotImplemented(object): def _repr_html_(self): raise NotImplementedError h = HTMLNotImplemented() with capture_output() as captured: result = f(h) assert result is None assert "" == captured.stderr assert "" == captured.stdout def test_warn_error_for_type(): f = HTMLFormatter() f.for_type(int, lambda i: name_error) with capture_output() as captured: result = f(5) assert result is None assert "Traceback" in captured.stdout assert "NameError" in captured.stdout assert "name_error" in captured.stdout def test_error_pretty_method(): f = PlainTextFormatter() class BadPretty(object): def _repr_pretty_(self): return "hello" bad = BadPretty() with capture_output() as captured: result = f(bad) assert result is None assert "Traceback" in captured.stdout assert "_repr_pretty_" in captured.stdout assert "given" in captured.stdout assert "argument" in captured.stdout def test_bad_repr_traceback(): f = PlainTextFormatter() bad = BadRepr() with capture_output() as captured: result = f(bad) # catches error, returns None assert result is None assert "Traceback" in captured.stdout assert "__repr__" in captured.stdout assert "ValueError" in captured.stdout class MakePDF(object): def _repr_pdf_(self): return 'PDF' def test_pdf_formatter(): pdf = MakePDF() f = PDFFormatter() assert f(pdf) == "PDF" def test_print_method_bound(): f = HTMLFormatter() class MyHTML(object): def _repr_html_(self): return "hello" with capture_output() as captured: result = f(MyHTML) assert result is None assert "FormatterWarning" not in captured.stderr with capture_output() as captured: result = f(MyHTML()) assert result == "hello" assert captured.stderr == "" def test_print_method_weird(): class TextMagicHat(object): def __getattr__(self, key): return key f = HTMLFormatter() text_hat = TextMagicHat() assert text_hat._repr_html_ == "_repr_html_" with capture_output() as captured: result = f(text_hat) assert result is None assert "FormatterWarning" not in captured.stderr class CallableMagicHat(object): def __getattr__(self, key): return lambda : key call_hat = CallableMagicHat() with capture_output() as captured: result = f(call_hat) assert result is None class BadReprArgs(object): def _repr_html_(self, extra, args): return "html" bad = BadReprArgs() with capture_output() as captured: result = f(bad) assert result is None assert "FormatterWarning" not in captured.stderr def test_format_config(): """config objects don't pretend to support fancy reprs with lazy attrs""" f = HTMLFormatter() cfg = Config() with capture_output() as captured: result = f(cfg) assert result is None assert captured.stderr == "" with capture_output() as captured: result = f(Config) assert result is None assert captured.stderr == "" def test_pretty_max_seq_length(): f = PlainTextFormatter(max_seq_length=1) lis = list(range(3)) text = f(lis) assert text == "[0, ...]" f.max_seq_length = 0 text = f(lis) assert text == "[0, 1, 2]" text = f(list(range(1024))) lines = text.splitlines() assert len(lines) == 1024 def test_ipython_display_formatter(): """Objects with _ipython_display_ defined bypass other formatters""" f = get_ipython().display_formatter catcher = [] class SelfDisplaying(object): def _ipython_display_(self): catcher.append(self) class NotSelfDisplaying(object): def __repr__(self): return "NotSelfDisplaying" def _ipython_display_(self): raise NotImplementedError save_enabled = f.ipython_display_formatter.enabled f.ipython_display_formatter.enabled = True yes = SelfDisplaying() no = NotSelfDisplaying() d, md = f.format(no) assert d == {"text/plain": repr(no)} assert md == {} assert catcher == [] d, md = f.format(yes) assert d == {} assert md == {} assert catcher == [yes] f.ipython_display_formatter.enabled = save_enabled def test_repr_mime(): class HasReprMime(object): def _repr_mimebundle_(self, include=None, exclude=None): return { 'application/json+test.v2': { 'x': 'y' }, 'plain/text' : '', 'image/png' : 'i-overwrite' } def _repr_png_(self): return 'should-be-overwritten' def _repr_html_(self): return 'hi!' f = get_ipython().display_formatter html_f = f.formatters['text/html'] save_enabled = html_f.enabled html_f.enabled = True obj = HasReprMime() d, md = f.format(obj) html_f.enabled = save_enabled assert sorted(d) == [ "application/json+test.v2", "image/png", "plain/text", "text/html", "text/plain", ] assert md == {} d, md = f.format(obj, include={"image/png"}) assert list(d.keys()) == [ "image/png" ], "Include should filter out even things from repr_mimebundle" assert d["image/png"] == "i-overwrite", "_repr_mimebundle_ take precedence" def test_pass_correct_include_exclude(): class Tester(object): def __init__(self, include=None, exclude=None): self.include = include self.exclude = exclude def _repr_mimebundle_(self, include, exclude, **kwargs): if include and (include != self.include): raise ValueError('include got modified: display() may be broken.') if exclude and (exclude != self.exclude): raise ValueError('exclude got modified: display() may be broken.') return None include = {'a', 'b', 'c'} exclude = {'c', 'e' , 'f'} f = get_ipython().display_formatter f.format(Tester(include=include, exclude=exclude), include=include, exclude=exclude) f.format(Tester(exclude=exclude), exclude=exclude) f.format(Tester(include=include), include=include) def test_repr_mime_meta(): class HasReprMimeMeta(object): def _repr_mimebundle_(self, include=None, exclude=None): data = { 'image/png': 'base64-image-data', } metadata = { 'image/png': { 'width': 5, 'height': 10, } } return (data, metadata) f = get_ipython().display_formatter obj = HasReprMimeMeta() d, md = f.format(obj) assert sorted(d) == ["image/png", "text/plain"] assert md == { "image/png": { "width": 5, "height": 10, } } def test_repr_mime_failure(): class BadReprMime(object): def _repr_mimebundle_(self, include=None, exclude=None): raise RuntimeError f = get_ipython().display_formatter obj = BadReprMime() d, md = f.format(obj) assert "text/plain" in d def test_custom_repr_namedtuple_partialmethod(): from functools import partialmethod from typing import NamedTuple class Foo(NamedTuple): ... Foo.__repr__ = partialmethod(lambda obj: "Hello World") foo = Foo() f = PlainTextFormatter() assert f.pprint assert f(foo) == "Hello World" ipython-8.35.0/IPython/core/tests/test_guarded_eval.py000066400000000000000000000510331477474304100230350ustar00rootroot00000000000000import sys from contextlib import contextmanager from typing import ( Annotated, AnyStr, NamedTuple, Literal, NewType, Optional, Protocol, TypeGuard, Union, TypedDict, ) from functools import partial from IPython.core.guarded_eval import ( EvaluationContext, GuardRejection, guarded_eval, _unbind_method, ) from IPython.testing import decorators as dec import pytest if sys.version_info < (3, 11): from typing_extensions import Self, LiteralString else: from typing import Self, LiteralString if sys.version_info < (3, 12): from typing_extensions import TypeAliasType else: from typing import TypeAliasType def create_context(evaluation: str, **kwargs): return EvaluationContext(locals=kwargs, globals={}, evaluation=evaluation) forbidden = partial(create_context, "forbidden") minimal = partial(create_context, "minimal") limited = partial(create_context, "limited") unsafe = partial(create_context, "unsafe") dangerous = partial(create_context, "dangerous") LIMITED_OR_HIGHER = [limited, unsafe, dangerous] MINIMAL_OR_HIGHER = [minimal, *LIMITED_OR_HIGHER] @contextmanager def module_not_installed(module: str): import sys try: to_restore = sys.modules[module] del sys.modules[module] except KeyError: to_restore = None try: yield finally: sys.modules[module] = to_restore def test_external_not_installed(): """ Because attribute check requires checking if object is not of allowed external type, this tests logic for absence of external module. """ class Custom: def __init__(self): self.test = 1 def __getattr__(self, key): return key with module_not_installed("pandas"): context = limited(x=Custom()) with pytest.raises(GuardRejection): guarded_eval("x.test", context) @dec.skip_without("pandas") def test_external_changed_api(monkeypatch): """Check that the execution rejects if external API changed paths""" import pandas as pd series = pd.Series([1], index=["a"]) with monkeypatch.context() as m: m.delattr(pd, "Series") context = limited(data=series) with pytest.raises(GuardRejection): guarded_eval("data.iloc[0]", context) @dec.skip_without("pandas") def test_pandas_series_iloc(): import pandas as pd series = pd.Series([1], index=["a"]) context = limited(data=series) assert guarded_eval("data.iloc[0]", context) == 1 def test_rejects_custom_properties(): class BadProperty: @property def iloc(self): return [None] series = BadProperty() context = limited(data=series) with pytest.raises(GuardRejection): guarded_eval("data.iloc[0]", context) @dec.skip_without("pandas") def test_accepts_non_overriden_properties(): import pandas as pd class GoodProperty(pd.Series): pass series = GoodProperty([1], index=["a"]) context = limited(data=series) assert guarded_eval("data.iloc[0]", context) == 1 @dec.skip_without("pandas") def test_pandas_series(): import pandas as pd context = limited(data=pd.Series([1], index=["a"])) assert guarded_eval('data["a"]', context) == 1 with pytest.raises(KeyError): guarded_eval('data["c"]', context) @dec.skip_without("pandas") def test_pandas_bad_series(): import pandas as pd class BadItemSeries(pd.Series): def __getitem__(self, key): return "CUSTOM_ITEM" class BadAttrSeries(pd.Series): def __getattr__(self, key): return "CUSTOM_ATTR" bad_series = BadItemSeries([1], index=["a"]) context = limited(data=bad_series) with pytest.raises(GuardRejection): guarded_eval('data["a"]', context) with pytest.raises(GuardRejection): guarded_eval('data["c"]', context) # note: here result is a bit unexpected because # pandas `__getattr__` calls `__getitem__`; # FIXME - special case to handle it? assert guarded_eval("data.a", context) == "CUSTOM_ITEM" context = unsafe(data=bad_series) assert guarded_eval('data["a"]', context) == "CUSTOM_ITEM" bad_attr_series = BadAttrSeries([1], index=["a"]) context = limited(data=bad_attr_series) assert guarded_eval('data["a"]', context) == 1 with pytest.raises(GuardRejection): guarded_eval("data.a", context) @dec.skip_without("pandas") def test_pandas_dataframe_loc(): import pandas as pd from pandas.testing import assert_series_equal data = pd.DataFrame([{"a": 1}]) context = limited(data=data) assert_series_equal(guarded_eval('data.loc[:, "a"]', context), data["a"]) def test_named_tuple(): class GoodNamedTuple(NamedTuple): a: str pass class BadNamedTuple(NamedTuple): a: str def __getitem__(self, key): return None good = GoodNamedTuple(a="x") bad = BadNamedTuple(a="x") context = limited(data=good) assert guarded_eval("data[0]", context) == "x" context = limited(data=bad) with pytest.raises(GuardRejection): guarded_eval("data[0]", context) def test_dict(): context = limited(data={"a": 1, "b": {"x": 2}, ("x", "y"): 3}) assert guarded_eval('data["a"]', context) == 1 assert guarded_eval('data["b"]', context) == {"x": 2} assert guarded_eval('data["b"]["x"]', context) == 2 assert guarded_eval('data["x", "y"]', context) == 3 assert guarded_eval("data.keys", context) def test_set(): context = limited(data={"a", "b"}) assert guarded_eval("data.difference", context) def test_list(): context = limited(data=[1, 2, 3]) assert guarded_eval("data[1]", context) == 2 assert guarded_eval("data.copy", context) def test_dict_literal(): context = limited() assert guarded_eval("{}", context) == {} assert guarded_eval('{"a": 1}', context) == {"a": 1} def test_list_literal(): context = limited() assert guarded_eval("[]", context) == [] assert guarded_eval('[1, "a"]', context) == [1, "a"] def test_set_literal(): context = limited() assert guarded_eval("set()", context) == set() assert guarded_eval('{"a"}', context) == {"a"} def test_evaluates_if_expression(): context = limited() assert guarded_eval("2 if True else 3", context) == 2 assert guarded_eval("4 if False else 5", context) == 5 def test_object(): obj = object() context = limited(obj=obj) assert guarded_eval("obj.__dir__", context) == obj.__dir__ @pytest.mark.parametrize( "code,expected", [ ["int.numerator", int.numerator], ["float.is_integer", float.is_integer], ["complex.real", complex.real], ], ) def test_number_attributes(code, expected): assert guarded_eval(code, limited()) == expected def test_method_descriptor(): context = limited() assert guarded_eval("list.copy.__name__", context) == "copy" class HeapType: pass class CallCreatesHeapType: def __call__(self) -> HeapType: return HeapType() class CallCreatesBuiltin: def __call__(self) -> frozenset: return frozenset() class HasStaticMethod: @staticmethod def static_method() -> HeapType: return HeapType() class InitReturnsFrozenset: def __new__(self) -> frozenset: # type:ignore[misc] return frozenset() class StringAnnotation: def heap(self) -> "HeapType": return HeapType() def copy(self) -> "StringAnnotation": return StringAnnotation() CustomIntType = NewType("CustomIntType", int) CustomHeapType = NewType("CustomHeapType", HeapType) IntTypeAlias = TypeAliasType("IntTypeAlias", int) HeapTypeAlias = TypeAliasType("HeapTypeAlias", HeapType) class TestProtocol(Protocol): def test_method(self) -> bool: pass class TestProtocolImplementer(TestProtocol): def test_method(self) -> bool: return True class Movie(TypedDict): name: str year: int class SpecialTyping: def custom_int_type(self) -> CustomIntType: return CustomIntType(1) def custom_heap_type(self) -> CustomHeapType: return CustomHeapType(HeapType()) # TODO: remove type:ignore comment once mypy # supports explicit calls to `TypeAliasType`, see: # https://github.com/python/mypy/issues/16614 def int_type_alias(self) -> IntTypeAlias: # type:ignore[valid-type] return 1 def heap_type_alias(self) -> HeapTypeAlias: # type:ignore[valid-type] return 1 def literal(self) -> Literal[False]: return False def literal_string(self) -> LiteralString: return "test" def self(self) -> Self: return self def any_str(self, x: AnyStr) -> AnyStr: return x def annotated(self) -> Annotated[float, "positive number"]: return 1 def annotated_self(self) -> Annotated[Self, "self with metadata"]: self._metadata = "test" return self def int_type_guard(self, x) -> TypeGuard[int]: return isinstance(x, int) def optional_float(self) -> Optional[float]: return 1.0 def union_str_and_int(self) -> Union[str, int]: return "" def protocol(self) -> TestProtocol: return TestProtocolImplementer() def typed_dict(self) -> Movie: return {"name": "The Matrix", "year": 1999} @pytest.mark.parametrize( "data,code,expected,equality", [ [[1, 2, 3], "data.index(2)", 1, True], [{"a": 1}, "data.keys().isdisjoint({})", True, True], [StringAnnotation(), "data.heap()", HeapType, False], [StringAnnotation(), "data.copy()", StringAnnotation, False], # test cases for `__call__` [CallCreatesHeapType(), "data()", HeapType, False], [CallCreatesBuiltin(), "data()", frozenset, False], # Test cases for `__init__` [HeapType, "data()", HeapType, False], [InitReturnsFrozenset, "data()", frozenset, False], [HeapType(), "data.__class__()", HeapType, False], # supported special cases for typing [SpecialTyping(), "data.custom_int_type()", int, False], [SpecialTyping(), "data.custom_heap_type()", HeapType, False], [SpecialTyping(), "data.int_type_alias()", int, False], [SpecialTyping(), "data.heap_type_alias()", HeapType, False], [SpecialTyping(), "data.self()", SpecialTyping, False], [SpecialTyping(), "data.literal()", False, True], [SpecialTyping(), "data.literal_string()", str, False], [SpecialTyping(), "data.any_str('a')", str, False], [SpecialTyping(), "data.any_str(b'a')", bytes, False], [SpecialTyping(), "data.annotated()", float, False], [SpecialTyping(), "data.annotated_self()", SpecialTyping, False], [SpecialTyping(), "data.int_type_guard()", int, False], # test cases for static methods [HasStaticMethod, "data.static_method()", HeapType, False], ], ) def test_evaluates_calls(data, code, expected, equality): context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) value = guarded_eval(code, context) if equality: assert value == expected else: assert isinstance(value, expected) @pytest.mark.parametrize( "data,code,expected_attributes", [ [SpecialTyping(), "data.optional_float()", ["is_integer"]], [ SpecialTyping(), "data.union_str_and_int()", ["capitalize", "as_integer_ratio"], ], [SpecialTyping(), "data.protocol()", ["test_method"]], [SpecialTyping(), "data.typed_dict()", ["keys", "values", "items"]], ], ) def test_mocks_attributes_of_call_results(data, code, expected_attributes): context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) result = guarded_eval(code, context) for attr in expected_attributes: assert hasattr(result, attr) assert attr in dir(result) @pytest.mark.parametrize( "data,code,expected_items", [ [SpecialTyping(), "data.typed_dict()", {"year": int, "name": str}], ], ) def test_mocks_items_of_call_results(data, code, expected_items): context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) result = guarded_eval(code, context) ipython_keys = result._ipython_key_completions_() for key, value in expected_items.items(): assert isinstance(result[key], value) assert key in ipython_keys @pytest.mark.parametrize( "data,bad", [ [[1, 2, 3], "data.append(4)"], [{"a": 1}, "data.update()"], ], ) def test_rejects_calls_with_side_effects(data, bad): context = limited(data=data) with pytest.raises(GuardRejection): guarded_eval(bad, context) @pytest.mark.parametrize( "code,expected", [ ["(1\n+\n1)", 2], ["list(range(10))[-1:]", [9]], ["list(range(20))[3:-2:3]", [3, 6, 9, 12, 15]], ], ) @pytest.mark.parametrize("context", LIMITED_OR_HIGHER) def test_evaluates_complex_cases(code, expected, context): assert guarded_eval(code, context()) == expected @pytest.mark.parametrize( "code,expected", [ ["1", 1], ["1.0", 1.0], ["0xdeedbeef", 0xDEEDBEEF], ["True", True], ["None", None], ["{}", {}], ["[]", []], ], ) @pytest.mark.parametrize("context", MINIMAL_OR_HIGHER) def test_evaluates_literals(code, expected, context): assert guarded_eval(code, context()) == expected @pytest.mark.parametrize( "code,expected", [ ["-5", -5], ["+5", +5], ["~5", -6], ], ) @pytest.mark.parametrize("context", LIMITED_OR_HIGHER) def test_evaluates_unary_operations(code, expected, context): assert guarded_eval(code, context()) == expected @pytest.mark.parametrize( "code,expected", [ ["1 + 1", 2], ["3 - 1", 2], ["2 * 3", 6], ["5 // 2", 2], ["5 / 2", 2.5], ["5**2", 25], ["2 >> 1", 1], ["2 << 1", 4], ["1 | 2", 3], ["1 & 1", 1], ["1 & 2", 0], ], ) @pytest.mark.parametrize("context", LIMITED_OR_HIGHER) def test_evaluates_binary_operations(code, expected, context): assert guarded_eval(code, context()) == expected @pytest.mark.parametrize( "code,expected", [ ["2 > 1", True], ["2 < 1", False], ["2 <= 1", False], ["2 <= 2", True], ["1 >= 2", False], ["2 >= 2", True], ["2 == 2", True], ["1 == 2", False], ["1 != 2", True], ["1 != 1", False], ["1 < 4 < 3", False], ["(1 < 4) < 3", True], ["4 > 3 > 2 > 1", True], ["4 > 3 > 2 > 9", False], ["1 < 2 < 3 < 4", True], ["9 < 2 < 3 < 4", False], ["1 < 2 > 1 > 0 > -1 < 1", True], ["1 in [1] in [[1]]", True], ["1 in [1] in [[2]]", False], ["1 in [1]", True], ["0 in [1]", False], ["1 not in [1]", False], ["0 not in [1]", True], ["True is True", True], ["False is False", True], ["True is False", False], ["True is not True", False], ["False is not True", True], ], ) @pytest.mark.parametrize("context", LIMITED_OR_HIGHER) def test_evaluates_comparisons(code, expected, context): assert guarded_eval(code, context()) == expected def test_guards_comparisons(): class GoodEq(int): pass class BadEq(int): def __eq__(self, other): assert False context = limited(bad=BadEq(1), good=GoodEq(1)) with pytest.raises(GuardRejection): guarded_eval("bad == 1", context) with pytest.raises(GuardRejection): guarded_eval("bad != 1", context) with pytest.raises(GuardRejection): guarded_eval("1 == bad", context) with pytest.raises(GuardRejection): guarded_eval("1 != bad", context) assert guarded_eval("good == 1", context) is True assert guarded_eval("good != 1", context) is False assert guarded_eval("1 == good", context) is True assert guarded_eval("1 != good", context) is False def test_guards_unary_operations(): class GoodOp(int): pass class BadOpInv(int): def __inv__(self, other): assert False class BadOpInverse(int): def __inv__(self, other): assert False context = limited(good=GoodOp(1), bad1=BadOpInv(1), bad2=BadOpInverse(1)) with pytest.raises(GuardRejection): guarded_eval("~bad1", context) with pytest.raises(GuardRejection): guarded_eval("~bad2", context) def test_guards_binary_operations(): class GoodOp(int): pass class BadOp(int): def __add__(self, other): assert False context = limited(good=GoodOp(1), bad=BadOp(1)) with pytest.raises(GuardRejection): guarded_eval("1 + bad", context) with pytest.raises(GuardRejection): guarded_eval("bad + 1", context) assert guarded_eval("good + 1", context) == 2 assert guarded_eval("1 + good", context) == 2 def test_guards_attributes(): class GoodAttr(float): pass class BadAttr1(float): def __getattr__(self, key): assert False class BadAttr2(float): def __getattribute__(self, key): assert False context = limited(good=GoodAttr(0.5), bad1=BadAttr1(0.5), bad2=BadAttr2(0.5)) with pytest.raises(GuardRejection): guarded_eval("bad1.as_integer_ratio", context) with pytest.raises(GuardRejection): guarded_eval("bad2.as_integer_ratio", context) assert guarded_eval("good.as_integer_ratio()", context) == (1, 2) @pytest.mark.parametrize("context", MINIMAL_OR_HIGHER) def test_access_builtins(context): assert guarded_eval("round", context()) == round def test_access_builtins_fails(): context = limited() with pytest.raises(NameError): guarded_eval("this_is_not_builtin", context) def test_rejects_forbidden(): context = forbidden() with pytest.raises(GuardRejection): guarded_eval("1", context) def test_guards_locals_and_globals(): context = EvaluationContext( locals={"local_a": "a"}, globals={"global_b": "b"}, evaluation="minimal" ) with pytest.raises(GuardRejection): guarded_eval("local_a", context) with pytest.raises(GuardRejection): guarded_eval("global_b", context) def test_access_locals_and_globals(): context = EvaluationContext( locals={"local_a": "a"}, globals={"global_b": "b"}, evaluation="limited" ) assert guarded_eval("local_a", context) == "a" assert guarded_eval("global_b", context) == "b" @pytest.mark.parametrize( "code", ["def func(): pass", "class C: pass", "x = 1", "x += 1", "del x", "import ast"], ) @pytest.mark.parametrize("context", [minimal(), limited(), unsafe()]) def test_rejects_side_effect_syntax(code, context): with pytest.raises(SyntaxError): guarded_eval(code, context) def test_subscript(): context = EvaluationContext( locals={}, globals={}, evaluation="limited", in_subscript=True ) empty_slice = slice(None, None, None) assert guarded_eval("", context) == tuple() assert guarded_eval(":", context) == empty_slice assert guarded_eval("1:2:3", context) == slice(1, 2, 3) assert guarded_eval(':, "a"', context) == (empty_slice, "a") def test_unbind_method(): class X(list): def index(self, k): return "CUSTOM" x = X() assert _unbind_method(x.index) is X.index assert _unbind_method([].index) is list.index assert _unbind_method(list.index) is None def test_assumption_instance_attr_do_not_matter(): """This is semi-specified in Python documentation. However, since the specification says 'not guaranteed to work' rather than 'is forbidden to work', future versions could invalidate this assumptions. This test is meant to catch such a change if it ever comes true. """ class T: def __getitem__(self, k): return "a" def __getattr__(self, k): return "a" def f(self): return "b" t = T() t.__getitem__ = f t.__getattr__ = f assert t[1] == "a" assert t[1] == "a" def test_assumption_named_tuples_share_getitem(): """Check assumption on named tuples sharing __getitem__""" from typing import NamedTuple class A(NamedTuple): pass class B(NamedTuple): pass assert A.__getitem__ == B.__getitem__ @dec.skip_without("numpy") def test_module_access(): import numpy context = limited(numpy=numpy) assert guarded_eval("numpy.linalg.norm", context) == numpy.linalg.norm context = minimal(numpy=numpy) with pytest.raises(GuardRejection): guarded_eval("np.linalg.norm", context) ipython-8.35.0/IPython/core/tests/test_handlers.py000066400000000000000000000055631477474304100222220ustar00rootroot00000000000000"""Tests for input handlers. """ #----------------------------------------------------------------------------- # Module imports #----------------------------------------------------------------------------- # our own packages from IPython.core import autocall from IPython.testing import tools as tt import pytest from collections.abc import Callable #----------------------------------------------------------------------------- # Globals #----------------------------------------------------------------------------- # Test functions #----------------------------------------------------------------------------- class CallableIndexable(object): def __getitem__(self, idx): return True def __call__(self, *args, **kws): return True class Autocallable(autocall.IPyAutocall): def __call__(self): return "called" @pytest.mark.parametrize( "autocall, input, output", [ # For many of the below, we're also checking that leading whitespace # turns off the esc char, which it should unless there is a continuation # line. ("1", '"no change"', '"no change"'), # normal ("1", "lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), # magic # Only explicit escapes or instances of IPyAutocallable should get # expanded ("0", 'len "abc"', 'len "abc"'), ("0", "autocallable", "autocallable()"), # Don't add extra brackets (gh-1117) ("0", "autocallable()", "autocallable()"), ("1", 'len "abc"', 'len("abc")'), ("1", 'len "abc";', 'len("abc");'), # ; is special -- moves out of parens # Autocall is turned off if first arg is [] and the object # is both callable and indexable. Like so: ("1", "len [1,2]", "len([1,2])"), # len doesn't support __getitem__... ("1", "call_idx [1]", "call_idx [1]"), # call_idx *does*.. ("1", "call_idx 1", "call_idx(1)"), ("1", "len", "len"), # only at 2 does it auto-call on single args ("2", 'len "abc"', 'len("abc")'), ("2", 'len "abc";', 'len("abc");'), ("2", "len [1,2]", "len([1,2])"), ("2", "call_idx [1]", "call_idx [1]"), ("2", "call_idx 1", "call_idx(1)"), # T his is what's different: ("2", "len", "len()"), # only at 2 does it auto-call on single args ("0", "Callable[[int], None]", "Callable[[int], None]"), ("1", "Callable[[int], None]", "Callable[[int], None]"), ("1", "Callable[[int], None]", "Callable[[int], None]"), ], ) def test_handlers_I(autocall, input, output): autocallable = Autocallable() ip.user_ns["autocallable"] = autocallable call_idx = CallableIndexable() ip.user_ns["call_idx"] = call_idx ip.user_ns["Callable"] = Callable ip.run_line_magic("autocall", autocall) assert ip.prefilter_manager.prefilter_lines(input) == output ip.run_line_magic("autocall", "1") ipython-8.35.0/IPython/core/tests/test_history.py000066400000000000000000000266621477474304100221260ustar00rootroot00000000000000# coding: utf-8 """Tests for the IPython tab-completion machinery. """ #----------------------------------------------------------------------------- # Module imports #----------------------------------------------------------------------------- # stdlib import io import sys import tempfile from datetime import datetime from pathlib import Path from tempfile import TemporaryDirectory # our own packages from traitlets.config.loader import Config from IPython.core.history import HistoryAccessor, HistoryManager, extract_hist_ranges def test_proper_default_encoding(): assert sys.getdefaultencoding() == "utf-8" def test_history(): ip = get_ipython() with TemporaryDirectory() as tmpdir: tmp_path = Path(tmpdir) hist_manager_ori = ip.history_manager hist_file = tmp_path / "history.sqlite" try: ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file) hist = ["a=1", "def f():\n test = 1\n return test", "b='€Æ¾÷ß'"] for i, h in enumerate(hist, start=1): ip.history_manager.store_inputs(i, h) ip.history_manager.db_log_output = True # Doesn't match the input, but we'll just check it's stored. ip.history_manager.output_hist_reprs[3] = "spam" ip.history_manager.store_output(3) assert ip.history_manager.input_hist_raw == [""] + hist # Detailed tests for _get_range_session grs = ip.history_manager._get_range_session assert list(grs(start=2, stop=-1)) == list(zip([0], [2], hist[1:-1])) assert list(grs(start=-2)) == list(zip([0, 0], [2, 3], hist[-2:])) assert list(grs(output=True)) == list( zip([0, 0, 0], [1, 2, 3], zip(hist, [None, None, "spam"])) ) # Check whether specifying a range beyond the end of the current # session results in an error (gh-804) ip.run_line_magic("hist", "2-500") # Check that we can write non-ascii characters to a file ip.run_line_magic("hist", "-f %s" % (tmp_path / "test1")) ip.run_line_magic("hist", "-pf %s" % (tmp_path / "test2")) ip.run_line_magic("hist", "-nf %s" % (tmp_path / "test3")) ip.run_line_magic("save", "%s 1-10" % (tmp_path / "test4")) # New session ip.history_manager.reset() newcmds = ["z=5", "class X(object):\n pass", "k='p'", "z=5"] for i, cmd in enumerate(newcmds, start=1): ip.history_manager.store_inputs(i, cmd) gothist = ip.history_manager.get_range(start=1, stop=4) assert list(gothist) == list(zip([0, 0, 0], [1, 2, 3], newcmds)) # Previous session: gothist = ip.history_manager.get_range(-1, 1, 4) assert list(gothist) == list(zip([1, 1, 1], [1, 2, 3], hist)) newhist = [(2, i, c) for (i, c) in enumerate(newcmds, 1)] # Check get_hist_tail gothist = ip.history_manager.get_tail(5, output=True, include_latest=True) expected = [(1, 3, (hist[-1], "spam"))] \ + [(s, n, (c, None)) for (s, n, c) in newhist] assert list(gothist) == expected gothist = ip.history_manager.get_tail(2) expected = newhist[-3:-1] assert list(gothist) == expected # Check get_hist_search gothist = ip.history_manager.search("*test*") assert list(gothist) == [(1, 2, hist[1])] gothist = ip.history_manager.search("*=*") assert list(gothist) == [ (1, 1, hist[0]), (1, 2, hist[1]), (1, 3, hist[2]), newhist[0], newhist[2], newhist[3], ] gothist = ip.history_manager.search("*=*", n=4) assert list(gothist) == [ (1, 3, hist[2]), newhist[0], newhist[2], newhist[3], ] gothist = ip.history_manager.search("*=*", unique=True) assert list(gothist) == [ (1, 1, hist[0]), (1, 2, hist[1]), (1, 3, hist[2]), newhist[2], newhist[3], ] gothist = ip.history_manager.search("*=*", unique=True, n=3) assert list(gothist) == [(1, 3, hist[2]), newhist[2], newhist[3]] gothist = ip.history_manager.search("b*", output=True) assert list(gothist) == [(1, 3, (hist[2], "spam"))] # Cross testing: check that magic %save can get previous session. testfilename = (tmp_path / "test.py").resolve() ip.run_line_magic("save", str(testfilename) + " ~1/1-3") with io.open(testfilename, encoding="utf-8") as testfile: assert testfile.read() == "# coding: utf-8\n" + "\n".join(hist) + "\n" # Duplicate line numbers - check that it doesn't crash, and # gets a new session ip.history_manager.store_inputs(1, "rogue") ip.history_manager.writeout_cache() assert ip.history_manager.session_number == 3 # Check that session and line values are not just max values sessid, lineno, entry = newhist[-1] assert lineno > 1 ip.history_manager.reset() lineno = 1 ip.history_manager.store_inputs(lineno, entry) gothist = ip.history_manager.search("*=*", unique=True) hist = list(gothist)[-1] assert sessid < hist[0] assert hist[1:] == (lineno, entry) finally: # Ensure saving thread is shut down before we try to clean up the files ip.history_manager.save_thread.stop() # Forcibly close database rather than relying on garbage collection ip.history_manager.db.close() # Restore history manager ip.history_manager = hist_manager_ori def test_extract_hist_ranges(): instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5 ~10/" expected = [(0, 1, 2), # 0 == current session (2, 3, 4), (-4, 5, 7), (-4, 7, 10), (-9, 2, None), # None == to end (-8, 1, None), (-7, 1, 6), (-10, 1, None)] actual = list(extract_hist_ranges(instr)) assert actual == expected def test_extract_hist_ranges_empty_str(): instr = "" expected = [(0, 1, None)] # 0 == current session, None == to end actual = list(extract_hist_ranges(instr)) assert actual == expected def test_magic_rerun(): """Simple test for %rerun (no args -> rerun last line)""" ip = get_ipython() ip.run_cell("a = 10", store_history=True) ip.run_cell("a += 1", store_history=True) assert ip.user_ns["a"] == 11 ip.run_cell("%rerun", store_history=True) assert ip.user_ns["a"] == 12 def test_timestamp_type(): ip = get_ipython() info = ip.history_manager.get_session_info() assert isinstance(info[1], datetime) def test_hist_file_config(): cfg = Config() tfile = tempfile.NamedTemporaryFile(delete=False) cfg.HistoryManager.hist_file = Path(tfile.name) try: hm = HistoryManager(shell=get_ipython(), config=cfg) assert hm.hist_file == cfg.HistoryManager.hist_file finally: try: Path(tfile.name).unlink() except OSError: # same catch as in testing.tools.TempFileMixin # On Windows, even though we close the file, we still can't # delete it. I have no clue why pass def test_histmanager_disabled(): """Ensure that disabling the history manager doesn't create a database.""" cfg = Config() cfg.HistoryAccessor.enabled = False ip = get_ipython() with TemporaryDirectory() as tmpdir: hist_manager_ori = ip.history_manager hist_file = Path(tmpdir) / "history.sqlite" cfg.HistoryManager.hist_file = hist_file try: ip.history_manager = HistoryManager(shell=ip, config=cfg) hist = ["a=1", "def f():\n test = 1\n return test", "b='€Æ¾÷ß'"] for i, h in enumerate(hist, start=1): ip.history_manager.store_inputs(i, h) assert ip.history_manager.input_hist_raw == [""] + hist ip.history_manager.reset() ip.history_manager.end_session() finally: ip.history_manager = hist_manager_ori # hist_file should not be created assert hist_file.exists() is False def test_get_tail_session_awareness(): """Test .get_tail() is: - session specific in HistoryManager - session agnostic in HistoryAccessor same for .get_last_session_id() """ ip = get_ipython() with TemporaryDirectory() as tmpdir: tmp_path = Path(tmpdir) hist_file = tmp_path / "history.sqlite" get_source = lambda x: x[2] hm1 = None hm2 = None ha = None try: # hm1 creates a new session and adds history entries, # ha catches up hm1 = HistoryManager(shell=ip, hist_file=hist_file) hm1_last_sid = hm1.get_last_session_id ha = HistoryAccessor(hist_file=hist_file) ha_last_sid = ha.get_last_session_id hist1 = ["a=1", "b=1", "c=1"] for i, h in enumerate(hist1 + [""], start=1): hm1.store_inputs(i, h) assert list(map(get_source, hm1.get_tail())) == hist1 assert list(map(get_source, ha.get_tail())) == hist1 sid1 = hm1_last_sid() assert sid1 is not None assert ha_last_sid() == sid1 # hm2 creates a new session and adds entries, # ha catches up hm2 = HistoryManager(shell=ip, hist_file=hist_file) hm2_last_sid = hm2.get_last_session_id hist2 = ["a=2", "b=2", "c=2"] for i, h in enumerate(hist2 + [""], start=1): hm2.store_inputs(i, h) tail = hm2.get_tail(n=3) assert list(map(get_source, tail)) == hist2 tail = ha.get_tail(n=3) assert list(map(get_source, tail)) == hist2 sid2 = hm2_last_sid() assert sid2 is not None assert ha_last_sid() == sid2 assert sid2 != sid1 # but hm1 still maintains its point of reference # and adding more entries to it doesn't change others # immediate perspective assert hm1_last_sid() == sid1 tail = hm1.get_tail(n=3) assert list(map(get_source, tail)) == hist1 hist3 = ["a=3", "b=3", "c=3"] for i, h in enumerate(hist3 + [""], start=5): hm1.store_inputs(i, h) tail = hm1.get_tail(n=7) assert list(map(get_source, tail)) == hist1 + [""] + hist3 tail = hm2.get_tail(n=3) assert list(map(get_source, tail)) == hist2 tail = ha.get_tail(n=3) assert list(map(get_source, tail)) == hist2 assert hm1_last_sid() == sid1 assert hm2_last_sid() == sid2 assert ha_last_sid() == sid2 finally: if hm1: hm1.save_thread.stop() hm1.db.close() if hm2: hm2.save_thread.stop() hm2.db.close() if ha: ha.db.close() ipython-8.35.0/IPython/core/tests/test_hooks.py000066400000000000000000000044141477474304100215370ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Tests for CommandChainDispatcher.""" #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import pytest from IPython.core.error import TryNext from IPython.core.hooks import CommandChainDispatcher #----------------------------------------------------------------------------- # Local utilities #----------------------------------------------------------------------------- # Define two classes, one which succeeds and one which raises TryNext. Each # sets the attribute `called` to True when it is called. class Okay(object): def __init__(self, message): self.message = message self.called = False def __call__(self): self.called = True return self.message class Fail(object): def __init__(self, message): self.message = message self.called = False def __call__(self): self.called = True raise TryNext(self.message) #----------------------------------------------------------------------------- # Test functions #----------------------------------------------------------------------------- def test_command_chain_dispatcher_ff(): """Test two failing hooks""" fail1 = Fail("fail1") fail2 = Fail("fail2") dp = CommandChainDispatcher([(0, fail1), (10, fail2)]) with pytest.raises(TryNext) as e: dp() assert str(e.value) == "fail2" assert fail1.called is True assert fail2.called is True def test_command_chain_dispatcher_fofo(): """Test a mixture of failing and succeeding hooks.""" fail1 = Fail("fail1") fail2 = Fail("fail2") okay1 = Okay("okay1") okay2 = Okay("okay2") dp = CommandChainDispatcher([(0, fail1), # (5, okay1), # add this later (10, fail2), (15, okay2)]) dp.add(okay1, 5) assert dp() == "okay1" assert fail1.called is True assert okay1.called is True assert fail2.called is False assert okay2.called is False def test_command_chain_dispatcher_eq_priority(): okay1 = Okay(u'okay1') okay2 = Okay(u'okay2') dp = CommandChainDispatcher([(1, okay1)]) dp.add(okay2, 1) ipython-8.35.0/IPython/core/tests/test_imports.py000066400000000000000000000022011477474304100221010ustar00rootroot00000000000000# encoding: utf-8 def test_import_completer(): from IPython.core import completer def test_import_crashhandler(): from IPython.core import crashhandler def test_import_debugger(): from IPython.core import debugger def test_import_excolors(): from IPython.core import excolors def test_import_history(): from IPython.core import history def test_import_hooks(): from IPython.core import hooks def test_import_getipython(): from IPython.core import getipython def test_import_interactiveshell(): from IPython.core import interactiveshell def test_import_logger(): from IPython.core import logger def test_import_macro(): from IPython.core import macro def test_import_magic(): from IPython.core import magic def test_import_oinspect(): from IPython.core import oinspect def test_import_prefilter(): from IPython.core import prefilter def test_import_prompts(): from IPython.core import prompts def test_import_release(): from IPython.core import release def test_import_ultratb(): from IPython.core import ultratb def test_import_usage(): from IPython.core import usage ipython-8.35.0/IPython/core/tests/test_inputsplitter.py000066400000000000000000000552301477474304100233440ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Tests for the inputsplitter module.""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import unittest import pytest import sys with pytest.warns(DeprecationWarning, match="inputsplitter"): from IPython.core import inputsplitter as isp from IPython.core.inputtransformer import InputTransformer from IPython.core.tests.test_inputtransformer import syntax, syntax_ml from IPython.testing import tools as tt #----------------------------------------------------------------------------- # Semi-complete examples (also used as tests) #----------------------------------------------------------------------------- # Note: at the bottom, there's a slightly more complete version of this that # can be useful during development of code here. def mini_interactive_loop(input_func): """Minimal example of the logic of an interactive interpreter loop. This serves as an example, and it is used by the test system with a fake raw_input that simulates interactive input.""" from IPython.core.inputsplitter import InputSplitter isp = InputSplitter() # In practice, this input loop would be wrapped in an outside loop to read # input indefinitely, until some exit/quit command was issued. Here we # only illustrate the basic inner loop. while isp.push_accepts_more(): indent = ' '*isp.get_indent_spaces() prompt = '>>> ' + indent line = indent + input_func(prompt) isp.push(line) # Here we just return input so we can use it in a test suite, but a real # interpreter would instead send it for execution somewhere. src = isp.source_reset() # print('Input source was:\n', src) # dbg return src #----------------------------------------------------------------------------- # Test utilities, just for local use #----------------------------------------------------------------------------- def pseudo_input(lines): """Return a function that acts like raw_input but feeds the input list.""" ilines = iter(lines) def raw_in(prompt): try: return next(ilines) except StopIteration: return '' return raw_in #----------------------------------------------------------------------------- # Tests #----------------------------------------------------------------------------- def test_spaces(): tests = [('', 0), (' ', 1), ('\n', 0), (' \n', 1), ('x', 0), (' x', 1), (' x',2), (' x',4), # Note: tabs are counted as a single whitespace! ('\tx', 1), ('\t x', 2), ] with pytest.warns(PendingDeprecationWarning): tt.check_pairs(isp.num_ini_spaces, tests) def test_remove_comments(): tests = [('text', 'text'), ('text # comment', 'text '), ('text # comment\n', 'text \n'), ('text # comment \n', 'text \n'), ('line # c \nline\n','line \nline\n'), ('line # c \nline#c2 \nline\nline #c\n\n', 'line \nline\nline\nline \n\n'), ] tt.check_pairs(isp.remove_comments, tests) def test_get_input_encoding(): encoding = isp.get_input_encoding() assert isinstance(encoding, str) # simple-minded check that at least encoding a simple string works with the # encoding we got. assert "test".encode(encoding) == b"test" class NoInputEncodingTestCase(unittest.TestCase): def setUp(self): self.old_stdin = sys.stdin class X: pass fake_stdin = X() sys.stdin = fake_stdin def test(self): # Verify that if sys.stdin has no 'encoding' attribute we do the right # thing enc = isp.get_input_encoding() self.assertEqual(enc, 'ascii') def tearDown(self): sys.stdin = self.old_stdin class InputSplitterTestCase(unittest.TestCase): def setUp(self): self.isp = isp.InputSplitter() def test_reset(self): isp = self.isp isp.push('x=1') isp.reset() self.assertEqual(isp._buffer, []) self.assertEqual(isp.get_indent_spaces(), 0) self.assertEqual(isp.source, '') self.assertEqual(isp.code, None) self.assertEqual(isp._is_complete, False) def test_source(self): self.isp._store('1') self.isp._store('2') self.assertEqual(self.isp.source, '1\n2\n') self.assertEqual(len(self.isp._buffer)>0, True) self.assertEqual(self.isp.source_reset(), '1\n2\n') self.assertEqual(self.isp._buffer, []) self.assertEqual(self.isp.source, '') def test_indent(self): isp = self.isp # shorthand isp.push('x=1') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\n x=1') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('y=2\n') self.assertEqual(isp.get_indent_spaces(), 0) def test_indent2(self): isp = self.isp isp.push('if 1:') self.assertEqual(isp.get_indent_spaces(), 4) isp.push(' x=1') self.assertEqual(isp.get_indent_spaces(), 4) # Blank lines shouldn't change the indent level isp.push(' '*2) self.assertEqual(isp.get_indent_spaces(), 4) def test_indent3(self): isp = self.isp # When a multiline statement contains parens or multiline strings, we # shouldn't get confused. isp.push("if 1:") isp.push(" x = (1+\n 2)") self.assertEqual(isp.get_indent_spaces(), 4) def test_indent4(self): isp = self.isp # whitespace after ':' should not screw up indent level isp.push('if 1: \n x=1') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('y=2\n') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\t\n x=1') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('y=2\n') self.assertEqual(isp.get_indent_spaces(), 0) def test_dedent_pass(self): isp = self.isp # shorthand # should NOT cause dedent isp.push('if 1:\n passes = 5') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('if 1:\n pass') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\n pass ') self.assertEqual(isp.get_indent_spaces(), 0) def test_dedent_break(self): isp = self.isp # shorthand # should NOT cause dedent isp.push('while 1:\n breaks = 5') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('while 1:\n break') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('while 1:\n break ') self.assertEqual(isp.get_indent_spaces(), 0) def test_dedent_continue(self): isp = self.isp # shorthand # should NOT cause dedent isp.push('while 1:\n continues = 5') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('while 1:\n continue') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('while 1:\n continue ') self.assertEqual(isp.get_indent_spaces(), 0) def test_dedent_raise(self): isp = self.isp # shorthand # should NOT cause dedent isp.push('if 1:\n raised = 4') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('if 1:\n raise TypeError()') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\n raise') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\n raise ') self.assertEqual(isp.get_indent_spaces(), 0) def test_dedent_return(self): isp = self.isp # shorthand # should NOT cause dedent isp.push('if 1:\n returning = 4') self.assertEqual(isp.get_indent_spaces(), 4) isp.push('if 1:\n return 5 + 493') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\n return') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\n return ') self.assertEqual(isp.get_indent_spaces(), 0) isp.push('if 1:\n return(0)') self.assertEqual(isp.get_indent_spaces(), 0) def test_push(self): isp = self.isp self.assertEqual(isp.push('x=1'), True) def test_push2(self): isp = self.isp self.assertEqual(isp.push('if 1:'), False) for line in [' x=1', '# a comment', ' y=2']: print(line) self.assertEqual(isp.push(line), True) def test_push3(self): isp = self.isp isp.push('if True:') isp.push(' a = 1') self.assertEqual(isp.push('b = [1,'), False) def test_push_accepts_more(self): isp = self.isp isp.push('x=1') self.assertEqual(isp.push_accepts_more(), False) def test_push_accepts_more2(self): isp = self.isp isp.push('if 1:') self.assertEqual(isp.push_accepts_more(), True) isp.push(' x=1') self.assertEqual(isp.push_accepts_more(), True) isp.push('') self.assertEqual(isp.push_accepts_more(), False) def test_push_accepts_more3(self): isp = self.isp isp.push("x = (2+\n3)") self.assertEqual(isp.push_accepts_more(), False) def test_push_accepts_more4(self): isp = self.isp # When a multiline statement contains parens or multiline strings, we # shouldn't get confused. # FIXME: we should be able to better handle de-dents in statements like # multiline strings and multiline expressions (continued with \ or # parens). Right now we aren't handling the indentation tracking quite # correctly with this, though in practice it may not be too much of a # problem. We'll need to see. isp.push("if 1:") isp.push(" x = (2+") isp.push(" 3)") self.assertEqual(isp.push_accepts_more(), True) isp.push(" y = 3") self.assertEqual(isp.push_accepts_more(), True) isp.push('') self.assertEqual(isp.push_accepts_more(), False) def test_push_accepts_more5(self): isp = self.isp isp.push('try:') isp.push(' a = 5') isp.push('except:') isp.push(' raise') # We want to be able to add an else: block at this point, so it should # wait for a blank line. self.assertEqual(isp.push_accepts_more(), True) def test_continuation(self): isp = self.isp isp.push("import os, \\") self.assertEqual(isp.push_accepts_more(), True) isp.push("sys") self.assertEqual(isp.push_accepts_more(), False) def test_syntax_error(self): isp = self.isp # Syntax errors immediately produce a 'ready' block, so the invalid # Python can be sent to the kernel for evaluation with possible ipython # special-syntax conversion. isp.push('run foo') self.assertEqual(isp.push_accepts_more(), False) def test_unicode(self): self.isp.push(u"Pérez") self.isp.push(u'\xc3\xa9') self.isp.push(u"u'\xc3\xa9'") @pytest.mark.xfail( reason="Bug in python 3.9.8 – bpo 45738", condition=sys.version_info in [(3, 11, 0, "alpha", 2)], raises=SystemError, strict=True, ) def test_line_continuation(self): """ Test issue #2108.""" isp = self.isp # A blank line after a line continuation should not accept more isp.push("1 \\\n\n") self.assertEqual(isp.push_accepts_more(), False) # Whitespace after a \ is a SyntaxError. The only way to test that # here is to test that push doesn't accept more (as with # test_syntax_error() above). isp.push(r"1 \ ") self.assertEqual(isp.push_accepts_more(), False) # Even if the line is continuable (c.f. the regular Python # interpreter) isp.push(r"(1 \ ") self.assertEqual(isp.push_accepts_more(), False) def test_check_complete(self): isp = self.isp self.assertEqual(isp.check_complete("a = 1"), ('complete', None)) self.assertEqual(isp.check_complete("for a in range(5):"), ('incomplete', 4)) self.assertEqual(isp.check_complete("raise = 2"), ('invalid', None)) self.assertEqual(isp.check_complete("a = [1,\n2,"), ('incomplete', 0)) self.assertEqual(isp.check_complete("def a():\n x=1\n global x"), ('invalid', None)) class InteractiveLoopTestCase(unittest.TestCase): """Tests for an interactive loop like a python shell. """ def check_ns(self, lines, ns): """Validate that the given input lines produce the resulting namespace. Note: the input lines are given exactly as they would be typed in an auto-indenting environment, as mini_interactive_loop above already does auto-indenting and prepends spaces to the input. """ src = mini_interactive_loop(pseudo_input(lines)) test_ns = {} exec(src, test_ns) # We can't check that the provided ns is identical to the test_ns, # because Python fills test_ns with extra keys (copyright, etc). But # we can check that the given dict is *contained* in test_ns for k,v in ns.items(): self.assertEqual(test_ns[k], v) def test_simple(self): self.check_ns(['x=1'], dict(x=1)) def test_simple2(self): self.check_ns(['if 1:', 'x=2'], dict(x=2)) def test_xy(self): self.check_ns(['x=1; y=2'], dict(x=1, y=2)) def test_abc(self): self.check_ns(['if 1:','a=1','b=2','c=3'], dict(a=1, b=2, c=3)) def test_multi(self): self.check_ns(['x =(1+','1+','2)'], dict(x=4)) class IPythonInputTestCase(InputSplitterTestCase): """By just creating a new class whose .isp is a different instance, we re-run the same test battery on the new input splitter. In addition, this runs the tests over the syntax and syntax_ml dicts that were tested by individual functions, as part of the OO interface. It also makes some checks on the raw buffer storage. """ def setUp(self): self.isp = isp.IPythonInputSplitter() def test_syntax(self): """Call all single-line syntax tests from the main object""" isp = self.isp for example in syntax.values(): for raw, out_t in example: if raw.startswith(' '): continue isp.push(raw+'\n') out_raw = isp.source_raw out = isp.source_reset() self.assertEqual(out.rstrip(), out_t, tt.pair_fail_msg.format("inputsplitter",raw, out_t, out)) self.assertEqual(out_raw.rstrip(), raw.rstrip()) def test_syntax_multiline(self): isp = self.isp for example in syntax_ml.values(): for line_pairs in example: out_t_parts = [] raw_parts = [] for lraw, out_t_part in line_pairs: if out_t_part is not None: out_t_parts.append(out_t_part) if lraw is not None: isp.push(lraw) raw_parts.append(lraw) out_raw = isp.source_raw out = isp.source_reset() out_t = '\n'.join(out_t_parts).rstrip() raw = '\n'.join(raw_parts).rstrip() self.assertEqual(out.rstrip(), out_t) self.assertEqual(out_raw.rstrip(), raw) def test_syntax_multiline_cell(self): isp = self.isp for example in syntax_ml.values(): out_t_parts = [] for line_pairs in example: raw = '\n'.join(r for r, _ in line_pairs if r is not None) out_t = '\n'.join(t for _,t in line_pairs if t is not None) out = isp.transform_cell(raw) # Match ignoring trailing whitespace self.assertEqual(out.rstrip(), out_t.rstrip()) def test_cellmagic_preempt(self): isp = self.isp for raw, name, line, cell in [ ("%%cellm a\nIn[1]:", u'cellm', u'a', u'In[1]:'), ("%%cellm \nline\n>>> hi", u'cellm', u'', u'line\n>>> hi'), (">>> %%cellm \nline\n>>> hi", u'cellm', u'', u'line\nhi'), ("%%cellm \n>>> hi", u'cellm', u'', u'>>> hi'), ("%%cellm \nline1\nline2", u'cellm', u'', u'line1\nline2'), ("%%cellm \nline1\\\\\nline2", u'cellm', u'', u'line1\\\\\nline2'), ]: expected = "get_ipython().run_cell_magic(%r, %r, %r)" % ( name, line, cell ) out = isp.transform_cell(raw) self.assertEqual(out.rstrip(), expected.rstrip()) def test_multiline_passthrough(self): isp = self.isp class CommentTransformer(InputTransformer): def __init__(self): self._lines = [] def push(self, line): self._lines.append(line + '#') def reset(self): text = '\n'.join(self._lines) self._lines = [] return text isp.physical_line_transforms.insert(0, CommentTransformer()) for raw, expected in [ ("a=5", "a=5#"), ("%ls foo", "get_ipython().run_line_magic(%r, %r)" % (u'ls', u'foo#')), ("!ls foo\n%ls bar", "get_ipython().system(%r)\nget_ipython().run_line_magic(%r, %r)" % ( u'ls foo#', u'ls', u'bar#' )), ("1\n2\n3\n%ls foo\n4\n5", "1#\n2#\n3#\nget_ipython().run_line_magic(%r, %r)\n4#\n5#" % (u'ls', u'foo#')), ]: out = isp.transform_cell(raw) self.assertEqual(out.rstrip(), expected.rstrip()) #----------------------------------------------------------------------------- # Main - use as a script, mostly for developer experiments #----------------------------------------------------------------------------- if __name__ == '__main__': # A simple demo for interactive experimentation. This code will not get # picked up by any test suite. from IPython.core.inputsplitter import IPythonInputSplitter # configure here the syntax to use, prompt and whether to autoindent #isp, start_prompt = InputSplitter(), '>>> ' isp, start_prompt = IPythonInputSplitter(), 'In> ' autoindent = True #autoindent = False try: while True: prompt = start_prompt while isp.push_accepts_more(): indent = ' '*isp.get_indent_spaces() if autoindent: line = indent + input(prompt+indent) else: line = input(prompt) isp.push(line) prompt = '... ' # Here we just return input so we can use it in a test suite, but a # real interpreter would instead send it for execution somewhere. #src = isp.source; raise EOFError # dbg raw = isp.source_raw src = isp.source_reset() print('Input source was:\n', src) print('Raw source was:\n', raw) except EOFError: print('Bye') # Tests for cell magics support def test_last_blank(): assert isp.last_blank("") is False assert isp.last_blank("abc") is False assert isp.last_blank("abc\n") is False assert isp.last_blank("abc\na") is False assert isp.last_blank("\n") is True assert isp.last_blank("\n ") is True assert isp.last_blank("abc\n ") is True assert isp.last_blank("abc\n\n") is True assert isp.last_blank("abc\nd\n\n") is True assert isp.last_blank("abc\nd\ne\n\n") is True assert isp.last_blank("abc \n \n \n\n") is True def test_last_two_blanks(): assert isp.last_two_blanks("") is False assert isp.last_two_blanks("abc") is False assert isp.last_two_blanks("abc\n") is False assert isp.last_two_blanks("abc\n\na") is False assert isp.last_two_blanks("abc\n \n") is False assert isp.last_two_blanks("abc\n\n") is False assert isp.last_two_blanks("\n\n") is True assert isp.last_two_blanks("\n\n ") is True assert isp.last_two_blanks("\n \n") is True assert isp.last_two_blanks("abc\n\n ") is True assert isp.last_two_blanks("abc\n\n\n") is True assert isp.last_two_blanks("abc\n\n \n") is True assert isp.last_two_blanks("abc\n\n \n ") is True assert isp.last_two_blanks("abc\n\n \n \n") is True assert isp.last_two_blanks("abc\nd\n\n\n") is True assert isp.last_two_blanks("abc\nd\ne\nf\n\n\n") is True class CellMagicsCommon(object): def test_whole_cell(self): src = "%%cellm line\nbody\n" out = self.sp.transform_cell(src) ref = "get_ipython().run_cell_magic('cellm', 'line', 'body')\n" assert out == ref def test_cellmagic_help(self): self.sp.push('%%cellm?') assert self.sp.push_accepts_more() is False def tearDown(self): self.sp.reset() class CellModeCellMagics(CellMagicsCommon, unittest.TestCase): sp = isp.IPythonInputSplitter(line_input_checker=False) def test_incremental(self): sp = self.sp sp.push("%%cellm firstline\n") assert sp.push_accepts_more() is True # 1 sp.push("line2\n") assert sp.push_accepts_more() is True # 2 sp.push("\n") # This should accept a blank line and carry on until the cell is reset assert sp.push_accepts_more() is True # 3 def test_no_strip_coding(self): src = '\n'.join([ '%%writefile foo.py', '# coding: utf-8', 'print(u"üñîçø∂é")', ]) out = self.sp.transform_cell(src) assert "# coding: utf-8" in out class LineModeCellMagics(CellMagicsCommon, unittest.TestCase): sp = isp.IPythonInputSplitter(line_input_checker=True) def test_incremental(self): sp = self.sp sp.push("%%cellm line2\n") assert sp.push_accepts_more() is True # 1 sp.push("\n") # In this case, a blank line should end the cell magic assert sp.push_accepts_more() is False # 2 indentation_samples = [ ('a = 1', 0), ('for a in b:', 4), ('def f():', 4), ('def f(): #comment', 4), ('a = ":#not a comment"', 0), ('def f():\n a = 1', 4), ('def f():\n return 1', 0), ('for a in b:\n' ' if a < 0:' ' continue', 3), ('a = {', 4), ('a = {\n' ' 1,', 5), ('b = """123', 0), ('', 0), ('def f():\n pass', 0), ('class Bar:\n def f():\n pass', 4), ('class Bar:\n def f():\n raise', 4), ] def test_find_next_indent(): for code, exp in indentation_samples: res = isp.find_next_indent(code) msg = "{!r} != {!r} (expected)\n Code: {!r}".format(res, exp, code) assert res == exp, msg ipython-8.35.0/IPython/core/tests/test_inputtransformer.py000066400000000000000000000366131477474304100240440ustar00rootroot00000000000000import tokenize from IPython.testing import tools as tt from IPython.core import inputtransformer as ipt def transform_and_reset(transformer): transformer = transformer() def transform(inp): try: return transformer.push(inp) finally: transformer.reset() return transform # Transformer tests def transform_checker(tests, transformer, **kwargs): """Utility to loop over test inputs""" transformer = transformer(**kwargs) try: for inp, tr in tests: if inp is None: out = transformer.reset() else: out = transformer.push(inp) assert out == tr finally: transformer.reset() # Data for all the syntax tests in the form of lists of pairs of # raw/transformed input. We store it here as a global dict so that we can use # it both within single-function tests and also to validate the behavior of the # larger objects syntax = \ dict(assign_system = [('a =! ls', "a = get_ipython().getoutput('ls')"), ('b = !ls', "b = get_ipython().getoutput('ls')"), ('c= !ls', "c = get_ipython().getoutput('ls')"), ('d == !ls', 'd == !ls'), # Invalid syntax, but we leave == alone. ('x=1', 'x=1'), # normal input is unmodified (' ',' '), # blank lines are kept intact # Tuple unpacking ("a, b = !echo 'a\\nb'", "a, b = get_ipython().getoutput(\"echo 'a\\\\nb'\")"), ("a,= !echo 'a'", "a, = get_ipython().getoutput(\"echo 'a'\")"), ("a, *bc = !echo 'a\\nb\\nc'", "a, *bc = get_ipython().getoutput(\"echo 'a\\\\nb\\\\nc'\")"), # Tuple unpacking with regular Python expressions, not our syntax. ("a, b = range(2)", "a, b = range(2)"), ("a, = range(1)", "a, = range(1)"), ("a, *bc = range(3)", "a, *bc = range(3)"), ], assign_magic = [('a =% who', "a = get_ipython().run_line_magic('who', '')"), ('b = %who', "b = get_ipython().run_line_magic('who', '')"), ('c= %ls', "c = get_ipython().run_line_magic('ls', '')"), ('d == %ls', 'd == %ls'), # Invalid syntax, but we leave == alone. ('x=1', 'x=1'), # normal input is unmodified (' ',' '), # blank lines are kept intact ("a, b = %foo", "a, b = get_ipython().run_line_magic('foo', '')"), ], classic_prompt=[ (">>> x=1", "x=1"), ("x=1", "x=1"), # normal input is unmodified (" ", " "), # blank lines are kept intact ], ipy_prompt=[ ("In [1]: x=1", "x=1"), ("x=1", "x=1"), # normal input is unmodified (" ", " "), # blank lines are kept intact ], # Tests for the escape transformer to leave normal code alone escaped_noesc=[ (" ", " "), ("x=1", "x=1"), ], # System calls escaped_shell=[ ("!ls", "get_ipython().system('ls')"), # Double-escape shell, this means to capture the output of the # subprocess and return it ("!!ls", "get_ipython().getoutput('ls')"), ], # Help/object info escaped_help=[ ("?", "get_ipython().show_usage()"), ("?x1", "get_ipython().run_line_magic('pinfo', 'x1')"), ("??x2", "get_ipython().run_line_magic('pinfo2', 'x2')"), ("?a.*s", "get_ipython().run_line_magic('psearch', 'a.*s')"), ("?%hist1", "get_ipython().run_line_magic('pinfo', '%hist1')"), ("?%%hist2", "get_ipython().run_line_magic('pinfo', '%%hist2')"), ("?abc = qwe", "get_ipython().run_line_magic('pinfo', 'abc')"), ], end_help=[ ("x3?", "get_ipython().run_line_magic('pinfo', 'x3')"), ("x4??", "get_ipython().run_line_magic('pinfo2', 'x4')"), ("%hist1?", "get_ipython().run_line_magic('pinfo', '%hist1')"), ("%hist2??", "get_ipython().run_line_magic('pinfo2', '%hist2')"), ("%%hist3?", "get_ipython().run_line_magic('pinfo', '%%hist3')"), ("%%hist4??", "get_ipython().run_line_magic('pinfo2', '%%hist4')"), ("π.foo?", "get_ipython().run_line_magic('pinfo', 'π.foo')"), ("f*?", "get_ipython().run_line_magic('psearch', 'f*')"), ("ax.*aspe*?", "get_ipython().run_line_magic('psearch', 'ax.*aspe*')"), ("a = abc?", "get_ipython().run_line_magic('pinfo', 'abc')"), ("a = abc.qe??", "get_ipython().run_line_magic('pinfo2', 'abc.qe')"), ("a = *.items?", "get_ipython().run_line_magic('psearch', '*.items')"), ("plot(a?", "get_ipython().run_line_magic('pinfo', 'a')"), ("a*2 #comment?", "a*2 #comment?"), ], # Explicit magic calls escaped_magic=[ ("%cd", "get_ipython().run_line_magic('cd', '')"), ("%cd /home", "get_ipython().run_line_magic('cd', '/home')"), # Backslashes need to be escaped. ("%cd C:\\User", "get_ipython().run_line_magic('cd', 'C:\\\\User')"), (" %magic", " get_ipython().run_line_magic('magic', '')"), ], # Quoting with separate arguments escaped_quote=[ (",f", 'f("")'), (",f x", 'f("x")'), (" ,f y", ' f("y")'), (",f a b", 'f("a", "b")'), ], # Quoting with single argument escaped_quote2=[ (";f", 'f("")'), (";f x", 'f("x")'), (" ;f y", ' f("y")'), (";f a b", 'f("a b")'), ], # Simply apply parens escaped_paren=[ ("/f", "f()"), ("/f x", "f(x)"), (" /f y", " f(y)"), ("/f a b", "f(a, b)"), ], # Check that we transform prompts before other transforms mixed=[ ("In [1]: %lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), (">>> %lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), ("In [2]: !ls", "get_ipython().system('ls')"), ("In [3]: abs?", "get_ipython().run_line_magic('pinfo', 'abs')"), ("In [4]: b = %who", "b = get_ipython().run_line_magic('who', '')"), ], ) # multiline syntax examples. Each of these should be a list of lists, with # each entry itself having pairs of raw/transformed input. The union (with # '\n'.join() of the transformed inputs is what the splitter should produce # when fed the raw lines one at a time via push. syntax_ml = \ dict(classic_prompt = [ [('>>> for i in range(10):','for i in range(10):'), ('... print i',' print i'), ('... ', ''), ], [('>>> a="""','a="""'), ('... 123"""','123"""'), ], [('a="""','a="""'), ('... 123','123'), ('... 456"""','456"""'), ], [('a="""','a="""'), ('>>> 123','123'), ('... 456"""','456"""'), ], [('a="""','a="""'), ('123','123'), ('... 456"""','... 456"""'), ], [('....__class__','....__class__'), ], [('a=5', 'a=5'), ('...', ''), ], [('>>> def f(x):', 'def f(x):'), ('...', ''), ('... return x', ' return x'), ], [('board = """....', 'board = """....'), ('....', '....'), ('...."""', '...."""'), ], ], ipy_prompt = [ [('In [24]: for i in range(10):','for i in range(10):'), (' ....: print i',' print i'), (' ....: ', ''), ], [('In [24]: for i in range(10):','for i in range(10):'), # Qt console prompts expand with spaces, not dots (' ...: print i',' print i'), (' ...: ', ''), ], [('In [24]: for i in range(10):','for i in range(10):'), # Sometimes whitespace preceding '...' has been removed ('...: print i',' print i'), ('...: ', ''), ], [('In [24]: for i in range(10):','for i in range(10):'), # Space after last continuation prompt has been removed (issue #6674) ('...: print i',' print i'), ('...:', ''), ], [('In [2]: a="""','a="""'), (' ...: 123"""','123"""'), ], [('a="""','a="""'), (' ...: 123','123'), (' ...: 456"""','456"""'), ], [('a="""','a="""'), ('In [1]: 123','123'), (' ...: 456"""','456"""'), ], [('a="""','a="""'), ('123','123'), (' ...: 456"""',' ...: 456"""'), ], ], multiline_datastructure_prompt = [ [('>>> a = [1,','a = [1,'), ('... 2]','2]'), ], ], multiline_datastructure = [ [('b = ("%s"', None), ('# comment', None), ('%foo )', 'b = ("%s"\n# comment\n%foo )'), ], ], multiline_string = [ [("'''foo?", None), ("bar'''", "'''foo?\nbar'''"), ], ], leading_indent = [ [(' print "hi"','print "hi"'), ], [(' for a in range(5):','for a in range(5):'), (' a*2',' a*2'), ], [(' a="""','a="""'), (' 123"""','123"""'), ], [('a="""','a="""'), (' 123"""',' 123"""'), ], ], cellmagic = [ [('%%foo a', None), (None, "get_ipython().run_cell_magic('foo', 'a', '')"), ], [('%%bar 123', None), ('hello', None), (None , "get_ipython().run_cell_magic('bar', '123', 'hello')"), ], [('a=5', 'a=5'), ('%%cellmagic', '%%cellmagic'), ], ], escaped = [ [('%abc def \\', None), ('ghi', "get_ipython().run_line_magic('abc', 'def ghi')"), ], [('%abc def \\', None), ('ghi\\', None), (None, "get_ipython().run_line_magic('abc', 'def ghi')"), ], ], assign_magic = [ [('a = %bc de \\', None), ('fg', "a = get_ipython().run_line_magic('bc', 'de fg')"), ], [('a = %bc de \\', None), ('fg\\', None), (None, "a = get_ipython().run_line_magic('bc', 'de fg')"), ], ], assign_system = [ [('a = !bc de \\', None), ('fg', "a = get_ipython().getoutput('bc de fg')"), ], [('a = !bc de \\', None), ('fg\\', None), (None, "a = get_ipython().getoutput('bc de fg')"), ], ], ) def test_assign_system(): tt.check_pairs(transform_and_reset(ipt.assign_from_system), syntax['assign_system']) def test_assign_magic(): tt.check_pairs(transform_and_reset(ipt.assign_from_magic), syntax['assign_magic']) def test_classic_prompt(): tt.check_pairs(transform_and_reset(ipt.classic_prompt), syntax['classic_prompt']) for example in syntax_ml['classic_prompt']: transform_checker(example, ipt.classic_prompt) for example in syntax_ml['multiline_datastructure_prompt']: transform_checker(example, ipt.classic_prompt) # Check that we don't transform the second line if the first is obviously # IPython syntax transform_checker([ ('%foo', '%foo'), ('>>> bar', '>>> bar'), ], ipt.classic_prompt) def test_ipy_prompt(): tt.check_pairs(transform_and_reset(ipt.ipy_prompt), syntax['ipy_prompt']) for example in syntax_ml['ipy_prompt']: transform_checker(example, ipt.ipy_prompt) # Check that we don't transform the second line if we're inside a cell magic transform_checker([ ('%%foo', '%%foo'), ('In [1]: bar', 'In [1]: bar'), ], ipt.ipy_prompt) def test_assemble_logical_lines(): tests = \ [ [("a = \\", None), ("123", "a = 123"), ], [("a = \\", None), # Test resetting when within a multi-line string ("12 *\\", None), (None, "a = 12 *"), ], [("# foo\\", "# foo\\"), # Comments can't be continued like this ], ] for example in tests: transform_checker(example, ipt.assemble_logical_lines) def test_assemble_python_lines(): tests = \ [ [("a = '''", None), ("abc'''", "a = '''\nabc'''"), ], [("a = '''", None), # Test resetting when within a multi-line string ("def", None), (None, "a = '''\ndef"), ], [("a = [1,", None), ("2]", "a = [1,\n2]"), ], [("a = [1,", None), # Test resetting when within a multi-line string ("2,", None), (None, "a = [1,\n2,"), ], [("a = '''", None), # Test line continuation within a multi-line string ("abc\\", None), ("def", None), ("'''", "a = '''\nabc\\\ndef\n'''"), ], ] + syntax_ml['multiline_datastructure'] for example in tests: transform_checker(example, ipt.assemble_python_lines) def test_help_end(): tt.check_pairs(transform_and_reset(ipt.help_end), syntax['end_help']) def test_escaped_noesc(): tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_noesc']) def test_escaped_shell(): tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_shell']) def test_escaped_help(): tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_help']) def test_escaped_magic(): tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_magic']) def test_escaped_quote(): tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_quote']) def test_escaped_quote2(): tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_quote2']) def test_escaped_paren(): tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_paren']) def test_cellmagic(): for example in syntax_ml['cellmagic']: transform_checker(example, ipt.cellmagic) line_example = [('%%bar 123', None), ('hello', None), ('' , "get_ipython().run_cell_magic('bar', '123', 'hello')"), ] transform_checker(line_example, ipt.cellmagic, end_on_blank_line=True) def test_has_comment(): tests = [('text', False), ('text #comment', True), ('text #comment\n', True), ('#comment', True), ('#comment\n', True), ('a = "#string"', False), ('a = "#string" # comment', True), ('a #comment not "string"', True), ] tt.check_pairs(ipt.has_comment, tests) @ipt.TokenInputTransformer.wrap def decistmt(tokens): """Substitute Decimals for floats in a string of statements. Based on an example from the tokenize module docs. """ result = [] for toknum, tokval, _, _, _ in tokens: if toknum == tokenize.NUMBER and '.' in tokval: # replace NUMBER tokens yield from [ (tokenize.NAME, 'Decimal'), (tokenize.OP, '('), (tokenize.STRING, repr(tokval)), (tokenize.OP, ')') ] else: yield (toknum, tokval) def test_token_input_transformer(): tests = [('1.2', "Decimal ('1.2')"), ('"1.2"', '"1.2"'), ] tt.check_pairs(transform_and_reset(decistmt), tests) ml_tests = \ [ [("a = 1.2; b = '''x", None), ("y'''", "a =Decimal ('1.2');b ='''x\ny'''"), ], [("a = [1.2,", None), ("3]", "a =[Decimal ('1.2'),\n3 ]"), ], [("a = '''foo", None), # Test resetting when within a multi-line string ("bar", None), (None, "a = '''foo\nbar"), ], ] for example in ml_tests: transform_checker(example, decistmt) ipython-8.35.0/IPython/core/tests/test_inputtransformer2.py000066400000000000000000000261271477474304100241250ustar00rootroot00000000000000"""Tests for the token-based transformers in IPython.core.inputtransformer2 Line-based transformers are the simpler ones; token-based transformers are more complex. See test_inputtransformer2_line for tests for line-based transformations. """ import platform import string import sys from textwrap import dedent import pytest from IPython.core import inputtransformer2 as ipt2 from IPython.core.inputtransformer2 import _find_assign_op, make_tokens_by_line MULTILINE_MAGIC = ( """\ a = f() %foo \\ bar g() """.splitlines( keepends=True ), (2, 0), """\ a = f() get_ipython().run_line_magic('foo', ' bar') g() """.splitlines( keepends=True ), ) INDENTED_MAGIC = ( """\ for a in range(5): %ls """.splitlines( keepends=True ), (2, 4), """\ for a in range(5): get_ipython().run_line_magic('ls', '') """.splitlines( keepends=True ), ) CRLF_MAGIC = ( ["a = f()\n", "%ls\r\n", "g()\n"], (2, 0), ["a = f()\n", "get_ipython().run_line_magic('ls', '')\n", "g()\n"], ) MULTILINE_MAGIC_ASSIGN = ( """\ a = f() b = %foo \\ bar g() """.splitlines( keepends=True ), (2, 4), """\ a = f() b = get_ipython().run_line_magic('foo', ' bar') g() """.splitlines( keepends=True ), ) MULTILINE_SYSTEM_ASSIGN = ("""\ a = f() b = !foo \\ bar g() """.splitlines(keepends=True), (2, 4), """\ a = f() b = get_ipython().getoutput('foo bar') g() """.splitlines(keepends=True)) ##### MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT = ( """\ def test(): for i in range(1): print(i) res =! ls """.splitlines( keepends=True ), (4, 7), """\ def test(): for i in range(1): print(i) res =get_ipython().getoutput(\' ls\') """.splitlines( keepends=True ), ) ###### AUTOCALL_QUOTE = ([",f 1 2 3\n"], (1, 0), ['f("1", "2", "3")\n']) AUTOCALL_QUOTE2 = ([";f 1 2 3\n"], (1, 0), ['f("1 2 3")\n']) AUTOCALL_PAREN = (["/f 1 2 3\n"], (1, 0), ["f(1, 2, 3)\n"]) SIMPLE_HELP = (["foo?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', 'foo')\n"]) DETAILED_HELP = ( ["foo??\n"], (1, 0), ["get_ipython().run_line_magic('pinfo2', 'foo')\n"], ) MAGIC_HELP = (["%foo?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', '%foo')\n"]) HELP_IN_EXPR = ( ["a = b + c?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', 'c')\n"], ) HELP_CONTINUED_LINE = ( """\ a = \\ zip? """.splitlines( keepends=True ), (1, 0), [r"get_ipython().run_line_magic('pinfo', 'zip')" + "\n"], ) HELP_MULTILINE = ( """\ (a, b) = zip? """.splitlines( keepends=True ), (1, 0), [r"get_ipython().run_line_magic('pinfo', 'zip')" + "\n"], ) HELP_UNICODE = ( ["π.foo?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', 'π.foo')\n"], ) def null_cleanup_transformer(lines): """ A cleanup transform that returns an empty list. """ return [] def test_check_make_token_by_line_never_ends_empty(): """ Check that not sequence of single or double characters ends up leading to en empty list of tokens """ from string import printable for c in printable: assert make_tokens_by_line(c)[-1] != [] for k in printable: assert make_tokens_by_line(c + k)[-1] != [] def check_find(transformer, case, match=True): sample, expected_start, _ = case tbl = make_tokens_by_line(sample) res = transformer.find(tbl) if match: # start_line is stored 0-indexed, expected values are 1-indexed assert (res.start_line + 1, res.start_col) == expected_start return res else: assert res is None def check_transform(transformer_cls, case): lines, start, expected = case transformer = transformer_cls(start) assert transformer.transform(lines) == expected def test_continued_line(): lines = MULTILINE_MAGIC_ASSIGN[0] assert ipt2.find_end_of_continued_line(lines, 1) == 2 assert ipt2.assemble_continued_line(lines, (1, 5), 2) == "foo bar" def test_find_assign_magic(): check_find(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN) check_find(ipt2.MagicAssign, MULTILINE_SYSTEM_ASSIGN, match=False) check_find(ipt2.MagicAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT, match=False) def test_transform_assign_magic(): check_transform(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN) def test_find_assign_system(): check_find(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN) check_find(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT) check_find(ipt2.SystemAssign, (["a = !ls\n"], (1, 5), None)) check_find(ipt2.SystemAssign, (["a=!ls\n"], (1, 2), None)) check_find(ipt2.SystemAssign, MULTILINE_MAGIC_ASSIGN, match=False) def test_transform_assign_system(): check_transform(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN) check_transform(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT) def test_find_magic_escape(): check_find(ipt2.EscapedCommand, MULTILINE_MAGIC) check_find(ipt2.EscapedCommand, INDENTED_MAGIC) check_find(ipt2.EscapedCommand, MULTILINE_MAGIC_ASSIGN, match=False) def test_transform_magic_escape(): check_transform(ipt2.EscapedCommand, MULTILINE_MAGIC) check_transform(ipt2.EscapedCommand, INDENTED_MAGIC) check_transform(ipt2.EscapedCommand, CRLF_MAGIC) def test_find_autocalls(): for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]: print("Testing %r" % case[0]) check_find(ipt2.EscapedCommand, case) def test_transform_autocall(): for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]: print("Testing %r" % case[0]) check_transform(ipt2.EscapedCommand, case) def test_find_help(): for case in [SIMPLE_HELP, DETAILED_HELP, MAGIC_HELP, HELP_IN_EXPR]: check_find(ipt2.HelpEnd, case) tf = check_find(ipt2.HelpEnd, HELP_CONTINUED_LINE) assert tf.q_line == 1 assert tf.q_col == 3 tf = check_find(ipt2.HelpEnd, HELP_MULTILINE) assert tf.q_line == 1 assert tf.q_col == 8 # ? in a comment does not trigger help check_find(ipt2.HelpEnd, (["foo # bar?\n"], None, None), match=False) # Nor in a string check_find(ipt2.HelpEnd, (["foo = '''bar?\n"], None, None), match=False) def test_transform_help(): tf = ipt2.HelpEnd((1, 0), (1, 9)) assert tf.transform(HELP_IN_EXPR[0]) == HELP_IN_EXPR[2] tf = ipt2.HelpEnd((1, 0), (2, 3)) assert tf.transform(HELP_CONTINUED_LINE[0]) == HELP_CONTINUED_LINE[2] tf = ipt2.HelpEnd((1, 0), (2, 8)) assert tf.transform(HELP_MULTILINE[0]) == HELP_MULTILINE[2] tf = ipt2.HelpEnd((1, 0), (1, 0)) assert tf.transform(HELP_UNICODE[0]) == HELP_UNICODE[2] def test_find_assign_op_dedent(): """ be careful that empty token like dedent are not counted as parens """ class Tk: def __init__(self, s): self.string = s assert _find_assign_op([Tk(s) for s in ("", "a", "=", "b")]) == 2 assert ( _find_assign_op([Tk(s) for s in ("", "(", "a", "=", "b", ")", "=", "5")]) == 6 ) extra_closing_paren_param = ( pytest.param("(\n))", "invalid", None) if sys.version_info >= (3, 12) else pytest.param("(\n))", "incomplete", 0) ) examples = [ pytest.param("a = 1", "complete", None), pytest.param("for a in range(5):", "incomplete", 4), pytest.param("for a in range(5):\n if a > 0:", "incomplete", 8), pytest.param("raise = 2", "invalid", None), pytest.param("a = [1,\n2,", "incomplete", 0), extra_closing_paren_param, pytest.param("\\\r\n", "incomplete", 0), pytest.param("a = '''\n hi", "incomplete", 3), pytest.param("def a():\n x=1\n global x", "invalid", None), pytest.param( "a \\ ", "invalid", None, marks=pytest.mark.xfail( reason="Bug in python 3.9.8 – bpo 45738", condition=sys.version_info in [(3, 11, 0, "alpha", 2)], raises=SystemError, strict=True, ), ), # Nothing allowed after backslash, pytest.param("1\\\n+2", "complete", None), ] @pytest.mark.parametrize("code, expected, number", examples) def test_check_complete_param(code, expected, number): cc = ipt2.TransformerManager().check_complete assert cc(code) == (expected, number) @pytest.mark.xfail(platform.python_implementation() == "PyPy", reason="fail on pypy") @pytest.mark.xfail( reason="Bug in python 3.9.8 – bpo 45738", condition=sys.version_info in [(3, 11, 0, "alpha", 2)], raises=SystemError, strict=True, ) def test_check_complete(): cc = ipt2.TransformerManager().check_complete example = dedent( """ if True: a=1""" ) assert cc(example) == ("incomplete", 4) assert cc(example + "\n") == ("complete", None) assert cc(example + "\n ") == ("complete", None) # no need to loop on all the letters/numbers. short = "12abAB" + string.printable[62:] for c in short: # test does not raise: cc(c) for k in short: cc(c + k) assert cc("def f():\n x=0\n \\\n ") == ("incomplete", 2) @pytest.mark.xfail(platform.python_implementation() == "PyPy", reason="fail on pypy") @pytest.mark.parametrize( "value, expected", [ ('''def foo():\n """''', ("incomplete", 4)), ("""async with example:\n pass""", ("incomplete", 4)), ("""async with example:\n pass\n """, ("complete", None)), ], ) def test_check_complete_II(value, expected): """ Test that multiple line strings are properly handled. Separate test function for convenience """ cc = ipt2.TransformerManager().check_complete assert cc(value) == expected @pytest.mark.parametrize( "value, expected", [ (")", ("invalid", None)), ("]", ("invalid", None)), ("}", ("invalid", None)), (")(", ("invalid", None)), ("][", ("invalid", None)), ("}{", ("invalid", None)), ("]()(", ("invalid", None)), ("())(", ("invalid", None)), (")[](", ("invalid", None)), ("()](", ("invalid", None)), ], ) def test_check_complete_invalidates_sunken_brackets(value, expected): """ Test that a single line with more closing brackets than the opening ones is interpreted as invalid """ cc = ipt2.TransformerManager().check_complete assert cc(value) == expected def test_null_cleanup_transformer(): manager = ipt2.TransformerManager() manager.cleanup_transforms.insert(0, null_cleanup_transformer) assert manager.transform_cell("") == "" def test_side_effects_I(): count = 0 def counter(lines): nonlocal count count += 1 return lines counter.has_side_effects = True manager = ipt2.TransformerManager() manager.cleanup_transforms.insert(0, counter) assert manager.check_complete("a=1\n") == ("complete", None) assert count == 0 def test_side_effects_II(): count = 0 def counter(lines): nonlocal count count += 1 return lines counter.has_side_effects = True manager = ipt2.TransformerManager() manager.line_transforms.insert(0, counter) assert manager.check_complete("b=1\n") == ("complete", None) assert count == 0 ipython-8.35.0/IPython/core/tests/test_inputtransformer2_line.py000066400000000000000000000056331477474304100251330ustar00rootroot00000000000000"""Tests for the line-based transformers in IPython.core.inputtransformer2 Line-based transformers are the simpler ones; token-based transformers are more complex. See test_inputtransformer2 for tests for token-based transformers. """ from IPython.core import inputtransformer2 as ipt2 CELL_MAGIC = ("""\ %%foo arg body 1 body 2 """, """\ get_ipython().run_cell_magic('foo', 'arg', 'body 1\\nbody 2\\n') """) def test_cell_magic(): for sample, expected in [CELL_MAGIC]: assert ipt2.cell_magic(sample.splitlines(keepends=True)) == expected.splitlines( keepends=True ) CLASSIC_PROMPT = ("""\ >>> for a in range(5): ... print(a) """, """\ for a in range(5): print(a) """) CLASSIC_PROMPT_L2 = ("""\ for a in range(5): ... print(a) ... print(a ** 2) """, """\ for a in range(5): print(a) print(a ** 2) """) def test_classic_prompt(): for sample, expected in [CLASSIC_PROMPT, CLASSIC_PROMPT_L2]: assert ipt2.classic_prompt( sample.splitlines(keepends=True) ) == expected.splitlines(keepends=True) IPYTHON_PROMPT = ("""\ In [1]: for a in range(5): ...: print(a) """, """\ for a in range(5): print(a) """) IPYTHON_PROMPT_L2 = ("""\ for a in range(5): ...: print(a) ...: print(a ** 2) """, """\ for a in range(5): print(a) print(a ** 2) """) IPYTHON_PROMPT_VI_INS = ( """\ [ins] In [11]: def a(): ...: 123 ...: ...: 123 """, """\ def a(): 123 123 """, ) IPYTHON_PROMPT_VI_NAV = ( """\ [nav] In [11]: def a(): ...: 123 ...: ...: 123 """, """\ def a(): 123 123 """, ) def test_ipython_prompt(): for sample, expected in [ IPYTHON_PROMPT, IPYTHON_PROMPT_L2, IPYTHON_PROMPT_VI_INS, IPYTHON_PROMPT_VI_NAV, ]: assert ipt2.ipython_prompt( sample.splitlines(keepends=True) ) == expected.splitlines(keepends=True) INDENT_SPACES = ("""\ if True: a = 3 """, """\ if True: a = 3 """) INDENT_TABS = ("""\ \tif True: \t\tb = 4 """, """\ if True: \tb = 4 """) def test_leading_indent(): for sample, expected in [INDENT_SPACES, INDENT_TABS]: assert ipt2.leading_indent( sample.splitlines(keepends=True) ) == expected.splitlines(keepends=True) LEADING_EMPTY_LINES = ("""\ \t if True: a = 3 b = 4 """, """\ if True: a = 3 b = 4 """) ONLY_EMPTY_LINES = ("""\ \t """, """\ \t """) def test_leading_empty_lines(): for sample, expected in [LEADING_EMPTY_LINES, ONLY_EMPTY_LINES]: assert ipt2.leading_empty_lines( sample.splitlines(keepends=True) ) == expected.splitlines(keepends=True) CRLF_MAGIC = ([ "%%ls\r\n" ], [ "get_ipython().run_cell_magic('ls', '', '')\n" ]) def test_crlf_magic(): for sample, expected in [CRLF_MAGIC]: assert ipt2.cell_magic(sample) == expected ipython-8.35.0/IPython/core/tests/test_interactiveshell.py000066400000000000000000001161311477474304100237610ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Tests for the key interactiveshell module. Historically the main classes in interactiveshell have been under-tested. This module should grow as many single-method tests as possible to trap many of the recurring bugs we seem to encounter with high-level interaction. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import asyncio import ast import os import signal import shutil import sys import tempfile import unittest import pytest from unittest import mock from os.path import join from IPython.core.error import InputRejected from IPython.core.inputtransformer import InputTransformer from IPython.core import interactiveshell from IPython.core.oinspect import OInfo from IPython.testing.decorators import ( skipif, skip_win32, onlyif_unicode_paths, onlyif_cmds_exist, skip_if_not_osx, ) from IPython.testing import tools as tt from IPython.utils.process import find_cmd #----------------------------------------------------------------------------- # Globals #----------------------------------------------------------------------------- # This is used by every single test, no point repeating it ad nauseam #----------------------------------------------------------------------------- # Tests #----------------------------------------------------------------------------- class DerivedInterrupt(KeyboardInterrupt): pass class InteractiveShellTestCase(unittest.TestCase): def test_naked_string_cells(self): """Test that cells with only naked strings are fully executed""" # First, single-line inputs ip.run_cell('"a"\n') self.assertEqual(ip.user_ns['_'], 'a') # And also multi-line cells ip.run_cell('"""a\nb"""\n') self.assertEqual(ip.user_ns['_'], 'a\nb') def test_run_empty_cell(self): """Just make sure we don't get a horrible error with a blank cell of input. Yes, I did overlook that.""" old_xc = ip.execution_count res = ip.run_cell('') self.assertEqual(ip.execution_count, old_xc) self.assertEqual(res.execution_count, None) def test_run_cell_multiline(self): """Multi-block, multi-line cells must execute correctly. """ src = '\n'.join(["x=1", "y=2", "if 1:", " x += 1", " y += 1",]) res = ip.run_cell(src) self.assertEqual(ip.user_ns['x'], 2) self.assertEqual(ip.user_ns['y'], 3) self.assertEqual(res.success, True) self.assertEqual(res.result, None) def test_multiline_string_cells(self): "Code sprinkled with multiline strings should execute (GH-306)" ip.run_cell('tmp=0') self.assertEqual(ip.user_ns['tmp'], 0) res = ip.run_cell('tmp=1;"""a\nb"""\n') self.assertEqual(ip.user_ns['tmp'], 1) self.assertEqual(res.success, True) self.assertEqual(res.result, "a\nb") def test_dont_cache_with_semicolon(self): "Ending a line with semicolon should not cache the returned object (GH-307)" oldlen = len(ip.user_ns['Out']) for cell in ['1;', '1;1;']: res = ip.run_cell(cell, store_history=True) newlen = len(ip.user_ns['Out']) self.assertEqual(oldlen, newlen) self.assertIsNone(res.result) i = 0 #also test the default caching behavior for cell in ['1', '1;1']: ip.run_cell(cell, store_history=True) newlen = len(ip.user_ns['Out']) i += 1 self.assertEqual(oldlen+i, newlen) def test_syntax_error(self): res = ip.run_cell("raise = 3") self.assertIsInstance(res.error_before_exec, SyntaxError) def test_open_standard_input_stream(self): res = ip.run_cell("open(0)") self.assertIsInstance(res.error_in_exec, ValueError) def test_open_standard_output_stream(self): res = ip.run_cell("open(1)") self.assertIsInstance(res.error_in_exec, ValueError) def test_open_standard_error_stream(self): res = ip.run_cell("open(2)") self.assertIsInstance(res.error_in_exec, ValueError) def test_In_variable(self): "Verify that In variable grows with user input (GH-284)" oldlen = len(ip.user_ns['In']) ip.run_cell('1;', store_history=True) newlen = len(ip.user_ns['In']) self.assertEqual(oldlen+1, newlen) self.assertEqual(ip.user_ns['In'][-1],'1;') def test_magic_names_in_string(self): ip.run_cell('a = """\n%exit\n"""') self.assertEqual(ip.user_ns['a'], '\n%exit\n') def test_trailing_newline(self): """test that running !(command) does not raise a SyntaxError""" ip.run_cell('!(true)\n', False) ip.run_cell('!(true)\n\n\n', False) def test_gh_597(self): """Pretty-printing lists of objects with non-ascii reprs may cause problems.""" class Spam(object): def __repr__(self): return "\xe9"*50 import IPython.core.formatters f = IPython.core.formatters.PlainTextFormatter() f([Spam(), Spam()]) def test_future_flags(self): """Check that future flags are used for parsing code (gh-777)""" ip.run_cell('from __future__ import barry_as_FLUFL') try: ip.run_cell('prfunc_return_val = 1 <> 2') assert 'prfunc_return_val' in ip.user_ns finally: # Reset compiler flags so we don't mess up other tests. ip.compile.reset_compiler_flags() def test_can_pickle(self): "Can we pickle objects defined interactively (GH-29)" ip = get_ipython() ip.reset() ip.run_cell(("class Mylist(list):\n" " def __init__(self,x=[]):\n" " list.__init__(self,x)")) ip.run_cell("w=Mylist([1,2,3])") from pickle import dumps # We need to swap in our main module - this is only necessary # inside the test framework, because IPython puts the interactive module # in place (but the test framework undoes this). _main = sys.modules['__main__'] sys.modules['__main__'] = ip.user_module try: res = dumps(ip.user_ns["w"]) finally: sys.modules['__main__'] = _main self.assertTrue(isinstance(res, bytes)) def test_global_ns(self): "Code in functions must be able to access variables outside them." ip = get_ipython() ip.run_cell("a = 10") ip.run_cell(("def f(x):\n" " return x + a")) ip.run_cell("b = f(12)") self.assertEqual(ip.user_ns["b"], 22) def test_bad_custom_tb(self): """Check that InteractiveShell is protected from bad custom exception handlers""" ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0) self.assertEqual(ip.custom_exceptions, (IOError,)) with tt.AssertPrints("Custom TB Handler failed", channel='stderr'): ip.run_cell(u'raise IOError("foo")') self.assertEqual(ip.custom_exceptions, ()) def test_bad_custom_tb_return(self): """Check that InteractiveShell is protected from bad return types in custom exception handlers""" ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1) self.assertEqual(ip.custom_exceptions, (NameError,)) with tt.AssertPrints("Custom TB Handler failed", channel='stderr'): ip.run_cell(u'a=abracadabra') self.assertEqual(ip.custom_exceptions, ()) def test_drop_by_id(self): myvars = {"a":object(), "b":object(), "c": object()} ip.push(myvars, interactive=False) for name in myvars: assert name in ip.user_ns, name assert name in ip.user_ns_hidden, name ip.user_ns['b'] = 12 ip.drop_by_id(myvars) for name in ["a", "c"]: assert name not in ip.user_ns, name assert name not in ip.user_ns_hidden, name assert ip.user_ns['b'] == 12 ip.reset() def test_var_expand(self): ip.user_ns['f'] = u'Ca\xf1o' self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o') self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o') self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1') self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2') self.assertEqual(ip.var_expand(u"grep x | awk '{print $1}'"), u"grep x | awk '{print $1}'") ip.user_ns['f'] = b'Ca\xc3\xb1o' # This should not raise any exception: ip.var_expand(u'echo $f') def test_var_expand_local(self): """Test local variable expansion in !system and %magic calls""" # !system ip.run_cell( "def test():\n" ' lvar = "ttt"\n' " ret = !echo {lvar}\n" " return ret[0]\n" ) res = ip.user_ns["test"]() self.assertIn("ttt", res) # %magic ip.run_cell( "def makemacro():\n" ' macroname = "macro_var_expand_locals"\n' " %macro {macroname} codestr\n" ) ip.user_ns["codestr"] = "str(12)" ip.run_cell("makemacro()") self.assertIn("macro_var_expand_locals", ip.user_ns) def test_var_expand_self(self): """Test variable expansion with the name 'self', which was failing. See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218 """ ip.run_cell( "class cTest:\n" ' classvar="see me"\n' " def test(self):\n" " res = !echo Variable: {self.classvar}\n" " return res[0]\n" ) self.assertIn("see me", ip.user_ns["cTest"]().test()) def test_bad_var_expand(self): """var_expand on invalid formats shouldn't raise""" # SyntaxError self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}") # NameError self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}") # ZeroDivisionError self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}") def test_silent_postexec(self): """run_cell(silent=True) doesn't invoke pre/post_run_cell callbacks""" pre_explicit = mock.Mock() pre_always = mock.Mock() post_explicit = mock.Mock() post_always = mock.Mock() all_mocks = [pre_explicit, pre_always, post_explicit, post_always] ip.events.register('pre_run_cell', pre_explicit) ip.events.register('pre_execute', pre_always) ip.events.register('post_run_cell', post_explicit) ip.events.register('post_execute', post_always) try: ip.run_cell("1", silent=True) assert pre_always.called assert not pre_explicit.called assert post_always.called assert not post_explicit.called # double-check that non-silent exec did what we expected # silent to avoid ip.run_cell("1") assert pre_explicit.called assert post_explicit.called info, = pre_explicit.call_args[0] result, = post_explicit.call_args[0] self.assertEqual(info, result.info) # check that post hooks are always called [m.reset_mock() for m in all_mocks] ip.run_cell("syntax error") assert pre_always.called assert pre_explicit.called assert post_always.called assert post_explicit.called info, = pre_explicit.call_args[0] result, = post_explicit.call_args[0] self.assertEqual(info, result.info) finally: # remove post-exec ip.events.unregister('pre_run_cell', pre_explicit) ip.events.unregister('pre_execute', pre_always) ip.events.unregister('post_run_cell', post_explicit) ip.events.unregister('post_execute', post_always) def test_silent_noadvance(self): """run_cell(silent=True) doesn't advance execution_count""" ec = ip.execution_count # silent should force store_history=False ip.run_cell("1", store_history=True, silent=True) self.assertEqual(ec, ip.execution_count) # double-check that non-silent exec did what we expected # silent to avoid ip.run_cell("1", store_history=True) self.assertEqual(ec+1, ip.execution_count) def test_silent_nodisplayhook(self): """run_cell(silent=True) doesn't trigger displayhook""" d = dict(called=False) trap = ip.display_trap save_hook = trap.hook def failing_hook(*args, **kwargs): d['called'] = True try: trap.hook = failing_hook res = ip.run_cell("1", silent=True) self.assertFalse(d['called']) self.assertIsNone(res.result) # double-check that non-silent exec did what we expected # silent to avoid ip.run_cell("1") self.assertTrue(d['called']) finally: trap.hook = save_hook def test_ofind_line_magic(self): from IPython.core.magic import register_line_magic @register_line_magic def lmagic(line): "A line magic" # Get info on line magic lfind = ip._ofind("lmagic") info = OInfo( found=True, isalias=False, ismagic=True, namespace="IPython internal", obj=lmagic, parent=None, ) self.assertEqual(lfind, info) def test_ofind_cell_magic(self): from IPython.core.magic import register_cell_magic @register_cell_magic def cmagic(line, cell): "A cell magic" # Get info on cell magic find = ip._ofind("cmagic") info = OInfo( found=True, isalias=False, ismagic=True, namespace="IPython internal", obj=cmagic, parent=None, ) self.assertEqual(find, info) def test_ofind_property_with_error(self): class A(object): @property def foo(self): raise NotImplementedError() # pragma: no cover a = A() found = ip._ofind("a.foo", [("locals", locals())]) info = OInfo( found=True, isalias=False, ismagic=False, namespace="locals", obj=A.foo, parent=a, ) self.assertEqual(found, info) def test_ofind_multiple_attribute_lookups(self): class A(object): @property def foo(self): raise NotImplementedError() # pragma: no cover a = A() a.a = A() a.a.a = A() found = ip._ofind("a.a.a.foo", [("locals", locals())]) info = OInfo( found=True, isalias=False, ismagic=False, namespace="locals", obj=A.foo, parent=a.a.a, ) self.assertEqual(found, info) def test_ofind_slotted_attributes(self): class A(object): __slots__ = ['foo'] def __init__(self): self.foo = 'bar' a = A() found = ip._ofind("a.foo", [("locals", locals())]) info = OInfo( found=True, isalias=False, ismagic=False, namespace="locals", obj=a.foo, parent=a, ) self.assertEqual(found, info) found = ip._ofind("a.bar", [("locals", locals())]) expected = OInfo( found=False, isalias=False, ismagic=False, namespace=None, obj=None, parent=a, ) assert found == expected def test_ofind_prefers_property_to_instance_level_attribute(self): class A(object): @property def foo(self): return 'bar' a = A() a.__dict__["foo"] = "baz" self.assertEqual(a.foo, "bar") found = ip._ofind("a.foo", [("locals", locals())]) self.assertIs(found.obj, A.foo) def test_custom_syntaxerror_exception(self): called = [] def my_handler(shell, etype, value, tb, tb_offset=None): called.append(etype) shell.showtraceback((etype, value, tb), tb_offset=tb_offset) ip.set_custom_exc((SyntaxError,), my_handler) try: ip.run_cell("1f") # Check that this was called, and only once. self.assertEqual(called, [SyntaxError]) finally: # Reset the custom exception hook ip.set_custom_exc((), None) def test_custom_exception(self): called = [] def my_handler(shell, etype, value, tb, tb_offset=None): called.append(etype) shell.showtraceback((etype, value, tb), tb_offset=tb_offset) ip.set_custom_exc((ValueError,), my_handler) try: res = ip.run_cell("raise ValueError('test')") # Check that this was called, and only once. self.assertEqual(called, [ValueError]) # Check that the error is on the result object self.assertIsInstance(res.error_in_exec, ValueError) finally: # Reset the custom exception hook ip.set_custom_exc((), None) @mock.patch("builtins.print") def test_showtraceback_with_surrogates(self, mocked_print): values = [] def mock_print_func(value, sep=" ", end="\n", file=sys.stdout, flush=False): values.append(value) if value == chr(0xD8FF): raise UnicodeEncodeError("utf-8", chr(0xD8FF), 0, 1, "") # mock builtins.print mocked_print.side_effect = mock_print_func # ip._showtraceback() is replaced in globalipapp.py. # Call original method to test. interactiveshell.InteractiveShell._showtraceback(ip, None, None, chr(0xD8FF)) self.assertEqual(mocked_print.call_count, 2) self.assertEqual(values, [chr(0xD8FF), "\\ud8ff"]) def test_mktempfile(self): filename = ip.mktempfile() # Check that we can open the file again on Windows with open(filename, "w", encoding="utf-8") as f: f.write("abc") filename = ip.mktempfile(data="blah") with open(filename, "r", encoding="utf-8") as f: self.assertEqual(f.read(), "blah") def test_new_main_mod(self): # Smoketest to check that this accepts a unicode module name name = u'jiefmw' mod = ip.new_main_mod(u'%s.py' % name, name) self.assertEqual(mod.__name__, name) def test_get_exception_only(self): try: raise KeyboardInterrupt except KeyboardInterrupt: msg = ip.get_exception_only() self.assertEqual(msg, 'KeyboardInterrupt\n') try: raise DerivedInterrupt("foo") except KeyboardInterrupt: msg = ip.get_exception_only() self.assertEqual(msg, 'IPython.core.tests.test_interactiveshell.DerivedInterrupt: foo\n') def test_inspect_text(self): ip.run_cell('a = 5') text = ip.object_inspect_text('a') self.assertIsInstance(text, str) def test_last_execution_result(self): """ Check that last execution result gets set correctly (GH-10702) """ result = ip.run_cell('a = 5; a') self.assertTrue(ip.last_execution_succeeded) self.assertEqual(ip.last_execution_result.result, 5) result = ip.run_cell('a = x_invalid_id_x') self.assertFalse(ip.last_execution_succeeded) self.assertFalse(ip.last_execution_result.success) self.assertIsInstance(ip.last_execution_result.error_in_exec, NameError) def test_reset_aliasing(self): """ Check that standard posix aliases work after %reset. """ if os.name != 'posix': return ip.reset() for cmd in ('clear', 'more', 'less', 'man'): res = ip.run_cell('%' + cmd) self.assertEqual(res.success, True) @pytest.mark.skipif( sys.implementation.name == "pypy" and ((7, 3, 13) < sys.implementation.version < (7, 3, 16)), reason="Unicode issues with scandir on PyPy, see https://github.com/pypy/pypy/issues/4860", ) class TestSafeExecfileNonAsciiPath(unittest.TestCase): @onlyif_unicode_paths def setUp(self): self.BASETESTDIR = tempfile.mkdtemp() self.TESTDIR = join(self.BASETESTDIR, u"åäö") os.mkdir(self.TESTDIR) with open( join(self.TESTDIR, "åäötestscript.py"), "w", encoding="utf-8" ) as sfile: sfile.write("pass\n") self.oldpath = os.getcwd() os.chdir(self.TESTDIR) self.fname = u"åäötestscript.py" def tearDown(self): os.chdir(self.oldpath) shutil.rmtree(self.BASETESTDIR) @onlyif_unicode_paths def test_1(self): """Test safe_execfile with non-ascii path """ ip.safe_execfile(self.fname, {}, raise_exceptions=True) class ExitCodeChecks(tt.TempFileMixin): def setUp(self): self.system = ip.system_raw def test_exit_code_ok(self): self.system('exit 0') self.assertEqual(ip.user_ns['_exit_code'], 0) def test_exit_code_error(self): self.system('exit 1') self.assertEqual(ip.user_ns['_exit_code'], 1) @skipif(not hasattr(signal, 'SIGALRM')) def test_exit_code_signal(self): self.mktmp("import signal, time\n" "signal.setitimer(signal.ITIMER_REAL, 0.1)\n" "time.sleep(1)\n") self.system("%s %s" % (sys.executable, self.fname)) self.assertEqual(ip.user_ns['_exit_code'], -signal.SIGALRM) @onlyif_cmds_exist("csh") def test_exit_code_signal_csh(self): # pragma: no cover SHELL = os.environ.get("SHELL", None) os.environ["SHELL"] = find_cmd("csh") try: self.test_exit_code_signal() finally: if SHELL is not None: os.environ['SHELL'] = SHELL else: del os.environ['SHELL'] class TestSystemRaw(ExitCodeChecks): def setUp(self): super().setUp() self.system = ip.system_raw @onlyif_unicode_paths def test_1(self): """Test system_raw with non-ascii cmd """ cmd = u'''python -c "'åäö'" ''' ip.system_raw(cmd) @mock.patch('subprocess.call', side_effect=KeyboardInterrupt) @mock.patch('os.system', side_effect=KeyboardInterrupt) def test_control_c(self, *mocks): try: self.system("sleep 1 # won't happen") except KeyboardInterrupt: # pragma: no cove self.fail( "system call should intercept " "keyboard interrupt from subprocess.call" ) self.assertEqual(ip.user_ns["_exit_code"], -signal.SIGINT) @pytest.mark.parametrize("magic_cmd", ["pip", "conda", "cd"]) def test_magic_warnings(magic_cmd): if sys.platform == "win32": to_mock = "os.system" expected_arg, expected_kwargs = magic_cmd, dict() else: to_mock = "subprocess.call" expected_arg, expected_kwargs = magic_cmd, dict( shell=True, executable=os.environ.get("SHELL", None) ) with mock.patch(to_mock, return_value=0) as mock_sub: with pytest.warns(Warning, match=r"You executed the system command"): ip.system_raw(magic_cmd) mock_sub.assert_called_once_with(expected_arg, **expected_kwargs) # TODO: Exit codes are currently ignored on Windows. class TestSystemPipedExitCode(ExitCodeChecks): def setUp(self): super().setUp() self.system = ip.system_piped @skip_win32 def test_exit_code_ok(self): ExitCodeChecks.test_exit_code_ok(self) @skip_win32 def test_exit_code_error(self): ExitCodeChecks.test_exit_code_error(self) @skip_win32 def test_exit_code_signal(self): ExitCodeChecks.test_exit_code_signal(self) class TestModules(tt.TempFileMixin): def test_extraneous_loads(self): """Test we're not loading modules on startup that we shouldn't. """ self.mktmp("import sys\n" "print('numpy' in sys.modules)\n" "print('ipyparallel' in sys.modules)\n" "print('ipykernel' in sys.modules)\n" ) out = "False\nFalse\nFalse\n" tt.ipexec_validate(self.fname, out) class Negator(ast.NodeTransformer): """Negates all number literals in an AST.""" def visit_Num(self, node): node.value = -node.value return node def visit_Constant(self, node): if isinstance(node.value, int): return self.visit_Num(node) return node class TestAstTransform(unittest.TestCase): def setUp(self): self.negator = Negator() ip.ast_transformers.append(self.negator) def tearDown(self): ip.ast_transformers.remove(self.negator) def test_non_int_const(self): with tt.AssertPrints("hello"): ip.run_cell('print("hello")') def test_run_cell(self): with tt.AssertPrints("-34"): ip.run_cell("print(12 + 22)") # A named reference to a number shouldn't be transformed. ip.user_ns["n"] = 55 with tt.AssertNotPrints("-55"): ip.run_cell("print(n)") def test_timeit(self): called = set() def f(x): called.add(x) ip.push({'f':f}) with tt.AssertPrints("std. dev. of"): ip.run_line_magic("timeit", "-n1 f(1)") self.assertEqual(called, {-1}) called.clear() with tt.AssertPrints("std. dev. of"): ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)") self.assertEqual(called, {-2, -3}) def test_time(self): called = [] def f(x): called.append(x) ip.push({'f':f}) # Test with an expression with tt.AssertPrints("Wall time: "): ip.run_line_magic("time", "f(5+9)") self.assertEqual(called, [-14]) called[:] = [] # Test with a statement (different code path) with tt.AssertPrints("Wall time: "): ip.run_line_magic("time", "a = f(-3 + -2)") self.assertEqual(called, [5]) def test_macro(self): ip.push({'a':10}) # The AST transformation makes this do a+=-1 ip.define_macro("amacro", "a+=1\nprint(a)") with tt.AssertPrints("9"): ip.run_cell("amacro") with tt.AssertPrints("8"): ip.run_cell("amacro") class TestMiscTransform(unittest.TestCase): def test_transform_only_once(self): cleanup = 0 line_t = 0 def count_cleanup(lines): nonlocal cleanup cleanup += 1 return lines def count_line_t(lines): nonlocal line_t line_t += 1 return lines ip.input_transformer_manager.cleanup_transforms.append(count_cleanup) ip.input_transformer_manager.line_transforms.append(count_line_t) ip.run_cell('1') assert cleanup == 1 assert line_t == 1 class IntegerWrapper(ast.NodeTransformer): """Wraps all integers in a call to Integer()""" # for Python 3.7 and earlier # for Python 3.7 and earlier def visit_Num(self, node): if isinstance(node.n, int): return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()), args=[node], keywords=[]) return node # For Python 3.8+ def visit_Constant(self, node): if isinstance(node.value, int): return self.visit_Num(node) return node class TestAstTransform2(unittest.TestCase): def setUp(self): self.intwrapper = IntegerWrapper() ip.ast_transformers.append(self.intwrapper) self.calls = [] def Integer(*args): self.calls.append(args) return args ip.push({"Integer": Integer}) def tearDown(self): ip.ast_transformers.remove(self.intwrapper) del ip.user_ns['Integer'] def test_run_cell(self): ip.run_cell("n = 2") self.assertEqual(self.calls, [(2,)]) # This shouldn't throw an error ip.run_cell("o = 2.0") self.assertEqual(ip.user_ns['o'], 2.0) def test_run_cell_non_int(self): ip.run_cell("n = 'a'") assert self.calls == [] def test_timeit(self): called = set() def f(x): called.add(x) ip.push({'f':f}) with tt.AssertPrints("std. dev. of"): ip.run_line_magic("timeit", "-n1 f(1)") self.assertEqual(called, {(1,)}) called.clear() with tt.AssertPrints("std. dev. of"): ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)") self.assertEqual(called, {(2,), (3,)}) class ErrorTransformer(ast.NodeTransformer): """Throws an error when it sees a number.""" def visit_Constant(self, node): if isinstance(node.value, int): raise ValueError("test") return node class TestAstTransformError(unittest.TestCase): def test_unregistering(self): err_transformer = ErrorTransformer() ip.ast_transformers.append(err_transformer) with self.assertWarnsRegex(UserWarning, "It will be unregistered"): ip.run_cell("1 + 2") # This should have been removed. self.assertNotIn(err_transformer, ip.ast_transformers) class StringRejector(ast.NodeTransformer): """Throws an InputRejected when it sees a string literal. Used to verify that NodeTransformers can signal that a piece of code should not be executed by throwing an InputRejected. """ def visit_Constant(self, node): if isinstance(node.value, str): raise InputRejected("test") return node class TestAstTransformInputRejection(unittest.TestCase): def setUp(self): self.transformer = StringRejector() ip.ast_transformers.append(self.transformer) def tearDown(self): ip.ast_transformers.remove(self.transformer) def test_input_rejection(self): """Check that NodeTransformers can reject input.""" expect_exception_tb = tt.AssertPrints("InputRejected: test") expect_no_cell_output = tt.AssertNotPrints("'unsafe'", suppress=False) # Run the same check twice to verify that the transformer is not # disabled after raising. with expect_exception_tb, expect_no_cell_output: ip.run_cell("'unsafe'") with expect_exception_tb, expect_no_cell_output: res = ip.run_cell("'unsafe'") self.assertIsInstance(res.error_before_exec, InputRejected) def test__IPYTHON__(): # This shouldn't raise a NameError, that's all __IPYTHON__ class DummyRepr(object): def __repr__(self): return "DummyRepr" def _repr_html_(self): return "dummy" def _repr_javascript_(self): return "console.log('hi');", {'key': 'value'} def test_user_variables(): # enable all formatters ip.display_formatter.active_types = ip.display_formatter.format_types ip.user_ns['dummy'] = d = DummyRepr() keys = {'dummy', 'doesnotexist'} r = ip.user_expressions({ key:key for key in keys}) assert keys == set(r.keys()) dummy = r["dummy"] assert {"status", "data", "metadata"} == set(dummy.keys()) assert dummy["status"] == "ok" data = dummy["data"] metadata = dummy["metadata"] assert data.get("text/html") == d._repr_html_() js, jsmd = d._repr_javascript_() assert data.get("application/javascript") == js assert metadata.get("application/javascript") == jsmd dne = r["doesnotexist"] assert dne["status"] == "error" assert dne["ename"] == "NameError" # back to text only ip.display_formatter.active_types = ['text/plain'] def test_user_expression(): # enable all formatters ip.display_formatter.active_types = ip.display_formatter.format_types query = { 'a' : '1 + 2', 'b' : '1/0', } r = ip.user_expressions(query) import pprint pprint.pprint(r) assert set(r.keys()) == set(query.keys()) a = r["a"] assert {"status", "data", "metadata"} == set(a.keys()) assert a["status"] == "ok" data = a["data"] metadata = a["metadata"] assert data.get("text/plain") == "3" b = r["b"] assert b["status"] == "error" assert b["ename"] == "ZeroDivisionError" # back to text only ip.display_formatter.active_types = ['text/plain'] class TestSyntaxErrorTransformer(unittest.TestCase): """Check that SyntaxError raised by an input transformer is handled by run_cell()""" @staticmethod def transformer(lines): for line in lines: pos = line.find('syntaxerror') if pos >= 0: e = SyntaxError('input contains "syntaxerror"') e.text = line e.offset = pos + 1 raise e return lines def setUp(self): ip.input_transformers_post.append(self.transformer) def tearDown(self): ip.input_transformers_post.remove(self.transformer) def test_syntaxerror_input_transformer(self): with tt.AssertPrints('1234'): ip.run_cell('1234') with tt.AssertPrints('SyntaxError: invalid syntax'): ip.run_cell('1 2 3') # plain python syntax error with tt.AssertPrints('SyntaxError: input contains "syntaxerror"'): ip.run_cell('2345 # syntaxerror') # input transformer syntax error with tt.AssertPrints('3456'): ip.run_cell('3456') class TestWarningSuppression(unittest.TestCase): def test_warning_suppression(self): ip.run_cell("import warnings") try: with self.assertWarnsRegex(UserWarning, "asdf"): ip.run_cell("warnings.warn('asdf')") # Here's the real test -- if we run that again, we should get the # warning again. Traditionally, each warning was only issued once per # IPython session (approximately), even if the user typed in new and # different code that should have also triggered the warning, leading # to much confusion. with self.assertWarnsRegex(UserWarning, "asdf"): ip.run_cell("warnings.warn('asdf')") finally: ip.run_cell("del warnings") def test_deprecation_warning(self): ip.run_cell(""" import warnings def wrn(): warnings.warn( "I AM A WARNING", DeprecationWarning ) """) try: with self.assertWarnsRegex(DeprecationWarning, "I AM A WARNING"): ip.run_cell("wrn()") finally: ip.run_cell("del warnings") ip.run_cell("del wrn") class TestImportNoDeprecate(tt.TempFileMixin): def setUp(self): """Make a valid python temp file.""" self.mktmp(""" import warnings def wrn(): warnings.warn( "I AM A WARNING", DeprecationWarning ) """) super().setUp() def test_no_dep(self): """ No deprecation warning should be raised from imported functions """ ip.run_cell("from {} import wrn".format(self.fname)) with tt.AssertNotPrints("I AM A WARNING"): ip.run_cell("wrn()") ip.run_cell("del wrn") def test_custom_exc_count(): hook = mock.Mock(return_value=None) ip.set_custom_exc((SyntaxError,), hook) before = ip.execution_count ip.run_cell("def foo()", store_history=True) # restore default excepthook ip.set_custom_exc((), None) assert hook.call_count == 1 assert ip.execution_count == before + 1 def test_run_cell_async(): ip.run_cell("import asyncio") coro = ip.run_cell_async("await asyncio.sleep(0.01)\n5") assert asyncio.iscoroutine(coro) loop = asyncio.new_event_loop() result = loop.run_until_complete(coro) assert isinstance(result, interactiveshell.ExecutionResult) assert result.result == 5 def test_run_cell_await(): ip.run_cell("import asyncio") result = ip.run_cell("await asyncio.sleep(0.01); 10") assert ip.user_ns["_"] == 10 def test_run_cell_asyncio_run(): ip.run_cell("import asyncio") result = ip.run_cell("await asyncio.sleep(0.01); 1") assert ip.user_ns["_"] == 1 result = ip.run_cell("asyncio.run(asyncio.sleep(0.01)); 2") assert ip.user_ns["_"] == 2 result = ip.run_cell("await asyncio.sleep(0.01); 3") assert ip.user_ns["_"] == 3 def test_should_run_async(): assert not ip.should_run_async("a = 5", transformed_cell="a = 5") assert ip.should_run_async("await x", transformed_cell="await x") assert ip.should_run_async( "import asyncio; await asyncio.sleep(1)", transformed_cell="import asyncio; await asyncio.sleep(1)", ) def test_set_custom_completer(): num_completers = len(ip.Completer.matchers) def foo(*args, **kwargs): return "I'm a completer!" ip.set_custom_completer(foo, 0) # check that we've really added a new completer assert len(ip.Completer.matchers) == num_completers + 1 # check that the first completer is the function we defined assert ip.Completer.matchers[0]() == "I'm a completer!" # clean up ip.Completer.custom_matchers.pop() class TestShowTracebackAttack(unittest.TestCase): """Test that the interactive shell is resilient against the client attack of manipulating the showtracebacks method. These attacks shouldn't result in an unhandled exception in the kernel.""" def setUp(self): self.orig_showtraceback = interactiveshell.InteractiveShell.showtraceback def tearDown(self): interactiveshell.InteractiveShell.showtraceback = self.orig_showtraceback def test_set_show_tracebacks_none(self): """Test the case of the client setting showtracebacks to None""" result = ip.run_cell( """ import IPython.core.interactiveshell IPython.core.interactiveshell.InteractiveShell.showtraceback = None assert False, "This should not raise an exception" """ ) print(result) assert result.result is None assert isinstance(result.error_in_exec, TypeError) assert str(result.error_in_exec) == "'NoneType' object is not callable" def test_set_show_tracebacks_noop(self): """Test the case of the client setting showtracebacks to a no op lambda""" result = ip.run_cell( """ import IPython.core.interactiveshell IPython.core.interactiveshell.InteractiveShell.showtraceback = lambda *args, **kwargs: None assert False, "This should not raise an exception" """ ) print(result) assert result.result is None assert isinstance(result.error_in_exec, AssertionError) assert str(result.error_in_exec) == "This should not raise an exception" @skip_if_not_osx def test_enable_gui_osx(): simple_prompt = ip.simple_prompt ip.simple_prompt = False ip.enable_gui("osx") assert ip.active_eventloop == "osx" ip.enable_gui() # The following line fails for IPython <= 8.25.0 ip.enable_gui("macosx") assert ip.active_eventloop == "osx" ip.enable_gui() ip.simple_prompt = simple_prompt ipython-8.35.0/IPython/core/tests/test_iplib.py000066400000000000000000000150251477474304100215130ustar00rootroot00000000000000"""Tests for the key interactiveshell module, where the main ipython class is defined. """ import stack_data import sys SV_VERSION = tuple([int(x) for x in stack_data.__version__.split(".")[0:2]]) def test_reset(): """reset must clear most namespaces.""" # Check that reset runs without error ip.reset() # Once we've reset it (to clear of any junk that might have been there from # other tests, we can count how many variables are in the user's namespace nvars_user_ns = len(ip.user_ns) nvars_hidden = len(ip.user_ns_hidden) # Now add a few variables to user_ns, and check that reset clears them ip.user_ns['x'] = 1 ip.user_ns['y'] = 1 ip.reset() # Finally, check that all namespaces have only as many variables as we # expect to find in them: assert len(ip.user_ns) == nvars_user_ns assert len(ip.user_ns_hidden) == nvars_hidden # Tests for reporting of exceptions in various modes, handling of SystemExit, # and %tb functionality. This is really a mix of testing ultraTB and interactiveshell. def doctest_tb_plain(): """ In [18]: xmode plain Exception reporting mode: Plain In [19]: run simpleerr.py Traceback (most recent call last): File ...:... bar(mode) File ...:... in bar div0() File ...:... in div0 x/y ZeroDivisionError: ... """ def doctest_tb_context(): """ In [3]: xmode context Exception reporting mode: Context In [4]: run simpleerr.py --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) ... 30 except IndexError: 31 mode = 'div' ---> 33 bar(mode) ... in bar(mode) 15 "bar" 16 if mode=='div': ---> 17 div0() 18 elif mode=='exit': 19 try: ... in div0() 6 x = 1 7 y = 0 ----> 8 x/y ZeroDivisionError: ...""" def doctest_tb_verbose(): """ In [5]: xmode verbose Exception reporting mode: Verbose In [6]: run simpleerr.py --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) ... 30 except IndexError: 31 mode = 'div' ---> 33 bar(mode) mode = 'div' ... in bar(mode='div') 15 "bar" 16 if mode=='div': ---> 17 div0() 18 elif mode=='exit': 19 try: ... in div0() 6 x = 1 7 y = 0 ----> 8 x/y x = 1 y = 0 ZeroDivisionError: ... """ def doctest_tb_sysexit(): """ In [17]: %xmode plain Exception reporting mode: Plain In [18]: %run simpleerr.py exit An exception has occurred, use %tb to see the full traceback. SystemExit: (1, 'Mode = exit') In [19]: %run simpleerr.py exit 2 An exception has occurred, use %tb to see the full traceback. SystemExit: (2, 'Mode = exit') In [20]: %tb Traceback (most recent call last): File ...:... in execfile exec(compiler(f.read(), fname, "exec"), glob, loc) File ...:... bar(mode) File ...:... in bar sysexit(stat, mode) File ...:... in sysexit raise SystemExit(stat, f"Mode = {mode}") SystemExit: (2, 'Mode = exit') In [21]: %xmode context Exception reporting mode: Context In [22]: %tb --------------------------------------------------------------------------- SystemExit Traceback (most recent call last) File ..., in execfile(fname, glob, loc, compiler) ... with open(fname, "rb") as f: ... compiler = compiler or compile ---> ... exec(compiler(f.read(), fname, "exec"), glob, loc) ... 30 except IndexError: 31 mode = 'div' ---> 33 bar(mode) ...bar(mode) 21 except: 22 stat = 1 ---> 23 sysexit(stat, mode) 24 else: 25 raise ValueError('Unknown mode') ...sysexit(stat, mode) 10 def sysexit(stat, mode): ---> 11 raise SystemExit(stat, f"Mode = {mode}") SystemExit: (2, 'Mode = exit') """ if SV_VERSION < (0, 6): def doctest_tb_sysexit_verbose_stack_data_05(): """ In [18]: %run simpleerr.py exit An exception has occurred, use %tb to see the full traceback. SystemExit: (1, 'Mode = exit') In [19]: %run simpleerr.py exit 2 An exception has occurred, use %tb to see the full traceback. SystemExit: (2, 'Mode = exit') In [23]: %xmode verbose Exception reporting mode: Verbose In [24]: %tb --------------------------------------------------------------------------- SystemExit Traceback (most recent call last) ... 30 except IndexError: 31 mode = 'div' ---> 33 bar(mode) mode = 'exit' ... in bar(mode='exit') ... except: ... stat = 1 ---> ... sysexit(stat, mode) mode = 'exit' stat = 2 ... else: ... raise ValueError('Unknown mode') ... in sysexit(stat=2, mode='exit') 10 def sysexit(stat, mode): ---> 11 raise SystemExit(stat, f"Mode = {mode}") stat = 2 SystemExit: (2, 'Mode = exit') """ def test_run_cell(): import textwrap ip.run_cell("a = 10\na+=1") ip.run_cell("assert a == 11\nassert 1") assert ip.user_ns["a"] == 11 complex = textwrap.dedent( """ if 1: print "hello" if 1: print "world" if 2: print "foo" if 3: print "bar" if 4: print "bar" """ ) # Simply verifies that this kind of input is run ip.run_cell(complex) def test_db(): """Test the internal database used for variable persistence.""" ip.db["__unittest_"] = 12 assert ip.db["__unittest_"] == 12 del ip.db["__unittest_"] assert "__unittest_" not in ip.db ipython-8.35.0/IPython/core/tests/test_logger.py000066400000000000000000000014241477474304100216710ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Test IPython.core.logger""" import os.path import pytest from tempfile import TemporaryDirectory def test_logstart_inaccessible_file(): with pytest.raises(IOError): _ip.logger.logstart(logfname="/") # Opening that filename will fail. try: _ip.run_cell("a=1") # Check it doesn't try to log this finally: _ip.logger.log_active = False # If this fails, don't let later tests fail def test_logstart_unicode(): with TemporaryDirectory() as tdir: logfname = os.path.join(tdir, "test_unicode.log") _ip.run_cell("'abc€'") try: _ip.run_line_magic("logstart", "-to %s" % logfname) _ip.run_cell("'abc€'") finally: _ip.logger.logstop() ipython-8.35.0/IPython/core/tests/test_magic.py000066400000000000000000001324531477474304100215010ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Tests for various magic functions.""" import gc import io import os import re import shlex import signal import sys import warnings from importlib import invalidate_caches from io import StringIO from pathlib import Path from time import sleep from threading import Thread from subprocess import CalledProcessError from textwrap import dedent from time import sleep from threading import Thread from unittest import TestCase, mock import pytest from IPython import get_ipython from IPython.core import magic from IPython.core.error import UsageError from IPython.core.magic import ( Magics, cell_magic, line_magic, magics_class, register_cell_magic, register_line_magic, ) from IPython.core.magics import code, execution, logging, osm, script from IPython.testing import decorators as dec from IPython.testing import tools as tt from IPython.utils.io import capture_output from IPython.utils.process import find_cmd from IPython.utils.tempdir import TemporaryDirectory, TemporaryWorkingDirectory from IPython.utils.syspathcontext import prepended_to_syspath from .test_debugger import PdbTestInput from tempfile import NamedTemporaryFile @magic.magics_class class DummyMagics(magic.Magics): pass def test_extract_code_ranges(): instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :" expected = [ (0, 1), (2, 3), (4, 6), (6, 9), (9, 14), (16, None), (None, 9), (9, None), (None, 13), (None, None), ] actual = list(code.extract_code_ranges(instr)) assert actual == expected def test_extract_symbols(): source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n""" symbols_args = ["a", "b", "A", "A,b", "A,a", "z"] expected = [([], ['a']), (["def b():\n return 42\n"], []), (["class A: pass\n"], []), (["class A: pass\n", "def b():\n return 42\n"], []), (["class A: pass\n"], ['a']), ([], ['z'])] for symbols, exp in zip(symbols_args, expected): assert code.extract_symbols(source, symbols) == exp def test_extract_symbols_raises_exception_with_non_python_code(): source = ("=begin A Ruby program :)=end\n" "def hello\n" "puts 'Hello world'\n" "end") with pytest.raises(SyntaxError): code.extract_symbols(source, "hello") def test_magic_not_found(): # magic not found raises UsageError with pytest.raises(UsageError): _ip.run_line_magic("doesntexist", "") # ensure result isn't success when a magic isn't found result = _ip.run_cell('%doesntexist') assert isinstance(result.error_in_exec, UsageError) def test_cell_magic_not_found(): # magic not found raises UsageError with pytest.raises(UsageError): _ip.run_cell_magic('doesntexist', 'line', 'cell') # ensure result isn't success when a magic isn't found result = _ip.run_cell('%%doesntexist') assert isinstance(result.error_in_exec, UsageError) def test_magic_error_status(): def fail(shell): 1/0 _ip.register_magic_function(fail) result = _ip.run_cell('%fail') assert isinstance(result.error_in_exec, ZeroDivisionError) def test_config(): """ test that config magic does not raise can happen if Configurable init is moved too early into Magics.__init__ as then a Config object will be registered as a magic. """ ## should not raise. _ip.run_line_magic("config", "") def test_config_available_configs(): """ test that config magic prints available configs in unique and sorted order. """ with capture_output() as captured: _ip.run_line_magic("config", "") stdout = captured.stdout config_classes = stdout.strip().split('\n')[1:] assert config_classes == sorted(set(config_classes)) def test_config_print_class(): """ test that config with a classname prints the class's options. """ with capture_output() as captured: _ip.run_line_magic("config", "TerminalInteractiveShell") stdout = captured.stdout assert re.match( "TerminalInteractiveShell.* options", stdout.splitlines()[0] ), f"{stdout}\n\n1st line of stdout not like 'TerminalInteractiveShell.* options'" def test_rehashx(): # clear up everything _ip.alias_manager.clear_aliases() del _ip.db['syscmdlist'] _ip.run_line_magic("rehashx", "") # Practically ALL ipython development systems will have more than 10 aliases assert len(_ip.alias_manager.aliases) > 10 for name, cmd in _ip.alias_manager.aliases: # we must strip dots from alias names assert "." not in name # rehashx must fill up syscmdlist scoms = _ip.db['syscmdlist'] assert len(scoms) > 10 def test_magic_parse_options(): """Test that we don't mangle paths when parsing magic options.""" ip = get_ipython() path = 'c:\\x' m = DummyMagics(ip) opts = m.parse_options('-f %s' % path,'f:')[0] # argv splitting is os-dependent if os.name == 'posix': expected = 'c:x' else: expected = path assert opts["f"] == expected def test_magic_parse_long_options(): """Magic.parse_options can handle --foo=bar long options""" ip = get_ipython() m = DummyMagics(ip) opts, _ = m.parse_options("--foo --bar=bubble", "a", "foo", "bar=") assert "foo" in opts assert "bar" in opts assert opts["bar"] == "bubble" def doctest_hist_f(): """Test %hist -f with temporary filename. In [9]: import tempfile In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-') In [11]: %hist -nl -f $tfile 3 In [13]: import os; os.unlink(tfile) """ def doctest_hist_op(): """Test %hist -op In [1]: class b(float): ...: pass ...: In [2]: class s(object): ...: def __str__(self): ...: return 's' ...: In [3]: In [4]: class r(b): ...: def __repr__(self): ...: return 'r' ...: In [5]: class sr(s,r): pass ...: In [6]: In [7]: bb=b() In [8]: ss=s() In [9]: rr=r() In [10]: ssrr=sr() In [11]: 4.5 Out[11]: 4.5 In [12]: str(ss) Out[12]: 's' In [13]: In [14]: %hist -op >>> class b: ... pass ... >>> class s(b): ... def __str__(self): ... return 's' ... >>> >>> class r(b): ... def __repr__(self): ... return 'r' ... >>> class sr(s,r): pass >>> >>> bb=b() >>> ss=s() >>> rr=r() >>> ssrr=sr() >>> 4.5 4.5 >>> str(ss) 's' >>> """ def test_hist_pof(): ip = get_ipython() ip.run_cell("1+2", store_history=True) #raise Exception(ip.history_manager.session_number) #raise Exception(list(ip.history_manager._get_range_session())) with TemporaryDirectory() as td: tf = os.path.join(td, 'hist.py') ip.run_line_magic('history', '-pof %s' % tf) assert os.path.isfile(tf) def test_macro(): ip = get_ipython() ip.history_manager.reset() # Clear any existing history. cmds = ["a=1", "def b():\n return a**2", "print(a,b())"] for i, cmd in enumerate(cmds, start=1): ip.history_manager.store_inputs(i, cmd) ip.run_line_magic("macro", "test 1-3") assert ip.user_ns["test"].value == "\n".join(cmds) + "\n" # List macros assert "test" in ip.run_line_magic("macro", "") def test_macro_run(): """Test that we can run a multi-line macro successfully.""" ip = get_ipython() ip.history_manager.reset() cmds = ["a=10", "a+=1", "print(a)", "%macro test 2-3"] for cmd in cmds: ip.run_cell(cmd, store_history=True) assert ip.user_ns["test"].value == "a+=1\nprint(a)\n" with tt.AssertPrints("12"): ip.run_cell("test") with tt.AssertPrints("13"): ip.run_cell("test") def test_magic_magic(): """Test %magic""" ip = get_ipython() with capture_output() as captured: ip.run_line_magic("magic", "") stdout = captured.stdout assert "%magic" in stdout assert "IPython" in stdout assert "Available" in stdout @dec.skipif_not_numpy def test_numpy_reset_array_undec(): "Test '%reset array' functionality" _ip.ex("import numpy as np") _ip.ex("a = np.empty(2)") assert "a" in _ip.user_ns _ip.run_line_magic("reset", "-f array") assert "a" not in _ip.user_ns def test_reset_out(): "Test '%reset out' magic" _ip.run_cell("parrot = 'dead'", store_history=True) # test '%reset -f out', make an Out prompt _ip.run_cell("parrot", store_history=True) assert "dead" in [_ip.user_ns[x] for x in ("_", "__", "___")] _ip.run_line_magic("reset", "-f out") assert "dead" not in [_ip.user_ns[x] for x in ("_", "__", "___")] assert len(_ip.user_ns["Out"]) == 0 def test_reset_in(): "Test '%reset in' magic" # test '%reset -f in' _ip.run_cell("parrot", store_history=True) assert "parrot" in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] _ip.run_line_magic("reset", "-f in") assert "parrot" not in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] assert len(set(_ip.user_ns["In"])) == 1 def test_reset_dhist(): "Test '%reset dhist' magic" _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing _ip.run_line_magic("cd", os.path.dirname(pytest.__file__)) _ip.run_line_magic("cd", "-") assert len(_ip.user_ns["_dh"]) > 0 _ip.run_line_magic("reset", "-f dhist") assert len(_ip.user_ns["_dh"]) == 0 _ip.run_cell("_dh = [d for d in tmp]") # restore def test_reset_in_length(): "Test that '%reset in' preserves In[] length" _ip.run_cell("print 'foo'") _ip.run_cell("reset -f in") assert len(_ip.user_ns["In"]) == _ip.displayhook.prompt_count + 1 class TestResetErrors(TestCase): def test_reset_redefine(self): @magics_class class KernelMagics(Magics): @line_magic def less(self, shell): pass _ip.register_magics(KernelMagics) with self.assertLogs() as cm: # hack, we want to just capture logs, but assertLogs fails if not # logs get produce. # so log one things we ignore. import logging as log_mod log = log_mod.getLogger() log.info('Nothing') # end hack. _ip.run_cell("reset -f") assert len(cm.output) == 1 for out in cm.output: assert "Invalid alias" not in out def test_tb_syntaxerror(): """test %tb after a SyntaxError""" ip = get_ipython() ip.run_cell("for") # trap and validate stdout save_stdout = sys.stdout try: sys.stdout = StringIO() ip.run_cell("%tb") out = sys.stdout.getvalue() finally: sys.stdout = save_stdout # trim output, and only check the last line last_line = out.rstrip().splitlines()[-1].strip() assert last_line == "SyntaxError: invalid syntax" def test_time(): ip = get_ipython() with tt.AssertPrints("Wall time: "): ip.run_cell("%time None") ip.run_cell("def f(kmjy):\n" " %time print (2*kmjy)") with tt.AssertPrints("Wall time: "): with tt.AssertPrints("hihi", suppress=False): ip.run_cell("f('hi')") # ';' at the end of %time prevents instruction value to be printed. # This tests fix for #13837. def test_time_no_output_with_semicolon(): ip = get_ipython() # Test %time cases with tt.AssertPrints(" 123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%time 123000+456") with tt.AssertNotPrints(" 123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%time 123000+456;") with tt.AssertPrints(" 123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%time 123000+456 # Comment") with tt.AssertNotPrints(" 123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%time 123000+456; # Comment") with tt.AssertPrints(" 123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%time 123000+456 # ;Comment") # Test %%time cases with tt.AssertPrints("123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%%time\n123000+456\n\n\n") with tt.AssertNotPrints("123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%%time\n123000+456;\n\n\n") with tt.AssertPrints("123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%%time\n123000+456 # Comment\n\n\n") with tt.AssertNotPrints("123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%%time\n123000+456; # Comment\n\n\n") with tt.AssertPrints("123456"): with tt.AssertPrints("Wall time: ", suppress=False): with tt.AssertPrints("CPU times: ", suppress=False): ip.run_cell("%%time\n123000+456 # ;Comment\n\n\n") def test_time_last_not_expression(): ip.run_cell("%%time\n" "var_1 = 1\n" "var_2 = 2\n") assert ip.user_ns['var_1'] == 1 del ip.user_ns['var_1'] assert ip.user_ns['var_2'] == 2 del ip.user_ns['var_2'] @dec.skip_win32 def test_time2(): ip = get_ipython() with tt.AssertPrints("CPU times: user "): ip.run_cell("%time None") def test_time3(): """Erroneous magic function calls, issue gh-3334""" ip = get_ipython() ip.user_ns.pop('run', None) with tt.AssertNotPrints("not found", channel='stderr'): ip.run_cell("%%time\n" "run = 0\n" "run += 1") def test_multiline_time(): """Make sure last statement from time return a value.""" ip = get_ipython() ip.user_ns.pop('run', None) ip.run_cell( dedent( """\ %%time a = "ho" b = "hey" a+b """ ) ) assert ip.user_ns_hidden["_"] == "hohey" def test_time_local_ns(): """ Test that local_ns is actually global_ns when running a cell magic """ ip = get_ipython() ip.run_cell("%%time\n" "myvar = 1") assert ip.user_ns["myvar"] == 1 del ip.user_ns["myvar"] def test_time_microseconds_display(): """Ensure ASCII is used when necessary""" with mock.patch("sys.stdout", io.TextIOWrapper(StringIO(), encoding="utf-8")): assert execution._format_time(0.000001) == "1 \u03bcs" with mock.patch("sys.stdout", io.TextIOWrapper(StringIO(), encoding="ascii")): assert execution._format_time(0.000001) == "1 us" # Test %%capture magic. Added to test issue #13926 def test_capture(): ip = get_ipython() # Test %%capture nominal case ip.run_cell("%%capture abc\n1+2") with tt.AssertPrints("True", suppress=False): ip.run_cell("'abc' in locals()") with tt.AssertPrints("True", suppress=False): ip.run_cell("'outputs' in dir(abc)") with tt.AssertPrints("3", suppress=False): ip.run_cell("abc.outputs[0]") # Test %%capture with ';' at end of expression ip.run_cell("%%capture abc\n7+8;") with tt.AssertPrints("False", suppress=False): ip.run_cell("'abc' in locals()") def test_doctest_mode(): "Toggle doctest_mode twice, it should be a no-op and run without error" _ip.run_line_magic("doctest_mode", "") _ip.run_line_magic("doctest_mode", "") def test_parse_options(): """Tests for basic options parsing in magics.""" # These are only the most minimal of tests, more should be added later. At # the very least we check that basic text/unicode calls work OK. m = DummyMagics(_ip) assert m.parse_options("foo", "")[1] == "foo" assert m.parse_options("foo", "")[1] == "foo" def test_parse_options_preserve_non_option_string(): """Test to assert preservation of non-option part of magic-block, while parsing magic options.""" m = DummyMagics(_ip) opts, stmt = m.parse_options( " -n1 -r 13 _ = 314 + foo", "n:r:", preserve_non_opts=True ) assert opts == {"n": "1", "r": "13"} assert stmt == "_ = 314 + foo" def test_run_magic_preserve_code_block(): """Test to assert preservation of non-option part of magic-block, while running magic.""" _ip.user_ns["spaces"] = [] _ip.run_line_magic( "timeit", "-n1 -r1 spaces.append([s.count(' ') for s in ['document']])" ) assert _ip.user_ns["spaces"] == [[0]] def test_dirops(): """Test various directory handling operations.""" # curpath = lambda :os.path.splitdrive(os.getcwd())[1].replace('\\','/') curpath = os.getcwd startdir = os.getcwd() ipdir = os.path.realpath(_ip.ipython_dir) try: _ip.run_line_magic("cd", '"%s"' % ipdir) assert curpath() == ipdir _ip.run_line_magic("cd", "-") assert curpath() == startdir _ip.run_line_magic("pushd", '"%s"' % ipdir) assert curpath() == ipdir _ip.run_line_magic("popd", "") assert curpath() == startdir finally: os.chdir(startdir) def test_cd_force_quiet(): """Test OSMagics.cd_force_quiet option""" _ip.config.OSMagics.cd_force_quiet = True osmagics = osm.OSMagics(shell=_ip) startdir = os.getcwd() ipdir = os.path.realpath(_ip.ipython_dir) try: with tt.AssertNotPrints(ipdir): osmagics.cd('"%s"' % ipdir) with tt.AssertNotPrints(startdir): osmagics.cd('-') finally: os.chdir(startdir) def test_xmode(): # Calling xmode three times should be a no-op xmode = _ip.InteractiveTB.mode for i in range(4): _ip.run_line_magic("xmode", "") assert _ip.InteractiveTB.mode == xmode def test_reset_hard(): monitor = [] class A(object): def __del__(self): monitor.append(1) def __repr__(self): return "" _ip.user_ns["a"] = A() _ip.run_cell("a") assert monitor == [] _ip.run_line_magic("reset", "-f") assert monitor == [1] class TestXdel(tt.TempFileMixin): def test_xdel(self): """Test that references from %run are cleared by xdel.""" src = ("class A(object):\n" " monitor = []\n" " def __del__(self):\n" " self.monitor.append(1)\n" "a = A()\n") self.mktmp(src) # %run creates some hidden references... _ip.run_line_magic("run", "%s" % self.fname) # ... as does the displayhook. _ip.run_cell("a") monitor = _ip.user_ns["A"].monitor assert monitor == [] _ip.run_line_magic("xdel", "a") # Check that a's __del__ method has been called. gc.collect(0) assert monitor == [1] def doctest_who(): """doctest for %who In [1]: %reset -sf In [2]: alpha = 123 In [3]: beta = 'beta' In [4]: %who int alpha In [5]: %who str beta In [6]: %whos Variable Type Data/Info ---------------------------- alpha int 123 beta str beta In [7]: %who_ls Out[7]: ['alpha', 'beta'] """ def test_whos(): """Check that whos is protected against objects where repr() fails.""" class A(object): def __repr__(self): raise Exception() _ip.user_ns['a'] = A() _ip.run_line_magic("whos", "") def doctest_precision(): """doctest for %precision In [1]: f = get_ipython().display_formatter.formatters['text/plain'] In [2]: %precision 5 Out[2]: '%.5f' In [3]: f.float_format Out[3]: '%.5f' In [4]: %precision %e Out[4]: '%e' In [5]: f(3.1415927) Out[5]: '3.141593e+00' """ def test_debug_magic(): """Test debugging a small code with %debug In [1]: with PdbTestInput(['c']): ...: %debug print("a b") #doctest: +ELLIPSIS ...: ... ipdb> c a b In [2]: """ def test_debug_magic_locals(): """Test debugging a small code with %debug with locals In [1]: with PdbTestInput(['c']): ...: def fun(): ...: res = 1 ...: %debug print(res) ...: fun() ...: ... ipdb> c 1 In [2]: """ def test_psearch(): with tt.AssertPrints("dict.fromkeys"): _ip.run_cell("dict.fr*?") with tt.AssertPrints("π.is_integer"): _ip.run_cell("π = 3.14;\nπ.is_integ*?") def test_timeit_shlex(): """test shlex issues with timeit (#1109)""" _ip.ex("def f(*a,**kw): pass") _ip.run_line_magic("timeit", '-n1 "this is a bug".count(" ")') _ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1)') _ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1, " ", 2, " ")') _ip.run_line_magic("timeit", '-r1 -n1 ("a " + "b")') _ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b")') _ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b ")') def test_timeit_special_syntax(): "Test %%timeit with IPython special syntax" @register_line_magic def lmagic(line): ip = get_ipython() ip.user_ns['lmagic_out'] = line # line mode test _ip.run_line_magic("timeit", "-n1 -r1 %lmagic my line") assert _ip.user_ns["lmagic_out"] == "my line" # cell mode test _ip.run_cell_magic("timeit", "-n1 -r1", "%lmagic my line2") assert _ip.user_ns["lmagic_out"] == "my line2" def test_timeit_return(): """ test whether timeit -o return object """ res = _ip.run_line_magic('timeit','-n10 -r10 -o 1') assert(res is not None) def test_timeit_quiet(): """ test quiet option of timeit magic """ with tt.AssertNotPrints("loops"): _ip.run_cell("%timeit -n1 -r1 -q 1") def test_timeit_return_quiet(): with tt.AssertNotPrints("loops"): res = _ip.run_line_magic('timeit', '-n1 -r1 -q -o 1') assert (res is not None) def test_timeit_invalid_return(): with pytest.raises(SyntaxError): _ip.run_line_magic('timeit', 'return') @dec.skipif(execution.profile is None) def test_prun_special_syntax(): "Test %%prun with IPython special syntax" @register_line_magic def lmagic(line): ip = get_ipython() ip.user_ns['lmagic_out'] = line # line mode test _ip.run_line_magic("prun", "-q %lmagic my line") assert _ip.user_ns["lmagic_out"] == "my line" # cell mode test _ip.run_cell_magic("prun", "-q", "%lmagic my line2") assert _ip.user_ns["lmagic_out"] == "my line2" @dec.skipif(execution.profile is None) def test_prun_quotes(): "Test that prun does not clobber string escapes (GH #1302)" _ip.run_line_magic("prun", r"-q x = '\t'") assert _ip.user_ns["x"] == "\t" def test_extension(): # Debugging information for failures of this test print('sys.path:') for p in sys.path: print(' ', p) print('CWD', os.getcwd()) pytest.raises(ImportError, _ip.run_line_magic, "load_ext", "daft_extension") daft_path = os.path.join(os.path.dirname(__file__), "daft_extension") sys.path.insert(0, daft_path) try: _ip.user_ns.pop('arq', None) invalidate_caches() # Clear import caches _ip.run_line_magic("load_ext", "daft_extension") assert _ip.user_ns["arq"] == 185 _ip.run_line_magic("unload_ext", "daft_extension") assert 'arq' not in _ip.user_ns finally: sys.path.remove(daft_path) def test_notebook_export_json(): pytest.importorskip("nbformat") _ip = get_ipython() _ip.history_manager.reset() # Clear any existing history. cmds = ["a=1", "def b():\n return a**2", "print('noël, été', b())"] for i, cmd in enumerate(cmds, start=1): _ip.history_manager.store_inputs(i, cmd) with TemporaryDirectory() as td: outfile = os.path.join(td, "nb.ipynb") _ip.run_line_magic("notebook", "%s" % outfile) class TestEnv(TestCase): def test_env(self): env = _ip.run_line_magic("env", "") self.assertTrue(isinstance(env, dict)) def test_env_secret(self): env = _ip.run_line_magic("env", "") hidden = "" with mock.patch.dict( os.environ, { "API_KEY": "abc123", "SECRET_THING": "ssshhh", "JUPYTER_TOKEN": "", "VAR": "abc" } ): env = _ip.run_line_magic("env", "") assert env["API_KEY"] == hidden assert env["SECRET_THING"] == hidden assert env["JUPYTER_TOKEN"] == hidden assert env["VAR"] == "abc" def test_env_get_set_simple(self): env = _ip.run_line_magic("env", "var val1") self.assertEqual(env, None) self.assertEqual(os.environ["var"], "val1") self.assertEqual(_ip.run_line_magic("env", "var"), "val1") env = _ip.run_line_magic("env", "var=val2") self.assertEqual(env, None) self.assertEqual(os.environ['var'], 'val2') def test_env_get_set_complex(self): env = _ip.run_line_magic("env", "var 'val1 '' 'val2") self.assertEqual(env, None) self.assertEqual(os.environ['var'], "'val1 '' 'val2") self.assertEqual(_ip.run_line_magic("env", "var"), "'val1 '' 'val2") env = _ip.run_line_magic("env", 'var=val2 val3="val4') self.assertEqual(env, None) self.assertEqual(os.environ['var'], 'val2 val3="val4') def test_env_set_bad_input(self): self.assertRaises(UsageError, lambda: _ip.run_line_magic("set_env", "var")) def test_env_set_whitespace(self): self.assertRaises(UsageError, lambda: _ip.run_line_magic("env", "var A=B")) class CellMagicTestCase(TestCase): def check_ident(self, magic): # Manually called, we get the result out = _ip.run_cell_magic(magic, "a", "b") assert out == ("a", "b") # Via run_cell, it goes into the user's namespace via displayhook _ip.run_cell("%%" + magic + " c\nd\n") assert _ip.user_ns["_"] == ("c", "d\n") def test_cell_magic_func_deco(self): "Cell magic using simple decorator" @register_cell_magic def cellm(line, cell): return line, cell self.check_ident('cellm') def test_cell_magic_reg(self): "Cell magic manually registered" def cellm(line, cell): return line, cell _ip.register_magic_function(cellm, 'cell', 'cellm2') self.check_ident('cellm2') def test_cell_magic_class(self): "Cell magics declared via a class" @magics_class class MyMagics(Magics): @cell_magic def cellm3(self, line, cell): return line, cell _ip.register_magics(MyMagics) self.check_ident('cellm3') def test_cell_magic_class2(self): "Cell magics declared via a class, #2" @magics_class class MyMagics2(Magics): @cell_magic('cellm4') def cellm33(self, line, cell): return line, cell _ip.register_magics(MyMagics2) self.check_ident('cellm4') # Check that nothing is registered as 'cellm33' c33 = _ip.find_cell_magic('cellm33') assert c33 == None def test_file(): """Basic %%writefile""" ip = get_ipython() with TemporaryDirectory() as td: fname = os.path.join(td, "file1") ip.run_cell_magic( "writefile", fname, "\n".join( [ "line1", "line2", ] ), ) s = Path(fname).read_text(encoding="utf-8") assert "line1\n" in s assert "line2" in s @dec.skip_win32 def test_file_single_quote(): """Basic %%writefile with embedded single quotes""" ip = get_ipython() with TemporaryDirectory() as td: fname = os.path.join(td, "'file1'") ip.run_cell_magic( "writefile", fname, "\n".join( [ "line1", "line2", ] ), ) s = Path(fname).read_text(encoding="utf-8") assert "line1\n" in s assert "line2" in s @dec.skip_win32 def test_file_double_quote(): """Basic %%writefile with embedded double quotes""" ip = get_ipython() with TemporaryDirectory() as td: fname = os.path.join(td, '"file1"') ip.run_cell_magic( "writefile", fname, "\n".join( [ "line1", "line2", ] ), ) s = Path(fname).read_text(encoding="utf-8") assert "line1\n" in s assert "line2" in s def test_file_var_expand(): """%%writefile $filename""" ip = get_ipython() with TemporaryDirectory() as td: fname = os.path.join(td, "file1") ip.user_ns["filename"] = fname ip.run_cell_magic( "writefile", "$filename", "\n".join( [ "line1", "line2", ] ), ) s = Path(fname).read_text(encoding="utf-8") assert "line1\n" in s assert "line2" in s def test_file_unicode(): """%%writefile with unicode cell""" ip = get_ipython() with TemporaryDirectory() as td: fname = os.path.join(td, 'file1') ip.run_cell_magic("writefile", fname, u'\n'.join([ u'liné1', u'liné2', ])) with io.open(fname, encoding='utf-8') as f: s = f.read() assert "liné1\n" in s assert "liné2" in s def test_file_amend(): """%%writefile -a amends files""" ip = get_ipython() with TemporaryDirectory() as td: fname = os.path.join(td, "file2") ip.run_cell_magic( "writefile", fname, "\n".join( [ "line1", "line2", ] ), ) ip.run_cell_magic( "writefile", "-a %s" % fname, "\n".join( [ "line3", "line4", ] ), ) s = Path(fname).read_text(encoding="utf-8") assert "line1\n" in s assert "line3\n" in s def test_file_spaces(): """%%file with spaces in filename""" ip = get_ipython() with TemporaryWorkingDirectory() as td: fname = "file name" ip.run_cell_magic( "file", '"%s"' % fname, "\n".join( [ "line1", "line2", ] ), ) s = Path(fname).read_text(encoding="utf-8") assert "line1\n" in s assert "line2" in s def test_script_config(): ip = get_ipython() ip.config.ScriptMagics.script_magics = ['whoda'] sm = script.ScriptMagics(shell=ip) assert "whoda" in sm.magics["cell"] def _interrupt_after_1s(): sleep(1) signal.raise_signal(signal.SIGINT) def test_script_raise_on_interrupt(): ip = get_ipython() with pytest.raises(CalledProcessError): thread = Thread(target=_interrupt_after_1s) thread.start() ip.run_cell_magic( "script", f"{sys.executable}", "from time import sleep; sleep(2)" ) thread.join() def test_script_do_not_raise_on_interrupt(): ip = get_ipython() thread = Thread(target=_interrupt_after_1s) thread.start() ip.run_cell_magic( "script", f"--no-raise-error {sys.executable}", "from time import sleep; sleep(2)", ) thread.join() def test_script_out(): ip = get_ipython() ip.run_cell_magic("script", f"--out output {sys.executable}", "print('hi')") assert ip.user_ns["output"].strip() == "hi" def test_script_err(): ip = get_ipython() ip.run_cell_magic( "script", f"--err error {sys.executable}", "import sys; print('hello', file=sys.stderr)", ) assert ip.user_ns["error"].strip() == "hello" def test_script_out_err(): ip = get_ipython() ip.run_cell_magic( "script", f"--out output --err error {sys.executable}", "\n".join( [ "import sys", "print('hi')", "print('hello', file=sys.stderr)", ] ), ) assert ip.user_ns["output"].strip() == "hi" assert ip.user_ns["error"].strip() == "hello" async def test_script_bg_out(): ip = get_ipython() ip.run_cell_magic("script", f"--bg --out output {sys.executable}", "print('hi')") assert (await ip.user_ns["output"].read()).strip() == b"hi" assert ip.user_ns["output"].at_eof() async def test_script_bg_err(): ip = get_ipython() ip.run_cell_magic( "script", f"--bg --err error {sys.executable}", "import sys; print('hello', file=sys.stderr)", ) assert (await ip.user_ns["error"].read()).strip() == b"hello" assert ip.user_ns["error"].at_eof() async def test_script_bg_out_err(): ip = get_ipython() ip.run_cell_magic( "script", f"--bg --out output --err error {sys.executable}", "\n".join( [ "import sys", "print('hi')", "print('hello', file=sys.stderr)", ] ), ) assert (await ip.user_ns["output"].read()).strip() == b"hi" assert (await ip.user_ns["error"].read()).strip() == b"hello" assert ip.user_ns["output"].at_eof() assert ip.user_ns["error"].at_eof() async def test_script_bg_proc(): ip = get_ipython() ip.run_cell_magic( "script", f"--bg --out output --proc p {sys.executable}", "\n".join( [ "import sys", "print('hi')", "print('hello', file=sys.stderr)", ] ), ) p = ip.user_ns["p"] await p.wait() assert p.returncode == 0 assert (await p.stdout.read()).strip() == b"hi" # not captured, so empty assert (await p.stderr.read()) == b"" assert p.stdout.at_eof() assert p.stderr.at_eof() def test_script_defaults(): ip = get_ipython() for cmd in ['sh', 'bash', 'perl', 'ruby']: try: find_cmd(cmd) except Exception: pass else: assert cmd in ip.magics_manager.magics["cell"] async def test_script_streams_continiously(capsys): ip = get_ipython() # Windows is slow to start up a thread on CI is_windows = os.name == "nt" step = 3 if is_windows else 1 code = dedent( f"""\ import time for _ in range(3): time.sleep({step}) print(".", flush=True, end="") """ ) def print_numbers(): for i in range(3): sleep(step) print(i, flush=True, end="") thread = Thread(target=print_numbers) thread.start() sleep(step / 2) ip.run_cell_magic("script", f"{sys.executable}", code) thread.join() captured = capsys.readouterr() # If the streaming was line-wise or broken # we would get `012...` assert captured.out == "0.1.2." @magics_class class FooFoo(Magics): """class with both %foo and %%foo magics""" @line_magic('foo') def line_foo(self, line): "I am line foo" pass @cell_magic("foo") def cell_foo(self, line, cell): "I am cell foo, not line foo" pass def test_line_cell_info(): """%%foo and %foo magics are distinguishable to inspect""" ip = get_ipython() ip.magics_manager.register(FooFoo) oinfo = ip.object_inspect("foo") assert oinfo["found"] is True assert oinfo["ismagic"] is True oinfo = ip.object_inspect("%%foo") assert oinfo["found"] is True assert oinfo["ismagic"] is True assert oinfo["docstring"] == FooFoo.cell_foo.__doc__ oinfo = ip.object_inspect("%foo") assert oinfo["found"] is True assert oinfo["ismagic"] is True assert oinfo["docstring"] == FooFoo.line_foo.__doc__ def test_multiple_magics(): ip = get_ipython() foo1 = FooFoo(ip) foo2 = FooFoo(ip) mm = ip.magics_manager mm.register(foo1) assert mm.magics["line"]["foo"].__self__ is foo1 mm.register(foo2) assert mm.magics["line"]["foo"].__self__ is foo2 def test_alias_magic(): """Test %alias_magic.""" ip = get_ipython() mm = ip.magics_manager # Basic operation: both cell and line magics are created, if possible. ip.run_line_magic("alias_magic", "timeit_alias timeit") assert "timeit_alias" in mm.magics["line"] assert "timeit_alias" in mm.magics["cell"] # --cell is specified, line magic not created. ip.run_line_magic("alias_magic", "--cell timeit_cell_alias timeit") assert "timeit_cell_alias" not in mm.magics["line"] assert "timeit_cell_alias" in mm.magics["cell"] # Test that line alias is created successfully. ip.run_line_magic("alias_magic", "--line env_alias env") assert ip.run_line_magic("env", "") == ip.run_line_magic("env_alias", "") # Test that line alias with parameters passed in is created successfully. ip.run_line_magic( "alias_magic", "--line history_alias history --params " + shlex.quote("3") ) assert "history_alias" in mm.magics["line"] def test_save(): """Test %save.""" ip = get_ipython() ip.history_manager.reset() # Clear any existing history. cmds = ["a=1", "def b():\n return a**2", "print(a, b())"] for i, cmd in enumerate(cmds, start=1): ip.history_manager.store_inputs(i, cmd) with TemporaryDirectory() as tmpdir: file = os.path.join(tmpdir, "testsave.py") ip.run_line_magic("save", "%s 1-10" % file) content = Path(file).read_text(encoding="utf-8") assert content.count(cmds[0]) == 1 assert "coding: utf-8" in content ip.run_line_magic("save", "-a %s 1-10" % file) content = Path(file).read_text(encoding="utf-8") assert content.count(cmds[0]) == 2 assert "coding: utf-8" in content def test_save_with_no_args(): ip = get_ipython() ip.history_manager.reset() # Clear any existing history. cmds = ["a=1", "def b():\n return a**2", "print(a, b())", "%save"] for i, cmd in enumerate(cmds, start=1): ip.history_manager.store_inputs(i, cmd) with TemporaryDirectory() as tmpdir: path = os.path.join(tmpdir, "testsave.py") ip.run_line_magic("save", path) content = Path(path).read_text(encoding="utf-8") expected_content = dedent( """\ # coding: utf-8 a=1 def b(): return a**2 print(a, b()) """ ) assert content == expected_content def test_store(): """Test %store.""" ip = get_ipython() ip.run_line_magic('load_ext', 'storemagic') # make sure the storage is empty ip.run_line_magic("store", "-z") ip.user_ns["var"] = 42 ip.run_line_magic("store", "var") ip.user_ns["var"] = 39 ip.run_line_magic("store", "-r") assert ip.user_ns["var"] == 42 ip.run_line_magic("store", "-d var") ip.user_ns["var"] = 39 ip.run_line_magic("store", "-r") assert ip.user_ns["var"] == 39 def _run_edit_test(arg_s, exp_filename=None, exp_lineno=-1, exp_contents=None, exp_is_temp=None): ip = get_ipython() M = code.CodeMagics(ip) last_call = ['',''] opts,args = M.parse_options(arg_s,'prxn:') filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call) if exp_filename is not None: assert exp_filename == filename if exp_contents is not None: with io.open(filename, 'r', encoding='utf-8') as f: contents = f.read() assert exp_contents == contents if exp_lineno != -1: assert exp_lineno == lineno if exp_is_temp is not None: assert exp_is_temp == is_temp def test_edit_interactive(): """%edit on interactively defined objects""" ip = get_ipython() n = ip.execution_count ip.run_cell("def foo(): return 1", store_history=True) with pytest.raises(code.InteractivelyDefined) as e: _run_edit_test("foo") assert e.value.index == n def test_edit_cell(): """%edit [cell id]""" ip = get_ipython() ip.run_cell("def foo(): return 1", store_history=True) # test _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True) def test_edit_fname(): """%edit file""" # test _run_edit_test("test file.py", exp_filename="test file.py") def test_bookmark(): ip = get_ipython() ip.run_line_magic('bookmark', 'bmname') with tt.AssertPrints('bmname'): ip.run_line_magic('bookmark', '-l') ip.run_line_magic('bookmark', '-d bmname') def test_ls_magic(): ip = get_ipython() json_formatter = ip.display_formatter.formatters['application/json'] json_formatter.enabled = True lsmagic = ip.run_line_magic("lsmagic", "") with warnings.catch_warnings(record=True) as w: j = json_formatter(lsmagic) assert sorted(j) == ["cell", "line"] assert w == [] # no warnings def test_strip_initial_indent(): def sii(s): lines = s.splitlines() return '\n'.join(code.strip_initial_indent(lines)) assert sii(" a = 1\nb = 2") == "a = 1\nb = 2" assert sii(" a\n b\nc") == "a\n b\nc" assert sii("a\n b") == "a\n b" def test_logging_magic_quiet_from_arg(): _ip.config.LoggingMagics.quiet = False lm = logging.LoggingMagics(shell=_ip) with TemporaryDirectory() as td: try: with tt.AssertNotPrints(re.compile("Activating.*")): lm.logstart('-q {}'.format( os.path.join(td, "quiet_from_arg.log"))) finally: _ip.logger.logstop() def test_logging_magic_quiet_from_config(): _ip.config.LoggingMagics.quiet = True lm = logging.LoggingMagics(shell=_ip) with TemporaryDirectory() as td: try: with tt.AssertNotPrints(re.compile("Activating.*")): lm.logstart(os.path.join(td, "quiet_from_config.log")) finally: _ip.logger.logstop() def test_logging_magic_not_quiet(): _ip.config.LoggingMagics.quiet = False lm = logging.LoggingMagics(shell=_ip) with TemporaryDirectory() as td: try: with tt.AssertPrints(re.compile("Activating.*")): lm.logstart(os.path.join(td, "not_quiet.log")) finally: _ip.logger.logstop() def test_time_no_var_expand(): _ip.user_ns["a"] = 5 _ip.user_ns["b"] = [] _ip.run_line_magic("time", 'b.append("{a}")') assert _ip.user_ns["b"] == ["{a}"] # this is slow, put at the end for local testing. def test_timeit_arguments(): "Test valid timeit arguments, should not cause SyntaxError (GH #1269)" _ip.run_line_magic("timeit", "-n1 -r1 a=('#')") MINIMAL_LAZY_MAGIC = """ from IPython.core.magic import ( Magics, magics_class, line_magic, cell_magic, ) @magics_class class LazyMagics(Magics): @line_magic def lazy_line(self, line): print("Lazy Line") @cell_magic def lazy_cell(self, line, cell): print("Lazy Cell") def load_ipython_extension(ipython): ipython.register_magics(LazyMagics) """ def test_lazy_magics(): with pytest.raises(UsageError): ip.run_line_magic("lazy_line", "") startdir = os.getcwd() with TemporaryDirectory() as tmpdir: with prepended_to_syspath(tmpdir): ptempdir = Path(tmpdir) tf = ptempdir / "lazy_magic_module.py" tf.write_text(MINIMAL_LAZY_MAGIC) ip.magics_manager.register_lazy("lazy_line", Path(tf.name).name[:-3]) with tt.AssertPrints("Lazy Line"): ip.run_line_magic("lazy_line", "") TEST_MODULE = """ print('Loaded my_tmp') if __name__ == "__main__": print('I just ran a script') """ def test_run_module_from_import_hook(): "Test that a module can be loaded via an import hook" with TemporaryDirectory() as tmpdir: fullpath = os.path.join(tmpdir, "my_tmp.py") Path(fullpath).write_text(TEST_MODULE, encoding="utf-8") import importlib.abc import importlib.util class MyTempImporter(importlib.abc.MetaPathFinder, importlib.abc.SourceLoader): def find_spec(self, fullname, path, target=None): if fullname == "my_tmp": return importlib.util.spec_from_loader(fullname, self) def get_filename(self, fullname): assert fullname == "my_tmp" return fullpath def get_data(self, path): assert Path(path).samefile(fullpath) return Path(fullpath).read_text(encoding="utf-8") sys.meta_path.insert(0, MyTempImporter()) with capture_output() as captured: _ip.run_line_magic("run", "-m my_tmp") _ip.run_cell("import my_tmp") output = "Loaded my_tmp\nI just ran a script\nLoaded my_tmp\n" assert output == captured.stdout sys.meta_path.pop(0) ipython-8.35.0/IPython/core/tests/test_magic_arguments.py000066400000000000000000000115101477474304100235540ustar00rootroot00000000000000#----------------------------------------------------------------------------- # Copyright (C) 2010-2011, IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- import argparse import sys from IPython.core.magic_arguments import (argument, argument_group, kwds, magic_arguments, parse_argstring, real_name) LEADING_SPACE = "" if sys.version_info > (3, 13) else " " @magic_arguments() @argument('-f', '--foo', help="an argument") def magic_foo1(self, args): """ A docstring. """ return parse_argstring(magic_foo1, args) @magic_arguments() def magic_foo2(self, args): """ A docstring. """ return parse_argstring(magic_foo2, args) @magic_arguments() @argument('-f', '--foo', help="an argument") @argument_group('Group') @argument('-b', '--bar', help="a grouped argument") @argument_group('Second Group') @argument('-z', '--baz', help="another grouped argument") def magic_foo3(self, args): """ A docstring. """ return parse_argstring(magic_foo3, args) @magic_arguments() @kwds(argument_default=argparse.SUPPRESS) @argument('-f', '--foo', help="an argument") def magic_foo4(self, args): """ A docstring. """ return parse_argstring(magic_foo4, args) @magic_arguments('frobnicate') @argument('-f', '--foo', help="an argument") def magic_foo5(self, args): """ A docstring. """ return parse_argstring(magic_foo5, args) @magic_arguments() @argument('-f', '--foo', help="an argument") def magic_magic_foo(self, args): """ A docstring. """ return parse_argstring(magic_magic_foo, args) @magic_arguments() @argument('-f', '--foo', help="an argument") def foo(self, args): """ A docstring. """ return parse_argstring(foo, args) def test_magic_arguments(): # “optional arguments” was replaced with “options” in argparse help # https://docs.python.org/3/whatsnew/3.10.html#argparse # https://bugs.python.org/issue9694 options = "optional arguments" if sys.version_info < (3, 10) else "options" assert ( magic_foo1.__doc__ == f"::\n\n %foo1 [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" ) assert getattr(magic_foo1, "argcmd_name", None) == None assert real_name(magic_foo1) == "foo1" assert magic_foo1(None, "") == argparse.Namespace(foo=None) assert hasattr(magic_foo1, "has_arguments") assert magic_foo2.__doc__ == f"::\n\n %foo2\n\n{LEADING_SPACE}A docstring.\n" assert getattr(magic_foo2, "argcmd_name", None) == None assert real_name(magic_foo2) == "foo2" assert magic_foo2(None, "") == argparse.Namespace() assert hasattr(magic_foo2, "has_arguments") assert ( magic_foo3.__doc__ == f"::\n\n %foo3 [-f FOO] [-b BAR] [-z BAZ]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n\nGroup:\n -b BAR, --bar BAR a grouped argument\n\nSecond Group:\n -z BAZ, --baz BAZ another grouped argument\n" ) assert getattr(magic_foo3, "argcmd_name", None) == None assert real_name(magic_foo3) == "foo3" assert magic_foo3(None, "") == argparse.Namespace(bar=None, baz=None, foo=None) assert hasattr(magic_foo3, "has_arguments") assert ( magic_foo4.__doc__ == f"::\n\n %foo4 [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" ) assert getattr(magic_foo4, "argcmd_name", None) == None assert real_name(magic_foo4) == "foo4" assert magic_foo4(None, "") == argparse.Namespace() assert hasattr(magic_foo4, "has_arguments") assert ( magic_foo5.__doc__ == f"::\n\n %frobnicate [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" ) assert getattr(magic_foo5, "argcmd_name", None) == "frobnicate" assert real_name(magic_foo5) == "frobnicate" assert magic_foo5(None, "") == argparse.Namespace(foo=None) assert hasattr(magic_foo5, "has_arguments") assert ( magic_magic_foo.__doc__ == f"::\n\n %magic_foo [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" ) assert getattr(magic_magic_foo, "argcmd_name", None) == None assert real_name(magic_magic_foo) == "magic_foo" assert magic_magic_foo(None, "") == argparse.Namespace(foo=None) assert hasattr(magic_magic_foo, "has_arguments") assert ( foo.__doc__ == f"::\n\n %foo [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" ) assert getattr(foo, "argcmd_name", None) == None assert real_name(foo) == "foo" assert foo(None, "") == argparse.Namespace(foo=None) assert hasattr(foo, "has_arguments") ipython-8.35.0/IPython/core/tests/test_magic_terminal.py000066400000000000000000000135541477474304100233740ustar00rootroot00000000000000"""Tests for various magic functions specific to the terminal frontend.""" #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import sys from io import StringIO from unittest import TestCase from IPython.testing import tools as tt #----------------------------------------------------------------------------- # Test functions begin #----------------------------------------------------------------------------- MINIMAL_LAZY_MAGIC = """ from IPython.core.magic import ( Magics, magics_class, line_magic, cell_magic, ) @magics_class class LazyMagics(Magics): @line_magic def lazy_line(self, line): print("Lazy Line") @cell_magic def lazy_cell(self, line, cell): print("Lazy Cell") def load_ipython_extension(ipython): ipython.register_magics(LazyMagics) """ def check_cpaste(code, should_fail=False): """Execute code via 'cpaste' and ensure it was executed, unless should_fail is set. """ ip.user_ns['code_ran'] = False src = StringIO() src.write(code) src.write('\n--\n') src.seek(0) stdin_save = sys.stdin sys.stdin = src try: context = tt.AssertPrints if should_fail else tt.AssertNotPrints with context("Traceback (most recent call last)"): ip.run_line_magic("cpaste", "") if not should_fail: assert ip.user_ns['code_ran'], "%r failed" % code finally: sys.stdin = stdin_save def test_cpaste(): """Test cpaste magic""" def runf(): """Marker function: sets a flag when executed. """ ip.user_ns['code_ran'] = True return 'runf' # return string so '+ runf()' doesn't result in success tests = {'pass': ["runf()", "In [1]: runf()", "In [1]: if 1:\n ...: runf()", "> > > runf()", ">>> runf()", " >>> runf()", ], 'fail': ["1 + runf()", "++ runf()", ]} ip.user_ns['runf'] = runf for code in tests['pass']: check_cpaste(code) for code in tests['fail']: check_cpaste(code, should_fail=True) class PasteTestCase(TestCase): """Multiple tests for clipboard pasting""" def paste(self, txt, flags='-q'): """Paste input text, by default in quiet mode""" ip.hooks.clipboard_get = lambda: txt ip.run_line_magic("paste", flags) def setUp(self): # Inject fake clipboard hook but save original so we can restore it later self.original_clip = ip.hooks.clipboard_get def tearDown(self): # Restore original hook ip.hooks.clipboard_get = self.original_clip def test_paste(self): ip.user_ns.pop("x", None) self.paste("x = 1") self.assertEqual(ip.user_ns["x"], 1) ip.user_ns.pop("x") def test_paste_pyprompt(self): ip.user_ns.pop("x", None) self.paste(">>> x=2") self.assertEqual(ip.user_ns["x"], 2) ip.user_ns.pop("x") def test_paste_py_multi(self): self.paste( """ >>> x = [1,2,3] >>> y = [] >>> for i in x: ... y.append(i**2) ... """ ) self.assertEqual(ip.user_ns["x"], [1, 2, 3]) self.assertEqual(ip.user_ns["y"], [1, 4, 9]) def test_paste_py_multi_r(self): "Now, test that self.paste -r works" self.test_paste_py_multi() self.assertEqual(ip.user_ns.pop("x"), [1, 2, 3]) self.assertEqual(ip.user_ns.pop("y"), [1, 4, 9]) self.assertFalse("x" in ip.user_ns) ip.run_line_magic("paste", "-r") self.assertEqual(ip.user_ns["x"], [1, 2, 3]) self.assertEqual(ip.user_ns["y"], [1, 4, 9]) def test_paste_email(self): "Test pasting of email-quoted contents" self.paste( """\ >> def foo(x): >> return x + 1 >> xx = foo(1.1)""" ) self.assertEqual(ip.user_ns["xx"], 2.1) def test_paste_email2(self): "Email again; some programs add a space also at each quoting level" self.paste( """\ > > def foo(x): > > return x + 1 > > yy = foo(2.1) """ ) self.assertEqual(ip.user_ns["yy"], 3.1) def test_paste_email_py(self): "Email quoting of interactive input" self.paste( """\ >> >>> def f(x): >> ... return x+1 >> ... >> >>> zz = f(2.5) """ ) self.assertEqual(ip.user_ns["zz"], 3.5) def test_paste_echo(self): "Also test self.paste echoing, by temporarily faking the writer" w = StringIO() old_write = sys.stdout.write sys.stdout.write = w.write code = """ a = 100 b = 200""" try: self.paste(code,'') out = w.getvalue() finally: sys.stdout.write = old_write self.assertEqual(ip.user_ns["a"], 100) self.assertEqual(ip.user_ns["b"], 200) assert out == code + "\n## -- End pasted text --\n" def test_paste_leading_commas(self): "Test multiline strings with leading commas" tm = ip.magics_manager.registry['TerminalMagics'] s = '''\ a = """ ,1,2,3 """''' ip.user_ns.pop("foo", None) tm.store_or_execute(s, "foo") self.assertIn("foo", ip.user_ns) def test_paste_trailing_question(self): "Test pasting sources with trailing question marks" tm = ip.magics_manager.registry['TerminalMagics'] s = '''\ def funcfoo(): if True: #am i true? return 'fooresult' ''' ip.user_ns.pop('funcfoo', None) self.paste(s) self.assertEqual(ip.user_ns["funcfoo"](), "fooresult") ipython-8.35.0/IPython/core/tests/test_oinspect.py000066400000000000000000000371531477474304100222460ustar00rootroot00000000000000"""Tests for the object inspection functionality. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from contextlib import contextmanager from inspect import signature, Signature, Parameter import inspect import os import pytest import re import sys from .. import oinspect from decorator import decorator from IPython.testing.tools import AssertPrints, AssertNotPrints from IPython.utils.path import compress_user #----------------------------------------------------------------------------- # Globals and constants #----------------------------------------------------------------------------- inspector = None def setup_module(): global inspector inspector = oinspect.Inspector() class SourceModuleMainTest: __module__ = "__main__" #----------------------------------------------------------------------------- # Local utilities #----------------------------------------------------------------------------- # WARNING: since this test checks the line number where a function is # defined, if any code is inserted above, the following line will need to be # updated. Do NOT insert any whitespace between the next line and the function # definition below. THIS_LINE_NUMBER = 47 # Put here the actual number of this line def test_find_source_lines(): assert oinspect.find_source_lines(test_find_source_lines) == THIS_LINE_NUMBER + 3 assert oinspect.find_source_lines(type) is None assert oinspect.find_source_lines(SourceModuleMainTest) is None assert oinspect.find_source_lines(SourceModuleMainTest()) is None def test_getsource(): assert oinspect.getsource(type) is None assert oinspect.getsource(SourceModuleMainTest) is None assert oinspect.getsource(SourceModuleMainTest()) is None def test_inspect_getfile_raises_exception(): """Check oinspect.find_file/getsource/find_source_lines expectations""" with pytest.raises(TypeError): inspect.getfile(type) with pytest.raises(OSError): inspect.getfile(SourceModuleMainTest) # A couple of utilities to ensure these tests work the same from a source or a # binary install def pyfile(fname): return os.path.normcase(re.sub('.py[co]$', '.py', fname)) def match_pyfiles(f1, f2): assert pyfile(f1) == pyfile(f2) def test_find_file(): match_pyfiles(oinspect.find_file(test_find_file), os.path.abspath(__file__)) assert oinspect.find_file(type) is None assert oinspect.find_file(SourceModuleMainTest) is None assert oinspect.find_file(SourceModuleMainTest()) is None def test_find_file_decorated1(): @decorator def noop1(f): def wrapper(*a, **kw): return f(*a, **kw) return wrapper @noop1 def f(x): "My docstring" match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__)) assert f.__doc__ == "My docstring" def test_find_file_decorated2(): @decorator def noop2(f, *a, **kw): return f(*a, **kw) @noop2 @noop2 @noop2 def f(x): "My docstring 2" match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__)) assert f.__doc__ == "My docstring 2" def test_find_file_magic(): run = ip.find_line_magic('run') assert oinspect.find_file(run) is not None # A few generic objects we can then inspect in the tests below class Call(object): """This is the class docstring.""" def __init__(self, x, y=1): """This is the constructor docstring.""" def __call__(self, *a, **kw): """This is the call docstring.""" def method(self, x, z=2): """Some method's docstring""" class HasSignature(object): """This is the class docstring.""" __signature__ = Signature([Parameter('test', Parameter.POSITIONAL_OR_KEYWORD)]) def __init__(self, *args): """This is the init docstring""" class SimpleClass(object): def method(self, x, z=2): """Some method's docstring""" class Awkward(object): def __getattr__(self, name): raise Exception(name) class NoBoolCall: """ callable with `__bool__` raising should still be inspect-able. """ def __call__(self): """does nothing""" pass def __bool__(self): """just raise NotImplemented""" raise NotImplementedError('Must be implemented') class SerialLiar(object): """Attribute accesses always get another copy of the same class. unittest.mock.call does something similar, but it's not ideal for testing as the failure mode is to eat all your RAM. This gives up after 10k levels. """ def __init__(self, max_fibbing_twig, lies_told=0): if lies_told > 10000: raise RuntimeError('Nose too long, honesty is the best policy') self.max_fibbing_twig = max_fibbing_twig self.lies_told = lies_told max_fibbing_twig[0] = max(max_fibbing_twig[0], lies_told) def __getattr__(self, item): return SerialLiar(self.max_fibbing_twig, self.lies_told + 1) #----------------------------------------------------------------------------- # Tests #----------------------------------------------------------------------------- def test_info(): "Check that Inspector.info fills out various fields as expected." i = inspector.info(Call, oname="Call") assert i["type_name"] == "type" expected_class = str(type(type)) # (Python 3) or assert i["base_class"] == expected_class assert re.search( "", i["string_form"], ) fname = __file__ if fname.endswith(".pyc"): fname = fname[:-1] # case-insensitive comparison needed on some filesystems # e.g. Windows: assert i["file"].lower() == compress_user(fname).lower() assert i["definition"] == None assert i["docstring"] == Call.__doc__ assert i["source"] == None assert i["isclass"] is True assert i["init_definition"] == "Call(x, y=1)" assert i["init_docstring"] == Call.__init__.__doc__ i = inspector.info(Call, detail_level=1) assert i["source"] is not None assert i["docstring"] == None c = Call(1) c.__doc__ = "Modified instance docstring" i = inspector.info(c) assert i["type_name"] == "Call" assert i["docstring"] == "Modified instance docstring" assert i["class_docstring"] == Call.__doc__ assert i["init_docstring"] == Call.__init__.__doc__ assert i["call_docstring"] == Call.__call__.__doc__ def test_class_signature(): info = inspector.info(HasSignature, "HasSignature") assert info["init_definition"] == "HasSignature(test)" assert info["init_docstring"] == HasSignature.__init__.__doc__ def test_info_awkward(): # Just test that this doesn't throw an error. inspector.info(Awkward()) def test_bool_raise(): inspector.info(NoBoolCall()) def test_info_serialliar(): fib_tracker = [0] inspector.info(SerialLiar(fib_tracker)) # Nested attribute access should be cut off at 100 levels deep to avoid # infinite loops: https://github.com/ipython/ipython/issues/9122 assert fib_tracker[0] < 9000 def support_function_one(x, y=2, *a, **kw): """A simple function.""" def test_calldef_none(): # We should ignore __call__ for all of these. for obj in [support_function_one, SimpleClass().method, any, str.upper]: i = inspector.info(obj) assert i["call_def"] is None def f_kwarg(pos, *, kwonly): pass def test_definition_kwonlyargs(): i = inspector.info(f_kwarg, oname="f_kwarg") # analysis:ignore assert i["definition"] == "f_kwarg(pos, *, kwonly)" def test_getdoc(): class A(object): """standard docstring""" pass class B(object): """standard docstring""" def getdoc(self): return "custom docstring" class C(object): """standard docstring""" def getdoc(self): return None a = A() b = B() c = C() assert oinspect.getdoc(a) == "standard docstring" assert oinspect.getdoc(b) == "custom docstring" assert oinspect.getdoc(c) == "standard docstring" def test_empty_property_has_no_source(): i = inspector.info(property(), detail_level=1) assert i["source"] is None def test_property_sources(): # A simple adder whose source and signature stays # the same across Python distributions def simple_add(a, b): "Adds two numbers" return a + b class A(object): @property def foo(self): return 'bar' foo = foo.setter(lambda self, v: setattr(self, 'bar', v)) dname = property(oinspect.getdoc) adder = property(simple_add) i = inspector.info(A.foo, detail_level=1) assert "def foo(self):" in i["source"] assert "lambda self, v:" in i["source"] i = inspector.info(A.dname, detail_level=1) assert "def getdoc(obj)" in i["source"] i = inspector.info(A.adder, detail_level=1) assert "def simple_add(a, b)" in i["source"] def test_property_docstring_is_in_info_for_detail_level_0(): class A(object): @property def foobar(self): """This is `foobar` property.""" pass ip.user_ns["a_obj"] = A() assert ( "This is `foobar` property." == ip.object_inspect("a_obj.foobar", detail_level=0)["docstring"] ) ip.user_ns["a_cls"] = A assert ( "This is `foobar` property." == ip.object_inspect("a_cls.foobar", detail_level=0)["docstring"] ) def test_pdef(): # See gh-1914 def foo(): pass inspector.pdef(foo, 'foo') @contextmanager def cleanup_user_ns(**kwargs): """ On exit delete all the keys that were not in user_ns before entering. It does not restore old values ! Parameters ---------- **kwargs used to update ip.user_ns """ try: known = set(ip.user_ns.keys()) ip.user_ns.update(kwargs) yield finally: added = set(ip.user_ns.keys()) - known for k in added: del ip.user_ns[k] def test_pinfo_bool_raise(): """ Test that bool method is not called on parent. """ class RaiseBool: attr = None def __bool__(self): raise ValueError("pinfo should not access this method") raise_bool = RaiseBool() with cleanup_user_ns(raise_bool=raise_bool): ip._inspect("pinfo", "raise_bool.attr", detail_level=0) def test_pinfo_getindex(): def dummy(): """ MARKER """ container = [dummy] with cleanup_user_ns(container=container): with AssertPrints("MARKER"): ip._inspect("pinfo", "container[0]", detail_level=0) assert "container" not in ip.user_ns.keys() def test_qmark_getindex(): def dummy(): """ MARKER 2 """ container = [dummy] with cleanup_user_ns(container=container): with AssertPrints("MARKER 2"): ip.run_cell("container[0]?") assert "container" not in ip.user_ns.keys() def test_qmark_getindex_negatif(): def dummy(): """ MARKER 3 """ container = [dummy] with cleanup_user_ns(container=container): with AssertPrints("MARKER 3"): ip.run_cell("container[-1]?") assert "container" not in ip.user_ns.keys() def test_pinfo_nonascii(): # See gh-1177 from . import nonascii2 ip.user_ns['nonascii2'] = nonascii2 ip._inspect('pinfo', 'nonascii2', detail_level=1) def test_pinfo_type(): """ type can fail in various edge case, for example `type.__subclass__()` """ ip._inspect('pinfo', 'type') def test_pinfo_docstring_no_source(): """Docstring should be included with detail_level=1 if there is no source""" with AssertPrints('Docstring:'): ip._inspect('pinfo', 'str.format', detail_level=0) with AssertPrints('Docstring:'): ip._inspect('pinfo', 'str.format', detail_level=1) def test_pinfo_no_docstring_if_source(): """Docstring should not be included with detail_level=1 if source is found""" def foo(): """foo has a docstring""" ip.user_ns['foo'] = foo with AssertPrints('Docstring:'): ip._inspect('pinfo', 'foo', detail_level=0) with AssertPrints('Source:'): ip._inspect('pinfo', 'foo', detail_level=1) with AssertNotPrints('Docstring:'): ip._inspect('pinfo', 'foo', detail_level=1) def test_pinfo_docstring_if_detail_and_no_source(): """ Docstring should be displayed if source info not available """ obj_def = '''class Foo(object): """ This is a docstring for Foo """ def bar(self): """ This is a docstring for Foo.bar """ pass ''' ip.run_cell(obj_def) ip.run_cell('foo = Foo()') with AssertNotPrints("Source:"): with AssertPrints('Docstring:'): ip._inspect('pinfo', 'foo', detail_level=0) with AssertPrints('Docstring:'): ip._inspect('pinfo', 'foo', detail_level=1) with AssertPrints('Docstring:'): ip._inspect('pinfo', 'foo.bar', detail_level=0) with AssertNotPrints('Docstring:'): with AssertPrints('Source:'): ip._inspect('pinfo', 'foo.bar', detail_level=1) @pytest.mark.xfail( sys.version_info.releaselevel not in ("final", "candidate"), reason="fails on 3.13.dev", strict=True, ) def test_pinfo_docstring_dynamic(capsys): obj_def = """class Bar: __custom_documentations__ = { "prop" : "cdoc for prop", "non_exist" : "cdoc for non_exist", } @property def prop(self): ''' Docstring for prop ''' return self._prop @prop.setter def prop(self, v): self._prop = v """ ip.run_cell(obj_def) ip.run_cell("b = Bar()") ip.run_line_magic("pinfo", "b.prop") captured = capsys.readouterr() assert re.search(r"Docstring:\s+cdoc for prop", captured.out) ip.run_line_magic("pinfo", "b.non_exist") captured = capsys.readouterr() assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) ip.run_cell("b.prop?") captured = capsys.readouterr() assert re.search(r"Docstring:\s+cdoc for prop", captured.out) ip.run_cell("b.non_exist?") captured = capsys.readouterr() assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) ip.run_cell("b.undefined?") captured = capsys.readouterr() assert re.search(r"Type:\s+NoneType", captured.out) def test_pinfo_magic(): with AssertPrints("Docstring:"): ip._inspect("pinfo", "lsmagic", detail_level=0) with AssertPrints("Source:"): ip._inspect("pinfo", "lsmagic", detail_level=1) def test_init_colors(): # ensure colors are not present in signature info info = inspector.info(HasSignature) init_def = info["init_definition"] assert "[0m" not in init_def def test_builtin_init(): info = inspector.info(list) init_def = info['init_definition'] assert init_def is not None def test_render_signature_short(): def short_fun(a=1): pass sig = oinspect._render_signature( signature(short_fun), short_fun.__name__, ) assert sig == "short_fun(a=1)" def test_render_signature_long(): from typing import Optional def long_function( a_really_long_parameter: int, and_another_long_one: bool = False, let_us_make_sure_this_is_looong: Optional[str] = None, ) -> bool: pass sig = oinspect._render_signature( signature(long_function), long_function.__name__, ) expected = """\ long_function( a_really_long_parameter: int, and_another_long_one: bool = False, let_us_make_sure_this_is_looong: Optional[str] = None, ) -> bool\ """ assert sig == expected ipython-8.35.0/IPython/core/tests/test_page.py000066400000000000000000000014041477474304100213240ustar00rootroot00000000000000#----------------------------------------------------------------------------- # Copyright (C) 2010-2011 The IPython Development Team. # # Distributed under the terms of the BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- import io # N.B. For the test suite, page.page is overridden (see IPython.testing.globalipapp) from IPython.core import page def test_detect_screen_size(): """Simple smoketest for page._detect_screen_size.""" try: page._detect_screen_size(True, 25) except (TypeError, io.UnsupportedOperation): # This can happen in the test suite, because stdout may not have a # fileno. pass ipython-8.35.0/IPython/core/tests/test_paths.py000066400000000000000000000157241477474304100215410ustar00rootroot00000000000000import errno import os import shutil import tempfile import warnings from unittest.mock import patch from tempfile import TemporaryDirectory from testpath import assert_isdir, assert_isfile, modified_env from IPython import paths from IPython.testing.decorators import skip_win32 TMP_TEST_DIR = os.path.realpath(tempfile.mkdtemp()) HOME_TEST_DIR = os.path.join(TMP_TEST_DIR, "home_test_dir") XDG_TEST_DIR = os.path.join(HOME_TEST_DIR, "xdg_test_dir") XDG_CACHE_DIR = os.path.join(HOME_TEST_DIR, "xdg_cache_dir") IP_TEST_DIR = os.path.join(HOME_TEST_DIR,'.ipython') def setup_module(): """Setup testenvironment for the module: - Adds dummy home dir tree """ # Do not mask exceptions here. In particular, catching WindowsError is a # problem because that exception is only defined on Windows... os.makedirs(IP_TEST_DIR) os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython')) os.makedirs(os.path.join(XDG_CACHE_DIR, 'ipython')) def teardown_module(): """Teardown testenvironment for the module: - Remove dummy home dir tree """ # Note: we remove the parent test dir, which is the root of all test # subdirs we may have created. Use shutil instead of os.removedirs, so # that non-empty directories are all recursively removed. shutil.rmtree(TMP_TEST_DIR) def patch_get_home_dir(dirpath): return patch.object(paths, 'get_home_dir', return_value=dirpath) def test_get_ipython_dir_1(): """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions.""" env_ipdir = os.path.join("someplace", ".ipython") with patch.object(paths, '_writable_dir', return_value=True), \ modified_env({'IPYTHONDIR': env_ipdir}): ipdir = paths.get_ipython_dir() assert ipdir == env_ipdir def test_get_ipython_dir_2(): """test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions.""" with patch_get_home_dir('someplace'), \ patch.object(paths, 'get_xdg_dir', return_value=None), \ patch.object(paths, '_writable_dir', return_value=True), \ patch('os.name', "posix"), \ modified_env({'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': None }): ipdir = paths.get_ipython_dir() assert ipdir == os.path.join("someplace", ".ipython") def test_get_ipython_dir_3(): """test_get_ipython_dir_3, use XDG if defined and exists, and .ipython doesn't exist.""" tmphome = TemporaryDirectory() try: with patch_get_home_dir(tmphome.name), \ patch('os.name', 'posix'), \ modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': XDG_TEST_DIR, }), warnings.catch_warnings(record=True) as w: ipdir = paths.get_ipython_dir() assert ipdir == os.path.join(tmphome.name, XDG_TEST_DIR, "ipython") assert len(w) == 0 finally: tmphome.cleanup() def test_get_ipython_dir_4(): """test_get_ipython_dir_4, warn if XDG and home both exist.""" with patch_get_home_dir(HOME_TEST_DIR), \ patch('os.name', 'posix'): try: os.mkdir(os.path.join(XDG_TEST_DIR, 'ipython')) except OSError as e: if e.errno != errno.EEXIST: raise with modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': XDG_TEST_DIR, }), warnings.catch_warnings(record=True) as w: ipdir = paths.get_ipython_dir() assert len(w) == 1 assert "Ignoring" in str(w[0]) def test_get_ipython_dir_5(): """test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist.""" with patch_get_home_dir(HOME_TEST_DIR), \ patch('os.name', 'posix'): try: os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython')) except OSError as e: if e.errno != errno.ENOENT: raise with modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': XDG_TEST_DIR, }): ipdir = paths.get_ipython_dir() assert ipdir == IP_TEST_DIR def test_get_ipython_dir_6(): """test_get_ipython_dir_6, use home over XDG if defined and neither exist.""" xdg = os.path.join(HOME_TEST_DIR, 'somexdg') os.mkdir(xdg) shutil.rmtree(os.path.join(HOME_TEST_DIR, '.ipython')) print(paths._writable_dir) with patch_get_home_dir(HOME_TEST_DIR), \ patch.object(paths, 'get_xdg_dir', return_value=xdg), \ patch('os.name', 'posix'), \ modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': None, }), warnings.catch_warnings(record=True) as w: ipdir = paths.get_ipython_dir() assert ipdir == os.path.join(HOME_TEST_DIR, ".ipython") assert len(w) == 0 def test_get_ipython_dir_7(): """test_get_ipython_dir_7, test home directory expansion on IPYTHONDIR""" home_dir = os.path.normpath(os.path.expanduser('~')) with modified_env({'IPYTHONDIR': os.path.join('~', 'somewhere')}), \ patch.object(paths, '_writable_dir', return_value=True): ipdir = paths.get_ipython_dir() assert ipdir == os.path.join(home_dir, "somewhere") @skip_win32 def test_get_ipython_dir_8(): """test_get_ipython_dir_8, test / home directory""" if not os.access("/", os.W_OK): # test only when HOME directory actually writable return with ( patch.object(paths, "_writable_dir", lambda path: bool(path)), patch.object(paths, "get_xdg_dir", return_value=None), modified_env( { "IPYTHON_DIR": None, "IPYTHONDIR": None, "HOME": "/", } ), ): assert paths.get_ipython_dir() == "/.ipython" def test_get_ipython_cache_dir(): with modified_env({'HOME': HOME_TEST_DIR}): if os.name == "posix": # test default os.makedirs(os.path.join(HOME_TEST_DIR, ".cache")) with modified_env({'XDG_CACHE_HOME': None}): ipdir = paths.get_ipython_cache_dir() assert os.path.join(HOME_TEST_DIR, ".cache", "ipython") == ipdir assert_isdir(ipdir) # test env override with modified_env({"XDG_CACHE_HOME": XDG_CACHE_DIR}): ipdir = paths.get_ipython_cache_dir() assert_isdir(ipdir) assert ipdir == os.path.join(XDG_CACHE_DIR, "ipython") else: assert paths.get_ipython_cache_dir() == paths.get_ipython_dir() def test_get_ipython_package_dir(): ipdir = paths.get_ipython_package_dir() assert_isdir(ipdir) def test_get_ipython_module_path(): ipapp_path = paths.get_ipython_module_path('IPython.terminal.ipapp') assert_isfile(ipapp_path) ipython-8.35.0/IPython/core/tests/test_prefilter.py000066400000000000000000000114001477474304100224010ustar00rootroot00000000000000"""Tests for input manipulation machinery.""" #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import pytest from IPython.core.prefilter import AutocallChecker #----------------------------------------------------------------------------- # Tests #----------------------------------------------------------------------------- def test_prefilter(): """Test user input conversions""" # pairs of (raw, expected correct) input pairs = [ ('2+2','2+2'), ] for raw, correct in pairs: assert ip.prefilter(raw) == correct def test_prefilter_shadowed(): def dummy_magic(line): pass prev_automagic_state = ip.automagic ip.automagic = True ip.autocall = 0 try: # These should not be transformed - they are shadowed by other names for name in ['if', 'zip', 'get_ipython']: # keyword, builtin, global ip.register_magic_function(dummy_magic, magic_name=name) res = ip.prefilter(name + " foo") assert res == name + " foo" del ip.magics_manager.magics["line"][name] # These should be transformed for name in ['fi', 'piz', 'nohtypi_teg']: ip.register_magic_function(dummy_magic, magic_name=name) res = ip.prefilter(name + " foo") assert res != name + " foo" del ip.magics_manager.magics["line"][name] finally: ip.automagic = prev_automagic_state def test_autocall_binops(): """See https://github.com/ipython/ipython/issues/81""" ip.run_line_magic("autocall", "2") f = lambda x: x ip.user_ns['f'] = f try: assert ip.prefilter("f 1") == "f(1)" for t in ["f +1", "f -1"]: assert ip.prefilter(t) == t # Run tests again with a more permissive exclude_regexp, which will # allow transformation of binary operations ('f -1' -> 'f(-1)'). pm = ip.prefilter_manager ac = AutocallChecker(shell=pm.shell, prefilter_manager=pm, config=pm.config) try: ac.priority = 1 ac.exclude_regexp = r'^[,&^\|\*/]|^is |^not |^in |^and |^or ' pm.sort_checkers() assert ip.prefilter("f -1") == "f(-1)" assert ip.prefilter("f +1") == "f(+1)" finally: pm.unregister_checker(ac) finally: ip.run_line_magic("autocall", "0") del ip.user_ns["f"] def test_issue_114(): """Check that multiline string literals don't expand as magic see http://github.com/ipython/ipython/issues/114""" template = '"""\n%s\n"""' # Store the current value of multi_line_specials and turn it off before # running test, since it could be true (case in which the test doesn't make # sense, as multiline string literals *will* expand as magic in that case). msp = ip.prefilter_manager.multi_line_specials ip.prefilter_manager.multi_line_specials = False try: for mgk in ip.magics_manager.lsmagic()['line']: raw = template % mgk assert ip.prefilter(raw) == raw finally: ip.prefilter_manager.multi_line_specials = msp def test_prefilter_attribute_errors(): """Capture exceptions thrown by user objects on attribute access. See http://github.com/ipython/ipython/issues/988.""" class X(object): def __getattr__(self, k): raise ValueError('broken object') def __call__(self, x): return x # Create a callable broken object ip.user_ns["x"] = X() ip.run_line_magic("autocall", "2") try: # Even if x throws an attribute error when looking at its rewrite # attribute, we should not crash. So the test here is simply making # the prefilter call and not having an exception. ip.prefilter('x 1') finally: del ip.user_ns["x"] ip.run_line_magic("autocall", "0") def test_autocall_type_ann(): ip.run_cell("import collections.abc") ip.run_line_magic("autocall", "1") try: assert ( ip.prefilter("collections.abc.Callable[[int], None]") == "collections.abc.Callable[[int], None]" ) finally: ip.run_line_magic("autocall", "0") def test_autocall_should_support_unicode(): ip.run_line_magic("autocall", "2") ip.user_ns["π"] = lambda x: x try: assert ip.prefilter("π 3") == "π(3)" finally: ip.run_line_magic("autocall", "0") del ip.user_ns["π"] def test_autocall_regression_gh_14513(): ip.run_line_magic("autocall", "2") ip.user_ns["foo"] = dict() try: assert ip.prefilter("foo") == "foo" finally: ip.run_line_magic("autocall", "0") del ip.user_ns["foo"] ipython-8.35.0/IPython/core/tests/test_profile.py000066400000000000000000000122631477474304100220550ustar00rootroot00000000000000# coding: utf-8 """Tests for profile-related functions. Currently only the startup-dir functionality is tested, but more tests should be added for: * ipython profile create * ipython profile list * ipython profile create --parallel * security dir permissions Authors ------- * MinRK """ #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import shutil import sys import tempfile from pathlib import Path from tempfile import TemporaryDirectory from unittest import TestCase import pytest from IPython.core.profileapp import list_bundled_profiles, list_profiles_in from IPython.core.profiledir import ProfileDir from IPython.testing import decorators as dec from IPython.testing import tools as tt from IPython.utils.process import getoutput #----------------------------------------------------------------------------- # Globals #----------------------------------------------------------------------------- TMP_TEST_DIR = Path(tempfile.mkdtemp()) HOME_TEST_DIR = TMP_TEST_DIR / "home_test_dir" IP_TEST_DIR = HOME_TEST_DIR / ".ipython" # # Setup/teardown functions/decorators # def setup_module(): """Setup test environment for the module: - Adds dummy home dir tree """ # Do not mask exceptions here. In particular, catching WindowsError is a # problem because that exception is only defined on Windows... (Path.cwd() / IP_TEST_DIR).mkdir(parents=True) def teardown_module(): """Teardown test environment for the module: - Remove dummy home dir tree """ # Note: we remove the parent test dir, which is the root of all test # subdirs we may have created. Use shutil instead of os.removedirs, so # that non-empty directories are all recursively removed. shutil.rmtree(TMP_TEST_DIR) #----------------------------------------------------------------------------- # Test functions #----------------------------------------------------------------------------- class ProfileStartupTest(TestCase): def setUp(self): # create profile dir self.pd = ProfileDir.create_profile_dir_by_name(IP_TEST_DIR, "test") self.options = ["--ipython-dir", IP_TEST_DIR, "--profile", "test"] self.fname = TMP_TEST_DIR / "test.py" def tearDown(self): # We must remove this profile right away so its presence doesn't # confuse other tests. shutil.rmtree(self.pd.location) def init(self, startup_file, startup, test): # write startup python file with open(Path(self.pd.startup_dir) / startup_file, "w", encoding="utf-8") as f: f.write(startup) # write simple test file, to check that the startup file was run with open(self.fname, "w", encoding="utf-8") as f: f.write(test) def validate(self, output): tt.ipexec_validate(self.fname, output, "", options=self.options) def test_startup_py(self): self.init('00-start.py', 'zzz=123\n', 'print(zzz)\n') self.validate('123') def test_startup_ipy(self): self.init('00-start.ipy', '%xmode plain\n', '') self.validate('Exception reporting mode: Plain') @pytest.mark.skipif( sys.implementation.name == "pypy" and ((7, 3, 13) < sys.implementation.version < (7, 3, 16)), reason="Unicode issues with scandir on PyPy, see https://github.com/pypy/pypy/issues/4860", ) def test_list_profiles_in(): # No need to remove these directories and files, as they will get nuked in # the module-level teardown. td = Path(tempfile.mkdtemp(dir=TMP_TEST_DIR)) for name in ("profile_foo", "profile_hello", "not_a_profile"): Path(td / name).mkdir(parents=True) if dec.unicode_paths: Path(td / "profile_ünicode").mkdir(parents=True) with open(td / "profile_file", "w", encoding="utf-8") as f: f.write("I am not a profile directory") profiles = list_profiles_in(td) # unicode normalization can turn u'ünicode' into u'u\0308nicode', # so only check for *nicode, and that creating a ProfileDir from the # name remains valid found_unicode = False for p in list(profiles): if p.endswith('nicode'): pd = ProfileDir.find_profile_dir_by_name(td, p) profiles.remove(p) found_unicode = True break if dec.unicode_paths: assert found_unicode is True assert set(profiles) == {"foo", "hello"} def test_list_bundled_profiles(): # This variable will need to be updated when a new profile gets bundled bundled = sorted(list_bundled_profiles()) assert bundled == [] def test_profile_create_ipython_dir(): """ipython profile create respects --ipython-dir""" with TemporaryDirectory() as td: getoutput( [ sys.executable, "-m", "IPython", "profile", "create", "foo", "--ipython-dir=%s" % td, ] ) profile_dir = Path(td) / "profile_foo" assert Path(profile_dir).exists() ipython_config = profile_dir / "ipython_config.py" assert Path(ipython_config).exists() ipython-8.35.0/IPython/core/tests/test_prompts.py000066400000000000000000000015151477474304100221170ustar00rootroot00000000000000# -*- coding: utf-8 """Tests for prompt generation.""" import unittest from IPython.core.prompts import LazyEvaluate class PromptTests(unittest.TestCase): def test_lazy_eval_unicode(self): u = u'ünicødé' lz = LazyEvaluate(lambda : u) self.assertEqual(str(lz), u) self.assertEqual(format(lz), u) def test_lazy_eval_nonascii_bytes(self): u = u'ünicødé' b = u.encode('utf8') lz = LazyEvaluate(lambda : b) # unicode(lz) would fail self.assertEqual(str(lz), str(b)) self.assertEqual(format(lz), str(b)) def test_lazy_eval_float(self): f = 0.503 lz = LazyEvaluate(lambda : f) self.assertEqual(str(lz), str(f)) self.assertEqual(format(lz), str(f)) self.assertEqual(format(lz, '.1'), '0.5') ipython-8.35.0/IPython/core/tests/test_pylabtools.py000066400000000000000000000267321477474304100226130ustar00rootroot00000000000000"""Tests for pylab tools module. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from binascii import a2b_base64 from io import BytesIO import pytest matplotlib = pytest.importorskip("matplotlib") matplotlib.use('Agg') from matplotlib.figure import Figure from matplotlib import pyplot as plt from matplotlib_inline import backend_inline import numpy as np from IPython.core.getipython import get_ipython from IPython.core.interactiveshell import InteractiveShell from IPython.core.display import _PNG, _JPEG from .. import pylabtools as pt from IPython.testing import decorators as dec def test_figure_to_svg(): # simple empty-figure test fig = plt.figure() assert pt.print_figure(fig, "svg") is None plt.close('all') # simple check for at least svg-looking output fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) plt.draw() svg = pt.print_figure(fig, "svg")[:100].lower() assert "doctype svg" in svg def _check_pil_jpeg_bytes(): """Skip if PIL can't write JPEGs to BytesIO objects""" # PIL's JPEG plugin can't write to BytesIO objects # Pillow fixes this from PIL import Image buf = BytesIO() img = Image.new("RGB", (4,4)) try: img.save(buf, 'jpeg') except Exception as e: ename = e.__class__.__name__ raise pytest.skip("PIL can't write JPEG to BytesIO: %s: %s" % (ename, e)) from e @dec.skip_without("PIL.Image") def test_figure_to_jpeg(): _check_pil_jpeg_bytes() # simple check for at least jpeg-looking output fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) plt.draw() jpeg = pt.print_figure(fig, 'jpeg', pil_kwargs={'optimize': 50})[:100].lower() assert jpeg.startswith(_JPEG) def test_retina_figure(): # simple empty-figure test fig = plt.figure() assert pt.retina_figure(fig) == None plt.close('all') fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) plt.draw() png, md = pt.retina_figure(fig) assert png.startswith(_PNG) assert "width" in md assert "height" in md _fmt_mime_map = { 'png': 'image/png', 'jpeg': 'image/jpeg', 'pdf': 'application/pdf', 'retina': 'image/png', 'svg': 'image/svg+xml', } def test_select_figure_formats_str(): ip = get_ipython() for fmt, active_mime in _fmt_mime_map.items(): pt.select_figure_formats(ip, fmt) for mime, f in ip.display_formatter.formatters.items(): if mime == active_mime: assert Figure in f else: assert Figure not in f def test_select_figure_formats_kwargs(): ip = get_ipython() kwargs = dict(bbox_inches="tight") pt.select_figure_formats(ip, "png", **kwargs) formatter = ip.display_formatter.formatters["image/png"] f = formatter.lookup_by_type(Figure) cell = f.keywords expected = kwargs expected["base64"] = True expected["fmt"] = "png" assert cell == expected # check that the formatter doesn't raise fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) plt.draw() formatter.enabled = True png = formatter(fig) assert isinstance(png, str) png_bytes = a2b_base64(png) assert png_bytes.startswith(_PNG) def test_select_figure_formats_set(): ip = get_ipython() for fmts in [ {'png', 'svg'}, ['png'], ('jpeg', 'pdf', 'retina'), {'svg'}, ]: active_mimes = {_fmt_mime_map[fmt] for fmt in fmts} pt.select_figure_formats(ip, fmts) for mime, f in ip.display_formatter.formatters.items(): if mime in active_mimes: assert Figure in f else: assert Figure not in f def test_select_figure_formats_bad(): ip = get_ipython() with pytest.raises(ValueError): pt.select_figure_formats(ip, 'foo') with pytest.raises(ValueError): pt.select_figure_formats(ip, {'png', 'foo'}) with pytest.raises(ValueError): pt.select_figure_formats(ip, ['retina', 'pdf', 'bar', 'bad']) def test_import_pylab(): ns = {} pt.import_pylab(ns, import_all=False) assert "plt" in ns assert ns["np"] == np class TestPylabSwitch(object): class Shell(InteractiveShell): def init_history(self): """Sets up the command history, and starts regular autosaves.""" self.config.HistoryManager.hist_file = ":memory:" super().init_history() def enable_gui(self, gui): pass def setup_method(self): import matplotlib def act_mpl(backend): matplotlib.rcParams['backend'] = backend # Save rcParams since they get modified self._saved_rcParams = matplotlib.rcParams self._saved_rcParamsOrig = matplotlib.rcParamsOrig matplotlib.rcParams = dict(backend="QtAgg") matplotlib.rcParamsOrig = dict(backend="QtAgg") # Mock out functions self._save_am = pt.activate_matplotlib pt.activate_matplotlib = act_mpl self._save_ip = pt.import_pylab pt.import_pylab = lambda *a,**kw:None self._save_cis = backend_inline.configure_inline_support backend_inline.configure_inline_support = lambda *a, **kw: None def teardown_method(self): pt.activate_matplotlib = self._save_am pt.import_pylab = self._save_ip backend_inline.configure_inline_support = self._save_cis import matplotlib matplotlib.rcParams = self._saved_rcParams matplotlib.rcParamsOrig = self._saved_rcParamsOrig def test_qt(self): s = self.Shell() gui, backend = s.enable_matplotlib(None) assert gui == "qt" assert s.pylab_gui_select == "qt" gui, backend = s.enable_matplotlib("inline") assert gui is None assert s.pylab_gui_select == "qt" gui, backend = s.enable_matplotlib("qt") assert gui == "qt" assert s.pylab_gui_select == "qt" gui, backend = s.enable_matplotlib("inline") assert gui is None assert s.pylab_gui_select == "qt" gui, backend = s.enable_matplotlib() assert gui == "qt" assert s.pylab_gui_select == "qt" def test_inline(self): s = self.Shell() gui, backend = s.enable_matplotlib("inline") assert gui is None assert s.pylab_gui_select == None gui, backend = s.enable_matplotlib("inline") assert gui is None assert s.pylab_gui_select == None gui, backend = s.enable_matplotlib("qt") assert gui == "qt" assert s.pylab_gui_select == "qt" def test_inline_twice(self): "Using '%matplotlib inline' twice should not reset formatters" ip = self.Shell() gui, backend = ip.enable_matplotlib("inline") assert gui is None fmts = {'png'} active_mimes = {_fmt_mime_map[fmt] for fmt in fmts} pt.select_figure_formats(ip, fmts) gui, backend = ip.enable_matplotlib("inline") assert gui is None for mime, f in ip.display_formatter.formatters.items(): if mime in active_mimes: assert Figure in f else: assert Figure not in f def test_qt_gtk(self): s = self.Shell() gui, backend = s.enable_matplotlib("qt") assert gui == "qt" assert s.pylab_gui_select == "qt" gui, backend = s.enable_matplotlib("gtk3") assert gui == "qt" assert s.pylab_gui_select == "qt" @dec.skipif(not pt._matplotlib_manages_backends()) def test_backend_module_name_case_sensitive(self): # Matplotlib backend names are case insensitive unless explicitly specified using # "module://some_module.some_name" syntax which are case sensitive for mpl >= 3.9.1 all_lowercase = "module://matplotlib_inline.backend_inline" some_uppercase = "module://matplotlib_inline.Backend_inline" mpl3_9_1 = matplotlib.__version_info__ >= (3, 9, 1) s = self.Shell() s.enable_matplotlib(all_lowercase) if mpl3_9_1: with pytest.raises(RuntimeError): s.enable_matplotlib(some_uppercase) else: s.enable_matplotlib(some_uppercase) s.run_line_magic("matplotlib", all_lowercase) if mpl3_9_1: with pytest.raises(RuntimeError): s.run_line_magic("matplotlib", some_uppercase) else: s.run_line_magic("matplotlib", some_uppercase) def test_no_gui_backends(): for k in ['agg', 'svg', 'pdf', 'ps']: assert k not in pt.backend2gui def test_figure_no_canvas(): fig = Figure() fig.canvas = None pt.print_figure(fig) @pytest.mark.parametrize( "name, expected_gui, expected_backend", [ # name is gui ("gtk3", "gtk3", "gtk3agg"), ("gtk4", "gtk4", "gtk4agg"), ("headless", None, "agg"), ("osx", "osx", "macosx"), ("qt", "qt", "qtagg"), ("qt5", "qt5", "qt5agg"), ("qt6", "qt6", "qtagg"), ("tk", "tk", "tkagg"), ("wx", "wx", "wxagg"), # name is backend ("agg", None, "agg"), ("cairo", None, "cairo"), ("pdf", None, "pdf"), ("ps", None, "ps"), ("svg", None, "svg"), ("template", None, "template"), ("gtk3agg", "gtk3", "gtk3agg"), ("gtk3cairo", "gtk3", "gtk3cairo"), ("gtk4agg", "gtk4", "gtk4agg"), ("gtk4cairo", "gtk4", "gtk4cairo"), ("macosx", "osx", "macosx"), ("nbagg", "nbagg", "nbagg"), ("notebook", "nbagg", "notebook"), ("qtagg", "qt", "qtagg"), ("qtcairo", "qt", "qtcairo"), ("qt5agg", "qt5", "qt5agg"), ("qt5cairo", "qt5", "qt5cairo"), ("tkagg", "tk", "tkagg"), ("tkcairo", "tk", "tkcairo"), ("webagg", "webagg", "webagg"), ("wxagg", "wx", "wxagg"), ("wxcairo", "wx", "wxcairo"), ], ) def test_backend_builtin(name, expected_gui, expected_backend): # Test correct identification of Matplotlib built-in backends without importing and using them, # otherwise we would need to ensure all the complex dependencies such as windowing toolkits are # installed. mpl_manages_backends = pt._matplotlib_manages_backends() if not mpl_manages_backends: # Backends not supported before _matplotlib_manages_backends or supported # but with different expected_gui or expected_backend. if ( name.endswith("agg") or name.endswith("cairo") or name in ("headless", "macosx", "pdf", "ps", "svg", "template") ): pytest.skip() elif name == "qt6": expected_backend = "qtagg" elif name == "notebook": expected_backend, expected_gui = expected_gui, expected_backend gui, backend = pt.find_gui_and_backend(name) if not mpl_manages_backends: gui = gui.lower() if gui else None backend = backend.lower() if backend else None assert gui == expected_gui assert backend == expected_backend def test_backend_entry_point(): gui, backend = pt.find_gui_and_backend("inline") assert gui is None expected_backend = ( "inline" if pt._matplotlib_manages_backends() else "module://matplotlib_inline.backend_inline" ) assert backend == expected_backend def test_backend_unknown(): with pytest.raises(RuntimeError if pt._matplotlib_manages_backends() else KeyError): pt.find_gui_and_backend("name-does-not-exist") ipython-8.35.0/IPython/core/tests/test_run.py000066400000000000000000000456671477474304100212370ustar00rootroot00000000000000# encoding: utf-8 """Tests for code execution (%run and related), which is particularly tricky. Because of how %run manages namespaces, and the fact that we are trying here to verify subtle object deletion and reference counting issues, the %run tests will be kept in this separate file. This makes it easier to aggregate in one place the tricks needed to handle it; most other magics are much easier to test and we do so in a common test_magic file. Note that any test using `run -i` should make sure to do a `reset` afterwards, as otherwise it may influence later tests. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import functools import os import platform import random import string import sys import textwrap import unittest from os.path import join as pjoin from unittest.mock import patch import pytest from tempfile import TemporaryDirectory from IPython.core import debugger from IPython.testing import decorators as dec from IPython.testing import tools as tt from IPython.utils.io import capture_output def doctest_refbug(): """Very nasty problem with references held by multiple runs of a script. See: https://github.com/ipython/ipython/issues/141 In [1]: _ip.clear_main_mod_cache() # random In [2]: %run refbug In [3]: call_f() lowercased: hello In [4]: %run refbug In [5]: call_f() lowercased: hello lowercased: hello """ def doctest_run_builtins(): r"""Check that %run doesn't damage __builtins__. In [1]: import tempfile In [2]: bid1 = id(__builtins__) In [3]: fname = tempfile.mkstemp('.py')[1] In [3]: f = open(fname, 'w', encoding='utf-8') In [4]: dummy= f.write('pass\n') In [5]: f.flush() In [6]: t1 = type(__builtins__) In [7]: %run $fname In [7]: f.close() In [8]: bid2 = id(__builtins__) In [9]: t2 = type(__builtins__) In [10]: t1 == t2 Out[10]: True In [10]: bid1 == bid2 Out[10]: True In [12]: try: ....: os.unlink(fname) ....: except: ....: pass ....: """ def doctest_run_option_parser(): r"""Test option parser in %run. In [1]: %run print_argv.py [] In [2]: %run print_argv.py print*.py ['print_argv.py'] In [3]: %run -G print_argv.py print*.py ['print*.py'] """ @dec.skip_win32 def doctest_run_option_parser_for_posix(): r"""Test option parser in %run (Linux/OSX specific). You need double quote to escape glob in POSIX systems: In [1]: %run print_argv.py print\\*.py ['print*.py'] You can't use quote to escape glob in POSIX systems: In [2]: %run print_argv.py 'print*.py' ['print_argv.py'] """ doctest_run_option_parser_for_posix.__skip_doctest__ = sys.platform == "win32" @dec.skip_if_not_win32 def doctest_run_option_parser_for_windows(): r"""Test option parser in %run (Windows specific). In Windows, you can't escape ``*` `by backslash: In [1]: %run print_argv.py print\\*.py ['print\\\\*.py'] You can use quote to escape glob: In [2]: %run print_argv.py 'print*.py' ["'print*.py'"] """ doctest_run_option_parser_for_windows.__skip_doctest__ = sys.platform != "win32" def doctest_reset_del(): """Test that resetting doesn't cause errors in __del__ methods. In [2]: class A(object): ...: def __del__(self): ...: print(str("Hi")) ...: In [3]: a = A() In [4]: get_ipython().reset(); import gc; x = gc.collect(0) Hi In [5]: 1+1 Out[5]: 2 """ # For some tests, it will be handy to organize them in a class with a common # setup that makes a temp file class TestMagicRunPass(tt.TempFileMixin): def setUp(self): content = "a = [1,2,3]\nb = 1" self.mktmp(content) def run_tmpfile(self): _ip = get_ipython() # This fails on Windows if self.tmpfile.name has spaces or "~" in it. # See below and ticket https://bugs.launchpad.net/bugs/366353 _ip.run_line_magic("run", self.fname) def run_tmpfile_p(self): _ip = get_ipython() # This fails on Windows if self.tmpfile.name has spaces or "~" in it. # See below and ticket https://bugs.launchpad.net/bugs/366353 _ip.run_line_magic("run", "-p %s" % self.fname) def test_builtins_id(self): """Check that %run doesn't damage __builtins__ """ _ip = get_ipython() # Test that the id of __builtins__ is not modified by %run bid1 = id(_ip.user_ns['__builtins__']) self.run_tmpfile() bid2 = id(_ip.user_ns['__builtins__']) assert bid1 == bid2 def test_builtins_type(self): """Check that the type of __builtins__ doesn't change with %run. However, the above could pass if __builtins__ was already modified to be a dict (it should be a module) by a previous use of %run. So we also check explicitly that it really is a module: """ _ip = get_ipython() self.run_tmpfile() assert type(_ip.user_ns["__builtins__"]) == type(sys) def test_run_profile(self): """Test that the option -p, which invokes the profiler, do not crash by invoking execfile""" self.run_tmpfile_p() def test_run_debug_twice(self): # https://github.com/ipython/ipython/issues/10028 _ip = get_ipython() with tt.fake_input(["c"]): _ip.run_line_magic("run", "-d %s" % self.fname) with tt.fake_input(["c"]): _ip.run_line_magic("run", "-d %s" % self.fname) def test_run_debug_twice_with_breakpoint(self): """Make a valid python temp file.""" _ip = get_ipython() with tt.fake_input(["b 2", "c", "c"]): _ip.run_line_magic("run", "-d %s" % self.fname) with tt.fake_input(["c"]): with tt.AssertNotPrints("KeyError"): _ip.run_line_magic("run", "-d %s" % self.fname) class TestMagicRunSimple(tt.TempFileMixin): def test_simpledef(self): """Test that simple class definitions work.""" src = ("class foo: pass\n" "def f(): return foo()") self.mktmp(src) _ip.run_line_magic("run", str(self.fname)) _ip.run_cell("t = isinstance(f(), foo)") assert _ip.user_ns["t"] is True @pytest.mark.xfail( platform.python_implementation() == "PyPy", reason="expecting __del__ call on exit is unreliable and doesn't happen on PyPy", ) def test_obj_del(self): """Test that object's __del__ methods are called on exit.""" src = ("class A(object):\n" " def __del__(self):\n" " print('object A deleted')\n" "a = A()\n") self.mktmp(src) err = None tt.ipexec_validate(self.fname, 'object A deleted', err) def test_aggressive_namespace_cleanup(self): """Test that namespace cleanup is not too aggressive GH-238 Returning from another run magic deletes the namespace""" # see ticket https://github.com/ipython/ipython/issues/238 with tt.TempFileMixin() as empty: empty.mktmp("") # On Windows, the filename will have \users in it, so we need to use the # repr so that the \u becomes \\u. src = ( "ip = get_ipython()\n" "for i in range(5):\n" " try:\n" " ip.run_line_magic(%r, %r)\n" " except NameError as e:\n" " print(i)\n" " break\n" % ("run", empty.fname) ) self.mktmp(src) _ip.run_line_magic("run", str(self.fname)) _ip.run_cell("ip == get_ipython()") assert _ip.user_ns["i"] == 4 def test_run_second(self): """Test that running a second file doesn't clobber the first, gh-3547""" self.mktmp("avar = 1\n" "def afunc():\n" " return avar\n") with tt.TempFileMixin() as empty: empty.mktmp("") _ip.run_line_magic("run", self.fname) _ip.run_line_magic("run", empty.fname) assert _ip.user_ns["afunc"]() == 1 def test_tclass(self): mydir = os.path.dirname(__file__) tc = os.path.join(mydir, "tclass") src = f"""\ import gc %run "{tc}" C-first gc.collect(0) %run "{tc}" C-second gc.collect(0) %run "{tc}" C-third gc.collect(0) %reset -f """ self.mktmp(src, ".ipy") out = """\ ARGV 1-: ['C-first'] ARGV 1-: ['C-second'] tclass.py: deleting object: C-first ARGV 1-: ['C-third'] tclass.py: deleting object: C-second tclass.py: deleting object: C-third """ err = None tt.ipexec_validate(self.fname, out, err) def test_run_i_after_reset(self): """Check that %run -i still works after %reset (gh-693)""" src = "yy = zz\n" self.mktmp(src) _ip.run_cell("zz = 23") try: _ip.run_line_magic("run", "-i %s" % self.fname) assert _ip.user_ns["yy"] == 23 finally: _ip.run_line_magic("reset", "-f") _ip.run_cell("zz = 23") try: _ip.run_line_magic("run", "-i %s" % self.fname) assert _ip.user_ns["yy"] == 23 finally: _ip.run_line_magic("reset", "-f") def test_unicode(self): """Check that files in odd encodings are accepted.""" mydir = os.path.dirname(__file__) na = os.path.join(mydir, "nonascii.py") _ip.run_line_magic("run", na) assert _ip.user_ns["u"] == "Ўт№Ф" def test_run_py_file_attribute(self): """Test handling of `__file__` attribute in `%run .py`.""" src = "t = __file__\n" self.mktmp(src) _missing = object() file1 = _ip.user_ns.get("__file__", _missing) _ip.run_line_magic("run", self.fname) file2 = _ip.user_ns.get("__file__", _missing) # Check that __file__ was equal to the filename in the script's # namespace. assert _ip.user_ns["t"] == self.fname # Check that __file__ was not leaked back into user_ns. assert file1 == file2 def test_run_ipy_file_attribute(self): """Test handling of `__file__` attribute in `%run `.""" src = "t = __file__\n" self.mktmp(src, ext='.ipy') _missing = object() file1 = _ip.user_ns.get("__file__", _missing) _ip.run_line_magic("run", self.fname) file2 = _ip.user_ns.get("__file__", _missing) # Check that __file__ was equal to the filename in the script's # namespace. assert _ip.user_ns["t"] == self.fname # Check that __file__ was not leaked back into user_ns. assert file1 == file2 def test_run_formatting(self): """ Test that %run -t -N does not raise a TypeError for N > 1.""" src = "pass" self.mktmp(src) _ip.run_line_magic("run", "-t -N 1 %s" % self.fname) _ip.run_line_magic("run", "-t -N 10 %s" % self.fname) def test_ignore_sys_exit(self): """Test the -e option to ignore sys.exit()""" src = "import sys; sys.exit(1)" self.mktmp(src) with tt.AssertPrints("SystemExit"): _ip.run_line_magic("run", self.fname) with tt.AssertNotPrints("SystemExit"): _ip.run_line_magic("run", "-e %s" % self.fname) def test_run_nb(self): """Test %run notebook.ipynb""" pytest.importorskip("nbformat") from nbformat import v4, writes nb = v4.new_notebook( cells=[ v4.new_markdown_cell("The Ultimate Question of Everything"), v4.new_code_cell("answer=42") ] ) src = writes(nb, version=4) self.mktmp(src, ext='.ipynb') _ip.run_line_magic("run", self.fname) assert _ip.user_ns["answer"] == 42 def test_run_nb_error(self): """Test %run notebook.ipynb error""" pytest.importorskip("nbformat") from nbformat import v4, writes # %run when a file name isn't provided pytest.raises(Exception, _ip.magic, "run") # %run when a file doesn't exist pytest.raises(Exception, _ip.magic, "run foobar.ipynb") # %run on a notebook with an error nb = v4.new_notebook( cells=[ v4.new_code_cell("0/0") ] ) src = writes(nb, version=4) self.mktmp(src, ext='.ipynb') pytest.raises(Exception, _ip.magic, "run %s" % self.fname) def test_file_options(self): src = ('import sys\n' 'a = " ".join(sys.argv[1:])\n') self.mktmp(src) test_opts = "-x 3 --verbose" _ip.run_line_magic("run", "{0} {1}".format(self.fname, test_opts)) assert _ip.user_ns["a"] == test_opts class TestMagicRunWithPackage(unittest.TestCase): def writefile(self, name, content): path = os.path.join(self.tempdir.name, name) d = os.path.dirname(path) if not os.path.isdir(d): os.makedirs(d) with open(path, "w", encoding="utf-8") as f: f.write(textwrap.dedent(content)) def setUp(self): self.package = package = 'tmp{0}'.format(''.join([random.choice(string.ascii_letters) for i in range(10)])) """Temporary (probably) valid python package name.""" self.value = int(random.random() * 10000) self.tempdir = TemporaryDirectory() self.__orig_cwd = os.getcwd() sys.path.insert(0, self.tempdir.name) self.writefile(os.path.join(package, '__init__.py'), '') self.writefile(os.path.join(package, 'sub.py'), """ x = {0!r} """.format(self.value)) self.writefile(os.path.join(package, 'relative.py'), """ from .sub import x """) self.writefile(os.path.join(package, 'absolute.py'), """ from {0}.sub import x """.format(package)) self.writefile(os.path.join(package, 'args.py'), """ import sys a = " ".join(sys.argv[1:]) """.format(package)) def tearDown(self): os.chdir(self.__orig_cwd) sys.path[:] = [p for p in sys.path if p != self.tempdir.name] self.tempdir.cleanup() def check_run_submodule(self, submodule, opts=""): _ip.user_ns.pop("x", None) _ip.run_line_magic( "run", "{2} -m {0}.{1}".format(self.package, submodule, opts) ) self.assertEqual( _ip.user_ns["x"], self.value, "Variable `x` is not loaded from module `{0}`.".format(submodule), ) def test_run_submodule_with_absolute_import(self): self.check_run_submodule('absolute') def test_run_submodule_with_relative_import(self): """Run submodule that has a relative import statement (#2727).""" self.check_run_submodule('relative') def test_prun_submodule_with_absolute_import(self): self.check_run_submodule('absolute', '-p') def test_prun_submodule_with_relative_import(self): self.check_run_submodule('relative', '-p') def with_fake_debugger(func): @functools.wraps(func) def wrapper(*args, **kwds): with patch.object(debugger.Pdb, 'run', staticmethod(eval)): return func(*args, **kwds) return wrapper @with_fake_debugger def test_debug_run_submodule_with_absolute_import(self): self.check_run_submodule('absolute', '-d') @with_fake_debugger def test_debug_run_submodule_with_relative_import(self): self.check_run_submodule('relative', '-d') def test_module_options(self): _ip.user_ns.pop("a", None) test_opts = "-x abc -m test" _ip.run_line_magic("run", "-m {0}.args {1}".format(self.package, test_opts)) assert _ip.user_ns["a"] == test_opts def test_module_options_with_separator(self): _ip.user_ns.pop("a", None) test_opts = "-x abc -m test" _ip.run_line_magic("run", "-m {0}.args -- {1}".format(self.package, test_opts)) assert _ip.user_ns["a"] == test_opts def test_run__name__(): with TemporaryDirectory() as td: path = pjoin(td, "foo.py") with open(path, "w", encoding="utf-8") as f: f.write("q = __name__") _ip.user_ns.pop("q", None) _ip.run_line_magic("run", "{}".format(path)) assert _ip.user_ns.pop("q") == "__main__" _ip.run_line_magic("run", "-n {}".format(path)) assert _ip.user_ns.pop("q") == "foo" try: _ip.run_line_magic("run", "-i -n {}".format(path)) assert _ip.user_ns.pop("q") == "foo" finally: _ip.run_line_magic("reset", "-f") def test_run_tb(): """Test traceback offset in %run""" with TemporaryDirectory() as td: path = pjoin(td, "foo.py") with open(path, "w", encoding="utf-8") as f: f.write( "\n".join( [ "def foo():", " return bar()", "def bar():", " raise RuntimeError('hello!')", "foo()", ] ) ) with capture_output() as io: _ip.run_line_magic("run", "{}".format(path)) out = io.stdout assert "execfile" not in out assert "RuntimeError" in out assert out.count("---->") == 3 del ip.user_ns['bar'] del ip.user_ns['foo'] def test_multiprocessing_run(): """Set we can run mutiprocesgin without messing up up main namespace Note that import `nose.tools as nt` modify the values sys.module['__mp_main__'] so we need to temporarily set it to None to test the issue. """ with TemporaryDirectory() as td: mpm = sys.modules.get('__mp_main__') sys.modules['__mp_main__'] = None try: path = pjoin(td, "test.py") with open(path, "w", encoding="utf-8") as f: f.write("import multiprocessing\nprint('hoy')") with capture_output() as io: _ip.run_line_magic('run', path) _ip.run_cell("i_m_undefined") out = io.stdout assert "hoy" in out assert "AttributeError" not in out assert "NameError" in out assert out.count("---->") == 1 except: raise finally: sys.modules['__mp_main__'] = mpm def test_script_tb(): """Test traceback offset in `ipython script.py`""" with TemporaryDirectory() as td: path = pjoin(td, "foo.py") with open(path, "w", encoding="utf-8") as f: f.write( "\n".join( [ "def foo():", " return bar()", "def bar():", " raise RuntimeError('hello!')", "foo()", ] ) ) out, err = tt.ipexec(path) assert "execfile" not in out assert "RuntimeError" in out assert out.count("---->") == 3 ipython-8.35.0/IPython/core/tests/test_shellapp.py000066400000000000000000000035441477474304100222270ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Tests for shellapp module. Authors ------- * Bradley Froehle """ #----------------------------------------------------------------------------- # Copyright (C) 2012 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import unittest from IPython.testing import decorators as dec from IPython.testing import tools as tt class TestFileToRun(tt.TempFileMixin, unittest.TestCase): """Test the behavior of the file_to_run parameter.""" def test_py_script_file_attribute(self): """Test that `__file__` is set when running `ipython file.py`""" src = "print(__file__)\n" self.mktmp(src) err = None tt.ipexec_validate(self.fname, self.fname, err) def test_ipy_script_file_attribute(self): """Test that `__file__` is set when running `ipython file.ipy`""" src = "print(__file__)\n" self.mktmp(src, ext='.ipy') err = None tt.ipexec_validate(self.fname, self.fname, err) # The commands option to ipexec_validate doesn't work on Windows, and it # doesn't seem worth fixing @dec.skip_win32 def test_py_script_file_attribute_interactively(self): """Test that `__file__` is not set after `ipython -i file.py`""" src = "True\n" self.mktmp(src) out, err = tt.ipexec( self.fname, options=["-i"], commands=['"__file__" in globals()', "print(123)", "exit()"], ) assert "False" in out, f"Subprocess stderr:\n{err}\n-----" ipython-8.35.0/IPython/core/tests/test_splitinput.py000066400000000000000000000023431477474304100226260ustar00rootroot00000000000000# coding: utf-8 from IPython.core.splitinput import split_user_input, LineInfo import pytest tests = [ ("x=1", ("", "", "x", "=1")), ("?", ("", "?", "", "")), ("??", ("", "??", "", "")), (" ?", (" ", "?", "", "")), (" ??", (" ", "??", "", "")), ("??x", ("", "??", "x", "")), ("?x=1", ("", "?", "x", "=1")), ("!ls", ("", "!", "ls", "")), (" !ls", (" ", "!", "ls", "")), ("!!ls", ("", "!!", "ls", "")), (" !!ls", (" ", "!!", "ls", "")), (",ls", ("", ",", "ls", "")), (";ls", ("", ";", "ls", "")), (" ;ls", (" ", ";", "ls", "")), ("f.g(x)", ("", "", "f.g", "(x)")), ("f.g (x)", ("", "", "f.g", " (x)")), ("?%hist1", ("", "?", "%hist1", "")), ("?%%hist2", ("", "?", "%%hist2", "")), ("??%hist3", ("", "??", "%hist3", "")), ("??%%hist4", ("", "??", "%%hist4", "")), ("?x*", ("", "?", "x*", "")), ("Pérez Fernando", ("", "", "Pérez", " Fernando")), ] @pytest.mark.parametrize("input, output", tests) def test_split_user_input(input, output): assert split_user_input(input) == output def test_LineInfo(): """Simple test for LineInfo construction and str()""" linfo = LineInfo(" %cd /home") assert str(linfo) == "LineInfo [ |%|cd|/home]" ipython-8.35.0/IPython/core/tests/test_ultratb.py000066400000000000000000000306451477474304100220760ustar00rootroot00000000000000# encoding: utf-8 """Tests for IPython.core.ultratb """ import io import os.path import platform import re import sys import traceback import unittest from textwrap import dedent from tempfile import TemporaryDirectory from IPython.core.ultratb import ColorTB, VerboseTB from IPython.testing import tools as tt from IPython.testing.decorators import onlyif_unicode_paths, skip_without from IPython.utils.syspathcontext import prepended_to_syspath file_1 = """1 2 3 def f(): 1/0 """ file_2 = """def f(): 1/0 """ def recursionlimit(frames): """ decorator to set the recursion limit temporarily """ def inner(test_function): def wrapper(*args, **kwargs): rl = sys.getrecursionlimit() sys.setrecursionlimit(frames) try: return test_function(*args, **kwargs) finally: sys.setrecursionlimit(rl) return wrapper return inner class ChangedPyFileTest(unittest.TestCase): def test_changing_py_file(self): """Traceback produced if the line where the error occurred is missing? https://github.com/ipython/ipython/issues/1456 """ with TemporaryDirectory() as td: fname = os.path.join(td, "foo.py") with open(fname, "w", encoding="utf-8") as f: f.write(file_1) with prepended_to_syspath(td): ip.run_cell("import foo") with tt.AssertPrints("ZeroDivisionError"): ip.run_cell("foo.f()") # Make the file shorter, so the line of the error is missing. with open(fname, "w", encoding="utf-8") as f: f.write(file_2) # For some reason, this was failing on the *second* call after # changing the file, so we call f() twice. with tt.AssertNotPrints("Internal Python error", channel='stderr'): with tt.AssertPrints("ZeroDivisionError"): ip.run_cell("foo.f()") with tt.AssertPrints("ZeroDivisionError"): ip.run_cell("foo.f()") iso_8859_5_file = u'''# coding: iso-8859-5 def fail(): """дбИЖ""" 1/0 # дбИЖ ''' class NonAsciiTest(unittest.TestCase): @onlyif_unicode_paths def test_nonascii_path(self): # Non-ascii directory name as well. with TemporaryDirectory(suffix=u'é') as td: fname = os.path.join(td, u"fooé.py") with open(fname, "w", encoding="utf-8") as f: f.write(file_1) with prepended_to_syspath(td): ip.run_cell("import foo") with tt.AssertPrints("ZeroDivisionError"): ip.run_cell("foo.f()") def test_iso8859_5(self): with TemporaryDirectory() as td: fname = os.path.join(td, 'dfghjkl.py') with io.open(fname, 'w', encoding='iso-8859-5') as f: f.write(iso_8859_5_file) with prepended_to_syspath(td): ip.run_cell("from dfghjkl import fail") with tt.AssertPrints("ZeroDivisionError"): with tt.AssertPrints(u'дбИЖ', suppress=False): ip.run_cell('fail()') def test_nonascii_msg(self): cell = u"raise Exception('é')" expected = u"Exception('é')" ip.run_cell("%xmode plain") with tt.AssertPrints(expected): ip.run_cell(cell) ip.run_cell("%xmode verbose") with tt.AssertPrints(expected): ip.run_cell(cell) ip.run_cell("%xmode context") with tt.AssertPrints(expected): ip.run_cell(cell) ip.run_cell("%xmode minimal") with tt.AssertPrints(u"Exception: é"): ip.run_cell(cell) # Put this back into Context mode for later tests. ip.run_cell("%xmode context") class NestedGenExprTestCase(unittest.TestCase): """ Regression test for the following issues: https://github.com/ipython/ipython/issues/8293 https://github.com/ipython/ipython/issues/8205 """ def test_nested_genexpr(self): code = dedent( """\ class SpecificException(Exception): pass def foo(x): raise SpecificException("Success!") sum(sum(foo(x) for _ in [0]) for x in [0]) """ ) with tt.AssertPrints('SpecificException: Success!', suppress=False): ip.run_cell(code) indentationerror_file = """if True: zoom() """ class IndentationErrorTest(unittest.TestCase): def test_indentationerror_shows_line(self): # See issue gh-2398 with tt.AssertPrints("IndentationError"): with tt.AssertPrints("zoom()", suppress=False): ip.run_cell(indentationerror_file) with TemporaryDirectory() as td: fname = os.path.join(td, "foo.py") with open(fname, "w", encoding="utf-8") as f: f.write(indentationerror_file) with tt.AssertPrints("IndentationError"): with tt.AssertPrints("zoom()", suppress=False): ip.run_line_magic("run", fname) @skip_without("pandas") def test_dynamic_code(): code = """ import pandas df = pandas.DataFrame([]) # Important: only fails inside of an "exec" call: exec("df.foobarbaz()") """ with tt.AssertPrints("Could not get source"): ip.run_cell(code) se_file_1 = """1 2 7/ """ se_file_2 = """7/ """ class SyntaxErrorTest(unittest.TestCase): def test_syntaxerror_no_stacktrace_at_compile_time(self): syntax_error_at_compile_time = """ def foo(): .. """ with tt.AssertPrints("SyntaxError"): ip.run_cell(syntax_error_at_compile_time) with tt.AssertNotPrints("foo()"): ip.run_cell(syntax_error_at_compile_time) def test_syntaxerror_stacktrace_when_running_compiled_code(self): syntax_error_at_runtime = """ def foo(): eval("..") def bar(): foo() bar() """ with tt.AssertPrints("SyntaxError"): ip.run_cell(syntax_error_at_runtime) # Assert syntax error during runtime generate stacktrace with tt.AssertPrints(["foo()", "bar()"]): ip.run_cell(syntax_error_at_runtime) del ip.user_ns['bar'] del ip.user_ns['foo'] def test_changing_py_file(self): with TemporaryDirectory() as td: fname = os.path.join(td, "foo.py") with open(fname, "w", encoding="utf-8") as f: f.write(se_file_1) with tt.AssertPrints(["7/", "SyntaxError"]): ip.run_line_magic("run", fname) # Modify the file with open(fname, "w", encoding="utf-8") as f: f.write(se_file_2) # The SyntaxError should point to the correct line with tt.AssertPrints(["7/", "SyntaxError"]): ip.run_line_magic("run", fname) def test_non_syntaxerror(self): # SyntaxTB may be called with an error other than a SyntaxError # See e.g. gh-4361 try: raise ValueError('QWERTY') except ValueError: with tt.AssertPrints('QWERTY'): ip.showsyntaxerror() import sys if platform.python_implementation() != "PyPy": """ New 3.9 Pgen Parser does not raise Memory error, except on failed malloc. """ class MemoryErrorTest(unittest.TestCase): def test_memoryerror(self): memoryerror_code = "(" * 200 + ")" * 200 ip.run_cell(memoryerror_code) class Python3ChainedExceptionsTest(unittest.TestCase): DIRECT_CAUSE_ERROR_CODE = """ try: x = 1 + 2 print(not_defined_here) except Exception as e: x += 55 x - 1 y = {} raise KeyError('uh') from e """ EXCEPTION_DURING_HANDLING_CODE = """ try: x = 1 + 2 print(not_defined_here) except Exception as e: x += 55 x - 1 y = {} raise KeyError('uh') """ SUPPRESS_CHAINING_CODE = """ try: 1/0 except Exception: raise ValueError("Yikes") from None """ SYS_EXIT_WITH_CONTEXT_CODE = """ try: 1/0 except Exception as e: raise SystemExit(1) """ def test_direct_cause_error(self): with tt.AssertPrints(["KeyError", "NameError", "direct cause"]): ip.run_cell(self.DIRECT_CAUSE_ERROR_CODE) def test_exception_during_handling_error(self): with tt.AssertPrints(["KeyError", "NameError", "During handling"]): ip.run_cell(self.EXCEPTION_DURING_HANDLING_CODE) def test_sysexit_while_handling_error(self): with tt.AssertPrints(["SystemExit", "to see the full traceback"]): with tt.AssertNotPrints(["another exception"], suppress=False): ip.run_cell(self.SYS_EXIT_WITH_CONTEXT_CODE) def test_suppress_exception_chaining(self): with tt.AssertNotPrints("ZeroDivisionError"), \ tt.AssertPrints("ValueError", suppress=False): ip.run_cell(self.SUPPRESS_CHAINING_CODE) def test_plain_direct_cause_error(self): with tt.AssertPrints(["KeyError", "NameError", "direct cause"]): ip.run_cell("%xmode Plain") ip.run_cell(self.DIRECT_CAUSE_ERROR_CODE) ip.run_cell("%xmode Verbose") def test_plain_exception_during_handling_error(self): with tt.AssertPrints(["KeyError", "NameError", "During handling"]): ip.run_cell("%xmode Plain") ip.run_cell(self.EXCEPTION_DURING_HANDLING_CODE) ip.run_cell("%xmode Verbose") def test_plain_suppress_exception_chaining(self): with tt.AssertNotPrints("ZeroDivisionError"), \ tt.AssertPrints("ValueError", suppress=False): ip.run_cell("%xmode Plain") ip.run_cell(self.SUPPRESS_CHAINING_CODE) ip.run_cell("%xmode Verbose") class RecursionTest(unittest.TestCase): DEFINITIONS = """ def non_recurs(): 1/0 def r1(): r1() def r3a(): r3b() def r3b(): r3c() def r3c(): r3a() def r3o1(): r3a() def r3o2(): r3o1() """ def setUp(self): ip.run_cell(self.DEFINITIONS) def test_no_recursion(self): with tt.AssertNotPrints("skipping similar frames"): ip.run_cell("non_recurs()") @recursionlimit(200) def test_recursion_one_frame(self): with tt.AssertPrints(re.compile( r"\[\.\.\. skipping similar frames: r1 at line 5 \(\d{2,3} times\)\]") ): ip.run_cell("r1()") @recursionlimit(160) def test_recursion_three_frames(self): with tt.AssertPrints("[... skipping similar frames: "), \ tt.AssertPrints(re.compile(r"r3a at line 8 \(\d{2} times\)"), suppress=False), \ tt.AssertPrints(re.compile(r"r3b at line 11 \(\d{2} times\)"), suppress=False), \ tt.AssertPrints(re.compile(r"r3c at line 14 \(\d{2} times\)"), suppress=False): ip.run_cell("r3o2()") class PEP678NotesReportingTest(unittest.TestCase): ERROR_WITH_NOTE = """ try: raise AssertionError("Message") except Exception as e: try: e.add_note("This is a PEP-678 note.") except AttributeError: # Python <= 3.10 e.__notes__ = ("This is a PEP-678 note.",) raise """ def test_verbose_reports_notes(self): with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): ip.run_cell(self.ERROR_WITH_NOTE) def test_plain_reports_notes(self): with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): ip.run_cell("%xmode Plain") ip.run_cell(self.ERROR_WITH_NOTE) ip.run_cell("%xmode Verbose") #---------------------------------------------------------------------------- # module testing (minimal) def test_handlers(): def spam(c, d_e): (d, e) = d_e x = c + d y = c * d foo(x, y) def foo(a, b, bar=1): eggs(a, b + bar) def eggs(f, g, z=globals()): h = f + g i = f - g return h / i buff = io.StringIO() buff.write('') buff.write('*** Before ***') try: buff.write(spam(1, (2, 3))) except: traceback.print_exc(file=buff) handler = ColorTB(ostream=buff) buff.write('*** ColorTB ***') try: buff.write(spam(1, (2, 3))) except: handler(*sys.exc_info()) buff.write('') handler = VerboseTB(ostream=buff) buff.write('*** VerboseTB ***') try: buff.write(spam(1, (2, 3))) except: handler(*sys.exc_info()) buff.write('') ipython-8.35.0/IPython/core/ultratb.py000066400000000000000000001565341477474304100177030ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Verbose and colourful traceback formatting. **ColorTB** I've always found it a bit hard to visually parse tracebacks in Python. The ColorTB class is a solution to that problem. It colors the different parts of a traceback in a manner similar to what you would expect from a syntax-highlighting text editor. Installation instructions for ColorTB:: import sys,ultratb sys.excepthook = ultratb.ColorTB() **VerboseTB** I've also included a port of Ka-Ping Yee's "cgitb.py" that produces all kinds of useful info when a traceback occurs. Ping originally had it spit out HTML and intended it for CGI programmers, but why should they have all the fun? I altered it to spit out colored text to the terminal. It's a bit overwhelming, but kind of neat, and maybe useful for long-running programs that you believe are bug-free. If a crash *does* occur in that type of program you want details. Give it a shot--you'll love it or you'll hate it. .. note:: The Verbose mode prints the variables currently visible where the exception happened (shortening their strings if too long). This can potentially be very slow, if you happen to have a huge data structure whose string representation is complex to compute. Your computer may appear to freeze for a while with cpu usage at 100%. If this occurs, you can cancel the traceback with Ctrl-C (maybe hitting it more than once). If you encounter this kind of situation often, you may want to use the Verbose_novars mode instead of the regular Verbose, which avoids formatting variables (but otherwise includes the information and context given by Verbose). .. note:: The verbose mode print all variables in the stack, which means it can potentially leak sensitive information like access keys, or unencrypted password. Installation instructions for VerboseTB:: import sys,ultratb sys.excepthook = ultratb.VerboseTB() Note: Much of the code in this module was lifted verbatim from the standard library module 'traceback.py' and Ka-Ping Yee's 'cgitb.py'. Color schemes ------------- The colors are defined in the class TBTools through the use of the ColorSchemeTable class. Currently the following exist: - NoColor: allows all of this module to be used in any terminal (the color escapes are just dummy blank strings). - Linux: is meant to look good in a terminal like the Linux console (black or very dark background). - LightBG: similar to Linux but swaps dark/light colors to be more readable in light background terminals. - Neutral: a neutral color scheme that should be readable on both light and dark background You can implement other color schemes easily, the syntax is fairly self-explanatory. Please send back new schemes you develop to the author for possible inclusion in future releases. Inheritance diagram: .. inheritance-diagram:: IPython.core.ultratb :parts: 3 """ #***************************************************************************** # Copyright (C) 2001 Nathaniel Gray # Copyright (C) 2001-2004 Fernando Perez # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** from collections.abc import Sequence import functools import inspect import linecache import pydoc import sys import time import traceback import types from types import TracebackType from typing import Any, List, Optional, Tuple import stack_data from pygments.formatters.terminal256 import Terminal256Formatter from pygments.styles import get_style_by_name import IPython.utils.colorable as colorable # IPython's own modules from IPython import get_ipython from IPython.core import debugger from IPython.core.display_trap import DisplayTrap from IPython.core.excolors import exception_colors from IPython.utils import PyColorize from IPython.utils import path as util_path from IPython.utils import py3compat from IPython.utils.terminal import get_terminal_size # Globals # amount of space to put line numbers before verbose tracebacks INDENT_SIZE = 8 # Default color scheme. This is used, for example, by the traceback # formatter. When running in an actual IPython instance, the user's rc.colors # value is used, but having a module global makes this functionality available # to users of ultratb who are NOT running inside ipython. DEFAULT_SCHEME = 'NoColor' FAST_THRESHOLD = 10_000 # --------------------------------------------------------------------------- # Code begins # Helper function -- largely belongs to VerboseTB, but we need the same # functionality to produce a pseudo verbose TB for SyntaxErrors, so that they # can be recognized properly by ipython.el's py-traceback-line-re # (SyntaxErrors have to be treated specially because they have no traceback) @functools.lru_cache() def count_lines_in_py_file(filename: str) -> int: """ Given a filename, returns the number of lines in the file if it ends with the extension ".py". Otherwise, returns 0. """ if not filename.endswith(".py"): return 0 else: try: with open(filename, "r") as file: s = sum(1 for line in file) except UnicodeError: return 0 return s """ Given a frame object, returns the total number of lines in the file if the filename ends with the extension ".py". Otherwise, returns 0. """ def get_line_number_of_frame(frame: types.FrameType) -> int: """ Given a frame object, returns the total number of lines in the file containing the frame's code object, or the number of lines in the frame's source code if the file is not available. Parameters ---------- frame : FrameType The frame object whose line number is to be determined. Returns ------- int The total number of lines in the file containing the frame's code object, or the number of lines in the frame's source code if the file is not available. """ filename = frame.f_code.co_filename if filename is None: print("No file....") lines, first = inspect.getsourcelines(frame) return first + len(lines) return count_lines_in_py_file(filename) def _safe_string(value, what, func=str): # Copied from cpython/Lib/traceback.py try: return func(value) except: return f"<{what} {func.__name__}() failed>" def _format_traceback_lines(lines, Colors, has_colors: bool, lvals): """ Format tracebacks lines with pointing arrow, leading numbers... Parameters ---------- lines : list[Line] Colors ColorScheme used. lvals : str Values of local variables, already colored, to inject just after the error line. """ numbers_width = INDENT_SIZE - 1 res = [] for stack_line in lines: if stack_line is stack_data.LINE_GAP: res.append('%s (...)%s\n' % (Colors.linenoEm, Colors.Normal)) continue line = stack_line.render(pygmented=has_colors).rstrip('\n') + '\n' lineno = stack_line.lineno if stack_line.is_current: # This is the line with the error pad = numbers_width - len(str(lineno)) num = '%s%s' % (debugger.make_arrow(pad), str(lineno)) start_color = Colors.linenoEm else: num = '%*s' % (numbers_width, lineno) start_color = Colors.lineno line = '%s%s%s %s' % (start_color, num, Colors.Normal, line) res.append(line) if lvals and stack_line.is_current: res.append(lvals + '\n') return res def _simple_format_traceback_lines(lnum, index, lines, Colors, lvals, _line_format): """ Format tracebacks lines with pointing arrow, leading numbers... Parameters ========== lnum: int number of the target line of code. index: int which line in the list should be highlighted. lines: list[string] Colors: ColorScheme used. lvals: bytes Values of local variables, already colored, to inject just after the error line. _line_format: f (str) -> (str, bool) return (colorized version of str, failure to do so) """ numbers_width = INDENT_SIZE - 1 res = [] for i, line in enumerate(lines, lnum - index): # assert isinstance(line, str) line = py3compat.cast_unicode(line) new_line, err = _line_format(line, "str") if not err: line = new_line if i == lnum: # This is the line with the error pad = numbers_width - len(str(i)) num = "%s%s" % (debugger.make_arrow(pad), str(lnum)) line = "%s%s%s %s%s" % ( Colors.linenoEm, num, Colors.line, line, Colors.Normal, ) else: num = "%*s" % (numbers_width, i) line = "%s%s%s %s" % (Colors.lineno, num, Colors.Normal, line) res.append(line) if lvals and i == lnum: res.append(lvals + "\n") return res def _format_filename(file, ColorFilename, ColorNormal, *, lineno=None): """ Format filename lines with custom formatting from caching compiler or `File *.py` by default Parameters ---------- file : str ColorFilename ColorScheme's filename coloring to be used. ColorNormal ColorScheme's normal coloring to be used. """ ipinst = get_ipython() if ( ipinst is not None and (data := ipinst.compile.format_code_name(file)) is not None ): label, name = data if lineno is None: tpl_link = f"{{label}} {ColorFilename}{{name}}{ColorNormal}" else: tpl_link = ( f"{{label}} {ColorFilename}{{name}}, line {{lineno}}{ColorNormal}" ) else: label = "File" name = util_path.compress_user( py3compat.cast_unicode(file, util_path.fs_encoding) ) if lineno is None: tpl_link = f"{{label}} {ColorFilename}{{name}}{ColorNormal}" else: # can we make this the more friendly ", line {{lineno}}", or do we need to preserve the formatting with the colon? tpl_link = f"{{label}} {ColorFilename}{{name}}:{{lineno}}{ColorNormal}" return tpl_link.format(label=label, name=name, lineno=lineno) #--------------------------------------------------------------------------- # Module classes class TBTools(colorable.Colorable): """Basic tools used by all traceback printer classes.""" # Number of frames to skip when reporting tracebacks tb_offset = 0 def __init__( self, color_scheme="NoColor", call_pdb=False, ostream=None, parent=None, config=None, *, debugger_cls=None, ): # Whether to call the interactive pdb debugger after printing # tracebacks or not super(TBTools, self).__init__(parent=parent, config=config) self.call_pdb = call_pdb # Output stream to write to. Note that we store the original value in # a private attribute and then make the public ostream a property, so # that we can delay accessing sys.stdout until runtime. The way # things are written now, the sys.stdout object is dynamically managed # so a reference to it should NEVER be stored statically. This # property approach confines this detail to a single location, and all # subclasses can simply access self.ostream for writing. self._ostream = ostream # Create color table self.color_scheme_table = exception_colors() self.set_colors(color_scheme) self.old_scheme = color_scheme # save initial value for toggles self.debugger_cls = debugger_cls or debugger.Pdb if call_pdb: self.pdb = self.debugger_cls() else: self.pdb = None def _get_ostream(self): """Output stream that exceptions are written to. Valid values are: - None: the default, which means that IPython will dynamically resolve to sys.stdout. This ensures compatibility with most tools, including Windows (where plain stdout doesn't recognize ANSI escapes). - Any object with 'write' and 'flush' attributes. """ return sys.stdout if self._ostream is None else self._ostream def _set_ostream(self, val): assert val is None or (hasattr(val, 'write') and hasattr(val, 'flush')) self._ostream = val ostream = property(_get_ostream, _set_ostream) @staticmethod def _get_chained_exception(exception_value): cause = getattr(exception_value, "__cause__", None) if cause: return cause if getattr(exception_value, "__suppress_context__", False): return None return getattr(exception_value, "__context__", None) def get_parts_of_chained_exception( self, evalue ) -> Optional[Tuple[type, BaseException, TracebackType]]: chained_evalue = self._get_chained_exception(evalue) if chained_evalue: return chained_evalue.__class__, chained_evalue, chained_evalue.__traceback__ return None def prepare_chained_exception_message(self, cause) -> List[Any]: direct_cause = "\nThe above exception was the direct cause of the following exception:\n" exception_during_handling = "\nDuring handling of the above exception, another exception occurred:\n" if cause: message = [[direct_cause]] else: message = [[exception_during_handling]] return message @property def has_colors(self) -> bool: return self.color_scheme_table.active_scheme_name.lower() != "nocolor" def set_colors(self, *args, **kw): """Shorthand access to the color table scheme selector method.""" # Set own color table self.color_scheme_table.set_active_scheme(*args, **kw) # for convenience, set Colors to the active scheme self.Colors = self.color_scheme_table.active_colors # Also set colors of debugger if hasattr(self, 'pdb') and self.pdb is not None: self.pdb.set_colors(*args, **kw) def color_toggle(self): """Toggle between the currently active color scheme and NoColor.""" if self.color_scheme_table.active_scheme_name == 'NoColor': self.color_scheme_table.set_active_scheme(self.old_scheme) self.Colors = self.color_scheme_table.active_colors else: self.old_scheme = self.color_scheme_table.active_scheme_name self.color_scheme_table.set_active_scheme('NoColor') self.Colors = self.color_scheme_table.active_colors def stb2text(self, stb): """Convert a structured traceback (a list) to a string.""" return '\n'.join(stb) def text(self, etype, value, tb, tb_offset: Optional[int] = None, context=5): """Return formatted traceback. Subclasses may override this if they add extra arguments. """ tb_list = self.structured_traceback(etype, value, tb, tb_offset, context) return self.stb2text(tb_list) def structured_traceback( self, etype: type, evalue: Optional[BaseException], etb: Optional[TracebackType] = None, tb_offset: Optional[int] = None, number_of_lines_of_context: int = 5, ): """Return a list of traceback frames. Must be implemented by each class. """ raise NotImplementedError() #--------------------------------------------------------------------------- class ListTB(TBTools): """Print traceback information from a traceback list, with optional color. Calling requires 3 arguments: (etype, evalue, elist) as would be obtained by:: etype, evalue, tb = sys.exc_info() if tb: elist = traceback.extract_tb(tb) else: elist = None It can thus be used by programs which need to process the traceback before printing (such as console replacements based on the code module from the standard library). Because they are meant to be called without a full traceback (only a list), instances of this class can't call the interactive pdb debugger.""" def __call__(self, etype, value, elist): self.ostream.flush() self.ostream.write(self.text(etype, value, elist)) self.ostream.write('\n') def _extract_tb(self, tb): if tb: return traceback.extract_tb(tb) else: return None def structured_traceback( self, etype: type, evalue: Optional[BaseException], etb: Optional[TracebackType] = None, tb_offset: Optional[int] = None, context=5, ): """Return a color formatted string with the traceback info. Parameters ---------- etype : exception type Type of the exception raised. evalue : object Data stored in the exception etb : list | TracebackType | None If list: List of frames, see class docstring for details. If Traceback: Traceback of the exception. tb_offset : int, optional Number of frames in the traceback to skip. If not given, the instance evalue is used (set in constructor). context : int, optional Number of lines of context information to print. Returns ------- String with formatted exception. """ # This is a workaround to get chained_exc_ids in recursive calls # etb should not be a tuple if structured_traceback is not recursive if isinstance(etb, tuple): etb, chained_exc_ids = etb else: chained_exc_ids = set() if isinstance(etb, list): elist = etb elif etb is not None: elist = self._extract_tb(etb) else: elist = [] tb_offset = self.tb_offset if tb_offset is None else tb_offset assert isinstance(tb_offset, int) Colors = self.Colors out_list = [] if elist: if tb_offset and len(elist) > tb_offset: elist = elist[tb_offset:] out_list.append('Traceback %s(most recent call last)%s:' % (Colors.normalEm, Colors.Normal) + '\n') out_list.extend(self._format_list(elist)) # The exception info should be a single entry in the list. lines = ''.join(self._format_exception_only(etype, evalue)) out_list.append(lines) # Find chained exceptions if we have a traceback (not for exception-only mode) if etb is not None: exception = self.get_parts_of_chained_exception(evalue) if exception and (id(exception[1]) not in chained_exc_ids): chained_exception_message = ( self.prepare_chained_exception_message(evalue.__cause__)[0] if evalue is not None else "" ) etype, evalue, etb = exception # Trace exception to avoid infinite 'cause' loop chained_exc_ids.add(id(exception[1])) chained_exceptions_tb_offset = 0 out_list = ( self.structured_traceback( etype, evalue, (etb, chained_exc_ids), # type: ignore chained_exceptions_tb_offset, context, ) + chained_exception_message + out_list ) return out_list def _format_list(self, extracted_list): """Format a list of traceback entry tuples for printing. Given a list of tuples as returned by extract_tb() or extract_stack(), return a list of strings ready for printing. Each string in the resulting list corresponds to the item with the same index in the argument list. Each string ends in a newline; the strings may contain internal newlines as well, for those items whose source text line is not None. Lifted almost verbatim from traceback.py """ Colors = self.Colors output_list = [] for ind, (filename, lineno, name, line) in enumerate(extracted_list): normalCol, nameCol, fileCol, lineCol = ( # Emphasize the last entry (Colors.normalEm, Colors.nameEm, Colors.filenameEm, Colors.line) if ind == len(extracted_list) - 1 else (Colors.Normal, Colors.name, Colors.filename, "") ) fns = _format_filename(filename, fileCol, normalCol, lineno=lineno) item = f"{normalCol} {fns}" if name != "": item += f" in {nameCol}{name}{normalCol}\n" else: item += "\n" if line: item += f"{lineCol} {line.strip()}{normalCol}\n" output_list.append(item) return output_list def _format_exception_only(self, etype, value): """Format the exception part of a traceback. The arguments are the exception type and value such as given by sys.exc_info()[:2]. The return value is a list of strings, each ending in a newline. Normally, the list contains a single string; however, for SyntaxError exceptions, it contains several lines that (when printed) display detailed information about where the syntax error occurred. The message indicating which exception occurred is the always last string in the list. Also lifted nearly verbatim from traceback.py """ have_filedata = False Colors = self.Colors output_list = [] stype = py3compat.cast_unicode(Colors.excName + etype.__name__ + Colors.Normal) if value is None: # Not sure if this can still happen in Python 2.6 and above output_list.append(stype + "\n") else: if issubclass(etype, SyntaxError): have_filedata = True if not value.filename: value.filename = "" if value.lineno: lineno = value.lineno textline = linecache.getline(value.filename, value.lineno) else: lineno = "unknown" textline = "" output_list.append( "%s %s%s\n" % ( Colors.normalEm, _format_filename( value.filename, Colors.filenameEm, Colors.normalEm, lineno=(None if lineno == "unknown" else lineno), ), Colors.Normal, ) ) if textline == "": textline = py3compat.cast_unicode(value.text, "utf-8") if textline is not None: i = 0 while i < len(textline) and textline[i].isspace(): i += 1 output_list.append( "%s %s%s\n" % (Colors.line, textline.strip(), Colors.Normal) ) if value.offset is not None: s = ' ' for c in textline[i:value.offset - 1]: if c.isspace(): s += c else: s += " " output_list.append( "%s%s^%s\n" % (Colors.caret, s, Colors.Normal) ) try: s = value.msg except Exception: s = self._some_str(value) if s: output_list.append( "%s%s:%s %s\n" % (stype, Colors.excName, Colors.Normal, s) ) else: output_list.append("%s\n" % stype) # PEP-678 notes output_list.extend(f"{x}\n" for x in getattr(value, "__notes__", [])) # sync with user hooks if have_filedata: ipinst = get_ipython() if ipinst is not None: ipinst.hooks.synchronize_with_editor(value.filename, value.lineno, 0) return output_list def get_exception_only(self, etype, value): """Only print the exception type and message, without a traceback. Parameters ---------- etype : exception type value : exception value """ return ListTB.structured_traceback(self, etype, value) def show_exception_only(self, etype, evalue): """Only print the exception type and message, without a traceback. Parameters ---------- etype : exception type evalue : exception value """ # This method needs to use __call__ from *this* class, not the one from # a subclass whose signature or behavior may be different ostream = self.ostream ostream.flush() ostream.write('\n'.join(self.get_exception_only(etype, evalue))) ostream.flush() def _some_str(self, value): # Lifted from traceback.py try: return py3compat.cast_unicode(str(value)) except: return u'' % type(value).__name__ class FrameInfo: """ Mirror of stack data's FrameInfo, but so that we can bypass highlighting on really long frames. """ description: Optional[str] filename: Optional[str] lineno: Tuple[int] # number of context lines to use context: Optional[int] raw_lines: List[str] @classmethod def _from_stack_data_FrameInfo(cls, frame_info): return cls( getattr(frame_info, "description", None), getattr(frame_info, "filename", None), # type: ignore[arg-type] getattr(frame_info, "lineno", None), # type: ignore[arg-type] getattr(frame_info, "frame", None), getattr(frame_info, "code", None), sd=frame_info, context=None, ) def __init__( self, description: Optional[str], filename: str, lineno: Tuple[int], frame, code, *, sd=None, context=None, ): self.description = description self.filename = filename self.lineno = lineno self.frame = frame self.code = code self._sd = sd self.context = context # self.lines = [] if sd is None: try: # return a list of source lines and a starting line number self.raw_lines = inspect.getsourcelines(frame)[0] except OSError: self.raw_lines = [ "'Could not get source, probably due dynamically evaluated source code.'" ] @property def variables_in_executing_piece(self): if self._sd: return self._sd.variables_in_executing_piece else: return [] @property def lines(self): from executing.executing import NotOneValueFound try: return self._sd.lines except NotOneValueFound: class Dummy: lineno = 0 is_current = False def render(self, *, pygmented): return "" return [Dummy()] @property def executing(self): if self._sd: return self._sd.executing else: return None # ---------------------------------------------------------------------------- class VerboseTB(TBTools): """A port of Ka-Ping Yee's cgitb.py module that outputs color text instead of HTML. Requires inspect and pydoc. Crazy, man. Modified version which optionally strips the topmost entries from the traceback, to be used with alternate interpreters (because their own code would appear in the traceback).""" tb_highlight = "bg:ansiyellow" tb_highlight_style = "default" def __init__( self, color_scheme: str = "Linux", call_pdb: bool = False, ostream=None, tb_offset: int = 0, long_header: bool = False, include_vars: bool = True, check_cache=None, debugger_cls=None, parent=None, config=None, ): """Specify traceback offset, headers and color scheme. Define how many frames to drop from the tracebacks. Calling it with tb_offset=1 allows use of this handler in interpreters which will have their own code at the top of the traceback (VerboseTB will first remove that frame before printing the traceback info).""" TBTools.__init__( self, color_scheme=color_scheme, call_pdb=call_pdb, ostream=ostream, parent=parent, config=config, debugger_cls=debugger_cls, ) self.tb_offset = tb_offset self.long_header = long_header self.include_vars = include_vars # By default we use linecache.checkcache, but the user can provide a # different check_cache implementation. This was formerly used by the # IPython kernel for interactive code, but is no longer necessary. if check_cache is None: check_cache = linecache.checkcache self.check_cache = check_cache self.skip_hidden = True def format_record(self, frame_info: FrameInfo): """Format a single stack frame""" assert isinstance(frame_info, FrameInfo) Colors = self.Colors # just a shorthand + quicker name lookup ColorsNormal = Colors.Normal # used a lot if isinstance(frame_info._sd, stack_data.RepeatedFrames): return ' %s[... skipping similar frames: %s]%s\n' % ( Colors.excName, frame_info.description, ColorsNormal) indent = " " * INDENT_SIZE em_normal = "%s\n%s%s" % (Colors.valEm, indent, ColorsNormal) tpl_call = f"in {Colors.vName}{{file}}{Colors.valEm}{{scope}}{ColorsNormal}" tpl_call_fail = "in %s%%s%s(***failed resolving arguments***)%s" % ( Colors.vName, Colors.valEm, ColorsNormal, ) tpl_name_val = "%%s %s= %%s%s" % (Colors.valEm, ColorsNormal) link = _format_filename( frame_info.filename, Colors.filenameEm, ColorsNormal, lineno=frame_info.lineno, ) args, varargs, varkw, locals_ = inspect.getargvalues(frame_info.frame) if frame_info.executing is not None: func = frame_info.executing.code_qualname() else: func = "?" if func == "": call = "" else: # Decide whether to include variable details or not var_repr = eqrepr if self.include_vars else nullrepr try: scope = inspect.formatargvalues( args, varargs, varkw, locals_, formatvalue=var_repr ) call = tpl_call.format(file=func, scope=scope) except KeyError: # This happens in situations like errors inside generator # expressions, where local variables are listed in the # line, but can't be extracted from the frame. I'm not # 100% sure this isn't actually a bug in inspect itself, # but since there's no info for us to compute with, the # best we can do is report the failure and move on. Here # we must *not* call any traceback construction again, # because that would mess up use of %debug later on. So we # simply report the failure and move on. The only # limitation will be that this frame won't have locals # listed in the call signature. Quite subtle problem... # I can't think of a good way to validate this in a unit # test, but running a script consisting of: # dict( (k,v.strip()) for (k,v) in range(10) ) # will illustrate the error, if this exception catch is # disabled. call = tpl_call_fail % func lvals = '' lvals_list = [] if self.include_vars: try: # we likely want to fix stackdata at some point, but # still need a workaround. fibp = frame_info.variables_in_executing_piece for var in fibp: lvals_list.append(tpl_name_val % (var.name, repr(var.value))) except Exception: lvals_list.append( "Exception trying to inspect frame. No more locals available." ) if lvals_list: lvals = '%s%s' % (indent, em_normal.join(lvals_list)) result = f'{link}{", " if call else ""}{call}\n' if frame_info._sd is None: # fast fallback if file is too long tpl_link = "%s%%s%s" % (Colors.filenameEm, ColorsNormal) link = tpl_link % util_path.compress_user(frame_info.filename) level = "%s %s\n" % (link, call) _line_format = PyColorize.Parser( style=self.color_scheme_table.active_scheme_name, parent=self ).format2 first_line = frame_info.code.co_firstlineno current_line = frame_info.lineno[0] raw_lines = frame_info.raw_lines index = current_line - first_line if index >= frame_info.context: start = max(index - frame_info.context, 0) stop = index + frame_info.context index = frame_info.context else: start = 0 stop = index + frame_info.context raw_lines = raw_lines[start:stop] return "%s%s" % ( level, "".join( _simple_format_traceback_lines( current_line, index, raw_lines, Colors, lvals, _line_format, ) ), ) # result += "\n".join(frame_info.raw_lines) else: result += "".join( _format_traceback_lines( frame_info.lines, Colors, self.has_colors, lvals ) ) return result def prepare_header(self, etype: str, long_version: bool = False): colors = self.Colors # just a shorthand + quicker name lookup colorsnormal = colors.Normal # used a lot exc = '%s%s%s' % (colors.excName, etype, colorsnormal) width = min(75, get_terminal_size()[0]) if long_version: # Header with the exception type, python version, and date pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable date = time.ctime(time.time()) head = "%s%s%s\n%s%s%s\n%s" % ( colors.topline, "-" * width, colorsnormal, exc, " " * (width - len(etype) - len(pyver)), pyver, date.rjust(width), ) head += ( "\nA problem occurred executing Python code. Here is the sequence of function" "\ncalls leading up to the error, with the most recent (innermost) call last." ) else: # Simplified header head = "%s%s" % ( exc, "Traceback (most recent call last)".rjust(width - len(etype)), ) return head def format_exception(self, etype, evalue): colors = self.Colors # just a shorthand + quicker name lookup colorsnormal = colors.Normal # used a lot # Get (safely) a string form of the exception info try: etype_str, evalue_str = map(str, (etype, evalue)) except: # User exception is improperly defined. etype, evalue = str, sys.exc_info()[:2] etype_str, evalue_str = map(str, (etype, evalue)) # PEP-678 notes notes = getattr(evalue, "__notes__", []) if not isinstance(notes, Sequence) or isinstance(notes, (str, bytes)): notes = [_safe_string(notes, "__notes__", func=repr)] # ... and format it return [ "{}{}{}: {}".format( colors.excName, etype_str, colorsnormal, py3compat.cast_unicode(evalue_str), ), *( "{}{}".format( colorsnormal, _safe_string(py3compat.cast_unicode(n), "note") ) for n in notes ), ] def format_exception_as_a_whole( self, etype: type, evalue: Optional[BaseException], etb: Optional[TracebackType], number_of_lines_of_context, tb_offset: Optional[int], ): """Formats the header, traceback and exception message for a single exception. This may be called multiple times by Python 3 exception chaining (PEP 3134). """ # some locals orig_etype = etype try: etype = etype.__name__ # type: ignore except AttributeError: pass tb_offset = self.tb_offset if tb_offset is None else tb_offset assert isinstance(tb_offset, int) head = self.prepare_header(str(etype), self.long_header) records = ( self.get_records(etb, number_of_lines_of_context, tb_offset) if etb else [] ) frames = [] skipped = 0 lastrecord = len(records) - 1 for i, record in enumerate(records): if ( not isinstance(record._sd, stack_data.RepeatedFrames) and self.skip_hidden ): if ( record.frame.f_locals.get("__tracebackhide__", 0) and i != lastrecord ): skipped += 1 continue if skipped: Colors = self.Colors # just a shorthand + quicker name lookup ColorsNormal = Colors.Normal # used a lot frames.append( " %s[... skipping hidden %s frame]%s\n" % (Colors.excName, skipped, ColorsNormal) ) skipped = 0 frames.append(self.format_record(record)) if skipped: Colors = self.Colors # just a shorthand + quicker name lookup ColorsNormal = Colors.Normal # used a lot frames.append( " %s[... skipping hidden %s frame]%s\n" % (Colors.excName, skipped, ColorsNormal) ) formatted_exception = self.format_exception(etype, evalue) if records: frame_info = records[-1] ipinst = get_ipython() if ipinst is not None: ipinst.hooks.synchronize_with_editor(frame_info.filename, frame_info.lineno, 0) return [[head] + frames + formatted_exception] def get_records( self, etb: TracebackType, number_of_lines_of_context: int, tb_offset: int ): assert etb is not None context = number_of_lines_of_context - 1 after = context // 2 before = context - after if self.has_colors: style = get_style_by_name(self.tb_highlight_style) style = stack_data.style_with_executing_node(style, self.tb_highlight) formatter = Terminal256Formatter(style=style) else: formatter = None options = stack_data.Options( before=before, after=after, pygments_formatter=formatter, ) # Let's estimate the amount of code we will have to parse/highlight. cf: Optional[TracebackType] = etb max_len = 0 tbs = [] while cf is not None: try: mod = inspect.getmodule(cf.tb_frame) if mod is not None: mod_name = mod.__name__ root_name, *_ = mod_name.split(".") if root_name == "IPython": cf = cf.tb_next continue max_len = get_line_number_of_frame(cf.tb_frame) except OSError: max_len = 0 max_len = max(max_len, max_len) tbs.append(cf) cf = getattr(cf, "tb_next", None) if max_len > FAST_THRESHOLD: FIs = [] for tb in tbs: frame = tb.tb_frame # type: ignore lineno = (frame.f_lineno,) code = frame.f_code filename = code.co_filename # TODO: Here we need to use before/after/ FIs.append( FrameInfo( "Raw frame", filename, lineno, frame, code, context=context ) ) return FIs res = list(stack_data.FrameInfo.stack_data(etb, options=options))[tb_offset:] res = [FrameInfo._from_stack_data_FrameInfo(r) for r in res] return res def structured_traceback( self, etype: type, evalue: Optional[BaseException], etb: Optional[TracebackType] = None, tb_offset: Optional[int] = None, number_of_lines_of_context: int = 5, ): """Return a nice text document describing the traceback.""" formatted_exception = self.format_exception_as_a_whole(etype, evalue, etb, number_of_lines_of_context, tb_offset) colors = self.Colors # just a shorthand + quicker name lookup colorsnormal = colors.Normal # used a lot head = '%s%s%s' % (colors.topline, '-' * min(75, get_terminal_size()[0]), colorsnormal) structured_traceback_parts = [head] chained_exceptions_tb_offset = 0 lines_of_context = 3 formatted_exceptions = formatted_exception exception = self.get_parts_of_chained_exception(evalue) if exception: assert evalue is not None formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__) etype, evalue, etb = exception else: evalue = None chained_exc_ids = set() while evalue: formatted_exceptions += self.format_exception_as_a_whole(etype, evalue, etb, lines_of_context, chained_exceptions_tb_offset) exception = self.get_parts_of_chained_exception(evalue) if exception and not id(exception[1]) in chained_exc_ids: chained_exc_ids.add(id(exception[1])) # trace exception to avoid infinite 'cause' loop formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__) etype, evalue, etb = exception else: evalue = None # we want to see exceptions in a reversed order: # the first exception should be on top for formatted_exception in reversed(formatted_exceptions): structured_traceback_parts += formatted_exception return structured_traceback_parts def debugger(self, force: bool = False): """Call up the pdb debugger if desired, always clean up the tb reference. Keywords: - force(False): by default, this routine checks the instance call_pdb flag and does not actually invoke the debugger if the flag is false. The 'force' option forces the debugger to activate even if the flag is false. If the call_pdb flag is set, the pdb interactive debugger is invoked. In all cases, the self.tb reference to the current traceback is deleted to prevent lingering references which hamper memory management. Note that each call to pdb() does an 'import readline', so if your app requires a special setup for the readline completers, you'll have to fix that by hand after invoking the exception handler.""" if force or self.call_pdb: if self.pdb is None: self.pdb = self.debugger_cls() # the system displayhook may have changed, restore the original # for pdb display_trap = DisplayTrap(hook=sys.__displayhook__) with display_trap: self.pdb.reset() # Find the right frame so we don't pop up inside ipython itself if hasattr(self, "tb") and self.tb is not None: # type: ignore[has-type] etb = self.tb # type: ignore[has-type] else: etb = self.tb = sys.last_traceback while self.tb is not None and self.tb.tb_next is not None: assert self.tb.tb_next is not None self.tb = self.tb.tb_next if etb and etb.tb_next: etb = etb.tb_next self.pdb.botframe = etb.tb_frame # last_value should be deprecated, but last-exc sometimme not set # please check why later and remove the getattr. exc = sys.last_value if sys.version_info < (3, 12) else getattr(sys, "last_exc", sys.last_value) # type: ignore[attr-defined] if exc: self.pdb.interaction(None, exc) else: self.pdb.interaction(None, etb) if hasattr(self, 'tb'): del self.tb def handler(self, info=None): (etype, evalue, etb) = info or sys.exc_info() self.tb = etb ostream = self.ostream ostream.flush() ostream.write(self.text(etype, evalue, etb)) ostream.write('\n') ostream.flush() # Changed so an instance can just be called as VerboseTB_inst() and print # out the right info on its own. def __call__(self, etype=None, evalue=None, etb=None): """This hook can replace sys.excepthook (for Python 2.1 or higher).""" if etb is None: self.handler() else: self.handler((etype, evalue, etb)) try: self.debugger() except KeyboardInterrupt: print("\nKeyboardInterrupt") #---------------------------------------------------------------------------- class FormattedTB(VerboseTB, ListTB): """Subclass ListTB but allow calling with a traceback. It can thus be used as a sys.excepthook for Python > 2.1. Also adds 'Context' and 'Verbose' modes, not available in ListTB. Allows a tb_offset to be specified. This is useful for situations where one needs to remove a number of topmost frames from the traceback (such as occurs with python programs that themselves execute other python code, like Python shells). """ mode: str def __init__(self, mode='Plain', color_scheme='Linux', call_pdb=False, ostream=None, tb_offset=0, long_header=False, include_vars=False, check_cache=None, debugger_cls=None, parent=None, config=None): # NEVER change the order of this list. Put new modes at the end: self.valid_modes = ['Plain', 'Context', 'Verbose', 'Minimal'] self.verbose_modes = self.valid_modes[1:3] VerboseTB.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb, ostream=ostream, tb_offset=tb_offset, long_header=long_header, include_vars=include_vars, check_cache=check_cache, debugger_cls=debugger_cls, parent=parent, config=config) # Different types of tracebacks are joined with different separators to # form a single string. They are taken from this dict self._join_chars = dict(Plain='', Context='\n', Verbose='\n', Minimal='') # set_mode also sets the tb_join_char attribute self.set_mode(mode) def structured_traceback(self, etype, value, tb, tb_offset=None, number_of_lines_of_context=5): tb_offset = self.tb_offset if tb_offset is None else tb_offset mode = self.mode if mode in self.verbose_modes: # Verbose modes need a full traceback return VerboseTB.structured_traceback( self, etype, value, tb, tb_offset, number_of_lines_of_context ) elif mode == 'Minimal': return ListTB.get_exception_only(self, etype, value) else: # We must check the source cache because otherwise we can print # out-of-date source code. self.check_cache() # Now we can extract and format the exception return ListTB.structured_traceback( self, etype, value, tb, tb_offset, number_of_lines_of_context ) def stb2text(self, stb): """Convert a structured traceback (a list) to a string.""" return self.tb_join_char.join(stb) def set_mode(self, mode: Optional[str] = None): """Switch to the desired mode. If mode is not specified, cycles through the available modes.""" if not mode: new_idx = (self.valid_modes.index(self.mode) + 1 ) % \ len(self.valid_modes) self.mode = self.valid_modes[new_idx] elif mode not in self.valid_modes: raise ValueError( "Unrecognized mode in FormattedTB: <" + mode + ">\n" "Valid modes: " + str(self.valid_modes) ) else: assert isinstance(mode, str) self.mode = mode # include variable details only in 'Verbose' mode self.include_vars = (self.mode == self.valid_modes[2]) # Set the join character for generating text tracebacks self.tb_join_char = self._join_chars[self.mode] # some convenient shortcuts def plain(self): self.set_mode(self.valid_modes[0]) def context(self): self.set_mode(self.valid_modes[1]) def verbose(self): self.set_mode(self.valid_modes[2]) def minimal(self): self.set_mode(self.valid_modes[3]) #---------------------------------------------------------------------------- class AutoFormattedTB(FormattedTB): """A traceback printer which can be called on the fly. It will find out about exceptions by itself. A brief example:: AutoTB = AutoFormattedTB(mode = 'Verbose',color_scheme='Linux') try: ... except: AutoTB() # or AutoTB(out=logfile) where logfile is an open file object """ def __call__(self, etype=None, evalue=None, etb=None, out=None, tb_offset=None): """Print out a formatted exception traceback. Optional arguments: - out: an open file-like object to direct output to. - tb_offset: the number of frames to skip over in the stack, on a per-call basis (this overrides temporarily the instance's tb_offset given at initialization time.""" if out is None: out = self.ostream out.flush() out.write(self.text(etype, evalue, etb, tb_offset)) out.write('\n') out.flush() # FIXME: we should remove the auto pdb behavior from here and leave # that to the clients. try: self.debugger() except KeyboardInterrupt: print("\nKeyboardInterrupt") def structured_traceback( self, etype: type, evalue: Optional[BaseException], etb: Optional[TracebackType] = None, tb_offset: Optional[int] = None, number_of_lines_of_context: int = 5, ): # tb: TracebackType or tupleof tb types ? if etype is None: etype, evalue, etb = sys.exc_info() if isinstance(etb, tuple): # tb is a tuple if this is a chained exception. self.tb = etb[0] else: self.tb = etb return FormattedTB.structured_traceback( self, etype, evalue, etb, tb_offset, number_of_lines_of_context ) #--------------------------------------------------------------------------- # A simple class to preserve Nathan's original functionality. class ColorTB(FormattedTB): """Shorthand to initialize a FormattedTB in Linux colors mode.""" def __init__(self, color_scheme='Linux', call_pdb=0, **kwargs): FormattedTB.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb, **kwargs) class SyntaxTB(ListTB): """Extension which holds some state: the last exception value""" def __init__(self, color_scheme='NoColor', parent=None, config=None): ListTB.__init__(self, color_scheme, parent=parent, config=config) self.last_syntax_error = None def __call__(self, etype, value, elist): self.last_syntax_error = value ListTB.__call__(self, etype, value, elist) def structured_traceback(self, etype, value, elist, tb_offset=None, context=5): # If the source file has been edited, the line in the syntax error can # be wrong (retrieved from an outdated cache). This replaces it with # the current value. if isinstance(value, SyntaxError) \ and isinstance(value.filename, str) \ and isinstance(value.lineno, int): linecache.checkcache(value.filename) newtext = linecache.getline(value.filename, value.lineno) if newtext: value.text = newtext self.last_syntax_error = value return super(SyntaxTB, self).structured_traceback(etype, value, elist, tb_offset=tb_offset, context=context) def clear_err_state(self): """Return the current error state and clear it""" e = self.last_syntax_error self.last_syntax_error = None return e def stb2text(self, stb): """Convert a structured traceback (a list) to a string.""" return ''.join(stb) # some internal-use functions def text_repr(value): """Hopefully pretty robust repr equivalent.""" # this is pretty horrible but should always return *something* try: return pydoc.text.repr(value) # type: ignore[call-arg] except KeyboardInterrupt: raise except: try: return repr(value) except KeyboardInterrupt: raise except: try: # all still in an except block so we catch # getattr raising name = getattr(value, '__name__', None) if name: # ick, recursion return text_repr(name) klass = getattr(value, '__class__', None) if klass: return '%s instance' % text_repr(klass) except KeyboardInterrupt: raise except: return 'UNRECOVERABLE REPR FAILURE' def eqrepr(value, repr=text_repr): return '=%s' % repr(value) def nullrepr(value, repr=text_repr): return '' ipython-8.35.0/IPython/core/usage.py000066400000000000000000000323461477474304100173240ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Usage information for the main IPython applications. """ #----------------------------------------------------------------------------- # Copyright (C) 2008-2011 The IPython Development Team # Copyright (C) 2001-2007 Fernando Perez. # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #----------------------------------------------------------------------------- import sys from IPython.core import release cl_usage = """\ ========= IPython ========= Tools for Interactive Computing in Python ========================================= A Python shell with automatic history (input and output), dynamic object introspection, easier configuration, command completion, access to the system shell and more. IPython can also be embedded in running programs. Usage ipython [subcommand] [options] [-c cmd | -m mod | file] [--] [arg] ... If invoked with no options, it executes the file and exits, passing the remaining arguments to the script, just as if you had specified the same command with python. You may need to specify `--` before args to be passed to the script, to prevent IPython from attempting to parse them. If you specify the option `-i` before the filename, it will enter an interactive IPython session after running the script, rather than exiting. Files ending in .py will be treated as normal Python, but files ending in .ipy can contain special IPython syntax (magic commands, shell expansions, etc.). Almost all configuration in IPython is available via the command-line. Do `ipython --help-all` to see all available options. For persistent configuration, look into your `ipython_config.py` configuration file for details. This file is typically installed in the `IPYTHONDIR` directory, and there is a separate configuration directory for each profile. The default profile directory will be located in $IPYTHONDIR/profile_default. IPYTHONDIR defaults to to `$HOME/.ipython`. For Windows users, $HOME resolves to C:\\Users\\YourUserName in most instances. To initialize a profile with the default configuration file, do:: $> ipython profile create and start editing `IPYTHONDIR/profile_default/ipython_config.py` In IPython's documentation, we will refer to this directory as `IPYTHONDIR`, you can change its default location by creating an environment variable with this name and setting it to the desired path. For more information, see the manual available in HTML and PDF in your installation, or online at https://ipython.org/documentation.html. """ interactive_usage = """ IPython -- An enhanced Interactive Python ========================================= IPython offers a fully compatible replacement for the standard Python interpreter, with convenient shell features, special commands, command history mechanism and output results caching. At your system command line, type 'ipython -h' to see the command line options available. This document only describes interactive features. GETTING HELP ------------ Within IPython you have various way to access help: ? -> Introduction and overview of IPython's features (this screen). object? -> Details about 'object'. object?? -> More detailed, verbose information about 'object'. %quickref -> Quick reference of all IPython specific syntax and magics. help -> Access Python's own help system. If you are in terminal IPython you can quit this screen by pressing `q`. MAIN FEATURES ------------- * Access to the standard Python help with object docstrings and the Python manuals. Simply type 'help' (no quotes) to invoke it. * Magic commands: type %magic for information on the magic subsystem. * System command aliases, via the %alias command or the configuration file(s). * Dynamic object information: Typing ?word or word? prints detailed information about an object. Certain long strings (code, etc.) get snipped in the center for brevity. Typing ??word or word?? gives access to the full information without snipping long strings. Strings that are longer than the screen are printed through the less pager. The ?/?? system gives access to the full source code for any object (if available), shows function prototypes and other useful information. If you just want to see an object's docstring, type '%pdoc object' (without quotes, and without % if you have automagic on). * Tab completion in the local namespace: At any time, hitting tab will complete any available python commands or variable names, and show you a list of the possible completions if there's no unambiguous one. It will also complete filenames in the current directory. * Search previous command history in multiple ways: - Start typing, and then use arrow keys up/down or (Ctrl-p/Ctrl-n) to search through the history items that match what you've typed so far. - Hit Ctrl-r: opens a search prompt. Begin typing and the system searches your history for lines that match what you've typed so far, completing as much as it can. - %hist: search history by index. * Persistent command history across sessions. * Logging of input with the ability to save and restore a working session. * System shell with !. Typing !ls will run 'ls' in the current directory. * The reload command does a 'deep' reload of a module: changes made to the module since you imported will actually be available without having to exit. * Verbose and colored exception traceback printouts. See the magic xmode and xcolor functions for details (just type %magic). * Input caching system: IPython offers numbered prompts (In/Out) with input and output caching. All input is saved and can be retrieved as variables (besides the usual arrow key recall). The following GLOBAL variables always exist (so don't overwrite them!): _i: stores previous input. _ii: next previous. _iii: next-next previous. _ih : a list of all input _ih[n] is the input from line n. Additionally, global variables named _i are dynamically created ( being the prompt counter), such that _i == _ih[] For example, what you typed at prompt 14 is available as _i14 and _ih[14]. You can create macros which contain multiple input lines from this history, for later re-execution, with the %macro function. The history function %hist allows you to see any part of your input history by printing a range of the _i variables. Note that inputs which contain magic functions (%) appear in the history with a prepended comment. This is because they aren't really valid Python code, so you can't exec them. * Output caching system: For output that is returned from actions, a system similar to the input cache exists but using _ instead of _i. Only actions that produce a result (NOT assignments, for example) are cached. If you are familiar with Mathematica, IPython's _ variables behave exactly like Mathematica's % variables. The following GLOBAL variables always exist (so don't overwrite them!): _ (one underscore): previous output. __ (two underscores): next previous. ___ (three underscores): next-next previous. Global variables named _ are dynamically created ( being the prompt counter), such that the result of output is always available as _. Finally, a global dictionary named _oh exists with entries for all lines which generated output. * Directory history: Your history of visited directories is kept in the global list _dh, and the magic %cd command can be used to go to any entry in that list. * Auto-parentheses and auto-quotes (adapted from Nathan Gray's LazyPython) 1. Auto-parentheses Callable objects (i.e. functions, methods, etc) can be invoked like this (notice the commas between the arguments):: In [1]: callable_ob arg1, arg2, arg3 and the input will be translated to this:: callable_ob(arg1, arg2, arg3) This feature is off by default (in rare cases it can produce undesirable side-effects), but you can activate it at the command-line by starting IPython with `--autocall 1`, set it permanently in your configuration file, or turn on at runtime with `%autocall 1`. You can force auto-parentheses by using '/' as the first character of a line. For example:: In [1]: /globals # becomes 'globals()' Note that the '/' MUST be the first character on the line! This won't work:: In [2]: print /globals # syntax error In most cases the automatic algorithm should work, so you should rarely need to explicitly invoke /. One notable exception is if you are trying to call a function with a list of tuples as arguments (the parenthesis will confuse IPython):: In [1]: zip (1,2,3),(4,5,6) # won't work but this will work:: In [2]: /zip (1,2,3),(4,5,6) ------> zip ((1,2,3),(4,5,6)) Out[2]= [(1, 4), (2, 5), (3, 6)] IPython tells you that it has altered your command line by displaying the new command line preceded by -->. e.g.:: In [18]: callable list -------> callable (list) 2. Auto-Quoting You can force auto-quoting of a function's arguments by using ',' as the first character of a line. For example:: In [1]: ,my_function /home/me # becomes my_function("/home/me") If you use ';' instead, the whole argument is quoted as a single string (while ',' splits on whitespace):: In [2]: ,my_function a b c # becomes my_function("a","b","c") In [3]: ;my_function a b c # becomes my_function("a b c") Note that the ',' MUST be the first character on the line! This won't work:: In [4]: x = ,my_function /home/me # syntax error """ interactive_usage_min = """\ An enhanced console for Python. Some of its features are: - Tab completion in the local namespace. - Logging of input, see command-line options. - System shell escape via ! , eg !ls. - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.) - Keeps track of locally defined variables via %who, %whos. - Show object information with a ? eg ?x or x? (use ?? for more info). """ quick_reference = r""" IPython -- An enhanced Interactive Python - Quick Reference Card ================================================================ obj?, obj?? : Get help, or more help for object (also works as ?obj, ??obj). ?foo.*abc* : List names in 'foo' containing 'abc' in them. %magic : Information about IPython's 'magic' % functions. Magic functions are prefixed by % or %%, and typically take their arguments without parentheses, quotes or even commas for convenience. Line magics take a single % and cell magics are prefixed with two %%. Example magic function calls: %alias d ls -F : 'd' is now an alias for 'ls -F' alias d ls -F : Works if 'alias' not a python name alist = %alias : Get list of aliases to 'alist' cd /usr/share : Obvious. cd - to choose from visited dirs. %cd?? : See help AND source for magic %cd %timeit x=10 : time the 'x=10' statement with high precision. %%timeit x=2**100 x**100 : time 'x**100' with a setup of 'x=2**100'; setup code is not counted. This is an example of a cell magic. System commands: !cp a.txt b/ : System command escape, calls os.system() cp a.txt b/ : after %rehashx, most system commands work without ! cp ${f}.txt $bar : Variable expansion in magics and system commands files = !ls /usr : Capture system command output files.s, files.l, files.n: "a b c", ['a','b','c'], 'a\nb\nc' History: _i, _ii, _iii : Previous, next previous, next next previous input _i4, _ih[2:5] : Input history line 4, lines 2-4 exec(_i81) : Execute input history line #81 again %rep 81 : Edit input history line #81 _, __, ___ : previous, next previous, next next previous output _dh : Directory history _oh : Output history %hist : Command history of current session. %hist -g foo : Search command history of (almost) all sessions for 'foo'. %hist -g : Command history of (almost) all sessions. %hist 1/2-8 : Command history containing lines 2-8 of session 1. %hist 1/ ~2/ : Command history of session 1 and 2 sessions before current. %hist ~8/1-~6/5 : Command history from line 1 of 8 sessions ago to line 5 of 6 sessions ago. %edit 0/ : Open editor to execute code with history of current session. Autocall: f 1,2 : f(1,2) # Off by default, enable with %autocall magic. /f 1,2 : f(1,2) (forced autoparen) ,f 1 2 : f("1","2") ;f 1 2 : f("1 2") Remember: TAB completion works in many contexts, not just file names or python names. The following magic functions are currently available: """ default_banner_parts = ["Python %s\n"%sys.version.split("\n")[0], "Type 'copyright', 'credits' or 'license' for more information\n" , "IPython {version} -- An enhanced Interactive Python. Type '?' for help.\n".format(version=release.version), ] default_banner = ''.join(default_banner_parts) ipython-8.35.0/IPython/display.py000066400000000000000000000027311477474304100167300ustar00rootroot00000000000000"""Public API for display tools in IPython. """ # ----------------------------------------------------------------------------- # Copyright (C) 2012 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Imports # ----------------------------------------------------------------------------- from IPython.core.display_functions import * from IPython.core.display import ( display_pretty as display_pretty, display_html as display_html, display_markdown as display_markdown, display_svg as display_svg, display_png as display_png, display_jpeg as display_jpeg, display_latex as display_latex, display_json as display_json, display_javascript as display_javascript, display_pdf as display_pdf, DisplayObject as DisplayObject, TextDisplayObject as TextDisplayObject, Pretty as Pretty, HTML as HTML, Markdown as Markdown, Math as Math, Latex as Latex, SVG as SVG, ProgressBar as ProgressBar, JSON as JSON, GeoJSON as GeoJSON, Javascript as Javascript, Image as Image, set_matplotlib_formats as set_matplotlib_formats, set_matplotlib_close as set_matplotlib_close, Video as Video, ) from IPython.lib.display import * ipython-8.35.0/IPython/extensions/000077500000000000000000000000001477474304100171055ustar00rootroot00000000000000ipython-8.35.0/IPython/extensions/__init__.py000066400000000000000000000001161477474304100212140ustar00rootroot00000000000000# -*- coding: utf-8 -*- """This directory is meant for IPython extensions.""" ipython-8.35.0/IPython/extensions/autoreload.py000066400000000000000000000556551477474304100216360ustar00rootroot00000000000000"""IPython extension to reload modules before executing user code. ``autoreload`` reloads modules automatically before entering the execution of code typed at the IPython prompt. This makes for example the following workflow possible: .. sourcecode:: ipython In [1]: %load_ext autoreload In [2]: %autoreload 2 In [3]: from foo import some_function In [4]: some_function() Out[4]: 42 In [5]: # open foo.py in an editor and change some_function to return 43 In [6]: some_function() Out[6]: 43 The module was reloaded without reloading it explicitly, and the object imported with ``from foo import ...`` was also updated. Usage ===== The following magic commands are provided: ``%autoreload``, ``%autoreload now`` Reload all modules (except those excluded by ``%aimport``) automatically now. ``%autoreload 0``, ``%autoreload off`` Disable automatic reloading. ``%autoreload 1``, ``%autoreload explicit`` Reload all modules imported with ``%aimport`` every time before executing the Python code typed. ``%autoreload 2``, ``%autoreload all`` Reload all modules (except those excluded by ``%aimport``) every time before executing the Python code typed. ``%autoreload 3``, ``%autoreload complete`` Same as 2/all, but also adds any new objects in the module. See unit test at IPython/extensions/tests/test_autoreload.py::test_autoload_newly_added_objects Adding ``--print`` or ``-p`` to the ``%autoreload`` line will print autoreload activity to standard out. ``--log`` or ``-l`` will do it to the log at INFO level; both can be used simultaneously. ``%aimport`` List modules which are to be automatically imported or not to be imported. ``%aimport foo`` Import module 'foo' and mark it to be autoreloaded for ``%autoreload 1`` ``%aimport foo, bar`` Import modules 'foo', 'bar' and mark them to be autoreloaded for ``%autoreload 1`` ``%aimport -foo`` Mark module 'foo' to not be autoreloaded. Caveats ======= Reloading Python modules in a reliable way is in general difficult, and unexpected things may occur. ``%autoreload`` tries to work around common pitfalls by replacing function code objects and parts of classes previously in the module with new versions. This makes the following things to work: - Functions and classes imported via 'from xxx import foo' are upgraded to new versions when 'xxx' is reloaded. - Methods and properties of classes are upgraded on reload, so that calling 'c.foo()' on an object 'c' created before the reload causes the new code for 'foo' to be executed. Some of the known remaining caveats are: - Replacing code objects does not always succeed: changing a @property in a class to an ordinary method or a method to a member variable can cause problems (but in old objects only). - Functions that are removed (eg. via monkey-patching) from a module before it is reloaded are not upgraded. - C extension modules cannot be reloaded, and so cannot be autoreloaded. - While comparing Enum and Flag, the 'is' Identity Operator is used (even in the case '==' has been used (Similar to the 'None' keyword)). - Reloading a module, or importing the same module by a different name, creates new Enums. These may look the same, but are not. """ from IPython.core import magic_arguments from IPython.core.magic import Magics, magics_class, line_magic __skip_doctest__ = True # ----------------------------------------------------------------------------- # Copyright (C) 2000 Thomas Heller # Copyright (C) 2008 Pauli Virtanen # Copyright (C) 2012 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. # ----------------------------------------------------------------------------- # # This IPython module is written by Pauli Virtanen, based on the autoreload # code by Thomas Heller. # ----------------------------------------------------------------------------- # Imports # ----------------------------------------------------------------------------- import os import sys import traceback import types import weakref import gc import logging from importlib import import_module, reload from importlib.util import source_from_cache # ------------------------------------------------------------------------------ # Autoreload functionality # ------------------------------------------------------------------------------ class ModuleReloader: enabled = False """Whether this reloader is enabled""" check_all = True """Autoreload all modules, not just those listed in 'modules'""" autoload_obj = False """Autoreload all modules AND autoload all new objects""" def __init__(self, shell=None): # Modules that failed to reload: {module: mtime-on-failed-reload, ...} self.failed = {} # Modules specially marked as autoreloadable. self.modules = {} # Modules specially marked as not autoreloadable. self.skip_modules = {} # (module-name, name) -> weakref, for replacing old code objects self.old_objects = {} # Module modification timestamps self.modules_mtimes = {} self.shell = shell # Reporting callable for verbosity self._report = lambda msg: None # by default, be quiet. # Cache module modification times self.check(check_all=True, do_reload=False) # To hide autoreload errors self.hide_errors = False def mark_module_skipped(self, module_name): """Skip reloading the named module in the future""" try: del self.modules[module_name] except KeyError: pass self.skip_modules[module_name] = True def mark_module_reloadable(self, module_name): """Reload the named module in the future (if it is imported)""" try: del self.skip_modules[module_name] except KeyError: pass self.modules[module_name] = True def aimport_module(self, module_name): """Import a module, and mark it reloadable Returns ------- top_module : module The imported module if it is top-level, or the top-level top_name : module Name of top_module """ self.mark_module_reloadable(module_name) import_module(module_name) top_name = module_name.split(".")[0] top_module = sys.modules[top_name] return top_module, top_name def filename_and_mtime(self, module): if not hasattr(module, "__file__") or module.__file__ is None: return None, None if getattr(module, "__name__", None) in [None, "__mp_main__", "__main__"]: # we cannot reload(__main__) or reload(__mp_main__) return None, None filename = module.__file__ path, ext = os.path.splitext(filename) if ext.lower() == ".py": py_filename = filename else: try: py_filename = source_from_cache(filename) except ValueError: return None, None try: pymtime = os.stat(py_filename).st_mtime except OSError: return None, None return py_filename, pymtime def check(self, check_all=False, do_reload=True): """Check whether some modules need to be reloaded.""" if not self.enabled and not check_all: return if check_all or self.check_all: modules = list(sys.modules.keys()) else: modules = list(self.modules.keys()) for modname in modules: m = sys.modules.get(modname, None) if modname in self.skip_modules: continue py_filename, pymtime = self.filename_and_mtime(m) if py_filename is None: continue try: if pymtime <= self.modules_mtimes[modname]: continue except KeyError: self.modules_mtimes[modname] = pymtime continue else: if self.failed.get(py_filename, None) == pymtime: continue self.modules_mtimes[modname] = pymtime # If we've reached this point, we should try to reload the module if do_reload: self._report(f"Reloading '{modname}'.") try: if self.autoload_obj: superreload(m, reload, self.old_objects, self.shell) else: superreload(m, reload, self.old_objects) if py_filename in self.failed: del self.failed[py_filename] except: if not self.hide_errors: print( "[autoreload of {} failed: {}]".format( modname, traceback.format_exc(10) ), file=sys.stderr, ) self.failed[py_filename] = pymtime # ------------------------------------------------------------------------------ # superreload # ------------------------------------------------------------------------------ func_attrs = [ "__code__", "__defaults__", "__doc__", "__closure__", "__globals__", "__dict__", ] def update_function(old, new): """Upgrade the code object of a function""" for name in func_attrs: try: setattr(old, name, getattr(new, name)) except (AttributeError, TypeError): pass def update_instances(old, new): """Use garbage collector to find all instances that refer to the old class definition and update their __class__ to point to the new class definition""" refs = gc.get_referrers(old) for ref in refs: if type(ref) is old: object.__setattr__(ref, "__class__", new) def update_class(old, new): """Replace stuff in the __dict__ of a class, and upgrade method code objects, and add new methods, if any""" for key in list(old.__dict__.keys()): old_obj = getattr(old, key) try: new_obj = getattr(new, key) # explicitly checking that comparison returns True to handle # cases where `==` doesn't return a boolean. if (old_obj == new_obj) is True: continue except AttributeError: # obsolete attribute: remove it try: delattr(old, key) except (AttributeError, TypeError): pass continue except ValueError: # can't compare nested structures containing # numpy arrays using `==` pass if update_generic(old_obj, new_obj): continue try: setattr(old, key, getattr(new, key)) except (AttributeError, TypeError): pass # skip non-writable attributes for key in list(new.__dict__.keys()): if key not in list(old.__dict__.keys()): try: setattr(old, key, getattr(new, key)) except (AttributeError, TypeError): pass # skip non-writable attributes # update all instances of class update_instances(old, new) def update_property(old, new): """Replace get/set/del functions of a property""" update_generic(old.fdel, new.fdel) update_generic(old.fget, new.fget) update_generic(old.fset, new.fset) def isinstance2(a, b, typ): return isinstance(a, typ) and isinstance(b, typ) UPDATE_RULES = [ (lambda a, b: isinstance2(a, b, type), update_class), (lambda a, b: isinstance2(a, b, types.FunctionType), update_function), (lambda a, b: isinstance2(a, b, property), update_property), ] UPDATE_RULES.extend( [ ( lambda a, b: isinstance2(a, b, types.MethodType), lambda a, b: update_function(a.__func__, b.__func__), ), ] ) def update_generic(a, b): for type_check, update in UPDATE_RULES: if type_check(a, b): update(a, b) return True return False class StrongRef: def __init__(self, obj): self.obj = obj def __call__(self): return self.obj mod_attrs = [ "__name__", "__doc__", "__package__", "__loader__", "__spec__", "__file__", "__cached__", "__builtins__", ] def append_obj(module, d, name, obj, autoload=False): in_module = hasattr(obj, "__module__") and obj.__module__ == module.__name__ if autoload: # check needed for module global built-ins if not in_module and name in mod_attrs: return False else: if not in_module: return False key = (module.__name__, name) try: d.setdefault(key, []).append(weakref.ref(obj)) except TypeError: pass return True def superreload(module, reload=reload, old_objects=None, shell=None): """Enhanced version of the builtin reload function. superreload remembers objects previously in the module, and - upgrades the class dictionary of every old class in the module - upgrades the code object of every old function and method - clears the module's namespace before reloading """ if old_objects is None: old_objects = {} # collect old objects in the module for name, obj in list(module.__dict__.items()): if not append_obj(module, old_objects, name, obj): continue key = (module.__name__, name) try: old_objects.setdefault(key, []).append(weakref.ref(obj)) except TypeError: pass # reload module try: # clear namespace first from old cruft old_dict = module.__dict__.copy() old_name = module.__name__ module.__dict__.clear() module.__dict__["__name__"] = old_name module.__dict__["__loader__"] = old_dict["__loader__"] except (TypeError, AttributeError, KeyError): pass try: module = reload(module) except: # restore module dictionary on failed reload module.__dict__.update(old_dict) raise # iterate over all objects and update functions & classes for name, new_obj in list(module.__dict__.items()): key = (module.__name__, name) if key not in old_objects: # here 'shell' acts both as a flag and as an output var if ( shell is None or name == "Enum" or not append_obj(module, old_objects, name, new_obj, True) ): continue shell.user_ns[name] = new_obj new_refs = [] for old_ref in old_objects[key]: old_obj = old_ref() if old_obj is None: continue new_refs.append(old_ref) update_generic(old_obj, new_obj) if new_refs: old_objects[key] = new_refs else: del old_objects[key] return module # ------------------------------------------------------------------------------ # IPython connectivity # ------------------------------------------------------------------------------ @magics_class class AutoreloadMagics(Magics): def __init__(self, *a, **kw): super().__init__(*a, **kw) self._reloader = ModuleReloader(self.shell) self._reloader.check_all = False self._reloader.autoload_obj = False self.loaded_modules = set(sys.modules) @line_magic @magic_arguments.magic_arguments() @magic_arguments.argument( "mode", type=str, default="now", nargs="?", help="""blank or 'now' - Reload all modules (except those excluded by %%aimport) automatically now. '0' or 'off' - Disable automatic reloading. '1' or 'explicit' - Reload only modules imported with %%aimport every time before executing the Python code typed. '2' or 'all' - Reload all modules (except those excluded by %%aimport) every time before executing the Python code typed. '3' or 'complete' - Same as 2/all, but also but also adds any new objects in the module. """, ) @magic_arguments.argument( "-p", "--print", action="store_true", default=False, help="Show autoreload activity using `print` statements", ) @magic_arguments.argument( "-l", "--log", action="store_true", default=False, help="Show autoreload activity using the logger", ) @magic_arguments.argument( "--hide-errors", action="store_true", default=False, help="Hide autoreload errors", ) def autoreload(self, line=""): r"""%autoreload => Reload modules automatically %autoreload or %autoreload now Reload all modules (except those excluded by %aimport) automatically now. %autoreload 0 or %autoreload off Disable automatic reloading. %autoreload 1 or %autoreload explicit Reload only modules imported with %aimport every time before executing the Python code typed. %autoreload 2 or %autoreload all Reload all modules (except those excluded by %aimport) every time before executing the Python code typed. %autoreload 3 or %autoreload complete Same as 2/all, but also but also adds any new objects in the module. See unit test at IPython/extensions/tests/test_autoreload.py::test_autoload_newly_added_objects The optional arguments --print and --log control display of autoreload activity. The default is to act silently; --print (or -p) will print out the names of modules that are being reloaded, and --log (or -l) outputs them to the log at INFO level. The optional argument --hide-errors hides any errors that can happen when trying to reload code. Reloading Python modules in a reliable way is in general difficult, and unexpected things may occur. %autoreload tries to work around common pitfalls by replacing function code objects and parts of classes previously in the module with new versions. This makes the following things to work: - Functions and classes imported via 'from xxx import foo' are upgraded to new versions when 'xxx' is reloaded. - Methods and properties of classes are upgraded on reload, so that calling 'c.foo()' on an object 'c' created before the reload causes the new code for 'foo' to be executed. Some of the known remaining caveats are: - Replacing code objects does not always succeed: changing a @property in a class to an ordinary method or a method to a member variable can cause problems (but in old objects only). - Functions that are removed (eg. via monkey-patching) from a module before it is reloaded are not upgraded. - C extension modules cannot be reloaded, and so cannot be autoreloaded. """ args = magic_arguments.parse_argstring(self.autoreload, line) mode = args.mode.lower() p = print logger = logging.getLogger("autoreload") l = logger.info def pl(msg): p(msg) l(msg) if args.print is False and args.log is False: self._reloader._report = lambda msg: None elif args.print is True: if args.log is True: self._reloader._report = pl else: self._reloader._report = p elif args.log is True: self._reloader._report = l self._reloader.hide_errors = args.hide_errors if mode == "" or mode == "now": self._reloader.check(True) elif mode == "0" or mode == "off": self._reloader.enabled = False elif mode == "1" or mode == "explicit": self._reloader.enabled = True self._reloader.check_all = False self._reloader.autoload_obj = False elif mode == "2" or mode == "all": self._reloader.enabled = True self._reloader.check_all = True self._reloader.autoload_obj = False elif mode == "3" or mode == "complete": self._reloader.enabled = True self._reloader.check_all = True self._reloader.autoload_obj = True else: raise ValueError(f'Unrecognized autoreload mode "{mode}".') @line_magic def aimport(self, parameter_s="", stream=None): """%aimport => Import modules for automatic reloading. %aimport List modules to automatically import and not to import. %aimport foo Import module 'foo' and mark it to be autoreloaded for %autoreload explicit %aimport foo, bar Import modules 'foo', 'bar' and mark them to be autoreloaded for %autoreload explicit %aimport -foo, bar Mark module 'foo' to not be autoreloaded for %autoreload explicit, all, or complete, and 'bar' to be autoreloaded for mode explicit. """ modname = parameter_s if not modname: to_reload = sorted(self._reloader.modules.keys()) to_skip = sorted(self._reloader.skip_modules.keys()) if stream is None: stream = sys.stdout if self._reloader.check_all: stream.write("Modules to reload:\nall-except-skipped\n") else: stream.write("Modules to reload:\n%s\n" % " ".join(to_reload)) stream.write("\nModules to skip:\n%s\n" % " ".join(to_skip)) else: for _module in [_.strip() for _ in modname.split(",")]: if _module.startswith("-"): _module = _module[1:].strip() self._reloader.mark_module_skipped(_module) else: top_module, top_name = self._reloader.aimport_module(_module) # Inject module to user namespace self.shell.push({top_name: top_module}) def pre_run_cell(self, info): if self._reloader.enabled: try: self._reloader.check() except: pass def post_execute_hook(self): """Cache the modification times of any modules imported in this execution""" newly_loaded_modules = set(sys.modules) - self.loaded_modules for modname in newly_loaded_modules: _, pymtime = self._reloader.filename_and_mtime(sys.modules[modname]) if pymtime is not None: self._reloader.modules_mtimes[modname] = pymtime self.loaded_modules.update(newly_loaded_modules) def load_ipython_extension(ip): """Load the extension in IPython.""" auto_reload = AutoreloadMagics(ip) ip.register_magics(auto_reload) ip.events.register("pre_run_cell", auto_reload.pre_run_cell) ip.events.register("post_execute", auto_reload.post_execute_hook) ipython-8.35.0/IPython/extensions/storemagic.py000066400000000000000000000177501477474304100216260ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ %store magic for lightweight persistence. Stores variables, aliases and macros in IPython's database. To automatically restore stored variables at startup, add this to your :file:`ipython_config.py` file:: c.StoreMagics.autorestore = True """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import inspect, os, sys, textwrap from IPython.core.error import UsageError from IPython.core.magic import Magics, magics_class, line_magic from IPython.testing.skipdoctest import skip_doctest from traitlets import Bool def restore_aliases(ip, alias=None): staliases = ip.db.get('stored_aliases', {}) if alias is None: for k,v in staliases.items(): # print("restore alias",k,v) # dbg #self.alias_table[k] = v ip.alias_manager.define_alias(k,v) else: ip.alias_manager.define_alias(alias, staliases[alias]) def refresh_variables(ip): db = ip.db for key in db.keys('autorestore/*'): # strip autorestore justkey = os.path.basename(key) try: obj = db[key] except KeyError: print("Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % justkey) print("The error was:", sys.exc_info()[0]) else: # print("restored",justkey,"=",obj) # dbg ip.user_ns[justkey] = obj def restore_dhist(ip): ip.user_ns['_dh'] = ip.db.get('dhist',[]) def restore_data(ip): refresh_variables(ip) restore_aliases(ip) restore_dhist(ip) @magics_class class StoreMagics(Magics): """Lightweight persistence for python variables. Provides the %store magic.""" autorestore = Bool(False, help= """If True, any %store-d variables will be automatically restored when IPython starts. """ ).tag(config=True) def __init__(self, shell): super(StoreMagics, self).__init__(shell=shell) self.shell.configurables.append(self) if self.autorestore: restore_data(self.shell) @skip_doctest @line_magic def store(self, parameter_s=''): """Lightweight persistence for python variables. Example:: In [1]: l = ['hello',10,'world'] In [2]: %store l Stored 'l' (list) In [3]: exit (IPython session is closed and started again...) ville@badger:~$ ipython In [1]: l NameError: name 'l' is not defined In [2]: %store -r In [3]: l Out[3]: ['hello', 10, 'world'] Usage: * ``%store`` - Show list of all variables and their current values * ``%store spam bar`` - Store the *current* value of the variables spam and bar to disk * ``%store -d spam`` - Remove the variable and its value from storage * ``%store -z`` - Remove all variables from storage * ``%store -r`` - Refresh all variables, aliases and directory history from store (overwrite current vals) * ``%store -r spam bar`` - Refresh specified variables and aliases from store (delete current val) * ``%store foo >a.txt`` - Store value of foo to new file a.txt * ``%store foo >>a.txt`` - Append value of foo to file a.txt It should be noted that if you change the value of a variable, you need to %store it again if you want to persist the new value. Note also that the variables will need to be pickleable; most basic python types can be safely %store'd. Also aliases can be %store'd across sessions. To remove an alias from the storage, use the %unalias magic. """ opts,argsl = self.parse_options(parameter_s,'drz',mode='string') args = argsl.split() ip = self.shell db = ip.db # delete if 'd' in opts: try: todel = args[0] except IndexError as e: raise UsageError('You must provide the variable to forget') from e else: try: del db['autorestore/' + todel] except BaseException as e: raise UsageError("Can't delete variable '%s'" % todel) from e # reset elif 'z' in opts: for k in db.keys('autorestore/*'): del db[k] elif 'r' in opts: if args: for arg in args: try: obj = db["autorestore/" + arg] except KeyError: try: restore_aliases(ip, alias=arg) except KeyError: print("no stored variable or alias %s" % arg) else: ip.user_ns[arg] = obj else: restore_data(ip) # run without arguments -> list variables & values elif not args: vars = db.keys('autorestore/*') vars.sort() if vars: size = max(map(len, vars)) else: size = 0 print('Stored variables and their in-db values:') fmt = '%-'+str(size)+'s -> %s' get = db.get for var in vars: justkey = os.path.basename(var) # print 30 first characters from every var print(fmt % (justkey, repr(get(var, ''))[:50])) # default action - store the variable else: # %store foo >file.txt or >>file.txt if len(args) > 1 and args[1].startswith(">"): fnam = os.path.expanduser(args[1].lstrip(">").lstrip()) if args[1].startswith(">>"): fil = open(fnam, "a", encoding="utf-8") else: fil = open(fnam, "w", encoding="utf-8") with fil: obj = ip.ev(args[0]) print("Writing '%s' (%s) to file '%s'." % (args[0], obj.__class__.__name__, fnam)) if not isinstance (obj, str): from pprint import pprint pprint(obj, fil) else: fil.write(obj) if not obj.endswith('\n'): fil.write('\n') return # %store foo for arg in args: try: obj = ip.user_ns[arg] except KeyError: # it might be an alias name = arg try: cmd = ip.alias_manager.retrieve_alias(name) except ValueError as e: raise UsageError("Unknown variable '%s'" % name) from e staliases = db.get('stored_aliases',{}) staliases[name] = cmd db['stored_aliases'] = staliases print("Alias stored: %s (%s)" % (name, cmd)) return else: modname = getattr(inspect.getmodule(obj), '__name__', '') if modname == '__main__': print(textwrap.dedent("""\ Warning:%s is %s Proper storage of interactively declared classes (or instances of those classes) is not possible! Only instances of classes in real modules on file system can be %%store'd. """ % (arg, obj) )) return #pickled = pickle.dumps(obj) db[ 'autorestore/' + arg ] = obj print("Stored '%s' (%s)" % (arg, obj.__class__.__name__)) def load_ipython_extension(ip): """Load the extension in IPython.""" ip.register_magics(StoreMagics) ipython-8.35.0/IPython/extensions/tests/000077500000000000000000000000001477474304100202475ustar00rootroot00000000000000ipython-8.35.0/IPython/extensions/tests/__init__.py000066400000000000000000000000001477474304100223460ustar00rootroot00000000000000ipython-8.35.0/IPython/extensions/tests/test_autoreload.py000066400000000000000000000552371477474304100240330ustar00rootroot00000000000000"""Tests for autoreload extension. """ # ----------------------------------------------------------------------------- # Copyright (c) 2012 IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Imports # ----------------------------------------------------------------------------- import os import platform import pytest import sys import tempfile import textwrap import shutil import random import time import traceback from io import StringIO from dataclasses import dataclass import IPython.testing.tools as tt from unittest import TestCase from IPython.extensions.autoreload import AutoreloadMagics from IPython.core.events import EventManager, pre_run_cell from IPython.testing.decorators import skipif_not_numpy from IPython.core.interactiveshell import ExecutionInfo if platform.python_implementation() == "PyPy": pytest.skip( "Current autoreload implementation is extremely slow on PyPy", allow_module_level=True, ) # ----------------------------------------------------------------------------- # Test fixture # ----------------------------------------------------------------------------- noop = lambda *a, **kw: None class FakeShell: def __init__(self): self.ns = {} self.user_ns = self.ns self.user_ns_hidden = {} self.events = EventManager(self, {"pre_run_cell", pre_run_cell}) self.auto_magics = AutoreloadMagics(shell=self) self.events.register("pre_run_cell", self.auto_magics.pre_run_cell) register_magics = set_hook = noop def showtraceback( self, exc_tuple=None, filename=None, tb_offset=None, exception_only=False, running_compiled_code=False, ): traceback.print_exc() def run_code(self, code): self.events.trigger( "pre_run_cell", ExecutionInfo( raw_cell="", store_history=False, silent=False, shell_futures=False, cell_id=None, ), ) exec(code, self.user_ns) self.auto_magics.post_execute_hook() def push(self, items): self.ns.update(items) def magic_autoreload(self, parameter): self.auto_magics.autoreload(parameter) def magic_aimport(self, parameter, stream=None): self.auto_magics.aimport(parameter, stream=stream) self.auto_magics.post_execute_hook() class Fixture(TestCase): """Fixture for creating test module files""" test_dir = None old_sys_path = None filename_chars = "abcdefghijklmopqrstuvwxyz0123456789" def setUp(self): self.test_dir = tempfile.mkdtemp() self.old_sys_path = list(sys.path) sys.path.insert(0, self.test_dir) self.shell = FakeShell() def tearDown(self): shutil.rmtree(self.test_dir) sys.path = self.old_sys_path self.test_dir = None self.old_sys_path = None self.shell = None def get_module(self): module_name = "tmpmod_" + "".join(random.sample(self.filename_chars, 20)) if module_name in sys.modules: del sys.modules[module_name] file_name = os.path.join(self.test_dir, module_name + ".py") return module_name, file_name def write_file(self, filename, content): """ Write a file, and force a timestamp difference of at least one second Notes ----- Python's .pyc files record the timestamp of their compilation with a time resolution of one second. Therefore, we need to force a timestamp difference between .py and .pyc, without having the .py file be timestamped in the future, and without changing the timestamp of the .pyc file (because that is stored in the file). The only reliable way to achieve this seems to be to sleep. """ content = textwrap.dedent(content) # Sleep one second + eps time.sleep(1.05) # Write with open(filename, "w", encoding="utf-8") as f: f.write(content) def new_module(self, code): code = textwrap.dedent(code) mod_name, mod_fn = self.get_module() with open(mod_fn, "w", encoding="utf-8") as f: f.write(code) return mod_name, mod_fn # ----------------------------------------------------------------------------- # Test automatic reloading # ----------------------------------------------------------------------------- def pickle_get_current_class(obj): """ Original issue comes from pickle; hence the name. """ name = obj.__class__.__name__ module_name = getattr(obj, "__module__", None) obj2 = sys.modules[module_name] for subpath in name.split("."): obj2 = getattr(obj2, subpath) return obj2 class TestAutoreload(Fixture): def test_reload_enums(self): mod_name, mod_fn = self.new_module( textwrap.dedent( """ from enum import Enum class MyEnum(Enum): A = 'A' B = 'B' """ ) ) self.shell.magic_autoreload("2") self.shell.magic_aimport(mod_name) self.write_file( mod_fn, textwrap.dedent( """ from enum import Enum class MyEnum(Enum): A = 'A' B = 'B' C = 'C' """ ), ) with tt.AssertNotPrints( ("[autoreload of %s failed:" % mod_name), channel="stderr" ): self.shell.run_code("pass") # trigger another reload def test_reload_class_type(self): self.shell.magic_autoreload("2") mod_name, mod_fn = self.new_module( """ class Test(): def meth(self): return "old" """ ) assert "test" not in self.shell.ns assert "result" not in self.shell.ns self.shell.run_code("from %s import Test" % mod_name) self.shell.run_code("test = Test()") self.write_file( mod_fn, """ class Test(): def meth(self): return "new" """, ) test_object = self.shell.ns["test"] # important to trigger autoreload logic ! self.shell.run_code("pass") test_class = pickle_get_current_class(test_object) assert isinstance(test_object, test_class) # extra check. self.shell.run_code("import pickle") self.shell.run_code("p = pickle.dumps(test)") def test_reload_class_attributes(self): self.shell.magic_autoreload("2") mod_name, mod_fn = self.new_module( textwrap.dedent( """ class MyClass: def __init__(self, a=10): self.a = a self.b = 22 # self.toto = 33 def square(self): print('compute square') return self.a*self.a """ ) ) self.shell.run_code("from %s import MyClass" % mod_name) self.shell.run_code("first = MyClass(5)") self.shell.run_code("first.square()") with self.assertRaises(AttributeError): self.shell.run_code("first.cube()") with self.assertRaises(AttributeError): self.shell.run_code("first.power(5)") self.shell.run_code("first.b") with self.assertRaises(AttributeError): self.shell.run_code("first.toto") # remove square, add power self.write_file( mod_fn, textwrap.dedent( """ class MyClass: def __init__(self, a=10): self.a = a self.b = 11 def power(self, p): print('compute power '+str(p)) return self.a**p """ ), ) self.shell.run_code("second = MyClass(5)") for object_name in {"first", "second"}: self.shell.run_code(f"{object_name}.power(5)") with self.assertRaises(AttributeError): self.shell.run_code(f"{object_name}.cube()") with self.assertRaises(AttributeError): self.shell.run_code(f"{object_name}.square()") self.shell.run_code(f"{object_name}.b") self.shell.run_code(f"{object_name}.a") with self.assertRaises(AttributeError): self.shell.run_code(f"{object_name}.toto") @skipif_not_numpy def test_comparing_numpy_structures(self): self.shell.magic_autoreload("2") self.shell.run_code("1+1") mod_name, mod_fn = self.new_module( textwrap.dedent( """ import numpy as np class MyClass: a = (np.array((.1, .2)), np.array((.2, .3))) """ ) ) self.shell.run_code("from %s import MyClass" % mod_name) self.shell.run_code("first = MyClass()") # change property `a` self.write_file( mod_fn, textwrap.dedent( """ import numpy as np class MyClass: a = (np.array((.3, .4)), np.array((.5, .6))) """ ), ) with tt.AssertNotPrints( ("[autoreload of %s failed:" % mod_name), channel="stderr" ): self.shell.run_code("pass") # trigger another reload def test_autoload_newly_added_objects(self): # All of these fail with %autoreload 2 self.shell.magic_autoreload("3") mod_code = """ def func1(): pass """ mod_name, mod_fn = self.new_module(textwrap.dedent(mod_code)) self.shell.run_code(f"from {mod_name} import *") self.shell.run_code("func1()") with self.assertRaises(NameError): self.shell.run_code("func2()") with self.assertRaises(NameError): self.shell.run_code("t = Test()") with self.assertRaises(NameError): self.shell.run_code("number") # ----------- TEST NEW OBJ LOADED -------------------------- new_code = """ def func1(): pass def func2(): pass class Test: pass number = 0 from enum import Enum class TestEnum(Enum): A = 'a' """ self.write_file(mod_fn, textwrap.dedent(new_code)) # test function now exists in shell's namespace namespace self.shell.run_code("func2()") # test function now exists in module's dict self.shell.run_code(f"import sys; sys.modules['{mod_name}'].func2()") # test class now exists self.shell.run_code("t = Test()") # test global built-in var now exists self.shell.run_code("number") # test the enumerations gets loaded successfully self.shell.run_code("TestEnum.A") # ----------- TEST NEW OBJ CAN BE CHANGED -------------------- new_code = """ def func1(): return 'changed' def func2(): return 'changed' class Test: def new_func(self): return 'changed' number = 1 from enum import Enum class TestEnum(Enum): A = 'a' B = 'added' """ self.write_file(mod_fn, textwrap.dedent(new_code)) self.shell.run_code("assert func1() == 'changed'") self.shell.run_code("assert func2() == 'changed'") self.shell.run_code("t = Test(); assert t.new_func() == 'changed'") self.shell.run_code("assert number == 1") if sys.version_info < (3, 12): self.shell.run_code("assert TestEnum.B.value == 'added'") # ----------- TEST IMPORT FROM MODULE -------------------------- new_mod_code = """ from enum import Enum class Ext(Enum): A = 'ext' def ext_func(): return 'ext' class ExtTest: def meth(self): return 'ext' ext_int = 2 """ new_mod_name, new_mod_fn = self.new_module(textwrap.dedent(new_mod_code)) current_mod_code = f""" from {new_mod_name} import * """ self.write_file(mod_fn, textwrap.dedent(current_mod_code)) self.shell.run_code("assert Ext.A.value == 'ext'") self.shell.run_code("assert ext_func() == 'ext'") self.shell.run_code("t = ExtTest(); assert t.meth() == 'ext'") self.shell.run_code("assert ext_int == 2") def test_verbose_names(self): # Asserts correspondense between original mode names and their verbose equivalents. @dataclass class AutoreloadSettings: check_all: bool enabled: bool autoload_obj: bool def gather_settings(mode): self.shell.magic_autoreload(mode) module_reloader = self.shell.auto_magics._reloader return AutoreloadSettings( module_reloader.check_all, module_reloader.enabled, module_reloader.autoload_obj, ) assert gather_settings("0") == gather_settings("off") assert gather_settings("0") == gather_settings("OFF") # Case insensitive assert gather_settings("1") == gather_settings("explicit") assert gather_settings("2") == gather_settings("all") assert gather_settings("3") == gather_settings("complete") # And an invalid mode name raises an exception. with self.assertRaises(ValueError): self.shell.magic_autoreload("4") def test_aimport_parsing(self): # Modules can be included or excluded all in one line. module_reloader = self.shell.auto_magics._reloader self.shell.magic_aimport("os") # import and mark `os` for auto-reload. assert module_reloader.modules["os"] is True assert "os" not in module_reloader.skip_modules.keys() self.shell.magic_aimport("-math") # forbid autoreloading of `math` assert module_reloader.skip_modules["math"] is True assert "math" not in module_reloader.modules.keys() self.shell.magic_aimport( "-os, math" ) # Can do this all in one line; wasn't possible before. assert module_reloader.modules["math"] is True assert "math" not in module_reloader.skip_modules.keys() assert module_reloader.skip_modules["os"] is True assert "os" not in module_reloader.modules.keys() def test_autoreload_output(self): self.shell.magic_autoreload("complete") mod_code = """ def func1(): pass """ mod_name, mod_fn = self.new_module(mod_code) self.shell.run_code(f"import {mod_name}") with tt.AssertPrints("", channel="stdout"): # no output; this is default self.shell.run_code("pass") self.shell.magic_autoreload("complete --print") self.write_file(mod_fn, mod_code) # "modify" the module with tt.AssertPrints( f"Reloading '{mod_name}'.", channel="stdout" ): # see something printed out self.shell.run_code("pass") self.shell.magic_autoreload("complete -p") self.write_file(mod_fn, mod_code) # "modify" the module with tt.AssertPrints( f"Reloading '{mod_name}'.", channel="stdout" ): # see something printed out self.shell.run_code("pass") self.shell.magic_autoreload("complete --print --log") self.write_file(mod_fn, mod_code) # "modify" the module with tt.AssertPrints( f"Reloading '{mod_name}'.", channel="stdout" ): # see something printed out self.shell.run_code("pass") self.shell.magic_autoreload("complete --print --log") self.write_file(mod_fn, mod_code) # "modify" the module with self.assertLogs(logger="autoreload") as lo: # see something printed out self.shell.run_code("pass") assert lo.output == [f"INFO:autoreload:Reloading '{mod_name}'."] self.shell.magic_autoreload("complete -l") self.write_file(mod_fn, mod_code) # "modify" the module with self.assertLogs(logger="autoreload") as lo: # see something printed out self.shell.run_code("pass") assert lo.output == [f"INFO:autoreload:Reloading '{mod_name}'."] def _check_smoketest(self, use_aimport=True): """ Functional test for the automatic reloader using either '%autoreload 1' or '%autoreload 2' """ mod_name, mod_fn = self.new_module( """ x = 9 z = 123 # this item will be deleted def foo(y): return y + 3 class Baz(object): def __init__(self, x): self.x = x def bar(self, y): return self.x + y @property def quux(self): return 42 def zzz(self): '''This method will be deleted below''' return 99 class Bar: # old-style class: weakref doesn't work for it on Python < 2.7 def foo(self): return 1 """ ) # # Import module, and mark for reloading # if use_aimport: self.shell.magic_autoreload("1") self.shell.magic_aimport(mod_name) stream = StringIO() self.shell.magic_aimport("", stream=stream) self.assertIn(("Modules to reload:\n%s" % mod_name), stream.getvalue()) with self.assertRaises(ImportError): self.shell.magic_aimport("tmpmod_as318989e89ds") else: self.shell.magic_autoreload("2") self.shell.run_code("import %s" % mod_name) stream = StringIO() self.shell.magic_aimport("", stream=stream) self.assertTrue( "Modules to reload:\nall-except-skipped" in stream.getvalue() ) self.assertIn(mod_name, self.shell.ns) mod = sys.modules[mod_name] # # Test module contents # old_foo = mod.foo old_obj = mod.Baz(9) old_obj2 = mod.Bar() def check_module_contents(): self.assertEqual(mod.x, 9) self.assertEqual(mod.z, 123) self.assertEqual(old_foo(0), 3) self.assertEqual(mod.foo(0), 3) obj = mod.Baz(9) self.assertEqual(old_obj.bar(1), 10) self.assertEqual(obj.bar(1), 10) self.assertEqual(obj.quux, 42) self.assertEqual(obj.zzz(), 99) obj2 = mod.Bar() self.assertEqual(old_obj2.foo(), 1) self.assertEqual(obj2.foo(), 1) check_module_contents() # # Simulate a failed reload: no reload should occur and exactly # one error message should be printed # self.write_file( mod_fn, """ a syntax error """, ) with tt.AssertPrints( ("[autoreload of %s failed:" % mod_name), channel="stderr" ): self.shell.run_code("pass") # trigger reload with tt.AssertNotPrints( ("[autoreload of %s failed:" % mod_name), channel="stderr" ): self.shell.run_code("pass") # trigger another reload check_module_contents() # # Rewrite module (this time reload should succeed) # self.write_file( mod_fn, """ x = 10 def foo(y): return y + 4 class Baz(object): def __init__(self, x): self.x = x def bar(self, y): return self.x + y + 1 @property def quux(self): return 43 class Bar: # old-style class def foo(self): return 2 """, ) def check_module_contents(): self.assertEqual(mod.x, 10) self.assertFalse(hasattr(mod, "z")) self.assertEqual(old_foo(0), 4) # superreload magic! self.assertEqual(mod.foo(0), 4) obj = mod.Baz(9) self.assertEqual(old_obj.bar(1), 11) # superreload magic! self.assertEqual(obj.bar(1), 11) self.assertEqual(old_obj.quux, 43) self.assertEqual(obj.quux, 43) self.assertFalse(hasattr(old_obj, "zzz")) self.assertFalse(hasattr(obj, "zzz")) obj2 = mod.Bar() self.assertEqual(old_obj2.foo(), 2) self.assertEqual(obj2.foo(), 2) self.shell.run_code("pass") # trigger reload check_module_contents() # # Another failure case: deleted file (shouldn't reload) # os.unlink(mod_fn) self.shell.run_code("pass") # trigger reload check_module_contents() # # Disable autoreload and rewrite module: no reload should occur # if use_aimport: self.shell.magic_aimport("-" + mod_name) stream = StringIO() self.shell.magic_aimport("", stream=stream) self.assertTrue(("Modules to skip:\n%s" % mod_name) in stream.getvalue()) # This should succeed, although no such module exists self.shell.magic_aimport("-tmpmod_as318989e89ds") else: self.shell.magic_autoreload("0") self.write_file( mod_fn, """ x = -99 """, ) self.shell.run_code("pass") # trigger reload self.shell.run_code("pass") check_module_contents() # # Re-enable autoreload: reload should now occur # if use_aimport: self.shell.magic_aimport(mod_name) else: self.shell.magic_autoreload("") self.shell.run_code("pass") # trigger reload self.assertEqual(mod.x, -99) def test_smoketest_aimport(self): self._check_smoketest(use_aimport=True) def test_smoketest_autoreload(self): self._check_smoketest(use_aimport=False) ipython-8.35.0/IPython/extensions/tests/test_storemagic.py000066400000000000000000000042651477474304100240240ustar00rootroot00000000000000import tempfile, os from pathlib import Path from traitlets.config.loader import Config def setup_module(): ip.run_line_magic("load_ext", "storemagic") def test_store_restore(): assert "bar" not in ip.user_ns, "Error: some other test leaked `bar` in user_ns" assert "foo" not in ip.user_ns, "Error: some other test leaked `foo` in user_ns" assert ( "foobar" not in ip.user_ns ), "Error: some other test leaked `foobar` in user_ns" assert ( "foobaz" not in ip.user_ns ), "Error: some other test leaked `foobaz` in user_ns" ip.user_ns["foo"] = 78 ip.run_line_magic("alias", 'bar echo "hello"') ip.user_ns["foobar"] = 79 ip.user_ns["foobaz"] = "80" tmpd = tempfile.mkdtemp() ip.run_line_magic("cd", tmpd) ip.run_line_magic("store", "foo") ip.run_line_magic("store", "bar") ip.run_line_magic("store", "foobar foobaz") # Check storing assert ip.db["autorestore/foo"] == 78 assert "bar" in ip.db["stored_aliases"] assert ip.db["autorestore/foobar"] == 79 assert ip.db["autorestore/foobaz"] == "80" # Remove those items ip.user_ns.pop("foo", None) ip.user_ns.pop("foobar", None) ip.user_ns.pop("foobaz", None) ip.alias_manager.undefine_alias("bar") ip.run_line_magic("cd", "-") ip.user_ns["_dh"][:] = [] # Check restoring ip.run_line_magic("store", "-r foo bar foobar foobaz") assert ip.user_ns["foo"] == 78 assert ip.alias_manager.is_alias("bar") assert ip.user_ns["foobar"] == 79 assert ip.user_ns["foobaz"] == "80" ip.run_line_magic("store", "-r") # restores _dh too assert any(Path(tmpd).samefile(p) for p in ip.user_ns["_dh"]) os.rmdir(tmpd) def test_autorestore(): ip.user_ns["foo"] = 95 ip.run_line_magic("store", "foo") del ip.user_ns["foo"] c = Config() c.StoreMagics.autorestore = False orig_config = ip.config try: ip.config = c ip.extension_manager.reload_extension("storemagic") assert "foo" not in ip.user_ns c.StoreMagics.autorestore = True ip.extension_manager.reload_extension("storemagic") assert ip.user_ns["foo"] == 95 finally: ip.config = orig_config ipython-8.35.0/IPython/external/000077500000000000000000000000001477474304100165305ustar00rootroot00000000000000ipython-8.35.0/IPython/external/__init__.py000066400000000000000000000001761477474304100206450ustar00rootroot00000000000000""" This package contains all third-party modules bundled with IPython. """ from typing import List __all__: List[str] = [] ipython-8.35.0/IPython/external/qt_for_kernel.py000066400000000000000000000065631477474304100217460ustar00rootroot00000000000000""" Import Qt in a manner suitable for an IPython kernel. This is the import used for the `gui=qt` or `matplotlib=qt` initialization. Import Priority: if Qt has been imported anywhere else: use that if matplotlib has been imported and doesn't support v2 (<= 1.0.1): use PyQt4 @v1 Next, ask QT_API env variable if QT_API not set: ask matplotlib what it's using. If Qt4Agg or Qt5Agg, then use the version matplotlib is configured with else: (matplotlib said nothing) # this is the default path - nobody told us anything try in this order: PyQt default version, PySide, PyQt5 else: use what QT_API says Note that %gui's implementation will always set a `QT_API`, see `IPython.terminal.pt_inputhooks.get_inputhook_name_and_func` """ # NOTE: This is no longer an external, third-party module, and should be # considered part of IPython. For compatibility however, it is being kept in # IPython/external. import os import sys from IPython.external.qt_loaders import ( load_qt, loaded_api, enum_factory, # QT6 QT_API_PYQT6, QT_API_PYSIDE6, # QT5 QT_API_PYQT5, QT_API_PYSIDE2, # QT4 QT_API_PYQT, QT_API_PYSIDE, # default QT_API_PYQT_DEFAULT, ) _qt_apis = ( # QT6 QT_API_PYQT6, QT_API_PYSIDE6, # QT5 QT_API_PYQT5, QT_API_PYSIDE2, # default QT_API_PYQT_DEFAULT, ) def matplotlib_options(mpl): """Constraints placed on an imported matplotlib.""" if mpl is None: return backend = mpl.rcParams.get('backend', None) if backend == 'Qt4Agg': mpqt = mpl.rcParams.get('backend.qt4', None) if mpqt is None: return None if mpqt.lower() == 'pyside': return [QT_API_PYSIDE] elif mpqt.lower() == 'pyqt4': return [QT_API_PYQT_DEFAULT] elif mpqt.lower() == 'pyqt4v2': return [QT_API_PYQT] raise ImportError("unhandled value for backend.qt4 from matplotlib: %r" % mpqt) elif backend == 'Qt5Agg': mpqt = mpl.rcParams.get('backend.qt5', None) if mpqt is None: return None if mpqt.lower() == 'pyqt5': return [QT_API_PYQT5] raise ImportError("unhandled value for backend.qt5 from matplotlib: %r" % mpqt) def get_options(): """Return a list of acceptable QT APIs, in decreasing order of preference.""" #already imported Qt somewhere. Use that loaded = loaded_api() if loaded is not None: return [loaded] mpl = sys.modules.get("matplotlib", None) if mpl is not None and tuple(mpl.__version__.split(".")) < ("1", "0", "2"): # 1.0.1 only supports PyQt4 v1 return [QT_API_PYQT_DEFAULT] qt_api = os.environ.get('QT_API', None) if qt_api is None: #no ETS variable. Ask mpl, then use default fallback path return matplotlib_options(mpl) or [ QT_API_PYQT_DEFAULT, QT_API_PYQT6, QT_API_PYSIDE6, QT_API_PYQT5, QT_API_PYSIDE2, ] elif qt_api not in _qt_apis: raise RuntimeError("Invalid Qt API %r, valid values are: %r" % (qt_api, ', '.join(_qt_apis))) else: return [qt_api] api_opts = get_options() QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) enum_helper = enum_factory(QT_API, QtCore) ipython-8.35.0/IPython/external/qt_loaders.py000066400000000000000000000271271477474304100212500ustar00rootroot00000000000000""" This module contains factory functions that attempt to return Qt submodules from the various python Qt bindings. It also protects against double-importing Qt with different bindings, which is unstable and likely to crash This is used primarily by qt and qt_for_kernel, and shouldn't be accessed directly from the outside """ import importlib.abc import sys import os import types from functools import partial, lru_cache import operator # ### Available APIs. # Qt6 QT_API_PYQT6 = "pyqt6" QT_API_PYSIDE6 = "pyside6" # Qt5 QT_API_PYQT5 = 'pyqt5' QT_API_PYSIDE2 = 'pyside2' # Qt4 # NOTE: Here for legacy matplotlib compatibility, but not really supported on the IPython side. QT_API_PYQT = "pyqt" # Force version 2 QT_API_PYQTv1 = "pyqtv1" # Force version 2 QT_API_PYSIDE = "pyside" QT_API_PYQT_DEFAULT = "pyqtdefault" # use system default for version 1 vs. 2 api_to_module = { # Qt6 QT_API_PYQT6: "PyQt6", QT_API_PYSIDE6: "PySide6", # Qt5 QT_API_PYQT5: "PyQt5", QT_API_PYSIDE2: "PySide2", # Qt4 QT_API_PYSIDE: "PySide", QT_API_PYQT: "PyQt4", QT_API_PYQTv1: "PyQt4", # default QT_API_PYQT_DEFAULT: "PyQt6", } class ImportDenier(importlib.abc.MetaPathFinder): """Import Hook that will guard against bad Qt imports once IPython commits to a specific binding """ def __init__(self): self.__forbidden = set() def forbid(self, module_name): sys.modules.pop(module_name, None) self.__forbidden.add(module_name) def find_spec(self, fullname, path, target=None): if path: return if fullname in self.__forbidden: raise ImportError( """ Importing %s disabled by IPython, which has already imported an Incompatible QT Binding: %s """ % (fullname, loaded_api()) ) ID = ImportDenier() sys.meta_path.insert(0, ID) def commit_api(api): """Commit to a particular API, and trigger ImportErrors on subsequent dangerous imports""" modules = set(api_to_module.values()) modules.remove(api_to_module[api]) for mod in modules: ID.forbid(mod) def loaded_api(): """Return which API is loaded, if any If this returns anything besides None, importing any other Qt binding is unsafe. Returns ------- None, 'pyside6', 'pyqt6', 'pyside2', 'pyside', 'pyqt', 'pyqt5', 'pyqtv1' """ if sys.modules.get("PyQt6.QtCore"): return QT_API_PYQT6 elif sys.modules.get("PySide6.QtCore"): return QT_API_PYSIDE6 elif sys.modules.get("PyQt5.QtCore"): return QT_API_PYQT5 elif sys.modules.get("PySide2.QtCore"): return QT_API_PYSIDE2 elif sys.modules.get("PyQt4.QtCore"): if qtapi_version() == 2: return QT_API_PYQT else: return QT_API_PYQTv1 elif sys.modules.get("PySide.QtCore"): return QT_API_PYSIDE return None def has_binding(api): """Safely check for PyQt4/5, PySide or PySide2, without importing submodules Parameters ---------- api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyside2' | 'pyqtdefault'] Which module to check for Returns ------- True if the relevant module appears to be importable """ module_name = api_to_module[api] from importlib.util import find_spec required = ['QtCore', 'QtGui', 'QtSvg'] if api in (QT_API_PYQT5, QT_API_PYSIDE2, QT_API_PYQT6, QT_API_PYSIDE6): # QT5 requires QtWidgets too required.append('QtWidgets') for submod in required: try: spec = find_spec('%s.%s' % (module_name, submod)) except ImportError: # Package (e.g. PyQt5) not found return False else: if spec is None: # Submodule (e.g. PyQt5.QtCore) not found return False if api == QT_API_PYSIDE: # We can also safely check PySide version import PySide return PySide.__version_info__ >= (1, 0, 3) return True def qtapi_version(): """Return which QString API has been set, if any Returns ------- The QString API version (1 or 2), or None if not set """ try: import sip except ImportError: # as of PyQt5 5.11, sip is no longer available as a top-level # module and needs to be imported from the PyQt5 namespace try: from PyQt5 import sip except ImportError: return try: return sip.getapi('QString') except ValueError: return def can_import(api): """Safely query whether an API is importable, without importing it""" if not has_binding(api): return False current = loaded_api() if api == QT_API_PYQT_DEFAULT: return current in [QT_API_PYQT6, None] else: return current in [api, None] def import_pyqt4(version=2): """ Import PyQt4 Parameters ---------- version : 1, 2, or None Which QString/QVariant API to use. Set to None to use the system default ImportErrors raised within this function are non-recoverable """ # The new-style string API (version=2) automatically # converts QStrings to Unicode Python strings. Also, automatically unpacks # QVariants to their underlying objects. import sip if version is not None: sip.setapi('QString', version) sip.setapi('QVariant', version) from PyQt4 import QtGui, QtCore, QtSvg if QtCore.PYQT_VERSION < 0x040700: raise ImportError("IPython requires PyQt4 >= 4.7, found %s" % QtCore.PYQT_VERSION_STR) # Alias PyQt-specific functions for PySide compatibility. QtCore.Signal = QtCore.pyqtSignal QtCore.Slot = QtCore.pyqtSlot # query for the API version (in case version == None) version = sip.getapi('QString') api = QT_API_PYQTv1 if version == 1 else QT_API_PYQT return QtCore, QtGui, QtSvg, api def import_pyqt5(): """ Import PyQt5 ImportErrors raised within this function are non-recoverable """ from PyQt5 import QtCore, QtSvg, QtWidgets, QtGui # Alias PyQt-specific functions for PySide compatibility. QtCore.Signal = QtCore.pyqtSignal QtCore.Slot = QtCore.pyqtSlot # Join QtGui and QtWidgets for Qt4 compatibility. QtGuiCompat = types.ModuleType('QtGuiCompat') QtGuiCompat.__dict__.update(QtGui.__dict__) QtGuiCompat.__dict__.update(QtWidgets.__dict__) api = QT_API_PYQT5 return QtCore, QtGuiCompat, QtSvg, api def import_pyqt6(): """ Import PyQt6 ImportErrors raised within this function are non-recoverable """ from PyQt6 import QtCore, QtSvg, QtWidgets, QtGui # Alias PyQt-specific functions for PySide compatibility. QtCore.Signal = QtCore.pyqtSignal QtCore.Slot = QtCore.pyqtSlot # Join QtGui and QtWidgets for Qt4 compatibility. QtGuiCompat = types.ModuleType("QtGuiCompat") QtGuiCompat.__dict__.update(QtGui.__dict__) QtGuiCompat.__dict__.update(QtWidgets.__dict__) api = QT_API_PYQT6 return QtCore, QtGuiCompat, QtSvg, api def import_pyside(): """ Import PySide ImportErrors raised within this function are non-recoverable """ from PySide import QtGui, QtCore, QtSvg return QtCore, QtGui, QtSvg, QT_API_PYSIDE def import_pyside2(): """ Import PySide2 ImportErrors raised within this function are non-recoverable """ from PySide2 import QtGui, QtCore, QtSvg, QtWidgets, QtPrintSupport # Join QtGui and QtWidgets for Qt4 compatibility. QtGuiCompat = types.ModuleType('QtGuiCompat') QtGuiCompat.__dict__.update(QtGui.__dict__) QtGuiCompat.__dict__.update(QtWidgets.__dict__) QtGuiCompat.__dict__.update(QtPrintSupport.__dict__) return QtCore, QtGuiCompat, QtSvg, QT_API_PYSIDE2 def import_pyside6(): """ Import PySide6 ImportErrors raised within this function are non-recoverable """ def get_attrs(module): return { name: getattr(module, name) for name in dir(module) if not name.startswith("_") } from PySide6 import QtGui, QtCore, QtSvg, QtWidgets, QtPrintSupport # Join QtGui and QtWidgets for Qt4 compatibility. QtGuiCompat = types.ModuleType("QtGuiCompat") QtGuiCompat.__dict__.update(QtGui.__dict__) if QtCore.__version_info__ < (6, 7): QtGuiCompat.__dict__.update(QtWidgets.__dict__) QtGuiCompat.__dict__.update(QtPrintSupport.__dict__) else: QtGuiCompat.__dict__.update(get_attrs(QtWidgets)) QtGuiCompat.__dict__.update(get_attrs(QtPrintSupport)) return QtCore, QtGuiCompat, QtSvg, QT_API_PYSIDE6 def load_qt(api_options): """ Attempt to import Qt, given a preference list of permissible bindings It is safe to call this function multiple times. Parameters ---------- api_options : List of strings The order of APIs to try. Valid items are 'pyside', 'pyside2', 'pyqt', 'pyqt5', 'pyqtv1' and 'pyqtdefault' Returns ------- A tuple of QtCore, QtGui, QtSvg, QT_API The first three are the Qt modules. The last is the string indicating which module was loaded. Raises ------ ImportError, if it isn't possible to import any requested bindings (either because they aren't installed, or because an incompatible library has already been installed) """ loaders = { # Qt6 QT_API_PYQT6: import_pyqt6, QT_API_PYSIDE6: import_pyside6, # Qt5 QT_API_PYQT5: import_pyqt5, QT_API_PYSIDE2: import_pyside2, # Qt4 QT_API_PYSIDE: import_pyside, QT_API_PYQT: import_pyqt4, QT_API_PYQTv1: partial(import_pyqt4, version=1), # default QT_API_PYQT_DEFAULT: import_pyqt6, } for api in api_options: if api not in loaders: raise RuntimeError( "Invalid Qt API %r, valid values are: %s" % (api, ", ".join(["%r" % k for k in loaders.keys()]))) if not can_import(api): continue #cannot safely recover from an ImportError during this result = loaders[api]() api = result[-1] # changed if api = QT_API_PYQT_DEFAULT commit_api(api) return result else: # Clear the environment variable since it doesn't work. if "QT_API" in os.environ: del os.environ["QT_API"] raise ImportError( """ Could not load requested Qt binding. Please ensure that PyQt4 >= 4.7, PyQt5, PyQt6, PySide >= 1.0.3, PySide2, or PySide6 is available, and only one is imported per session. Currently-imported Qt library: %r PyQt5 available (requires QtCore, QtGui, QtSvg, QtWidgets): %s PyQt6 available (requires QtCore, QtGui, QtSvg, QtWidgets): %s PySide2 installed: %s PySide6 installed: %s Tried to load: %r """ % ( loaded_api(), has_binding(QT_API_PYQT5), has_binding(QT_API_PYQT6), has_binding(QT_API_PYSIDE2), has_binding(QT_API_PYSIDE6), api_options, ) ) def enum_factory(QT_API, QtCore): """Construct an enum helper to account for PyQt5 <-> PyQt6 changes.""" @lru_cache(None) def _enum(name): # foo.bar.Enum.Entry (PyQt6) <=> foo.bar.Entry (non-PyQt6). return operator.attrgetter( name if QT_API == QT_API_PYQT6 else name.rpartition(".")[0] )(sys.modules[QtCore.__package__]) return _enum ipython-8.35.0/IPython/external/tests/000077500000000000000000000000001477474304100176725ustar00rootroot00000000000000ipython-8.35.0/IPython/external/tests/__init__.py000066400000000000000000000000001477474304100217710ustar00rootroot00000000000000ipython-8.35.0/IPython/external/tests/test_qt_loaders.py000066400000000000000000000005571477474304100234470ustar00rootroot00000000000000import importlib import pytest from IPython.external.qt_loaders import ID def test_import_denier(): ID.forbid("ipython_denied_module") with pytest.raises(ImportError, match="disabled by IPython"): import ipython_denied_module with pytest.raises(ImportError, match="disabled by IPython"): importlib.import_module("ipython_denied_module") ipython-8.35.0/IPython/lib/000077500000000000000000000000001477474304100154545ustar00rootroot00000000000000ipython-8.35.0/IPython/lib/__init__.py000066400000000000000000000006331477474304100175670ustar00rootroot00000000000000# encoding: utf-8 """ Extra capabilities for IPython """ # ----------------------------------------------------------------------------- # Copyright (C) 2008-2011 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. # ----------------------------------------------------------------------------- ipython-8.35.0/IPython/lib/backgroundjobs.py000066400000000000000000000425121477474304100210270ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Manage background (threaded) jobs conveniently from an interactive shell. This module provides a BackgroundJobManager class. This is the main class meant for public usage, it implements an object which can create and manage new background jobs. It also provides the actual job classes managed by these BackgroundJobManager objects, see their docstrings below. This system was inspired by discussions with B. Granger and the BackgroundCommand class described in the book Python Scripting for Computational Science, by H. P. Langtangen: http://folk.uio.no/hpl/scripting (although ultimately no code from this text was used, as IPython's system is a separate implementation). An example notebook is provided in our documentation illustrating interactive use of the system. """ #***************************************************************************** # Copyright (C) 2005-2006 Fernando Perez # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** # Code begins import sys import threading from IPython import get_ipython from IPython.core.ultratb import AutoFormattedTB from logging import error, debug class BackgroundJobManager(object): """Class to manage a pool of backgrounded threaded jobs. Below, we assume that 'jobs' is a BackgroundJobManager instance. Usage summary (see the method docstrings for details): jobs.new(...) -> start a new job jobs() or jobs.status() -> print status summary of all jobs jobs[N] -> returns job number N. foo = jobs[N].result -> assign to variable foo the result of job N jobs[N].traceback() -> print the traceback of dead job N jobs.remove(N) -> remove (finished) job N jobs.flush() -> remove all finished jobs As a convenience feature, BackgroundJobManager instances provide the utility result and traceback methods which retrieve the corresponding information from the jobs list: jobs.result(N) <--> jobs[N].result jobs.traceback(N) <--> jobs[N].traceback() While this appears minor, it allows you to use tab completion interactively on the job manager instance. """ def __init__(self): # Lists for job management, accessed via a property to ensure they're # up to date.x self._running = [] self._completed = [] self._dead = [] # A dict of all jobs, so users can easily access any of them self.all = {} # For reporting self._comp_report = [] self._dead_report = [] # Store status codes locally for fast lookups self._s_created = BackgroundJobBase.stat_created_c self._s_running = BackgroundJobBase.stat_running_c self._s_completed = BackgroundJobBase.stat_completed_c self._s_dead = BackgroundJobBase.stat_dead_c self._current_job_id = 0 @property def running(self): self._update_status() return self._running @property def dead(self): self._update_status() return self._dead @property def completed(self): self._update_status() return self._completed def new(self, func_or_exp, *args, **kwargs): """Add a new background job and start it in a separate thread. There are two types of jobs which can be created: 1. Jobs based on expressions which can be passed to an eval() call. The expression must be given as a string. For example: job_manager.new('myfunc(x,y,z=1)'[,glob[,loc]]) The given expression is passed to eval(), along with the optional global/local dicts provided. If no dicts are given, they are extracted automatically from the caller's frame. A Python statement is NOT a valid eval() expression. Basically, you can only use as an eval() argument something which can go on the right of an '=' sign and be assigned to a variable. For example,"print 'hello'" is not valid, but '2+3' is. 2. Jobs given a function object, optionally passing additional positional arguments: job_manager.new(myfunc, x, y) The function is called with the given arguments. If you need to pass keyword arguments to your function, you must supply them as a dict named kw: job_manager.new(myfunc, x, y, kw=dict(z=1)) The reason for this asymmetry is that the new() method needs to maintain access to its own keywords, and this prevents name collisions between arguments to new() and arguments to your own functions. In both cases, the result is stored in the job.result field of the background job object. You can set `daemon` attribute of the thread by giving the keyword argument `daemon`. Notes and caveats: 1. All threads running share the same standard output. Thus, if your background jobs generate output, it will come out on top of whatever you are currently writing. For this reason, background jobs are best used with silent functions which simply return their output. 2. Threads also all work within the same global namespace, and this system does not lock interactive variables. So if you send job to the background which operates on a mutable object for a long time, and start modifying that same mutable object interactively (or in another backgrounded job), all sorts of bizarre behaviour will occur. 3. If a background job is spending a lot of time inside a C extension module which does not release the Python Global Interpreter Lock (GIL), this will block the IPython prompt. This is simply because the Python interpreter can only switch between threads at Python bytecodes. While the execution is inside C code, the interpreter must simply wait unless the extension module releases the GIL. 4. There is no way, due to limitations in the Python threads library, to kill a thread once it has started.""" if callable(func_or_exp): kw = kwargs.get('kw',{}) job = BackgroundJobFunc(func_or_exp,*args,**kw) elif isinstance(func_or_exp, str): if not args: frame = sys._getframe(1) glob, loc = frame.f_globals, frame.f_locals elif len(args)==1: glob = loc = args[0] elif len(args)==2: glob,loc = args else: raise ValueError( 'Expression jobs take at most 2 args (globals,locals)') job = BackgroundJobExpr(func_or_exp, glob, loc) else: raise TypeError('invalid args for new job') if kwargs.get('daemon', False): job.daemon = True job.num = self._current_job_id self._current_job_id += 1 self.running.append(job) self.all[job.num] = job debug('Starting job # %s in a separate thread.' % job.num) job.start() return job def __getitem__(self, job_key): num = job_key if isinstance(job_key, int) else job_key.num return self.all[num] def __call__(self): """An alias to self.status(), This allows you to simply call a job manager instance much like the Unix `jobs` shell command.""" return self.status() def _update_status(self): """Update the status of the job lists. This method moves finished jobs to one of two lists: - self.completed: jobs which completed successfully - self.dead: jobs which finished but died. It also copies those jobs to corresponding _report lists. These lists are used to report jobs completed/dead since the last update, and are then cleared by the reporting function after each call.""" # Status codes srun, scomp, sdead = self._s_running, self._s_completed, self._s_dead # State lists, use the actual lists b/c the public names are properties # that call this very function on access running, completed, dead = self._running, self._completed, self._dead # Now, update all state lists for num, job in enumerate(running): stat = job.stat_code if stat == srun: continue elif stat == scomp: completed.append(job) self._comp_report.append(job) running[num] = False elif stat == sdead: dead.append(job) self._dead_report.append(job) running[num] = False # Remove dead/completed jobs from running list running[:] = filter(None, running) def _group_report(self,group,name): """Report summary for a given job group. Return True if the group had any elements.""" if group: print('%s jobs:' % name) for job in group: print('%s : %s' % (job.num,job)) print() return True def _group_flush(self,group,name): """Flush a given job group Return True if the group had any elements.""" njobs = len(group) if njobs: plural = {1:''}.setdefault(njobs,'s') print('Flushing %s %s job%s.' % (njobs,name,plural)) group[:] = [] return True def _status_new(self): """Print the status of newly finished jobs. Return True if any new jobs are reported. This call resets its own state every time, so it only reports jobs which have finished since the last time it was called.""" self._update_status() new_comp = self._group_report(self._comp_report, 'Completed') new_dead = self._group_report(self._dead_report, 'Dead, call jobs.traceback() for details') self._comp_report[:] = [] self._dead_report[:] = [] return new_comp or new_dead def status(self,verbose=0): """Print a status of all jobs currently being managed.""" self._update_status() self._group_report(self.running,'Running') self._group_report(self.completed,'Completed') self._group_report(self.dead,'Dead') # Also flush the report queues self._comp_report[:] = [] self._dead_report[:] = [] def remove(self,num): """Remove a finished (completed or dead) job.""" try: job = self.all[num] except KeyError: error('Job #%s not found' % num) else: stat_code = job.stat_code if stat_code == self._s_running: error('Job #%s is still running, it can not be removed.' % num) return elif stat_code == self._s_completed: self.completed.remove(job) elif stat_code == self._s_dead: self.dead.remove(job) def flush(self): """Flush all finished jobs (completed and dead) from lists. Running jobs are never flushed. It first calls _status_new(), to update info. If any jobs have completed since the last _status_new() call, the flush operation aborts.""" # Remove the finished jobs from the master dict alljobs = self.all for job in self.completed+self.dead: del(alljobs[job.num]) # Now flush these lists completely fl_comp = self._group_flush(self.completed, 'Completed') fl_dead = self._group_flush(self.dead, 'Dead') if not (fl_comp or fl_dead): print('No jobs to flush.') def result(self,num): """result(N) -> return the result of job N.""" try: return self.all[num].result except KeyError: error('Job #%s not found' % num) def _traceback(self, job): num = job if isinstance(job, int) else job.num try: self.all[num].traceback() except KeyError: error('Job #%s not found' % num) def traceback(self, job=None): if job is None: self._update_status() for deadjob in self.dead: print("Traceback for: %r" % deadjob) self._traceback(deadjob) print() else: self._traceback(job) class BackgroundJobBase(threading.Thread): """Base class to build BackgroundJob classes. The derived classes must implement: - Their own __init__, since the one here raises NotImplementedError. The derived constructor must call self._init() at the end, to provide common initialization. - A strform attribute used in calls to __str__. - A call() method, which will make the actual execution call and must return a value to be held in the 'result' field of the job object. """ # Class constants for status, in string and as numerical codes (when # updating jobs lists, we don't want to do string comparisons). This will # be done at every user prompt, so it has to be as fast as possible stat_created = 'Created'; stat_created_c = 0 stat_running = 'Running'; stat_running_c = 1 stat_completed = 'Completed'; stat_completed_c = 2 stat_dead = 'Dead (Exception), call jobs.traceback() for details' stat_dead_c = -1 def __init__(self): """Must be implemented in subclasses. Subclasses must call :meth:`_init` for standard initialisation. """ raise NotImplementedError("This class can not be instantiated directly.") def _init(self): """Common initialization for all BackgroundJob objects""" for attr in ['call','strform']: assert hasattr(self,attr), "Missing attribute <%s>" % attr # The num tag can be set by an external job manager self.num = None self.status = BackgroundJobBase.stat_created self.stat_code = BackgroundJobBase.stat_created_c self.finished = False self.result = '' # reuse the ipython traceback handler if we can get to it, otherwise # make a new one try: make_tb = get_ipython().InteractiveTB.text except: make_tb = AutoFormattedTB(mode = 'Context', color_scheme='NoColor', tb_offset = 1).text # Note that the actual API for text() requires the three args to be # passed in, so we wrap it in a simple lambda. self._make_tb = lambda : make_tb(None, None, None) # Hold a formatted traceback if one is generated. self._tb = None threading.Thread.__init__(self) def __str__(self): return self.strform def __repr__(self): return '' % (self.num, self.strform) def traceback(self): print(self._tb) def run(self): try: self.status = BackgroundJobBase.stat_running self.stat_code = BackgroundJobBase.stat_running_c self.result = self.call() except: self.status = BackgroundJobBase.stat_dead self.stat_code = BackgroundJobBase.stat_dead_c self.finished = None self.result = ('') self._tb = self._make_tb() else: self.status = BackgroundJobBase.stat_completed self.stat_code = BackgroundJobBase.stat_completed_c self.finished = True class BackgroundJobExpr(BackgroundJobBase): """Evaluate an expression as a background job (uses a separate thread).""" def __init__(self, expression, glob=None, loc=None): """Create a new job from a string which can be fed to eval(). global/locals dicts can be provided, which will be passed to the eval call.""" # fail immediately if the given expression can't be compiled self.code = compile(expression,'','eval') glob = {} if glob is None else glob loc = {} if loc is None else loc self.expression = self.strform = expression self.glob = glob self.loc = loc self._init() def call(self): return eval(self.code,self.glob,self.loc) class BackgroundJobFunc(BackgroundJobBase): """Run a function call as a background job (uses a separate thread).""" def __init__(self, func, *args, **kwargs): """Create a new job from a callable object. Any positional arguments and keyword args given to this constructor after the initial callable are passed directly to it.""" if not callable(func): raise TypeError( 'first argument to BackgroundJobFunc must be callable') self.func = func self.args = args self.kwargs = kwargs # The string form will only include the function passed, because # generating string representations of the arguments is a potentially # _very_ expensive operation (e.g. with large arrays). self.strform = str(func) self._init() def call(self): return self.func(*self.args, **self.kwargs) ipython-8.35.0/IPython/lib/clipboard.py000066400000000000000000000057531477474304100177770ustar00rootroot00000000000000""" Utilities for accessing the platform's clipboard. """ import os import subprocess from IPython.core.error import TryNext import IPython.utils.py3compat as py3compat class ClipboardEmpty(ValueError): pass def win32_clipboard_get(): """ Get the current clipboard's text on Windows. Requires Mark Hammond's pywin32 extensions. """ try: import win32clipboard except ImportError as e: raise TryNext("Getting text from the clipboard requires the pywin32 " "extensions: http://sourceforge.net/projects/pywin32/") from e win32clipboard.OpenClipboard() try: text = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT) except (TypeError, win32clipboard.error): try: text = win32clipboard.GetClipboardData(win32clipboard.CF_TEXT) text = py3compat.cast_unicode(text, py3compat.DEFAULT_ENCODING) except (TypeError, win32clipboard.error) as e: raise ClipboardEmpty from e finally: win32clipboard.CloseClipboard() return text def osx_clipboard_get() -> str: """ Get the clipboard's text on OS X. """ p = subprocess.Popen(['pbpaste', '-Prefer', 'ascii'], stdout=subprocess.PIPE) bytes_, stderr = p.communicate() # Text comes in with old Mac \r line endings. Change them to \n. bytes_ = bytes_.replace(b'\r', b'\n') text = py3compat.decode(bytes_) return text def tkinter_clipboard_get(): """ Get the clipboard's text using Tkinter. This is the default on systems that are not Windows or OS X. It may interfere with other UI toolkits and should be replaced with an implementation that uses that toolkit. """ try: from tkinter import Tk, TclError except ImportError as e: raise TryNext("Getting text from the clipboard on this platform requires tkinter.") from e root = Tk() root.withdraw() try: text = root.clipboard_get() except TclError as e: raise ClipboardEmpty from e finally: root.destroy() text = py3compat.cast_unicode(text, py3compat.DEFAULT_ENCODING) return text def wayland_clipboard_get(): """Get the clipboard's text under Wayland using wl-paste command. This requires Wayland and wl-clipboard installed and running. """ if os.environ.get("XDG_SESSION_TYPE") != "wayland": raise TryNext("wayland is not detected") try: with subprocess.Popen(["wl-paste"], stdout=subprocess.PIPE) as p: raw, err = p.communicate() if p.wait(): raise TryNext(err) except FileNotFoundError as e: raise TryNext( "Getting text from the clipboard under Wayland requires the wl-clipboard " "extension: https://github.com/bugaevc/wl-clipboard" ) from e if not raw: raise ClipboardEmpty try: text = py3compat.decode(raw) except UnicodeDecodeError as e: raise ClipboardEmpty from e return text ipython-8.35.0/IPython/lib/deepreload.py000066400000000000000000000223271477474304100201400ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Provides a reload() function that acts recursively. Python's normal :func:`python:reload` function only reloads the module that it's passed. The :func:`reload` function in this module also reloads everything imported from that module, which is useful when you're changing files deep inside a package. To use this as your default reload function, type this:: import builtins from IPython.lib import deepreload builtins.reload = deepreload.reload A reference to the original :func:`python:reload` is stored in this module as :data:`original_reload`, so you can restore it later. This code is almost entirely based on knee.py, which is a Python re-implementation of hierarchical module import. """ #***************************************************************************** # Copyright (C) 2001 Nathaniel Gray # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** import builtins as builtin_mod from contextlib import contextmanager import importlib import sys from types import ModuleType from warnings import warn import types original_import = builtin_mod.__import__ @contextmanager def replace_import_hook(new_import): saved_import = builtin_mod.__import__ builtin_mod.__import__ = new_import try: yield finally: builtin_mod.__import__ = saved_import def get_parent(globals, level): """ parent, name = get_parent(globals, level) Return the package that an import is being performed in. If globals comes from the module foo.bar.bat (not itself a package), this returns the sys.modules entry for foo.bar. If globals is from a package's __init__.py, the package's entry in sys.modules is returned. If globals doesn't come from a package or a module in a package, or a corresponding entry is not found in sys.modules, None is returned. """ orig_level = level if not level or not isinstance(globals, dict): return None, '' pkgname = globals.get('__package__', None) if pkgname is not None: # __package__ is set, so use it if not hasattr(pkgname, 'rindex'): raise ValueError('__package__ set to non-string') if len(pkgname) == 0: if level > 0: raise ValueError('Attempted relative import in non-package') return None, '' name = pkgname else: # __package__ not set, so figure it out and set it if '__name__' not in globals: return None, '' modname = globals['__name__'] if '__path__' in globals: # __path__ is set, so modname is already the package name globals['__package__'] = name = modname else: # Normal module, so work out the package name if any lastdot = modname.rfind('.') if lastdot < 0 < level: raise ValueError("Attempted relative import in non-package") if lastdot < 0: globals['__package__'] = None return None, '' globals['__package__'] = name = modname[:lastdot] dot = len(name) for x in range(level, 1, -1): try: dot = name.rindex('.', 0, dot) except ValueError as e: raise ValueError("attempted relative import beyond top-level " "package") from e name = name[:dot] try: parent = sys.modules[name] except BaseException as e: if orig_level < 1: warn("Parent module '%.200s' not found while handling absolute " "import" % name) parent = None else: raise SystemError("Parent module '%.200s' not loaded, cannot " "perform relative import" % name) from e # We expect, but can't guarantee, if parent != None, that: # - parent.__name__ == name # - parent.__dict__ is globals # If this is violated... Who cares? return parent, name def load_next(mod, altmod, name, buf): """ mod, name, buf = load_next(mod, altmod, name, buf) altmod is either None or same as mod """ if len(name) == 0: # completely empty module name should only happen in # 'from . import' (or '__import__("")') return mod, None, buf dot = name.find('.') if dot == 0: raise ValueError('Empty module name') if dot < 0: subname = name next = None else: subname = name[:dot] next = name[dot+1:] if buf != '': buf += '.' buf += subname result = import_submodule(mod, subname, buf) if result is None and mod != altmod: result = import_submodule(altmod, subname, subname) if result is not None: buf = subname if result is None: raise ImportError("No module named %.200s" % name) return result, next, buf # Need to keep track of what we've already reloaded to prevent cyclic evil found_now = {} def import_submodule(mod, subname, fullname): """m = import_submodule(mod, subname, fullname)""" # Require: # if mod == None: subname == fullname # else: mod.__name__ + "." + subname == fullname global found_now if fullname in found_now and fullname in sys.modules: m = sys.modules[fullname] else: print('Reloading', fullname) found_now[fullname] = 1 oldm = sys.modules.get(fullname, None) try: if oldm is not None: m = importlib.reload(oldm) else: m = importlib.import_module(subname, mod) except: # load_module probably removed name from modules because of # the error. Put back the original module object. if oldm: sys.modules[fullname] = oldm raise add_submodule(mod, m, fullname, subname) return m def add_submodule(mod, submod, fullname, subname): """mod.{subname} = submod""" if mod is None: return #Nothing to do here. if submod is None: submod = sys.modules[fullname] setattr(mod, subname, submod) return def ensure_fromlist(mod, fromlist, buf, recursive): """Handle 'from module import a, b, c' imports.""" if not hasattr(mod, '__path__'): return for item in fromlist: if not hasattr(item, 'rindex'): raise TypeError("Item in ``from list'' not a string") if item == '*': if recursive: continue # avoid endless recursion try: all = mod.__all__ except AttributeError: pass else: ret = ensure_fromlist(mod, all, buf, 1) if not ret: return 0 elif not hasattr(mod, item): import_submodule(mod, item, buf + '.' + item) def deep_import_hook(name, globals=None, locals=None, fromlist=None, level=-1): """Replacement for __import__()""" parent, buf = get_parent(globals, level) head, name, buf = load_next(parent, None if level < 0 else parent, name, buf) tail = head while name: tail, name, buf = load_next(tail, tail, name, buf) # If tail is None, both get_parent and load_next found # an empty module name: someone called __import__("") or # doctored faulty bytecode if tail is None: raise ValueError('Empty module name') if not fromlist: return head ensure_fromlist(tail, fromlist, buf, 0) return tail modules_reloading = {} def deep_reload_hook(m): """Replacement for reload().""" # Hardcode this one as it would raise a NotImplementedError from the # bowels of Python and screw up the import machinery after. # unlike other imports the `exclude` list already in place is not enough. if m is types: return m if not isinstance(m, ModuleType): raise TypeError("reload() argument must be module") name = m.__name__ if name not in sys.modules: raise ImportError("reload(): module %.200s not in sys.modules" % name) global modules_reloading try: return modules_reloading[name] except: modules_reloading[name] = m try: newm = importlib.reload(m) except: sys.modules[name] = m raise finally: modules_reloading.clear() return newm # Save the original hooks original_reload = importlib.reload # Replacement for reload() def reload( module, exclude=( *sys.builtin_module_names, "sys", "os.path", "builtins", "__main__", "numpy", "numpy._globals", ), ): """Recursively reload all modules used in the given module. Optionally takes a list of modules to exclude from reloading. The default exclude list contains modules listed in sys.builtin_module_names with additional sys, os.path, builtins and __main__, to prevent, e.g., resetting display, exception, and io hooks. """ global found_now for i in exclude: found_now[i] = 1 try: with replace_import_hook(deep_import_hook): return deep_reload_hook(module) finally: found_now = {} ipython-8.35.0/IPython/lib/demo.py000066400000000000000000000577061477474304100167710ustar00rootroot00000000000000"""Module for interactive demos using IPython. This module implements a few classes for running Python scripts interactively in IPython for demonstrations. With very simple markup (a few tags in comments), you can control points where the script stops executing and returns control to IPython. Provided classes ---------------- The classes are (see their docstrings for further details): - Demo: pure python demos - IPythonDemo: demos with input to be processed by IPython as if it had been typed interactively (so magics work, as well as any other special syntax you may have added via input prefilters). - LineDemo: single-line version of the Demo class. These demos are executed one line at a time, and require no markup. - IPythonLineDemo: IPython version of the LineDemo class (the demo is executed a line at a time, but processed via IPython). - ClearMixin: mixin to make Demo classes with less visual clutter. It declares an empty marquee and a pre_cmd that clears the screen before each block (see Subclassing below). - ClearDemo, ClearIPDemo: mixin-enabled versions of the Demo and IPythonDemo classes. Inheritance diagram: .. inheritance-diagram:: IPython.lib.demo :parts: 3 Subclassing ----------- The classes here all include a few methods meant to make customization by subclassing more convenient. Their docstrings below have some more details: - highlight(): format every block and optionally highlight comments and docstring content. - marquee(): generates a marquee to provide visible on-screen markers at each block start and end. - pre_cmd(): run right before the execution of each block. - post_cmd(): run right after the execution of each block. If the block raises an exception, this is NOT called. Operation --------- The file is run in its own empty namespace (though you can pass it a string of arguments as if in a command line environment, and it will see those as sys.argv). But at each stop, the global IPython namespace is updated with the current internal demo namespace, so you can work interactively with the data accumulated so far. By default, each block of code is printed (with syntax highlighting) before executing it and you have to confirm execution. This is intended to show the code to an audience first so you can discuss it, and only proceed with execution once you agree. There are a few tags which allow you to modify this behavior. The supported tags are: # stop Defines block boundaries, the points where IPython stops execution of the file and returns to the interactive prompt. You can optionally mark the stop tag with extra dashes before and after the word 'stop', to help visually distinguish the blocks in a text editor: # --- stop --- # silent Make a block execute silently (and hence automatically). Typically used in cases where you have some boilerplate or initialization code which you need executed but do not want to be seen in the demo. # auto Make a block execute automatically, but still being printed. Useful for simple code which does not warrant discussion, since it avoids the extra manual confirmation. # auto_all This tag can _only_ be in the first block, and if given it overrides the individual auto tags to make the whole demo fully automatic (no block asks for confirmation). It can also be given at creation time (or the attribute set later) to override what's in the file. While _any_ python file can be run as a Demo instance, if there are no stop tags the whole file will run in a single block (no different that calling first %pycat and then %run). The minimal markup to make this useful is to place a set of stop tags; the other tags are only there to let you fine-tune the execution. This is probably best explained with the simple example file below. You can copy this into a file named ex_demo.py, and try running it via:: from IPython.lib.demo import Demo d = Demo('ex_demo.py') d() Each time you call the demo object, it runs the next block. The demo object has a few useful methods for navigation, like again(), edit(), jump(), seek() and back(). It can be reset for a new run via reset() or reloaded from disk (in case you've edited the source) via reload(). See their docstrings below. Note: To make this simpler to explore, a file called "demo-exercizer.py" has been added to the "docs/examples/core" directory. Just cd to this directory in an IPython session, and type:: %run demo-exercizer.py and then follow the directions. Example ------- The following is a very simple example of a valid demo file. :: #################### EXAMPLE DEMO ############################### '''A simple interactive demo to illustrate the use of IPython's Demo class.''' print('Hello, welcome to an interactive IPython demo.') # The mark below defines a block boundary, which is a point where IPython will # stop execution and return to the interactive prompt. The dashes are actually # optional and used only as a visual aid to clearly separate blocks while # editing the demo code. # stop x = 1 y = 2 # stop # the mark below makes this block as silent # silent print('This is a silent block, which gets executed but not printed.') # stop # auto print('This is an automatic block.') print('It is executed without asking for confirmation, but printed.') z = x + y print('z =', x) # stop # This is just another normal block. print('z is now:', z) print('bye!') ################### END EXAMPLE DEMO ############################ """ #***************************************************************************** # Copyright (C) 2005-2006 Fernando Perez. # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. # #***************************************************************************** import os import re import shlex import sys import pygments from pathlib import Path from IPython.utils.text import marquee from IPython.utils import openpy from IPython.utils import py3compat __all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError'] class DemoError(Exception): pass def re_mark(mark): return re.compile(r'^\s*#\s+\s+%s\s*$' % mark,re.MULTILINE) class Demo(object): re_stop = re_mark(r'-*\s?stop\s?-*') re_silent = re_mark('silent') re_auto = re_mark('auto') re_auto_all = re_mark('auto_all') def __init__(self,src,title='',arg_str='',auto_all=None, format_rst=False, formatter='terminal', style='default'): """Make a new demo object. To run the demo, simply call the object. See the module docstring for full details and an example (you can use IPython.Demo? in IPython to see it). Inputs: - src is either a file, or file-like object, or a string that can be resolved to a filename. Optional inputs: - title: a string to use as the demo name. Of most use when the demo you are making comes from an object that has no filename, or if you want an alternate denotation distinct from the filename. - arg_str(''): a string of arguments, internally converted to a list just like sys.argv, so the demo script can see a similar environment. - auto_all(None): global flag to run all blocks automatically without confirmation. This attribute overrides the block-level tags and applies to the whole demo. It is an attribute of the object, and can be changed at runtime simply by reassigning it to a boolean value. - format_rst(False): a bool to enable comments and doc strings formatting with pygments rst lexer - formatter('terminal'): a string of pygments formatter name to be used. Useful values for terminals: terminal, terminal256, terminal16m - style('default'): a string of pygments style name to be used. """ if hasattr(src, "read"): # It seems to be a file or a file-like object self.fname = "from a file-like object" if title == '': self.title = "from a file-like object" else: self.title = title else: # Assume it's a string or something that can be converted to one self.fname = src if title == '': (filepath, filename) = os.path.split(src) self.title = filename else: self.title = title self.sys_argv = [src] + shlex.split(arg_str) self.auto_all = auto_all self.src = src try: ip = get_ipython() # this is in builtins whenever IPython is running self.inside_ipython = True except NameError: self.inside_ipython = False if self.inside_ipython: # get a few things from ipython. While it's a bit ugly design-wise, # it ensures that things like color scheme and the like are always in # sync with the ipython mode being used. This class is only meant to # be used inside ipython anyways, so it's OK. self.ip_ns = ip.user_ns self.ip_colorize = ip.pycolorize self.ip_showtb = ip.showtraceback self.ip_run_cell = ip.run_cell self.shell = ip self.formatter = pygments.formatters.get_formatter_by_name(formatter, style=style) self.python_lexer = pygments.lexers.get_lexer_by_name("py3") self.format_rst = format_rst if format_rst: self.rst_lexer = pygments.lexers.get_lexer_by_name("rst") # load user data and initialize data structures self.reload() def fload(self): """Load file object.""" # read data and parse into blocks if hasattr(self, 'fobj') and self.fobj is not None: self.fobj.close() if hasattr(self.src, "read"): # It seems to be a file or a file-like object self.fobj = self.src else: # Assume it's a string or something that can be converted to one self.fobj = openpy.open(self.fname) def reload(self): """Reload source from disk and initialize state.""" self.fload() self.src = "".join(openpy.strip_encoding_cookie(self.fobj)) src_b = [b.strip() for b in self.re_stop.split(self.src) if b] self._silent = [bool(self.re_silent.findall(b)) for b in src_b] self._auto = [bool(self.re_auto.findall(b)) for b in src_b] # if auto_all is not given (def. None), we read it from the file if self.auto_all is None: self.auto_all = bool(self.re_auto_all.findall(src_b[0])) else: self.auto_all = bool(self.auto_all) # Clean the sources from all markup so it doesn't get displayed when # running the demo src_blocks = [] auto_strip = lambda s: self.re_auto.sub('',s) for i,b in enumerate(src_b): if self._auto[i]: src_blocks.append(auto_strip(b)) else: src_blocks.append(b) # remove the auto_all marker src_blocks[0] = self.re_auto_all.sub('',src_blocks[0]) self.nblocks = len(src_blocks) self.src_blocks = src_blocks # also build syntax-highlighted source self.src_blocks_colored = list(map(self.highlight,self.src_blocks)) # ensure clean namespace and seek offset self.reset() def reset(self): """Reset the namespace and seek pointer to restart the demo""" self.user_ns = {} self.finished = False self.block_index = 0 def _validate_index(self,index): if index<0 or index>=self.nblocks: raise ValueError('invalid block index %s' % index) def _get_index(self,index): """Get the current block index, validating and checking status. Returns None if the demo is finished""" if index is None: if self.finished: print('Demo finished. Use .reset() if you want to rerun it.') return None index = self.block_index else: self._validate_index(index) return index def seek(self,index): """Move the current seek pointer to the given block. You can use negative indices to seek from the end, with identical semantics to those of Python lists.""" if index<0: index = self.nblocks + index self._validate_index(index) self.block_index = index self.finished = False def back(self,num=1): """Move the seek pointer back num blocks (default is 1).""" self.seek(self.block_index-num) def jump(self,num=1): """Jump a given number of blocks relative to the current one. The offset can be positive or negative, defaults to 1.""" self.seek(self.block_index+num) def again(self): """Move the seek pointer back one block and re-execute.""" self.back(1) self() def edit(self,index=None): """Edit a block. If no number is given, use the last block executed. This edits the in-memory copy of the demo, it does NOT modify the original source file. If you want to do that, simply open the file in an editor and use reload() when you make changes to the file. This method is meant to let you change a block during a demonstration for explanatory purposes, without damaging your original script.""" index = self._get_index(index) if index is None: return # decrease the index by one (unless we're at the very beginning), so # that the default demo.edit() call opens up the sblock we've last run if index>0: index -= 1 filename = self.shell.mktempfile(self.src_blocks[index]) self.shell.hooks.editor(filename, 1) with open(Path(filename), "r", encoding="utf-8") as f: new_block = f.read() # update the source and colored block self.src_blocks[index] = new_block self.src_blocks_colored[index] = self.highlight(new_block) self.block_index = index # call to run with the newly edited index self() def show(self,index=None): """Show a single block on screen""" index = self._get_index(index) if index is None: return print(self.marquee('<%s> block # %s (%s remaining)' % (self.title,index,self.nblocks-index-1))) print(self.src_blocks_colored[index]) sys.stdout.flush() def show_all(self): """Show entire demo on screen, block by block""" fname = self.title title = self.title nblocks = self.nblocks silent = self._silent marquee = self.marquee for index,block in enumerate(self.src_blocks_colored): if silent[index]: print(marquee('<%s> SILENT block # %s (%s remaining)' % (title,index,nblocks-index-1))) else: print(marquee('<%s> block # %s (%s remaining)' % (title,index,nblocks-index-1))) print(block, end=' ') sys.stdout.flush() def run_cell(self,source): """Execute a string with one or more lines of code""" exec(source, self.user_ns) def __call__(self,index=None): """run a block of the demo. If index is given, it should be an integer >=1 and <= nblocks. This means that the calling convention is one off from typical Python lists. The reason for the inconsistency is that the demo always prints 'Block n/N, and N is the total, so it would be very odd to use zero-indexing here.""" index = self._get_index(index) if index is None: return try: marquee = self.marquee next_block = self.src_blocks[index] self.block_index += 1 if self._silent[index]: print(marquee('Executing silent block # %s (%s remaining)' % (index,self.nblocks-index-1))) else: self.pre_cmd() self.show(index) if self.auto_all or self._auto[index]: print(marquee('output:')) else: print(marquee('Press to quit, to execute...'), end=' ') ans = py3compat.input().strip() if ans: print(marquee('Block NOT executed')) return try: save_argv = sys.argv sys.argv = self.sys_argv self.run_cell(next_block) self.post_cmd() finally: sys.argv = save_argv except: if self.inside_ipython: self.ip_showtb(filename=self.fname) else: if self.inside_ipython: self.ip_ns.update(self.user_ns) if self.block_index == self.nblocks: mq1 = self.marquee('END OF DEMO') if mq1: # avoid spurious print if empty marquees are used print() print(mq1) print(self.marquee('Use .reset() if you want to rerun it.')) self.finished = True # These methods are meant to be overridden by subclasses who may wish to # customize the behavior of of their demos. def marquee(self,txt='',width=78,mark='*'): """Return the input string centered in a 'marquee'.""" return marquee(txt,width,mark) def pre_cmd(self): """Method called before executing each block.""" pass def post_cmd(self): """Method called after executing each block.""" pass def highlight(self, block): """Method called on each block to highlight it content""" tokens = pygments.lex(block, self.python_lexer) if self.format_rst: from pygments.token import Token toks = [] for token in tokens: if token[0] == Token.String.Doc and len(token[1]) > 6: toks += pygments.lex(token[1][:3], self.python_lexer) # parse doc string content by rst lexer toks += pygments.lex(token[1][3:-3], self.rst_lexer) toks += pygments.lex(token[1][-3:], self.python_lexer) elif token[0] == Token.Comment.Single: toks.append((Token.Comment.Single, token[1][0])) # parse comment content by rst lexer # remove the extra newline added by rst lexer toks += list(pygments.lex(token[1][1:], self.rst_lexer))[:-1] else: toks.append(token) tokens = toks return pygments.format(tokens, self.formatter) class IPythonDemo(Demo): """Class for interactive demos with IPython's input processing applied. This subclasses Demo, but instead of executing each block by the Python interpreter (via exec), it actually calls IPython on it, so that any input filters which may be in place are applied to the input block. If you have an interactive environment which exposes special input processing, you can use this class instead to write demo scripts which operate exactly as if you had typed them interactively. The default Demo class requires the input to be valid, pure Python code. """ def run_cell(self,source): """Execute a string with one or more lines of code""" self.shell.run_cell(source) class LineDemo(Demo): """Demo where each line is executed as a separate block. The input script should be valid Python code. This class doesn't require any markup at all, and it's meant for simple scripts (with no nesting or any kind of indentation) which consist of multiple lines of input to be executed, one at a time, as if they had been typed in the interactive prompt. Note: the input can not have *any* indentation, which means that only single-lines of input are accepted, not even function definitions are valid.""" def reload(self): """Reload source from disk and initialize state.""" # read data and parse into blocks self.fload() lines = self.fobj.readlines() src_b = [l for l in lines if l.strip()] nblocks = len(src_b) self.src = ''.join(lines) self._silent = [False]*nblocks self._auto = [True]*nblocks self.auto_all = True self.nblocks = nblocks self.src_blocks = src_b # also build syntax-highlighted source self.src_blocks_colored = list(map(self.highlight,self.src_blocks)) # ensure clean namespace and seek offset self.reset() class IPythonLineDemo(IPythonDemo,LineDemo): """Variant of the LineDemo class whose input is processed by IPython.""" pass class ClearMixin(object): """Use this mixin to make Demo classes with less visual clutter. Demos using this mixin will clear the screen before every block and use blank marquees. Note that in order for the methods defined here to actually override those of the classes it's mixed with, it must go /first/ in the inheritance tree. For example: class ClearIPDemo(ClearMixin,IPythonDemo): pass will provide an IPythonDemo class with the mixin's features. """ def marquee(self,txt='',width=78,mark='*'): """Blank marquee that returns '' no matter what the input.""" return '' def pre_cmd(self): """Method called before executing each block. This one simply clears the screen.""" from IPython.utils.terminal import _term_clear _term_clear() class ClearDemo(ClearMixin,Demo): pass class ClearIPDemo(ClearMixin,IPythonDemo): pass def slide(file_path, noclear=False, format_rst=True, formatter="terminal", style="native", auto_all=False, delimiter='...'): if noclear: demo_class = Demo else: demo_class = ClearDemo demo = demo_class(file_path, format_rst=format_rst, formatter=formatter, style=style, auto_all=auto_all) while not demo.finished: demo() try: py3compat.input('\n' + delimiter) except KeyboardInterrupt: exit(1) if __name__ == '__main__': import argparse parser = argparse.ArgumentParser(description='Run python demos') parser.add_argument('--noclear', '-C', action='store_true', help='Do not clear terminal on each slide') parser.add_argument('--rst', '-r', action='store_true', help='Highlight comments and dostrings as rst') parser.add_argument('--formatter', '-f', default='terminal', help='pygments formatter name could be: terminal, ' 'terminal256, terminal16m') parser.add_argument('--style', '-s', default='default', help='pygments style name') parser.add_argument('--auto', '-a', action='store_true', help='Run all blocks automatically without' 'confirmation') parser.add_argument('--delimiter', '-d', default='...', help='slides delimiter added after each slide run') parser.add_argument('file', nargs=1, help='python demo file') args = parser.parse_args() slide(args.file[0], noclear=args.noclear, format_rst=args.rst, formatter=args.formatter, style=args.style, auto_all=args.auto, delimiter=args.delimiter) ipython-8.35.0/IPython/lib/display.py000066400000000000000000000577661477474304100175200ustar00rootroot00000000000000"""Various display related classes. Authors : MinRK, gregcaporaso, dannystaple """ from html import escape as html_escape from os.path import exists, isfile, splitext, abspath, join, isdir from os import walk, sep, fsdecode from IPython.core.display import DisplayObject, TextDisplayObject from typing import Tuple, Iterable, Optional __all__ = ['Audio', 'IFrame', 'YouTubeVideo', 'VimeoVideo', 'ScribdDocument', 'FileLink', 'FileLinks', 'Code'] class Audio(DisplayObject): """Create an audio object. When this object is returned by an input cell or passed to the display function, it will result in Audio controls being displayed in the frontend (only works in the notebook). Parameters ---------- data : numpy array, list, unicode, str or bytes Can be one of * Numpy 1d array containing the desired waveform (mono) * Numpy 2d array containing waveforms for each channel. Shape=(NCHAN, NSAMPLES). For the standard channel order, see http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx * List of float or integer representing the waveform (mono) * String containing the filename * Bytestring containing raw PCM data or * URL pointing to a file on the web. If the array option is used, the waveform will be normalized. If a filename or url is used, the format support will be browser dependent. url : unicode A URL to download the data from. filename : unicode Path to a local file to load the data from. embed : boolean Should the audio data be embedded using a data URI (True) or should the original source be referenced. Set this to True if you want the audio to playable later with no internet connection in the notebook. Default is `True`, unless the keyword argument `url` is set, then default value is `False`. rate : integer The sampling rate of the raw data. Only required when data parameter is being used as an array autoplay : bool Set to True if the audio should immediately start playing. Default is `False`. normalize : bool Whether audio should be normalized (rescaled) to the maximum possible range. Default is `True`. When set to `False`, `data` must be between -1 and 1 (inclusive), otherwise an error is raised. Applies only when `data` is a list or array of samples; other types of audio are never normalized. Examples -------- >>> import pytest >>> np = pytest.importorskip("numpy") Generate a sound >>> import numpy as np >>> framerate = 44100 >>> t = np.linspace(0,5,framerate*5) >>> data = np.sin(2*np.pi*220*t) + np.sin(2*np.pi*224*t) >>> Audio(data, rate=framerate) Can also do stereo or more channels >>> dataleft = np.sin(2*np.pi*220*t) >>> dataright = np.sin(2*np.pi*224*t) >>> Audio([dataleft, dataright], rate=framerate) From URL: >>> Audio("http://www.nch.com.au/acm/8k16bitpcm.wav") # doctest: +SKIP >>> Audio(url="http://www.w3schools.com/html/horse.ogg") # doctest: +SKIP From a File: >>> Audio('IPython/lib/tests/test.wav') # doctest: +SKIP >>> Audio(filename='IPython/lib/tests/test.wav') # doctest: +SKIP From Bytes: >>> Audio(b'RAW_WAV_DATA..') # doctest: +SKIP >>> Audio(data=b'RAW_WAV_DATA..') # doctest: +SKIP See Also -------- ipywidgets.Audio Audio widget with more more flexibility and options. """ _read_flags = 'rb' def __init__(self, data=None, filename=None, url=None, embed=None, rate=None, autoplay=False, normalize=True, *, element_id=None): if filename is None and url is None and data is None: raise ValueError("No audio data found. Expecting filename, url, or data.") if embed is False and url is None: raise ValueError("No url found. Expecting url when embed=False") if url is not None and embed is not True: self.embed = False else: self.embed = True self.autoplay = autoplay self.element_id = element_id super(Audio, self).__init__(data=data, url=url, filename=filename) if self.data is not None and not isinstance(self.data, bytes): if rate is None: raise ValueError("rate must be specified when data is a numpy array or list of audio samples.") self.data = Audio._make_wav(data, rate, normalize) def reload(self): """Reload the raw data from file or URL.""" import mimetypes if self.embed: super(Audio, self).reload() if self.filename is not None: self.mimetype = mimetypes.guess_type(self.filename)[0] elif self.url is not None: self.mimetype = mimetypes.guess_type(self.url)[0] else: self.mimetype = "audio/wav" @staticmethod def _make_wav(data, rate, normalize): """ Transform a numpy array to a PCM bytestring """ from io import BytesIO import wave try: scaled, nchan = Audio._validate_and_normalize_with_numpy(data, normalize) except ImportError: scaled, nchan = Audio._validate_and_normalize_without_numpy(data, normalize) fp = BytesIO() waveobj = wave.open(fp,mode='wb') waveobj.setnchannels(nchan) waveobj.setframerate(rate) waveobj.setsampwidth(2) waveobj.setcomptype('NONE','NONE') waveobj.writeframes(scaled) val = fp.getvalue() waveobj.close() return val @staticmethod def _validate_and_normalize_with_numpy(data, normalize) -> Tuple[bytes, int]: import numpy as np data = np.array(data, dtype=float) if len(data.shape) == 1: nchan = 1 elif len(data.shape) == 2: # In wave files,channels are interleaved. E.g., # "L1R1L2R2..." for stereo. See # http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx # for channel ordering nchan = data.shape[0] data = data.T.ravel() else: raise ValueError('Array audio input must be a 1D or 2D array') max_abs_value = np.max(np.abs(data)) normalization_factor = Audio._get_normalization_factor(max_abs_value, normalize) scaled = data / normalization_factor * 32767 return scaled.astype(" 1: raise ValueError('Audio data must be between -1 and 1 when normalize=False.') return max_abs_value if normalize else 1 def _data_and_metadata(self): """shortcut for returning metadata with url information, if defined""" md = {} if self.url: md['url'] = self.url if md: return self.data, md else: return self.data def _repr_html_(self): src = """ """ return src.format(src=self.src_attr(), type=self.mimetype, autoplay=self.autoplay_attr(), element_id=self.element_id_attr()) def src_attr(self): import base64 if self.embed and (self.data is not None): data = base64=base64.b64encode(self.data).decode('ascii') return """data:{type};base64,{base64}""".format(type=self.mimetype, base64=data) elif self.url is not None: return self.url else: return "" def autoplay_attr(self): if(self.autoplay): return 'autoplay="autoplay"' else: return '' def element_id_attr(self): if (self.element_id): return 'id="{element_id}"'.format(element_id=self.element_id) else: return '' class IFrame(object): """ Generic class to embed an iframe in an IPython notebook """ iframe = """ """ def __init__( self, src, width, height, extras: Optional[Iterable[str]] = None, **kwargs ): if extras is None: extras = [] self.src = src self.width = width self.height = height self.extras = extras self.params = kwargs def _repr_html_(self): """return the embed iframe""" if self.params: from urllib.parse import urlencode params = "?" + urlencode(self.params) else: params = "" return self.iframe.format( src=self.src, width=self.width, height=self.height, params=params, extras=" ".join(self.extras), ) class YouTubeVideo(IFrame): """Class for embedding a YouTube Video in an IPython session, based on its video id. e.g. to embed the video from https://www.youtube.com/watch?v=foo , you would do:: vid = YouTubeVideo("foo") display(vid) To start from 30 seconds:: vid = YouTubeVideo("abc", start=30) display(vid) To calculate seconds from time as hours, minutes, seconds use :class:`datetime.timedelta`:: start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds()) Other parameters can be provided as documented at https://developers.google.com/youtube/player_parameters#Parameters When converting the notebook using nbconvert, a jpeg representation of the video will be inserted in the document. """ def __init__(self, id, width=400, height=300, allow_autoplay=False, **kwargs): self.id=id src = "https://www.youtube.com/embed/{0}".format(id) if allow_autoplay: extras = list(kwargs.get("extras", [])) + ['allow="autoplay"'] kwargs.update(autoplay=1, extras=extras) super(YouTubeVideo, self).__init__(src, width, height, **kwargs) def _repr_jpeg_(self): # Deferred import from urllib.request import urlopen try: return urlopen("https://img.youtube.com/vi/{id}/hqdefault.jpg".format(id=self.id)).read() except IOError: return None class VimeoVideo(IFrame): """ Class for embedding a Vimeo video in an IPython session, based on its video id. """ def __init__(self, id, width=400, height=300, **kwargs): src="https://player.vimeo.com/video/{0}".format(id) super(VimeoVideo, self).__init__(src, width, height, **kwargs) class ScribdDocument(IFrame): """ Class for embedding a Scribd document in an IPython session Use the start_page params to specify a starting point in the document Use the view_mode params to specify display type one off scroll | slideshow | book e.g to Display Wes' foundational paper about PANDAS in book mode from page 3 ScribdDocument(71048089, width=800, height=400, start_page=3, view_mode="book") """ def __init__(self, id, width=400, height=300, **kwargs): src="https://www.scribd.com/embeds/{0}/content".format(id) super(ScribdDocument, self).__init__(src, width, height, **kwargs) class FileLink(object): """Class for embedding a local file link in an IPython session, based on path e.g. to embed a link that was generated in the IPython notebook as my/data.txt you would do:: local_file = FileLink("my/data.txt") display(local_file) or in the HTML notebook, just:: FileLink("my/data.txt") """ html_link_str = "%s" def __init__(self, path, url_prefix='', result_html_prefix='', result_html_suffix='
'): """ Parameters ---------- path : str path to the file or directory that should be formatted url_prefix : str prefix to be prepended to all files to form a working link [default: ''] result_html_prefix : str text to append to beginning to link [default: ''] result_html_suffix : str text to append at the end of link [default: '
'] """ if isdir(path): raise ValueError("Cannot display a directory using FileLink. " "Use FileLinks to display '%s'." % path) self.path = fsdecode(path) self.url_prefix = url_prefix self.result_html_prefix = result_html_prefix self.result_html_suffix = result_html_suffix def _format_path(self): fp = ''.join([self.url_prefix, html_escape(self.path)]) return ''.join([self.result_html_prefix, self.html_link_str % \ (fp, html_escape(self.path, quote=False)), self.result_html_suffix]) def _repr_html_(self): """return html link to file """ if not exists(self.path): return ("Path (%s) doesn't exist. " "It may still be in the process of " "being generated, or you may have the " "incorrect path." % self.path) return self._format_path() def __repr__(self): """return absolute path to file """ return abspath(self.path) class FileLinks(FileLink): """Class for embedding local file links in an IPython session, based on path e.g. to embed links to files that were generated in the IPython notebook under ``my/data``, you would do:: local_files = FileLinks("my/data") display(local_files) or in the HTML notebook, just:: FileLinks("my/data") """ def __init__(self, path, url_prefix='', included_suffixes=None, result_html_prefix='', result_html_suffix='
', notebook_display_formatter=None, terminal_display_formatter=None, recursive=True): """ See :class:`FileLink` for the ``path``, ``url_prefix``, ``result_html_prefix`` and ``result_html_suffix`` parameters. included_suffixes : list Filename suffixes to include when formatting output [default: include all files] notebook_display_formatter : function Used to format links for display in the notebook. See discussion of formatter functions below. terminal_display_formatter : function Used to format links for display in the terminal. See discussion of formatter functions below. Formatter functions must be of the form:: f(dirname, fnames, included_suffixes) dirname : str The name of a directory fnames : list The files in that directory included_suffixes : list The file suffixes that should be included in the output (passing None meansto include all suffixes in the output in the built-in formatters) recursive : boolean Whether to recurse into subdirectories. Default is True. The function should return a list of lines that will be printed in the notebook (if passing notebook_display_formatter) or the terminal (if passing terminal_display_formatter). This function is iterated over for each directory in self.path. Default formatters are in place, can be passed here to support alternative formatting. """ if isfile(path): raise ValueError("Cannot display a file using FileLinks. " "Use FileLink to display '%s'." % path) self.included_suffixes = included_suffixes # remove trailing slashes for more consistent output formatting path = path.rstrip('/') self.path = path self.url_prefix = url_prefix self.result_html_prefix = result_html_prefix self.result_html_suffix = result_html_suffix self.notebook_display_formatter = \ notebook_display_formatter or self._get_notebook_display_formatter() self.terminal_display_formatter = \ terminal_display_formatter or self._get_terminal_display_formatter() self.recursive = recursive def _get_display_formatter( self, dirname_output_format, fname_output_format, fp_format, fp_cleaner=None ): """generate built-in formatter function this is used to define both the notebook and terminal built-in formatters as they only differ by some wrapper text for each entry dirname_output_format: string to use for formatting directory names, dirname will be substituted for a single "%s" which must appear in this string fname_output_format: string to use for formatting file names, if a single "%s" appears in the string, fname will be substituted if two "%s" appear in the string, the path to fname will be substituted for the first and fname will be substituted for the second fp_format: string to use for formatting filepaths, must contain exactly two "%s" and the dirname will be substituted for the first and fname will be substituted for the second """ def f(dirname, fnames, included_suffixes=None): result = [] # begin by figuring out which filenames, if any, # are going to be displayed display_fnames = [] for fname in fnames: if (isfile(join(dirname,fname)) and (included_suffixes is None or splitext(fname)[1] in included_suffixes)): display_fnames.append(fname) if len(display_fnames) == 0: # if there are no filenames to display, don't print anything # (not even the directory name) pass else: # otherwise print the formatted directory name followed by # the formatted filenames dirname_output_line = dirname_output_format % dirname result.append(dirname_output_line) for fname in display_fnames: fp = fp_format % (dirname,fname) if fp_cleaner is not None: fp = fp_cleaner(fp) try: # output can include both a filepath and a filename... fname_output_line = fname_output_format % (fp, fname) except TypeError: # ... or just a single filepath fname_output_line = fname_output_format % fname result.append(fname_output_line) return result return f def _get_notebook_display_formatter(self, spacer="  "): """ generate function to use for notebook formatting """ dirname_output_format = \ self.result_html_prefix + "%s/" + self.result_html_suffix fname_output_format = \ self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix fp_format = self.url_prefix + '%s/%s' if sep == "\\": # Working on a platform where the path separator is "\", so # must convert these to "/" for generating a URI def fp_cleaner(fp): # Replace all occurrences of backslash ("\") with a forward # slash ("/") - this is necessary on windows when a path is # provided as input, but we must link to a URI return fp.replace('\\','/') else: fp_cleaner = None return self._get_display_formatter(dirname_output_format, fname_output_format, fp_format, fp_cleaner) def _get_terminal_display_formatter(self, spacer=" "): """ generate function to use for terminal formatting """ dirname_output_format = "%s/" fname_output_format = spacer + "%s" fp_format = '%s/%s' return self._get_display_formatter(dirname_output_format, fname_output_format, fp_format) def _format_path(self): result_lines = [] if self.recursive: walked_dir = list(walk(self.path)) else: walked_dir = [next(walk(self.path))] walked_dir.sort() for dirname, subdirs, fnames in walked_dir: result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes) return '\n'.join(result_lines) def __repr__(self): """return newline-separated absolute paths """ result_lines = [] if self.recursive: walked_dir = list(walk(self.path)) else: walked_dir = [next(walk(self.path))] walked_dir.sort() for dirname, subdirs, fnames in walked_dir: result_lines += self.terminal_display_formatter(dirname, fnames, self.included_suffixes) return '\n'.join(result_lines) class Code(TextDisplayObject): """Display syntax-highlighted source code. This uses Pygments to highlight the code for HTML and Latex output. Parameters ---------- data : str The code as a string url : str A URL to fetch the code from filename : str A local filename to load the code from language : str The short name of a Pygments lexer to use for highlighting. If not specified, it will guess the lexer based on the filename or the code. Available lexers: http://pygments.org/docs/lexers/ """ def __init__(self, data=None, url=None, filename=None, language=None): self.language = language super().__init__(data=data, url=url, filename=filename) def _get_lexer(self): if self.language: from pygments.lexers import get_lexer_by_name return get_lexer_by_name(self.language) elif self.filename: from pygments.lexers import get_lexer_for_filename return get_lexer_for_filename(self.filename) else: from pygments.lexers import guess_lexer return guess_lexer(self.data) def __repr__(self): return self.data def _repr_html_(self): from pygments import highlight from pygments.formatters import HtmlFormatter fmt = HtmlFormatter() style = ''.format(fmt.get_style_defs('.output_html')) return style + highlight(self.data, self._get_lexer(), fmt) def _repr_latex_(self): from pygments import highlight from pygments.formatters import LatexFormatter return highlight(self.data, self._get_lexer(), LatexFormatter()) ipython-8.35.0/IPython/lib/editorhooks.py000066400000000000000000000076161477474304100203720ustar00rootroot00000000000000""" 'editor' hooks for common editors that work well with ipython They should honor the line number argument, at least. Contributions are *very* welcome. """ import os import shlex import subprocess import sys from IPython import get_ipython from IPython.core.error import TryNext from IPython.utils import py3compat def install_editor(template, wait=False): """Installs the editor that is called by IPython for the %edit magic. This overrides the default editor, which is generally set by your EDITOR environment variable or is notepad (windows) or vi (linux). By supplying a template string `run_template`, you can control how the editor is invoked by IPython -- (e.g. the format in which it accepts command line options) Parameters ---------- template : basestring run_template acts as a template for how your editor is invoked by the shell. It should contain '{filename}', which will be replaced on invocation with the file name, and '{line}', $line by line number (or 0) to invoke the file with. wait : bool If `wait` is true, wait until the user presses enter before returning, to facilitate non-blocking editors that exit immediately after the call. """ # not all editors support $line, so we'll leave out this check # for substitution in ['$file', '$line']: # if not substitution in run_template: # raise ValueError(('run_template should contain %s' # ' for string substitution. You supplied "%s"' % (substitution, # run_template))) def call_editor(self, filename, line=0): if line is None: line = 0 cmd = template.format(filename=shlex.quote(filename), line=line) print(">", cmd) # shlex.quote doesn't work right on Windows, but it does after splitting if sys.platform.startswith('win'): cmd = shlex.split(cmd) proc = subprocess.Popen(cmd, shell=True) if proc.wait() != 0: raise TryNext() if wait: py3compat.input("Press Enter when done editing:") get_ipython().set_hook('editor', call_editor) get_ipython().editor = template # in these, exe is always the path/name of the executable. Useful # if you don't have the editor directory in your path def komodo(exe=u'komodo'): """ Activestate Komodo [Edit] """ install_editor(exe + u' -l {line} {filename}', wait=True) def scite(exe=u"scite"): """ SciTE or Sc1 """ install_editor(exe + u' {filename} -goto:{line}') def notepadplusplus(exe=u'notepad++'): """ Notepad++ http://notepad-plus.sourceforge.net """ install_editor(exe + u' -n{line} {filename}') def jed(exe=u'jed'): """ JED, the lightweight emacsish editor """ install_editor(exe + u' +{line} {filename}') def idle(exe=u'idle'): """ Idle, the editor bundled with python Parameters ---------- exe : str, None If none, should be pretty smart about finding the executable. """ if exe is None: import idlelib p = os.path.dirname(idlelib.__filename__) # i'm not sure if this actually works. Is this idle.py script # guaranteed to be executable? exe = os.path.join(p, 'idle.py') install_editor(exe + u' {filename}') def mate(exe=u'mate'): """ TextMate, the missing editor""" # wait=True is not required since we're using the -w flag to mate install_editor(exe + u' -w -l {line} {filename}') # ########################################## # these are untested, report any problems # ########################################## def emacs(exe=u'emacs'): install_editor(exe + u' +{line} {filename}') def gnuclient(exe=u'gnuclient'): install_editor(exe + u' -nw +{line} {filename}') def crimson_editor(exe=u'cedt.exe'): install_editor(exe + u' /L:{line} {filename}') def kate(exe=u'kate'): install_editor(exe + u' -u -l {line} {filename}') ipython-8.35.0/IPython/lib/guisupport.py000066400000000000000000000142341477474304100202530ustar00rootroot00000000000000# coding: utf-8 """ Support for creating GUI apps and starting event loops. IPython's GUI integration allows interactive plotting and GUI usage in IPython session. IPython has two different types of GUI integration: 1. The terminal based IPython supports GUI event loops through Python's PyOS_InputHook. PyOS_InputHook is a hook that Python calls periodically whenever raw_input is waiting for a user to type code. We implement GUI support in the terminal by setting PyOS_InputHook to a function that iterates the event loop for a short while. It is important to note that in this situation, the real GUI event loop is NOT run in the normal manner, so you can't use the normal means to detect that it is running. 2. In the two process IPython kernel/frontend, the GUI event loop is run in the kernel. In this case, the event loop is run in the normal manner by calling the function or method of the GUI toolkit that starts the event loop. In addition to starting the GUI event loops in one of these two ways, IPython will *always* create an appropriate GUI application object when GUi integration is enabled. If you want your GUI apps to run in IPython you need to do two things: 1. Test to see if there is already an existing main application object. If there is, you should use it. If there is not an existing application object you should create one. 2. Test to see if the GUI event loop is running. If it is, you should not start it. If the event loop is not running you may start it. This module contains functions for each toolkit that perform these things in a consistent manner. Because of how PyOS_InputHook runs the event loop you cannot detect if the event loop is running using the traditional calls (such as ``wx.GetApp.IsMainLoopRunning()`` in wxPython). If PyOS_InputHook is set These methods will return a false negative. That is, they will say the event loop is not running, when is actually is. To work around this limitation we proposed the following informal protocol: * Whenever someone starts the event loop, they *must* set the ``_in_event_loop`` attribute of the main application object to ``True``. This should be done regardless of how the event loop is actually run. * Whenever someone stops the event loop, they *must* set the ``_in_event_loop`` attribute of the main application object to ``False``. * If you want to see if the event loop is running, you *must* use ``hasattr`` to see if ``_in_event_loop`` attribute has been set. If it is set, you *must* use its value. If it has not been set, you can query the toolkit in the normal manner. * If you want GUI support and no one else has created an application or started the event loop you *must* do this. We don't want projects to attempt to defer these things to someone else if they themselves need it. The functions below implement this logic for each GUI toolkit. If you need to create custom application subclasses, you will likely have to modify this code for your own purposes. This code can be copied into your own project so you don't have to depend on IPython. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from IPython.core.getipython import get_ipython #----------------------------------------------------------------------------- # wx #----------------------------------------------------------------------------- def get_app_wx(*args, **kwargs): """Create a new wx app or return an exiting one.""" import wx app = wx.GetApp() if app is None: if 'redirect' not in kwargs: kwargs['redirect'] = False app = wx.PySimpleApp(*args, **kwargs) return app def is_event_loop_running_wx(app=None): """Is the wx event loop running.""" # New way: check attribute on shell instance ip = get_ipython() if ip is not None: if ip.active_eventloop and ip.active_eventloop == 'wx': return True # Fall through to checking the application, because Wx has a native way # to check if the event loop is running, unlike Qt. # Old way: check Wx application if app is None: app = get_app_wx() if hasattr(app, '_in_event_loop'): return app._in_event_loop else: return app.IsMainLoopRunning() def start_event_loop_wx(app=None): """Start the wx event loop in a consistent manner.""" if app is None: app = get_app_wx() if not is_event_loop_running_wx(app): app._in_event_loop = True app.MainLoop() app._in_event_loop = False else: app._in_event_loop = True #----------------------------------------------------------------------------- # Qt #----------------------------------------------------------------------------- def get_app_qt4(*args, **kwargs): """Create a new Qt app or return an existing one.""" from IPython.external.qt_for_kernel import QtGui app = QtGui.QApplication.instance() if app is None: if not args: args = ([""],) app = QtGui.QApplication(*args, **kwargs) return app def is_event_loop_running_qt4(app=None): """Is the qt event loop running.""" # New way: check attribute on shell instance ip = get_ipython() if ip is not None: return ip.active_eventloop and ip.active_eventloop.startswith('qt') # Old way: check attribute on QApplication singleton if app is None: app = get_app_qt4([""]) if hasattr(app, '_in_event_loop'): return app._in_event_loop else: # Does qt provide a other way to detect this? return False def start_event_loop_qt4(app=None): """Start the qt event loop in a consistent manner.""" if app is None: app = get_app_qt4([""]) if not is_event_loop_running_qt4(app): app._in_event_loop = True app.exec_() app._in_event_loop = False else: app._in_event_loop = True #----------------------------------------------------------------------------- # Tk #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # gtk #----------------------------------------------------------------------------- ipython-8.35.0/IPython/lib/latextools.py000066400000000000000000000177001477474304100202310ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Tools for handling LaTeX.""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from io import BytesIO, open import os import tempfile import shutil import subprocess from base64 import encodebytes import textwrap from pathlib import Path from IPython.utils.process import find_cmd, FindCmdError from traitlets.config import get_config from traitlets.config.configurable import SingletonConfigurable from traitlets import List, Bool, Unicode class LaTeXTool(SingletonConfigurable): """An object to store configuration of the LaTeX tool.""" def _config_default(self): return get_config() backends = List( Unicode(), ["matplotlib", "dvipng"], help="Preferred backend to draw LaTeX math equations. " "Backends in the list are checked one by one and the first " "usable one is used. Note that `matplotlib` backend " "is usable only for inline style equations. To draw " "display style equations, `dvipng` backend must be specified. ", # It is a List instead of Enum, to make configuration more # flexible. For example, to use matplotlib mainly but dvipng # for display style, the default ["matplotlib", "dvipng"] can # be used. To NOT use dvipng so that other repr such as # unicode pretty printing is used, you can use ["matplotlib"]. ).tag(config=True) use_breqn = Bool( True, help="Use breqn.sty to automatically break long equations. " "This configuration takes effect only for dvipng backend.", ).tag(config=True) packages = List( ['amsmath', 'amsthm', 'amssymb', 'bm'], help="A list of packages to use for dvipng backend. " "'breqn' will be automatically appended when use_breqn=True.", ).tag(config=True) preamble = Unicode( help="Additional preamble to use when generating LaTeX source " "for dvipng backend.", ).tag(config=True) def latex_to_png( s: str, encode=False, backend=None, wrap=False, color="Black", scale=1.0 ): """Render a LaTeX string to PNG. Parameters ---------- s : str The raw string containing valid inline LaTeX. encode : bool, optional Should the PNG data base64 encoded to make it JSON'able. backend : {matplotlib, dvipng} Backend for producing PNG data. wrap : bool If true, Automatically wrap `s` as a LaTeX equation. color : string Foreground color name among dvipsnames, e.g. 'Maroon' or on hex RGB format, e.g. '#AA20FA'. scale : float Scale factor for the resulting PNG. None is returned when the backend cannot be used. """ assert isinstance(s, str) allowed_backends = LaTeXTool.instance().backends if backend is None: backend = allowed_backends[0] if backend not in allowed_backends: return None if backend == 'matplotlib': f = latex_to_png_mpl elif backend == 'dvipng': f = latex_to_png_dvipng if color.startswith('#'): # Convert hex RGB color to LaTeX RGB color. if len(color) == 7: try: color = "RGB {}".format(" ".join([str(int(x, 16)) for x in textwrap.wrap(color[1:], 2)])) except ValueError as e: raise ValueError('Invalid color specification {}.'.format(color)) from e else: raise ValueError('Invalid color specification {}.'.format(color)) else: raise ValueError('No such backend {0}'.format(backend)) bin_data = f(s, wrap, color, scale) if encode and bin_data: bin_data = encodebytes(bin_data) return bin_data def latex_to_png_mpl(s, wrap, color='Black', scale=1.0): try: from matplotlib import figure, font_manager, mathtext from matplotlib.backends import backend_agg from pyparsing import ParseFatalException except ImportError: return None # mpl mathtext doesn't support display math, force inline s = s.replace('$$', '$') if wrap: s = u'${0}$'.format(s) try: prop = font_manager.FontProperties(size=12) dpi = 120 * scale buffer = BytesIO() # Adapted from mathtext.math_to_image parser = mathtext.MathTextParser("path") width, height, depth, _, _ = parser.parse(s, dpi=72, prop=prop) fig = figure.Figure(figsize=(width / 72, height / 72)) fig.text(0, depth / height, s, fontproperties=prop, color=color) backend_agg.FigureCanvasAgg(fig) fig.savefig(buffer, dpi=dpi, format="png", transparent=True) return buffer.getvalue() except (ValueError, RuntimeError, ParseFatalException): return None def latex_to_png_dvipng(s, wrap, color='Black', scale=1.0): try: find_cmd('latex') find_cmd('dvipng') except FindCmdError: return None startupinfo = None if os.name == "nt": # prevent popup-windows startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW try: workdir = Path(tempfile.mkdtemp()) tmpfile = "tmp.tex" dvifile = "tmp.dvi" outfile = "tmp.png" with workdir.joinpath(tmpfile).open("w", encoding="utf8") as f: f.writelines(genelatex(s, wrap)) subprocess.check_call( ["latex", "-halt-on-error", "-interaction", "batchmode", tmpfile], cwd=workdir, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, startupinfo=startupinfo, ) resolution = round(150 * scale) subprocess.check_call( [ "dvipng", "-T", "tight", "-D", str(resolution), "-z", "9", "-bg", "Transparent", "-o", outfile, dvifile, "-fg", color, ], cwd=workdir, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, startupinfo=startupinfo, ) with workdir.joinpath(outfile).open("rb") as f: return f.read() except subprocess.CalledProcessError: return None finally: shutil.rmtree(workdir) def kpsewhich(filename): """Invoke kpsewhich command with an argument `filename`.""" try: find_cmd("kpsewhich") proc = subprocess.Popen( ["kpsewhich", filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = proc.communicate() return stdout.strip().decode('utf8', 'replace') except FindCmdError: pass def genelatex(body, wrap): """Generate LaTeX document for dvipng backend.""" lt = LaTeXTool.instance() breqn = wrap and lt.use_breqn and kpsewhich("breqn.sty") yield r'\documentclass{article}' packages = lt.packages if breqn: packages = packages + ['breqn'] for pack in packages: yield r'\usepackage{{{0}}}'.format(pack) yield r'\pagestyle{empty}' if lt.preamble: yield lt.preamble yield r'\begin{document}' if breqn: yield r'\begin{dmath*}' yield body yield r'\end{dmath*}' elif wrap: yield u'$${0}$$'.format(body) else: yield body yield u'\\end{document}' _data_uri_template_png = u"""%s""" def latex_to_html(s, alt='image'): """Render LaTeX to HTML with embedded PNG data using data URIs. Parameters ---------- s : str The raw string containing valid inline LateX. alt : str The alt text to use for the HTML. """ base64_data = latex_to_png(s, encode=True).decode('ascii') if base64_data: return _data_uri_template_png % (base64_data, alt) ipython-8.35.0/IPython/lib/lexers.py000066400000000000000000000507521477474304100173410ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Defines a variety of Pygments lexers for highlighting IPython code. This includes: IPythonLexer, IPython3Lexer Lexers for pure IPython (python + magic/shell commands) IPythonPartialTracebackLexer, IPythonTracebackLexer Supports 2.x and 3.x via keyword `python3`. The partial traceback lexer reads everything but the Python code appearing in a traceback. The full lexer combines the partial lexer with an IPython lexer. IPythonConsoleLexer A lexer for IPython console sessions, with support for tracebacks. IPyLexer A friendly lexer which examines the first line of text and from it, decides whether to use an IPython lexer or an IPython console lexer. This is probably the only lexer that needs to be explicitly added to Pygments. """ #----------------------------------------------------------------------------- # Copyright (c) 2013, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- # Standard library import re # Third party from pygments.lexers import ( BashLexer, HtmlLexer, JavascriptLexer, RubyLexer, PerlLexer, PythonLexer, Python3Lexer, TexLexer) from pygments.lexer import ( Lexer, DelegatingLexer, RegexLexer, do_insertions, bygroups, using, ) from pygments.token import ( Generic, Keyword, Literal, Name, Operator, Other, Text, Error, ) from pygments.util import get_bool_opt # Local line_re = re.compile('.*?\n') __all__ = ['build_ipy_lexer', 'IPython3Lexer', 'IPythonLexer', 'IPythonPartialTracebackLexer', 'IPythonTracebackLexer', 'IPythonConsoleLexer', 'IPyLexer'] def build_ipy_lexer(python3): """Builds IPython lexers depending on the value of `python3`. The lexer inherits from an appropriate Python lexer and then adds information about IPython specific keywords (i.e. magic commands, shell commands, etc.) Parameters ---------- python3 : bool If `True`, then build an IPython lexer from a Python 3 lexer. """ # It would be nice to have a single IPython lexer class which takes # a boolean `python3`. But since there are two Python lexer classes, # we will also have two IPython lexer classes. if python3: PyLexer = Python3Lexer name = 'IPython3' aliases = ['ipython3'] doc = """IPython3 Lexer""" else: PyLexer = PythonLexer name = 'IPython' aliases = ['ipython2', 'ipython'] doc = """IPython Lexer""" ipython_tokens = [ (r'(?s)(\s*)(%%capture)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?s)(\s*)(%%debug)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?is)(\s*)(%%html)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(HtmlLexer))), (r'(?s)(\s*)(%%javascript)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(JavascriptLexer))), (r'(?s)(\s*)(%%js)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(JavascriptLexer))), (r'(?s)(\s*)(%%latex)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(TexLexer))), (r'(?s)(\s*)(%%perl)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PerlLexer))), (r'(?s)(\s*)(%%prun)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?s)(\s*)(%%pypy)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?s)(\s*)(%%python)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?s)(\s*)(%%python2)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PythonLexer))), (r'(?s)(\s*)(%%python3)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(Python3Lexer))), (r'(?s)(\s*)(%%ruby)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(RubyLexer))), (r'(?s)(\s*)(%%time)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?s)(\s*)(%%timeit)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?s)(\s*)(%%writefile)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r'(?s)(\s*)(%%file)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), (r"(?s)(\s*)(%%)(\w+)(.*)", bygroups(Text, Operator, Keyword, Text)), (r'(?s)(^\s*)(%%!)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(BashLexer))), (r"(%%?)(\w+)(\?\??)$", bygroups(Operator, Keyword, Operator)), (r"\b(\?\??)(\s*)$", bygroups(Operator, Text)), (r'(%)(sx|sc|system)(.*)(\n)', bygroups(Operator, Keyword, using(BashLexer), Text)), (r'(%)(\w+)(.*\n)', bygroups(Operator, Keyword, Text)), (r'^(!!)(.+)(\n)', bygroups(Operator, using(BashLexer), Text)), (r'(!)(?!=)(.+)(\n)', bygroups(Operator, using(BashLexer), Text)), (r'^(\s*)(\?\??)(\s*%{0,2}[\w\.\*]*)', bygroups(Text, Operator, Text)), (r'(\s*%{0,2}[\w\.\*]*)(\?\??)(\s*)$', bygroups(Text, Operator, Text)), ] tokens = PyLexer.tokens.copy() tokens['root'] = ipython_tokens + tokens['root'] attrs = {'name': name, 'aliases': aliases, 'filenames': [], '__doc__': doc, 'tokens': tokens} return type(name, (PyLexer,), attrs) IPython3Lexer = build_ipy_lexer(python3=True) IPythonLexer = build_ipy_lexer(python3=False) class IPythonPartialTracebackLexer(RegexLexer): """ Partial lexer for IPython tracebacks. Handles all the non-python output. """ name = 'IPython Partial Traceback' tokens = { 'root': [ # Tracebacks for syntax errors have a different style. # For both types of tracebacks, we mark the first line with # Generic.Traceback. For syntax errors, we mark the filename # as we mark the filenames for non-syntax tracebacks. # # These two regexps define how IPythonConsoleLexer finds a # traceback. # ## Non-syntax traceback (r'^(\^C)?(-+\n)', bygroups(Error, Generic.Traceback)), ## Syntax traceback (r'^( File)(.*)(, line )(\d+\n)', bygroups(Generic.Traceback, Name.Namespace, Generic.Traceback, Literal.Number.Integer)), # (Exception Identifier)(Whitespace)(Traceback Message) (r'(?u)(^[^\d\W]\w*)(\s*)(Traceback.*?\n)', bygroups(Name.Exception, Generic.Whitespace, Text)), # (Module/Filename)(Text)(Callee)(Function Signature) # Better options for callee and function signature? (r'(.*)( in )(.*)(\(.*\)\n)', bygroups(Name.Namespace, Text, Name.Entity, Name.Tag)), # Regular line: (Whitespace)(Line Number)(Python Code) (r'(\s*?)(\d+)(.*?\n)', bygroups(Generic.Whitespace, Literal.Number.Integer, Other)), # Emphasized line: (Arrow)(Line Number)(Python Code) # Using Exception token so arrow color matches the Exception. (r'(-*>?\s?)(\d+)(.*?\n)', bygroups(Name.Exception, Literal.Number.Integer, Other)), # (Exception Identifier)(Message) (r'(?u)(^[^\d\W]\w*)(:.*?\n)', bygroups(Name.Exception, Text)), # Tag everything else as Other, will be handled later. (r'.*\n', Other), ], } class IPythonTracebackLexer(DelegatingLexer): """ IPython traceback lexer. For doctests, the tracebacks can be snipped as much as desired with the exception to the lines that designate a traceback. For non-syntax error tracebacks, this is the line of hyphens. For syntax error tracebacks, this is the line which lists the File and line number. """ # The lexer inherits from DelegatingLexer. The "root" lexer is an # appropriate IPython lexer, which depends on the value of the boolean # `python3`. First, we parse with the partial IPython traceback lexer. # Then, any code marked with the "Other" token is delegated to the root # lexer. # name = 'IPython Traceback' aliases = ['ipythontb'] def __init__(self, **options): """ A subclass of `DelegatingLexer` which delegates to the appropriate to either IPyLexer, IPythonPartialTracebackLexer. """ # note we need a __init__ doc, as otherwise it inherits the doc from the super class # which will fail the documentation build as it references section of the pygments docs that # do not exists when building IPython's docs. self.python3 = get_bool_opt(options, 'python3', False) if self.python3: self.aliases = ['ipython3tb'] else: self.aliases = ['ipython2tb', 'ipythontb'] if self.python3: IPyLexer = IPython3Lexer else: IPyLexer = IPythonLexer DelegatingLexer.__init__(self, IPyLexer, IPythonPartialTracebackLexer, **options) class IPythonConsoleLexer(Lexer): """ An IPython console lexer for IPython code-blocks and doctests, such as: .. code-block:: rst .. code-block:: ipythonconsole In [1]: a = 'foo' In [2]: a Out[2]: 'foo' In [3]: print(a) foo Support is also provided for IPython exceptions: .. code-block:: rst .. code-block:: ipythonconsole In [1]: raise Exception Traceback (most recent call last): ... Exception """ name = 'IPython console session' aliases = ['ipythonconsole'] mimetypes = ['text/x-ipython-console'] # The regexps used to determine what is input and what is output. # The default prompts for IPython are: # # in = 'In [#]: ' # continuation = ' .D.: ' # template = 'Out[#]: ' # # Where '#' is the 'prompt number' or 'execution count' and 'D' # D is a number of dots matching the width of the execution count # in1_regex = r'In \[[0-9]+\]: ' in2_regex = r' \.\.+\.: ' out_regex = r'Out\[[0-9]+\]: ' #: The regex to determine when a traceback starts. ipytb_start = re.compile(r'^(\^C)?(-+\n)|^( File)(.*)(, line )(\d+\n)') def __init__(self, **options): """Initialize the IPython console lexer. Parameters ---------- python3 : bool If `True`, then the console inputs are parsed using a Python 3 lexer. Otherwise, they are parsed using a Python 2 lexer. in1_regex : RegexObject The compiled regular expression used to detect the start of inputs. Although the IPython configuration setting may have a trailing whitespace, do not include it in the regex. If `None`, then the default input prompt is assumed. in2_regex : RegexObject The compiled regular expression used to detect the continuation of inputs. Although the IPython configuration setting may have a trailing whitespace, do not include it in the regex. If `None`, then the default input prompt is assumed. out_regex : RegexObject The compiled regular expression used to detect outputs. If `None`, then the default output prompt is assumed. """ self.python3 = get_bool_opt(options, 'python3', False) if self.python3: self.aliases = ['ipython3console'] else: self.aliases = ['ipython2console', 'ipythonconsole'] in1_regex = options.get('in1_regex', self.in1_regex) in2_regex = options.get('in2_regex', self.in2_regex) out_regex = options.get('out_regex', self.out_regex) # So that we can work with input and output prompts which have been # rstrip'd (possibly by editors) we also need rstrip'd variants. If # we do not do this, then such prompts will be tagged as 'output'. # The reason can't just use the rstrip'd variants instead is because # we want any whitespace associated with the prompt to be inserted # with the token. This allows formatted code to be modified so as hide # the appearance of prompts, with the whitespace included. One example # use of this is in copybutton.js from the standard lib Python docs. in1_regex_rstrip = in1_regex.rstrip() + '\n' in2_regex_rstrip = in2_regex.rstrip() + '\n' out_regex_rstrip = out_regex.rstrip() + '\n' # Compile and save them all. attrs = ['in1_regex', 'in2_regex', 'out_regex', 'in1_regex_rstrip', 'in2_regex_rstrip', 'out_regex_rstrip'] for attr in attrs: self.__setattr__(attr, re.compile(locals()[attr])) Lexer.__init__(self, **options) if self.python3: pylexer = IPython3Lexer tblexer = IPythonTracebackLexer else: pylexer = IPythonLexer tblexer = IPythonTracebackLexer self.pylexer = pylexer(**options) self.tblexer = tblexer(**options) self.reset() def reset(self): self.mode = 'output' self.index = 0 self.buffer = u'' self.insertions = [] def buffered_tokens(self): """ Generator of unprocessed tokens after doing insertions and before changing to a new state. """ if self.mode == 'output': tokens = [(0, Generic.Output, self.buffer)] elif self.mode == 'input': tokens = self.pylexer.get_tokens_unprocessed(self.buffer) else: # traceback tokens = self.tblexer.get_tokens_unprocessed(self.buffer) for i, t, v in do_insertions(self.insertions, tokens): # All token indexes are relative to the buffer. yield self.index + i, t, v # Clear it all self.index += len(self.buffer) self.buffer = u'' self.insertions = [] def get_mci(self, line): """ Parses the line and returns a 3-tuple: (mode, code, insertion). `mode` is the next mode (or state) of the lexer, and is always equal to 'input', 'output', or 'tb'. `code` is a portion of the line that should be added to the buffer corresponding to the next mode and eventually lexed by another lexer. For example, `code` could be Python code if `mode` were 'input'. `insertion` is a 3-tuple (index, token, text) representing an unprocessed "token" that will be inserted into the stream of tokens that are created from the buffer once we change modes. This is usually the input or output prompt. In general, the next mode depends on current mode and on the contents of `line`. """ # To reduce the number of regex match checks, we have multiple # 'if' blocks instead of 'if-elif' blocks. # Check for possible end of input in2_match = self.in2_regex.match(line) in2_match_rstrip = self.in2_regex_rstrip.match(line) if (in2_match and in2_match.group().rstrip() == line.rstrip()) or \ in2_match_rstrip: end_input = True else: end_input = False if end_input and self.mode != 'tb': # Only look for an end of input when not in tb mode. # An ellipsis could appear within the traceback. mode = 'output' code = u'' insertion = (0, Generic.Prompt, line) return mode, code, insertion # Check for output prompt out_match = self.out_regex.match(line) out_match_rstrip = self.out_regex_rstrip.match(line) if out_match or out_match_rstrip: mode = 'output' if out_match: idx = out_match.end() else: idx = out_match_rstrip.end() code = line[idx:] # Use the 'heading' token for output. We cannot use Generic.Error # since it would conflict with exceptions. insertion = (0, Generic.Heading, line[:idx]) return mode, code, insertion # Check for input or continuation prompt (non stripped version) in1_match = self.in1_regex.match(line) if in1_match or (in2_match and self.mode != 'tb'): # New input or when not in tb, continued input. # We do not check for continued input when in tb since it is # allowable to replace a long stack with an ellipsis. mode = 'input' if in1_match: idx = in1_match.end() else: # in2_match idx = in2_match.end() code = line[idx:] insertion = (0, Generic.Prompt, line[:idx]) return mode, code, insertion # Check for input or continuation prompt (stripped version) in1_match_rstrip = self.in1_regex_rstrip.match(line) if in1_match_rstrip or (in2_match_rstrip and self.mode != 'tb'): # New input or when not in tb, continued input. # We do not check for continued input when in tb since it is # allowable to replace a long stack with an ellipsis. mode = 'input' if in1_match_rstrip: idx = in1_match_rstrip.end() else: # in2_match idx = in2_match_rstrip.end() code = line[idx:] insertion = (0, Generic.Prompt, line[:idx]) return mode, code, insertion # Check for traceback if self.ipytb_start.match(line): mode = 'tb' code = line insertion = None return mode, code, insertion # All other stuff... if self.mode in ('input', 'output'): # We assume all other text is output. Multiline input that # does not use the continuation marker cannot be detected. # For example, the 3 in the following is clearly output: # # In [1]: print(3) # 3 # # But the following second line is part of the input: # # In [2]: while True: # print(True) # # In both cases, the 2nd line will be 'output'. # mode = 'output' else: mode = 'tb' code = line insertion = None return mode, code, insertion def get_tokens_unprocessed(self, text): self.reset() for match in line_re.finditer(text): line = match.group() mode, code, insertion = self.get_mci(line) if mode != self.mode: # Yield buffered tokens before transitioning to new mode. for token in self.buffered_tokens(): yield token self.mode = mode if insertion: self.insertions.append((len(self.buffer), [insertion])) self.buffer += code for token in self.buffered_tokens(): yield token class IPyLexer(Lexer): r""" Primary lexer for all IPython-like code. This is a simple helper lexer. If the first line of the text begins with "In \[[0-9]+\]:", then the entire text is parsed with an IPython console lexer. If not, then the entire text is parsed with an IPython lexer. The goal is to reduce the number of lexers that are registered with Pygments. """ name = 'IPy session' aliases = ['ipy'] def __init__(self, **options): """ Create a new IPyLexer instance which dispatch to either an IPythonCOnsoleLexer (if In prompts are present) or and IPythonLexer (if In prompts are not present). """ # init docstring is necessary for docs not to fail to build do to parent # docs referenceing a section in pygments docs. self.python3 = get_bool_opt(options, 'python3', False) if self.python3: self.aliases = ['ipy3'] else: self.aliases = ['ipy2', 'ipy'] Lexer.__init__(self, **options) self.IPythonLexer = IPythonLexer(**options) self.IPythonConsoleLexer = IPythonConsoleLexer(**options) def get_tokens_unprocessed(self, text): # Search for the input prompt anywhere...this allows code blocks to # begin with comments as well. if re.match(r'.*(In \[[0-9]+\]:)', text.strip(), re.DOTALL): lex = self.IPythonConsoleLexer else: lex = self.IPythonLexer for token in lex.get_tokens_unprocessed(text): yield token ipython-8.35.0/IPython/lib/pretty.py000066400000000000000000000744651477474304100173750ustar00rootroot00000000000000""" Python advanced pretty printer. This pretty printer is intended to replace the old `pprint` python module which does not allow developers to provide their own pretty print callbacks. This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`. Example Usage ------------- To directly print the representation of an object use `pprint`:: from pretty import pprint pprint(complex_object) To get a string of the output use `pretty`:: from pretty import pretty string = pretty(complex_object) Extending --------- The pretty library allows developers to add pretty printing rules for their own objects. This process is straightforward. All you have to do is to add a `_repr_pretty_` method to your object and call the methods on the pretty printer passed:: class MyObject(object): def _repr_pretty_(self, p, cycle): ... Here's an example for a class with a simple constructor:: class MySimpleObject: def __init__(self, a, b, *, c=None): self.a = a self.b = b self.c = c def _repr_pretty_(self, p, cycle): ctor = CallExpression.factory(self.__class__.__name__) if self.c is None: p.pretty(ctor(a, b)) else: p.pretty(ctor(a, b, c=c)) Here is an example implementation of a `_repr_pretty_` method for a list subclass:: class MyList(list): def _repr_pretty_(self, p, cycle): if cycle: p.text('MyList(...)') else: with p.group(8, 'MyList([', '])'): for idx, item in enumerate(self): if idx: p.text(',') p.breakable() p.pretty(item) The `cycle` parameter is `True` if pretty detected a cycle. You *have* to react to that or the result is an infinite loop. `p.text()` just adds non breaking text to the output, `p.breakable()` either adds a whitespace or breaks here. If you pass it an argument it's used instead of the default space. `p.pretty` prettyprints another object using the pretty print method. The first parameter to the `group` function specifies the extra indentation of the next line. In this example the next item will either be on the same line (if the items are short enough) or aligned with the right edge of the opening bracket of `MyList`. If you just want to indent something you can use the group function without open / close parameters. You can also use this code:: with p.indent(2): ... Inheritance diagram: .. inheritance-diagram:: IPython.lib.pretty :parts: 3 :copyright: 2007 by Armin Ronacher. Portions (c) 2009 by Robert Kern. :license: BSD License. """ from contextlib import contextmanager import datetime import os import re import sys import types from collections import deque from inspect import signature from io import StringIO from warnings import warn from IPython.utils.decorators import undoc from IPython.utils.py3compat import PYPY from typing import Dict __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter', 'for_type', 'for_type_by_name', 'RawText', 'RawStringLiteral', 'CallExpression'] MAX_SEQ_LENGTH = 1000 _re_pattern_type = type(re.compile('')) def _safe_getattr(obj, attr, default=None): """Safe version of getattr. Same as getattr, but will return ``default`` on any Exception, rather than raising. """ try: return getattr(obj, attr, default) except Exception: return default @undoc class CUnicodeIO(StringIO): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) warn(("CUnicodeIO is deprecated since IPython 6.0. " "Please use io.StringIO instead."), DeprecationWarning, stacklevel=2) def _sorted_for_pprint(items): """ Sort the given items for pretty printing. Since some predictable sorting is better than no sorting at all, we sort on the string representation if normal sorting fails. """ items = list(items) try: return sorted(items) except Exception: try: return sorted(items, key=str) except Exception: return items def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): """ Pretty print the object's representation. """ stream = StringIO() printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length=max_seq_length) printer.pretty(obj) printer.flush() return stream.getvalue() def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): """ Like `pretty` but print to stdout. """ printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length=max_seq_length) printer.pretty(obj) printer.flush() sys.stdout.write(newline) sys.stdout.flush() class _PrettyPrinterBase(object): @contextmanager def indent(self, indent): """with statement support for indenting/dedenting.""" self.indentation += indent try: yield finally: self.indentation -= indent @contextmanager def group(self, indent=0, open='', close=''): """like begin_group / end_group but for the with statement.""" self.begin_group(indent, open) try: yield finally: self.end_group(indent, close) class PrettyPrinter(_PrettyPrinterBase): """ Baseclass for the `RepresentationPrinter` prettyprinter that is used to generate pretty reprs of objects. Contrary to the `RepresentationPrinter` this printer knows nothing about the default pprinters or the `_repr_pretty_` callback method. """ def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): self.output = output self.max_width = max_width self.newline = newline self.max_seq_length = max_seq_length self.output_width = 0 self.buffer_width = 0 self.buffer = deque() root_group = Group(0) self.group_stack = [root_group] self.group_queue = GroupQueue(root_group) self.indentation = 0 def _break_one_group(self, group): while group.breakables: x = self.buffer.popleft() self.output_width = x.output(self.output, self.output_width) self.buffer_width -= x.width while self.buffer and isinstance(self.buffer[0], Text): x = self.buffer.popleft() self.output_width = x.output(self.output, self.output_width) self.buffer_width -= x.width def _break_outer_groups(self): while self.max_width < self.output_width + self.buffer_width: group = self.group_queue.deq() if not group: return self._break_one_group(group) def text(self, obj): """Add literal text to the output.""" width = len(obj) if self.buffer: text = self.buffer[-1] if not isinstance(text, Text): text = Text() self.buffer.append(text) text.add(obj, width) self.buffer_width += width self._break_outer_groups() else: self.output.write(obj) self.output_width += width def breakable(self, sep=' '): """ Add a breakable separator to the output. This does not mean that it will automatically break here. If no breaking on this position takes place the `sep` is inserted which default to one space. """ width = len(sep) group = self.group_stack[-1] if group.want_break: self.flush() self.output.write(self.newline) self.output.write(' ' * self.indentation) self.output_width = self.indentation self.buffer_width = 0 else: self.buffer.append(Breakable(sep, width, self)) self.buffer_width += width self._break_outer_groups() def break_(self): """ Explicitly insert a newline into the output, maintaining correct indentation. """ group = self.group_queue.deq() if group: self._break_one_group(group) self.flush() self.output.write(self.newline) self.output.write(' ' * self.indentation) self.output_width = self.indentation self.buffer_width = 0 def begin_group(self, indent=0, open=''): """ Begin a group. The first parameter specifies the indentation for the next line (usually the width of the opening text), the second the opening text. All parameters are optional. """ if open: self.text(open) group = Group(self.group_stack[-1].depth + 1) self.group_stack.append(group) self.group_queue.enq(group) self.indentation += indent def _enumerate(self, seq): """like enumerate, but with an upper limit on the number of items""" for idx, x in enumerate(seq): if self.max_seq_length and idx >= self.max_seq_length: self.text(',') self.breakable() self.text('...') return yield idx, x def end_group(self, dedent=0, close=''): """End a group. See `begin_group` for more details.""" self.indentation -= dedent group = self.group_stack.pop() if not group.breakables: self.group_queue.remove(group) if close: self.text(close) def flush(self): """Flush data that is left in the buffer.""" for data in self.buffer: self.output_width += data.output(self.output, self.output_width) self.buffer.clear() self.buffer_width = 0 def _get_mro(obj_class): """ Get a reasonable method resolution order of a class and its superclasses for both old-style and new-style classes. """ if not hasattr(obj_class, '__mro__'): # Old-style class. Mix in object to make a fake new-style class. try: obj_class = type(obj_class.__name__, (obj_class, object), {}) except TypeError: # Old-style extension type that does not descend from object. # FIXME: try to construct a more thorough MRO. mro = [obj_class] else: mro = obj_class.__mro__[1:-1] else: mro = obj_class.__mro__ return mro class RepresentationPrinter(PrettyPrinter): """ Special pretty printer that has a `pretty` method that calls the pretty printer for a python object. This class stores processing data on `self` so you must *never* use this class in a threaded environment. Always lock it or reinstanciate it. Instances also have a verbose flag callbacks can access to control their output. For example the default instance repr prints all attributes and methods that are not prefixed by an underscore if the printer is in verbose mode. """ def __init__(self, output, verbose=False, max_width=79, newline='\n', singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None, max_seq_length=MAX_SEQ_LENGTH): PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length) self.verbose = verbose self.stack = [] if singleton_pprinters is None: singleton_pprinters = _singleton_pprinters.copy() self.singleton_pprinters = singleton_pprinters if type_pprinters is None: type_pprinters = _type_pprinters.copy() self.type_pprinters = type_pprinters if deferred_pprinters is None: deferred_pprinters = _deferred_type_pprinters.copy() self.deferred_pprinters = deferred_pprinters def pretty(self, obj): """Pretty print the given object.""" obj_id = id(obj) cycle = obj_id in self.stack self.stack.append(obj_id) self.begin_group() try: obj_class = _safe_getattr(obj, '__class__', None) or type(obj) # First try to find registered singleton printers for the type. try: printer = self.singleton_pprinters[obj_id] except (TypeError, KeyError): pass else: return printer(obj, self, cycle) # Next walk the mro and check for either: # 1) a registered printer # 2) a _repr_pretty_ method for cls in _get_mro(obj_class): if cls in self.type_pprinters: # printer registered in self.type_pprinters return self.type_pprinters[cls](obj, self, cycle) else: # deferred printer printer = self._in_deferred_types(cls) if printer is not None: return printer(obj, self, cycle) else: # Finally look for special method names. # Some objects automatically create any requested # attribute. Try to ignore most of them by checking for # callability. if '_repr_pretty_' in cls.__dict__: meth = cls._repr_pretty_ if callable(meth): return meth(obj, self, cycle) if ( cls is not object # check if cls defines __repr__ and "__repr__" in cls.__dict__ # check if __repr__ is callable. # Note: we need to test getattr(cls, '__repr__') # instead of cls.__dict__['__repr__'] # in order to work with descriptors like partialmethod, and callable(_safe_getattr(cls, "__repr__", None)) ): return _repr_pprint(obj, self, cycle) return _default_pprint(obj, self, cycle) finally: self.end_group() self.stack.pop() def _in_deferred_types(self, cls): """ Check if the given class is specified in the deferred type registry. Returns the printer from the registry if it exists, and None if the class is not in the registry. Successful matches will be moved to the regular type registry for future use. """ mod = _safe_getattr(cls, '__module__', None) name = _safe_getattr(cls, '__name__', None) key = (mod, name) printer = None if key in self.deferred_pprinters: # Move the printer over to the regular registry. printer = self.deferred_pprinters.pop(key) self.type_pprinters[cls] = printer return printer class Printable(object): def output(self, stream, output_width): return output_width class Text(Printable): def __init__(self): self.objs = [] self.width = 0 def output(self, stream, output_width): for obj in self.objs: stream.write(obj) return output_width + self.width def add(self, obj, width): self.objs.append(obj) self.width += width class Breakable(Printable): def __init__(self, seq, width, pretty): self.obj = seq self.width = width self.pretty = pretty self.indentation = pretty.indentation self.group = pretty.group_stack[-1] self.group.breakables.append(self) def output(self, stream, output_width): self.group.breakables.popleft() if self.group.want_break: stream.write(self.pretty.newline) stream.write(' ' * self.indentation) return self.indentation if not self.group.breakables: self.pretty.group_queue.remove(self.group) stream.write(self.obj) return output_width + self.width class Group(Printable): def __init__(self, depth): self.depth = depth self.breakables = deque() self.want_break = False class GroupQueue(object): def __init__(self, *groups): self.queue = [] for group in groups: self.enq(group) def enq(self, group): depth = group.depth while depth > len(self.queue) - 1: self.queue.append([]) self.queue[depth].append(group) def deq(self): for stack in self.queue: for idx, group in enumerate(reversed(stack)): if group.breakables: del stack[idx] group.want_break = True return group for group in stack: group.want_break = True del stack[:] def remove(self, group): try: self.queue[group.depth].remove(group) except ValueError: pass class RawText: """ Object such that ``p.pretty(RawText(value))`` is the same as ``p.text(value)``. An example usage of this would be to show a list as binary numbers, using ``p.pretty([RawText(bin(i)) for i in integers])``. """ def __init__(self, value): self.value = value def _repr_pretty_(self, p, cycle): p.text(self.value) class CallExpression: """ Object which emits a line-wrapped call expression in the form `__name(*args, **kwargs)` """ def __init__(__self, __name, *args, **kwargs): # dunders are to avoid clashes with kwargs, as python's name managing # will kick in. self = __self self.name = __name self.args = args self.kwargs = kwargs @classmethod def factory(cls, name): def inner(*args, **kwargs): return cls(name, *args, **kwargs) return inner def _repr_pretty_(self, p, cycle): # dunders are to avoid clashes with kwargs, as python's name managing # will kick in. started = False def new_item(): nonlocal started if started: p.text(",") p.breakable() started = True prefix = self.name + "(" with p.group(len(prefix), prefix, ")"): for arg in self.args: new_item() p.pretty(arg) for arg_name, arg in self.kwargs.items(): new_item() arg_prefix = arg_name + "=" with p.group(len(arg_prefix), arg_prefix): p.pretty(arg) class RawStringLiteral: """ Wrapper that shows a string with a `r` prefix """ def __init__(self, value): self.value = value def _repr_pretty_(self, p, cycle): base_repr = repr(self.value) if base_repr[:1] in 'uU': base_repr = base_repr[1:] prefix = 'ur' else: prefix = 'r' base_repr = prefix + base_repr.replace('\\\\', '\\') p.text(base_repr) def _default_pprint(obj, p, cycle): """ The default print function. Used if an object does not provide one and it's none of the builtin objects. """ klass = _safe_getattr(obj, '__class__', None) or type(obj) if _safe_getattr(klass, '__repr__', None) is not object.__repr__: # A user-provided repr. Find newlines and replace them with p.break_() _repr_pprint(obj, p, cycle) return p.begin_group(1, '<') p.pretty(klass) p.text(' at 0x%x' % id(obj)) if cycle: p.text(' ...') elif p.verbose: first = True for key in dir(obj): if not key.startswith('_'): try: value = getattr(obj, key) except AttributeError: continue if isinstance(value, types.MethodType): continue if not first: p.text(',') p.breakable() p.text(key) p.text('=') step = len(key) + 1 p.indentation += step p.pretty(value) p.indentation -= step first = False p.end_group(1, '>') def _seq_pprinter_factory(start, end): """ Factory that returns a pprint function useful for sequences. Used by the default pprint for tuples and lists. """ def inner(obj, p, cycle): if cycle: return p.text(start + '...' + end) step = len(start) p.begin_group(step, start) for idx, x in p._enumerate(obj): if idx: p.text(',') p.breakable() p.pretty(x) if len(obj) == 1 and isinstance(obj, tuple): # Special case for 1-item tuples. p.text(',') p.end_group(step, end) return inner def _set_pprinter_factory(start, end): """ Factory that returns a pprint function useful for sets and frozensets. """ def inner(obj, p, cycle): if cycle: return p.text(start + '...' + end) if len(obj) == 0: # Special case. p.text(type(obj).__name__ + '()') else: step = len(start) p.begin_group(step, start) # Like dictionary keys, we will try to sort the items if there aren't too many if not (p.max_seq_length and len(obj) >= p.max_seq_length): items = _sorted_for_pprint(obj) else: items = obj for idx, x in p._enumerate(items): if idx: p.text(',') p.breakable() p.pretty(x) p.end_group(step, end) return inner def _dict_pprinter_factory(start, end): """ Factory that returns a pprint function used by the default pprint of dicts and dict proxies. """ def inner(obj, p, cycle): if cycle: return p.text('{...}') step = len(start) p.begin_group(step, start) keys = obj.keys() for idx, key in p._enumerate(keys): if idx: p.text(',') p.breakable() p.pretty(key) p.text(': ') p.pretty(obj[key]) p.end_group(step, end) return inner def _super_pprint(obj, p, cycle): """The pprint for the super type.""" p.begin_group(8, '') class _ReFlags: def __init__(self, value): self.value = value def _repr_pretty_(self, p, cycle): done_one = False for flag in ( "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "UNICODE", "VERBOSE", "DEBUG", ): if self.value & getattr(re, flag): if done_one: p.text('|') p.text('re.' + flag) done_one = True def _re_pattern_pprint(obj, p, cycle): """The pprint function for regular expression patterns.""" re_compile = CallExpression.factory('re.compile') if obj.flags: p.pretty(re_compile(RawStringLiteral(obj.pattern), _ReFlags(obj.flags))) else: p.pretty(re_compile(RawStringLiteral(obj.pattern))) def _types_simplenamespace_pprint(obj, p, cycle): """The pprint function for types.SimpleNamespace.""" namespace = CallExpression.factory('namespace') if cycle: p.pretty(namespace(RawText("..."))) else: p.pretty(namespace(**obj.__dict__)) def _type_pprint(obj, p, cycle): """The pprint for classes and types.""" # Heap allocated types might not have the module attribute, # and others may set it to None. # Checks for a __repr__ override in the metaclass. Can't compare the # type(obj).__repr__ directly because in PyPy the representation function # inherited from type isn't the same type.__repr__ if [m for m in _get_mro(type(obj)) if "__repr__" in vars(m)][:1] != [type]: _repr_pprint(obj, p, cycle) return mod = _safe_getattr(obj, '__module__', None) try: name = obj.__qualname__ if not isinstance(name, str): # This can happen if the type implements __qualname__ as a property # or other descriptor in Python 2. raise Exception("Try __name__") except Exception: name = obj.__name__ if not isinstance(name, str): name = '' if mod in (None, '__builtin__', 'builtins', 'exceptions'): p.text(name) else: p.text(mod + '.' + name) def _repr_pprint(obj, p, cycle): """A pprint that just redirects to the normal repr function.""" # Find newlines and replace them with p.break_() output = repr(obj) lines = output.splitlines() with p.group(): for idx, output_line in enumerate(lines): if idx: p.break_() p.text(output_line) def _function_pprint(obj, p, cycle): """Base pprint for all functions and builtin functions.""" name = _safe_getattr(obj, '__qualname__', obj.__name__) mod = obj.__module__ if mod and mod not in ('__builtin__', 'builtins', 'exceptions'): name = mod + '.' + name try: func_def = name + str(signature(obj)) except ValueError: func_def = name p.text('' % func_def) def _exception_pprint(obj, p, cycle): """Base pprint for all exceptions.""" name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__) if obj.__class__.__module__ not in ('exceptions', 'builtins'): name = '%s.%s' % (obj.__class__.__module__, name) p.pretty(CallExpression(name, *getattr(obj, 'args', ()))) #: the exception base _exception_base: type try: _exception_base = BaseException except NameError: _exception_base = Exception #: printers for builtin types _type_pprinters = { int: _repr_pprint, float: _repr_pprint, str: _repr_pprint, tuple: _seq_pprinter_factory('(', ')'), list: _seq_pprinter_factory('[', ']'), dict: _dict_pprinter_factory('{', '}'), set: _set_pprinter_factory('{', '}'), frozenset: _set_pprinter_factory('frozenset({', '})'), super: _super_pprint, _re_pattern_type: _re_pattern_pprint, type: _type_pprint, types.FunctionType: _function_pprint, types.BuiltinFunctionType: _function_pprint, types.MethodType: _repr_pprint, types.SimpleNamespace: _types_simplenamespace_pprint, datetime.datetime: _repr_pprint, datetime.timedelta: _repr_pprint, _exception_base: _exception_pprint } # render os.environ like a dict _env_type = type(os.environ) # future-proof in case os.environ becomes a plain dict? if _env_type is not dict: _type_pprinters[_env_type] = _dict_pprinter_factory('environ{', '}') _type_pprinters[types.MappingProxyType] = _dict_pprinter_factory("mappingproxy({", "})") _type_pprinters[slice] = _repr_pprint _type_pprinters[range] = _repr_pprint _type_pprinters[bytes] = _repr_pprint #: printers for types specified by name _deferred_type_pprinters: Dict = {} def for_type(typ, func): """ Add a pretty printer for a given type. """ oldfunc = _type_pprinters.get(typ, None) if func is not None: # To support easy restoration of old pprinters, we need to ignore Nones. _type_pprinters[typ] = func return oldfunc def for_type_by_name(type_module, type_name, func): """ Add a pretty printer for a type specified by the module and name of a type rather than the type object itself. """ key = (type_module, type_name) oldfunc = _deferred_type_pprinters.get(key, None) if func is not None: # To support easy restoration of old pprinters, we need to ignore Nones. _deferred_type_pprinters[key] = func return oldfunc #: printers for the default singletons _singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis, NotImplemented]), _repr_pprint) def _defaultdict_pprint(obj, p, cycle): cls_ctor = CallExpression.factory(obj.__class__.__name__) if cycle: p.pretty(cls_ctor(RawText("..."))) else: p.pretty(cls_ctor(obj.default_factory, dict(obj))) def _ordereddict_pprint(obj, p, cycle): cls_ctor = CallExpression.factory(obj.__class__.__name__) if cycle: p.pretty(cls_ctor(RawText("..."))) elif len(obj): p.pretty(cls_ctor(list(obj.items()))) else: p.pretty(cls_ctor()) def _deque_pprint(obj, p, cycle): cls_ctor = CallExpression.factory(obj.__class__.__name__) if cycle: p.pretty(cls_ctor(RawText("..."))) elif obj.maxlen is not None: p.pretty(cls_ctor(list(obj), maxlen=obj.maxlen)) else: p.pretty(cls_ctor(list(obj))) def _counter_pprint(obj, p, cycle): cls_ctor = CallExpression.factory(obj.__class__.__name__) if cycle: p.pretty(cls_ctor(RawText("..."))) elif len(obj): p.pretty(cls_ctor(dict(obj.most_common()))) else: p.pretty(cls_ctor()) def _userlist_pprint(obj, p, cycle): cls_ctor = CallExpression.factory(obj.__class__.__name__) if cycle: p.pretty(cls_ctor(RawText("..."))) else: p.pretty(cls_ctor(obj.data)) for_type_by_name('collections', 'defaultdict', _defaultdict_pprint) for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint) for_type_by_name('collections', 'deque', _deque_pprint) for_type_by_name('collections', 'Counter', _counter_pprint) for_type_by_name("collections", "UserList", _userlist_pprint) if __name__ == '__main__': from random import randrange class Foo(object): def __init__(self): self.foo = 1 self.bar = re.compile(r'\s+') self.blub = dict.fromkeys(range(30), randrange(1, 40)) self.hehe = 23424.234234 self.list = ["blub", "blah", self] def get_foo(self): print("foo") pprint(Foo(), verbose=True) ipython-8.35.0/IPython/lib/tests/000077500000000000000000000000001477474304100166165ustar00rootroot00000000000000ipython-8.35.0/IPython/lib/tests/__init__.py000066400000000000000000000000001477474304100207150ustar00rootroot00000000000000ipython-8.35.0/IPython/lib/tests/test.wav000066400000000000000000001261601477474304100203220ustar00rootroot00000000000000RIFFhWAVEfmt DXdataD Hc!%#*.3]7;?CGKOCSVEZ]`cfi&lnpsuvx&z}{|}y~D~}|{zyrwusqIolEjgda~^5[WDTPLHE@<8=4/d+&M"T T NEס3ɎZ<6Jw(S = zmЇBބ / :%ށĂ׃։ԍtݣ=[޹ Aƍ\k]X aq#' ,04B9|=AEI{M9QT]X[_%b$egjCmoqtuwTyz|} ~~YZ~}z|H{y`xvtrp:nkiHfWcD`]Y@VRN(K>G;C ?:6N2-f)$C = 8s7:ަ թCǯÅrwϯ&.ᡶʘ pO+3iˀZ_Ҁr?8^.׈̎,ӛݞ XƨSų%zXtr-t8 x-} %).26$;T?nCpGYK&ORlVY7]k`}clf6ikYnprtvtxyX{|}c~S~}}{zAywusqo$mjgda^[2XT QKMpI{EmAH= 94[0+e'"7%g W"r2ܤ$ӴV -v[bޔU󏹍mȃԁ72ǁT几̏,_1'A|٦Uﭧzhp jX$FU @"'+0t48=(A7E.I MPqTW_[^adgfjlgoqsuw'yz{}}~Kp~}|m{zxvuspnlcifc`n]ZVSeOKGC?k;'72e.)a% )| L <|b,ڤ+m+=@YBɌʊIȅsJN~ۀeT€]%:rjԐEݕ|`髑U4.@hç^Z݌5`#p1 Q$)-2_6:>BFJNmRV}Y\`%cfhknmprtvDxy2{g|p}M~~a~~/}|zmywv'trommj-hUeYb:_[XUwQMIEA=9=50l,'[#h 1l!dU)ا6ʈO,!.VwԠߗ+72,Ղ0? +Ȅ)kLVfܙϜt8GŎV^ߛH{? Ka"&+/3G8<@DHL_PTWZG^qawdZgjl"olqsuUwxsz{|}~<(~}|{>zxw>u@sqnQlifd`]~ZWSO L'H)D@;7O3.o*%R!S PLI߲)֮Dȧx_^whn]p4(x򅘄jhp#KI _ӆq;.JH&(L$Ǿ)yPe]\  cn$(-15*:`>BFuJINRUYv\_behBkm*pbrrtXvxy {F|T}6~~rn~/~L}=|{yxIvatPrpm-k~heb_Z\XUQ*NUJfF]B=>:5^1,p(#G;~ 4p6?ݮ+ԸU¥Ųbݧw2 1y|8+cƆT CH$sps7FvʰhNos/w< z-y! &* /t37 <6@KDGH*LOS+WZ]a dgifln*qQsNu"wxIz{|}~,7~}|{gzxGwvu|sYqoljBg^dWa-^ZuWSAP{LHD@c<#83j/*m&!:#d T!t8ۭ1j$ּӸeϩXʟřQБvD<\|) B5݂7@ JAК͝1uNBNr¬ZN{"I X ?#(,1a59=BFJMQ4UX\T_rbmeDhjmo#r7t"vwzyz$|8}~~e{~F~i}^|'{y7x~vtrZpmykhe c_\aYUNRNJFB>:;61r-(h$+} I9ze4ٯ:˃F 5r˫C٤idǕ0yYb|0WRh߀US~ԅVڊیVϓo4,[\& !NđPRމ5d't 4O %*.2J7;?CGKO3SV7Z]`cfzilnpsuvx zx{|}v~G~}|{zyywusqSolPjgda^C[WSTPLIEA<8P4/w+&a"h -hbX2״FɠlNGZѭ7a'HuׇH䄬0 9"ہ҃zΉˍjztϣ/Kܵ͹ֽ.zIXIC M]"' ,0409j=AEIkM)QTOX[^begj9moqsuwMyz|}~~W ]~}|M{ygxvtrpEnkiTfdcQ`]YOVRO9KOGLC2?;6a2-y)$W Q MKN޹3ռU×߯5<Ğ֘zȈ!T07l̀\]πn;4Y'ψÎ ǛОIDgE`^`$ dj %).r26;B?]C_GHKOR]VY)]^`pc_f*ikOnprtvmxyR{|}`~ U~~}{zGywusqo.mjg e b^[AXTQ[MIE~AY=94n0+x'"K:{ 0l6Eܷ7iƽ̵̀=MN)dœLҌҊO΅yOQ݀gSZ!5jaʐ;ҕpuQګE$.WÕKFx!L\ >{$)-1M6:>BFJN]RUoY\`c fhkncprtv=xy-{c|l}J~~}c~~4} |ztywv/trowmj9haefbG_\X%UQMIFA=9O50,'o#,| E6xh<ػIʚa>2?f#Ě7A92ق3A *~Ä#cCMڑ[Йœןfީt(5|CҿK߇4g+w 6M!&+|/358t<@DHLPPSWZ:^cajdNg jlobqs~uMwxmz{|}~:*~}|{DzxwFuHs!qn[lifd a]ZWSOL7H:D%@;7b3.*%f!g )d`\nBvFeJ9NQU Yh\_beh7km pYritPv xy{A|P}2~~pp~3~P}A|{yxQvjtZr!pm8kheb_h\ YUQ:NeJwFoBO>:5q1-(#[P  IJS>h¶ղq짅?=񒆐A&3k̆ZFJ#r퀖lo~/ =|izv noU;[_c( fe!%*.a37;$@9D6HLOSWZ]adfi[ln!qHsFuwxCz{|}~*:~}|{mzxNw~uscqol jNgkdda:^ZWSPPLHD@u<683}/+&!N7x ,h6LD}6)uީfןœљ\ڑNDd#Ä~* @3ق18@6Ú#e>1=`™HϺ;gw5D {+n#'~,0N59=AFIMQ%UX\G_ebae8hjwmor/tvwsyz|3}~~c}~J~m}c|-{y>xvtrdpnkh fc`\pYU^RNJFB>:N61-)|$? ]M"yGL˖X/%F۫Q礞vpҕ;ːbj6!ZSf݀QOx΅OҊҌLœd(NL<=Ѷ>u!O` ; t%)w.287|;?CGKtO$SV(Z{]`cfnilnp suvxzr{|}s~I~}|{z!ywusq]ol[jgda^R[WcTPLI'EA<8c4/+'t"-| A}3vlEYɲ~_XkF˦o4&T"Ï~އN鄰ā18 ׁ̓ sƉ_错ng <˵Žh6ӶD5k/z 8J"w'+m049X=}AEIZMQT@X[^ b egj.moqsuwGyz{}~~U `~}|S{ynxvtrpOnk+i`fqc^`*]Y^VROIK`G^CC?;6s2.)%k e %a_aFhèEJўǛ!ÎЈ(Y4;oπ]\̀k7/T!Ȉz՘Þ;4ޯT̻2ոMJL PV $x)-`26;1?KCNG8KORNVY]P`ccSfikDnprtvfxyM{|}]~ W~~}|zNywusqo9mjgeb^[OXT*QkMIEAk=1940,'"_N  DJYJ{/׽͹ݵL/Уt{jˍΉz҃ہ#9 0GׇuH&`6ЭYFMkEγ1׾Wag, g`"&v+/O48<AE ILPRTWC[^adgOjlSoqsuywyz{|}~Fv~}|x{ zxvuspnlzifc`]7ZV4SOKGC?;K72.*% P5u (e6SQ̒O! ']\,5pГWیڊVԅ~SU߀hRW0|󆕈bXx0ƕchؤB˫q4 EÂ9Ю3d y8H {*g$(q-1:6:>BFJNNRU`Y\_ cehykmZprt~v7xy'{^|h}F~~{e~~8}%|zzyw#v8t$romjEhnesbU_\X5UQMJFB=9b51,(#@ Y J#|P[ʭsOCOv1ΝКBK @7݂5B )|\;DvϑPęɟWΩeҸռ#i0Ҭ7s Sc "9!l&*i/3"8b<@DHzL@PStWZ,^Va^dBgjl oYq|svuFwxgz{|}~7,~}|{Jzx"wOuQs+qnflig!da]Z,WSO+LHHLD7@ <7u3 /*&z!.{ >x0upOiě˰wG7sps$HC SƆc+8{x0 1vܧaIJT˷*ԭ>5n3} :F#o(,]15:<>\BeFTJ)NQ~UXZ\_be~h,kmpPratIvxy{<|L}/~~nr~6~U}F| {yxXvrtcr*pmCkheb_v\YURJNvJFBa>+:51-( $od !]^fQz*Ⱦ¶%M(&HK.;rӆ_ IK#p뀓hjw'3p]mgv]^wCͭ'ֱHKO QQ!%n*.N37;@(D&H LOS W}Z]`dfiPlnq?s>uwx=z{|}~(<~}|{szxUwuslq"oljZgxdqaH^ZWT`PLHD@:`62-)$R2 q$a6[_˨iA/5V`}ݕFՐjr;%]€Ueۀ}MJsȅHɊɌBX@<*l*ѣ+a {;K {( `%)d.2&7j;?CGKdOSVZm]`cfcilnpsuvxzm{|}p~K~}}{z'ywusqgolgjgda^`[WrTP M/I8E)A=8u40+'"A VG%Ykŏqi{U٦}B(2`,͏Tǁ37ԁȃmUޔaZu,屻 Uʳ#ӣ1q!Vf $6"d'+Z04 9G=lAzEoIJM QT1X[^adgj#moqsuw@yz{}}~Sd~}|X{yuxvtrpYnk6ilf~cl`8]YmVR'OYKqGoCU?%;62.)%~ /y :u.suY{&úƳTǨY ޞԛ,͎׈._9?rҀ_Zˀh3+Oo ɘ-%ίvqB̨ե96r7 <B $e)-M26:?:C=G'KNR?VY ]C`WcGfik:nprtv_xyG{z|}Z~Y~ ~}|zTywutqoDmjg%e&b_[^XT:Q|MIEA}=C940!,'#rb Y^l]ΎA ޹\>ޣuԍ։׃Ăށ%; / ބAЇly < R'wI6;Y2ΠתCM S RL"&c+/<48<@EHLPCTW4[}^adgDjlIoqsuqwyz{|}~Dy~}|}{&zxvuspn&lifc`]FZVCSOKGC?;^73.$*%!dI BFJN>RURY\_behnkmPprtvv0xy!{Y|d}C~~yg~"~<})|zyw+v@t-romkPhzebc_#\XDUQMJ#FB=9t51,$(#T0 n ^7cn ˿ƅaT`Ȯ'@۝ݚMU G=8C (zT3;lőE언IU״ļWɱҙ$ۼ_ ~>O {%!Y&*V/38PKBTFCJNQoUXK\_berh!km pGrXtAvwyz7|H},~~lt~9~Y}K|{yx`v{tlr4pmNkheb_\(YURZNJFBs>=:51(-($/x 6q+rzdύ<پʺӶ4 [53TT7CyچeLL"n逐dep *~dP_X꬚fMMe0͚֞47v: =>!%[*.<37;@DHKOoSVoZ]`cfiElnq6s6u wx7z{|}~%>~}|{yzy]wusvq,ol$jfgd~aV^ [WTpPLHD@-Ђ&*ً-җŠh骈E=u"ϓؤ@N W SG#'X,0)5w9=AEIMfQUX[,_KbHe!hjbmort vwfyz|+}~~_~P~u}l|8{yLxvtrwpnkh$f2c`\YV}RNJ G C>:s62-.)$ fG 9vJnr ̺{R@FfoQߐsz@)`ĀVc؀zJEn…B8M2񨀬,ٷֻZȰѐڭNg's7 g M%)Q.27X;?CGKUOSV Z_]`cfWikwnprtvx zg{|}m~M~}}{z.ywusqqomrjgda^n[XTPM@IIE:A=84%0+-'"U- j[9l~!šze見O5>l7׏[ʁ46сÃfJӔUMhձCʡӏܸ] BR z""Q'+G0485=ZAiE^I:MPT"X[^adgjmoqsuw:yz{ }}~Qg~}|^{z{xvtrpdnkBixfcy`E]Y|VR7OjKGCg?7;62..))% C  NB)mЍ8˿׳c֨g8%֎߈5d=CuԀ`YȀe/&Idӡe_r/̕ Ւ%o"^#l (/ $R)-:26: ?)C,GKNR0VY\5`Jc;fik0nprtvYxyB{u||}V~[~ ~#} |z[ywutqoNmj h1e3b_[mXTIQMIEA=U9504,'##.v 2m)rpΠT'kͪM죬 ݍɋމ܃ɂ(< .؄;ɇdp0 Df8%*G{΍ ח09z> >9"&P+/*4|8<@DHLP4TW&[o^ad|g9jl?oqsujw yz{|}~B!|~}|{,zxv'u&spn1lifc`]TZVSSOKGC?;p73.8*%!x] Q^zwͷsE-.H|ά=ʥxG8Mkdᅉ]]k OQ&p憇RGejJNt$R!^ǯЈ ٞBFJxN.RUCY\_behckmFp}rtnv)xy{T|`}@~~xi~%~@}.|zyw2vIt6rom k\hebp_2\XSUQM%J4F+B >95(1,8(#hD 5sKvӁ Ɨreqخ6N XȒ_NC;D 'x{M+2b::EǴEɞ ҆ۨKj*w: g!E&*C/37>qn|li g:d1a^ZJWSPLLjHnDZ@/<733/*5&!V) fY;uя5Ŀ8.آ֖1Z*$F }xw&E=HT %gђbZC室s/ˑԆݴ\ F U y#H(,8159>9BCF3J NQ`UX=\|_befhkmp>rPt9vwyz3|D}(~~kv~=~]}P|{y#xhvtur>pmYkheb_\7YU!RjNJFB>P:61;-(0$C J@,xПOۺDhC@`]@Kk!ON!m怍`aj tXCR֥I۬U<b;ehjWmoqtvw`yz|'}~~]T~y}q|={ySxvtrp'nkh0f?c*`\Y#VRN KGC>:6+2-B)$ z[ M^ށԅ ǍdQWv ~ǡ[鐞|E#,cǀWbրwFAh;刹ގ-A$spȷŻڿHȝ}ڙ:S_# S 9%)>.27F;v?CGxKEORVYQ]`cfLiklnprtvxzb{|}i~O~} }{z4ywusq{om}jgda^|[XTP,MPIZELA&=8480+@'"iA ~1pM ӑ3ųȱt]BKwɔAa΁55́`򇯉ߏ@ǔuI@Zq ű0ʎ| ܤIl.{> f"='+5048#=IAXENI*MPTXz[^adg{jmzoqsuw3yz{ }}~Oj~}|c{zxvtrpnnkNifc`S]YVRGOzKGCx?I;72A.)=% W & bV=ڀѠK ݿȻʷsu&C/CGKNR!VY\(`=c.fhk%nprtvRxy<{p|x}S~]~~'}|zaywvtroYmjh=e@b _[|XTYQMIEA=h950H,'6#B F>/؃ϳf. 7{ܪ[ȗ$ҋ$!͂+= -ӄ5‡z\g{%6 V(6iű zփn$f* q*%"&=+/4i8<@DHL}P%TW[a^adpg-jl5o}qsucwy~z{|}~@#~}|{2zxw/u/sqn>XݬK٥TEYu!k煎aam!MN!j߆J>\^>AfBغLǜu؋)BFJhNRU4Y\_behWkm95;1,K(#"|X I_݊Ԕ2Ʃ„vE\cӒi& VI>F&w􀠁w| E")Y/Ֆ֢,6谶2Ɍrڔ7Uc& S!2&*0/37,a^ZYWS#P\L{HDk@A<83F/*I&!j> {-mNۉ ҡHɴH<械(B2F"JMQQUX/\n_beZh kmo4rGt1vwyz.|?}%~~ix~@~a}U|{y*xpvt~rHpmdkheb_\EYU1RzNJFB>b:61N-(C$W "^T@ًвa$T'vPLlgHSq'RO k䀊\\ci䓅K6Evȥ:ˬzE+*BpĴ tw ߯ZN Zu!%4*.3m7;?CGKOPSVRZ]`cfi/lnp%s%uvx+z{|}|~!B~}|{z ykwusq@ol:j~gdaq^([W6TPLHD@<8-4/S+&<"B B}<3 א"~J-';iF 2reʇ<ل . <(Ȃۃ݉ȋ܍~ J˪i$QƝm}o&j. s+#'1,05R9=AEIMGQTkX[_1b/e hjMmoq tuwYyz |"} ~~[W~}}v|C{yZxvtrp1nk i=fLc8`]Y2VRNK/G,C?:6=2-U)$2 +o &a%r(ޕ՘2ǟubh!աf󐨎J'0fɀY`ԀtBC GJN{RVY\`0c"fhknvprtvKxy7{l|t}P~~_~~,}|zgyw vt rocmj"hJeMb._[X UiQMIEA=z9,50[,'J#V ZRCؖ%x?Gj Ƞԗ!.ڋ+'т-> ,̈́.rS^pڜ(F$WşgpZQ ]r"&*+/4W8<@DHLnPTW [T^|addg"jl+otqsu[wxxz{|}~>&~}|{8zx w7u8sqnGlifc`]qZWrSOKHD@;7?3.^*%A!A >y:7ߡ֝3ȗhPOhZ祔bRf+!r텓feo"LKdنxB6SR13Y2жǺ־9NJawo(n2 u+$(%-15;:p>BFJWNRU&Y\_behLkm3pjryt_vxy{J|X}9~~tm~,~I}8|zyxBvZtHrpm#ktheb_N\XqUQNFJVFNB->95N1,^(#6)l "]$s.ݝԧEƺ•TЧj%&oݒs0$]O AG%u򀜁tw= O$ɖȢ&ذ y_ځ$AO ?!&*/37t:+61a-(W$k 7s'hS"ٞ)s6'd5̤]Yx'pQ[w, UPiဆYWم\ _ٓy?*8h+j50^ġacޛFv9 Fa!%!*.3[7;?CGKOASVCZ]`cfi%lnpsuvx%z|{|}y~E~}|{zyswusqJolFjgda^7[WFTPLHE@<8?4/f+&O"V V PG!ף5ɐ\>8Kyí*T>{nчB߄ / :%ށĂփՉӍsܣ8^-ֈˎ*қܞVĨQij#xVrp*r6 v+{ %).26";R?lCnGWK%ORjVY5]j`|cjf5ikXnprtvsxyW{|}c~ S~}}{zAywusqo%mjgeb^[4XT QMMrI|EoAI=94]0+g'"9(i Z$t4ܦ&ӶX .x\cV􏺍nɃՁ72ƁS䇟ˏ+^0&?{צSygn hU|"DR >"'+0r48<&A5E,I MPoTW^[^adgejlfoqsuw&yz{}}~Jp~}|n{zxvuspnleifc`o]ZVSgOKGC?m;)72g.)d% +N >~e.ڦ-o->BZCʌˊIɅtKN~ۀeT€]$:qiӐDܕ{^諏S3,>gå\W݊3^!n/ O$)-2]6:>BFJNkRV|Y\ `#cfhknlprtvDxy1{g|p}M~~a~~0}|znywv(tronmj.hVeZb;_[XUyQMIEA=9?50n,']#j 3o$fW+ت8ʊQ.#0Wyՠ,82-Ղ0? +Ȅ(jKUe ۙ͜s멂6EŌT\ߙFy= H^!&+/3E8<@DHL^PTWZF^oavdXgjl!okqsuTwxrz{|}~<(~}|{>zxw?uAsqnRlif d`]ZWSO L(H+D@;7Q3.q*%T!U R NKߴ+ְFȩza`yio_r5)x󅙄kip#KH ^҆q:-IG$&K~"㲿ž'wNc[Z al$(-15(:^>}BFsJGNRUYt\_behAkm)parqtWvxy {F|T}6~~ro~0~M}=|{yxJvbtQrpm.kheb_\\XUQ,NWJgF_B?> :5`1,r(#I> 6r8Aݰ-ԺW§Dzdާx32z}9,ddžTDH$sps6EuȰ} fLmq-u: x+v! &* /r37<4@IDEH(LOS*WZ]adgieln)qPsMu!wxIz{|}~,8~}|{hzxGwwu}sZqoljDg`dXa.^ZvWSBP}LHD@e<%83l/*o&!<%f V$v:ۯ3l&ؼԸgѩY˟ƙRёwE<]|) B5݂7? I@Κ̝/sM@LpªXLy G V =#(,1_59=BFJMQ2UX\S_qbleChjmo"r6t"vwyyz$|7}~~e|~G~i}_|({y8xvtr[pmzkhf c_\cYUPRNJFB>:=61t-(j$- K;|g6ٱ<˅H7tͫDۤjeȕ2zZc}1WRh߀US}ӅUيڌUΓn3*ZZ$ LďNPއ3a%r 2M %*.2H7;?CGKO1SV5Z]`cfyilnpsuvxzw{|}v~G~}|{zyzwusqTolQjgda^E[WUTPLIEA<8R4/y+&c"j /j!dZ4׶HɢnPI\ҭ9b(Jv؇H䄬0 9"ځуy͉ʍh󔣗yrΣ-Jڵ˹Խ,xGVF}A K["' ,~04.9h=AEIiM(QTMX[^begj7moqsuwMyz|}~~W ]~}|N{ygxvtrpFnk iUfecR`]YPVR O:KQGNC4?;6c2-{)$Y  S OMP޼5վWØ7=Şט|Ɉ"U08l̀\]πn:3Y'ΈŽśϞHB쯳eC^\^" bg $).p26;A?[C]GFKOR[VY']\`oc^f)ikMnprtvmxyR{|}`~ U~~}{zHywusqo0mjg e b^[BXTQ]MIEA[=!94p0+{'"M<~ 2n8Gܹ9kǽε>"ãipaÍljt ΃؁ 81ÁM݇| R$2mȦDޭhV\{UBis0y> x*q"'+/`48<A$EILP`TWO[^adgYjl\oqsuwyz{|}~Hs~}|s{zxvu spnlpifc`}]*ZV&SwOKGC?;;72z.*w% ?#c S$xAڹ@̂?NP *eƓNӌӊPυyOR݀gSZ!5i`ɐ9ЕntOثC",UÓIпDvJ Z ;y$)-1K6:>BFJN\RUmY\`c fhknbprtv=xy,{b|l}I~~}c~~4} |ztywv0troymj:hcegbI_ \X'UQMIFA=9Q50,(q#.~ G8zj>ؽKʜc@4@h %ÝŚ8B:2ڂ3A *}„"cCL~ّZϙ՟ dܩr&3zAҽI߅2e)u 4K!~&+z/338r<@DHLNPSWZ8^baidLg jloaqs}uMwxlz{|}~9*~}|{DzxwGuIs"qn]lifd a]ZWSOL9HXɻċrq x|k~> 0omr$IFYˆi2$@𒂕;=oӲe;ԾPGE  LX#(,n15:L>lBtFcJ7NQU Yf\_beh6kmpXrhtOv xy{A|P}2~~pq~3~Q}B|{yxRvkt[r"pm9kheb_j\ YUQ:5s1-(#] R KLU@j¸ײsA>󒇐B'4k͆ZFJ#r퀖ln}. <{hytlnS;9Y]a& cc!%*._37;"@8D5HLOSWZ]adfiZln qGsEuwxCz{|}~*:~}|{nzxOwusdqoljPgldea<^ZWSRPLHD@w<783/ +&!P:z .j8NF8+whٟĜҙ]ۑNEe$Ą~* @2ق18?5šߠ!c:P61- )~$A _O%{IN˘Y1&GܫS餟wrӕ<̐ck6"ZSf݀QNxͅNъьKÓb'L J :};ѴX[^ b egj-moqsuwFyz{}~~U a~}|S{ynxvtrpPnk,iafrc``+]Y_VROKKbG`CE?;6u2 .)%m h 'cacHjêFLҞɛ"ĎЈ(Z4;oЀ]\̀k7/S LjyԘ:3ݯR̹0նJHI NT $v)-^26:/?JCLG6KORLVY]O`bcRfikCnprtvfxyL{~|}]~ W~~}|zNywusqo:mjgeb^[QXT,QmMIEAm=3940,'"aP  GL[L}1ٽϹߵN1ѣv|k̍ω{Ӄہ#9 0 GևtG $_5έWEKiCα/׼U_e* d^"&t+/M48<AE ILPQTWA[^adgNjlRoqsuxwyz{|}~Fw~}|x{!zxvuspnl|ifc`]9ZV6SOKGC?;M72.*% R7w *g8US̔Q# )^ ^. 6qѓX܌ۊWՅTVhQW0{򆔈aWw/ŕbgפ@ɫo3 CÀ7Ь1b w6F y'e$(o-196:>BFJNLRU_Y\_ cehwkmYprt}v6xy&{]|h}F~~{e~~8}%|z{yw$v9t%romjFhoetbW_\X6UQMJF B=9d51,(#B \L&~R]ʯuQEQx3НҚCL A8ނ6B )|[:CuΑOÙȟVͩcиӼ!g.Ҫ5qQa 7!j&*g/3 8`<@DHxL>PSrWZ*^Ua\d@gjl oXq{suuEwxfz{|}~7-~}|{Jzx#wPuRs,qngli g"da]Z.WSO-LJHMD8@ <7w3/*&|!0} @{2wrQkĝ̰xH8tqt%HC Sņb*7zw/ /uڧ_òR˵(ԫ<3l1{ 8D#m(,[15::>ZBcFRJ'NQ|UXX\_be|h+kmpOr`tHvxy{<|L}/~~nr~6~U}G| {yxYvstdr+pmDkheb_x\YURLNxJFBc>-:51-( $qf #_`iS|,ʾĶ&O*(JL/s=uwx=z{|}~'<~}|{tzxVwusmq#olj\gydsaJ^ZW TbPLHD@:b62-)$U5 t&d8]a˪kB17Xb~ߕG֐ks;%]€Ueڀ}MJrDžHɊȌAW>:(j(ѡ)ھ_ y9I y% ^%)b.2$7h;?CGKcOSVZl]`cfbilnpsuvxzl{|}o~K~}}{z(ywusqiolhjgda^a[WtTPM1I:E+A=8w40+'"D X I'[mőrk}Wۦ~C*3a.ΏUǁ37ԁǃlSݔ`Xt*䱹Sʱ!ӡ/oTd "4"b'+X04 9E=jAxEmIHMQT0X[^adgj"moqsuw@yz{}}~Sd~}|Y{yuxvtrp[nk8infcm`9]YnVR)O[KsGqCW?';62.)% 1| <x0uw[}(üȳVȨZ ՛-Ύ؈/_9?rҀ_Zʀh3*NnȘߡ+#ͯto@̦գ74p5~ :@ $c)-K26:?8CBFJN9C (zS2:kđD떶GSմ¼Uɯҗ"ۺ] |<L y#!W&*T/38Nwx`z{|}~5/~}|{Pzx*wXu[s5qnrlig/d%a]ZIBRFBJNQmUXJ\_beqh km pFrXt@vwyz7|G}+~~lt~:~Y}L|{yxav|tmr5pmOkheb_\*YUR\NJFBt>?:51*-($1z 8s.u|gϏ>۾̺ն6 \74VU8DzچfLL"n耐dep(}bN^V謘dKKc.֛͘25t8 ;~}|{yzy]wuswq-ol%jhgdaW^ [WTrPLHD@<\8 4//+&"xb W`ulͤ\) K,ޜs𑔏aVt0τ, >-Ђ%)؋,їĠf窇C ;s ϑآ>L U QD#'U,0'5u9=AEIMeQUX[*_JbGehjamort vwfyz|*}~~_~Q~u}m|8{yMxvtrxpnkh&f3c`\YVRNJG C>:u62-0)$ hI ;xLpt̼}TBHhqRt{@)`ŀVc؀zIEmA6K0~*׷ԻXȮюڪKe%q5 e K%)O.27V;?CGKSOSV Z^]`cfVikvnprtvx zg{|}l~M~}}{z.ywusqsomsjgda^p[ XTPMAIKECuԀaYȀe/&Icѡc^q-̓ Ր#m \!j &, $P)-826: ?'C+GKNR.VY\4`Hc9fik.nprtvXxyA{u||}V~[~~#} |z[ywutqoOmj h2e5b_[nXTKQMIEA=W9 506,'%#0x 4o,trϢV)mϪN ލʋ߉݃ɂ(< .؄:ȇco/ Ce6#(Fy΋ה.6x< <6"&N+/(4z8<@DHLP2TW%[n^ad{g7jl>oqsuiw yz{|}~B!}~}|{-zxv(u'spn2lifc`]VZVUSOKGC?;r73.:*%!z` S`|y͹uG//I~Ϭ>̥yH:Oleᅉ]]l OQ%o円QFdiILr#P\ǭІ ٜ:N Y Q>$(I-16]:>BFJvN-RUBY\_behakmEp|rtnv(xy{T|`}?~~wi~&~A}/|zyw3vJt7romk]hebr_3\XUUQM'J6F-B >95*1,:(#jF 7uM xӃ"ƙtgrٮ7O Yɒ`OD;E 'x{L*1a9ߖ8DŴCɜ҄ۦIg(u8 e!C&*A/37<8BAF1JNQ^UX<\z_beehkmp=rOt8vwyz2|C}(~~jv~=~]}Q|{y#xivtvr?pmZkheb_\8YU#RlNJFB>R:61=-(2$E LB.zСQݺFjDAb^ALl"ON!m怌``isVBQեG٬T::RͅՈl!`$ l'(!%F*.'3}7;?DHKO^SV_Z]`cfi9lnq,s-uwx1z{|}~#@~}|{zyewusq7ol0jtgdae^[W)TPLHD@{ySxvtrp(nkh2f@c,`\Y%VRN K GC?:6-2-D)$ |] O`ރԇ"ǏfSYx ɡ\ꐟ}F#-cǀXbրwE@h:䈸ݎ,@#qoƷûؿFț{ڗ8Q] Q 7%)<.26D;t?CGvKCORVYP]`cfJikknprtvxza{|}i~O~} }{z5ywusq}om~jgda^~[XTP.MRI\ENA(=84:0+C'"kC 3rO܁ӓ5ŵʱu^CLyʔBᏨb΁54́_񇮉ޏ?ƔtG?Yp ı.ʌzܢGj,y; d ";'+3048!=GAVELI(MPTXy[^adgzj myoqsuw2yz{}}~Nj~}|d{ zxvtrponkOifc`U]ZVRIO|KGCz?K;72C.)?% Y ( dX? ڂ ѢM ߿ɻ̷ tw(D0Ꮉ=jBGx׀bWƀb+!D yX񕰘ázrRL_̀|ޯY G U u $<)-&26:>CGKNRVY\'`BFJfNRU3Y\_behVkm;psrtfv!xy{O|\}<~~uk~)~E}4|zyw;vRt@rpmkiheb_A\XdUQ N7JGF>B>95=1,M(#$~Z Ka݌ Ԗ4ƪ†xG§^eԒj'VI>F&v􀟁w| D!(X.ӖԢ*4水0Ɋpڒ5Sa$ Q!0&*./37*碲=e4-O}y' D:AL\ŒU J2Ӯl`m|qݞFm/}> c #3(,#159>&B0F JMQOUX.\m_beYh kmo3rGt0vwyz-|?}$~~hx~A~a}U|{y*xqvtrIpmekheb_\GYU3R|NJFB>d:61P-(F$Y %`VBٍдc&V(xQMnhITr' RO k〉\[߅bh㓄J5Ctƥ9ʬxC)(@nIJ ru ߬X K Xs!%2*.3k7;?CGKOOSVPZ]`cfi.lnp$s$uvx+z{|}|~ C~}|{zylwusqAol"D D>5ג$ɀL/)=kH4sfˇ=ڄ . ;'Ȃۃ܉Njۍ|Iɪg#Oƛk{l$h, q)#'/,05P9=AEIMEQTiX[_0b.ehjKmoq tuwYyz |"} ~~[W~}}v|C{yZxvtrp2nk i>fMc9`]Y4VRNK1G-C?:6?2-W)$4 -q (c't+ޗ՚4ǡwdiï"֡gK'1fɀY`ӀtBMcImE_A:=84L0+V'"'W  Hc"ܕӦHڱ lPX֔M돲hăс63ɁYꇦԏ4h;2K`v}ygێ3Ve' P"('+ 048=5AEE;IMP}TXj[^adgojmooqsuw,yz{}}~Lm~}|i{zxvtrpynkZifc`c]ZV SYOKGC?];72V.)R% m < y,lSڕѵ_ۻݷ06P:ŒÊCąoGK{ـdVĀ_(>xqܐN敤kbB;MwõmiݛEp3A a $))-2n6:>C GJNyRVY\`/c!fhknuprtvJxy6{k|t}P~~_~~,}|zhyw v t roemj$hKeOb/_[X UkQMIEA=|9.50],'L# X !\TEؘ'zA!Il ɠ֗"/ۋ,'҂.> ,̈́.qR]oٜ'E"UŝemXO Zp"&(+/4U8<@DHLlPTW[R^{adcg!jl*osqsu[wxwz{|}~=&~}|{9zx w8u9sqnHlifc`]sZWsSOKHD@;7A3.`*%C!C @|<9ߣ֟5șjQQj\饕cSg,"r텔feo"LKd؆wA5RQ02W0ζźվ7Lj_um&l0 s)}$(#-159:n>BFJVNRU$Y\_behKkm2pirxt^vxy{J|X}9~~tm~-~I}9|zyxCv[tIrpm$kuheb_O\XsUQNHJXFPB/>95P1,`(#8,n $`&u0ݟԩGƼ—Vѧl''pޒt1%^O AG%u򀜁sw=N#ȖƢ%ְw]!?L =!&*/37t)vwyz(|;}!~~fz~D~e}Z|#{y1xxvtrSpmqkhec_\VYUBRNJFB>v:-61c-(Y$m 9u)jV%٠+u8(f7Τ^Zz(qR\w, UQiဆXWم[ ^ؓx>(6f*h3.\ğ_aޙDt7 D_!%*.3Y7;?CGKO?SVBZ]`cfi#lnpsuvx%z|{|}y~E~}|{zyswusqLolGjgda^8[WGTPLIE@<8A4/h+&Q" X XRI#ץ7ɒ^@:M{ĭ+V?|o҇C߄ / :%ށÂփԉҍr~ڣ:Xڹ=ƉXgXS ]m #',04>9x=AEIwM6QTZX[_#b!egjAmoqtuwRyz|} ~~Y[~}{|I{yaxvtrp=nkiJfZcF`]YCVRN,KBG?C$?:6R2-j)$G A =x;>ު$խGdzÉuzӯ)1䡹̘ rˆP,4iˀ[^рq>7]-Ոʎ)ћ۞UèP³!vTpn(p4 t)y %).26 ;P?jClGUK#ORiVY4]h`zcif3ikWnprtvsxyW{|}c~ S~~}{zBywusqo&mjgeb^[5XTQNMsI~EpAK=94_0+i'";*k  \&w6ܨ(ӸZ0y]eWnɃՁ72ƁS㇟ʏ*]/%>yզQ쭣wel fSz BP <"'+ 0p48<$A4E*IMPnTW\[^adgdjleoqsuw%yz{}}~Jq~}|n{zxvuspnlfifc`q]ZVSiOKGC?o;+72i.)f% -Q @g0ڨ/q/ @C[Dˌ̊JʅtKN~ۀeT€\$9phҐCڕz\櫍Q1*BFJNiRVzY\ `"cfhknkprtvCxy1{f|p}L~~~a~~0}|zoywv)troomj0hXe\b=_[XUzQMIEA=9A50p,'_#m 5q&hY-ج:ʌS0$2Yzנ.93-ւ1@ +DŽ(iJTd ڙ̜q驀5CŊRZߖDw; F\!&+/3C8<@DHL\PTWZD^natdWgjlojqsuSwxqz{|}~;(~}|{?zxw@uBsqnSlif d`]ZWSOL*H-D@;7S3.s*%W! W T QM߶-ֲHȫ|cb{kp`s6 *y􅙄kip#KH ^цp9,HE#%I| Ჾþ%uLaYW ^i$(-15&:\>{BFrJFNQUYs\_beh@km(p`rptVvxy {E|S}5~~ro~0~M}>|{yxKvctRrpm/kheb_]\YUQ-NXJiFaBA> :5b1,t(#L@ 9t:Dݲ/ԼY ©ɲ ez53{~:-edžUDH$sor5Ds ư{} dJko+s8 u)t! &*/p37<2@GDDH'LOS(WZ]adgicln(qOsLu wxHz{|}~,8~}|{hzxHwxu~s[qoljEgadZa0^ZxWSDPLHD@g<'83n/*q&!>(h X&x<۱5n'ڼָiө[͟ǙSґxF=^|) A5܂6>H?͚˝.rK>Kn¨VJwET ;}# (,0]59=BFIMQ1UX\Q_objeAhjmo!r6t!vwxyz#|7}~~d|~G~i}_|({y8xvtr\pn|khfc_\dYURRNJFB>:?61v-(m$/ M=~i8ٳ>ˇI!9uϫFܤkgɕ3Ð{[d}1XRh߀TR}ӅTipython-8.35.0/IPython/lib/tests/test_backgroundjobs.py000066400000000000000000000052121477474304100232240ustar00rootroot00000000000000"""Tests for pylab tools module. """ #----------------------------------------------------------------------------- # Copyright (c) 2011, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- # Stdlib imports import time # Our own imports from IPython.lib import backgroundjobs as bg #----------------------------------------------------------------------------- # Globals and constants #----------------------------------------------------------------------------- t_short = 0.0001 # very short interval to wait on jobs #----------------------------------------------------------------------------- # Local utilities #----------------------------------------------------------------------------- def sleeper(interval=t_short, *a, **kw): args = dict(interval=interval, other_args=a, kw_args=kw) time.sleep(interval) return args def crasher(interval=t_short, *a, **kw): time.sleep(interval) raise Exception("Dead job with interval %s" % interval) #----------------------------------------------------------------------------- # Classes and functions #----------------------------------------------------------------------------- def test_result(): """Test job submission and result retrieval""" jobs = bg.BackgroundJobManager() j = jobs.new(sleeper) j.join() assert j.result["interval"] == t_short def test_flush(): """Test job control""" jobs = bg.BackgroundJobManager() j = jobs.new(sleeper) j.join() assert len(jobs.completed) == 1 assert len(jobs.dead) == 0 jobs.flush() assert len(jobs.completed) == 0 def test_dead(): """Test control of dead jobs""" jobs = bg.BackgroundJobManager() j = jobs.new(crasher) j.join() assert len(jobs.completed) == 0 assert len(jobs.dead) == 1 jobs.flush() assert len(jobs.dead) == 0 def test_longer(): """Test control of longer-running jobs""" jobs = bg.BackgroundJobManager() # Sleep for long enough for the following two checks to still report the # job as running, but not so long that it makes the test suite noticeably # slower. j = jobs.new(sleeper, 0.1) assert len(jobs.running) == 1 assert len(jobs.completed) == 0 j.join() assert len(jobs.running) == 0 assert len(jobs.completed) == 1 ipython-8.35.0/IPython/lib/tests/test_clipboard.py000066400000000000000000000011661477474304100221720ustar00rootroot00000000000000from IPython.core.error import TryNext from IPython.lib.clipboard import ClipboardEmpty from IPython.testing.decorators import skip_if_no_x11 @skip_if_no_x11 def test_clipboard_get(): # Smoketest for clipboard access - we can't easily guarantee that the # clipboard is accessible and has something on it, but this tries to # exercise the relevant code anyway. try: a = get_ipython().hooks.clipboard_get() except ClipboardEmpty: # Nothing in clipboard to get pass except TryNext: # No clipboard access API available pass else: assert isinstance(a, str) ipython-8.35.0/IPython/lib/tests/test_deepreload.py000066400000000000000000000034761477474304100223450ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Test suite for the deepreload module.""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import types from pathlib import Path import pytest from tempfile import TemporaryDirectory from IPython.lib.deepreload import modules_reloading from IPython.lib.deepreload import reload as dreload from IPython.utils.syspathcontext import prepended_to_syspath def test_deepreload(): "Test that dreload does deep reloads and skips excluded modules." with TemporaryDirectory() as tmpdir: with prepended_to_syspath(tmpdir): tmpdirpath = Path(tmpdir) with open(tmpdirpath / "A.py", "w", encoding="utf-8") as f: f.write("class Object:\n pass\nok = True\n") with open(tmpdirpath / "B.py", "w", encoding="utf-8") as f: f.write("import A\nassert A.ok, 'we are fine'\n") import A import B # Test that A is not reloaded. obj = A.Object() dreload(B, exclude=["A"]) assert isinstance(obj, A.Object) is True # Test that an import failure will not blow-up us. A.ok = False with pytest.raises(AssertionError, match="we are fine"): dreload(B, exclude=["A"]) assert len(modules_reloading) == 0 assert not A.ok # Test that A is reloaded. obj = A.Object() A.ok = False dreload(B) assert A.ok assert isinstance(obj, A.Object) is False def test_not_module(): pytest.raises(TypeError, dreload, "modulename") def test_not_in_sys_modules(): fake_module = types.ModuleType("fake_module") with pytest.raises(ImportError, match="not in sys.modules"): dreload(fake_module) ipython-8.35.0/IPython/lib/tests/test_display.py000066400000000000000000000221411477474304100216740ustar00rootroot00000000000000"""Tests for IPython.lib.display. """ #----------------------------------------------------------------------------- # Copyright (c) 2012, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- from tempfile import NamedTemporaryFile, mkdtemp from os.path import split, join as pjoin, dirname import pathlib from unittest import TestCase, mock import struct import wave from io import BytesIO # Third-party imports import pytest try: import numpy except ImportError: pass # Our own imports from IPython.lib import display from IPython.testing.decorators import skipif_not_numpy #----------------------------------------------------------------------------- # Classes and functions #----------------------------------------------------------------------------- #-------------------------- # FileLink tests #-------------------------- def test_instantiation_FileLink(): """FileLink: Test class can be instantiated""" fl = display.FileLink('example.txt') # TODO: remove if when only Python >= 3.6 is supported fl = display.FileLink(pathlib.PurePath('example.txt')) def test_warning_on_non_existent_path_FileLink(): """FileLink: Calling _repr_html_ on non-existent files returns a warning""" fl = display.FileLink("example.txt") assert fl._repr_html_().startswith("Path (example.txt)") def test_existing_path_FileLink(): """FileLink: Calling _repr_html_ functions as expected on existing filepath """ tf = NamedTemporaryFile() fl = display.FileLink(tf.name) actual = fl._repr_html_() expected = "%s
" % (tf.name, tf.name) assert actual == expected def test_existing_path_FileLink_repr(): """FileLink: Calling repr() functions as expected on existing filepath """ tf = NamedTemporaryFile() fl = display.FileLink(tf.name) actual = repr(fl) expected = tf.name assert actual == expected def test_error_on_directory_to_FileLink(): """FileLink: Raises error when passed directory """ td = mkdtemp() pytest.raises(ValueError, display.FileLink, td) #-------------------------- # FileLinks tests #-------------------------- def test_instantiation_FileLinks(): """FileLinks: Test class can be instantiated """ fls = display.FileLinks('example') def test_warning_on_non_existent_path_FileLinks(): """FileLinks: Calling _repr_html_ on non-existent files returns a warning""" fls = display.FileLinks("example") assert fls._repr_html_().startswith("Path (example)") def test_existing_path_FileLinks(): """FileLinks: Calling _repr_html_ functions as expected on existing dir """ td = mkdtemp() tf1 = NamedTemporaryFile(dir=td) tf2 = NamedTemporaryFile(dir=td) fl = display.FileLinks(td) actual = fl._repr_html_() actual = actual.split('\n') actual.sort() # the links should always have forward slashes, even on windows, so replace # backslashes with forward slashes here expected = ["%s/
" % td, "  %s
" %\ (tf2.name.replace("\\","/"),split(tf2.name)[1]), "  %s
" %\ (tf1.name.replace("\\","/"),split(tf1.name)[1])] expected.sort() # We compare the sorted list of links here as that's more reliable assert actual == expected def test_existing_path_FileLinks_alt_formatter(): """FileLinks: Calling _repr_html_ functions as expected w/ an alt formatter """ td = mkdtemp() tf1 = NamedTemporaryFile(dir=td) tf2 = NamedTemporaryFile(dir=td) def fake_formatter(dirname,fnames,included_suffixes): return ["hello","world"] fl = display.FileLinks(td,notebook_display_formatter=fake_formatter) actual = fl._repr_html_() actual = actual.split('\n') actual.sort() expected = ["hello","world"] expected.sort() # We compare the sorted list of links here as that's more reliable assert actual == expected def test_existing_path_FileLinks_repr(): """FileLinks: Calling repr() functions as expected on existing directory """ td = mkdtemp() tf1 = NamedTemporaryFile(dir=td) tf2 = NamedTemporaryFile(dir=td) fl = display.FileLinks(td) actual = repr(fl) actual = actual.split('\n') actual.sort() expected = ['%s/' % td, ' %s' % split(tf1.name)[1],' %s' % split(tf2.name)[1]] expected.sort() # We compare the sorted list of links here as that's more reliable assert actual == expected def test_existing_path_FileLinks_repr_alt_formatter(): """FileLinks: Calling repr() functions as expected w/ alt formatter """ td = mkdtemp() tf1 = NamedTemporaryFile(dir=td) tf2 = NamedTemporaryFile(dir=td) def fake_formatter(dirname,fnames,included_suffixes): return ["hello","world"] fl = display.FileLinks(td,terminal_display_formatter=fake_formatter) actual = repr(fl) actual = actual.split('\n') actual.sort() expected = ["hello","world"] expected.sort() # We compare the sorted list of links here as that's more reliable assert actual == expected def test_error_on_file_to_FileLinks(): """FileLinks: Raises error when passed file """ td = mkdtemp() tf1 = NamedTemporaryFile(dir=td) pytest.raises(ValueError, display.FileLinks, tf1.name) def test_recursive_FileLinks(): """FileLinks: Does not recurse when recursive=False """ td = mkdtemp() tf = NamedTemporaryFile(dir=td) subtd = mkdtemp(dir=td) subtf = NamedTemporaryFile(dir=subtd) fl = display.FileLinks(td) actual = str(fl) actual = actual.split('\n') assert len(actual) == 4, actual fl = display.FileLinks(td, recursive=False) actual = str(fl) actual = actual.split('\n') assert len(actual) == 2, actual def test_audio_from_file(): path = pjoin(dirname(__file__), 'test.wav') display.Audio(filename=path) class TestAudioDataWithNumpy(TestCase): @skipif_not_numpy def test_audio_from_numpy_array(self): test_tone = get_test_tone() audio = display.Audio(test_tone, rate=44100) assert len(read_wav(audio.data)) == len(test_tone) @skipif_not_numpy def test_audio_from_list(self): test_tone = get_test_tone() audio = display.Audio(list(test_tone), rate=44100) assert len(read_wav(audio.data)) == len(test_tone) @skipif_not_numpy def test_audio_from_numpy_array_without_rate_raises(self): self.assertRaises(ValueError, display.Audio, get_test_tone()) @skipif_not_numpy def test_audio_data_normalization(self): expected_max_value = numpy.iinfo(numpy.int16).max for scale in [1, 0.5, 2]: audio = display.Audio(get_test_tone(scale), rate=44100) actual_max_value = numpy.max(numpy.abs(read_wav(audio.data))) assert actual_max_value == expected_max_value @skipif_not_numpy def test_audio_data_without_normalization(self): max_int16 = numpy.iinfo(numpy.int16).max for scale in [1, 0.5, 0.2]: test_tone = get_test_tone(scale) test_tone_max_abs = numpy.max(numpy.abs(test_tone)) expected_max_value = int(max_int16 * test_tone_max_abs) audio = display.Audio(test_tone, rate=44100, normalize=False) actual_max_value = numpy.max(numpy.abs(read_wav(audio.data))) assert actual_max_value == expected_max_value def test_audio_data_without_normalization_raises_for_invalid_data(self): self.assertRaises( ValueError, lambda: display.Audio([1.001], rate=44100, normalize=False)) self.assertRaises( ValueError, lambda: display.Audio([-1.001], rate=44100, normalize=False)) def simulate_numpy_not_installed(): try: import numpy return mock.patch('numpy.array', mock.MagicMock(side_effect=ImportError)) except ModuleNotFoundError: return lambda x:x @simulate_numpy_not_installed() class TestAudioDataWithoutNumpy(TestAudioDataWithNumpy): # All tests from `TestAudioDataWithNumpy` are inherited. @skipif_not_numpy def test_audio_raises_for_nested_list(self): stereo_signal = [list(get_test_tone())] * 2 self.assertRaises(TypeError, lambda: display.Audio(stereo_signal, rate=44100)) @skipif_not_numpy def get_test_tone(scale=1): return numpy.sin(2 * numpy.pi * 440 * numpy.linspace(0, 1, 44100)) * scale def read_wav(data): with wave.open(BytesIO(data)) as wave_file: wave_data = wave_file.readframes(wave_file.getnframes()) num_samples = wave_file.getnframes() * wave_file.getnchannels() return struct.unpack('<%sh' % num_samples, wave_data) def test_code_from_file(): c = display.Code(filename=__file__) assert c._repr_html_().startswith('

In [34]: from scipy.special import jn

In [35]: x = linspace(0,4*pi)

In [36]: for i in range(6):

    ...: plot(x,jn(i,x))

In [37]: 1/0

---------------------------------------------------------------------------

ZeroDivisionError Traceback (most recent call last)

/Users/minrk/<ipython-input-37-05c9758a9c21> in <module>()

----> 1 1/0

ZeroDivisionError: integer division or modulo by zero

In [38]:

ipython-8.35.0/docs/source/interactive/figs/jn.xhtml000066400000000000000000000710501477474304100225010ustar00rootroot00000000000000

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29)

Type "copyright", "credits" or "license" for more information.

IPython 0.11.alpha1.git -- An enhanced Interactive Python.

? -> Introduction and overview of IPython's features.

%quickref -> Quick reference.

help -> Python's own help system.

object? -> Details about 'object', use 'object??' for extra details.

%guiref -> A brief reference about the graphical user interface.

In [1]: from scipy.special import jn

In [2]: x = linspace(0,4*pi)

In [3]: for n in range(6):

   ...: plot(x,jn(n,x))

   ...:

In [4]:

ipython-8.35.0/docs/source/interactive/index.rst000066400000000000000000000014561477474304100217300ustar00rootroot00000000000000======== Tutorial ======== This section of IPython documentation will walk you through most of the IPython functionality. You do not need to have any deep knowledge of Python to read this tutorial, though some sections might make slightly more sense if you have already done some work in the classic Python REPL. .. note:: Some part of this documentation are more than a decade old so might be out of date, we welcome any report of inaccuracy, and Pull Requests that make that up to date. .. toctree:: :maxdepth: 2 :hidden: tutorial plotting reference shell autoawait tips python-ipython-diff magics .. seealso:: `A Qt Console for Jupyter `__ `The Jupyter Notebook `__ ipython-8.35.0/docs/source/interactive/magics.rst000066400000000000000000000016541477474304100220640ustar00rootroot00000000000000======================= Built-in magic commands ======================= .. note:: To Jupyter users: Magics are specific to and provided by the IPython kernel. Whether Magics are available on a kernel is a decision that is made by the kernel developer on a per-kernel basis. To work properly, Magics must use a syntax element which is not valid in the underlying language. For example, the IPython kernel uses the `%` syntax element for Magics as `%` is not a valid unary operator in Python. However, `%` might have meaning in other languages. Here is the help auto-generated from the docstrings of all the available Magics functions that IPython ships with. You can create and register your own Magics with IPython. You can find many user defined Magics on `PyPI `_. Feel free to publish your own and use the ``Framework :: IPython`` trove classifier. .. include:: magics-generated.txt ipython-8.35.0/docs/source/interactive/plotting.rst000066400000000000000000000067211477474304100224610ustar00rootroot00000000000000.. _plotting: Rich Outputs ------------ One of the main feature of IPython when used as a kernel is its ability to show rich output. This means that object that can be representing as image, sounds, animation, (etc...) can be shown this way if the frontend support it. In order for this to be possible, you need to use the ``display()`` function, that should be available by default on IPython 5.4+ and 6.1+, or that you can import with ``from IPython.display import display``. Then use ``display()`` instead of ``print()``, and if possible your object will be displayed with a richer representation. In the terminal of course, there won't be much difference as object are most of the time represented by text, but in notebook and similar interface you will get richer outputs. .. _matplotlib_magic: Plotting -------- .. note:: Starting with IPython 5.0 and matplotlib 2.0 you can avoid the use of IPython's specific magic and use ``matplotlib.pyplot.ion()``/``matplotlib.pyplot.ioff()`` which have the advantages of working outside of IPython as well. One major feature of the IPython kernel is the ability to display plots that are the output of running code cells. The IPython kernel is designed to work seamlessly with the matplotlib_ plotting library to provide this functionality. To set this up, before any plotting or import of matplotlib is performed you may execute the ``%matplotlib`` :ref:`magic command `. This performs the necessary behind-the-scenes setup for IPython to work correctly hand in hand with ``matplotlib``; it does *not*, however, actually execute any Python ``import`` commands, that is, no names are added to the namespace. If you do not use the ``%matplotlib`` magic or you call it without an argument, the output of a plotting command is displayed using the default ``matplotlib`` backend, which may be different depending on Operating System and whether running within Jupyter or not. Alternatively, the backend can be explicitly requested using, for example:: %matplotlib gtk The argument passed to the ``%matplotlib`` magic command may be the name of any backend understood by ``matplotlib`` or it may the name of a GUI loop such as ``qt`` or ``osx``, in which case an appropriate backend supporting that GUI loop will be selected. To obtain a full list of all backends and GUI loops understood by ``matplotlib`` use ``%matplotlib --list``. There are some specific backends that are used in the Jupyter ecosystem: - The ``inline`` backend is provided by IPython and can be used in Jupyter Lab, Notebook and QtConsole; it is the default backend when using Jupyter. The outputs of plotting commands are displayed *inline* within frontends like Jupyter Notebook, directly below the code cells that produced them. The resulting plots will then also be stored in the notebook document. - The ``notebook`` or ``nbagg`` backend is built into ``matplotlib`` and can be used with Jupyter ``notebook <7`` and ``nbclassic``. Plots are interactive so they can be zoomed and panned. - The ``ipympl`` or ``widget`` backend is for use with Jupyter ``lab`` and ``notebook >=7``. It is in a separate ``ipympl`` module that must be installed using ``pip`` or ``conda`` in the usual manner. Plots are interactive so they can be zoomed and panned. .. seealso:: `Plotting with Matplotlib`_ example notebook See the matplotlib_ documentation for more information, in particular the section on backends. .. include:: ../links.txt ipython-8.35.0/docs/source/interactive/python-ipython-diff.rst000066400000000000000000000147451477474304100245450ustar00rootroot00000000000000================= Python vs IPython ================= This document is meant to highlight the main differences between the Python language and what are the specific constructs you can do only in IPython. Unless expressed otherwise all of the constructs you will see here will raise a ``SyntaxError`` if run in a pure Python shell, or if executing in a Python script. Each of these features is described more in detail in the further parts of the documentation. Quick overview: =============== All the following constructs are valid IPython syntax: .. code-block:: ipython In [1]: ? .. code-block:: ipython In [1]: ?object .. code-block:: ipython In [1]: object? .. code-block:: ipython In [1]: *pattern*? .. code-block:: ipython In [1]: %shell like --syntax .. code-block:: ipython In [1]: !ls .. code-block:: ipython In [1]: my_files = !ls ~/ In [1]: for i, file in enumerate(my_files): ...: raw = !echo $file ...: !echo {file[0].upper()} $raw .. code-block:: ipython In [1]: %%perl magic --function ...: @months = ("July", "August", "September"); ...: print $months[0]; Each of these constructs is compiled by IPython into valid python code and will do most of the time what you expect it will do. Let's see each of these examples in more detail. Accessing help ============== As IPython is mostly an interactive shell, the question mark is a simple shortcut to get help. A question mark alone will bring up the IPython help: .. code-block:: ipython In [1]: ? IPython -- An enhanced Interactive Python ========================================= IPython offers a combination of convenient shell features, special commands and a history mechanism for both input (command history) and output (results caching, similar to Mathematica). It is intended to be a fully compatible replacement for the standard Python interpreter, while offering vastly improved functionality and flexibility. At your system command line, type 'ipython -h' to see the command line options available. This document only describes interactive features. MAIN FEATURES ------------- ... A single question mark before or after an object available in the current namespace will show help relative to this object: .. code-block:: ipython In [6]: object? Docstring: The most base type Type: type A double question mark will try to pull out more information about the object, and if possible display the python source code of this object. .. code-block:: ipython In[1]: import collections In[2]: collections.Counter?? Init signature: collections.Counter(*args, **kwds) Source: class Counter(dict): '''Dict subclass for counting hashable items. Sometimes called a bag or multiset. Elements are stored as dictionary keys and their counts are stored as dictionary values. >>> c = Counter('abcdeabcdabcaba') # count elements from a string >>> c.most_common(3) # three most common elements [('a', 5), ('b', 4), ('c', 3)] >>> sorted(c) # list all unique elements ['a', 'b', 'c', 'd', 'e'] >>> ''.join(sorted(c.elements())) # list elements with repetitions 'aaaaabbbbcccdde' ... If you are looking for an object, the use of wildcards ``*`` in conjunction with a question mark will allow you to search the current namespace for objects with matching names: .. code-block:: ipython In [24]: *int*? FloatingPointError int print Shell Assignment ================ When doing interactive computing it is a common need to access the underlying shell. This is doable through the use of the exclamation mark ``!`` (or bang). This allows to execute simple commands when present in beginning of the line: .. code-block:: ipython In[1]: !pwd /User/home/ Change directory: .. code-block:: ipython In[1]: !cd /var/etc Or edit file: .. code-block:: ipython In[1]: !mvim myfile.txt The line after the bang can call any program installed in the underlying shell, and support variable expansion in the form of ``$variable`` or ``{variable}``. The later form of expansion supports arbitrary python expressions: .. code-block:: ipython In[1]: file = 'myfile.txt' In[2]: !mv $file {file.upper()} The bang (``!``) can also be present on the right hand side of an assignment, just after the equal sign, or separated from it by a white space. In this case the standard output of the command after the bang will be split out into lines in a list-like object and assigned to the left hand side. This allows you, for example, to put the list of files of the current working directory in a variable: .. code-block:: ipython In[1]: my_files = !ls You can combine the different possibilities in for loops, conditions, functions...: .. code-block:: ipython my_files = !ls ~/ for i, file in enumerate(my_files): raw = !echo $backup $file !cp $file {file.split('.')[0] + '.bak'} Magics ------ Magic functions (magics) are often present in the form of shell-like syntax, but they are python functions under the hood. The syntax and assignment possibilities are similar to the one with the bang (``!``) syntax, but with more flexibility and power. Magic functions start with a percent sign (``%``) or double percent signs (``%%``). A magic call with a single percent sign will act only on one line: .. code-block:: ipython In[1]: %xmode Exception reporting mode: Verbose Magics support assignment: .. code-block:: ipython In [1]: results = %timeit -r1 -n1 -o list(range(1000)) 62.1 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each) In [2]: results Magics with double percent signs (``%%``) can spread over multiple lines, but they do not support assignments: .. code-block:: ipython In[1]: %%bash ... : echo "My shell is:" $SHELL ... : echo "My disk usage is:" ... : df -h My shell is: /usr/local/bin/bash My disk usage is: Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1 233Gi 216Gi 16Gi 94% 56788108 4190706 93% / devfs 190Ki 190Ki 0Bi 100% 656 0 100% /dev map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /hom ipython-8.35.0/docs/source/interactive/reference.rst000066400000000000000000001123301477474304100225510ustar00rootroot00000000000000================= IPython reference ================= .. _command_line_options: Command-line usage ================== You start IPython with the command:: $ ipython [options] files If invoked with no options, it executes the file and exits, passing the remaining arguments to the script, just as if you had specified the same command with python. You may need to specify `--` before args to be passed to the script, to prevent IPython from attempting to parse them. If you add the ``-i`` flag, it drops you into the interpreter while still acknowledging any options you may have set in your ``ipython_config.py``. This behavior is different from standard Python, which when called as python ``-i`` will only execute one file and ignore your configuration setup. Please note that some of the configuration options are not available at the command line, simply because they are not practical here. Look into your configuration files for details on those. There are separate configuration files for each profile, and the files look like :file:`ipython_config.py` or :file:`ipython_config_{frontendname}.py`. Profile directories look like :file:`profile_{profilename}` and are typically installed in the :envvar:`IPYTHONDIR` directory, which defaults to :file:`$HOME/.ipython`. For Windows users, :envvar:`HOME` resolves to :file:`C:\\Users\\{YourUserName}` in most instances. Command-line Options -------------------- To see the options IPython accepts, use ``ipython --help`` (and you probably should run the output through a pager such as ``ipython --help | less`` for more convenient reading). This shows all the options that have a single-word alias to control them, but IPython lets you configure all of its objects from the command-line by passing the full class name and a corresponding value; type ``ipython --help-all`` to see this full list. For example:: $ ipython --help-all <...snip...> --matplotlib= (InteractiveShellApp.matplotlib) Default: None Choices: ['auto', 'gtk3', 'gtk4', 'inline', 'nbagg', 'notebook', 'osx', 'qt', 'qt5', 'qt6', 'tk', 'wx'] Configure matplotlib for interactive use with the default matplotlib backend. <...snip...> Indicate that the following:: $ ipython --matplotlib qt is equivalent to:: $ ipython --InteractiveShellApp.matplotlib='qt' Note that in the second form, you *must* use the equal sign, as the expression is evaluated as an actual Python assignment. While in the above example the short form is more convenient, only the most common options have a short form, while any configurable variable in IPython can be set at the command-line by using the long form. This long form is the same syntax used in the configuration files, if you want to set these options permanently. Interactive use =============== IPython is meant to work as a drop-in replacement for the standard interactive interpreter. As such, any code which is valid python should execute normally under IPython (cases where this is not true should be reported as bugs). It does, however, offer many features which are not available at a standard python prompt. What follows is a list of these. Caution for Windows users ------------------------- Windows, unfortunately, uses the ``\`` character as a path separator. This is a terrible choice, because ``\`` also represents the escape character in most modern programming languages, including Python. For this reason, using '/' character is recommended if you have problems with ``\``. However, in Windows commands '/' flags options, so you can not use it for the root directory. This means that paths beginning at the root must be typed in a contrived manner like: ``%copy \opt/foo/bar.txt \tmp`` .. _magic: Magic command system -------------------- IPython will treat any line whose first character is a % as a special call to a 'magic' function. These allow you to control the behavior of IPython itself, plus a lot of system-type features. They are all prefixed with a % character, but parameters are given without parentheses or quotes. Lines that begin with ``%%`` signal a *cell magic*: they take as arguments not only the rest of the current line, but all lines below them as well, in the current execution block. Cell magics can in fact make arbitrary modifications to the input they receive, which need not even be valid Python code at all. They receive the whole block as a single string. As a line magic example, the :magic:`cd` magic works just like the OS command of the same name:: In [8]: %cd /home/fperez The following uses the builtin :magic:`timeit` in cell mode:: In [10]: %%timeit x = range(10000) ...: min(x) ...: max(x) ...: 518 µs ± 4.39 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) In this case, ``x = range(10000)`` is called as the line argument, and the block with ``min(x)`` and ``max(x)`` is called as the cell body. The :magic:`timeit` magic receives both. If you have 'automagic' enabled (as it is by default), you don't need to type in the single ``%`` explicitly for line magics; IPython will scan its internal list of magic functions and call one if it exists. With automagic on you can then just type ``cd mydir`` to go to directory 'mydir':: In [9]: cd mydir /home/fperez/mydir Cell magics *always* require an explicit ``%%`` prefix, automagic calling only works for line magics. The automagic system has the lowest possible precedence in name searches, so you can freely use variables with the same names as magic commands. If a magic command is 'shadowed' by a variable, you will need the explicit ``%`` prefix to use it: .. sourcecode:: ipython In [1]: cd ipython # %cd is called by automagic /home/fperez/ipython In [2]: cd=1 # now cd is just a variable In [3]: cd .. # and doesn't work as a function anymore File "", line 1 cd .. ^ SyntaxError: invalid syntax In [4]: %cd .. # but %cd always works /home/fperez In [5]: del cd # if you remove the cd variable, automagic works again In [6]: cd ipython /home/fperez/ipython Line magics, if they return a value, can be assigned to a variable using the syntax ``l = %sx ls`` (which in this particular case returns the result of `ls` as a python list). See :ref:`below ` for more information. Type ``%magic`` for more information, including a list of all available magic functions at any time and their docstrings. You can also type ``%magic_function_name?`` (see :ref:`below ` for information on the '?' system) to get information about any particular magic function you are interested in. The API documentation for the :mod:`IPython.core.magic` module contains the full docstrings of all currently available magic commands. .. seealso:: :doc:`magics` A list of the line and cell magics available in IPython by default :ref:`defining_magics` How to define and register additional magic functions Access to the standard Python help ---------------------------------- Simply type ``help()`` to access Python's standard help system. You can also type ``help(object)`` for information about a given object, or ``help('keyword')`` for information on a keyword. You may need to configure your PYTHONDOCS environment variable for this feature to work correctly. .. _dynamic_object_info: Dynamic object information -------------------------- Typing ``?word`` or ``word?`` prints detailed information about an object. If certain strings in the object are too long (e.g. function signatures) they get snipped in the center for brevity. This system gives access variable types and values, docstrings, function prototypes and other useful information. If the information will not fit in the terminal, it is displayed in a pager (``less`` if available, otherwise a basic internal pager). Typing ``??word`` or ``word??`` gives access to the full information, including the source code where possible. Long strings are not snipped. The following magic functions are particularly useful for gathering information about your working environment: * :magic:`pdoc` ****: Print (or run through a pager if too long) the docstring for an object. If the given object is a class, it will print both the class and the constructor docstrings. * :magic:`pdef` ****: Print the call signature for any callable object. If the object is a class, print the constructor information. * :magic:`psource` ****: Print (or run through a pager if too long) the source code for an object. * :magic:`pfile` ****: Show the entire source file where an object was defined via a pager, opening it at the line where the object definition begins. * :magic:`who`/:magic:`whos`: These functions give information about identifiers you have defined interactively (not things you loaded or defined in your configuration files). %who just prints a list of identifiers and %whos prints a table with some basic details about each identifier. The dynamic object information functions (?/??, ``%pdoc``, ``%pfile``, ``%pdef``, ``%psource``) work on object attributes, as well as directly on variables. For example, after doing ``import os``, you can use ``os.path.abspath??``. Command line completion +++++++++++++++++++++++ At any time, hitting TAB will complete any available python commands or variable names, and show you a list of the possible completions if there's no unambiguous one. It will also complete filenames in the current directory if no python names match what you've typed so far. Search command history ++++++++++++++++++++++ IPython provides two ways for searching through previous input and thus reduce the need for repetitive typing: 1. Start typing, and then use the up and down arrow keys (or :kbd:`Ctrl-p` and :kbd:`Ctrl-n`) to search through only the history items that match what you've typed so far. 2. Hit :kbd:`Ctrl-r`: to open a search prompt. Begin typing and the system searches your history for lines that contain what you've typed so far, completing as much as it can. IPython will save your input history when it leaves and reload it next time you restart it. By default, the history file is named :file:`.ipython/profile_{name}/history.sqlite`. Autoindent ++++++++++ Starting with 5.0, IPython uses `prompt_toolkit` in place of ``readline``, it thus can recognize lines ending in ':' and indent the next line, while also un-indenting automatically after 'raise' or 'return', and support real multi-line editing as well as syntactic coloration during edition. This feature does not use the ``readline`` library anymore, so it will not honor your :file:`~/.inputrc` configuration (or whatever file your :envvar:`INPUTRC` environment variable points to). In particular if you want to change the input mode to ``vi``, you will need to set the ``TerminalInteractiveShell.editing_mode`` configuration option of IPython. Session logging and restoring ----------------------------- You can log all input from a session either by starting IPython with the command line switch ``--logfile=foo.py`` (see :ref:`here `) or by activating the logging at any moment with the magic function :magic:`logstart`. Log files can later be reloaded by running them as scripts and IPython will attempt to 'replay' the log by executing all the lines in it, thus restoring the state of a previous session. This feature is not quite perfect, but can still be useful in many cases. The log files can also be used as a way to have a permanent record of any code you wrote while experimenting. Log files are regular text files which you can later open in your favorite text editor to extract code or to 'clean them up' before using them to replay a session. The :magic:`logstart` function for activating logging in mid-session is used as follows:: %logstart [log_name [log_mode]] If no name is given, it defaults to a file named 'ipython_log.py' in your current working directory, in 'rotate' mode (see below). '%logstart name' saves to file 'name' in 'backup' mode. It saves your history up to that point and then continues logging. %logstart takes a second optional parameter: logging mode. This can be one of (note that the modes are given unquoted): * [over:] overwrite existing log_name. * [backup:] rename (if exists) to log_name~ and start log_name. * [append:] well, that says it. * [rotate:] create rotating logs log_name.1~, log_name.2~, etc. Adding the '-o' flag to '%logstart' magic (as in '%logstart -o [log_name [log_mode]]') will also include output from iPython in the log file. The :magic:`logoff` and :magic:`logon` functions allow you to temporarily stop and resume logging to a file which had previously been started with %logstart. They will fail (with an explanation) if you try to use them before logging has been started. .. _system_shell_access: System shell access ------------------- Any input line beginning with a ``!`` character is passed verbatim (minus the ``!``, of course) to the underlying operating system. For example, typing ``!ls`` will run 'ls' in the current directory. .. _manual_capture: Manual capture of command output and magic output ------------------------------------------------- You can assign the result of a system command to a Python variable with the syntax ``myfiles = !ls``. Similarly, the result of a magic (as long as it returns a value) can be assigned to a variable. For example, the syntax ``myfiles = %sx ls`` is equivalent to the above system command example (the :magic:`sx` magic runs a shell command and captures the output). Each of these gets machine readable output from stdout (e.g. without colours), and splits on newlines. To explicitly get this sort of output without assigning to a variable, use two exclamation marks (``!!ls``) or the :magic:`sx` magic command without an assignment. (However, ``!!`` commands cannot be assigned to a variable.) The captured list in this example has some convenience features. ``myfiles.n`` or ``myfiles.s`` returns a string delimited by newlines or spaces, respectively. ``myfiles.p`` produces `path objects `_ from the list items. See :ref:`string_lists` for details. IPython also allows you to expand the value of python variables when making system calls. Wrap variables or expressions in {braces}:: In [1]: pyvar = 'Hello world' In [2]: !echo "A python variable: {pyvar}" A python variable: Hello world In [3]: import math In [4]: x = 8 In [5]: !echo {math.factorial(x)} 40320 For simple cases, you can alternatively prepend $ to a variable name:: In [6]: !echo $sys.argv [/home/fperez/usr/bin/ipython] In [7]: !echo "A system variable: $$HOME" # Use $$ for literal $ A system variable: /home/fperez Note that `$$` is used to represent a literal `$`. System command aliases ---------------------- The :magic:`alias` magic function allows you to define magic functions which are in fact system shell commands. These aliases can have parameters. ``%alias alias_name cmd`` defines 'alias_name' as an alias for 'cmd' Then, typing ``alias_name params`` will execute the system command 'cmd params' (from your underlying operating system). You can also define aliases with parameters using ``%s`` specifiers (one per parameter). The following example defines the parts function as an alias to the command ``echo first %s second %s`` where each ``%s`` will be replaced by a positional parameter to the call to %parts:: In [1]: %alias parts echo first %s second %s In [2]: parts A B first A second B In [3]: parts A ERROR: Alias requires 2 arguments, 1 given. If called with no parameters, :magic:`alias` prints the table of currently defined aliases. The :magic:`rehashx` magic allows you to load your entire $PATH as ipython aliases. See its docstring for further details. .. _dreload: Recursive reload ---------------- The :mod:`IPython.lib.deepreload` module allows you to recursively reload a module: changes made to any of its dependencies will be reloaded without having to exit. To start using it, do:: from IPython.lib.deepreload import reload as dreload Verbose and colored exception traceback printouts ------------------------------------------------- IPython provides the option to see very detailed exception tracebacks, which can be especially useful when debugging large programs. You can run any Python file with the %run function to benefit from these detailed tracebacks. Furthermore, both normal and verbose tracebacks can be colored (if your terminal supports it) which makes them much easier to parse visually. See the magic :magic:`xmode` and :magic:`colors` functions for details. These features are basically a terminal version of Ka-Ping Yee's cgitb module, now part of the standard Python library. .. _input_caching: Input caching system -------------------- IPython offers numbered prompts (In/Out) with input and output caching (also referred to as 'input history'). All input is saved and can be retrieved as variables (besides the usual arrow key recall), in addition to the :magic:`rep` magic command that brings a history entry up for editing on the next command line. The following variables always exist: * ``_i``, ``_ii``, ``_iii``: store previous, next previous and next-next previous inputs. * ``In``, ``_ih`` : a list of all inputs; ``_ih[n]`` is the input from line ``n``. If you overwrite In with a variable of your own, you can remake the assignment to the internal list with a simple ``In=_ih``. Additionally, global variables named ``_i`` are dynamically created (```` being the prompt counter), so ``_i == _ih[] == In[]``. For example, what you typed at prompt 14 is available as ``_i14``, ``_ih[14]`` and ``In[14]``. This allows you to easily cut and paste multi line interactive prompts by printing them out: they print like a clean string, without prompt characters. You can also manipulate them like regular variables (they are strings), modify or exec them. You can also re-execute multiple lines of input easily by using the magic :magic:`rerun` or :magic:`macro` functions. The macro system also allows you to re-execute previous lines which include magic function calls (which require special processing). Type %macro? for more details on the macro system. A history function :magic:`history` allows you to see any part of your input history by printing a range of the _i variables. You can also search ('grep') through your history by typing ``%hist -g somestring``. This is handy for searching for URLs, IP addresses, etc. You can bring history entries listed by '%hist -g' up for editing with the %recall command, or run them immediately with :magic:`rerun`. .. _output_caching: Output caching system --------------------- For output that is returned from actions, a system similar to the input cache exists but using _ instead of _i. Only actions that produce a result (NOT assignments, for example) are cached. If you are familiar with Mathematica, IPython's _ variables behave exactly like Mathematica's % variables. The following variables always exist: * [_] (a single underscore): stores previous output, like Python's default interpreter. * [__] (two underscores): next previous. * [___] (three underscores): next-next previous. Additionally, global variables named _ are dynamically created ( being the prompt counter), such that the result of output is always available as _ (don't use the angle brackets, just the number, e.g. ``_21``). These variables are also stored in a global dictionary (not a list, since it only has entries for lines which returned a result) available under the names _oh and Out (similar to _ih and In). So the output from line 12 can be obtained as ``_12``, ``Out[12]`` or ``_oh[12]``. If you accidentally overwrite the Out variable you can recover it by typing ``Out=_oh`` at the prompt. This system obviously can potentially put heavy memory demands on your system, since it prevents Python's garbage collector from removing any previously computed results. You can control how many results are kept in memory with the configuration option ``InteractiveShell.cache_size``. If you set it to 0, output caching is disabled. You can also use the :magic:`reset` and :magic:`xdel` magics to clear large items from memory. Directory history ----------------- Your history of visited directories is kept in the global list _dh, and the magic :magic:`cd` command can be used to go to any entry in that list. The :magic:`dhist` command allows you to view this history. Do ``cd -`` to conveniently view the directory history. Automatic parentheses and quotes -------------------------------- These features were adapted from Nathan Gray's LazyPython. They are meant to allow less typing for common situations. Callable objects (i.e. functions, methods, etc) can be invoked like this (notice the commas between the arguments):: In [1]: callable_ob arg1, arg2, arg3 ------> callable_ob(arg1, arg2, arg3) .. note:: This feature is disabled by default. To enable it, use the ``%autocall`` magic command. The commands below with special prefixes will always work, however. You can force automatic parentheses by using '/' as the first character of a line. For example:: In [2]: /globals # becomes 'globals()' Note that the '/' MUST be the first character on the line! This won't work:: In [3]: print /globals # syntax error In most cases the automatic algorithm should work, so you should rarely need to explicitly invoke /. One notable exception is if you are trying to call a function with a list of tuples as arguments (the parenthesis will confuse IPython):: In [4]: zip (1,2,3),(4,5,6) # won't work but this will work:: In [5]: /zip (1,2,3),(4,5,6) ------> zip ((1,2,3),(4,5,6)) Out[5]: [(1, 4), (2, 5), (3, 6)] IPython tells you that it has altered your command line by displaying the new command line preceded by ``--->``. You can force automatic quoting of a function's arguments by using ``,`` or ``;`` as the first character of a line. For example:: In [1]: ,my_function /home/me # becomes my_function("/home/me") If you use ';' the whole argument is quoted as a single string, while ',' splits on whitespace:: In [2]: ,my_function a b c # becomes my_function("a","b","c") In [3]: ;my_function a b c # becomes my_function("a b c") Note that the ',' or ';' MUST be the first character on the line! This won't work:: In [4]: x = ,my_function /home/me # syntax error IPython as your default Python environment ========================================== Python honors the environment variable :envvar:`PYTHONSTARTUP` and will execute at startup the file referenced by this variable. If you put the following code at the end of that file, then IPython will be your working environment anytime you start Python:: import os, IPython os.environ['PYTHONSTARTUP'] = '' # Prevent running this again IPython.start_ipython() raise SystemExit The ``raise SystemExit`` is needed to exit Python when it finishes, otherwise you'll be back at the normal Python ``>>>`` prompt. This is probably useful to developers who manage multiple Python versions and don't want to have correspondingly multiple IPython versions. Note that in this mode, there is no way to pass IPython any command-line options, as those are trapped first by Python itself. .. _Embedding: Embedding IPython ================= You can start a regular IPython session with .. sourcecode:: python import IPython IPython.start_ipython(argv=[]) at any point in your program. This will load IPython configuration, startup files, and everything, just as if it were a normal IPython session. For information on setting configuration options when running IPython from python, see :ref:`configure_start_ipython`. It is also possible to embed an IPython shell in a namespace in your Python code. This allows you to evaluate dynamically the state of your code, operate with your variables, analyze them, etc. For example, if you run the following code snippet:: import IPython a = 42 IPython.embed() and within the IPython shell, you reassign `a` to `23` to do further testing of some sort, you can then exit:: >>> IPython.embed() Python 3.6.2 (default, Jul 17 2017, 16:44:45) Type 'copyright', 'credits' or 'license' for more information IPython 6.2.0.dev -- An enhanced Interactive Python. Type '?' for help. In [1]: a = 23 In [2]: exit() Once you exit and print `a`, the value 23 will be shown:: In: print(a) 23 It's important to note that the code run in the embedded IPython shell will *not* change the state of your code and variables, **unless** the shell is contained within the global namespace. In the above example, `a` is changed because this is true. To further exemplify this, consider the following example:: import IPython def do(): a = 42 print(a) IPython.embed() print(a) Now if call the function and complete the state changes as we did above, the value `42` will be printed. Again, this is because it's not in the global namespace:: do() Running a file with the above code can lead to the following session:: >>> do() 42 Python 3.6.2 (default, Jul 17 2017, 16:44:45) Type 'copyright', 'credits' or 'license' for more information IPython 6.2.0.dev -- An enhanced Interactive Python. Type '?' for help. In [1]: a = 23 In [2]: exit() 42 .. note:: At present, embedding IPython cannot be done from inside IPython. Run the code samples below outside IPython. This feature allows you to easily have a fully functional python environment for doing object introspection anywhere in your code with a simple function call. In some cases a simple print statement is enough, but if you need to do more detailed analysis of a code fragment this feature can be very valuable. It can also be useful in scientific computing situations where it is common to need to do some automatic, computationally intensive part and then stop to look at data, plots, etc. Opening an IPython instance will give you full access to your data and functions, and you can resume program execution once you are done with the interactive part (perhaps to stop again later, as many times as needed). The following code snippet is the bare minimum you need to include in your Python programs for this to work (detailed examples follow later):: from IPython import embed embed() # this call anywhere in your program will start IPython You can also embed an IPython *kernel*, for use with qtconsole, etc. via ``IPython.embed_kernel()``. This should work the same way, but you can connect an external frontend (``ipython qtconsole`` or ``ipython console``), rather than interacting with it in the terminal. You can run embedded instances even in code which is itself being run at the IPython interactive prompt with '%run '. Since it's easy to get lost as to where you are (in your top-level IPython or in your embedded one), it's a good idea in such cases to set the in/out prompts to something different for the embedded instances. The code examples below illustrate this. You can also have multiple IPython instances in your program and open them separately, for example with different options for data presentation. If you close and open the same instance multiple times, its prompt counters simply continue from each execution to the next. Please look at the docstrings in the :mod:`~IPython.frontend.terminal.embed` module for more details on the use of this system. The following sample file illustrating how to use the embedding functionality is provided in the examples directory as embed_class_long.py. It should be fairly self-explanatory: .. literalinclude:: ../../../examples/Embedding/embed_class_long.py :language: python Once you understand how the system functions, you can use the following code fragments in your programs which are ready for cut and paste: .. literalinclude:: ../../../examples/Embedding/embed_class_short.py :language: python Using the Python debugger (pdb) =============================== Running entire programs via pdb ------------------------------- pdb, the Python debugger, is a powerful interactive debugger which allows you to step through code, set breakpoints, watch variables, etc. IPython makes it very easy to start any script under the control of pdb, regardless of whether you have wrapped it into a 'main()' function or not. For this, simply type ``%run -d myscript`` at an IPython prompt. See the :magic:`run` command's documentation for more details, including how to control where pdb will stop execution first. For more information on the use of the pdb debugger, see :ref:`debugger-commands` in the Python documentation. IPython extends the debugger with a few useful additions, like coloring of tracebacks. The debugger will adopt the color scheme selected for IPython. The ``where`` command has also been extended to take as argument the number of context line to show. This allows to a many line of context on shallow stack trace: .. code:: In [5]: def foo(x): ...: 1 ...: 2 ...: 3 ...: return 1/x+foo(x-1) ...: 5 ...: 6 ...: 7 ...: In[6]: foo(1) # ... ipdb> where 8 (1) ----> 1 foo(1) (5)foo() 1 def foo(x): 2 1 3 2 4 3 ----> 5 return 1/x+foo(x-1) 6 5 7 6 8 7 > (5)foo() 1 def foo(x): 2 1 3 2 4 3 ----> 5 return 1/x+foo(x-1) 6 5 7 6 8 7 And less context on shallower Stack Trace: .. code:: ipdb> where 1 (1) ----> 1 foo(7) (5)foo() ----> 5 return 1/x+foo(x-1) (5)foo() ----> 5 return 1/x+foo(x-1) (5)foo() ----> 5 return 1/x+foo(x-1) (5)foo() ----> 5 return 1/x+foo(x-1) Post-mortem debugging --------------------- Going into a debugger when an exception occurs can be extremely useful in order to find the origin of subtle bugs, because pdb opens up at the point in your code which triggered the exception, and while your program is at this point 'dead', all the data is still available and you can walk up and down the stack frame and understand the origin of the problem. You can use the :magic:`debug` magic after an exception has occurred to start post-mortem debugging. IPython can also call debugger every time your code triggers an uncaught exception. This feature can be toggled with the :magic:`pdb` magic command, or you can start IPython with the ``--pdb`` option. For a post-mortem debugger in your programs outside IPython, put the following lines toward the top of your 'main' routine:: import sys from IPython.core import ultratb sys.excepthook = ultratb.FormattedTB(mode='Verbose', color_scheme='Linux', call_pdb=1) The mode keyword can be either 'Verbose' or 'Plain', giving either very detailed or normal tracebacks respectively. The color_scheme keyword can be one of 'NoColor', 'Linux' (default) or 'LightBG'. These are the same options which can be set in IPython with ``--colors`` and ``--xmode``. This will give any of your programs detailed, colored tracebacks with automatic invocation of pdb. .. _pasting_with_prompts: Pasting of code starting with Python or IPython prompts ======================================================= IPython is smart enough to filter out input prompts, be they plain Python ones (``>>>`` and ``...``) or IPython ones (``In [N]:`` and ``...:``). You can therefore copy and paste from existing interactive sessions without worry. The following is a 'screenshot' of how things work, copying an example from the standard Python tutorial:: In [1]: >>> # Fibonacci series: In [2]: ... # the sum of two elements defines the next In [3]: ... a, b = 0, 1 In [4]: >>> while b < 10: ...: ... print(b) ...: ... a, b = b, a+b ...: 1 1 2 3 5 8 And pasting from IPython sessions works equally well:: In [1]: In [5]: def f(x): ...: ...: "A simple function" ...: ...: return x**2 ...: ...: In [2]: f(3) Out[2]: 9 .. _gui_support: GUI event loop support ====================== IPython has excellent support for working interactively with Graphical User Interface (GUI) toolkits, such as wxPython, PyQt/PySide, PyGTK and Tk. This is implemented by running the toolkit's event loop while IPython is waiting for input. For users, enabling GUI event loop integration is simple. You simple use the :magic:`gui` magic as follows:: %gui [GUINAME] With no arguments, ``%gui`` removes all GUI support. Valid ``GUINAME`` arguments include ``wx``, ``qt``, ``qt5``, ``qt6``, ``gtk3`` ``gtk4``, and ``tk``. Thus, to use wxPython interactively and create a running :class:`wx.App` object, do:: %gui wx You can also start IPython with an event loop set up using the `--gui` flag:: $ ipython --gui=qt For information on IPython's matplotlib_ integration (and the ``matplotlib`` mode) see :ref:`this section `. For developers that want to integrate additional event loops with IPython, see :doc:`/config/eventloops`. When running inside IPython with an integrated event loop, a GUI application should *not* start its own event loop. This means that applications that are meant to be used both in IPython and as standalone apps need to have special code to detects how the application is being run. We highly recommend using IPython's support for this. Since the details vary slightly between toolkits, we point you to the various examples in our source directory :file:`examples/IPython Kernel/gui/` that demonstrate these capabilities. PyQt and PySide --------------- .. attempt at explanation of the complete mess that is Qt support When you use ``--gui=qt`` or ``--matplotlib=qt``, IPython can work with either PyQt or PySide. ``qt`` implies "use the latest version available", and it favors PyQt over PySide. To request a specific version, use ``qt5`` or ``qt6``. If specified, IPython will respect the environment variable ``QT_API``. If ``QT_API`` is not specified and you launch IPython in matplotlib mode with ``ipython --matplotlib=qt`` then IPython will ask matplotlib which Qt library to use. See the matplotlib_ documentation on ``QT_API`` for further details. .. _matplotlib_support: Plotting with matplotlib ======================== matplotlib_ provides high quality 2D and 3D plotting for Python. matplotlib_ can produce plots on screen using a variety of GUI toolkits, including Tk, PyGTK, PyQt6 and wxPython. It also provides a number of commands useful for scientific computing, all with a syntax compatible with that of the popular Matlab program. To start IPython with matplotlib support, use the ``--matplotlib`` switch. If IPython is already running, you can run the :magic:`matplotlib` magic. If no arguments are given, IPython will automatically detect your choice of matplotlib backend. For information on matplotlib backends see :ref:`matplotlib_magic`. .. _interactive_demos: Interactive demos with IPython ============================== IPython ships with a basic system for running scripts interactively in sections, useful when presenting code to audiences. A few tags embedded in comments (so that the script remains valid Python code) divide a file into separate blocks, and the demo can be run one block at a time, with IPython printing (with syntax highlighting) the block before executing it, and returning to the interactive prompt after each block. The interactive namespace is updated after each block is run with the contents of the demo's namespace. This allows you to show a piece of code, run it and then execute interactively commands based on the variables just created. Once you want to continue, you simply execute the next block of the demo. The following listing shows the markup necessary for dividing a script into sections for execution as a demo: .. literalinclude:: ../../../examples/IPython Kernel/example-demo.py :language: python In order to run a file as a demo, you must first make a Demo object out of it. If the file is named myscript.py, the following code will make a demo:: from IPython.lib.demo import Demo mydemo = Demo('myscript.py') This creates the mydemo object, whose blocks you run one at a time by simply calling the object with no arguments. Then call it to run each step of the demo:: mydemo() Demo objects can be restarted, you can move forward or back skipping blocks, re-execute the last block, etc. See the :mod:`IPython.lib.demo` module and the :class:`~IPython.lib.demo.Demo` class for details. Limitations: These demos are limited to fairly simple uses. In particular, you cannot break up sections within indented code (loops, if statements, function definitions, etc.) Supporting something like this would basically require tracking the internal execution state of the Python interpreter, so only top-level divisions are allowed. If you want to be able to open an IPython instance at an arbitrary point in a program, you can use IPython's :ref:`embedding facilities `. .. include:: ../links.txt ipython-8.35.0/docs/source/interactive/shell.rst000066400000000000000000000166041477474304100217310ustar00rootroot00000000000000 .. note:: This page has been kept for historical reason. You most likely want to use `Xonsh `__ instead of this. .. _ipython_as_shell: ========================= IPython as a system shell ========================= Overview ======== It is possible to adapt IPython for system shell usage. In the past, IPython shipped a special 'sh' profile for this purpose, but it had been quarantined since 0.11 release, and in 1.0 it was removed altogether. Nevertheless, much of this section relies on machinery which does not require a custom profile. You can set up your own 'sh' :ref:`profile ` to be different from the default profile such that: * Prompt shows the current directory (see `Prompt customization`_) * Make system commands directly available (in alias table) by running the ``%rehashx`` magic. If you install new programs along your PATH, you might want to run ``%rehashx`` to update the alias table * turn ``%autocall`` to full mode Environment variables ===================== Rather than manipulating os.environ directly, you may like to use the magic `%env` command. With no arguments, this displays all environment variables and values. To get the value of a specific variable, use `%env var`. To set the value of a specific variable, use `%env foo bar`, `%env foo=bar`. By default values are considered to be strings so quoting them is unnecessary. However, Python variables are expanded as usual in the magic command, so `%env foo=$bar` means "set the environment variable foo to the value of the Python variable `bar`". Aliases ======= Once you run ``%rehashx``, all of your $PATH has been loaded as IPython aliases, so you should be able to type any normal system command and have it executed. See ``%alias?`` and ``%unalias?`` for details on the alias facilities. See also ``%rehashx?`` for details on the mechanism used to load $PATH. .. warning:: See info at the top of the page. You most likely want to use `Xonsh `__ instead of this. Directory management ==================== Since each command passed by IPython to the underlying system is executed in a subshell which exits immediately, you can NOT use !cd to navigate the filesystem. IPython provides its own builtin ``%cd`` magic command to move in the filesystem (the % is not required with automagic on). It also maintains a list of visited directories (use ``%dhist`` to see it) and allows direct switching to any of them. Type ``cd?`` for more details. ``%pushd``, ``%popd`` and ``%dirs`` are provided for directory stack handling. Prompt customization ==================== See :ref:`custom_prompts`. .. _string_lists: String lists ============ String lists (IPython.utils.text.SList) are handy way to process output from system commands. They are produced by ``var = !cmd`` syntax. First, we acquire the output of 'ls -l':: [Q:doc/examples]|2> lines = !ls -l == ['total 23', '-rw-rw-rw- 1 ville None 1163 Sep 30 2006 example-demo.py', '-rw-rw-rw- 1 ville None 1927 Sep 30 2006 example-embed-short.py', '-rwxrwxrwx 1 ville None 4606 Sep 1 17:15 example-embed.py', '-rwxrwxrwx 1 ville None 1017 Sep 30 2006 example-gnuplot.py', '-rwxrwxrwx 1 ville None 339 Jun 11 18:01 extension.py', '-rwxrwxrwx 1 ville None 113 Dec 20 2006 seteditor.py', '-rwxrwxrwx 1 ville None 245 Dec 12 2006 seteditor.pyc'] Now, let's take a look at the contents of 'lines' (the first number is the list element number):: [Q:doc/examples]|3> lines <3> SList (.p, .n, .l, .s, .grep(), .fields() available). Value: 0: total 23 1: -rw-rw-rw- 1 ville None 1163 Sep 30 2006 example-demo.py 2: -rw-rw-rw- 1 ville None 1927 Sep 30 2006 example-embed-short.py 3: -rwxrwxrwx 1 ville None 4606 Sep 1 17:15 example-embed.py 4: -rwxrwxrwx 1 ville None 1017 Sep 30 2006 example-gnuplot.py 5: -rwxrwxrwx 1 ville None 339 Jun 11 18:01 extension.py 6: -rwxrwxrwx 1 ville None 113 Dec 20 2006 seteditor.py 7: -rwxrwxrwx 1 ville None 245 Dec 12 2006 seteditor.pyc Now, let's filter out the 'embed' lines:: [Q:doc/examples]|4> l2 = lines.grep('embed',prune=1) [Q:doc/examples]|5> l2 <5> SList (.p, .n, .l, .s, .grep(), .fields() available). Value: 0: total 23 1: -rw-rw-rw- 1 ville None 1163 Sep 30 2006 example-demo.py 2: -rwxrwxrwx 1 ville None 1017 Sep 30 2006 example-gnuplot.py 3: -rwxrwxrwx 1 ville None 339 Jun 11 18:01 extension.py 4: -rwxrwxrwx 1 ville None 113 Dec 20 2006 seteditor.py 5: -rwxrwxrwx 1 ville None 245 Dec 12 2006 seteditor.pyc Now, we want strings having just file names and permissions:: [Q:doc/examples]|6> l2.fields(8,0) <6> SList (.p, .n, .l, .s, .grep(), .fields() available). Value: 0: total 1: example-demo.py -rw-rw-rw- 2: example-gnuplot.py -rwxrwxrwx 3: extension.py -rwxrwxrwx 4: seteditor.py -rwxrwxrwx 5: seteditor.pyc -rwxrwxrwx Note how the line with 'total' does not raise IndexError. If you want to split these (yielding lists), call fields() without arguments:: [Q:doc/examples]|7> _.fields() <7> [['total'], ['example-demo.py', '-rw-rw-rw-'], ['example-gnuplot.py', '-rwxrwxrwx'], ['extension.py', '-rwxrwxrwx'], ['seteditor.py', '-rwxrwxrwx'], ['seteditor.pyc', '-rwxrwxrwx']] If you want to pass these separated with spaces to a command (typical for lists if files), use the .s property:: [Q:doc/examples]|13> files = l2.fields(8).s [Q:doc/examples]|14> files <14> 'example-demo.py example-gnuplot.py extension.py seteditor.py seteditor.pyc' [Q:doc/examples]|15> ls $files example-demo.py example-gnuplot.py extension.py seteditor.py seteditor.pyc SLists are inherited from normal Python lists, so every list method is available:: [Q:doc/examples]|21> lines.append('hey') Real world example: remove all files outside version control ------------------------------------------------------------ First, capture output of "hg status":: [Q:/ipython]|28> out = !hg status == ['M IPython\\extensions\\ipy_kitcfg.py', 'M IPython\\extensions\\ipy_rehashdir.py', ... '? build\\lib\\IPython\\Debugger.py', '? build\\lib\\IPython\\extensions\\InterpreterExec.py', '? build\\lib\\IPython\\extensions\\InterpreterPasteInput.py', ... (lines starting with ? are not under version control). :: [Q:/ipython]|35> junk = out.grep(r'^\?').fields(1) [Q:/ipython]|36> junk <36> SList (.p, .n, .l, .s, .grep(), .fields() availab ... 10: build\bdist.win32\winexe\temp\_ctypes.py 11: build\bdist.win32\winexe\temp\_hashlib.py 12: build\bdist.win32\winexe\temp\_socket.py Now we can just remove these files by doing 'rm $junk.s'. The .n, .s, .p properties ------------------------- Properties of `SList `_ wrapper provide a convenient ways to use contained text in different formats: * ``.n`` returns (original) string with lines separated by a newline * ``.s`` returns string with lines separated by single space (for convenient passing to system commands) * ``.p`` returns list of "path" objects from detected file names .. error:: You went too far scroll back up. You most likely want to use `Xonsh `__ instead of this. ipython-8.35.0/docs/source/interactive/tips.rst000066400000000000000000000067711477474304100216050ustar00rootroot00000000000000.. _tips: ===================== IPython Tips & Tricks ===================== The `IPython cookbook `_ details more things you can do with IPython. .. This is not in the current version: Embed IPython in your programs ------------------------------ A few lines of code are enough to load a complete IPython inside your own programs, giving you the ability to work with your data interactively after automatic processing has been completed. See :ref:`the embedding section `. Run doctests ------------ Run your doctests from within IPython for development and debugging. The special ``%doctest_mode`` command toggles a mode where the prompt, output and exceptions display matches as closely as possible that of the default Python interpreter. In addition, this mode allows you to directly paste in code that contains leading '>>>' prompts, even if they have extra leading whitespace (as is common in doctest files). This combined with the ``%hist -t`` call to see your translated history allows for an easy doctest workflow, where you can go from doctest to interactive execution to pasting into valid Python code as needed. Use IPython to present interactive demos ---------------------------------------- Use the :class:`IPython.lib.demo.Demo` class to load any Python script as an interactive demo. With a minimal amount of simple markup, you can control the execution of the script, stopping as needed. See :ref:`here ` for more. Suppress output --------------- Put a ';' at the end of a line to suppress the printing of output. This is useful when doing calculations which generate long output you are not interested in seeing. It also keeps the object out of the output cache, so if you're working with large temporary objects, they'll be released from memory sooner. Lightweight 'version control' ----------------------------- When you call ``%edit`` with no arguments, IPython opens an empty editor with a temporary file, and it returns the contents of your editing session as a string variable. Thanks to IPython's output caching mechanism, this is automatically stored:: In [1]: %edit IPython will make a temporary file named: /tmp/ipython_edit_yR-HCN.py Editing... done. Executing edited code... hello - this is a temporary file Out[1]: "print('hello - this is a temporary file')\n" Now, if you call ``%edit -p``, IPython tries to open an editor with the same data as the last time you used %edit. So if you haven't used %edit in the meantime, this same contents will reopen; however, it will be done in a new file. This means that if you make changes and you later want to find an old version, you can always retrieve it by using its output number, via '%edit _NN', where NN is the number of the output prompt. Continuing with the example above, this should illustrate this idea:: In [2]: edit -p IPython will make a temporary file named: /tmp/ipython_edit_nA09Qk.py Editing... done. Executing edited code... hello - now I made some changes Out[2]: "print('hello - now I made some changes')\n" In [3]: edit _1 IPython will make a temporary file named: /tmp/ipython_edit_gy6-zD.py Editing... done. Executing edited code... hello - this is a temporary file IPython version control at work :) Out[3]: "print('hello - this is a temporary file')\nprint('IPython version control at work :)')\n" This section was written after a contribution by Alexander Belchenko on the IPython user list. ipython-8.35.0/docs/source/interactive/tutorial.rst000066400000000000000000000270411477474304100224620ustar00rootroot00000000000000.. _tutorial: ====================== Introducing IPython ====================== You don't need to know anything beyond Python to start using IPython – just type commands as you would at the standard Python prompt. But IPython can do much more than the standard prompt. Some key features are described here. For more information, check the :ref:`tips page `, or look at examples in the `IPython cookbook `_. If you haven't done that yet see :ref:`how to install ipython `. If you've never used Python before, you might want to look at `the official tutorial `_. Start IPython by issuing the ``ipython`` command from your shell, you should be greeted by the following:: Python 3.6.0 Type 'copyright', 'credits' or 'license' for more information IPython 6.0.0.dev -- An enhanced Interactive Python. Type '?' for help. In [1]: Unlike the Python REPL, you will see that the input prompt is ``In [N]:`` instead of ``>>>``. The number ``N`` in the prompt will be used later in this tutorial but should usually not impact the computation. You should be able to type single line expressions and press enter to evaluate them. If an expression is incomplete, IPython will automatically detect this and add a new line when you press :kbd:`Enter` instead of executing right away. Feel free to explore multi-line text input. Unlike many other REPLs, with IPython you can use the up and down arrow keys when editing multi-line code blocks. Here is an example of a longer interaction with the IPython REPL, which we often refer to as an IPython *session* :: In [1]: print('Hello IPython') Hello IPython In [2]: 21 * 2 Out[2]: 42 In [3]: def say_hello(name): ...: print('Hello {name}'.format(name=name)) ...: We won't get into details right now, but you may notice a few differences to the standard Python REPL. First, your code should be syntax-highlighted as you type. Second, you will see that some results will have an ``Out[N]:`` prompt, while some other do not. We'll come to this later. Depending on the exact command you are typing you might realize that sometimes :kbd:`Enter` will add a new line, and sometimes it will execute the current statement. IPython tries to guess what you are doing, so most of the time you should not have to care. Though if by any chance IPython does not do the right thing you can force execution of the current code block by pressing in sequence :kbd:`Esc` and :kbd:`Enter`. You can also force the insertion of a new line at the position of the cursor by using :kbd:`Ctrl-o`. The four most helpful commands ============================== The four most helpful commands, as well as their brief description, is shown to you in a banner, every time you start IPython: ========== ========================================================= command description ========== ========================================================= ? Introduction and overview of IPython's features. %quickref Quick reference. help Python's own help system. object? Details about 'object', use 'object??' for extra details. ========== ========================================================= Tab completion ============== Tab completion, especially for attributes, is a convenient way to explore the structure of any object you're dealing with. Simply type ``object_name.`` to view the object's attributes. Besides Python objects and keywords, tab completion also works on file and directory names. Starting with IPython 6.0, if ``jedi`` is installed, IPython will try to pull completions from Jedi as well. This allows to not only inspect currently existing objects, but also to infer completion statically without executing code. There is nothing particular needed to get this to work, simply use tab completion on more complex expressions like the following:: >>> data = ['Number of users', 123456] ... data[0]. IPython and Jedi will be able to infer that ``data[0]`` is actually a string and should show relevant completions like ``upper()``, ``lower()`` and other string methods. You can use the :kbd:`Tab` key to cycle through completions, and while a completion is highlighted, its type will be shown as well. When the type of the completion is a function, the completer will also show the signature of the function when highlighted. Exploring your objects ====================== Typing ``object_name?`` will print all sorts of details about any object, including docstrings, function definition lines (for call arguments) and constructor details for classes. To get specific information on an object, you can use the magic commands ``%pdoc``, ``%pdef``, ``%psource`` and ``%pfile`` .. _magics_explained: Magic functions =============== IPython has a set of predefined 'magic functions' that you can call with a command line style syntax. There are two kinds of magics, line-oriented and cell-oriented. **Line magics** are prefixed with the ``%`` character and work much like OS command-line calls: they get as an argument the rest of the line, where arguments are passed without parentheses or quotes. **Line magics** can return results and can be used in the right hand side of an assignment. **Cell magics** are prefixed with a double ``%%``, and they are functions that get as an argument not only the rest of the line, but also the lines below it in a separate argument. Magics are useful as convenient functions where Python syntax is not the most natural one, or when one want to embed invalid python syntax in their work flow. The following examples show how to call the built-in :magic:`timeit` magic, both in line and cell mode:: In [1]: %timeit range(1000) 179 ns ± 2.66 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [2]: %%timeit x = range(10000) ...: max(x) ...: 264 µs ± 1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) The built-in magics include: - Functions that work with code: :magic:`run`, :magic:`edit`, :magic:`save`, :magic:`macro`, :magic:`recall`, etc. - Functions which affect the shell: :magic:`colors`, :magic:`xmode`, :magic:`automagic`, etc. - Other functions such as :magic:`reset`, :magic:`timeit`, :cellmagic:`writefile`, :magic:`load`, or :magic:`paste`. You can always call magics using the ``%`` prefix, and if you're calling a line magic on a line by itself, as long as the identifier is not defined in your namespace, you can omit even that:: run thescript.py You can toggle this behavior by running the :magic:`automagic` magic. Cell magics must always have the ``%%`` prefix. A more detailed explanation of the magic system can be obtained by calling ``%magic``, and for more details on any magic function, call ``%somemagic?`` to read its docstring. To see all the available magic functions, call ``%lsmagic``. .. seealso:: The :ref:`magic` section of the documentation goes more in depth into how the magics works and how to define your own, and :doc:`magics` for a list of built-in magics. `Cell magics`_ example notebook Running and Editing ------------------- The :magic:`run` magic command allows you to run any python script and load all of its data directly into the interactive namespace. Since the file is re-read from disk each time, changes you make to it are reflected immediately (unlike imported modules, which have to be specifically reloaded). IPython also includes :ref:`dreload `, a recursive reload function. ``%run`` has special flags for timing the execution of your scripts (-t), or for running them under the control of either Python's pdb debugger (-d) or profiler (-p). The :magic:`edit` command gives a reasonable approximation of multi-line editing, by invoking your favorite editor on the spot. IPython will execute the code you type in there as if it were typed interactively. Note that for :magic:`edit` to work, the call to startup your editor has to be a blocking call. In a GUI environment, your editor likely will have such an option. Debugging --------- After an exception occurs, you can call :magic:`debug` to jump into the Python debugger (pdb) and examine the problem. Alternatively, if you call :magic:`pdb`, IPython will automatically start the debugger on any uncaught exception. You can print variables, see code, execute statements and even walk up and down the call stack to track down the true source of the problem. This can be an efficient way to develop and debug code, in many cases eliminating the need for print statements or external debugging tools. You can also step through a program from the beginning by calling ``%run -d theprogram.py``. History ======= IPython stores both the commands you enter, and the results it produces. You can easily go through previous commands with the up- and down-arrow keys, or access your history in more sophisticated ways. Input and output history are kept in variables called ``In`` and ``Out``, keyed by the prompt numbers, e.g. ``In[4]``. The last three objects in output history are also kept in variables named ``_``, ``__`` and ``___``. You can use the ``%history`` magic function to examine past input and output. Input history from previous sessions is saved in a database, and IPython can be configured to save output history. Several other magic functions can use your input history, including ``%edit``, ``%rerun``, ``%recall``, ``%macro``, ``%save`` and ``%pastebin``. You can use a standard format to refer to lines:: %pastebin 3 18-20 ~1/1-5 This will take line 3 and lines 18 to 20 from the current session, and lines 1-5 from the previous session. System shell commands ===================== To run any command at the system shell, simply prefix it with ``!``, e.g.:: !ping www.bbc.co.uk You can capture the output into a Python list, e.g.: ``files = !ls``. To pass the values of Python variables or expressions to system commands, prefix them with $: ``!grep -rF $pattern ipython/*`` or wrap in `{braces}`. See :ref:`our shell section ` for more details. Define your own system aliases ------------------------------ It's convenient to have aliases to the system commands you use most often. This allows you to work seamlessly from inside IPython with the same commands you are used to in your system shell. IPython comes with some pre-defined aliases and a complete system for changing directories, both via a stack (see :magic:`pushd`, :magic:`popd` and :magic:`dhist`) and via direct :magic:`cd`. The latter keeps a history of visited directories and allows you to go to any previously visited one. Configuration ============= Much of IPython can be tweaked through :doc:`configuration `. To get started, use the command ``ipython profile create`` to produce the default config files. These will be placed in :file:`~/.ipython/profile_default`, and contain comments explaining what the various options do. Profiles allow you to use IPython for different tasks, keeping separate config files and history for each one. More details in :ref:`the profiles section `. .. _startup_files: Startup Files ------------- If you want some code to be run at the beginning of every IPython session, the easiest way is to add Python (.py) or IPython (.ipy) scripts to your :file:`profile_default/startup/` directory. Files here will be executed as soon as the IPython shell is constructed, before any other code or scripts you have specified. The files will be run in order of their names, so you can control the ordering with prefixes, like ``10-myimports.py``. .. include:: ../links.txt ipython-8.35.0/docs/source/links.txt000066400000000000000000000100411477474304100174210ustar00rootroot00000000000000.. This (-*- rst -*-) format file contains commonly used link targets and name substitutions. It may be included in many files, therefore it should only contain link targets and name substitutions. Try grepping for "^\.\. _" to find plausible candidates for this list. NOTE: this file must have an extension *opposite* to that of the main reST files in the manuals, so that we can include it with ".. include::" directives, but without triggering warnings from Sphinx for not being listed in any toctree. Since IPython uses .txt for the main files, this one will use .rst. NOTE: reST targets are __not_case_sensitive__, so only one target definition is needed for ipython, IPython, etc. NOTE: Some of these were taken from the nipy links compendium. .. Main IPython links .. _ipython: https://ipython.org .. _`ipython manual`: https://ipython.org/documentation.html .. _ipython_github: http://github.com/ipython/ipython/ .. _nbviewer: http://nbviewer.ipython.org .. _ZeroMQ: http://zeromq.org .. Documentation tools and related links .. _graphviz: http://www.graphviz.org .. _Sphinx: http://sphinx.pocoo.org .. _`Sphinx reST`: http://sphinx.pocoo.org/rest.html .. _sampledoc: http://matplotlib.org/sampledoc .. _reST: http://docutils.sourceforge.net/rst.html .. _docutils: http://docutils.sourceforge.net .. _lyx: http://www.lyx.org .. _pep8: https://peps.python.org/pep-0008/ .. Licenses .. _GPL: http://www.gnu.org/licenses/gpl.html .. _BSD: http://www.opensource.org/licenses/bsd-license.php .. _LGPL: http://www.gnu.org/copyleft/lesser.html .. Other python projects .. _numpy: http://numpy.scipy.org .. _scipy: http://www.scipy.org .. _scipy_conference: http://conference.scipy.org .. _matplotlib: http://matplotlib.org .. _pythonxy: https://code.google.com/p/pythonxy/ .. _ETS: http://code.enthought.com/projects/tool-suite.php .. _EPD: http://www.enthought.com/products/epd.php .. _python: http://www.python.org .. _mayavi: http://code.enthought.com/projects/mayavi .. _sympy: http://code.google.com/p/sympy .. _sage: http://sagemath.org .. _pydy: http://code.google.com/p/pydy .. _vpython: http://vpython.org .. _cython: http://cython.org .. _software carpentry: http://software-carpentry.org .. Not so python scientific computing tools .. _matlab: http://www.mathworks.com .. _VTK: http://vtk.org .. Other organizations .. _enthought: http://www.enthought.com .. _kitware: http://www.kitware.com .. _netlib: http://netlib.org .. Other tools and projects .. _indefero: http://www.indefero.net .. _git: http://git-scm.com .. _github: http://github.com .. _Markdown: http://daringfireball.net/projects/markdown/syntax .. _Running Code in the IPython Notebook: notebook_p1_ .. _notebook_p1: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Part%25201%2520-%2520Running%2520Code.ipynb .. _Basic Output: notebook_p2_ .. _notebook_p2: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Part%202%20-%20Basic%20Output.ipynb .. _Plotting with Matplotlib: notebook_p3_ .. _notebook_p3: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Part%203%20-%20Plotting%20with%20Matplotlib.ipynb .. _Markdown Cells: notebook_p4_ .. _notebook_p4: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Part%204%20-%20Markdown%20Cells.ipynb .. _Rich Display System: notebook_p5_ .. _notebook_p5: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Part%205%20-%20Rich%20Display%20System.ipynb .. _notebook_custom_display: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Custom%20Display%20Logic.ipynb .. _Frontend/Kernel Model: notebook_two_proc_ .. _notebook_two_proc: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Frontend-Kernel%20Model.ipynb .. _Cell magics: notebook_cell_magics_ .. _notebook_cell_magics: http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/1.x/examples/notebooks/Cell%20Magics.ipynb ipython-8.35.0/docs/source/overview.rst000066400000000000000000000266241477474304100201560ustar00rootroot00000000000000.. _overview: ======== Overview ======== One of Python's most useful features is its interactive interpreter. It allows for very fast testing of ideas without the overhead of creating test files as is typical in most programming languages. However, the interpreter supplied with the standard Python distribution is somewhat limited for extended interactive use. The goal of IPython is to create a comprehensive environment for interactive and exploratory computing. To support this goal, IPython has three main components: * An enhanced interactive Python shell. * A decoupled :ref:`two-process communication model `, which allows for multiple clients to connect to a computation kernel, most notably the web-based notebook provided with `Jupyter `_. * An architecture for interactive parallel computing now part of the `ipyparallel` package. All of IPython is open source (released under the revised BSD license). Enhanced interactive Python shell ================================= IPython's interactive shell (:command:`ipython`), has the following goals, amongst others: 1. Provide an interactive shell superior to Python's default. IPython has many features for tab-completion, object introspection, system shell access, command history retrieval across sessions, and its own special command system for adding functionality when working interactively. It tries to be a very efficient environment both for Python code development and for exploration of problems using Python objects (in situations like data analysis). 2. Serve as an embeddable, ready to use interpreter for your own programs. An interactive IPython shell can be started with a single call from inside another program, providing access to the current namespace. This can be very useful both for debugging purposes and for situations where a blend of batch-processing and interactive exploration are needed. 3. Offer a flexible framework which can be used as the base environment for working with other systems, with Python as the underlying bridge language. Specifically scientific environments like Mathematica, IDL and Matlab inspired its design, but similar ideas can be useful in many fields. 4. Allow interactive testing of threaded graphical toolkits. IPython has support for interactive, non-blocking control of GTK, Qt, WX, GLUT, and OS X applications via special threading flags. The normal Python shell can only do this for Tkinter applications. Main features of the interactive shell -------------------------------------- * Dynamic object introspection. One can access docstrings, function definition prototypes, source code, source files and other details of any object accessible to the interpreter with a single keystroke (:samp:`?`, and using :samp:`??` provides additional detail). * Searching through modules and namespaces with :samp:`*` wildcards, both when using the :samp:`?` system and via the :samp:`%psearch` command. * Completion in the local namespace, by typing :kbd:`TAB` at the prompt. This works for keywords, modules, methods, variables and files in the current directory. This is supported via the ``prompt_toolkit`` library. Custom completers can be implemented easily for different purposes (system commands, magic arguments etc.) * Numbered input/output prompts with command history (persistent across sessions and tied to each profile), full searching in this history and caching of all input and output. * User-extensible 'magic' commands. A set of commands prefixed with :samp:`%` or :samp:`%%` is available for controlling IPython itself and provides directory control, namespace information and many aliases to common system shell commands. * Alias facility for defining your own system aliases. * Complete system shell access. Lines starting with :samp:`!` are passed directly to the system shell, and using :samp:`!!` or :samp:`var = !cmd` captures shell output into python variables for further use. * The ability to expand python variables when calling the system shell. In a shell command, any python variable prefixed with :samp:`$` is expanded. A double :samp:`$$` allows passing a literal :samp:`$` to the shell (for access to shell and environment variables like :envvar:`PATH`). * Filesystem navigation, via a magic :samp:`%cd` command, along with a persistent bookmark system (using :samp:`%bookmark`) for fast access to frequently visited directories. * A lightweight persistence framework via the :samp:`%store` command, which allows you to save arbitrary Python variables. These get restored when you run the :samp:`%store -r` command. * Automatic indentation and highlighting of code as you type (through the `prompt_toolkit` library). * Macro system for quickly re-executing multiple lines of previous input with a single name via the :samp:`%macro` command. Macros can be stored persistently via :samp:`%store` and edited via :samp:`%edit`. * Session logging (you can then later use these logs as code in your programs). Logs can optionally timestamp all input, and also store session output (marked as comments, so the log remains valid Python source code). * Session restoring: logs can be replayed to restore a previous session to the state where you left it. * Verbose and colored exception traceback printouts. Easier to parse visually, and in verbose mode they produce a lot of useful debugging information (basically a terminal version of the cgitb module). * Auto-parentheses via the :samp:`%autocall` command: callable objects can be executed without parentheses: :samp:`sin 3` is automatically converted to :samp:`sin(3)` * Auto-quoting: using :samp:`,`, or :samp:`;` as the first character forces auto-quoting of the rest of the line: :samp:`,my_function a b` becomes automatically :samp:`my_function("a","b")`, while :samp:`;my_function a b` becomes :samp:`my_function("a b")`. * Extensible input syntax. You can define filters that pre-process user input to simplify input in special situations. This allows for example pasting multi-line code fragments which start with :samp:`>>>` or :samp:`...` such as those from other python sessions or the standard Python documentation. * Flexible :ref:`configuration system `. It uses a configuration file which allows permanent setting of all command-line options, module loading, code and file execution. The system allows recursive file inclusion, so you can have a base file with defaults and layers which load other customizations for particular projects. * Embeddable. You can call IPython as a python shell inside your own python programs. This can be used both for debugging code or for providing interactive abilities to your programs with knowledge about the local namespaces (very useful in debugging and data analysis situations). * Easy debugger access. You can set IPython to call up an enhanced version of the Python debugger (pdb) every time there is an uncaught exception. This drops you inside the code which triggered the exception with all the data live and it is possible to navigate the stack to rapidly isolate the source of a bug. The :samp:`%run` magic command (with the :samp:`-d` option) can run any script under pdb's control, automatically setting initial breakpoints for you. This version of pdb has IPython-specific improvements, including tab-completion and traceback coloring support. For even easier debugger access, try :samp:`%debug` after seeing an exception. * Profiler support. You can run single statements (similar to :samp:`profile.run()`) or complete programs under the profiler's control. While this is possible with standard cProfile or profile modules, IPython wraps this functionality with magic commands (see :samp:`%prun` and :samp:`%run -p`) convenient for rapid interactive work. * Simple timing information. You can use the :samp:`%timeit` command to get the execution time of a Python statement or expression. This machinery is intelligent enough to do more repetitions for commands that finish very quickly in order to get a better estimate of their running time. .. sourcecode:: ipython In [1]: %timeit 1+1 7.88 ns ± 0.0494 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) In [2]: %timeit [math.sin(x) for x in range(5000)] 608 µs ± 5.57 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) .. To get the timing information for more than one expression, use the :samp:`%%timeit` cell magic command. * Doctest support. The special :samp:`%doctest_mode` command toggles a mode to use doctest-compatible prompts, so you can use IPython sessions as doctest code. By default, IPython also allows you to paste existing doctests, and strips out the leading :samp:`>>>` and :samp:`...` prompts in them. .. _ipythonzmq: Decoupled two-process model ============================== IPython has abstracted and extended the notion of a traditional *Read-Evaluate-Print Loop* (REPL) environment by decoupling the *evaluation* into its own process. We call this process a **kernel**: it receives execution instructions from clients and communicates the results back to them. This decoupling allows us to have several clients connected to the same kernel, and even allows clients and kernels to live on different machines. With the exclusion of the traditional single process terminal-based IPython (what you start if you run ``ipython`` without any subcommands), all other IPython machinery uses this two-process model. Most of this is now part of the `Jupyter` project, which includes ``jupyter console``, ``jupyter qtconsole``, and ``jupyter notebook``. As an example, this means that when you start ``jupyter qtconsole``, you're really starting two processes, a kernel and a Qt-based client which can send commands to and receive results from that kernel. If there is already a kernel running that you want to connect to, you can pass the ``--existing`` flag which will skip initiating a new kernel and connect to the most recent kernel, instead. To connect to a specific kernel once you have several kernels running, use the ``%connect_info`` magic to get the unique connection file, which will be something like ``--existing kernel-19732.json`` but with different numbers which correspond to the Process ID of the kernel. You can read more about using `jupyter qtconsole `_, and `jupyter notebook `_. There is also a :ref:`message spec ` which documents the protocol for communication between kernels and clients. .. seealso:: `Frontend/Kernel Model`_ example notebook Interactive parallel computing ============================== This functionality is optional and now part of the `ipyparallel `_ project. Portability and Python requirements ----------------------------------- Version 7.0+ supports Python 3.4 and higher. Versions 6.x support Python 3.3 and higher. Versions 2.0 to 5.x work with Python 2.7.x releases and Python 3.3 and higher. Version 1.0 additionally worked with Python 2.6 and 3.2. Version 0.12 was the first version to fully support Python 3. IPython is known to work on the following operating systems: * Linux * Most other Unix-like OSs (AIX, Solaris, BSD, etc.) * Mac OS X * Windows (CygWin, XP, Vista, etc.) See :ref:`here ` for instructions on how to install IPython. .. include:: links.txt ipython-8.35.0/docs/source/parallel/000077500000000000000000000000001477474304100173405ustar00rootroot00000000000000ipython-8.35.0/docs/source/parallel/index.rst000066400000000000000000000003461477474304100212040ustar00rootroot00000000000000:orphan: .. _parallel_index: ==================================== Using IPython for parallel computing ==================================== IPython.parallel has moved to `ipyparallel `_. ipython-8.35.0/docs/source/sphinx.toml000066400000000000000000000050741477474304100177600ustar00rootroot00000000000000title = "Sphinx configuration" [sphinx] templates_path = ["_templates"] master_doc = "index" project = "IPython" copyright = "The IPython Development Team" github_project_url = "https://github.com/ipython/ipython" source_suffix = ".rst" exclude_patterns = ["**.ipynb_checkpoints"] pygments_style = "sphinx" extensions = [ "sphinx.ext.autodoc", "sphinx.ext.autosummary", "sphinx.ext.doctest", "sphinx.ext.inheritance_diagram", "sphinx.ext.intersphinx", "sphinx.ext.graphviz", "sphinxcontrib.jquery", "IPython.sphinxext.ipython_console_highlighting", "IPython.sphinxext.ipython_directive", "sphinx.ext.napoleon", # to preprocess docstrings "github", # for easy GitHub links "magics", "configtraits", ] default_role = "literal" modindex_common_prefix = ["IPython."] [intersphinx_mapping] python = { url = 'https://docs.python.org/3/', fallback = '' } rpy2 = { url = 'https://rpy2.github.io/doc/latest/html/', fallback = '' } jupyterclient = { url = 'https://jupyter-client.readthedocs.io/en/latest/', fallback = '' } jupyter = { url = 'https://jupyter.readthedocs.io/en/latest/', fallback = '' } jedi = { url = 'https://jedi.readthedocs.io/en/latest/', fallback = '' } traitlets = { url = 'https://traitlets.readthedocs.io/en/latest/', fallback = '' } ipykernel = { url = 'https://ipykernel.readthedocs.io/en/latest/', fallback = '' } prompt_toolkit = { url = 'https://python-prompt-toolkit.readthedocs.io/en/stable/', fallback = '' } ipywidgets = { url = 'https://ipywidgets.readthedocs.io/en/stable/', fallback = '' } ipyparallel = { url = 'https://ipyparallel.readthedocs.io/en/stable/', fallback = '' } pip = { url = 'https://pip.pypa.io/en/stable/', fallback = '' } [html] html_theme = "sphinx_rtd_theme" html_static_path = ["_static"] html_favicon = "_static/favicon.ico" html_last_updated_fmt = "%b %d, %Y" htmlhelp_basename = "ipythondoc" html_additional_pages = [ ["interactive/htmlnotebook", "notebook_redirect.html"], ["interactive/notebook", "notebook_redirect.html"], ["interactive/nbconvert", "notebook_redirect.html"], ["interactive/public_server", "notebook_redirect.html"] ] [numpydoc] numpydoc_show_class_members = "False" numpydoc_class_members_toctree = "False" warning_is_error = "True" [latex] latex_documents = [ ['index', 'ipython.tex', 'IPython Documentation', 'The IPython Development Team', 'manual', 'True'], ['parallel/winhpc_index', 'winhpc_whitepaper.tex', 'Using IPython on Windows HPC Server 2008', "Brian E. Granger", 'manual', 'True'] ] latex_use_modindex = "True" latex_font_size = "11pt" ipython-8.35.0/docs/source/sphinxext.rst000066400000000000000000000326071477474304100203400ustar00rootroot00000000000000 .. _ipython_directive: ======================== IPython Sphinx Directive ======================== .. note:: The IPython Sphinx Directive is in 'beta' and currently under active development. Improvements to the code or documentation are welcome! .. |rst| replace:: reStructured text The :rst:dir:`ipython` directive is a stateful shell that can be used in |rst| files. It knows about standard ipython prompts, and extracts the input and output lines. These prompts will be renumbered starting at ``1``. The inputs will be fed to an embedded ipython interpreter and the outputs from that interpreter will be inserted as well. For example, code blocks like the following:: .. ipython:: In [136]: x = 2 In [137]: x**3 Out[137]: 8 will be rendered as .. ipython:: In [136]: x = 2 In [137]: x**3 Out[137]: 8 .. note:: This tutorial should be read side-by-side with the Sphinx source for this document because otherwise you will see only the rendered output and not the code that generated it. Excepting the example above, we will not in general be showing the literal ReST in this document that generates the rendered output. Directive and options ===================== The IPython directive takes a number of options detailed here. .. rst:directive:: ipython Create an IPython directive. .. rst:directive:option:: doctest Run a doctest on IPython code blocks in rst. .. rst:directive:option:: python Used to indicate that the relevant code block does not have IPython prompts. .. rst:directive:option:: okexcept Allow the code block to raise an exception. .. rst:directive:option:: okwarning Allow the code block to emit an warning. .. rst:directive:option:: suppress Silence any warnings or expected errors. .. rst:directive:option:: verbatim A noop that allows for any text to be syntax highlighted as valid IPython code. .. rst:directive:option:: savefig: OUTFILE [IMAGE_OPTIONS] Save output from matplotlib to *outfile*. It's important to note that all of these options can be used for the entire directive block or they can decorate individual lines of code as explained in :ref:`pseudo-decorators`. Persisting the Python session across IPython directive blocks ============================================================= The state from previous sessions is stored, and standard error is trapped. At doc build time, ipython's output and std err will be inserted, and prompts will be renumbered. So the prompt below should be renumbered in the rendered docs, and pick up where the block above left off. .. ipython:: :verbatim: In [138]: z = x*3 # x is recalled from previous block In [139]: z Out[139]: 6 In [142]: print(z) 6 In [141]: q = z[) # this is a syntax error -- we trap ipy exceptions ------------------------------------------------------------ File "", line 1 q = z[) # this is a syntax error -- we trap ipy exceptions ^ SyntaxError: invalid syntax Adding documentation tests to your IPython directive ==================================================== The embedded interpreter supports some limited markup. For example, you can put comments in your ipython sessions, which are reported verbatim. There are some handy "pseudo-decorators" that let you doctest the output. The inputs are fed to an embedded ipython session and the outputs from the ipython session are inserted into your doc. If the output in your doc and in the ipython session don't match on a doctest assertion, an error will occur. .. ipython:: In [1]: x = 'hello world' # this will raise an error if the ipython output is different @doctest In [2]: x.upper() Out[2]: 'HELLO WORLD' # some readline features cannot be supported, so we allow # "verbatim" blocks, which are dumped in verbatim except prompts # are continuously numbered @verbatim In [3]: x.st x.startswith x.strip For more information on @doctest decorator, please refer to the end of this page in Pseudo-Decorators section. Multi-line input ================ Multi-line input is supported. .. ipython:: :verbatim: In [130]: url = 'http://ichart.finance.yahoo.com/table.csv?s=CROX\ .....: &d=9&e=22&f=2009&g=d&a=1&br=8&c=2006&ignore=.csv' In [131]: print(url.split('&')) ['http://ichart.finance.yahoo.com/table.csv?s=CROX', 'd=9', 'e=22', Testing directive outputs ========================= The IPython Sphinx Directive makes it possible to test the outputs that you provide with your code. To do this, decorate the contents in your directive block with one of the options listed above. If an IPython doctest decorator is found, it will take these steps when your documentation is built: 1. Run the *input* lines in your IPython directive block against the current Python kernel (remember that the session persists across IPython directive blocks); 2. Compare the *output* of this with the output text that you've put in the IPython directive block (what comes after `Out[NN]`); 3. If there is a difference, the directive will raise an error and your documentation build will fail. You can do doctesting on multi-line output as well. Just be careful when using non-deterministic inputs like random numbers in the ipython directive, because your inputs are run through a live interpreter, so if you are doctesting random output you will get an error. Here we "seed" the random number generator for deterministic output, and we suppress the seed line so it doesn't show up in the rendered output .. ipython:: In [133]: import numpy.random @suppress In [134]: numpy.random.seed(2358) @doctest In [135]: numpy.random.rand(10,2) Out[135]: array([[0.64524308, 0.59943846], [0.47102322, 0.8715456 ], [0.29370834, 0.74776844], [0.99539577, 0.1313423 ], [0.16250302, 0.21103583], [0.81626524, 0.1312433 ], [0.67338089, 0.72302393], [0.7566368 , 0.07033696], [0.22591016, 0.77731835], [0.0072729 , 0.34273127]]) For more information on @suppress and @doctest decorators, please refer to the end of this file in Pseudo-Decorators section. Another demonstration of multi-line input and output .. ipython:: :verbatim: In [106]: print(x) jdh In [109]: for i in range(10): .....: print(i) .....: .....: 0 1 2 3 4 5 6 7 8 9 Most of the "pseudo-decorators" can be used an options to ipython mode. For example, to setup matplotlib pylab but suppress the output, you can do. When using the matplotlib ``use`` directive, it should occur before any import of pylab. This will not show up in the rendered docs, but the commands will be executed in the embedded interpreter and subsequent line numbers will be incremented to reflect the inputs:: .. ipython:: :suppress: In [144]: from matplotlib.pylab import * In [145]: ion() .. ipython:: :suppress: In [144]: from matplotlib.pylab import * In [145]: ion() Likewise, you can set ``:doctest:`` or ``:verbatim:`` to apply these settings to the entire block. For example, .. ipython:: :verbatim: In [9]: cd mpl/examples/ /home/jdhunter/mpl/examples In [10]: pwd Out[10]: '/home/jdhunter/mpl/examples' In [14]: cd mpl/examples/ mpl/examples/animation/ mpl/examples/misc/ mpl/examples/api/ mpl/examples/mplot3d/ mpl/examples/axes_grid/ mpl/examples/pylab_examples/ mpl/examples/event_handling/ mpl/examples/widgets In [14]: cd mpl/examples/widgets/ /home/msierig/mpl/examples/widgets In [15]: !wc * 2 12 77 README.txt 40 97 884 buttons.py 26 90 712 check_buttons.py 19 52 416 cursor.py 180 404 4882 menu.py 16 45 337 multicursor.py 36 106 916 radio_buttons.py 48 226 2082 rectangle_selector.py 43 118 1063 slider_demo.py 40 124 1088 span_selector.py 450 1274 12457 total You can create one or more pyplot plots and insert them with the ``@savefig`` decorator. For more information on @savefig decorator, please refer to the end of this page in Pseudo-Decorators section. .. ipython:: @savefig plot_simple.png width=4in In [151]: plot([1,2,3]); # use a semicolon to suppress the output @savefig hist_simple.png width=4in In [151]: hist(np.random.randn(10000), 100); In a subsequent session, we can update the current figure with some text, and then resave .. ipython:: In [151]: ylabel('number') In [152]: title('normal distribution') @savefig hist_with_text.png width=4in In [153]: grid(True) You can also have function definitions included in the source. .. ipython:: In [3]: def square(x): ...: """ ...: An overcomplicated square function as an example. ...: """ ...: if x < 0: ...: x = abs(x) ...: y = x * x ...: return y ...: Then call it from a subsequent section. .. ipython:: In [4]: square(3) Out [4]: 9 In [5]: square(-2) Out [5]: 4 Writing Pure Python Code ------------------------ Pure python code is supported by the optional argument `python`. In this pure python syntax you do not include the output from the python interpreter. The following markup:: .. ipython:: python foo = 'bar' print(foo) foo = 2 foo**2 Renders as .. ipython:: python foo = 'bar' print(foo) foo = 2 foo**2 We can even plot from python, using the savefig decorator, as well as, suppress output with a semicolon .. ipython:: python @savefig plot_simple_python.png width=4in plot([1,2,3]); For more information on @savefig decorator, please refer to the end of this page in Pseudo-Decorators section. Similarly, std err is inserted .. ipython:: python :okexcept: foo = 'bar' foo[) Handling Comments ================== Comments are handled and state is preserved .. ipython:: python # comments are handled print(foo) If you don't see the next code block then the options work. .. ipython:: python :suppress: ioff() ion() Splitting Python statements across lines ======================================== Multi-line input is handled. .. ipython:: python line = 'Multi\ line &\ support &\ works' print(line.split('&')) Functions definitions are correctly parsed .. ipython:: python def square(x): """ An overcomplicated square function as an example. """ if x < 0: x = abs(x) y = x * x return y And persist across sessions .. ipython:: python print(square(3)) print(square(-2)) Pretty much anything you can do with the ipython code, you can do with a simple python script. Obviously, though it doesn't make sense to use the doctest option. .. _pseudo-decorators: Pseudo-Decorators ================= Here are the supported decorators, and any optional arguments they take. Some of the decorators can be used as options to the entire block (eg ``verbatim`` and ``suppress``), and some only apply to the line just below them (eg ``savefig``). @suppress execute the ipython input block, but suppress the input and output block from the rendered output. Also, can be applied to the entire ``.. ipython`` block as a directive option with ``:suppress:``. @verbatim insert the input and output block in verbatim, but auto-increment the line numbers. Internally, the interpreter will be fed an empty string, so it is a no-op that keeps line numbering consistent. Also, can be applied to the entire ``.. ipython`` block as a directive option with ``:verbatim:``. @savefig OUTFILE [IMAGE_OPTIONS] save the figure to the static directory and insert it into the document, possibly binding it into a minipage and/or putting code/figure label/references to associate the code and the figure. Takes args to pass to the image directive (*scale*, *width*, etc can be kwargs); see `image options `_ for details. @doctest Compare the pasted in output in the ipython block with the output generated at doc build time, and raise errors if they don't match. Also, can be applied to the entire ``.. ipython`` block as a directive option with ``:doctest:``. Configuration Options ===================== ipython_savefig_dir The directory in which to save the figures. This is relative to the Sphinx source directory. The default is `html_static_path`. ipython_rgxin The compiled regular expression to denote the start of IPython input lines. The default is `re.compile('In \[(\d+)\]:\s?(.*)\s*')`. You shouldn't need to change this. ipython_rgxout The compiled regular expression to denote the start of IPython output lines. The default is `re.compile('Out\[(\d+)\]:\s?(.*)\s*')`. You shouldn't need to change this. ipython_promptin The string to represent the IPython input prompt in the generated ReST. The default is `'In [%d]:'`. This expects that the line numbers are used in the prompt. ipython_promptout The string to represent the IPython prompt in the generated ReST. The default is `'Out [%d]:'`. This expects that the line numbers are used in the prompt. Automatically generated documentation ===================================== .. automodule:: IPython.sphinxext.ipython_directive ipython-8.35.0/docs/source/whatsnew/000077500000000000000000000000001477474304100174045ustar00rootroot00000000000000ipython-8.35.0/docs/source/whatsnew/development.rst000066400000000000000000000011531477474304100224600ustar00rootroot00000000000000===================== Development version ===================== This document describes in-flight development work. .. warning:: Please do not edit this file by hand (doing so will likely cause merge conflicts for other Pull Requests). Instead, create a new file in the `docs/source/whatsnew/pr` folder Released .... ...., 2019 Need to be updated: .. toctree:: :maxdepth: 2 :glob: pr/* .. DO NOT EDIT THIS LINE BEFORE RELEASE. FEATURE INSERTION POINT. Backwards incompatible changes ------------------------------ .. DO NOT EDIT THIS LINE BEFORE RELEASE. INCOMPAT INSERTION POINT. ipython-8.35.0/docs/source/whatsnew/github-stats-0.11.rst000066400000000000000000001442421477474304100231400ustar00rootroot00000000000000.. _issues_list_011: Issues closed in the 0.11 development cycle =========================================== In this cycle, we closed a total of 511 issues, 226 pull requests and 285 regular issues; this is the full list (generated with the script `tools/github_stats.py`). We should note that a few of these were made on the 0.10.x series, but we have no automatic way of filtering the issues by branch, so this reflects all of our development over the last two years, including work already released in 0.10.2: Pull requests (226): * `620 `_: Release notes and updates to GUI support docs for 0.11 * `642 `_: fix typo in docs/examples/vim/README.rst * `631 `_: two-way vim-ipython integration * `637 `_: print is a function, this allows to properly exit ipython * `635 `_: support html representations in the notebook frontend * `639 `_: Updating the credits file * `628 `_: import pexpect from IPython.external in irunner * `596 `_: Irunner * `598 `_: Fix templates for CrashHandler * `590 `_: Desktop * `600 `_: Fix bug with non-ascii reprs inside pretty-printed lists. * `618 `_: I617 * `599 `_: Gui Qt example and docs * `619 `_: manpage update * `582 `_: Updating sympy profile to match the exec_lines of isympy. * `578 `_: Check to see if correct source for decorated functions can be displayed * `589 `_: issue 588 * `591 `_: simulate shell expansion on %run arguments, at least tilde expansion * `576 `_: Show message about %paste magic on an IndentationError * `574 `_: Getcwdu * `565 `_: don't move old config files, keep nagging the user * `575 `_: Added more docstrings to IPython.zmq.session. * `567 `_: fix trailing whitespace from resetting indentation * `564 `_: Command line args in docs * `560 `_: reorder qt support in kernel * `561 `_: command-line suggestions * `556 `_: qt_for_kernel: use matplotlib rcParams to decide between PyQt4 and PySide * `557 `_: Update usage.py to newapp * `555 `_: Rm default old config * `552 `_: update parallel code for py3k * `504 `_: Updating string formatting * `551 `_: Make pylab import all configurable * `496 `_: Qt editing keybindings * `550 `_: Support v2 PyQt4 APIs and PySide in kernel's GUI support * `546 `_: doc update * `548 `_: Fix sympy profile to work with sympy 0.7. * `542 `_: issue 440 * `533 `_: Remove unused configobj and validate libraries from externals. * `538 `_: fix various tests on Windows * `540 `_: support ``-pylab`` flag with deprecation warning * `537 `_: Docs update * `536 `_: ``setup.py install`` depends on setuptools on Windows * `480 `_: Get help mid-command * `462 `_: Str and Bytes traitlets * `534 `_: Handle unicode properly in IPython.zmq.iostream * `527 `_: ZMQ displayhook * `526 `_: Handle asynchronous output in Qt console * `528 `_: Do not import deprecated functions from external decorators library. * `454 `_: New BaseIPythonApplication * `532 `_: Zmq unicode * `531 `_: Fix Parallel test * `525 `_: fallback on lsof if otool not found in libedit detection * `517 `_: Merge IPython.parallel.streamsession into IPython.zmq.session * `521 `_: use dict.get(key) instead of dict[key] for safety from KeyErrors * `492 `_: add QtConsoleApp using newapplication * `485 `_: terminal IPython with newapp * `486 `_: Use newapp in parallel code * `511 `_: Add a new line before displaying multiline strings in the Qt console. * `509 `_: i508 * `501 `_: ignore EINTR in channel loops * `495 `_: Better selection of Qt bindings when QT_API is not specified * `498 `_: Check for .pyd as extension for binary files. * `494 `_: QtConsole zoom adjustments * `490 `_: fix UnicodeEncodeError writing SVG string to .svg file, fixes #489 * `491 `_: add QtConsoleApp using newapplication * `479 `_: embed() doesn't load default config * `483 `_: Links launchpad -> github * `419 `_: %xdel magic * `477 `_: Add \n to lines in the log * `459 `_: use os.system for shell.system in Terminal frontend * `475 `_: i473 * `471 `_: Add test decorator onlyif_unicode_paths. * `474 `_: Fix support for raw GTK and WX matplotlib backends. * `472 `_: Kernel event loop is robust against random SIGINT. * `460 `_: Share code for magic_edit * `469 `_: Add exit code when running all tests with iptest. * `464 `_: Add home directory expansion to IPYTHON_DIR environment variables. * `455 `_: Bugfix with logger * `448 `_: Separate out skip_doctest decorator * `453 `_: Draft of new main BaseIPythonApplication. * `452 `_: Use list/tuple/dict/set subclass's overridden __repr__ instead of the pretty * `398 `_: allow toggle of svg/png inline figure format * `381 `_: Support inline PNGs of matplotlib plots * `413 `_: Retries and Resubmit (#411 and #412) * `370 `_: Fixes to the display system * `449 `_: Fix issue 447 - inspecting old-style classes. * `423 `_: Allow type checking on elements of List,Tuple,Set traits * `400 `_: Config5 * `421 `_: Generalise mechanism to put text at the next prompt in the Qt console. * `443 `_: pinfo code duplication * `429 `_: add check_pid, and handle stale PID info in ipcluster. * `431 `_: Fix error message in test_irunner * `427 `_: handle different SyntaxError messages in test_irunner * `424 `_: Irunner test failure * `430 `_: Small parallel doc typo * `422 `_: Make ipython-qtconsole a GUI script * `420 `_: Permit kernel std* to be redirected * `408 `_: History request * `388 `_: Add Emacs-style kill ring to Qt console * `414 `_: Warn on old config files * `415 `_: Prevent prefilter from crashing IPython * `418 `_: Minor configuration doc fixes * `407 `_: Update What's new documentation * `410 `_: Install notebook frontend * `406 `_: install IPython.zmq.gui * `393 `_: ipdir unicode * `397 `_: utils.io.Term.cin/out/err -> utils.io.stdin/out/err * `389 `_: DB fixes and Scheduler HWM * `374 `_: Various Windows-related fixes to IPython.parallel * `362 `_: fallback on defaultencoding if filesystemencoding is None * `382 `_: Shell's reset method clears namespace from last %run command. * `385 `_: Update iptest exclusions (fix #375) * `383 `_: Catch errors in querying readline which occur with pyreadline. * `373 `_: Remove runlines etc. * `364 `_: Single output * `372 `_: Multiline input push * `363 `_: Issue 125 * `361 `_: don't rely on setuptools for readline dependency check * `349 `_: Fix %autopx magic * `355 `_: History save thread * `356 `_: Usability improvements to history in Qt console * `357 `_: Exit autocall * `353 `_: Rewrite quit()/exit()/Quit()/Exit() calls as magic * `354 `_: Cell tweaks * `345 `_: Attempt to address (partly) issue ipython/#342 by rewriting quit(), exit(), etc. * `352 `_: #342: Try to recover as intelligently as possible if user calls magic(). * `346 `_: Dedent prefix bugfix + tests: #142 * `348 `_: %reset doesn't reset prompt number. * `347 `_: Make ip.reset() work the same in interactive or non-interactive code. * `343 `_: make readline a dependency on OSX * `344 `_: restore auto debug behavior * `339 `_: fix for issue 337: incorrect/phantom tooltips for magics * `254 `_: newparallel branch (add zmq.parallel submodule) * `334 `_: Hard reset * `316 `_: Unicode win process * `332 `_: AST splitter * `325 `_: Removetwisted * `330 `_: Magic pastebin * `309 `_: Bug tests for GH Issues 238, 284, 306, 307. Skip module machinery if not installed. Known failures reported as 'K' * `331 `_: Tweak config loader for PyPy compatibility. * `319 `_: Rewrite code to restore readline history after an action * `329 `_: Do not store file contents in history when running a .ipy file. * `179 `_: Html notebook * `323 `_: Add missing external.pexpect to packages * `295 `_: Magic local scope * `315 `_: Unicode magic args * `310 `_: allow Unicode Command-Line options * `313 `_: Readline shortcuts * `311 `_: Qtconsole exit * `312 `_: History memory * `294 `_: Issue 290 * `292 `_: Issue 31 * `252 `_: Unicode issues * `235 `_: Fix history magic command's bugs wrt to full history and add -O option to display full history * `236 `_: History minus p flag * `261 `_: Adapt magic commands to new history system. * `282 `_: SQLite history * `191 `_: Unbundle external libraries * `199 `_: Magic arguments * `204 `_: Emacs completion bugfix * `293 `_: Issue 133 * `249 `_: Writing unicode characters to a log file. (IPython 0.10.2.git) * `283 `_: Support for 256-color escape sequences in Qt console * `281 `_: Refactored and improved Qt console's HTML export facility * `237 `_: Fix185 (take two) * `251 `_: Issue 129 * `278 `_: add basic XDG_CONFIG_HOME support * `275 `_: inline pylab cuts off labels on log plots * `280 `_: Add %precision magic * `259 `_: Pyside support * `193 `_: Make ipython cProfile-able * `272 `_: Magic examples * `219 `_: Doc magic pycat * `221 `_: Doc magic alias * `230 `_: Doc magic edit * `224 `_: Doc magic cpaste * `229 `_: Doc magic pdef * `273 `_: Docs build * `228 `_: Doc magic who * `233 `_: Doc magic cd * `226 `_: Doc magic pwd * `218 `_: Doc magic history * `231 `_: Doc magic reset * `225 `_: Doc magic save * `222 `_: Doc magic timeit * `223 `_: Doc magic colors * `203 `_: Small typos in zmq/blockingkernelmanager.py * `227 `_: Doc magic logon * `232 `_: Doc magic profile * `264 `_: Kernel logging * `220 `_: Doc magic edit * `268 `_: PyZMQ >= 2.0.10 * `267 `_: GitHub Pages (again) * `266 `_: OSX-specific fixes to the Qt console * `255 `_: Gitwash typo * `265 `_: Fix string input2 * `260 `_: Kernel crash with empty history * `243 `_: New display system * `242 `_: Fix terminal exit * `250 `_: always use Session.send * `239 `_: Makefile command & script for GitHub Pages * `244 `_: My exit * `234 `_: Timed history save * `217 `_: Doc magic lsmagic * `215 `_: History fix * `195 `_: Formatters * `192 `_: Ready colorize bug * `198 `_: Windows workdir * `174 `_: Whitespace cleanup * `188 `_: Version info: update our version management system to use git. * `158 `_: Ready for merge * `187 `_: Resolved Print shortcut collision with ctrl-P emacs binding * `183 `_: cleanup of exit/quit commands for qt console * `184 `_: Logo added to sphinx docs * `180 `_: Cleanup old code * `171 `_: Expose Pygments styles as options * `170 `_: HTML Fixes * `172 `_: Fix del method exit test * `164 `_: Qt frontend shutdown behavior fixes and enhancements * `167 `_: Added HTML export * `163 `_: Execution refactor * `159 `_: Ipy3 preparation * `155 `_: Ready startup fix * `152 `_: 0.10.1 sge * `151 `_: mk_object_info -> object_info * `149 `_: Simple bug-fix Regular issues (285): * `630 `_: new.py in pwd prevents ipython from starting * `623 `_: Execute DirectView commands while running LoadBalancedView tasks * `437 `_: Users should have autocompletion in the notebook * `583 `_: update manpages * `594 `_: irunner command line options defer to file extensions * `603 `_: Users should see colored text in tracebacks and the pager * `597 `_: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 * `608 `_: Organize and layout buttons in the notebook panel sections * `609 `_: Implement controls in the Kernel panel section * `611 `_: Add kernel status widget back to notebook * `610 `_: Implement controls in the Cell section panel * `612 `_: Implement Help panel section * `621 `_: [qtconsole] on windows xp, cannot PageUp more than once * `616 `_: Store exit status of last command * `605 `_: Users should be able to open different notebooks in the cwd * `302 `_: Users should see a consistent behavior in the Out prompt in the html notebook * `435 `_: Notebook should not import anything by default * `595 `_: qtconsole command issue * `588 `_: ipython-qtconsole uses 100% CPU * `586 `_: ? + plot() Command B0rks QTConsole Strangely * `585 `_: %pdoc throws Errors for classes without __init__ or docstring * `584 `_: %pdoc throws TypeError * `580 `_: Client instantiation AssertionError * `569 `_: UnicodeDecodeError during startup * `572 `_: Indented command hits error * `573 `_: -wthread breaks indented top-level statements * `570 `_: "--pylab inline" vs. "--pylab=inline" * `566 `_: Can't use exec_file in config file * `562 `_: update docs to reflect '--args=values' * `558 `_: triple quote and %s at beginning of line * `554 `_: Update 0.11 docs to explain Qt console and how to do a clean install * `553 `_: embed() fails if config files not installed * `8 `_: Ensure %gui qt works with new Mayavi and pylab * `269 `_: Provide compatibility api for IPython.Shell().start().mainloop() * `66 `_: Update the main What's New document to reflect work on 0.11 * `549 `_: Don't check for 'linux2' value in sys.platform * `505 `_: Qt windows created within imported functions won't show() * `545 `_: qtconsole ignores exec_lines * `371 `_: segfault in qtconsole when kernel quits * `377 `_: Failure: error (nothing to repeat) * `544 `_: Ipython qtconsole pylab config issue. * `543 `_: RuntimeError in completer * `440 `_: %run filename autocompletion "The kernel heartbeat has been inactive ... " error * `541 `_: log_level is broken in the ipython Application * `369 `_: windows source install doesn't create scripts correctly * `351 `_: Make sure that the Windows installer handles the top-level IPython scripts. * `512 `_: Two displayhooks in zmq * `340 `_: Make sure that the Windows HPC scheduler support is working for 0.11 * `98 `_: Should be able to get help on an object mid-command * `529 `_: unicode problem in qtconsole for windows * `476 `_: Separate input area in Qt Console * `175 `_: Qt console needs configuration support * `156 `_: Key history lost when debugging program crash * `470 `_: decorator: uses deprecated features * `30 `_: readline in OS X does not have correct key bindings * `503 `_: merge IPython.parallel.streamsession and IPython.zmq.session * `456 `_: pathname in document punctuated by dots not slashes * `451 `_: Allow switching the default image format for inline mpl backend * `79 `_: Implement more robust handling of config stages in Application * `522 `_: Encoding problems * `524 `_: otool should not be unconditionally called on osx * `523 `_: Get profile and config file inheritance working * `519 `_: qtconsole --pure: "TypeError: string indices must be integers, not str" * `516 `_: qtconsole --pure: "KeyError: 'ismagic'" * `520 `_: qtconsole --pure: "TypeError: string indices must be integers, not str" * `450 `_: resubmitted tasks sometimes stuck as pending * `518 `_: JSON serialization problems with ObjectId type (MongoDB) * `178 `_: Channels should be named for their function, not their socket type * `515 `_: [ipcluster] termination on os x * `510 `_: qtconsole: indentation problem printing numpy arrays * `508 `_: "AssertionError: Missing message part." in ipython-qtconsole --pure * `499 `_: "ZMQError: Interrupted system call" when saving inline figure * `426 `_: %edit magic fails in qtconsole * `497 `_: Don't show info from .pyd files * `493 `_: QFont::setPointSize: Point size <= 0 (0), must be greater than 0 * `489 `_: UnicodeEncodeError in qt.svg.save_svg * `458 `_: embed() doesn't load default config * `488 `_: Using IPython with RubyPython leads to problems with IPython.parallel.client.client.Client.__init() * `401 `_: Race condition when running lbview.apply() fast multiple times in loop * `168 `_: Scrub Launchpad links from code, docs * `141 `_: garbage collection problem (revisited) * `59 `_: test_magic.test_obj_del fails on win32 * `457 `_: Backgrounded Tasks not Allowed? (but easy to slip by . . .) * `297 `_: Shouldn't use pexpect for subprocesses in in-process terminal frontend * `110 `_: magic to return exit status * `473 `_: OSX readline detection fails in the debugger * `466 `_: tests fail without unicode filename support * `468 `_: iptest script has 0 exit code even when tests fail * `465 `_: client.db_query() behaves different with SQLite and MongoDB * `467 `_: magic_install_default_config test fails when there is no .ipython directory * `463 `_: IPYTHON_DIR (and IPYTHONDIR) don't expand tilde to '~' directory * `446 `_: Test machinery is imported at normal runtime * `438 `_: Users should be able to use Up/Down for cell navigation * `439 `_: Users should be able to copy notebook input and output * `291 `_: Rename special display methods and put them lower in priority than display functions * `447 `_: Instantiating classes without __init__ function causes kernel to crash * `444 `_: Ctrl + t in WxIPython Causes Unexpected Behavior * `445 `_: qt and console Based Startup Errors * `428 `_: ipcluster doesn't handle stale pid info well * `434 `_: 10.0.2 seg fault with rpy2 * `441 `_: Allow running a block of code in a file * `432 `_: Silent request fails * `409 `_: Test failure in IPython.lib * `402 `_: History section of messaging spec is incorrect * `88 `_: Error when inputting UTF8 CJK characters * `366 `_: Ctrl-K should kill line and store it, so that Ctrl-y can yank it back * `425 `_: typo in %gui magic help * `304 `_: Persistent warnings if old configuration files exist * `216 `_: crash of ipython when alias is used with %s and echo * `412 `_: add support to automatic retry of tasks * `411 `_: add support to continue tasks * `417 `_: IPython should display things unsorted if it can't sort them * `416 `_: wrong encode when printing unicode string * `376 `_: Failing InputsplitterTest * `405 `_: TraitError in traitlets.py(332) on any input * `392 `_: UnicodeEncodeError on start * `137 `_: sys.getfilesystemencoding return value not checked * `300 `_: Users should be able to manage kernels and kernel sessions from the notebook UI * `301 `_: Users should have access to working Kernel, Tabs, Edit, Help menus in the notebook * `396 `_: cursor move triggers a lot of IO access * `379 `_: Minor doc nit: --paging argument * `399 `_: Add task queue limit in engine when load-balancing * `78 `_: StringTask won't take unicode code strings * `391 `_: MongoDB.add_record() does not work in 0.11dev * `365 `_: newparallel on Windows * `386 `_: FAIL: test that pushed functions have access to globals * `387 `_: Interactively defined functions can't access user namespace * `118 `_: Snow Leopard ipy_vimserver POLL error * `394 `_: System escape interpreted in multi-line string * `26 `_: find_job_cmd is too hasty to fail on Windows * `368 `_: Installation instructions in dev docs are completely wrong * `380 `_: qtconsole pager RST - HTML not happening consistently * `367 `_: Qt console doesn't support ibus input method * `375 `_: Missing libraries cause ImportError in tests * `71 `_: temp file errors in iptest IPython.core * `350 `_: Decide how to handle displayhook being triggered multiple times * `360 `_: Remove `runlines` method * `125 `_: Exec lines in config should not contribute to line numbering or history * `20 `_: Robust readline support on OS X's builtin Python * `147 `_: On Windows, %page is being too restrictive to split line by \r\n only * `326 `_: Update docs and examples for parallel stuff to reflect movement away from Twisted * `341 `_: FIx Parallel Magics for newparallel * `338 `_: Usability improvements to Qt console * `142 `_: unexpected auto-indenting when variables names that start with 'pass' * `296 `_: Automatic PDB via %pdb doesn't work * `337 `_: exit( and quit( in Qt console produces phantom signature/docstring popup, even though quit() or exit() raises NameError * `318 `_: %debug broken in master: invokes missing save_history() method * `307 `_: lines ending with semicolon should not go to cache * `104 `_: have ipengine run start-up scripts before registering with the controller * `33 `_: The skip_doctest decorator is failing to work on Shell.MatplotlibShellBase.magic_run * `336 `_: Missing figure development/figs/iopubfade.png for docs * `49 `_: %clear should also delete _NN references and Out[NN] ones * `335 `_: using setuptools installs every script twice * `306 `_: multiline strings at end of input cause noop * `327 `_: PyPy compatibility * `328 `_: %run script.ipy raises "ERROR! Session/line number was not unique in database." * `7 `_: Update the changes doc to reflect the kernel config work * `303 `_: Users should be able to scroll a notebook w/o moving the menu/buttons * `322 `_: Embedding an interactive IPython shell * `321 `_: %debug broken in master * `287 `_: Crash when using %macros in sqlite-history branch * `55 `_: Can't edit files whose names begin with numbers * `284 `_: In variable no longer works in 0.11 * `92 `_: Using multiprocessing module crashes parallel IPython * `262 `_: Fail to recover history after force-kill. * `320 `_: Tab completing re.search objects crashes IPython * `317 `_: IPython.kernel: parallel map issues * `197 `_: ipython-qtconsole unicode problem in magic ls * `305 `_: more readline shortcuts in qtconsole * `314 `_: Multi-line, multi-block cells can't be executed. * `308 `_: Test suite should set sqlite history to work in :memory: * `202 `_: Matplotlib native 'MacOSX' backend broken in '-pylab' mode * `196 `_: IPython can't deal with unicode file name. * `25 `_: unicode bug - encoding input * `290 `_: try/except/else clauses can't be typed, code input stops too early. * `43 `_: Implement SSH support in ipcluster * `6 `_: Update the Sphinx docs for the new ipcluster * `9 `_: Getting "DeadReferenceError: Calling Stale Broker" after ipcontroller restart * `132 `_: Ipython prevent south from working * `27 `_: generics.complete_object broken * `60 `_: Improve absolute import management for iptest.py * `31 `_: Issues in magic_whos code * `52 `_: Document testing process better * `44 `_: Merge history from multiple sessions * `182 `_: ipython q4thread in version 10.1 not starting properly * `143 `_: Ipython.gui.wx.ipython_view.IPShellWidget: ignores user*_ns arguments * `127 `_: %edit does not work on filenames consisted of pure numbers * `126 `_: Can't transfer command line argument to script * `28 `_: Offer finer control for initialization of input streams * `58 `_: ipython change char '0xe9' to 4 spaces * `68 `_: Problems with Control-C stopping ipcluster on Windows/Python2.6 * `24 `_: ipcluster does not start all the engines * `240 `_: Incorrect method displayed in %psource * `120 `_: inspect.getsource fails for functions defined on command line * `212 `_: IPython ignores exceptions in the first evaulation of class attrs * `108 `_: ipython disables python logger * `100 `_: Overzealous introspection * `18 `_: %cpaste freeze sync frontend * `200 `_: Unicode error when starting ipython in a folder with non-ascii path * `130 `_: Deadlock when importing a module that creates an IPython client * `134 `_: multline block scrolling * `46 `_: Input to %timeit is not preparsed * `285 `_: ipcluster local -n 4 fails * `205 `_: In the Qt console, Tab should insert 4 spaces when not completing * `145 `_: Bug on MSW systems: idle can not be set as default IPython editor. Fix Suggested. * `77 `_: ipython oops in cygwin * `121 `_: If plot windows are closed via window controls, no more plotting is possible. * `111 `_: Iterator version of TaskClient.map() that returns results as they become available * `109 `_: WinHPCLauncher is a hard dependency that causes errors in the test suite * `86 `_: Make IPython work with multiprocessing * `15 `_: Implement SGE support in ipcluster * `3 `_: Implement PBS support in ipcluster * `53 `_: Internal Python error in the inspect module * `74 `_: Manager() [from multiprocessing module] hangs ipythonx but not ipython * `51 `_: Out not working with ipythonx * `201 `_: use session.send throughout zmq code * `115 `_: multiline specials not defined in 0.11 branch * `93 `_: when looping, cursor appears at leftmost point in newline * `133 `_: whitespace after Source introspection * `50 `_: Ctrl-C with -gthread on Windows, causes uncaught IOError * `65 `_: Do not use .message attributes in exceptions, deprecated in 2.6 * `76 `_: syntax error when raise is inside except process * `107 `_: bdist_rpm causes traceback looking for a non-existant file * `113 `_: initial magic ? (question mark) fails before wildcard * `128 `_: Pdb instance has no attribute 'curframe' * `139 `_: running with -pylab pollutes namespace * `140 `_: malloc error during tab completion of numpy array member functions starting with 'c' * `153 `_: ipy_vimserver traceback on Windows * `154 `_: using ipython in Slicer3 show how os.environ['HOME'] is not defined * `185 `_: show() blocks in pylab mode with ipython 0.10.1 * `189 `_: Crash on tab completion * `274 `_: bashism in sshx.sh * `276 `_: Calling `sip.setapi` does not work if app has already imported from PyQt4 * `277 `_: matplotlib.image imgshow from 10.1 segfault * `288 `_: Incorrect docstring in zmq/kernelmanager.py * `286 `_: Fix IPython.Shell compatibility layer * `99 `_: blank lines in history * `129 `_: psearch: TypeError: expected string or buffer * `190 `_: Add option to format float point output * `246 `_: Application not conforms XDG Base Directory Specification * `48 `_: IPython should follow the XDG Base Directory spec for configuration * `176 `_: Make client-side history persistence readline-independent * `279 `_: Backtraces when using ipdb do not respect -colour LightBG setting * `119 `_: Broken type filter in magic_who_ls * `271 `_: Intermittent problem with print output in Qt console. * `270 `_: Small typo in IPython developer’s guide * `166 `_: Add keyboard accelerators to Qt close dialog * `173 `_: asymmetrical ctrl-A/ctrl-E behavior in multiline * `45 `_: Autosave history for robustness * `162 `_: make command history persist in ipythonqt * `161 `_: make ipythonqt exit without dialog when exit() is called * `263 `_: [ipython + numpy] Some test errors * `256 `_: reset docstring ipython 0.10 * `258 `_: allow caching to avoid matplotlib object references * `248 `_: Can't open and read files after upgrade from 0.10 to 0.10.0 * `247 `_: ipython + Stackless * `245 `_: Magic save and macro missing newlines, line ranges don't match prompt numbers. * `241 `_: "exit" hangs on terminal version of IPython * `213 `_: ipython -pylab no longer plots interactively on 0.10.1 * `4 `_: wx frontend don't display well commands output * `5 `_: ls command not supported in ipythonx wx frontend * `1 `_: Document winhpcjob.py and launcher.py * `83 `_: Usage of testing.util.DeferredTestCase should be replace with twisted.trial.unittest.TestCase * `117 `_: Redesign how Component instances are tracked and queried * `47 `_: IPython.kernel.client cannot be imported inside an engine * `105 `_: Refactor the task dependencies system * `210 `_: 0.10.1 doc mistake - New IPython Sphinx directive error * `209 `_: can't activate IPython parallel magics * `206 `_: Buggy linewrap in Mac OSX Terminal * `194 `_: !sudo displays password in plain text * `186 `_: %edit issue under OS X 10.5 - IPython 0.10.1 * `11 `_: Create a daily build PPA for ipython * `144 `_: logo missing from sphinx docs * `181 `_: cls command does not work on windows * `169 `_: Kernel can only be bound to localhost * `36 `_: tab completion does not escape () * `177 `_: Report tracebacks of interactively entered input * `148 `_: dictionary having multiple keys having frozenset fails to print on IPython * `160 `_: magic_gui throws TypeError when gui magic is used * `150 `_: History entries ending with parentheses corrupt command line on OS X 10.6.4 * `146 `_: -ipythondir - using an alternative .ipython dir for rc type stuff * `114 `_: Interactive strings get mangled with "_ip.magic" * `135 `_: crash on invalid print * `69 `_: Usage of "mycluster" profile in docs and examples * `37 `_: Fix colors in output of ResultList on Windows ipython-8.35.0/docs/source/whatsnew/github-stats-0.12.rst000066400000000000000000001632411477474304100231410ustar00rootroot00000000000000.. _issues_list_012: Issues closed in the 0.12 development cycle =========================================== Issues closed in 0.12.1 ----------------------- GitHub stats for bugfix release 0.12.1 (12/28/2011-04/16/2012), backporting pull requests from 0.13. We closed a total of 71 issues: 44 pull requests and 27 issues; this is the full list (generated with the script `tools/github_stats.py`). This list is automatically generated, and may be incomplete: Pull Requests (44): * :ghpull:`1175`: core.completer: Clean up excessive and unused code. * :ghpull:`1187`: misc notebook: connection file cleanup, first heartbeat, startup flush * :ghpull:`1190`: Fix link to Chris Fonnesbeck blog post about 0.11 highlights. * :ghpull:`1196`: docs: looks like a file path might have been accidentally pasted in the middle of a word * :ghpull:`1206`: don't preserve fixConsole output in json * :ghpull:`1207`: fix loadpy duplicating newlines * :ghpull:`1213`: BUG: Minor typo in history_console_widget.py * :ghpull:`1218`: Added -q option to %prun for suppression of the output, along with editing the dochelp string. * :ghpull:`1222`: allow Reference as callable in map/apply * :ghpull:`1229`: Fix display of SyntaxError in Python 3 * :ghpull:`1246`: Skip tests that require X, when importing pylab results in RuntimeError. * :ghpull:`1253`: set auto_create flag for notebook apps * :ghpull:`1257`: use self.kernel_manager_class in qtconsoleapp * :ghpull:`1262`: Heartbeat no longer shares the app's Context * :ghpull:`1283`: HeartMonitor.period should be an Integer * :ghpull:`1284`: a fix for GH 1269 * :ghpull:`1289`: Make autoreload extension work on Python 3. * :ghpull:`1306`: Fix %prun input parsing for escaped characters (closes #1302) * :ghpull:`1312`: minor heartbeat tweaks * :ghpull:`1318`: make Ctrl-D in qtconsole act same as in terminal (ready to merge) * :ghpull:`1341`: Don't attempt to tokenize binary files for tracebacks * :ghpull:`1353`: Save notebook as script using unicode file handle. * :ghpull:`1363`: Fix some minor color/style config issues in the qtconsole * :ghpull:`1364`: avoid jsonlib returning Decimal * :ghpull:`1369`: load header with engine id when engine dies in TaskScheduler * :ghpull:`1370`: allow draft76 websockets (Safari) * :ghpull:`1374`: remove calls to meaningless ZMQStream.on_err * :ghpull:`1377`: Saving non-ascii history * :ghpull:`1396`: Fix for %tb magic. * :ghpull:`1402`: fix symlinked /home issue for FreeBSD * :ghpull:`1413`: get_home_dir expands symlinks, adjust test accordingly * :ghpull:`1414`: ignore errors in shell.var_expand * :ghpull:`1430`: Fix for tornado check for tornado < 1.1.0 * :ghpull:`1445`: Don't build sphinx docs for sdists * :ghpull:`1463`: Fix completion when importing modules in the cwd. * :ghpull:`1477`: fix dangling `buffer` in IPython.parallel.util * :ghpull:`1495`: BUG: Fix pretty-printing for overzealous objects * :ghpull:`1496`: BUG: LBYL when clearing the output history on shutdown. * :ghpull:`1514`: DOC: Fix references to IPython.lib.pretty instead of the old location * :ghpull:`1517`: Fix indentation bug in IPython/lib/pretty.py * :ghpull:`1538`: store git commit hash in utils._sysinfo instead of hidden data file * :ghpull:`1599`: Fix for %run -d in Python 3 * :ghpull:`1602`: Fix %env for Python 3 * :ghpull:`1607`: cleanup sqlitedb temporary db file after tests Issues (27): * :ghissue:`676`: IPython.embed() from ipython crashes twice on exit * :ghissue:`846`: Autoreload extension doesn't work with Python 3.2 * :ghissue:`1187`: misc notebook: connection file cleanup, first heartbeat, startup flush * :ghissue:`1191`: profile/startup files not executed with "notebook" * :ghissue:`1197`: Interactive shell trying to: from ... import history * :ghissue:`1198`: Kernel Has Died error in Notebook * :ghissue:`1201`: %env magic fails with Python 3.2 * :ghissue:`1204`: double newline from %loadpy in python notebook (at least on mac) * :ghissue:`1208`: should dv.sync_import print failed imports ? * :ghissue:`1225`: SyntaxError display broken in Python 3 * :ghissue:`1232`: Dead kernel loop * :ghissue:`1241`: When our debugger class is used standalone `_oh` key errors are thrown * :ghissue:`1254`: typo in notebooklist.js breaks links * :ghissue:`1260`: heartbeat failure on long gil-holding operation * :ghissue:`1268`: notebook %reset magic fails with StdinNotImplementedError * :ghissue:`1269`: Another strange input handling error * :ghissue:`1281`: in Hub: registration_timeout must be an integer, but heartmonitor.period is CFloat * :ghissue:`1302`: Input parsing with %prun clobbers escapes * :ghissue:`1304`: controller/server load can disrupt heartbeat * :ghissue:`1317`: Very slow traceback construction from Cython extension * :ghissue:`1345`: notebook can't save unicode as script * :ghissue:`1375`: %history -g -f file encoding issue * :ghissue:`1401`: numpy arrays cannot be used with View.apply() in Python 3 * :ghissue:`1408`: test_get_home_dir_3 failed on Mac OS X * :ghissue:`1412`: Input parsing issue with %prun * :ghissue:`1421`: ipython32 %run -d breaks with NameError name 'execfile' is not defined * :ghissue:`1484`: unhide .git_commit_info.ini Issues closed in 0.12 --------------------- In this cycle, from August 1 to December 28 2011, we closed a total of 515 issues, 257 pull requests and 258 regular issues; this is the full list (generated with the script `tools/github_stats.py`). Pull requests (257): * `1174 `_: Remove %install_default_config and %install_profiles * `1178 `_: Correct string type casting in pinfo. * `1096 `_: Show class init and call tooltips in notebook * `1176 `_: Modifications to profile list * `1173 `_: don't load gui/pylab in console frontend * `1168 `_: Add --script flag as shorthand for notebook save_script option. * `1165 `_: encode image_tag as utf8 in [x]html export * `1161 `_: Allow %loadpy to load remote URLs that don't end in .py * `1158 `_: Add coding header when notebook exported to .py file. * `1160 `_: don't ignore ctrl-C during `%gui qt` * `1159 `_: Add encoding header to Python files downloaded from notebooks. * `1155 `_: minor post-execute fixes (#1154) * `1153 `_: Pager tearing bug * `1152 `_: Add support for displaying maptlotlib axes directly. * `1079 `_: Login/out button cleanups * `1151 `_: allow access to user_ns in prompt_manager * `1120 `_: updated vim-ipython (pending) * `1150 `_: BUG: Scrolling pager in vsplit on Mac OSX tears. * `1149 `_: #1148 (win32 arg_split) * `1147 `_: Put qtconsole foreground when launching * `1146 `_: allow saving notebook.py next to notebook.ipynb * `1128 `_: fix pylab StartMenu item * `1140 `_: Namespaces for embedding * `1132 `_: [notebook] read-only: disable name field * `1125 `_: notebook : update logo * `1135 `_: allow customized template and static file paths for the notebook web app * `1122 `_: BUG: Issue #755 qt IPythonWidget.execute_file fails if filename contains... * `1137 `_: rename MPIExecLaunchers to MPILaunchers * `1130 `_: optionally ignore shlex's ValueError in arg_split * `1116 `_: Shlex unicode * `1073 `_: Storemagic plugin * `1143 `_: Add post_install script to create start menu entries in Python 3 * `1138 `_: Fix tests to work when ~/.config/ipython contains a symlink. * `1121 `_: Don't transform function calls on IPyAutocall objects * `1118 `_: protect CRLF from carriage-return action * `1105 `_: Fix for prompts containing newlines. * `1126 `_: Totally remove pager when read only (notebook) * `1091 `_: qtconsole : allow copy with shortcut in pager * `1114 `_: fix magics history in two-process ipython console * `1113 `_: Fixing #1112 removing failing asserts for test_carriage_return and test_beep * `1089 `_: Support carriage return ('\r') and beep ('\b') characters in the qtconsole * `1108 `_: Completer usability 2 (rebased of pr #1082) * `864 `_: Two-process terminal frontend (ipython core branch) * `1082 `_: usability and cross browser compat for completer * `1053 `_: minor improvements to text placement in qtconsole * `1106 `_: Fix display of errors in compiled code on Python 3 * `1077 `_: allow the notebook to run without MathJax * `1072 `_: If object has a getdoc() method, override its normal docstring. * `1059 `_: Switch to simple `__IPYTHON__` global * `1070 `_: Execution count after SyntaxError * `1098 `_: notebook: config section UI * `1101 `_: workaround spawnb missing from pexpect.__all__ * `1097 `_: typo, should fix #1095 * `1099 `_: qtconsole export xhtml/utf8 * `1083 `_: Prompts * `1081 `_: Fix wildcard search for updated namespaces * `1084 `_: write busy in notebook window title... * `1078 `_: PromptManager fixes * `1064 `_: Win32 shlex * `1069 `_: As you type completer, fix on Firefox * `1039 `_: Base of an as you type completer. * `1065 `_: Qtconsole fix racecondition * `507 `_: Prompt manager * `1056 `_: Warning in code. qtconsole ssh -X * `1036 `_: Clean up javascript based on js2-mode feedback. * `1052 `_: Pylab fix * `648 `_: Usermod * `969 `_: Pexpect-u * `1007 `_: Fix paste/cpaste bug and refactor/cleanup that code a lot. * `506 `_: make ENTER on a previous input field replace current input buffer * `1040 `_: json/jsonapi cleanup * `1042 `_: fix firefox (windows) break line on empty prompt number * `1015 `_: emacs freezes when tab is hit in ipython with latest python-mode * `1023 `_: flush stdout/stderr at the end of kernel init * `956 `_: Generate "All magics..." menu live * `1038 `_: Notebook: don't change cell when selecting code using shift+up/down. * `987 `_: Add Tooltip to notebook. * `1028 `_: Cleaner minimum version comparison * `998 `_: defer to stdlib for path.get_home_dir() * `1033 `_: update copyright to 2011/20xx-2011 * `1032 `_: Intercept avoid closing websocket on Firefox * `1030 `_: use pyzmq tools where appropriate * `1029 `_: Restore pspersistence, including %store magic, as an extension. * `1025 `_: Dollar escape * `999 `_: Fix issue #880 - more useful message to user when %paste fails * `938 `_: changes to get ipython.el to work with the latest python-mode.el * `1012 `_: Add logout button. * `1020 `_: Dollar formatter for ! shell calls * `1019 `_: Use repr() to make quoted strings * `1008 `_: don't use crash_handler by default * `1003 `_: Drop consecutive duplicates when refilling readline history * `997 `_: don't unregister interrupted post-exec functions * `996 `_: add Integer traitlet * `1016 `_: Fix password hashing for Python 3 * `1014 `_: escape minus signs in manpages * `1013 `_: [NumPyExampleDocstring] link was pointing to raw file * `1011 `_: Add hashed password support. * `1005 `_: Quick fix for os.system requiring str parameter * `994 `_: Allow latex formulas in HTML output * `955 `_: Websocket Adjustments * `979 `_: use system_raw in terminal, even on Windows * `989 `_: fix arguments for commands in _process_posix * `991 `_: Show traceback, continuing to start kernel if pylab init fails * `981 `_: Split likely multiline text when writing JSON notebooks * `957 `_: allow change of png DPI in inline backend * `968 `_: add wantDirectory to ipdoctest, so that directories will be checked for e * `984 `_: Do not expose variables defined at startup to %who etc. * `985 `_: Fixes for parallel code on Python 3 * `963 `_: disable calltips in PySide < 1.0.7 to prevent segfault * `976 `_: Getting started on what's new * `929 `_: Multiline history * `964 `_: Default profile * `961 `_: Disable the pager for the test suite * `953 `_: Physics extension * `950 `_: Add directory for startup files * `940 `_: allow setting HistoryManager.hist_file with config * `948 `_: Monkeypatch Tornado 2.1.1 so it works with Google Chrome 16. * `916 `_: Run p ( https://github.com/ipython/ipython/pull/901 ) * `923 `_: %config magic * `920 `_: unordered iteration of AsyncMapResults (+ a couple fixes) * `941 `_: Follow-up to 387dcd6a, `_rl.__doc__` is `None` with pyreadline * `931 `_: read-only notebook mode * `921 `_: Show invalid config message on TraitErrors during init * `815 `_: Fix #481 using custom qt4 input hook * `936 `_: Start webbrowser in a thread. Prevents lockup with Chrome. * `937 `_: add dirty trick for readline import on OSX * `913 `_: Py3 tests2 * `933 `_: Cancel in qt console closeevent should trigger event.ignore() * `930 `_: read-only notebook mode * `910 `_: Make import checks more explicit in %whos * `926 `_: reincarnate -V cmdline option * `928 `_: BUG: Set context for font size change shortcuts in ConsoleWidget * `901 `_: - There is a bug when running the profiler in the magic command (prun) with python3 * `912 `_: Add magic for cls on windows. Fix for #181. * `905 `_: enable %gui/%pylab magics in the Kernel * `909 `_: Allow IPython to run without sqlite3 * `887 `_: Qtconsole menu * `895 `_: notebook download implies save * `896 `_: Execfile * `899 `_: Brian's Notebook work * `892 `_: don't close figures every cycle with inline matplotlib backend * `893 `_: Adding clear_output to kernel and HTML notebook * `789 `_: Adding clear_output to kernel and HTML notebook. * `898 `_: Don't pass unicode sys.argv with %run or `ipython script.py` * `897 `_: Add tooltips to the notebook via 'title' attr. * `877 `_: partial fix for issue #678 * `838 `_: reenable multiline history for terminals * `872 `_: The constructor of Client() checks for AssertionError in validate_url to open a file instead of connection to a URL if it fails. * `884 `_: Notebook usability fixes * `883 `_: User notification if notebook saving fails * `889 `_: Add drop_by_id method to shell, to remove variables added by extensions. * `891 `_: Ability to open the notebook in a browser when it starts * `813 `_: Create menu bar for qtconsole * `876 `_: protect IPython from bad custom exception handlers * `856 `_: Backgroundjobs * `868 `_: Warn user if MathJax can't be fetched from notebook closes #744 * `878 `_: store_history=False default for run_cell * `824 `_: History access * `850 `_: Update codemirror to 2.15 and make the code internally more version-agnostic * `861 `_: Fix for issue #56 * `819 `_: Adding -m option to %run, similar to -m for python interpreter. * `855 `_: promote aliases and flags, to ensure they have priority over config files * `862 `_: BUG: Completion widget position and pager focus. * `847 `_: Allow connection to kernels by files * `708 `_: Two-process terminal frontend * `857 `_: make sdist flags work again (e.g. --manifest-only) * `835 `_: Add Tab key to list of keys that scroll down the paging widget. * `859 `_: Fix for issue #800 * `848 `_: Python3 setup.py install failure * `845 `_: Tests on Python 3 * `802 `_: DOC: extensions: add documentation for the bundled extensions * `830 `_: contiguous stdout/stderr in notebook * `761 `_: Windows: test runner fails if repo path (e.g. home dir) contains spaces * `801 `_: Py3 notebook * `809 `_: use CFRunLoop directly in `ipython kernel --pylab osx` * `841 `_: updated old scipy.org links, other minor doc fixes * `837 `_: remove all trailling spaces * `834 `_: Issue https://github.com/ipython/ipython/issues/832 resolution * `746 `_: ENH: extensions: port autoreload to current API * `828 `_: fixed permissions (sub-modules should not be executable) + added shebang for run_ipy_in_profiler.py * `798 `_: pexpect & Python 3 * `804 `_: Magic 'range' crash if greater than len(input_hist) * `821 `_: update tornado dependency to 2.1 * `807 `_: Facilitate ssh tunnel sharing by announcing ports * `795 `_: Add cluster-id for multiple cluster instances per profile * `742 `_: Glut * `668 `_: Greedy completer * `776 `_: Reworking qtconsole shortcut, add fullscreen * `790 `_: TST: add future unicode_literals test (#786) * `775 `_: redirect_in/redirect_out should be constrained to windows only * `793 `_: Don't use readline in the ZMQShell * `743 `_: Pyglet * `774 `_: basic/initial .mailmap for nice shortlog summaries * `770 `_: #769 (reopened) * `784 `_: Parse user code to AST using compiler flags. * `783 `_: always use StringIO, never cStringIO * `782 `_: flush stdout/stderr on displayhook call * `622 `_: Make pylab import all configurable * `745 `_: Don't assume history requests succeed in qtconsole * `725 `_: don't assume cursor.selectedText() is a string * `778 `_: don't override execfile on Python 2 * `663 `_: Python 3 compatilibility work * `762 `_: qtconsole ipython widget's execute_file fails if filename contains spaces or quotes * `763 `_: Set context for shortcuts in ConsoleWidget * `722 `_: PyPy compatibility * `757 `_: ipython.el is broken in 0.11 * `764 `_: fix "--colors=" option in py-python-command-args. * `758 `_: use ROUTER/DEALER socket names instead of XREP/XREQ * `736 `_: enh: added authentication ability for webapp * `748 `_: Check for tornado before running frontend.html tests. * `754 `_: restore msg_id/msg_type aliases in top level of msg dict * `769 `_: Don't treat bytes objects as json-safe * `753 `_: DOC: msg['msg_type'] removed * `766 `_: fix "--colors=" option in py-python-command-args. * `765 `_: fix "--colors=" option in py-python-command-args. * `741 `_: Run PyOs_InputHook in pager to keep plot windows interactive. * `664 `_: Remove ipythonrc references from documentation * `750 `_: Tiny doc fixes * `433 `_: ZMQ terminal frontend * `734 `_: Allow %magic argument filenames with spaces to be specified with quotes under win32 * `731 `_: respect encoding of display data from urls * `730 `_: doc improvements for running notebook via secure protocol * `729 `_: use null char to start markdown cell placeholder * `727 `_: Minor fixes to the htmlnotebook * `726 `_: use bundled argparse if system argparse is < 1.1 * `705 `_: Htmlnotebook * `723 `_: Add 'import time' to IPython/parallel/apps/launcher.py as time.sleep is called without time being imported * `714 `_: Install mathjax for offline use * `718 `_: Underline keyboard shortcut characters on appropriate buttons * `717 `_: Add source highlighting to markdown snippets * `716 `_: update EvalFormatter to allow arbitrary expressions * `712 `_: Reset execution counter after cache is cleared * `713 `_: Align colons in html notebook help dialog * `709 `_: Allow usage of '.' in notebook names * `706 `_: Implement static publishing of HTML notebook * `674 `_: use argparse to parse aliases & flags * `679 `_: HistoryManager.get_session_info() * `696 `_: Fix columnize bug, where tab completion with very long filenames would crash Qt console * `686 `_: add ssh tunnel support to qtconsole * `685 `_: Add SSH tunneling to engines * `384 `_: Allow pickling objects defined interactively. * `647 `_: My fix rpmlint * `587 `_: don't special case for py3k+numpy * `703 `_: make config-loading debug messages more explicit * `699 `_: make calltips configurable in qtconsole * `666 `_: parallel tests & extra readline escapes * `683 `_: BF - allow nose with-doctest setting in environment * `689 `_: Protect ipkernel from bad messages * `702 `_: Prevent ipython.py launcher from being imported. * `701 `_: Prevent ipython.py from being imported by accident * `670 `_: check for writable dirs, not just existence, in utils.path * `579 `_: Sessionwork * `687 `_: add `ipython kernel` for starting just a kernel * `627 `_: Qt Console history search * `646 `_: Generate package list automatically in find_packages * `660 `_: i658 * `659 `_: don't crash on bad config files Regular issues (258): * `1177 `_: UnicodeDecodeError in py3compat from "xlrd??" * `1094 `_: Tooltip doesn't show constructor docstrings * `1170 `_: double pylab greeting with c.InteractiveShellApp.pylab = "tk" in zmqconsole * `1166 `_: E-mail cpaste broken * `1164 `_: IPython qtconsole (0.12) can't export to html with external png * `1103 `_: %loadpy should cut out encoding declaration * `1156 `_: Notebooks downloaded as Python files require a header stating the encoding * `1157 `_: Ctrl-C not working when GUI/pylab integration is active * `1154 `_: We should be less aggressive in de-registering post-execution functions * `1134 `_: "select-all, kill" leaves qtconsole in unusable state * `1148 `_: A lot of testerrors * `803 `_: Make doctests work with Python 3 * `1119 `_: Start menu shortcuts not created in Python 3 * `1136 `_: The embedding machinery ignores user_ns * `607 `_: Use the new IPython logo/font in the notebook header * `755 `_: qtconsole ipython widget's execute_file fails if filename contains spaces or quotes * `1115 `_: shlex_split should return unicode * `1109 `_: timeit with string ending in space gives "ValueError: No closing quotation" * `1142 `_: Install problems * `700 `_: Some SVG images render incorrectly in htmlnotebook * `1117 `_: quit() doesn't work in terminal * `1111 `_: ls broken after merge of #1089 * `1104 `_: Prompt spacing weird * `1124 `_: Seg Fault 11 when calling PySide using "run" command * `1088 `_: QtConsole : can't copy from pager * `568 `_: Test error and failure in IPython.core on windows * `1112 `_: testfailure in IPython.frontend on windows * `1102 `_: magic in IPythonDemo fails when not located at top of demo file * `629 `_: \r and \b in qtconsole don't behave as expected * `1080 `_: Notebook: tab completion should close on "(" * `973 `_: Qt Console close dialog and on-top Qt Console * `1087 `_: QtConsole xhtml/Svg export broken ? * `1067 `_: Parallel test suite hangs on Python 3 * `1018 `_: Local mathjax breaks install * `993 `_: `raw_input` redirection to foreign kernels is extremely brittle * `1100 `_: ipython3 traceback unicode issue from extensions * `1071 `_: Large html-notebooks hang on load on a slow machine * `89 `_: %pdoc np.ma.compress shows docstring twice * `22 `_: Include improvements from anythingipython.el * `633 `_: Execution count & SyntaxError * `1095 `_: Uncaught TypeError: Object has no method 'remove_and_cancell_tooltip' * `1075 `_: We're ignoring prompt customizations * `1086 `_: Can't open qtconsole from outside source tree * `1076 `_: namespace changes broke `foo.*bar*?` syntax * `1074 `_: pprinting old-style class objects fails (TypeError: 'tuple' object is not callable) * `1063 `_: IPython.utils test error due to missing unicodedata module * `592 `_: Bug in argument parsing for %run * `378 `_: Windows path escape issues * `1068 `_: Notebook tab completion broken in Firefox * `75 `_: No tab completion after "/ * `103 `_: customizable cpaste * `324 `_: Remove code in IPython.testing that is not being used * `131 `_: Global variables not seen by cprofile.run() * `851 `_: IPython shell swallows exceptions in certain circumstances * `882 `_: ipython freezes at start if IPYTHONDIR is on an NFS mount * `1057 `_: Blocker: Qt console broken after "all magics" menu became dynamic * `1027 `_: ipython does not like white space at end of file * `1058 `_: New bug: Notebook asks for confirmation to leave even saved pages. * `1061 `_: rep (magic recall) under pypy * `1047 `_: Document the notebook format * `102 `_: Properties accessed twice for classes defined interactively * `16 `_: %store raises exception when storing compiled regex * `67 `_: tab expansion should only take one directory level at the time * `62 `_: Global variables undefined in interactive use of embedded ipython shell * `57 `_: debugging with ipython does not work well outside ipython * `38 `_: Line entry edge case error * `980 `_: Update parallel docs for new parallel architecture * `1017 `_: Add small example about ipcluster/ssh startup * `1041 `_: Proxy Issues * `967 `_: KernelManagers don't use zmq eventloop properly * `1055 `_: "All Magics" display on Ubuntu * `1054 `_: ipython explodes on syntax error * `1051 `_: ipython3 set_next_input() failure * `693 `_: "run -i" no longer works after %reset in terminal * `29 `_: cPickle works in standard interpreter, but not in IPython * `1050 `_: ipython3 broken by commit 8bb887c8c2c447bf7 * `1048 `_: Update docs on notebook password * `1046 `_: Searies of questions/issues? * `1045 `_: crash when exiting - previously launched embedded sub-shell * `1043 `_: pylab doesn't work in qtconsole * `1044 `_: run -p doesn't work in python 3 * `1010 `_: emacs freezes when ipython-complete is called * `82 `_: Update devel docs with discussion about good changelogs * `116 `_: Update release management scripts and release.revision for git * `1022 `_: Pylab banner shows up with first cell to execute * `787 `_: Keyboard selection of multiple lines in the notebook behaves inconsistently * `1037 `_: notepad + jsonlib: TypeError: Only whitespace may be used for indentation. * `970 `_: Default home not writable, %HOME% does not help (windows) * `747 `_: HOMESHARE not a good choice for "writable homedir" on Windows * `810 `_: cleanup utils.path.get_home_dir * `2 `_: Fix the copyright statement in source code files to be accurate * `1031 `_: on Firefox crash websocket * `684 `_: %Store eliminated in configuration and magic commands in 0.11 * `1026 `_: BUG: wrong default parameter in ask_yes_no * `880 `_: Better error message if %paste fails * `1024 `_: autopx magic broken * `822 `_: Unicode bug in Itpl when expanding shell variables in syscalls with ! * `1009 `_: Windows: regression in cd magic handling of paths * `833 `_: Crash python with matplotlib and unequal length arrays * `695 `_: Crash handler initialization is too aggressive * `1000 `_: Remove duplicates when refilling readline history * `992 `_: Interrupting certain matplotlib operations leaves the inline backend 'wedged' * `942 `_: number traits should cast if value doesn't change * `1006 `_: ls crashes when run on a UNC path or with non-ascii args * `944 `_: Decide the default image format for inline figures: SVG or PNG? * `842 `_: Python 3 on Windows (pyreadline) - expected an object with the buffer interface * `1002 `_: ImportError due to incorrect version checking * `1001 `_: Ipython "source" command? * `954 `_: IPython embed doesn't respect namespaces * `681 `_: pdb freezes inside qtconsole * `698 `_: crash report "TypeError: can only concatenate list (not "unicode") to list" * `978 `_: ipython 0.11 buffers external command output till the cmd is done * `952 `_: Need user-facing warning in the browser if websocket connection fails * `988 `_: Error using idlsave * `990 `_: ipython notebook - kernel dies if matplotlib is not installed * `752 `_: Matplotlib figures showed only once in notebook * `54 `_: Exception hook should be optional for embedding IPython in GUIs * `918 `_: IPython.frontend tests fail without tornado * `986 `_: Views created with c.direct_view() fail * `697 `_: Filter out from %who names loaded at initialization time * `932 `_: IPython 0.11 quickref card has superfluous "%recall and" * `982 `_: png files with executable permissions * `914 `_: Simpler system for running code after InteractiveShell is initialised * `911 `_: ipython crashes on startup if readline is missing * `971 `_: bookmarks created in 0.11 are corrupt in 0.12 * `974 `_: object feature tab-completion crash * `939 `_: ZMQShell always uses default profile * `946 `_: Multi-tab Close action should offer option to leave all kernels alone * `949 `_: Test suite must not require any manual interaction * `643 `_: enable gui eventloop integration in ipkernel * `965 `_: ipython is crashed without launch.(python3.2) * `958 `_: Can't use os X clipboard on with qtconsole * `962 `_: Don't require tornado in the tests * `960 `_: crash on syntax error on Windows XP * `934 `_: The latest ipython branch doesn't work in Chrome * `870 `_: zmq version detection * `943 `_: HISTIGNORE for IPython * `947 `_: qtconsole segfaults at startup * `903 `_: Expose a magic to control config of the inline pylab backend * `908 `_: bad user config shouldn't crash IPython * `935 `_: Typing `break` causes IPython to crash. * `869 `_: Tab completion of `~/` shows no output post 0.10.x * `904 `_: whos under pypy1.6 * `773 `_: check_security_dir() and check_pid_dir() fail on network filesystem * `915 `_: OS X Lion Terminal.app line wrap problem * `886 `_: Notebook kernel crash when specifying --notebook-dir on commandline * `636 `_: debugger.py: pydb broken * `808 `_: Ctrl+C during %reset confirm message crash Qtconsole * `927 `_: Using return outside a function crashes ipython * `919 `_: Pop-up segfault when moving cursor out of qtconsole window * `181 `_: cls command does not work on windows * `917 `_: documentation typos * `818 `_: %run does not work with non-ascii characters in path * `907 `_: Errors in custom completer functions can crash IPython * `867 `_: doc: notebook password authentication howto * `211 `_: paste command not working * `900 `_: Tab key should insert 4 spaces in qt console * `513 `_: [Qt console] cannot insert new lines into console functions using tab * `906 `_: qtconsoleapp 'parse_command_line' doen't like --existing anymore * `638 `_: Qt console --pylab=inline and getfigs(), etc. * `710 `_: unwanted unicode passed to args * `436 `_: Users should see tooltips for all buttons in the notebook UI * `207 `_: ipython crashes if atexit handler raises exception * `692 `_: use of Tracer() when debugging works but gives error messages * `690 `_: debugger does not print error message by default in 0.11 * `571 `_: history of multiline entries * `749 `_: IPython.parallel test failure under Windows 7 and XP * `890 `_: ipclusterapp.py - helep * `885 `_: `ws-hostname` alias not recognized by notebook * `881 `_: Missing manual.pdf? * `744 `_: cannot create notebook in offline mode if mathjax not installed * `865 `_: Make tracebacks from %paste show the code * `535 `_: exception unicode handling in %run is faulty in qtconsole * `817 `_: IPython crashed * `799 `_: %edit magic not working on windows xp in qtconsole * `732 `_: QTConsole wrongly promotes the index of the input line on which user presses Enter * `662 `_: ipython test failures on Mac OS X Lion * `650 `_: Handle bad config files better * `829 `_: We should not insert new lines after all print statements in the notebook * `874 `_: ipython-qtconsole: pyzmq Version Comparison * `640 `_: matplotlib macosx windows don't respond in qtconsole * `624 `_: ipython intermittently segfaults when figure is closed (Mac OS X) * `871 `_: Notebook crashes if a profile is used * `56 `_: Have %cpaste accept also Ctrl-D as a termination marker * `849 `_: Command line options to not override profile options * `806 `_: Provide single-port connection to kernels * `691 `_: [wishlist] Automatically find existing kernel * `688 `_: local security vulnerability: all ports visible to any local user. * `866 `_: DistributionNotFound on running ipython 0.11 on Windows XP x86 * `673 `_: raw_input appears to be round-robin for qtconsole * `863 `_: Graceful degradation when home directory not writable * `800 `_: Timing scripts with run -t -N fails on report output * `858 `_: Typing 'continue' makes ipython0.11 crash * `840 `_: all processes run on one CPU core * `843 `_: "import braces" crashes ipython * `836 `_: Strange Output after IPython Install * `839 `_: Qtconsole segfaults when mouse exits window with active tooltip * `827 `_: Add support for checking several limits before running task on engine * `826 `_: Add support for creation of parallel task when no engine is running * `832 `_: Improve error message for %logstop * `831 `_: %logstart in read-only directory forbid any further command * `814 `_: ipython does not start -- DistributionNotFound * `794 `_: Allow >1 controller per profile * `820 `_: Tab Completion feature * `812 `_: Qt console crashes on Ubuntu 11.10 * `816 `_: Import error using Python 2.7 and dateutil2.0 No module named _thread * `756 `_: qtconsole Windows fails to print error message for '%run nonexistent_file' * `651 `_: Completion doesn't work on element of a list * `617 `_: [qtconsole] %hist doesn't show anything in qtconsole * `786 `_: from __future__ import unicode_literals does not work * `779 `_: Using irunner from virtual evn uses systemwide ipython * `768 `_: codepage handling of output from scripts and shellcommands are not handled properly by qtconsole * `785 `_: Don't strip leading whitespace in repr() in notebook * `737 `_: in pickleshare.py line52 should be "if not os.path.isdir(self.root):"? * `738 `_: in ipthon_win_post_install.py line 38 * `777 `_: print(…, sep=…) raises SyntaxError * `728 `_: ipcontroller crash with MPI * `780 `_: qtconsole Out value prints before the print statements that precede it * `632 `_: IPython Crash Report (0.10.2) * `253 `_: Unable to install ipython on windows * `80 `_: Split IPClusterApp into multiple Application subclasses for each subcommand * `34 `_: non-blocking pendingResult partial results * `739 `_: Tests fail if tornado not installed * `719 `_: Better support Pypy * `667 `_: qtconsole problem with default pylab profile * `661 `_: ipythonrc referenced in magic command in 0.11 * `665 `_: Source introspection with ?? is broken * `724 `_: crash - ipython qtconsole, %quickref * `655 `_: ipython with qtconsole crashes * `593 `_: HTML Notebook Prompt can be deleted . . . * `563 `_: use argparse instead of kvloader for flags&aliases * `751 `_: Tornado version greater than 2.0 needed for firefox 6 * `720 `_: Crash report when importing easter egg * `740 `_: Ctrl-Enter clears line in notebook * `772 `_: ipengine fails on Windows with "XXX lineno: 355, opcode: 0" * `771 `_: Add python 3 tag to setup.py * `767 `_: non-ascii in __doc__ string crashes qtconsole kernel when showing tooltip * `733 `_: In Windows, %run fails to strip quotes from filename * `721 `_: no completion in emacs by ipython(ipython.el) * `669 `_: Do not accept an ipython_dir that's not writeable * `711 `_: segfault on mac os x * `500 `_: "RuntimeError: Cannot change input buffer during execution" in console_widget.py * `707 `_: Copy and paste keyboard shortcuts do not work in Qt Console on OS X * `478 `_: PyZMQ's use of memoryviews breaks reconstruction of numpy arrays * `694 `_: Turning off callout tips in qtconsole * `704 `_: return kills IPython * `442 `_: Users should have intelligent autoindenting in the notebook * `615 `_: Wireframe and implement a project dashboard page * `614 `_: Wireframe and implement a notebook dashboard page * `606 `_: Users should be able to use the notebook to import/export a notebook to .py or .rst * `604 `_: A user should be able to leave a kernel running in the notebook and reconnect * `298 `_: Users should be able to save a notebook and then later reload it * `649 `_: ipython qtconsole (v0.11): setting "c.IPythonWidget.in_prompt = '>>> ' crashes * `672 `_: What happened to Exit? * `658 `_: Put the InteractiveShellApp section first in the auto-generated config files * `656 `_: [suggestion] dependency checking for pyqt for Windows installer * `654 `_: broken documentation link on download page * `653 `_: Test failures in IPython.parallel ipython-8.35.0/docs/source/whatsnew/github-stats-0.13.rst000066400000000000000000002143471477474304100231460ustar00rootroot00000000000000.. _issues_list_013: Issues closed in the 0.13 development cycle =========================================== Issues closed in 0.13 --------------------- GitHub stats since IPython 0.12 (2011/12/19 - 2012/06/30) These lists are automatically generated, and may be incomplete or contain duplicates. The following 62 authors contributed 1760 commits. * Aaron Culich * Aaron Meurer * Alex Kramer * Andrew Giessel * Andrew Straw * André Matos * Aron Ahmadia * Ben Edwards * Benjamin Ragan-Kelley * Bradley M. Froehle * Brandon Parsons * Brian E. Granger * Carlos Cordoba * David Hirschfeld * David Zderic * Ernie French * Fernando Perez * Ian Murray * Jason Grout * Jens H Nielsen * Jez Ng * Jonathan March * Jonathan Taylor * Julian Taylor * Jörgen Stenarson * Kent Inverarity * Marc Abramowitz * Mark Wiebe * Matthew Brett * Matthias BUSSONNIER * Michael Droettboom * Mike Hansen * Nathan Rice * Pankaj Pandey * Paul * Paul Ivanov * Piotr Zolnierczuk * Piti Ongmongkolkul * Puneeth Chaganti * Robert Kern * Ross Jones * Roy Hyunjin Han * Scott Tsai * Skipper Seabold * Stefan van der Walt * Steven Johnson * Takafumi Arakaki * Ted Wright * Thomas Hisch * Thomas Kluyver * Thomas Spura * Thomi Richards * Tim Couper * Timo Paulssen * Toby Gilham * Tony S Yu * W. Trevor King * Walter Doerwald * anatoly techtonik * fawce * mcelrath * wilsaj We closed a total of 1115 issues, 373 pull requests and 742 regular issues; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (373): * :ghpull:`1943`: add screenshot and link into releasenotes * :ghpull:`1954`: update some example notebooks * :ghpull:`2048`: move _encode_binary to jsonutil.encode_images * :ghpull:`2050`: only add quotes around xunit-file on Windows * :ghpull:`2047`: disable auto-scroll on mozilla * :ghpull:`2015`: Fixes for %paste with special transformations * :ghpull:`2046`: Iptest unicode * :ghpull:`1939`: Namespaces * :ghpull:`2042`: increase auto-scroll threshold to 100 lines * :ghpull:`2043`: move RemoteError import to top-level * :ghpull:`2036`: %alias_magic * :ghpull:`1968`: Proposal of icons for .ipynb files * :ghpull:`2037`: remove `ipython-qtconsole` gui-script * :ghpull:`2038`: add extra clear warning to shell doc * :ghpull:`2029`: Ship unminified js * :ghpull:`2007`: Add custom_control and custom_page_control variables to override the Qt widgets used by qtconsole * :ghpull:`2034`: fix&test push/pull recarrays * :ghpull:`2028`: Reduce unhelpful information shown by pinfo * :ghpull:`2030`: check wxPython version in inputhook * :ghpull:`2024`: Make interactive_usage a bit more rst friendly * :ghpull:`2031`: disable ^C^C confirmation on Windows * :ghpull:`2027`: match stdin encoding in frontend readline test * :ghpull:`2025`: Fix parallel test on WinXP - wait for resource cleanup. * :ghpull:`2016`: BUG: test runner fails in Windows if filenames contain spaces. * :ghpull:`2020`: Fix home path expansion test in Windows. * :ghpull:`2021`: Fix Windows pathname issue in 'odd encoding' test. * :ghpull:`2022`: don't check writability in test for get_home_dir when HOME is undefined * :ghpull:`1996`: frontend test tweaks * :ghpull:`2014`: relax profile regex in notebook * :ghpull:`2012`: Mono cursor offset * :ghpull:`2004`: Clarify generic message spec vs. Python message API in docs * :ghpull:`2010`: notebook: Print a warning (but do not abort) if no webbrowser can be found. * :ghpull:`2002`: Refactor %magic into a lsmagic_docs API function. * :ghpull:`1999`: `%magic` help: display line and cell magics in alphabetical order. * :ghpull:`1981`: Clean BG processes created by %%script on kernel exit * :ghpull:`1994`: Fix RST misformatting. * :ghpull:`1951`: minor notebook startup/notebook-dir adjustments * :ghpull:`1974`: Allow path completion on notebook. * :ghpull:`1964`: allow multiple instances of a Magic * :ghpull:`1991`: fix _ofind attr in %page * :ghpull:`1988`: check for active frontend in update_restart_checkbox * :ghpull:`1979`: Add support for tox (https://tox.readthedocs.io/) and Travis CI (http://travis-ci.org/) * :ghpull:`1970`: dblclick to restore size of images * :ghpull:`1978`: Notebook names truncating at the first period * :ghpull:`1825`: second attempt at scrolled long output * :ghpull:`1934`: Cell/Worksheet metadata * :ghpull:`1746`: Confirm restart (configuration option, and checkbox UI) * :ghpull:`1944`: [qtconsole] take %,%% prefix into account for completion * :ghpull:`1973`: fix another FreeBSD $HOME symlink issue * :ghpull:`1967`: Fix psums example description in docs * :ghpull:`1965`: fix for #1678, undo no longer clears cells * :ghpull:`1952`: avoid duplicate "Websockets closed" dialog on ws close * :ghpull:`1962`: Support unicode prompts * :ghpull:`1955`: update to latest version of vim-ipython * :ghpull:`1945`: Add --proc option to %%script * :ghpull:`1956`: move import RemoteError after get_exc_info * :ghpull:`1950`: Fix for copy action (Ctrl+C) when there is no pager defined in qtconsole * :ghpull:`1948`: Fix help string for InteractiveShell.ast_node_interactivity * :ghpull:`1942`: swallow stderr of which in utils.process.find_cmd * :ghpull:`1940`: fix completer css on some Chrome versions * :ghpull:`1938`: remove remaining references to deprecated XREP/XREQ names * :ghpull:`1925`: Fix styling of superscripts and subscripts. Closes #1924. * :ghpull:`1936`: increase duration of save messages * :ghpull:`1937`: add %save -f * :ghpull:`1935`: add version checking to pyreadline import test * :ghpull:`1849`: Octave magics * :ghpull:`1759`: github, merge PR(s) just by number(s) * :ghpull:`1931`: Win py3fixes * :ghpull:`1933`: oinspect.find_file: Additional safety if file cannot be found. * :ghpull:`1932`: Fix adding functions to CommandChainDispatcher with equal priority on Py 3 * :ghpull:`1928`: Select NoDB by default * :ghpull:`1923`: Add IPython syntax support to the %timeit magic, in line and cell mode * :ghpull:`1926`: Make completer recognize escaped quotes in strings. * :ghpull:`1893`: Update Parallel Magics and Exception Display * :ghpull:`1921`: magic_arguments: dedent but otherwise preserve indentation. * :ghpull:`1919`: Use oinspect in CodeMagics._find_edit_target * :ghpull:`1918`: don't warn in iptest if deathrow/quarantine are missing * :ghpull:`1917`: Fix for %pdef on Python 3 * :ghpull:`1913`: Fix for #1428 * :ghpull:`1911`: temporarily skip autoreload tests * :ghpull:`1909`: Fix for #1908, use os.path.normcase for safe filename comparisons * :ghpull:`1907`: py3compat fixes for %%script and tests * :ghpull:`1906`: ofind finds non-unique cell magics * :ghpull:`1845`: Fixes to inspection machinery for magics * :ghpull:`1902`: Workaround fix for gh-1632; minimal revert of gh-1424 * :ghpull:`1900`: Cython libs * :ghpull:`1899`: add ScriptMagics to class list for generated config * :ghpull:`1898`: minimize manpages * :ghpull:`1897`: use glob for bad exclusion warning * :ghpull:`1855`: %%script and %%file magics * :ghpull:`1870`: add %%capture for capturing stdout/err * :ghpull:`1861`: Use dvipng to format sympy.Matrix * :ghpull:`1867`: Fix 1px margin bouncing of selected menu item. * :ghpull:`1889`: Reconnect when the websocket connection closes unexpectedly * :ghpull:`1886`: Fix a bug in renaming notebook * :ghpull:`1895`: Fix error in test suite with ip.system() * :ghpull:`1762`: add `locate` entry points * :ghpull:`1883`: Fix vertical offset due to bold/italics, and bad browser fonts. * :ghpull:`1875`: re-write columnize, with intermediate step. * :ghpull:`1851`: new completer for qtconsole. * :ghpull:`1892`: Remove suspicious quotes in interactiveshell.py * :ghpull:`1864`: Rmagic exceptions * :ghpull:`1829`: [notebook] don't care about leading prct in completion * :ghpull:`1832`: Make svg, jpeg and png images resizable in notebook. * :ghpull:`1674`: HTML Notebook carriage-return handling, take 2 * :ghpull:`1882`: Remove importlib dependency which not available in Python 2.6. * :ghpull:`1879`: Correct stack depth for variable expansion in !system commands * :ghpull:`1841`: [notebook] deduplicate completion results * :ghpull:`1850`: Remove args/kwargs handling in TryNext, fix %paste error messages. * :ghpull:`1663`: Keep line-endings in ipynb * :ghpull:`1815`: Make : invalid in filenames in the Notebook JS code. * :ghpull:`1819`: doc: cleanup the parallel psums example a little * :ghpull:`1839`: External cleanup * :ghpull:`1782`: fix Magic menu in qtconsole, split in groups * :ghpull:`1862`: Minor bind_kernel improvements * :ghpull:`1857`: Prevent jumping of window to input when output is clicked. * :ghpull:`1856`: Fix 1px jumping of cells and menus in Notebook. * :ghpull:`1852`: fix chained resubmissions * :ghpull:`1780`: Rmagic extension * :ghpull:`1847`: add InlineBackend to ConsoleApp class list * :ghpull:`1836`: preserve header for resubmitted tasks * :ghpull:`1828`: change default extension to .ipy for %save -r * :ghpull:`1800`: Reintroduce recall * :ghpull:`1830`: lsmagic lists magics in alphabetical order * :ghpull:`1773`: Update SymPy profile: SymPy's latex() can now print set and frozenset * :ghpull:`1761`: Edited documentation to use IPYTHONDIR in place of ~/.ipython * :ghpull:`1822`: aesthetics pass on AsyncResult.display_outputs * :ghpull:`1821`: ENTER submits the rename notebook dialog. * :ghpull:`1820`: NotebookApp: Make the number of ports to retry user configurable. * :ghpull:`1816`: Always use filename as the notebook name. * :ghpull:`1813`: Add assert_in method to nose for Python 2.6 * :ghpull:`1711`: New Tooltip, New Completer and JS Refactor * :ghpull:`1798`: a few simple fixes for docs/parallel * :ghpull:`1812`: Ensure AsyncResult.display_outputs doesn't display empty streams * :ghpull:`1811`: warn on nonexistent exclusions in iptest * :ghpull:`1810`: fix for #1809, failing tests in IPython.zmq * :ghpull:`1808`: Reposition alternate upload for firefox [need cross browser/OS/language test] * :ghpull:`1742`: Check for custom_exceptions only once * :ghpull:`1807`: add missing cython exclusion in iptest * :ghpull:`1805`: Fixed a vcvarsall.bat error on win32/Py2.7 when trying to compile with m... * :ghpull:`1739`: Dashboard improvement (necessary merge of #1658 and #1676 + fix #1492) * :ghpull:`1770`: Cython related magic functions * :ghpull:`1707`: Accept --gui=<...> switch in IPython qtconsole. * :ghpull:`1797`: Fix comment which breaks Emacs syntax highlighting. * :ghpull:`1795`: fix %gui magic * :ghpull:`1793`: Raise repr limit for strings to 80 characters (from 30). * :ghpull:`1794`: don't use XDG path on OS X * :ghpull:`1792`: Unicode-aware logger * :ghpull:`1791`: update zmqshell magics * :ghpull:`1787`: DOC: Remove regression from qt-console docs. * :ghpull:`1758`: test_pr, fallback on http if git protocol fail, and SSL errors... * :ghpull:`1748`: Fix some tests for Python 3.3 * :ghpull:`1755`: test for pygments before running qt tests * :ghpull:`1771`: Make default value of interactivity passed to run_ast_nodes configurable * :ghpull:`1784`: restore loadpy to load * :ghpull:`1768`: Update parallel magics * :ghpull:`1779`: Tidy up error raising in magic decorators. * :ghpull:`1769`: Allow cell mode timeit without setup code. * :ghpull:`1716`: Fix for fake filenames in verbose traceback * :ghpull:`1763`: [qtconsole] fix append_plain_html -> append_html * :ghpull:`1732`: Refactoring of the magics system and implementation of cell magics * :ghpull:`1630`: Merge divergent Kernel implementations * :ghpull:`1705`: [notebook] Make pager resizable, and remember size... * :ghpull:`1606`: Share code for %pycat and %loadpy, make %pycat aware of URLs * :ghpull:`1757`: Open IPython notebook hyperlinks in a new window using target=_blank * :ghpull:`1754`: Fix typo enconters->encounters * :ghpull:`1753`: Clear window title when kernel is restarted * :ghpull:`1449`: Fix for bug #735 : Images missing from XML/SVG export * :ghpull:`1743`: Tooltip completer js refactor * :ghpull:`1681`: add qt config option to clear_on_kernel_restart * :ghpull:`1733`: Tooltip completer js refactor * :ghpull:`1727`: terminate kernel after embed_kernel tests * :ghpull:`1737`: add HistoryManager to ipapp class list * :ghpull:`1686`: ENH: Open a notebook from the command line * :ghpull:`1709`: fixes #1708, failing test in arg_split on windows * :ghpull:`1718`: Use CRegExp trait for regular expressions. * :ghpull:`1729`: Catch failure in repr() for %whos * :ghpull:`1726`: use eval for command-line args instead of exec * :ghpull:`1724`: fix scatter/gather with targets='all' * :ghpull:`1725`: add --no-ff to git pull in test_pr * :ghpull:`1721`: Tooltip completer js refactor * :ghpull:`1657`: Add `wait` optional argument to `hooks.editor` * :ghpull:`1717`: Define generic sys.ps{1,2,3}, for use by scripts. * :ghpull:`1691`: Finish PR #1446 * :ghpull:`1710`: update MathJax CDN url for https * :ghpull:`1713`: Make autocall regexp's configurable. * :ghpull:`1703`: Allow TryNext to have an error message without it affecting the command chain * :ghpull:`1714`: minor adjustments to test_pr * :ghpull:`1704`: ensure all needed qt parts can be imported before settling for one * :ghpull:`1706`: Mark test_push_numpy_nocopy as a known failure for Python 3 * :ghpull:`1698`: fix tooltip on token with number * :ghpull:`1245`: pythonw py3k fixes for issue #1226 * :ghpull:`1685`: Add script to test pull request * :ghpull:`1693`: deprecate IPYTHON_DIR in favor of IPYTHONDIR * :ghpull:`1695`: Avoid deprecated warnings from ipython-qtconsole.desktop. * :ghpull:`1694`: Add quote to notebook to allow it to load * :ghpull:`1689`: Fix sys.path missing '' as first entry in `ipython kernel`. * :ghpull:`1687`: import Binary from bson instead of pymongo * :ghpull:`1616`: Make IPython.core.display.Image less notebook-centric * :ghpull:`1684`: CLN: Remove redundant function definition. * :ghpull:`1670`: Point %pastebin to gist * :ghpull:`1669`: handle pyout messages in test_message_spec * :ghpull:`1295`: add binary-tree engine interconnect example * :ghpull:`1642`: Cherry-picked commits from 0.12.1 release * :ghpull:`1659`: Handle carriage return characters ("\r") in HTML notebook output. * :ghpull:`1656`: ensure kernels are cleaned up in embed_kernel tests * :ghpull:`1664`: InteractiveShell.run_code: Update docstring. * :ghpull:`1662`: Delay flushing softspace until after cell finishes * :ghpull:`1643`: handle jpg/jpeg in the qtconsole * :ghpull:`1652`: add patch_pyzmq() for backporting a few changes from newer pyzmq * :ghpull:`1650`: DOC: moving files with SSH launchers * :ghpull:`1357`: add IPython.embed_kernel() * :ghpull:`1640`: Finish up embed_kernel * :ghpull:`1651`: Remove bundled Itpl module * :ghpull:`1634`: incremental improvements to SSH launchers * :ghpull:`1649`: move examples/test_embed into examples/tests/embed * :ghpull:`1633`: Fix installing extension from local file on Windows * :ghpull:`1645`: Exclude UserDict when deep reloading NumPy. * :ghpull:`1637`: Removed a ':' which shouldn't have been there * :ghpull:`1631`: TST: QApplication doesn't quit early enough with PySide. * :ghpull:`1629`: evaluate a few dangling validate_message generators * :ghpull:`1621`: clear In[] prompt numbers on "Clear All Output" * :ghpull:`1627`: Test the Message Spec * :ghpull:`1624`: Fixes for byte-compilation on Python 3 * :ghpull:`1615`: Add show() method to figure objects. * :ghpull:`1625`: Fix deepreload on Python 3 * :ghpull:`1620`: pyin message now have execution_count * :ghpull:`1457`: Update deepreload to use a rewritten knee.py. Fixes dreload(numpy). * :ghpull:`1613`: allow map / parallel function for single-engine views * :ghpull:`1609`: exit notebook cleanly on SIGINT, SIGTERM * :ghpull:`1607`: cleanup sqlitedb temporary db file after tests * :ghpull:`1608`: don't rely on timedelta.total_seconds in AsyncResult * :ghpull:`1599`: Fix for %run -d on Python 3 * :ghpull:`1602`: Fix %env magic on Python 3. * :ghpull:`1603`: Remove python3 profile * :ghpull:`1604`: Exclude IPython.quarantine from installation * :ghpull:`1600`: Specify encoding for io.open in notebook_reformat tests * :ghpull:`1605`: Small fixes for Animation and Progress notebook * :ghpull:`1529`: __all__ feature, improvement to dir2, and tests for both * :ghpull:`1548`: add sugar methods/properties to AsyncResult * :ghpull:`1535`: Fix pretty printing dispatch * :ghpull:`1399`: Use LaTeX to print various built-in types with the SymPy printing extension * :ghpull:`1597`: re-enter kernel.eventloop after catching SIGINT * :ghpull:`1490`: rename plaintext cell -> raw cell * :ghpull:`1480`: Fix %notebook magic, etc. nbformat unicode tests and fixes * :ghpull:`1588`: Gtk3 integration with ipython works. * :ghpull:`1595`: Examples syntax (avoid errors installing on Python 3) * :ghpull:`1526`: Find encoding for Python files * :ghpull:`1594`: Fix writing git commit ID to a file on build with Python 3 * :ghpull:`1556`: shallow-copy DictDB query results * :ghpull:`1502`: small changes in response to pyflakes pass * :ghpull:`1445`: Don't build sphinx docs for sdists * :ghpull:`1538`: store git commit hash in utils._sysinfo instead of hidden data file * :ghpull:`1546`: attempt to suppress exceptions in channel threads at shutdown * :ghpull:`1559`: update tools/github_stats.py to use GitHub API v3 * :ghpull:`1563`: clear_output improvements * :ghpull:`1560`: remove obsolete discussion of Twisted/trial from testing docs * :ghpull:`1569`: BUG: qtconsole -- non-standard handling of \a and \b. [Fixes #1561] * :ghpull:`1573`: BUG: Ctrl+C crashes wx pylab kernel in qtconsole. * :ghpull:`1568`: fix PR #1567 * :ghpull:`1567`: Fix: openssh_tunnel did not parse port in `server` * :ghpull:`1565`: fix AsyncResult.abort * :ghpull:`1552`: use os.getcwdu in NotebookManager * :ghpull:`1541`: display_pub flushes stdout/err * :ghpull:`1544`: make MultiKernelManager.kernel_manager_class configurable * :ghpull:`1517`: Fix indentation bug in IPython/lib/pretty.py * :ghpull:`1519`: BUG: Include the name of the exception type in its pretty format. * :ghpull:`1489`: Fix zero-copy push * :ghpull:`1477`: fix dangling `buffer` in IPython.parallel.util * :ghpull:`1514`: DOC: Fix references to IPython.lib.pretty instead of the old location * :ghpull:`1481`: BUG: Improve placement of CallTipWidget * :ghpull:`1496`: BUG: LBYL when clearing the output history on shutdown. * :ghpull:`1508`: fix sorting profiles in clustermanager * :ghpull:`1495`: BUG: Fix pretty-printing for overzealous objects * :ghpull:`1472`: more general fix for #662 * :ghpull:`1483`: updated magic_history docstring * :ghpull:`1383`: First version of cluster web service. * :ghpull:`1398`: fix %tb after SyntaxError * :ghpull:`1440`: Fix for failing testsuite when using --with-xml-coverage on windows. * :ghpull:`1419`: Add %install_ext magic function. * :ghpull:`1424`: Win32 shell interactivity * :ghpull:`1468`: Simplify structure of a Job in the TaskScheduler * :ghpull:`1447`: 1107 - Tab autocompletion can suggest invalid syntax * :ghpull:`1469`: Fix typo in comment (insert space) * :ghpull:`1463`: Fix completion when importing modules in the cwd. * :ghpull:`1466`: Fix for issue #1437, unfriendly windows qtconsole error handling * :ghpull:`1432`: Fix ipython directive * :ghpull:`1465`: allow `ipython help subcommand` syntax * :ghpull:`1416`: Conditional import of ctypes in inputhook * :ghpull:`1462`: expedite parallel tests * :ghpull:`1410`: Add javascript library and css stylesheet loading to JS class. * :ghpull:`1448`: Fix for #875 Never build unicode error messages * :ghpull:`1458`: use eval to uncan References * :ghpull:`1450`: load mathjax from CDN via https * :ghpull:`1451`: include heading level in JSON * :ghpull:`1444`: Fix pyhton -> python typos * :ghpull:`1414`: ignore errors in shell.var_expand * :ghpull:`1430`: Fix for tornado check for tornado < 1.1.0 * :ghpull:`1413`: get_home_dir expands symlinks, adjust test accordingly * :ghpull:`1385`: updated and prettified magic doc strings * :ghpull:`1406`: Browser selection * :ghpull:`1377`: Saving non-ascii history * :ghpull:`1402`: fix symlinked /home issue for FreeBSD * :ghpull:`1405`: Only monkeypatch xunit when the tests are run using it. * :ghpull:`1395`: Xunit & KnownFailure * :ghpull:`1396`: Fix for %tb magic. * :ghpull:`1386`: Jsd3 * :ghpull:`1388`: Add simple support for running inside a virtualenv * :ghpull:`1391`: Improve Hub/Scheduler when no engines are registered * :ghpull:`1369`: load header with engine id when engine dies in TaskScheduler * :ghpull:`1353`: Save notebook as script using unicode file handle. * :ghpull:`1352`: Add '-m mod : run library module as a script' option. * :ghpull:`1363`: Fix some minor color/style config issues in the qtconsole * :ghpull:`1371`: Adds a quiet keyword to sync_imports * :ghpull:`1387`: Fixing Cell menu to update cell type select box. * :ghpull:`1296`: Wx gui example: fixes the broken example for `%gui wx`. * :ghpull:`1372`: ipcontroller cleans up connection files unless reuse=True * :ghpull:`1374`: remove calls to meaningless ZMQStream.on_err * :ghpull:`1370`: allow draft76 websockets (Safari) * :ghpull:`1368`: Ensure handler patterns are str, not unicode * :ghpull:`1361`: Notebook bug fix branch * :ghpull:`1364`: avoid jsonlib returning Decimal * :ghpull:`1362`: Don't log complete contents of history replies, even in debug * :ghpull:`1347`: fix weird magic completion in notebook * :ghpull:`1346`: fixups for alternate URL prefix stuff * :ghpull:`1336`: crack at making notebook.html use the layout.html template * :ghpull:`1331`: RST and heading cells * :ghpull:`1247`: fixes a bug causing extra newlines after comments. * :ghpull:`1332`: notebook - allow prefixes in URL path. * :ghpull:`1341`: Don't attempt to tokenize binary files for tracebacks * :ghpull:`1334`: added key handler for control-s to notebook, seems to work pretty well * :ghpull:`1338`: Fix see also in docstrings so API docs build * :ghpull:`1335`: Notebook toolbar UI * :ghpull:`1299`: made notebook.html extend layout.html * :ghpull:`1318`: make Ctrl-D in qtconsole act same as in terminal (ready to merge) * :ghpull:`1328`: Coverage * :ghpull:`1206`: don't preserve fixConsole output in json * :ghpull:`1330`: Add linewrapping to text cells (new feature in CodeMirror). * :ghpull:`1309`: Inoculate clearcmd extension into %reset functionality * :ghpull:`1327`: Updatecm2 * :ghpull:`1326`: Removing Ace edit capability. * :ghpull:`1325`: forgotten selected_cell -> get_selected_cell * :ghpull:`1316`: Pass subprocess test runners a suitable location for xunit output * :ghpull:`1303`: Updatecm * :ghpull:`1312`: minor heartbeat tweaks * :ghpull:`1306`: Fix %prun input parsing for escaped characters (closes #1302) * :ghpull:`1301`: New "Fix for issue #1202" based on current master. * :ghpull:`1289`: Make autoreload extension work on Python 3. * :ghpull:`1288`: Don't ask for confirmation when stdin isn't available * :ghpull:`1294`: TaskScheduler.hwm default to 1 instead of 0 * :ghpull:`1283`: HeartMonitor.period should be an Integer * :ghpull:`1264`: Aceify * :ghpull:`1284`: a fix for GH 1269 * :ghpull:`1213`: BUG: Minor typo in history_console_widget.py * :ghpull:`1267`: add NoDB for non-recording Hub * :ghpull:`1222`: allow Reference as callable in map/apply * :ghpull:`1257`: use self.kernel_manager_class in qtconsoleapp * :ghpull:`1253`: set auto_create flag for notebook apps * :ghpull:`1262`: Heartbeat no longer shares the app's Context * :ghpull:`1229`: Fix display of SyntaxError in Python 3 * :ghpull:`1256`: Dewijmoize * :ghpull:`1246`: Skip tests that require X, when importing pylab results in RuntimeError. * :ghpull:`1211`: serve local files in notebook-dir * :ghpull:`1224`: edit text cells on double-click instead of single-click * :ghpull:`1187`: misc notebook: connection file cleanup, first heartbeat, startup flush * :ghpull:`1207`: fix loadpy duplicating newlines * :ghpull:`1129`: Unified setup.py * :ghpull:`1199`: Reduce IPython.external.* * :ghpull:`1218`: Added -q option to %prun for suppression of the output, along with editing the dochelp string. * :ghpull:`1217`: Added -q option to %prun for suppression of the output, along with editing the dochelp string * :ghpull:`1175`: core.completer: Clean up excessive and unused code. * :ghpull:`1196`: docs: looks like a file path might have been accidentally pasted in the middle of a word * :ghpull:`1190`: Fix link to Chris Fonnesbeck blog post about 0.11 highlights. Issues (742): * :ghissue:`1943`: add screenshot and link into releasenotes * :ghissue:`1570`: [notebook] remove 'left panel' references from example. * :ghissue:`1954`: update some example notebooks * :ghissue:`2048`: move _encode_binary to jsonutil.encode_images * :ghissue:`2050`: only add quotes around xunit-file on Windows * :ghissue:`2047`: disable auto-scroll on mozilla * :ghissue:`1258`: Magic %paste error * :ghissue:`2015`: Fixes for %paste with special transformations * :ghissue:`760`: Windows: test runner fails if repo path contains spaces * :ghissue:`2046`: Iptest unicode * :ghissue:`1939`: Namespaces * :ghissue:`2042`: increase auto-scroll threshold to 100 lines * :ghissue:`2043`: move RemoteError import to top-level * :ghissue:`641`: In %magic help, remove duplicate aliases * :ghissue:`2036`: %alias_magic * :ghissue:`1968`: Proposal of icons for .ipynb files * :ghissue:`825`: keyboardinterrupt crashes gtk gui when gtk.set_interactive is not available * :ghissue:`1971`: Remove duplicate magics docs * :ghissue:`2040`: Namespaces for cleaner public APIs * :ghissue:`2039`: ipython parallel import exception * :ghissue:`2035`: Getdefaultencoding test error with sympy 0.7.1_git * :ghissue:`2037`: remove `ipython-qtconsole` gui-script * :ghissue:`1516`: ipython-qtconsole script isn't installed for Python 2.x * :ghissue:`1297`: "ipython -p sh" is in documentation but doesn't work * :ghissue:`2038`: add extra clear warning to shell doc * :ghissue:`1265`: please ship unminified js and css sources * :ghissue:`2029`: Ship unminified js * :ghissue:`1920`: Provide an easy way to override the Qt widget used by qtconsole * :ghissue:`2007`: Add custom_control and custom_page_control variables to override the Qt widgets used by qtconsole * :ghissue:`2009`: In %magic help, remove duplicate aliases * :ghissue:`2033`: ipython parallel pushing and pulling recarrays * :ghissue:`2034`: fix&test push/pull recarrays * :ghissue:`2028`: Reduce unhelpful information shown by pinfo * :ghissue:`1992`: Tab completion fails with many spaces in filename * :ghissue:`1885`: handle too old wx * :ghissue:`2030`: check wxPython version in inputhook * :ghissue:`2024`: Make interactive_usage a bit more rst friendly * :ghissue:`2031`: disable ^C^C confirmation on Windows * :ghissue:`2023`: Unicode test failure on OS X * :ghissue:`2027`: match stdin encoding in frontend readline test * :ghissue:`1901`: Windows: parallel test fails assert, leaves 14 python processes alive * :ghissue:`2025`: Fix parallel test on WinXP - wait for resource cleanup. * :ghissue:`1986`: Line magic function `%R` not found. (Rmagic) * :ghissue:`1712`: test failure in ubuntu package daily build * :ghissue:`1183`: 0.12 testsuite failures * :ghissue:`2016`: BUG: test runner fails in Windows if filenames contain spaces. * :ghissue:`1806`: Alternate upload methods in firefox * :ghissue:`2019`: Windows: home directory expansion test fails * :ghissue:`2020`: Fix home path expansion test in Windows. * :ghissue:`2017`: Windows core test error - filename quoting * :ghissue:`2021`: Fix Windows pathname issue in 'odd encoding' test. * :ghissue:`1998`: call to nt.assert_true(path._writable_dir(home)) returns false in test_path.py * :ghissue:`2022`: don't check writability in test for get_home_dir when HOME is undefined * :ghissue:`1589`: Test failures and docs don't build on Mac OS X Lion * :ghissue:`1996`: frontend test tweaks * :ghissue:`2011`: Notebook server can't start cluster with hyphen-containing profile name * :ghissue:`2014`: relax profile regex in notebook * :ghissue:`2013`: brew install pyqt * :ghissue:`2005`: Strange output artifacts in footer of notebook * :ghissue:`2012`: Mono cursor offset * :ghissue:`2004`: Clarify generic message spec vs. Python message API in docs * :ghissue:`2006`: Don't crash when starting notebook server if runnable browser not found * :ghissue:`2010`: notebook: Print a warning (but do not abort) if no webbrowser can be found. * :ghissue:`2008`: pip install virtualenv * :ghissue:`2003`: Wrong case of rmagic in docs * :ghissue:`2002`: Refactor %magic into a lsmagic_docs API function. * :ghissue:`2000`: kernel.js consistency with generic IPython message format. * :ghissue:`1999`: `%magic` help: display line and cell magics in alphabetical order. * :ghissue:`1635`: test_prun_quotes fails on Windows * :ghissue:`1984`: Cannot restart Notebook when using `%%script --bg` * :ghissue:`1981`: Clean BG processes created by %%script on kernel exit * :ghissue:`1994`: Fix RST misformatting. * :ghissue:`1949`: Introduce Notebook Magics * :ghissue:`1985`: Kernels should start in notebook dir when manually specified * :ghissue:`1980`: Notebook should check that --notebook-dir exists * :ghissue:`1951`: minor notebook startup/notebook-dir adjustments * :ghissue:`1969`: tab completion in notebook for paths not triggered * :ghissue:`1974`: Allow path completion on notebook. * :ghissue:`1964`: allow multiple instances of a Magic * :ghissue:`1960`: %page not working * :ghissue:`1991`: fix _ofind attr in %page * :ghissue:`1982`: Shutdown qtconsole problem? * :ghissue:`1988`: check for active frontend in update_restart_checkbox * :ghissue:`1979`: Add support for tox (https://tox.readthedocs.io/) and Travis CI (http://travis-ci.org/) * :ghissue:`1989`: Parallel: output of %px and %px${suffix} is inconsistent * :ghissue:`1966`: ValueError: packer could not serialize a simple message * :ghissue:`1987`: Notebook: MathJax offline install not recognized * :ghissue:`1970`: dblclick to restore size of images * :ghissue:`1983`: Notebook does not save heading level * :ghissue:`1978`: Notebook names truncating at the first period * :ghissue:`1553`: Limited size of output cells and provide scroll bars for such output cells * :ghissue:`1825`: second attempt at scrolled long output * :ghissue:`1915`: add cell-level metadata * :ghissue:`1934`: Cell/Worksheet metadata * :ghissue:`1746`: Confirm restart (configuration option, and checkbox UI) * :ghissue:`1790`: Commenting function. * :ghissue:`1767`: Tab completion problems with cell magics * :ghissue:`1944`: [qtconsole] take %,%% prefix into account for completion * :ghissue:`1973`: fix another FreeBSD $HOME symlink issue * :ghissue:`1972`: Fix completion of '%tim' in the Qt console * :ghissue:`1887`: Make it easy to resize jpeg/png images back to original size. * :ghissue:`1967`: Fix psums example description in docs * :ghissue:`1678`: ctrl-z clears cell output in notebook when pressed enough times * :ghissue:`1965`: fix for #1678, undo no longer clears cells * :ghissue:`1952`: avoid duplicate "Websockets closed" dialog on ws close * :ghissue:`1961`: UnicodeDecodeError on directory with unicode chars in prompt * :ghissue:`1963`: styling prompt, {color.Normal} excepts * :ghissue:`1962`: Support unicode prompts * :ghissue:`1959`: %page not working on qtconsole for Windows XP 32-bit * :ghissue:`1955`: update to latest version of vim-ipython * :ghissue:`1945`: Add --proc option to %%script * :ghissue:`1957`: fix indentation in kernel.js * :ghissue:`1956`: move import RemoteError after get_exc_info * :ghissue:`1950`: Fix for copy action (Ctrl+C) when there is no pager defined in qtconsole * :ghissue:`1948`: Fix help string for InteractiveShell.ast_node_interactivity * :ghissue:`1941`: script magics cause terminal spam * :ghissue:`1942`: swallow stderr of which in utils.process.find_cmd * :ghissue:`1833`: completer draws slightly too small on Chrome * :ghissue:`1940`: fix completer css on some Chrome versions * :ghissue:`1938`: remove remaining references to deprecated XREP/XREQ names * :ghissue:`1924`: HTML superscripts not shown raised in the notebook * :ghissue:`1925`: Fix styling of superscripts and subscripts. Closes #1924. * :ghissue:`1461`: User notification if notebook saving fails * :ghissue:`1936`: increase duration of save messages * :ghissue:`1542`: %save magic fails in clients without stdin if file already exists * :ghissue:`1937`: add %save -f * :ghissue:`1572`: pyreadline version dependency not correctly checked * :ghissue:`1935`: add version checking to pyreadline import test * :ghissue:`1849`: Octave magics * :ghissue:`1759`: github, merge PR(s) just by number(s) * :ghissue:`1931`: Win py3fixes * :ghissue:`1646`: Meaning of restart parameter in client.shutdown() unclear * :ghissue:`1933`: oinspect.find_file: Additional safety if file cannot be found. * :ghissue:`1916`: %paste doesn't work on py3 * :ghissue:`1932`: Fix adding functions to CommandChainDispatcher with equal priority on Py 3 * :ghissue:`1928`: Select NoDB by default * :ghissue:`1923`: Add IPython syntax support to the %timeit magic, in line and cell mode * :ghissue:`1926`: Make completer recognize escaped quotes in strings. * :ghissue:`1929`: Ipython-qtconsole (0.12.1) hangs with Python 2.7.3, Windows 7 64 bit * :ghissue:`1409`: [qtconsole] forward delete bring completion into current line * :ghissue:`1922`: py3k compatibility for setupegg.py * :ghissue:`1598`: document that sync_imports() can't handle "import foo as bar" * :ghissue:`1893`: Update Parallel Magics and Exception Display * :ghissue:`1890`: Docstrings for magics that use @magic_arguments are rendered wrong * :ghissue:`1921`: magic_arguments: dedent but otherwise preserve indentation. * :ghissue:`1919`: Use oinspect in CodeMagics._find_edit_target * :ghissue:`1918`: don't warn in iptest if deathrow/quarantine are missing * :ghissue:`1914`: %pdef failing on python3 * :ghissue:`1917`: Fix for %pdef on Python 3 * :ghissue:`1428`: Failing test that prun does not clobber string escapes * :ghissue:`1913`: Fix for #1428 * :ghissue:`1911`: temporarily skip autoreload tests * :ghissue:`1549`: autoreload extension crashes ipython * :ghissue:`1908`: find_file errors on windows * :ghissue:`1909`: Fix for #1908, use os.path.normcase for safe filename comparisons * :ghissue:`1907`: py3compat fixes for %%script and tests * :ghissue:`1904`: %%px? doesn't work, shows info for %px, general cell magic problem * :ghissue:`1906`: ofind finds non-unique cell magics * :ghissue:`1894`: Win64 binary install fails * :ghissue:`1799`: Source file not found for magics * :ghissue:`1845`: Fixes to inspection machinery for magics * :ghissue:`1774`: Some magics seems broken * :ghissue:`1586`: Clean up tight coupling between Notebook, CodeCell and Kernel Javascript objects * :ghissue:`1632`: Win32 shell interactivity apparently broke qtconsole "cd" magic * :ghissue:`1902`: Workaround fix for gh-1632; minimal revert of gh-1424 * :ghissue:`1900`: Cython libs * :ghissue:`1503`: Cursor is offset in notebook in Chrome 17 on Linux * :ghissue:`1426`: Qt console doesn't handle the `--gui` flag correctly. * :ghissue:`1180`: Can't start IPython kernel in Spyder * :ghissue:`581`: test IPython.zmq * :ghissue:`1593`: Name embedded in notebook overrides filename * :ghissue:`1899`: add ScriptMagics to class list for generated config * :ghissue:`1618`: generate or minimize manpages * :ghissue:`1898`: minimize manpages * :ghissue:`1896`: Windows: apparently spurious warning 'Excluding nonexistent file' ... test_exampleip * :ghissue:`1897`: use glob for bad exclusion warning * :ghissue:`1215`: updated %quickref to show short-hand for %sc and %sx * :ghissue:`1855`: %%script and %%file magics * :ghissue:`1863`: Ability to silence a cell in the notebook * :ghissue:`1870`: add %%capture for capturing stdout/err * :ghissue:`1861`: Use dvipng to format sympy.Matrix * :ghissue:`1867`: Fix 1px margin bouncing of selected menu item. * :ghissue:`1889`: Reconnect when the websocket connection closes unexpectedly * :ghissue:`1577`: If a notebook loses its network connection WebSockets won't reconnect * :ghissue:`1886`: Fix a bug in renaming notebook * :ghissue:`1895`: Fix error in test suite with ip.system() * :ghissue:`1762`: add `locate` entry points * :ghissue:`1883`: Fix vertical offset due to bold/italics, and bad browser fonts. * :ghissue:`1875`: re-write columnize, with intermediate step. * :ghissue:`1860`: IPython.utils.columnize sometime wrong... * :ghissue:`1851`: new completer for qtconsole. * :ghissue:`1892`: Remove suspicious quotes in interactiveshell.py * :ghissue:`1854`: Class `%hierarchy` and graphiz `%%dot` magics * :ghissue:`1827`: Sending tracebacks over ZMQ should protect against unicode failure * :ghissue:`1864`: Rmagic exceptions * :ghissue:`1829`: [notebook] don't care about leading prct in completion * :ghissue:`1832`: Make svg, jpeg and png images resizable in notebook. * :ghissue:`1674`: HTML Notebook carriage-return handling, take 2 * :ghissue:`1874`: cython_magic uses importlib, which doesn't ship with py2.6 * :ghissue:`1882`: Remove importlib dependency which not available in Python 2.6. * :ghissue:`1878`: shell access using ! will not fill class or function scope vars * :ghissue:`1879`: Correct stack depth for variable expansion in !system commands * :ghissue:`1840`: New JS completer should merge completions before display * :ghissue:`1841`: [notebook] deduplicate completion results * :ghissue:`1736`: no good error message on missing tkinter and %paste * :ghissue:`1741`: Display message from TryNext error in magic_paste * :ghissue:`1850`: Remove args/kwargs handling in TryNext, fix %paste error messages. * :ghissue:`1663`: Keep line-endings in ipynb * :ghissue:`1872`: Matplotlib window freezes using intreractive plot in qtconsole * :ghissue:`1869`: Improve CodeMagics._find_edit_target * :ghissue:`1781`: Colons in notebook name causes notebook deletion without warning * :ghissue:`1815`: Make : invalid in filenames in the Notebook JS code. * :ghissue:`1819`: doc: cleanup the parallel psums example a little * :ghissue:`1838`: externals cleanup * :ghissue:`1839`: External cleanup * :ghissue:`1782`: fix Magic menu in qtconsole, split in groups * :ghissue:`1862`: Minor bind_kernel improvements * :ghissue:`1859`: kernmagic during console startup * :ghissue:`1857`: Prevent jumping of window to input when output is clicked. * :ghissue:`1856`: Fix 1px jumping of cells and menus in Notebook. * :ghissue:`1848`: task fails with "AssertionError: not enough buffers!" after second resubmit * :ghissue:`1852`: fix chained resubmissions * :ghissue:`1780`: Rmagic extension * :ghissue:`1853`: Fix jumpy notebook behavior * :ghissue:`1842`: task with UnmetDependency error still owned by engine * :ghissue:`1847`: add InlineBackend to ConsoleApp class list * :ghissue:`1846`: Exceptions within multiprocessing crash Ipython notebook kernel * :ghissue:`1843`: Notebook does not exist and permalinks * :ghissue:`1837`: edit magic broken in head * :ghissue:`1834`: resubmitted tasks doesn't have same session name * :ghissue:`1836`: preserve header for resubmitted tasks * :ghissue:`1776`: fix magic menu in qtconsole * :ghissue:`1828`: change default extension to .ipy for %save -r * :ghissue:`1800`: Reintroduce recall * :ghissue:`1671`: __future__ environments * :ghissue:`1830`: lsmagic lists magics in alphabetical order * :ghissue:`1835`: Use Python import in ipython profile config * :ghissue:`1773`: Update SymPy profile: SymPy's latex() can now print set and frozenset * :ghissue:`1761`: Edited documentation to use IPYTHONDIR in place of ~/.ipython * :ghissue:`1772`: notebook autocomplete fail when typing number * :ghissue:`1822`: aesthetics pass on AsyncResult.display_outputs * :ghissue:`1460`: Redirect http to https for notebook * :ghissue:`1287`: Refactor the notebook tab completion/tooltip * :ghissue:`1596`: In rename dialog, should submit * :ghissue:`1821`: ENTER submits the rename notebook dialog. * :ghissue:`1750`: Let the user disable random port selection * :ghissue:`1820`: NotebookApp: Make the number of ports to retry user configurable. * :ghissue:`1816`: Always use filename as the notebook name. * :ghissue:`1775`: assert_in not present on Python 2.6 * :ghissue:`1813`: Add assert_in method to nose for Python 2.6 * :ghissue:`1498`: Add tooltip keyboard shortcuts * :ghissue:`1711`: New Tooltip, New Completer and JS Refactor * :ghissue:`1798`: a few simple fixes for docs/parallel * :ghissue:`1818`: possible bug with latex / markdown * :ghissue:`1647`: Aborted parallel tasks can't be resubmitted * :ghissue:`1817`: Change behavior of ipython notebook --port=... * :ghissue:`1738`: IPython.embed_kernel issues * :ghissue:`1610`: Basic bold and italic in HTML output cells * :ghissue:`1576`: Start and stop kernels from the notebook dashboard * :ghissue:`1515`: impossible to shutdown notebook kernels * :ghissue:`1812`: Ensure AsyncResult.display_outputs doesn't display empty streams * :ghissue:`1811`: warn on nonexistent exclusions in iptest * :ghissue:`1809`: test suite error in IPython.zmq on windows * :ghissue:`1810`: fix for #1809, failing tests in IPython.zmq * :ghissue:`1808`: Reposition alternate upload for firefox [need cross browser/OS/language test] * :ghissue:`1742`: Check for custom_exceptions only once * :ghissue:`1802`: cythonmagic tests should be skipped if Cython not available * :ghissue:`1062`: warning message in IPython.extensions test * :ghissue:`1807`: add missing cython exclusion in iptest * :ghissue:`1805`: Fixed a vcvarsall.bat error on win32/Py2.7 when trying to compile with m... * :ghissue:`1803`: MPI parallel %px bug * :ghissue:`1804`: Fixed a vcvarsall.bat error on win32/Py2.7 when trying to compile with mingw. * :ghissue:`1492`: Drag target very small if IPython Dashboard has no notebooks * :ghissue:`1562`: Offer a method other than drag-n-drop to upload notebooks * :ghissue:`1739`: Dashboard improvement (necessary merge of #1658 and #1676 + fix #1492) * :ghissue:`1770`: Cython related magic functions * :ghissue:`1532`: qtconsole does not accept --gui switch * :ghissue:`1707`: Accept --gui=<...> switch in IPython qtconsole. * :ghissue:`1797`: Fix comment which breaks Emacs syntax highlighting. * :ghissue:`1796`: %gui magic broken * :ghissue:`1795`: fix %gui magic * :ghissue:`1788`: extreme truncating of return values * :ghissue:`1793`: Raise repr limit for strings to 80 characters (from 30). * :ghissue:`1794`: don't use XDG path on OS X * :ghissue:`1777`: ipython crash on wrong encoding * :ghissue:`1792`: Unicode-aware logger * :ghissue:`1791`: update zmqshell magics * :ghissue:`1787`: DOC: Remove regression from qt-console docs. * :ghissue:`1785`: IPython.utils.tests.test_process.SubProcessTestCase * :ghissue:`1758`: test_pr, fallback on http if git protocol fail, and SSL errors... * :ghissue:`1786`: Make notebook save failures more salient * :ghissue:`1748`: Fix some tests for Python 3.3 * :ghissue:`1755`: test for pygments before running qt tests * :ghissue:`1771`: Make default value of interactivity passed to run_ast_nodes configurable * :ghissue:`1783`: part of PR #1606 (loadpy -> load) erased by magic refactoring. * :ghissue:`1784`: restore loadpy to load * :ghissue:`1768`: Update parallel magics * :ghissue:`1778`: string exception in IPython/core/magic.py:232 * :ghissue:`1779`: Tidy up error raising in magic decorators. * :ghissue:`1769`: Allow cell mode timeit without setup code. * :ghissue:`1716`: Fix for fake filenames in verbose traceback * :ghissue:`1763`: [qtconsole] fix append_plain_html -> append_html * :ghissue:`1766`: Test failure in IPython.parallel * :ghissue:`1611`: IPEP1: Cell magics and general cleanup of the Magic system * :ghissue:`1732`: Refactoring of the magics system and implementation of cell magics * :ghissue:`1765`: test_pr should clearn PYTHONPATH for the subprocesses * :ghissue:`1630`: Merge divergent Kernel implementations * :ghissue:`1705`: [notebook] Make pager resizable, and remember size... * :ghissue:`1606`: Share code for %pycat and %loadpy, make %pycat aware of URLs * :ghissue:`1720`: Adding interactive inline plotting to notebooks with flot * :ghissue:`1701`: [notebook] Open HTML links in a new window by default * :ghissue:`1757`: Open IPython notebook hyperlinks in a new window using target=_blank * :ghissue:`1735`: Open IPython notebook hyperlinks in a new window using target=_blank * :ghissue:`1754`: Fix typo enconters->encounters * :ghissue:`1753`: Clear window title when kernel is restarted * :ghissue:`735`: Images missing from XML/SVG export (for me) * :ghissue:`1449`: Fix for bug #735 : Images missing from XML/SVG export * :ghissue:`1752`: Reconnect Websocket when it closes unexpectedly * :ghissue:`1751`: Reconnect Websocket when it closes unexpectedly * :ghissue:`1749`: Load MathJax.js using HTTPS when IPython notebook server is HTTPS * :ghissue:`1743`: Tooltip completer js refactor * :ghissue:`1700`: A module for sending custom user messages from the kernel. * :ghissue:`1745`: htmlnotebook: Cursor is off * :ghissue:`1728`: ipython crash with matplotlib during picking * :ghissue:`1681`: add qt config option to clear_on_kernel_restart * :ghissue:`1733`: Tooltip completer js refactor * :ghissue:`1676`: Kernel status/shutdown from dashboard * :ghissue:`1658`: Alternate notebook upload methods * :ghissue:`1727`: terminate kernel after embed_kernel tests * :ghissue:`1737`: add HistoryManager to ipapp class list * :ghissue:`945`: Open a notebook from the command line * :ghissue:`1686`: ENH: Open a notebook from the command line * :ghissue:`1709`: fixes #1708, failing test in arg_split on windows * :ghissue:`1718`: Use CRegExp trait for regular expressions. * :ghissue:`1729`: Catch failure in repr() for %whos * :ghissue:`1726`: use eval for command-line args instead of exec * :ghissue:`1723`: scatter/gather fail with targets='all' * :ghissue:`1724`: fix scatter/gather with targets='all' * :ghissue:`1725`: add --no-ff to git pull in test_pr * :ghissue:`1722`: unicode exception when evaluating expression with non-ascii characters * :ghissue:`1721`: Tooltip completer js refactor * :ghissue:`1657`: Add `wait` optional argument to `hooks.editor` * :ghissue:`123`: Define sys.ps{1,2} * :ghissue:`1717`: Define generic sys.ps{1,2,3}, for use by scripts. * :ghissue:`1442`: cache-size issue in qtconsole * :ghissue:`1691`: Finish PR #1446 * :ghissue:`1446`: Fixing Issue #1442 * :ghissue:`1710`: update MathJax CDN url for https * :ghissue:`81`: Autocall fails if first function argument begins with "-" or "+ * :ghissue:`1713`: Make autocall regexp's configurable. * :ghissue:`211`: paste command not working * :ghissue:`1703`: Allow TryNext to have an error message without it affecting the command chain * :ghissue:`1714`: minor adjustments to test_pr * :ghissue:`1509`: New tooltip for notebook * :ghissue:`1697`: Major refactoring of the Notebook, Kernel and CodeCell JavaScript. * :ghissue:`788`: Progress indicator in the notebook (and perhaps the Qt console) * :ghissue:`1034`: Single process Qt console * :ghissue:`1557`: magic function conflict while using --pylab * :ghissue:`1476`: Pylab figure objects not properly updating * :ghissue:`1704`: ensure all needed qt parts can be imported before settling for one * :ghissue:`1708`: test failure in arg_split on windows * :ghissue:`1706`: Mark test_push_numpy_nocopy as a known failure for Python 3 * :ghissue:`1696`: notebook tooltip fail on function with number * :ghissue:`1698`: fix tooltip on token with number * :ghissue:`1226`: Windows GUI only (pythonw) bug for IPython on Python 3.x * :ghissue:`1245`: pythonw py3k fixes for issue #1226 * :ghissue:`1417`: Notebook Completer Class * :ghissue:`1690`: [Bogus] Deliberately make a test fail * :ghissue:`1685`: Add script to test pull request * :ghissue:`1167`: Settle on a choice for $IPYTHONDIR * :ghissue:`1693`: deprecate IPYTHON_DIR in favor of IPYTHONDIR * :ghissue:`1672`: ipython-qtconsole.desktop is using a deprecated format * :ghissue:`1695`: Avoid deprecated warnings from ipython-qtconsole.desktop. * :ghissue:`1694`: Add quote to notebook to allow it to load * :ghissue:`1240`: sys.path missing `''` as first entry when kernel launched without interface * :ghissue:`1689`: Fix sys.path missing '' as first entry in `ipython kernel`. * :ghissue:`1683`: Parallel controller failing with Pymongo 2.2 * :ghissue:`1687`: import Binary from bson instead of pymongo * :ghissue:`1614`: Display Image in Qtconsole * :ghissue:`1616`: Make IPython.core.display.Image less notebook-centric * :ghissue:`1684`: CLN: Remove redundant function definition. * :ghissue:`1655`: Add %open magic command to open editor in non-blocking manner * :ghissue:`1677`: middle-click paste broken in notebook * :ghissue:`1670`: Point %pastebin to gist * :ghissue:`1667`: Test failure in test_message_spec * :ghissue:`1668`: Test failure in IPython.zmq.tests.test_message_spec.test_complete "'pyout' != 'status'" * :ghissue:`1669`: handle pyout messages in test_message_spec * :ghissue:`1295`: add binary-tree engine interconnect example * :ghissue:`1642`: Cherry-picked commits from 0.12.1 release * :ghissue:`1659`: Handle carriage return characters ("\r") in HTML notebook output. * :ghissue:`1313`: Figure out MathJax 2 support * :ghissue:`1653`: Test failure in IPython.zmq * :ghissue:`1656`: ensure kernels are cleaned up in embed_kernel tests * :ghissue:`1666`: pip install ipython==dev installs version 0.8 from an old svn repo * :ghissue:`1664`: InteractiveShell.run_code: Update docstring. * :ghissue:`1512`: `print stuff,` should avoid newline * :ghissue:`1662`: Delay flushing softspace until after cell finishes * :ghissue:`1643`: handle jpg/jpeg in the qtconsole * :ghissue:`966`: dreload fails on Windows XP with IPython 0.11 "Unexpected Error" * :ghissue:`1500`: dreload doesn't seem to exclude numpy * :ghissue:`1520`: kernel crash when showing tooltip (?) * :ghissue:`1652`: add patch_pyzmq() for backporting a few changes from newer pyzmq * :ghissue:`1650`: DOC: moving files with SSH launchers * :ghissue:`1357`: add IPython.embed_kernel() * :ghissue:`1640`: Finish up embed_kernel * :ghissue:`1651`: Remove bundled Itpl module * :ghissue:`1634`: incremental improvements to SSH launchers * :ghissue:`1649`: move examples/test_embed into examples/tests/embed * :ghissue:`1171`: Recognise virtualenvs * :ghissue:`1479`: test_extension failing in Windows * :ghissue:`1633`: Fix installing extension from local file on Windows * :ghissue:`1644`: Update copyright date to 2012 * :ghissue:`1636`: Test_deepreload breaks pylab irunner tests * :ghissue:`1645`: Exclude UserDict when deep reloading NumPy. * :ghissue:`1454`: make it possible to start engine in 'disabled' mode and 'enable' later * :ghissue:`1641`: Escape code for the current time in PromptManager * :ghissue:`1638`: ipython console clobbers custom sys.path * :ghissue:`1637`: Removed a ':' which shouldn't have been there * :ghissue:`1536`: ipython 0.12 embed shell won't run startup scripts * :ghissue:`1628`: error: QApplication already exists in TestKillRing * :ghissue:`1631`: TST: QApplication doesn't quit early enough with PySide. * :ghissue:`1629`: evaluate a few dangling validate_message generators * :ghissue:`1621`: clear In[] prompt numbers on "Clear All Output" * :ghissue:`1627`: Test the Message Spec * :ghissue:`1470`: SyntaxError on setup.py install with Python 3 * :ghissue:`1624`: Fixes for byte-compilation on Python 3 * :ghissue:`1612`: pylab=inline fig.show() non-existent in notebook * :ghissue:`1615`: Add show() method to figure objects. * :ghissue:`1622`: deepreload fails on Python 3 * :ghissue:`1625`: Fix deepreload on Python 3 * :ghissue:`1626`: Failure in new `dreload` tests under Python 3.2 * :ghissue:`1623`: IPython / matplotlib Memory error with imshow * :ghissue:`1619`: pyin messages should have execution_count * :ghissue:`1620`: pyin message now have execution_count * :ghissue:`32`: dreload produces spurious traceback when numpy is involved * :ghissue:`1457`: Update deepreload to use a rewritten knee.py. Fixes dreload(numpy). * :ghissue:`1613`: allow map / parallel function for single-engine views * :ghissue:`1609`: exit notebook cleanly on SIGINT, SIGTERM * :ghissue:`1531`: Function keyword completion fails if cursor is in the middle of the complete parentheses * :ghissue:`1607`: cleanup sqlitedb temporary db file after tests * :ghissue:`1608`: don't rely on timedelta.total_seconds in AsyncResult * :ghissue:`1421`: ipython32 %run -d breaks with NameError name 'execfile' is not defined * :ghissue:`1599`: Fix for %run -d on Python 3 * :ghissue:`1201`: %env magic fails with Python 3.2 * :ghissue:`1602`: Fix %env magic on Python 3. * :ghissue:`1603`: Remove python3 profile * :ghissue:`1604`: Exclude IPython.quarantine from installation * :ghissue:`1601`: Security file is not removed after shutdown by Ctrl+C or kill -INT * :ghissue:`1600`: Specify encoding for io.open in notebook_reformat tests * :ghissue:`1605`: Small fixes for Animation and Progress notebook * :ghissue:`1452`: Bug fix for approval * :ghissue:`13`: Improve robustness and debuggability of test suite * :ghissue:`70`: IPython should prioritize __all__ during tab completion * :ghissue:`1529`: __all__ feature, improvement to dir2, and tests for both * :ghissue:`1475`: Custom namespace for %run * :ghissue:`1564`: calling .abort on AsyncMapResult results in traceback * :ghissue:`1548`: add sugar methods/properties to AsyncResult * :ghissue:`1535`: Fix pretty printing dispatch * :ghissue:`1522`: Discussion: some potential Qt console refactoring * :ghissue:`1399`: Use LaTeX to print various built-in types with the SymPy printing extension * :ghissue:`1597`: re-enter kernel.eventloop after catching SIGINT * :ghissue:`1490`: rename plaintext cell -> raw cell * :ghissue:`1487`: %notebook fails in qtconsole * :ghissue:`1545`: trailing newline not preserved in splitline ipynb * :ghissue:`1480`: Fix %notebook magic, etc. nbformat unicode tests and fixes * :ghissue:`1588`: Gtk3 integration with ipython works. * :ghissue:`1595`: Examples syntax (avoid errors installing on Python 3) * :ghissue:`1526`: Find encoding for Python files * :ghissue:`1594`: Fix writing git commit ID to a file on build with Python 3 * :ghissue:`1556`: shallow-copy DictDB query results * :ghissue:`1499`: various pyflakes issues * :ghissue:`1502`: small changes in response to pyflakes pass * :ghissue:`1445`: Don't build sphinx docs for sdists * :ghissue:`1484`: unhide .git_commit_info.ini * :ghissue:`1538`: store git commit hash in utils._sysinfo instead of hidden data file * :ghissue:`1546`: attempt to suppress exceptions in channel threads at shutdown * :ghissue:`1524`: unhide git_commit_info.ini * :ghissue:`1559`: update tools/github_stats.py to use GitHub API v3 * :ghissue:`1563`: clear_output improvements * :ghissue:`1558`: Ipython testing documentation still mentions twisted and trial * :ghissue:`1560`: remove obsolete discussion of Twisted/trial from testing docs * :ghissue:`1561`: Qtconsole - nonstandard \a and \b * :ghissue:`1569`: BUG: qtconsole -- non-standard handling of \a and \b. [Fixes #1561] * :ghissue:`1574`: BUG: Ctrl+C crashes wx pylab kernel in qtconsole * :ghissue:`1573`: BUG: Ctrl+C crashes wx pylab kernel in qtconsole. * :ghissue:`1590`: 'IPython3 qtconsole' doesn't work in Windows 7 * :ghissue:`602`: User test the html notebook * :ghissue:`613`: Implement Namespace panel section * :ghissue:`879`: How to handle Javascript output in the notebook * :ghissue:`1255`: figure.show() raises an error with the inline backend * :ghissue:`1467`: Document or bundle a git-integrated facility for stripping VCS-unfriendly binary data * :ghissue:`1237`: Kernel status and logout button overlap * :ghissue:`1319`: Running a cell with ctrl+Enter selects text in cell * :ghissue:`1571`: module member autocomplete should respect __all__ * :ghissue:`1566`: ipython3 doesn't run in Win7 with Python 3.2 * :ghissue:`1568`: fix PR #1567 * :ghissue:`1567`: Fix: openssh_tunnel did not parse port in `server` * :ghissue:`1565`: fix AsyncResult.abort * :ghissue:`1550`: Crash when starting notebook in a non-ascii path * :ghissue:`1552`: use os.getcwdu in NotebookManager * :ghissue:`1554`: wrong behavior of the all function on iterators * :ghissue:`1541`: display_pub flushes stdout/err * :ghissue:`1539`: Asynchrous issue when using clear_display and print x,y,z * :ghissue:`1544`: make MultiKernelManager.kernel_manager_class configurable * :ghissue:`1494`: Untrusted Secure Websocket broken on latest chrome dev * :ghissue:`1521`: only install ipython-qtconsole gui script on Windows * :ghissue:`1528`: Tab completion optionally respects __all__ (+ dir2() cleanup) * :ghissue:`1527`: Making a progress bar work in IPython Notebook * :ghissue:`1497`: __all__ functionality added to dir2(obj) * :ghissue:`1518`: Pretty printing exceptions is broken * :ghissue:`811`: Fixes for ipython unhandeled OSError exception on failure of os.getcwdu() * :ghissue:`1517`: Fix indentation bug in IPython/lib/pretty.py * :ghissue:`1519`: BUG: Include the name of the exception type in its pretty format. * :ghissue:`1525`: A hack for auto-complete numpy recarray * :ghissue:`1489`: Fix zero-copy push * :ghissue:`1401`: numpy arrays cannot be used with View.apply() in Python 3 * :ghissue:`1477`: fix dangling `buffer` in IPython.parallel.util * :ghissue:`1514`: DOC: Fix references to IPython.lib.pretty instead of the old location * :ghissue:`1511`: Version comparison error ( '2.1.11' < '2.1.4' ==> True) * :ghissue:`1506`: "Fixing" the Notebook scroll to help in visually comparing outputs * :ghissue:`1481`: BUG: Improve placement of CallTipWidget * :ghissue:`1241`: When our debugger class is used standalone `_oh` key errors are thrown * :ghissue:`676`: IPython.embed() from ipython crashes twice on exit * :ghissue:`1496`: BUG: LBYL when clearing the output history on shutdown. * :ghissue:`1507`: python3 notebook: TypeError: unorderable types * :ghissue:`1508`: fix sorting profiles in clustermanager * :ghissue:`1495`: BUG: Fix pretty-printing for overzealous objects * :ghissue:`1505`: SQLite objects created in a thread can only be used in that same thread * :ghissue:`1482`: %history documentation out of date? * :ghissue:`1501`: dreload doesn't seem to exclude numpy * :ghissue:`1472`: more general fix for #662 * :ghissue:`1486`: save state of qtconsole * :ghissue:`1485`: add history search to qtconsole * :ghissue:`1483`: updated magic_history docstring * :ghissue:`1383`: First version of cluster web service. * :ghissue:`482`: test_run.test_tclass fails on Windows * :ghissue:`1398`: fix %tb after SyntaxError * :ghissue:`1478`: key function or lambda in sorted function doesn't find global variables * :ghissue:`1415`: handle exit/quit/exit()/quit() variants in zmqconsole * :ghissue:`1440`: Fix for failing testsuite when using --with-xml-coverage on windows. * :ghissue:`1419`: Add %install_ext magic function. * :ghissue:`1424`: Win32 shell interactivity * :ghissue:`1434`: Controller should schedule tasks of multiple clients at the same time * :ghissue:`1268`: notebook %reset magic fails with StdinNotImplementedError * :ghissue:`1438`: from cherrypy import expose fails when running script form parent directory * :ghissue:`1468`: Simplify structure of a Job in the TaskScheduler * :ghissue:`875`: never build unicode error messages * :ghissue:`1107`: Tab autocompletion can suggest invalid syntax * :ghissue:`1447`: 1107 - Tab autocompletion can suggest invalid syntax * :ghissue:`1469`: Fix typo in comment (insert space) * :ghissue:`1463`: Fix completion when importing modules in the cwd. * :ghissue:`1437`: unfriendly error handling with pythonw and ipython-qtconsole * :ghissue:`1466`: Fix for issue #1437, unfriendly windows qtconsole error handling * :ghissue:`1432`: Fix ipython directive * :ghissue:`1465`: allow `ipython help subcommand` syntax * :ghissue:`1394`: Wishlist: Remove hard dependency on ctypes * :ghissue:`1416`: Conditional import of ctypes in inputhook * :ghissue:`1462`: expedite parallel tests * :ghissue:`1418`: Strict mode in javascript * :ghissue:`1410`: Add javascript library and css stylesheet loading to JS class. * :ghissue:`1427`: #922 again * :ghissue:`1448`: Fix for #875 Never build unicode error messages * :ghissue:`1458`: use eval to uncan References * :ghissue:`1455`: Python3 install fails * :ghissue:`1450`: load mathjax from CDN via https * :ghissue:`1182`: Qtconsole, multiwindow * :ghissue:`1439`: Notebook not storing heading celltype information * :ghissue:`1451`: include heading level in JSON * :ghissue:`1444`: Fix pyhton -> python typos * :ghissue:`1412`: Input parsing issue with %prun * :ghissue:`1414`: ignore errors in shell.var_expand * :ghissue:`1441`: (1) Enable IPython.notebook.kernel.execute to publish display_* even it is not called with a code cell and (2) remove empty html element when execute "display_*" * :ghissue:`1431`: Beginner Error: ipython qtconsole * :ghissue:`1436`: "ipython-qtconsole --gui qt" hangs on 64-bit win7 * :ghissue:`1433`: websocket connection fails on Chrome * :ghissue:`1430`: Fix for tornado check for tornado < 1.1.0 * :ghissue:`1408`: test_get_home_dir_3 failed on Mac OS X * :ghissue:`1413`: get_home_dir expands symlinks, adjust test accordingly * :ghissue:`1420`: fixes #922 * :ghissue:`823`: KnownFailure tests appearing as errors * :ghissue:`1385`: updated and prettified magic doc strings * :ghissue:`1406`: Browser selection * :ghissue:`1411`: ipcluster starts 8 engines "successfully" but Client only finds two * :ghissue:`1375`: %history -g -f file encoding issue * :ghissue:`1377`: Saving non-ascii history * :ghissue:`797`: Source introspection needs to be smarter in python 3.2 * :ghissue:`846`: Autoreload extension doesn't work with Python 3.2 * :ghissue:`1360`: IPython notebook not starting on winXP * :ghissue:`1407`: Qtconsole segfaults on OSX when displaying some pop-up function tooltips * :ghissue:`1402`: fix symlinked /home issue for FreeBSD * :ghissue:`1403`: pyreadline cyclic dependency with pdb++/pdbpp module * :ghissue:`1405`: Only monkeypatch xunit when the tests are run using it. * :ghissue:`1404`: Feature Request: List/Dictionary tab completion * :ghissue:`1395`: Xunit & KnownFailure * :ghissue:`1396`: Fix for %tb magic. * :ghissue:`1397`: Stay or leave message not working, Safari session lost. * :ghissue:`1389`: pylab=inline inoperant through ssh tunnelling? * :ghissue:`1386`: Jsd3 * :ghissue:`1388`: Add simple support for running inside a virtualenv * :ghissue:`826`: Add support for creation of parallel task when no engine is running * :ghissue:`1391`: Improve Hub/Scheduler when no engines are registered * :ghissue:`1369`: load header with engine id when engine dies in TaskScheduler * :ghissue:`1345`: notebook can't save unicode as script * :ghissue:`1353`: Save notebook as script using unicode file handle. * :ghissue:`1352`: Add '-m mod : run library module as a script' option. * :ghissue:`1363`: Fix some minor color/style config issues in the qtconsole * :ghissue:`1371`: Adds a quiet keyword to sync_imports * :ghissue:`1390`: Blank screen for notebooks on Safari * :ghissue:`1387`: Fixing Cell menu to update cell type select box. * :ghissue:`645`: Standalone WX GUI support is broken * :ghissue:`1296`: Wx gui example: fixes the broken example for `%gui wx`. * :ghissue:`1254`: typo in notebooklist.js breaks links * :ghissue:`781`: Users should be able to clone a notebook * :ghissue:`1372`: ipcontroller cleans up connection files unless reuse=True * :ghissue:`1374`: remove calls to meaningless ZMQStream.on_err * :ghissue:`1382`: Update RO for Notebook * :ghissue:`1370`: allow draft76 websockets (Safari) * :ghissue:`1368`: Ensure handler patterns are str, not unicode * :ghissue:`1379`: Sage link on website homepage broken * :ghissue:`1376`: FWIW does not work with Chrome 16.0.912.77 Ubuntu 10.10 * :ghissue:`1358`: Cannot install ipython on Windows 7 64-bit * :ghissue:`1367`: Ctrl - m t does not toggle output in chrome * :ghissue:`1359`: [sympyprinting] MathJax can't render \root{m}{n} * :ghissue:`1337`: Tab in the notebook after `(` should not indent, only give a tooltip * :ghissue:`1339`: Notebook printing broken * :ghissue:`1344`: Ctrl + M + L does not toggle line numbering in htmlnotebook * :ghissue:`1348`: Ctrl + M + M does not switch to markdown cell * :ghissue:`1361`: Notebook bug fix branch * :ghissue:`1364`: avoid jsonlib returning Decimal * :ghissue:`1362`: Don't log complete contents of history replies, even in debug * :ghissue:`888`: ReST support in notebooks * :ghissue:`1205`: notebook stores HTML escaped text in the file * :ghissue:`1351`: add IPython.embed_kernel() * :ghissue:`1243`: magic commands without % are not completed properly in htmlnotebook * :ghissue:`1347`: fix weird magic completion in notebook * :ghissue:`1355`: notebook.html extends layout.html now * :ghissue:`1354`: min and max in the notebook * :ghissue:`1346`: fixups for alternate URL prefix stuff * :ghissue:`1336`: crack at making notebook.html use the layout.html template * :ghissue:`1331`: RST and heading cells * :ghissue:`1350`: Add '-m mod : run library module as a script' option * :ghissue:`1247`: fixes a bug causing extra newlines after comments. * :ghissue:`1329`: add base_url to notebook configuration options * :ghissue:`1332`: notebook - allow prefixes in URL path. * :ghissue:`1317`: Very slow traceback construction from Cython extension * :ghissue:`1341`: Don't attempt to tokenize binary files for tracebacks * :ghissue:`1300`: Cell Input collapse * :ghissue:`1334`: added key handler for control-s to notebook, seems to work pretty well * :ghissue:`1338`: Fix see also in docstrings so API docs build * :ghissue:`1335`: Notebook toolbar UI * :ghissue:`1299`: made notebook.html extend layout.html * :ghissue:`1318`: make Ctrl-D in qtconsole act same as in terminal (ready to merge) * :ghissue:`873`: ReST support in notebook frontend * :ghissue:`1139`: Notebook webkit notification * :ghissue:`1314`: Insertcell * :ghissue:`1328`: Coverage * :ghissue:`1206`: don't preserve fixConsole output in json * :ghissue:`1330`: Add linewrapping to text cells (new feature in CodeMirror). * :ghissue:`1309`: Inoculate clearcmd extension into %reset functionality * :ghissue:`1327`: Updatecm2 * :ghissue:`1326`: Removing Ace edit capability. * :ghissue:`1325`: forgotten selected_cell -> get_selected_cell * :ghissue:`1316`: Pass subprocess test runners a suitable location for xunit output * :ghissue:`1315`: Collect results from subprocess runners and spit out Xunit XML output. * :ghissue:`1233`: Update CodeMirror to the latest version * :ghissue:`1234`: Refactor how the notebook focuses cells * :ghissue:`1235`: After upgrading CodeMirror check the status of some bugs * :ghissue:`1236`: Review how select is called when notebook cells are inserted * :ghissue:`1303`: Updatecm * :ghissue:`1311`: Fixing CM related indentation problems. * :ghissue:`1304`: controller/server load can disrupt heartbeat * :ghissue:`1312`: minor heartbeat tweaks * :ghissue:`1302`: Input parsing with %prun clobbers escapes * :ghissue:`1306`: Fix %prun input parsing for escaped characters (closes #1302) * :ghissue:`1251`: IPython-0.12 can't import map module on Python 3.1 * :ghissue:`1202`: Pyreadline install exclusion for 64 bit windows no longer required, version dependency not correctly specified. * :ghissue:`1301`: New "Fix for issue #1202" based on current master. * :ghissue:`1242`: changed key map name to match changes to python mode * :ghissue:`1203`: Fix for issue #1202 * :ghissue:`1289`: Make autoreload extension work on Python 3. * :ghissue:`1263`: Different 'C-x' for shortcut, 'C-m c' not toCodeCell anymore * :ghissue:`1259`: Replace "from (.|..) import" with absolute imports. * :ghissue:`1278`: took a crack at making notebook.html extend layout.html * :ghissue:`1210`: Add 'quiet' option to suppress screen output during %prun calls, edited dochelp * :ghissue:`1288`: Don't ask for confirmation when stdin isn't available * :ghissue:`1290`: Cell-level cut & paste overwrites multiple cells * :ghissue:`1291`: Minor, but important fixes to cut/copy/paste. * :ghissue:`1293`: TaskScheduler.hwm default value * :ghissue:`1294`: TaskScheduler.hwm default to 1 instead of 0 * :ghissue:`1281`: in Hub: registration_timeout must be an integer, but heartmonitor.period is CFloat * :ghissue:`1283`: HeartMonitor.period should be an Integer * :ghissue:`1162`: Allow merge/split adjacent cells in notebook * :ghissue:`1264`: Aceify * :ghissue:`1261`: Mergesplit * :ghissue:`1269`: Another strange input handling error * :ghissue:`1284`: a fix for GH 1269 * :ghissue:`1232`: Dead kernel loop * :ghissue:`1279`: ImportError: cannot import name S1 (from logging) * :ghissue:`1276`: notebook menu item to send a KeyboardInterrupt to the kernel * :ghissue:`1213`: BUG: Minor typo in history_console_widget.py * :ghissue:`1248`: IPython notebook doesn't work with lastest version of tornado * :ghissue:`1267`: add NoDB for non-recording Hub * :ghissue:`1222`: allow Reference as callable in map/apply * :ghissue:`1257`: use self.kernel_manager_class in qtconsoleapp * :ghissue:`1220`: Open a new notebook while connecting to an existing kernel (opened by qtconsole or terminal or standalone) * :ghissue:`1253`: set auto_create flag for notebook apps * :ghissue:`1260`: heartbeat failure on long gil-holding operation * :ghissue:`1262`: Heartbeat no longer shares the app's Context * :ghissue:`1225`: SyntaxError display broken in Python 3 * :ghissue:`1229`: Fix display of SyntaxError in Python 3 * :ghissue:`1256`: Dewijmoize * :ghissue:`1246`: Skip tests that require X, when importing pylab results in RuntimeError. * :ghissue:`1250`: Wijmoize * :ghissue:`1244`: can not imput chinese word "造" , exit right now * :ghissue:`1194`: Adding Opera 11 as a compatible browser for ipython notebook * :ghissue:`1198`: Kernel Has Died error in Notebook * :ghissue:`1211`: serve local files in notebook-dir * :ghissue:`1224`: edit text cells on double-click instead of single-click * :ghissue:`1187`: misc notebook: connection file cleanup, first heartbeat, startup flush * :ghissue:`1207`: fix loadpy duplicating newlines * :ghissue:`1060`: Always save the .py file to disk next to the .ipynb * :ghissue:`1066`: execute cell in place should preserve the current insertion-point in the notebook * :ghissue:`1141`: "In" numbers are not invalidated when restarting kernel * :ghissue:`1231`: pip on OSX tries to install files in /System directory. * :ghissue:`1129`: Unified setup.py * :ghissue:`1199`: Reduce IPython.external.* * :ghissue:`1219`: Make all the static files path absolute. * :ghissue:`1218`: Added -q option to %prun for suppression of the output, along with editing the dochelp string. * :ghissue:`1217`: Added -q option to %prun for suppression of the output, along with editing the dochelp string * :ghissue:`1216`: Pdb tab completion does not work in QtConsole * :ghissue:`1197`: Interactive shell trying to: from ... import history * :ghissue:`1175`: core.completer: Clean up excessive and unused code. * :ghissue:`1208`: should dv.sync_import print failed imports ? * :ghissue:`1186`: payloadpage.py not used by qtconsole * :ghissue:`1204`: double newline from %loadpy in python notebook (at least on mac) * :ghissue:`1192`: Invalid JSON data * :ghissue:`1196`: docs: looks like a file path might have been accidentally pasted in the middle of a word * :ghissue:`1189`: Right justify of 'in' prompt in variable prompt size configurations * :ghissue:`1185`: ipython console not work proper with stdout... * :ghissue:`1191`: profile/startup files not executed with "notebook" * :ghissue:`1190`: Fix link to Chris Fonnesbeck blog post about 0.11 highlights. * :ghissue:`1174`: Remove %install_default_config and %install_profiles ipython-8.35.0/docs/source/whatsnew/github-stats-1.0.rst000066400000000000000000003217071477474304100230620ustar00rootroot00000000000000.. _issues_list_100: Issues closed in the 1.0 development cycle ========================================== Issues closed in 1.2 -------------------- GitHub stats for 2013/09/09 - 2014/02/21 These lists are automatically generated, and may be incomplete or contain duplicates. The following 13 authors contributed 84 commits. * Benjamin Ragan-Kelley * Daryl Herzmann * Doug Blank * Fernando Perez * James Porter * Juergen Hasch * Julian Taylor * Kyle Kelley * Lawrence Fu * Matthias Bussonnier * Paul Ivanov * Pascal Schetelat * Puneeth Chaganti * Takeshi Kanmae * Thomas Kluyver We closed a total of 55 issues, 38 pull requests and 17 regular issues; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (38): 1.2.1: * :ghpull:`4372`: Don't assume that SyntaxTB is always called with a SyntaxError * :ghpull:`5166`: remove mktemp usage * :ghpull:`5163`: Simplify implementation of TemporaryWorkingDirectory. * :ghpull:`5105`: add index to format to support py2.6 1.2.0: * :ghpull:`4972`: Work around problem in doctest discovery in Python 3.4 with PyQt * :ghpull:`4934`: `ipython profile create` respects `--ipython-dir` * :ghpull:`4845`: Add Origin Checking. * :ghpull:`4928`: use importlib.machinery when available * :ghpull:`4849`: Various unicode fixes (mostly on Windows) * :ghpull:`4880`: set profile name from profile_dir * :ghpull:`4908`: detect builtin docstrings in oinspect * :ghpull:`4909`: sort dictionary keys before comparison, ordering is not guaranteed * :ghpull:`4903`: use https for all embeds * :ghpull:`4868`: Static path fixes * :ghpull:`4820`: fix regex for cleaning old logs with ipcluster * :ghpull:`4840`: Error in Session.send_raw() * :ghpull:`4762`: whitelist alphanumeric characters for cookie_name * :ghpull:`4748`: fix race condition in profiledir creation. * :ghpull:`4720`: never use ssh multiplexer in tunnels * :ghpull:`4738`: don't inject help into user_ns * :ghpull:`4722`: allow purging local results as long as they are not outstanding * :ghpull:`4668`: Make non-ASCII docstring unicode * :ghpull:`4639`: Minor import fix to get qtconsole with --pylab=qt working * :ghpull:`4453`: Play nice with App Nap * :ghpull:`4609`: Fix bytes regex for Python 3. * :ghpull:`4488`: fix typo in message spec doc * :ghpull:`4346`: getpass() on Windows & Python 2 needs bytes prompt * :ghpull:`4230`: Switch correctly to the user's default matplotlib backend after inline. * :ghpull:`4214`: engine ID metadata should be unicode, not bytes * :ghpull:`4232`: no highlight if no language specified * :ghpull:`4218`: Fix display of SyntaxError when .py file is modified * :ghpull:`4217`: avoid importing numpy at the module level * :ghpull:`4213`: fixed dead link in examples/notebooks readme to Part 3 * :ghpull:`4183`: ESC should be handled by CM if tooltip is not on * :ghpull:`4193`: Update for #3549: Append Firefox overflow-x fix * :ghpull:`4205`: use TextIOWrapper when communicating with pandoc subprocess * :ghpull:`4204`: remove some extraneous print statements from IPython.parallel * :ghpull:`4201`: HeadingCells cannot be split or merged 1.2.1: * :ghissue:`5101`: IPython 1.2.0: notebook fail with "500 Internal Server Error" 1.2.0: * :ghissue:`4892`: IPython.qt test failure with python3.4 * :ghissue:`4810`: ipcluster bug in clean_logs flag * :ghissue:`4765`: missing build script for highlight.js * :ghissue:`4761`: ipv6 address triggers cookie exception * :ghissue:`4721`: purge_results with jobid crashing - looking for insight * :ghissue:`4602`: "ipcluster stop" fails after "ipcluster start --daemonize" using python3.3 * :ghissue:`3386`: Magic %paste not working in Python 3.3.2. TypeError: Type str doesn't support the buffer API * :ghissue:`4485`: Incorrect info in "Messaging in IPython" documentation. * :ghissue:`4351`: /parallel/apps/launcher.py error * :ghissue:`4334`: NotebookApp.webapp_settings static_url_prefix causes crash * :ghissue:`4039`: Celltoolbar example issue * :ghissue:`4256`: IPython no longer handles unicode file names * :ghissue:`4122`: Nbconvert [windows]: Inconsistent line endings in markdown cells exported to latex * :ghissue:`3819`: nbconvert add extra blank line to code block on Windows. * :ghissue:`4203`: remove spurious print statement from parallel annoted functions * :ghissue:`4200`: Notebook: merging a heading cell and markdown cell cannot be undone Issues closed in 1.1 -------------------- GitHub stats for 2013/08/08 - 2013/09/09 (since 1.0) These lists are automatically generated, and may be incomplete or contain duplicates. The following 25 authors contributed 337 commits. * Benjamin Ragan-Kelley * Bing Xia * Bradley M. Froehle * Brian E. Granger * Damián Avila * dhirschfeld * Dražen Lučanin * gmbecker * Jake Vanderplas * Jason Grout * Jonathan Frederic * Kevin Burke * Kyle Kelley * Matt Henderson * Matthew Brett * Matthias Bussonnier * Pankaj Pandey * Paul Ivanov * rossant * Samuel Ainsworth * Stephan Rave * stonebig * Thomas Kluyver * Yaroslav Halchenko * Zachary Sailer We closed a total of 76 issues, 58 pull requests and 18 regular issues; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (58): * :ghpull:`4188`: Allow user_ns trait to be None * :ghpull:`4189`: always fire LOCAL_IPS.extend(PUBLIC_IPS) * :ghpull:`4174`: various issues in markdown and rst templates * :ghpull:`4178`: add missing data_javascript * :ghpull:`4181`: nbconvert: Fix, sphinx template not removing new lines from headers * :ghpull:`4043`: don't 'restore_bytes' in from_JSON * :ghpull:`4163`: Fix for incorrect default encoding on Windows. * :ghpull:`4136`: catch javascript errors in any output * :ghpull:`4171`: add nbconvert config file when creating profiles * :ghpull:`4125`: Basic exercise of `ipython [subcommand] -h` and help-all * :ghpull:`4085`: nbconvert: Fix sphinx preprocessor date format string for Windows * :ghpull:`4159`: don't split `.cell` and `div.cell` CSS * :ghpull:`4158`: generate choices for `--gui` configurable from real mapping * :ghpull:`4065`: do not include specific css in embedable one * :ghpull:`4092`: nbconvert: Fix for unicode html headers, Windows + Python 2.x * :ghpull:`4074`: close Client sockets if connection fails * :ghpull:`4064`: Store default codemirror mode in only 1 place * :ghpull:`4104`: Add way to install MathJax to a particular profile * :ghpull:`4144`: help_end transformer shouldn't pick up ? in multiline string * :ghpull:`4143`: update example custom.js * :ghpull:`4142`: DOC: unwrap openssl line in public_server doc * :ghpull:`4141`: add files with a separate `add` call in backport_pr * :ghpull:`4137`: Restore autorestore option for storemagic * :ghpull:`4098`: pass profile-dir instead of profile name to Kernel * :ghpull:`4120`: support `input` in Python 2 kernels * :ghpull:`4088`: nbconvert: Fix coalescestreams line with incorrect nesting causing strange behavior * :ghpull:`4060`: only strip continuation prompts if regular prompts seen first * :ghpull:`4132`: Fixed name error bug in function safe_unicode in module py3compat. * :ghpull:`4121`: move test_kernel from IPython.zmq to IPython.kernel * :ghpull:`4118`: ZMQ heartbeat channel: catch EINTR exceptions and continue. * :ghpull:`4054`: use unicode for HTML export * :ghpull:`4106`: fix a couple of default block values * :ghpull:`4115`: Update docs on declaring a magic function * :ghpull:`4101`: restore accidentally removed EngineError * :ghpull:`4096`: minor docs changes * :ghpull:`4056`: respect `pylab_import_all` when `--pylab` specified at the command-line * :ghpull:`4091`: Make Qt console banner configurable * :ghpull:`4086`: fix missing errno import * :ghpull:`4030`: exclude `.git` in MANIFEST.in * :ghpull:`4047`: Use istype() when checking if canned object is a dict * :ghpull:`4031`: don't close_fds on Windows * :ghpull:`4029`: bson.Binary moved * :ghpull:`4035`: Fixed custom jinja2 templates being ignored when setting template_path * :ghpull:`4026`: small doc fix in nbconvert * :ghpull:`4016`: Fix IPython.start_* functions * :ghpull:`4021`: Fix parallel.client.View map() on numpy arrays * :ghpull:`4022`: DOC: fix links to matplotlib, notebook docs * :ghpull:`4018`: Fix warning when running IPython.kernel tests * :ghpull:`4019`: Test skipping without unicode paths * :ghpull:`4008`: Transform code before %prun/%%prun runs * :ghpull:`4014`: Fix typo in ipapp * :ghpull:`3987`: get files list in backport_pr * :ghpull:`3974`: nbconvert: Fix app tests on Window7 w/ Python 3.3 * :ghpull:`3978`: fix `--existing` with non-localhost IP * :ghpull:`3939`: minor checkpoint cleanup * :ghpull:`3981`: BF: fix nbconvert rst input prompt spacing * :ghpull:`3960`: Don't make sphinx a dependency for importing nbconvert * :ghpull:`3973`: logging.Formatter is not new-style in 2.6 Issues (18): * :ghissue:`4024`: nbconvert markdown issues * :ghissue:`4095`: Catch js error in append html in stream/pyerr * :ghissue:`4156`: Specifying --gui=tk at the command line * :ghissue:`3818`: nbconvert can't handle Heading with Chinese characters on Japanese Windows OS. * :ghissue:`4134`: multi-line parser fails on ''' in comment, qtconsole and notebook. * :ghissue:`3998`: sample custom.js needs to be updated * :ghissue:`4078`: StoreMagic.autorestore not working in 1.0.0 * :ghissue:`3990`: Builtin `input` doesn't work over zmq * :ghissue:`4015`: nbconvert fails to convert all the content of a notebook * :ghissue:`4059`: Issues with Ellipsis literal in Python 3 * :ghissue:`4103`: Wrong default argument of DirectView.clear * :ghissue:`4100`: parallel.client.client references undefined error.EngineError * :ghissue:`4005`: IPython.start_kernel doesn't work. * :ghissue:`4020`: IPython parallel map fails on numpy arrays * :ghissue:`3945`: nbconvert: commandline tests fail Win7x64 Py3.3 * :ghissue:`3977`: unable to complete remote connections for two-process * :ghissue:`3980`: nbconvert rst output lacks needed blank lines * :ghissue:`3968`: TypeError: super() argument 1 must be type, not classobj (Python 2.6.6) Issues closed in 1.0 -------------------- GitHub stats for 2012/06/30 - 2013/08/08 (since 0.13) These lists are automatically generated, and may be incomplete or contain duplicates. The following 155 authors contributed 4258 commits. * Aaron Meurer * Adam Davis * Ahmet Bakan * Alberto Valverde * Allen Riddell * Anders Hovmöller * Andrea Bedini * Andrew Spiers * Andrew Vandever * Anthony Scopatz * Anton Akhmerov * Anton I. Sipos * Antony Lee * Aron Ahmadia * Benedikt Sauer * Benjamin Jones * Benjamin Ragan-Kelley * Benjie Chen * Boris de Laage * Brad Reisfeld * Bradley M. Froehle * Brian E. Granger * Cameron Bates * Cavendish McKay * chapmanb * Chris Beaumont * Chris Laumann * Christoph Gohlke * codebraker * codespaced * Corran Webster * DamianHeard * Damián Avila * Dan Kilman * Dan McDougall * Danny Staple * David Hirschfeld * David P. Sanders * David Warde-Farley * David Wolever * David Wyde * debjan * Diane Trout * dkua * Dominik Dabrowski * Donald Curtis * Dražen Lučanin * drevicko * Eric O. LEBIGOT * Erik M. Bray * Erik Tollerud * Eugene Van den Bulke * Evan Patterson * Fernando Perez * Francesco Montesano * Frank Murphy * Greg Caporaso * Guy Haskin Fernald * guziy * Hans Meine * Harry Moreno * henryiii * Ivan Djokic * Jack Feser * Jake Vanderplas * jakobgager * James Booth * Jan Schulz * Jason Grout * Jeff Knisley * Jens Hedegaard Nielsen * jeremiahbuddha * Jerry Fowler * Jessica B. Hamrick * Jez Ng * John Zwinck * Jonathan Frederic * Jonathan Taylor * Joon Ro * Joseph Lansdowne * Juergen Hasch * Julian Taylor * Jussi Sainio * Jörgen Stenarson * kevin * klonuo * Konrad Hinsen * Kyle Kelley * Lars Solberg * Lessandro Mariano * Mark Sienkiewicz at STScI * Martijn Vermaat * Martin Spacek * Matthias Bussonnier * Maxim Grechkin * Maximilian Albert * MercuryRising * Michael Droettboom * Michael Shuffett * Michał Górny * Mikhail Korobov * mr.Shu * Nathan Goldbaum * ocefpaf * Ohad Ravid * Olivier Grisel * Olivier Verdier * Owen Healy * Pankaj Pandey * Paul Ivanov * Pawel Jasinski * Pietro Berkes * Piti Ongmongkolkul * Puneeth Chaganti * Rich Wareham * Richard Everson * Rick Lupton * Rob Young * Robert Kern * Robert Marchman * Robert McGibbon * Rui Pereira * Rustam Safin * Ryan May * s8weber * Samuel Ainsworth * Sean Vig * Siyu Zhang * Skylar Saveland * slojo404 * smithj1 * Stefan Karpinski * Stefan van der Walt * Steven Silvester * Takafumi Arakaki * Takeshi Kanmae * tcmulcahy * teegaar * Thomas Kluyver * Thomas Robitaille * Thomas Spura * Thomas Weißschuh * Timothy O'Donnell * Tom Dimiduk * ugurthemaster * urielshaolin * v923z * Valentin Haenel * Victor Zverovich * W. Trevor King * y-p * Yoav Ram * Zbigniew Jędrzejewski-Szmek * Zoltán Vörös We closed a total of 1484 issues, 793 pull requests and 691 regular issues; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (793): * :ghpull:`3958`: doc update * :ghpull:`3965`: Fix ansi color code for background yellow * :ghpull:`3964`: Fix casing of message. * :ghpull:`3942`: Pass on install docs * :ghpull:`3962`: exclude IPython.lib.kernel in iptest * :ghpull:`3961`: Longpath test fix * :ghpull:`3905`: Remove references to 0.11 and 0.12 from config/overview.rst * :ghpull:`3951`: nbconvert: fixed latex characters not escaped properly in nbconvert * :ghpull:`3949`: log fatal error when PDF conversion fails * :ghpull:`3947`: nbconvert: Make writer & post-processor aliases case insensitive. * :ghpull:`3938`: Recompile css. * :ghpull:`3948`: sphinx and PDF tweaks * :ghpull:`3943`: nbconvert: Serve post-processor Windows fix * :ghpull:`3934`: nbconvert: fix logic of verbose flag in PDF post processor * :ghpull:`3929`: swallow enter event in rename dialog * :ghpull:`3924`: nbconvert: Backport fixes * :ghpull:`3925`: Replace --pylab flag with --matplotlib in usage * :ghpull:`3910`: Added explicit error message for missing configuration arguments. * :ghpull:`3913`: grffile to support spaces in notebook names * :ghpull:`3918`: added check_for_tornado, closes #3916 * :ghpull:`3917`: change docs/examples refs to be just examples * :ghpull:`3908`: what's new tweaks * :ghpull:`3896`: two column quickhelp dialog, closes #3895 * :ghpull:`3911`: explicitly load python mode before IPython mode * :ghpull:`3901`: don't force . relative path, fix #3897 * :ghpull:`3891`: fix #3889 * :ghpull:`3892`: Fix documentation of Kernel.stop_channels * :ghpull:`3888`: posixify paths for Windows latex * :ghpull:`3882`: quick fix for #3881 * :ghpull:`3877`: don't use `shell=True` in PDF export * :ghpull:`3878`: minor template loading cleanup * :ghpull:`3855`: nbconvert: Filter tests * :ghpull:`3879`: finish 3870 * :ghpull:`3870`: Fix for converting notebooks that contain unicode characters. * :ghpull:`3876`: Update parallel_winhpc.rst * :ghpull:`3872`: removing vim-ipython, since it has it's own repo * :ghpull:`3871`: updating docs * :ghpull:`3873`: remove old examples * :ghpull:`3868`: update CodeMirror component to 3.15 * :ghpull:`3865`: Escape filename for pdflatex in nbconvert * :ghpull:`3861`: remove old external.js * :ghpull:`3864`: add keyboard shortcut to docs * :ghpull:`3834`: This PR fixes a few issues with nbconvert tests * :ghpull:`3840`: prevent profile_dir from being undefined * :ghpull:`3859`: Add "An Afternoon Hack" to docs * :ghpull:`3854`: Catch errors filling readline history on startup * :ghpull:`3857`: Delete extra auto * :ghpull:`3845`: nbconvert: Serve from original build directory * :ghpull:`3846`: Add basic logging to nbconvert * :ghpull:`3850`: add missing store_history key to Notebook execute_requests * :ghpull:`3844`: update payload source * :ghpull:`3830`: mention metadata / display_data similarity in pyout spec * :ghpull:`3848`: fix incorrect `empty-docstring` * :ghpull:`3836`: Parse markdown correctly when mathjax is disabled * :ghpull:`3849`: skip a failing test on windows * :ghpull:`3828`: signature_scheme lives in Session * :ghpull:`3831`: update nbconvert doc with new CLI * :ghpull:`3822`: add output flag to nbconvert * :ghpull:`3780`: Added serving the output directory if html-based format are selected. * :ghpull:`3764`: Cleanup nbconvert templates * :ghpull:`3829`: remove now-duplicate 'this is dev' note * :ghpull:`3814`: add `ConsoleWidget.execute_on_complete_input` flag * :ghpull:`3826`: try rtfd * :ghpull:`3821`: add sphinx prolog * :ghpull:`3817`: relax timeouts in terminal console and tests * :ghpull:`3825`: fix more tests that fail when pandoc is missing * :ghpull:`3824`: don't set target on internal markdown links * :ghpull:`3816`: s/pylab/matplotlib in docs * :ghpull:`3812`: Describe differences between start_ipython and embed * :ghpull:`3805`: Print View has been removed * :ghpull:`3820`: Make it clear that 1.0 is not released yet * :ghpull:`3784`: nbconvert: Export flavors & PDF writer (ipy dev meeting) * :ghpull:`3800`: semantic-versionify version number for non-releases * :ghpull:`3802`: Documentation .txt to .rst * :ghpull:`3765`: cleanup terminal console iopub handling * :ghpull:`3720`: Fix for #3719 * :ghpull:`3787`: re-raise KeyboardInterrupt in raw_input * :ghpull:`3770`: Organizing reveal's templates. * :ghpull:`3751`: Use link(2) when possible in nbconvert * :ghpull:`3792`: skip tests that require pandoc * :ghpull:`3782`: add Importing Notebooks example * :ghpull:`3752`: nbconvert: Add cwd to sys.path * :ghpull:`3789`: fix raw_input in qtconsole * :ghpull:`3756`: document the wire protocol * :ghpull:`3749`: convert IPython syntax to Python syntax in nbconvert python template * :ghpull:`3793`: Closes #3788 * :ghpull:`3794`: Change logo link to ipython.org * :ghpull:`3746`: Raise a named exception when pandoc is missing * :ghpull:`3781`: comply with the message spec in the notebook * :ghpull:`3779`: remove bad `if logged_in` preventing new-notebook without login * :ghpull:`3743`: remove notebook read-only view * :ghpull:`3732`: add delay to autosave in beforeunload * :ghpull:`3761`: Added rm_math_space to markdown cells in the basichtml.tpl to be rendered ok by mathjax after the nbconvertion. * :ghpull:`3758`: nbconvert: Filter names cleanup * :ghpull:`3769`: Add configurability to tabcompletion timeout * :ghpull:`3771`: Update px pylab test to match new output of pylab * :ghpull:`3741`: better message when notebook format is not supported * :ghpull:`3753`: document Ctrl-C not working in ipython kernel * :ghpull:`3766`: handle empty metadata in pyout messages more gracefully. * :ghpull:`3736`: my attempt to fix #3735 * :ghpull:`3759`: nbconvert: Provide a more useful error for invalid use case. * :ghpull:`3760`: nbconvert: Allow notebook filenames without their extensions * :ghpull:`3750`: nbconvert: Add cwd to default templates search path. * :ghpull:`3748`: Update nbconvert docs * :ghpull:`3734`: Nbconvert: Export extracted files into `nbname_files` subdirectory * :ghpull:`3733`: Nicer message when pandoc is missing, closes #3730 * :ghpull:`3722`: fix two failing test in IPython.lib * :ghpull:`3704`: Start what's new for 1.0 * :ghpull:`3705`: Complete rewrite of IPython Notebook documentation: docs/source/interactive/htmlnotebook.txt * :ghpull:`3709`: Docs cleanup * :ghpull:`3716`: raw_input fixes for kernel restarts * :ghpull:`3683`: use `%matplotlib` in example notebooks * :ghpull:`3686`: remove quarantine * :ghpull:`3699`: svg2pdf unicode fix * :ghpull:`3695`: fix SVG2PDF * :ghpull:`3685`: fix Pager.detach * :ghpull:`3675`: document new dependencies * :ghpull:`3690`: Fixing some css minors in full_html and reveal. * :ghpull:`3671`: nbconvert tests * :ghpull:`3692`: Fix rename notebook - show error with invalid name * :ghpull:`3409`: Prevent qtconsole frontend freeze on lots of output. * :ghpull:`3660`: refocus active cell on dialog close * :ghpull:`3598`: Statelessify mathjaxutils * :ghpull:`3673`: enable comment/uncomment selection * :ghpull:`3677`: remove special-case in get_home_dir for frozen dists * :ghpull:`3674`: add CONTRIBUTING.md * :ghpull:`3670`: use Popen command list for ipexec * :ghpull:`3568`: pylab import adjustments * :ghpull:`3559`: add create.Cell and delete.Cell js events * :ghpull:`3606`: push cell magic to the head of the transformer line * :ghpull:`3607`: NbConvert: Writers, No YAML, and stuff... * :ghpull:`3665`: Pywin32 skips * :ghpull:`3669`: set default client_class for QtKernelManager * :ghpull:`3662`: add strip_encoding_cookie transformer * :ghpull:`3641`: increase patience for slow kernel startup in tests * :ghpull:`3651`: remove a bunch of unused `default_config_file` assignments * :ghpull:`3630`: CSS adjustments * :ghpull:`3645`: Don't require HistoryManager to have a shell * :ghpull:`3643`: don't assume tested ipython is on the PATH * :ghpull:`3654`: fix single-result AsyncResults * :ghpull:`3601`: Markdown in heading cells (take 2) * :ghpull:`3652`: Remove old `docs/examples` * :ghpull:`3621`: catch any exception appending output * :ghpull:`3585`: don't blacklist builtin names * :ghpull:`3647`: Fix `frontend` deprecation warnings in several examples * :ghpull:`3649`: fix AsyncResult.get_dict for single result * :ghpull:`3648`: Fix store magic test * :ghpull:`3650`: Fix, config_file_name was ignored * :ghpull:`3640`: Gcf.get_active() can return None * :ghpull:`3571`: Added shortcuts to split cell, merge cell above and merge cell below. * :ghpull:`3635`: Added missing slash to print-pdf call. * :ghpull:`3487`: Drop patch for compatibility with pyreadline 1.5 * :ghpull:`3338`: Allow filename with extension in find_cmd in Windows. * :ghpull:`3628`: Fix test for Python 3 on Windows. * :ghpull:`3642`: Fix typo in docs * :ghpull:`3627`: use DEFAULT_STATIC_FILES_PATH in a test instead of package dir * :ghpull:`3624`: fix some unicode in zmqhandlers * :ghpull:`3460`: Set calling program to UNKNOWN, when argv not in sys * :ghpull:`3632`: Set calling program to UNKNOWN, when argv not in sys (take #2) * :ghpull:`3629`: Use new entry point for python -m IPython * :ghpull:`3626`: passing cell to showInPager, closes #3625 * :ghpull:`3618`: expand terminal color support * :ghpull:`3623`: raise UsageError for unsupported GUI backends * :ghpull:`3071`: Add magic function %drun to run code in debugger * :ghpull:`3608`: a nicer error message when using %pylab magic * :ghpull:`3592`: add extra_config_file * :ghpull:`3612`: updated .mailmap * :ghpull:`3616`: Add examples for interactive use of MPI. * :ghpull:`3615`: fix regular expression for ANSI escapes * :ghpull:`3586`: Corrected a typo in the format string for strftime the sphinx.py transformer of nbconvert * :ghpull:`3611`: check for markdown no longer needed, closes #3610 * :ghpull:`3555`: Simplify caching of modules with %run * :ghpull:`3583`: notebook small things * :ghpull:`3594`: Fix duplicate completion in notebook * :ghpull:`3600`: parallel: Improved logging for errors during BatchSystemLauncher.stop * :ghpull:`3595`: Revert "allow markdown in heading cells" * :ghpull:`3538`: add IPython.start_ipython * :ghpull:`3562`: Allow custom nbconvert template loaders * :ghpull:`3582`: pandoc adjustments * :ghpull:`3560`: Remove max_msg_size * :ghpull:`3591`: Refer to Setuptools instead of Distribute * :ghpull:`3590`: IPython.sphinxext needs an __init__.py * :ghpull:`3581`: Added the possibility to read a custom.css file for tweaking the final html in full_html and reveal templates. * :ghpull:`3576`: Added support for markdown in heading cells when they are nbconverted. * :ghpull:`3575`: tweak `run -d` message to 'continue execution' * :ghpull:`3569`: add PYTHONSTARTUP to startup files * :ghpull:`3567`: Trigger a single event on js app initialized * :ghpull:`3565`: style.min.css should always exist... * :ghpull:`3531`: allow markdown in heading cells * :ghpull:`3577`: Simplify codemirror ipython-mode * :ghpull:`3495`: Simplified regexp, and suggestions for clearer regexps. * :ghpull:`3578`: Use adjustbox to specify figure size in nbconvert -> latex * :ghpull:`3572`: Skip import irunner test on Windows. * :ghpull:`3574`: correct static path for CM modes autoload * :ghpull:`3558`: Add IPython.sphinxext * :ghpull:`3561`: mention double-control-C to stop notebook server * :ghpull:`3566`: fix event names * :ghpull:`3564`: Remove trivial nbconvert example * :ghpull:`3540`: allow cython cache dir to be deleted * :ghpull:`3527`: cleanup stale, unused exceptions in parallel.error * :ghpull:`3529`: ensure raw_input returns str in zmq shell * :ghpull:`3541`: respect image size metadata in qtconsole * :ghpull:`3550`: Fixing issue preventing the correct read of images by full_html and reveal exporters. * :ghpull:`3557`: open markdown links in new tabs * :ghpull:`3556`: remove mention of nonexistent `_margv` in macro * :ghpull:`3552`: set overflow-x: hidden on Firefox only * :ghpull:`3554`: Fix missing import os in latex exporter. * :ghpull:`3546`: Don't hardcode **latex** posix paths in nbconvert * :ghpull:`3551`: fix path prefix in nbconvert * :ghpull:`3533`: Use a CDN to get reveal.js library. * :ghpull:`3498`: When a notebook is written to file, name the metadata name u''. * :ghpull:`3548`: Change to standard save icon in Notebook toolbar * :ghpull:`3539`: Don't hardcode posix paths in nbconvert * :ghpull:`3508`: notebook supports raw_input and %debug now * :ghpull:`3526`: ensure 'default' is first in cluster profile list * :ghpull:`3525`: basic timezone info * :ghpull:`3532`: include nbconvert templates in installation * :ghpull:`3515`: update CodeMirror component to 3.14 * :ghpull:`3513`: add 'No Checkpoints' to Revert menu * :ghpull:`3536`: format positions are required in Python 2.6.x * :ghpull:`3521`: Nbconvert fix, silent fail if template doesn't exist * :ghpull:`3530`: update %store magic docstring * :ghpull:`3528`: fix local mathjax with custom base_project_url * :ghpull:`3518`: Clear up unused imports * :ghpull:`3506`: %store -r restores saved aliases and directory history, as well as variables * :ghpull:`3516`: make css highlight style configurable * :ghpull:`3523`: Exclude frontend shim from docs build * :ghpull:`3514`: use bootstrap `disabled` instead of `ui-state-disabled` * :ghpull:`3520`: Added relative import of RevealExporter to __init__.py inside exporters module * :ghpull:`3507`: fix HTML capitalization in nbconvert exporter classes * :ghpull:`3512`: fix nbconvert filter validation * :ghpull:`3511`: Get Tracer working after ipapi.get replaced with get_ipython * :ghpull:`3510`: use `window.onbeforeunload=` for nav-away warning * :ghpull:`3504`: don't use parent=self in handlers * :ghpull:`3500`: Merge nbconvert into IPython * :ghpull:`3478`: restore "unsaved changes" warning on unload * :ghpull:`3493`: add a dialog when the kernel is auto-restarted * :ghpull:`3488`: Add test suite for autoreload extension * :ghpull:`3484`: Catch some pathological cases inside oinspect * :ghpull:`3481`: Display R errors without Python traceback * :ghpull:`3468`: fix `%magic` output * :ghpull:`3430`: add parent to Configurable * :ghpull:`3491`: Remove unexpected keyword parameter to remove_kernel * :ghpull:`3485`: SymPy has changed its recommended way to initialize printing * :ghpull:`3486`: Add test for non-ascii characters in docstrings * :ghpull:`3483`: Inputtransformer: Allow classic prompts without space * :ghpull:`3482`: Use an absolute path to iptest, because the tests are not always run from $IPYTHONDIR. * :ghpull:`3381`: enable 2x (retina) display * :ghpull:`3450`: Flatten IPython.frontend * :ghpull:`3477`: pass config to subapps * :ghpull:`3466`: Kernel fails to start when username has non-ascii characters * :ghpull:`3465`: Add HTCondor bindings to IPython.parallel * :ghpull:`3463`: fix typo, closes #3462 * :ghpull:`3456`: Notice for users who disable javascript * :ghpull:`3453`: fix cell execution in firefox, closes #3447 * :ghpull:`3393`: [WIP] bootstrapify * :ghpull:`3440`: Fix installing mathjax from downloaded file via command line * :ghpull:`3431`: Provide means for starting the Qt console maximized and with the menu bar hidden * :ghpull:`3425`: base IPClusterApp inherits from BaseIPythonApp * :ghpull:`3433`: Update IPython\external\path\__init__.py * :ghpull:`3298`: Some fixes in IPython Sphinx directive * :ghpull:`3428`: process escapes in mathjax * :ghpull:`3420`: thansk -> thanks * :ghpull:`3416`: Fix doc: "principle" not "principal" * :ghpull:`3413`: more unique filename for test * :ghpull:`3364`: Inject requirejs in notebook and start using it. * :ghpull:`3390`: Fix %paste with blank lines * :ghpull:`3403`: fix creating config objects from dicts * :ghpull:`3401`: rollback #3358 * :ghpull:`3373`: make cookie_secret configurable * :ghpull:`3307`: switch default ws_url logic to js side * :ghpull:`3392`: Restore anchor link on h2-h6 * :ghpull:`3369`: Use different threshold for (auto)scroll in output * :ghpull:`3370`: normalize unicode notebook filenames * :ghpull:`3372`: base default cookie name on request host+port * :ghpull:`3378`: disable CodeMirror drag/drop on Safari * :ghpull:`3358`: workaround spurious CodeMirror scrollbars * :ghpull:`3371`: make setting the notebook dirty flag an event * :ghpull:`3366`: remove long-dead zmq frontend.py and completer.py * :ghpull:`3382`: cull Session digest history * :ghpull:`3330`: Fix get_ipython_dir when $HOME is / * :ghpull:`3319`: IPEP 13: user-expressions and user-variables * :ghpull:`3384`: comments in tools/gitwash_dumper.py changed (''' to """) * :ghpull:`3387`: Make submodule checks work under Python 3. * :ghpull:`3357`: move anchor-link off of heading text * :ghpull:`3351`: start basic tests of ipcluster Launchers * :ghpull:`3377`: allow class.__module__ to be None * :ghpull:`3340`: skip submodule check in package managers * :ghpull:`3328`: decode subprocess output in launchers * :ghpull:`3368`: Reenable bracket matching * :ghpull:`3356`: Mpr fixes * :ghpull:`3336`: Use new input transformation API in %time magic * :ghpull:`3325`: Organize the JS and less files by component. * :ghpull:`3342`: fix test_find_cmd_python * :ghpull:`3354`: catch socket.error in utils.localinterfaces * :ghpull:`3341`: fix default cluster count * :ghpull:`3286`: don't use `get_ipython` from builtins in library code * :ghpull:`3333`: notebookapp: add missing whitespace to warnings * :ghpull:`3323`: Strip prompts even if the prompt isn't present on the first line. * :ghpull:`3321`: Reorganize the python/server side of the notebook * :ghpull:`3320`: define `__file__` in config files * :ghpull:`3317`: rename `%%file` to `%%writefile` * :ghpull:`3304`: set unlimited HWM for all relay devices * :ghpull:`3315`: Update Sympy_printing extension load * :ghpull:`3310`: further clarify Image docstring * :ghpull:`3285`: load extensions in builtin trap * :ghpull:`3308`: Speed up AsyncResult._wait_for_outputs(0) * :ghpull:`3294`: fix callbacks as optional in js kernel.execute * :ghpull:`3276`: Fix: "python ABS/PATH/TO/ipython.py" fails * :ghpull:`3301`: allow python3 tests without python installed * :ghpull:`3282`: allow view.map to work with a few more things * :ghpull:`3284`: remove `ipython.py` entry point * :ghpull:`3281`: fix ignored IOPub messages with no parent * :ghpull:`3275`: improve submodule messages / git hooks * :ghpull:`3239`: Allow "x" icon and esc key to close pager in notebook * :ghpull:`3290`: Improved heartbeat controller to engine monitoring for long running tasks * :ghpull:`3142`: Better error message when CWD doesn't exist on startup * :ghpull:`3066`: Add support for relative import to %run -m (fixes #2727) * :ghpull:`3269`: protect highlight.js against unknown languages * :ghpull:`3267`: add missing return * :ghpull:`3101`: use marked / highlight.js instead of pagedown and prettify * :ghpull:`3264`: use https url for submodule * :ghpull:`3263`: fix set_last_checkpoint when no checkpoint * :ghpull:`3258`: Fix submodule location in setup.py * :ghpull:`3254`: fix a few URLs from previous PR * :ghpull:`3240`: remove js components from the repo * :ghpull:`3158`: IPEP 15: autosave the notebook * :ghpull:`3252`: move images out of _static folder into _images * :ghpull:`3251`: Fix for cell magics in Qt console * :ghpull:`3250`: Added a simple __html__() method to the HTML class * :ghpull:`3249`: remove copy of sphinx inheritance_diagram.py * :ghpull:`3235`: Remove the unused print notebook view * :ghpull:`3238`: Improve the design of the tab completion UI * :ghpull:`3242`: Make changes of Application.log_format effective * :ghpull:`3219`: Workaround so only one CTRL-C is required for a new prompt in --gui=qt * :ghpull:`3190`: allow formatters to specify metadata * :ghpull:`3231`: improve discovery of public IPs * :ghpull:`3233`: check prefixes for swallowing kernel args * :ghpull:`3234`: Removing old autogrow JS code. * :ghpull:`3232`: Update to CodeMirror 3 and start to ship our components * :ghpull:`3229`: The HTML output type accidentally got removed from the OutputArea. * :ghpull:`3228`: Typo in IPython.Parallel documentation * :ghpull:`3226`: Text in rename dialog was way too big - making it

. * :ghpull:`3225`: Removing old restuctured text handler and web service. * :ghpull:`3222`: make BlockingKernelClient the default Client * :ghpull:`3223`: add missing mathjax_url to new settings dict * :ghpull:`3089`: add stdin to the notebook * :ghpull:`3221`: Remove references to HTMLCell (dead code) * :ghpull:`3205`: add ignored ``*args`` to HasTraits constructor * :ghpull:`3088`: cleanup IPython handler settings * :ghpull:`3201`: use much faster regexp for ansi coloring * :ghpull:`3220`: avoid race condition in profile creation * :ghpull:`3011`: IPEP 12: add KernelClient * :ghpull:`3217`: informative error when trying to load directories * :ghpull:`3174`: Simple class * :ghpull:`2979`: CM configurable Take 2 * :ghpull:`3215`: Updates storemagic extension to allow for specifying variable name to load * :ghpull:`3181`: backport If-Modified-Since fix from tornado * :ghpull:`3200`: IFrame (VimeoVideo, ScribdDocument, ...) * :ghpull:`3186`: Fix small inconsistency in nbconvert: etype -> ename * :ghpull:`3212`: Fix issue #2563, "core.profiledir.check_startup_dir() doesn't work inside py2exe'd installation" * :ghpull:`3211`: Fix inheritance_diagram Sphinx extension for Sphinx 1.2 * :ghpull:`3208`: Update link to extensions index * :ghpull:`3203`: Separate InputSplitter for transforming whole cells * :ghpull:`3189`: Improve completer * :ghpull:`3194`: finish up PR #3116 * :ghpull:`3188`: Add new keycodes * :ghpull:`2695`: Key the root modules cache by sys.path entries. * :ghpull:`3182`: clarify %%file docstring * :ghpull:`3163`: BUG: Fix the set and frozenset pretty printer to handle the empty case correctly * :ghpull:`3180`: better UsageError for cell magic with no body * :ghpull:`3184`: Cython cache * :ghpull:`3175`: Added missing s * :ghpull:`3173`: Little bits of documentation cleanup * :ghpull:`2635`: Improve Windows start menu shortcuts (#2) * :ghpull:`3172`: Add missing import in IPython parallel magics example * :ghpull:`3170`: default application logger shouldn't propagate * :ghpull:`3159`: Autocompletion for zsh * :ghpull:`3105`: move DEFAULT_STATIC_FILES_PATH to IPython.html * :ghpull:`3144`: minor bower tweaks * :ghpull:`3141`: Default color output for ls on OSX * :ghpull:`3137`: fix dot syntax error in inheritance diagram * :ghpull:`3072`: raise UnsupportedOperation on iostream.fileno() * :ghpull:`3147`: Notebook support for a reverse proxy which handles SSL * :ghpull:`3152`: make qtconsole size at startup configurable * :ghpull:`3162`: adding stream kwarg to current.new_output * :ghpull:`2981`: IPEP 10: kernel side filtering of display formats * :ghpull:`3058`: add redirect handler for notebooks by name * :ghpull:`3041`: support non-modules in @require * :ghpull:`2447`: Stateful line transformers * :ghpull:`3108`: fix some O(N) and O(N^2) operations in parallel.map * :ghpull:`2791`: forward stdout from forked processes * :ghpull:`3157`: use Python 3-style for pretty-printed sets * :ghpull:`3148`: closes #3045, #3123 for tornado < version 3.0 * :ghpull:`3143`: minor heading-link tweaks * :ghpull:`3136`: Strip useless ANSI escape codes in notebook * :ghpull:`3126`: Prevent errors when pressing arrow keys in an empty notebook * :ghpull:`3135`: quick dev installation instructions * :ghpull:`2889`: Push pandas dataframes to R magic * :ghpull:`3068`: Don't monkeypatch doctest during IPython startup. * :ghpull:`3133`: fix argparse version check * :ghpull:`3102`: set `spellcheck=false` in CodeCell inputarea * :ghpull:`3064`: add anchors to heading cells * :ghpull:`3097`: PyQt 4.10: use self._document = self.document() * :ghpull:`3117`: propagate automagic change to shell * :ghpull:`3118`: don't give up on weird os names * :ghpull:`3115`: Fix example * :ghpull:`2640`: fix quarantine/ipy_editors.py * :ghpull:`3070`: Add info make target that was missing in old Sphinx * :ghpull:`3082`: A few small patches to image handling * :ghpull:`3078`: fix regular expression for detecting links in stdout * :ghpull:`3054`: restore default behavior for automatic cluster size * :ghpull:`3073`: fix ipython usage text * :ghpull:`3083`: fix DisplayMagics.html docstring * :ghpull:`3080`: noted sub_channel being renamed to iopub_channel * :ghpull:`3079`: actually use IPKernelApp.kernel_class * :ghpull:`3076`: Improve notebook.js documentation * :ghpull:`3063`: add missing `%%html` magic * :ghpull:`3075`: check for SIGUSR1 before using it, closes #3074 * :ghpull:`3051`: add width:100% to vbox for webkit / FF consistency * :ghpull:`2999`: increase registration timeout * :ghpull:`2997`: fix DictDB default size limit * :ghpull:`3033`: on resume, print server info again * :ghpull:`3062`: test double pyximport * :ghpull:`3046`: cast kernel cwd to bytes on Python 2 on Windows * :ghpull:`3038`: remove xml from notebook magic docstrings * :ghpull:`3032`: fix time format to international time format * :ghpull:`3022`: Fix test for Windows * :ghpull:`3024`: changed instances of 'outout' to 'output' in alt texts * :ghpull:`3013`: py3 workaround for reload in cythonmagic * :ghpull:`2961`: time magic: shorten unnecessary output on windows * :ghpull:`2987`: fix local files examples in markdown * :ghpull:`2998`: fix css in .output_area pre * :ghpull:`3003`: add $include /etc/inputrc to suggested ~/.inputrc * :ghpull:`2957`: Refactor qt import logic. Fixes #2955 * :ghpull:`2994`: expanduser on %%file targets * :ghpull:`2983`: fix run-all (that-> this) * :ghpull:`2964`: fix count when testing composite error output * :ghpull:`2967`: shows entire session history when only startsess is given * :ghpull:`2942`: Move CM IPython theme out of codemirror folder * :ghpull:`2929`: Cleanup cell insertion * :ghpull:`2933`: Minordocupdate * :ghpull:`2968`: fix notebook deletion. * :ghpull:`2966`: Added assert msg to extract_hist_ranges() * :ghpull:`2959`: Add command to trim the history database. * :ghpull:`2681`: Don't enable pylab mode, when matplotlib is not importable * :ghpull:`2901`: Fix inputhook_wx on osx * :ghpull:`2871`: truncate potentially long CompositeErrors * :ghpull:`2951`: use istype on lists/tuples * :ghpull:`2946`: fix qtconsole history logic for end-of-line * :ghpull:`2954`: fix logic for append_javascript * :ghpull:`2941`: fix baseUrl * :ghpull:`2903`: Specify toggle value on cell line number * :ghpull:`2911`: display order in output area configurable * :ghpull:`2897`: Don't rely on BaseProjectUrl data in body tag * :ghpull:`2894`: Cm configurable * :ghpull:`2927`: next release will be 1.0 * :ghpull:`2932`: Simplify using notebook static files from external code * :ghpull:`2915`: added small config section to notebook docs page * :ghpull:`2924`: safe_run_module: Silence SystemExit codes 0 and None. * :ghpull:`2906`: Unpatch/Monkey patch CM * :ghpull:`2921`: add menu item for undo delete cell * :ghpull:`2917`: Don't add logging handler if one already exists. * :ghpull:`2910`: Respect DB_IP and DB_PORT in mongodb tests * :ghpull:`2926`: Don't die if stderr/stdout do not support set_parent() #2925 * :ghpull:`2885`: get monospace pager back * :ghpull:`2876`: fix celltoolbar layout on FF * :ghpull:`2904`: Skip remaining IPC test on Windows * :ghpull:`2908`: fix last remaining KernelApp reference * :ghpull:`2905`: fix a few remaining KernelApp/IPKernelApp changes * :ghpull:`2900`: Don't assume test case for %time will finish in 0 time * :ghpull:`2893`: exclude fabfile from tests * :ghpull:`2884`: Correct import for kernelmanager on Windows * :ghpull:`2882`: Utils cleanup * :ghpull:`2883`: Don't call ast.fix_missing_locations unless the AST could have been modified * :ghpull:`2855`: time(it) magic: Implement minutes/hour formatting and "%%time" cell magic * :ghpull:`2874`: Empty cell warnings * :ghpull:`2819`: tweak history prefix search (up/^p) in qtconsole * :ghpull:`2868`: Import performance * :ghpull:`2877`: minor css fixes * :ghpull:`2880`: update examples docs with kernel move * :ghpull:`2878`: Pass host environment on to kernel * :ghpull:`2599`: func_kw_complete for builtin and cython with embededsignature=True using docstring * :ghpull:`2792`: Add key "unique" to history_request protocol * :ghpull:`2872`: fix payload keys * :ghpull:`2869`: Fixing styling of toolbar selects on FF. * :ghpull:`2708`: Less css * :ghpull:`2854`: Move kernel code into IPython.kernel * :ghpull:`2864`: Fix %run -t -N TypeError * :ghpull:`2852`: future pyzmq compatibility * :ghpull:`2863`: whatsnew/version0.9.txt: Fix '~./ipython' -> '~/.ipython' typo * :ghpull:`2861`: add missing KernelManager to ConsoleApp class list * :ghpull:`2850`: Consolidate host IP detection in utils.localinterfaces * :ghpull:`2859`: Correct docstring of ipython.py * :ghpull:`2831`: avoid string version comparisons in external.qt * :ghpull:`2844`: this should address the failure in #2732 * :ghpull:`2849`: utils/data: Use list comprehension for uniq_stable() * :ghpull:`2839`: add jinja to install docs / setup.py * :ghpull:`2841`: Miscellaneous docs fixes * :ghpull:`2811`: Still more KernelManager cleanup * :ghpull:`2820`: add '=' to greedy completer delims * :ghpull:`2818`: log user tracebacks in the kernel (INFO-level) * :ghpull:`2828`: Clean up notebook Javascript * :ghpull:`2829`: avoid comparison error in dictdb hub history * :ghpull:`2830`: BUG: Opening parenthesis after non-callable raises ValueError * :ghpull:`2718`: try to fallback to pysqlite2.dbapi2 as sqlite3 in core.history * :ghpull:`2816`: in %edit, don't save "last_call" unless last call succeeded * :ghpull:`2817`: change ol format order * :ghpull:`2537`: Organize example notebooks * :ghpull:`2815`: update release/authors * :ghpull:`2808`: improve patience for slow Hub in client tests * :ghpull:`2812`: remove nonfunctional `-la` short arg in cython magic * :ghpull:`2810`: remove dead utils.upgradedir * :ghpull:`1671`: __future__ environments * :ghpull:`2804`: skip ipc tests on Windows * :ghpull:`2789`: Fixing styling issues with CellToolbar. * :ghpull:`2805`: fix KeyError creating ZMQStreams in notebook * :ghpull:`2775`: General cleanup of kernel manager code. * :ghpull:`2340`: Initial Code to reduce parallel.Client caching * :ghpull:`2799`: Exit code * :ghpull:`2800`: use `type(obj) is cls` as switch when canning * :ghpull:`2801`: Fix a breakpoint bug * :ghpull:`2795`: Remove outdated code from extensions.autoreload * :ghpull:`2796`: P3K: fix cookie parsing under Python 3.x (+ duplicate import is removed) * :ghpull:`2724`: In-process kernel support (take 3) * :ghpull:`2687`: [WIP] Metaui slideshow * :ghpull:`2788`: Chrome frame awareness * :ghpull:`2649`: Add version_request/reply messaging protocol * :ghpull:`2753`: add `%%px --local` for local execution * :ghpull:`2783`: Prefilter shouldn't touch execution_count * :ghpull:`2333`: UI For Metadata * :ghpull:`2396`: create a ipynbv3 json schema and a validator * :ghpull:`2757`: check for complete pyside presence before trying to import * :ghpull:`2782`: Allow the %run magic with '-b' to specify a file. * :ghpull:`2778`: P3K: fix DeprecationWarning under Python 3.x * :ghpull:`2776`: remove non-functional View.kill method * :ghpull:`2755`: can interactively defined classes * :ghpull:`2774`: Removing unused code in the notebook MappingKernelManager. * :ghpull:`2773`: Fixed minor typo causing AttributeError to be thrown. * :ghpull:`2609`: Add 'unique' option to history_request messaging protocol * :ghpull:`2769`: Allow shutdown when no engines are registered * :ghpull:`2766`: Define __file__ when we %edit a real file. * :ghpull:`2476`: allow %edit to work when interactively defined * :ghpull:`2763`: Reset readline delimiters after loading rmagic. * :ghpull:`2460`: Better handling of `__file__` when running scripts. * :ghpull:`2617`: Fix for `units` argument. Adds a `res` argument. * :ghpull:`2738`: Unicode content crashes the pager (console) * :ghpull:`2749`: Tell Travis CI to test on Python 3.3 as well * :ghpull:`2744`: Don't show 'try %paste' message while using magics * :ghpull:`2728`: shift tab for tooltip * :ghpull:`2741`: Add note to `%cython` Black-Scholes example warning of missing erf. * :ghpull:`2743`: BUG: Octavemagic inline plots not working on Windows: Fixed * :ghpull:`2740`: Following #2737 this error is now a name error * :ghpull:`2737`: Rmagic: error message when moving an non-existant variable from python to R * :ghpull:`2723`: diverse fixes for project url * :ghpull:`2731`: %Rpush: Look for variables in the local scope first. * :ghpull:`2544`: Infinite loop when multiple debuggers have been attached. * :ghpull:`2726`: Add qthelp docs creation * :ghpull:`2730`: added blockquote CSS * :ghpull:`2729`: Fix Read the doc build, Again * :ghpull:`2446`: [alternate 2267] Offline mathjax * :ghpull:`2716`: remove unexisting headings level * :ghpull:`2717`: One liner to fix debugger printing stack traces when lines of context are larger than source. * :ghpull:`2713`: Doc bugfix: user_ns is not an attribute of Magic objects. * :ghpull:`2690`: Fix 'import '... completion for py3 & egg files. * :ghpull:`2691`: Document OpenMP in %%cython magic * :ghpull:`2699`: fix jinja2 rendering for password protected notebooks * :ghpull:`2700`: Skip notebook testing if jinja2 is not available. * :ghpull:`2692`: Add %%cython magics to generated documentation. * :ghpull:`2685`: Fix pretty print of types when `__module__` is not available. * :ghpull:`2686`: Fix tox.ini * :ghpull:`2604`: Backslashes are misinterpreted as escape-sequences by the R-interpreter. * :ghpull:`2689`: fix error in doc (arg->kwarg) and pep-8 * :ghpull:`2683`: for downloads, replaced window.open with window.location.assign * :ghpull:`2659`: small bugs in js are fixed * :ghpull:`2363`: Refactor notebook templates to use Jinja2 * :ghpull:`2662`: qtconsole: wrap argument list in tooltip to match width of text body * :ghpull:`2328`: addition of classes to generate a link or list of links from files local to the IPython HTML notebook * :ghpull:`2668`: pylab_not_importable: Catch all exceptions, not just RuntimeErrors. * :ghpull:`2663`: Fix issue #2660: parsing of help and version arguments * :ghpull:`2656`: Fix irunner tests when $PYTHONSTARTUP is set * :ghpull:`2312`: Add bracket matching to code cells in notebook * :ghpull:`2571`: Start to document Javascript * :ghpull:`2641`: undefinied that -> this * :ghpull:`2638`: Fix %paste in Python 3 on Mac * :ghpull:`2301`: Ast transfomers * :ghpull:`2616`: Revamp API docs * :ghpull:`2572`: Make 'Paste Above' the default paste behavior. * :ghpull:`2574`: Fix #2244 * :ghpull:`2582`: Fix displaying history when output cache is disabled. * :ghpull:`2591`: Fix for Issue #2584 * :ghpull:`2526`: Don't kill paramiko tunnels when receiving ^C * :ghpull:`2559`: Add psource, pfile, pinfo2 commands to ipdb. * :ghpull:`2546`: use 4 Pythons to build 4 Windows installers * :ghpull:`2561`: Fix display of plain text containing multiple carriage returns before line feed * :ghpull:`2549`: Add a simple 'undo' for cell deletion. * :ghpull:`2525`: Add event to kernel execution/shell reply. * :ghpull:`2554`: Avoid stopping in ipdb until we reach the main script. * :ghpull:`2404`: Option to limit search result in history magic command * :ghpull:`2294`: inputhook_qt4: Use QEventLoop instead of starting up the QCoreApplication * :ghpull:`2233`: Refactored Drag and Drop Support in Qt Console * :ghpull:`1747`: switch between hsplit and vsplit paging (request for feedback) * :ghpull:`2530`: Adding time offsets to the video * :ghpull:`2542`: Allow starting IPython as `python -m IPython`. * :ghpull:`2534`: Do not unescape backslashes in Windows (shellglob) * :ghpull:`2517`: Improved MathJax, bug fixes * :ghpull:`2511`: trigger default remote_profile_dir when profile_dir is set * :ghpull:`2491`: color is supported in ironpython * :ghpull:`2462`: Track which extensions are loaded * :ghpull:`2464`: Locate URLs in text output and convert them to hyperlinks. * :ghpull:`2490`: add ZMQInteractiveShell to IPEngineApp class list * :ghpull:`2498`: Don't catch tab press when something selected * :ghpull:`2527`: Run All Above and Run All Below * :ghpull:`2513`: add GitHub uploads to release script * :ghpull:`2529`: Windows aware tests for shellglob * :ghpull:`2478`: Fix doctest_run_option_parser for Windows * :ghpull:`2519`: clear In[ ] prompt numbers again * :ghpull:`2467`: Clickable links * :ghpull:`2500`: Add `encoding` attribute to `OutStream` class. * :ghpull:`2349`: ENH: added StackExchange-style MathJax filtering * :ghpull:`2503`: Fix traceback handling of SyntaxErrors without line numbers. * :ghpull:`2492`: add missing 'qtconsole' extras_require * :ghpull:`2480`: Add deprecation warnings for sympyprinting * :ghpull:`2334`: Make the ipengine monitor the ipcontroller heartbeat and die if the ipcontroller goes down * :ghpull:`2479`: use new _winapi instead of removed _subprocess * :ghpull:`2474`: fix bootstrap name conflicts * :ghpull:`2469`: Treat __init__.pyc same as __init__.py in module_list * :ghpull:`2165`: Add -g option to %run to glob expand arguments * :ghpull:`2468`: Tell git to ignore __pycache__ directories. * :ghpull:`2421`: Some notebook tweaks. * :ghpull:`2291`: Remove old plugin system * :ghpull:`2127`: Ability to build toolbar in JS * :ghpull:`2445`: changes for ironpython * :ghpull:`2420`: Pass ipython_dir to __init__() method of TerminalInteractiveShell's superclass. * :ghpull:`2432`: Revert #1831, the `__file__` injection in safe_execfile / safe_execfile_ipy. * :ghpull:`2216`: Autochange highlight with cell magics * :ghpull:`1946`: Add image message handler in ZMQTerminalInteractiveShell * :ghpull:`2424`: skip find_cmd when setting up script magics * :ghpull:`2389`: Catch sqlite DatabaseErrors in more places when reading the history database * :ghpull:`2395`: Don't catch ImportError when trying to unpack module functions * :ghpull:`1868`: enable IPC transport for kernels * :ghpull:`2437`: don't let log cleanup prevent engine start * :ghpull:`2441`: `sys.maxsize` is the maximum length of a container. * :ghpull:`2442`: allow iptest to be interrupted * :ghpull:`2240`: fix message built for engine dying during task * :ghpull:`2369`: Block until kernel termination after sending a kill signal * :ghpull:`2439`: Py3k: Octal (0777 -> 0o777) * :ghpull:`2326`: Detachable pager in notebook. * :ghpull:`2377`: Fix installation of man pages in Python 3 * :ghpull:`2407`: add IPython version to message headers * :ghpull:`2408`: Fix Issue #2366 * :ghpull:`2405`: clarify TaskScheduler.hwm doc * :ghpull:`2399`: IndentationError display * :ghpull:`2400`: Add scroll_to_cell(cell_number) to the notebook * :ghpull:`2401`: unmock read-the-docs modules * :ghpull:`2311`: always perform requested trait assignments * :ghpull:`2393`: New option `n` to limit history search hits * :ghpull:`2386`: Adapt inline backend to changes in matplotlib * :ghpull:`2392`: Remove suspicious double quote * :ghpull:`2387`: Added -L library search path to cythonmagic cell magic * :ghpull:`2370`: qtconsole: Create a prompt newline by inserting a new block (w/o formatting) * :ghpull:`1715`: Fix for #1688, traceback-unicode issue * :ghpull:`2378`: use Singleton.instance() for embed() instead of manual global * :ghpull:`2373`: fix missing imports in core.interactiveshell * :ghpull:`2368`: remove notification widget leftover * :ghpull:`2327`: Parallel: Support get/set of nested objects in view (e.g. dv['a.b']) * :ghpull:`2362`: Clean up ProgressBar class in example notebook * :ghpull:`2346`: Extra xterm identification in set_term_title * :ghpull:`2352`: Notebook: Store the username in a cookie whose name is unique. * :ghpull:`2358`: add backport_pr to tools * :ghpull:`2365`: fix names of notebooks for download/save * :ghpull:`2364`: make clients use 'location' properly (fixes #2361) * :ghpull:`2354`: Refactor notebook templates to use Jinja2 * :ghpull:`2339`: add bash completion example * :ghpull:`2345`: Remove references to 'version' no longer in argparse. Github issue #2343. * :ghpull:`2347`: adjust division error message checking to account for Python 3 * :ghpull:`2305`: RemoteError._render_traceback_ calls self.render_traceback * :ghpull:`2338`: Normalize line endings for ipexec_validate, fix for #2315. * :ghpull:`2192`: Introduce Notification Area * :ghpull:`2329`: Better error messages for common magic commands. * :ghpull:`2337`: ENH: added StackExchange-style MathJax filtering * :ghpull:`2331`: update css for qtconsole in doc * :ghpull:`2317`: adding cluster_id to parallel.Client.__init__ * :ghpull:`2130`: Add -l option to %R magic to allow passing in of local namespace * :ghpull:`2196`: Fix for bad command line argument to latex * :ghpull:`2300`: bug fix: was crashing when sqlite3 is not installed * :ghpull:`2184`: Expose store_history to execute_request messages. * :ghpull:`2308`: Add welcome_message option to enable_pylab * :ghpull:`2302`: Fix variable expansion on 'self' * :ghpull:`2299`: Remove code from prefilter that duplicates functionality in inputsplitter * :ghpull:`2295`: allow pip install from github repository directly * :ghpull:`2280`: fix SSH passwordless check for OpenSSH * :ghpull:`2290`: nbmanager * :ghpull:`2288`: s/assertEquals/assertEqual (again) * :ghpull:`2287`: Removed outdated dev docs. * :ghpull:`2218`: Use redirect for new notebooks * :ghpull:`2277`: nb: up/down arrow keys move to begin/end of line at top/bottom of cell * :ghpull:`2045`: Refactoring notebook managers and adding Azure backed storage. * :ghpull:`2271`: use display instead of send_figure in inline backend hooks * :ghpull:`2278`: allow disabling SQLite history * :ghpull:`2225`: Add "--annotate" option to `%%cython` magic. * :ghpull:`2246`: serialize individual args/kwargs rather than the containers * :ghpull:`2274`: CLN: Use name to id mapping of notebooks instead of searching. * :ghpull:`2270`: SSHLauncher tweaks * :ghpull:`2269`: add missing location when disambiguating controller IP * :ghpull:`2263`: Allow docs to build on https://readthedocs.io/ * :ghpull:`2256`: Adding data publication example notebook. * :ghpull:`2255`: better flush iopub with AsyncResults * :ghpull:`2261`: Fix: longest_substr([]) -> '' * :ghpull:`2260`: fix mpr again * :ghpull:`2242`: Document globbing in `%history -g `. * :ghpull:`2250`: fix html in notebook example * :ghpull:`2245`: Fix regression in embed() from pull-request #2096. * :ghpull:`2248`: track sha of master in test_pr messages * :ghpull:`2238`: Fast tests * :ghpull:`2211`: add data publication message * :ghpull:`2236`: minor test_pr tweaks * :ghpull:`2231`: Improve Image format validation and add html width,height * :ghpull:`2232`: Reapply monkeypatch to inspect.findsource() * :ghpull:`2235`: remove spurious print statement from setupbase.py * :ghpull:`2222`: adjust how canning deals with import strings * :ghpull:`2224`: fix css typo * :ghpull:`2223`: Custom tracebacks * :ghpull:`2214`: use KernelApp.exec_lines/files in IPEngineApp * :ghpull:`2199`: Wrap JS published by %%javascript in try/catch * :ghpull:`2212`: catch errors in markdown javascript * :ghpull:`2190`: Update code mirror 2.22 to 2.32 * :ghpull:`2200`: documentation build broken in bb429da5b * :ghpull:`2194`: clean nan/inf in json_clean * :ghpull:`2198`: fix mpr for earlier git version * :ghpull:`2175`: add FileFindHandler for Notebook static files * :ghpull:`1990`: can func_defaults * :ghpull:`2069`: start improving serialization in parallel code * :ghpull:`2202`: Create a unique & temporary IPYTHONDIR for each testing group. * :ghpull:`2204`: Work around lack of os.kill in win32. * :ghpull:`2148`: win32 iptest: Use subprocess.Popen() instead of os.system(). * :ghpull:`2179`: Pylab switch * :ghpull:`2124`: Add an API for registering magic aliases. * :ghpull:`2169`: ipdb: pdef, pdoc, pinfo magics all broken * :ghpull:`2174`: Ensure consistent indentation in `%magic`. * :ghpull:`1930`: add size-limiting to the DictDB backend * :ghpull:`2189`: Fix IPython.lib.latextools for Python 3 * :ghpull:`2186`: removed references to h5py dependence in octave magic documentation * :ghpull:`2183`: Include the kernel object in the event object passed to kernel events * :ghpull:`2185`: added test for %store, fixed storemagic * :ghpull:`2138`: Use breqn.sty in dvipng backend if possible * :ghpull:`2182`: handle undefined param in notebooklist * :ghpull:`1831`: fix #1814 set __file__ when running .ipy files * :ghpull:`2051`: Add a metadata attribute to messages * :ghpull:`1471`: simplify IPython.parallel connections and enable Controller Resume * :ghpull:`2181`: add %%javascript, %%svg, and %%latex display magics * :ghpull:`2116`: different images in 00_notebook-tour * :ghpull:`2092`: %prun: Restore `stats.stream` after running `print_stream`. * :ghpull:`2159`: show message on notebook list if server is unreachable * :ghpull:`2176`: fix git mpr * :ghpull:`2152`: [qtconsole] Namespace not empty at startup * :ghpull:`2177`: remove numpy install from travis/tox scripts * :ghpull:`2090`: New keybinding for code cell execution + cell insertion * :ghpull:`2160`: Updating the parallel options pricing example * :ghpull:`2168`: expand line in cell magics * :ghpull:`2170`: Fix tab completion with IPython.embed_kernel(). * :ghpull:`2096`: embed(): Default to the future compiler flags of the calling frame. * :ghpull:`2163`: fix 'remote_profie_dir' typo in SSH launchers * :ghpull:`2158`: [2to3 compat ] Tuple params in func defs * :ghpull:`2089`: Fix unittest DeprecationWarnings * :ghpull:`2142`: Refactor test_pr.py * :ghpull:`2140`: 2to3: Apply `has_key` fixer. * :ghpull:`2131`: Add option append (-a) to %save * :ghpull:`2117`: use explicit url in notebook example * :ghpull:`2133`: Tell git that ``*.py`` files contain Python code, for use in word-diffs. * :ghpull:`2134`: Apply 2to3 `next` fix. * :ghpull:`2126`: ipcluster broken with any batch launcher (PBS/LSF/SGE) * :ghpull:`2104`: Windows make file for Sphinx documentation * :ghpull:`2074`: Make BG color of inline plot configurable * :ghpull:`2123`: BUG: Look up the `_repr_pretty_` method on the class within the MRO rath... * :ghpull:`2100`: [in progress] python 2 and 3 compatibility without 2to3, second try * :ghpull:`2128`: open notebook copy in different tabs * :ghpull:`2073`: allows password and prefix for notebook * :ghpull:`1993`: Print View * :ghpull:`2086`: re-aliad %ed to %edit in qtconsole * :ghpull:`2110`: Fixes and improvements to the input splitter * :ghpull:`2101`: fix completer deletting newline * :ghpull:`2102`: Fix logging on interactive shell. * :ghpull:`2088`: Fix (some) Python 3.2 ResourceWarnings * :ghpull:`2064`: conform to pep 3110 * :ghpull:`2076`: Skip notebook 'static' dir in test suite. * :ghpull:`2063`: Remove umlauts so py3 installations on LANG=C systems succeed. * :ghpull:`2068`: record sysinfo in sdist * :ghpull:`2067`: update tools/release_windows.py * :ghpull:`2065`: Fix parentheses typo * :ghpull:`2062`: Remove duplicates and auto-generated files from repo. * :ghpull:`2061`: use explicit tuple in exception * :ghpull:`2060`: change minus to \- or \(hy in manpages Issues (691): * :ghissue:`3940`: Install process documentation overhaul * :ghissue:`3946`: The PDF option for `--post` should work with lowercase * :ghissue:`3957`: Notebook help page broken in Firefox * :ghissue:`3894`: nbconvert test failure * :ghissue:`3887`: 1.0.0a1 shows blank screen in both firefox and chrome (windows 7) * :ghissue:`3703`: `nbconvert`: Output options -- names and documentation * :ghissue:`3931`: Tab completion not working during debugging in the notebook * :ghissue:`3936`: Ipcluster plugin is not working with Ipython 1.0dev * :ghissue:`3941`: IPython Notebook kernel crash on Win7x64 * :ghissue:`3926`: Ending Notebook renaming dialog with return creates new-line * :ghissue:`3932`: Incorrect empty docstring * :ghissue:`3928`: Passing variables to script from the workspace * :ghissue:`3774`: Notebooks with spaces in their names breaks nbconvert latex graphics * :ghissue:`3916`: tornado needs its own check * :ghissue:`3915`: Link to Parallel examples "found on GitHub" broken in docs * :ghissue:`3895`: Keyboard shortcuts box in notebook doesn't fit the screen * :ghissue:`3912`: IPython.utils fails automated test for RC1 1.0.0 * :ghissue:`3636`: Code cell missing highlight on load * :ghissue:`3897`: under Windows, "ipython3 nbconvert "C:/blabla/first_try.ipynb" --to latex --post PDF" POST processing action fails because of a bad parameter * :ghissue:`3900`: python3 install syntax errors (OS X 10.8.4) * :ghissue:`3899`: nbconvert to latex fails on notebooks with spaces in file name * :ghissue:`3881`: Temporary Working Directory Test Fails * :ghissue:`2750`: A way to freeze code cells in the notebook * :ghissue:`3893`: Resize Local Image Files in Notebook doesn't work * :ghissue:`3823`: nbconvert on windows: tex and paths * :ghissue:`3885`: under Windows, "ipython3 nbconvert "C:/blabla/first_try.ipynb" --to latex" write "\" instead of "/" to reference file path in the .tex file * :ghissue:`3889`: test_qt fails due to assertion error 'qt4' != 'qt' * :ghissue:`3890`: double post, disregard this issue * :ghissue:`3689`: nbconvert, remaining tests * :ghissue:`3874`: Up/Down keys don't work to "Search previous command history" (besides Ctrl-p/Ctrl-n) * :ghissue:`3853`: CodeMirror locks up in the notebook * :ghissue:`3862`: can only connect to an ipcluster started with v1.0.0-dev (master branch) using an older ipython (v0.13.2), but cannot connect using ipython (v1.0.0-dev) * :ghissue:`3869`: custom css not working. * :ghissue:`2960`: Keyboard shortcuts * :ghissue:`3795`: ipcontroller process goes to 100% CPU, ignores connection requests * :ghissue:`3553`: Ipython and pylab crashes in windows and canopy * :ghissue:`3837`: Cannot set custom mathjax url, crash notebook server. * :ghissue:`3808`: "Naming" releases ? * :ghissue:`2431`: TypeError: must be string without null bytes, not str * :ghissue:`3856`: `?` at end of comment causes line to execute * :ghissue:`3731`: nbconvert: add logging for the different steps of nbconvert * :ghissue:`3835`: Markdown cells do not render correctly when mathjax is disabled * :ghissue:`3843`: nbconvert to rst: leftover "In[ ]" * :ghissue:`3799`: nbconvert: Ability to specify name of output file * :ghissue:`3726`: Document when IPython.start_ipython() should be used versus IPython.embed() * :ghissue:`3778`: Add no more readonly view in what's new * :ghissue:`3754`: No Print View in Notebook in 1.0dev * :ghissue:`3798`: IPython 0.12.1 Crashes on autocompleting sqlalchemy.func.row_number properties * :ghissue:`3811`: Opening notebook directly from the command line with multi-directory support installed * :ghissue:`3775`: Annoying behavior when clicking on cell after execution (Ctrl+Enter) * :ghissue:`3809`: Possible to add some bpython features? * :ghissue:`3810`: Printing the contents of an image file messes up shell text * :ghissue:`3702`: `nbconvert`: Default help message should be that of --help * :ghissue:`3735`: Nbconvert 1.0.0a1 does not take into account the pdf extensions in graphs * :ghissue:`3719`: Bad strftime format, for windows, in nbconvert exporter * :ghissue:`3786`: Zmq errors appearing with `Ctrl-C` in console/qtconsole * :ghissue:`3019`: disappearing scrollbar on tooltip in Chrome 24 on Ubuntu 12.04 * :ghissue:`3785`: ipdb completely broken in Qt console * :ghissue:`3796`: Document the meaning of milestone/issues-tags for users. * :ghissue:`3788`: Do not auto show tooltip if docstring empty. * :ghissue:`1366`: [Web page] No link to front page from documentation * :ghissue:`3739`: nbconvert (to slideshow) misses some of the math in markdown cells * :ghissue:`3768`: increase and make timeout configurable in console completion. * :ghissue:`3724`: ipcluster only running on one cpu * :ghissue:`1592`: better message for unsupported nbformat * :ghissue:`2049`: Can not stop "ipython kernel" on windows * :ghissue:`3757`: Need direct entry point to given notebook * :ghissue:`3745`: ImportError: cannot import name check_linecache_ipython * :ghissue:`3701`: `nbconvert`: Final output file should be in same directory as input file * :ghissue:`3738`: history -o works but history with -n produces identical results * :ghissue:`3740`: error when attempting to run 'make' in docs directory * :ghissue:`3737`: ipython nbconvert crashes with ValueError: Invalid format string. * :ghissue:`3730`: nbconvert: unhelpful error when pandoc isn't installed * :ghissue:`3718`: markdown cell cursor misaligned in notebook * :ghissue:`3710`: multiple input fields for %debug in the notebook after resetting the kernel * :ghissue:`3713`: PyCharm has problems with IPython working inside PyPy created by virtualenv * :ghissue:`3712`: Code completion: Complete on dictionary keys * :ghissue:`3680`: --pylab and --matplotlib flag * :ghissue:`3698`: nbconvert: Unicode error with minus sign * :ghissue:`3693`: nbconvert does not process SVGs into PDFs * :ghissue:`3688`: nbconvert, figures not extracting with Python 3.x * :ghissue:`3542`: note new dependencies in docs / setup.py * :ghissue:`2556`: [pagedown] do not target_blank anchor link * :ghissue:`3684`: bad message when %pylab fails due import *other* than matplotlib * :ghissue:`3682`: ipython notebook pylab inline import_all=False * :ghissue:`3596`: MathjaxUtils race condition? * :ghissue:`1540`: Comment/uncomment selection in notebook * :ghissue:`2702`: frozen setup: permission denied for default ipython_dir * :ghissue:`3672`: allow_none on Number-like traits. * :ghissue:`2411`: add CONTRIBUTING.md * :ghissue:`481`: IPython terminal issue with Qt4Agg on XP SP3 * :ghissue:`2664`: How to preserve user variables from import clashing? * :ghissue:`3436`: enable_pylab(import_all=False) still imports np * :ghissue:`2630`: lib.pylabtools.figsize : NameError when using Qt4Agg backend and %pylab magic. * :ghissue:`3154`: Notebook: no event triggered when a Cell is created * :ghissue:`3579`: Nbconvert: SVG are not transformed to PDF anymore * :ghissue:`3604`: MathJax rendering problem in `%%latex` cell * :ghissue:`3668`: AttributeError: 'BlockingKernelClient' object has no attribute 'started_channels' * :ghissue:`3245`: SyntaxError: encoding declaration in Unicode string * :ghissue:`3639`: %pylab inline in IPYTHON notebook throws "RuntimeError: Cannot activate multiple GUI eventloops" * :ghissue:`3663`: frontend deprecation warnings * :ghissue:`3661`: run -m not behaving like python -m * :ghissue:`3597`: re-do PR #3531 - allow markdown in Header cell * :ghissue:`3053`: Markdown in header cells is not rendered * :ghissue:`3655`: IPython finding its way into pasted strings. * :ghissue:`3620`: uncaught errors in HTML output * :ghissue:`3646`: get_dict() error * :ghissue:`3004`: `%load_ext rmagic` fails when legacy ipy_user_conf.py is installed (in ipython 0.13.1 / OSX 10.8) * :ghissue:`3638`: setp() issue in ipython notebook with figure references * :ghissue:`3634`: nbconvert reveal to pdf conversion ignores styling, prints only a single page. * :ghissue:`1307`: Remove pyreadline workarounds, we now require pyreadline >= 1.7.1 * :ghissue:`3316`: find_cmd test failure on Windows * :ghissue:`3494`: input() in notebook doesn't work in Python 3 * :ghissue:`3427`: Deprecate `$` as mathjax delimiter * :ghissue:`3625`: Pager does not open from button * :ghissue:`3149`: Miscellaneous small nbconvert feedback * :ghissue:`3617`: 256 color escapes support * :ghissue:`3609`: %pylab inline blows up for single process ipython * :ghissue:`2934`: Publish the Interactive MPI Demo Notebook * :ghissue:`3614`: ansi escapes broken in master (ls --color) * :ghissue:`3610`: If you don't have markdown, python setup.py install says no pygments * :ghissue:`3547`: %run modules clobber each other * :ghissue:`3602`: import_item fails when one tries to use DottedObjectName instead of a string * :ghissue:`3563`: Duplicate tab completions in the notebook * :ghissue:`3599`: Problems trying to run IPython on python3 without installing... * :ghissue:`2937`: too long completion in notebook * :ghissue:`3479`: Write empty name for the notebooks * :ghissue:`3505`: nbconvert: Failure in specifying user filter * :ghissue:`1537`: think a bit about namespaces * :ghissue:`3124`: Long multiline strings in Notebook * :ghissue:`3464`: run -d message unclear * :ghissue:`2706`: IPython 0.13.1 ignoring $PYTHONSTARTUP * :ghissue:`3587`: LaTeX escaping bug in nbconvert when exporting to HTML * :ghissue:`3213`: Long running notebook died with a coredump * :ghissue:`3580`: Running ipython with pypy on windows * :ghissue:`3573`: custom.js not working * :ghissue:`3544`: IPython.lib test failure on Windows * :ghissue:`3352`: Install Sphinx extensions * :ghissue:`2971`: [notebook]user needs to press ctrl-c twice to stop notebook server should be put into terminal window * :ghissue:`2413`: ipython3 qtconsole fails to install: ipython 0.13 has no such extra feature 'qtconsole' * :ghissue:`2618`: documentation is incorrect for install process * :ghissue:`2595`: mac 10.8 qtconsole export history * :ghissue:`2586`: cannot store aliases * :ghissue:`2714`: ipython qtconsole print unittest messages in console instead his own window. * :ghissue:`2669`: cython magic failing to work with openmp. * :ghissue:`3256`: Vagrant pandas instance of IPython Notebook does not respect additional plotting arguments * :ghissue:`3010`: cython magic fail if cache dir is deleted while in session * :ghissue:`2044`: prune unused names from parallel.error * :ghissue:`1145`: Online help utility broken in QtConsole * :ghissue:`3439`: Markdown links no longer open in new window (with change from pagedown to marked) * :ghissue:`3476`: _margv for macros seems to be missing * :ghissue:`3499`: Add reveal.js library (version 2.4.0) inside IPython * :ghissue:`2771`: Wiki Migration to GitHub * :ghissue:`2887`: ipcontroller purging some engines during connect * :ghissue:`626`: Enable Resuming Controller * :ghissue:`2824`: Kernel restarting after message "Kernel XXXX failed to respond to heartbeat" * :ghissue:`2823`: %%cython magic gives ImportError: dlopen(long_file_name.so, 2): image not found * :ghissue:`2891`: In IPython for Python 3, system site-packages comes before user site-packages * :ghissue:`2928`: Add magic "watch" function (example) * :ghissue:`2931`: Problem rendering pandas dataframe in Firefox for Windows * :ghissue:`2939`: [notebook] Figure legend not shown in inline backend if ouside the box of the axes * :ghissue:`2972`: [notebook] in Markdown mode, press Enter key at the end of , the next line is indented unexpectly * :ghissue:`3069`: Instructions for installing IPython notebook on Windows * :ghissue:`3444`: Encoding problem: cannot use if user's name is not ascii? * :ghissue:`3335`: Reenable bracket matching * :ghissue:`3386`: Magic %paste not working in Python 3.3.2. TypeError: Type str doesn't support the buffer API * :ghissue:`3543`: Exception shutting down kernel from notebook dashboard (0.13.1) * :ghissue:`3549`: Codecell size changes with selection * :ghissue:`3445`: Adding newlines in %%latex cell * :ghissue:`3237`: [notebook] Can't close a notebook without errors * :ghissue:`2916`: colon invokes auto(un)indent in markdown cells * :ghissue:`2167`: Indent and dedent in htmlnotebook * :ghissue:`3545`: Notebook save button icon not clear * :ghissue:`3534`: nbconvert incompatible with Windows? * :ghissue:`3489`: Update example notebook that raw_input is allowed * :ghissue:`3396`: Notebook checkpoint time is displayed an hour out * :ghissue:`3261`: Empty revert to checkpoint menu if no checkpoint... * :ghissue:`2984`: "print" magic does not work in Python 3 * :ghissue:`3524`: Issues with pyzmq and ipython on EPD update * :ghissue:`2434`: %store magic not auto-restoring * :ghissue:`2720`: base_url and static path * :ghissue:`2234`: Update various low resolution graphics for retina displays * :ghissue:`2842`: Remember passwords for pw-protected notebooks * :ghissue:`3244`: qtconsole: ValueError('close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr',) * :ghissue:`2215`: AsyncResult.wait(0) can hang waiting for the client to get results? * :ghissue:`2268`: provide mean to retrieve static data path * :ghissue:`1905`: Expose UI for worksheets within each notebook * :ghissue:`2380`: Qt inputhook prevents modal dialog boxes from displaying * :ghissue:`3185`: prettify on double // * :ghissue:`2821`: Test failure: IPython.parallel.tests.test_client.test_resubmit_header * :ghissue:`2475`: [Notebook] Line is deindented when typing eg a colon in markdown mode * :ghissue:`2470`: Do not destroy valid notebooks * :ghissue:`860`: Allow the standalone export of a notebook to HTML * :ghissue:`2652`: notebook with qt backend crashes at save image location popup * :ghissue:`1587`: Improve kernel restarting in the notebook * :ghissue:`2710`: Saving a plot in Mac OS X backend crashes IPython * :ghissue:`2596`: notebook "Last saved:" is misleading on file opening. * :ghissue:`2671`: TypeError :NoneType when executed "ipython qtconsole" in windows console * :ghissue:`2703`: Notebook scrolling breaks after pager is shown * :ghissue:`2803`: KernelManager and KernelClient should be two separate objects * :ghissue:`2693`: TerminalIPythonApp configuration fails without ipython_config.py * :ghissue:`2531`: IPython 0.13.1 python 2 32-bit installer includes 64-bit ipython*.exe launchers in the scripts folder * :ghissue:`2520`: Control-C kills port forwarding * :ghissue:`2279`: Setting `__file__` to None breaks Mayavi import * :ghissue:`2161`: When logged into notebook, long titles are incorrectly positioned * :ghissue:`1292`: Notebook, Print view should not be editable... * :ghissue:`1731`: test parallel launchers * :ghissue:`3227`: Improve documentation of ipcontroller and possible BUG * :ghissue:`2896`: IPController very unstable * :ghissue:`3517`: documentation build broken in head * :ghissue:`3522`: UnicodeDecodeError: 'ascii' codec can't decode byte on Pycharm on Windows * :ghissue:`3448`: Please include MathJax fonts with IPython Notebook * :ghissue:`3519`: IPython Parallel map mysteriously turns pandas Series into numpy ndarray * :ghissue:`3345`: IPython embedded shells ask if I want to exit, but I set confirm_exit = False * :ghissue:`3509`: IPython won't close without asking "Are you sure?" in Firefox * :ghissue:`3471`: Notebook jinja2/markupsafe dependencies in manual * :ghissue:`3502`: Notebook broken in master * :ghissue:`3302`: autoreload does not work in ipython 0.13.x, python 3.3 * :ghissue:`3475`: no warning when leaving/closing notebook on master without saved changes * :ghissue:`3490`: No obvious feedback when kernel crashes * :ghissue:`1912`: Move all autoreload tests to their own group * :ghissue:`2577`: sh.py and ipython for python 3.3 * :ghissue:`3467`: %magic doesn't work * :ghissue:`3501`: Editing markdown cells that wrap has off-by-one errors in cursor positioning * :ghissue:`3492`: IPython for Python3 * :ghissue:`3474`: unexpected keyword argument to remove_kernel * :ghissue:`2283`: TypeError when using '?' after a string in a %logstart session * :ghissue:`2787`: rmagic and pandas DataFrame * :ghissue:`2605`: Ellipsis literal triggers AttributeError * :ghissue:`1179`: Test unicode source in pinfo * :ghissue:`2055`: drop Python 3.1 support * :ghissue:`2293`: IPEP 2: Input transformations * :ghissue:`2790`: %paste and %cpaste not removing "..." lines * :ghissue:`3480`: Testing fails because iptest.py cannot be found * :ghissue:`2580`: will not run within PIL build directory * :ghissue:`2797`: RMagic, Dataframe Conversion Problem * :ghissue:`2838`: Empty lines disappear from triple-quoted literals. * :ghissue:`3050`: Broken link on IPython.core.display page * :ghissue:`3473`: Config not passed down to subcommands * :ghissue:`3462`: Setting log_format in config file results in error (and no format changes) * :ghissue:`3311`: Notebook (occasionally) not working on windows (Sophos AV) * :ghissue:`3461`: Cursor positioning off by a character in auto-wrapped lines * :ghissue:`3454`: _repr_html_ error * :ghissue:`3457`: Space in long Paragraph Markdown cell with Chinese or Japanese * :ghissue:`3447`: Run Cell Does not Work * :ghissue:`1373`: Last lines in long cells are hidden * :ghissue:`1504`: Revisit serialization in IPython.parallel * :ghissue:`1459`: Can't connect to 2 HTTPS notebook servers on the same host * :ghissue:`678`: Input prompt stripping broken with multiline data structures * :ghissue:`3001`: IPython.notebook.dirty flag is not set when a cell has unsaved changes * :ghissue:`3077`: Multiprocessing semantics in parallel.view.map * :ghissue:`3056`: links across notebooks * :ghissue:`3120`: Tornado 3.0 * :ghissue:`3156`: update pretty to use Python 3 style for sets * :ghissue:`3197`: Can't escape multiple dollar signs in a markdown cell * :ghissue:`3309`: `Image()` signature/doc improvements * :ghissue:`3415`: Bug in IPython/external/path/__init__.py * :ghissue:`3446`: Feature suggestion: Download matplotlib figure to client browser * :ghissue:`3295`: autoexported notebooks: only export explicitly marked cells * :ghissue:`3442`: Notebook: Summary table extracted from markdown headers * :ghissue:`3438`: Zooming notebook in chrome is broken in master * :ghissue:`1378`: Implement autosave in notebook * :ghissue:`3437`: Highlighting matching parentheses * :ghissue:`3435`: module search segfault * :ghissue:`3424`: ipcluster --version * :ghissue:`3434`: 0.13.2 Ipython/genutils.py doesn't exist * :ghissue:`3426`: Feature request: Save by cell and not by line #: IPython %save magic * :ghissue:`3412`: Non Responsive Kernel: Running a Django development server from an IPython Notebook * :ghissue:`3408`: Save cell toolbar and slide type metadata in notebooks * :ghissue:`3246`: %paste regression with blank lines * :ghissue:`3404`: Weird error with $variable and grep in command line magic (!command) * :ghissue:`3405`: Key auto-completion in dictionaries? * :ghissue:`3259`: Codemirror linenumber css broken * :ghissue:`3397`: Vertical text misalignment in Markdown cells * :ghissue:`3391`: Revert #3358 once fix integrated into CM * :ghissue:`3360`: Error 500 while saving IPython notebook * :ghissue:`3375`: Frequent Safari/Webkit crashes * :ghissue:`3365`: zmq frontend * :ghissue:`2654`: User_expression issues * :ghissue:`3389`: Store history as plain text * :ghissue:`3388`: Ipython parallel: open TCP connection created for each result returned from engine * :ghissue:`3385`: setup.py failure on Python 3 * :ghissue:`3376`: Setting `__module__` to None breaks pretty printing * :ghissue:`3374`: ipython qtconsole does not display the prompt on OSX * :ghissue:`3380`: simple call to kernel * :ghissue:`3379`: TaskRecord key 'started' not set * :ghissue:`3241`: notebook connection time out * :ghissue:`3334`: magic interpreter interprets non magic commands? * :ghissue:`3326`: python3.3: Type error when launching SGE cluster in IPython notebook * :ghissue:`3349`: pip3 doesn't run 2to3? * :ghissue:`3347`: Longlist support in ipdb * :ghissue:`3343`: Make pip install / easy_install faster * :ghissue:`3337`: git submodules broke nightly PPA builds * :ghissue:`3206`: Copy/Paste Regression in QtConsole * :ghissue:`3329`: Buggy linewrap in Mac OSX Terminal (Mountain Lion) * :ghissue:`3327`: Qt version check broken * :ghissue:`3303`: parallel tasks never finish under heavy load * :ghissue:`1381`: '\\' for equation continuations require an extra '\' in markdown cells * :ghissue:`3314`: Error launching IPython * :ghissue:`3306`: Test failure when running on a Vagrant VM * :ghissue:`3280`: IPython.utils.process.getoutput returns stderr * :ghissue:`3299`: variables named _ or __ exhibit incorrect behavior * :ghissue:`3196`: add an "x" or similar to htmlnotebook pager * :ghissue:`3293`: Several 404 errors for js files Firefox * :ghissue:`3292`: syntax highlighting in chrome on OSX 10.8.3 * :ghissue:`3288`: Latest dev version hangs on page load * :ghissue:`3283`: ipython dev retains directory information after directory change * :ghissue:`3279`: custom.css is not overridden in the dev IPython (1.0) * :ghissue:`2727`: %run -m doesn't support relative imports * :ghissue:`3268`: GFM triple backquote and unknown language * :ghissue:`3273`: Suppressing all plot related outputs * :ghissue:`3272`: Backspace while completing load previous page * :ghissue:`3260`: Js error in savewidget * :ghissue:`3247`: scrollbar in notebook when not needed? * :ghissue:`3243`: notebook: option to view json source from browser * :ghissue:`3265`: 404 errors when running IPython 1.0dev * :ghissue:`3257`: setup.py not finding submodules * :ghissue:`3253`: Incorrect Qt and PySide version comparison * :ghissue:`3248`: Cell magics broken in Qt console * :ghissue:`3012`: Problems with the less based style.min.css * :ghissue:`2390`: Image width/height don't work in embedded images * :ghissue:`3236`: cannot set TerminalIPythonApp.log_format * :ghissue:`3214`: notebook kernel dies if started with invalid parameter * :ghissue:`2980`: Remove HTMLCell ? * :ghissue:`3128`: qtconsole hangs on importing pylab (using X forwarding) * :ghissue:`3198`: Hitting recursive depth causing all notebook pages to hang * :ghissue:`3218`: race conditions in profile directory creation * :ghissue:`3177`: OverflowError execption in handlers.py * :ghissue:`2563`: core.profiledir.check_startup_dir() doesn't work inside py2exe'd installation * :ghissue:`3207`: [Feature] folders for ipython notebook dashboard * :ghissue:`3178`: cell magics do not work with empty lines after #2447 * :ghissue:`3204`: Default plot() colors unsuitable for red-green colorblind users * :ghissue:`1789`: ``:\n/*foo`` turns into ``:\n*(foo)`` in triple-quoted strings. * :ghissue:`3202`: File cell magic fails with blank lines * :ghissue:`3199`: %%cython -a stopped working? * :ghissue:`2688`: obsolete imports in import autocompletion * :ghissue:`3192`: Python2, Unhandled exception, __builtin__.True = False * :ghissue:`3179`: script magic error message loop * :ghissue:`3009`: use XDG_CACHE_HOME for cython objects * :ghissue:`3059`: Bugs in 00_notebook_tour example. * :ghissue:`3104`: Integrate a javascript file manager into the notebook front end * :ghissue:`3176`: Particular equation not rendering (notebook) * :ghissue:`1133`: [notebook] readonly and upload files/UI * :ghissue:`2975`: [notebook] python file and cell toolbar * :ghissue:`3017`: SciPy.weave broken in IPython notebook/ qtconsole * :ghissue:`3161`: paste macro not reading spaces correctly * :ghissue:`2835`: %paste not working on WinXpSP3/ipython-0.13.1.py2-win32-PROPER.exe/python27 * :ghissue:`2628`: Make transformers work for lines following decorators * :ghissue:`2612`: Multiline String containing ":\n?foo\n" confuses interpreter to replace ?foo with get_ipython().magic(u'pinfo foo') * :ghissue:`2539`: Request: Enable cell magics inside of .ipy scripts * :ghissue:`2507`: Multiline string does not work (includes `...`) with doctest type input in IPython notebook * :ghissue:`2164`: Request: Line breaks in line magic command * :ghissue:`3106`: poor parallel performance with many jobs * :ghissue:`2438`: print inside multiprocessing crashes Ipython kernel * :ghissue:`3155`: Bad md5 hash for package 0.13.2 * :ghissue:`3045`: [Notebook] Ipython Kernel does not start if disconnected from internet(/network?) * :ghissue:`3146`: Using celery in python 3.3 * :ghissue:`3145`: The notebook viewer is down * :ghissue:`2385`: grep --color not working well with notebook * :ghissue:`3131`: Quickly install from source in a clean virtualenv? * :ghissue:`3139`: Rolling log for ipython * :ghissue:`3127`: notebook with pylab=inline appears to call figure.draw twice * :ghissue:`3129`: Walking up and down the call stack * :ghissue:`3123`: Notebook crashed if unplugged ethernet cable * :ghissue:`3121`: NB should use normalize.css? was #3049 * :ghissue:`3087`: Disable spellchecking in notebook * :ghissue:`3084`: ipython pyqt 4.10 incompatibilty, QTextBlockUserData * :ghissue:`3113`: Fails to install under Jython 2.7 beta * :ghissue:`3110`: Render of h4 headers is not correct in notebook (error in renderedhtml.css) * :ghissue:`3109`: BUG: read_csv: dtype={'id' : np.str}: Datatype not understood * :ghissue:`3107`: Autocompletion of object attributes in arrays * :ghissue:`3103`: Reset locale setting in qtconsole * :ghissue:`3090`: python3.3 Entry Point not found * :ghissue:`3081`: UnicodeDecodeError when using Image(data="some.jpeg") * :ghissue:`2834`: url regexp only finds one link * :ghissue:`3091`: qtconsole breaks doctest.testmod() in Python 3.3 * :ghissue:`3074`: SIGUSR1 not available on Windows * :ghissue:`2996`: registration::purging stalled registration high occurrence in small clusters * :ghissue:`3065`: diff-ability of notebooks * :ghissue:`3067`: Crash with pygit2 * :ghissue:`3061`: Bug handling Ellipsis * :ghissue:`3049`: NB css inconsistent behavior between ff and webkit * :ghissue:`3039`: unicode errors when opening a new notebook * :ghissue:`3048`: Installning ipython qtConsole should be easyer att Windows * :ghissue:`3042`: Profile creation fails on 0.13.2 branch * :ghissue:`3035`: docstring typo/inconsistency: mention of an xml notebook format? * :ghissue:`3031`: HDF5 library segfault (possibly due to mismatching headers?) * :ghissue:`2991`: In notebook importing sympy closes ipython kernel * :ghissue:`3027`: f.__globals__ causes an error in Python 3.3 * :ghissue:`3020`: Failing test test_interactiveshell.TestAstTransform on Windows * :ghissue:`3023`: alt text for "click to expand output" has typo in alt text * :ghissue:`2963`: %history to print all input history of a previous session when line range is omitted * :ghissue:`3018`: IPython installed within virtualenv. WARNING "Please install IPython inside the virtualtenv" * :ghissue:`2484`: Completion in Emacs *Python* buffer causes prompt to be increased. * :ghissue:`3014`: Ctrl-C finishes notebook immediately * :ghissue:`3007`: cython_pyximport reload broken in python3 * :ghissue:`2955`: Incompatible Qt imports when running inprocess_qtconsole * :ghissue:`3006`: [IPython 0.13.1] The check of PyQt version is wrong * :ghissue:`3005`: Renaming a notebook to an existing notebook name overwrites the other file * :ghissue:`2940`: Abort trap in IPython Notebook after installing matplotlib * :ghissue:`3000`: issue #3000 * :ghissue:`2995`: ipython_directive.py fails on multiline when prompt number < 100 * :ghissue:`2993`: File magic (%%file) does not work with paths beginning with tilde (e.g., ~/anaconda/stuff.txt) * :ghissue:`2992`: Cell-based input for console and qt frontends? * :ghissue:`2425`: Liaise with Spyder devs to integrate newer IPython * :ghissue:`2986`: requesting help in a loop can damage a notebook * :ghissue:`2978`: v1.0-dev build errors on Arch with Python 3. * :ghissue:`2557`: [refactor] Insert_cell_at_index() * :ghissue:`2969`: ipython command does not work in terminal * :ghissue:`2762`: OSX wxPython (osx_cocoa, 64bit) command "%gui wx" blocks the interpreter * :ghissue:`2956`: Silent importing of submodules differs from standard Python3.2 interpreter's behavior * :ghissue:`2943`: Up arrow key history search gets stuck in QTConsole * :ghissue:`2953`: using 'nonlocal' declaration in global scope causes ipython3 crash * :ghissue:`2952`: qtconsole ignores exec_lines * :ghissue:`2949`: ipython crashes due to atexit() * :ghissue:`2947`: From rmagic to an R console * :ghissue:`2938`: docstring pane not showing in notebook * :ghissue:`2936`: Tornado assumes invalid signature for parse_qs on Python 3.1 * :ghissue:`2935`: unable to find python after easy_install / pip install * :ghissue:`2920`: Add undo-cell deletion menu * :ghissue:`2914`: BUG:saving a modified .py file after loading a module kills the kernel * :ghissue:`2925`: BUG: kernel dies if user sets sys.stderr or sys.stdout to a file object * :ghissue:`2909`: LaTeX sometimes fails to render in markdown cells with some curly bracket + underscore combinations * :ghissue:`2898`: Skip ipc tests on Windows * :ghissue:`2902`: ActiveState attempt to build ipython 0.12.1 for python 3.2.2 for Mac OS failed * :ghissue:`2899`: Test failure in IPython.core.tests.test_magic.test_time * :ghissue:`2890`: Test failure when fabric not installed * :ghissue:`2892`: IPython tab completion bug for paths * :ghissue:`1340`: Allow input cells to be collapsed * :ghissue:`2881`: ? command in notebook does not show help in Safari * :ghissue:`2751`: %%timeit should use minutes to format running time in long running cells * :ghissue:`2879`: When importing a module with a wrong name, ipython crashes * :ghissue:`2862`: %%timeit should warn of empty contents * :ghissue:`2485`: History navigation breaks in qtconsole * :ghissue:`2785`: gevent input hook * :ghissue:`2843`: Sliently running code in clipboard (with paste, cpaste and variants) * :ghissue:`2784`: %run -t -N error * :ghissue:`2732`: Test failure with FileLinks class on Windows * :ghissue:`2860`: ipython help notebook -> KeyError: 'KernelManager' * :ghissue:`2858`: Where is the installed `ipython` script? * :ghissue:`2856`: Edit code entered from ipython in external editor * :ghissue:`2722`: IPC transport option not taking effect ? * :ghissue:`2473`: Better error messages in ipengine/ipcontroller * :ghissue:`2836`: Cannot send builtin module definitions to IP engines * :ghissue:`2833`: Any reason not to use super() ? * :ghissue:`2781`: Cannot interrupt infinite loops in the notebook * :ghissue:`2150`: clippath_demo.py in matplotlib example does not work with inline backend * :ghissue:`2634`: Numbered list in notebook markdown cell renders with Roman numerals instead of numbers * :ghissue:`2230`: IPython crashing during startup with "AttributeError: 'NoneType' object has no attribute 'rstrip'" * :ghissue:`2483`: nbviewer bug? with multi-file gists * :ghissue:`2466`: mistyping `ed -p` breaks `ed -p` * :ghissue:`2477`: Glob expansion tests fail on Windows * :ghissue:`2622`: doc issue: notebooks that ship with Ipython .13 are written for python 2.x * :ghissue:`2626`: Add "Cell -> Run All Keep Going" for notebooks * :ghissue:`1223`: Show last modification date of each notebook * :ghissue:`2621`: user request: put link to example notebooks in Dashboard * :ghissue:`2564`: grid blanks plots in ipython pylab inline mode (interactive) * :ghissue:`2532`: Django shell (IPython) gives NameError on dict comprehensions * :ghissue:`2188`: ipython crashes on ctrl-c * :ghissue:`2391`: Request: nbformat API to load/save without changing version * :ghissue:`2355`: Restart kernel message even though kernel is perfectly alive * :ghissue:`2306`: Garbled input text after reverse search on Mac OS X * :ghissue:`2297`: ipdb with separate kernel/client pushing stdout to kernel process only * :ghissue:`2180`: Have [kernel busy] overridden only by [kernel idle] * :ghissue:`1188`: Pylab with OSX backend keyboard focus issue and hang * :ghissue:`2107`: test_octavemagic.py[everything] fails * :ghissue:`1212`: Better understand/document browser compatibility * :ghissue:`1585`: Refactor notebook templates to use Jinja2 and make each page a separate directory * :ghissue:`1443`: xticks scaling factor partially obscured with qtconsole and inline plotting * :ghissue:`1209`: can't make %result work as in doc. * :ghissue:`1200`: IPython 0.12 Windows install fails on Vista * :ghissue:`1127`: Interactive test scripts for Qt/nb issues * :ghissue:`959`: Matplotlib figures hide * :ghissue:`2071`: win32 installer issue on Windows XP * :ghissue:`2610`: ZMQInteractiveShell.colors being ignored * :ghissue:`2505`: Markdown Cell incorrectly highlighting after "<" * :ghissue:`165`: Installer fails to create Start Menu entries on Windows * :ghissue:`2356`: failing traceback in terminal ipython for first exception * :ghissue:`2145`: Have dashboad show when server disconect * :ghissue:`2098`: Do not crash on kernel shutdow if json file is missing * :ghissue:`2813`: Offline MathJax is broken on 0.14dev * :ghissue:`2807`: Test failure: IPython.parallel.tests.test_client.TestClient.test_purge_everything * :ghissue:`2486`: Readline's history search in ipython console does not clear properly after cancellation with Ctrl+C * :ghissue:`2709`: Cython -la doesn't work * :ghissue:`2767`: What is IPython.utils.upgradedir ? * :ghissue:`2210`: Placing matplotlib legend outside axis bounds causes inline display to clip it * :ghissue:`2553`: IPython Notebooks not robust against client failures * :ghissue:`2536`: ImageDraw in Ipython notebook not drawing lines * :ghissue:`2264`: Feature request: Versioning messaging protocol * :ghissue:`2589`: Creation of ~300+ MPI-spawned engines causes instability in ipcluster * :ghissue:`2672`: notebook: inline option without pylab * :ghissue:`2673`: Indefinite Articles & Traitlets * :ghissue:`2705`: Notebook crashes Safari with select and drag * :ghissue:`2721`: dreload kills ipython when it hits zmq * :ghissue:`2806`: ipython.parallel doesn't discover globals under Python 3.3 * :ghissue:`2794`: _exit_code behaves differently in terminal vs ZMQ frontends * :ghissue:`2793`: IPython.parallel issue with pushing pandas TimeSeries * :ghissue:`1085`: In process kernel for Qt frontend * :ghissue:`2760`: IndexError: list index out of range with Python 3.2 * :ghissue:`2780`: Save and load notebooks from github * :ghissue:`2772`: AttributeError: 'Client' object has no attribute 'kill' * :ghissue:`2754`: Fail to send class definitions from interactive session to engines namespaces * :ghissue:`2764`: TypeError while using 'cd' * :ghissue:`2765`: name '__file__' is not defined * :ghissue:`2540`: Wrap tooltip if line exceeds threshold? * :ghissue:`2394`: Startup error on ipython qtconsole (version 0.13 and 0.14-dev * :ghissue:`2440`: IPEP 4: Python 3 Compatibility * :ghissue:`1814`: __file__ is not defined when file end with .ipy * :ghissue:`2759`: R magic extension interferes with tab completion * :ghissue:`2615`: Small change needed to rmagic extension. * :ghissue:`2748`: collapse parts of a html notebook * :ghissue:`1661`: %paste still bugs about IndentationError and says to use %paste * :ghissue:`2742`: Octavemagic fails to deliver inline images in IPython (on Windows) * :ghissue:`2739`: wiki.ipython.org contaminated with prescription drug spam * :ghissue:`2588`: Link error while executing code from cython example notebook * :ghissue:`2550`: Rpush magic doesn't find local variables and doesn't support comma separated lists of variables * :ghissue:`2675`: Markdown/html blockquote need css. * :ghissue:`2419`: TerminalInteractiveShell.__init__() ignores value of ipython_dir argument * :ghissue:`1523`: Better LaTeX printing in the qtconsole with the sympy profile * :ghissue:`2719`: ipython fails with `pkg_resources.DistributionNotFound: ipython==0.13` * :ghissue:`2715`: url crashes nbviewer.ipython.org * :ghissue:`2555`: "import" module completion on MacOSX * :ghissue:`2707`: Problem installing the new version of IPython in Windows * :ghissue:`2696`: SymPy magic bug in IPython Notebook * :ghissue:`2684`: pretty print broken for types created with PyType_FromSpec * :ghissue:`2533`: rmagic breaks on Windows * :ghissue:`2661`: Qtconsole tooltip is too wide when the function has many arguments * :ghissue:`2679`: ipython3 qtconsole via Homebrew on Mac OS X 10.8 - pyqt/pyside import error * :ghissue:`2646`: pylab_not_importable * :ghissue:`2587`: cython magic pops 2 CLI windows upon execution on Windows * :ghissue:`2660`: Certain arguments (-h, --help, --version) never passed to scripts run with ipython * :ghissue:`2665`: Missing docs for rmagic and some other extensions * :ghissue:`2611`: Travis wants to drop 3.1 support * :ghissue:`2658`: Incorrect parsing of raw multiline strings * :ghissue:`2655`: Test fails if `from __future__ import print_function` in .pythonrc.py * :ghissue:`2651`: nonlocal with no existing variable produces too many errors * :ghissue:`2645`: python3 is a pain (minor unicode bug) * :ghissue:`2637`: %paste in Python 3 on Mac doesn't work * :ghissue:`2624`: Error on launching IPython on Win 7 and Python 2.7.3 * :ghissue:`2608`: disk IO activity on cursor press * :ghissue:`1275`: Markdown parses LaTeX math symbols as its formatting syntax in notebook * :ghissue:`2613`: display(Math(...)) doesn't render \tau correctly * :ghissue:`925`: Tab-completion in Qt console needn't use pager * :ghissue:`2607`: %load_ext sympy.interactive.ipythonprinting dammaging output * :ghissue:`2593`: Toolbar button to open qtconsole from notebook * :ghissue:`2602`: IPython html documentation for downloading * :ghissue:`2598`: ipython notebook --pylab=inline replaces built-in any() * :ghissue:`2244`: small issue: wrong printout * :ghissue:`2590`: add easier way to execute scripts in the current directory * :ghissue:`2581`: %hist does not work when InteractiveShell.cache_size = 0 * :ghissue:`2584`: No file COPYING * :ghissue:`2578`: AttributeError: 'module' object has no attribute 'TestCase' * :ghissue:`2576`: One of my notebooks won't load any more -- is there a maximum notebook size? * :ghissue:`2560`: Notebook output is invisible when printing strings with \r\r\n line endings * :ghissue:`2566`: if pyside partially present ipython qtconsole fails to load even if pyqt4 present * :ghissue:`1308`: ipython qtconsole --ssh=server --existing ... hangs * :ghissue:`1679`: List command doesn't work in ipdb debugger the first time * :ghissue:`2545`: pypi win32 installer creates 64bit executibles * :ghissue:`2080`: Event loop issues with IPython 0.12 and PyQt4 (``QDialog.exec_`` and more) * :ghissue:`2541`: Allow `python -m IPython` * :ghissue:`2508`: subplots_adjust() does not work correctly in ipython notebook * :ghissue:`2289`: Incorrect mathjax rendering of certain arrays of equations * :ghissue:`2487`: Selecting and indenting * :ghissue:`2521`: more fine-grained 'run' controls, such as 'run from here' and 'run until here' * :ghissue:`2535`: Funny bounding box when plot with text * :ghissue:`2523`: History not working * :ghissue:`2514`: Issue with zooming in qtconsole * :ghissue:`2220`: No sys.stdout.encoding in kernel based IPython * :ghissue:`2512`: ERROR: Internal Python error in the inspect module. * :ghissue:`2496`: Function passwd does not work in QtConsole * :ghissue:`1453`: make engines reconnect/die when controller was restarted * :ghissue:`2481`: ipython notebook -- clicking in a code cell's output moves the screen to the top of the code cell * :ghissue:`2488`: Undesired plot outputs in Notebook inline mode * :ghissue:`2482`: ipython notebook -- download may not get the latest notebook * :ghissue:`2471`: _subprocess module removed in Python 3.3 * :ghissue:`2374`: Issues with man pages * :ghissue:`2316`: parallel.Client.__init__ should take cluster_id kwarg * :ghissue:`2457`: Can a R library wrapper be created with Rmagic? * :ghissue:`1575`: Fallback frontend for console when connecting pylab=inlnie -enabled kernel? * :ghissue:`2097`: Do not crash if history db is corrupted * :ghissue:`2435`: ipengines fail if clean_logs enabled * :ghissue:`2429`: Using warnings.warn() results in TypeError * :ghissue:`2422`: Multiprocessing in ipython notebook kernel crash * :ghissue:`2426`: ipython crashes with the following message. I do not what went wrong. Can you help me identify the problem? * :ghissue:`2423`: Docs typo? * :ghissue:`2257`: pip install -e fails * :ghissue:`2418`: rmagic can't run R's read.csv on data files with NA data * :ghissue:`2417`: HTML notebook: Backspace sometimes deletes multiple characters * :ghissue:`2275`: notebook: "Down_Arrow" on last line of cell should move to end of line * :ghissue:`2414`: 0.13.1 does not work with current EPD 7.3-2 * :ghissue:`2409`: there is a redundant None * :ghissue:`2410`: Use /usr/bin/python3 instead of /usr/bin/python * :ghissue:`2366`: Notebook Dashboard --notebook-dir and fullpath * :ghissue:`2406`: Inability to get docstring in debugger * :ghissue:`2398`: Show line number for IndentationErrors * :ghissue:`2314`: HTML lists seem to interfere with the QtConsole display * :ghissue:`1688`: unicode exception when using %run with failing script * :ghissue:`1884`: IPython.embed changes color on error * :ghissue:`2381`: %time doesn't work for multiline statements * :ghissue:`1435`: Add size keywords in Image class * :ghissue:`2372`: interactiveshell.py misses urllib and io_open imports * :ghissue:`2371`: IPython not working * :ghissue:`2367`: Tab expansion moves to next cell in notebook * :ghissue:`2359`: nbviever alters the order of print and display() output * :ghissue:`2227`: print name for IPython Notebooks has become uninformative * :ghissue:`2361`: client doesn't use connection file's 'location' in disambiguating 'interface' * :ghissue:`2357`: failing traceback in terminal ipython for first exception * :ghissue:`2343`: Installing in a python 3.3b2 or python 3.3rc1 virtual environment. * :ghissue:`2315`: Failure in test: "Test we're not loading modules on startup that we shouldn't." * :ghissue:`2351`: Multiple Notebook Apps: cookies not port specific, clash with each other * :ghissue:`2350`: running unittest from qtconsole prints output to terminal * :ghissue:`2303`: remote tracebacks broken since 952d0d6 (PR #2223) * :ghissue:`2330`: qtconsole does not highlight tab-completion suggestion with custom stylesheet * :ghissue:`2325`: Parsing Tex formula fails in Notebook * :ghissue:`2324`: Parsing Tex formula fails * :ghissue:`1474`: Add argument to `run -n` for custom namespace * :ghissue:`2318`: C-m n/p don't work in Markdown cells in the notebook * :ghissue:`2309`: time.time() in ipython notebook producing impossible results * :ghissue:`2307`: schedule tasks on newly arrived engines * :ghissue:`2313`: Allow Notebook HTML/JS to send messages to Python code * :ghissue:`2304`: ipengine throws KeyError: url * :ghissue:`1878`: shell access using ! will not fill class or function scope vars * :ghissue:`2253`: %paste does not retrieve clipboard contents under screen/tmux on OS X * :ghissue:`1510`: Add-on (or Monkey-patch) infrastructure for HTML notebook * :ghissue:`2273`: triple quote and %s at beginning of line with %paste * :ghissue:`2243`: Regression in .embed() * :ghissue:`2266`: SSH passwordless check with OpenSSH checks for the wrong thing * :ghissue:`2217`: Change NewNotebook handler to use 30x redirect * :ghissue:`2276`: config option for disabling history store * :ghissue:`2239`: can't use parallel.Reference in view.map * :ghissue:`2272`: Sympy piecewise messed up rendering * :ghissue:`2252`: %paste throws an exception with empty clipboard * :ghissue:`2259`: git-mpr is currently broken * :ghissue:`2247`: Variable expansion in shell commands should work in substrings * :ghissue:`2026`: Run 'fast' tests only * :ghissue:`2241`: read a list of notebooks on server and bring into browser only notebook * :ghissue:`2237`: please put python and text editor in the web only ipython * :ghissue:`2053`: Improvements to the IPython.display.Image object * :ghissue:`1456`: ERROR: Internal Python error in the inspect module. * :ghissue:`2221`: Avoid importing from IPython.parallel in core * :ghissue:`2213`: Can't trigger startup code in Engines * :ghissue:`1464`: Strange behavior for backspace with lines ending with more than 4 spaces in notebook * :ghissue:`2187`: NaN in object_info_reply JSON causes parse error * :ghissue:`214`: system command requiring administrative privileges * :ghissue:`2195`: Unknown option `no-edit` in git-mpr * :ghissue:`2201`: Add documentation build to tools/test_pr.py * :ghissue:`2205`: Command-line option for default Notebook output collapsing behavior * :ghissue:`1927`: toggle between inline and floating figures * :ghissue:`2171`: Can't start StarCluster after upgrading to IPython 0.13 * :ghissue:`2173`: oct2py v >= 0.3.1 doesn't need h5py anymore * :ghissue:`2099`: storemagic needs to use self.shell * :ghissue:`2166`: DirectView map_sync() with Lambdas Using Generators * :ghissue:`2091`: Unable to use print_stats after %prun -r in notebook * :ghissue:`2132`: Add fail-over for pastebin * :ghissue:`2156`: Make it possible to install ipython without nasty gui dependencies * :ghissue:`2154`: Scrolled long output should be off in print view by default * :ghissue:`2162`: Tab completion does not work with IPython.embed_kernel() * :ghissue:`2157`: IPython 0.13 / github-master cannot create logfile from scratch * :ghissue:`2151`: missing newline when a magic is called from the qtconsole menu * :ghissue:`2139`: 00_notebook_tour Image example broken on master * :ghissue:`2143`: Add a %%cython_annotate magic * :ghissue:`2135`: Running IPython from terminal * :ghissue:`2093`: Makefile for building Sphinx documentation on Windows * :ghissue:`2122`: Bug in pretty printing * :ghissue:`2120`: Notebook "Make a Copy..." keeps opening duplicates in the same tab * :ghissue:`1997`: password cannot be used with url prefix * :ghissue:`2129`: help/doc displayed multiple times if requested in loop * :ghissue:`2121`: ipdb does not support input history in qtconsole * :ghissue:`2114`: %logstart doesn't log * :ghissue:`2085`: %ed magic fails in qtconsole * :ghissue:`2119`: IPython fails to run on MacOS Lion * :ghissue:`2052`: %pylab inline magic does not work on windows * :ghissue:`2111`: Ipython won't start on W7 * :ghissue:`2112`: Strange internal traceback * :ghissue:`2108`: Backslash (\) at the end of the line behavior different from default Python * :ghissue:`1425`: Ampersands can't be typed sometimes in notebook cells * :ghissue:`1513`: Add expand/collapse support for long output elements like stdout and tracebacks * :ghissue:`2087`: error when starting ipython * :ghissue:`2103`: Ability to run notebook file from commandline * :ghissue:`2082`: Qt Console output spacing * :ghissue:`2083`: Test failures with Python 3.2 and PYTHONWARNINGS="d" * :ghissue:`2094`: about inline * :ghissue:`2077`: Starting IPython3 on the terminal * :ghissue:`1760`: easy_install ipython fails on py3.2-win32 * :ghissue:`2075`: Local Mathjax install causes iptest3 error under python3 * :ghissue:`2057`: setup fails for python3 with LANG=C * :ghissue:`2070`: shebang on Windows * :ghissue:`2054`: sys_info missing git hash in sdists * :ghissue:`2059`: duplicate and modified files in documentation * :ghissue:`2056`: except-shadows-builtin osm.py:687 * :ghissue:`2058`: hyphen-used-as-minus-sign in manpages ipython-8.35.0/docs/source/whatsnew/github-stats-2.0.rst000066400000000000000000002533561477474304100230670ustar00rootroot00000000000000.. _issues_list_200: Issues closed in the 2.x development cycle ========================================== Issues closed in 2.4.1 ---------------------- GitHub stats for 2014/11/01 - 2015/01/30 .. note:: IPython 2.4.0 was released without a few of the backports listed below. 2.4.1 has the correct patches intended for 2.4.0. These lists are automatically generated, and may be incomplete or contain duplicates. The following 7 authors contributed 35 commits. * Benjamin Ragan-Kelley * Carlos Cordoba * Damon Allen * Jessica B. Hamrick * Mateusz Paprocki * Peter Würtz * Thomas Kluyver We closed 10 issues and merged 6 pull requests; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (10): * :ghpull:`7106`: Changed the display order of rich output in the live notebook. * :ghpull:`6878`: Update pygments monkeypatch for compatibility with Pygments 2.0 * :ghpull:`6778`: backport nbformat v4 to 2.x * :ghpull:`6761`: object_info_reply field is oname, not name * :ghpull:`6653`: Fix IPython.utils.ansispan() to ignore stray [0m * :ghpull:`6706`: Correctly display prompt numbers that are ``None`` * :ghpull:`6634`: don't use contains in SelectWidget item_query * :ghpull:`6593`: note how to start the qtconsole * :ghpull:`6281`: more minor fixes to release scripts * :ghpull:`5458`: Add support for PyQt5. Issues (6): * :ghissue:`7272`: qtconsole problems with pygments * :ghissue:`7049`: Cause TypeError: 'NoneType' object is not callable in qtconsole * :ghissue:`6877`: Qt console doesn't work with pygments 2.0rc1 * :ghissue:`6689`: Problem with string containing two or more question marks * :ghissue:`6702`: Cell numbering after ``ClearOutput`` preprocessor * :ghissue:`6633`: selectwidget doesn't display 1 as a selection choice when passed in as a member of values list Issues closed in 2.3.1 ---------------------- Just one bugfix: fixed bad CRCRLF line-endings in notebooks on Windows Pull Requests (1): * :ghpull:`6911`: don't use text mode in mkstemp Issues (1): * :ghissue:`6599`: Notebook.ipynb CR+LF turned into CR+CR+LF Issues closed in 2.3.0 ---------------------- GitHub stats for 2014/08/06 - 2014/10/01 These lists are automatically generated, and may be incomplete or contain duplicates. The following 6 authors contributed 31 commits. * Benjamin Ragan-Kelley * David Hirschfeld * Eric Firing * Jessica B. Hamrick * Matthias Bussonnier * Thomas Kluyver We closed 16 issues and merged 9 pull requests; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (16): * :ghpull:`6587`: support ``%matplotlib qt5`` and ``%matplotlib nbagg`` * :ghpull:`6583`: Windows symlink test fixes * :ghpull:`6585`: fixes :ghissue:`6473` * :ghpull:`6581`: Properly mock winreg functions for test * :ghpull:`6556`: Use some more informative asserts in inprocess kernel tests * :ghpull:`6514`: Fix for copying metadata flags * :ghpull:`6453`: Copy file metadata in atomic save * :ghpull:`6480`: only compare host:port in Websocket.check_origin * :ghpull:`6483`: Trim anchor link in heading cells, fixes :ghissue:`6324` * :ghpull:`6410`: Fix relative import in appnope * :ghpull:`6395`: update mathjax CDN url in nbconvert template * :ghpull:`6269`: Implement atomic save * :ghpull:`6374`: Rename ``abort_queues`` --> ``_abort_queues`` * :ghpull:`6321`: Use appnope in qt and wx gui support from the terminal; closes :ghissue:`6189` * :ghpull:`6318`: use write_error instead of get_error_html * :ghpull:`6303`: Fix error message when failing to load a notebook Issues (9): * :ghissue:`6057`: ``%matplotlib`` + qt5 * :ghissue:`6518`: Test failure in atomic save on Windows * :ghissue:`6473`: Switching between "Raw Cell Format" and "Edit Metadata" does not work * :ghissue:`6405`: Creating a notebook should respect directory permissions; saving should respect prior permissions * :ghissue:`6324`: Anchors in Heading don't work. * :ghissue:`6409`: No module named '_dummy' * :ghissue:`6392`: Mathjax library link broken * :ghissue:`6329`: IPython Notebook Server URL now requires "tree" at the end of the URL? (version 2.2) * :ghissue:`6189`: ipython console freezes for increasing no of seconds in %pylab mode Issues closed in 2.2.0 ---------------------- GitHub stats for 2014/05/21 - 2014/08/06 (tag: rel-2.1.0) These lists are automatically generated, and may be incomplete or contain duplicates. The following 13 authors contributed 36 commits. * Adam Hodgen * Benjamin Ragan-Kelley * Björn Grüning * Dara Adib * Eric Galloway * Jonathan Frederic * Kyle Kelley * Matthias Bussonnier * Paul Ivanov * Shayne Hodge * Steven Anton * Thomas Kluyver * Zahari We closed 23 issues and merged 11 pull requests; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (23): * :ghpull:`6279`: minor updates to release scripts * :ghpull:`6273`: Upgrade default mathjax version. * :ghpull:`6249`: always use HTTPS getting mathjax from CDN * :ghpull:`6114`: update hmac signature comparison * :ghpull:`6195`: Close handle on new temporary files before returning filename * :ghpull:`6143`: pin tornado to < 4 on travis js tests * :ghpull:`6134`: remove rackcdn https workaround for mathjax cdn * :ghpull:`6120`: Only allow iframe embedding on same origin. * :ghpull:`6117`: Remove / from route of TreeRedirectHandler. * :ghpull:`6105`: only set allow_origin_pat if defined * :ghpull:`6102`: Add newline if missing to end of script magic cell * :ghpull:`6077`: allow unicode keys in dicts in json_clean * :ghpull:`6061`: make CORS configurable * :ghpull:`6081`: don’t modify dict keys while iterating through them * :ghpull:`5803`: unify visual line handling * :ghpull:`6005`: Changed right arrow key movement function to mirror left arrow key * :ghpull:`6029`: add pickleutil.PICKLE_PROTOCOL * :ghpull:`6003`: Set kernel_id before checking websocket * :ghpull:`5994`: Fix ssh tunnel for Python3 * :ghpull:`5973`: Do not create checkpoint_dir relative to current dir * :ghpull:`5933`: fix qt_loader import hook signature * :ghpull:`5944`: Markdown rendering bug fix. * :ghpull:`5917`: use shutil.move instead of os.rename Issues (11): * :ghissue:`6246`: Include MathJax by default or access the CDN over a secure connection * :ghissue:`5525`: Websocket origin check fails when used with Apache WS proxy * :ghissue:`5901`: 2 test failures in Python 3.4 in parallel group * :ghissue:`5926`: QT console: text selection cannot be made from left to right with keyboard * :ghissue:`5998`: use_dill does not work in Python 3.4 * :ghissue:`5964`: Traceback on Qt console exit * :ghissue:`5787`: Error in Notebook-Generated latex (nbconvert) * :ghissue:`5950`: qtconsole truncates help * :ghissue:`5943`: 2.x: notebook fails to load when using HTML comments * :ghissue:`5932`: Qt ImportDenier Does Not Adhere to PEP302 * :ghissue:`5898`: OSError when moving configuration file Issues closed in 2.1.0 ---------------------- GitHub stats for 2014/04/02 - 2014/05/21 (since 2.0.0) These lists are automatically generated, and may be incomplete or contain duplicates. The following 35 authors contributed 145 commits. * Adrian Price-Whelan * Aron Ahmadia * Benjamin Ragan-Kelley * Benjamin Schultz * Björn Linse * Blake Griffith * chebee7i * Damián Avila * Dav Clark * dexterdev * Erik Tollerud * Grzegorz Rożniecki * Jakob Gager * jdavidheiser * Jessica B. Hamrick * Jim Garrison * Jonathan Frederic * Matthias Bussonnier * Maximilian Albert * Mohan Raj Rajamanickam * ncornette * Nikolay Koldunov * Nile Geisinger * Pankaj Pandey * Paul Ivanov * Pierre Haessig * Raffaele De Feo * Renaud Richardet * Spencer Nelson * Steve Chan * sunny * Susan Tan * Thomas Kluyver * Yaroslav Halchenko * zah We closed a total of 129 issues, 92 pull requests and 37 regular issues; this is the full list (generated with the script :file:`tools/github_stats.py --milestone 2.1`): Pull Requests (92): * :ghpull:`5871`: specify encoding in msgpack.unpackb * :ghpull:`5869`: Catch more errors from clipboard access on Windows * :ghpull:`5866`: Make test robust against differences in line endings * :ghpull:`5605`: Two cell toolbar fixes. * :ghpull:`5843`: remove Firefox-specific CSS workaround * :ghpull:`5845`: Pass Windows interrupt event to kernels as an environment variable * :ghpull:`5835`: fix typo in v2 convert * :ghpull:`5841`: Fix writing history with output to a file in Python 2 * :ghpull:`5842`: fix typo in nbconvert help * :ghpull:`5846`: Fix typos in Cython example * :ghpull:`5839`: Close graphics dev in finally clause * :ghpull:`5837`: pass on install docs * :ghpull:`5832`: Fixed example to work with python3 * :ghpull:`5826`: allow notebook tour instantiation to fail * :ghpull:`5560`: Minor expansion of Cython example * :ghpull:`5818`: interpret any exception in getcallargs as not callable * :ghpull:`5816`: Add output to IPython directive when in verbatim mode. * :ghpull:`5822`: Don't overwrite widget description in interact * :ghpull:`5782`: Silence exception thrown by completer when dir() does not return a list * :ghpull:`5807`: Drop log level to info for Qt console shutdown * :ghpull:`5814`: Remove -i options from mv, rm and cp aliases * :ghpull:`5812`: Fix application name when printing subcommand help. * :ghpull:`5804`: remove an inappropriate ``!`` * :ghpull:`5805`: fix engine startup files * :ghpull:`5806`: Don't auto-move .config/ipython if symbolic link * :ghpull:`5716`: Add booktabs package to latex base.tplx * :ghpull:`5669`: allows threadsafe sys.stdout.flush from background threads * :ghpull:`5668`: allow async output on the most recent request * :ghpull:`5768`: fix cursor keys in long lines wrapped in markdown * :ghpull:`5788`: run cells with ``silent=True`` in ``%run nb.ipynb`` * :ghpull:`5715`: log all failed ajax API requests * :ghpull:`5769`: Don't urlescape the text that goes into a title tag * :ghpull:`5762`: Fix check for pickling closures * :ghpull:`5766`: View.map with empty sequence should return empty list * :ghpull:`5758`: Applied bug fix: using fc and ec did not properly set the figure canvas ... * :ghpull:`5754`: Format command name into subcommand_description at run time, not import * :ghpull:`5744`: Describe using PyPI/pip to distribute & install extensions * :ghpull:`5712`: monkeypatch inspect.findsource only when we use it * :ghpull:`5708`: create checkpoints dir in notebook subdirectories * :ghpull:`5714`: log error message when API requests fail * :ghpull:`5732`: Quick typo fix in nbformat/convert.py * :ghpull:`5713`: Fix a NameError in IPython.parallel * :ghpull:`5704`: Update nbconvertapp.py * :ghpull:`5534`: cleanup some ``pre`` css inheritance * :ghpull:`5699`: don't use common names in require decorators * :ghpull:`5692`: Update notebook.rst fixing broken reference to notebook examples readme * :ghpull:`5693`: Update parallel_intro.rst to fix a broken link to examples * :ghpull:`5486`: disambiguate to location when no IPs can be determined * :ghpull:`5574`: Remove the outdated keyboard shortcuts from notebook docs * :ghpull:`5568`: Use ``__qualname__`` in pretty reprs for Python 3 * :ghpull:`5678`: Fix copy & paste error in docstring of ImageWidget class * :ghpull:`5677`: Fix %bookmark -l for Python 3 * :ghpull:`5670`: nbconvert: Fix CWD imports * :ghpull:`5647`: Mention git hooks in install documentation * :ghpull:`5671`: Fix blank slides issue in Reveal slideshow pdf export * :ghpull:`5657`: use 'localhost' as default for the notebook server * :ghpull:`5584`: more semantic icons * :ghpull:`5594`: update components with marked-0.3.2 * :ghpull:`5500`: check for Python 3.2 * :ghpull:`5582`: reset readline after running PYTHONSTARTUP * :ghpull:`5630`: Fixed Issue :ghissue:`4012` Added Help menubar link to Github markdown doc * :ghpull:`5613`: Fixing bug :ghissue:`5607` * :ghpull:`5633`: Provide more help if lessc is not found. * :ghpull:`5620`: fixed a typo in IPython.core.formatters * :ghpull:`5619`: Fix typo in storemagic module docstring * :ghpull:`5592`: add missing ``browser`` to notebook_aliases list * :ghpull:`5506`: Fix ipconfig regex pattern * :ghpull:`5581`: Fix rmagic for cells ending in comment. * :ghpull:`5576`: only process cr if it's found * :ghpull:`5478`: Add git-hooks install script. Update README.md * :ghpull:`5546`: do not shutdown notebook if 'n' is part of answer * :ghpull:`5527`: Don't remove upload items from nav tree unless explicitly requested. * :ghpull:`5501`: remove inappropriate wheel tag override * :ghpull:`5548`: FileNotebookManager: Use shutil.move() instead of os.rename() * :ghpull:`5524`: never use ``for (var i in array)`` * :ghpull:`5459`: Fix interact animation page jump FF * :ghpull:`5559`: Minor typo fix in "Cython Magics.ipynb" * :ghpull:`5507`: Fix typo in interactive widgets examples index notebook * :ghpull:`5554`: Make HasTraits pickleable * :ghpull:`5535`: fix n^2 performance issue in coalesce_streams preprocessor * :ghpull:`5522`: fix iteration over Client * :ghpull:`5488`: Added missing require and jquery from cdn. * :ghpull:`5516`: ENH: list generated config files in generated, and rm them upon clean * :ghpull:`5493`: made a minor fix to one of the widget examples * :ghpull:`5512`: Update tooltips to refer to shift-tab * :ghpull:`5505`: Make backport_pr work on Python 3 * :ghpull:`5503`: check explicitly for 'dev' before adding the note to docs * :ghpull:`5498`: use milestones to indicate backport * :ghpull:`5492`: Polish whatsnew docs * :ghpull:`5495`: Fix various broken things in docs * :ghpull:`5496`: Exclude whatsnew/pr directory from docs builds * :ghpull:`5489`: Fix required Python versions Issues (37): * :ghissue:`5364`: Horizontal scrollbar hides cell's last line on Firefox * :ghissue:`5192`: horizontal scrollbar overlaps output or touches next cell * :ghissue:`5840`: Third-party Windows kernels don't get interrupt signal * :ghissue:`2412`: print history to file using qtconsole and notebook * :ghissue:`5703`: Notebook doesn't render with "ask me every time" cookie setting in Firefox * :ghissue:`5817`: calling mock object in IPython 2.0.0 under Python 3.4.0 raises AttributeError * :ghissue:`5499`: Error running widgets nbconvert example * :ghissue:`5654`: Broken links from ipython documentation * :ghissue:`5019`: print in QT event callback doesn't show up in ipython notebook. * :ghissue:`5800`: Only last In prompt number set ? * :ghissue:`5801`: startup_command specified in ipengine_config.py is not executed * :ghissue:`5690`: ipython 2.0.0 and pandoc 1.12.2.1 problem * :ghissue:`5408`: Add checking/flushing of background output from kernel in mainloop * :ghissue:`5407`: clearing message handlers on status=idle loses async output * :ghissue:`5467`: Incorrect behavior of up/down keyboard arrows in code cells on wrapped lines * :ghissue:`3085`: nicer notebook error message when lacking permissions * :ghissue:`5765`: map_sync over empty list raises IndexError * :ghissue:`5553`: Notebook matplotlib inline backend: can't set figure facecolor * :ghissue:`5710`: inspect.findsource monkeypatch raises wrong exception for C extensions * :ghissue:`5706`: Multi-Directory notebooks overwrite each other's checkpoints * :ghissue:`5698`: can't require a function named ``f`` * :ghissue:`5569`: Keyboard shortcuts in documentation are out of date * :ghissue:`5566`: Function name printing should use ``__qualname__`` instead of ``__name__`` (Python 3) * :ghissue:`5676`: "bookmark -l" not working in ipython 2.0 * :ghissue:`5555`: Differentiate more clearly between Notebooks and Folders in new UI * :ghissue:`5590`: Marked double escape * :ghissue:`5514`: import tab-complete fail with ipython 2.0 shell * :ghissue:`4012`: Notebook: link to markdown formatting reference * :ghissue:`5611`: Typo in 'storemagic' documentation * :ghissue:`5589`: Kernel start fails when using --browser argument * :ghissue:`5491`: Bug in Windows ipconfig ip address regular expression * :ghissue:`5579`: rmagic extension throws 'Error while parsing the string.' when last line is comment * :ghissue:`5518`: Ipython2 will not open ipynb in example directory * :ghissue:`5561`: New widget documentation has missing notebook link * :ghissue:`5128`: Page jumping when output from widget interaction replaced * :ghissue:`5519`: IPython.parallel.Client behavior as iterator * :ghissue:`5510`: Tab-completion for function argument list Issues closed in 2.0.0 ---------------------- GitHub stats for 2013/08/09 - 2014/04/01 (since 1.0.0) These lists are automatically generated, and may be incomplete or contain duplicates. The following 94 authors contributed 3949 commits. * Aaron Meurer * Abhinav Upadhyay * Adam Riggall * Alex Rudy * Andrew Mark * Angus Griffith * Antony Lee * Aron Ahmadia * Arun Persaud * Benjamin Ragan-Kelley * Bing Xia * Blake Griffith * Bouke van der Bijl * Bradley M. Froehle * Brian E. Granger * Carlos Cordoba * chapmanb * chebee7i * Christoph Gohlke * Christophe Pradal * Cyrille Rossant * Damián Avila * Daniel B. Vasquez * Dav Clark * David Hirschfeld * David P. Sanders * David Wyde * David Österberg * Doug Blank * Dražen Lučanin * epifanio * Fernando Perez * Gabriel Becker * Geert Barentsen * Hans Meine * Ingolf Becker * Jake Vanderplas * Jakob Gager * James Porter * Jason Grout * Jeffrey Tratner * Jonah Graham * Jonathan Frederic * Joris Van den Bossche * Juergen Hasch * Julian Taylor * Katie Silverio * Kevin Burke * Kieran O'Mahony * Konrad Hinsen * Kyle Kelley * Lawrence Fu * Marc Molla * Martín Gaitán * Matt Henderson * Matthew Brett * Matthias Bussonnier * Michael Droettboom * Mike McKerns * Nathan Goldbaum * Pablo de Oliveira * Pankaj Pandey * Pascal Schetelat * Paul Ivanov * Paul Moore * Pere Vilas * Peter Davis * Philippe Mallet-Ladeira * Preston Holmes * Puneeth Chaganti * Richard Everson * Roberto Bonvallet * Samuel Ainsworth * Sean Vig * Shashi Gowda * Skipper Seabold * Stephan Rave * Steve Fox * Steven Silvester * stonebig * Susan Tan * Sylvain Corlay * Takeshi Kanmae * Ted Drain * Thomas A Caswell * Thomas Kluyver * Théophile Studer * Volker Braun * Wieland Hoffmann * Yaroslav Halchenko * Yoval P. * Yung Siang Liau * Zachary Sailer * zah We closed a total of 1121 issues, 687 pull requests and 434 regular issues; this is the full list (generated with the script :file:`tools/github_stats.py`): Pull Requests (687): * :ghpull:`5487`: remove weird unicode space in the new copyright header * :ghpull:`5476`: For 2.0: Fix links in Notebook Help Menu * :ghpull:`5337`: Examples reorganization * :ghpull:`5436`: CodeMirror shortcuts in QuickHelp * :ghpull:`5444`: Fix numeric verification for Int and Float text widgets. * :ghpull:`5449`: Stretch keyboard shortcut dialog * :ghpull:`5473`: Minor corrections of git-hooks setup instructions * :ghpull:`5471`: Add coding magic comment to nbconvert Python template * :ghpull:`5452`: print_figure returns unicode for svg * :ghpull:`5450`: proposal: remove codename * :ghpull:`5462`: DOC : fixed minor error in using topological sort * :ghpull:`5463`: make spin_thread tests more forgiving of slow VMs * :ghpull:`5464`: Fix starting notebook server with file/directory at command line. * :ghpull:`5453`: remove gitwash * :ghpull:`5454`: Improve history API docs * :ghpull:`5431`: update github_stats and gh_api for 2.0 * :ghpull:`5290`: Add dual mode JS tests * :ghpull:`5451`: check that a handler is actually registered in ShortcutManager.handles * :ghpull:`5447`: Add %%python2 cell magic * :ghpull:`5439`: Point to the stable SymPy docs, not the dev docs * :ghpull:`5437`: Install jquery-ui images * :ghpull:`5434`: fix check for empty cells in rst template * :ghpull:`5432`: update links in notebook help menu * :ghpull:`5435`: Update whatsnew (notebook tour) * :ghpull:`5433`: Document extraction of octave and R magics * :ghpull:`5428`: Update COPYING.txt * :ghpull:`5426`: Separate get_session_info between HistoryAccessor and HistoryManager * :ghpull:`5419`: move prompts from margin to main column on small screens * :ghpull:`5430`: Make sure `element` is correct in the context of displayed JS * :ghpull:`5396`: prevent saving of partially loaded notebooks * :ghpull:`5429`: Fix tooltip pager feature * :ghpull:`5330`: Updates to shell reference doc * :ghpull:`5404`: Fix broken accordion widget * :ghpull:`5339`: Don't use fork to start the notebook in js tests * :ghpull:`5320`: Fix for Tooltip & completer click focus bug. * :ghpull:`5421`: Move configuration of Python test controllers into setup() * :ghpull:`5418`: fix typo in ssh launcher send_file * :ghpull:`5403`: remove alt-- shortcut * :ghpull:`5389`: better log message in deprecated files/ redirect * :ghpull:`5333`: Fix filenbmanager.list_dirs fails for Windows user profile directory * :ghpull:`5390`: finish PR #5333 * :ghpull:`5326`: Some gardening on iptest result reporting * :ghpull:`5375`: remove unnecessary onload hack from mathjax macro * :ghpull:`5368`: Flexbox classes specificity fixes * :ghpull:`5331`: fix raw_input CSS * :ghpull:`5395`: urlencode images for rst files * :ghpull:`5049`: update quickhelp on adding and removing shortcuts * :ghpull:`5391`: Fix Gecko (Netscape) keyboard handling * :ghpull:`5387`: Respect '\r' characters in nbconvert. * :ghpull:`5399`: Revert PR #5388 * :ghpull:`5388`: Suppress output even when a comment follows ;. Fixes #4525. * :ghpull:`5394`: nbconvert doc update * :ghpull:`5359`: do not install less sources * :ghpull:`5346`: give hint on where to find custom.js * :ghpull:`5357`: catch exception in copystat * :ghpull:`5380`: Remove DefineShortVerb... line from latex base template * :ghpull:`5376`: elide long containers in pretty * :ghpull:`5310`: remove raw cell placeholder on focus, closes #5238 * :ghpull:`5332`: semantic names for indicator icons * :ghpull:`5386`: Fix import of socketserver on Python 3 * :ghpull:`5360`: remove some redundant font-family: monospace * :ghpull:`5379`: don't instantiate Application just for default logger * :ghpull:`5372`: Don't autoclose strings * :ghpull:`5296`: unify keyboard shortcut and codemirror interaction * :ghpull:`5349`: Make Hub.registration_timeout configurable * :ghpull:`5340`: install bootstrap-tour css * :ghpull:`5335`: Update docstring for deepreload module * :ghpull:`5321`: Improve assignment regex to match more tuple unpacking syntax * :ghpull:`5325`: add NotebookNotary to NotebookApp's class list * :ghpull:`5313`: avoid loading preprocessors twice * :ghpull:`5308`: fix HTML capitalization in Highlight2HTML * :ghpull:`5295`: OutputArea.append_type functions are not prototype methods * :ghpull:`5318`: Fix local import of select_figure_formats * :ghpull:`5300`: Fix NameError: name '_rl' is not defined * :ghpull:`5292`: focus next cell on shift+enter * :ghpull:`5291`: debug occasional error in test_queue_status * :ghpull:`5289`: Finishing up #5274 (widget paths fixes) * :ghpull:`5232`: Make nbconvert html full output like notebook's html. * :ghpull:`5288`: Correct initial state of kernel status indicator * :ghpull:`5253`: display any output from this session in terminal console * :ghpull:`4802`: Tour of the notebook UI (was UI elements inline with highlighting) * :ghpull:`5285`: Update signature presentation in pinfo classes * :ghpull:`5268`: Refactoring Notebook.command_mode * :ghpull:`5226`: Don't run PYTHONSTARTUP file if a file or code is passed * :ghpull:`5283`: Remove Widget.closed attribute * :ghpull:`5279`: nbconvert: Make sure node is atleast version 0.9.12 * :ghpull:`5281`: fix a typo introduced by a rebased PR * :ghpull:`5280`: append Firefox overflow-x fix * :ghpull:`5277`: check that PIL can save JPEG to BytesIO * :ghpull:`5044`: Store timestamps for modules to autoreload * :ghpull:`5278`: Update whatsnew doc from pr files * :ghpull:`5276`: Fix kernel restart in case connection file is deleted. * :ghpull:`5272`: allow highlighting language to be set from notebook metadata * :ghpull:`5158`: log refusal to serve hidden directories * :ghpull:`5188`: New events system * :ghpull:`5265`: Missing class def for TimeoutError * :ghpull:`5267`: normalize unicode in notebook API tests * :ghpull:`5076`: Refactor keyboard handling * :ghpull:`5241`: Add some tests for utils * :ghpull:`5261`: Don't allow edit mode up arrow to continue past index == 0 * :ghpull:`5223`: use on-load event to trigger resizable images * :ghpull:`5252`: make one strptime call at import of jsonutil * :ghpull:`5153`: Dashboard sorting * :ghpull:`5169`: Allow custom header * :ghpull:`5242`: clear _reply_content cache before using it * :ghpull:`5194`: require latex titles to be ascii * :ghpull:`5244`: try to avoid EADDRINUSE errors on travis * :ghpull:`5245`: support extracted output in HTML template * :ghpull:`5209`: make input_area css generic to cells * :ghpull:`5246`: less %pylab, more cowbell! * :ghpull:`4895`: Improvements to %run completions * :ghpull:`5243`: Add JavaScript to base display priority list. * :ghpull:`5175`: Audit .html() calls take #2 * :ghpull:`5146`: Dual mode bug fixes. * :ghpull:`5207`: Children fire event * :ghpull:`5215`: Dashboard "Running" Tab * :ghpull:`5240`: Remove unused IPython.nbconvert.utils.console module * :ghpull:`5239`: Fix exclusion of tests directories from coverage reports * :ghpull:`5203`: capture some logging/warning output in some tests * :ghpull:`5216`: fixup positional arg handling in notebook app * :ghpull:`5229`: get _ipython_display_ method safely * :ghpull:`5234`: DOC : modified docs is HasTraits.traits and HasTraits.class_traits * :ghpull:`5221`: Change widget children List to Tuple. * :ghpull:`5231`: don't forget base_url when updating address bar in rename * :ghpull:`5173`: Moved widget files into static/widgets/* * :ghpull:`5222`: Unset PYTHONWARNINGS envvar before running subprocess tests. * :ghpull:`5172`: Prevent page breaks when printing notebooks via print-view. * :ghpull:`4985`: Add automatic Closebrackets function to Codemirror. * :ghpull:`5220`: Make traitlets notify check more robust against classes redefining equality and bool * :ghpull:`5197`: If there is an error comparing traitlet values when setting a trait, default to go ahead and notify of the new value. * :ghpull:`5210`: fix pyreadline import in rlineimpl * :ghpull:`5212`: Wrap nbconvert Markdown/Heading cells in live divs * :ghpull:`5200`: Allow to pass option to jinja env * :ghpull:`5202`: handle nodejs executable on debian * :ghpull:`5112`: band-aid for completion * :ghpull:`5187`: handle missing output metadata in nbconvert * :ghpull:`5181`: use gnureadline on OS X * :ghpull:`5136`: set default value from signature defaults in interact * :ghpull:`5132`: remove application/pdf->pdf transform in javascript * :ghpull:`5116`: reorganize who knows what about paths * :ghpull:`5165`: Don't introspect __call__ for simple callables * :ghpull:`5170`: Added msg_throttle sync=True widget traitlet * :ghpull:`5191`: Translate markdown link to rst * :ghpull:`5037`: FF Fix: alignment and scale of text widget * :ghpull:`5179`: remove websocket url * :ghpull:`5110`: add InlineBackend.print_figure_kwargs * :ghpull:`5147`: Some template URL changes * :ghpull:`5100`: remove base_kernel_url * :ghpull:`5163`: Simplify implementation of TemporaryWorkingDirectory. * :ghpull:`5166`: remove mktemp usage * :ghpull:`5133`: don't use combine option on ucs package * :ghpull:`5089`: Remove legacy azure nbmanager * :ghpull:`5159`: remove append_json reference * :ghpull:`5095`: handle image size metadata in nbconvert html * :ghpull:`5156`: fix IPython typo, closes #5155 * :ghpull:`5150`: fix a link that was broken * :ghpull:`5114`: use non-breaking space for button with no description * :ghpull:`4778`: add APIs for installing notebook extensions * :ghpull:`5125`: Fix the display of functions with keyword-only arguments on Python 3. * :ghpull:`5097`: minor notebook logging changes * :ghpull:`5047`: only validate package_data when it might be used * :ghpull:`5121`: fix remove event in KeyboardManager.register_events * :ghpull:`5119`: Removed 'list' view from Variable Inspector example * :ghpull:`4925`: Notebook manager api fixes * :ghpull:`4996`: require print_method to be a bound method * :ghpull:`5108`: require specifying the version for gh-pages * :ghpull:`5111`: Minor typo in docstring of IPython.parallel DirectView * :ghpull:`5098`: mostly debugging changes for IPython.parallel * :ghpull:`5087`: trust cells with no output * :ghpull:`5059`: Fix incorrect `Patch` logic in widget code * :ghpull:`5075`: More flexible box model fixes * :ghpull:`5091`: Provide logging messages in ipcluster log when engine or controllers fail to start * :ghpull:`5090`: Print a warning when iptest is run from the IPython source directory * :ghpull:`5077`: flush replies when entering an eventloop * :ghpull:`5055`: Minimal changes to import IPython from IronPython * :ghpull:`5078`: Updating JS tests README.md * :ghpull:`5083`: don't create js test directories unless they are being used * :ghpull:`5062`: adjust some events in nb_roundtrip * :ghpull:`5043`: various unicode / url fixes * :ghpull:`5066`: remove (almost) all mentions of pylab from our examples * :ghpull:`4977`: ensure scp destination directories exist (with mkdir -p) * :ghpull:`5053`: Move&rename JS tests * :ghpull:`5067`: show traceback in widget handlers * :ghpull:`4920`: Adding PDFFormatter and kernel side handling of PDF display data * :ghpull:`5048`: Add edit/command mode indicator * :ghpull:`5061`: make execute button in menu bar match shift-enter * :ghpull:`5052`: Add q to toggle the pager. * :ghpull:`5070`: fix flex: auto * :ghpull:`5065`: Add example of using annotations in interact * :ghpull:`5063`: another pass on Interact example notebooks * :ghpull:`5051`: FF Fix: code cell missing hscroll (2) * :ghpull:`4960`: Interact/Interactive for widget * :ghpull:`5045`: Clear timeout in multi-press keyboard shortcuts. * :ghpull:`5060`: Change 'bind' to 'link' * :ghpull:`5039`: Expose kernel_info method on inprocess kernel client * :ghpull:`5058`: Fix iopubwatcher.py example script. * :ghpull:`5035`: FF Fix: code cell missing hscroll * :ghpull:`5040`: Polishing some docs * :ghpull:`5001`: Add directory navigation to dashboard * :ghpull:`5042`: Remove duplicated Channel ABC classes. * :ghpull:`5036`: FF Fix: ext link icon same line as link text in help menu * :ghpull:`4975`: setup.py changes for 2.0 * :ghpull:`4774`: emit event on appended element on dom * :ghpull:`5023`: Widgets- add ability to pack and unpack arrays on JS side. * :ghpull:`5003`: Fix pretty reprs of super() objects * :ghpull:`4974`: make paste focus the pasted cell * :ghpull:`5012`: Make `SelectionWidget.values` a dict * :ghpull:`5018`: Prevent 'iptest IPython' from trying to run. * :ghpull:`5025`: citation2latex filter (using HTMLParser) * :ghpull:`5027`: pin lessc to 1.4 * :ghpull:`4952`: Widget test inconsistencies * :ghpull:`5014`: Fix command mode & popup view bug * :ghpull:`4842`: more subtle kernel indicator * :ghpull:`5017`: Add notebook examples link to help menu. * :ghpull:`5015`: don't write cell.trusted to disk * :ghpull:`5007`: Update whatsnew doc from PR files * :ghpull:`5010`: Fixes for widget alignment in FF * :ghpull:`4901`: Add a convenience class to sync traitlet attributes * :ghpull:`5008`: updated explanation of 'pyin' messages * :ghpull:`5004`: Fix widget vslider spacing * :ghpull:`4933`: Small Widget inconsistency fixes * :ghpull:`4979`: add versioning notes to small message spec changes * :ghpull:`4893`: add font-awesome 3.2.1 * :ghpull:`4982`: Live readout for slider widgets * :ghpull:`4813`: make help menu a template * :ghpull:`4939`: Embed qtconsole docs (continued) * :ghpull:`4964`: remove shift-= merge keyboard shortcut * :ghpull:`4504`: Allow input transformers to raise SyntaxError * :ghpull:`4929`: Fixing various modal/focus related bugs * :ghpull:`4971`: Fixing issues with js tests * :ghpull:`4972`: Work around problem in doctest discovery in Python 3.4 with PyQt * :ghpull:`4937`: pickle arrays with dtype=object * :ghpull:`4934`: `ipython profile create` respects `--ipython-dir` * :ghpull:`4954`: generate unicode filename * :ghpull:`4845`: Add Origin Checking. * :ghpull:`4916`: Fine tuning the behavior of the modal UI * :ghpull:`4966`: Ignore sys.argv for NotebookNotary in tests * :ghpull:`4967`: Fix typo in warning about web socket being closed * :ghpull:`4965`: Remove mention of iplogger from setup.py * :ghpull:`4962`: Fixed typos in quick-help text * :ghpull:`4953`: add utils.wait_for_idle in js tests * :ghpull:`4870`: ipython_directive, report except/warn in block and add :okexcept: :okwarning: options to suppress * :ghpull:`4662`: Menu cleanup * :ghpull:`4824`: sign notebooks * :ghpull:`4943`: Docs shotgun 4 * :ghpull:`4848`: avoid import of nearby temporary with %edit * :ghpull:`4950`: Two fixes for file upload related bugs * :ghpull:`4927`: there shouldn't be a 'files/' prefix in FileLink[s] * :ghpull:`4928`: use importlib.machinery when available * :ghpull:`4949`: Remove the docscrape modules, which are part of numpydoc * :ghpull:`4849`: Various unicode fixes (mostly on Windows) * :ghpull:`4932`: always point py3compat.input to builtin_mod.input * :ghpull:`4807`: Correct handling of ansi colour codes when nbconverting to latex * :ghpull:`4922`: Python nbconvert output shouldn't have output * :ghpull:`4912`: Skip some Windows io failures * :ghpull:`4919`: flush output before showing tracebacks * :ghpull:`4915`: ZMQCompleter inherits from IPCompleter * :ghpull:`4890`: better cleanup channel FDs * :ghpull:`4880`: set profile name from profile_dir * :ghpull:`4853`: fix setting image height/width from metadata * :ghpull:`4786`: Reduce spacing of heading cells * :ghpull:`4680`: Minimal pandoc version warning * :ghpull:`4908`: detect builtin docstrings in oinspect * :ghpull:`4911`: Don't use `python -m package` on Windows Python 2 * :ghpull:`4909`: sort dictionary keys before comparison, ordering is not guaranteed * :ghpull:`4374`: IPEP 23: Backbone.js Widgets * :ghpull:`4903`: use https for all embeds * :ghpull:`4894`: Shortcut changes * :ghpull:`4897`: More detailed documentation about kernel_cmd * :ghpull:`4891`: Squash a few Sphinx warnings from nbconvert.utils.lexers docstrings * :ghpull:`4679`: JPG compression for inline pylab * :ghpull:`4708`: Fix indent and center * :ghpull:`4789`: fix IPython.embed * :ghpull:`4655`: prefer marked to pandoc for markdown2html * :ghpull:`4876`: don't show tooltip if object is not found * :ghpull:`4873`: use 'combine' option to ucs package * :ghpull:`4732`: Accents in notebook names and in command-line (nbconvert) * :ghpull:`4867`: Update URL for Lawrence Hall of Science webcam image * :ghpull:`4868`: Static path fixes * :ghpull:`4858`: fix tb_offset when running a file * :ghpull:`4826`: some $.html( -> $.text( * :ghpull:`4847`: add js kernel_info request * :ghpull:`4832`: allow NotImplementedError in formatters * :ghpull:`4803`: BUG: fix cython magic support in ipython_directive * :ghpull:`4865`: `build` listed twice in .gitignore. Removing one. * :ghpull:`4851`: fix tooltip token regex for single-character names * :ghpull:`4846`: Remove some leftover traces of irunner * :ghpull:`4820`: fix regex for cleaning old logs with ipcluster * :ghpull:`4844`: adjustments to notebook app logging * :ghpull:`4840`: Error in Session.send_raw() * :ghpull:`4819`: update CodeMirror to 3.21 * :ghpull:`4823`: Minor fixes for typos/inconsistencies in parallel docs * :ghpull:`4811`: document code mirror tab and shift-tab * :ghpull:`4795`: merge reveal templates * :ghpull:`4796`: update components * :ghpull:`4806`: Correct order of packages for unicode in nbconvert to LaTeX * :ghpull:`4800`: Qt frontend: Handle 'aborted' prompt replies. * :ghpull:`4794`: Compatibility fix for Python3 (Issue #4783 ) * :ghpull:`4799`: minor js test fix * :ghpull:`4788`: warn when notebook is started in pylab mode * :ghpull:`4772`: Notebook server info files * :ghpull:`4797`: be conservative about kernel_info implementation * :ghpull:`4787`: non-python kernels run python code with qtconsole * :ghpull:`4565`: various display type validations * :ghpull:`4703`: Math macro in jinja templates. * :ghpull:`4781`: Fix "Source" text for the "Other Syntax" section of the "Typesetting Math" notebook * :ghpull:`4776`: Manually document py3compat module. * :ghpull:`4533`: propagate display metadata to all mimetypes * :ghpull:`4785`: Replacing a for-in loop by an index loop on an array * :ghpull:`4780`: Updating CSS for UI example. * :ghpull:`3605`: Modal UI * :ghpull:`4758`: Python 3.4 fixes * :ghpull:`4735`: add some HTML error pages * :ghpull:`4775`: Update whatsnew doc from PR files * :ghpull:`4760`: Make examples and docs more Python 3 aware * :ghpull:`4773`: Don't wait forever for notebook server to launch/die for tests * :ghpull:`4768`: Qt console: Fix _prompt_pos accounting on timer flush output. * :ghpull:`4727`: Remove Nbconvert template loading magic * :ghpull:`4763`: Set numpydoc options to produce fewer Sphinx warnings. * :ghpull:`4770`: always define aliases, even if empty * :ghpull:`4766`: add `python -m` entry points for everything * :ghpull:`4767`: remove manpages for irunner, iplogger * :ghpull:`4751`: Added --post-serve explanation into the nbconvert docs. * :ghpull:`4762`: whitelist alphanumeric characters for cookie_name * :ghpull:`4625`: Deprecate %profile magic * :ghpull:`4745`: warn on failed formatter calls * :ghpull:`4746`: remove redundant cls alias on Windows * :ghpull:`4749`: Fix bug in determination of public ips. * :ghpull:`4715`: restore use of tornado static_url in templates * :ghpull:`4748`: fix race condition in profiledir creation. * :ghpull:`4720`: never use ssh multiplexer in tunnels * :ghpull:`4658`: Bug fix for #4643: Regex object needs to be reset between calls in toolt... * :ghpull:`4561`: Add Formatter.pop(type) * :ghpull:`4712`: Docs shotgun 3 * :ghpull:`4713`: Fix saving kernel history in Python 2 * :ghpull:`4744`: don't use lazily-evaluated rc.ids in wait_for_idle * :ghpull:`4740`: %env can't set variables * :ghpull:`4737`: check every link when detecting virtualenv * :ghpull:`4738`: don't inject help into user_ns * :ghpull:`4739`: skip html nbconvert tests when their dependencies are missing * :ghpull:`4730`: Fix stripping continuation prompts when copying from Qt console * :ghpull:`4725`: Doc fixes * :ghpull:`4656`: Nbconvert HTTP service * :ghpull:`4710`: make @interactive decorator friendlier with dill * :ghpull:`4722`: allow purging local results as long as they are not outstanding * :ghpull:`4549`: Updated IPython console lexers. * :ghpull:`4570`: Update IPython directive * :ghpull:`4719`: Fix comment typo in prefilter.py * :ghpull:`4575`: make sure to encode URL components for API requests * :ghpull:`4718`: Fixed typo in displaypub * :ghpull:`4716`: Remove input_prefilter hook * :ghpull:`4691`: survive failure to bind to localhost in zmq.iostream * :ghpull:`4696`: don't do anything if add_anchor fails * :ghpull:`4711`: some typos in the docs * :ghpull:`4700`: use if main block in entry points * :ghpull:`4692`: setup.py symlink improvements * :ghpull:`4265`: JSON configuration file * :ghpull:`4505`: Nbconvert latex markdown images2 * :ghpull:`4608`: transparent background match ... all colors * :ghpull:`4678`: allow ipython console to handle text/plain display * :ghpull:`4706`: remove irunner, iplogger * :ghpull:`4701`: Delete an old dictionary available for selecting the aligment of text. * :ghpull:`4702`: Making reveal font-size a relative unit. * :ghpull:`4649`: added a quiet option to %cpaste to suppress output * :ghpull:`4690`: Option to spew subprocess streams during tests * :ghpull:`4688`: Fixed various typos in docstrings. * :ghpull:`4645`: CasperJs utility functions. * :ghpull:`4670`: Stop bundling the numpydoc Sphinx extension * :ghpull:`4675`: common IPython prefix for ModIndex * :ghpull:`4672`: Remove unused 'attic' module * :ghpull:`4671`: Fix docstrings in utils.text * :ghpull:`4669`: add missing help strings to HistoryManager configurables * :ghpull:`4668`: Make non-ASCII docstring unicode * :ghpull:`4650`: added a note about sharing of nbconvert templates * :ghpull:`4646`: Fixing various output related things: * :ghpull:`4665`: check for libedit in readline on OS X * :ghpull:`4606`: Make running PYTHONSTARTUP optional * :ghpull:`4654`: Fixing left padding of text cells to match that of code cells. * :ghpull:`4306`: add raw_mimetype metadata to raw cells * :ghpull:`4576`: Tighten up the vertical spacing on cells and make the padding of cells more consistent * :ghpull:`4353`: Don't reset the readline completer after each prompt * :ghpull:`4567`: Adding prompt area to non-CodeCells to indent content. * :ghpull:`4446`: Use SVG plots in OctaveMagic by default due to lack of Ghostscript on Windows Octave * :ghpull:`4613`: remove configurable.created * :ghpull:`4631`: Use argument lists for command help tests * :ghpull:`4633`: Modifies test_get_long_path_name_winr32() to allow for long path names in temp dir * :ghpull:`4642`: Allow docs to build without PyQt installed. * :ghpull:`4641`: Don't check for wx in the test suite. * :ghpull:`4622`: make QtConsole Lexer configurable * :ghpull:`4594`: Fixed #2923 Move Save Away from Cut in toolbar * :ghpull:`4593`: don't interfere with set_next_input contents in qtconsole * :ghpull:`4640`: Support matplotlib's Gtk3 backend in --pylab mode * :ghpull:`4639`: Minor import fix to get qtconsole with --pylab=qt working * :ghpull:`4637`: Fixed typo in links.txt. * :ghpull:`4634`: Fix nbrun in notebooks with non-code cells. * :ghpull:`4632`: Restore the ability to run tests from a function. * :ghpull:`4624`: Fix crash when $EDITOR is non-ASCII * :ghpull:`4453`: Play nice with App Nap * :ghpull:`4541`: relax ipconfig matching on Windows * :ghpull:`4552`: add pickleutil.use_dill * :ghpull:`4590`: Font awesome for IPython slides * :ghpull:`4589`: Inherit the width of pre code inside the input code cells. * :ghpull:`4588`: Update reveal.js CDN to 2.5.0. * :ghpull:`4569`: store cell toolbar preset in notebook metadata * :ghpull:`4609`: Fix bytes regex for Python 3. * :ghpull:`4581`: Writing unicode to stdout * :ghpull:`4591`: Documenting codemirror shorcuts. * :ghpull:`4607`: Tutorial doc should link to user config intro * :ghpull:`4601`: test that rename fails with 409 if it would clobber * :ghpull:`4599`: re-cast int/float subclasses to int/float in json_clean * :ghpull:`4542`: new `ipython history clear` subcommand * :ghpull:`4568`: don't use lazily-evaluated rc.ids in wait_for_idle * :ghpull:`4572`: DOC: %profile docstring should reference %prun * :ghpull:`4571`: no longer need 3 suffix on travis, tox * :ghpull:`4566`: Fixing cell_type in CodeCell constructor. * :ghpull:`4563`: Specify encoding for reading notebook file. * :ghpull:`4452`: support notebooks in %run * :ghpull:`4546`: fix warning condition on notebook startup * :ghpull:`4540`: Apidocs3 * :ghpull:`4553`: Fix Python 3 handling of urllib * :ghpull:`4543`: make hiding of initial namespace optional * :ghpull:`4517`: send shutdown_request on exit of `ipython console` * :ghpull:`4528`: improvements to bash completion * :ghpull:`4532`: Hide dynamically defined metaclass base from Sphinx. * :ghpull:`4515`: Spring Cleaning, and Load speedup * :ghpull:`4529`: note routing identities needed for input requests * :ghpull:`4514`: allow restart in `%run -d` * :ghpull:`4527`: add redirect for 1.0-style 'files/' prefix links * :ghpull:`4526`: Allow unicode arguments to passwd_check on Python 2 * :ghpull:`4403`: Global highlight language selection. * :ghpull:`4250`: outputarea.js: Wrap inline SVGs inside an iframe * :ghpull:`4521`: Read wav files in binary mode * :ghpull:`4444`: Css cleaning * :ghpull:`4523`: Use username and password for MongoDB on ShiningPanda * :ghpull:`4510`: Update whatsnew from PR files * :ghpull:`4441`: add ``setup.py jsversion`` * :ghpull:`4518`: Fix for race condition in url file decoding. * :ghpull:`4497`: don't automatically unpack datetime objects in the message spec * :ghpull:`4506`: wait for empty queues as well as load-balanced tasks * :ghpull:`4492`: Configuration docs refresh * :ghpull:`4508`: Fix some uses of map() in Qt console completion code. * :ghpull:`4498`: Daemon StreamCapturer * :ghpull:`4499`: Skip clipboard test on unix systems if headless. * :ghpull:`4460`: Better clipboard handling, esp. with pywin32 * :ghpull:`4496`: Pass nbformat object to write call to save .py script * :ghpull:`4466`: various pandoc latex fixes * :ghpull:`4473`: Setup for Python 2/3 * :ghpull:`4459`: protect against broken repr in lib.pretty * :ghpull:`4457`: Use ~/.ipython as default config directory * :ghpull:`4489`: check realpath of env in init_virtualenv * :ghpull:`4490`: fix possible race condition in test_await_data * :ghpull:`4476`: Fix: Remove space added by display(JavaScript) on page reload * :ghpull:`4398`: [Notebook] Deactivate tooltip on tab by default. * :ghpull:`4480`: Docs shotgun 2 * :ghpull:`4488`: fix typo in message spec doc * :ghpull:`4479`: yet another JS race condition fix * :ghpull:`4477`: Allow incremental builds of the html_noapi docs target * :ghpull:`4470`: Various Config object cleanups * :ghpull:`4410`: make close-and-halt work on new tabs in Chrome * :ghpull:`4469`: Python 3 & getcwdu * :ghpull:`4451`: fix: allow JS test to run after shutdown test * :ghpull:`4456`: Simplify StreamCapturer for subprocess testing * :ghpull:`4464`: Correct description for Bytes traitlet type * :ghpull:`4465`: Clean up MANIFEST.in * :ghpull:`4461`: Correct TypeError message in svg2pdf * :ghpull:`4458`: use signalstatus if exit status is undefined * :ghpull:`4438`: Single codebase Python 3 support (again) * :ghpull:`4198`: Version conversion, support for X to Y even if Y < X (nbformat) * :ghpull:`4415`: More tooltips in the Notebook menu * :ghpull:`4450`: remove monkey patch for older versions of tornado * :ghpull:`4423`: Fix progress bar and scrolling bug. * :ghpull:`4435`: raise 404 on not found static file * :ghpull:`4442`: fix and add shim for change introduce by #4195 * :ghpull:`4436`: allow `require("nbextensions/extname")` to load from IPYTHONDIR/nbextensions * :ghpull:`4437`: don't compute etags in static file handlers * :ghpull:`4427`: notebooks should always have one checkpoint * :ghpull:`4425`: fix js pythonisme * :ghpull:`4195`: IPEP 21: widget messages * :ghpull:`4434`: Fix broken link for Dive Into Python. * :ghpull:`4428`: bump minimum tornado version to 3.1.0 * :ghpull:`4302`: Add an Audio display class * :ghpull:`4285`: Notebook javascript test suite using CasperJS * :ghpull:`4420`: Allow checking for backports via milestone * :ghpull:`4426`: set kernel cwd to notebook's directory * :ghpull:`4389`: By default, Magics inherit from Configurable * :ghpull:`4393`: Capture output from subprocs during test, and display on failure * :ghpull:`4419`: define InlineBackend configurable in its own file * :ghpull:`4303`: Multidirectory support for the Notebook * :ghpull:`4371`: Restored ipython profile locate dir and fixed typo. (Fixes #3708). * :ghpull:`4414`: Specify unicode type properly in rmagic * :ghpull:`4413`: don't instantiate IPython shell as class attr * :ghpull:`4400`: Remove 5s wait on inactivity on GUI inputhook loops * :ghpull:`4412`: Fix traitlet _notify_trait by-ref issue * :ghpull:`4378`: split adds new cell above, rather than below * :ghpull:`4405`: Bring display of builtin types and functions in line with Py 2 * :ghpull:`4367`: clean up of documentation files * :ghpull:`4401`: Provide a name of the HistorySavingThread * :ghpull:`4384`: fix menubar height measurement * :ghpull:`4377`: fix tooltip cancel * :ghpull:`4293`: Factorise code in tooltip for julia monkeypatching * :ghpull:`4292`: improve js-completer logic. * :ghpull:`4363`: set_next_input: keep only last input when repeatedly called in a single cell * :ghpull:`4382`: Use safe_hasattr in dir2 * :ghpull:`4379`: fix (CTRL-M -) shortcut for splitting cell in FF * :ghpull:`4380`: Test and fixes for localinterfaces * :ghpull:`4372`: Don't assume that SyntaxTB is always called with a SyntaxError * :ghpull:`4342`: Return value directly from the try block and avoid a variable * :ghpull:`4154`: Center LaTeX and figures in markdown * :ghpull:`4311`: %load -s to load specific functions or classes * :ghpull:`4350`: WinHPC launcher fixes * :ghpull:`4345`: Make irunner compatible with upcoming pexpect 3.0 interface * :ghpull:`4276`: Support container methods in config * :ghpull:`4359`: test_pylabtools also needs to modify matplotlib.rcParamsOrig * :ghpull:`4355`: remove hardcoded box-orient * :ghpull:`4333`: Add Edit Notebook Metadata to Edit menu * :ghpull:`4349`: Script to update What's New file * :ghpull:`4348`: Call PDF viewer after latex compiling (nbconvert) * :ghpull:`4346`: getpass() on Windows & Python 2 needs bytes prompt * :ghpull:`4304`: use netifaces for faster IPython.utils.localinterfaces * :ghpull:`4305`: Add even more ways to populate localinterfaces * :ghpull:`4313`: remove strip_math_space * :ghpull:`4325`: Some changes to improve readability. * :ghpull:`4281`: Adjust tab completion widget if too close to bottom of page. * :ghpull:`4347`: Remove pycolor script * :ghpull:`4322`: Scroll to the top after change of slides in the IPython slides * :ghpull:`4289`: Fix scrolling output (not working post clear_output changes) * :ghpull:`4343`: Make parameters for kernel start method more general * :ghpull:`4237`: Keywords should shadow magic functions * :ghpull:`4338`: adjust default value of level in sync_imports * :ghpull:`4328`: Remove unused loop variable. * :ghpull:`4340`: fix mathjax download url to new GitHub format * :ghpull:`4336`: use simple replacement rather than string formatting in format_kernel_cmd * :ghpull:`4264`: catch unicode error listing profiles * :ghpull:`4314`: catch EACCES when binding notebook app * :ghpull:`4324`: Remove commented addthis toolbar * :ghpull:`4327`: Use the with statement to open a file. * :ghpull:`4318`: fix initial sys.path * :ghpull:`4315`: Explicitly state what version of Pandoc is supported in docs/install * :ghpull:`4316`: underscore missing on notebook_p4 * :ghpull:`4295`: Implement boundary option for load magic (#1093) * :ghpull:`4300`: traits defauts are strings not object * :ghpull:`4297`: Remove an unreachable return statement. * :ghpull:`4260`: Use subprocess for system_raw * :ghpull:`4277`: add nbextensions * :ghpull:`4294`: don't require tornado 3 in `--post serve` * :ghpull:`4270`: adjust Scheduler timeout logic * :ghpull:`4278`: add `-a` to easy_install command in libedit warning * :ghpull:`4282`: Enable automatic line breaks in MathJax. * :ghpull:`4279`: Fixing line-height of list items in tree view. * :ghpull:`4253`: fixes #4039. * :ghpull:`4131`: Add module's name argument in %%cython magic * :ghpull:`4269`: Add mathletters option and longtable package to latex_base.tplx * :ghpull:`4230`: Switch correctly to the user's default matplotlib backend after inline. * :ghpull:`4271`: Hopefully fix ordering of output on ShiningPanda * :ghpull:`4239`: more informative error message for bad serialization * :ghpull:`4263`: Fix excludes for IPython.testing * :ghpull:`4112`: nbconvert: Latex template refactor * :ghpull:`4261`: Fixing a formatting error in the custom display example notebook. * :ghpull:`4259`: Fix Windows test exclusions * :ghpull:`4229`: Clear_output: Animation & widget related changes. * :ghpull:`4151`: Refactor alias machinery * :ghpull:`4153`: make timeit return an object that contains values * :ghpull:`4258`: to-backport label is now 1.2 * :ghpull:`4242`: Allow passing extra arguments to iptest through for nose * :ghpull:`4257`: fix unicode argv parsing * :ghpull:`4166`: avoid executing code in utils.localinterfaces at import time * :ghpull:`4214`: engine ID metadata should be unicode, not bytes * :ghpull:`4232`: no highlight if no language specified * :ghpull:`4218`: Fix display of SyntaxError when .py file is modified * :ghpull:`4207`: add ``setup.py css`` command * :ghpull:`4224`: clear previous callbacks on execute * :ghpull:`4180`: Iptest refactoring * :ghpull:`4105`: JS output area misaligned * :ghpull:`4220`: Various improvements to docs formatting * :ghpull:`4187`: Select adequate highlighter for cell magic languages * :ghpull:`4228`: update -dev docs to reflect latest stable version * :ghpull:`4219`: Drop bundled argparse * :ghpull:`3851`: Adds an explicit newline for pretty-printing. * :ghpull:`3622`: Drop fakemodule * :ghpull:`4080`: change default behavior of database task storage * :ghpull:`4197`: enable cython highlight in notebook * :ghpull:`4225`: Updated docstring for core.display.Image * :ghpull:`4175`: nbconvert: Jinjaless exporter base * :ghpull:`4208`: Added a lightweight "htmlcore" Makefile entry * :ghpull:`4209`: Magic doc fixes * :ghpull:`4217`: avoid importing numpy at the module level * :ghpull:`4213`: fixed dead link in examples/notebooks readme to Part 3 * :ghpull:`4183`: ESC should be handled by CM if tooltip is not on * :ghpull:`4193`: Update for #3549: Append Firefox overflow-x fix * :ghpull:`4205`: use TextIOWrapper when communicating with pandoc subprocess * :ghpull:`4204`: remove some extraneous print statements from IPython.parallel * :ghpull:`4201`: HeadingCells cannot be split or merged * :ghpull:`4048`: finish up speaker-notes PR * :ghpull:`4079`: trigger `Kernel.status_started` after websockets open * :ghpull:`4186`: moved DummyMod to proper namespace to enable dill pickling * :ghpull:`4190`: update version-check message in setup.py and IPython.__init__ * :ghpull:`4188`: Allow user_ns trait to be None * :ghpull:`4189`: always fire LOCAL_IPS.extend(PUBLIC_IPS) * :ghpull:`4174`: various issues in markdown and rst templates * :ghpull:`4178`: add missing data_javascript * :ghpull:`4168`: Py3 failing tests * :ghpull:`4181`: nbconvert: Fix, sphinx template not removing new lines from headers * :ghpull:`4043`: don't 'restore_bytes' in from_JSON * :ghpull:`4149`: reuse more kernels in kernel tests * :ghpull:`4163`: Fix for incorrect default encoding on Windows. * :ghpull:`4136`: catch javascript errors in any output * :ghpull:`4171`: add nbconvert config file when creating profiles * :ghpull:`4172`: add ability to check what PRs should be backported in backport_pr * :ghpull:`4167`: --fast flag for test suite! * :ghpull:`4125`: Basic exercise of `ipython [subcommand] -h` and help-all * :ghpull:`4085`: nbconvert: Fix sphinx preprocessor date format string for Windows * :ghpull:`4159`: don't split `.cell` and `div.cell` CSS * :ghpull:`4165`: Remove use of parametric tests * :ghpull:`4158`: generate choices for `--gui` configurable from real mapping * :ghpull:`4083`: Implement a better check for hidden values for %who etc. * :ghpull:`4147`: Reference notebook examples, fixes #4146. * :ghpull:`4065`: do not include specific css in embedable one * :ghpull:`4092`: nbconvert: Fix for unicode html headers, Windows + Python 2.x * :ghpull:`4074`: close Client sockets if connection fails * :ghpull:`4064`: Store default codemirror mode in only 1 place * :ghpull:`4104`: Add way to install MathJax to a particular profile * :ghpull:`4161`: Select name when renaming a notebook * :ghpull:`4160`: Add quotes around ".[notebook]" in readme * :ghpull:`4144`: help_end transformer shouldn't pick up ? in multiline string * :ghpull:`4090`: Add LaTeX citation handling to nbconvert * :ghpull:`4143`: update example custom.js * :ghpull:`4142`: DOC: unwrap openssl line in public_server doc * :ghpull:`4126`: update tox.ini * :ghpull:`4141`: add files with a separate `add` call in backport_pr * :ghpull:`4137`: Restore autorestore option for storemagic * :ghpull:`4098`: pass profile-dir instead of profile name to Kernel * :ghpull:`4120`: support `input` in Python 2 kernels * :ghpull:`4088`: nbconvert: Fix coalescestreams line with incorrect nesting causing strange behavior * :ghpull:`4060`: only strip continuation prompts if regular prompts seen first * :ghpull:`4132`: Fixed name error bug in function safe_unicode in module py3compat. * :ghpull:`4121`: move test_kernel from IPython.zmq to IPython.kernel * :ghpull:`4118`: ZMQ heartbeat channel: catch EINTR exceptions and continue. * :ghpull:`4070`: New changes should go into pr/ folder * :ghpull:`4054`: use unicode for HTML export * :ghpull:`4106`: fix a couple of default block values * :ghpull:`4107`: update parallel magic tests with capture_output API * :ghpull:`4102`: Fix clashes between debugger tests and coverage.py * :ghpull:`4115`: Update docs on declaring a magic function * :ghpull:`4101`: restore accidentally removed EngineError * :ghpull:`4096`: minor docs changes * :ghpull:`4094`: Update target branch before backporting PR * :ghpull:`4069`: Drop monkeypatch for pre-1.0 nose * :ghpull:`4056`: respect `pylab_import_all` when `--pylab` specified at the command-line * :ghpull:`4091`: Make Qt console banner configurable * :ghpull:`4086`: fix missing errno import * :ghpull:`4084`: Use msvcrt.getwch() for Windows pager. * :ghpull:`4073`: rename ``post_processors`` submodule to ``postprocessors`` * :ghpull:`4075`: Update supported Python versions in tools/test_pr * :ghpull:`4068`: minor bug fix, define 'cell' in dialog.js. * :ghpull:`4044`: rename call methods to transform and postprocess * :ghpull:`3744`: capture rich output as well as stdout/err in capture_output * :ghpull:`3969`: "use strict" in most (if not all) our javascript * :ghpull:`4030`: exclude `.git` in MANIFEST.in * :ghpull:`4047`: Use istype() when checking if canned object is a dict * :ghpull:`4031`: don't close_fds on Windows * :ghpull:`4029`: bson.Binary moved * :ghpull:`3883`: skip test on unix when x11 not available * :ghpull:`3863`: Added working speaker notes for slides. * :ghpull:`4035`: Fixed custom jinja2 templates being ignored when setting template_path * :ghpull:`4002`: Drop Python 2.6 and 3.2 * :ghpull:`4026`: small doc fix in nbconvert * :ghpull:`4016`: Fix IPython.start_* functions * :ghpull:`4021`: Fix parallel.client.View map() on numpy arrays * :ghpull:`4022`: DOC: fix links to matplotlib, notebook docs * :ghpull:`4018`: Fix warning when running IPython.kernel tests * :ghpull:`4017`: Add REPL-like printing of final/return value to %%R cell magic * :ghpull:`4019`: Test skipping without unicode paths * :ghpull:`4008`: Transform code before %prun/%%prun runs * :ghpull:`4014`: Fix typo in ipapp * :ghpull:`3997`: DOC: typos + rewording in examples/notebooks/Cell Magics.ipynb * :ghpull:`3914`: nbconvert: Transformer tests * :ghpull:`3987`: get files list in backport_pr * :ghpull:`3923`: nbconvert: Writer tests * :ghpull:`3974`: nbconvert: Fix app tests on Window7 w/ Python 3.3 * :ghpull:`3937`: make tab visible in codemirror and light red background * :ghpull:`3933`: nbconvert: Post-processor tests * :ghpull:`3978`: fix `--existing` with non-localhost IP * :ghpull:`3939`: minor checkpoint cleanup * :ghpull:`3955`: complete on % for magic in notebook * :ghpull:`3981`: BF: fix nbconert rst input prompt spacing * :ghpull:`3960`: Don't make sphinx a dependency for importing nbconvert * :ghpull:`3973`: logging.Formatter is not new-style in 2.6 Issues (434): * :ghissue:`5476`: For 2.0: Fix links in Notebook Help Menu * :ghissue:`5337`: Examples reorganization * :ghissue:`5436`: CodeMirror shortcuts in QuickHelp * :ghissue:`5444`: Fix numeric verification for Int and Float text widgets. * :ghissue:`5443`: Int and Float Widgets don't allow negative signs * :ghissue:`5449`: Stretch keyboard shortcut dialog * :ghissue:`5471`: Add coding magic comment to nbconvert Python template * :ghissue:`5470`: UTF-8 Issue When Converting Notebook to a Script. * :ghissue:`5369`: FormatterWarning for SVG matplotlib output in notebook * :ghissue:`5460`: Can't start the notebook server specifying a notebook * :ghissue:`2918`: CodeMirror related issues. * :ghissue:`5431`: update github_stats and gh_api for 2.0 * :ghissue:`4887`: Add tests for modal UI * :ghissue:`5290`: Add dual mode JS tests * :ghissue:`5448`: Cmd+/ shortcut doesn't work in IPython master * :ghissue:`5447`: Add %%python2 cell magic * :ghissue:`5442`: Make a "python2" alias or rename the "python"cell magic. * :ghissue:`2495`: non-ascii characters in the path * :ghissue:`4554`: dictDB: Exception due to str to datetime comparission * :ghissue:`5006`: Comm code is not run in the same context as notebook code * :ghissue:`5118`: Weird interact behavior * :ghissue:`5401`: Empty code cells in nbconvert rst output cause problems * :ghissue:`5434`: fix check for empty cells in rst template * :ghissue:`4944`: Trouble finding ipynb path in Windows 8 * :ghissue:`4605`: Change the url of Editor Shorcuts in the notebook menu. * :ghissue:`5425`: Update COPYING.txt * :ghissue:`5348`: BUG: HistoryAccessor.get_session_info(0) - exception * :ghissue:`5293`: Javascript("element.append()") looks broken. * :ghissue:`5363`: Disable saving if notebook has stopped loading * :ghissue:`5189`: Tooltip pager mode is broken * :ghissue:`5330`: Updates to shell reference doc * :ghissue:`5397`: Accordion widget broken * :ghissue:`5106`: Flexbox CSS specificity bugs * :ghissue:`5297`: tooltip triggers focus bug * :ghissue:`5417`: scp checking for existence of directories: directory names are incorrect * :ghissue:`5302`: Parallel engine registration fails for slow engines * :ghissue:`5334`: notebook's split-cell shortcut dangerous / incompatible with Neo layout (for instance) * :ghissue:`5324`: Style of `raw_input` UI is off in notebook * :ghissue:`5350`: Converting notebooks with spaces in their names to RST gives broken images * :ghissue:`5049`: update quickhelp on adding and removing shortcuts * :ghissue:`4941`: Eliminating display of intermediate stages in progress bars * :ghissue:`5345`: nbconvert to markdown does not use backticks * :ghissue:`5357`: catch exception in copystat * :ghissue:`5351`: Notebook saving fails on smb share * :ghissue:`4946`: TeX produced cannot be converted to PDF * :ghissue:`5347`: pretty print list too slow * :ghissue:`5238`: Raw cell placeholder is not removed when you edit the cell * :ghissue:`5382`: Qtconsole doesn't run in Python 3 * :ghissue:`5378`: Unexpected and new conflict between PyFileConfigLoader and IPythonQtConsoleApp * :ghissue:`4945`: Heading/cells positioning problem and cell output wrapping * :ghissue:`5084`: Consistent approach for HTML/JS output on nbviewer * :ghissue:`4902`: print preview does not work, custom.css not found * :ghissue:`5336`: TypeError in bootstrap-tour.min.js * :ghissue:`5303`: Changed Hub.registration_timeout to be a config input. * :ghissue:`995`: Paste-able mode in terminal * :ghissue:`5305`: Tuple unpacking for shell escape * :ghissue:`5232`: Make nbconvert html full output like notebook's html. * :ghissue:`5224`: Audit nbconvert HTML output * :ghissue:`5253`: display any output from this session in terminal console * :ghissue:`5251`: ipython console ignoring some stream messages? * :ghissue:`4802`: Tour of the notebook UI (was UI elements inline with highlighting) * :ghissue:`5103`: Moving Constructor definition to the top like a Function definition * :ghissue:`5264`: Test failures on master with Anaconda * :ghissue:`4833`: Serve /usr/share/javascript at /_sysassets/javascript/ in notebook * :ghissue:`5071`: Prevent %pylab from clobbering interactive * :ghissue:`5282`: Exception in widget __del__ methods in Python 3.4. * :ghissue:`5280`: append Firefox overflow-x fix * :ghissue:`5120`: append Firefox overflow-x fix, again * :ghissue:`4127`: autoreload shouldn't rely on .pyc modification times * :ghissue:`5272`: allow highlighting language to be set from notebook metadata * :ghissue:`5050`: Notebook cells truncated with Firefox * :ghissue:`4839`: Error in Session.send_raw() * :ghissue:`5188`: New events system * :ghissue:`5076`: Refactor keyboard handling * :ghissue:`4886`: Refactor and consolidate different keyboard logic in JavaScript code * :ghissue:`5002`: the green cell border moving forever in Chrome, when there are many code cells. * :ghissue:`5259`: Codemirror still active in command mode * :ghissue:`5219`: Output images appear as small thumbnails (Notebook) * :ghissue:`4829`: Not able to connect qtconsole in Windows 8 * :ghissue:`5152`: Hide __pycache__ in dashboard directory list * :ghissue:`5151`: Case-insesitive sort for dashboard list * :ghissue:`4603`: Warn when overwriting a notebook with upload * :ghissue:`4895`: Improvements to %run completions * :ghissue:`3459`: Filename completion when run script with %run * :ghissue:`5225`: Add JavaScript to nbconvert HTML display priority * :ghissue:`5034`: Audit the places where we call `.html(something)` * :ghissue:`5094`: Dancing cells in notebook * :ghissue:`4999`: Notebook focus effects * :ghissue:`5149`: Clicking on a TextBoxWidget in FF completely breaks dual mode. * :ghissue:`5207`: Children fire event * :ghissue:`5227`: display_method of objects with custom __getattr__ * :ghissue:`5236`: Cursor keys do not work to leave Markdown cell while it's being edited * :ghissue:`5205`: Use CTuple traitlet for Widget children * :ghissue:`5230`: notebook rename does not respect url prefix * :ghissue:`5218`: Test failures with Python 3 and enabled warnings * :ghissue:`5115`: Page Breaks for Print Preview Broken by display: flex - Simple CSS Fix * :ghissue:`5024`: Make nbconvert HTML output smart about page breaking * :ghissue:`4985`: Add automatic Closebrackets function to Codemirror. * :ghissue:`5184`: print '\xa' crashes the interactive shell * :ghissue:`5214`: Downloading notebook as Python (.py) fails * :ghissue:`5211`: AttributeError: 'module' object has no attribute '_outputfile' * :ghissue:`5206`: [CSS?] Inconsistencies in nbconvert divs and IPython Notebook divs? * :ghissue:`5201`: node != nodejs within Debian packages * :ghissue:`5112`: band-aid for completion * :ghissue:`4860`: Completer As-You-Type Broken * :ghissue:`5116`: reorganize who knows what about paths * :ghissue:`4973`: Adding security.js with 1st attempt at is_safe * :ghissue:`5164`: test_oinspect.test_calltip_builtin failure with python3.4 * :ghissue:`5127`: Widgets: skip intermediate callbacks during throttling * :ghissue:`5013`: Widget alignment differs between FF and Chrome * :ghissue:`5141`: tornado error static file * :ghissue:`5160`: TemporaryWorkingDirectory incompatible with python3.4 * :ghissue:`5140`: WIP: %kernels magic * :ghissue:`4987`: Widget lifecycle problems * :ghissue:`5129`: UCS package break latex export on non-ascii * :ghissue:`4986`: Cell horizontal scrollbar is missing in FF but not in Chrome * :ghissue:`4685`: nbconvert ignores image size metadata * :ghissue:`5155`: Notebook logout button does not work (source typo) * :ghissue:`2678`: Ctrl-m keyboard shortcut clash on Chrome OS * :ghissue:`5113`: ButtonWidget without caption wrong height. * :ghissue:`4778`: add APIs for installing notebook extensions * :ghissue:`5046`: python setup.py failed vs git submodule update worked * :ghissue:`4925`: Notebook manager api fixes * :ghissue:`5073`: Cannot align widgets horizontally in the notebook * :ghissue:`4996`: require print_method to be a bound method * :ghissue:`4990`: _repr_html_ exception reporting corner case when using type(foo) * :ghissue:`5099`: Notebook: Changing base_project_url results in failed WebSockets call * :ghissue:`5096`: Client.map is not fault tolerant * :ghissue:`4997`: Inconsistent %matplotlib qt behavior * :ghissue:`5041`: Remove more .html(...) calls. * :ghissue:`5078`: Updating JS tests README.md * :ghissue:`4977`: ensure scp destination directories exist (with mkdir -p) * :ghissue:`3411`: ipython parallel: scp failure. * :ghissue:`5064`: Errors during interact display at the terminal, not anywhere in the notebook * :ghissue:`4921`: Add PDF formatter and handling * :ghissue:`4920`: Adding PDFFormatter and kernel side handling of PDF display data * :ghissue:`5048`: Add edit/command mode indicator * :ghissue:`4889`: Add UI element for indicating command/edit modes * :ghissue:`5052`: Add q to toggle the pager. * :ghissue:`5000`: Closing pager with keyboard in modal UI * :ghissue:`5069`: Box model changes broke the Keyboard Shortcuts help modal * :ghissue:`4960`: Interact/Interactive for widget * :ghissue:`4883`: Implement interact/interactive for widgets * :ghissue:`5038`: Fix multiple press keyboard events * :ghissue:`5054`: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc6 in position 1: ordinal not in range(128) * :ghissue:`5031`: Bug during integration of IPython console in Qt application * :ghissue:`5057`: iopubwatcher.py example is broken. * :ghissue:`4747`: Add event for output_area adding an output * :ghissue:`5001`: Add directory navigation to dashboard * :ghissue:`5016`: Help menu external-link icons break layout in FF * :ghissue:`4885`: Modal UI behavior changes * :ghissue:`5009`: notebook signatures don't work * :ghissue:`4975`: setup.py changes for 2.0 * :ghissue:`4774`: emit event on appended element on dom * :ghissue:`5020`: Python Lists translated to javascript objects in widgets * :ghissue:`5003`: Fix pretty reprs of super() objects * :ghissue:`5012`: Make `SelectionWidget.values` a dict * :ghissue:`4961`: Bug when constructing a selection widget with both values and labels * :ghissue:`4283`: A `<` in a markdown cell strips cell content when converting to latex * :ghissue:`4006`: iptest IPython broken * :ghissue:`4251`: & escaped to & in tex ? * :ghissue:`5027`: pin lessc to 1.4 * :ghissue:`4323`: Take 2: citation2latex filter (using HTMLParser) * :ghissue:`4196`: Printing notebook from browser gives 1-page truncated output * :ghissue:`4842`: more subtle kernel indicator * :ghissue:`4057`: No path to notebook examples from Help menu * :ghissue:`5015`: don't write cell.trusted to disk * :ghissue:`4617`: Changed url link in Help dropdown menu. * :ghissue:`4976`: Container widget layout broken on Firefox * :ghissue:`4981`: Vertical slider layout broken * :ghissue:`4793`: Message spec changes related to `clear_output` * :ghissue:`4982`: Live readout for slider widgets * :ghissue:`4813`: make help menu a template * :ghissue:`4989`: Filename tab completion completely broken * :ghissue:`1380`: Tab should insert 4 spaces in # comment lines * :ghissue:`2888`: spaces vs tabs * :ghissue:`1193`: Allow resizing figures in notebook * :ghissue:`4504`: Allow input transformers to raise SyntaxError * :ghissue:`4697`: Problems with height after toggling header and toolbar... * :ghissue:`4951`: TextWidget to code cell command mode bug. * :ghissue:`4809`: Arbitrary scrolling (jumping) in clicks in modal UI for notebook * :ghissue:`4971`: Fixing issues with js tests * :ghissue:`4972`: Work around problem in doctest discovery in Python 3.4 with PyQt * :ghissue:`4892`: IPython.qt test failure with python3.4 * :ghissue:`4863`: BUG: cannot create an OBJECT array from memory buffer * :ghissue:`4704`: Subcommand `profile` ignores --ipython-dir * :ghissue:`4845`: Add Origin Checking. * :ghissue:`4870`: ipython_directive, report except/warn in block and add :okexcept: :okwarning: options to suppress * :ghissue:`4956`: Shift-Enter does not move to next cell * :ghissue:`4662`: Menu cleanup * :ghissue:`4824`: sign notebooks * :ghissue:`4848`: avoid import of nearby temporary with %edit * :ghissue:`4731`: %edit files mistakenly import modules in /tmp * :ghissue:`4950`: Two fixes for file upload related bugs * :ghissue:`4871`: Notebook upload fails after Delete * :ghissue:`4825`: File Upload URL set incorrectly * :ghissue:`3867`: display.FileLinks should work in the exported html verion of a notebook * :ghissue:`4948`: reveal: ipython css overrides reveal themes * :ghissue:`4947`: reveal: slides that are too big? * :ghissue:`4051`: Test failures with Python 3 and enabled warnings * :ghissue:`3633`: outstanding issues over in ipython/nbconvert repo * :ghissue:`4087`: Sympy printing in the example notebook * :ghissue:`4627`: Document various QtConsole embedding approaches. * :ghissue:`4849`: Various unicode fixes (mostly on Windows) * :ghissue:`3653`: autocompletion in "from package import " * :ghissue:`4583`: overwrite? prompt gets EOFError in 2 process * :ghissue:`4807`: Correct handling of ansi colour codes when nbconverting to latex * :ghissue:`4611`: Document how to compile .less files in dev docs. * :ghissue:`4618`: "Editor Shortcuts" link is broken in help menu dropdown notebook * :ghissue:`4522`: DeprecationWarning: the sets module is deprecated * :ghissue:`4368`: No symlink from ipython to ipython3 when inside a python3 virtualenv * :ghissue:`4234`: Math without $$ doesn't show up when converted to slides * :ghissue:`4194`: config.TerminalIPythonApp.nosep does not work * :ghissue:`1491`: prefilter not called for multi-line notebook cells * :ghissue:`4001`: Windows IPython executable /scripts/ipython not working * :ghissue:`3959`: think more carefully about text wrapping in nbconvert * :ghissue:`4907`: Test for traceback depth fails on Windows * :ghissue:`4906`: Test for IPython.embed() fails on Windows * :ghissue:`4912`: Skip some Windows io failures * :ghissue:`3700`: stdout/stderr should be flushed printing exception output... * :ghissue:`1181`: greedy completer bug in terminal console * :ghissue:`2032`: check for a few places we should be using DEFAULT_ENCODING * :ghissue:`4882`: Too many files open when starting and stopping kernel repeatedly * :ghissue:`4880`: set profile name from profile_dir * :ghissue:`4238`: parallel.Client() not using profile that notebook was run with? * :ghissue:`4853`: fix setting image height/width from metadata * :ghissue:`4786`: Reduce spacing of heading cells * :ghissue:`4680`: Minimal pandoc version warning * :ghissue:`3707`: nbconvert: Remove IPython magic commands from --format="python" output * :ghissue:`4130`: PDF figures as links from png or svg figures * :ghissue:`3919`: Allow --profile to be passed a dir. * :ghissue:`2136`: Handle hard newlines in pretty printer * :ghissue:`4790`: Notebook modal UI: "merge cell below" key binding, `shift+=`, does not work with some keyboard layouts * :ghissue:`4884`: Keyboard shortcut changes * :ghissue:`1184`: slow handling of keyboard input * :ghissue:`4913`: Mathjax, Markdown, tex, env* and italic * :ghissue:`3972`: nbconvert: Template output testing * :ghissue:`4903`: use https for all embeds * :ghissue:`4874`: --debug does not work if you set .kernel_cmd * :ghissue:`4679`: JPG compression for inline pylab * :ghissue:`4708`: Fix indent and center * :ghissue:`4789`: fix IPython.embed * :ghissue:`4759`: Application._load_config_files log parameter default fails * :ghissue:`3153`: docs / file menu: explain how to exit the notebook * :ghissue:`4791`: Did updates to ipython_directive bork support for cython magic snippets? * :ghissue:`4385`: "Part 4 - Markdown Cells.ipynb" nbviewer example seems not well referenced in current online documentation page https://ipython.org/ipython-doc/stable/interactive/notebook.htm * :ghissue:`4655`: prefer marked to pandoc for markdown2html * :ghissue:`3441`: Fix focus related problems in the notebook * :ghissue:`3402`: Feature Request: Save As (latex, html,..etc) as a menu option in Notebook rather than explicit need to invoke nbconvert * :ghissue:`3224`: Revisit layout of notebook area * :ghissue:`2746`: rerunning a cell with long output (exception) scrolls to much (html notebook) * :ghissue:`2667`: can't save opened notebook if accidentally delete the notebook in the dashboard * :ghissue:`3026`: Reporting errors from _repr__ methods * :ghissue:`1844`: Notebook does not exist and permalinks * :ghissue:`2450`: [closed PR] Prevent jumping of window to input when output is clicked. * :ghissue:`3166`: IPEP 16: Notebook multi directory dashboard and URL mapping * :ghissue:`3691`: Slight misalignment of Notebook menu bar with focus box * :ghissue:`4875`: Empty tooltip with `object_found = false` still being shown * :ghissue:`4432`: The SSL cert for the MathJax CDN is invalid and URL is not protocol agnostic * :ghissue:`2633`: Help text should leave current cell active * :ghissue:`3976`: DOC: Pandas link on the notebook help menu? * :ghissue:`4082`: /new handler redirect cached by browser * :ghissue:`4298`: Slow ipython --pylab and ipython notebook startup * :ghissue:`4545`: %store magic not working * :ghissue:`4610`: toolbar UI enhancements * :ghissue:`4782`: New modal UI * :ghissue:`4732`: Accents in notebook names and in command-line (nbconvert) * :ghissue:`4752`: link broken in docs/examples * :ghissue:`4835`: running ipython on python files adds an extra traceback frame * :ghissue:`4792`: repr_html exception warning on qtconsole with pandas #4745 * :ghissue:`4834`: function tooltip issues * :ghissue:`4808`: Docstrings in Notebook not displayed properly and introspection * :ghissue:`4846`: Remove some leftover traces of irunner * :ghissue:`4810`: ipcluster bug in clean_logs flag * :ghissue:`4812`: update CodeMirror for the notebook * :ghissue:`671`: add migration guide for old IPython config * :ghissue:`4783`: ipython 2dev under windows / (win)python 3.3 experiment * :ghissue:`4772`: Notebook server info files * :ghissue:`4765`: missing build script for highlight.js * :ghissue:`4787`: non-python kernels run python code with qtconsole * :ghissue:`4703`: Math macro in jinja templates. * :ghissue:`4595`: ipython notebook XSS vulnerable * :ghissue:`4776`: Manually document py3compat module. * :ghissue:`4686`: For-in loop on an array in cell.js * :ghissue:`3605`: Modal UI * :ghissue:`4769`: Ipython 2.0 will not startup on py27 on windows * :ghissue:`4482`: reveal.js converter not including CDN by default? * :ghissue:`4761`: ipv6 address triggers cookie exception * :ghissue:`4580`: rename or remove %profile magic * :ghissue:`4643`: Docstring does not open properly * :ghissue:`4714`: Static URLs are not auto-versioned * :ghissue:`2573`: document code mirror keyboard shortcuts * :ghissue:`4717`: hang in parallel.Client when using SSHAgent * :ghissue:`4544`: Clarify the requirement for pyreadline on Windows * :ghissue:`3451`: revisit REST /new handler to avoid systematic crawling. * :ghissue:`2922`: File => Save as '.py' saves magic as code * :ghissue:`4728`: Copy/Paste stripping broken in version > 0.13.x in QTConsole * :ghissue:`4539`: Nbconvert: Latex to PDF conversion fails on notebooks with accented letters * :ghissue:`4721`: purge_results with jobid crashing - looking for insight * :ghissue:`4620`: Notebook with ? in title defies autosave, renaming and deletion. * :ghissue:`4574`: Hash character in notebook name breaks a lot of things * :ghissue:`4709`: input_prefilter hook not called * :ghissue:`1680`: qtconsole should support --no-banner and custom banner * :ghissue:`4689`: IOStream IP address configurable * :ghissue:`4698`: Missing "if __name__ == '__main__':" check in /usr/bin/ipython * :ghissue:`4191`: NBConvert: markdown inline and locally referenced files have incorrect file location for latex * :ghissue:`2865`: %%!? does not display the shell execute docstring * :ghissue:`1551`: Notebook should be saved before printing * :ghissue:`4612`: remove `Configurable.created` ? * :ghissue:`4629`: Lots of tests fail due to space in sys.executable * :ghissue:`4644`: Fixed URLs for notebooks * :ghissue:`4621`: IPython 1.1.0 Qtconsole syntax highlighting highlights python 2 only built-ins when using python 3 * :ghissue:`2923`: Move Delete Button Away from Save Button in the HTML notebook toolbar * :ghissue:`4615`: UnicodeDecodeError * :ghissue:`4431`: ipython slow in os x mavericks? * :ghissue:`4538`: DOC: document how to change ipcontroller-engine.json in case controller was started with --ip="*" * :ghissue:`4551`: Serialize methods and closures * :ghissue:`4081`: [Nbconvert][reveal] link to font awesome ? * :ghissue:`4602`: "ipcluster stop" fails after "ipcluster start --daemonize" using python3.3 * :ghissue:`4578`: NBconvert fails with unicode errors when `--stdout` and file redirection is specified and HTML entities are present * :ghissue:`4600`: Renaming new notebook to an exist name silently deletes the old one * :ghissue:`4598`: Qtconsole docstring pop-up fails on method containing defaulted enum argument * :ghissue:`951`: Remove Tornado monkeypatch * :ghissue:`4564`: Notebook save failure * :ghissue:`4562`: nbconvert: Default encoding problem on OS X * :ghissue:`1675`: add file_to_run=file.ipynb capability to the notebook * :ghissue:`4516`: `ipython console` doesn't send a `shutdown_request` * :ghissue:`3043`: can't restart pdb session in ipython * :ghissue:`4524`: Fix bug with non ascii passwords in notebook login * :ghissue:`1866`: problems rendering an SVG? * :ghissue:`4520`: unicode error when trying Audio('data/Bach Cello Suite #3.wav') * :ghissue:`4493`: Qtconsole cannot print an ISO8601 date at nanosecond precision * :ghissue:`4502`: intermittent parallel test failure test_purge_everything * :ghissue:`4495`: firefox 25.0: notebooks report "Notebook save failed", .py script save fails, but .ipynb save succeeds * :ghissue:`4245`: nbconvert latex: code highlighting causes error * :ghissue:`4486`: Test for whether inside virtualenv does not work if directory is symlinked * :ghissue:`4485`: Incorrect info in "Messaging in IPython" documentation. * :ghissue:`4447`: Ipcontroller broken in current HEAD on windows * :ghissue:`4241`: Audio display object * :ghissue:`4463`: Error on empty c.Session.key * :ghissue:`4454`: UnicodeDecodeError when starting Ipython notebook on a directory containing a file with a non-ascii character * :ghissue:`3801`: Autocompletion: Fix issue #3723 -- ordering of completions for magic commands and variables with same name * :ghissue:`3723`: Code completion: 'matplotlib' and '%matplotlib' * :ghissue:`4396`: Always checkpoint al least once ? * :ghissue:`2524`: [Notebook] Clear kernel queue * :ghissue:`2292`: Client side tests for the notebook * :ghissue:`4424`: Dealing with images in multidirectory environment * :ghissue:`4388`: Make writing configurable magics easier * :ghissue:`852`: Notebook should be saved before downloading * :ghissue:`3708`: ipython profile locate should also work * :ghissue:`1349`: `?` may generate hundreds of cell * :ghissue:`4381`: Using hasattr for trait_names instead of just looking for it directly/using __dir__? * :ghissue:`4361`: Crash Ultratraceback/ session history * :ghissue:`3044`: IPython notebook autocomplete for filename string converts multiple spaces to a single space * :ghissue:`3346`: Up arrow history search shows duplicates in Qtconsole * :ghissue:`3496`: Fix import errors when running tests from the source directory * :ghissue:`4114`: If default profile doesn't exist, can't install mathjax to any location * :ghissue:`4335`: TestPylabSwitch.test_qt fails * :ghissue:`4291`: serve like option for nbconvert --to latex * :ghissue:`1824`: Exception before prompting for password during ssh connection * :ghissue:`4309`: Error in nbconvert - closing tag is not inserted in HTML under some circumstances * :ghissue:`4351`: /parallel/apps/launcher.py error * :ghissue:`3603`: Upcoming issues with nbconvert * :ghissue:`4296`: sync_imports() fails in python 3.3 * :ghissue:`4339`: local mathjax install doesn't work * :ghissue:`4334`: NotebookApp.webapp_settings static_url_prefix causes crash * :ghissue:`4308`: Error when use "ipython notebook" in win7 64 with python2.7.3 64. * :ghissue:`4317`: Relative imports broken in the notebook (Windows) * :ghissue:`3658`: Saving Notebook clears "Kernel Busy" status from the page and titlebar * :ghissue:`4312`: Link broken on ipython-doc stable * :ghissue:`1093`: Add boundary options to %load * :ghissue:`3619`: Multi-dir webservice design * :ghissue:`4299`: Nbconvert, default_preprocessors to list of dotted name not list of obj * :ghissue:`3210`: IPython.parallel tests seem to hang on ShiningPanda * :ghissue:`4280`: MathJax Automatic Line Breaking * :ghissue:`4039`: Celltoolbar example issue * :ghissue:`4247`: nbconvert --to latex: error when converting greek letter * :ghissue:`4273`: %%capture not capturing rich objects like plots (IPython 1.1.0) * :ghissue:`3866`: Vertical offsets in LaTeX output for nbconvert * :ghissue:`3631`: xkcd mode for the IPython notebook * :ghissue:`4243`: Test exclusions not working on Windows * :ghissue:`4256`: IPython no longer handles unicode file names * :ghissue:`3656`: Audio displayobject * :ghissue:`4223`: Double output on Ctrl-enter-enter * :ghissue:`4184`: nbconvert: use r pygmentize backend when highlighting "%%R" cells * :ghissue:`3851`: Adds an explicit newline for pretty-printing. * :ghissue:`3622`: Drop fakemodule * :ghissue:`4122`: Nbconvert [windows]: Inconsistent line endings in markdown cells exported to latex * :ghissue:`3819`: nbconvert add extra blank line to code block on Windows. * :ghissue:`4203`: remove spurious print statement from parallel annoted functions * :ghissue:`4200`: Notebook: merging a heading cell and markdown cell cannot be undone * :ghissue:`3747`: ipynb -> ipynb transformer * :ghissue:`4024`: nbconvert markdown issues * :ghissue:`3903`: on Windows, 'ipython3 nbconvert "C:/blabla/first_try.ipynb" --to slides' gives an unexpected result, and '--post serve' fails * :ghissue:`4095`: Catch js error in append html in stream/pyerr * :ghissue:`1880`: Add parallelism to test_pr * :ghissue:`4085`: nbconvert: Fix sphinx preprocessor date format string for Windows * :ghissue:`4156`: Specifying --gui=tk at the command line * :ghissue:`4146`: Having to prepend 'files/' to markdown image paths is confusing * :ghissue:`3818`: nbconvert can't handle Heading with Chinese characters on Japanese Windows OS. * :ghissue:`4134`: multi-line parser fails on ''' in comment, qtconsole and notebook. * :ghissue:`3998`: sample custom.js needs to be updated * :ghissue:`4078`: StoreMagic.autorestore not working in 1.0.0 * :ghissue:`3990`: Buitlin `input` doesn't work over zmq * :ghissue:`4015`: nbconvert fails to convert all the content of a notebook * :ghissue:`4059`: Issues with Ellipsis literal in Python 3 * :ghissue:`2310`: "ZMQError: Interrupted system call" from RichIPythonWidget * :ghissue:`3807`: qtconsole ipython 0.13.2 - html/xhtml export fails * :ghissue:`4103`: Wrong default argument of DirectView.clear * :ghissue:`4100`: parallel.client.client references undefined error.EngineError * :ghissue:`484`: Drop nosepatch * :ghissue:`3350`: Added longlist support in ipdb. * :ghissue:`1591`: Keying 'q' doesn't quit the interactive help in Wins7 * :ghissue:`40`: The tests in test_process fail under Windows * :ghissue:`3744`: capture rich output as well as stdout/err in capture_output * :ghissue:`3742`: %%capture to grab rich display outputs * :ghissue:`3863`: Added working speaker notes for slides. * :ghissue:`4013`: Iptest fails in dual python installation * :ghissue:`4005`: IPython.start_kernel doesn't work. * :ghissue:`4020`: IPython parallel map fails on numpy arrays * :ghissue:`3914`: nbconvert: Transformer tests * :ghissue:`3923`: nbconvert: Writer tests * :ghissue:`3945`: nbconvert: commandline tests fail Win7x64 Py3.3 * :ghissue:`3937`: make tab visible in codemirror and light red background * :ghissue:`3935`: No feedback for mixed tabs and spaces * :ghissue:`3933`: nbconvert: Post-processor tests * :ghissue:`3977`: unable to complete remote connections for two-process * :ghissue:`3939`: minor checkpoint cleanup * :ghissue:`3955`: complete on % for magic in notebook * :ghissue:`3954`: all magics should be listed when completing on % * :ghissue:`3980`: nbconvert rst output lacks needed blank lines * :ghissue:`3968`: TypeError: super() argument 1 must be type, not classobj (Python 2.6.6) * :ghissue:`3880`: nbconvert: R&D remaining tests * :ghissue:`2440`: IPEP 4: Python 3 Compatibility ipython-8.35.0/docs/source/whatsnew/github-stats-3.rst000066400000000000000000000115551477474304100227230ustar00rootroot00000000000000.. _issues_list_3: Issues closed in the 3.x development cycle ========================================== Issues closed in 3.2.1 ---------------------- GitHub stats for 2015/06/22 - 2015/07/12 (since 3.2) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 1 issue and merged 3 pull requests. The full list can be seen `on GitHub `__ The following 5 authors contributed 9 commits. * Benjamin Ragan-Kelley * Matthias Bussonnier * Nitin Dahyabhai * Sebastiaan Mathot * Thomas Kluyver Issues closed in 3.2 -------------------- GitHub stats for 2015/04/03 - 2015/06/21 (since 3.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 7 issues and merged 30 pull requests. The full list can be seen `on GitHub `__ The following 15 authors contributed 74 commits. * Benjamin Ragan-Kelley * Brian Gough * Damián Avila * Ian Barfield * Jason Grout * Jeff Hussmann * Jessica B. Hamrick * Kyle Kelley * Matthias Bussonnier * Nicholas Bollweg * Randy Lai * Scott Sanderson * Sylvain Corlay * Thomas A Caswell * Thomas Kluyver Issues closed in 3.1 -------------------- GitHub stats for 2015/02/27 - 2015/04/03 (since 3.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 46 issues and merged 133 pull requests. The full list can be seen `on GitHub `__. The following 33 authors contributed 344 commits: * Abe Guerra * Adal Chiriliuc * Benjamin Ragan-Kelley * Brian Drawert * Fernando Perez * Gareth Elston * Gert-Ludwig Ingold * Giuseppe Venturini * Jakob Gager * Jan Schulz * Jason Grout * Jessica B. Hamrick * Jonathan Frederic * Justin Tyberg * Lorena Pantano * mashenjun * Mathieu * Matthias Bussonnier * Morten Enemark Lund * Naveen Nathan * Nicholas Bollweg * onesandzeroes * Patrick Snape * Peter Parente * RickWinter * Robert Smith * Ryan Nelson * Scott Sanderson * Sylvain Corlay * Thomas Kluyver * tmtabor * Wieland Hoffmann * Yuval Langer Issues closed in 3.0 -------------------- GitHub stats for 2014/04/02 - 2015/02/13 (since 2.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 469 issues and merged 925 pull requests. The full list can be seen `on GitHub `__. The following 155 authors contributed 5975 commits. * A.J. Holyoake * abalkin * Adam Hodgen * Adrian Price-Whelan * Amin Bandali * Andreas Amann * Andrew Dawes * Andrew Jesaitis * Andrew Payne * AnneTheAgile * Aron Ahmadia * Ben Duffield * Benjamin ABEL * Benjamin Ragan-Kelley * Benjamin Schultz * Björn Grüning * Björn Linse * Blake Griffith * Boris Egorov * Brian E. Granger * bsvh * Carlos Cordoba * Cedric GESTES * cel * chebee7i * Christoph Gohlke * CJ Carey * Cyrille Rossant * Dale Jung * Damián Avila * Damon Allen * Daniel B. Vasquez * Daniel Rocco * Daniel Wehner * Dav Clark * David Hirschfeld * David Neto * dexterdev * Dimitry Kloper * dongweiming * Doug Blank * drevicko * Dustin Rodriguez * Eric Firing * Eric Galloway * Erik M. Bray * Erik Tollerud * Ezequiel (Zac) Panepucci * Fernando Perez * foogunlana * Francisco de la Peña * George Titsworth * Gordon Ball * gporras * Grzegorz Rożniecki * Helen ST * immerrr * Ingolf Becker * Jakob Gager * James Goppert * James Porter * Jan Schulz * Jason Goad * Jason Gors * Jason Grout * Jason Newton * jdavidheiser * Jean-Christophe Jaskula * Jeff Hemmelgarn * Jeffrey Bush * Jeroen Demeyer * Jessica B. Hamrick * Jessica Frazelle * jhemmelg * Jim Garrison * Joel Nothman * Johannes Feist * John Stowers * John Zwinck * jonasc * Jonathan Frederic * Juergen Hasch * Julia Evans * Justyna Ilczuk * Jörg Dietrich * K.-Michael Aye * Kalibri * Kester Tong * Kyle Kelley * Kyle Rawlins * Lev Abalkin * Manuel Riel * Martin Bergtholdt * Martin Spacek * Mateusz Paprocki * Mathieu * Matthias Bussonnier * Maximilian Albert * mbyt * MechCoder * Mohan Raj Rajamanickam * mvr * Narahari * Nathan Goldbaum * Nathan Heijermans * Nathaniel J. Smith * ncornette * Nicholas Bollweg * Nick White * Nikolay Koldunov * Nile Geisinger * Olga Botvinnik * Osada Paranaliyanage * Pankaj Pandey * Pascal Bugnion * patricktokeeffe * Paul Ivanov * Peter Odding * Peter Parente * Peter Würtz * Phil Elson * Phillip Nordwall * Pierre Gerold * Pierre Haessig * Raffaele De Feo * Ramiro Gómez * Reggie Pierce * Remi Rampin * Renaud Richardet * Richard Everson * Scott Sanderson * Silvia Vinyes * Simon Guillot * Spencer Nelson * Stefan Zimmermann * Steve Chan * Steven Anton * Steven Silvester * sunny * Susan Tan * Sylvain Corlay * Tarun Gaba * Thomas Ballinger * Thomas Kluyver * Thomas Robitaille * Thomas Spura * Tobias Oberstein * Torsten Bittner * unknown * v923z * vaibhavsagar * W. Trevor King * weichm * Xiuming Chen * Yaroslav Halchenko * zah ipython-8.35.0/docs/source/whatsnew/github-stats-4.rst000066400000000000000000000064721477474304100227260ustar00rootroot00000000000000.. _issues_list_4: Issues closed in the 4.x development cycle ========================================== Issues closed in 4.2 -------------------- GitHub stats for 2015/02/02 - 2016/04/20 (since 4.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 10 issues and merged 22 pull requests. The full list can be seen `on GitHub `__ The following 10 authors contributed 27 commits. * Benjamin Ragan-Kelley * Carlos Cordoba * Gökhan Karabulut * Jonas Rauber * Matthias Bussonnier * Paul Ivanov * Sebastian Bank * Thomas A Caswell * Thomas Kluyver * Vincent Woo Issues closed in 4.1 -------------------- GitHub stats for 2015/08/12 - 2016/02/02 (since 4.0.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 60 issues and merged 148 pull requests. The full list can be seen `on GitHub `__ The following 52 authors contributed 468 commits. * Aaron Meurer * Alexandre Avanian * Anthony Sottile * Antony Lee * Arthur Loder * Ben Kasel * Ben Rousch * Benjamin Ragan-Kelley * bollwyvl * Carol Willing * Christopher Roach * Douglas La Rocca * Fairly * Fernando Perez * Frank Sachsenheim * Guillaume DOUMENC * Gábor Luk * Hoyt Koepke * Ivan Timokhin * Jacob Niehus * JamshedVesuna * Jan Schulz * Jan-Philip Gehrcke * jc * Jessica B. Hamrick * jferrara * John Bohannon * John Kirkham * Jonathan Frederic * Kyle Kelley * Lev Givon * Lilian Besson * lingxz * Matthias Bussonnier * memeplex * Michael Droettboom * naught101 * Peter Waller * Pierre Gerold * Rémy Léone * Scott Sanderson * Shanzhuo Zhang * Sylvain Corlay * Tayfun Sen * Thomas A Caswell * Thomas Ballinger * Thomas Kluyver * Vincent Legoll * Wouter Bolsterlee * xconverge * Yuri Numerov * Zachary Pincus Issues closed in 4.0 -------------------- GitHub stats for 2015/02/27 - 2015/08/11 (since 3.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 35 issues and merged 125 pull requests. The full list can be seen `on GitHub `__ The following 69 authors contributed 1186 commits. * Abe Guerra * Adal Chiriliuc * Alexander Belopolsky * Andrew Murray * Antonio Russo * Benjamin Ragan-Kelley * Björn Linse * Brian Drawert * chebee7i * Daniel Rocco * Donny Winston * Drekin * Erik Hvatum * Fernando Perez * Francisco de la Peña * Frazer McLean * Gareth Elston * Gert-Ludwig Ingold * Giuseppe Venturini * Ian Barfield * Ivan Pozdeev * Jakob Gager * Jan Schulz * Jason Grout * Jeff Hussmann * Jessica B. Hamrick * Joe Borg * Joel Nothman * Johan Forsberg * Jonathan Frederic * Justin Tyberg * Koen van Besien * Kyle Kelley * Lorena Pantano * Lucretiel * Marin Gilles * mashenjun * Mathieu * Matthias Bussonnier * Merlijn van Deen * Mikhail Korobov * Naveen Nathan * Nicholas Bollweg * nottaanibot * Omer Katz * onesandzeroes * Patrick Snape * patter001 * Peter Parente * Pietro Battiston * RickWinter * Robert Smith * Ryan Nelson * Scott Sanderson * Sebastiaan Mathot * Sylvain Corlay * thethomask * Thomas A Caswell * Thomas Adriaan Hellinger * Thomas Kluyver * Tianhui Michael Li * tmtabor * unknown * Victor Ramirez * Volker Braun * Wieland Hoffmann * Yuval Langer * Zoltán Vörös * Élie Michel ipython-8.35.0/docs/source/whatsnew/github-stats-5.rst000066400000000000000000000104571477474304100227250ustar00rootroot00000000000000.. _issues_list_5: Issues closed in the 5.x development cycle ========================================== Issues closed in 5.6 -------------------- GitHub stats for 2017/09/15 - 2018/04/02 (tag: 5.5.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 2 issues and merged 28 pull requests. The full list can be seen `on GitHub `__ The following 10 authors contributed 47 commits. * Benjamin Ragan-Kelley * Henry Fredrick Schreiner * Joris Van den Bossche * Matthias Bussonnier * Mradul Dubey * Roshan Rao * Samuel Lelièvre * Teddy Rendahl * Thomas A Caswell * Thomas Kluyver Issues closed in 5.4 -------------------- GitHub stats for 2017/02/24 - 2017/05/30 (tag: 5.3.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 8 issues and merged 43 pull requests. The full list can be seen `on GitHub `__ The following 11 authors contributed 64 commits. * Benjamin Ragan-Kelley * Carol Willing * Kyle Kelley * Leo Singer * Luke Pfister * Lumir Balhar * Matthias Bussonnier * meeseeksdev[bot] * memeplex * Thomas Kluyver * Ximin Luo Issues closed in 5.3 -------------------- GitHub stats for 2017/02/24 - 2017/05/30 (tag: 5.3.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 6 issues and merged 28 pull requests. The full list can be seen `on GitHub `__ The following 11 authors contributed 53 commits. * Benjamin Ragan-Kelley * Carol Willing * Justin Jent * Kyle Kelley * Lumir Balhar * Matthias Bussonnier * meeseeksdev[bot] * Segev Finer * Steven Maude * Thomas A Caswell * Thomas Kluyver Issues closed in 5.2 -------------------- GitHub stats for 2016/08/13 - 2017/01/29 (tag: 5.1.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 30 issues and merged 74 pull requests. The full list can be seen `on GitHub `__ The following 40 authors contributed 434 commits. * Adam Eury * anantkaushik89 * anatoly techtonik * Benjamin Ragan-Kelley * Bibo Hao * Carl Smith * Carol Willing * Chilaka Ramakrishna * Christopher Welborn * Denis S. Tereshchenko * Diego Garcia * fatData * Fermi paradox * Fernando Perez * fuho * Hassan Kibirige * Jamshed Vesuna * Jens Hedegaard Nielsen * Jeroen Demeyer * kaushikanant * Kenneth Hoste * Keshav Ramaswamy * Kyle Kelley * Matteo * Matthias Bussonnier * mbyt * memeplex * Moez Bouhlel * Pablo Galindo * Paul Ivanov * pietvo * Piotr Przetacznik * Rounak Banik * sachet-mittal * Srinivas Reddy Thatiparthy * Tamir Bahar * Thomas A Caswell * Thomas Kluyver * tillahoffmann * Yuri Numerov Issues closed in 5.1 -------------------- GitHub stats for 2016/07/08 - 2016/08/13 (tag: 5.0.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 33 issues and merged 43 pull requests. The full list can be seen `on GitHub `__ The following 17 authors contributed 129 commits. * Antony Lee * Benjamin Ragan-Kelley * Carol Willing * Danilo J. S. Bellini * 小明 (`dongweiming `__) * Fernando Perez * Gavin Cooper * Gil Forsyth * Jacob Niehus * Julian Kuhlmann * Matthias Bussonnier * Michael Pacer * Nik Nyby * Pavol Juhas * Luke Deen Taylor * Thomas Kluyver * Tamir Bahar Issues closed in 5.0 -------------------- GitHub stats for 2016/07/05 - 2016/07/07 (tag: 5.0.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 95 issues and merged 191 pull requests. The full list can be seen `on GitHub `__ The following 27 authors contributed 229 commits. * Adam Greenhall * Adrian * Antony Lee * Benjamin Ragan-Kelley * Carlos Cordoba * Carol Willing * Chris * Craig Citro * Dmitry Zotikov * Fernando Perez * Gil Forsyth * Jason Grout * Jonathan Frederic * Jonathan Slenders * Justin Zymbaluk * Kelly Liu * klonuo * Matthias Bussonnier * nvdv * Pavol Juhas * Pierre Gerold * sukisuki * Sylvain Corlay * Thomas A Caswell * Thomas Kluyver * Trevor Bekolay * Yuri Numerov ipython-8.35.0/docs/source/whatsnew/github-stats-6.rst000066400000000000000000000072511477474304100227240ustar00rootroot00000000000000Issues closed in the 6.x development cycle ========================================== Issues closed in 6.3 -------------------- GitHub stats for 2017/09/15 - 2018/04/02 (tag: 6.2.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 10 issues and merged 50 pull requests. The full list can be seen `on GitHub `__ The following 35 authors contributed 253 commits. * Anatoly Techtonik * Antony Lee * Benjamin Ragan-Kelley * Corey McCandless * Craig Citro * Cristian Ciupitu * David Cottrell * David Straub * Doug Latornell * Fabio Niephaus * Gergely Nagy * Henry Fredrick Schreiner * Hugo * Ismael Venegas Castelló * Ivan Gonzalez * J Forde * Jeremy Sikes * Joris Van den Bossche * Lesley Cordero * luzpaz * madhu94 * Matthew R. Scott * Matthias Bussonnier * Matthias Geier * Olesya Baranova * Peter Williams * Rastislav Barlik * Roshan Rao * rs2 * Samuel Lelièvre * Shailyn javier Ortiz jimenez * Sjoerd de Vries * Teddy Rendahl * Thomas A Caswell * Thomas Kluyver Issues closed in 6.2 -------------------- GitHub stats for 2017/05/31 - 2017/09/15 (tag: 6.1.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 3 issues and merged 37 pull requests. The full list can be seen `on GitHub `__ The following 32 authors contributed 196 commits. * adityausathe * Antony Lee * Benjamin Ragan-Kelley * Carl Smith * Eren Halici * Erich Spaker * Grant Nestor * Jean Cruypenynck * Jeroen Demeyer * jfbu * jlstevens * jus1tin * Kyle Kelley * M Pacer * Marc Richter * Marius van Niekerk * Matthias Bussonnier * mpacer * Mradul Dubey * ormung * pepie34 * Ritesh Kadmawala * ryan thielke * Segev Finer * Srinath * Srinivas Reddy Thatiparthy * Steven Maude * Sudarshan Raghunathan * Sudarshan Rangarajan * Thomas A Caswell * Thomas Ballinger * Thomas Kluyver Issues closed in 6.1 -------------------- GitHub stats for 2017/04/19 - 2017/05/30 (tag: 6.0.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 10 issues and merged 43 pull requests. The full list can be seen `on GitHub `__ The following 26 authors contributed 116 commits. * Alex Alekseyev * Benjamin Ragan-Kelley * Brian E. Granger * Christopher C. Aycock * Dave Willmer * David Bradway * ICanWaitAndFishAllDay * Ignat Shining * Jarrod Janssen * Joshua Storck * Luke Pfister * Matthias Bussonnier * Matti Remes * meeseeksdev[bot] * memeplex * Ming Zhang * Nick Weseman * Paul Ivanov * Piotr Zielinski * ryan thielke * sagnak * Sang Min Park * Srinivas Reddy Thatiparthy * Steve Bartz * Thomas Kluyver * Tory Haavik Issues closed in 6.0 -------------------- GitHub stats for 2017/04/10 - 2017/04/19 (milestone: 6.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 49 issues and merged 145 pull requests. The full list can be seen `on GitHub `__ The following 34 authors contributed 176 commits. * Adam Eury * anantkaushik89 * Antonino Ingargiola * Benjamin Ragan-Kelley * Carol Willing * Chilaka Ramakrishna * chillaranand * Denis S. Tereshchenko * Diego Garcia * fatData * Fermi paradox * fuho * Grant Nestor * Ian Rose * Jeroen Demeyer * kaushikanant * Keshav Ramaswamy * Matteo * Matthias Bussonnier * mbyt * Michael Käufl * michaelpacer * Moez Bouhlel * Pablo Galindo * Paul Ivanov * Piotr Przetacznik * Rounak Banik * sachet-mittal * Srinivas Reddy Thatiparthy * Tamir Bahar * Thomas Hisch * Thomas Kluyver * Utkarsh Upadhyay * Yuri Numerov ipython-8.35.0/docs/source/whatsnew/github-stats-7.rst000066400000000000000000000303001477474304100227140ustar00rootroot00000000000000Issues closed in the 7.x development cycle ========================================== Stats are not collected after version 7.17, all contribution will show up as part of the 8.0 release. Issues closed in 7.17 --------------------- GitHub stats for 2020/06/26 - 2020/07/31 (tag: 7.16.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 2 issues and merged 19 pull requests. The full list can be seen `on GitHub `__ The following 3 authors contributed 31 commits. * Maor Kleinberger * Matthias Bussonnier * Quentin Peter Issues closed in 7.16 --------------------- GitHub stats for 2020/05/29 - 2020/06/26 (tag: 7.15.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 0 issues and merged 18 pull requests. The full list can be seen `on GitHub `__ The following 7 authors contributed 22 commits. * Benjamin Ragan-Kelley * dalthviz * Frank Tobia * Matthias Bussonnier * palewire * Paul McCarthy * Talley Lambert Issues closed in 7.15 --------------------- GitHub stats for 2020/05/01 - 2020/05/29 (tag: 7.14.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 1 issues and merged 29 pull requests. The full list can be seen `on GitHub `__ The following 6 authors contributed 31 commits. * Blake Griffin * Inception95 * Marcio Mazza * Matthias Bussonnier * Talley Lambert * Thomas Issues closed in 7.14 --------------------- GitHub stats for 2020/02/29 - 2020/05/01 (tag: 7.13.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 0 issues and merged 30 pull requests. The full list can be seen `on GitHub `__ The following 10 authors contributed 47 commits. * Eric Wieser * foobarbyte * Ian Castleden * Itamar Turner-Trauring * Lumir Balhar * Markus Wageringel * Matthias Bussonnier * Matthieu Ancellin * Quentin Peter * Theo Ouzhinski Issues closed in 7.13 --------------------- GitHub stats for 2020/02/01 - 2020/02/28 (tag: 7.12.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 1 issues and merged 24 pull requests. The full list can be seen `on GitHub `__ The following 12 authors contributed 108 commits. * Alex Hall * Augusto * Coon, Ethan T * Daniel Hahler * Inception95 * Itamar Turner-Trauring * Jonas Haag * Jonathan Slenders * linar-jether * Matthias Bussonnier * Nathan Goldbaum * Terry Davis Issues closed in 7.12 --------------------- GitHub stats for 2020/01/01 - 2020/01/31 (tag: 7.11.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 2 issues and merged 14 pull requests. The full list can be seen `on GitHub `__ The following 11 authors contributed 48 commits. * Augusto * Eric Wieser * Jeff Potter * Mark E. Haase * Matthias Bussonnier * ossdev07 * ras44 * takuya fujiwara * Terry Davis * Thomas A Caswell * yangyang Issues closed in 7.11 --------------------- GitHub stats for 2019/12/01 - 2019/12/27 (tag: 7.10.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 4 issues and merged 36 pull requests. The full list can be seen `on GitHub `__ The following 16 authors contributed 114 commits. * Augusto * Benjamin Ragan-Kelley * Chemss Eddine Ben Hassine * Danny Hermes * Dominik Miedziński * Jonathan Feinberg * Jonathan Slenders * Joseph Kahn * kousik * Kousik Mitra * Marc Hernandez Cabot * Matthias Bussonnier * Naveen Honest Raj K * Pratyay Pandey * Quentin Peter * takuya fujiwara Issues closed in 7.10.2 ----------------------- GitHub stats for 2019/12/01 - 2019/12/14 (tag: 7.10.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 3 issues and merged 10 pull requests. The full list can be seen `on GitHub `__ The following 3 authors contributed 11 commits. * Jonathan Slenders * Joseph Kahn * Matthias Bussonnier Issues closed in 7.10.1 ----------------------- GitHub stats for 2019/11/27 - 2019/12/01 (tag: 7.10.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 5 issues and merged 7 pull requests. The full list can be seen `on GitHub `__ The following 2 authors contributed 14 commits. * Jonathan Slenders * Matthias Bussonnier Issues closed in 7.10 --------------------- GitHub stats for 2019/10/25 - 2019/11/27 (tag: 7.9.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 4 issues and merged 22 pull requests. The full list can be seen `on GitHub `__ The following 15 authors contributed 101 commits. * anatoly techtonik * Ben Lewis * Benjamin Ragan-Kelley * Gerrit Buss * grey275 * Gökcen Eraslan * Jonathan Slenders * Joris Van den Bossche * kousik * Matthias Bussonnier * Nicholas Bollweg * Paul McCarthy * Srinivas Reddy Thatiparthy * Timo Kaufmann * Tony Fast Issues closed in 7.9 -------------------- GitHub stats for 2019/08/30 - 2019/10/25 (tag: 7.8.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 1 issues and merged 9 pull requests. The full list can be seen `on GitHub `__ The following 8 authors contributed 20 commits. * Benjamin Ragan-Kelley * Hugo * Matthias Bussonnier * mfh92 * Mohammad Hossein Sekhavat * Niclas * Vidar Tonaas Fauske * Георгий Фролов Issues closed in 7.8 -------------------- GitHub stats for 2019/07/26 - 2019/08/30 (tag: 7.7.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 1 issues and merged 4 pull requests. The full list can be seen `on GitHub `__ The following 5 authors contributed 27 commits. * Dan Allan * Matthias Bussonnier * Min ho Kim * Oscar Gustafsson * Terry Davis Issues closed in 7.7 -------------------- GitHub stats for 2019/07/03 - 2019/07/26 (tag: 7.6.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 5 issues and merged 9 pull requests. The full list can be seen `on GitHub `__ The following 8 authors contributed 26 commits. * Brandon T. Willard * juanis2112 * lllf * Matthias Bussonnier * Min ho Kim * Oriol (Prodesk) * Po-Chuan Hsieh * techassetskris Issues closed in 7.6 -------------------- GitHub stats for 2019/04/24 - 2019/06/28 (tag: 7.5.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 9 issues and merged 43 pull requests. The full list can be seen `on GitHub `__ The following 19 authors contributed 144 commits. * Alok Singh * Andreas * Antony Lee * Daniel Hahler * Ed OBrien * Kevin Sheppard * Luciana da Costa Marques * Maor Kleinberger * Matthias Bussonnier * Miro Hrončok * Niclas * Nikita Bezdolniy * Oriol Abril * Piers Titus van der Torren * Pragnya Srinivasan * Robin Gustafsson * stonebig * Thomas A Caswell * zzzz-qq Issues closed in 7.5 -------------------- GitHub stats for 2019/03/21 - 2019/04/24 (tag: 7.4.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 2 issues and merged 9 pull requests. The full list can be seen `on GitHub `__ The following 7 authors contributed 28 commits. * Akshay Paropkari * Benjamin Ragan-Kelley * Ivan Tham * Matthias Bussonnier * Nick Tallant * Sebastian Witowski * stef-ubuntu Issues closed in 7.4 -------------------- GitHub stats for 2019/02/18 - 2019/03/21 (tag: 7.3.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 9 issues and merged 20 pull requests. The full list can be seen `on GitHub `__ The following 23 authors contributed 69 commits. * anatoly techtonik * Benjamin Ragan-Kelley * bnables * Frédéric Chapoton * Gabriel Potter * Ian Bell * Jake VanderPlas * Jan S. (Milania1) * Jesse Widner * jsnydes * Kyungdahm Yun * Laurent Gautier * Luciana da Costa Marques * Matan Gover * Matthias Bussonnier * memeplex * Mickaël Schoentgen * Partha P. Mukherjee * Philipp A * Sanyam Agarwal * Steve Nicholson * Tony Fast * Wouter Overmeire Issues closed in 7.3 -------------------- GitHub stats for 2018/11/30 - 2019/02/18 (tag: 7.2.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 4 issues and merged 20 pull requests. The full list can be seen `on GitHub `__ The following 17 authors contributed 99 commits. * anatoly techtonik * Benjamin Ragan-Kelley * Gabriel Potter * Ian Bell * Jake VanderPlas * Jan S. (Milania1) * Jesse Widner * Kyungdahm Yun * Laurent Gautier * Matthias Bussonnier * memeplex * Mickaël Schoentgen * Partha P. Mukherjee * Philipp A * Sanyam Agarwal * Steve Nicholson * Tony Fast Issues closed in 7.2 -------------------- GitHub stats for 2018/10/28 - 2018/11/29 (tag: 7.1.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 2 issues and merged 18 pull requests. The full list can be seen `on GitHub `__ The following 16 authors contributed 95 commits. * Antony Lee * Benjamin Ragan-Kelley * CarsonGSmith * Chris Mentzel * Christopher Brown * Dan Allan * Elliott Morgan Jobson * is-this-valid * kd2718 * Kevin Hess * Martin Bergtholdt * Matthias Bussonnier * Nicholas Bollweg * Pavel Karateev * Philipp A * Reuben Morais Issues closed in 7.1 -------------------- GitHub stats for 2018/09/27 - 2018/10/27 (since tag: 7.0.1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 31 issues and merged 54 pull requests. The full list can be seen `on GitHub `__ The following 33 authors contributed 254 commits. * ammarmallik * Audrey Dutcher * Bart Skowron * Benjamin Ragan-Kelley * BinaryCrochet * Chris Barker * Christopher Moura * Dedipyaman Das * Dominic Kuang * Elyashiv * Emil Hessman * felixzhuologist * hongshaoyang * Hugo * kd2718 * kory donati * Kory Donati * koryd * luciana * luz.paz * Massimo Santini * Matthias Bussonnier * Matthias Geier * meeseeksdev[bot] * Michael Penkov * Mukesh Bhandarkar * Nguyen Duy Hai * Roy Wellington Ⅳ * Sha Liu * Shao Yang * Shashank Kumar * Tony Fast * wim glenn Issues closed in 7.0 -------------------- GitHub stats for 2018/07/29 - 2018/09/27 (since tag: 6.5.0) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 20 issues and merged 76 pull requests. The full list can be seen `on GitHub `__ The following 49 authors contributed 471 commits. * alphaCTzo7G * Alyssa Whitwell * Anatol Ulrich * apunisal * Benjamin Ragan-Kelley * Chaz Reid * Christoph * Dale Jung * Dave Hirschfeld * dhirschf * Doug Latornell * Fernando Perez * Fred Mitchell * Gabriel Potter * gpotter2 * Grant Nestor * hongshaoyang * Hugo * J Forde * Jonathan Slenders * Jörg Dietrich * Kyle Kelley * luz.paz * M Pacer * Matthew R. Scott * Matthew Seal * Matthias Bussonnier * meeseeksdev[bot] * Michael Käufl * Olesya Baranova * oscar6echo * Paul Ganssle * Paul Ivanov * Peter Parente * prasanth * Shailyn javier Ortiz jimenez * Sourav Singh * Srinivas Reddy Thatiparthy * Steven Silvester * stonebig * Subhendu Ranjan Mishra * Takafumi Arakaki * Thomas A Caswell * Thomas Kluyver * Todd * Wei Yen * Yarko Tymciurak * Yutao Yuan * Zi Chong Kao ipython-8.35.0/docs/source/whatsnew/github-stats-8.rst000066400000000000000000000037221477474304100227250ustar00rootroot00000000000000Issues closed in the 8.x development cycle ========================================== GitHub stats for 2022/01/05 - 2022/01/12 (tag: 8.0.0rc1) These lists are automatically generated, and may be incomplete or contain duplicates. We closed 26 issues and merged 307 pull requests. The full list can be seen `on GitHub `__ The following 99 authors contributed 372 commits. * 007vedant * Adam Hackbarth * Aditya Sathe * Ahmed Fasih * Albert Zhang * Alex Hall * Andrew Port * Ankitsingh6299 * Arthur Moreira * Ashwin Vishnu * Augusto * BaoGiang HoangVu * bar-hen * Bart Skowron * Bartosz Telenczuk * Bastian Ebeling * Benjamin Ragan-Kelley * Blazej Michalik * blois * Boyuan Liu * Brendan Gerrity * Carol Willing * Coco Bennett * Coco Mishra * Corentin Cadiou * Daniel Goldfarb * Daniel Mietchen * Daniel Shimon * digitalvirtuoso * Dimitri Papadopoulos * dswij * Eric Wieser * Erik * Ethan Madden * Faris A Chugthai * farisachugthai * Gal B * gorogoroumaru * Hussaina Begum Nandyala * Inception95 * Iwan Briquemont * Jake VanderPlas * Jakub Klus * James Morris * Jay Qi * Jeroen Bédorf * Joyce Er * juacrumar * Juan Luis Cano Rodríguez * Julien Rabinow * Justin Palmer * Krzysztof Cybulski * L0uisJ0shua * lbennett * LeafyLi * Lightyagami1 * Lumir Balhar * Mark Schmitz * Martin Skarzynski * martinRenou * Matt Wozniski * Matthias Bussonnier * Meysam Azad * Michael T * Michael Tiemann * Naelson Douglas * Nathan Goldbaum * Nick Muoh * nicolaslazo * Nikita Kniazev * NotWearingPants * Paul Ivanov * Paulo S. Costa * Pete Blois * Peter Corke * PhanatosZou * Piers Titus van der Torren * Rakessh Roshan * Ram Rachum * rchiodo * Reilly Tucker Siemens * Romulo Filho * rushabh-v * Sammy Al Hashemi * Samreen Zarroug * Samuel Gaist * Sanjana-03 * Scott Sanderson * skalaydzhiyski * sleeping * Snir Broshi * Spas Kalaydzhisyki * Sylvain Corlay * Terry Davis * Timur Kushukov * Tobias Bengfort * Tomasz Kłoczko * Yonatan Goldschmidt * 谭九鼎 ipython-8.35.0/docs/source/whatsnew/index.rst000066400000000000000000000034131477474304100212460ustar00rootroot00000000000000.. Developers should add in this file, during each release cycle, information .. about important changes they've made, in a summary format that's meant for .. end users. For each release we normally have three sections: features, bug .. fixes and api breakage. .. Please remember to credit the authors of the contributions by name, .. especially when they are new users or developers who do not regularly .. participate in IPython's development. .. _whatsnew_index: ===================== What's new in IPython ===================== .. this will appear in the docs if we are not releasing a version (ie if `_version_extra` in release.py is an empty string) .. only:: ipydev Development version in-progress features: .. toctree:: development This section documents the changes that have been made in various versions of IPython. Users should consult these pages to learn about new features, bug fixes and backwards incompatibilities. Developers should summarize the development work they do here in a user friendly format. .. toctree:: :maxdepth: 1 version8 github-stats-8 version7 github-stats-7 version6 github-stats-6 version5 github-stats-5 version4 github-stats-4 version3 github-stats-3 version3_widget_migration version2.0 github-stats-2.0 version1.0 github-stats-1.0 version0.13 github-stats-0.13 version0.12 github-stats-0.12 version0.11 github-stats-0.11 version0.10 version0.9 version0.8 .. this makes a hidden toctree that keeps sphinx from complaining about documents included nowhere when building docs for stable We place it at the end as it will still be reachable via prev/next links. .. only:: ipystable .. toctree:: :hidden: development ipython-8.35.0/docs/source/whatsnew/pr/000077500000000000000000000000001477474304100200255ustar00rootroot00000000000000ipython-8.35.0/docs/source/whatsnew/pr/README.md000066400000000000000000000020141477474304100213010ustar00rootroot00000000000000Documenting What's New ---------------------- When making a new pull request that either adds a new feature, or makes a backwards-incompatible change to IPython, please add a new `.rst` file in this directory documenting this change as a part of your Pull Request. This will allow multiple Pull Requests to do the same without conflicting with one another. Periodically, IPython developers with commit rights will run a script and populate [development.rst](../development.rst) with the contents of this directory, and clean it up. Files which describe new features can have any name, such as `antigravity-feature.rst`, whereas backwards incompatible changes **must have** have a filename starting with `incompat-`, such as `incompat-switching-to-perl.rst`. Our "What's new" files always have two sections, and this prefix scheme will make sure that the backwards incompatible changes get routed to their proper section. To merge these files into :file:`whatsnew/development.rst`, run the script :file:`tools/update_whatsnew.py`. ipython-8.35.0/docs/source/whatsnew/pr/antigravity-feature.rst000066400000000000000000000001741477474304100245530ustar00rootroot00000000000000Antigravity feature =================== Example new antigravity feature. Try ``import antigravity`` in a Python 3 console. ipython-8.35.0/docs/source/whatsnew/pr/incompat-switching-to-perl.rst000066400000000000000000000003771477474304100257550ustar00rootroot00000000000000Incompatible change switch to perl ---------------------------------- Document which filename start with ``incompat-`` will be gathers in their own incompatibility section. Starting with IPython 42, only perl code execution is allowed. See :ghpull:`42` ipython-8.35.0/docs/source/whatsnew/version0.10.rst000066400000000000000000000361111477474304100221240ustar00rootroot00000000000000============= 0.10 series ============= Release 0.10.2 ============== IPython 0.10.2 was released April 9, 2011. This is a minor bugfix release that preserves backward compatibility. At this point, all IPython development resources are focused on the 0.11 series that includes a complete architectural restructuring of the project as well as many new capabilities, so this is likely to be the last release of the 0.10.x series. We have tried to fix all major bugs in this series so that it remains a viable platform for those not ready yet to transition to the 0.11 and newer codebase (since that will require some porting effort, as a number of APIs have changed). Thus, we are not opening a 0.10.3 active development branch yet, but if the user community requires new patches and is willing to maintain/release such a branch, we'll be happy to host it on the IPython github repositories. Highlights of this release: - The main one is the closing of github ticket #185, a major regression we had in 0.10.1 where pylab mode with GTK (or gthread) was not working correctly, hence plots were blocking with GTK. Since this is the default matplotlib backend on Unix systems, this was a major annoyance for many users. Many thanks to Paul Ivanov for helping resolve this issue. - Fix IOError bug on Windows when used with -gthread. - Work robustly if $HOME is missing from environment. - Better POSIX support in ssh scripts (remove bash-specific idioms). - Improved support for non-ascii characters in log files. - Work correctly in environments where GTK can be imported but not started (such as a linux text console without X11). For this release we merged 24 commits, contributed by the following people (please let us know if we omitted your name and we'll gladly fix this in the notes for the future): * Fernando Perez * MinRK * Paul Ivanov * Pieter Cristiaan de Groot * TvrtkoM Release 0.10.1 ============== IPython 0.10.1 was released October 11, 2010, over a year after version 0.10. This is mostly a bugfix release, since after version 0.10 was released, the development team's energy has been focused on the 0.11 series. We have nonetheless tried to backport what fixes we could into 0.10.1, as it remains the stable series that many users have in production systems they rely on. Since the 0.11 series changes many APIs in backwards-incompatible ways, we are willing to continue maintaining the 0.10.x series. We don't really have time to actively write new code for 0.10.x, but we are happy to accept patches and pull requests on the IPython `github site`_. If sufficient contributions are made that improve 0.10.1, we will roll them into future releases. For this purpose, we will have a branch called 0.10.2 on github, on which you can base your contributions. .. _github site: http://github.com/ipython For this release, we applied approximately 60 commits totaling a diff of over 7000 lines:: (0.10.1)amirbar[dist]> git diff --oneline rel-0.10.. | wc -l 7296 Highlights of this release: - The only significant new feature is that IPython's parallel computing machinery now supports natively the Sun Grid Engine and LSF schedulers. This work was a joint contribution from Justin Riley, Satra Ghosh and Matthieu Brucher, who put a lot of work into it. We also improved traceback handling in remote tasks, as well as providing better control for remote task IDs. - New IPython Sphinx directive contributed by John Hunter. You can use this directive to mark blocks in reStructuredText documents as containing IPython syntax (including figures) and the will be executed during the build: .. sourcecode:: ipython In [2]: plt.figure() # ensure a fresh figure @savefig psimple.png width=4in In [3]: plt.plot([1,2,3]) Out[3]: [] - Various fixes to the standalone ipython-wx application. - We now ship internally the excellent argparse library, graciously licensed under BSD terms by Steven Bethard. Now (2010) that argparse has become part of Python 2.7 this will be less of an issue, but Steven's relicensing allowed us to start updating IPython to using argparse well before Python 2.7. Many thanks! - Robustness improvements so that IPython doesn't crash if the readline library is absent (though obviously a lot of functionality that requires readline will not be available). - Improvements to tab completion in Emacs with Python 2.6. - Logging now supports timestamps (see ``%logstart?`` for full details). - A long-standing and quite annoying bug where parentheses would be added to ``print`` statements, under Python 2.5 and 2.6, was finally fixed. - Improved handling of libreadline on Apple OSX. - Fix ``reload`` method of IPython demos, which was broken. - Fixes for the ipipe/ibrowse system on OSX. - Fixes for Zope profile. - Fix %timeit reporting when the time is longer than 1000s. - Avoid lockups with ? or ?? in SunOS, due to a bug in termios. - The usual assortment of miscellaneous bug fixes and small improvements. The following people contributed to this release (please let us know if we omitted your name and we'll gladly fix this in the notes for the future): * Beni Cherniavsky * Boyd Waters. * David Warde-Farley * Fernando Perez * Gökhan Sever * John Hunter * Justin Riley * Kiorky * Laurent Dufrechou * Mark E. Smith * Matthieu Brucher * Satrajit Ghosh * Sebastian Busch * Václav Šmilauer Release 0.10 ============ This release brings months of slow but steady development, and will be the last before a major restructuring and cleanup of IPython's internals that is already under way. For this reason, we hope that 0.10 will be a stable and robust release so that while users adapt to some of the API changes that will come with the refactoring that will become IPython 0.11, they can safely use 0.10 in all existing projects with minimal changes (if any). IPython 0.10 is now a medium-sized project, with roughly (as reported by David Wheeler's :command:`sloccount` utility) 40750 lines of Python code, and a diff between 0.9.1 and this release that contains almost 28000 lines of code and documentation. Our documentation, in PDF format, is a 495-page long PDF document (also available in HTML format, both generated from the same sources). Many users and developers contributed code, features, bug reports and ideas to this release. Please do not hesitate in contacting us if we've failed to acknowledge your contribution here. In particular, for this release we have contribution from the following people, a mix of new and regular names (in alphabetical order by first name): * Alexander Clausen: fix #341726. * Brian Granger: lots of work everywhere (features, bug fixes, etc). * Daniel Ashbrook: bug report on MemoryError during compilation, now fixed. * Darren Dale: improvements to documentation build system, feedback, design ideas. * Fernando Perez: various places. * Gaël Varoquaux: core code, ipythonx GUI, design discussions, etc. Lots... * John Hunter: suggestions, bug fixes, feedback. * Jorgen Stenarson: work on many fronts, tests, fixes, win32 support, etc. * Laurent Dufréchou: many improvements to ipython-wx standalone app. * Lukasz Pankowski: prefilter, `%edit`, demo improvements. * Matt Foster: TextMate support in `%edit`. * Nathaniel Smith: fix #237073. * Pauli Virtanen: fixes and improvements to extensions, documentation. * Prabhu Ramachandran: improvements to `%timeit`. * Robert Kern: several extensions. * Sameer D'Costa: help on critical bug #269966. * Stephan Peijnik: feedback on Debian compliance and many man pages. * Steven Bethard: we are now shipping his :mod:`argparse` module. * Tom Fetherston: many improvements to :mod:`IPython.demo` module. * Ville Vainio: lots of work everywhere (features, bug fixes, etc). * Vishal Vasta: ssh support in ipcluster. * Walter Doerwald: work on the :mod:`IPython.ipipe` system. Below we give an overview of new features, bug fixes and backwards-incompatible changes. For a detailed account of every change made, feel free to view the project log with :command:`bzr log`. New features ------------ * New `%paste` magic automatically extracts current contents of clipboard and pastes it directly, while correctly handling code that is indented or prepended with `>>>` or `...` python prompt markers. A very useful new feature contributed by Robert Kern. * IPython 'demos', created with the :mod:`IPython.demo` module, can now be created from files on disk or strings in memory. Other fixes and improvements to the demo system, by Tom Fetherston. * Added :func:`find_cmd` function to :mod:`IPython.platutils` module, to find commands in a cross-platform manner. * Many improvements and fixes to Gaël Varoquaux's :command:`ipythonx`, a WX-based lightweight IPython instance that can be easily embedded in other WX applications. These improvements have made it possible to now have an embedded IPython in Mayavi and other tools. * :class:`MultiengineClient` objects now have a :meth:`benchmark` method. * The manual now includes a full set of auto-generated API documents from the code sources, using Sphinx and some of our own support code. We are now using the `Numpy Documentation Standard`_ for all docstrings, and we have tried to update as many existing ones as possible to this format. * The new :mod:`IPython.Extensions.ipy_pretty` extension by Robert Kern provides configurable pretty-printing. * Many improvements to the :command:`ipython-wx` standalone WX-based IPython application by Laurent Dufréchou. It can optionally run in a thread, and this can be toggled at runtime (allowing the loading of Matplotlib in a running session without ill effects). * IPython includes a copy of Steven Bethard's argparse_ in the :mod:`IPython.external` package, so we can use it internally and it is also available to any IPython user. By installing it in this manner, we ensure zero conflicts with any system-wide installation you may already have while minimizing external dependencies for new users. In IPython 0.10, We ship argparse version 1.0. * An improved and much more robust test suite, that runs groups of tests in separate subprocesses using either Nose or Twisted's :command:`trial` runner to ensure proper management of Twisted-using code. The test suite degrades gracefully if optional dependencies are not available, so that the :command:`iptest` command can be run with only Nose installed and nothing else. We also have more and cleaner test decorators to better select tests depending on runtime conditions, do setup/teardown, etc. * The new ipcluster now has a fully working ssh mode that should work on Linux, Unix and OS X. Thanks to Vishal Vatsa for implementing this! * The wonderful TextMate editor can now be used with %edit on OS X. Thanks to Matt Foster for this patch. * The documentation regarding parallel uses of IPython, including MPI and PBS, has been significantly updated and improved. * The developer guidelines in the documentation have been updated to explain our workflow using :command:`bzr` and Launchpad. * Fully refactored :command:`ipcluster` command line program for starting IPython clusters. This new version is a complete rewrite and 1) is fully cross platform (we now use Twisted's process management), 2) has much improved performance, 3) uses subcommands for different types of clusters, 4) uses argparse for parsing command line options, 5) has better support for starting clusters using :command:`mpirun`, 6) has experimental support for starting engines using PBS. It can also reuse FURL files, by appropriately passing options to its subcommands. However, this new version of ipcluster should be considered a technology preview. We plan on changing the API in significant ways before it is final. * Full description of the security model added to the docs. * cd completer: show bookmarks if no other completions are available. * sh profile: easy way to give 'title' to prompt: assign to variable '_prompt_title'. It looks like this:: [~]|1> _prompt_title = 'sudo!' sudo![~]|2> * %edit: If you do '%edit pasted_block', pasted_block variable gets updated with new data (so repeated editing makes sense) .. _Numpy Documentation Standard: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt#docstring-standard .. _argparse: http://code.google.com/p/argparse/ Bug fixes --------- * Fix #368719, removed top-level debian/ directory to make the job of Debian packagers easier. * Fix #291143 by including man pages contributed by Stephan Peijnik from the Debian project. * Fix #358202, effectively a race condition, by properly synchronizing file creation at cluster startup time. * `%timeit` now handles correctly functions that take a long time to execute even the first time, by not repeating them. * Fix #239054, releasing of references after exiting. * Fix #341726, thanks to Alexander Clausen. * Fix #269966. This long-standing and very difficult bug (which is actually a problem in Python itself) meant long-running sessions would inevitably grow in memory size, often with catastrophic consequences if users had large objects in their scripts. Now, using `%run` repeatedly should not cause any memory leaks. Special thanks to John Hunter and Sameer D'Costa for their help with this bug. * Fix #295371, bug in `%history`. * Improved support for py2exe. * Fix #270856: IPython hangs with PyGTK * Fix #270998: A magic with no docstring breaks the '%magic magic' * fix #271684: -c startup commands screw up raw vs. native history * Numerous bugs on Windows with the new ipcluster have been fixed. * The ipengine and ipcontroller scripts now handle missing furl files more gracefully by giving better error messages. * %rehashx: Aliases no longer contain dots. python3.0 binary will create alias python30. Fixes: #259716 "commands with dots in them don't work" * %cpaste: %cpaste -r repeats the last pasted block. The block is assigned to pasted_block even if code raises exception. * Bug #274067 'The code in get_home_dir is broken for py2exe' was fixed. * Many other small bug fixes not listed here by number (see the bzr log for more info). Backwards incompatible changes ------------------------------ * `ipykit` and related files were unmaintained and have been removed. * The :func:`IPython.genutils.doctest_reload` does not actually call `reload(doctest)` anymore, as this was causing many problems with the test suite. It still resets `doctest.master` to None. * While we have not deliberately broken Python 2.4 compatibility, only minor testing was done with Python 2.4, while 2.5 and 2.6 were fully tested. But if you encounter problems with 2.4, please do report them as bugs. * The :command:`ipcluster` now requires a mode argument; for example to start a cluster on the local machine with 4 engines, you must now type:: $ ipcluster local -n 4 * The controller now has a ``-r`` flag that needs to be used if you want to reuse existing furl files. Otherwise they are deleted (the default). * Remove ipy_leo.py. You can use :command:`easy_install ipython-extension` to get it. (done to decouple it from ipython release cycle) ipython-8.35.0/docs/source/whatsnew/version0.11.rst000066400000000000000000001041101477474304100221200ustar00rootroot00000000000000============= 0.11 Series ============= Release 0.11 ============ IPython 0.11 is a *major* overhaul of IPython, two years in the making. Most of the code base has been rewritten or at least reorganized, breaking backward compatibility with several APIs in previous versions. It is the first major release in two years, and probably the most significant change to IPython since its inception. We plan to have a relatively quick succession of releases, as people discover new bugs and regressions. Once we iron out any significant bugs in this process and settle down the new APIs, this series will become IPython 1.0. We encourage feedback now on the core APIs, which we hope to maintain stable during the 1.0 series. Since the internal APIs have changed so much, projects using IPython as a library (as opposed to end-users of the application) are the most likely to encounter regressions or changes that break their existing use patterns. We will make every effort to provide updated versions of the APIs to facilitate the transition, and we encourage you to contact us on the `development mailing list`__ with questions and feedback. .. __: http://mail.scipy.org/mailman/listinfo/ipython-dev Chris Fonnesbeck recently wrote an `excellent post`__ that highlights some of our major new features, with examples and screenshots. We encourage you to read it as it provides an illustrated, high-level overview complementing the detailed feature breakdown in this document. .. __: http://stronginference.com/post/innovations-in-ipython A quick summary of the major changes (see below for details): * **Standalone Qt console**: a new rich console has been added to IPython, started with `ipython qtconsole`. In this application we have tried to retain the feel of a terminal for fast and efficient workflows, while adding many features that a line-oriented terminal simply can not support, such as inline figures, full multiline editing with syntax highlighting, graphical tooltips for function calls and much more. This development was sponsored by `Enthought Inc.`__. See :ref:`below ` for details. .. __: http://enthought.com * **High-level parallel computing with ZeroMQ**. Using the same architecture that our Qt console is based on, we have completely rewritten our high-level parallel computing machinery that in prior versions used the Twisted networking framework. While this change will require users to update their codes, the improvements in performance, memory control and internal consistency across our codebase convinced us it was a price worth paying. We have tried to explain how to best proceed with this update, and will be happy to answer questions that may arise. A full tutorial describing these features `was presented at SciPy'11`__, more details :ref:`below `. .. __: http://minrk.github.com/scipy-tutorial-2011 * **New model for GUI/plotting support in the terminal**. Now instead of the various `-Xthread` flags we had before, GUI support is provided without the use of any threads, by directly integrating GUI event loops with Python's `PyOS_InputHook` API. A new command-line flag `--gui` controls GUI support, and it can also be enabled after IPython startup via the new `%gui` magic. This requires some changes if you want to execute GUI-using scripts inside IPython, see :ref:`the GUI support section ` for more details. * **A two-process architecture.** The Qt console is the first use of a new model that splits IPython between a kernel process where code is executed and a client that handles user interaction. We plan on also providing terminal and web-browser based clients using this infrastructure in future releases. This model allows multiple clients to interact with an IPython process through a :ref:`well-documented messaging protocol ` using the ZeroMQ networking library. * **Refactoring.** the entire codebase has been refactored, in order to make it more modular and easier to contribute to. IPython has traditionally been a hard project to participate because the old codebase was very monolithic. We hope this (ongoing) restructuring will make it easier for new developers to join us. * **Vim integration**. Vim can be configured to seamlessly control an IPython kernel, see the files in :file:`docs/examples/vim` for the full details. This work was done by Paul Ivanov, who prepared a nice `video demonstration`__ of the features it provides. .. __: http://pirsquared.org/blog/2011/07/28/vim-ipython/ * **Integration into Microsoft Visual Studio**. Thanks to the work of the Microsoft `Python Tools for Visual Studio`__ team, this version of IPython has been integrated into Microsoft Visual Studio's Python tools open source plug-in. `Details below`_ .. __: http://pytools.codeplex.com .. _details below: ms_visual_studio_011_ * **Improved unicode support**. We closed many bugs related to unicode input. * **Python 3**. IPython now runs on Python 3.x. See :ref:`python3_011` for details. * **New profile model**. Profiles are now directories that contain all relevant information for that session, and thus better isolate IPython use-cases. * **SQLite storage for history**. All history is now stored in a SQLite database, providing support for multiple simultaneous sessions that won't clobber each other as well as the ability to perform queries on all stored data. * **New configuration system**. All parts of IPython are now configured via a mechanism inspired by the Enthought Traits library. Any configurable element can have its attributes set either via files that now use real Python syntax or from the command-line. * **Pasting of code with prompts**. IPython now intelligently strips out input prompts , be they plain Python ones (``>>>`` and ``...``) or IPython ones (``In [N]:`` and ``...:``). More details :ref:`here `. Authors and support ------------------- Over 60 separate authors have contributed to this release, see :ref:`below ` for a full list. In particular, we want to highlight the extremely active participation of two new core team members: Evan Patterson implemented the Qt console, and Thomas Kluyver started with our Python 3 port and by now has made major contributions to just about every area of IPython. We are also grateful for the support we have received during this development cycle from several institutions: - `Enthought Inc`__ funded the development of our new Qt console, an effort that required developing major pieces of underlying infrastructure, which now power not only the Qt console but also our new parallel machinery. We'd like to thank Eric Jones and Travis Oliphant for their support, as well as Ilan Schnell for his tireless work integrating and testing IPython in the `Enthought Python Distribution`_. .. __: http://enthought.com .. _Enthought Python Distribution: http://www.enthought.com/products/epd.php - Nipy/NIH: funding via the `NiPy project`__ (NIH grant 5R01MH081909-02) helped us jumpstart the development of this series by restructuring the entire codebase two years ago in a way that would make modular development and testing more approachable. Without this initial groundwork, all the new features we have added would have been impossible to develop. .. __: http://nipy.org - Sage/NSF: funding via the grant `Sage: Unifying Mathematical Software for Scientists, Engineers, and Mathematicians`__ (NSF grant DMS-1015114) supported a meeting in spring 2011 of several of the core IPython developers where major progress was made integrating the last key pieces leading to this release. .. __: http://modular.math.washington.edu/grants/compmath09 - Microsoft's team working on `Python Tools for Visual Studio`__ developed the integratron of IPython into the Python plugin for Visual Studio 2010. .. __: http://pytools.codeplex.com - Google Summer of Code: in 2010, we had two students developing prototypes of the new machinery that is now maturing in this release: `Omar Zapata`_ and `Gerardo Gutiérrez`_. .. _Omar Zapata: http://ipythonzmq.blogspot.com/2010/08/ipython-zmq-status.html .. _Gerardo Gutiérrez: http://ipythonqt.blogspot.com/2010/04/ipython-qt-interface-gsoc-2010-proposal.html> Development summary: moving to Git and Github --------------------------------------------- In April 2010, after `one breakage too many with bzr`__, we decided to move our entire development process to Git and Github.com. This has proven to be one of the best decisions in the project's history, as the combination of git and github have made us far, far more productive than we could be with our previous tools. We first converted our bzr repo to a git one without losing history, and a few weeks later ported all open Launchpad bugs to github issues with their comments mostly intact (modulo some formatting changes). This ensured a smooth transition where no development history or submitted bugs were lost. Feel free to use our little Launchpad to Github issues `porting script`_ if you need to make a similar transition. .. __: http://mail.scipy.org/pipermail/ipython-dev/2010-April/005944.html .. _porting script: https://gist.github.com/835577 These simple statistics show how much work has been done on the new release, by comparing the current code to the last point it had in common with the 0.10 series. A huge diff and ~2200 commits make up this cycle:: git diff $(git merge-base 0.10.2 HEAD) | wc -l 288019 git log $(git merge-base 0.10.2 HEAD)..HEAD --oneline | wc -l 2200 Since our move to github, 511 issues were closed, 226 of which were pull requests and 285 regular issues (:ref:`a full list with links ` is available for those interested in the details). Github's pull requests are a fantastic mechanism for reviewing code and building a shared ownership of the project, and we are making enthusiastic use of it. .. Note:: This undercounts the number of issues closed in this development cycle, since we only moved to github for issue tracking in May 2010, but we have no way of collecting statistics on the number of issues closed in the old Launchpad bug tracker prior to that. .. _qtconsole_011: Qt Console ---------- IPython now ships with a Qt application that feels very much like a terminal, but is in fact a rich GUI that runs an IPython client but supports inline figures, saving sessions to PDF and HTML, multiline editing with syntax highlighting, graphical calltips and much more: .. figure:: ../_images/qtconsole.png :width: 400px :alt: IPython Qt console with embedded plots :align: center :target: ../_images/qtconsole.png The Qt console for IPython, using inline matplotlib plots. We hope that many projects will embed this widget, which we've kept deliberately very lightweight, into their own environments. In the future we may also offer a slightly more featureful application (with menus and other GUI elements), but we remain committed to always shipping this easy to embed widget. See the `Jupyter Qt Console site `_ for a detailed description of the console's features and use. .. _parallel_011: High-level parallel computing with ZeroMQ ----------------------------------------- We have completely rewritten the Twisted-based code for high-level parallel computing to work atop our new ZeroMQ architecture. While we realize this will break compatibility for a number of users, we hope to make the transition as easy as possible with our docs, and we are convinced the change is worth it. ZeroMQ provides us with much tighter control over memory, higher performance, and its communications are impervious to the Python Global Interpreter Lock because they take place in a system-level C++ thread. The impact of the GIL in our previous code was something we could simply not work around, given that Twisted is itself a Python library. So while Twisted is a very capable framework, we think ZeroMQ fits our needs much better and we hope you will find the change to be a significant improvement in the long run. Our manual contains a full description of how to use IPython for parallel computing, and the `tutorial`__ presented by Min Ragan-Kelley at the SciPy 2011 conference provides a hands-on complement to the reference docs. .. __: http://minrk.github.com/scipy-tutorial-2011 Refactoring ----------- As of this release, a significant portion of IPython has been refactored. This refactoring is founded on a number of new abstractions. The main new classes that implement these abstractions are: * :class:`traitlets.HasTraits`. * :class:`traitlets.config.configurable.Configurable`. * :class:`traitlets.config.application.Application`. * :class:`traitlets.config.loader.ConfigLoader`. * :class:`traitlets.config.loader.Config` We are still in the process of writing developer focused documentation about these classes, but for now our :ref:`configuration documentation ` contains a high level overview of the concepts that these classes express. The biggest user-visible change is likely the move to using the config system to determine the command-line arguments for IPython applications. The benefit of this is that *all* configurable values in IPython are exposed on the command-line, but the syntax for specifying values has changed. The gist is that assigning values is pure Python assignment. Simple flags exist for commonly used options, these are always prefixed with '--'. The IPython command-line help has the details of all the options (via ``ipython --help``), but a simple example should clarify things; the ``pylab`` flag can be used to start in pylab mode with the qt4 backend:: ipython --pylab=qt which is equivalent to using the fully qualified form:: ipython --TerminalIPythonApp.pylab=qt The long-form options can be listed via ``ipython --help-all``. ZeroMQ architecture ------------------- There is a new GUI framework for IPython, based on a client-server model in which multiple clients can communicate with one IPython kernel, using the ZeroMQ messaging framework. There is already a Qt console client, which can be started by calling ``ipython qtconsole``. The protocol is :ref:`documented `. The parallel computing framework has also been rewritten using ZMQ. The protocol is described in the ipyparallel documentation, and the code is in the new :mod:`IPython.parallel` module. .. _python3_011: Python 3 support ---------------- A Python 3 version of IPython has been prepared. For the time being, this is maintained separately and updated from the main codebase. Its code can be found `here `_. The parallel computing components are not perfect on Python3, but most functionality appears to be working. As this work is evolving quickly, the best place to find updated information about it is our `Python 3 wiki page`__. .. __: http://wiki.ipython.org/index.php?title=Python_3 Unicode ------- Entering non-ascii characters in unicode literals (``u"€ø"``) now works properly on all platforms. However, entering these in byte/string literals (``"€ø"``) will not work as expected on Windows (or any platform where the terminal encoding is not UTF-8, as it typically is for Linux & Mac OS X). You can use escape sequences (``"\xe9\x82"``) to get bytes above 128, or use unicode literals and encode them. This is a limitation of Python 2 which we cannot easily work around. .. _ms_visual_studio_011: Integration with Microsoft Visual Studio ---------------------------------------- IPython can be used as the interactive shell in the `Python plugin for Microsoft Visual Studio`__, as seen here: .. figure:: ../_images/ms_visual_studio.png :width: 500px :alt: IPython console embedded in Microsoft Visual Studio. :align: center :target: ../_images/ms_visual_studio.png IPython console embedded in Microsoft Visual Studio. The Microsoft team developing this currently has a release candidate out using IPython 0.11. We will continue to collaborate with them to ensure that as they approach their final release date, the integration with IPython remains smooth. We'd like to thank Dino Viehland and Shahrokh Mortazavi for the work they have done towards this feature, as well as Wenming Ye for his support of our WinHPC capabilities. .. __: http://pytools.codeplex.com Additional new features ----------------------- * Added ``Bytes`` traitlet, removing ``Str``. All 'string' traitlets should either be ``Unicode`` if a real string, or ``Bytes`` if a C-string. This removes ambiguity and helps the Python 3 transition. * New magic ``%loadpy`` loads a python file from disk or web URL into the current input buffer. * New magic ``%pastebin`` for sharing code via the 'Lodge it' pastebin. * New magic ``%precision`` for controlling float and numpy pretty printing. * IPython applications initiate logging, so any object can gain access to a the logger of the currently running Application with: .. sourcecode:: python from traitlets.config.application import Application logger = Application.instance().log * You can now get help on an object halfway through typing a command. For instance, typing ``a = zip?`` shows the details of :func:`zip`. It also leaves the command at the next prompt so you can carry on with it. * The input history is now written to an SQLite database. The API for retrieving items from the history has also been redesigned. * The :mod:`IPython.extensions.pretty` extension has been moved out of quarantine and fully updated to the new extension API. * New magics for loading/unloading/reloading extensions have been added: ``%load_ext``, ``%unload_ext`` and ``%reload_ext``. * The configuration system and configuration files are brand new. See the configuration system :ref:`documentation ` for more details. * The :class:`~IPython.core.interactiveshell.InteractiveShell` class is now a :class:`~traitlets.config.configurable.Configurable` subclass and has traitlets that determine the defaults and runtime environment. The ``__init__`` method has also been refactored so this class can be instantiated and run without the old :mod:`ipmaker` module. * The methods of :class:`~IPython.core.interactiveshell.InteractiveShell` have been organized into sections to make it easier to turn more sections of functionality into components. * The embedded shell has been refactored into a truly standalone subclass of :class:`InteractiveShell` called :class:`InteractiveShellEmbed`. All embedding logic has been taken out of the base class and put into the embedded subclass. * Added methods of :class:`~IPython.core.interactiveshell.InteractiveShell` to help it cleanup after itself. The :meth:`cleanup` method controls this. We couldn't do this in :meth:`__del__` because we have cycles in our object graph that prevent it from being called. * Created a new module :mod:`IPython.utils.importstring` for resolving strings like ``foo.bar.Bar`` to the actual class. * Completely refactored the :mod:`IPython.core.prefilter` module into :class:`~traitlets.config.configurable.Configurable` subclasses. Added a new layer into the prefilter system, called "transformations" that all new prefilter logic should use (rather than the older "checker/handler" approach). * Aliases are now components (:mod:`IPython.core.alias`). * New top level :func:`~IPython.frontend.terminal.embed.embed` function that can be called to embed IPython at any place in user's code. On the first call it will create an :class:`~IPython.frontend.terminal.embed.InteractiveShellEmbed` instance and call it. In later calls, it just calls the previously created :class:`~IPython.frontend.terminal.embed.InteractiveShellEmbed`. * Created a configuration system (:mod:`traitlets.config.configurable`) that is based on :mod:`traitlets`. Configurables are arranged into a runtime containment tree (not inheritance) that i) automatically propagates configuration information and ii) allows singletons to discover each other in a loosely coupled manner. In the future all parts of IPython will be subclasses of :class:`~traitlets.config.configurable.Configurable`. All IPython developers should become familiar with the config system. * Created a new :class:`~traitlets.config.loader.Config` for holding configuration information. This is a dict like class with a few extras: i) it supports attribute style access, ii) it has a merge function that merges two :class:`~traitlets.config.loader.Config` instances recursively and iii) it will automatically create sub-:class:`~traitlets.config.loader.Config` instances for attributes that start with an uppercase character. * Created new configuration loaders in :mod:`traitlets.config.loader`. These loaders provide a unified loading interface for all configuration information including command line arguments and configuration files. We have two default implementations based on :mod:`argparse` and plain python files. These are used to implement the new configuration system. * Created a top-level :class:`Application` class in :mod:`IPython.core.application` that is designed to encapsulate the starting of any basic Python program. An application loads and merges all the configuration objects, constructs the main application, configures and initiates logging, and creates and configures any :class:`Configurable` instances and then starts the application running. An extended :class:`BaseIPythonApplication` class adds logic for handling the IPython directory as well as profiles, and all IPython entry points extend it. * The :class:`Type` and :class:`Instance` traitlets now handle classes given as strings, like ``foo.bar.Bar``. This is needed for forward declarations. But, this was implemented in a careful way so that string to class resolution is done at a single point, when the parent :class:`~traitlets.HasTraitlets` is instantiated. * :mod:`IPython.utils.ipstruct` has been refactored to be a subclass of dict. It also now has full docstrings and doctests. * Created a Traits like implementation in :mod:`traitlets`. This is a pure Python, lightweight version of a library that is similar to Enthought's Traits project, but has no dependencies on Enthought's code. We are using this for validation, defaults and notification in our new component system. Although it is not 100% API compatible with Enthought's Traits, we plan on moving in this direction so that eventually our implementation could be replaced by a (yet to exist) pure Python version of Enthought Traits. * Added a new module :mod:`IPython.lib.inputhook` to manage the integration with GUI event loops using `PyOS_InputHook`. See the docstrings in this module or the main IPython docs for details. * For users, GUI event loop integration is now handled through the new :command:`%gui` magic command. Type ``%gui?`` at an IPython prompt for documentation. * For developers :mod:`IPython.lib.inputhook` provides a simple interface for managing the event loops in their interactive GUI applications. Examples can be found in our :file:`examples/lib` directory. Backwards incompatible changes ------------------------------ * The Twisted-based :mod:`IPython.kernel` has been removed, and completely rewritten as :mod:`IPython.parallel`, using ZeroMQ. * Profiles are now directories. Instead of a profile being a single config file, profiles are now self-contained directories. By default, profiles get their own IPython history, log files, and everything. To create a new profile, do ``ipython profile create ``. * All IPython applications have been rewritten to use :class:`~traitlets.config.loader.KeyValueConfigLoader`. This means that command-line options have changed. Now, all configurable values are accessible from the command-line with the same syntax as in a configuration file. * The command line options ``-wthread``, ``-qthread`` and ``-gthread`` have been removed. Use ``--gui=wx``, ``--gui=qt``, ``--gui=gtk`` instead. * The extension loading functions have been renamed to :func:`load_ipython_extension` and :func:`unload_ipython_extension`. * :class:`~IPython.core.interactiveshell.InteractiveShell` no longer takes an ``embedded`` argument. Instead just use the :class:`~IPython.core.interactiveshell.InteractiveShellEmbed` class. * ``__IPYTHON__`` is no longer injected into ``__builtin__``. * :meth:`Struct.__init__` no longer takes `None` as its first argument. It must be a :class:`dict` or :class:`Struct`. * :meth:`~IPython.core.interactiveshell.InteractiveShell.ipmagic` has been renamed :meth:`~IPython.core.interactiveshell.InteractiveShell.magic.` * The functions :func:`ipmagic` and :func:`ipalias` have been removed from :mod:`__builtins__`. * The references to the global :class:`~IPython.core.interactivehell.InteractiveShell` instance (``_ip``, and ``__IP``) have been removed from the user's namespace. They are replaced by a new function called :func:`get_ipython` that returns the current :class:`~IPython.core.interactiveshell.InteractiveShell` instance. This function is injected into the user's namespace and is now the main way of accessing the running IPython. * Old style configuration files :file:`ipythonrc` and :file:`ipy_user_conf.py` are no longer supported. Users should migrate there configuration files to the new format described :doc:`here ` and :ref:`here `. * The old IPython extension API that relied on :func:`ipapi` has been completely removed. The new extension API is described :ref:`here `. * Support for ``qt3`` has been dropped. Users who need this should use previous versions of IPython. * Removed :mod:`shellglobals` as it was obsolete. * Removed all the threaded shells in :mod:`IPython.core.shell`. These are no longer needed because of the new capabilities in :mod:`IPython.lib.inputhook`. * New top-level sub-packages have been created: :mod:`IPython.core`, :mod:`IPython.lib`, :mod:`IPython.utils`, :mod:`IPython.deathrow`, :mod:`IPython.quarantine`. All existing top-level modules have been moved to appropriate sub-packages. All internal import statements have been updated and tests have been added. The build system (setup.py and friends) have been updated. See :doc:`/api/index` for details of these new sub-packages. * :mod:`IPython.ipapi` has been moved to :mod:`IPython.core.ipapi`. :mod:`IPython.Shell` and :mod:`IPython.iplib` have been split and removed as part of the refactor. * :mod:`Extensions` has been moved to :mod:`extensions` and all existing extensions have been moved to either :mod:`IPython.quarantine` or :mod:`IPython.deathrow`. :mod:`IPython.quarantine` contains modules that we plan on keeping but that need to be updated. :mod:`IPython.deathrow` contains modules that are either dead or that should be maintained as third party libraries. * Previous IPython GUIs in :mod:`IPython.frontend` and :mod:`IPython.gui` are likely broken, and have been removed to :mod:`IPython.deathrow` because of the refactoring in the core. With proper updates, these should still work. Known Regressions ----------------- We do our best to improve IPython, but there are some known regressions in 0.11 relative to 0.10.2. First of all, there are features that have yet to be ported to the new APIs, and in order to ensure that all of the installed code runs for our users, we have moved them to two separate directories in the source distribution, `quarantine` and `deathrow`. Finally, we have some other miscellaneous regressions that we hope to fix as soon as possible. We now describe all of these in more detail. Quarantine ~~~~~~~~~~ These are tools and extensions that we consider relatively easy to update to the new classes and APIs, but that we simply haven't had time for. Any user who is interested in one of these is encouraged to help us by porting it and submitting a pull request on our `development site`_. .. _development site: http://github.com/ipython/ipython Currently, the quarantine directory contains:: clearcmd.py ipy_fsops.py ipy_signals.py envpersist.py ipy_gnuglobal.py ipy_synchronize_with.py ext_rescapture.py ipy_greedycompleter.py ipy_system_conf.py InterpreterExec.py ipy_jot.py ipy_which.py ipy_app_completers.py ipy_lookfor.py ipy_winpdb.py ipy_autoreload.py ipy_profile_doctest.py ipy_workdir.py ipy_completers.py ipy_pydb.py jobctrl.py ipy_editors.py ipy_rehashdir.py ledit.py ipy_exportdb.py ipy_render.py pspersistence.py ipy_extutil.py ipy_server.py win32clip.py Deathrow ~~~~~~~~ These packages may be harder to update or make most sense as third-party libraries. Some of them are completely obsolete and have been already replaced by better functionality (we simply haven't had the time to carefully weed them out so they are kept here for now). Others simply require fixes to code that the current core team may not be familiar with. If a tool you were used to is included here, we encourage you to contact the dev list and we can discuss whether it makes sense to keep it in IPython (if it can be maintained). Currently, the deathrow directory contains:: astyle.py ipy_defaults.py ipy_vimserver.py dtutils.py ipy_kitcfg.py numeric_formats.py Gnuplot2.py ipy_legacy.py numutils.py GnuplotInteractive.py ipy_p4.py outputtrap.py GnuplotRuntime.py ipy_profile_none.py PhysicalQInput.py ibrowse.py ipy_profile_numpy.py PhysicalQInteractive.py igrid.py ipy_profile_scipy.py quitter.py* ipipe.py ipy_profile_sh.py scitedirector.py iplib.py ipy_profile_zope.py Shell.py ipy_constants.py ipy_traits_completer.py twshell.py Other regressions ~~~~~~~~~~~~~~~~~ * The machinery that adds functionality to the 'sh' profile for using IPython as your system shell has not been updated to use the new APIs. As a result, only the aesthetic (prompt) changes are still implemented. We intend to fix this by 0.12. Tracked as issue 547_. .. _547: https://github.com/ipython/ipython/issues/547 * The installation of scripts on Windows was broken without setuptools, so we now depend on setuptools on Windows. We hope to fix setuptools-less installation, and then remove the setuptools dependency. Issue 539_. .. _539: https://github.com/ipython/ipython/issues/539 * The directory history `_dh` is not saved between sessions. Issue 634_. .. _634: https://github.com/ipython/ipython/issues/634 Removed Features ---------------- As part of the updating of IPython, we have removed a few features for the purposes of cleaning up the codebase and interfaces. These removals are permanent, but for any item listed below, equivalent functionality is available. * The magics Exit and Quit have been dropped as ways to exit IPython. Instead, the lowercase forms of both work either as a bare name (``exit``) or a function call (``exit()``). You can assign these to other names using exec_lines in the config file. .. _credits_011: Credits ------- Many users and developers contributed code, features, bug reports and ideas to this release. Please do not hesitate in contacting us if we've failed to acknowledge your contribution here. In particular, for this release we have contribution from the following people, a mix of new and regular names (in alphabetical order by first name): * Aenugu Sai Kiran Reddy * andy wilson * Antonio Cuni * Barry Wark * Beetoju Anuradha * Benjamin Ragan-Kelley * Brad Reisfeld * Brian E. Granger * Christoph Gohlke * Cody Precord * dan.milstein * Darren Dale * Dav Clark * David Warde-Farley * epatters * epatters * epatters * Eric Firing * Erik Tollerud * Evan Patterson * Fernando Perez * Gael Varoquaux * Gerardo * Jason Grout * John Hunter * Jens Hedegaard Nielsen * Johann Cohen-Tanugi * Jörgen Stenarson * Justin Riley * Kiorky * Laurent Dufrechou * Luis Pedro Coelho * Mani chandra * Mark E. Smith * Mark Voorhies * Martin Spacek * Michael Droettboom * MinRK * muzuiget * Nick Tarleton * Nicolas Rougier * Omar Andres Zapata Mesa * Paul Ivanov * Pauli Virtanen * Prabhu Ramachandran * Ramana * Robert Kern * Sathesh Chandra * Satrajit Ghosh * Sebastian Busch * Skipper Seabold * Stefan van der Walt * Stephan Peijnik * Steven Bethard * Thomas Kluyver * Thomas Spura * Tom Fetherston * Tom MacWright * tzanko * vankayala sowjanya * Vivian De Smedt * Ville M. Vainio * Vishal Vatsa * Vishnu S G * Walter Doerwald .. note:: This list was generated with the output of ``git log dev-0.11 HEAD --format='* %aN <%aE>' | sed 's/@/\-at\-/' | sed 's/<>//' | sort -u`` after some cleanup. If you should be on this list, please add yourself. ipython-8.35.0/docs/source/whatsnew/version0.12.rst000066400000000000000000000403011477474304100221220ustar00rootroot00000000000000============= 0.12 Series ============= Release 0.12.1 ============== IPython 0.12.1 is a bugfix release of 0.12, pulling only bugfixes and minor cleanup from 0.13, timed for the Ubuntu 12.04 LTS release. See the :ref:`list of fixed issues ` for specific backported issues. Release 0.12 ============ IPython 0.12 contains several major new features, as well as a large amount of bug and regression fixes. The 0.11 release brought with it a lot of new functionality and major refactorings of the codebase; by and large this has proven to be a success as the number of contributions to the project has increased dramatically, proving that the code is now much more approachable. But in the refactoring inevitably some bugs were introduced, and we have also squashed many of those as well as recovered some functionality that had been temporarily disabled due to the API changes. The following major new features appear in this version. An interactive browser-based Notebook with rich media support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A powerful new interface puts IPython in your browser. You can start it with the command ``ipython notebook``: .. figure:: ../_images/notebook_specgram.png :width: 400px :alt: The IPython notebook with embedded text, code, math and figures. :align: center :target: ../_images/notebook_specgram.png The new IPython notebook showing text, mathematical expressions in LaTeX, code, results and embedded figures created with Matplotlib. This new interface maintains all the features of IPython you are used to, as it is a new client that communicates with the same IPython kernels used by the terminal and Qt console. But the web notebook provides for a different workflow where you can integrate, along with code execution, also text, mathematical expressions, graphics, video, and virtually any content that a modern browser is capable of displaying. You can save your work sessions as documents that retain all these elements and which can be version controlled, emailed to colleagues or saved as HTML or PDF files for printing or publishing statically on the web. The internal storage format is a JSON file that can be easily manipulated for manual exporting to other formats. This Notebook is a major milestone for IPython, as for years we have tried to build this kind of system. We were inspired originally by the excellent implementation in Mathematica, we made a number of attempts using older technologies in earlier Summer of Code projects in 2005 (both students and Robert Kern developed early prototypes), and in recent years we have seen the excellent implementation offered by the `Sage ` system. But we continued to work on something that would be consistent with the rest of IPython's design, and it is clear now that the effort was worth it: based on the ZeroMQ communications architecture introduced in version 0.11, the notebook can now retain 100% of the features of the real IPython. But it can also provide the rich media support and high quality Javascript libraries that were not available in browsers even one or two years ago (such as high-quality mathematical rendering or built-in video). The notebook has too many useful and important features to describe in these release notes; our documentation now contains a directory called ``examples/notebooks`` with several notebooks that illustrate various aspects of the system. You should start by reading those named ``00_notebook_tour.ipynb`` and ``01_notebook_introduction.ipynb`` first, and then can proceed to read the others in any order you want. To start the notebook server, go to a directory containing the notebooks you want to open (or where you want to create new ones) and type:: ipython notebook You can see all the relevant options with:: ipython notebook --help ipython notebook --help-all # even more and just like the Qt console, you can start the notebook server with pylab support by using:: ipython notebook --pylab for floating matplotlib windows or:: ipython notebook --pylab inline for plotting support with automatically inlined figures. Note that it is now possible also to activate pylab support at runtime via ``%pylab``, so you do not need to make this decision when starting the server. .. _two_process_console: Two-process terminal console ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Based on the same architecture as the notebook and the Qt console, we also have now a terminal-based console that can connect to an external IPython kernel (the same kernels used by the Qt console or the notebook, in fact). While this client behaves almost identically to the usual IPython terminal application, this capability can be very useful to attach an interactive console to an existing kernel that was started externally. It lets you use the interactive ``%debug`` facilities in a notebook, for example (the web browser can't interact directly with the debugger) or debug a third-party code where you may have embedded an IPython kernel. This is also something that we have wanted for a long time, and which is a culmination (as a team effort) of the work started last year during the 2010 Google Summer of Code project. Tabbed QtConsole ~~~~~~~~~~~~~~~~ The QtConsole now supports starting multiple kernels in tabs, and has a menubar, so it looks and behaves more like a real application. Keyboard enthusiasts can disable the menubar with ctrl-shift-M (:ghpull:`887`). .. figure:: ../_images/qtconsole_tabbed.png :width: 400px :alt: Tabbed IPython Qt console with embedded plots and menus. :align: center :target: ../_images/qtconsole_tabbed.png The improved Qt console for IPython, now with tabs to control multiple kernels and full menu support. Full Python 3 compatibility ~~~~~~~~~~~~~~~~~~~~~~~~~~~ IPython can now be installed from a single codebase on Python 2 and Python 3. The installation process for Python 3 automatically runs 2to3. The same 'default' profile is now used for Python 2 and 3 (the previous version had a separate 'python3' profile). Standalone Kernel ~~~~~~~~~~~~~~~~~ The ``ipython kernel`` subcommand has been added, to allow starting a standalone kernel, that can be used with various frontends. You can then later connect a Qt console or a terminal console to this kernel by typing e.g.:: ipython qtconsole --existing if it's the only one running, or by passing explicitly the connection parameters (printed by the kernel at startup). PyPy support ~~~~~~~~~~~~ The terminal interface to IPython now runs under `PyPy `_. We will continue to monitor PyPy's progress, and hopefully before long at least we'll be able to also run the notebook. The Qt console may take longer, as Qt is a very complex set of bindings to a huge C++ library, and that is currently the area where PyPy still lags most behind. But for everyday interactive use at the terminal, with this release and PyPy 1.7, things seem to work quite well from our admittedly limited testing. Other important new features ---------------------------- * **SSH Tunnels**: In 0.11, the :mod:`IPython.parallel` Client could tunnel its connections to the Controller via ssh. Now, the QtConsole supports ssh tunneling, as do parallel engines. * **relaxed command-line parsing**: 0.11 was released with overly-strict command-line parsing, preventing the ability to specify arguments with spaces, e.g. ``ipython --pylab qt`` or ``ipython -c "print 'hi'"``. This has been fixed, by using argparse. The new parsing is a strict superset of 0.11, so any commands in 0.11 should still work in 0.12. * **HistoryAccessor**: The :class:`~IPython.core.history.HistoryManager` class for interacting with your IPython SQLite history database has been split, adding a parent :class:`~IPython.core.history.HistoryAccessor` class, so that users can write code to access and search their IPython history without being in an IPython session (:ghpull:`824`). * **kernel %gui and %pylab**: The ``%gui`` and ``%pylab`` magics have been restored to the IPython kernel (e.g. in the qtconsole or notebook). This allows activation of pylab-mode, or eventloop integration after starting the kernel, which was unavailable in 0.11. Unlike in the terminal, this can be set only once, and cannot be changed. * **%config**: A new ``%config`` magic has been added, giving easy access to the IPython configuration system at runtime (:ghpull:`923`). * **Multiline History**: Multiline readline history has been restored to the Terminal frontend by default (:ghpull:`838`). * **%store**: The ``%store`` magic from earlier versions has been updated and re-enabled (:ref:`extensions_storemagic`; :ghpull:`1029`). To autorestore stored variables on startup, specify ``c.StoreMagic.autorestore = True`` in :file:`ipython_config.py`. Major Bugs fixed ---------------- In this cycle, we have :ref:`closed over 500 issues `, but a few major ones merit special mention: * Simple configuration errors should no longer crash IPython. In 0.11, errors in config files, as well as invalid trait values, could crash IPython. Now, such errors are reported, and help is displayed. * Certain SyntaxErrors no longer crash IPython (e.g. just typing keywords, such as ``return``, ``break``, etc.). See :ghissue:`704`. * IPython path utils, such as :func:`~IPython.utils.path.get_ipython_dir` now check for write permissions, so IPython should function on systems where the default path resolution might point to a read-only location, such as ``HOMESHARE`` on Windows (:ghissue:`669`). * :func:`raw_input` now works in the kernel when multiple frontends are in use. The request will be sent to the frontend that made the request, and an exception is raised if that frontend does not support stdin requests (e.g. the notebook) (:ghissue:`673`). * :mod:`zmq` version detection no longer uses simple lexicographical comparison to check minimum version, which prevents 0.11 from working with pyzmq-2.1.10 (:ghpull:`758`). * A bug in PySide < 1.0.7 caused crashes on OSX when tooltips were shown (:ghissue:`711`). these tooltips are now disabled on old PySide (:ghpull:`963`). * IPython no longer crashes when started on recent versions of Python 3 in Windows (:ghissue:`737`). * Instances of classes defined interactively can now be pickled (:ghissue:`29`; :ghpull:`648`). Note that pickling saves a reference to the class definition, so unpickling the instances will only work where the class has been defined. Backwards incompatible changes ------------------------------ * IPython connection information is no longer specified via ip/port directly, rather via json connection files. These files are stored in the security directory, and enable us to turn on HMAC message authentication by default, significantly improving the security of kernels. Various utility functions have been added to :mod:`IPython.lib.kernel`, for easier connecting to existing kernels. * :class:`~IPython.zmq.kernelmanager.KernelManager` now has one ip, and several port traits, rather than several ip/port pair ``_addr`` traits. This better matches the rest of the code, where the ip cannot not be set separately for each channel. * Custom prompts are now configured using a new class, :class:`~IPython.core.prompts.PromptManager`, which has traits for :attr:`in_template`, :attr:`in2_template` (the ``...:`` continuation prompt), :attr:`out_template` and :attr:`rewrite_template`. This uses Python's string formatting system, so you can use ``{time}`` and ``{cwd}``, although we have preserved the abbreviations from previous versions, e.g. ``\#`` (prompt number) and ``\w`` (working directory). For the list of available fields, refer to the source of :file:`IPython/core/prompts.py`. * The class inheritance of the Launchers in :mod:`IPython.parallel.apps.launcher` used by ipcluster has changed, so that trait names are more consistent across batch systems. This may require a few renames in your config files, if you customized the command-line args for launching controllers and engines. The configurable names have also been changed to be clearer that they point to class names, and can now be specified by name only, rather than requiring the full import path of each class, e.g.:: IPClusterEngines.engine_launcher = 'IPython.parallel.apps.launcher.MPIExecEngineSetLauncher' IPClusterStart.controller_launcher = 'IPython.parallel.apps.launcher.SSHControllerLauncher' would now be specified as:: IPClusterEngines.engine_launcher_class = 'MPI' IPClusterStart.controller_launcher_class = 'SSH' The full path will still work, and is necessary for using custom launchers not in IPython's launcher module. Further, MPIExec launcher names are now prefixed with just MPI, to better match other batch launchers, and be generally more intuitive. The MPIExec names are deprecated, but continue to work. * For embedding a shell, note that the parameters ``user_global_ns`` and ``global_ns`` have been deprecated in favour of ``user_module`` and ``module`` respsectively. The new parameters expect a module-like object, rather than a namespace dict. The old parameters remain for backwards compatibility, although ``user_global_ns`` is now ignored. The ``user_ns`` parameter works the same way as before, and calling :func:`~IPython.frontend.terminal.embed.embed` with no arguments still works as before. Development summary and credits ------------------------------- The previous version (IPython 0.11) was released on July 31 2011, so this release cycle was roughly 4 1/2 months long, we closed a total of 515 issues, 257 pull requests and 258 regular issues (a :ref:`detailed list ` is available). Many users and developers contributed code, features, bug reports and ideas to this release. Please do not hesitate in contacting us if we've failed to acknowledge your contribution here. In particular, for this release we have had commits from the following 45 contributors, a mix of new and regular names (in alphabetical order by first name): * Alcides * Ben Edwards * Benjamin Ragan-Kelley * Benjamin Thyreau * Bernardo B. Marques * Bernard Paulus * Bradley M. Froehle * Brian E. Granger * Christian Boos * Daniel Velkov * Erik Tollerud * Evan Patterson * Felix Werner * Fernando Perez * Gabriel * Grahame Bowland * Hannes Schulz * Jens Hedegaard Nielsen * Jonathan March * Jörgen Stenarson * Julian Taylor * Kefu Chai * macgyver * Matt Cottingham * Matthew Brett * Matthias BUSSONNIER * Michael Droettboom * Nicolas Rougier * Olivier Verdier * Omar Andres Zapata Mesa * Pablo Winant * Paul Ivanov * Pauli Virtanen * Pete Aykroyd * Prabhu Ramachandran * Puneeth Chaganti * Robert Kern * Satrajit Ghosh * Stefan van der Walt * Szabolcs Horvát * Thomas Kluyver * Thomas Spura * Timo Paulssen * Valentin Haenel * Yaroslav Halchenko .. note:: This list was generated with the output of ``git log rel-0.11..HEAD --format='* %aN <%aE>' | sed 's/@/\-at\-/' | sed 's/<>//' | sort -u`` after some cleanup. If you should be on this list, please add yourself. ipython-8.35.0/docs/source/whatsnew/version0.13.rst000066400000000000000000000672111477474304100221340ustar00rootroot00000000000000============= 0.13 Series ============= Release 0.13 ============ IPython 0.13 contains several major new features, as well as a large amount of bug and regression fixes. The previous version (0.12) was released on December 19 2011, and in this development cycle we had: - ~6 months of work. - 373 pull requests merged. - 742 issues closed (non-pull requests). - contributions from 62 authors. - 1760 commits. - a diff of 114226 lines. The amount of work included in this release is so large, that we can only cover here the main highlights; please see our :ref:`detailed release statistics ` for links to every issue and pull request closed on GitHub as well as a full list of individual contributors. Major Notebook improvements: new user interface and more -------------------------------------------------------- The IPython Notebook, which has proven since its release to be wildly popular, has seen a massive amount of work in this release cycle, leading to a significantly improved user experience as well as many new features. The first user-visible change is a reorganization of the user interface; the left panel has been removed and was replaced by a real menu system and a toolbar with icons. Both the toolbar and the header above the menu can be collapsed to leave an unobstructed working area: .. image:: ../_images/ipy_013_notebook_spectrogram.png :width: 460px :alt: New user interface for Notebook :align: center :target: ../_images/ipy_013_notebook_spectrogram.png The notebook handles very long outputs much better than before (this was a serious usability issue when running processes that generated massive amounts of output). Now, in the presence of outputs longer than ~100 lines, the notebook will automatically collapse to a scrollable area and the entire left part of this area controls the display: one click in this area will expand the output region completely, and a double-click will hide it completely. This figure shows both the scrolled and hidden modes: .. image:: ../_images/ipy_013_notebook_long_out.png :width: 460px :alt: Scrolling and hiding of long output in the notebook. :align: center :target: ../_images/ipy_013_notebook_long_out.png .. note:: The auto-folding of long outputs is disabled in Firefox due to bugs in its scrolling behavior. See :ghpull:`2047` for details. Uploading notebooks to the dashboard is now easier: in addition to drag and drop (which can be finicky sometimes), you can now click on the upload text and use a regular file dialog box to select notebooks to upload. Furthermore, the notebook dashboard now auto-refreshes its contents and offers buttons to shut down any running kernels (:ghpull:`1739`): .. image:: ../_images/ipy_013_dashboard.png :width: 460px :alt: Improved dashboard :align: center :target: ../_images/ipy_013_dashboard.png Cluster management ~~~~~~~~~~~~~~~~~~ The notebook dashboard can now also start and stop clusters, thanks to a new tab in the dashboard user interface: .. image:: ../_images/ipy_013_dashboard_cluster.png :width: 460px :alt: Cluster management from the notebook dashboard :align: center :target: ../_images/ipy_013_dashboard_cluster.png This interface allows, for each profile you have configured, to start and stop a cluster (and optionally override the default number of engines corresponding to that configuration). While this hides all error reporting, once you have a configuration that you know works smoothly, it is a very convenient interface for controlling your parallel resources. New notebook format ~~~~~~~~~~~~~~~~~~~ The notebooks saved now use version 3 of our format, which supports heading levels as well as the concept of 'raw' text cells that are not rendered as Markdown. These will be useful with converters_ we are developing, to pass raw markup (say LaTeX). That conversion code is still under heavy development and not quite ready for prime time, but we welcome help on this front so that we can merge it for full production use as soon as possible. .. _converters: https://github.com/ipython/nbconvert .. note:: v3 notebooks can *not* be read by older versions of IPython, but we provide a `simple script`_ that you can use in case you need to export a v3 notebook to share with a v2 user. .. _simple script: https://gist.github.com/1935808 JavaScript refactoring ~~~~~~~~~~~~~~~~~~~~~~ All the client-side JavaScript has been decoupled to ease reuse of parts of the machinery without having to build a full-blown notebook. This will make it much easier to communicate with an IPython kernel from existing web pages and to integrate single cells into other sites, without loading the full notebook document-like UI. :ghpull:`1711`. This refactoring also enables the possibility of writing dynamic javascript widgets that are returned from Python code and that present an interactive view to the user, with callbacks in Javascript executing calls to the Kernel. This will enable many interactive elements to be added by users in notebooks. An example of this capability has been provided as a proof of concept in :file:`examples/widgets` that lets you directly communicate with one or more parallel engines, acting as a mini-console for parallel debugging and introspection. Improved tooltips ~~~~~~~~~~~~~~~~~ The object tooltips have gained some new functionality. By pressing tab several times, you can expand them to see more of a docstring, keep them visible as you fill in a function's parameters, or transfer the information to the pager at the bottom of the screen. For the details, look at the example notebook :file:`01_notebook_introduction.ipynb`. .. figure:: ../_images/ipy_013_notebook_tooltip.png :width: 460px :alt: Improved tooltips in the notebook. :align: center :target: ../_images/ipy_013_notebook_tooltip.png The new notebook tooltips. Other improvements to the Notebook ---------------------------------- These are some other notable small improvements to the notebook, in addition to many bug fixes and minor changes to add polish and robustness throughout: * The notebook pager (the area at the bottom) is now Resizable by dragging its divider handle, a feature that had been requested many times by just about anyone who had used the notebook system. :ghpull:`1705`. * It is now possible to open notebooks directly from the command line; for example: ``ipython notebook path/`` will automatically set ``path/`` as the notebook directory, and ``ipython notebook path/foo.ipynb`` will further start with the ``foo.ipynb`` notebook opened. :ghpull:`1686`. * If a notebook directory is specified with ``--notebook-dir`` (or with the corresponding configuration flag ``NotebookManager.notebook_dir``), all kernels start in this directory. * Fix codemirror clearing of cells with ``Ctrl-Z``; :ghpull:`1965`. * Text (markdown) cells now line wrap correctly in the notebook, making them much easier to edit :ghpull:`1330`. * PNG and JPEG figures returned from plots can be interactively resized in the notebook, by dragging them from their lower left corner. :ghpull:`1832`. * Clear ``In []`` prompt numbers on "Clear All Output". For more version-control-friendly ``.ipynb`` files, we now strip all prompt numbers when doing a "Clear all output". This reduces the amount of noise in commit-to-commit diffs that would otherwise show the (highly variable) prompt number changes. :ghpull:`1621`. * The notebook server now requires *two* consecutive ``Ctrl-C`` within 5 seconds (or an interactive confirmation) to terminate operation. This makes it less likely that you will accidentally kill a long-running server by typing ``Ctrl-C`` in the wrong terminal. :ghpull:`1609`. * Using ``Ctrl-S`` (or ``Cmd-S`` on a Mac) actually saves the notebook rather than providing the fairly useless browser html save dialog. :ghpull:`1334`. * Allow accessing local files from the notebook (in urls), by serving any local file as the url ``files/``. This makes it possible to, for example, embed local images in a notebook. :ghpull:`1211`. Cell magics ----------- We have completely refactored the magic system, finally moving the magic objects to standalone, independent objects instead of being the mixin class we'd had since the beginning of IPython (:ghpull:`1732`). Now, a separate base class is provided in :class:`IPython.core.magic.Magics` that users can subclass to create their own magics. Decorators are also provided to create magics from simple functions without the need for object orientation. Please see the :ref:`magic` docs for further details. All builtin magics now exist in a few subclasses that group together related functionality, and the new :mod:`IPython.core.magics` package has been created to organize this into smaller files. This cleanup was the last major piece of deep refactoring needed from the original 2001 codebase. We have also introduced a new type of magic function, prefixed with `%%` instead of `%`, which operates at the whole-cell level. A cell magic receives two arguments: the line it is called on (like a line magic) and the body of the cell below it. Cell magics are most natural in the notebook, but they also work in the terminal and qt console, with the usual approach of using a blank line to signal cell termination. For example, to time the execution of several statements:: %%timeit x = 0 # setup for i in range(100000): x += i**2 This is particularly useful to integrate code in another language, and cell magics already exist for shell scripts, Cython, R and Octave. Using ``%%script /usr/bin/foo``, you can run a cell in any interpreter that accepts code via stdin. Another handy cell magic makes it easy to write short text files: ``%%file ~/save/to/here.txt``. The following cell magics are now included by default; all those that use special interpreters (Perl, Ruby, bash, etc.) assume you have the requisite interpreter installed: * ``%%!``: run cell body with the underlying OS shell; this is similar to prefixing every line in the cell with ``!``. * ``%%bash``: run cell body under bash. * ``%%capture``: capture the output of the code in the cell (and stderr as well). Useful to run codes that produce too much output that you don't even want scrolled. * ``%%file``: save cell body as a file. * ``%%perl``: run cell body using Perl. * ``%%prun``: run cell body with profiler (cell extension of ``%prun``). * ``%%python3``: run cell body using Python 3. * ``%%ruby``: run cell body using Ruby. * ``%%script``: run cell body with the script specified in the first line. * ``%%sh``: run cell body using sh. * ``%%sx``: run cell with system shell and capture process output (cell extension of ``%sx``). * ``%%system``: run cell with system shell (``%%!`` is an alias to this). * ``%%timeit``: time the execution of the cell (extension of ``%timeit``). This is what some of the script-related magics look like in action: .. image:: ../_images/ipy_013_notebook_script_cells.png :width: 460px :alt: Cluster management from the notebook dashboard :align: center :target: ../_images/ipy_013_notebook_script_cells.png In addition, we have also a number of :ref:`extensions ` that provide specialized magics. These typically require additional software to run and must be manually loaded via ``%load_ext ``, but are extremely useful. The following extensions are provided: **Cython magics** (extension ``cythonmagic``) This extension provides magics to automatically build and compile Python extension modules using the Cython_ language. You must install Cython separately, as well as a C compiler, for this to work. The examples directory in the source distribution ships with a full notebook demonstrating these capabilities: .. image:: ../_images/ipy_013_notebook_cythonmagic.png :width: 460px :alt: Cython magic :align: center :target: ../_images/ipy_013_notebook_cythonmagic.png .. _cython: http://cython.org **Octave magics** (extension ``octavemagic``) This extension provides several magics that support calling code written in the Octave_ language for numerical computing. You can execute single-lines or whole blocks of Octave code, capture both output and figures inline (just like matplotlib plots), and have variables automatically converted between the two languages. To use this extension, you must have Octave installed as well as the oct2py_ package. The examples directory in the source distribution ships with a full notebook demonstrating these capabilities: .. image:: ../_images/ipy_013_notebook_octavemagic.png :width: 460px :alt: Octave magic :align: center :target: ../_images/ipy_013_notebook_octavemagic.png .. _octave: http://www.gnu.org/software/octave .. _oct2py: http://pypi.python.org/pypi/oct2py **R magics** (extension ``rmagic``) This extension provides several magics that support calling code written in the R_ language for statistical data analysis. You can execute single-lines or whole blocks of R code, capture both output and figures inline (just like matplotlib plots), and have variables automatically converted between the two languages. To use this extension, you must have R installed as well as the rpy2_ package that bridges Python and R. The examples directory in the source distribution ships with a full notebook demonstrating these capabilities: .. image:: ../_images/ipy_013_notebook_rmagic.png :width: 460px :alt: R magic :align: center :target: ../_images/ipy_013_notebook_rmagic.png .. _R: http://www.r-project.org .. _rpy2: http://rpy.sourceforge.net/rpy2.html Tab completer improvements -------------------------- Useful tab-completion based on live inspection of objects is one of the most popular features of IPython. To make this process even more user-friendly, the completers of both the Qt console and the Notebook have been reworked. The Qt console comes with a new ncurses-like tab completer, activated by default, which lets you cycle through the available completions by pressing tab, or select a completion with the arrow keys (:ghpull:`1851`). .. figure:: ../_images/ipy_013_qtconsole_completer.png :width: 460px :alt: ncurses-like completer, with highlighted selection. :align: center :target: ../_images/ipy_013_qtconsole_completer.png The new improved Qt console's ncurses-like completer allows to easily navigate thought long list of completions. In the notebook, completions are now sourced both from object introspection and analysis of surrounding code, so limited completions can be offered for variables defined in the current cell, or while the kernel is busy (:ghpull:`1711`). We have implemented a new configurable flag to control tab completion on modules that provide the ``__all__`` attribute:: IPCompleter.limit_to__all__= Boolean This instructs the completer to honor ``__all__`` for the completion. Specifically, when completing on ``object.``, if True: only those names in ``obj.__all__`` will be included. When False [default]: the ``__all__`` attribute is ignored. :ghpull:`1529`. Improvements to the Qt console ------------------------------ The Qt console continues to receive improvements and refinements, despite the fact that it is by now a fairly mature and robust component. Lots of small polish has gone into it, here are a few highlights: * A number of changes were made to the underlying code for easier integration into other projects such as Spyder_ (:ghpull:`2007`, :ghpull:`2024`). * Improved menus with a new Magic menu that is organized by magic groups (this was made possible by the reorganization of the magic system internals). :ghpull:`1782`. * Allow for restarting kernels without clearing the qtconsole, while leaving a visible indication that the kernel has restarted. :ghpull:`1681`. * Allow the native display of jpeg images in the qtconsole. :ghpull:`1643`. .. _spyder: https://code.google.com/p/spyderlib Parallel -------- The parallel tools have been improved and fine-tuned on multiple fronts. Now, the creation of an :class:`IPython.parallel.Client` object automatically activates a line and cell magic function ``px`` that sends its code to all the engines. Further magics can be easily created with the :meth:`.Client.activate` method, to conveniently execute code on any subset of engines. :ghpull:`1893`. The ``%%px`` cell magic can also be given an optional targets argument, as well as a ``--out`` argument for storing its output. A new magic has also been added, ``%pxconfig``, that lets you configure various defaults of the parallel magics. As usual, type ``%pxconfig?`` for details. The exception reporting in parallel contexts has been improved to be easier to read. Now, IPython directly reports the remote exceptions without showing any of the internal execution parts: .. image:: ../_images/ipy_013_par_tb.png :width: 460px :alt: Improved parallel exceptions. :align: center :target: ../_images/ipy_013_par_tb.png The parallel tools now default to using ``NoDB`` as the storage backend for intermediate results. This means that the default usage case will have a significantly reduced memory footprint, though certain advanced features are not available with this backend. The parallel magics now display all output, so you can do parallel plotting or other actions with complex display. The ``px`` magic has now both line and cell modes, and in cell mode finer control has been added about how to collate output from multiple engines. :ghpull:`1768`. There have also been incremental improvements to the SSH launchers: * add to_send/fetch steps for moving connection files around. * add SSHProxyEngineSetLauncher, for invoking to `ipcluster engines` on a remote host. This can be used to start a set of engines via PBS/SGE/MPI *remotely*. This makes the SSHLauncher usable on machines without shared filesystems. A number of 'sugar' methods/properties were added to AsyncResult that are quite useful (:ghpull:`1548`) for everday work: * ``ar.wall_time`` = received - submitted * ``ar.serial_time`` = sum of serial computation time * ``ar.elapsed`` = time since submission (wall_time if done) * ``ar.progress`` = (int) number of sub-tasks that have completed * ``len(ar)`` = # of tasks * ``ar.wait_interactive()``: prints progress Added :meth:`.Client.spin_thread` / :meth:`~.Client.stop_spin_thread` for running spin in a background thread, to keep zmq queue clear. This can be used to ensure that timing information is as accurate as possible (at the cost of having a background thread active). Set TaskScheduler.hwm default to 1 instead of 0. 1 has more predictable/intuitive behavior, if often slower, and thus a more logical default. Users whose workloads require maximum throughput and are largely homogeneous in time per task can make the optimization themselves, but now the behavior will be less surprising to new users. :ghpull:`1294`. Kernel/Engine unification ------------------------- This is mostly work 'under the hood', but it is actually a *major* achievement for the project that has deep implications in the long term: at last, we have unified the main object that executes as the user's interactive shell (which we refer to as the *IPython kernel*) with the objects that run in all the worker nodes of the parallel computing facilities (the *IPython engines*). Ever since the first implementation of IPython's parallel code back in 2006, we had wanted to have these two roles be played by the same machinery, but a number of technical reasons had prevented that from being true. In this release we have now merged them, and this has a number of important consequences: * It is now possible to connect any of our clients (qtconsole or terminal console) to any individual parallel engine, with the *exact* behavior of working at a 'regular' IPython console/qtconsole. This makes debugging, plotting, etc. in parallel scenarios vastly easier. * Parallel engines can always execute arbitrary 'IPython code', that is, code that has magics, shell extensions, etc. In combination with the ``%%px`` magics, it is thus extremely natural for example to send to all engines a block of Cython or R code to be executed via the new Cython and R magics. For example, this snippet would send the R block to all active engines in a cluster:: %%px %%R ... R code goes here * It is possible to embed not only an interactive shell with the :func:`IPython.embed` call as always, but now you can also embed a *kernel* with :func:`IPython.embed_kernel()`. Embedding an IPython kernel in an application is useful when you want to use :func:`IPython.embed` but don't have a terminal attached on stdin and stdout. * The new :func:`IPython.parallel.bind_kernel` allows you to promote Engines to listening Kernels, and connect QtConsoles to an Engine and debug it directly. In addition, having a single core object through our entire architecture also makes the project conceptually cleaner, easier to maintain and more robust. This took a lot of work to get in place, but we are thrilled to have this major piece of architecture finally where we'd always wanted it to be. Official Public API ------------------- We have begun organizing our API for easier public use, with an eye towards an official IPython 1.0 release which will firmly maintain this API compatible for its entire lifecycle. There is now an :mod:`IPython.display` module that aggregates all display routines, and the :mod:`traitlets.config` namespace has all public configuration tools. We will continue improving our public API layout so that users only need to import names one level deeper than the main ``IPython`` package to access all public namespaces. IPython notebook file icons --------------------------- The directory ``docs/resources`` in the source distribution contains SVG and PNG versions of our file icons, as well as an ``Info.plist.example`` file with instructions to install them on Mac OSX. This is a first draft of our icons, and we encourage contributions from users with graphic talent to improve them in the future. New top-level `locate` command ------------------------------ Add `locate` entry points; these would be useful for quickly locating IPython directories and profiles from other (non-Python) applications. :ghpull:`1762`. Examples:: $> ipython locate /Users/me/.ipython $> ipython locate profile foo /Users/me/.ipython/profile_foo $> ipython locate profile /Users/me/.ipython/profile_default $> ipython locate profile dne [ProfileLocate] Profile u'dne' not found. Other new features and improvements ----------------------------------- * **%install_ext**: A new magic function to install an IPython extension from a URL. E.g. ``%install_ext https://bitbucket.org/birkenfeld/ipython-physics/raw/default/physics.py``. * The ``%loadpy`` magic is no longer restricted to Python files, and has been renamed ``%load``. The old name remains as an alias. * New command line arguments will help external programs find IPython folders: ``ipython locate`` finds the user's IPython directory, and ``ipython locate profile foo`` finds the folder for the 'foo' profile (if it exists). * The :envvar:`IPYTHON_DIR` environment variable, introduced in the Great Reorganization of 0.11 and existing only in versions 0.11-0.13, has been deprecated. As described in :ghpull:`1167`, the complexity and confusion of migrating to this variable is not worth the aesthetic improvement. Please use the historical :envvar:`IPYTHONDIR` environment variable instead. * The default value of *interactivity* passed from :meth:`~IPython.core.interactiveshell.InteractiveShell.run_cell` to :meth:`~IPython.core.interactiveshell.InteractiveShell.run_ast_nodes` is now configurable. * New ``%alias_magic`` function to conveniently create aliases of existing magics, if you prefer to have shorter names for personal use. * We ship unminified versions of the JavaScript libraries we use, to better comply with Debian's packaging policies. * Simplify the information presented by ``obj?/obj??`` to eliminate a few redundant fields when possible. :ghpull:`2038`. * Improved continuous integration for IPython. We now have automated test runs on `Shining Panda `_ and `Travis-CI `_, as well as `Tox support `_. * The `vim-ipython`_ functionality (externally developed) has been updated to the latest version. .. _vim-ipython: https://github.com/ivanov/vim-ipython * The ``%save`` magic now has a ``-f`` flag to force overwriting, which makes it much more usable in the notebook where it is not possible to reply to interactive questions from the kernel. :ghpull:`1937`. * Use dvipng to format sympy.Matrix, enabling display of matrices in the Qt console with the sympy printing extension. :ghpull:`1861`. * Our messaging protocol now has a reasonable test suite, helping ensure that we don't accidentally deviate from the spec and possibly break third-party applications that may have been using it. We encourage users to contribute more stringent tests to this part of the test suite. :ghpull:`1627`. * Use LaTeX to display, on output, various built-in types with the SymPy printing extension. :ghpull:`1399`. * Add Gtk3 event loop integration and example. :ghpull:`1588`. * ``clear_output`` improvements, which allow things like progress bars and other simple animations to work well in the notebook (:ghpull:`1563`): * `clear_output()` clears the line, even in terminal IPython, the QtConsole and plain Python as well, by printing `\r` to streams. * `clear_output()` avoids the flicker in the notebook by adding a delay, and firing immediately upon the next actual display message. * `display_javascript` hides its `output_area` element, so using display to run a bunch of javascript doesn't result in ever-growing vertical space. * Add simple support for running inside a virtualenv. While this doesn't supplant proper installation (as users should do), it helps ad-hoc calling of IPython from inside a virtualenv. :ghpull:`1388`. Major Bugs fixed ---------------- In this cycle, we have :ref:`closed over 740 issues `, but a few major ones merit special mention: * The ``%pastebin`` magic has been updated to point to gist.github.com, since unfortunately http://paste.pocoo.org has closed down. We also added a -d flag for the user to provide a gist description string. :ghpull:`1670`. * Fix ``%paste`` that would reject certain valid inputs. :ghpull:`1258`. * Fix sending and receiving of Numpy structured arrays (those with composite dtypes, often used as recarrays). :ghpull:`2034`. * Reconnect when the websocket connection closes unexpectedly. :ghpull:`1577`. * Fix truncated representation of objects in the debugger by showing at least 80 characters' worth of information. :ghpull:`1793`. * Fix logger to be Unicode-aware: logging could crash ipython if there was unicode in the input. :ghpull:`1792`. * Fix images missing from XML/SVG export in the Qt console. :ghpull:`1449`. * Fix deepreload on Python 3. :ghpull:`1625`, as well as having a much cleaner and more robust implementation of deepreload in general. :ghpull:`1457`. Backwards incompatible changes ------------------------------ * The exception :exc:`IPython.core.error.TryNext` previously accepted arguments and keyword arguments to be passed to the next implementation of the hook. This feature was removed as it made error message propagation difficult and violated the principle of loose coupling. ipython-8.35.0/docs/source/whatsnew/version0.8.rst000066400000000000000000000016201477474304100220500ustar00rootroot00000000000000======================================== 0.8 series ======================================== Release 0.8.4 ============= This was a quick release to fix an unfortunate bug that slipped into the 0.8.3 release. The ``--twisted`` option was disabled, as it turned out to be broken across several platforms. Release 0.8.3 ============= * pydb is now disabled by default (due to %run -d problems). You can enable it by passing -pydb command line argument to IPython. Note that setting it in config file won't work. Release 0.8.2 ============= * %pushd/%popd behave differently; now "pushd /foo" pushes CURRENT directory and jumps to /foo. The current behaviour is closer to the documented behaviour, and should not trip anyone. Older releases ============== Changes in earlier releases of IPython are described in the older file ``ChangeLog``. Please refer to this document for details. ipython-8.35.0/docs/source/whatsnew/version0.9.rst000066400000000000000000000302641477474304100220570ustar00rootroot00000000000000======================================== 0.9 series ======================================== Release 0.9.1 ============= This release was quickly made to restore compatibility with Python 2.4, which version 0.9 accidentally broke. No new features were introduced, other than some additional testing support for internal use. Release 0.9 =========== New features ------------ * All furl files and security certificates are now put in a read-only directory named ~/.ipython/security. * A single function :func:`get_ipython_dir`, in :mod:`IPython.genutils` that determines the user's IPython directory in a robust manner. * Laurent's WX application has been given a top-level script called ipython-wx, and it has received numerous fixes. We expect this code to be architecturally better integrated with Gael's WX 'ipython widget' over the next few releases. * The Editor synchronization work by Vivian De Smedt has been merged in. This code adds a number of new editor hooks to synchronize with editors under Windows. * A new, still experimental but highly functional, WX shell by Gael Varoquaux. This work was sponsored by Enthought, and while it's still very new, it is based on a more cleanly organized architecture of the various IPython components. We will continue to develop this over the next few releases as a model for GUI components that use IPython. * Another GUI frontend, Cocoa based (Cocoa is the OSX native GUI framework), authored by Barry Wark. Currently the WX and the Cocoa ones have slightly different internal organizations, but the whole team is working on finding what the right abstraction points are for a unified codebase. * As part of the frontend work, Barry Wark also implemented an experimental event notification system that various ipython components can use. In the next release the implications and use patterns of this system regarding the various GUI options will be worked out. * IPython finally has a full test system, that can test docstrings with IPython-specific functionality. There are still a few pieces missing for it to be widely accessible to all users (so they can run the test suite at any time and report problems), but it now works for the developers. We are working hard on continuing to improve it, as this was probably IPython's major Achilles heel (the lack of proper test coverage made it effectively impossible to do large-scale refactoring). The full test suite can now be run using the :command:`iptest` command line program. * The notion of a task has been completely reworked. An `ITask` interface has been created. This interface defines the methods that tasks need to implement. These methods are now responsible for things like submitting tasks and processing results. There are two basic task types: :class:`IPython.kernel.task.StringTask` (this is the old `Task` object, but renamed) and the new :class:`IPython.kernel.task.MapTask`, which is based on a function. * A new interface, :class:`IPython.kernel.mapper.IMapper` has been defined to standardize the idea of a `map` method. This interface has a single `map` method that has the same syntax as the built-in `map`. We have also defined a `mapper` factory interface that creates objects that implement :class:`IPython.kernel.mapper.IMapper` for different controllers. Both the multiengine and task controller now have mapping capabilities. * The parallel function capabilities have been reworks. The major changes are that i) there is now an `@parallel` magic that creates parallel functions, ii) the syntax for multiple variable follows that of `map`, iii) both the multiengine and task controller now have a parallel function implementation. * All of the parallel computing capabilities from `ipython1-dev` have been merged into IPython proper. This resulted in the following new subpackages: :mod:`IPython.kernel`, :mod:`IPython.kernel.core`, :mod:`traitlets.config`, :mod:`IPython.tools` and :mod:`IPython.testing`. * As part of merging in the `ipython1-dev` stuff, the ``setup.py`` script and friends have been completely refactored. Now we are checking for dependencies using the approach that matplotlib uses. * The documentation has been completely reorganized to accept the documentation from `ipython1-dev`. * We have switched to using Foolscap for all of our network protocols in :mod:`IPython.kernel`. This gives us secure connections that are both encrypted and authenticated. * We have a brand new `COPYING.txt` files that describes the IPython license and copyright. The biggest change is that we are putting "The IPython Development Team" as the copyright holder. We give more details about exactly what this means in this file. All developer should read this and use the new banner in all IPython source code files. * sh profile: ./foo runs foo as system command, no need to do !./foo anymore * String lists now support ``sort(field, nums = True)`` method (to easily sort system command output). Try it with ``a = !ls -l ; a.sort(1, nums=1)``. * '%cpaste foo' now assigns the pasted block as string list, instead of string * The ipcluster script now run by default with no security. This is done because the main usage of the script is for starting things on localhost. Eventually when ipcluster is able to start things on other hosts, we will put security back. * 'cd --foo' searches directory history for string foo, and jumps to that dir. Last part of dir name is checked first. If no matches for that are found, look at the whole path. Bug fixes --------- * The Windows installer has been fixed. Now all IPython scripts have ``.bat`` versions created. Also, the Start Menu shortcuts have been updated. * The colors escapes in the multiengine client are now turned off on win32 as they don't print correctly. * The :mod:`IPython.kernel.scripts.ipengine` script was exec'ing mpi_import_statement incorrectly, which was leading the engine to crash when mpi was enabled. * A few subpackages had missing ``__init__.py`` files. * The documentation is only created if Sphinx is found. Previously, the ``setup.py`` script would fail if it was missing. * Greedy ``cd`` completion has been disabled again (it was enabled in 0.8.4) as it caused problems on certain platforms. Backwards incompatible changes ------------------------------ * The ``clusterfile`` options of the :command:`ipcluster` command has been removed as it was not working and it will be replaced soon by something much more robust. * The :mod:`IPython.kernel` configuration now properly find the user's IPython directory. * In ipapi, the :func:`make_user_ns` function has been replaced with :func:`make_user_namespaces`, to support dict subclasses in namespace creation. * :class:`IPython.kernel.client.Task` has been renamed :class:`IPython.kernel.client.StringTask` to make way for new task types. * The keyword argument `style` has been renamed `dist` in `scatter`, `gather` and `map`. * Renamed the values that the rename `dist` keyword argument can have from `'basic'` to `'b'`. * IPython has a larger set of dependencies if you want all of its capabilities. See the ``setup.py`` script for details. * The constructors for :class:`IPython.kernel.client.MultiEngineClient` and :class:`IPython.kernel.client.TaskClient` no longer take the (ip,port) tuple. Instead they take the filename of a file that contains the FURL for that client. If the FURL file is in your IPYTHONDIR, it will be found automatically and the constructor can be left empty. * The asynchronous clients in :mod:`IPython.kernel.asyncclient` are now created using the factory functions :func:`get_multiengine_client` and :func:`get_task_client`. These return a `Deferred` to the actual client. * The command line options to `ipcontroller` and `ipengine` have changed to reflect the new Foolscap network protocol and the FURL files. Please see the help for these scripts for details. * The configuration files for the kernel have changed because of the Foolscap stuff. If you were using custom config files before, you should delete them and regenerate new ones. Changes merged in from IPython1 ------------------------------- New features ............ * Much improved ``setup.py`` and ``setupegg.py`` scripts. Because Twisted and zope.interface are now easy installable, we can declare them as dependencies in our setupegg.py script. * IPython is now compatible with Twisted 2.5.0 and 8.x. * Added a new example of how to use :mod:`ipython1.kernel.asynclient`. * Initial draft of a process daemon in :mod:`ipython1.daemon`. This has not been merged into IPython and is still in `ipython1-dev`. * The ``TaskController`` now has methods for getting the queue status. * The ``TaskResult`` objects not have information about how long the task took to run. * We are attaching additional attributes to exceptions ``(_ipython_*)`` that we use to carry additional info around. * New top-level module :mod:`asyncclient` that has asynchronous versions (that return deferreds) of the client classes. This is designed to users who want to run their own Twisted reactor. * All the clients in :mod:`client` are now based on Twisted. This is done by running the Twisted reactor in a separate thread and using the :func:`blockingCallFromThread` function that is in recent versions of Twisted. * Functions can now be pushed/pulled to/from engines using :meth:`MultiEngineClient.push_function` and :meth:`MultiEngineClient.pull_function`. * Gather/scatter are now implemented in the client to reduce the work load of the controller and improve performance. * Complete rewrite of the IPython documentation. All of the documentation from the IPython website has been moved into docs/source as restructured text documents. PDF and HTML documentation are being generated using Sphinx. * New developer oriented documentation: development guidelines and roadmap. * Traditional ``ChangeLog`` has been changed to a more useful ``changes.txt`` file that is organized by release and is meant to provide something more relevant for users. Bug fixes ......... * Created a proper ``MANIFEST.in`` file to create source distributions. * Fixed a bug in the ``MultiEngine`` interface. Previously, multi-engine actions were being collected with a :class:`DeferredList` with ``fireononeerrback=1``. This meant that methods were returning before all engines had given their results. This was causing extremely odd bugs in certain cases. To fix this problem, we have 1) set ``fireononeerrback=0`` to make sure all results (or exceptions) are in before returning and 2) introduced a :exc:`CompositeError` exception that wraps all of the engine exceptions. This is a huge change as it means that users will have to catch :exc:`CompositeError` rather than the actual exception. Backwards incompatible changes .............................. * All names have been renamed to conform to the lowercase_with_underscore convention. This will require users to change references to all names like ``queueStatus`` to ``queue_status``. * Previously, methods like :meth:`MultiEngineClient.push` and :meth:`MultiEngineClient.push` used ``*args`` and ``**kwargs``. This was becoming a problem as we weren't able to introduce new keyword arguments into the API. Now these methods simple take a dict or sequence. This has also allowed us to get rid of the ``*All`` methods like :meth:`pushAll` and :meth:`pullAll`. These things are now handled with the ``targets`` keyword argument that defaults to ``'all'``. * The :attr:`MultiEngineClient.magicTargets` has been renamed to :attr:`MultiEngineClient.targets`. * All methods in the MultiEngine interface now accept the optional keyword argument ``block``. * Renamed :class:`RemoteController` to :class:`MultiEngineClient` and :class:`TaskController` to :class:`TaskClient`. * Renamed the top-level module from :mod:`api` to :mod:`client`. * Most methods in the multiengine interface now raise a :exc:`CompositeError` exception that wraps the user's exceptions, rather than just raising the raw user's exception. * Changed the ``setupNS`` and ``resultNames`` in the ``Task`` class to ``push`` and ``pull``. ipython-8.35.0/docs/source/whatsnew/version1.0.rst000066400000000000000000000312251477474304100220450ustar00rootroot00000000000000============ 1.0 Series ============ Release 1.0.0: An Afternoon Hack ================================ IPython 1.0 requires Python ≥ 2.6.5 or ≥ 3.2.1. It does not support Python 3.0, 3.1, or 2.5. This is a big release. The principal milestone is the addition of :mod:`IPython.nbconvert`, but there has been a great deal of work improving all parts of IPython as well. The previous version (0.13) was released on June 30, 2012, and in this development cycle we had: - ~12 months of work. - ~700 pull requests merged. - ~600 issues closed (non-pull requests). - contributions from ~150 authors. - ~4000 commits. The amount of work included in this release is so large that we can only cover here the main highlights; please see our :ref:`detailed release statistics ` for links to every issue and pull request closed on GitHub as well as a full list of individual contributors. It includes Reorganization -------------- There have been two major reorganizations in IPython 1.0: - Added :mod:`IPython.kernel` for all kernel-related code. This means that :mod:`IPython.zmq` has been removed, and much of it is now in :mod:`IPython.kernel.zmq`, some of it being in the top-level :mod:`IPython.kernel`. - We have removed the `frontend` subpackage, as it caused unnecessary depth. So what was :mod:`IPython.frontend.qt` is now :mod:`IPython.qt`, and so on. The one difference is that the notebook has been further flattened, so that :mod:`IPython.frontend.html.notebook` is now just `IPython.html`. There is a shim module, so :mod:`IPython.frontend` is still importable in 1.0, but there will be a warning. - The IPython sphinx directives are now installed in :mod:`IPython.sphinx`, so they can be imported by other projects. Public APIs ----------- For the first time since 0.10 (sorry, everyone), there is an official public API for starting IPython: .. sourcecode:: python from IPython import start_ipython start_ipython() This is what packages should use that start their own IPython session, but don't actually want embedded IPython (most cases). :func:`IPython.embed()` is used for embedding IPython into the calling namespace, similar to calling :func:`Pdb.set_trace`, whereas :func:`start_ipython` will start a plain IPython session, loading config and startup files as normal. We also have added: .. sourcecode:: python from IPython import get_ipython Which is a *library* function for getting the current IPython instance, and will return ``None`` if no IPython instance is running. This is the official way to check whether your code is called from inside an IPython session. If you want to check for IPython without unnecessarily importing IPython, use this function: .. sourcecode:: python def get_ipython(): """return IPython instance if there is one, None otherwise""" import sys if "IPython" in sys.modules: import IPython return IPython.get_ipython() Core ---- - The input transformation framework has been reworked. This fixes some corner cases, and adds more flexibility for projects which use IPython, like SymPy & SAGE. For more details, see :doc:`/config/inputtransforms`. - Exception types can now be displayed with a custom traceback, by defining a ``_render_traceback_()`` method which returns a list of strings, each containing one line of the traceback. - A new command, ``ipython history trim`` can be used to delete everything but the last 1000 entries in the history database. - ``__file__`` is defined in both config files at load time, and ``.ipy`` files executed with ``%run``. - ``%logstart`` and ``%logappend`` are no longer broken. - Add glob expansion for ``%run``, e.g. ``%run -g script.py *.txt``. - Expand variables (``$foo``) in Cell Magic argument line. - By default, :command:`iptest` will exclude various slow tests. All tests can be run with :command:`iptest --all`. - SQLite history can be disabled in the various cases that it does not behave well. - ``%edit`` works on interactively defined variables. - editor hooks have been restored from quarantine, enabling TextMate as editor, etc. - The env variable PYTHONSTARTUP is respected by IPython. - The ``%matplotlib`` magic was added, which is like the old ``%pylab`` magic, but it does not import anything to the interactive namespace. It is recommended that users switch to ``%matplotlib`` and explicit imports. - The ``--matplotlib`` command line flag was also added. It invokes the new ``%matplotlib`` magic and can be used in the same way as the old ``--pylab`` flag. You can either use it by itself as a flag (``--matplotlib``), or you can also pass a backend explicitly (``--matplotlib qt`` or ``--matplotlib=wx``, etc). Backwards incompatible changes ****************************** - Calling :meth:`InteractiveShell.prefilter` will no longer perform static transformations - the processing of escaped commands such as ``%magic`` and ``!system``, and stripping input prompts from code blocks. This functionality was duplicated in :mod:`IPython.core.inputsplitter`, and the latter version was already what IPython relied on. A new API to transform input will be ready before release. - Functions from :mod:`IPython.lib.inputhook` to control integration with GUI event loops are no longer exposed in the top level of :mod:`IPython.lib`. Code calling these should make sure to import them from :mod:`IPython.lib.inputhook`. - For all kernel managers, the ``sub_channel`` attribute has been renamed to ``iopub_channel``. - Users on Python versions before 2.6.6, 2.7.1 or 3.2 will now need to call :func:`IPython.utils.doctestreload.doctest_reload` to make doctests run correctly inside IPython. Python releases since those versions are unaffected. For details, see :ghpull:`3068` and `Python issue 8048 `_. - The ``InteractiveShell.cache_main_mod()`` method has been removed, and :meth:`~IPython.core.interactiveshell.InteractiveShell.new_main_mod` has a different signature, expecting a filename where earlier versions expected a namespace. See :ghpull:`3555` for details. - The short-lived plugin system has been removed. Extensions are the way to go. .. _nbconvert1: NbConvert --------- The major milestone for IPython 1.0 is the addition of :mod:`IPython.nbconvert` - tools for converting IPython notebooks to various other formats. .. warning:: nbconvert is α-level preview code in 1.0 To use nbconvert to convert various file formats:: ipython nbconvert --to html *.ipynb See ``ipython nbconvert --help`` for more information. nbconvert depends on `pandoc`_ for many of the translations to and from various formats. .. _pandoc: http://johnmacfarlane.net/pandoc/ Notebook -------- Major changes to the IPython Notebook in 1.0: - The notebook is now autosaved, by default at an interval of two minutes. When you press 'save' or Ctrl-S, a *checkpoint* is made, in a hidden folder. This checkpoint can be restored, so that the autosave model is strictly safer than traditional save. If you change nothing about your save habits, you will always have a checkpoint that you have written, and an autosaved file that is kept up to date. - The notebook supports :func:`raw_input` / :func:`input`, and thus also ``%debug``, and many other Python calls that expect user input. - You can load custom javascript and CSS in the notebook by editing the files :file:`$(ipython locate profile)/static/custom/custom.{js,css}`. - Add ``%%html``, ``%%svg``, ``%%javascript``, and ``%%latex`` cell magics for writing raw output in notebook cells. - add a redirect handler and anchors on heading cells, so you can link across notebooks, directly to heading cells in other notebooks. - Images support width and height metadata, and thereby 2x scaling (retina support). - ``_repr_foo_`` methods can return a tuple of (data, metadata), where metadata is a dict containing metadata about the displayed object. This is used to set size, etc. for retina graphics. To enable retina matplotlib figures, simply set ``InlineBackend.figure_format = 'retina'`` for 2x PNG figures, in your :ref:`IPython config file ` or via the ``%config`` magic. - Add display.FileLink and FileLinks for quickly displaying HTML links to local files. - Cells have metadata, which can be edited via cell toolbars. This metadata can be used by external code (e.g. reveal.js or exporters), when examining the notebook. - Fix an issue parsing LaTeX in markdown cells, which required users to type ``\\\``, instead of ``\\``. - Notebook templates are rendered with Jinja instead of Tornado. - ``%%file`` has been renamed ``%%writefile`` (``%%file`` is deprecated). - ANSI (and VT100) color parsing has been improved in both performance and supported values. - The static files path can be found as ``IPython.html.DEFAULT_STATIC_FILES_PATH``, which may be changed by package managers. - IPython's CSS is installed in :file:`static/css/style.min.css` (all style, including bootstrap), and :file:`static/css/ipython.min.css`, which only has IPython's own CSS. The latter file should be useful for embedding IPython notebooks in other pages, blogs, etc. - The Print View has been removed. Users are encouraged to test :ref:`ipython nbconvert ` to generate a static view. Javascript Components ********************* The javascript components used in the notebook have been updated significantly. - updates to jQuery (2.0) and jQueryUI (1.10) - Update CodeMirror to 3.14 - Twitter Bootstrap (2.3) for layout - Font-Awesome (3.1) for icons - highlight.js (7.3) for syntax highlighting - marked (0.2.8) for markdown rendering - require.js (2.1) for loading javascript Some relevant changes that are results of this: - Markdown cells now support GitHub-flavored Markdown (GFM), which includes `````python`` code blocks and tables. - Notebook UI behaves better on more screen sizes. - Various code cell input issues have been fixed. Kernel ------ The kernel code has been substantially reorganized. New features in the kernel: - Kernels support ZeroMQ IPC transport, not just TCP - The message protocol has added a top-level metadata field, used for information about messages. - Add a `data_pub` message that functions much like `display_pub`, but publishes raw (usually pickled) data, rather than representations. - Ensure that ``sys.stdout.encoding`` is defined in Kernels. - Stdout from forked subprocesses should be forwarded to frontends (instead of crashing). IPEP 13 ******* The KernelManager has been split into a :class:`~.KernelManager` and a :class:`~.KernelClient`. The Manager owns a kernel and starts / signals / restarts it. There is always zero or one KernelManager per Kernel. Clients communicate with Kernels via zmq channels, and there can be zero-to-many Clients connected to a Kernel at any given time. The KernelManager now automatically restarts the kernel when it dies, rather than requiring user input at the notebook or QtConsole UI (which may or may not exist at restart time). In-process kernels ****************** The Python-language frontends, particularly the Qt console, may now communicate with in-process kernels, in addition to the traditional out-of-process kernels. An in-process kernel permits direct access to the kernel namespace, which is necessary in some applications. It should be understood, however, that the in-process kernel is not robust to bad user input and will block the main (GUI) thread while executing. Developers must decide on a case-by-case basis whether this tradeoff is appropriate for their application. Parallel -------- IPython.parallel has had some refactoring as well. There are many improvements and fixes, but these are the major changes: - Connections have been simplified. All ports and the serialization in use are written to the connection file, rather than the initial two-stage system. - Serialization has been rewritten, fixing many bugs and dramatically improving performance serializing large containers. - Load-balancing scheduler performance with large numbers of tasks has been dramatically improved. - There should be fewer (hopefully zero) false-positives for engine failures. - Increased compatibility with various use cases that produced serialization / argument errors with map, etc. - The controller can attempt to resume operation if it has crashed, by passing ``ipcontroller --restore``. - Engines can monitor the Hub heartbeat, and shutdown if the Hub disappears for too long. - add HTCondor support in launchers QtConsole --------- Various fixes, including improved performance with lots of text output, and better drag and drop support. The initial window size of the qtconsole is now configurable via ``IPythonWidget.width`` and ``IPythonWidget.height``. ipython-8.35.0/docs/source/whatsnew/version2.0.rst000066400000000000000000000333551477474304100220540ustar00rootroot00000000000000============ 2.x Series ============ Release 2.4 =========== January, 2014 .. note:: Some of the patches marked for 2.4 were left out of 2.4.0. Please use 2.4.1. - backport read support for nbformat v4 from IPython 3 - support for PyQt5 in the kernel (not QtConsole) - support for Pygments 2.0 For more information on what fixes have been backported to 2.4, see our :ref:`detailed release info `. Release 2.3.1 ============= November, 2014 - Fix CRCRLF line-ending bug in notebooks on Windows For more information on what fixes have been backported to 2.3.1, see our :ref:`detailed release info `. Release 2.3.0 ============= October, 2014 - improve qt5 support - prevent notebook data loss with atomic writes For more information on what fixes have been backported to 2.3, see our :ref:`detailed release info `. Release 2.2.0 ============= August, 2014 - Add CORS configuration For more information on what fixes have been backported to 2.2, see our :ref:`detailed release info `. Release 2.1.0 ============= May, 2014 IPython 2.1 is the first bugfix release for 2.0. For more information on what fixes have been backported to 2.1, see our :ref:`detailed release info `. Release 2.0.0 ============= April, 2014 IPython 2.0 requires Python ≥ 2.7.2 or ≥ 3.3.0. It does not support Python 3.0, 3.1, 3.2, 2.5, or 2.6. The principal milestones of 2.0 are: - interactive widgets for the notebook - directory navigation in the notebook dashboard - persistent URLs for notebooks - a new modal user interface in the notebook - a security model for notebooks Contribution summary since IPython 1.0 in August, 2013: - ~8 months of work - ~650 pull requests merged - ~400 issues closed (non-pull requests) - contributions from ~100 authors - ~4000 commits The amount of work included in this release is so large that we can only cover here the main highlights; please see our :ref:`detailed release statistics ` for links to every issue and pull request closed on GitHub as well as a full list of individual contributors. New stuff in the IPython notebook --------------------------------- Directory navigation ******************** .. image:: /_images/2.0/treeview.png :width: 392px :alt: Directory navigation :align: center The IPython notebook dashboard allows navigation into subdirectories. URLs are persistent based on the notebook's path and name, so no more random UUID URLs. Serving local files no longer needs the ``files/`` prefix. Relative links across notebooks and other files should work just as if notebooks were regular HTML files. Interactive widgets ******************* .. image:: /_images/2.0/widgets.png :width: 392px :alt: Interactive widgets :align: center IPython 2.0 adds :mod:`IPython.html.widgets`, for manipulating Python objects in the kernel with GUI controls in the notebook. IPython comes with a few built-in widgets for simple data types, and an API designed for developers to build more complex widgets. See the `widget docs`_ for more information. .. _widget docs: http://nbviewer.ipython.org/github/ipython/ipython/blob/2.x/examples/Interactive%20Widgets/Index.ipynb Modal user interface ******************** The notebook has added separate Edit and Command modes, allowing easier keyboard commands and making keyboard shortcut customization possible. See the new `User Interface notebook`_ for more information. .. _User Interface Notebook: http://nbviewer.ipython.org/github/ipython/ipython/blob/2.x/examples/Notebook/User%20Interface.ipynb You can familiarize yourself with the updated notebook user interface, including an explanation of Edit and Command modes, by going through the short guided tour which can be started from the Help menu. .. image:: /_images/2.0/user-interface.png :width: 392px :alt: Interface tour :align: center Security ******** 2.0 introduces a security model for notebooks, to prevent untrusted code from executing on users' behalf when notebooks open. A quick summary of the model: - Trust is determined by signing notebooks. - Untrusted HTML output is sanitized. - Untrusted Javascript is never executed. - HTML and Javascript in Markdown are never trusted. Dashboard "Running" tab *********************** .. image:: /_images/2.0/running-crop.png :width: 392px :alt: Running tab :align: center The dashboard now has a "Running" tab which shows all of the running notebooks. Single codebase Python 3 support -------------------------------- IPython previously supported Python 3 by running 2to3 during setup. We have now switched to a single codebase which runs natively on Python 2.7 and 3.3. For notes on how to maintain this, see :doc:`/development/pycompat`. Selecting matplotlib figure formats ----------------------------------- Deprecate single-format ``InlineBackend.figure_format`` configurable in favor of ``InlineBackend.figure_formats``, which is a set, supporting multiple simultaneous figure formats (e.g. png, pdf). This is available at runtime with the new API function :func:`IPython.display.set_matplotlib_formats`. clear_output changes -------------------- * There is no longer a 500ms delay when calling ``clear_output``. * The ability to clear stderr and stdout individually was removed. * A new ``wait`` flag that prevents ``clear_output`` from being executed until new output is available. This eliminates animation flickering by allowing the user to double buffer the output. * The output div height is remembered when the ``wait=True`` flag is used. Extending configurable containers --------------------------------- Some configurable traits are containers (list, dict, set) Config objects now support calling ``extend``, ``update``, ``insert``, etc. on traits in config files, which will ultimately result in calling those methods on the original object. The effect being that you can now add to containers without having to copy/paste the initial value:: c = get_config() c.InlineBackend.rc.update({ 'figure.figsize' : (6, 4) }) Changes to hidden namespace on startup -------------------------------------- Previously, all names declared in code run at startup (startup files, ``ipython -i script.py``, etc.) were added to the hidden namespace, which hides the names from tools like ``%whos``. There are two changes to this behavior: 1. Scripts run on the command-line ``ipython -i script.py``now behave the same as if they were passed to ``%run``, so their variables are never hidden. 2. A boolean config flag ``InteractiveShellApp.hide_initial_ns`` has been added to optionally disable the hidden behavior altogether. The default behavior is unchanged. Using dill to expand serialization support ------------------------------------------ The new function :func:`~IPython.utils.pickleutil.use_dill` allows dill to extend serialization support in :mod:`IPython.parallel` (closures, etc.). A :meth:`DirectView.use_dill` convenience method was also added, to enable dill locally and on all engines with one call. New IPython console lexer ------------------------- The IPython console lexer has been rewritten and now supports tracebacks and customized input/output prompts. See the :ref:`new lexer docs ` for details. DisplayFormatter changes ------------------------ There was no official way to query or remove callbacks in the Formatter API. To remedy this, the following methods are added to :class:`BaseFormatter`: - ``lookup(instance)`` - return appropriate callback or a given object - ``lookup_by_type(type_or_str)`` - return appropriate callback for a given type or ``'mod.name'`` type string - ``pop(type_or_str)`` - remove a type (by type or string). Pass a second argument to avoid KeyError (like dict). All of the above methods raise a KeyError if no match is found. And the following methods are changed: - ``for_type(type_or_str)`` - behaves the same as before, only adding support for ``'mod.name'`` type strings in addition to plain types. This removes the need for ``for_type_by_name()``, but it remains for backward compatibility. Formatters can now raise NotImplementedError in addition to returning None to indicate that they cannot format a given object. Exceptions and Warnings *********************** Exceptions are no longer silenced when formatters fail. Instead, these are turned into a :class:`~IPython.core.formatters.FormatterWarning`. A FormatterWarning will also be issued if a formatter returns data of an invalid type (e.g. an integer for 'image/png'). Other changes ------------- * `%%capture` cell magic now captures the rich display output, not just stdout/stderr * In notebook, Showing tooltip on tab has been disables to avoid conflict with completion, Shift-Tab could still be used to invoke tooltip when inside function signature and/or on selection. * ``object_info_request`` has been replaced by ``object_info`` for consistency in the javascript API. ``object_info`` is a simpler interface to register callback that is incompatible with ``object_info_request``. * Previous versions of IPython on Linux would use the XDG config directory, creating :file:`~/.config/ipython` by default. We have decided to go back to :file:`~/.ipython` for consistency among systems. IPython will issue a warning if it finds the XDG location, and will move it to the new location if there isn't already a directory there. * Equations, images and tables are now centered in Markdown cells. * Multiline equations are now centered in output areas; single line equations remain left justified. * IPython config objects can be loaded from and serialized to JSON. JSON config file have the same base name as their ``.py`` counterpart, and will be loaded with higher priority if found. * bash completion updated with support for all ipython subcommands and flags, including nbconvert * ``ipython history trim``: added ``--keep=`` as an alias for the more verbose ``--HistoryTrim.keep=`` * New ``ipython history clear`` subcommand, which is the same as the newly supported ``ipython history trim --keep=0`` * You can now run notebooks in an interactive session via ``%run notebook.ipynb``. * Print preview is back in the notebook menus, along with options to download the open notebook in various formats. This is powered by nbconvert. * :exc:`~IPython.nbconvert.utils.pandoc.PandocMissing` exceptions will be raised if Pandoc is unavailable, and warnings will be printed if the version found is too old. The recommended Pandoc version for use with nbconvert is 1.12.1. * The InlineBackend.figure_format now supports JPEG output if PIL/Pillow is available. * Input transformers (see :doc:`/config/inputtransforms`) may now raise :exc:`SyntaxError` if they determine that input is invalid. The input transformation machinery in IPython will handle displaying the exception to the user and resetting state. * Calling ``container.show()`` on javascript display is deprecated and will trigger errors on future IPython notebook versions. ``container`` now show itself as soon as non-empty * Added ``InlineBackend.print_figure_kwargs`` to allow passing keyword arguments to matplotlib's ``Canvas.print_figure``. This can be used to change the value of ``bbox_inches``, which is 'tight' by default, or set the quality of JPEG figures. * A new callback system has been introduced. For details, see :doc:`/config/callbacks`. * jQuery and require.js are loaded from CDNs in the default HTML template, so javascript is available in static HTML export (e.g. nbviewer). Backwards incompatible changes ------------------------------ * Python 2.6 and 3.2 are no longer supported: the minimum required Python versions are now 2.7 and 3.3. * The Transformer classes have been renamed to Preprocessor in nbconvert and their ``call`` methods have been renamed to ``preprocess``. * The ``call`` methods of nbconvert post-processors have been renamed to ``postprocess``. * The module ``IPython.core.fakemodule`` has been removed. * The alias system has been reimplemented to use magic functions. There should be little visible difference while automagics are enabled, as they are by default, but parts of the :class:`~IPython.core.alias.AliasManager` API have been removed. * We fixed an issue with switching between matplotlib inline and GUI backends, but the fix requires matplotlib 1.1 or newer. So from now on, we consider matplotlib 1.1 to be the minimally supported version for IPython. Older versions for the most part will work, but we make no guarantees about it. * The :command:`pycolor` command has been removed. We recommend the much more capable :command:`pygmentize` command from the `Pygments `_ project. If you need to keep the exact output of :command:`pycolor`, you can still use ``python -m IPython.utils.PyColorize foo.py``. * :mod:`IPython.lib.irunner` and its command-line entry point have been removed. It had fallen out of use long ago. * The ``input_prefilter`` hook has been removed, as it was never actually used by the code. The input transformer system offers much more powerful APIs to work with input code. See :doc:`/config/inputtransforms` for details. * :class:`IPython.core.inputsplitter.IPythonInputSplitter` no longer has a method ``source_raw_reset()``, but gains :meth:`~IPython.core.inputsplitter.IPythonInputSplitter.raw_reset` instead. Use of ``source_raw_reset`` can be replaced with:: raw = isp.source_raw transformed = isp.source_reset() * The Azure notebook manager was removed as it was no longer compatible with the notebook storage scheme. * Simplifying configurable URLs - base_project_url is renamed to base_url (base_project_url is kept as a deprecated alias, for now) - base_kernel_url configurable is removed (use base_url) - websocket_url configurable is removed (use base_url) ipython-8.35.0/docs/source/whatsnew/version3.rst000066400000000000000000000416311477474304100217130ustar00rootroot00000000000000============ 3.x Series ============ IPython 3.2.3 ============= Fixes compatibility with Python 3.4.4. IPython 3.2.2 ============= Address vulnerabilities when files have maliciously crafted filenames (CVE-2015-6938), or vulnerability when opening text files with malicious binary content (CVE pending). Users are **strongly** encouraged to upgrade immediately. There are also a few small unicode and nbconvert-related fixes. IPython 3.2.1 ============= IPython 3.2.1 is a small bugfix release, primarily for cross-site security fixes in the notebook. Users are **strongly** encouraged to upgrade immediately. There are also a few small unicode and nbconvert-related fixes. See :ref:`issues_list_3` for details. IPython 3.2 =========== IPython 3.2 contains important security fixes. Users are **strongly** encouraged to upgrade immediately. Highlights: - Address cross-site scripting vulnerabilities CVE-2015-4706, CVE-2015-4707 - A security improvement that set the secure attribute to login cookie to prevent them to be sent over http - Revert the face color of matplotlib axes in the inline backend to not be transparent. - Enable mathjax safe mode by default - Fix XSS vulnerability in JSON error messages - Various widget-related fixes See :ref:`issues_list_3` for details. IPython 3.1 =========== Released April 3, 2015 The first 3.x bugfix release, with 33 contributors and 344 commits. This primarily includes bugfixes to notebook layout and focus problems. Highlights: - Various focus jumping and scrolling fixes in the notebook. - Various message ordering and widget fixes in the notebook. - Images in markdown and output are confined to the notebook width. An `.unconfined` CSS class is added to disable this behavior per-image. The resize handle on output images is removed. - Improved ordering of tooltip content for Python functions, putting the signature at the top. - Fix UnicodeErrors when displaying some objects with unicode reprs on Python 2. - Set the kernel's working directory to the notebook directory when running ``nbconvert --execute``, so that behavior matches the live notebook. - Allow setting custom SSL options for the tornado server with ``NotebookApp.ssl_options``, and protect against POODLE with default settings by disabling SSLv3. - Fix memory leak in the IPython.parallel Controller on Python 3. See :ref:`issues_list_3` for details. Release 3.0 =========== Released February 27, 2015 This is a really big release. Over 150 contributors, and almost 6000 commits in a bit under a year. Support for languages other than Python is greatly improved, notebook UI has been significantly redesigned, and a lot of improvement has happened in the experimental interactive widgets. The message protocol and document format have both been updated, while maintaining better compatibility with previous versions than prior updates. The notebook webapp now enables editing of any text file, and even a web-based terminal (on Unix platforms). 3.x will be the last monolithic release of IPython, as the next release cycle will see the growing project split into its Python-specific and language-agnostic components. Language-agnostic projects (notebook, qtconsole, etc.) will move under the umbrella of the new Project Jupyter name, while Python-specific projects (interactive Python shell, Python kernel, IPython.parallel) will remain under IPython, and be split into a few smaller packages. To reflect this, IPython is in a bit of a transition state. The logo on the notebook is now the Jupyter logo. When installing kernels system-wide, they go in a `jupyter` directory. We are going to do our best to ease this transition for users and developers. Big changes are ahead. Using different kernels ----------------------- .. image:: ../_images/kernel_selector_screenshot.png :alt: Screenshot of 'new' dropdown showing different kernels :align: center You can now choose a kernel for a notebook within the user interface, rather than starting up a separate notebook server for each kernel you want to use. The syntax highlighting adapts to match the language you're working in. Information about the kernel is stored in the notebook file, so when you open a notebook, it will automatically start the correct kernel. It is also easier to use the Qt console and the terminal console with other kernels, using the --kernel flag:: ipython qtconsole --kernel bash ipython console --kernel bash # To list available kernels ipython kernelspec list Kernel authors should see :ref:`kernelspecs` for how to register their kernels with IPython so that these mechanisms work. Typing unicode identifiers -------------------------- .. image:: /_images/unicode_completion.png Complex expressions can be much cleaner when written with a wider choice of characters. Python 3 allows unicode identifiers, and IPython 3 makes it easier to type those, using a feature from Julia. Type a backslash followed by a LaTeX style short name, such as ``\alpha``. Press tab, and it will turn into α. Widget migration guide ---------------------- The widget framework has a lot of backwards incompatible changes. For information about migrating widget notebooks and custom widgets to 3.0 refer to the :doc:`widget migration guide`. Other new features ------------------ * :class:`~.TextWidget` and :class:`~.TextareaWidget` objects now include a ``placeholder`` attribute, for displaying placeholder text before the user has typed anything. * The :magic:`load` magic can now find the source for objects in the user namespace. To enable searching the namespace, use the ``-n`` option. .. sourcecode:: ipython In [1]: %load -n my_module.some_function * :class:`~.DirectView` objects have a new :meth:`~.DirectView.use_cloudpickle` method, which works like ``view.use_dill()``, but causes the ``cloudpickle`` module from PiCloud's `cloud`__ library to be used rather than dill or the builtin pickle module. __ https://pypi.python.org/pypi/cloud * Added a .ipynb exporter to nbconvert. It can be used by passing `--to notebook` as a commandline argument to nbconvert. * New nbconvert preprocessor called :class:`~.ClearOutputPreprocessor`. This clears the output from IPython notebooks. * New preprocessor for nbconvert that executes all the code cells in a notebook. To run a notebook and save its output in a new notebook:: ipython nbconvert InputNotebook --ExecutePreprocessor.enabled=True --to notebook --output Executed * Consecutive stream (stdout/stderr) output is merged into a single output in the notebook document. Previously, all output messages were preserved as separate output fields in the JSON. Now, the same merge is applied to the stored output as the displayed output, improving document load time for notebooks with many small outputs. * ``NotebookApp.webapp_settings`` is deprecated and replaced with the more informatively named ``NotebookApp.tornado_settings``. * Using :magic:`timeit` prints warnings if there is at least a 4x difference in timings between the slowest and fastest runs, since this might meant that the multiple runs are not independent of one another. * It's now possible to provide mechanisms to integrate IPython with other event loops, in addition to the ones we already support. This lets you run GUI code in IPython with an interactive prompt, and to embed the IPython kernel in GUI applications. See :doc:`/config/eventloops` for details. As part of this, the direct ``enable_*`` and ``disable_*`` functions for various GUIs in :mod:`IPython.lib.inputhook` have been deprecated in favour of :meth:`~.InputHookManager.enable_gui` and :meth:`~.InputHookManager.disable_gui`. * A ``ScrollManager`` was added to the notebook. The ``ScrollManager`` controls how the notebook document is scrolled using keyboard. Users can inherit from the ``ScrollManager`` or ``TargetScrollManager`` to customize how their notebook scrolls. The default ``ScrollManager`` is the ``SlideScrollManager``, which tries to scroll to the nearest slide or sub-slide cell. * The function :func:`~IPython.html.widgets.interaction.interact_manual` has been added which behaves similarly to :func:`~IPython.html.widgets.interaction.interact`, but adds a button to explicitly run the interacted-with function, rather than doing it automatically for every change of the parameter widgets. This should be useful for long-running functions. * The ``%cython`` magic is now part of the Cython module. Use `%load_ext Cython` with a version of Cython >= 0.21 to have access to the magic now. * The Notebook application now offers integrated terminals on Unix platforms, intended for when it is used on a remote server. To enable these, install the ``terminado`` Python package. * The Notebook application can now edit any plain text files, via a full-page CodeMirror instance. * Setting the default highlighting language for nbconvert with the config option ``NbConvertBase.default_language`` is deprecated. Nbconvert now respects metadata stored in the :ref:`kernel spec `. * IPython can now be configured systemwide, with files in :file:`/etc/ipython` or :file:`/usr/local/etc/ipython` on Unix systems, or :file:`{%PROGRAMDATA%}\\ipython` on Windows. * Added support for configurable user-supplied `Jinja `_ HTML templates for the notebook. Paths to directories containing template files can be specified via ``NotebookApp.extra_template_paths``. User-supplied template directories searched first by the notebook, making it possible to replace existing templates with your own files. For example, to replace the notebook's built-in ``error.html`` with your own, create a directory like ``/home/my_templates`` and put your override template at ``/home/my_templates/error.html``. To start the notebook with your custom error page enabled, you would run:: ipython notebook '--extra_template_paths=["/home/my_templates/"]' It's also possible to override a template while also `inheriting `_ from that template, by prepending ``templates/`` to the ``{% extends %}`` target of your child template. This is useful when you only want to override a specific block of a template. For example, to add additional CSS to the built-in ``error.html``, you might create an override that looks like:: {% extends "templates/error.html" %} {% block stylesheet %} {{super()}} {% endblock %} * Added a widget persistence API. This allows you to persist your notebooks interactive widgets. Two levels of control are provided: 1. Higher level- ``WidgetManager.set_state_callbacks`` allows you to register callbacks for loading and saving widget state. The callbacks you register are automatically called when necessary. 2. Lower level- the ``WidgetManager`` Javascript class now has ``get_state`` and ``set_state`` methods that allow you to get and set the state of the widget runtime. Example code for persisting your widget state to session data:: %%javascript require(['widgets/js/manager'], function(manager) { manager.WidgetManager.set_state_callbacks(function() { // Load return JSON.parse(sessionStorage.widgets_state || '{}'); }, function(state) { // Save sessionStorage.widgets_state = JSON.stringify(state); }); }); * Enhanced support for :magic:`env` magic. As before, :magic:`env` with no arguments displays all environment variables and values. Additionally, :magic:`env` can be used to get or set individual environment variables. To display an individual value, use the `%env var` syntax. To set a value, use `env var val` or `env var=val`. Python value expansion using `$` works as usual. Backwards incompatible changes ------------------------------ * The :ref:`message protocol ` has been updated from version 4 to version 5. Adapters are included, so IPython frontends can still talk to kernels that implement protocol version 4. * The notebook format has been updated from version 3 to version 4. Read-only support for v4 notebooks has been backported to IPython 2.4. Notable changes: * heading cells are removed in favor or markdown headings * notebook outputs and output messages are more consistent with each other * use :func:`IPython.nbformat.read` and :func:`~IPython.nbformat.write` to read and write notebook files instead of the deprecated :mod:`IPython.nbformat.current` APIs. You can downgrade a notebook to v3 via ``nbconvert``:: ipython nbconvert --to notebook --nbformat 3 which will create :file:`notebook.v3.ipynb`, a copy of the notebook in v3 format. * :func:`IPython.core.oinspect.getsource` call specification has changed: * `oname` keyword argument has been added for property source formatting * `is_binary` keyword argument has been dropped, passing ``True`` had previously short-circuited the function to return ``None`` unconditionally * Removed the octavemagic extension: it is now available as ``oct2py.ipython``. * Creating PDFs with LaTeX no longer uses a post processor. Use `nbconvert --to pdf` instead of `nbconvert --to latex --post pdf`. * Used https://github.com/jdfreder/bootstrap2to3 to migrate the Notebook to Bootstrap 3. Additional changes: - Set `.tab-content .row` `0px;` left and right margin (bootstrap default is `-15px;`) - Removed `height: @btn_mini_height;` from `.list_header>div, .list_item>div` in `tree.less` - Set `#header` div `margin-bottom: 0px;` - Set `#menus` to `float: left;` - Set `#maintoolbar .navbar-text` to `float: none;` - Added no-padding convenience class. - Set border of #maintoolbar to 0px * Accessing the `container` DOM object when displaying javascript has been deprecated in IPython 2.0 in favor of accessing `element`. Starting with IPython 3.0 trying to access `container` will raise an error in browser javascript console. * ``IPython.utils.py3compat.open`` was removed: :func:`io.open` provides all the same functionality. * The NotebookManager and ``/api/notebooks`` service has been replaced by a more generic ContentsManager and ``/api/contents`` service, which supports all kinds of files. * The Dashboard now lists all files, not just notebooks and directories. * The ``--script`` hook for saving notebooks to Python scripts is removed, use :samp:`ipython nbconvert --to python {notebook}` instead. * The ``rmagic`` extension is deprecated, as it is now part of rpy2. See :mod:`rpy2.ipython.rmagic`. * :meth:`~.KernelManager.start_kernel` and :meth:`~.KernelManager.format_kernel_cmd` no longer accept a ``executable`` parameter. Use the kernelspec machinery instead. * The widget classes have been renamed from `*Widget` to `*`. The old names are still functional, but are deprecated. i.e. `IntSliderWidget` has been renamed to `IntSlider`. * The ContainerWidget was renamed to Box and no longer defaults as a flexible box in the web browser. A new FlexBox widget was added, which allows you to use the flexible box model. * The notebook now uses a single websocket at `/kernels//channels` instead of separate `/kernels//{shell|iopub|stdin}` channels. Messages on each channel are identified by a `channel` key in the message dict, for both send and recv. Content Security Policy ``````````````````````` The Content Security Policy is a web standard for adding a layer of security to detect and mitigate certain classes of attacks, including Cross Site Scripting (XSS) and data injection attacks. This was introduced into the notebook to ensure that the IPython Notebook and its APIs (by default) can only be embedded in an iframe on the same origin. Override ``headers['Content-Security-Policy']`` within your notebook configuration to extend for alternate domains and security settings.:: c.NotebookApp.tornado_settings = { 'headers': { 'Content-Security-Policy': "frame-ancestors 'self'" } } Example policies:: Content-Security-Policy: default-src 'self' https://*.jupyter.org Matches embeddings on any subdomain of jupyter.org, so long as they are served over SSL. There is a `report-uri `_ endpoint available for logging CSP violations, located at ``/api/security/csp-report``. To use it, set ``report-uri`` as part of the CSP:: c.NotebookApp.tornado_settings = { 'headers': { 'Content-Security-Policy': "frame-ancestors 'self'; report-uri /api/security/csp-report" } } It simply provides the CSP report as a warning in IPython's logs. The default CSP sets this report-uri relative to the ``base_url`` (not shown above). For a more thorough and accurate guide on Content Security Policies, check out `MDN's Using Content Security Policy `_ for more examples. ipython-8.35.0/docs/source/whatsnew/version3_widget_migration.rst000066400000000000000000000360411477474304100253260ustar00rootroot00000000000000Migrating Widgets to IPython 3 ============================== Upgrading Notebooks ------------------- 1. The first thing you'll notice when upgrading an IPython 2.0 widget notebook to IPython 3.0 is the "Notebook converted" dialog. Click "ok". 2. All of the widgets distributed with IPython have been renamed. The "Widget" suffix was removed from the end of the class name. i.e. ``ButtonWidget`` is now ``Button``. 3. ``ContainerWidget`` was renamed to ``Box``. 4. ``PopupWidget`` was removed from IPython, because bootstrapjs was problematic (creates global variables, etc.). If you use the ``PopupWidget``, try using a ``Box`` widget instead. If your notebook can't live without the popup functionality, subclass the ``Box`` widget (both in Python and JS) and use JQuery UI's ``draggable()`` and ``resizable()`` methods to mimic the behavior. 5. ``add_class`` and ``remove_class`` were removed. More often than not a new attribute exists on the widget that allows you to achieve the same explicitly. i.e. the ``Button`` widget now has a ``button_style`` attribute which you can set to 'primary', 'success', 'info', 'warning', 'danger', or '' instead of using ``add_class`` to add the bootstrap class. ``VBox`` and ``HBox`` classes (flexible ``Box`` subclasses) were added that allow you to avoid using ``add_class`` and ``remove_class`` to make flexible box model layouts. As a last resort, if you can't find a built in attribute for the class you want to use, a new ``_dom_classes`` list trait was added, which combines ``add_class`` and ``remove_class`` into one stateful list. 6. ``set_css`` and ``get_css`` were removed in favor of explicit style attributes - ``visible``, ``width``, ``height``, ``padding``, ``margin``, ``color``, ``background_color``, ``border_color``, ``border_width``, ``border_radius``, ``border_style``, ``font_style``, ``font_weight``, ``font_size``, and ``font_family`` are a few. If you can't find a trait to see the css attribute you need, you can, in order of preference, (A) subclass to create your own custom widget, (B) use CSS and the ``_dom_classes`` trait to set ``_dom_classes``, or (C) use the ``_css`` dictionary to set CSS styling like ``set_css`` and ``get_css``. 7. For selection widgets, such as ``Dropdown``, the ``values`` argument has been renamed to ``options``. Upgrading Custom Widgets ------------------------ Javascript ~~~~~~~~~~ 1. If you are distributing your widget and decide to use the deferred loading technique (preferred), you can remove all references to the WidgetManager and the register model/view calls (see the Python section below for more information). 2. In 2.0 require.js was used incorrectly, that has been fixed and now loading works more like Python's import. Requiring ``widgets/js/widget`` doesn't import the ``WidgetManager`` class, instead it imports a dictionary that exposes the classes within that module: .. code:: javascript { 'WidgetModel': WidgetModel, 'WidgetView': WidgetView, 'DOMWidgetView': DOMWidgetView, 'ViewList': ViewList, } If you decide to continue to use the widget registry (by registering your widgets with the manager), you can import a dictionary with a handle to the WidgetManager class by requiring ``widgets/js/manager``. Doing so will import: .. code:: javascript {'WidgetManager': WidgetManager} 3. Don't rely on the ``IPython`` namespace for anything. To inherit from the DOMWidgetView, WidgetView, or WidgetModel, require ``widgets/js/widget`` as ``widget``. If you were inheriting from DOMWidgetView, and the code looked like this: .. code:: javascript IPython.DOMWidgetView.extend({...}) It would become this: .. code:: javascript widget.DOMWidgetView.extend({...}) 4. Custom models are encouraged. When possible, it's recommended to move your code into a custom model, so actions are performed 1 time, instead of N times where N is the number of displayed views. Python ~~~~~~ Generally, custom widget Python code can remain unchanged. If you distribute your custom widget, you may be using ``display`` and ``Javascript`` to publish the widget's Javascript to the front-end. That is no longer the recommended way of distributing widget Javascript. Instead have the user install the Javascript to his/her nbextension directory or their profile's static directory. Then use the new ``_view_module`` and ``_model_module`` traitlets in combination with ``_view_name`` and ``_model_name`` to instruct require.js on how to load the widget's Javascript. The Javascript is then loaded when the widget is used for the first time. Details ------- Asynchronous ~~~~~~~~~~~~ In the IPython 2.x series the only way to register custom widget views and models was to use the registry in the widget manager. Unfortunately, using this method made distributing and running custom widgets difficult. The widget maintainer had to either use the rich display framework to push the widget's Javascript to the notebook or instruct the users to install the Javascript by hand in a custom profile. With the first method, the maintainer would have to be careful about when the Javascript was pushed to the front-end. If the Javascript was pushed on Python widget ``import``, the widgets wouldn't work after page refresh. This is because refreshing the page does not restart the kernel, and the Python ``import`` statement only runs once in a given kernel instance (unless you reload the Python modules, which isn't straight forward). This meant the maintainer would have to have a separate ``push_js()`` method that the user would have to call after importing the widget's Python code. Our solution was to add support for loading widget views and models using require.js paths. Thus the comm and widget frameworks now support lazy loading. To do so, everything had to be converted to asynchronous code. HTML5 promises are used to accomplish that (`#6818 `__, `#6914 `__). Symmetry ~~~~~~~~ In IPython 3.0, widgets can be instantiated from the front-end (`#6664 `__). On top of this, a widget persistence API was added (`#7163 `__, `#7227 `__). With the widget persistence API, you can persist your widget instances using Javascript. This makes it easy to persist your widgets to your notebook document (with a small amount of custom JS). By default, the widgets are persisted to your web browsers local storage which makes them reappear when your refresh the page. Smaller Changes ~~~~~~~~~~~~~~~ - Latex math is supported in widget ``description``\ s (`#5937 `__). - Widgets can be display more than once within a single container widget (`#5963 `__, `#6990 `__). - ``FloatRangeSlider`` and ``IntRangeSlider`` were added (`#6050 `__). - "Widget" was removed from the ends of all of the widget class names (`#6125 `__). - ``ContainerWidget`` was renamed to ``Box`` (`#6125 `__). - ``HBox`` and ``VBox`` widgets were added (`#6125 `__). - ``add\_class`` and ``remove\_class`` were removed in favor of a ``_dom_classes`` list (`#6235 `__). - ``get\_css`` and ``set\_css`` were removed in favor of explicit traits for widget styling (`#6235 `__). - ``jslink`` and ``jsdlink`` were added (`#6454 `__, `#7468 `__). - An ``Output`` widget was added, which allows you to ``print`` and ``display`` within widgets (`#6670 `__). - ``PopupWidget`` was removed (`#7341 `__). - A visual cue was added for widgets with 'dead' comms (`#7227 `__). - A ``SelectMultiple`` widget was added (a ``Select`` widget that allows multiple things to be selected at once) (`#6890 `__). - A class was added to help manage children views (`#6990 `__). - A warning was added that shows on widget import because it's expected that the API will change again by IPython 4.0. This warning can be suppressed (`#7107 `__, `#7200 `__, `#7201 `__, `#7204 `__). Comm and Widget PR Index ------------------------ Here is a chronological list of PRs affecting the widget and comm frameworks for IPython 3.0. Note that later PRs may revert changes made in earlier PRs: - Add placeholder attribute to text widgets `#5652 `__ - Add latex support in widget labels, `#5937 `__ - Allow widgets to display more than once within container widgets. `#5963 `__ - use require.js, `#5980 `__ - Range widgets `#6050 `__ - Interact on\_demand option `#6051 `__ - Allow text input on slider widgets `#6106 `__ - support binary buffers in comm messages `#6110 `__ - Embrace the flexible box model in the widgets `#6125 `__ - Widget trait serialization `#6128 `__ - Make Container widgets take children as the first positional argument `#6153 `__ - once-displayed `#6168 `__ - Validate slider value, when limits change `#6171 `__ - Unregistering comms in Comm Manager `#6216 `__ - Add EventfulList and EventfulDict trait types. `#6228 `__ - Remove add/remove\_class and set/get\_css. `#6235 `__ - avoid unregistering widget model twice `#6250 `__ - Widget property lock should compare json states, not python states `#6332 `__ - Strip the IPY\_MODEL\_ prefix from widget IDs before referencing them. `#6377 `__ - "event" is not defined error in Firefox `#6437 `__ - Javascript link `#6454 `__ - Bulk update of widget attributes `#6463 `__ - Creating a widget registry on the Python side. `#6493 `__ - Allow widget views to be loaded from require modules `#6494 `__ - Fix Issue #6530 `#6532 `__ - Make comm manager (mostly) independent of InteractiveShell `#6540 `__ - Add semantic classes to top-level containers for single widgets `#6609 `__ - Selection Widgets: forcing 'value' to be in 'values' `#6617 `__ - Allow widgets to be constructed from Javascript `#6664 `__ - Output widget `#6670 `__ - Minor change in widgets.less to fix alignment issue `#6681 `__ - Make Selection widgets respect values order. `#6747 `__ - Widget persistence API `#6789 `__ - Add promises to the widget framework. `#6818 `__ - SelectMultiple widget `#6890 `__ - Tooltip on toggle button `#6923 `__ - Allow empty text box \*while typing\* for numeric widgets `#6943 `__ - Ignore failure of widget MathJax typesetting `#6948 `__ - Refactor the do\_diff and manual child view lists into a separate ViewList object `#6990 `__ - Add warning to widget namespace import. `#7107 `__ - lazy load widgets `#7120 `__ - Fix padding of widgets. `#7139 `__ - Persist widgets across page refresh `#7163 `__ - Make the widget experimental error a real python warning `#7200 `__ - Make the widget error message shorter and more understandable. `#7201 `__ - Make the widget warning brief and easy to filter `#7204 `__ - Add visual cue for widgets with dead comms `#7227 `__ - Widget values as positional arguments `#7260 `__ - Remove the popup widget `#7341 `__ - document and validate link, dlink `#7468 `__ - Document interact 5637 `#7525 `__ - Update some broken examples of using widgets `#7547 `__ - Use Output widget with Interact `#7554 `__ - don't send empty execute\_result messages `#7560 `__ - Validation on the python side `#7602 `__ - only show prompt overlay if there's a prompt `#7661 `__ - Allow predictate to be used for comparison in selection widgets `#7674 `__ - Fix widget view persistence. `#7680 `__ - Revert "Use Output widget with Interact" `#7703 `__ ipython-8.35.0/docs/source/whatsnew/version4.rst000066400000000000000000000065171477474304100217200ustar00rootroot00000000000000============ 4.x Series ============ IPython 4.2 =========== IPython 4.2 (April, 2016) includes various bugfixes and improvements over 4.1. - Fix ``ipython -i`` on errors, which was broken in 4.1. - The delay meant to highlight deprecated commands that have moved to jupyter has been removed. - Improve compatibility with future versions of traitlets and matplotlib. - Use stdlib :func:`python:shutil.get_terminal_size` to measure terminal width when displaying tracebacks (provided by ``backports.shutil_get_terminal_size`` on Python 2). You can see the rest `on GitHub `__. IPython 4.1 =========== IPython 4.1.2 (March, 2016) fixes installation issues with some versions of setuptools. Released February, 2016. IPython 4.1 contains mostly bug fixes, though there are a few improvements. - IPython debugger (IPdb) now supports the number of context lines for the ``where`` (and ``w``) commands. The `context` keyword is also available in various APIs. See PR :ghpull:`9097` - YouTube video will now show thumbnail when exported to a media that do not support video. (:ghpull:`9086`) - Add warning when running `ipython ` when subcommand is deprecated. `jupyter` should now be used. - Code in `%pinfo` (also known as `??`) are now highlighter (:ghpull:`8947`) - `%aimport` now support module completion. (:ghpull:`8884`) - `ipdb` output is now colored ! (:ghpull:`8842`) - Add ability to transpose columns for completion: (:ghpull:`8748`) Many many docs improvements and bug fixes, you can see the `list of changes `_ IPython 4.0 =========== Released August, 2015 IPython 4.0 is the first major release after the Big Split. IPython no longer contains the notebook, qtconsole, etc. which have moved to `jupyter `_. IPython subprojects, such as `IPython.parallel `_ and `widgets `_ have moved to their own repos as well. The following subpackages are deprecated: - IPython.kernel (now jupyter_client and ipykernel) - IPython.consoleapp (now jupyter_client.consoleapp) - IPython.nbformat (now nbformat) - IPython.nbconvert (now nbconvert) - IPython.html (now notebook) - IPython.parallel (now ipyparallel) - IPython.utils.traitlets (now traitlets) - IPython.config (now traitlets.config) - IPython.qt (now qtconsole) - IPython.terminal.console (now jupyter_console) and a few other utilities. Shims for the deprecated subpackages have been added, so existing code should continue to work with a warning about the new home. There are few changes to the code beyond the reorganization and some bugfixes. IPython highlights: - Public APIs for discovering IPython paths is moved from :mod:`IPython.utils.path` to :mod:`IPython.paths`. The old function locations continue to work with deprecation warnings. - Code raising ``DeprecationWarning`` entered by the user in an interactive session will now display the warning by default. See :ghpull:`8480` an :ghissue:`8478`. - The `--deep-reload` flag and the corresponding options to inject `dreload` or `reload` into the interactive namespace have been deprecated, and will be removed in future versions. You should now explicitly import `reload` from `IPython.lib.deepreload` to use it. ipython-8.35.0/docs/source/whatsnew/version5.rst000066400000000000000000000437261477474304100217240ustar00rootroot00000000000000============ 5.x Series ============ .. _whatsnew580: IPython 5.8.0 ============= * Update inspecting function/methods for future-proofing. :ghpull:`11139` .. _whatsnew570: IPython 5.7 =========== * Fix IPython trying to import non-existing matplotlib backends :ghpull:`11087` * fix for display hook not publishing object metadata :ghpull:`11101` .. _whatsnew560: IPython 5.6 =========== * In Python 3.6 and above, dictionaries preserve the order items were added to them. On these versions, IPython will display dictionaries in their native order, rather than sorting by the keys (:ghpull:`10958`). * :class:`~.IPython.display.ProgressBar` can now be used as an iterator (:ghpull:`10813`). * The shell object gains a :meth:`~.InteractiveShell.check_complete` method, to allow a smoother transition to new input processing machinery planned for IPython 7 (:ghpull:`11044`). * IPython should start faster, as it no longer looks for all available pygments styles on startup (:ghpull:`10859`). You can see all the PR marked for the `5.6. milestone `_, and all the `backport versions `__. .. _whatsnew550: IPython 5.5 =========== System Wide config ------------------ - IPython now looks for config files in ``{sys.prefix}/etc/ipython`` for environment-specific configuration. - Startup files can be found in ``/etc/ipython/startup`` or ``{sys.prefix}/etc/ipython/startup`` in addition to the profile directory, for system-wide or env-specific startup files. See :ghpull:`10644` ProgressBar ----------- IPython now has built-in support for progressbars:: In[1]: from IPython.display import ProgressBar ... : pb = ProgressBar(100) ... : pb In[2]: pb.progress = 50 # progress bar in cell 1 updates. See :ghpull:`10755` Misc ---- - Fix ``IPython.core.display:Pretty._repr_pretty_`` had the wrong signature. (:ghpull:`10625`) - :magic:`timeit` now give a correct ``SyntaxError`` if naked ``return`` used. (:ghpull:`10637`) - Prepare the ``:ipython:`` directive to be compatible with Sphinx 1.7. (:ghpull:`10668`) - Make IPython work with OpenSSL in FIPS mode; change hash algorithm of input from md5 to sha1. (:ghpull:`10696`) - Clear breakpoints before running any script with debugger. (:ghpull:`10699`) - Document that :magic:`profile` is deprecated, not to be confused with :magic:`prun`. (:ghpull:`10707`) - Limit default number of returned completions to 500. (:ghpull:`10743`) You can see all the PR marked for the `5.5. milestone `_, and all the `backport versions `_. IPython 5.4.1 ============= Released a few hours after 5.4, fix a crash when ``backports.shutil-get-terminal-size`` is not installed. :ghissue:`10629` .. _whatsnew540: IPython 5.4 =========== IPython 5.4-LTS is the first release of IPython after the release of the 6.x series which is Python 3 only. It backports most of the new exposed API additions made in IPython 6.0 and 6.1 and avoid having to write conditional logics depending of the version of IPython. Please upgrade to pip 9 or greater before upgrading IPython. Failing to do so on Python 2 may lead to a broken IPython install. Configurable TerminalInteractiveShell ------------------------------------- Backported from the 6.x branch as an exceptional new feature. See :ghpull:`10373` and :ghissue:`10364` IPython gained a new ``c.TerminalIPythonApp.interactive_shell_class`` option that allow to customize the class used to start the terminal frontend. This should allow user to use custom interfaces, like reviving the former readline interface which is now a separate package not maintained by the core team. Define ``_repr_mimebundle_`` ---------------------------- Object can now define `_repr_mimebundle_` in place of multiple `_repr_*_` methods and return a full mimebundle. This greatly simplify many implementation and allow to publish custom mimetypes (like geojson, plotly, dataframes....). See the ``Custom Display Logic`` example notebook for more information. Execution Heuristics -------------------- The heuristic for execution in the command line interface is now more biased toward executing for single statement. While in IPython 4.x and before a single line would be executed when enter is pressed, IPython 5.x would insert a new line. For single line statement this is not true anymore and if a single line is valid Python, IPython will execute it regardless of the cursor position. Use :kbd:`Ctrl-O` to insert a new line. :ghpull:`10489` Implement Display IDs --------------------- Implement display id and ability to update a given display. This should greatly simplify a lot of code by removing the need for widgets and allow other frontend to implement things like progress-bars. See :ghpull:`10048` Display function ---------------- The :func:`display() ` function is now available by default in an IPython session, meaning users can call it on any object to see their rich representation. This should allow for better interactivity both at the REPL and in notebook environment. Scripts and library that rely on display and may be run outside of IPython still need to import the display function using ``from IPython.display import display``. See :ghpull:`10596` Miscs ----- * ``_mp_main_`` is not reloaded which fixes issues with multiprocessing. :ghpull:`10523` * Use user colorscheme in Pdb as well :ghpull:`10479` * Faster shutdown. :ghpull:`10408` * Fix a crash in reverse search. :ghpull:`10371` * added ``Completer.backslash_combining_completions`` boolean option to deactivate backslash-tab completion that may conflict with windows path. IPython 5.3 =========== Released on February 24th, 2017. Remarkable changes and fixes: * Fix a bug in ``set_next_input`` leading to a crash of terminal IPython. :ghpull:`10231`, :ghissue:`10296`, :ghissue:`10229` * Always wait for editor inputhook for terminal IPython :ghpull:`10239`, :ghpull:`10240` * Disable ``_ipython_display_`` in terminal :ghpull:`10249`, :ghpull:`10274` * Update terminal colors to be more visible by default on windows :ghpull:`10260`, :ghpull:`10238`, :ghissue:`10281` * Add Ctrl-Z shortcut (suspend) in terminal debugger :ghpull:`10254`, :ghissue:`10273` * Indent on new line by looking at the text before the cursor :ghpull:`10264`, :ghpull:`10275`, :ghissue:`9283` * Update QtEventloop integration to fix some matplotlib integration issues :ghpull:`10201`, :ghpull:`10311`, :ghissue:`10201` * Respect completions display style in terminal debugger :ghpull:`10305`, :ghpull:`10313` * Add a config option ``TerminalInteractiveShell.extra_open_editor_shortcuts`` to enable extra shortcuts to open the input in an editor. These are :kbd:`v` in vi mode, and :kbd:`C-X C-E` in emacs mode (:ghpull:`10330`). The :kbd:`F2` shortcut is always enabled. IPython 5.2.2 ============= * Fix error when starting with ``IPCompleter.limit_to__all__`` configured. IPython 5.2.1 ============= * Fix tab completion in the debugger. :ghpull:`10223` IPython 5.2 =========== Released on January 29th, 2017. Remarkable changes and fixes: * restore IPython's debugger to raise on quit. :ghpull:`10009` * The configuration value ``c.TerminalInteractiveShell.highlighting_style`` can now directly take a class argument for custom color style. :ghpull:`9848` * Correctly handle matplotlib figures dpi :ghpull:`9868` * Deprecate ``-e`` flag for the ``%notebook`` magic that had no effects. :ghpull:`9872` * You can now press F2 while typing at a terminal prompt to edit the contents in your favourite terminal editor. Set the :envvar:`EDITOR` environment variable to pick which editor is used. :ghpull:`9929` * sdists will now only be ``.tar.gz`` as per upstream PyPI requirements. :ghpull:`9925` * :any:`IPython.core.debugger` have gained a ``set_trace()`` method for convenience. :ghpull:`9947` * The 'smart command mode' added to the debugger in 5.0 was removed, as more people preferred the previous behaviour. Therefore, debugger commands such as ``c`` will act as debugger commands even when ``c`` is defined as a variable. :ghpull:`10050` * Fixes OS X event loop issues at startup, :ghpull:`10150` * Deprecate the ``%autoindent`` magic. :ghpull:`10176` * Emit a :any:`DeprecationWarning` when setting the deprecated ``limit_to_all`` option of the completer. :ghpull:`10198` * The :cellmagic:`capture` magic can now capture the result of a cell (from an expression on the last line), as well as printed and displayed output. :ghpull:`9851`. Changes of behavior to :any:`InteractiveShellEmbed`. :any:`InteractiveShellEmbed` interactive behavior have changed a bit in between 5.1 and 5.2. By default ``%kill_embedded`` magic will prevent further invocation of the current ``call location`` instead of preventing further invocation of the current instance creation location. For most use case this will not change much for you, though previous behavior was confusing and less consistent with previous IPython versions. You can now deactivate instances by using ``%kill_embedded --instance`` flag, (or ``-i`` in short). The ``%kill_embedded`` magic also gained a ``--yes``/``-y`` option which skip confirmation step, and ``-x``/``--exit`` which also exit the current embedded call without asking for confirmation. See :ghpull:`10207`. IPython 5.1 =========== * Broken ``%timeit`` on Python2 due to the use of ``__qualname__``. :ghpull:`9804` * Restore ``%gui qt`` to create and return a ``QApplication`` if necessary. :ghpull:`9789` * Don't set terminal title by default. :ghpull:`9801` * Preserve indentation when inserting newlines with ``Ctrl-O``. :ghpull:`9770` * Restore completion in debugger. :ghpull:`9785` * Deprecate ``IPython.core.debugger.Tracer()`` in favor of simpler, newer, APIs. :ghpull:`9731` * Restore ``NoOpContext`` context manager removed by mistake, and add `DeprecationWarning`. :ghpull:`9765` * Add option allowing ``Prompt_toolkit`` to use 24bits colors. :ghpull:`9736` * Fix for closing interactive matplotlib windows on OS X. :ghpull:`9854` * An embedded interactive shell instance can be used more than once. :ghpull:`9843` * More robust check for whether IPython is in a terminal. :ghpull:`9833` * Better pretty-printing of dicts on PyPy. :ghpull:`9827` * Some coloured output now looks better on dark background command prompts in Windows. :ghpull:`9838` * Improved tab completion of paths on Windows . :ghpull:`9826` * Fix tkinter event loop integration on Python 2 with ``future`` installed. :ghpull:`9824` * Restore ``Ctrl-\`` as a shortcut to quit IPython. * Make ``get_ipython()`` accessible when modules are imported by startup files. :ghpull:`9818` * Add support for running directories containing a ``__main__.py`` file with the ``ipython`` command. :ghpull:`9813` True Color feature ------------------ ``prompt_toolkit`` uses pygments styles for syntax highlighting. By default, the colors specified in the style are approximated using a standard 256-color palette. ``prompt_toolkit`` also supports 24bit, a.k.a. "true", a.k.a. 16-million color escape sequences which enable compatible terminals to display the exact colors specified instead of an approximation. This true_color option exposes that capability in prompt_toolkit to the IPython shell. Here is a good source for the current state of true color support in various terminal emulators and software projects: https://gist.github.com/XVilka/8346728 IPython 5.0 =========== Released July 7, 2016 New terminal interface ---------------------- IPython 5 features a major upgrade to the terminal interface, bringing live syntax highlighting as you type, proper multiline editing and multiline paste, and tab completions that don't clutter up your history. .. image:: ../_images/ptshell_features.png :alt: New terminal interface features :align: center :target: ../_images/ptshell_features.png These features are provided by the Python library `prompt_toolkit `__, which replaces ``readline`` throughout our terminal interface. Relying on this pure-Python, cross platform module also makes it simpler to install IPython. We have removed dependencies on ``pyreadline`` for Windows and ``gnureadline`` for Mac. Backwards incompatible changes ------------------------------ - The ``%install_ext`` magic function, deprecated since 4.0, has now been deleted. You can distribute and install extensions as packages on PyPI. - Callbacks registered while an event is being handled will now only be called for subsequent events; previously they could be called for the current event. Similarly, callbacks removed while handling an event *will* always get that event. See :ghissue:`9447` and :ghpull:`9453`. - Integration with pydb has been removed since pydb development has been stopped since 2012, and pydb is not installable from PyPI. - The ``autoedit_syntax`` option has apparently been broken for many years. It has been removed. New terminal interface ~~~~~~~~~~~~~~~~~~~~~~ The overhaul of the terminal interface will probably cause a range of minor issues for existing users. This is inevitable for such a significant change, and we've done our best to minimise these issues. Some changes that we're aware of, with suggestions on how to handle them: IPython no longer uses readline configuration (``~/.inputrc``). We hope that the functionality you want (e.g. vi input mode) will be available by configuring IPython directly (see :doc:`/config/options/terminal`). If something's missing, please file an issue. The ``PromptManager`` class has been removed, and the prompt machinery simplified. See :ref:`custom_prompts` to customise prompts with the new machinery. :mod:`IPython.core.debugger` now provides a plainer interface. :mod:`IPython.terminal.debugger` contains the terminal debugger using prompt_toolkit. There are new options to configure the colours used in syntax highlighting. We have tried to integrate them with our classic ``--colors`` option and ``%colors`` magic, but there's a mismatch in possibilities, so some configurations may produce unexpected results. See :ref:`termcolour` for more information. The new interface is not compatible with Emacs 'inferior-shell' feature. To continue using this, add the ``--simple-prompt`` flag to the command Emacs runs. This flag disables most IPython features, relying on Emacs to provide things like tab completion. Provisional Changes ------------------- Provisional changes are experimental functionality that may, or may not, make it into a future version of IPython, and which API may change without warnings. Activating these features and using these API are at your own risk, and may have security implication for your system, especially if used with the Jupyter notebook, When running via the Jupyter notebook interfaces, or other compatible client, you can enable rich documentation experimental functionality: When the ``docrepr`` package is installed setting the boolean flag ``InteractiveShell.sphinxify_docstring`` to ``True``, will process the various object through sphinx before displaying them (see the ``docrepr`` package documentation for more information. You need to also enable the IPython pager display rich HTML representation using the ``InteractiveShell.enable_html_pager`` boolean configuration option. As usual you can set these configuration options globally in your configuration files, alternatively you can turn them on dynamically using the following snippet: .. code-block:: python ip = get_ipython() ip.sphinxify_docstring = True ip.enable_html_pager = True You can test the effect of various combinations of the above configuration in the Jupyter notebook, with things example like : .. code-block:: ipython import numpy as np np.histogram? This is part of an effort to make Documentation in Python richer and provide in the long term if possible dynamic examples that can contain math, images, widgets... As stated above this is nightly experimental feature with a lot of (fun) problem to solve. We would be happy to get your feedback and expertise on it. Deprecated Features ------------------- Some deprecated features are listed in this section. Don't forget to enable ``DeprecationWarning`` as an error if you are using IPython in a Continuous Integration setup or in your testing in general: .. code-block:: python import warnings warnings.filterwarnings('error', '.*', DeprecationWarning, module='yourmodule.*') - ``hooks.fix_error_editor`` seems unused and is pending deprecation. - `IPython/core/excolors.py:ExceptionColors` is deprecated. - `IPython.core.InteractiveShell:write()` is deprecated; use `sys.stdout` instead. - `IPython.core.InteractiveShell:write_err()` is deprecated; use `sys.stderr` instead. - The `formatter` keyword argument to `Inspector.info` in `IPython.core.oinspec` has no effect. - The `global_ns` keyword argument of IPython Embed was deprecated, and has no effect. Use `module` keyword argument instead. Known Issues: ------------- - ```` Key does not dismiss the completer and does not clear the current buffer. This is an on purpose modification due to current technical limitation. Cf :ghpull:`9572`. Escape the control character which is used for other shortcut, and there is no practical way to distinguish. Use Ctr-G or Ctrl-C as an alternative. - Cannot use ``Shift-Enter`` and ``Ctrl-Enter`` to submit code in terminal. cf :ghissue:`9587` and :ghissue:`9401`. In terminal there is no practical way to distinguish these key sequences from a normal new line return. - ``PageUp`` and ``pageDown`` do not move through completion menu. - Color styles might not adapt to terminal emulator themes. This will need new version of Pygments to be released, and can be mitigated with custom themes. ipython-8.35.0/docs/source/whatsnew/version6.rst000066400000000000000000000337721477474304100217250ustar00rootroot00000000000000============ 6.x Series ============ .. _whatsnew650: IPython 6.5.0 ============= Miscellaneous bug fixes and compatibility with Python 3.7. * Autocompletion fix for modules with out ``__init__.py`` :ghpull:`11227` * update the ``%pastebin`` magic to use ``dpaste.com`` instead og GitHub Gist which now requires authentication :ghpull:`11182` * Fix crash with multiprocessing :ghpull:`11185` .. _whatsnew640: IPython 6.4.0 ============= Everything new in :ref:`IPython 5.7 ` * Fix display object not emitting metadata :ghpull:`11106` * Comments failing Jedi test :ghpull:`11110` .. _whatsnew631: IPython 6.3.1 ============= This is a bugfix release to switch the default completions back to IPython's own completion machinery. We discovered some problems with the completions from Jedi, including completing column names on pandas data frames. You can switch the completions source with the config option :configtrait:`Completer.use_jedi`. .. _whatsnew630: IPython 6.3 =========== IPython 6.3 contains all the bug fixes and features in :ref:`IPython 5.6 `. In addition: * A new display class :class:`IPython.display.Code` can be used to display syntax highlighted code in a notebook (:ghpull:`10978`). * The :cellmagic:`html` magic now takes a ``--isolated`` option to put the content in an iframe (:ghpull:`10962`). * The code to find completions using the Jedi library has had various adjustments. This is still a work in progress, but we hope this version has fewer annoyances (:ghpull:`10956`, :ghpull:`10969`, :ghpull:`10999`, :ghpull:`11035`, :ghpull:`11063`, :ghpull:`11065`). * The *post* event callbacks are now always called, even when the execution failed (for example because of a ``SyntaxError``). * The execution info and result objects are now made available in the corresponding *pre* or *post* ``*_run_cell`` :doc:`event callbacks ` in a backward compatible manner (:ghissue:`10774` and :ghpull:`10795`). * Performance with very long code cells (hundreds of lines) is greatly improved (:ghpull:`10898`). Further improvements are planned for IPython 7. You can see all `pull requests for the 6.3 milestone `__. .. _whatsnew620: IPython 6.2 =========== IPython 6.2 contains all the bugs fixes and features :ref:`available in IPython 5.5 `, like built in progress bar support, and system-wide configuration The following features are specific to IPython 6.2: Function signature in completions --------------------------------- Terminal IPython will now show the signature of the function while completing. Only the currently highlighted function will show its signature on the line below the completer by default. This functionality is recent, so it might be limited; we welcome bug reports and requests for enhancements. :ghpull:`10507` Assignments return values ------------------------- IPython can now trigger the display hook on the last assignment of cells. Up until 6.2 the following code wouldn't show the value of the assigned variable:: In[1]: xyz = "something" # nothing shown You would have to actually make it the last statement:: In [2]: xyz = "something else" ... : xyz Out[2]: "something else" With the option ``InteractiveShell.ast_node_interactivity='last_expr_or_assign'`` you can now do:: In [2]: xyz = "something else" Out[2]: "something else" This option can be toggled at runtime with the ``%config`` magic, and will trigger on assignment ``a = 1``, augmented assignment ``+=``, ``-=``, ``|=`` ... as well as type annotated assignments: ``a:int = 2``. See :ghpull:`10598` Recursive Call of ipdb ---------------------- Advanced users of the debugger can now correctly recursively enter ipdb. This is thanks to ``@segevfiner`` on :ghpull:`10721`. .. _whatsnew610: IPython 6.1 =========== - Quotes in a filename are always escaped during tab-completion on non-Windows. :ghpull:`10069` - Variables now shadow magics in autocompletion. See :ghissue:`4877` and :ghpull:`10542`. - Added the ability to add parameters to alias_magic. For example:: In [2]: %alias_magic hist history --params "-l 2" --line Created `%hist` as an alias for `%history -l 2`. In [3]: hist %alias_magic hist history --params "-l 30" --line %alias_magic hist history --params "-l 2" --line Previously it was only possible to have an alias attached to a single function, and you would have to pass in the given parameters every time:: In [4]: %alias_magic hist history --line Created `%hist` as an alias for `%history`. In [5]: hist -l 2 hist %alias_magic hist history --line - To suppress log state messages, you can now either use ``%logstart -q``, pass ``--LoggingMagics.quiet=True`` on the command line, or set ``c.LoggingMagics.quiet=True`` in your configuration file. - An additional flag ``--TerminalInteractiveShell.term_title_format`` is introduced to allow the user to control the format of the terminal title. It is specified as a python format string, and currently the only variable it will format is ``{cwd}``. - ``??``/``%pinfo2`` will now show object docstrings if the source can't be retrieved. :ghpull:`10532` - ``IPython.display`` has gained a ``%markdown`` cell magic. :ghpull:`10563` - ``%config`` options can now be tab completed. :ghpull:`10555` - ``%config`` with no arguments are now unique and sorted. :ghpull:`10548` - Completion on keyword arguments does not duplicate ``=`` sign if already present. :ghpull:`10547` - ``%run -m `` now ```` passes extra arguments to ````. :ghpull:`10546` - completer now understand "snake case auto complete": if ``foo_bar_kittens`` is a valid completion, I can type ``f_b`` will complete to it. :ghpull:`10537` - tracebacks are better standardized and will compress `/path/to/home` to `~`. :ghpull:`10515` The following changes were also added to IPython 5.4, see :ref:`what's new in IPython 5.4 ` for more detail description: - ``TerminalInteractiveShell`` is configurable and can be configured to (re)-use the readline interface. - objects can now define a ``_repr_mimebundle_`` - Execution heuristics improve for single line statements - ``display()`` can now return a display id to update display areas. .. _whatsnew600: IPython 6.0 =========== Released April 19th, 2017 IPython 6 features a major improvement in the completion machinery which is now capable of completing non-executed code. It is also the first version of IPython to stop compatibility with Python 2, which is still supported on the bugfix only 5.x branch. Read below for a non-exhaustive list of new features. Make sure you have pip > 9.0 before upgrading. You should be able to update by using: .. code:: pip install ipython --upgrade .. note:: If your pip version is greater than or equal to pip 9.0.1 you will automatically get the most recent version of IPython compatible with your system: on Python 2 you will get the latest IPython 5.x bugfix, while in Python 3 you will get the latest 6.x stable version. New completion API and Interface -------------------------------- The completer Completion API has seen an overhaul, and the new completer has plenty of improvements both from the end users of terminal IPython and for consumers of the API. This new API is capable of pulling completions from :any:`jedi`, thus allowing type inference on non-executed code. If :any:`jedi` is installed, completions like the following are now possible without code evaluation: >>> data = ['Number of users', 123_456] ... data[0]. That is to say, IPython is now capable of inferring that `data[0]` is a string, and will suggest completions like `.capitalize`. The completion power of IPython will increase with new Jedi releases, and a number of bug-fixes and more completions are already available on the development version of :any:`jedi` if you are curious. With the help of prompt toolkit, types of completions can be shown in the completer interface: .. image:: ../_images/jedi_type_inference_60.png :alt: Jedi showing ability to do type inference :align: center :width: 400px :target: ../_images/jedi_type_inference_60.png The appearance of the completer is controlled by the ``c.TerminalInteractiveShell.display_completions`` option that will show the type differently depending on the value among ``'column'``, ``'multicolumn'`` and ``'readlinelike'`` The use of Jedi also fulfills a number of requests and fixes a number of bugs like case-insensitive completion and completion after division operator: See :ghpull:`10182`. Extra patches and updates will be needed to the :mod:`ipykernel` package for this feature to be available to other clients like Jupyter Notebook, Lab, Nteract, Hydrogen... The use of Jedi should be barely noticeable on recent machines, but can be slower on older ones. To tweak the performance, the amount of time given to Jedi to compute type inference can be adjusted with ``c.IPCompleter.jedi_compute_type_timeout``. The objects whose type were not inferred will be shown as ````. Jedi can also be completely deactivated by using the ``c.Completer.use_jedi=False`` option. The old ``Completer.complete()`` API is waiting deprecation and should be replaced replaced by ``Completer.completions()`` in the near future. Feedback on the current state of the API and suggestions are welcome. Python 3 only codebase ---------------------- One of the large challenges in IPython 6.0 has been the adoption of a pure Python 3 codebase, which has led to upstream patches in pip, pypi and warehouse to make sure Python 2 systems still upgrade to the latest compatible Python version. We remind our Python 2 users that IPython 5 is still compatible with Python 2.7, still maintained and will get regular releases. Using pip 9+, upgrading IPython will automatically upgrade to the latest version compatible with your system. .. warning:: If you are on a system using an older version of pip on Python 2, pip may still install IPython 6.0 on your system, and IPython will refuse to start. You can fix this by upgrading pip, and reinstalling ipython, or forcing pip to install an earlier version: ``pip install 'ipython<6'`` The ability to use only Python 3 on the code base of IPython brings a number of advantages. Most of the newly written code make use of `optional function type annotation `_ leading to clearer code and better documentation. The total size of the repository has also decreased by about 1500 lines (for the first time excluding the big split for 4.0). The decrease is potentially a bit more for the sour as some documents like this one are append only and are about 300 lines long. The removal of the Python2/Python3 shim layer has made the code quite a lot clearer and more idiomatic in a number of locations, and much friendlier to work with and understand. We hope to further embrace Python 3 capabilities in the next release cycle and introduce more of the Python 3 only idioms (yield from, kwarg only, general unpacking) in the IPython code base, and see if we can take advantage of these to improve user experience with better error messages and hints. Configurable TerminalInteractiveShell, readline interface --------------------------------------------------------- IPython gained a new ``c.TerminalIPythonApp.interactive_shell_class`` option that allows customizing the class used to start the terminal frontend. This should allow a user to use custom interfaces, like reviving the former readline interface which is now a separate package not actively maintained by the core team. See the project to bring back the readline interface: `rlipython `_. This change will be backported to the IPython 5.x series. Misc improvements ----------------- - The :cellmagic:`capture` magic can now capture the result of a cell (from an expression on the last line), as well as printed and displayed output. :ghpull:`9851`. - Pressing Ctrl-Z in the terminal debugger now suspends IPython, as it already does in the main terminal prompt. - Autoreload can now reload ``Enum``. See :ghissue:`10232` and :ghpull:`10316` - IPython.display has gained a :any:`GeoJSON ` object. :ghpull:`10288` and :ghpull:`10253` Functions Deprecated in 6.x Development cycle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Loading extensions from ``ipython_extension_dir`` prints a warning that this location is pending deprecation. This should only affect users still having extensions installed with ``%install_ext`` which has been deprecated since IPython 4.0, and removed in 5.0. Extensions still present in ``ipython_extension_dir`` may shadow more recently installed versions using pip. It is thus recommended to clean ``ipython_extension_dir`` of any extension now available as a package. - ``IPython.utils.warn`` was deprecated in IPython 4.0, and has now been removed. instead of ``IPython.utils.warn`` inbuilt :any:`warnings` module is used. - The function `IPython.core.oinspect.py:call_tip` is unused, was marked as deprecated (raising a `DeprecationWarning`) and marked for later removal. :ghpull:`10104` Backward incompatible changes ------------------------------ Functions Removed in 6.x Development cycle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following functions have been removed in the development cycle marked for Milestone 6.0. - ``IPython/utils/process.py`` - ``is_cmd_found`` - ``IPython/utils/process.py`` - ``pycmd2argv`` - The `--deep-reload` flag and the corresponding options to inject `dreload` or `reload` into the interactive namespace have been removed. You have to explicitly import `reload` from `IPython.lib.deepreload` to use it. - The :magic:`profile` used to print the current IPython profile, and which was deprecated in IPython 2.0 does now raise a `DeprecationWarning` error when used. It is often confused with the :magic:`prun` and the deprecation removal should free up the ``profile`` name in future versions. ipython-8.35.0/docs/source/whatsnew/version7.rst000066400000000000000000001765561477474304100217360ustar00rootroot00000000000000============ 7.x Series ============ .. _version 7.34: IPython 7.34 ============ This version contains a single fix: fix uncaught BdbQuit exceptions on ipdb exit :ghpull:`13668` .. _version 7.33: IPython 7.33 ============ - Allow IPython hooks to receive current cell ids when frontend support it. See :ghpull:`13600` - ``?`` does not trigger the insertion of a new cell anymore as most frontend allow proper multiline edition. :ghpull:`13625` .. _version 7.32: IPython 7.32 ============ Autoload magic lazily --------------------- The ability to configure magics to be lazily loaded has been added to IPython. See the ``ipython --help-all`` section on ``MagicsManager.lazy_magic``. One can now use:: c.MagicsManager.lazy_magics = { "my_magic": "slow.to.import", "my_other_magic": "also.slow", } And on first use of ``%my_magic``, or corresponding cell magic, or other line magic, the corresponding ``load_ext`` will be called just before trying to invoke the magic. Misc ---- - Update sphinxify for Docrepr 0.2.0 :ghpull:`13503`. - Set co_name for cells run line by line (to fix debugging with Python 3.10) :ghpull:`13535` Many thanks to all the contributors to this release. You can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.31: IPython 7.31 ============ IPython 7.31 brings a couple of backports and fixes from the 8.0 branches, it is likely one of the last releases of the 7.x series, as 8.0 will probably be released between this release and what would have been 7.32. Please test 8.0 beta/rc releases in addition to this release. This Releases: - Backport some fixes for Python 3.10 (:ghpull:`13412`) - use full-alpha transparency on dvipng rendered LaTeX (:ghpull:`13372`) Many thanks to all the contributors to this release. You can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.30: IPython 7.30 ============ IPython 7.30 fixes a couple of bugs introduce in previous releases (in particular with respect to path handling), and introduce a few features and improvements: Notably we will highlight :ghpull:`13267` "Document that ``%run`` can execute notebooks and ipy scripts.", which is the first commit of Fernando Pérez since mid 2016 (IPython 5.1). If you are new to IPython, Fernando created IPython in 2001. The other most recent contribution of Fernando to IPython itself was May 2018, by reviewing and merging PRs. I want to note that Fernando is still active but mostly as a mentor and leader of the whole Jupyter organisation, but we're still happy to see him contribute code ! :ghpull:`13290` "Use sphinxify (if available) in object_inspect_mime path" should allow richer Repr of docstrings when using jupyterlab inspector. :ghpull:`13311` make the debugger use ``ThreadPoolExecutor`` for debugger cmdloop. This should fix some issues/infinite loop, but let us know if you come across any regressions. In particular this fixes issues with `kmaork/madbg `_, a remote debugger for IPython. Note that this is likely the ante-penultimate release of IPython 7.x as a stable branch, as I hope to release IPython 8.0 as well as IPython 7.31 next month/early 2022. IPython 8.0 will drop support for Python 3.7, removed nose as a dependency, and 7.x will only get critical bug fixes with 8.x becoming the new stable. This will not be possible without `NumFOCUS Small Development Grants `_ Which allowed us to hire `Nikita Kniazev `_ who provide Python and C++ help and contracting work. Many thanks to all the contributors to this release. You can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.29: IPython 7.29 ============ IPython 7.29 brings a couple of new functionalities to IPython and a number of bugfixes. It is one of the largest recent release, relatively speaking, with close to 15 Pull Requests. - fix an issue where base64 was returned instead of bytes when showing figures :ghpull:`13162` - fix compatibility with PyQt6, PySide 6 :ghpull:`13172`. This may be of interest if you are running on Apple Silicon as only qt6.2+ is natively compatible. - fix matplotlib qtagg eventloop :ghpull:`13179` - Multiple docs fixes, typos, ... etc. - Debugger will now exit by default on SigInt :ghpull:`13218`, this will be useful in notebook/lab if you forgot to exit the debugger. "Interrupt Kernel" will now exist the debugger. It give Pdb the ability to skip code in decorators. If functions contain a special value names ``__debuggerskip__ = True|False``, the function will not be stepped into, and Pdb will step into lower frames only if the value is set to ``False``. The exact behavior is still likely to have corner cases and will be refined in subsequent releases. Feedback welcome. See the debugger module documentation for more info. Thanks to the `D. E. Shaw group `__ for funding this feature. The main branch of IPython is receiving a number of changes as we received a `NumFOCUS SDG `__ ($4800), to help us finish replacing ``nose`` by ``pytest``, and make IPython future proof with an 8.0 release. Many thanks to all the contributors to this release. You can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.28: IPython 7.28 ============ IPython 7.28 is again a minor release that mostly bring bugfixes, and couple of improvement. Many thanks to MrMino, who again did all the work this month, and made a number of documentation improvements. Here is a non-exhaustive list of changes, Fixes: - async with doesn't allow newlines :ghpull:`13090` - Dynamically changing to vi mode via %config magic) :ghpull:`13091` Virtualenv handling fixes: - init_virtualenv now uses Pathlib :ghpull:`12548` - Fix Improper path comparison of virtualenv directories :ghpull:`13140` - Fix virtual environment user warning for lower case paths :ghpull:`13094` - Adapt to all sorts of drive names for cygwin :ghpull:`13153` New Features: - enable autoplay in embed YouTube player :ghpull:`13133` Documentation: - Fix formatting for the core.interactiveshell documentation :ghpull:`13118` - Fix broken ipyparallel's refs :ghpull:`13138` - Improve formatting of %time documentation :ghpull:`13125` - Reword the YouTubeVideo autoplay WN :ghpull:`13147` Highlighted features -------------------- ``YouTubeVideo`` autoplay and the ability to add extra attributes to ``IFrame`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can add any extra attributes to the `` Related to the above, the ``YouTubeVideo`` class now takes an ``allow_autoplay`` flag, which sets up the iframe of the embedded YouTube video such that it allows autoplay. .. note:: Whether this works depends on the autoplay policy of the browser rendering the HTML allowing it. It also could get blocked by some browser extensions. Try it out! :: In [1]: from IPython.display import YouTubeVideo In [2]: YouTubeVideo("dQw4w9WgXcQ", allow_autoplay=True) Thanks ------ Many thanks to all the contributors to this release. You can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.27: IPython 7.27 ============ IPython 7.27 is a minor release that fixes a couple of issues and compatibility. - Add support for GTK4 :ghpull:`131011` - Add support for Qt6 :ghpull:`13085` - Fix an issue with pip magic on windows :ghpull:`13093` Thanks ------ Many thanks to all the contributors to this release. You can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.26: IPython 7.26 ============ IPython 7.26 is a minor release that fixes a couple of issues, updates in API and Copyright/Licenses issues around various part of the codebase. We'll highlight `this issue ` pointing out we were including and refereeing to code from Stack Overflow which was CC-BY-SA, hence incompatible with the BSD license of IPython. This lead us to a rewriting of the corresponding logic which in our case was done in a more efficient way (in our case we were searching string prefixes instead of full strings). You will notice also a number of documentation improvements and cleanup. Of particular interest are the following Pull-requests: - The IPython directive now uses Sphinx logging for warnings. :ghpull:`13030`. - Add expiry days option to pastebin magic and change http protocol to https. :ghpull:`13056` - Make Ipython.utils.timing work with jupyterlite :ghpull:`13050`. Pastebin magic expiry days option --------------------------------- The Pastebin magic now has ``-e`` option to determine the number of days for paste expiration. For example the paste that created with ``%pastebin -e 20 1`` magic will be available for next 20 days. Thanks ------ Many thanks to all the contributors to this release and in particular MrMino who is doing most of the work those days. You can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.25: IPython 7.25 ============ IPython 7.25 is a minor release that contains a single bugfix, which is highly recommended for all users of ipdb, ipython debugger %debug magic and similar. Issuing commands like ``where`` from within the debugger would reset the local variables changes made by the user. It is interesting to look at the root cause of the issue as accessing an attribute (``frame.f_locals``) would trigger this side effects. Thanks in particular to the patience from the reporters at D.E. Shaw for their initial bug report that was due to a similar coding oversight in an extension, and who took time to debug and narrow down the problem. Thanks ------ Many thanks to all the contributors to this release you can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.24: IPython 7.24 ============ Third release of IPython for 2021, mostly containing bug fixes. A couple of not typical updates: Misc ---- - Fix an issue where ``%recall`` would both succeeded and print an error message it failed. :ghpull:`12952` - Drop support for NumPy 1.16 – practically has no effect beyond indicating in package metadata that we do not support it. :ghpull:`12937` Debugger improvements --------------------- The debugger (and ``%debug`` magic) have been improved and can skip or hide frames originating from files that are not writable to the user, as these are less likely to be the source of errors, or be part of system files this can be a useful addition when debugging long errors. In addition to the global ``skip_hidden True|False`` command, the debugger has gained finer grained control of predicates as to whether to a frame should be considered hidden. So far 3 predicates are available : - ``tbhide``: frames containing the local variable ``__tracebackhide__`` set to True. - ``readonly``: frames originating from readonly files, set to False. - ``ipython_internal``: frames that are likely to be from IPython internal code, set to True. You can toggle individual predicates during a session with .. code-block:: ipdb> skip_predicates readonly True Read-only files will now be considered hidden frames. You can call ``skip_predicates`` without arguments to see the states of current predicates: .. code-block:: ipdb> skip_predicates current predicates: tbhide : True readonly : False ipython_internal : True If all predicates are set to ``False``, ``skip_hidden`` will practically have no effect. We attempt to warn you when all predicates are False. Note that the ``readonly`` predicate may increase disk access as we check for file access permission for all frames on many command invocation, but is usually cached by operating systems. Let us know if you encounter any issues. As the IPython debugger does not use the traitlets infrastructure for configuration, by editing your ``.pdbrc`` files and appending commands you would like to be executed just before entering the interactive prompt. For example: .. code:: # file : ~/.pdbrc skip_predicates readonly True skip_predicates tbhide False Will hide read only frames by default and show frames marked with ``__tracebackhide__``. Thanks ------ Many thanks to all the contributors to this release you can find all individual contributions to this milestone `on github `__. Thanks as well to the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries, in particular above mentioned improvements to the debugger. .. _version 7.23: IPython 7.23 and 7.23.1 ======================= Third release of IPython for 2021, mostly containing bug fixes. A couple of not typical updates: - We moved to GitHub actions away from Travis-CI, the transition may not be 100% complete (not testing on nightly anymore), but as we ran out of Travis-Ci hours on the IPython organisation that was a necessary step. :ghpull:`12900`. - We have a new dependency: ``matplotlib-inline``, which try to extract matplotlib inline backend specific behavior. It is available on PyPI and conda-forge thus should not be a problem to upgrade to this version. If you are a package maintainer that might be an extra dependency to package first. :ghpull:`12817` (IPython 7.23.1 fix a typo that made this change fail) In the addition/new feature category, ``display()`` now have a ``clear=True`` option to clear the display if any further outputs arrives, allowing users to avoid having to use ``clear_output()`` directly. :ghpull:`12823`. In bug fixes category, this release fix an issue when printing tracebacks containing Unicode characters :ghpull:`12758`. In code cleanup category :ghpull:`12932` remove usage of some deprecated functionality for compatibility with Python 3.10. Thanks ------ Many thanks to all the contributors to this release you can find all individual contributions to this milestone `on github `__. In particular MrMino for responding to almost all new issues, and triaging many of the old ones, as well as takluyver, minrk, willingc for reacting quikly when we ran out of CI Hours. Thanks as well to organisations, QuantStack (martinRenou and SylvainCorlay) for extracting matplotlib inline backend into its own package, and the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 7.22: IPython 7.22 ============ Second release of IPython for 2021, mostly containing bug fixes. Here is a quick rundown of the few changes. - Fix some ``sys.excepthook`` shenanigan when embedding with qt, recommended if you – for example – use `napari `__. :ghpull:`12842`. - Fix bug when using the new ipdb ``%context`` magic :ghpull:`12844` - Couples of deprecation cleanup :ghpull:`12868` - Update for new dpast.com api if you use the ``%pastbin`` magic. :ghpull:`12712` - Remove support for numpy before 1.16. :ghpull:`12836` Thanks ------ We have a new team member that you should see more often on the IPython repository, Błażej Michalik (@MrMino) have been doing regular contributions to IPython, and spent time replying to many issues and guiding new users to the codebase; they now have triage permissions to the IPython repository and we'll work toward giving them more permission in the future. Many thanks to all the contributors to this release you can find all individual contributions to this milestone `on github `__. Thanks as well to organisations, QuantStack for working on debugger compatibility for Xeus_python, and the `D. E. Shaw group `__ for sponsoring work on IPython and related libraries. .. _version 721: IPython 7.21 ============ IPython 7.21 is the first release we have back on schedule of one release every month; it contains a number of minor fixes and improvements, notably, the new context command for ipdb New "context" command in ipdb ----------------------------- It is now possible to change the number of lines shown in the backtrace information in ipdb using "context" command. :ghpull:`12826` (thanks @MrMino, there are other improvement from them on master). Other notable changes in IPython 7.21 ------------------------------------- - Fix some issues on new osx-arm64 :ghpull:`12804`, :ghpull:`12807`. - Compatibility with Xeus-Python for debugger protocol, :ghpull:`12809` - Misc docs fixes for compatibility and uniformity with Numpydoc. :ghpull:`12824` Thanks ------ Many thanks to all the contributors to this release you can find all individual contribution to this milestone `on github `__. .. _version 720: IPython 7.20 ============ IPython 7.20 is the accumulation of 3 month of work on IPython, spacing between IPython release have been increased from the usual once a month for various reason. - Mainly as I'm too busy and the effectively sole maintainer, and - Second because not much changes happened before mid December. The main driver for this release was the new version of Jedi 0.18 breaking API; which was taken care of in the master branch early in 2020 but not in 7.x as I though that by now 8.0 would be out. The inclusion of a resolver in pip did not help and actually made things worse. If usually I would have simply pinned Jedi to ``<0.18``; this is not a solution anymore as now pip is free to install Jedi 0.18, and downgrade IPython. I'll do my best to keep the regular release, but as the 8.0-dev branch and 7.x are starting to diverge this is becoming difficult in particular with my limited time, so if you have any cycles to spare I'll appreciate your help to respond to issues and pushing 8.0 forward. Here are thus some of the changes for IPython 7.20. - Support for PyQt5 >= 5.11 :ghpull:`12715` - ``%reset`` remove imports more aggressively :ghpull:`12718` - fix the ``%conda`` magic :ghpull:`12739` - compatibility with Jedi 0.18, and bump minimum Jedi version. :ghpull:`12793` .. _version 719: IPython 7.19 ============ IPython 7.19 accumulative two month of works, bug fixes and improvements, there was exceptionally no release last month. - Fix to restore the ability to specify more than one extension using command line flags when using traitlets 5.0 :ghpull:`12543` - Docs docs formatting that make the install commands work on zsh :ghpull:`12587` - Always display the last frame in tracebacks even if hidden with ``__tracebackhide__`` :ghpull:`12601` - Avoid an issue where a callback can be registered multiple times. :ghpull:`12625` - Avoid an issue in debugger mode where frames changes could be lost. :ghpull:`12627` - Never hide the frames that invoke a debugger, even if marked as hidden by ``__tracebackhide__`` :ghpull:`12631` - Fix calling the debugger in a recursive manner :ghpull:`12659` A number of code changes have landed on master and we are getting close to enough new features and codebase improvement that a 8.0 start to make sens. For downstream packages, please start working on migrating downstream testing away from iptest and using pytest, as nose will not work on Python 3.10 and we will likely start removing it as a dependency for testing. .. _version 718: IPython 7.18 ============ IPython 7.18 is a minor release that mostly contains bugfixes. - ``CRLF`` is now handled by magics my default; solving some issues due to copy pasting on windows. :ghpull:`12475` - Requiring pexpect ``>=4.3`` as we are Python 3.7+ only and earlier version of pexpect will be incompatible. :ghpull:`12510` - Minimum jedi version is now 0.16. :ghpull:`12488` .. _version 717: IPython 7.17 ============ IPython 7.17 brings a couple of new improvements to API and a couple of user facing changes to make the terminal experience more user friendly. :ghpull:`12407` introduces the ability to pass extra argument to the IPython debugger class; this is to help a new project from ``kmaork`` (https://github.com/kmaork/madbg) to feature a fully remote debugger. :ghpull:`12410` finally remove support for 3.6, while the codebase is still technically compatible; IPython will not install on Python 3.6. lots of work on the debugger and hidden frames from ``@impact27`` in :ghpull:`12437`, :ghpull:`12445`, :ghpull:`12460` and in particular :ghpull:`12453` which make the debug magic more robust at handling spaces. Biggest API addition is code transformation which is done before code execution; IPython allows a number of hooks to catch non-valid Python syntax (magic, prompt stripping...etc). Transformers are usually called many time; typically: - When trying to figure out whether the code is complete and valid (should we insert a new line or execute ?) - During actual code execution pass before giving the code to Python's ``exec``. This lead to issues when transformer might have had side effects; or do external queries. Starting with IPython 7.17 you can expect your transformer to be called less time. Input transformers are now called only once in the execution path of `InteractiveShell`, allowing to register transformer that potentially have side effects (note that this is not recommended). Internal methods `should_run_async`, and `run_cell_async` now take a recommended optional `transformed_cell`, and `preprocessing_exc_tuple` parameters that will become mandatory at some point in the future; that is to say cells need to be explicitly transformed to be valid Python syntax ahead of trying to run them. :ghpull:`12440`; ``input_transformers`` can now also have an attribute ``has_side_effects`` set to `True`, when this attribute is present; this will prevent the transformers from being ran when IPython is trying to guess whether the user input is complete. Note that this may means you will need to explicitly execute in some case where your transformations are now not ran; but will not affect users with no custom extensions. API Changes ----------- Change of API and exposed objects automatically detected using `frappuccino `_ The following items are new since 7.16.0:: + IPython.core.interactiveshell.InteractiveShell.get_local_scope(self, stack_depth) The following signatures differ since 7.16.0:: - IPython.core.interactiveshell.InteractiveShell.run_cell_async(self, raw_cell, store_history=False, silent=False, shell_futures=True) + IPython.core.interactiveshell.InteractiveShell.run_cell_async(self, raw_cell, store_history=False, silent=False, shell_futures=True, *, transformed_cell=None, preprocessing_exc_tuple=None) - IPython.core.interactiveshell.InteractiveShell.should_run_async(self, raw_cell) + IPython.core.interactiveshell.InteractiveShell.should_run_async(self, raw_cell, *, transformed_cell=None, preprocessing_exc_tuple=None) - IPython.terminal.debugger.TerminalPdb.pt_init(self) + IPython.terminal.debugger.TerminalPdb.pt_init(self, pt_session_options=None) This method was added:: + IPython.core.interactiveshell.InteractiveShell.get_local_scope Which is now also present on subclasses:: + IPython.terminal.embed.InteractiveShellEmbed.get_local_scope + IPython.terminal.interactiveshell.TerminalInteractiveShell.get_local_scope .. _version 716: IPython 7.16.1, 7.16.2 ====================== IPython 7.16.1 was release immediately after 7.16.0 to fix a conda packaging issue. The source is identical to 7.16.0 but the file permissions in the tar are different. IPython 7.16.2 pins jedi dependency to "<=0.17.2" which should prevent some issues for users still on python 3.6. This may not be sufficient as pip may still allow to downgrade IPython. Compatibility with Jedi > 0.17.2 was not added as this would have meant bumping the minimal version to >0.16. IPython 7.16 ============ The default traceback mode will now skip frames that are marked with ``__tracebackhide__ = True`` and show how many traceback frames have been skipped. This can be toggled by using :magic:`xmode` with the ``--show`` or ``--hide`` attribute. It will have no effect on non verbose traceback modes. The ipython debugger also now understands ``__tracebackhide__`` as well and will skip hidden frames when displaying. Movement up and down the stack will skip the hidden frames and will show how many frames were hidden. Internal IPython frames are also now hidden by default. The behavior can be changed with the ``skip_hidden`` while in the debugger, command and accepts "yes", "no", "true" and "false" case insensitive parameters. Misc Noticeable changes: ------------------------ - Exceptions are now (re)raised when running notebooks via the :magic:`%run`, helping to catch issues in workflows and pipelines. :ghpull:`12301` - Fix inputhook for qt 5.15.0 :ghpull:`12355` - Fix wx inputhook :ghpull:`12375` - Add handling for malformed pathext env var (Windows) :ghpull:`12367` - use $SHELL in system_piped :ghpull:`12360` for uniform behavior with ipykernel. Reproducible Build ------------------ IPython 7.15 reproducible build did not work, so we try again this month :ghpull:`12358`. API Changes ----------- Change of API and exposed objects automatically detected using `frappuccino `_ (still in beta): The following items are new and mostly related to understanding ``__tracebackhide__``:: + IPython.core.debugger.Pdb.do_down(self, arg) + IPython.core.debugger.Pdb.do_skip_hidden(self, arg) + IPython.core.debugger.Pdb.do_up(self, arg) + IPython.core.debugger.Pdb.hidden_frames(self, stack) + IPython.core.debugger.Pdb.stop_here(self, frame) The following items have been removed:: - IPython.core.debugger.Pdb.new_do_down - IPython.core.debugger.Pdb.new_do_up Those were implementation details. .. _version 715: IPython 7.15 ============ IPython 7.15 brings a number of bug fixes and user facing improvements. Misc Noticeable changes: ------------------------ - Long completion name have better elision in terminal :ghpull:`12284` - I've started to test on Python 3.9 :ghpull:`12307` and fix some errors. - Hi DPI scaling of figures when using qt eventloop :ghpull:`12314` - Document the ability to have systemwide configuration for IPython. :ghpull:`12328` - Fix issues with input autoformatting :ghpull:`12336` - ``IPython.core.debugger.Pdb`` is now interruptible (:ghpull:`12168`, in 7.14 but forgotten in release notes) - Video HTML attributes (:ghpull:`12212`, in 7.14 but forgotten in release notes) Reproducible Build ------------------ Starting with IPython 7.15, I am attempting to provide reproducible builds, that is to say you should be able from the source tree to generate an sdist and wheel that are identical byte for byte with the publish version on PyPI. I've only tested on a couple of machines so far and the process is relatively straightforward, so this mean that IPython not only have a deterministic build process, but also I have either removed, or put under control all effects of the build environments on the final artifact. I encourage you to attempt the build process on your machine as documented in :ref:`core_developer_guide` and let me know if you do not obtain an identical artifact. While reproducible builds is critical to check that the supply chain of (open source) software has not been compromised, it can also help to speedup many of the build processes in large environment (conda, apt...) by allowing better caching of intermediate build steps. Learn more on ``_. `Reflections on trusting trust `_ is also one of the cornerstone and recommended reads on this subject. .. note:: The build commit from which the sdist is generated is also `signed `_, so you should be able to check it has not been compromised, and the git repository is a `merkle-tree `_, you can check the consistency with `git-fsck `_ which you likely `want to enable by default `_. NEP29: Last version to support Python 3.6 ----------------------------------------- IPython 7.15 will be the Last IPython version to officially support Python 3.6, as stated by `NumPy Enhancement Proposal 29 `_. Starting with next minor version of IPython I may stop testing on Python 3.6 and may stop publishing release artifacts that install on Python 3.6 Highlighted features -------------------- Highlighted features are not new, but seem to not be widely known, this section will help you discover in more narrative form what you can do with IPython. Increase Tab Completion Menu Height ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In terminal IPython it is possible to increase the height of the tab-completion menu. To do so set the value of :configtrait:`TerminalInteractiveShell.space_for_menu`, this will reserve more space at the bottom of the screen for various kind of menus in IPython including tab completion and searching in history. Autoformat Code in the terminal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you have a preferred code formatter, you can configure IPython to reformat your code. Set the value of :configtrait:`TerminalInteractiveShell.autoformatter` to for example ``'black'`` and IPython will auto format your code when possible. .. _version 714: IPython 7.14 ============ IPython 7.14 is a minor release that fix a couple of bugs and prepare compatibility with new or future versions of some libraries. Important changes: ------------------ - Fix compatibility with Sphinx 3+ :ghpull:`12235` - Remove deprecated matplotlib parameter usage, compatibility with matplotlib 3.3+ :`122250` Misc Changes ------------ - set ``.py`` extension when editing current buffer in vi/emacs. :ghpull:`12167` - support for unicode identifiers in ``?``/``??`` :ghpull:`12208` - add extra options to the ``Video`` Rich objects :ghpull:`12212` - add pretty-printing to ``SimpleNamespace`` :ghpull:`12230` IPython.core.debugger.Pdb is now interruptible ---------------------------------------------- A ``KeyboardInterrupt`` will now interrupt IPython's extended debugger, in order to make Jupyter able to interrupt it. (:ghpull:`12168`) Video HTML attributes --------------------- Add an option to `IPython.display.Video` to change the attributes of the HTML display of the video (:ghpull:`12212`) Pending deprecated imports -------------------------- Many object present in ``IPython.core.display`` are there for internal use only, and should already been imported from ``IPython.display`` by users and external libraries. Trying to import those from ``IPython.core.display`` is still possible but will trigger a deprecation warning in later versions of IPython and will become errors in the future. This will simplify compatibility with other Python kernels (like Xeus-Python), and simplify code base. .. _version 713: IPython 7.13 ============ IPython 7.13 is the final release of the 7.x branch since master is diverging toward an 8.0. Exiting new features have already been merged in 8.0 and will not be available on the 7.x branch. All the changes below have been backported from the master branch. - Fix inability to run PDB when inside an event loop :ghpull:`12141` - Fix ability to interrupt some processes on windows :ghpull:`12137` - Fix debugger shortcuts :ghpull:`12132` - improve tab completion when inside a string by removing irrelevant elements :ghpull:`12128` - Fix display of filename tab completion when the path is long :ghpull:`12122` - Many removal of Python 2 specific code path :ghpull:`12110` - displaying wav files do not require NumPy anymore, and is 5x to 30x faster :ghpull:`12113` See the list of all closed issues and pull request on `github `_. .. _version 712: IPython 7.12 ============ IPython 7.12 is a minor update that mostly brings code cleanup, removal of longtime deprecated function and a couple update to documentation cleanup as well. Notable changes are the following: - Exit non-zero when ipython is given a file path to run that doesn't exist :ghpull:`12074` - Test PR on ARM64 with Travis-CI :ghpull:`12073` - Update CI to work with latest Pytest :ghpull:`12086` - Add infrastructure to run ipykernel eventloop via trio :ghpull:`12097` - Support git blame ignore revs :ghpull:`12091` - Start multi-line ``__repr__`` s on their own line :ghpull:`12099` .. _version 7111: IPython 7.11.1 ============== A couple of deprecated functions (no-op) have been reintroduces in py3compat as Cython was still relying on them, and will be removed in a couple of versions. .. _version 711: IPython 7.11 ============ IPython 7.11 received a couple of compatibility fixes and code cleanup. A number of function in the ``py3compat`` have been removed; a number of types in the IPython code base are now non-ambiguous and now always ``unicode`` instead of ``Union[Unicode,bytes]``; many of the relevant code path have thus been simplified/cleaned and types annotation added. IPython support several verbosity level from exceptions. ``xmode plain`` now support chained exceptions. :ghpull:`11999` We are starting to remove ``shell=True`` in some usages of subprocess. While not directly a security issue (as IPython is made to run arbitrary code anyway) it is not good practice and we'd like to show the example. :ghissue:`12023`. This discussion was started by ``@mschwager`` thanks to a new auditing tool they are working on with duo-labs (`dlint `_). Work around some bugs in Python 3.9 tokenizer :ghpull:`12057` IPython will now print its version after a crash. :ghpull:`11986` This is likely the last release from the 7.x series that will see new feature. The master branch will soon accept large code changes and thrilling new features; the 7.x branch will only start to accept critical bug fixes, and update dependencies. .. _version 7102: IPython 7.10.2 ============== IPython 7.10.2 fix a couple of extra incompatibility between IPython, ipdb, asyncio and Prompt Toolkit 3. .. _version 7101: IPython 7.10.1 ============== IPython 7.10.1 fix a couple of incompatibilities with Prompt toolkit 3 (please update Prompt toolkit to 3.0.2 at least), and fixes some interaction with headless IPython. .. _version 7100: IPython 7.10.0 ============== IPython 7.10 is the first double digit minor release in the last decade, and first since the release of IPython 1.0, previous double digit minor release was in August 2009. We've been trying to give you regular release on the last Friday of every month for a guaranty of rapid access to bug fixes and new features. Unlike the previous first few releases that have seen only a couple of code changes, 7.10 bring a number of changes, new features and bugfixes. Stop Support for Python 3.5 – Adopt NEP 29 ------------------------------------------ IPython has decided to follow the informational `NEP 29 `_ which layout a clear policy as to which version of (C)Python and NumPy are supported. We thus dropped support for Python 3.5, and cleaned up a number of code path that were Python-version dependent. If you are on 3.5 or earlier pip should automatically give you the latest compatible version of IPython so you do not need to pin to a given version. Support for Prompt Toolkit 3.0 ------------------------------ Prompt Toolkit 3.0 was release a week before IPython 7.10 and introduces a few breaking changes. We believe IPython 7.10 should be compatible with both Prompt Toolkit 2.x and 3.x, though it has not been extensively tested with 3.x so please report any issues. Prompt Rendering Performance improvements ----------------------------------------- Pull Request :ghpull:`11933` introduced an optimisation in the prompt rendering logic that should decrease the resource usage of IPython when using the _default_ configuration but could potentially introduce a regression of functionalities if you are using a custom prompt. We know assume if you haven't changed the default keybindings that the prompt **will not change** during the duration of your input – which is for example not true when using vi insert mode that switches between `[ins]` and `[nor]` for the current mode. If you are experiencing any issue let us know. Code autoformatting ------------------- The IPython terminal can now auto format your code just before entering a new line or executing a command. To do so use the ``--TerminalInteractiveShell.autoformatter`` option and set it to ``'black'``; if black is installed IPython will use black to format your code when possible. IPython cannot always properly format your code; in particular it will auto formatting with *black* will only work if: - Your code does not contains magics or special python syntax. - There is no code after your cursor. The Black API is also still in motion; so this may not work with all versions of black. It should be possible to register custom formatter, though the API is till in flux. Arbitrary Mimetypes Handing in Terminal (Aka inline images in terminal) ----------------------------------------------------------------------- When using IPython terminal it is now possible to register function to handle arbitrary mimetypes. While rendering non-text based representation was possible in many jupyter frontend; it was not possible in terminal IPython, as usually terminal are limited to displaying text. As many terminal these days provide escape sequences to display non-text; bringing this loved feature to IPython CLI made a lot of sens. This functionality will not only allow inline images; but allow opening of external program; for example ``mplayer`` to "display" sound files. So far only the hooks necessary for this are in place, but no default mime renderers added; so inline images will only be available via extensions. We will progressively enable these features by default in the next few releases, and contribution is welcomed. We welcome any feedback on the API. See :ref:`shell_mimerenderer` for more information. This is originally based on work form in :ghpull:`10610` from @stephanh42 started over two years ago, and still a lot need to be done. MISC ---- - Completions can define their own ordering :ghpull:`11855` - Enable Plotting in the same cell than the one that import matplotlib :ghpull:`11916` - Allow to store and restore multiple variables at once :ghpull:`11930` You can see `all pull-requests `_ for this release. API Changes ----------- Change of API and exposed objects automatically detected using `frappuccino `_ (still in beta): The following items are new in IPython 7.10:: + IPython.terminal.shortcuts.reformat_text_before_cursor(buffer, document, shell) + IPython.terminal.interactiveshell.PTK3 + IPython.terminal.interactiveshell.black_reformat_handler(text_before_cursor) + IPython.terminal.prompts.RichPromptDisplayHook.write_format_data(self, format_dict, md_dict='None') The following items have been removed in 7.10:: - IPython.lib.pretty.DICT_IS_ORDERED The following signatures differ between versions:: - IPython.extensions.storemagic.restore_aliases(ip) + IPython.extensions.storemagic.restore_aliases(ip, alias='None') Special Thanks -------------- - @stephanh42 who started the work on inline images in terminal 2 years ago - @augustogoulart who spent a lot of time triaging issues and responding to users. - @con-f-use who is my (@Carreau) first sponsor on GitHub, as a reminder if you like IPython, Jupyter and many other library of the SciPy stack you can donate to numfocus.org non profit .. _version 790: IPython 7.9.0 ============= IPython 7.9 is a small release with a couple of improvement and bug fixes. - Xterm terminal title should be restored on exit :ghpull:`11910` - special variables ``_``,``__``, ``___`` are not set anymore when cache size is 0 or less. :ghpull:`11877` - Autoreload should have regained some speed by using a new heuristic logic to find all objects needing reload. This should avoid large objects traversal like pandas dataframes. :ghpull:`11876` - Get ready for Python 4. :ghpull:`11874` - `%env` Magic now has heuristic to hide potentially sensitive values :ghpull:`11896` This is a small release despite a number of Pull Request Pending that need to be reviewed/worked on. Many of the core developers have been busy outside of IPython/Jupyter and we thanks all contributor for their patience; we'll work on these as soon as we have time. .. _version780: IPython 7.8.0 ============= IPython 7.8.0 contain a few bugfix and 2 new APIs: - Enable changing the font color for LaTeX rendering :ghpull:`11840` - and Re-Expose some PDB API (see below) Expose Pdb API -------------- Expose the built-in ``pdb.Pdb`` API. ``Pdb`` constructor arguments are generically exposed, regardless of python version. Newly exposed arguments: - ``skip`` - Python 3.1+ - ``nosiginnt`` - Python 3.2+ - ``readrc`` - Python 3.6+ Try it out:: from IPython.terminal.debugger import TerminalPdb pdb = TerminalPdb(skip=["skipthismodule"]) See :ghpull:`11840` .. _version770: IPython 7.7.0 ============= IPython 7.7.0 contain multiple bug fixes and documentation updates; Here are a few of the outstanding issue fixed: - Fix a bug introduced in 7.6 where the ``%matplotlib`` magic would fail on previously acceptable arguments :ghpull:`11814`. - Fix the manage location on freebsd :ghpull:`11808`. - Fix error message about aliases after ``%reset`` call in ipykernel :ghpull:`11806` - Fix Duplication completions in emacs :ghpull:`11803` We are planning to adopt `NEP29 `_ (still currently in draft) which may make this minor version of IPython the last one to support Python 3.5 and will make the code base more aggressive toward removing compatibility with older versions of Python. GitHub now support to give only "Triage" permissions to users; if you'd like to help close stale issues and labels issues please reach to us with your GitHub Username and we'll add you to the triage team. It is a great way to start contributing and a path toward getting commit rights. .. _version761: IPython 7.6.1 ============= IPython 7.6.1 contain a critical bugfix in the ``%timeit`` magic, which would crash on some inputs as a side effect of :ghpull:`11716`. See :ghpull:`11812` .. _whatsnew760: IPython 7.6.0 ============= IPython 7.6.0 contains a couple of bug fixes and number of small features additions as well as some compatibility with the current development version of Python 3.8. - Add a ``-l`` option to :magic:`psearch` to list the available search types. :ghpull:`11672` - Support ``PathLike`` for ``DisplayObject`` and ``Image``. :ghpull:`11764` - Configurability of timeout in the test suite for slow platforms. :ghpull:`11756` - Accept any casing for matplotlib backend. :ghpull:`121748` - Properly skip test that requires numpy to be installed :ghpull:`11723` - More support for Python 3.8 and positional only arguments (pep570) :ghpull:`11720` - Unicode names for the completion are loaded lazily on first use which should decrease startup time. :ghpull:`11693` - Autoreload now update the types of reloaded objects; this for example allow pickling of reloaded objects. :ghpull:`11644` - Fix a bug where ``%%time`` magic would suppress cell output. :ghpull:`11716` Prepare migration to pytest (instead of nose) for testing --------------------------------------------------------- Most of the work between 7.5 and 7.6 was to prepare the migration from our testing framework to pytest. Most of the test suite should now work by simply issuing ``pytest`` from the root of the repository. The migration to pytest is just at its beginning. Many of our test still rely on IPython-specific plugins for nose using pytest (doctest using IPython syntax is one example of this where test appear as "passing", while no code has been ran). Many test also need to be updated like ``yield-test`` to be properly parametrized tests. Migration to pytest allowed me to discover a number of issues in our test suite; which was hiding a number of subtle issues – or not actually running some of the tests in our test suite – I have thus corrected many of those; like improperly closed resources; or used of deprecated features. I also made use of the ``pytest --durations=...`` to find some of our slowest test and speed them up (our test suite can now be up to 10% faster). Pytest as also a variety of plugins and flags which will make the code quality of IPython and the testing experience better. Misc ---- We skipped the release of 7.6 at the end of May, but will attempt to get back on schedule. We are starting to think about making introducing backward incompatible change and start the 8.0 series. Special Thanks to Gabriel (@gpotter2 on GitHub), who among other took care many of the remaining task for 7.4 and 7.5, like updating the website. .. _whatsnew750: IPython 7.5.0 ============= IPython 7.5.0 consist mostly of bug-fixes, and documentation updates, with one minor new feature. The `Audio` display element can now be assigned an element id when displayed in browser. See :ghpull:`11670` The major outstanding bug fix correct a change of behavior that was introduce in 7.4.0 where some cell magics would not be able to access or modify global scope when using the ``@needs_local_scope`` decorator. This was typically encountered with the ``%%time`` and ``%%timeit`` magics. See :ghissue:`11659` and :ghpull:`11698`. .. _whatsnew740: IPython 7.4.0 ============= Unicode name completions ------------------------ Previously, we provided completion for a unicode name with its relative symbol. With this, now IPython provides complete suggestions to unicode name symbols. As on the PR, if user types ``\LAT``, IPython provides a list of possible completions. In this case, it would be something like:: 'LATIN CAPITAL LETTER A', 'LATIN CAPITAL LETTER B', 'LATIN CAPITAL LETTER C', 'LATIN CAPITAL LETTER D', .... This help to type unicode character that do not have short latex aliases, and have long unicode names. for example ``Ͱ``, ``\GREEK CAPITAL LETTER HETA``. This feature was contributed by Luciana Marques :ghpull:`11583`. Make audio normalization optional --------------------------------- Added 'normalize' argument to `IPython.display.Audio`. This argument applies when audio data is given as an array of samples. The default of `normalize=True` preserves prior behavior of normalizing the audio to the maximum possible range. Setting to `False` disables normalization. Miscellaneous ------------- - Fix improper acceptation of ``return`` outside of functions. :ghpull:`11641`. - Fixed PyQt 5.11 backwards incompatibility causing sip import failure. :ghpull:`11613`. - Fix Bug where ``type?`` would crash IPython. :ghpull:`1608`. - Allow to apply ``@needs_local_scope`` to cell magics for convenience. :ghpull:`11542`. .. _whatsnew730: IPython 7.3.0 ============= IPython 7.3.0 bring several bug fixes and small improvements that you will described below. The biggest change to this release is the implementation of the ``%conda`` and ``%pip`` magics, that will attempt to install packages in the **current environment**. You may still need to restart your interpreter or kernel for the change to be taken into account, but it should simplify installation of packages into remote environment. Installing using pip/conda from the command line is still the prefer method. The ``%pip`` magic was already present, but was only printing a warning; now it will actually forward commands to pip. Misc bug fixes and improvements: - Compatibility with Python 3.8. - Do not expand shell variable in execution magics, and added the ``no_var_expand`` decorator for magic requiring a similar functionality :ghpull:`11516` - Add ``%pip`` and ``%conda`` magic :ghpull:`11524` - Re-initialize posix aliases after a ``%reset`` :ghpull:`11528` - Allow the IPython command line to run ``*.ipynb`` files :ghpull:`11529` .. _whatsnew720: IPython 7.2.0 ============= IPython 7.2.0 brings minor bugfixes, improvements, and new configuration options: - Fix a bug preventing PySide2 GUI integration from working :ghpull:`11464` - Run CI on Mac OS ! :ghpull:`11471` - Fix IPython "Demo" mode. :ghpull:`11498` - Fix ``%run`` magic with path in name :ghpull:`11499` - Fix: add CWD to sys.path *after* stdlib :ghpull:`11502` - Better rendering of signatures, especially long ones. :ghpull:`11505` - Re-enable jedi by default if it's installed :ghpull:`11506` - Add New ``minimal`` exception reporting mode (useful for educational purpose). See :ghpull:`11509` Added ability to show subclasses when using pinfo and other utilities --------------------------------------------------------------------- When using ``?``/``??`` on a class, IPython will now list the first 10 subclasses. Special Thanks to Chris Mentzel of the Moore Foundation for this feature. Chris is one of the people who played a critical role in IPython/Jupyter getting funding. We are grateful for all the help Chris has given us over the years, and we're now proud to have code contributed by Chris in IPython. OSMagics.cd_force_quiet configuration option -------------------------------------------- You can set this option to force the %cd magic to behave as if ``-q`` was passed:: In [1]: cd / / In [2]: %config OSMagics.cd_force_quiet = True In [3]: cd /tmp In [4]: See :ghpull:`11491` In vi editing mode, whether the prompt includes the current vi mode can now be configured ----------------------------------------------------------------------------------------- Set the ``TerminalInteractiveShell.prompt_includes_vi_mode`` to a boolean value (default: True) to control this feature. See :ghpull:`11492` .. _whatsnew710: IPython 7.1.0 ============= IPython 7.1.0 is the first minor release after 7.0.0 and mostly brings fixes to new features, internal refactoring, and fixes for regressions that happened during the 6.x->7.x transition. It also brings **Compatibility with Python 3.7.1**, as we're unwillingly relying on a bug in CPython. New Core Dev: - We welcome Jonathan Slenders to the committers. Jonathan has done a fantastic work on prompt_toolkit, and we'd like to recognise his impact by giving him commit rights. :ghissue:`11397` Notable Changes - Major update of "latex to unicode" tab completion map (see below) Notable New Features: - Restore functionality and documentation of the **sphinx directive**, which is now stricter (fail on error by daefault), has new configuration options, has a brand new documentation page :ref:`ipython_directive` (which needs some cleanup). It is also now *tested* so we hope to have less regressions. :ghpull:`11402` - ``IPython.display.Video`` now supports ``width`` and ``height`` arguments, allowing a custom width and height to be set instead of using the video's width and height. :ghpull:`11353` - Warn when using ``HTML('\n", " " ], "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo('sjfsUzECqK0')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the nascent video capabilities of modern browsers, you may also be able to display local\n", "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;\n", "we will continue testing this and looking for ways to make it more robust. \n", "\n", "The following cell loads a local file called `animation.m4v`, encodes the raw video as base64 for http\n", "transport, and uses the HTML5 video tag to load it. On Chrome 15 it works correctly, displaying a control bar at the bottom with a play/pause button and a location slider." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "

Elementary operations

" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\frac{3 \\pi}{2} + \\frac{e^{i x}}{x^{2} + y}$$" ], "text/plain": [ " ⅈ⋅x \n", "3⋅π ℯ \n", "─── + ──────\n", " 2 2 \n", " x + y" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Rational(3,2)*pi + exp(I*x) / (x**2 + y)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$-1.0$$" ], "text/plain": [ "-1.00000000000000" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exp(I*x).subs(x,pi).evalf()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "e = x + 2*y" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "\"Add(Symbol('x'), Mul(Integer(2), Symbol('y')))\"" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "srepr(e)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$262537412640768743.99999999999925007259719818568888$$" ], "text/plain": [ "262537412640768743.99999999999925007259719818568888" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exp(pi * sqrt(163)).evalf(50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Algebra

" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left(x + 1\\right) \\left(x + y\\right)^{2}$$" ], "text/plain": [ " 2\n", "(x + 1)⋅(x + y) " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq = ((x+y)**2 * (x+1))\n", "eq" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$x^{3} + 2 x^{2} y + x^{2} + x y^{2} + 2 x y + y^{2}$$" ], "text/plain": [ " 3 2 2 2 2\n", "x + 2⋅x ⋅y + x + x⋅y + 2⋅x⋅y + y " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expand(eq)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\frac{1}{x} \\left(x \\sin{\\left (x \\right )} - 1\\right) + \\frac{1}{x}$$" ], "text/plain": [ "x⋅sin(x) - 1 1\n", "──────────── + ─\n", " x x" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 1/x + (x*sin(x) - 1)/x\n", "a" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\sin{\\left (x \\right )}$$" ], "text/plain": [ "sin(x)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(a)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$x^{3} + 2 x^{2} + 4 x + 8 = 0$$" ], "text/plain": [ " 3 2 \n", "x + 2⋅x + 4⋅x + 8 = 0" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq = Eq(x**3 + 2*x**2 + 4*x + 8, 0)\n", "eq" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left [ -2, \\quad - 2 i, \\quad 2 i\\right ]$$" ], "text/plain": [ "[-2, -2⋅ⅈ, 2⋅ⅈ]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(eq, x)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\sum_{n=a}^{b} \\left(2^{n} + 6 n^{2}\\right)$$" ], "text/plain": [ " b \n", " ___ \n", " ╲ \n", " ╲ ⎛ n 2⎞\n", " ╱ ⎝2 + 6⋅n ⎠\n", " ╱ \n", " ‾‾‾ \n", "n = a " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a, b = symbols('a b')\n", "Sum(6*n**2 + 2**n, (n, a, b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Calculus

" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- \\frac{1}{6}$$" ], "text/plain": [ "-1/6" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit((sin(x)-x)/x**3, x, 0)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$1 + \\frac{x^{2}}{2} + \\frac{5 x^{4}}{24} + \\mathcal{O}\\left(x^{6}\\right)$$" ], "text/plain": [ " 2 4 \n", " x 5⋅x ⎛ 6⎞\n", "1 + ── + ──── + O⎝x ⎠\n", " 2 24 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(1/cos(x)).series(x, 0, 6)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- \\frac{4 x \\cos{\\left (x^{2} \\right )}}{x + 1} \\sin{\\left (x^{2} \\right )} - \\frac{\\cos^{2}{\\left (x^{2} \\right )}}{\\left(x + 1\\right)^{2}}$$" ], "text/plain": [ " ⎛ 2⎞ ⎛ 2⎞ 2⎛ 2⎞\n", " 4⋅x⋅sin⎝x ⎠⋅cos⎝x ⎠ cos ⎝x ⎠\n", "- ─────────────────── - ────────\n", " x + 1 2\n", " (x + 1) " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff(cos(x**2)**2 / (1+x), x)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$-2 + \\frac{\\pi^{2}}{4}$$" ], "text/plain": [ " 2\n", " π \n", "-2 + ──\n", " 4 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(x**2 * cos(x), (x, 0, pi/2))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$9 f{\\left (x \\right )} + \\frac{d^{2}}{d x^{2}} f{\\left (x \\right )} = 1$$" ], "text/plain": [ " 2 \n", " d \n", "9⋅f(x) + ───(f(x)) = 1\n", " 2 \n", " dx " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/latex": [ "$$f{\\left (x \\right )} = C_{1} \\sin{\\left (3 x \\right )} + C_{2} \\cos{\\left (3 x \\right )} + \\frac{1}{9}$$" ], "text/plain": [ "f(x) = C₁⋅sin(3⋅x) + C₂⋅cos(3⋅x) + 1/9" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eqn = Eq(Derivative(f(x),x,x) + 9*f(x), 1)\n", "display(eqn)\n", "dsolve(eqn, f(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Illustrating Taylor series\n", "\n", "We will define a function to compute the Taylor series expansions of a symbolically defined expression at\n", "various orders and visualize all the approximations together with the original function" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# You can change the default figure size to be a bit larger if you want,\n", "# uncomment the next line for that:\n", "#plt.rc('figure', figsize=(10, 6))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def plot_taylor_approximations(func, x0=None, orders=(2, 4), xrange=(0,1), yrange=None, npts=200):\n", " \"\"\"Plot the Taylor series approximations to a function at various orders.\n", "\n", " Parameters\n", " ----------\n", " func : a sympy function\n", " x0 : float\n", " Origin of the Taylor series expansion. If not given, x0=xrange[0].\n", " orders : list\n", " List of integers with the orders of Taylor series to show. Default is (2, 4).\n", " xrange : 2-tuple or array.\n", " Either an (xmin, xmax) tuple indicating the x range for the plot (default is (0, 1)),\n", " or the actual array of values to use.\n", " yrange : 2-tuple\n", " (ymin, ymax) tuple indicating the y range for the plot. If not given,\n", " the full range of values will be automatically used. \n", " npts : int\n", " Number of points to sample the x range with. Default is 200.\n", " \"\"\"\n", " if not callable(func):\n", " raise ValueError('func must be callable')\n", " if isinstance(xrange, (list, tuple)):\n", " x = np.linspace(float(xrange[0]), float(xrange[1]), npts)\n", " else:\n", " x = xrange\n", " if x0 is None: x0 = x[0]\n", " xs = sym.Symbol('x')\n", " # Make a numpy-callable form of the original function for plotting\n", " fx = func(xs)\n", " f = sym.lambdify(xs, fx, modules=['numpy'])\n", " # We could use latex(fx) instead of str(), but matploblib gets confused\n", " # with some of the (valid) latex constructs sympy emits. So we play it safe.\n", " plt.plot(x, f(x), label=str(fx), lw=2)\n", " # Build the Taylor approximations, plotting as we go\n", " apps = {}\n", " for order in orders:\n", " app = fx.series(xs, x0, n=order).removeO()\n", " apps[order] = app\n", " # Must be careful here: if the approximation is a constant, we can't\n", " # blindly use lambdify as it won't do the right thing. In that case, \n", " # evaluate the number as a float and fill the y array with that value.\n", " if isinstance(app, sym.numbers.Number):\n", " y = np.zeros_like(x)\n", " y.fill(app.evalf())\n", " else:\n", " fa = sym.lambdify(xs, app, modules=['numpy'])\n", " y = fa(x)\n", " tex = sym.latex(app).replace('$', '')\n", " plt.plot(x, y, label=r'$n=%s:\\, %s$' % (order, tex) )\n", " \n", " # Plot refinements\n", " if yrange is not None:\n", " plt.ylim(*yrange)\n", " plt.grid()\n", " plt.legend(loc='best').get_frame().set_alpha(0.8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With this function defined, we can now use it for any sympy function or expression" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAABK8AAAL7CAYAAAA7y6Y/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", "AAAWJQAAFiUBSVIk8AAAIABJREFUeJzs3Xl0U2X+P/D3TfeN0lIIBYoQFimLiKwii1AhgigjSiTg\n", "bkWugoLMV6e/qJSOmSpyQBSNIOKCejEoCqgYFgWqI7uKsktZCi0BytqF0jb5/ZHUQWjpluTJ8n6d\n", "Myfc3O0t8zmh/eR5nivZ7XYQERERERERERF5I5XoAERERERERERERFVh84qIiIiIiIiIiLwWm1dE\n", "REREREREROS12LwiIiIiIiIiIiKvxeYVERERERERERF5LTaviIiIiIiIiIjIa7F5RURERERERERE\n", "XovNKyIiIiIiIiIi8lpsXhERERERERERkddi84qIiIiIiIiIiLwWm1dEREREREREROS12LwiIiIi\n", "IiIiIiKvxeYVERERERERERF5LTaviIiIiIiIiIjIawV7+oY6nS4MwNMAHgKgAXAWwCoA6Waz+VAN\n", "r6EG8G8AwwDEA8gGMNdsNs9zR2YiIiIiIiIiIhJDstvtHruZTqdTAfgSgBbAHADrASQBeBZAHIBe\n", "1TWwdDpdQwCb4Bg19gqAXAADAEwBMNtsNqe5Kz8REREREREREXmWp0de3en830Nms3lRxZs6ne4L\n", "ADsBvATg0WqukQGgIYCuZrP5uPO9lTqdbj+A+TqdbrHZbP7N9dGJiIiIiIiIiMjTPL3mVSGA1wB8\n", "fPmbZrP5FBxTB3tf62TnlMOH4JgiePyK3e8DOARgvKvCEhERERERERGRWB4deWU2m9cAWFPF7nAA\n", "l6q5xE0AYgB8U8m17TqdbiWAwfUKSUREREREREREXsMrnjao0+kaw7H4+oZqDm3rfN1Txf59ANq4\n", "KhcREREREREREYklvHml0+kkAO/CMQpsVjWHxwMoM5vNRVXsPwsgVKfTRbowIhERERERERERCSK8\n", "eQVHw+ouAP80m82Hqzk2BsDFa+yvaGrFuiIYERERERERERGJJbR5pdPpXgDwDBwLsM+twSkX4Fgb\n", "qyoVI67O1TcbERERERERERGJ59EF2y+n0+kmAMgA8JHZbH66hqedBhCs0+kiq5g6GAvg0jWmFV5l\n", "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\n", "OgAXANxuNOn3iU1FRETeRJumiQTwD+fmYpFZiIgChdFoVO/fvz+iWbNml0RnqQ273Y5OnTqVAMCJ\n", "EydCbrnllvNNmzYtz8jIyI2KirKJzkfu4VMdViLySf8G8ASAEgB3Gk367YLzEBGR9xkOIBrAVktm\n", "9p+iwxAR+btDhw6FbNiwISYxMdGnGlcAkJaWdrLiz5s3b47u379/AQDccMMNJW3atCl19/1zcnKC\n", "u3bt2sHd96G/Y/OKiNzGICtTABgAlAPQGU369YIjERGRd/pryqDQFEREAWLy5MktXnvtNZ9exiM/\n", "Pz9o7969kYMGDSrw5H2LiopUp06dCvHkPYnNKyJyE4OsPARglnPzUaNJv1xkHiIi8k7aNE0sgDsA\n", "2OHepwwSERGAL7/8skHz5s0v+eIi5iUlJdLy5ctjAGD16tXR0dHR5d26dbsIAD/++GPkypUro8Um\n", "JHdh84pIMEmS0kVncDWDrNwF4D3n5rNGk/4jkXmocv5Ye+Q7WH90mX8ACAOwwZKZfczdN2PtkSis\n", "vcCQl5cXPGDAgHbJyckdU1NTWwDA6dOnVampqS369u3bLjk5uWOfPn3a79y5M8yTuXJycpoBQHFx\n", "sfTaa6+pX3311asWcK+J1NTUFgkJCV0tFouQJtGsWbMSRo8e3a6goED69ttvY+Pi4koBoLy8HB99\n", "9FH80KFDPToKq7bmzp3bqE+fPu1vvPHGDikpKW1yc3OD9+/fHzp48OC2ffv2ba/VatscOnSIo7oq\n", "wQXbicSbBiBddAhXMcjKrQDMAIIAGI0m/Wyxiega/Kr2yOew/qiCp6cMsvZIFNZeAHj22Webz5w5\n", "86gkSfbevXt3at269aV169bFZGRk5N58883FNpsNnTp16vjggw+22rZt215P5bJarYlJSUm5L774\n", "YtOnnnrqRHR0dJ2e6rp48eLGRUVFqs8++yxOq9V6vFF02223Xdi2bdvpF154IfGxxx47FRoaanvq\n", "qaeaS5KEqVOnnggKCvJ0pBpLT09Xnz17Nuinn37aFxQUBK1W22bUqFGaiIgI2wcffHB47969oWPH\n", "jm2bkZHRdOHChTmi83obNq+IxJsuOoCrGGTlJgDL4fgG/R0AL4pNRNXwm9ojn8T6I2jTNI0B3Aag\n", "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\n" ], "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 381, "width": 599 } }, "output_type": "display_data" } ], "source": [ "plot_taylor_approximations(sin, 0, [2, 4, 6], (0, 2*pi), (-2,2))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "S5SWli596623ut9zzz1Fzz333FbDhg1bMXXq1E8eeeSReQ2XB4bD4VRVVdXHf/7znz9PpVI89NBD\n", "/R5//PGti4qK1txyyy3z7r///h/9Nv/oo49e+sEHH2xRVVW1BcCNN97Y91//+lfvX//614tOOOGE\n", "DZr+l5WVLRw1atSyf//7370mT568DcC8efMKZ86c2euII45Y2rVr1xZ/6K+trW3uFvMiWTV1/cKj\n", "gVpgOHBowOFI/pkQdACSt5R7EhTlngRJ+Sc5LeiZVxv7wP85Xh+KHxUS4vH4xdFo9FPgTOA8vKLV\n", "M8D4eDz+bVsFKtnRu3fvOtu2F9i2vWBTx+63336rHnnkkXnNPXdhYSGTJ0+unTx58iZ7T5111lkL\n", "77///m1uvvnmbUaMGDHvggsuWHTBBRdstI9ZwxlXALfccku/urq60Omnn96q/mdFRUWb/F6ItIW1\n", "pCYBa4CrAQt4PtiIJM9MCjoAyVvKPQmKck+CpPyTnBZYw/b2Qg3b89d+++23+9tvv73l7Nmz3x8+\n", "fHhyc9771Vdfddp11133GDBgwJqPPvrog7aKUdqXjtSwvV5FONIbr8/QlsBesWRCfQNFRERERKTV\n", "stmwvT0vGxRpU9ddd11NKpUKjRs3bvvNfW9ZWdmAFStWdLrpppvmt0VsIn6JJRNLgXvTTy8OMhYR\n", "EREREZHGqHgleWvkyJErTz755K+PO+64pZs++sd233331dFodNHo0aO1y6B0BDcC64ETKsKRHYMO\n", "RkREREREpKGge16JBCqzkXtzXXrppQuzHYtIUGLJxGcV4cg04ETgfOCCgEMSERERERH5nmZeiYgI\n", "gJ3++od0HywREREREZF2QcUrkYDV1NQMCDoGyU+hUGhi/X+nG7W/gNe4/YygYpL80TD/RPyk3JOg\n", "KPckSMo/yXUqXokErLa2tn/QMUjempDxvH721bkV4UjY72Ak72Tmn4hflHsSFOWeBEn5JzlNxSuR\n", "gBUVFS0IOgbJW5Mynj8P/BfYFviN/+FInsnMPxG/KPckKMo9CZLyT3KailciARs4cOCXQccg+SmV\n", "Sk1s+DyWTKSA69JPrYpwRP9GSJvJzD8Rvyj3JCjKPQmS8k9ynT6YiIhIQ9OAGmB34OcBxyIiIiIi\n", "IqLilYiI/CCWTKwFbkw/tYKMRUREREREBFS8EhGRDd0LLAMOrghHDgg6GBERERERyW8qXomIyI/E\n", "konvgDvSTy8OMhYREREREREVr0QCVlNTMyDoGCQ/hUKhiRsZngKsBcZUhCOD/IlI8skm8k+kzSj3\n", "JCjKPQmS8k9ynYpXIgGrra3tH3QMkrcmNDUQSya+BKbi/Ttxrm8RST5pMv9E2phyT4Ki3JMgKf8k\n", "p6l4JRKwoqKiBUHHIHlr0ibG6xu3n1oRjvRq62Ak72wq/0TainJPgqLckyAp/ySnqXglErCBAwd+\n", "GXQMkp9SqdTEjY3Hkol3gJeAHsCpPoQkeWRT+SfSVpR7EhTlngRJ+Se5TsUrERHZmPrZV+dWhCOd\n", "A41ERERERETykopXIiKyMU8Bc4AdgTEBxyIiIiIiInlIxSsREWlSLJmoA25KP70gyFhERERERCQ/\n", "qXgl0sBjjz3WY9SoUbsYhrH7oEGDho4ePbr4hRde2NLvOGprazvtuuuuQ+fNm1fo97VFGnE/sBQ4\n", "sCIcOSDgWEREREREJM+oeCWSdvvtt2996623bvPEE09Uu6770dtvv50AOOKIIwZfffXV27TVdWtq\n", "agbU//eyZcsK7rjjjq333HPPIdXV1V3Xrl0baqvrioRCoYnNOS6WTKwA7ko/1ewryYrm5p9Itin3\n", "JCjKPQmS8k9ynYpXIsD8+fM7X3fddf1nzJjxac+ePesAevfuXTd9+vRPe/fuvXbChAkDX3755S3a\n", "4tq1tbX9AUaPHl186KGH7jp79uwtunXrVtcW1xLJMGEzjr0VWAf8qiIc2bGN4pH8sjn5J5JNyj0J\n", "inJPgqT8k5ym4pUIcOedd/YdM2bMkvrCVb3u3bunfv7zny+tq6vj5ptvbpPZV0VFRQsAnn322WrX\n", "dT+69957P+/bt++6VCrVFpcTaWhScw+MJRNfANPw/t04p80iknzS7PwTyTLlngRFuSdBUv5JTlPx\n", "SgRwXXfLKVOm9B83blz/zLHBgwevBvjwww+7tcW1Bw4c+GVbnFdkU1Kp1MTNfMuN6a9/qAhHemY5\n", "HMkzLcg/kaxQ7klQlHsSJOWf5DoVr0SA9evXh9atWxd67LHHemeOrVu3LlR/jP+RibQfsWRiNvAy\n", "0BM4JeBwREREREQkT6h4Jb5asGBB55EjR+4aiUSGnHbaadsDLFmypOC0007b/qc//emukUhkyAEH\n", "HLDb+++/H/YzrksvvXTBsGHDVlx00UVfZY795z//2QJg+PDhKzZ1ntNOO237vn37Dq+srOzeFnGK\n", "tAM3pL+eVxGOdAo0EhERERERyQudgw6goxp/ZsU+QceQDVffEZudzfNdeOGF21133XWfh0Kh1P77\n", "7z900KBBa1566aUekydP/vLAAw9cVVdXx9ChQ4eMHTt2p9mzZ3+UzWtvzOGHH77i8MMP/zDz9UWL\n", "FnV69tlnexcUFHDOOecs3NR5pk6d2m/lypUF06ZN611aWrq8baIVCdRTwFxgZ+BY4JFgwxERERER\n", "kY5OxSvxzapVq0ILFiwo3G+//VY999xzWwLccMMN/d955533d9hhh3UABQUF7LLLLquef/75DZbv\n", "NXTTTTf1qaio6NOSOAoKCvj73/8+b/DgwWs2dew111yzzcqVKwt+97vffX3wwQev3NTx48aN++Lx\n", "xx/vfeaZZ26y0CWSi2LJxPqKcOQmYApwASpeiYiIiIhIG1Pxqo1ke8ZSR/Dyyy9v+bOf/ew7gDff\n", "fHNLgIkTJ35eX7iqV1tb26VXr17rGjtHvfPPP3/x+eefv7jtooXZs2d3nTJlSn/TNL+55557aprz\n", "niuuuOLrK6644uvNuU5NTc0ANW2XIIRCoYktbN55P3AlcFBFOLJfLJl4K6uBSV5oRf6JtIpyT4Ki\n", "3JMgKf8k16nnlfimtLR0+aRJk2oBXn755R6dO3dO/e53v1va8JiVK1eG/ve//22x1157Bbrkbtmy\n", "ZQWxWKzYNM1vnn322bmdOrVda5/a2toNdjgU8cmElrwplkwsB+5OP70ge+FInmlR/olkgXJPgqLc\n", "kyAp/ySnqXglvqurq8N13R5Dhw5d2aNHj7qGY4899ljPZDJZMHr06GVBxbdu3Tp+8YtfFA8fPnzl\n", "008/XV1YWNim1ysqKlrQphcQadqkVrz3VmA9cHxFOLJDluKR/NKa/BNpDeWeBEW5J0FS/klOU/FK\n", "fPfGG290+/bbbzsddNBB32WOzZgxo3dhYWHqpJNO+iaI2ABOOeWUHfr37792+vTp8woKfvgr8tZb\n", "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\n", "33fffR0++OCDZpMnTz68tvNLUqz//d56662TRo8e/aPLLrsst1evXj86++yzj/nss88aRWv8aJ5f\n", "tWpVw9LS0sxQKKS33347a9WqVQmVb28H++9DIp8PhUIFCZZvcuTw5X5fXpaD+Tkfx/MJWH+cT5Pz\n", "VbfNJGo+zqfu+eq3bCViPs6n9nnqj/OJcr6+PJf700SeNrhC0vnW2peiMN59ki6y1h5d288sWLAg\n", "JEn9+/ev9TKPRYsWfdenT5+EW/WTDLZu3ZrRpUuX4+64444111xzzT4bfl988cVHLV26tFmrVq3K\n", "p06durJ79+7BeGe01rYYMWLEMdu2bWtQdczzPLVs2bL8tdde++JAT8m75JJLcl966aVWTz755Dfn\n", "nHPO9v1dF28jR47scOutt37fqVOnPZL061//uuOiRYtafPTRR5+1a9dun5WMh+KLL75o1K9fvx+v\n", "WbPmk7p87rzzzuv0zjvvtNi0aVNDL7LqKhQKqXHjxpXZ2dnl77zzzudHH330nmhmratFixa16dOn\n", "T0eXGVKd35f3vqSekq7IDwamuc4DAAAAoH7q02/Zn6Tb88oY40k6xlr7TQ2nT5P0aZwjoQ5atGhR\n", "WVpa+vH+zj/11FOr4pmnJsaYrcaYD+vz2RkzZhRLKo5ypENSVlbmTZ8+/YisrKzKP//5zyWSNHbs\n", "2JIePXq0njJlSuvCwsJS1xklqaa9zZCWJit86/covy/vsfxggCcAAAAAAGnuUG8bjCljTIYxJmev\n", "wzMlvWOMabvXtfmSekmaGq98QDIoLy/3WrVqVb5z585/f7136dJltyStWLHCF+35mjdvXnnEEUc4\n", "XSGFpGYlbZTUQ9LJjrMAAAAASACJvvJqiqThxpg+1tp3I8f+LOkchRtY90paJennkq6V9Ji19kU3\n", "UYHE1KJFi8q9b+ELBAI+SercuXPUb8ts3759+bJlyz6P9rhID/nBwE6/L2+6pBslXSVpsdtEAAAA\n", "AFxLhJVXB7olZLWkTZK2VB2w1i5VeIXVYkn/T9ILkk6XdKW19ooY5gRi4kAbucdKUVFRq9atW++5\n", "9tpr2bstjUV7E8UoeiTymu/35R3mNAliJoHrDymO2oMr1B5cov6Q7Jxu2J4I2LAdri1ZsuSkk08+\n", "eWm85vvqq68anXLKKXl///vfvxs6dOiWg38CVVJtw3bP80KhUOiQN0+MBb8vb4GkfpKuzQ8GJrrO\n", "g+hL5PpDaqP24Aq1B5eoP7gQzQ3bE2HlFZDWcnJySuI1165du7xhw4Z1fPDBB1fSuIKkca4DHMCU\n", "yOtVfl8ef9FKTYlcf0ht1B5cofbgEvWHpEbzCnAsNzd3bbzmGjFiRO5NN9207tJLL90sScuXL4/6\n", "hu1IHqFQqMB1hgOYLWmdpG4KP0kWKSbB6w8pjNqDK9QeXKL+kOxoXgFporCw8Ihzzz1384UXXrhV\n", "koLBoFdUVJTtOhdQk/xgYI+kaZG3V7nMAgAAAMCtRH/aIIAoKCoqOmzOnDmHBYPBrR9++GGWJK1Z\n", "syazV69eO1xnAw7gUUm3SbrQ78u7Pj8Y+MF1IAAAAADxR/MKSHHr1q1rcNVVV3UKBoMZ7733XvOq\n", "457nafjw4QGX2YADyQ8GVvp9ea9KOkfSZZLudxwJAAAAgAM0r4AU17Zt24qysrJlrnMA9fR3hZtX\n", "V/p9eePzg4FK14EAAAAAxBd7XgGOFRcXt3edAenJ87wC1xlqYY6kVZKOkTTAcRZEUZLUH1IQtQdX\n", "qD24RP0h2dG8AhwrLS1t5zoD0tadrgMcTH4wUCHpkchbNm5PLQlff0hZ1B5cofbgEvWHpEbzCnAs\n", "JyenxHUGpK1xrgPU0mOSyiX90u/L6+A6DKImWeoPqYfagyvUHlyi/pDUaF4BjuXm5q51nQHpKRQK\n", "FbjOUBv5wUCJpFmSGkga7jgOoiRZ6g+ph9qDK9QeXKL+kOxoXgEAksHfI6+/9/vyeNgIAAAAkEZo\n", "XgEAksHrkr6SdKSkXzjOAgAAACCOaF4BABJefjBQKenhyNuRLrMAAAAAiC+aVwCAZDFdUlDSQL8v\n", "7xjHWQAAAADECc0rwLHi4uL2rjMgPXmeV+A6Q13kBwMbJFlJnqTfO46DQ5Rs9YfUQe3BFWoPLlF/\n", "SHY0rwDHSktL27nOgLR1p+sA9VC1cftwvy+vkdMkOFTJWH9IDdQeXKH24BL1h6RG8wpwLCcnp8R1\n", "BqStca4D1MO7kj6RdLikXznOgkOTjPWH1EDtwRVqDy5Rf0hqNK8Ax3Jzc9e6zoD0FAqFClxnqKv8\n", "YCCk/6y+usplFhyaZKw/pAZqD65Qe3CJ+kOyo3kFAEg2T0raIekMvy+vq+swAAAAAGKL5hUAIKnk\n", "BwNbJc2MvGX1FQAAAJDiaF4BAJJR1a2Dw/y+vCZOkwAAAACIKZpXAICkkx8MLJO0VFK2pF87jgMA\n", "AAAghmheAY4VFxe3r+tnXnnlleZ//OMf28YiT31NnDix9YQJE9qcd955nYqKig5znQcH53legesM\n", "h+iRyOvvnaZAvaRA/SFJUXtwhdqDS9Qfkh3NK8Cx0tLSdnW5fv369Q0mTJiQU15e7sUqU10tWLCg\n", "aYcOHfbceOON6x966KHiK6+8stO6desauM6Fg7rTdYBD5Fd44/bT/b68H7sOgzpL9vpD8qL24Aq1\n", "B5eoPyQ1mleAYzk5OSV1uX7GjBnZgwcP3hQKhWIVqc4+//xz36RJk46QpNzc3PLGjRtXfvvtt41c\n", "58JBjXMd4FDkBwPbJD0deXuFyyyol6SuPyQ1ag+uUHtwifpDUqN5BTiWm5u7trbXPvfccy3OP//8\n", "LRkZifWlO3LkyI0zZ878TpIWL17cOCsrq7Jnz547HcfCQYRCoQLXGaLg0cjrpX5fns9pEtRJitQf\n", "khC1B1eoPbhE/SHZJdZPwAD26+uvv87MyMhQ586d9yTSqitJysjIULt27corKip02223dSgqKlrR\n", "sGFD17GQHt6X9LGkNpIGO84CAAAAIAZoXgFJYv78+c3XrFmTOXHixNbz589v8fHHH2fNmTOnmetc\n", "1Y0ZM6bd7bffXtK/f/8drrMgPeQHAyH9Z/UVG7cDAAAAKYilEUCSuOqqqzZW/fO3337r8zwvNGjQ\n", "oO0uM1U3efLkVkOGDNnUs2fPXW+99VZWVlZW5YknnrjLdS6khZmSHpA0wO/L65wfDHzjOhAAAACA\n", "6KF5Bezl448/9t1xxx3tv/nmm8ZNmjSplKR77rln9YABA2K2mqiyslKFhYU5wWDQ++STT7LGjx+/\n", "+uGHH25TXl7uZWdnlxcWFpZWXfvCCy+0eOONN1p4nheaNWvW9vPPP39brHLVNt+JJ55Ydssttxzt\n", "8/kqJSkUCnnr16//MNa56qq0tLTBaaed1nXevHlfduzYcY/rPIiO/GBgk9+XZyUNkzRc0m2OIwEA\n", "AACIIm4bBKqZM2dOsz59+uT169dv66effhpYvHjxF0888cS3I0aM6Lhu3boGsZizuLi4/f3333/4\n", "kCFDNt9zzz3runfvXnb66ad3/cMf/lBaXFzcaNasWdnVr7/gggu2fvDBB58vXbr0i3g0riTpYPnO\n", "P//8bWVlZcs2bdr00aZNmz7avHnzh4m059WWLVsypkyZ0uqEE07otmLFisZ79uzxXGdKBJ7nFbjO\n", "EEVVtw5e5vflZTpNglpJsfpDEqH24Aq1B5eoPyQ7mldAxGeffdbo4osv7nzdddeVXHfddRuqjhcW\n", "FrZduXJl47lz5zaPxbylpaXtQqGQunfvHpSk77//PrN3795b27ZtW1FYWLj2xRdfdH4LVKLnO5BB\n", "gwYdM2DAgC5Lly7NqlpJh3+703WAKHpbUkBSW0nnOs6C2kml+kNyofbgCrUHl6g/JDWaV0DEDTfc\n", "kNu0adPKgoKC0urH16xZ06hBgwahLl26BGMxb05OTsmYMWN+qHr//vvvN+vTp892SfrJT34S7Ny5\n", "s/Pb21znKy4ubnj88cd3rc9n58yZs2Lx4sVfTJ06dXWbNm3KE+1JjY6Ncx0gWiIbt0+NvGXj9uSQ\n", "MvWHpEPtwRVqDy5Rf0hqNK8ASUuXLm08f/78w84555xNGRn//WUxf/78r1etWvVRr169dsZi7tzc\n", "3LVV/7xhw4YGX3zxRdaZZ56ZMBuxV+cqX1lZWcb69eu5FSzKQqFQgesMUVYkabeks/2+vKNch8GB\n", "pWD9IUlQe3CF2oNL1B+SHc0rQNLTTz+dHQqF1KNHj7K9z2VmZqpt27YVsZo7GAx6L730UnNJmjdv\n", "XrNmzZpV9OjRY5ckvfXWW1lz5sxpFqu5UyEfUCU/GFgv6QVJnqTLHccBAAAAECU0rxBXJSUlDU8/\n", "/fQueXl53a644oojJWnjxo0ZV1xxxZE/+9nPuuTl5XX76U9/+qPly5f74pnrzTffbCFJ7du33zNz\n", "5syWffr06XLCCSd07dmz54/9fn/L2o5zxRVXHNmmTZvjX3vttVo3dCZMmNBmyJAhXbZv3+69+uqr\n", "LbOzs/dIUkVFhYqKilr9/Oc/d7oKK9HzAXup2rh9uN+XF5OHLAAAAACIr8R5HFiKGTjmmJNcZ4iG\n", "1+5ZsTSa4914440dxo8fv9rzvNCpp57avVOnTrvfeOON5oWFhWt79eq1s7KyUt27d+82bNiwjkuX\n", "Lv0imnMfyMqVK32S9M477zQNhUJatGjRV1L46YODBw/+0Zdffrn6zjvv/P5g4zz99NOHl5WVZTzz\n", "zDPZAwcOrFVTZ8CAAduWLl268fbbb283fPjw9Y0aNaocNWpUB8/zdNNNN33foIHbn78TPR+wlzck\n", "fSOps6SzJf3DaRoAAAAAh4zmFeJm586dXklJSeYpp5yyc+7cuU0lacKECe2WLVu2/KijjiqXpIyM\n", "DB177LE7582bl32gsf7yl7+09vv9reuTIyMjQ48//vh3Xbt23V11bNOmTQ0lad68eS2rN80GDRq0\n", "ffDgwRvvuuuuI3/xi19s7dmz564DjX3rrbeumT17dvbIkSN/ONB11fXs2XPXc889913V+759++5z\n", "66JLiZ4PqC4/GKj0+/IelXSvwhu307wCAAAAkhzNqxiJ9oqlVLBw4cKmffv23SZJ7733XlNJKigo\n", "WF3VuKpSWlraqGXLluU1jVHl+uuv33D99ddviFa2zMzMUHl5uXfWWWdt2ftc7969tz3//POtH3zw\n", "wZynnnpq5YHGGTt27Pdjx4496Aqt6oqLi9tX37QdiBfP8wpSdPPO6ZLuknSu35fXPj8Y4OsrAaVw\n", "/SHBUXtwhdqDS9Qfkh3NK8TNwIEDt1fdSrdw4cLmDRs2DF166aWbql9TVlbmffLJJ1l9+/bdp4kU\n", "Sy1btizfuXNno+OPP36fJwq2a9euXJLefvvt5rGYu7S0tB3NK2nixImtn3zyyRpX0wWDwYwNGzZk\n", "nnrqqT+q6bzneZo0adKqk08++YAr47CPOyUVuA4RbfnBQKnfl/eSpAskXSbpbseRULOUrD8kBWoP\n", "rlB7cIn6Q1KjeYW4q6ys1OLFi5t37969rHnz5pXVz82aNatFMBjMGDRoUFybV9nZ2eXr1q1r1KxZ\n", "s8q9zzVp0qRSCq8Ii8XcOTk5JbEYV5IGDx7cad26dZl1/dxFF1208YYbblgfi0z7M3r06A2jR4+u\n", "cTXdl19+2ejMM8/88XvvvfdlPDOlgXGuA8TQIwo3r67w+/LuyQ8G9vnahnOpXH9IbNQeXKH24BL1\n", "h6RG8wpx969//avJ1q1bG/Tu3Xvb3udeeOGF7MzMzNBvfvObzfHM9OMf/3hnIBDI2rZt2z5P4AyF\n", "QpKkZs2aVcRi7liuupo9e/a3sRo7nqr+P0B0pfjS8XmSVkrqKGmApLlO02AfKV5/SGDUHlyh9uAS\n", "9YdkR/MKcTd//vzmktSvX7//al5t377de+211w4744wztrRp06airKzMGzp0aMeXX355nwbMgw8+\n", "2Obpp59uVZ/5MzIyNG3atO+6dev27w3b+/fvv3XWrFmt165du8+7DkzuAAAVZUlEQVQqpS1btjSQ\n", "pG7dusVko/KMjIyoPZnS8zxVVFREdb+1RM8H1CSycfs0SYUKb9xO8woAAABIUjSvEHdvvvlm84YN\n", "G4bOOuus7dWPz507t/mOHTsaXHzxxRsk6bHHHms1cODArTWNccMNN6yP5m1t+fn5m//4xz9WfPjh\n", "h1l7n1uyZEmWJP32t7896Hzjxo074uWXX85+5JFHVp544om12n+psrIyoZs5iZ6vrjzPcx0B8fO4\n", "wns7DPb78o7IDwbq9DAFAAAAAIlhn1ukgFiqqKjQkiVLatzvqqqpcNxxx+36+uuvM5999tnsq6++\n", "OmpPFDyQVq1aVV577bXrXnnllVbr1q1rUHV8165d3ssvv5zds2fPbSNGjNh0oDEk6b777uvwwQcf\n", "NJs8efLhdc2wbdu2jJtvvrndZZddlturV68fnX322cd89tln+91n69e//nXHefPmNa3rPNFS17yu\n", "rVq1qmFpaWlmKBTS22+/nVVZyRZIqS4/GFgt6R+SMiVd4jgOAAAAgHqieYW42rFjR0bjxo0rhw8f\n", "/sPe5371q19tveiii364+OKLj/nd737X6aGHHirOyIhfid59993rzjnnnI39+vX70aOPPpo9Y8aM\n", "w84888wuHTt2DM6dO/fr2owxZMiQ9S1btiy/4IILDtro2tutt97abtSoUesff/zx4nfffffLpk2b\n", "Vp5xxhldS0pK9lkh+cILL7R48cUXW5eXlztbRlSXvC6dd955nVq3bn18x44dj1+9erXP8zxdfvnl\n", "nZs1a9ajQ4cO/7Ny5co6b2iPpPJo5PX3fl8ey+4AAACAJJRQP2Qi9bVo0aKytLT04/2df+qpp1bF\n", "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\n", "Z4QAAAAASUVORK5CYII=\n" ], "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 381, "width": 599 } }, "output_type": "display_data" } ], "source": [ "plot_taylor_approximations(cos, 0, [2, 4, 6], (0, 2*pi), (-2,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This shows easily how a Taylor series is useless beyond its convergence radius, illustrated by \n", "a simple function that has singularities on the real axis:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAABJ8AAALwCAYAAAA5/9TEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", "AAAWJQAAFiUBSVIk8AAAIABJREFUeJzs3Xt4E2XaBvB70sO00BZKC6UtxVIOEnBFhLACKliUgKsi\n", "KMUgIgqKgu6Hh7rUVSisbpWirisgK6iAq4HKKoouRqEqqCsUxBNGASNQoATLGdpOD8n3R1IN6bk5\n", "vMnk/l2XV5nJJHPDPptMn7zvO5LdbgcREREREREREZEvaEQHICIiIiIiIiIi9WLziYiIiIiIiIiI\n", "fIbNJyIiIiIiIiIi8hk2n4iIiIiIiIiIyGfYfCIiIiIiIiIiIp9h84mIiIiIiIiIiHyGzSciIiIi\n", "IiIiIvIZNp+IiIiIiIiIiMhn2HwiIiIiIiIiIiKfYfOJiIiIiIiIiIh8hs0nIiIiIiIiIiLyGTaf\n", "iIiIiIiIiIjIZ8JFB/DUpk2b7KIzEBERERERERGp0YgRIyRPX4Mjn4iIiIiIiIiIyGeCfuRTLW90\n", "4ohaKisry15QUKDa2tPlF84AsNhl1/Ki7My7/HDeVQBuc9l1e1F25ipfn7e19DkZTwD4K4BlpjzL\n", "3f44p9prj5pmlLV/APAFgBgAjxoUc56/zs36I1FYe+qgyy98EMAzLrueK8rOfNAP530bwI0uuyYU\n", "ZWcWNPf5rD8ShbVHonhzphlHPhFRY5Lctq1CUgQwfU6GBGCCc3ONyCwUOoyyNhHAO3A0nowAnhKb\n", "iIgoKLhfx7hf5xARkY+w+UREjWHzqWn9AfQAcBTAp4KzUAgwytoIAG8C6AZgO4CpBsXM9Q+JiJrG\n", "5hMRkSBsPhFRY9h8alrtqKe1pjxLtdAkFCqeBzAcwBEANxoUc7nYOEREQYPNJyIiQdh8IqLGsPnU\n", "COeUuyznJqfckc8ZZe29AO4FoMDReDokOBIRUTBh84mISBA2n4ioMWw+NW4QgHQAhwF8JjYKqZ1R\n", "1l4F4J/OzbsMinmryDxEREGIzSciIkHYfCKixrD51LjaKXdvmvIsNqFJSNWMsjYDwFo47lKbb1DM\n", "rwmOREQUjNh8IiIShM0nIqqXLr+wLYC2LrsqAZwUFCfg6HMyNOCUO/IDo6yNBfAugA4A3geQIzYR\n", "EVHQqtN80uUX8vb1RER+wOYTETXE/dvAo0XZmaLuqBWIF4ZDAKQCOADgS8FZSKWMsjYMgBFAXwBm\n", "ABMNirlGbCoiIo+J+lw/A6DCZTsKQKygLEREIYXNJyJqiMgpd8Fw2/jaKXcFpjxLMOSl4LQAwJ8A\n", "HAdwg0Exnxach4jIF/zyOer8Eo1T74iIBGDziYgawvWeGqDPyQgDcLNzk1PuyCeMsvYuAA8CqAIw\n", "zqCY9wqORESkBmw+EREJEC46AFGQmyc6gA+x+dSwKwF0BmABsENQBjXXXsgzytpMAEucm9MNivlT\n", "kXnqwfojUVh75ClPmk8BWX+bNm2SAIyIjIy8SZKkK+x2e4zoTORdd91116ktW7bsE52DgpMkSWft\n", "dvuWysrK/wDYNGLECCGzNth8IvJAQUFBrugMPsTmU8MMzp9rRE25U3nthTSjrO0F4D/4/c52rwqO\n", "VAfrj0Rh7ZEXtLr5FIj1t2nTJiksLOyRmJiYu7p06WKPj48/GxkZWSpJgbhcJnmgVHQACk52ux2V\n", "lZVhJ06cuPrgwYPXnD17dtmmTZsWiGhAcdodETXE/WLsiJAUAUafkyEDGO/cfENkFlIfo6ztAOA9\n", "AO3huMMd72xHRORd7tczwT7tbkRMTMxd/fr1O925c+dTsizXsPFERLUkSYIsyzWdO3c+1a9fv9Mx\n", "MTF3AcgUkYXNJyJqCEc+1W80HI2Bb015lu9FhyH1MMraCABrAfQE8A2AW3lnOyIir1PVmk+RkZE3\n", "denSxR4REWETnYWIAltERIQtNTUVkZGRN4k4P5tPRB6QJClXdAYfYvOpfhOdP18XGULltRdyjLJW\n", "ArAYwFVwfCt/vUExnxWbqmGsPxKFtUde0OrmUyDWnyRJV8THxwfs5wV5R3FxcYroDKQOHTp0OCtJ\n", "0pUizs3mE5Fn5ooO4ENsPrnR52TEAbgejltCGwXHUXPthaJZAO4CUAFgjEExFwvO0xTWH4nC2iNP\n", "eTLyKeDqz263x0RGRnKUrMpZrdZk0RlIHSIjI6vtdntbEedm84nIMwF51xNP6fILJTju5uZKZPMp\n", "UBYvGAcgCsBmU55FdHNAlbUXioyy9joAzzg3bzco5m0i8zQT649EYe2pg8jPdffrmZb8Uh+Q9cc1\n", "ntQvKSmpRHQGUgfn+4WQNw02n4g8YLfbc0Vn8JH2AGJdtssBHPfj+YXcQa4ZbnX+FDrlDlB17YUU\n", "o6y9GI5RdBKAuQbFXCA4UrOw/kgU1p5q+fNz/6DbdhddfmFYc57I+iNR0tLSDovOQOQpNp+IqD4X\n", "uG0fKMrODNSGkF/oczKS4bgzRBWA/wiOQypglLVJANYDiIGjAfU3sYmIiNSvKDvzHIBjLrvC0bLR\n", "T0RE1ApsPhFRfdybT/uFpAgsE+B4z/yvKc/iz1FgpEJGWdsGjsZTVwBfArjToJhDusFLRORH7tc1\n", "7tc9RETkZWw+EVF92HyqK2Cm3FFwM8paDYB/A9AB2AfgRoNirhAaiogotLD5RB4pLy+XbDab6BhN\n", "Onv2rPTjjz9Gtua533zzjeztPBTa2Hwiovqku23vE5AhYOhzMnoBGAjgDID3BMeh4LcAwFgApwD8\n", "yaCYQ/5OkkREfrbPbTtdQAYKAKdOndIMGzash0ajGfDiiy92aO7z/vrXvyZ369btIkVRAnq199mz\n", "Z6cMGDCg7/79+yNa8ryVK1e2HzhwYN+NGzcKuSsaqRObT0QekCQpV3QGH+HIp/PVjnr6jynPUi40\n", "iZOKa0/VjLL2XgAPAagGMM6gmH8QHKlVWH8kCmuPvKRVI59Yf+qyf//+iMGDB1+4ZcuWdkDz7xpY\n", "XV2NN954I7FPnz5lsiz7Zcp8cXFxSkuf8/3338vLli1L0ul0Zy644IKqljx3yJAhZWFhYZg1a1bX\n", "YBjhRcGBzSciz8wVHcBH2Hxy0udkSAAmOjcDacqdWmtPtYyydjSARc7NuwyKuVBkHg+x/kgU1h55\n", "Q2un3bH+VGL79u1RgwcP7r179+7owYMHn27JcwsKCtodPXo0Yvr06b/6Kp87q9Xa4kXxH3vssZSa\n", "mhosXLjQ/Q6PTerZs2flpEmTjv7www9tVq9e3a6lzyeqD5tPRJ6ZJzqAj7D59DsdgB4AjgD4WHAW\n", "V2qtPVUyytp+AArg+Nx9wqCYV4hN5DHWH4nC2iNvaG3zifWnAps3b25z1VVX9T527FjE0qVLf7nl\n", "lltadCOZ5cuXd+zSpYty4403nvFVRndJSUklLTn+119/Dfvggw/ihw8ffmrgwIGtWldyzpw5R8LC\n", "wuwvv/xyYmueT+SOzSciD9jt9lzRGbxNl1/YFoDrh0w1gMOC4tQSOZ9+kvPnalOepUZgjvOosfbU\n", "yihrUwG8DyAGgBHAHLGJPMf6I1FYe6ohep2cOs0nXX5hk5lYf+rQt29fJSUlpfK1117bO23atBN2\n", "e/Nnzu3duzdi8+bNcbfddlupDyPWkZaW1qJr8ZdeeimhsrJSuvfee1s9Oqtr167VmZmZpz799NN2\n", "Bw4cCG/t6xDVYvOJiNx1dds+WJSd6e+mS0Dccl6fkxGJ36fcrRKZhYKTUdbGwLFIfSqAzwDcaVDM\n", "AVHfREQBxN/viycAnHXZjsb5X7yRiiUkJNTs2rXrh6ysrBZNtwOAxYsXd9RoNJgxY4Zfm08t9f77\n", "77dLTEysuummm1r8d3Q1ZcqUUpvNJq1fvz7OW9kodLH5RETuOOXud9cCSADwPYCvBWehIGOUteEA\n", "VgO4BMBeAGMNirlVQ9+JiMh7irIz7Wj91DtSgfDwlg/kqa6uhtFoTLz66qtPpqamVrs/XlNTg8WL\n", "F3cYMmRIr/bt218SHR3dv2fPnn1nz57duaysrM7IukOHDoXfe++9qd27d+8bHR3dPy4u7pIBAwZc\n", "+PTTT3ds6C563377rXzTTTelp6Sk/CEqKurS9PT0ix566KHkioqK346vrq7GN998EzNo0CDXBism\n", "TZrUVaPRDJg6dWqa++seOHAgvH379pd06dLlD6dOnfqtRzBy5MizGo0GX3zxRUxL/72I3HH4HBG5\n", "S3fbDuXm0+3OnytNeRaOVqFmM8paCcA/APwJwHEA1xoUc0B/S0pEFGL2A+jrsp0OYLuYKL6jyy8c\n", "IDqDNxVlZ+4Qde41a9a0O3r0aMTdd99dZyrb6dOnNddee233L774Ii45ObnyuuuuO96+ffuar776\n", "qs2CBQtS33rrrQ6bNm3anZaWVg0AJpMp5pZbbul+5syZ8CFDhpweNWrUyYqKCs3mzZvjcnJyur72\n", "2muJJpNpj2uTa8eOHVHDhg3TAoBerz+RlJRUtWXLlrjnnnsuZefOnW0LCwv3AsC2bduiy8vLNUOH\n", "Dj1vTaply5YVb9u2LWbFihWdxowZc/KGG2747fGpU6decPbsWU1BQcGedu3a/XZ7u4SEhJpevXqV\n", "FRUVsflEHmPziYjcuX/zt09ECNH0ORmJcDQObAisu9xRcPg/ADMBVAIYY1DMewTnISKi8+1z2+bI\n", "J2rU8uXLO6alpdW70PiUKVO6fvHFF3F33323ddGiRQddR1a9+uqr8a+99lpCVFSUHQD27NkTmZWV\n", "1SMyMtK2adMm87Bhw8pcX+vvf/97x8cff7zrDTfc0H3Hjh0/1e7Pz89PKisr05hMph+vueaacwBg\n", "s9kO3Xjjjd169+5dYbPZoNFosHv3bhkAevXqpbi+bnR0tH316tWWyy+/XDt9+vT0oUOH/pCQkFCz\n", "dOnSDps2bWo/c+bMIyNHjjzn/nfr2bNnxaZNm9p7+M9HxGl3RJ6QJClXdAYf4LQ7BwOACAAmU56l\n", "RXcY8QeV1p4qGGXtjQCedW5OMSjmz0Tm8QXWH4nC2iMvavG0O9Zf6NqzZ0/kli1b2k2aNKnOKOZv\n", "vvlGXrduXcKQIUNOL1269KD7lL477rjjRGFh4d6OHTvWAMDjjz+efObMmbCXXnppn3vjCQAeffTR\n", "X2+//fajO3fujFm5cmV7ACguLk45ePBgJAAMHDiwvPZYjUaDd99995cFCxaUaDSOX+1//fXXcABI\n", "TEysMzXw0ksvrXjyySeLrVZr5J133tm1uLg4fPbs2V379OlT9txzzx2q7++elJRUVVZWpqmqqmr+\n", "PxhRPdh8IvLMXNEBfIDNJ4ffptwJTdEwNdZe0DPK2sFw3NFOAvC4QTEbBUfyFdYficLaI29pzZpP\n", "rL8QtXjx4sSwsDD7zJkz6zSf3nrrrfYAMH369CbvLGez2fDBBx/EZ2RkVIwdO7bBxcBzcnKsAPDm\n", "m292AACr1Zo8cODAcwAwbty4jC1btrSx2Wz1Pvf48eO1zad6bxj0wAMPlF577bUn1q9f32HYsGEX\n", "VlZWSq+//rqloXWwoqOjbQBw5MgRzpoij7CAiDwzT3QAHwj55pM+J6MvgAEATgF4R3Cchqix9oKa\n", "Udb2ArAeQBSA5QCeFJvIp1h/JAprj7ylNc2noKs/kWskqUXtQuMjRow4mZKSUmc00c8//ywDwKWX\n", "Xlpe99nnO3LkSPjp06fDhg0bdqqx43r27FnZrl27aovFIgNAUlJSydNPP13y008/RZlMpvhhw4a1\n", "i4+Prx40aNCZ8ePHn7jzzjtP1D43MjLSDgCui5C7e/nll/enpaW137dvX9Q999xzpF+/fkpDx5aV\n", "lWkAx7S9pv5+RI3hyCciD9jt9lzRGbxJl18YCSDFbXexiCyC1Y56WmPKswTk3cnUVnvBzihrOwHY\n", "AMfdETcAmGFQzKq9SGP9kSisPfKiFjefWH+hafXq1e1//fXXiOaMbPKVtLS0w7Is2zds2GD59NNP\n", "zQ8++ODhHj16lG/cuLH9tGnTMv70pz9l1B6bkJBQDQClpaUNDjR58sknk6qrq6WoqCjb6tWrE/fv\n", "3x/R0LEnTpwIDwsLszc0koqoudh8IiJXaXBMF6pVUpSd2eA3IX7U4Dc33qbPyQgHMMm5GahT7iiA\n", "GGVtWwDvAcgA8BWALINi5sIIREQN89vneiOscNwUolZ7XX5hO1FhKHAtW7YsMS0tTRkzZkydhcYB\n", "oEePHgoA7NixI7qp1+rcuXN1XFxczQ8//NCmseP27NkTeerUqfDu3bvX+RL0iiuuKFu4cGHJ1q1b\n", "d1sslm+HDBlyesOGDfFr166NA4COHTtWA4DVaq23+fTee+/FLl68OPnmm28uffHFF385efJk+IQJ\n", "E7o1No0vPj6+zogvopZi84mIXAXKlDuRI0auBpAMYA+A/wnMQUHAKGvDAawGoIPjzkl/Mijms0JD\n", "EREFH79/7hdlZ9oAHHDbzTve0Xn27NkT+fnnn7e77bbbGhz1NG7cuJOSJOGll17q2NTraTQajBo1\n", "6sTPP/8ctW7dutiGjnvqqaeSAODmm28+4bq/rKzsvMZtWlpa9X333XcUAL799ttoABgwYEA5AOzY\n", "saNOg+vIkSNhU6dO7ZacnFy5bNmy4ttvv/3khAkTSrdt2xb7l7/8Jbm+LN9//30brVZbZ2F0opZi\n", "84mIXAVK80mk2il3q0x5FtVOmyLPGWWtBGARgOsAHAcwyqCYj4hNRURELdCadZ8ohCxatCgxLCzM\n", "PmPGjGMNHXPxxRcrY8aMOfbFF1/EzZgxI7W6+vxBQsuWLYu/8sore5aUlIQDwBNPPHE4Nja2Ztq0\n", "aRnvvvvueQ2ompoaPProo51XrFjRqX///mdvv/32kwBQVVWFESNGdM/MzOx5+vTp836HX79+fTsA\n", "6NatWyUA9OrVq7JTp05VX375ZYx71kmTJqUfO3YsfPny5b+0a9fO5sx3ID09veK5555LNplM5z1n\n", "165dcmlpacRll13GL9bIY1xwnIhchXTzSZ+T0Q7Ajc7Nf4vMQkFhNoDpABQANxgU80+C8xARUcuw\n", "+UQNqqqqgtFoTLz66qvrXWjc1YoVKw6MGjUqYunSpZ3Xr18fP2zYsNNxcXE1X3/9ddsvv/wy9sIL\n", "LyyXJMkOAD169Khas2bNXoPB0H3s2LG9Lr/88lN9+/Ytr6io0Hz22Wexe/fuje7Tp0/ZunXrfq59\n", "/YiICPTt27d80aJFyT179rxo5MiRJ9u0aWPbtm1bzDfffNO2T58+ZZMmTfptlNTAgQPPbty4sb3V\n", "ag1LSkqqAYCnnnqqY2FhYfu7777bOmrUqN+aSTExMfbXXnvNkpmZqZ0yZUq3b7/99oeOHTvWAMC6\n", "devaAcDw4cPZfCKPceQTkQckScoVncHL3C+69okIIdB4OO5U9okpz7JPcJZGqbD2gopR1k4C8Hc4\n", "porcalDMnwuO5FesPxKFtUdets9tu9HmE+tPnSRJgiTVXYZszZo17UtLSyPuvvvuJhcaj4uLs23Z\n", "smXP888/vy81NbXyvffe6/DKK68klZaWhv/lL385tHPnTnPnzp1/W7B71KhRZ3ft2rVr+vTpRw4e\n", "PCi/+uqrndauXZsQGxtb89RTTx3YuXOnOS0t7beGV3Fxcco///nPwytWrPg5IyOj4p133unw2muv\n", "dTx37pwmOzv70JYtW36KiPh9zfAJEyYcr6yslJYsWZIIAEVFRVHz5s3r0qNHj/Lnn3/+kHv+oUOH\n", "ls+ePfuQ1WqNnDhxYnrt/hUrVnRMTk6uHD16NJtP5DGOfCLyzFwAuaJDeFFIj3wCcKfz5wqRIZpJ\n", "bbUXNIyydgSAV5ybDxgU839E5hGE9UeisPbIm1o68on1p0L333//sfvvv7/OtLqbb775VERExN6G\n", "Fhp3FxYW1uBr1SclJaV6yZIlhwDUaQa5s1qtyWlpaYcnT558cvLkySebOt5gMJx86KGHqlasWNFx\n", "zpw5Vp1OV1FeXr6zsefMmzfPOm/ePGvt9nvvvRf7888/Rz344IOHm/P3IWoKRz4ReWae6ABeFrLN\n", "J31ORh8AgwGcAbBWcJzmUFvtBQWjrL0YwFsAIgA8a1DMzwuOJArrj0Rh7ZE3tbT5xPoLIVFRUfYJ\n", "EyacEp0DAJKSkkpacnx4eDgmTZpUWlxcLD///POJrTnn3LlzU2RZtt13332lrXk+kTs2n4g8YLfb\n", "c0Vn8BZdfmEYgK5uu0Om+QRgqvOn0ZRnOSc0STOoqfaChVHWdgHwXwBxAAoAZItNJA7rj0Rh7ZGX\n", "uV/npDd2MOuPRElLS2vx6KPc3NwjiYmJVQsWLEgpLy+vO6+wEatWrWq/c+fOmJkzZx5JT0+vaum5\n", "ierD5hMR1UrG+VNxjxdlZ4bE/G59TkYkgMnOzZdFZqHAZJS18QA+AJAKYAuA2w2K2SY2FREReegQ\n", "ANf38k66/MJoUWGIvCkuLs6Wm5t7cMyYMccjIiJadAfnjh07Vg8aNOjME088wbv4ktdwzSciqhXI\n", "U+5a9G1NK1wPIBHA9wCKfHwuCjJGWRsNYD2AvgDMAG40KOYKsamIiIKarz/Xm6UoO7NKl194CECa\n", "y+6uAHj3UlKFGTNmHAdwvKXPGz169NnRo0fv9kEkCmEc+UREtQKp+dSib2e8oHbK3cumPIu/z00B\n", "zChrwwGsBjAUwEEAeoNibvFFHBERNUrkZ29L130iIqJWYPOJiGoFUvPJb/Q5GV0A6AFUAvi34DgU\n", "QIyyVgLwIoAbAJyAo/FULDYVERF5GZtPRER+wOYTkQckScoVncGLQrL5BGAKHO+F60x5lqC5m4fK\n", "ai9QzQMwDUAFgOsMivkHwXkCBuuPRGHtkQ80u/nE+iNRiouLU0RnIPIUm09EnpkrOoAXuV9s7RMR\n", "wp/0ORkauEy5E5mlFdRUewHHKGtnAHgcQA2ALINi/kJwpEDD+iNRWHvkbfvcthsb+cT6IyGsVmuy\n", "6AxEnmLzicgz80QH8KJ0t+1QGPl0FRx/7wMANoqN0mJqqr2AYpS1NwNY5NycblDM60XmCVCsPxKF\n", "tUfe5n69k97Isaw/EiIpKalEdAYiT7H5ROQBu92eKzqDN+jyCyWE5rS72lFPr5ryLLZGjwwwaqm9\n", "QGOUtcMBvA7HnZgeMyjmYBsR5xesPxKFtUc+0Oxpd6w/EiUtLe2w6AxEnmLziYgAIBFAtMv2ObTi\n", "tqzBRJ+TEQ9gHBx32HlVcBwKAEZZ2w/AOwAi4Rj59HexiYiIyA8OuG2n6vILI4QkISJSMTafiAio\n", "Z9RTUXamyNse+8OtAGQAH5nyLKEwyosaYZS13QB8ACAOwJsAZhkUs9r/P0BEFPKKsjPLARx12aUB\n", "kCooDhGRarH5RERA4E+5k7z5YvqcDAnAdOcmp1WFOKOs7QjABKAzgI8B3GZQzDViUxERqZpXP9e9\n", "oNlT74iIqHXYfCIiIPCaT74ecTIYwEVwfNO5zsfnogBmlLVxAP4LoCeArwGMNShmRWwqIqKQI3qk\n", "KZtPREQ+xuYTkQckScoVncFLAq355Gv3OH++bMqzVApN0koqqj1hjLI2Co7m40AAFgDXGhTzKbGp\n", "ggPrj0Rh7ZGPNKv5xPojUYqLi1NEZyDyFJtPRJ6ZKzqAl6S7be8TkMEv9DkZCQCy4PiWdZngOJ5Q\n", "S+0JYZS14QBWA7gKQAmAawyKmbcxbj7WH4nC2iNf2Oe2nd7Acaw/EsJqtSaLzkDkKTafiDwzT3QA\n", "LwmlkU+T4Vho3GTKs/wiOowH1FJ7fmeUtRo4Go9jAJwEoDcoZovYVEGH9UeisPbIF5o77Y71R0Ik\n", "JSXxCzIKeuGiA2RlZYUB2AHgYgBjCwoK3hEciajZ7HZ7rugMXhISzSfnQuO1U+6WisziKRXVnl8Z\n", "Za0EYCGAKQDK4Jhq953QUEGI9UeisPbIR5rVfGL9kShpaWmHRWcg8lQgjHyaAccdhuwQv9ggUcjR\n", "5Rd2BNDeZZcC4IigOL42HEAvAIcAvC82CgnyKIAHAFQBGGdQzP8TnIeIiMRzHwndTZdfGCkkCRGR\n", "SgltPmVlZXWCY/hqDgLvlqtEoaK32/ZPRdmZNiFJfK921NNyU56lWmgS8jujrL0XwBNwfNExyaCY\n", "TYIjERFRACjKzjwDwHVkSRiA7oLiEBGpkuiRT08D2ASgUHAOolCmdds2C0nhY/qcjCQAYwHYACwX\n", "HIf8zChrbwGw2Ll5j0ExF4jMQ0REAcf9+sf9+ojIr9atWxc7fPjwHjqd7sJu3br1HT16dMbGjRvb\n", "+juH1WoN69mzZ999+/ZF+PvcpC7Cmk9ZWVmD4bjj1MPgqCcikdxHPv0oJEXjvPEecQeACADvmfIs\n", "B73wehQkjLJ2FIDX4KijRw2K+SXBkYiIQl0gXvu7X/+4Xx8R+c2SJUs6LFq0qNO7775rKSoq+umr\n", "r74yA8CoUaN6P/nkk538keHUqVOaF198scMll1zSx2KxRFVVVQXi/28piAhpPmVlZWng+AZ6YUFB\n", "gSoXNqbQIElSrugMXhCII5+8uv6bPidDA+Bu52ZQLzReSyW153NGWTsUwFtw3GDjGQBPiU2kDqw/\n", "EoW1p1qBsO5rkyOfWH/kDwcOHAhfuHBh8ltvvfVLXFycDQDOnj3b+c033/wlPj6+au7cuWmbN29u\n", "48sMo0ePzrj66qt77tixo010dLRal+MgPxM18ukeAAkA8gSdn8hb5ooO4AXBMPLJU9cA6AZgH4AP\n", "xUbxGjXUnk8ZZe3FAN4DEA3gFQDZBsUcCL/gqAHrj0Rh7ZGvNGfkE+uPfG7p0qWJY8eOPV7beAIA\n", "q9WaHBMTY7/uuutO2Gw2PP/88z4d/bRhwwZLUVHRT8uXLz+YmJhYbbfz8ok85/fmU1ZWViKAvwF4\n", "pKCgoMLf5yfysnmiA3hCl1/YBuffTtgOYLegOL40w/lzmSnPUiM0ifcEde35mlHW9oKj0dgewNsA\n", "prPx5FWsPxKFtUe+4j7yqbcuv9B9mhHrj3yuqKio7QsvvJD8yCOPJNfuS0pKKgGA3r17VwDAjz/+\n", "GC0qH1FriRj5lAfg+4KCgjUCzk3kVXa7PVd0Bg/1wvnrLuwrys4sFxXGF/Q5GekArgdQCRUtNK6C\n", "2vMZo6y666BXAAAgAElEQVS9AMBGAElw3NRiokEx8+6GXsT6I1FYe+RDJQDOuGzHAEh1PYD1R/5Q\n", "U1MjVVdXS+vWrYuv3ZeWlnYYAKqrq6XaY0TlI2otvzafsrKyesOx6O9TWVlZnWv/A9DReUi8c1+U\n", "P3MRhTD3IeWBsN6Tt82Ao8FWYMqzHBUdhnzLKGuT4Wg4pQH4HMAYg2LmKFsiImpUUXamHfWMfhKR\n", "hfyjpKQk/Morr+yp1Wr7TJs2rQsAHD9+XDNt2rQuQ4YM6anVavtcdtllvXbt2iX7M9fs2bNLLr74\n", "4nMPPfTQEffHvv766zYA0K9fv3NNvc60adO6JCYm9jOZTDG+yEnUUv4e+dTZec73ARx2+W+r8/FX\n", "ndtZLX1hSZLsDS0CKElSLh/n43y83sfdF9Oss96T6PwAsG/tMy+15vn6nIw2NVW2+wHg23eO1tuA\n", "EP334+Pee9woaxMBfASgO4CvAPxpYuWP2YGSj4/zcT7Ox/l48wnKd9510IF1L3wUqP9+tY+fOXOm\n", "fX2PFxcXp2zfvn1AcXFxyl/vNQ5Qw38N/f2a+vs39PiMGTP65eTkKKtWrbK88sorSU8++WSnCRMm\n", "dJs6deqxNWvWnFu1alX0yZMnoydPnpzemtdv7eMjR448t379+tMDBgzo5vp4aWlp2IYNG+I1Gg1u\n", "vfVWNPX6q1evTjp+/Hj4mjVr4ut73Ff5+XjgP37mzJn2vnz/bojkz8XDsrKy4gEMQt07WnQGsAKO\n", "edT/g2Na3uHmvOamTZvsADBixAgOPSRqIV1+4Rqc3+y9qyg7U/jUNF1+4TIA01x23V2Unbmspa+j\n", "z8mYCsdUuyJTnmWQt/JR4DHK2nYACgFcCuAHAMMMirlUbCoiIqqPLr8wB8DfXXY9VZSdmSMqTy1d\n", "fuFsnH9DpCVF2ZkzReVpji1btuy74oorGv28c2/cBKsnXzTs8NZrlZeXS6NHj+7+ySef7P3www/b\n", "jho1qnd8fHz1zp07d3Xt2vW3qfrXX399t48++ii+oqLiq4Ze6x//+EeC0WhMaE0OjUaDV199dV/v\n", "3r0rmzr24YcfTn722WdTpkyZcvSVV14pbur4+fPnd3rnnXfily5dul+n07V6FPigQYMu3L59e8xP\n", "P/30Xc+ePZvMSYFvy5YtiVdccUV6c471Zr8l3NMXaImCgoITAEzu+7OystKdf9xZUFCgljtREQWD\n", "Jkc+BSt9ToYE4D7n5gsis5BvGWVtWzhG1F4K4GcAV7PxREREreB+HeR+nRSUvNm0UYvNmze3HTZs\n", "2BkA2Lp1a1sAyM3NPejaeAIAq9Ua2a5du0bXjZw1a9axWbNmHfNdWmDHjh1RL7zwQnJmZubJZcuW\n", "Ndl4AoA5c+YcnTNnDpecoIAhYsFxItXw9lBEf9LlF4bBseC4q0Bd86k1nfahAC4B8CuAAu/GES+Y\n", "a8+bjLI2Co672Q0FcBDACINiLhGbSv1YfyQKa081AnXGQqNrPrH+1EOv15+dN2+eFQA2b94cGx4e\n", "bp8yZcoJ12PKysqk7777rk3//v3PiknpcOrUKY3BYLgwMzPz5IYNG34OCwsTGYeo1QKp+cRbYFMw\n", "mis6gAfSAbguoFhalJ3p029tWsAb7we1o55eMuVZFC+8XqAJ5trzCqOsjQCwBsA1AKxwNJ72i00V\n", "MkK+/kgY1p46BcrvARYArqNcknX5he1ctll/KmOz2VBUVBTbt2/fstjYWJvrY+vWrYtTFEUzevTo\n", "U6LyVVdXY8yYMRm9e/cOf//99y0RERGiohB5zK/T7hpSUFCwDwBbuBSM5okO4AHV3ulOn5ORAuAm\n", "ADUAlgqO4yvBXHseM8raMAArAdwA4ASAawyKebfYVCElpOuPhGLtkc8UZWdW6fIL9+D86Xa98fvN\n", "kVh/KvPll19Gnz59Omzo0KFn3B9766234iMiIuy33nrrSRHZAODOO+/smpycXLVgwYISjeb3cSPb\n", "tm2LHjRoULmoXEStERDNJ6JgZbfbc0Vn8IBq13sCMB2O97e1pjzLQdFhfCHIa88jRlkrwdFUNAA4\n", "C2CUQTF/JzZVaAnl+iOxWHvkBz/i/GskLZzNJ9af+mzcuDEWADIzM89rPp09e1YymUzthw8ffiox\n", "MbGmrKxMmjBhQvr69et/cX+N5557LnH16tUdWnN+jUaDl19+eV+fPn3qLOT9t7/9rdO5c+c0//nP\n", "f/a57rfZbMjJyUnZtGnTz605J5EobD4RhS5VjnzS52REwtF8AoBFIrOQ9zkbT8/CcTfEcgB/Mijm\n", "bWJTERGRipgBjHXZdr9eIhX59NNPY8PDw+3XXHPNees6ffjhh7Hnzp0Lmzhx4jEAeOWVVzro9frT\n", "9b3GAw88UPrAAw949UYnb7zxRrutW7fGrF279peqqqrzHvv444/bdu7cuaqBp/5m3rx5ndavXx//\n", "0ksv7b/00ktbfbc7AJCkQF2mjYIJm09Eocv9YkotI59uBpAE4DsAmwVnIS9yNp6eAjALQBWAcQbF\n", "zP+NiYjIm9yvh9h8Uqmamhps37693vWeapstF110UcXevXsj3nzzzfiPP/54rz9yffHFF9HTpk3L\n", "qKio0LRp0ya+vmPmz5/f5B3vnn766dSKigrN4sWLO7788svNukOeuwMHDoRbrdYIu92Ozz//vE33\n", "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\n", "jRu3HOBvf/tbv8rKytVbOsdVV1217KqrrlqWrpgCgcC3v/jFL1ree++98tRjb731VjnAmWeeud3r\n", "3XzzzQOfe+65vn/5y1++OOCAAwqyh1BXZRj5+U+oZ/sPEREXnAQMS7pfj1McSavKqorjgOuAFmBc\n", "bU1dVqcVb0NWPoCFvL6SkNf3e+AZnMLTv4H9VXgSERHJqq5UePkLzueuViOBI12KpUtraWnhrbfe\n", "2mK/p9Zf7r/73e+u/+STT0r++c9/9r3kkkvStqPdtvTr1y92+eWXL3n++ef7LVmypKh1fP369cZz\n", "zz3X1zTNNRdccMF2e8Deeuutw955550e99577w6djWnNmjWea6+9dsg555wz/JBDDtn9hz/8YcW8\n", "efO22nfqlFNOGTF9+vTunb1uprX3dbntyy+/LF66dGlJPB7n1VdfLY/F8qtFr4pPIrnpkpT7fw8H\n", "/WltdlhZVTEQmJS4W11bU/daOs+f6xLL7F4Crsb5EBgEfhKIRrLywUJERES6nnDQvxDnS69kqZ/7\n", "JAvWrVvnKSsri5133nnfpB47+eSTV59++unfjBs3ruJnP/vZzvfdd98Cjyd7vzr/5je/WXLCCSes\n", "8Pv9uz/wwAN9H3nkkT7HHHPMbiNGjIhOmzbtk7acY8yYMct69+7dPHr06E5vVnTdddcNufTSS5c9\n", "9NBDC15//fX53bt3jx199NF7Ll68eLOVVE899VSvp59+un9zc3POT89pz+ty04knnrhz//799x0x\n", "YsS+Cxcu9BqGwbnnnrtLjx499h82bNjeX3zxRcn2z+K+nPpDFREwLdsH+FOG703nNSqrKjw4u7kN\n", "BmYBNek8f64LeX1jgAeA3sBCnGV2Xar4JiIiIq65FxiddH+0adlDwkH/YrcC6op69eoVW7p06dyt\n", "HX/88ce/zGY8qR577LEvX3vttW6zZs3qEYvFjN/97ncLjzrqqDb3enrkkUcW4LST6JT6+nrj4Ycf\n", "HlheXh77/e9/vxjgpptuWrz//vv3v//++/tPnDhxaetj16xZ47Ftu2dnr5kN7XldbttSr7F8pJlP\n", "Ip1gGEZ1Bk6b+u3XK+Ggf6tvjB10OXA8sAI4s7amLiM7ZuSakNfXPeT1/RWnsXpvnN3s9s/HwlOG\n", "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\n", "l7GPAH/JzHs3OzcJmMZ/CwHSRPs1ZUfPzX/fTQEuAhYAvwTW9zeWuiAiXgPstnlfxYh4NaUfz/VV\n", "gqkLNlC+X0czDXiJMilDasvBwBuBH0zUBQeu+NS4ALgqIvbLzDW9wYh4K2Xq/9erJZOkFkTEDGAl\n", "pbfEp8foQSG1YVvgMuD+psHpyDX/R1N2ob2uSjINvcz8J/DzzccjYmrzx3sz86a+hlKX3ApsHxHT\n", "M/OZEeNfozyULa8TSx1wJTAnIhZm5h97gxHxOkrT8dWZaY9jtWkuZVLPuom64EAWnzLz6ohYCayM\n", "iDMob8WmAScCdwNLa+aTpBbcQNlI4RxgVsTLV5i4447akJlPRcQc4FLg5qbZ6TOU2VBfAlZk5tqa\n", "GSWpJd8FrgZuj4jFlN6zhwJHAqdk5j01w2moLQQOBO6MiDOB+4HdgeMpL4XmVsymIRcRbwc+QCl0\n", "TphB7PnUczhwFvBFymyAE4CfAAc4I0B9tomXLweQJtoOlGUmq4C1o3zWjP1PpfFpdhn7EKXn4rmU\n", "nmPvA+Zlpr3HVIvfvWpVZq4C9gUeo7z8uQLYEzgkMxdWjKYhl5lPA7OAZZQXPdcAp1Bm4+2dmQ9X\n", "jKfhNwfYCKyYyItO2rTJ721JkiRJkiS1Y5BnPkmSJEmSJOn/nMUnSZIkSZIktcbikyRJkiRJklpj\n", "8UmSJEmSJEmtsfgkSZIkSZKk1lh8kiRJkiRJUmssPkmSJEmSJKk1Fp8kSZIkSZLUGotPkiRJkiRJ\n", "ao3FJ0mSJEmSJLXG4pMkSZIkSZJaY/FJkiRJkiRJrbH4JEmSJEmSpNZYfJIkSZIkSVJrLD5JkiRJ\n", "kiSpNRafJEmSJEmS1BqLT5IkSZIkSWqNxSdJkiRJkiS1xuKTJEmSJEmSWvMfdhLgUx9xCjkAAAAA\n", "SUVORK5CYII=\n" ], "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 376, "width": 591 } }, "output_type": "display_data" } ], "source": [ "# For an expression made from elementary functions, we must first make it into\n", "# a callable function, the simplest way is to use the Python lambda construct.\n", "plot_taylor_approximations(lambda x: 1/cos(x), 0, [2,4,6], (0, 2*pi), (-5,5))" ] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/IPython Kernel/Terminal Usage.ipynb000066400000000000000000000135141477474304100235740ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# A few things that work best/only at the IPython terminal or Qt console clients" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Running code with `%run`" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing script.py\n" ] } ], "source": [ "%%writefile script.py\n", "x = 10\n", "y = 20\n", "z = x+y\n", "print('z is: %s' % z)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "z is: 30\n" ] } ], "source": [ "%run script" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Event loop and GUI integration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `%gui` magic enables the integration of GUI event loops with the interactive execution loop, allowing you to run GUI code without blocking IPython.\n", "\n", "Consider for example the execution of Qt-based code. Once we enable the Qt gui support:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can define a simple Qt application class (simplified version from [this Qt tutorial](http://zetcode.com/tutorials/pyqt4/firstprograms)):" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import sys\n", "from PyQt4 import QtGui, QtCore\n", "\n", "class SimpleWindow(QtGui.QWidget):\n", " def __init__(self, parent=None):\n", " QtGui.QWidget.__init__(self, parent)\n", "\n", " self.setGeometry(300, 300, 200, 80)\n", " self.setWindowTitle('Hello World')\n", "\n", " quit = QtGui.QPushButton('Close', self)\n", " quit.setGeometry(10, 10, 60, 35)\n", "\n", " self.connect(quit, QtCore.SIGNAL('clicked()'),\n", " self, QtCore.SLOT('close()'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now we can instantiate it:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "app = QtCore.QCoreApplication.instance()\n", "if app is None:\n", " app = QtGui.QApplication([])\n", "\n", "sw = SimpleWindow()\n", "sw.show()\n", "\n", "from IPython.lib.guisupport import start_event_loop_qt4\n", "start_event_loop_qt4(app)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But IPython still remains responsive:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "10+2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `%gui` magic can be similarly used to control Wx, Tk, glut and pyglet applications, [as can be seen in our examples](https://github.com/ipython/ipython/tree/main/examples/lib)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Embedding IPython in a terminal application" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing simple-embed.py\n" ] } ], "source": [ "%%writefile simple-embed.py\n", "# This shows how to use the new top-level embed function. It is a simpler\n", "# API that manages the creation of the embedded shell.\n", "\n", "from IPython import embed\n", "\n", "a = 10\n", "b = 20\n", "\n", "embed(header='First time', banner1='')\n", "\n", "c = 30\n", "d = 40\n", "\n", "embed(header='The second time')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example in kernel-embedding shows how to embed a full kernel into an application and how to connect to this kernel from an external process." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Logging terminal sessions and transitioning to a notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `%logstart` magic lets you log a terminal session with various degrees of control, and the `%notebook` one will convert an interactive console session into a notebook with all input cells already created for you (but no output)." ] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/IPython Kernel/Third Party Rich Output.ipynb000066400000000000000000007762751477474304100253010ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Third Party Libraries With Rich Output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A number of third party libraries defined their own custom display logic. This gives their objects rich output by default when used in the Notebook." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from IPython.display import display" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Pandas](http://pandas.pydata.org/) is a data analysis library for Python. Its `DataFrame` objects have an HTML table representation in the Notebook." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is a small amount of stock data for APPL:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing data.csv\n" ] } ], "source": [ "%%writefile data.csv\n", "Date,Open,High,Low,Close,Volume,Adj Close\n", "2012-06-01,569.16,590.00,548.50,584.00,14077000,581.50\n", "2012-05-01,584.90,596.76,522.18,577.73,18827900,575.26\n", "2012-04-02,601.83,644.00,555.00,583.98,28759100,581.48\n", "2012-03-01,548.17,621.45,516.22,599.55,26486000,596.99\n", "2012-02-01,458.41,547.61,453.98,542.44,22001000,540.12\n", "2012-01-03,409.40,458.24,409.00,456.48,12949100,454.53" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Read this as into a `DataFrame`:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df = pandas.read_csv('data.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And view the HTML representation:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateOpenHighLowCloseVolumeAdj Close
0 2012-06-01 569.16 590.00 548.50 584.00 14077000 581.50
1 2012-05-01 584.90 596.76 522.18 577.73 18827900 575.26
2 2012-04-02 601.83 644.00 555.00 583.98 28759100 581.48
3 2012-03-01 548.17 621.45 516.22 599.55 26486000 596.99
4 2012-02-01 458.41 547.61 453.98 542.44 22001000 540.12
5 2012-01-03 409.40 458.24 409.00 456.48 12949100 454.53
\n", "
" ], "text/plain": [ " Date Open High Low Close Volume Adj Close\n", "0 2012-06-01 569.16 590.00 548.50 584.00 14077000 581.50\n", "1 2012-05-01 584.90 596.76 522.18 577.73 18827900 575.26\n", "2 2012-04-02 601.83 644.00 555.00 583.98 28759100 581.48\n", "3 2012-03-01 548.17 621.45 516.22 599.55 26486000 596.99\n", "4 2012-02-01 458.41 547.61 453.98 542.44 22001000 540.12\n", "5 2012-01-03 409.40 458.24 409.00 456.48 12949100 454.53" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SymPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[SymPy](http://sympy.org/) is a symbolic computing library for Python. Its equation objects have LaTeX representations that are rendered in the Notebook." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sympy.interactive.printing import init_printing\n", "init_printing(use_latex='mathjax')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import division\n", "import sympy as sym\n", "from sympy import *\n", "x, y, z = symbols(\"x y z\")\n", "k, m, n = symbols(\"k m n\", integer=True)\n", "f, g, h = map(Function, 'fgh')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\frac{3 \\pi}{2} + \\frac{e^{i x}}{x^{2} + y}$$" ], "text/plain": [ " ⅈ⋅x \n", "3⋅π ℯ \n", "─── + ──────\n", " 2 2 \n", " x + y" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Rational(3,2)*pi + exp(I*x) / (x**2 + y)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\frac{1}{x} \\left(x \\sin{\\left (x \\right )} - 1\\right) + \\frac{1}{x}$$" ], "text/plain": [ "x⋅sin(x) - 1 1\n", "──────────── + ─\n", " x x" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 1/x + (x*sin(x) - 1)/x\n", "a" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$1 + \\frac{x^{2}}{2} + \\frac{5 x^{4}}{24} + \\mathcal{O}\\left(x^{6}\\right)$$" ], "text/plain": [ " 2 4 \n", " x 5⋅x ⎛ 6⎞\n", "1 + ── + ──── + O⎝x ⎠\n", " 2 24 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(1/cos(x)).series(x, 0, 6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vincent" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Vincent](https://vincent.readthedocs.io/en/latest/) is a visualization library that uses the [Vega](http://trifacta.github.io/vega/) visualization grammar to build [d3.js](http://d3js.org/) based visualizations in the Notebook and on http://nbviewer.ipython.org. `Visualization` objects in Vincetn have rich HTML and JavaSrcript representations." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import vincent\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas.io.data as web\n", "import datetime\n", "all_data = {}\n", "date_start = datetime.datetime(2010, 1, 1)\n", "date_end = datetime.datetime(2014, 1, 1)\n", "for ticker in ['AAPL', 'IBM', 'YHOO', 'MSFT']:\n", " all_data[ticker] = web.DataReader(ticker, 'yahoo', date_start, date_end)\n", "price = pd.DataFrame({tic: data['Adj Close']\n", " for tic, data in all_data.items()})" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "vincent.initialize_notebook()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "line = vincent.Line(price[['AAPL', 'IBM', 'YHOO', 'MSFT']], width=600, height=300)\n", "line.axis_titles(x='Date', y='Price')\n", "line.legend(title='Ticker')\n", "display(line)" ] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/IPython Kernel/Trapezoid Rule.ipynb000066400000000000000000002233211477474304100236240ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Basic Numerical Integration: the Trapezoid Rule" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A simple illustration of the trapezoid rule for definite integration:\n", "\n", "$$\n", "\\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right).\n", "$$\n", "
\n", "First, we define a simple function and sample it between 0 and 10 at 200 points" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def f(x):\n", " return (x-3)*(x-5)*(x-7)+85\n", "\n", "x = np.linspace(0, 10, 200)\n", "y = f(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Choose a region to integrate over and take only a few points in that region" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "a, b = 1, 8 # the left and right boundaries\n", "N = 5 # the number of points\n", "xint = np.linspace(a, b, N)\n", "yint = f(xint)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot both the function and the area below it in the trapezoid approximation" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "gBiqrKzc7ZK+lJSUxuLi4k228kRTZWXlrrsQDhw4cK+XtIXr169fuSQ1NDQM3Ne+If/+979nNjc3\n", "50tSU1NTYUNDQ5oUuLRw9erVJ4b2y8jIaOjo9c8999x0v9+fPHPmzA/395yVlZUDJSk1NbVhzJgx\n", "Hc6KcrlcK0KXKe7YsSO/o33q6urSn3322e+EFlfPycnZtTZXU1NTSmVl5RGTJk36zOZ7BQAA8UVz\n", "Cla5PN4CST+MKN/jK3FvtJEHABBbW7du3a051bt379WWokRd+ELvY8eO3e+ZU2PGjFkpSS0tLbkV\n", "FRW99+c1O3fu7BN6XlRU9F7fvn2bJOnZZ5890+/3Jw0YMGCBJNXU1AyLfO2cOXOOXLFixVkzZsx4\n", "OCMjo21/c1ZVVQ2XpNzc3FWd7ZOZmdk2fvz41ySpurr68MbGxt1m6VdVVWX/9a9//X5WVlZN7969\n", "y6TA4vGh7e+8886U9PT02qOOOmqNzfcKAADii8v6YNsPJfUJG2+V9HtLWQAAMVZXV7fbZX2FhYVl\n", "trJEW319/VBJysjIqNnbXeoiTZo0af3LL7+8o62tLXvp0qXDBw0a9OW+XjN27NiPt2zZMrmgoGDh\n", "6aef/sb69etz33vvvePLy8tP+/rXv35PYWHh9r///e/DqqqqjvznP/95ytSpUz+rqqrK/eSTT06s\n", "qKg4Zvr06fdPmTJlvxtoklRbWztMkgYOHLhsb/tdeOGF3qqqqtGVlZVHP/bYY1eeddZZL6SkpLR/\n", "9tlnhy9evPic/v37L7z66quf/vDDD8d7vd6bt2/fPuqrr74aWF9fn/3pp59efNRRRz1n+70CAID4\n", "ojkFa1we72BJN0WU7/SVuLfZyAMAiK3W1takHTt2DAqvFRUVJURzasWKFf3a2toyJalv374rD+S1\n", "KSkp/gEDBny+cePGE8rKyg477bTT9tmcmjFjxqfp6enNpaWl0x5//PGfJycntxYUFHx1+eWX3zli\n", "xIgaSbrmmmt+/+qrr565fPnyaYsWLbo4PT19+4ABA7645pprbh80aFDdgWSsqKjo3dDQMFSS/9hj\n", "j/10b/smJyfr+uuvf+ill15aunLlypNmz559e3Jycktubu7KU0899W/HH3/8Ckk66aSTliYlJd27\n", "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\n", "AAAAAACw5v8DPWODrRZIv60AAAAASUVORK5CYII=\n" ], "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 381, "width": 595 } }, "output_type": "display_data" } ], "source": [ "plt.plot(x, y, lw=2)\n", "plt.axis([0, 9, 0, 140])\n", "plt.fill_between(xint, 0, yint, facecolor='gray', alpha=0.4)\n", "plt.text(0.5 * (a + b), 30,r\"$\\int_a^b f(x)dx$\", horizontalalignment='center', fontsize=20);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the integral both at high accuracy and with the trapezoid approximation" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The integral is: 565.2499999999999 +/- 6.275535646693696e-12\n", "The trapezoid approximation with 5 points is: 559.890625\n" ] } ], "source": [ "from __future__ import print_function\n", "from scipy.integrate import quad\n", "integral, error = quad(f, a, b)\n", "integral_trapezoid = sum( (xint[1:] - xint[:-1]) * (yint[1:] + yint[:-1]) ) / 2\n", "print(\"The integral is:\", integral, \"+/-\", error)\n", "print(\"The trapezoid approximation with\", len(xint), \"points is:\", integral_trapezoid)" ] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/IPython Kernel/Updating Displays.ipynb000066400000000000000000000154511477474304100243220ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Updatable Displays\n", "\n", "Note: This feature requires notebook >= 5.0 or JupyterLab, and \n", "\n", "\n", "IPython 6 implements a new API as part of the Jupyter Protocol version 5.1 for easily updating displays.\n", "\n", "When you display something, you can now pass a `display_id` argument to attach an id to that output.\n", "\n", "Any future display with the same ID will also update other displays that had the same ID.\n", "\n", "`display` with a `display_id` will return a `DisplayHandle`\n", "object, which gives you easy access to update the output:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from IPython.display import display, update_display" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'z'" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "handle = display('x', display_id='update-me')\n", "handle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we call `handle.display('y')`, we get a new display of 'y',\n", "but in addition to that, we updated the previous display." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'z'" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "handle.display('y')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also *just* update the existing displays,\n", "without creating a new display:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "handle.update('z')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You don't have to generate display_ids yourself,\n", "if you specify `display_id=True`, then a unique ID will be assigned:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'hello'" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "handle = display(\"hello\", display_id=True)\n", "handle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calling `handle.display(obj)` is the same as calling `display(obj, handle.display_id)`,\n", "so you don't need to use the handle objects if you don't want to:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'z'" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display('x', display_id='here');" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'z'" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display('y', display_id='here');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And just like `display`, there is now `update_display`,\n", "which is what `DisplayHandle.update` calls:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "update_display('z', display_id='here')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## More detailed example\n", "\n", "One of the motivating use cases for this is simple progress bars.\n", "\n", "Here is an example ProgressBar using these APIs:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[============================================================] 10/10" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import ProgressBar\n", "\n", "bar = ProgressBar(10)\n", "bar.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And the ProgressBar has `.display` and `.update` methods:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[============================================================] 10/10" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import time\n", "\n", "bar.display()\n", "\n", "for i in range(11):\n", " bar.progress = i\n", " bar.update()\n", " time.sleep(0.25)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ProgressBar also has an update built into iteration:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[============================================================] 10/10" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for i in ProgressBar(10):\n", " time.sleep(0.25)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We would encourage any updatable-display objects that track their own display_ids to follow-suit with `.display()` and `.update()` or `.update_display()` methods." ] } ], "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.2" } }, "nbformat": 4, "nbformat_minor": 1 } ipython-8.35.0/examples/IPython Kernel/Working With External Code.ipynb000066400000000000000000001360551477474304100257140ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Working With External Code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The IPython Kernel makes it easy to incorporate external code from sources such as the internet or copy/paste. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pasting code into cells" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can copy and paste code from other sources directly into cells. Pasting code with `>>>` prompts works as expected:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Be careful not to fall off!\n" ] } ], "source": [ ">>> the_world_is_flat = 1\n", ">>> if the_world_is_flat:\n", "... print(\"Be careful not to fall off!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The %load magic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `%load` magic lets you load code from URLs or local files:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%load?" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%load http://matplotlib.org/mpl_examples/showcase/integral_demo.py" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAABKkAAAMnCAYAAAD1XgGYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", "AAAWJQAAFiUBSVIk8AAAIABJREFUeJzs3Xm0pWV9J/rvc05VUQU1MhdTMY8lgwioQMRGcUIhRBHF\n", "GTCKUcAERVTiCChEMQYHxClIHGNak2jS3VlJJ52k+2a+t3t1eqVv3xhAQKAKqqj5nPPeP3aVtWtz\n", "ihrOOfvZw+ez1rv2fn/vPmd/F4tVp863nvfZpWmaAAAAAEBNI7UDAAAAAICSCgAAAIDqlFQAAAAA\n", "VKekAgAAAKA6JRUAAAAA1SmpAAAAAKhOSQUAAABAdUoqAAAAAKpTUgEAAABQnZIKAAAAgOqUVAAA\n", "AABUp6QCAAAAoDolFQAAAADVKakAAAAAqE5JBQAAAEB1SioAAAAAqlNSAQAAAFCdkgoAAACA6pRU\n", "AAAAAFSnpAIAAACguimXVKWUw0spv1lK+YNSyms6rr2jlPIfp/oeAAAAAAy26VhJdX2Sdyf5j0lu\n", "6Lj2hiSPTMN7AAAAADDAplRSlVLOTvIXTdOMJXlxkv/Vdm2vJKcl+c9TSggAAADAwJs1xa//30n+\n", "ppRycJIXJvmltmvP3fz9/3yK7wEAAADAgJtSSdU0zcNJUkq5NMnqJD9qu3xukkeapvmfU3kPAAAA\n", "AAbfdH2634uS/GnTNJvaZr+Q5C+m6fsDAAAAMMCmq6Q6LNvuR7VHkjPjVj8AAAAAdsJ0lVQ/SbJP\n", "2/mtSebGpukAAAAA7ITSNM3Uv0kpxyW5O8k/Jlmb1qbpJzVNs/eUv/lO+JM/+ZMmSc4///zSjfcD\n", "AAAAYHpN9dP9kiRN0/yvtDZKTymlJHkwyQ+n43sDAAAAMPimfLtfKeWbpZR/ahtdnGRJklum+r0B\n", "AAAAGA7TsSfV+Un+LElKKQcluT3JmzavrgIAAACAHZqO2/3eluSMUsptSQ5MclnTNH8zDd8XAAAA\n", "gCEx5ZKqaZrvJ/n+NGQBAAAAYEhNx+1+AAAAADAlSioAAAAAqlNSAQAAAFCdkgoAAACA6pRUAAAA\n", "AFSnpAIAAACgOiUVAAAAANUpqQAAAACoTkkFAAAAQHVKKgAAAACqU1IBAAAAUJ2SCgAAAIDqlFQA\n", "AAAAVKekAgAAAKA6JRUAAAAA1SmpAAAAAKhOSQUAAABAdUoqAAAAAKpTUgEAAABQnZIKAAAAgOqU\n", "VAAAAABUp6QCAAAAoDolFQAAAADVKakAAAAAqE5JBQAAAEB1SioAAAAAqlNSAQAAAPBUpZRuvp2S\n", "CgAAAIBttQqqv+jmWyqpAAAAAOj0kiRnd/MNlVQAAAAAbNVaRfX+br+tkgoAAACAducmeW6331RJ\n", "BQAAAEC7G2u8qZIKAAAAgJZSnpnkRTXeWkkFAAAAwBbvq/XGSioAAAAAklKOT/JLtd5eSQUAAABA\n", "krw3SWk7/8duvrmSCgAAAGDYlbIsyes6prd0M4KSCgAAAIBfSzKr7fxfkvxuNwMoqQAAAACGWSn7\n", "J7myY3prmma8mzGUVAAAAADD7dokc9vO70/yjW6HUFIBAAAADKtSFid5R8f0tjTNxm5HUVIBAAAA\n", "DK+rkyxsO380yd01giipAAAAAIZRKXsmua5j+uk0zdoacZRUAAAAAMPpyiT7tp2vTvK5SlmUVAAA\n", "AABDp5Q5Sa7vmN6Zpnm8RpxESQUAAAAwjC5Pckjb+fokd1TKkkRJBQAAADBcShlNckPH9O40zcM1\n", "4myhpAIAAAAYLpckObbtfCzJ7ZWy/JySCgAAAGBYlFKS3Ngx/Uaa5ic14rRTUgEAAAAMjxcnObXt\n", "vEnyiUpZtqGkAgAAABgenauovp+m+ecqSTooqQAAAACGQSnnJjmnY3pLjSiTUVIBAAAADIf3dZz/\n", "cZrm76okmYSSCgAAAGDQlXJakpd0TG+uEWV7lFQAAAAAg69zFdVfJvmLGkG2R0kFAAAAMMhKOS7J\n", "KzumN6dpmhpxtkdJBQAAADDY3puktJ3/U5IfV8qyXUoqAAAAgEFVymFJXt8xvaXXVlElSioAAACA\n", "QfarSWa1nf/vJN+rlOVpKakAAAAABlEp+ye5qmN6a5pmvEacHVFSAQAAAAyma5LMazu/P8k9lbLs\n", "kJIKAAAAYNCUsijJr3RMb0/TbKwRZ2coqQAAAAAGz9VJFradP5rk7kpZdoqSCgAAAGCQlLJnkus6\n", "pnekadbUiLOzlFQAAAAAg+UtSfZrO1+d5M5KWXaakgoAAABgUJQyJ8l7OqafS9M8XiPOrlBSAQAA\n", "AAyO1yY5tO18fZJPV8qyS5RUAAAAAIOglNEkN3RMv5ymebhGnF2lpAIAAAAYDL+Y5Li287Ekt1XK\n", "ssuUVAAAAAD9rpSS5MaO6b1pmp/UiLM7lFQAAAAA/e+CJKe1nTdJPlEpy25RUgEAAAD0v85VVL+X\n", "pvmfVZLsJiUVAAAAQD8r5Zwkv9AxvaVGlKlQUgEAAAD0t/d1nP+HNM3fVkkyBUoqAAAAgH5VyqlJ\n", "XtoxvblGlKlSUgEAAAD0r85VVH+V5M9rBJkqJRUAAABAPyrluCSv6pjenKZpasSZKiUVAAAAQH/6\n", "UJLSdv5/J/lRnShTp6QCAAAA6DelnJLkso7px/t1FVWipAIAAADoRx/tOP+nJN+rEWS6KKkAAAAA\n", "+kkpz07y8o7p+9M0EzXiTBclFQAAAEB/+XjH+V+nj/ei2kJJBQAAANAvSjk/yb/rmN7Yz3tRbaGk\n", "AgAAAOgHpZQ8dRXVf0rT/FmFNNNOSQUAAADQHy5MclbH7P01gswEJRUAAABArytlJMnHOqY/SNP8\n", "XzXizAQlFQAAAEDvuzTJyW3nTZIPVsoyI5RUAAAAAL2slFlJPtIx/Vaa5v+pEWemKKkAAAAAetsb\n", "kxzTdj6e5NcrZZkxSioAAACAXlXKHklu6ph+NU3zLzXizCQlFQAAAEDvemuSw9rON+apt/4NBCUV\n", "AAAAQC8qZa8kH+iYfj5Nc1+NODNNSQUAAADQm96ZZP+287VJbqmUZcYpqQAAAAB6TSmLk7y3Y3pH\n", "mubhGnG6QUkFAAAA0Ht+NcnitvMnktxeKUtXKKkAAAAAekkp+ye5rmN6W5pmZY043aKkAgAAAOgt\n", "NyTZq+38kSSfqZSla5RUAAAAAL2ilEOSXN0xvTlN82SNON2kpAIAAADoHR9Mskfb+f1JvlApS1cp\n", "qQAAAAB6QSlHJXlLx/QjaZr1NeJ0m5IKAAAAoDd8KMmstvP/N8nXqiSpQEkFAAAAUFspy5Nc3jG9\n", "KU2zqUacGpRUAAAAAPV9JElpO//vSb5VKUsVSioAAACAmko5I8kvdkw/mKaZqBGnFiUVAAAAQF0f\n", "6zj/myQ/qBGkJiUVAAAAQC2lPC/JBR3T96dpmhpxalJSAQAAANRQSkny8Y7pnyX5T90PU5+SCgAA\n", "AKCOFyc5u2M2lKuoEiUVAAAAQPeVMpKnrqL6UZrmr2rE6QVKKgAAAIDuuyTJaR2zD9QI0iuUVAAA\n", "AADdVMpoko92TL+bpvmHGnF6hZIKAAAAoLtel+T4tvOJJDdVytIzlFQAAAAA3VLKnCQf6pj+dprm\n", "nyuk6SlKKgAAAIDuuTLJ4W3nm5J8uE6U3qKkAgAAAOiGUvbMUzdHvytN868V0vQcJRUAAABAd1yd\n", "ZGnb+bokH6+UpecoqQAAAABmWikLk7yvY/pbaZoHa8TpRUoqAAAAgJl3XZK9285XJ/lEpSw9SUkF\n", "AAAAMJNK2SfJr3ZMfyNN81iNOL1KSQUAAAAws96bZEHb+WNJPl0pS89SUgEAAADMlFIOTfLOjumt\n", "aZpVNeL0MiUVAAAAwMz5RJK5becPJrmzUpaepqQCAAAAmAmlPDfJazqmv56mWVcjTq9TUgEAAABM\n", "t1JGktzRMf2nJF+pkKYvKKkAAAAApt/rkpzRMbsmTTNeI0w/UFIBAAAATKdS5ie5tWP6u2ma/1wj\n", "Tr9QUgEAAABMr/cmWdp2vjHJeypl6RtKKgAAAIDpUsqyJL/WMf1Umub/1IjTT5RUAAAAANPnk0nm\n", "tp0/nOTmSln6ipIKAAAAYDqUck6SSzumN6ZpVteI02+UVAAAAABTVcpIkjs6pn+f5GvdD9OflFQA\n", "AAAAU/fGJKd3zK5N00zUCNOPlFQAAAAAU1HKgjx136nvpmn+okacfqWkAgAAAJia9yU5sO18Q5L3\n", "VMrSt5RUAAAAALurlCOSvLtjenua5l8rpOlrSioAAACA3ffJJHu0nT+Y5NZKWfqakgoAAABgd5Ty\n", "vCSv7Ji+L03zZI04/U5JBQAAALCrShlNckfH9G+T3FMhzUBQUgEAAADsujclObVjdm2aZqJCloGg\n", "pAIAAADYFaUsTHJzx/RbaZq/rBFnUCipAAAAAHbN+5Ps33a+Lsl7K2UZGEoqAAAAgJ1VylFJru2Y\n", "3pam+bcacQaJkgoAAABg592WZE7b+QNJPlkpy0BRUgEAAADsjFKen+QXO6Y3pGnW1IgzaJRUAAAA\n", "ADtSymiSOzqm/y3J71RIM5CUVAAAAAA7dkWSkztm16ZpJmqEGURKKgAAAICnU8qiJB/rmN6bpvmv\n", "NeIMKiUVAAAAwNP7QJL92s7XJbmhUpaBpaQCAAAA2J5SjklyTcf0E2ma+2vEGWRKKgAAAIDtuz3J\n", "7Lbz+5LcVinLQFNSAQAAAEymlBckeUXH9L1pmrU14gw6JRUAAABAp1JmJfl0x/Svk3yrQpqhoKQC\n", "AAAAeKqrkizvmF2TpmlqhBkGSioAAACAdqUsTvLRjulvp2n+pkacYaGkAgAAANjWTUn2aTtfm+TG\n", "SlmGhpIKAAAAYItSjkvyzo7pLWmaB2rEGSZKKgAAAICtfiPJrLbzf9s8Y4YpqQAAAACSpJQXJXlZ\n", "x/Q9aZp1NeIMGyUVAAAAQCmzknyqY/pfknynQpqhpKQCAAAASN6W5MS28ybJtWmaplKeoaOkAgAA\n", "AIZbKUuTfKxj+vU0zd/ViDOslFQAAADAsLsjyaK28zVJbqyUZWgpqQAAAIDhVcqFSS7tmH4wTfNg\n", "jTjDTEkFAAAADKdSFiT5XMf0b5P8ZoU0Q09JBQAAAAyrjyY5tO18PMlb0zTjlfIMNSUVAAAAMHxK\n", "OTPJuzqmn0rT/EONOCipAAAAgGFTyuwkdyUpbdP/L8mH6wQiUVIBAAAAw+e6JKd0zN6epllTIwwt\n", "SioAAABgeJRyVJIPdUzvTdP8cYU0tFFSAQAAAMOhlJLk80nmtU1XJHl3nUC0U1IBAAAAw+LyJC/s\n", "mP1qmuZnNcKwLSUVAAAAMPhK2TfJpzumf5rk6xXSMAklFQAAADAMbk+yb9v5hiS/nKZpKuWhg5IK\n", "AAAAGGylnJ/kjR3Tj6Rp/qVGHCanpAIAAAAGVynzknyxY/rf01pZRQ9RUgEAAACD7KYkR7WdN0mu\n", "StNsrJSH7VBSAQAAAIOplJOTXN8xvTNN819rxOHpKakAAACAwVPKaJIvJRltmz6Q5P11ArEjSioA\n", "AABgEF2d5MyO2TvSNKtqhGHHlFQAAADAYCnl0CQ3d0y/n6b5QY047BwlFQAAADA4SilJ7kwyv226\n", "Ksm76gRiZympAAAAgEFySZKXd8xuSNM8UCMMO09JBQAAAAyGUhYn+WzH9K+SfLFCGnaRkgoAAAAY\n", "FLckWdp2vinJW9M0E5XysAuUVAAAAED/K+WcJG/rmH4iTfM/asRh1ympAAAAgP5Wyh5J7uqY/kuS\n", "j1dIw25SUgEAAAD97r1JTuiYvTVNs75GGHaPkgoAAADoX6Ucn+T9HdOvpGn+rEIapkBJBQAAAPSn\n", "UkbSus1vTtv0Z0murxOIqVBSAQAAAP3qLUnO7Zhdk6ZZUSMMU6OkAgAAAPpPKQcmua1j+uMk366Q\n", "hmmgpAIAAAD60R1JFredr01ydZqmqZSHKVJSAQAAAP2llJcleXXH9INpmn+tkIZpoqQCAAAA+kcp\n", "85N8rmP690l+s0IappGSCgAAAOgnH0lyWNv5RJKr0jRjlfIwTZRUAAAAQH8o5VlJrumYfjpN8/c1\n", "4jC9lFQAAABA7ytlzyT3ZNsu4ydJfr1OIKabkgoAAADoB59IcnzH7O1pmjU1wjD9lFQAAABAbyvl\n", "JUl+pWP61TTNj2vEYWYoqQAAAIDeVcp+Sb7aMf0/eereVPQ5JRUAAADQm0opSb6U5IC26USS16Vp\n", "VtcJxUxRUgEAAAC96ookF3XMPpam+esaYZhZSioAAACg95RyTJLPdEz/W5KPVUhDFyipAAAAgN5S\n", "yuwk30iyZ9t0TZLXp2k21QnFTFNSAQAAAL3m/UnO7Jhdm6b5lxph6A4lFQAAANA7SnlOkg90TH+Q\n", "5MsV0tBFSioAAACgN5SyIMk9SUbbpg8nuSpN09QJRbcoqQAAAIBecUeSozpmb07TPFIjDN2lpAIA\n", "AADqK+WSJG/pmN6ZpvlxjTh0n5IKAAAAqKuUg5J8qWP6z0neUyENlSipAAAAgHpKGUny1SR7t003\n", "Jbk8TbO2TihqUFIBAAAANb0jyQUdsw+maf6+RhjqUVIBAAAAdZRyUpJPdkz/PMntFdJQmZIKAAAA\n", "6L5S9kjyjSRz26arkrwhTTNeJxQ1KakAAACAGj6S5NSO2dVpmp/UCEN9SioAAACgu0o5L8n1HdNv\n", "Jfmd7oehVyipAAAAgO4pZUmS305S2qb3pbWKqqkTil6gpAIAAAC66c4kh7adN0nemKZZWSkPPUJJ\n", "BQAAAHRHKa9N8pqO6e1pmj+tEYfeoqQCAAAAZl4py5J8rmP6T0k+WCENPUhJBQAAAMysUkaTfD3J\n", "orbphiSXp2k21AlFr1FSAQAAADPtV5M8r2P2njTN/6gRht6kpAIAAABmTimnJflYx/Q/JPmtCmno\n", "YUoqAAAAYGaUMi/JvUlmt01XJHlzmmaiTih6lZIKAAAAmCmfSHJCx+yqNM1Pa4ShtympAAAAgOlX\n", "youTvLNj+pU0zfdrxKH3KakAAACA6VXKfkm+2jH9P0murZCGPqGkAgAAAKZPKSXJXUkO3DJqkokk\n", "r0vTrK6Wi56npAIAAACm0zuSXNw+uO/QQ7+TpvnrSnnoE0oqAAAAYHqUck6ST7ePHlm2bPx3Lr/8\n", "25US0Udm1Q4AAAAADIBSlib5btq6hon58/OnV1yxdsPExHi9YPQLK6kAAACAqSllTloF1YHt48c/\n", "85k8ceCBE3VC0W+UVAAAAMBU3Z7k7PbBk+96Vza85CWV4tCPlFQAAADA7ivldUne2T7a8LznZfX1\n", "11cKRL9SUgEAAAC7p5RTk9zVPho75JCsvPPOZHS0Uij6lZIKAAAA2HWl7J3k+0nmbRk1c+dm5d13\n", "p9l773q56FtKKgAAAGDXlDKa5N4kR7SPn7j11oydfHKdTPQ9JRUAAACwq349yYvbB2ve+Masu/TS\n", "SnEYBEoqAAAAYOeV8vIkH2wfbTz99Kz68IcrBWJQKKkAAACAnVPKMUm+0T4a33ffrLzrrmTOnEqh\n", "GBRKKgAAAGDHSpmf1kbpC7eMmtHRPH7XXZlYurReLgaGkgoAAAB4eqWUJHcnWd4+XnXTTdn47GfX\n", "ycTAUVIBAAAAO3Jtkle3D9ZdfHHWXnllpTgMIiUVAAAAsH2lnJfktvbRphNOyBO3356UUicTA0lJ\n", "BQAAAEyulEOSfDvJ6JbRxMKFWXn33Wn23LNeLgaSkgoAAAB4qlL2SPK9JPu3jx//7GczfsQRdTIx\n", "0JRUAAAAwGTuSHJW+2D1u9+dDS98YaU4DDolFQAAALCtUt6c5G3to/Xnn58n3/3uSoEYBkoqAAAA\n", "YKtSTk/y+fbR2LJlefyzn01G1AjMHP93AQAAAC2l7Jvk+0n22DJq5s7Nyi9/Oc3ixfVyMRSUVAAA\n", "AEBSymiSbyY5rH38+O23Z+zEE+tkYqgoqQAAAIAk+ViSF7QP1lxxRdZfckmlOAwbJRUAAAAMu1Iu\n", "SXJD+2jDWWdl1U03VQrEMFJSAQAAwDAr5fgkX28fjR9wQB7/4heT2bMrhWIYKakAAABgWJWyIMnv\n", "JZm/ZdTMnp2Vd92Vif33r5eLoaSkAgAAgGFUSknytSTHt49XfehD2XTGGVUiMdyUVAAAADCc3pNk\n", "m13R177qVVn7pjfVScPQU1IBAADAsGltlH5L+2jTSSfliVtvTUqpFIphp6QCAACAYVLK2UnuTfLz\n", "Nmpi8eKs/PKXk3nz6uVi6CmpAAAAYFi0Psnv95PM3TJqRkez8nOfy/hhh9XLBVFSAQAAwHAoZWmS\n", "P0qypH38xG23ZeN551WJBO2UVAAAADDoSlmQ5A+TLGsfr/61X8u6yy6rkwk6KKkAAABgkJUyO8n3\n", "kpzWPl772tfmyeuuq5MJJqGkAgAAgEFVSklyd5IL2sfrzz/fJ/nRc5RUAAAAMLg+muQN7YONp5yS\n", "x7/whWTWrEqRYHJKKgAAABhEpfxykve3j8aWLcvKe+5Js9delULB9impAAAAYNCU8ookn2sfje+9\n", "d1bce28m9t23Uih4ekoqAAAAGCSlPDvJt9L2O38zd25W/vZvZ/zII+vlgh1QUgEAAMCgKOWYJL+f\n", "ZN6WUTMykpVf+EI2PfOZ9XLBTlBSAQAAwCAo5YAkf5Rkm/v5Vt1ySzZccMHkXwM9REkFAAAA/a6U\n", "+Un+IMk29/OtvuaarH396+tkgl2kpAIAAIB+VsqsJN9O8qz28dpLL82T73lPnUywG5RUAAAA0K9K\n", "KUm+kOSl7eMNz3tenrjttqSUOrlgNyipAAAAoH/dlOSK9sGm5cuz8ktfSmbPrhQJdo+SCgAAAPpR\n", "KVck+VD7aOyQQ7LinnvSzJ9fJxNMgZIKAAAA+k0pL03yxfbRxJIlWXHvvZk44IBKoWBqlFQAAADQ\n", "T0p5VpLvJhndMmrmzs2Kr34148ccUy8XTJGSCgAAAPpFKUcm+cMke24ZNaVk5Z13ZtOZZ9bLBdNA\n", "SQUAAAD9oJT9kvxRkv3bx6s++tFseMlL6mSCaaSkAgAAgF5Xyp5Jfj/JNvfzPXn11Vn7lrfUyQTT\n", "TEkFAAAAvayUWUm+meSs9vG6Sy7J6htvrJMJZoCSCgAAAHpVKSXJZ5O8on284Zxz8vinPpWM+LWe\n", "weH/ZgAAAOhdH0zytvbBphNPzMq7707mzKkUCWaGkgoAAAB6USkfSPLh9tH4QQdlxT33pFm4sFIo\n", "mDlKKgAAAOg1pdyU5KPto4lFi7Li3nszsXRppVAws5RUAAAA0EtK+VA6VlBN7LVXVnztaxk77rg6\n", "maALZtUOAAAAAGTLJukfSnJT+3hir72y4t57s+nMM6vEgm5RUgEAAEBtrYLqI0k+0D6emD+/VVCd\n", "cUadXNBFSioAAACoqVVQfSzJje3jiQULsuJ3fiebTj+9Ti7oMiUVAAAA1NIqqG5OckP7eGLBgqz4\n", "5jez6ZnPrJMLKlBSAQAAQA2tgurWJO9pH08sXNgqqE47rU4uqERJBQAAAN3WKqg+meTX2scTixZl\n", "xbe+lU2nnFInF1SkpAIAAIBuahVUtyd5d/t4YtGiPPbtb2fs5JPr5ILKRmoHAAAAgKHRKqg+lc6C\n", "avFiBRVDz0oqAAAA6IZWQfXpJNe0jyeWLMlj3/pWxp7xjDq5oEcoqQAAAGCmtQqqzyR5Z/t4YsmS\n", "1gqq5cvr5IIeoqQCAACAmdQqqD6b5B3t44klS/LYd76TsZNOqpMLeoySCgAAAGZKKSNJfivJ29vH\n", "43vvnRXf+U7GTjyxTi7oQUoqAAAAmAmtgurOJG9rH4/vs09WfPe7GTv++Dq5oEcpqQAAAGC6tQqq\n", "zyd5a/t4fN99WwXVccfVyQU9TEkFAAAA06lVUH0xyZXt4/H99msVVMceWycX9DglFQAAAEyXVkH1\n", "pSRvaR+P77dfVnzvexk75pg6uaAPjNQOAAAAAAOhlNEkX05nQbX//nlMQQU7ZCUVAAAATNXWguqN\n", "7ePxAw7IY9/9bsaPPrpOLugjSioAAACYilZB9dUkr28fjx94YKugOuqoOrmgzyipAAAAYHeVsmeS\n", "byT5xfbx+NKlrYLqyCPr5II+pKQCAACA3VHKAUl+mOTM9vH40qV57Hvfy/gRR9TJBX1KSQUAAAC7\n", "qpQTkvwoyeHt4/GDDmoVVIcfPtlXAU/Dp/sBAADArijl+Un+Kh0F1aYTTsijP/iBggp2k5IKAAAA\n", "dlYpb0jyx0kWt4/Xn3deHvv3/z4TBx9cJxcMACUVAAAA7EgpJaV8KMnXk8xuv7T28suz8utfT7Ng\n", "QZVoMCjsSQUAAABPp5Q5Se5O8vrOS6tuvDFr3vGOpJTu54IBo6QCAACA7SllSZLvJzmvfdzssUce\n", "v+OOrL/ooiqxYBApqQAAAGAypRyR1if4Hd8+nliyJCu++tVsOvPMOrlgQCmpAAAAoFMpZyb5/ST7\n", "t4/HjjgiK+65J+NHHlknFwwwG6cDAABAu1J+McmfpaOg2njGGXn0hz9UUMEMUVIBAABAsuUT/K5L\n", "8rtJ5rVfWnfRRXns299Os88+dbLBEFBSAQAAQCmzknw2yaeSbPNRfU++8515/M47k7lzq0SDYWFP\n", "KgAAAIZbKfOTfDPJhe3jZnQ0T9x6a9ZdfnmdXDBklFQAAAAMr1IOSvIHSU5rH0/Mn5+Vd92Vjeed\n", "VyUWDCMlFQAAAMOplGck+cMkh7aPx5cuzYp77snYiSfWyQVDyp5UAAAADJ9SXpjkL9NRUG1avjyP\n", "/uEfKqigAiUVAAAAw6WUK5L8KMmC9vH6F7wgj/3e72XiwAPr5IIhp6QCAABgOJQyklI+nuTudGx/\n", "s+aNb8zKr3wlzV571ckG2JMKAACAIVDKnkm+nOSy9nFTSlbfdFPWvPWtSSl1sgFJlFQAAAAMulJO\n", "SvKdJNtsNNXMnZvHf+u3sv6lL62TC9iGkgoAAIDBVEpJ8qYkdyaZ135pfJ99svJrX8um00+vkQyY\n", "hJIKAACAwVPK/CSfS/L6zktjRx+dFffck/Fly7qfC9guG6cDAAAwWEo5OcnfZJKCau0rX5lHf/xj\n", "BRX0ICupAAAAGAyt2/uuSvKZJHPbLzVz5+aJm2/Oule/2gbp0KOUVAAAAPS/UhYm+WI6Pr0vSTYd\n", "e2wev+vpHga3AAAgAElEQVSujB17bPdzATvN7X4AAAD0t1JOS/J3maSgWnvZZXn0Rz9SUEEfsJIK\n", "AACA/tS6ve/tST6dZE77pYk998yqW2/Nule+sko0YNcpqQAAAOg/pSxKcneSp7RQm044ISu/8IWM\n", "H3NM93MBu83tfgAAAPSXUp6V5B8ySUG15vWvz6N/8AcKKuhDVlIBAADQH1q3970ryW1JZrdfmpg/\n", "P0988pNZf/HFVaIBU6ekAgAAoPeVsiTJV5I8pYXatHx56/a+I4/sfi5g2rjdDwAAgN5Wyllp3d73\n", "lIJqzZvelEd/+EMFFQwAK6kAAADoTaWMJLkuya3p+P11YsGCPPEbv5H1F15YJRow/ZRUAAAA9J5S\n", "9kny9SQv67y08ZRT8vgXvpDxZcu6nwuYMW73AwAAoLeUcnaSf8wkBdWTV12Vx37wAwUVDCArqQAA\n", "AOgNpcxO8p4kH04y2n5pYtGiPP7pT2fDi19cJRow85RUAAAA1NfaHP1LSZ7ReWnj6afn8c9/PuOH\n", "HNL9XEDXuN0PAACAekpZkFJ+M8lfZ5KC6sm3vS2Pff/7CioYAlZSAQAAUEcpL0/yuSRPaaAmlizJ\n", "45/5TDa84AXdzwVUYSUVAAAA3VXK0pTy3SQ/zCQF1dpXvjKP/PmfK6hgyFhJBQAAQHeUMpLkqiSf\n", "SLKo8/LYsmV54tZbs/F5z+t6NKA+JRUAAAAzr5QTk9yV5OzOS83oaNa87W1Zfd11yZ57dj8b0BOU\n", "VAAAAMycUvZIcmOS9yWZ3Xl54ymn5InbbsvY8uVdjwb0FiUVAAAAM6OUX0hr9dRxnZcm9twzq2+4\n", "IWvf/OZkdLT72YCeo6QCAABgepWyJK19p66a7PL6F7wgT9x8cyYOecqe6cAQU1IBAAAwPUopSV6V\n", "5DeTHNB5eXy//bLqox/N+pe/PCml6/GA3qakAgAAYOpKOSzJ55K8bLLLay+/PKve//40ixd3NxfQ\n", "N5RUAAAA7L5SRpP8SpKPJ9mr8/LYUUflidtuy8ZnP7vr0YD+oqQCAABg95RyapIvJXlW56Vm9uw8\n", "+Su/kiff+c5k7tzuZwP6jpIKAACAXVPKXkluSvKrSZ7y0XwbzzgjT9x2W8aOPbbr0YD+paQCAABg\n", "55QyJ8mVST6Y5MDOyxMLFmT1Bz6QtZdfnoyMdD0e0N+UVAAAADy9UkaSXJbko0mOnOwl6y68MKs+\n", "8pFMHPiU7gpgpyipAAAAmFwpJclLk9yc5OTJXjK+dGmeuPnmbHjRi7oaDRg8SioAAACeqpRzk9yS\n", "5OzJLjdz52bNW96SJ6+5Js2CBd3NBgwkJRUAAABblXJKWiunXjrZ5WbWrKx97Wvz5LXXurUPmFZK\n", "KgAAAJJSjk7ykSSv2d5L1l18cVZff33Gjziie7mAoaGkAgAAGGalHJTWp/Vdme38jrj+/POz+r3v\n", "zdjy5V2NBgwXJRUAAMAwKmVJkvcmeVeSeZO9ZOMZZ2TVjTdm01lndTUaMJyUVAAAAMOklL3SKqbe\n", "k2TxZC/ZdOKJWX3DDdlw/vlJKV2NBwwvJRUAAMAwKGVOWrf0fTDJpDuejy1bltXXX5/1F1+cjIx0\n", "NR6AkgoAAGCQlTKS1mboH0ly5GQvGd9//zx53XVZ+5rXJHPmdDUewBZKKgAAgEFUSklyYZKPJ3nG\n", "ZC+ZWLQoT159ddZecUWaPffsajyATkoqAACAQdLac+r1ae07dcJkL2nmzs2aK6/Mk1dfnWbxpNtS\n", "AXSdkgoAAGAQlLIsyTuSXJXtbIjezJqVtZdfnievvTYTBxzQ1XgAO6KkAgAA6FetW/rOTXJNkouT\n", "TLrbeVNK1l98cVZff33GDz+8iwEBdp6SCgAAoN+UMjfJZWmVU6du72XN6GjWv/SlefJd78rYSSd1\n", "LR7A7lBSAQAA9ItSDkry9iS/nGS/7b1sYsmSrH3d67LmDW/IxMEHdy0ewFQoqQAAAHpdKWeltWrq\n", "VXma3+M2HX981lxxRdZdckkyb17X4gFMByUVAABALypldpJXplVOnbW9lzWlZMMFF2TNFVdk49ln\n", "J6V0LSLAdFJSAQAA9JJS9kvrdr63Jzloey+bWLAga1/zmqx985szvmxZ1+IBzBQlFQAAQC8o5ZS0\n", "Vk29Nske23vZ2JFHtm7pu/TSNHvt1bV4ADNNSQUAAFBLKfOSXJjkHUme93QvXX/eeVl75ZXZcN55\n", "ychIN9IBdJWSCgAAoJtKmZPkhUkuS3Jxkvnbe+nEvHlZd+mlWfOWt2T8mGO6lRCgCiUVACRbNqdd\n", "kmTx5sfOY0FaPze3HLM7zqdyJMnGJBs6jslmuzpfk+TxtmNVmmZiWv6bAbDzShlNcl5axdQvpfWz\n", "ZbvGDj00a9/85qx9zWvSLFrUhYAA9SmpABgcpeyRZO9sv2jackx2fXg29ShlVbaWVk9k2xKr87xz\n", "9kSaZlOF1AD9p5SRJM9Jq5h6VZIDdvQlG5773Ky54opsuOCCZHR0phMC9BQlFQD9o5T5SZYlOXzz\n", "0fl8/zrB+s7Czcdhu/XVpaxNq7B6NMnDm4+fbef5I2majVOPDNAnSilJnplWMfXqJIfu6EvGDzgg\n", "61/+8qx99aszdtJJM50QoGcpqQDoHaUsytbiabIyap86weiw5+Zjux+Lvo1SVmb7Jda2z5vmyRnI\n", "CzDzSjkprWLqsiRH7+jlE0uWZN2FF2b9RRdl41lnWTUFECUVAN3U2ij2+CRHZvLVUIvrBEuakZE0\n", "ixZlYvPRLFyYicWLW88XLcrEwoXJ7NlpZs1q/SIxa1aaLY9TmGXWrKRpko0bUzYf2bCh9XzTpq3P\n", "n26+cWPKhg2t+ZbnW+Zr1mRk1aqMPPFEyqpVGXmySge05ZbK43b4ytYqrYeTPLD5uH/z8UDb44Nu\n", "OQR6QilHpbVa6rIkz9jRyyfmz8/6l7wk6y++OBvOOSeZPXvGIwL0EyUVADOjtSrqlCSnJTl18+OJ\n", "aW04PiOakZFMLF6cZnO59POCafHibQuo9udbiqj584fj47zHx1NWr87IqlUpTzyRkdWrW4+rVrVK\n", "rC2Pk802P5aJGd13fc8kR2w+tqdJKQ9l+yVW67Fp1s5kUGBIlXJIkkvTKqbO2NHLm7lzs/6FL8y6\n", "iy/Ohuc/P5k7d8YjAvQrJRUAU9Pae+OgbC2itpRSR073WzWzZmX84IMzfuihWx8PPTTjhxzSejzw\n", "wNbKJLZvdDTN4sUZX7ybi9aaJmXNmpTHH8/oY49l5NFHM/LII63jsccy2vZ85JFHMrJixUyUWiXJ\n", "0s3Hs7b/qrIyTy2x7k/yb0l+kuS+NM266Q4HDJjW5uenJDk/ySuSnLujL2lmz86G5z8/6y66KBsu\n", "uCDNXsPz2RwAU+Fv8gDsvNbHZx+TbVdHnZpkv+n49s2cOa3yaUvptPlxbPPjxAEH2LOjtlLSzJ+f\n", "Zv78TBxyyI5fPz6ekZUrtxZZjz6a0S3F1qOP/rzkGt38vGyc1j3Wt9xmuP1bcEr5WbaWVpM9Ppam\n", "aaYzFNDjWv/4clRapdT5Sf5ddmJPxGZ0NBvPOSfrLroo61/84jS7+48BAENMSQXA5EqZl9Yv9+1l\n", "1Mlp3Y6128aXLs3YscdmrH0V1JYSav/9h+OWu2EyOpqJfffNxL77Jiec8PSvbZrWrYgPP5zRhx7K\n", "6EMPZeTBBzPadow89FBGH3lkOhPuv/nY3oqstSllS2k1WZH1QJpmbDoDARWUckC2llLnp7Vf4k7Z\n", "8OxnZ/1FF2X9y17W+rMOgN2mpAKgpZSFSX4hyQuSPD/JSUl2e9lSMzKSsaOPztjy5dl00kk/P5p9\n", "fEAf21FKmoULM75wYcaPOWb7r9u4MaMPP7xNgTXy0ENbnz/4YEYffjhlbFq6oz3T2uz/+O1cn0gp\n", "D2RrafWvHY//5pZC6EGtn3nPy9ZSavmufPnG007L+osuyroLL8zEQTv3QacA7JiSCmBYlbJHkmen\n", "VUqdn+TM7GYp1cydu7WIWr48YyedlE3HH5/MmzeNgWGzOXN+vh/Zdj/ib2KidWvhltJqy/HTn2bk\n", "gQcyev/9GX3ooZTx8ammGUly6Obj7Elf0drkfbICq/XYNGumGgLYgSn+zJtYuDAbn/OcbDjnnGw4\n", "//yMH374zOQEGHJKKoBh0dpP6tRs/Vfjc5Pscos0vvferdVRW1ZILV+e8SOPtFcUvWVkJBP779+6\n", "hfSUUyZ/zdhYawXWAw+0jvvv3/q4+RhZNy2LoA7cfJw16dVSHs3kBVbredOsmo4QMFRam51v+Zn3\n", "guziz7xmjz2y8YwzsuGcc7LxnHOy6eSTfTAHQBf4kxZgULU2fj06W//V+PlJ9t6VbzG2bNnWlVGb\n", "S6mJAw9MSpmBwNBls2Zl4pBDMnHIIZOvyGqalJUrty2wOsusRx+djiT7bj4m3xer9SmFk+2HteX5\n", "z9I00/4RitBXWntKbdlD8VnZxZ95TSnZdMop2XjOOa1i6owzrAYGqEBJBTBISlmabTd+PXRXvnzs\n", "6KOz4dxzW39Bf85zfDIRw62UNHvvnbG9987YM7bzAYHr1mX0pz/duvrqgQcyet99mXXffa2VWA89\n", "lDIx5f5oy6cUnrqd6xtSyn2ZvMD6SZL70zQbphoCekJrhdSReeqnzC7d1W81dvTRrdv3zj3XzzyA\n", "HqGkAuhnpSxKcl62llIn7sqXjy9d2vrL+TnnZMPZZ2di6S7/HR+G27x5GT/qqIwfddTk1zdtau2F\n", "tbm0+vnjluc//el07Iu1R1qrJo/ezvWmbV+sztVY/5bkviQr0zTNVIPAtGrtI3VSti2jTkmyYHe+\n", "3fiBB279mXfOOX7mAfQgJRVAvynlwCSvTPLqJM9Na+PmnTKxaFE2Pve5P18tNX7UUW7dg5k0e3bG\n", "Dzss44cdNvn1tn2xZt1337Zl1uZbCsum7W4Pv7NKWqtMlqa1cfRk1m3+lML7k2x5bH/+QJKH0zRT\n", "btRgUqUsTquAal8hdWKm8PvKz3/mbS6lxo8+2s88gB6npALoB6XsneSSJJeltc/GThVTzdy5rY1f\n", "zz03G889N5uWL7fBOfSS9n2xzppkX/WJiYw8/PC2+2G174/1wAMZWTUt+6rPy9OvxkqS8ZTy02y/\n", "xLo/yU/dWsjTapVRhyc5IsnybC2ljpjKt23mzMmm44/fuofiaadl0zOe4WceQJ9RUgH0qlIWJLko\n", "rWLqRdmJP7ObkZFsOvXU1q0M556bjaefnsydO9NJgZkyMpKJpUszsXRpNj1rO/uqr1r11A3d2x5H\n", "Hn44ZXru5BtNa5+7p9/rrpRH0r76qnX8bJLnK2z4PmBaH9ixd1ol1LLNj53PF071bSYWLfr5h3mM\n", "bXk8+uhk9uypfmsAKlNSAfSSUuYleVlaxdTLkuywYdp07LFbS6nnPCfNwin//R/oI83ChRlbuDBj\n", "J5ww+Qs2bmzti7WdImvkoYcysnbtdEbab/Nx2g5eN7650Hq6ImvL85+laaZ83yNT1Cqh9s3Wwunw\n", "PLWMmj+dbzl28MHbfMLs2DOekfGDD3bbHsCAUlIB1FbKnCQXpFVMXZSd+Av+ppNOyrqLLsr6V7xi\n", "+3vdACTJnDkZX7Ys48uWTX69aVqrsR56KCMPPtgqtDYfIw89tPX5ypXTnWw0yYGbjx0rZUW2lleP\n", "JHl88/FE2/PJzp+0KfzTaP3jyJZPkFzc9nzLcWC2LaLmzUSMZnQ0Y0cfnU3Ll28tpU48Mc3ee8/E\n", "2wHQo5RUADWUMprWp/JdluSX0vpF4GmNHXVU1l18cda94hUZP+aYGQ4IDI1S0ixalLFFi5Ljjtv+\n", "69aty+hDD20ts37609Z5W5k18rOfpUzM2B18e28+jt/Fr5tIKTsqstrP1yTZmGTDJMfGbZ7Xvl2x\n", "tbJpVlqf8DhZwdR+bO/6Ht2M3OyxR8YPPjjjhx6ascMP33rL3nHHJfNmpP8CoI8oqQC6pZSRJM9J\n", "q5h6VZIDdvQlY4cemvUXXZR1F12UsRNPdHsDUM+8eRk/4oiMH/E0+1uPjWXkZz9rrb56+OGMPPJI\n", "Rh59tHU88kj+f/buPM7Ksv7/+OuaYZMdFFyA3JDFBUVNXEhQUFxS02JcyhA1zUwzKNwycUkzRcOS\n", "zARcMnX0p5lb7ruJ4hpopn1RLMUF2ZcBZq7fH8cZZu4ZYAZmzn3Omdfz8eDBuT/XWd5HeQi+ue/r\n", "Lq72uGjRomwlL2J1IdO4QlhJ7fJqzaVW5k6LLRrxR73v7potsU0bVvXqRXmvXpT37Jn5Ufm4Vy8q\n", "NtkEinIutiQpR1hSSVJTyvwt965kiqmjWdeGw0D5ppuy7PDDWX744azcdVeLKUn5o0ULKrbYgoot\n", "tmCdG0gtX07RF19QPHduprSqVmgVJ8qtoi+/bKzN3xtby69+NBsV7dqtsYAq79WLiq5d/X1LkrTe\n", "LKkkqSmE0BY4HjgD2GFdT6/o0oVl3/wmy484ghWDBnnLbEmFr00bKnr2pKJnz3U/t7ycoi+/XF1m\n", "zZ9P0cKFhAULKFq0iLBwIUULFmR+Xrhw9c8LFlC0bFnTf5c8Flu2pKJTJ2LHjlR07px53KkTFZ06\n", "UdG5M7FLF8p79mTVV6VU7NLFEkqS1GQsqSSpMYXwNeB04Aes49KSig4dWH7wwSw/4gjKBg/21tmS\n", "tCbFxVR060ZFt24Nf+3KlVWlVY1ia8GCmoVWZdG1bBlhxYrM68rKMo9XrKjxc+WPXBBbtMicwdap\n", "ExUdO2YKprrKpsr1r9YqOnUidu5M3GgjSydJUs6wpJKkDZW5pG8w8BPgSNayR0hs04blBx7IsiOO\n", "oGy//aBNm2yllKTmqWVL4sYbU77xxpQ35vvGuObyqrLcqlZ0hRUriEVF0KJFplgqLs48rvy5jlmN\n", "9TpmFBVZMEmSCoollSStrxBak9lr6ifAwDU9LRYXUzZsGMu+9S3KDjiA2K5d1iJKkppICNC6NbF1\n", "5uZ4ObljliRJecaSSpIaKoTNgdOAU4Hua3paRZcuLP3ud1kyahQVPXpkLZ4kSZIk5SNLKkmqrxC+\n", "TuasqRLWcjenlX37suTkk1l25JHQtm3W4kmSJElSPrOkkqS1CaEl8G3gTGCvNT0thkDZAQew5OST\n", "WbHPPu4RIkmSJEkNZEklSXUJYRPgFOBHwBqv1avo0IGlxxzD0tGjKd9qq2ylkyRJkqSCY0klSdWF\n", "MIDMJX3fBVqv6WmrttmGJSeeyLKSEmL79lmLJ0mSJEmFypJKkkIoBg4jU04NXdtTy4YMYcnJJ1O2\n", "336ZW39LkiRJkhqFJZWk5iuEABwJXAr0X9PTKjbaiGUlJSw98URWbbdd1uJJkiRJUnNiSSWpeQph\n", "f+ByYI81PWVVz54sHT2apcceS+zcOXvZJEmSJKkZsqSS1LyE8HXgMmD4mp5SttdeLD3pJJYfeCC0\n", "8D+TkiRJkpQN/t+XpOYhhH5kLuv7dl3LsaiIZUcdxZJTTmHVjjtmN5skSZIkyZJKUoEL4WvAhcAJ\n", "QJ07nS8/+GAWnX02q/r0yWYySZIkSVI1llSSClMI3YDzgB8Brep6Stk++7Do3HNZueuuWY0mSZIk\n", "SarNkkpSYQmhAzAG+BnQvq6nrBgwgEXnnsuKffeFELIaT5IkSZJUN0sqSYUhhDbAD4HzgU3qesqq\n", "bbdl0dlns/zQQy2nJEmSJCnHWFJJym8htAC+D4wHetX1lPLNN2fR2LEsKynxbn2SJEmSlKP8vzVJ\n", "+SmEABxF5o59/ep6SkWXLiw+80yWjBoFbdpkNZ4kSZIkqWEsqSTlnxCGA5cBX69ruaJdO5aceipL\n", "Tj2V2KFDdrNJkiRJktaLJZWk/BHC14HLgWF1LcdWrVj6/e+z+Mwzqdikzm2pJEmSJEk5ypJKUu4L\n", "oRswATi+ruVYVMSykSNZPHYs5T17ZjebJEmSJKlRWFJJyl2ZfaeOB64GNq7rKcsOOYTF48axqk+f\n", "rEaTJEmSJDUuSypJuSmEbYHrgeF1LZcNHsyic89l5cCB2c0lSZIkSWoSllSScksILYExwHig1i35\n", "Vvbrx8Lx41mx777ZTiZJkiRJakKWVJJyRwh7AH8CBiSXYuvWLBozhiU//CG0bJn9bJIkSZKkJmVJ\n", "JSl9IXQALgHOBEJyuWzwYBb8+teUb7NN1qNJkiRJkrLDkkpSukL4JjAJ6JVcqujShYUXXsiykSMh\n", "1OquJEmSJEkFxJJKUjpC2ByYCIysa3nZUUexcPx4KjbZJLu5JEmSJEmpsKSSlF0hFAEnAVcCnZLL\n", "q3r1YsEVV7Bi6NBsJ5MkSZIkpciSSlL2hNAPuAH4RnIpFhez5JRTWDx2LLFt2+xnkyRJkiSlypJK\n", "UtMLoTVwDnAe0Cq5vGLAABZceSWrdtop69EkSZIkSbnBkkpS0wrhG2TOnuqXXKpo25ZFZ5/N0tGj\n", "oYX/OZIkSZKk5sz/K5TUNELoDFwBnFLX8vL992fhr39Nec+e2c0lSZIkScpJllSSGlcIAfg28Dtg\n", "s+Ry+SabsPCSS1h++OEQQtbjSZIkSZJykyWVpMYTwmZkLu07rK7lpccdx8Lzzyd26ZLdXJIkSZKk\n", "nGdJJalxhDAcuA3onlxatc02LLjySlbstVf2c0mSJEmS8oIllaQNE0ILYDyZO/fVuH4vtmzJ4tNP\n", "Z/GZZ0KbNmmkkyRJkiTlCUsqSesvhB7AX4B9k0srdtuNBVddxaq+fbOfS5IkSZKUdyypJK2fEA4C\n", "bgU2qT6OIbB4zBgWn3UWFBenk02SJEmSlHcsqSQ1TAgtgUuAs5NL5d27M/+661ixzz7ZzyVJkiRJ\n", "ymuWVJLqL4RewB3A3smlsn33Zf7vfkdFt27ZzyVJkiRJyntFaQeQlCdCOAx4g0RBVRECc8eM4cu/\n", "/MWCSpIkSZK03iypJK1dCK0IYQLwN6BrYvXjv4wevXjeaadBkf85kSRJkiStP/+vUtKahbAV8Bww\n", "po7Vh4FdPtxmm/JsRpIkSZIkFSZLKkl1C+FI4HVgj8RKOZlN079JjJ9nPZckSZIkqSC5cbqkmkJo\n", "DVwJnFHH6kfAMcT4YnZDSZIkSZIKnSWVpNVC2Ba4E9itjtX7gdHEODe7oSRJkiRJzYGX+0nKCGEk\n", "8Bq1C6pVZPakOsKCSpIkSZLUVDyTSmruQmgDXA2cVsfqB8DRxPhyVjNJkiRJkpodSyqpOQuhD1AK\n", "7FzH6r3AicQ4P7uhJEmSJEnNkZf7Sc1VCMcBr1K7oFoBnAl824JKkiRJkpQtnkklNTeZu/f9DvhB\n", "Hav/B5QQ46vZDSVJkiRJau4sqaTmJISNyVzG9406VkuBU4hxQXZDSZIkSZLk5X5S8xHCtsCL1C6o\n", "yshsmn6MBZUkSZIkKS2eSSU1ByHsBfwN2CSx8j4wkhjfyH4oSZIkSZJW80wqqdCFMBJ4itoF1XPA\n", "IAsqSZIkSVIusKSSClUIgRDGkdlrqnVi9S/AAcT4ZfaDSZIkSZJUmyWVVIhCaAH8AbiijtVLgO8R\n", "Y1l2Q0mSJEmStGbuSSUVmhA6kDl76qDEyioyd++bmv1QkiRJkiStnSWVVEhC6Ak8AOycWFkIHEWM\n", "T2Q/lCRJkiRJ62ZJJRWKEHYBHgS2SKzMBg4hxpnZDyVJkiRJUv24J5VUCEI4mMzd+pIF1XQyd/Cz\n", "oJIkSZIk5TRLKinfhXAqcD/QPrHyN2AoMc7JfihJkiRJkhrGkkrKVyEUEcIVwPVAcWL1WjJ7UC3J\n", "fjBJkiRJkhrOPamkfBTCRsDNwMjESgR+SowTsx9KkiRJkqT1Z0kl5ZsQugH3AXslVpYBxxLjfdkP\n", "JUmSJEnShrGkkvJJCH2Bh4BtEiufAocR4yvZDyVJkiRJ0oZzTyopX4SwL/APahdUbwN7WlBJkiRJ\n", "kvKZJZWUD0I4DngM6JJYeRLYhxg/yHomSZIkSZIakSWVlMtCCITwC+A2oFVi9SbgYGKcn/VckiRJ\n", "kiQ1MvekknJVCC2B64ET61j9JXApMcbshpIkSZIkqWlYUkm5KIR2wL3AAYmVlcCJxPjn7IeSJEmS\n", "JKnpWFJJuSZTUD0IDEmszAOOJMZnsh9KkiRJkqSmZUkl5ZIQ2pMpqPZNrMwCDiHGf2U/lCRJkiRJ\n", "Tc+SSsoVIXQAHgIGJ1beAEYQ42fZDyVJkiRJUnZYUkm5IFNQPQzsk1h5DTiAGL/MfihJkiRJkrKn\n", "KO0AUrMXQkfg79QuqF4FhltQSZIkSZKaA0sqKU0hdAIeAfZOrLxCpqCal/1QkiRJkiRlnyWVlJbV\n", "BdWeiZWXgQOJcX72Q0mSJEmSlA5LKikNIXQGHgUGJVamYUElSZIkSWqGLKmkbAuhC/AYsEdi5SUy\n", "d/FbkP1QkiRJkiSly7v7Sdm0uqDaLbHyD+AgYlyY/VCSJEmSJKXPM6mkbAmhK/A4tQuqF8icQWVB\n", "JUmSJElqtiyppGxYXVDtmlh5HjiYGBdlP5QkSZIkSbnDkkpqaiFsDDwBDEysPIcFlSRJkiRJgCWV\n", "1LRC2IRMQbVLYuUZ4BBiXJz9UJIkSZIk5R43TpeaSgjdyBRUOyVWnga+SYxLsp5JkiRJkqQc5ZlU\n", "UlMIoTvwJLULqieBQy2oJEmSJEmqyZJKamyrC6odEytPAIcR49Lsh5IkSZIkKbdZUkmNKYRNgaeA\n", "HRIrj2FBJUmSJEnSGllSSY0lhM3IFFTbJ1YeBY4gxmXZDyVJkiRJUn6wpJIaQwibkymo+idW/o4F\n", "lSRJkiRJ62RJJW2o1QVVv8TKw8CRxLg8+6EkSZIkScovllTShghhC+BpoG9i5UEsqCRJkiRJqjdL\n", "Kml9hbAxmbv49UmsPAB8mxjLsh9KkiRJkqT8ZEklrY8QNgLup/YZVH8DvmNBJUmSJElSw1hSSQ0V\n", "QjHwF2CvxMp9wEgLKkmSJEmSGs6SSmqIEAIwEfhWYuVp4GhiXJH1TJIkSZIkFQBLKqlhxgGnJ2Yz\n", "yGyS7hlUkiRJkiStJ0sqqb5C+C7w68T0f8AhxDg/hUSSJEmSJBUMSyqpPkIYBkxNTBcCBxPjRykk\n", "kqhB0Q8AACAASURBVCRJkiSpoFhSSesSwgDgHqBltekK4FvE+M90QkmSJEmSVFgsqaS1CeFrwMNA\n", "x8TKKGJ8KoVEkiRJkiQVJEsqaU1C6EKmoNoisfJzYrwjhUSSJEmSJBUsSyqpLiG0Af4KbJ9YuRaY\n", "kP1AkiRJkiQVNksqKSmEIuBmYN/Eyv8DxhBjzH4oSZIkSZIKmyWVVNtVQEli9jzwPWIsTyGPJEmS\n", "JEkFz5JKqi6EnwI/TUzfAY4gxuUpJJIkSZIkqVmwpJIqhVACXJ2YfgIcTIxfppBIkiRJkqRmw5JK\n", "AghhCHBrYroIOIQYP0whkSRJkiRJzYollRTCDmTu5Neq2nQV8G1ifCOdUJKk5uqqq65i6NCh9OjR\n", "gx49ejBmzJi0I0mSJGWFJZWatxB6AH8HOidWTiTGx1JIJElq5n72s5/x9NNPs+eeewJU/SxJklTo\n", "LKnUfIXQCXgY6JlYOY8Yk5f+SZKUVe+++y4hBEsqSZLUbFhSqXkKoRVwD7BTYuUPwK+zH0iSpNXe\n", "e+895s2bx2abbcbXvva1tONIkiRlhSWVmp8QioCpwP6JlfuAM4gxZj+UJEmrvfzyywAMGjQo5SSS\n", "JEnZY0ml5uhy4LjE7CXgOGIsTyGPJEk1VJZUXuonSZKaE0sqNS8h/BgYl5i+BxxGjEtTSCRJUi0v\n", "v/yy+1FJkqRmp0XaAaSsCeEo4NrE9DPgIGL8IoVEkiTV8umnnzJ79mw23nhjiouLOfXUU/n4449Z\n", "sGAB+++/P+eccw5t2rRJO6YkSVKjs6RS8xDCPsBtQKg2XQIcQoz/l04oSZJqmzZtGgCtW7fm7LPP\n", "5oorrmCbbbbh888/Z7/99mP27NlMmTIl5ZSSJEmNz8v9VPhC6Af8Daj+187lwEhifDWdUJKk5ujO\n", "O+9k8ODBbLvttgwfPpypU6fWul9H5X5UnTp1YurUqWyzzTYAdOvWjYMOOohHHnmEV1/1ty9JklR4\n", "LKlU2ELoDNwPdE2s/IAYH04hkSSpmfrd737HmDFjGDBgAG+88QaXXnoppaWljB49moqKiqrnVZZU\n", "V155Je3bt6/xHl27Zn47e+qpp7IXXJIkKUssqVS4QigCbgF6J1YuJMapKSSSJDVTr776KldccQVt\n", "27blV7/6FR06dODFF19k1qxZPPbYY9x5550ALF68mHfeeYdOnToxcODAWu8zd+5cAL74wq0UJUlS\n", "4bGkUiE7HzgsMZsKXJJCFklSM7Vy5UrGjh1LjJEjjzySLl26MGvWLCZMmMCiRYuA1WdGTZ8+nYqK\n", "Cnbfffc63+tf//oXAB07dsxOeEmSpCyypFJhCuFg4KLE9BXgR7U2/5AkqQndc889vPfee4QQ+M53\n", "vgNAeXl5jee0aJG5l83rr78OwKBBg2q9z/Lly3n77bcB2H777ZsysiRJUiosqVR4QtgG+As17+T3\n", "BfBtYlyeTihJUnMUY2TSpEkA9OjRgz322AOA3r1785Of/IQOHTrQv39/xowZA8CsWbMA2HXXXWu9\n", "10svvcSKFSto3bo1Q4YMydI3kCRJyp4WaQeQGlUIbYF7gM7VphXA0cT4UTqhJEnN1TPPPMP7778P\n", "wLBhw2qsjRs3jnHjxtWYVe411adPn1rv9fDDmft9HHbYYXTp0qUp4kqSJKXKM6lUOEIIwB+BnRMr\n", "5xDjkykkkiQ1c3fccUfV42RJVZfNN98cgE6dOtWYL1y4kL/+9a+0a9eOn//8540bUpIkKUdYUqmQ\n", "nA58LzG7G7gqhSySpGZu0aJFPProowC0atWKvffee52v2WeffQCYPXt2jfnFF1/M4sWLueyyy+jZ\n", "s2fjh5UkScoBllQqDCEMBq5JTN8BTnSjdElSGh5//HHKysoAGDBgABtttNE6X3PEEUew7bbb8qc/\n", "/QmAiooKrrzySu666y4uu+yyqo3XJUmSCpF7Uin/hbA5cBc1fz0vAo4kxkXphJIkNXeVZ1EB9TqL\n", "CqC4uJi//OUvnHvuuQwbNoyioiK23XZbHnroIXbYYYemiipJkpQTLKmU30JoRaag2iyx8n1ifDeF\n", "RJIkEWPk2WefrTquvKtfffTs2ZNbb721KWJJkiTlNC/3U767CtgnMbuMGP+aRhhJkgBmzJjB/Pnz\n", "ASgqKmK33XZLOZEkSVLus6RS/grhe8AZiemjwC9TSCNJUpXnnnuu6vHWW29Nx44dU0wjSZKUHyyp\n", "lJ9C2AW4ITH9EDiOGMtTSCRJUpXnn3++6vHOO++cYhJJkqT8YUml/BNCV+AeoPptkpYDRxHj3HRC\n", "SZKUsWLFCqZNm1Z1PGDAgBTTSJIk5Q9LKuWXEIqB24CtEys/JMbXUkgkSVINr732GsuXL686tqSS\n", "JEmqH0sq5ZsLgYMSsz8Q481phJEkKemFF16oelxUVMSOO+6YYhpJkqT8YUml/BHCYcAFielLwFkp\n", "pJEkqU7/+Mc/qh5vueWWtGvXLsU0kiRJ+cOSSvkhhO2APyemnwHfIcYVKSSSJKmWFStW8Nprq68+\n", "32mnnVJMI0mSlF8sqZT7QmhPZqP06vfvLgdGEuP/0gklSVJtr7/+OmVlZVXHllSSJEn1Z0ml3BZC\n", "AG4Ekht6/IwYn00hkSRJa1T9rn5gSSVJktQQllTKdWcBRydmtwMTU8giSdJavfTSS1WPQwjssMMO\n", "KaaRJEnKL5ZUyl0hDAWuTEz/CfyAGGP2A0mStGbl5eVMnz696njTTTela9euKSaSJEnKL5ZUyk0h\n", "9ATuBIqrTRcARxHjknRCSZK0ZjNmzGDJktW/RW2//fYpppEkSco/llTKPSG0Bu4GuidWvkeM76eQ\n", "SJKkdXrllVdqHPfr1y+lJJIkSfnJkkq56LfAoMTsImJ8II0wkiTVx8svv1zjuH///iklkSRJyk+W\n", "VMotIYwGfpiYPgRcnEIaSZLq7dVXX61x7JlUkiRJDWNJpdwRwm7AHxLT/yNzmV9FCokkSaqX//73\n", "v8yZM6fquEWLFvTu3TvFRLnj3XffZc899+T997N3xf5ZZ53FRRddlLXPkyRJjcOSSrkhhE2Ae4DW\n", "1abLgCOJcV46oSRJqp/kpX5bbbUVrVq1SilN7nj55Zc56qijOP3007Na2l188cU8++yzjBs3rslv\n", "CFxRUcG8efOYNWsWr7/+Ok899RTLli1r0s+UJKlQtUg7gEQIAZgCfC2x8gNifCuFRJIkNUihX+pX\n", "VlbG5MmTufPOO/noo4/o1q0bhx56KGPHjqVdu3Z1vubf//43xx9/PCeddBLHH398VvN27NiR2267\n", "jREjRlBWVsbEiROb5HMOOeQQ/vnPf1JRUfOE72nTptGzZ88m+UxJkgqZZ1IpF/wAOCwxm0iMt6UR\n", "RpKkhkre2a+QNk1ftGgRJSUl/OpXv2LkyJG88sornHHGGdx0001rLJ++/PJLTjjhBPr168fPf/7z\n", "LCfO2Gyzzbj66qu5++67ufXWW5vkM7797W9z8skn1yglM3/3JkmS1odnUildIfQBrklMXwLS+ROt\n", "JEkNtHTpUt55550as0I6k+rss89m+vTp7Lfffvz4xz/mwQcf5JxzziHGyLRp05g/fz6dO3eu8Zpx\n", "48bx2Wefcccdd6Ra2gwbNoxjjz2W8ePHs+eee7Lddts16vufdNJJQObXwG677cbChQsb9f0lSWpu\n", "PJNK6QmhJfBnoG216WIyG6WvTCeUJEkN89prr9W43CuEUDBnUs2YMYP77rsPgP333x+A0tLSqn2e\n", "evbsWaugeuSRR3j44Yc58cQT+drXklfyZ9+4ceMIIXD66afXuiyvsbRt29aN8iVJagSWVErTL4Gv\n", "J2ZnEuN/0ggjSdL6SO5H1bZtW7bccsuU0jSuP//5z0CmeNt9990BOPbYY9lqq63YY489mDx5co3n\n", "r1ixgvPPP5+OHTvyox/9KOt569K9e3dOOukkZs6cye23395kn+NG+ZIkbThLKqUjhH2A8xLTe4Cb\n", "sh9GkqT1lyyp+vbtm1KSxvf4448D0Lp1a3bYYQcADjroIF544QXuvfdedtxxxxrPv+uuu/jkk08Y\n", "OXJkrTOs0jRq1CiKi4u5+uqrWbVqVdpxJEnSGlhSKftC6AjcSs1ff58Apzb5faIlSWpkr7/+eo3j\n", "7bffPqUkjWv27Nl88sknAOy0004UFxev9fkVFRVMmjSJEALHHHNMNiLW2xZbbMGwYcOYM2cO9957\n", "b9pxJEnSGlhSKQ0Tga0Ts9HE+EUaYSRJWl+zZ8/myy+/rDErlJLqtddeq3o8cODAdT7/ueee44MP\n", "PqBfv345+c/gsMMyNxKuvIRRkiTlHksqZVcI3wFOSEyvJcZHUkgjSdIGeeONN2rNKi+Ly3dvvvlm\n", "1eP6lFSVG6zvu+++TZZpQwwdOpQQAq+++iqzZ89OO44kSaqDJZWyJ4QewB8T05nAOSmkkSRpgyUv\n", "9SsqKsrJs4jWxz//+U8gs2n6LrvsstbnlpeX8/e//x3I3ZKqa9euDBgwgBgjjz76aNpxJElSHSyp\n", "lB0hFAFTga7VpiuA7xLjsnRCSZK0YZJnUm299da0bds2pTQb5sADD6RHjx5VP/7xj38AEGNkr732\n", "qrH2pz/9qcZrZ86cyYIFCwgh1Ousq7qUl5dz9913c/jhh9O/f38GDBjAiSeeWOOMrpUrV3Ldddcx\n", "ePBgttlmG4YMGcJVV11FWVlZvT5jp512AuDZZ59tULZ3332X8ePHM3z4cPr06cO2227LvvvuyyWX\n", "XMKcOXMa9F6VsvF9JUnKNy3SDqBm40zggMTsfGJ8s64nS5KU68rLy6vONqpUWYLkowcffJCVK1cC\n", "8K9//atqD6cRI0bw+9//vsZzk0Xcyy+/DMBmm21Gp06dGvzZ8+fP54c//CELFy7krLPOYpddduF/\n", "//sfZ5xxBt/61reYNGkSw4cP56STTqKiooIbb7yRbt268eCDD/LLX/6St956i1tuuWWdn1P572fm\n", "zJn1yrVy5UrGjx/PzTffzGabbcaPf/xjvvGNb9ClSxc+/vhj7r//fkaMGMGFF16Yk99XkqR8Y0ml\n", "phfCTsCvE9OngKtTSCNJUqN49913Wbas5snAAwYMSCnNhmvZsiUtW7YEYNasWVXznXbaaZ1nh1Ve\n", "9ti3b98Gf+7KlSsZPXo0vXr14rbbbqu6i2D37t256KKL+P73v8+4ceP41re+xdy5c/nb3/5GcXEx\n", "L7zwAuPHj2flypU88cQTLFy4kI4dO671s7bbbjsAPv30U+bOncvGG2+8xufOnz+fUaNGMX36dLbe\n", "emvuv/9+unTpUrXetWtXdtxxR4488khGjhxZVfDl0veVJCnfeLmfmlYIbYDbgNbVpguAUcRYkU4o\n", "SZI2XF2bpudzSVXd22+/XfW4PntsffDBB0DmTKqGmjhxIuXl5VxzzTVVhU3ys7/88kumTJnCFVdc\n", "UfWcyZMnV1321q5dO9q3b7/Oz9p0002rHlf/jnU566yzmD59Oi1atGDKlCk1Cqrq+vXrxzXXXMPi\n", "xYvX+fmQ3e8rSVK+saRSU7sUSF778ENi/CiNMJIkNZa33nqrxnFRURE77rhjSmka1zvvvANkNk2v\n", "z90KP/zwQyBzNlBDfP755/zxj3/k8ssvr1XYAMydO7fq8W677Vbjn2///v0BaNGiBRdddBFFRev+\n", "Y+3mm28OZPbZqizW6nLzzTfz2GOPAZnLHfv06bPW9x0+fDhbbLHFOj8/299XkqR84+V+ajohDAPG\n", "Jqa3EeMdacSRJKkxJUuqrbbaig4dOqSUpnFVllQdOnSgZ8+ea33uqlWrmDdvHsAazzZak3vuuYfd\n", "dtttjUVY9bOdDjig5taWP//5zzn00EPp1q0b3bp1q9fntW7dmtatW1NWVsaCBQvqfM6qVav47W9/\n", "W3V85JFH1uu96yPb31eSpHxjSaWmEUIX4ObEdDbw4xTSSJLUqFauXFlV5FTaeeedU0rTuObOnctn\n", "n30GrD57Z22WLl1a9bh169ZreWZtW221FWPHJv8+a7Xp06dXPd5rr71qrdfnUsSkjTbaiLKyMhYt\n", "WlTn+gsvvFD1/UMIjfrvNY3vK0lSPrGkUuMLIQDXAz2qTSNwPDHOTyeUJEmN59///jcrVqyoMdtl\n", "l11SStO4Grof1YaUVCNGjFjr+vPPPw9k7iY4cODABr33mrRp0waAhQsX1rn+6quvVj1u1apVvS7j\n", "q680vq8kSfnEi9nVFL4LlCRmVxDjs2mEkSSpsf3zn/+sNSuUkqr6GWINPXMnxthoOf773/9W7XW1\n", "++6717mH0/qozFhRUff9Wz799NOqx506dWqUz6yPpvq+kiTlE0sqNa4QtgKuS0xfBy7MehZJkprI\n", "zJkzaxy3bNmSnXZK3ickP1U/k6o+m6a3bdu26nHl3ecaQ+VZRQB77713o73v8uXLgZq516Rly5aN\n", "9rnr0lTfV5KkfGJJpcYTQjFwK9Cx2nQ58F1iXFH3iyRJyj/Jkqpv374NvtQtV1WWVMXFxfTt23ed\n", "z69e9lQWQI3hhRdeqHpc1/5M66sy40YbbVTneuUdAKs/Nxua6vtKkpRPLKnUmMYBgxOznxHjO3U9\n", "WZKkfJXcNH3XXXdNKUnjWrVqFe+99x4AW2+9ddX+TWvTokULunbtCrDGO+atj8rSZm37M82fP5+J\n", "EyfW+z2XL19edbZX9TKquuqfNX/+/DVeFtjYmuL7SpKUbyyp1DhC2A24ODH9OzAphTSSJDWZ//3v\n", "f7U23S6UTa7fe++9qg3hG7If1ZZbbgnAJ5980qDPW7p0Ka+//jpLliyplaNyb6iBAweucX+mBx98\n", "kEcffbTen1eZL4RAr1696nzO3nvvzSabbAJk9q1KFpIbItvfV5KkfGNJpQ0XQlvgNmreLfILYHSj\n", "7qAqSVIOePfdd2schxAKpqSaMWNG1eOGlFRbb701AB9//HG9X/Pf//6XoUOH8s1vfpMDDjiAVatW\n", "Va09/vjjVY933HHHOl9fXl7O5MmTOeaYY+r9mdVLtMrMSS1btuS0004DMpusP/zww+t835UrV9a4\n", "y2Fd0vi+kiTlG0sqNYYrgeSmFScT45w0wkiS1JT+9a9/1Tju0KED2223XUppGlf1kqo+m6ZXqryz\n", "4X/+8596v+baa6/lf//7HwCzZ8+u2v9p1apV3H777VXP69KlS52vv/766ykvL29QafP+++8D0Llz\n", "56qzv+pyyimnsPvuuwNw00038cUXX6z1fa+//nrmzZtXdbx48eJaz0nj+0qSlG8sqbRhQjgE+FFi\n", "+idivC+NOJIkNbVkSVVZ0BSCypIqhNCgkmqPPfYA4NNPP11noVPps88+q3p8/PHH0759ewAmTZpE\n", "RUUFRx11VI1M1T300ENcd911TJo0qUF34HvrrbcAqgqoNSkqKmLSpElst912zJs3j1NOOYVFixbV\n", "+dzbbruNyZMn06FDByBz9tWdd95Z62TyNL6vJEn5xpJK6y+E7sDUxPR9YEwKaSRJyopkSVUom6bD\n", "6rsW9ujRg0033bTer9thhx3o3LkzMUbefPPNer2mspQ54IADOP300/n000+ZOHEiU6ZM4cYbb2T8\n", "+PH07t2bhx56iJtvvpnPP/+cmTNncv7553P22WczderUBhVpsLqk2meffdb53B49enD//fczbNgw\n", "pk2bxkEHHcQdd9zBrFmzmD17No8++ijHHnssU6ZM4e6776Zjx9U3N77hhhvo378/gwcPrtprKo3v\n", "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\n" ], "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 403, "width": 596 } }, "output_type": "display_data" } ], "source": [ "# %load http://matplotlib.org/mpl_examples/showcase/integral_demo.py\n", "\"\"\"\n", "Plot demonstrating the integral as the area under a curve.\n", "\n", "Although this is a simple example, it demonstrates some important tweaks:\n", "\n", " * A simple line plot with custom color and line width.\n", " * A shaded region created using a Polygon patch.\n", " * A text label with mathtext rendering.\n", " * figtext calls to label the x- and y-axes.\n", " * Use of axis spines to hide the top and right spines.\n", " * Custom tick placement and labels.\n", "\"\"\"\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.patches import Polygon\n", "\n", "\n", "def func(x):\n", " return (x - 3) * (x - 5) * (x - 7) + 85\n", "\n", "\n", "a, b = 2, 9 # integral limits\n", "x = np.linspace(0, 10)\n", "y = func(x)\n", "\n", "fig, ax = plt.subplots()\n", "plt.plot(x, y, 'r', linewidth=2)\n", "plt.ylim(ymin=0)\n", "\n", "# Make the shaded region\n", "ix = np.linspace(a, b)\n", "iy = func(ix)\n", "verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)]\n", "poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')\n", "ax.add_patch(poly)\n", "\n", "plt.text(0.5 * (a + b), 30, r\"$\\int_a^b f(x)\\mathrm{d}x$\",\n", " horizontalalignment='center', fontsize=20)\n", "\n", "plt.figtext(0.9, 0.05, '$x$')\n", "plt.figtext(0.1, 0.9, '$y$')\n", "\n", "ax.spines['right'].set_visible(False)\n", "ax.spines['top'].set_visible(False)\n", "ax.xaxis.set_ticks_position('bottom')\n", "\n", "ax.set_xticks((a, b))\n", "ax.set_xticklabels(('$a$', '$b$'))\n", "ax.set_yticks([])\n", "\n", "plt.show()\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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/IPython Kernel/data/000077500000000000000000000000001477474304100206365ustar00rootroot00000000000000ipython-8.35.0/examples/IPython Kernel/data/flare.json000066400000000000000000000262261477474304100226320ustar00rootroot00000000000000{ "name": "flare", "children": [ { "name": "analytics", "children": [ { "name": "cluster", "children": [ {"name": "AgglomerativeCluster", "size": 3938}, {"name": "CommunityStructure", "size": 3812}, {"name": "HierarchicalCluster", "size": 6714}, {"name": "MergeEdge", "size": 743} ] }, { "name": "graph", "children": [ {"name": "BetweennessCentrality", "size": 3534}, {"name": "LinkDistance", "size": 5731}, {"name": "MaxFlowMinCut", "size": 7840}, {"name": "ShortestPaths", "size": 5914}, {"name": "SpanningTree", "size": 3416} ] }, { "name": "optimization", "children": [ {"name": "AspectRatioBanker", "size": 7074} ] } ] }, { "name": "animate", "children": [ {"name": "Easing", "size": 17010}, {"name": "FunctionSequence", "size": 5842}, { "name": "interpolate", "children": [ {"name": "ArrayInterpolator", "size": 1983}, {"name": "ColorInterpolator", "size": 2047}, {"name": "DateInterpolator", "size": 1375}, {"name": "Interpolator", "size": 8746}, {"name": "MatrixInterpolator", "size": 2202}, {"name": "NumberInterpolator", "size": 1382}, {"name": "ObjectInterpolator", "size": 1629}, {"name": "PointInterpolator", "size": 1675}, {"name": "RectangleInterpolator", "size": 2042} ] }, {"name": "ISchedulable", "size": 1041}, {"name": "Parallel", "size": 5176}, {"name": "Pause", "size": 449}, {"name": "Scheduler", "size": 5593}, {"name": "Sequence", "size": 5534}, {"name": "Transition", "size": 9201}, {"name": "Transitioner", "size": 19975}, {"name": "TransitionEvent", "size": 1116}, {"name": "Tween", "size": 6006} ] }, { "name": "data", "children": [ { "name": "converters", "children": [ {"name": "Converters", "size": 721}, {"name": "DelimitedTextConverter", "size": 4294}, {"name": "GraphMLConverter", "size": 9800}, {"name": "IDataConverter", "size": 1314}, {"name": "JSONConverter", "size": 2220} ] }, {"name": "DataField", "size": 1759}, {"name": "DataSchema", "size": 2165}, {"name": "DataSet", "size": 586}, {"name": "DataSource", "size": 3331}, {"name": "DataTable", "size": 772}, {"name": "DataUtil", "size": 3322} ] }, { "name": "display", "children": [ {"name": "DirtySprite", "size": 8833}, {"name": "LineSprite", "size": 1732}, {"name": "RectSprite", "size": 3623}, {"name": "TextSprite", "size": 10066} ] }, { "name": "flex", "children": [ {"name": "FlareVis", "size": 4116} ] }, { "name": "physics", "children": [ {"name": "DragForce", "size": 1082}, {"name": "GravityForce", "size": 1336}, {"name": "IForce", "size": 319}, {"name": "NBodyForce", "size": 10498}, {"name": "Particle", "size": 2822}, {"name": "Simulation", "size": 9983}, {"name": "Spring", "size": 2213}, {"name": "SpringForce", "size": 1681} ] }, { "name": "query", "children": [ {"name": "AggregateExpression", "size": 1616}, {"name": "And", "size": 1027}, {"name": "Arithmetic", "size": 3891}, {"name": "Average", "size": 891}, {"name": "BinaryExpression", "size": 2893}, {"name": "Comparison", "size": 5103}, {"name": "CompositeExpression", "size": 3677}, {"name": "Count", "size": 781}, {"name": "DateUtil", "size": 4141}, {"name": "Distinct", "size": 933}, {"name": "Expression", "size": 5130}, {"name": "ExpressionIterator", "size": 3617}, {"name": "Fn", "size": 3240}, {"name": "If", "size": 2732}, {"name": "IsA", "size": 2039}, {"name": "Literal", "size": 1214}, {"name": "Match", "size": 3748}, {"name": "Maximum", "size": 843}, { "name": "methods", "children": [ {"name": "add", "size": 593}, {"name": "and", "size": 330}, {"name": "average", "size": 287}, {"name": "count", "size": 277}, {"name": "distinct", "size": 292}, {"name": "div", "size": 595}, {"name": "eq", "size": 594}, {"name": "fn", "size": 460}, {"name": "gt", "size": 603}, {"name": "gte", "size": 625}, {"name": "iff", "size": 748}, {"name": "isa", "size": 461}, {"name": "lt", "size": 597}, {"name": "lte", "size": 619}, {"name": "max", "size": 283}, {"name": "min", "size": 283}, {"name": "mod", "size": 591}, {"name": "mul", "size": 603}, {"name": "neq", "size": 599}, {"name": "not", "size": 386}, {"name": "or", "size": 323}, {"name": "orderby", "size": 307}, {"name": "range", "size": 772}, {"name": "select", "size": 296}, {"name": "stddev", "size": 363}, {"name": "sub", "size": 600}, {"name": "sum", "size": 280}, {"name": "update", "size": 307}, {"name": "variance", "size": 335}, {"name": "where", "size": 299}, {"name": "xor", "size": 354}, {"name": "_", "size": 264} ] }, {"name": "Minimum", "size": 843}, {"name": "Not", "size": 1554}, {"name": "Or", "size": 970}, {"name": "Query", "size": 13896}, {"name": "Range", "size": 1594}, {"name": "StringUtil", "size": 4130}, {"name": "Sum", "size": 791}, {"name": "Variable", "size": 1124}, {"name": "Variance", "size": 1876}, {"name": "Xor", "size": 1101} ] }, { "name": "scale", "children": [ {"name": "IScaleMap", "size": 2105}, {"name": "LinearScale", "size": 1316}, {"name": "LogScale", "size": 3151}, {"name": "OrdinalScale", "size": 3770}, {"name": "QuantileScale", "size": 2435}, {"name": "QuantitativeScale", "size": 4839}, {"name": "RootScale", "size": 1756}, {"name": "Scale", "size": 4268}, {"name": "ScaleType", "size": 1821}, {"name": "TimeScale", "size": 5833} ] }, { "name": "util", "children": [ {"name": "Arrays", "size": 8258}, {"name": "Colors", "size": 10001}, {"name": "Dates", "size": 8217}, {"name": "Displays", "size": 12555}, {"name": "Filter", "size": 2324}, {"name": "Geometry", "size": 10993}, { "name": "heap", "children": [ {"name": "FibonacciHeap", "size": 9354}, {"name": "HeapNode", "size": 1233} ] }, {"name": "IEvaluable", "size": 335}, {"name": "IPredicate", "size": 383}, {"name": "IValueProxy", "size": 874}, { "name": "math", "children": [ {"name": "DenseMatrix", "size": 3165}, {"name": "IMatrix", "size": 2815}, {"name": "SparseMatrix", "size": 3366} ] }, {"name": "Maths", "size": 17705}, {"name": "Orientation", "size": 1486}, { "name": "palette", "children": [ {"name": "ColorPalette", "size": 6367}, {"name": "Palette", "size": 1229}, {"name": "ShapePalette", "size": 2059}, {"name": "SizePalette", "size": 2291} ] }, {"name": "Property", "size": 5559}, {"name": "Shapes", "size": 19118}, {"name": "Sort", "size": 6887}, {"name": "Stats", "size": 6557}, {"name": "Strings", "size": 22026} ] }, { "name": "vis", "children": [ { "name": "axis", "children": [ {"name": "Axes", "size": 1302}, {"name": "Axis", "size": 24593}, {"name": "AxisGridLine", "size": 652}, {"name": "AxisLabel", "size": 636}, {"name": "CartesianAxes", "size": 6703} ] }, { "name": "controls", "children": [ {"name": "AnchorControl", "size": 2138}, {"name": "ClickControl", "size": 3824}, {"name": "Control", "size": 1353}, {"name": "ControlList", "size": 4665}, {"name": "DragControl", "size": 2649}, {"name": "ExpandControl", "size": 2832}, {"name": "HoverControl", "size": 4896}, {"name": "IControl", "size": 763}, {"name": "PanZoomControl", "size": 5222}, {"name": "SelectionControl", "size": 7862}, {"name": "TooltipControl", "size": 8435} ] }, { "name": "data", "children": [ {"name": "Data", "size": 20544}, {"name": "DataList", "size": 19788}, {"name": "DataSprite", "size": 10349}, {"name": "EdgeSprite", "size": 3301}, {"name": "NodeSprite", "size": 19382}, { "name": "render", "children": [ {"name": "ArrowType", "size": 698}, {"name": "EdgeRenderer", "size": 5569}, {"name": "IRenderer", "size": 353}, {"name": "ShapeRenderer", "size": 2247} ] }, {"name": "ScaleBinding", "size": 11275}, {"name": "Tree", "size": 7147}, {"name": "TreeBuilder", "size": 9930} ] }, { "name": "events", "children": [ {"name": "DataEvent", "size": 2313}, {"name": "SelectionEvent", "size": 1880}, {"name": "TooltipEvent", "size": 1701}, {"name": "VisualizationEvent", "size": 1117} ] }, { "name": "legend", "children": [ {"name": "Legend", "size": 20859}, {"name": "LegendItem", "size": 4614}, {"name": "LegendRange", "size": 10530} ] }, { "name": "operator", "children": [ { "name": "distortion", "children": [ {"name": "BifocalDistortion", "size": 4461}, {"name": "Distortion", "size": 6314}, {"name": "FisheyeDistortion", "size": 3444} ] }, { "name": "encoder", "children": [ {"name": "ColorEncoder", "size": 3179}, {"name": "Encoder", "size": 4060}, {"name": "PropertyEncoder", "size": 4138}, {"name": "ShapeEncoder", "size": 1690}, {"name": "SizeEncoder", "size": 1830} ] }, { "name": "filter", "children": [ {"name": "FisheyeTreeFilter", "size": 5219}, {"name": "GraphDistanceFilter", "size": 3165}, {"name": "VisibilityFilter", "size": 3509} ] }, {"name": "IOperator", "size": 1286}, { "name": "label", "children": [ {"name": "Labeler", "size": 9956}, {"name": "RadialLabeler", "size": 3899}, {"name": "StackedAreaLabeler", "size": 3202} ] }, { "name": "layout", "children": [ {"name": "AxisLayout", "size": 6725}, {"name": "BundledEdgeRouter", "size": 3727}, {"name": "CircleLayout", "size": 9317}, {"name": "CirclePackingLayout", "size": 12003}, {"name": "DendrogramLayout", "size": 4853}, {"name": "ForceDirectedLayout", "size": 8411}, {"name": "IcicleTreeLayout", "size": 4864}, {"name": "IndentedTreeLayout", "size": 3174}, {"name": "Layout", "size": 7881}, {"name": "NodeLinkTreeLayout", "size": 12870}, {"name": "PieLayout", "size": 2728}, {"name": "RadialTreeLayout", "size": 12348}, {"name": "RandomLayout", "size": 870}, {"name": "StackedAreaLayout", "size": 9121}, {"name": "TreeMapLayout", "size": 9191} ] }, {"name": "Operator", "size": 2490}, {"name": "OperatorList", "size": 5248}, {"name": "OperatorSequence", "size": 4190}, {"name": "OperatorSwitch", "size": 2581}, {"name": "SortOperator", "size": 2023} ] }, {"name": "Visualization", "size": 16540} ] } ] } ipython-8.35.0/examples/IPython Kernel/example-demo.py000066400000000000000000000022361477474304100226570ustar00rootroot00000000000000# -*- coding: utf-8 -*- """A simple interactive demo to illustrate the use of IPython's Demo class. Any python script can be run as a demo, but that does little more than showing it on-screen, syntax-highlighted in one shot. If you add a little simple markup, you can stop at specified intervals and return to the ipython prompt, resuming execution later. This is a unicode test, åäö """ print('Hello, welcome to an interactive IPython demo.') print('Executing this block should require confirmation before proceeding,') print('unless auto_all has been set to true in the demo object') # The mark below defines a block boundary, which is a point where IPython will # stop execution and return to the interactive prompt. # --- stop --- x = 1 y = 2 # --- stop --- # the mark below makes this block as silent # silent print('This is a silent block, which gets executed but not printed.') # --- stop --- # auto print('This is an automatic block.') print('It is executed without asking for confirmation, but printed.') z = x+y print('z=',x) # --- stop --- # This is just another normal block. print('z is now:', z) print('bye!') ipython-8.35.0/examples/IPython Kernel/gui/000077500000000000000000000000001477474304100205115ustar00rootroot00000000000000ipython-8.35.0/examples/IPython Kernel/gui/gui-glut.py000077500000000000000000000024211477474304100226220ustar00rootroot00000000000000#!/usr/bin/env python """Simple GLUT example to manually test event loop integration. This is meant to run tests manually in ipython as: In [5]: %gui glut In [6]: %run gui-glut.py In [7]: gl.glClearColor(1,1,1,1) """ #!/usr/bin/env python import sys import OpenGL.GL as gl import OpenGL.GLUT as glut def close(): glut.glutDestroyWindow(glut.glutGetWindow()) def display(): gl.glClear (gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) glut.glutSwapBuffers() def resize(width,height): gl.glViewport(0, 0, width, height+4) gl.glMatrixMode(gl.GL_PROJECTION) gl.glLoadIdentity() gl.glOrtho(0, width, 0, height+4, -1, 1) gl.glMatrixMode(gl.GL_MODELVIEW) if glut.glutGetWindow() > 0: interactive = True glut.glutInit(sys.argv) glut.glutInitDisplayMode(glut.GLUT_DOUBLE | glut.GLUT_RGBA | glut.GLUT_DEPTH) else: interactive = False glut.glutCreateWindow(b'gui-glut') glut.glutDisplayFunc(display) glut.glutReshapeFunc(resize) # This is necessary on osx to be able to close the window # (else the close button is disabled) if sys.platform == 'darwin' and not bool(glut.HAVE_FREEGLUT): glut.glutWMCloseFunc(close) gl.glClearColor(0,0,0,1) if not interactive: glut.glutMainLoop() ipython-8.35.0/examples/IPython Kernel/gui/gui-gtk4.py000066400000000000000000000013141477474304100225150ustar00rootroot00000000000000#!/usr/bin/env python """Simple Gtk example to manually test event loop integration. This is meant to run tests manually in ipython as: In [1]: %gui gtk4 In [2]: %run gui-gtk4.py """ import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk, GLib # noqa def hello_world(widget, data=None): print("Hello World") def close_request_cb(widget, data=None): global running running = False running = True window = Gtk.Window() window.connect("close-request", close_request_cb) button = Gtk.Button(label="Hello World") button.connect("clicked", hello_world, None) window.set_child(button) window.show() context = GLib.MainContext.default() while running: context.iteration(True) ipython-8.35.0/examples/IPython Kernel/gui/gui-qt.py000077500000000000000000000017611477474304100223010ustar00rootroot00000000000000#!/usr/bin/env python """Simple Qt4 example to manually test event loop integration. This is meant to run tests manually in ipython as: In [5]: %gui qt In [6]: %run gui-qt.py Ref: Modified from http://zetcode.com/tutorials/pyqt4/firstprograms/ """ from PyQt4 import QtGui, QtCore class SimpleWindow(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 200, 80) self.setWindowTitle('Hello World') quit = QtGui.QPushButton('Close', self) quit.setGeometry(10, 10, 60, 35) self.connect(quit, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('close()')) if __name__ == '__main__': app = QtCore.QCoreApplication.instance() if app is None: app = QtGui.QApplication([]) sw = SimpleWindow() sw.show() try: from IPython.lib.guisupport import start_event_loop_qt4 start_event_loop_qt4(app) except ImportError: app.exec_() ipython-8.35.0/examples/IPython Kernel/ipython-completion.bash000066400000000000000000000102571477474304100244320ustar00rootroot00000000000000# load with: . ipython-completion.bash if [[ -n ${ZSH_VERSION-} ]]; then autoload -Uz bashcompinit && bashcompinit fi _ipython_get_flags() { local url=$1 local var=$2 local dash=$3 if [[ "$url $var" == $__ipython_complete_last ]]; then opts=$__ipython_complete_last_res return fi # matplotlib and profile don't need the = and the # version without simplifies the special cased completion opts=$(ipython ${url} --help-all | grep -E "^-{1,2}[^-]" | sed -e "s/<.*//" -e "s/[^=]$/& /" -e "s/^--matplotlib=$//" -e "s/^--profile=$/--profile /" -e "$ s/^/\n-h\n--help\n--help-all\n/") __ipython_complete_last="$url $var" __ipython_complete_last_res="$opts" } _ipython() { local cur=${COMP_WORDS[COMP_CWORD]} local prev=${COMP_WORDS[COMP_CWORD - 1]} local subcommands="kernel profile locate history" local opts="help" if [ -z "$__ipython_complete_baseopts" ]; then _ipython_get_flags baseopts __ipython_complete_baseopts="${opts}" fi local baseopts="$__ipython_complete_baseopts" local mode="" for i in "${COMP_WORDS[@]}"; do [ "$cur" = "$i" ] && break if [[ ${subcommands} == *${i}* ]]; then mode="$i" break elif [[ ${i} == "--"* ]]; then mode="nosubcommand" break fi done if [[ ${cur} == -* ]]; then case $mode in "kernel") _ipython_get_flags $mode opts=$"${opts} ${baseopts}" ;; "locate" | "profile") _ipython_get_flags $mode ;; "history") if [[ $COMP_CWORD -ge 3 ]]; then # 'history trim' and 'history clear' covered by next line _ipython_get_flags $mode\ "${COMP_WORDS[2]}" else _ipython_get_flags $mode fi opts=$"${opts}" ;; *) opts=$baseopts esac # don't drop the trailing space local IFS=$'\t\n' COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 elif [[ $mode == "profile" ]]; then opts="list create locate " local IFS=$'\t\n' COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) elif [[ $mode == "history" ]]; then if [[ $COMP_CWORD -ge 3 ]]; then # drop into flags opts="--" else opts="trim clear " fi local IFS=$'\t\n' COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) elif [[ $mode == "locate" ]]; then if [[ $COMP_CWORD -ge 3 ]]; then # drop into flags opts="--" else opts="profile " fi local IFS=$'\t\n' COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) elif [[ ${prev} == "--matplotlib"* ]] || [[ ${prev} == "--gui"* ]]; then if [ -z "$__ipython_complete_matplotlib" ]; then __ipython_complete_matplotlib=`cat < 2: filepath = Path(sys.argv[2]) dest = open(filepath, "w", encoding="utf-8") raw = not filepath.name.endswith(".py") else: dest = sys.stdout raw = True with dest: dest.write("# coding: utf-8\n") # Profiles other than 'default' can be specified here with a profile= argument: hist = HistoryAccessor() for session, lineno, cell in hist.get_range(session=session_number, raw=raw): dest.write(cell + '\n') ipython-8.35.0/examples/IPython Kernel/ipython.desktop000066400000000000000000000006201477474304100230100ustar00rootroot00000000000000# If you want ipython to appear in a linux app launcher ("start menu"), install this by doing: # sudo desktop-file-install ipython.desktop [Desktop Entry] Comment=Enhanced interactive Python shell Exec=ipython GenericName[en_US]=IPython GenericName=IPython Icon=gnome-netstatus-idle Name[en_US]=ipython Name=ipython Categories=Development;Utility; StartupNotify=false Terminal=true Type=Application ipython-8.35.0/examples/IPython Kernel/nbpackage/000077500000000000000000000000001477474304100216405ustar00rootroot00000000000000ipython-8.35.0/examples/IPython Kernel/nbpackage/__init__.py000066400000000000000000000000001477474304100237370ustar00rootroot00000000000000ipython-8.35.0/examples/IPython Kernel/nbpackage/mynotebook.ipynb000066400000000000000000000021701477474304100250710ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# My Notebook" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def foo():\n", " return \"foo\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def has_ip_syntax():\n", " listing = !ls\n", " return listing" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def whatsmyname():\n", " return __name__" ] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/IPython Kernel/nbpackage/nbs/000077500000000000000000000000001477474304100224225ustar00rootroot00000000000000ipython-8.35.0/examples/IPython Kernel/nbpackage/nbs/__init__.py000066400000000000000000000000001477474304100245210ustar00rootroot00000000000000ipython-8.35.0/examples/IPython Kernel/nbpackage/nbs/other.ipynb000066400000000000000000000013541477474304100246110ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook just defines `bar`" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def bar(x):\n", " return \"bar\" * x" ] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/Index.ipynb000066400000000000000000000027151477474304100172510ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# IPython Documentation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This directory contains IPython's notebook-based documentation. This augments our [Sphinx-based documentation](https://ipython.org/ipython-doc/stable/index.html) with notebooks that contain interactive tutorials and examples. Over time, more of our documentation will be pulled into this format." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Topics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* IPython Kernel: IPython's core syntax and command line features available in all frontends\n", "* [Embedding](Embedding/Index.ipynb): Embedding and reusing IPython's components into other applications\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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/examples/auto_suggest_llm.py000066400000000000000000000130101477474304100210540ustar00rootroot00000000000000""" This is an example of Fake LLM Completer for IPython, as well as example on how to configure IPython for LLMs. 8.32 – this is provisional and may change. To test this you can run the following command from the root of IPython directory: $ ipython --TerminalInteractiveShell.llm_provider_class=examples.auto_suggest_llm.ExampleCompletionProvider Or you can set the value in your config file, which also allows you to set a keyboard shortcut:: c.TerminalInteractiveShell.llm_provider_class = "examples.auto_suggest_llm.ExampleCompletionProvider" c.TerminalInteractiveShell.shortcuts = [ { "new_keys": ["c-q"], "command": "IPython:auto_suggest.llm_autosuggestion", "new_filter": "navigable_suggestions & default_buffer_focused", "create": True, }, ] You can use the following configuration option to:: c.TerminalInteractiveShell.llm_constructor_kwargs = {"model_id": "mymodel"} For convenience and testing you can bind a shortcut at runtime:: In [1]: from examples.auto_suggest_llm import setup_shortcut ...: setup_shortcut('c-q') Getting access to history content --------------------------------- This uses the same providers as Jupyter AI, In JupyterAI, providers may get access to the current notebook content to pass as to the LLM as context. Here Jupyter AI documents how to get such context. https://jupyter-ai.readthedocs.io/en/latest/developers/index.html When reusing these models you may want to pass them more context as well in IPython to do so you can set the `c.TerminalInteractiveShell.llm_prefix_from_history` to `"no_prefix"`, `"input_history"` or a fully qualified name of a function that will get imported, get passed a `HistoryManager`, and return a prefix to be added the LLM context. For more flexibility, subclass the provider, and access the history of IPython via: ``` ip = get_ipython() hm = ip.history_manager() hm.get_range(...) # will let you select how many input/output... etc. ``` """ import asyncio import textwrap from typing import Any, AsyncIterable, AsyncIterator from jupyter_ai.completions.models import ( InlineCompletionList, InlineCompletionReply, InlineCompletionRequest, InlineCompletionStreamChunk, ) from jupyter_ai_magics import BaseProvider from langchain_community.llms import FakeListLLM from IPython.terminal.shortcuts.filters import ( navigable_suggestions, default_buffer_focused, ) from IPython.terminal.shortcuts.auto_suggest import llm_autosuggestion def setup_shortcut(seq): import IPython ip = IPython.get_ipython() ip.pt_app.key_bindings.add_binding( seq, filter=(navigable_suggestions & default_buffer_focused) )(llm_autosuggestion), class ExampleCompletionProvider(BaseProvider, FakeListLLM): # type: ignore[misc, valid-type] """ This is an example Fake LLM provider for IPython As of 8.32 this is provisional and may change without any warnings """ id = "my_provider" name = "My Provider" model_id_key = "model" models = ["model_a"] def __init__(self, **kwargs: Any): kwargs["responses"] = ["This fake response will not be used for completion"] kwargs["model_id"] = "model_a" super().__init__(**kwargs) async def generate_inline_completions( self, request: InlineCompletionRequest ) -> InlineCompletionReply: raise ValueError("IPython 8.32 only support streaming models for now.") async def stream_inline_completions( self, request: InlineCompletionRequest ) -> AsyncIterator[InlineCompletionStreamChunk]: token_1 = f"t{request.number}s0" yield InlineCompletionReply( list=InlineCompletionList( items=[ {"insertText": "It", "isIncomplete": True, "token": token_1}, ] ), reply_to=request.number, ) reply: InlineCompletionStreamChunk async for reply in self._stream( textwrap.dedent( """ was then that the fox appeared. “Good morning,” said the fox. “Good morning,” the little prince responded politely, although when he turned around he saw nothing. “I am right here,” the voice said, “under the apple tree.” “Who are you?” asked the little prince, and added, “You are very pretty to look at.” “I am a fox,” said the fox. “Come and play with me,” proposed the little prince. “I am so unhappy.” """ ).strip(), request.number, token_1, start_with="It", ): yield reply async def _stream( self, sentence: str, request_number: int, token: str, start_with: str = "" ) -> AsyncIterable[InlineCompletionStreamChunk]: suggestion = start_with for fragment in sentence.split(" "): await asyncio.sleep(0.05) suggestion += " " + fragment yield InlineCompletionStreamChunk( type="stream", response={"insertText": suggestion, "token": token}, reply_to=request_number, done=False, ) # finally, send a message confirming that we are done yield InlineCompletionStreamChunk( type="stream", response={"insertText": suggestion, "token": token}, reply_to=request_number, done=True, ) ipython-8.35.0/examples/images/000077500000000000000000000000001477474304100163775ustar00rootroot00000000000000ipython-8.35.0/examples/images/FrontendKernel.graffle/000077500000000000000000000000001477474304100227245ustar00rootroot00000000000000ipython-8.35.0/examples/images/FrontendKernel.graffle/data.plist000066400000000000000000000237441477474304100247240ustar00rootroot00000000000000 ActiveLayerIndex 0 ApplicationVersion com.omnigroup.OmniGraffle 139.18.0.187838 AutoAdjust BackgroundGraphic Bounds {{0, 0}, {576, 733}} Class SolidGraphic ID 2 Style shadow Draws NO stroke Draws NO BaseZoom 0 CanvasOrigin {0, 0} ColumnAlign 1 ColumnSpacing 36 CreationDate 2014-05-27 21:39:30 +0000 Creator bgranger DisplayScale 1 0/72 in = 1.0000 in GraphDocumentVersion 8 GraphicsList Class LineGraphic ControlPoints {0, 0} {-7, 8} {6.9999849080788863, -8.0000033519149838} {0, 0} ID 29 Points {164, 341.5} {186.5, 338} {196, 327.5} Style stroke Bezier HeadArrow 0 Legacy LineType 1 TailArrow 0 Bounds {{107.64779663085938, 305.5}, {69.088050842285156, 84.499992370605469}} Class ShapedGraphic ID 9 ImageID 1 Shape Rectangle Style fill Draws NO shadow Draws NO stroke Draws NO Class LineGraphic Head ID 6 Position 0.53676468133926392 ID 8 Points {288.09285678056523, 276} {288.49999833106995, 304.50001973116196} Style stroke HeadArrow FilledArrow Legacy LineType 1 TailArrow 0 Tail ID 7 Bounds {{207, 263}, {162, 13}} Class ShapedGraphic FitText YES Flow Resize ID 7 Shape Rectangle Style fill Draws NO shadow Draws NO stroke Draws NO Text Pad 0 Text {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 xkcd-Regular;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc \f0\fs20 \cf0 Interactive Computing Protocol} VerticalPad 0 Wrap NO Class LineGraphic Head ID 1 ID 6 Points {252, 304.50001973116196} {320, 304.50001973116196} Style stroke HeadArrow FilledArrow Legacy LineType 1 Pattern 1 TailArrow FilledArrow Tail ID 5 Bounds {{186.5, 286.5}, {65, 36}} Class ShapedGraphic ID 5 Shape Rectangle Style shadow Draws NO Text Text {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 xkcd-Regular;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc \f0\fs20 \cf0 Frontend} Bounds {{320.5, 286.5}, {65, 36}} Class ShapedGraphic ID 1 Shape Rectangle Style shadow Draws NO Text Text {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 xkcd-Regular;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc \f0\fs20 \cf0 Kernel} GridInfo GuidesLocked NO GuidesVisible YES HPages 1 ImageCounter 2 ImageLinkBack ImageList image1.png KeepToScale Layers Lock NO Name Layer 1 Print YES View YES LayoutInfo Animate NO circoMinDist 18 circoSeparation 0.0 layoutEngine dot neatoSeparation 0.0 twopiSeparation 0.0 LinksVisible NO MagnetsVisible NO MasterSheets ModificationDate 2014-05-27 22:28:18 +0000 Modifier bgranger NotesVisible NO Orientation 2 OriginVisible NO PageBreaks YES PrintInfo NSBottomMargin float 41 NSHorizonalPagination coded BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG NSLeftMargin float 18 NSPaperSize size {612, 792} NSPrintReverseOrientation int 0 NSRightMargin float 18 NSTopMargin float 18 PrintOnePage ReadOnly NO RowAlign 1 RowSpacing 36 SheetTitle Canvas 1 SmartAlignmentGuidesActive YES SmartDistanceGuidesActive YES UniqueID 1 UseEntirePage VPages 1 WindowInfo CurrentSheet 0 ExpandedCanvases name Canvas 1 Frame {{277, 7}, {832, 871}} ListView OutlineWidth 142 RightSidebar ShowRuler Sidebar SidebarWidth 120 VisibleRegion {{96.5, 197.5}, {348.5, 366}} Zoom 2 ZoomValues Canvas 1 2 1 ipython-8.35.0/examples/images/FrontendKernel.graffle/image1.png000066400000000000000000000346061477474304100246060ustar00rootroot00000000000000PNG  IHDR) pHYs  FiCCPPhotoshop ICC profilexڭYWT'C鐓sY9s`DPTT@QP $QQċ Dŀ̇}Ǭ5ѫ]U{u&$Ġqt+S0 X108)W<}[HhR0A!Ie@O \dpҽ}@dΠ_p\dJ` =jdj=.$23hbcC_Lп ArdȤ ؘ5DAvN*:(HS\FG`@:#CkuDpp B@eLv7YidۺAwYϏFlj/ Mp VLf/h[jFד]cG2#6S\@ [`ؤ}ab 'GYCB-~żB` ɦ.̄'u,4IcnsƢm~i=9 hC@[?c @puw' \!@Bҟ8S:B*?诣A !B! ! q=7čqC\u~X~W%Z͉DK1t0;PH:BGxEG"&^"#wC9 `R֧ A9kসn AWǵq5pSG?zoT9ƺ?W?ˌB `UlZ`m k;%!O58QnPW^o!Cӓ24PM\:# pW @vh I  Np0 p8Ȁ&1X-8xC` @>>8P p paakXAŒp |"#6bX  HlAv"EHR@ H;r@!Id|C1rBj&nFD4Eh zmA(:F10nLS130: +ʱ<ցc"'8 Wpkm?$$0 ] NH# ̈́Q 3H&JDob1xH%#NI$Id@r$I#siBf"Uɖdry|M!ϒ32H22820d00d`0𝑍Qрэ110yO?2111093E2e3fjb4NQ6QR(Ŕ:J/1#331s2s1s=5+T"ՆBNPGoYX$YLXX2YY.eYde`b5c dZuM͑-mY9v{{.{-5iCÌ#c'I3DNiN("ο88عԹ<ҹ*&1n)ncxxLxByv+kWwO?QS@O XP *('"%X+xGpYHXJ(A5Eanac(""""DzDh\4Z 0:mITPZ4Ew1i1wbbŵ/IH8HlhdԖ<$yS򋔴.V9i^iL22F2252dڲѲGeP9 J򨼦|Q{t6mP`Р0ȭhCU񭒄RM1'تPP*Z@YRmZ{uyPc4844viiҤkלג ЪzͩGATgNW]Md݋Kԟ6348a0aH3 0>}}-|lؔil~~1~],gVkl͂192jZ:fV6n?|>(m}&1':;v|鹳#W(7;w:*!OKoWu^Y0[m? C o) s{{׊ÊJ4K#7VjTz,lz>?8P^^}PʡێHwd"bҴJjw՗!GG;_-T]TxG'NHՔkSk_8yN8rzV}Y% hCJM2܍EMДҴp!E}/,yihYjhhnnס|EJ]hgeWWI7cwnZOfroB}}Oy]{p -4sV@mۭ-w44wP]m:u\o~̓э=pQȣ1ߏk^ȾhМ43:d:xˤ3_ϊϩu[/.̼Nx}1 ۛ2o/3~wgki=ڇ=>}RԷs_ WV|zi?dtt-vm-!aa8 CP 0BL#rHҋ8f]íX"l@bxTE)a>eeec1ƽ(%D#""6.Qr@ZIX͆jJf{U՘M54z't~Z$2o豼o5ofewccSsKk[{Ǡc>Ӿsl{?t,xoHfhXs^D$5sԋؽq ZIɵ)yai6 wޚ-m{b6='sG]y/v1N(-X_XPُj9߾pubXߏxSrg/J++_>f5GO55 ?C:@8{dUCя?6 D*J'3T13R ݨ,٬ٮsrqsg4W v 3xΊHHHhFAKIMZW5\-Q=CcfV!IQf,,[XDzYk;Hor?9M9sumr;^e#K}ils_a@|[z0%x*=$,,\?-U䕨XDUPdzY*WlZ{ L,4ƭEbgikkW '~,)ؗTC58WVU;:|qN5;kO?Xxrs[n& ;/޸Lhj)hN갸STլc׮\1>q[tPC>w#_qslأǟ`O9I>~a?>Y;5RzUٹ +7o.ei/.+~[]8llEH.(Gc~m\o!hNiRY|a/c0>Ey:z0{1GgW>w~j6..nnfE)RedA\|‚bR ʤjZ}ͣZ+:ݺyzv5QFF&̾_(`mSha'jھ!{#Ss+zۭǃ1y+[-亙{cJBm 9v7(""DFD/ =ߟ1x|*/'nڮt,Z-m6-@NƎr|Cw./<]ԲhLɧRc僺fl;~tsՃHf>-]YsOΫ44=y]mO;ԮvNuvt[ 7Z9rAXӣϞ ɺ oY,4z@85 qN@ i bu`xPD"dB 4=E?a ڱ) =xN0"NFDb:"q$C 'ՑɊr9Fы")iM9Lf3?RYdX*XYsXųͱ̕M>ʣsחw_@.aSJu"Q*%e)-)CYCbRE6^Apm.q]=}e9C1jiYyE-fb䰰qqik׏n?<?&=6FthX8xD1:wCҷT4܌̟[,:!N|]ӻw9_l\2QZ!#i7 ֠_O}{[ذ׻ ?.[ڔ:;#{S]z+v̝ᶑQчW?y\e"gjtF~`~v߬},ΐ/&DErzdyrhZ61 S<ghIP!D=q7@*#%tr7C C?8&[16 1m4naaYd5hCղ w8Ӓ &nU}gfn?!^a%?ԣ#cދGTIWRYҴ22۲flپ5bNy xv{+zW8,~啇GvWRy"ri3x}S_5_T4\ٮ񡳣{G}ϵM7 r;}/GROgS/'Kf賮 Ջo.3\r#߄WY<` P wa QE# #*h+b^>lpC<oŗ TB@t$VHz}99$!)=c/SŔrٛyՑ=[9!ZJb|ik~9F%foo_QQѩǧgϞ>>>Ç{.Dڸqc[oP( D"p8oɺYٳm2??WT>|ǧ_s }]YUV/`Ä 6o|ҥ6}~3gnhߧL\.w!!! 4hEŋ$(=V])d.=G7EFF"9bAg4dff6L0 [lɓ'|~=Fll,B(<@7333}=I^Beee(F cR^SIl6a `nnNRe2YCC^L&BZF !T^^'2 .4 'OIjjj`P~4 ݻ'y5BH#ᣏ>BIGR|4 :Fx#MYDDR<{l?ŋBaaa: 3f N8ŏbe:aԩ\.]~+#..!4yd}Չt:nٲ!4hР. BX.ܺuC%P__/^gXbBhҤIƛ:㦿 BյڵkQ'OtӠA!>N׽o>ܘY4Aƹs:+*++{9sf׿%KL:5''Ǡiq!.[XX! %]2 H$JsAӀyB={lk>vC144T$uPغu+B ?bϞ==!~/pvuu]~=J0tpDÆ CYXX$''wVuuu+VliӦI$pZf]TT @0w\Ha0lѢEo޼iMjjj;wTTj;͛u6t[armV[[VWWo# _;""gϞJ8h 7߿|rڴi'N=ztLLLRR...~w9k,L&O2%11Qp d_m'e2cǎmM/N3f̏?XZZj 묨(ss͛7H/_궝+]d8o޼UTT!ͭ_~0`~+5 ˭OKRo߾mVuJS.obe.e %z!?)J{l6[( .] fF7|CP6oެۛwbaLVVBƍYVV;eF8& S)i wTϟ?Gœھ}{ ]uRS&$$;hh ~~~-[ ~رc;[6vڕzCyxxddd&&&s~LHAIΝ; |(8qW|7|t1R iwޅ+bxΜ9=szx㉨#@ƚ5k y(q7"" 4@ɱ۷cFP4h7owA 8PSIII!VVVf4@$ȑ#xݻ!C4'UUUpʕ+/

}4>5tPp^ Dbii9eʔ#Gzyyjslƍ`MMM`P0eప\}t՚7n,]SQL;a)ٳg4בF?Ұo>''/^l "zFRs"R]mBX RKBq;v0M6u׵a4ΰod奤| ;&^㣏> ǎ3uV__ߦ&Bm@ !www-m/_ZpCԓazxgj̅ B...;jЌcٳfolh:-mƍJMMp(@ͬ&Oܻw/_ݻ@®]E"P(hƊX,~a8$;x` Êuyy7o$H?ȑ#lRRRaf\.ٙ2L333;;xIII111111`3 Aerrr28Huuu81!tʕ>_r8N6mHHHXfU*UeeeLL̹s窫;hƍ~9˗ J_}4ysgƏpBKdv;wĉ9N{RXX| Ǐ۷oe( >! ˗/}}}[jܿ .߿077744|>T>y򤼼555o޼R*|d2bß7oTG nIdbnʕ %11/_2VA1Kjy\.‚̛7ՕFYYYq\*ZUUR֩S~:  R;gX?رcر]իWUj()--8p ByR777///GGGaaaammmmmRI oooT*8N8q"Áx L&dl6L&HѤQo:;;d ?{ҥK–CCZZѣR)ŐQ ggg(HAǏ755T6EfJeeeҥKsrrRSS+++7lhjjJrWχ` a`p8333Fӹ\n󯆬/𤣢 әd&%%1 TJG&_~aHz ÔJeCCNW*"J,WUUT۷]mRmm-d,_\" K-Jq<((!t޽vZ;vУe'Ӿѐ^^^w^ FzD"ѢU__/CCC333SRR@ 0{A%UTT@%,$1L¹p8MMMb:;2JEt:ᘛktBEёJ744[t:R]_b"b=zS UbG@ a87||IIѣGB}Y;FCD pU\.rrN:g Arl/\Ў3Tb?4R1I rmoB D"* !D kGHHHxxD"͸6W^ ;` o߾ƍ䔟ձcΙ3lEff&QӧOOII9} rM$J)͛7A\&ƆJr C}O.?{`duuuQ"H$P(HY NX,affF"X,(@$GD"'3L[[[. ť1%!*!lٲ>%@xuu5$ɯ^j1dƢzT*onnnsN0s, Z@|DGG~VVV>W53""❯i 81 3h:~ #F&Y@@@}?wիW/\p֭}Zvj*.\(t2?]DB{HMM)=Xwߩn1nΜ99sx<$>JR( >_YY͛ H " bGe6!BCCUfffj1 ޑEX|ӧO7 ~~~-5hO]tVVVPPٳl2dȐtb@'NHLq|͓ &9d???kkk 0 +++[reDDaҺ 8Cvff&{m۶M#9B˗6m:u!C|||\{\n``ŋ>lD0:.ȝ>}:d2#VTGFX}w 7n1cF@@d{V\ S>c_ Jmqب(qvRveeeZZڱcDzEC;53RmCC]\\.\HT;s܄4WWW?\(C t:?8Ҳ%v`0>䓟~6m:tP```ZZͲe C;$IjjjjjN.uvv߿!C "یq,~aÆݻǗ8x|6łi &kjjjjj ;+''X<=zi fO>-))yoH$ؓ:tСC!#MK䵺ݻ=}G X8֭[ 7o&Ynnn6m}vGL*** ?7)‹ [jO/2f̘k׮*z…BF=Y{-a'++ɓ'}isiHHȡC7DKC\t:$m+/8>k,@0uԔsҿrs;ZVVN8w\VVV=~8Hk _(jTMc-ꤢk_m|@44BKh&;c|84̜9gΜ!.Bj{|||' A{1A'`kkKrȰ8pN45Fڃks@&Ypp0! X4XZZVg}4? F[ڵkWĭZ9" !9rX0={LJ0ӦM;p@ZZZxc,X@V24X6::>}L8qРAAAAvvv)))/^!B666}qrrrqqwppq\*BdMMܹC IOOwww е;K.G,Yr'O]vȑnnnm:;D"M0aΝ`ccӦ- Mx//h"ËRWRR򊊊#T (CT^reڵ&Mҡx,Q*bZyw ^ttݻDp)oJv   Jx<ޞ={fΜ{ 1%-O?rwڤ$^^^UUU@H$+\`9(hx/D"QYYt@•Fj#pk+ 8û obQQQX0b4@Wظq_14`( m GRڶrg+4, \԰4ZIJh-+@  Q *Z[[R,֭[틳l2Pg$`mmVW^%6\.k {! ѣGl.z?<<<<..nÆ {8š3 p+@M6l5jĔ:S=dӎfZpR"Sbޑ222Š_uKw;VGЁ4Ihpz3AMIttt|||UUpdk V+Tu,-- 8;JCh dD1% h1 SIPJJJ4R!xn2VHR}}}U*k޸4@x^ (k~ޡ.l4E ;@ׄq5M jJamhi-B4֦H$C~~~ "%%2FȨ3 .^([L4 !LDlhAma={lK MMMd/`;zժU?04P(]ECN{âEB_}Ec,A#E nn:z;_`^Xj %熜+Wh4ZпZ8HF1/PJʕ+[>-- !deez[Ű0c1JeXs[YYYT^#+HlPj}v PnjjZRRB(;ӥReڴ}0|X5Njt5G455kpppKZPSS5GԍG&MhtߍQQQ񇇇ŋ!m>++Çyyy +0L6ңG>|x„ ˗/:HxhٳgC333-Zݦs*d2q dNevߺh4DGG8qD"EFFN28 ϯ_~,  gϞ {ݻwuo~F5wmȅ̉䯾 _e4Sh(((St:="""$$'O J5N,Ø> T(H1|daz c۶m eϞ=c2ptpXi8$ a #((H 3fԨQ˗/7!S:)/^v…gϞ :ju =}4hIK]Tf$>B׸X*nG*Ћr9NhjjjnnnaaIBCaXb0sss&͛H'w: sYnݬY>쳒HCEF zJ&V8[+"̓֫ɓ''N,**Znq8LEAP,--MMM p8,KPl7#.JAYb:R) FJ$PAĩ`0(ĉK'O 1cFqʕ+𷱱111155uvvn H":CFg]@C7 R+覡4o#p! xJIENDB`ipython-8.35.0/examples/images/FrontendKernel.png000066400000000000000000001006221477474304100220260ustar00rootroot00000000000000PNG  IHDRn.7 AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYsgRiTXtXML:com.adobe.xmp 5 2 1 2@IDATxR@!&$!!$!X 'H`ݡ Ŋk܋$%x&{Wܽ{=Μ9ٙ*%HB@! jkB@! ! A! A@-#'JB@! ! B@d(uS! "nB@!D2rM! B@B@! @FqȉR7B@! k@! A@-#'JB@! ! B@d(uS! "nB@!D2rM! B@B@! @FqȉR7B@! k@! A@-#'JB@! ! B@d(uS! "nB@!D2rM! B@B@! @FqȉR7B@!0 BvKѣ 'vj&ON:p>}~;>3=ӆ9\a4LS. ^0`@|O__]wf-la-ȷW?pGUVY%nw5\6tӰRKy͖cf|I8W_} KڪY]6p~ꫯ.?ΡgϞpop=^8޶,,Xps=\Ozg /?s֭iֲq'+om5\LbOaر᭷_\~ݲog=wqa 7 m_e>=3{h%s,,Tp7'}2t[mՂgčJ1MYJ;{;+᪫ \뮻nfm QGe>3o a-BF'BHܬG3\$?EhyvD[r%[{JZ38c.fmf{]O~uYs;sR}L.|͢&wqHjK?zdQ[s.hrlO 7ܐD!:&wz|Yz|=X|}eͽ;ߖ\~?[_ƗUז%ٟHr#FHL3͔馛SK(\^Rb|@Km` Ҏe9,8tAͮ^]~Ba ! j^<;\Լ:+^ i+[??)P7ҌZ\N~s|5K'|Ҫ+CF rV>j;HFR ;yy_|rY}us-@V]Юd[sW^ye5X#'j%sIG ^.jyO?ݶEWd iI&v ^[M{yV_[P"6vcb:XQVM6$krQs?g5KmJ1RVrB__l5jWmˋ.5\M7F=wM"m\v7ES^kg4w}cn2u?]ۚh K>ɱg}չF5qwy0/Bg}?>F@Djren;8At)ϴ6~HM ÅMPyCy7l[4M'2:s.E >^pR{?>wU]YzO%Ҹ5.v92 KRI ׯ9CSdOF-菒ܜ_>BVPDv)wA h? jIIjx9+rFhvKeM7ʳ?nLNs-0K%Ģ5'Ok8fQZP;if~xZCԯz[wt N]+l`z]wN iRev؟ӶpQӪ?#ObSyN4nl S+rY~mg1j9(U?]s¥/g߬N/"AcS^pG -9LJ{mW4YL(,Q{C:cϑo)Ds9G-\~{|!H7J])e8#^@hmz䝔ę)|+9@%u!lcK -\Ѥk۸N#pMRU|!<Hx?{=,~FMjxhO˯G a~=j?Ůݶ/$8=gǞ IJ~)<[ôvʽf+k]V`Z!QgFqk+@@!P?$D?|0gg67ӼИ@'"arIxYF{9A_6IґW>_v @-͆I.~BLDpW,i;cy) i/sOe„ v&沖?!/'ŤpD$cH: dAEC@RLZR_lh9I&h7!1J0grh4+)ю*8HRF  rѢ TjiX'k](N"pv] Wr(Xk-I m" U %qV F~F Jh8`ϹAd?iS53q43例AٵۮvMe1[ĭθ[$5!惼NjCJ9p3-R} 5G]?$rj69b4fAK4:l? 6 G nh<`9apk@_qw"Awȋnj˻VI y){ySsqI )u <ؖi_hzafxLɊ8Ҏ!g9Nbg" !/oZ?T0$F UmMd+_p=@;X(h!NhiFJ݌WX`G'3R |nWt[yvBX0-rY~;Ba H 챥-&S+B@t/W7y",Eo{xndA|IGL)rK{AxyI.^VA(Ѩ>Tn6M4.n]Vm߱sBu?:Ƈ{1Kf~Z!/4Wm*-oR/褦 } UxH,ez;؇uD+E;NZ74 hwӤs%o.}q#]Ywzk%!ʻ@I NJ%9m rIKf~tɛIz! ]:l-#|A|EN6~4V\ f;_N֝m-t\?5H!z<\cff&4 ~+ ޽-15r_H6h&ͤlw m8D^8.)p׌:f/@b* clWx=%I 2"lh9䐀v#$'^.~)Lk1|% \$i +V3J $5Ҷ!UF~XLb3u0??^o+<'0-?kB["z~}xxu)֨g^9 _DnbKn!ys"h}pK|/bD^Η/|gA[n?!hxpf p-a /~TH)wl &i.8.)b<6cf:R͹ULnh~?>7@/^c:݃h/XrM Ӯd4AӇgr;ί14 OFLhkeѴr0򾢑NrkrN _<5L+ik;w5nG66[| ?Jjx!;u&d;Y1*Z~_/{ߤ=Og/Kvʹfk vƃĭY=z&VgWchEK y{hQ6)ur_zK~!eq(F`lkG!^LN;]ᅾALO[1zAmYwD%+63vaM#y,C( %xp(8/9veYLhN&,4Љx΃Bv,&SH3/yM}LS1/ D_c1**{m&>t`bu%繠{1S5K7~ɨ7i 0BHHYws ¬h4x!c*mu{PS7>f+ݒ{6&|ܿSIKO "ʐȱ/܈3ZX锨$Nd~v;Ytwh> j4!g`}ki^ƗqR' IRh J9, iÓ!ɩٌ@TLv K`~{CjA}]hN$duL1dN 8v^\6$ b9]|%Քz@:0i"5 睶1a|h]IQOҹ\k  ;D,=ԗR0rY_\ (OQԣc9,M.}Ʃ .0.6Bu%>P%B@=mshnͶ]hC4~IL&k[,mm/|=msI'|H$S/\4Z=|%zo鞘ԅc9-_GZSq,KOSlJ-6#A Mmݖ/e-f*sy [r+>0uZ4曉1j1R+_6Yge!Ms 0OiZ}[$wM)M˚,S{}+\\Wlz9EmmM$OQ㖋ĶYrs aTN9,3Bͦn63"!Pa֣y4 #S{)9xDWjE=@D dg)Njz-q9旤Q#ch+Ve.j_lK/IQ&ێڼ2z1)eQ+39&qOm3̈́ɲ"Z;wkf.jrч/=j]o8co6|LNoF=kRuSr4ٞ1ь3 Q,zX9M^`I2V%1jv۵XL歍)5X9E홝NVdsm&<[˱rY]3QfĀ\޽sQZdoT 4^"@ "R5# 0LKDѵVWӶcnTG+lr[Kc L,"EJkR[|ˣhQW1S+`̔JkV &}c W4nϩ-1i-lQpB_aBD\&S1!R!P8qϮƔDܲrO! @'# Si'5/""n B$q+ &튀[«ʅ79H[Ιz,d*ըh[8C! !7'CHۅ@# ! @] []F "eB@B5nq(Վh[sLE! Rp&Si 8$:Z! LY?= VgQcB@tҸujB[+iB@'nq!:i;i,?F g%cǎ>#ltPիW Ku[ݜJ D!vnpEqlO>ᬳ*ܬB@TJB@KE|O_ѱ:Hq+ 'B@4 [ouqn[1:@q+/B@=:kr-g׮]+\1*,@B@=KM5Tu(:>j_!PJO>%LfҒRA!&DB@/;sI[j/^RYBm ?-[~߇7OڶV!R!P5Dܪ*B@s5Wx[~m#Fhv !P=DܪjB@) 2$?u7n H*"nzf/! @ kR}I!B}qk\UB.zN;:f!l馩QA@ĭ}pUB@A▖ YfnƩ, ▅> !)Ce-uv 뮻n"Y0~k ?Ck"f {p駇> ? Bsp9|W2f*aJAd //ݻge 3Oz5O? W_}u/9ju ;s^{Z]fm~[v! 4V[r+®4DSw_\|<ʽ6=\.gϔ xg棏>.23iHI@"0~\s1AV~s.h2/(wyO4;>trlO_|뮻rܜ_W-bE6:*w9|̛oimӯ~mL;903fL~L\Ƶp[n 6,yqDVvz]T"Ώ1>ҁɓ'y^r_r~)UZq;W$f͎r-mrs'Ǭp+ޏt֟l/^zi;SNo6d*WD@$&b ,@X-Z&ݻwٳgh6 o&3{iHfv YgWzVZT4c8eև 6 _lh}]WogC9_ \}b$T᷿m +iX&nf%L9B2n832lᆡo߾n~' m\ /n8~!Z^#΂4قĴkV&MXI&5]$1aw>lXfey%omu+OB:<5̲֘#@5ER[f.]l|7)G>`73"+&gmOLvRڹHlT|$HLUEӫaD3oJ &0) |ꩧLV&:/FmdIf: _kk4hfm+-Z#GVZɴ'x+ў#!G{G L(l3~{/s\9ϱJ}Ӫ)c.ͬ"  ['v}YjQB ]d뭷?ak828]G8~8Af̯I؝=Eדm/7@X)+ʹ+-\`=ztꡌ O=mYg QC[lwڼɾX9 -PGsvR 60#RݔzGc\ڣ7LGK~VhҬRe.9K~}"ʅafthT%:x @0l67,+p[o~S?&4~dE|0G8Dgp".&;&>0wo_.F6c A~6&҄ėnuPi[kqJُ)uv˛R 4 sUW]ee"jm=F碆:re*)9ft,s`& #uq ',Vӷ![$Bܔm2sD ˏj@ fbYg;Mh0 NiAk%S+8ͣysMV1m'5 el.)7I . ƍ}ѿ }-+RX:Mz)l}uTh 5^A+I|_raS7ZbqD?b/k;TOl{k}tZ {/S_<ǢOjR}ӡ8|onϲ|$}iK@"P>m]^|84Y⋛`M ?]jqmIuŗUZփd}sm)f( @hkC *R.74oRSm1RsO>; V'$XGھ~u%#F >vDaJRVj_4cH|~aERp05 oM0ڳm]; 0 y晦mZD_?HA"&#) Oۋ-}:[WKčD"lu7h:%5I4ZrHuX_@(ׇ~hkOč?uuʟEG2\srڽ_n\ㆶџǴh"hg\7MAkMߧ^oLo$_5Xê䟳dumӎ;Ru9̑״3RmKQ<+lnǔzI')gpfu(qЎuShkI7O}eͩt2}^L~?W_nhxiXqkS#ԵDOB9̘D.cn alA6[:S ن,cI@ d}3~%cߟ\;-m~v=q!8k@/יKLLwF^=9 SvȒ)5-i F8SKjKyyYJ>OJy&''nRuu?Ԏ /K^ɥwՒ AR2N7$C9rٔ$1ii,uosi,;? 5H5aTO&Xc5,q\6m?!ԕ|вŵ8cz!e?Kڦ?/xg},I[J\1hK/4׆[˂)~AS} kߍ7Pfǎ?0k|L@_reuJyWRʽ3>)3+|q2J`?yĉ3ˇR_~Rw޷XƁK*DMcs5 Ւ2ZS$I4'ϝp sƇD.[zJK-5nHiy:!\s.}S~[^"X_~vmz}I[EW4"yLm#>siVR;Yj^vAeZ~8dtɰQ{^.9VνOc>{?r7tSﹳ iRċLepٜؤwm~Q|hPO] ?ݖF´Ul&ԁ& M'^Cl)7b5ս{wKIqRH,bR,4stj1:I7N3S/1SpM/olȿrEٳ>۰^^!S2IHG{$la)8Fŧ{L~y9r~Q37"la̘1y9#m}*i O%Qn!Ap؆ajJ. GM{ruHy6$sVs.gFdOυm/&Ж=S1ZrWTk{jKd,^?˥s{*HUJ{8}]ʭ)F 4L߃xTu9Ck/.. ^MT'N4@{N$%C^u֭NߒD85FH+/ږ!P=*Ki=+Gk_$ԓc'6 R'f,BQ9mqL-Z}/B@uM:aw(>5H`Ag9ZrNfrD]\ *rB@! @ qI!4>0C0̟G[!m^! B2K Ch7`p|WMH8B_!8a|gC ! &$n6!l52/O?m:RV) S-YEANeB@G čd;vE{`jyȥZM-C}B@! :}*o$7\fB@T2i*gyBc1u@M3.9*-WyHGB~y|0x6PCB@! :L74ڵkVa˘wwi'ӺA o+N+V!:L! @#I|dhݲ(sc[&)HжAF ^DttB@l IAa.]XZzgLfwy\7|dfGqKcmw s=-o̬Zp0âR4L#W6:@! @#IO?#fK(A;4bքA- fKHpvm?۴[5Hk2lN֨WZcB@.%nLջw0a„vArl7Y'jFfqƢ ;rAȵU kNEڊB@!PdAY ! 3fϞ=C^lI[h(W@ {뮻Mu}uYH!ī"VuB@G ؒK.Y6h jɱֿ0`зo_^v%ۇQF<[{V Q! B CdA^zis/LB{]vY;v .MǴr|ͯJYfnV ! u@fͿ'^(6|0u.FV_}u3C v[=zi E: =! D 3 3'aƍ3Scvpk}j%:}i+AUϭT}B@! @m!Pčd=xh|6M5/b?? >uFBZu'XR|' ݺu+CB@! j%n?s-W_}e䌨NBcE Æ 3P$j3 +e>}L8y /ܭ ! =jA\ k& \jSLаA $/B@! @Qjaꄨp FHVllGs*=mёH)w7"L¼*! B @7:V &DiC\eMB0w]YIB@! @Mub+^@`&%s"$W$B D=[ڊ`ϖL7H%B@! h L7L]v1"n1L%B@! @kdܥvˊI qeě|O! @ڪe]ˣ>)'L$ڝ}_ז$B@TZʢK_|EKdKi.9 n$! B52MNgyBϞ=-_6-Vk $]dEjKB@!Pd->b|ncƌ 5y„ l )B@! @kdv 6{o Zӂ߷4 hۺwy@Dɻ{Xr%÷~[=RBh5v駟>0x`Wq .0sJՏz@[6/-B@! :!nۆVZN9@B-h~{paW 3䓰 ݪn mJb*IB@t6uEK.6g)sN4.aYfp1N<ٴ6?xӧO8m ɬeÑGxsY"weرa7dwepYg5>! ue*s/%ZSO Lh=%?K!={W0`@&@|}УG\?5 IDATf_~ebKaذayM6 ^xagtCm ! HE`ԭػw@ow}w8sL #4FL a;3s?hA;餓l EY$,2aUV(J̫8CUo_|Ҍ$C%ziFZk&!%m{i!|eMkX {6oRPS! Lꖸa8q}.rӔhZ?| $M!('} C3E:cW—U#412~R@MC'"0,f_mY#bY!  #n83kL:3Nki!47"nYnLVZ Wb#|L>0p)-?P98 [iu6L7@>CaUW ,,}oqeٔ]Y*B5j %E3qƅ{sPиaLh oB41.D7!CXJ /SK+s6a Db GvX$,`SO=5l|46! h`ja*H0$34AlW-sk|<8SމDč:2hР$=ES2Zk,R[nɁVX!u<4Xa^ yMJ$n]xpcB@!qCqCF@Č[hkd\\?ig5Ѽ! wUql03Cwۯ}ᦛn.L~Mq`fUG};qv >q`CbB ֤b,bryDў}g$2_~?GD`! hjW dشDL[u!?ȑ#{mD3jܒB'C10b;# v!k h#jhmIB44`70cN% fW>*v4.7B@FD'Sx|kG ӰQB؏u[q HT+~S(LDm41WC,B@!:AkDZ6"B"V׺Dm ysOovr=Fr_u ހD! }jaJyE[ۑGi&R̜cǎ5?5Lr_~@QhJWZi%b%W~`z3<̑k066xz"B)vR1nVv )+8)ЃZ7مm;J"kurmF*h JL"B@d"n1 U=:t%5y]Bp/F8=s4tVʠ]5j`[6HD! 59"?L jIf`Sʽ#/Oq>&qĠYۍ7ޘ7-R']#Aƒ-E¶4X1>#H`D^u ! >5A%Lh!SZA H- ddcZ%SNܷ%F;c=,?EF g|҈ǒb~>IHm|sg S%}0~idu/^{mKn@\u ! h?j ( %!^ִn*4e@a.񞴵XJ9nb*%b .8!LiB$uH)2 r6^"E! XDSS1CZMmK;&B DhH f ҁ9"֚b^ˉ')E놙pB 78cRdW_}u#mǏ7I& iLfhel&NbԶ m<6/g.-Θ@cOJtB@!qqׯq\hвaXA~/ϒn^n&tO Z<&}hŨ ug;R)XbSN9ƍ֍mõI! qjA0od#Hd࡙ &nQӄyNKF0yB+y%iCP>ol|;~^|/7?F}N!c)&B 6i!>@8F"B@dN'nLάCzиJzaEbUc}w(>4p'8sA,hkI oy v:x.'r$y}1Ƞk M1Kj؇SrR z:O@Ɖ%cA$:CJ_B@! G`BSUǶ[niņ 6l3# \)4Xƍ+IS0zeZ6rW\qb_l 9Y@f hۜr#D2T;cw26[S/BݘL!Ll' 6ξdeuS!HD! (NӸ AC4S74`;/~̚ʴ&wĈ^qC 4X}ibN Adbq1.ےZ-r-ˉ?ҡC yK0!C2c&vS,r\#uS;8,&GLofe! B2:3?`' CkqlO (DZB6ꆼ1ifd$[hXAp ?EX:Qck|=IV(0vW-/,KK-N]$߾-YΉX>! B2: UY(Z Fh)/|@\ۃ_q,4jK/tz<GEǪ1 ! hoZvj[veͬF 1¤Zy-I hD"ZhzE;&)H_ΑD!  N}6rc[jUVd }[A̙SOFo̘1Usg\n4nۆ@N@f~9|۩P-Km􏷟,hϏ~ׂy'~ooIͱhIن֔>/""nB@! *@S&P̥&֍%>n`z&H7҂`L2VL+͔pw}>y#0S/e҄` 4w@)FV̓P/,J #F0O?m3& `.0S7+G n9zE'x"TJh RN;Y}lz  \u\Ko1u ,~ߖ?=Y>}1&I_ ! #Щč ><\}FO[ ORv 7<4ThlfipO?uTZ(& -lQB +esرcM%A.iOE4(hy'ȵ`XOA3VʳuQa-rmW } ,e<|uYfNtMYB@!P׻vlz@ Å2MW y !A:cZ.Lya Z=HPB!< /1}w}D)_qm^72YҸ_>?s=f.w'BtB6p@˹tKg=\$fBXs56z0 wv0롇jĮ\k=v5łj4m$Ӊ8NL[MB@t:-kV̵MhHK[L:̝ i)bebx-!YIq-7AhR CW_5m&Fp! A&OR/>Q->qpZ~Yb! @ 5;h{Z+uo_ˏsuRs% P tu48.lD 4f! B&[` r$u-$|ɰZkY7'Z L$ J &u]7x㍖^aZ !默 \qC3-]#J!!nD<4f! mA90Ofi B{L>xj殐{f" GAP<"FdvLov]KkQVmTc=cM! :%n-I[\ b҆෶C 8pfHluD {iN8!o$!ɓ탿Z8 &WA uh 8>N ylgf'Q,^^w4"iA`HqK K! h%nkf>@裏|ۘ&1Qbuy!:thzфIPĠA%$21 z?BE3'g}p p\#*шĵϷ,@aÆ+"^N*'/B@465OV[m5!0aB4i&FzC9 eotY_驅T4hq@ 5&CLas[oV~yDmWN߲^<($nY/B3y(DtMK/m~mAz& B&b z-I#~l,Qkґ"Gt$lDA<% ѣ}Ô4vƉ6B@!U2Aܘ[D.qz/Uaf_qLK}@A0[R 7f)S֎_xڱhṂJ/B@!P9 nh9z7omֆ2ՈF=ztx饗IT*50bF:탘\nh nOQ36 L~FPcB@!dM,>tLӊd]wo a߿2dH ڻ&R4{hF%+6HDR! @d1o)'2ؖ&8TFm7AYN~g$e_m ! @ k5=24#D|ύiH1bĈ~)NZ&f^hTA㉐NĭQ[! ը7o BOu "Vݜ y! B-d-"_~6 ~{?չ:<ED mi$&B@:B S Ƈ \sM8£<~etQ3A_B@! @qc*)4i Hnk2|"Fc_~٢h h&B@! @[qC6tаZO<1|gy o.,wq6U@@ܿN>nB@!Pdqкmc9&va2s*^{:X4[ 9m @ʒ۴[ف_eB@F ;l3$. $dz hݘ~`I&_|Ѵ`c6Z(,Fl '9 $x8𩃬6sN<9o*@B@! TѴ̰L([n@; 5iD>W^1rEn5҆("|q,~#|hhc mDf.pA ||tu۷J/ "mGOua)|"׏@B8d\>aHJgN=TӨA -|LkQ!qxmj,L8 #e^_KH۠A,ꕔ%QLH4r fX!=T! {nh nc\wya@?;0+Q>&h1rEĭ\T^! @q2k*MҚkifܸq ϻk䌄Fk8+iuۆ&ʵQ,1n6O*uN8駟UQvc7pC$L ng}֦MH7l 1fᣏ>:y뭷̼oFww_{NVvia#-XE֗B@!fꊸZ[>Z*̤?x`J,R;} 1BX/E i=̌)cVBVJ-AcnY(4bGy0jj̟I9묳{>lܱ\ <<#FX.iUyp9CѣG.! @4 tIb^e\Rhgl뭷68Q1ub^=3&u]7\pFΒ7܌I[ % ̺~iƎkѲ{6S/ma964pi &L(ӟb&VTLO<[H&Bh$S9|F2aj$g|gZ9CZί+[vs=3D`D}мAȎ=XubR+Ϛom?hWpyY {G7R7>q{20!B@! :!4Y2uV S#D̤'1n5-fW"D12d bVt'N b!=ʰa]we)0#C#4`Ee䇃r HB@Eaʁ~7q0? 7d034`¬H^5"JɹF'B]v2ukh0!u]-A 9Vߘ>LtMFon5$B@! @" [Mh Gb4i2yOwnĈpńh$/ҙ@v|ba"\Fyܴ{A/}c0v19Rc=l|$1 &Bƭ7 .D#b>n3U.mպa&$uaꫤ.fN4j.ICܟ=VB@! i 4>]PS>n@4-% R, AZV B@! @3D 7~n#ѬKn 3HB@!P D(bHK_| dQ)Ϥ#i-lt!D! h;"n IDh0&Ӏ$Y&f7"= ̨DuzfL# }iB@@@-*fg}ֈJ+̿͋:f`VMN$O[Rv@țFf# U kkF#㨱 ! _r,HdKڌB6dH, U$ D ^szYYB ["B@Tۯءmüɇ9=FqP d QJ)zY#/u2, C! @ ++zwm6YK=nFӲ@HmR'D! hJC[(E(N;Y$QZhߥYJY*@ RH㖥3 ! @-"čбc%l%'nLƾZkf ۔)Sy!FJK-B9rdx衇|f-ȃ>8Q 믿0E0<ܺ^I"m[Ϥ/@C[o5w}ַo߰nU$vUW(ү*qV'/@Z 6H+fhijWB 4,q#_yH+]w5;Km￿૯j DSȓ{di ! t}wᤓN4Z#2tu):SB)g7`ӬO##mhzahtU|p:Ѡ%fRH;hР +R0K,au3V#ֈcטB@T!nhg;C,G~afItɿIcoxTVѴgF]j]t -\Xl,yѣMYw矫}2Qo~LSB@!& / { /.ric~g}֦B 44jI͢N>hXcٵk׀7|cH>kvW%0iUV͙'22ʠMr}{I@"n ! mC<. H){ꩧ%Z1assoFNR'C|Q։Ŭ\ FAB@!P ꚸ1G&Ȱa9. @c=7Ц);00 2ڳ41hYgyF \p0`-ȝ}'g 45d! UC4^0;b6-@kIR@ i2eicZ8/S;!CÇGyĎw"qZ=R01ò$q>eO;),+fb>.Ìɒs,R͜Yv-Ql8儗u~yݴph)B@@]y't}0l  1p S{iRC1cWB!H sıRZ@>|N,N $ԏwxۅ(ϒ}~,e a1_ tl=ʱh:1%B@! C[^,^{m`bym9kʃ}ܸq̇΃LFid.D}| rh Bɵy~ȝ#oR@AP'C(oEQ?Mn4a;u/4th7GDK! !keQ/xtM-?>31"T[02“O> h$SAh7o| iq &_>:K|)C!Ckè(ƌEځy`H鏓@A(0M867_ӎ6! Bu>D-=cS^06!ILi@ f+ @tb! @=B@!PoHSogTB@! =B@!PoxB@uL ̿k|JX@`+ ܶFQ{ @p^k pnG!@m{a @M@  @7v{ @`+ ܶFQ{ @p^k pnG!@m{a @M@  @7v{ @`+ ܶFQ{ @p^k p=UIENDB`ipython-8.35.0/examples/images/animation.m4v000066400000000000000000000271771477474304100210240ustar00rootroot00000000000000ftypM4V isomiso2avc1free*mdatEH, #x264 - core 118 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 eW?6)0h)1*k \>Ȁ5!O{gPUF5/7MޫHGfmЬϖf(Yfl>b̀NP{,ť[{Ԙѝ鼢,xlU.78^gRYUxaGQ* [[n|DfWMepS#o8Q114NH-LTD!<ٍ#պcܮCj+E4l&][^~";f̔;m}܉"@+;qr^p" E(cyp0ܬ!{l%zA g4.1d&:KNohnJRӶ̖YkW-7Gp /؋-VGQrD )h! _c9"DΠԻ;|V}澢vmQݭBU5 "5''Qx {vO^ \`-q,ya#@!cspNI,e>Pse)8FA>O|8ֵ(5J4wQ"'@"1 <ēR춱 wI Wn 3E0((/ m.%ɿ4U>_\ᒗWP(4dhvshA귒C #ז"wF3[!etk8U!8B*kR[Ǭ>Aq:vI"T/dnmŸP60']ju~a(wh}5c, ;YtP]ߕ2r@[ D?̸G;pэ9֢&L1oSǶqFQo'[~NLJ'0!0]-{rwJ;"LoLI>=[\ьYM̕轢 }C_CQ.-\A2싸Ϫv{ {D%\V.Pia{l%1zHrᚅzE^`&{S)V8-cdqµ϶PEgC*|\DB aū}#*Rr#ەV01K:NC:=@\gFdnԾE{Ӡv8Jl!w&ȓS7? KeZiWJQa WX#%VC G0oMnܵ'X2bЕKM.]R #cI%˥cۯEb~NboT}Gy`,u_hDH//̃X=z%O`b1^)EOdܵ{$O nhzТKgbY6 #6UT˄]Z O5Psv$eI0.)քGjwƭdoGæB#4}$Z9t(Axפ6E uF`N(#1P閕~7T<mn3S$ד33u61owY6n03G(IHBLIUHz54-CE1;>TgF)aCnF %{6{Gi Ҽ yn=m:tOo^w,0៏Ԭ\BMa_~򰽣3Jʤ # q6$Z9»n zǢvF9~[~KRĴO 2:"h :HxZ`C0s+9_ݗk1nMn^(':@FX$;%:=3=q]fK#0Ug;1Mn799%LvB#AxiXKz|@#iiI1LWueh-w|Sq1WM}J5jþ~756J=ϝ k<ʁ%_k3%xxTxT[ٛ&=řMtbOgy4 _y@Vh\Q9dwGH3z}rHʥbyU<>sR9)T7:k;̽~ }ҫ%*@"KQIU v5ZHp&pcl& h3\uYx %@3̍|aj> |$/Z=iF.ײ";мjo p&u.J7ڕ7UxHxK}=QEyblyU5A!lE+|=Ÿ^`cф@:N. zsTiF p&˭WP&ʧXo7Yi\ R[f핼ז~t+s~;Qca$(({,'rN}To h3 9Oy eo4<ᇾntF ez#%[ nHrƻ#cqYߎux%6X8/)9XljmNJEqPwQ-U!Vvf!Qq.ElVZC4u%@?twU!t?_j_`>̒3J9c8E:v!@8ry>PΞ+]9]&״Q".?ј If#9^aK+l=hO^v?-m+&˗:YA up>f?CGj,Z:5!W0~=5&Dyk"iC(X10U4>Y@N1t8/?[ׇI&#B>:E:_v-HF=A(/b \x12pRwMF7AÞMq@H?ڕpE[VAIA|[bI 0.v$8ڱR+Ik"0 G"z{%o ($Z]5xK-L-f(`HKQ^_fz]G{r}d OGP ^krOo3izXà;?ϐW Qv(]hon#)fY[h>cMȔdzԶhgōӖh;Y)r, g${}[{za&-SG]&[;@i?$W=e= $ʯ2)5 N,AcI&S+,YCg lŞ#ے=RF&ryֲKp!j1MoCeJ\W7drV8;L+L!|󶽹Fz.A"g5JjGl0g _}Qp롼79}ā+,ѨۧSh#h. yw*Z\E?ֱRcwzkMm#LqX*~KrxlOq&!&{G+w'8 k/~z֑&֣:>k✳(u8ɡvKy'/Y7r 3QiԨ[b.FeG Ȩ%, o]Fl`LgS67}6v2F8#4#5{J d;[[ҳ{WÐyO  '0\<'u(2\*IL IQ@6Ca bˊ*&DW: AI&S++=a(;1iϪN)G;d`MpFjT 滾l0cgW?K%!||NYH-IJ V?"쨎B䯜l$evة%ؓNRz`Gr:4٢h87j̸doXis q=iFEFWƙ5%VsД9^sR،ͫE{[aI,_qs+4Aa5O(6](IeMvR iUtcz>\K"OṱՒfjW50 5-}a/;3Cф&} CQk R8av>25șOGGM 3F瘐,|h:ysQb XE 0arF2 +m5,]4CzGvE Q7t'e[am*V;`ԙ#}DɩTz7 r`"棄kgQ*W7h-+"h4,9! ոJު! %qDZкņBH MHk<7jGPZA+Y!(vѓdKk%S߯zx`h}';5o5j["ܓ}yY3H ,MF(,<}g1fo(S.M׮Tc.@1" ~&qL"m Wp'%qp=iO;tv AI&S+(p|o/ny|V6YW1 ke9Oi8P=6G`*[jGkӜkDXi-~hیSMi(2ðr&EɥxAK\cx%#0:;GUz,t?롊sj!+'lֶ*I;hcZA.XT Gr;: S ƟL]GhRvFv' m :n[/@t;F]9|@)dEAI&S+%GV{m*a6{ER,Ju*mNaZ#YO‘4K+ݣ LW|u#n$B}]'48,W!c[iwװ\%|͔F$@H|_W_Y=;\G֚TwL. 9>DoG_b`y52Y'qKNۋPpņqdG~z=AI&S+&0Tg*=4x$4x)wy`Ӂ$&@Əj3R1zolFm|Ds!i:ㆺZ?#HX֙A O\@A"!3eֵ@Ʉۿ~)Gg)vdNVm`lw2*)Qqy<`0Y;08OPv׎?ih [Z\2_cgvogř@pc]1y#A<@MQARI&S+"G}&؈Ɋ(^[<߮;NB&Z"b9As^@&V"=Lj9ڂN8|vkH߆tzbߕ'?qISY<Λ9_IJ߹;l)><"&vՌi`Z&gHXr, B|^*n%Ub$e1AsI&S+W}2KX:GU>]6_bGAY #9ӿb)$PKuC: 5EPQt D{$uBojz{ߙ9%"*)"AFBj^7z RSO#|xDkќ`&lذLmoovlmvhd|%|% @trak\tkhd|%|% @$edtselst umdia mdhd|%|%U-hdlrvideVideoHandler minfvmhd$dinfdref url stblstsdavc1HH2avcCdgdAϩ2-h"uuidkh@_$Oź9#sttsstsscttsstscdstsz 9_/[9[DfA)`stco, em *Y<u "#z$w%&'()audtaYmeta!hdlrmdirappl,ilst$toodataLavf52.111.0ipython-8.35.0/examples/images/ipython_logo.png000066400000000000000000000220001477474304100216110ustar00rootroot00000000000000PNG  IHDRCsBIT|d pHYsbhtEXtSoftwarewww.inkscape.org< IDATxyEոߺ %$$`6OYDQ>P@M:l O\OwE hEVYŽ,%# $dtgsgͭy晙3=:u)L>~~R0.4X ,J Z/mD>3YV?Da`1z2chpАYTJ^nZ/}09D}|Tbs1N`i> ԱވvK|.A Nv v^_.VJ\V .2-Iβ-}0Cnz!R*F[ l^Y>e]Grvb0 BcK)u,zEWm@X>^aKv1{s|QCFβS/0_iCFwo'WJ Zna | ,YV ŸtaxJjhS?`rβF,n D٥6*$$[$Is9[)Pkv b0B> W,r^`hI$_lC_Z ׿RUz\ Jr#Ĵ0I^þ~zYkݐIv߁}n;;s.Fdh{Og.;jZE2!s54* FA0,"4_$-TdTJݭ;l-8J!@Pt[t0 B ɇ9zBd9 cb^> Z!So'6헳*Etb_#Á#e|>QE_E,k(p'6pO> ?ݑi a,*_Q!SCE2< Ua h|_)u%T|8e3(( ~ pVemUt ;?Nl#bۉvsp_|!_f,#aVg Wڪe E 灇s5lZ9!pu> u:CILchC`_*80z+}$Y8&% L@,:(\~ UxS/ |.ھ^ToJMg~"V8:e4Hβvχa5YZOA_f"J (('Y֕0^EZP#ZeJӁG*TVfpJQLb¹@E˱'L:Ԭd@βvhj )(,0]!u.> 9J+3ab}UǑuXṄ%gY7#Ӆys9:0/~OA9X |7Ly*gYD}oD2_B[a$m60%gYO V~HP5f֏"#r Y nBc﷕w/0'{"|$kcur@HFfey,kIJsqrzEG,k*e O)ɾB,"ee6a]["$rMβ.Fc"".Orsuz|;GrA$0|ǔJ|"{JF\sJ)~WS,X 5aN!Rj=uUC=gYɜCmu5e0\^IzgL_eD\]|VbLTxeraFNa$gY7'GEV! ;vfL%-c:ZZIy"1φ_[:4-?+ӑ+-SSѫsT~|ONbzT!L'>oޘ0dr5,˪8}d2CTy u>7=;CMg~!+N^%L1'lsis5*]!zf9MTW6]wXfon1>.u(84!&3ߩW77wy=RӾB]ɓ_z{[-S+x>|k&0|"gY3](8+e 2௵xI I}oDAH6(Qi["Eu ~*{n3cSe5ߚQoQ"8<_tCRpf<6gY?·arZ'9ps)6PwJ)A5M׭nNCL14f)nM*F7ҩRj/ F)2ohtm .s| sI:U2kemY?#0 B(6@-2u9-奊]/a۵m236"DQbpcUp)]M~9a04Q3kq%cRJQ־*=&SctV<0gYGΉAIŧHr3aa1(SiHQZ'xڂYRj8=\&hi-etY Hz_o,kt]OC)jɌ,kJ r5Isgӥ2(u|BB6K3:$`Irֺ3r+&M|Y+}khP+K>D:8}|ݿ]rd]mJVr ]-gU N+?u`C=>Et C-&u$^J^)U"=]>8jEYǀ5Omz2ss'5:vVQvbRQcZ벫,,kw|=̜ex/@_·a,A> W,kr.mF`pG$Ƕ+9˚,< I2ð ax[β. YV,ɼ G's/aC[1 B (|t]'r- `DqJװvQebZ+>T.n>.~X(cX?Zƹnaxgnh0pjE[E> EyWCL1TR09 k -n֋,hj+Q [ }|Ρ8!US|N@|_Y>j%{ed0<*T`(k8RJMbZm^WJ-B$hǕVA8[e}Q@yuRx H#}(ϧZPEۃZםSa Gut0D}DM~ !gY}}>{t><KiY=m?gYiQH8cz1%G:RV1[I1 0!^{S9r2FV~A)DR;h+- ۳rzDQѺ=~|.]`1;Z맺y?R* 88TM 8q1%`h 8KZ-HDREyJq`mm4(+9NʇY[`1`w+(6x$HT@β&PHC U1 `X{}~ːGI23+*67Z?l^rՑDE`0C_Ah&yd:uOYϾ!֯)J>BZ3Y9א  NTyB 1 By@uR* <}fQCϒË-`>!J]$C`7c.C,v0+2fVERѽ(d1*3|j7tӳFӑFqE_Yv!1Iy=_/돠ϲ跮(o3/^c`O\g$7mCJS )NPZ?:*s&U5|F!_5c߽Ynf3*!z85fgSɷN!> Ʃ[Y(9ڮIam883*[ly6>"j{'!uD+m?9hGr)so} L3I21Jg9?,yb]J(Rl?r(,hInZi# CV BZzIDjw# <`*Dvy3QFhҫ>ޑ{ 7эO} 쇬74ڮ?I$,t2YT" ݅X! LV i&2ǻbx #OA"2<qT+I9_%z" HW)ȴ'jUR +z]K#?(}2i|7|G`sۮ$r||3ڮ 2_ypxN5OElןV7\M?A;(ɶKXբ ;ÏK'_ڜX:nوf}Ȍ*@,B%CyG_PtQ۬~k"ߐkg NקCi#SmO;1MDCK U/ s2~֑C,`QIP?mIiĎ[Û=Wl/v$ۜ 2⭛膷 y3jFBA^d[`Kd]GDpk9vHhcwYϙm+R ]޶]#`U602"Lav"VN3c9 m_L 'V"{B0 !Rj,Θge7(oZoʱMmղSC| D7YlU&nF?k(QH$bbJ+b16I94v5hA 3 v"#]E'vmqFՑed )4!GZ (6D6C.{s:'͍JwGyQOPJF4|V{8\]m1@ S;6ux· 8m<,/>@ңl[ ̡>!>)7isxVlSCqo:2=-C=w7tbe;7W+!&MKѩZ6'VG{G廴Tj rSyOkݙ(I}DLrֺ,Ɲ|5k:ˍ&ѱ=8cxݽ(ftv9?OmOG$>ՈPP&Dɨ⿈D8b5pF.SgDfg[!u՟9+Dl L)L. @9OD;#NE@hs 4jX C{RIvC!QKɴD9'ۮ? 9ofS-ЛPlaK*Hf^  ( ?qޜxcA;|hY!J+Ǒ+;堵خ7(q[iRr?y}G;qIDATs5ЅsAF2>\O(AHXsw(l-"qr Ld١^1CBr.,BnڮĦ4+lvzSLx6@:"9G^ALAsTW(oH~*w*žELAγsisGp!oD!֧E]"p#b#Q"_B7WDz8ڴr]\mYa{"Vk|$x.vy eMUr{z|cŗmW_TL`Rjrj3Wi?}ǚ~Y5S9Z$˙*$$t$kɰsVۮY)dd8Zfc`!ȍaNNx5OCn迀[yv#a[_yiܜw@ȱ+x6PnBM}+IQPzJ^NjPln! [DM^n:vq`D LYbkT)"nZA)%`}b<Ƿ]?8WA3HdHM kzhHvƏ!JTDS(TfY\BRC69oJT*^&Al o(wQ\# 44 úKʪsN`i"<'y image/svg+xml ipython-8.35.0/examples/utils/000077500000000000000000000000001477474304100162725ustar00rootroot00000000000000ipython-8.35.0/examples/utils/cwd_prompt.py000066400000000000000000000011101477474304100210130ustar00rootroot00000000000000"""This is an example that shows how to create new prompts for IPython """ from IPython.terminal.prompts import Prompts, Token import os class MyPrompt(Prompts): def in_prompt_tokens(self): return [(Token, os.getcwd()), (Token.Prompt, ">>>")] def load_ipython_extension(shell): new_prompts = MyPrompt(shell) new_prompts.old_prompts = shell.prompts shell.prompts = new_prompts def unload_ipython_extension(shell): if not hasattr(shell.prompts, 'old_prompts'): print("cannot unload") else: shell.prompts = shell.prompts.old_prompts ipython-8.35.0/examples/utils/list_pyfiles.ipy000066400000000000000000000002661477474304100215270ustar00rootroot00000000000000# A simple IPython script that provides Notebook links to .py files in the cwd from IPython.display import FileLink, display files =!ls *.py for f in files: display(FileLink(f))ipython-8.35.0/examples/utils/list_subdirs.ipy000066400000000000000000000003021477474304100215160ustar00rootroot00000000000000# A simple IPython script that lists files in all subdirs from IPython.display import FileLinks, display dirs =!ls -d */ for d in dirs: if d != '__pycache__/': display(FileLinks(d))ipython-8.35.0/long_description.rst000066400000000000000000000025531477474304100174150ustar00rootroot00000000000000IPython provides a rich toolkit to help you make the most out of using Python interactively. Its main components are: * A powerful interactive Python shell * A `Jupyter `_ kernel to work with Python code in Jupyter notebooks and other interactive frontends. The enhanced interactive Python shells have the following main features: * Comprehensive object introspection. * Input history, persistent across sessions. * Caching of output results during a session with automatically generated references. * Extensible tab completion, with support by default for completion of python variables and keywords, filenames and function keywords. * Extensible system of 'magic' commands for controlling the environment and performing many tasks related either to IPython or the operating system. * A rich configuration system with easy switching between different setups (simpler than changing $PYTHONSTARTUP environment variables every time). * Session logging and reloading. * Extensible syntax processing for special purpose situations. * Access to the system shell with user-extensible alias system. * Easily embeddable in other Python programs and GUIs. * Integrated access to the pdb debugger and the Python profiler. The latest development version is always available from IPython's `GitHub site `_. ipython-8.35.0/pyproject.toml000066400000000000000000000251341477474304100162350ustar00rootroot00000000000000[build-system] requires = ["setuptools>=61.2"] # We need access to the 'setupbase' module at build time. # Hence we declare a custom build backend. build-backend = "_build_meta" # just re-exports setuptools.build_meta definitions backend-path = ["."] [project] name = "ipython" description = "IPython: Productive Interactive Computing" keywords = ["Interactive", "Interpreter", "Shell", "Embedding"] classifiers = [ "Framework :: IPython", "Framework :: Jupyter", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Topic :: System :: Shells", ] requires-python = ">=3.10" dependencies = [ 'colorama; sys_platform == "win32"', "decorator", "exceptiongroup; python_version<'3.11'", "jedi>=0.16", "matplotlib-inline", 'pexpect>4.3; sys_platform != "win32" and sys_platform != "emscripten"', "prompt_toolkit>=3.0.41,<3.1.0", "pygments>=2.4.0", "stack_data", "traitlets>=5.13.0", "typing_extensions>=4.6; python_version<'3.12'", ] dynamic = ["authors", "license", "version"] [project.entry-points."pygments.lexers"] ipythonconsole = "IPython.lib.lexers:IPythonConsoleLexer" ipython = "IPython.lib.lexers:IPythonLexer" ipython3 = "IPython.lib.lexers:IPython3Lexer" [project.scripts] ipython = "IPython:start_ipython" ipython3 = "IPython:start_ipython" [project.readme] file = "long_description.rst" content-type = "text/x-rst" [project.urls] Homepage = "https://ipython.org" Documentation = "https://ipython.readthedocs.io/" Funding = "https://numfocus.org/" Source = "https://github.com/ipython/ipython" Tracker = "https://github.com/ipython/ipython/issues" [project.optional-dependencies] black = [ "black", ] doc = [ "docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools>=18.5", "sphinx-rtd-theme", "sphinx>=1.3", "sphinxcontrib-jquery", "tomli ; python_version<'3.11'", "typing_extensions", ] kernel = [ "ipykernel", ] nbconvert = [ "nbconvert", ] nbformat = [ "nbformat", ] notebook = [ "ipywidgets", "notebook", ] parallel = [ "ipyparallel", ] qtconsole = [ "qtconsole", ] terminal = [] test = [ "pytest", "pytest-asyncio<0.22", "testpath", "pickleshare", "packaging", ] test_extra = [ "ipython[test]", "curio", "jupyter_ai", "matplotlib!=3.2.0", "nbformat", "numpy>=1.23", "pandas", "trio", ] matplotlib = [ "matplotlib" ] all = [ "ipython[black,doc,kernel,nbconvert,nbformat,notebook,parallel,qtconsole,matplotlib]", "ipython[test,test_extra]", ] [tool.mypy] python_version = "3.10" ignore_missing_imports = true follow_imports = 'silent' exclude = [ 'test_\.+\.py', 'IPython.utils.tests.test_wildcard', 'testing', 'tests', 'PyColorize.py', '_process_win32_controller.py', 'IPython/core/application.py', 'IPython/core/profileapp.py', 'IPython/lib/deepreload.py', 'IPython/sphinxext/ipython_directive.py', 'IPython/terminal/ipapp.py', 'IPython/utils/_process_win32.py', 'IPython/utils/path.py', ] # check_untyped_defs = true # disallow_untyped_calls = true # disallow_untyped_decorators = true # ignore_errors = false # ignore_missing_imports = false disallow_incomplete_defs = true disallow_untyped_defs = true warn_redundant_casts = true [[tool.mypy.overrides]] module = [ "IPython.core.crashhandler", ] check_untyped_defs = true disallow_incomplete_defs = true disallow_untyped_calls = true disallow_untyped_decorators = true disallow_untyped_defs = true ignore_errors = false ignore_missing_imports = false [[tool.mypy.overrides]] module = [ "IPython.utils.text", ] disallow_untyped_defs = true check_untyped_defs = false disallow_untyped_decorators = true [[tool.mypy.overrides]] module = [ ] disallow_untyped_defs = false ignore_errors = true ignore_missing_imports = true disallow_untyped_calls = false disallow_incomplete_defs = false check_untyped_defs = false disallow_untyped_decorators = false # gloabl ignore error [[tool.mypy.overrides]] module = [ "IPython", "IPython.conftest", "IPython.core.alias", "IPython.core.async_helpers", "IPython.core.autocall", "IPython.core.builtin_trap", "IPython.core.compilerop", "IPython.core.completer", "IPython.core.completerlib", "IPython.core.debugger", "IPython.core.display", "IPython.core.display_functions", "IPython.core.display_trap", "IPython.core.displayhook", "IPython.core.displaypub", "IPython.core.events", "IPython.core.excolors", "IPython.core.extensions", "IPython.core.formatters", "IPython.core.getipython", "IPython.core.guarded_eval", "IPython.core.history", "IPython.core.historyapp", "IPython.core.hooks", "IPython.core.inputsplitter", "IPython.core.inputtransformer", "IPython.core.inputtransformer2", "IPython.core.interactiveshell", "IPython.core.logger", "IPython.core.macro", "IPython.core.magic", "IPython.core.magic_arguments", "IPython.core.magics.ast_mod", "IPython.core.magics.auto", "IPython.core.magics.basic", "IPython.core.magics.code", "IPython.core.magics.config", "IPython.core.magics.display", "IPython.core.magics.execution", "IPython.core.magics.extension", "IPython.core.magics.history", "IPython.core.magics.logging", "IPython.core.magics.namespace", "IPython.core.magics.osm", "IPython.core.magics.packaging", "IPython.core.magics.pylab", "IPython.core.magics.script", "IPython.core.oinspect", "IPython.core.page", "IPython.core.payload", "IPython.core.payloadpage", "IPython.core.prefilter", "IPython.core.profiledir", "IPython.core.prompts", "IPython.core.pylabtools", "IPython.core.shellapp", "IPython.core.splitinput", "IPython.core.ultratb", "IPython.extensions.autoreload", "IPython.extensions.storemagic", "IPython.external.qt_for_kernel", "IPython.external.qt_loaders", "IPython.lib.backgroundjobs", "IPython.lib.clipboard", "IPython.lib.demo", "IPython.lib.display", "IPython.lib.editorhooks", "IPython.lib.guisupport", "IPython.lib.latextools", "IPython.lib.lexers", "IPython.lib.pretty", "IPython.paths", "IPython.sphinxext.ipython_console_highlighting", "IPython.terminal.debugger", "IPython.terminal.embed", "IPython.terminal.interactiveshell", "IPython.terminal.magics", "IPython.terminal.prompts", "IPython.terminal.pt_inputhooks", "IPython.terminal.pt_inputhooks.asyncio", "IPython.terminal.pt_inputhooks.glut", "IPython.terminal.pt_inputhooks.gtk", "IPython.terminal.pt_inputhooks.gtk3", "IPython.terminal.pt_inputhooks.gtk4", "IPython.terminal.pt_inputhooks.osx", "IPython.terminal.pt_inputhooks.pyglet", "IPython.terminal.pt_inputhooks.qt", "IPython.terminal.pt_inputhooks.tk", "IPython.terminal.pt_inputhooks.wx", "IPython.terminal.ptutils", "IPython.terminal.shortcuts", "IPython.terminal.shortcuts.auto_match", "IPython.terminal.shortcuts.auto_suggest", "IPython.terminal.shortcuts.filters", "IPython.utils._process_cli", "IPython.utils._process_common", "IPython.utils._process_emscripten", "IPython.utils._process_posix", "IPython.utils.capture", "IPython.utils.coloransi", "IPython.utils.contexts", "IPython.utils.data", "IPython.utils.decorators", "IPython.utils.dir2", "IPython.utils.encoding", "IPython.utils.frame", "IPython.utils.generics", "IPython.utils.importstring", "IPython.utils.io", "IPython.utils.ipstruct", "IPython.utils.module_paths", "IPython.utils.openpy", "IPython.utils.process", "IPython.utils.py3compat", "IPython.utils.sentinel", "IPython.utils.shimmodule", "IPython.utils.strdispatch", "IPython.utils.sysinfo", "IPython.utils.syspathcontext", "IPython.utils.tempdir", "IPython.utils.terminal", "IPython.utils.timing", "IPython.utils.tokenutil", "IPython.utils.tz", "IPython.utils.ulinecache", "IPython.utils.version", "IPython.utils.wildcard", ] disallow_untyped_defs = false ignore_errors = true ignore_missing_imports = true disallow_untyped_calls = false disallow_incomplete_defs = false check_untyped_defs = false disallow_untyped_decorators = false [tool.pytest.ini_options] addopts = [ "--durations=10", "-pIPython.testing.plugin.pytest_ipdoctest", "--ipdoctest-modules", "--ignore=docs", "--ignore=examples", "--ignore=htmlcov", "--ignore=ipython_kernel", "--ignore=ipython_parallel", "--ignore=results", "--ignore=tmp", "--ignore=tools", "--ignore=traitlets", "--ignore=IPython/core/tests/daft_extension", "--ignore=IPython/sphinxext", "--ignore=IPython/terminal/pt_inputhooks", "--ignore=IPython/__main__.py", "--ignore=IPython/external/qt_for_kernel.py", "--ignore=IPython/html/widgets/widget_link.py", "--ignore=IPython/html/widgets/widget_output.py", "--ignore=IPython/terminal/console.py", "--ignore=IPython/utils/_process_cli.py", "--ignore=IPython/utils/_process_posix.py", "--ignore=IPython/utils/_process_win32.py", "--ignore=IPython/utils/_process_win32_controller.py", "--ignore=IPython/utils/daemonize.py", "--ignore=IPython/utils/eventful.py", "--ignore=IPython/kernel", "--ignore=IPython/consoleapp.py", "--ignore=IPython/core/inputsplitter.py", "--ignore=IPython/lib/kernel.py", "--ignore=IPython/utils/jsonutil.py", "--ignore=IPython/utils/localinterfaces.py", "--ignore=IPython/utils/log.py", "--ignore=IPython/utils/signatures.py", "--ignore=IPython/utils/traitlets.py", "--ignore=IPython/utils/version.py" ] doctest_optionflags = [ "NORMALIZE_WHITESPACE", "ELLIPSIS" ] ipdoctest_optionflags = [ "NORMALIZE_WHITESPACE", "ELLIPSIS" ] asyncio_mode = "strict" [tool.pyright] pythonPlatform="All" [tool.setuptools] zip-safe = false platforms = ["Linux", "Mac OSX", "Windows"] license-files = ["LICENSE"] include-package-data = false [tool.setuptools.packages.find] exclude = ["setupext"] namespaces = false [tool.setuptools.package-data] "IPython" = ["py.typed"] "IPython.core" = ["profile/README*"] "IPython.core.tests" = ["*.png", "*.jpg", "daft_extension/*.py"] "IPython.lib.tests" = ["*.wav"] "IPython.testing.plugin" = ["*.txt"] [tool.setuptools.dynamic] version = {attr = "IPython.core.release.__version__"} [tool.coverage.run] omit = [ # omit everything in /tmp as we run tempfile "/tmp/*", ] ipython-8.35.0/scripts/000077500000000000000000000000001477474304100150035ustar00rootroot00000000000000ipython-8.35.0/scripts/ipython.ico000066400000000000000000000775041477474304100172060ustar00rootroot0000000000000000 .h >00 %;  ` Tq hz(0` , 0#2%/#2&5'6(=-9.;0=2?4!@.B1D1L8Q;T>A7$F<)H=+A<3KA/OA,YA ]D"QA(OE3OE4ID;PF5RH7SI8TJ9UL;VL<\O9XN>YP?dJ%{[/gQ2jU6bR:eS;mY=^1p\>u^>ZQ@\RB^UE]ZS^ZU_\V`VGaWHaXIe]Nh_QxaAjbSmeVeb]ogYphZrj\tl_vn`xobxpbyqdztn}xr{xto;lEoErHE}J~Lym|o}wFKMPtv{}ɕTԜWþwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwtb````````````````````````````````````````````kkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjt{wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwK I I I I I I I  Ih~~~~~~~~H~zV__LoB___I:d VV::VP|]_I:333H3333'E:VP:Ay_I:333H3333'EqqyhVPz>3_I:333H333''E&&&&HSXX mu_I:333H333''E&&&&$q~$YY$$$m8 o _I:333H33'''E&&&&$\$YY$$$$$$Hd 1_+* K:333H33'''E&&&$$h$YY$$Zf$$$$ =_11_NU:333H3'''&E&&&$3u$YY$$33$$$$$33 =_1,N.U:FSShSSS>&ESS[m:$YY$$$$$$$$$$ =_1U:q&EB$$Y^RM$$$$$$$ &RX_1U:dqqqqqqqqS&:qqqqm]B$$$$ORRM$$$$$$$ &RRR,U:333333'''&&&&&&$$$$$$$$$$$$$$$$$$$ U:33333'''&&&&&&&$$$$$$$$$$$$$$$$$$ U:33333'''&&&&&&$$$$$$$$$$$$$$$$$$$ U:3333'''&&&&&&&$$$$$$$$$$$$$$$$$$ U:3333'''&&&&&&$$$$$$$$$$$$$$$$$$$ U:3333'''&&&&&&$$$$$$$$$$$$$$$$$$ U:333'''&&&&&&&$$$$$$$$$$$$$$$$$$ U@77777777777777777777777777777777777777777777ajbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbktttttttttttttttttttttttttttttttttttttttttttttt( @, 2&3(5*7,9)>-8-?4">7*?8+I5B7&@8+F;)A9-H>+C<0E=1X@ ]D"G@3G@4MC2OE4SE0PF5RH7SI8TJ9UL;VL<XN>_P:YP?hL&fT:hU<r\=ZQ@\RB^TE`WHd[Kf]Oh_Pu`B~eBh`QmdWohZqi\njcvnarnhxpc|uhxl^2i?mFyB{o|osFMHIOOLQuwyz|}QRĒSþĿlTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\i555555555555555555555555555557_____assssss +sBE$uEHe)[U{NN4B2 He)))oz4BuN H;e)))s|4B~ H>e)))s|))#Ns9B?hs) He)))s|))#OKOkgBz-:c He)))s|)##O)!a2I'-  He)))s|)##O)!6JI/jcvN%P<e)))s|##!O)!c3I/W.8?&Q#E!e)WW}WW)OXXssI/&Q!e)2A~vX)CQ=0QEe))))##!!!!e))))##!!!!e)))##!!!!e)))##!!!!\ nTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTteeeeeeeeeeeeeeeeeeeeeeeeeeeeeeyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy( , 1%7+A7$MC1OE4PF5RH7SI8TJ9UL;VL<XN>YP?ZQ@\RBaZMe]Pvqfuqi|wo}yp|rC!!!!! !!!!!!!! !!!! ! ! ! !!!! !!    PNG  IHDR\rfIDATxyսǿ5ݳ/b\Pb@6QDq%j|'brr4z^,ϘQ_4%DMp ((( d}_{30Kw-]oW}?gLuuo.B!B!B!B!B!B!B!B!B!$(#ȍn\׋ 6Br ߽Snn׺&ȋwۣG.`<!ruO:qT z^t>A $UGו@տ`ƌ3 9t萶piOwuttFQ:th-28B믷tp7+@.(J(ʊӄ1@(^H nm>Y0( 3.!D$@)p>/<=0`J4͸ÄqqG~d~@4 eeer@φ-hRw#J(=H&H$^"xܴLRZ"/V$]סip!#Ha@GI;]B| FG9F6"+BX<ϒ4رc3 !D HĴLRS,t[q{%;':y 2I]lrs};[l@Imi[V[#ga^7Cْ!A F">rLfVd`lezCmy &퓞H3di{d E[\ k\`z&%mYmyL9&3f˃0 @dqQ/tDduE};:m9v` fV&.RHWfF0&ͭiM۲Ύym" -Y.Lv<:$hI,0=[Y;0Ųs28$hT 0h$81C)wӖp8 d`.ڒg˖pHܚܴ--qy"A t `2и"a209# fV,될4$3kƕș k<{i@ZE]E]'"ߕgvs1)\ -W6Ǩ~؎HtŃiyv 0O? F7R?O6r˦MO5xX,v455(Fye5mmm:( _ Ү(7^\sɃ"vt=!ĥxQ}0hpܱI˕WUcشy+ZZ ,,Iq&&."1L&9~?rfMcx᧛Mk~=% A0E( g g6,]W2p ,W_Y(9= @z2?XpXnrEV@ٱ>ufNX}z\C (K[e/_O~qēS3\0oF"m{}>Ȓ 4/Yk4? >lh9ڒ@q wiISEardWe#[^|3LBLBga(,8QHt#)m\Pho@}cߵ">:Ѵ\˾M}R`2  \-k?a ?sݕqĥ+WOO?Yw@']_2Ixkcg 9Y:o ~ޖQǎD($,wO55{dMJΚ6ٰd4+ǎ錤Ⱥ[3U[߀=eoT`y%|Ӱ̀0oAqgO/^ 0d):ϔ}V+gMd ^r1/nbxc5fڰu-[doBк znjCq mWm;,X-LEߴh-# M-j9:=߳Xy˧O1.'w,N?uaU݃KDbY,jjne^N 3s*tYS'뺩H#=7be.X8t?W{>?Clٹq(yXd;qYHY渑#pΙcva:\6xg[Nq H H q#ׂT?rnu8sw2kuG2SL?&9$̖(dpa[P-a6M|{Ӓ@O[vqฑ# ˬqhx<#$8uڳ¾[ X/\em=k'@6u6OYf +YS-mmxU״(epPn%u 6 ̷|kM:EMmFup-olDum*kj1m҅uXZ#6\CR0IbYؘm(w֚N rt|p0H@4ZBP5jP5HS'a`ʊL`K\]O ]uiT*)V8u,w77^=_m_::$IxNl)bkϮ ]1-+ֺ7P(+g&ax疾me}3?*7< d y>utn *qwt 58Pv~;wcWp _jݹ隹 ̘;kNԪaU 8$1|yw>suh X h hX hR-aɲS6d0f_:m>(7׮C}CcsЇÇ+/\{:K4WVi1UuqBD")L~z6M͸?`뗻FssKƟMF}".[v͒؊ز8I#4I ~;_V~'P[WogыLz<[6&<#6d@\qT,Ø3c;Z>аdJ29Pbq='8*pWm\a@IO9W̘K/b{}(+?{ b /c|=T\k\-3;ho֦f8/$eE#*Ʊ icറ'ᔓFc`dԌ-v 67\c*@]9۰]da7N}V/yy kw;VLUMg^0ah4mwѕ 4NYߏɿ.L@+H[Uzy7㓍b@LUؤ^6m2Æb5`uK4Bs-n}pδ+Kgg~&x冯>~+^zm1DJv0 p׆E[Ċ7kog_dfxJM =f:|\C7!z TU Mͨٺci>۲oَ_lfNx ;u,Ɵ1.e\.,765F-ׯkhҕ-kqD:ΊDhjnJ*DyeCޘ 3s ,`Q$ EJRUT4t5vGUVlt%;)\={&,[i(1U˸2H4?TMEM]v݇-w ǍY2pڤ qŌ8[}465v-N2+ohjbcA(ź 0^GKCϿ,o`*r>~ vg"ZPD{ l^8fXtVV׻ P5 @pW+}D{x+˄Sd랞/a9IfJ:k~lپ1 LEKۂlE1Wb˶ Z[轎Y20~9MnF@a<:t465m|"Y20O>Hb15>w%2` Neu Ÿd)SSW_bxOK}˾U\AG8O`5SUcN;}ax< y{dtC@8EUM-gF8_ /x#'o)2&aWUdgWBp1cD2?-C&چj:?!N}"3Y O<,JgŵU\zK 艇ѿ_a#\;2 HmmP5ղ뷻;k:F:ry#^x ٻ_->`YfX.H{)Z m3s*F;R/1yi*FƜ8 xase>6}%^>97‚|,5M᷿"y4#CxEpA]C#" 0d`?c.>on* 6Ēͽ_݋hY`[PVQe Uŷյuws_XV,@{{x0~-ZjbGemUո{]z0S&;"0vWpC0vyڽTF{(,^s`E%R u"H*vD^Vy=vζ+9LrH$w}G4|3x׊#'Xl%,[m7mƙ}.d*@c( !>@c( !>@c( !>@c( !>@c( !>@c( !>@c( !>@c( !>@c( !>&x<ģ"5S$X4{D-#M#|v1I#'J :=ɺhܤt%{t7j#ۣ !{/cN@JOH[OwFm9B$[ dBB!B!B!B!B!B!#9IENDB`(0` % ÖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖddd666666666666ID;A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3A<3^[V6669., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , YRJ6669., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , YRJ6669., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , YRJ6669., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , YRJ6669., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , YRJ6669., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , YRJ6669., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , YRJ6669., , , , , , , , , , , , , , , , , , , , , , , D1L8L8@., , , , , , , , 0#L8L8L83&, , , , YRJ666OE4þþþþþþþþyrd, H=+þ, , , , , , , , , FԜWԜWo;phZ, , , , B1ԜWԜWԜWT>, , , , YRJ666cZK, RH7, , , , , , , , , FG6(2%QG6h_Qzn, , , .! 6(dJ%ԜWT>, , , , YRJ666cZK`VGbXIaWHtl_3'3'3'/#, RH7, , , , , , , , , FE, , , , , KA/, , , , ]D"ԜWT>, , , , YRJ666cZK]SC]SC\RByqd?4!.", , , RH7, , , , , , , , , FE, , , , , QG6, , , , ]D"ԜWT>B1^1T>, YRJ666cZK]SC]SC\RByqd[RAXN>F<)9.."RH7, , , , , , , , , FE, , , , , {A7$, , , ]D"ԜWT>YA ԜW{[/, YRJ666cZK]SC\RB\RByqd[RAZQ@ZQ@ZQ@XN>jbSf^Oe]NOE41%, , , , , FE, , , , -! }, , , ]D"ԜWT>5'Q;=-, YRJ666bYJ]SC\RB\RByqdZQ@ZQ@ZQ@ZQ@YP?voabYJ, , , FE, , , , e]NogY-! , , ]D"ԜWT>, , , , YRJ666bYJ\RB\RB\RBxqcZQ@ZQ@ZQ@ZQ@YP?voa.", FE, , , , 1%jbS_VF, , ]D"ԜWT>, , , , YRJ666bYJ\RB\RB\RBxqcZQ@ZQ@ZQ@YP?YP?voaXO>XN>XN>XN>yqexlPF5MK:/3'-! A7$, 0$, , ]D"ԜWT>, , , , YRJ666bYJ\RB\RB[RAxqcZQ@ZQ@ZQ@YP?YP?voaXN>XN>XN>XN>WM=VL, , , , YRJ666bYJ\RB\RB[RAxqcZQ@ZQ@YP?YP?YP?vn`XN>XN>XN>XN>WM={VLԜWjU6OA,gQ2QA(=2_YQ666bYJ\RB[RA[RAxqcZQ@ZQ@YP?YP?YP?vn`XN>XN>XN>WM=WM=VLt^?ԜWoEPF5f_X666bYJ\RB[RA[RAxqcZQ@YP?YP?YP?XO>vn`XN>XN>XN>WM=^UEUL;QPUL;TK:YQ@_VFVL;TJ9TJ9SI8SI8ZP@\SCRH7xaAԜWp\>bR:oEmY=PF5f_X666bYJxob|o|o{o{n{nmeVXO>vn`ymymvf]OUL;QPUL;TK:TK:TJ9TJ9TJ9SI8SI8SI8SI8RH7RH7xaAԜWp\>PF5PF5PF5OE4f_X666bYJXO>vn`rj\VLPF5PF5PF5OE4f_X666bYJzmXO>g_O~qh[VLXO>XN>XN>XN>XN>WM=WM=WM=VLXO>XO>XN>XN>XN>XN>WM=WM=VLXO>XO>XN>XN>XN>WM=WM=WM=VLXO>XO>XN>XN>XN>XN>WM=WM=WM=VLXO>XO>XN>XN>XN>WM=WM=WM=VLXO>XN>XN>XN>XN>WM=WM=WM=VLXO>XO>XN>XN>XN>XN>WM=WM=VL-yB9."uqi]SC\RB\RBZQ@ZQ@YP?||uh-! , FX@ , , {oþ^TE, I5L, , 9."uqi\RB\RB[RAZQ@ZQ@YP?~w~5*FX@ , , f]Oxl, I5L, , 9."uqi\RB\RB[RAZQ@YP?YP?}^TEXN>WM=mdWQr\=H>+d[K7,B7&3(I5L, , 9."uqi\RB\RB[RAZQ@YP?YP?}^TEXN>WM=vnauQvaCTK:TJ9SI8zfT:QSE0i?MC2"uqi\RB[RA[RAYP?YP?XO>}^TEXN>WM=ohZQvaCTK:h_PSI8SI8xpc|oiV<R_P:OXO?"uqi\RB_WF}ĿĿVM"tph[RA[RAZQ@ZQ@YP?YP?XO>XO>XN>XN>WM=WM=VL"tph[RAZQ@ZQ@ZQ@YP?YP?XO>XN>XN>XN>WM=WM=VL"tph[RAZQ@ZQ@YP?YP?XO>XO>XN>XN>WM=WM=VL"tph[RAZQ@ZQ@YP?YP?XO>XO>XN>XN>WM=WM=VL2F>2F>2E>1E>1E=1E=1D=0D=0C<0C<0C;/C;/B;.B;.B:.B:.A9-A9-@8,@8,@8+@8+@8+?8+>7*G@3"""D (0 ` xxxKSSS3ʍ}}}ʐ~_WL, , , , , , , , , , , , , , , , , , , , , , [WP_WL, , , , , , , , , , , , , , , , , , , , , , [WP_WL, , , , , , , , , , , , , , , , , , , , , , [WP_WL, , , , , , , , , , , , , , , , , , , , , , [WPnf\A6#;/, , , , N9}DXD(0$, _F#M, [WPslb]SCXO>dZK, , ;/, , , , N9g7, , u|, , G, [WPslb]SC\RBun_MC1?4!@5#_VGLA0.#, N9g7, , 0$, G, [WPslb\RB\RBun_ZQ@YP?c[K_VGN9g7, 5*{meW, G, [WPslb\RB[RAun_YP?YP?c[KXN>WM=gS6rB;0}qyC9', G, [WPslb\RB[RAtm_YP?XO>c[KXN>WM=mdVvdIzKTK:`WHSI8`WGNH>+b^Wrka[RAyrd|wpbnfXcZKqh[}ro\AzKTJ9aXISI8RH7ZQ@VLN}dCSI8SI8RH7QG6oFNOE4d`Zrka[RAZQ@ZQ@YP?XO>XO>XN>WM=WM=VLXN>XN>WM=VLXO>XN>XN>WM=VL, , , , , , , , , , , , , , YSFTL>, , , , , , , , , , , , , , YSFXPB, , , CC, , CCYSFnh\TK:1%, , , C, , , , CYSFnh\\RBZQ@MC1C, uqi, CYSFnh\\RBZQ@YP?UL;CA7$7+-! CYSFng[[RAYP?XO>WM=CTK:SI8QG6CfaUng[XO>CCTJ9SI8RH7CCicWng[ZQ@YP?XO>XN>XN>VLXN>WM=VL00 %lh    hD(0` >>>nO*hO/xS&qS.sT/uV/jT8lW=wW0sW4}Z0zZ4z]9AAADDDIIIMMMQQQUUUYYY]]]v_B{aA~fJ|hPyjWmV~mYbbblllxxx~~~Y)[)\.^*]2^4b.f.h/`1`5a5b8b9d?e8f=h;j<e0i3h0k5l5j1l2m3n4m>q6q8q6r8t9u9u=w=w;x>x;y<{>|>mBmFiKkLmMmJoOo@qArBsNvLxJzOt^sPxSzRzYy@zB|C}@}DF|I}N~AzboFJNBCEDEFIJHMHIKMQW]PQ_ensvxakdesswtKMÐNđNRǒPÓTȓPɔQ̖S̗TΙUКVҜXԞYìȲ̶ȶƸ˻̽мżȷŹ˼// #)xx_GDD 7*i******#yxDJGD&::#*-**%yy]JJDG&:::&**yyccNDJ&:::4*%XnJDJ-::#**nn\`J-?A **jYxcch-DA**yy_cn1DD**[–fyncn1DD **–cn1DJ7:*šlkkx4JJJ5:#›nx4JJJ7/::œwlty4ccND@ -AA1œty>chOHJJDDDWœlty>hnOΈYœfw>nnOœlyTnnOœUnxOœ|VvyOyyS S  ^(|71~ DkyiД٣  ԽٽԺ????????????????????????????????????????( @[[[```iiimmmqqqvvv|||h/h/j2l2n4s>q6s:u9y=|?u@{@ACEFHIKOWVT\d``hjLÐNǒPʕR͘Tʚ]КVӝXԞY֢`֨màsΦt~Ť}˧{Ҧp޳~ŦǩʪʪέĪƬȭүϰҰ޵ѱԳյطݺȮͶϸڹܺ޼ֺԺؼھ⾑ֽáȱϻѿӵնкҿոڿzOC TH  HOEC !|T UO~1E  'W5~EHz(WzOEEdd)W2O%Vx*WvbO$ ,a2+O[x3-ak)gOL## -a00W[r[r-/-y'R\--N(W\ggj}\pppxzxz@9mp8%s;i!;mp8Kp;4c;BpBW=;K;mpB:8a;omW;Bp8^n=ak;mp87wk79=p@B:B:B:B9B9B99?( |||m5o4u9x;z=~@}LAEGHKIKOecabpqyMđOʕRϙUћWԞYɛb٩kȧװŭȯֽ˜ØŮȫȯ̸нԿ8 88;5''*. ;19 ;-6&;)40+3 2%.;+:$!$!$" #PNG  IHDR\rf IDATxyU9U{lLe%e "rAFz^*x ABdldcz{{kzz^tUW9|ꜧN,,,,,,,$@s ?֬Y'dOw;R( ロ455F--- qG}}=ߺukF9<ƨmtш K @!BWW$I|@ @jkk@.in7'NX^7򹥥'8tuuq80,MMMKrK),BGGt: !DUUfqgYgydP;@\.^qǛQVVƫH$q `"wuW$D&jcAAc"AJieY,k%I|i7~'"3E|e{^ 89+CKK ohhO?% $9'+Wž>dYvPJscA)sm( ι%91A@) pA>v眅g?1b.scsY Rv9|>5(X: $_ 6Q1inƘ[iιs.@⤙- A8!D]p9gNτ@ !YUUf\9g(F-sΙ$IT9jBSS!5*W\q(~aܔR/J\1';cL w.\Esg8 c iCM2)%PBci@czJR*F)*b6R*IilTE*UH`۩ReX"A2Xb<BZAC8`EQ$}\0<᫿F1R`s{(CQ~ιJQÁrε_A !*\ci$isfiQݮ)F XAe%i[1i|׮]B!Q #/s\իo<#2:;;H0D((P(B]eȲ B>Ji=Ht(<vRJ[c'4Mw2d=c S !*!DUe[$p8hGGlrQĉŸ|IvW@oǮBޮwu"644dYv)WBj,իm1Y9P,R XdYUUȲ EQ*ׇ,G-c pQ,zLӴ@+EsAP]UBTMTrjNSci6:Nz ikhh`XxitR߿l61& qsg̦VJrtsB`iPUR MӠ( q 1L8SL!eee---3z{{A)$IRJUUm@w9AƘLQ8 \EQfEDp( `P BR- REu!hlldz஻C%)yVz'ι9Bl>"f.v#N[ 1hooGkk+>8,ZV@OO[[['wvvrUU *c[Q6Ji(t]f)d24@4M0dQx hR5 R׫\. [t_qz$yN&cƦ%HQMӚ5M BB< BBcL!95MS$IREQl6(J)U=i~J)e*0Pb +!HR ArA&z޳>l_#A(lp:x<(++C]]&M˅vlٲCEEp 'OܹsɩJ͛JnVUu(Kn"Q'B*cApwp $8!Alls)Ƙ Ioo/ٺu+!V?OςhC{A :bWrBHԟ(p8zĄ 0gx0{ls9p#|Xp!,X@9r{ȑ9Ǐ?YQAP(tDӴ#6s !AyR!9r΃`eE1D c,*(//hcc#J{׻{E Pk RWWիWK"j;c 1Ȳ ߏ^477cΝ˱x} ]뺺p>|M@ TUݥiZ(yyJTUUE1Sv"I(Zx"A޻JR'!9/#Lz"!Ez@]](pHNe׹ncܹdٲedڴidY/x<c!6nBK'cEqs(6M$MDQEkO4M#SL7)%y($Er555BGG6nY1eTby<L4 /&gφpI ,q:SJ)cNqoC; !p.&"i&C;O~xP[[K`ŊX~=֬YSn,/Cm6p8"Bo>޽#ӥ gy&8 {ݻwoM0\k TU룔 !~Bs>(B@Qf J \.9 Rvrػ-0&;n^555شi|IZ .kL&L &ଳڰgϞOTUMӎB,bcHc~A J4(JpeY\.L$Imhhʕ+'' P.EA#v;\.<pl߾gφL)/0ں2L6zdҤI!f\4M r%Bsn`EQbs!GN'&GE,( . 8vmۆ3gFnEcƌdɒ%rI .IDJB)ExȺbKQ vt:' 17` E`PTYY'N`˖-:u*^oZA; ŋĉ`:Y)1Uo  BDιg4 pX~}A%E%p8Dww76mڄɓ'ʟ컊 ̛7̚5(R>88nO4m <9s. Ccd(&XzHK[l#O/f;oY̙3IooOQe L4 =-)B|A 8c 555@[n X%PVVVݻ .L{u. #'N$9vUU0WCnUUU_~X-!ۍ{ sɺ}>-ZD^>n(J+眒!*!1m6$wuuqۍ+VU,(jaĒ$AEl۶ UUU"mܹsIkkki1^ƆOz{{dzb0" ŪE$ UUU81c P%zXjpg=*yJi=!FӴ*yy v$IjDbgZV _a!In78ߏYf`jXzbx9*'3._}}=Jr)//s^#B%\>O ^,(DQDYYΝ:Yo'*|RA)㜻$IB!$IBee~InNd dh|@uu5,X#G-'Yۋ6?UUUꪫDr>QJ4MH4f$!455\-J AvqI'6lU2R68~8ZZZֆ@ `0cxPdɓ'cٲe»{i[( j OP*466FTYI0g[L2.G Rx|'NnG( " Rjw\+倫l6?!9 !jKK ihh9K,J0c 455aÆ KRڗRÇcϞ=طoBzh"L0^NN$fE8Ȳ~߿vEv}~(ꦔ:9v.Bp7!X`Ql6|>L6 MMM#,G{{;6mڄ={J̜9'NDEE<v;v;DQv _B) |>$I|~;8]sinIuu5yg&X$mYfahnn̙3Gl{nlڴ ǎCMM ,Xɓ'vtnGs 舢p8áC狢X(qA$ƘHH%%~G555عs'f͚x" g}6F}TAQ#O. B$I"!D|oZ9 "n7&M]vc6mڄ> ~騩4EQ4Ѕtbƌ8z(%IDJi ˲u"SBt:1k,l۶ ?jjjxbL6 (++fJ[8L>\Q0*,A$"" dҥhmm͸DX`Q݀ZXHR.+n"/[H2h9p7AEkkkN[X4(K,N$,ӮC;R0D$t:Hw!fK,J IRdg UUI>|b\m\9'1fΜKbܹ1c% (*[nEss)4Rtww0$ ~:zL81ZVbƍ򗿌/~8zh](,(1|?EPT]˅e˖gfgEQ7>$'6n܈v=.Y(E%Npף]]]pww7zzzՅEَǎ;PUUJTUUE>kjjPUUׇsP({}{؊೟,֭[Wp- `6eʔ;דq7&788cڴi0uB;|+ QƱcсx<եdCUUp xGLyϟ~S]2>'tic;~W;(i'kf8ӳYPtPjL:zkZG /כt[Bvލ7x{)i*W{SvJ׀ A9| _޽{Xa r-? /,'~„ ;OY.1 ছn3<3jTe|k_KMMM y\~;8n#ogOͫO>}{%܆"^*,,(L˗ߎfƍ3fo8x Nr_06*9%矟{J)vؑ#o,KJn9,()&LÑ{Áz4*˷iaJiӦ%m-~wZH?4Lόtxts67G`` .xlc @qĉ)ǓColرcG@9cz`WW|(Q9v|Mw}cy46\5=nƬanXMdYFuuuI8Ӊ{ ;_~ǃbʕ}L ⏰4w͉f@0$&LȡG#93;/l7|3j'\6 s~XPB6@ާ ]vYԺ:]6:ÇG;r/ŴpT9` O>3oOB%%ā~YgCsEEMbJ={Ҟ=_Z#/ (`E`{_yW^yeN}IKJUU%]]]83PVVCSYY9b)SL Ekmmy睗[lU-`k?Ļ}?ɏ Bpa(֭[@[[?9(9_~9nYv\xꩧpw4{ѶmFLv1|s&xu=D__GZ%o{,`]]]krUr-Zun/RJQ˃0" pӝEfxODرcQ[wر1ӛQ|a!/XP ojj–-[p9`Xn]GN3 MTVV3on#x0FCQ̙3˗/i.hv,g#^z)׿F].yY&nQ=z^{msf 8jXGB=6N>N:5/䜂1'G%sŞ={"4MΝ;`:t(j3c mmml{Hn,rǔ)SУ,Y~ʕ+q=Dsa#iֆ˗gqH?\?D+`1*1p:+4+bpiEE m9r]w]Fp%2t{L]40eNBڰsN|[ c#n,]K,,"pEf /Jc6GUW]b0>~VbTf>V>TVVbٲeزe 655E3T7C3Os^#u>w|\┌-ŨDٸc|LX̙3G(d5pR/}~~v:~Ou_N|X* IDAT18gX`Aˏ=NHp U8_a$w`,睏nݺi,وgMd!м===Q[ɿ'`0GҨ|fĥ%}eX;o\tEqpCEA D5fK,F%j<}Cرco tTz:Cm98],n\${\..Œۊl K.Ss͔Y h1*jlذ!jƟ?&o~%hiu v(]\yɧjժa,T&yvk5駦ihmm#Et2W.?zzzhq'gՌc Ũc#@`O=TԺf\z饘1cFVl%ĹyQa[csOSchnnO<{S)*b ~?~?z{{YtR~z(++Cyy9*++QUU2x^x^cҤIaM ay ^ZwawyXxqVlwJqme,͆@ @ zДUwy'N9vg}Pל vƓjrܨvyATVV hiik68|0qS~}ظ9i{LG[L ƇeS< ;wqGW^y۶mզiغu+^,\Дj+[?}q%b %cNE0L ؾ};.2xcqb,LLp̘H_88tpwF&ܷHBQ ™gG}4vcCX`}ߩٳgŵpř3_? zcG<`NԺ[oz+݋~A b袋o} 'NߟX</>4nNk?*l8(*p:۲6 $fTVV7LjMgg劊 <ÑeUU!r\bł0jPQHRQiv=#W\t:g# d͖*ke@K,,1XXc,X`a1bc 8 qL /ۏD d|6h`KA"-G?7<#M/oϥ)` yR~Emɽb )ы-c?a၌Ebfl"}_㐸G; ̬aVEaRpb@#dk>]"c}ב Ԩ0 7Յ]&MJ͐1cnư]0܎"J /Qg.@d,GlY_{Lc81BpS^F{j w7]}GcD.' ܴ)#~d>&Uc]~Bg_}Ats 8˝)wAue.T8dgKqNހ꜠oe ~pA|#Ϊߣ?qETR?G {x Ȫaz`zݾ(6\2+'eQH%|ܿ;a߸lLU8w-S !7mK$L ߦ^ V0vȺ=Zdi7p߆{#]#QeDVG_*OkodLEu@Lҟx Ooql x ,u4߹1;b0T>y.wߣAZ8Q{o'6hx 7]årsu03[q =!@ Q{3}B&p 6sfaD2?ns9]qp NŲ~W n[(Q>7Nghh nQDiPꨴ'+iZ'No4|'M{ ϒUz&vn[pBUљ~ChWs&-(~dHXF"(zq߆R=D6BCC=`444`ʔ)hhh@YYdYFKK ;gʖ|vo`_<\A(sil(EoKCwr҉#؝ݫlҐ= vbອdwtר~M`Kcϳⳗ_f<8s2͛'س|=DK7aʫg:m? ԓ]Tx"B ' :杍V$8cye$~#mჇoб?τ7!_娿Q@] Grs6(z0nG0hc?yQuDbppl갡ˤTHPfBlNuXo=.֭[z Î_*pC}"xY^I&q p#ħbB|2o8ҫy-2 34{\{XtI2rT5abu8Ô1tY85-cm'"i3c+T_оBlڇLo]hrJQ #PI@Z.3Y8ٳ1me3ψ#I.~C7"pS6c(Z3?$V^mg \(k114Q~s7& I&oF4Ⱥ>@]enmgiò;G3L A%>w8Ual&tW7`2?Dď(#a6k^X/)wcf#1 QŸz% Vh?\&9R3OpirT/-[3 O7e*VPT6\}ff/8:yYJBF&R2wZr8˫qڿdܟTڰYs`+N5 ,0e9|j `0شiS$%!"W&o.r l?l\8l2d̗#a[Ӷ"eDzڮફ2g/6rREjqکxwsef) 06׀@vdsyq3G0;[@~|sK`9C6nەeϲCi@7n'Q \v̭~D}租˘/ٮ^I}(@Fe fB!3gr ƾެ\\MIEfL4ӫirRy }?E' 1QGo90ތE+fOp4jo_nfԓ]6 S2XVGmq>w!$/5?(!.><<Dz刉s&פ{woK @T]#O"Λ8S~yشOT] W8KL+k獭":;;MM$ҶJf2Sc9!)&ޓ-V_!J|2pyX}XZʝ8e(BUz+iZ $zf܁ŠrY&ߍ=q5-]7m'L./n>?\y;}>}z>/qø}3i D)L`bH"[\SưQdúEmRK od+/?~ TeZp=L:5]q !_dYĝ&ε% u0Oo?7M< Jg Y'0wAGiۘj!s ᖴ43o BCHakâ3Z2u\-y |9G1u?7,}Z$(#6 R(k RkvsW>yCopyFAV5 ypϡ}l/J-o?o˖-SYDi(._1?`&HoCsE}M4o0bpOG3OEWŶnGJ&B;T%k1ƒ >7|'V }t[6L/JG?X@iOx_gu~Opfc꩒r?܌]Ci<=}iK:(熬h e5ۺyrg(}:Z,V+; ~#I?~{ +UG?߶%tx?0;%!\*m K7olzX%OT}I|rбe<?owB @G `j5$q24y&1\p!}i\؎z}C8cIغu+֬Yݞ5He׿:e]p-Z[i_HyMçk[B2ME|nڵk?ZO[O Ds[{k"ps?|V Ƶ0]^_Ym6 `Ʈ^N^:}yx[n7M+x饗SS}P{` VXno\xRQFNq8RS $Ip(/_ hjjBSSZZZ҂Ǐ88cppUUU4i_tSN_]LXؘ~8q׏ X v XXk,X`a1bc 8 qLA !رB9 f (<|P8/G,,FsA |AAl6eR9gX:QJ,˰ly9.n+v;!TEDqX sYEB0En;z^~V?&FQ9*(a8 !DEQl6>}^`֭zr5ι"B(fb +sM y^u֜:7Xf ohh}}}sEs@0/g_<9Jg}}}Y&>'wϟ_~e>m4 U Q'?D^7,,98\~Ƙ,t:i[[>T+Eo:l6R꥔V2.Nι1& p  !1A!*(,$OEQe׫655u1$n9dyKK ohh]]] !Cb96ιGscBTAAX2(IR@9 j>Fnݺ+WŖ&RPU AB$J@Ŝtf4 A>LEMOrm6[HE1 ZSS}gXV-N!wu8.Iu\i!EQ$JH$I"R"TUZ(AqJ)EvM$5 `PeYkhhFX#s}Cw$eY=H~p8v=~[X(t^q u8RL[f͸ MMM1"}}}OE (-,Rv'Nvs}SSoll~0GB.]B"m֭[ N9~p@'"EIg[XXXXXXgb}ΪIENDB`(0` %TTTllliiiooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooiiilllTTTlllƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƯ}lllnnnnnnooooooooooooooob9b8{[4wW0uV/jT8{]8nO*yjWoqS.[)f.xS&hO/ooooooGFzYw;u9t8~[0h0h/v_Byah/h/h/h/h/h/Y)ooooooIGv;yy=w`5o5o5\-h/h/ooooooÐNŽMŹEDsPy@}?a5q6q6zZ4˼h/h/oooooooŒOĐNxJF~BzB~@c6r8s7{aAh/h/|hPooooooȓQǒPǹIHzY|CBd8t9u9y];h/h/t^ooooooʕRȔQ|IJE}DCe8v:v:|Z1Ÿh/h/oooooo̗SʕRMKeFDg9w{>z=l5d?n4m3ooooooìҜXЛVMʕRIIIj<|@}@mBw>q8sW4mV~fJ`1q6p5e:ooooooìԞYҜX͘T̖SJJl=}AAiKx>yBBjKkzOsȷooooooìԞYԞY}NӝXћWMMn?DDkLooooooìԞYԞYӝYԞYNNÐNo@EElMooooooìԞYԞYԞYԞYPŒOqAFFmMooooooìԞYԞYԞYQQȓQrBHHnNoooooo̶̶̶мȲ˻IIoOooooooooooooooooooƴDDDDDDDDDDDDDDD]]]aaag~[1}Z1VVVYYYmJ|Z1sT/ooooooLLLxxxNNNMMMzRmWWWb.ooooooLLLNNNMMMWsFFFk5f=ooooooLLLNNNMMM]vIIIyyyu=ooooooLLLNNNCCCMMMTTTooocxOOODDDDooooooLLLNNNEEEhhhSSSKKKAAAeyGGGPPPMooooooLLLNNNMMMKKKFFFeycccYYYÓTżooooooLLLNNNMMMYYY>>>eybbbcccÓTeooooooLLLNNNMMMJJJAAAe{c’SooooooLLL}}}NNNBBBmmmHHHLLLë__t_aooooooƬJJJJJJJJJJJJJJJYYYJJJJJJLLLmmmooooootttooorrrooovvvQppp ooozrrrooo󏏏lll>hhhooo~~~mmm:ooonnn𙙙~~~lllEjjj&sssuuu ĭĭĭĭĭĭĭĭĭĭĭĭĭĭĭĮĜٗ׊rrrTmmm3mmm%lllppplllTTTlllnnnooooooooooooooooooooooooooooooooooooooooooooooootttnnnlllppplll?( @ |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||Gұy>t8Ħh/ȮĪk3h/j1Ǭ||||||IԳʪy||||||ÏMط˧{C|?˫q6VŬh/||||||ǒPڹFҲAͭt8ǩϻh/ѿ||||||ʕRܺΦtOCϮw:jϸh/||||||͘T޼MáEѰy={@hk2||||||КVྒྷҦpʚ]GҲ|?{>ֽs:~||||||ӝX˖SӵJԴAϰ`T`u:\||||||ԞYרmըnLֶCֺԺк||||||ԞY֢`ԞYÐNٷEؼ||||||ԞYԞY޵ǓP۹Hٽ||||||ննոJۿ||||||||||||||||||wwwjҿd||||||үŤ}ȱ||||||mmmݺҰ||||||ppp㿑޻||||||rrr㿑㿑ڿ||||||```޳~޵||||||iiittt[[[rrrwww||||||||||||||||||||||||||||||||||||{{{||||||||||||||||||yyy|||||||||yyy|||||||||zzz|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||?(0 ` ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||LͰt8s<Įt@o9p:κ||||||OʹOx;m3}Kʲl5||||||ŒRRи{>q6ͳq;η||||||ʖUع̧yAt8k||||||͚X‘SDx;ʲTȭ||||||ў\իvɧG{>ǥ}l2κ||||||ա^ؽԦlJLίmԻ~Gd||||||ՠ\צfMNɯʫֿ||||||ԞYҰȓPQ||||||T||||||LLLLLLQQQ||||||LLLLLLLLLLLLΙU̙XQQQJL||||||LLLLLLӟ]LLLLLLQQQOÑQ||||||LLLLLLLLLLLLա^QQQQQQĒR||||||LLLLLLLLLա^QQQQQQɖUÑQ||||||LLLLLLLLLLLLLLLLLLԞYա^ϙU̙X||||||||||||||||||||||||||||||||||||{{{|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| (  @|||||||||||||||||||||||||||||||||||||||||||||||||||||||||Gau9m5qe}L||||||Kbz=o4ȯŭ||||||đOȫAu:нo||||||˖SɛbEx;Ůx||||||ћWװI~@ֽc˷||||||ԞY˜MHԿȧȯ||||||ԞY٩kɔQK||||||ԞYØϙUO||||||||||||||||||||||||||||||{{{||||||||||||||||||||||||||||||||||||||| ipython-8.35.0/setup.cfg000066400000000000000000000001501477474304100151310ustar00rootroot00000000000000[velin] ignore_patterns = IPython/core/tests IPython/testing [tool.black] exclude = 'timing\.py' ipython-8.35.0/setup.py000066400000000000000000000111611477474304100150260ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Setup script for IPython. Under Posix environments it works like a typical setup.py script. Under Windows, the command sdist is not supported, since IPython requires utilities which are not available under Windows.""" #----------------------------------------------------------------------------- # Copyright (c) 2008-2011, IPython Development Team. # Copyright (c) 2001-2007, Fernando Perez # Copyright (c) 2001, Janko Hauser # Copyright (c) 2001, Nathaniel Gray # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.rst, distributed with this software. #----------------------------------------------------------------------------- import os import sys # **Python version check** # # This check is also made in IPython/__init__, don't forget to update both when # changing Python version requirements. if sys.version_info < (3, 10): pip_message = 'This may be due to an out of date pip. Make sure you have pip >= 9.0.1.' try: import pip pip_version = tuple([int(x) for x in pip.__version__.split('.')[:3]]) if pip_version < (9, 0, 1) : pip_message = 'Your pip version is out of date, please install pip >= 9.0.1. '\ 'pip {} detected.'.format(pip.__version__) else: # pip is new enough - it must be something else pip_message = '' except Exception: pass error = """ IPython 8.19+ supports Python 3.10 and above, following SPEC0 IPython 8.13+ supports Python 3.9 and above, following NEP 29. IPython 8.0-8.12 supports Python 3.8 and above, following NEP 29. When using Python 2.7, please install IPython 5.x LTS Long Term Support version. Python 3.3 and 3.4 were supported up to IPython 6.x. Python 3.5 was supported with IPython 7.0 to 7.9. Python 3.6 was supported with IPython up to 7.16. Python 3.7 was still supported with the 7.x branch. See IPython `README.rst` file for more information: https://github.com/ipython/ipython/blob/main/README.rst Python {py} detected. {pip} """.format( py=sys.version_info, pip=pip_message ) print(error, file=sys.stderr) sys.exit(1) # At least we're on the python version we need, move on. from setuptools import setup # Our own imports from setupbase import target_update from setupbase import ( setup_args, check_package_data_first, find_data_files, git_prebuild, ) #------------------------------------------------------------------------------- # Handle OS specific things #------------------------------------------------------------------------------- if os.name in ('nt','dos'): os_name = 'windows' else: os_name = os.name # Under Windows, 'sdist' has not been supported. Now that the docs build with # Sphinx it might work, but let's not turn it on until someone confirms that it # actually works. if os_name == 'windows' and 'sdist' in sys.argv: print('The sdist command is not available under Windows. Exiting.') sys.exit(1) #------------------------------------------------------------------------------- # Things related to the IPython documentation #------------------------------------------------------------------------------- # update the manuals when building a source dist if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'): # List of things to be updated. Each entry is a triplet of args for # target_update() to_update = [ ( "docs/man/ipython.1.gz", ["docs/man/ipython.1"], "cd docs/man && python -m gzip --best ipython.1", ), ] [ target_update(*t) for t in to_update ] #--------------------------------------------------------------------------- # Find all the packages, package data, and data_files #--------------------------------------------------------------------------- data_files = find_data_files() setup_args['data_files'] = data_files #--------------------------------------------------------------------------- # custom distutils commands #--------------------------------------------------------------------------- # imports here, so they are after setuptools import if there was one from setuptools.command.sdist import sdist setup_args['cmdclass'] = { 'build_py': \ check_package_data_first(git_prebuild('IPython')), 'sdist' : git_prebuild('IPython', sdist), } #--------------------------------------------------------------------------- # Do the actual setup now #--------------------------------------------------------------------------- if __name__ == "__main__": setup(**setup_args) ipython-8.35.0/setupbase.py000066400000000000000000000160561477474304100156710ustar00rootroot00000000000000# encoding: utf-8 """ This module defines the things that are used in setup.py for building IPython This includes: * The basic arguments to setup * Functions for finding things like packages, package data, etc. * A function for checking dependencies. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import os from pathlib import Path import re import sys from glob import glob from logging import log from setuptools import Command from setuptools.command.build_py import build_py from setuptools.command.install import install from setuptools.command.install_scripts import install_scripts #------------------------------------------------------------------------------- # Useful globals and utility functions #------------------------------------------------------------------------------- # A few handy globals repo_root = Path(__file__).resolve().parent def execfile(path, globs, locs=None): locs = locs or globs with path.open(encoding="utf-8") as f: exec(compile(f.read(), str(path), "exec"), globs, locs) #--------------------------------------------------------------------------- # Basic project information #--------------------------------------------------------------------------- # release.py contains version, authors, license, url, keywords, etc. execfile(Path(repo_root, "IPython", "core", "release.py"), globals()) # Create a dict with the basic information # This dict is eventually passed to setup after additional keys are added. setup_args = dict( author = author, author_email = author_email, license = license, ) #--------------------------------------------------------------------------- # Check package data #--------------------------------------------------------------------------- def check_package_data(package_data): """verify that package_data globs make sense""" print("checking package data") for pkg, data in package_data.items(): pkg_root = Path(*pkg.split(".")) for d in data: path = pkg_root / d if "*" in str(path): assert len(glob(str(path))) > 0, "No files match pattern %s" % path else: assert path.exists(), f"Missing package data: {path}" def check_package_data_first(command): """decorator for checking package_data before running a given command Probably only needs to wrap build_py """ class DecoratedCommand(command): def run(self): check_package_data(self.package_data) command.run(self) return DecoratedCommand #--------------------------------------------------------------------------- # Find data files #--------------------------------------------------------------------------- def find_data_files(): """ Find IPython's data_files. Just man pages at this point. """ if "freebsd" in sys.platform: manpagebase = Path("man") / "man1" else: manpagebase = Path("share") / "man" / "man1" # Simple file lists can be made by hand manpages = [f for f in Path("docs/man").glob("*.1.gz") if f.is_file()] if not manpages: # When running from a source tree, the manpages aren't gzipped manpages = [f for f in Path("docs/man").glob("*.1") if f.is_file()] # And assemble the entire output list data_files = [(str(manpagebase), [str(f) for f in manpages])] return data_files # The two functions below are copied from IPython.utils.path, so we don't need # to import IPython during setup, which fails on Python 3. def target_outdated(target, deps): """Determine whether a target is out of date. target_outdated(target,deps) -> 1/0 deps: list of filenames which MUST exist. target: single filename which may or may not exist. If target doesn't exist or is older than any file listed in deps, return true, otherwise return false. """ try: target_time = Path(target).stat().st_mtime except FileNotFoundError: return 1 for dep in deps: dep_time = Path(dep).stat().st_mtime if dep_time > target_time: # print("For target",target,"Dep failed:",dep) # dbg # print("times (dep,tar):",dep_time,target_time) # dbg return 1 return 0 def target_update(target, deps, cmd): """Update a target with a given command given a list of dependencies. target_update(target,deps,cmd) -> runs cmd if target is outdated. This is just a wrapper around target_outdated() which calls the given command if target is outdated.""" if target_outdated(target, deps): os.system(cmd) #--------------------------------------------------------------------------- # VCS related #--------------------------------------------------------------------------- def git_prebuild(pkg_dir, build_cmd=build_py): """Return extended build or sdist command class for recording commit records git commit in IPython.utils._sysinfo.commit for use in IPython.utils.sysinfo.sys_info() calls after installation. """ class MyBuildPy(build_cmd): ''' Subclass to write commit data into installation tree ''' def run(self): # loose as `.dev` is suppose to be invalid print("check version number") loose_pep440re = re.compile(r'^(\d+)\.(\d+)\.(\d+((a|b|rc)\d+)?)(\.post\d+)?(\.dev\d*)?$') if not loose_pep440re.match(version): raise ValueError("Version number '%s' is not valid (should match [N!]N(.N)*[{a|b|rc}N][.postN][.devN])" % version) build_cmd.run(self) # this one will only fire for build commands if hasattr(self, 'build_lib'): self._record_commit(self.build_lib) def make_release_tree(self, base_dir, files): # this one will fire for sdist build_cmd.make_release_tree(self, base_dir, files) self._record_commit(base_dir) def _record_commit(self, base_dir): import subprocess proc = subprocess.Popen('git rev-parse --short HEAD', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) repo_commit, _ = proc.communicate() repo_commit = repo_commit.strip().decode("ascii") out_pth = Path(base_dir) / pkg_dir / "utils" / "_sysinfo.py" if out_pth.is_file() and not repo_commit: # nothing to write, don't clobber return print(f"writing git commit '{repo_commit}' to {out_pth}") # remove to avoid overwriting original via hard link try: out_pth.unlink() except FileNotFoundError: pass with out_pth.open("w", encoding="utf-8") as out_file: out_file.writelines( [ "# GENERATED BY setup.py\n", f'commit = "{repo_commit}"\n', ] ) return MyBuildPy ipython-8.35.0/tools/000077500000000000000000000000001477474304100144545ustar00rootroot00000000000000ipython-8.35.0/tools/alldeps/000077500000000000000000000000001477474304100161005ustar00rootroot00000000000000ipython-8.35.0/tools/alldeps/Makefile000066400000000000000000000062461477474304100175500ustar00rootroot00000000000000# Simple makefile to rapidly deploy IPython with all its dependencies. # Configuration section. The version numbers and paths declared here may # change with each release. # IPython version IPYTHON_VER=0.9.1 # Declare here version numbers of all the dependencies PYOPENSSL_VER=0.6 ZOPE_INTERFACE_VER=3.4.1 TWISTED_VER=8.1.0 FOOLSCAP_VER=0.3.1 NOSE_VER=0.10.3 # Repository URLs for all packages. Make sure these are correct for each # release, since projects may change paths! IPYTHON_REPO=http://ipython.scipy.org/dist PYOPENSSL_REPO=http://downloads.sourceforge.net/pyopenssl ZOPE_INTERFACE_REPO=http://pypi.python.org/packages/source/z/zope.interface TWISTED_REPO=http://tmrc.mit.edu/mirror/twisted/Twisted/8.1 FOOLSCAP_REPO=http://foolscap.lothar.com/releases NOSE_REPO=http://somethingaboutorange.com/mrl/projects/nose #----------------------------------------------------------------------------- # Main code begins. There shouldn't be much to change here with each release. # # Hand-written files to ship in self-contained tarball SOURCES=pkginstall pkginstall.cfg Makefile README.txt README.html # Versions of tarballs we ship IPYTHON=ipython-$(IPYTHON_VER).tar.gz IP_ALLDEPS=ipython-alldeps-$(IPYTHON_VER) PYOPENSSL=pyOpenSSL-$(PYOPENSSL_VER).tar.gz ZOPE_INTERFACE=zope.interface-$(ZOPE_INTERFACE_VER).tar.gz NOSE=nose-$(NOSE_VER).tar.gz TWISTED=Twisted-$(TWISTED_VER).tar.bz2 FOOLSCAP=foolscap-$(FOOLSCAP_VER).tar.gz TARBALLS=$(PYOPENSSL) $(ZOPE_INTERFACE) $(TWISTED) $(FOOLSCAP) \ $(NOSE) $(IPYTHON) # URLs for downloads #----------------------------------------------------------------------------- # Target declaration # # Targets to install, in correct dependency order install: pyopenssl zope.interface twisted foolscap nose ipython echo echo "IPython Installation finished." echo "You can now run the ipython test suite by running:" echo "iptest" echo "If all tests pass, you can delete this entire directory." echo # Download targets download: $(TARBALLS) $(IPYTHON): wget $(IPYTHON_REPO)/$(IPYTHON) $(PYOPENSSL): wget $(PYOPENSSL_REPO)/$(PYOPENSSL) $(ZOPE_INTERFACE): wget $(ZOPE_INTERFACE_REPO)/$(ZOPE_INTERFACE) $(TWISTED): wget $(TWISTED_REPO)/$(TWISTED) $(FOOLSCAP): wget $(FOOLSCAP_REPO)/$(FOOLSCAP) $(NOSE): wget $(NOSE_REPO)/$(NOSE) # The calls to pkginstall must use the actual Python package name nose: $(NOSE) ./pkginstall nose zope.interface: $(ZOPE_INTERFACE) ./pkginstall zope.interface zope pyopenssl: $(PYOPENSSL) ./pkginstall pyOpenSSL OpenSSL twisted: $(TWISTED) ./pkginstall Twisted foolscap: $(FOOLSCAP) ./pkginstall foolscap ipython: $(IPYTHON) ./pkginstall ipython IPython # Distribution targets dist: $(IP_ALLDEPS).tar $(IP_ALLDEPS).tar: download readme -mkdir $(IP_ALLDEPS) -ln $(SOURCES) $(TARBALLS) $(IP_ALLDEPS)/ tar cf $(IP_ALLDEPS).tar $(IP_ALLDEPS) rm -rf $(IP_ALLDEPS) readme: README.html README.html: README.txt rst2html README.txt > README.html # Auxiliary targets upload: dist rsync -e ssh -av README.html $(IP_ALLDEPS).tar \ ipython@ipython.scipy.org:www/dist/alldeps clean: ls -p | grep /$ | xargs rm -rf rm -f $(IP_ALLDEPS)* *~ distclean: clean rm -f $(TARBALLS) rm README.html info: echo "TARBALLS" echo $(TARBALLS) ipython-8.35.0/tools/alldeps/README.txt000066400000000000000000000064031477474304100176010ustar00rootroot00000000000000=========================================================== Self-contained IPython installation with all dependencies =========================================================== This is a self-contained source distribution of IPython with all its *non-graphical* dependencies, that installs in a single ``make`` call to your home directory (by default) or any location of your choice. This distribution is meant for developer-type usage in Unix environments, it is *not* an easy way to get IPython working on Windows, since it assumes the presence of a working compiler and development tools. Currently, the distribution contains:: ipython-0.9.1.tar.gz pyOpenSSL-0.6.tar.gz zope.interface-3.4.1.tar.gz Twisted-8.1.0.tar.bz2 foolscap-0.3.1.tar.gz nose-0.10.3.tar.gz Usage ===== Download the single tarball where this README file lives and unpack it. If your system is already configured as described below, these lines will do the whole job:: wget http://ipython.scipy.org/dist/alldeps/ipython-alldeps-0.9.1.tar tar xf ipython-alldeps-0.9.1.tar cd ipython-alldeps-0.9.1 make If all goes well, then just type:: iptest to run IPython's test suite. It is meant to be used in an environment where you have your ``$PATH``, ``$PYTHONPATH``, etc variables properly configured, so that the installation of packages can be made with (using ``~/usr/local`` as an example):: pip install . --prefix=~/usr/local For an explanation of how to do this, see below. You can configure the default prefix used by editing the file ``pkginstall.cfg``, where you can also override the python version used for the process. If your system is configured in this manner, you can simply type:: make and this will build and install all of IPython's non-graphical dependencies on your system, assuming you have Python, a compiler, the Python headers and the SSL headers available. .. _environment_configuration: Environment configuration ========================= Below is an example of what to put in your ``~/.bashrc`` file to configure your environment as described in this document, in a reasonably portable manner that takes 64-bit operating systems into account:: # For processor dependent config MACHINE=$(uname -m) # Python version information PYVER=$(python -ESV 2>&1) PYVER_MINOR=${PYVER#Python } PYVER_MAJOR=${PYVER_MINOR:0:3} function export_paths { # Export useful paths based on a common prefix # Input: a path prefix local prefix=$1 local pp local lp local pypath=python${PYVER_MAJOR}/site-packages # Compute paths with 64-bit specifics if [[ $MACHINE == "x86_64" ]]; then lp=$prefix/lib64:$prefix/lib pp=$prefix/lib64/$pypath:$prefix/lib/$pypath else lp=$prefix/lib pp=$prefix/lib/$pypath fi # Set paths based on given prefix export PATH=$prefix/bin:$PATH export CPATH=$prefix/include:$CPATH export LD_LIBRARY_PATH=$lp:$LD_LIBRARY_PATH export LIBRARY_PATH=$lp:$LIBRARY_PATH export PYTHONPATH=$pp:$PYTHONPATH } # Actually call the export function to set the paths. If you want more than # one such prefix, note that the call *prepends* the new prefix to the # existing paths, so later calls take priority. export_paths $HOME/usr/local ipython-8.35.0/tools/alldeps/pkginstall000077500000000000000000000062621477474304100202040ustar00rootroot00000000000000#!/bin/bash # # Simple installation shell script for Python packages. # # Usage: # pkginstall PAKPREFIX [PYPACKAGE] # # PAKPREFIX: prefix of the package as distributed in the tarball. # # PYPACKAGE: name of the Python package as it will end up installed. If not # given, it defaults to PAKPREFIX. # #----------------------------------------------------------------------------- # Process command-line args # PAKPREFIX=$1 PYPACKAGE=${2:-$PAKPREFIX} #----------------------------------------------------------------------------- # Configure main variables # # Defaults for variables that the .cfg file may override. PYTHON_DEFAULT=python PREFIX_DEFAULT=$HOME/usr/local # Read config file which may declare user values for these variables. source ./pkginstall.cfg # Set the variables we'll actually use, either from the config file or from our # defaults. PYTHON=${PYTHON-${PYTHON_DEFAULT}} PREFIX=${PREFIX-${PREFIX_DEFAULT}} #----------------------------------------------------------------------------- # 'Main' code begins # # Find the actual python executable path PYTHONX=$(which $PYTHON) if [[ ! -x $PYTHONX ]]; then echo "ERROR: no python executable found at given path: $PYTHON" echo "Aborting." exit 1 fi # Python version information. PYTHONV holds a versioned string used to build # the site-packages path for the actual Python version we'll use. PYVER=$($PYTHONX -ESV 2>&1) PYVER_MINOR=${PYVER#Python } PYVER_MAJOR=${PYVER_MINOR:0:3} PYTHONV=python${PYVER_MAJOR} # Set prefixes and other variables for the installation path. SITEPKG=${PREFIX}/lib/${PYTHONV}/site-packages SITEPKG64=${PREFIX}/lib64/${PYTHONV}/site-packages # User diagnostics of current config echo "Configuration:" echo " PYTHON : $PYTHON" echo " PYTHONX : $PYTHONX" echo " PREFIX : $PREFIX" echo " SITEPKG : $SITEPKG" echo " SITEPKG64: $SITEPKG64" # Find tarball tarball=$(ls *$PAKPREFIX*.tar.*) if [[ -z $tarball ]]; then echo "ERROR: tarball not found for $PYPACKAGE" exit 1 fi # Figure out the name of the directory and compression format to use to unpack pakdir=$(echo $tarball | awk -F '.tar.' '{print $1}') tarfmt=$(echo $tarball | awk -F '.tar.' '{print $2}') if [[ $tarfmt == "gz" ]]; then tarflag="z" else tarflag="j" fi # Unpack the tarball if needed if [[ ! -d $pakdir ]]; then echo "Unpacking tarball: $tarball" tar -x -${tarflag} -f $tarball if [[ ! -d $pakdir ]]; then echo "Tarball $tarball unpacked to unexpected path, aborting" exit 1 fi fi # Remove existing ${PYPACKAGE} to make sure the build doesn't pick up spurious # things. We don't touch the bin/ dir or anything else because it's hard to # know what goes there in advance. But this should prevent most serious # problems. rm -rf $SITEPKG/${PYPACKAGE} rm -rf $SITEPKG/${PYPACKAGE}*.egg rm -rf $SITEPKG/${PYPACKAGE}*.egg-info rm -rf $SITEPKG64/${PYPACKAGE} rm -rf $SITEPKG64/${PYPACKAGE}*.egg rm -rf $SITEPKG64/${PYPACKAGE}*.egg-info # Make/install phase # Set python search path correctly export PYTHONPATH=$SITEPKG:$SITEPKG64:$PYTHONPATH # Ensure install dirs exist mkdir -p $SITEPKG mkdir -p $SITEPKG64 cd ${pakdir} rm -rf build dist $PYTHONX setup.py clean time $PYTHONX setup.py install --prefix=$PREFIX ipython-8.35.0/tools/alldeps/pkginstall.cfg000066400000000000000000000016641477474304100207400ustar00rootroot00000000000000# -*- sh -*- # # Configuration for the pkginstall script. # This script uses bash syntax, as it will be sourced by a bash script. # Uncomment and set the variables you want, otherwise pkginstall has sensible # defaults predefined. These can also be declared either as environment # variables (which can be done by the makefile calling this script). #----------------------------------------------------------------------------- # # Executable for Python. # # You can set this to an explicit full path if you don't want the default # (simply 'python') to be the version used to install this package. #PYTHON=python #----------------------------------------------------------------------------- # # Default prefix. # # This should be a valid input the setup.py script as the --prefix argument. # That is, your $PYTHONPATH should contain $PREFIX/lib/pythonX.Y/site-packages, # your $PATH should contain $PREFIX/bin, etc. #PREFIX=$HOME/usr/local ipython-8.35.0/tools/autoformat_file000077500000000000000000000016461477474304100175710ustar00rootroot00000000000000#!/bin/bash set -ueo pipefail FILE=$1 echo "will update $FILE" echo $LINENO $? pyupgrade --py36-plus --exit-zero-even-if-changed $FILE echo $LINENO $? git commit -am"Apply pyupgrade to $FILE pyupgrade --py36-plus $FILE To ignore those changes when using git blame see the content of .git-blame-ignore-revs" HASH=$(git rev-parse HEAD) echo "$HASH # apply pyupgrade to $FILE" >> .git-blame-ignore-revs git commit -am'Update .git-blame-ignore-revs with previous commit' ##### black --target-version py36 $FILE git commit -am"Apply black to $FILE black --target-version py36 $FILE To ignore those changes when using git blame see the content of .git-blame-ignore-revs" HASH=$(git rev-parse HEAD) echo "$HASH # apply black to $FILE" >> .git-blame-ignore-revs git commit -am'Update .git-blame-ignore-revs with previous commit' echo echo "Updating, reformatting and adding to .git-blame-ignore-revs successful" ipython-8.35.0/tools/build_release000077500000000000000000000007551477474304100172100ustar00rootroot00000000000000#!/usr/bin/env python3 """IPython release build script. """ import os import sys from toollib import sh, get_ipdir, cd, build_command def build_release(): # Get main ipython dir, this will raise if it doesn't pass some checks ipdir = get_ipdir() cd(ipdir) # Build source and binary distros sh(build_command) # don't try to change, xz, bz2 deprecated. sh(' '.join([sys.executable, 'tools/retar.py', 'dist/*.gz'])) if __name__ == '__main__': build_release() ipython-8.35.0/tools/check_sources.py000066400000000000000000000025271477474304100176540ustar00rootroot00000000000000#!/usr/bin/env python """Utility to look for hard tabs and \r characters in all sources. Usage: ./check_sources.py It prints summaries and if chosen, line-by-line info of where \\t or \\r characters can be found in our source tree. """ # Config # If true, all lines that have tabs are printed, with line number full_report_tabs = True # If true, all lines that have tabs are printed, with line number full_report_rets = False # Code begins from IPython.external.path import path rets = [] tabs = [] for f in path('..').walkfiles('*.py'): errs = '' cont = f.bytes() if '\t' in cont: errs+='t' tabs.append(f) if '\r' in cont: errs+='r' rets.append(f) if errs: print("%3s" % errs, f) if 't' in errs and full_report_tabs: for ln,line in enumerate(f.lines()): if '\t' in line: print('TAB:',ln,':',line, end=' ') if 'r' in errs and full_report_rets: for ln,line in enumerate(open(f.abspath(),'rb')): if '\r' in line: print('RET:',ln,':',line, end=' ') # Summary at the end, to call cleanup tools if necessary if tabs: print('Hard tabs found. These can be cleaned with untabify:') for f in tabs: print(f, end=' ') if rets: print('Carriage returns (\\r) found in:') for f in rets: print(f, end=' ') ipython-8.35.0/tools/configure-git-blame-ignore-revs.bat000066400000000000000000000006511477474304100232240ustar00rootroot00000000000000rem Other config options for blame are markUnblamables and markIgnoredLines. rem See docs for more details: rem https://git-scm.com/docs/git-config#Documentation/git-config.txt-blameignoreRevsFile rem Uncomment below and rerun script to enable an option. rem git config blame.markIgnoredLines rem git config blame.markUnblamables git config blame.ignoreRevsFile .git-blame-ignore-revs git config --get blame.ignoreRevsFile ipython-8.35.0/tools/configure-git-blame-ignore-revs.sh000077500000000000000000000006471477474304100231000ustar00rootroot00000000000000#!/bin/sh # Other config options for blame are markUnblamables and markIgnoredLines. # See docs for more details: # https://git-scm.com/docs/git-config#Documentation/git-config.txt-blameignoreRevsFile # Uncomment below and rerun script to enable an option. # git config blame.markIgnoredLines # git config blame.markUnblamables git config blame.ignoreRevsFile .git-blame-ignore-revs git config --get blame.ignoreRevsFile ipython-8.35.0/tools/fixup_whats_new_pr.py000066400000000000000000000022251477474304100207420ustar00rootroot00000000000000""" This tool is used during CI testing to make sure sphinx raise no error. During development, we like to have whatsnew/pr/*.rst documents to track individual new features. Unfortunately they other either: - have no title (sphinx complains) - are not included in any toctree (sphinx complain) This fix-them up by "inventing" a title, before building the docs. At release time, these title and files will anyway be rewritten into the actual release notes. """ from pathlib import Path def main(): folder = Path("docs/source/whatsnew/pr/") files = list(folder.glob("*.rst")) print(files) for filepath in files: print("Adding pseudo-title to:", filepath.name) title = filepath.name[:-4].split("/")[-1].replace("-", " ").capitalize() data = filepath.read_text(encoding="utf-8") try: if data and data.splitlines()[1].startswith('='): continue except IndexError: pass with filepath.open("w", encoding="utf-8") as f: f.write(title + "\n") f.write("=" * len(title) + "\n\n") f.write(data) if __name__ == '__main__': main() ipython-8.35.0/tools/gen_latex_symbols.py000066400000000000000000000052401477474304100205450ustar00rootroot00000000000000# coding: utf-8 # This script autogenerates `IPython.core.latex_symbols.py`, which contains a # single dict , named `latex_symbols`. The keys in this dict are latex symbols, # such as `\\alpha` and the values in the dict are the unicode equivalents for # those. Most importantly, only unicode symbols that are valid identifiers in # Python 3 are included. # # The original mapping of latex symbols to unicode comes from the `latex_symbols.jl` files from Julia. from pathlib import Path # Import the Julia LaTeX symbols print('Importing latex_symbols.js from Julia...') import requests url = 'https://raw.githubusercontent.com/JuliaLang/julia/master/stdlib/REPL/src/latex_symbols.jl' r = requests.get(url) # Build a list of key, value pairs print('Building a list of (latex, unicode) key-value pairs...') lines = r.text.splitlines() prefixes_line = lines.index('# "font" prefixes') symbols_line = lines.index('# manual additions:') prefix_dict = {} for l in lines[prefixes_line + 1: symbols_line]: p = l.split() if not p or p[1] == 'latex_symbols': continue prefix_dict[p[1]] = p[3] idents = [] for l in lines[symbols_line:]: if not '=>' in l: continue # if it's not a def, skip if '#' in l: l = l[:l.index('#')] # get rid of eol comments x, y = l.strip().split('=>') if '*' in x: # if a prefix is present substitute it with its value p, x = x.split('*') x = prefix_dict[p][:-1] + x[1:] x, y = x.split('"')[1], y.split('"')[1] # get the values in quotes idents.append((x, y)) # Filter out non-valid identifiers print('Filtering out characters that are not valid Python 3 identifiers') def test_ident(i): """Is the unicode string valid in a Python 3 identifier.""" # Some characters are not valid at the start of a name, but we still want to # include them. So prefix with 'a', which is valid at the start. return ('a' + i).isidentifier() assert test_ident("α") assert not test_ident('‴') valid_idents = [line for line in idents if test_ident(line[1])] # Write the `latex_symbols.py` module in the cwd s = f"""# encoding: utf-8 # DO NOT EDIT THIS FILE BY HAND. # To update this file, run the script /tools/gen_latex_symbols.py using Python 3 # This file is autogenerated from the file: # {url} # This original list is filtered to remove any unicode characters that are not valid # Python identifiers. latex_symbols = {{\n """ for line in valid_idents: s += ' "%s" : "%s",\n' % (line[0], line[1]) s += "}\n" s += """ reverse_latex_symbol = { v:k for k,v in latex_symbols.items()} """ fn = Path("..", "IPython", "core", "latex_symbols.py") print("Writing the file: %s" % str(fn)) fn.write_text(s, encoding="utf-8") ipython-8.35.0/tools/gh_api.py000066400000000000000000000101111477474304100162470ustar00rootroot00000000000000"""Functions for Github API requests.""" try: input = raw_input except NameError: pass import re import sys import requests import getpass import json try: import requests_cache except ImportError: print("cache not available, install `requests_cache` for caching.", file=sys.stderr) else: requests_cache.install_cache("gh_api", expire_after=3600) # Keyring stores passwords by a 'username', but we're not storing a username and # password import socket fake_username = 'ipython_tools_%s' % socket.gethostname().replace('.','_').replace('-','_') class Obj(dict): """Dictionary with attribute access to names.""" def __getattr__(self, name): try: return self[name] except KeyError as e: raise AttributeError(name) from e def __setattr__(self, name, val): self[name] = val token = None def get_auth_token(): global token if token is not None: return token import keyring token = keyring.get_password('github', fake_username) if token is not None: return token print( "Get a token from https://github.com/settings/tokens with public repo and gist." ) token = getpass.getpass("Token: ", stream=sys.stderr) keyring.set_password('github', fake_username, token) return token def make_auth_header(): return {'Authorization': 'token ' + get_auth_token()} def get_pull_request(project, num, auth=False): """get pull request info by number """ url = "https://api.github.com/repos/{project}/pulls/{num}".format(project=project, num=num) if auth: header = make_auth_header() else: header = None print("fetching %s" % url, file=sys.stderr) response = requests.get(url, headers=header) response.raise_for_status() return json.loads(response.text, object_hook=Obj) element_pat = re.compile(r'<(.+?)>') rel_pat = re.compile(r'rel=[\'"](\w+)[\'"]') def get_paged_request(url, headers=None, **params): """get a full list, handling APIv3's paging""" results = [] params.setdefault("per_page", 100) while True: if '?' in url: params = None print("fetching %s" % url, file=sys.stderr) else: print("fetching %s with %s" % (url, params), file=sys.stderr) response = requests.get(url, headers=headers, params=params) response.raise_for_status() results.extend(response.json()) if 'next' in response.links: url = response.links['next']['url'] else: break return results def get_issues_list(project, auth=False, **params): """get issues list""" params.setdefault("state", "closed") url = "https://api.github.com/repos/{project}/issues".format(project=project) if auth: headers = make_auth_header() else: headers = None pages = get_paged_request(url, headers=headers, **params) return pages def get_milestones(project, auth=False, **params): params.setdefault('state', 'all') url = "https://api.github.com/repos/{project}/milestones".format(project=project) if auth: headers = make_auth_header() else: headers = None milestones = get_paged_request(url, headers=headers, **params) return milestones def get_milestone_id(project, milestone, auth=False, **params): milestones = get_milestones(project, auth=auth, **params) for mstone in milestones: if mstone['title'] == milestone: return mstone['number'] else: raise ValueError("milestone %s not found" % milestone) def is_pull_request(issue): """Return True if the given issue is a pull request.""" return bool(issue.get('pull_request', {}).get('html_url', None)) def get_authors(pr): print("getting authors for #%i" % pr['number'], file=sys.stderr) h = make_auth_header() r = requests.get(pr['commits_url'], headers=h) r.raise_for_status() commits = r.json() authors = [] for commit in commits: author = commit['commit']['author'] authors.append("%s <%s>" % (author['name'], author['email'])) return authors ipython-8.35.0/tools/github_stats.py000066400000000000000000000203511477474304100175270ustar00rootroot00000000000000#!/usr/bin/env python """Simple tools to query github.com and gather stats about issues. To generate a report for IPython 2.0, run: python github_stats.py --milestone 2.0 --since-tag rel-1.0.0 """ #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import sys from argparse import ArgumentParser from datetime import datetime, timedelta from subprocess import check_output from gh_api import ( get_paged_request, make_auth_header, get_pull_request, is_pull_request, get_milestone_id, get_issues_list, get_authors, ) #----------------------------------------------------------------------------- # Globals #----------------------------------------------------------------------------- ISO8601 = "%Y-%m-%dT%H:%M:%SZ" PER_PAGE = 100 #----------------------------------------------------------------------------- # Functions #----------------------------------------------------------------------------- def round_hour(dt): return dt.replace(minute=0,second=0,microsecond=0) def _parse_datetime(s): """Parse dates in the format returned by the Github API.""" if s: return datetime.strptime(s, ISO8601) else: return datetime.fromtimestamp(0) def issues2dict(issues): """Convert a list of issues to a dict, keyed by issue number.""" idict = {} for i in issues: idict[i['number']] = i return idict def split_pulls(all_issues, project="ipython/ipython"): """split a list of closed issues into non-PR Issues and Pull Requests""" pulls = [] issues = [] for i in all_issues: if is_pull_request(i): pull = get_pull_request(project, i['number'], auth=True) pulls.append(pull) else: issues.append(i) return issues, pulls def issues_closed_since(period=timedelta(days=365), project="ipython/ipython", pulls=False): """Get all issues closed since a particular point in time. period can either be a datetime object, or a timedelta object. In the latter case, it is used as a time before the present. """ which = 'pulls' if pulls else 'issues' if isinstance(period, timedelta): since = round_hour(datetime.utcnow() - period) else: since = period url = "https://api.github.com/repos/%s/%s?state=closed&sort=updated&since=%s&per_page=%i" % (project, which, since.strftime(ISO8601), PER_PAGE) allclosed = get_paged_request(url, headers=make_auth_header()) filtered = [ i for i in allclosed if _parse_datetime(i['closed_at']) > since ] if pulls: filtered = [ i for i in filtered if _parse_datetime(i['merged_at']) > since ] # filter out PRs not against main (backports) filtered = [i for i in filtered if i["base"]["ref"] == "main"] else: filtered = [ i for i in filtered if not is_pull_request(i) ] return filtered def sorted_by_field(issues, field='closed_at', reverse=False): """Return a list of issues sorted by closing date date.""" return sorted(issues, key = lambda i:i[field], reverse=reverse) def report(issues, show_urls=False): """Summary report about a list of issues, printing number and title.""" if show_urls: for i in issues: role = 'ghpull' if 'merged_at' in i else 'ghissue' print(u'* :%s:`%d`: %s' % (role, i['number'], i['title'].replace(u'`', u'``'))) else: for i in issues: print(u'* %d: %s' % (i['number'], i['title'].replace(u'`', u'``'))) #----------------------------------------------------------------------------- # Main script #----------------------------------------------------------------------------- if __name__ == "__main__": print("DEPRECATE: backport_pr.py is deprecated and it is now recommended" "to install `ghpro` from PyPI.", file=sys.stderr) # Whether to add reST urls for all issues in printout. show_urls = True parser = ArgumentParser() parser.add_argument('--since-tag', type=str, help="The git tag to use for the starting point (typically the last major release)." ) parser.add_argument('--milestone', type=str, help="The GitHub milestone to use for filtering issues [optional]." ) parser.add_argument('--days', type=int, help="The number of days of data to summarize (use this or --since-tag)." ) parser.add_argument('--project', type=str, default="ipython/ipython", help="The project to summarize." ) parser.add_argument('--links', action='store_true', default=False, help="Include links to all closed Issues and PRs in the output." ) opts = parser.parse_args() tag = opts.since_tag # set `since` from days or git tag if opts.days: since = datetime.utcnow() - timedelta(days=opts.days) else: if not tag: tag = check_output(['git', 'describe', '--abbrev=0']).strip().decode('utf8') cmd = ['git', 'log', '-1', '--format=%ai', tag] tagday, tz = check_output(cmd).strip().decode('utf8').rsplit(' ', 1) since = datetime.strptime(tagday, "%Y-%m-%d %H:%M:%S") h = int(tz[1:3]) m = int(tz[3:]) td = timedelta(hours=h, minutes=m) if tz[0] == '-': since += td else: since -= td since = round_hour(since) milestone = opts.milestone project = opts.project print("fetching GitHub stats since %s (tag: %s, milestone: %s)" % (since, tag, milestone), file=sys.stderr) if milestone: milestone_id = get_milestone_id(project=project, milestone=milestone, auth=True) issues_and_pulls = get_issues_list(project=project, milestone=milestone_id, state='closed', auth=True, ) issues, pulls = split_pulls(issues_and_pulls, project=project) else: issues = issues_closed_since(since, project=project, pulls=False) pulls = issues_closed_since(since, project=project, pulls=True) # For regular reports, it's nice to show them in reverse chronological order issues = sorted_by_field(issues, reverse=True) pulls = sorted_by_field(pulls, reverse=True) n_issues, n_pulls = map(len, (issues, pulls)) n_total = n_issues + n_pulls # Print summary report we can directly include into release notes. print() since_day = since.strftime("%Y/%m/%d") today = datetime.today().strftime("%Y/%m/%d") print("GitHub stats for %s - %s (tag: %s)" % (since_day, today, tag)) print() print("These lists are automatically generated, and may be incomplete or contain duplicates.") print() ncommits = 0 all_authors = [] if tag: # print git info, in addition to GitHub info: since_tag = tag+'..' cmd = ['git', 'log', '--oneline', since_tag] ncommits += len(check_output(cmd).splitlines()) author_cmd = ['git', 'log', '--use-mailmap', "--format=* %aN", since_tag] all_authors.extend(check_output(author_cmd).decode('utf-8', 'replace').splitlines()) pr_authors = [] for pr in pulls: pr_authors.extend(get_authors(pr)) ncommits = len(pr_authors) + ncommits - len(pulls) author_cmd = ['git', 'check-mailmap'] + pr_authors with_email = check_output(author_cmd).decode('utf-8', 'replace').splitlines() all_authors.extend([ u'* ' + a.split(' <')[0] for a in with_email ]) unique_authors = sorted(set(all_authors), key=lambda s: s.lower()) print("We closed %d issues and merged %d pull requests." % (n_issues, n_pulls)) if milestone: print("The full list can be seen `on GitHub `__".format(project=project,milestone=milestone) ) print() print("The following %i authors contributed %i commits." % (len(unique_authors), ncommits)) print() print('\n'.join(unique_authors)) if opts.links: print() print("GitHub issues and pull requests:") print() print('Pull Requests (%d):\n' % n_pulls) report(pulls, show_urls) print() print('Issues (%d):\n' % n_issues) report(issues, show_urls) ipython-8.35.0/tools/make_tarball.py000066400000000000000000000013521477474304100174450ustar00rootroot00000000000000#!/usr/bin/env python """Simple script to create a tarball with proper git info. """ import subprocess from toollib import cd, sh tag = subprocess.check_output('git describe --tags', shell=True).decode('utf8', 'replace').strip() base_name = 'ipython-%s' % tag tar_name = '%s.tgz' % base_name # git archive is weird: Even if I give it a specific path, it still won't # archive the whole tree. It seems the only way to get the whole tree is to cd # to the top of the tree. There are long threads (since 2007) on the git list # about this and it still doesn't work in a sensible way... cd('..') git_tpl = 'git archive --format=tar --prefix={0}/ HEAD | gzip > {1}' sh(git_tpl.format(base_name, tar_name)) sh('mv {0} tools/'.format(tar_name)) ipython-8.35.0/tools/release000077500000000000000000000001351477474304100160210ustar00rootroot00000000000000#!/usr/bin/env python3 """IPython release script. Deprecated """ sys.exit("deprecated") ipython-8.35.0/tools/release_helper.sh000066400000000000000000000153671477474304100200030ustar00rootroot00000000000000# Simple tool to help for release # when releasing with bash, simple source it to get asked questions. # misc check before starting BLACK=$(tput setaf 1) RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3) BLUE=$(tput setaf 4) MAGENTA=$(tput setaf 5) CYAN=$(tput setaf 6) WHITE=$(tput setaf 7) NOR=$(tput sgr0) echo "Checking all tools are installed..." python -c 'import keyring' python -c 'import twine' python -c 'import sphinx' python -c 'import sphinx_rtd_theme' python -c 'import pytest' python -c 'import build' # those are necessary fo building the docs echo "Checking imports for docs" python -c 'import numpy' python -c 'import matplotlib' echo "Will use $BLUE'$EDITOR'$NOR to edit files when necessary" # echo -n "PREV_RELEASE (X.y.z) [$PREV_RELEASE]: " # read input # PREV_RELEASE=${input:-$PREV_RELEASE} # echo -n "MILESTONE (X.y) [$MILESTONE]: " # read input # MILESTONE=${input:-$MILESTONE} echo -n "VERSION (X.y.z) [$VERSION]:" read input VERSION=${input:-$VERSION} echo -n "BRANCH (main|X.y) [$BRANCH]:" read input BRANCH=${input:-$BRANCH} ask_section(){ echo echo $BLUE"$1"$NOR echo -n $GREEN"Press Enter to continue, S to skip: "$NOR if [ "$ZSH_NAME" = "zsh" ] ; then read -k1 value value=${value%$'\n'} else read -n1 value fi if [ -z "$value" ] || [ $value = 'y' ]; then return 0 fi return 1 } maybe_edit(){ echo echo $BLUE"$1"$NOR echo -n $GREEN"Press ${BLUE}e$GREEN to Edit ${BLUE}$1$GREEN, any other keys to skip: "$NOR if [ "$ZSH_NAME" = "zsh" ] ; then read -k1 value value=${value%$'\n'} else read -n1 value fi echo if [ $value = 'e' ] ; then $=EDITOR $1 fi } echo if ask_section "Updating what's new with information from docs/source/whatsnew/pr" then python tools/update_whatsnew.py echo echo $BLUE"please move the contents of "docs/source/whatsnew/development.rst" to version-X.rst"$NOR echo $GREEN"Press enter to continue"$NOR read fi # if ask_section "Gen Stats, and authors" # then # # echo # echo $BLUE"here are all the authors that contributed to this release:"$NOR # git log --format="%aN <%aE>" $PREV_RELEASE... | sort -u -f # # echo # echo $BLUE"If you see any duplicates cancel (Ctrl-C), then edit .mailmap." # echo $GREEN"Press enter to continue:"$NOR # read # # echo $BLUE"generating stats"$NOR # python tools/github_stats.py --milestone $MILESTONE > stats.rst # # echo $BLUE"stats.rst files generated."$NOR # echo $GREEN"Please merge it with the right file (github-stats-X.rst) and commit."$NOR # echo $GREEN"press enter to continue."$NOR # read # # fi # if ask_section "Generate API difference (using frapuccino)" # then # echo $BLUE"Checking out $PREV_RELEASE"$NOR # git checkout tags/$PREV_RELEASE # sleep 1 # echo $BLUE"Saving API to file $PREV_RELEASE"$NOR # frappuccino IPython IPython.kernel IPython.lib IPython.qt IPython.lib.kernel IPython.html IPython.frontend IPython.external --save IPython-$PREV_RELEASE.json # echo $BLUE"coming back to $BRANCH"$NOR # git switch $BRANCH # sleep 1 # echo $BLUE"comparing ..."$NOR # frappuccino IPython IPython.kernel IPython.lib --compare IPython-$PREV_RELEASE.json # echo $GREEN"Use the above guideline to write an API changelog ..."$NOR # echo $GREEN"Press any keys to continue"$NOR # read # fi echo "Cleaning repository" git clean -xfdi echo $GREEN"please update version number in ${RED}IPython/core/release.py${NOR} , Do not commit yet – we'll do it later."$NOR echo $GREEN"I tried ${RED}sed -i bkp -e '/Uncomment/s/^# //g' IPython/core/release.py${NOR}" sed -i bkp -e '/Uncomment/s/^# //g' IPython/core/release.py rm IPython/core/release.pybkp git diff | cat maybe_edit IPython/core/release.py echo $GREEN"Press enter to continue"$NOR read if ask_section "Build the documentation ?" then make html -C docs echo echo $GREEN"Check the docs, press enter to continue"$NOR read fi if ask_section "Should we commit, tag, push... etc ? " then echo echo $BLUE"Let's commit : git commit -am \"release $VERSION\" -S" echo $GREEN"Press enter to commit"$NOR read git commit -am "release $VERSION" -S echo echo $BLUE"git push origin \$BRANCH ($BRANCH)?"$NOR echo $GREEN"Make sure you can push"$NOR echo $GREEN"Press enter to continue"$NOR read git push origin $BRANCH echo echo "Let's tag : git tag -am \"release $VERSION\" \"$VERSION\" -s" echo $GREEN"Press enter to tag commit"$NOR read git tag -am "release $VERSION" "$VERSION" -s echo echo $BLUE"And push the tag: git push origin \$VERSION ?"$NOR echo $GREEN"Press enter to continue"$NOR read git push origin $VERSION echo $GREEN"please update version number and back to .dev in ${RED}IPython/core/release.py" echo $GREEN"I tried ${RED}sed -i bkp -e '/Uncomment/s/^/# /g' IPython/core/release.py${NOR}" sed -i bkp -e '/Uncomment/s/^/# /g' IPython/core/release.py rm IPython/core/release.pybkp git diff | cat echo $GREEN"Please bump ${RED}the minor version number${NOR}" maybe_edit IPython/core/release.py echo ${BLUE}"Do not commit yet – we'll do it later."$NOR echo $GREEN"Press enter to continue"$NOR read echo echo "Let's commit : "$BLUE"git commit -am \"back to dev\""$NOR echo $GREEN"Press enter to commit"$NOR read git commit -am "back to dev" echo echo $BLUE"git push origin \$BRANCH ($BRANCH)?"$NOR echo $GREEN"Press enter to continue"$NOR read git push origin $BRANCH echo echo $BLUE"let's : git checkout tags/$VERSION"$NOR echo $GREEN"Press enter to continue"$NOR read git checkout tags/$VERSION fi if ask_section "Should we build and release ?" then echo $BLUE"going to set SOURCE_DATE_EPOCH"$NOR echo $BLUE'export SOURCE_DATE_EPOCH=$(git show -s --format=%ct HEAD)'$NOR echo $GREEN"Press enter to continue"$NOR read export SOURCE_DATE_EPOCH=$(git show -s --format=%ct HEAD) echo $BLUE"SOURCE_DATE_EPOCH set to $SOURCE_DATE_EPOCH"$NOR echo $GREEN"Press enter to continue"$NOR read echo echo $BLUE"Attempting to build package..."$NOR tools/build_release echo $RED'$ shasum -a 256 dist/*' shasum -a 256 dist/* echo $NOR echo $BLUE"We are going to rebuild, node the hash above, and compare them to the rebuild"$NOR echo $GREEN"Press enter to continue"$NOR read echo echo $BLUE"Attempting to build package..."$NOR tools/build_release echo $RED"Check the shasum for SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH" echo $RED'$ shasum -a 256 dist/*' shasum -a 256 dist/* echo $NOR if ask_section "upload packages ?" then twine upload --verbose dist/*.tar.gz dist/*.whl fi fi ipython-8.35.0/tools/retar.py000066400000000000000000000040201477474304100161370ustar00rootroot00000000000000""" Un-targz and retargz a targz file to ensure reproducible build. usage: $ export SOURCE_DATE_EPOCH=$(date +%s) # or $ export SOURCE_DATE_EPOCH=$(git show -s --format=%ct HEAD) ... $ python retar.py The process of creating an sdist can be non-reproducible: - directory created during the process get a mtime of the creation date; - gziping files embed the timestamp of zip creation. This will untar-retar; ensuring that all mtime > SOURCE_DATE_EPOCH will be set equal to SOURCE_DATE_EPOCH. """ import tarfile import sys import os import gzip import io from pathlib import Path if len(sys.argv) > 2: raise ValueError("Too many arguments") timestamp = int(os.environ["SOURCE_DATE_EPOCH"]) path = Path(sys.argv[1]) old_buf = io.BytesIO() with open(path, "rb") as f: old_buf.write(f.read()) old_buf.seek(0) if path.name.endswith("gz"): r_mode = "r:gz" if path.name.endswith("bz2"): r_mode = "r:bz2" if path.name.endswith("xz"): raise ValueError("XZ is deprecated but it's written nowhere") old = tarfile.open(fileobj=old_buf, mode=r_mode) buf = io.BytesIO() new = tarfile.open(fileobj=buf, mode="w", format=tarfile.GNU_FORMAT) for i, m in enumerate(old): data = None # mutation does not work, copy if m.name.endswith('.DS_Store'): continue m2 = tarfile.TarInfo(m.name) m2.mtime = min(timestamp, m.mtime) m2.pax_headers["mtime"] = m2.mtime m2.size = m.size m2.type = m.type m2.linkname = m.linkname m2.mode = m.mode if m.isdir(): new.addfile(m2) else: data = old.extractfile(m) new.addfile(m2, data) new.close() old.close() buf.seek(0) if r_mode == "r:gz": with open(path, "wb") as f: with gzip.GzipFile("", "wb", fileobj=f, mtime=timestamp) as gzf: gzf.write(buf.read()) elif r_mode == "r:bz2": import bz2 with bz2.open(path, "wb") as f: f.write(buf.read()) else: assert False # checks the archive is valid. archive = tarfile.open(path) names = archive.getnames() ipython-8.35.0/tools/tests/000077500000000000000000000000001477474304100156165ustar00rootroot00000000000000ipython-8.35.0/tools/tests/ANSI Test.ipynb000066400000000000000000002756161477474304100203340ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook tests the processing of ANSI and VT100 color escapes" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import print_function" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ESC = '\\x1b['\n", "RESET = ESC + \"00m\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plain ANSI 16-color" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[01;40;30mtext \u001b[01m\u001b[01;40;31mtext \u001b[01m\u001b[01;40;32mtext \u001b[01m\u001b[01;40;33mtext \u001b[01m\u001b[01;40;34mtext \u001b[01m\u001b[01;40;35mtext \u001b[01m\u001b[01;40;36mtext \u001b[01m\u001b[01;40;37mtext \u001b[01m\n", "\u001b[01;41;30mtext \u001b[01m\u001b[01;41;31mtext \u001b[01m\u001b[01;41;32mtext \u001b[01m\u001b[01;41;33mtext \u001b[01m\u001b[01;41;34mtext \u001b[01m\u001b[01;41;35mtext \u001b[01m\u001b[01;41;36mtext \u001b[01m\u001b[01;41;37mtext \u001b[01m\n", "\u001b[01;42;30mtext \u001b[01m\u001b[01;42;31mtext \u001b[01m\u001b[01;42;32mtext \u001b[01m\u001b[01;42;33mtext \u001b[01m\u001b[01;42;34mtext \u001b[01m\u001b[01;42;35mtext \u001b[01m\u001b[01;42;36mtext \u001b[01m\u001b[01;42;37mtext \u001b[01m\n", "\u001b[01;43;30mtext \u001b[01m\u001b[01;43;31mtext \u001b[01m\u001b[01;43;32mtext \u001b[01m\u001b[01;43;33mtext \u001b[01m\u001b[01;43;34mtext \u001b[01m\u001b[01;43;35mtext \u001b[01m\u001b[01;43;36mtext \u001b[01m\u001b[01;43;37mtext \u001b[01m\n", "\u001b[01;44;30mtext \u001b[01m\u001b[01;44;31mtext \u001b[01m\u001b[01;44;32mtext \u001b[01m\u001b[01;44;33mtext \u001b[01m\u001b[01;44;34mtext \u001b[01m\u001b[01;44;35mtext \u001b[01m\u001b[01;44;36mtext \u001b[01m\u001b[01;44;37mtext \u001b[01m\n", "\u001b[01;45;30mtext \u001b[01m\u001b[01;45;31mtext \u001b[01m\u001b[01;45;32mtext \u001b[01m\u001b[01;45;33mtext \u001b[01m\u001b[01;45;34mtext \u001b[01m\u001b[01;45;35mtext \u001b[01m\u001b[01;45;36mtext \u001b[01m\u001b[01;45;37mtext \u001b[01m\n", "\u001b[01;46;30mtext \u001b[01m\u001b[01;46;31mtext \u001b[01m\u001b[01;46;32mtext \u001b[01m\u001b[01;46;33mtext \u001b[01m\u001b[01;46;34mtext \u001b[01m\u001b[01;46;35mtext \u001b[01m\u001b[01;46;36mtext \u001b[01m\u001b[01;46;37mtext \u001b[01m\n", "\u001b[01;47;30mtext \u001b[01m\u001b[01;47;31mtext \u001b[01m\u001b[01;47;32mtext \u001b[01m\u001b[01;47;33mtext \u001b[01m\u001b[01;47;34mtext \u001b[01m\u001b[01;47;35mtext \u001b[01m\u001b[01;47;36mtext \u001b[01m\u001b[01;47;37mtext \u001b[01m\n" ] } ], "source": [ "for bg in range(40,48):\n", " for fg in range(30,38):\n", " print (\"{ESC}01;{bg};{fg}mtext {RESET}\".format(**locals()), end='')\n", " print ()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 256-color" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[00;38;5;0m000 \u001b[01m\u001b[00;38;5;1m001 \u001b[01m\u001b[00;38;5;2m002 \u001b[01m\u001b[00;38;5;3m003 \u001b[01m\u001b[00;38;5;4m004 \u001b[01m\u001b[00;38;5;5m005 \u001b[01m\u001b[00;38;5;6m006 \u001b[01m\u001b[00;38;5;7m007 \u001b[01m\n", "\u001b[00;38;5;8m008 \u001b[01m\u001b[00;38;5;9m009 \u001b[01m\u001b[00;38;5;10m010 \u001b[01m\u001b[00;38;5;11m011 \u001b[01m\u001b[00;38;5;12m012 \u001b[01m\u001b[00;38;5;13m013 \u001b[01m\u001b[00;38;5;14m014 \u001b[01m\u001b[00;38;5;15m015 \u001b[01m\n", "\n", "\u001b[00;38;5;16m016 \u001b[01m\u001b[00;38;5;17m017 \u001b[01m\u001b[00;38;5;18m018 \u001b[01m\u001b[00;38;5;19m019 \u001b[01m\u001b[00;38;5;20m020 \u001b[01m\u001b[00;38;5;21m021 \u001b[01m\n", "\u001b[00;38;5;22m022 \u001b[01m\u001b[00;38;5;23m023 \u001b[01m\u001b[00;38;5;24m024 \u001b[01m\u001b[00;38;5;25m025 \u001b[01m\u001b[00;38;5;26m026 \u001b[01m\u001b[00;38;5;27m027 \u001b[01m\n", "\u001b[00;38;5;28m028 \u001b[01m\u001b[00;38;5;29m029 \u001b[01m\u001b[00;38;5;30m030 \u001b[01m\u001b[00;38;5;31m031 \u001b[01m\u001b[00;38;5;32m032 \u001b[01m\u001b[00;38;5;33m033 \u001b[01m\n", "\u001b[00;38;5;34m034 \u001b[01m\u001b[00;38;5;35m035 \u001b[01m\u001b[00;38;5;36m036 \u001b[01m\u001b[00;38;5;37m037 \u001b[01m\u001b[00;38;5;38m038 \u001b[01m\u001b[00;38;5;39m039 \u001b[01m\n", "\u001b[00;38;5;40m040 \u001b[01m\u001b[00;38;5;41m041 \u001b[01m\u001b[00;38;5;42m042 \u001b[01m\u001b[00;38;5;43m043 \u001b[01m\u001b[00;38;5;44m044 \u001b[01m\u001b[00;38;5;45m045 \u001b[01m\n", "\u001b[00;38;5;46m046 \u001b[01m\u001b[00;38;5;47m047 \u001b[01m\u001b[00;38;5;48m048 \u001b[01m\u001b[00;38;5;49m049 \u001b[01m\u001b[00;38;5;50m050 \u001b[01m\u001b[00;38;5;51m051 \u001b[01m\n", "\n", "\u001b[00;38;5;52m052 \u001b[01m\u001b[00;38;5;53m053 \u001b[01m\u001b[00;38;5;54m054 \u001b[01m\u001b[00;38;5;55m055 \u001b[01m\u001b[00;38;5;56m056 \u001b[01m\u001b[00;38;5;57m057 \u001b[01m\n", "\u001b[00;38;5;58m058 \u001b[01m\u001b[00;38;5;59m059 \u001b[01m\u001b[00;38;5;60m060 \u001b[01m\u001b[00;38;5;61m061 \u001b[01m\u001b[00;38;5;62m062 \u001b[01m\u001b[00;38;5;63m063 \u001b[01m\n", "\u001b[00;38;5;64m064 \u001b[01m\u001b[00;38;5;65m065 \u001b[01m\u001b[00;38;5;66m066 \u001b[01m\u001b[00;38;5;67m067 \u001b[01m\u001b[00;38;5;68m068 \u001b[01m\u001b[00;38;5;69m069 \u001b[01m\n", "\u001b[00;38;5;70m070 \u001b[01m\u001b[00;38;5;71m071 \u001b[01m\u001b[00;38;5;72m072 \u001b[01m\u001b[00;38;5;73m073 \u001b[01m\u001b[00;38;5;74m074 \u001b[01m\u001b[00;38;5;75m075 \u001b[01m\n", "\u001b[00;38;5;76m076 \u001b[01m\u001b[00;38;5;77m077 \u001b[01m\u001b[00;38;5;78m078 \u001b[01m\u001b[00;38;5;79m079 \u001b[01m\u001b[00;38;5;80m080 \u001b[01m\u001b[00;38;5;81m081 \u001b[01m\n", "\u001b[00;38;5;82m082 \u001b[01m\u001b[00;38;5;83m083 \u001b[01m\u001b[00;38;5;84m084 \u001b[01m\u001b[00;38;5;85m085 \u001b[01m\u001b[00;38;5;86m086 \u001b[01m\u001b[00;38;5;87m087 \u001b[01m\n", "\n", "\u001b[00;38;5;88m088 \u001b[01m\u001b[00;38;5;89m089 \u001b[01m\u001b[00;38;5;90m090 \u001b[01m\u001b[00;38;5;91m091 \u001b[01m\u001b[00;38;5;92m092 \u001b[01m\u001b[00;38;5;93m093 \u001b[01m\n", "\u001b[00;38;5;94m094 \u001b[01m\u001b[00;38;5;95m095 \u001b[01m\u001b[00;38;5;96m096 \u001b[01m\u001b[00;38;5;97m097 \u001b[01m\u001b[00;38;5;98m098 \u001b[01m\u001b[00;38;5;99m099 \u001b[01m\n", "\u001b[00;38;5;100m100 \u001b[01m\u001b[00;38;5;101m101 \u001b[01m\u001b[00;38;5;102m102 \u001b[01m\u001b[00;38;5;103m103 \u001b[01m\u001b[00;38;5;104m104 \u001b[01m\u001b[00;38;5;105m105 \u001b[01m\n", "\u001b[00;38;5;106m106 \u001b[01m\u001b[00;38;5;107m107 \u001b[01m\u001b[00;38;5;108m108 \u001b[01m\u001b[00;38;5;109m109 \u001b[01m\u001b[00;38;5;110m110 \u001b[01m\u001b[00;38;5;111m111 \u001b[01m\n", "\u001b[00;38;5;112m112 \u001b[01m\u001b[00;38;5;113m113 \u001b[01m\u001b[00;38;5;114m114 \u001b[01m\u001b[00;38;5;115m115 \u001b[01m\u001b[00;38;5;116m116 \u001b[01m\u001b[00;38;5;117m117 \u001b[01m\n", "\u001b[00;38;5;118m118 \u001b[01m\u001b[00;38;5;119m119 \u001b[01m\u001b[00;38;5;120m120 \u001b[01m\u001b[00;38;5;121m121 \u001b[01m\u001b[00;38;5;122m122 \u001b[01m\u001b[00;38;5;123m123 \u001b[01m\n", "\n", "\u001b[00;38;5;124m124 \u001b[01m\u001b[00;38;5;125m125 \u001b[01m\u001b[00;38;5;126m126 \u001b[01m\u001b[00;38;5;127m127 \u001b[01m\u001b[00;38;5;128m128 \u001b[01m\u001b[00;38;5;129m129 \u001b[01m\n", "\u001b[00;38;5;130m130 \u001b[01m\u001b[00;38;5;131m131 \u001b[01m\u001b[00;38;5;132m132 \u001b[01m\u001b[00;38;5;133m133 \u001b[01m\u001b[00;38;5;134m134 \u001b[01m\u001b[00;38;5;135m135 \u001b[01m\n", "\u001b[00;38;5;136m136 \u001b[01m\u001b[00;38;5;137m137 \u001b[01m\u001b[00;38;5;138m138 \u001b[01m\u001b[00;38;5;139m139 \u001b[01m\u001b[00;38;5;140m140 \u001b[01m\u001b[00;38;5;141m141 \u001b[01m\n", "\u001b[00;38;5;142m142 \u001b[01m\u001b[00;38;5;143m143 \u001b[01m\u001b[00;38;5;144m144 \u001b[01m\u001b[00;38;5;145m145 \u001b[01m\u001b[00;38;5;146m146 \u001b[01m\u001b[00;38;5;147m147 \u001b[01m\n", "\u001b[00;38;5;148m148 \u001b[01m\u001b[00;38;5;149m149 \u001b[01m\u001b[00;38;5;150m150 \u001b[01m\u001b[00;38;5;151m151 \u001b[01m\u001b[00;38;5;152m152 \u001b[01m\u001b[00;38;5;153m153 \u001b[01m\n", "\u001b[00;38;5;154m154 \u001b[01m\u001b[00;38;5;155m155 \u001b[01m\u001b[00;38;5;156m156 \u001b[01m\u001b[00;38;5;157m157 \u001b[01m\u001b[00;38;5;158m158 \u001b[01m\u001b[00;38;5;159m159 \u001b[01m\n", "\n", "\u001b[00;38;5;160m160 \u001b[01m\u001b[00;38;5;161m161 \u001b[01m\u001b[00;38;5;162m162 \u001b[01m\u001b[00;38;5;163m163 \u001b[01m\u001b[00;38;5;164m164 \u001b[01m\u001b[00;38;5;165m165 \u001b[01m\n", "\u001b[00;38;5;166m166 \u001b[01m\u001b[00;38;5;167m167 \u001b[01m\u001b[00;38;5;168m168 \u001b[01m\u001b[00;38;5;169m169 \u001b[01m\u001b[00;38;5;170m170 \u001b[01m\u001b[00;38;5;171m171 \u001b[01m\n", "\u001b[00;38;5;172m172 \u001b[01m\u001b[00;38;5;173m173 \u001b[01m\u001b[00;38;5;174m174 \u001b[01m\u001b[00;38;5;175m175 \u001b[01m\u001b[00;38;5;176m176 \u001b[01m\u001b[00;38;5;177m177 \u001b[01m\n", "\u001b[00;38;5;178m178 \u001b[01m\u001b[00;38;5;179m179 \u001b[01m\u001b[00;38;5;180m180 \u001b[01m\u001b[00;38;5;181m181 \u001b[01m\u001b[00;38;5;182m182 \u001b[01m\u001b[00;38;5;183m183 \u001b[01m\n", "\u001b[00;38;5;184m184 \u001b[01m\u001b[00;38;5;185m185 \u001b[01m\u001b[00;38;5;186m186 \u001b[01m\u001b[00;38;5;187m187 \u001b[01m\u001b[00;38;5;188m188 \u001b[01m\u001b[00;38;5;189m189 \u001b[01m\n", "\u001b[00;38;5;190m190 \u001b[01m\u001b[00;38;5;191m191 \u001b[01m\u001b[00;38;5;192m192 \u001b[01m\u001b[00;38;5;193m193 \u001b[01m\u001b[00;38;5;194m194 \u001b[01m\u001b[00;38;5;195m195 \u001b[01m\n", "\n", "\u001b[00;38;5;196m196 \u001b[01m\u001b[00;38;5;197m197 \u001b[01m\u001b[00;38;5;198m198 \u001b[01m\u001b[00;38;5;199m199 \u001b[01m\u001b[00;38;5;200m200 \u001b[01m\u001b[00;38;5;201m201 \u001b[01m\n", "\u001b[00;38;5;202m202 \u001b[01m\u001b[00;38;5;203m203 \u001b[01m\u001b[00;38;5;204m204 \u001b[01m\u001b[00;38;5;205m205 \u001b[01m\u001b[00;38;5;206m206 \u001b[01m\u001b[00;38;5;207m207 \u001b[01m\n", "\u001b[00;38;5;208m208 \u001b[01m\u001b[00;38;5;209m209 \u001b[01m\u001b[00;38;5;210m210 \u001b[01m\u001b[00;38;5;211m211 \u001b[01m\u001b[00;38;5;212m212 \u001b[01m\u001b[00;38;5;213m213 \u001b[01m\n", "\u001b[00;38;5;214m214 \u001b[01m\u001b[00;38;5;215m215 \u001b[01m\u001b[00;38;5;216m216 \u001b[01m\u001b[00;38;5;217m217 \u001b[01m\u001b[00;38;5;218m218 \u001b[01m\u001b[00;38;5;219m219 \u001b[01m\n", "\u001b[00;38;5;220m220 \u001b[01m\u001b[00;38;5;221m221 \u001b[01m\u001b[00;38;5;222m222 \u001b[01m\u001b[00;38;5;223m223 \u001b[01m\u001b[00;38;5;224m224 \u001b[01m\u001b[00;38;5;225m225 \u001b[01m\n", "\u001b[00;38;5;226m226 \u001b[01m\u001b[00;38;5;227m227 \u001b[01m\u001b[00;38;5;228m228 \u001b[01m\u001b[00;38;5;229m229 \u001b[01m\u001b[00;38;5;230m230 \u001b[01m\u001b[00;38;5;231m231 \u001b[01m\n", "\n", "\n", "\u001b[00;38;5;232m232 \u001b[01m\u001b[00;38;5;233m233 \u001b[01m\u001b[00;38;5;234m234 \u001b[01m\u001b[00;38;5;235m235 \u001b[01m\u001b[00;38;5;236m236 \u001b[01m\u001b[00;38;5;237m237 \u001b[01m\u001b[00;38;5;238m238 \u001b[01m\u001b[00;38;5;239m239 \u001b[01m\u001b[00;38;5;240m240 \u001b[01m\u001b[00;38;5;241m241 \u001b[01m\u001b[00;38;5;242m242 \u001b[01m\u001b[00;38;5;243m243 \u001b[01m\n", "\u001b[00;38;5;244m244 \u001b[01m\u001b[00;38;5;245m245 \u001b[01m\u001b[00;38;5;246m246 \u001b[01m\u001b[00;38;5;247m247 \u001b[01m\u001b[00;38;5;248m248 \u001b[01m\u001b[00;38;5;249m249 \u001b[01m\u001b[00;38;5;250m250 \u001b[01m\u001b[00;38;5;251m251 \u001b[01m\u001b[00;38;5;252m252 \u001b[01m\u001b[00;38;5;253m253 \u001b[01m\u001b[00;38;5;254m254 \u001b[01m\u001b[00;38;5;255m255 \u001b[01m\n", "\n" ] } ], "source": [ "t = \"{ESC}00;38;5;{i}m{i:03} {RESET}\"\n", "for i in range(16):\n", " print (t.format(**locals()), end='')\n", " if i % 8 == 7:\n", " print ()\n", "print ()\n", "\n", "for i in range(16,232):\n", " print (t.format(**locals()), end='')\n", " if (i-16) % 6 == 5:\n", " print ()\n", " if (i-16) % 36 == 35:\n", " print ()\n", "\n", "print ()\n", "\n", "for i in range(232,256):\n", " print (t.format(**locals()), end='')\n", " if (i-232) % 12 == 11:\n", " print ()\n", "print ()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 256-color background" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[00;48;5;0m000 \u001b[01m\u001b[00;48;5;1m001 \u001b[01m\u001b[00;48;5;2m002 \u001b[01m\u001b[00;48;5;3m003 \u001b[01m\u001b[00;48;5;4m004 \u001b[01m\u001b[00;48;5;5m005 \u001b[01m\u001b[00;48;5;6m006 \u001b[01m\u001b[00;48;5;7m007 \u001b[01m\n", "\u001b[00;48;5;8m008 \u001b[01m\u001b[00;48;5;9m009 \u001b[01m\u001b[00;48;5;10m010 \u001b[01m\u001b[00;48;5;11m011 \u001b[01m\u001b[00;48;5;12m012 \u001b[01m\u001b[00;48;5;13m013 \u001b[01m\u001b[00;48;5;14m014 \u001b[01m\u001b[00;48;5;15m015 \u001b[01m\n", "\n", "\u001b[00;48;5;16m016 \u001b[01m\u001b[00;48;5;17m017 \u001b[01m\u001b[00;48;5;18m018 \u001b[01m\u001b[00;48;5;19m019 \u001b[01m\u001b[00;48;5;20m020 \u001b[01m\u001b[00;48;5;21m021 \u001b[01m\n", "\u001b[00;48;5;22m022 \u001b[01m\u001b[00;48;5;23m023 \u001b[01m\u001b[00;48;5;24m024 \u001b[01m\u001b[00;48;5;25m025 \u001b[01m\u001b[00;48;5;26m026 \u001b[01m\u001b[00;48;5;27m027 \u001b[01m\n", "\u001b[00;48;5;28m028 \u001b[01m\u001b[00;48;5;29m029 \u001b[01m\u001b[00;48;5;30m030 \u001b[01m\u001b[00;48;5;31m031 \u001b[01m\u001b[00;48;5;32m032 \u001b[01m\u001b[00;48;5;33m033 \u001b[01m\n", "\u001b[00;48;5;34m034 \u001b[01m\u001b[00;48;5;35m035 \u001b[01m\u001b[00;48;5;36m036 \u001b[01m\u001b[00;48;5;37m037 \u001b[01m\u001b[00;48;5;38m038 \u001b[01m\u001b[00;48;5;39m039 \u001b[01m\n", "\u001b[00;48;5;40m040 \u001b[01m\u001b[00;48;5;41m041 \u001b[01m\u001b[00;48;5;42m042 \u001b[01m\u001b[00;48;5;43m043 \u001b[01m\u001b[00;48;5;44m044 \u001b[01m\u001b[00;48;5;45m045 \u001b[01m\n", "\u001b[00;48;5;46m046 \u001b[01m\u001b[00;48;5;47m047 \u001b[01m\u001b[00;48;5;48m048 \u001b[01m\u001b[00;48;5;49m049 \u001b[01m\u001b[00;48;5;50m050 \u001b[01m\u001b[00;48;5;51m051 \u001b[01m\n", "\n", "\u001b[00;48;5;52m052 \u001b[01m\u001b[00;48;5;53m053 \u001b[01m\u001b[00;48;5;54m054 \u001b[01m\u001b[00;48;5;55m055 \u001b[01m\u001b[00;48;5;56m056 \u001b[01m\u001b[00;48;5;57m057 \u001b[01m\n", "\u001b[00;48;5;58m058 \u001b[01m\u001b[00;48;5;59m059 \u001b[01m\u001b[00;48;5;60m060 \u001b[01m\u001b[00;48;5;61m061 \u001b[01m\u001b[00;48;5;62m062 \u001b[01m\u001b[00;48;5;63m063 \u001b[01m\n", "\u001b[00;48;5;64m064 \u001b[01m\u001b[00;48;5;65m065 \u001b[01m\u001b[00;48;5;66m066 \u001b[01m\u001b[00;48;5;67m067 \u001b[01m\u001b[00;48;5;68m068 \u001b[01m\u001b[00;48;5;69m069 \u001b[01m\n", "\u001b[00;48;5;70m070 \u001b[01m\u001b[00;48;5;71m071 \u001b[01m\u001b[00;48;5;72m072 \u001b[01m\u001b[00;48;5;73m073 \u001b[01m\u001b[00;48;5;74m074 \u001b[01m\u001b[00;48;5;75m075 \u001b[01m\n", "\u001b[00;48;5;76m076 \u001b[01m\u001b[00;48;5;77m077 \u001b[01m\u001b[00;48;5;78m078 \u001b[01m\u001b[00;48;5;79m079 \u001b[01m\u001b[00;48;5;80m080 \u001b[01m\u001b[00;48;5;81m081 \u001b[01m\n", "\u001b[00;48;5;82m082 \u001b[01m\u001b[00;48;5;83m083 \u001b[01m\u001b[00;48;5;84m084 \u001b[01m\u001b[00;48;5;85m085 \u001b[01m\u001b[00;48;5;86m086 \u001b[01m\u001b[00;48;5;87m087 \u001b[01m\n", "\n", "\u001b[00;48;5;88m088 \u001b[01m\u001b[00;48;5;89m089 \u001b[01m\u001b[00;48;5;90m090 \u001b[01m\u001b[00;48;5;91m091 \u001b[01m\u001b[00;48;5;92m092 \u001b[01m\u001b[00;48;5;93m093 \u001b[01m\n", "\u001b[00;48;5;94m094 \u001b[01m\u001b[00;48;5;95m095 \u001b[01m\u001b[00;48;5;96m096 \u001b[01m\u001b[00;48;5;97m097 \u001b[01m\u001b[00;48;5;98m098 \u001b[01m\u001b[00;48;5;99m099 \u001b[01m\n", "\u001b[00;48;5;100m100 \u001b[01m\u001b[00;48;5;101m101 \u001b[01m\u001b[00;48;5;102m102 \u001b[01m\u001b[00;48;5;103m103 \u001b[01m\u001b[00;48;5;104m104 \u001b[01m\u001b[00;48;5;105m105 \u001b[01m\n", "\u001b[00;48;5;106m106 \u001b[01m\u001b[00;48;5;107m107 \u001b[01m\u001b[00;48;5;108m108 \u001b[01m\u001b[00;48;5;109m109 \u001b[01m\u001b[00;48;5;110m110 \u001b[01m\u001b[00;48;5;111m111 \u001b[01m\n", "\u001b[00;48;5;112m112 \u001b[01m\u001b[00;48;5;113m113 \u001b[01m\u001b[00;48;5;114m114 \u001b[01m\u001b[00;48;5;115m115 \u001b[01m\u001b[00;48;5;116m116 \u001b[01m\u001b[00;48;5;117m117 \u001b[01m\n", "\u001b[00;48;5;118m118 \u001b[01m\u001b[00;48;5;119m119 \u001b[01m\u001b[00;48;5;120m120 \u001b[01m\u001b[00;48;5;121m121 \u001b[01m\u001b[00;48;5;122m122 \u001b[01m\u001b[00;48;5;123m123 \u001b[01m\n", "\n", "\u001b[00;48;5;124m124 \u001b[01m\u001b[00;48;5;125m125 \u001b[01m\u001b[00;48;5;126m126 \u001b[01m\u001b[00;48;5;127m127 \u001b[01m\u001b[00;48;5;128m128 \u001b[01m\u001b[00;48;5;129m129 \u001b[01m\n", "\u001b[00;48;5;130m130 \u001b[01m\u001b[00;48;5;131m131 \u001b[01m\u001b[00;48;5;132m132 \u001b[01m\u001b[00;48;5;133m133 \u001b[01m\u001b[00;48;5;134m134 \u001b[01m\u001b[00;48;5;135m135 \u001b[01m\n", "\u001b[00;48;5;136m136 \u001b[01m\u001b[00;48;5;137m137 \u001b[01m\u001b[00;48;5;138m138 \u001b[01m\u001b[00;48;5;139m139 \u001b[01m\u001b[00;48;5;140m140 \u001b[01m\u001b[00;48;5;141m141 \u001b[01m\n", "\u001b[00;48;5;142m142 \u001b[01m\u001b[00;48;5;143m143 \u001b[01m\u001b[00;48;5;144m144 \u001b[01m\u001b[00;48;5;145m145 \u001b[01m\u001b[00;48;5;146m146 \u001b[01m\u001b[00;48;5;147m147 \u001b[01m\n", "\u001b[00;48;5;148m148 \u001b[01m\u001b[00;48;5;149m149 \u001b[01m\u001b[00;48;5;150m150 \u001b[01m\u001b[00;48;5;151m151 \u001b[01m\u001b[00;48;5;152m152 \u001b[01m\u001b[00;48;5;153m153 \u001b[01m\n", "\u001b[00;48;5;154m154 \u001b[01m\u001b[00;48;5;155m155 \u001b[01m\u001b[00;48;5;156m156 \u001b[01m\u001b[00;48;5;157m157 \u001b[01m\u001b[00;48;5;158m158 \u001b[01m\u001b[00;48;5;159m159 \u001b[01m\n", "\n", "\u001b[00;48;5;160m160 \u001b[01m\u001b[00;48;5;161m161 \u001b[01m\u001b[00;48;5;162m162 \u001b[01m\u001b[00;48;5;163m163 \u001b[01m\u001b[00;48;5;164m164 \u001b[01m\u001b[00;48;5;165m165 \u001b[01m\n", "\u001b[00;48;5;166m166 \u001b[01m\u001b[00;48;5;167m167 \u001b[01m\u001b[00;48;5;168m168 \u001b[01m\u001b[00;48;5;169m169 \u001b[01m\u001b[00;48;5;170m170 \u001b[01m\u001b[00;48;5;171m171 \u001b[01m\n", "\u001b[00;48;5;172m172 \u001b[01m\u001b[00;48;5;173m173 \u001b[01m\u001b[00;48;5;174m174 \u001b[01m\u001b[00;48;5;175m175 \u001b[01m\u001b[00;48;5;176m176 \u001b[01m\u001b[00;48;5;177m177 \u001b[01m\n", "\u001b[00;48;5;178m178 \u001b[01m\u001b[00;48;5;179m179 \u001b[01m\u001b[00;48;5;180m180 \u001b[01m\u001b[00;48;5;181m181 \u001b[01m\u001b[00;48;5;182m182 \u001b[01m\u001b[00;48;5;183m183 \u001b[01m\n", "\u001b[00;48;5;184m184 \u001b[01m\u001b[00;48;5;185m185 \u001b[01m\u001b[00;48;5;186m186 \u001b[01m\u001b[00;48;5;187m187 \u001b[01m\u001b[00;48;5;188m188 \u001b[01m\u001b[00;48;5;189m189 \u001b[01m\n", "\u001b[00;48;5;190m190 \u001b[01m\u001b[00;48;5;191m191 \u001b[01m\u001b[00;48;5;192m192 \u001b[01m\u001b[00;48;5;193m193 \u001b[01m\u001b[00;48;5;194m194 \u001b[01m\u001b[00;48;5;195m195 \u001b[01m\n", "\n", "\u001b[00;48;5;196m196 \u001b[01m\u001b[00;48;5;197m197 \u001b[01m\u001b[00;48;5;198m198 \u001b[01m\u001b[00;48;5;199m199 \u001b[01m\u001b[00;48;5;200m200 \u001b[01m\u001b[00;48;5;201m201 \u001b[01m\n", "\u001b[00;48;5;202m202 \u001b[01m\u001b[00;48;5;203m203 \u001b[01m\u001b[00;48;5;204m204 \u001b[01m\u001b[00;48;5;205m205 \u001b[01m\u001b[00;48;5;206m206 \u001b[01m\u001b[00;48;5;207m207 \u001b[01m\n", "\u001b[00;48;5;208m208 \u001b[01m\u001b[00;48;5;209m209 \u001b[01m\u001b[00;48;5;210m210 \u001b[01m\u001b[00;48;5;211m211 \u001b[01m\u001b[00;48;5;212m212 \u001b[01m\u001b[00;48;5;213m213 \u001b[01m\n", "\u001b[00;48;5;214m214 \u001b[01m\u001b[00;48;5;215m215 \u001b[01m\u001b[00;48;5;216m216 \u001b[01m\u001b[00;48;5;217m217 \u001b[01m\u001b[00;48;5;218m218 \u001b[01m\u001b[00;48;5;219m219 \u001b[01m\n", "\u001b[00;48;5;220m220 \u001b[01m\u001b[00;48;5;221m221 \u001b[01m\u001b[00;48;5;222m222 \u001b[01m\u001b[00;48;5;223m223 \u001b[01m\u001b[00;48;5;224m224 \u001b[01m\u001b[00;48;5;225m225 \u001b[01m\n", "\u001b[00;48;5;226m226 \u001b[01m\u001b[00;48;5;227m227 \u001b[01m\u001b[00;48;5;228m228 \u001b[01m\u001b[00;48;5;229m229 \u001b[01m\u001b[00;48;5;230m230 \u001b[01m\u001b[00;48;5;231m231 \u001b[01m\n", "\n", "\n", "\u001b[00;48;5;232m232 \u001b[01m\u001b[00;48;5;233m233 \u001b[01m\u001b[00;48;5;234m234 \u001b[01m\u001b[00;48;5;235m235 \u001b[01m\u001b[00;48;5;236m236 \u001b[01m\u001b[00;48;5;237m237 \u001b[01m\u001b[00;48;5;238m238 \u001b[01m\u001b[00;48;5;239m239 \u001b[01m\u001b[00;48;5;240m240 \u001b[01m\u001b[00;48;5;241m241 \u001b[01m\u001b[00;48;5;242m242 \u001b[01m\u001b[00;48;5;243m243 \u001b[01m\n", "\u001b[00;48;5;244m244 \u001b[01m\u001b[00;48;5;245m245 \u001b[01m\u001b[00;48;5;246m246 \u001b[01m\u001b[00;48;5;247m247 \u001b[01m\u001b[00;48;5;248m248 \u001b[01m\u001b[00;48;5;249m249 \u001b[01m\u001b[00;48;5;250m250 \u001b[01m\u001b[00;48;5;251m251 \u001b[01m\u001b[00;48;5;252m252 \u001b[01m\u001b[00;48;5;253m253 \u001b[01m\u001b[00;48;5;254m254 \u001b[01m\u001b[00;48;5;255m255 \u001b[01m\n", "\n" ] } ], "source": [ "t = \"{ESC}00;48;5;{i}m{i:03} {RESET}\"\n", "for i in range(16):\n", " print (t.format(**locals()), end='')\n", " if i % 8 == 7:\n", " print ()\n", "\n", "print ()\n", "\n", "for i in range(16,232):\n", " print (t.format(**locals()), end='')\n", " if (i-16) % 6 == 5:\n", " print ()\n", " if (i-16) % 36 == 35:\n", " print ()\n", "\n", "print ()\n", "\n", "for i in range(232,256):\n", " print (t.format(**locals()), end='')\n", " if (i-232) % 12 == 11:\n", " print ()\n", "print ()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 256-color background and foreground" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[00;48;5;2;38;5;165m165 on 002 \u001b[00m\u001b[00;48;5;2;38;5;102m102 on 002 \u001b[00m\u001b[00;48;5;2;38;5;252m252 on 002 \u001b[00m\u001b[00;48;5;2;38;5;9m009 on 002 \u001b[00m\n", "\u001b[00;48;5;57;38;5;165m165 on 057 \u001b[00m\u001b[00;48;5;57;38;5;102m102 on 057 \u001b[00m\u001b[00;48;5;57;38;5;252m252 on 057 \u001b[00m\u001b[00;48;5;57;38;5;9m009 on 057 \u001b[00m\n", "\u001b[00;48;5;160;38;5;165m165 on 160 \u001b[00m\u001b[00;48;5;160;38;5;102m102 on 160 \u001b[00m\u001b[00;48;5;160;38;5;252m252 on 160 \u001b[00m\u001b[00;48;5;160;38;5;9m009 on 160 \u001b[00m\n", "\u001b[00;48;5;246;38;5;165m165 on 246 \u001b[00m\u001b[00;48;5;246;38;5;102m102 on 246 \u001b[00m\u001b[00;48;5;246;38;5;252m252 on 246 \u001b[00m\u001b[00;48;5;246;38;5;9m009 on 246 \u001b[00m\n" ] } ], "source": [ "t = \"{ESC}00;48;5;{bg};38;5;{fg}m{fg:03} on {bg:03} {RESET}\"\n", "\n", "for bg in [2, 57, 160, 246]:\n", " for fg in [165, 102, 252, 9]:\n", " print (t.format(**locals()), end='')\n", " print()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 24-bit RGB" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[00;38;2;0;0;0m000|000|000 \u001b[00m\u001b[00;38;2;0;0;30m000|000|030 \u001b[00m\u001b[00;38;2;0;0;60m000|000|060 \u001b[00m\u001b[00;38;2;0;0;90m000|000|090 \u001b[00m\u001b[00;38;2;0;0;120m000|000|120 \u001b[00m\u001b[00;38;2;0;0;150m000|000|150 \u001b[00m\u001b[00;38;2;0;0;180m000|000|180 \u001b[00m\u001b[00;38;2;0;0;210m000|000|210 \u001b[00m\u001b[00;38;2;0;0;240m000|000|240 \u001b[00m\n", "\u001b[00;38;2;0;30;0m000|030|000 \u001b[00m\u001b[00;38;2;0;30;30m000|030|030 \u001b[00m\u001b[00;38;2;0;30;60m000|030|060 \u001b[00m\u001b[00;38;2;0;30;90m000|030|090 \u001b[00m\u001b[00;38;2;0;30;120m000|030|120 \u001b[00m\u001b[00;38;2;0;30;150m000|030|150 \u001b[00m\u001b[00;38;2;0;30;180m000|030|180 \u001b[00m\u001b[00;38;2;0;30;210m000|030|210 \u001b[00m\u001b[00;38;2;0;30;240m000|030|240 \u001b[00m\n", "\u001b[00;38;2;0;60;0m000|060|000 \u001b[00m\u001b[00;38;2;0;60;30m000|060|030 \u001b[00m\u001b[00;38;2;0;60;60m000|060|060 \u001b[00m\u001b[00;38;2;0;60;90m000|060|090 \u001b[00m\u001b[00;38;2;0;60;120m000|060|120 \u001b[00m\u001b[00;38;2;0;60;150m000|060|150 \u001b[00m\u001b[00;38;2;0;60;180m000|060|180 \u001b[00m\u001b[00;38;2;0;60;210m000|060|210 \u001b[00m\u001b[00;38;2;0;60;240m000|060|240 \u001b[00m\n", "\u001b[00;38;2;0;90;0m000|090|000 \u001b[00m\u001b[00;38;2;0;90;30m000|090|030 \u001b[00m\u001b[00;38;2;0;90;60m000|090|060 \u001b[00m\u001b[00;38;2;0;90;90m000|090|090 \u001b[00m\u001b[00;38;2;0;90;120m000|090|120 \u001b[00m\u001b[00;38;2;0;90;150m000|090|150 \u001b[00m\u001b[00;38;2;0;90;180m000|090|180 \u001b[00m\u001b[00;38;2;0;90;210m000|090|210 \u001b[00m\u001b[00;38;2;0;90;240m000|090|240 \u001b[00m\n", "\u001b[00;38;2;0;120;0m000|120|000 \u001b[00m\u001b[00;38;2;0;120;30m000|120|030 \u001b[00m\u001b[00;38;2;0;120;60m000|120|060 \u001b[00m\u001b[00;38;2;0;120;90m000|120|090 \u001b[00m\u001b[00;38;2;0;120;120m000|120|120 \u001b[00m\u001b[00;38;2;0;120;150m000|120|150 \u001b[00m\u001b[00;38;2;0;120;180m000|120|180 \u001b[00m\u001b[00;38;2;0;120;210m000|120|210 \u001b[00m\u001b[00;38;2;0;120;240m000|120|240 \u001b[00m\n", "\u001b[00;38;2;0;150;0m000|150|000 \u001b[00m\u001b[00;38;2;0;150;30m000|150|030 \u001b[00m\u001b[00;38;2;0;150;60m000|150|060 \u001b[00m\u001b[00;38;2;0;150;90m000|150|090 \u001b[00m\u001b[00;38;2;0;150;120m000|150|120 \u001b[00m\u001b[00;38;2;0;150;150m000|150|150 \u001b[00m\u001b[00;38;2;0;150;180m000|150|180 \u001b[00m\u001b[00;38;2;0;150;210m000|150|210 \u001b[00m\u001b[00;38;2;0;150;240m000|150|240 \u001b[00m\n", "\u001b[00;38;2;0;180;0m000|180|000 \u001b[00m\u001b[00;38;2;0;180;30m000|180|030 \u001b[00m\u001b[00;38;2;0;180;60m000|180|060 \u001b[00m\u001b[00;38;2;0;180;90m000|180|090 \u001b[00m\u001b[00;38;2;0;180;120m000|180|120 \u001b[00m\u001b[00;38;2;0;180;150m000|180|150 \u001b[00m\u001b[00;38;2;0;180;180m000|180|180 \u001b[00m\u001b[00;38;2;0;180;210m000|180|210 \u001b[00m\u001b[00;38;2;0;180;240m000|180|240 \u001b[00m\n", "\u001b[00;38;2;0;210;0m000|210|000 \u001b[00m\u001b[00;38;2;0;210;30m000|210|030 \u001b[00m\u001b[00;38;2;0;210;60m000|210|060 \u001b[00m\u001b[00;38;2;0;210;90m000|210|090 \u001b[00m\u001b[00;38;2;0;210;120m000|210|120 \u001b[00m\u001b[00;38;2;0;210;150m000|210|150 \u001b[00m\u001b[00;38;2;0;210;180m000|210|180 \u001b[00m\u001b[00;38;2;0;210;210m000|210|210 \u001b[00m\u001b[00;38;2;0;210;240m000|210|240 \u001b[00m\n", "\u001b[00;38;2;0;240;0m000|240|000 \u001b[00m\u001b[00;38;2;0;240;30m000|240|030 \u001b[00m\u001b[00;38;2;0;240;60m000|240|060 \u001b[00m\u001b[00;38;2;0;240;90m000|240|090 \u001b[00m\u001b[00;38;2;0;240;120m000|240|120 \u001b[00m\u001b[00;38;2;0;240;150m000|240|150 \u001b[00m\u001b[00;38;2;0;240;180m000|240|180 \u001b[00m\u001b[00;38;2;0;240;210m000|240|210 \u001b[00m\u001b[00;38;2;0;240;240m000|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;30;0;0m030|000|000 \u001b[00m\u001b[00;38;2;30;0;30m030|000|030 \u001b[00m\u001b[00;38;2;30;0;60m030|000|060 \u001b[00m\u001b[00;38;2;30;0;90m030|000|090 \u001b[00m\u001b[00;38;2;30;0;120m030|000|120 \u001b[00m\u001b[00;38;2;30;0;150m030|000|150 \u001b[00m\u001b[00;38;2;30;0;180m030|000|180 \u001b[00m\u001b[00;38;2;30;0;210m030|000|210 \u001b[00m\u001b[00;38;2;30;0;240m030|000|240 \u001b[00m\n", "\u001b[00;38;2;30;30;0m030|030|000 \u001b[00m\u001b[00;38;2;30;30;30m030|030|030 \u001b[00m\u001b[00;38;2;30;30;60m030|030|060 \u001b[00m\u001b[00;38;2;30;30;90m030|030|090 \u001b[00m\u001b[00;38;2;30;30;120m030|030|120 \u001b[00m\u001b[00;38;2;30;30;150m030|030|150 \u001b[00m\u001b[00;38;2;30;30;180m030|030|180 \u001b[00m\u001b[00;38;2;30;30;210m030|030|210 \u001b[00m\u001b[00;38;2;30;30;240m030|030|240 \u001b[00m\n", "\u001b[00;38;2;30;60;0m030|060|000 \u001b[00m\u001b[00;38;2;30;60;30m030|060|030 \u001b[00m\u001b[00;38;2;30;60;60m030|060|060 \u001b[00m\u001b[00;38;2;30;60;90m030|060|090 \u001b[00m\u001b[00;38;2;30;60;120m030|060|120 \u001b[00m\u001b[00;38;2;30;60;150m030|060|150 \u001b[00m\u001b[00;38;2;30;60;180m030|060|180 \u001b[00m\u001b[00;38;2;30;60;210m030|060|210 \u001b[00m\u001b[00;38;2;30;60;240m030|060|240 \u001b[00m\n", "\u001b[00;38;2;30;90;0m030|090|000 \u001b[00m\u001b[00;38;2;30;90;30m030|090|030 \u001b[00m\u001b[00;38;2;30;90;60m030|090|060 \u001b[00m\u001b[00;38;2;30;90;90m030|090|090 \u001b[00m\u001b[00;38;2;30;90;120m030|090|120 \u001b[00m\u001b[00;38;2;30;90;150m030|090|150 \u001b[00m\u001b[00;38;2;30;90;180m030|090|180 \u001b[00m\u001b[00;38;2;30;90;210m030|090|210 \u001b[00m\u001b[00;38;2;30;90;240m030|090|240 \u001b[00m\n", "\u001b[00;38;2;30;120;0m030|120|000 \u001b[00m\u001b[00;38;2;30;120;30m030|120|030 \u001b[00m\u001b[00;38;2;30;120;60m030|120|060 \u001b[00m\u001b[00;38;2;30;120;90m030|120|090 \u001b[00m\u001b[00;38;2;30;120;120m030|120|120 \u001b[00m\u001b[00;38;2;30;120;150m030|120|150 \u001b[00m\u001b[00;38;2;30;120;180m030|120|180 \u001b[00m\u001b[00;38;2;30;120;210m030|120|210 \u001b[00m\u001b[00;38;2;30;120;240m030|120|240 \u001b[00m\n", "\u001b[00;38;2;30;150;0m030|150|000 \u001b[00m\u001b[00;38;2;30;150;30m030|150|030 \u001b[00m\u001b[00;38;2;30;150;60m030|150|060 \u001b[00m\u001b[00;38;2;30;150;90m030|150|090 \u001b[00m\u001b[00;38;2;30;150;120m030|150|120 \u001b[00m\u001b[00;38;2;30;150;150m030|150|150 \u001b[00m\u001b[00;38;2;30;150;180m030|150|180 \u001b[00m\u001b[00;38;2;30;150;210m030|150|210 \u001b[00m\u001b[00;38;2;30;150;240m030|150|240 \u001b[00m\n", "\u001b[00;38;2;30;180;0m030|180|000 \u001b[00m\u001b[00;38;2;30;180;30m030|180|030 \u001b[00m\u001b[00;38;2;30;180;60m030|180|060 \u001b[00m\u001b[00;38;2;30;180;90m030|180|090 \u001b[00m\u001b[00;38;2;30;180;120m030|180|120 \u001b[00m\u001b[00;38;2;30;180;150m030|180|150 \u001b[00m\u001b[00;38;2;30;180;180m030|180|180 \u001b[00m\u001b[00;38;2;30;180;210m030|180|210 \u001b[00m\u001b[00;38;2;30;180;240m030|180|240 \u001b[00m\n", "\u001b[00;38;2;30;210;0m030|210|000 \u001b[00m\u001b[00;38;2;30;210;30m030|210|030 \u001b[00m\u001b[00;38;2;30;210;60m030|210|060 \u001b[00m\u001b[00;38;2;30;210;90m030|210|090 \u001b[00m\u001b[00;38;2;30;210;120m030|210|120 \u001b[00m\u001b[00;38;2;30;210;150m030|210|150 \u001b[00m\u001b[00;38;2;30;210;180m030|210|180 \u001b[00m\u001b[00;38;2;30;210;210m030|210|210 \u001b[00m\u001b[00;38;2;30;210;240m030|210|240 \u001b[00m\n", "\u001b[00;38;2;30;240;0m030|240|000 \u001b[00m\u001b[00;38;2;30;240;30m030|240|030 \u001b[00m\u001b[00;38;2;30;240;60m030|240|060 \u001b[00m\u001b[00;38;2;30;240;90m030|240|090 \u001b[00m\u001b[00;38;2;30;240;120m030|240|120 \u001b[00m\u001b[00;38;2;30;240;150m030|240|150 \u001b[00m\u001b[00;38;2;30;240;180m030|240|180 \u001b[00m\u001b[00;38;2;30;240;210m030|240|210 \u001b[00m\u001b[00;38;2;30;240;240m030|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;60;0;0m060|000|000 \u001b[00m\u001b[00;38;2;60;0;30m060|000|030 \u001b[00m\u001b[00;38;2;60;0;60m060|000|060 \u001b[00m\u001b[00;38;2;60;0;90m060|000|090 \u001b[00m\u001b[00;38;2;60;0;120m060|000|120 \u001b[00m\u001b[00;38;2;60;0;150m060|000|150 \u001b[00m\u001b[00;38;2;60;0;180m060|000|180 \u001b[00m\u001b[00;38;2;60;0;210m060|000|210 \u001b[00m\u001b[00;38;2;60;0;240m060|000|240 \u001b[00m\n", "\u001b[00;38;2;60;30;0m060|030|000 \u001b[00m\u001b[00;38;2;60;30;30m060|030|030 \u001b[00m\u001b[00;38;2;60;30;60m060|030|060 \u001b[00m\u001b[00;38;2;60;30;90m060|030|090 \u001b[00m\u001b[00;38;2;60;30;120m060|030|120 \u001b[00m\u001b[00;38;2;60;30;150m060|030|150 \u001b[00m\u001b[00;38;2;60;30;180m060|030|180 \u001b[00m\u001b[00;38;2;60;30;210m060|030|210 \u001b[00m\u001b[00;38;2;60;30;240m060|030|240 \u001b[00m\n", "\u001b[00;38;2;60;60;0m060|060|000 \u001b[00m\u001b[00;38;2;60;60;30m060|060|030 \u001b[00m\u001b[00;38;2;60;60;60m060|060|060 \u001b[00m\u001b[00;38;2;60;60;90m060|060|090 \u001b[00m\u001b[00;38;2;60;60;120m060|060|120 \u001b[00m\u001b[00;38;2;60;60;150m060|060|150 \u001b[00m\u001b[00;38;2;60;60;180m060|060|180 \u001b[00m\u001b[00;38;2;60;60;210m060|060|210 \u001b[00m\u001b[00;38;2;60;60;240m060|060|240 \u001b[00m\n", "\u001b[00;38;2;60;90;0m060|090|000 \u001b[00m\u001b[00;38;2;60;90;30m060|090|030 \u001b[00m\u001b[00;38;2;60;90;60m060|090|060 \u001b[00m\u001b[00;38;2;60;90;90m060|090|090 \u001b[00m\u001b[00;38;2;60;90;120m060|090|120 \u001b[00m\u001b[00;38;2;60;90;150m060|090|150 \u001b[00m\u001b[00;38;2;60;90;180m060|090|180 \u001b[00m\u001b[00;38;2;60;90;210m060|090|210 \u001b[00m\u001b[00;38;2;60;90;240m060|090|240 \u001b[00m\n", "\u001b[00;38;2;60;120;0m060|120|000 \u001b[00m\u001b[00;38;2;60;120;30m060|120|030 \u001b[00m\u001b[00;38;2;60;120;60m060|120|060 \u001b[00m\u001b[00;38;2;60;120;90m060|120|090 \u001b[00m\u001b[00;38;2;60;120;120m060|120|120 \u001b[00m\u001b[00;38;2;60;120;150m060|120|150 \u001b[00m\u001b[00;38;2;60;120;180m060|120|180 \u001b[00m\u001b[00;38;2;60;120;210m060|120|210 \u001b[00m\u001b[00;38;2;60;120;240m060|120|240 \u001b[00m\n", "\u001b[00;38;2;60;150;0m060|150|000 \u001b[00m\u001b[00;38;2;60;150;30m060|150|030 \u001b[00m\u001b[00;38;2;60;150;60m060|150|060 \u001b[00m\u001b[00;38;2;60;150;90m060|150|090 \u001b[00m\u001b[00;38;2;60;150;120m060|150|120 \u001b[00m\u001b[00;38;2;60;150;150m060|150|150 \u001b[00m\u001b[00;38;2;60;150;180m060|150|180 \u001b[00m\u001b[00;38;2;60;150;210m060|150|210 \u001b[00m\u001b[00;38;2;60;150;240m060|150|240 \u001b[00m\n", "\u001b[00;38;2;60;180;0m060|180|000 \u001b[00m\u001b[00;38;2;60;180;30m060|180|030 \u001b[00m\u001b[00;38;2;60;180;60m060|180|060 \u001b[00m\u001b[00;38;2;60;180;90m060|180|090 \u001b[00m\u001b[00;38;2;60;180;120m060|180|120 \u001b[00m\u001b[00;38;2;60;180;150m060|180|150 \u001b[00m\u001b[00;38;2;60;180;180m060|180|180 \u001b[00m\u001b[00;38;2;60;180;210m060|180|210 \u001b[00m\u001b[00;38;2;60;180;240m060|180|240 \u001b[00m\n", "\u001b[00;38;2;60;210;0m060|210|000 \u001b[00m\u001b[00;38;2;60;210;30m060|210|030 \u001b[00m\u001b[00;38;2;60;210;60m060|210|060 \u001b[00m\u001b[00;38;2;60;210;90m060|210|090 \u001b[00m\u001b[00;38;2;60;210;120m060|210|120 \u001b[00m\u001b[00;38;2;60;210;150m060|210|150 \u001b[00m\u001b[00;38;2;60;210;180m060|210|180 \u001b[00m\u001b[00;38;2;60;210;210m060|210|210 \u001b[00m\u001b[00;38;2;60;210;240m060|210|240 \u001b[00m\n", "\u001b[00;38;2;60;240;0m060|240|000 \u001b[00m\u001b[00;38;2;60;240;30m060|240|030 \u001b[00m\u001b[00;38;2;60;240;60m060|240|060 \u001b[00m\u001b[00;38;2;60;240;90m060|240|090 \u001b[00m\u001b[00;38;2;60;240;120m060|240|120 \u001b[00m\u001b[00;38;2;60;240;150m060|240|150 \u001b[00m\u001b[00;38;2;60;240;180m060|240|180 \u001b[00m\u001b[00;38;2;60;240;210m060|240|210 \u001b[00m\u001b[00;38;2;60;240;240m060|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;90;0;0m090|000|000 \u001b[00m\u001b[00;38;2;90;0;30m090|000|030 \u001b[00m\u001b[00;38;2;90;0;60m090|000|060 \u001b[00m\u001b[00;38;2;90;0;90m090|000|090 \u001b[00m\u001b[00;38;2;90;0;120m090|000|120 \u001b[00m\u001b[00;38;2;90;0;150m090|000|150 \u001b[00m\u001b[00;38;2;90;0;180m090|000|180 \u001b[00m\u001b[00;38;2;90;0;210m090|000|210 \u001b[00m\u001b[00;38;2;90;0;240m090|000|240 \u001b[00m\n", "\u001b[00;38;2;90;30;0m090|030|000 \u001b[00m\u001b[00;38;2;90;30;30m090|030|030 \u001b[00m\u001b[00;38;2;90;30;60m090|030|060 \u001b[00m\u001b[00;38;2;90;30;90m090|030|090 \u001b[00m\u001b[00;38;2;90;30;120m090|030|120 \u001b[00m\u001b[00;38;2;90;30;150m090|030|150 \u001b[00m\u001b[00;38;2;90;30;180m090|030|180 \u001b[00m\u001b[00;38;2;90;30;210m090|030|210 \u001b[00m\u001b[00;38;2;90;30;240m090|030|240 \u001b[00m\n", "\u001b[00;38;2;90;60;0m090|060|000 \u001b[00m\u001b[00;38;2;90;60;30m090|060|030 \u001b[00m\u001b[00;38;2;90;60;60m090|060|060 \u001b[00m\u001b[00;38;2;90;60;90m090|060|090 \u001b[00m\u001b[00;38;2;90;60;120m090|060|120 \u001b[00m\u001b[00;38;2;90;60;150m090|060|150 \u001b[00m\u001b[00;38;2;90;60;180m090|060|180 \u001b[00m\u001b[00;38;2;90;60;210m090|060|210 \u001b[00m\u001b[00;38;2;90;60;240m090|060|240 \u001b[00m\n", "\u001b[00;38;2;90;90;0m090|090|000 \u001b[00m\u001b[00;38;2;90;90;30m090|090|030 \u001b[00m\u001b[00;38;2;90;90;60m090|090|060 \u001b[00m\u001b[00;38;2;90;90;90m090|090|090 \u001b[00m\u001b[00;38;2;90;90;120m090|090|120 \u001b[00m\u001b[00;38;2;90;90;150m090|090|150 \u001b[00m\u001b[00;38;2;90;90;180m090|090|180 \u001b[00m\u001b[00;38;2;90;90;210m090|090|210 \u001b[00m\u001b[00;38;2;90;90;240m090|090|240 \u001b[00m\n", "\u001b[00;38;2;90;120;0m090|120|000 \u001b[00m\u001b[00;38;2;90;120;30m090|120|030 \u001b[00m\u001b[00;38;2;90;120;60m090|120|060 \u001b[00m\u001b[00;38;2;90;120;90m090|120|090 \u001b[00m\u001b[00;38;2;90;120;120m090|120|120 \u001b[00m\u001b[00;38;2;90;120;150m090|120|150 \u001b[00m\u001b[00;38;2;90;120;180m090|120|180 \u001b[00m\u001b[00;38;2;90;120;210m090|120|210 \u001b[00m\u001b[00;38;2;90;120;240m090|120|240 \u001b[00m\n", "\u001b[00;38;2;90;150;0m090|150|000 \u001b[00m\u001b[00;38;2;90;150;30m090|150|030 \u001b[00m\u001b[00;38;2;90;150;60m090|150|060 \u001b[00m\u001b[00;38;2;90;150;90m090|150|090 \u001b[00m\u001b[00;38;2;90;150;120m090|150|120 \u001b[00m\u001b[00;38;2;90;150;150m090|150|150 \u001b[00m\u001b[00;38;2;90;150;180m090|150|180 \u001b[00m\u001b[00;38;2;90;150;210m090|150|210 \u001b[00m\u001b[00;38;2;90;150;240m090|150|240 \u001b[00m\n", "\u001b[00;38;2;90;180;0m090|180|000 \u001b[00m\u001b[00;38;2;90;180;30m090|180|030 \u001b[00m\u001b[00;38;2;90;180;60m090|180|060 \u001b[00m\u001b[00;38;2;90;180;90m090|180|090 \u001b[00m\u001b[00;38;2;90;180;120m090|180|120 \u001b[00m\u001b[00;38;2;90;180;150m090|180|150 \u001b[00m\u001b[00;38;2;90;180;180m090|180|180 \u001b[00m\u001b[00;38;2;90;180;210m090|180|210 \u001b[00m\u001b[00;38;2;90;180;240m090|180|240 \u001b[00m\n", "\u001b[00;38;2;90;210;0m090|210|000 \u001b[00m\u001b[00;38;2;90;210;30m090|210|030 \u001b[00m\u001b[00;38;2;90;210;60m090|210|060 \u001b[00m\u001b[00;38;2;90;210;90m090|210|090 \u001b[00m\u001b[00;38;2;90;210;120m090|210|120 \u001b[00m\u001b[00;38;2;90;210;150m090|210|150 \u001b[00m\u001b[00;38;2;90;210;180m090|210|180 \u001b[00m\u001b[00;38;2;90;210;210m090|210|210 \u001b[00m\u001b[00;38;2;90;210;240m090|210|240 \u001b[00m\n", "\u001b[00;38;2;90;240;0m090|240|000 \u001b[00m\u001b[00;38;2;90;240;30m090|240|030 \u001b[00m\u001b[00;38;2;90;240;60m090|240|060 \u001b[00m\u001b[00;38;2;90;240;90m090|240|090 \u001b[00m\u001b[00;38;2;90;240;120m090|240|120 \u001b[00m\u001b[00;38;2;90;240;150m090|240|150 \u001b[00m\u001b[00;38;2;90;240;180m090|240|180 \u001b[00m\u001b[00;38;2;90;240;210m090|240|210 \u001b[00m\u001b[00;38;2;90;240;240m090|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;120;0;0m120|000|000 \u001b[00m\u001b[00;38;2;120;0;30m120|000|030 \u001b[00m\u001b[00;38;2;120;0;60m120|000|060 \u001b[00m\u001b[00;38;2;120;0;90m120|000|090 \u001b[00m\u001b[00;38;2;120;0;120m120|000|120 \u001b[00m\u001b[00;38;2;120;0;150m120|000|150 \u001b[00m\u001b[00;38;2;120;0;180m120|000|180 \u001b[00m\u001b[00;38;2;120;0;210m120|000|210 \u001b[00m\u001b[00;38;2;120;0;240m120|000|240 \u001b[00m\n", "\u001b[00;38;2;120;30;0m120|030|000 \u001b[00m\u001b[00;38;2;120;30;30m120|030|030 \u001b[00m\u001b[00;38;2;120;30;60m120|030|060 \u001b[00m\u001b[00;38;2;120;30;90m120|030|090 \u001b[00m\u001b[00;38;2;120;30;120m120|030|120 \u001b[00m\u001b[00;38;2;120;30;150m120|030|150 \u001b[00m\u001b[00;38;2;120;30;180m120|030|180 \u001b[00m\u001b[00;38;2;120;30;210m120|030|210 \u001b[00m\u001b[00;38;2;120;30;240m120|030|240 \u001b[00m\n", "\u001b[00;38;2;120;60;0m120|060|000 \u001b[00m\u001b[00;38;2;120;60;30m120|060|030 \u001b[00m\u001b[00;38;2;120;60;60m120|060|060 \u001b[00m\u001b[00;38;2;120;60;90m120|060|090 \u001b[00m\u001b[00;38;2;120;60;120m120|060|120 \u001b[00m\u001b[00;38;2;120;60;150m120|060|150 \u001b[00m\u001b[00;38;2;120;60;180m120|060|180 \u001b[00m\u001b[00;38;2;120;60;210m120|060|210 \u001b[00m\u001b[00;38;2;120;60;240m120|060|240 \u001b[00m\n", "\u001b[00;38;2;120;90;0m120|090|000 \u001b[00m\u001b[00;38;2;120;90;30m120|090|030 \u001b[00m\u001b[00;38;2;120;90;60m120|090|060 \u001b[00m\u001b[00;38;2;120;90;90m120|090|090 \u001b[00m\u001b[00;38;2;120;90;120m120|090|120 \u001b[00m\u001b[00;38;2;120;90;150m120|090|150 \u001b[00m\u001b[00;38;2;120;90;180m120|090|180 \u001b[00m\u001b[00;38;2;120;90;210m120|090|210 \u001b[00m\u001b[00;38;2;120;90;240m120|090|240 \u001b[00m\n", "\u001b[00;38;2;120;120;0m120|120|000 \u001b[00m\u001b[00;38;2;120;120;30m120|120|030 \u001b[00m\u001b[00;38;2;120;120;60m120|120|060 \u001b[00m\u001b[00;38;2;120;120;90m120|120|090 \u001b[00m\u001b[00;38;2;120;120;120m120|120|120 \u001b[00m\u001b[00;38;2;120;120;150m120|120|150 \u001b[00m\u001b[00;38;2;120;120;180m120|120|180 \u001b[00m\u001b[00;38;2;120;120;210m120|120|210 \u001b[00m\u001b[00;38;2;120;120;240m120|120|240 \u001b[00m\n", "\u001b[00;38;2;120;150;0m120|150|000 \u001b[00m\u001b[00;38;2;120;150;30m120|150|030 \u001b[00m\u001b[00;38;2;120;150;60m120|150|060 \u001b[00m\u001b[00;38;2;120;150;90m120|150|090 \u001b[00m\u001b[00;38;2;120;150;120m120|150|120 \u001b[00m\u001b[00;38;2;120;150;150m120|150|150 \u001b[00m\u001b[00;38;2;120;150;180m120|150|180 \u001b[00m\u001b[00;38;2;120;150;210m120|150|210 \u001b[00m\u001b[00;38;2;120;150;240m120|150|240 \u001b[00m\n", "\u001b[00;38;2;120;180;0m120|180|000 \u001b[00m\u001b[00;38;2;120;180;30m120|180|030 \u001b[00m\u001b[00;38;2;120;180;60m120|180|060 \u001b[00m\u001b[00;38;2;120;180;90m120|180|090 \u001b[00m\u001b[00;38;2;120;180;120m120|180|120 \u001b[00m\u001b[00;38;2;120;180;150m120|180|150 \u001b[00m\u001b[00;38;2;120;180;180m120|180|180 \u001b[00m\u001b[00;38;2;120;180;210m120|180|210 \u001b[00m\u001b[00;38;2;120;180;240m120|180|240 \u001b[00m\n", "\u001b[00;38;2;120;210;0m120|210|000 \u001b[00m\u001b[00;38;2;120;210;30m120|210|030 \u001b[00m\u001b[00;38;2;120;210;60m120|210|060 \u001b[00m\u001b[00;38;2;120;210;90m120|210|090 \u001b[00m\u001b[00;38;2;120;210;120m120|210|120 \u001b[00m\u001b[00;38;2;120;210;150m120|210|150 \u001b[00m\u001b[00;38;2;120;210;180m120|210|180 \u001b[00m\u001b[00;38;2;120;210;210m120|210|210 \u001b[00m\u001b[00;38;2;120;210;240m120|210|240 \u001b[00m\n", "\u001b[00;38;2;120;240;0m120|240|000 \u001b[00m\u001b[00;38;2;120;240;30m120|240|030 \u001b[00m\u001b[00;38;2;120;240;60m120|240|060 \u001b[00m\u001b[00;38;2;120;240;90m120|240|090 \u001b[00m\u001b[00;38;2;120;240;120m120|240|120 \u001b[00m\u001b[00;38;2;120;240;150m120|240|150 \u001b[00m\u001b[00;38;2;120;240;180m120|240|180 \u001b[00m\u001b[00;38;2;120;240;210m120|240|210 \u001b[00m\u001b[00;38;2;120;240;240m120|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;150;0;0m150|000|000 \u001b[00m\u001b[00;38;2;150;0;30m150|000|030 \u001b[00m\u001b[00;38;2;150;0;60m150|000|060 \u001b[00m\u001b[00;38;2;150;0;90m150|000|090 \u001b[00m\u001b[00;38;2;150;0;120m150|000|120 \u001b[00m\u001b[00;38;2;150;0;150m150|000|150 \u001b[00m\u001b[00;38;2;150;0;180m150|000|180 \u001b[00m\u001b[00;38;2;150;0;210m150|000|210 \u001b[00m\u001b[00;38;2;150;0;240m150|000|240 \u001b[00m\n", "\u001b[00;38;2;150;30;0m150|030|000 \u001b[00m\u001b[00;38;2;150;30;30m150|030|030 \u001b[00m\u001b[00;38;2;150;30;60m150|030|060 \u001b[00m\u001b[00;38;2;150;30;90m150|030|090 \u001b[00m\u001b[00;38;2;150;30;120m150|030|120 \u001b[00m\u001b[00;38;2;150;30;150m150|030|150 \u001b[00m\u001b[00;38;2;150;30;180m150|030|180 \u001b[00m\u001b[00;38;2;150;30;210m150|030|210 \u001b[00m\u001b[00;38;2;150;30;240m150|030|240 \u001b[00m\n", "\u001b[00;38;2;150;60;0m150|060|000 \u001b[00m\u001b[00;38;2;150;60;30m150|060|030 \u001b[00m\u001b[00;38;2;150;60;60m150|060|060 \u001b[00m\u001b[00;38;2;150;60;90m150|060|090 \u001b[00m\u001b[00;38;2;150;60;120m150|060|120 \u001b[00m\u001b[00;38;2;150;60;150m150|060|150 \u001b[00m\u001b[00;38;2;150;60;180m150|060|180 \u001b[00m\u001b[00;38;2;150;60;210m150|060|210 \u001b[00m\u001b[00;38;2;150;60;240m150|060|240 \u001b[00m\n", "\u001b[00;38;2;150;90;0m150|090|000 \u001b[00m\u001b[00;38;2;150;90;30m150|090|030 \u001b[00m\u001b[00;38;2;150;90;60m150|090|060 \u001b[00m\u001b[00;38;2;150;90;90m150|090|090 \u001b[00m\u001b[00;38;2;150;90;120m150|090|120 \u001b[00m\u001b[00;38;2;150;90;150m150|090|150 \u001b[00m\u001b[00;38;2;150;90;180m150|090|180 \u001b[00m\u001b[00;38;2;150;90;210m150|090|210 \u001b[00m\u001b[00;38;2;150;90;240m150|090|240 \u001b[00m\n", "\u001b[00;38;2;150;120;0m150|120|000 \u001b[00m\u001b[00;38;2;150;120;30m150|120|030 \u001b[00m\u001b[00;38;2;150;120;60m150|120|060 \u001b[00m\u001b[00;38;2;150;120;90m150|120|090 \u001b[00m\u001b[00;38;2;150;120;120m150|120|120 \u001b[00m\u001b[00;38;2;150;120;150m150|120|150 \u001b[00m\u001b[00;38;2;150;120;180m150|120|180 \u001b[00m\u001b[00;38;2;150;120;210m150|120|210 \u001b[00m\u001b[00;38;2;150;120;240m150|120|240 \u001b[00m\n", "\u001b[00;38;2;150;150;0m150|150|000 \u001b[00m\u001b[00;38;2;150;150;30m150|150|030 \u001b[00m\u001b[00;38;2;150;150;60m150|150|060 \u001b[00m\u001b[00;38;2;150;150;90m150|150|090 \u001b[00m\u001b[00;38;2;150;150;120m150|150|120 \u001b[00m\u001b[00;38;2;150;150;150m150|150|150 \u001b[00m\u001b[00;38;2;150;150;180m150|150|180 \u001b[00m\u001b[00;38;2;150;150;210m150|150|210 \u001b[00m\u001b[00;38;2;150;150;240m150|150|240 \u001b[00m\n", "\u001b[00;38;2;150;180;0m150|180|000 \u001b[00m\u001b[00;38;2;150;180;30m150|180|030 \u001b[00m\u001b[00;38;2;150;180;60m150|180|060 \u001b[00m\u001b[00;38;2;150;180;90m150|180|090 \u001b[00m\u001b[00;38;2;150;180;120m150|180|120 \u001b[00m\u001b[00;38;2;150;180;150m150|180|150 \u001b[00m\u001b[00;38;2;150;180;180m150|180|180 \u001b[00m\u001b[00;38;2;150;180;210m150|180|210 \u001b[00m\u001b[00;38;2;150;180;240m150|180|240 \u001b[00m\n", "\u001b[00;38;2;150;210;0m150|210|000 \u001b[00m\u001b[00;38;2;150;210;30m150|210|030 \u001b[00m\u001b[00;38;2;150;210;60m150|210|060 \u001b[00m\u001b[00;38;2;150;210;90m150|210|090 \u001b[00m\u001b[00;38;2;150;210;120m150|210|120 \u001b[00m\u001b[00;38;2;150;210;150m150|210|150 \u001b[00m\u001b[00;38;2;150;210;180m150|210|180 \u001b[00m\u001b[00;38;2;150;210;210m150|210|210 \u001b[00m\u001b[00;38;2;150;210;240m150|210|240 \u001b[00m\n", "\u001b[00;38;2;150;240;0m150|240|000 \u001b[00m\u001b[00;38;2;150;240;30m150|240|030 \u001b[00m\u001b[00;38;2;150;240;60m150|240|060 \u001b[00m\u001b[00;38;2;150;240;90m150|240|090 \u001b[00m\u001b[00;38;2;150;240;120m150|240|120 \u001b[00m\u001b[00;38;2;150;240;150m150|240|150 \u001b[00m\u001b[00;38;2;150;240;180m150|240|180 \u001b[00m\u001b[00;38;2;150;240;210m150|240|210 \u001b[00m\u001b[00;38;2;150;240;240m150|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;180;0;0m180|000|000 \u001b[00m\u001b[00;38;2;180;0;30m180|000|030 \u001b[00m\u001b[00;38;2;180;0;60m180|000|060 \u001b[00m\u001b[00;38;2;180;0;90m180|000|090 \u001b[00m\u001b[00;38;2;180;0;120m180|000|120 \u001b[00m\u001b[00;38;2;180;0;150m180|000|150 \u001b[00m\u001b[00;38;2;180;0;180m180|000|180 \u001b[00m\u001b[00;38;2;180;0;210m180|000|210 \u001b[00m\u001b[00;38;2;180;0;240m180|000|240 \u001b[00m\n", "\u001b[00;38;2;180;30;0m180|030|000 \u001b[00m\u001b[00;38;2;180;30;30m180|030|030 \u001b[00m\u001b[00;38;2;180;30;60m180|030|060 \u001b[00m\u001b[00;38;2;180;30;90m180|030|090 \u001b[00m\u001b[00;38;2;180;30;120m180|030|120 \u001b[00m\u001b[00;38;2;180;30;150m180|030|150 \u001b[00m\u001b[00;38;2;180;30;180m180|030|180 \u001b[00m\u001b[00;38;2;180;30;210m180|030|210 \u001b[00m\u001b[00;38;2;180;30;240m180|030|240 \u001b[00m\n", "\u001b[00;38;2;180;60;0m180|060|000 \u001b[00m\u001b[00;38;2;180;60;30m180|060|030 \u001b[00m\u001b[00;38;2;180;60;60m180|060|060 \u001b[00m\u001b[00;38;2;180;60;90m180|060|090 \u001b[00m\u001b[00;38;2;180;60;120m180|060|120 \u001b[00m\u001b[00;38;2;180;60;150m180|060|150 \u001b[00m\u001b[00;38;2;180;60;180m180|060|180 \u001b[00m\u001b[00;38;2;180;60;210m180|060|210 \u001b[00m\u001b[00;38;2;180;60;240m180|060|240 \u001b[00m\n", "\u001b[00;38;2;180;90;0m180|090|000 \u001b[00m\u001b[00;38;2;180;90;30m180|090|030 \u001b[00m\u001b[00;38;2;180;90;60m180|090|060 \u001b[00m\u001b[00;38;2;180;90;90m180|090|090 \u001b[00m\u001b[00;38;2;180;90;120m180|090|120 \u001b[00m\u001b[00;38;2;180;90;150m180|090|150 \u001b[00m\u001b[00;38;2;180;90;180m180|090|180 \u001b[00m\u001b[00;38;2;180;90;210m180|090|210 \u001b[00m\u001b[00;38;2;180;90;240m180|090|240 \u001b[00m\n", "\u001b[00;38;2;180;120;0m180|120|000 \u001b[00m\u001b[00;38;2;180;120;30m180|120|030 \u001b[00m\u001b[00;38;2;180;120;60m180|120|060 \u001b[00m\u001b[00;38;2;180;120;90m180|120|090 \u001b[00m\u001b[00;38;2;180;120;120m180|120|120 \u001b[00m\u001b[00;38;2;180;120;150m180|120|150 \u001b[00m\u001b[00;38;2;180;120;180m180|120|180 \u001b[00m\u001b[00;38;2;180;120;210m180|120|210 \u001b[00m\u001b[00;38;2;180;120;240m180|120|240 \u001b[00m\n", "\u001b[00;38;2;180;150;0m180|150|000 \u001b[00m\u001b[00;38;2;180;150;30m180|150|030 \u001b[00m\u001b[00;38;2;180;150;60m180|150|060 \u001b[00m\u001b[00;38;2;180;150;90m180|150|090 \u001b[00m\u001b[00;38;2;180;150;120m180|150|120 \u001b[00m\u001b[00;38;2;180;150;150m180|150|150 \u001b[00m\u001b[00;38;2;180;150;180m180|150|180 \u001b[00m\u001b[00;38;2;180;150;210m180|150|210 \u001b[00m\u001b[00;38;2;180;150;240m180|150|240 \u001b[00m\n", "\u001b[00;38;2;180;180;0m180|180|000 \u001b[00m\u001b[00;38;2;180;180;30m180|180|030 \u001b[00m\u001b[00;38;2;180;180;60m180|180|060 \u001b[00m\u001b[00;38;2;180;180;90m180|180|090 \u001b[00m\u001b[00;38;2;180;180;120m180|180|120 \u001b[00m\u001b[00;38;2;180;180;150m180|180|150 \u001b[00m\u001b[00;38;2;180;180;180m180|180|180 \u001b[00m\u001b[00;38;2;180;180;210m180|180|210 \u001b[00m\u001b[00;38;2;180;180;240m180|180|240 \u001b[00m\n", "\u001b[00;38;2;180;210;0m180|210|000 \u001b[00m\u001b[00;38;2;180;210;30m180|210|030 \u001b[00m\u001b[00;38;2;180;210;60m180|210|060 \u001b[00m\u001b[00;38;2;180;210;90m180|210|090 \u001b[00m\u001b[00;38;2;180;210;120m180|210|120 \u001b[00m\u001b[00;38;2;180;210;150m180|210|150 \u001b[00m\u001b[00;38;2;180;210;180m180|210|180 \u001b[00m\u001b[00;38;2;180;210;210m180|210|210 \u001b[00m\u001b[00;38;2;180;210;240m180|210|240 \u001b[00m\n", "\u001b[00;38;2;180;240;0m180|240|000 \u001b[00m\u001b[00;38;2;180;240;30m180|240|030 \u001b[00m\u001b[00;38;2;180;240;60m180|240|060 \u001b[00m\u001b[00;38;2;180;240;90m180|240|090 \u001b[00m\u001b[00;38;2;180;240;120m180|240|120 \u001b[00m\u001b[00;38;2;180;240;150m180|240|150 \u001b[00m\u001b[00;38;2;180;240;180m180|240|180 \u001b[00m\u001b[00;38;2;180;240;210m180|240|210 \u001b[00m\u001b[00;38;2;180;240;240m180|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;210;0;0m210|000|000 \u001b[00m\u001b[00;38;2;210;0;30m210|000|030 \u001b[00m\u001b[00;38;2;210;0;60m210|000|060 \u001b[00m\u001b[00;38;2;210;0;90m210|000|090 \u001b[00m\u001b[00;38;2;210;0;120m210|000|120 \u001b[00m\u001b[00;38;2;210;0;150m210|000|150 \u001b[00m\u001b[00;38;2;210;0;180m210|000|180 \u001b[00m\u001b[00;38;2;210;0;210m210|000|210 \u001b[00m\u001b[00;38;2;210;0;240m210|000|240 \u001b[00m\n", "\u001b[00;38;2;210;30;0m210|030|000 \u001b[00m\u001b[00;38;2;210;30;30m210|030|030 \u001b[00m\u001b[00;38;2;210;30;60m210|030|060 \u001b[00m\u001b[00;38;2;210;30;90m210|030|090 \u001b[00m\u001b[00;38;2;210;30;120m210|030|120 \u001b[00m\u001b[00;38;2;210;30;150m210|030|150 \u001b[00m\u001b[00;38;2;210;30;180m210|030|180 \u001b[00m\u001b[00;38;2;210;30;210m210|030|210 \u001b[00m\u001b[00;38;2;210;30;240m210|030|240 \u001b[00m\n", "\u001b[00;38;2;210;60;0m210|060|000 \u001b[00m\u001b[00;38;2;210;60;30m210|060|030 \u001b[00m\u001b[00;38;2;210;60;60m210|060|060 \u001b[00m\u001b[00;38;2;210;60;90m210|060|090 \u001b[00m\u001b[00;38;2;210;60;120m210|060|120 \u001b[00m\u001b[00;38;2;210;60;150m210|060|150 \u001b[00m\u001b[00;38;2;210;60;180m210|060|180 \u001b[00m\u001b[00;38;2;210;60;210m210|060|210 \u001b[00m\u001b[00;38;2;210;60;240m210|060|240 \u001b[00m\n", "\u001b[00;38;2;210;90;0m210|090|000 \u001b[00m\u001b[00;38;2;210;90;30m210|090|030 \u001b[00m\u001b[00;38;2;210;90;60m210|090|060 \u001b[00m\u001b[00;38;2;210;90;90m210|090|090 \u001b[00m\u001b[00;38;2;210;90;120m210|090|120 \u001b[00m\u001b[00;38;2;210;90;150m210|090|150 \u001b[00m\u001b[00;38;2;210;90;180m210|090|180 \u001b[00m\u001b[00;38;2;210;90;210m210|090|210 \u001b[00m\u001b[00;38;2;210;90;240m210|090|240 \u001b[00m\n", "\u001b[00;38;2;210;120;0m210|120|000 \u001b[00m\u001b[00;38;2;210;120;30m210|120|030 \u001b[00m\u001b[00;38;2;210;120;60m210|120|060 \u001b[00m\u001b[00;38;2;210;120;90m210|120|090 \u001b[00m\u001b[00;38;2;210;120;120m210|120|120 \u001b[00m\u001b[00;38;2;210;120;150m210|120|150 \u001b[00m\u001b[00;38;2;210;120;180m210|120|180 \u001b[00m\u001b[00;38;2;210;120;210m210|120|210 \u001b[00m\u001b[00;38;2;210;120;240m210|120|240 \u001b[00m\n", "\u001b[00;38;2;210;150;0m210|150|000 \u001b[00m\u001b[00;38;2;210;150;30m210|150|030 \u001b[00m\u001b[00;38;2;210;150;60m210|150|060 \u001b[00m\u001b[00;38;2;210;150;90m210|150|090 \u001b[00m\u001b[00;38;2;210;150;120m210|150|120 \u001b[00m\u001b[00;38;2;210;150;150m210|150|150 \u001b[00m\u001b[00;38;2;210;150;180m210|150|180 \u001b[00m\u001b[00;38;2;210;150;210m210|150|210 \u001b[00m\u001b[00;38;2;210;150;240m210|150|240 \u001b[00m\n", "\u001b[00;38;2;210;180;0m210|180|000 \u001b[00m\u001b[00;38;2;210;180;30m210|180|030 \u001b[00m\u001b[00;38;2;210;180;60m210|180|060 \u001b[00m\u001b[00;38;2;210;180;90m210|180|090 \u001b[00m\u001b[00;38;2;210;180;120m210|180|120 \u001b[00m\u001b[00;38;2;210;180;150m210|180|150 \u001b[00m\u001b[00;38;2;210;180;180m210|180|180 \u001b[00m\u001b[00;38;2;210;180;210m210|180|210 \u001b[00m\u001b[00;38;2;210;180;240m210|180|240 \u001b[00m\n", "\u001b[00;38;2;210;210;0m210|210|000 \u001b[00m\u001b[00;38;2;210;210;30m210|210|030 \u001b[00m\u001b[00;38;2;210;210;60m210|210|060 \u001b[00m\u001b[00;38;2;210;210;90m210|210|090 \u001b[00m\u001b[00;38;2;210;210;120m210|210|120 \u001b[00m\u001b[00;38;2;210;210;150m210|210|150 \u001b[00m\u001b[00;38;2;210;210;180m210|210|180 \u001b[00m\u001b[00;38;2;210;210;210m210|210|210 \u001b[00m\u001b[00;38;2;210;210;240m210|210|240 \u001b[00m\n", "\u001b[00;38;2;210;240;0m210|240|000 \u001b[00m\u001b[00;38;2;210;240;30m210|240|030 \u001b[00m\u001b[00;38;2;210;240;60m210|240|060 \u001b[00m\u001b[00;38;2;210;240;90m210|240|090 \u001b[00m\u001b[00;38;2;210;240;120m210|240|120 \u001b[00m\u001b[00;38;2;210;240;150m210|240|150 \u001b[00m\u001b[00;38;2;210;240;180m210|240|180 \u001b[00m\u001b[00;38;2;210;240;210m210|240|210 \u001b[00m\u001b[00;38;2;210;240;240m210|240|240 \u001b[00m\n", "\n", "\u001b[00;38;2;240;0;0m240|000|000 \u001b[00m\u001b[00;38;2;240;0;30m240|000|030 \u001b[00m\u001b[00;38;2;240;0;60m240|000|060 \u001b[00m\u001b[00;38;2;240;0;90m240|000|090 \u001b[00m\u001b[00;38;2;240;0;120m240|000|120 \u001b[00m\u001b[00;38;2;240;0;150m240|000|150 \u001b[00m\u001b[00;38;2;240;0;180m240|000|180 \u001b[00m\u001b[00;38;2;240;0;210m240|000|210 \u001b[00m\u001b[00;38;2;240;0;240m240|000|240 \u001b[00m\n", "\u001b[00;38;2;240;30;0m240|030|000 \u001b[00m\u001b[00;38;2;240;30;30m240|030|030 \u001b[00m\u001b[00;38;2;240;30;60m240|030|060 \u001b[00m\u001b[00;38;2;240;30;90m240|030|090 \u001b[00m\u001b[00;38;2;240;30;120m240|030|120 \u001b[00m\u001b[00;38;2;240;30;150m240|030|150 \u001b[00m\u001b[00;38;2;240;30;180m240|030|180 \u001b[00m\u001b[00;38;2;240;30;210m240|030|210 \u001b[00m\u001b[00;38;2;240;30;240m240|030|240 \u001b[00m\n", "\u001b[00;38;2;240;60;0m240|060|000 \u001b[00m\u001b[00;38;2;240;60;30m240|060|030 \u001b[00m\u001b[00;38;2;240;60;60m240|060|060 \u001b[00m\u001b[00;38;2;240;60;90m240|060|090 \u001b[00m\u001b[00;38;2;240;60;120m240|060|120 \u001b[00m\u001b[00;38;2;240;60;150m240|060|150 \u001b[00m\u001b[00;38;2;240;60;180m240|060|180 \u001b[00m\u001b[00;38;2;240;60;210m240|060|210 \u001b[00m\u001b[00;38;2;240;60;240m240|060|240 \u001b[00m\n", "\u001b[00;38;2;240;90;0m240|090|000 \u001b[00m\u001b[00;38;2;240;90;30m240|090|030 \u001b[00m\u001b[00;38;2;240;90;60m240|090|060 \u001b[00m\u001b[00;38;2;240;90;90m240|090|090 \u001b[00m\u001b[00;38;2;240;90;120m240|090|120 \u001b[00m\u001b[00;38;2;240;90;150m240|090|150 \u001b[00m\u001b[00;38;2;240;90;180m240|090|180 \u001b[00m\u001b[00;38;2;240;90;210m240|090|210 \u001b[00m\u001b[00;38;2;240;90;240m240|090|240 \u001b[00m\n", "\u001b[00;38;2;240;120;0m240|120|000 \u001b[00m\u001b[00;38;2;240;120;30m240|120|030 \u001b[00m\u001b[00;38;2;240;120;60m240|120|060 \u001b[00m\u001b[00;38;2;240;120;90m240|120|090 \u001b[00m\u001b[00;38;2;240;120;120m240|120|120 \u001b[00m\u001b[00;38;2;240;120;150m240|120|150 \u001b[00m\u001b[00;38;2;240;120;180m240|120|180 \u001b[00m\u001b[00;38;2;240;120;210m240|120|210 \u001b[00m\u001b[00;38;2;240;120;240m240|120|240 \u001b[00m\n", "\u001b[00;38;2;240;150;0m240|150|000 \u001b[00m\u001b[00;38;2;240;150;30m240|150|030 \u001b[00m\u001b[00;38;2;240;150;60m240|150|060 \u001b[00m\u001b[00;38;2;240;150;90m240|150|090 \u001b[00m\u001b[00;38;2;240;150;120m240|150|120 \u001b[00m\u001b[00;38;2;240;150;150m240|150|150 \u001b[00m\u001b[00;38;2;240;150;180m240|150|180 \u001b[00m\u001b[00;38;2;240;150;210m240|150|210 \u001b[00m\u001b[00;38;2;240;150;240m240|150|240 \u001b[00m\n", "\u001b[00;38;2;240;180;0m240|180|000 \u001b[00m\u001b[00;38;2;240;180;30m240|180|030 \u001b[00m\u001b[00;38;2;240;180;60m240|180|060 \u001b[00m\u001b[00;38;2;240;180;90m240|180|090 \u001b[00m\u001b[00;38;2;240;180;120m240|180|120 \u001b[00m\u001b[00;38;2;240;180;150m240|180|150 \u001b[00m\u001b[00;38;2;240;180;180m240|180|180 \u001b[00m\u001b[00;38;2;240;180;210m240|180|210 \u001b[00m\u001b[00;38;2;240;180;240m240|180|240 \u001b[00m\n", "\u001b[00;38;2;240;210;0m240|210|000 \u001b[00m\u001b[00;38;2;240;210;30m240|210|030 \u001b[00m\u001b[00;38;2;240;210;60m240|210|060 \u001b[00m\u001b[00;38;2;240;210;90m240|210|090 \u001b[00m\u001b[00;38;2;240;210;120m240|210|120 \u001b[00m\u001b[00;38;2;240;210;150m240|210|150 \u001b[00m\u001b[00;38;2;240;210;180m240|210|180 \u001b[00m\u001b[00;38;2;240;210;210m240|210|210 \u001b[00m\u001b[00;38;2;240;210;240m240|210|240 \u001b[00m\n", "\u001b[00;38;2;240;240;0m240|240|000 \u001b[00m\u001b[00;38;2;240;240;30m240|240|030 \u001b[00m\u001b[00;38;2;240;240;60m240|240|060 \u001b[00m\u001b[00;38;2;240;240;90m240|240|090 \u001b[00m\u001b[00;38;2;240;240;120m240|240|120 \u001b[00m\u001b[00;38;2;240;240;150m240|240|150 \u001b[00m\u001b[00;38;2;240;240;180m240|240|180 \u001b[00m\u001b[00;38;2;240;240;210m240|240|210 \u001b[00m\u001b[00;38;2;240;240;240m240|240|240 \u001b[00m\n", "\n" ] } ], "source": [ "steps = range(0,256,30)\n", "\n", "t = \"{ESC}00;38;2;{r};{g};{b}m{r:03}|{g:03}|{b:03} {RESET}\"\n", "for r in steps:\n", " for g in steps:\n", " for b in steps:\n", " print (t.format(**locals()), end='')\n", " print()\n", " print()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 24-bit RGB background" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[00;48;2;0;0;0m000|000|000 \u001b[00m\u001b[00;48;2;0;0;30m000|000|030 \u001b[00m\u001b[00;48;2;0;0;60m000|000|060 \u001b[00m\u001b[00;48;2;0;0;90m000|000|090 \u001b[00m\u001b[00;48;2;0;0;120m000|000|120 \u001b[00m\u001b[00;48;2;0;0;150m000|000|150 \u001b[00m\u001b[00;48;2;0;0;180m000|000|180 \u001b[00m\u001b[00;48;2;0;0;210m000|000|210 \u001b[00m\u001b[00;48;2;0;0;240m000|000|240 \u001b[00m\n", "\u001b[00;48;2;0;30;0m000|030|000 \u001b[00m\u001b[00;48;2;0;30;30m000|030|030 \u001b[00m\u001b[00;48;2;0;30;60m000|030|060 \u001b[00m\u001b[00;48;2;0;30;90m000|030|090 \u001b[00m\u001b[00;48;2;0;30;120m000|030|120 \u001b[00m\u001b[00;48;2;0;30;150m000|030|150 \u001b[00m\u001b[00;48;2;0;30;180m000|030|180 \u001b[00m\u001b[00;48;2;0;30;210m000|030|210 \u001b[00m\u001b[00;48;2;0;30;240m000|030|240 \u001b[00m\n", "\u001b[00;48;2;0;60;0m000|060|000 \u001b[00m\u001b[00;48;2;0;60;30m000|060|030 \u001b[00m\u001b[00;48;2;0;60;60m000|060|060 \u001b[00m\u001b[00;48;2;0;60;90m000|060|090 \u001b[00m\u001b[00;48;2;0;60;120m000|060|120 \u001b[00m\u001b[00;48;2;0;60;150m000|060|150 \u001b[00m\u001b[00;48;2;0;60;180m000|060|180 \u001b[00m\u001b[00;48;2;0;60;210m000|060|210 \u001b[00m\u001b[00;48;2;0;60;240m000|060|240 \u001b[00m\n", "\u001b[00;48;2;0;90;0m000|090|000 \u001b[00m\u001b[00;48;2;0;90;30m000|090|030 \u001b[00m\u001b[00;48;2;0;90;60m000|090|060 \u001b[00m\u001b[00;48;2;0;90;90m000|090|090 \u001b[00m\u001b[00;48;2;0;90;120m000|090|120 \u001b[00m\u001b[00;48;2;0;90;150m000|090|150 \u001b[00m\u001b[00;48;2;0;90;180m000|090|180 \u001b[00m\u001b[00;48;2;0;90;210m000|090|210 \u001b[00m\u001b[00;48;2;0;90;240m000|090|240 \u001b[00m\n", "\u001b[00;48;2;0;120;0m000|120|000 \u001b[00m\u001b[00;48;2;0;120;30m000|120|030 \u001b[00m\u001b[00;48;2;0;120;60m000|120|060 \u001b[00m\u001b[00;48;2;0;120;90m000|120|090 \u001b[00m\u001b[00;48;2;0;120;120m000|120|120 \u001b[00m\u001b[00;48;2;0;120;150m000|120|150 \u001b[00m\u001b[00;48;2;0;120;180m000|120|180 \u001b[00m\u001b[00;48;2;0;120;210m000|120|210 \u001b[00m\u001b[00;48;2;0;120;240m000|120|240 \u001b[00m\n", "\u001b[00;48;2;0;150;0m000|150|000 \u001b[00m\u001b[00;48;2;0;150;30m000|150|030 \u001b[00m\u001b[00;48;2;0;150;60m000|150|060 \u001b[00m\u001b[00;48;2;0;150;90m000|150|090 \u001b[00m\u001b[00;48;2;0;150;120m000|150|120 \u001b[00m\u001b[00;48;2;0;150;150m000|150|150 \u001b[00m\u001b[00;48;2;0;150;180m000|150|180 \u001b[00m\u001b[00;48;2;0;150;210m000|150|210 \u001b[00m\u001b[00;48;2;0;150;240m000|150|240 \u001b[00m\n", "\u001b[00;48;2;0;180;0m000|180|000 \u001b[00m\u001b[00;48;2;0;180;30m000|180|030 \u001b[00m\u001b[00;48;2;0;180;60m000|180|060 \u001b[00m\u001b[00;48;2;0;180;90m000|180|090 \u001b[00m\u001b[00;48;2;0;180;120m000|180|120 \u001b[00m\u001b[00;48;2;0;180;150m000|180|150 \u001b[00m\u001b[00;48;2;0;180;180m000|180|180 \u001b[00m\u001b[00;48;2;0;180;210m000|180|210 \u001b[00m\u001b[00;48;2;0;180;240m000|180|240 \u001b[00m\n", "\u001b[00;48;2;0;210;0m000|210|000 \u001b[00m\u001b[00;48;2;0;210;30m000|210|030 \u001b[00m\u001b[00;48;2;0;210;60m000|210|060 \u001b[00m\u001b[00;48;2;0;210;90m000|210|090 \u001b[00m\u001b[00;48;2;0;210;120m000|210|120 \u001b[00m\u001b[00;48;2;0;210;150m000|210|150 \u001b[00m\u001b[00;48;2;0;210;180m000|210|180 \u001b[00m\u001b[00;48;2;0;210;210m000|210|210 \u001b[00m\u001b[00;48;2;0;210;240m000|210|240 \u001b[00m\n", "\u001b[00;48;2;0;240;0m000|240|000 \u001b[00m\u001b[00;48;2;0;240;30m000|240|030 \u001b[00m\u001b[00;48;2;0;240;60m000|240|060 \u001b[00m\u001b[00;48;2;0;240;90m000|240|090 \u001b[00m\u001b[00;48;2;0;240;120m000|240|120 \u001b[00m\u001b[00;48;2;0;240;150m000|240|150 \u001b[00m\u001b[00;48;2;0;240;180m000|240|180 \u001b[00m\u001b[00;48;2;0;240;210m000|240|210 \u001b[00m\u001b[00;48;2;0;240;240m000|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;30;0;0m030|000|000 \u001b[00m\u001b[00;48;2;30;0;30m030|000|030 \u001b[00m\u001b[00;48;2;30;0;60m030|000|060 \u001b[00m\u001b[00;48;2;30;0;90m030|000|090 \u001b[00m\u001b[00;48;2;30;0;120m030|000|120 \u001b[00m\u001b[00;48;2;30;0;150m030|000|150 \u001b[00m\u001b[00;48;2;30;0;180m030|000|180 \u001b[00m\u001b[00;48;2;30;0;210m030|000|210 \u001b[00m\u001b[00;48;2;30;0;240m030|000|240 \u001b[00m\n", "\u001b[00;48;2;30;30;0m030|030|000 \u001b[00m\u001b[00;48;2;30;30;30m030|030|030 \u001b[00m\u001b[00;48;2;30;30;60m030|030|060 \u001b[00m\u001b[00;48;2;30;30;90m030|030|090 \u001b[00m\u001b[00;48;2;30;30;120m030|030|120 \u001b[00m\u001b[00;48;2;30;30;150m030|030|150 \u001b[00m\u001b[00;48;2;30;30;180m030|030|180 \u001b[00m\u001b[00;48;2;30;30;210m030|030|210 \u001b[00m\u001b[00;48;2;30;30;240m030|030|240 \u001b[00m\n", "\u001b[00;48;2;30;60;0m030|060|000 \u001b[00m\u001b[00;48;2;30;60;30m030|060|030 \u001b[00m\u001b[00;48;2;30;60;60m030|060|060 \u001b[00m\u001b[00;48;2;30;60;90m030|060|090 \u001b[00m\u001b[00;48;2;30;60;120m030|060|120 \u001b[00m\u001b[00;48;2;30;60;150m030|060|150 \u001b[00m\u001b[00;48;2;30;60;180m030|060|180 \u001b[00m\u001b[00;48;2;30;60;210m030|060|210 \u001b[00m\u001b[00;48;2;30;60;240m030|060|240 \u001b[00m\n", "\u001b[00;48;2;30;90;0m030|090|000 \u001b[00m\u001b[00;48;2;30;90;30m030|090|030 \u001b[00m\u001b[00;48;2;30;90;60m030|090|060 \u001b[00m\u001b[00;48;2;30;90;90m030|090|090 \u001b[00m\u001b[00;48;2;30;90;120m030|090|120 \u001b[00m\u001b[00;48;2;30;90;150m030|090|150 \u001b[00m\u001b[00;48;2;30;90;180m030|090|180 \u001b[00m\u001b[00;48;2;30;90;210m030|090|210 \u001b[00m\u001b[00;48;2;30;90;240m030|090|240 \u001b[00m\n", "\u001b[00;48;2;30;120;0m030|120|000 \u001b[00m\u001b[00;48;2;30;120;30m030|120|030 \u001b[00m\u001b[00;48;2;30;120;60m030|120|060 \u001b[00m\u001b[00;48;2;30;120;90m030|120|090 \u001b[00m\u001b[00;48;2;30;120;120m030|120|120 \u001b[00m\u001b[00;48;2;30;120;150m030|120|150 \u001b[00m\u001b[00;48;2;30;120;180m030|120|180 \u001b[00m\u001b[00;48;2;30;120;210m030|120|210 \u001b[00m\u001b[00;48;2;30;120;240m030|120|240 \u001b[00m\n", "\u001b[00;48;2;30;150;0m030|150|000 \u001b[00m\u001b[00;48;2;30;150;30m030|150|030 \u001b[00m\u001b[00;48;2;30;150;60m030|150|060 \u001b[00m\u001b[00;48;2;30;150;90m030|150|090 \u001b[00m\u001b[00;48;2;30;150;120m030|150|120 \u001b[00m\u001b[00;48;2;30;150;150m030|150|150 \u001b[00m\u001b[00;48;2;30;150;180m030|150|180 \u001b[00m\u001b[00;48;2;30;150;210m030|150|210 \u001b[00m\u001b[00;48;2;30;150;240m030|150|240 \u001b[00m\n", "\u001b[00;48;2;30;180;0m030|180|000 \u001b[00m\u001b[00;48;2;30;180;30m030|180|030 \u001b[00m\u001b[00;48;2;30;180;60m030|180|060 \u001b[00m\u001b[00;48;2;30;180;90m030|180|090 \u001b[00m\u001b[00;48;2;30;180;120m030|180|120 \u001b[00m\u001b[00;48;2;30;180;150m030|180|150 \u001b[00m\u001b[00;48;2;30;180;180m030|180|180 \u001b[00m\u001b[00;48;2;30;180;210m030|180|210 \u001b[00m\u001b[00;48;2;30;180;240m030|180|240 \u001b[00m\n", "\u001b[00;48;2;30;210;0m030|210|000 \u001b[00m\u001b[00;48;2;30;210;30m030|210|030 \u001b[00m\u001b[00;48;2;30;210;60m030|210|060 \u001b[00m\u001b[00;48;2;30;210;90m030|210|090 \u001b[00m\u001b[00;48;2;30;210;120m030|210|120 \u001b[00m\u001b[00;48;2;30;210;150m030|210|150 \u001b[00m\u001b[00;48;2;30;210;180m030|210|180 \u001b[00m\u001b[00;48;2;30;210;210m030|210|210 \u001b[00m\u001b[00;48;2;30;210;240m030|210|240 \u001b[00m\n", "\u001b[00;48;2;30;240;0m030|240|000 \u001b[00m\u001b[00;48;2;30;240;30m030|240|030 \u001b[00m\u001b[00;48;2;30;240;60m030|240|060 \u001b[00m\u001b[00;48;2;30;240;90m030|240|090 \u001b[00m\u001b[00;48;2;30;240;120m030|240|120 \u001b[00m\u001b[00;48;2;30;240;150m030|240|150 \u001b[00m\u001b[00;48;2;30;240;180m030|240|180 \u001b[00m\u001b[00;48;2;30;240;210m030|240|210 \u001b[00m\u001b[00;48;2;30;240;240m030|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;60;0;0m060|000|000 \u001b[00m\u001b[00;48;2;60;0;30m060|000|030 \u001b[00m\u001b[00;48;2;60;0;60m060|000|060 \u001b[00m\u001b[00;48;2;60;0;90m060|000|090 \u001b[00m\u001b[00;48;2;60;0;120m060|000|120 \u001b[00m\u001b[00;48;2;60;0;150m060|000|150 \u001b[00m\u001b[00;48;2;60;0;180m060|000|180 \u001b[00m\u001b[00;48;2;60;0;210m060|000|210 \u001b[00m\u001b[00;48;2;60;0;240m060|000|240 \u001b[00m\n", "\u001b[00;48;2;60;30;0m060|030|000 \u001b[00m\u001b[00;48;2;60;30;30m060|030|030 \u001b[00m\u001b[00;48;2;60;30;60m060|030|060 \u001b[00m\u001b[00;48;2;60;30;90m060|030|090 \u001b[00m\u001b[00;48;2;60;30;120m060|030|120 \u001b[00m\u001b[00;48;2;60;30;150m060|030|150 \u001b[00m\u001b[00;48;2;60;30;180m060|030|180 \u001b[00m\u001b[00;48;2;60;30;210m060|030|210 \u001b[00m\u001b[00;48;2;60;30;240m060|030|240 \u001b[00m\n", "\u001b[00;48;2;60;60;0m060|060|000 \u001b[00m\u001b[00;48;2;60;60;30m060|060|030 \u001b[00m\u001b[00;48;2;60;60;60m060|060|060 \u001b[00m\u001b[00;48;2;60;60;90m060|060|090 \u001b[00m\u001b[00;48;2;60;60;120m060|060|120 \u001b[00m\u001b[00;48;2;60;60;150m060|060|150 \u001b[00m\u001b[00;48;2;60;60;180m060|060|180 \u001b[00m\u001b[00;48;2;60;60;210m060|060|210 \u001b[00m\u001b[00;48;2;60;60;240m060|060|240 \u001b[00m\n", "\u001b[00;48;2;60;90;0m060|090|000 \u001b[00m\u001b[00;48;2;60;90;30m060|090|030 \u001b[00m\u001b[00;48;2;60;90;60m060|090|060 \u001b[00m\u001b[00;48;2;60;90;90m060|090|090 \u001b[00m\u001b[00;48;2;60;90;120m060|090|120 \u001b[00m\u001b[00;48;2;60;90;150m060|090|150 \u001b[00m\u001b[00;48;2;60;90;180m060|090|180 \u001b[00m\u001b[00;48;2;60;90;210m060|090|210 \u001b[00m\u001b[00;48;2;60;90;240m060|090|240 \u001b[00m\n", "\u001b[00;48;2;60;120;0m060|120|000 \u001b[00m\u001b[00;48;2;60;120;30m060|120|030 \u001b[00m\u001b[00;48;2;60;120;60m060|120|060 \u001b[00m\u001b[00;48;2;60;120;90m060|120|090 \u001b[00m\u001b[00;48;2;60;120;120m060|120|120 \u001b[00m\u001b[00;48;2;60;120;150m060|120|150 \u001b[00m\u001b[00;48;2;60;120;180m060|120|180 \u001b[00m\u001b[00;48;2;60;120;210m060|120|210 \u001b[00m\u001b[00;48;2;60;120;240m060|120|240 \u001b[00m\n", "\u001b[00;48;2;60;150;0m060|150|000 \u001b[00m\u001b[00;48;2;60;150;30m060|150|030 \u001b[00m\u001b[00;48;2;60;150;60m060|150|060 \u001b[00m\u001b[00;48;2;60;150;90m060|150|090 \u001b[00m\u001b[00;48;2;60;150;120m060|150|120 \u001b[00m\u001b[00;48;2;60;150;150m060|150|150 \u001b[00m\u001b[00;48;2;60;150;180m060|150|180 \u001b[00m\u001b[00;48;2;60;150;210m060|150|210 \u001b[00m\u001b[00;48;2;60;150;240m060|150|240 \u001b[00m\n", "\u001b[00;48;2;60;180;0m060|180|000 \u001b[00m\u001b[00;48;2;60;180;30m060|180|030 \u001b[00m\u001b[00;48;2;60;180;60m060|180|060 \u001b[00m\u001b[00;48;2;60;180;90m060|180|090 \u001b[00m\u001b[00;48;2;60;180;120m060|180|120 \u001b[00m\u001b[00;48;2;60;180;150m060|180|150 \u001b[00m\u001b[00;48;2;60;180;180m060|180|180 \u001b[00m\u001b[00;48;2;60;180;210m060|180|210 \u001b[00m\u001b[00;48;2;60;180;240m060|180|240 \u001b[00m\n", "\u001b[00;48;2;60;210;0m060|210|000 \u001b[00m\u001b[00;48;2;60;210;30m060|210|030 \u001b[00m\u001b[00;48;2;60;210;60m060|210|060 \u001b[00m\u001b[00;48;2;60;210;90m060|210|090 \u001b[00m\u001b[00;48;2;60;210;120m060|210|120 \u001b[00m\u001b[00;48;2;60;210;150m060|210|150 \u001b[00m\u001b[00;48;2;60;210;180m060|210|180 \u001b[00m\u001b[00;48;2;60;210;210m060|210|210 \u001b[00m\u001b[00;48;2;60;210;240m060|210|240 \u001b[00m\n", "\u001b[00;48;2;60;240;0m060|240|000 \u001b[00m\u001b[00;48;2;60;240;30m060|240|030 \u001b[00m\u001b[00;48;2;60;240;60m060|240|060 \u001b[00m\u001b[00;48;2;60;240;90m060|240|090 \u001b[00m\u001b[00;48;2;60;240;120m060|240|120 \u001b[00m\u001b[00;48;2;60;240;150m060|240|150 \u001b[00m\u001b[00;48;2;60;240;180m060|240|180 \u001b[00m\u001b[00;48;2;60;240;210m060|240|210 \u001b[00m\u001b[00;48;2;60;240;240m060|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;90;0;0m090|000|000 \u001b[00m\u001b[00;48;2;90;0;30m090|000|030 \u001b[00m\u001b[00;48;2;90;0;60m090|000|060 \u001b[00m\u001b[00;48;2;90;0;90m090|000|090 \u001b[00m\u001b[00;48;2;90;0;120m090|000|120 \u001b[00m\u001b[00;48;2;90;0;150m090|000|150 \u001b[00m\u001b[00;48;2;90;0;180m090|000|180 \u001b[00m\u001b[00;48;2;90;0;210m090|000|210 \u001b[00m\u001b[00;48;2;90;0;240m090|000|240 \u001b[00m\n", "\u001b[00;48;2;90;30;0m090|030|000 \u001b[00m\u001b[00;48;2;90;30;30m090|030|030 \u001b[00m\u001b[00;48;2;90;30;60m090|030|060 \u001b[00m\u001b[00;48;2;90;30;90m090|030|090 \u001b[00m\u001b[00;48;2;90;30;120m090|030|120 \u001b[00m\u001b[00;48;2;90;30;150m090|030|150 \u001b[00m\u001b[00;48;2;90;30;180m090|030|180 \u001b[00m\u001b[00;48;2;90;30;210m090|030|210 \u001b[00m\u001b[00;48;2;90;30;240m090|030|240 \u001b[00m\n", "\u001b[00;48;2;90;60;0m090|060|000 \u001b[00m\u001b[00;48;2;90;60;30m090|060|030 \u001b[00m\u001b[00;48;2;90;60;60m090|060|060 \u001b[00m\u001b[00;48;2;90;60;90m090|060|090 \u001b[00m\u001b[00;48;2;90;60;120m090|060|120 \u001b[00m\u001b[00;48;2;90;60;150m090|060|150 \u001b[00m\u001b[00;48;2;90;60;180m090|060|180 \u001b[00m\u001b[00;48;2;90;60;210m090|060|210 \u001b[00m\u001b[00;48;2;90;60;240m090|060|240 \u001b[00m\n", "\u001b[00;48;2;90;90;0m090|090|000 \u001b[00m\u001b[00;48;2;90;90;30m090|090|030 \u001b[00m\u001b[00;48;2;90;90;60m090|090|060 \u001b[00m\u001b[00;48;2;90;90;90m090|090|090 \u001b[00m\u001b[00;48;2;90;90;120m090|090|120 \u001b[00m\u001b[00;48;2;90;90;150m090|090|150 \u001b[00m\u001b[00;48;2;90;90;180m090|090|180 \u001b[00m\u001b[00;48;2;90;90;210m090|090|210 \u001b[00m\u001b[00;48;2;90;90;240m090|090|240 \u001b[00m\n", "\u001b[00;48;2;90;120;0m090|120|000 \u001b[00m\u001b[00;48;2;90;120;30m090|120|030 \u001b[00m\u001b[00;48;2;90;120;60m090|120|060 \u001b[00m\u001b[00;48;2;90;120;90m090|120|090 \u001b[00m\u001b[00;48;2;90;120;120m090|120|120 \u001b[00m\u001b[00;48;2;90;120;150m090|120|150 \u001b[00m\u001b[00;48;2;90;120;180m090|120|180 \u001b[00m\u001b[00;48;2;90;120;210m090|120|210 \u001b[00m\u001b[00;48;2;90;120;240m090|120|240 \u001b[00m\n", "\u001b[00;48;2;90;150;0m090|150|000 \u001b[00m\u001b[00;48;2;90;150;30m090|150|030 \u001b[00m\u001b[00;48;2;90;150;60m090|150|060 \u001b[00m\u001b[00;48;2;90;150;90m090|150|090 \u001b[00m\u001b[00;48;2;90;150;120m090|150|120 \u001b[00m\u001b[00;48;2;90;150;150m090|150|150 \u001b[00m\u001b[00;48;2;90;150;180m090|150|180 \u001b[00m\u001b[00;48;2;90;150;210m090|150|210 \u001b[00m\u001b[00;48;2;90;150;240m090|150|240 \u001b[00m\n", "\u001b[00;48;2;90;180;0m090|180|000 \u001b[00m\u001b[00;48;2;90;180;30m090|180|030 \u001b[00m\u001b[00;48;2;90;180;60m090|180|060 \u001b[00m\u001b[00;48;2;90;180;90m090|180|090 \u001b[00m\u001b[00;48;2;90;180;120m090|180|120 \u001b[00m\u001b[00;48;2;90;180;150m090|180|150 \u001b[00m\u001b[00;48;2;90;180;180m090|180|180 \u001b[00m\u001b[00;48;2;90;180;210m090|180|210 \u001b[00m\u001b[00;48;2;90;180;240m090|180|240 \u001b[00m\n", "\u001b[00;48;2;90;210;0m090|210|000 \u001b[00m\u001b[00;48;2;90;210;30m090|210|030 \u001b[00m\u001b[00;48;2;90;210;60m090|210|060 \u001b[00m\u001b[00;48;2;90;210;90m090|210|090 \u001b[00m\u001b[00;48;2;90;210;120m090|210|120 \u001b[00m\u001b[00;48;2;90;210;150m090|210|150 \u001b[00m\u001b[00;48;2;90;210;180m090|210|180 \u001b[00m\u001b[00;48;2;90;210;210m090|210|210 \u001b[00m\u001b[00;48;2;90;210;240m090|210|240 \u001b[00m\n", "\u001b[00;48;2;90;240;0m090|240|000 \u001b[00m\u001b[00;48;2;90;240;30m090|240|030 \u001b[00m\u001b[00;48;2;90;240;60m090|240|060 \u001b[00m\u001b[00;48;2;90;240;90m090|240|090 \u001b[00m\u001b[00;48;2;90;240;120m090|240|120 \u001b[00m\u001b[00;48;2;90;240;150m090|240|150 \u001b[00m\u001b[00;48;2;90;240;180m090|240|180 \u001b[00m\u001b[00;48;2;90;240;210m090|240|210 \u001b[00m\u001b[00;48;2;90;240;240m090|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;120;0;0m120|000|000 \u001b[00m\u001b[00;48;2;120;0;30m120|000|030 \u001b[00m\u001b[00;48;2;120;0;60m120|000|060 \u001b[00m\u001b[00;48;2;120;0;90m120|000|090 \u001b[00m\u001b[00;48;2;120;0;120m120|000|120 \u001b[00m\u001b[00;48;2;120;0;150m120|000|150 \u001b[00m\u001b[00;48;2;120;0;180m120|000|180 \u001b[00m\u001b[00;48;2;120;0;210m120|000|210 \u001b[00m\u001b[00;48;2;120;0;240m120|000|240 \u001b[00m\n", "\u001b[00;48;2;120;30;0m120|030|000 \u001b[00m\u001b[00;48;2;120;30;30m120|030|030 \u001b[00m\u001b[00;48;2;120;30;60m120|030|060 \u001b[00m\u001b[00;48;2;120;30;90m120|030|090 \u001b[00m\u001b[00;48;2;120;30;120m120|030|120 \u001b[00m\u001b[00;48;2;120;30;150m120|030|150 \u001b[00m\u001b[00;48;2;120;30;180m120|030|180 \u001b[00m\u001b[00;48;2;120;30;210m120|030|210 \u001b[00m\u001b[00;48;2;120;30;240m120|030|240 \u001b[00m\n", "\u001b[00;48;2;120;60;0m120|060|000 \u001b[00m\u001b[00;48;2;120;60;30m120|060|030 \u001b[00m\u001b[00;48;2;120;60;60m120|060|060 \u001b[00m\u001b[00;48;2;120;60;90m120|060|090 \u001b[00m\u001b[00;48;2;120;60;120m120|060|120 \u001b[00m\u001b[00;48;2;120;60;150m120|060|150 \u001b[00m\u001b[00;48;2;120;60;180m120|060|180 \u001b[00m\u001b[00;48;2;120;60;210m120|060|210 \u001b[00m\u001b[00;48;2;120;60;240m120|060|240 \u001b[00m\n", "\u001b[00;48;2;120;90;0m120|090|000 \u001b[00m\u001b[00;48;2;120;90;30m120|090|030 \u001b[00m\u001b[00;48;2;120;90;60m120|090|060 \u001b[00m\u001b[00;48;2;120;90;90m120|090|090 \u001b[00m\u001b[00;48;2;120;90;120m120|090|120 \u001b[00m\u001b[00;48;2;120;90;150m120|090|150 \u001b[00m\u001b[00;48;2;120;90;180m120|090|180 \u001b[00m\u001b[00;48;2;120;90;210m120|090|210 \u001b[00m\u001b[00;48;2;120;90;240m120|090|240 \u001b[00m\n", "\u001b[00;48;2;120;120;0m120|120|000 \u001b[00m\u001b[00;48;2;120;120;30m120|120|030 \u001b[00m\u001b[00;48;2;120;120;60m120|120|060 \u001b[00m\u001b[00;48;2;120;120;90m120|120|090 \u001b[00m\u001b[00;48;2;120;120;120m120|120|120 \u001b[00m\u001b[00;48;2;120;120;150m120|120|150 \u001b[00m\u001b[00;48;2;120;120;180m120|120|180 \u001b[00m\u001b[00;48;2;120;120;210m120|120|210 \u001b[00m\u001b[00;48;2;120;120;240m120|120|240 \u001b[00m\n", "\u001b[00;48;2;120;150;0m120|150|000 \u001b[00m\u001b[00;48;2;120;150;30m120|150|030 \u001b[00m\u001b[00;48;2;120;150;60m120|150|060 \u001b[00m\u001b[00;48;2;120;150;90m120|150|090 \u001b[00m\u001b[00;48;2;120;150;120m120|150|120 \u001b[00m\u001b[00;48;2;120;150;150m120|150|150 \u001b[00m\u001b[00;48;2;120;150;180m120|150|180 \u001b[00m\u001b[00;48;2;120;150;210m120|150|210 \u001b[00m\u001b[00;48;2;120;150;240m120|150|240 \u001b[00m\n", "\u001b[00;48;2;120;180;0m120|180|000 \u001b[00m\u001b[00;48;2;120;180;30m120|180|030 \u001b[00m\u001b[00;48;2;120;180;60m120|180|060 \u001b[00m\u001b[00;48;2;120;180;90m120|180|090 \u001b[00m\u001b[00;48;2;120;180;120m120|180|120 \u001b[00m\u001b[00;48;2;120;180;150m120|180|150 \u001b[00m\u001b[00;48;2;120;180;180m120|180|180 \u001b[00m\u001b[00;48;2;120;180;210m120|180|210 \u001b[00m\u001b[00;48;2;120;180;240m120|180|240 \u001b[00m\n", "\u001b[00;48;2;120;210;0m120|210|000 \u001b[00m\u001b[00;48;2;120;210;30m120|210|030 \u001b[00m\u001b[00;48;2;120;210;60m120|210|060 \u001b[00m\u001b[00;48;2;120;210;90m120|210|090 \u001b[00m\u001b[00;48;2;120;210;120m120|210|120 \u001b[00m\u001b[00;48;2;120;210;150m120|210|150 \u001b[00m\u001b[00;48;2;120;210;180m120|210|180 \u001b[00m\u001b[00;48;2;120;210;210m120|210|210 \u001b[00m\u001b[00;48;2;120;210;240m120|210|240 \u001b[00m\n", "\u001b[00;48;2;120;240;0m120|240|000 \u001b[00m\u001b[00;48;2;120;240;30m120|240|030 \u001b[00m\u001b[00;48;2;120;240;60m120|240|060 \u001b[00m\u001b[00;48;2;120;240;90m120|240|090 \u001b[00m\u001b[00;48;2;120;240;120m120|240|120 \u001b[00m\u001b[00;48;2;120;240;150m120|240|150 \u001b[00m\u001b[00;48;2;120;240;180m120|240|180 \u001b[00m\u001b[00;48;2;120;240;210m120|240|210 \u001b[00m\u001b[00;48;2;120;240;240m120|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;150;0;0m150|000|000 \u001b[00m\u001b[00;48;2;150;0;30m150|000|030 \u001b[00m\u001b[00;48;2;150;0;60m150|000|060 \u001b[00m\u001b[00;48;2;150;0;90m150|000|090 \u001b[00m\u001b[00;48;2;150;0;120m150|000|120 \u001b[00m\u001b[00;48;2;150;0;150m150|000|150 \u001b[00m\u001b[00;48;2;150;0;180m150|000|180 \u001b[00m\u001b[00;48;2;150;0;210m150|000|210 \u001b[00m\u001b[00;48;2;150;0;240m150|000|240 \u001b[00m\n", "\u001b[00;48;2;150;30;0m150|030|000 \u001b[00m\u001b[00;48;2;150;30;30m150|030|030 \u001b[00m\u001b[00;48;2;150;30;60m150|030|060 \u001b[00m\u001b[00;48;2;150;30;90m150|030|090 \u001b[00m\u001b[00;48;2;150;30;120m150|030|120 \u001b[00m\u001b[00;48;2;150;30;150m150|030|150 \u001b[00m\u001b[00;48;2;150;30;180m150|030|180 \u001b[00m\u001b[00;48;2;150;30;210m150|030|210 \u001b[00m\u001b[00;48;2;150;30;240m150|030|240 \u001b[00m\n", "\u001b[00;48;2;150;60;0m150|060|000 \u001b[00m\u001b[00;48;2;150;60;30m150|060|030 \u001b[00m\u001b[00;48;2;150;60;60m150|060|060 \u001b[00m\u001b[00;48;2;150;60;90m150|060|090 \u001b[00m\u001b[00;48;2;150;60;120m150|060|120 \u001b[00m\u001b[00;48;2;150;60;150m150|060|150 \u001b[00m\u001b[00;48;2;150;60;180m150|060|180 \u001b[00m\u001b[00;48;2;150;60;210m150|060|210 \u001b[00m\u001b[00;48;2;150;60;240m150|060|240 \u001b[00m\n", "\u001b[00;48;2;150;90;0m150|090|000 \u001b[00m\u001b[00;48;2;150;90;30m150|090|030 \u001b[00m\u001b[00;48;2;150;90;60m150|090|060 \u001b[00m\u001b[00;48;2;150;90;90m150|090|090 \u001b[00m\u001b[00;48;2;150;90;120m150|090|120 \u001b[00m\u001b[00;48;2;150;90;150m150|090|150 \u001b[00m\u001b[00;48;2;150;90;180m150|090|180 \u001b[00m\u001b[00;48;2;150;90;210m150|090|210 \u001b[00m\u001b[00;48;2;150;90;240m150|090|240 \u001b[00m\n", "\u001b[00;48;2;150;120;0m150|120|000 \u001b[00m\u001b[00;48;2;150;120;30m150|120|030 \u001b[00m\u001b[00;48;2;150;120;60m150|120|060 \u001b[00m\u001b[00;48;2;150;120;90m150|120|090 \u001b[00m\u001b[00;48;2;150;120;120m150|120|120 \u001b[00m\u001b[00;48;2;150;120;150m150|120|150 \u001b[00m\u001b[00;48;2;150;120;180m150|120|180 \u001b[00m\u001b[00;48;2;150;120;210m150|120|210 \u001b[00m\u001b[00;48;2;150;120;240m150|120|240 \u001b[00m\n", "\u001b[00;48;2;150;150;0m150|150|000 \u001b[00m\u001b[00;48;2;150;150;30m150|150|030 \u001b[00m\u001b[00;48;2;150;150;60m150|150|060 \u001b[00m\u001b[00;48;2;150;150;90m150|150|090 \u001b[00m\u001b[00;48;2;150;150;120m150|150|120 \u001b[00m\u001b[00;48;2;150;150;150m150|150|150 \u001b[00m\u001b[00;48;2;150;150;180m150|150|180 \u001b[00m\u001b[00;48;2;150;150;210m150|150|210 \u001b[00m\u001b[00;48;2;150;150;240m150|150|240 \u001b[00m\n", "\u001b[00;48;2;150;180;0m150|180|000 \u001b[00m\u001b[00;48;2;150;180;30m150|180|030 \u001b[00m\u001b[00;48;2;150;180;60m150|180|060 \u001b[00m\u001b[00;48;2;150;180;90m150|180|090 \u001b[00m\u001b[00;48;2;150;180;120m150|180|120 \u001b[00m\u001b[00;48;2;150;180;150m150|180|150 \u001b[00m\u001b[00;48;2;150;180;180m150|180|180 \u001b[00m\u001b[00;48;2;150;180;210m150|180|210 \u001b[00m\u001b[00;48;2;150;180;240m150|180|240 \u001b[00m\n", "\u001b[00;48;2;150;210;0m150|210|000 \u001b[00m\u001b[00;48;2;150;210;30m150|210|030 \u001b[00m\u001b[00;48;2;150;210;60m150|210|060 \u001b[00m\u001b[00;48;2;150;210;90m150|210|090 \u001b[00m\u001b[00;48;2;150;210;120m150|210|120 \u001b[00m\u001b[00;48;2;150;210;150m150|210|150 \u001b[00m\u001b[00;48;2;150;210;180m150|210|180 \u001b[00m\u001b[00;48;2;150;210;210m150|210|210 \u001b[00m\u001b[00;48;2;150;210;240m150|210|240 \u001b[00m\n", "\u001b[00;48;2;150;240;0m150|240|000 \u001b[00m\u001b[00;48;2;150;240;30m150|240|030 \u001b[00m\u001b[00;48;2;150;240;60m150|240|060 \u001b[00m\u001b[00;48;2;150;240;90m150|240|090 \u001b[00m\u001b[00;48;2;150;240;120m150|240|120 \u001b[00m\u001b[00;48;2;150;240;150m150|240|150 \u001b[00m\u001b[00;48;2;150;240;180m150|240|180 \u001b[00m\u001b[00;48;2;150;240;210m150|240|210 \u001b[00m\u001b[00;48;2;150;240;240m150|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;180;0;0m180|000|000 \u001b[00m\u001b[00;48;2;180;0;30m180|000|030 \u001b[00m\u001b[00;48;2;180;0;60m180|000|060 \u001b[00m\u001b[00;48;2;180;0;90m180|000|090 \u001b[00m\u001b[00;48;2;180;0;120m180|000|120 \u001b[00m\u001b[00;48;2;180;0;150m180|000|150 \u001b[00m\u001b[00;48;2;180;0;180m180|000|180 \u001b[00m\u001b[00;48;2;180;0;210m180|000|210 \u001b[00m\u001b[00;48;2;180;0;240m180|000|240 \u001b[00m\n", "\u001b[00;48;2;180;30;0m180|030|000 \u001b[00m\u001b[00;48;2;180;30;30m180|030|030 \u001b[00m\u001b[00;48;2;180;30;60m180|030|060 \u001b[00m\u001b[00;48;2;180;30;90m180|030|090 \u001b[00m\u001b[00;48;2;180;30;120m180|030|120 \u001b[00m\u001b[00;48;2;180;30;150m180|030|150 \u001b[00m\u001b[00;48;2;180;30;180m180|030|180 \u001b[00m\u001b[00;48;2;180;30;210m180|030|210 \u001b[00m\u001b[00;48;2;180;30;240m180|030|240 \u001b[00m\n", "\u001b[00;48;2;180;60;0m180|060|000 \u001b[00m\u001b[00;48;2;180;60;30m180|060|030 \u001b[00m\u001b[00;48;2;180;60;60m180|060|060 \u001b[00m\u001b[00;48;2;180;60;90m180|060|090 \u001b[00m\u001b[00;48;2;180;60;120m180|060|120 \u001b[00m\u001b[00;48;2;180;60;150m180|060|150 \u001b[00m\u001b[00;48;2;180;60;180m180|060|180 \u001b[00m\u001b[00;48;2;180;60;210m180|060|210 \u001b[00m\u001b[00;48;2;180;60;240m180|060|240 \u001b[00m\n", "\u001b[00;48;2;180;90;0m180|090|000 \u001b[00m\u001b[00;48;2;180;90;30m180|090|030 \u001b[00m\u001b[00;48;2;180;90;60m180|090|060 \u001b[00m\u001b[00;48;2;180;90;90m180|090|090 \u001b[00m\u001b[00;48;2;180;90;120m180|090|120 \u001b[00m\u001b[00;48;2;180;90;150m180|090|150 \u001b[00m\u001b[00;48;2;180;90;180m180|090|180 \u001b[00m\u001b[00;48;2;180;90;210m180|090|210 \u001b[00m\u001b[00;48;2;180;90;240m180|090|240 \u001b[00m\n", "\u001b[00;48;2;180;120;0m180|120|000 \u001b[00m\u001b[00;48;2;180;120;30m180|120|030 \u001b[00m\u001b[00;48;2;180;120;60m180|120|060 \u001b[00m\u001b[00;48;2;180;120;90m180|120|090 \u001b[00m\u001b[00;48;2;180;120;120m180|120|120 \u001b[00m\u001b[00;48;2;180;120;150m180|120|150 \u001b[00m\u001b[00;48;2;180;120;180m180|120|180 \u001b[00m\u001b[00;48;2;180;120;210m180|120|210 \u001b[00m\u001b[00;48;2;180;120;240m180|120|240 \u001b[00m\n", "\u001b[00;48;2;180;150;0m180|150|000 \u001b[00m\u001b[00;48;2;180;150;30m180|150|030 \u001b[00m\u001b[00;48;2;180;150;60m180|150|060 \u001b[00m\u001b[00;48;2;180;150;90m180|150|090 \u001b[00m\u001b[00;48;2;180;150;120m180|150|120 \u001b[00m\u001b[00;48;2;180;150;150m180|150|150 \u001b[00m\u001b[00;48;2;180;150;180m180|150|180 \u001b[00m\u001b[00;48;2;180;150;210m180|150|210 \u001b[00m\u001b[00;48;2;180;150;240m180|150|240 \u001b[00m\n", "\u001b[00;48;2;180;180;0m180|180|000 \u001b[00m\u001b[00;48;2;180;180;30m180|180|030 \u001b[00m\u001b[00;48;2;180;180;60m180|180|060 \u001b[00m\u001b[00;48;2;180;180;90m180|180|090 \u001b[00m\u001b[00;48;2;180;180;120m180|180|120 \u001b[00m\u001b[00;48;2;180;180;150m180|180|150 \u001b[00m\u001b[00;48;2;180;180;180m180|180|180 \u001b[00m\u001b[00;48;2;180;180;210m180|180|210 \u001b[00m\u001b[00;48;2;180;180;240m180|180|240 \u001b[00m\n", "\u001b[00;48;2;180;210;0m180|210|000 \u001b[00m\u001b[00;48;2;180;210;30m180|210|030 \u001b[00m\u001b[00;48;2;180;210;60m180|210|060 \u001b[00m\u001b[00;48;2;180;210;90m180|210|090 \u001b[00m\u001b[00;48;2;180;210;120m180|210|120 \u001b[00m\u001b[00;48;2;180;210;150m180|210|150 \u001b[00m\u001b[00;48;2;180;210;180m180|210|180 \u001b[00m\u001b[00;48;2;180;210;210m180|210|210 \u001b[00m\u001b[00;48;2;180;210;240m180|210|240 \u001b[00m\n", "\u001b[00;48;2;180;240;0m180|240|000 \u001b[00m\u001b[00;48;2;180;240;30m180|240|030 \u001b[00m\u001b[00;48;2;180;240;60m180|240|060 \u001b[00m\u001b[00;48;2;180;240;90m180|240|090 \u001b[00m\u001b[00;48;2;180;240;120m180|240|120 \u001b[00m\u001b[00;48;2;180;240;150m180|240|150 \u001b[00m\u001b[00;48;2;180;240;180m180|240|180 \u001b[00m\u001b[00;48;2;180;240;210m180|240|210 \u001b[00m\u001b[00;48;2;180;240;240m180|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;210;0;0m210|000|000 \u001b[00m\u001b[00;48;2;210;0;30m210|000|030 \u001b[00m\u001b[00;48;2;210;0;60m210|000|060 \u001b[00m\u001b[00;48;2;210;0;90m210|000|090 \u001b[00m\u001b[00;48;2;210;0;120m210|000|120 \u001b[00m\u001b[00;48;2;210;0;150m210|000|150 \u001b[00m\u001b[00;48;2;210;0;180m210|000|180 \u001b[00m\u001b[00;48;2;210;0;210m210|000|210 \u001b[00m\u001b[00;48;2;210;0;240m210|000|240 \u001b[00m\n", "\u001b[00;48;2;210;30;0m210|030|000 \u001b[00m\u001b[00;48;2;210;30;30m210|030|030 \u001b[00m\u001b[00;48;2;210;30;60m210|030|060 \u001b[00m\u001b[00;48;2;210;30;90m210|030|090 \u001b[00m\u001b[00;48;2;210;30;120m210|030|120 \u001b[00m\u001b[00;48;2;210;30;150m210|030|150 \u001b[00m\u001b[00;48;2;210;30;180m210|030|180 \u001b[00m\u001b[00;48;2;210;30;210m210|030|210 \u001b[00m\u001b[00;48;2;210;30;240m210|030|240 \u001b[00m\n", "\u001b[00;48;2;210;60;0m210|060|000 \u001b[00m\u001b[00;48;2;210;60;30m210|060|030 \u001b[00m\u001b[00;48;2;210;60;60m210|060|060 \u001b[00m\u001b[00;48;2;210;60;90m210|060|090 \u001b[00m\u001b[00;48;2;210;60;120m210|060|120 \u001b[00m\u001b[00;48;2;210;60;150m210|060|150 \u001b[00m\u001b[00;48;2;210;60;180m210|060|180 \u001b[00m\u001b[00;48;2;210;60;210m210|060|210 \u001b[00m\u001b[00;48;2;210;60;240m210|060|240 \u001b[00m\n", "\u001b[00;48;2;210;90;0m210|090|000 \u001b[00m\u001b[00;48;2;210;90;30m210|090|030 \u001b[00m\u001b[00;48;2;210;90;60m210|090|060 \u001b[00m\u001b[00;48;2;210;90;90m210|090|090 \u001b[00m\u001b[00;48;2;210;90;120m210|090|120 \u001b[00m\u001b[00;48;2;210;90;150m210|090|150 \u001b[00m\u001b[00;48;2;210;90;180m210|090|180 \u001b[00m\u001b[00;48;2;210;90;210m210|090|210 \u001b[00m\u001b[00;48;2;210;90;240m210|090|240 \u001b[00m\n", "\u001b[00;48;2;210;120;0m210|120|000 \u001b[00m\u001b[00;48;2;210;120;30m210|120|030 \u001b[00m\u001b[00;48;2;210;120;60m210|120|060 \u001b[00m\u001b[00;48;2;210;120;90m210|120|090 \u001b[00m\u001b[00;48;2;210;120;120m210|120|120 \u001b[00m\u001b[00;48;2;210;120;150m210|120|150 \u001b[00m\u001b[00;48;2;210;120;180m210|120|180 \u001b[00m\u001b[00;48;2;210;120;210m210|120|210 \u001b[00m\u001b[00;48;2;210;120;240m210|120|240 \u001b[00m\n", "\u001b[00;48;2;210;150;0m210|150|000 \u001b[00m\u001b[00;48;2;210;150;30m210|150|030 \u001b[00m\u001b[00;48;2;210;150;60m210|150|060 \u001b[00m\u001b[00;48;2;210;150;90m210|150|090 \u001b[00m\u001b[00;48;2;210;150;120m210|150|120 \u001b[00m\u001b[00;48;2;210;150;150m210|150|150 \u001b[00m\u001b[00;48;2;210;150;180m210|150|180 \u001b[00m\u001b[00;48;2;210;150;210m210|150|210 \u001b[00m\u001b[00;48;2;210;150;240m210|150|240 \u001b[00m\n", "\u001b[00;48;2;210;180;0m210|180|000 \u001b[00m\u001b[00;48;2;210;180;30m210|180|030 \u001b[00m\u001b[00;48;2;210;180;60m210|180|060 \u001b[00m\u001b[00;48;2;210;180;90m210|180|090 \u001b[00m\u001b[00;48;2;210;180;120m210|180|120 \u001b[00m\u001b[00;48;2;210;180;150m210|180|150 \u001b[00m\u001b[00;48;2;210;180;180m210|180|180 \u001b[00m\u001b[00;48;2;210;180;210m210|180|210 \u001b[00m\u001b[00;48;2;210;180;240m210|180|240 \u001b[00m\n", "\u001b[00;48;2;210;210;0m210|210|000 \u001b[00m\u001b[00;48;2;210;210;30m210|210|030 \u001b[00m\u001b[00;48;2;210;210;60m210|210|060 \u001b[00m\u001b[00;48;2;210;210;90m210|210|090 \u001b[00m\u001b[00;48;2;210;210;120m210|210|120 \u001b[00m\u001b[00;48;2;210;210;150m210|210|150 \u001b[00m\u001b[00;48;2;210;210;180m210|210|180 \u001b[00m\u001b[00;48;2;210;210;210m210|210|210 \u001b[00m\u001b[00;48;2;210;210;240m210|210|240 \u001b[00m\n", "\u001b[00;48;2;210;240;0m210|240|000 \u001b[00m\u001b[00;48;2;210;240;30m210|240|030 \u001b[00m\u001b[00;48;2;210;240;60m210|240|060 \u001b[00m\u001b[00;48;2;210;240;90m210|240|090 \u001b[00m\u001b[00;48;2;210;240;120m210|240|120 \u001b[00m\u001b[00;48;2;210;240;150m210|240|150 \u001b[00m\u001b[00;48;2;210;240;180m210|240|180 \u001b[00m\u001b[00;48;2;210;240;210m210|240|210 \u001b[00m\u001b[00;48;2;210;240;240m210|240|240 \u001b[00m\n", "\n", "\u001b[00;48;2;240;0;0m240|000|000 \u001b[00m\u001b[00;48;2;240;0;30m240|000|030 \u001b[00m\u001b[00;48;2;240;0;60m240|000|060 \u001b[00m\u001b[00;48;2;240;0;90m240|000|090 \u001b[00m\u001b[00;48;2;240;0;120m240|000|120 \u001b[00m\u001b[00;48;2;240;0;150m240|000|150 \u001b[00m\u001b[00;48;2;240;0;180m240|000|180 \u001b[00m\u001b[00;48;2;240;0;210m240|000|210 \u001b[00m\u001b[00;48;2;240;0;240m240|000|240 \u001b[00m\n", "\u001b[00;48;2;240;30;0m240|030|000 \u001b[00m\u001b[00;48;2;240;30;30m240|030|030 \u001b[00m\u001b[00;48;2;240;30;60m240|030|060 \u001b[00m\u001b[00;48;2;240;30;90m240|030|090 \u001b[00m\u001b[00;48;2;240;30;120m240|030|120 \u001b[00m\u001b[00;48;2;240;30;150m240|030|150 \u001b[00m\u001b[00;48;2;240;30;180m240|030|180 \u001b[00m\u001b[00;48;2;240;30;210m240|030|210 \u001b[00m\u001b[00;48;2;240;30;240m240|030|240 \u001b[00m\n", "\u001b[00;48;2;240;60;0m240|060|000 \u001b[00m\u001b[00;48;2;240;60;30m240|060|030 \u001b[00m\u001b[00;48;2;240;60;60m240|060|060 \u001b[00m\u001b[00;48;2;240;60;90m240|060|090 \u001b[00m\u001b[00;48;2;240;60;120m240|060|120 \u001b[00m\u001b[00;48;2;240;60;150m240|060|150 \u001b[00m\u001b[00;48;2;240;60;180m240|060|180 \u001b[00m\u001b[00;48;2;240;60;210m240|060|210 \u001b[00m\u001b[00;48;2;240;60;240m240|060|240 \u001b[00m\n", "\u001b[00;48;2;240;90;0m240|090|000 \u001b[00m\u001b[00;48;2;240;90;30m240|090|030 \u001b[00m\u001b[00;48;2;240;90;60m240|090|060 \u001b[00m\u001b[00;48;2;240;90;90m240|090|090 \u001b[00m\u001b[00;48;2;240;90;120m240|090|120 \u001b[00m\u001b[00;48;2;240;90;150m240|090|150 \u001b[00m\u001b[00;48;2;240;90;180m240|090|180 \u001b[00m\u001b[00;48;2;240;90;210m240|090|210 \u001b[00m\u001b[00;48;2;240;90;240m240|090|240 \u001b[00m\n", "\u001b[00;48;2;240;120;0m240|120|000 \u001b[00m\u001b[00;48;2;240;120;30m240|120|030 \u001b[00m\u001b[00;48;2;240;120;60m240|120|060 \u001b[00m\u001b[00;48;2;240;120;90m240|120|090 \u001b[00m\u001b[00;48;2;240;120;120m240|120|120 \u001b[00m\u001b[00;48;2;240;120;150m240|120|150 \u001b[00m\u001b[00;48;2;240;120;180m240|120|180 \u001b[00m\u001b[00;48;2;240;120;210m240|120|210 \u001b[00m\u001b[00;48;2;240;120;240m240|120|240 \u001b[00m\n", "\u001b[00;48;2;240;150;0m240|150|000 \u001b[00m\u001b[00;48;2;240;150;30m240|150|030 \u001b[00m\u001b[00;48;2;240;150;60m240|150|060 \u001b[00m\u001b[00;48;2;240;150;90m240|150|090 \u001b[00m\u001b[00;48;2;240;150;120m240|150|120 \u001b[00m\u001b[00;48;2;240;150;150m240|150|150 \u001b[00m\u001b[00;48;2;240;150;180m240|150|180 \u001b[00m\u001b[00;48;2;240;150;210m240|150|210 \u001b[00m\u001b[00;48;2;240;150;240m240|150|240 \u001b[00m\n", "\u001b[00;48;2;240;180;0m240|180|000 \u001b[00m\u001b[00;48;2;240;180;30m240|180|030 \u001b[00m\u001b[00;48;2;240;180;60m240|180|060 \u001b[00m\u001b[00;48;2;240;180;90m240|180|090 \u001b[00m\u001b[00;48;2;240;180;120m240|180|120 \u001b[00m\u001b[00;48;2;240;180;150m240|180|150 \u001b[00m\u001b[00;48;2;240;180;180m240|180|180 \u001b[00m\u001b[00;48;2;240;180;210m240|180|210 \u001b[00m\u001b[00;48;2;240;180;240m240|180|240 \u001b[00m\n", "\u001b[00;48;2;240;210;0m240|210|000 \u001b[00m\u001b[00;48;2;240;210;30m240|210|030 \u001b[00m\u001b[00;48;2;240;210;60m240|210|060 \u001b[00m\u001b[00;48;2;240;210;90m240|210|090 \u001b[00m\u001b[00;48;2;240;210;120m240|210|120 \u001b[00m\u001b[00;48;2;240;210;150m240|210|150 \u001b[00m\u001b[00;48;2;240;210;180m240|210|180 \u001b[00m\u001b[00;48;2;240;210;210m240|210|210 \u001b[00m\u001b[00;48;2;240;210;240m240|210|240 \u001b[00m\n", "\u001b[00;48;2;240;240;0m240|240|000 \u001b[00m\u001b[00;48;2;240;240;30m240|240|030 \u001b[00m\u001b[00;48;2;240;240;60m240|240|060 \u001b[00m\u001b[00;48;2;240;240;90m240|240|090 \u001b[00m\u001b[00;48;2;240;240;120m240|240|120 \u001b[00m\u001b[00;48;2;240;240;150m240|240|150 \u001b[00m\u001b[00;48;2;240;240;180m240|240|180 \u001b[00m\u001b[00;48;2;240;240;210m240|240|210 \u001b[00m\u001b[00;48;2;240;240;240m240|240|240 \u001b[00m\n", "\n" ] } ], "source": [ "steps = range(0,256,30)\n", "\n", "t = \"{ESC}00;48;2;{r};{g};{b}m{r:03}|{g:03}|{b:03} {RESET}\"\n", "for r in steps:\n", " for g in steps:\n", " for b in steps:\n", " print (t.format(**locals()), end='')\n", " print()\n", " print()\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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/tools/tests/CSS Reference.ipynb000066400000000000000000025215731477474304100212070ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

CSS Playground

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A notebook that contain most of the things that could be displayed, to test CSS, feel free to add things to it, and send modification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Title first level" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Title second Level" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Title third level" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### h4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### h5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### h6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# h1\n", "## h2\n", "### h3\n", "#### h4\n", "##### h6\n", "\n", "This is just a sample paragraph\n", "\n", "> With a blockquote\n", "\n", " def some_code():\n", " return 'by indenting'\n", "\n", "```\n", "def some_other_code():\n", " return 'between_backticks'\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can look at different level of nested unordered list \n", "\n", "- level 1\n", " - level 2\n", " - level 2\n", " - level 2\n", " - level 3\n", " - level 3\n", " - level 4\n", " - level 5\n", " - level 6\n", " - level 2\n", "\n", "- level 1\n", "- level 1\n", "- level 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ordered list \n", "\n", "1. level 1\n", " 2. level 1\n", " 3. level 1\n", " 4. level 1\n", " 1. level 1\n", " 2. level 1\n", " 2. level 1\n", " 3. level 1\n", " 4. level 1\n", " 1. level 1\n", " 2. level 1\n", "3. level 1\n", "4. level 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "some Horizontal line\n", "\n", "***\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## copy past from Daring Fireball" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "link : \n", "This is [an example](http://example.com/ \"Title\") inline link.\n", "\n", "[This link](http://example.net/) has no title attribute." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "inline Html\n", "This is a regular paragraph.\n", "\n", "\n", " \n", " \n", " \n", "
Foo
\n", "\n", "This is another regular paragraph." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n", "> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n", "> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n", "> \n", "> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n", "> id sem consectetuer libero luctus adipiscing.\n", "\n", "---\n", "\n", "> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n", "consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n", "Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n", "\n", "> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n", "id sem consectetuer libero luctus adipiscing." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> This is the first level of quoting.\n", ">\n", "> > This is nested blockquote.\n", ">\n", "> Back to the first level." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> ## This is a header.\n", "> \n", "> 1. This is the first list item.\n", "> 2. This is the second list item.\n", "> \n", "> Here's some example code:\n", "> \n", "> return shell_exec(\"echo $input | $markdown_script\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. This is a list item with two paragraphs. Lorem ipsum dolor\n", " sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n", " mi posuere lectus.\n", "\n", " Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n", " vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n", " sit amet velit.\n", "\n", "2. Suspendisse id sem consectetuer libero luctus adipiscing." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* This is a list item with two paragraphs.\n", "\n", " This is the second paragraph in the list item. You're\n", "only required to indent the first line. Lorem ipsum dolor\n", "sit amet, consectetuer adipiscing elit.\n", "\n", "* Another item in the same list." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* A list item with a blockquote:\n", "\n", " > This is a blockquote\n", " > inside a list item." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* A list item with a code block:\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1986. What a great season.\n", "\n", "1986\\. What a great season." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "See my [About](/about/) page for details. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ref link\n", "This is [an example][id] reference-style link.\n", "\n", "[id]: http://example.com/ \"Optional Title Here\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*single asterisks*\n", "\n", "_single underscores_\n", "\n", "**double asterisks**\n", "\n", "__double underscores__\n", "\n", "un*frigging*believable // should render partially as bold\n", "\n", "\\*this text is surrounded by literal asterisks\\*\n", "\n", "``There is a literal backtick (`) here.``" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Other Notebook element" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A small tooltip\n", "\n", "
And some text inside
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "
\n", " \n", "
\n", "
\n", "
This one should be big
\n", "
" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAABDEAAAJXCAYAAACKd8/wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", "AAALEgAACxIB0t1+/AAAIABJREFUeJzsvXm0ZUV1Bv5VnemO773ufj23gB0QBAFbUBORiEaFxgmX\n", "MvgDASE/ZZmAicbg0iCYYFDR5S+QmCUosQFBooBGHICYgKDBGRUkoARkapqe3njvmarq90fVrqpz\n", "3+vu180TGjjfWrfv6zuec+45u/b+9rf3ZkophRo1atSoUaNGjRo1atSoUaNGjd0c/OnegBo1atSo\n", "UaNGjRo1atSoUaNGjbmgJjFq1KhRo0aNGjVq1KhRo0aNGs8I1CRGjRo1atSoUaNGjRo1atSoUeMZ\n", "gZrEqFGjRo0aNWrUqFGjRo0aNWo8I1CTGDVq1KhRo0aNGjVq1KhRo0aNZwRqEqNGjRo1atSoUaNG\n", "jRo1atSo8YzAM5LEOPXUU3HOOef8Qb/jiCOOwBe/+MV5/9wHH3wQnHNIKef0+ltuuQXPe97z5n07\n", "atSo8eRR26IaNWrsDqhtUY0aNXYH1LaoxlOFZySJwRgDY2yn3lMUBd7+9rfj+c9/PjjnuPXWW+f9\n", "O55JuOqqq7Dnnnui0+ngrW99K7Zu3brN17761a/GkiVLMDQ0hBe+8IW49NJLK89//OMfx5577onh\n", "4WG84x3vwOTkpH3ub/7mb/CCF7zAvveKK66ovFcIgb/7u7/DypUrMTQ0hJe85CUYHx8HAGRZhr/+\n", "67/GypUrsXDhQvzFX/wFyrK0773nnnvwmte8BiMjI9hnn33w9a9/fT4OTY0ac0Zti5485mqLHnro\n", "IXS73cqNc47Pfvaz9jWXXHIJ9t57bwwPD+OlL30pfvCDH9jnTj31VCRJYt87NDQEpRQAYPPmzTjs\n", "sMMwOjqK4eFhrFmzpmJPdmSLHnnkEbzpTW/CokWLsHz5cpx55pkQQsz3oapRY5uobdGTw+OPP443\n", "v/nNWLlyJTjneOihh7b7+nPOOQcHHnggoijCxz72scpz//iP/1ixU61WC0EQYMuWLQCAiYkJnHTS\n", "SVi8eDEWL16Mk046qeI33XnnnTjkkEPQbrdx6KGH4pe//KV9bke2qNPpVL47DEOcddZZ83GIatSY\n", "E2pb9OSws7Zor732QqvVstf8UUcdZZ/bkS3KsgynnXYahoeHsXz58oo/ddttt83qc11//fX2vduz\n", "RQDwla98BS984QvR6XSw99574/bbb5+vwwTgGUpiALDO587gT//0T3HllVdi2bJlz9qTfy64++67\n", "ccYZZ+DLX/4yNmzYgFarhfe+973bfP1FF12ERx99FBMTE1i3bh3OPPNM3HvvvQCAdevW4corr8QP\n", "f/hDPPbYY+j3+zjzzDPtezudDm644Qb73ve97334n//5H/v8ueeeizvuuAN33HEHJiYmcOWVV6LR\n", "aAAAPvGJT+DnP/857r77btx33334+c9/jvPPPx8AUJYl3vKWt+DNb34ztm7diksuuQQnnXQSfvvb\n", "3/4hDlmNGttEbYt2HTtji/bYYw9MTk7a269//WtwzvG2t70NgHb8P/CBD+CrX/0qxsfHcfrpp+Ot\n", "b32r/X0YYzj77LPt+ycmJuyx73Q6uOyyy/DEE09gfHwc5513Ho477jhMTU0B2L4tAoCzzjoLo6Oj\n", "WL9+Pe68807ceuut+NznPveHPHQ1asxAbYt2HZxzHH300bj22mvn9Pp99tkHF154Id7whjfMOG4f\n", "/vCHK7bq7LPPxqtf/WosXLgQAHDeeedh06ZNeOCBB3D//fdjw4YNOO+88wAAeZ7jLW95C04++WSM\n", "jY3hlFNOwVve8hYbHOzIFk1NTdnvffzxx9FsNnHcccfNwxGqUWPuqG3RrmNnbRFjDDfccIO97r/7\n", "3e/a5+Zii+6//3489NBD+O///m986lOfwo033ggAOPzwwyvvveGGG9DpdCxJsiNbdPPNN+NDH/oQ\n", "1q1bh6mpKdx2221YvXr1fB0mAM8QEuMXv/gFXvKSl2BoaAgnnHAC0jTd6c+IoghnnXUWDjvsMARB\n", "sFPvvf/++/Ga17wGo6OjljUntQCgWbBPf/rTOOigg9DtdnH66adjw4YNWLt2LYaHh/G6170OY2Nj\n", "lc/84he/iJUrV2LFihX4zGc+Yx/v9/s49dRTsXDhQhxwwAH4yU9+UnnfJz7xCey9994YGhrCAQcc\n", "sEvqgy9/+ct485vfjFe+8pVot9v4h3/4B1x33XWYnp6e9fWUbSB0Oh0MDQ0BAL75zW/i9NNPx8qV\n", "K9Fut3H22Wfjmmuusb/Reeedhxe84AUAgJe97GU4/PDDLYmxdetW/NM//RMuvfRSK8faf//9kSQJ\n", "AOCGG27AmWeeiZGREYyOjuKss87CZZddBgD43//9X6xfvx5/9Vd/BcYYXv3qV+Owww6bofSoUWM+\n", "Udsih6fDFvlYt24dXvWqV2GPPfYAAPzmN7/B/vvvjzVr1gAA3vnOd2LTpk144okn7Hu25VglSYJ9\n", "993Xykg55xgdHUUcxwC2b4sATcYcf/zxiOMYS5cuxVFHHYW77757p49HjRpzRW2LHObDFi1ZsgRn\n", "nHEGDj300Dm9/uSTT8ZRRx2Fbre73YBNKYV169bhlFNOsY/dfffdOOaYY6wvdcwxx1h7ccstt0AI\n", "gfe9732IoghnnnkmlFL4r//6LwA7tkU+vva1r2Hp0qV45StfOdfDUKPGTqO2RQ5Phy0C5kYazWaL\n", "Lr/8cpxzzjkYHh7Gfvvth3e/+9340pe+NOv7v/SlL+HYY49Fs9kEsGNbdO655+Lcc8/Fy172MgDA\n", "8uXLsWLFijnv01yw25MYeZ7jmGOOwSmnnIKtW7fi2GOPxbXXXmtZuoceeggLFizY5u0rX/nKvGzH\n", "Rz7yEaxfvx733HMPHn74YcuaA5oFu+666/C9730P9957L2644QasXbsWn/jEJ/DEE09ASomLLrqo\n", "8nm33HILfve73+Gmm27CJz/5SXzve98DAHzsYx/DAw88gP/7v//DjTfeiHXr1lUYSZLjTExM4Nxz\n", "z8VJJ52EDRs2AABuv/327R6LH/7whwC0s3/wwQfbz1y9ejWSJMF99923zf1/4xvfiGaziSOOOAKX\n", "XXYZli9fbvfdv3iklMiybFZFRL/fx09+8hO86EUvAgD8+te/RhiG+OpXv4rly5dj3333nZG9HPzs\n", "Rx55pCK79CGlxF133bXNfahR48mgtkW7hy0CtF24/PLLK4vx4YcfjgceeAA//vGPIYTAZZddhjVr\n", "1mDp0qX2NZ/73OewaNEiHHroobjuuutmfO5BBx2EZrOJU089Fddff70lMeg7CYO26Mgjj8RVV12F\n", "fr+PRx99FN/5znewdu3a7e5DjRq7itoWzb8t+kPhtttuw8aNG61iDND24tprr8XY2Bi2bt2Ka6+9\n", "FkcffTQATXAcdNBBlc84+OCDK6ToXP2idevW4eSTT57vXapRw6K2RbuHLTrxxBOxZMkSHHnkkfjV\n", "r34162sGbdHWrVuxfv36ig920EEHzZqAmZ6exrXXXlvxuYBt2yIhBH72s5/hiSeewD777IPnPe95\n", "OPPMM3eJ4Nou1G6OW2+9Va1YsaLy2Cte8Qp1zjnn7PJnrlq1St16663bfc0RRxyhvvjFL8763PXX\n", "X6/WrFlj/7/XXnupq666yv7/bW97m3rve99r/3/xxRerY445Riml1AMPPKAYY+ree++1z//t3/6t\n", "Ov3005VSSq1evVrdeOON9rlLLrlErVq1apvb+eIXv1h94xvf2O6+DOLP/uzP1Oc///nKYytXrtzh\n", "MSnLUn31q19VCxYsUL///e+VUkp94QtfUC94wQvUgw8+qMbGxtSb3vQmxRhTd9xxx4z3n3zyyWrt\n", "2rX2/1/+8pcVY0z9+Z//uUrTVP3qV79SixcvVjfffLNSSqm/+7u/U4cddpjauHGjWr9+vXrZy16m\n", "OOfq8ccfV3meq9WrV6tPfepTKs9zdeONN6o4jtVRRx21U8eiRo25orZFu48t+v73v686nY6anp6u\n", "PP75z39ehWGowjBUixcvVj/5yU/scz//+c/Vli1blBBCffvb31bdblf94Ac/mPHZWZapiy66SK1c\n", "uVJNTk4qpbZvi5RSavPmzWrNmjUqDEPFGFPvete7duo41KixM6ht0fzbIkJRFIoxZn2cHeGkk05S\n", "55133jafP+2002bYgzRN1Wtf+1rFOVecc/X6179e5XmulFLq7//+79UJJ5xQef2JJ56oPvaxjyml\n", "dmyLCA8++KAKgkA9+OCDc9qPGjV2BbUtevpt0Q9/+EOVpqnq9XrqggsuUMuWLVNjY2MzXjdoix56\n", "6CHFGFNZltnHbrrpJrXXXnvNeO/ll1+uVq9eXXlse7bo0UcfVYwx9dKXvlQ9/vjjatOmTeqwww5T\n", "H/nIR3b2MGwXu70S47HHHsPKlSsrj+255567VG+1q9iwYQNOOOEErFq1CsPDw3jnO9+JzZs3V17j\n", "Z/uazWbl/41Gw9ZWE/xutnvssQfWr18PQO/v4HM+Lr/8cqxZs8Yyd3fdddeMbdkROp1ORWoFAOPj\n", "4+h2u9t9XxAEePvb346Xv/zltrHLaaedhne84x044ogjcOCBB+I1r3kNAGDVqlWV937wgx/Eb37z\n", "G/z7v/+7fYwkSR/96EeRJAkOPPBAnHDCCfj2t78NQDOra9aswYtf/GK88pWvxFvf+laEYYilS5ci\n", "iiJ8/etfx7e+9S3bjOa4446b8b01aswXalu0+9iidevW4e1vfztarZZ97D/+4z/wmc98Bvfccw+K\n", "osAVV1yBN77xjXZ/aFs551i7di1OPPHEWdUYcRzjzDPPRLfbtdmX7dkipRSOPPJIHHvssej1eti0\n", "aRO2bNmCs88+e6eORY0ac0Vti+bfFv0h0Ov18LWvfW1G9vLEE0/Evvvui6mpKUxMTGD16tU46aST\n", "AGibODExUXm9bxO3Z4t8XHHFFTj88MOx5557/gH3sMZzHbUtevpt0Z/8yZ8gSRI0m0186EMfwsjI\n", "CG677bbKa2azRZ1OBwAq9mZb/tdsqq7t2SKK784880wsXboUixYtwvvf/34b380XdnsSY/ny5Xj0\n", "0Ucrj/3+97+vSJUGu6f6t6uvvvpJb8OHP/xhBEGAu+66C+Pj47jiiit2OH5nRxew3232oYcesnVC\n", "y5cvn/Ec4fe//z3e/e5341/+5V+wZcsWbN26FS960Yvsd83WSda/Uaf+Aw44oNLt+v7770ee57Z3\n", "xY5QFAXa7TYALdM677zz8MADD+Chhx7C/vvvj1WrVlWM2rnnnosbb7wRN910k71oAMyQTBLot200\n", "Grj44ovxyCOP4He/+x0WLlxYqRE78MADccstt2DTpk34zne+g/vvv9/WXtWoMd+obdHuYYv6/f6s\n", "gcGNN96IN7zhDdh7770BaMn28uXLK42EdwZlWVo7tz1btGnTJvzsZz/DX/7lXyKKIixcuBCnnnrq\n", "vC/WNWoQals0/7boyWBbTQivv/56LFq0CK961asqj3/3u9/Fe97zHjSbTbTbbbznPe+x9uKAAw6Y\n", "IQf/1a9+hQMOOADAjv0iwmC5XY0afwjUtmj3skXA7PZoNlu0YMECLF++HHfeead97Je//KUt+Sc8\n", "/PDDuPXWW2eQGNuzRQsWLHhKksq7PYnxile8AmEY4qKLLkJRFLjuuusqjVQGO9YP3t7xjnfY12ZZ\n", "Zutx/L93hKmpKbTbbQwNDeHRRx/FhRde+KT36/zzz0e/38fdd9+NL33pSzj++OMBAMcddxwuuOAC\n", "jI2N4ZFHHsHFF19s3zM9PQ3GGEZHRyGlxL/9279VekAMdpIdvB122GEAdBbgm9/8Jm6//XZMT0/j\n", "nHPOwdve9jbrsPu499578Z3vfAf9fh9FUeDKK6/ET3/6U7z+9a8HoGuq7r//fiil8Jvf/AYf+MAH\n", "8NGPftS+/4ILLsDVV1+Nm2++GQsWLKh89h/90R/h8MMPx8c//nHkeY577rkH11xzDd74xjcC0Izn\n", "Y489BqUU7rjjDpx//vmVUWa//vWvkaYper0ePv3pT2PDhg049dRTn+QvU6PG7Kht0dNriwjXX389\n", "Fi5ciCOOOKLy+MEHH4xvfetbeOCBB6CUws0334z77rvPLshf+9rXMDU1BSklbrrpJttUFAB+9KMf\n", "4fbbb0ee5+j3+/jkJz+JNE3xx3/8xwC2b4tGR0exfPly/Ou//iuEEBgbG8O6desqdaY1aswnals0\n", "/7YIANI0tfvv/z0byrJEmqYQQqAoCqRpOiNw2lZPioMOOgiXXnop0jRFv9/HJZdcYu3FEUccgSAI\n", "cNFFFyHLMlx00UXgnFuV6478IgB2Wtyxxx47p+Neo8auorZFT68tevjhh/GDH/wAeZ4jTVNceOGF\n", "dmS8j23ZopNPPhnnn38+xsbGcM899+ALX/jCjDjqiiuuwGGHHYbnP//5lcd3ZIve9a534eKLL8bG\n", "jRuxdetWfPazn8Wb3vSm7R32nce8Fqf8gfDTn/5UrVmzRnW7XXX88cerE044YZfqrfbcc0/FGFOc\n", "c3u/rVojv97q7rvvVocccojqdDpqzZo16jOf+Yx63vOeZ1+71157qe9973v2/yeddJKtX1RK9414\n", "3etep5TS9Vacc3XppZeqFStWqGXLlqkLL7zQvrbX66mTTz5ZjYyMqAMOOEBdeOGFle/6yEc+ohYu\n", "XKhGR0fV+9///u3WhW0PV111ldpjjz1Uu91WxxxzjNq6dat97owzzlBnnHGGUkqpe+65R7385S9X\n", "3W5XLVy4UL3qVa9St99+u33tfffdp/bdd1/VarXUnnvuqT772c9WvocxphqNhup0OvZ2wQUX2Ocf\n", "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\n", "ttFi94WNRdsOG4ssLLYdNhZtO2wssrDYdthYtO2wsWjnY6eRGI7j7Ky32mL8/ve/x6OPPoo777wT\n", "11xzDR544IHC/Y7jTLvtn2ybdtX2fuxjH8Pq1avx2GOPoa+vD5/61Kc2+9jptk8tdg9M5+POxqLt\n", "BxuLLKY7pvNxZ2PR9oONRRbTHdP5uLOxaPvhtRaLdhqJsWDBArz44ovq9xdffLHA+uxK9PX1AQBm\n", "z56Nk046CatWrcLcuXOxbt06AMDatWsxZ86cXbmJALDZbWrfty+99BIWLFiwS7Zxzpw56uT9yEc+\n", "ouRI02kbLXZv2Fi07bCxyMJi22Fj0bbDxiILi22HjUXbDhuLdj52Golx2GGH4emnn8Zzzz2HOI7x\n", "4x//GCeccMLOevvNotFoYGRkBABQr9dxzz334KCDDsIJJ5yAlStXAgBWrlyJE088cVduJgBsdptO\n", "OOEE3HTTTYjjGKtXr8bTTz+tHHx3NtauXatu33rrrcoVdzpto8XuDRuLth02FllYbDtsLNp22Fhk\n", "YbHtsLFo22Fj0S7AznQR/eUvfyle//rXi7333lt89atf3ZlvvVk8++yz4uCDDxYHH3ywOOCAA9R2\n", "bdy4UbzjHe8Q++yzjzjmmGPEwMDATt2uU089VfT19YkgCMTChQvF9ddfP+E2feUrXxF777232Hff\n", "fcVdd921S7bxuuuuE6effro46KCDxNKlS8X73vc+sW7dul26jRYW48HGoqnDxiILix0HG4umDhuL\n", "LCx2HGwsmjpsLJoecIQYx6bUwsLCwsLCwsLCwsLCwsLCYpphp7WTWFhYWFhYWFhYWFhYWFhYWGwL\n", "LIlhYWFhYWFhYWFhYWFhYWHxqoAlMSwsLCwsLCwsLCwsLCwsLF4VsCSGhYWFhYWFhYWFhYWFhYXF\n", "qwKWxLCwsLCwsLCwsLCwsLCwsHhV4FVJYnz4wx/GJZdcskPfY/ny5bjuuuu2++s+99xzcF0XeZ5P\n", "6fH33nsv9thjj+2+HRYWFtsOG4ssLCymA2wssrCwmA6wschiZ+FVSWI4jgPHcbboOUmS4JRTTsGe\n", "e+4J13Vx3333bff3eLVg3bp1OOGEE7BgwQK4rosXXnhhwsc/+OCDOPzww9HV1YWDDz4Yv//97wv3\n", "r1+/Hn//93+Pnp4ezJgxAytWrFD3ffrTn8aiRYvQ1dWFhQsX4qKLLkKapmPe48Ybb4TruoWgFEUR\n", "/umf/gkLFizAjBkz8PGPf7zw3OXLl6NSqaCzsxOdnZ3Yf//9t3aXWFhsFWws2jb84he/wJFHHone\n", "3l709fXhox/9KEZHRzf7+Le97W2YM2cOurq6sP/+++Paa69V9917771wXVfFg87OTnz/+98vPP9X\n", "v/oVDj30UHR0dGCPPfbAT3/6U3Xfueeei/322w+e52HlypWF500WixhPP/00yuUyTj/99K3dJRYW\n", "WwUbi7YNWxKLXnjhhUKc6ezshOu6+OY3vznmsWeffTZc18Wzzz6r/jY8PIwVK1Zg9uzZmD17Nlas\n", "WIGRkRF1/+9+9zu84Q1vQHd3N/bee+9CnLOxyGK6w8aibcNvf/tbLF26FL29vZgxYwaOPfZYPPnk\n", "k5t9/CWXXIKDDjoIQRDgy1/+8mYfN14s+slPfoI3v/nNqNVqeNvb3jbmOa7roqOjQ8W5c889V903\n", "WSxasWIF+vr60NXVhb322gtf+cpXtnRXTIpXJYkBAEKILX7OUUcdhR/84AeYN2/ea/bgnwpc18W7\n", "3/1u3HzzzZM+dtOmTTj++OPxmc98BkNDQ/j0pz+N448/HoODg+ox73//+zF//ny8+OKLWL9+PS6+\n", "+GJ13znnnIMnn3wSw8PDWLVqFe655x5897vfLbzHwMAAvvrVr+LAAw8sfC+XX345HnnkETzxxBP4\n", "y1/+gkceeQSXXXaZut9xHFxzzTUYGRnByMgI/vSnP23LbrGw2CrYWLT1GB4exhe/+EWsXbsWf/rT\n", "n7BmzZpC/GjHt771LaxZswbDw8NYuXIlPvGJT+Cpp55S9y9YsEDFg5GRkcIC/sknn8Rpp52Gr33t\n", "axgeHsYf/vAH/O3f/q26/5BDDsG3v/1tHHrooWO+k8liEePjH/84Dj/88N36O7XYdbCxaOuxJbFo\n", "0aJFhTjzxz/+Ea7r4uSTTy487ne/+x2effbZMfv10ksvxYYNG7B69Wo888wz6O/vx6WXXgoAyLIM\n", "J510Es4991wMDQ3hxz/+MS666CL88Y9/BGBjkcWrAzYWbT0OOOAA3HnnnRgYGEB/fz+WLVuGs88+\n", "e7OP32efffD1r38d73nPeza73zYXi2bOnImLLroI/+///b/Nvv4f//hHFeu+853vqL9PFos++9nP\n", "YvXq1RgeHsadd96Jq6++GnfddddUd8OU8KogMR599FEceuih6OrqwqmnnopWq7XFrxEEAS688EIc\n", "ccQR8Dxvi577zDPP4O1vfztmzZqlWPOhoSF1/+LFi/GNb3wDS5cuRWdnJ8455xz09/fjXe96F7q7\n", "u3HMMccUkn4AuO6667BgwQLMnz8fV111lfp7s9nEhz/8YcyYMQMHHHAA/ud//qfwvMsvvxxLlixB\n", "V1cXDjjgANx2221bvC/mzJmD888/H4cddtikj33wwQcxb948nHzyyXAcB6eddhpmz56NW265BQBw\n", "zz334KWXXsKVV16Jzs5OeJ6Hgw8+WD1/3333RUdHBwAZ1FzXRV9fX+E9PvvZz+If//EfMXPmzELg\n", "u+OOO/CJT3wCPT09mDVrFi688EJcf/31heduTaC0sNha2FiksT1i0Yc+9CEce+yxKJfL6OnpwUc/\n", "+tExSi8TXG1gdHR0oKura0rvddlll+H888/HO9/5Triui97eXuy1117q/gsuuABvf/vbUS6Xxzx3\n", "KrHopptuQm9vL97xjnfYuGSxw2FjkcauiEUmVq5cibe+9a1YtGiR+luaprjwwgtx9dVXj4kHTzzx\n", "BE488UQVv0488UQ88cQTAID+/n5s3LhREbCHHXYY9t9/f1WJtbHIYrrBxiKN7ZWjLViwAACQ5/m4\n", "eZOJM844A8cddxw6OzvHPd8nikXveMc7cMopp0z4+ptrrZksFh1wwAGF9ZTv+5gzZ85m32drMO1J\n", "jDiOceKJJ+LMM8/EwMAAPvCBD+Dmm29WbNILL7yA3t7ezf7cdNNN22U7Pv/5zyuG/sUXX1SsOSAV\n", "Abfccgt+/etf46mnnsIdd9yBd73rXbj88svxyiuvIM9zfOtb3yq83r333ou//vWvuOeee3DFFVfg\n", "17/+NQDgy1/+MlavXo1nn30Wd999N1auXFlgzpYsWYLf/e53GB4expe+9CWsWLEC/f39ACTTNtG+\n", "ePDBB7fLvsjzXF1wH3roIey7774488wzMWvWLBx++OG4//77C4+//PLL0dnZiT322APvfe978b73\n", "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\n", "glqthvPOO0+RFA8++CAWLlyIY445BgDw+te/Hu95z3tw5513ArCxyGJ6wcaiHZ+jJUkC13VRKpUm\n", "3hEY25I/WSza3PPGQzsJsqU52mTrta3BtCcx3vzmN8P3fXzrW99CkiS45ZZbCkYq7S7R7T8f+tCH\n", "1GOjKFKGM+btyTA6OoparYauri6sWbMGX//617f5c1122WVoNpt44okncMMNN+CDH/wgAODv/u7v\n", "8LWvfQ2Dg4N46aWXcPXVV6vn1Ot1OI6DWbNmIc9zfO9738Pjjz+u7n/LW94y4b444ogj1GNbrZb6\n", "/Obt8fDoo48iSRIMDw/jn//5n7Fo0SJ1gT3ppJMwMDCAG2+8EVmW4Wc/+xnWrFmDI444AkII/Od/\n", "/icGBwchhMCqVavw7W9/G+9///sBADfccAP+/Oc/4//+7//w2GOP4bDDDsOll16qxvC8/PLLePnl\n", "lyGEwEMPPYTLLrtMjQ8aGhrC3XffjVarhTRN8V//9V944IEHcNxxx23zd2NhMR5sLNr+sejxxx/H\n", "cccdh3/7t39TPeGbw1NPPYU777wTzWYTSZLgBz/4Af73f/8Xxx57LAC5gH/++echhMCLL76Iz3zm\n", "MzjxxBPV88866yx873vfw+rVq9FoNHD55Zfj+OOPV/cnSYJWq4U8zxHHMVqtlrpYTxSLzjvvPDz7\n", "7LMqjp1//vl4z3veg7vvvntbvhYLi83CxqJdG4sYt956K2bMmIHly5cX/v7000/jD3/4g4oJgDTB\n", "43i0dOlSXHvttWi1Wmg2m/jOd76jCkIHHHAAnnrqKfz2t7+FEALPPPMM7rjjDnW/jUUW0wk2Fm3/\n", "WHTrrbfiL3/5C/I8x/r163HRRRfh3e9+92ZJjDRN0Wq1kGVZYR0DTB6L8jxHq9VCkiTI8xxRFCFJ\n", "EgByottjjz2GLMswOjqKiy66CAsXLsT+++8PYOJYtH79etx0002o1+vIsgx33303fvrTnxY8EbcH\n", "pj2JEQQBbrnlFtxwww2YOXMmfvKTn4wZYzVV7LvvvqhWq3j55Zfxzne+E7VarcCibQ5f+tKX8Mgj\n", "j6C7uxvHH3+8mtQxEcz725UJjuPgrW99K5YsWYKjjz4aF198MY4++mj1Xq973euw55574rjjjsMZ\n", "Z5yhnvs3f/M3+NSnPoU3velNmDdvHh5//PGC2dOWoFqtoqurC47jYL/99iuwYx/72MfwsY99TP3+\n", "9a9/HbNnz8aiRYvQ39+v5NuAlDr9/Oc/xze+8Q309PTgyiuvxO23344ZM2YAAG677Tbsvffe6O7u\n", "xjnnnIPLLrtMkRjd3d2YM2cO5syZg7lz5yIMQ3R1daGzsxOAdBw+4ogj0NHRgbPOOgtXXHGF2k9J\n", "kuCSSy7BnDlzMHv2bFxzzTW4/fbbpyT/tLDYGthYtP1j0b/8y79g48aNOPvss1U1wjSfMmOREAJf\n", "/vKXMXfuXMybNw/f/e538Ytf/ELJOR999FEVL4444ggccsghBbOus846C2eccQbe+MY3YvHixahU\n", "KoX7jznmGFSrVTz00EM499xzUa1W8cADDwCYOBZVKpVCHOvo6EClUsHMmTO3eH9YWEwFNhbt2ljE\n", "uPHGGwtjnBmzZs0qxARObNip/4YbbsBf/vIXLFiwAAsXLsRzzz2HlStXqs/z7//+7/j4xz+O7u5u\n", "LF++HKeccgo+8pGPALCxyGJ6wcai7R+L1qxZg+OOOw5dXV049NBD0dvbq+IDMDYWfeQjH0G1WsVN\n", "N92Er3zlK6hWq/jBD34AYPJYdOONN6JareKCCy7AAw88gEqlgvPOOw+AbtPp7u7G3nvvjRdffBF3\n", "3HGHmh4zUSxyHAf/8R//gYULF2LmzJm45JJL8P3vfx9veMMbtnh/TARH2KY5CwsLCwsLCwsLCwsL\n", "CwuLVwG2uxLjrrvuwn777Yd99tkHV1xxxfZ+eQsLC4spwcYiCwuL6QAbiywsLKYDbCyyeC1huyox\n", "sizDvvvui1/96ldYsGAB3vCGN+BHP/qR6p+xsLCw2BmwscjCwmI6wMYiCwuL6QAbiyxea9iuSoxV\n", "q1ZhyZIlWLx4MYIgwKmnnorbb799e76FhYWFxaSwscjCwmI6wMYiCwuL6QAbiyxea/C354utWbOm\n", "MD934cKFePjhh9XvUxnhYmGxs2FtYV57mCwWATYeWUw/2Fj02oONRRavRthY9NqDjUUWr0ZMFIu2\n", "K4kxlYP/sD1n4bA9Z0MIIMsF0jxHkuZopRlaSYZWnKGZpGjGKRpxhlacoplkiJIUcZojyXJkQoA/\n", "k+s48D0HoeeiHPiohB5qpQCdlQBd5RDdlQDd1RA91RJ6qiX01kJ0V0roqYboqoboqgToLIeohT5q\n", "JR+lwMPX7ngMXz7lDYDnAg4A/lxCQGQCeZ4jT3MkaYYoydFK5Da3khTNOEMzlttfN243E3m7lWRo\n", "JSkiem6UZIizTH62NEOcyX2SpjnSPEeWC+RC0L9AngsICLw0UMeCnhrg8CY6+P/svUuvZEmTLbTM\n", "fe8dcc7JzKpqXVqou8UVIDEGqdGdIDHsERIzfkD/CYZ3yrxnCDFsXfgTCGZMGKKrlq4aNYMLNPRX\n", "lZnnROzt7sbAHm6+I07myarMrPoqw6si43HisV9ubrZs2bJEhERATqS3hCkRppww5YQlJ8xTwpIz\n", "linhMGccpozjnHGcMo6LHL+7ecLdMuFuzrg/yOP7Rf8+y+sHvU1TQs4JlBMo0XCs/uX/+L/iX/6X\n", "f4lWZT9PW8X784Z354J3pw0/Pa348WnFHx7P+PFxxT89rvjD+7M8f1rx05O85+1pw/uzHMdzkWNV\n", "W0Pza0D2ec4Ji+3PPG7/3Szbb/s76zH5b/+n//1zToHb+I2M38JCbKZDlK+BBLnPiZASIVOSeZoJ\n", "k87VnBLm3Ofu//PuhL/44QFTTsikn0skj4lASeY86S/G3RYbKXaDITazMYPNloDRGrs9ZWa0Jq8z\n", "h/czg/375F5ekfGPb0/40zd38jeMCw6FbSLqz5MeEyLZF3ucCEiU1PTK/qbwN0D2G77P8qPavRwM\n", "tZEMVLebjL//x7f4s+/vURqj1obSGKU2XYPE5tbasDU9Jjvba8eihbXn5uLfxkvGS23Rf/Yf/bty\n", "PVbxc7baUGrDavfm/zS5fmvr17f4Bc/8vm+H2iL0ZZpwfdsY45wHZF6N73n5iL8SD8fYESC+f9yu\n", "/SGk+M7wt9oa5px8++L2mz28tu17HzkezfE7Ll//OXZgOAe7Y0D4+HlBsOkf244U7Kz5hlNKyFl8\n", "JrstU8akr/1v/8f/+zP26jZ+6+Oltui/++v/HKv67Y9rwfvzhvenDW/19u5U8Pa04p3680/ngieN\n", "a7bS7VP/XVnz50SY/TrLWHLCMslNYhT5m12fyfwcvYbtuv83//db/PN/9sptX9N1vHJf120Nt1tp\n", "zf2dUsWvqWFNb+r/uL+D7hfZGGzB5zopdozi451tuOY7JfeXCCmlIfZLZP5kjwVzFhsw5+Sv/Z//\n", "3zv8+//Oa48f98e5H5fuJ9laJPcVa1ibbO0qbVyTCHBfd8kSg93NE+4OGa8OM14dZ7zWmz1+OMjt\n", "v/4fRpBtPz4riPHnf/7n+Id/+Ad//g//8A/4i7/4i+E9tbEGoX2xPm8Np1IcxHjcioMXJwUvzqWi\n", "1PHAiDEmHGY5KPfL5Afku7sF390vCmAYiLHgu/sDvrtb8OZu8QN2v0w4LhPmnJGTLh+NAa7uFDd1\n", "ftciJ+5pM9Cl4FEBl8fzpo8L3p/l/kmfGzhzKhXnTW/6XVttOvHNSdEJqZOu7RxoZsa704Z/++Mj\n", "AL34hwvbwIzUF60sF7UsWFnAjCnhMAkYcfTgPytoMfn9w6E/fzj0148KeBxnAUXmKYvhSRpoNFlh\n", "7QKep4QjyyVHslIj6eI66bYK6GLbG7bfJudKIKpYC1Bq02MDcGUwNw+ixLlrbrCKBihlkol2mOU4\n", "3Mbvc7zEFn3JEZ1Uea7zU+dGggXnCI9DwG8fZLueG5ASWBfZZgtOi6hFv/MFSIMct2McQVEDRlu3\n", "MW1c1JnHxXwfGADA41rwj2+f7+eewoLsYIU/t0U3ALEO0oTjpa+bLfHvMnf/CnjTgQc9ZgGQse0B\n", "WIMGCCDEDB6AJ0AOMYfgQr6b8Pkdmdv4/Y1PsUV2ndocdQc8OOYvBTD2gXIaHOLrAY077Gwf5GG+\n", "E13O/5eM6MzuQYGQ97j4hG/i1d8k0O4PjRlA6x/5ADhxdTs/8Odrf/tc89/2MyGco6vnR+0P6WPq\n", "QLMd2/02NQYSGBWwQyMPKCERg4iRSK4nAdlvVu33Ol5qi1jBgLVIAvlprXivcc27c1HwQgCMx7Mk\n", "cCUh29wvt5GIkBMwGVimSVS56eMsicV56sF3Sin4CT150rjHOp6ogf6tXdpPT1J4gkLsKAOaoNj5\n", "CIgJm9H+fcmZcc1GdvtIYDASJDljiRy2GxpY7QUzkFNDVIsgYlATf6oyg1h8Hflm0nNkQEYHuj25\n", "BQMyEkptmLPEqlNOmErFlARsX7cqn68NBa37X4CvV3s/1bcR5OuS+XxTurSB+/FZQYy//Mu/xN/9\n", "3d/h7//+7/Fnf/Zn+Ff/6l/hb//2b4f31MZ42gpqZQEwigTzZ2MrBMbCeauO9MSJQZCTMWfCwTLu\n", "y4SHo7Av3hj74u4wgBjfOfNCwIuHQw/Ac5LFoTXZxvNW9aSJ07A668LAiYrHc8HjVvD+tOH9WvB4\n", "FsaAARgGYsT9OSmTYNX7rVbNCvaJFp2TMZDoE0yAoLMf14jUUQiKLCCIiNysSOccjMghZxxmYbMc\n", "9HjeLRn3y4z7JeP+MOPVYcL9YcLDMuPhOOF+njrTYZFjeVCWw5wIpQiSK5NSFtkpEZYpa/bXLmju\n", "wU1KjizmlHpAk1LI1Mr9mYCtNgns9Nri0ifO4AiyHtu5oXDD1jIO022x/r2Ol9iiLzVGRJ2GoMEX\n", "iTA/e/atDwajqYtuGQ15pQMA/oEINGAMhJgx2JPITugAaXOW1x4sZUDtbsz66fbo9Nlqu8jSyr73\n", "Y2DPu40a2WNJgQljmKTUAVlbXA3QyOG9++yyfb/ZybgP3baac9IXFCKAuDM+mCRQaGpLG+zvDIMv\n", "fk4wdxvf3nipLZLrNICMrXnmKzriHwMwzCy4jdH5Zz6B/y1YHPsWCoGBvEQXQEb8nU+dAjZ7htc+\n", "ETgYvy1sjzrddWeLvsQ8/blfuT9mEbjuAIbZtf4ZP2rBtoEMdCIFNXTLQpBg4wLIIHmRdE0p1JCa\n", "ZHD3x+82fj/jpbZoaywM+a1KgnaV2ObtecO7k90KHtcNT2u9ypC2Nd7YPQZaHLKwwD32mLIDHMYS\n", "SKkneuyybgpgoLXg+nSGemudfemJ4BhXBbtqMYKBGMzGQNXv/YrgxX4M9gGjzzXsOavNMxCYGMzC\n", "YrV3y6zvjwkNRAmN2M+T2WTxnXpSKQW6qwAZcpwlIdywFcacq563irk0iTFLRS6ElcjXrggObVWT\n", "zfCd89+GrlExXv3Y+KwgxjRN+Ju/+Rv81V/9FWqt+Ou//usL1dsf7g84rQ1FSyiMmXAqFU9aPiIs\n", "BQMw+GJi5ER+8R+VHfDqIODEmzspE/k+gBjf3S/47qjMC6Wo3GmwnXWlaI2xMgMV+E//gz/FT08b\n", "Nt1GK4V4XAV1fL9ueFQ08r0ikfJ4079rWYkxSnSSG9VqC5SboiDGEFA0OG3QHHEAF5Oq1Ib9iIGD\n", "BQsWOKVEyABSFiq7GA7y0oplyjhMyUtLjsuEe2NmHCYtuRHw5+EoYIYxWR6WDmgYmPGf/PN/hrdP\n", "mwYdsl12Hqck6Ov9wmDMYJBnNwHNwAIOWkjQYtSpzSn0CYQVYqQ6sgpwq2KIWgemzJCV1nCYBNC4\n", "jd/neIkt+pIjZtJsMe/BeyinuPLZxhIwozXcLQL4tQqQTh4LStpgFwJjy+dCAzOCfZFbsexDs4Wp\n", "MzE88L+yqPffGof8Vv3o8QDGIMrKa+zY5MDMMKDaQQx1ajpdcmRmyOMYoGlAptt+N2ehkKJnY3wh\n", "jdsZHpF6EPG82QeMxRFihtu4javjxbboagbREiljGcmHAIw9+yKyvFKwSftP2nc1d2vl4iYQGnH4\n", "3l8GDHyp+dJt1Rf6gc849iSLkYGBj5+r4E8Rw0sGW4BJ9sdhADIUzUhIIGqglpBqk+vlBmL8bsdL\n", "bdHqAIaUkrw7bXj31AGMt6etAxhaEi/rqwxbv62M3WILK2E/zAnHadLydkmozilhygSihBi7soIU\n", "xAa2En54OPTEjNtLBXw9tmK3m3vgdyih5RDQ7/ycX3sm8DMPmrLQnBnaJFbi1MCNkJnATOrLJSin\n", "tCMeAICEV8dZk1gJGexJHCtdToEJ4ccrJ5TG2HLDVhPmLCV8OVc554mQqSFRxZoIVCzGNaBeY1cN\n", "cPfH2OM+vAzE+KwtVj/6Y0T4L/7jfw9bZdeBsNKKp6gVYWUWIasun5eDaxPCyhushuaNlol8f79o\n", "OYmyL46ikeEAxjLhoKjglLozbMic1KEK88L0LB5XqQl7txZBII1OdeqUqsd1w+MamSRFWCYKyEjN\n", "kFJCa59ITnP+ghOnZ2d29VSpl3IYWjrnXmZysNqlRdgZ9wdhZljZzsNBWBmvlKlhx9c+Y/oTVpOl\n", "UwnchIljpULdWEqt3Y+qh/GH96KP8ePTih8fV/z0tPoxf3/enOFioJANC37MSFrJjO3PYZbX/pd/\n", "/W/xFafAbfyGxpfQzdgHERasm5aFLe5R32LPNrBg3oMPECja8l22oKHXcjbsmBYNaGiodQQ5DKDY\n", "l45EhsGXnhUxYwzq6H/PIHdUXvQxBPyU10amxhCwobNdhh8ygAbmvGDn1IwUfo6AD3dQyI7dl7DZ\n", "N1v0bQ4iwr/4D/9UGJ9FaLlrjYxNY2V8HMCIjMX9eu/gXBhD9hGBzWUMsN01P3zmyxyO3+0YbB7G\n", "NSICuhHAiMBvHCPTLJQPIgZol9sQNTKmXRLLAs6/+79+vNmib3QQEf6b/+pf4O1T160z37tr1Ems\n", "4wBG62shEVyLz0pFrFT9oHp1B01CL1MWZrhqYXQ71RlHAuw2ZVUwNgUrttL1gqKG0FZ7ctgSOFZC\n", "MpaX9tgL+OOwadEEOINLEzyD7VdNNfOPpmws/CArMElJvbHj7TyIJhu5HMG1c1JZ5BXsuHuyP8gl\n", "PG0V51K08qB5SaQd30SazJ6SyEFo/Pj6KDH7GyUg/Pf/87/+oC36rEyMl4wnDTgjw+Fc+r0t2td2\n", "OKcekAqAISKeb44LXmsJieldvLmTA2ElEMd5cuEio+jIb5CjcaWyb4OJdUamhVGojHURmRixdORc\n", "umCnARdFBUkt+8lOEZdB/k9Y0PQ1o/qARgrofvhkNHIoB1q1IXjyBBXcv5+aoF+uPRHFnlIX/1Qt\n", "jHtjZigD5uEw49VRwCQBM2bcH/p7DX21sh3LmsoCLBkeA07qwqg89Vq13SrsGe6QbfXA0a4ZM06N\n", "gY39dywTLUYt32iTt/GrjDiDdTp6yYZRfYlEi4F0fiCQhno5hH52F4R3RlegWnK/MfdAJdqJq9sZ\n", "NtayhX3uXdsj+cLhe/XL247nbL/JaqRk1/libg9CVqkNGhkX2hle14nhs8PWBbvYAWRzbuJejFnn\n", "X5qBvo3b+NDwjGFtu6xicyf+YwDGNVDPsmmmRbMfUorAYFBnd+n7/9gC2UtL9Nse13D0iL1ags1s\n", "4f6NTW1ZZq11JyAxhH0KYV7wzr5flpYwgNavl3Zlo27jmxqP587AMDHPt2dLHpYBwKgBwLDAdM4J\n", "yyzBqcQPk+rt5RAPCGgmjQd03YbpXxgrTeMadY0czAhxlcWTZjM3BTL2wp4m5PlrJW0+x+ArT1pT\n", "HS+Gl5cwlJGRjZFBaFk/kyWV7N/FGYmkzISoIVEKIGooL1FQ3OLJmhOWKqCSsDEIczGgpGsc5lSF\n", "lUFwzUfxUYHSGrjYhkik68ko9e8+Nr46iHFa5cLv3TkiW0EYELXyRwEMEfFUFsZdZ2FEhdP7gzAC\n", "jlP2WitDkVAbtgoFL+SiF8HO3mHk/aqghSKPb08KXCiQsRfuPO00PLba+kQMkwXQ05WAjJ513Tvh\n", "UZk3XlTPjQhUdLSRfZ8vRfuC+J18EBsBCc2pRHPqXT+k80cawYxlwqvjpEBGV5V9pcCGaWpYmcmi\n", "9W+GEloQJnNLkMHjxKhLdNiC09ZTRVePxIbmqDAzUFh0Muw5t1B3/EfmoN3Gb3uMKPll8GwjXMJo\n", "YKEBslAEmRmsq9EV8kXPirbeXcTmdwcx+oI9qG3zpUM7bLuBqAEYpJ0Ncoc6siXCnu/L4GJG0IDE\n", "+Dd73XZyBD9YjyX33619cXPwAt1uSseWUeA4BgDxlLTdMYlg5wXSQrg4cFZSwnz1z7dxG580TCds\n", "vIX67isAxjX2RValegp15d0eDRCqA4ggEY4jkK+tv7XrmXZPaPeXZ+3t4DxcApG/tf0EjcCFg7np\n", "0oo5SMEi1me+jQn5VY5gbf8JAzIE7JCykq02BX9vIMa3Pt6vEuMIgLF6Evf9eZMuJAHAsFxg7BRp\n", "TG7z+63r4XGZcAxafC7gT31C9yRkA0FKXSvD7aA0Quhsfiv7t45jvTvGrowkxEV/TMDFcyP6hKQA\n", "JpjBJHYgkSjetERonNC4gbMdh9RLaIb+BlKmkhKLyLmuCeTrSvdrmYE6NSw1YckNaybMU3NNxCmH\n", "UuDgM66lAa03ZUBrWAsAFE/gmd37TYIYT9ZtZOtiMOdSsFbGVro+xEcBjKOVkXTg4rUG0q8O2nFk\n", "zlhmKWUgIq/Fidn6zRR4i4h2DsyLwL5wEENrwWLZiIEXNoFMeyFmOG0RckfDaD4pIWUK7XBkUpuD\n", "3lspKk36A8e26Q8OtHENZmrYruKO0fU2ghUiiEMVAmokwrRVpR1SZ2bsykxe6Tl4OEwOJL3SchN7\n", "j5V0LJPtZ0deTYnX6E3HJttRd/tiIjEAwHztiAQgAx20kvePAdRt3MbXHsw9+wmQqMInyaAB0LJF\n", "zZQhLlYjFZLRMwz7Ob9na1wbzqagLpIZs7die5KLbO4FNiNIMO5fZ4a0CBq28T5uawRjLLiKi/QA\n", "ajRG9cwArm5Tp1jqe1J3zscwrgc1o6hpYKroGwcQ+sbKuI3PPLZdJtG0MMxn+RCA4eVpdr9LhlyW\n", "zol7yixZe7jTy7+p63oEhvurRKEkw2Z2ACyjzXRGqr9mttdeGO6+6lD86OqgsD8mfNxjvQhoiOBh\n", "Yrl3timaABvq6OzPrbP/GOIfEZAqgeimFfatj3eBffH2adMSEk3YXtHA8ISnJjrvnHkhennHRRow\n", "HLWUW1qpjiKeA1tanR/zY6QEv4Yykp70ju09S2VsCq5U/jR/6I95OBYNOCOLycDLhEZVbUNCy1D2\n", "L18k1wEgESMVYd5OxKiJvTogJ4AouSZhQ0LNjKU1KR0qTbVNEqZclJGxedKJSE7sVsfukqU1QIEM\n", "4WP05P7Hxq9STrJqyUas/TTapIl/AJcAxtE6ZmgZyatwezjMuFNhycMsLUSnnJAEq0atDdYhwxxp\n", "645yWqNoZ1HNBdXAMJ0GfW6dSUy/Q7Queg/iGBhT2IfJevRq8G51iLFPt9UnSq2idefogncvAKU6\n", "s4Iv27NZXe1WmqoPiyHaWnVqlqGZnbEBtMqoVfY1JcIpVTzmhGXecMjSavV+2XB/6NoYr44zHqy8\n", "xAVVV9wvqpmxCKXMKEcmwleVGmV1XAJmNJQ2udpwq2OG15kk8TioDoBN7sosFCv04KTtZ+9t3MYX\n", "HIaOQ4N7JHU8QSC97gHJOtiI9ZpRITpew/uFWn7r+jbsGRbWCaR3MOr9xK1Xe0697ZmVm3Xtji4C\n", "BZ1nY3egFuzQ7rk/7n3FjT1iHVOuOR42pw30rGBQM4BYQZc2ioNSHRkk+3FxnKPjg8AWuY3b+EJj\n", "UyaGOONV267zRWLHBkWw0eYuWTkJhpZ5cXhHCwYaMVIiBxH9i6+sjR8S9/3cw0P0sOlRP8L+FjUk\n", "7K1JGbe2n2Yz4SWsACvzhC2Q19/8WhnaD4EXwGijrBV11/vZ2zARbDfWam1AU9teW0OBUM1Ls8Cl\n", "D8mEMpAAqtqt5EbE+ObH29Oq4EVnYTytm3aMbCOAQcBsvvrUE80PGo91JvbkZeWxC4ldbrWRZug7\n", "q7S0ve5C600SDMBQVkZtAv6aNMDehwA+bV5/aBp8KfvwS38zJl0MzGgspWJeZmwgZ04hqZs1Hsq6\n", "HdYMAqAmYAYn+UsmIOfUdTIYqC1hnljKSqaEZdMumFl8yCmXnlgCgUhqSC6AjArQVh2kfoGu59cH\n", "Mc7GxDDxzqAm+xyAYcIfd3PSySHZ/vvDjPvj5PoLdzpJTLwEkJNWanL1fHOg1ypsECsHGXQvgmBn\n", "Z15YP+TeaaSUS4pnz2aSn8Q59EU+TLFPstaFzbqfeRS58TYzlK4sXEpjvuKg2EVaQrBQirTFWUvv\n", "59uFw4wRY+1fd0JijbW9UQA0asO5EJ5yxaFkKb85Z7w7bNKp5Gmnk2HMjKV4F5P7pdfF5dxbwdn2\n", "E6Smy+hpZQ7Bj2Z7K6uQFXptuxmsNQIZ6KVDQAJKvYUlt/FFR3RUJeCWJ8YqaA1KHXaqgWYUQy06\n", "awYNABtbSuciGwsDH84yGHDhpRZIwb5I4DMbWGHCTwq2RuE3ez6ZaFROmNS5zik5M6Rxr++PwKjT\n", "PVvMmsS6/6gonp4V4/Ljix50EAsI1KghcSiDUeBIAgE5vrF1GGnANoAkjB2AcYWCfjMet/GZx+Yl\n", "tcbE4AGwtGFU25QwzGETKRfwQlrtWdALhGuWNFsPKUGQbw/8hd3Ffe36B67bml869uDFtfbJg+ix\n", "ghpWQkYY/QiGHkPdZ9P9cLYVRHuos2Z7ediX2Ec70h99n64XzpZD338LBmz4+VUmTSJNYhG0zl3s\n", "KABUwkWyTYAM00lrV0He2/i2hrEv3j1Jx8XeZVHW6h6nEZaJcDDm2tUc7wAAIABJREFUxSwJ5hHE\n", "0DKSWXx98yd6Nt90HYR9aoxrK/M/B7HI0y75LaUlFVsLbPPWmaAvBS8+9Yr/nPbhpb997X3P/X4E\n", "M9h8I2dq9bIz8R+TJo7k/UMiPia8uCGz8CQG+QPoOWSWhHwNSfpUPfnlek0JKsxeccIOyAgdN+39\n", "HxtfXxNj6/Qfu9UdA4Ng+gga+M9Zs/3T7pZxP1tLz6QiMaq1wDIxVjRQ7TXim9KRTlvF41bwpEI1\n", "EcB4H8Q7H4PmhYMXzZgdfVFyFVgNAObcWwpZCcVxsc4YQa03lFcsOXu7Idn/UaQrnk5biCmNtfMW\n", "0JgirwERWzXQQstntopTEU0SK4k5bVW1PUrXLFGgyYIN19hQB2tTpPScK562JD2ll4K7ZcP784x3\n", "p4JXxw0Ppzm0uFUA6iAtXA/awWTOaRD9NKZE0qzwMiUcWsJdnTzAqfq4NdEJ8GDOkkncBWKNpVIu\n", "Wg3dxm183rEHLQiaDUwBeDQG0cVKxP4dzjrAWOoQtSWufUV0fi1ba5mPKYAVstAkzBNhzn0emlr1\n", "PHXHwxemyWoeNfOrWRVB/60DU8+iRPVw0x4yO7y6bbF1gZ0tJpkV2vV4D+VkAbSx40TMKogqtEgD\n", "L7rYZwczvE3qtaNv5waB+bIDifa95G/jNn7J2Azg27GU9qwq69jjqvOk2S5NeMh8F99AXE4ZWjUC\n", "Zlb6ttZSh++2a1zmE7vtiX8HPn9wP/AKQsJmzz5w59nYCWl8bl2LDPStDHCKJbO95MLASjIwQy01\n", "UbezXwLMcMiI+7NGjMRij4RA0o8IMzzrKeKsQSeNpCWh20EmCQYZSNSEGq7tcUUnQ8qFsbuumqDj\n", "cr20WznJtz6sdN6EPJ8UNLAOXYBckwZg3HmzhZ5kNjDj3rpBzl3IU7lUWu5lSVIrfdcyf2XKO4Ch\n", "IIbJEbi9VMZa5SZJ1g/4RXFEH8lfuxIWXAVwLXliz198ZC+34WO//6FtovD82jZw+AAD4Gp2PaG1\n", "1pPe2cDyfLG/xorIJK1TayJkZk2wq09pZW1ZgIhYYZA1mT/YbSq+9deADPHfrrNm9+PrMzFKp0k+\n", "D2B0MGAx/YVp0jIEZV0ouncwsUilONvEKE3KB6AnrTTGVvqkMHDi/bkM7Iv3qsobwYtT6ZoXph3B\n", "YVtje9KuF5HH7Z31/qAlMfOEw5JxN004zjbBO9XKFHt7KQmFCdOBBKOO2l/N+TA2gwcFoV2b6ZE8\n", "bVUQVhUz9S4rm7BOnjbT/SgOaFjpT1dKt1peLc/ZGs5bwtOa8bRY69QJD8cN706BkXHY3MiJYrEI\n", "/ngZjcREzqQwx21OGcvUcJgztjp5q9paQ4DDdozM/QpABiQoKfr6bdzG5xrXsmzikDKYZZ62xr4o\n", "kL+hG+th8eVe8jRe188vWp61NIc/kbAlUi9Zm1Lq/dkDS8yA12VKWttqoGp2Rpy9P/Z1N0DEbJKX\n", "rUXQwhhgpTPAzltVmyy1rVtpXuc6AhydFVZb6PJkx2cHZiAcJ1IHvnmNpQKjqqbaM7/j8bfv2gNF\n", "12pI/Xdv4zZ+wdiqOuTlOoBhwJuXdRkrKlub9LElngW5dnGSBQsITC//O4/XvoMVHSz9mgCGA44I\n", "JWEOYEgLwb1umHVXc8HwHfBpDIVuO4SpxSxlF4lJlf39KODiMH2mEdcKL++x0xWSMI2M4N3XjMj2\n", "9SRWiKYaMxKLb2psuETARqzFNQCQgNYTRfDjBVC9+UXf+jBNQNPAOGv8Y/YoJWFvii5eLx95dZy9\n", "a6F1MbSWqhbXyFJLWjIi7G4G/FpdlWlx0vjEEqwOaIS20+JvVPkeYxY8M1H3a31ne/X46foHowaf\n", "vTjayk+1D3ubF7dreO257bI8mPs5HRS9ZqejX4TWS0yYyTXJrCz/uRJaB09TQm6MKXdwIyn7j6Fs\n", "jNbG5FcS1m521n3wgXEJZJjIcKIPnBcdXx3EsHoqbxsW7KUtWJbtEy2M5O15TOXWHi9WOpINwOiA\n", "RWUpHzFqc2zp2vUvRuDind4/rUUD/N4mNVLwCL0P8qzbeJg6Gnl/EDEbYxy8MlRS25Jaxw4Txoxi\n", "NyZ4OU2hvnV3DG2BbgzJuNDle4yiZXVipXYRHDsOtp9yPDa8P1c8rpszU6zN0ns9Xk9rLKdpgxBr\n", "Y8ZaGIUke3r23yl4Wic8rhMeD9rN5Vzw/jjh1aHo8ZiCEOuEJfdskoEODLEUSQEja8laliB+xobI\n", "jmKlWmziYNkIZNzGbXze0RcVYQKIM2qZNsBcWN5/CCFg1j+aGNvHgohnwYvcwYZZy9WWHErYjA2m\n", "taqH8Pw4C4hsQPESgFpja4gNFFsIQAHqNoIWu8fnrbPa5LG2pFa7ElttG+jhbLCSUFpFJaONjsyU\n", "4ZDaudAVPBGjaTCky0PP+l5BJgadDIwAxh9b68nb+O0PYyJt6htdAzD24MW88xWmlDywjcCcObFo\n", "l8yKFkDRzoC81Nmxr/hSIwIYlqu1LmnWAt6C95yFkeAltwrg2I0ZntyoSYIdIvVVtLyC4vFIot7f\n", "mgQOjQxm+HJsKzsntlZIi2kFuw1gZah+hwHidqxIuzR1/8/OdwzmTCeoNgLV5skbjw0aLoCMcsMw\n", "vvnx9mnzWOg5AONO4xcDLR68bFyeW8n4YZq8LHUEGOEMeWsnbWXtp9I0waoAxlbwtHUfYgtxWXmG\n", "KQlE4CKyu3ZlWh8IlKN+EAC1C4CzSHa/9XNNxR5YsZLXPfBy5ZMXfoqdp+eOibDPpHyHlZVWU3IA\n", "we2+wqeRES8getPyRSlZy4PwewIyUDlhUn0ME3CdMin43Mv+4m5dABmFkVze/vnx1UGMCGC05wAM\n", "zRAeZsnQH7y/8ITD1HUvrI2LHQgTdKmtArqImR7EUwjcH9deLiKdR4roXpy1vWopwrwoKtjJu21M\n", "AlwYS+R+ybhfZkciTQfi9XHxCX3RqcNoVnPsm6z7npILpxi7JFGo07ZAvfGgRA7q7wN6xsHp3E0Q\n", "zrN2hDmtDY/rpnoWu7Kak7VYWvW5ltoYW2MtOG3J69OG7Ghl1FZQW1LtkTaUrDyuBY/brOdCjsvj\n", "UnC/zDjOBcd50pr93nqpNfbrhYg8q2xgxjYL66QuPIgLMhfPXAsjQ77DgIzbuI3POdz13QEZgNGV\n", "IRk/he97Nq5/h73vpRnQWB8uwAVhos7mmnLX3FlmAyI6xdPZY1N2e3TU1w4BMDabF3u8R+YYMxTA\n", "qFiVgeHdp6IolzklWs5mpW0nfXwuCeeSla2ROphRGrbUUBo5m8+FQg3MaJcCiPa8aSRAJJlOUq8j\n", "hQ/YWvLc+ZD73fMPXA+3cRsvHVszcXMefCNgBDCG0i4tO00hkE/BIba1r5kza8ZpGDuwjjGwY+Pf\n", "PvfYBxnRqR0ADOoAhpUMR5Fhr7lWgIcBpNrksy1pWUVDJWtUlmQnE6E2aTcKJDB1urwdP7/HlzkG\n", "9htABEoDK0TZIqDx9w24MHFmA0CsY5swdZsCORyOMWGrDc5EDQm6m190GwC8A6OwJWsHMAiBgSH6\n", "F1Ym/vpuke6EplM4T0MnQgPbKrNqsEh5etXSkVPRpOdW8RiSyU9aTjICGL2ZwnO2aSjBorFLU2c1\n", "6fPwue4v9CSU+XKWiDKQ08TFPwXovMbCsMd70eKXbSs50MBMyJqwbW7/r5TCov/N9THQdTLYmBkt\n", "MPQic4XgmkyNOzhk688EYMnStnnSjpsD2Eyh80jYsAhkVBbtyo+Nrw9itMsSEqDTJGdF+Uz48qCZ\n", "v2VK2l/YnPPUWQosBhtQ0Rl1ZkvrGhBP61hC8uh0qV5GYU507zPcJa9soTwEpz9SqKzd65s7uf/u\n", "bmz/+upuHihWInYjwMySE+Y5I2vQISuSX7n9IDnUJiosVk6ihaHPv58buEpWoqgQjtG5n1Swx0po\n", "3p2KAxc/nTa8fVrx02nDT0+r94wWlDawVqbkCGoNSNrqgQbvFIalROe0Tjitcm4eDhOelioMlaUq\n", "/Sy7ABAI4Aa01jwQmVLydj4i/ppQWsah9s4stSVYDRgzwNSGBfs2buNzj2tABsLi5LJYVy7AGCh/\n", "LEi26W5U6t7ViIYgZwksL7FfyYW4XJ8nZylvmzt4ISVeUbsnOYBxMEHiqde5ggVI9PZnxqzY8jDv\n", "z6XitGUcN7k/bxVPW8FhSjjPHew8b7L951zV5vfvTUTIVVhfKYnuUV/Irzs2PDzowsgV3M3mMwf7\n", "BmDcxpcelo2MHSQiAyOyqfZdznJIZuw1d5gAblJiEF3CLoQ9sheN+ficA/ylh9GWo/NuLIwc7wOA\n", "4R2UrLTNj50wMASpSGBuQDJm1QhkEHqnlsQikilBzJfb+7hWAFLqo1smGdMGUIKWAhmrbAxuPEDT\n", "ZJf8w1pOQsgkegECYLQe3AHiVOlxuPlFt2Hj8Vw9FrJuaYkI8yQAhsU+r3dxjyRrtdzfS/133ctM\n", "o1DLR861l488rT0m6eXsXczTRcGfYV+YTxTFf/elaDD7ErNINrjrkCUDAcjYCDKvBNAknYw/D8gA\n", "RibIyD7r29hZIyN7ZIjzdHt928Foqdv3rgFkid3wOf1HWOvNtTEcHLIQEm511OaYHW7ub7JulrHk\n", "QFBSQlPNNcKcytBBy9cq8h/ACVJOwh7Xf3h8dRDjGoCRyHQwTDhOa7Nzd76lc0foLaw73Bh6QTcU\n", "6kiyBc1DCYmXTRQvkTDw4rSZ7oUp2+q2mT5HTq5zcb9Mzqp4fZzx5m7Bm7sF3+ntzd2s9wpi3PXJ\n", "fb/MOC4Z8zJhmjPylKUmZMq2GimIsTtwkSskRUzIzhdM/bO2su0+S40xNcZUG461AaWhlIqyVWxr\n", "YKhYf+jQYunHpw0/Pq346WnFj48rfrpb8dOTABxeerIWTCtpmUmnw0q3gtrpYrVhrdmN0rkIAnve\n", "JpwOE07bjLuteuA0qxE0lVqvo2uSGjFmjLF3ltxQpiQdaXJCnbLXejXLttR2W6hv44uO60AGcDk5\n", "w2fC6vKxwMGAVW+RqjWH02TZ2V6SZ2DwwLrwmzLdFLi409K2YwQ5pi5APLIx0sDIYIaWjRh7QvqG\n", "H6aE01ZFR2NLWMrYWrqzqjLmrThy3xH8hJyqCheK2nVWVkZKFaUSCGJzCNBF+3KdiefGMqsxC/1x\n", "Wmk/N/2Tt3Ebn2cYgDGUkewADGdrTn3u9C5mYztVZvGzq6oH65Wu//cMXOVeE82ekfvyAMY1fzwG\n", "IWNnkhicdN2PTB3UsCzfpJ2SoLr5zAJOcNP2q1UDFGIwiS4GaUxiAQMzD8yLL8nGeA7IIFaAVbU7\n", "SLe/sTBHjJ0BYDgmcg3IH3KylpOkbJTY2UU/Xy+BjNv4tsepFNecAOT6nzLhMPXkrcU3b+4MxJi9\n", "jORuzljmjFmBRmGD8aB/4RqFa1Vdvt4p0rT5nlZjYPTkcglNFWzEhE4sqd3PC/ubfSYO8Qtk7lmw\n", "L6ZT5o2Bmq2ZDf3lY8+uSKmz0QzAsDa0fdvpepinr7hosSbh3c43RuJLLTHzh8z2R/DCBFcN7LBt\n", "jcdYQInqQLJts9hiiH9XkwhQJ9HEyKmfr3gcwL280QgJHxtfHcS4BmAYUDAFquQydcE579gRhC4Z\n", "XUiOWWiCNjlibdXTJuKc7xXAEObFJuKVqwjHWNeOuisdyakzQqy+69VBAIk3dzJ5v7sX4OJ7vf/u\n", "/uCvCYAxC8XqMONwmJCXjLRMAlpMGZiSoTh2VvsG2IHicGYNxKjaEycHAGMAMnbfE1gZqAxUxlQr\n", "plJx3Cru14rv14KTlpVEIOMPTyt+elzxh6czfrxb8YfHFT8dV/zhMOPt04rj0ySlOZMKAa0FayE3\n", "gmwILFetU9WWrzW74KirDx8a7rfsSK4FS6Zua4fDgCZD/xKRA2BzbVimhNqydjXI4qRpJiaqk9/G\n", "bXypMTqn8dXd+/bI+AdGdOazLyDUS0dS9p7tva3zdLVT0lFFhU1dfOiaZKV8U+plJsrgMFA56vjM\n", "CmJEUcGYEQG6g9GdidHJSJoldGaJ0Q6T4rTmlCgTo5PPpMa7VMk01sYgFs3+DwViI5jRgYprWMbe\n", "VtxMx2187mHtiYHrDAzzhZbQzctEPW0e2ZBkjjRn7te3kTh7K2Tp6tUF3aIOxtdmYHh2dHgt2gyd\n", "myGDCQ9OuvuUkgQjhCvtlUn0LijMeyIC7Yy1gBZfArK4Pnh4oEBGa8gpCa1dASkLKlpTECYcr8hY\n", "iVdCY0ZOApJZh6pENSY/IeHapdjnbXybw7owmn89p6Rl/aL3ZwxzS9a+uRM2+sMyS+m/lvzbnK7M\n", "4MoenG7aeeSk5SKP56oMedEqFAaGlJiaiKeX2kWQFyO4KT4DQFqKbiUPscOR2AH5vPkAgIVIPAj+\n", "kiZNHchgKw9m72oU2Vo/32LsSukCgNG7egQfCpHJsQvzdD8cONJjVknLd5jRWm+zGsEMIbq3/tkI\n", "qhuYYVtsx5ysuUXDlMlZLHY+TOxzUgZhZAzGVtG25pgmEzaRh/jY8fzqIMYlekbepu8yM6ePlTrZ\n", "2+TJDhdtEQMiBTCkxc5aTYOhOD3JmBidqlR2XUf6diUSGsxhEi2Ou3nS2q8Jb+5l0n6vgMX39wt+\n", "uD/g+wcDMw4CcNwvrouxHCYBLpYMzHrLysAwECJekUC8GnsfsMYCQgwrMMbVew9k0O47AWdyoE0C\n", "hpSGvBXkrWFeC16tBd+dC96eZrw9bXjztOCn+xVv3s/48W7Fm7sV//T+jIfDhB8PE+4PK358yjg8\n", "ZRxOG97n5OCRdTMxDMbFeNjas7JmbXtngnOZcS6tU9uVkWEZJ6A7XKzOh+22dLURIKPkhq0Jnak1\n", "E64RI8W156Zu4za+1DDf2J9/4JJ7KYARqdVWQuLlIw4CJxfkPBqQMUdAYlIgQ4U7g1CysZrmJMKB\n", "ok2TkFIK5SuRuWDAsj8LC64BLgk5MSYitERoKaFlC6YYjTM892netXsYk35r9SAmLvjUrJWkSePB\n", "KbCWhf5Q5qRv98fP0UvO023cxs8Z8bojQgcwlO10mHpyZ56yaoIJU9HmmXyPilpLJO7fzeitDL0N\n", "uzu1zapUfxaA8SXCfdrdv/xTBK27+OR9+BLjU49NZGTQjhoh4sRGEbfsKfnvmB8kdO3oK8lrxVT/\n", "cW1/pVT3a4NXt/HbG7Va2YTobJn+38MyaRI3Ms8XvFYQ4946kai/LuELezfD0hpWBSesxF+aB2wD\n", "gGF6HBYTXJUgQGcueHvpbN3YutBkSrFEbbzqeW8fmUCtoUGYFwkE1qozAzJqMNTBxH5SScngv+wm\n", "4ocAjP5a97OuMUgjINCZGORdr0QYHcrCgwMUDoRUTfbaczaWnn4/QthJwqywsqEpESa2biQEIoEq\n", "RIi6OeixB97tex1IbwCzgGkfGl8dxLBhJykT9R7nkY2RslIlk7Iv+sk2AU9moKDTH0tQwD9t1elI\n", "3jI0tuvZqk6OkP0goSeKvoI4+TZppe5rwQ/3wr744eGA7+8Per/o7eCo5MNhxt1xBh0MvJgEvLCy\n", "kQheDFEOglw4D+UjzsCoeq/6EMisvbh4BDIyAZxEuc6uOEC5lKl//9Rk20oFLRm0Tbg/FO37vOH1\n", "cXOq2KvHs7dRsl7Q1kr2OK+axU14d8qYsxzzs/eY1nPGjLYJ4GQdVKzDyFqzt2U8LxPuy4TDXBXI\n", "sOtBriBhZDQp68SIDEpmOmOuLGUlTVSMpyxCNMy4UOa+jduI45pT+3Ouln2Q/Knf1zOG8PbDvlio\n", "CPAewLCs7cFYbSroOWvb1EVrxw0YnKi3KuzOr3Y5YtbOP4RURSDP92UCqMqeGEhpmhjSHpWDmLO1\n", "eOz7nWhE8708LEnv8sZZ329BSewQol9SqoDCfpzUPhJASU1lQDE+Bmb8knN1bTwXHN0sz23E4XZC\n", "53c2BoYmVEwkz7uY5S6SFvMUFbLEN4pzpou02VpoYtxVhUSrOaovCGKvXdMOAn7C/pJu8zX20/Be\n", "y1Zw/yAzA7qWm8MedT4Y6I439+Ow376hrfWzv/9p+7bfnf3zj9ogBzLgQiaJyLusJLJsafbtlx8K\n", "7LZEDm8YiJEVUE5UlclSx7xZBhp6GcFtfJtDq7WFjT5Lp7I9gPH9/UGSusrKsHaqVuIGmCA/excR\n", "Z8ivoUvkecP70xZK/EX4ey3NOzXtu1iajbS2naaLs+9W1Fmh17s8mj0YGB5JUAtLqiQxMwNYAZAy\n", "MX75PDHwMQobG4Ol56iDLpCBGoF1da0V6cjGAApbN5ck97WhsAr/8ngM7JgUad/U1wWzv+E8dAaY\n", "JLrmTJgzu82eFFCVmKx5m1Xz9wZBZwa4RRvOKOuHO5T8eiCGxu9SItJrGafUnWtRp+4HivVAF2q6\n", "GPdaK2vrd/ZJImUNj9pr+EmZGdbOr1hQrdtjqtdWM35n4MVBSke+U5Dih4cF398f8ScPwr744f7g\n", "jAyrC7s7zpgOs4AXXjqSFLjYMS8sUrgALQy4iKCFgRhya42RnM2h359DeUpKAmRcsDMCcEL6XgqP\n", "BVYDTRkPswj+mRqxdVW5m/PQGtUoZIfZAqhN+wPruTQgw4U/GVtj8KbZoCbBzqb365KxlYbt0HBX\n", "M9apeT1wztq1BCNdSvanT/qcougXY8omhtpFy25r9W3sx4f86U911OP4OZ8Zp2moQzQAQxcN0+1x\n", "ICMHyrnaVLtPWdrzxcXDwAqxpYxUO1Dh4n9NAMFSE7acMJWEZWr+OwxgK6IcLppE+rg0bE30hmJ7\n", "tNK6wrjR2fvCrS0EdbtLYkxJaInNFrqpByrQvIkcZ6VGo2F82LNLHzsXn8ssfKlr6TZ+n8Pm+ZxG\n", "Md7jlFXTxsprTTAvdWq0BfKNRZkeo0tR2bq3dfDCBT1fCGDE63nvN7uTb88/cd8Vkxg+7ywC8/+U\n", "xp2UiVCZQdxQm2T7KjFIA/zq+9p0P+FtHXvZjP1WeNK36BP3YNx/fx5eeOkxMuDF1LsEl9XH1JAo\n", "oahoaU5Sp89J9sFse8ziAuI75ySCyPuSP+waztf28daGt/H7HilZQte6kFjJ/HhvHRiPy+SdSAAN\n", "imGaLM0FvI0Z//7cOx7uAYyzJkEuWk3rdeutpil5iYJraOUx02/+hC38rvsAKRlpjUFSfQr7MSZC\n", "ggT3oK6bc5FACeOX5EOvArmBZSHsKfIwrmtRdJ0PY2bIhtr3Bl2MlryjW2lSWja1hI3kubWtNy0N\n", "RpdrYNCFrbLjaiyXi5grCyMDgAMZc0qYUlPmTC8VBDo+HW0zg/H4WwQxDDnKIQNnop5RadszgyDV\n", "NBAHu4FRQQMDw7L3q9dZFe18oeyL0lv0WMcM2xZTV120fORhEdHON8cF393P+O7+4CUjPzwc8CfG\n", "wHg4DJP54TBhOc5aOmLMiwBeAJCVKcJd3MtEjNuzZ1uUJgtxZTQDAjS7aZnYlAl5EiQsGRBhnU6G\n", "55qedGBjf2KSsrdltpAem9caLA1dDuYpCP4piDFleU8OLR5TQk4FaS3YAGx6/J2VUXpHGdfM0Im2\n", "tYZSJqxzcyqtdF2wxVmvgyblRBakRFrllAmlEaZGKJmQm1LERHb4a1zyt/FHMCJg8KHx0kD4c25P\n", "pBZ2rYjetmoywDB3doW1H/QF3SnGshqbSK7pCNk+CfWwgxW5mn0m7wYkVPcOkpgmxlaF/rdpGZmx\n", "MExR3AR+x/foPK9KdWRD8fv+e1cCSsjquOem+5kJjOT06sYm6CcLLzcxf2wCh1/h/H0o2LsYn5jl\n", "vY3f5zC/yISqHcAIZZW+BpqIGllbTQUimn4TswfrTiGuPWHgr5nT+gEAY28XnxfA7Z/+uXPMAgub\n", "p2zghX4Zqc9XuQEthe3raGXUSzMGWG1GaW+IFGuzd7bvnp39CJjz3PjYseq5q+5/PsfyGIAMSY0C\n", "sJI+hreNbYSaGDngMDGosECOkxy73prWtIWqbnf1zPJpu4EY3/JIJIKMB01Wmg7gd4F1HuMeEwTP\n", "WvYf51hpIuhvyeX3Z2kgYB0O35+30GShdyDbixxb2UJ2IX8pp5u1jbz5KJYUJy0jAXY5Yx71IizJ\n", "wVAQlZXNuZuQI4DBv4iFEUEL9tf4WdvqrAd0NkYKft2lgOm4zbbP3SZKzGw6Oda2fqOGRqM+U6x8\n", "8O0P221AqMXyIzO4gVmS5O7DcW+JnUwmYjg2HfyqjfFPWD94LL86iLGnoIwUIMs0Jj8ZQF9YqjZP\n", "pxac7dpbqZ6jQOTWew5Le7+CTZ1kLx9BF+88qHjnw2HC6zuhSL0xvYv7BT88jOyLHxTAMIHP+8OM\n", "+ZBByySlIybYCXSQwsaQHmm7W0Ur6vyrXkcMCLbg9Auynvokzr3l6DT1OvlpIlDOAcxIun07DY24\n", "fRHQgCyadxQUwLMFMf23I3DRa/RVeCxJNuUpEWirWNEc8RNAozqI4WCGsjKqtm08zhO2Ks7dRgLe\n", "GMDa/HvMtOjiHShYkU7JaGjtY9HFbXwr4xqA8Vz9pCHyXzIQvgAwQIG2ZwBGpAjTgM4PApv6Xc5a\n", "ooZKIrwLyHJsi5sBFntaZgeWO1gyuS3obQ29dESZbs62iMFTbSEr3BS4FBZWVXvnWRijo4Zjb/uV\n", "HMhIaJpZ6LXi5E4PoB0WyZjZXxbIuAZgPFe3au/5JVmc2/h9DCI4o8rAiuMVEMMYjmYXjGGEpsE+\n", "mlOIO2DREwS1iSaVzasYxA/bE7ZL7seA4MoeADBn/GU2koGdAwswCSPLmRfw+F1e92xpQ0ZCbyMo\n", "876yZCIrd6CmBt9iFDY1va7QnYU7a+slra5/zvEyZvHwzVfOgQMZGmwZ6ySRlZXwcI5burSVth4A\n", "sl9iM3nM3uqvMecbmnobmJJo8EhMFDow3oebNi+4P0gr9iknB+UGAGNrOK1VgArtZug3BTMMwDiX\n", "qt0NO0QgoQgNiRO/TSHuMBaGMRQQYsgQkBvzzMq0uHEHL+wH4xzgvi37dstmI/z5Jx5nK7mIoIPA\n", "I+SskcF3IHjMk3T/enemAGoE8MaBWWiiWBkZsyaLjR2bU0Ku83AuAAAgAElEQVSu0rVyI9Wc9Fgb\n", "4NaAYt/VQVhjjJj4urExZo9HG6aWQFmTygixaU7I6LaTA3gR/b4PjV+FieGImjrasTY7JRoBDEWP\n", "EgGtArUKQmzBrzm8a6naqjMAGaX3Oo6dMgA5aJNmO47aWvDVURBHE6z5XnUv/uRBQIsfHg6qidEB\n", "DNOHmA8ZmCZ4/YtsoHkVzwMXpaJqd5R1EyBmLVU7pvTacmGQtFBf3rQ0omdF7X7JGfNEof1hHkTB\n", "likhTQHUGNq7BkBjgPUzaAYOJEd/RAWNrt6zwnYh99IgINPWq2k2aHkJ+yQpraEV9qySBTC1MbaW\n", "USrjMGesVSm1bUTxIiXeJpkHc7ZtqaFlQmtyrd3GbRiwCozB5gWu5zbp5U76z90e+/0OYMQpaou0\n", "sStkQev0SfLVhZlRwcgs7c0KSTTAqGgsWjG5drElUs2ZWFdttGNH0tO4cBrYwdDfCIAFa8DkYoOe\n", "HcY4z3kXbLmtU/Zd684H+0GSuZ+JUCnQG62VYCK0yqGuVD7zNYAMO3/A9WsqXk8I23Mb3+6YUl+j\n", "D3PC/WLtj6936rLLJzGhNFWOiW4Gmxp9G9lQBjKysTCuAxjx+rX1fh+ox2u2Eft1HW3kS4ZlN00g\n", "2J4D0mY0AU620KoJYVdxRUpJ/cSKFmyRB/YOVvTa71hSEoGc1p7dxA+OawCGn59dNtj3lzRgcUBD\n", "AZt9Blj/aY0h3q8m80Ao1JCagLmNG6qCOT1R18FtsjUhCcDjrREtKrqN29CxzAlHBzCkTP77+wO+\n", "vzvge21sIMlbsU3LlD1nuxUp97fyUekEKeKd71T/ogMY0jnSYjYT/rcpkAjCrNDE6JJjHJMxZepl\n", "5q6DcU0wkrU6v0mJiGiAC3hBoxfA3MM1s42usRPe87nHnp3RWPwY2xbrUOSD+r6OySxlohBAu4lt\n", "iSwpKUnYasOUG0pNWLeGlSpWIlARrZyqdtRscmlXSkuo27teWUGa4CbMJWHJYl9NtgEIbAw7B6TH\n", "2VUUesXEh8bXZ2L4DpvmxdgWyjKOQEdlWmNsENcb0GC1MUrrNdfnUgcmhjEzDMC4mBiq9n2cp973\n", "+DjjtQrWfK/inQZcfH9v5SOzgxc2gedsWs96tZVAxdMrkGsTxdfSUGvFeVPgZWs4l45C2uvn0mlV\n", "mzMwqjv1pi2RCJ1Knsb+8b0VYgcxzBnyNor6elYNDMoSyDzLziAxJsc5h8VWpjdpADUEWkTh9fCc\n", "jJHRxVUbA1wZK5ojnG2XTSmNcagJJSJ5A5DRS1UcydXfN0Q3KYCR+LZyf+vjGoBxPXMm99ec9C8V\n", "CHuQG2zmvt0gwUSd+kbboltbk44ilbFBahsrGJUatpqQUxtAvg4I9lrpFI4NUVDOpjjPkwOCzeYq\n", "W11jF16OWQv/m3roliXwwKJJ8BXnvWWRHSDB6Fj07SPNUpL3qGeow4LeGu1LjA8FM8P7rgFkNxTj\n", "mx7TlNQpFw0qAzCs/bE57ybuC8DBPy9WdcBQmZtFtMIMvChxfn4EwLiotYatpfpbMBaRJgyYVABP\n", "vPGXth3UeN63H5A2qMlbnJJrQ3BlNM36tapznCsqhHVZm4CY8djsAQv2+7GcpDXzLz+dhTEcP7OV\n", "AbwwAMH/JbPT/fubmoCEy/NiQEYvg2YFMJJQwi2YIWFjSJtE+T0BuDvDGeggBiUCofoJsITSbXzb\n", "4zhrK9WDABjGSP8uNDB4dZhxdxC7ZBp11pa1aHn/0yYinlJCImUk784b3j0JA+PpYwBGKK0z4OKo\n", "Iv8W38xaXudJcLdXoWyEBQwFErg1sAbowG4OhrhjEAkO9mD0acbveMkwe2egBbMwQSzp1CB6HEwC\n", "SKZgjyTEVPviyVqzM6ojFoCNASTAaP8M1F5UiH1K0iI1F2G15iKgBpQxa+CO6WTIsDVCiQGpi7NL\n", "qU/VW8IyEZgzCNplUkuDLCFnB8fsdFWw/WPjq4MYxrToNTyjcw50Z1eQZ4HNkl1ojFBq0JSxEAL/\n", "reFcKzYVkrQsnl1j1g1lmRLuDMA4Tnh9kAlqHUi+fzh4BxJ7/fVRuo5IhkQmjmUOSKk2JsXE5pBr\n", "+ceq23baSih3CaKjpeK8yj4Yg2Qt1rGjeinJUMvKHZDJFEo8Aphhk/4wpwBeiGN0VMHOowqHHZeO\n", "cOacBNjYo5pNIMxEhDmJEOr9MgUgYr/0XlHcDY4QAKylAvp5hrV3aj0DwSbKZQiitpmrhsDuBKxY\n", "2+0GRyWCZw6g/cysy238fgYFA09ujK+DWwwAz2QbPxeQcREEoytU20Lht322wZ11pZKDQTqXGjNq\n", "IqSqWbnULgMUZ3DstinE1w76EHmbvsE5bjE4UHhiABSfWfDtvVDcFxp8aAchC7pijbsFYdG+922W\n", "M+KxgzoMZPf64hc9d8EmpWeuKQBg+iXVtbfxexnWhcSEsu9m6/rVO5PEVvPid4jOg803E+Y13S9Z\n", "L8VXqlqaGefO/rozh9cAwb2NiL6AgaWRSWA+tduLT8DmhkwkC7ODWIJwZpIyE9IS9ipJkwQGNQVc\n", "mjKy3I+MwEX3L7rmhQUHPTCJwMKnjr2fY4+TGm+z2REE8nOg+9magRl80VIyAhlEDGoNW5XvzK0h\n", "N6ltL40wVULL3aYSdaYzwRracWc+mwH/JQfgNn43I+pgWAxkXRjfxDKSWVqpAqSBLnvMctpMA0N0\n", "L96dNrw9STnJexX3fNJ4yGIbwHwKzeYPidisrI/krLRFBY5jNxIzjgY0WLxkgCUQGRU82AlhM/Wk\n", "qgOhGAGOa0Dfp8yaDj3YdthcVQDDWbSyP8LCECYZsXRMkRK6HZChu+9d5zTBZHbc2Q4MF1XfasI6\n", "aQy9JUy56jGtSEU0c7YK11QyEGQtDVEQmCyhRcl1nUxaYJkSlpKwZGFyWEn0lHmI3yTaD0D8C6hx\n", "v4ImBu0ADATkzC4ERc6a7lLImNsiLcIkUoJhLf3OzlzQ8pHaxZsAeKBvjAQDMF4dFq/5+t7KRe4X\n", "Lxl5fZzx6qgZEa390uov1NawFnOEq1/0pXadDpvMBlo8KnDxFO5PW2SRdCZGrA/vjokBM7KQu96D\n", "l3PQwMYwwc0uEjYFJ0nvVZzn6OBGxkFFPK2FkS3AjsZBqmdmdb7KokGGBR3mOLizROEcj2PTchlz\n", "NIR9067QPpM6Ywl1yt42NVNQaUeo/+cxiLKshBnK2/i2x54q/VzmXDpniDPdnNPXs42/5rAF0Gnk\n", "1a2oZEUaXAk6pb6vGBzqOE96gONZiiv7+Vx2NrY1HD8wOvcRiBmAlPA99tvmQHg3hRrp4iEoC58J\n", "P/sBCOHzjucAjAiW7YcFUp8HSrmNP9bhAIYyMO4XWZ9FQLsL6nqnNubOUACGeWFaWmvtYrrbIOT5\n", "PIBxwc6iCKTa/NTvUJSikZViMMDChIr28WNAobnhNoeNudD3jkGagWTqgbkVVqQUOxvpdwbQorFt\n", "dXfigTGoibYumruPzco4q92e6XaYmHKSP+6OI8PFh2H7zSoySEDiC4A2AhnyRNl06OzXot2cSpXO\n", "UZ4zpU73tn3PzTK39avaydv4bY9XB21soDHR9w8q5qkAxqvj7Cx0IonVKqDxUMNpkxaq708b3obb\n", "u9OGdyfRxrC45xqAsajexRi3XAocm7B4ZJK6L9Qs6CY0Gq1J18XZaTAMt+bx457RBURf4+et3DaX\n", "jY1BRGqP1Fo2aLdXFnZ8k/fW1kDIIGK0Rqgm8pvY0jaAgdCpsyOspIxgzRCylBpWxlIb1km7zW26\n", "1mzSkMHKizeIBIKV9LYmTD+gePIvlreYrICdy8XAjJaAyZgiqevzePwmJSXGwP3Y+PpMDBodPF8g\n", "0Q2oIc2mGEuKkVvwbFoYJkoSgYxNWQt2gXYAAwOAcVwm3B+kNdAbLRF5rSKdr7Xv8cOhtxA9qKBW\n", "yuTOtLQBYgBdlHIrqsS7VZxKwZN2SHlciyvz9udVBW1COYmWlGwOxhgNVFgdHSW0GqOo+xC0KCIj\n", "IwAZxx2QIY6S7Oe97q85T8crtbiDSFTrKGXWGqjDlHE3N5RlGoCXHmhYRuRK1qPgAsgogLMyPDM7\n", "QdVrgak1zK1T4x1ogbExuqMyZLeDQ3Yb3+6IIGov0xivjGYLTNNMIHd68/Bd+EwZfdo/H1+ITq8F\n", "M511V8EpgWG6LzzsY7zqPRBBX5BHunW/jwHA1W0eXIRr+zSWqkThrXRtPRgCJv193x7NsCha32rX\n", "y4h6OPFYxS2Nr3xKpvhD41ogA1xeW8C1bLZuw60hwDc9vHxE11+5SQcwY1b2GmkRXZPAv2tHFe5C\n", "4Fu4GSN17xcBHUxMrlM2Kt7vAUdASw5I5yMISZ0RA0j8u+nlQK+578AI6lW231YXnQPrST+Zmj3Z\n", "AbOIIGF4Tf+xLRvE+T4BwLARQUoKz2OLx0jrthJA1h80OyDsWgkKDSvfd0sx3wgJoCY+ExGEZZcI\n", "WWnhlZOKIydwtiCjiyITTG+uayvt9/82vs3x+m7BG+3M+J1qYbxxFsaC+0WABFIbIAAGdwDj3Fuo\n", "vjtvePtk7VRDGUm5BDCydkBbtNT/uHRNIAN0j8rAmGM5edJvMHCXGUVbrNuy6qwLAyl47NRk5RVS\n", "btc8YW7A6h7A6Dbl549g5gBcAhncoKUmgmh0pQIpOiFIu+VKjNxYdIlSNxYGLEzUW89a/GOd3ERk\n", "vWGrGedSPQHe9QwTiIqZV6COTRlQGhLJhplvN3kcSs6Ykc6WGUtumCfGnJVYkEyoOrn1NgbNb5OJ\n", "YcYcfXEEDB3rRrU1FvqgsjDccQ0t+9ZYqrFr6ReNfiIgGbJngjWL9D5+pajiq8OM1/r84Tjjfp68\n", "LtXQRob8/gqdeOoBF2bUAF4Yw+LR+yEXPJ63/njtQMZprUEPo7pI6aYtcEyAy1glHlwEboMdy0Gl\n", "NvVWbZ2VkVUHRNDNOwcsui6IARlWNnO/COBjLZTmnJX5QL7/XYCFHHk7zBnHOuF+aQ4qlRrr5Xu9\n", "WRyt8FBaYtcBSnD49b/aGHNLg8BpdCY8yAtGy37N6uZv49seLpo5aELs3tNT6l43DfQA+EsEwtdG\n", "DMjNvjX/p4/GDbVB9TAuQRH/vAGKzGhAL4EbgNLL2s8hEPjo/ozZUQMae9YXQ9C0BzY+tO1GbWTu\n", "7DwpP+k3O2hfe6bH7Y70fGAHeOibb42SbsNYkPdhXb5bJsk4arbRQIHSEqg1n59WMrKVLgheQqvy\n", "YgkQXAIYNveMjm2Oa0JnK160Cg3AQDP4QcFeUj0LE/r8lHEJZPRMZXzNXrdR/b3jD177/edAlf3L\n", "P8dmGPi6T9SZnYtAefgUXAtEbTDpPhHI68MH0AVmAwGqDQRCpoaNEhJVDSQa5pRQJsaitpyod5sS\n", "+jd7t7lrtvY2vs3x2tqpPvTbd3cLXt8teNDEbs7aEag2NO4NFkTIU2Kdt08dwLBOJAJgiK0yf8oA\n", "DBPuNNt3p3GK3VtZiWX3YwLEAIzKoslBBGchDe2mXeiYB7C3DX5E9y9cf4sv7dDn8CscsgiIRtNH\n", "iaFt1aQsOCdTP9I9owRop6LSmgOgOfXYijGCC+Zv+e8rYLBVVpChOMNlzqV/LhFoFcbW0F2SrbTE\n", "YtAi8ad3sMxYps0Fqw9zxqE28JRBZLYnO7Bq22Tn42PjV2mxCndOe6YtCqjUJoutlWxEAaayAzG2\n", "2lBKzzbUKwBGDqq2x2nC/SwAxsMy+e1eA/i7OeNOKUyS+YBnHKwl4VplozsrRNgTp1LxdC543IQu\n", "9X7d8P5kwIVMZGNfGEPj7FoeyiRRMZOtjkjhXoQKO1fEnOS9U9JbIEq700WpWIc54ThNnu0xVoYf\n", "F2WiyLGZ/T1HPTZGbU1J0E/mzqKAThIrMznODWvNWMuEzcXFrH1iRDllH7edRgb0u1EgxZzKwphb\n", "ByimzGgpOAmO6HUa2Oc0PLfx+xiiYTvSpkE9X8/6j1zWtmDys2yMXzLiYhYdSqMaAgF8UKV+NICT\n", "ARDSYrSzGZRsTTpHA/PC2yra3Guy+A9zkTHc27bYXn+o/dUepO7b1AEMs1m9E8p4Lvx9GDOdA6Ci\n", "+9WpofDHpgUSgZ/97P8c4NNzo7MwRgCj26hu327xw204M/LQAQyrAc+qhdEaq7B+YCTpmrq17gdt\n", "ylIt2q7dEg0DCAA4zbi3xuu15eZHAJ0JYfaDDSRUX7pB67Sv7Nengrx7kOW5zz7L8IiZsU8cn9Mc\n", "RNvlNi1owgHdD3YmXFKh1gSk1lDJWHYJjdugk2EAdgE0I0sgqkiZMFtw1hrm2lBzcntJ6J2mCAkt\n", "SVnJjZl6Gza+Py7eieS7O+3GeJzxamhmAEB9hc0TuLXrXzxteHtavZTk/XnD47qp3l91FncHMEY9\n", "oIfDyBJ3RryCGAbEyWb0rmZcfdPAWt5eNEjfWsNWWJsl1IGp5gnjyFgLyRz7TuDzxxAjkCGvMBOQ\n", "OhuDTTQHBEZCF9e0IcwM8S/EHmRtPW+FJtIdJOoIil23TnVradrsoSqYYV0di36++6YbesdPi88I\n", "xTtQTkRdmFVvB9VodHbGlLSkBEiUuzaGXlfltyjsaQGCDc+sq0iJpt9BAckfULTWQYzetaOrbl8A\n", "GMnoSaGcYhGWxX1wFrrDIEwDo9exoXp6wk5bFadZf9t0L4RZUfGodKkOYGx4pyDG41lFPE0fw3Qv\n", "tAPJXjm8MUtwYsfK//nwsY1O/74lolGwotKvZYDu9Jg8LGKsHo4Kahw6M8PADO9ZnwhZDZpMeDkf\n", "kpWB/6aUmWRsdfIaXWuhuDcaEig16d8cgIzaBNqySmC5bqy9GqPmjjJ2ytSoj9GGg3hbtL/1kVMa\n", "yi0uqP6k64auLnun80sPs41uJxGIF9YmzLaTrBRvzKpZ8G5ObEMQxfTHgYHRImAa6sfla4Zt+9Bw\n", "p7gTWeTpAGB0OxVbuUY2RmRoyOfHffP2ZwHEEAADw/qxp2V/jREzrhFgtuf24CX90G/j9z3ulxn3\n", "y+xJlbt5Uto0qSMKVAK49HWtarbKO5HUrgsWu5FclHkAAbjownhGzxZHNPVSEgDWWq+5T8LS8cdA\n", "OOpsjM9lH3/Wt/yGplLsJjWI2kfmGfqxZZYsam1WKswgknKR2gS1jkAGq72u0ExskyTQmgiTMnNK\n", "1iAtBGME6yqlj2sE8m9+0bc+vrNOJA8HF/N8dZQYYFHB/xZsz6raf++NgXHa8NNpFSHP0+oM9NNW\n", "sdYAYOh6v+SRhRZjjvsdoGsxTCL4el5l4UfzxHfXvRCGWmCqaafHWG5Xq5TitdZ9IPGN4N9n40uZ\n", "lxiVmM/WVAeDAQczGjMyw/1CC5B6wsha02oi2/bJfdhR9NMSd60xlkniWgMdpANkkZiYusYPEQFr\n", "AXZABhUgadvmnERPMXaXOWh1w2HOOE4VZc5YoFIIQACmJEn4mywnuTbsgiPuJ4q0D54ZdqMBVQ18\n", "rZbKFuu9WJUtGlNAgUwP4k7RPtOGiGIxzi6ACpdUCZi3WgGn9rGLb55WpU+dZfIaaPH+tOmEljKS\n", "x3PvSnLWibxalsS7jXS9CDsu+/Gh5WX/fgopPq+H1MyLX1wm/unHJpaUGIghQMarw+yMlXs9bssc\n", "UVHocQO2yp5RNqVhAZKagkmTLLAqWmrdRBy80VlrIjIWvHHz4lc531lCu8yExsnBmhjIOZDBUZMD\n", "+E15O7fxqwwXvAzsABsWAEutt7zg2XN/8HnHiMhHBgZLyy1AC6f7tnElNCJQ6g5q3we1JtwXsgEY\n", "ZkH6TRE6shsM7/sIbvrsfjjIEUAQshc8OBo1IwZRQVj2Ev7Yzk8EB1g3ciiP2T2OGRQHPr5QVsVG\n", "3NaBUo7La434Q5b9Nr6Fcb9k3B+MPi314EvOrh/TGGBq0Nnaa5lL9RKSrVRtq1o9UWCdw2wYgGHa\n", "WQZiTJm8NtnsYmQMmV0A4JQLJvXXANANiANgCaTAQtN/LRMa2S+RsRZtU6WGmhKKtpEt1CDWfwQy\n", "eoKHQbW5jZlKw5oqpiRifaIVl1CnNCT5JgWqTDPuJnZ+GwDw/f3BhTzf3GmZ/WHGYcqe2W8au6xV\n", "Yhppo2oMDGVjWDx0ltJ5i3meAzBehVjj4dgB3ahLKOUHZhNNt0LBU3SGvIkZm10U1ruAvCZD4Mz+\n", "FtmcPPgIX9uqxd9jFrtKZLaWtRtUQ3NRYFZmBgKLl2B6GCkJSDkl8iQukcRKUyjDt8RVrYyzVi7M\n", "A2g0gq8AHMgw7ZCtNdCmiam0BU2MTiQ4zF3S4FAaeBa7lhNhsm2GlUV//Oj/yiBGzywSw9VXOdQ1\n", "miMaWRidjcHXAQx0wZA5JyxWh6OlEP5YNSLmLNkOC2QAATBWrZNaVU1FQBP2SRtFO9+dA/NCVXmF\n", "fVFx2oSBYa1ge8eR69lBu0BiltKefwjGMLo40B34nkVlpx8SACp1YGfYBRtbvAkKOksHF71/OIh+\n", "iP39qMJj1v7NWGZO69aL0DKtUzYaUcVhzl4StM3BkCAakQ46xAW781OEVjVl6f+cUqfUx/V4DGjG\n", "DPNtfLsjAl4XNXkKKSRdGZr9Addn4Ze4nJghrfBYqOQpAY1I5jERuMkCRyytBvfb01kKY0AftXU4\n", "BDnP7UNE+ceWtB3Jty/whdW+8xpgEIFEVsAVcAZcqgFYStrO1eZ0/N0X7G+0hYyejfycw8Cna8Oy\n", "rYPmR6Ih0LnZotu4PygTY8fCoKTMhtpB1No4JHSUFaqJkbVWf80ccxsRwJg905YCbZjGRADCvGLV\n", "aUhS2ck7ata1R8DXu7Y/BKh+zWHBRNyggRlLnR2bgn2zbRV/V2vbSfwiqmo/ihn5EciQYA6gKsyN\n", "nCpyIcy5Yi0Jc2aUqSeMgKxrnrARQZCSkh24ehvf5rCWqt+pkOergzCwrYzEhIKtQ+RjaKX69rx6\n", "Gcm7p00TuAXnWkWvUH8j0yWAYU0VXh1mPNzNAuzOEw7z5M0FInPAykYLSMutrHREOjOZPTwFAGMN\n", "QEZsRR01tn4N8OK5Yf4MMTvjNqlPKIlcch9uv82UANq6zZlyw9TUb8zaijV3ew8GeGIsU8Ja2gBi\n", "RLs1jLWAuWo5slwb503ZGFQ8DvfY8mRirRPuZrFPS2akbGxAqIC1MWE+PH41EMMMfZOknASmimD3\n", "8omukcFgZy1Y/VJh01QYT15Ku0xDoLN0lVQRhpmmNJzAxg1bEZd6MnEYBVGknqritDUR71Tq1Dst\n", "IXl01HFTdkYX7FxDyUjMDALm4GJwHnIaF7uhcwKNC/Y+u+jifK3XwnahGvbj7vtVRc/DdDNiS9b7\n", "w4a7J9HIePU04f7Yy03uvcSka4jMuWdxOp1LWs/CaE7qQFkP6GVqODiwk1Ba1m2W9mBc2xgE6bWz\n", "6escJnOGgBiDxoFeSx3I6KDGbXzbIynzKrZ5BuQ6S2T6PCRB9jOXy+e+jMz/NUASoAHIMFQ+QcHf\n", "wNiQ7XF4AACUbRFAixcs1BZ4k4EK0PaswREno5yj2yOjmRuw7CK+Rml8BjTxbXXQU8EiIlBTJsZQ\n", "T85OYR9soe57Q9hHHvcdwGhPvsKIrAzLxMbXbwzu23gw6rSyHOepr6W1MRpVATCCP7KWqkwM7dSm\n", "7IvnAAyjEU+Z3EGdUwczjIna2xXK8HblqvZPYPdbXuBnfpERgVV/bedgW2tseaz3X3zLrv8OBUO5\n", "Z2TEErMGYHLfLSFVqW83TTZUAXEL6gWQYf6c6KFVTCVhzg3LpMHCZKxmy4b37WjE14OU2/jmhgEY\n", "1q3RuiQl9es9WC0NT5vFQQU/qZCn6WE8rhsetyJNC0rzdT8nydAfl4wHAzDuZ7w5Lt5oQZjfwtqO\n", "4sYW7xSq2FzwP4AqWuJ/Ltr1cRO9DgcxvJzdWPwYYqPfalTQYx92BpwzMnJCKzUkaTKYNRGOGF9K\n", "nFdzXxs6IyM5Q3ZpjGVqWIqWlWi5Yc5RS2Mc51I9eQ00nDYR+JxXwnKSWK+3zO3SBMclozBjQWdG\n", "06ysmhecjF8FxGAWtoUxMCqADEIFD5TEgRrcev2nCbCYKOQAYJA41rHN6GIdOhTImHftQokU/WYr\n", "g2jYGssWsdV9NRfhjPoX785SKvIulI08rQWnUqRVamBdWK15zMrlrGJa2lpoSoRJWQ1O76Q09Pnt\n", "BxKD82uAj9FwjDliGiLGXqlV9s/rvhhCDasVWyVpk5Qr5i3hcS04zhnv1w3vlgn3pxmvjhveLl0v\n", "wxgZJthix1ZCPzMuPQtsWe8pJUwTYa4Jc5GLvGTGnBm1JrQsAaQWgg2Bj2SlSbMKlsftAEassY+H\n", "q2ehP1bRfxvfwnCaXMyKw2yPItkB4haw88uzeEYgQ0bTbk1CLyRnrBkTAxgblZjGUATwfCG88ptk\n", "wEjIEnq3I+o1lJ6tNQ0a6l0MTKy38giiWsmcPTYQNZaPxW2y/SAFPxtk38VucmCE2ELc57cfw/C9\n", "Boh/jTKS/vvQmnPdF8DrVXtm9oZf3IYMFxdfJhymhGnKagPsmiWfM0UFzcVhF9/EgIwIYNg1bgyM\n", "nK20M6n+V/ePTBcjdgYyu0EEcJXruVVdxJUPaUE0uLOgIlgKfL65tgcuongmqDO2oMdN/AfdFuqg\n", "xue0ATz8I3aZ7aAM4PK4zQ5kpNFfYQY4GbtCAIkt0c5eiD6Y1KT3768Kcm9FOhmspeGcq/hXU28j\n", "GTVShLVMACUw8w3EuA18d7/gzf2iZSRik7IusrX2kvrTWj2R++60qg6GCXlKPGRdF/16S9Dy/ikA\n", "GAu+O84Omrw+zrg7zLibY5MFcgZGaeIPMDr7Yq29ScJ5k2SzdYs8bZGlFuYBj3Phtx4TcHhQmcGJ\n", "wU1YC1OW+cuW2Pc3q+Cvs8Cqx8ddm4S6b6fMvwMnYXFNBnKrftKVhJ8lh7daXVNkq9Ju135LulYm\n", "HEzA+jS5iOvdXNGmDEwSE9tvvCTR/OuAGDD2RBAuIb6gsTmrwJ3iKHx5KYbmC3VgYMzhfo6IkmZf\n", "7Xcqi1otM2NLmk8MyPa5NJy30gEMp09Z+1TRxjitFbybR2wAACAASURBVKdSXGSrBqCFSMVWiJzC\n", "KeUunR3S2SJ9m22fDBjox5EvnvdAgR1AcQqViX6p07OZ8JMh862zNrbKyKVinYSlcdoqHpeC+7ng\n", "cdUyk0NREGP2VqzG4piy6G7Y1lmNmou3smWG0sCYsXNVpqRZXNHYaNSEThWuIemVTi6TzkjILEaS\n", "iUUn4Mo11dkYv3WTdRtfekwp9bIFfa2pB9pAqrj/8evkpVdSzG6+5DstiLFPM0L5CO+y+ejXtE+z\n", "3fNr2xMDahf4U2B1ipnbnIc6+p65lc8AcLAisuai+PJWe6tlB1WDoNY+GxJBF6FT2v4rG4MkKxkl\n", "JWxtsc8PwdTPcFZees5iMDNqdoTvclYdIRO0NvUTNuY2frfDRexUYFyAQSkTgLVTbb0t4DnUehsj\n", "oydNetbT/CKbw6aDZerwJuCWVRvDmJ4OSLSG0gKAoaNf710MeAAJPyPYuwcvRj2JIBCcujhzD1DI\n", "tcZcQB6jIfgsYIZiO/btkqQTrbek9soNFRmg2TXKHDxCt91TI5TWGRJr6keDAKyyp87IEDYGsBEj\n", "FaF0z5lw3hIOkwQlW83ii1nwRuY3JwDsLLHb+HaHdyM5amlbTsoIax6gnkuPg96pDoYxMN6dtYxE\n", "Yw8LlhMBc1aWtyZCX98J60NuAmA8qIjoQcvczb9gHrtiDA0WDLTQ20lL/YWFUR3gdQaG+RrP+EZA\n", "SDBcSTbsbdun2pD9913EKuFL999tz1uzWEfZptb21gDl8EmCJOUMrLAE+txSj0/1NQNTl8xdTDWZ\n", "GLCwYgcOrIMmrO1qrc1txSkR5nORdUe1F+9nua7uTbagTDjWhkPLSLknyF5yUL86iGEOpoSd4pQb\n", "LXpAdwzA0BMSM3vRKbVhC3XPHpqjTf0EREaDfs5QvFRUkJIaFLzvrVyLIEqmf/G0FrxX1oU9f1ql\n", "7sociRpAFgL8opmTnkij1UzWLSX7zXshTwHIIBOC0uMDy5Ds6vi5i9qstWdozlsXFrV9OSs4Ye+J\n", "KH1jBlegNhUKm+S7TpMaiaXicZ3wuE54WIq3QpJ9EVaFMzJ0VbasbGkdlbWMhKmk2zmbakJJotSd\n", "M0nJSBB7jcegIQAZIZtAxMMx69df1wS4jW97TFb7vWc4tW5jSLP/gDnmARj4wAJo42KxCj/zsdGB\n", "jPgJ3xr5Lh7f/5KAPYIXRml2cCIZc02DnikqTEeANQuTKoAYJQRZ10BUs4/mUIgwc5LywGZ28xLM\n", "6PsWS2jkRQE1Lo+bP/6ZAAY98/hF501PnN0DIWsMY2OIhtA1auZtfHtjKM1MyUsL3GHnPrdWBS5O\n", "QdTTaNIRwACCBkbqbe4ONpdn0d0woNLZAABYk0dAQuKmnTL0S91R7hpTnVHVtbD0rb9oRADD9YvQ\n", "dWWcNaZ2zNq+V2Y0CqwvhtdY9xIYZYf+wu3sdrpbZmPAJSYHUAZAE0F4j0LpcOo2vzbG/8/e2/NI\n", "lmXXYuuccz8iMrOqurrn80EQhngPEAWBjkRAkCUaHJoExyENGrQI/gPasoSho39AY1x6ogwJBA3S\n", "oIwxJApyBEiGCBnkPALkdFdlZsS950PG3mvvcyOjqrIrq9nTXXEa2VmVFRn3xv3Yd++1115rqA1r\n", "6FhvXSfUASPPqcStpCIHYI1yrYxDVCAjSQwekhVyEkPlGgkIpmt2WR/vEjeSCVfTiN2oYp4NyFoX\n", "HXPF/VJwt6iA52HFF/eLCHkesjkxLqvEJBbJQxIwbT+J++Hz/ej6G1cTnu8mPFPtPVq5EliVwrg6\n", "c746mMua5n7NNupPN5TDWsRONYvQZ7Ea5/xnD/o/QoVvfjx3Me5LxpBTUFb+HB6+JvC9z7NF+pyo\n", "BXFnafrDPhfk+21iTooYUsFUImqtQIt6/ytYQSCjSj3HscN+5KyP/xwdrg1oWuNltd6VnDJjGlbV\n", "XFykZpwTro8jrrSGLE30epzp++5j+TWAGFp0BohgHgJK84TUXwd7MPZAhnQGHo4C9HaipicRaB9G\n", "CzHYQaldUb3kooBAtW33AMZRbwTOd90fBYG8W4R5ccxZ560ezqEmLcqFSiNdlt00mGDNfhpxPSfV\n", "l3BlcgEyvFAYwhb9YleGljeAJw89C4P7Ljd3MR2P22PG/eIMknv9vqxOtyp63FeljxHMWO2YZBzX\n", "EfdTwdWccb+4FdKs7JIhSXHERRS3NEdCmdTz3BHMsHNZA2oMSIhis9qd/NqgpqsiVpOCeJNVQLro\n", "J+AYzy+P4WV93IvXGFdt3cMjyOxh4RO4izqPYWe8CWnvATzg3Q++LZCx/Y3T331Xoc5t0u6PzAuy\n", "1CiETLCCttPzKPFrp2i6gawdqMFYsWjCQAHkJQubix2RzXwqxY5jQCpRgQwHM1gMnT64+z+Q7v7G\n", "43cC8rxrfbjz5qDT6fv1XeNTEeLL+jiXqPDL/LeBgrlZAksa9aINCgp5HnuadN2KobG4JwjpM8kd\n", "8zMltcPrGyLS3UOBaZVxWfNAQQGOrVTes3ZfflgAg999XFTiN91UejAAUPHTqHoiGlMQOZLn+jvs\n", "On4IIMNiUmgiME4Apco4oI+y+gE1XQoyhGPszoOw24YUkDJBprLdcG5oLQIKXjW4a8NSKoYSMKwV\n", "08CmVjLtFJ67CFjhcEmLLuvZXnTv9mPCOIgIbFbW9pqrsRwIYLw6LPjCxkhEE/C4ZmG3wxu5kwIY\n", "N7PoXxDAEA2OWUQ9d1pHqBNKb+daqsQZqdtc++JezRPuj+oWuWRjYyy5bBwtz9aP/N4BpQAQH2QD\n", "sqp9Ks8/HnvfPIxp79heoMYXbHuneR7BDNSGtVVhnKEjAnTb7EeFCW6LUyXH/b3+Eg0U+bekgBJ/\n", "v18Csndiq2sTzcoGHSvJqsOUMI8rduOAq2kREGNecT2POCxF6uOxYoLYsz7GLem9QYwf/ehHeP78\n", "OVJKGMcRP//5z/Ev//Iv+IM/+AP8wz/8A370ox/hL/7iL/DJJ588+LCAPmijznfrz3t/cRdm0wcA\n", "H+Tt/AUoJwdbICMFhBgFte/pvUSOSsUCoDaxsmLaSTr0UtwS9V5virvjagW/zVlpV7HXWUiq+syk\n", "YT8mG7242clNfLMbXcRG6VOcP9tpl8RdPzr0q2Om9MKfgD+8aCF0XAsOuSp4sZp+h8yw6RfRUwU4\n", "Dms2O6Ki1KDS1FJJ33+tHE8hy2PAYS7Yr0WBjIh58ISsH4XpZ+QF1PKbTD5LRIxVH+jyu6WK8FQI\n", "YTNW0l9TgOiqcHZ3K364vb5OUcrL+uau941FADAqTVJW0+QWNmPNK3N73cB+9i6wAMCDAvtcUfxY\n", "IKP/vbe99k37FDYxUsdEousF0WqaQCRtl3dT9+fu33b6+nEQi69V4wZZXhI/M+7WguNCp6aMw1o1\n", "zlQc12id5bUErDUgKN05Q4/9mYKohwgecyt/GQDjHCjymPPWuv+JFRq6Lz+LAty6iPNlDv3bsZ4S\n", "i9i8oAK/iPjSCrk6bbprrJhoeK4GAPYJa4ro7m1lfE4usMZRkqHPL0BGpzI6OiZT5TO7dR0409/o\n", "f/50AON0iR7OFsAgCGuCpRrTGmDM0hAqiupHiDAp9XW0+fEB8wDe/3SSao3ATnCB4wj9Tk6yfr7+\n", "83TxoLSAVCNSFNeRvnHFbTYUYXoQUGry+WMIWNaAIRYc14hjijiMFXNHra+1ora4eTZc1jd/PSUW\n", "iQOhxKMUg7J7mrIwJPaIhWo2DYzXh1VdGaUpumgjFJBrexokf7hWF5Ln+xEv9rOCGLM6oYzWCBW9\n", "Mr2WFSFlXKL+hQAWBfc61n+7yIg/AYyjCnlSx+OcBIEBF2AzHPbn08W6ISFo3SLPdGukPDLunQIY\n", "PbuqZ9dzRaVk8N5mfD2NtRxhW5uws97EOA8RBmIMSTUJh4ipRgFEtcE1KLBdh4ZhiBiju5nYMWne\n", "PCeIId9d6HMpFfdrwXRc8XqI2I8DXqme4s1uxc1xxfU8YMkJuQyoIzAFIMR308LeG8QIIeBv/uZv\n", "8Omnn9rPfvrTn+LHP/4x/vRP/xR/9md/hp/+9Kf46U9/uvk9pnEEJ0KAz9ZYoXBeVf7cCekT855u\n", "Z3/fDDMFK8hF6VlseXJtSt3kzGmzUQwyDu57zQtNIJbiNj3cL3Y3p0FsXa9GEeu6mQfcqHANxWue\n", "qwfzs538/XqWG/xKg8c8RoxR2QzdySSAkUs9S+/pKd1HLRYIUNyeIKdf3AsN7It7sUV6fcg2zyZo\n", "6nbGVoCHYiMrRm/l9kY5ZjIaU1TvQ7o8KUS7BswKqW5nM3lObVY0BGQ4QMXu+IPuagdk1NAgdr3B\n", "Z+ix/SVeY5f1zV/vG4sAuGUXoGNJ1W2sIKLDXK17WrAwPbs/tl98WL0pKfTi4LFAxpve7W2/2z+o\n", "Y4AJdHJUbRwiZmWKkepJwGKvDxoKMF2p/eNeNXB2BDyGBNpR368UQHaK5/5YcD9l3C8J05IwHbNs\n", "e832MI0xIOYq9qoAcpAijuNn7P6+7bN/2WNzepyAbYJxfr39vPkzToBUKVW6zivc/aEH3i/rm7+e\n", "EovEwlCp2xAAD9otzzb7LaDFkWBG9+wtxe+PALqAJRsDI4DhTRKyME6aDK2iFKimVLMmAGMeR2U5\n", "urphZHwFAEbfHY2hy/ei63gMXTwbUkRDk9eqLa1yM0EgQ2iawYoQfMB8oAcyQjxhY0SCUgED89nm\n", "RZN3SOMmpyu1ISeCz2XD3Gr9+VG9AP691Iq1Bm84mUMDQeMk+au+F4/nZX3z11NiEcdIpMkD18rT\n", "0Y1bNkJVA+MVAQxt8q7ahADkXh0HYXVezSOe7QbRv7hyAOPl1YRn+wnXKuZJZ6YKaCNVmNZrFgbG\n", "YVHWhRos3HYj/hzvN92/ct4R0nMirx3JkDxn4V4VoSCzIWg8rHg8GGq9MXg+tnGfRPf3k98luOy5\n", "UHNwtIu7En+amDfAYwjz183ntvhJNkbCOFTRZNJckbnJmJrKInQyASBQS+CiG9dBM0eaUiQ3vFsi\n", "piHj9bTi6l6tde9X3MwrbpYR1+vQXTuPy4ueNE5yetL+8i//En/7t38LAPijP/oj/NZv/dZDEEM7\n", "76FHr8488uR4+4k5RwHi6hXyI4WpenAEjloRpBCKZkEOPgNqhXV2PYmDal0c1mydjyM7Hx0dLwBW\n", "GJB5cTUPeKYsC9oVfXI9Gfr4gj7MCmrczK4ETLqnCHt24m96weQiAACTkJ52U/XhlUtVhV4HMfr5\n", "tS/uF/zybsHndwt+eX/E53cjPr9fsL8f8Gpc8PoQcZf4uYG1Nvcj1sBCahdF+igWuuSEJQ+Y1iJs\n", "kiGpLkmw81saxf+UlXHq1Rb8uMYWEJuLdT5gY+h7RgIZkHMcWnjrNXZZ3471PrEIgI86KYKNGFGb\n", "qPX0721xqDUFVc9fPH0hzHvy4eNIYlsIpO5+ubnsL3PZ9g9rG7NLgqiPWtzMRjMX+uhex92oc0PX\n", "hOvJ49OVaeA4O6M1GEPN9YMS7pYB87BiPrpAFDsABGDFsjUghuKdkFyt+BCrWx0de8sBeN9b+jS5\n", "YEJxDhZxEPXN543/zpl46aKczMR3RcuFifHtWe8bi+YxqagaXbdUC6Oqo1hvH9ixMEjz7jW46P41\n", "6r29UzbVlY2ryr0/njRBamsINaK1asLB7P6Zdbt2+NjZtJ/VDwtgnLsj+uSbBcBG+0zHZggOAFUZ\n", "CkEYEC2gBpiuzle1DMhoFajR973IyGuNXnz0o4khwEZiUpf31SaObSkUsyHsj1GDsnP7hh9cUH3N\n", "BccUMeV4RuiwGfDx2MLhsr4Z631j0ZWytVIMOvoNAzDulmxM7leHRcU8xamRDQyKOwYAQwqYB4k9\n", "z+ZBhDyvJry8mvDyesZLBTNulIVB9jm0IVtrsFG6tej4O2uaA8fj106j0MWOzYmn+2wEK/oRNMYT\n", "xpe+9221heaBgQw0rTVkTx0MfQwbw0HZ8ADMiN2/PdyPHsTo3SiDxWKLwfrvoF5O6/JTeANlCBo3\n", "TfZANMqajhEN2oBuaOY+OZAgYHkQ9Q459lNlnKQ6g3/NFcco1898WLUptuLmIF/Pditu5hHHXMwE\n", "IoavmInx27/920gp4U/+5E/wx3/8x/jFL36B73//+wCA73//+/jFL37x4PcK0SAIgJGw3cmeYNez\n", "Mc5dFKeJp/9Mg7xA8BbUZRSi2nZiDX7dtU4Hw0YxnDq1DfwFufh+ErEy9oWp7o6mumuI443ctC+v\n", "Hch4thNGBkGMYUwIQ0IcotBpTmH32tBKRcsVYYgIFPvoE+Ha0GpFXQtqrljVy5nUr1cKYLy4O+Jf\n", "b4+4uRtxPR+107pYd3XSGbchBhxWdTPRm8JYGWBXRo7hOgrAspZqRdI4VOswhO68NLvoXRjGH6eu\n", "5G9/1p7mm6hb1Mho9vu83pQW1SGyb4bFLuubtN43FgHAf/ziXv7QmiT487CJKxaLuk4dO5KnV88p\n", "gEEWmEEZhlyLyBsgc9J8hdn/vfeReLg/BmB0ifFAAMOcCoRV4Xo9g1knM5YJS2xQ73Z1JJoV7NAC\n", "SUCMAfdqyzxx1CSt3bx3X4To8dF97D+8HYMMUIYvVGHGvAvIeMpxgv65P3e9ZaPsm4AR9iQ5A2RY\n", "jdRdK1UvHF5HQnet0vm5gBjfivWUWPQ//x//H2gb/B9+8AI/+uyZAf0OYPRq+8UaLmREyD7AmAkE\n", "KPcEMJRVtdMRsCElpABIRtZQSpO+YvVmg2ttuU0yC9/eMvldAMa5K/zLAbL+DmTZUsjTtX2C6fM0\n", "RLQVSLGhtojYCmrQMRKNO7EFLUYeuw+P/wzSGIPqcIjLSwkRuTbE0lCi5D4jReCbxqFu1I8ueg0N\n", "JTWkEpBiPSvyXqvkUy1WaTg1UvFFq0hG/aKDYKMDGf/Pf/wc//TLewOCLuubv54Si/6H/+X/VDCr\n", "4b/5Dz/Af/mj7+h4vTZDj9nBC60R7hbRwliyAJoEU6cUcTUmdyLZSTP3kw7AeLYfTcyT158YORTQ\n", "anjJNCUoBlzcLsIIud0AGFmNCs7ZTMMNHk6+otYYZGIAvci4sBoE5NWfdzIHAWR1PfbcuP6FszGj\n", "jgD2dspbzaxTJobUTUHGZZro/lAImuBLaRLTLfFgk6ZnfiWNnUPCtBSp22pFawkhBBV9FnB40Byy\n", "z5EZZ0ppVkfnSjkCf24IUzdgXhJeH1dcHwa8uhcA4/VxxbMl43/9v3+B/+sff2njju9a7w1i/N3f\n", "/R1++MMf4p//+Z/x4x//GL/+679+cpLC2cQsdP8OPBTI64HDx1p0bTpo/UZ4AUKEnXKB0XxL3San\n", "pckJoFiWi8YUAzSMmlS3AMaYnK55zbERvVFfXE349HqHT69n+3p5s8PLK7mJP9npDbwfMUwjMA3A\n", "GIEhAT04wQMh8BtCLgil+ut61VJ9fagVKVekUjEuBVdLxifLitd3K77YT3i2X1RIZ8TNfMQ1u6uj\n", "Uk2HrfVaDBmHkBEysCrFuzagZbd/KzX6qMnYMJWKpURMpaq67VbDQ469UMaK0b7Y6XboMHTfCWC8\n", "abXGQ9AViAqasWiSHwY86gK7rF/p9b6xCAD+089uAKCzDnN7zA2YCk3m7do8v3oAgw+K002TgdFa\n", "Q2w6/tRt60MAGX1hLiw1mNDxkDg77p1aAzMG17oQxoWAFdfzIOLDCmg4uJGwn2QErtaGMWVB6YM7\n", "cQDbgt9YCvpgo7VzaclnKpuKRA0RLQMN1UAe6X58GCDj9KpgcnHu3HnM8s5L/7nOrcb/Wn9Nyc/2\n", "84DnV85O+cXn90//QJf1ta6nxKLf/6//vVG3l1xxd1xVpNvHWw9qI2iM0FLkPtGbgYVDD2DsOlYV\n", "QYx5GDAmZwE1aPKLisjHrsYozpOXJlpY1nQ4uVffdDv2n9aB3O2/nfvd1v379j16sBEnXUzJV2oL\n", "MkoSA2IV4IKOZe9MIB75Gfg53vUZWNAVbarE0JBjRaoBg4FDwfLdCI3Xeh7JXi2tqQ193Yz/EMSQ\n", "JlAUCv7qBRwBqKUEjKs4zO1Wd6ZbS8F/8vIG/8W/+xTP9tIN/x//t//3Sx2fy/rVW0+JRf/dT/4r\n", "pCTF8f1a8MXdguMqjiS3FPQ8akNUQQQBEHo7VRHy3I1DN0YySt2zVx2MqwnPryY8m0fs58GcGGtr\n", "WLpm6cYh8phd2++wGhtD7FSzjtdt9S8CaLLgQuYcYyUAasBB6LQZGQO7WFcAca9jLAuw5urj6tUu\n", "fp0yyzhaG4Ix8N+0X9QHKbUhR6m9HEBwBgpjwAoAeSsKzG2TyTYlaTrvVskDi87ORAQbLRqTvJ7X\n", "Dxs0BC7YwF6LmkK01YgEuTZ1tsm4W1a8OiTc7EZtrmc832f85//uJf7b/+yHeHk949l+xH//P/3v\n", "bz2e7w1i/PCHPwQAfPe738VPfvIT/PznP8f3v/99/NM//RN+8IMf4B//8R/xve9978Hv9QWm06lP\n", "X9PstcDbWRjs0pOCbO9hyWMzlAhBHtKpNqVPknLn4xerzu4s6uxBUGMtLnLJhytP/jxIYnA9KVVq\n", "P+KT/YSXNwpe3Mz47GaHz653eHmjQMa1CtlcTZh2A0AAY0oPAQwejNoMxEAMQFYQY4jyxdeH4DAc\n", "Xz8XYMkYlwEvpxH7w6qdVI6vDDITb2MsKvpF6nfsbF4JZHRIZykNFJKRmyspmJH0Sx7ATl/t0U5P\n", "kkRfpNnu9yef5xpgodnOsjGsC9pdPeeutYuw57djvW8sAqRj2RqAqB43J5UxAbVWO6remWuO8agX\n", "2o0Wn7r3s+8NLQhN0oEMjUkfCMgA+gelq0q7jWqnTG1ARnT7Rdqqpu5rcJtGs1xV4cDaGnKLmErE\n", "WiNySfIwq0JjzilhGirWErEW+d2syP1UJF6UFL1ASkJrr1E6pjEGtALzRH/qMXJA3QEL6e76eTs7\n", "mxoooCWj9aX6vGy/PxaCa9N9duG97TmShOWyvvnrKbFoSlGvmWpFKSnUPXDB71mTRGoaGIDBMZJx\n", "UBX4wRoUdECZB1F/T8E7aQEyIppBe1A+l9lVa/blLkLn1f4Bj4n29/AwEvZgxtvu5c2/dc0Jf2//\n", "4mhMnw49ZZ0DMPpCpJ0kqufykSKBACFEATJKQwkVOUrhMbZoQufy6Zw9N9DuEHKexlI3M+kADAiu\n", "DShtRa0Ra6vahZX8N51ovfXfxTGuWdFyWd/89ZRYNA7yPMpoJswoLIwVt/ersDDuV7w+LKZDcVgL\n", "SvZmw5DoRpJwY2MkM15eT/jkeoeXBDF2I653o4yvaFG85gK0rZDo/SoMkNfHVa1cpXt/t6y4X8hQ\n", "q9ZgBWBjEzJCG5V9FjDGhJS2IMbpSKeNytWGGJ11BmgIikArqrnXYLXJYxazip4RYQCG3vOmVRTC\n", "ZoQMupVWK4rGDXGQrFhLQI5BAYRiMcFA6p6ZEoAQVpskIAtr1ImCeU2Yx4K5RjS1PR1SBBIwpIZN\n", "MxoObLPZv6hrljQIM2pRyQaOJR0L7saCV4cFN/cjXu9W3O5W3O1WHHajajG++1i+V+Z0d3eHV69e\n", "AQBub2/xV3/1V/iN3/gN/O7v/i5+9rOfAQB+9rOf4fd+7/fO/r4VAl3Xvf/ia3iy3rb8QdlH9L7m\n", "l3lSE7tUloWIc1YTnxPL1M5GdVGXjrUqNUktR7Htduw1SbiZRxsbeXm9w2fP9vjusx2+93yP7z+/\n", "ku8v9vj+8z2+93yP797s8PLZjOl6Bq5m4GoC9iMwk42RHrIsTpGa0B8APsH19UOU95gSMA/AbgT2\n", "k2znesbuRhghvo+yf/zz957v8N1ne3x2s7PRl+d778LOo8/T8jxRU4QsFrd2zWZJK8I/gtqae0He\n", "ipMRRWQQOT3h5zQGHlxj3bUm389fZ5f1zV5PjUWD2jhR+b5fxAxpb+Ud+O1yAMOBglOq4oa2GDqg\n", "I1J/4YmZ9pn92RTiAUa9diplz7Si6nS0bmZSAVCq4XNW8yTUPghJZ4v0EDYP61NXAU8o3PrL9jX0\n", "xwz2mXCy7fc6VsG/9wBG7L/6c9ftnyUYcbtv/XJapwPqpN5vANonfo7L+vrXU2MRu5Ds6BUFMB4w\n", "Q81itaroLYF62hgm1cFI1qgwNpWypnbjYCNfZAL1DDSyK2x0RDW4cnUXlNPxz371Mch1XzyNYUz5\n", "MiADt+RAcPdvrX9d9+pzNXn3AzKB35UOhG6f48lnsZgez8cAbpOdU+9YUhyd4zluLd20s8tjNyY9\n", "pzyv3ZifnN/RWLTCslHLXN2ZWpt3SDuHm6NeW0suHcv4kht909dTY1HQvJ5insdcXFePop5H0cEQ\n", "S1W1eNZ4wDGS/Si10bOTsfpTTcBrvXbHwQE70VFoWJSBwRESY2AcKeSpRgu5mAg44OyLcUgba2kK\n", "k1/rfcN7aEfHtdF1wqaUjLma+lyE93qX2wBdPnHumJ782UflsckHuS2yZSd1qpzHaPu3HxP282jx\n", "nFpl3pBOmxqN264NJhB90DrsVjVOfDTIj+uyFhvLgR5PB6ZGPN+Ndh5plfsJzSv2o59XfbYJoCox\n", "h46ZNJMwcIqsGtXGeNd6LybGL37xC/zkJz8BAOSc8Yd/+If4nd/5Hfzmb/4mfv/3fx9//ud/jh/9\n", "SOx7TpehQHj7g+PRYfTkamFuaOMNATAyc9uqvrb+wUKQg8mBBvu1NrWg8s31Ap4cIXm2F7eRl1cc\n", "GVH2xc0On+mfycD45GrC1X5C3CloMQ/KplDQomdfAMwooHMXwFqFFlSqt/tagkCDDWhxC3hIheUV\n", "h77/AOCZ/tVeiq2O/uZ8PTjk2WbWSSErlZ0kbOe2qqjelhgxlGYFgH1UaDdBQaceQTwHOEgH5I1X\n", "hb3n9g+X9W1bT4lFAFSJXQoBoSbrw1sTScYRzj6esjB4O/V0wFOgwuINv2sxi7oVqnUw9gMxDRQc\n", "YTciMPFGQIjbzmX/PYTTwltHvizprh3aXrRjKEwMYa9p7KRonN3PzWa/W59pEJ/tjxmTBfBh3/zB\n", "r9XJY2LAG4/N5jiFLix2LlfdvvSv57GhPXipJjpjIQAAIABJREFUEnJFmLg9KKh43bjwlsc2AJvr\n", "7rK+uevpsSj4CEATxoOo8Xddc/1aM+0xtywMClvuNFH3YlcTyklYGKOCt61JAd1atSkLdh8JWIiI\n", "eFdw9wyMhz2Gk+T+HEDrNOcWaCWLs4ADgYjQaQcBjB+kMjNW4cH9JSy6Pp5331v/Xudj7QYQDr1W\n", "TnjwQo6NnXNp4ecQAc2KXAJiqFiDsHkF2IjatZRZdASflac+RkBAaRGD2qcG3R+7Zky3RB3larDC\n", "ko52pvm2EYhVvbP6YfWGLuvrWU+NRQjBuutLcRCBxa44Ga5W7B5XKThbUzC1E/OkK6O4kcjXy+sJ\n", "L67EZvVqGjCpiCSNAlhsC3iyFRN9vdHhyKrD4WKiuvumCzQljscnY5iOg49xmj4XvLnO0YdYG0IR\n", "llprAS1GRBV+P+nn8MDhbVnb2ce8/qzPgZI1dpy9ThDF9MPgQLMB3qVhSQVDLliyCqXnijVU1TuS\n", "WLgQHAhBe96+LZFGUIOKKWGfC3JJYsgRYGMldLkLwXObXMn2csYXQfhcG5Z8em4JZOg1dZzsvB40\n", "l3zXei8Q49d+7dfw93//9w9+/umnn+Kv//qvH/UeT0rOz76fCxn1yq1MdFsTsSrW9nyolQbUorOe\n", "XYJOUIPFObfr86aChokGxiCIlKruvlDV3U+u/aZ9ocjUzW7Ebh4Qp6Rsi6gfKLD94vcBP1BREIPA\n", "RS4ySpKLAB+jgh89cyN1VQu69wOoRArUhFQqrtpgFFG5KeBCmxtWhBd2DhZleXsdJQGPbREPGkvg\n", "q1DNx9gwpOYjJYHqvn7uyMToEyXTIniPC+fyTP72rqfGohQD0ALqSUtwk/xaB/289sGWYUC1a7eh\n", "6kGMprey/KL8oDFJfkNX833WpjNgYIY/dnveiYMrXbFdSWVX9losMrGmoldM1sU5QWJFa8DdMW8t\n", "qbNaNVOIsIuvBlSegEPb5MA/h52i8G4Q/D2OmHeGsT2nW7cSjVU1INQKE8/WfSlVRPz6XVNZLdTm\n", "WigEx/jhLhjGN389PRZFG6fkbPFSpFt+v5YTLQwBGPwSkjESjnft2a2fKMirnboxYVSnMMBdUHL1\n", "Qt7cxjpq8Fp8m9TIOAfoig65z3ITHO2X5Wla9CPC74U3LGc0bXOFUkVjokZpNpUabN9EcNTBU2mw\n", "nMTwR8SQHsAwgCY+hGYYy2i9yNGMc0BGDBW5ArEGDCVgSF3eWbfHl+AU2WutNRvzpTgyx0lyl7v2\n", "2iUGYlS3ydzp9XTg2LTmv+Ud5+KyfvXXk2u0IM+qXIWxQzFNjnDcKohwe5Rik+NIgGhvTUPCfnaD\n", "g+f7UVjq2q1/sRdDAxPzjCLGu5jzUd1oJ7w+iJ3r60M2tsDtMZuQ6NrZS5MdRdBiN0YboZuGwcZf\n", "x9izcGXRAKLUhlgqMuudFlDUIdG1RAIePOwfsfpwyFzH4gq8gUKmrIx5dOzVELuyjrVuxVqSAJRr\n", "xDFFDKkgxYBDKAgZWNhs1vi71oawFtwFHzkW0GcVEGMYsBszdtOA3VSxLxT6BMaUEBIsx2WNt2Zl\n", "7qwFh5xxWLZM+6xAU6mciBDWRQ9OGRtkkZzxXetJFqu/Eqt/uHXolFwoDahSz4tdS0eva6fIdfPg\n", "X+om+ANdp8NYGEKp2esoyc1uVJcRpdLshGpzo/Ne4vohiGOK0dudtdF4HchdmkzecalAbkApaApc\n", "5OzoFjUskmpjhKTASArdGEo3NeSVCp+QGKLMql9Ng6BoipLRW5zJi3VhigMcNp6RAnKBARlMhlqr\n", "+jGla9KiHPNTMR2ek1PrIHt/OzLNPsZlXdZTV4oBrToDoe+iVVBZR5LE80n7dgRC0OkohKou6UUH\n", "/EHIH2ihIUBBvMAA9mEubHZEuJ8P/r3rhrLrW5Kg+YMq4KdMu1N5h6pd29Xo7VHsp8eE+7WgNREB\n", "O6z68NJxssMqrgqHhU5P2eKKOD1VA0OkE90eCD5/lctZGFubMwIYKXTnERKjYgRqjPqs0TgdAZ7c\n", "WrszqcBVC82SDouTzTvBl/VxLwJiBAcXfc5zjOSQC44dC6ov/ClaNw3RdK6u5xFXu6EbKRkxq1g3\n", "xfNCiCitGBPChOL0Piejas3dyEM7Hwt79yFSmFlk96tpMVA08Y09kPGGmoD5nbMpKA3WdU1DQ9S5\n", "8AbV7uB4qsZ1jsAYKwpvziUY33sAo9c8OgUeo2reVAQ9N9XGcs4BGaE0Y2OkWDHGinVwy9PS7ZgI\n", "6zEWqc1hrgiB+iWjFV9mq1qqaQxRN4Ud21wjjrnikDOOedCxaS1G67u7n5f17V+1+ug9wQQDMg4O\n", "IpD235o8/cYUsaOlqjo0vrxSJxIbTZca6VpZGICaBWQgqy7hUUfRuU1jgBxXG2HhuD+foTG40cI8\n", "yPgFRyx2U9rofUm8ihsAQ8au5P6RkFiRWkCp/diI35cPc6tHgLHt7C/6e3bjapZbqqbHoOwR1k6y\n", "RbExzU2fGUPEMSfcL7kTCQ2Iyoog+F1rw4IKrN3Y2iBaaTJ+s+JKx26OU8IyJZQ6AA3WrBui129s\n", "QK/FWV4iRC2Cq8echAmW5VpZS8VhrcLGWDoAQ6+1g+qcvGt940EMScRJD9SHRwRQgBaFAlQNOfdH\n", "CRNJm/tseiHUhwAG4H7ktFHdmWiWzCVdzyOud4NaEY64nkbrfEwqmBKj3ACtNYRcZSdr3UJzrYl9\n", "ammopcpXl8z4d/nzrPNeFNmbx4hxSEgpIgwRMcnXRiRUt4NcgSIWOKQuDlGE/UTrI+MwjTjOBcc8\n", "qlBLNTGx3hZV3nNLR6z6xJYAp8l9C0g1IKWmquFbQR12u3tRHWOEWPJ0Sfov68OsFAJKDEDtWRjs\n", "trsq9TkdFXYZLaCniBSc+rft1oVujATSPdMElOYkROU/EIwh9Ef9PBXd54DHvVIaSqzILWIpRTqp\n", "a5FiovUJccK4yky2xMCMOSVM42rz97W1btbaXZ0WLcDWXHHofn7MBcuqMaVWtQiTwsPudzgFsp35\n", "+lDLuiHYuh30c7AepoKD4OAJjUCpQo8/SXQI61Z9PtWozx/4NXVhYlxW0BhBcbQlSwJoFu9rxaKj\n", "JOyoAdKvYG6y16T9qrNEvpmlkbJXDYzUsTBaqwJSNlgRnI15UbyDZnoYD4U8OUY3BKFA8+8xRMH1\n", "7OLun+2w26bWhtDY0Xt4UzPnZ/wMVcfhCAYE+VqD5jSQ2EDNkKJWf1vmV7Pv3MaD80FgswcwVGQz\n", "bmKCZfESZ6tYuMaQZNvoPjO8wROCjJWssWLQMY+pFOQSRRi9kK0lTbkUZL4/kep/Mu/eszF6xpt0\n", "qYsVLrk2ibsD47B0RKVxJUDGZX3ci2Nmom3HbrlrF9x2Ypo9CyMmKYT3ygB7ro1dMtT5tWVhBBUx\n", "lhiUS8UhV7dyPaz44uBCnuaEsmaspVqTswcwqBvDRjNrsXkYMI0EAlx/o1UgN2lghyKfpbaGVE+f\n", "/afHyZvom5+fey22bM4Hrzv5YUCnrxaigdTUyuiZvh67B82vitlNp5iRluCxeMUGyBAwoQjzI64C\n", "YowJ870/T/bzgKu5bkZ2xKFEmnY0TiCQctBRkbsl47BMuFsK7k23xEVSue1em4OOMxwVetf6xoMY\n", "AIEM7W6R4QChgzetT2J3lbFAkWQe1l3g+AIVnbl81l1cO2a1L9txZmhSoRUVy5pVhIUXWtQTTKug\n", "gIJBqTyIbq1VizxsObfIAsBmi4omMjrTmEsVX19zFWCBMRjiOCt1KiVR4+UFF7TlIXOSROCZUIvI\n", "Hxkn1P7g5z2uCWtOWPOgM+8doIFgXWvAgQzUiqY09BYjagNidIXbPkY8ADI2SceHKvIu67JO9HJb\n", "V/BXT3JFE+Pc750AGOr4kWJ80L0Hu++1iX4CFHTVf7RRiQ98cUuU8zEG0qpjoBZQQCwBIZSuI+GU\n", "8iVXHIeIaS0YdI50VKeSsZsvnYYkdNBcsWpHz0FPpxLS+YlsDsYygrLsBBJINvHA1lRgldH+q1mm\n", "gaFFAx0C2M2w49oElEihIoeoM7PicCMxbtuBhcWzYAw2s0D7wIDMZX1zF1kFa+az3+8PNjE49smk\n", "OEa3SjY3Em2mkCV63YlxCwtDFCVylO9kf6zd/epsqYe2fVzsFg5qBco/W/cPAKHZhqCNCWFmFlKU\n", "ohTgvfvpm24Hic8VgUG0gv/TX4z2un5E2MfXmo2ZnC0kdPFOZ1yO0UcEZVywG5vpPmNpMLZpDMJ0\n", "CUFiKep5ICOVgIVARq5YBgd2mQtxH8j2I2uwFxWsDZsRIOpcrINQ4Rtn4quMTxvLZ+2us7U+Skzv\n", "sr7lq8l1dFxFk+JW2Q9O9T/DwlAQwcwOdjJKQiHPfozkZidaGNRXaLmCNp2HXHB/9DEDCk6+OiwK\n", "YGQcc97ULNy2WEp7DDRB49EFL8chamNCPirznVg4ZCv14CmLjDUJmI8Yk0tyEjbTH3mAu2YMtZAI\n", "njxkudFyeYiu53FOtDPXijUnHMeCaYkYdaTEmBtBQYFVmBAN4iy5ouIQhbkhYMkqQNBxwPVxwPVx\n", "xP2UcT0NJiZNt5IhNsQ4aEzz55aYZrggLLVLchZQlWyMY2eda8Kxi4NV71rfSBDDkXn/Gy+jqug+\n", "mtIP1R+8a7RuiuLtgw0PHtKkRMrJDWZBQwXwXvV24sXVzVnxxlyydDmLzpgxIfZuZ9sk9EbBXl15\n", "96iq0utaTCl8VGCFc17zmAyJ3G32zcEOWqvx4ceChUrVxQR65HOMtFbs1LGPa8I0FrFTLEFFqToq\n", "fpckyE3ZVPgOqE0swmITwb5TpNMLLi+87JzBi8tL4n9ZT139PCQHLAhkltZrYWxHy0ylnlS/5FQ/\n", "Ay/t1QKMBL3+W23WsRdBT/l+ut738m7d/yqEui33ZFCx44oYonXt7Peas0/WGHHMAUMqRmPcjM10\n", "n5UPVD6Usibg/fhZbs0AWibagsSz6+zAh8+Fu4BgH7P556ceo21zZaswbmKn0UEMCuvJ7+u1EYPw\n", "2gGwtWyAa9jup8UyeEzrk5fL+shXc2FrjnKag9fasSI6tfgQgucj1lTpxDxnt1edRmVhNGhsIztS\n", "O6CVDRQfV3VQQ5iqfZjqAQynO28tCx2YbTo121CCgrmtocVgzSaO172JjdHHNLPC1tE8sjxr9NzD\n", "HT86QFTdC/p4crocwFAloRCs6CFQYyJ7MSCRxgWC3kCpYp0aS0VWUeKMEyCjwYCjFIM60QQsOWmT\n", "Kpl4q/yOWmSryGdrMPtVEIhSFo0zdhMWi6PFtpm7a4xaK4fVgbLL+rhXq9pRX4sXl6aDsZql6jkt\n", "DLoicbxenCvUTpVjJPOA3ZAQYzDWe7FtnuokLO5acVyFhaF5AiD360CdwtndIm92I25mjtONVqMR\n", "cAUkdBRlbJHtVWqny8XGFvV0No2VbXP1Sx1feEO2QkbqJA7L+IqBJI1gtbuXjNHt7tk8Y8xiTnXM\n", "BfOQMA7ZclPT9LF9UFFnQEU3K+5DFlHWQ8JuXA2QuppXXM+D1qIOHqUQEHUf2BRfc8WyVnOlvO1d\n", "bJaC46CsPq27lyKaT3QruT1kHVcSgc93rW8kiHG6WmuaMMoTs+pDkUBHQfOOKItg+DiJJZRnAAyn\n", "EXrCPiVXcZ0MEXOlW2D7gDpkIR2vtbq6rCYORZOEo6FXWR8oGYdccaBKq84v2nyq0iRJLWIhsetB\n", "jM2XzITtVOxmSPQfD0BoOl0idkaH7HPqPCAEchK3NYjq75gKppSQk+5Ti0i16ox/x5AiiglP7jk/\n", "WzfnxxP/Chf8clADZ5Ocy7qs91km0MSHVXeNbQG0/ndgnfohdOAmwYxuNhzwa5eYcm0CqobowMZX\n", "uWrTLmcVt6YgnGwg959ZHIRyqRjLdiQmBf889mf9+6CsrSFGLRzqVhS4eQe0dglA7YENBVHpBpW7\n", "wokFSNXuc6+V8WGjQDOAglomvc3qQCq5dj7Y0azNXVPkXbSYakAkG7ArWrwT3SwpusS0ywK8Oy9M\n", "pWJaGH2nPFOTApq8x4AxBsyqhSEJPFkYqosxy2grNRVqk21wfIOaODKLLgmoARhZLfZO2AsEMCTm\n", "ST7R50IyVuLP9FIbUpR7OdQGU/uvwpRlM0N0OnCWjdEDjxXNCRjMJyg23MSlLXdxR7qt1Zh2gBcR\n", "59a50bLeHppNrRhOYj2kAMy1YqgBawwIWZ1f1MmNjAjmoAYq5IAxNQeQNB4SyAWadmSF8ReC0PCj\n", "jgqzo2xMt1KsKbbGiBz8HFL/bSndddYBV5f1ca9cVFhTAYW7Y8atdtTvTHRRAFU0zYdSxG6ICmCM\n", "D8wOXuxn0Qm0eCTdZjKupfiWDv5rc6xY8eqQcXuQgvZOGelZAVUBMGSUbjcli3nPdwqW7OTv+2nA\n", "btBRe2Ul8D7NUUYsio64901xaWa5QLA1tqpo9jlL9PFgBp2VapD8L0Bq1BgaaggosWOfdmAG0Omw\n", "pYBBm9djpJ0y3aZk/Pewlo0Li4CuXhdLLCimRbaWKu+9ZEzDivmQsB9XZfWtuJlH3C/CpuBoXtAm\n", "95Cg+jx0HhFg4vYo506cbEbRucjSIAua+2R9tt0tBMxW3CmA8a0GMfhAa3oDtQZULZxj80KDYp/9\n", "1cU/mthTbWcfaAZgkIlhKLxTedipc9E39TdWYCIEeWAcUkE6kp0hojlrpYCNIJ73q3r3mrp/UVEU\n", "YWUsXZLPB5tRDJM82Kbh1BNZ6VUKYuzpITwQlQxGi5TOYLWH6JLLCaXR0cCkD/HNcQgRQ2ioUeZI\n", "Ty3YmPgjNsgwbLPzE8L26Hvi3yzx6JN9+/cnXEOXdVmhnykGrFNeuuTxHAtjIJVuEGHcsQMxUnId\n", "BfA9G0AYo7bwQAHeu/JfHtU/t1r3vwq9uSMTf9LVardt2ac1BBw3XUbJ5slIk49ElyfSqnVkDtjE\n", "017zoXWfD43OASe6RNXBWepiSCeyWgLBGFA/0I3fmoKqcHq2rE4Tg4WLUl/tvEa6I0Bm8VPyDksr\n", "4LgQrx4WOOKkoNcXtqy1y/p4lwnn2jhp2ejLZLPA1IRWAcRJx0j2U8KVghY38yAJvOp07bRxwWZF\n", "rH5NUoxtUU0EG10pRfWvKkqXHzGRpn3hOHSjZcmL/EBGLGCxVJ7zMlo6qFtPDBqj8G7b5GaBTcZR\n", "WpXEP4aABGWSxW2cIEOUOYS8z7vvOcY6A62jxwM2gSTWR1CrHQoKDzUia1EQQkDM+pzJQGvuetc3\n", "u2KMcg5SxJJFo0hG8wpKG3TffWSHI4uLdmIbO5uavx16cb1SsZSIqNoY5oDDsSWzWr0wMS6LIEbB\n", "YSniDnJcDci475hhvI6HEGyU/Woa8Gwet1oY+wnP1Z3xapYaJIZgwGIpZyw3jzpCcnD2B+2lGQPp\n", "QrIfnX324moyLY4b1So0FoaO0wMUTw5ilnDSdGq1c0kszlIj4OhMym2tAry9JmH4YprBupN5UwgV\n", "sQK5BKSgwG/qWGQQEdQYoptMDAljYgNdgIy1VOxGYWNIs9ntUH27ZM57PbmuBccQcHfMmIcV+ynh\n", "i4OAGK93K26XEXdLwU0uoLOVgbsBAAYT7zzkYhoqr1TP5PVxxbwUTKlsGHJkHd6pNsYtmRvHX0EQ\n", "oy8Ynrp6IEMYFupZG1Qoiqi+bbmbg2wOYpx7aBplvCvaORPpnUiYoAmVr0mNvo8ivrSWijEWm4/n\n", "eAmp0wdV779X8OLu6CAGExjqYaxZZhlJkZQEgLOSKvzS6WPMIymmAmLsdTZsPyXT7piG5EBEcBoT\n", "KUnHzoO5VG8r9vZp3H5KVcQ6W0SsInJ3zjZSmDIVLYbNHGywI+/FDhHRC4BxWV/F0jzV6f4sLllg\n", "nwQHueahFLqg41w+ctV7elNKmJ1O0YKprrsAf2hyvetBGN7w83Ov74GMhmCsJlnUqAFSayg1YA1d\n", "XLPk/WHEJqDpx8PZCQAMoGn64rDZ6S5R6MBJS2b4YDMRwaoP8J4h84aD8Ibj86aX8/khgWb7myxc\n", "CN70BUywz8t9Jfm0oLWIlhpKjdIlbSdsDKBLgHrh2Dd/psv6OBbHOllY9mLeJn6rtjcBzoToBT1v\n", "5p5KTYFxFfTU/KNltT+vPuJF4MS21TmT8BoFdLvKunDNrWR6G9L1c7CPY1e8p0MRALU2AR+CjpCI\n", "OCfe+VBv2//JaInGkFobQhTbUsZzJusMfQZevGE7BmGG7XdjY2ALam7iffAR4tqkEBxrxRArjqF4\n", "AaF77kCGUNgzx0mGvpGkQuqaf/H5QDaG5F/NBAoFEGl27dBZ4rhGLCmiFG9KcaxvKbVjYzzO1vCy\n", "vt3Li0qyMBzIEE0KamHIfWvjHDrK9mw32igJAQwZIxmxHweMA3UCdcQ+VxwXee+ehUExz7tFaqJe\n", "ByMpC2A3JtsmdTdeXM0CmsyivdHrAQHu0sPcw1hp1lCpBigTwJAGsucmNuoKz08eu3o2hveUKkKI\n", "yEW1cqqYIOQigCidhqoiJwRWBwWyCVSgaSM9V8xD0bw0ONAKWG3lYzECbubWsJSCwxptpOd6GvBq\n", "XnFzCibpKFEIwggMKQEIKDuKhWa83k9yLvcrXt0veDWNuB0z7kexg60ETzQG3a/CwqCA6+2vMhPj\n", "Ec+rR622+YOLINlDSF/ATn+PfPHvm/fh/tlDzK11UoQr1QPdg7IT40oFd0rtW3NFitkoyEURx77L\n", "InStYvNDBDNsDlZpgWvufb+rUZe2QEI38tJrWFB4dJLZsP0kyr0cM5m0k0K7nIZOxTq7jzjVrjf0\n", "Jm4/dPRrHr8zJ7gHnswKt/noDs9hf05OC5dLvn9ZH2p5THehJklCq3XymAAT2EzKyjKRy8E1aaaU\n", "DBCEPRi5jeDzlmeq7beBcw+T69B1JR988/fU/9kYRtVP26LegxU1BuTQMy1gAIvv21bjpgeE+8/D\n", "+Nofr3Dy9+3+aUpfvdio1b3EOX5RWrPzcW6dOz7cb8abN4IZimH0QGm/v6RvsmgkgNsaMEQV7Tv5\n", "TNJhCKg1qFWvb2tLTXXa6GV93KvXKjiu1Z7/RwUUqI/QIECqjHBwVFS0L67nwQGMmdbuwpYARMQt\n", "R7knKtwNQMZIXHuL+hs+yrAFTsa0ZXyS2clEutcEY0G/BjIPlKFA5X+0TbRhp/RNt4TkXcwjmuUN\n", "AKR5Zcynk7zhLfG1X2Rg8P+MYTFAQJLgbAhno0bLgwy4rlH0LkIxc7g+LWrNR4PIwsnRWbD+3cd7\n", "SeG27ceIoTVxLGkneVsecL8MuJ9klv2QK9YUjNFGppsBJqu7lVzWx70WHWW/X6SQvDt6fXLMZGFI\n", "VkFh83lMuJqSCnoKcEEQ49lOWBHCwpAYwZGQrCNQ99TfOIgrya2KiN4eV6tBsopRxgCMQxSWuY6v\n", "UHvD9TccNJkGF8FkzJMmc7NmTmnOBl2oLVO2QCLH+bYAxsOa5W2LORlH6m00LgJQNkYowEKGWSxI\n", "JWAoFVO3D9ymHX9l25EVW2rDbi1uMpEiVBnDGkg9I3ZVLUS60twvGbdjwqvDiuvdanoVd/sV9+uk\n", "+omyH2zuAwKUr7nisC+mpfLFfsHn+xHXhxH7w4p5yTjEoiNuUBH5Yk4ld7zufhVBjD7Z/VBABrBN\n", "nPvkvp2+gH99S1HMxxeT+hA8qQ8BoIZE607+WgoOqzylZC6xYFCaIbQLmtVSph8f2YAXStU6rGRA\n", "uE2WUZi6rghBDHS0brHicTBjHmI3WuJWQzInS6vYZFZHKXKfvSvaq1jbjGzzY9B3Ldm9DVEFBcND\n", "hLIHMpiE9PXYY8/TU9eHvP4u65u5GNB5L5fq6DALZ3utsjBod+Uivyqo282ER70vxWKvoaGiVroD\n", "dWKa6BBxnEfze5CABTT3p/m8nH17G5DRABXSEyYGnQqMNr19tweIPbAFFesb7qDYxUsCCmSudTXC\n", "ZnumhcNCv25Ffd8GYJyCF+fAngA8eA+PRfxMYfOJHKTtdUKi2Ry2Jp1fsmsASYZGdmpi2zgD8Pjb\n", "56vOxrisj3tt6P0nnfGllI19Oe3QJ3VJu+pGSa5nHyO5mgZLbuUe5uAGx7VUULz0uggywkBxXcut\n", "IlkY4r5Gt7LdKNuYRpnP7mnLLKqjEJVQa5N7qAYv7O0G/nJP5B4Y5DoVSH7yXdXHXRDA8NGSzRih\n", "JfIEa1S0U4FQ182RVVtDKw6U9/a2Mjfe61TIcaS4eQ8osSNLYHWtFcd17PLLQYQYl4IlRuTgAOqp\n", "Ew6vucv6uNdR65O7JeNehT3vFm+u5lxRqwOb8wkj4pkCGM/3o7EwCKimIUHpAnKPKCNdABMpll8d\n", "FhESXVa5jrXzXxu3Kazz/Zh0dEVcUF5e0wlltm3uRtEDCgjGlgeAmKvWcr4fq4GH1SytbbTeWBk9\n", "g/K8FMG7lsUAbeQ2C30VQUd9A9gQDkihYIgRSyqYUjRQUwkdCmQETGOyGFxrkzGatWPIwfMdMoSL\n", "MvJqVZ2y6rarBLGMGXNccbtk02pci4/2hBQxhgYgIZcBhyzn5dVBWDnP9xM+v1/lnBwT7oeIpQTU\n", "4myMxRr7Cpz9So6ThPPq0x9qvQm0eOtrz6w+oSe1GvAZqKJzREupGHJFjBL4Od8zdDNW7Cr6rGK2\n", "h8rdKkHifik45KwUwIqc62Z0hIn8OcSv70IG7QZwLnXUuf2damXsOh958wBWnYztaAk/r8/pHjZJ\n", "Tm+B2Herg90oTErOpSYPQaf3O0+XdVlPXUzoW6NejX8/vTZjDIhJ9WA6lehpEOvlvhMpSHtE0AI2\n", "RkHYbbs9SNJwNi5ugEEChV08atz/Hg54C5ABe62g/y6q62MfPVgBbAGWx450nWNGEAyOJz/z49Ef\n", "l60OzrsADAdKwgNmSA3NwIyIh+9FJgY/Tx9n+V4xwoArOhMgRDQWZR3zo9SEUhpGFTuOVWijfsw6\n", "3ZD6ZvDqsj6ulUvF0llfUtOAjiRmgQ4tYNmgmBKuJrFRvVE9jBsFM2hjmGKQTmKQrLc2SVjXXNzu\n", "uGMAkPlpz/UgThjUwGBD5GqS7/Mo/8Y/OW/aAAAgAElEQVROIJkeuYhDB0BxT2dtbthbjRDf09aH\n", "vo2a3pxNuzWeY/X6aJ3rQQw0xzNa+pgihjVunLA4StYaUPX4VDSstWHIFUvqzkfZMmGbVnKk03Oc\n", "l+M7uQ5qWzjgfhpxO2XcjQOmsWDU81vgY3xr5UhJvoyTXBYAmCuSNVlXqVdEm08AzoYuLmiT9Fqt\n", "ValJ8Ww/4VrHSK6mQQCMFFQejO4Uor1xqyyMV0cfI6Gl6qpdf0Bihwl57kbc7GR85JPrCS+vZ7xU\n", "EONmN2LXjdK1BgMw+L1VWKOWgpSHNesof1YtGQcw1lw3TKanxhs++yMaCmAOUA0RaAUIQAhFgVPX\n", "Pezt6Jk7RMtHk+h3QYBxaiCOfYMazcbJ2CSng5HEbWFz0THk9WHw0Z6DABuHdWtzCwBIEQOAq0lE\n", "Wm+VlfNiv+Lz3YRn84JrbaTfDgnDWpB1rCfb8S9qz5pxv6zvPIZfExNDewHtq+uG90Xym/7tTavv\n", "dMrrnXngtD9hW8Q1IIrjudnLsBMbgnZi9XeOuSjSRCaGBAZStEgfzdXnUE8Tbh6+zediV1TviAJg\n", "LUWZGULdvE/ZZlfnY8b+SGaGszTGUSlJZGSEYJ+bN7DvJ5MrIoJOi7ZjH9gt/mrO01PWue1d1se4\n", "/L42MU/Us4KeNkZC/ZmRc+GifD0NSbRhSFtEEwCjFeTaFfL6QGXaXrS7BjwEJ3tgkmNtPZNBAAth\n", "PYkoaeAP3wpklEZXAOBEU9cYBmQwPBaw6LfzoEvalDIeejePtmG5Pdw+QZQ3b/dNx6dnd+m4qcyf\n", "IjwAMphIkAHCM9HAcxbMnow6KELNBGpSj/nobybgbhJGRokoUXUzOgCIInwVcVOgXtbHu3JtWNeK\n", "U6eINW/1EKLShydSuEdpSlzvVAtjN6pTidgKDuoC0FpECMU6j1mFwo9Fu/DMP8j60DGpAC2YlflB\n", "Xa3rmUCGxECxbyeAKwUyGQK1ATmqO1t3v/dX/Tmm19exGPcezPz1wCa0+9kJnG/sG4OzUMZUDLxh\n", "vstnjrDNwgbUlMJi6xhirNziRVQ/VoIEi0F0eaCmwdVRgaZlxbSKM0AuUIadjDgTyCIb47I+7nUw\n", "q9NiehRiq6p2y3qDpqBgqrqS3OxGY0Y824tDyfPdhOt5wDglQMfaEJo1gY+ruKDcmh5GNj2E+8Vr\n", "DQNNdHTiWrV/hHkx4eXVjE+vZ7xUPYzr3aiil9EaB4ADGKU1M1fgKAONFA4UxFVG/KIxmK5r78O+\n", "eNtiThCCWDG31tCSHCtrpASOr2VMgzC11jJIrIY/G8jAT1E+91oaJgVYg04GtAYXLO3BjNpQlV1h\n", "OhWd2ObrQzZwiZbMZGMkpSqHkDCh4boMeL6b8Hq34oudsHFuqIsyDZiHVaxfs+hxlNZMauFAe9bl\n", "3bHoaxH27Ivcr/ph9ZS39wSc7Av6jgeshYrTzsBYSzQGBh/ctVWjbFKo87AUvUmyPag485q74skv\n", "3tB939K+uZ/sINJOTAqBhrWJjU+uwQScxhRxv8TNKMlOaaeca+3Vrw28qdK54fssOlpiXuztZJ++\n", "xMH/OnKWf4vr77J+tZcU3J0WRm1mObUBFAK1Z6LZCU5JhO3ka8A0xg0DK7WGVQHQFJqNWLC6Niqi\n", "Ma22+8YCXejIvdWfF/69tVfQrFQNDN8BZHAftqwFFu/nfndzLBRJ3YyIoI9D3bHtQRB9X6N9Bw5w\n", "hO5+7Ir9N+0DtrGxB465f779IA4ITcCMgoeMDLdwDlvGm/4hBBYt0Wbhe5GwVAPQWCAmBbsDchLL\n", "6aT0zh7cIZ3znIDsZX18i6MEK20xWbx2Qt6As4JElT8ZI+J6lk7oVaeFMY/JqMUl0B2pt/XstBe6\n", "+e9+eywcOLqy09EVYXqMAmLo3Dn1v+T6F7eNpk2cyCo+AOjiloGWePrzeJMXvcfvM+8CvLBoTQWa\n", "9QUspoShJTHBtJE4ex48Z1zWaEyJEAJa6ER92azS2EBnLGfH+EjRqg0uAuwWk3R7KQagBTuv9wst\n", "dlfsDzL2c5ey7EssKLXL63juL+4klwUdJ7ExdwIYrs+ycQdJUQQ9O02eZ7sRz3aihXE9i2ZPGBKQ\n", "xP64Fdh17uMDwsC4JQPjmIX5cbK9eYjYq53qcwUxXl7P+PRGAIyX1zOe7d3GNcWgbItiAEbt4p+N\n", "9q8Fd6uw4w+mS1iNhfFVinB3KZnE3gDQPY7L3dIihlQwDVJD7taEPCU9RsEcW6jfVVvDPMjocwoR\n", "aARYnV0i8YXntqrgqkoJqOEE9UledxaoHCkptWGUEwQAiEi4mhuuV70O9qteEzLqSE3GKUUcdB9r\n", "xfac6NjKu9bXMk4SIR3DLzNW8qbO+Ved+rUmDxY+aHJtiKoe68m/JKwLbWwUqjGUm8rfBDHW0oEX\n", "pUsanKKViLJr0cQOby+axQduA2yGn/aEnN0yEbnqBdqaKtYSsZSKQ06Y1yQCMIOLFI4pWRcFeq7s\n", "wi9Nrdi0U2SiU87K6I/fV7X+rdkbl/XtW0yga59Qtod6GEIfjiZqNymFeBrpAhTNwisGARGEGlhR\n", "ooOP/TY9ScaG9QGwSO9cMYI7JfXsBReGFN9tRBfieyuQATgTjgyBtxwn7g+TZYIGScFOHz9DB2pu\n", "E/UelOgf2tx6zwh59750QsLUqghhA/jKkQ5CGW1N3KrQRJMCeOCcRDaZn5dm2+u3RTvrpDOmpTUk\n", "0lNBnYuINSWsqWEoESU0FE2m2AEl86PXObqsj3dZnmAuISdsR5ARpiwMtVa9UlYE7QQJZuwmARYC\n", "gIyGJQiyKOBZtWe4WWxmH1s43d6YJNbt1ELxRosV76pR/Z/Fe8USpKOYa5NRup6B0Tia24/KKuz4\n", "FvDyTatnZXErbOa8DZA9twxsVTYX8z9q2fT7JzbTzoyZxi530n1YVDtJWCqw502pDVlzJlpME/hY\n", "lc59tHOzFXivuhOBgu4xoEZ+7kGEEpeCmznj9exFg5ynghSjOd2U6nkcu86X9XGvQ1bDgdW1+th1\n", "dybQFty8mtWZZE8AQ+LR1TwgjcrCiBFQVxOy08kYet0VyvfLaiACxSM5ujKb9obYt35yLcAFvz65\n", "FhHReRRmLFkFufB6d9COjPh7BVHujq73QGA3l6Ijxk8fH+lX39DnYuyRcT+gQsdFQkAMpdPiCaZ3\n", "uM9k0DnYQwvsMUUgQK1WlSUGFXWmRuNGe6mqa4gKbpamrByx2qW4560CXAZsyRgAkyUgJAy14XpO\n", "uNkNeLYb8GzvrlmiVeJjeKWKchxFVTnO9Ksp7AngVCXh3Mk8/Z3N37sOet8B/NCramIt3buGGBpC\n", "8YexFfYqmiIPat+f3k5VREs4d1jtxGcVq+HnYrePbgdUAO/Fo0hX5I1tXT2lZ610FOk6LAZitIaa\n", "Fcwg+j4ULJkK4xXj4JT50y5rD5Lwc63sFhUBMkzw5iuCFJ56PbwJELusj2/x3jG3iNon1fKaAIgq\n", "fYTS+QKmUefRB/8aVRw3cOY8yOxxLMHHDXBSwLa2ca+w7SnLwZD36EU0RUNl/x1gLQEO3lcHB96W\n", "xL/rDuW+pBAQU3T6dNSYNDg7gQVLH/N8nn/byTi33cdEi3MAxhDPARkeCWoEAuOfEi9bdWckffxa\n", "B9nFRLejLFFjL4WTDbBqzSx10TzOSlEascaINVaE2tHJ0bptOfB0WR/v2gAY1KYoZWtxGlzQcR6l\n", "I7kR9JxG06nY6yiJxIhqI1Z9Ek8Aw7e3bUTELmHe29jKYFRubo8ALoKzMIAsLKVcjbUE4MF176Ax\n", "jMH1ZdaGrQoX1xT3AHlPfMkCpMEBltCEyVLjVsxPNk6bexE9lRxKnwN6wKchYuw0MSpgDZ9Sq9jc\n", "Vs+dqv68BxWMMVO8WGnwZ4QUK/LZW5Nxkut5wO08CltmXrE/ONjUC4HWvrArF02My4KbDyiQ0Y+Q\n", "81nFsTYHU+mMNOBmJ1/XOtKGUVkYzL5rUwFb6i4IeHG7rOaEclSB4dLFImFhCIj6TN1IXl7N+PRq\n", "xqfXO7y8FjeUq3nsdCGkFgkhWPG+6LiMCIoWM1fg3w8KHK6lWE7Yr9D9oWduAY/LqQAYo77vX/RN\n", "ntIamtLbQ5afkplLW9V5TDhMCcd16MYO5X1HbUqnKOMjZMrJ4W/bCYG1GHCw5GLAqhyrgGPW8Q61\n", "26VzDO1Wc1EhOQRJllMDqJMyjxvbb9re0hlzSBFL9thHZgj3513ra2FiBAUHHpu0yu+dvs/JCx/Z\n", "xXvMaoTDlJJc9ekq5z8C9BvQWcahNkRlZvQ6Eu43rJSdQvDCKZtcMsvECzNKIjJSgHMwatSYxPkD\n", "kIcziyOZpXQxFrErWhVl1ETFHoAwMIMdgbXIxUMQg4UJbcPCmc9V7HO48Bi/vNP8xJOhqz/dD879\n", "yc+sw/xhNn1Z3/JliXQVsbvTmUdJjtXOTsXtpsGdf/g1pYiYhC8t8+QRJfRz4F0nkgwQ3iMnFyvd\n", "BwhgDAogxBh8LEXfp1SghCpMDEMxyDjwSv19upsUCU6J4GraOB4JJVCOR2uw7i4fQN7hDQjFhYrf\n", "d3+s22pU7mBdhxRdlLjv+tbWlAnRNBmoAALW5iwUAJuYVTsQVtMITSBcUG+I9GVvGGqwERahaFdh\n", "teWKJQWkLP9uAp+6HWOsXJgYH/3KWRodHB2gExhZEYB32MQ+XXMEo3LriAfZEWNCDKLIT3FNjjCt\n", "ndB4z/zI3ShdAK91t1K9ngY867qtJh6qMaI11c8KFaVGpFgtXznHeiNb631thiWqhg17NUXRAMkB\n", "CBXKTsOXZ2QoqBIgAHFpFbXGEzBWOkkp+PPBgIIUrPPLGfXEY1FdMN1GeIqzcYvGkM1ICa+N4t1p\n", "oB8pkfjUlIlxWEfczFmE9CbRMZnZ/YwRMXhXvVQVk9evy/q4lwkrrlkF/bPp9fV6GFMU4O5qOilW\n", "FeC8ngeEaRAWRoqW8JTS1Ma1OAuis3I9qMU0bVhjgGkAiXio6mBc6/ebWf8842Y/Yjck0YRoqkWY\n", "BdwrWiNJl78YeCLjEqL9cL9mAzBKOd9gkj5S2DZQg+YTb4kzfQ7DFaOzcglq8PdrA5rej9K0zjY+\n", "O6WMWVkw+zHjes1Y8+ggE4IJfQINs+ZIIUiekqs01TlOc9ezKwiUNmVjrNWuCZ6jO7ppKoujFWG7\n", "WtdvAGL3bHrWaTZtGHzaHJLnAVRo2KcW3rW+FmHP0GBdsLe+Fl6c9ie9r2HbyZ94DLf/9uWW/V5r\n", "qAGigBebWfw0REHNY0CJgmaRPsjfN/Es7Ux6d9K9eflZOMO0G4kyjt1cmQjUXE+DzJ2miKAXfa5V\n", "bHOCJAYsHjhT9uqw4Iv7VdVlxaqIYAYTI0EpqyUVuTWMJbgKfzfjz8/Gh7jZ81SfGSOA0dPxn5Ke\n", "nwMvzEbx3Dnr//aOpOUx1+BlfbtXD8zZaMYpM6Lrvo+DUIbnQe5HzojPA+9NeaqVENBQsJaIEDtL\n", "1eYjBD6+4NsLgLMKYsCoLgRMkCnOJFCwvE8MDTFEZuwAKlqLaEEy9/Ie17jsx9blaFYrxatJ5vBZ\n", "wDBBbg2mZm4JSYqIS0DMBUsA5Jn0/kAG4Da36QTAGJM8DFMKCCHaqAw7jbkqUy4LjJFqBWLnEGKv\n", "1+tAKaT9ToboY34yYxqAIKAVk4PaJM6voyRQY1aNoVpR1HOaYEeDF3WX9XGvtUriTGBh1fyB90oA\n", "7F6kOn+vh3GlrmNXjEkpyRuX7tqsHYBRinXhjllsE0vdUpKl4yf6WaSLMzd5rsnobhTHEjKZ1iJg\n", "Bgtr3oc9aJe7/MFHSt4vHpCBQZHLKSWJ4Lkio6IWIHTuQI9d0suilk4QIbxYUVq0z9GU5YHgnekx\n", "BRVUFXBDHOsIYjhrdqW9bT+W27rR3dKQbeSnWiFJbYzSVHh1M3osXa21DDhMRc/ZYE2x3Qmrl88h\n", "AvhkY1zWx73YgDiwAaoiwDbaAWEeDUPSOJQs/ogzkowMzMbCSJvCjG6Nh7VYUdyLedL5go/FqNob\n", "V5MIGD/fi2Doi72OkOyFgfHiasLVPGBKCQGw+wqgBkfZjJDcqo3n7eIjLNSG6cFjNnRC6BpJm8ap\n", "ArRai53LbYxFGl0ovK9rW9PxkZOxtQYBuJGAsMp+DDFgHFg3ZtxPHaCg7D0EZ9INSfKzNMjIH+vF\n", "o7JtejDn3rRPHGRelbF3p5art7TdPa5i3Zy1dmwgdRcIEWFMmKnXpM+OvV4vBFWHISHGglAF3GVs\n", "PCpb5l3r3xzEiCGoJ24zFOvcs2VbvHa2fCfDANYtC6FjUDy9G88HXtWLodWAFhWah46YxGiie4Dv\n", "oxUqrQMxbNxia1uWFMncjQk3M/2V1etYPY+f7yc8m+Xkj0MytG4tpfu7XJR3S8arw4ov7hf88m7B\n", "1XTEL++O0jk8rJJUqOKuo/AiJNNykU5pjBiqWwdSrAvwOVYBKqqPqFR6J/uc/vsmJVwb2hWBiy52\n", "vOlaeJfeCrtMl3VZ8uDoqM3GIpLrRx5eTBIp6BkNAd+N0hHdTU4hbpoMlhZML4JuHK650D2o+iI5\n", "OPthVNBkTMlYWElBS8Y2BxEboCyDBrqfBHHpCtBtP+6Y9N0CS8wNZNU4pdZZBrTOI2pruD2u+OJe\n", "QNMhLYhxhdAgHSCoNaIGb40+ZrcsAbAxElji7lolW+0gHiPpJlSk2sXo3NBSQCsa+xz37Iqqfiyu\n", "dddCNItdGbkDWgtnqJpFBbaKFDQlIjg3xo/He3ahL+vbtdZ8OoblriQNHheov7AbmAwqeNGBijuq\n", "8mucYaOjH/cikGHOF10TYsPC0O1QtO9G59Gf76VgoKMZIE2RgIKcmgmDM/aYDoSyDsjmNAD5PY4Z\n", "Y2GMYRMzGVc5ttXK+2WD3pCqiDGaIOqDfE6PsQEpOgpM5sU6uv02c66lG9845mQOCLV0Ix612Wsc\n", "3HImb9WGIEFVWQP2peFqLrg69tcFmRjJhNvX4M8ia7ZdmBgf/eJ4gbkRrsVY3A06Wht93H1/BsC4\n", "mgcEOpIoQxUl6yiJOl8ooHCnQp73RxnpYEyqrWnRrjauWhA/U8CCriSfXM94cSX5yG4aMKj+lMU+\n", "zckOus27YzYR0ddd8S5N3qKOcbKc5RXV6vShwxKBSVRoPvEw1vQ5VdK6ihoVXBXBRv+pfcM6SoAf\n", "7k/EkDLGtFrz+1qZFL1jiDTJhY0Rg4xDJzhbtAcxXpuw6oD7IfuIR/PzdVgL7o2JsdroDQVfR37u\n", "GIWtMCYMU7IYdG3jJCN246D2r5JPrYx7ZKipJsq71r85iLFdb3+w9Cedc+APRwmCPeQb0CWk/jB+\n", "byBD/1c1gVUWMmqT0ZKoHddYWWDL1moTRKmiYyuw+9p9NmpfcMbr+V5Vdq9nfHazw3dudvjsZodP\n", "ujmvSZNmqu2SMso5yNtjxud3R/zr3RHXr44b8ZSgXUP5MI7YWUFV3VGltGYsj9AdfzvWBC6a/z5v\n", "OHYVPwyAQcTSHRHC2etAComGZsKx7y6SLlSMj325o48CcNgm1P0DbFBRz3lMJuhpDj+DC+Eq8L8R\n", "tCPwWLt7pbQt60MK9a5I7hTvxyFuimZAH2ylIdcgdHEi9w2oVebQa3CK4pe52mkrSlbIqLOv+1ES\n", "lRd7B1k/uZrxfD+htobP7xfMw1GVsdF1X2EChSUWxBaUIfJl7j+9/zswI1GjI0nBxeN2CrymKMco\n", "BO9u+LmAiXz2sazyNdWBz9Btd1QnpxjkdTJa4gnTnBPmoeAwJAy5mN116dBdBzK+xGG4rG/lMn2p\n", "DshgoQo4mDoqrXrH7qdSdp0VJcBCSpIQxyJ3AovxfkyB3727r+CtJryTOgFcdQzR53ttrOykWJmG\n", "iBiiNVKKNkAYp2qFbXdVYIaOK+cU//vmRR+13tjwCi44PCjAbHlMDSgIKG+IM/FsHqHf9e9V45SN\n", "B5OVoXoWBL4JQBP05YghQkCp1dgPYHezExd0zQERuTP2GEeR7XwVo/WTxcJ4KONt8udSpZN5pTop\n", "vC72FPfsWLalOVtt1XNzWR/3otgjmduLXu/9KAmftQKmDsb66YWFwzgAQ/KZCQAgC0NH32njercS\n", "SPDYB8j1PCXX5CEL7JPryYQ8X2iz90ZtVQGPp2xisLPfsz5urSCXz7pmd4Li836Iwu5k/nXKuieA\n", "EVBRALQKtLCtPfj6FFzTwsdft+9HoDlWAtmep6BWrBk4hKIueQmvx4T9tOL2OKqjB4U+/VxN6qg2\n", "DUlGNyBjIrS3fX1c8eqw4NVuxOtjxt0yyPEo0sRhvNqOnvjI0VGfIft+xEC1MaK6X/K6oNjr1ZQM\n", "bKfmGzXiDGh/BCvsa9HEeFfietoJZCeTwZqvAbqkXVH31iRx58PvQwAZjUlu0MmS0NBCkORXu4wU\n", "wDzt5Al4gU2nzbscQju8Ggc80xmvz65nfOf5Hj94vsf3nu/x3ed7fHYjgjXX06hq40FRxYz9OGBQ\n", "P+DDWvD6uOJfbyfcvBpNOMUZIg4yOJXdExcm8EzEhaouGhwBfhw96dDPBu9evynR+DLrTQCGXRPd\n", "/vAcwfZLzksMbwcyzoEgl/XxrQp0gp6ekPYoRoh6v5rgbjL2VK+Jwa6b0BAbhlI1dslbMTbYyILS\n", "5+CbsrnuUTtrc7c9JsExuPZCidWKlNqDJFHjUwg2vvdl3KA2+xOU5ZBchfxmN+LF1YTPbnb49GaH\n", "T69nlNoU8Q+WOAgNWhIizmGn8Oai4m37YnEAvStJNBo1afb9cYIep6y2ZHF1enupotBfg7MxDNxQ\n", "hkvvUgLIsA47Q6RlUwF9qMFi6FoqjmtSEKo4QyQEGwVqCpAIA+hSOHzsyxkS0tUqdPvqWEBsfBBA\n", "3Y8JV7OPleynAbtRupYioyd6XcyRSNX14rhsRleMhRFPRPtmn2t+tpvwXBlY+2nQUZKArNfwWmjP\n", "7vdDz2DIRYr/Ur1g4Opzv6ANC/6z5S7dMWtM0FQpiLo9ohEWEaime2b1eSW3zbc7nW0XMLailIAc\n", "O9ZC5Xhws3jLooFxO6nYJt0BJDa6qN5hGXBYMu7XJDoAgfpjFFBvzsLIPUvHASCOHsYUEYPknftV\n", "LHD30yIjgKOMQBKET8eIgKKfzxl9pN9f1se7TMuKWiylonbdfdfmUYcMrWP2HZCahs6RJAagNN5I\n", "7oi0bm1cj2u2+MdYFGPAqHbSjEEvriYdIZlljGRPO1dxJCnN2Y1kPVEH4+64ihOKMjEo6HlUvcJ+\n", "u0MMlvMNKZr2T/8Mz6onI0tjQXjIBmftkjianJKxa/smscTIKKOFIaiWoQMZa6mIoeCwBkxpxe1R\n", "xmxEGHXcOslUZ4iNKdkoSoMAscdVWBivrlZ8fj/hi/sFrw4rXh8S7lJEikWZYc2eTTxn1MQ4dgwW\n", "6fho/Z0C0CIwJGPRUOPxSp9fBHo5eig1JQVFhY3xrvW1uJPEAFS26d6yYqDys6NV/UMH4PEKiOyk\n", "NgAVJqD2iM08arFp2DowA2jdfvlGWtsW9qddthAU2VM70/0sVM3n2t38zs0O332+xw8+ucIPXlzh\n", "e8/3eHk14Xo3YRpEAXzNFfdLxtU8GG30uBa8ul8MjUwKblCLwy10NEka3EqS+8jiKCgtKoSGWB8e\n", "84budz4QeLE9RtvCha4MvfPA6T4FQP2VVZDrPeZgL+vjWgbstS0IQBiUyPk4cAYxGoCxS/Jg3WtS\n", "OBjCLQ8PFtoAAdam6tiuvdHHBj7kSImeWURMgyXFfYezlIbcIkIoFptEbDggn3Qxn7o4d02rxb1S\n", "R19cTRKvnu1EcyIAuUjH43ZJmI764I8OSL7P4vkA/A/WfY0dwKQPRer5APBxkhLkWKGh1KS0zWhz\n", "n7atjpVR7M/eYYgxbBKcQdWVc5WysdaGZagCbq0EVrT7oqA8abm8Bi5MjMuiRkIuLJKbzVfzuks6\n", "0sYYJODFaGKeAqwOxtisa/F40ZQNkbfjCQQUDFANpCBrgTIlXE+u0SWinpxvHjQpBtYi1/6guj0E\n", "a8lgoHj4WnSspW7zBhYO/XNeIliw2Nlr2JwuOT7AmMTSOAVYrgBsIyFzSY68nDahSoPPpuvPawVy\n", "bEhaFBFM8DEc+SJjhiwWHh+6AzTArQRVO+h2GjAvBYchYlGlf9tmrZ02RsFqBYp3q3nsphRRYkNt\n", "nVbBzOsjGTN31GIqRrHmbgpwleId3Mv6eBf1clgvlFKRm8ciuigamDqlE/2VpLaqSfURgnSMWlOg\n", "TAro+xMHlCMdeKq4iIUAZYEqY32SOunFfsLzK2dgiD7PgHlK0njKFQvUJlTHJsRtRaxcTUhUAZSj\n", "ukXWHjhRxtusmkDz4MV2zzJdc8FREFfLGUzgkiGVtSyB6JSsQWXsjuANlFwqDllAhJgLjvDxGgIZ\n", "h7XomI2yStQx5O7E+lSautI0R4qIqptTqrBhbpeMVwc5pp/vJlxPi+W0aS1iMavHUZhjKty+uInE\n", "IRfTe0xM1kIQEGuQa+Fq9JGSq1mumd2QMI3RWGShaL6mz4flEYDq1yLs+bbkmp+dHaueNsxuRP8e\n", "TDarPWmaoiSwB97bt/j41bo/kMZXuot089ouEe6XJ96S3E82c+oWRRwr+c7NDt97vscPXuxxc71D\n", "2I8SFNCQ1oLdcQV2k/3sai3YzYOo0eqFfr9m8fU9rnh9HHG7ZMxDwnEQ6uIQK2rT2fD+c+r/WlNg\n", "oPscZGH46z4cgNEfxg2AEbf6Ak4DDbafVgzoaKjYKL6FjfGB9vmyvrnLgUYfK7F7Vp+9Ymss9+r/\n", "z967M1mWXdXCYz323ueRmfXo6q5uunXRvQFcQlxcAocIIghhEliKkEWAyS8gZOKgX4CHIYuHB5aC\n", "wJGL+RkyIPjQDaRGLVXXIx/nnL33elxjPtbcJzOruyU1UlNnKVJVnVl59jn7MdecY445RsdOHKsu\n", "YOiNM0n0CM5rpyKVsui863NSlroxsmSTE+tOKiCoc7bupKNPXQBhOuRAG74yC1hwbnZO46SyQD4j\n", "yFiV1cSBtULjcXREY1x3EWc9icBCLCsAACAASURBVGw92g5E2ZwLrvczVnFGH4JqeMjTJp1ZetXP\n", "MAdvUAwpQDy8oW/LHLpnHQoR3aTPkrJvVo8cJ6TTHQs5l0gMFCCX7on2fuXolMA5ZX90gTrRoRQ4\n", "BkhohjRgz++FAKhMRYNbdn1PmhinBUBZCok74hqP0IQrFeAUPR4zJrDuA48LUJev1orZi7I93cvk\n", "iNGK8DlXFexTQU89Fh1DhEOtoOf5usfZ0GHVE/OqFNLCmEMxwK3ocPBx9Jg8X2/ACNv5DBb0VABD\n", "dDRwa+bcPjkejm2uGzBx/G8kjxQR4Oi9/nvJ21KpKK4glaXwb8lknZ28M+eQXRtKO4ACvtErOy2X\n", "QvGQu6ATN6Ju+GvXzdhPHgdvgE4GgeZimlH8pzg3SONThFgDf+o5BXW2E1FP+YoxELjsmi6GFGWp\n", "nJgYb/oa5+ZeJPd35bFKGa/tDJgqrLCVOCnKGEnwxn4DABfo1kJzP6eFvSc9S/TEivOO6G4004Oe\n", "hT2pXtquOvR9BDrf6kC0jr61ct2x/oNahB5bxzIYuNK4ynoyBnAABGyoOAQHN1MjiUbsPckIHGU3\n", "nvMGZbAI6ByJkaF5XZFx1IxdSAiTg3cZmKl53YSB+XONCTf9jJshkkjq8eeSWBk8ED1cBXoAZ6Vi\n", "mjN26w6Xa8rjRN9s1Tc75ikRI1W0KmTMaD+zew3brM4z6QQFFhzWRCd6uBjQmfFrikfy+aOO1zhh\n", "DZY2UvJJ6+ci7OmYHnl/Eem0Kyndh+AoGfZmg7L6DK4SogxfUbkjSDTqVuTefzTz9yPmxl2/psW+\n", "qeJdvfvfHB9HmCjSKQwmEe45IGw6mh06X9Hs+XbTw50NgIIYAKZEN+Wmb9+bM7z3OCsVF1PC5X5S\n", "VWoptIS6I4lC8B6+1Gb9Z96/golHJ+/TpNvH1/bTnFf7bx0XfwJoCc1e/eCVjdHuA1cYAS3EYqqV\n", "nBpOjYXTum9poboAMEx3yxk9DGurGoWF0RTf1V4ZQMgOnpNjwTCabsxtNX6PIycQtjJdc6GyYtaW\n", "gAK1krCvikmWQAUK6y7I/tHWp38I5BQIsKPWyabYdo7UyfvOsxd4xJyLdvqUMSIMucUMPM2rf1bk\n", "swq1jsEZ5wVgavRMsp4M6ujiXCsEos+cTxlXpUSFXnDH9qfHDjLQztBCF4PdEJwHC4c67Voc5qD3\n", "ioBTOuYiM7N6P5yC1Ju+pFiw4wJa5Dss7vNmrdfEPQceX5ARhlzaPimjJKmIMKSMJ8joStv/vUcr\n", "UPo2PnYmYr6c7Iqop3NOXyPMzJSszgAYDFyUBtDYMRLb+ZT5aBUw5v29VIptIjhUDYuDJILbi3lP\n", "jDiJkwJUw55LLzP9pKMjzA951kMhAIMcThqQUbB0nWsirEvXuVawUE4XvEcple1fxd6Q1f7HGdd9\n", "5PHfhM5nTK5w7GyjONIVb8BJY4A4tJxS2METAxZyj6xu5YEymstOV5DPdYpFb/qymjli86x7P8RR\n", "kV2SWCtrxcX+qguIXSBAIfrWVCaago5HiVAkjVQlHl8pKiAKOY4ZY90KkLru8GAt7LCIQUREvScK\n", "VYKCkQQWCogxNxcOZSwUtVL1zPxY9UH1G7ZDh02/zPMq2rhsmOkZIrFMj8AjHMeN82NNI9EzUt1C\n", "LwwJEvM9zJnioQAcoHM4MXiZBAhNRw4j06yfbWY2hsZHTxo93jmsa8VZ6nA+dqxx1CuIsWGLbhrN\n", "hYoNJ47lAjqNzMIYU2P498axSXQxEAP6PigoJHFpYMmDPpBWh4NTdmouv6Aghl13hkrXRqi8azPZ\n", "ajtoCljwjVMqAxYAZPeqToCF1wdkYX7ofxuqEBhskZd53St96rBvaJJyo1uqkefuQGeKJtcFoI9A\n", "35FdEb8OcqHvd5HegXNAygiq+Nrmw4PzulHLnL58bu1aLDqOn/Fzycfj/3PmO+380qsdMa3ufR0t\n", "GMzmfBeQofcBQBaGKAxkVKA4lKPOjbyHExXjtAjzqguAQZNrflYCjwIoQyK2jtbQed3cnHOqKB28\n", "J0Fu0wu0XfdSlqChte7sOwI0ZbZ0o4g9CegR7bAiZgc/NxG4LnuM3rKUBCi5m/Fw1+1fzZ8iPipz\n", "0im3rowkz4BQp4OOnBBoI5Rx0/E1v1uOMIzXvRf5O8PRqDwzpowMGSkx10a0MaQwUbFB3+b0UymY\n", "YkHMHrMvcBQoFMClnKvdF/YNed8sDbvY7ApFKG9KEUOXqSvO74W6DZYmL0yM0zjJaUGp/EvBS+4O\n", "ujZqNhwxMVYxmKQwNOtfFC1oqRg2oyqSdFpQAVKgeD3OKtK4iqjKiybG2YoS3Y6pyZMDZrYRlXs7\n", "VyqIZYRkMqMklt2k8/WBYp/ozKjDUCX72SaAR+xRZXQZUBgg9oYTFimOhJphrWMDs7ZcAzwhgpoO\n", "c+bjMZCh9vGLuNbiooiVysHE9lk6mgDQBXrNXIiSfTMmXA0dNsPMcauxyGQkWcaARMdENEVIaJFp\n", "98KSUwDIYYhlwb6wwp59DM2ymy+YHf85rTd7zZm1cjhGLAHVtvf1ocWiddeYBV5ZGFJoVN3whIkh\n", "Hf0Dj5E0HQeYWET7ujZ3WdiTxtkoDq2HDr7jOsgBSPROLVtBBD13Y7OA388NNJHjdQyY6PjcumOt\n", "jajPp7CkJgYPRPMml6YzRM3zVuVIXamfh63qz4YOm4EARhEJzwXMVEnq/OSFycpNINIMERePwroi\n", "xvqUBT5HBYVIx9FRBx3wDqFWbFNWZouMCG5XlHMO3Azy3sGJwGeleC56KQcWYh0NGNSSOyeIMRA9\n", "YgyLfUtGdZa5kdwqDbz9pPVz0cS4r3i07AzLxBCv21bAthewLhlJ/puLD1GIfe17AfT1FFSAQ3Ui\n", "p9UKAdlQgc9e3B8fsyXKptsplqWFPHfbfshvTFTlBAWQm0SqFnf82s2XPdtOaFkWaz/taudxeS7l\n", "Z4KuidCXFHSfDGRY4Eo6DV6/Z++DUiqqr3C5AuxP4ivb+aLZ+Z7WadklWhWtY9d+JgkvifDymIJ0\n", "O407CSHWBC76XJBLU1uWW7QBGMtxCj0OJwaWkUVUbtLLWXHi2ZgXFcHRZpFLxSzMKmEwYSmId/yg\n", "WZBQzwUX6vJPZbP0zrFQJW2Kh7l1aWbp4qIxHFSILmX6t0ZoSmwVjwEM+16qCbILIOPov+Vzaofa\n", "sli6JoRa5Xx5oWxW7dBMUSizHskV7upKh7dC5uMXwswCrvt2X0ROZLyn4mpOWRM6dZgJy2ukn6a2\n", "scfTenPXfMR6WqrkG/2X4DEEsXdmIIO7WlIwO2aFMaQPERnPUgxzx31WBoEk2y3R7rVbGHCm9qrN\n", "ZnXTR2J88O/G0PQ3xGZY2Beiw5FyZoFA+nfekdDcENtzu+qWtO3KBcPoC+UQSPS9WjRmFc6fcquV\n", "9BxawJgEMJcxttdzRv9GgJ7DLMVIRp0zqjOC7bkJ3clYieZXnOs41+b5ZaSk52szl4I9gxhnBxa6\n", "48Q+RhobZIa6jgGJTgqNAImWiYA0zU4xBKJliyirONmsOq/xSISaJZfKEBcZuh9O681eqs3DhaQw\n", "BukeayC+sDHouSXtiK4LcNG1URK5wRixn3PBKPmE2LiKQ1ImQWNAGGFBR1c3A+m7tJES+rMbIiBW\n", "rgCQG9g4JxHPbQ4oNyOPQKSk+Qsdz2nzSITLH25Ie+Ns6LBmoIH6x+T+08dEjmOc9xxSgZ8zudLx\n", "Fq+Naq5f+iBjgPIZiO0hLk+lil5ORt9NiKGJJGeJ46ZupNysiW2qc4hxDckkBSaFFMC98CEXnK2S\n", "Mu0krq8HAsWFHScuL5rfaT6YVYxVRoEaolyZGUPHdAbwElF8yY1sLAKgNf2nAVR/Lu4kr2uAq7Xf\n", "IlEUKz1WvaZ/SHQ7sBtJ4bSzkg8ugRm3xxiOl1Cvm/sFIOkx+HVoBpMKcaFZm/zzMy1LHyaEnaxR\n", "D4lu2puJ57UO5Nl7fZhxNs6IUw/EDGpzVmDKNFIyh/bicwbmjMTex1eHWb2Qd0aBdxQqonYZbzMV\n", "Ps2y4IVnBMieRz2HgI7bVJAo6nEn+tZru1bYUBfKq/VkKxBbhVi4E0opG12v6ujeoO6oHP20Tqst\n", "AS50zAOtIynFqnQGxU1Ii4euFQ8dd/gdQPoL5h6VovguIAN8LJnP7qIjQc9uycRYs7in2HimUhF8\n", "ZsZDwTibLr+zn++26C6BMy3WtsdImG1WtLdRn7vZYz/N2I2xxRWj7j2nQvRoiTsHojbueGZSqKl2\n", "X/K8ud/5PrAEVez1sr/vDNA0dO3cyVgLQJuvJAMyyzqlQJ8rOoQkbiZVz5ucB6GuC/QijLmoKuNO\n", "xZUdx6Gpi1jFbHzQCdjSDrNpTglYclpv9moOHk0PAwDtqwJyckHccwKoCWEkVlgfKVkEmgAtYATj\n", "imgr8BjJkUOIY0BQxUN7cgQgJkYDMLZDVD0Meb+N9tycnsQeVMYfUmmz4g48ksbgBTlpMLAQmttT\n", "qRVT9uimos9oLRXZNy2vwsCCOP20UbgCI1XBIs1etT7Whs4t+QrFu0IifpPTzmCZm26OJNjENMlq\n", "55hL0SaR5Kxiy00jPkTnnrlIuRkSC911WHcTsVGCjMLltmdIwVKyghkCmliAxnPHx7uAvqvKFFzF\n", "iCFGsgaPjalGY9rLuHdiYpzWIkbUJsILJ0wMp7FIRl9lNKCLHgiGiSGr0ljpzGNsUy4Yc8Y0Z40P\n", "uVaIpIJ3tH8LuCljq1sptgd6fiEsjMAUCS6REo9fHWYCL0QvgpyAiMEgLig6RtIRYPtgQ7qEj89W\n", "eLjp1YmpDx6Vz89+Sogca+ecSQNrIpDU2ySMV3DMXuH4sx0iztckGbAQSa4krLqbUmP5ogkCJwZ7\n", "Js5R5pQxJs8iqQxmjLNqjUw5MzBZLe2f3lSKC82jzYr+blk1EiNk9DpXAlAnZoHodeQYWEtdyisI\n", "cBKNu5/Eoc46ynk4R45JApikX0QQY0G3uOtnaEWxIFe6GSj9rfWxSqnIaqPlNWlXTYV7CtfW/WtJ\n", "qXT37Q1YhZZoCh3BTI47l59mVdDF8blidhWjp+LgZpxx2QWsdxPdUIw2ynzSwxjgayWgAgDGGWU3\n", "0qbV8w16SEjXB7y4HvHsesTz6wOe34x4uRvxaj/hak+zYOPEqBlvumqx+hk+h+2e2lEYa4vaQAyi\n", "gKsLihVdve/8ucbAkDGS6JfCX97eB7UiO9mIhW7q4KuDczyj9hmv1Wn9919WC0OABgC6WXsuOqO4\n", "CYXWeVBGRqTYJEXuzAFZmhAOy/ihtp1SOHinnQ1JeJvzgHx1Td2+VrbZ4vnJVMg+1Ms4h6AB8inb\n", "XU+sD7CtVxPMBZbJsliNSbyaUsHBJ9yMHqtuxnY/49V+wuV+xqvdhMv9hCkV/fvlfsKrPQGpqpZt\n", "xLOU5eIbw04LoNLo79nECLo+FIyl6JfOsewRfWgjPkMX0PH5IE0MSjiEiUFdhIBDCIi+KHPG3gvN\n", "vWapT0DnjdgfffDoWFzZZ4daKsacW6eBi4amQn6X29NpvelL9mIpwuW+EKaWCoIbGvcQA1YmHvnI\n", "c+ilLhpGCx2YYlgSuXXygcb2kERbFOU3BsA4W0Wjh8FaHqmNurUEtCwEKVXnQ4sUh8438dCzVcS2\n", "b1obIuYuoEIXEugRbmzVXJpmBhVbApbYoojBxwWVO7b8amigiYC2hzljNyYmvtL5IbeYBizIORTX\n", "FRnLaaM5TlktootDgvBOj3Ezztioo0Obuw+8JxTpKlcZ6WujfcLYkbE+JwUKF1axNI0gAne9AhiR\n", "P+/d422naPSmr2RBx2L2W2E+MqPJitf25j5fjpIAtImzOG8usJobah1stCkAwiQ6U/Qv8qGBdANj\n", "H2jEXrQ3qjQxKfaogOhkhUTzLRZG8I6A1CHifE0MjMdnKzw5G/B4u8LFmu2kAzk+jnPBzTjrGOnI\n", "oyVdDAiB4oYHIAah0qSR2LpmsOR81eEhu6xs+o4AIJCA5800YxWJ7UaM28b8mvj5T5WYoso4UbcX\n", "+szEkqBz0dDOFiPQB3Q9ncuN/tk1Mfno1VWNWmZVY9DMI4kTsz1mI8oaGiq+OKY0mvpgtXnaaBun\n", "aHwNf1GZGEf/ffwWqThuyXU0G3dk4Tvn26xk8WQBSiyMglI9fMkENGkhfftE2C6/UHy1I+iX1GZJ\n", "ZksFciHtCMeoVAHgcNtG9a5V+f8Kd0+RATffLtI7Bmx0NtTRJnYxJ/RDBwdgGhOub0ac54quDyi1\n", "YjzMeHl1wIcvd/jwxQ0+fHmDjy53+NHlAc+vCci4PpjOKAequ2xgX3f95NxJIWK1KqSzCr6OMOdO\n", "5pwAkGaFo+/dSXXnv4lS+nESp7a7rm28XkAMyDGbuFk5lQmndccSAKze8QzL/RxM4dDZuT5lZAR1\n", "JqkVCEnuWYrILUE0gp7mtpdC3HqSr03xIJZUwsQoXBg4UAHRumpOJ88Wn818LueagKgU1cF5/Q1R\n", "wve5ifVpYp+AMCb0YdJN+GJ9wAUrW0+p4OObAz6+IfBUgNMbFu3KMnvKm7mIXdImyQADWiFAIXjZ\n", "KSZGxHLp+TMd5DVTqEWIK5VK8+iOzsmcKw5zUvcQq1chF0fZGFh2qmX+XP3eo3RygeApnq5UE6N1\n", "PWWjDrq/VP3Mp+h0WscCug1PlThkO6A8psDJJmmvBGJhSPGQKDsBDNBfqlqqCoAhzYQGloh4aLPp\n", "3A6tW7flZLePgYv1jIPPmhfX2lxJ1G3FaunAsjBY5G4Qwb6e1PG7oDoVqRBrQYANAUnka05GqyI3\n", "21PrgEIxh2KrADIP1j3O1z22PMYhs+1zrtjPSWfUS23U9FwqKndvhUl7/BktU1dyWInr4HOcc8Fh\n", "iLjmYkwYKDIOpALAkL3JjBqVNpZ3rC3ECCuACm9YO030ldk8d1C4gaYPdVpv9pL7mkDHNtru0eqz\n", "aLT7aCyA793oCYHQDo58NRBVi+DjcazaRqOadg2zifolkLEehIXBrA/nAMcyv4WAmJGLe2UpzAmj\n", "dVypHBsC5XLbIeJi1eHhZsBbZwPeuVjjrbMVLta9js+VWnGYs4oaz5kYqFScW/Hudj6lWR61kKeY\n", "d7Hu8XA74NFmwNmqU2A45YKbidhZgTBpHekVMIbOWaZ8hhkuYzJuLxPpVYjgpia4GiMcECv84rwy\n", "G84ImUbvqSbOBqDWcbqi128SAdhSDIhhjhc8YhQBdt8aPCb/8pzA1ipaYb+IIMYR02HxMzQGBiWJ\n", "njughNxEq4uBRn12rqDCc6C3jAB6gkTczR4HsMKhVByLfeEtG1dGwkm4jTuEvOlTV5CADeCTO2ra\n", "7S0VtRbT7VvO5stny5Vuwv2U8WQ/YzvQg7SfE15cT3iLxV9Sqbjaz/jx1R4fvrzBD57f4AcvbvCf\n", "L3f46HLPIMaIq0NSJWAV2PoMAEa7hi3hEWG9Y+FNOX/CWsmlwmkJQiCQHTNpBzLCp4aJEXjj1c2X\n", "b3rZ5FOWwofOX6iVOukl62ud9ufTumtVRhhv254u7TT70ILvwg3AeWSe0ba+3zJOgmpF6I6ZEW08\n", "QZBqKR7Ee33LIIZzNBo1JRqYlo1NFfbRPsfSGlTGY7wRDpaZRynemxgW0SMdjYDwZj+ngj0Svc8d\n", "UzyHBrZMqeCjVwY03Y24HmccJho1qYB+Tukky8yl1foQwTzZNCufV/ksHD619Kdz6DWhUhG7nrRK\n", "PLO+xtD80adUsJ8jhimpI4LsOwp4KuBUzb1RFzFJ6KF9IMGvwNT6VVcWAEbHG7gwYCTHqXqcU2B6\n", "01eRMZLCwrfV3t9SOLA1O99zQ2g6ByE4onHTDa9FhOhulSI2pU1c0zI+pAHR6fN53AHtdARj3Udl\n", "FpRSVYcDkL2e7VxZ7G7O3GWVz+Sbfo11Ynu4GXC+btRtgKxJqUiYtStphTVzrovxjskyFThxD651\n", "QLcDHevRdsADnncXB5Fa6fd344yORUpzbU4Es7iWCFCT2/uYxRqXY5Nz7XP2zJgBHIIDUo7YD+2c\n", "rjoazxk6imExtDiB2oB2oVjLn9S4a4Wf0sU5nkustYww0eexMU+x24pmFXtab+yS56eUosACABpt\n", "Uwalbw3XyGOV0WvB2vQwpHFZdX9vLkztvynPYEDVGd0NfX6s5Wkk9qOwMAJbq/J9L8dRFxR1IhFt\n", "HuOA4ugZWXPD6IJjw5OzFZ6cr/DkfI2H6x4brr1yrthz3kCARsLVgVgT6oqG4wZ6q4+kSSUipQ/X\n", "PR6fDXiw7rHqIrwjEOlmnNFHcTMiVsluSrhhp5VxZr2LurRcFSHTw2y0RhjwDIIge44TJcAx0Ck5\n", "UxslMWAnJyxV2BilXcPZgEJqVXurc9aADIk/MjbX2bzIG1YY6qfSCvs5gBiv+5nTOXRlR7jWrWuB\n", "l24SoRAic6IbHHJxyN5BJ0xecyxNDBjAaJ0yooLL7+dCry+bvy8OLhdkdsHI+OzCkVLYl5rRRLeW\n", "YlGCIN6MCZf7Gc9vVrhYdYjB4zBnvNxNeLWfMETy8r3cT/joco8fvtrhw5c7fPRqjx9f7vHxzQGX\n", "+4kEbeZ2U9tu8KddskfKjK49b40S1ND9ijaL63VQikAnX8otz/fjY1l3ks4v59CVgs7nz7kKJCD7\n", "quBUcA7ZAFqndVp2tXGxJZjnzaazoHFHz5oVTX9hiB7ee6TsVHuhUXXlOMs/bZ7ouUsoFqGDeGn3\n", "RK/eDhGboSMmhpPRCHquuiQieI2dJMe5xfiAg+fnlY7R6J9E3XbsKEBU527OOPiEQxJ/cmBMGe7g\n", "4N1orGDpfc+p4Icm5rzaUcyZFMAA+s4re2XVRdWLkFGShvBT7BM0fjnyswSbvI0RZgZdrKXFMSQG\n", "UrdKmXSIhikd0asznMt6/hrcuowcTlgYwmjRjdghlIJSA6acVdBPOlTR3E/+KMU5YRinpYJtdcnO\n", "kWJY91m+X0V8U7pZIYTWAeX7S3IYyZVUPDy30TF76wVhYqjTTzTaPAxosB5G8F6LaYkfwJL1UbIU\n", "3W1ExgFKR18xEHq+6vBgM+DxdsDFZsDZENnxqM2fW6AhqRMAAxlJCiQpUmhWvHVaGTAZIi7WHR5u\n", "B7x1tsKjbY+LVY8Vd1lrrTikjOt9pGOBmGnjnHBIgajTnoovYZwosJDbebWNSHEp6TgWhUzMsN3M\n", "RcNgrRaD2g3KmB/QOqClWqvqI6q/gB4CYgQwyGp1MALFuiCjuUfj0wYcPq03dy1ZYVjcz2o7vwAy\n", "HHfZLQtDIpA0BeSebaKhc84KPqoGlRzD3ba2t247vvOAdUExm2mu4ubDbAR1QxE3IXpOHaCNiHUX\n", "OA71eLwd8Nb5Cm+fr/HOxRoPN8TE8N4hpYqbaYbzjsY+xlnZXMKiclz065PlGgNVGjgK3vLxHm4H\n", "bLqIEBxSrtiNUdlbM4+fXbPe4fUhogtJQRVt/iTSqRjnou4vItKaqzAkZI8AAUAdWeK2c8vAeCdW\n", "9VSHO5QGiFeoLk9SMLkJDd/qnhkgQzTEtIFl8yJTtEsz/5PWz2GcRLrsy6LSdvmdsz7ehrIUgqLH\n", "AFOPc6VXrKJAX43GRUOyF+/BFOLU4W/Jr7qg+KaoUUtBLg6hVIRSkXKGg9CfC2rGa4tx+/nsv5BC\n", "Y2KaonQRxrngkDJ2fMNe7ia8vBnx47MVHmx69DEoaPFw0yMGh8OU8XI/4dnlgUZIrg74+OqAF7sR\n", "V3sSeZnmjJnR0Lve6V3v8da/cU6DWAiUiETWBGjFW/NSBm+0sS7tckotKNwwOp74ceY4AohEFvYU\n", "KlIXGphVQR1Qzy0Ene2vFb40pfATjnFa9y1b9MuSDTta6mQ4YmF0BAhQTKnsTOLV0rixIxpQstDD\n", "MECdzqIHr+Mkoo+zYfVq59gxxANzrljNoRXQd8S7ZTdXZjLpvVvUXTYTGrUgGuZumrEbPcKYsAex\n", "t0oFxjnj2sZo7j7MueCHL3f48dUeL26IhTElkvELzjVgZqBCaK3OLo1ZR6rcCXvvVIywcPyVi9PA\n", "jHYOA382YWKIr7zQxEsBMTF48z2kjE0MuI7E1ogKmreupL1mphHFOZqwZ5qjTPBAKXIs40oiwp4y\n", "soKW5ODonjutN3dZVqa1VwWM5TwXn71JAmOkAgJRul0OANGrFUSVLrsBBbONR2h7rjDPZExF7BPX\n", "OvYQEboAOI9QCmLyLLzNbKraxh7EdrRRxeV55We1DzjraRzt0YYKB6FWrzoRDi24GRPWduSDk/oD\n", "OxwkRyCrCKVn1uOQ2NMHj3UfeN59wFvbAW+frwxVXEAZet11NzONm/WA2JJxHz1CkvlwEfhslqcN\n", "iOICSRo9IcCzVkD0Dqtc2jk1Sv2dAAzBU1eSYzIVD9AiQUT25LpKfDfJLQAHx6NHMdrCQQSGDdtD\n", "7kF8embuaf33Xct7zNRpro2MR7aeF4Z0x40UVg1vc+EOeqMWZYIdj32VI0Cujc8RYBsWDkZ99HAx\n", "shYGf0l9YZkYhXUbjkYfpAaSGnCInnMTHvHY9Hi8GZiJsWIQo0PwwDQX9AePUir2U8Z2PylzQXQb\n", "VbwbUABDNB6l+bMyxxMgY9tHxOiRc8VNHxGC13G66/2MV6sOLzkO9+xi5EoDOWcR3Mwk6GltoJes\n", "BokTFQgeXjRNjBZGF2zeAh7FXcZ31SBSDRUS9lQ0Su+DFpfEoEEnLcSsQVlhlID9AoMYr/+ZUHUX\n", "SFxwKgTSQAzuwDseJ+ETG0oxIyf3H8927yLb3vSdsD48XTTIpuyNcnjB5ADWlEfl91HK3eMK8pno\n", "WhrEGyZpAViEKquH8iGRku7VgYTzPr4Z8dbZgIebHkMXUUrF9WHG+Zo0MvZzwoubCR9fj/j4+oCX\n", "uxGX+wnXh6T2hha8kPfjj06QFTI9uuXb53CmOx29IvzdUaIOQK9LYp93pQlVh1yJjSGOELfOG0QP\n", "prnUCNXV6mLUWkkbJTcwK5WCkJs4aLsbTjv0aS1XY2EsEYzGAuK4oOrKlp4b2BrLwbuClBtVV4Tp\n", "lkHoeMTDaP/IuIoIe3KSKAFlsAAAIABJREFUuzHjJACQQoEDjXrsYzuexkUY4WHzeQR0GKJXj3JR\n", "+RabUIBAkkMq2I0RV92MPrDN18FhnDNyrdjPGW4/axLgQLaBH13u8fH1iKvDjMNMhUX0BGCILdr5\n", "usf50GE9RKyYSghQt2GcC3bBw/u5dW2Kp86JnDtlZQhA066T7BPWtz4w7T0Gp3Tx9ZRITZ3Vsduo\n", "olywamJgE+oTAEJtXRVgp9eQgk0seIWSaTUxFgmOuQdP681eoplzzKDVvdpzTmTFzoPjwtfSuAHU\n", "qkXw8vWtK1ldjGk5rj8Wo3PdUgNo3UV00gF1DsgwejKtXllqODTABKDPIq4Dqy5is4o4X/V4uKVE\n", "/sn5WoX0giOw9mYkJob3HqXSON1+oq8xUcJemAkxpwyxViUgwRFYwiMrj7cDnlys8M7FGm+fr/Bg\n", "M2DdU/xLpfLoCndAmQVyPc5YjSIAmgwA2Vi0Qr+v7YM2ZnFwi65xn4sCQgODuQvXEI5FDQBv7Bwd\n", "Oaq38yZNeLwDKt0PwQJeDJA0PQwzes0B76SJcVqLe8wCnWg5i3O+AQ2+xaWWdC/QMaC2sXw7FiWC\n", "xotYhNbM7uRLmY1Ub7jg2C6UjycYhnkeE4+A2WI+cc0BCDuCRmtXC3bEgEdbAjvfOlvhYtOj6yOc\n", "cxjmRBbIpeB6TMRM6ziHkjGwO86p1DIxevSdjLbZUboeq1UHHwJqKcwiJRbsbkx4tZ9wdtNjw+Nv\n", "or8hVU2pzRJXxJRncTNRrZ56XFwRiBEaa1Ty2k6uqcQI81mqMMKyvY5Hrlq3O9MMYjQWa5t8aA0k\n", "WyV/mkj0cxkncccZnPwMlq5kadyhzdCYC1cApEQwVA4esRTE7DGzn/i9x3AtEQ2mEJc50y40fQyg\n", "UQbnnDFlWyjwRWNbmLuPtRS/dPoT6MyPdkcKq82yHeFhyrgeEy73E17sRjy7GljFNgAV2M8Z6z6i\n", "1Eo3+W7Cy/1oRkcSJf8ciGRDtQKcltRcTZC5y94QaEKbLYlqM7l2A3bm3AltjLRLqgGcHLIpGu66\n", "Wk5YH+Z4QusPwVO+BhAjx4BZc/YI/tMBWqf1Zq/7WEkKqHpR43ZasFo2Rs+6Cw7kTBKZ3aUJooEv\n", "7zrW4hihdRvWfVjMog+xJdbE4ArYdc1nW4tjZ4pwPiA9tx6dl9dum6fYewl9m9xIMq4P5EKy6gK6\n", "XYB3I64dxZ3MyT4ABU9SLvjx1QGv9hP2U4bog6y7QBTuDYGwDzcDLlYdNqtOASDqeGbsxowu0NkS\n", "Mb0pFQRfeKzvDmBB4njwSwCDzx/N7qPZl6WCXd8KBxVQ9kaQ657dszFnoMmbONYIiFFqwJiKCsEK\n", "U0UdYRwW98RpnRZw7F7Uvi8AxiIvCq1T1vF/a0IvLTPLxIAVFW5giW0gyAidtXNtjLP2RXPoQYuU\n", "cNS4kHJb8yPRtOEPJUCJqvT3Ubufb521zud2iKo1pCCGI42Mcab58N2YsJtmHOaAVJIyJ6TA9w4s\n", "9CuCfXSMd87XePpAqOIDUcUdFSY344zIozKHOWkOtuoiujjzc9xEj4stzsznVAFgT11HKRjgHRxr\n", "5qjL1bEAsORpIIcDm2+2JpMBMiSvli/vAZRG3/ZNT6wVD8aVT6/caZ1WY/yI7bwuRxipdxRqgolJ\n", "RAIzAIZ8Adq1lRpDwQupf0pr3vNhmjuljJCbUQRvniVNvsyxxF45lYqUmuAvFdpQVoJ3WIiHbpj5\n", "KmMeD7YDLjY9+u1AIqIOCHPAGg5nU1ZGqYpgBsMoMDs8qeEYxm0Ihpna4XzVY7Xu4VcdEANcrRhi\n", "wANQvnW5J5vXs4HG+oaO2Ckkfuz43NaFTo/+qWw4tATKxgneN9r0QxN+F/mGJaMYun8oE61Wc8/A\n", "JmrLe8HEHsvab6zlFowsePa65V/3wz/5kz/B06dP8Zu/+Zv6vefPn+OrX/0qfu3Xfg2///u/j5cv\n", "X+rP/uIv/gK/+qu/il//9V/HP/7jP959QGfLeLO4ypTup6i/d6EJwS0KB1s4xyYQ18Q5Jajf/dkE\n", "XLAzzTT/KbPo5msQP/HIyHnrrgV2D6Gi/fbB2k3L4jRdxGYIShPfrtiyrKekuw+s91FIAffVbsKP\n", "Lw/4/sc3+PdnV/i3jy7xbz+6wvc+vsL3n1/je88u8f//6BL/9qNL/PvHV/jB8xv8+JI0MA5z0W4E\n", "JQyiML70e1/37CEebwM4x+dMYpTMnwsFSWbcRQRMLHs2hoI6dIFHgsQHXQCl+6+RbOayAVtlW3sf\n", "yGsLdVu7067RMk9Vwxd3fR6x6HgtCgeJRQJ2GsqkdAOkiz909L02NmCcKJwye3VZS0PnAGcLk9iY\n", "BCtrJ8YjGPK17qO554MK6x5rLbQPRPuVeKFvxUqMZz/fuVjjvQdrvP9wiw8eb/Glx2f40ltn+NLj\n", "Ld5/tMW7D9Z4+3zNIGokrRkGMl7cjPjR5R4/vjrg5X7EfqJiIniHbR/xaNvj7fM13nuwwQePtvjA\n", "vPYHj7Z4/+EW7z3Y4O3zNbPNSNxvY+ZMj+NR5c6OsCKDJCOyT3QBGxODRFdE/ltmPxW09s01xHYC\n", "ihYkDWCn+NeAVRX3NKBWb7tGSp88Ej5e5nen9QVZn1csklsawBLIcEtQVUbHNBHkxBnHX0dgmYJ/\n", "tgDmg0ov4XYDyWl3boiBx1aMoF70cKExjGS1oqQBJktAtVmPWkD1EXc+375Y452LDd59uMG7Fxu8\n", "+2CDdx8w8HC+Zj2LARdrymP6GMh+GlDtMgAIgfKTs1WHi40wPSjePeXXfe+hee0LinNP+PUfrEmf\n", "g0Be06TR69QcoOyIhywZvWXUk79ITC92QpH3sPTtxXy4iRFyXzRGWjuO1nDO3gOtOLHX1Du/GJ3T\n", "PhK/5okV9sVZn2ssqm2fbQ18x+Ao12lmLEkcHpWCdJxvSzwopnkr41HmZqbbuL2e1AuR86sQSNur\n", "gSW4BZZYdpS1W06lgY+0n9Pob3M1iw3IGDqcrTr06x5Yd/S1oj/jitxRNqwtJoxM77y+rcXSupY1\n", "cuISyFgPEX6IwLrXY2DdY2D2arOD7pT1sXQxaqBCMp87Z8OSqEdWRg6MrlCs8GZ8ZBmHHE8IuXaK\n", "YUYfSwOrdfzoOIRILDOAhX55w+TjPcveg5+0Xgti/PEf/zG+/e1vL773zW9+E1/96lfxL//yL/i9\n", "3/s9fPOb3wQAfPe738Xf/u3f4rvf/S6+/e1v40//9E9R7pA5vq9olRvXJoky2mGZEouuQPRcfHMn\n", "jBFsYQJIIXJ8IB1X8U1dXuynVh0hXdL9pCKCxfV4fnHVteQ6Bq/MjuNDeScWW1ScrCP7EA89b9g9\n", "npyttPvwmNWyz9cdCWcFErs7pIxX+wk/vtrhBy+u8f3n1/jwxQ4/vNzjwxc7/Mfza3z48gbPrva4\n", "OsyYeDasCw7rIbQZr7OBj0dJwMNNj4t1j/NVj+0Q2mfyzV1hee3kGrXEXaiQOsPf04MmANBGH3TT\n", "beAZ/mi6Dbef+bbJStLWHRULIvYjM3KivN3o4YaWeZTQndYXa30eseiTlq0H1MWIZ/mWFlFEvevD\n", "ER34E1hAkhS07qdoTLB1axQ2RrM4FFBQQFUBVGMg4UgZRwWOuqxm81xxgS8e5U/OVnj6YI33Hm7x\n", "pbe2+OW3zvHLT87xP5+c48tv09+/9PgM7z3c4J1zFrkSpe5CLLAXuxEvdyP2Y0KpFHvOVh0ebXu8\n", "c7HBLz3a4EtvndHrvt1e95efnOODxwRiPGU7M3EMWDPYIADA8SYK2MJOEolmDbni5GA7CCAd1Mpw\n", "xQKqncSK4OFx1HG455oFs3d03MXpQ4s9vYJaRB0NoYkM33a/Oq0v2vq8YpF0nupxQs//Uwala4AY\n", "AabBdPmNxaprBUcbjYUWwJapBTmOSSpjcOh8aCOc0cNFcyw5nhbFgPfLlLKWluzq5/FtRE9YYZue\n", "QFWaDe/x1nbAk/MBj88HvM3gwtMHFH+eXKzw5GxgEIMYG+uuNYBERNQBrIUR2Q6aBfvOyHHg6QW9\n", "7jsXazy5WOOtixXePh/w+GzAoy29l/MV5TNrZsItrJgh47dL9oyc0uAdnEej2AcGgBjMCKHZdnee\n", "wU5v81eTsRxdr4KqwsNNY8eZosQCGaz7Exr9vzWkdEjuE+/70/rFW59XLJJGy53NEHPvKF7qHJwU\n", "1G7572lVZQtIjKul2ZcLG31BxUB77eAdgrDAuTG5iHX2oMw0E5aAsDJEc+N43IvICNL8EEemJriL\n", "IQADAxhDBHqydu26YPZ6Uze9hvftdQSnjScP0ZPGUMevvYp0vCHCDa2JTjGIdSsW42D2FDdgIefl\n", "+GA5RgXkvHEXSOos0QdbABi2tXPE5qswoLWc31vXsoFbkhc3N0u0eHdfR/s167XjJL/zO7+D733v\n", "e4vv/cM//AO+853vAAD+6I/+CL/7u7+Lb37zm/j7v/97fP3rX0fXdfjyl7+MX/mVX8E///M/47d/\n", "+7cXv6/F5D3vVX6+pE0GBRp6nqF2oJvUu4KCQEIu0aNLfnEB7jwGzHySATKESbCKTSzPObpAc86L\n", "boNVZaVZytvHkA4rdT89WQT1jTUQjTilCOpNc8YhkWDVnm2BDnNmOlRFyvS9GJopu6CMDuIj3+ZY\n", "petIarO0UZLtY1O0nVLBYSbhKuegdCznHFxdBjJlYXhBLz2BFAzw9F1ggR8eTykFYyjmvBXMmWlX\n", "wcHdnsJpwYULLxEBs6MkQ9e6zxVA4uKj1IC5VOo4GO/hW8H1tL5Q6/OIRUArEG6vpn9AHQc0NgZT\n", "7mzhCo5pXWrgq6q/+/uDs2x3tFl4fa564+BB2hid2m2FmRSpD70Zh1iw0JafSDsbvun/NBBjwOOz\n", "FZ6crXCxJpQ/enLz2E80ovZgfcB2iG3z5M6vuwF2Y0IuFfsxKXIuAMbj7YC3z9fURX24wXsP1njn\n", "wQZvcfGx6shnPZWC/ZTxcjdChPwOPId+TK/OtsCTRMpb1yKvoOq6C9h0BHLXSvF4LhWrPulM6VKr\n", "op2vuy6UJGpaQPoWk4TaKeNsKrwoGkvBawF6J7h+Wl+Y9XnFIrtuNbKcafR4A4qB71sDWnDyAR0n\n", "cS3OvA6gA5TAoUCGl+eKgTonhbjkH6Uuuv0tIW3HscW9vMXArLA+NBtXmQ+/WPc43/YIqwHoSIx3\n", "3Sc4R3o9uznhcjfh0W7Ci/WIl6se6/2Mm2lWkXSAxr2EkXW26vFwTQ4Aj7cDnpwRI+Px+Yqo4jyq\n", "F+eMB460f872M9PFhWHFY2fHDau61DFx+jkdomOxQ7UYdEB1QAjwsVlTxmDyFdcaL3fdF6YGa8cT\n", "IGNRZbYLqvmUAamOGWH33Xun9Yu7Ps9YJEyqu5g5nm8aBVhN82QRh46WHUWoaAym45a7vaclpkge\n", "pSCiPGjyC8sjKehHYrut8F4KlULrTKtzJU3RLgYgxgY+yok5EuuWZ8mbZ+04B7M/U4Yv5weeXUKE\n", "qUUz8hVghxC1RuY8Q3/PBAl7PtWNqsgI2h3sCD3RDWAQEMaKbLo7znE194aCUgqU3Hecdr3kPECu\n", "M+5gVNy+Le5cn1kT46OPPsLTp08BAE+fPsVHH30EAPjwww8XD8MHH3yAH/zgB7d+/2o/Y8pUlB8/\n", "HBR322bYku5Gsx4iiVhJ4U/CjgQqxFR4HMKbZPGODyEPhTvyIe6C+hALs4NAjIoptw2sAph5XjuG\n", "QnQqFL1OrfspmhtUjOgICfuDr7oGlgBtBnyfEvZjxs0442akZP5mnFXEKuWKcW7Vv/dOAR7raLBd\n", "tXGRlaEf1QrWqSDRqt2UcDN6eDcrgDGXAl+WVpB2xlOo70J73/ZLgMY5sA1PQfQZHm4BmgQv1Ku7\n", "vXA1YXOuuaAYAGNhzcjUdQBItaJPHqOOk0C1Auy1qTgJWH3R108biwDge8+ucH2YsZuSJr/HS0SG\n", "BfRsqs2y0QmXqCqtUOzHlvOEd9/oDtLYbKBnszgMqu0gIIbMa+/n3FhINsHG7bgnm4QCtn1QZezH\n", "rNT/aDuQgGgMqJXG2S73E4nsGfFP7ULyvrhnIKOCAIztQE4Db58Tu+ODRxu8//gMv/Rwg3cuaGTk\n", "fE0uS6g0w351mNEFp2N0l8PMQAN1EG+dOWeTnBbHm5tC0FGcPniRCMCUQqNjGlFUpVffc5noPgDv\n", "Tc322+r0dNHzXDz/TP6Nt/OfdACHlkyJ2OhpfXHXzyIWfffDF3i1I1HcO2PR4h5txehCTE9RCJD2\n", "gvyOl/GE+8Ez+VFjC5mxFc5lmpieJPSkuxAXBbjTBBVYMqeAo73dNx0g68gUVkzh7gMABxc9VrXi\n", "IceKF9sBF9cjzteS4wT0MSJ60utxaLaq6z7gbBVxvo4koLclFseDbY9u0wObgQqIWoEpIZaCsyEt\n", "GkCiOWRtrO87h55jhJ47C2AEAmXADSxhi8o5tgzi18UiuZR0bdGurWVgiNq8M/HHS594+TkkFyp1\n", "mVue1hdv/Sxi0f/3H8/x8nWxCFx0LvCK+wou8CjJ8hv2Ze8bHZBYscBFnPkClsfUPdWw2vjFbwGq\n", "Ry+jMgac70V5Zm1shVMGiGNWiI2Xn245Eyfac6/PrXSAOW44w9AK8nv+9vunz1VvxVs9v4vq5+jc\n", "yaWz8ed+LEpfRo5Vj67lreMsP74GsLswKBuLDnO67+i6fiphz0+if9z1s0fbHtcHEmOiGR1LnXQN\n", "YPCCUjWxEfGuVXCB2QcVJOTYRY+YTAfU8Yy4eRty/iydRcX0YqM2ymiFgCVTJoBEjjunjImZH9E7\n", "aXwsPz8MEyNS0fBgQ77kF0yZ3vSB7fkIHMmZ/H13U8bVYcLlntxJXu1HXO5nEu2cEvZTQsoVHQMX\n", "Qpe8WHd4sKaxFJkXFdE+dR8oVYWxrg/0mhbcmHIxtChDvYJofIigZysYZGZfdCrovDUGC702sz58\n", "Xo55OAe4FuXkewqYyFhRONbCYFZJrfCZHt+53IGQmm67fCK5B05Axn+P9ZPEIgD4X29f4Ievdvj4\n", "+oBXuwnH+ZsGWQdNBFVEUgvYoEl7H3LT5/HLsRKpL24xP3hnbvHoWG+G9HIGBku8y0g5Yj+nZlNq\n", "9Djknl8m262LIfaJa3YoebBuo2YXmx6DMCRSxuV+ZrvDSJs6oLOlcyLB3pQL8kxA5RDJa/3RdiCd\n", "jYdr1cB4/9EGTx9s8Hg74HzVwQcq+g8TMSOAisNEx1yz1VcMRt/ILGk+05iZWwCcOmfaE4uljx4V\n", "Fc4BYyoY4mxE9FqH5y7QW1J+O8MpsaWxccQe0SH7ilzkv73eL63r2a6+CHI5R3T9+QRk/LdYP2ks\n", "+o33H+H/PrvGD1/d4OPr0fxC+0Pih/7phGXoTAvQAZ6aA86LrlQrjI+7hIv3ZvZJYXlo8X4XWFLY\n", "AUO6g97Gn/a2jo+nNbdvoytq69qz5oZQt/mDu0KuQuec15CWWGeYEgy0OHJvEi0yAUi2Pc2WnzPj\n", "Y1j3cOue6NtdYDFUAHMmvRwZDVzkEvddU2gTzsGA0oFm7tv4jaMEhAshATzoP4+J6HcfTcALLYac\n", "00bN4j5Au1Z+EXduXwthuXlH7JXxmFp8Wl/I9ZPGot/84DG+9+wKH768wcdXh8/r7f2MlmT0P8tX\n", "vMdquBqIoAL3Fuqf6Vj2L3dTGW5952dVtrym/vl5VUY2Fq0+RSz6zCDG06dP8cMf/hDvvvsu/vM/\n", "/xPvvPMOAOD999/Hf/zHf+i/+/73v4/333//1u87E3jven4kBgczO9SFVrQOnCw651S0siJg7gqm\n", "1ET1tBtw6xhOE0nPKLlVpxWFWkmi6ThUfNNxjR9vIsAhBoOmcTHe9hJKsgd+3Ys1zXs+Plvh0abH\n", "+brHdiCqeOCiespF7VVf7ka1TX12tcePrgL89QHTXJCR0XuPi3WHJ6y4/YS9zx+fkSjV+brDumdx\n", "PDgFEq5HAi9e3BCAUSowZR4rOaYa1pYwBecQYztfYgF5tiIdjIGLBvI3LxhTcx8Qb/cY3UKI8K6l\n", "wKRbUrwG06EWm9VaaKyoImBOFVMsiDMlD54Br7uyKArgJxDji7p+2lgEYEmDvGPJfS9FrnTjrahj\n", "F9pYU8f3ZcdxatEBk8TznmMozdBb5hG7iXCi7hx43KNgPbdO4RCMS8nrhHmxBG7XQ2iiemcDNtsB\n", "ru8AD/S5YrWese4DgvfItbK1YcINx6fLQ0T0sxYl0dMMulgZvnO+xrsP13jv4QbvPzrDuw/W2JwN\n", "cH2kk5krhpGsWsdU8Go3c1e1Pd936Q05GOEv/uy96og0geHNQPPgIr43dEzJDOTqYOnbdyVCUoDp\n", "2ArvLZZ90YlNq3fwpSKFqkwcAWttEXn7Hnv9PXhav/jrZxKL9P44uk/u2KIUq5D7tiEcBiHgZ0cK\n", "ZN6/gbuBhWW3DvxO5P5vnToOgvxGChXJzDyyIpJyzHvF3M135Rgy877Qj3Bc+M+ZtMU6Eeel+Kex\n", "4ihOSDPs1nge/27ogs63I3pWxisGlHGLZ/Z+AGNJeacRWAF1XBMhlE6rXEAbG44u4+KiLI7V/o11\n", "mmudXIMamT/d8b+9/xA/43LwtP6r188iFi1vkbvviAIstVruGAuxL+GOvmGfV6kLj5cwpqs5jo5G\n", "WGLBEULndL81z4D5XM78qnyp9WttwpjI9suMk7AgqThyqLPU0Xu/++9L56ZSSR+EhTwAzx800XGr\n", "SAmwYLG1V77Ncls2belcOM0xl59++QblGiqLRc737X/dgGXYfej41e+JJIa+0TR+7lufHI1eK+x5\n", "1/qDP/gDfOtb3wIAfOtb38If/uEf6vf/5m/+BtM04d///d/xr//6r/it3/qtW79vRZHuR5qdJuuR\n", "O5PNnaR126RLubCoUlRf9CZuF8rtxDfaUM+z1JtBKI2dunicrwlsOF/12PSsEmvcAdT29VaiDd3U\n", "uuix6ajz+ZDp2+893OJ/vHWG//X2OX716QP87196iK988Bi/8f5j/J8PHuMr7z/C/37vIX716QV+\n", "+a0zPH2wwcN1jz54vWmcA1Yx4NFmwLsPN/jlJ+f4lacP8OvvPcRvvP8I/+f9x/iNX3qMr7z/mF/r\n", "Af7n2yTU9+6DjdqZna0i1pES/vv0RJyDjnaIwOqmF5eTDmfMBDlf87ljgU85p8u5Uq8g0/GhPNpc\n", "VhfMPWBFPY1/fW9mVqWYuDWje8fddiocvtjrp41FAAyF9+5NVJZ30pk0wkwmLgkrQ3QyZOxExxUM\n", "sCpgwvFSwAQERMjvi4ht3wV0ArSyVsaKxSqHTjRvnLILbnVczW4k4KA6eQwRq6GjzuR2AM7WwPkK\n", "/nyFi4s13r5Y4W0GSB8yi2zVLcdLAMAxALPqCBx5KG4D5/Qam4sV3PkaOF8DZytgO8Cte2xWBDg0\n", "Vsn910Pjt7JWHPquObroWCDvD11HDjJD5zVOEEBiRJnvux5oCZGO+xh9ni7I6zmNP8IMWah7f8L9\n", "dVpf7PWziEW27jxemq8LXdr8zLcHAkoJ5YJZ9DMabRkKDPrjnOUoW70FZ7ijLynKQ6M8C6NCdGCa\n", "C0Y7kIz/0uhV0SJAxP0WdZCCJvTlrAOUGdWS+v14eYeF+5O+P3ZV0dc+CpZWbJBcFMrCRrWdldaU\n", "C4vP7/T9NRaGbyCGPY9H51zrwQXtu+Wsdr9q421HTBln/jyOPdJIPrFQ/1uun0UsAuSRuL1vKbAA\n", "GV+oy+f2NdXvAmuj79y5Ny41F8CAAUmVl8JFvz3OrWO1MbpgYuB9sSixFWnKRW3dp5QxzRlI/DXz\n", "F/89p4w5V6Qs2hPtLd01gaPClwWohV2UMjXES8pASgSWzJkAjJSBOWGU95Iy5lyI/crv+e5YRF9N\n", "JPg1tY4Bn2plkARNR0Ntne08kIAXMLmTnF/jYnLfcZrw6jLO3QIyXve+zXotE+PrX/86vvOd7+DZ\n", "s2f40pe+hD//8z/Hn/3Zn+FrX/sa/uqv/gpf/vKX8Xd/93cAgK985Sv42te+hq985SuIMeIv//Iv\n", "7/wwMpt5f1eqsSRID2HpUGIt90QTQ9gL4hYgIi1y4961hO6omxu//ioGnctcddSBlJnlLtBr5SId\n", "yYx9l9CNbcN2cAsqkoNQnslJZTtEXKx6pVu/c7HG4+2As3WHvotw3qFkErZ7uRvxYN1jiAGpVFwe\n", "ZgwdW4mZhyRI93PT4+mDNf7HWzR//vbFmjyOuwDvPTFKpoSr/Yx1f4B3joSyJuqq3mlnaEY8rJjd\n", "wpGEfZXPmXbeRYKNUibtCwCYcyGAwar43nMPAA38EQDoGLxYd5Gp5u0+yDxfLwVEE6e55yCn9YVZ\n", "n0csAqSLZknU9y/puKk7hWsJqzIxgifV6thsn2NoBfBiA+X/q7X1QFv+KYwMLtTF1tA5BF+wKhXr\n", "Pt3uSEYSk1wq6KOJWh0Np3oHZTqpQvbAQla1Uje3VJyPiV2Mmr2repTbc8TnKQoo3BOYebHusBb6\n", "9rqjDigATJQUxC4szqVtM9hOBx2j6QE0LQxyGxHnlnUfMQwRvg88H17R5XrkANCKRpt/HSdEUiTo\n", "WJuMEwlwziMlIdC5si5ZnxbAOAl9fnHW5xqL9L48qjpNp0/yiztr0Ia6UWLp21iujEUsO/j0O5WD\n", "kRWFI5X79rPFMawLBms9dNwE6ZiVIQ0leQbaR6FjiAXglEggfU4Zc6Ikvc+lSd4DlOEevQXtsn6G\n", "pXCl7eKWCjhFLYBcMGUuGlLh91S1G3rscCDaZ6KDI+OAnQgDBq8gTBMSMJcWXPiUBuaINa2pGwCg\n", "ibpqo6btL+4YvKj11vkpVVyrmkbAEjQ6xaIv0vq8YpGCZcc/sLgBxwkqeNs+7e+kIAiY5hYgqsXd\n", "VHyf4w2xIwTAoOdB7ENLMc/rHXQlwSXFAbHVA7gVizK7l0yp4JAy9jPpBO7GhJsxozskuMDjZnDA\n", "nFDnhGnOGGfSKZwZBBGg5S4ER8EYZqWnnNlUIWOeM7opA3EGQtPnqSOxXndjUqOHcc4sYFyaaCef\n", "Yu9abqQ1tMSMYzTN5AcsAAAgAElEQVRDkh1CadUqNWcjCnoMKqPleDwRp+dUR5d0D7L3gCKnCxeT\n", "BhIfxdXPsF4LYvz1X//1nd//p3/6pzu//41vfAPf+MY3XntA608Ne8+a5TjWq3uISRpFD6EVr1md\n", "PcbZiNxpIdv29NsXg2ecvdPXF3sdstUip40K0naIwRtthw77OeNmog5onLw+JLLv2udXlG+H2MZK\n", "Hm17PDkne9V+2xONO9ALbMeE9RARnMNhTnh+MzKocrtr6BwxJNYd0bifnK/w3sMNnjzYYHU2kDiW\n", "c0AuKIeEdTcCDhhTxvU4Y7ObWDNDPI65+DFAjBX0VOeToSmKn6+IgbFmEKNWOmfO0ziOXJvmbXw3\n", "yqYFnAJMrcM5iPWk2KqyRknm4JJYt0R8paXzdN+WfNqrvzjr84hFAFRs8TYToyku63KcBOvmwHoH\n", "gSy/IrCw+dWOvdCKnRk706Pc3XnzMCyu4OFEtZp3ja4UduBo9OgVx0ex7JONLJfWLSG6pGy4DXGv\n", "AAcS/ooOqA4oBJ50LKbbBYkTtx8e+Rz0UjLq0UZXYsdATAwNJAmlzW9rDVHV7zyZzVUTep43l7Gd\n", "vovs4mKo5j1ZoKHjsZVS4LPsC02M6+hqL9IPKSaDN6CSGSNpNrsEzsI7BFfVmUb2g+MAJAngYp1i\n", "0RdmfX6xCItY5FyzsJNau0DYCrfv1wW3l7+8d3rPSy6lMY9Zqppr1pZoS0Ft7fmW96wUzF7ZGGox\n", "bMC9xbPAsUji0JwrxkRFwH7K2LNO12HO6KdEAKdkyrkAqaCmgswdyBa/+PzA5nhGyE+AE2Z+SNFS\n", "U4HLGUhmlGTKwJTo/UyZXdsSxpRJkF7iJh9HGmEyAiiAplpvWxaGRU35hEvinvVcm+u7AG7buJEF\n", "cCVHDt7YTso9UFvwqVo42IaovP6RBe4pFn1h1ucViyyhZxmLWvEpz19jUtH3vFARuOYHIKijOgXK\n", "KKiOiwrrEe05lnGLzADBnIu6NNZSqJUvQVGQE76BWxPUaQxqYutHsYibnyOPyu7YTOHqMOP6MJEt\n", "u3dAZn2eKSMfGFiYE8Y5EwCbizIyyhHw24p2cWgsCmDsp4T9mLA6zJQvRAZMxoT9fsbVYcLVOON6\n", "nPmYBLBOHAfvikV2JDk4r4DGcfxRIKjU2+dZY11hMNvECLT6mdjJWI6rHccQk+i2WFdRJL/TeIfP\n", "HIt+KmHPn2QtOuT3/BulqfDNLiMMCmR0gWp9gMEM6vQfWKlfO4veNU/hTHDJwvvYUULsfRsp6TsR\n", "gWJlexbTm1NGFzIcSNhunInBsO4ihhjRh0TJvS9wnHBrB5GP6fgmEz2JDTMYhu0AnA3kDRwIbXH7\n", "GZtacTElbIeOvIQ9b0hHsI8A7gKSbIeOBPrOBqJsD/zwpQIfZ6xRcT4l0rAQi0bKakzXlj2czfu2\n", "Yzci5nm+7lhMtMc5WzR2wZPKdaJzl3JBP2ctgG51pG2d6LhI5GsiiZBc91XfKOO9MD74fM/ZL7q5\n", "lup0+x471Q2nJTPYBJrdB3YeP3GUSLZk0olIW4CywTSJPaI/S7B3jN7qfKTZ5I6PEyQ51YSYtBc2\n", "Q9ZRrc0QVMhyYADFjrgdb55Kl+Q/U+IkXpKCe9B3iaESH2xnxtUWYcuii2v3TkGul9VZza0bO6XM\n", "FEr+HtM1ZXMTAKmLAavo2VGquZFs2CnJ9VHZK8gOTgSFm5kMnRtJzAo05un5V/BWtHnYwlqvMRUt\n", "cl0cysLFYLHLVTlk1T/l3PhTMHrjF41Y3gEQGnBBYgQ3z0ynbJnE23EPq98TQhuHo+kTA2IAChgW\n", "nr/O8mcuROGWm9gCJoFiYAP2DJhhRupsLEpMix5nAgt2bKl8fZhxtZ+xWc0EeqLSs5ULMCXMbEHf\n", "up8CTAC1mPPFz7e1GhRHuZEt7M/mhDimdr5yAQ4TpoMUMDOuR+rKtmKFu62SaCu46QyIY77sGIl2\n", "blrsK7UxPHImcCXzea+GX63NHQNgCEAsDbvFMY46rhVVAbAGUgnF3dxrDG6d1pu9lC3hjsbxNRa1\n", "e6lpNVD8MMjhMo9wZgTKsAMCd/XvikXy2skU2HMhYIMPyC48vt3I3jTAzTOigKo7yosy5UCHuQEY\n", "YqhwvhrVFW6YM5wDUsq43lOMuGEg4zAfsTHqMmeUuirnJYBBcS/h6jBhiB7rWhECC56PxMZ/eTPi\n", "1W7C5YGBjCnhMCeKRXkZi6gp3+qmTsfafMt7AL42rp2/XPS9zaUykFGXza52GTkW3cUME4LCEVjS\n", "EPLG+CgCaBSNR8f2t69zgpL1cwExwl0Ph12C2nkqaKMZKaCRD69jHh5AqR5zthoZqSn1e6HRoD1Q\n", "taWRlKi2zp6MLKyHgG3fYeiIMp1yQAwJqPRANYG7GTeHgGux4TLHEjRRkH+5EdrGR3Pa6FlgauhI\n", "YCoTyui6iBga+0IQvmIrHdi5zarMkhgDXMfq3kPk9mWmF+gCCdzJa7vWfTnucLRz5NT2cd3xCMnQ\n", "4XxF4MX5mv4uIoClVsSJrtGYpDPjbu2x1VwTWbpZc+Gg7AsuHlYdFS5doK5DzIXZOAFdyBokLdvn\n", "rpvstFmflnQErAAd0DZq2kzbvgzIneM0Pql1nnMIPDY1xDu6kv7YctXEdt1LeEZc3wm/r+DZQ9yT\n", "I0Ct6OfGhtrwCMWK9TGEARKcQ+IifS5VAYyDKR52U8ZunjHOGcOUuPAHPaQsLpVyAxRSbhtbtpk2\n", "6By1TUoQfTpuzgUh87wneAOdEsBJwI7tnvdTxoE7slNqM6ASIqTL0AfPDIyoAsMCZHQCYMhn4WLI\n", "GWqEzH6W3BIwMczSGo2THuuOdFyohc4bAcJKt4JfRhdbhNo9nS/x/Xvhab0xa+lkZGIRGsiZc3u2\n", "skkIb6GsypLggtewiGIgscng/AI8k2aLiNqlJJ3PooJyZpCZj8XHiQ7RsCVFx0e0yuJRLMqlYkxF\n", "2RdXUjjsJ7zcjdj0AQ+8g8+F6NWloB5m7KVwmBLGOfGceG2Fg0mCZewmFaJvTymrK9vNmHB+mBGC\n", "hyuVY11G3k94dT3i5W7Eq/2Ey/2kHdDDTN1PG4ssi1e0uQaTq/jO2DTapIeDvgIXZiZf4qs2v+RU\n", "m4KhFWdcoPD+Q2g82hevFudM8WAYesf58Gm92cuyJXTEqLZxtlII1MzcYEi5YC5kb6yFSjV3L9dF\n", "kmvJSOcnxaIisSgXTHPhUQoCE4lJVdo4mMnPvGv1g+QKWth7qT1bXjRnyoluRhq3f7Ub8Zyt5UMg\n", "S/tNHxG8wzQXjlcTrg6GHTFn5CwN7NvntEAAXJYjmBN244zr/YRXXDfNqSBGjzlX7MYZL3YTPr4Z\n", "8eJmxOVuwjUfb5zLrVgUDIDRhTbOLA5LysQwzSNkal6VRK83pYJpTpR3aXx6fSwKQbQl3RKEXwCp\n", "UMaHjXMC3raGv93KPl2F9nMAMfytAnP5xttykAtj0G6jewHQQ1FBN8ahy9gZBFxEIY+77sdMBkEH\n", "A88zqt7DQKBI8A6pkJ2pc8zESJlQu0OH62HG6hBU0G8GWcQoSpmbgIvMWKYsF898eEm25T9qKwQo\n", "kc9c5LSOoYAPFqkkCrbJxuHoITcngdiZTchmTo1GNLOIle18yljHqicGBvmu98rCeLAh4dMV28XO\n", "pcA7IBUClTpvFL9B10zApNvoG9QerY+B1f9Dm3fvmC4eqJibHVHDRu60WqDMruNTfZr9PC1JAgNv\n", "bLJZA8JIKkt6L9oz4YFG4fUeQEUQEU5Rw7+jI9mcSui1Ch9HOp9t1pHeo8RKYmMEok7WCNdlbPqA\n", "LevSiF7FmjUylI0BzpkZiJCOww1TJi/3E17tJjxYj+i7wMw1jhdzBg4zDiNRHg8Tb6DcCRWKqawK\n", "nvnMZsaULaGnMWEtnU+lTM4ouwmXO3oPlBhQ4bCXjkNu54NigzdCngFrBnK2CuiEBgxzFwW5LpsD\n", "ZtZW1MjLrVjURujEHakPnp1iIotMeziZe+d7xzlzL9FJ0YLqWN8DaMzD03qzlwrB+tZVU2V+VMo3\n", "a2NIFB6NEEbUoqXOxQe8R4iO9SpEr4HHzbR4kISeQNRUaNRjLqINQX/OXLi4BYgBTqACXBDnsDbi\n", "JkK9woyVWDSbRtD1YcblbsLLmxHP1z02Q4c+BgDA2VwQokct5Nj2ajfhaj/h+kDg65iIvSWF+XH3\n", "MzOLRIDbGwYwLvcT1h1Zwa/mjAqylL46THh2fcCzqxHPbw54uZtwtSdGxp5Bk5SLxiK1245LYWFl\n", "igqDbgFiQGfQ6Rw3ZpyyS4SNIc1lTxpMwRQmWqxEupYIxvlEjiPdzypxrjE9JP7ZW+eTLDlP681Y\n", "IorpGMBoTRczDsZfrfZg0VsZ85CEW6pfHmvofNM6JO0ciUVuEYtS4dflAntk5qjoUNSU4YRBam9Z\n", "YWqGwM6WkoMFHfMN3sFluu9zLhjngv2UNTa83E3YDqM6ws2pYDNQLTingpsp4eWugZwHEeCUcReN\n", "24yv1AbIkPQBxb6rkYDbgRmjhynzqEvBzZjwYjfi2dUBz29GPZ6AuI0V1uQXuugWTRYLZgTvl+wI\n", "ATFSQWYR08PMLNjcRmTSa2KRjO5HBkqiYSbrcaoz9J3C984SyEgmJjVmyaer0f7LQYxoaETaFOOT\n", "oxQc06LSsRJOJmWcoeOAHTyJXKZccJgDVpFdQ2IbXRCBtbbZG6VY/m+pEaxQ3JoFPoMnes8QWVC0\n", "VEb0M9EfDx22w4ybMWA/e4wpI2emD0kHgCmM+zlpUn/gDuR6SlQsxERd1lyBOaHMCeNEKN9eupKp\n", "sAYEnzNQYiM0SXr9jHHK2M4Jbpa5UlAHdM7ASO/lMHGBMWfs+f2Nc1k8HA7LEZgtO5GcrwyAsSY7\n", "17NV5IfeYeaNfpwLObj45kYil1hBhdrinIehTEpyENu8+7oP+hVZr8SljFSs3oY7AgGPEb4Thfu0\n", "aKlGgncq7A+0ZlkuhlFlCoqK2hhFnhNIX+AyjTk0B6XY2BixUX+loLazpFJApFxb93PZrqdOm5hK\n", "DRFD32Ej7kD8tRHxTS5cRl+0WJ/4Ob+ZZlweqOv54oYEhLdDhxg8zmqFHzLggToXTNyRvDzMuLlF\n", "rbYjMDLzyfGI2R4yX3q1nxCjR5erMs7SOOOKLaSfc8fh5W5iquaMA3ccRIXbG8bcuqexv7MhqkPS\n", "dujQ910DMAQscVn3lqzJUaPKCw1UgQzXulELFoa6IpFQc1ThvuY6oElfbUBzLoYxV1tCwL9CHa/T\n", "eqOX0J3JohNtrwTnK+V2nMilokiQ0lDBTQsuoCWn0XvYFMHCJnPZjl4UBRmaMj4V2jVnuEzJqHah\n", "mI3mGdRTdyAt6KOy0SQWEROD6dQHSuSf34w4W3VY9eR6lEvBbsoYYkCp9PeXuxEvdiOu9hNuGOgc\n", "Ezdu7EMFABxbU27z7jdcNGwHaoKkQgLJqMAhZVzuJzy7OuDZ9R4fX494cXPAq92Em8OM/Uhd4MLk\n", "MxuLCLBpwsLCHEX0DeDk9yQdySKjc0asT0bo5PMsYpFh07TirDktLbQ3zDnA0f6SOdbJiN6tJtIp\n", "Fr3xS80R7opFZckwb1oVVDss5t3svWSaxcJgknyoNXeWedGcqxb9UkPJV04ZPiUgs1ZYXR5HGqHC\n", "jJJnUvbzKbdYNGUBFSa82kVshpHEy4MjNvlcsO2jamnsp0RMLWFHTAljooZLrjzisUBUGwNNc7CR\n", "Y18/IXIsWnWk95gyAyU3I55d7fHx9QEvbogddj3OqouhsSgYjbAFG8xIK9iCu1aihmQSVk8M8soX\n", "Naratc1HschqJAo4rs1AEX02n13vh1wxp7oYW1mwCn+CWPRfD2LYosEddT5hgAxejSXhFPEWkUcp\n", "sGutSDni0Ges+6QURnEIECFJOUaBFatq95oou2rxzOr6XaCuwJgyAoMYU2Lkjucnrw5UONxMCTFk\n", "pJwblTE32uTNSE4gl4cJr7gDuh5IlA+1tvnPw4QDFw5Xe0nopfvZkuAqRUMuOGjBMOHyMOF8P6Hv\n", "AiOVjix79jN2+wkv90yX5OLi5pAWnU+hKakVY2DXlp6EPC8YvHi4GfBwO+DhhoqgLnqgAmNKSLlg\n", "z4WbE+sdBY+MIJC53lbMUF0HjOCqihlGcicpjEKl3ALiLXcVPuYx5fbUcTitRsm1I25VY5Em9rVR\n", "cWV+D6K3oohYAEJFjEtasTqHWDaGGTvT2U8d2WjUYgrw/GaFui33bRcQpIhfiSV0VAvoVU8iu3F2\n", "SjufUsZeNs/dhBc3I56tDlT8c0xNqWA9JDjvkDLNfz5nirV0Ag5zE7mTZ4sAd5MUzFQ0XO5nvLgZ\n", "SacCwHbOCN6TM9I44+PrA370ao9nl3s8482aOhzScSDxZgcGmaNfOCPRZ6ev7RDheiMe6j2AojRK\n", "oVFrl+eOERlZ9wkLN5ck0hhYgBgSa9FEGHX0RrsNosNBvyJCxqf1Zi+1BndHsUgADHvvMmMycWF6\n", "K5mRmKSJpoMdhVKtHu9akaK5BBcODES2xDajzIVGPKTTKkwM7+EDxztmRzXmZLNODnMT1JtTad3I\n", "3YTtcOB8i56lKRVcrxKGjoTCRwYZXt5Q7nR9IBBj4kRbGlOyCj/vMkoiLmyvdhNWHTVbxpTRsxD5\n", "Yc64Osx4dnXAjy73eHZ1wAs51jhjL6wwPskSiwbV5Amqx7PqI7G0QmisGKBVgakgm66y6HxMGv+r\n", "NqscnBZlNge2gFQQtocyPkyCyJTtJVvXxKNi67/7Hf1O681ZoidxVyySnMjmK5P5O0SvQjpBsnjc\n", "YMkk8gbM8Dq+IrEoMUtplBFYbQKzo4dYnuqoBBXazjwrEpPE2VCADO+IMS9NF6nPXh0mrG4IeA2O\n", "8rPDTPpj0XvWRKSxk5f7UUdKDtLYyW3sxq5SoefswA4oV4dZ864pZfq7gBgcF59dHxTEuNxP2DHz\n", "Q2pBwBhHhKBMMGHC9Sz07qwWmIAKKaPOGZNpru/nzMwSAlaTyYvUDENAkyA29013xFvGByBdQKN9\n", "ljGnqqw2m3/VnyAW/ZeDGCI0osq08gNzvws7QhaBFaywHZoKtgi8AQQWHFKmDbRrwo9tFt3pPd66\n", "rE0lVQ5p9SpWsd0I3gFD5g5BbTNN0mW8PMzYHGasxoDDFDBJx4EtxA6mC/ByN+L5dY+L9YHmt4PH\n", "WxVYzYmS4VIx7me8uBrx/HrE5X5k+qShVrfTRu4ftquxm/D8esSm7/CWcyReRbMd2O0mKhYuDwt0\n", "73I/4Waa24PINy2xMALPnBMD48G6x8NNj4db/nNN39v0ESE4zePHuXCwaAItwhyhDRQ6gw577lkD\n", "RbrZ1jZRZ//ZqUWKgskXRo2PWRjQkZ1jCvep43BadgNd3jtVNRMEKdYuVl2OloiAHlfZiB3p9gwx\n", "YiVjD13TqlA2BogdZrufjToplD5K0FXlzYHnnj3QBfghYDV0OF9F0qdZ9QxksEtHjNgHooLTnlWx\n", "nzOuD9RJoDhBWhrBEyi4nxK2q45G4zLRGj++llg0a0I/SZwwsbpA3JvKgir+fBi187k5zIieOiHX\n", "BwJSPnq1x0daOFBMEuCW6JlClxRR5KAAhrgjnQ0dhoFZGF0wOhUceyqP9RnfdfVeLzzix3uBsAUl\n", "yRIwqiVDkWfeTbe1VgUwBATLxX4Zp5Vlbkcb/2m90UtylRBI2LqNPx0DGFU7ZDOzEJZz6GggRvDw\n", "RptHBGkHLoAlmZdYVLRwsOxR1qiZMkrioiFn6oCKBoN3cJHspdddxKZrI26bIaoAevQZyRHgMMkc\n", "OncjpVMqjalxzrha9Rh4jHdKBdfjTEJ3Mo8+kdWhJNqGFMa5ET3zooVxtZ/ximNRKRW7MXEzREAM\n", "iok/vtrjx0zjVuCW9TdqZY0wYYR1AZu+U/B403VYd4FYWtGMkgi1j7ufM4NDYp3Y7BPbyAo1kkAz\n", "54ZNI80dATJ8tNobaAP4zJqZzf7SaNzsbsAniy6jdGxP601eMuph9eUkFhUTixTEUBYR3bsx870X\n", "+AUZZAhs9Sz7ah+am6SKbtpYxONWB1Nk37CDyG7M2MyZ2OUywsDNJWm+UsPBax0hMaZjjT7BY+dC\n", "OdfNYeZGxYgYqD5NhXImcl4k5v+UCjdoWhwaZ3EwYkaB2eMF/BF9sMNcdHRF8q7DXPT1Je+62pMm\n", "xvPrUQGTm1HYZ63RrIBNZ0CMPmhDPx6zwQRsmjOK2MmyJtlBdMmMWOkyFjW7+Z5HdqK4gmqDzrAG\n", "hInBcWfKdkyxqOtTuRWL6FifeK/+LG74z7KkExllpvzoPUr3U2AFaRKINoZQZga2WVXxeR7x2PYd\n", "1v28nMfkDoCK01Q7G8gFSq6kvs0blMweDp3Hpm8Fs3T/U6Z5b6EEXe4nXA0drvuZZsel+1kbbVLm\n", "z4U2uRl4/AJULJwdOvTBI5WC6zHh46sDnv0/9t60PY7cyBY+ABK51EJK6vbc///rxnZb4laVG7b3\n", "QyxAUWq3PONr+70szEOr7WmKrKrMyIgTZ2Ga9dsq1MnEZnpF36+Yq0fH6xLw7brh4W1F7xxiJhqU\n", "MQZ7THhdAn57o4Hhr6/1Qf228s0YInZmkRgQ6CSMlIeRkkgIwBjwmb8eDz0eDj1TocAP4MqCMcZU\n", "Sn5rLiUDISqa6KxB1xn0rmVgcFpMA2QMrGeVLef7ImiMgfhtvGf3gK+7n7lB7uf/7XPDjnDVdFMW\n", "ZtU9Puv12sb63TAxDJQBMPQdDr6Cby3FuF6ndORniO5zY7nGpkZyTZyY/ExnKD607zAwgPHABrsP\n", "Y0/MBPaHuO4We7TIoL9LGBIvcwVXOmabCTtCZHQpF8ys//x6WfE8b7QB5d8t57qZlNciwO3Mm82n\n", "eSMDY0OU7YkpkyHRUPJ03fHXtxl/fmkGh5nYZ1uMSMrCMBicxaEn+ch5pEjpB/46jx7dwGbGvmMW\n", "hv5imoCyp4Q1ZB0aNjYKiw24YABl5UkqkoCph97hwLGzBGDwtpUZ9gBukgBkGyyNX2tiRYvs++Bw\n", "P9ABVYw4W+Bfeg6ReYiPggwQKRW43G4EUMHVhtEobCLRSxON28KYpEwlASFFtz1vJCO77gHLntAH\n", "Nuf1GbA8pYh0pZOI+o5Nhz0OvSd/MWYQhGjUy0ti3vtZPMUs+wnT4HAeg+rSYyqYd2F2VRr3yvdv\n", "GxdtAJKTNPTteYt4XQOGK/Vce0yY+sBG5FmZGE9X0qF/fVt0+3ndwjtGGHuEccrcQSVtjZdaVyOx\n", "AWgjj5iRg8hbyNvjugWse7rZfqqE7oYhXGniPQ9o3ks60o+lJGIkKBtzGTgFzFDDef5Z3b0Wffij\n", "PgeNHB+otUjY35omFuRPMgTuUvqeiXGzpGy8KtivQpZJN7WIr90t8CKYB+15D7juAY+7JxNvJ6bn\n", "zBiw1XBXPHqExU1eZQ6rs9hjrrUoRCzO4G0NKrUDaCmzhsRhAlTvQq5LmjdOMaoLYPEtrCeL1DZl\n", "rUeXLaB3EhxRMPeUcFkK9YIzp5Y8z7v2RMo+C7UW1ZCITmV85BtIfUvPPafWhlxoKRYpUnpr3lep\n", "82uo3mey3AHqbNzdAOPEAJEFnXVNzZNrgNlnIjOuS6TGQDp/X4t+pi/618tJOgffOY76kqGhpW/z\n", "n42GmME1lZao4aOjJlvQsjUkdamfevbHEG8MQ5KShBYYEhOrSssUHaIFGMig3xedhQXIBbr5edc1\n", "KhNDLmbJOpftbeSNw2UNeJ43Rco8X8AhEZXpNHbonUMuNDh8u2z47XXBtysxJWY1c6msAgEx9pjp\n", "AT/v+HrZMPX00a4xYuwoYlVAjK9vK/78OuO/X2b89rbg24UMrK4rDU9RWBjc/BwaCcmnI8lHvhwH\n", "fD4MysiYBk/bAAA+ZPhY4JwYeVWTU9kItJpMQd7k8/W2ATB8BS8qE4OM9QDRVjVxkoZoXLlI0kCV\n", "rrT9nTov38+HPpKa0zmLzlQzq1KaTbps8FNjgJtr0wygmuq4AnQ04I5sbjfd0Ptq7bKWlnKl2WrQ\n", "Ay6rX474TyAKRRPtzQL4Dq5hST0wK+ph7Nkfw2NiN2ulcXO9eV12ev1ch0uhOvK2EoghD1TRin9r\n", "/CpWlnmkcssqKJmaD9GYvi470TCdRS7AvEeMHFu9p4QLm/X97e2WifG27kQZbVgYwggjBgaDF4ce\n", "D8zEmAYPKywMoVdnLfYoMpgJXZLjGtWklBMOBMC4oaN6+Sw7/efOs2TF8bBYEr0HhdzbW9PkyBrQ\n", "atjHzZaRweHOxPjox3dVK06u7xYmphtPnhbI2ESCEBMl/7SyEgFX2fBR5LGDdxh0I2m1/gm1uuQ6\n", "OKycXrQE2XzS16N4eHmhcfMLcIZYaDw0nG7Mdsnpf5BFTEi0AY0sg+1Cs/SQ/oqM0wfvKNkkkyz3\n", "yh4aZP7Lr1+G/nfbz6hLnqxMVc+LqCUkYnTy3y092suy4+vbiq8cbagDSsvCEBkJM95ODWgjgDUl\n", "k9j6y5RCLJY90vZT0u1Y435ltktINTpRsCiSA703ECW/MC9ytnZQ0Sa3IL4zRNxT0g16q0Mn3+jK\n", "br6fj3t8V9kSbXSm1CIx/6XrKt8AGTFyvxIz9UPSZxvUKGYF5MikW3owkf4n1L5ok/hTBiKvayBm\n", "Otejhz7COFvv/dKyyKtHjwCrcn/2naNFDNcimem6LejwnLPI3qhWCOignj5sD3CTXsT31fuTmREl\n", "zJJ5o96roCDEhH5zaua8R1o2qfH6tZp6KguDa5FK2rzTGekwEBtOGHdOmBj6jCAWRhGT95Vq4yxp\n", "Kzu953sTKd3OaG3wQt/d2jcYnav4z1QANmDdb2pRxq4JdNXYExBMnFg7f3T+5SDG0Oig3vsXCMrX\n", "frU79Bq9yUZVXTX3FInHvPOHyBRpuVi7zsHGBMMfvrABYvyBDl2WnoYQd0hUH2iwP7JmSSUckm/O\n", "rvrXzdPDKGekkJR+NO8RL3NA74jOaJmhsPPD8zQSE6MAWII09yu+XVa8LTuWLbIZTb55zxKDGNdN\n", "KOIremfZ4Wednk4AACAASURBVDaQL0YhEONtJX37X98W/Pl5xm+vlTIpjreF687QWdowjB0eGaz4\n", "chzwy4lAjC9H8sQ4TD1M31HDxKCS27kIlOrZoeY/PBCK14DSlNg5XQtP39UIyebPQ+/ZcIfeA6G9\n", "3aQBMJKrP6NhY5CE975xuB/odlIc3oWdQ7Wo6jJD+6V+FaU2pzIwwAFdhpONZF/r0aQR0MJSsggp\n", "MUJPD0uhF88yQGz0Z4wJnQIZTs300Flg6DANBDR+4qQgYUed1D2bB3VORaJNQETndjjDqUuZHq5v\n", "h6HRpt/WlpaJEVIFIgvISxCoZsYLs8/G616ZF7zlKKB6JBK7b5dNtZ8v+rCm4cQYuscHNhY+Tx6P\n", "k8fjYWiSkTz6saNUEgEWatcFpIwQEmZ+aEu87LqzmXESEBv680hS2KlEsf0sh/6dlMQaIJtae9It\n", "aKsGWYmMvyqppurd7+djn945buityjANN7W5QJ+fewticDMYY0IfW0lJwxBzt/487ZfopZ01CKnq\n", "tilZKPK2kRrcy0Zf2xY5irkDbL5JQrH8s459dyP3Ir8aT4uSnSjnOVWDz+sWVM4ndOp1j7gMXiUm\n", "2tzvUZdGM6clBR7629GhMCVd4hPnPaJfd2V1LHvioYTT7SI18y8rDQ1P84bXdce8RQVKiGxnaLkz\n", "CCPs9jUqU7SluDcsDOwJ60bvqzB5ryuBRQKqtrVIPMK+//zYMNWz9897Z2rWvO9s+k5DQ5Uqqnyu\n", "rUWGNO7387FPzywt9aow5qYWSWqi1CKVnTGQURLHn5asck6pR3It38QRe/F3MTd9kSyOhEl13Wod\n", "eltp7hoHSgrTn1GkZ6hg49guQgeeDXenLExhY8icpozcUpfQUi/pRxBbQoHePdYe693SlBb0NUky\n", "RAJjO0c/h1QEJL03BtVzMYiH4q71Vw09G0aYdwIcuxozL8xff5tSx0aNVBukDvH8Kj9jbhbxrd+Q\n", "9EXvvQrFd6PvBCxp6pBIHVNG4efVGmMjncvKNm4TUIywz34CUP2Xgxii4RPjGDH41EialoXBLrg6\n", "fKLS3TyjePRiU7NhTFWb2FdvjN5ZdMYikMhAaZNBInzkSz80TueQRkCogaXAWYMzf594XQiIcV2j\n", "arl31ocJHX3dEy5219cNQOndr+uOUxMttkUCNp7Ysf9l4cEh/sjYsxpXvSzVtGpPxLzonWVZC2vQ\n", "Z4kRo6+nmQad7eZBbTH1DqeBEkg+Hxi4OI38RVKS46GHGT0aXQ8QcyMBZRfaWCOSQkpq5qKGMbyN\n", "VF1XX41EJX2hGhZS4yXxYF1IJCHh66SAUM96DYkPWf1Z1t4p3PeDWoBdbeZrtGF1cqeH6Ts2Bl+/\n", "DmjYEVwreltBDAXfbmMHNXIQ4iNRm4HrRo3tdQ+YOUXoLBuOvlS6eOcA38GPHUlJpupZI1ILoSDS\n", "/V316PMWaXDg90I2EZct4uA7jZRumWQvXCvW/ceeGIU3GmJ8fNkYtCj0d4+dg2MAsurUdzwvFLH4\n", "fN3wtgT1/wGINTV4S0kkIzNODrev8Th6dH1XU0kMv7NCmwzpZqN8YW0pDQ7NawElJHXM/NC47b7d\n", "KtNnCGVi3D5oJUKMWBjN5lNNsqDvmUro3H37+dEPNfJO5W3tvSmssJBoe7WFrEwiea4eUvOwExM3\n", "a4HOoOssS6IaeVv/B7Vor4PDmyQMrZTUMUwe6GOtd4CYl6H3lTFFPj3Vs+YysJ9Oykg56qCy7gkW\n", "QV9rYGbEoSdjT2dp0xpy1rrR1jVx0Jf1juAGbTrJvEVNs9tjxrgHOCPM2gp0XDZitL4ugU2MI2KS\n", "DSFJXSeOtj6psTC9Tom57gTc1G2kABgRaPrFNx4crpvIkH+nFrlai24/QwfXMZVe/EkUNCHgZGsA\n", "r1U25kFA1cZgWA1E77Xoox+RYtx6eNEppRrFtqabwh7dAi1vO/FdMCI5M2o03HOSUZsaIssd217G\n", "uah3jsiv3vTe2XHZPI6bR9dZOBj1FER5l2TWPsN7WoTOPqkEJBdhY2RsoXr45UIxslvMxKJ1xJYo\n", "kKSRrGajAohUpnxtjERlEDOxVLtgdf6g/soqAyopWyMxoBBYdlbBVHo7GaTRhZln8FiW+FWJYAmR\n", "4aKYyJ9iD8xqCXjbdn5fgxqqb8xQVSkJDJF/G6+RwVezc0mhvDEXLoZBjKRSknWvgJf8DDX2bGsR\n", "+wD90fnXMzGaWChn2EzPAkhQcEFMrFpHd31x2vRRk6kaPqEmDh0ug8dx9I2PgkO/ko7HpoQsFO7U\n", "GOkFeYAIvZgowQXldjjhDYcvBY+80bxu7I2xBUbXiea4hchazdQwRaCGpqXUVJG3JVSPDANG64iO\n", "/TSTJrM19mydPVsE8bIG+M4iA1hDJNqzE+MYuilell3BkacrxZUtPJQUELo3drL17PHpMODzacAv\n", "pxG/nkf8ehrxy3HE+dDDHXpg9KQLl19Kb/LMlLN08yAVPeb7GFcxipl8BTCOrO0/Dc3n6R2stRSN\n", "WHKN9YEAJ02aRKnmra0Po5jT3M/HPkKrbh/WInHLzOapDtxcG9TEippAX7hYGyOB3UDXofetLrxr\n", "9NLVdNha8ViqnhhLQzWWLeh1TzgLjTvl6sNguYHtqZkmZgKnBh02vMx9EwGWtfEQrfh1o/ehALqx\n", "vG4RU09bPmOYJZIo8uu6SmPfbB2a9zO3D/c9KuMsZgI1fGfUa0Neq+hKJXFAZHOFZzHvKI3kOHQk\n", "aTvUr8cDSWcOIxt6qjYcxEllAAO7bD0pDWHeA29QEkvoKsPNWqBr4iLrZ1e/et+9k5JwcckU2Xpj\n", "dtaYnomULqPSM4X1cT8f+wiAr/2Ru5XbismdbNYXbgjJPycixzY5pAE6HUUNK7tREr568cdwP6xF\n", "CzOX1Lx8oaS0NzExl/sNgGo5efs59Q5HZnGe2a/mNHoc1w7z3mFjmjJp0glUNSFW/4/MZpzciFuR\n", "AzMbY4tk7Kfmc7LYecfizrKsigmrpdcoPmU9v786vMTEDC1q7OctKuOsoNaiQUAafk0EHnuVz4ye\n", "gQWZxoTCHSKwR8xr1IHhda1x0nOIv1uLeh70JO3loEaF3S3zTH4eAxgpCh2fQNxVt5+8ZWW2s9ai\n", "huF8Px/3aAKOs/CNL4bWoiLXUAUvVl62LCEihoQuJiB1gGk6BEtMn9bzTpaWg68s/c2mWouixMJT\n", "//G2kMTidQl4myIOPS1KJhhiR/IhpsJt0uRRZsOhw3VzWIJj5lNGSYVB1UI9A6pfWeDkEPHeA5jp\n", "zQyuVfwjskSsfleKFIiOieqPActVfEYXaLFKLE5a/G6B+hO5b8nkPKuiuHPmhrV+HKgmHQbPtaH6\n", "vRkYoe2T30iIWLaIt5VYba/zjjcxKeVZk2pr0kWztbU+DCwbFBaN9LSuNRcmFIqkJCFj3xMWrrEr\n", "J2GKBClEft+aWuScgf9P9MQQSk7PnhDOGbhg1JVUh1DWQ8kAKlt3oGVj0AeUC71phKbzg3Oki3Vi\n", "jeLgHfxG240Earx1cAikQ99CzcrdGMhIbbyh0Iatp9eSCj7HGiV42aIiZvPeoEylqO5qC6KbpucM\n", "xa/ShSTZ5WIi2mquLlvAJoNDvsEwdNCSbamxBimRr8bAKS6VthlxWXe+cHmzslUAw1qD3jucRjII\n", "/Hxg8OI04k/nCb+eBnw5kS9GLwBG34E7DNDkQNJPATDW/TbfuXXxLai6cDFSnQZmX0hs5OBxHDsc\n", "x+4W6DFAF6uMROj/rZN7Vu8C/hj1+rk/rO+HQQyNopKIKKOgalbtZ9I6scZKg8uy+WwAPPBmzPC2\n", "TowoD0OHY+8ZiOvQd4EH+lw3koGa6Osa8LrVjcN1DVi3hFHYGF0iUz0LZmM49Ext/nTo8fnY43ke\n", "8MJDx1XqB/tYRJY7rFKPUB+uyx6r/pMfrKSTj8oKabef39EmmeG2xoRujwDAccuJDaa+p0xeeeMw\n", "b/Q+C/ovG2QFMNiX58uBmGCfDj3Ok0c3MBvMuXcP0ASEStsWaubrQoaFC7uKC2hCgCqZVY2du2Fg\n", "yGd36EW2Ym9/HlO41Rgx0uZTnie7SFYaELoC8vda9NHPjU+FgpxUi4SKLKwCeY4uCsRlxBBZUsKS\n", "M5WUUD0SGcLE17Ns9QXEfV+LpP+4NIMDScp2nEePoe9Ii84MDJHVOUsmc1L3lD017riMPfVG3JC3\n", "UZ9bzACiNvt7oIa399XwszJPqwlyYE8QYu2+237majTsDNWilAt2lzQBpmTatu7MVFjYoX+Nmanb\n", "9Pc5BjAOfe2PHvi1nQZimkzc2N9o0MEb6S0i83v5Mu94YbbHmyQ+ce17X4uIvm11IXcY2F/E06By\n", "Y+rJP05qXxBvpWZwaLXuOWWt385V8/z7+dinpt808rZ3tShw6o+wMObAzMad+owhJJiYbgE2S/XB\n", "+zp8T43XlMafci2SXkUXHsIIWwhUfZ53WlJ7mpsGFBhj6fpnZlHvasrhgb9Og8c8CKjHS+uSqm9Y\n", "pCGr9fIbukR1yFLkrLAx1GxZvB1SuTE7lyNzyZ5y47FJ369pdTzvSnCEGqbGKusAoAkvI8vaKkuU\n", "Xt/Udxhcd2NQWnKGiZxm2QRNvMzk6fjaSErEayiIlATVQFRSO/Xz63kRKHKS1tST9IkoMWGPUUEu\n", "+iJQY4sJIRfkhhWmBrD/iUwMNbdjREeygU2W6NpqiiYeFbK1F4o3sSSNRvQQSk6D+zomnLeIN36o\n", "nAbZPLA3hmNknQdepbgEpm5vNYdYmBkTo1eiL4WrW7djyviyJ8ysXRejJtp8xup6zxdvKsAWMwpC\n", "pTqGhHmIqnF07XYgyN/Lg8O7NACwiaXQLy+WthkhZgxbuHH73nl7MyvgEpSBkQubxDiibZ85heTL\n", "ecCv5wG/nkf86WHEr6cJX44jxmMPTD0wdACbbCLTQCQGLm0s0rxXnRXdkDV72PHPHTqrmyJiX3Q4\n", "D5K04GmIYJo7QPeI3qAFKCWrVo/kKixZEY2afIQcY9ffH9Yf/lAxtur2Xv1Vbj0xhDYpA4SgyDFy\n", "g9puPkGGm/AdxiYK9DTWyMHRk2Gwd5ab1loLSIYhqUf09bLs+LQGDGsg/xmVTDDy7S3QO5x4K0hs\n", "jB2fDzve1h7zHpq0kwIUAhEFyKiO40n1n+0DULTlNzp8GcjbwQHte5YwGwGLk0ZdA1C2ggCb0vzs\n", "sdIXJSJNGGHiy/OZ05FaKYl6YcgDNAkDIyEzfVuipF+XHZdtb+jobVxZpdK2njwnBlSPg8fYN1IS\n", "psiSkRI1ClGMq+QrJuxBElDoGdDWIvIBqhuk+/mYRwxjReLmOaVkZ7ltUkC1JocszTM2xkzJIWLq\n", "xTiGsEhlAD82EjdJ3Ok7AgoCai1SecVaAYyXecfLYcfD4jEOHaaOpKvwRe34DYNyk3jYjB6PB4/X\n", "pWcWVNSFTGIGhGxdt1id/WPO2FKGD7xNNLUWiSG7MuJKjedrj8iGbRJNf0TMFhtvlpX50bCnhDUa\n", "YjM0sEng1NXXdB49Hg49Hif658PgMXqKG7zVhINM9LaAq76PmwIZou2f94D1B7VIzNWn4VaaePAd\n", "+Z11DfusFHZXZj+MQAw4ulYIyNDtZ6q1yFmDzlS9+/187CMAhhg3ut/piwTEWHba7IufwrInHGKC\n", "ixnomFLJG8uO5zbZ4Gtym/grOIfORkTQ98gcJH3R20ry04dlYwkX/46GZkHvZNFb0zskpaQulIj5\n", "ftg7XsiIj0VSGRoxsEQRkLFHi1v/vdYfpFSW5Q9YYaVUX4yUM0KsC/tOQQ2jQQ3qw8bLMgGXIa/H\n", "VXmgstZZci9LewJ/DZOz6PezXOPeOMlSeqKXeefY6p0MhgXoZBld9cOon5MAGLIIlAU8+HNrfYBi\n", "EJZb0nhcrUXCPnvXF0ka0x+dfwsTQxA3pU2KhoYHzR/loUdG1OWDlG16z74YjnXsW/RYpojzWnWY\n", "h9FjWuhGmXd6gOVUnfqFRrg0xjGzPmwjcsqwpQEyLGsdS4FLGZ9Zxz4zCCI0RJFOSLxe0XSRgj1k\n", "lBIVXJh5++md0wshleolIc1wG4kFtP5NMjTI+5CqeSia7QUPYPL7KdJmyB39IAaBB2JcCAPjvx4m\n", "/Hoe8ct5xMNxgJ0GYmF4ppQKZSVnZHET5uzha6P5XBgYEiAJYEBKAIyWptnoaYWFMfaOkw7oRq8s\n", "DKZ9cQGI6XbTo0wMliP5n7xB7uf/7TOxaSNt0Kie6EOqiHdOHRxW2WipFj1RfZDtekvh9g6+ZzaR\n", "bOwEyOg7jF2NIRZAYU+56rK52X3mhvd13nGcPNG4O1fZYQYErvYdhr4yFj4fh5pjzmaWguiXApRY\n", "E5RKzCiI1dQv0HAt5oKS8KODg/4979NJCjIbH+/N0BFSNQcr/L6GWDcYYhDWov5jZ3HkevQosrZ3\n", "0c7nkSPWJJFE6NSRJCRYA5Yl6NDwLA/rJeDCjf2eqga9dTSvUa79DQjlet/4YfD2k3R9St8WFobk\n", "rQsTIzGoCkiEa9W13s/HPqINlz9FemVMUmlbTBIRXJtCWZrse8QUefvpHTG1hInhLJxvm97GY6ox\n", "gNui9J1FzXmvW9RG93ne8DjTfXfoaaHgDYDSVSNdZVW29xDLLtaelxkU5S7NeSlZgVQokEIRiGoC\n", "3ywsMqfJyVfOdSkiRwcH7o8ArkU5k4EzM6i0dxCvrvxu68lDw9Q7HJjlex6JAXZmP4zjSBRuiqtu\n", "WBhqohex6/Z4wxO/ly/zpqkDQt9Wzbut7+PYV7PUNm7eiCdPOzzEDARKXRDPNh0umW2ink5Si1hK\n", "ItGJ9/OxT6+GjVa/3vdFEtm7ynI01PjTeY94DAkuJiBZEKIK7Vna1K8De4fV1BCaC/dGUiKMdWGm\n", "CwvjNGzExJAYURQy1YVRHxu6f01dkrI8/Tq897LIOldkrQtAkYWPK3BWWBP1KKiTJQFOPDFujwDR\n", "BgDY3DuVwk5A/O+gMZPPBCK0bFdrOGr+xudDPAMruKn+IsqkzeoxsnLqyUvTXz4zmPGmXmFVLgzc\n", "+otIXZfeuabuMStMDdXRGHrytcHPKmFikHdkua1FTV/0MwzVfzmIQS+8Opp2lihsFvSaSzM4SKEV\n", "D4UgKBcAA6MaHYkAKoAaojxMEedppwfN7PE6eEw+YOg4/jQlNqETfSkN3KRVJN30lZv/sEcMIQND\n", "cyV5S29fzvAx4cseseyjMg5osxhZNiEGSkUvqFRKHSJkA+vp/XDW6k0ivhKCyqV3lEmg5jbvkfOV\n", "c8YWbZO00NKeWj1/RgYDGM7i4B3Og9cI1V9PI/7rzCDGecKvpwmfjz26Yw+MYqLnqv6ctWSiq1fq\n", "l24aojb0Kefvtg2jdzdu3+eJNrDnieMi2cjK8pBUm5qiZnpyvch7Ri7fWd8zZypl8k7hvp/WIK06\n", "ZNsaOcj3a0hJo76WUIfTVUAMYWPAsMSDQAyr2vDGqX8QA7iqI6w0Rvq7r1sk2jEPD0/zhk8zNc6+\n", "7+B8wzoAlNJteofTWL0jXo8DgbJck5TNxay2Hc0WNCT2vyi0dXBJgQeg0XQywCxO5e8P/XtQLXlK\n", "BdZliHVgKS1QLZHL5XZoYCbEiaOdPx84Gek44vNhUC+MkySStAAGCrAnYIuIC4E/T/weCpihpn17\n", "VDDG4HbzeRy7BoCqzD4IE6NNQKEXhRQbdsletcJtAkptSCqbcPT3weGjH2JFSDS8hWdqtWtqkVCX\n", "F20K2T+HB4fTHtGFBPS5bud5cDDS+DZpX0eWuY2+Q+9I3iam2Du76F/5Of48b3i69jhPG06jZwaH\n", "w6Oh/o0kJSBTPUMm7iIFOw09HsaAyxQw716NgWOqkcMhFR0IpA+k/qfxKpLbDdB4UPk7fnTk70EG\n", "CmgBZLLR0pkL+6MV8rIROWo7NHgnoKbX/uRh8hplfWazQHoPGxO9VFkYgdksT9cNT/Omf760IHOI\n", "ysoz4M2nryaix0Fia6vuHS2IYVDTAGJE4OQEuT6uGp3IvmRtLWoWO/dadD8ipxwkQtPVlJLUsBNC\n", "qmzxeWulocSs7EOCEdN/mWps6+VQzYZFZjt4Nlk3FhlZlyer1qIOr8uO55mex1MzSxpDwEBnrfrh\n", "kb+CGHzSfXwYSL6/7L65Hxp5bK5ARklAZpDVcSjAd6ma/O8nVhJIjWr/HQFMhdhPr62FQ+osJ36Q\n", "Mu/y20bs1IYJceBe8sgSfGH59t3tMnznRRsZupMHBgEYvNjhnuiy0rJZFtxCMHamiZW+SWprQHfX\n", "MND4PURMDKZST3ttQNUb89AbQNWojO4/kolx6L3qaXoeJC2j7G38aUvv25OkAdQHVkFRN2XjLDoH\n", "TAaI2TOIQQ+Zl6nHedpxmvkD3h2W3Wrj3JrQCQvjjRtfifH6tEUMIdJ2r3TCv6MXlDwwZRxDwi87\n", "MzrYjGWL9fdudVJLgDIgcqIklJAsdtZGdbKxBABUzajEbt1sPlFpSfQ/JDK7jPT7CZVItGWE7tUt\n", "AzXShjYmIwEYvxzJwPO/Hg/400PDwjgOmI7MwBh83UQKfTUmlD1hXqsR2Ouy45WjZy8sXxEHX6A+\n", "PMXN/DR0eBCDwqknwyweIMahI80ViKFmYDQNgShYRQGaoOBR1jQAw1tlkZLct5/3IzTdqe94eBBJ\n", "Cd3umYdt8c5Zghhvcjb4TkUaMeOWD2cA72D6DuPgcdbmt8d57Hmj5jF2AbONCEZADDJ0ko3D87zj\n", "23XD42XDozrg08NYa5CtzYHpHIa+shc+M4ghjYUwMTSTewc2pVBCqdkxZY2cbUEMANU0l4eN9ycL\n", "Cg/WmRoDE6EPOKFMZq1p9e9Q2jbrVh9GNvFk9sWnI72mR2ZHeGGCiR48MZV6jyjrjoUHh2+XFd8u\n", "G56uuyastLFoBeJP4d4NLD1/ZvT59YOv4K3o0FHIvIppkytvHK58nQh4tAt4W2oEXGcrgHs/H/uM\n", "vuMoQGarOoocVLkt16It1mg/kZoKAzTvqZr/dqQLF7NhK4ab/KyXgVhkmqOn3kgAysSa98tGCUIv\n", "s8fztOHh2vo/EGX5BNRhhe/nrt1+jhWQrIa6mY3Pi2AfNMSDwQWWnFpbtA41s4Om2Wmz/zuDA5lk\n", "UkJSMubGZ1D6zcyDWYuFWGanSj04cl09T+SFIVK2A0vMhq6lUzMbLBfkPeHCm2OpRc/XTYeHt5Vq\n", "xR6qlEQZYZ3F5P1NQhv583DN0BQUVAp3zMCeEWXzeePVxrHSTS2ypkaryqb1fj72EVkbsbRqGIO1\n", "gElgQJXkXyL1uG6NnJ57jvOQYHqJYeZ7wxh01ikTQ4HVnvx6Rs+eiSFpf9CCt8IMOw0eT4PT37Vj\n", "cCGVgsGRzE388NRzj5+1AgguocMW/E3aXCnAFoHCfYEAplI/KFX6FnxQYLW8XzHj3b9XkA0Arufp\n", "XT3LaFI639WiNr1RvLpOY2WuC6BARs0slyvCwiewdokJV+4rnzlGWpi+4o+4hHjjWSi1aGBQWj4r\n", "Yc+Qv1vDQANqSlbISAq2B74+CMwQNQAt1orOaMJ8E6Drj86/gYlRNX3y4nvnsNmEyFIIMUAJDc1Y\n", "mkBhNrTRnBLx1RmDUy7Yg8ey93g8BDwupFl8mTyOq8e0BcyemkqhICrKtzZmJ9z8fj4OeFx2HCZu\n", "YAdx5GaapnfA4GGnhIeQ8EuoucGi96ENXDVIkSO0pZQJyUuZH9bWMLDOdGx+wMoF+X5u0Aueo31s\n", "IRdh+d6SCUlMhf65InuErh3YyFMYGL+cB/zXecJ/nUdiYJwpVvV8HNgHw9/qzzPrz7eIlWlKz0qX\n", "ZPOqNdy4iUvOsbcVkT01MZEPU922kt5Uts9kIGZEr1ZEr1avj01TAWhISlxYLKoz8n3jcD8A1aNj\n", "X936W4NP8YpJiWqRmL7J0HBtfF76kNhQT9gY3Fz6Dp4fNnItP0w0HB+YCjnsrppC8Qb0qnISj6fr\n", "hsfDyoAe1U/PYAtKIUkXQD/XWTg2ezoxffvzYVDkW52g3wEQe0yKwaRcUExBKoYDV0wtXAV830GZ\n", "ZT/cOKCg5AxbDJK5RV3zu++X42wdemTgeTw08c5HSl15mHqcJmJmKZ0aqO//noBlx3YlAOjbZaU/\n", "efsp1MnrFm5qUWcNRi+AascAhq/mfaOHHVi6Ijp0FI0tUxkdN3Sq/WyMomPixsA0m0/eRt3Pxz6H\n", "3hGYwMww8cjqnMEemZ37XS0KNcWIGVc+JJiQ6pJBDD47h84TaFvjihupJjfAUotiyTdRya9LwLcr\n", "sTDET0No5gXAIRdaMvB9LbHpQ9fEI28e183XLVxj3i5H+iJZ0JRUkE1REEP6otI0/D/AUvVI35SN\n", "gTGlMsLk7/9BHXPM8h1l6BnJb6iyRNnMc+TIZd58GmNQckEJiczmY8F1C3iaqf58vdZa9HzdiBHG\n", "3jw7D1FSi5QRNjQM1Ub3bn3jjSQsNKLAITdm85eV4rrb7WdsalHrAyQeBffzsY+kT4zCMOLBuLMW\n", "wWT1L4wMLCwNoKq1aAtYgscxuCqxBQAG8FW2OXTfSaVG77B0FntM6iUhtei6Brz1HV6WndPeOpVx\n", "WUsgRvAFna2eNwCbRfI1PrKp8bH3WIcawpBKXRQHA8RYgYxSAFMKigESii535Eg/9b6W6P+f/4NA\n", "07r/+KPvFwYGLV67d0yIpn/1LFHmMAcUWjiRYTItdOeQ6nzLjDCa0Uhie9U+MaNwLXLm1lPk2DBA\n", "pr7D0AtTRyR6vMSKCYWvjSsrGy4Ls4L556whKgNO+iJJaxPGyR+df3m1Et3O1HeYBon4EvfpLNJi\n", "1X62BmlK+1E2BiTaghpKa+BRcGJmxYUp1S/zgMdpx8vi8bZ0uHqHNTj1S1BzTZaTPC87nq47Hg8E\n", "ZAht0A9sqicbuEb7jtGjDwmfWFai0Wex0qWLUJ1BD/iaUVy9QLIhuqM8lxi0A/Djhy3QIIUGyAYw\n", "fPHV7+Pv5f8umnPfmG89TkTX/pXlI396IAkJJZKM+HToYScGcbQ5QhNhGJDWHZeZ3juJb32+bk10\n", "YrjJRokkYgAAIABJREFUOW5p45Ip/ygGfoeewQzaGHUDGSVy5iPFuJYqt9mZxi1xczUBJWtxqDGu\n", "9v6wvh8AqLnaXJDFFKmzEr9X9Z8bG1BKGtHM+sF5iziLFp23fupX4S0sF/0HBuiEYSQDxGVzFJ/F\n", "wIJI4i5b0IfNw6WvHj+c0PPZWVjTsD8Awk/4AXAa6OeJ47QALuJMLw9s+b4QK50y81PbAMiGgRk9\n", "P/ewBpjK/e57f/SQJoNLoxTJ81gBDGJgDPrenTk+u/cORuoQAwmUAhAQ5h3P1w1fLyv+dtnwt7cV\n", "3y4rnq6kQSe/I6rNKJzKxA/q03j7WZ358xqHDsa3LAzcmFelUD0K1AcoVBnPjdM3G5yNTM+c+jug\n", "+tHP6KknEiPyKrm9rUV7U4tE6vHGRrWXNeK8BbjBAz7dpALAWXTeKutSfR2Gajh8YW8GrUUMzF02\n", "x0NDh9O4ccPcwTsGU0GSuNE7jmql75dnvJqK8r29NBIroRJLh7LBqEb6/QABAMbcVh0BMH6vFhn9\n", "d0r9s/mG9vuoratbW4mKld9bgM2zeBsJ/Z0HKJG3SNLBsieVkXy9rPj2tuHrG4MYPDxc96D1Aage\n", "YTU6sZEiTnV4sP5dKknJ6gUUBMDYAt6YBSv1SHqj97VIQYz7cufDH5HYjp5mtGq4ab7riyqTPSrj\n", "+rJWack0dLAi92RA1boKKMgz/9A3fZh3mDuHzSUkZoqKf+F1j5jWgJd+ZymDMGgZnuR7UCLile3Z\n", "+OGJ59XSJyxDV41uuW4VAAgAOjIhl55FaxH/nHa5g+//8btTbv/jpg69/14D2YVVI9SJGRCH4dYL\n", "Qww2RX4I1DjqlImNvqfKwvgm85nIbJdde8SNpTXUVhp0ndFaKD+biAi+ert1lnoxqUVZeqIqIZGU\n", "zcsacN2DSgrbvqgCqhVA/qPzr5eTaBQMI0eqC+dUDt6uV/dp0aInNUzbJd5PdQKgodoRnXFMBeeQ\n", "8LBHfFoHvBx3vCzEqHhdvFKJ91hvxi3mGyfu53nD06XH10m019TEUja6EXiMXhQDGWbocJx6fN45\n", "wz1GbOxl8V73bWD0gblz7GEpMhgUfVnt+aObo5SCd8/3775HaMzywDr25Bz+6cAykpOAGCN+fRjx\n", "y5ko3OPUw0iMob29ULEFlCVgmXd8442DbD+f2LjqsgZNH8ilvNOaCv2d2CCfDhSd+HigAWKQGNfO\n", "cnwYUVaVrRMboIvNC0WCJO85+ZuZG53pHcS4HzK3E2o1e2OIBpS9KjQ5RPwq1togilQj8gaUaFUF\n", "6Iys84C+w9gwC+TrYepxmj3eeqJXB2FjcNLQzE7cT9dOfTSOvWxAndK4XQYP1oBc7DIgCwX6YepJ\n", "/qIJJVUTrYCpMYjyAHv30P771ef7U7/v97+XHlpG48ImT/GBAiJIGsmnQwU3xVxz9I4yyQVICMpx\n", "JR+M60oAxtuKv70t+HpZ8fVK1MnLumvkbOJGpLOGgZ9bFoh8nceepSTCwmjAE95+hkaSKHHb1yau\n", "LLH3BgxU0tYOKvfzsQ9t1jw3if62Ftl3tSiIETlvPpfaJG5bwiFEIDLYJv2Ks7Cdw6hUZB6OJ76v\n", "evINWzvLJpdQr615i7j4HS9z3ZSKGWjHQCLRvsmcHIZYIwVVMjr6DoehegStIWKLvolqrq7+xlTv\n", "MDS1CGjrys+dn/k+qn/8u9pKZb4BEQZiip6agWvsnXoooYDZDYkBoIx5i3ied6o/byv+xnXo27UZ\n", "HDaSkgi7WI37dLnjb2S1x4HjbYWFJigN16HC14ZE40qEq3hiiEH8j2qRbFvv52Of6h9BTAwCMmrs\n", "s2lY7AKozjtHdK61Fgn75+jcjaTENIP5oQEKyXBYop8jfGfJC5GlZSKlu2wBw+KYMeI46bJKXyMD\n", "qp211diyEAvrfTrKoe+whXyzIJclDiJb/vHr1VqC9//w8+en6pGB+m+8Z0ndfPnKRPGOyADg8UwM\n", "3I0Bqw3IZ009eWTJ3EhJpD8sGcoIk0QSYageh7pMEy858sMQZir1wEWXOvyMYobORT2AakqS1iJe\n", "ZomsbfJ/XIv+5dWqGhNV1G3wdMFuji5Y0jHWZI5bkzQ2h0z55sIUJgasgcsdTrHHpz3icgj4vAx4\n", "Pex4XQY1L5k3QpzEayKmhDVYXFfK8D4Om6LfSrnsO/wf72CE+UH8F3phTB13o8dpT/gSItYw1giZ\n", "RDGGVY5JshFngz6wNeaH/43/wf3xu98j7AsZGKRhkiSSXzhK9U/nEX86E5jx5Tji02HAcephR6ZR\n", "24a6nSj7HEtA5Jvi6xsPDhfafD5zqsJ1o0SHmDO/XUQnOwzuJn2AEgh4eGDNqREWhq38EmqYCLCQ\n", "yMtVcqqbJBd1+oaBvzEUohvyfj72OYiusHF3lvjTzlrsTJ0MLFladkGWhaZLG65VQIyYKW5Q2BEd\n", "mUB23Li3g/HjwePh2uNtCJh315huQvWfb0vA5Hcc+1UZbPLQ8LyFOxXACcjHSKhsE0dmWj2MHsuh\n", "V7ZSkFixXLeSxkRsBjCxbi/+0YHhZ44MDIZ/R6IOWkzcwDyMHp84YYXAzEEBjNNQfUuMMcKx56c2\n", "6cBfrxv+9rbhr68L/vq64DeuSc+XDS887EkSQCmVESZO3w9aj/hncx1SKYk0ZEJZiQmFKZL0sK6b\n", "T9Kg3243hDIpjYk0cffzsY9uuvqqOf5RLSKPnsSmm42B9hLwxv5T0+aJNeocN5fQejQ0ni8PbY/D\n", "PdmsngmJaxElA1w2i2HZMXrLyydpnA0MhIXgMfgMZy0KS2RRGj13V/Xcy+5vfMNEMivHAGSwlyuQ\n", "8X/jSD2SBloBl3dN+3G8TQGQOixympgpFc4kAjPaoYEYYfT1dF3xLMudLXBaSLqRmWkc5NhpStvD\n", "1Gvv7MUTqQVTo3gBEWBBpur7rbE6y1aUvo3va9HhXos+/NGBmVmCI0umPHvgBH78SYqRLF30umPD\n", "2ssWcNwqU0J7FFM9cwZPjKbTQGbamprUOwzRMZuAntWJl0nzFtF3gb7fOXSOAyJYohFzQeg7Bjes\n", "yvVhqDe6ZR512PqEPXVq7inG5wXkAWKQEfH7bPh/1lEwVZY7fG8OIoHxDoehSQfpJemTWBhGzDxT\n", "wW4SDN/rexKzePbludYlc2suvAdetoAfF51RdlZNQpFlWjUz7lTSy9v3kBBC7ZOlFl3WKsOW9E6p\n", "RRZGF+wCYPzMovnfwMTwbKpSDaWm5mFgQe63KWcERt4oviepOZH6TfDDz5ei5lVwBsgFQ8p42Ht8\n", "5sbydd3xvARiY6xtpFVGKqQHl6jT12XnaLBON7TSUPSdxRd5eJRSB/sC3bweWE/9eKgpBnui19Nq\n", "0Qltow9vjQnGMM07//NulPqApht3YFRNtiGPU48vJ/HCmPDLacSXE1O4D0SdHNTIzuiQJOZ5WALK\n", "vOHpsuK3txV/fVvwt7eF6dsEbLytgaNVqQnTAUs2DRMNC59Y+/75OOr2tRMWhmcfEhasxVRp91WP\n", "xwyYIDSl0ninkEMx5ddT0TzeNw4f/hz7Jm6wzdnmh7UYRSU2sZKH9WUNeGXzWtk+nPdI90SrVXYM\n", "ZPT09z+wZOrzYcC3acDDgTLPD2x2t8eMzBvIdU+4uIhxCRj9phFk1X3aMiEq4zz26Hq+R/MtkDEx\n", "jfs0Uu1s45UT6zOl2JCEzcCIj0++laL9bw9RJI0mInkrEYJUa9VIU75GMtE7sV5WBgcjr1MSAFLG\n", "ztTtb9dNwYvfXlf89kpMjG/zpoAqsTAqM21saqIku3w69GSmOnkMraGnSljAgwOBGBd+UL82209l\n", "vzQyOk1kEjCVh6P7+dhn8lUbfuA6pLXIGdjY1KKQmxSjXQ20XxnIOG007FId6uoW1Fl473Ds3Q0T\n", "Q+47idjbgqPnJ9eILWZct4je7Tp49LzR7FgLnQstlg4DaegNszFaTbo2qAwQ7MxUFdC0XfQYY4Bk\n", "kFCZGvmfOD20YKqkwrUGdrVuSjIRmefJ4NACGJkBDPFrk0HrddnxleVsX8Wb50I07rdlZ4+KXGuR\n", "M7qdPo/0vJCUthP/Lgfv4ERKAu7JUgFCBFjO9rpUnfsbM2Gvzfazxrje1iKhqd/Pxz7CBKrpIeLR\n", "w94TLD3NmftwMfZcayLh27LjjZlLo+9wdJZSjEwraecBeajRpzU1iRjzW0cLycjs6y0muGDgV06w\n", "cCKjsGq4mQqBo6OwBFDZFECN8ZQo2dF3OMRMTNRUNKHpRt5hMicm//NBVWHdy6zmbAUXB1m8MpBw\n", "8NUDQzzcbuJvc8GWEmI2TE4lEPrKfoXfrhueLmTs+TI3XhghYku3Mfe9GJ0LkMuf0YH7MWXByAvI\n", "BSgZKSYsG/uXrLuCqW/sASRxz3vOzfMBDbjU6XX3R+ffwMTw+vAkQylf84GdxeYMUiyKugXZtDeJ\n", "AAQMVBDCC3wvD+q+A3LB4ZCJjbEFvK2jPuDfFjGZjLqxj6zvmkNCv0W8LDumi7iFtzRzMnA6A7Cl\n", "UDqJt1Xc5AhtJCCj4+1nZLPJyg5ogQxjDMxuYE1CSOYmPeB/Cma0iF5nqQmSG0KApMeJXf85vvDL\n", "ccBnATCYYjq2AIZQhZIYeQbk64bntxV/fV3x15cZf32p289vV9k20GcWc9abY+hIsy8bzy/HXsGT\n", "zwdiZfTiwdF3FUAxtP3cGwaGOrTvQQEuyX0ukObActY7UVoP7Op7Px/7HAaJ0iRtuGyiJD6wC0lj\n", "9yJT8q48sBKQQSZJr0vApzVgmnpiBqSGPtlZoHfwY4eHiZhPjwcyDSbz255kB1unrvGiAV12AmCJ\n", "QdSp2ZEALKSmIID0mGiwMDAaoyoSqjaS6zySb4yAwLlkvbeoHlG0qk1ANBwJ9r/cQLR0bWcMAYot\n", "qMgAwnli+ctYt8RiIiheJeI6HlKG4+FmjWTMTNpzAjH+8rIQqHpZ8VUGhy3ocwOg+ijb4dPg1Yfj\n", "03EgYPVIW9BOmGgCThWwFwYBV7OmMcnGgXTBMxvppVRlbZ2zbGBaTc1O91r04U8dIhnMeD88NLWI\n", "9OGUPnHZBFBlMGMJeJwCxsHDysYelY1hOodRk8DI+Jy8w6hRvQxR9cpSi2LM2CwNyL23GkfduTo4\n", "FJZT7DI8MMgaUkIuFLHc2ZoMNvkOq0/YBoeQHBJvQlVSggiADPZM4kG/4IbW/T89lvsuq0ODvUkv\n", "qIkJlAQycSKUmtF3rD0vEmlfgYHALJkL68//9lbZYMRO3Yi+zb1KamqR1EPRu5/bKFf2Bxv6DsY1\n", "YKomMiXkrdL539jAT6n9YuoZv69FYq5+ZJ37/XzsM/kqX1CzTfZd8K7GPktftDFL9dJcf7LkOQ07\n", "y64MBgCmo3np+8SQGmEsNXDuu8Y7MDHxsWAPCbONLGdjOwJL8otSCvsqFux9jRstzGJLzAa3oCRI\n", "8WAYOPlDghhkmSzS/mCICZ6Q1Zj8nwGqtmCqtUBn6DXp76VyHppBh+42MUaW/0BN2xRgIObMgLek\n", "3RGISgbnt14Ye8xISRYt3wPOrQRRJL0Dv/8CoCAXlFiwbWwGzcD6ayN3vLQSW6lFAJwRGZ/VuPGf\n", "qUX/FmNPATLOI7k7CzWl95RxHpU2yVSlvUaIiUmI6PtCTCg5U2wWTciQmK8uZTwcenxRr4tQXVgZ\n", "FFE2RmDqZEiYXcTrEjD4TRGwStmhGwUwOJUCNxUgsk+GdPmM6AtFalYjq1iTSuQGMbz5BD9YAw0n\n", "4QbI+Pmb5eaG4A2D54tdHs7HodGccwyjABdqnDd4TGwUowCCxEiyjCQuO14vK/7ysuDPLzP+/LLg\n", "L680OHy9rHiamYWxR80crjKSqtX/chzw5TTil9OIXxjIOB16uLHZfgK6dS1N0RTduVDZRHYkEUFA\n", "TSUZFM2sxfJ+PvbR4Xnk+LyxV7fnwTt0O6WUCKK9xUyyga0dGjhGeA0YtgArpnpSi8T8t9n0fz4M\n", "eDps+HQY8HwgpFq29jFn7CHr1mHeIt7czjWoPricJeMqMZPbI208OqYUavKGaXTWvPU4Ba+mSvWB\n", "fYtSGB4eDOeZp1yjjX722S0AvWSrOwsGVZuBgRulU9/9AOSu7ug1B548b+RBrWDPEvB03fDbG9eh\n", "10VZGM/zRpvPrTLCCO+2yoZ44GGOfDgGNRc+KBusMfRMhU30aHB4fQdoiQ+QbFoVNAE3brxJOfVy\n", "3d0Hh49+FNSSZpH9eiZeoEhikjTjK5uRSyz8i3zNOx6nHocx4CAeLrerPl5mcD3iAfmB4+iJQdTR\n", "dZuzmo/vvOTp1tDUICPwCBvS07LmMHgM7JJPtVNMfsUjg7egvHXbek5Eafx45D9NAiIAw0xWWOhG\n", "9R+dIdr+SDTnNDDUreOo2+dKpa9bTxrGRHufCsmeiSGftGZfOc3laa4S268c8yxG5wszdKUWeU4f\n", "EI+wB01qY08MXviplMSgMmMDscGu3Oc+z8TwIxBjx3Xl1IFQJb0ksRWPsE79CE73WvThj/TK1XtB\n", "WGGS3mbUhiomuuZF3vbWMoGmHm9bwGHzmuDjAZ17JKVkYqBE5CTn0eOyeo7irJGfOdVa5EJCt0aV\n", "gTle2sq8RJ6KZFcgkaOZQRdlaNtq9uk7h6HLCP7WT09T3GICYGCMRUoFCYD9gVH5P3JEDWa5FgkD\n", "w2saidNYVfmSRE8BkOtOhd4X8uMxmuiySiztGjjaWZKRqoxEmLk8kvLSuwKq54aRJuDu0ABaAIid\n", "Ih5KezV4fWsAdomTJmZ+U4tUXuSoN1JZ5X8giKFRUULR42Z1WgjZmTuLPRlkNlgRJ+4a3/PObXlP\n", "OIUMJw22tYAt9NJywRgTPrHTP23HxurWv1WzyZSKRuysrP/015pXK/pPx8042ID0nDJJHjp381Ax\n", "AN8UTnX3a+ixss9H5Id6fj84IGE3gvxlpCQuEH98s9zoqZqbs2cARuiR5wZAEIPBBzEaZD0amfg4\n", "1aUiGgIRCtT9+uW647dXAjD++2XGn19m/EVYGJcVL0Ld5jhbAxqmJELxkQGUL8cKYHw5jng8DOin\n", "HpDhwbGOLhKAEhsAQ26Uyxaq1irWGFcA5ITspCh71pl6nMb+n31538//z07Hg7Pojs8N0jx5h2tn\n", "sQYy1ROTuyVUULQdHF7XgNMaMY2BDCBlWybeGH0Hz74Ynw507b/Muza1SvdNtLmX5KQlRHSrRddt\n", "pP2UAcIYfXiJc/dxoGZB0lfV+ZlrgnrC+A7TkHDke4UMrVCjDZv3yAAMCFrkUjelf/Tg/hGg2jlm\n", "hb1z25744agxawMPDl37oDT6WkuJBGjkgo3r+/N1x7cLgxgNI+yrDA6NL4/UIpGRPLA30KfDoIko\n", "nznOtRNDTwGlGjNPbBHLEm+vBXlYM+tDjJsBqkVSiytgQ3T++/nYx/vKCCIPhq6a3PmagCG1aItC\n", "E5ZGkfy8Xg50DZ5Gj9536DoHck0THreB4wGF2E9ejXNflr76J8QqPZD7zoaEmRttZywDqcQ4KyID\n", "ZrBXtrYCtIZYGkkVDzDeYogOY3Rk0p2csk2+Y6KaXP+wUND1pwFV7o1E0qY9kq2x632jPRd3fNl+\n", "kgG9rJygW89SABM5QUH8Q5i6LT5hAmAImCqDg2w+b5LaxqY/47h5eS5NvYNTY2FTzdX3hMB0bXke\n", "aXTiKr0yGc1XMAmagiIDpAwq9/Oxj4CLt2kUTp/JFGdaPQV1WN4bqe2842WiOnTod5XFGTBjAuWG\n", "jaHLjGbjf90CFt9hF3Z1IRam9mLWwG1G5RSGGRfiHRRSxtTnKrmA2FhV02CZlzr2w+l5ZpK6l4vj\n", "nqgQmiqCt6zK3X8YVG17IzHxbBlhBKpUeVvfWf0SM2XH34siUj6j0bAFDbiknwlJSATcfF1qYtEe\n", "843URuvC4NirRGb21g+jmhoXAIUB73WPuGzkB/S61Dr02khsxQ7iBthmsIYiZKvE6I/OvyWdRA0z\n", "pwpmyNAwdBZbsEiJHJ5DytgSsTHE+V20NeIA/xgSppgrKu0spQP0BWb0eAwJ121UVEhAENHlyMM6\n", "isYrFsxbZKoRX0AcJeZs/dAim4+eQ8Y0NOh4lmziUqnDvmMGQMQWeuyRzLlEOvI+Kx0AO+NmAQD/\n", "rhbrO7r2DYBhG2MWuiBP7796r7IZokpaUA57gYl8t3Lzft0iXhembb8sBGA8L/gzDw5/e1vxNDPK\n", "JywM1KHhxFKWz6cBv5xG/Hoe8Sv/86fjgPPRw4z+1lsgSmVK2PZ0Q1tT4yoGpar7Nr0vpLunz+A0\n", "dA2Qdt84fPRjePOp9Ujj87xuHjqXkHOqWeU8NL9tVJyfrzteTjte5w2fOE3H9gnoEmBc9cbwlGB0\n", "Hj0eDwM+H3a8HOmh8sa0PpFDkXQl68+cbYRb+EHHQ715B2LsiXTyJIWh4aKUulVAAaxlH4quutFP\n", "PmEfnFItf1iL9MFtkVHvrd97aP9o4+mcUQCj95Jw0Kn+fBS3bX7fq+4cOiDtKaHspE/Nuca7va5B\n", "Ywx/e1vxl9cZvzEjjLYO9WFdSpWRTL4Cqp9YVvf5RJK2B2al1VjpxryKowwTaz5f5o2lQbLh2BWU\n", "khhXqUUyNKgfwUTSmfv52MeqmSQB7QpmDE0iUVOLQkqsRadn4Mu80wZ+3pRReRg6HD0DDWAPBWNg\n", "HNF2BTSRgfmRI5mv7D22MxuDBgMaHKjHCNpn0DaReoWUC2LMWGPGsaFyA9B+TozcCFi1dfPIsXox\n", "ZcTskBsNez1Z54j8Bz1Re4jpyolwaAGMdlignz/If5etJ6fnWUtSPd16RjLj3GJSM0Flzq30WTxd\n", "CUTVpDZOtlqlR0Gl1U8MqFL0bZtixV4YA8VK34CpzMLIW8CyVgDjedkYIA/V54R/ptYi9kc7+K76\n", "1DGwej8f+wjQLgbDR47UFFln31EsPEm7iEG18rP4wlKm16nH67xThDPL4ryzxADqDAonNDqdkRwm\n", "NtCtIIbHvMuMRt45gcHNkDJMiApOsjUPMzFyA6gmlb9ZY3SWIiAjo6Cosa9zYvppERP9mcWvJxdk\n", "J84Bmcppogh6a40uav+R5U4LYFhL/kLyO9yCGSzfs1U2IwCGzKGlGFhbgzGEAHDlWellreCmLM7E\n", "YLOV3t+ASoOQDdi7ayR24OitWisYfj8zS1fEG+V1fQdgrDuua+CEJFqcSS2q/h9yzXmVMf3R+dfL\n", "Sfr3KDNtoU7D3hgmRYTUbD8DDQ6E8kV14X5bdk4GCBhDD8OUXR0aegdkDxszvuwR8zbUCDzOMV62\n", "WNkYhbZ6ko9+3Q26lbafzloNQBHtUWTPji0mnHbPOb31IRdbg71O9D4dDn3COnTYmNIt8hKRmMgm\n", "NAMoESiFZRTaLNy+pzcbTwiqaNE5oSJ1qnlU93PR3cqwxgYxnYI09PtvIcHxwzamotqqb1cyq/rL\n", "64y/PC/47+cr/vIy47fXBd+uK9Hj96hUS2vAhqJinEceHL+eRvx6JlNRMvXsYcaevTD4gU1VA4gJ\n", "OSTMW8CVzVrfeGAQUGoNkf0w6L0hcxp22B3awYGuv/v52Mf0HYahmko+MiPj1EoZXKxgY+ZIMa5F\n", "LzNTd687ng47Hg87jiPFMVOShWlkJQ7wHbyAeMLEOAqIETWnm+pC0O3lGmJF641lDSTYpqbWomWK\n", "bKTlOPqQZCBS30phCiWbamp9iBmhy4ieX2dqTD3LO3PPbFFM/sPkEmFgkC8He/NYpm3K0CIbz65u\n", "eXp+eDumbZciCjYeGkzWqEkBlF6WgKfLqiDGX1/pz6crDQ4CDom8xvPrViNPltR9OY74woyMx0Pf\n", "JJIIab5UU+M1YFlkWNnxcmVAawkKSO3sY1BQpXRjVw0Dz6PH49jfWWH3A+PFJ8UpO+w0tpH0DvNm\n", "EIWNoTTuStl9mTc8XXs8ThvOE8fgsW5ZDT4BwFbpwkk8aFhi+taAGGtgOUkOKInm5i0kGhisSGvp\n", "lFLZCQ8xYeU61HcyPBjyOVMgowgxRCVmXWfRJzIVjc4idY4o4MUyM8Og8K1YsiiH//7wIP0R0AAY\n", "xqAzBE4IiCIbTt+4/cviSuwnBKgRAGPnHi/ngo1lbVfeRL8sO55Yf/7EQOqFk5G2kFUL3nF/cug7\n", "lfUIoPQwVnnvgWV1Or2IxHeP2Jsh5Wmu0YkqawuSPFBrkW/7ond+BPfzsU/vza0fQmN+fug7XFyE\n", "d5YkHlyL9hCx7E6H5tdlxwsPvsexw+B3knU4ixF1GewM3XOSjtNKSi8bpT2uLD8Qs/6okpECGzKs\n", "iTDN7y89Q2B5G3nZNP4NkL6Jfvdqq1gBzs4ZdNnCuYwuW2RXag0qllhQFgyoViDjj04LYFhmpSiA\n", "IcCqkxmO/5lZGlUJICSsApcyxagKG6S00bfkFdbKn28BDA5AaJYsKiPpayoTPYtkudcAUsZyeh/1\n", "xtKPvTLRoLI+REoS9LPMTV/km+QqMREV89A/Ov/yajUNHY7BVyBjJKT5rBdt0A2AIGC7uKsywi0O\n", "8DUdIOI4RfQhAX2m7b2ztAXtCzBmjKHHF3HQZU+NmeUobSRn5oewDg6LgTW7XjzGGCIkFNkM0gf3\n", "ONGbPnZOL7KQGspMgdKV5AMTPfjOKOMu+vRi1Uk3W7ppsjyo/849IkwMGRro4q+GNUPXcRIADQxi\n", "zKJDAzckQg8zJiJEyv6VtITrTkPbt4uAGCQnERO9r9cNLzOBDJQAUFh7Xh/Snw4DvpwYwHgY8et5\n", "IinJaUB/aGUkjopEZMpkSNg2oiq9sEGr3CyybZDNpzRIoj8/9HVoeBCzrDuIcT/eoeOEnIfmSxhi\n", "U09eFFJ01adiT7T9XGjr9e26kpfClRrPfgxsqse0X1oFAp2DHTxOU1A20utar9+ZQdXW6T5yk7CG\n", "CGs5P9wYnUdSyTUCNvRYxqjGpI4b3qh17ZY2KHXCM02xTxZ7okGCqJQyPFgUVI8NawwyfrwFraCq\n", "pl6z1rNGqtLD2ekGVnx7uu/AC96mhIhcHLaYeftAwMy8UzrD80yu21+vq9K3nxnAkAhc2ZR4S0BU\n", "cbyHAAAgAElEQVTCeezUn+TLcbhJZno89ERlHHxjbAwdGrBFRHlQzxueZko/kQf2Za26T6ndkgJw\n", "UNCsat4fp/v288OfzsH7TgGu03TbPI79rsZzbW80swv8K2//H6YNT3OP87hxqlqHT9KXdGLwSdKm\n", "mspDQ/PrISiYOm+BtdIS/Zy0L9lCogacm3FVWXEDLRvQSj+nRl1AgCBmt6xQNVojBFQwCM6iyzRA\n", "+FxQrGVGSEYxBcXU7/0ZQFV+T2NRmWE8rNyAGTLAyMYTUCA3cp0t/N6LpC0m2kLOewMoCSuiiVMV\n", "zy4BXhzrwA++gkniy/PYsMGOnFJjXPtmJyAmRKZuP1931buLJ4YseBY2cs5NXzSKL097vU13Jsb9\n", "AJ11uo2vUcMs/fQdxt6iDxYhZgRU6f+qTCS6B1ojyKHrdFGKodPUELn3ex1iK1v6uvUc5uBJJh4z\n", "crEoPKNROkqCCbXfAIQ0XhAzzVZbn1UiL5IWZY7lrGAMNTNGWWLOZHTWIrmClKkmUE9EPmGGzdCl\n", "CVJ88XfeV/Pun2kxbrhPqkCFMNRo7rTMvGBGG8Ds/YyQpL8jU8hao6pn0iwx3Lz815TPIF6FVdJW\n", "ZSRVXibpcJIQN/WdShsBcHwtRXFLOs3rUuvei3jGbQHLlm7k/sTCYCld44925B5p+glp278cxHBD\n", "h1NMOO89HtZAlLmlx3nucVp2HBePi2eDu9S434qJ1Vp1NkTdHdSN208eZvCAL4CDiP6AscCmjIeQ\n", "8SubP85buk06ifVhndgoL6aCOUSYlU032+2n/F6sAZo3YpRMPZmuWEsP9BiJ6iNSFaEPdUxjHFTy\n", "kdF3CXt08C4j2IzIjX/OrPfSO+P7W0RYGJWeZH+or5JIItVW2Qpe5OYhbQB6SPP/vkVxuKWt47fr\n", "ir+9ruqB8ZfXBV/faHAQ06rEr1eokqexAhh/Ok3408OE/zpP+NNpxK+nEafjAEw9DQ6+iXRl+nbe\n", "IxYxiWHqrGwbrmsFvyIzWtqb8jjcMoCkQbifD346B9t3mIZODdQeGyDjOHhc+oA1WK1HQVJKttDQ\n", "hsn1+ZFZPoexw6FNsxCpGSeV9IPHw6HHp7XH22nAZRVfDGo45YGdSkYOWdM4lj3BIvBmkQYZqVd7\n", "4CZij2rM653ISmqj0cpLgCr5IK8NYmjIFiDlgmgLrCuwhX04DFDM3+dwG66XLRujRocJmGGYcdE+\n", "sKXKVn39ygwKx7o6jXULor2kB6bUpa8X3kTyxmENJBUUSVvvrdK2yZukpjN9ORIL40Hind/TtxnE\n", "KGvALJnrlxonrckDEuHd1KLeWZULSKSlXmt3EON+nIVT2SebDTOQcRwIkBg6h9XxRlI3bqRFf10C\n", "Xka6Fx6uwibztIV0FgdjYCFJX1ADcvLG6IidyKk6VwZVydOFolMzM1XpcVywmQSz1cY8N6wwuj89\n", "jkPS5DnHQ4uAk1FMzkuTAiDAp7XobNaG3vE/p2LgiuEBAjClsjF+dN6zMKRPssY0W9e6BSXGrdHa\n", "hXILzog54J6q10dKIjOsvm3V8Lma/M4bsezaDaSYLdcFi9SFgZ8lVdroO0sIDIrGSuct4sobTwFy\n", "v3EdelkkiY82rjd90XtAdSKDVxlW7udjHzFZ1IFW/KrYp2DqO/RbxOYSRG1O0c/VbPh1DTjOu/rs\n", "iV2A515o9I5k64VnIvGLEnnT6HHeAubNk+yfaxEN8EDhtJKUCnZkGJPU8yI3M9rObIzRdxi6pJ5i\n", "ANci/veSxqrScC0StJsva+FKQs5ANgbFGGRDNozZfM+S/9FRQJVrjMphrNEeSJY/VSZTAQwCDYyy\n", "3GPWyRRRANVIUkP1kmR2DIUfhJr40rIhHC13Dn2Vlwm54MRAKqV0cuQ317+QaKkk6TQCXMh8Jn5x\n", "Na2tSgqtbdPaxO5AfFgoLfAPr9V//PL+3x3jOwxD4i0Y0RcfZ2rmXkaPt7HD29pV5Dg2JlZbNdR7\n", "XjY8zz2e5w2fZhpKj2uEG2KVIXDcKXIHDBn+kPCZEajrHnHdaWBYJK5VMoJLwcJbBxkcjAlKWRSp\n", "BTlxE4hx3SMexkDGejI8ANpoUGKGGFsRd0duCqItGt1ACLXS5QybmW6UDbJEIL6fH/gKbm8G2bIK\n", "stc1w8mtQSlTJFl7v+4JRSijtkYZruIDwAkAsvH8a+O8/SxpJCGSyzgaHww2NBQJyZ8e+OtMnhiP\n", "xwFOAAwx8wRqCsAWEVZiYMiWQTXorDOV2J7WRHTonBZEvd50eLg/rD/8YcPNvmkiH1lKQEa3O177\n", "DvNG9ShJPQqZNg5spvc07Xi8rs33eYy9IzaGrfGGXLVhORHj06GnB8wy6AZ0CUljgomNEbHxA3uP\n", "GewuVWVnAj7yJmTZI45DxKEn9hVtHqrZk1As5R6lX61t6o029ZoqYgySkYfuTzyp0Q4kMjhYrU1S\n", "k8TDp7psU4MSEtV8Y8Tx34jdEGvuq6RHHppPzRaypoMkTUaywgjzDGiyueqX06hfn44DHg4e09DB\n", "iCdPC6aGCGwBgb1Qvl3XOjiIlGQNWPagbMIbFkZrpnijeb8Dqh/+OAvLnjDqjdAYDh97j6lvjNhS\n", "0xuxZ9jrsuNp9jiPO07jxt9DRt2dMxhJvwDp0iUlqMpKelwmTvxieWZliRYFEEWT3p6cay0KKWMP\n", "CWugTa6kKlljFXSQHkpNznWFaW5Mym3b1+Ta9BdTkLmw/eEGlF+vte1AUv/ZmEZnzssg8QEhwMVg\n", "MwTSiImg9E0iKRaz8bct4sL0aTHVvLKZndRca6r2XDwAHrgefDpUKQltI5sNtqAqOaPEhGWr2vMn\n", "9t145gXPq8itww/6osYPRYyF1Q+qv/dFH/6I9FF8etphlk23J++wBktzWmpmCEkpWfdGsu7UT8OL\n", "vKwAvis6gDtLS1aRvZ8Gj+vom56oppSkXFB4NiFmQsYe6q+vfREDpaGnWU09btr5B9W4ODTJkVyK\n", "KqvUGtjcgKG2/JCN8TPHQIAM1PpjbkETw3XG8O+oLLZUABCDIuSsAIeCNlKPAs1Emt64N+mNscpc\n", "LWS545qErCaAo0klqWae1NOmnBELsCeye2hljRXAaOQrkRJFay2qNgs1yrVeZ/+RnhjwDi55nMaM\n", "hynicQqsP97xOPd4WXYch4Dr5rC7pKCCbj/3yFQVT1uww0bF/8pRVGNXYzkd5GkB5A4meRxDj19C\n", "wrLTQ4f+rCifRutkYA2RNKAx0e9e5OaoaSay+Zz3hMtUP2yJBATEmTurgajQQQHUC1mHBlu3lsbC\n", "mgwLYYL8+Mj/TlsG1E0DUyZVS2UbR1swXbsIXTvRlrUQXd4Zo5FpW0xYmCL2spKU5BtvIL9eqIl/\n", "aY08YwNgsP5bAIxfTiMxMISFcZ7w5TRgOvbEwhAAwxoCMDJtPjM3Bs9X3n5eVx1Y1BslRNo2QB7U\n", "js2yWHvO4MUnpouf70yM++ksS0qYUn0DclFNeVk8mcbGWo/2lBTYe+UB+uHi8TCt6uJ8GBwefVdT\n", "AWR4sPQzR/bGuKwRlxPVtlkox42pnkQtt1GH2CPXIqjkJEQeHPaI0xjV08MzSAoZHhL9HTtLr4R9\n", "JttMoS3WBr8+yCFbAQEdfnf10CCroAWiMaxJlxrU1LQsPkOZjAE3k/ihnTVKtrCMRBIA5gbUfnln\n", "IjVvAXMDYBhInGoFVD9LTToOGu38iSWOvXhhCACVMoOpAVgCXrkGiWmfGvdpLcraYMmWQzYcD+Mt\n", "mPp44BjX+/nYxxmgc+g5Rew0eGWHnccex3HHYekw746jmNnXMdfB4XXZcRw8vg2bmvHV7RkNDz2t\n", "49not0Yc6kZ+Yxo3L3w2MT5PtcGX1CMBMgrAhsBsqBeZpRoS1j5Vzy1nifLNvZQAGSov4U2oHNOw\n", "JtrtpGEKhsHPmunJ/93K3Nq/t+2vCjNniQ1mVDYSbFZmR+aBYovpJkHvysl5lzXiwrV8C0kNUgXU\n", "HJkRpsaqh8oQfZhI3nFiibLvLIwwaGKmmPmdZSRzBVOlHkk/Jmwa6YskUlaH06FKbDWZ6254/uGP\n", "MZWto5KSvpq/HoYO40rMBmJHJI5bZRnDFnFZAl77gGne1EdBDCrFD2MqFJiQUVhtazXR8bDRz5uH\n", "iKUJRCAfC2a3o3DdoN4AARCT4VIKsi5tMrY+Yew6lq4yq4JfbylALPz35kZ2W+r/X94XyDKHbX4t\n", "z0pUW36SjQFhZBhVGkvfJfVF/qJSqv+FTVT0qTeqDIzE74MkkgiouuwCZkQ21ORazvXAgCRtvrOY\n", "Ok5vfM/AGGipI56V4g+ZS0FuWRiLyEh2PLGM7nnZKIRjrUEabS3SuPne3QIYfM2N/5EgRmdp8xkT\n", "UWoPAY8LNZSvh0EpcFceGvaUESLrMGOujesc8DwRfe7TYcDTxBTKwcP2TQNK+gr674OHOWQ8hswf\n", "KunP1yAbB5aTZDFwKaxfrEBGQREgnBvqxEZ/CW9rTTZQxEpoS7m6xa4cLxNSpfi1R6hM9M9/B734\n", "O6fSoep/p9//Nn5ojxmrJRpWygUrNxmiuwqa/xzUg+LpShtPQf1f5mqsKY27NWAWRI1SFQbG/zmP\n", "BGI8kBdGlZE0Zoj0CwA7sTCiUMbZJIviyiS2h1kY3GQZU7WmEg1EGw6iin9q5AL388EPAwroO0zs\n", "kUDN5IDHaSNjtWnHZfW01Y+ZGFXsUXFdHV77HacrDQ5n8dMYySOn7zpM1jANmH8eQdAwvOF4PPSq\n", "QZ+ZjbHuTY1INYpZANAdAmQUFNZ0hihayIg5RBy3jg2t6vZDmnFhWIkXkNDFcwNmALebAqFiJxTx\n", "s/rdQ/XHfPf99DZwNSriJF63Kl3MWE3i7QglVUlcbCq52XqSP891JRr9G3vkvDEItOxRKfcGQM+N\n", "u9QjMRaWeOcvx5G8MKYeo3ryyLRS2Fk0oSwBVzby/HqhNJS/vTWDw7LjutLzpGVhCC33PPU3krbH\n", "A21Bh7uZ3v0Y8vLyDZ36odmSP4wer2OH69Zh6ei+DVyLNhkcfMTLvPP3iymoU2mZNQYnFPTewXBN\n", "qhvQOlBLXLkY4hKgSiBjfjc8KCOjNA13KurTs8akBp/e0nJHVBE0PGRmiKVmiSTb0B8lJd28afjZ\n", "Faj5UR8lpUiHlaKgsM0JJtZeyJl883sH7aES68+JGXFlHfrMW88tRJWVEZYtpolkmicM0U//H3vv\n", "EmrtlpaLPWOM7zYv6/Jf9t5lqkyUY51UiiNSIGJChArYykF7MZQhgoUdG3ZKTqdAqWrZsiUIEiTE\n", "0xDTiAgJgi2FYyASiI2kGgpBott9+y9rrbnm/G7jksZ7GeOba+39//vq3vXPUaxaa69/rTnnmnN+\n", "7xjv8z6XriEQlQcsW558UlpcrkWRzaVvxY9nP+TBziFLSW5VYnvMwmADRWZDn3MNOl81HId5qkWv\n", "/DI0/JTUkE1TJBm2NKTZNQ6HyWKYXRHTLgNbj/3ksOsnmu4fcixnU9nMekoJTeUgSWvWmCU7rK3R\n", "d3R9DXNUPwUdvMSElMQjqAAyRAbG3hEaQ19FjSqtVDpGS2VuUZJL2I/sA+qPMDCOmRj3VaUPKD/3\n", "Lqk73ibYGGECfTdGMlQ1Re2KkeqzDKdGPgcObEJPwEbELNJarkUkuedYU4m2VRZGo345a0mttPk8\n", "RuernIAinkwa8cwDJQl5GGYPX7BTK5bYrmq7kLDk+yRJ9IvWZ1+tnAVqwLYVtqsal2OD23WL6w3/\n", "8exxccumm9OcD/G+0EFf9xO2e2o6nq76/KR3Iy7bCqYuJCXG8P2SrKRaB2JjFB8jUyZnPtCHmN38\n", "pxCUkSFu/TmruKQSNrgtHFwlT9nwOzzqm4wucmogMnBCued5DvERsIs7O3XenMVZO2rTMnJcmiCo\n", "tQ/8WM3C4fYwif6/8CPhN6gYVg1zSds2aCuLdUuvT8nAeON8jdcv1njtfIVHZx0ut12WkVRl40BG\n", "nhhnRAYwnu2nwrRv4siygoXBztuVMejEeV3SUFYEYDxgzfvF6jT9PC2I6yRQV6i6zNh5ILTedYOz\n", "vsaOaY2DGG7y4V2SAa64HmmWNmvRu8rCVQaNTPRrgfQtUFk0nNa0Z4PJ/UQAxDhTnKhKShLHHErz\n", "EBOmxFPQtAQmB1+hnwMOkufNIEZd1CJiNST4kBlo0kCEogYl+b8PQZX8wMWNCUB/ixw05hCZ3k0A\n", "hg9s8ElPFmKMPGWIGD0x3w5T1nnelgDQnBkzhqc7JGmjQ/vlJtekR2cUqUoUbpp+1k3hg0FPFNei\n", "CSPTtp8wC42YaEP24DiafIoXxqpIgSAWSIsHXIc2XQ130qGfloFKYFt+v0h6jsgft32DnWqLAzxP\n", "QDMbY8bN4LA+ZBM+MdcUGSn3DqgdXYcWPAEVj4SuxsVYo183CmKoR08Bdk5JBj7QvV9p3EWDP84C\n", "YmQ2hkREA6VkIykwIMl0wli9rwR9lPPR8e+U4IXcHzFJ8r+HmOBs5EYrFZ4edP6bmLotDcOBB2Py\n", "vMmgSqaeGu18r09Xy0Z6FVYNSZMrS9LkwAOiyUfsx1l15894qPP8lj4LI008OMrJZ1NZrNnoXH15\n", "GEiRKXv9Eo3Daf3wr+NJuSQaEjhK75X96NFXAXOwysaQWiQmtxTl7jRIoHYW1eL6J2AvMRggBrtl\n", "Oko/1RhWIZ+JQszMrQmYUdSiSDYEUqfEM2z2EU2dQYyaQQwZ7gBZEidmvcLI0IjVJJUo16Xl+mBQ\n", "VRmt9y3+NXrcHFtqIkJQXAYhGnib5StSb+UMJfVonAPGwJ/5LDn5wn8I2Ux1VZepIFUexEm8d53j\n", "7kVd4Bm4JrsFlpHwQFsNhg/Z5DzvV/GIhcFxqgV4sVXfFbrfF75PP+gfv/3tb+ONN97AT/7kT+r3\n", "vve97+ErX/kKvvGNb+Ab3/gG/vzP/1z/7Xd+53fw1a9+FV/72tfwF3/xF+9zj1bZGLXE2/FU7EER\n", "bScZ58RooI03JGFjZEO9Z7ejTsRE2jDsR6CfyUXecy6YpcMB2gpYNeg2DR5vW2IGXBAz4I1zMptU\n", "bbRkczty9iZAI79ozw903+8WKR1vX0taByV2vHfT48muZ+M3MqS8Hdn4rZCxeNGcCg2KD/vpY3QP\n", "AlyIdtMz/VF0awNPf2+5CXu2l9SRHu/e9Hjn+sB/U/F3sZHn09ux8MDIAIZjAEOiVB9sGjzc5uf3\n", "jfMVXmcvjEebFm0pIxETRDoVAdMM9BMO+/I15q+laeiJATKJ263J+vMNmzVesvadIhRJTnImxn2n\n", "9YVYn0otAgSOVjaGSEokcvNiQwdMiZ7rykNlzBPQXU8UOqH0ik/M0/2I3X5C6CeSIsyBZFKA+mPI\n", "+/Rik9kBD7etsgMueVIm9VCa+5go6k+y2W+YWiyH2afyeU/Gk89u85ROPCP2ReNPYEbSiYow0qJU\n", "opfhSb7PyrVIMsWzq/8UMvX8wD4XahB1mHDFco2n+yFLONRMc2JJGdG3h6lwvjbZVHjd0lSbgExi\n", "XwgD4+GmxeWGXuNV45ZpJCGDqfNhxnUho3uyG/DkdsDz2yxro8YhTz5ra9E1OTJTGWEsaVMw9TT9\n", "/MKsT60W5VM82tphq3H02fCRms1KTT4rK9pkohHvOa1HojbpuqGPZ+IXU8gM5hARQYOH2rH8kuvg\n", "kpUmEkw26eP0I5lkCogqjfye5ae7fl5M5q7ZlPuGkzM0VWyiA/ekrI9ssp4ZYlAD0I+6SnA2ymBH\n", "p7Y0zZy1JoVck+TvUdPOWf+eq2Kgsxto4NProf0eAIMTGM66gpGlIIaw+Kh5EAmQAEUKVLGEUepg\n", "fn3pNS416LkWmYX/ibB7zsso16Y6gRhfoPVp1iIZAMh7NrMxODGpOBPVzi0CAubCp2cnzHk2376W\n", "5JxF1Ody3873m9+vygIp7ntVU+JibXNaW0pQs12tR1M2t7wtEw3Zs+Ywil9EAdouhtpHvZkMYz5C\n", "LSqPUQqJCOtMmP7CHil6NnlcwjSV4bL+Tfz5tmCD9VNgG4MsBQSW5r5Sj7YFE4Oe78IYWvYaI/Pl\n", "ImyD69EV16TnBYCxkyHzJMkydP+ZhXH0+vJru2Yvp+YlQIwPPDn96q/+Kn7jN34Dv/Irv6LfM8bg\n", "O9/5Dr7zne8sfvYHP/gB/uRP/gQ/+MEP8Oabb+Lnf/7n8Xd/93ew9ggnsQawjig4bcJ2FXA5euzG\n", "Fte6MTTYDQ1vbh6jd2rmQtPPQIf2ZsLz/YBtl2koG6bDVXWFumZvBaVyGzXyM6sGWx/xWN4cc9So\n", "0wXKJ2+40SsjgxrmWdkhMyNe4ga7aSgapuPDiDjvy1RTYn0mpviMc/bKkAZC0LgPvURHxf+TZoSa\n", "hQDnxdAmM0kqF3KUGKBU82EOCyaGTDwlCrLnC14MYpwhpH/DWt4HPO18/bzD62crlZC8drbCo22H\n", "zabNcaolgOEjMHqgnzEeCFyhpqHHk9uemRgDA0KzTl4BdvzWzPVlQ0rNCk0/V6ua2B+n9YVYn0ot\n", "AqDaJwZWKzEcXnFyxbrF1XrKuj41aFt69dDEYcSKD/jrhii75MxPh9FzoS7WLpvhOIuKp3LnqxrD\n", "1PKBnmjAUxC5RyH1SMCAsKBzy8SBNNyO0wFoQthVTiUltRUDO1MY12UDLK1/UUxFI1M2i437QyyZ\n", "FCiAwQ3JHCNcMJhM1J8M0WIuprRUDrL0RTZOSYQS4yqimrLx6oK2nWmpwrDRFJIt+WBoGknXYNPW\n", "cHXFPhi8W4cEzB5BfTBGvLcb8N6ux3u7PgOqh5KRtkxCWdU0vbpcCYhC761Lpo27riYz6tP6QqxP\n", "tRYZANbCcuMgkhIFMroGN93EceIigRV6r/iGWdz0M1b1pFHqkkxWWasJQFGo3Hz3Mpkj0K1CP9cY\n", "5kbPRvlQn6/nhKQH5JiAFKJKxIT1OfmIqY5ofKA6ZCnSdGnom691z2wIiZbW81AUQFVq0Udb+vtS\n", "j2JEMIAxFoY151QTDZyNhQF6US8jx1rP5TmOmA/yPInzvwAYjXNHSWni05WNpDNYXilzJoHqZYog\n", "mv7occ2RqgSa5wHe1YEbB2WkFUaikgDQ8f13RaT4ipqWrnEwL9E4nNbnY316tSgVcgOrje6mrXHW\n", "itRgxm1bY60pRpmN4SOlpfWOzkZt5dDUVtlYlv3/NEq9yZGrEj9cV8wUaCqs54BtW2Gc6yPGvEht\n", "qRpM7NVDrAWGBeSadZbiVINF5Wg4LqwwSSTSPx9Jr/XyI8Zc++7HMD64KglOffwrAqoK+8JHK4+C\n", "hsMJZGp89Bi1v4v5OREjZn2O1GuIlrBDxTNQvHEykED/LYkyTW2VSJAYrBagStg2V5zUdiXJSAUL\n", "Y2BD1sANrZoai6ROk1AaZYNtWHpUVx/IswDwAhDj537u5/AP//AP97wQd1+oP/uzP8O3vvUt1HWN\n", "H/uxH8NP/MRP4G/+5m/wsz/7s3dv2BqgtkB0sKsKF1OD3dji4WbGTd/hhhF6oaGU7sqxmDjc9BNf\n", "XCPTUahAb9hE5qK2sGIS2dTZzYn9MWofcOlbNjuJal6lFCIxiJHHPYqkhPRAKfkMELCs5DBX2NcO\n", "q2ZGx9MSihczi81QNvg5Jt4E8wQi8CYuQIZs2C/atOmxkskMTRZKaqeB9YYV7UCIFpMn07zK5QtD\n", "DhHk30GmVIeZjD0PcyCDwyk/XtGL2QLAOOsqXLJZngAXX7pY4fUL+lrSSKzKSFymbodIDIxhRjhM\n", "uL4d8XRH7I8nu2yk97wwEp18uKN933bVkfadgIwHa0ofsBLjelpfiPWp1aKYCrmZA9h4Udk7TI+7\n", "1sPhnD1tPAEH/RzgxlljolZNzrxuazKSqhyZ9W4BcIdL928Ao+/ZWicHogFVqYce5DOSXwIZKSTE\n", "FPh6z1KwbnZo60ppnHW1BAkgB/OU1KxYwAwx2hTTz7Jx+WCdutSrBCSjLIzSvNOGiEnrId2etVEP\n", "FPR9+jfx+5ijAM4EXIxl3RSqJBjAqIzGhUmU6iXXgdID45Knn5uOfIzUhFUADB8Rxxk7bhbe3Q1a\n", "i4Rtc62Gnl4lhwKirPh1vVg1lIayznXoctXgrKuyF9BpfSHWp1eL2B6Oz0ddkxteNRteNzgfGvag\n", "qig6k6/byEOJw+jRVDO6ntIA2orAvKbKk30x5fVNQuOsPnbSwVNCyratMEw1xnWmIy88w5CnkRNy\n", "0x5iQmJgwxcHbIp1D0oX10hlA037SDzkKcGCxUG8mIimD0nLkCmqLRiqMRn4kDhxifX1zsCEpGbo\n", "8rspgeskJx4wRV2em4mNn8vnRxrBxtFUWaac+loWaSRiotdxvXbOZF08s0N6jtJ9fiuMsGzmecV1\n", "iBhpXs1XyZfHqZmnGBuX6UhnLaWSNDJQOq0vxPq0alEK9MZxYvDJxtTbbjk13w4VDm2tknwZOJB0\n", "PqCfDarRo6kmlnGwpIwNZi3yYEMGvrJ/WoishBNLfL04E0ktEtm/fMzxCMhIuWbI+agOCZPLCY6V\n", "zfIWGeZKvZBaFGNmy8ej25TnW572+6qS1AMUt5/oiFQMeagFImQjIiWDEJOaEJe3HWPp91EMo4Kc\n", "GfNQR5YzxA5tmOUipq1bBjbP2kJG0shrZWH5keeBV8I4e+wkHe4gqZGjsu52PTFC+jmzMKgWWQWn\n", "lP3BHwLirpssYXnR+kgc1t/7vd/DH/3RH+Gnf/qn8bu/+7u4vLzEP//zPy8uhq985St488037/zu\n", "9/7oPyhV95v/5iv45r/+EtpVwIOpZZrPhJu+w673OvmUmK+QZvjA3hhTwG01ozvQtGHNL8ZKNwGK\n", "pdoIiGFMnoAWRp+tD3g4t4xeBdaJ58O2Ovbz4zcGFE/DaGOcA8fM5MZhqB26KaBrPBp3rAOl26EN\n", "MerfIxRGOZD7IFOIuNCo37eOL44oEwzD4IWJhXkN3eZk7eJAI4/Ji9aTN+aBGyrSfJIePefG0+9R\n", "3rklneWqxoNNQyaezL4QH4w3GMC43LSoVzUd3u9Qtz0wzEiHEbd7ahTeuRnw3k2vca7PbkdOxvwA\n", "ACAASURBVMeFF4fnB1JVRwCGxCcyoPJw2+L/fvMZ/sf//e9p8nmaOHzh18epRQDwvT/8S4XGv/lv\n", "voJvfvVLsIXM7cF6xNWmUXYYxaBS85xR8IRh8rh1Fm09oatJ89w1lbry185R8hCAVUowksKTABiD\n", "irXK26bCsG4weDGxYrO7kA/w5RYpQIZc9zIVDdFpCknjI1oGMKR5cMWmrSBDymw3Mejyxd9YbrzA\n", "/QelvGh3jinBwaj3hTViUEUrxogqWvLE4MlsNttjx+2SiSGgRcjghdTpBNJHuoo8cTbFgf3BQqZT\n", "MDBWDfuXOAK8YYRnTgDGNOP2MBcyIZIIvnvDkjqefu7HmVlpy2jpdaF7f7DhjzXJlP72H5/if/jr\n", "vyMm2gnE+MKvj12L/v1fQ2gJ3/zaj+Cb/+p1ZWOQCTrF0d90DXZdIcPwgVlY2Z3+MM64cVb1303F\n", "k8cCOIgpYZsSQuV4GptUk96JHr2rqRYx62MOAd7nw7HWgBmZsoxl8xBjQqgS5mBQe9ZWM6hbJiAB\n", "BUMCWYM+yzmIGxYBULVxeYnXhmjqx4wKPhc5S4kfjhz/Q8ypAQvzvGIyK8CMMFPKpkqeEgUwmN0i\n", "fiMSmyteGGerrAUXHbjj6XiMCSOnJfSzZzNPSiMRX55ntwOe78kn7Kaf0c8ze2EQy80dRaqedY2y\n", "MOj+G/w/bz7H//w3/y+a9nQu+mFYH7cW/fb/8n/C8lb4sz/xOn7qRx/TftbUBZOnxm1HZ6L1VGGY\n", "PeZgELjxDhEqd6UaNKN2DrWVM4gt+hKqGTJkiQCBKJZkbm1dYV1HjG0+Ey0Z84WXoAcNfbgWyZAn\n", "ccPvQ0RwFi7I44hFLUJx0WfJWQlcCCtWgJI8ZP4QgCp3bTEBRh5k+e8pIhquRZZSJwVdkXCJVNYj\n", "MSIN+cwmf7/8qkhIpB6RL09d+F+wkoGZYG1VqUwogQFcJhNMgWN0+xlXPYUtPJeY+ZINNvnlsFvT\n", "kQigX3cVcow4kRD+7q0r/G9/+/8RC+TjyknuW7/+67+O3/7t3wYA/NZv/RZ+8zd/E3/4h39478/K\n", "plGu7/13/wUd2uQKGWfYrsHZ5PFw0y61PUOmTfZT4AxfmnRNPuAwGtxUkyJ1eQLqsquzs+jonZkn\n", "oDJ5bSqY0GDtIx4KBUdQviRPvOySdLgWYxZBHSnykGmQxUF7mAPaiRsYNZGxqhszyBt1iW7NksgS\n", "I0LKOiZ1675v02YUQzZaNbThwz8LWVipkVC5iMrYhYQEgB4UZn4eJE2lnHgKhYt7L/LAqDNlW2Qb\n", "r5116oHxxnmH17YdHrPXSLdqSEZSF0aegSMM+xnpMGG/H/HezYB3b4i2/Q57izy9JQfuXT+hH332\n", "4rCFmWgnDIyG4hPPOjzcdniwbvGf/dQD/Nuf+0+BNflwfP/f//WHvQRO63OyPm4tAoDv/ff/JYOb\n", "oPfgMMPytIzYGF3WcrPe8DB6jJLEk4JOHw6TR9NPOvlsK5pg0KGdN0wDXCZgFQFXUxoBkGA06rDG\n", "lt24JVJMa1IxdSj/rhHZbFSaB5oYWszB0rXMj4EaGasghmAGtI/mxkHjTsWrRzbGowPDBy0BPUJK\n", "MFzDyC9P0gwSrCWnbXv0WEoWhkxjZ0kwYJA3R8PSzZU0xXVdABgCYmwzkFFOP1dM3TYlmBoiAssW\n", "nzOY+t6u15r0ZNfj2X5QRpj4AsUksjo6JJwtQJTC52TV4Gs/9R/j3/7c14AtMdK+/z/9h5d4Vk/r\n", "87g+kVr03/xMjmFmSaVGhIv0YN3gZmhYa1wroFqmC5EePaB2M+oqAxllHRIGeUpAaBJRvI1hRhSn\n", "WDCTaWwDprnR89ExO6tcAoDKVDGxg31ICZU1zPKUGmQ5Tb0ADUDVIWvP+aAuCQTyARR1aFkTj1dK\n", "meiZEhCFFx3lFAZEaxCTRNPjiLad65jKXbgu6jT4qGmwRQPWNU7jKVVGss5mrWetmMGzz4ljkCkm\n", "zNx4jZ5kvddsLJz9wVhGsp/U5LyfSpN1TkcqZHWahlKktP1XX/+P8N/+7L9CtWmApsb3/+T/eP8n\n", "9LQ+1+uTqEX/7r/+KbQVeSBMPuEweab/c/xzV+nk/HasmT1aLdKFCIAEg6qejSH5DOIIxJBoY+lx\n", "uqZi6YJBTJFBVZE/UJ83+eoeH0F63FqPQsAM6DUpwCrVSIOQKG3I2TzUsTAcBV8klqBkSaQ7PVbJ\n", "CvvAmU6x6DESUGMZkCB5HwBm2lqTcqJbPGJwRGaIICGGzMZQkFd6RXmNcRfA2DRizkpAtbAvJMmq\n", "rZm1yy+Q7CsqoZ4CbsVceC8sjOnIzJMGO55rkWEWSMfpSOumxlnb6PtIolX/869+Cb/wjf8E56sG\n", "66bC7/yv/9cHPp8fGsR4/fXX9etf+7Vfwy/8wi8AAL785S/jH//xH/Xf/umf/glf/vKX796Aj+TQ\n", "byzgQI1sF9HMDS75idktTEpIUiLxnSFwxGFMGDwdMtvKoa1HtDVR5tqGJByycT+2Fo2iawVdjink\n", "rqtxIbTtI0mJ6MHlzWDBb3LjlT6YEmcMz5F9JiymKmJ0ARUDGLWzrANlWtARlbpE1GZNEOFmRBuH\n", "5RS2XCklpiWZPGWQUwEsEoixUIVYOPKWVMncuOQJw93kAgEMrQEBRNx4nXHT93DbKgNDPTDOV3h8\n", "ToyIs1UN2zEDo4xSDZGMD/sJw+2IpzcD3t31eOeGjEXfu2EWxl5YGB4DP6Zs4EcHBWkaxLzv8Tab\n", "91mJcq1E+35aX9T1sWsRQMwfSSghRykyHV7VOB9ocn7dtxnEGCb1g9EDO1+rgyfTtaYAMRTEVA14\n", "BgxWkU3UjIFJeWIm01c12/QBc9E4lEv07aMXiVshLyniwmaeflblpm2yxE0P+cjO2EKdFuO7Ut72\n", "IhQjJSCZRPWIm46gLQd4KmJgbdK/QR4DUOjjUwnyCnhBf5ts1Absdm3F7ZqjnReGvp1KyoTKTQCG\n", "RIcZGQchRYoi24/UNDzZkQ/Guzc93r05kLExxxpSCsCszBx6CxmijiujJzNBsoSl8MJw7iNGUZ3W\n", "52V9MrUo0EUgJ3tr0CzYPPSe3vUNdqsGe3F9l+YhZRYpNb2GgUtigtWOGmSn173RwYZEsMo1KO7x\n", "XQFkjL5mWVfWhmdZCUcqm5yoJPMfZWVEmtA6Sw77ViagAMs2sjlf5FqUWBKblJlBIEe+/osG5p6n\n", "VOoDfU1yPAAw1hB8EYGECBsNApsDmlCkFcjfx/ddRjaWzZqci6SOVc5m3Tk3DGddBqPOVg3OOwEw\n", "Mn1a2LEpJswgUHTimPvbgcwRFcBgk+PnbNa800jVHGPoitSZsy4zDC9ZyqJGok2NqrKnM9EPwfok\n", "atEwB21+DRIB8zJBLwC5WwExxhzHPBdSMvHd661HNdC5QwAMrUPFtRZSYiaS0VpkjCFPmYr6u6mh\n", "AaucCbL0/hhIiPDIgw4djsQEmxIxHVKCi0ZZsuZ9QEwBSktzz9Js+OU5GHkJGyMlPhtFOjNFZadJ\n", "VS3+Ir3PpM+XnNWoxi4fizX5bETPn1PVwobtF7bsd7JuiIEhPm76GsQEz94cat48etxwPbo6ECP1\n", "ep/r0F78wWKWkVSWzsMU55qBsPPCtHUtXhjOqpTvRetDgxhvvfUWfuRHfgQA8Kd/+qfqivuLv/iL\n", "+OVf/mV85zvfwZtvvom///u/x8/8zM/cvQEfgMh3ay1QGyBWMF2N9RzwcGzJcXXMTqsHdnue5rCY\n", "SM4+ojekyamdNA5LDSjRpy0eGoBsHBPdvzAANF4x4iKUeqsMLCiiJdNCvgAPR1PQlBLp5E0kzwlr\n", "UXmj6KO7MwFlEKGgTt5rJFOwMD5oxQQYPkiHZGBiAlJEdAkxWj00ENKY7ztF+iyGWkJfn2NkOndc\n", "XKiOQYNG86MrXLD3xOOzTs07X78gAOMRgwjnaz6410ylB7L2fPJAP2G6HfBsxwDGNX/c9HiXTfSu\n", "ePIpmcNApr9uW56erxs82nKs61mn99+tWpjSSPQlL5LT+nyuj12LAOr+BcAQMKN2sG2NzapmRg8l\n", "f5C556SJHlKPBOGnehRQuVn9J+pFHeJNu5gwrmOkGGZ+OM6axdSMtNbZpCkbS9HVmGsSYOaloVxK\n", "iSehNAF1waCyEVY1oBlQzc7e+XfLuLFUfKamJb3v5i2NAwEZMsUEECMSDGwySGk5ZSjj1pDytDUU\n", "k07RpYbiTumgzg0Xg9hbNha+LD0oNgQkiIEeUbfJ/dpZAn5NiIghYp6JVXPTT3h2OzCAQUDqe4Wk\n", "7eowYS8sDM8yEpMn2Gf8GARAERDlct1itapJUlSLnO5Ui77I65OoRWmc6ToQNoY1MByBt5F0m9WM\n", "3brBzdCyC31NUfTMTorREzAR6LBZWY/a2gV46Ww+IGbWJkUxWyf1ia7JupImOBvqTTzkkaGGsg/4\n", "VGEBmAAy206Z0p3vi8BLZ4gqLTJbrUf6hDBnq2BlCIARI9iz7OVeH51+GrlReqCZnZFgEp+KtBYW\n", "dS4l/XtVI3/UNAmYWrGEpK0c1i1NHLOMhOQjZ0XCw6rlKFXeB2TamQJUqrgfPa56YlyIkefTXWZh\n", "7NR0OqqZZ6Uy3yKNZJ39VRapWyKvLZHk0/pCrk+iFvWTJyvByunRSPZY8XY5WxGAcTvWRbpHUINt\n", "8uiiPZyOWRaWGRm1sLCKM3gEpyhyDKq12XzcGqNsgq4mNsbcLn0fdMDCN6mMihgX7ISUqOVIhoFJ\n", "k+C4bzLGkIGmubsjy++X1332TsyMjQ+6evLZiOsREkeEGviU1PkgsrTv+HelDiY+HymocgReCJgq\n", "bDAarFms+NyzFhZGWyuAsWIAoRIAAxIUGYEgCVg5dea6n/B8nxNJbjjx5XYkH4zJU/8ISPpVHjJt\n", "C1B3u6o1jTSz0ciH40Xea8ALQIxvfetb+Ku/+is8efIEP/qjP4rvf//7+Mu//Ev87d/+LYwx+PEf\n", "/3H8wR/8AQDg61//On7pl34JX//611FVFX7/93//fqrS5Hn6ZCmlxBllY9Q+4HJuKQVj8Api3I4e\n", "+ymwoSQV6X6mC2T0EfvJo+4nNCV1ssqpIIJqPTQJVUpAl+g+5fExkNG1ERfrrHMsQYwMZADOMKOC\n", "b3tiCYjqQRMQfYS1RKeqnMUULCobdaMrp6DaNBQoW2kgE/hCAe7fX8ppQ0TixiDCJ4NoDVwyCIYu\n", "Csu0Kfq9gh6lk4ZMk0wp07GAvEkT80XejGKa1yho8NpZhzcuVhqj+nBDEW2NmHgK2h8S5/VQEsl0\n", "oGjKd64PePvqgLeuDnj7huJen97S5HPXT2zmSc+IJKJI03CxpkjXx2edpqA83LY427RwawEwChbI\n", "aX0h1qdSiwBi/yigxfq7ioCMts0pJY82LXZ9jvLcc0qJSL/GOXE9CrAju167wsBO6hBfexFgVgHJ\n", "GSo2cSuvMWJkxJxSUtSEePRnGGNgjYeZQZr1lBsMqR8xkcbSmoi5YGOVplGySupkSe3WCekLrh1q\n", "guRniY2RDDU4Fol158v71QNCTPp1WZfKA4JOPNmYuKsrzZQXCcclAwYCHFxwusO24/gudf+H1npy\n", "3A64GSZcH0oGxoB3bg54d9ezsTDFS+8nj9kHldfVLGk74yZB7l/qkBiJ1m2d90ED6Ij4tD7369Oq\n", "RYfBk4cXjUCJoWWXcs2LVYPduuFpV7vwxZgZXBjZRE2GPM5SGkhdlT5YBQtTmE4tx6Yao6xPI4fP\n", "iuLwpjZTxo89KgBANCHM84CPyzOEgAA2JQRj4KLhZJBlPcjsCfk9+krltSUD40Ps4wJYSAGlgU/S\n", "xLbyfhUILmqf1KTju5SGoWIpmVDvFcBY5UhTAjMqnTq2VU6NSSBGnUdm1EhMpURNP7mlj+ecAqAx\n", "hrPHHHItqpxFV1XKwrhYEah7uc6xrtuuxrom/7iCfvLyT+hp/YuuT6sW7aeZpe9Gjf+VnVVzUkkj\n", "bIwGB2HMz0WKUUyILLH0PmE0AY6vk3zuyMyfGCka1Ws6j2Egg645qUWNc+iaiDlWKm8vk0NkGTbf\n", "MgHwPKQVUBXIAxNraNhCv5MIjDXvL7WR+1CWVsLifl+09GyUEkjsT3Jba6gler+jqspasARR7tQi\n", "fq2cIa+1xmWPo1VdsZTE5QQSAQ9qUjBUjpAUSd8MBno2GuYcn311mCiJpIjNvWU22DiTd5LUImLS\n", "0Nlo3dYLb6CzThJJCMytHafnIcEHvHB9IIjxx3/8x3e+9+1vf/t9f/673/0uvvvd737gHcZxhm0r\n", "oIlAYvoaxxuia7CaAx5ug+b67kd60vrRU4RVIOaDONbHmDBOAbd2RlVorgjtM/y9TJ+8jEATGciQ\n", "CawB4AwMm41MvsYcQjFtSLpT6sHfQilR/Wxg50yjXDYPQEwBFtQ4GMOTB3t3w1adZ1zSukuk7/0W\n", "/RO1QUJNioacuBXAMEZN9fRC5kNBSDHf3z2IoiCxtbPoOEJyy9Fvl2syzny87fCayEc4AeByQ+Z5\n", "KzGMYg8ABM2FQxo4SvV2xLvXPd6+7vHWdY93rg9455rp27cDrvtRDfRiyk3DpqlypOuGAIzHZys8\n", "3pIfxoNNi1aSUBZxrqfG4YuyPo1aBACxn2HlfUkoH9EaagfT1dhMHg82LXbDjIcKqmbDYWkeYvRK\n", "6R5Z5ibO3o6nc5IKAshkj35+biLaOuesA7QJiYP0hqegZPab6ZNSDqzKQ4jdNRmehhTRWlqPWGtp\n", "+VAgyH9J5dbnRpuEYoqBrLl84XMbE6w1ecopgAiDysd7dQmQZAAls0NkLSeeRY59ge4TZZokZHJo\n", "P1sVufaV0wMSSfcIVBpmj9vR4+ow4tntqH4874iMZJenDvtxZtMqekwNO7hvOOHmARsKi6nwgzVF\n", "PK+6JpsaMzPn1Dh8cdanVYt2/YyqsmiNnqgBa2Cd5TpQYbuqcTE0uF0TU1U8EEYfSAobl6lCY4iw\n", "k4c12dTTKWU6TyXFd2bVVqitLb3t6Hd5itb5Cps2LSIOFxiGTDONgfEB1kd4UxiB8s/FBKoHRgw3\n", "k9YvAUFkpeKL42FO5OvmRdNP+T+NljYE3kg9Dkh37/O4YUh3614JpkqMagYwKvUzkcO66L7XTeGB\n", "wc931FpEgO0YiLa9G2aOVCUJybM9GXk+35P+nFLauObz4xNjYalFImu7uDcNxcFYBvJlpH1aX4j1\n", "adWi28Hz+9IwV4CGnxJbLqlb+6nGWedxGGuN9ZWhbpkyFBP5GNIRi85GzhJIWzbtkqboY0JXEYte\n", "tkigZBeQ39hcV4tEoHjPWYHKaIQJESFmWWy+T6pFcvsRciZKd4Y7shYytpRr0steOSWQAQYy6Kv7\n", "mVClmTHehwWrfyufjUQ+KOcjAp8cMy9qTtKr0HEIBkk4JPY2EQDNnm8+JPTsbXI7Eiv5mpNIrvpJ\n", "7R8OCqZGHbSV/krCChMfjGwqKlHgZGpsIS3ii3u0j5RO8nHWYZixbas8EbcoYk8rwDc4nwIeTS2h\n", "e6PnjZp06OOcfRrKCK9+CnBm0uieyoqJlZiTGEXWL1NCGxM9Blcg0M7AMXVzZiM5z8YpAkwoTccY\n", "bR7cQAeDwQZM3qhTrLzRAlMfTSKkLwBK4T42kQGOaIzClnjBZp0W/0dAhuHN2sDoRVkyNqRZkCYh\n", "8gNeghdGAYymyihspmzTpPHxGXlPyEcZX7huK24UuRqFBCQy8kyjR99PeH474t2bHm9fH/AWMzHe\n", "viEjPYoxJJRvmHPecG1pOkQmjMvH8ZoyMVps1g0gaSh1QZn0JxDjVV+3hwlntYMRhlAFqknMxmja\n", "ipMlWjYbnjXal+pRLNJ6spnuMAc4BlZpw5YNObOg9Oe7BuvGqbRBrj8xtFo1DlOotHHI8jX6udJJ\n", "X2iX1gfMhutkCUIU1zvVIqFO5gM9sGQVy7FAf1e///5LaqUAGUnokQlcB6G3qb9TTjZwtxZp7eUN\n", "WuiJclgnAKNR9owc1s8Z8d80RJtunEWlJSDBc6y1GJBdc+b5k1tmYVxTHXrCbLDrIo1kmQDATcNR\n", "tPMjrocP2BOokjqkLIyElxo5nNYP9bpmNqmzlg5m7N1lWQ++biqctTT5vFjPLCehtKSBz0Yzp51F\n", "Bvp9iBghQERmXRkGDMo65FlCKtF2YvSZ+DBfWZKQdj5i3eQpaDa3y3+L6stNgA1GWSJljyzXujQQ\n", "eRq6fF7MPef6l61Dy98pf5rrbEr31qLy59/vfuT8VnFTVTOgqskuHFe4bbN556at2P0/p9ZZBlbo\n", "+TQqTRw8MZJ3PWnPnxd+GFSHRuyGSWPm5VzkCibfht3/L0oAY92wnIUms3XtYBYG66dz0au+dsOk\n", "700kB+csEjhytTqSlXQeh6nBYabBjhh8ivx1FFlJIn8MZwOsmXWAUro+iJ9fiAm+YR8fHv7KOcaw\n", "8XBdObQhYq4d/U4oBrByNgLdx8Q1T6JIccTsLHsvI9d8UXfuwzLKofKHIGLo2WgJZNCjPeZVaA0q\n", "HuR9d0V/p9GBmdQj8cFY1ZUCqyIdWdXZfkGGbfJ4Atci+Xpi43phYZSxqgSkUh0aClUCIDKSXBO3\n", "bU62KYHdNTNBxDuO+mY6v75ofeYgxs1+QtvUqBufD3LWaloIQkTlAx6xechhko3ac8wnSUpUiz5z\n", "5IsPOBiZSlrN/xW3aRlHyoZ9GSK6roFt3ALIMJZccDdtxS742eRT3vUGuVkQyUrlLNzk4azHNBvV\n", "apXuuIl/n+KD0kILfnyN6M8DL71Zl0BGYsAEycAcXxjyOeWL4w6qx4cdYbbIVHjNHhhnXW4UHm47\n", "nTg+4hSQyzU1DuumQl2VKH+U0Q/C5HFgd1uZeL51dcBbV3u8fX2gFABuHG6GCQdx3UbRNBTu/yJl\n", "IU+OjlJJNh3cuuU0FAZSYHIaymm90uvqMKHliRjtqrWcwAlkbSkt5HLVYL9lqRszxA4qKcneGLJh\n", "zz6gNwbOTFyD7mc6iPHmFDglgyPGxMjXWquHhnVTYV5FTeWQjUKWTECzaWeAtUYB3wWYgbxBGt2o\n", "U3Fb9HkJMhRfv8RzWwIZ5W0C9zcO71fnjgEacdkWGVmOocyxhef6cXeTtJacwWniQ49v5Ci4HZtV\n", "PduTlIR8MHr2weBkpGFaJABI00CU/5yMJACGeGJcrBqsWwZTJc5VRuGTf4ln9LR+mNd1P6o3wtaQ\n", "x4TUIudMNmhc1dhPDcnaBq96dJW3haCeYaJpNlNQOdsi0hQ5eSgwDXzd5phPZw1LapnObQ3q2mIV\n", "HHyolhPQBYghrNPMXp0D14IjVkbZQJT1CDgCU+8pOi8NYBx9saSd33/773fbJV3bOjHNsyqzXcnE\n", "UczrOAFg02bdeS1TZuTpc2DZnQ+RZSTMwmDa9nNmhwmQejPMKmsU9oZoz7tGWBhk4Hm5anG5Ilnv\n", "Oce6Uk2UxDyjZzN/qkWv/Lpmn0HHTPUOWfIlDMhVMVk/TB791BArrDAkL/0LU6LGdJhR1KHCny+x\n", "oXiQlMQKHftjSORwBi/zWaCtLEJ0el9Sr8qVfQgjPPdeOWFpea2XtUJux3xAofkQ+MWd30mpkM7d\n", "U+BedNvSQ8rr4lSJwMbyRwCGGHd2NdUqAVLL59fHhIDsgzb5yAmhXkM3bnqqSzcssd7LHiTx22Cm\n", "vKbKUB3carw0DZzkbKZponxIFonQ+BI92mcOYjw/TNh2Neq2Ik2wNA82Nw0IEe0c8Gju0M8Bh5EA\n", "jYGjVicfSSPOU8Zx5s+eqJPOToUOfamvVNf7GHEREja+QlVGfYImh41j5Kgw+lQaklAmC3qmghmW\n", "GBmDD3oooPs82rTlwhEa0wuetw+1WS82/Q93YZQbNCWrGJ12rptaDX3OVxxduM3O/w+3HS7XLdO2\n", "WXdeFdGFPgKgJJJ58tiNHtfFxPPt6x5vXe3x1hUZer53Q43DTc90ST6UWZOnnhernETy2hlJWcRY\n", "9NG2Rb1hFkZT0LcZRDk1Dqf1dD9g1Tg8rC2cgG21A2D0a8fT9f1EfhgCYvRzBlYnn8GFmWm94+zV\n", "HdpKlCDfrzYPYpbnIzZdQFeTV0M+vKcCzY6YvMPcLqegQjVk9rm6fjtrMHhqXkoGxzGra9lE0Lpv\n", "0/44m/Xxf7wMMCvPldRxSXhqxfW/zq7aW2ZhnK9ogzzvamx56rkwi+Kp58w095jI/X9Q9/8JV1yT\n", "yMSzx3s7onCLqXDPk0+pRdI0lGkkD9mPh1gYjbLSbFuzBwuzMEIiT6DxVIte9fV8P6GtKo5CNVgD\n", "zMYwcIaAu3UtyQANLtcy3MlMjJEjmWmAAiTWpE8hwExZ7lGOFlPKjfQcBVDNEjeZGkKBDPIca+tY\n", "sMMqur9EEKkBWDILGBO0NvmQYE3J4LhbAxYNxUcpOh+w7ru5l72PJZgqaU+GAVWHjg/rq5qd/9tc\n", "n1bSOFTldFnYYEJzZxPEOeDA9WjH8d5Xh4m8ePZkKHwjCQCc2qfyWmfICJbPauerGpcr8iy7ZCD1\n", "rGuw4cdJew1T5HxCZOO+03q11/VhQu2Y2s+2FbUlNobl3kCA+01L+28/S1pSHjTPLIEl2WYq2GEB\n", "UobKM5HGw6fEkepRvRokySRxnVHpBCcB+cohhIgY3YKNARA3naA6AxMCjLEwHP8s/Rk9hvvXJ1yG\n", "PvZtL89GmYEhaVQtD3k6BjAEvJA6JPKRMgVEmKliyCoSoJGNzg8TyUhI3jax2f2kJINxDsq2MwYK\n", "7ko9lCSSM65BW4mWrsvzGRu88mt/GOcXPhefOYjxbD/grKvQtjXa0p3d8OfKAk0Nuwo4mwIeTUFZ\n", "GP3sMUysufJBqUExzjl2dQ4wmHNKGQCUSF+iw7w0DtO6waYNqguUeu4KtFE3atalKzrHG5q1NCkR\n", "l/zKebjJYPIR1jKbwxLd6b5NG/hkL5KPelGozwczTGS6IB4YojmXaecDddvnQ3pX46wjGmXXZEoq\n", "j5yRUkQM9BrtxhnX+wlP9wObeZLu/K3nPd6+OeC9XY9ntwOu+6nwwUjsmGyxbpzSWqGXlgAAIABJ\n", "REFU/B9tO7x+3uG184KFITKSriET11J/HgI1DsOLL5DT+uFez24HkhnUDtvKEeBGmoWcVtJUWK1q\n", "XEwt9puAw0hykoHr0cigqiaD8EYdEjD4AIyFTrxAKylClCILJx8x+hqbNqKrLSrnqKDz7VmT2Ued\n", "rzA1EjV6ZDwsEw6RulmDkWVuNhgy7uXbvY+BJevT2LRf9jblKRLpiDQMeeJJspBVQ4f1TUsO1+dd\n", "rcadZFpFG6Qg/EKPn0OAjzT1nFj6sx8pjYSaBXL+f7IjCcmz/YDnB5448LRBmoaKm4ZtYZz3cNup\n", "Hw8lknQ4X7Vou2MzTwZTR4/YT5/CM35aX6T1bD9kmQG/X1sAhkHNumRjdDX6qdEDpIAZow5dxIdC\n", "TMKBKUTYmajc5RImhmf57OQjprbCyleaEiBARlKaMMeIVg6rJkf9CYNMhKsGksZGzDBnIifJJvb2\n", "ydPVT7NR+DhLwAuhazvDzYI1qJiOLZPNElhdtxXWdaV69KZyKukBqBmbEeGFth3pTHqYiV1Dbv+T\n", "AqtXTOG+6SeNMJwEwAAnIwltm+vR+Yp8eC7E2JiZaau2QlM7OMd7UkxIDGDs+tO56FVf14dpkapm\n", "YJBqGpAA2VBfkou2EzEZ+xX584zco4m0noYtOdFoDgFmzkz0cqAibAoyPneYfYWmtqgtpyeBagbF\n", "CBuV69ZVQhMreGWGOe7VyLBdQRMLGB9hDRlHxkTMg1gUoc9zLQKgAI7YGoh9Ql1EOzcVDVdoCM3f\n", "Y9+JpvCKFDZYYDYYUpZySLzzYaSgjR2nhh4DGNOcUzpFqaBsnTbLSCRaetvW2LCcra1twUBmc9eY\n", "/cletD5zEOPp7aAITN042Jq16NIwOEsHvVCj9gEPfGCdVY7wGTw3Dj7Ch0CRW9I4hIQBPlMns3Md\n", "AL5AdLOmi+181WDT1kSt498LDONVx2CGTD8LQysDuqjlQ4xVhjnAzQGzNZgD+VSEVEYg/steLLo5\n", "g2iRtDnnSUtXC5LHrv9tnnaWmvPLNVEUN11mX1Ssa/KMdqYUOC4s4HYkTdXzPaWRSIThO9c93r5h\n", "6jZv2vuRXnPJPa8dARhC2360bVVC8vrZGq+fr/D4rMPFpoMVGYl6n4CahjkCg4c/bdav/HqyG7Fu\n", "aj1ktlIvmipTGyoHW5Op3uXU4DC12E9es9HFzGr2Wc+pcckhYTQRdpxzGUrHmzVRL4URsGmXhm9E\n", "w0wKUFA9cvCxWkRBSzGRA3dOH+EGwhrMnkw1o4lLOuXnoInIzYJ48VimjJIOt3HL6YIY5xG4ShPq\n", "0rSqqzP7AjBKjZwhNhS0l6jO8zApZfvpfsQzATD2E2/Ys2rPDdg8r6JD3HknAEarpsYPNy0ebFtc\n", "rIlWrtHSxsqLCkxkbNyfQIxXfj3bT7nZZQ+dBKBN+bqgJB6nk62LqTmqQyQnKaOfk88O/uOc6bnS\n", "TEvakRiCzixJGZuIFQOqZeReZMG4nhd48ufr0mCPbnvp1yPadAMbIzyDqjGJ3v3zBWaUzAtjxdgw\n", "09hF1tYVMpJVI/Rtpm03ErGdjVUTCDiaOb0lJRCY7QlQFfO8m37WlKTrw4RrBjXEI06YqQY8dCsA\n", "jPMVeV884HPag4W0zqGtK2KDwFBcY4xqSH1zqkWv/LrqlyCGpPfUjuKf5T3XagR0hX6qqT9T78Kg\n", "bAqqC54GmYki16dwlw0t4ISmhQWHqYnoQoWmipTiY+Vnc0KIBCaIj1isnJp40s9JG2iIGQYDz4wM\n", "T/nvMCnf5gcNeP4l1gK84GGYK9j/lbWcRJLjVFtOPiLfi2zeWdncFydkQ+EQASQoyDRJPWKgQj3h\n", "xhm3/bxgYAiYCogpfY5T3bQ1y0iaOwbHK/GC48NxYNB9Yn+y3UsMmj9zEOPJblCzo66huBdUtkgH\n", "YFkJp5V0PuDhHPjiCExVKjVXBAqEBPQFgieUuLJxAIqLI9L0dOQX6rwLWLWVxl1BpqAmszLk8JCn\n", "HHzbou2ydz05nDUYfYTzAd4m+GhyJJA2EEt696e5+DrmhqiYLlijNNaW6ZEr0Xe2VZHryxnjYpq3\n", "yrTtri4MwQCV+4ABpoHfmDc9NwsMYrzLMaqiP5cIw9uB6JJCf684GUX8OAjAIPnI6+drjXV9sO3Q\n", "bBoGMBynkYBlJAEYZ8R+wn4/fgbP+Gl9nteTXU+SA56kPXL5+kfFkavOwDQO7UwpOP3UUtMwBZaT\n", "RE4HiAU1OKk+0IeI4eh+S5CD4qvo50cfMM4ZDKzdMZCR0wKkJok2XWKaZam8hDctx9ISy6ZNpQHx\n", "sTnfZ7WBl5tzBlyQpwvigSEbMtMixaCKzPMo7k2kI9k0L8dY02SBIq8jy0mmsGwYrg4jnu8nBi9G\n", "XB1GNa4S7bnknmcjT6Zsb0haJ95AjzmRhBhqDckn6zKdCVqLpn7G1f7UOLzq69ntoGZrshfD0HVZ\n", "Ozb5NIYj82i6NXQ1+nWjpucyAZ18LADVonlgnbFcd5qIxtM3YpsGzKEhdliTH4/o48vmQZioUo98\n", "rAqgAygnPYYbCGsBGwwsIryFSl+OwQzgs28kcj3K56OyhpJHWP5oawIxusap1nzVZOlIwwkB5H+R\n", "45wnE2FYYyzAkfjy7EdPcd5ioNfPmkJSAhhi5ClNgwybzlcZxBAJyfm6wRkP60iymJlpkdk3+9Hj\n", "ZphxdQIxXvl1fZjQOvJukWQ1gI7U4ltgjVEzW0lPGnzNfRoz3UOCD0H9ASPLRMT/YsZdIEPPRuyL\n", "MQfy1Gg0ArSUlog3WMrGls6iigl1lRCTy4agxX0QoAqYEGFMgg1QNplJHOv6Gfdm9y0BUoFlPZJQ\n", "CTojWdRVYXauAIZTWQn9Oz93DF4K40LYclLXhYExzhSpehg9pYUOkha6BDDmEsAwNGjujhPjio9N\n", "l89qAvAam2uRpMTtRmJ7vGh99iDGbQYx1i3Rgp2AGKWspHZAV8GGBufcJCiQwZv05ANmBQToDddz\n", "esUsKB8rCCiTV7LNIzwzOcaZNIjDFBSlblifIzQbonObTJ+sK/g2ak56klFmcRAnYGDmzzQFnXyA\n", "C6xPN5mCKY9dKJvAJ3vRlI0CIZHLdJXKco68y5nC4iar0041zmNTFnGV1U2xnByz/i2yQzqj/Ac1\n", "qiIA4+ntqJpzii9cas+HycMza6VyBqvG4awlI89H22zi+cb5Cm+wnOTRWYfNpoVZHcUYRpl8koxk\n", "PpC+9LRe7fX0dlyAGE1lcSkU24Qcx+ssXCNNK0vcFMQIxeRBjIDjonmYJTMbdLsycSQNKLk/TyHw\n", "5hGKIm9z1FkS0yqeylqZBtI1q4wM0J0YFMZPEASfzT59JJCDfydPIaAGxPxQP/FVHiaWrBEoXVsO\n", "I5IL39T5sLQq2GFilieNAwE/Rs3qJEI1Jbr0U2IAm6nTt+Os5nnXhxHPmbr9/EDUbZ18MoCRkJsG\n", "MvKscbHiFJJNpz4Y4g90vmqw6ioYBTCQaxHLSG44deC0Xu31bD9iJaABg3CmpHJbNssUT5iGDCPP\n", "+fwyzDSQmeagTa4wR1OC+nOFkDBSEDutlNmlecBD07DVLJ4ylqeg0vxGTUkXJipdrxG+smijY2Ai\n", "ad0zlMvG8hLWqAfAmoRgch2KUh+PaBmfViOxrEdGWS/iLSTMWpW1OWqmZNooUpKOAY2GX79a0vGU\n", "Mp9YUiwMjDx0EwCDJp4eu2FSEz0BNGjP8RpfCVAtqhnU2jQVJzGJ6XqLSwYzzlcNtoU/kBj5Ccje\n", "z8yQPUync9Fp4Wo/ouGEi7pIVksgObe8pzOQUWHd0qBynGs9D00hwPt66d+VgDmK0SexIATIEHBD\n", "QA+Jfp5DhS7Egk1QejksAQc1ALcW0SXE6BRYlbRHy4Q0auAj1aKYEJiRESMYQKbmvjTY+LQBDVN8\n", "IcmSUo+EceJcBjEUVK0yO4z+mz8z0OGMZXsFOXcmtiikv0hZwUGGaczCGLkujTN/HRQ0Fwk1Pe9Q\n", "Vp6cz7ZttYxTZSnJmusQDb2JmRoiewIxoEoxrp9DEOPpbsC2ycaPq7rCw9ot2RiSWFJXQBfhQsRD\n", "n1kY4xyznCSKmy1LPQAMU1BEiS6OTA/SWEOfMBZNQz97XMwN59WSk33FF0nUi61wxK0dVj7Ch4qZ\n", "IEt5iaSiCCW64o/JR8yWpqE+RAQDRI7VounFsnv4OBfMErxYAizSBC3jeKgYtWwAI9pOogMVmb5N\n", "dpRti6ZBpwysy02AOm33LCO55ibh6X7E0x3Fpz7hyedznn7eDiQfEgDDWUObtAAYm5YNPNcMYqzx\n", "2vkKj7cdLjYt7LrOaSTCmRUDvWFGOky4YgDltF7t9d6u18ZYpmeVNTiTnQMoudxo2wpnvsYwNwqq\n", "ltnopOPM2k9AaL8J3kcMR3WIANfEoGqWlGznGuvGUy3i6FW5oGNMSDFp0y8b1xwiuujuyN2E/mlM\n", "0KmiMyRxOwZUTUyI5m4T8Ult3HeZFzm9QBhhcgAheiT9beT8n43zJJVEtZ7Fhm3Z9T/x1CekACCw\n", "3pLr0YK2PTGIManu/Jpjw4imHxcARltZrBuqhxfrBg85lenRGftgbNkriA2s6roCmIbLzqrAHIBh\n", "ws1hIvnKCcR45dfz/UhAnMvGa2qsCaCtrErKKmuUkbTtagIxCi36Io5ZgYyEOYpnTwKHvWdpK59z\n", "hAI++RobPh+tmnwwlvMN7ffL+Hm6dg2Cs/A8CU1pyRIThpjl25lDhAGBqiECNhFbNfLPCjNDnodP\n", "at0HphpDySpiJiyePKVPGDUNVI/E1FPYq1KzpMkSFl2eQEeAdfgCbk+BANV+DtiPbB7NrAthX+wn\n", "j0EADKlFBqjlfcCpNWddrRISiVMlAIM8gtrKwrEvhzSWgy8kvv1puHNaEvfsVH5QyWAHCSmR+TAB\n", "k/m66GqHTVNhbANGX2fvQp84yjwpYzR5Gm5KzUkMZIinjkjS5igGoWRq3rIZrfhclbHwMcYMZKDw\n", "jXAGdbIKqMq5KCYAFV2PAIGp1pDELRjAcBhDNIXxZ8Ho+KTBjA+qR/q32Oxl4UT67wo/DAVQieHg\n", "nNVaZkw+e/qUEAP5E9HfxRYLysIImkhymIQhRsOcYQoYZ485Zk82y/2kRLpKOtOZppE02K44Yrqp\n", "0FWS0CRMWXpfEDs2YDdMuGE/oBetzxzEeG830AFUnZsd2sZh7SyM0LhRZ4+MugK6hGaOeMTAxVQc\n", "+Gcxj4lLNE58FCTaJ6VpgXyLnER1P/yCbTsCMoTW6SS1JIEnetw8mMKhO0bMMVO6kUi/DmTZhkwa\n", "rU4dTXHBkBwmRtGc8h3yp49ysWQaEor7Y5q2MbBanKwWBXkDShLJuph2lk7/3R2KqUFkjStSwmgC\n", "0ySJ6ZKNqiaddD7bU975sz1p0K8PI677SQEMmTg7aziPuuI41xaPz1Z4jc08v3SxwusXlEbycNuh\n", "WjdA2xADwzELQ5JIegIwdkX6wGm92oumn1UROeVU97yyhlI6apaVWAsUUZrCwBAtukrcpB7FfACf\n", "Q1BzvSgyv5SncSHKBhJ1okoFPyhDxBmr17RMVHXTtjQRqaNDU8jVSn06ILXAL8zqTCBqcwR0845I\n", "iMi54R8XzDgGL+T+rSGNa8m+0OlCRSlRQo2UulPGgzWs9RSaJEAUUx8Tkg+whk4fYnAoIJFknotB\n", "FWnPZ9wMI3Y9aT8PzLJZMDCcxbrmrPMVgRUSpfp42+HRhvwwKAWgRityNjUgYB+MccYtJw6catFp\n", "AVSLxHRNpvji7QUAKVaoKgsxHq8dga+bJmDoagzeLwBVSknK0teUAMzFFDRQJDQABRm8Tj8DPCed\n", "jE3EMDuWiwbUlTyufCiWBgEwsNbC2YjaWYQYUcesTwcy4MEjItqig4GJBGYoNTmJX0cBX3xCoOr7\n", "DXhKia2ARc4VsraKPELaSs5MfH5yEm3ITYPUIpSa84SZvydTTxnKScOwH2dNv7odPPpp1snn5OOi\n", "aVAGRltlw/V1g4t1SyyMBYDhNNrVsj9QSmwkytGJz/cTnu1OgOppCYjB033eXw3/LyWo31RKYNPh\n", "YgJf9mghMls+Gw0T6OkBnxhMLaQlyIxQGh5L3CqxMaYQCTD0BchbAhnMMEgohrYmM86TM4jJ8rnJ\n", "0nCT+QmBzwqABVLUmQMif6voyz5JUPUYvACg9UMBVUs9ZzYWljhVqz1czWbDtSUfscpkj0aAJP50\n", "biTAZ/GcRQGuI0beR/qJ/E0OU8AwLYM1SgBDBuJNbdUfRZj729URA6OtCaivmbmPAtANCf1EQK5E\n", "uF5/HkGMZ7ejTtEkeqptqHFoVVJis49B5YA6AqsG6xDxOBQABhttKspXoP0ppUypDBEDPxdiYBVi\n", "zJt0gTqdrzzOWkKMuqZSJFLp3LzRU256noSSsVWWmAh9SVY+uAdkt27evE1kKlOCSTwNhV4uHxrI\n", "WDQoKGioNlORFm62bAgjRlRC1161YlZVKVVSwQu+zQh6fidD2k7Sfco0J+ibUvSdojt/fhjx/Ja8\n", "L66LrOFjAKNj3fnFusHDDZnmvXbe4UuXa3zpYr1II+kkjUQaB4BGOz4A0wz0E3puGshQ9MTEeNXX\n", "091QNMZV8f4m+mSXQEpm8TKwBhUX6nFuChCDp6BFMoAytABgIpAiJcD7iB68WUNMQMlMLyPhHv0s\n", "5keVUsyzyRanm2iDQhVCzK1qZwtad0JCVTAiKxgE3vwlbgwIJhV1KCqYIdv1R92472NfGN2cy0MG\n", "xxa6zMAQcLURIEO/Rz8jNc3I88lykeSTHm4iTxlmHzCwjISahaw93w1Ug3ZjmXkeFlPPxpGEZMOy\n", "ugebRgGMR1tKJXnIaU1nrPt0FRtX08gJ8AFx9DgwbVtSUE616LSu9iPrmPNETQBVeX93iZhiSYAM\n", "9kLYdgGjb1iLzpHPPLWXFKMoJ4p5OQUd51D4YvDZKEadzI0+YNVUGH3p12G14ReKtk5ZUypYnxaV\n", "S6iTNA9YDJsSwJPQCDBIK/RmbSDotKXnoY/bQJQDnqXU7q7jf+kXVk48y49KACebZXFSkyle0sBG\n", "umc6Q5Kp8OyzTFrM8w4jgauHiajbvUgVQ7wz9ZSkmg1PPMVkXQzXz3kKuu0opalyFo7PZ57ZNj1H\n", "uV4fJjw/ECP22YmJ8cqvXT+z/4RTOUmZrpaQ0CRHjCy+3ivH3iy1w9hWzMYoY5iz4Xk2FA963hdG\n", "RuLbjwX4QbUsYvIVpjrq/l/xIFWafgAFE5VuCeBzhzWwka7v5CxiiqgSARYpidCCmnuTLAJoqmx4\n", "mBX1X/kZ+ITZYe/HvjAGqIxdyv+5f6uc+C+aLPfjs2vxYulz4lNCOPq+ANdSj0Yf2O9NQjWYfSGJ\n", "MyWAgcIz8sgHo5SRCANjVaRvyYBMJNijjzrsvh44kenw4lr02ctJ9gPH4xUgBlMoH7MXBU2t6gxk\n", "1A6ICdbXOPMBj8XYM+QLJCxok4KazQpkzCEiTcV0MqbFJj0y8nQYPQ4rQo1Wbaa9VGzMBGTdqGiB\n", "BCAQQGAObkGdKoEVoXbT7wHGEJ3JyOUhV8RRA/EyQMYLqdoFgFFqqMQARlgY+lHl6XTNr42AFymJ\n", "WZ4BEk2f5eHL6zLwxizaTqFpi2xEDKtuWe85zrmgVVaM8ypcrBjAYA+ML12s8cb5igGMFR5tyQeD\n", "AIwqy5JiUvM89DOm/YhnbCT6zk2Pd29OE4dXfT0/jFnXrFNQo+91awxaAVOFk+coumrb1Vz0s59F\n", "GcXsY7ElCyODmwcfIvqU61WpR5x9Nhzu2xobZmMcAxmCYguAC2QKZY7dSqgrx0wvW1Apk9YT43nj\n", "LrZokxi0SR8PyDhuGI5rktWpQgZfykZBqPU6aajs4rURQCdHFJJB18yH9ZhIQjKFqIDToQQxhgm7\n", "wWM/TNw8+IVxXjn1pChVqkeXmxYPN+TB8/iMgAwBMCTmtakd4MxCRpImj4GnDE9vR7y3y6bGp/Vq\n", "r+t+UiM21X67JeshpYSmcvq+1/S0usK2DZiUxi0pJfmsEhPJ0FJKwBGde/IRKXk9HyljVadzgePw\n", "stRFJRP8+FNCTl9LOWg1T0MtnE08EaWmIUqfkQAgwvAUFJYYYbCASYYPzXdZGR8FUH2/eiRfLyUk\n", "2S+sYrmayGddAXIYBmZpqkxTXQOLGOOi8YuRnneZVA9FTRJPDPFbGph9Mb8PgFEaeZLJepaQXKwb\n", "nK1qNvKUfQMs8SUfpnGO2LPE9zkzYoUhe1qv9toNkzbJdB7K73MASCCfi6Zy+j1nhTkZsQrVnR7N\n", "BwElop5DEig9Sd7flLIWc+OttSgyg56GozLgqJ3TJl7MPpGkFjEblv8mMbB01iCm/DklOfkQY0GA\n", "1WTpDBRTUjAVIOk/DUg+eh2SewOOANUjAEPOOAJg5Mj5XHscszKshQLeKGqOeF+kVNYi6JBNzp0T\n", "nzsFxMifKVZefk6YcgaA4yCIrnZYtRU2nZitZymJRN7rMM45BZ1I1kIMWfEoE3mvSHtftD5zEOPq\n", "MJGbc2GIlKcPZKqXY1ErPgQaaiK6GlWMuAhRkwCkWRBKtsYG6ttqxsgXiehAIyPkvsjCHQtJyWFs\n", "sO1meuI57lB0jvImKLOMkzYQtFkLrbDhaWijOnWipRfs7OICAxi5AApQMJoPCWSU005BH839FKSy\n", "SWjLqaccoiQajONXLU8SxHAHXpy2ZeIpG3RQI0+JL9z1BGBc96QDv+Hp5+3g71AlS+d/BTC2HV4/\n", "W+GNizV/kKHn47MO55sWVo08GQRLieNUyQfD70c8Z9r2u9e9JqKc1qu9RPtZNg8iT3B8qL00QNMk\n", "AlP5ve6cQ9dEbNu6kLdFpXEriImjCNOpBDISkMKSxh3FqT5inCv0c0CvxpVssHdUi4SiWTJAkARv\n", "yQBBcJbrlkXtMoMjOYPEfEmtLxFIFhBKWFmHXhbIuK9hEBaaHDoWG7Ma5xVTBgaUFLiQpgE5Hiyk\n", "rDf3NsF6ATBIcjMHMRy7a1S1H2fsB3LflphKiYQDCgBDGRhNwcBo8YjBjIcbkpZQXDdJ7qyz9CwI\n", "N3YOGEZKQXmqbDBiYZyYGKd1O8yZws3XuJO9V8A6AOuUWJNOB1al8jKVe+Q6JOcj8q2QoYpct34B\n", "ZBCjKyibiZKT6OA6sR59aiJan0HFhr16BAQAsiwlFtM6AIDB4jAek0GIdAAnlgV/JMBaS0gA15+A\n", "BGsNfcsQkCGy3g/TQNytR2VNygCGtXnq6eR1UMAiNw8liMqVEZH19CkQ8CIPUtgn+flkEIPBin6m\n", "QzyBF0tvE5XXlAyMpsK2WcpIHqxzalxuHFz2D2AZSWQj6cPklR0r4MXTW4qWPq1Xe92OHpWbaP8V\n", "U8iCRQlk2Yd4BwLZ9LqrHOamUhBUmBiBjc7piJK0FpXn/5ASEAICmLkVof2djxFT5dBWzMbg2NXy\n", "msznogyELDzCkGX9WpMSkKyBSxbJxHz2EUxVsdUlkPFR6hDw4QCMstZYkz0uFt+3+XWhP17qOIAU\n", "Ee95XrInW5ZDS92hGhQXgHj2ebsHwOCk0TOOu88MDPJQXDUVewhZJjUzSw3AzGkk+2HGzUBmnlf7\n", "8fPLxNj10yICRoEMZmPUzuLM2PzqghsHZ6iJaGt0IeEhH05neYL5IpFpBZIp3lVHQEaKiNHzoD5H\n", "ygxFxNXZWGPbepWVlNPAkqYs0X2iQYcRH4zSPTYiRAvv6MBdK2NE3G8ZDUwGDqCLx4AvoLS4ON6v\n", "eTDH/11epMXm7LgZEKBFo3eKiB6lKJk88YVh4CYRahZTggtxQW0nn5Gc9iL6ztJh+4azhoV90c9E\n", "qxS2ykJCssp07dfP13j9Yo0vSRLJ2QqPzjo82Lao1wxgiJEnQboEYPQz4n7Eze2AJzfMwtj1CmSc\n", "1qu9dv2M2pb6ZldM+8kkEgDOI9CllA0aLRs8thVHNTfsiUH1QOiPiacBwtoCADMbTQrwMSHN5CEj\n", "8hAFMWRS11ZYzRW62mcDOZcNngAGI5A3++yHkZtxuZ4raxCtQXQGKVnusYlSmQo2htShZBJsMneA\n", "jJdd6viP5aYseeXOZEqkGFeVNElnDAFKyHVX2XQCptqEie8L4FrFTZg8l/3s0Y8Bh4mM8kQ20rPm\n", "czxuGqzEWTps2xrnXYOLVYsHa5aQMBPj0bbF5abDuVC3W5IhKq/cR4Cpktds5PlkN+BdBi/euyFA\n", "47Re7bUbPQ8X3FKqwDILORLFVGucOVKZUOGwbhymUGEOtZ6PlMot5yO9xyWQQZhqyBI3BQgjZu8w\n", "+bj0o3Eh10mTrz0AKl8RBojcqUX2A7MWcMkQ/0InpHQo9TBIRRMRkfRyAqANxMuu8nxUPk7675zW\n", "psCqNDdGDNolHSADsUXvhpAAw4WDJp75HxVkXoBCmYUxzJ6Zd2QiLEOgWDQNxwDGpq1wxoDFReGF\n", "cb6iKNUt07dbSdozBGB4MEt2DoukuGe3mYnx/CWmn6f1w736ySt4V9ksrbLMxJZrMabEjanNrCsr\n", "yT0Wq+Awh4qm+CwPkfSRMkoZ8Do8kFoUfcygaKIBzBwjuhAxB4vGOzRVLHoWq828XJtEQpDbTHdq\n", "huHhrJh6RgEzTUIy5MsDYxBSgjXCFctAxuK28HJAxnGvRo8jAxilxE2YFdaK1K0AYPj3SvBCgKUs\n", "yUsIMMXewewMBqnnmDRuXjzdBkn+ZACqZIIBUG/FprqbYrllH4wtS0i2nXgoWmZgWH7ust/JUCZX\n", "im/iIRusv2h95iDG7TArA6CtMnih+iY2jVqb4sWWmENrGciosA41HoVu4XobmC5Jb678whLKnuUK\n", "QacOBbrHL6JQjvvJ49B5rEeegjalXn5J51bNtVCmije3vODLqWNJR0yo2GgmMvwXC3SPKFBJDXQ+\n", "aN+WN6o1eeqwvADI7EUOHk6Lk11s1gszscRSbh/lOzztDBCHcmG2iDRnmLLGkwALom3fsvP2YZrR\n", "M11pZp8AA4pR7WoyED3vlhKS0sTz9fM1Xjuj6We7YglJVSaRiPv/jLQfsbtZdq5XAAAgAElEQVQd\n", "8d5uwNs3Pd6+PuCdqwPe2fWnxuG0sJ881aMyFUBjxbKrMwDEVKFrEk/YabOpK4uuqXDW5cIvGj+p\n", "SWHBDKNahKmIPEzA5IN6+oSYKZjTnK8p2gwI0ZYmp6xFci0KGBKCHBKK+0YhOYl5ChEZRCWwgkiV\n", "0jhZQ943H5YzWfYKWo+kJhW3fdw8lCbEsqGXi+jaCbOJiD4RdVvqMZDz6H08kgt6TSXp2WxYGBrC\n", "7DsGMHTCsKpxuWnwcCNpJC0enbUsIWlxwfnn1FzyZJpPY4F9OHb9jGf7gY08Cbx49yanM53Wq72G\n", "yePW5iSzyuWzAu3NxQQ0RrRVRcbjCaxJJ6PHNYMXkyffr5CiHuBJvlFeyEsgIyaoGXqUg27NjNUQ\n", "MQWHtvTGWNTKZWMvE1dhrQo7ChA9NZ1tjKW6s2gejKE5VMqSlGQAk6DnIUCJDi/XPBSPjc45edgj\n", "tSjLSsr/zo2b3kYSgpXEWpP3RTQG3oDAX2ZfhISipieVC44+sy5G9r7I+8eyabgDYKwYVGX2BcnY\n", "JEGu0smn41pUgr7DHNjUeMKzPZkLP92PeHrb49ktTUBP69VewxzgrIekDTlmhYlHgwF02k9R8Enr\n", "EwAGMhy6KlH9aNkrLORz0YKhqu/2wogYZD6MlJlkITqEkNAESj+agtEUFWGblwwpWpmZKWcDBSCk\n", "+UA+l8SiDiQ9C5lCbGJgClBD2BgfZrADHLEw+EEsJW5ybjL6M9lTLN+AANMxUUS1oXxYxCS3m6X+\n", "ZZS2KBFmHxWwEIB14WNyVIvIi6kMgSCWqph3iqfkuq3QVZT22ThO2JPHwIN/Ott63I6ZFUZSkhFX\n", "PPh+0frMQYx+DqgYyKirbNAmFEpxVX3NGqzkxWrZ5wDgxBJiZGyFjVE0DWpgJe9NPQzTf49zIB1O\n", "AjfQXl9Mz1TM0mhprYYktCkIsi3TB1mlvkg+Fv4cx4d2mw/vggI6voB0A+cpqBxSXmbyIBMAfeMr\n", "0mgykoqjlBSbGwa5ouWi9zHBxkjGf9wYHJvoBEbzZFPuJ4/DHHBgk7w9fz6M5LQtlG05OJWbNGk8\n", "MwPjtXMCLt5gE8/Xz1dsotdiVTIw5P3hIxACMHikw4j9fsR7Nz3euT7gnesD3r4mP4z3bvqTC/dp\n", "YZgCbu28SMXQGCsG98QDRg7lXZ1jPJ016sq97Ro+7Ac11SuTAY4vXzNDD6w0Bc0adc9sDtpYHIY6\n", "oJsd2opiV+tjYys+kAsTraQLqtnwAkqB1iQRZ8jmaU1CsjQJLWuQRWZjSHPxfhVJKkTJwsifzVGD\n", "gKJROD6AyOZL9cfwoYaep1zPoH83IHHblF5F9Xzw2fdI6NujD5jmgDnmgxOBvtlnYM3O/w/WBFg8\n", "3HZs4NnhwabDJU8/N13Nhzmie6aUkAI1gf1E5nnPDyOe7ghQffdmwLs3B7zHMdOnWMPTGn2Am0xm\n", "IhXDhvK6oMa4hm8S2srp+03M9braYWoqbPUgSuywLPE4rgMexhMrVbxyaG82et3l1JKIqYoYq8Dn\n", "tjzYueNTw49VamdmiMm/8t3z/+UDewZRZToqjYIxgEnUlHxYNgawrEfAUaOAYrK5mHTmJRiQ/D0G\n", "xLygWkR/iPz8vQ1DISXJGvSY/ZSKpkFqUVXsMYskklXN8pGWTDw5iaRjI3YxpyaWbMrmeRMZGl8V\n", "8c5Pdxxzz0brp/Vqr4mHlI59FqzWIRmSLs9EITpmqedrtbI85KkdfKiohgQ2l9Rz0THT3GBG7g0S\n", "chRwcnLdWfho4WNE7Rx8SCp7KY0+pc8BsnRFwFmtR1gGMADFsEXrTfEZ9Jg+Cmhx3yoZW/ql9HAK\n", "bIDjqHFUjITJzxGwhs9KBrD84CRooXwuy8QX9WFjkNrr95J6lxyDqTUrKVa1w6ZhxgWbeW5EQtJS\n", "uqUMdRxH9KaYMKc8ZOq5T7zpiYVxfchAxk0/4ab/HIIYM9NqZaPO4IVdbIbGGLxmgA6ASSkbNgL0\n", "ualgQ8J5kDSAmN/sR0dr3q70oDzywVWADJkUSMyh0ringNVIMbAaw6g5vDJ9sEKwVspS4DfBHItN\n", "KWLxhhCMrAQbYJJ+T1AYY0C56R9iDKpvfsiFmHdi2Rjl+4ZPEFpQlJ2SYNisM6YIH7ImrkQ2fQEk\n", "5ZSX+42qRna6nWNSmYw1UCrspqPpwuW64RQSAi2+dL7CGxf09eNth0fbDmfrBratM4DBU09KIvFI\n", "hwn72xHvXvd45+aAt696AjCuD3j3pseT2+Gl9Fan9cO95kBTcgEupODmWpQ3mgwO1GirRMhygh4y\n", "N63DHGreDLLHhUjHgGNkna7P2RcR0aJfT2W0mMPoncYcDnNQU6vaFQkGfPAGoNrSFAGfGFAJDJbc\n", "M7nM04D/n70rDbOrqrLr3OFNNaUyT8QAYZAhMTZgI6AgMy0EGhrxI8ik/YmITbeNdCsCtijQTp+g\n", "fjYIEhRBbCYBITgxKCoqtjITITKEEEKmmt5w7z2nf+yzzzn31UulKikqBTmLL9TwpvtuvbvP2Wuv\n", "vXaTaZVz+0gThsHIVzOZM2WCoxluPAqEgtaDQEqBIFC2IgFt3eGo8hqZlkMmErU0RT1xKp/OGMrM\n", "SdyEACIhEGtTYyZUu8oFdLcXnUkkJXSziaceIVYphGZailIsHSepZH8toYShv47VfdaPZ3VvDa/3\n", "VrG2rzaseegeb22kWubPXgzuSL1g0LWtN6QF8scIBMUiMsql9TRJI6RF7bPDG3elJ581b9yRQSBD\n", "ksEUX0gZliGTgU7GQySZQiGVxtwzjiS1pnKrKicQTZm/fT4mU+zrqNYByWQJnEDYYx2dJMKSGfkz\n", "0epbSraI2JWCes2VVl8EKm+m577f5oShwSqZLK/cs94l9qW5TagQhWZ0YXspRoeePNKpzTw7ynYC\n", "QLlAZvRRYD8TXFBrpJlWx6bGYH1NH4+6JyJ1w8Dwqp8eb21wEaDaEAhEklODBbliJ7VrZFITZ2Fg\n", "OroDQfupQhSiGCuUpTJFG/aoGExiZBQ7Uoe8AMyaKqXQhp06TwkVEi5+c/sLqzECYVpQOR5RqLFk\n", "Kh+HVFbR0CoWCROL8oHH5k92fzfSsGRjpUuqQud/TfGJ92+Cjlkoa14a6LZfV72q9Bti5YudPqVy\n", "hEUiHeNORynD74mL4AVNYJACwxIYrMJg8oLz5YKORXzaUkhI9inTo6X72AdjoJ5rI+mtJRioj0MS\n", "I1MkIemrC4TaOCY2pm62/4ordJMBlPlTHPPkCRhFRlyK0eUY6eVmomtwws4MohBcBXVG/kjyebBs\n", "OW14S40UA4UI5UKqDUkjxzlcmFYMwMqiMkmJP7NZaSYpkeDkXZnLhY6v6RyJjfx+tNBE5jnJAgWv\n", "IOMZyTqByARCIZ012lZ3s0zlnbZT16AqNWN66gl5l/BcaFPxZAKjSGMLJ1RIqj2lg0iLaVqFMaWD\n", "CIyJ7UV0lmMEhTivwCD3H6CeQdWIwFitp5AQgTFArSQbqI1kbR9NR/HYtiGVQj2VCBup8WggvwZ3\n", "ZJ69YpjJz4oxVd31bazIqBQiuu41icFGaixhVC45KQBRFwhAqgDbD6oMu26nliiqgCYSxdiSGAU9\n", "Ocn6S4hBm29WetDmQbdNNBGrQxEUQi/iLbiNYcNUNYa6k1LOBoN6uIXgWCl1u4s0HgG5v4khX3k0\n", "JI8wtK7b7mjuRBMYhlTWVYZiZONReyk2Uu3uNjtCtVv/3FUuoL1YoAlb2uRQKWGShloiMVBPTMLw\n", "up6MtLqHvDBe76UEYt0Atdp5bNvgVo6ayBCIhKS77oacLyBTAaXPfCmObBUU0ObimsjIIrNBlY7i\n", "qFVvOF1TTnyA3kdllKxniib9ZFGAJNPG4Jk0KjYuTAVCQDT1pptjBhwiw6mG6n9DERNis1KEoWEI\n", "1Ra38T5S6kpsJhUQkMJK6RaYTAgEmX0Cl5jJJEyBjX2SjPGzUwElnwDkYlGg/4Zc8aw41c5OrcDo\n", "ZDLDJTBiUgoHDplKPmZUZGL3//UDDazpq2Ftfw1r+2pY269N16sN9PtYtM1DKcqPRJrp3Ckxim5X\n", "KalAuQ5fy8U4NEafpNYUZoJSMaMR5ZQk56dJMtzrkK4Tq5SQDukhpTQkYSRDpJlAGGiTT+MX5rRl\n", "5DYM9nlcpYeZJonWnl+ciDNxITQhsjlwD8cWmzd+fwWOQ9wSqG/QBuwiU7oN2NlkGcLGWS+y/D4p\n", "UzwkQ5n9Ydb092A1GMejUkyF/bainUTC31McYg8Mq97hWAQgV/Amq4HEkhdMYFQT9NcSVJNsk+dy\n", "zEkMgD40tSRFWGsaVRU6LQ9O8jBZAWWlgBITGfqvFAWADFEoxZggqc9GGWYtv0E1bROCN/sJqlpu\n", "LPVCmqRWAm5GiyWhbi8JNYmRohiHiHVfkDl+Z4duPjgO60XVVrtBsJUIpz9rjMDBgF8/yxRSoUAD\n", "2+l3qVQIdWDIVSwUTJXYXYi5wllz+jvrTvLA3hdMYPCM+0ocoVKK0VmKMaFSoEpnB00imWrGqJaM\n", "B0ZnuYCoxASG3rXR3DIgyaCqDfQPNHTCUMPK9URerNTtJK/11rCmv4YNfrH20JBSoZZkhnHmqQBu\n", "XzRDKetzUdajh7m9KhCBJjIk0ixCImNrtOkQBsJZWA2pKoC6jhGSKwPsmSEpoW+k5MbdyNhkOMup\n", "wjiOBk4sIjISxivIHZ+YmaRGmUWS3+OYgLMkTVoEwhoCZlqVRr3myrSO0N9Dmtiu9HvL9KaGFTCN\n", "xCYMrLpIU6lbRyQyx7+Ux7yy0XSbdtjurBQwoVykaSQVmj4yoY3Gq3aUY7SXIu3+H5qWI5O0pOz+\n", "r9tI+riFxKow1mg1WG+tgX5f/fQAk6qZSWQD0XB8qghc/XSJAN6T8E6YFRnFOERZRqathAsprZIH\n", "es0M9QRIuDcdrs+MhAyoEhoJidQhM3Ij/4SNn67KyiVMzcQA/dxKSvBUOXe63BsdiXg/onK/s4Uw\n", "qSSNm5b8Hkhmn6nWVV4JIoddTyS3pce0G0tS7GbKmncC3HMemLYg03NuCAytvtBkRntJ956ziadu\n", "c6Y9nDR7OTas763S6MK1fXWs66/pr3Vs0BJuNjv28GDJf4DU7ld4DUZeoaqkNf4vhLYFDgBEYNdX\n", "NpTMZEQ5EGCMhJtBr6E0AdtEOgjaM8hAIJXKkKhJoBBl0iTenO+5x8vgWMRtqPzV+mbwHR1Cdwhs\n", "iTqsmb/gOrdtmyPll1QUdWjyEanCWH1h3xU/h31fpugs7b4vy6Rp7THqmKb3Y4dTsJFnZHx5KjxS\n", "VZOolQIRrjRFj1Q5fE54n2kVPnrwQy3BhmqCnmrdTq+s2sEP9fFIYkShMGNRq0mKoMYzxF0TK2uk\n", "xJikFEpKIZDKTqEAgDBAEIcoFSN0SFI8pGYxpLtwP2koQKOCtEw8qAvUBFXnUrcKqquidnZuiGIS\n", "osajSLUzeIFHAOaqttD9YipnMseMuJl3nDkSciYyzMUyuks3T2uhRMWpdGYSZuucKqgwMBdxIGTu\n", "4reJjsvkuT2e0vSY17MMjYRHTUpzboG8/0XJ8cCYoHvOJ2nCgpUYUzpIvs2JQ7EQQURNU0iohAVZ\n", "S4jA0G0kK9f3OwRGFa/1UNVhfX8DfbUEtWFcIB5vbUR6EUylRC0Fgnpi/GqMjNthyU0vpVRIihHK\n", "BaWrjwCgtOSOjIDbM+ttwVJqEiUTBGzfNcWODI0MSFMro+TKqZTUhkXXXIC67k2MUzLWc5MI63fD\n", "r2NdqaUC3JGL0l3AlMxt4BmmarEFYYmfU/FCL6x8U0JBKFKLULLAxxEgk3Y+vQAR0XwcnIgNjkm2\n", "6skxKjXx1m5OuMoQh4GemNXcc87jVEvawJN+x6PDirHjgQEiMKRWptUama4wkPs/jVGtGRXGmj6a\n", "AtBTJb+geioHnzSPbQqhEGajWU8lhEh1LHKJT31nxcaSVNmqZDyJwpIdof5sl6IQaSGym1WVNx8H\n", "HBIDtpe8kVlSFdDXm9R7h0AgVQpRQNda6Mi5w0AizKxPT+BWB2H3N2ZzqwkZTuhZyeDej2LF6FMa\n", "ikurJjbpPnPoaS1SRyihp8cF1GWOLJ8UmRjJqjdlSQqOPdbzgqqdbtLA5zwMhRlfa03z9OhCh8Do\n", "cHrPyzGbztv4mGYSEvS1nkj0N2iU9PpqHev7G4bAIB8MUmD0aQKjkflYtK0jEDC5QCOVECIze6Gg\n", "6Vo23i9cENX5UaTXRSi6VsKQFBlpHJk4xzHFvbSNalMIiJT26Blkbu3mdT9R5P8gpUIWCASBRKZz\n", "vNSQGHYqUlMoMs/F+x6bHzmkhkP42rrLYNuCzd0fcQGJp564qi5qZYFupKU/ihJsQGqJnubnY+Wb\n", "0p0BhshwDeel7VxoJpECwQoMPWmmaRJJpRA57SOhaSEpaLsFnqqiFHuUQRfiMuM5SVMrSRlmCQxS\n", "pQ4kNC1uOLFozEmMUhSiqjRJkEpUkZp+G0NmiICMTPRjlP6QTpQKlUwhLMZAHEA7KQFhgDAO0SZj\n", "43rKVQpA/6HBaozAJNJh0CAHXiFykzK4CpoZOTd5ZRTSAPUoQ5xwP6g2LdFVD+7Bail1VjZhyMl5\n", "pE1wpLKLIT+WF/DNhUkYzAVKHyorCWPfC0rmwkAOSoLodrrQXZm862xrZg3nSJq8+sImDCHKBW4h\n", "KZhRqhPbaRoJERglTO5gAz2STJaLMQLTQqKjbEYKjLTuEBjayPPVDQNaiVHVPhhVrBuoo7eWoNqg\n", "kU4e2zYKUQCVSDNKsJqkucXaVWIwwcgLdpIVkEqpJyzpzyRgiIxyLJEWY32dW1M9AicLHJc0AdEQ\n", "aCAzXj183SoFCCUhA4pJYUhkhmnBMyNJA7MAmYVbg1+bR/epXFyy3kBmwXYSidEEEbx6cVaA0MQF\n", "EFg1G8epAAikdfkRIi/ZdsmY1ImrPNc8NQt3fqEOBCd5JH0s6YWZEwRqIyka74sJlaImMAqUOET0\n", "NycVDiUoStE6UUsy0+e5Vvecv95b1UoM3ULSX0dPtY7+OpGpqfSxaFtHHAVQaQapoKdIOFM0kCdT\n", "bSySyGSBPusFaVzghU7IKTGmNTctKDMOPpP2OQBWTAjbCiJIDZJIbfgpLZFpRxwLZIFCKgRCKRAF\n", "CkEgzT4ucJ6vdW+6viadvQl9lVqpmr9m3URiNMBmqIZMVUQwZ85oVwQCKtP+O4IUYUz4uMeUP/7B\n", "ez1Xst5KBRPqGM77o1JB75EK1NbWkftX0CMMY1P1jJwpJGyKmErt/l9P0avbSDYMNLBugOLP2oE6\n", "1g/U0aN9MKqNBDXtz+SxbSMKA90WaZNP4eyJAMP9AU1rcSqVaScweYSiGBAGAeJIoShDpLFDEmDw\n", "NcExSAggERSH4OQU9No2lkmlEEgBGSgIaWMQJdR5H8Cg6frNkxOWYJSaxOWidPN+aLOJC5WPIflc\n", "S096UaTg5dY83sEJpfQEFacgJhyy190focnINBeH0PK881400t0GbHLOpGqlSBPb2oqW0HBHb/Mo\n", "akNgKDsUgu0G+uuJITGaCYxqPdG+ZdLk8ENhzEmMtmJEkkmdONRTCVFPnKpnk6IBlqnKlEK3VOiQ\n", "CpHU/hhMZAQBYt07yOMFXYLPMN2BJR34D8XJQ+A4RDOBwIqJUEokQYBGap3DYz0nPQrI18NMGzEf\n", "OkLzh2nQ5ABpEyO3zcNKKkd2pdAHU5hFWSr64AtJDSMCZLBCzrZU/eE+c0p+kEvcoJSpHEil5z1n\n", "NlngCrGVSeb7ymzCQCPgyoUI7WyaVymQ8387meZNbi8Z9QVXPztKBVSKEaJIz4BVmryQRGA0tEyS\n", "K56rNlTx6nqnhWTDAF7vrWFdfyNHYLwB+ZnHmwzlQgSpUpM8uMSq2//JrLLS14GVCdNnsxxFeiNJ\n", "zxsK6PGrIdpkRD2gfF3rz51VYFDMCN34kYhBRCDLNqXKECiBFERmMHkRBvkRY+7IQBe84LsJieJK\n", "qGRlgzTx0012tgwUk0NBjvmCJkrbhMGpeHI7Ydgit3cJGJWLpba3k30pDGGjHytAm4IoICUd9Zzr\n", "hVmPdu7UPhgTyvS1q1JEZ6VgzPNKMVUbuO+cvJWkMYkdqKfoqbFxHnlhsInnGj1OlQz0Uh+LPAxK\n", "cWiIMN4A1lJA1O0mnFk+5VwDdppRhJJLZOjnDQUlJTQyOESmIq28aur9Npt8PdEsoD1RAEntJbw5\n", "BgDlGHXq9opMqNy4ZCPl5jjn7op0YmOIVZVXpVry1iY65n3DbtJHCnqMgBIKPGHB7rTIQD2gA9IK\n", "VI6hluxx+0/4sdLEZksMc/xJnZ+bD9ndG8WaGC3pfazbRmLICx5faIzzAuObonTCmWoio6FHO/fX\n", "acQ9Of9TXGIiY8NAA711km7XUhqB6UORRzEK6dpwCDEkEmQALEysMCSeviZNgVZPc2R1lknAoQm7\n", "KEBRBshUOEghCXCUs4UeMjaWSARyHjImFkFBZnTfTJMAUur2F2lzGo5FQGsPCjf5hxuTkCcHTBxE\n", "Pg6N9NqxRCrlbFzylbBERibJtFMZ4kIMUl/wsQP5vR2r3Dh/Zk/GJvGLOeeu/wVNDyW/rzKrMDSB\n", "USnSNLZygckLayYsdH0ZUiEFEUFsOcDjnfvqCXqrDfTUEiJR6wn6arR3oslx+THTQ2HMSYyOckF/\n", "aBNILZuupxlEPbFqCZeV4kWCN6paKtyRFlAqhtRawlSfEDSmkytwzPDxqeAKq+Y+eNPPRjBhgxQZ\n", "IpWGhVS8WEtFVYdM6MQhMOx5ZJIH7km3lRMGEzEu02dGH5oFLz8jmZOmzYNerMEfKFvpVJk241EC\n", "dkyhNASGC6m4/9Ya+CSOGoMrn1wJdZUkdFHwBoo+7G2FyFQWOisFdFcKmNhewqS2EiZpImOi9r/o\n", "qtDYsIoeXWhaSFIyGFBJhqomMNb1N8j5f0MVr/YQicFqjNV6fFhPlXrP6zphZcmcx7aL9lJsEvkk\n", "pWuepP2J43EDW7FrJjG06igtSG1qFdjKg9DGtY6ce1DfIWy1NRSBJVqDFPVEIMmEkSPz6zOhmAlN\n", "ZogAUUiEZRgK8zxGRtlEqvJ74sV3kHzSqT7w+1XKblSMzHuI88obFjdpkHoModKMUKZNqcCjXBUt\n", "1rkx0c3PaxZglknaCVBS2V50o9ZoOtc8eYYJDHbZbi9RXOoqEbHa5agvOsvWOI9VN1zpZrIkzZRe\n", "oKnCsG6gbsYXvq79L17vq2NNP00i6a0lqNZTNFItFBVbEus93gpg0zupYPYfSSoBDPYo4M82S7jt\n", "GM8IpVjqNqfA5NuCiYwoRIl9uQwhoUw1UCuurUJMwKhLuXhh9id8HEwkBkAgrRKMx1O7+4rmNmF+\n", "L/TVEgL8e1OpNXun0blIeF8UgFRhYPJCJxC8P1CC792U9Jg9mo6hsHHTkqc2Ltln0ecBvAeldsBC\n", "ZFtIysUIFT2tzTj/639tJRuH4oj2nkKfs1RKGussqQWgmlBS0KtVYWzoua6/bsYY8gSAWpIh9bHI\n", "Q6MUh3TdJUSKMalaT/PXgbuHYBLDKpAouY1DVn4Lsy+IRKBVkApSBpAqGkxMcjwSZH4uAIhMEJGB\n", "wWs8x0ORkVeE1ASGeY6cIqxpolATbLwZrG5w87PRhmJWxiEy+DU5PrfaebkxFBi8p3PJ4VbkhRBU\n", "XAqdSaHFiFWqoSYsItM2UilExtC8EIWODwrs5wCs2Oc2khQDdTIX7q0l6K1RO21vrYG+GqkzqkmK\n", "RpYZ03WHL94oxpzE6K4UHeYt1YaXQF0b65kLxHy43KRfGyRpZqdTFlDOJAJtrAbQhzMOA1TiEFkx\n", "Nmw+nwm7OAeOBNvOZh+op4hEhnpAkm6ZaRYO2lAGCpkSSLVnRJgKM57RSMKdKuigTbjzfjgxkJIX\n", "wLwk0Rpd2YtnKPAFYOaISACBQylICYWAJpJKNssDhGyqkjjPp9BKPSLt93yRNCVnVGEIUGBDmII1\n", "qOosxeiqaJO8ih1dSJ4YRUyskIFnezFGOSapJLEvIKd0qZCldEH0VBvaOI/bSGikKn2tGgJjw0Bd\n", "954TgSEEUIhC74uxjaOzVDBJgFKkvJKKqqFMrLKMWznXpOv0nGQSjZJEmybbojCw8Qi2hSqNFbKi\n", "yl3fDCGE9esxijEyx20IYdojBiUQmYIUGVKWT0qBMFBmUbIjnHVIze9AzBebODTLomHi1EjBCy/A\n", "4Zc3OlqFAlCM0sSFhNLHqpcvt9pgNhFOTGqqMLAyoxV5EQiYBbqgF2dekNnIs6NUMM7/XXp0YWeZ\n", "EomKNs6LtfKPPisKSrt719MM/Y3U9Hiu6yfCYk1fHWs0ibFWS7f7tBqskWUmaSiEgffF2MbRXop1\n", "4QWoKqXHM5NHTl1v4g1UkwpJuUbblmwLtJRaKdrAR8KJRwXduqHipuvF7l/CgMw+RUqqjAQYRBLy\n", "YzMJSEjaXymFTKs5hLTVTzYdFrCqhlwl000ezNf8/kflw8KwI1MuHik3Wac9kwIRwbxlUoKSIXNe\n", "9AOaCRwgn8TJjcQhOrcwileeyOcSqmVNqrIyzI4uJOM8ah/RZqpa3UKkl4ICGdM3Mt13biqeWrLN\n", "Iwx1W0lvLUG/lm4bAgNAHATeF2MbByvmlQKgPQOZXK21uL9yPv+cp6VZhGIsnSq9LQZBF5NDViBJ\n", "BSnD3D6EIXSRRwRAkEoEGZAInrg0WFWQ3xvZPQURGu4ew8alVsipv9zvwVlp/vfDhUnOld1XAoJM\n", "OiFMTAJIJc+HGPCvWzxfPj7mc0ved7U6RJdMjbShcCGyRWdu/S/HlsAoFygGFSKejmfblqWCLmZL\n", "/XkhVQX7YAzUaaQqKS8oBrkERj2VSFNLYESBQLKJSvOYkxgT20umip8pQKnUtCHUkswhI+j+CtZg\n", "hk0i00wi0aYfHaUYldhOCRD6g8FS7lTGRIBklhHn3s/IaS2JwhBx2EAUBKiGKcJEoJFKulhkXkrJ\n", "Y8GEVDRiK1BkIsMSTCFylQw4ZIbSFL67CHJlkaekcN99qw/exv6c/MMW3M4AACAASURBVEd3f0PP\n", "L0wCogCShzE7qTcYzEjyUboXRd48T9q2mBbVTrtAB2asEs84z48I435zS2J0t9HXzlIR7SVaxEsx\n", "eY4YY9E0g5Q0NnGgkZHTtpFsV7FKjzB8bUMVr/UMOARGA/2NJgIjDFAuRJ7E2MbR3Vawppv6emTF\n", "RIMVGdCfcWfTnjrxyB3LXOZkV1frpaJFkyYFBMhkZFy83dhszIwDXcWsayKjIRAGGcLUtpe0IjOE\n", "YrZeaZLAiUNN/aBAPlaYSqGTNOSrn3z78MjUZvAiDa18EqDFmpUd0qkAQ6icGkw5zyH1G+ZKqdLk\n", "RU7q6TyWyAuBINSVH652Oh4YlSKb5sWGxOjU3hftxRjlQmxk25Ee750p0OQYSfPV6wlNIumrJYZU\n", "5VaStbp9hCcA9GjX7UamYxEoaSjFEeppY2Qn1uMthc5ynOtbRpIZRWmDCS5zoejqv7L7hTSTprWz\n", "nEVmMxoGvK7TBy4MAsShstMCpCVoAbuOs/Sa/mUUj9IMSUaf+1YtEmbvIJmfVKY1mPdEtliVn7ji\n", "ojmZ4T2Su1HfXLCEW/KxKYEAttpJVhh5OYJzBgHY2N0cJ5tjpgsmlgPdfuxKtpnAYMl2RStW2zSZ\n", "UY4jFB0Cg/+mUimayqdoahwbrFcbPL6Qqp2swujRioxex/2/oU1AATLeL8aexNjWUSnGMJPLlIJU\n", "mS5u5IkMlwPgggLvUdJMoaKV2naCEWgN10xGADaPDE3izcUKfv58a2xmWtMCUAtbKuWgXATI742g\n", "r2t6PtqPCK3oGFy+Re5Z8nu/1sTG5qIVkQFQTOLYqfS5al1IatqfOefPzTWbYRR3gTBdBVTgYXIi\n", "RCmmfUnJITLKmmxlJVgY2IJdphQpwfT3ZnJlIzOqsD5NrPZViUDtq6daCUaqVLedjb3lkk1MSxpz\n", "EmNKR8lKfiVtQqvgkX/KSSr1suEkFkamxBMxMkXTMEqxaTng/isIYnGKcYhMkk8GhWXLbBnjFz3n\n", "PHbMlaJQUA9PkCHJBOw0keZ2D3blFdZTghdqx1+i1WViLgpOGpznbP55REyfospCIOh8BUJACV6g\n", "da+VEBBSDToufpmceR4nG9Iel3txGPJCV5B57GNJj9tpK9AYns4SOWx36V7z7koRXW30dUKb7Tvn\n", "qmcYCCgIzezSNJUGVzxrCTYM0Kiw1/tqWN1L5MXqXvr+dU1grB9omGpDpt9vrAmMzlKMdf314Z9Y\n", "j7ccJraVnHYE3d6mPyssyw1Emqvg5cwkM2pDaWQS9TRGeyrN2E1WZylNFJKplURJUkySWuKlgBx5\n", "GwqqmLpmx5xEcHsJ+/aYzT705pxJAa1qCDhZEPkxjTlBhnM+rGxSL4iwi3SO7R/m+bVxixZpBSIp\n", "uG+V47FrQCpaPF4BTsLkkBi517CP5/dO6gsy8CyYmBRac6qSa5ynnf+LBbTpOGT8L3ihlgqKjam1\n", "THKgQQtzTzXBhoE61vWTEmNtv45B/Q1sqNa1AoMMqzL9maCkIURbKcKGqicxtmV0lQu0D+LChq5o\n", "McnayCTQSOGyqRwDmFR190flQohCLFEIOOkVlqjQ6tNiFCDTFVDjLasXdENgaGI1SDK9n5EItOEn\n", "m+a6BANg44cRVUHpuOQQqRvZF7mPZ7hEK98+EujDaEoa+M0qk8RDaa+MFj3n/DyGpHCTBvNzHlwg\n", "4gKXMWHWU0iKUYSS7iuvxBG1kgwyzbPKGk4alE4YZUoN15mkz0c9IQJjQKvCXBJjQ5Urn9oDo5Fq\n", "Px861iiwk7V6a37M6raMjlKcmxgkYdttm4kM3i+wcTm3xVPxN0YSs9FnaDy76KqzKgtu7Y9lABkp\n", "KBWa659V4jkiVCs5MqkgUquA2hiZAScecYuYJVIdsrJFQBr0fE7waSZwhwuOR/wcVunLahUmM/iY\n", "8s8++HXzSrWWxAV/ZWLIjUeaVC3GVoVRcv8VyOOkENnJM2ydAOi9WcYeGERyk0JVmnjUX0+MH0Z/\n", "LUG/VmbUEuvHw7GI88hiHKJ/vJEY07rKeuFzSAEAVZWaBbiK/IdEKZg5xNyDnmScOBRRTyXqxQzl\n", "YoRCSMkDIzRV9xBSRvqDQrezCYltJ8mTGFGYIgwCNFIaw9rIpJ7OoQYtXpm+QNhMU2hK385UpuMZ\n", "3Juu8u9zCxIHlbuTbSvhi5ePQzITOejxlrkzTrxuotR0cZgFWidatDCHhs0zo3i0JLKzEqOzxP3m\n", "pMKYUC6gs1JEZylGW4EW9Dgkh1voYJlm1I/bSGzCwL2dazVpsTpnnkcJxAbN9tWYwNDEVjmmKQQT\n", "KgW8sGYTJ9XjLY2J7SU7Ak/HJCigltrpFrUkcwhFR53E7W2ZRCJ1jEgl2lIyPCqEoW4t0dezIgNd\n", "UwUt5N3qldLXkl5gqLUkQBCmCAOBeiIRBtReIvQ4z+ZRfbnNtNKKMe1inTXFImCIeISmhXKERCo/\n", "h7tQA1wBta/F63PLWOQ81ryfTcRCl0zl6SMFXWEoxlRRoLhEVU7uOW/TREZ70arAyPWfCAwF6M+J\n", "9hOW0hAYrnHeuv4G1g/UsV6PLlw3UEdvlQ2FqT2I3f/DQKAYhXqsawHAwMhOsMdbCp0uiaEJDAUY\n", "BWEmFRqQQAO5dVoqbu+0Hj2NTCLJQpTSCAW9MQ11+c3EIn2NFKIAmQwgVWg8yAA7Hc41CjZqjFSg\n", "AUmjVjMaoZdL8DXy8YjJVXvrUHLuNypx4MebxAH5OChasRGw7889jqFe3yhQAljFryYK7FjnEEVd\n", "4Sw76jCWbpciKs7xnpRtwdx1I5P093aNPF33/55aQxMaCY0v1HuipClpYNVsWyHG6pZNAx7bCtpL\n", "MY0I1oVmXv/Zq2cQkQHbgspttkz0J4UISRyiGEujyOCxy3wNUZGH1ACmpRXNhARPKyEyNRACSUZ7\n", "CDb05n8cdJqvT3dfI5yEyYShYQaU5r3QCLdG5jH5/VEzwdqc0w19HEPGIrC6zimMaUVYFFEBnxUY\n", "HJfyBIb2v9BxKGS/JdXUXqjs+lNPMtS5jcQhMfrr9HO1keoWkoza4fQbCFi5rBUg6B/6PI45iTG1\n", "s4w0ldpNm0kMOvpqg4kMhSpSXWxQRu2QKmlGfBo1Rkonql4uoD3J6IQbRQYhCIj1TmM7K53lO67E\n", "j/641tiEDOCI2a7x4h0oBFLqC1XmLrL8BULfSMeoDgBaucoympMG93fDvUjyFwY/Svd7Mv25kSvD\n", "JU429dosRSIzGC2PNPOEKYnjFhJuI+kox+gqk9t/V6WArhL1nXfoRdv08QoKiIk2qkolTbOpGgKD\n", "FBakwqga9/81epzh+gFt4llPLYEBIjAqhQgd5QhdlSImtpeGeVY93qqY3F60Uy10iwBHpHqSUdyR\n", "CirJcioFTipSHa/YDZ7kvDHaEp6bzX45AdhPg1UZhTBEuaCsokAfU07ZxARhIBCFGaJEIAwkwjRD\n", "KvRxC2kqqUMv2k0LdtP3ucdtJGng5xwuWhEZ7vOKVruH5kRoGDGQ4hHMlJZQ2PFgxSgw1Uzu7Wwr\n", "kRKjvRgbA722YoxKMWzyE9DKm0wi09+7Cox+3eO5gd3/mcTQxnk9uvJZddrZAIpFrAhhQtVj20Z3\n", "W9HEFBOL9P6i0UxkaFBMcjyqMmWJ1TRCpSCJyIikqaBBOGZx0ERGGJIaLQpN0sIXHHsCcYtaKLTR\n", "nhBIpdTXnjO6tUU11Bwv9HWvf85axKRWaEWgjlbi0PxsLY97BMSJid+BJaS50skkBlc1WapdKkSo\n", "xFTEYQK1FAVG1WpaghTos6H/hqnUSsBUS7Ybmal09tZIHdZXb6C/RnunaiNtSWBQjAzNNBSPbRsd\n", "msRIFSscrBpq40SG3cswocGFIfIxtEaf7vhVfl724gkDMiqPVQjV4qPIqgwRZAgDiYYARCYRCGmU\n", "HVzcwRB7h41c/iPCZj5s0ONbx6Qtf31+Xp4SZfzWtAdGHOlJJCHvlehryWkbKUQhCtq/JwyFMXpm\n", "AkMI66PmtlbXkgy1Rob+BhVw+usJBuop+htafZFQUYc9MADa8zLBy35lm8KYkxjTuyq00PLFAWfR\n", "U1T15MSghpQ2tCrf+5kZEoNOAo9uqZb1RpRHvoTW1Apw5HKxJU+MbMdIJ7VUJuRRM6lWZQhECZmv\n", "RVmGJJDIMqGl6FK/D/s+DbGhV+1WMu6hsLnVBnP/Flfopi6Q4SQLLOfiKk6kq51MYJQ1c1fRY1Tb\n", "HKm26TcvU2tJe5lkk8WC7a9S0AEolSYI1hOJgSRFfy0xplRr+2umlWSNngKwTreP9FS1B4ZLYISC\n", "WltKMbrKRUxuL2JqpycxtnVM7igZnx3jfQMAisqdPAqaW0usRwYlD6lRY2R6M0k9yfVijLYkQ4lb\n", "SzQ5B2V7sQNWL0UBUkWybvcitXJuZ+a50B4ZQiAJ6TWp1UqTGdJpQ2t6r25MGkx0EmwP5mBs7oLt\n", "LtSDCBGlNvs1bXUBZjIUxW4yyzMO22ya56gwzKiwEk8eocQiDm0bkICWRgJIQGPd2Kiq2qDFmH0w\n", "eqoNrNexicgLctw2Jp5NBEZRExjWH6i4mWfX462CrnKBJh1JhUyrMBSsZxbLuZnIYOJTKjijkTWx\n", "mlq1ajmVOWURmXXytCUKFELQGhlJSq7ZzNxef3ZcM/v3BNqbLACRGalQpoV1KDd8oEVscmLSUNjS\n", "pMF9Dvf1htobDfc1XfKCYzfHozggUpWNhUux9QsraXK1pMmMUsSjU9k0j55fKlKA0fFaU+marnhy\n", "TOqvpdo4j8zzuPpZTWhP1Exg8N6NjUQ7PaG6zaNTt5NIk3PZXAloTWRwIUVK5JQYWaaQZDShrZhJ\n", "oyziggNfh6z4ZsW0DARUEECFeRWoIBYDgQCpUnVsopZ+2gcJSW3wZG45NJmxsd8PFY9GIw61er7R\n", "ek1LXuTJZ55eF4XsRcJm52SwyrHHkBdhqG0WuA2InjnT+XgGZXwSU91C0kgz1FIiMLiVhP9V6ymq\n", "WnjQ0NP9BhEYcWBU/G3FTVMUY99O0lk2yQJLuJsrkdVGZkaH1RR5ZNBiri8M3f/HEjqWrdSSAjpK\n", "Kdr0DNtiFJjZtSyTtEyPlXObjXyTFJmqn6FpMYnDFFGSoZGS6WcaSO2VIcz72VgVIkdq4I1fsIdK\n", "HEb6OlqFahMqVl+EZLzJEiRSYNgPX5sx89SKi7LuPzeSbev4z6OEEt2yw6weXQw6WdA+GNRvTi0j\n", "3Dqyvp+SiD49MoznDLMCo2RaSIqY1F7E5I4SpnZWtuAMe7wVMKm9RImD4zPBhCrFJNr4meQhlVBI\n", "wH3IrjdGqm836rBijEoaaWPI0PQR2vhABpdhGKAgQ8jIej0AoF5yThycih4t/hnqqUAUUBxMA4k0\n", "E5CB26Iy/CSi1Q1v1EINDE4gRrpAs1JFBK5axfaaR2FoqovszVPWo8J4XGqlQKMMS45UkskiKGiC\n", "OqMpBTphYNLcdf7nEYYbqg30OATGQD1BVScNmVv1jIlM6SiRMq27jWKSx7aNCVqJYeKKQwTQBZPa\n", "vnSpkChKaPlal86eKjH7owyNYoZGykbZOkHWn3MmSQjcFhqgoPS0gAhmA2EIQ02ihmmGkGNTJhA4\n", "LS2ZlFRAkkOTGS5GO95sCqPxem57Hsfo/B6SYpJpa4t5dCGRpsUoMhVPjkExk02CVTMs2c4ACKMM\n", "4/1vLUlRbbD7f2LM8wbqVsJdS6jd0fXAYAKDW0iM6XrZkxjbOjpKBe2zo8y+CLB7I1of80QG3U6e\n", "Pbw/SrV1QCIjMh6OI+O7wN4wTPgZUhUAYIs3URjoWBiY20m1kRl/DCFAwxUyiSQj884s0AQMpC6E\n", "K5MPDefaH+t4NBqv6RZ2BJrikeDifGDaeoyZp7EBCMzIVG5hCwM74U5BtzBn0qpUDWGV6XikRQU6\n", "LlVN6wiNWa0nnDfLXAtJrAt6pdixIRiGKmyrkBiu7NFIJpVzoQCmip5KhWqSWUmTtO0kSSbRSDTr\n", "Y05aAR2lzGxUuf/Q9BLqyh/3X5XiyEweceWTYcBeGalWG+iRrGGKehKgHtIGIcwyIyfPnH5WNxkZ\n", "URIxytjc1xH6f9zTyVUF00flONkW2V27oNtICrFWYdh2EiPZLsS615MIkCAghoT62CSQwY6tNKZ5\n", "KXqdOefs9s9fqX2E+j2r9ZS8S6T1wGACo6tSwKS2IiZ3lDG1s4JpXeXRO9Eeb0p0txVt9bMpcWBF\n", "A5TtS0+lgkoloFLbA6oJt1THI0NipBlqCRF23KJQCAOaCqSfW4J6z03yIBVkHDqCcYBLpUFODkj/\n", "Gqk2/BSC1GHStuk1kxn6mYbEeI1LVsmWJ3XcZCHWJp6FiJRdJaPCiIwSo3neOf9d2PuCF+aU5kVS\n", "pZtJc6e6YGedJzo2JZq80O0jSaaN85oIDC2T7NCKsG49Xnqyb23b5kHGntJIsJWSNOVDKzH4IjaK\n", "DKVoYpchXC2pasbR8z6pINFIdaKsr49Qk4C20KFHjDr7I4of4SACMj/xiE2HJZJMIBDkkUEJBCCU\n", "MH3ug/q934TIq2rdeAQ7JptjUsR7xxBFh8Rw900s4ea9qiFSwYoLa/wunYShnuhJJExi5HrO6ftq\n", "I0UtJfVYK+O8kvYua9em6xMq5FnmsW2jrRTZKZLSkgDW8yaFIhfHHJHB+yV3gqFtu5XkkZGFKESs\n", "yAjNGm6nI9pkzBQqggBxCOf1LUzCLqU2HibT4UApZEJRe4lUCLQKVkI32A9zTzTeYXM1GLNkOyI7\n", "/4/HOsc5JYYlMKgwzZNkhFFxALZ9hAdkGJsHp4WkrkUFTFgY8kL7gZG3pMpNIbEEBu3RzGhpreDf\n", "FMacxJjcUUIipWHoZIuNNhT9QdjwI5M0MUDpiyNT1sAqSaXTUqLlKpUU7aWCQ2QEptpPZjJ8gUDL\n", "uUPjxMtFD3NhaJlyfrNMiowoEIiygFQZMkMa0B80C1iVYdtg3gwXjJsocKWT5aNuohA57F0xDvT4\n", "L2vk6Tr/sxqD/xY8rjAMueLJk2kyCn5Ku2zrMWH9msDgSuf6fjLLY+M8GhdGlc+qThqkQksCY2Jb\n", "SSswypjeVca0Tk9ibOuY2Fa0iUNGscUaDjNlT1dtI7UKsrrKzBxuaZz6rUKsrlvd6qUMtZRG5BlF\n", "hlkg6Kk5VvCiE0ehdQV3ygZm1FjAxp8wRntUDQ2QSuoNpalEOqZxbHMqEfZdjV80t+Dx+WkpjTQe\n", "RpQo8NjCkuPRwxMAbK8nPSYIeBwujwmTSATITNohVKu6j7NfKzD6HPM8/n5Ay7ZrSYY0dUYXNhMY\n", "lQImtBUwsZ1UGJM8ibHNo6McG5PhTFqXf2nkYfa+zZMCFEDXuXRJVbdHWaJRCLX6MS/pDrQ8m9df\n", "3gOxatWdlAZA7894YgDtoxJufdMERpAJnUDo6SoS2vjcITLeJHGIMYi8CGjqiAjYV83x4wlZgeH4\n", "q0Vu3zm3lNh4xbGNYrSyFW7dbicV+WHw37OWUpwhyTaRGAPa8Z+JDV6HMke2bQp43EJSpPbeLu1Z\n", "5v15PNoKcc6gk9vV7GQe+jTVm4gMSKl9hzXpBttawslukpEao5hZf4xQK49Y9a2cWEQmnnYcqFNv\n", "BuAooTKdvKdCT1AiUiMTgfZtUBASCBRM+7/r/fNmiUMMNx6ZnI19HvWexs1biQhyC/LkhWTaSVh9\n", "4bTD8ewWKRVSPSqC1wJjJC1tHl5PrL2D63tBRT1p1jeXwOAcvKRzSC58tw/Tn2fMSYzHV6zFrjO6\n", "rWzSMHxA6yYLTWToaih/uFm+zT04LgNUTTJ0NlKjACjHEVXbIu4xFJpFoleIhDCLjJQKz766HjO7\n", "2wDoyl/gTODQ/UFcOY2TDJEew9oQEmEQ6ITILt5SSbN4j0TONBZoThRcBo+JADaBYal2rNtHCnGY\n", "nyHMFU7dSvJ6TxVTOydq8sK6bIf6xbi3VzBjm1nJNlc7++op9ZwPkApjfbWBDf11rK82zAgxM+88\n", "pc2cEEAcCBT1BcEExtROl8CoYFqXbyfZ1tGp+9BZwdDcFmZGCiOBAKl8Uq20SlIJpVKnAirzSUMq\n", "UUsl2pMMlUKmTdsiI9ULgwBBwIspjD+EgB7HGiq82FPF5I6SPgY9fppZdwChkCZ5CIMMaUaqjDST\n", "SPUoRBWQ1FtKOy55PMYihivRdpUXlsSwBp5xGFiH7dASqzkSoxBiQ7WBt1U6TK8nk9pCiNymqZFq\n", "9ZzS60tmF2fu7+yrWff/Pt17PsCO20lKizXHItgpJKVCiI5ywfhgTGwrYlJbCZPaS57E8EB7IUZW\n", "kkbCzepTR7yQu1ZdIgOZRF3Zx2QmprkxKUQjlrp1gdZvXtcDETjeC+6MIrv3WddfR1dbAZTiCtN+\n", "GwSZvZaEQCAFAkikgaLvpYQUytkPaWNRMf6TCHdH2jpZsFOk+HtXudss147DEP31BO3l2LQqs9O/\n", "Pf+AUArULaSM/wVVszPdQi1RT1IM6L3SgFZdMKHBMStpShqsAtkmDGS2rqfFtRUxoeJb27Z1VIqR\n", "3gvpYrPSbf+G0LSfqWYiQ2USSglTFMgcYjbVJupJFiCJVC55pqKEVYcBLciMUCCEQF9fA22lGJES\n", "gAgB8J5IAlEAkQGpEBA6v2CvnkzQPkjosCN1qyi9mH3/4zEWAZuOR64fjy2+25GolsCggk+1kaLc\n", "XjQ5XhhyCwoTUaQEEwJEhOq9Y6a075KUSFJlfDAMYcFEhlZfkHcbT44hMIHBirRKkYw8SYkRobMU\n", "jU8S47fPr8a75003skfpJAyudYyA/oNoR2VOHBpZBtmwUulMy7jraYZaagN5tVFAfylDeyOl0Z26\n", "F8tWH3Q/qLQO2aFumfjb6l5sP6XTtIXwR5oXacHsViOzC1fGkkqFNBNIBZldZYJ6ubiq2iyr3BpV\n", "0dbEhU0UArM4B2aOME8fIRIjMB+8klZXlHkiCRMZcYQV6wbwjrdNtnOFNY+XKQWh1RcCwgTLJJXG\n", "EKZfExjcRmJ6zrV0u7eWGLdbM6JHv6c4pIpnezFGZznGxLYSphgFBpEX07wSwwNAezFCkhWMQSdL\n", "sZlYcK9MIQA0MiDNLJGhJZSZVojR9a8NjjIO6jFqxQzlJEI5znQLg5V08yAlpWws4hFir6wfwIwJ\n", "FWvYyccCXqwyrZTKEKYCicjsYpYJIwcVADKhqxAS5POg3994UGe0Ul0ETTEp4AXZ6e3kxTh2ejnZ\n", "mMrIteMQa1fXMW9ql+3xZE8AZX2ZEk4iJKyvgO45Zx8MHvHMRAbHoIGEzaps1VPAKv1Yst1ZLhB5\n", "odUX9M8be3pQ4pBKiURyq600ygrT5tb0GJfIUJluQUEKqcKc71iilRiNTKKY6usilYijwFxHYQCt\n", "r+AJA8ipMl7vq2FSRwkqUFCRgNJDWE1MEtozI6NNdSA1kSoCZEJRscIYf3JyIgyZMR7iEKNVPGK5\n", "Nsclllu7HmpkxulOIrFy7Tik9pKe9Q3MnthmEotAJyMc/5XMQBYDwhgrJlopyKMLKUFITXtbVZOs\n", "XPlspNIQGPx+An08xVwLCf3rrBTQVS6iSxuve2zbKEYh0lgiKca21VbnSoY4hb1OaFskTcwg4ozM\n", "+aklLtWESEjV+yhEGis0skDvhWybOk/ScMceG65TF7vXDzTQUS6QxxhAfhkh31tCgNQX9LmnPFFA\n", "q8EEGyHTzyJoIlXN62z9OMRoGY+ayAsufrl7JROXtAojdNpJwkCgv55iSmfZnHOG0vtEgMw7TZOP\n", "hJnmly/Y8V7XFn0aeg/MrdYOf5FrIWFCta1AgznatfVAe4lasTeFMScxEAZoqxTM5poXaMXNVA54\n", "4QCQGwtFX+kxLGcxMm7uE2xk6GikGKjTySgXaBZ3wemB5kWJ+7aoEkoLk9tmYhMaPi4tHxTW6LKe\n", "cjVUIg0EkqYkQmr5jVSCWHbFPfFjwwK2ZPBgDfI21kNlKgrOCFVOEqjKySSG/b6oDTutESG9ugS0\n", "sRQ5mbuSyUQvzgO6JYjdtXtr1GveU6Xec5Zuu2ZVXGkIhDWqYgXGhErREBjTOsuGvJjaWfZ96B6o\n", "FCJKGjJpWkK49YJHotJG3u0BB6DHryrFvaC2YpYpHinmTCtJIlSKMar6WjGKgKYeaED3tht1GqvB\n", "BCJFSigzAhF8e5OhUyAQZhKBIA+PIBMIeDS0rkrwAr6xODQWi/emYhJ9DYzygmMtO2tzAmaqnY4x\n", "len917HLLPSOXJsd1zNpR70xMZ5kKiePZBVGfz1Bv658mlnnDTbNs1VPVrEVtVcQEaoFdFfIyHNi\n", "E4HhJdwexThEOYt00sCEqnXXd69Js6mFyEl0M6kgtU+GlKH2EFO6F51iUjGK0EglipFEMbaKAR4F\n", "HTgXplt8Aey1SZth3fYQCgB2pD1dywoic74XCkJIU9WTkvdBev+nk3ghdOuJ817HKpEYHI/ot3w+\n", "DKEaCGNoakY662KP2TMFtsLMMT7Sv+c+cw755hxIIODiFmyMSjOrqDExyYwwJAKD4xT1nEvrTwCr\n", "BjMeGLri2aGnxU2oFDFBqzE6S9Ra4rFtoxDRtDSevsjkRabyU0oM9Id5EJGh2Qf2DmMVPavECnGA\n", "NJKIsqZ2Bh2HXCKDiVxXIRYEAqEitSlUYI9MKLDjmJBK7yuISM2kggikaW/j/nPyyzAakFZfxhyt\n", "yAvAtvrzvinMKVWtAsN2DwQOyWrzMpP/6VejWCQArQq2xTPH3yRzPOC0MixHZOjv+T6ZEQMQuL2F\n", "R7lW9ChV8sDQfhjlAqkyCuOUxAiLMdp5QolSTUQB/ZGMVM/5Q4kkQ8Lz0vXkEpM0uFMBHFfUgRKN\n", "nWp3PBmKUWQcujnBhiKxNjPXgV68wlAglgGyKIBUobMwcE+oVS6Yamhg2THqtxc6eYD5g0oeteiM\n", "XBxtFrB5UaavluXkCgAxd0HONDAKmb1zKp2OVNutcrL7v00c6PHG0ZYrzJlERgbbTluQzFUXBhpU\n", "5eQecyIyGvp7nTw4o8L47xUG1tm2vRhRC0mliEkdJUzp0C0kU7DwwAAAIABJREFUXRVNYJA3Rref\n", "CLDNI45CVAo8YtW2k5iYhKZKo/NY8sKxSgwexyodUoSCPDHUtSRDpRChpg0lS9pgz+1D5EWKVGJu\n", "8uCM7QsFVR6MosshNPR/Rt6dkUdGIJkQ0Iu4UjqJaB2H3KooMHqL+KZikiVVm6YhGal2YEcWOv48\n", "Odm27vOMQ5tYGELcISqUgunQMXPt9d+t7kgjWaLNIwyrLXrO2UwVYK8lmnVe0d5A7PpvPDDa6F+3\n", "lm93+okA2zxi3XaUxhKpWwFVrIxougqFQCBS1AAAlshQEkh0RZ+SBxilWZpJNGKJJAtRD0MU07C1\n", "pNu5Jlk+bF+WRhmGApCBQKQCIllyxR5tWSwAASJOSV2m35MgmbJSlswwaUfg7IWANzSR2Fg84p+5\n", "0mnjr5Vsu4mCO4nEeocJ03vOcYj7/s1ZkmR+SukTqYN5b8RTr7jn3E0SmMioJylqiZ5Co6ePcNGM\n", "3x/tjeyY6fZijPZyjK5SAV3lAjor1OLWWabftxU9ibGtI2LSS4bIZDRIOQ/dEmauSpGZa4kIWBg1\n", "F00xseNa01Crw6IQiQyQpE5bCSvDAmmuMxOHnFZYsycDxSLaKyiEEFAqQGgs05mW0N/rfDKTARl/\n", "Sq3EAEk0hC6uWlI13/LGeKNIDdH8s8jHI3ePZL6iWYFB7YFEWgij+AqdHM8lPvj9SKpmAZBkyAzb\n", "rcAt06lRhGXURmJIjMxMS0rSzCjHuL2R31ugCRUzzdK0kVALiRkE4Zivb/KcKdW8Mr5xEKL5T+Th\n", "sfUxhpeAxziCj0ce4w0+Fm2b8LHIY7zBx6JtEz4WeYw3DBWLxpTE8PDw8PDw8PDw8PDw8PDw8Nhc\n", "BJu+i4eHh4eHh4eHh4eHh4eHh8fWhycxPDw8PDw8PDw8PDw8PDw83hTwJIaHh4eHh4eHh4eHh4eH\n", "h8ebAmNKYtx7773YddddsdNOO+Hyyy8fy5ceEnPnzsX8+fOxcOFC7LPPPgCAtWvX4tBDD8XOO++M\n", "ww47DOvXrx/TYzrjjDMwbdo07LnnnuZ3Qx3TpZdeip122gm77ror7rvvvq12jBdffDFmz56NhQsX\n", "YuHChbjnnnu26jF6eLSCj0XDh49FHh5vHHwsGj58LPLweOPgY9Hw4WPROIEaI6RpqnbccUe1fPly\n", "1Wg01IIFC9STTz45Vi8/JObOnavWrFmT+915552nLr/8cqWUUpdddpk6//zzx/SYHnzwQfXoo4+q\n", "PfbYY5PH9MQTT6gFCxaoRqOhli9frnbccUeVZdlWOcaLL75YfeUrXxl03611jB4ezfCxaGTwscjD\n", "442Bj0Ujg49FHh5vDHwsGhl8LBofGDMlxiOPPIJ58+Zh7ty5iOMYJ510Eu64446xevlNQjUNafnx\n", "j3+MU089FQBw6qmn4vbbbx/T4znggAPQ3d09rGO644478MEPfhBxHGPu3LmYN28eHnnkka1yjEDr\n", "cThb6xg9PJrhY9HI4GORh8cbAx+LRgYfizw83hj4WDQy+Fg0PjBmJMaKFSuw3XbbmZ9nz56NFStW\n", "jNXLDwkhBA455BDstddeuPrqqwEAq1atwrRp0wAA06ZNw6pVq7bmIQLY+DG98sormD17trnf1j63\n", "V155JRYsWIAzzzzTyKnG2zF6bLvwsWjL4WORh8eWw8eiLYePRR4eWw4fi7YcPhaNPcaMxBBCjNVL\n", "jRi//vWv8ac//Qn33HMPvvnNb+Khhx7K3S6EGHfHv6lj2lrHe9ZZZ2H58uX4v//7P8yYMQOf/OQn\n", "N3rf8XZOPbYNjOfPnY9FowcfizzGO8bz587HotGDj0Ue4x3j+XPnY9Ho4a0Wi8aMxJg1axZeeukl\n", "8/NLL72UY322JmbMmAEAmDJlCo477jg88sgjmDZtGl599VUAwMqVKzF16tSteYgAsNFjaj63L7/8\n", "MmbNmrVVjnHq1Knm4v3whz9s5Ejj6Rg9tm34WLTl8LHIw2PL4WPRlsPHIg+PLYePRVsOH4vGHmNG\n", "Yuy1115YtmwZ/va3v6HRaOCHP/whjjnmmLF6+Y1iYGAAvb29AID+/n7cd9992HPPPXHMMcdgyZIl\n", "AIAlS5bg2GOP3ZqHCQAbPaZjjjkGN910ExqNBpYvX45ly5YZB9+xxsqVK833t912m3HFHU/H6LFt\n", "w8eiLYePRR4eWw4fi7YcPhZ5eGw5fCzacvhYtBUwli6iP/nJT9TOO++sdtxxR/XFL35xLF96o3j+\n", "+efVggUL1IIFC9Tuu+9ujmvNmjXq4IMPVjvttJM69NBD1bp168b0uE466SQ1Y8YMFcexmj17trr2\n", "2muHPKYvfOELascdd1S77LKLuvfee7fKMV5zzTXqlFNOUXvuuaeaP3++WrRokXr11Ve36jF6eLSC\n", "j0XDh49FHh5vHHwsGj58LPLweOPgY9Hw4WPR+IBQqoVNqYeHh4eHh4eHh4eHh4eHh8c4w5i1k3h4\n", "eHh4eHh4eHh4eHh4eHhsCTyJ4eHh4eHh4eHh4eHh4eHh8aaAJzE8PDw8PDw8PDw8PDw8PDzeFPAk\n", "hoeHh4eHh4eHh4eHh4eHx5sCnsTw8PDw8PDw8PDw8PDw8PB4U+BNSWKcdtpp+OxnP/uGvsaBBx6I\n", "a665ZtSf929/+xuCIICUclj3v//++7HddtuN+nF4eHhsOXws8vDwGA/wscjDw2M8wMcij7HCm5LE\n", "EEJACDGixyRJghNOOAHbb789giDAAw88MOqv8WbBL3/5S8yfPx/d3d2YOHEiDjvsMDz55JMbvf/c\n", "uXNRqVTQ0dGBjo4OHHHEESN+rrVr12LKlCk44IADzO+effZZLFq0CFOnTsWkSZNwxBFH4NlnnzW3\n", "1+t1/Ou//itmzZqFiRMn4uyzz0aapgCARqOBM888E3PnzkVnZycWLlyIe++9dzROj4fHsOFj0ZZh\n", "pLHo4Ycfxj777IPOzk4sWLAAv/71r81td999N/bff390d3djxowZ+MhHPoK+vr7c43/2s5/hne98\n", "J9rb27HddtvhRz/6kbntzjvvxB577IGOjg7st99+eOqpp8xtQ8UiAPjGN76BvfbaC6VSCaeffvpo\n", "nBoPjxHBx6LRwxlnnIEgCPD8889v9D4HHXQQpk6dis7OTrz97W/H1VdfbW579dVXccwxx2DWrFkI\n", "ggAvvvhi7rErVqzAokWLMGnSJGy33Xb4n//5n9ztWZbhggsuwKxZs9DZ2Yl3vvOd2LBhA4BNx6K1\n", "a9fiuOOOQ3t7O+bOnYsbb7xxNE6Jh8ew4WPR6GFTsejFF180uRn/C4IAX/va1wAAK1euHDIW/fu/\n", "/zt23nlnE8e+973vmdvWrFmD/fbbD5MnT0ZXVxcWLlyI22+/Pff4z3/+89huu+0wYcIEHHTQQbn9\n", "21NPPYX3ve99mDBhAnbaaadBjx0NvClJDABQSo34Me95z3vw/e9/H9OnT98mPvwbw+6774577rkH\n", "69atw6pVq7Bw4UKcccYZG72/EAJ33XUXent70dvbmyMLhvtc559/Pnbbbbfced+wYQOOPfZYPPvs\n", "s1i1ahX22WcfLFq0yNx+2WWX4dFHH8UTTzyBZ599Fo8++iguueQSAECappgzZw4efPBB9PT04JJL\n", "LsGJJ56IF154YTROkYfHsOFj0eZjJLFo7dq1OProo3H++edjw4YN+NSnPoWjjz4a69evBwD09PTg\n", "wgsvxMqVK/HUU09hxYoVOO+888zjn3zySZx88sm49NJL0dPTg7/85S/4u7/7OwDAsmXLsHjxYlx1\n", "1VXYsGEDjj76aBxzzDGmGjNULAKAWbNm4bOf/eyQcdTD442Gj0Vbjl/96ld4/vnnN3kurrjiCqxY\n", "sQI9PT1YsmQJzjnnHDzzzDMAgCAIcNRRR+GWW25p+djFixdjxx13xGuvvYa7774bn/70p3H//feb\n", "2y+66CL89re/xW9/+1v09PTg+9//PkqlEoBNx6Kzzz4bpVIJr732Gm644QacddZZQxLDHh5vBHws\n", "2nIMJxbNmTPH5Ga9vb147LHHEAQBjj/+eABAGIZDxqL29nbcddddJo79y7/8C37zm9+Y26699lq8\n", "9tpr2LBhAy6++GKceOKJpjj04x//GN/+9rfx0EMPYe3atdh3331xyimnAKAcbdGiRTjmmGOwbt06\n", "XHXVVVi8eDGWLVs2mqfozUFi/OlPf8I73/lOdHZ24qSTTkKtVhvxc8RxjE984hPYb7/9EIbhiB77\n", "3HPP4X3vex8mT56MKVOmYPHixYYVB0ip8OUvfxnz589HR0cHzjzzTKxatQpHHnkkurq6cOihh5qN\n", "NuOaa67BrFmzMHPmTHzlK18xv69WqzjttNMwceJE7L777vj973+fe9xll12GefPmobOzE7vvvvtm\n", "MVtTp07FrFmzAABSSgRBgBkzZgz5mI0FpOE818MPP4wnnngCp59+eu559t57b5x++umYMGECoijC\n", "ueeei2eeeQbr1q0DANx1110455xzMGHCBEyePBmf+MQncO211wIAKpUKLrroIsyZMwcA8A//8A/Y\n", "fvvt8eijj474fHh4DBc+FlmMdSx6+OGHMX36dBx//PEQQuDkk0/GlClTcOuttwIAPvjBD+Kwww5D\n", "qVTChAkT8JGPfCSn1Ljkkkvw0Y9+FIcffjiCIEB3dzd22GEHAMDSpUtxwAEH4N3vfjeCIMD555+P\n", "FStWmGrQULEIAI477jhTWfXwGAv4WGQxGrEIoI33Jz7xCVx55ZWbTML23HNPxHFsfm5vb0dnZycA\n", "imsf/ehHsddeew16XF9fHx544AF8+tOfRhiGmD9/Pk444QQTT9atW4evf/3ruPrqq41MfbfddkOx\n", "WAQwdCzq7+/Hrbfeis9//vOoVCrYb7/9sGjRolx11cNjtOFjkcXWiEUulixZgve+970mNxoqFgHA\n", "xRdfjJ133hkAsM8+++CAAw4wJEaxWMQuu+xi2muCIMDkyZNRKBQAAE888QT2339/zJ07F0EQ4OST\n", "TzaE6dNPP42VK1fi3HPPhRACBx10EPbbb79Rj0XjnsRoNBo49thjceqpp2LdunX4p3/6J9xyyy2G\n", "mXrxxRfR3d290X833XTTqBzHZz7zGVPhe+mll3DxxReb24QQuPXWW/Hzn/8czzzzDO666y4ceeSR\n", "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\n", "lSux2267YcaMGTj33HPxyCOPYObMmeaY161bh8MOOwzHHnss/vM//zP3XKVSCVdeeSVefvll/PWv\n", "f8XEiRNzfV1KKZx55plYvXo1brnllhH30Xl4jAQ+Fm39WPSe97wHjzzyCNasWYPrr78eTz/9NPbZ\n", "Zx9z+5/+9CcsWrQI1113HQ466KDcY+fPnz/keTj++OPx2GOP4fXXX8fFF1+Mv/3tb9h7770BbDoW\n", "MbwZmcdYwMei0Y9Fv/jFL3DeeedhxowZ5nX33XffYcvdkyRBW1vbsO47Z84c3HnnnXjttdfwm9/8\n", "BqtXrzZxbGNxiv+2Q8WinXfeGWma4q9//at53J///OdB8nAPj9GCj0XjIxZVq1X87//+72a1klx0\n", "0UVYunQp7rvvPrS3tw953zRNDUly77334oMf/CBmzpyJIAhMSxFPdttzzz1x//334/XXX8c999yD\n", "5557LrdfGw1Eo/psbwDe/e53I4oiXHHFFTjrrLNw55134ve//z0OPvhgANaZdTio1+vmw1Sv11Gr\n", "1Yzj81Do6+tDV1cXOjs7sWLFCnzpS1/a/Dekcckll+Cqq67C888/j+uuuw433HADAODEE0/EpZde\n", "ine9613o6+vDlVdeaR7T398PIQQmT54MKSWuv/76XH/RAQccMKxzcdttt2H33XfHvHnzsGbNGvzb\n", "v/0bjjrqqJaJw0svvYQXX3wRe++9N6SUuPLKK83YnU0911FHHZWbFnLTTTfhBz/4AX784x9DCIGe\n", "nh4cfvjh2H///fHFL35x0Gu/8sorACho/O53v8Mll1ySM9M766yz8PTTT+NnP/vZsAkYD4/NhY9F\n", "WzcWAURS7LHHHqhWq7jwwgsxZ84cHHrooQCAxx9/HEcccQS+8Y1v4Kijjhr02NNPPx2f//znsXjx\n", "YkybNg2XXXYZjj76aHP7H//4R7zjHe/A2rVrcfbZZ2PRokXG8GpTsSjLMiRJgjRNkWUZ6vU6oijy\n", "xKrHGwIfi0Y/Fi1btswkPkopzJgxA3fddVdLUuGZZ57B888/jwMPPBBRFOGHP/wh/vCHP+RiQq1W\n", "M6NPa7Va7rw+/fTTmDVrForFIm6++Wb89Kc/xdNPPw0A2HHHHXHAAQfgC1/4Aq644go899xz+OEP\n", "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\n", "mJtMBcAFmf0AAAAASUVORK5CYII=\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "# a code cell \n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.colors import LightSource\n", "\n", "# example showing how to make shaded relief plots\n", "# like Mathematica\n", "# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html)\n", "# or Generic Mapping Tools\n", "# (http://gmt.soest.hawaii.edu/gmt/doc/gmt/html/GMT_Docs/node145.html)\n", "\n", "# test data\n", "d= 1\n", "def maltc(ax, lambd=1, n=1):\n", " I0=1\n", " I= lambda theta,d : I0*(sin(2*theta)*sin(pi*n*d/lambd))**2\n", " X,Y=np.mgrid[-5:5:0.05,-5:5:0.05]\n", " Z=np.sqrt(X**2+Y**2)+np.sin(X**2+Y**2)\n", " \n", " r= np.sqrt(X**2+Y**2)\n", " theta = np.angle(X+1.0j*Y)\n", " \n", " Iv= np.vectorize(I)\n", " Z = Iv(r,theta)\n", " \n", " # create light source object.\n", " #ls = LightSource(azdeg=0,altdeg=65)\n", " # shade data, creating an rgb array.\n", " #rgb = ls.shade(Z,plt.cm.copper)\n", " # plot un-shaded and shaded images.\n", " #plt.figure(figsize=(12,5))\n", " #plt.subplot(121)\n", " ax.imshow(Z,cmap=plt.cm.copper)\n", " ax.set_title('d=%d lambda=%f'%(d,lambd))\n", " \n", "fig, (axes) = plt.subplots(3,4)\n", "fig.set_figheight(10)\n", "fig.set_figwidth(20)\n", "\n", "flatten = [item for sublist in axes for item in sublist]\n", "\n", "for ax,l in zip(flatten,range(len(flatten))):\n", " maltc(ax,lambd=(l+1)*pi/8.0)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "stdout\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "stderr\n" ] } ], "source": [ "from __future__ import print_function\n", "import sys\n", "print('stdout')\n", "print('stderr',file=sys.stderr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
This is tableHead
but thisis the
bodyof
Thetable
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/tools/tests/Confined Output.ipynb000066400000000000000000000542051477474304100216750ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Test notebook for overflowing content" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "markdown image:\n", "\n", "\n", "\n", "unconfined markdown image:\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from IPython.display import Image, IFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overflow image in HTML (non-embedded)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(url=\"http://placehold.it/800x200.png\", embed=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overflow image:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nLzkAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(url=\"http://placehold.it/800x200.png\", embed=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overflow, unconfined" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nLzkAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 4, "metadata": { "image/png": { "unconfined": true } }, "output_type": "execute_result" } ], "source": [ "Image(url=\"http://placehold.it/800x200.png\", embed=True, unconfined=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overflow with explicit height, width (retina):" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\nSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMP\nFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEc\nITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgA\nyAcIAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMC\nBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn\nKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeY\nmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5\n+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwAB\nAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpD\nREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip\nqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMR\nAD8A9MooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKjmnit03yuEX3oAkoqC3vILrd5L7tuM8EYz9anoAKKZJKkMZeRgqjqTVA65aBsASEeo\nXigDSoqK3uYbpN8Lhh39RUtABRTJZo4IzJK4VR3NZ/8AblpuxiXHrt4/nQBp0VHBcRXEe+Jwy+3a\npKACimu6xoXdgqjkk1ntrlorYHmMPULx+tAGlRUNvdw3SloXDY6juKmoAKKKKACiiigAooooAKKK\nKACiqtzqFtaHbI+X/uryagj1u0dsHzE92Xj9KANGikVldQykFTyCKWgAoqvc3kFoAZXwT0Uck1Vj\n1u0dsHzE92Xj9KANKikVldQykFTyCO9LQAUVFcXMNqm+Zwo7epqkuuWhbBEgHqV4/nQBpUUyOVJo\nw8bBlPQin0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF\nFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU\nUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR\nQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA\nBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF\nFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU\nUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBnahqqWhMSLulx3\n6CufnnmuXMsrFucZ7D2rqLiwt7qVJJVJK8cHr9az9dRY7aBUUKoY4AGB0oAb4e/5ef8AgP8AWtus\nTw9/y8/8B/rW3QBzWsXTTXhiB+SPgD37mprfRPOsxI0hWRhlRjj2zVLUomi1CYN/ExYfQ810VpdR\nPYJKXUKqgNk9CKAObtZ5LK7D8jacOvqO4rrgQQCOhrjnzc3bFF5kckD6mutY+TbE9difyFAHOard\nm5u2UH93Gdqj37mrKaEzWgcyETEZC44+lZtqnm3kKn+Jxn867CgDlNPums7tSSQhO1x7V1dclqKe\nXqE6jj5s/nzXT2j+ZZwuTklBn64oAxNbuzJcfZ1PyJ973NLZ6N9otRLJIUZhlQB296zp2Mt1I3dn\nJ/WuwRQiKg6KMCgDkopJbC9z0ZGww9R3FdYjiRFdTlWAIPtXN60mzUWP95Qf6f0rZ0l9+mw5PIyP\nyNAF2iimTSeTBJJjOxS2PXAoAfRWJ/wkP/Tr/wCRP/rVqTXSRWZueq7dwHrnpQBPRWJ/wkP/AE6/\n+RP/AK1bdABVXULk2lm8i/e6L9atUjKGUqwBB6g0Acna2st/cFQfd3POKuX+ji2tzNFIWC/eDD9a\n3IbeG3DCKMIGOTiqWtXKxWZhzl5OAPQetAFLQ7plmNsxyjAlR6GtyWRYYXkbooJNc7osZfUVYdEU\nk/lj+tautPs05h/eYD+v9KAMEmXUL3k5eRvy/wD1VdvtH+y23nRyF9v3gR+opuhJuvmY/wAKEj9K\n37hPMt5U/vKR+lAGNod2RIbVj8rcp7HvW6SACT0FchZP5d9A2f4xn6V02oP5enzsP7hH58UAc5d3\nD314WGTk7UX27Vdn0QxWhkWQtIoyy44PriqulJv1KEHoCT+QrqetAHN6PdmC6ETH93Jxj0Paukrj\nXBguWA4KPx+BrsQQQCOhoAWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA\nooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi\niigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK\nKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo\nAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA\nooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi\niigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKx9\nf/1EP+8f5VsVj6//AKiH/eP8qAGeHv8Al5/4D/WtusTw9/y8/wDAf61t0AYmuXEBIh2Bphzuz932\nrKS0uJITKkLlB3Apru1xclmPzO3P4muwRFjjVFGFUYAoA5vSLiCG6AlQbm4V8/drfvP+PG4/65t/\nKua1GJYdQmRRgZyB9Rn+tdDEzXGkgnlniIPucYoA57Tv+QjB/v11lcjYttvoD/00H8666gDltX/5\nCk3/AAH/ANBFb+m/8g6D/drntTbdqU5/2sfkMV0diuywgH+wD+lAHKRczpn+8P512dca4MVwwPVW\n/ka7IHIyKAOd17/j+T/rmP5mtHRf+Qcv+8azNcbdqGP7qAf1/rWro67dNjPqSf1oAv010WSNkYZV\ngQR7U6igDndW05LXZJCCIzwRnODUEl6X0uK2ycqxz9O38/0rf1ExDT5vN+7t4Hv2/WuUGMjPTvig\nDY0vS454DNcKSGPyDOOPWt2o4DGbeMxf6vaNv0qSgAooooAhurlLWBpZOg6D1PpXKzzSXdwZH5dj\ngAfyFWNUvTd3JCn90nC+/vV/RtP2qLqUfMfuA9h60AXNNshZ2+G5kflj/SoNe/48U/66D+RrUrN1\ntd2n5/uuD/T+tAFLQP8Aj4m/3B/Ot/rXPaC2LyRfWP8AqK35W2ROx7KTQBx0P+vj/wB4fzrptX/5\nBc3/AAH/ANCFc5arvu4V9XUfrXS6mu7TZwP7ufyOaAMTRf8AkIr/ALprpq5fR226nF7gj9K6igDk\nLzi+uP8Aro3866yH/UR/7o/lXIznzLqVh/E5I/OuwRdqKvoMUALRRRQAUUUUAFFFFABRRRQAUUUU\nAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA\nUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR\nRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF\nFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU\nAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA\nUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR\nRRQAUUUUAFFFFABRRRQAUUUUANeRIkLyMFUdSTxWLrVzDPDEIpUchjnac1qX1u11ZyQoQGbGCenU\nGsX+wbr/AJ6Q/mf8KAH6JcQwef5sipnbjccZ61vKwZQykFSMgjvXPf2Ddf8APSH8z/hW9bxmK2ij\nYglECnHsKAOVvIWtrySPphsqfbtXRQ6nbSWwlaVVIHzKTyD9KL/T475Bk7ZF+62P0rHOh3YbAMZH\nruoAqXErXd48iqcyN8o/lXV28Xk28cX91QKo6fpK2jebIweXtjotaVAHJXkDWl66DgA5U+3at1NX\ntjaeazjeBzH3zU17YRXsYD/K4+647Vk/2Bcbv9bFt9ec0AUIo3vbwL1aRsk+nqa64AKAAMAcCqlj\np0dipIO+Q9WI/lVygDmNXtzBfO2Plk+Yf1rUstUtzZL50gV0GCD1OPSrl1aR3kJjkHuCOoNYzaBO\nG+SaMr6nINAFCeR729Z1UlpG+UfoK6uCIQQRxDoigVTsNKjs28xm8yXscYA+laFABTXdI0LuwVR1\nJNOqvfW7XVnJChAZsYJ6dQaAMTWL1biVYomDRpzkdzSTafs0iO4x+8zub6Hp/T86kj0GfzF8ySLZ\nn5sE5x+VbskSywtER8rLtoAxdGv0iRoJnCqPmUsfzFbisGUMpBBGQR3rnv7Buv8AnpD+Z/wregjM\nVvFGSCUQKSPYUASVR1a4+z2LbThn+Uf1q9WfqlhLfLEI3UbCchu+aAMKxjikulE7qkY5O44z7V0n\n2+0H/LxF/wB9Vjf2Ddf89IfzP+FH9g3X/PSH8z/hQBuxXMEzFYpUdgM4U5pLuD7TaSRd2HH17VQ0\nzTJrK5aSRoyChX5SfUe3tWrQByVnObO9WRgflOGHt3rY1LU4DZtHDIHeQY47Dvmn3+kpduZY28uQ\n9eODVJNAmLfvJowv+zkmgCLRbcy3vmEfLGM/j2ropEEkbI3RgQajtraO1hEUY4HUnqT61NQByHz2\nV6Mj54n/ADreuNWt1sy8UgMjD5V7g+9Pv9MjvcNnZKON2Ov1rNXQJ93zSxhfUZJoAqabbm4vo1x8\nqnc30FdXVazso7KLYnLH7zHqas0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF\nABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA\nFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU\nUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR\nRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//2Q==\n", "text/plain": [ "" ] }, "execution_count": 5, "metadata": { "image/jpeg": { "height": 100, "width": 900 } }, "output_type": "execute_result" } ], "source": [ "Image(url=\"http://placehold.it/1800x200.jpg\", embed=True, retina=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overflowing IFrame:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "IFrame(src=\"https://ipython.org\", width=900, height=400)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overflowing table:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234567891011121314
0 column column column column column column column column column column column column column column column
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 \\\n", "0 column column column column column column column column column \n", "\n", " 9 10 11 12 13 14 \n", "0 column column column column column column " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "pd.DataFrame([['column'] * 15])" ] } ], "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/tools/tests/Markdown Pandoc Limitations.ipynb000066400000000000000000002462141477474304100241160ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**WARNING: This document will not render correctly using nbviewer or nbconvert. To render this notebook correctly, open in `IPython Notebook` and run `Cell->Run All` from the menu bar.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The IPython Notebook allows Markdown, HTML, and inline LaTeX in *Mardown Cells*. The inline LaTeX is parsed with [MathJax](http://www.mathjax.org/) and Markdown is parsed with [marked](https://github.com/chjj/marked). Any inline HTML is left to the web browser to parse. NBConvert is a utility that allows users to easily convert their notebooks to various formats. Pandoc is used to parse markdown text in NBConvert. Since what the notebook web interface supports is a mix of Markdown, HTML, and LaTeX, Pandoc has trouble converting notebook markdown. This results in incomplete representations of the notebook in nbviewer or a compiled Latex PDF.\n", "\n", "This isn't a Pandoc flaw; Pandoc isn't designed to parse and convert a mixed format document. Unfortunately, this means that Pandoc can only support a subset of the markup supported in the notebook web interface. This notebook compares output of Pandoc to the notebook web interface.\n", "\n", "**Changes:**\n", "\n", "05102013\n", "\n", " * heading anchors\n", " * note on remote images\n", "\n", "06102013\n", "\n", " * remove strip_math_space filter\n", " * add lxml test\n", " \n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Utilities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define functions to render Markdown using the notebook and Pandoc." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from IPython.nbconvert.utils.pandoc import pandoc\n", "from IPython.display import HTML, Javascript, display\n", "\n", "from IPython.nbconvert.filters import citation2latex, strip_files_prefix, \\\n", " markdown2html, markdown2latex\n", "\n", "def pandoc_render(markdown):\n", " \"\"\"Render Pandoc Markdown->LaTeX content.\"\"\"\n", " \n", " ## Convert the markdown directly to latex. This is what nbconvert does.\n", " #latex = pandoc(markdown, \"markdown\", \"latex\")\n", " #html = pandoc(markdown, \"markdown\", \"html\", [\"--mathjax\"])\n", " \n", " # nbconvert template conversions\n", " html = strip_files_prefix(markdown2html(markdown))\n", " latex = markdown2latex(citation2latex(markdown))\n", " display(HTML(data=\"
\" \\\n", " \"
NBConvert Latex Output
\" \\\n", " \"
\" + latex + \"
\"\\\n", " \"
\" \\\n", " \"
\" \\\n", " \"
\" \\\n", " \"
NBViewer Output
\" \\\n", " \"
\" + html + \"
\" \\\n", " \"
\"))\n", " javascript = \"\"\"\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n", "\"\"\"\n", " display(Javascript(data=javascript))\n", "\n", "def notebook_render(markdown):\n", " javascript = \"\"\"\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\"\"\" + markdown.replace(\"\\\\\", \"\\\\\\\\\").replace(\"'\", \"\\'\").replace(\"\\n\", \"\\\\n\") + \"\"\"');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n", "\"\"\"\n", " display(Javascript(data=javascript))\n", "\n", " \n", "def pandoc_html_render(markdown):\n", " \"\"\"Render Pandoc Markdown->LaTeX content.\"\"\"\n", " \n", " # Convert the markdown directly to latex. This is what nbconvert does.\n", " latex = pandoc(markdown, \"markdown\", \"latex\")\n", " \n", " # Convert the pandoc generated latex to HTML so it can be rendered in \n", " # the web browser.\n", " html = pandoc(latex, \"latex\", \"html\", [\"--mathjax\"])\n", " display(HTML(data=\"
HTML Pandoc Output
\" \\\n", " \"
\" + html + \"
\"))\n", " return html\n", " \n", "def compare_render(markdown):\n", " notebook_render(markdown)\n", " pandoc_render(markdown)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Outputs" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LXML found!\n" ] } ], "source": [ "try:\n", " import lxml\n", " print 'LXML found!'\n", "except:\n", " print 'Warning! No LXML found - the old citation2latex filter will not work'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## General markdown" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Heading level 6 is not supported by Pandoc." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n\\n# Heading 1 \\n## Heading 2 \\n### Heading 3 \\n#### Heading 4 \\n##### Heading 5 \\n###### Heading 6');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\section{Heading 1}\n",
       "\n",
       "\\subsection{Heading 2}\n",
       "\n",
       "\\subsubsection{Heading 3}\n",
       "\n",
       "\\paragraph{Heading 4}\n",
       "\n",
       "\\subparagraph{Heading 5}\n",
       "\n",
       "Heading 6
NBViewer Output

Heading 1

\n", "

Heading 2

\n", "

Heading 3

\n", "

Heading 4

\n", "
Heading 5
\n", "
Heading 6
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "\n", "# Heading 1 \n", "## Heading 2 \n", "### Heading 3 \n", "#### Heading 4 \n", "##### Heading 5 \n", "###### Heading 6\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Headers aren't recognized by (Pandoc on Windows?) if there isn't a blank line above the headers." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n# Heading 1 \\n## Heading 2 \\n### Heading 3 \\n#### Heading 4 \\n##### Heading 5 \\n###### Heading 6 ');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\section{Heading 1}\n",
       "\n",
       "\\subsection{Heading 2}\n",
       "\n",
       "\\subsubsection{Heading 3}\n",
       "\n",
       "\\paragraph{Heading 4}\n",
       "\n",
       "\\subparagraph{Heading 5}\n",
       "\n",
       "Heading 6
NBViewer Output

Heading 1

\n", "

Heading 2

\n", "

Heading 3

\n", "

Heading 4

\n", "
Heading 5
\n", "
Heading 6
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] } ], "source": [ "compare_render(r\"\"\"\n", "# Heading 1 \n", "## Heading 2 \n", "### Heading 3 \n", "#### Heading 4 \n", "##### Heading 5 \n", "###### Heading 6 \"\"\")\n", "\n", "print(\"\\n\"*10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If internal links are defined, these will not work in nbviewer and latex as the local link is not existing." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n[Link2Heading](http://127.0.0.1:8888/0a2d8086-ee24-4e5b-a32b-f66b525836cb#General-markdown)\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\href{http://127.0.0.1:8888/0a2d8086-ee24-4e5b-a32b-f66b525836cb\\#General-markdown}{Link2Heading}
NBViewer Output
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "[Link2Heading](http://127.0.0.1:8888/0a2d8086-ee24-4e5b-a32b-f66b525836cb#General-markdown)\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Basic Markdown bold and italic works." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nThis is Markdown **bold** and *italic* text.\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
This is Markdown \\textbf{bold} and \\emph{italic} text.
NBViewer Output

This is Markdown bold and italic text.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "This is Markdown **bold** and *italic* text.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nested lists work as well" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n- li 1\\n- li 2\\n 1. li 3\\n 1. li 4\\n- li 5\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\begin{itemize}\n",
       "\\itemsep1pt\\parskip0pt\\parsep0pt\n",
       "\\item\n",
       "  li 1\n",
       "\\item\n",
       "  li 2\n",
       "\n",
       "  \\begin{enumerate}\n",
       "  \\def\\labelenumi{\\arabic{enumi}.}\n",
       "  \\itemsep1pt\\parskip0pt\\parsep0pt\n",
       "  \\item\n",
       "    li 3\n",
       "  \\item\n",
       "    li 4\n",
       "  \\end{enumerate}\n",
       "\\item\n",
       "  li 5\n",
       "\\end{itemize}
NBViewer Output
    \n", "
  • li 1
  • \n", "
  • li 2\n", "
      \n", "
    1. li 3
    2. \n", "
    3. li 4
    4. \n", "
  • \n", "
  • li 5
  • \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "- li 1\n", "- li 2\n", " 1. li 3\n", " 1. li 4\n", "- li 5\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unicode support" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nüberschuß +***^°³³ α β θ\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
überschuß +\\emph{*}\\^{}°³³ α β θ
NBViewer Output

überschuß +*^°³³ α β θ

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(ur\"\"\"\n", "überschuß +***^°³³ α β θ\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandoc may produce invalid latex, e.g \\sout is not allowed in headings" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n\\n# Heading 1 ~~strikeout~~\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\section{Heading 1 \\sout{strikeout}}
NBViewer Output

Heading 1 strikeout

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "\n", "# Heading 1 ~~strikeout~~\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Horizontal lines work just fine" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nabove\\n\\n--------\\n\\nbelow\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
above\n",
       "\n",
       "\\begin{center}\\rule{3in}{0.4pt}\\end{center}\n",
       "\n",
       "below
NBViewer Output

above

\n", "
\n", "

below

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "above\n", "\n", "--------\n", "\n", "below\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extended markdown of pandoc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(maybe we should deactivate this) " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nThis is Markdown ~subscript~ and ^superscript^ text.\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
This is Markdown \\textsubscript{subscript} and\n",
       "\\textsuperscript{superscript} text.
NBViewer Output

This is Markdown subscript and superscript text.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "This is Markdown ~subscript~ and ^superscript^ text.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No space before underline behaves inconsistent (Pandoc extension: intraword_underscores - deactivate?)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nThis is Markdown not_italic_.\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
This is Markdown not\\_italic\\_.
NBViewer Output

This is Markdown not_italic_.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "This is Markdown not_italic_.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandoc allows to define tex macros which are respected for all output formats, the notebook not. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n\\\\newcommand{\\\\tuple}[1]{\\\\langle #1 \\\\rangle}\\n\\n$\\\\tuple{a, b, c}$\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\newcommand{\\tuple}[1]{\\langle #1 \\rangle}\n",
       "\n",
       "$\\tuple{a, b, c}$
NBViewer Output

\\(\\langle a, b, c \\rangle\\)

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "\\newcommand{\\tuple}[1]{\\langle #1 \\rangle}\n", "\n", "$\\tuple{a, b, c}$\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When placing the \\newcommand inside a math environment it works within the notebook and nbviewer, but produces invalid latex (the newcommand is only valid in the same math environment)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n$\\\\newcommand{\\\\foo}[1]{...:: #1 ::...}$\\n$\\\\foo{bar}$\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
$\\newcommand{\\foo}[1]{...:: #1 ::...}$ $\\foo{bar}$
NBViewer Output

\\(\\newcommand{\\foo}[1]{...:: #1 ::...}\\) \\(\\foo{bar}\\)

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "$\\newcommand{\\foo}[1]{...:: #1 ::...}$\n", "$\\foo{bar}$\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## HTML or LaTeX injections" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Raw HTML gets dropped entirely when converting to $\\LaTeX$." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nThis is HTML bold and italic text.\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
This is HTML bold and italic text.
NBViewer Output

This is HTML bold and italic text.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "This is HTML bold and italic text.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Same for something like center" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n
Center aligned
\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
Center aligned
NBViewer Output
\n", "Center aligned\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "
Center aligned
\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Raw $\\LaTeX$ gets droppen entirely when converted to HTML. (I don't know why the HTML output is cropped here???)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nThis is \\\\LaTeX \\\\bf{bold} and \\\\emph{italic} text.\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
This is \\LaTeX \\bf{bold} and \\emph{italic} text.
NBViewer Output

This is

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "This is \\LaTeX \\bf{bold} and \\emph{italic} text.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A combination of raw $\\LaTeX$ and raw HTML" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n**foo** $\\\\left( \\\\sum_{k=1}^n a_k b_k \\\\right)^2 \\\\leq$ b\\\\$ar $$test$$ \\n\\\\cite{}\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\textbf{foo} $\\left( \\sum_{k=1}^n a_k b_k \\right)^2 \\leq$ b\\$ar \\[test\\]\n",
       "\\cite{}
NBViewer Output

foo \\(\\left( \\sum_{k=1}^n a_k b_k \\right)^2 \\leq\\) b$ar \\[test\\]

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "**foo** $\\left( \\sum_{k=1}^n a_k b_k \\right)^2 \\leq$ b\\$ar $$test$$ \n", "\\cite{}\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "HTML tables render in the notebook, but not in Pandoc." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n\\n \\n \\n \\n \\n \\n \\n \\n \\n
ab
cd
\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
a\n",
       "\n",
       "b\n",
       "\n",
       "c\n",
       "\n",
       "d
NBViewer Output
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "a\n", "\n", "b\n", "
\n", "c\n", "\n", "d\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ab
cd
\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead, Pandoc supports simple ascii tables. Unfortunately marked.js doesn't support this, and therefore it is not supported in the notebook." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n+---+---+\\n| a | b |\\n+---+---+\\n| c | d |\\n+---+---+\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\begin{longtable}[c]{@{}ll@{}}\n",
       "\\hline\\noalign{\\medskip}\n",
       "\\begin{minipage}[t]{0.06\\columnwidth}\\raggedright\n",
       "a\n",
       "\\end{minipage} & \\begin{minipage}[t]{0.06\\columnwidth}\\raggedright\n",
       "b\n",
       "\\end{minipage}\n",
       "\\\\\\noalign{\\medskip}\n",
       "\\begin{minipage}[t]{0.06\\columnwidth}\\raggedright\n",
       "c\n",
       "\\end{minipage} & \\begin{minipage}[t]{0.06\\columnwidth}\\raggedright\n",
       "d\n",
       "\\end{minipage}\n",
       "\\\\\\noalign{\\medskip}\n",
       "\\hline\n",
       "\\end{longtable}
NBViewer Output
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "

a

b

c

d

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "+---+---+\n", "| a | b |\n", "+---+---+\n", "| c | d |\n", "+---+---+\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An alternative to basic ascii tables is pipe tables. Pipe tables can be recognized by Pandoc and are supported by marked, hence, this is the **best way to add tables**." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n|Left |Center |Right|\\n|:----|:-----:|----:|\\n|Text1|Text2 |Text3|\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\begin{longtable}[c]{@{}lcr@{}}\n",
       "\\hline\\noalign{\\medskip}\n",
       "Left & Center & Right\n",
       "\\\\\\noalign{\\medskip}\n",
       "\\hline\\noalign{\\medskip}\n",
       "Text1 & Text2 & Text3\n",
       "\\\\\\noalign{\\medskip}\n",
       "\\hline\n",
       "\\end{longtable}
NBViewer Output
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
LeftCenterRight
Text1Text2Text3
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "|Left |Center |Right|\n", "|:----|:-----:|----:|\n", "|Text1|Text2 |Text3|\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandoc recognizes cell alignment in simple tables. Since marked.js doesn't recognize ascii tables, it can't render this table." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nRight Aligned Center Aligned Left Aligned\\n------------- -------------- ------------\\n Why does this\\n actually work? Who\\n knows ...\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\begin{longtable}[c]{@{}lll@{}}\n",
       "\\hline\\noalign{\\medskip}\n",
       "Right Aligned & Center Aligned & Left Aligned\n",
       "\\\\\\noalign{\\medskip}\n",
       "\\hline\\noalign{\\medskip}\n",
       "Why & does & this\n",
       "\\\\\\noalign{\\medskip}\n",
       "actually & work? & Who\n",
       "\\\\\\noalign{\\medskip}\n",
       "knows & \\ldots{} &\n",
       "\\\\\\noalign{\\medskip}\n",
       "\\hline\n",
       "\\end{longtable}
NBViewer Output
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Right AlignedCenter AlignedLeft Aligned
Whydoesthis
actuallywork?Who
knows...
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n", "\n" ] } ], "source": [ "compare_render(r\"\"\"\n", "Right Aligned Center Aligned Left Aligned\n", "------------- -------------- ------------\n", " Why does this\n", " actually work? Who\n", " knows ...\n", "\"\"\")\n", "\n", "print(\"\\n\"*5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Images" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Markdown images work on both. However, remote images are not allowed in $\\LaTeX$. Maybe add a preprocessor to download these.\n", "The alternate text is displayed in nbviewer next to the image." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n![Alternate Text](https://ipython.org/_static/IPy_header.png)\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\begin{figure}[htbp]\n",
       "\\centering\n",
       "\\includegraphics{https://ipython.org/_static/IPy_header.png}\n",
       "\\caption{Alternate Text}\n",
       "\\end{figure}
NBViewer Output
\n", "\"Alternate

Alternate Text

\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "![Alternate Text](https://ipython.org/_static/IPy_header.png)\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "HTML Images only work in the notebook." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
NBViewer Output

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Math" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Simple inline and displaystyle maths work fine" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nMy equation:\\n$$ 5/x=2y $$\\n\\nIt is inline $ 5/x=2y $ here.\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
My equation: \\[ 5/x=2y \\]\n",
       "\n",
       "It is inline \\$ 5/x=2y \\$ here.
NBViewer Output

My equation: \\[ 5/x=2y \\]

\n", "

It is inline $ 5/x=2y $ here.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "My equation:\n", "$$ 5/x=2y $$\n", "\n", "It is inline $ 5/x=2y $ here.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the first \\$ is on a new line, the equation is not captured by md2tex, if both \\$s are on a new line md2html fails (Note the raw latex is dropped) but the notebook renders it correctly." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n$5 \\\\cdot x=2$\\n\\n$\\n5 \\\\cdot x=2$\\n\\n$\\n5 \\\\cdot x=2\\n$\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
$5 \\cdot x=2$\n",
       "\n",
       "\\$ 5 \\cdot x=2\\$\n",
       "\n",
       "\\$ 5 \\cdot x=2 \\$
NBViewer Output

\\(5 \\cdot x=2\\)

\n", "

$ 5 x=2$

\n", "

$ 5 x=2 $

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "$5 \\cdot x=2$\n", "\n", "$\n", "5 \\cdot x=2$\n", "\n", "$\n", "5 \\cdot x=2\n", "$\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MathJax permits some $\\LaTeX$ math constructs without \\$s, of course these raw $\\LaTeX$ is stripped when converting to html.\n", "Moreove, the & are escaped by the lxml parsing [#4251](https://github.com/ipython/ipython/issues/4251)." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n\\\\begin{align}\\na & b\\\\\\\\\\nd & c\\n\\\\end{align}\\n\\n\\\\begin{eqnarray}\\na & b \\\\\\\\\\nc & d\\n\\\\end{eqnarray}\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
\\begin{align}\n",
       "a &amp; b\\\\\n",
       "d &amp; c\n",
       "\\end{align}\n",
       "\n",
       "\\begin{eqnarray}\n",
       "a &amp; b \\\\\n",
       "c &amp; d\n",
       "\\end{eqnarray}
NBViewer Output
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "\\begin{align}\n", "a & b\\\\\n", "d & c\n", "\\end{align}\n", "\n", "\\begin{eqnarray}\n", "a & b \\\\\n", "c & d\n", "\\end{eqnarray}\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is another lxml issue, [#4283](https://github.com/ipython/ipython/issues/4283)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\n1<2 is true, but 3>4 is false.\\n\\n$1<2$ is true, but $3>4$ is false.\\n\\n1<2 it is even worse if it is alone in a line.\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
14 is false.\n",
       "\n",
       "$14$ is false.\n",
       "\n",
       "1
NBViewer Output

1<2 is true, but 3>4 is false.

\n", "

\\(1<2\\) is true, but \\(3>4\\) is false.

\n", "

1<2 it is even worse if it is alone in a line.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "1<2 is true, but 3>4 is false.\n", "\n", "$1<2$ is true, but $3>4$ is false.\n", "\n", "1<2 it is even worse if it is alone in a line.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Listings, and Code blocks" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nsome source code\\n\\n```\\na = \"test\"\\nprint(a)\\n```\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
some source code\n",
       "\n",
       "\\begin{verbatim}\n",
       "a = \"test\"\n",
       "print(a)\n",
       "\\end{verbatim}
NBViewer Output

some source code

\n", "
a = "test"\n",
       "print(a)
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "some source code\n", "\n", "```\n", "a = \"test\"\n", "print(a)\n", "```\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Language specific syntax highlighting by Pandoc requires additional dependencies to render correctly." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "var mdcell = new IPython.MarkdownCell();\n", "mdcell.create_element();\n", "mdcell.set_text('\\nsome source code\\n\\n```python\\na = \"test\"\\nprint(a)\\n```\\n');\n", "mdcell.render();\n", "$(element).append(mdcell.element)\n", ".removeClass()\n", ".css('left', '66%')\n", ".css('position', 'absolute')\n", ".css('width', '30%')\n", "mdcell.element.prepend(\n", " $('
')\n", " .removeClass()\n", " .css('background', '#AAAAFF')\n", " .css('width', '100 %')\n", " .html('Notebook Output')\n", "\n", ");\n", "container.show()\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
NBConvert Latex Output
some source code\n",
       "\n",
       "\\begin{Shaded}\n",
       "\\begin{Highlighting}[]\n",
       "\\NormalTok{a = }\\StringTok{\"test\"}\n",
       "\\KeywordTok{print}\\NormalTok{(a)}\n",
       "\\end{Highlighting}\n",
       "\\end{Shaded}
NBViewer Output

some source code

\n", "
a = "test"\n",
       "print(a)
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " $.getScript(\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js\");\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare_render(r\"\"\"\n", "some source code\n", "\n", "```python\n", "a = \"test\"\n", "print(a)\n", "```\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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/tools/tests/Test Output Callbacks.ipynb000066400000000000000000000110721477474304100227220ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Basic Output" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from IPython.display import display" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print('hi')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "display('hi')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.plot([1,3,2])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%javascript\n", "console.log(\"I ran!\");" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%html\n", "bold" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%latex\n", "$$\n", "a = 5\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# input_request" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "raw_input(\"prompt > \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# set_next_input" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%writefile tst.py\n", "def foo():\n", " pass\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%load tst.py" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pager in execute_reply" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "plt?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# object_info" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# press shift-tab after parentheses\n", "int(" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# complete" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# press tab after f\n", "f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# clear_output" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import sys, time\n", "from IPython.display import clear_output" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i in range(10):\n", " clear_output()\n", " time.sleep(0.25)\n", " print(i)\n", " sys.stdout.flush()\n", " time.sleep(0.25)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i in range(10):\n", " clear_output(wait=True)\n", " time.sleep(0.25)\n", " print(i)\n", " sys.stdout.flush()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/tools/tests/embed/000077500000000000000000000000001477474304100166725ustar00rootroot00000000000000ipython-8.35.0/tools/tests/embed/embed1.py000066400000000000000000000003351477474304100204020ustar00rootroot00000000000000"""This tests standard embedding, automatically detecting the module and local namespaces.""" f = set([1,2,3,4,5]) def bar(foo): import IPython IPython.embed(banner1='check f in globals, foo in locals') bar(f) ipython-8.35.0/tools/tests/embed/embed2.py000066400000000000000000000003341477474304100204020ustar00rootroot00000000000000"""This tests passing a dict for the user_ns at shell instantiation.""" from IPython import embed user_ns = dict(cookie='monster') embed(user_ns=user_ns, banner1="check 'cookie' present, locals and globals equivalent") ipython-8.35.0/tools/tests/embed/embed3.py000066400000000000000000000005071477474304100204050ustar00rootroot00000000000000"""This tests passing local_ns and global_ns (for backwards compatibility only) at activation of an embedded shell.""" from IPython.terminal.embed import InteractiveShellEmbed user_ns = dict(cookie='monster') ISE = InteractiveShellEmbed(banner1='check cookie in locals, and globals empty') ISE(local_ns=user_ns, global_ns={}) ipython-8.35.0/tools/tests/embed/embed_flufl.py000066400000000000000000000004151477474304100215100ustar00rootroot00000000000000"""This tests that future compiler flags are passed to the embedded IPython.""" from __future__ import barry_as_FLUFL from IPython import embed embed(banner1='', header='check 1 <> 2 == True') embed(banner1='', header='check 1 <> 2 cause SyntaxError', compile_flags=0) ipython-8.35.0/tools/tests/embed/embed_no_flufl.py000066400000000000000000000004451477474304100222070ustar00rootroot00000000000000"""This tests that future compiler flags are passed to the embedded IPython.""" from IPython import embed import __future__ embed(banner1='', header='check 1 <> 2 cause SyntaxError') embed(banner1='', header='check 1 <> 2 == True', compile_flags=__future__.barry_as_FLUFL.compiler_flag) ipython-8.35.0/tools/tests/heartbeat/000077500000000000000000000000001477474304100175555ustar00rootroot00000000000000ipython-8.35.0/tools/tests/heartbeat/gilsleep.ipynb000066400000000000000000000031531477474304100224260ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Holding the GIL for too long could disrupt the heartbeat due to non-copying sends.\n", "\n", "The following cell repeatedly calls a function that holds the GIL for five seconds.\n", "\n", "The heartbeat will fail after a few iterations prior to fixing Issue [#1260](https://github.com/ipython/ipython/issues/1260)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import sys\n", "import time\n", "\n", "from cython import inline\n", "\n", "def gilsleep(t):\n", " \"\"\"gil-holding sleep with cython.inline\"\"\"\n", " code = '\\n'.join([\n", " 'from posix cimport unistd',\n", " 'unistd.sleep(t)',\n", " ])\n", " while True:\n", " inline(code, quiet=True, t=t)\n", " print(time.time())\n", " sys.stdout.flush() # this is important\n", "\n", "gilsleep(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/tools/tests/heartbeat/hb_gil.py000066400000000000000000000010761477474304100213570ustar00rootroot00000000000000""" Run this script in the qtconsole with one of: %load hb_gil.py or %run hb_gil.py Holding the GIL for too long could disrupt the heartbeat. See Issue #1260: https://github.com/ipython/ipython/issues/1260 """ import sys import time from cython import inline def gilsleep(t): """gil-holding sleep with cython.inline""" code = '\n'.join([ 'from posix cimport unistd', 'unistd.sleep(t)', ]) while True: inline(code, quiet=True, t=t) print(time.time()) sys.stdout.flush() # this is important gilsleep(5) ipython-8.35.0/tools/tests/inline_figshow.py000066400000000000000000000011071477474304100211730ustar00rootroot00000000000000"""Manual test for figure.show() in the inline matplotlib backend. This script should be loaded for interactive use (via %load) into a qtconsole or notebook initialized with the inline backend. Expected behavior: only *one* copy of the figure is shown. For further details: https://github.com/ipython/ipython/issues/1612 https://github.com/matplotlib/matplotlib/issues/835 """ import numpy as np import matplotlib.pyplot as plt plt.ioff() x = np.random.uniform(-5, 5, size=(100)) y = np.random.uniform(-5, 5, size=(100)) f = plt.figure() plt.scatter(x, y) plt.plot(y) f.show() ipython-8.35.0/tools/tests/mpl-switch/000077500000000000000000000000001477474304100177055ustar00rootroot00000000000000ipython-8.35.0/tools/tests/mpl-switch/Matplotlib Switching.ipynb000066400000000000000000001407671477474304100250160ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using matplotlib backend: MacOSX\n" ] }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Should pop up a GUI window\n", "%matplotlib\n", "import matplotlib.pyplot as plt\n", "plt.plot([1,2,3])" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "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\n", "RdKZhBBKQggPkNq8/VfAvBjjljM8J2d1Sz5t7L4ceBJ4JITwKFAHzASuBPYCn+90/TTgAmDyaWJ9\n", "DlgA3BtC+BDwWvr6paR2y1+ejTcgaUDK9NyyIoSwHng5fWwOqfnmCHBtjLEp4+9A0oATQqgErkk/\n", "PC89zgohfCH9/eYYY8dfDq1bJJ1RFuYW6xZJy4CPA8eATcA/hhBOd90TMcZfpL/PWd2SFyuxAGKM\n", "NcBCUsvbqkm98VnAt4HLYoxvdHpKMv11ulivAvOAVcBF6VgLSX0Kx8IYo0vypSEik3ML8Kl0nPHA\n", "XwMfBSYC9wEXxxjXZDp/SQPWDOBr6a/lpOaNSzocW9bpeusWSd2RsbkF6xZJKe2fGDgCWEHqj/id\n", "vz5HahVVO+sWSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk\n", "SZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk\n", "SZIkSZIkSZIkSZIkSZIkSZIkSZLy0v8DnhwIE1EJTfYAAAAASUVORK5CYII=\n" ], "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 379, "width": 600 } }, "output_type": "display_data" } ], "source": [ "# Should make an inline figure\n", "%matplotlib inline\n", "plt.plot([1,2,3])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# New GUI window--should *NOT* have the visual settings of inline\n", "%matplotlib qt\n", "plt.plot([1,2,3])" ] } ], "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.4.2" } }, "nbformat": 4, "nbformat_minor": 0 } ipython-8.35.0/tools/testupload000077500000000000000000000011521477474304100165650ustar00rootroot00000000000000#!/usr/bin/env python """Simple upload script to push up into the testing directory a local build """ from __future__ import print_function from toollib import * # Get main ipython dir, this will raise if it doesn't pass some checks ipdir = get_ipdir() distdir = pjoin(ipdir, 'dist') # Load release info execfile(pjoin(ipdir, 'IPython','core','release.py')) # Build site addresses for file uploads testing_site = '%s/testing/%s' % (archive, version) cd(distdir) # Create remote path if it doesn't exist. sh('ssh %s "mkdir -p %s/testing/%s" ' % (archive_user, archive_dir, version)) sh('scp * %s' % testing_site) ipython-8.35.0/tools/toollib.py000066400000000000000000000024411477474304100164730ustar00rootroot00000000000000"""Various utilities common to IPython release and maintenance tools. """ # Library imports import os import sys from pathlib import Path # Useful shorthands cd = os.chdir # Constants # SSH root address of the archive site archive_user = 'ipython@archive.ipython.org' archive_dir = 'archive.ipython.org' archive = '%s:%s' % (archive_user, archive_dir) # Build commands # Source dists build_command = "{python} -m build".format(python=sys.executable) # Utility functions def sh(cmd): """Run system command in shell, raise SystemExit if it returns an error.""" print("$", cmd) stat = os.system(cmd) #stat = 0 # Uncomment this and comment previous to run in debug mode if stat: raise SystemExit("Command %s failed with code: %s" % (cmd, stat)) def get_ipdir(): """Get IPython directory from command line, or assume it's the one above.""" # Initialize arguments and check location ipdir = Path(__file__).parent / os.pardir ipdir = ipdir.resolve() cd(ipdir) if not Path("IPython").is_dir() and Path("setup.py").is_file(): raise SystemExit("Invalid ipython directory: %s" % ipdir) return ipdir def execfile(fname, globs, locs=None): locs = locs or globs exec(compile(open(fname, encoding="utf-8").read(), fname, "exec"), globs, locs) ipython-8.35.0/tools/update_whatsnew.py000066400000000000000000000046531477474304100202400ustar00rootroot00000000000000#!/usr/bin/env python """Update the What's New doc (development version) This collects the snippets from whatsnew/pr/, moves their content into whatsnew/development.rst (chronologically ordered), and deletes the snippets. """ import io import sys from pathlib import Path from subprocess import check_call, check_output repo_root = Path(__file__).resolve().parent.parent whatsnew_dir = repo_root / "docs" / "source" / "whatsnew" pr_dir = whatsnew_dir / "pr" target = whatsnew_dir / "development.rst" FEATURE_MARK = ".. DO NOT EDIT THIS LINE BEFORE RELEASE. FEATURE INSERTION POINT." INCOMPAT_MARK = ".. DO NOT EDIT THIS LINE BEFORE RELEASE. INCOMPAT INSERTION POINT." # 1. Collect the whatsnew snippet files --------------------------------------- files = set(pr_dir.glob("*.rst")) # Ignore explanatory and example files files.difference_update( {pr_dir / f for f in {"incompat-switching-to-perl.rst", "antigravity-feature.rst"}} ) if not files: print("No automatic update available for what's new") sys.exit(0) def getmtime(f): return check_output(["git", "log", "-1", '--format="%ai"', "--", f]) files = sorted(files, key=getmtime) features, incompats = [], [] for path in files: with io.open(path, encoding="utf-8") as f: try: content = f.read().rstrip() except Exception as e: raise Exception('Error reading "{}"'.format(f)) from e if path.name.startswith("incompat-"): incompats.append(content) else: features.append(content) # Put the insertion markers back on the end, so they're ready for next time. feature_block = "\n\n".join(features + [FEATURE_MARK]) incompat_block = "\n\n".join(incompats + [INCOMPAT_MARK]) # 2. Update the target file --------------------------------------------------- with io.open(target, encoding="utf-8") as f: content = f.read() assert content.count(FEATURE_MARK) == 1 assert content.count(INCOMPAT_MARK) == 1 content = content.replace(FEATURE_MARK, feature_block) content = content.replace(INCOMPAT_MARK, incompat_block) # Clean trailing whitespace content = "\n".join(l.rstrip() for l in content.splitlines()) with io.open(target, "w", encoding="utf-8") as f: f.write(content) # 3. Stage the changes in git ------------------------------------------------- for file in files: check_call(["git", "rm", file]) check_call(["git", "add", target]) print("Merged what's new changes. Check the diff and commit the change.")