pax_global_header00006660000000000000000000000064130553455070014521gustar00rootroot0000000000000052 comment=bae0062025527059812a09f8c7bc7fe79fc8a8de ipywidgets-6.0.0/000077500000000000000000000000001305534550700137145ustar00rootroot00000000000000ipywidgets-6.0.0/.gitignore000066400000000000000000000006131305534550700157040ustar00rootroot00000000000000MANIFEST build dist _build docs/man/*.gz docs/source/api/generated jupyter-js-widgets/src/components jupyter-js-widgets/lib/ jupyter-js-widgets/docs/ node_modules *.py[co] __pycache__ *.egg-info *~ *.bak .ipynb_checkpoints .tox .DS_Store \#*# .#* .coverage .xunit.xml .tern-project npm-debug.log widgetsnbextension/widgetsnbextension/static index.built.js index.built.js.map **/es5/ **/built ipywidgets-6.0.0/.mailmap000066400000000000000000000250671305534550700153470ustar00rootroot00000000000000A. J. Holyoake ajholyoake Aaron Culich Aaron Culich Aron Ahmadia ahmadia Benjamin Ragan-Kelley Benjamin Ragan-Kelley Min RK Benjamin Ragan-Kelley MinRK Barry Wark Barry Wark Ben Edwards Ben Edwards Bradley M. Froehle Bradley M. Froehle Bradley M. Froehle Bradley Froehle Brandon Parsons Brandon Parsons Brian E. Granger Brian Granger Brian E. Granger Brian Granger <> Brian E. Granger bgranger <> Brian E. Granger bgranger Christoph Gohlke cgohlke Cyrille Rossant rossant Damián Avila damianavila Damián Avila damianavila Damon Allen damontallen Darren Dale darren.dale <> Darren Dale Darren Dale <> Dav Clark Dav Clark <> Dav Clark Dav Clark David Hirschfeld dhirschfeld David P. Sanders David P. Sanders David Warde-Farley David Warde-Farley <> Doug Blank Doug Blank Eugene Van den Bulke Eugene Van den Bulke Evan Patterson Evan Patterson Evan Patterson Evan Patterson Evan Patterson epatters Evan Patterson epatters Ernie French Ernie French Ernie French ernie french Ernie French ernop Fernando Perez Fernando Perez Fernando Perez Fernando Perez fperez <> Fernando Perez fptest <> Fernando Perez fptest1 <> Fernando Perez Fernando Perez Fernando Perez Fernando Perez <> Fernando Perez Fernando Perez Frank Murphy Frank Murphy Gabriel Becker gmbecker Gael Varoquaux gael.varoquaux <> Gael Varoquaux gvaroquaux Gael Varoquaux Gael Varoquaux <> Ingolf Becker watercrossing Jake Vanderplas Jake Vanderplas Jakob Gager jakobgager Jakob Gager jakobgager Jakob Gager jakobgager Jason Grout Jason Grout Jason Gors jason gors Jason Gors jgors Jens Hedegaard Nielsen Jens Hedegaard Nielsen Jens Hedegaard Nielsen Jens H Nielsen Jens Hedegaard Nielsen Jens H. Nielsen Jez Ng Jez Ng Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic jon Jonathan Frederic U-Jon-PC\Jon Jonathan March Jonathan March Jonathan March jdmarch Jörgen Stenarson Jörgen Stenarson Jörgen Stenarson Jorgen Stenarson Jörgen Stenarson Jorgen Stenarson <> Jörgen Stenarson jstenar Jörgen Stenarson jstenar <> Jörgen Stenarson Jörgen Stenarson Juergen Hasch juhasch Juergen Hasch juhasch Julia Evans Julia Evans Kester Tong KesterTong Kyle Kelley Kyle Kelley Kyle Kelley rgbkrk Laurent Dufréchou Laurent Dufréchou Laurent Dufréchou laurent dufrechou <> Laurent Dufréchou laurent.dufrechou <> Laurent Dufréchou Laurent Dufrechou <> Laurent Dufréchou laurent.dufrechou@gmail.com <> Laurent Dufréchou ldufrechou Lorena Pantano Lorena Luis Pedro Coelho Luis Pedro Coelho Marc Molla marcmolla Martín Gaitán Martín Gaitán Matthias Bussonnier Matthias BUSSONNIER Matthias Bussonnier Bussonnier Matthias Matthias Bussonnier Matthias BUSSONNIER Matthias Bussonnier Matthias Bussonnier Michael Droettboom Michael Droettboom Nicholas Bollweg Nicholas Bollweg (Nick) Nicolas Rougier Nikolay Koldunov Nikolay Koldunov Omar Andrés Zapata Mesa Omar Andres Zapata Mesa Omar Andrés Zapata Mesa Omar Andres Zapata Mesa Pankaj Pandey Pankaj Pandey Pascal Schetelat pascal-schetelat Paul Ivanov Paul Ivanov Pauli Virtanen Pauli Virtanen <> Pauli Virtanen Pauli Virtanen Pierre Gerold Pierre Gerold Pietro Berkes Pietro Berkes Piti Ongmongkolkul piti118 Prabhu Ramachandran Prabhu Ramachandran <> Puneeth Chaganti Puneeth Chaganti Robert Kern rkern <> Robert Kern Robert Kern Robert Kern Robert Kern Robert Kern Robert Kern <> Robert Marchman Robert Marchman Satrajit Ghosh Satrajit Ghosh Satrajit Ghosh Satrajit Ghosh Scott Sanderson Scott Sanderson smithj1 smithj1 smithj1 smithj1 Steven Johnson stevenJohnson Steven Silvester blink1073 S. Weber s8weber Stefan van der Walt Stefan van der Walt Silvia Vinyes Silvia Silvia Vinyes silviav12 Sylvain Corlay Sylvain Corlay sylvain.corlay Ted Drain TD22057 Théophile Studer Théophile Studer Thomas Kluyver Thomas Thomas Spura Thomas Spura Timo Paulssen timo vds vds2212 vds vds Ville M. Vainio Ville M. Vainio ville Ville M. Vainio ville Ville M. Vainio vivainio <> Ville M. Vainio Ville M. Vainio Ville M. Vainio Ville M. Vainio Walter Doerwald walter.doerwald <> Walter Doerwald Walter Doerwald <> W. Trevor King W. Trevor King Yoval P. y-p ipywidgets-6.0.0/.travis.yml000066400000000000000000000014221305534550700160240ustar00rootroot00000000000000# http://travis-ci.org/#!/ipython/ipywidgets language: python python: - 2.7 - 3.3 - 3.4 - 3.5 env: - GROUP=python TRAVIS_NODE_VERSION=5.1 sudo: false before_install: - 'if [[ $GROUP == python ]] ; then bash ./scripts/travis_before_install_py.sh ; fi' install: - 'if [[ $GROUP == python ]] ; then bash ./scripts/travis_install_py.sh ; fi' - 'if [[ $GROUP == js ]] ; then bash ./jupyter-js-widgets/scripts/travis_install_js.sh ; fi' script: - 'if [[ $GROUP == python ]] ; then bash ./scripts/travis_script_py.sh ; fi' - 'if [[ $GROUP == js ]] ; then bash ./jupyter-js-widgets/scripts/travis_script_js.sh ; fi' matrix: include: - python: 3.5 env: GROUP=js BROWSER=firefox TRAVIS_NODE_VERSION=6.9 after_success: - coveralls ipywidgets-6.0.0/CONTRIBUTING.md000066400000000000000000000000761305534550700161500ustar00rootroot00000000000000# Contributing See [this page](docs/source/contributing.md). ipywidgets-6.0.0/COPYING.md000066400000000000000000000054631305534550700153560ustar00rootroot00000000000000# Licensing terms This project is licensed under the terms of the Modified BSD License (also known as New or Revised or 3-Clause BSD), as follows: - Copyright (c) 2016, Jupyter Development Team All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the Jupyter Development Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ## About the Jupyter Development Team The Jupyter Development Team is the set of all contributors to the Jupyter project. This includes all of the Jupyter subprojects. The core team that coordinates development on GitHub can be found here: - https://github.com/jupyter/ - https://github.com/ipython/ ## Our Copyright Policy Jupyter uses a shared copyright model. Each contributor maintains copyright over their contributions to Jupyter. But, it is important to note that these contributions are typically only changes to the repositories. Thus, the Jupyter source code, in its entirety is not the copyright of any single person or institution. Instead, it is the collective copyright of the entire Jupyter Development Team. If individual contributors want to maintain a record of what changes/contributions they have specific copyright on, they should indicate their copyright in the commit message of the change, when they commit the change to one of the Jupyter repositories. With this in mind, the following banner should be used in any source code file to indicate the copyright and license terms: # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. ipywidgets-6.0.0/LICENSE000066400000000000000000000027571305534550700147340ustar00rootroot00000000000000Copyright (c) 2015-2016, Project Jupyter Contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ipywidgets-6.0.0/MANIFEST.in000066400000000000000000000010231305534550700154460ustar00rootroot00000000000000include COPYING.md include CONTRIBUTING.md include README.md include package.json include bower.json include .bowerrc include ipywidgets/build_css.js # Documentation graft docs exclude docs/\#* # Examples graft examples graft ipywidgets/tests graft ipywidgets/static # docs subdirs we want to skip prune docs/build prune docs/dist # Patterns to exclude from any directory global-exclude *~ global-exclude *.pyc global-exclude *.pyo global-exclude .git global-exclude .ipynb_checkpoints # Exclude build scripts exclude scripts ipywidgets-6.0.0/README.md000066400000000000000000000122721305534550700151770ustar00rootroot00000000000000# ipywidgets: Interactive HTML Widgets [![Version](https://img.shields.io/pypi/v/ipywidgets.svg)](https://pypi.python.org/pypi/ipywidgets) [![Downloads](https://img.shields.io/pypi/dm/ipywidgets.svg)](https://pypi.python.org/pypi/ipywidgets) [![Build Status](https://travis-ci.org/ipython/ipywidgets.svg?branch=master)](https://travis-ci.org/ipython/ipywidgets) [![Documentation Status](http://readthedocs.org/projects/ipywidgets/badge/?version=latest)](https://ipywidgets.readthedocs.io/en/latest/?badge=latest) [![Join the chat at https://gitter.im/ipython/ipywidgets](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ipython/ipywidgets?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) ipywidgets are [interactive HTML widgets](https://github.com/ipython/ipywidgets/blob/master/docs/source/examples/Index.ipynb) for Jupyter notebooks and the IPython kernel. Notebooks come alive when interactive widgets are used. Users gain control of their data and can visualize changes in the data. Learning becomes an immersive, plus fun, experience. Researchers can easily see how changing inputs to a model impact the results. We hope you will add ipywidgets to your notebooks, and we're here to help you get started. ## Core Interactive Widgets A [demonstration notebook](https://github.com/ipython/ipywidgets/blob/master/docs/source/examples/Index.ipynb) provides an overview of the core interactive widgets, including: - sliders - progress bars - text boxes - toggle buttons and checkboxes - display areas - and more ## Jupyter Interactive Widgets as a Framework Besides the widgets already provided with the library, the framework can be extended with custom widget libraries. A template project is available in the form of a cookie cutter [here](https://github.com/jupyter/widget-cookiecutter). This project is meant to help custom widget authors get started with the packaging and the distribution of Jupyter interactive widgets. It produces a project for a Jupyter interactive widget library following the current best practices for using interactive widgets. An implementation for a placeholder "Hello World" widget is provided. Popular widget libraries such as [bqplot](https://github.com/bloomberg/bqplot), [pythreejs](https://github.com/jovyan/pythreejs) and [ipyleaflet](https://github.com/ellisonbg/ipyleaflet) follow exactly the same template and directory structure. They can serve as more advanced examples of usage of the Jupyter widget infrastructure. For detailed information, please refer to the [ipywidgets documentation](https://ipywidgets.readthedocs.io/en/latest/). ## More advanced examples Examples of custom widget libraries built upon ipywidgets are - [bqplot](https://github.com/bloomberg/bqplot) a 2d data visualization library enabling custom user interactions. - [pythreejs](https://github.com/jovyan/pythreejs) a Jupyter - Three.js wrapper, bringing Three.js to the notebook. - [ipyleaflet](https://github.com/ellisonbg/ipyleaflet) a leaflet widget for Jupyter. ## Install Install the current version of ipywidgets using pip or conda. - With pip: ``` pip install ipywidgets jupyter nbextension enable --py --sys-prefix widgetsnbextension ``` - With conda: ``` conda install -c conda-forge ipywidgets ``` See the [Installation](docs/source/user_install.md) section of the documentation for additional details. ### Installing from git If you want to install ipywidgets from git, **you will need [npm](https://www.npmjs.com/) version 3.x or later** (check you version by running `npm -v` from a terminal). Installing from git is more complicated and requires a developer install, see the [developer install](docs/source/dev_install.md) instructions. To install the latest master version from the root directory of the source code, run ``dev-install.sh``. To only build the Python package enter ``pip install -e .``. #### Compatibility | ipywidgets version | Required notebook version | | ------------------- | ------------------------- | | master | 4.4 | | 5.x | 4.2 | | 4.1.x | 4.1 | | 4.0.x | 4.0 | [Change log](docs/source/changelog.md) ## Usage See the [examples](docs/source/examples.md) section of the documentation. The widgets are being used in a variety of ways; some uses can be seen in these notebooks: - [Demo notebook of interactive widgets](https://github.com/ipython/ipywidgets/blob/master/docs/source/examples/Index.ipynb) ## Contributing to ipywidgets - [Developer install](docs/source/dev_install.md) ## License We use a shared copyright model that enables all contributors to maintain the copyright on their contributions. See the [LICENSE](LICENSE) file in this repository for details. ## Project Jupyter resources - [Project Jupyter website](https://jupyter.org) - [Online Demo of Jupyter Notebook at try.jupyter.org](https://try.jupyter.org) - [Documentation for Project Jupyter](https://jupyter.readthedocs.io/en/latest/index.html) [[PDF](https://media.readthedocs.org/pdf/jupyter/latest/jupyter.pdf)] - [![Google Group](https://img.shields.io/badge/-Google%20Group-lightgrey.svg)](https://groups.google.com/forum/#!forum/jupyter) ipywidgets-6.0.0/dev-install.sh000077500000000000000000000041651305534550700165030ustar00rootroot00000000000000#!/usr/bin/env bash # For a clean conda environment, do: # conda create -c conda-forge -n ipywidgets notebook=4.4.1 # source activate ipywidgets # pip install jupyterlab==0.16.2 # ipython kernel install --name ipywidgets --display-name "ipywidgets" --sys-prefix # git clone https://github.com/ipython/ipywidgets.git # cd ipywidgets # ./dev-install.sh echo -n "Checking npm... " npm -v if [ $? -ne 0 ]; then echo "'npm -v' failed, therefore npm is not installed. In order to perform a developer install of ipywidgets you must have both npm and pip installed on your machine! See http://blog.npmjs.org/post/85484771375/how-to-install-npm for installation instructions." exit 1 fi echo -n "Checking pip... " pip --version if [ $? -ne 0 ]; then echo "'pip --version' failed, therefore pip is not installed. In order to perform a developer install of ipywidgets you must have both pip and npm installed on your machine! See https://packaging.python.org/installing/ for installation instructions." exit 1 fi echo -n "Checking jupyter lab... " jupyter lab --version 2>/dev/null if [ $? -ne 0 ]; then echo "no, skipping installation of jupyterlab_widgets" skip_jupyter_lab=yes fi # All following commands must run successfully set -e nbExtFlags="--sys-prefix $1" cd jupyter-js-widgets npm install cd .. cd widgetsnbextension npm install npm run update pip install -v -e . if [[ "$OSTYPE" == "msys" ]]; then jupyter nbextension install --overwrite --py $nbExtFlags widgetsnbextension else jupyter nbextension install --overwrite --py --symlink $nbExtFlags widgetsnbextension fi jupyter nbextension enable --py $nbExtFlags widgetsnbextension cd .. if test "$skip_jupyter_lab" != yes; then cd jupyterlab_widgets npm install npm run update pip install -v -e . if [[ "$OSTYPE" == "msys" ]]; then jupyter labextension install --overwrite --py $nbExtFlags jupyterlab_widgets else jupyter labextension install --overwrite --py --symlink $nbExtFlags jupyterlab_widgets fi jupyter labextension enable --py $nbExtFlags jupyterlab_widgets cd .. fi pip install -v -e . ipywidgets-6.0.0/docs/000077500000000000000000000000001305534550700146445ustar00rootroot00000000000000ipywidgets-6.0.0/docs/Makefile000066400000000000000000000024341305534550700163070ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " clean remove built files" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." ipywidgets-6.0.0/docs/environment.yml000066400000000000000000000006131305534550700177330ustar00rootroot00000000000000name: ipywidget_docs channels: - conda-forge - defaults dependencies: - sphinx=1.4.8 - python=3.5 - sphinx_rtd_theme - jinja2 - tornado - nbformat - ipywidgets - notebook>=4.2 - sphinx>=1.4.6 - ipykernel - pip: - docutils<0.13.1 - jupyter_sphinx - git+https://github.com/spatialaudio/nbsphinx.git#egg=nbsphinx - sphinx_rtd_theme==0.1.10-alpha - python-dateutil - recommonmark==0.4.0 ipywidgets-6.0.0/docs/make.bat000066400000000000000000000030031305534550700162450ustar00rootroot00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source set I18NSPHINXOPTS=%SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. clean remove built files" goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) REM Check if sphinx-build is available and fallback to Python version if any %SPHINXBUILD% 1>NUL 2>NUL if errorlevel 9009 goto sphinx_python goto sphinx_ok :sphinx_python set SPHINXBUILD=python -m sphinx.__init__ %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) :sphinx_ok if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) :end ipywidgets-6.0.0/docs/requirements.txt000066400000000000000000000002661305534550700201340ustar00rootroot00000000000000jupyter_client sphinx>=1.4.6 sphinx_rtd_theme==0.1.10-alpha git+https://github.com/spatialaudio/nbsphinx.git#egg=nbsphinx jupyter_sphinx recommonmark==0.4.0 ipykernel jupyter_sphinx ipywidgets-6.0.0/docs/source/000077500000000000000000000000001305534550700161445ustar00rootroot00000000000000ipywidgets-6.0.0/docs/source/.babelrc000066400000000000000000000000321305534550700175320ustar00rootroot00000000000000{ "presets": ["es2015"] } ipywidgets-6.0.0/docs/source/changelog.md000066400000000000000000000050761305534550700204250ustar00rootroot00000000000000ipywidgets changelog ==================== A summary of changes in ipywidgets. For more detailed information, see [GitHub](https://github.com/ipython/ipywidgets). 6.0 --- Major user-visible changes in ipywidgets 6.0 include: - Rendering of Jupyter interactive widgets in various web contexts sphinx documentation: http://ipywidgets.readthedocs.io/en/latest/examples/Widget%20List.html nbviewer: http://nbviewer.jupyter.org/github/ipython/ipywidgets/blob/master/docs/source/examples/Widget%20List.ipynb Static web pages: http://jupyter.org/widgets - Addition of a DatePicker widget in the core widget collection. - Changes to the automatic control generation syntax in @interact, inspired by the Sage interact syntax. - Removal of APIs which had been deprecated in 5.0 (top-level styling attributes of DOMWidgets, and some corner cases in the behavior of @interact). - A new API for custom styling of widgets is provided, through a top-level `style` attribute. For example, the color of a slider handler can be set by `slider.style.handle_color`. - Removal of the Proxy and PlaceProxy widgets. - Removed the button_style attribute of the Dropdown widget - Addition of an OutputWidget for capturing output and rich display objects. @interact has changed to use an OutputWidget for function output instead of overwriting the output area of a cell. - The jupyter-js-widgets Javascript implementation now relies on the PhosphorJS framework for the management of rich layout and a better integration of JupyterLab. - Numerous bug fixes. *Note for custom widget authors:* ipywidgets 6.0 breaks backward compatibility with respect to the handling of default values of the JavaScript side. Now, the default values for core widget models are specified with a `default()` method returning a dictionary instead of a `default` dictionary attribute. If you want your library to be backwards compatible with ipywidgets 5.x, you could use [_.result](http://underscorejs.org/#result) like this: ```javascript ... defaults: function() { return _.extend(_.result(this, 'widgets.DOMWidgetModel.prototype.defaults'), { .... }) }, ... ``` This should not have an impact when using your custom widgets in the classic notebook, but will be really important when deploying your interactive widgets in web contexts. 5.x --- 4.1.x ----- ### 4.1.1 ### 4.1.0 4.0.x ----- ### 4.0.3 Bump version with miscellaneous bug fixes. ### 4.0.2 Add README.rst documentation. ### 4.0.1 Remove ipynb checkpoints. ### 4.0.0 First release of **ipywidgets** as a standalone package. ipywidgets-6.0.0/docs/source/conf.py000066400000000000000000000054621305534550700174520ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # import os import subprocess import sys import sphinx_rtd_theme import recommonmark.parser # -- path ------------------------------------------------------- from os.path import dirname docs = dirname(dirname(__file__)) root = dirname(docs) sys.path.insert(0, root) # -- bash utility function -------------------------------------- def bash(filename): """Runs a bash script in the local directory""" sys.stdout.flush() subprocess.call("bash {}".format(filename), shell=True) # -- source files and parsers ----------------------------------- source_suffix = ['.rst', '.md', '.ipynb'] source_parsers = { '.md': recommonmark.parser.CommonMarkParser, } # -- Sphinx extensions and configuration ------------------------ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.intersphinx', 'sphinx.ext.mathjax', 'nbsphinx', 'jupyter_sphinx.embed_widgets', 'IPython.sphinxext.ipython_console_highlighting', ] intersphinx_mapping = { 'ipython': ('http://ipython.org/ipython-doc/dev/', None), 'nbconvert': ('https://nbconvert.readthedocs.io/en/latest/', None), 'nbformat': ('https://nbformat.readthedocs.io/en/latest/', None), 'jupyter': ('https://jupyter.readthedocs.io/en/latest/', None), } nbsphinx_allow_errors = True # exception ipstruct.py ipython_genutils # -- General information ------- _release = {} exec(compile(open('../../ipywidgets/_version.py').read(), '../../ipywidgets/_version.py', 'exec'), _release) version = '.'.join(map(str, _release['version_info'][:2])) release = _release['__version__'] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] master_doc = 'index' project = 'ipywidgets and jupyter-js-widgets' copyright = '2016, Jupyter Team, https://jupyter.org' author = 'Jupyter Team' language = None exclude_patterns = ['_build', '**.ipynb_checkpoints', 'examples/Imag*', 'examples/Index.ipynb'] pygments_style = 'sphinx' todo_include_todos = False # -- html -------------------------- # html_static_path = ['_static'] htmlhelp_basename = 'ipywidgetsdoc' # -- latex ------------------------- latex_elements = {} latex_documents = [ (master_doc, 'ipywidgets.tex', 'ipywidgets Documentation', 'https://jupyter.org', 'manual'), ] # -- tex --------------------------- texinfo_documents = [ (master_doc, 'ipywidgets', 'ipywidgets Documentation', author, 'ipywidgets', 'One line description of project.', 'Miscellaneous'), ] # -- epub -------------------------- # Bibliographic Dublin Core info. epub_title = project epub_author = author epub_publisher = author epub_copyright = copyright # -- Theme options ----------------- # Options are theme-specific and customize the look and feel of the theme. html_theme_options = {} ipywidgets-6.0.0/docs/source/contributing.md000066400000000000000000000004511305534550700211750ustar00rootroot00000000000000Contributing ============ We appreciate contributions from the community. We follow the [IPython Contributing Guide](https://github.com/ipython/ipython/blob/master/CONTRIBUTING.md) and [Jupyter Contributing Guides](https://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html). ipywidgets-6.0.0/docs/source/dev_docs.md000066400000000000000000000023271305534550700202600ustar00rootroot00000000000000Building the Documentation ========================== To build the documentation you'll need [Sphinx](http://www.sphinx-doc.org/), [pandoc](http://pandoc.org/) and a few other packages. To install (and activate) a [conda environment](http://conda.pydata.org/docs/using/envs.html#use-environment-from-file) named `notebook_docs` containing all the necessary packages (except pandoc), use: ``` conda env create -f docs/environment.yml source activate ipywidget_docs # Linux and OS X activate ipywidget_docs # Windows ``` If you want to install the necessary packages with `pip` instead, use (omitting `--user` if working in a virtual environment): ``` pip install -r docs/requirements.txt --user ``` Once you have installed the required packages, you can build the docs with: ``` cd docs make clean make html ``` After that, the generated HTML files will be available at `build/html/index.html`. You may view the docs in your browser. You can automatically check if all hyperlinks are still valid:: ``` make linkcheck ``` Windows users can find `make.bat` in the `docs` folder. You should also have a look at the [Project Jupyter Documentation Guide](https://jupyter.readthedocs.io/en/latest/contrib_docs/index.html). ipywidgets-6.0.0/docs/source/dev_install.md000066400000000000000000000050021305534550700207670ustar00rootroot00000000000000Developer Install ================= Prerequisites ------------- To install ipywidgets from git, you will need: - [npm](https://www.npmjs.com/) **version 3.x or later** + Check your version by running `npm -v` from a terminal. + *Note: If you install using sudo, you need to make sure that npm is also available in the PATH used with sudo.* - the latest [Jupyter notebook development release](https://github.com/jupyter/notebook) + Everything in the ipywidgets repository is developed using Jupyter notebook's master branch. + If you want to have a copy of ipywidgets that works against a stable version of the notebook, checkout the appropriate tag. + See the [Compatibility table](https://github.com/ipython/ipywidgets#compatibility). Steps ----- 0. Clone the repo: git clone https://github.com/ipython/ipywidgets 1. Navigate into the cloned repo and install: cd ipywidgets bash dev-install.sh --sys-prefix Rebuild after making changes ---------------------------- After you've made changes to `jupyter-js-widgets` if you want to test those changes, run the following commands, empty your browser's cache, and refresh the page: cd widgetsnbextension npm run update cd .. Tips and troubleshooting ------------------------ - If you have any problems with the above install procedure, make sure that permissions on npm and pip related install directories are correct. - Sometimes, it helps to clear cached files too by running `git clean -dfx` from the root of the cloned repository. - When you make changes to the Javascript and you're not seeing the changes, it could be your browser is caching aggressively. Try clearing the browser's cache. Try also using "incognito" or "private" browsing tabs to avoid caching. - If troubleshooting an upgrade and its build, you may need to do the following process: - Deep clean of the cloned repository: ``` git clean -dfx . ``` - Remove anything with `widgetsnbextension` in the name of files within the `conda` directory - Try reinstalling ipywidgets Releasing new versions ---------------------- See [dev_release.md](dev_release.md) for a details on how to release new versions of ipywidgets to PyPI and jupyter-js-widgets on npm. Testing ------- See [dev_testing.md](dev_testing.md) for a details on how to run Python and Javascript tests. Building documentation ---------------------- See [dev_docs.md](dev_docs.md) for a details on how to build the docs. ipywidgets-6.0.0/docs/source/dev_release.md000066400000000000000000000036631305534550700207540ustar00rootroot00000000000000Developer Release Procedure =========================== To release a new version of the widgets on PyPI and npm, first checkout master and cd into the repo root. Make sure the version of `jupyter-js-widgets` matches the semver range `__frontend_version__` specified in `ipywidgets/_version.py`. ### Publish jupyter-js-widgets ``` # nuke the `dist` and `node_modules` git clean -fdx npm version [patch/minor/major] npm install npm publish --tag next ``` ### widgetsnbextension Edit package.json to point to new jupyter-js-widgets version npm version [patch/minor/major] Edit `widgetsnbextension/_version.py` (Remove dev from the version. If it's the first beta, use b1, etc...) ``` python setup.py sdist python setup.py bdist_wheel --universal twine upload dist/* ``` ### JupyterLab Edit the package.json to have jupyter-js-widgets point to the correct version. ``` npm version patch/minor/major npm install npm run build npm publish python setup.py sdist python setup.py bdist_wheel --universal twine upload dist/* ``` ### ipywidgets edit ipywidgets/_version.py (remove dev from the version and update the frontend version requirement to match the one of `jupyter-js-widgets`) Change `setup.py` `install_requires` parameter to point to new widgetsnbextension version ``` python setup.py sdist python setup.py bdist_wheel --universal twine upload dist/* ``` ### Push changes back commit and tag (ipywidgets) release ### Back to dev ``` edit ipywidgets/_version.py (increase version and add dev tag) edit widgetsnbextension/widgetsnbextension/_version.py (increase version and add dev tag) git add ipywidgets/_version.py git add widgetsnbextension/widgetsnbextension/_version.py git commit -m "Back to dev" git push [upstream master] git push [upstream] --tags ``` On GitHub 1. Go to https://github.com/ipython/ipywidgets/milestones and click "Close" for the released version. 2. Make sure patch, minor, and/or major milestones exist as appropriate. ipywidgets-6.0.0/docs/source/dev_testing.md000066400000000000000000000003761305534550700210070ustar00rootroot00000000000000Testing ======= To run the Python tests: nosetests --with-coverage --cover-package=ipywidgets ipywidgets To run the Javascript tests: cd jupyter-js-widgets; npm run test This will run the test suite using `karma` with 'debug' level logging. ipywidgets-6.0.0/docs/source/embed.gif000066400000000000000000010313461305534550700177170ustar00rootroot00000000000000GIF89a w! NETSCAPE2.0!,  $$$+++333;;;C,+B33BBBJJJSSS[[[ccckkkuuuzzz/;1=5A9E:F=ICOITMXNYR]Ycfogqjroxrz  #"%%('**('-,0/33;;54==BBFDHGKKNMPOPPUTXV[ZVV]\`_bbhgkkllpoppssxwzzut|zQzü!% )$*%.)1-5296=9B=EAHEKGLIQNTRYV]Za^c_cafdifljpntrxv}{ց~؁ƄȌ˓ΖИНҢդ֭ڱ۵ބƒĆŋɌǎʏƐʔʗ˙ΟΠѤԬְٳٷۻ׃؅؈ڋڐܔݘݛޠߢ࡟।ᨦ⬫䱯䳲縷滺轼ݿ M*\ȰÇ#JHŋ3jȱǏ CIɓ(Cl2˗0cʜI͛8sb˅?{ JѣH*]dЄOJJիX7ڢŵׯ`ÊVVQ=˶۷p㒤ܒk˷߿ڵ9x${ ^̸. Ӕ0ĉ!k̹sc2Aܴ4i݀:,ׯHCmvj`J,nt-[~XMccV?fH\`5w?g-uuK>;B=?G-y'x5DM@A~YD{Ddžyq A y'~|cG{4@bLQ"IcG{a(LRuHEDЇ@=~DeIx09 y~ IGtֹeD)wgApdžGIC"q A !hx]xiZ$bTP -5yL=ZmzjHyDҩbȫN8dQ4~ *P!řJfkVjI׺ip$06>t@bwH* }l~vA) Z rѨQc/#J,BG7vleQO q+3vܱ-JG`{<)rpMak)Tkԩfx()47KbŢAnaP;BK ˳dGs~l˩a-wQz!%@4BޒYSw4wvJYݒ$>fFMV8 5*'EM<A/:hިrԈ8G 4 |F maё찞4݂}ю%6i{LJG2dHԠ\ !=f }C`-:0|Pnq;(G(d-$ &`{l &qOX7$ s0|h d1x`fך?s!A= K2q|V:*)cOB %l1Ąp(ҝ> $\a\#6NV4{[ptJ_!'s4 =iBzc<0vT`rRK.HnUnҒw^րNF![qNK`rE;|#2E؀hEZ 7emBtNv"`&*z,Qm"SByR1,^{7!OO湢Rfs$bvwFV%S*riFgA $ r <ϫpd 4;nBNu).=`9uȆPoըcb2iQkEuPlVLͫ(:Rt!=5PZ, D r C"p4#in# m*c&'b_B#dT2lNipރ˜Nk,f IJ#݆ă,gƐ`u%,`pG E͜l7X!^ o-mw"@)5%;o9 l?oZsUfFjqhC yF_ԺIs$ t^Hi=Zdr\srQn[FBCbr$Ѳцgꡥ-a*-nfpP!i oqYM4\#ʪ+e0"YӗF<&bـQmdV݃QLc eS)lc-5&oâBQ4uYV.[zA^+9!rs$Gő$t9<|3 ZDIiJfЍO9Ϣ$ A7&3˕Q 穷};LҐI1@ntz>k-[ @B85xxHJL؄NPR8TXVxXZ\C-`b1dXjlgui؆rHo q8x^Q%`z w8|rȇ]8csv|z8%Q؊8X7B!80\W8nhQpyH;͈m(ިXGHܘ`5Yql؎hᨏA-!(H帏r a(;A8Lz{y[ `\`P'trZI2i ҉h-ٓט@ x37tZsvt1q ' Ql 0ZFPPZQ PFb a56IPJ'X) )}@u !ItzߦzIR@khVF=4WP4w9w`. eJ t6 ;`W,`Ұqt Ev);y ٗwPْ  qA`~|=A \ɘ!)]Gwp q0:m?@EjᙨY pP ! ,2`PљW#0PTvc&i AV;tsK˩|ɞtQ7#!'/$"5D JEc:Vz>*@Ґ:^'EqtDy`i2q*isQ4z!rd+*% %#H> !MF Z:W2Ѣ{:-t!Bz9{;UCk5 k}ek:#F~hh `+#{kKwttxpZPpKz٢`멺 3KBl1bC>I4/-2v1$pb 1{'"*cB~3tx)i::$#9 `VkptK q+0$\AK JGN%8$vSRpܱ@T?9.ZdAJ Q<)|٪ӫ?' ۞. >,gKeoD5+Ƨ"U5[Q˹1t @-$c.$1̒ \2rD(ed9vlZYtoIL˹Ѡs*}@0S)q"JGk:1G\ĺ[ã8:ŝYWUi\4e7V@٩?aflȘy6 rz#Av#m[LL.I'T 6G`رaxGF\F@Q #͞| !c| =K]oTlŒv.?s:S{)JR;ܞ\ ͸%@4 #Ɔv0zwqc[-1CLS3fpdȇKR}IۃysiuYy{Ѥhq=y쾾nXjnb.螇О?_ JCZL?_ "?$_&(*,.02?4t1T<>@B?D_FHJ_CdR?T_VXZ\^`b?d_fhjjIPr?t_vxz|~x~D#CN_O-/__*̧?? (p_61?)ğB/ȿa__¿oO$XA .dC%N44R(VE!E$YI)UdK1eΤYSŌ;~OA%ZQI )m#G<ح"?{HM@VZYiծe+ӝm}AY~f ֠_ީ+ ". cȑ%Ol#ܨ_ҵb `‡/@@kرeϦM̵Mr3ӺLK;P.j=>صnѥOnƸ+& [y(pw!`୺!=x4"`+F;tA 7"|;[nA/24O5" -ڃ4(=KBsqGB(lC0`RMoa=@mP TsM6]16roD71N dE'8uQHz38C jOxKаD\35To/RZkUITS/&Pt1JF[\J\E`j+=nv[n˕+6-TSa+FV,m1];įb[|oWri 쨫Yèn 9?v_;~ޠdkxӿX N (pfs)];_I.&*@gbt !% B]DG|G*DX?"C!8N<)DP Eb>Rʢ;@:xHxQEZ!Ib&XvMmb)v9"F)HJbXb*Za,b- .y%/01$c!l0%H56! J,Т <2,ZadDh3U;n<$<HV`;W/Gd6B!r "8(se-Ufe)E!6@# <e`fbaƤڃx˂d7 ddjk7ާYa̐Ãp=X43&郙 ]N_vw~x 3 #%c,ffĠ b cވ֌ Ĉruh2Ni^hiT&!iЬl!&j5@jjɠjjj9tpk>" - !Z0<BkU#8h´nC!!Q6 B )-\8( J~T !hkچ+xfOmW,k B |]!PH l0+0ndm,X6v v-b٪zȚfB3x-?Xx2t^A:eSFRK,, 8Xmٶglhn4@Om5H9x Uf zU .ORа7/ t2s$GPg!/CA~GI;;Ġon.P08R.m.'wr̞dpPXp4m@j=;?[@2Ê+Lѓ](Ag)va4BC`Z3#RRPrS6@gg ++?C,o &165iQhs\T?J/#k+42e6}rL '*o,xr7oIfHKdlH*9q>[nT./Kj{s j rqZs~j@g9mz UXdxQSr۾ PmdWLg <ʳ<ۼλv@<@, /ckS#<)`7)j=,LV#ex+X+mQF0mXeThQ(dVpO g_ ?I v> d꿿p?\p,4?*_ -Q? 9ʂ' J&-Owr67p-n?zmzk)D4Z rw"|w m '!=ie'XHrMR*}}qԬ7&GXkjG ~~h7 ja$㶶h Fl5DXk.?kn,(Y%[I6V4b7#Fi$ʔ*Wl%̘2gҬi&Μ:w'РBޒfRjF)ԨRRj5(-' !L #zRZŋ8Fd%"$ҭk.޼z뗦ϫAMĊ35fqGX0h=:g6;]-gyyV[viDL(vLB64w0$; ))pr; J"n=|yXРan{/}D @ B8 Ұ`7e< 4aZ44bZ2.8ҍ# udc@0 12 #1BEy$I*yyaI9唏u uÐ0 Q e9k 0HGBEEm%0dɎ\7ى#C*:0Ӝ8B6KZz)j)KM aQ9*YYZ '=P@ e(Zc75C6P;1;.ۗWT.T`uCMvy4^yokapt@Ak,X|@.vxkGrir(9BI1#30LBj{39sVS =7jEA˭vܻv& HX `,Ta }t#-}kA-/ q#P@޺H5dA0q.: #0g08!6dΝ{9E\}Fk5KuH ZlCb 4 5 $:h E-Ա@ӎb V e4A%p髿>J!ev ?L#\( W7lz' RdaLF ~$9{T2P04wҰR$*/!(!RQa8N|"dĨ QVt -rZ"Tx1$^<#ӨF)b$ͨ@"F Td3H;`FiC& ~, 2ժ+{(@ !#͆"UO1n)XǛ0"  Dxt pRPl(N%KCG&LyXӘ`i";P,)+w0@n!b,b[XiU *WgרчD O " $Z9=AdeADI8lm70q MdrݤF0JtB 1 #$VV#i"np0!. 0p'-m f *k\/u}`+PVȈ+ءhd7K 2`h+ ,"ZֆsC  [z4 DD7G-^LO9%ɌQQ 0z81Е; 5!Ђj_ HF㲹=ͻ%pL+v] ,u4>:l(J!gG8A[=R|a\";!bCF<<}F>s^ D{761  ҨJlW̆@ h <>grsֿbXm67d#X;(hE, tPn Q1!8aG%H۰׿Єi,v! .NoHqmpZ'oZDi7"l7frhj^A(3A*pL! cBo^X+κf+|(Il^L(ōDŞZD6*Np4DIBK@P^J,v֎ǟu-^n-clؾОՎ-ٚھ-'U^bmފmq 6 .U&.ʇܑF1nJ#\4@$|J&I.VnpJ`_e}G.jf0k7!kF7)*D[WշjhӼ4req(&t)&oԮ ,@X`IF]=v GdH$DIR9buB0sThH@Tג&d/PzUz{1wFxub-4&a4,Hs0(6L1$A-MX(1-uCLBtWq ^܁ ReE-@@WgDyf0t4,@ATPX1 `Z`;.^hAdb 9B$"? P~@ ,@oRT#()a 2w` #:p ڸ-AEPC>r1؂ q5)eD 1(hS : `![.^ ݈x]UE4\9;]Qí8<D8BGt1@@l0p(k$:o_ʲIHkFhھ4]'r4LG.HPeL]4ִ N/sݾ 5R#OWO'SQQES?U_TTcUw.uVL@]PF zኵLdnKĴN JX*vDʵLnֶ.J,),dADġA!avVVrn6@@*&@mdhC^-ԥj\4eTjik\S6qBk,22Abfaۭgoo`e^/UGdPw7JJЯy$aiR8d+Q FP euWu-H׉  y5  0cF%jI,;WmtN1H~O.78>xx}q3oHY{@1a8%VF8H)ҸfmV%^6"+ ;rDH2Ah%%%$cgAx#-dr]Čq27- ./04@* 23C3{C-sV4:)5nTz/W`D.êI, sCshI@> ??+ }tBa4ߴ+*d;,t-4Wm`JPlŒE<ްmg+b I_đKDҢm]^fS仗1_‡sp lwWh5_ zǟ|L|c7c@VFF,hA)D:_t3*NRɹJ(9vdH#I4yeJ+YtfL3iv gN;yޒZPj?yiRK6uT'!0Ft`co p [ic<#cpY4`WgeAiP['M4nj nˮhfG/710nSYvvlٳi׮}N@5xpÛJ'3b };;p3`w6ͻ }-<Qgdk f. mxf#8""l - 5d v~#M,=le<x˹8!jȃ!΂+:Π?0=d(Y,>K[S`=@"/l/H9s6<ܓ>}B 5Լ(@Y [l!I#$ul 2}4=n @SPtQ H[laK)Z#n[ 'jx7J9 D gVfeʘ#\HU7X2z|N:K6)P΀ fily8 @pl:eb&f 8[re(Je*U+‡-Bo݀7묵&@s7(B~Y#[Z i(nۥy kJIJ'5?<\s;x=ו|]v<;wEP3_}Cc⍗ijI q譿gj>7賯nz~_q׳}ޏK\#< tM>'Yc@ ^$ @~0r4 ) A>t: U39aX v/C4YDp'.bt9#P<0@8H8(,O~XG;"_i [Ə ()yU@`HG>2Cg!;- &_#IP#4$ND'sG1/#zJ[ a%(c8a0KW$2IcfLLk^sQ48MU' DizT:iXN5Q׎ǩ^YV˥vaXZVfUZV*6}\ZW޵y_+^=y]ZXU}k7P*LSB ^fMlf*DS8[Zbuw/oр, t-pTbۡ)j\*a:7}X q|0bA*N\Iȡ1N찱>Dd(4<=Iy%Qe/a3C<iV{;tG7yϕ +zԩ^WW=tSzu ֥ɮ٤}hvzlbcA;={׿v wV{x񑗼V!?y_9SwE_zl^3jȱǏ CIIeF'X@MW=\K6kyё@YL2= JnUq ,* sdj_V!!o ˷߿u!#,  *%d`ki(51B8ͻ`&!, GGGkkkp,`8}"yc9@j~F V.8?E%%} OrDa Oc/bz,DF9d lha S [] ac  K  }h P _hniP P ihJg h  Ѱ*Ue2$*$`C}246<0k>,.hȡf  M(%#<jUCR4A! , n 4a#koLZ>e)!8jK#omrb)!H,V{333;;;CCCJJJTTT[[[dddkkkrrrzzz&ehl/)tmx|pȤr)#:sJZѬuz˭xlhyM^ ە|''*zE<$4~>B &'* Q= $ 3A & (©'*(C#$B&    0!b݂ AX+q(,RDB|BA ThpBy4Xh$$Aօn@@A@pJd^b&"c` .4U0AHËX PJB+ L`@Uys;^8,/ߢ81Vb?C`ws$PAÇ: vdڃq% f5x@i"&"mg& ,0Q|tPvHJaTT)y jf$P KtƏ@x=8jdCDT%N81\` tL PCE,أl CwH| gLy&l4 & W|pyA$gFqՙGI-&`x#‹ rF lq5!PCN(  y&ꀭljhh]s|#Vkfvmܭ ;$@NB" .Ir~@Vޞe{2G4 "DPo@ 4) /7< }/G5}>!m.ش)it`%Dnw |'} ε7 =GL pG2@P BԎ rq@s9d p2Tp >lcZ|}:GDA(L 04@ ``]U@:t͋c T@916K4B@A,Kc0 @XOx5p"0H4v{#-B](s#77ףB8/h钹L^NHdGx6#Rfb@.{4T 0X4Hk4iN'<4CgL x/ h@ԹC>O:I;hI):t/5Rz j \"a8$PnΧX]ND:BS"&^tOP?+^PF$ `Ys0"pV'R T@1@v`@\y:ώ%bYG?bN`|0K "f=nJ0fH^jpsb4S߲ 0ݒV Ny#xy-Y5x6Q$ŽDnZ/ sB!m(#UIpw1ⰸxHҒj@'g|+F4+Oc'#̦)OCj$ .%G@ 7%@[qqLM[D,tQـYl7 ,"ۚê8(m{!`2 %$w N=F':΋ni-yҘ@vLK)F^%z6`S:JsZ]=h:Н5l]gAϼfkX#h02LmuȎsxBdIySbh?-6:G* V\8slo*Z9eglxwg{Go+ 2s\ǿd3^ikT#wXmR-HؾES0o>gB?/)0\Şdu/y$ɳ `l@W82w hg3}9"砝"dZoAnOwɀ Ht*_8o)$}iE~~^F\5]i8zR@aͭ;ZG I65VXD>']8P/- 32ї@iaW/@IqA:];V)~GeT.%Rֳ459Q}s9Yvw@~k~@!{:"MV HZ5Sa CX#pQ߇Q 9-(MREWWGr}R儠1$ (l"#wb?ve  O@!`J^x>MidrP!FgF.Su]I#Ap ]$;d!ʅ)Iܕw Wh~YeG^1wR&vLHu9 ht: p?1Ec::>rb @Qe\ vQ0@m>e4 ŵSWƆffZMEr5lXZ`[hv~6lӘVl姏86(kI)2h=֐93ii9Rv+zI8 9Y&1)9`m 8PF(T56-(GCM8pUF:f3`dӓ~qp=Dq 'kIudVpE](yGC;yv|~PZ$cM WT}qM4PEZv)U^ _fHO)'=D(MR:J)7#YOTTNR U565yY3#Z&7{TOʩR"!tYRՙF9+~ZMؔY[Ww C \ mB)%"E)vp8E]ӣ@gpNvxV㨢><6A9PM;@:s@TdccSh8؋F܁AwDSSp1r 'Tj)ɧ k~J3*k(zJ2:}i'S* %X1+jyKBEeHdzȚʺڬ:ZJ!Fkʆ :Zz蚮꺮ڮ& zگ;[zU"fgj;{sn)P۱ (@4۪zD(*N@% fl,;4[km'熳<۳>@B;D[F{Hh/NPR;TT{XZ\`b-9!,z """(((<<>>DDDJJJRRR[[[aaakkkuuu|||%dIzhlp,tmxGm$Z`Iq 3)8"ux0` Kar"BA !@G< rSW  D= (hd E(( V) =Y(e-d dK*A =Av( )SSd) =l`e"p&Nm`LSQɀUlpAi\EXh5jIk-tSUXtU%S#b YliepVf& zBG m X 5'Ais _jenS)`ۀ4 0)zxk#%0:< 8 EaJT6;20lbDRƱp@P&`< $@ԝȨ&P5É;VG2Е.ր4p,nL9E4r2BcҀ0ZБy{`6ѫ@vKDFk+OZ6mhxy.&hV20DqT0HH@;Mrrps s~0);fAwS'4@EjrIVР)T< (A+ЄT"i0 z@7. 0`<YTƴ5K5S0`:('p( 5EZW q X"VrPRLjuicLhtjaTE Cb)M>1U<ȮEܱ4Ԡ D+c(AÁHP6@U)p0g~|&$bAfctRp8ð ECS p`!(fÆ2Ĭ :pRSgX@O;=hi $HD  s X:@<<aK|D@t:j=lQL_4hf7G<8h 8#Zl" e 豉" L^&@PF<A2,yw1| b@A 2aL@#B.zX`@w6&m8#`o@'r<^0)pA @iu%$Ax ̑Ey XUhVV]`0;KhJC-*$݆FsHsPGB H0Rgub|`-dmhlMv-p-tmx|߀.n'7G.Wngwy@ hrnAzkp_^ 0`߶~wT_D%wwR=Ý}w}ׂt{_3N;7pk0K Lz#S0`.2tBUAĭ ޕ ( +EZW (@"`B ܮt 3s^`x#(m08@OV1@فh ?9"ߒX Nn.F#ZSǺ `a46r bD? S@g7 L(e'7D ޻_Ҕ0Iqҕ>jGk5B` np|qG ŀ 죎 *I ?,W6hMf O0d7I(h(;G5\xXH2FrrE ~`6p)A!0Πq)YYfE Zh`v(*?Lk¥`*mA)!*%ƚvB#LDq-#B,lQ-3(Nral%!Jdo @ @ ^ "XI18 qh;U#U-W&T B8ga-lVzC\+DV~@=@7)iv\$Ux>z^ ~A9(w@`pY@J] X!SG1 3ʰ5Ɂ!-DPvNJxGF}9mϸiwLqLܷPзƉL۶ 8ET2 A f0D@1o6xB >Adγq=fy!,wG $$$,,,111;;;CCCKKKQQQ[[[bbbjjjuuu|||`mĴ4bGd`ZiPc@6(10DA&p8ݰx,R"d.&\"S3FQxaU \  lk  7 z ͯs ^  $, ,@0@@ I0EAT@ bx(&p4 \!,wM ###...555<< pp >  kI 3>I9G>  `XZIUAI 9   "!!,wP ###***555<<PgJBi }.&8Bxá@R0<(;;k`'O7 ݆Bnl2Aq}%UiT;YX@WoДP "*8 flI?X0`j .X EA6بarzl 0A 8rXL[2:1E%΀^Jbp@ 80 ,Z9cK:bb*P !ph-)bBX3 {A3 X 4"90ӗ>dS\ MH󏏌0!ɳ1H2r,Vp~@< K$P*+k3l+l' 7G,Wlgobt,$l0nj~T8`@I$;m@ p  X!?cEس1`Č.= "ȿY301L100:R98 `{,wR ) jh6B d{<= d[(A­n&73@FY.tK `8sJaU(79&@D'3ȚHg bq_fS ;KRMHMRԦ:P*B! ?,wU ###,,,333<<%tIcIp>a\8QPz ppNMo  o     OUrr  Ce E F  F [3z!,wV ###555===BBBKKKPPP[[[bbbjjjuuu|||&di&dV *>#)ԬX6Re`0H S"R#Df %QQu u~0 /T8\~J" dH % & &  +eI!!,wW $$$(((555===CCCJJJPPPZZZbbbjjjttt|||`'di.dQ[qU*YP0Fm`0 n hF"@4<#}:0L`=Q Qt  t } U 1@ ~: " } B"e % ~&   &+f!!?,wX $$$,,,333<<CCIICBMLRRUUXV[[[[`_ddjjmmpnrrus|{~}{!&!*%-(/*1,1-5195=8A7tz!AmȝoF -m@ީl0`mFFch\ ldlJՉ7۶BnHf,CFj=LцuT^ Iˆa*݉93諓jzK )9-.GF)yHˏaY- KGN눑.5 l [>t5,"d》d#PdCz9rF_B8BUT, F6zPbz{I9e h d m8 ` Jw0 0 0@(r׮wh1$J@CY+jDǥI5FB*(*lH&,F'B4->psCڐ +"Tq?ME4DY.q6I(! %}zpؤ@2.) Fˆ -Qy MfHLTdȠMt# oxfɏ0nG)$͞>DZQ, 0@40+0!l2> =)U( v(4Uȏ7Bbk)P&-g$դL;өtw!"Se;*,TbAVdC˸`]BNJ34٧UJhH\ʸ9ogÂ-L#xdySeF,GXs ߫가*U20n !)՝D($>|Oc 9̮MYGOzAyJ̻<ѳ=b1zl~#uO?3c~{eǏ+/{?)aQODyo%OϿŷ~. ؀8Xx؁ "8$X&x(*w0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆nP~Prt8vx|؇~ȇy({8vWN~hX~Ȉo؉6zh;g}Q|Q.(h!+؋8XX $*|b؅(H {R|xx(ǍmF0cHgzߨb㈏tH0X (uHX?( )Fw1&pQ}g]*YK$)4N8E Y!Y}r>yY~RՍ@i~?NdlVA 7{V]8y2ɐdXor2v;r9i a?  P;`}KD gFGْTiS3rw}I P8W^ *r)Ea"`(/)+iʠ [cc% )x=ly)(/u| ٔi!vnPٚF1 0 \: SjO/rYsYcwCaӄx Y*ɗ7EhEAFP@EaqKͩ P Н/QCzhqm %R;2'3 @@"rl|Qy)/k ڞ!jpr J Q ЧY`#LH  0a3:WڞD)tOVFgr)cjw)9i7ʆ9*9/G; DK;&Fc"@*tjWmņ u pPZi(_wYeʭ!ʀ((jojYD3Y+'Y *2ۃZby'[(zڝޱAJE U:@ 8\s#=Vo) rzc:NTs V2*Y/> 1{Y 7:T(oН, Ck0ysWBJ $6:J0*c)/7/wbaZyFIs xE"":Ph0`PuFU  (% 0*' 0 d+ K!z}uʣօA"J L+V/qkR8 jyyGA PjENJKTZAywqzfj ii(^/mjٴar9 컀;X+kmEqgSY9WD+E$rzP*9HvdqNnkta{0m|ǟO4PFD dKڴ˖k!/q*~/g~Fz(L#Ĥx+M~;lYgwP,wrӑYΊEڴj{ou(,µ"&)551ۃ>ܴN]ȡhWVE(9SY̻6}1 ŷ]drc{hBUpAfYϑ<w Ӫ<și %qf|̦#ʚPw`zgsw63Lclpz(-<' /10 K'$Ԕ7+Tp+AHj  l<%! lBjq6.뮼kFKjw{MI8'яl\lkF (o9hs˓{&\ ٚOC Më80w>MN,..qpt  slj=/Et*C[ls{jd] aMceh ֯ b#[ʻKG9؄r_Trk^ (d{. kbA;Y1 (1 U*ñ2]ՙm|j DiE,PtD{9Eun]w 2]n T&⋴`68MxZOk\Va{^z#b)_PyG(+HxzPyz/Jw`ZC^Rgǚ5xפ>nFAI'Y9̯b`~ ȟޏ idiͮ~ɞ'>"Il܎1^n3.^.._~Z)() >ώьو yx&=I#&h񈉄xx>@DvEhCP?{iT_VXZ\^`b?d_fhjlncbt_vxz|~߁b1N3Nbq?_?_6ԑ8I?_=Ngoy‘ş=ϑӟڿQ?? 矀?RY UPA .dC%NXE5nG!E$YI)UYP@YΤYM9uOA9)ХPI.eSQ$ZTYnW?¼YiծeVؘΥ[]y,J^&\-\2 /fc+Ue̙5/wgСEڹ2iԩUf-ҴֱE#Lm _e{_qh-[F6r蟍k\#-;oꨲ}mb'*2Y4n=@;xs@?;b>Z):BFed+$,>O"DhB@e @A z0B E2 틨CR>(DZF^o=r-QZ" 78@ ~CK9 afkZQh\ eil˪pD^D^RUn5!GD9}HŻcLR۶TCB|;R~1GCf iI_!r@q!Qd-CS`->L,Ph $B YxdDhX9~` ] w -RaP;DH y8C]?$bB|XDpH,D(fΉQb6E+fQSEtc$cnXF45gTc݈6Qs4LxG<ڈsqc;QB&Rt "H4M$YILf$d'=9CR$e)1PE*\JXRe-myK\Re/}K`S$f1yLd&Sdf3LXBdXDlfSf7MpS$g9yNtSdg;NxSg=JT,˲g?OT%hA zP&ˈ>OFThE-zQfTd(FnT#%iIMzRGRT3iMmzSLc`SUC%jQISjsQTFUS'R)R4[jWUZu"X݊VzVUk]X%B֚ 16MYX 6m%laֈU! +Ud-L`hEB !@P!uȴI$SEZ4usټ  ad@ɦ靓a{\QlBj LCF0!z@!p $,EHMm%g*%@8f@x@ #V6 0sF vepP Uz =X@!2@b0 :ضĈ"J"6{B7@@EpMFi58m(s#+1PP1ޠB@,`жq@P6{sa4w!FH%80  Hp@!*f2T<%4n#}| 2f fDv S`oYel(ckXk1g& Mg,̽hCjF @ (@jY3"h!{m b{!K@dBBfOMh|M=Hpm(1}tF"@eJ;?> M6MM9n'f"! aXrU$C،&;66rGۡkOncWPkrdbv6~ ;y ?lZZ#ʐ:խ'\8T:!?u 0)Ӑ5 2ýLdd C]3+؁| f2 xLn _ؗRg|f8AF-ja8"(>P dЃ H.@s=͚æZ)jh%a/S}a1^(T(7XA !I7": c < >2AtY;Pk`V"(;H"!qRRz?3<â?#`zéチs7774Fb)5!6 C%l߈6nRm 9! u"Zp"t ,,Fw|ǒ:5IƬ @7|2'p{;zGLȊGeX=VA4' c0p3G I'tHȑLI\Iw*Izt dII|zƈɚIIDΡ0I,Jɾ)(rB|JJ> 5vڅ#J˜ʤ\*øJR>\'X8K0K'L%PKs1p 3%b_1Xb j&S"G^KLvˠ}Y(YdA D033iv$P"^9N ?,Z;; ڈ@>D 6<UA=TDB5DmTGEEGTJH};TM#T" Ht7TT KPE"@'TU\՜Dps8K[aա'c !Hl8e}ڀ!# pSl2码 b-W34?'chHhRxhW"@9V (0WbdH%ncEԅ㘭c 4# Pڬ-aD1]dUV78Ʀm[[ PH@!]8%8H]XHY؅K\ej>VWVǍEp" W঒UP@؅;f|fFU"XXxUb|>ofODh'v nhhԆch^nh>}fՒNi ii~ihd\G&*ifpin-x"Jii?Fv%&>\mY6(Lx2o=6}2 H9!NLdViN 77h ߐ`xM̻OXD8~F v!Y`RE EKN"N> ~aT07Y&6 ~Wƒ6EY9 <}A;O6>寞|i(iTPx7Xp&^bDH(Q;gާ%%E(UTp Jd̦tg}V~ mtu*wo荢T4'p _Bqnjp_zq(Ϫ(NWp OQ'B'})wK@(a0^r(2xj&&yv*-c4ON8r '``RrU%r(ɳ'Pq.g5ڈs+&+h>WS`stSsr@4[6{8(2iSSL5:9[L9##kJ kLSM`i92%2(tF_&dA5036NhS^` Ov3eq~6Ѷ6o 5^-S"I7"7 EIєhgA2!6[ӦG'cG`+K(0*؄LF?(`wyS SpyK0wB:/#9C Ro+.ay<Ǧ1q6,b"i&M@cGM Kh_8c8&0` _06O&v%y&WIK ~t2ڐ>'w?w{;!>Meg_3agN8S0LhN5@r&6Po؟ *,T$dUdTJ1dd *Y c@4e yd9-ޑ'PJ1K)&d˄2/Wb3*XL8DRL jV̲m-ܸrҭk.޼z/uS)+l0IJjxĒ'Sl2̚ $!-G6Ĉ 6@ .4j"@ah4=qkuJks2I}R&/ǂ9SX(eIh:x? 8  ac- J8afHLcA#v>maD?m]8qaء0Ds0E?(#A 9$EiW2LR$QVx䀳A,Ry m%a9&& B&%miah'}g*y( (:(Jؚj)eN):*V٥M)zZ*:+vjff*j+ ;,⊙N@>DlvE>Zs]_L2 ,Ŋ;.ueɮ,O ZaedkվůnmE2!2$n=0׊e{1 X>]a18Z"U-#@[а5|3Wf1=+qw@t#$  8AJJ#cl@] t 1n`JتM#(H#s ,DP >M =DC83e<I`@P#[ḠEp )ds&Hu4riM>Rr7o8bܖK7-Sp" H밀V'T %8eFF"шD ޖD CDbz[ x{Nӻ1M.hVcXHL9UnNx)7f 'h$)\:@RI+3`_QЖrH{O<&٩oA2TI:]*ؿ.=f0/6T 1k o;h8~ʑQNm$4Nrr-&.<ɷG 8!•hyǠ]@0܁,AA`H0YNG8߶4*jN p@,02BKqiLGumlӥ!_Fh%-K¡De :[B O@ 2", PaIag^j]ߡ[o@ &5] ȆpD\ u`ndzŘ܍L-k!h\[D$TBJ C*֠Ȃ0NeO\TXP Y#"ՠ߹!3 VwѡHֹuE6E5lG76J"7RWZH[S[.,\D=bl6? I#BD{#C"3 d-0E^EڋYALG\cC_D!dJ>HdDdI֡K$MC*WL" A$OddNN$Q%d4eh$d_x%D/_C,/0A/YP*% _t^\_D04A\tGY)\XdAPY6&2Zf TEإl\xOB_(e`8X8YBfdJ[EPX@- АWGA4@"*lYXxB4C@Ђ8 lD9PĘH&OBpaH|AX\lB0'ħD(||DtxD1Bx/BXJD(%@zQl*J쎴AM8@Hː-y!,G= [Z^8mFzD,t|ZD^n z28}DX}XtG'lOx8)l%20A2|wExHDd%|ADj!~dHudF8_P, DD0men(YO`H`Ju̍cPE0&2D2&hOBC|OAGpDA'l'8jFmK5YՉP>v<9Z*(^ [kAO0!-O{tcOtz"% &z+P@(H^(2(&aA`+2)@|A0~kckbƿE,FtיvdI%FA2j&Xl"p&$2:cAѲE4)%18%XD,PXh[6.e4lȔMplrCB @ \l@pB* IIJCZLDipz ]C'4* C/8A&XS1BXWWƂWbB,hU)TAoA) T)$*}/*[82dznDnOA%jP,n~TC0h<h,Got$) 6bvȭY%xCEXvB8VTj`nB02 w *XtzXXB'"/0<r1PA߫zGK0!G[ic;Zq22;.{./Ê]2Wm2Ĉ-yD4 ,OHawzvIųB A4L A"D# 4_>@ܣ573Jia40ĄJ`q f)-܁m:G<M$x1 <՗"@90 84Q6GD0P#PFeD,@ k@JpmH쐵/,2L01R#O#CA\5_QK]R#({O)jh` ^F]a,9aHDN)^0*>P|=1TA_D/u%9c>06A@-nue-PS 1]#=V}K,#jW\,Ҿ1a몡$,MAu,"LXHuD,$  7@U1C@Vu7Y`wquTTMpDM*Z 3YttDKOT<[q!+H,"1CO#@ =M?:8jve43;މu7,1\Pwg9 9O5i%w9#o֓C~9y9׹lҹyyd9Zz]زl )VU zQR:]]\r]DfP%%3DžeaJ](&Q(=|z_[7?~XyC*R6[\i^-M'61 r([SAx!CwPU1-(a U C)Z{9!pa9 òE8/xux@R HFRETPpZhd+xG @'Ax R0+@@ 7i]&r8K g8VS0!F,b4pnȸ~ 0I O6P!EʯViۍ!M4[Ih(IG"2jB2]*#;24Y4!CK2R&| &'&ha D' #|bA=GdgUGw.13*TXs\IR r a3aPZV5,LȖjV[Z*'YyUW`k]u=y_؎V% X^d'fV6kTt6rjYմ B*j Z-_9[RV(p-fѵq!.WK3]ユ.vaԥG.U›\2('z[|o3T{O_ſVD`َ|\a pyr ą̰{7_4!V`;b6./36AVt[siIVn ##K4??Q򖹌&cYF]}c9dVu΢?le8ut3[i9$ ]hCщVhG?ґ)]iK_ә9iOԡ :?ЩVYjWzoi]k[׹uyk_ܮ]lcF6lg?0]mk_َmovmV?htx߷wz7S$`9V ޢ+ kiW2!$ E!,aaܓ ԁ19JnB|q^rs6'"9IW܍Ukm,-"PuG Αjda=XKB]Q=e.@b `ltwն+ =M7i1teocfuz_>ȽBV"X$:(`*@-:i_{zy{0r|f#EgIQ-Z{X}ߒA! ٟ|wNXʈ|' 0Vߘ`"p$#UP~OAp<M , BF`.DDDKKKTTT[[[D~Dccckkksss{{{>DDLLSRSS\[bbhheehgllpossuuxwxx||}!$"(&+)0.101.5386<;@>DBHFLJNLQNPNTRXV[Z`_cbhgkinmpntsyw{z5 *\ȰÇ#JHŋ3jȱǏ CIɓ(S\ I͛8sɳϟ@jt LH*]ʴӧPJ]Ih̩XjʵWvKٳhӖfUʝKݻ5˷:xSz4È+ׯEqwp‹3k̹sƐC?|]01{^ͺkנEKڤiT'Dmb7iFv,#'%5~D qtw<.:xIP /zfTHD]p) {%xI #@B -u 0Bw}7B#pI%y o` $xTu Kvь%5B…o0x `&'@҄pG%$IB.N$ɔ*AP2Ɨ_ !)g 9I_(IЎ I##)04x=ZyіF"P#F&(A.tΙh`hv.$Ic'6hJ=etj$J $ůM>ɦ:]~^#fLj%IЦbniQ |vY *`J~(Nh.,B&8 I騹#ۆmzPzh :P{* PhXHBXaqspljnJ3`)pHP"); )$:Wȳ!$plY),$.lZ_N AY &( `P'uB&[ N {h hvv]&\ P&!f V!&("{ 1NX+;nfTh#uap$I_ }G1ۅ^?BXGRw~&H=~|#JRjlÒoPqD#8ЂdbFR0q<1! (Z0]:EPeSDB8N0@@`5hs ܞWS|TUmX2I0r !p3EcD<+DjI/`XWuO:SwHVH'$Cqy!i~S PPjX# LAՈIʱ_ PƷ\y4"WBPSwrC_=pP_#,#- $$4(PmbJ>I4BvE<<ֺ$+9C q)r{#4$ձ0j/JMz3c(  yˈ)#']BZFQ@KU$OvD봣3BQ&)0+UP# * ɷf+VQ(NDPa |&42MІ8p.k QzS H;GL^`Twx(`<_CtA'śBW6F"CH%FGe^R=*9+F!z i9.KjgO. $i2s8:԰xTio/a-78FDiTV6#wї@JMսּ,x[퀂I"&TˑvE;H`%T*Pm#hJYp$#zήU?iB/ưsCN_ t+o[c &b ba ܀jct\@ӯrF %,9}Ca, (I"L6q%^I407b`5KKD(ǝBXVM?I9POYm$ɑ;ud4 q6FZF<$ ,ni~ X6VBTRuF^kb2yH)aoƩqy(dEَ?qlfif&7AwdﴴV mmH4MMIJ|D F\i݀ Vt:<:!PD2:( L!MDVr<"/ t]Ŝ7ynoD.!A2 o2)j"uPR'X_ɯ!Z;ųY$AkOTT = eiVvdDr:vFug3(ϼeGO'%,jIW?[gOϽw1FO뽗`ЏO[Ͼ{OOɯϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X}?z'8iB8DH@؃EwJ؄NzGzO8T؄9H8LX\؄@h`wu/wWKykhw׆}xteG*҇~8XxXE2Gf$a8'' xx' ?}8tHȉq8w(8`Hv SτcxX،(Hӈh!}hx8wE#hϨB3HxeBgiHt" C!P/! q%'qrpxFEa h'lau%hh(Bo!pE8$o !G$ID 'MBVqH;:#yop 9|)pXo\ٕ핕VQ_V\_8옑8vkILB?*Qy@=Ɇ,ٗwqTN'9/C䓈 7YpFLjX!J6Qi]JY iR 4ɖVvzs^y p#V iH3|ѵE!`X"`?M6ɚACFdPY2D)VZvPC4D~-^MKIHge.2[I"pl$Q&p;g&`ɘ)to Vy /1o_ٙ/qo!@/ouQ$ t!@_VQ" k9a_g3Dz6 @`A9Xo7ԝqCtt/a0A,wgtbꔀ9!z (-+qgz)Vwt@sѦ.EdCi ڕ l tʕ $Z\Yj!#ZWUo0Mz5zr8R8jb.y3xHj6V_4Z?M8!!!70q;Y Q CSZJ&$ WDlv s@:3s#hG/tFt`@"o_u ij1:wA{rfBg""j6$r)/q ?C4ޚEjŴ<7)G䙭8F+3D_[I19g{0qA:9h_(PN9脮Po@?R!@;j\$@J;po }ZO#8H +1k[gJگK,}(ދÈ&ÔDMމNF͗DNXk(W*.LN~VT.9~Y5_N>\ko~/lA~%p~I`{>^t86=X)}@s|NvxH zhcc~ꮎ?j铘JN]O뼞ŽQ8WynM>^~؞ھ>^~ɑb>^~?_ 9H?_?r&(*,.0}|68{3}<>@x#?}=FH/VCOIN׍^ VX?RT_EY`N|Hbh9A}}prxN]~O|o_8χ?_i/? _A Ŀ~J/8 !)!-(?1Oןo}lt!?wi IA .dC%NXE1a@6XI)UdK1)iT$6DHhIt"΢ YU 7v RƬaŎ%[Y4m┤ۉ@`T`jT Pv6) I_kȑ%O\U5ٺXF#FAq@:(`D !&#P La:T0`@SMHC\Rg+9uٵ'|3d?oRv'Q'oCzTQ"G-<:*pAt06Aƣ`7|LRM0jPаFBʓ3D {D@G"4ȗ, h*E4DD!(4/QD.p ʄ!t! TM:S$ۚN$련  JLR"@P(5CRIOSU<9["?rG5AzcSn* cEPWߜ.ND}OmZllul!5PZ 4̃,Ũ j,HTxi#@$8h^n%nYJ1焚Ѩ"F Jᯍ{cY}lRGZNNE5d[6\uPdTa9| K"5OM kjt`4\Pt(6 0.I, Dݮä&p#ԂSo Sk%c6<%j+rCkZyFW;6!u/|tt iFxSgi7ҳ{/v߃7xՅ7iWw^䟗~z?+z~{O¾{7|/?}wߗ~~_[zP x@ d`(>PE"XA fP`=@~P#_IxBτ)da B;q3a mxCP;a}C QC$bxD$&QKdbD(FQSb !W rbE0Qc$cxF4QkdcF8QscxG<摌b\%0Q$d! yHD&Rdd#YHva$t #-yILfRd'=9F"|S%AyJTRde+]HQZЏ )_yK\Re/ˊMe1yLd&SLfZ.SӤf5yM56s"d1MpSD6%#ydg;N8BT0QLD_L q{ ǩ ehC)O#`,z=dq`#R  CBp&n!b]l10δ z!4 JO&UKE$D"ы@@>`1Bp<8B*HH\RES4 E @ r "SN0\C[H`jcX9:!P͈t=@7x *Ƈ%DJU!|`lr9#hN@<;o F@7f#)7 T9@z:F(o- jbB$\P& cF0$D!o-d{_kIY,=*VATe,@j?*R4Ė9lgu@!@W` H}Dp|LQI1l Ϻ@|?F8(rW#Ar4';xk~|eJ! -Ch=($i=$DZ sqɒ@ [@i$+_N 8k#!R >x=Fގ=KٰFL0c(i۩`#9@ҰjX+U E| LCʬ3a!kV#Z.>6\=8[L=`T4W'M2}wxӝ~McDɡ *$ a&n܁ 8!DkxàɿС?/I48PU*>V"٘:); 6Coj 4// ..\<춶=51‹A$LS0>*`3;X+6J?nSB0 Lb» ؃҂;HR;b?8¥C4C@DDLDEҌ ?\DIE,Dz&JDNDKtDLdHD$QN I@?I xK0*M9Xd?aUhmU+ X.]U l l0 UDVx ijե@HxWrrkUP<~pfXPM]Xe2WAX@tUXX1XUXX$TXOYG2I`m[2Y>AYEF fe YU;DZńG` 8U}OZ;Z/P P݈%( #؈9P!UF]uǵZ$"QQL 0QK9U!MLS ؈@`?x[ǽ$,e-R/I8 8SI mUSԣ=\cD]]XW׬W=KUp (R1.U1|W=A`\=\KV;ʝSq@VP U9܍TJѸC=_7R"$YY: XOUKh/z9 ՍHZx #E_N#&Bl@lUm#8OPOW~ul^GHA"h`aW&AQU Nb2n&Tb(I(wbtb-n',6b0f)60.ccL&6("2):F\6c7&8^bG#e;<=O;- |/1ۀ2FA-.9䑸18lL x1 L84L2d A;ܣ00,C;IrXSeYcZ~[> S6L7P:` ~Bd)c>f-NfYf!GCɛSI[ ~n&_]fg?,$ً@/#l: \@- 7H;?8e3.{FcգT{1q6 Ϋ?G02FC>_|G,]Ĭ2,gc#^㖆ڗ^ev:}C#6jhjc'6EjQj5jj3j V^Pd^I%k$>g|5ń68F1H~NA *0.v#1ȂiȎ6H#H03'(ϿB7=j7XcF̓#3l*'*pK@#Dx&Kx0l:/Q/bh*707(zFql4lr j@tT4Ֆm^̆L3.0ۖo.2^6pDXE((XΆ]=([&1=㰩t/u1H2y88HYh\1{CD`o'po'K)03)P4Ƅ(p(rq(/b= 5Rb4G< #0l9&ގ`v4Y/5Ƅ4K?-Eqw4r,&$z { if%}4$n6OG8Mk. ݵ (r.'r/x&D@KtEMUBJ+:g^ O[ s:uIUD4/\9N6xn`]2Hxw߈6HC04p?DŽڎo21ʍOv,m׋F= ȓQh( %@ H&+otȼ@M^ND('hE؈Cp1x4?߂*CxO|_4dw21Qs5e@#ˋƿ$ߤhgҍ'678Z@ym|3(r)5xr'.{((SI?0ژ"z:M/Ԝڜ &֣K02C'#,kO'/)_ʫه?$IhVqǯ?~{NX~?f ~Mʨ~cwvDk[K3" (3*E9z{WM l.#k}0 ""d B x@!Ĉ'Rh"ƌ7r#Ȑ"G,i$Ju4l%L;f6df#:w'РB]Ii ox$'b26H"ZXCbǒ-k,ڴjײ-rK4mJ .޼zEf8bJF#a c"Ƅj6HQcԪH%Ebcr {0 J44(%m3o9Ѿ+w&]{s- B@8ј HހAI(@3Bp gC # A}VWVYp%A@V AŬ]͑[zXp PZfW p(kP"00 /@"āVmkX <X(=l.>=[oT@=> VMMCd旯F bE?" ;&R~=?yaTz%|ʲĀ !i`$ ^! SP=! c 6!mBP> s(!cNz%$F|"(E'" CHJ@of<#Y%f[Գ$VY>ғH # d e4(A2%jU6.Irj87h$"AUQ#| CG$!8`Ʉ0uA @9C5ό(`LQ$&>&AHpŐ59h)9"DORL`0A(3Ady 5cb@CFk@lR%&&JL|e9A,l*%DGyʸ$RfT Y r,L|1#(ڈbuL̊_! 0Ik&"Hψb@3 TfYDhj)╔$E(,P5k6%G &z#%%V"EhhKR j#U&ihLE1A0qy&BLs"MsLr<*(I g]`J#%zw R`LV!5Ș&F+DL!rU܎@xl{.F,` X؎\U ԦzdD0jMj*-6UTklUd|I"?󲭪,Y֡4.@pRVRt:!B\؈xr4 &"Wzuo|-YI \ *yD2Gg0A$ %0b1~ {SG $$b<N"7{`G09/%Gcɍ8?فblbJ_+fי)6N151Պ.X>Sf Tz*5 p?#f%y lat$ŹPY `"yXvJBۃ(mEo 4)H۵i_IYbeitWT@lVnux01/3&@~f"32#?" 'ph+]Ak`%}8\?sQKoԥ~;~}D3u=qC>k~{%>P/@cYv! K+ǂ| xuFd2?/> 0wmȓz+_;[{/|U=׾'xQ?~oxG>q3fO{CI g@"11b9HD"K!(G3\6dA@8%%@D!EAbC`2|]H "H``%:%< ^Jq~U+R_ۓcl`0iЇf;iM9a|؁AȞ$cN1@_XM=u :pAA\Bpf$AD!b! A  zAD"p%,Bl"t"""D"B DD *fK KN ؇y?Q6%xF~t WΫD Ub ?L#Գ ̄  *&AH%$`hAA _A\RqgH$THB ,Dj"= @ MO KMFEbB"%@$t~ PyD<$~<\!L %JQ(# LA" X.B"4)]F4YT4Ň@H5)I3WIO#\Rh!\H8" oFħ9yDQ $4Li3.I\0&lq MڼFOZoR]]@ܑ]ܕ†% ޱ˲02oO-w 33Q11,?P.75+K4_37R66w87l83:?Q99; :l;˒ŨM#ҫACx;n L {/"\#UΦEa?nN}`79'7wdCl' @ךUŐ -_B_A(0M ~z ^b"` JF c&&1v$I ` u Hʂ$l@cFpx%(bPC`(!9YpKT&2RVH"vlXcɖ5{mZkٶun\lh{o^v26*y1^ 6|qbxYzO1ٱ3eM@vD8 I' 33߯R@`,0$D` f^ Kf<=䤐D_ʖEmJK^r|~@Z /2/\kDRB C )$9($PBA Eh+8P4 ЈCsCD GH ')ĉC0I ' 'D(tBr '/.J<4\6lk <﯒(@) йdQ$ЭޜJ-LS9*)A=EUT5=TU]V]mS=#RmuAS_5|]b=vXT;q}tE+;kn\LUYjt v}x7rCM_\ו~`cE^g=Ԁ^Ns >5ޘ1ذd='U^喏0KY}G `[uޙՄ0i}o礕^i訥} k j cpʚ^ykkSߴ֑fm;&:l_5%@15|M2%M?d\CG+,Jm's@1O]yGw_~KNxǗYw?O^N'{a?m~# XIΫx0f )XA ^9A~!IXB)T YBV$ XC9y|iχAXD# bD'>QⳖ8E+^YmXE.~aɨiT)zэqXGюy&ZG'LdHA9}HGT"I^Y$=$ %/JS2a#=Z+zD()KY],-(kZ,,IaS}-I$0$4YM-z5">'`˕ N/ѡ7EL >Xl'׈HY`UB"?m(g6_kQI>R"0@D%R'`)9ZlSFjh(C@F$:>QTZUJVVz K#v:Sޯr L9S9ѽaEJ?pVú/c 0RShu}-s"D8aI˻ĚX+YHAU,6ͺtf%JZZ^sFp7dd0jrlIvmNʵ D9+)#,x]U-|R|qrev;fE Oz(,6^deIJ؞aG 'Vb1~el1ǀqucX;r|4Us ]+ЉVhG?ڿ)FWә&ե5iO˩/! ,  ###+++333;;;PP#S!'U$*V&,X).X,1Z49]:=_8=`AHE E I JKMMPQ Q#R#(S'+U*-X-0W/0X/3Y38[7:]9:`:<@a^ ^^``ab d$#e('e,+f0.g10h54i87i;;@b?j@>CCCKKKSSS[[[ADbEIeILfKNhNQiQTjVYmX[nCbCHdFKeKPgOPgPTiTXkW\m\lCCmHGnKKoQPpONpPNpSSrXWr[[t`_fffanalllcesghtjkuooxdpdhrgktkopxtdcvjjxnnsssrsyuxuwx|yss|||llg̦؛[Y[ٲчYٳ5pԁx \ȰÇ Ғ !jȱcC@~(L>X>PmaPs>̍Ry(Z.3Gf砕BY@nJm"TPCY= l'\4vjUY8@[u-Z3Y;V6K KVU.z0Z!U<- @fӴXъ+ ^ϠGX6YhN~1!Q!`1!(8%nږz0~_1xF3^1 .&KM'*S$Ǡh!I>:Ev! > gMx/PbDrQÞ!m80JaDI'dLt?ӄ2c:"t$ [`uc=D+h꒾DHCNm>X߸AΝWJ\zI*IaJV5 t2G䄾e]Z՘̲V٨uq!̣ 0-! 9ʂ5EC{0nz݈\zc/m# $Ih@Ӈj?Gp HL%nX(8WϪFlZvNɬԅ9iHD1$s]!f 7h@Mq验l%VVTudG[t=ӳ*t5&QbPozXq{bIu;6}-s1vx!LkIT:x$\g5ugZ|".#[GuS漢CHwBwnuV% @\zctN0'|"+ VzʿZ-ΰ77e0GL{1;Dl@qb86isL"2&;J~L*G"Vβ䌘`L2hN6pL:xγ>πBЈNF;ѐ'MJ[ҘδR8bرzԨN\j}zհ&GXޘu!j^ZպaN6Ahٞq"Ghd֦ije#$|bveAfvN/w rwQ{[F8mɮ"O-̏I/Wx*`D(d#pC8(RqpzɁ!|"Kͧ7*ty <%(Nl `[f2B؁o>860ni#J\+7ڭ W܊.Hp6WL_hd.f}ǺGuv,bm>/^Dkgΰ=;?iET>҄b4q+z!P+;i=ױG$JѵI#zr;xRFȕ qk23mj_"h=H6zGszP {G@z4L DW{c?%ZxBڷsG{WDI]Vw7[p%'}gz)wxd3,/  r'AwQDX1}KDգ@aTN!p]IgEՁGWwxJSlp+[Sb:j;5dėx"AȗϤ4U.Ϸ!}}g0vX9&F"(FhYur01c}xwt'[pt >`}fW׈>[O3K<@8\(`Q+X{|ҷ8N Q[wHA~#%VD~规[-{/hUh%[}>[[/#Z"e[ڃ*4؆zޖdGv$"@a:zH6W3$Nz;5SU3rg;UÐxny}{xP 0&}2u7['vI`xwEr)|E+xURvh&60"Sa/szC&q}]i$08q+Ftr"q4m3<=B#7>F LS0G)(|`}GHs%aW;Xђ4BP4Z7aEP hx158}չU% i&X#Q+UIBEEHf҆:07Q3b#0ǂWH*{S+ؓZ2!TʈH3QZ䏄ț@Ss98K Sb'aGD٣4}޹kI*ɞη0ْڐWahTBig'z:!:[ GzFWȏwU1F嚅w-+w=~Ӟ*uS$ T*hw"i4@'Sx{W$Cyi||WѤg뙐Ꞵ\s{V=Ҥ]JB#;&qm=h~kjP9"1^f 1#h[R[Sz> %A9KCzsJHI٨&jl+>(rG(ɭSH)ڗ騹xY9pʘ'"ƱSv"7!wM/Ӕvzm ?x~"ZҸ<+ WZɌ8('E4Eև[n7Ek+*Y=۳ 5 ce6! v@"ŨT@BPP 0;І0-80\uЧ , bؓ  -E3e ]2# -'03]68M: L< L>;5G4] [`A+Xݿ:kHA&[Z hN!D3HTaM-A-mYҚ0ҴC\=7]֤Wvy=[Г=-u2MBMӍՒ 4]2Gٕm¡ѣAǨ8=+ҒЎۃhđ9D_п=Qmг }\=,sm؀ݬiNR] ؒ} 7qPn! "]HC~2m =]jn=o gC Qmd⴨M!N1!Q nbBN1-ܭIg5m,=V^}7r`N bd~'w旸k܄б2gy. {Nb)  _ [^p^ ~`> ^F붞녆VO^HFƞ9/$^֞GF;^N׎ ^@b0?_ 9׭͒@(fƾ D#Olu*,ѓ/1?(_~:<{?/0Ƿ!HL E`To\` cPE@^@\`E`~> dX]΍ 0 ^ @` Bp  h@C\q;E6*.6A; ~cOD0]Dj^0l0 ph/]p4)%'r3dBAn.q=}38alr"S"?wVP7k:.Yl[g[ D\@ lB hh?<l[>lԯ=Ãg߷gY̲Yuіx@4BAhi}l pP?g p߿ LÑBBIr) I1KI1APЩTj4t`1s E {_XTV vysӲk茏L /P!GkνTq3 G4H f!"@.{1"S_@muFYԒ[=[X5nAdSrlaOR㪬꫰N%C9tUVIUk0) ADi h,%X>r@laSp Sy [)k԰PT EH՘C_Re@(RVͤ3[fN R 5cؽ ^"{NDMl~zFbLpHLWoF9`;Q]wà;P/i\#ݳ L{ 4D=ʱ/IGj! `=Mjz 1#w "uB" w(>xKD!m](ƺ^X ^*kIx.R·߄teQ;7I`Xq|@G:*>1va S/!GL@6PѯRxDR[Ԧ"1K &f`b ,A8!T*t8cC 2Զ:KB&~M qa@ ,k yb+!JuS mG8N±^˲!acv8E[vu<& iЂ6P68CNXI L!!6I:-L.5^1$:<+~ b4V`(iW{Z,kALaQ7 3%1(~%>Z48~]*10~%Dvzs;dĘ ).#[rI֛i#1Ӛ4`>Ҕ4EZI׬AMR$tdӠ#dij,0gI0.WJ Acj(oyHC ͢+7b-xr$dY5Z,Ȗm~3/8M=n .'dg.C1nIDVpD =E>qT!y;)׷S@ ; H!8 D"%cwG 4fr 񦑻µ|݃|ߎ/Qע4 ?VHfbWz>p~?j_S r0|/r@^w/UK!32$0r*vu26G541 6~5x4D87XEǂJ6;3PX!:Cx}A>XeU۱8PVhNXXpAwpI1PU|XaPeW崆8a 3@f/kdkd`ބ73q0(s0ː>4g>>60}{?[>WQp*Phl8OH460eP+@ep~x-M yٰ 7a 0 "FlC h S !BE;,qPW-B*h*`k.O0Љ8Q-4I8X@O4|m| q.@yLnD-npg"?tF_qpdlk8I60X8@*@<]LbHA&LPɗnA<Ǘ!@K5`98P5W5iPXv)Q"r")?0͗xIO "&yv&!H aԂ(GN8 Pd@W+Ў:`Ph)) *2'uQ ¨קBɱy-^ !ҴЩUW7Q~81PIsYZ;Li=>91'0TK 0dUVҐ-!⢐JS-pKP!hO,P.@U0*8Љ34Y`4)XKڎp xvv62)P3IZ ]9tzbdJ=)Jrj3I8ا]0;8|#?9:^gEj0ݙҩjsmȅѲS?:!Vj_*ZU{ 7 m DZzsgQUuҝ|r}b@@_hQ!0?'؊C >!=@>!1>PF "K(b0TUZ`PS!P8:Ee CH. &>a@ 2!OK! ` eU QuIeK ۬8$=;E^eeKTKdX.B`]G zxQI`\?QGGIgQ`puHOJ*jTP[||䫛כD}ӑpEiyE]dMi@qJyO{[#}!3hk !I-װ.}n"GvmPqlTAq% {?zuk`Ya;TcwS0W"a/r(@KɠG n p>Wui^eqsu(l+ \O,#T*æ[mlP 7v(Lb 2{1"3NNP #R\9>\tW`3wgyfcLne|l.lLn,p<43`+g :'.%DCa* zxkU~ai\F*=AMTq! V; k'x4rs"?$>Wކ!x >P<'<2'ڐq=\hMx 1U9zcLPSPT0UEcVS{\ĨLt @`0K-7 MAE AIVfll`y@0 (번t"|QuXe<E0jޚ`eQaSAױ(;.p<"`!{{|n$C"aHaLtq5g+EKT@S]g0U 9 ߀t9-NF_}q.!0( H- C¾6 YVdb8\kIUF؉("ِA`A~r'M(#!ml!G0@֫mm*~YtgPL5 ۰BE^l`QKi܉:ϒo~* 5왠o~xH)  p?_q@dT k- ,#Iq-dh W |-MYپAӕVTuI6=LKGq!p6;-c-I)mdѯa>sR!0K/i4ZmJ6"<2+\`uY^qe:Us&\L܈#(_x2tH"SLSѢ^ѡNKdc[wAΩWj:US3n}92(.x:n>P!!v:~v\7Q 6bH䨎7ikghZ#9,sxux4#WP*0Xɖ< yW!ߕn-s xI7ͻE6q6)E\cSfqTP5PX8PQ؜8@:O806ЎWR0mI5Hw?_o0H<&7>zр K|}/Oɲp/ $А L@ z9m R/(/Љ0o10-.Y+PUPO:V*08m1@eIѪ2_!2yDq/h &FmS-TUIW)  dlk+8,flle+OO*Q36Sl8*U-38186kUQU+̺Y[g[ٶ>g=g;[<M"96I PkfF J3ne'VXTF!GlڴbD$ϟ@ JlEѧĒRAOQLc3o=VL ̀m6ìl.2*2 J.pUM0{*R G .fŜkPS^ͺkը}-e:M۱  Piq ̖l0 lbY w@-> ^\@lQ?cjֆ %$6QF d! ƀCBeٰBk\ak& eʁ Πm4h8֘/\x3V%c;C_;q;<Bll!;oe\̔LFe%l//BlTт.xz,d @JUiJy'Z#*-` 䩨ꪽKƪP^#12$޲k`ͬa ˊ'F+CՊ MQv-K.`[͠ 뚻[,0={ ~1 %x0} NJX׶:[_H>_P Uqt- aw(!x 09qC4%5)z` P VBԝp([跶D^'8|Qg8a:G30a@vJ|l0b7q@r 檤.*"2McR; wόN\'&6% . ӕz#qr `i0Isd/sq}*X$6GVh/І>KĪ8šhQC3 HQu#MJYR> +LR8ehMӞt;'@J(:ufA|6# m ),L*HԲJu)I׋+W+` cQ=)Q6= q[&Hm|z >+W8Ȫ/(;7`rcyH8rd8 SqT[DA$ > u]^@;wM3{g3*BTp(;3 +dd<Ү(%pw+wyWs!x{]`w>h^+`S@{*O! _/0 (5a)'}h EDz 7&>?s`qTM Hm6'lI@U`t& l1 v1* /WQH1/OgӆEX]QtBbp;CbC0'C=+'~ 6 vVx@Hxx!ׁTZ&%ceh <4'u Vm&aTZ!gld6,2s8uX B8*8,臰X2%fB;YǑhIT]6tbŁ^ qQq1%  pX*&k3{56b /,(}/8 DXBLKNrlT&dh۶ pM$P&@$H2n! z(zeW"'CU@ ֒. P0I 3I zExGg &)(iRQ֓BYp/Uqp5L2?Yrr/1r"הV /Ei/Gy\HY]~by4'lSd9/Im9X AzSj?{d2(}s<64.18yi9䗓`a3 4Y.`ٚ6 dYk)u;0<ٛ곘MH ɘVYǙɹЙp€q[y)oٝ≁ s9 hTyٟ:Zz ڠ: *}Թx"s!:&*s%z*jr).p-2k1 "3W58v:QS=ʢ/Cu?.aRAKZpMJ$%!RSZ9wXZ\^Js`j. cʣe:sgZ.S@"7wS`/]z6"'mJ.o:.S r|j[pCvݒE\0٧r@@qfk¨*Cb*h $Ѧ SZza:0:O$TFA֐7FE!&erwZ/*L.D}6dj#,:ZERjAb4gl'f /LJjcI`lXACC!AP~qj/ L p1I HE:$[&Fb!Z~*@lCd2!-K0.0=vgYFgH+JMִaP+bRەT[u\Z[\{^~V9d[Vf{-G;6#n&6vBk{z0y~+0}kp;۞{1--;*{#K#=! ,!y $( . 5/0<;44 =8:###+++$6$+9+;!!>,,2221=1?00;;;*,JD!@!$I$/@/)K)-R-4B45K5=C=1W1;U;9_8ACEIB%%F--H! H)'K)(@54B<>R'&V*(Z/.W10W??\22e;;EEEKBBKKKACTGI\CRCJ\JRLL[AA[LLSSSS\S_PP[[[CGcMNdW[wZ]zFfFLkLLqKQiQ\d\XmXU{U^u]Y}YgFEcKKlCBkMMePO`SSf[[oVVoYY|SS~XVdddleekkkce~d}cnvmuddpkk|jjpxosssryr|||Zw\}`~tx^^eeddmmiimmppss}}xw{{_cjmqntx|VU]\a_eennb`kiww||rryyfejionrq}|uuxvzy~~8 *\ȰÇ#JHŋ3jȱǏ CIɓ(SdC%0_qm͛8sɳϟ@ JѣH*]ʴӧPJJիXnsC&f̖ǙKٳhӪ]˶۷pʝKݻx˷߿ Lq,*ưǐ#KL˘3kxbd8MӨS^:-CM۸s5쁲y NȇwU,fyA1ۢKN:ueYν_7]۱-DzOο_<܀l9Al$!\ڙ_!_ ^U!Yҕ!{mhvY(Ug樸ƈVW%FAlׇ-Jc_<򈗐w9$WL>XDi!rQh%X;:cHN fbUc.ipTuyl&GciK:X&kV=%'~r(%.Yg\6סqw'lha5(B*DJ  㘁ZJivٹHhw)[:z[0*%T[g6nZԦZU: ,c~nB(4 jp)]ne5nbZJZg^B9챳 +2-,5IZ:H lKZԧZjd*(*٫^+|M~g2ضEo.|V3cپhUm.\*p|w*èm#oEWl Xn2( z84A<7Oc rȻ'r@X.dټ e5wޠptK@\@DWmtI7l@g;:ZR/Ff{)y2JfNs ^VzG}û^ةJ#Œg0[8/(Lq1ϸ-Rr SEHU[OK:UNiA;@RGsW D^{`YjAMUt~$.jK`.m2iQE mUi^vI^ɒEݾ'_g@`֢ v2# }yKǩM1/!Hmi#O1(/qu/YXuD:tkDm!MT"x; S-nwkƭ#>,tL&Sr3`g*)1-LF==*΁]&ru[[4ᲚD+:cZQ+Zr# $G< du42HYi9)W&Ha-Q@љ^QZPMZ@NU}$%6Jzi2- + Mb%I9!^g 1Ef0D "ϝ ̬3Vl PT2^|j\ oZo\gmIg':s#ߤ7ڌtäQ⍠򉎿J;m쒯B%Z d7jQnj!3n̅( K lwLpFQMYF%Մ_BSHEieH!X2chRըVfmʫ?E6rb ZSuk"F7-|k k,5 rP#gT9Fbތ,KYY^vBH(L)x'4ڕ`U[3]%kTAUeeĤ–w8%ز8IbشR?IR\+ _F7:v]) w[^Eusے w+ޫϥX۪~Ge0)r|9b d'>FZHuQDUW5eM(obCot%/T%Ň;nDxӞnL1 9e_xPÛdY zKȋ-yk'džA_ ʀ4DLjF[5-iWY2ܗЊTC[8#&i>/rx7b261Vڑ!27.,\[jn!YNb9lQ1Q8N %+dg{*n^NMoocehn\rE}#2d& A:;˧krzzNB' O䲅>pMN9<ٳv3B t7&x^nL-[wC7/l} ?mo=M .7x7uh6pA~'GyF(.x5X~;6)؀b j!gg(YWh{#||/ 6!j{ z>//v B'؁{ Bh8[W^(",,}};Gu3(7C6:ti=i`T  i2((z2 F.WqW̗.{[v kvwG9 G2|grbA<0„4~3&6iè1'Xgu)yu45#vJȊx *zGPy0fIبT(FOqh6jv$x+"B" iͳw%wopb>!Dw(F1#)` <6lpQBi'hka1БA.8 N`6Xvd; UP9xTyX2V^+Y"ujy8b@9X^<@ڸd YNhG=GFHP>%ly7hG=Pyw-v q''pgrlieaٙZeFƀ gv7j>jh8wחh1Waqjxzb0{jI"-瀞9%_G|0hz-{s)H8Bĝv6 %(Cdq1 :ĕ`aR~9q"=_G։Gg6١&z(j1MGq60Z6z8:<ڣ>8,z. 8Z@gHڤNPR:TzBz'D*dpUڥ^`b:dJBJ"\ZlڦnprjXN^sz|ڧ~<_q0z$4GQ:Zz!کT2z}Ah<zʪ :iZ:,zʺZڬ:ԊZؚ*׺Zz꺮ʫ_:Zzگё۬;z k z+6q p{R63Is"> 96  ۲#+%kW6*^Ib'$W^uxm4dƚlг Y*}EH{\ bR+*ӴN[Q[JaXk\s$\{_2qYKlKg 6mk.-GT*9{99ówy]2s7fr0Pn;k,p{5`;ݒ*3^QC +L{ûں0I/-*{0=栻.2UsD7C[ƋʼZ+CZ /a/Q)蛾컫 KK5Bv?skgug)/k<꾫1106/1ګkCG{d.,n*PR2ck˰nrZp{\| ѝGl ЖL!-Lq@Bwu`@;*6rFdG4#W*r@p["M.-8> fo҂1=ѶҖA}|&zDt 'C<b-sas]f-*b@֓sӒwb}s&Qwda؈M{b/azMsrh!vw{J<@A;Ij >A'>Bsr=s]7Uؕt ss+zu.-l\:/7"I [9gʒU{މgܲmyOw,=n}9kbh= 7ͮ,&]w>@=[Aw 3QI{"d@i@s4z Gd v[v]w} F0wziEX}rޮy,j7nbyzg>5gu#jii!ݍz "mNp/9l]{tnA#D4 wz-61v\H=UąWcaW-kTC֖9z"nyv>9v5L@C*FƗj H9㍀|-j3!mܭG 'N({R1],R2 J>9n>>ધzwzwN• IhܪwI/'W[׈|G Gc/'gq#fׁd 3AwR0d۫ҿ޿܉Ʉݒݜ( la؀.z3!|*-尢$;NMt +3ݮu~p^{ GM>g?1OI19_ZNi/H Ym,YC/v[($L9y6~- t2kHNNJr QWϿPCbD֪[^uiH7Fp9Cװ67##GRuҵ]|\d9slȌ5WN*v {tӰ R<y%x㘄}0NzH2YVLU$ϬIS{j?32~ -pVJB$ |pc#m:*{k3 2 Ј #x8p$PF\LzʍcmϜ.sq#|'sR`NbfLk+}pFk̹-4P"bC/S7^/1dj_&HsQH#t@CMZ{ 'ϢKNmd{:*7‚C˨qXrCdrX^{;P0 o`SԻ 2oJ! Jj%n>98ZU(5FJJuܫN2q*i@6L%b2k8B’"(]hч$&.6Q4c,ՈZvk32+[2![ uaFLK7 :Vޙ\$[ wC#RzkJML3ݴؠL1N7H/zV-ً֧DzkF\p.VN6 3b!JbO62פ|=Xxs.bqZ&).Gڳ%.r*7ں %ˍUQĂ;(Uo.Z^'q k1 QOy񹱣ȡ\Q2\\Lsc >O)@ œbl+m;|H'GaZ@Ay7H^AmdQf=1\ZA7qM3a 3A΀-lI 8ÿh͞w2c1I9LrDDžYn\Q<,NJRaKGeyzX)0UIn3%+m5qՑ)'9 S"}Lqʢ8wu< +)dx\妈Ăd6(,CĖ/lAFN}E<4}p ςGMF"eX4"MLyhP'\=$2f&1xen-^| hdr{53M!t̡LC]E+!A+zUi(A9qTLCԦ(hbӓQ A9T1 RTF=z>W33RgrVCj8V'U/nk}1QYRJ 1+zW i˫WfL>wNmNKE\45v)$Weix}jLŒV'USc}U3emmm{[VmoI[6l p}{\&WensUbs{]fW֌;Z?ny{^WpFĮWo}{_̴7oi\w5\3MF80Q#PXvMj後W#mtabPMJ hD31CX26BzWL#xr"Z4&rw =''2;F9;FY52 xYQ|f4Ykfsf8YkfK[""19 9CӐTN"{ɘEʢ],ђvt jGWzCtyѝM=Jҙ67Q?lmXxAu?-^OrI}ld'[fvlhG[Ӧv cEWakQ8Ő)y% D a TrowR|5 fx]螵) ޽#Ep1佛(Ghď]F'v<= 0P{ȕX #$(h‡t/4kr|$kV3H|B(J?=C>C??5{?򚍣˻$A*8P L,VӞ5cW(lZsU[&㴞)FA|3E  C:4?L䏔+A8و1^PƘ 8Ī1e^ʍQȑIEQ$ECa9GaUq9PR0Vd c 7Q#8\4h0MW`< J^#=M3mn5]E |-lU~W z_ oY(X(^p^(]XqYx^BZ605T6È6PHPWWkQE^kMYy6WPYYՀ-`} Y(^^Ѕ]0%hmX>XVB5tUJ/Lt}4/Has(_nUb7w]G"ѷ5;_E W5`kYIs+#`Mb(&'.^?"bLdMd/ZrX"Xm cHn(ᩝco(l5Ũ3E8sA]]WS:@2PsC]dehfVFc@>oCdvngwn.YV[&s `^B4zYX(bӜbX,ԣHXKur`+]୪u}m+6f| P}bݍXiT\U]}g靎ƭ*1051Frp*YS]||dijL3'_ l(_V挧6ߝ`Nk^r0Z 7eh׵kVԶJakNlŦTѺ^lʮl˶2ɾlmnZ60y^mnd jfKum.y( RmcF6>8^nU4 "Ԯ!οvoannn/}n0ڪgCcl3Pqb^1G>oͶ?p#4r՟E; 7`CNr1se[Ϊ 0 prWVO3 "aP XØJiJK 'sDOt3_Uck15ks sABYQ #4NtU_E'FF*)41n4[g45qӯ˕C_ucV bKFjщ{ Ȥqˊܫ(V=U0>#Rt ('"a:>vxOd [ hs|8x@Cxē}Ep-oxxYfܫfrѐ@v#  1 f12`J ey׎^j01FQD)Vaͱ{BXCq Ȋ8˝z`&XDh@IJyJK icz7{GyG9  `7={='̨ $lUoӒb| lZQ$Ź_ytR }$"]MRWJ/}WW**6Sѿxv5_8_8~՚pE go5_"nB~pGJ_S`Ne7nد_ f5 ة_mhq? 8#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:wsR 6B)jP22mԕӨRRju)F s?61۟x#`j.޼z/!}QI21dYm϶l{> X]`|Lg_oZFN} w 8 w&Gn1z^VecfPX6UVR0|dMYF"18`$-XA׌K]JUFVe{OT~UAEW&M$Ԍey&iUH7U<^bi(IC)]C&JnbJ~ jJ:)Zj"#=vN5S{dE{ꪬAYHFb4h#aF,]:,]!mE(I !FOF$@d{>0:H$-b6k, ƭa8bĆ !0K,[ uHF귇2(>P(; 8ns.l[-а 0z1* ;ѷ U[}5;UѲGiyMԟ ZnPLAF̈́9Xk8IRrVBoSJKMu֍;8tqx!׸L٪.~Tt7H:~ABpՒ.JQx ?[OԵb~n$UP45lM7+{>xP{8'͝;~??fo)q0'6fPPP>1h3uouO׷OpGY >W؆F}DC;! So<\إk[С8ܰLOxB׸Mz&(#BMf 62 ,$lؖ|¶ u?Pf<#eB1Y/t֝Ju***uJ &8lY~0#LSEJ0lđ58R8*M2!Yx!E je)Ypy&Y]&\ XF-{e`e23JZR%" ]R7aOf63a cGX|1͓hs}F*ayY~.) 4Hݧ> e%s` >B.ni9|bsz*C}E>k)pБ4D&DļN}D!I7.LtW@B%Q9# 8V)+jS*DTߎ|$:gZ'c :՗XQ)\X4SEA:MEpTUF$Œj=DŽj)w~vPRz%!a%#*`W v3UsE,;:T㞣0DkqATG54Kh+ڪWm{u 7L )qa3  $ (v6N5M%Oɮ~ F1a .V R)-W}>3ɱ-.{ VgBߡ0Ed̐67M rܒz+_߮ ޒw"4K-;^Jۀ(*G~@rC}|MlrC'.svfT}q>Bϩ9vo@ZƷμ鋬8^wq{&*w: WʐdsT_+{i7xgH!պiadEݣv`#?R;ds> l"DF1¬O|ldWDa`,IeacNaxJ skݣ냃# < ٨ Q.56Է6/">f?e$I;Ќ|wJHGjG a$t D\ٌDΘhyMhA ,% DPGxs= E`p(`vOP{ɶPHˤ_Uߣ5[>uخѐIuuI4- -H]V`0JΜLP , N,$FlzMOv1JsMPrar  8 !K`Tۤ[FȘ!_# 8`PNV Oȕa1|ZxwH`O )M X0NDMs$ OΟ$+NfcЂKL_(VX)F݉P,˂5t,D":Oڬ5F,Dϡ ~3-I#7dLb$|ޜKLN$4# ,M="N\"cJa@ aI͙[>uC`K ș 9tLՙ2آX^DTa5G(`ŏἋ$oQ V$AM4(ɈΏ,ͼ@Ji%P vI%tD8,+ ğpV@>ųER p f<^ O mLyEh@P!q%jLR25\uͦ$~l<ͮl!52(*PB83X@+Xފh"A+Ld!8pB88OPIn[o6EA ی P-y T e`.`\0}`PDK=`aE7! ١,\ z-M$@+4⸁@B&Ԁ $AvO;^f)H%wJ`*|aev(}hc[ s 4ar %LPsҼaOLj!&?fPu\ͬHs]yAKʤh@GFdM \L`<!LDl +% ` @4Bs}A34T4p$ Ah^&HX!Ґ1@BRMbfڮI [5,&tẬމĄ6p8n'|B4D',A4'p'lFpr&`6LD84D(+I]oK@|aݭx& DИE (&-̾lҞˎÄ&m8DDLH-'mN"1m9mB-}a`"msX.=Ы^HP]η9N-Ҏm3-'8ԭN!N]hژ<MEhdydHdnN: 2`j}͔JAߊ+HԬJv]A.EQD}˺aJ}i!EX$ ]ʌFEլH-ǵRh-ߎ4,5~цAܭ8\mDo.N^ n.5RR xhDEHЦFL߰g şR]JfB$N 0AeV$d|E*46jc6wX;Wrl}vi6,6l QM3E4~\ qԦ|LAP4CD$dc\vwDzfcxڄ( !J e6D0}_\|jV u?׊BDِ*؁P* 6|T)MI B UgC,C˼%f+n`.8o3aسnK`j +8A@@,Ğ >JsmD: @]oC@P@)(A`a@ |4:Hz0{ݴ  \-UnmɱRŮKL/S^T\tAi|C6C[(A";oFp4.U;\pՒŏk3Q¬&841M/T $,80 XeēDa|{sx3` \ / K7nAdE2\8(hWva 8f ql5Bc"ÿ>'m!^jp#,Ȋj&ň$tŭH"<P= q% r76+[/ЈX+śO=*ι(* ,$ s0moiK"X| GX?cQT\@2ܰA*+1"l cŠ$Ԉ}x $Bmhh= mJP4C>z;i4NFaSnNCEݍoj`i:npC'̉*G 29 EJPqt)ռH3J*eNPQ-Aиq֬ DX$PcǁWT"I#m`C  tW xcJ& |f餕^=.},Lq) I+L1*>ەz Ce,Y|]l h_uu#AKd#9r03ʃ][l#p?8uߝwm Ko{ʺ\ ?n#@i7"X b{kF 2.(@*WUEC<)]- a_Bf}Р" ^r0Y?Đ2Hш S\n+DWb~:–6ZH7d l $E6~qS ]Aa ;#CL1U3MA*VZe'خga|ci`#`C$%vQJbn CTx P"`$* H@3@Ɔ YJi^ v^p qC.06]@ bpmh@hR5&A`;L 6!1=|0b;>EL:N+-Q!MpMx !0?RQԣzɌ< Kf#@4 *lxJH =Hs!48ez*Je(@ %N2P@ 7&" i@Re+R鳞) 0A?,r @V`-{8EZCwy <"O ,OvSXPU,ELZM9>HH32ISꊴ&f$oO n&BcW۷%cxӆy7lWo #?j7M 갹rt[ݓ!~=8BK$gⴛv&^e'0`"uIŠadͰ"("hoRq (@f @#3 ,"ښ&;' Oě}1o!A7~1}s؃/a&d֕i u뉀w ^EYCq@T)W>h8]?_wAz=LWfq)jeݦ i@(R u|nZȴ oǦ]wFT$);w^4_)8A^OVsxg7&8Yr?4w򫍼'y_s#Hǽڜ(#GS:R %LHB`hĽ0t8,HQ Ss. Kj"#PJ:7#Mp ?ݱ]5OPSdf3p"w"A4{?,AHDԗR z׻s3~fxʃw= .' ?JrVTfJAa HeХܑVlV>рU1֗$X8菐hyW|L$MDcdDNŋNBPP PVBdX2QxOR(+,VdmDR$ FQ@%^y"A348%8!X"# āPh/\ qg]fE^&-_b_Ĉ.&^ XD B-F yN@ g-{&5" "k^Bu(@)5 a'4&̳*9  B"<9": b Fq/:R9/SH3Us K/y)l>}k! 8ALeN_EN0VÅpsB2 F 5p7,epf$ .lD]l˱"23C]bܸm ,xFFP xDQ>q ,!q'q#>d'Pb F M@`t 7EˈƥL:} 5ԩTZ5֭\z 6lSŐ֍ڵnВ17ܹڽw52uu(s8솰a|hp\QI`dsk4 VH\r$TTxm-/A{6>E&` x$zcW( 3ʍ MbQ G7| b*7&1cpX`,a` %)3@c <$$Whf+ <"JIPM8܆%]Cφ= pB?,iTu-9%o4ڛ7 S》h@X搠q1.;d`a2bHH{0(CA^vr 0A`2lC$$lu)~ !% d82Q4aH^MgiI6'2X*I P2 hmj3I:29("b؁.D@FEM!P *Pg0>OG.h)J@($%MCL#1ZHORJ&Arp % ,z֖^0aB*P 2%:Q|,8N4F Z,ZeUC8vЃtAP PJF4cH`2@NcP6|N r mCEH]m9`@a'IވedI)}W*EG hY&z$rC;Y.8 4cυƓN:qj8h3hV1M JшA*8 .0 I81p)trC88Q< bƴ跌i$n#ze/r%K("Ůb]>BԢ%'bm\",TQ9o[jij5[hGwEQBJwrAH][b=!uwmW[Ȣ}{W W MW"/zEn aX7[q]+? N=p}5l_x,n5 &0Sx<6QgtH7QuI#[k s\4 I%2oAba J( v#xlYEG|N ](t_[QP8PH=\ fx (}IJF&Jij,^ jh͜f g;Rm QKE؄Pq-m]bk)j2w,Hܞ ZyKG\#$PID (E53ٹCIk䧻H(J^*]D$&R\& '0(n'^C'Wd/|nƑo~!,?Rc[84D T>m:aJj%ҳf2U\f11ށb7Q%>eS% ;Gxy,7m %AG|MP2$>#Ad |~gz#P( 92ϞJ|1q~G 5JqcA$leq~d1gh)1#3g}8}7[{%=qa-WD04SZ1a~Q{W|Q$LRJBB|S9|Ge͇YN26c6d6y1}&AFb-sZ4FdžHL!A~ô5;s=m7%0IEsm}6KX>qqx(JwUEt[籅@Q}6_x(؊ȋ苿(HhLjɨȌH8e`˵:ȍ%Bb5d*爎H`x}a樎(\ȏI.%ɐ fI,] Yɑv)#b J+ɒ-/ 1)3I5i79;ɓ=? A)CIEiG)0I%AxO Q)SIUiWY@QN_ a)cIeigQ\mmo q)sIqeu{ɗ} rxYbɘ!8x))Iiə陟 UliZNa)蕬əQI9Y)ɛ9)H!iɒҒĉ )IթTJ #E)ٗi` )`ɞ hii))[i_ɟW9 ȥjiP_Yʗ_qy+$TI1JT:j6 mIi-kxa艑IR%)ACږ1iZHz8hq G#f"sr*6J[ FʞL 8BJ4nJDQƣS YZ\jXɤPq-ٱd >#mPkzj1C@w T㹧vmO:bRg-z*L*qae$D<Ýc`a5(CjjsW}!$d 諾ɤgC/#D "꘮)9Jjzj*p!o +Kk+Bz감p@k˱  'k-/ 1#ۚ]*Dʲ2? AK4. G=+MOD#FeUL [˵>+;BX yW+]i_#a[FogukCK6kr;ʷvJw+]˶yk{q 0븐"k+KP T AK ౠ+  p0kб˹+ `0@>;۱KƋ p 0`B 㐻K᫹ [ `P ݐ K  [ { { p 0@ P `Ȁ  |@ K Š L ˱{+/ @ @@P @ ; ; `P ࠾l`  Vp= ;ńѽ57 o pp0[P\K{<` ; k \ް{0KE[ ǫ\+ĀPA ̾k 0ȼPL|L LK 3 <ş,R *,l.l RB˶š[,7@\) P ͟<āެ<L +댼@@8,; P 0=@`҂сY| <ɳ 0==̇ 0đ<,Kra/ `p+Kܙς@lk;i I٨8 D(e@=җ Y\lL:9 ,9e I|y@)&8T&ugA)O@8E:FcDmYS@K0+'=+`CM[)

Widget Example 1

In this widget example, you will see a text box widget and a rendered HTML widget which are linked together. Type into the text box to see the HTML widget automatically updated. ipywidgets-6.0.0/jupyter-js-widgets/examples/web1/index.js000066400000000000000000000044711305534550700236230ustar00rootroot00000000000000 // Create a widget manager instance. var WidgetManager = require('./manager').WidgetManager; var uuid = require("jupyter-js-widgets").uuid; require('phosphor/styles/base.css'); require('jupyter-js-widgets/css/widgets.built.css'); document.addEventListener("DOMContentLoaded", function(event) { var manager = new WidgetManager(document.body); /** * Helper function for creating and displaying widgets. * @return {Promise} */ function createWidget(widgetType, value, description) { // Create the widget model. return manager.new_widget({ model_module: 'jupyter-js-widgets', model_name: widgetType + 'Model', widget_class: 'jupyter.' + widgetType, model_id: uuid() // Create a view for the model. }).then(function(model) { console.log(widgetType + ' model created'); model.set({ description: description || '', value: value, }); return manager.create_view(model); }, console.error.bind(console)) .then(function(view) { console.log(widgetType + ' view created'); manager.display_view(null, view); return view; }, console.error.bind(console)); } var defaultHTML = 'test text'; var textArea = createWidget('Textarea', defaultHTML, 'HTML:'); var html = createWidget('HTML', defaultHTML); // Create a link model. manager.new_widget({ model_module: 'jupyter-js-widgets', model_name: 'LinkModel', widget_class: 'jupyter.JSLink', model_id: uuid() // Set the link model state. }).then(function(link) { console.log('link created'); return Promise.all([textArea, html]).then( function(models) { console.log('setting link'); var textArea = models[0]; var html = models[1]; link.set({ 'source': [textArea.model, 'value'], 'target': [html.model, 'value'] }); link.save_changes(); console.log('link set'); } ); }).then(function() { var event = new Event('widgetsRendered'); document.dispatchEvent(event); }); }); ipywidgets-6.0.0/jupyter-js-widgets/examples/web1/karma.config.js000066400000000000000000000041741305534550700250530ustar00rootroot00000000000000// Karma configuration // Generated on Mon Dec 07 2015 08:28:33 GMT-0800 (PST) module.exports = function(config) { var cfg = { // base path that will be used to resolve all patterns (eg. files, exclude) basePath: '', // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter frameworks: ['mocha', 'chai'], // list of files / patterns to load in the browser files: [ 'built/index.built.js', 'test/**/*.js' ], // list of files to exclude exclude: [ ], // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { 'test/**/*.js': [ 'webpack' ] }, // test results reporter to use // possible values: 'dots', 'progress' // available reporters: https://npmjs.org/browse/keyword/karma-reporter reporters: ['mocha'], // web server port port: 9876, // enable / disable colors in the output (reporters and logs) colors: true, // level of logging // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_INFO, // enable / disable watching file and executing tests whenever any file changes autoWatch: false, // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher browsers: ['Chrome'], customLaunchers: { Chrome_travis_ci: { base: 'Chrome', flags: ['--no-sandbox'] } }, // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits singleRun: true, // Concurrency level // how many browser should be started simultanous concurrency: Infinity }; if (process.env.TRAVIS) { cfg.browsers = ['Chrome_travis_ci']; } config.set(cfg); }; ipywidgets-6.0.0/jupyter-js-widgets/examples/web1/manager.js000066400000000000000000000017741305534550700241310ustar00rootroot00000000000000var widgets = require('jupyter-js-widgets'); var PhosphorWidget = require('phosphor/lib/ui/widget').Widget; var ManagerBase = widgets.ManagerBase; console.info('jupyter-js-widgets loaded successfully'); var WidgetManager = exports.WidgetManager = function(el) { // Call the base class. ManagerBase.call(this); this.el = el; }; WidgetManager.prototype = Object.create(ManagerBase.prototype); WidgetManager.prototype.display_view = function(msg, view, options) { var that = this; return Promise.resolve(view).then(function(view) { PhosphorWidget.attach(view.pWidget, that.el); view.on('remove', function() { console.log('View removed', view); }); return view; }); }; WidgetManager.prototype._get_comm_info = function() { return Promise.resolve({}); }; WidgetManager.prototype._create_comm = function() { return Promise.resolve({ on_close: () => {}, on_msg: () => {}, close: () => {}, send: () => {} }); } ipywidgets-6.0.0/jupyter-js-widgets/examples/web1/package.json000066400000000000000000000020561305534550700244410ustar00rootroot00000000000000{ "name": "jupyter-js-widgets-test", "version": "1.0.0", "description": "Project that tests the ability to npm install jupyter-js-widgets within an npm project.", "main": "index.js", "scripts": { "prepublish": "npm run build", "build": "webpack", "test": "npm run test:firefox && npm run test:chrome", "test:default": "karma start karma.config.js --log-level debug", "test:firefox": "npm run test:default -- --browsers Firefox", "test:chrome": "npm run test:default" }, "author": "IPython", "license": "BSD-3-Clause", "dependencies": { "jupyter-js-widgets": "file:../.." }, "devDependencies": { "chai": "^3.5.0", "css-loader": "^0.23.1", "file-loader": "^0.8.5", "json-loader": "^0.5.4", "karma": "^0.13.19", "karma-chai": "^0.1.0", "karma-chrome-launcher": "^0.2.2", "karma-firefox-launcher": "^0.1.7", "karma-mocha": "^0.2.1", "karma-mocha-reporter": "^1.1.3", "karma-webpack": "^1.7.0", "mocha": "^2.5.3", "style-loader": "^0.13.0", "webpack": "^1.12.10" } } ipywidgets-6.0.0/jupyter-js-widgets/examples/web1/test/000077500000000000000000000000001305534550700231275ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web1/test/index.js000066400000000000000000000020551305534550700245760ustar00rootroot00000000000000const widgetsRendered = new Promise((resolve, reject) => { setTimeout(() => reject(Error('timeout waiting for widgets to render')), 5000); // 5s timeout const listener = () => { resolve(); document.removeEventListener('widgetsRendered', listener); }; document.addEventListener('widgetsRendered', listener); }); describe('index.html', function() { this.timeout(10000); beforeEach(() => { return widgetsRendered; }); describe('textArea', () => { it('exists', () => { expect(document.querySelector('textarea')).to.be.ok; }); it('correct value', () => { expect(document.querySelector('textarea').value).to.equal('test text'); }); }); describe('html', () => { it('exists', () => { expect(document.querySelector('div.widget-html')).to.be.ok; }); it('correct value', () => { expect(document.querySelector('div.widget-html-content').innerHTML).to.equal('test text'); }); }); }); ipywidgets-6.0.0/jupyter-js-widgets/examples/web1/webpack.config.js000066400000000000000000000006001305534550700253620ustar00rootroot00000000000000module.exports = { entry: './index.js', output: { filename: 'index.built.js', path: './built/', publicPath: 'built/' }, module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader" }, { test: /\.json$/, loader: "json-loader" }, // jquery-ui loads some images { test: /\.(jpg|png|gif)$/, loader: "file" }, ] }, } ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/000077500000000000000000000000001305534550700221515ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/README.md000066400000000000000000000034251305534550700234340ustar00rootroot00000000000000# Ad hoc widget manager reading a file with the `application/vnd.jupyter.widget-state+json` mime type. ## Description This directory is an example project that shows how you can embed the widgets in a context other than the notebook. This example implements a custom specialization of the base widget manager provided by the `jupyter-js-widgets` library (just like the notebook extension provides a specialization for the notebook context). This custom widget manager reads the state of the widget manager in the `widget_state.json` file, which respects the standardized JSON schema for the `application/vnd.jupyter.widget-state+json` mime type. Such a `widget_state.json` file can be generated from rendered widgets in the notebook UI with the *Download widget state* action. Besides, this example also displays read-only text area containing the code provided in the `widget_code.json`, which we used to generate the widget state. This example does not implement the communication with a Python backend. For such an example, check out the `web3` example. ## Try it 1. Start with a development install of jupyter-js-widgets by running `npm install` in the `jupyter-js-widgets` subfolder of the repo root (see the [README.md](../../../README.md) in the repo root for more details). 2. Cd into this directory and run `npm install`. 3. Now open the `index.html` file. ## Details If you plan to reproduce this in your own project, pay careful attention to the `package.json` file. The dependency to `jupyter-js-widgets`, which reads `"jupyter-js-widgets": "file:../../../ipywidgets"`, **should not** point to `"file:../../../ipywidgets"`. Instead point it to the version you want to use on npm. (but really, you should let npm do this for you by running `npm install --save jupyter-js-widgets`.) ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/index.html000066400000000000000000000022241305534550700241460ustar00rootroot00000000000000

ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/index.js000066400000000000000000000017141305534550700236210ustar00rootroot00000000000000var CodeMirror = require("codemirror"); require("codemirror/lib/codemirror.css"); require("codemirror/mode/python/python"); var WidgetManager = require("./manager").WidgetManager; document.addEventListener("DOMContentLoaded", function(event) { var code = require("./widget_code.json").join("\n"); var inputarea = document.getElementsByClassName("inputarea")[0]; var editor = CodeMirror(inputarea, { value: code, mode: "python", tabSize: 4, showCursorWhenSelecting: true, viewportMargin: Infinity, readOnly: true }); var state = require("./widget_state.json"); var widgetarea = document.getElementsByClassName("widgetarea")[0]; var manager = new WidgetManager(widgetarea); manager.set_state(state).then(function (models) { manager.display_model(undefined, models.find(function(element) { return element.id == "4c5a49e52ae54ad5bdbe973353a58931"; })); }); }); ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/manager.js000066400000000000000000000021001305534550700241120ustar00rootroot00000000000000var widgets = require('jupyter-js-widgets'); var PhosphorWidget = require('phosphor/lib/ui/widget').Widget; require('phosphor/styles/base.css'); require('jupyter-js-widgets/css/widgets.built.css'); console.info('jupyter-js-widgets loaded successfully'); var WidgetManager = exports.WidgetManager = function(el) { // Call the base class. widgets.ManagerBase.call(this); this.el = el; }; WidgetManager.prototype = Object.create(widgets.ManagerBase.prototype); WidgetManager.prototype.display_view = function(msg, view, options) { var that = this; return Promise.resolve(view).then(function(view) { PhosphorWidget.attach(view.pWidget, that.el); view.on('remove', function() { console.log('View removed', view); }); return view; }); }; WidgetManager.prototype._get_comm_info = function() { return Promise.resolve({}); }; WidgetManager.prototype._create_comm = function() { return Promise.resolve({ on_close: () => {}, on_msg: () => {}, close: () => {}, send: () => {} }); } ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/package.json000066400000000000000000000012741305534550700244430ustar00rootroot00000000000000{ "name": "jupyter-js-widgets-test", "version": "1.0.0", "description": "Project that tests the ability to npm install jupyter-js-widgets within an npm project.", "main": "index.js", "scripts": { "prepublish": "webpack", "test": "npm run test:default", "test:default": "echo \"No test specified\"" }, "author": "IPython", "license": "BSD-3-Clause", "dependencies": { "codemirror": "^5.9.0", "font-awesome": "^4.5.0", "jupyter-js-widgets": "file:../.." }, "devDependencies": { "css-loader": "^0.23.1", "file-loader": "^0.8.5", "json-loader": "^0.5.4", "style-loader": "^0.13.0", "url-loader": "^0.5.7", "webpack": "^1.12.10" } } ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/webpack.config.js000066400000000000000000000017271305534550700253760ustar00rootroot00000000000000module.exports = { entry: './index.js', output: { filename: 'index.built.js', path: './built/', publicPath: 'built/' }, module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader" }, { test: /\.json$/, loader: "json-loader" }, // jquery-ui loads some images { test: /\.(jpg|png|gif)$/, loader: "file" }, // required to load font-awesome { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream" }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml" } ] }, }; ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/widget_code.json000066400000000000000000000003611305534550700253210ustar00rootroot00000000000000[ "from ipywidgets import VBox, jsdlink, IntSlider, Button", "", "s1, s2 = IntSlider(max=200, value=100), IntSlider(value=40)", "b = Button(icon='legal')", "jsdlink((s1, 'value'), (s2, 'max'))", "VBox([s1, s2, b])" ] ipywidgets-6.0.0/jupyter-js-widgets/examples/web2/widget_state.json000066400000000000000000000061421305534550700255320ustar00rootroot00000000000000{ "79c5cde32c044e4d95cfa27a54982bde": { "model_name": "LayoutModel", "model_module": "jupyter-js-widgets", "state": {}, "views": [] }, "7687c2dd3f344143ae1e87ee9704c774": { "model_name": "IntSliderModel", "model_module": "jupyter-js-widgets", "state": { "layout": "IPY_MODEL_79c5cde32c044e4d95cfa27a54982bde", "max": 200, "value": 100 }, "views": [] }, "06ad7ea9cf7b4029b312e8fc012c3294": { "model_name": "LayoutModel", "model_module": "jupyter-js-widgets", "state": {}, "views": [] }, "0c3957dbb4734762a84ad924f77197b3": { "model_name": "IntSliderModel", "model_module": "jupyter-js-widgets", "state": { "layout": "IPY_MODEL_06ad7ea9cf7b4029b312e8fc012c3294", "value": 40 }, "views": [] }, "f326c34c26034acdbab8ca4610d49bae": { "model_name": "LayoutModel", "model_module": "jupyter-js-widgets", "state": {}, "views": [] }, "2e4ca159b05a4f3295c8b59695359428": { "model_name": "ButtonModel", "model_module": "jupyter-js-widgets", "state": { "layout": "IPY_MODEL_f326c34c26034acdbab8ca4610d49bae", "icon": "legal" }, "views": [] }, "e7c5849fbfe7415ab5896fc749d71164": { "model_name": "DirectionalLinkModel", "model_module": "jupyter-js-widgets", "state": { "target": [ "IPY_MODEL_0c3957dbb4734762a84ad924f77197b3", "max" ], "source": [ "IPY_MODEL_7687c2dd3f344143ae1e87ee9704c774", "value" ] }, "views": [] }, "4e6ee45ef7c64f0f953c79150d4ae0ca": { "model_name": "LayoutModel", "model_module": "jupyter-js-widgets", "state": { "flex_flow": "column", "display": "flex" }, "views": [] }, "4c5a49e52ae54ad5bdbe973353a58931": { "model_name": "BoxModel", "model_module": "jupyter-js-widgets", "state": { "children": [ "IPY_MODEL_7687c2dd3f344143ae1e87ee9704c774", "IPY_MODEL_0c3957dbb4734762a84ad924f77197b3", "IPY_MODEL_2e4ca159b05a4f3295c8b59695359428" ], "layout": "IPY_MODEL_4e6ee45ef7c64f0f953c79150d4ae0ca" }, "views": [ { "cell": { "metadata": { "trusted": true, "collapsed": true }, "cell_type": "code", "source": "from ipywidgets import VBox, jsdlink, IntSlider, Button\n\ns1, s2 = IntSlider(max=200, value=100), IntSlider(value=40)\nb = Button(icon='legal')\njsdlink((s1, 'value'), (s2, 'max'))\nVBox([s1, s2, b])", "execution_count": 1, "outputs": [] }, "cell_index": 0, "root": true } ] } }ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/000077500000000000000000000000001305534550700221525ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/.gitignore000066400000000000000000000000321305534550700241350ustar00rootroot00000000000000lib/ built/ node_modules/ ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/.jshintrc000066400000000000000000000000271305534550700237760ustar00rootroot00000000000000{ "esnext": true } ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/README.md000066400000000000000000000033471305534550700234400ustar00rootroot00000000000000# Using jupyter-js-widgets in non-notebook, web context ## Description This directory is an example project that shows how to use `jupyter-js-widgets` and `ipywidgets` in a web context other than the notebook. Unlike the `web1` and `web2` example, this example requires a Jupyter notebook server to be running. The user is prompted with a dialog to provide the URL with a running notebook server. Besides, this example also displays read-only text area containing the code provided in the `widget_code.json`, which we used to generate the widget state. The `web5` and `web6` examples are similar to this one, but instead of requiring a notebook server to be running, they use the `tmpnb` and the `mybinder` services to spawn a new transient notebook server. ## Try it 1. Start with a development install of `jupyter-js-widgets` by running `npm install` in the `jupyter-js-widgets` subfolder of the repo root (see the [README.md](../../../README.md) in the repo root for more details). 2. Cd into this directory and run `npm install`. 3. Run `npm run host` 4. In a new terminal run `python -m notebook --no-browser --NotebookApp.allow_origin="*" --NotebookApp.disable_check_xsrf=True --NotebookApp.token=''` 5. In a web browser, navigate to `http://localhost:8080/` (or the address specified by the `npm run host` command) ## Details If you plan to reproduce this in your own project, pay careful attention to the `package.json` file. The dependency to `jupyter-js-widgets`, which reads `"jupyter-js-widgets": "file:../../../ipywidgets"`, **should not** point to `"file:../../../ipywidgets"`. Instead point it to the version you want to use on npm. (but really, you should let npm do this for you by running `npm install --save jupyter-js-widgets`.) ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/index.html000066400000000000000000000022241305534550700241470ustar00rootroot00000000000000
ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/package.json000066400000000000000000000022231305534550700244370ustar00rootroot00000000000000{ "name": "jupyter-js-widgets-test", "version": "1.0.0", "description": "Project that tests the ability to npm install jupyter-js-widgets within an npm project.", "main": "index.js", "scripts": { "clean": "rimraf lib && rimraf built", "prepublish": "npm run build", "build": "npm run clean && tsc --project src && node scripts/copyfiles.js && webpack", "host": "http-server", "test": "npm run test:default", "test:default": "echo \"No test specified\"" }, "author": "IPython", "license": "BSD-3-Clause", "dependencies": { "@jupyterlab/services": "^0.36.0", "@types/codemirror": "0.0.33", "codemirror": "^5.9.0", "font-awesome": "^4.5.0", "http-server": "^0.8.5", "jupyter-js-widgets": "file:../.." }, "devDependencies": { "css-loader": "^0.23.1", "file-loader": "^0.8.5", "fs-extra": "^0.30.0", "json-loader": "^0.5.4", "postcss": "^5.2.5", "postcss-cssnext": "^2.8.0", "postcss-import": "^8.1.2", "postcss-loader": "^1.1.0", "rimraf": "^2.5.4", "style-loader": "^0.13.0", "typescript": "^2.0.3", "url-loader": "^0.5.7", "webpack": "^1.12.10" } } ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/scripts/000077500000000000000000000000001305534550700236415ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/scripts/copyfiles.js000066400000000000000000000002711305534550700261740ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. var fs = require('fs-extra'); fs.copySync('src/', 'lib/', { filter: /\.css$/ }); ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/src/000077500000000000000000000000001305534550700227415ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/src/index.ts000066400000000000000000000030411305534550700244160ustar00rootroot00000000000000import * as CodeMirror from 'codemirror'; import 'codemirror/lib/codemirror.css'; import 'codemirror/mode/python/python'; import { WidgetManager } from './manager'; import { Kernel } from '@jupyterlab/services'; let BASEURL = prompt('Notebook BASEURL', 'http://localhost:8888'); let WSURL = 'ws:' + BASEURL.split(':').slice(1).join(':'); document.addEventListener("DOMContentLoaded", function(event) { // Connect to the notebook webserver. let connectionInfo = { baseUrl: BASEURL, wsUrl: WSURL }; Kernel.getSpecs(connectionInfo).then(kernelSpecs => { (connectionInfo as any).name = kernelSpecs.default; return Kernel.startNew(connectionInfo); }).then(kernel => { // Create a codemirror instance let code = require('../widget_code.json').join("\n"); let inputarea = document.getElementsByClassName("inputarea")[0] as HTMLElement; let editor = CodeMirror(inputarea, { value: code, mode: "python", tabSize: 4, showCursorWhenSelecting: true, viewportMargin: Infinity, readOnly: true }); // Create the widget area and widget manager let widgetarea = document.getElementsByClassName("widgetarea")[0]; let manager = new WidgetManager(kernel, widgetarea); // Run backend code to create the widgets. You could also create the // widgets in the frontend, like the other widget examples demonstrate. kernel.requestExecute({ code: code }); }); }); ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/src/manager.ts000066400000000000000000000021621305534550700247240ustar00rootroot00000000000000import * as widgets from 'jupyter-js-widgets'; import 'phosphor/styles/base.css'; import './widgets.css'; import * as PWidget from 'phosphor/lib/ui/widget'; export class WidgetManager extends widgets.ManagerBase { constructor(kernel, el) { super(); this.kernel = kernel; this.el = el; // Create a comm manager shim this.commManager = new widgets.shims.services.CommManager(kernel); // Register the comm target this.commManager.register_target(this.comm_target_name, this.handle_comm_open.bind(this)); } display_view(msg, view, options) { return Promise.resolve(view).then((view) => { PWidget.Widget.attach(view.pWidget, this.el); view.on('remove', function() { console.log('view removed', view); }); return view; }); } _create_comm(targetName, id, metadata) { return this.commManager.new_comm(targetName, metadata, id); } _get_comm_info() { return Promise.resolve({}); } kernel: any; el: HTMLElement; commManager: any; } ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/src/tsconfig.json000066400000000000000000000004371305534550700254540ustar00rootroot00000000000000{ "compilerOptions": { "declaration": true, //"noImplicitAny": true, "lib": ["dom", "es5", "es2015.promise"], "types": ["requirejs"], "noEmitOnError": true, "module": "commonjs", "moduleResolution": "node", "target": "ES5", "outDir": "../lib" } } ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/src/widgets.css000066400000000000000000000005141305534550700251210ustar00rootroot00000000000000/* Copyright (c) Jupyter Development Team. * Distributed under the terms of the Modified BSD License. */ /* * This example shows how to customize the theming and still compile the CSS * down to something that all browsers support. */ @import "jupyter-js-widgets/css/widgets.css"; :root { --jp-widgets-border-width: 2px; } ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/webpack.config.js000066400000000000000000000021651305534550700253740ustar00rootroot00000000000000module.exports = { entry: './lib/index.js', output: { filename: 'index.built.js', path: './built/', publicPath: 'built/' }, module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader!postcss-loader" }, { test: /\.json$/, loader: "json-loader" }, // jquery-ui loads some images { test: /\.(jpg|png|gif)$/, loader: "file" }, // required to load font-awesome { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream" }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml" } ] }, postcss: function () { return [ require('postcss-import'), require('postcss-cssnext') ]; } }; ipywidgets-6.0.0/jupyter-js-widgets/examples/web3/widget_code.json000066400000000000000000000005401305534550700253210ustar00rootroot00000000000000[ "from ipywidgets import IntSlider, Text, VBox", "from IPython.display import display", "", "s = IntSlider(max=200, value=100)", "t = Text()", "", "def update_text(change=None):", " t.value = str(s.value ** 2)", "", "s.observe(update_text, names='value')", "update_text()", "display(VBox([s, t]))" ] ipywidgets-6.0.0/jupyter-js-widgets/examples/web4/000077500000000000000000000000001305534550700221535ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web4/README.md000066400000000000000000000033141305534550700234330ustar00rootroot00000000000000# Using the Embed widget manager ## Description This directory is an example project that shows how you can embed the widgets in a context other than the notebook by embedding inline widget state in the html document. It makes use of the Embed widget manager provided with `jupyter-js-widgets` If you plan to reproduce this in your own project, all you should need is the html file (and none of the JavaScript), and to replace the script tag `` with `` We use of the locally built file in this example is meant to ensure that this reflects the current state of the source repository and not the latest release. If you need to specify a SEMVER range for the version of the embed manager, you can do so by suffixing the package name with `@SEMVER_RANGE` in the URL. For example `` ## Try it 1. Start with a development install of `jupyter-js-widgets` by running `npm install` in the `jupyter-js-widgets` subfolder of the repo root (see the [README.md](../../../README.md) in the repo root for more details). 2. Cd into this directory and run `npm install`. 3. Now open the `index.html` file. ## Details If you plan to reproduce this in your own project, pay careful attention to the `package.json` file. The dependency to `jupyter-js-widgets`, which reads `"jupyter-js-widgets": "file:../../../ipywidgets"`, **should not** point to `"file:../../../ipywidgets"`. Instead point it to the version you want to use on npm. (but really, you should let npm do this for you by running `npm install --save jupyter-js-widgets`.) ipywidgets-6.0.0/jupyter-js-widgets/examples/web4/index.html000066400000000000000000000077621305534550700241640ustar00rootroot00000000000000 ipywidgets-6.0.0/jupyter-js-widgets/examples/web4/index.js000066400000000000000000000000551305534550700236200ustar00rootroot00000000000000require('jupyter-js-widgets/dist/embed.js'); ipywidgets-6.0.0/jupyter-js-widgets/examples/web4/package.json000066400000000000000000000012031305534550700244350ustar00rootroot00000000000000{ "name": "jupyter-js-widgets-test", "version": "1.0.0", "description": "Project that tests the ability to npm install jupyter-js-widgets within an npm project.", "main": "index.js", "scripts": { "prepublish": "webpack", "test": "npm run test:default", "test:default": "echo \"No test specified\"" }, "author": "IPython", "license": "BSD-3-Clause", "dependencies": { "font-awesome": "^4.5.0", "jupyter-js-widgets": "file:../.." }, "devDependencies": { "css-loader": "^0.23.1", "file-loader": "^0.8.5", "style-loader": "^0.13.0", "url-loader": "^0.5.7", "webpack": "^1.12.10" } } ipywidgets-6.0.0/jupyter-js-widgets/examples/web4/webpack.config.js000066400000000000000000000017271305534550700254000ustar00rootroot00000000000000module.exports = { entry: './index.js', output: { filename: 'index.built.js', path: './built/', publicPath: 'built/' }, module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader" }, { test: /\.json$/, loader: "json-loader" }, // jquery-ui loads some images { test: /\.(jpg|png|gif)$/, loader: "file" }, // required to load font-awesome { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream" }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml" } ] }, }; ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/000077500000000000000000000000001305534550700221545ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/.gitignore000066400000000000000000000000321305534550700241370ustar00rootroot00000000000000lib/ built/ node_modules/ ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/.jshintrc000066400000000000000000000000271305534550700240000ustar00rootroot00000000000000{ "esnext": true } ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/README.md000066400000000000000000000030111305534550700234260ustar00rootroot00000000000000# Using jupyter-js-widgets in non-notebook, web context + tmpnb backend ## Description This directory is an example project that shows how to use `jupyter-js-widgets` and `ipywidgets` in a web context other than the notebook. Similarly to the `web3` example, this example makes uses of a Python kernel. However, it makes use of the `tmpnb` service to spawn a new transient Jupyter notebook server from which it then requests a Python kernel. Besides, this example also displays read-only text area containing the code provided in the `widget_code.json`, which we used to generate the widget state. ## Try it 1. Start with a development install of `jupyter-js-widgets` by running `npm install` in the `jupyter-js-widgets` subfolder of the repo root (see the [README.md](../../../README.md) in the repo root for more details). 2. Cd into this directory and run `npm install`. 3. Run `npm run host` 4. In a new terminal run `python -m notebook --no-browser --NotebookApp.allow_origin="*"` 5. In a web browser, navigate to `http://localhost:8080/` (or the address specified by the `npm run host` command) ## Details If you plan to reproduce this in your own project, pay careful attention to the `package.json` file. The dependency to `jupyter-js-widgets`, which reads `"jupyter-js-widgets": "file:../../../ipywidgets"`, **should not** point to `"file:../../../ipywidgets"`. Instead point it to the version you want to use on npm. (but really, you should let npm do this for you by running `npm install --save jupyter-js-widgets`.) ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/index.html000066400000000000000000000022241305534550700241510ustar00rootroot00000000000000
ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/package.json000066400000000000000000000022231305534550700244410ustar00rootroot00000000000000{ "name": "jupyter-js-widgets-test", "version": "1.0.0", "description": "Project that tests the ability to npm install jupyter-js-widgets within an npm project.", "main": "index.js", "scripts": { "clean": "rimraf lib && rimraf built", "prepublish": "npm run build", "build": "npm run clean && tsc --project src && node scripts/copyfiles.js && webpack", "host": "http-server", "test": "npm run test:default", "test:default": "echo \"No test specified\"" }, "author": "IPython", "license": "BSD-3-Clause", "dependencies": { "@jupyterlab/services": "^0.24.0", "@types/codemirror": "0.0.33", "codemirror": "^5.9.0", "font-awesome": "^4.5.0", "http-server": "^0.8.5", "jupyter-js-widgets": "file:../.." }, "devDependencies": { "css-loader": "^0.23.1", "file-loader": "^0.8.5", "fs-extra": "^0.30.0", "json-loader": "^0.5.4", "postcss": "^5.2.5", "postcss-cssnext": "^2.8.0", "postcss-import": "^8.1.2", "postcss-loader": "^1.1.0", "rimraf": "^2.5.4", "style-loader": "^0.13.0", "typescript": "^2.0.3", "url-loader": "^0.5.7", "webpack": "^1.12.10" } } ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/scripts/000077500000000000000000000000001305534550700236435ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/scripts/copyfiles.js000066400000000000000000000002711305534550700261760ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. var fs = require('fs-extra'); fs.copySync('src/', 'lib/', { filter: /\.css$/ }); ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/src/000077500000000000000000000000001305534550700227435ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/src/index.ts000066400000000000000000000043041305534550700244230ustar00rootroot00000000000000import * as CodeMirror from 'codemirror'; import 'codemirror/lib/codemirror.css'; import 'codemirror/mode/python/python'; import { WidgetManager } from './manager'; import { Kernel } from '@jupyterlab/services'; document.addEventListener("DOMContentLoaded", function(event) { var baseUrl = "https://tmp60.tmpnb.org/"; var apiUrl = baseUrl.concat("api/spawn"); var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", apiUrl, true); xmlhttp.setRequestHeader("Content-type", "application/json"); xmlhttp.onreadystatechange = function () { //Call a function when the state changes. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { let serverUrl = baseUrl.concat(JSON.parse(xmlhttp.responseText).url); let wsUrl = 'ws:' + serverUrl.split(':').slice(1).join(':'); // Connect to the notebook webserver. let connectionInfo = { baseUrl: serverUrl, wsUrl: wsUrl }; Kernel.getSpecs(connectionInfo).then(kernelSpecs => { (connectionInfo as any).name = kernelSpecs.default; return Kernel.startNew(connectionInfo); }).then(kernel => { // Create a codemirror instance let code = require('../widget_code.json').join("\n"); let inputarea = document.getElementsByClassName("inputarea")[0] as HTMLElement; let editor = CodeMirror(inputarea, { value: code, mode: "python", tabSize: 4, showCursorWhenSelecting: true, viewportMargin: Infinity, readOnly: true }); // Create the widget area and widget manager let widgetarea = document.getElementsByClassName("widgetarea")[0]; let manager = new WidgetManager(kernel, widgetarea); // Run backend code to create the widgets. You could also create the // widgets in the frontend, like the other widget examples demonstrate. kernel.execute({ code: code }); }); } } xmlhttp.send(); }); ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/src/manager.ts000066400000000000000000000022061305534550700247250ustar00rootroot00000000000000import * as widgets from 'jupyter-js-widgets'; import 'phosphor/styles/base.css'; import 'jupyter-js-widgets/css/widgets.css'; import * as PWidget from 'phosphor/lib/ui/widget'; export class WidgetManager extends widgets.ManagerBase { constructor(kernel, el) { super(); this.kernel = kernel; this.el = el; // Create a comm manager shim this.commManager = new widgets.shims.services.CommManager(kernel); // Register the comm target this.commManager.register_target(this.comm_target_name, this.handle_comm_open.bind(this)); } display_view(msg, view, options) { return Promise.resolve(view).then((view) => { PWidget.Widget.attach(view.pWidget, this.el); view.on('remove', function() { console.log('view removed', view); }); return view; }); } _create_comm(targetName, id, metadata) { return this.commManager.new_comm(targetName, metadata, id); } _get_comm_info() { return Promise.resolve({}); } kernel: any; el: HTMLElement; commManager: any; } ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/src/tsconfig.json000066400000000000000000000004371305534550700254560ustar00rootroot00000000000000{ "compilerOptions": { "declaration": true, //"noImplicitAny": true, "lib": ["dom", "es5", "es2015.promise"], "types": ["requirejs"], "noEmitOnError": true, "module": "commonjs", "moduleResolution": "node", "target": "ES5", "outDir": "../lib" } } ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/webpack.config.js000066400000000000000000000021651305534550700253760ustar00rootroot00000000000000module.exports = { entry: './lib/index.js', output: { filename: 'index.built.js', path: './built/', publicPath: 'built/' }, module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader!postcss-loader" }, { test: /\.json$/, loader: "json-loader" }, // jquery-ui loads some images { test: /\.(jpg|png|gif)$/, loader: "file" }, // required to load font-awesome { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream" }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml" } ] }, postcss: function () { return [ require('postcss-import'), require('postcss-cssnext') ]; } }; ipywidgets-6.0.0/jupyter-js-widgets/examples/web5/widget_code.json000066400000000000000000000005401305534550700253230ustar00rootroot00000000000000[ "from ipywidgets import IntSlider, Text, VBox", "from IPython.display import display", "", "s = IntSlider(max=200, value=100)", "t = Text()", "", "def update_text(change=None):", " t.value = str(s.value ** 2)", "", "s.observe(update_text, names='value')", "update_text()", "display(VBox([s, t]))" ] ipywidgets-6.0.0/jupyter-js-widgets/karma.conf.js000066400000000000000000000065751305534550700220660ustar00rootroot00000000000000// Karma configuration // Generated on Mon Dec 07 2015 08:28:33 GMT-0800 (PST) module.exports = function(config) { var cfg = { // base path that will be used to resolve all patterns (eg. files, exclude) basePath: '', // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter frameworks: ['mocha', 'chai', 'sinon-chai'], // list of files / patterns to load in the browser files: [ 'test/**/*_test.js' ], // list of files to exclude exclude: [ ], // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { 'test/**/*.js': [ 'webpack' ] }, webpack: { module: { loaders: [ { test: /\.jsx?$/, exclude: /node_modules/, loader: "babel?presets[]=es2015" }, { test: /\.css$/, loader: "style-loader!css-loader" }, { test: /\.json$/, loader: "json-loader" }, // jquery-ui loads some images { test: /\.(jpg|png|gif)$/, loader: "file" }, // required to load font-awesome { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream" }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml" } ] }, externals: { "base/js/namespace": "base/js/namespace", "notebook/js/outputarea": "notebook/js/outputarea", "services/kernels/comm": "services/kernels/comm" }, }, // test results reporter to use // possible values: 'dots', 'progress' // available reporters: https://npmjs.org/browse/keyword/karma-reporter reporters: ['mocha'], // web server port port: 9876, // enable / disable colors in the output (reporters and logs) colors: true, // level of logging // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_INFO, // enable / disable watching file and executing tests whenever any file changes autoWatch: false, // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher browsers: ['Chrome'], customLaunchers: { Chrome_travis_ci: { base: 'Chrome', flags: ['--no-sandbox'] } }, // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits singleRun: true, // Concurrency level // how many browser should be started simultanous concurrency: Infinity }; if (process.env.TRAVIS) { cfg.browsers = ['Chrome_travis_ci']; } config.set(cfg); }; ipywidgets-6.0.0/jupyter-js-widgets/package.json000066400000000000000000000076251305534550700217740ustar00rootroot00000000000000{ "name": "jupyter-js-widgets", "version": "2.1.4", "description": "Jupyter interactive widgets", "author": "Project Jupyter", "license": "BSD-3-Clause", "main": "lib/index.js", "typings": "lib/index.d.ts", "repository": { "type": "git", "url": "https://github.com/ipython/ipywidgets.git" }, "files": [ "lib/**/*.d.ts", "lib/**/*.js", "css/*.css", "dist/" ], "scripts": { "clean:src": "rimraf lib", "clean:embed": "rimraf lib-embed", "clean": "npm run clean:src && npm run clean:embed", "build:test": "tsc --project test/src && webpack --config test/webpack.conf.js", "build:src": "tsc --project src", "build:src-embed": "tsc --project src-embed", "build:css": "postcss --use postcss-import --use postcss-cssnext -o css/widgets.built.css css/widgets.css", "build": "npm run build:src && npm run build:src-embed && npm run build:css && webpack", "docs": "npm run docs:src && npm run docs:embed", "docs:src": "typedoc --mode file --module commonjs --excludeNotExported --target es5 --moduleResolution node --out docs/ src", "docs:embed": "typedoc --mode file --module commonjs --excludeNotExported --target es5 --moduleResolution node --out docs-embed/ src-embed", "postinstall": "npm dedupe", "prepublish": "npm run build", "test": "npm run test:unit && npm run test:examples", "test:coverage": "npm run build:test && webpack --config test/webpack-cov.conf.js && karma start test/karma-cov.conf.js", "test:unit": "npm run test:unit:firefox && npm run test:unit:chrome", "test:unit:default": "npm run build:test && karma start test/karma.conf.js --log-level debug", "test:unit:firefox": "npm run test:unit:default -- --browsers=Firefox", "test:unit:chrome": "npm run test:unit:default -- --browsers=Chrome", "test:unit:ie": "npm run test:unit:default -- --browsers=IE", "test:examples": "npm run test:examples:chrome && npm run test:examples:firefox", "test:examples:chrome": "npm-run-all \"test:example:*\"", "test:examples:firefox": "npm-run-all \"test:example:* -- -- --browsers Firefox\"", "test:example:web2": "cd examples/web2 && npm install && npm run test:default", "test:example:web3": "cd examples/web3 && npm install && npm run test:default", "test:example:web4": "cd examples/web4 && npm install && npm run test:default", "test:example:web5": "cd examples/web5 && npm install && npm run test:default" }, "devDependencies": { "@types/expect.js": "^0.3.29", "@types/mathjax": "0.0.31", "@types/mocha": "2.2.32", "@types/requirejs": "^2.1.28", "@types/sinon": "^1.16.31", "cpx": "^1.5.0", "css-loader": "^0.23.1", "es6-promise": "^3.1.2", "expect.js": "^0.3.1", "file-loader": "^0.8.5", "istanbul-instrumenter-loader": "^0.2.0", "json-loader": "^0.5.4", "karma": "^0.13.15", "karma-chrome-launcher": "^0.2.2", "karma-coverage": "^1.0.0", "karma-firefox-launcher": "^0.1.7", "karma-ie-launcher": "^1.0.0", "karma-mocha": "^0.2.1", "karma-mocha-reporter": "^1.1.3", "karma-webpack": "^1.7.0", "mocha": "^2.3.4", "npm-run-all": "^1.5.1", "postcss-cli": "^2.6.0", "postcss-cssnext": "^2.8.0", "postcss-import": "^8.1.2", "postcss-loader": "^1.3.2", "rimraf": "^2.4.1", "sinon": "^1.17.2", "spawn-sync": "^1.0.14", "style-loader": "^0.13.1", "typedoc": "^0.5.0", "typescript": "~2.0.10", "url-loader": "^0.5.7", "webpack": "^1.12.11" }, "dependencies": { "@jupyterlab/services": "^0.35.0", "@types/backbone": "^1.3.33", "@types/semver": "^5.3.30", "ajv": "^4.9.0", "backbone": "1.2.0", "d3-format": "^0.5.1", "font-awesome": "^4.5.0", "jquery": "^3.1.1", "jquery-ui": "^1.12.1", "jupyter-widgets-schema": "^0.1.1", "lolex": "^1.4.0", "phosphor": "^0.7.0", "scriptjs": "^2.5.8", "semver": "^5.1.0", "underscore": "^1.8.3" } } ipywidgets-6.0.0/jupyter-js-widgets/scripts/000077500000000000000000000000001305534550700211635ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/scripts/travis_install_js.sh000066400000000000000000000003241305534550700252500ustar00rootroot00000000000000source ~/.nvm/nvm.sh nvm install "v$TRAVIS_NODE_VERSION" nvm use "v$TRAVIS_NODE_VERSION" nvm alias default "v$TRAVIS_NODE_VERSION" npm update -g npm echo `npm -v` echo `node -v` cd jupyter-js-widgets npm install ipywidgets-6.0.0/jupyter-js-widgets/scripts/travis_script_js.sh000066400000000000000000000004171305534550700251110ustar00rootroot00000000000000set -ex export CHROME_BIN=chromium-browser export DISPLAY=:99.0 source ~/.nvm/nvm.sh nvm use "v$TRAVIS_NODE_VERSION" nvm alias default "v$TRAVIS_NODE_VERSION" sh -e /etc/init.d/xvfb start cd jupyter-js-widgets npm run test:unit:$BROWSER && npm run test:examples:$BROWSER ipywidgets-6.0.0/jupyter-js-widgets/src-embed/000077500000000000000000000000001305534550700213355ustar00rootroot00000000000000ipywidgets-6.0.0/jupyter-js-widgets/src-embed/embed-helper.ts000066400000000000000000000005641305534550700242430ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. export function generateEmbedScript(widgetState, imageDataUrl) { return [ '', '' ].join('\n'); } ipywidgets-6.0.0/jupyter-js-widgets/src-embed/embed-manager.ts000066400000000000000000000033201305534550700243670ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { ManagerBase } from '../lib/manager-base'; import * as PhosphorWidget from 'phosphor/lib/ui/widget'; export class EmbedManager extends ManagerBase { /** * Display the specified view. Element where the view is displayed * is specified in the `options` argument. */ display_view(msg, view, options) { return Promise.resolve(view).then(function(view) { PhosphorWidget.Widget.attach(view.pWidget, options.el); view.on('remove', function() { console.log('View removed', view); }); return view; }); }; /** * Placeholder implementation for _get_comm_info. */ _get_comm_info() { return Promise.resolve({}); }; /** * Placeholder implementation for _create_comm. */ _create_comm() { return Promise.resolve({ on_close: () => {}, on_msg: () => {}, close: () => {} }); }; /** * Takes a requirejs success handler and returns a requirejs error handler * that attempts loading the module from unpkg. */ require_error(success_callback, failure_callback, version : string) { return function(err) : any { var failedId = err.requireModules && err.requireModules[0]; if (failedId) { // TODO: Get typing to work for requirejs (window as any).require(['https://unpkg.com/' + failedId + '@' + version + '/dist/index.js'], success_callback); } else { failure_callback(err); } }; } }; ipywidgets-6.0.0/jupyter-js-widgets/src-embed/embed-webpack.ts000066400000000000000000000123121305534550700243720ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. // ES6 Promise polyfill (require('es6-promise') as any).polyfill(); // Element.prototype.matches polyfill if (Element && !Element.prototype.matches) { var proto = Element.prototype as any; proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector; } // Load styling require('font-awesome/css/font-awesome.css'); require('phosphor/styles/base.css'); require('../css/widgets.css'); // Load json schema validator var Ajv = require('ajv'); var widget_state_schema = require('jupyter-widgets-schema').v1.state; var widget_view_schema = require('jupyter-widgets-schema').v1.view; // Magic global widget rendering function: import * as widgets from '../../jupyter-js-widgets/lib/index'; import * as embed from './embed-manager'; import * as _ from 'underscore'; // `LoadInlineWidget` is the main function called on load of the web page. // All it does is inserting a \n' + ''; var cells = Jupyter.notebook.get_cells(); for (var i = 0; i'; } } } var content = document.createElement('textarea'); content.setAttribute('readonly', 'true'); content.style.width = '100%'; content.style.minHeight = '250px'; content.value = value; var mod = dialog.modal({ show: true, title: 'Embed widgets', body: content, keyboard_manager: Jupyter.notebook.keyboard_manager, notebook: Jupyter.notebook, buttons: { 'Copy to Clipboard': { class: 'btn-primary', click: function(event) { content.select(); return document.execCommand('copy'); } } } }); }); }); }); }; var action = { help: 'Embed interactive widgets', icon: 'fa-sliders', help_index : 'zz', handler : embed_widgets }; var action_name = 'embed-interactive-widgets'; var prefix = 'widgets'; requirejs(["base/js/namespace"], function(Jupyter) { Jupyter.notebook.keyboard_manager.actions.register(action, action_name, prefix); }); module.exports = { action: action }; ipywidgets-6.0.0/widgetsnbextension/src/extension.js000066400000000000000000000070011305534550700227760ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. 'use strict'; window['requirejs'].config({ map: { '*': { 'jupyter-js-widgets': 'nbextensions/jupyter-js-widgets/extension', }, } }); var mngr = require("./manager"); var widgetarea = require("./widgetarea"); require("./save_state"); require("./embed_widgets"); /** * Create a widget manager for a kernel instance. */ var handle_kernel = function(Jupyter, kernel) { if (kernel.comm_manager && kernel.widget_manager === undefined) { // Create a widget manager instance. Use the global // Jupyter.notebook handle. var manager = new mngr.WidgetManager(kernel.comm_manager, Jupyter.notebook); // For backwards compatibility and interactive use. Jupyter.WidgetManager = mngr.WidgetManager; // Store a handle to the manager so we know not to // another for this kernel. This also is a convenience // for the user. kernel.widget_manager = manager; } }; /** * Creates a widgetarea for the cell if it is a CodeCell. * If the cell isn't a CodeCell, no action is taken. */ var handle_cell = function(cell) { if (cell.cell_type==='code') { var area = new widgetarea.WidgetArea(cell); cell.widgetarea = area; } }; function register_events(Jupyter, events) { // If a kernel already exists, create a widget manager. if (Jupyter.notebook && Jupyter.notebook.kernel) { handle_kernel(Jupyter, Jupyter.notebook.kernel); } // When the kernel is created, create a widget manager. events.on('kernel_created.Kernel kernel_created.Session', function(event, data) { handle_kernel(Jupyter, data.kernel); }); // Create widget areas for cells that already exist. var cells = Jupyter.notebook.get_cells(); for (var i = 0; i < cells.length; i++) { handle_cell(cells[i]); } events.on('create.Cell', function(event, data) { handle_cell(data.cell); }); var clearWidgetArea = function(event, data) { data.cell.widgetarea && data.cell.widgetarea.clear(); } events.on('delete.Cell', clearWidgetArea); events.on('execute.CodeCell', clearWidgetArea); events.on('clear_output.CodeCell', clearWidgetArea); events.on('resize.Cell', function(event, data) { data.cell.widgetarea && data.cell.widgetarea.resize(); }) var disconnectWidgetAreas = function() { var cells = Jupyter.notebook.get_cells(); for (var i = 0; i < cells.length; i++) { var cell = cells[i]; cell.widgetarea && cell.widgetarea.disconnect(); } } events.on('kernel_disconnected.Kernel', disconnectWidgetAreas); events.on('kernel_killed.Kernel', disconnectWidgetAreas); events.on('kernel_restarting.Kernel', disconnectWidgetAreas); events.on('kernel_dead.Kernel', disconnectWidgetAreas); } function load_ipython_extension () { return new Promise(function(resolve) { requirejs([ "base/js/namespace", "base/js/events" ], function(Jupyter, events) { require("phosphor/styles/base.css") require('jupyter-js-widgets/css/widgets.css'); register_events(Jupyter, events); console.log("loaded widgets"); resolve(); }); }); } var _ = require('underscore'); module.exports = _.extend({ load_ipython_extension: load_ipython_extension, }, require('jupyter-js-widgets'), require('./widget_output')); ipywidgets-6.0.0/widgetsnbextension/src/manager.js000066400000000000000000000410411305534550700223760ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. "use strict"; var _ = require("underscore"); var Backbone = require("backbone"); var widgets = require("jupyter-js-widgets"); var saveState = require("./save_state"); var embedWidgets = require("./embed_widgets"); var version = require("../package.json").version; var output = require("./widget_output"); //-------------------------------------------------------------------- // WidgetManager class //-------------------------------------------------------------------- var WidgetManager = function (comm_manager, notebook) { widgets.ManagerBase.apply(this); WidgetManager._managers.push(this); // Attach a comm manager this.notebook = notebook; this.keyboard_manager = notebook.keyboard_manager; this.comm_manager = comm_manager; // Register with the comm manager. this.comm_manager.register_target(this.comm_target_name, _.bind(this.handle_comm_open,this)); // Attempt to reconstruct any live comms by requesting them from the back-end. var that = this; var backed_widgets_loaded = this._get_comm_info().then(function(comm_ids) { // Create comm class instances from comm ids. var comm_promises = Object.keys(comm_ids).map(function(comm_id) { return that._create_comm(that.comm_target_name, comm_id); }); // Send a state request message out for each widget comm and wait // for the responses. return Promise.all(comm_promises).then(function(comms) { return Promise.all(comms.map(function(comm) { var update_promise = new Promise(function(resolve, reject) { comm.on_msg(function (msg) { // A suspected response was received, check to see if // it's a state update. If so, resolve. if (msg.content.data.method === 'update') { resolve({ comm: comm, msg: msg }); } }); }); comm.send({ method: 'request_state' }, that.callbacks()); return update_promise; })); }).then(function(widgets_info) { return Promise.all(widgets_info.map(function(widget_info) { return that.new_model({ model_name: widget_info.msg.content.data.state._model_name, model_module: widget_info.msg.content.data.state._model_module, model_module_version: widget_info.msg.content.data.state._model_module_version, comm: widget_info.comm, }, widget_info.msg.content.data.state); })); }).then(function() { var cells = that.notebook.get_cells(); var outputs, cell; for (var i = 0; i < cells.length; ++i) { cell = cells[i]; if (cell.output_area) { outputs = cell.output_area.outputs; for (var j = 0; j < outputs.length; ++j) { var out = outputs[j]; if (out.output_type==="display_data" && out.data['application/vnd.jupyter.widget-view+json']) { var model_promise = that.get_model(out.data['application/vnd.jupyter.widget-view+json'].model_id); if (model_promise !== undefined) { model_promise.then((function(cell_index) { return function (model) { that.display_model(undefined, model, { cell_index: cell_index }); }; })(i)); } } } } } }); }); // Setup state saving code. this.notebook.events.on('before_save.Notebook', (function() { var save_callback = WidgetManager._save_callback; if (save_callback) { this.get_state(WidgetManager._get_state_options).then((function(state) { save_callback.call(this, state); }).bind(this)).catch(widgets.reject('Could not call widget save state callback.', true)); } }).bind(this)); // Validate the version requested by the backend. var validate = (function validate() { this.validateVersion().then(function(valid) { if (!valid) { console.warn('Widget frontend version does not match the backend.'); } }).catch(function(err) { console.warn('Could not cross validate the widget frontend and backend versions.', err); }); }).bind(this); validate(); // Revalidate the version when a new kernel connects. this.notebook.events.on('kernel_connected.Kernel', function(event, data) { validate(); }); // Create the actions and menu this._init_actions(); this._init_menu(); }; WidgetManager.prototype = Object.create(widgets.ManagerBase.prototype); WidgetManager._managers = []; /* List of widget managers */ WidgetManager._load_callback = null; WidgetManager._save_callback = null; WidgetManager.register_widget_model = function (model_name, model_type) { /** * Registers a widget model by name. */ return widgets.ManagerBase.register_widget_model.apply(this, arguments); }; WidgetManager.register_widget_view = function (view_name, view_type) { /** * Registers a widget view by name. */ return widgets.ManagerBase.register_widget_view.apply(this, arguments); }; WidgetManager.set_state_callbacks = function (load_callback, save_callback, options) { /** * Registers callbacks for widget state persistence. * * Parameters * ---------- * load_callback: function() * function that is called when the widget manager state should be * loaded. This function should return a promise for the widget * manager state. An empty state is an empty dictionary `{}`. * save_callback: function(state as dictionary) * function that is called when the notebook is saved or autosaved. * The current state of the widget manager is passed in as the first * argument. */ WidgetManager._load_callback = load_callback; WidgetManager._save_callback = save_callback; WidgetManager._get_state_options = options || {}; // Use the load callback to immediately load widget states. WidgetManager._managers.forEach(function(manager) { if (load_callback) { Promise.resolve().then(function () { return load_callback.call(manager); }).then(function(state) { manager.set_state(state); }).catch(widgets.reject('Error loading widget manager state', true)); } }); }; var url = [window.location.protocol, '//', window.location.host, window.location.pathname].join(''); var key = 'widgets:' + url; WidgetManager.set_state_callbacks(function() { if (Jupyter.notebook.metadata.widgets) { return Promise.resolve(Jupyter.notebook.metadata.widgets.state); } else { return Promise.resolve({}); } }); WidgetManager.prototype.loadClass = function(className, moduleName, moduleVersion, error) { if (moduleName === "jupyter-js-widgets") { if (className === "OutputModel" || className === "OutputView") { return Promise.resolve(output[className]); } else { return Promise.resolve(widgets[className]); } } else { return Object.getPrototypeOf(WidgetManager.prototype).loadClass.apply(this, arguments); } } WidgetManager.prototype._handle_display_view = function (view) { /** * Have the IPython keyboard manager disable its event * handling so the widget can capture keyboard input. * Note, this is only done on the outer most widgets. */ if (this.keyboard_manager) { this.keyboard_manager.register_events(view.el); if (view.additional_elements) { for (var i = 0; i < view.additional_elements.length; i++) { this.keyboard_manager.register_events(view.additional_elements[i]); } } } }; /** * Registers manager level actions with the notebook actions list */ WidgetManager.prototype._init_actions = function() { var notifier = Jupyter.notification_area.widget('widgets'); this.saveWidgetsAction = { handler: (function() { this.get_state({ drop_defaults: true }).then(function(state) { Jupyter.notebook.metadata.widgets = { 'application/vnd.jupyter.widget-state+json' : { version_major: 1, version_minor: 0, state: state } }; Jupyter.menubar.actions.get('jupyter-notebook:save-notebook').handler({ notebook: Jupyter.notebook }); }); }).bind(this), icon: 'fa-truck', help: 'Save the notebook with the widget state information for static rendering' }; Jupyter.menubar.actions.register(this.saveWidgetsAction, 'save-with-widgets', 'widgets'); }; /** * Initialize the widget menu */ WidgetManager.prototype._init_menu = function() { // Add a widgets menubar item, before help. var widgetsMenu = document.createElement('li'); widgetsMenu.classList.add('dropdown'); var helpMenu = document.querySelector('#help_menu').parentElement; helpMenu.parentElement.insertBefore(widgetsMenu, helpMenu); var widgetsMenuLink = document.createElement('a'); widgetsMenuLink.setAttribute('href', '#'); widgetsMenuLink.setAttribute('data-toggle', 'dropdown'); widgetsMenuLink.classList.add('dropdown-toggle'); widgetsMenuLink.innerText = 'Widgets'; widgetsMenu.appendChild(widgetsMenuLink); var widgetsSubmenu = document.createElement('ul'); widgetsSubmenu.setAttribute('id', 'widget-submenu'); widgetsSubmenu.classList.add('dropdown-menu'); widgetsMenu.appendChild(widgetsSubmenu); widgetsSubmenu.appendChild(this._createMenuItem('Save Notebook with Widgets', this.saveWidgetsAction)); widgetsSubmenu.appendChild(this._createMenuItem('Download Widget State', saveState.action)); widgetsSubmenu.appendChild(this._createMenuItem('Embed Widgets', embedWidgets.action)); }; /** * Creates a menu item for an action. * @param {string} title - display string for the menu item * @param {Action} action * @return {HTMLElement} menu item */ WidgetManager.prototype._createMenuItem = function(title, action) { var item = document.createElement('li'); item.setAttribute('title', action.help); var itemLink = document.createElement('a'); itemLink.setAttribute('href', '#'); itemLink.innerText = title; item.appendChild(itemLink); item.onclick = action.handler; return item; }; WidgetManager.prototype.display_model = function(msg, model, options) { options = options || {}; if (msg) { options.cell = this.get_msg_cell(msg.parent_header.msg_id); // Only set cell_index when view is displayed as directly. options.cell_index = this.notebook.find_cell_index(options.cell); } else if (options && options.cell_index !== undefined) { options.cell = this.notebook.get_cell(options.cell_index); } else { options.cell = null; } return widgets.ManagerBase.prototype.display_model.call(this, msg, model, options) .catch(widgets.reject('Could not display model', true)); }; // In display view WidgetManager.prototype.display_view = function(msg, view, options) { if (view instanceof widgets.DOMWidgetView) { if (options.cell === null) { view.remove(); return Promise.reject(new Error("Could not determine where the display" + " message was from. Widget will not be displayed")); } else { if (options.cell.widgetarea) { var that = this; return options.cell.widgetarea.display_widget_view(Promise.resolve(view)).then(function(view) { that._handle_display_view(view); return view; }).catch(widgets.reject('Could not display view', true)); } else { return Promise.reject(new Error('Cell does not have a `widgetarea` defined')); } } } }; WidgetManager.prototype.setViewOptions = function (options) { var options = options || {}; // If a view is passed into the method, use that view's cell as // the cell for the view that is created. if (options.parent !== undefined) { options.cell = options.parent.options.cell; } return options; }; WidgetManager.prototype.get_msg_cell = function (msg_id) { var cell = null; // First, check to see if the msg was triggered by cell execution. if (this.notebook) { cell = this.notebook.get_msg_cell(msg_id); } if (cell !== null) { return cell; } // Second, check to see if a get_cell callback was defined // for the message. get_cell callbacks are registered for // widget messages, so this block is actually checking to see if the // message was triggered by a widget. var kernel = this.comm_manager.kernel; if (kernel) { var callbacks = kernel.get_callbacks_for_msg(msg_id); if (callbacks && callbacks.iopub && callbacks.iopub.get_cell !== undefined) { return callbacks.iopub.get_cell(); } } // Not triggered by a cell or widget (no get_cell callback // exists). return null; }; WidgetManager.prototype._create_comm = function(comm_target_name, model_id, data) { var that = this; return this._get_connected_kernel().then(function(kernel) { if (data) { return kernel.comm_manager.new_comm(comm_target_name, data, that.callbacks(), {}, model_id); } else { return new Promise(function(resolve) { requirejs(["services/kernels/comm"], function(comm) { var new_comm = new comm.Comm(comm_target_name, model_id); kernel.comm_manager.register_comm(new_comm); resolve(new_comm); }); }); } }); }; WidgetManager.prototype.callbacks = function (view) { /** * callback handlers specific a view */ var callbacks = {}; if (view && view.options.cell) { // Try to get output handlers var cell = view.options.cell; var handle_output = null; var handle_clear_output = null; if (cell.output_area) { handle_output = _.bind(cell.output_area.handle_output, cell.output_area); handle_clear_output = _.bind(cell.output_area.handle_clear_output, cell.output_area); } // Create callback dictionary using what is known var that = this; callbacks = { iopub : { output : handle_output, clear_output : handle_clear_output, // Special function only registered by widget messages. // Allows us to get the cell for a message so we know // where to add widgets if the code requires it. get_cell : function () { return cell; }, }, }; } return callbacks; }; WidgetManager.prototype._get_comm_info = function() { /** * Gets a promise for the valid widget models. */ var that = this; return this._get_connected_kernel().then(function(kernel) { return new Promise(function(resolve, reject) { kernel.comm_info('jupyter.widget', function(msg) { resolve(msg['content']['comms']); }); }); }); }; WidgetManager.prototype._get_connected_kernel = function() { /** * Gets a promise for a connected kernel */ var that = this; return new Promise(function(resolve, reject) { if (that.comm_manager && that.comm_manager.kernel && that.comm_manager.kernel.is_connected()) { resolve(that.comm_manager.kernel); } else { that.notebook.events.on('kernel_connected.Kernel', function(event, data) { resolve(data.kernel); }); } }); }; module.exports = { WidgetManager: WidgetManager }; ipywidgets-6.0.0/widgetsnbextension/src/save_state.js000066400000000000000000000021221305534550700231170ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. "use strict"; var save_state = function() { return new Promise(function(resolve) { requirejs(["base/js/namespace"], function(Jupyter) { return Jupyter.WidgetManager._managers[0].get_state({ 'drop_defaults': true }).then(function(state) { var data = "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(state, null, " ")); var a = document.createElement("a"); a.download = "widget_state.json"; a.href = "data:" + data; a.click(); }); }); }); }; var action = { help: 'Download the widget state as a JSON file', icon: 'fa-sliders', help_index : 'zz', handler : save_state }; var action_name = 'save-widget-state'; var prefix = 'widgets'; requirejs(["base/js/namespace"], function(Jupyter) { Jupyter.notebook.keyboard_manager.actions.register(action, action_name, prefix); }); module.exports = {action: action}; ipywidgets-6.0.0/widgetsnbextension/src/widget_output.js000066400000000000000000000073151305534550700236750ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. "use strict"; // This widget is strongly coupled to the notebook because of the outputarea // dependency. var widgets = require("jupyter-js-widgets"); var _ = require("underscore"); var OutputModel = widgets.DOMWidgetModel.extend({ defaults: _.extend({}, widgets.DOMWidgetModel.prototype.defaults, { _model_name: "OutputModel", _view_name: "OutputView", msg_id: "", }), initialize: function(attributes, options) { OutputModel.__super__.initialize.apply(this, arguments); this.kernel = this.comm.kernel; this.listenTo(this, 'change:msg_id', this.reset_msg_id); console.log('initializing model'); if (this.kernel) { this.kernel.set_callbacks_for_msg(this.id, this.callbacks(), false); } this._outputs = []; }, // make callbacks callbacks: function() { return { iopub: { output: function(msg) { this.trigger('new_message', msg); this._outputs.push(msg); }.bind(this), clear_output: function(msg) { this.trigger('clear_output', msg); this._outputs = []; }.bind(this) } } }, reset_msg_id: function() { var kernel = this.kernel; // Pop previous message id var prev_msg_id = this.previous('msg_id'); if (prev_msg_id && kernel) { var previous_callback = kernel.output_callback_overrides_pop(prev_msg_id); if (previous_callback !== this.id) { console.error('Popped wrong message ('+previous_callback+' instead of '+this.id+') - likely the stack was not maintained in kernel.'); } } var msg_id = this.get('msg_id'); if (msg_id && kernel) { kernel.output_callback_overrides_push(msg_id, this.id); } }, }); var OutputView = widgets.DOMWidgetView.extend({ initialize: function (parameters) { OutputView.__super__.initialize.apply(this, arguments); }, render: function(){ var that = this; var renderOutput = function(outputArea) { that.output_area = new outputArea.OutputArea({ selector: that.el, config: that.options.cell.config, prompt_area: false, events: that.model.widget_manager.notebook.events, keyboard_manager: that.model.widget_manager.keyboard_manager }); that.listenTo(that.model, 'new_message', function(msg) { console.log('View new output message'); console.log(msg); that.output_area.handle_output(msg); }, that); that.listenTo(that.model, 'clear_output', function(msg) { console.log('View clear output'); console.log(msg); that.output_area.handle_clear_output(msg); }) // Render initial contents from that.model._outputs that.model._outputs.forEach(function(msg) { that.output_area.handle_output(msg); }, that) } if (requirejs.defined("notebook/js/outputarea")) { // Notebook 4.x requirejs(["notebook/js/outputarea"], renderOutput) } else { // Notebook 5.x requirejs(["notebook"], function(notebookApp) { var outputArea = notebookApp["notebook/js/outputarea"]; renderOutput(outputArea); }); } }, }); module.exports = { OutputView: OutputView, OutputModel: OutputModel, }; ipywidgets-6.0.0/widgetsnbextension/src/widgetarea.js000066400000000000000000000113661305534550700231070ustar00rootroot00000000000000// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. "use strict"; require('../css/outputarea.css'); var messaging = require('phosphor/lib/core/messaging'); var pwidgets = require('phosphor/lib/ui/widget'); /** * WidgetArea */ var WidgetArea = function(cell) { this.widget_views = []; this._cell = cell; this._widgets_live = true; this._create_elements(); requirejs(['base/js/events'], (function(events) { events.trigger('create.WidgetArea', {widgetarea: this, cell: cell}); }).bind(this)); }; /** * Display a widget view in the cell. */ WidgetArea.prototype.display_widget_view = function(view_promise) { // Display a dummy element var dummy = document.createElement('div'); this.widget_subarea.appendChild(dummy); // Display the view. var that = this; return view_promise.then(function(view) { that.widget_area.style.display = ''; // Do basically the same as Phosphor's Widget.attach, except we replace // a child rather than appending the view's Phosphor widget dummy.parentNode.replaceChild(view.pWidget.node, dummy); messaging.sendMessage(view.pWidget, pwidgets.WidgetMessage.AfterAttach) that.widget_views.push(view); // Check the live state of the view's model. if (view.model.comm_live) { that._widget_live(view); } else { that.disconnect(view); } // If the view is removed, check to see if the widget area is empty. // If the widget area is empty, close it. view.on('remove', function() { var index = that.widget_views.indexOf(view); if (index !== -1) that.widget_views.splice(index, 1); if (that.widget_views.length === 0) { that.clear(); } }); return view; }); }; /** * Creates the elements of the widget area and appends them * to the associated cell. */ WidgetArea.prototype._create_elements = function() { var widget_area = document.createElement('div'); widget_area.classList.add('widget-area'); widget_area.style.display = 'none'; this.widget_area = widget_area; var widget_prompt = document.createElement('div'); widget_prompt.classList.add('prompt'); widget_area.appendChild(widget_prompt); var widget_subarea = document.createElement('div'); widget_subarea.classList.add('widget-subarea'); widget_subarea.classList.add('jp-Output-result'); widget_area.appendChild(widget_subarea); this.widget_subarea = widget_subarea; var that = this; var widget_clear_button = document.createElement('button'); widget_clear_button.classList.add('close'); widget_clear_button.innerHTML = '×'; widget_clear_button.onclick = function() { for (var i = 0; i < that.widget_views.length; i++) { var view = that.widget_views[i]; view.remove(); } that.widget_views = []; widget_subarea.innerHTML = ''; } widget_prompt.appendChild(widget_clear_button); if (this._cell.input) { this._cell.input.after(widget_area); } else { throw new Error('Cell does not have an `input` element. Is it not a CodeCell?'); } }; /** * Handles when a widget loses it's comm connection. * @param {WidgetView} view */ WidgetArea.prototype.disconnect = function() { if (this._widgets_live) { this._widgets_live = false; this.widget_area.classList.add('connection-problems'); } }; /** * Sends resize message to all child views */ WidgetArea.prototype.resize = function() { this.widget_views.forEach(function(view) { messaging.sendMessage(view.pWidget, pwidgets.ResizeMessage.UnknownSize); }); } /** * Handles when a widget is connected to a live comm. */ WidgetArea.prototype._widget_live = function() { if (!this._widgets_live) { // Check that the other widgets are live too. O(N) operation. // Abort the function at the first dead widget found. for (var i = 0; i < this.widget_views.length; i++) { if (!this.widget_views[i].model.comm_live) { return; } } this._widgets_live = true; this.widget_area.classList.remove('connection-problems'); } }; /** * Clears the widgets in the widget area. */ WidgetArea.prototype.clear = function() { // Clear widget area for (var i = 0; i < this.widget_views.length; i++) { var view = this.widget_views[i]; view.remove(); } this.widget_views = []; this.widget_subarea.innerHTML = ''; this.widget_subarea.style.height = ''; this.widget_area.style.height = ''; this.widget_area.style.display = 'none'; }; module.exports = { WidgetArea: WidgetArea }; ipywidgets-6.0.0/widgetsnbextension/webpack.config.js000066400000000000000000000023001305534550700230500ustar00rootroot00000000000000var path = require('path'); module.exports = { entry: './src/extension.js', output: { filename: 'extension.js', path: './widgetsnbextension/static', libraryTarget: 'amd' }, devtool: 'source-map', module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader!postcss-loader" }, { test: /\.json$/, loader: "json-loader" }, // jquery-ui loads some images { test: /\.(jpg|png|gif)$/, loader: "file" }, // required to load font-awesome { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff" }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream" }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml" } ] }, postcss: function () { return [ require('postcss-import'), require('postcss-cssnext') ] } }; ipywidgets-6.0.0/widgetsnbextension/widgetsnbextension/000077500000000000000000000000001305534550700235625ustar00rootroot00000000000000ipywidgets-6.0.0/widgetsnbextension/widgetsnbextension/__init__.py000066400000000000000000000013751305534550700257010ustar00rootroot00000000000000"""Interactive widgets for the Jupyter notebook. Provide simple interactive controls in the notebook. Each widget corresponds to an object in Python and Javascript, with controls on the page. You can display widgets with IPython's display machinery:: from ipywidgets import IntSlider from IPython.display import display slider = IntSlider(min=1, max=10) display(slider) Moving the slider will change the value. Most widgets have a current value, accessible as a `value` attribute. """ from ._version import __version__ from warnings import warn def _jupyter_nbextension_paths(): return [{ 'section': 'notebook', 'src': 'static', 'dest': 'jupyter-js-widgets', 'require': 'jupyter-js-widgets/extension' }] ipywidgets-6.0.0/widgetsnbextension/widgetsnbextension/_version.py000066400000000000000000000001101305534550700257500ustar00rootroot00000000000000version_info = (2, 0, 0) __version__ = '.'.join(map(str, version_info))

Lm{*Z G$ Pk Jg^0i!_pQ=K9EIGR7Rz ڣ6Nw%ΐ2`]V l ;MR%fhJ՝"`"|À@1JhA WղrYmWjֶ/hmM"Ʃx+WUzvի` \+aXlic'Kٞ<f7f mH0W,(b!N1 pTh:XX0}x{1) ^qq L ˘`"o(-.Ҏ'A2b|X6nrPKɪli*W\v$9%3SƬJ 9zr*܏πMBЈNF;ѐ%"DXU0N{ӠGMR:x<3]s$:%;q USC׸ ](v?sQ:h+ %DivD GSN-wK}p$r 8^ LZ,!* BP(ܛ+hI}u=Ro p>Xp#!(0@T(>P Jxy;!s\#h >)$e[a$R;0d'~; Q?% T C!;AzĦiHut= Xt4 iGWtyGF֎n n ($~_;<{[ۃF?L|T+M3r^T`vӋ,`,8@17K p7z( I+? I)Gu)"xŇ,'zhzC} x|7@p67GJDTG*0=<#0j^&D; @9?!-pg $ÂCO,P4+`30#V4c}T pwC"-LxA0e1uC5@LNG>ES`P44$H8$$" 7PB"PR3JC82I}$K`PAW p$҅'rx"<$-K#53yF,"Ux3p#Dv5AGgBd/=h;bQ&`!Tr@Pd, $UHe" vu5Lȁl(Ip%$WBplD %y&0g39"TTr/ E_">%e,27)Ӌ#t?++e0);I% (s) Y=HD0* 8PL>(w7]`KgJPx1A'"P0Btq( @БP@9B0K# 0JpS`. ӚRQq_ 8 3F+RK H1@.X/CB2Jj~G镭9 Rwws>/)71H5*v)W_48+Pn.D=9wJ͙5KPR- tjY&[ #k<up}bgwPjH;'*@CU'b7c'*.R#k_h:*l:-.#J>(@@*`Qq7AKs0k'/`I=GK [Dz)8?w+@X$rJ;|B*<0{?9@d%y/Z7#kj{oACJ:t9cp{C§xl_t%7`|aɪ94;-~*/?\y37&(l&ͪlZ"Eq,'ӪCR"Y+_cCxKJ0Z.`5z{;q'TMD@,P3J*(bOdOD aʮG6ǃaI@l#5jPm< %|U.y)n(X JGbi E +?pr||B5* ǫ-2V+x{X[lBP- -,ȜBtqDsA(),Ի{5OA.Up$ @ĠX@ b/@@YBES }1tB`k[LK.`;`⥕~(RTob@T',LŀtqtO#|g<K|S\S݊E`F@KueYqW{X*)G U"]w9gXG:V«p-ch#-l6/kr|P*3rL"%沂6S.5p.$PP2?H<3Ku0qs &ZMGPࢅR;`A&ʇEјe@$ 5M>ۢRK,qIOCb+-jhQ%%ؗRf/u-/ %Apw P5w'Er$T/(46?uES 4z$m]s]MCrKr{d#~$k$h;천*@mK}o|;c=3{K3) ,v% F0`CWFJjeԽzhet)BzmzKGҀdaAsѸ`r}gߍ+*sw0mj19B+ z8nu[=bTmJ)`. +ѯetZZAs;J@ 'PS  pMQAi8>24|qz1b^^c{J>jeegmkf{)xt5o%QTp6`>ygy!.>tNluy{a{|GJ* L׶pKӒCNnl]9˻?@kWc q]Ulv0}/MNz"K77| {zG );r{{un}n"}Uw.zH؁$YtɌH$6N3@Qn~;T@(@@a8$c؉CR,&Ksn0T׊GGH$OB%24:n$@1.Ke&V23/WЎ{[ɂ)X"?);2T]'$LWՆ@μsŸ/&@@My)\/8ru@c5Kr> ꎃ[N zs")qӝb8qàtF˒ϗNiЬ bJ"RP/)S*(S.P KBSJJS*)P+B,*P-  SB AB /PJS J*K@A@*SJ@ ` N[5h9qcnъS (d! /XąSrE%^@lP ) *Y2@l*a`N4X@X1Fh0 Ju1(OȊ :`υ-%JT8SZ5` !$;DXZH L`S^ͺװ{UE2e͜%V56BĥT,-˿ pa "Z@'u!wKkp(UjguA@DTmc#KR-u4O (= x-,hA tR L)1}PK`>P3yw")3$ -4@v!%@ht^l`)dif,R1,3@fL JS0rgHH ;Tͤ,DsEmBGLW!eJ-L+-D&RD%R7T@CAbW |YKMƀc| C0@%]M?0  (^mϬrM6)lpiƲmgo)0 L-@1, If2B(]p"l]ke,J-JC%IKAOAL#% UYKح)Z@ 24@,@IцRqFd Z}*=  ,[ ;q+@,m@IHJ807YkSMBM1@?,0U DS'M prBl҉\.8o6L1lnqRl7 >1;?ZyH8P)ʼn,$z>=$L0DKp@d-0 x@q8RpA]p@PA LcFLprT!t%OjxcEde`S\T@/g8B@'_67$M4"ɜ8~sG ~mbH:QL 0A,#a`B G!\p =#HL ٩"0 Bd)#t'|#QI`e-^+}-ԵsB @=XX-A[:JQeK ڻ )O_ J^S [<T bXzPPEEx1-/@"U(ՠt5QFbBw?Gr+δbܪ7+h2na2|'Yk|#z_[-o?S򛿲筊~O\ĿϿ~ć' 4fcccJ c`8Zu|eI LO jJ:XKEb^IrIhv{pf$`&H0с f&/y h1Thph7vBfiiƅ"FGW` ·:A %pRD0kbkk-kV7P@Ce7l¶lV1=1# 05ISQq ,P)0@(pnn B=&tyܲ!t%.q24_" QȈRshaq2qQqqqqq7wykWF"y` ppqǘxP 4gsG@:x'?'Aft؈-R!*Ac또Ԏuu\u`giv.ҏ^5 r/̨.)0 g בg?'t\ٱ%)$PCiRi<1wf {J 5dYF+Ù 9 -  ^y6KPP (`yS0kA K m3B 9ѡIR# ɝV1T؃oD "zEw|,-:"K`9(54MnSRG: xi DE9i݁krQ:h WK'f/i:eQIzvz0~9_-Uz ##+re#B6S$D3jCߑD1#iR;02d3a!W6#KDK PR /uM*K -K+CebU 6VӖ:'MvfxҞgL IF47]h#k۰yȲAj R 0vB%-boXC@caD LIlֲY qh!y4;frdfq0#uVY (pA:ۀ:g *yIG9ͩ O/:?u*Сa)J 2E2 ,/R)oᅍ '?0X^ !+WaTC(ݓ.ojC?X@!'U+Cݐuah构6򠤑3;e T35u4uhZ$` J39B06IZҶ-O@.+|n*0 4,p3p@4tF6gm Sz nr"QZ>nc$Xps B""(8B==wnߢߖ <|QYa]P4!a,/y A@RLKp`J."eP]kߡA$qvα@Ȣ T3yZ;O#22("R wfar5WBpl!+h[F-3K줩sQ|^-PR_l z|?( .-@@-t(Ր>*5+۰)w#ln|!0I7q6YVяy_#dq5 D4 lA#xrOb9TAp] &QMdk11?B2)DqFGpH4a$? 8c ES`9š }7!; ܭpztƝRI- JD -mJ{&^d{T{#HXi{䳮pN\n8>ڐ쇣}@BNGL䢕 T&N^X~RYq廠 :&8Z ə?*W]l8(溠f !g .p QI(!B6~ u36 r3Ӑief Af0cf9m꒡?)Hw˦tJ64X//6#~V g`4b!hT ɲhrMY*CKF`2`A޳M>^$`pR >!F8;BhP.NY `"!Kp/2 pČKP7RR7% A" Z P$#|< | <=;)<‰Dz33 k3y& ?Y b|3-2I[_!^=0%1ʜ 6 [:(`Z1_2:>hU 6$ _vR#!la/ՓP# 4ߌLϪMA' BX U-ǒ,QP ba ԎPP-0+6A-+ yO[sJ;8?K BB K?S/P( SSAP (//K)(S@, SBK P -*?@@ JBSPSAJ K,@K  JSS-K)P-S + H*\ȰÇ#J 4hࠣ xAt;3 `b> 2 P2`U4h(9Z %ɵ ar= `mSL]2ЫYVΦ]2L/R*^̸ǐ#K<e@9z )#I-S>S.ӚJBl؏-4Nֵtoٺx0ȓ+_μ7zr$Λ3n1ӫ_ϾEܑu'_A((7}]@(Vh& nV]$h(ˆtX߇|4h8HH=:iH&9!>23*)TVirLf$@($@DĂ8D?.CQ |B|J B Vez2 Kt塈ef (c~)4N4C@b   A2z\jCK'꫄nbOqR Ҫ|#f)@Kl.Km|,ϩ-@hnjeBR S+n^Y&E L* 5 44+k׆qOd'/ԓ &*%^]`e(ΨNQ[ TB7]@ert97- :A,5E|=`=P (M1%  68BSK<Eɹ68- KгD0duKB`Xj y#Ic , @11K/VP)Ύ "VPTKBGB2 v P/_\:XuW.H L d# Ѐ &Xe h<# %k㰙S`Bp`^vNDD<  6M-X yzS ^S ")L U'.D(@KPr +FP+G 4 Nxw`  /oS!bDrH#AXh-E|,8` J`3V/X ~H5 S-HT aZ2C6: q#\@.e,G>LvHMD O/IN;`Ť0M<: ̩ Nn B0:<@ 핂 J FlA@7q-Aw'4GJRHIs .>n8DgIT"Y/u@) b-l2!򻬝1G>15iAa%eSN[KZ7D(BMKNa>~@S媤 &N8N9+DK&Ɍl 6INv^&(CQZ07!R!Y\bwJOrP X[' LhK Nв(Y0#\0:%fD:)D'*׋2ӹppK%)a gX6z Q ]/p!߂pRcen A6mnX;op4JQĝO;Jr,T!^ PѦ2uajq.'7@!X02x[j HN20#+PR0IXβ ҤJZ<*wdN 3ȘA"MiS.X ipNOlN3!aUpb_@%pXi|WѨf1T0I^V/yy;imb+ZŷN@P bT[[2y߬4LYvdm+FMqb&)˰싯Y LBTV @Z!7[ H@q_f+Uz63 P d c SrN9~3T:jCЕ (@lB @n-.F W<"Wͨ4XB$-;չv%+$Fa0@ C@y jGKx%·/F?[9wc*)ܐM"9)Hv*ߔ 38d&پ>]{;GHzmfÙԜ:Qخ y_5_@jļg^D}vtZ,gn`SPT)S?: TeT$ Ku 0 ׄ>~>Pش u ]6X#fɑXwUvn5YTY?YY2UZZT_[%Q8Аp6tՃ9 pj7'^_p!|_`jFv2MEz$Raӱc݁Bb8He6Xh%lgh$mx"q챊X"Њ(1g@.+c9C،Zi  g~A@xeЈ ,Hl5&!L嘏Qvmf =\ U5^5L q8BƏXeA`=?Q<<= @PIv9D.d #C c4+D`1/o1P  He PR䳵> IMu-O) #B~)B):8$ S<]!V7 Q~ B?a4I{ױ:FD1z|T F`5sg߷ʁ$^1 *ҙTa z6ǣ[_aM% oNܜY(0RwOYFTG0yW3=SE`,'QaP3uH Y{bbN|G +˦aZ:,4ȲPAP  ͇4z s<ƀ Pǐ Я\g:k<: AT(,[Bs5|= N+lQ1<0/)@ T(@Z@p%T8ZYB~ G[A'SSu;С̈,͗1j,0q-|a_5b.K{W%V Q C;]ʕ(8yI]<yq7jN唯6К=a {/8dP-p:/cCWҳ -,@^ a^]-Pmi< Z!r"੪^%B"^A!f=M᩠Z'wbL,;@'?t,&^.h)*|EJ饘eiv! ]ꪬ꫰*묳Z@IA+k&BpvIj(+f*l7nhhvm覫~̦k.kvn+ {lyNĎ)Kp1SqtɉYLP ,r'*8,>rJ0;pN@lR M K0&\*+AS@ RF "@D7}{Q*IqS0EL1S<1DLCH3Od7CpHс`xL >([ $ atI{(aI L@h0! x\ ` !Z#pu`!h!R H 臄'/x"D QAzZ h |ҀD JWo<AfW>@+ߋp@N<8 %#P3 XʞʰxqNN /GnB"Hr mqSe)O"9Wм$ @ '!f$.hfLTW(H!$x}`zDMauB܁r0t@;ϲIE{$G_DH" L @)J^Q0" r @9#pt)!P }bj ~ondVL1B p AtՐ gz2 ũA&3V նz g $'`BɢCZC'H&IX;,@ kp9 B9HBb0,8qi 0 p 6df  X AA}ZWGo ^~KA2 a@([?dA;0h0p(eжUpB%^ F\B88t3%U6%!}|i C < 3PBO8DA,C[ P454uAh5dA۳e<^w&!,zW<<S:P z@(FR<~C qx"rvywp| yx\&vp$ǻ˖ȭ/pzuQ0>-? "+< { = <8Ų56Ѹ01 ߽ /ð * X@߾0^P 6@%DR8^8cD$oł,gk!,(2444>>>FFFJJJUUU[[[eeennnuuu%d9:f*Ɓ *_L.l~ᯘuS(LҖST1uZm]7Vٗ6wE`hIK~x}Zw|hlXu#s3+{yp>2a%"#*]<&üεв σ$ۻ .t /$.({@l%)TB4\ @p@D.P0\@9QUUbY-Exj  |W3kAB!,444>>>FFFIIIUUU\\\dddkkkrrr%#a\ۖgR^&Z5wlNR4ʄ :)LDMOq@i T$`wL?Nr= > 1R=6S4$B+f#X2!!,777===FFFJJJSSS[[[eeellluuu &#a]Xpk2^ज़~A0p @QPGt:\`k蔋YKdʭ{@%!J|ZC Ts8ABXH J`h/0"$';$EF !!,///;;;FFFIIISSS]]]cccjjjqqq%q H&HʺbykKqN[P)F3pI4`Fq.nc+1w X-\P} 'uF3 X'*{%GA aL'th' " LGnL)?:/`ŪBĐg1.?.!!,///;;;FFFJJJSSS]]]cccjjjsssyyy%^q H&J g8:b!r!E&]epYNV2;۽0fB1|kǀxYyS5|y~jqe0w\cTe2RS)vR6-D?"="?1&`C#8H{ !!,444???FFFHHHRRR]]]cccjjjrrryyy%"aB&[)ڷ׶Xƻg++2gbV{)EdJ[e`5`1}NNrt| (pu {d Y zHu$ &rduByb caMD]q[S/$8M>D0tm{}y6 +EVK]{Fq$ ~ }~ t} h  w?sh% ݴT#?.D[!,(%GGG#OA(j칶 m^7 #6L}#1DӪͱx& :;(?ԙ6[v,_Yx~n)yw$n$ ,y  k_ n #\"& ] e- ^W0Sj;  8B-!!,9!7GGGI3iN9Ƕ _\!O#6L c*Ij+$Qh`5« >sc֩ËVP%%/ 2  Z  @ < c:6803-* ' Δ    -   Z ZGZD!?,\/=^?aDiJsNyP|GGGR U!X"[#]!]$`$g(j)n*qn~םس@pH,rl:ШtJZجvzxL.Szn\J]SERvxY~)|!V(S?%$%'?)# K   ) Ҧ Iݥ)ׇ?  ) 4`!NCQ@A!,w   !%5);-<#&(%,3+/3(07-4;:;=-F2M6O%8I-;G+;J*>P@^BeEjJsNx'AW>AD1I\%LnFIKJKLKMPPPPRVYWY[[[[^bfbbbhknjnsvvv S!Y$^&f2g'n+rEoKxQr^a`eϮԹ˺SSQQGGCC223300// S%S@- SK/..տ.NS =BRKK+@bN9's`  R GSvL!!(Ćb B'd9e)2c2!ɠ:WN"G3ca *I$#FA2|GH +#(  "A~}1 D5b5>DXądB ! ,\y   !$/%5);&3-<**+%,3+/3(07+4<;<>6O%;M-;G+;J@^AdEjIqNx?BD;OaFHKJKLKMPPPPRVY[[\Z]`^bf```fjmllllnqlquvvvS S"Z$^=b9o+{BiQr=[_ɢŲŹ˲522// òȬɘҠ">ڶޞ-NI/../J s`@I (#AHp+oP˗Ni8A` PiM:xPTǟ@(z"VaITNcBパ&p2bC!K9@"Gq%Q$'M!ό'xkr238,!,  !(>);-<'()+/3(07+4<27<;<>6O-;G@^AdFkJrNxQ}9PeAAAAEHKLLNPQQQQRVY[[[aabmmmnprstt~~~ S"Z$^/d?h4j:pTnWzL{}[_eЪЭѿƳٺ̀&NN9$ NG&%%% JN %/5 "FFA%,xt #(! ,  !(>"%&3);-<+/3&3?+17+4<<=>6O7P-;G@^FkJrNxQ}.AR>BD1EWFJNLLLMT[PPPRVY[[[Eaz```kllgr}uvv S"Z$^6dLr]sIztվ)) H H5' H@)(((DH  28G@@&H6GDAH>HH");?EHH$7.(1H0H:C)!HH9ѡ!?dZw~8`qdǴ!*6vȈE@ ÁF4@!,\y 2!,"1&2'-3$/8-A5L8V;Z=^>`+6@,=KBeFmHnKtO} Nv#Qx)U|-X~1UuLRWQTWAXkZl|fowS S.Y$_2\$`6`9b=e#b&h'n9}@gDjHfHnInLqQuVxY{_`ehkpruz|}~áƤȭͰδѼмֿ*)(!#(##)#''' *>}*@C L/ŋ  0X]D;r^J $d)pᎧOIT\`J ȟu9-䆐".nkׯ,0C sq0U}C˚nǟ!ڐp ")wXBE CJ"J&'x-!0` " 8SaBI@BeZ(<%VQ9Lg9Tk=ZsA(/D,2H29FHACEAEIDIMLCKKKKGLRLRYRAKVHSSSSPV]QX^[S_]]]BMfIWd@_yT[dDc]IidE`xHqgZcl]gsRpoSyuiZj```aamjjjalweq}si{rrrxxx7[8\=aIkFjJmNpMr\nWrUuQvSxZw[yElKrVzY}X`ojwe|p|pV{\\]]gj`iqtrwtxxxzsmfjnlmpsv}xuq}{z}y~npty}ɀt|€͍̇‰Ȏ̑ÕɘŘȕŖ̘Ǜ̢̥̮Ƭ̳³˹ø¸̽ļŶH*\ȰÇ#JHŋ3jȱǏ CId+(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*ʔPJJիXjʵׯ`ÊKٳhӪ]˶۷p㮽O˷߿ LÈ+^̸ǐ#KL˘3k̙2OQ^&ROӨS^ͺװc˞M۸sͻ Nȅכ"qJУKNسk9λOӫ_~N˟O((hFAQ4`JCHZg6a]!nbYᇚ!hbm .xPoo3\ป#m?m5uC)djJ'Xh7f [ve^V$%>IR"ĢJ:\y)!Icᩚڌck"gz_*&JS)rfeq r6 %g~J)Y%j ̮ފi!>k?r*;gDBJm{ƺN42{~+5Aի˶ 2,k2Qc ͠ |ꈪ" >R1jBۮ9(ɚR뫹&32[2n=7 ooj23kK<ž&ت0*]i MQ?ݧZo 2R]=]5@-[&02ʱ 2.̮lt3 ;Φh_/#ܭ׶[ ̦]ns~,/ 2;]5(t hʎww/io`dzwrM,]F+*Үb^xFB1sp8W&1aԌW=ّix G{̑<gHo12[;HL ̝\ĈE[6mخq/׷1 Ee^?#dh$h.RC]ˋ^j)ɏ<$5Y^J*ad ӥQa <O&?Yu")2]WF=/{m}z*do|Qiz%4`"ZDJdx;(MR(y:8,XfuuNRu3Z8. Y7}FkjNu 2;$0M-VI]4tװg‹`q OY=J5R\V|lk*ŅO5)hWlCBX(|(ae8iYn͇APOYʴW$9RatZ Nci^ҿn_EhoG-.J܆(+b n ët#1ʆQk2FBWs <(s-5Si@s@:rvN`vgf2q0 $%̶aVd,(g{mrxlMn a F7s4kRl<)2.602R2%09Le,5Me%J~Bcj56ƹOk./UE}ݴy9E٤z)-[yx /EstU}dR!k¢Dݾ.^R)P*ʙgp'u;4mH-S_^@jt)#0j}{ G@MdzQp7, ]nW6|#RPu0@?f2Nz8uC?cxnx,SqL4<(~cۅ/,{mgGm7jQjGArKd x.}v27y' @rt$'q{+?`zQS: #x8¸7rHAA` h$2b%ҍ,1"Xh_o"13td'xXr}',!1y1'/Fr@dg)nqeAsj6`Xb"9ԎF6y8|Fwwx"}!YG}i{0\VWrJV+guqR$gx ddQpRw!w$Z2( r*yph 5n8YG3s1RX~>F1 PprD~&f#0S@P^vy{u ɕ9& A8d1/X ~is~YYz#0 n y9@Pc(](H91vyq0 "9w2Iٝ ++1*虞y{yQSp9Y*q/ٟc)z!PDZ^9:a "::(Z'.ʢ0:4JZ:)<@*>DZ9FJHNؤP:TQ,:XZ\ڥ^`b:dZfzhjlڦnpr:tZvRZz|K79zᧈڨ#?zJqQscPws}0V*=ИZ=/u]]?Ɛګm]jDzjDUʕ:>!EC@%}] 9/J3*\aW*պ]j]8cN}3]Kĩ݅/jZ%021*'Ě#ܕVj3U.9A*,۲.00 P7:`+{ 5;5 5@ 5 *[ L+ F+4+ NK 5 2۵^`b;d[f{hjl۶npr˶c*p~;[K} + ~k˸ }0  pP{; }{{ۻ;[{țʻ[ nwy p ڻ۽`Pװ { 拾װ`Pګ`@ `+[`@Kjp \e e0;\| "<$\&|(<ܠ 04\6|8:;LY^pd0ÆA|\]0^kPO?lJć?\4YZP;`@B=Dm <ϭ]R=T]V}XZ\6}MNPn \ @G| ^o:{-҂ԃ) n1-ҪP]һp ٗ һ"{m/8 ~m !% ׬ӦmP`\' i?  %-M; ;=&Ѳ}ӎp #@9ղ00<;pL#=um @ߙp* U*$An T!%=~mNɽ8ܭһP]$bL] %]m#0! <%ؓ - DGnp(O-'BBN *n9n^@n"A@n|;# mBr 6@"}&nnn& iA>U0 X^0mm8ʝӥnҷ.?>M,&3 GTLp%Fv0F nd- G|>~nd|*F.`d> 8qV~@Tp7`d}r- &`僀G ;ֲ@< ]# =. nSn6`!#4 7 07?@.9Ӎ} uM!׾ ] # _*`$y> U G0noM0p|M oA#M|a#pr(鳾 G& Mp؋OєT@<4pdQҿ>(1qm@%>qM{p0 ;r/B!?o۩p _*& Ion<CoT017!*5cΜ#Z4" |܄4nT` T#nX䩂0`82t|'0̓*Y xqcDGoT<좂âao2.`<#O|YyP1g "+XT-\|noFqtD`IWPIa~bmbp{*YFhhW6h,`7@*n=$CoLS .'\a*Q.p H=`ovo"H#F"DSTqE[tEcqFk1FyQsq) "4R+sQG^ dBxoR;!©*4G2W *F Ss)Pqe ̓3I K0#` T,b> qE& va$OԃEE,BR4Ay(ʄ, ɨFEv9dz Y4Ǒih#zM1`(/7k+$eKPn`q 8Wk`exB%J(8ޏKŘ,񪢶seP!hvoYY&'|#lUa>pW*TPIYg((`)J)4Fzk1{1!4I%tL7A BoN sц7T躸hUp?is$A ZYpp޼J 4^T*ܜVٛR{1yT_SjL 1jWm cydxŦJ-"7yx m@E܀VVy$B8иFU<OGUK;xo)'򕯌s;v`4g٬+qh:b:9XH79"NO0=c׌xD$&`㑏`$$lBJr6yNDT>L%xVS%ox *n‹ |xG،c)L0O7.°1s;䔺@yC~~*XjTXg)2 On VEpA\<< (9BP)F>TxvRϙDe@78 6%rOP*0^];6tCpS0^poZ=r`Lh/.!*P8o%8F&bvNl< 5V?m =QTELv)Kb$Y ~p< #<̠*Jቕ# =q\BuhzDN HAu @,`1 F 9hJ&t$ +SD3%ONfJxK_KU8c8(G8`-FL0ˀ*LAv2<\  g=+L`B7P +GB~| ua\F<B]Qrv+*Y-r %#!yt$X)|vHŤy‡7g;(,^^*Y 0 trDpFR'eK)]kBF27.xCTI`379S^(7S0bJ&Cf"nN>o^˶Θ &OP{9Fi=n^6D1OU~xWx2-OSЦhިb3Eo(#|P wJxSac ƿ 9ZZۚQS{|)7 .:csζLε+#:0/VI^ \QӔtw}"-%6JնblM/,_7A !qⵁ  o@nG\78nH<݈sYnSq'EƜGx~d ]o'.· N}NP.=07F֨xG^;eAȧOf|细vO]bO^^ǼeQַοY>U0ܐa4o}cO[-g~);_糵}E#F)R,J_'~+gݿ~~]_ @@\"i"#ӻ??@ @ Ժ@ @ Dc>?@,A<@\A\\CAAkAA<,SAs;?{;>(;x;7>s٫Bh0Ax*ӰLC5\yA",{@Ż9H;#>C??@,DC@(CCHjBXB?l KlMD?L :OdD0DD> VD&@ IzE\E]E^E_E` FaFb,Fc43j5a:z7vG8'HGkG9GtG ${,4pHcz4: cCIt)8*€ v| Pɐs$Z3jI8)5?sP8k "Nk4sPе+klIA0Ş`AjVi+ !)HKJ"Hxב@11`gS6RH6 7bk!͙h!pHkʴ v#!IۼM4IAIÖUȑ*0ؾف ![:@HUqt!ꊘh( j^=@1q1;- "&*m ?NKw%ȴ- 2 hY2m(4FYp ! *t>@Hmy=ϋ7} \-;~WX#XԢ9h(0"1Z(2C+Q;s&#;OQ԰KئPG4Ma:P$UVY$YegZ%VAV'N>荦 .r+ ]SL&2k2YY&ժ:Bۥͨ?9JHCspRP (vÉM`Mޔe) 1!ѬE^r`HAv^ځp8ar72"$pxgy 6P. ;Ȕ )U>X`Z4`^`ab 8xXepb^ O;/*=ayěD܀LEmR&r .P *eQNNI6MS\$_c{71ر}ĶDиڨU1P92H6>4+Dh;Ān 4 B1XfCh`fUp;ևI0X W +Zk檹I+&K:)LUfY3*[h*2eN >>eN\ v4GaΨwr12 9ok8QwȠa;H(K: H^j˺ A_Ƌ6:Nknii{%^ 1ނ-Bn|p 5;HqZ1Wn5زgӮrf͛9wNS(PF=μ覹|171+I#S_H$JEB<׳o6M8=xE??.4Vɬ3sHG^k {fbZx!j{ɷ}=7~uMxˀ;b#Iy=#Annۈwq7ÀgUZy%YjJDQ}݇1.zTr&q9'y "YMS9(z(idWg"hs칙(j)- c>ʧ~&7H]*x*F)Ga"9G*sbv-s Ⱦ#+:**PrTjLǾ3->{.F9j&^+Q{/ꫯ7os / KLp2Is l7 biDܢ.!$hFj*-1K!< $osG3ŕ](Xca3#K=5W$&,u@2,x0Njv ݜ7ihXgHV7}V2F'oo}8̈Gœ7sC tS44VD7饛n +8p0, t%4HoCh_DuFu:͗Dzׯ;+{=,n$;0Tle<{ ΏSM*E;,@)Ff֪' z^+ ||v03o7#>.E6Nvia2# s,AF2B_R8aro@[_5 (S 0<|p$S t5v>̏]QၪHŊS( b.p bEsTU FT9P+1A<9d1F7@L` 0S@6`:9 U8cL(]Qn ջH k7x9n (m<}!7< r7H&xCEPN @d;?`R.^UI^ X'/bzeU(Ȣ@`(Sa^D`6{uJts0(9G($U Tlt'v*pql@qiСWRrswQPV5d&wPsaEJW: G,RsF SI7V:C/ 꽊*j yZ*!~UڜTB >9L0j9Zd0wFNw%,ns['jz ]l1P `YsBLmMki#Jʕ $SQ/y-|{%Rqc 49}N)NzHb+sʪ6Pځ za fmq3ʷ.}i_fKb9 HQc0j\;EV^OK:5C@1e[e 7c V1s]vMGc`]0 "-!bsЋf%thr@G;s/ɳB e?~"aT[itXGՖ`sMӞ5Qjߊ^>-{zPH0GϾ>z`sK RT==ؒe=cƵmBߚfD!o^K6>laF=;v{k[t%<u ~>#\%wz5/})۫cr`x-2iOqݫ`§psDBv怄;㰶Є'Ǜ2F[/"ZfDH#b%0L SۡdxD[ծ/JdbwmN|bEw˻d?r4<}xd#`@ 9I1>2%uLF%V<p4dsB5M/~jˎeי4 Vכ 8yQsӚtg=Sx:yMH ׀Usr|]ߨCHEYFyFqxHqQghhUsK`L513=V`` "^ڭ^DT\V-9tW2GY5X fW(YjUA,Px+D_laj{%!D8dUe-W;1Gfm gy!i=iMX.Rr 9LI]v`ݡ 9r)V1stI!yCu) 2nW\!0a$ɂʛ  U1G'>~sPqAh-"K-. *؀A_06G  H$vHٿ܂38#4HQe_XрQ۱8C=AAə\sڡ%ڢ516\B.N70XZjE Q BB$,⠚" ڪK/4]."Ț οI -Qead֘dM#SY~d=l[ -FhPR%a:KRvRe ]X_nG Y]Fnje1H]g\}J*濨[c=l[YJř3*g&&&i6$cGxL=LF 䊑HdFDGC&v o&pKHY"Gzd@-۔EfYnY!3e}v\w 9eˤ* Q |_=\]ܧI~&~ p߽O=jI6!KRL]7$Y VZsp΀,Uʉ(|h*^ޚhR_Qx!@8qQ*#yc.:c~"[&UB\ `s Q0A8*/x*@<4*Q>!r0B83BE1AX܀v)酩iЕi̸ H QrjJ]ׁ*" \)I*xXC5,xE `V+j[&̄S|״7pr|֝7삧K{iԖ k$k'ZZƯ 鿨;*Xx hl*q*4I=@+r)3dzflk EVj}9(J,L`L_p$`]Lı`ah+rw?(D[e DeTDTa ,vǮhJĢDE|G$DgOy$FX6Yf-z Ϟ*vm%PܬWNs0,,۟Y܎jh$Ѕ\i>)杮,F xV0L .E.mmbnN Ν#Ox8#Ă/06BmA*쮑 +/nΰ[ќ9M%ML/o8Q /L^e&N0*,#V8$-B+A#lKuThWD0|B9ӀAdٚo +0skˈ `p8E !G oW$ 蘩"HVs\A),J^U)U„a@3R !z@k1"HޝՀـW}j\y(1s8S5%7,*a*7{գ( ~Cn7@)1]k ȥnx pߴd)Q @WJU$(J'U :1H$ڋ ({B-A+/mSô1(%&07-2C rV̭ԭBC`@O* RH GGi 8 3 .BH,yi4WR04GLU#0A7C d9;@LOsV#i-:h*0ݣ5rtu$Az@p* xV'ђ- P\3Gݡ+ q@ !;kB#9,"׀b/4MTEEI0f*ȓnb&" :TIHV8%^PSJ_|qҢ bx81</ؔ<<5L=C*`w#9r Rd>ٸMM y,($Qv%35((3YU]U^egU@8ı Ȫ_y_،@!&qUA |SQ' BB뜇S`@"s s}@ԕm=TW؂-P d8ѕ]qyP * PiقK@sA ,(q۲EGFݒN*|`h7vlh$9N8@cҡbf3Υ:@), tJ{՜shX::zs5;?j֨x lUB-J 0+\@(HkA0T$0~HX -*{~<;GM)R3+B g(. @*+],xC0#zԣz,ns"& @ 3v+3$L@x/ xs(L=Ùy)trPA(B |Wx|T89x> {B i7Wt[R\s,WyiIÊ902 hނ.xC%,*9|CX$Ÿ 4xey,on&,FxT`c9^Mx3wQTdPa"*&MCd :ɇv1m Pd8؂3"Z@8H-8:=h*.6ف#ʺqGzۊV_\sֵ{o^{p` 6|qbSt휼CTr ͛`eok"5}uĵ5.Uobߔ][Ew$7nawtqXU$Fwus^*m!࿑pym.Zh ǛShZhǛZhP,rP<"p4r-/Z U\]|j&l 2L3@K4"$Că8O~&FoJ&8ʓ=ݘ,"oL+q4k b h9$қ*}H%RiL2( 3{CM=S4گ2?,\VuL5/Ka$6')YfLNCs6P= 6UsS Ur=tFMq@1 KRl}2K|ͼo̡U6/s%Wua/wKM6N 1ګd/6p&|湋z hQms 9,^E%uH~h a$cXƄ^QXȜͽ>.^&ir:N<94C[ '>;y\gAp1Ŕu-<0v3k;Th G2i-]W.*d&͑դa%؅v,=^MSN>Pj$İs ^/jLA5sAwhQ/j4]_~5~S 2"W> T(tݽwU|2A(SIXBօ{ >̓i0\0-iaH *P1F \**'TTC&n؅rB/~aU6k}W Ë#0k4 @#@ n8Mm;4 r zģqAH4b&99qk{͍怣R,Llqo<&i Y˫я QCn 8A j,I]vd;Mo~SgYșrtT00F8&||8!4>q`\QAn@QAv s8 t/2LB2-}J8FC^x@-$ z\[DiPMy*59n  TZUJ.9](A4;P+kQ P&x`@ &H7`n,B0T=xT,i60l@s`yC&0R(KjL* g &ȁ4PSnj[o 9׾HVUr"E*)GA^dpxcnR xVT𑒞M,RI 4-rV^#,ҺC&0z on6D 0R]Tre^ؚZ7T[AvLET[cߘ/ϥKtUt~Whz`lBVѳ& _)2> L&geRM„]sru  BlDFЅ pW-3+` pkByTrjpiOwZsq69ok!ૌ 6Yr{> 7o{Y `0 O5g0arl0^'o$-9@zp@k#AP"7Ÿ7MOT \F=RA&v_k&x.άTܕ#@<CZv^IpC&`#P$NLhB6#;$9Ϲ ,Il?` z! Tp@ 1<Ob&7/6 9, p z!8|w\=唨 @˄U[C=ZsC#S;{eho"o8| BTX<M4v&pu"tӯ`!/B>.QCIǐ1aD&'jD;f:>ڃ&l j8<$!5rAo{cPtA nQ͂l Qhq.Ѓ8`GogyЃmG;d!CCw|u=#5t́: { QH1 K'N~V27)Oc!-(3'22}1!1"2"2+2m(2 /2ܒ/. 1fHt5t!dH@"3-ȈH6SUAr3U%FD5/*0Œ. 2Vi͚H5-_4NC7IL嶌$T6, 5v N#5V,E001H6[g隘ijɗt4x< 4LH3-BR>"SCd7ܓpC:ESAk ;r.Dz(; 䉞 oj .N "PABCqbÊ-S<0& -39G‚ TTTÐbP * (L|- JC&&d 3MAIƪ*f 䊮 7*/P!Q"詴)F=1K\n,tGiTA@Z @h+QK@ (9$XU6T%O (F@Vi5OQ).~MT.T k˼ ԋܫP+nGl,$a+n JRyx3L܀@I~7K F.>@䪶`jT !!@HUa6c, @ n+fM."V&6zp!"Z֛5RLՌ-엞,ʦDJ`\ݢ.u7l,:Bu` Ld V ):-_ςN$A6&xx x Lb^"]vvN ʏ'"AhSW}hċdMJk aq-v+& _,;j H ^Q l%$ |I BJ 0&yݪ". w*b "T!`,` da;^* >@T j`fH&q 6/*P7.VPXWTW1h[i6QMvNJ(nr-6c `! ޠ?;^,V` au2"`~c , @ 䘎  ` :h8n*ada ޠ ʩ &6  J`@` pA,"t-X҅o!.ٙYrfs"jvIVI*,.&0 & l`E1n02 V0dN" !|MpXXGTL,&?܀a(@@& a,j6̂aZYEo@;t&$!Eɡ*@ R0ꡅ᪝!fY;],G0URТ yoh a8d;Bk|;nh!؎&b &K, XʳM(`tAX=>; C AxaЃYC1'tPVٙ}[ɚŬ.( {CNc9M7P"7zzN\6~-Ԓ{ɢ~7~ > e;;ۉ+)橞7Ԝ=K?TB7JED:[4^RgjFM.>6n&8LLJ}-jEmT&n w۴/ZR.\?ɨu;NʬJXP5ZGR%.U256% PK4UpVnG@ɺ1Qa.DsnLh.s u񢾑$K7ɕ,[Sٲ$y4OK3Ν<{ 4СD=4ғ)vN!S^z֭XN5EQC=6-p"ib[ >M0w,YE؍*wP52Gg+7SZmFp+Xn([6X鈪MFZu ֬\zS,YyO ntyDo5PD5&Lh)c2IM78A4a7*Z_;Tb x0B`p@H$ XfLd0;, :N!_s&p8qތIqctSK-LN#L0 ӜxLr)>7Oxޝz> iNJiPA%UNTYU}]UXUjxeD~ͅ!-70$4QpoX/qe#-S?ˆMLǎA0$řA6!$a, 94#*9Fl>lfHb -ՙ~*JSzRJoG$/\i2Ls6[qz]_LzjХh#L첋TxU1$K3Eƅ.<JSC_7 Lx3(+ # `NX`#dlL8GxBT+ oeGsUTs 2I sgH5)LIt|+u{7J*F_64,|@Ä4aN\ Bغ$/M l66 D CJ7Ȁ, 7 T"GA@ x O0P  ID%d!H4e;U#EF< *P#S: @W?0Hn\ WDxQZFjTIeUXu,vPsbFOlwpubT6ĭkMB S 㥄-ak/BO55fӞ23f9ҡd1v^*=iOZ$%`^1"ɜ,mC܊խo ܝ%e,WlڒYh-s%JwԭnE.mВ>huϋ]Iq{\^ywY{O^׻i}'`l*Иe2n8B& kx>M`=E, Y>@4fك dA<}ᒄlMxQ9hpGf4s*TLyE&#x|A+xEe  J={cҔ~ǘ/L %vDHFLYbi^B$K$LpD<p(OPwb̾5 hc:$rwL#z"Ҟ7!s jX8s1a‹X``/Q d@Z(62AG{#85Mh 85pYz9[8#'wc&y7gK{,-Gbc{YP. h52A#FX"& cxx c,oS:zCР:yb$NiJuYv]-f3=l/-/r}<#ymΣq^X+t(`΅Ã;0`H8xo>}( vd{ǝz ^Җ>2wV-&~Rls^ȋ9>P`PYC onET*1Z.v]-vQ p#pz[Ȧ{%XglWGx%a|ȧz|чgL`}gzF[v${%R+u{` hz8h{{SgWq$$&1w7qp@YhFdx&`n#Lv4&a8^%L(s(W_ ɐ8Uh!hb ِ3x[#I+h&%/f'&^Ʉswq- ;ɓ&HEeh<3qe7'+D2(=)iI%A:y9GIGɎYA)JX2(\t2j4ʃECڏmG Vu;XMʦ曁JFiUJעbF]8Jbf JzXvzɇh}e9uhv(>AQ!Z'ʫ\xg3f5Y[xy6nuxxvhfTm'RQ׊̊u(_GlWiګʉ]^SaW՜1cB3fG [ꑉ F# U1  ʍ# >b&k#;^V43XJ*S6KT&8˳a?;A *k=Ik^@˴B[6{J+SLLiZQK_ a@\S=ؓ T0e}a sPhq!cdpqcbYuD(Bh| U+gqM nya taf44a D| ޒBึ% s KF0ce{}ĚFpp~؃p`hv\ͻV>7brUJ0*M4Fh,4G; hG0&3/xY7м\ 7%Ck>q! jqP@ ppBqK15kN[ ib본˰{F VQP'`7਻%{mfBafM@:]p[5*w#lwvnШTVG"ͩpSp`!!"!i$p@ ncPVbPbj(T`  س ~`c+>VcB0gW!!r} 4g#cc\8E@x ! <M`4P ?&&p*$0>,$0a0aG0-x&@T , 0qk 4@pP q B 6@%p>`M:[T5K0 3%} yBU, ]k 8g#7B:},7bL;R ǁ0 B|+ opG nP<@0Kp50X"}` MxY+,&`. %C3 2HILp* 4 jp@Gg 5 2p G@ \ ` tѷѽ;"! @0hP,£*" ` n&~~b댗Ԣ P rR 4 "mP2 bGn0`/a/{y+>T@o*bd1 `<ll  bn TcM0 Ap1pJ۽].SRStG @<9MPwӁn M`"G #a!p3aKq٢:/88g4T%;"0@LpgT0#1+IP5#IA7.w p`8R$|`ALn 8.! zA AWr"@@vzI"#=P;+Np+`= VP hnȞEޠ ;!TO9۫4&6#U+kZ~9yvt^M`to$LE,MM Ǝ5ggcT UM9yG 0 To@s-v"47 ` 5V@P"  ga@: 4&OV11G_F.HS>O>L@5?[?]h f~>P@vT sD0o2aĨ6cb9o+|,x6Dŋ%(1 ` b߿n8 `#s<* z;RR Zv?1DG$DdE_1FgdLVbpBp|;HD2IX&aI&K2J)CŨh2K-Kmd0G!Ѷ+B"C6:9焳N3O=Q2G 2C;9tsQG:?'RK/-wC-HTSO4UUWeUM4B ?M35OQ\wV6Xai|U1 LDEUfaZk?+6A4TYP`ȏxYsGeTCAd *8 Q(T-Kyb]ġC`"6uݼ6c78[ȶE6Z#SSQHpe`s/&pԑ& 7pw-# &w@Lv x87<:*Ѓl#TQ98&lL7%n[fONyksʙ´Co ڼ[=+|:qNg A>bs'%{ Nkл63;vg+Q;LccZw`Lb >p<Ic>8jy~zpXy=&iv0&p r]G~EJ2} M,9*, % $?1A FDŽB%TR}Nxb] e8C{ ܖ,d2vWC#H/v0#h Tb`T`P<`{"&#l `@E'.pP5k8 `hF40GLqnpG "&*Pܰ 7 8' yc x]d`X')ҖČ J[ڡ|Cjp Q xQSAT`pM,RI|0<6_;XA>dsj  ioʂ ӗ#DO@E6p@_]aQr # 鷮ٔ0;ң.mGc0{[j 'GLFE(D&7G4y#xϙ Lx~iHU!=iT0gZ>65BLE'Y7:ZԯHo[j '9UV~iei ʕֵ7>Ix7[~Ngy׸7`+oӷoaG8io 7t]7젴HEwk\y׿p<`Fp`7p%qWx7aCyE>r'GyUr/ye>s7W9QRG g:бleֻ0:ѕt7Ozԥ>uWW:vs蔱1gG{վvo{>w2=zbWU<6G|x >4<%?yW^3WiSuxwg<yLqG}o)RW}e?{L_{=t{~?|G~|7χ~?}W~?} CBxڗGICL|k֟yǿ_p?4D@j2Kԓds= @@ ēT;$A,ѽǀtA3AC|@kDz@U4UDG\_DS0[QSD=YA`D_4NTXlY!j@]I==bTaT h0kB4k4UFSdG<>#rdANFf@gCʫESFkTEc\DnehnjoFwtAx4ʛp|Eݳ~0AF/@ELHR]A>C`;Bk7c@:eD?gHT VVY[[\ \&&]0/_53`b!b"%f%*e)-h&*h(-f-1h,1c23e78c;:j15k49m9>p*)r0.t97l=A@h>u@>CCCAEIEIMKKKFKPIMQD\EL_LMQUNSYSSSQUYUY][[[AEkCImJNoDLqLSrV[`Y]bRVsTZuU]xZ^vAg@DjCCiLJaLInGKlJFkPOeRKlTOnXNpNPoOQoQRnZ[e[PqORqRTq]XsW[u[]`d^ch]mcW`{]bxVq`[se_uhdDDdKJmAEmEHjIKmMPfUTkRTnVYj\\vCCpFJqJNxFDyLKqMQzPNqQUsTYsY\zSR|XW}ZYu]a`x_cccbejbjceilkcclmmbezfkqbh}lnpil}`v`bujdyddxmhzgk{kfypnprnsxk{tn|xuaesehsjl}abxejyinzmrssttvyq~qvx{{qu|tyzzzlsruu|w|z~{oouuu~|{w}|iitszz H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI&:q8sdzϟ@ JѣH*]ʴӧPJJիXjʵW:ÊK诬ٳhӪ]˶۷pʝKݻx˷߿ LÃ%"^̸ǐ#KL˘+̹ϠCMiO^ͺװcvz۸svb+wУK3Գk,k]؝wcۗ}x]X`_V_ _(^ 2ׂ}e!V؂px?'""^/ubqXs5Xv7,0!@̜z*""h"kz(2|*K(g26*je](랋QmŰ{V )?l8zWmu0|4^*N dgJ~B2 ǰ[cʱܞ8ôQ4 Mz7kʳr9< 8~?.}@{ʇ))F'MqA(iu bzrK14%ٝE$XNPke|Q=~!'uI)Oo֔@"zv$ߥ6PgekR(i4議laFԪ.|̚c~|o-Dсt0Yl 5Gͱ9/,LxeNzN' ^u ~ 9v*P9N[J뙆AAF-wMNɒ?aunB0993? Y;ώS7'v@H?h$"oBv0vT7RӢ!YjY(C0[eZ8UbY9!Yfhc[ņA[B{чXEX[8x̓؈؄QW=>WKE| }.h}gVfgj h}q tGڧ7&viHz҇牻|sb5vx\B^g.hw}244z4ȍɡ{w(Xhx&vG9q!9mX59YyYڑIK "9$Y&y=qQْ.0i"46y8!>@iEǓAYFy8 LٔN =R9T9XXZiQ^`]dYf9Wyjliٖpm9rYvItyzE| ~Y8)ט9 oY%ٙi9 syiٚQZ.jCHT $Y9 :[`:qڨȀ0JjPȐ@0  ЩZzȚʺڬ:Zzؚ:~:Zzj PQذ{P𭋰{P PP kQP P ";$[&{(*,۲.02;/nin<۳>@B;C[ p p;{г[PP[̰[ [0Jpr;t[v{xz|۷~;[7p:z@ @Pڪ*K@j ʪ` {ۻ6'ՙ[qx`E:ټ.[%tZz*  \Z y 0`R)E:*h; βҝT\d|k8+P@ "},ȮlI|ѐJ}w8q9QՑL9QeǗ,fոlԲ EpY@l9^MϬĂ쪆t}J쭇Ֆ|Ӆ|ʊ Ƥ mƜMM-֑,m:n[ ח,eͅ|ǎMB-w]KׅVԋ}kƜ<؜<=ImXَߊ=pʌ:}ɥwm$]lm[\eqډόУ=ܴ,zUm"`W.ZNW.qv] u^Dnȏ>q Œ8j%NĬԉPlL [ԉʜ>L̥Ε M =ody|7q}үLER馍Uy}̕P>]ƫQ=׎W Ӵ\ mȾ|}}}rɤ˥ޔ Ɍnԩۦ%nۂM2/nO.ܴվ ll0|m|,Ԝfu. <ʞλը/ۍ^e=վ]..#%m!ltΎۓnC쉜J,lI1t=v( w]>^ .,n]. w-J\nݻ,мމB|zď)Է Gl0Qln,LޞMR~+<Ѵn̹nŹ>yAN'.hEМۊԯ}/{vL1MLıo@~ \hpv ˗D'NBzmܘ\G}"CC+0ņ}i0N)aFג?I.eSQNZթ꥜W_wE?SQ`D}4a tDFuӧ]ȹCGϰ$ʔ`^(u۷cµ=s,¹ Q\xyd-l4PqAtn_ (46Bq_LhsNtD }OF3]J/?FKۗ=)aZ5b n3xcqi,7Lj-dE|׍=Ҋ9/ݥyPk}YaIHpa jʇltHB#]]=}VR5?[+V-{^Z}u(eXǕ>%nqTAeYPܤ`1m[(X*M.TCYrl +<,N̉_LBT3 S#2߶O#mMd C`wß$La E*dg_c sr69M.IJD̍JHP꥓ 4"tF{Irf3 7h ,e,%Z˭Yu.,BsC+.w&,-KVCgv/Dw2*:je33rELgB$GEf}sf$Yd\tCeFf$"nLt* _=\67y 98lCM*&U߬&XcX1n93Fl>)H?n@ypLKrr@m9\eD[=lK ~h-ڲoɣo \fjkqg.禅<Jj\LE R: OU<$i=^InC=rXxLiŮ{a?RIԌV-#X CW7-Xr˜zh]bu'G8٣}rߴVjܽo:kѽ=y\.΢K-7Rlt)&'D'5)ITdEgM `:Cw-aEa_a_߄ VQɇ#Pa%^ .=(Xn-b&b/ 'f. nlEF2L,z< dc#AȀ ,LɑӐ/.d/#)c3$Rh0zʠ @㖂` d'\^]vXEЇ ȃh8HX}reeBsik%FTdao֣<g اpg}羀`E]ǤX%`bh`>H^A0.EF*( t D?XࢂBAh=@}NJؒn ,L=iߔѕF2QE"M=1O @UDk@R< -݄ۨfļj߬vV(6Fюs1kQ)S9*ޣ8i̻}Z u}Vw|>m-&U@, (&%ЉdR=z/Һh8Em]n8` :3ur2+|s-ýPB~nFMxЈbnSB23yۤ+Zoo n\h3%{ 8c2x3/AĢP Fc(B  qoyP2@{ϰGxy;>'*qrq2sJ+q2…jEJ.;q: '[n-rGYcym%_>W,c .$qU+q@Юo>?悾l2 LJ G:Puu~Iu TlDNQiHvbug?V]Ñ*T*I"+U Uh(iN&6Y'@%gwf[e͡% +P w wghOx܁$JHzv@ȆrykL#L)xx_Kp+(x?/nTxztnzvyyŜw~fz//Wy+@LqLwTzalUh(ll +`y/jgN $ֹ|]{\{viiiz+p@hhDŽp"0hZo8GO|%ܝ_f#7±@AJzO x~ ~-~Vv^ʎzN*?z*1oy T~)^7~ tg?}-Dgp!Aq94.bʔ#H} m4XR=eFDIGq)wc9e!Ώ-J4ѤJ2m)ԨRRj*֬Zr+ذbMخ>~Oek-\tPS;.޼zeN\auPD H`Ϡ픕ˇN8*SĬ^= SN;e4(زgӮm6ܺwjZlo;W_]z/w1rÈ.GES2KR*'\dAd? oiU%w)w=dBw3AhDC>吷az: "8ѷ6 9#=c55p)hW b ݕv%XD8D)҉{8cP}Y~?&q9AXd\G*$M>%%adA@G]J"rT|gΧZH >&Q$& Lt!EM$K{ OJ<1S J/r1 wlK"E`b|L0G֬6+f'Q,<(3 5 Z4QK#L)!k){$1A @`D 3 1`M 7tROwDctQ 1<335+lU/uuYo=y]>2# #RH3422>KPN7x . ~;N9xJN9zYN2ù<48D ukP~xԻ'{>?÷U|$IpCqq2poGӐ"8-D' R0N3 ıWQ=Usځ J@ 2Pؔ|T#GxAH# #2 FⸯNtN;FE'Lqb$Dh͠" fpŢ!8"($(K$N$8J0d0#_< y r|$$RGj-yd: R@Z2 dGUL? z,I&G~pOl ^ӡP)~`HW2r,祻 WHX es a,2LQ<$C>uGЬqhY͏PZ8q3Qz>(=ho K ˮ $r,"(dex-TZ C¡1*` 5 )NsS( MtˋX/%˼ OJLөRU=Ose, :*)ԼM>T)M$pU}+\tU4d c!DD"riVSXV J5}:1x(a;AzJ>hIG>@txVKV?e+DQ&Z A Hr+`/ed>h@ ?ژ\bp-x8 j[S5OnM~aM&W8 %ڱ@LrQÍC!Dߜ"[_mr^Ak)C`c6Շ < =@?@&6 9.~1c2x?49k51# `%YA2)SYFX1Q^k,ܘ  |㨇3PP!Q|` aPƈ.zXC/5lj D-k43}1s6eь/5y,<y2 @'h򖁧V5WEhr=޳4c%q-E=c%P4Jm`#=@-qL˧g %i 5׃Z+H&ç\1}/y%ëCRtLy#XO:]tg2$8H"wϝdEo$1GX9gN^Za5ԓ'uAܗAHdlFI@eϧ%AI*|'2ɲ@5VdGi[iy0[]UJAG`F3T PDK*]: D5I؞UkIU NV-XFEduPg>]{XLe(IdejHh5\i@iG` ֍P`{RvDAܒfGOD9\ HoM] R`< {t8`,E @ jpҩf]ax2_|iL)'mfx=X <-\i@F ]] !"5"+܂E8G[LF-#aH`{LGSJ\8JPDA0D9f?!L}I_]!H5]t8d^6U$ө6dS].69ć߱LJH\5dQ\cVQΰe$1%U!M`bib.\zӚ [|LLMYaH@d",* X\vdG:e.`J:6e+ -"b[l8t/a8TeKR#LʢlNǥD9]GM~TNˋ )_}l8Oek:` Xk#H*n^8` I+4lAAlF475M%fA7A,%K.&#WJ6E6%)ӱ )᧔2CAG|,AAe|Z;@\1@A Fh)8ACA1)HJh\D;@AP@Rj9D8j;/`.0>,k<+`D/\YnZ"fc齐ڗ}2 >CEl= *DGåǸä!ý|P9:4X8 ܡI> H> C>BGCH-u.Hk_HL/`i`k.zyk1hDZMج9hHdtC-4J~.@+V7Ɇ9CMIclF3 y+UGD58ҮP"k*.},HH^pXkO .MYaN\ñRkx9C8BlPCR0.TB n"ʭym=@85T[/+ P,B;8@H8-62PDF2|@y/2)Mt.jʜ87h>0.X/6+ƆxƁ70= =ATR. ׳i /s9C荩9>DϚجk=|*|@OEƢjX."2Gͥ!Y=䍓} @68+4BA>=@EA qYWL°1e܅b!I"{]ʘ\H`G>E? VT61ܾlv -N A2y'0('E°G)١ܸY /\P{!nԽW@,Ӳ u.1#CF }x[ߚm:4VD!F*CJ6|FGoKҙ3PSeGsOpKjs_O)gD ~Zt4O%JR:Q LH GwuTԳ 2 A5 xL _iH=FxtةuYkc&H !.ΟC+MD`bl/:<:%=hשബ@q2DC6k6#4"&gw{6UH5\ }֕~.w۲I9u;ˉHJta BJ@MџCdC*BtGÊp @T|7w7X=2/E`z\^HΪbkȵ.}N%e:J8A @ 0o$ F}lKssX6wi/Pt_[d1\8tU2h@] ) (" ,aÁ`&z,\28lFc1FC B*A$8B kzAl4ž^WovʛmI&XB|4gC6Xπ ;;? 4xaB 6tbD!׮>~ šdH -eJ+Yt&?lhִygN5AZ7ß5qv>TREX0h.+ڸ,Wvdg g;-ň^l~%Y˃ G𕦳0'UaA,)v:|GDsx?d7< ?ngc&zk,.%ɶ - 5ܐ-꨷~3ɟT\ѥ&|v#-0zdq* 9gGx*Gz1J<*,QK4qKRdL]4\͚0M(:/ q/E:128 =61Q|H%5.ETD?} A )5vIUAƝlFsUȷp5MtMJJbOM?tLO,UZuvikXy֎ rę maHtG۝āW'cݗ~kCKe4PgWVZfdž)#--b)zsGݩsxn"ٴzP0iZY8ئ{ߜuޙT*`CY:]BqQƙUљZigkx׬^z͙8keL'R-ܺIWXgʦ'dw*&tևk҅7ǾVmUqU2Y=ZFzQt&rΧp} h'ăq}q;Z^T=޻I-;ޫ'-})o{}%}ƷU)&0G2^ =gq #z.ec'F6: ^XjB^NPBGd21e[Ʊ(xx66U݌&C\u=c; Lh|/+vav QQJU^GAC,R(UFx "+^EevHE'0NtQO52G?6-b2z[VIA\s 5k 80۱e1ުw*TR2ZX_Z0cHo~A'CrE ]^.L*p4 D=2d(wH~aӀUX D5pZ8Bt$g[_Fѽ󒖭I1Rq@ H@R iwHha\ll | h@cZ3t,bc^@,`Vb&WśRU Hrn/ D\<ihb#>|c04P>t['rr8vHȃlritb3$`@~ ^!bJuAA A !MuZZttC[Kt! ]ה^ufDM!&:p̝X4fbx@ !  fU0`!2R9+)bURBɘ*>& 4 nJaSs踊 2ppBKѠ`K 0tL@kmAUZ`Z3kA$T] lC'2nVr!^oW^wDRT@;Ӂ( 3_Ϭ#0Zb@2`ir$[Tz2 Hf@':.kAT@ G4.WˡРT5U l!lBC?tra 9U WLan7YowgSU%j E3Ugs*tqi"v,\Fgi6Ws^+&nj$@CPXjk @ravk'J` (nn$0@oBK jA\(}z b{L?:B|@rm~_~SbuvQ7e&Ǯ3 nQ h"nvub΃ MO4ui Ap l Z4[MAnô jl ‹ k4YH~RMN|z#oơ[b"|ܫ"->> a.p>=("@IT ظ$d y b n̵ȵv9M9zanumAt!ɕa[˗lABU9ɵLmD7eUפ #04=<B'i+<ơ 7:bPHa; ,p 0&KA@ TA @C6C'39֮7Can{կ瀮Z v !j䦅&_m+}D5! LCK!/a#9a!> z5 f:s{C6{$ȸ{Pt;C4۸F"};NBZ;6xB_?-ۻ#ź_Mۼ{N› %[DHdd&w"[%&۾C;,YZfV&tBrȞ[B(&RVd2f$Zr`s(W#VG=;~]3l y \Zt(rE)s5Q&"!aGAI\?a++{Z~Grx5% !V}š&;d4vȲ|j!@A"ݟ\aAN-{`&$+ ~תA*j-lmA՝1 "w:rI<25sHWO|v"0 4@Q ǜ$@-RE!TM$x.5Qqf@МJpADO&66A~L0v z%]x7\t-m `bQ~<] [*!= M@@d6_"^qͅ{[+y@u}-A%V% ֤݇"Hb&(!~+W!SeHc6ވc:o-x!q0;dJ.${=RpAGF6eZn%O,ah\VS=4`n grJ,bfR=R%&l&x0='#̜NJiOutgyi>Օ# M8"E:dO0'2GkhgJm)f%z::t2|ts0 n^R?[lPdž&nQL>z܁*:jb.X w8pLîO1hPL1m#0$$<ܱ+:Hp>MiO% 0t:''""lrh_^n̮ 7|"ҁ31Z?f\sda3j|cH+ʹ\ ZÕjჭD ypl ],:Zl*ЁGD+w,?`]׳JJ$:~^hP@d?B磰s*&-f8Iip?\Ӟ?$ߚa׊@ЩyksDXn?3tCF;r;L ;| Tz@@$P*c~JwnjT\g1b+āD$ jk :(JNӛ IOź7^8T'^ehT8ګ5cuBb<@p[Jhe$.#ޡX3|q-<"'s@5|#e!0%G̀n$==)O9D 5/c:mJhNmu^F0IP&qa fKz0edUKx#,(uTsQ@&h1mSPgZ'!$3!@ 鐝 mhMy;VVH`lP0}GSQxgsҔt,U)32hMoSC*) f:iNԤhSZJuTUT,2*U ְuRY%U \%W ׸uU=]uV<{z+] +w-,򪩽ғcQtK;vZz\lR:+cc!@ʖc K=VڴmN;FɂEmZRrvB9pw.Zf`7ROŰbϥt#-R1t(@Ksԛ֊Pf  ڳXٱ,8q~ mz$~Π2aVB)8S1ANX ;CRQ텷 A o[t T|bvoؽ8t<|:F"q.whQߝxʶWY7e7i?n|AšSs7˞Ŋh}|20 9 .v[HVȤ~/gdN7S1#Ƨ8>é6S}[Y~2t^zYy@[_ @xww"ց QP h QG15w l;o)Q5@Txm`шD`&7z_4M' paEb Y6l hxp up 0q pek_ bEZ@Xi}Bf nLX] ԑtVhG \tFݷeI#['Gc[eEqaquak 'ЂG-a~G pm0Z5 q; ׀ pv5`EYWqa` @ @@H4ZFS pP p@IT@8{5aPc h \0 P 0ʐt 1h `Oy['j`y"h $7TDjD36JteWuiekņ_ԡ^eD|dhz땘pP 0l$  @Pzz@,kY(Љw`hʠ" )dw(:(pld[ptziud/X QexR`|;X>Xx[l~Ro[GaEb܂ZY&q.kVwl K8#مg1*al>^*e55WKWawOؐ)0Ő^Vf_[?&v(5Ղæ^ZRUP'eW[uxs6l:k2{U%yJW)e}<8=lEnê=k؀R&0eEyxb̩@(v\Jfea)`{ga,hēl_@( i{R~ ?\|=B+yʠe,]Cɚe?Zklf\RgҌg|:F}Sݜµs~|ǐF -%X9A̳4Řǘʐ7T&p{f]֌ff͘CMCQl[x 5f )$Z;€Izt/L&P WY[}Tb(U.A/Memgd aYP|q-sMumwy{} ؁-؃M؅m؇؉؋{M.!Ri9 eiٟٛٝ ڡ-ڣMڥmڧکګڭگ ۬m ^/1V1c1սۿ -]ͨ52 -U5" 4--MM} ߋ6mmJߛt]2Dn .NnT1DB!N%^ #n)+/>F 3N659(2=))>B#E~+>C^>~BJ9'ngAO>Q.AH1߆D5>b3Dg8T4~2burDx^Xwy~{>!52Z躲.BqDsqp@w#N)N9sQBld">)2d ꮮ8 !.r{t;ƤH>1.P˲=퀣G:20H0 ,a P<)tuqC q0Q@3.97J5b).~ R;]84~NoO wI14wPF`>COEoѮ>R0v!ƄZC#,'2:ѣ"acg&B[9q/sOuowy{&\l$R`/_?H~#?㗯₯ojOި/N n ,A= ׏+?O#O pOIn w0al6l DP„=Q":-^(QF=~RH%MDRJ-]SL5?c]N=}s$HpE>]P$Fm^ŚUV]~VW=E u!(.ѣ'W_vfNm;_ (: AQ 2_T0@$@KHn4:N;"z !53鹀kbغAڌ>#gFoq%:k«록ﹺ:RH#QCCCKKKSSS[[[ADbEIeILfKNhNQiQTjVYmX[nCbCHdFKeKPgOPgPTiTXkW\m\lCCmHGnKKoQPpONpPNpSSrXWr[[t`_fffanakkkcesghtjkuooxdpdhrgktkopxtddvjjxnntttrsyuxuwx|yss|||gl[gg[Y H@~\ȰÇ#Dċ RLe1Ǐ7ɓE"R%K0OGS֖U7LXa?d3WP`C:iմҧ8]5S+Ll0̆-{֮ޢ5j;p o./˶m_> ֿW1eM1+~EhDY.ҡnlwu\['Ֆj#ve@pA{fȍ3v{ǯҺj3s?>\lZ5=xT;;0,x: q>jGCtڵRc= +s`܃ps@ ޕWաm;p|g*"Q(!M,8`=xH@JBi`܆AqR%刪8$!bq#iÔ1!s5zEZSlbe|0=:`6 pݨW(sYʆ" _'rsPfE0'qơ:kWR*lxJcy+q|jlE!kw~s0KI.[)c[X) ʧiZn-.\tVKM,:/o9.h^gM*+=dD}IhQlrBrnJNT\ jla^*_mY- l |`>ɛ ߰>`0OkR,RPQ) Xq 1 ]3Z JM.7Y Q؊]hvȚ>f%j|OFQ `i+(%b&@>'NNCR<7ѐcns/^T,PBPT?5%ȁh@V[(LS K&Brs$I@vHU$HQb:q1ev`)ۍid~-pCkS$C{qPV.2#Ŝp1^TŹČ$E6~*ƆD^:X@B?Hyf<ؕ0,D>HeDBu̒JI%IBM?إdǘO4ںz{ZdՏ`ʅ|PA&PAN# qʇr,#gG{uBќ7Om֓6 >Qq2TY+ #_>YPZDwWQz^4B5ؕq-J xؔ|&Z\>/Cg4L>Ԋɘo&Q&x}VTHhncU@ W؄A `JU)\ ˆJs%Z+T-: h"G8 Ǝ7s6xGRoTN.ȥ7UƷħ \` + okk;un&G:bwVp1II Ec{ep,j_pZZmjn<֦ye )-IF:\b=W 87\FZ@fΔFg'%rqbeN󗵬=u4Qwyڨ3lC/w^4ϼ7i"}L#5Cz3,CŬft:s{#zH(EB@ŷxAG7N;* rw.z rxV'8f88tWX-@E 8|Dc &g|T=g#уZX,& >@X7e8{0Ȇ?qr/tc%c(x.zGцRz!\X6^,H|8|'*G=@7 hq؈(|ATah1#{7M=WHH@ŷ D0ȉ0A@GWܦy☎긎؎8Xx؏9Yy ِ9Yyհo "9$Y&y(*Ƒ04 3Y8ik9`œ>l?S&DI7YHmI& G #ǔ\WFЕF0EPN h FP& ̗S(A^XB'*XaO RD    ` B\0hYvf K#d "X)'W_MXvWptKD ]Dj ^l0 h ]* 4w8Tbm&#IE("Z/Wt_ 9&5frSs%Y@y="vr${2E<]It \@`  R}ƀz`'^(X7 ]h GОKT~i 3 ATg1iqsz嘠@  DPpPщ СCN(EI G#r.J*Ǒ Y2 ::M~/է|g%ERG''Tz=dbM`^ ` @Թd:9cLDpʈ.x:#ڀd^x91Y`|Jxr):RÊFz!a4*E3tBl bzl@@~#JX#rwʃU(}(*3|[RGAٮs *5Tsɩ@eA Aj ^B8r2`''>'4m, BEyx@P}BHKwhX=7%:"Ds)*ik_ZllKf I]8ˈ_88%v=PA{zB:4'GM{e$XzZ{{WLX|Sr:\ǶR +!+ e;O+_' ]0 E m1竀t&u]A`1JFnwꛠ۾˔;IY@; LwI,(ؿF pH܎k)7XD픝%5Ԃ0RN0i0X(#. L9=gse "*ΰkCA8:N+2xJ\ؿ ;;'5R|@ OjH> I0UT:bd*'P;8Z(LD\;Gǟ'9ײ}3T7| UV |@~{i7x[Ђ,:%?1ꗺB GƬi+~],m ~ȝepb=a"|p-q]%pNg ܌^ I-^ ,bj}:gٓ NPp= } m<Pft Žv|gݳx>۝顎>XꦎLxY ,mాxlp"@ь~!G_+R x.A1 ~7!{0Z-Q yJX@^x{{' &Y*9>^ Nշ UΧ$z}e{׿B|P{>X:=,vLi\_^lY lUְ8Pd) A  /N< 8P?U fP*ps#l̗AUS O0`*/@+,@!ܟ"D _R"qDw1IXpBczt7 k0ke0fkp34@8`PUdPr WPןѿI:$ߤYx%7llggll<Yg;ggd*kk*efk/.OO-0kl8/QQ/l-*WXO[;>Ǚ-柢I} |% @>rlC_c)tC]$Ns*TWpC-Q 14VXtlTF( 74ގ<@U;uQR@XIRIZ]!IFPDU E ndPYIEN%DpݰЌ T - n2SC,60SgOe 6& )X dQ YװDKOV]8詨80ڼz[PD{A5&8bbt1+q#[mu8[#/z#fG$e"W9 /ɱK ҈JdJLė N@8`l3 &m;/-ŊЌDNe5"aMqsXA l*4NTQSoj<1yj̧eީ~'@JЂBMBЅ:lSxCk2C9!It([`[ xVd*&6VSLQ ͢ !83M*jzEV*Z Pt )Y5\5;xdD'de - <8@0,-sR_ǚGV-5[+"? p@ H" V̖`J 2 1`q*@<\#H3}B ;) M"N R6<#rm)s8"%Ar˭U+6L@'6pĢB`@D_k1uyMn@%i .&nzTG&)I˃N.qKDx|,ۇA8)P[IOك`§o!6bl`@;.IpB fBt믒_u)mݍ,bI \jMuR]G)iK|⏐8)Y1^>P/V7B1\ f<,LsEKN4H6 H! #L=r{Pd&]6Ӊ@80vDbNL/q֎y-#w&(54!+(s'MV4Yf!"N l.@:gu   ˊRC}s/&|;i wc!1f:8!/WJ=AMlT+ELT trckI|ͥuSWx|WѳjpSCϽ\*ӽ)>(Џ: =BP Qh}QOsrہ`8 +G e~( R s >@y3 gW~6 O05&TS >3bE} #4y8nSLS8qtFUyVdVVV5V57 +@5PO@5=:91W8~p8h13`0bR:}5pWf8TX" -`'z`ƒ\9EpS]@f Sr' 0\ tvC2 uӱ// ! 10-İ}l"cX}l`03+(X/( g?s7%hG+j)7y2y x+;.[лƛႼۼ¼[B@D@Ԡ} ؋ zZMf7-er RMy; # c`p,` X XlV U>Uj4lj[Pzs L:Ub&Z5; ۄHgj@9&+%`0 jJP(h aGzJAU%0^;ýÄ*2&'6mZg!! lY`b`ZkQ8Z@liu*5@z%wkCV w 8bL -#cipgcl>k7;9IaĻɳSɱ8(6Ek@m,Z{8msX?z5g ?K iWBG?[@%ʁwxg'pO6.hxCA{+@BG̜Pm BTS]X=Y )7/Axܛ@~Pչ'N"R=KxpPh ۄ m§5I{H$ R0́ 70zgӎ@{U%TL[S5utXc i8#qe 'Q@6P4\e Gdpzàz(<]!#3Hf@˵%``\ ٶ O3^M"-`l@*OqRQWY" '=ݺzpq"hAPa'1`2&Sc_ (Y1 0L  /0ðn|(| T j1q|ɭa'UvBؓM"ӱ,P-!'py"4zBamC6=5K{:m]4LbӶ8 /@ 1>zk'1hz. R,0c?? *DHFdIRCrST)\?T'9]`O-]fi߀lnIrt_x_~?_?_{?_uk?7/xDo4t $O]&?/e%+_@r{eC.TMpQ (\2.49Yllgg<[[l;=lYgl̑ۙY=>lg[= @ҵ z =#JHŋ!P`G< رR3RR#q{AËguF6ӓrvO|ߒ@>zzb]WiVh" vILh(&0V" h8N$/gY9)䐮HCF_IPFIɁFY$\v ɁrC|^f t>%ri矀.o!, $$$+++333;;;"*u+4y4<}]bh c h j fikp m"n!%q%+s+.x.0u.2u23y38{7;z;9@@|>DDDKKKTTT[[[D~Dccckkksss{{{>DDLLSRSS\[bbhheehgllpossuuxwxx||}!$"(&+)0.101.5386<;@>DBHFLJNLQNPNTRXV[Z`_cbhgkinmpntsyw{z3 ѥ*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ I͛8sɳϟ@jt LH*]ʴӧPJ]Ih̩XjʵWuKٳhӖfUʝKݻ5˷U:xSz4È+ׯEqwp‹3k̹sƐC?|]01{^ͺkנEKڤiT'Dm"7a&u,қ#'#5n qtw<.:x߼IP /zfTHD]p( {%xE"0 -u Bw}'#oI%ywn\ $xTt Kuь%12…n x P%&@҄pG%Q$9B.Nɔ*AP2Ɨ )' 9wI_'IЎ x #"(04x=ZyіF"#F%(A.tΙh`hv.$Ic'2hJ=etje$J #e̊M>ɦ:]~^#fLj%IЦ^niQ|uI *`J~(Nh.,B%8 I騹"ۆmzPzh :P{* PhXHzBXaqsoljnJ3`(pHP"P); ($:Wȳ!#p\Y),$.lZ_N AY%'`P&e%K N {h hvu]%\ P&!f V!&("; 1NH+;nfTh#tao$}I_ }G1ۅ^/BXGRw~%H=~<#JRjlÑoPqD7ЂTbFR.q<1! (Z0]:EPeSDB8.(0\ hcܞWS|TUmX*G0r !o3EcD<+DjI/`XWuO:SgHVH'$Cqy!i~SNPjX#LAňIʱ_ PƷ\y4"WBPSwrC_=pP_#,#- #A$2'@m^J>I4BvE<<ֺ$+9C q)r{#4$ձ0j/JMz3c6 yˈ)#']BZFO@KU$OruD봣3BQ&(0+UP# * ɷf+VQ(NDPa |&42MІ8C`.k OzS H;GL^`Twx(`<_CtA'śBW6F"CH%FGe^R=*9+F!z i9.KjgO. $i2s81:԰xTio/a-78FʽDiTV6#wї@:Lսּ򌃂,x[p)!k&TˑvE;H`%T*Pm#hJYp$#zήU?iB/ưsC._ t+o[c &b ba ܀jct\@ӯrF %,9}Ca, EL6q^ I407b`5KKD(ǝBXVM?I9POYm$ɑ;ud4 q6FZF<$ ,ni~ X6VBTRuF^kb2yH)aoƩqy(dEَ?qlfif&7AwdﴴV mmH4L`AIJ|$  F\i݀ Vt:<:!PD2:( L!MDVr<"/ t]Ŝ7ynoD.!A2 o2)j"tPR'X_ɯ!Z;ųY$AkOTT = eiVvdDr:vFug3(ϼeGO'%,jIW?[gOϽw1FO뽗`ЏO[Ͼ{OOɯϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X}?z'8iB8DH@؃EwJ؄NzGzO8T؄9H8LX\؄@h`wu/wWKykhw׆}xteG*҇~8XxXE2Gf$a8'' xx' ?}8tHȉq8w(8`Hv SτcxX،(Hӈh!}hx8wE#hϨB3HxeBWiHt! C @/ q%'qrpxFEa h'lau%hh(Bo pE8#o !G$ID 'MBVqH;:#yoo 9|(pXo\ٕ핕VQ_F\_8옑8vkILB?*Qy@=Ɇ,ٗwqTN'9/C䓈 7IpFLjX J6Qi]JYq YR 4ɖVvzs^y p"V iH3|ѵE!`H!`?M6ɚACFTPI2D)VZuPC4D~-^MKIHge.2[I!`l$Q%`;g%Pɘ)to Vy /1o_ٙ/qo @/ouQ# d @_VQ"x k9a_g3Dz6 @`A9Xo7ԝqCtt/a01,wgtbꔀ9!j (-+agj)Vwt@cѦ.EdCi ڕ l tʕ $Z\Yj!#ZWUo0Mz5zr8R8Zb.y3xHj6V_4Z?M8!!!70q;Y Q CSJJ GDlu c@:3s#hG/tFd`@n_t ij1*wA{bfBW!!j6$r)/qy ?C4ޚEjŴ<7)G䙭8F+3D_[I19g{0q1:9h_'PN9脮Po@?B @;j\$@J;pn }ZO#8H +1k[gJگK,}(ދÈ&ÔDMމNF͗DNXk(W*.LN~VT.9~Y5_N>\ko~/lA~%p~I`{>^t86=X)}@s|NvxH zhcc~ꮎ?j铘JN]O뼞ŽQ8WynM>^~؞ھ>^~ɑb>^~?_ 9H?_?r&(*,.0}|68{3}<>@x#?}=FH/VCOIN׍^ VX?RT_EY`N|Hbh9A}}prxN]~O|o_8χ?_i/? _??_ȟ~bsB^"ؿ̟n}lt /wY͡ ~[ Ʉ@F+C \XE5nG!E$YI)UdK1ej&H9o&ӧE7Ct\0S\bD@A(OYnWaŎUYfH;ɮPF"D9a:ވ P "e_"N'AʇrI[uUXX/HL7̓0ܳ00؉Pj`VhvZf[,ҽ.5΄$=@V+Qjw^z96x,W Xr͌'2*,1*Db4^+x{yxUc:(-!b7Vye̸ecy_fsֹUwgVg6h":ivizjZjz띱kîk6lQcvm1Ɇ{nNn{oo 7pG|q?JHu|rWr3wr;k?}tC'tԁ6]Huc}vkvs}w{w~x7xW~ywyc c~{{|7|W}w}~[rZceP$` x@&P dI5 `-xA fP`ZMxBP+da DG%ta mxCP;< A"CѐC$bxD$ЇbD(FQSbŷD4GObE0фXoE1QkdcGF{Pr %04r#PC-E{&@& 7&R4"7bƑPb v@Fa x%\p$q{JS@p>F2}ne-E%($a=R 0JyLd&Ӏ٦>x@j@wx F A ɏR{uxCBJ!@+{DdJ Gvro<LFTcfF Y!zAlP#ޤ F F8gET:(8#٫\NΎ@#pbV3bDPȸ _ԡ/Lu!/daӿd" 1zgk_emaC)b`-$(g.6gB+d $9̞8XGBAe6787sƒ"+sD B ȞHNE]ԞOP)4"8b+:{EHB!["]F]9E86,#<[Ee$+h'25v5 ;l$l/\R׉8op0([-{H,(:X"&Q)ͻ=k<(vH$AA&> JC: E%T#J4*kJ JJJ#$J$HKBª,K\KJn\HqdKD?LKNh R1U@-%?R J3*S1Q5Q tIbS?";-< SC@%A b:pO֎N@^2C&%1#$Ύ>יh52 ð{3.[bY 539:@ ( @?0*<ťcǵۀaijfnngffq>!fGe{600@toJ" UeᏀf0a~h68G(y& }N?uF s3i*h[\)-)h(&9'i'>>^^b**4 rDa1D8fCsC< h~:0@闶hEGK(-؂2ނ-/iE`&@EP^BhEiğ`.d|o WڭF axļJ:ђ-]=3yCH&X&xK((2hi(H3(hfn^nFli8l3W3s2DD]f0BR+yț:2+ YXKPKPK@mK.V0lf3VZ;+o!`(3(ΫN6/o*쁸4 +YUU nn&'h.`D8 p@ p*Ul9WYnYUIq&(S *Oh>5~q9C"QƥK(x6gUaD0B8&Ki_Ĩ!O T˹&H(TD@ש0?FXAʧ8H8Ke>06D &`DXCh0`s4*gCpF:W3!Yo1H@1.<)Ij;B;[ CUɻQo -1v LB<w'h(5X&x\-wxDB|'QvvHfJI>\e7'6>אX%P"|AH |@( n|&-bƞ٪-Ђ>s DZJ5Ȗq/-ht`dX΍,@N5 ~\*h „ 2l!Ĉ'Rh"ƌ7r#Ȑd*i$ʔudeKF)gҬi&Μ:w#ra% w⠁xƄHnN}Sp A^*щV/8[%\T "JTP0 :$ +ȏ@?'Sl2̚7s$ϓ+[4Ԫu\T4_ګk/(AFg# `ٹ z5ȡ@%ԷH=ӯo?>hԣYn?eoS[v moY] k UApd il @\!@(HA5H%$( ^ P^?Ax) ADm" wQJ9%UZYQ~L %_hY$ RuPB P@?(\H(4RYI# PGQ-ĝأ]:*PA$F\  \0 q\җ=xJt^y++eږ&Ţ6eop4snao˞@R2BAm&@ `Am!A]D@D.AP cu  @dA~+ +0S]k,ׄe.A\ /1B$c @# 4! |39;EL -t;/LF+4MSٳN?64/a5]{9Ite5i6=7W}7yFoLt |~8≯Mi+>9[05999I 1ܦ% ȗ™Ӵy}u,q w0C(D?|:ɻ;o BtO3?~"%u`J!B Z mBPA`?AiE#8| ~kD @̟?vt8,Ep%PPGA:u%(H .pLG:h^fҼ.~iK5c%Ї7rV#N $8 u@% R&+!aȣ@9uTюㄎRP^Pe|>G0 Ah# N%HՀc|F¨I}d,cf ` Y&h% $R* J N6G+ WrA%(0AS,@VjO((@sɂ,*֠# F $pa2x|i:4c*SH%c&̘ pP/ #tOC'BٕV =c9'q4u!9?^H9hxDueK%* /`FtHp O3=,bRSPhritH %@D"(5HTtG)A$S $#d*JA~#Tx(T+q"Z9֠-`G @$ ׂzЗ93 5%_\In I#x-#L5eQuKlԖ*";8: tep*F%]A1K(%AL/vAұA"/>!a,CArHGe UElS 4%сu%@]pRhHU=- bAd"3D۵AAb@_cA <\A$BGOj55:DH ^ HAEEB"B`Е%T]!4(>d3D%H9C }Z^4fF$DBZ X$P8M 0s " @Q!%\0B ĉ#Փ!eU% 2ZBVv#<heh/]]A"d%u%L(R_$(HA"ׅ !lA" k'򓭬%wNF[CrpRD rl% T0¤EXpn`X,rP&'Q1D5a @EA!Di>ebA"HQA-e䉎bCLwH|'xx>ijUD6D[dgt$OHXX]^訕~Mh蕂|frٌIfq$)JiԩiĹiᩀx)*Nĝ*.jf* Nj9꣆ZXA# ]jjde8HC<X*fenhRȆ XQTRA߅JK8#TdJBh@(K&{jm+?tj`m|A `$qrrX,-p1)Qt],θD& E9%J9:lŇE`PVXUkL\\ 0.#%@|@ xT/,ֶnD^U8X<,#𬫾\EDHQƂd-izfl!HdnDoA$b"YVeO-a( 0Q@]]1AH [nl!JأDJ֙akfDZpQԁ (J ġetD?11^jJɐZ+\ JQ'E }2YL226^|P^"(A%D92BJk$k,US R) l:=X0m| 쉔2 K4s0%1.2? ˾<5B 'YfbY-܂lܜ&CA%|UN!FATs3sr5qT}F庪C2RhUTbN^ٺt6~V U9Htpn8.eHnO`>DTe+N 0.[xgqu#AFxA4S_I+P1.͑e &P.0 @%`=E``n)BXBl"+Y]i^r[^ʯY oY=q*MF x&^Țu]n2Dkili^wOD iwHh[xxiyw[7w|A[iw8|4)܁#OSO#TgxWk8댂燇7̈ey ޳x.g ҭ6CqFGH7P)sF5D9B1BAwCDPC#Sc~S \f1GT#8B,BLAC4?ccMNb Blrr,soP %e[ ޘ_"4_\0Q*BAjVB Uyy^0 9Oq` 5,7 j9133Uś9b>nH`BXO|zDX33~%VvxZz]0Xz bAӬ9mg0@;XEF WB.OJMQ%\+*/Z(_R>cUbû{]0o@zLL;zVEnAX66n!=1!8)>)Bh$D_dmhlɟ-YvDo6*m8B(˷p{2Euϗ)X\fCaAkvDM]D@-.Y2p )VxcF9vdH#I4yeJ+YH'SL3i֬'H;s2hPC5zt&w65"ԧ,Fj$/q-RH.5{mZkٶu%Hgٴ']{54n` 6|qbŋk'ޜ~)W|0c# tܙfѣI6}uiz!9rlٱ36YNnݹxpIZ2˙MztөW8R䯕7=ɗ7G[ >|׷F߻ @<U#F(N=1IeBR(AA]V5&RKR@t\uLd[wb1W`?fYJPYZ]jMp?6nVt \צeם^33P~U1:J6_ ^~%-5ޘ=EMnx߁]~e暫%uޙ}p袍>餕r襝~ꨥ覩묵ޚ쨿.^men.y7K=\Awr ?{ƳZȱV d%KpЃfFs>_e#mBܔ(vd|+xy{y?>Kt?]K#G_*/y7֞~LXF@('t'XE+I} /{a: A @ @hN,fBbc4/ƇFCl+c& `:&AJL(Tw96pCz|V 9DbuKI5E@2q#F E\PX*^&ʏ a~JŔ"ψH(N@P wLY(JўU %8 qFDh @(dhāꑓ|4~Ђ~4HeR]sj$JA$RF /i\:Ԧ9AVS>?js,b45>AER+3lb"E;*ST^.?4ѩRXUZV:*OV+|\irիs+]8B]֋n%Xy`b[YV ed~]5{XDR6U2KZr\]li ֺv6jmyے֤9moXrB;\ݢѕP J.t]̍FdJ&z[w̻靮]KMDBpp^VI fDD0Mտ !, ###+++111;;;zCCCKKKRRR[[[ccckkkqqq{{{,90<6B:E?KEPITMXNXT]Wa`jcljssz  ##))$$-,3344::==@?@>CCIICBMLRRUUXV[[[[`_ddjjmmpnrrus|{~}{!&!*%-(/*1,1-5195=8A7tzAlȝoF@,l܁@ީl0`lFFchLG ldkJՉ7۶BmHf,CFj=LцtT^ 9ˆĢ!*݉93諓jzK )9-.GFy8ˏaY, KGN눑.5 l >t5i,"\bkd!PdCz9rF_B8TTZ, F6zPbz{Id `@ cl0P Jv( , (@(r׮wh0"F@CY+jDǥI5FB*(*lH&,F':4->pkCp +"Ra?ME4X.q6I( %}zpؤ@2.) Fˆ -1y MfHLcǠMt# nxfɏ0nG)$͞>DZQ, (40+b0!l2> =)U( v(4Uȏ7Bbk)P&-g$դL;өtw!"Se;*,aAVdCr˸`]BNJ34٧UJh(\ʸ9ogÂ-L#xdySeF,GXs ߫蠀*U20<4e,7\!Rwk$qմ(+d|9R ]Y7Dsz;HzLJ#pcQdN73 +(E>n !)՝D($>|Oc 9̮MYGOzAyJ̻<ѳ=b1zl~#uO?3c~{eǏ+/{?)aQODyo%OϿŷ~. ؀8Xx؁ "8$X&x(*w0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆nP~Prt8vx|؇~ȇy({8vWN~hX~Ȉo؉6zh;g}Q|Q.(h!+؋8XX $*|b؅(H {R|xx(ǍmF0cHgzߨb㈏tH0X (uHX?( )Fw1&pQ}g]*YK$)4N8E Y!Y}b>yY~RՍ@i~?NdlV1 7{V]8y2ɐdXnr2u;r9i a?  P;`}K4 gFGْTiS3rv}I P8G^ *r)Ea"`(/)+iɐ [cc% )w=ly)(/u| ٔi!vm@ٚF1 0q \: SjO/rYs YcwCaӄwx Y*ɗ7EhEAFP@EaqK͙ P Н/QCzXal %R;2'3 @@"rk|Qy)/k ڞ!j pr J Q ЧY`#L8  0a3:WڞD)tOVFgr)Sjw)9i7ʆ9*9/G; DK;&Fc"@*tjWmņ t pPZi( _wYeʭ!ɀ((jojYD3Y+'Y *2sZRy'[(zڝޱAJE U:0 8p\s#=Vo) rjS:NTs V2*Y/> 1{Y 7:T(nН, Ck0isWB: $6:J0*c)/7/wbaZyFIs wE"":Ph0`PeFU  (% 0*' 0  d K!z}uʣօA": L+V/qkR8 tjyyGAȱ p PjENJKTZAyzvqzfj ii(^/mjٴar9 컀;X+kmEqgSY9WD+E$rz P* 9HvTqNmkda{0l|ǟO4PFD dKڴ˖k!/q*~/W~Fz(L#Ĥx+M~;lYgvP,wrӑYΊEڴj{ne(,µ"&)551ۃ>ܴN]ȡhWVE(9SY̻6ɰ}1 ŷ]Trc{hBUpAfYϑ<w Ӫ<și %qf|̦#ʚPw`zgsw63Lckpz(-<' /10 K'ǰ$Ԕ7+Tp+AHZ l<% lBjq6.뮼kFKjw{MI8'яl\lkF (o9hs˓{&\z ٚO3 Më80w>MN,..qpt  slj=/Ed*C[ls{jd] aMceh ֯ b#[ʻKG9؄r_Trk ^ (d{. kbA;Y1 (1 U*ñ2]ՙm|j DiE,PtD{9Etn]v 2]n T&⋳`68MwZOkLVa{^z#b)_PyG(+HxzPyz/Jw`ZC^Rgǚ5wפ>nFAI'Y9̯b`~ ȟޏ idiͮ~ɞ'>"Il܎1^n3.^.._~Z)() >ώьو yx&=I#&h񈉄xx>@DvEhCP?{iT_VXZ\^`b?d_fhjlncbt_vxz|~߁b1N3Nbq?_?_6ԑ8I?_=Ngoy‘ş=ϑӟڿQ?? 矀?RY U0A .dC%NXE5nG!E$YI)UY0@YΤYM9uOA9)ХPI.eSQ$ZTYnW?¼YiծeVؘΥ[]y,:^&\-\2 /fc+Ue̙5/wgСEڹ2iԩUf-ҴֱeϦumܹuf|oذa4ΪN*'Os5tXpӍ6/90F{5/5!cs>0Ճq;5+FYl[p aY&=YÁ7<gڃ:ָIYTu?Wcen`FWbHe9({ H4i&Pi jƤxfϮ(\U&m 䖹C;->tZzSRY[S6|tOB;fTRWaby=g)tsNtw:=xgzxWWwy~z껓zz~5'|3?}k}㗟-~ҿmK lx@j d`Q@FP-xATB4Ab`F*PqBP+da ]BP3a mxCP;a}C QC$bxD$uW\:(FQSbxE,fQ[bE0Qc$cxF4Qkdc)*8Q{cG@R$d!4+x4d#HHFRd%-FDbD]a%=IPR$e) ɋl+4e+]JXR$*-ʭe/}K`ҖVtLd&Sdf38 ґE93yMlfS&ɰTs$g9y2vS"Ť1qRbTfY%'mXNTTgDؙb! *2b?$  "! nxN^T0E4>Xt Sa*:^P8  b[(LÖQq*_؎zX&I7x !x%"zBlda˅:?| L; <%`AIF X LjfqǕmG2i6t4u}(ܡ?p)= `R$*V/됥*$$'@FHzu r--i̽J'pǰ+hr_m4)2''N5`)qb}q IAf?; vB|mlV!}x:9.d JC| &7o;!ZLyoT-:`fxRLx$]tmGEIħXRg\kg=XXdC  1@/ VE-h)hu`nhC*P ! P3d@{PE5uǩpzfݶ?!y PNvHŪ[p쀊 U>m`]ae p ^4^=!m^E=B:~ $ϋ?1, ɂ<)  *bԹ ث6)B3@@ixx;-XZ|A? BXR?8ȶvQՊU;*B*(N[#{Y/,䭗"q:!\C6$"Dۊ<<3< (+z|3*6,DC7L#Uȃ,ccI*KD~.R`F6dHddN&If JdQ&MQ>-eFeVVO^P$@neV~ee+)5` IV*:3څZVeN5 H?LRbM-T&NsGfQfe/k6x"05x`Y)M9lLq&S6Xi`,P:q:䛎hQhA8AHtnIhNe78;`ͪ{NS/`&kfb \^p;is= Ddp:!8aCGH*) \9*rD!Ile ״Vߵ^$>ʎ§I1*VkgFO#GnlN%1i϶,*l>`^>K*\Bm֞$6֎}lEm b/1t#T1R枊N#):2R.H*X)&)2&06QVU=B/b//z2v5L:/MɭohN󭅬Bl5悒:*L.p```8`.P`J/00o`&0^NQ+'o \2Ȳ-K1 8j/@.c*= DaԺYj0yz!+71*Ba `(J+H2M)(pcx%(R/)R/O0X575A^R Q'Ss 82uo)ԉ~i[5aЄccȄa&c0SXk.a2opg$"U_Lhu}pkmit>TsNA"eO :'Ü+!S7uV&(u&})wP|u78K~>&Kxa/7o:p7޺}3ck=ᤱc0'S(R&T3r,Z2Ce>컴>٣V{:bz>Ʃt"! f׃I[A1a >/RXOQ1`+.X0Rh?XXMKRG,)${b3{eT#ARij ޤ\p[1`@ Y~/rJ*6UGVxT5 a"$w!jX~!&]O Y qbMTO,#A"!="$2pYxΓ>*ЁRC8.>-H%jғ38t 't$L+XG$WdFxOU8ՙC%?C0O:F*+ pOb4(&S6 j#xy@I<{PVD9`S`t Aa^]P `ԕPH*9P]@{9?< u[=xPF U`T[Dy af5a ""!m\a">"$NT1e8b$f&"Ze`bX208E'XG,x1'0F0,HC&bOt'Nn\VUAi%~dAG0ANQ14(T,0,(8/bF*UO@2zJ#XAxD)@W.43D8$LPm8T ʨJQΦ|!<@@xhVGԁZ1HP*< B @_5T(j&Gl|6rD0A%0%&CtA5'%G|tSxxGpt1t/-r(|YzD%GAd9*[H z!\(@TME4}E@@[,Kl[(UP.4R@TRT gp'hGtA4A@hA%1,Un#{BAGPT0>rD_&~Da@ځi(M^TecԁȚMH [G@ʡfbZE),A@4/pD/4\BHtA&xP'z1@t0`p-z&xBPgGg~F1'bFaH_KGJ8܃f*<_H`=OG,9H~P4c^z1TB7h~zG8^7b#T%G<`}&VE &H]D؁<ʚe_PϴG8@;!UDؔ1lفPePAGhtHG1T1 CTBGJ*~\[BD| Rpɧ@ĂdIT*}$,OtFN*4OB0DU, iU1p1B`1k,A),AТ`,B-ŏ^,>ApB0XR|$P/h1)xAx*/ΞS"ΫDG8&xI"iƂH*eQQމ$ U8@1P6"'@6NY{ncUj~1h*{n{r`6V'lc/x\'Z1L:HxRm dDOR D,KFP X 0OCNbE15/>/ܶ-5D+o&Co0['Co?0TFU0okKa.ā 7apu|W@hmInBZiaKd ii8PGdfLҤJU1bj In"@]#0(ϱbppї,ŋ \ \f=k lA itI&@%$X'OPU#h rӴ$ i ZzLם'i(h -( .d, ,0#(V.7gG&1f=YMqQGdBG0L 74'2\erQHEKɝ'9z 3ҳ\fLGX*K"`$$M 4McE8f# H XL^J>A*T\"Ȁ UI "s0 17:4[BBm8zׅ_*nQJfyjnرОbI+p+@Ō0( gM+ ` `i, ʂ +Lm[Wb\o;mmkvFSI7rDhh'swp qsW7;-/6uow~`'j7w7}x%w$a@z)S<+,D*87#7VU0UΉdt]TUliLcUz27/w!f[ SEh_UUwG#HУ" 1 /fqV7@M+GV1H^q]D,(L8OZEF땊DŽ\U,8G\eVO~&81z qы M^!!fl#;2$_G؁!rܗQm+mH˘DtNjtOw?rղ.Km&Gϳ7zl(0ܥSDUK Ô1FzArysCk3f3;'sƳ0c( 2 z03'G`HSzGG0Ĕ1L \GFFyt3۴\7GJD4G;{D:몂]K!`NNi 555T 5bӴAS?5D?LuU{9$CRrՠiEu ڥڱvHlŻm;oȘ")`^^ a۱.|a`52C!m5_oY0؁ᮎ{emb̂aī>fؾ*E?xGHlpbdc.hԢHb,nE&T3v0~#F^CW|c8Ĉ>ASG`ŠREPTy0m4ʎA4XbD5xbS9=B*0*SdJ+YtfL3iִygN)Q%hP2zh,K6ujTSq 8c",X16ec9`ֻbDej icvbàAY(W[`K13g|qrKX=y.e0/(hx\Д.`@+4jpÉ7~yr<Mz)өW.Uqڰ/n S9P@apk u ,~a xρ7Q` Žy5c1 :0"*+:)H*(m)Ψb c )H*Ȍ%t1FYb LX<$\&ꩺ砛%물˩#b&o!:+HED6IeaPǍ>d#:f cKt׍ŎNEa C *ƠbFS6h$U0#vl nNb8B%" 0 T$] 6gY|& |f<qЍa(c`$;ixo%X '-e P X8#x _<cpɠֲ>Ň*3pY> `Gk ,@>pPTE@䥵XKsth/L%:@+MLGtԅ cH:BT6b fQ=!K ɤJ>cxF0bXE+^/Tj>~X:XF3[J)F7^I.l[!ysF񍁼N[;T"HG>&~| Y&9HI:%T0IS'Qr)T,iYK["Lq%,yY0a˥첗$Lg>0P2%&Sy}Mo~tN5Elfr(:N3(<%u(E'yS:YPI?Fk]D)Z& CUQ~5hF5C!UJYjsb%e=R4/5)SFQ8PPN{mO!ܳQ3S.ua/U*VMUa)YUTzyE\j׬u$_WUU,[Wò dر>bpf9k=Y8VZӞUjYZ׾li[[ny[p[ 0eE\>ѕtkVv]bx[^Tn_^F;_o~_0x[ V_'ZIy1\a ?1$S8Qa(,NbͅV8b*sqcK7Ƣ(L3m:d'5Șa핿J-iV3,,fy93\g;͆52ǐY@Ёo/i] "SqgGS7vX@f :LbZɉnPDѩn:7'cʢ%|5㟬ۆث.c &8C E|ɸpi5$mo{IXP Jt L,i$qlo|? ;3$Ӏ$Cr.xSn܈ qxQňj1 "6$@a`[]_xz?_әnc ȣOU_{7B&uydޒ^0؁_o)Ļw>_X4Hw}U҅;Ѭ~S vaXFB?ȯ<  j ϰ7/4GApDWQ0Tg_0D/wtOb @p0vJP @D z J o\ Du%0 װit&$Ԑ 2O@/ q+ }0 w* !Z,  (((111888AAAIIIQQQYYYbbbjjjrrrzzz/;1=5A9E:F=ICOITMXNYR]Ycfogqjroxrz  #"%%('**('-,0/33;;54==BBFDHGKKNMPOPPUTXV[ZVV]\`_bbhgkkllpoppssxwzzut|zzü!% )$*%.)1-5296=9B=EAHEKGLIQMTRYV]Za^cafdifljpntrxv}{ց~؁ƄȌ˓ΖИНҢդ֭ڱ۵ބƒĆŋɌǎʏƐʔʗ˙ΟΠѤԬְٳٷۻ׃؅؈ڋڐܔݘݚޠߢ࡟।ᨦ⬫䱯䳲滺轼ݿ X *\ȰÇ#JHŋ3jȱǏ CIɓ(Cl2˗0cʜI͛8sb˅?{ JѣH*]dЄOJJիX7Rŵׯ`ÊUVQ=˶۷pTܒk˷߿ڵ9xd{ ^̸. Ӕ0ĉ!k̹sc2At2dӀ:,PUׯ lvj`l*nt-\YVuXcęcV!+;RH\5:S-uuK>;B=?G*y'xb5 4ЀuYDs8 džrJȤ@ r'PuTFs 4]4bLQ"!sF(4LRM#HE8@@=u8eIq09 y~ IFtֹeD)wg5džGIC"q ـ !hx]xiZ$bT(3 -2$yL=ZmzjHr8ҩbȫN8dQ2V *!řJfkvVjI׺ip$v$6>d@bpHLUl~NA) ZY rѨ)c/X#JW*6@4olQOq+3v1-J;`s<)rpMak)Tkԩfx(i47K8bŢ@nP;BK $˩dNGsuʩa+pQz!%@4BޒYSp4oJYݒ$>f¦LVҘ2*gE6M<@/:hިҊʈ; &2 | maёް4}ю%6d{LJG2dHP\ != }C`U+:0|PZ 8(G(d!+ &`{l &qOX7$ s(P|XCT% qH@fך?s!= K2q|V:*)cOB %X1Ąp(ҝ> $\a\#6NVs4sⰽVp tJ_!'s =iBz 90vT1`rRK.HiUnҒw^րNF!VqNK`r7T#2E椨hNEZc5emBtNv`&*z,Qm"SByR1,^{7!OO湢Rfs$bvw:V%S*riFgA $ Ҋ8ϫvpd 7nBNu).=`9uȆPoըcb2iQkEuPlVLͫ(:Rt!=5PU D b"p4#in# m*c&'b_B#dT2lNi0ރ˜Nk,f IJ#݆,gƐ`u%,`pִG E͜l7X!^ oi*mw@)5%;o9`l?oZsUfFjqh !aF_ԺIs$ t^Hi=Zdr\srQn[FBCbr$Ѳцgꡥ-a*-nfpP!d oqYM22\#ʪ+e0"YӗF<&bـQmdVȀ)CLc:eS)lc-5&oâBQ4uYV.[zA^+9!rs$Gő$t9<|3 ZDIiJ(RЍO9Ϣ$ A7&3˕Q7 穷}; ҐI1@ntz>k-[ @B85xxHJL؄NPR8TXVxXZ\C-`b1dXjlgui؆rHo q8x^Q%`z w8|rȇ]8csv|z8%Q؊8X7B!80\W8nhQpyH;͈m(ިXGHܘ`5Yql؎hᨏA-!(H帏r1 a(;A8Lz{y[`\PP'trZI2i ҉h-ٓט@ x37t Zsot1 ' Ql 0ZFPPZQ PFb a56IPJ'X) )t@u !ItzvzIR@khVF=4WP4w9w`.3 eJ !tqʐ6 ;p`W, `Ȱq t Ev);y ٗwPْ p qA`~|= \ɘ!)]Gp`q0:m?@EjᙨYpP ! ,U2`Pљ W#0PTocs &i AV;tsK˩|ɞtQ7#!'/$"5D1 JEc:Vz>*@Ȑ:^'EatDy`Y2q*YsQ4z!rd+*% %#H> !MF1 Z: W2Ѣ{:-t!Bz9s;UCk5 k}ek:#F uhX `+#{kKpttqpZPpKz٢ `멺 3KBl1bC `>I4/-2v1$pb 1{'"*cBu`@3dx)Y::$#9`VkptK q+i 0$\AK JGN%8$oSRpܱ@T?9.ZdAJ Q<)|٪ӫ?' ۞.2< >,gKeoD5+Ƨ"U5[Q˹1 @-$c.$1̒ \2D(ed9vlZYtoILv˹Ѡs*t@0S)q"JGk:1G\ĺ[ã8:ŝYWUi\4e7V@٩?flȘy6 rz#Av#m[LL.I'T 6G`رaqGF\F@QS #͞| !c| =K]SoTlŒv.?s:S{)JR;ܞ\ ͸% @4 #Ɔ v0zwqc[-1CLS3f pdȇKRp}IۃysYeYy{Ѥhq=y쾾nXjnb.螇О?_ JCZL?_ "?$_&(*,.02?4t1T<>@B?D_FHJ_CdR?T_VXZ\^`b?d_fhjjIPr?t_vxz|~x~D#CN_O-/__*̧?? (p_61?)ğB/ȿa__¿oO$XA .dC%NȰ24*ÈUE!E$YI)UdK1eΤYSŌ;~OA%ZQI ĉl#G<82;sH6M@VZYiծe+ӝm}oATuR v©Z"& cȑ%Ol#ܨ_ҵbǪZ‡/kرe&Vgf&9e_ Խa"sѥ1􊻫!kЀMՠt8+تb43pNÛ>pih`P;TpA6|H;VHZBkT [f .掓EcQꠊpF8k/Xc 4 pRG8P!`:4qK0tĬFj8G| 7Qq)䉳L@tЄL49|C ei`њtѷ>2aG uTRe4FDTQGݜ>9WM[+ A5T`S 3ѺQNn,m)3+_AÅ@GYfcd2ã72U1 80訋[qx\tկIo6;]B&`3X&SmʄM֦!;Cԏտ``6fKxcdXaIih80gVvivAjֺik{lUlV{mfmm{o&Jo|'ppwq*X+\q/|s3s:DEF3HH~`}Ɗl!=IPz1 Y$D@2/R4xhAWd&E?`iLoCw@*$!f7=8JjY -0PyW dx22a|H/NJd.S$~a'Ҕ*RQ!$fG=Qs!0Yz=P @4D) vy3ҡ;+PZl I!!.h4:bϩ`rZ-MW'EdX¯ HEF $ IUFw쐊}@RAXF~"UI#bҁB@"!@NwJ>9cZin9(9W|=K-@/f!F ?*Y-فhS0-O <_wq;F5R}?ہ* D>P׼y^WӬW ze]tt(t %z}P!|($M~  :c::p0]j4]4xh?V!7?ū-E,kEYabU`YыBHV2d!rA_81#s(ǎY m14~p@F*|q94d=Q;1*YQ5Fgh&ӦmH3@hjPp$Pe`Z z e:?Jtj|6׺ZjU(e4M).r2+pԨCsWX񌛙He}k0r Vgq}s.^ V,hy$w00uWcG <_"J/ڜ(i٨ʁx]s@ՉǤ1s2ȝ#{ahOVMf/;n~yQ!KNs~F3R+ߚnyقg{gי}{1{@X@h p}C;H{,2DC/}~Gn)\s0 @?@L@$S9@@ l?t @J@@5@ :)J $'Ao:$A@!8P0D0PB"| /(&I鑷$0'<778/J{Ig(B32/Vj"!4;L!4/qC"җah8*T˱B ;y LDQYD+ B5jDDܺ(k ;\4QHRE`4EA j2b]t+X(xkF&C9hFpAa .2;Z3ODACp H G6lG !qsi+ki}a=^}H@L 쳬#y_Ž|IF$I\@5ABɛIIJ,J-2J\̡LJJt JLÜd\"xJJD™$!P!8KDz\ |^º ˻Kb%8#AqĔ#(%"X/CpmL9,G :HM@a"0BCHMiJ'p$p NF+6 ^[xQLYpAI%#N4]tNY pENź5t%NOOO4|ApOLkFܜPnJ̅gX\#[g(D_\HIxP|P$ U X BQ#-A"8N̽:Qʅ`E+ S=RR81MS;"S0SH5L˝\K9S3dpS<ӠSFJ?TSSBMԟ3@BOy^PTJm"FG[p^TRK}L HIȁ\X-U[SuTLlLyB<DBpG0T0tUB_D[VAMdMל&ЁIh Ee-=[hN҅8QlWV9\}G FDQX0yNW(V}X V wR?R/Pxgx1lޟhRftJc+*a85Kg-Ȃ(-i_)}o6+],X[`71:XH&S莻a9bnl>S7@ +JjVgՄ4Xhbgci1Kh26@1Paf)Q+ꍶcT ʮخ.b0( cK,0;KÒ~0P.A1hipj-L+؂V,M(HgƄƿ.1D5|j@C"&}x18.(sNNLvN2bbPlq(Єؾٞ4 6{s-nB%h۱ [cs3nQVm&)P3javﶆJJ.f6jZ5Q3oZS>0`"R3_bui`+ r `R)ֶh6p {ޗ9u䚻9r3;c+;@ *:IIJ`((6(Hh8My-hSy`OMRHmKȟ+g*W/+W][q[fYdʘ Vk<ו],2UPҔf3R1:3v}4;&MԦ62=hͧ~5cNGn5e]Z!Vq -aA 6"LdЈHhc04^sm-m1 pD8 Έ0hDA R!jB]z֯m=nWkrSԡ {gdK ҐB0g%< wX%"0`4v]\t-R@JW~Eoq@` dk< U`8 ,\ .` _ 5\Ԡ)HAQ&}B QxQx&A|4X% ܪ޿C4A d 9 XLp) 2j@ {QSϕCB4D LM0H%&D&lAAPd@XBh@Aɥ`(p(H *vg :OK| fN$Hq`jLAUP87SZTX$ƭDx^)aA䟴14Aߕ(ATxAh"b0a!H4boT^SiUa M4@ ZGQE/jT # D$NdA\"B$aAaBI;(A%@\:r],^C"@.-..6D(Q+B0L2`ّ2J4YVERkAR[AT(փ<DDe9D!)DD1(hA0C44 PNM)p4lAHCiAQN`0B"/ 0P%ăb@eO $$CWT4Xx Jܐ!R%W%TWD`_ܵ ^04pj4|jNI_hF&Ia1fl(!pAq&Хt*]^^Ҋ=DKlcXwv~D4teGH1%ChD,tƧy]A'~Hѧgd'zw2Duh(6g*(8(Vh$n(Z f(vvh{|(6ό'艂F2FIf5D2"&Bظ( h4>V4U̐eA|P$a>M `O@dt!+A0AB/<%$@ד&j@-Ji<?猗5YM= PNtPPTX,@Q ^0Bh\@ABM$)K:*NP6U*ALc*()@~] RSc :-D.3j/@Bw+M(P¯NXA(WR Դ= !RQ7Y+o"I]D@AT0Tz>h6ZB>1nh0Xa"U~ ~aF2dC @ L-MCX,0ByB! =&+rcPdȇH+mPK6"ԁ~1KAA@B $ dWsYE%rAh*-6mL@e XJqjVdaIfF4B$D!u}.`L4B5?HnR0*A"nM(bZE|)A4 rEl %2),D+ AP$q A街fq[鴩I4DݝAt o,7FWLj &[P^2j*WB 1!,V~qaY,)#o,4MH BN A(״f`Y : x9NQ )QFc&&k'S Ʉ+=lL8IHA0$.žk6QRԈ>3 //E c/@NlPT6B7+;}RTAeA^:0 BWծHԖr-.2-2ˢD̂&+؜-Oh4+ԊFN ZV~)V4cEQCR.BHyU^/NeBn*EXRԙ2dRZtOIqMuVQT`BPQ}9k%D9S;s|`i`EYܒ-45Bz0dd)eӇZA#ehffχ2XAh6Gk϶66m6vn6_nLND!JƇGd"D0D7A ElBq7]vĹ!CFgtfB\0C*jw@r4A80 7F\-i& DchgOM>۾~v?k?87C^O? g';޽CT Lm?7 /4?_ ?~2vaB 6tbDv#2vdH#I4yeJ+YtfL3iִygN;AdyiRI-OOSVzkV[vZӧҠ*jpiZk6X_sֵ{o^{ tPg6|[purdɓ)Wi಄w6SdI6}uj<1@3J-+nC/]F}H%L5ݔN=/ RM=TU]QY}XeZ;t\uݕ^}M_b=V`]f}vWe6lݶ3iC2 r=W!o֬q]xUUdF^u|WzMEF,bE~Vjq^_Ԟ a$F6dR)L|CN^eJG.U1i9真|Ԍ/vTځU^IT Xy5cfQiS5 (ݞF.j|->[QVCh !(]{gujOo;,񸦣U8flM?UGp.WK۽KEu)fƁιVP jEws؝O{?`'V\"~Qe[`j1 o`0Ǿ9 ~rF=0Rp: \5 ůu7SK-ܘ Vo,&+OKh^*gLTY3a U{l8Ӝ,8YO{:&yO3.ik6:jRB)ZQcthuZ!eH*9 HYjTցi 7%̖4`XRjqS+P 7_)Y! ,GGGb84  @Ztj./` rF<f+@cwe:U" VhE:bCb#@ACXh1"0>mb!,;GGGFh0I8ͻ`(d F W F6 療׻1Bbw$%yFTf[-!*,  ;ipywidgets-6.0.0/docs/source/embedding.md000066400000000000000000000221561305534550700204120ustar00rootroot00000000000000# Embedding Jupyter Widgets in Other Contexts than the Notebook Jupyter interactive widgets can be serialized and embedded into - static web pages - sphinx documentation - html-converted notebooks on nbviewer ## Embedding Widgets in HTML Web Pages The notebook interface provides a context menu for generating an HTML snippet that can be embedded into any static web page: ![embedding](./embed.gif) The context menu provides three actions - Save Notebook with Widgets - Download Widget State - Embed Widgets ### Embeddable HTML Snippet The last option, `Embed widgets`, provides a dialog containing an HTML snippet which can be used to embed Jupyter interactive widgets into any web page. This HTML snippet is composed of multiple `