PKHN$ERRjupyter_book/__init__.py"""Build an online book using Jupyter Notebooks and Jekyll.""" __version__ = "0.3"PKHNL*:*:jupyter_book/build.pyfrom subprocess import check_call import os import os.path as op import sys import shutil as sh import yaml import nbformat as nbf from nbclean import NotebookCleaner from tqdm import tqdm import numpy as np from glob import glob from uuid import uuid4 import argparse from jupyter_book.utils import print_message_box DESCRIPTION = ("Convert a collection of Jupyter Notebooks into Jekyll " "markdown suitable for a course textbook.") # Add path to our utility functions this_folder = op.dirname(op.abspath(__file__)) sys.path.append(op.join(this_folder, 'scripts')) from jupyter_book.utils import (_split_yaml, _check_url_page, _prepare_toc, _prepare_url, _clean_notebook_cells, _error) # Defaults BUILD_FOLDER_NAME = "_build" SUPPORTED_FILE_SUFFIXES = ['.ipynb', '.md'] def _clean_lines(lines, filepath, PATH_BOOK, path_images_folder): """Replace images with jekyll image root and add escape chars as needed.""" inline_replace_chars = ['#'] # Images: replace absolute nbconvert image paths to baseurl paths path_rel_root = op.relpath(PATH_BOOK, op.dirname(filepath)) path_rel_root_one_up = path_rel_root.replace('../', '', 1) for ii, line in enumerate(lines): # Handle relative paths because we remove `content/` from the URL # If there's a path that goes back to the root, remove a level` # This is for images referenced directly in the markdown if path_rel_root in line: line = line.replace(path_rel_root, path_rel_root_one_up) # For programmatically-generated images from notebooks, replace the abspath with relpath line = line.replace(path_images_folder, op.relpath(path_images_folder, op.dirname(filepath))) # Adding escape slashes since Jekyll removes them when it serves the page # Make sure we have at least two dollar signs and they # Aren't right next to each other dollars = np.where(['$' == char for char in line])[0] if len(dollars) > 2 and all(ii > 1 for ii in (dollars[1:] - dollars[:1])): for char in inline_replace_chars: line = line.replace('\\{}'.format(char), '\\\\{}'.format(char)) line = line.replace(' \\$', ' \\\\$') lines[ii] = line return lines def _copy_non_content_files(path_content_folder, content_folder_name, build_folder_name): """Copy non-markdown/notebook files in the content folder into build folder so relative links work.""" all_files = glob(op.join(path_content_folder, '**', '*'), recursive=True) non_content_files = [ii for ii in all_files if not any(ii.endswith(ext) for ext in SUPPORTED_FILE_SUFFIXES)] for ifile in non_content_files: if op.isdir(ifile): continue # The folder name may change if the permalink sanitizing changes it. # this ensures that a new folder exists if needed new_path = ifile.replace(os.sep + content_folder_name, os.sep + build_folder_name) if not op.isdir(op.dirname(new_path)): os.makedirs(op.dirname(new_path)) sh.copy2(ifile, new_path) def _case_sensitive_fs(path): """True when filesystem at `path` is case sensitive, False otherwise. Checks this by attempting to write two files, one w/ upper case, one with lower. If after this only one file exists, the system is case-insensitive. Makes directory `path` if it does not exist. """ if not op.exists(path): os.makedirs(path) root = op.join(path, uuid4().hex) fnames = [root + suffix for suffix in 'aA'] try: for fname in fnames: with open(fname, 'wt') as fobj: fobj.write('text') written = glob(root + '*') finally: for fname in written: os.unlink(fname) return len(written) == 2 def build_book(): """Build the markdown for a book using its TOC and a content folder.""" parser = argparse.ArgumentParser(description=DESCRIPTION) parser.add_argument("path_book", help="Path to the root of the book repository.") parser.add_argument("--template", default=None, help="Path to the template nbconvert uses to build markdown files") parser.add_argument("--config", default=None, help="Path to the Jekyll configuration file") parser.add_argument("--toc", default=None, help="Path to the Table of Contents YAML file") parser.add_argument("--overwrite", action='store_true', help="Overwrite md files if they already exist.") parser.add_argument("--execute", action='store_true', help="Execute notebooks before converting to MD.") parser.add_argument("--local-build", action='store_true', help="Specify you are building site locally for later upload.") parser.set_defaults(overwrite=False, execute=False) ############################################################################### # Default values and arguments args = parser.parse_args(sys.argv[2:]) overwrite = bool(args.overwrite) execute = bool(args.execute) # Paths for our notebooks PATH_BOOK = op.abspath(args.path_book) PATH_TOC_YAML = args.toc if args.toc is not None else op.join(PATH_BOOK, '_data', 'toc.yml') CONFIG_FILE = args.config if args.config is not None else op.join(PATH_BOOK, '_config.yml') PATH_TEMPLATE = args.template if args.template is not None else op.join(PATH_BOOK, 'scripts', 'templates', 'jekyllmd.tpl') PATH_IMAGES_FOLDER = op.join(PATH_BOOK, '_build', 'images') BUILD_FOLDER = op.join(PATH_BOOK, BUILD_FOLDER_NAME) ############################################################################### # Read in textbook configuration # Load the yaml for this site with open(CONFIG_FILE, 'r') as ff: site_yaml = yaml.load(ff.read()) CONTENT_FOLDER_NAME = site_yaml.get('content_folder_name').strip('/') PATH_CONTENT_FOLDER = op.join(PATH_BOOK, CONTENT_FOLDER_NAME) # Load the textbook yaml for this site if not op.exists(PATH_TOC_YAML): raise _error("No toc.yml file found, please create one at `{}`".format(PATH_TOC_YAML)) with open(PATH_TOC_YAML, 'r') as ff: toc = yaml.load(ff.read()) # Drop divider items and non-linked pages in the sidebar, un-nest sections toc = _prepare_toc(toc) ############################################################################### # Generating the Jekyll files for all content n_skipped_files = 0 n_built_files = 0 case_check = _case_sensitive_fs(BUILD_FOLDER) and args.local_build print("Convert and copy notebook/md files...") for ix_file, page in enumerate(tqdm(list(toc))): url_page = page.get('url', None) title = page.get('title', None) if page.get('external', None): # If its an external link, just pass continue # Make sure URLs (file paths) have correct structure _check_url_page(url_page, CONTENT_FOLDER_NAME) ############################################################################### # Create path to old/new file and create directory # URL will be relative to the CONTENT_FOLDER path_url_page = os.path.join(PATH_CONTENT_FOLDER, url_page.lstrip('/')) path_url_folder = os.path.dirname(path_url_page) # URLs shouldn't have the suffix in there already so now we find which one to add for suf in SUPPORTED_FILE_SUFFIXES: if op.exists(path_url_page + suf): path_url_page = path_url_page + suf break if not op.exists(path_url_page): raise _error("Could not find file called {} with any of these extensions: {}".format(path_url_page, SUPPORTED_FILE_SUFFIXES)) # Create and check new folder / file paths path_new_folder = path_url_folder.replace(os.sep + CONTENT_FOLDER_NAME, os.sep + BUILD_FOLDER_NAME) path_new_file = op.join(path_new_folder, op.basename(path_url_page).replace('.ipynb', '.md')) if overwrite is False and op.exists(path_new_file) \ and os.stat(path_new_file).st_mtime > os.stat(path_url_page).st_mtime: n_skipped_files += 1 continue if not op.isdir(path_new_folder): os.makedirs(path_new_folder) ############################################################################### # Generate previous/next page URLs if ix_file == 0: url_prev_page = '' prev_file_title = '' else: prev_file_title = toc[ix_file-1].get('title') url_prev_page = toc[ix_file-1].get('url') url_prev_page = _prepare_url(url_prev_page) if ix_file == len(toc) - 1: url_next_page = '' next_file_title = '' else: next_file_title = toc[ix_file+1].get('title') url_next_page = toc[ix_file+1].get('url') url_next_page = _prepare_url(url_next_page) ############################################################################### # Get kernel name from notebooks metadata kernel_name = '' if path_url_page.endswith('.ipynb'): data = nbf.read(path_url_page, nbf.NO_CONVERT) kernel_name = data['metadata']['kernelspec']['name'] ############################################################################### # Content conversion # Convert notebooks or just copy md if no notebook. if path_url_page.endswith('.ipynb'): # Create a temporary version of the notebook we can modify tmp_notebook = path_url_page + '_TMP' sh.copy2(path_url_page, tmp_notebook) ############################################################################### # Notebook cleaning # Clean up the file before converting cleaner = NotebookCleaner(tmp_notebook) cleaner.remove_cells(empty=True) if site_yaml.get('hide_cell_text', False): cleaner.remove_cells(search_text=site_yaml.get('hide_cell_text')) if site_yaml.get('hide_code_text', False): cleaner.clear(kind="content", search_text=site_yaml.get('hide_code_text')) cleaner.clear('stderr') cleaner.save(tmp_notebook) _clean_notebook_cells(tmp_notebook) ############################################################################### # Conversion to Jekyll Markdown # Run nbconvert moving it to the output folder # This is the output directory for `.md` files build_call = '--FilesWriter.build_directory={}'.format(path_new_folder) # Copy notebook output images to the build directory using the base folder name path_after_build_folder = path_new_folder.split(os.sep + BUILD_FOLDER_NAME + os.sep)[-1] nb_output_folder = op.join(PATH_IMAGES_FOLDER, path_after_build_folder) images_call = '--NbConvertApp.output_files_dir={}'.format(nb_output_folder) call = ['jupyter', 'nbconvert', '--log-level="CRITICAL"', '--to', 'markdown', '--template', PATH_TEMPLATE, images_call, build_call, tmp_notebook] if execute is True: call.insert(-1, '--execute') check_call(call) os.remove(tmp_notebook) elif path_url_page.endswith('.md'): # If a non-notebook file, just copy it over. # If markdown we'll add frontmatter later sh.copy2(path_url_page, path_new_file) else: raise _error("Files must end in ipynb or md. Found file {}".format(path_url_page)) ############################################################################### # Modify the generated Markdown to work with Jekyll # Clean markdown for Jekyll quirks (e.g. extra escape characters) with open(path_new_file, 'r') as ff: lines = ff.readlines() lines = _clean_lines(lines, path_new_file, PATH_BOOK, PATH_IMAGES_FOLDER) # Split off original yaml yaml_orig, lines = _split_yaml(lines) # Front-matter YAML yaml_fm = [] yaml_fm += ['---'] # In case pre-existing links are sanitized sanitized = url_page.lower().replace('_', '-') if sanitized != url_page: if case_check and url_page.lower() == sanitized: raise RuntimeError( 'Redirect {} clashes with page {} for local build on ' 'case-insensitive FS\n'.format(sanitized, url_page) + 'Rename source page to lower case or build on a case ' 'sensitive FS, e.g. case-sensitive disk image on Mac') yaml_fm += ['redirect_from:'] yaml_fm += [' - "{}"'.format(sanitized)] if path_url_page.endswith('.ipynb'): interact_path = CONTENT_FOLDER_NAME + '/' + path_url_page.split(CONTENT_FOLDER_NAME+'/')[-1] yaml_fm += ['interact_link: {}'.format(interact_path)] yaml_fm += ["kernel_name: {}".format(kernel_name)] yaml_fm += ["title: '{}'".format(title)] yaml_fm += ['prev_page:'] yaml_fm += [' url: {}'.format(url_prev_page)] yaml_fm += [" title: '{}'".format(prev_file_title)] yaml_fm += ['next_page:'] yaml_fm += [' url: {}'.format(url_next_page)] yaml_fm += [" title: '{}'".format(next_file_title)] # Add back any original YaML, and end markers yaml_fm += yaml_orig yaml_fm += ['comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /{}***"'.format(CONTENT_FOLDER_NAME)] yaml_fm += ['---'] yaml_fm = [ii + '\n' for ii in yaml_fm] lines = yaml_fm + lines # Write the result with open(path_new_file, 'w') as ff: ff.writelines(lines) n_built_files += 1 ############################################################################### # Finishing up... # Copy non-markdown files in notebooks/ in case they're referenced in the notebooks print('Copying non-content files inside `{}/`...'.format(CONTENT_FOLDER_NAME)) _copy_non_content_files(PATH_CONTENT_FOLDER, CONTENT_FOLDER_NAME, BUILD_FOLDER_NAME) # Message at the end msg = ["Generated {} new files\nSkipped {} already-built files".format(n_built_files, n_skipped_files)] if n_built_files == 0: msg += ["Delete the markdown files in '{}' for any pages that you wish to re-build, or use --overwrite option to re-build all.".format(BUILD_FOLDER_NAME)] msg += ["Your Jupyter Book is now in `{}/`.".format(BUILD_FOLDER_NAME)] msg += ["Demo your Jupyter book with `make serve` or push to GitHub!"] print_message_box('\n'.join(msg)) PKHNf[0202jupyter_book/create.pyfrom subprocess import run import sys import os import os.path as op import shutil as sh from glob import glob import argparse import string from ruamel.yaml import YAML from .utils import print_color, print_message_box, str2bool from . import __version__ TEMPLATE_PATH = op.join(op.dirname(__file__), 'book_template') MINIMAL_PATH = op.join(op.dirname(__file__), 'minimal') def _final_message(path_out, notes): msg = ["", "Finished creating a new book at `{}`".format(path_out), "" "- Your content is in `{}` ".format(op.join(path_out, 'content')), "", "- A Table of Contents file is at `{}`.".format(op.join(path_out, '_data', 'toc.yml')), " You should check its contents, make sure it references your", " content correctly, and ensure it has the correct order.", "", "- Your configuration file is at `{}`.".format(op.join(path_out, '_config.yml')), " You should check its contents and double-check that the values" " are correct for your site.", ""] if len(notes) > 0: msg += ["", "Notes", "====="] + notes return '\n'.join(msg) def _check_file_exists(path): if not op.exists(path): raise FileNotFoundError("Couldn't find file: {}".format(path)) def update_config(path_to_config, new_config): """Update a configuration yaml file using the values from a user-provided one.""" _check_file_exists(new_config) print("Updating template configuration file with the values in {}".format(new_config)) # Load our template and new config yaml = YAML() with open(path_to_config, 'r') as ff: data = yaml.load(ff) with open(new_config, 'r') as ff: data_new = yaml.load(ff) # Update the fields that are present in the new config for ii in data_new.keys(): if ii in data: data[ii] = data_new[ii] else: print("Not using config key with no corresponding template key: {}".format(ii)) with open(path_to_config, 'w') as ff: yaml.dump(data, ff) def new_book(): """Create a new Jupyter Book.""" parser = argparse.ArgumentParser(description="Create a new Jupyter Book") parser.add_argument("name", help="The name of your Jupyter Book (your book template will be placed in a folder of this name)") parser.add_argument("--out-folder", default='.', help="The location where your book will be placed") parser.add_argument("--license", default=None, help="A path to a LICENSE.md file if you have already created one") parser.add_argument("--content-folder", default=None, help="A path to a folder that holds your book content") parser.add_argument("--toc", default=None, help="A path to a yaml file that contains a Table of Contents for your Jupyter Book. This will overwrite parts of the book template's default toc.yml configuration") parser.add_argument("--config", default=None, help="A path to a configuration YAML file that contains configuration for your Jupyter Book. This will overwrite parts of the book template's default _config.yml configuration") parser.add_argument("--custom-css", default=None, help="A path to a CSS file that defines some custom CSS rules for your book") parser.add_argument("--custom-js", default=None, help="A path to a JS file that defines some custom CSS rules for your book") parser.add_argument("--extra-files", default=None, nargs="+", help="A list of extra files / folders to copy into your book's directory") parser.add_argument("--overwrite", default=False, action="store_true", help="Whether to overwrite a pre-existing book if it exists") parser.add_argument("--demo", default=False, action="store_true", help="Whether to build the book with demo content instead of your own content") parser.add_argument("--verbose", default='yes', help="Whether to display output information. [yes/no]") args = parser.parse_args(sys.argv[2:]) path_out = op.join(args.out_folder, args.name) verbose = str2bool(args.verbose) notes = [] # Check folder exists and overwrite if necessary if op.isdir(path_out): if args.overwrite: sh.rmtree(path_out) if op.isdir(path_out): raise ValueError("A book already exists with this name / output directory. Delete it, or use `--overwrite` if you'd like to replace it") # Copy the book structure to the new folder print("Copying new book to: {}".format(path_out)) ignore_folders = ['_build', 'content'] sh.copytree(TEMPLATE_PATH, path_out, ignore=sh.ignore_patterns('.git', *ignore_folders)) # If the Demo argument is provided, copy over a couple demo files and stop if args.demo is True: print("Copying over demo repository content") sh.copytree(op.join(TEMPLATE_PATH, 'content'), op.join(path_out, 'content')) message = ["- You've chosen to copy over the demo Jupyter Book. This contains", " the content shown at https://jupyter.org/jupyter-book.\n" " Use it to get acquainted with the Jupyter-Book structure and build ", " system. When you're ready, try re-running `jupyter-book create` using ", " your own content!"] notes += message _final_message(path_out, []) sys.exit() # Create empty folders for build files if they don't exist if not op.exists(op.join(path_out, '_build')): os.makedirs(op.join(path_out, '_build')) # Copy over content if args.content_folder is None: args.content_folder = op.join(MINIMAL_PATH, 'content') args.toc = op.join(MINIMAL_PATH, '_data', 'toc.yml') sh.rmtree(op.join(path_out, '_build')) notes.append(("- Add your own content to your book. You haven't provided any content (`--content-folder`)\n" " so we've added a couple files to get you started.")) _check_file_exists(args.content_folder) print("Copying over your content folder...") sh.copytree(args.content_folder, op.join(path_out, 'content')) # Copy over TOC file if args.toc is None: run(['jupyter-book', 'toc', path_out, '--quiet'], check=True) notes.append(("- Check your Table of Contents file (`_data/toc.yml`). Because you specified a content foler\n" " but no Table of Conents (`--toc`), we auto-generated a TOC file file using folder and file\n" " names. You should check its contents and clean it up so that it has the structure you want!\n")) else: _check_file_exists(args.toc) print("Copying over your TOC file...\n") sh.copy2(args.toc, op.join(path_out, '_data', 'toc.yml')) # Configuration file if args.config is None: update_config(op.join(path_out, '_config.yml'), op.join(MINIMAL_PATH, '_config.yml')) else: # Use the minimal configuration, which has some placeholders for users to change update_config(op.join(path_out, '_config.yml'), args.config) # Add the Jupyter Book version fo the config yaml = YAML() with open(op.join(path_out, '_config.yml'), 'r') as ff: data = yaml.load(ff) data['jupyter_book_version'] = __version__ with open(op.join(path_out, '_config.yml'), 'w') as ff: yaml.dump(data, ff) # Custom CSS and JS if args.custom_css is not None: if not os.path.exists(args.custom_css): raise ValueError("Could not find custom CSS file: {}".format(args.custom_css)) sh.copy2(args.custom_css, op.join(path_out, 'assets', 'custom', 'custom.css')) if args.custom_js is not None: if not os.path.exists(args.custom_js): raise ValueError("Could not find custom JS file: {}".format(args.custom_js)) sh.copy2(args.custom_js, op.join(path_out, 'assets', 'custom', 'custom.js')) # Ask user to add a license if they wish if args.license is not None: if not os.path.exists(args.license): raise ValueError("Could not find license file: {}".format(args.license)) sh.copy2(args.license, op.join(path_out, 'content', 'LICENSE.md')) else: notes.append(("- We've added a CC-BY-SA license for you in {}\n" " This is a reasonable license for most book content, though feel free\n" " to change it if you like!".format(op.join(path_out, 'content', 'LICENSE.md')))) sh.copy2(op.join(MINIMAL_PATH, 'LICENSE.md'), op.join(path_out, 'content', 'LICENSE.md')) # Copy over extra files / folders to the root of the content folder if isinstance(args.extra_files, (list, str)): if isinstance(args.extra_files, str): args.extra_files = [args.extra_files] print('Copying over extra files: {}'.format(args.extra_files)) for ipath in args.extra_files: if op.isdir(ipath): # Walk the directory and copy individual files respecting directory structure for ifolder, _, ifiles in os.walk(ipath): last_folder = ipath.rsplit(os.sep)[-1] rel_to_last_folder = op.join(last_folder, ifolder.split(last_folder, 1)[-1].strip(os.sep)) rel_to_out_path = op.join(path_out, rel_to_last_folder) if not op.isdir(rel_to_out_path): os.makedirs(rel_to_out_path) for ifile in ifiles: new_path = op.join(rel_to_out_path, ifile) sh.copy2(op.join(ifolder, ifile), new_path) print(new_path) else: # Copy the file to the root of the out path directly sh.copy2(ipath, op.join(path_out, op.basename(ipath))) # Cleanup messages if verbose: print_message_box(_final_message(path_out, notes)) def upgrade_book(): """Upgrade a book to the latest Jupyter Book version.""" parser = argparse.ArgumentParser(description="Upgrade a book to the latest Jupyter Book version.") parser.add_argument("path_book", help="Path to the root of the book repository you'd like to upgrade.") args = parser.parse_args(sys.argv[2:]) path_book = args.path_book.rstrip('/') path_book_new = path_book + '_UPGRADED' if not op.exists(op.join(path_book, '_config.yml')): raise ValueError("This does not appear to be a valid Jupyter Book. Searched in location: {}".format(path_book)) # Now create a new book from the old one try: print("Creating new book from your original one...") run(['jupyter-book', 'create', path_book_new, '--toc', op.join(path_book, '_data', 'toc.yml'), '--content-folder', op.join(path_book, 'content'), '--config', op.join(path_book, '_config.yml'), '--license', op.join(path_book, 'content', 'LICENSE.md'), '--custom-css', op.join(path_book, 'assets', 'custom', 'custom.css'), '--custom-js', op.join(path_book, 'assets', 'custom', 'custom.js'), '--overwrite', "--verbose", "false"], check=True) # Now overwrite the original book files with the upgraded ones print("Copying over upgraded files into original folder...") for path, _, ifiles in os.walk(path_book_new): new_path = path.replace(path_book_new, path_book) for ifile in ifiles: if not op.isdir(new_path): os.makedirs(new_path) sh.copy(op.join(path, ifile), op.join(new_path, ifile)) # Cleanup and Success message print("Removing the backup book...") sh.rmtree(path_book_new) print_message_box(("Finished upgrading your book at: {}\n\n" "Your content, configuration, etc should not have changed, but all surrounding book\n" "files should be upgraded. You should double-check that this is the case by running \n" "a `git diff` on your book to see what has changed:\n" "\n" " cd {}\n" " git diff\n" "\n" "Don't forget to commit these changes to git!".format(path_book, path_book))) except Exception as ex: print_message_box(("There was an error in upgrading your Jupyter Book!\n\n" "Don't worry, your content, configuration, etc should not have changed. Any new book\n" "content may by in {} if the upgrade got far enough\n" "you can investigate this folder, or delete it if you'd like.\n\n" "Here is the error:\n\n {}".format(path_book_new, ex)))PKHNnZZjupyter_book/main.pyfrom subprocess import run import sys import os import os.path as op import shutil as sh from glob import glob import argparse import string from .create import new_book, upgrade_book from .build import build_book from .run import run_book from .utils import print_message_box from .toc import build_toc DESCRIPTION = ("Jupyter Book: Generate an HTML book from your Jupyter Notebooks using Jekyll. Type `jupyter-book -h` for help.") commands = {'create': new_book, 'build': build_book, 'upgrade': upgrade_book, 'run': run_book, 'toc': build_toc} parser = argparse.ArgumentParser(description=DESCRIPTION) parser.add_argument("command", help="The command you'd like to run. Allowed commands: {}".format(list(commands.keys()))) def main(): args = parser.parse_args(sys.argv[1:2]) if args.command not in commands: parser.print_help() raise ValueError('Unrecognized command: {}\n See the help above for usage information'.format(args.command)) # Run the command commands[args.command]() if __name__ == "__main__": main() PKHNL,,jupyter_book/run.py"""Execute all of the notebooks in a folder. This is helpful if you wish to ensure that all of your notebooks run, and that the output contained in the notebook files is up-to-date.""" from glob import glob from subprocess import run from tqdm import tqdm import argparse import os.path as op import sys DESCRIPTION = ("Execute all of the notebooks in a specified folder.") parser = argparse.ArgumentParser(description=DESCRIPTION) parser.add_argument("path_content", help="The path to a folder with Jupyter Notebooks inside that you'd like to run.") parser.add_argument("--kernel-name", default="python3", help="The name of the kernel used to run the notebook code.") def run_book(): args = parser.parse_args(sys.argv[2:]) path = args.path_content kernel_name = args.kernel_name print("Running all notebooks underneath {}".format(path)) ipynb_files = glob(op.join(path, '**', '*.ipynb'), recursive=True) failed_files = [] for ifile in tqdm(ipynb_files): call = 'jupyter nbconvert --inplace --ExecutePreprocessor.kernel_name={} --to notebook --execute {}'.format(kernel_name, ifile) try: run(call.split(), check=True) except Exception: failed_files.append(ifile) print('Failing files:') for ifile in failed_files: print(ifile) PKHNʫjupyter_book/toc.py"""Execute all of the notebooks in a folder. This is helpful if you wish to ensure that all of your notebooks run, and that the output contained in the notebook files is up-to-date.""" from glob import glob from subprocess import run import argparse import os.path as op import sys from .utils import print_message_box DESCRIPTION = ("Execute all of the notebooks in a specified folder.") parser = argparse.ArgumentParser(description=DESCRIPTION) parser.add_argument("path_book", help="The path to a Jupyter Book.") parser.add_argument("--quiet", default=False, action="store_true", help="Whether to suppress the final message box.") def build_toc(): args = parser.parse_args(sys.argv[2:]) path_book = args.path_book path_content = op.join(path_book, 'content') path_toc = op.join(path_book, '_data', 'toc.yml') # Build the TOC toc_script = op.join(op.dirname(__file__), 'scripts', 'generate_toc.py') run(['python', toc_script, path_content, '--out_path', path_toc, '--overwrite'], check=True) # Optional end message msg = ["Finished generating your table of contents file at: {}".format(path_toc), "", "This file contains a flat list of TOC entries that point to", "the content in the folder you specified, they've been ordered", "according to the folder / file names. You should reorder them", "as well as nest them in chapters / sub-chapters as you wish."] if not args.quiet: print_message_box('\n'.join(msg))PKHNO{{jupyter_book/utils.py"""Utility functions for Jupyter Book.""" import string import nbformat as nbf import argparse import os #################################################################################### # CLI utilities def print_color(msg, style): endc = '\033[0m' bcolors = dict(blue='\033[94m', green='\033[92m', orange='\033[93m', red='\033[91m', bold = '\033[1m', underline = '\033[4m') print(bcolors[style] + msg + endc) def print_message_box(msg): border = '================================================================================' print_color('\n\n' + border + '\n\n', 'green') print(msg) print_color('\n\n' + border + '\n\n', 'green') def _error(msg): msg = '\n\n\033[91m==========\033[0m\n{}\n\033[91m==========\033[0m\n'.format(msg) return ValueError(msg) def str2bool(msg): if msg.lower() in ('yes', 'true', 't', 'y', '1'): return True elif msg.lower() in ('no', 'false', 'f', 'n', '0'): return False else: raise argparse.ArgumentTypeError('Boolean value expected. Got: {}'.format(msg)) #################################################################################### # Book conversion formatting ALLOWED_CHARACTERS = string.ascii_letters + '-_/.' + string.digits def _split_yaml(lines): yaml0 = None for ii, iline in enumerate(lines): iline = iline.strip() if yaml0 is None: if iline == '---': yaml0 = ii elif iline: break elif iline == '---': return lines[yaml0 + 1:ii], lines[ii + 1:] return [], lines def _check_url_page(url_page, content_folder_name): """Check that the page URL matches certain conditions.""" if not all(ii in ALLOWED_CHARACTERS for ii in url_page): raise ValueError("Found unsupported character in filename: {}".format(url_page)) if '.' in os.path.splitext(url_page)[-1]: raise _error("A toc.yml entry links to a file directly. You should strip the file suffix.\n" "Please change {} to {}".format(url_page, os.path.splitext(url_page)[0])) if any(url_page.startswith(ii) for ii in [content_folder_name, os.sep+content_folder_name]): raise ValueError("It looks like you have a page URL that starts with your content folder's name." "page URLs should be *relative* to the content folder. Here is the page URL: {}".format(url_page)) def _prepare_toc(toc): """Prepare the TOC for processing.""" # Drop toc items w/o links toc = [ii for ii in toc if ii.get('url', None) is not None] # Un-nest the TOC so it's a flat list new_toc = [] for ii in toc: sections = ii.pop('sections', None) new_toc.append(ii) if sections is None: continue for jj in sections: subsections = jj.pop('subsections', None) new_toc.append(jj) if subsections is None: continue for kk in subsections: new_toc.append(kk) return new_toc def _prepare_url(url): """Prep the formatting for a url.""" # Strip suffixes and prefixes of the URL if not url.startswith('/'): url = '/' + url # Standardize the quotes character url = url.replace('"', "'") return url def _clean_notebook_cells(path_ntbk): """Clean up cell text of an nbformat NotebookNode.""" ntbk = nbf.read(path_ntbk, nbf.NO_CONVERT) # Remove '#' from the end of markdown headers for cell in ntbk.cells: if cell.cell_type == "markdown": cell_lines = cell.source.split('\n') for ii, line in enumerate(cell_lines): if line.startswith('#'): cell_lines[ii] = line.rstrip('#').rstrip() cell.source = '\n'.join(cell_lines) nbf.write(ntbk, path_ntbk) PKHN /#!!"jupyter_book/book_template/Gemfilesource 'https://rubygems.org' group :jekyll_plugins do gem 'github-pages' gem 'jekyll-feed', '~> 0.6' # Textbook plugins gem 'jekyll-redirect-from' gem 'jekyll-scholar' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] # Performance-booster for watching directories on Windows gem 'wdm', '~> 0.1.0' if Gem.win_platform? # Development tools gem 'guard', '~> 2.14.2' gem 'guard-jekyll-plus', '~> 2.0.2' gem 'guard-livereload', '~> 2.5.2' PKHNk'jupyter_book/book_template/Gemfile.lockGEM remote: https://rubygems.org/ specs: activesupport (4.2.10) i18n (~> 0.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) addressable (2.5.2) public_suffix (>= 2.0.2, < 4.0) bibtex-ruby (4.4.7) latex-decode (~> 0.0) citeproc (1.0.9) namae (~> 1.0) citeproc-ruby (1.1.10) citeproc (~> 1.0, >= 1.0.9) csl (~> 1.5) coderay (1.1.2) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.11.1) colorator (1.1.0) commonmarker (0.17.13) ruby-enum (~> 0.5) concurrent-ruby (1.1.4) csl (1.5.0) namae (~> 1.0) csl-styles (1.0.1.9) csl (~> 1.0) dnsruby (1.61.2) addressable (~> 2.5) em-websocket (0.5.1) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) ethon (0.11.0) ffi (>= 1.3.0) eventmachine (1.2.7) execjs (2.7.0) faraday (0.15.4) multipart-post (>= 1.2, < 3) ffi (1.9.25) formatador (0.2.5) forwardable-extended (2.6.0) gemoji (3.0.0) github-pages (193) activesupport (= 4.2.10) github-pages-health-check (= 1.8.1) jekyll (= 3.7.4) jekyll-avatar (= 0.6.0) jekyll-coffeescript (= 1.1.1) jekyll-commonmark-ghpages (= 0.1.5) jekyll-default-layout (= 0.1.4) jekyll-feed (= 0.11.0) jekyll-gist (= 1.5.0) jekyll-github-metadata (= 2.9.4) jekyll-mentions (= 1.4.1) jekyll-optional-front-matter (= 0.3.0) jekyll-paginate (= 1.1.0) jekyll-readme-index (= 0.2.0) jekyll-redirect-from (= 0.14.0) jekyll-relative-links (= 0.5.3) jekyll-remote-theme (= 0.3.1) jekyll-sass-converter (= 1.5.2) jekyll-seo-tag (= 2.5.0) jekyll-sitemap (= 1.2.0) jekyll-swiss (= 0.4.0) jekyll-theme-architect (= 0.1.1) jekyll-theme-cayman (= 0.1.1) jekyll-theme-dinky (= 0.1.1) jekyll-theme-hacker (= 0.1.1) jekyll-theme-leap-day (= 0.1.1) jekyll-theme-merlot (= 0.1.1) jekyll-theme-midnight (= 0.1.1) jekyll-theme-minimal (= 0.1.1) jekyll-theme-modernist (= 0.1.1) jekyll-theme-primer (= 0.5.3) jekyll-theme-slate (= 0.1.1) jekyll-theme-tactile (= 0.1.1) jekyll-theme-time-machine (= 0.1.1) jekyll-titles-from-headings (= 0.5.1) jemoji (= 0.10.1) kramdown (= 1.17.0) liquid (= 4.0.0) listen (= 3.1.5) mercenary (~> 0.3) minima (= 2.5.0) nokogiri (>= 1.8.2, < 2.0) rouge (= 2.2.1) terminal-table (~> 1.4) github-pages-health-check (1.8.1) addressable (~> 2.3) dnsruby (~> 1.60) octokit (~> 4.0) public_suffix (~> 2.0) typhoeus (~> 1.3) guard (2.14.2) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) lumberjack (>= 1.0.12, < 2.0) nenv (~> 0.1) notiffany (~> 0.0) pry (>= 0.9.12) shellany (~> 0.0) thor (>= 0.18.1) guard-compat (1.2.1) guard-jekyll-plus (2.0.2) guard (~> 2.10, >= 2.10.3) guard-compat (~> 1.1) jekyll (>= 1.0.0) guard-livereload (2.5.2) em-websocket (~> 0.5) guard (~> 2.8) guard-compat (~> 1.0) multi_json (~> 1.8) html-pipeline (2.9.1) activesupport (>= 2) nokogiri (>= 1.4) http_parser.rb (0.6.0) i18n (0.9.5) concurrent-ruby (~> 1.0) jekyll (3.7.4) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) i18n (~> 0.7) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 2.0) kramdown (~> 1.14) liquid (~> 4.0) mercenary (~> 0.3.3) pathutil (~> 0.9) rouge (>= 1.7, < 4) safe_yaml (~> 1.0) jekyll-avatar (0.6.0) jekyll (~> 3.0) jekyll-coffeescript (1.1.1) coffee-script (~> 2.2) coffee-script-source (~> 1.11.1) jekyll-commonmark (1.2.0) commonmarker (~> 0.14) jekyll (>= 3.0, < 4.0) jekyll-commonmark-ghpages (0.1.5) commonmarker (~> 0.17.6) jekyll-commonmark (~> 1) rouge (~> 2) jekyll-default-layout (0.1.4) jekyll (~> 3.0) jekyll-feed (0.11.0) jekyll (~> 3.3) jekyll-gist (1.5.0) octokit (~> 4.2) jekyll-github-metadata (2.9.4) jekyll (~> 3.1) octokit (~> 4.0, != 4.4.0) jekyll-mentions (1.4.1) html-pipeline (~> 2.3) jekyll (~> 3.0) jekyll-optional-front-matter (0.3.0) jekyll (~> 3.0) jekyll-paginate (1.1.0) jekyll-readme-index (0.2.0) jekyll (~> 3.0) jekyll-redirect-from (0.14.0) jekyll (~> 3.3) jekyll-relative-links (0.5.3) jekyll (~> 3.3) jekyll-remote-theme (0.3.1) jekyll (~> 3.5) rubyzip (>= 1.2.1, < 3.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) jekyll-scholar (5.14.0) bibtex-ruby (~> 4.0, >= 4.0.13) citeproc-ruby (~> 1.0) csl-styles (~> 1.0) jekyll (~> 3.0) jekyll-seo-tag (2.5.0) jekyll (~> 3.3) jekyll-sitemap (1.2.0) jekyll (~> 3.3) jekyll-swiss (0.4.0) jekyll-theme-architect (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-cayman (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-dinky (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-hacker (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-leap-day (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-merlot (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-midnight (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-minimal (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-modernist (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-primer (0.5.3) jekyll (~> 3.5) jekyll-github-metadata (~> 2.9) jekyll-seo-tag (~> 2.0) jekyll-theme-slate (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-tactile (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-time-machine (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-titles-from-headings (0.5.1) jekyll (~> 3.3) jekyll-watch (2.1.2) listen (~> 3.0) jemoji (0.10.1) gemoji (~> 3.0) html-pipeline (~> 2.2) jekyll (~> 3.0) kramdown (1.17.0) latex-decode (0.3.1) liquid (4.0.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) lumberjack (1.0.13) mercenary (0.3.6) method_source (0.9.2) mini_portile2 (2.4.0) minima (2.5.0) jekyll (~> 3.5) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) minitest (5.11.3) multi_json (1.13.1) multipart-post (2.0.0) namae (1.0.1) nenv (0.3.0) nokogiri (1.9.1) mini_portile2 (~> 2.4.0) notiffany (0.1.1) nenv (~> 0.1) shellany (~> 0.0) octokit (4.13.0) sawyer (~> 0.8.0, >= 0.5.3) pathutil (0.16.2) forwardable-extended (~> 2.6) pry (0.12.2) coderay (~> 1.1.0) method_source (~> 0.9.0) public_suffix (2.0.5) rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) rouge (2.2.1) ruby-enum (0.7.2) i18n ruby_dep (1.5.0) rubyzip (1.2.2) safe_yaml (1.0.4) sass (3.7.2) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) sawyer (0.8.1) addressable (>= 2.3.5, < 2.6) faraday (~> 0.8, < 1.0) shellany (0.0.1) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) thor (0.20.3) thread_safe (0.3.6) typhoeus (1.3.1) ethon (>= 0.9.0) tzinfo (1.2.5) thread_safe (~> 0.1) unicode-display_width (1.4.1) PLATFORMS ruby DEPENDENCIES github-pages guard (~> 2.14.2) guard-jekyll-plus (~> 2.0.2) guard-livereload (~> 2.5.2) jekyll-feed (~> 0.6) jekyll-redirect-from jekyll-scholar tzinfo-data BUNDLED WITH 1.17.2 PKHN _;oo$jupyter_book/book_template/Guardfileguard 'jekyll-plus', serve: true do watch /.*/ ignore /^_site/ end guard 'livereload' do watch /.*/ end PKHN/W""#jupyter_book/book_template/Makefile.PHONY: help book clean serve help: @echo "Please use 'make ' where is one of:" @echo " install to install the necessary dependencies for jupyter-book to build" @echo " book to convert the `content/` folder into Jekyll markdown in `_build/`" @echo " clean to clean out site build files" @echo " runall to run all notebooks in-place, capturing outputs with the notebook" @echo " serve to serve the repository locally with Jekyll" @echo " build to build the site HTML locally with Jekyll and store in _site/" install: gem install bundler bundle install book: jupyter-book build ./ runall: jupyter-book run ./content clean: python scripts/clean.py serve: bundle exec guard site: bundle exec jekyll build touch _site/.nojekyllPKHNQ&jupyter_book/book_template/_config.yml# Welcome to Jekyll! # # This config file is meant for settings that affect your whole blog, values # which you are expected to set up once and rarely edit after that. If you find # yourself editing this file very often, consider using Jekyll's data files # feature for the data you need to update frequently. # # For technical reasons, this file is *NOT* reloaded automatically when you use # 'bundle exec jekyll serve'. If you change this file, please restart the server process. # Site settings # These are used to personalize your new site. If you look in the HTML files, # you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. # You can create any custom variable you would like, and they will be accessible # in the templates via {{ site.myvariable }}. ####################################################################################### # Jekyll site settings title: Jupyter Book author: The Jupyter Book Community email: choldgraf@berkeley.edu description: >- # this means to ignore newlines until "baseurl:" This is an example book built with Jupyter Books. baseurl: "/jupyter-book" # the subpath of your site, e.g. /blog. If there is no subpath for your site, use an empty string "" url: "https://jupyter.org" # the base hostname & protocol for your site, e.g. http://example.com ####################################################################################### # Jupyter Book settings # Notebook content settings hide_cell_text : "# HIDDEN" # When building the textbook, any cells with this text inside will be hidden in the output markdown hide_code_text : "# NO CODE" # When building the textbook, any cells with this text inside will have *only* their output shown (no code) use_hide_code_button : true # If True, a small button appears to the right of each cell that lets you hide its contents. # Sidebar settings show_sidebar : true # Show the sidebar. Only set to false if your only wish to host a single page. collapse_inactive_chapters: true # Whether to collapse the inactive chapters in the sidebar textbook_logo : images/logo/logo.png # A logo to be displayed at the top of your textbook sidebar textbook_logo_link : https://jupyter.org/jupyter-book/intro.html # A link for the logo. sidebar_footer_text : 'Powered by Jupyter Book' number_toc_chapters : true # Whether to add numbers to chapterse in your Table of Contents. If true, you can control this at the Chapter level in _data/toc.yml # Search settings search_max_words_in_content : 100 # In the search function, use at most this many words (too many words will make search slow) ####################################################################################### # Interact link settings # General interact settings use_jupyterlab : false # If 'true', interact links will use JupyterLab as the interface # Jupyterhub link settings use_jupyterhub_button : false # If 'true', display a button that will direct users to a JupyterHub (that you provide) jupyterhub_url : "" # The URL for your JupyterHub. If no URL, use "" jupyterhub_interact_text : "Interact" # The text that interact buttons will contain. # Binder link settings use_binder_button : true # If 'true', add a binder button for interactive links binderhub_url : "https://mybinder.org" # The URL for your BinderHub. If no URL, use "" binder_repo_base : "https://github.com/" # The site on which the textbook repository is hosted binder_repo_org : "jupyter" # The username or organization that owns this repository binder_repo_name : "jupyter-book" # The name of the repository on the web binder_repo_branch : "master" # The branch on which your textbook is hosted. binderhub_interact_text : "Interact" # The text that interact buttons will contain. # Thebelab settings use_thebelab_button : true # If 'true', display a button to allow in-page running code cells with Thebelab thebelab_button_text : "Thebelab" # The text to display inside the Thebelab initialization button ####################################################################################### # Jupyter book extensions and additional features # Bibliography and citation settings. See https://github.com/inukshuk/jekyll-scholar#configuration for options scholar: style: apa ####################################################################################### # Jupyter book settings you probably don't need to change content_folder_name : "content" # The folder where your raw content (notebooks/markdown files) are located images_url : "/assets/images" # Path to static image files css_url : "/assets/css" # Path to static CSS files js_url : "/assets/js" # Path to JS files custom_static_url : "/assets/custom" # Path to user's custom CSS/JS files ####################################################################################### # Jekyll build settings (only modify if you know what you're doing) # Site settings defaults: - scope: path: "" values: layout: "default" toc: true toc_label: " On this page" toc_icon: "list-ul" favicon_path: "images/logo/favicon.ico" # Markdown Processing markdown: kramdown kramdown: input: GFM syntax_highlighter: rouge sass: style: compressed collections: build: output: true permalink: /:path.html # Exclude from processing. # The following items will not be processed, by default. Create a custom list # to override the default setting. exclude: - content/ - scripts/ - Gemfile - Gemfile.lock - node_modules - vendor/bundle/ - vendor/cache/ - vendor/gems/ - vendor/ruby/ plugins: - jekyll-redirect-from - jekyll-scholar # Jupyter Book version - DO NOT CHANGE THIS. It is generated when a new book is created jupyter_book_version: INSERTPKHN9uu+jupyter_book/book_template/requirements.txt# Requirements for the demo notebooks # Useful for MyBinder configuration pandas numpy datascience folium matplotlib PKHNHd7jupyter_book/book_template/_bibliography/references.bib--- --- @inproceedings{holdgraf_evidence_2014, address = {Brisbane, Australia, Australia}, title = {Evidence for {Predictive} {Coding} in {Human} {Auditory} {Cortex}}, booktitle = {International {Conference} on {Cognitive} {Neuroscience}}, publisher = {Frontiers in Neuroscience}, author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Knight, Robert T.}, year = {2014} } @article{holdgraf_rapid_2016, title = {Rapid tuning shifts in human auditory cortex enhance speech intelligibility}, volume = {7}, issn = {2041-1723}, url = {http://www.nature.com/doifinder/10.1038/ncomms13654}, doi = {10.1038/ncomms13654}, number = {May}, journal = {Nature Communications}, author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Rieger, Jochem W. and Crone, Nathan and Lin, Jack J. and Knight, Robert T. and Theunissen, Frédéric E.}, year = {2016}, pages = {13654}, file = {Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:C\:\\Users\\chold\\Zotero\\storage\\MDQP3JWE\\Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:application/pdf} } @inproceedings{holdgraf_portable_2017, title = {Portable learning environments for hands-on computational instruction using container-and cloud-based technology to teach data science}, volume = {Part F1287}, isbn = {978-1-4503-5272-7}, doi = {10.1145/3093338.3093370}, abstract = {© 2017 ACM. There is an increasing interest in learning outside of the traditional classroom setting. This is especially true for topics covering computational tools and data science, as both are challenging to incorporate in the standard curriculum. These atypical learning environments offer new opportunities for teaching, particularly when it comes to combining conceptual knowledge with hands-on experience/expertise with methods and skills. Advances in cloud computing and containerized environments provide an attractive opportunity to improve the effciency and ease with which students can learn. This manuscript details recent advances towards using commonly-Available cloud computing services and advanced cyberinfrastructure support for improving the learning experience in bootcamp-style events. We cover the benets (and challenges) of using a server hosted remotely instead of relying on student laptops, discuss the technology that was used in order to make this possible, and give suggestions for how others could implement and improve upon this model for pedagogy and reproducibility.}, booktitle = {{ACM} {International} {Conference} {Proceeding} {Series}}, author = {Holdgraf, Christopher Ramsay and Culich, A. and Rokem, A. and Deniz, F. and Alegro, M. and Ushizima, D.}, year = {2017}, keywords = {Teaching, Bootcamps, Cloud computing, Data science, Docker, Pedagogy} } @article{holdgraf_encoding_2017, title = {Encoding and decoding models in cognitive electrophysiology}, volume = {11}, issn = {16625137}, doi = {10.3389/fnsys.2017.00061}, abstract = {© 2017 Holdgraf, Rieger, Micheli, Martin, Knight and Theunissen. Cognitive neuroscience has seen rapid growth in the size and complexity of data recorded from the human brain as well as in the computational tools available to analyze this data. This data explosion has resulted in an increased use of multivariate, model-based methods for asking neuroscience questions, allowing scientists to investigate multiple hypotheses with a single dataset, to use complex, time-varying stimuli, and to study the human brain under more naturalistic conditions. These tools come in the form of “Encoding” models, in which stimulus features are used to model brain activity, and “Decoding” models, in which neural features are used to generated a stimulus output. Here we review the current state of encoding and decoding models in cognitive electrophysiology and provide a practical guide toward conducting experiments and analyses in this emerging field. Our examples focus on using linear models in the study of human language and audition. We show how to calculate auditory receptive fields from natural sounds as well as how to decode neural recordings to predict speech. The paper aims to be a useful tutorial to these approaches, and a practical introduction to using machine learning and applied statistics to build models of neural activity. The data analytic approaches we discuss may also be applied to other sensory modalities, motor systems, and cognitive systems, and we cover some examples in these areas. In addition, a collection of Jupyter notebooks is publicly available as a complement to the material covered in this paper, providing code examples and tutorials for predictive modeling in python. The aimis to provide a practical understanding of predictivemodeling of human brain data and to propose best-practices in conducting these analyses.}, journal = {Frontiers in Systems Neuroscience}, author = {Holdgraf, Christopher Ramsay and Rieger, J.W. and Micheli, C. and Martin, S. and Knight, R.T. and Theunissen, F.E.}, year = {2017}, keywords = {Decoding models, Encoding models, Electrocorticography (ECoG), Electrophysiology/evoked potentials, Machine learning applied to neuroscience, Natural stimuli, Predictive modeling, Tutorials} } @book{ruby, title = {The Ruby Programming Language}, author = {Flanagan, David and Matsumoto, Yukihiro}, year = {2008}, publisher = {O'Reilly Media} }PKHNgΖNc c *jupyter_book/book_template/_build/intro.md--- title: 'Home' prev_page: url: title: '' next_page: url: /guide/01_overview title: 'Getting started' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Books with Jupyter and Jekyll Jupyter Books lets you build an online book using a collection of Jupyter Notebooks and Markdown files. Its output is similar to the excellent [Bookdown](https://bookdown.org/yihui/bookdown/) tool, and adds extra functionality for people running a Jupyter stack. For an example of a book built with Jupyter Books, see the [textbook for Data 100](https://www.textbook.ds100.org/) at UC Berkeley (or this website!) Here are a few features of Jupyter Books * A Command-Line Interface (CLI) to quickly create, build, and upgrade books. * Write book content in markdown and Jupyter Notebooks * Convert these into Jekyll pages that can be hosted for free on GitHub * Pages can have [Binder](https://mybinder.org), JupyterHub, or Theblab links automatically added for interactivity. * The website itself is based on Jekyll and is highly extensible. * There are lots of nifty HTML features under-the-hood, such as Turbolinks fast-navigation and click-to-copy in code cells. Check out other features in the [Features section](features/features). ## Getting started To get started, you may be interested in the following links. Here are a few links of interest: * **[Jupyter Book features](features/features)** is a quick demo and overview of Jupyter Books. * **[The Jupyter Book Guide](guide/01_overview)** will step you through the process of configuring and building your own Jupyter Book. ### Installation To install the Jupyter Book command-line interface (CLI), use `pip`! ``` pip install jupyter_book ``` ### Create a new book Once you've installed the CLI, create a new book using the demo book content (the website that you're viewing now) with this command: ``` jupyter-book create mybookname --demo ``` ### Build the markdown for your book Now, build the markdown that Jekyll will use for your book. Run this command: ``` jupyter-book build mybookname ``` ### That's it! You can now either push your book to GitHub and serve the demo with gh-pages, or modify the book with your own content. ## Acknowledgements Jupyter Books was originally created by [Sam Lau][sam] and [Chris Holdgraf][chris] with support of the **UC Berkeley Data Science Education Program and the [Berkeley Institute for Data Science](https://bids.berkeley.edu/)**. [sam]: http://www.samlau.me/ [chris]: https://predictablynoisy.com PKHNGEKK<jupyter_book/book_template/_build/01/what-is-data-science.md--- title: 'Data Science' prev_page: url: /https://github.com/jupyter/jupyter-book title: 'GitHub repository' next_page: url: /01/1/intro title: 'Introduction' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- What is Data Science ==================== Data Science is about drawing useful conclusions from large and diverse data sets through exploration, prediction, and inference. Exploration involves identifying patterns in information. Prediction involves using information we know to make informed guesses about values we wish we knew. Inference involves quantifying our degree of certainty: will those patterns we found also appear in new observations? How accurate are our predictions? Our primary tools for exploration are visualizations and descriptive statistics, for prediction are machine learning and optimization, and for inference are statistical tests and models. Statistics is a central component of data science because statistics studies how to make robust conclusions with incomplete information. Computing is a central component because programming allows us to apply analysis techniques to the large and diverse data sets that arise in real-world applications: not just numbers, but text, images, videos, and sensor readings. Data science is all of these things, but it is more than the sum of its parts because of the applications. Through understanding a particular domain, data scientists learn to ask appropriate questions about their data and correctly interpret the answers provided by our inferential and computational tools. PKHNyu /jupyter_book/book_template/_build/01/1/intro.md--- title: 'Introduction' prev_page: url: /01/what-is-data-science title: 'Data Science' next_page: url: /01/2/why-data-science title: 'Why Data Science?' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Chapter 1: Introduction ======================= Data are descriptions of the world around us, collected through observation and stored on computers. Computers enable us to infer properties of the world from these descriptions. Data science is the discipline of drawing conclusions from data using computation. There are three core aspects of effective data analysis: exploration, prediction, and inference. This text develops a consistent approach to all three, introducing statistical ideas and fundamental ideas in computer science concurrently. We focus on a minimal set of core techniques that they apply to a vast range of real-world applications. A foundation in data science requires not only understanding statistical and computational techniques, but also recognizing how they apply to real scenarios. For whatever aspect of the world we wish to study—whether it's the Earth's weather, the world's markets, political polls, or the human mind—data we collect typically offer an incomplete description of the subject at hand. A central challenge of data science is to make reliable conclusions using this partial information. In this endeavor, we will combine two essential tools: computation and randomization. For example, we may want to understand climate change trends using temperature observations. Computers will allow us to use all available information to draw conclusions. Rather than focusing only on the average temperature of a region, we will consider the whole range of temperatures together to construct a more nuanced analysis. Randomness will allow us to consider the many different ways in which incomplete information might be completed. Rather than assuming that temperatures vary in a particular way, we will learn to use randomness as a way to imagine many possible scenarios that are all consistent with the data we observe. Applying this approach requires learning to program a computer, and so this text interleaves a complete introduction to programming that assumes no prior knowledge. Readers with programming experience will find that we cover several topics in computation that do not appear in a typical introductory computer science curriculum. Data science also requires careful reasoning about quantities, but this text does not assume any background in mathematics or statistics beyond basic algebra. You will find very few equations in this text. Instead, techniques are described to readers in the same language in which they are described to the computers that execute them—a programming language. PKHN܈:jupyter_book/book_template/_build/01/2/why-data-science.md--- title: 'Why Data Science?' prev_page: url: /01/1/intro title: 'Introduction' next_page: url: /01/3/Plotting_the_Classics title: 'Plotting the Classics' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Why Data Science? ================= Most important decisions are made with only partial information and uncertain outcomes. However, the degree of uncertainty for many decisions can be reduced sharply by public access to large data sets and the computational tools required to analyze them effectively. Data-driven decision making has already transformed a tremendous breadth of industries, including finance, advertising, manufacturing, and real estate. At the same time, a wide range of academic disciplines are evolving rapidly to incorporate large-scale data analysis into their theory and practice. Studying data science enables individuals to bring these techniques to bear on their work, their scientific endeavors, and their personal decisions. Critical thinking has long been a hallmark of a rigorous education, but critiques are often most effective when supported by data. A critical analysis of any aspect of the world, may it be business or social science, involves inductive reasoning; conclusions can rarely been proven outright, only supported by the available evidence. Data science provides the means to make precise, reliable, and quantitative arguments about any set of observations. With unprecedented access to information and computing, critical thinking about any aspect of the world that can be measured would be incomplete without effective inferential techniques. The world has too many unanswered questions and difficult challenges to leave this critical reasoning to only a few specialists. All educated members of society can build the capacity to reason about data. The tools, techniques, and data sets are all readily available; this text aims to make them accessible to everyone. PKHN Jaa?jupyter_book/book_template/_build/01/3/Plotting_the_Classics.md--- redirect_from: - "/01/3/plotting-the-classics" interact_link: content/01/3/Plotting_the_Classics.ipynb kernel_name: python3 title: 'Plotting the Classics' prev_page: url: /01/2/why-data-science title: 'Why Data Science?' next_page: url: /01/3/subsection/subsections title: 'Subsection Demo 1' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- In this example, we will explore statistics for two classic novels: *The Adventures of Huckleberry Finn* by Mark Twain, and *Little Women* by Louisa May Alcott. The text of any book can be read by a computer at great speed. Books published before 1923 are currently in the *public domain*, meaning that everyone has the right to copy or use the text in any way. [Project Gutenberg](http://www.gutenberg.org/) is a website that publishes public domain books online. Using Python, we can load the text of these books directly from the web. This example is meant to illustrate some of the broad themes of this text. Don't worry if the details of the program don't yet make sense. Instead, focus on interpreting the images generated below. Later sections of the text will describe most of the features of the Python programming language used below. First, we read the text of both books into lists of chapters, called `huck_finn_chapters` and `little_women_chapters`. In Python, a name cannot contain any spaces, and so we will often use an underscore `_` to stand in for a space. The `=` in the lines below give a name on the left to the result of some computation described on the right. A *uniform resource locator* or *URL* is an address on the Internet for some content; in this case, the text of a book. The `#` symbol starts a comment, which is ignored by the computer but helpful for people reading the code. {:.input_area} ```python # Read two books, fast! huck_finn_url = 'https://www.inferentialthinking.com/chapters/01/3/huck_finn.txt' huck_finn_text = read_url(huck_finn_url) huck_finn_chapters = huck_finn_text.split('CHAPTER ')[44:] little_women_url = 'https://www.inferentialthinking.com/chapters/01/3/little_women.txt' little_women_text = read_url(little_women_url) little_women_chapters = little_women_text.split('CHAPTER ')[1:] ``` While a computer cannot understand the text of a book, it can provide us with some insight into the structure of the text. The name `huck_finn_chapters` is currently bound to a list of all the chapters in the book. We can place them into a table to see how each chapter begins. {:.input_area} ```python # Display the chapters of Huckleberry Finn in a table. Table().with_column('Chapters', huck_finn_chapters) ```
Chapters
I. YOU don't know about me without you have read a book ...
II. WE went tiptoeing along a path amongst the trees bac ...
III. WELL, I got a good going-over in the morning from o ...
IV. WELL, three or four months run along, and it was wel ...
V. I had shut the door to. Then I turned around and ther ...
VI. WELL, pretty soon the old man was up and around agai ...
VII. "GIT up! What you 'bout?" I opened my eyes and look ...
VIII. THE sun was up so high when I waked that I judged ...
IX. I wanted to go and look at a place right about the m ...
X. AFTER breakfast I wanted to talk about the dead man a ...

... (33 rows omitted)

Each chapter begins with a chapter number in Roman numerals, followed by the first sentence of the chapter. Project Gutenberg has printed the first word of each chapter in upper case. PKHNi)|@jupyter_book/book_template/_build/01/3/subsection/subsections.md--- title: 'Subsection Demo 1' prev_page: url: /01/3/Plotting_the_Classics title: 'Plotting the Classics' next_page: url: /01/3/subsection/subsectiontwo title: 'Subsection Demo 2' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Subsections You can also add subsections to your markdown files. These will be displayed along with the sidebar!PKHNNr*\\Bjupyter_book/book_template/_build/01/3/subsection/subsectiontwo.md--- title: 'Subsection Demo 2' prev_page: url: /01/3/subsection/subsections title: 'Subsection Demo 1' next_page: url: /02/causality-and-experiments title: 'Causality and Experiments' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # A second subsection page And here's another subsection page!PKHNa Ajupyter_book/book_template/_build/02/causality-and-experiments.md--- title: 'Causality and Experiments' prev_page: url: /01/3/subsection/subsectiontwo title: 'Subsection Demo 2' next_page: url: /02/1/observation-and-visualization-john-snow-and-the-broad-street-pump title: 'John Snow and the Broad Street Pump' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Causality and Experiments ====================== *"These problems are, and will probably ever remain, among the inscrutable secrets of nature. They belong to a class of questions radically inaccessible to the human intelligence."* —The Times of London, September 1849, on how cholera is contracted and spread Does the death penalty have a deterrent effect? Is chocolate good for you? What causes breast cancer? All of these questions attempt to assign a cause to an effect. A careful examination of data can help shed light on questions like these. In this section you will learn some of the fundamental concepts involved in establishing causality. Observation is a key to good science. An *observational study* is one in which scientists make conclusions based on data that they have observed but had no hand in generating. In data science, many such studies involve observations on a group of individuals, a factor of interest called a *treatment*, and an *outcome* measured on each individual. It is easiest to think of the individuals as people. In a study of whether chocolate is good for the health, the individuals would indeed be people, the treatment would be eating chocolate, and the outcome might be a measure of blood pressure. But individuals in observational studies need not be people. In a study of whether the death penalty has a deterrent effect, the individuals could be the 50 states of the union. A state law allowing the death penalty would be the treatment, and an outcome could be the state’s murder rate. The fundamental question is whether the treatment has an effect on the outcome. Any relation between the treatment and the outcome is called an *association*. If the treatment causes the outcome to occur, then the association is *causal*. *Causality* is at the heart of all three questions posed at the start of this section. For example, one of the questions was whether chocolate directly causes improvements in health, not just whether there there is a relation between chocolate and health. The establishment of causality often takes place in two stages. First, an association is observed. Next, a more careful analysis leads to a decision about causality. PKHNKNllkjupyter_book/book_template/_build/02/1/observation-and-visualization-john-snow-and-the-broad-street-pump.md--- title: 'John Snow and the Broad Street Pump' prev_page: url: /02/causality-and-experiments title: 'Causality and Experiments' next_page: url: /02/2/snow-s-grand-experiment title: 'Snow’s “Grand Experiment”' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Observation and Visualization: John Snow and the Broad Street Pump ------------------------------------------------------------------ One of the earliest examples of astute observation eventually leading to the establishment of causality dates back more than 150 years. To get your mind into the right timeframe, try to imagine London in the 1850’s. It was the world’s wealthiest city but many of its people were desperately poor. Charles Dickens, then at the height of his fame, was writing about their plight. Disease was rife in the poorer parts of the city, and cholera was among the most feared. It was not yet known that germs cause disease; the leading theory was that “miasmas” were the main culprit. Miasmas manifested themselves as bad smells, and were thought to be invisible poisonous particles arising out of decaying matter. Parts of London did smell very bad, especially in hot weather. To protect themselves against infection, those who could afford to held sweet-smelling things to their noses. For several years, a doctor by the name of John Snow had been following the devastating waves of cholera that hit England from time to time. The disease arrived suddenly and was almost immediately deadly: people died within a day or two of contracting it, hundreds could die in a week, and the total death toll in a single wave could reach tens of thousands. Snow was skeptical of the miasma theory. He had noticed that while entire households were wiped out by cholera, the people in neighboring houses sometimes remained completely unaffected. As they were breathing the same air—and miasmas—as their neighbors, there was no compelling association between bad smells and the incidence of cholera. Snow had also noticed that the onset of the disease almost always involved vomiting and diarrhea. He therefore believed that that infection was carried by something people ate or drank, not by the air that they breathed. His prime suspect was water contaminated by sewage. At the end of August 1854, cholera struck in the overcrowded Soho district of London. As the deaths mounted, Snow recorded them diligently, using a method that went on to become standard in the study of how diseases spread: *he drew a map*. On a street map of the district, he recorded the location of each death. Here is Snow’s original map. Each black bar represents one death. The black discs mark the locations of water pumps. The map displays a striking revelation–the deaths are roughly clustered around the Broad Street pump. ![Snow’s Cholera Map](../../images/snow_map.jpg) Snow studied his map carefully and investigated the apparent anomalies. All of them implicated the Broad Street pump. For example: - There were deaths in houses that were nearer the Rupert Street pump than the Broad Street pump. Though the Rupert Street pump was closer as the crow flies, it was less convenient to get to because of dead ends and the layout of the streets. The residents in those houses used the Broad Street pump instead. - There were no deaths in two blocks just east of the pump. That was the location of the Lion Brewery, where the workers drank what they brewed. If they wanted water, the brewery had its own well. - There were scattered deaths in houses several blocks away from the Broad Street pump. Those were children who drank from the Broad Street pump on their way to school. The pump’s water was known to be cool and refreshing. The final piece of evidence in support of Snow’s theory was provided by two isolated deaths in the leafy and genteel Hampstead area, quite far from Soho. Snow was puzzled by these until he learned that the deceased were Mrs. Susannah Eley, who had once lived in Broad Street, and her niece. Mrs. Eley had water from the Broad Street pump delivered to her in Hampstead every day. She liked its taste. Later it was discovered that a cesspit that was just a few feet away from the well of the Broad Street pump had been leaking into the well. Thus the pump’s water was contaminated by sewage from the houses of cholera victims. Snow used his map to convince local authorities to remove the handle of the Broad Street pump. Though the cholera epidemic was already on the wane when he did so, it is possible that the disabling of the pump prevented many deaths from future waves of the disease. The removal of the Broad Street pump handle has become the stuff of legend. At the Centers for Disease Control (CDC) in Atlanta, when scientists look for simple answers to questions about epidemics, they sometimes ask each other, “Where is the handle to this pump?” Snow’s map is one of the earliest and most powerful uses of data visualization. Disease maps of various kinds are now a standard tool for tracking epidemics. **Towards Causality** Though the map gave Snow a strong indication that the cleanliness of the water supply was the key to controlling cholera, he was still a long way from a convincing scientific argument that contaminated water was causing the spread of the disease. To make a more compelling case, he had to use the method of *comparison*. Scientists use comparison to identify an association between a treatment and an outcome. They compare the outcomes of a group of individuals who got the treatment (the *treatment group*) to the outcomes of a group who did not (the *control group*). For example, researchers today might compare the average murder rate in states that have the death penalty with the average murder rate in states that don’t. If the results are different, that is evidence for an association. To determine causation, however, even more care is needed. PKHNL@r Ajupyter_book/book_template/_build/02/2/snow-s-grand-experiment.md--- title: 'Snow’s “Grand Experiment”' prev_page: url: /02/1/observation-and-visualization-john-snow-and-the-broad-street-pump title: 'John Snow and the Broad Street Pump' next_page: url: /02/3/establishing-causality title: 'Establishing Causality' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Snow’s “Grand Experiment” ------------------------- Encouraged by what he had learned in Soho, Snow completed a more thorough analysis of cholera deaths. For some time, he had been gathering data on cholera deaths in an area of London that was served by two water companies. The Lambeth water company drew its water upriver from where sewage was discharged into the River Thames. Its water was relatively clean. But the Southwark and Vauxhall (S&V) company drew its water below the sewage discharge, and thus its supply was contaminated. The map below shows the areas served by the two companies. Snow honed in on the region where the two service areas overlap. ![Snow’s Other Map](../../images/snow_map2.jpg) Snow noticed that there was no systematic difference between the people who were supplied by S&V and those supplied by Lambeth. “Each company supplies both rich and poor, both large houses and small; there is no difference either in the condition or occupation of the persons receiving the water of the different Companies … there is no difference whatever in the houses or the people receiving the supply of the two Water Companies, or in any of the physical conditions with which they are surrounded …” The only difference was in the water supply, “one group being supplied with water containing the sewage of London, and amongst it, whatever might have come from the cholera patients, the other group having water quite free from impurity.” Confident that he would be able to arrive at a clear conclusion, Snow summarized his data in the table below. | Supply Area | Number of houses | cholera deaths | deaths per 10,000 houses | |----------------|------------------|----------------|--------------------------| | S&V | 40,046 | 1,263 | 315 | | Lambeth | 26,107 | 98 | 37 | | Rest of London | 256,423 | 1,422 | 59 | The numbers pointed accusingly at S&V. The death rate from cholera in the S&V houses was almost ten times the rate in the houses supplied by Lambeth. PKHN( @jupyter_book/book_template/_build/02/3/establishing-causality.md--- title: 'Establishing Causality' prev_page: url: /02/2/snow-s-grand-experiment title: 'Snow’s “Grand Experiment”' next_page: url: /02/4/randomization title: 'Randomization' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Establishing Causality ---------------------- In the language developed earlier in the section, you can think of the people in the S&V houses as the treatment group, and those in the Lambeth houses at the control group. A crucial element in Snow’s analysis was that the people in the two groups were comparable to each other, apart from the treatment. In order to establish whether it was the water supply that was causing cholera, Snow had to compare two groups that were similar to each other in all but one aspect–their water supply. Only then would he be able to ascribe the differences in their outcomes to the water supply. If the two groups had been different in some other way as well, it would have been difficult to point the finger at the water supply as the source of the disease. For example, if the treatment group consisted of factory workers and the control group did not, then differences between the outcomes in the two groups could have been due to the water supply, or to factory work, or both, or to any other characteristic that made the groups different from each other. The final picture would have been much more fuzzy. Snow’s brilliance lay in identifying two groups that would make his comparison clear. He had set out to establish a causal relation between contaminated water and cholera infection, and to a great extent he succeeded, even though the miasmatists ignored and even ridiculed him. Of course, Snow did not understand the detailed mechanism by which humans contract cholera. That discovery was made in 1883, when the German scientist Robert Koch isolated the *Vibrio cholerae*, the bacterium that enters the human small intestine and causes cholera. In fact the *Vibrio cholerae* had been identified in 1854 by Filippo Pacini in Italy, just about when Snow was analyzing his data in London. Because of the dominance of the miasmatists in Italy, Pacini’s discovery languished unknown. But by the end of the 1800’s, the miasma brigade was in retreat. Subsequent history has vindicated Pacini and John Snow. Snow’s methods led to the development of the field of *epidemiology*, which is the study of the spread of diseases. **Confounding** Let us now return to more modern times, armed with an important lesson that we have learned along the way: In an observational study, if the treatment and control groups differ in ways other than the treatment, it is difficult to make conclusions about causality. An underlying difference between the two groups (other than the treatment) is called a *confounding factor*, because it might confound you (that is, mess you up) when you try to reach a conclusion. **Example: Coffee and lung cancer.** Studies in the 1960’s showed that coffee drinkers had higher rates of lung cancer than those who did not drink coffee. Because of this, some people identified coffee as a cause of lung cancer. But coffee does not cause lung cancer. The analysis contained a confounding factor – smoking. In those days, coffee drinkers were also likely to have been smokers, and smoking does cause lung cancer. Coffee drinking was associated with lung cancer, but it did not cause the disease. Confounding factors are common in observational studies. Good studies take great care to reduce confounding. PKHN   7jupyter_book/book_template/_build/02/4/randomization.md--- title: 'Randomization' prev_page: url: /02/3/establishing-causality title: 'Establishing Causality' next_page: url: /02/5/endnote title: 'Endnote' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Randomization -------------- An excellent way to avoid confounding is to assign individuals to the treatment and control groups *at random*, and then administer the treatment to those who were assigned to the treatment group. Randomization keeps the two groups similar apart from the treatment. If you are able to randomize individuals into the treatment and control groups, you are running a *randomized controlled experiment*, also known as a *randomized controlled trial* (RCT). Sometimes, people’s responses in an experiment are influenced by their knowing which group they are in. So you might want to run a *blind* experiment in which individuals do not know whether they are in the treatment group or the control group. To make this work, you will have to give the control group a *placebo*, which is something that looks exactly like the treatment but in fact has no effect. Randomized controlled experiments have long been a gold standard in the medical field, for example in establishing whether a new drug works. They are also becoming more commonly used in other fields such as economics. **Example: Welfare subsidies in Mexico.** In Mexican villages in the 1990’s, children in poor families were often not enrolled in school. One of the reasons was that the older children could go to work and thus help support the family. Santiago Levy , a minister in Mexican Ministry of Finance, set out to investigate whether welfare programs could be used to increase school enrollment and improve health conditions. He conducted an RCT on a set of villages, selecting some of them at random to receive a new welfare program called PROGRESA. The program gave money to poor families if their children went to school regularly and the family used preventive health care. More money was given if the children were in secondary school than in primary school, to compensate for the children’s lost wages, and more money was given for girls attending school than for boys. The remaining villages did not get this treatment, and formed the control group. Because of the randomization, there were no confounding factors and it was possible to establish that PROGRESA increased school enrollment. For boys, the enrollment increased from 73% in the control group to 77% in the PROGRESA group. For girls, the increase was even greater, from 67% in the control group to almost 75% in the PROGRESA group. Due to the success of this experiment, the Mexican government supported the program under the new name OPORTUNIDADES, as an investment in a healthy and well educated population. In some situations it might not be possible to carry out a randomized controlled experiment, even when the aim is to investigate causality. For example, suppose you want to study the effects of alcohol consumption during pregnancy, and you randomly assign some pregnant women to your “alcohol” group. You should not expect cooperation from them if you present them with a drink. In such situations you will almost invariably be conducting an observational study, not an experiment. Be alert for confounding factors. PKHNm}}1jupyter_book/book_template/_build/02/5/endnote.md--- title: 'Endnote' prev_page: url: /02/4/randomization title: 'Randomization' next_page: url: /03/programming-in-python title: 'Programming in Python' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Endnote ------- In the terminology of that we have developed, John Snow conducted an observational study, not a randomized experiment. But he called his study a “grand experiment” because, as he wrote, “No fewer than three hundred thousand people … were divided into two groups without their choice, and in most cases, without their knowledge …” Studies such as Snow’s are sometimes called “natural experiments.” However, true randomization does not simply mean that the treatment and control groups are selected “without their choice.” The method of randomization can be as simple as tossing a coin. It may also be quite a bit more complex. But every method of randomization consists of a sequence of carefully defined steps that allow chances to be specified mathematically. This has two important consequences. 1. It allows us to account–mathematically–for the possibility that randomization produces treatment and control groups that are quite different from each other. 2. It allows us to make precise mathematical statements about differences between the treatment and control groups. This in turn helps us make justifiable conclusions about whether the treatment has any effect. In this course, you will learn how to conduct and analyze your own randomized experiments. That will involve more detail than has been presented in this section. For now, just focus on the main idea: to try to establish causality, run a randomized controlled experiment if possible. If you are conducting an observational study, you might be able to establish association but not causation. Be extremely careful about confounding factors before making conclusions about causality based on an observational study. **Terminology** * observational study * treatment * outcome * association * causal association * causality * comparison * treatment group * control group * epidemiology * confounding * randomization * randomized controlled experiment * randomized controlled trial (RCT) * blind * placebo **Fun facts** 1. John Snow is sometimes called the father of epidemiology, but he was an anesthesiologist by profession. One of his patients was Queen Victoria, who was an early recipient of anesthetics during childbirth. 2. Florence Nightingale, the originator of modern nursing practices and famous for her work in the Crimean War, was a die-hard miasmatist. She had no time for theories about contagion and germs, and was not one for mincing her words. “There is no end to the absurdities connected with this doctrine,” she said. “Suffice it to say that in the ordinary sense of the word, there is no proof such as would be admitted in any scientific enquiry that there is any such thing as contagion.” 3. A later RCT established that the conditions on which PROGRESA insisted – children going to school, preventive health care – were not necessary to achieve increased enrollment. Just the financial boost of the welfare payments was sufficient. **Good reads** [*The Strange Case of the Broad Street Pump: John Snow and the Mystery of Cholera*](http://www.ucpress.edu/book.php?isbn=9780520250499) by Sandra Hempel, published by our own University of California Press, reads like a whodunit. It was one of the main sources for this section's account of John Snow and his work. A word of warning: some of the contents of the book are stomach-churning. [*Poor Economics*](http://www.pooreconomics.com), the best seller by Abhijit V. Banerjee and Esther Duflo of MIT, is an accessible and lively account of ways to fight global poverty. It includes numerous examples of RCTs, including the PROGRESA example in this section. PKHN!T#//=jupyter_book/book_template/_build/03/programming-in-python.md--- title: 'Programming in Python' prev_page: url: /02/5/endnote title: 'Endnote' next_page: url: /03/1/Expressions title: 'Expressions' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Programming in Python ===================== Programming can dramatically improve our ability to collect and analyze information about the world, which in turn can lead to discoveries through the kind of careful reasoning demonstrated in the previous section. In data science, the purpose of writing a program is to instruct a computer to carry out the steps of an analysis. Computers cannot study the world on their own. People must describe precisely what steps the computer should take in order to collect and analyze data, and those steps are expressed through programs. PKHNRnjj5jupyter_book/book_template/_build/03/1/Expressions.md--- redirect_from: - "/03/1/expressions" interact_link: content/03/1/Expressions.ipynb kernel_name: python3 title: 'Expressions' prev_page: url: /03/programming-in-python title: 'Programming in Python' next_page: url: /03/2/Names title: 'Names' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # 3.1 Expressions Programming languages are much simpler than human languages. Nonetheless, there are some rules of grammar to learn in any language, and that is where we will begin. In this text, we will use the [Python](https://www.python.org/) programming language. Learning the grammar rules is essential, and the same rules used in the most basic programs are also central to more sophisticated programs. Programs are made up of *expressions*, which describe to the computer how to combine pieces of data. For example, a multiplication expression consists of a `*` symbol between two numerical expressions. Expressions, such as `3 * 4`, are *evaluated* by the computer. The value (the result of *evaluation*) of the last expression in each cell, `12` in this case, is displayed below the cell. {:.input_area} ```python 3 * 4 ``` {:.output .output_data_text} ``` 12 ``` The grammar rules of a programming language are rigid. In Python, the `*` symbol cannot appear twice in a row. The computer will not try to interpret an expression that differs from its prescribed expression structures. Instead, it will show a `SyntaxError` error. The *Syntax* of a language is its set of grammar rules, and a `SyntaxError` indicates that an expression structure doesn't match any of the rules of the language. {:.input_area} ```python 3 * * 4 ``` {:.output .output_traceback_line} ``` File "", line 1 3 * * 4 ^ SyntaxError: invalid syntax ``` Small changes to an expression can change its meaning entirely. Below, the space between the `*`'s has been removed. Because `**` appears between two numerical expressions, the expression is a well-formed *exponentiation* expression (the first number raised to the power of the second: 3 times 3 times 3 times 3). The symbols `*` and `**` are called *operators*, and the values they combine are called *operands*. {:.input_area} ```python 3 ** 4 ``` {:.output .output_data_text} ``` 81 ``` **Common Operators.** Data science often involves combining numerical values, and the set of operators in a programming language are designed to so that expressions can be used to express any sort of arithmetic. In Python, the following operators are essential. | Expression Type | Operator | Example | Value | |-----------------|----------|------------|-----------| | Addition | `+` | `2 + 3` | `5` | | Subtraction | `-` | `2 - 3` | `-1` | | Multiplication | `*` | `2 * 3` | `6` | | Division | `/` | `7 / 3` | `2.66667` | | Remainder | `%` | `7 % 3` | `1` | | Exponentiation | `**` | `2 ** 0.5` | `1.41421` | Python expressions obey the same familiar rules of *precedence* as in algebra: multiplication and division occur before addition and subtraction. Parentheses can be used to group together smaller expressions within a larger expression. {:.input_area} ```python 1 + 2 * 3 * 4 * 5 / 6 ** 3 + 7 + 8 - 9 + 10 ``` {:.output .output_data_text} ``` 17.555555555555557 ``` {:.input_area} ```python 1 + 2 * (3 * 4 * 5 / 6) ** 3 + 7 + 8 - 9 + 10 ``` {:.output .output_data_text} ``` 2017.0 ``` This chapter introduces many types of expressions. Learning to program involves trying out everything you learn in combination, investigating the behavior of the computer. What happens if you divide by zero? What happens if you divide twice in a row? You don't always need to ask an expert (or the Internet); many of these details can be discovered by trying them out yourself. PKHNG/jupyter_book/book_template/_build/03/2/Names.md--- redirect_from: - "/03/2/names" interact_link: content/03/2/Names.ipynb kernel_name: python3 title: 'Names' prev_page: url: /03/1/Expressions title: 'Expressions' next_page: url: /03/3/Calls title: 'Call Expressions' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- ## 3.2 Names Names are given to values in Python using an *assignment* statement. In an assignment, a name is followed by `=`, which is followed by any expression. The value of the expression to the right of `=` is *assigned* to the name. Once a name has a value assigned to it, the value will be substituted for that name in future expressions. {:.input_area} ```python a = 10 b = 20 a + b ``` {:.output .output_data_text} ``` 30 ``` A previously assigned name can be used in the expression to the right of `=`. {:.input_area} ```python quarter = 1/4 half = 2 * quarter half ``` {:.output .output_data_text} ``` 0.5 ``` However, only the current value of an expression is assigned to a name. If that value changes later, names that were defined in terms of that value will not change automatically. {:.input_area} ```python quarter = 4 half ``` {:.output .output_data_text} ``` 0.5 ``` Names must start with a letter, but can contain both letters and numbers. A name cannot contain a space; instead, it is common to use an underscore character `_` to replace each space. Names are only as useful as you make them; it's up to the programmer to choose names that are easy to interpret. Typically, more meaningful names can be invented than `a` and `b`. For example, to describe the sales tax on a $5 purchase in Berkeley, CA, the following names clarify the meaning of the various quantities involved. {:.input_area} ```python purchase_price = 5 state_tax_rate = 0.075 county_tax_rate = 0.02 city_tax_rate = 0 sales_tax_rate = state_tax_rate + county_tax_rate + city_tax_rate sales_tax = purchase_price * sales_tax_rate sales_tax ``` {:.output .output_data_text} ``` 0.475 ``` PKHNL/jupyter_book/book_template/_build/03/3/Calls.md--- redirect_from: - "/03/3/calls" interact_link: content/03/3/Calls.ipynb kernel_name: Python [Root] title: 'Call Expressions' prev_page: url: /03/2/Names title: 'Names' next_page: url: /03/4/Introduction_to_Tables title: 'Introduction to Tables' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- *Call expressions* invoke functions, which are named operations. The name of the function appears first, followed by expressions in parentheses. {:.input_area} ```python abs(-12) ``` {:.output .output_data_text} ``` 12 ``` {:.input_area} ```python round(5 - 1.3) ``` {:.output .output_data_text} ``` 4 ``` {:.input_area} ```python max(2, 2 + 3, 4) ``` {:.output .output_data_text} ``` 5 ``` In this last example, the `max` function is *called* on three *arguments*: 2, 5, and 4. The value of each expression within parentheses is passed to the function, and the function *returns* the final value of the full call expression. The `max` function can take any number of arguments and returns the maximum. A few functions are available by default, such as `abs` and `round`, but most functions that are built into the Python language are stored in a collection of functions called a *module*. An *import statement* is used to provide access to a module, such as `math` or `operator`. {:.input_area} ```python import math import operator math.sqrt(operator.add(4, 5)) ``` {:.output .output_data_text} ``` 3.0 ``` An equivalent expression could be expressed using the `+` and `**` operators instead. {:.input_area} ```python (4 + 5) ** 0.5 ``` {:.output .output_data_text} ``` 3.0 ``` Operators and call expressions can be used together in an expression. The *percent difference* between two values is used to compare values for which neither one is obviously `initial` or `changed`. For example, in 2014 Florida farms produced 2.72 billion eggs while Iowa farms produced 16.25 billion eggs (http://quickstats.nass.usda.gov/). The percent difference is 100 times the absolute value of the difference between the values, divided by their average. In this case, the difference is larger than the average, and so the percent difference is greater than 100. {:.input_area} ```python florida = 2.72 iowa = 16.25 100*abs(florida-iowa)/((florida+iowa)/2) ``` {:.output .output_data_text} ``` 142.6462836056932 ``` Learning how different functions behave is an important part of learning a programming language. A Jupyter notebook can assist in remembering the names and effects of different functions. When editing a code cell, press the *tab* key after typing the beginning of a name to bring up a list of ways to complete that name. For example, press *tab* after `math.` to see all of the functions available in the `math` module. Typing will narrow down the list of options. To learn more about a function, place a `?` after its name. For example, typing `math.log?` will bring up a description of the `log` function in the `math` module. {:.input_area} ```python math.log? ``` log(x[, base]) Return the logarithm of x to the given base. If the base not specified, returns the natural logarithm (base e) of x. The square brackets in the example call indicate that an argument is optional. That is, `log` can be called with either one or two arguments. {:.input_area} ```python math.log(16, 2) ``` {:.output .output_data_text} ``` 4.0 ``` {:.input_area} ```python math.log(16)/math.log(2) ``` {:.output .output_data_text} ``` 4.0 ``` The list of [Python's built-in functions](https://docs.python.org/3/library/functions.html) is quite long and includes many functions that are never needed in data science applications. The list of [mathematical functions in the `math` module](https://docs.python.org/3/library/math.html) is similarly long. This text will introduce the most important functions in context, rather than expecting the reader to memorize or understand these lists. PKHN;w8[8[@jupyter_book/book_template/_build/03/4/Introduction_to_Tables.md--- redirect_from: - "/03/4/introduction-to-tables" interact_link: content/03/4/Introduction_to_Tables.ipynb kernel_name: Python [Root] title: 'Introduction to Tables' prev_page: url: /03/3/Calls title: 'Call Expressions' next_page: url: /04/Types title: 'Data Types' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- We can now apply Python to analyze data. We will work with data stored in Table structures. Tables are a fundamental way of representing data sets. A table can be viewed in two ways: * a sequence of named columns that each describe a single attribute of all entries in a data set, or * a sequence of rows that each contain all information about a single individual in a data set. We will study tables in great detail in the next several chapters. For now, we will just introduce a few methods without going into technical details. The table `cones` has been imported for us; later we will see how, but here we will just work with it. First, let's take a look at it. {:.input_area} ```python cones ```
Flavor Color Price
strawberry pink 3.55
chocolate light brown 4.75
chocolate dark brown 5.25
strawberry pink 5.25
chocolate dark brown 5.25
bubblegum pink 4.75
The table has six rows. Each row corresponds to one ice cream cone. The ice cream cones are the *individuals*. Each cone has three attributes: flavor, color, and price. Each column contains the data on one of these attributes, and so all the entries of any single column are of the same kind. Each column has a label. We will refer to columns by their labels. A table method is just like a function, but it must operate on a table. So the call looks like `name_of_table.method(arguments)` For example, if you want to see just the first two rows of a table, you can use the table method `show`. {:.input_area} ```python cones.show(2) ```
Flavor Color Price
strawberry pink 3.55
chocolate light brown 4.75

... (4 rows omitted)

You can replace 2 by any number of rows. If you ask for more than six, you will only get six, because `cones` only has six rows. ### Choosing Sets of Columns The method `select` creates a new table consisting of only the specified columns. {:.input_area} ```python cones.select('Flavor') ```
Flavor
strawberry
chocolate
chocolate
strawberry
chocolate
bubblegum
This leaves the original table unchanged. {:.input_area} ```python cones ```
Flavor Color Price
strawberry pink 3.55
chocolate light brown 4.75
chocolate dark brown 5.25
strawberry pink 5.25
chocolate dark brown 5.25
bubblegum pink 4.75
You can select more than one column, by separating the column labels by commas. {:.input_area} ```python cones.select('Flavor', 'Price') ```
Flavor Price
strawberry 3.55
chocolate 4.75
chocolate 5.25
strawberry 5.25
chocolate 5.25
bubblegum 4.75
You can also *drop* columns you don't want. The table above can be created by dropping the `Color` column. {:.input_area} ```python cones.drop('Color') ```
Flavor Price
strawberry 3.55
chocolate 4.75
chocolate 5.25
strawberry 5.25
chocolate 5.25
bubblegum 4.75
You can name this new table and look at it again by just typing its name. {:.input_area} ```python no_colors = cones.drop('Color') no_colors ```
Flavor Price
strawberry 3.55
chocolate 4.75
chocolate 5.25
strawberry 5.25
chocolate 5.25
bubblegum 4.75
Like `select`, the `drop` method creates a smaller table and leaves the original table unchanged. In order to explore your data, you can create any number of smaller tables by using choosing or dropping columns. It will do no harm to your original data table. ### Sorting Rows The `sort` method creates a new table by arranging the rows of the original table in ascending order of the values in the specified column. Here the `cones` table has been sorted in ascending order of the price of the cones. {:.input_area} ```python cones.sort('Price') ```
Flavor Color Price
strawberry pink 3.55
chocolate light brown 4.75
bubblegum pink 4.75
chocolate dark brown 5.25
strawberry pink 5.25
chocolate dark brown 5.25
To sort in descending order, you can use an *optional* argument to `sort`. As the name implies, optional arguments don't have to be used, but they can be used if you want to change the default behavior of a method. By default, `sort` sorts in increasing order of the values in the specified column. To sort in decreasing order, use the optional argument `descending=True`. {:.input_area} ```python cones.sort('Price', descending=True) ```
Flavor Color Price
chocolate dark brown 5.25
strawberry pink 5.25
chocolate dark brown 5.25
bubblegum pink 4.75
chocolate light brown 4.75
strawberry pink 3.55
Like `select` and `drop`, the `sort` method leaves the original table unchanged. ### Selecting Rows that Satisfy a Condition The `where` method creates a new table consisting only of the rows that satisfy a given condition. In this section we will work with a very simple condition, which is that the value in a specified column must be equal to a value that we also specify. Thus the `where` method has two arguments. The code in the cell below creates a table consisting only of the rows corresponding to chocolate cones. {:.input_area} ```python cones.where('Flavor', 'chocolate') ```
Flavor Color Price
chocolate light brown 4.75
chocolate dark brown 5.25
chocolate dark brown 5.25
The arguments, separated by a comma, are the label of the column and the value we are looking for in that column. The `where` method can also be used when the condition that the rows must satisfy is more complicated. In those situations the call will be a little more complicated as well. It is important to provide the value exactly. For example, if we specify `Chocolate` instead of `chocolate`, then `where` correctly finds no rows where the flavor is `Chocolate`. {:.input_area} ```python cones.where('Flavor', 'Chocolate') ```
Flavor Color Price
Like all the other table methods in this section, `where` leaves the original table unchanged. ### Example: Salaries in the NBA "The NBA is the highest paying professional sports league in the world," [reported CNN](http://edition.cnn.com/2015/12/04/sport/gallery/highest-paid-nba-players/) in March 2016. The table `nba` contains the [salaries of all National Basketball Association players](https://www.statcrunch.com/app/index.php?dataid=1843341) in 2015-2016. Each row represents one player. The columns are: | **Column Label** | Description | |--------------------|-----------------------------------------------------| | `PLAYER` | Player's name | | `POSITION` | Player's position on team | | `TEAM` | Team name | |`SALARY` | Player's salary in 2015-2016, in millions of dollars| The code for the positions is PG (Point Guard), SG (Shooting Guard), PF (Power Forward), SF (Small Forward), and C (Center). But what follows doesn't involve details about how basketball is played. The first row shows that Paul Millsap, Power Forward for the Atlanta Hawks, had a salary of almost $\$18.7$ million in 2015-2016. {:.input_area} ```python nba ```
PLAYER POSITION TEAM SALARY
Paul Millsap PF Atlanta Hawks 18.6717
Al Horford C Atlanta Hawks 12
Tiago Splitter C Atlanta Hawks 9.75625
Jeff Teague PG Atlanta Hawks 8
Kyle Korver SG Atlanta Hawks 5.74648
Thabo Sefolosha SF Atlanta Hawks 4
Mike Scott PF Atlanta Hawks 3.33333
Kent Bazemore SF Atlanta Hawks 2
Dennis Schroder PG Atlanta Hawks 1.7634
Tim Hardaway Jr. SG Atlanta Hawks 1.30452

... (407 rows omitted)

Fans of Stephen Curry can find his row by using `where`. {:.input_area} ```python nba.where('PLAYER', 'Stephen Curry') ```
PLAYER POSITION TEAM SALARY
Stephen Curry PG Golden State Warriors 11.3708
We can also create a new table called `warriors` consisting of just the data for the Golden State Warriors. {:.input_area} ```python warriors = nba.where('TEAM', 'Golden State Warriors') warriors ```
PLAYER POSITION TEAM SALARY
Klay Thompson SG Golden State Warriors 15.501
Draymond Green PF Golden State Warriors 14.2609
Andrew Bogut C Golden State Warriors 13.8
Andre Iguodala SF Golden State Warriors 11.7105
Stephen Curry PG Golden State Warriors 11.3708
Jason Thompson PF Golden State Warriors 7.00847
Shaun Livingston PG Golden State Warriors 5.54373
Harrison Barnes SF Golden State Warriors 3.8734
Marreese Speights C Golden State Warriors 3.815
Leandro Barbosa SG Golden State Warriors 2.5

... (4 rows omitted)

By default, the first 10 lines of a table are displayed. You can use `show` to display more or fewer. To display the entire table, use `show` with no argument in the parentheses. {:.input_area} ```python warriors.show() ```
PLAYER POSITION TEAM SALARY
Klay Thompson SG Golden State Warriors 15.501
Draymond Green PF Golden State Warriors 14.2609
Andrew Bogut C Golden State Warriors 13.8
Andre Iguodala SF Golden State Warriors 11.7105
Stephen Curry PG Golden State Warriors 11.3708
Jason Thompson PF Golden State Warriors 7.00847
Shaun Livingston PG Golden State Warriors 5.54373
Harrison Barnes SF Golden State Warriors 3.8734
Marreese Speights C Golden State Warriors 3.815
Leandro Barbosa SG Golden State Warriors 2.5
Festus Ezeli C Golden State Warriors 2.00875
Brandon Rush SF Golden State Warriors 1.27096
Kevon Looney SF Golden State Warriors 1.13196
Anderson Varejao PF Golden State Warriors 0.289755
The `nba` table is sorted in alphabetical order of the team names. To see how the players were paid in 2015-2016, it is useful to sort the data by salary. Remember that by default, the sorting is in increasing order. {:.input_area} ```python nba.sort('SALARY') ```
PLAYER POSITION TEAM SALARY
Thanasis Antetokounmpo SF New York Knicks 0.030888
Jordan McRae SG Phoenix Suns 0.049709
Cory Jefferson PF Phoenix Suns 0.049709
Elliot Williams SG Memphis Grizzlies 0.055722
Orlando Johnson SG Phoenix Suns 0.055722
Phil Pressey PG Phoenix Suns 0.055722
Keith Appling PG Orlando Magic 0.061776
Sean Kilpatrick SG Denver Nuggets 0.099418
Erick Green PG Utah Jazz 0.099418
Jeff Ayres PF Los Angeles Clippers 0.111444

... (407 rows omitted)

These figures are somewhat difficult to compare as some of these players changed teams during the season and received salaries from more than one team; only the salary from the last team appears in the table. The CNN report is about the other end of the salary scale – the players who are among the highest paid in the world. To identify these players we can sort in descending order of salary and look at the top few rows. {:.input_area} ```python nba.sort('SALARY', descending=True) ```
PLAYER POSITION TEAM SALARY
Kobe Bryant SF Los Angeles Lakers 25
Joe Johnson SF Brooklyn Nets 24.8949
LeBron James SF Cleveland Cavaliers 22.9705
Carmelo Anthony SF New York Knicks 22.875
Dwight Howard C Houston Rockets 22.3594
Chris Bosh PF Miami Heat 22.1927
Chris Paul PG Los Angeles Clippers 21.4687
Kevin Durant SF Oklahoma City Thunder 20.1586
Derrick Rose PG Chicago Bulls 20.0931
Dwyane Wade SG Miami Heat 20

... (407 rows omitted)

Kobe Bryant, since retired, was the highest earning NBA player in 2015-2016. PKHN @@@-jupyter_book/book_template/_build/04/Types.md--- redirect_from: - "/04/types" interact_link: content/04/Types.ipynb kernel_name: Python [Root] title: 'Data Types' prev_page: url: /03/4/Introduction_to_Tables title: 'Introduction to Tables' next_page: url: /04/1/Numbers title: 'Numbers' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Every value has a type, and the built-in `type` function returns the type of the result of any expression. One type we have encountered already is a built-in function. Python indicates that the type is a `builtin_function_or_method`; the distinction between a *function* and a *method* is not important at this stage. {:.input_area} ```python type(abs) ``` {:.output .output_data_text} ``` builtin_function_or_method ``` This chapter will explore many useful types of data. PKHN_oo1jupyter_book/book_template/_build/04/1/Numbers.md--- redirect_from: - "/04/1/numbers" interact_link: content/04/1/Numbers.ipynb kernel_name: Python [Root] title: 'Numbers' prev_page: url: /04/Types title: 'Data Types' next_page: url: /04/2/Strings title: 'Strings' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Computers are designed to perform numerical calculations, but there are some important details about working with numbers that every programmer working with quantitative data should know. Python (and most other programming languages) distinguishes between two different types of numbers: * Integers are called `int` values in the Python language. They can only represent whole numbers (negative, zero, or positive) that don't have a fractional component * Real numbers are called `float` values (or *floating point values*) in the Python language. They can represent whole or fractional numbers but have some limitations. The type of a number is evident from the way it is displayed: `int` values have no decimal point and `float` values always have a decimal point. {:.input_area} ```python # Some int values 2 ``` {:.output .output_data_text} ``` 2 ``` {:.input_area} ```python 1 + 3 ``` {:.output .output_data_text} ``` 4 ``` {:.input_area} ```python -1234567890000000000 ``` {:.output .output_data_text} ``` -1234567890000000000 ``` {:.input_area} ```python # Some float values 1.2 ``` {:.output .output_data_text} ``` 1.2 ``` {:.input_area} ```python 3.0 ``` {:.output .output_data_text} ``` 3.0 ``` When a `float` value is combined with an `int` value using some arithmetic operator, then the result is always a `float` value. In most cases, two integers combine to form another integer, but any number (`int` or `float`) divided by another will be a `float` value. Very large or very small `float` values are displayed using scientific notation. {:.input_area} ```python 1.5 + 2 ``` {:.output .output_data_text} ``` 3.5 ``` {:.input_area} ```python 3 / 1 ``` {:.output .output_data_text} ``` 3.0 ``` {:.input_area} ```python -12345678900000000000.0 ``` {:.output .output_data_text} ``` -1.23456789e+19 ``` The `type` function can be used to find the type of any number. {:.input_area} ```python type(3) ``` {:.output .output_data_text} ``` int ``` {:.input_area} ```python type(3 / 1) ``` {:.output .output_data_text} ``` float ``` The `type` of an expression is the type of its final value. So, the `type` function will never indicate that the type of an expression is a name, because names are always evaluated to their assigned values. {:.input_area} ```python x = 3 type(x) # The type of x is an int, not a name ``` {:.output .output_data_text} ``` int ``` {:.input_area} ```python type(x + 2.5) ``` {:.output .output_data_text} ``` float ``` ## More About Float Values Float values are very flexible, but they do have limits. 1. A `float` can represent extremely large and extremely small numbers. There are limits, but you will rarely encounter them. 2. A `float` only represents 15 or 16 significant digits for any number; the remaining precision is lost. This limited precision is enough for the vast majority of applications. 3. After combining `float` values with arithmetic, the last few digits may be incorrect. Small rounding errors are often confusing when first encountered. The first limit can be observed in two ways. If the result of a computation is a very large number, then it is represented as infinite. If the result is a very small number, then it is represented as zero. {:.input_area} ```python 2e306 * 10 ``` {:.output .output_data_text} ``` 2e+307 ``` {:.input_area} ```python 2e306 * 100 ``` {:.output .output_data_text} ``` inf ``` {:.input_area} ```python 2e-322 / 10 ``` {:.output .output_data_text} ``` 2e-323 ``` {:.input_area} ```python 2e-322 / 100 ``` {:.output .output_data_text} ``` 0.0 ``` The second limit can be observed by an expression that involves numbers with more than 15 significant digits. These extra digits are discarded before any arithmetic is carried out. {:.input_area} ```python 0.6666666666666666 - 0.6666666666666666123456789 ``` {:.output .output_data_text} ``` 0.0 ``` The third limit can be observed when taking the difference between two expressions that should be equivalent. For example, the expression `2 ** 0.5` computes the square root of 2, but squaring this value does not exactly recover 2. {:.input_area} ```python 2 ** 0.5 ``` {:.output .output_data_text} ``` 1.4142135623730951 ``` {:.input_area} ```python (2 ** 0.5) * (2 ** 0.5) ``` {:.output .output_data_text} ``` 2.0000000000000004 ``` {:.input_area} ```python (2 ** 0.5) * (2 ** 0.5) - 2 ``` {:.output .output_data_text} ``` 4.440892098500626e-16 ``` The final result above is `0.0000000000000004440892098500626`, a number that is very close to zero. The correct answer to this arithmetic expression is 0, but a small error in the final significant digit appears very different in scientific notation. This behavior appears in almost all programming languages because it is the result of the standard way that arithmetic is carried out on computers. Although `float` values are not always exact, they are certainly reliable and work the same way across all different kinds of computers and programming languages. PKHN$%I1jupyter_book/book_template/_build/04/2/Strings.md--- redirect_from: - "/04/2/strings" interact_link: content/04/2/Strings.ipynb kernel_name: python3 title: 'Strings' prev_page: url: /04/1/Numbers title: 'Numbers' next_page: url: /04/3/Comparison title: 'Comparisons' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Much of the world's data is text, and a piece of text represented in a computer is called a *string*. A string can represent a word, a sentence, or even the contents of every book in a library. Since text can include numbers (like this: 5) or truth values (True), a string can also describe those things. The meaning of an expression depends both upon its structure and the types of values that are being combined. So, for instance, adding two strings together produces another string. This expression is still an addition expression, but it is combining a different type of value. {:.input_area} ```python "data" + "science" ``` {:.output .output_data_text} ``` 'datascience' ``` Addition is completely literal; it combines these two strings together without regard for their contents. It doesn't add a space because these are different words; that's up to the programmer (you) to specify. {:.input_area} ```python "data" + " " + "science" ``` {:.output .output_data_text} ``` 'data science' ``` Single and double quotes can both be used to create strings: `'hi'` and `"hi"` are identical expressions. Double quotes are often preferred because they allow you to include apostrophes inside of strings. {:.input_area} ```python "This won't work with a single-quoted string!" ``` {:.output .output_data_text} ``` "This won't work with a single-quoted string!" ``` Why not? Try it out. The `str` function returns a string representation of any value. Using this function, strings can be constructed that have embedded values. {:.input_area} ```python "That's " + str(1 + 1) + ' ' + str(True) ``` {:.output .output_data_text} ``` "That's 2 True" ``` PKHNa4jupyter_book/book_template/_build/04/3/Comparison.md--- redirect_from: - "/04/3/comparison" interact_link: content/04/3/Comparison.ipynb kernel_name: Python [Root] title: 'Comparisons' prev_page: url: /04/2/Strings title: 'Strings' next_page: url: title: '' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- Boolean values most often arise from comparison operators. Python includes a variety of operators that compare values. For example, `3` is larger than `1 + 1`. {:.input_area} ```python 3 > 1 + 1 ``` {:.output .output_data_text} ``` True ``` The value `True` indicates that the comparison is valid; Python has confirmed this simple fact about the relationship between `3` and `1+1`. The full set of common comparison operators are listed below. | Comparison | Operator | True example | False Example | |--------------------|----------|--------------|---------------| | Less than | < | 2 < 3 | 2 < 2 | | Greater than | > | 3>2 | 3>3 | | Less than or equal | <= | 2 <= 2 | 3 <= 2 | | Greater or equal | >= | 3 >= 3 | 2 >= 3 | | Equal | == | 3 == 3 | 3 == 2 | | Not equal | != | 3 != 2 | 2 != 2 | An expression can contain multiple comparisons, and they all must hold in order for the whole expression to be `True`. For example, we can express that `1+1` is between `1` and `3` using the following expression. {:.input_area} ```python 1 < 1 + 1 < 3 ``` {:.output .output_data_text} ``` True ``` The average of two numbers is always between the smaller number and the larger number. We express this relationship for the numbers `x` and `y` below. You can try different values of `x` and `y` to confirm this relationship. {:.input_area} ```python x = 12 y = 5 min(x, y) <= (x+y)/2 <= max(x, y) ``` {:.output .output_data_text} ``` True ``` Strings can also be compared, and their order is alphabetical. A shorter string is less than a longer string that begins with the shorter string. {:.input_area} ```python "Dog" > "Catastrophe" > "Cat" ``` {:.output .output_data_text} ``` True ``` PKHN7jupyter_book/book_template/_build/features/citations.md--- interact_link: content/features/citations.ipynb kernel_name: python3 title: 'Citations and bibliographies' prev_page: url: /features/interact title: 'Connecting content with JupyterHub and Binder' next_page: url: /features/search title: 'Searching your book' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Including citations in your book Because `jupyter-book` is built on top of Jekyll, we can use the excellent [jekyll-scholar](https://github.com/inukshuk/jekyll-scholar) book to include citations and a bibliography with your book. **Note that this only works if you're building your book HTML locally and hosting the HTML files online somewhere**. This can still use GitHub pages, but not the auto-generation of a cite from markdown files feature of GitHub pages. This is because GitHub pages doesn't include the `jekyll-scholar` plugin. ## How to use citations Including citations with your markdown files or notebooks is done in the following way. 1. Modify the file in `_bibliography/references.bib`. This has a few sample citations in bibtex form. Update as you wish! 2. In your content, add the following text to include a citation ``` {% raw %}{% cite bibtex_shortname %}{% endraw %} ``` For example, this text: `{% raw %}{% cite holdgraf_evidence_2014 %}{% endraw %}` generates this citation: {% cite holdgraf_evidence_2014 %} You can also include multiple citations in one go, like so: `{% raw %}{% cite holdgraf_evidence_2014 holdgraf_portable_2017 ruby %}{% endraw %}` becomes {% cite holdgraf_evidence_2014 holdgraf_portable_2017 ruby %} 3. Generate a bibliography on your page by using the following text: ``` {% raw %}{% bibliography %}{% endraw %} ``` This will generate a bibliography for your entire bibtex file. If you'd like to restrict teh bibliography to only the citations you've used on a page, use the following syntax: ``` {% raw %}{% bibliography --cited %}{% endraw %} ``` When your book is built, the bibliography and citations will now be included. For example, see the Bibliography generated below! ## References {% bibliography --cited %} PKHN& 5$5$3jupyter_book/book_template/_build/features/cool.jpgJFIF (!%!1!%)+...383,7(-.+  -%%.-.---/----------------------/--------------------OO  !1AQ"2aqr3RBSbt#45CcsTE$d>1!2AQqa"R34Br#Sb ?P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 닡3   3ZApH[e\9M,j\r]ɟ)Hlc炪fôhf xRXoy8OFJ~rkUv4)S.3Ir1YRSS,=XEPTO~T1SGrcEFl&åBu# } 5J_:q&2as8ŇVWQSOGcsڼ ZJT/*A8.5渏K b_$vrg Y>R$$,;;DDa5K$h7psHsHUef̨pWTȚ_#Z6@ I\m%vJvAr*gnNzpL}n'^9{~VҬ~r(VͥOR_89+37R OT`/sgȿDkQӗ[K]**TΖN?˓ORU-sajgnZl{c12áᡥ[LeYnktrW M36"Z;$FzW.榭n*y.G9#{M.:VT<[hS]F6W`@@@^$NI@+!8ܴu\4hXkWoTr>тS^|#䫁Lq2:X{ Ov\æKd-_Իc,MR&88jѰ#a+Xᔋ(U|R[ 'Aa;J)ͩyg$7l&✞HCLzℹ|O%WlGۗa@jt^q:%sEXks@7MuuAiӤh'fg!p, M$qc_qԳV% YqQ"#ʕ͎6S&g6nVӽaWk#{'Ѷvk'[Jw"͂m9yW+ˑPp.y0{ok]؎\݆:kO@p:=k feJZ-|PY+E #c3TZ8ՍiF1׌.;zS|WǼT dR7?{ŏzo5?F߉vy$vh;-fe2! siUVG#5Ȋ ǀ}%u ߅>ORe8@@@x@֗@z\nR*Nj*w&&n8#YeVWw}vMEn6F%0.ƞhn8il!rN<|bI}F< =%kI e)5 !qÌHӸe j4Fי:TNs{Ȼ>jYǫ_51>a k g$a1UJ1<]m06Mm='_z7vcKQۯno' ʯ:2d-i"9uҴ)ke$S8A6*繁t !e&VC3:lᓴ9Y j5ƪߴ*KL5P-w4v\, u}D>7.c݆ޱo zkN/=~ԐuSF7q *שXt_|κ#K+W"|sɴm=RTˇ,>%C[P^$qsI$QZ*QMHO{ִk.qu)c.<7Rev m|H:+RPֲcxYx>h؆P7k \zFz \X:1~U;SIavJ4a$|־ ,y<co{dJ(;-)fyFUD?m7j v滙Cax>O[W]փ  FuT<pZUUX*zu![OJ+x@@R\9>Kk7\,z1ZDa gҬN>+HFO0hW3TUV\w%qW7f?9 {T<>i^dNuG~LfϹ?E:~K OG8{!sd$Ebm.'N#5}Hx O䬁?)\עomKj1f /B8WdNl~FW^\>{΢Ӈ#;%ZV;}dBrY(ORe8@@@DPO `8FglOGHh]yS>/Qo zFߊ#*8٣lSoYR^>Qfjp%UŶ؟m -R>o^T블IC"ƺ/ d|Y-_yw=cj,M~hhRt5p3;ҸB}r4N"5z .z .qQ_,UF%"p.c=Ӫ8h?XQe] ,g~'zOsK3o:'NQCS8>ƫE|_ZhΆoɊ6DXŒ%JAD ϨIV3<SYa#X.n,fMD{]]>Z[G)G u˿L7+]M|c.Fv'ULGPyR}tu.t 5C#RwLfד#%d,W_Ȱh;-T+2! siUVG#5Ȋ ǀ}%u ߅>ORe8@@@s3VnuUh фh.⓹ R:~~=7 V8w+t/5-xWR}hzJ+B;ɒ2c ,2ъ%F+w.K2Q r%nҸI&F~Q9<AgsAVXVWԗ9jHƷ1v[Qv8OνDJ&cc^58\b 3 йvKN)e9aIF:xw;II- n5hk}ಷvzVFWä .e>/*5`tLYyQZ%8뼄O^l>;:j'H|sv#/q{|ֲk~Vyna6v[ fF(ʸHͦT{Y|s"(l/g+~`>J+x@@RHO2Sv֋<' ʫ Jޖg~|6&r_k\4M7-{Fj٫Em;-_ə?x:"AW8:[m?v$jq'P heK}-imൃ]JړZĮ3bq2v;᾵|||,Tdh{nC>Z˖FqqJ/&4!ĸŨqNlFz90`6kGI%sE:[\kqB,&hG͝=[(VNr =靖5,tG1prQ kxoӗ8I%iJڊ\,qq)?$aYTfb_߼* zZvZ5v:[mJk+ta;m(9zY8ˉ%4 ħ*9xk~[|#4|JIinhբwڷ+umnX *nEFlL ۰mWr8[Wa֬?.D еh#_n@dj ]sEąےҗubo YnE#8N)H: 4zˊwԕ[/ue,fy*g74N{M̑/iۤ !%I-KUT6?QEY3  "9י$Vlk9cH;FpZ㩞 S\~kd4 68(7ӔvjRNWٟܩ7uG0.o Z1w>7`n|(۞-zcbh/ sxkz y:uEvQٔ5nѷ}hl勂XY˄B@mJri8lM,JzeH>(紷sOqUXѣ.AaX6k/<[GU4Y,kd!2c/h{ut)UVa|<|$a<5{<4Guۓ,y٫~o+^[\Lj|K֒1F4ִY @yۻ+GFSCo `k?cr>}Ws󿿞|| qO:Doجvz-ÁIE@ɰAr"f9X N=:1Kϥj,dU?f9w&f]VQx7@p<[wGE֮65pk;s~hff.qw&4BJ)"*S9~M`g e\$^i>:E߮ݵ[erEqfiLjs  h: FLLwSBN XTZi ̉챣\͛]"XZ4 A:m;?Ut7c_s[vਖoҘjҿ5fPXUG$ށUK۞_c\Mn3ՓժuNϹٷ^5Sc=sժp&Kwɞk*SW $c9"kХwsTOװok5=xWk1:~?F)$Q]GQC_Dk9(fs⧝1a 4}aMBMdrjTJk.+.bv3Ť)Ƅ⪽+~#RO                               PKHN'kP6jupyter_book/book_template/_build/features/features.md--- title: 'Features and customization' prev_page: url: /guide/05_advanced title: 'How-to and advanced topics' next_page: url: /features/markdown title: 'Markdown files' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Features This is a short demonstration textbook to show the general layout / style of textbooks built with Jupyter and Jekyll. To begin, click on one of the chapter sections in the sidebar to the left. Alternatively, click on the "next" button below in order to read further. The first sections demonstrate some simple functionality of Jupyter Books, while the final chapters contain a subset of content from the [Foundations in Data Science](https://inferentialthinking.com) textbook. PKHNX 4jupyter_book/book_template/_build/features/hiding.md--- interact_link: content/features/hiding.ipynb kernel_name: python3 title: 'Hiding code blocks or entire cells' prev_page: url: /features/notebooks title: 'Jupyter notebooks' next_page: url: /features/interact title: 'Connecting content with JupyterHub and Binder' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Hiding code blocks or entire cells It's possible to control which cells show up in your final book pages. For example, you may want to display a complex visualization to illustrate an idea, but don't want the page to be cluttered with a large code cell that generated the viz. In other cases, you may want to remove a code cell entirely. This page explains how to accomplish this with Jupyter Book. ## Hiding code cells and displaying a button to show them Jupyter Books uses **notebook cell tags** to determine which code cells to hide. If you add the tag `hidecode` to a cell, then Jupyter Book will hide the cell but display the outputs. By default, Jupyter Book will display a small button to the right of the location that used to hold your code cell. If a user clicks the button, your code cell will be displayed. For example, see the cell below contains the `hidecode` tag: {:.input_area .hidecode} ```python import numpy as np import matplotlib.pyplot as plt plt.ion() data = np.random.randn(2, 100) fig, ax = plt.subplots() ax.scatter(*data, c=data[1], s=100*np.abs(data[0])); ``` {:.output .output_png} ![png](../images/features/hiding_1_0.png) Try clicking the button to the right of the empty spot above! Note that this button only shows up for cells where you've hidden the code: {:.input_area} ```python print("This cell will show up!") ``` {:.output .output_stream} ``` This cell will show up! ``` You can disable this behavior by using the following configuration option: ```yaml use_hide_code_button : false ``` ## Hiding the inputs and outputs of a cell You can also hide **both** the inputs and outputs of a cell, in which case it won't show up in your book at all. These cells remain in the notebook file itself, so they'll show up if readers click on a JupyterHub or Binder link from a page. To hide both the inputs and outputs of a cell, use the following configuration option: ```yaml hide_cell_text : "# YOUR SEARCH TEXT" ``` When you build your book, Jupyter Book will search each code cell for the text specified by `hide_cell_text`. It will remove any cells that contain this text. PKHNmuu6jupyter_book/book_template/_build/features/interact.md--- interact_link: content/features/interact.ipynb kernel_name: python3 title: 'Connecting content with JupyterHub and Binder' prev_page: url: /features/hiding title: 'Hiding code blocks or entire cells' next_page: url: /features/citations title: 'Citations and bibliographies' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Connecting content with JupyterHub and Binder Because Jupyter Books are built with Jupyter Notebooks, you can connect your online book with a Jupyter kernel running in the cloud. This lets readers quickly interact with your content in a traditional coding interface using either JupyterHub or BinderHub. This page describes a few ways to accomplish this. ## Creating interact buttons for BinderHub BinderHub can be used to build the environment needed to run a repository, and provides a link that lets others interact with that repository. If your Jupyter Book is hosted online on GitHub, you can automatically insert buttons that link to the Jupyter Notebook running in a BinderHub. When a user clicks the button, they'll be taken to a live version of the page. If your code doesn't require a significant amount of CPU or RAM, you can use the free, public BinderHub running at https://mybinder.org. To automatically include Binder link buttons in each page of your Jupyter Book, use the following configuration: ```yaml # Binder link settings use_binder_button : true # If 'true', add a binder button for interactive links ``` In addition, you can configure the components of your Binder links, which control things like where your BinderHub exists, which repository is used to define the environment, etc. Here's an example configuration with some explanation of each field. ```yaml binderhub_url : "https://mybinder.org" # The URL for your BinderHub. binder_repo_base : "https://github.com/" # The site on which the textbook repository is hosted binder_repo_org : "jupyter" # The username or organization that owns this repository binder_repo_name : "jupyter-book" # The name of the repository on the web binder_repo_branch : "master" # The branch on which your textbook is hosted. binderhub_interact_text : "Interact" # The text that interact buttons will contain. ``` ## Creating interact buttons for JupyterHub JupyterHub lets you host an online service that gives users their own Jupyter servers with an environment that you specify for them. It allows you to give users access to resources and hardware that you provision in the cloud, and allows you to authenticate users in order to control who has access to your hardware. Similar to Binder link buttons, you can also automatically include interact links that send your readers to a JupyterHub that is running a live, interactive version of your page. This is accomplished using the [nbgitpuller](https://github.com/jupyterhub/nbgitpuller) server extension. ```yaml use_jupyterhub_button : false # If 'true', display a button that will direct users to a JupyterHub (that you provide) ``` You can configure the location of the JupyterHub (which you may set up on your own using a guide such as [zero to jupyterhub for kubernetes](https://z2jh.jupyter.org) or [the littlest jupyterhub](https://tljh.jupyter.org)) with the following configuration. ```yaml jupyterhub_url : "" # The URL for your JupyterHub. ``` ## Instantly making your book page interactive with thebelab (beta) If you'd like to provide interactivity for your content without making your readers leave the Jupyter Book site, you can use a project called [Thebelab](https://github.com/minrk/thebelab). This provides you a button that, when clicked, will convert each code cell into an **interactive** cell that can be edited. It also adds a "run" button to each cell, and connects to a Binder kernel running in the cloud. To add a Thebelab button to your Jupyter Book pages, use the following configuration: ```yaml use_thebelab_button : true # If 'true', display a button to allow in-page running code cells with Thebelab ``` In addition, you can configure the Binder settings that are used to provide a kernel for Thebelab to run the code. These use the same configuration fields as the BinderHub interact buttons described above. For an example, click the **Thebelab** button above on this page, and run the code below. {:.input_area} ```python import numpy as np import matplotlib.pyplot as plt plt.ion() x = np.arange(500) y = np.random.randn(500) fig, ax = plt.subplots() ax.scatter(x, y, c=y, s=x) ``` {:.output .output_data_text} ``` ``` {:.output .output_png} ![png](../images/features/interact_1_1.png) ## Letting users define their own JupyterHub location If you use interact links with your Jupyter Book, you can also allow users to update these links to their own JupyterHub location by using parameters specified in the URL. If an interact button is present on a page, append the following to a page's URL in order to update where the link points: ``` mybook.com/mypage?jupyterhub=myhuburl.com ``` You should see a message displayed next to the interact link that lets the user know where the link now points. This can be useful if you'd like to share content but allow users to run this content wherever they like. PKHN݊uu6jupyter_book/book_template/_build/features/markdown.md--- title: 'Markdown files' prev_page: url: /features/features title: 'Features and customization' next_page: url: /features/notebooks title: 'Jupyter notebooks' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Creating book content The two kinds of files that contain course content are: * Jupyter Notebooks * Markdown files Each are contained in the `content/` folder and referenced from `_data/toc.yml`. If the file is markdown, it will be copied over with front-matter YAML added so that Jekyll can parse it ## Sidebars with Jekyll You may notice that there's a sidebar to the right (if your screen is wide enough). These are automatically generated from the headers that are present in your page. The sidebar will automatically capture all 2nd and 3rd level section headers. The best way to designate these headers is with `#` characters at the beginning of a line. ### Here's a third-level header This section is here purely to demonstrate the third-level header of the rendered page in the sidebar! ## Embedding media ### Adding images You can reference external media like images from your markdown file. If you use relative paths, then they will continue to work when the markdown files are copied over, so long as they point to a file that's inside of the repository. Here's an image relative to the site root ![](../images/C-3PO_droid.png) ### Adding movies You can even embed references to movies on the web! For example, here's a little gif for you! ![](https://media.giphy.com/media/yoJC2A59OCZHs1LXvW/giphy.gif) This will be included in your website when it is built.PKHNCC7jupyter_book/book_template/_build/features/notebooks.md--- interact_link: content/features/notebooks.ipynb kernel_name: python3 title: 'Jupyter notebooks' prev_page: url: /features/markdown title: 'Markdown files' next_page: url: /features/hiding title: 'Hiding code blocks or entire cells' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Content with notebooks You can also create content with Jupyter Notebooks. The content for the current page is contained in a Jupyter Notebook in the `notebooks/` folder of the repository. This means that we can include code blocks and their outputs, and export them to Jekyll markdown. **You can find the original notebook for this page [at this address](https://github.com/jupyter/textbooks-with-jupyter/blob/master/notebooks/introduction/notebooks.ipynb)** ## Markdown + notebooks As it is markdown, you can embed images, HTML, etc into your posts! ![](cool.jpg) You an also $add_{math}$ and $$ math^{blocks} $$ or $$ \begin{align*} \mbox{mean} la_{tex} \\ \\ math blocks \end{align*} $$ But make sure you \\$Escape \\$your \\$dollar signs \\$you want to keep! ## Code blocks and image outputs Textbooks with Jupyter will also embed your code blocks and output in your site. For example, here's some sample Matplotlib code: {:.input_area} ```python from matplotlib import rcParams, cycler import matplotlib.pyplot as plt import numpy as np plt.ion() ``` {:.input_area} ```python # Fixing random state for reproducibility np.random.seed(19680801) N = 10 data = [np.logspace(0, 1, 100) + np.random.randn(100) + ii for ii in range(N)] data = np.array(data).T cmap = plt.cm.coolwarm rcParams['axes.prop_cycle'] = cycler(color=cmap(np.linspace(0, 1, N))) from matplotlib.lines import Line2D custom_lines = [Line2D([0], [0], color=cmap(0.), lw=4), Line2D([0], [0], color=cmap(.5), lw=4), Line2D([0], [0], color=cmap(1.), lw=4)] fig, ax = plt.subplots(figsize=(10, 5)) lines = ax.plot(data) ax.legend(custom_lines, ['Cold', 'Medium', 'Hot']); ``` {:.output .output_png} ![png](../images/features/notebooks_2_0.png) Note that the image above is captured and displayed by Jekyll. ## Removing content before publishing You can also remove some content before publishing your book to the web. For example, in [the original notebook](https://github.com/jupyter/jupyter-book/blob/master/notebooks/introduction/notebooks.ipynb) there used to be a cell below... You can also **remove only the code** so that images and other output still show up. Below we'll *only* display an image. It was generated with Python code in a cell, which you can [see in the original notebook](https://github.com/jupyter/jupyter-book/blob/master/notebooks/introduction/notebooks.ipynb) {:.output .output_png} ![png](../images/features/notebooks_6_0.png) And here we'll *only* display a Pandas DataFrame. Again, this was generated with Python code from [this original notebook](https://github.com/jupyter/textbooks-with-jupyter/blob/master/notebooks/introduction/notebooks.ipynb).
Word A Word B
0 hi there
1 this is
2 a DataFrame
You can configure the text that *Textbooks with Jupyter* uses for this by modifying your site's `_config.yml` file. ## Interactive outputs We can even do the same for *interactive* material. Below we'll display a map using `ipyleaflet`. When the notebook is converted to Markdown, the code for creating the interactive map is retained. **Note that this will only work for some packages.** They need to be able to output standalone HTML/Javascript, and not depend on an underlying Python kernel to work. {:.input_area} ```python import folium ``` {:.input_area} ```python m = folium.Map( location=[45.372, -121.6972], zoom_start=12, tiles='Stamen Terrain' ) folium.Marker( location=[45.3288, -121.6625], popup='Mt. Hood Meadows', icon=folium.Icon(icon='cloud') ).add_to(m) folium.Marker( location=[45.3311, -121.7113], popup='Timberline Lodge', icon=folium.Icon(color='green') ).add_to(m) folium.Marker( location=[45.3300, -121.6823], popup='Some Other Location', icon=folium.Icon(color='red', icon='info-sign') ).add_to(m) m ```
PKHNQ4jupyter_book/book_template/_build/features/search.md--- interact_link: content/features/search.ipynb kernel_name: python3 title: 'Searching your book' prev_page: url: /features/citations title: 'Citations and bibliographies' next_page: url: /https://github.com/jupyter/jupyter-book title: 'GitHub repository' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Searching your book It's possible to enable search in your book so that users can find the content they're looking for. This uses a nifty package called [lunr.js](https://github.com/olivernn/lunr.js/). To add search to your book, simple add the following entry to `_data/toc.yml`. ```yaml - title: Search (whatever title you like) search: true ``` The result will be a link in your Table of Contents that directs users to a search page. For example, click the `Search` link in the TOC of this demo book. ## Customizing how much text is stored in search The Jupyter-Book search works by storing excerpts of text from each page. This ensures that the search process itself doesn't take too long. However, it also means that *some* of your content will not be searched, because it is past the cutoff point for the search cache. To modify the number of words that are indexed in your search, modify the following field in your `_config.yml` file: ```yaml search_max_words_in_content : 100 # Number of words to be indexed per page ``` Be careful, if you have many pages, and you use lots of words per page, this can become very slow! PKHN<6jupyter_book/book_template/_build/guide/01_overview.md--- redirect_from: - "/guide/01-overview" title: 'Getting started' prev_page: url: /intro title: 'Home' next_page: url: /guide/02_create title: 'Create your book' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # The Jupyter Book Guide This is a guide for creating your own book using Jupyter Notebooks and Jekyll. Book content is written in markdown and Jupyter Notebooks, and `jupyter-book` converts these into a book fit for hosting on the web. ## Install the command-line interface First off, make sure you have the CLI installed so that you can work with Jupyter Book. The Jupyter-Book CLI allows you to create, build, upgrade, and otherwise control your Jupyter Book. You can install it via pip with the following command: ``` pip install jupyter-book ``` ## A quick tour of a Jupyter Book Jupyter-Book comes with a demo book so that you can see how the content files are used in the book. We'll begin with a quick tour of these files, as they are the pieces that you'll modify for your own book. To create a **demo Jupyter Book** to use as a template, run the following command: ``` jupyter-book create mybookname --demo ``` A new book will be created at the path that you've given (in this case, `mybookname/`). Let's take a quick look at some important files in the demo book you created: ``` mybookname/ ├── assets │   └── custom │ ├── custom.css │ └── custom.js ├── _config.yml ├── content │ ├── features │ │  ├── features.md │ │  └── notebooks.ipynb │ └── LICENSE.md ├── _data │   └── toc.yml └── requirements.txt ``` Here's a quick rundown of the files you can modify for yourself, and that ultimately make up your book. ### Book configuration All of the configuration for your book is in the following file: ``` mybookname/ ├── _config.yml ``` You can define metadata for your book (such as its title), add a book logo, turn on different "interactive" buttons (such as a Binder button for pages built from a Jupyter Notebook), and more. ### Book content Your book's content can be found in the `content/` folder. Some content files for the demo book are shown below: ``` mybookname/ ├── content └── features    ├── features.md    └── notebooks.ipynb ``` Note that the content files are either **Jupyter Notebooks** or **Markdown** files. These are the files that define "pages" in your book. You can store these files in whatever collection of folders you'd like, note that the *structure* of your book when it is built will depend solely on the order of items in your `_data/toc.yml` file (see below section) ### Table of Contents Jupyter Book uses your Table of Contents to define the structure of your book. For example, your chapters, sub-chapters, etc. The Table of Contents lives at this location: ``` mybookname/ ├── _data    └── toc.yml ``` This is a YAML file with a collection of pages, each one linking to a file in your `content/` folder. Here's an example of a few pages defined in `toc.yml`. ```yaml - title: Features and customization url: /features/features not_numbered: true expand_sections: true sections: - title: Markdown files url: /features/markdown not_numbered: true - title: Jupyter notebooks url: /features/notebooks not_numbered: true ``` The top-most level of your TOC file are **book chapters**. Above, this is the "Features and customization" page. Each chapter can have several sections (defined in `sections:`) and each section can have several sub-sections (which would be define with a deeper level of `sections:`). In addition, you can use a few extra YAML values to control the behavior of Jupyter-Book (for example, `not_numbered: true` will prevent Jupyter Book from numbering the pages in that chapter). Each item in the YAML file points to a single content file. The links should be **relative to the `/content/` folder and with no extension.** For example, in the example above there is a file in `mybookname/content/features/notebooks.ipynb`. The TOC entry that points to this file is here: ```yaml - title: Jupyter notebooks url: /features/notebooks ``` ### A license for your content When you share content online, it's a good idea to add a license so that others know what rights you retain to the work. This can make your book more sharable and (re)usable. The license for a Jupyter Book lives in this location: ``` mybookname/ ├── content └── LICENSE.md ``` When you create a new book, if you don't specify a license, then `jupyter-book` will by default add a [Creative Commons Attribution-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/) (CC BY-SA 4.0) license to your book. CC BY-SA requires attribution of your work, and also requires that any derivations someone creates are released under a license *at least as permissive* as CC BY-SA. If you'd like to choose a different license, you can add whatever text you like to the file in `/content/LICENSE.md`. We commend checking out the [Creative Commons licenses page](https://creativecommons.org/licenses) for several options for licenses that may suit your needs. ### Book code requirements files Since your Jupyter Book likely has computational material specified in Jupyter Notebooks, you should specify the packages needed to run your Jupyter Book. In this case, we use a `requirements.txt` file: ``` mybookname/ └── requirements.txt ``` The demo book uses `requirements.txt` because it has Python code, but you can include any other files that you'd like to. ### Book bibliography for citations If you'd like to build a bibliography for your book, you can do so by including the following file: ``` mybookname/ ├── _bibliography    └── references.bib ``` This BiBTex file can be used along with the `jekyll-scholar` extension. For more information on how to use citations in Jupyter Book, see [Citations with Jupyter Book](../features/citations) ### Custom Javascript and CSS These are the files in this location: ``` ├── assets    └── custom ├── custom.css └── custom.js ``` Jupyter Book lets you supply your own CSS and Javascript that will be built into your book. Feel free to edit these files with whatever you like. ## Next section Now that you're familiar with the Jupyter Book structure, head to the next section to learn how to create your own!PKHNe'B 4jupyter_book/book_template/_build/guide/02_create.md--- redirect_from: - "/guide/02-create" title: 'Create your book' prev_page: url: /guide/01_overview title: 'Getting started' next_page: url: /guide/03_build title: 'Build and publish your book' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Create your Jupyter Book This page covers how to create a Jupyter Book with your own content. You've got three primary ways to create your Jupyter Book. ## by starting with a minimal book Running the following command will create a new Jupyter Book with a few content pages and a Table of Contents to get you started: ``` jupyter-book create mybookname ``` This will create a new book using your content in `mybookname/`. You'll then need to 1. Add your content to `mybookname/content/` 2. Modify `mybookname/_data/toc.yml` to match your content 3. Modify `mybookname/_config.yml` to the configuration you'd like Note that if you choose to create the book template and later add content to it, you can quickly **generate a basic Table of Contents** by running the following command: ``` jupyter-book toc mybookname/ ``` ## by modifying the Demo Book If you'd like to see a more fully-functioning demo book for inspiration, you can create the book that lives at the [jupyter-book website](https://jupyter.org/jupyter-book) by adding the `--demo` flag: ``` jupyter-book create mybookname --demo ``` See the previous section for a description of all of the relevant files you should modify for your book. ## by using a pre-existing book configuration If you've used Jupyter Book before, you can quickly generate a *new* book using a pre-existing set of folders and files. These are all available as arguments in the command line interface. For example, if you have your book's content in a folder structure like this: ``` myoldbook/ ├── content │   ├── root_test.md │   └── tests ├── _data │   └── toc.yml ├── images │   └── tests ├── mylicense.md ├── myextrafolder │ └── myextrafile.txt └── config.yml ``` You can generate a Jupyter Book from it with the following command: ``` jupyter-book create mybookname --content-folder myoldbook/content \ --toc myoldbook/_data/toc.yml \ --config myoldbook/_config.yml \ --license myoldbook/mylicense.md \ --extra-files myoldbook/myextrafolder ``` This will create a new Jupyter Book using these files. In this case, you need to ensure that the values in `_config.yml` are correct, and that the Table of Contents (`toc.yml`) file has the structure that you want. PKHN",qq3jupyter_book/book_template/_build/guide/03_build.md--- redirect_from: - "/guide/03-build" title: 'Build and publish your book' prev_page: url: /guide/02_create title: 'Create your book' next_page: url: /guide/04_faq title: 'FAQ' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- # Building and publishing your book Once you've added content and configured your book, it's time to build the raw material that Jekyll will use to turn your book into a website. We'll also cover how to turn this book into the HTML for a website that can be served online. ## Build the book's markdown Now that you've got the files installed content is in the book, you can build your book. Build your book by running the following command: ``` jupyter-book build mybookname/ ``` This will: * Use the links specified in the `_data/toc.yml` file (pointing to files in `/content/`) and do the following: * Run `nbconvert` to turn the `.ipynb` files into markdown * Replace relative image file paths so that they work on your new built site * Clean up formatting issues for things like MathJax to display properly * Place all these generated files in the `mybookname/_build/` directory. Note that `jupyter-book` will automatically update any files in `_build/` that are older than the timestamp of the corresponding file in your `content/` folder. From here, you have **two options** 1. **Option 1: Jekyll builds the site for you**: By default, pushing a repository cloned from Jupyter Book will tell GitHub to use Jekyll to build the repository when you push changes (your repository is configured properly on GitHub). Simply tell GitHub to build a site from your repo, then push the changes to your GitHub repo and that's it! 2. **Option 2: Build your site's HTML locally**: Building your book's site locally lets you preview your book locally before you push it online. It also gives you a bit more functionality than using GitHub Pages to build your book. However, it also requires you to install Ruby. If you'd like to build your site locally then jump to the next section. ## Build the book's site HTML locally (optional) If you'd like to build your book's site HTML locally, you'll need to first install the necessary dependencies and then build the HTML. Follow these steps to do so. ### Install the dependencies to preview your book locally You'll need Ruby, an open-source programming language, to build your site's HTML with Jekyll. The easiest way to install Ruby on *nix systems is to use the *`conda`* package manager: ```bash conda install -c conda-forge ruby ``` Once you have Ruby installed, run ```bash make install ``` which will install Bundler (a Ruby depency management tool) and then install the plugins needed to build the site for your book. ### Build the site HTML for your book Once you've generated the markdown for your notebooks and installed the necessary dependencies. You are ready to build your site HTML. Ensure that your notebooks have been converted to markdown, there should be a collection of them in `_build/`. Once you've confirmed this, run this command to generate your book's HTML using Jekyll: ``` make site ``` Alternatively, you can preview your book's site locally by running this command: ``` make serve ``` This should open up a port on your computer with a live version of the book. ### When should you build the HTML locally? You might ask: if GitHub pages can build my site automatically from the markdown files, why build it locally? The main reason for this is that you get more flexibility by building locally and serving raw HTML, as opposed to auto-building the site with GitHub-pages. In particular, if you wish to use any **extra Jekyll plugins**, such as the `jekyll-scholar` plugin that enables you to add citations and bibliographies, then you need to build your site locally as HTML. GitHub-pages doesn't let you enable any extra plugins if it auto-builds your site. ## Create an *online* repository for your book You've created your book on your own computer, but you haven't yet added it online. This section covers the steps to create your own GitHub repository, and to add your book's content to it. 1. First, log-in to GitHub, then go to the "create a new repository" page: https://github.com/new 2. Next, add a name and description for your book. You can choose whatever initialization you'd like. 3. Now, clone the empty repository to your computer: ```bash git clone https://github.com// ``` 4. Copy all of your book files and folders (what was created when you ran `jupyter-book create mybook`) into the new repository. For example, if you created your book locally with `jupyter-book create mylocalbook` and your online repository is called `myonlinebook`, the command would be: ```bash cp -r mylocalbook/* myonlinebook/ ``` This will copy over the local book files into the online book folder. 5. Commit the new files to the repository in `myonlinebook/`: ```bash cd myonlinebook git add ./* git commit -m "adding my first book!" git push ``` That's it! ## Publish your book online with GitHub Pages Once you've built the markdown for your book (in `_build`) or built the HTML for your book (in `_site`), you can push your book contents to GitHub so that others can access your book. To do so, follow these steps: 0. Confirm that your site files are built. You should see a collection of markdown files/folders in the `_build` folder, or a collection of HTML in your `_site/` folder. 1. Commit and push the changes to your repository. 2. Enable GitHub site building for your repository. From your GitHub repository, click `Settings` then scroll down to the `GitHub Pages` section. You should see the message `Your site is published at `. Ensure that you're building from the correct folder. 3. Go to the URL listed at `` and you should see your live site. PKHNO# # 1jupyter_book/book_template/_build/guide/04_faq.md--- redirect_from: - "/guide/04-faq" title: 'FAQ' prev_page: url: /guide/03_build title: 'Build and publish your book' next_page: url: /guide/05_advanced title: 'How-to and advanced topics' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- The following are some common issues and questions that have arisen when building your textbook with Jekyll. ## How can I update my book? Sometimes Jupyter Book will get updates that you want to incorporate into a book you've already built. The easiest way to do this is to use the Command-Line Interface to upgrade your book. To upgrade a pre-existing Jupyter Book, run the following command: ```bash jupyter-book upgrade path/to/mybook ``` This will do the following: 1. Generate a fresh Jupyter Book in `mybook_UPGRADED` using the content files in your current book. 2. If this succeeds, copy over the contents of `mybook_UPGRADED` into your current book folder. 3. If this succeeds, delete the `mybook_UPGRADED` folder. Note that only the content that you can manually specify via the `jupyter-book create` command will be retained in your upgraded book. For a list of these options, see the help menu for this command: ```bash jupyter-book create -h ``` You should check out the content in your upgraded book to make sure it looks correct, then commit the changes to your repository. ## Why isn't my math showing up properly? This site uses MathJax to render all math, with `$` denoting inline math, and `$$` denoting multi-line math blocks. Make sure that all of your math is wrapped in these characters. Another tip is to make sure that your math isn't being escaped improperly. Jekyll strips escape characters, so you should make sure to add **two** escape characters when needed. This is done automatically for many escape characters in `generate_book.py`, and if you notice something that should be included in this script, please open an issue [at the textbook template issues page](https://github.com/jupyter/jupyter-book/issues) ## How can I include interactive Plotly figures? To display interactive [Plotly](https://plot.ly/python/) figures, they must first be generated in a Jupyter notebook using the [offline mode](https://plot.ly/python/offline/). You must then plot the figure with `plotly.offline.plot()`, which generates an HTML file (`plotly.offline.iplot()` does not), and then load the HTML into the notebook with `display(HTML('file.html'))` prior to saving your *.ipynb file. e.g. ``` from IPython.core.display import display, HTML from plotly.offline import init_notebook_mode, plot init_notebook_mode(connected=True) . . . plot(fig, filename = 'figure.html') display(HTML('figure.html') ``` Note that, if viewing the file on a Jupyter Notebook session, the figure will not be displayed there (`iplot` is needed for this). However, if working on a [JupyterLab](https://github.com/binder-examples/jupyterlab) session, the figure can be displayed there using the `plot` code above by having the [JupyterLab plotly extension](https://github.com/jupyterlab/jupyter-renderers/tree/master/packages/plotly-extension) installed. ## What if I have an issue or question? If you've got questions, concerns, or suggestions, please open an issue at [at the jupyter book issues page](https://github.com/jupyter/jupyter-book/issues) PKHNz 6jupyter_book/book_template/_build/guide/05_advanced.md--- redirect_from: - "/guide/05-advanced" title: 'How-to and advanced topics' prev_page: url: /guide/04_faq title: 'FAQ' next_page: url: /features/features title: 'Features and customization' comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***" --- This page contains more advanced and complete information about the [`jupyter-book` repository](https://github.com/jupyter/jupyter-book). See the sections below. ## Hide cells or cell outputs in the built site Sometimes you want to use code to generate visualizations or prepare data, but you don't want users to see it in your built book. To prevent code cells from showing up in your built site, you can use the following two configuration options in your `_config.yml` file. **To remove entire code cells from your book**, use the following configuration: ```yaml hide_cell_text : "YOUR TEXT" ``` Any code cell with the value of `hide_cell_text` (above it is `YOUR TEXT`) will not show up in your built book. **To remove only the code, but retain the outputs or a cell**, use the following configuration: ```yaml hide_code_text: "YOUR TEXT" ``` Any code cell with the value of `hide_code_text` (above it is `YOUR TEXT`) will show the output (e.g. images, HTML, etc) but not the input code that generated this output. In both cases, the cells *will* remain in the notebooks themselves, they simply won't show up in the site's HTML, so links that point to a JupyterHub/ Binder/etc will still work as expected. ## Retain custom YAML front-matter in your files Jupyter book will check your files for YAML front-matter and will **append** any newly-generated YAML to the built files for the page. This means you can provide your own custom YAML to files (which may be useful if you'd like to modify this site's HTML). Be careful not to add YAML with the same key names as the auto-generated YAML, as this will create duplicated keys in your page's front-matter. ## Deploying a JupyterHub If you wish, you may deploy a JupyterHub alongside your textbook. This way, for pages that are built from Jupyter Notebooks, students can click the "interact" links at the top of each page and be taken to a live Jupyter Notebook running on your JupyterHub. The easiest way to set up a JupyterHub is to follow [The Littlest JupyterHub guide](https://the-littlest-jupyterhub.readthedocs.io/en/latest/index.html). This is a straightforward deployment of JupyterHub on a single VM, and is suitable for courses / workshops of less than 50-60 students. Once you have your JupyterHub set up, you can use the [nbgitpuller](https://github.com/data-8/nbgitpuller) package to send links to course material to your students, or use the interact links that Textbooks for Jupyter automatically inserts into your course material. PKHNꯔ*NN8jupyter_book/book_template/_build/images/C-3PO_droid.pngPNG  IHDR =iCCPiccxڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ:. cHRMz%u0`:o_FbKGD pHYs  IDATxwWZމ_\9N G9TI`l7`71t$ErUR)KG:qrҜNy;n}M$3::g~y1c1c1^'?.O3~>=> ^i--Z'2pc7/7#!͝~*G]1?ØA7_g5 5>}/} USȹP}RG>[Rڬwzfϙۏ.qϭ|kn%uRbW+gfߖwj]wПVro~dzg0YۏKnO(St(<?- uPɕ+)Wr\{&y~wnV N;޽;/.uL1_[ r!KΏxn?{12Z"w 7áE-r9uu4;Llwm ?? &c|}*0vMLP*A@f^ b<PD(N0Zyn9o^Ƈ=&_m|^KMwzoj=ڻ(? Q+;CD7/Ո^GZ$R)O^8'A˟{go;uC0|/^Ωgw6u}uVM 94,J\)N3MSC=`}}˗ڋVX\q϶/w<+;}yl1at4DxwNFNuǎQ-q!X Vc kVc%qƲ39}fk=&+!zmK_N ™C 06X4yc۾>*o4l4K_i~7r?B!\,`MX1VHc< u<* ,P,*.\^c#P{ݮ.,^_Tgl1ğc*j¥ 6;=箻}#sABFl͆@ $XaE;d4cV8C+0K,9uv/?p\t]GMGZ_8m0&;__/u-4Nt+?pϯ%b=":"v6bukFw7#/Z% \1+R\",2]Xh!Q&uGULz/}sBc½a3AO6VZ:Bs~׭(G!%82C`ɰրk7?kbZytcH$aJP#̕ eW^akd9:а +?qvldsJ\XjLY_'_qQ1J =DAH"FL5 E XI0&F VYf$8no_@k^ϓNv$ojc+ 'D=Y^Z\"cmcXAcVcf`2 FJ `]!i$)Vp}vKotz?46֘poQN&7kyc^?BCj;{bu &EAFI&tD:`̈p¦H2M7uZtY8`O1YK m6)N<+$)}dl1^qԻ#K{` Cڽz@>- l0 dkhM0`m01fS`mi3 F:cQ>{ e-h6m:ݮo;0C oÓâ0mԟC!th eDbC6:Hgb0#II67K%;Iش7! 5 4Q4$*a>k4_oL! ͋,~wqAkg)A_~ 5#L|EcFd1!,R 2@2ZMt `r%SUϒ ƒ(a)1֮DŽ{]yFK B~JA3d 5ZKV#Q2ʻ #)c6Ab )Fw@I7 Lq=Fa RB}ؓ#&?c½`^hvdsB00X:ٰ Fc&Kt:Ĥ 67b0XMdpӻIaqő!-RJH &$;ĽB! iaQj k7؂9_>@{McnǑ8"4{(4-MA[Ͱvgd R1HAJ "E˰t%~Bb04Mk؉W7Vu¨@4ZR+)@`u/IJL!0I !,i Q)u=\f.Xc!tVIsA$ +4 E/ smy7` K2-α|2$KIj0:xIf/|o 9&AWdi(m\PU:V'Zzכt\?2/m2Ƅ>>xRy.GJVb8&n d4ph>Zɠ鴇tz j+ l ]aFMHVCA?IWhv;) nw|@=Ɔ q)mjZ3 9P$0؁`Gv zj\72䆢6I,V5R)]%SgcL U2F! HRu][{?}UsD-H܁:zS\cclRNGOrXpOHyț& w|[|a듟%wsՈ7B3y(+$ÔO˗4rqT&c½~05L_K6wmS— .oȑy0t+oӰ{p3hG7 5*\J9%ݎc+-O}jV[9 .r { .Qw@6C#^e-$cp} I5y* }y=eJ3oeX}uZ/}^9CO mseMSyTѫR0Cs#.>"r5*O>}L(.Edd$ҰՊQ2 /Y;ə6oq_[L݋j9~ȥk)q ͽB9Q^8V{( "w&+8< nKȢ;#&'3}j?Ij.թz郷1y .n-#HR` ,R5ZǖWck=:TJa+EEØX "c "ajM6EgNS,0SJI_Ȣ8us~pJ!U/1m?,v- 1AG)њ$5ĉ\q BPv[Ԫ`\5&"D~Mg\^R,Qq1Y||Kϰ6Us%W/@BC!UTqg| s?[t)ΜR:7n+yRm 2H GMF.P+TDυ5!<l=eU(Aj^Gex>3K>/|>'/f,dAJ0q~Z3byOXyE,5En6JGn協=^B[nd}uJ@z|`H%c,J9ؚc½.0;=FшkknlXۖF7B R*27Q:ɫ{'/'oekGpi&0H!V_dΫ]cT,V"K'h7mvB0()@Hؐd~d3IRV cdR>káN7ppH855q6U&'jHEl_3>{#](C`}7V;v!<b\NRܫ^{ !%Qѻ)drFe%Aٙ ;cK @j3zCz0KC`28`L\GUQ'a?NhZC\_a5H%Hgk˗>YLrtY)0^  4DcH3.^;zcdR>P_wx2SzS) #%Xc,GoKr!9+ +{]C0Rz05)݌(ΰB  LMUCgjTNRGHB:"8K]`ܞ3&pչ 増"_pJb x>8ia[{T+P $E_z /tph#A !dYFow9 \qL/ ,۸vcxWE[A08n:YcC ۳:5M{Mb ̈́T"d}lw'W Cs +QXAj:MiV~ @&w 4JBQݏr쭞ege =A) ds \TԜE?W2u/ku u1,ä-pBR{0S"t\̘TkF6C~2baR%*AO#%FR2.;QNW?W Ԯ1^?(Tg?sq%A k uuҘy. JAlISR hc1)&ʂ@ỊBɧ>xA2/9KcB$RC7Ic$bq;RW~l)ldpd~?3=[Ǥ)! }xh\q#}tB+ DPQ>Ez%dbz9l{k?t{#n+4hI mF'(M]#:UrG̖~H2=6w/:;!ON=@QCH4gAjF ȇj+;.u6ޗvɷi !8ዟ!1SA& 9D]3Lw1PcbKaw[(QY+ 'xzq:3 tz1QbHRWJOT*QkxpcXcDrNi6Cgy;8TۨJ$9hF]TB9ZyOorqC?SR|e,o _tXckً:"ېtj3R x@xbm"Lb I!%gXr]|2tprL7~w-'2A;q/Dwouhq*ǰKd8MRFGN B;i]ًh" Ȭ% ЩErt#cC @˅)9vW7:^@9 7z+l>d 㕦OKJԈp3}PD X _y3W{dFaZ 44LfV j=+ia!K-്W.D1u( 8""Rk=AXr%9B f4Вhȇ.#]Jc½a 2ðՎ-g;^HKvp&{Ie$߅`.PBJ4:T·~KdDe[ڒPhAZB^JU&"*[c1! Tă!6F ˦ػ$ 6q!1r ߑ %&Igo'Y2g;@k̢ZB16 ]c½WHI;CҢ!IQ<YB<48y^bܟu"q3 ;0UUy_1]t O&'vȕyO]18U5ZlFfpQ񍵛~ww ALfv#e\9iMZ  hξ|΍elڥJ9xkf}}j2LQsRJ'v^3VX+E7]ǕL'+ T4&YWf/2Tw~Jyk7֙[l42T0s){yia+ -^IS˥M._ll4 %| >9+}QX' nc3'2:[X^T1^ov a sežG~ p֊T(&qLԼNb]zÁ'[ܡ_/{莭6&sl&:'//;?W/f.`@|tg.a܀ ]<2y(zĩ  3'Xdxu,/]xNflVr7'N q%~o?.$j6~sBfT=Gif3fMYiP}J\TNw-ҕ/<{ǎMB BסR]\R*Ty*:cҘ^(/=2n#RZ/՟ӱ]_XsڒF3N,Zh$ sڳ,~s҅$XN{B9Q %낟2P,S(@4wS6Wc.\f1-K@a%Jݾˍ&8}E) uX= Fjx Q^fUh5ڇ˕wq;ŧv݌IDDŰƼFzwKOLɸvZÚRraf%똊Nc8Pc'$j>SLN9$)qN+7v9cfcZc;qk R\ŐrΣSx$J*D"Jqs7vl%|%{ۭR*hjƕ X"J-Bd_{z|gi%N |7 8SQLֆ^Ͻtq?Kyξ[f$K/8zPj[$fӰjcxo?n=Wȁ|_1ƄwSpo;A..臧+vЫN$C+7ۓ*i v4֢&M 8Ң e# SuD%Hk扇>N&j9q?bmB#t:(R) EI3[ʓ2[yS![|7~5эɅ>pO4{n{h(IVntA?t`cs;022r?:~|7 μCd^ GŽn =ɀ 3wI WkM>Q:+hSq~/^ԛ|~}f̴|'WMw|@뭃v޲ CtOQ,8JBNm0 (DjRgfBB1Y$2Pʥ0))*0UO~r*uB 9n88ͯht.BgOO218`t[ZǨ>1 aP`#`ra]pٳB11]y993VB>wZ{ e>g.o-Z~(2[}ǎ}*Mqv7&__ľӼwW&{Zu^{@u]̲oNqVENe>:Lۄ,Fm!rTr83H Q c9SZŸLb^rđӸC  A@͸|A hgk-^1>x*` 5Qrͺ|2ӧg,NH$`e3&3f"Kݕ mtBNY|KT>B.Bc6˲,by$- 4O~o_J _KB\I)(؉ݫkriA|#0k続P@6ffBS+;LNN @ Ǥln4$s %Ew͝$IqXY05Uevik5;+FRrnGbL|=ϭ')81 E.XS/Cl$[͹.k!׷;*jR1i-0N8{wpKq4xًcFEmRCMhRPZέ5ZZS,.VgX2[`,F㸊iW(׊siB[*u Ň1{++xnDrut 7x$^sOpj79($%q#*^B'Xnj \06c5JG>&A'+ݔTCvR+9L hכXy q&gJ(6t#hvcv]u "@1U댳2Zd2 ^zToMT+G^-bL7 <ҊPufw{[W{|0[s .6`-BX+ƂXm ä贠TӋb+YF~Fx]p??<ԛ!mIqMƮf?O8 3 KA aLb|P+թ)H[[-|{ stC6WZ^c}v3b3XI'ca iSJEt>S(LV\ʁ%k{4 j"qMP KEBwB3CjuCCk*U Ek*;_t =-wvKOz3R~ wަZ1kǂX= %4Z ֠[}7۸Gk7eb,8OsEZ+gɗ<5I\q8q 'X)3Enb*Ͽً{O,..tc'q|7벹&{)$2$(Ow{;XŶ Rѣۍif#&ٷr=$A(\\\u$e<)N&oRWiLDFP-[N0$X+Qn7W)L㕖*2aFddb(\fpti4:#>tauyup_}?N~WlL~&~qUt'w)AJc,Mekonc4 cRP^#|VVvQS*yj 3fF/f]V.Y`Zi2c0qysgvyM^{u6Xv6hץ^ٹr'Ta{kd-S(9rC疰Qݹ =Z_O<υm 'Dj8v8NcȉCuthoa2Wŭ)@ «#*¯" *I_`bW0B!ϽwܕU.^Z=PNNvF;c½^/vʕ O'pVn;I}fXB $P1#f,ƌ]<9 -Ƙa JSlm7(>ykjS5~'Goa^—#q}E Cڭ5n%l͔K+}vz,+<!JI@Xazv)J?tI;;ֶؽ*gO[9c;Xvv,, m&k9jE=M-Tnw&{>aW; ́p@#M 8X$Rd&6qbd <-4̅U.]^.o Nr4 z[w%.qЩc6Ia3X`Mt5ZhcF4!-CI7mP)Jk]T=IJ=ȝ9xmx~ X33YcM`,2& R%x hhuȴy%buګWȁWBQ0GuTV.R5iϷnl GjG_Y} /mS)Y3\}aB~3I牚}+äh<)Tz(sk8A<sq [Amt:[Q芨WđN?T\E$iJ$qF#wZ}p_K^R /7pKvo7!_ŤCt&Ȓ,K֐h3|k|e^`O if1ѧLCpeMكA 6אW-``b` (l4(0R.25UabNZR)R*).s)B~M+01WcfaDkɐql'^r1Rd4/̠#(ܷ@mrK8ap"/0Y.R8aָ-_qv`5 .~)i)>[HcN7L i蜐<=?_^;}-ɏ4Jejir/w?+/l &o2#{SwD=$#F$Q8t{)7vV~XG D_ <0DÌ-ך$pZ}W*P9Z#"Vb4 )+K1 ACJ]%3%M|rER@qhᔏUw>OgIy E"A i5[Ff5nVD->uR$mPyJFEo|c9zɥw . BݗDŽ~rzܸ?G[!EQ՝/^ >Z)BkY…&+Qk&2C;2 e)zyס3FdHJq EQFw@*G"TPK+F!oVJ1QS*tUuB2[.#y'9wBB18pxa}L&F`0 !F&Z +9aIX *nޥ2@~rZL٠GoQ7b{? qKO,m@P6nD177= <Am83͋(#w8y^;V7dc+`cZ~tk,Q\PxW]T%??v_{_DŽRs{y:DQ-#-cq؍0 %zFbVAkP 8I }% A7BOsﱣ Mo&6G o.؛ &bZ@8duũރ ,AQA4IH:X|# 0 {'[^P,:Cd2LĨ1\osRyɆ)3tfЉ@0Z<6aJ+('T->neNc%z'|H'd{͉o#L}ob~^ʵ]Ey!~X<RQfCRV)pv$|E>PLBj+ ZdYF$$FӋ"[}C`#KۙލH:6NP\InӠ@QarYZ]C(%K3L |W";8U0eT@b#4$I` V.tF!V_xi 92*U <+zh%dWfd k4d謋^G%d00na\dln~/0. c‰cjCz5j%*K;DR'`n>S/{8tl?tq]-?n-R9FuMPNv*=MPj|L̘p_EL !巾r-p}q'83q<0"v\]sm~aő-%qfGP0WyK! p6)ސJ9BKo1:h-H3C7Hi2 ¢mhv 4z(^ʥ&O BX0*XRb)VhX$SsH3 KPbEa#]Ԩ<`Ǘ&&np!&o{7SwdJ訍 4Q'+tƙ%T:<NsY\o) JfT)%W@eEP%CLmq%0˞iƉ}#uR);Cbkeݯ|U;&M4V\[F|È-;-Tq%&uo 3C9`Q%Ȱki,O aI2Mau$ۍ!xC&)AluVSaQJ $Zhx.hCfoz{E.码(yajF΃Dp&PP\D N $研bL"XaYC#oƍ1Jԇ.P/?[zOxM p}s٧xɏ2ZV*hᱽrFWJ\A)$R ו# <2Mdę!JQnLgmVW^k@i^difeSc4Z ;*=?*#BaUM :K:BFG=y2Ñwq] 0">F" j7~|J#$`=a:x#U ~Q,9RDFR 1$hMv7q%  H S X=@`Vkwb ÿ|E)p_!}cm6W-vU)^M_ ONkҌ\Vn9xB>e}3f;JփX3)5iu#wztcMiea$Q7?,B BDϾHX0k3F$H(A*+qܼ H`ma2_c'!jt0:C'}ܬtN¾[9TTP%]\)cZ !17쳻bjnI#k.B8HF_HA qo nYBs(v7/{gnF,~f=LZT?z귿xky;+߸NslµE;…˻|K縴ѣ;4Io3mq첺ibe0L2=XPFk^W3QuLJk,EbQ&UWڑi@k5+q"t̹&9~dfE3ʕ HO:._Wq}8Aǫ! Q.AFIqak=.B( b(=!)ٔs SZ% advd ao'3qcy987wL8Jcmtp t7\~O|+_5|ۃog~sceoμܮn+^H=>Bcc غ/`jΑG~Kk7G8 %L Tr0`Љiv!тݮӷ>' yEk:6V3&ՒZY1IA1|A-#EZ2mI5  "⻖RQ^wX#F\/㕦 A8HG@ T#) 6B~p9ӄ*F}hBX֪yp'l;Wh|_z˯$ ^21E#d %YHJhJ:d Ȓ~aA{k/~ځK|K_$L19$Nq!~"GʼN>^]^׸rjJ IL(&!4^b0$Zņ4he}'#S%Қ$z4v\0-H"zTm-^ vG>GO_(ύz|_A)OX 2"M1plJPg&'q:xprr!GCԷ"Np0Q_[>9D$(aE4r@ݥ;qeS}a6#MGѦ9י(uaVgΗzw}}ˉw&/~,to\S<fwA|Xp?r}ē/sJ<a.i:/"ŜD!|=TQmsP)~M?ck$z-{ GW,_Y矿:3 o{}Cw O6#i_'W_fq/C"BMXbDb>* IwrV% ci% %R$;{C櫂՝mu&+\}:wAt)LLZ& igoEZRtZA'ɟgaK(%Q)c}#`5>Ս]KV'c==]jbSb hS/ p(]2rao;iD{irxhn~=X]\o[kaڵ[?͗pjV^=:LO R}}]Ak/?\Jx]6*g.oh' Hs;O2Q )Ur.jq7],O>u'O7REcG4B༈ CV˲݃ A)0zRQ.(tpR-.,7Hm68q$9,cD@;jr =JQ+J/(yd!w vq%40u1V8tl? j~իkm:8r$psBDBJpc*8ghsP =`dеyu^ $J.Eײz \@c{a" @([Y'X1pԟ7$iS`yRxN~Bи57ϗ{q7xy1  9/&2]fJ#ًhwFRz Őz!dR`XqdLTq٧/=Z{ kQbI%+nY/5rrxzKRyL]ZCMJA|3\k4٨CJ͒I)G,uAo&S̅쫇̗\*C>8hpHdc6S}ȅ.ZC;tR w0S/KQKrR[|yn+5GoK{ cIo`PV3QҴN_[4$D=>3f8B #CBmQ[4[eǙt_}~o:M3i.?z- 4Q{Σ~?'2u^ gNٵDvV WR F"D5OI1V{'̗_%a~B ڶ 3GB>ڗ _0 RtƖÁGB/ɘ -s, Tgoག7ӬdLLdd4XJ]Co)$K .KSP d $&*9p4$~xAdB΢Q'&op(Up`6VLf݋^d 6a DxqfO-Un+O0?UNMyEM B YT~dqFIWmo*A [ٸKDFDz`0o'?O~X޵;Vʥ3ZHBksCg_agf2vqs (gZM̫Xcmd,M2M˹k)m`bG2KXBr#G*Kza4חl!CkrYJ!`g2Y+P(Z=ǿtO?7_7O1qdN)9?8GBsRjM&G[$7 k FA>v76yM>{/=vW^NҴKcp]õg.$F[A1S9_akq3R\Gs8A= D qFqS/\}vRj}o|R1߹y]J-BgEv]wRNc~H>~^,o ,B^R-K|OQ \&J!P?fǏLbUMZ_N$DBgh94cno]b\Pcoepre8)۳FXW%;km+˜J=j38a G1.H!4 `O,1贍U!MrC\JH`/?Ɂc^reOXk{bQQ,03LbcBR/BgFϓT}$2:tCAP(S/qoiohskO6u Upzalp{?y񳟜Ɖps34wL-LoSdHc+D.QC3˼tCfVvGI&g'ȅ'E&|*{~ÿnfY!?px[z}S>uLxBD6\ck単C['(?āX!wh6Ԑsfh )QX)CI$$i&ƣBA ;}^|:[44770.op}1pNgs+i._޵ػe[hؽ<ٸJC:^p*FP,ۼKiQFoUuB?".&j2c駂$`2B\LO}e x *PA02z/ç_+8ٟqGW _ޗ"(Nޤ2Qx7S4"6Y=8Ć-{1*EP-;x" }yE'*yבԧ8Ju:o쐥 }Sih=\g_Vxx!#hu"{xumWʷ9G8h#6ybׁcb8~׃ bG05D jlbvԎJG@BJ@I?A򕍬0xdjV\+ˬ^01a]AsEcqgzaLR<7Civa=un<֫&xA)xY2# 1~4}̻2GM7PORw\[) 8O0S#%S+hx"ai(HqUyAIOWi~^_s`Bp`I'_SkOcɟo?z烃o8sHLy {?'^Y$k4}zͥu6΀}-dH7ZMZ͛Gkj7s:Y3#(`} N\ /`H 9w'7HF?Zfu5o]߷PqOjAAT @ %G@᫔ lĥ@:Hqs0{8)L'4̨Hg{ D;@櫬]xWμ؁j9*i:C d'7?6]p"0f%8 VF-;.kE'@(lϣ@q%͍ws_"'c!McVϊ ~'lyoK<~oع7(WM=J v7쓬._u>du J%jDMTbZfr@b Mxz46hL3Zvt˽~uL>*'^x|[/]aGbА(, erI^&Hg^#AhE2y54dΝ`u3 H+QJf6Bd=Lʓq.,5)ȹz[c1LAބ#sFG*DʣX1~(Źq0)evQ tbXe8&gNtvˊAhHbi Xn=W83Z=dΉ wL mOg`HpmI)M4RZxҐHRlű,/c;Т]dji!#s<|~~'|Wnl|?zu)=b^? R4I1D)A*)3i J8N cgYRv9w䜐ʈKil/2@1h4hܼٸ"훯n TCL2ӫRޱ)-]fbp5BfkR% q=Vs?E,GF!$R0s5 Kj׋)-ʥ<(DbH@cb[[@XJq D;@]gN^K~׼ײ?''2W*pZWyxc{@k҄%pVNpeFaVm 1<5'jT*6R4T)1:1+xT&5rry7w:_~9~]X5L15&-FnJ+dp;gҸ~^+3SK3sG_ۍ3aVKO4?$bbM0!jؖl tfRL_v  \nY`(;g ;}>^ʥWsEΟeY>zEϲ6`i*,!d|:^b}k aLkޤK9+Wmtq%ωzVR&IBoS MIgY\LT-, Qb6el ,q,F*[h,\C8nuA+,w6l5CE&4A \fFL(,"Д$ڙ3.1m3=U\W ~Zɽz;r#{KK_x8]"viQFHvYFV2^s]rNemlw&a0HSE!5q*MQ%BeuTe%dD8rt4IOWTRJZXH ͍vHt,sMy 3h\8~+'Ou0 ҙ$hn5Z02=FLL侽ƥcҗ_ѻwl*\9C`G/4!:UxnjBtJ1kgR+'b}n2X c}sPϩ_ݭZ+7Z(Vm]2HRIed7,2#GE#8r`jNm1;p09^XtpL +yDA̙WNa+k~}T,r!KbDurvp"92wM]\ BFM,B9ĝenEz#H l--h9Z'ĉ"HRI*ץ R%"Ed.H^w>Z+^jy2MblR%O\AJc0"C(4,*I;o!z\Ax:@X]\7>:Ok;x ?J%5k6A8/ htr; R`brRA&mјĵ-t `x3 cz`O6/mf!౧/tdrf5n.u81L=Gx ,ɗHa`.9h')@oczC{əYl is(bN;:oҎ~'4exQQPsOO}ݏgGW?ĉ?u^Oj Cbv&i*SqJb{DIVϳÏ?LÐX Pmkq*H,y)Oa媜9~7TJ.K )4>T**HI!L'J #M4OVr6/r"9s%^ipAVk\}z6[OxIݳoizx@8Xh q;7o$}J! HR4ig ]Xsv*/Xq"T_)^8}f9j/֚BSKko옰VEXϝIe(&Q0$C<|aƭp-#]3B Izeu<ځjo94~(U=C|I~w~T"vF4`.*>IotWiMRsIFKalsuf+m:uD!2JLHua9ǭ?_~ɳko~ߍLԜg2k34&DpsǏqc–O35^gjaYTt"E"J9Vק>V`rn'\\Mj;Jl~79Fq|}'?u bNc}#^{cK'yBSCXE]6o,ݦ:I%=C}kІ,Y\lcfQqHLnVõ%(^ X&ƦJimvv2i'3;ܸWEu~wC?y쎉Ayt4 44[fϽ덏?\?KG #cIp :h4$+LUX"i_cy~($ #bȬ2m:HbM Hx ;xəS \9<\V`0UDcd9ZMoldw!&$("$37 8"|i+׺FFl.h㙂^>Oub p IjPU釦s߳gVxr>o}`qw{&S3X)^=qT XFr.$Ia~!G.ca{E!2ՊG8du\_B^qñN_7߽_['?Hm,jk4n|]߷ʃ}_ ZKc5nH>p\Ikg{snF$E)U-V8w~|gI7D6nc7uFgzs}-ON-jΣU;1U8Lm)-iu1©+{3g)Q#6 eXƶoY`L"ɶɐ1ѽcaL /vemlfB$"FF {CVV"+FACLGa4 0tC7G갶!o{L`yqoE};K@urtQJu~9VU[qXPccE[fnv':[|Υ;E۲;b[ktkDIՀJޣ&byy8Nu]77Z/.Kn4pDP#r5ktV$ Ex9b&#f\eXm3}RejeY z=ח6(C4 : E*m^AϞ#ß;7H?u}n֞~Ç8֤Rﴭ+ہJ[gq0+uR@`1yG o<~SM(8#&#Jmև˔1k֢2SeL57bpml&+6V j'+_۠?;a cuƦG\LD"$N(<}29ciG#_ƫ!|ii~ce+#W}MF{xyT0Ji.ߤZ赚\B>o54:!Z(,F#pL U1m/LV1},]ūiU ;o?td[wٙ[~[w?{oxN^úMN ac&=ȧ!EqIMfFn;N O\̎ ez<&{(^۬;6y剑j;phOQwvjp{u-r'?vb.[fǵF~'` иIZ$rd7bfBuV^`iK7Vq1O[_(dG>J.}xrixD ^Gjƫ9J9Y*1kT,-6PT +(<þF6eqG89Fs@!,֐e&f& *l\zABZXOcM[?X(Bxa^H#XkKKH1M KR"̌NGn>P@ VZ)iyclt;:bO:*~FUdڏi O|Tfat6ژN'RUo]Nw@Q-D!IҘr0Bޡh;̵K?<ǎ3@ZXcqmz3Pɭ^>2Z;;;ֽamrzTu}]fͽ2TŅO>uꏝ~%>6^x3?03OnXNٚ;^[ًFM֮JnqfU%jGN{W[OwBN]BH()$%xRkf͍6NaaHn6mܜ˕ >{Sָr}aYT*&0 N2i6H8TGlCjeuBÛfu- #?JOP]0!ȗFpLD(N)%atM֗nn4gcȀd *GF }BU 8  !0_~GOyBϟŐw61 P.imm061EĩA4 4#aeQ‘3N Ph49Jqf& p}B#1Z%nS^!wx{/m0\:t^Z-=xf𹫭?UlKnHgw)L"ꬲzcv'fjG}hi,_GԹF We-%Px alӷҚBΤ거axYH :MPZPqYQL(@"Ҙ+mVcce\ˤ7L' [}><. ѾnSTjۄ>?̮iyۈׯ"\=w2S+)Mf.;FkJI**ih0Dz-=[r#ҢprRQP*f@!id :iH⢵*a$*~(9obRLK2ѡ׍܍M9@kpMAD %nޥM݅?L,,\)o?{1~J'R~`lnLtyT#ۋsPQ \֗:,\],l&*lZyV>XɉOWm[@t[߸|ϫ/=o[ o:ZY3\c-?\?~|~7>`ML˔ƻNaw(;Oȕ SDi167λ߆]GGu )L´m!*S{$S~ױXxmP*sRx3p0= H S CtN}*e{:ՋK ٿF$X$!!m:"waWڕϰHXw-#ıOZ[>voۥGf''h: zJ5e|W+ڴ{H.#"mwݯ}Bid|m^s'k*3sDҶ g/4j⟉gN.?^yYOطŁȎSae--4)`9ZkL -o\+.]_3{NXFkAQV)3(!it:>VV/P:FѱIFGwWWRےO7?vRF[n[J\Ѵ<8 ^N2h5 ڴXzۿS[_e>snza)9V a(+_zUB^{e߳so]cԴՏo{p]IE>iæ~ H3=d(eBZ- G N1MiڃK7_'NBiDSSs3>^Sod-_=O|_jg?}ޫ7U w7}<Orכp>$5PI+t:ܜ8i'ɕ򄘴STf(1~DVVD:;Rf0E)'ZmL.pbR)ȩ0 A+rDdI=B{ԨM=.`:77~͍&/#.nac64HSeelac+ a 1tDAx~Z6U)Ui!0;G:\p!MYKa}h@ 0-5 z6(ar-,]:G+88qLKy{~oW_G|>Psw}ӛ/scCA)nmFfK5Ivn'V }ADŽrΡZS,p=TZA#-Vw>}/" 82Vo{*|siػ(\^qi[ g(XqB[ ~| <Ө'yʄAq5VϾS\é0H`8t 'S44 @/yIuڥyYM ^dpSY6mZ$T0J.4` .]oR,c^s7imX^4AHcab[DZ.H Oՠ&re+?*OJyM _b 6S Hӄ6I"ۦ0_\Dv4ٵktī/̞{yݛ^43U^Co şn^ʸ4L-1y1v}#ITLəG' {>B,RT(l%DiXI5Ov?3;̜棭t'͟5Szϻ3t$+9|k1tuw52Vn1Uה=N:YHRl`gFHB1AҦwI!1aLCha- đF =tE!.+-"%5SA@CIP1QԊ`46ۄIoV'rusKMM*g?49GS.P HM$T2%Ze$!,H I(VSHYr.x/yoa>3ߋ?7ͥKGv*ZSuo|r56Wt!m`HW zC,!p-'g'H xyF_ olR)82x8oä{\ܺ~|oz~ AW ˏ'^|& Zݷ9tH#䁷IHQo ǠkZ:V J%)$c@L҃BSt6hDeNW|0lCco ER^m_˸bЏp,(֨8A$) ?$U2 tf_Yd0N?\+X]ZBonI&Q,4!R:To3%HD)q ±3?L$J D~o[OpG_<+眢/W fǥi29ë>{Emq? b5 (e"V8G>aHjٸ͠?$MC !MÀNNb9yA|矹}񁯻,//O| kާf*ՙ;T,; aWXp1{{׃r>['5uJNv߲+$W_̙dY܉&?JqԂ V!ꙖqP$Q)5:M̔H`3R+_"^ 9ҸG' IJ%adޏ"[jR%V&YsciD vy$uνHކJ%ϠZǹ/g*3꒲]  ђ?Hh"On2J)Q"qI3!r^_HRJ>C'bDՋWpB6䎽ZA$ m0NzKZ2MggtrnVK\_k-P$W2">M](G6v}ض8ǁs ?v J31R)|x|T}$ \}zpxL1$pRcx.ŗh %* l147۔IeE+N Ѡ H?ښhM ~LFF CBSs zyZOhi4FJ V؆R@FvQԩ@"ů JQ۶y|Tph_V(<WO0YHRVZΗ7^y79}R<%QZ HIH:cAJ[/q*U!ZIU =B8>QI~_̨O_XzW7?ι>/|i;Mc[9L0#$aCJkcĊ &SHҔ648{iF%W#؞KcFf .-$1?8~w*"ˋ:8b_vqMiL*pr\z,NhGČd]E6/D)@*p ̩F)NМjc%?D@sMhsz$j CegdBVRW}A;BXJTq9-Sz Ҙؖ[孀oAb`3h[ف9p}Zdq5rRBq>j0M+=LAUHCDBI&!iᙚ$!Gx6Xlx?{ޖ Xk!pHQřm}7|{8ǜz%}W6?;1`-l4c~DĨ8͎DdqcȯIV{ w22RgϮYsO6EO2\K{sOolTmñ1/$7V|hTv85BLd1q(ai1@ $Z#2>mRMVg.li0a1@HiS4;M]IسH +Aohu01Yfzv(0u:. Z6a [#/uٻK'A֛o#3ظr #A%_L/991Y I&}*XH0"$L޳{OEr)Ϳ{`02m8"3'1{` [R/qP@ea: sa#A*c^HCs3?6{crj7ӟWLM{ .ǟ 7Ɠ_2B&vT/)*!,5c#bYZMIB/ DXY &͎)Dd@ %T2@JT$:!L{=t'k+1AlQA?26[l75LdHi  X4}vٷ%/3y8yS,N b6$]rEyl.] Al.[}}X̎$۶0@N(? 0=b I\@kks~p?řOpt&wzye7~;Wi#qC˟g m16#I!(=L1HEJ1DHI&xfm}8zJyGFr8}:y/ط O/lxCeo|gxo$ߪM6F尳6G1 IJiƹˬq&UMkv"hdwP&D` `b) E"HbLKXLr>7WiKYb C2mz0\ıM 0Ə"bcO,dbQ*[(M:qh#$ffӧb'L/F4Ն]LF?P=77eI,ScK!%mb 0 #k(v6A>8Ab&ra3/o0K#S4ϵ^\{;ںayyܺjK7Yhb  0$c "!M? H ,J_1R*O86'_”B>$?DVPiR1~)8RVaÚt-DSp\La'}r-X)T%1DDb%D$tN;?H(,*9s]ֶ5UR6A%F C`(hm IuJv4*NjL[bޣG$WO\D WCF$iJ$˯4BJ(MF(h,Ĵ,03@Jx4XC.K~Uswfcck%g}cpJㇾ?|3oXW_-(Nfĵ@!4Y+@JQJ$24͂?0z۔n mj:SX\ S*EW?+m=wO]Z7>ybzrw#vuCXÖ$B%Ē/ |f_ à׍hhbkZ>Hea iJtccEf3`CXoؖ%\3ba06=0$SQi֋RbP-YLzRP.흤R+|'|3WVxyglEQ$ 1RcϜXWCx@[V,\gb! I:%[+n #!tW9 }9Vt|{k y>ybgb5τ,|#^-(e@ z Ͻ4ncm!%!_0좜NJ 14i r)1F hZ 5V͝J!WgOp\goZ^f^z7/q][K#Rk]kvf~>7]aee7ov9{-JX4MN\h%xy;\:퐕iJrX'xff [&+ nΦZlBc\a2L_a7`u՛!##żxyJ$z[f՚T۵r=c z% DȄFsH?xӝ6;ZH k_ɺ( *Ξ_3ԧF ? 4 P*Sg! ; |($o L#[ǾO_#ճ] 4IQDgbxo30{s;Kh`cKs,cJE$Ie:̂BI+T#B\b8H8vnfE>u"gOpGny79jKo:~7yoc ns/_ҹ,,l97 DK5d#EfR6Cؖ:U,A4C%p(3 EhdV ŢCu`N]ishgz!RBM30z]11#Ra*K\dts<ˋ'ӎI͓1@hyIWfiAgdn0lX)Q*) 9LSj @DLvj`G,kz?5aԩߍ7]=tq?{-},>XZpm!HB%0l"fV | Hr"Wovc9-e8ͫϽp.fo[ezC>K$ԅF;9|g_Ս>{06HcKv`kKFJll$ITi)hE'n/+X$3! HIt ;2>g !RK4q1\PI}(n§\ؙu^J`?qe+ZhT~۷wïhMāM8{v9{avH*<ˍ+T 64X4&Q&|!D{mepR?O?N=sV6Yz^"6Upxdzˋ mZ Dz,mrrDZ ,-ڽ>o`ȄcϜ 8rǥH!Q¹Wl޼tV BAV cBI],C$J#$&3O4&"X l((v @%)4Mɹ.{H} X\reT<\BvM֘[-1J|u:mD16Q2 "򶁡U֘' TVΗ m#n7zn@wd|}(oɫ,w86 vaNc'N_yKn>ePVhl<(cl6 wP*%NRYRiH6 %C72ږđ"fJpZ˹s7ln(Jޡt!Ћ^=A>gS)9sI 6L8ha`~"1B"R2c067*-!Bw>wi(:JuBrpwG bF/jZgK2 >E7#0PtB[KݯOn} VH˵Ͼ/n6Uk79s0{9)rM56;>"N4I*mQ !N5؎l~ʫVhv R@ LS>./qWܺJ FB 2h)R@)g ">>ڦs$i, Ķ@ㆠj@(I*ql!`ff9/C2 &p\Be}m@1X)J@`cDJ۳P8DŽ)lϡՈI@lwzg՗=ZPϣ)#~wHk*g#D͊=U ?DgG1I)Jlg\Q{obm>˜;uFy7G6۬_yB"./ҡGٙ>Q@$]c!5,cez'ß-yJ^:֋OZFcB*~px2EjƔ9BHiwGז 8EƊD+"%$&*!Mivۜ)23rs5Di0= QhXc.m B̢ʒWQE 3"ȲqÄł&MSYZ= |EalqCaXo,?\#/D4fF瘘|gs: DA; q#P&3ݔer1LRålKY'\ܤk؉{'_TqRUwyxnɥ=3HX#-"ƴ$mg23kaHBStf $$CgID"}?!5 !';%A, "J4e1 EKE)ROŹ(bM4%95h-ELB.~T.~y/Y%B Rby=]m-0R# YÐ’~qs~?_:K8ADLN+ :+o*^senk=خ;)1TfMcŔfwDe` I`sR/Hs nFADMRQg)5Ysqe!H4`1*@K `|6tq_BZfl!lid_BnGV00a6k2$_7Ͷ=o,y^^/߻ps3/{|\K#@mH%%/sh1k8 ɻ;fMT iv3ܮvNy OZg1-w4[`tf7~{AIEG+4^òlmU*u/a_b ZquZDIP ÒfZ^v7$;4;ݷ噧Nq\jh1`jL#זxM=q,Tat=}eЍj\Y2VL8bJuv<D)GJyv.1kj4q;6 (4[.q|MRquM4fy%@NgPR404[M%m9͹(r#;ZimLTaJ$ØTe>Ih{ i D؜/w "@X2 ,(+aBcLgE9O~cXm} pfΝ{/6ݭow^4{yk$axzl%VMkupQWH- 9Y>۟a5$B%[qy A@s-AJ?wݻFq 5VˌNڼ}]X3&1!Z AcIФĩ^._!bsu!Ƶ+['wqz[6W/7}\ˤG,c%Fh)a(4ad A%BS(Hy?v/8Yr-&kTJVVybަ PJ!E2H$T$ar GStIUY5dR` [)Սq"Momps 77pY2KVO$J^2R;`(؊RVSx9/xe]U+<Qu+W#4qÏsgjS9n[N:7{/K-$oP*ؼY<VÞ ,.7ЦGRB%>/u 'ʔrR35G0SmO10N)$V/!DB0+̲.dG85(&ϽrFޖ<ݳcئdep`(TAt;>Vw]^/K.E{OgJ b(Ts3N&\a򔋎Eܓ{vxW{ޛ^(6䍐! |J.y%^9y+WW*ƶl\cf-?~~s׿o=O|#38[m~俟"?O}_}>{l:J'xys\V3;q^3HeTD&I1kBHI)=yT+^=¥ Rqlܜ@,FG+M,a7hq QP0c;~'I c-RPdĥ.B 3sK)!^LB37;qn_7HU3 #fr^Wz)pFfhIw\0VЋR~o>>b1UEorsuz?Ι t}ɿҀx~Oo./7݋n|7{(Y p""o}|W8wuTě5w"N\faǬ474_9t`[`D!,To,w7:HOp=' 0Ql253N汱d&"l6bT^b K[ci 8&FDFe}O3m'gۙsY`H' D?$JSțmV6ĩ 'B%5R)"aTWon =$)T&";~ M6J=KIjfwZ֣_+ ۾]q]/VjܩK|xko󜿼d^四 ;>eפZqYXRI\¶3 ܡKpm#lHR-!aZµ-4~;vS+Ð(BcL)Q2 QqH{sa7&,3r6km 2HjUznk!%G&t{r?e|LyVj0R[gv}7sdf3V #-g)S򲨪NBO1[f){eba<‰_W_uʣs/-/.\6o\{ׯ^E&'ìpm`dh nE1W4{ CX04:Mbo6Jk2m6tjf'hCT\Mo4`E~? ӵafg댏p*%N4m;CaaHJy( Дc5յ- ƧkB <{lwoçO]o>a{׈kc|_1{Msu->r[/iZ<>ܱkk_W~; [^~'f[,:1yO3;3md+,fbjg3- a |pPъT͢Z=v&%lVr-$GŠ q汢R0)%1^ޣZ3$AL2>7s?͍.Jެ|c߾qaD;ock:vFpca4 IR~rc}=:Qٗ_WɟxWU4F'&e_勜?{Çvs4g^c5dbf͍-R ScenJ 1ʴ_ZWWP)[+żdc:.Tl5:ӓۿ$hؖA%oR.X Na4:>:QXklˤR+k 2p] "I3rAbH(=Ǹxf+_^ &Ձ=u߮=~wXfq>${ngם[OӉa(ruu†?ྊ+3kw}XT62>o]/^7rsG9s:a *"c5  s%^Ldf@֐0݋@TQ]ۧ.Kr*a}VZû0V L1%Rc9@qÄ`{LMThlllC5 % 0!J$4B2X(Jy[gXFijtea)][Jwi|Jd)_Ro:1Bir^ "a &I-03S6Aƪ_7|ñ?>5}_)pp-sxbbR{j-ɳ3Q(X"덐PҔt N^L%*fXF$K"=o~#`Elm" S&&HېXt EG03]^qtzZ,@v{HXeQJ2bX=ku5ł!5̓wgOt}/0-\ejQ*#U_U^|WhuϵƴS9Ο=za˴7?jj~jk2.h>Wg{ ~R;/_W/ᨄn;HGCLClt!媃JZ݄(Q$AIf3d$*lEך\Xse/#Zq+Lރ#z Mn/pr 0#A.Z& aH`IDXcppgMp`g];YgvHzg1YZHBũ3LMVx+ =fv6OrϝT?ɧ~'(Õ>v*3Êر\^ kv݋«߉?\̱/{lyw7‰7߾IrH4챭qxeykהk{3k<#9ek$*QY%1 ޾ܓ~ vmX Er$~q7}:-y +G?Clݸ˟-{pt6l_><`il^͝h6XOw1Jߠ:)z/=8ܹ[[`ue׷YXl4^՜>G@h^*"A^7jpL5K=M+HX}cg68[o|#>ssn\ޝ#up728QVB "HMhRQrRPMrS(m\;ْ7ޯ{_'u6?Cŭ[|3/LW?w::n[[:~ŕ>ZA̷r}c,-btEn<&CTb*-я}' coɔT&bH qMoqYQaե:j7l0rjB`T;pXQ"G3CЉIUD@.rk<]?ZNy%2½gu H"VvjHtLCi--%Gv Gy[ヿ)^x/a"տۚ~k䗟| %?VB g/o+s\mg|p%n^eq)Ek_EJu> GґYI:Ei%teb/oqy-:hJ{n,t ޻N/BEVZc3'"V:ye<=0؍YE1ٸ[7:ʵkۜ,V2NQR4R L$IC5JL1Qle9dM85u.~> /\׳~r'HOyɶnL?xu_) JESW~gJEM5_(Ԑ)}`wk+(*~Y{?w/g{h/{-B;m>6Kmg+7( k]AAU$ssZ*B?Ek⮓ D#i{ k+K<8}jzxD"%-67N "p񕗹rcC8uuY01Za"q%1QEє gnǾ-{??̋/mC1O>}Ӫ]?y?ۯ}㹀+&m}vw }~L!Di-rw "PPe`<͸s{y㤩d|4V@)1KYRp] >v] o8?O\k_M#O鵥/riu xT؜,oW6+&h.9z?'Ʃc# +(mXy}o7;o{sSwgY'wN)~y7pߪtB|-.3sL>pg`.eGx@BVsc6R䥧ƓO]goz n8-;ƿqNNݞ/}Ai55cRTL%#əGU}"x7Y[__>G!NoEcn F_I~1y%de w{>g)Nw0DFrT{eg^Iz,,-#]\GVbQfw)F)7=*?_(o{C<$ b2OP)%݅V.s/\ xQ~<.K?o_fKpe$@!]'ռ+7Aٕ!-!y=ȻދK9o|KE"Okya0?3B "4ZWcg8y&s,QŇ? {{LvK"c:b_28tewP-m-$q}s/NiTdGܻg;}Yiƛ}q3a9 <:<,||3k"7w2 yy'?}!/at|LU)'|7it :w۟0[1W;ap_m%JB v̼ixiȟ k}h") ;gN/ͭ !t+J߹aX7kiycG% N=.0w U:Ln|>QqȇIH9B"&f=a 4R:g`cp0O=]NhیQhzmCk_(\tBXX]l1vxMPTN p䛿y;J/$㭤vy y%/-1q2m,ru|WL8灻m\|&oH 0˘6FO^2|??]_)=i/Xw7٦8NRLq}?zAFj?7O))_G$wci,94I5eۈz@,Jl^᪚4es7֎(mO?U뫬-2n뤽ý}ԶI"GLcϝ`41:pD=pIז]ٮ;Koq"\deCoq|zIHf_y=?Ͽ_'5]Zs+7wX|_mMVrY`ΝYQf4Ob~}emC<|pAlc(,7&m(vLm1ݽL DP箎xFtH9٣* Kd)1S*Vu:"sׯPc $\q图yL^ڼVw$<N3Y Gwhx#.w,,u{ϿQVb=K##^Wpӏpzy箵N};ΏX_:0}Pn.%'yÿyo>J[0:%Gzi~>OWq{6o[1:xtqR8\i5GTn2d`J-Ӊ huڨHS[L "Ѝ%HU*+IRʉݎՎ+/]♧^$}de}C}i҂vĽV*aA堝k |2>D<|ýgߺy~l_yOrEn= /7~~;y壿]w/N~p 7˟zNiXd޷kcg(V"0L)g8O7c} `TjkD'xZxRx`hгDc @N;|#/sW#M6p㕊zN*& up'Ooˋ(+PX,SA~#`[?}'~g}#qCԃo}.=";(eiu6_!xG1Ǟam]ZZ}ƒQ9xថoܸܟ訠=+&lm"g~߱plqťprM^vAU9%ݖ (0J5-(M^֤u'$`LDbZJ(R(PĦ5A*9g<~7~^y6hrM> Efc}Sg7*˥;9Z5fbk}U @)Y}"z}[xwQņȊ&0u)!gY?\\:.UPE 'Foy~?D7>y7 9hJgבO3| %Q"=LMZX+ے%imc@3-,  !B%I]Y)"Zrp0ۜ{.}ܾvC :hQAH_c0ym@;Xwꂪ o5*~ p'cDi';>x_ܞ=6 \3l^IѴm}񳔃]ȓNtV˫R9JGU֚c뫜|[I:}V<'Z+KWob8̚o{eQAlIp(@VN, ,PibrjrE{Ok9$ c1MТ-^VDZaFA )Ξ?'8vj0T6PM,դ=gXXY3@6Dc׊5;9E5 PcdI!Im8i׀OSmNoKSxhӋU֐/p0oެ)W9svųo3O]!>r?ĩd;wT:k%eTJc d:73~RƜ%=У(rڝlO8s,r$Zi1)%ıѴRa1:Oe%Y8Hh K^H(I,A J =K?*xN]cmM"&tޢwsx.3MIZrܼ 3-@N\!BBU%XQyi?|k}`KG>qs ^};S<2=Sl'~NGZn+^ ?JOHGCƜpTCQQGHK4c pv-J;b8)jKE-D={ÂiYm)H#0F18IWQd)bCl$H)W @Ef6a$n/bm/]pLoL˒UCv,e%hilU?~0SHa 8֖?{T&Q WFVLBYx[$.ju>,{~w jR) &Vz'W·1}QX>qsFS kʭBBp\ׁ<#գRWbE(Ki[2O'6马v*+%Z j.!o-FQÁ: J?$x !#n҄ Dtmvwgq8(4q;[(օ-DmҢFKʸ_o'ijl)K];QPdf*}zjԅ2pܽoCB$s|- 7NKxY"dR8: }:'xRp!QL&9K0M vrKd${Gh-Y^Y"%#;ӥTk#ԠEm< $B@Gx5qRaDG}L-L!#b$~DϙS+L'cOV u  7FbndEIY$ܷ"ij?]]^߱ҕQ$in˙ kH!EƃÌ*Ns^Y~j=$?}ӏ1=zɍo>y۾Vpο)~6g?`kfe {9ۦm;⑯{3h/_ j =s&nGӒNKU0 h|"xHHb|4BEJAiddJ|gpg)X D~ "??~/9~o$ e-| fYSyS'Q D<]DpJPD '<"2DF"=(!9-8yf4MtVxpEPW&lMVLA^2+m!xT#R"D).QFRGBᜧ*FG\7?q[ -"υx{}zbj RAџ{ٽSҰq|'8qIOB^Ԭ gK{S>nHR*D0?YpoY;S/lEvM2uFYJ FIo UYQflh=z @AVJ Syw? r\pz~/F8c - FJIG ʠ"nIT!# R\-Ea9\wh)@ X]?Ż;U,,J0(-p*5x#OI{ [v,.P]{K]ͽV7fdv<G?M%V6ѾޔJ#ddZ{%#RDI|iqIuyKڀfrHP&HAp`_dsoH8!$iN-EbAdRRB;%2tx!όW!TJ j$R(PRq ۇ9Wl퍉~9>rcuau$uebmAĭ<(crN5qX닂{Ox)8$5ZiLc3ٿʧwXQ䴨YhKvDbq} 1>Q,,O~7'?WE?zcÜޭXx c'YZI1HY"C:syy 4lZ7Kf/"#]!!U6ƶq7}?J-I[J!`C!RA$^kKpy9u9jtp?`okQ[#^2`ZEBU.L:팧\vJ~Uk/Ka\X\8hcޙNt l xz,/쌩DYG$ J*tzұh`bH ZI"-c+KhT3޽A== YXDȚB JN!F i$ fu]SJAv F!t0l ^}խ"_V\8eaa # G lJ%c`+<22\7;]e|3^4멮.'(P b> Ǭ,VKVD46D#Q _"} |Rh1z .<Jpp4屯{^N$!HZ $xќiA\U*KqtS50Q^>aaX;ѡȘ^>LzM(b~pw-J!5~M/,mʥ-Ls&jz u2j S1:FEQY4"h%uJD@)\ XkҳHHڋ,{qg 57aeƎZ C *)4F*d%Bjj8"8ػ-sNJ.o ٱ%mE^Dp4θKıU Mvp7MKX+ȘOJa_}?NRqx,i3N)sD~1Lm# B"h 6jgI DHeJe^]67_L%=P i4Zk" Eu1Z1K89EcAkeY23vwBo()Gdx"LH= 97J:WRaҎ&|$LwDqt" m:VH |ͩ2%\hy Hn޹%ex Xsll%V+@ ""!' MkSwqg`+X_VsntJ4ݖ"4ZGآ$B 4XBM7[Y{3&ƌBv3T&iIRDF8iQc:d0 aT j @+ռ}h2jsLkY|`":r9 D3F(Q(Pq,rKU yޙ08کbuI2Y^ל\hl([T9*X'$?*'D͆@@D;KABMTdvFwR y',>x4T$ҁ)@,k}X( kzrWnN89ڊH-='7R֗Ѧ C8/RH&8 ;%%"उ6k!pz]U*7)1nsktLgqj2  HŚ*4s.HRR";p`5u5K<.r^YhG˨JOJfWTVh(=;$,%RFjIe=JkԬ[ j́$u1<8@Dµ sˬs4NѸb!B&BYl 5dUU@gD61AUk!(t1`D||n)QM]մ~*x"##gT q < vEʢ"Nth8,l(4u*PJi7GҪIRԵLcC>(5$V!e>&N'x[Ch$#1j&ށu ˹ R\WTxb7WRB*]YL v$Ny%l8!4f[3M/= "i1u%*V8,RAb4m@folH% JRZZEҚn[s͡t«()&O~XRZtÇBJAjstVzc}EX;A$P nn^TAȥ fBלotiGP7TdEI]l"g2"`fC5gyAe=Qp)$AjaD0Mʲ`,f48TqP641(=DQ &IDmV &cOK:xT(qp sfTLFHS@ J T^[7?@z݋kvYQnʱSgi'[PaRZL[?9q([BQEUJ+x5Zwv ל;>HB68(=@!x"ȳ@<6k,xB5X7H%Q DCXGt[vX'#+< bfn6+WOfרN7we>'\x5ʠ_;g~"qbݮmlRvDžw&]B*9[$ʿpŹ )Ӫ@k*r3˃RЎ<-Ch V7e(!"f EMUUdyIU5tn'rgJ6S6UQ6&[[,2pdL6πCp|h8yH86јFG-J-grp/Kӽ͍ٺj'xJi\ޤRev Q3K0 /( hռQ QJ[{L]!3h HlUSWN"iE_zMhA/01n!H!1FhA4KiV#f'Rx #-($WM⏷L&## '~hx-*E ! APWV;Af)]cgbkvq28ng.`ivω2:˴Ob7F)M^"iǯ (RH%(RVBpCi1 M8D˘nxOd-Yƣ9\g#j1+0[e l7Ayb#)x^}`愂24Ia] 7'!HwYPc 0=݊)2K:D`B`2O$DkM-F@ ݌?3`Jl;h7!<$"I4#'UM(vjū\yO/|n*aFqr6#6(ZZrv2 rL#,5QHZJh]IߩkWVނ,@ ìf\Ց9wşAi}[@\mɆl*ѤQL6r 1oġnf|h D@`kO]FCTeAmK>ѐhLUVP4DŮ"1rh%ĚH6F"d6 'S)IlEk֍IjbB52ƹd@QYRYTHd/;Nk5븃0 A&#Nb&_`v?4I3rf}fxf Ex8 mvsasw0)VLEH1 cyM뽈d1(zIj BίvJjLk{ŘD[+\+nrmِwA`1.t1&Q&wqXnB6yuhq(I,.^tl<=az`J6]o&T4/ȫ )$耠ۋH"VFىAU7)Qĭ񾡮 w DQ<2R"me~ /4)ƴ`hDiN^+(3;&H@48g̓9ۨ %0qBoeajD@vg(褆;tZZ4ρQFiUUК(2,c!%ASlݼ(>7Pj:o9u)eg`QEgq828(< ,,Y%:B:bk esl˼*pHd㱈(sfv}E,ISC]y\e5x5aIiqB442\C[h%F魑|8g1I*qgs k=Ruϝ[ޟwp_pj\ HTEk"yڡN *R ,pY>۫b&"ԕ-.}UԌ"j{eQ"ZV=# K0c2.%IxZP[GAd Jh:-0UM^μ)[O'H28"mgo}3|q5ӍmWYv W tkv~()3]_fxuq5AB,5H_R(k)5 j+S$eFOLyʱp{?(ph7mJ뙔\,P֑&XoEXm1R:QÊi`e =>c S?v(s})bR g p!PZlm!U^x)勾.+ IP1J+H=ۍMH*,a#l^]٧BhvAx\U)G,,N4WDD6fm GT#V5qn2%_Q)HA-,C,e]bE)t̍u@+19gܹl6Vm0IR!d\hL6u-IU@,@؈EJī73 HB^ Q5XFQv:i k_4+XQ:jQJ"N;!% -K!CRLt:d0UdKZ07q5}蕮_>P+W) R(MYdL9N)mMK jpNήV̨_3^Jbk]HRZ3cC7mEf8,qV0 yA=24{8%@kAYB6q < OTT, IV@U,, %;vY:ּ'ܗϝ 5Aѡ B!A*` Aԥ=uPotrRyiXMl]R˜4JT38c]R:%-E]SYKnID‚3K#Hfp⃧+OVl-k wo{aVRC"Mo>cszPZmQPg928! -[LF\z! n .λc~`(";\x"L F@,%`cw0BK v3ZLj`ŦZ?0 ZG,ޕΖلHk8 d@$m$J5^ÉSkt:ԥ`\#HB{s .kDR|MbK ![{G^n_N9d~}yʂkO+x0CR%hPTsJYLtډf0,Fԕ%&GVQl$+puAYZ?"∥c-EI`1ʬć@5`iijHҘ%DZnw6RGcvxOFv<[l-R=WE& [7yp(шK x$ym K03%:6l>4<}ŵ%Lmđ#/JYӉ @U "ZQI2[ԍFl P[#(ҳc j߼8 DikdZh)!%Q3!vOns}y/uŗ.ek?ZfX7O?x+tIc$tRP֎v+%Ң%<13&+a 'byQ6 q&x\Y(rY7t#:1qSՎ DEMK۬ .@*1bKC+C+8KRđyne7^_wrw\fd"byPӊh""z =ZyʳS"R;t_O3/Őhq^|-F@DhiMX]eŤ3##X<F!I#RK sGL8ҙ깇zb97n]wt>< ND'VW3J$& :'1& %E8K1sunu)[\QiMaG0kw }S|# 2FCpkɳ☥n˫}d!R|0Wb-DW8i#5$!%DTIQ5yډBiȂ $hc}"`-U=GweEi-NFjk,ӊ,PxI^YF1=>(^D&5& z)i;kKyp_UNݞ5 #(g^&Ab,4#j|j\!fI1R!Œx$H(CHRW9^0kGE^OoCslNB  6n'E")FSFqVE0F_|ykW^#k+ =8" iQWDZ7H뛘*jflL oL M+H)jQyKUfL %(ЉA&ttI'l,vɧ%éf=3װD&JѤERde$gRTDQt\.k;+E,.FKj J%7QTyҡ fBRS[(z6ԁ(N.0-*HAzl &^%Lp\O+' ,(DA+bvۺUM]H)q!' YD2[@_9$J@@YU,t;L B12xjߤRUYRgj%iܐG5m-!đ$NJ͔4YĔEI99?A+L?ӟp_n8o[[IG!r %ò=T8 J@:o8F1Fj|9݃$ A%>μݎ"EY[jkFoNVF+#pRK‘9GӌF+?'7s}+< R E]kId|3M@54Z6 "#DϜdUnڼ+6Y3IQg j'RdiG,yѨxՀNEi"^FJIinQL5:RWW>O?9}jiD&MҡR""0?jJc2xpxk85kVhZ;R<+ِ`*6H抪&(! AV}T/5)i"HcCltC$:-nwFW8/BlKO,^?9ϩ&q{jE uq!^uY6 Pn9顬g\hH"#4B#Mƶ0:"4 8:Mȳ.}uZR X FIw$nvbglw8E(9Lb4?^t'(햯f- ! QH cC!plrlp!PXgq5jq~j]$$iIH#Xl6p1;S&TJ Ħ(|]# JiS^õ#Tw:?8՘ vϝx5ۇ'G7Ar!ƚV,2PƼ:CR6j!@+A+$BM1k(91AJE#Y(>4@ѠgW1(LʤlqsBHIٌcuu5_ |O.=RB;hoaam-m|Np7BY F!gN,i;be =rFa ~#{)Rz%X_8`$jkA;$lNcZ:AHRps7qTb؞ѹĭwemq^! QGP23-J/lm\=ܗ\>2=RG7?-G7>Pe>1ׯ\ۿ\x |33 <ŋ|#8b4Q 4YXʉE0BZmTDjhY0+g_fUDEI8 g !/=5ay^S֞DZib;U5x5.Yc4[+pOSU^'xP;lkR+O?G|I9 < {c[xc$#p|)≻OQ\|&u(Њ#lmt(IKbG.s|N:P1&d*]O,!.E4TUC3g,JTbGjњN{c3g-}wnH;v} Ó/G:`t]&|7_J l]\s4Y%<\|Ͻt4ԣ'^B1f p-{)mEkZiʱD#FE I'ν˩`Y~ui8fNpfhRK#5+K)wmX<GJVCVԼ|O={;Ib`\nb<{wSwsᑷq)Fב#c4rs}Er2a ZBnScm}րl2f,x}71Z!^Li<>BII[݈6<|i.sk˜8shӝa/nMp瞜79uVv?z UP)NŘlB4@/]٧?%?ƥ;\3ÏabhݼB ٹ /}8 q^wL<~>hk7}*&!~`Gh}{GAH҂ ,J$[ OlND+MbywؼGGtmw))/MĀ[H()PJ EE2TA?3|}2 +5]-XhiVN_{k,p8w$Ʉn#pgo9(YYjXJ% <u'iS:mͭW.[?é{|嗩;9?[k\2,-㉝IyDXDTeM ޭˌ nmJ":!:X>~a3 oȣEͻd~}I'&YX &꣤fGcnmح4H{Nr22jw)Y?89 ^( FL@bw`^p<ríܹ~;_ 8Ȋ7nwyӣ{NkkZҴA+TeEIg^`m&ep4dϿg}рDou]2?d\)+NIo LF !{ןcoQ@$徢6<5obe$HvvIA]HQ ^jjQ,w"Xa]׍ JQj_L'عMpVҚnqBO;iiEd@79AJ+D(q^[,wbqGSvNI;c4F ncᅢu]ӳ>w? _ZqS-V@Y"Uئq){ fL` &XB [չ>a+} Owu[*>WժS}{뻟5۝p_7i4 0`n^{M^p6cPJ/T0yQU#q^E gDH rD,8\nEY:@Q@N*QE 9t4mr j˥W8ܭi+}@;fӚÝ^Ҭ 2Qxͦ*pu}mCyvY5v.]~F%[}wqc/`1f_~6pSsi-LKa6FewRs7ƸT)0&n ER䑫_\H1 AbRXXbf9$ɬpUkY[m#ܗ1! E{?歇@Ȭ  B(xd2U3M͊|fI1b")X6=O.)mŪ,QQvźwJi[RU `MKN JʄQ C X Z&zClKg[o-|6l]cE7> `:Iσ%eR g:RT#o69IpFX-,V-uhU\wMMrnDj{g|füt)jhtr6_uyC(NOhឧ#AldˇG{pkx MSB^X?]~{מ$-9:=tQUUYFUA&3+ɭK>)K{Ǯ8ӆ*9^UτT0͛ѠnP X7Q/ʗJ LQXBИ{*fw\ީU;dW/d4}H1F7n! 1JaqY7oz;y6 UNk]9`&NnsN\;7Ν9.slXmG(n@9: bS+fӚ µ)f<3\}yiCepO-!+L d@Δ*OYsg=\;%yw?me)!x [LvH9c4XhR;~#o2/1MG{?׈ΏiG1;S.N8+GyNh##ˤI]0={WLǞ=>bäjY6{ GN1|ݓ. >'̦ͨIT>xN3[gĘ)r\sdòw=p3=&mn p_> FdIw~wG?{3R9_=qίy%!@ʘ!ᝒrJOY &;VLaYIT2sԱSZDXowHe37sӷ=$ Kϰ)G2.`G{#{C|~씙Mg1 w-9]g:J>!O8N>\4O]LjCͲI)scw>˳^N?'%tk!ht+aod)n,)}A(}Lj#T9ʇOn-2]ywݟׁ#v5?8ؚrv/sy鷿÷}1֧K<8[PF옖c6}GYWKUi얜\Trv{|lGqQ'/Oo0[ iFtJQ1h\s:_SX<4ĤGJoYΗ,gTۥwmwŖp_1({uz7 "//|'-z4|ϱ;媡o+ԡn9qyD}eDagnCK >vMs({:1f ow|g_g?xq+]HW`e`bEL- 'P{B{iBߚ\Cٶtm :A?\qz >˟{|oԳyp̏0/~ST;3D3g4Q}Ze7yh%ggawRRM*Ac3FΘk#.~J1rWp;>S bFe!X7M#4r:٭<?7-{WֈqK/r.sj2ݿC""$ O/`v=Er0úaڊ-d &#‘RXKiڎ+{Rt}m) CӚgi?nrX[J/ AG%0; c[)ˊs4qOo7Ėp_YL&CY,k*gܧ>񪧏\gyC-UU0p B=1԰8[D!'6O^tMSkڃ$4oi{ǖݱLjd@o'a;5dʺitzf?$~ =&s[x~rn xLYdGh|?[vG O,W-uKEBRx dCV UV2z5( HZ˟?yB f3O~#;Y1+-&x Cf!*u R8OUw$U6MOVf#}fu)ALnKz׮‡?*B . %Ƚ7^cQu,i2"  x0c'PER?C\zVs1$1;o+ ._h hzt=$Pz3zdDYoM$!`,^*bUqJsRU+.loxp,(<(WAԯ9m(U!! S"iFA/dP(ԥ'bhq"G=I)oun|hTEs/Ǹs&ӝ9!=ڠ9+f2d ޼{|q|d&B[G~4鵳MD |Q(p-B}##W{7_ -מxӝ*]P3"yا"lZ֌25݇, sh /X_ yOq% +;lݣ5dpV2/ƓlBV|pdbݢcG%!XkW7r5 vǶbK,~Fbc.qӻ7y7Qo-!l)1XSxhTb!w`>g 98)5 52Ȋ9GrNIA ]botBDROWMьU%1y>dJJ*B ƄqSFr H]$EqjrJd5X#Mn'QY J)l @w9DO[y߂ry\: K3I h&# W  q~zī/ц0Y7^'ь%7Yav\:ay|NZF'tOQi ȴ]`nH*4m|cܸG`آ1/zS_l;MoIׄ?@&5_g˒qUpz~Qx52R+Q: uYIعwnbќqBLtZ3MuĴ!(>EH@R2/9M{egT3"g Y&h|g|gۍ%[}bLEu_S+&C$vk|M1ݭU6M *Ð81 9gDlZ2N8>3۝{M|22@=9k)56dk~LԂaLWrM'E%Ӆ4$jE A{sR 'ƅʍ+<\dsTY:[ۿwpjv~k/u g%.nhN<3Z'Xc02ͦ)/P%4p~SNg@cM !s"=egVӇ|E2gMǪ<樐uh`F0_WFh2t pj%o %[ٕa5MY??Dj蚆ɈWHDHy8嘑, QTudC%RU[Fuݍc(4vcDoh{eǦ"JJT3!!ꁎˑR)s֤c{|kaHB{RLܻ?A^S?cLdo䛿ϳlZ.ftj3 w8gqRx"$h\bg%a&zvi|~ik=o}@n{S>`\xA\4!'_BL*ұ7P1?shtgXgbF.?7 p6oXo~jӧLwt❧*] csws_͏v 3̳sLyd 9ZQ:IYMV:' a4C9*ӏoWK#1 5s DQPLI)GOQMb]q1)-~+$U+4+}Q(R%7:3<8'<)yKo $™f1HgHP1pdh'=R󉿍-+gp ,+XΏYsh̦Wo. J穜0o"O#M7뷽?^G\mF{OS>í7>7_{ }|3k&- f. H ^IU`Qay,vl "gRVb/qwA_#^zl{O|+ϿNgUh´(!e%d04*+`/" dr%و21$ b[şo#19|A@ljfY;Q2fAN#Xcq6}Zqԑ}G7_=4Arb(}D,m9?Y J̙>F(CdKiHbb^ qA]r4}׌ 1rk[}&k7ƌ~9,JJJ5qESQATqV'ч Ü qeqg7]-$ֈ9HB@t6 ]%.R(zg8 w9MM*3UY%1sQM[Ϸ@[e)2D8U0~QIB&!% Ă8 nPk}q}{جZ*Hja5BLJ2!()2 ! ]A.d>1I)ꚲCTZxs+gp_ bqEo v JoP2@Ɣ0.wq1;B8+XMH2Xo^Q7/c6f4vHQc1DMwDtՌb O4rP3'5t]jݒ&_7_lWK)&hA<].жI X'ggt>{,DaSrxI}Y[9:ՒF,ڱq2 ŬS󐱴F)*}蘟XwJ66# HC4!hN_cL߮4+%)X:ې:ya͉>@Zb jYNB2?CߡoBrk-eU*r b墥+ѭ|1[9HkR8+[J鋭2זpo=B. "℘maEـ%aU1Q@2֣'wo2ʢ6wXڕ1S48fW"1dIQHLIt}$k ڛnK)f٧\ a$C;1kpA2F2dDAU7]$B v s_ͯ|z٦RNyȩ4d<\T/iã.H΅$E@bg.WA ::'wצU%ܖpo=c͢ Cbb\ѬKhrb%ѡĉ fUMøX1p! w>_V9Rºc3LHzA:tbrEso#3h lփcO{-D^ːW- ?9v) rRҶ 6m3Pwha3vpEAɀ/pHH+퍑t'>m;1U1CL /z+5fb#1+m*^*\v{{퓦ntPRr Ч8t(Bf\F.wZ1euXJkՄk*Ղ&FbhViVR5AAѡe8MQ1Tk>.fNyo URlB<Ԡi/LG+hY02d,~D#GLa..[]Xw9.xʽW+JRӜi˜}YqИ\:!Z?=NARi{T%fkWo UCY5;L S8KY!]lt:N2(!%2Pf 9FŞe_u?zN%Ɯ}B]qg\Uւóvu8[7X y5&L6YFF9OYXWuxp1t ^p%LzT(ZR zw\4m",A0T(PNBHB 5 {ѳ9M~ٖmb2-o j UQMZF)E9$H&c ߵºajC "uHYƮɺGۜ7)5TsAR򐹌yq4+3 xXj"hQXCYh]~K߿"H.kn 5}&D%AQ,/p9% Vf i_N:>ݮp_Y * }d 1v}1Ғ@͠bЋI(HD$bb&F:Kde4ћ|1k}Y-,- , ZT  y0&np@ʸDDC+߸ -w_mfm3ƃu~(xaZ1x ,vy^G.p_}|Q4t=; ,O ƀaZ"" 4 *8ܩ2!'5X.3DVU b}~:7uvp IRbRD]+/LFC'%،/ }NEsӛk[c볇doѾA?!;;b <!y8YdI(*txR2J:./c,r&!$V3.)kOhJXMĘ" XBo{pQ5}GJ>4]G)1XˠeiqաMY1KȈfmUx!f "Q-f}40@`ŰSMXU Ft{k ^ϼ^]<9fc;'瀐u,1 <7pk-(>ѥWC]TƆD2$UXCM0`}ArKmxK-|b>~tbu˘A++ "H*C$0ޱ?Y/ \-W q a5*1B蔘2J&\u m$x?訤.5*/oWwKIݻ5dҵy:DV튔 g.4bBY B_$LRsfu_$ݍfirEa¡On 5}>fZ.b1ƻ'o $*6!]utvTb׳ܬ/Yn4| 'kOlM6.G2Ed,;qkJmN|Ŗp_1MyޅD33{ؙSņ I3Q!ar,TҠCO˗z]rq2ٴ {6] &{% aer4,adYVM$]L7#k&`P2Q S"_4]$Ǟ)]R x1vRn47nXwh(2LMKJN 11.0B;U"!'v[kѬj5Q^ ZZdIy0w31zNkVELh{bɪy[oDSL[oM()҅>ċAءw*4tȒ5^0kH;}91YdjptBPeENG+M˂l*^S;W=UE`^]IC%YAʁuLD63g<:8L"Hu95d=R~cSbյmĺr.J}GTY|xᱽFdkP8+n_]V%iWn߾8˩˼Gؽt_~&uEY*e!Og1,kr>mr濝FBhפ_PK;YuźcYz* pzJef|]W)+zEY_ߴ]mڅˢk`T1+Y1|aAM(#)>r|*٢#Mp^*S,ώn#|a/5iSxA޼ r@i%*PŰ|ۯ_|:~.6}a(&f l۞˻![֛sB>7dNiB{W?7ƵG].q%3|򍛐.[QXLi1Z .:u|wyn\''p$uw?BaowkgMב3T^ !ptܰ\tؔ8XYkvvcooh΄yjR|c>c'w6S>O~lf\zYygxۄj٬#U8a4q87H92Y}tVxG uQw\򡏽]-z|﷼?o{*o$W#t}uՙS2>7x !s|~NRg} k|ٰڴn^czo0>u_?{pO=)<~ë7tt1+"wj2{%+fӰiԅbPf6[_'nm7po-~{2.7gS{=\Yo-{由FȘǯ͸zpaj OYV4mO!~-<ܻ=w[V]r&T|"?ٷ]{R Uzέ[)Ūds?SgElV, M#}%U% y.ƾnk׿&o]OM*h5?ce?1|>OU|3\ٟaA[N˗?%I3i%jhbۅ>𹷽&u-ˇ 1F7p>0 ˳xq8>YqzUB)-K(3{Ιo2;Ϸ#w8ԣvSNW5{Rʤp7o=>Ra@F 4BcF%ydq ^&wO׼=v|{؝Xp<#5O/w`:M^y̗֘ʹ|}& dww9sʌ);u;%Gg5;'P{!SYCL6*)3)~csy47bc9]ͩGCIl-*o~/~#_ $B@|bz$Y#$l) )JčƦėyn9Ͷ,Vcg<|3ǒݹ/ ZqQ;"b4"YuIUॐd;A?~?'r[h&;~r`+{Ĝo6[\圫3|:tԵcTz\n#?lo4oC6Lovyt.]?;uw~ww7G>I |˷|׮_!'P^&MC1];Mwed䘎 db!lNA3e5PrLQ2޿6t4s+M?e.׌ dTqMiۈG\{ Ei/X6BN |Q]fϊ7qw5VMpZ+X/$Z - ""Vx2v7B HFD`2*jV5.ImF/'$ʇ'2B3bUIW|d&p$ -EHX Rl2mDpDX%Q\EZwzx[嵧~̼]G=Qx;\)?c?g+of49;zfdސTi7k<Oa ˻>(wo?Utg>2{;1ľGAG`p:14l Y.ŗ[UԢOXm:9t3ǹ%j|EɄ1Rhlb|\5nL7F7?ݿW ğ?C%* ""a|+صtt˗__'L1opu:[]ŏC~#Zx߻pX(꒪,X68==ahێA]$q?*_ѿ?'g_:Yv4 EVUDQONK$A!iƝ_. /lǝM:ARN"dMHxr Rl3]^Fd/jc֒ъZTt.` qIlDʩPMLHXiU(1'[ܻ﫩.N[C6<#}HKf9޷3rGNp?Œ|o4Lw9BOg |%g'Lc| \{Ϩ-)gBJ6mlg!6-E˪ A) F"6bڕ}]Os g9{pLdp .x}=o7P{RƤ~6K%n%|}o_?w<chAA^+$ߒŔZm"""V 9*9m_V8\2D 5%jai$*\.HD:/CׁGL+&I2]QcN{olMs&-gqɨ&ogT\xc9!"^yo.]axg+JY\8O7ux7c+ߺ|Ndʪ¹D߮x!wspf8?p|djqp+u!k0JJx6e2ۣzG=P՞tD=΀ސp(G bppYn߽Ko{ f0p/;g<:{H fYC-"ȩ=tϤ|f~c~ɕ,cMS9le XRd#X+"&ddjțp\vKAq 8!j&VbzʜŹ0X>OYZ+BRh$ I^L4"MDcdm?I'L *Yh ydԙUYlV5xbz:^}#<\٭9wDժW5p>_ѷ-G, }"Jqlbl1# 㢠(,uU/!O=e~ EI[ȁ8)DȎ>ٿv0^~Э<;>脏|&O<8-o?$9wx>îMg>{ݿSz'n|~;ؿ|fз-}B2"m$%INFͅBD^$S X$dm6Vr1Fz1^JHmYU'JUrK9)ƀ"%?)фo S:O50];o6g.D[zh-)m(㊝ixgx:e=E,,真YK5ѭT. >>)Č6!n:^!f!&)wqZ>_'cU~͗_rFliɪ8:[tI`0v03I!vOO]75d3NوRXZ^MђQ-flDkH%N ,f7D5dbcI\+TJ(D1"&opdˆfL4*ΈZkLTHp6QMR[+Egwƴ9G._h[zrl1V8~s<;>ƖoSMܽsMӑr"#dk.lT;vT)WI]b#B?4Vxloqt!u=f43W dRW8X/LW)^{}C^Qv|ɝ99(y' vf1ޝP&|׸{|%{1?~{]fSd!eM'u_+?^atSdTs`<&X Aw)}VBa_K o)2@c2]4`N &QUBĹHʤAR&VE"|6eHFDL_#}6Y uYEmpV5JވPb"oz}?͡kʦSjx5oIN+}YCnv %Y7 "P*m`i/Vzdވٴ`;Ŗ] ]w:Wco%!x_)*otGI 8xT;?c4EAhX(̑,qira6~ˇ ;Gc^M1QxRҷ gl{'#!f.kfr޾ o4(&8ɤGZQg*rHD  n "x!PmPc0I!Fz'b1É^:M8<{L2RCHxwc0$!&5=ъu&1-TcR#+dY'ƈ )K+3?G=m:BOUK4@1XA hL>bA&/ѲB"Zb49,Y%b4傾NX|눅Zr*K[ 캚M0&A PdLWD &VK6r¨68$8hjIB1JGt=>( Y3:'mF% (PHhH8㱅|/ޝWRNl2pWը(wЭO9 7~[y TYϽ%w9_,.sMˤ) #3*{,NFL&% ?~cDž5;ʮ {( iNqKW޴]lM9(ߣ9D!+>bDr`YkOd.8ka+DciE$bkvk;beV 5SeI}X|LKCkHN "hΨCJY=%7i2är,C&kNȉ&РcEB5J֜BUmΈ")cEC}P&O+BʪH2;Gz8|:i9z6}%'a1/r~>to&^'ok(`}EӜ#/_图ȟv\W^CrZRNBpA2P8Ç\< n,j]%K1ޭˑZ[Zk#]5xV혬ӢtG̦ +SQYO!lO){r')KvJ&S`r4vFcXé7myӶFU)$1HΒm،$9:T1R+{F|%ܯFZ;ڃM`d0wj5)jX6(jHTh\+j3: F`#j6F6SI5fz+6͹0֪4iz~⧢Z}ǛMWw5?Ba4M$G/]gY<,ǯp~%G18Wi㫂[ uÇ?qW gK62OYH )ߩ 3o}drѪzr6A7Ubr"{UsnZk T$U#N(PQSJ)f-Xo:r6]TIIUr֘ !,2zkiMflؠFo++E΅^5X6SL0-Z%x&ɰ5r{]D#gz!|f SA:j#,.֊u%,cqpV18mB 7ltVD x+bR7h0QNvE;6xSXޘTֽst::L߶F)˚=PkbGIYm6tƛ믾kN<FB%B+|шC@`T-qh~ʢtjڨ> Rـ8M+D Uβͪs(rc;UgtAr}J̮ jmsF4cJFU*̘츨$>TI9jPl6JV$f$(ɡSQ4'd bL:\' ,I}h\a'm5FR1!lAbSJ!k&N:)r+I^6-Z19Ph W5ŨQSB1ƈ&5-bSPR(pʘ6eBI!Fgx7 ?IDAT+MG]Fo`,ј^sdfXBY{%%,uH+ pNC N_}'fr4JW%' ڕFc4j Z/UU!3EmgH]SjUc&*egES䢳9hY1*2դ{QM}땑&mɮ2Y42S-ɣ&9-M@Y8c5[K2{Lʺh6*FK%6;R.lhQxGh ,,czl2D DB-΢_I!*&JDjĖP )P!&H'F<ƇRQ3Vx&:cl-AŤK `\hz<1'`VXYϸ'D5vs*Ky1IJYrFbA?LRn5ͪ3jV!5;krU؛v}j#ch7h hFf3AVHb՘Q-Ʃ OU1VRYc! ɢQhG&Um5*ɶr4,Q4k^,kkT\JW)#j#I. <$ֽa-X=[o /1ʑsVk!h(2b-F5S -2HP*9+蓪QCNC]UmU\$qZ+4fVS-b^s߫* x٪jRM@rNK5Ў`d2V=gŖp?7:Zb IE Ce;RD,$I>˸2J%1{H"`%F+,$75&IhNMLDc`$o6h)w2 іԙ>'5"7 .ec-1Hat]gbOUzrǜęsPdQ(KI*tB Y !hQLf "B" ѬZ AD*fcTBEU*'6fUIJ>wюz*d|РATT6ٖd.Ǥ;2Ң@- |9П'. |)ʒKГ ɂhHxV!ґ) Km3.gA.URj%$#If#EĨDqd)#|kDl''J(&:lkhŪ Y,2a\K-6%"0çƊiJ5KtIH1wJŪU'}/zv*\EC5h1xȗ9 ↲7W /K08|E7<N7>۟.,^bʅэ %0tK}w/x(|%OMF r]cYX΁@#;+MErIr`E6rB=k&1Pv;k7˅wc#Acf8VNAĄâclt Bwi ;qwadL|~' Xύ~r1{w.Kkp4i(O\ n"Q^[`W:7g _Aze؃BƂ1DB =)"N' GZ7 `X_@#lȖ,<<;#^TFXGt!/hҌ @(fkQʻuOx(FuJ.w qy{]n!ߧ T $,ٖ^..eIg ‚̤c㶭pV?,Jv!d09`Go*nH,} $G?Kt rFtEXtcommentFile source: http://en.wikipedia.org/wiki/File:C-3PO_droid.pngG%tEXtdate:create2015-05-04T17:18:47+00:00!\%tEXtdate:modify2015-05-04T17:18:47+00:00ޙFtEXtsoftwareImageMagick 6.6.9-7 2014-03-06 Q16 http://www.imagemagick.orgӳtEXtThumb::Document::Pages1/tEXtThumb::Image::height480tEXtThumb::Image::Width250QqtEXtThumb::Mimetypeimage/png?VNtEXtThumb::MTime1430759927ltEXtThumb::Size139KBB&{3tEXtThumb::URIfile:///tmp/localcopy_dab3858e6d17-1.pngVIENDB`PKHNW>><jupyter_book/book_template/_build/images/monty_hall_goat.pngPNG  IHDRz=rbKGDtIME%I1IDATxyxUt$l ("rq:quq(3UT.W/:Ό *8"&$ @stt'^=O?IU:=|N]tҥ;JGlG: ]k;7k^TT/4O[pW aX+ncNrFD-|U$K{$o-O[gj'fk;XKf`,` UJ8~%T.eoiO {i@Ԯ  ũ F#9 +`Ȅ Vs` Շܟ%ԕQW^Z h,wU,yLΧ,mH*=?)wn=@*`C{//Ky  ՞,@agFqZUf!I%@6Uc(RQ#%4UH JO03/󅭧꾰)}Cƈ t#%Txxϋփl=8bN N%a𩈄dv7hW[O.l=,Q1v)-\([aa=u[O3.~[OكT>NE¦xQL lݽ*lݹ,bPa7{[7-nNE]t\Wa뎵z8u )"m-jp`'i6..xYqXiܖ5ˏmpaZ;p0XIya]&ͧvmyWݻO-ny-@$1<3[5,z4{[/lֆ~#[mW=Dvp [<.e%T6}2~YP8/]¤+oaapc W]q)Sf2{U-ˢJԄM!g9ܟ[p`(p/M׈{b)CŇywpڌٚ'V&˖&;É'N!%%'&M|K3<0oݷda& '~]|V`;lq6J$IM&reFi֬Y)EEERaa!{aգ-ZXyy.k>fV[~l|bɼKQexZ!N W_}uދ/8o{1΂ _{5ErjJA-nǁ_u8_k&ɲ|[oU|Yg1 j*`x$ƪ)U$l`-cZ}nN;vٳg7){JĉyWL)))$FDp-kueה[lw5\Cnnnp]LSW-bтMe&ŋ$IbΜ9I7EyRwd:Dc_ԍBWHƮ&bN +藰i?;0F{ha~jΡ]-"$In槐d60֡p,''՛Fr6Vk*RwPIT[s81H2f+}ҏ0n~64؟eEc.X9Iev+Gxit%c6H5[1onkN5C}PX>yJ>AEKc(ő;k߈aZg$88gbOťyۛ=y>5i9Z f67 .|` 3Nh(LWXFNpG#k%(쵇c2Ժ o=U7ScH($pRr:a>wXBɜ=t_acCɌ:ji<2JNg&;Í8ucȹ8:S63m& !(x{\gyD>O9 lyLbM\<=ުe"h T=,J9 Us\#Yþ%Cc\ij 3r9'cv .NQպ+ p&fumuv,Fn>S@-+M@ļ,8t~շP:?W2>^ۘAXl7>y]8sB,[K<[;dhژ-``$Rtfӵ|GV@`%-Rݨ`a@mJvf\A~'I c"ixeON)D؊-&k{02; Fծ|Mnɢ3ټo! Qw6]kH74:R9aAҪ@OPEbM_{Kndoْq~+NМ67:G 9x0WXĚ5k+?m&5J"fdR Z}~կ/_{hWP_]Ź6lɆj.di€06;ju?k)A7YGś|6~2U`!ò6Ǽioc]mAæqq ew+e404i.|p^A>E;p?%nמo Dc RY2߰~Aаyzk.O;$ߠ``+7_My]7'vZ,067%vC%ՌL@BbA:!Py)$ۢp:60`d=Ǧ{;絈+9)NYg7N.k]EǑe 'w[bʿ_ .>3 |w⺐`|p$ '*7˰I^僞b| `\\7}6u>1f'"5tcw ^P/mf r%(I4€ltiK$*x1Kk*><>,TPk?NO=C$ #Ϟxz~6K^7{>FVuHiګGhRp Hɺ ̀>7ɳ̠H٪ZC^b9xa3 0Wt!L77pԗZ^lZ^pA>Xzy] q'E/$tGW<7xa4rӇdhtfVR.?B@v7V\[ j)R [(/H>` ei&nq>{,,|TP`ӸVNNLslk9cbJȰ%Ju\տ}e{>_M|Rf9KOk%puxv;FJVn vjt?N(Z6ERc8G&2Vpz[uyCwY,.{&Wjxi\L_O*vkLeÆMPE/a2XS/APmO54K*[4}l|/ ݠ `X:>{Czr㤷y)?K1[$–`R eŜɟ?Ğ1 C umհ&̃$;dxO?bob;oõGM9jbw.lB@~vz첱ÉlեHl* y; %?Sc 6Cs;q ,vu.T_ոa%|kԕxmW}UF)ՀMRL55BR?zjEfW6$jӐo&Sf`w # m5L:¹[f7 $ \lZsV6^m©' &,D)F,Μ!) 4ړIlJ:2U`SD'މ]x8ii^U: Cy3Ϛ8m&rq&$Ӥdt.`485K4ٱ)i¦5o]$Yk6^ _9%rCN#޳8yyk4j'T[m~MM4NpK`GuuPU#az3\ 8$<WJ$9c6P6vvr iU(@*$jmmհ!hI.ngp>_եԄMZ= @Fnote [,pa)⩗mU=J l69?lcM4`ӺVW 6|w*6\\YUMkBߩJnRហ-8o lt̐l{ ̈\ Ht.Ha~OZ.\#!B~c`BO蛶6lZ7 `!XӺ<8E5~1[WT4]ܯI7xc: lB@LC>kF [AH-؄91; ;7o 6oE6V,HKpRJ\VP`o1'K,'vHIҲEVW 6*Ko~#܋Fe)UMO"Nj@:/[O8de0 &lHbw?(C-`ӼV'ش.N$ݷKR@hE+3M6k6F4`b $$\&-\ K&lA=lpxMx3 7c8?@¦uȦX--nZl]JaS4vX<ɛ,p}:W[dXQJ6Z*^`TFlJ|[k- m,[b hir1`hȎ.p]J hX&HR zrlpWӻ~嘄Mc'7E8eˉ1ץ$2uu΢֊"AfPmG,*(eæy ee$Km;bQcMCGk[ ж(D]YfI@zMII#شnᚋ#>`@YtSKxR EbRbkL+a֣hs]]ר[>:y }O޶ nN<(m'6W&6(ڇCp5a44 J Fې08EcU+Zʢyq0Y"{qG3UdAGdr_q1k']Oxzǜ,椮T˓?;KSCC2͋٨ iI֥~G< ߩY6QϞb0Ek&.]LG4Y9YHċ..]*8w\>@U.޾:c{D8]=Eqx*gnzHDЁӴ88"˗#eo:pz`)0w|gq6YvCsH|h3[WNWOx7xKRyѭkU.]pw ]NN§wM?ΦD բ-Uf{{7f˿Qw< ^x8}9>i8-Dquw:pt \BԲs|=w46ߥLutXho[+Jl6?߇.]wl7 fZ63^`P6z BP;lY0BuJ8]BFD?Ď#b)H,sKWT@$->Rc߅2h.]N'+i:pti1pKW<4KW4:+t銔TEwIENDB`PKHNw5jupyter_book/book_template/_build/images/snow_map.jpgJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmLExifMM*i)C    C  )"  z&>۵m@l$.m<%_A !*ՌzRYvn&p٭h#T,@ ڢxC SRͮ<ؽŵqz҉-Y$<ۙdObq5D/a=K<^|: R:=~r8usF}^SshdG# 8Z3(]B"pP5Kᘭ Ώ~dyqdi\UT#n +К[e(|KA!Zu&1y]q@ٸ^Eٳ}-b&*P*1>.U# K (ВįCBDc8~XpRt~rD~F;i=HXM 4^ "\sSQSq[-=-KH&H@gTh,Ԭ.@:Tۨ'bo1_V9sq]F'6%͟[n &y)دBSw4 G}_e%Le >EXt+I8Չʀ(Va9Sf%wa\ˤro T ;ē_/lۀ. n VJs&bTl~EWB7c7yC &_S8Ki] ,\0 ( Pk ,^bۤGtr ҥJTuA=/Ѷ(rkPF#Iٍkp<.XJm+(sU,~%gq>+7*<+mPR.FkB1 6cGt#p_C%$y"7tI{0@3q'QpP-LI`N. ,ŠiO<ƉJ%(t&X*tx|(.}#XG$tllS!Q uZҸyU+d*w*m\S}q&M9 ]P`1 ud7qCSc3zKHD\mmjbarım<_O z3'e*ҮRs)TTcsMfT_ ֍'X Kh ɬ,{p cPP7Ӭ%aISy}CڱX^A9~249PryS:VԢ=)}(L(bX@v1isB@:KȧKrӋj TӹrY̡c%,)PDRLKGqmKN'{/N-P3_C%f,]Pn9ji' ;PZo\6bfyEjR\06$B_Z@&e*ILI>,$)'aZT<x${x.ȒN3o'Kxh-'l 6lGWaJY@_5mr&cP33ǐz+P,/@٧7Oȗ@Tn)KкԾ[#-fͨ$"4Y|" ;HTlCqEc]е4V *vkħmmmǝt4E>AtBfY@؅]ART3 =xL [p-^c==ZY1c7:o*u ڦ%HOd:z܌9{#RbzFV]ecu(Kw5c=l\ϰTF&f[C^l<ǮSHr[a _;4D=,fP iWGfk*˸(謎T,YT4;NSꄓd^ҎV_::#DQ& ƛB]՚HgOqXu+ODaףoL'[{Nx^ E$a:r G$'( n]&3ҁPy4s#Wx6!sie˜IG *6憐qF![pS]=hf*@BFtTJHE:tIkv,rI9n# U3h,@i=&c />(PHiMi')gIe/ T5k4]O`D=ʀlZMlQ7t<$3- xOI!Y )pBǟ/87nQJO7OR8AEp$9+ãnc/ʨ <(dc-hN[k؂c1 T(Th Joο[;{e;`)P44z/)̩T< /\=gY4Bہ,Q^ӇXۿy+ iFWHȽE5W EEb˲djG ;G`x\!Ǟ7B~n(oP4ӟ\ ' 紥@(V_yTQ Dmlh2\4N9bۉ8 Tl^kv9wE)qJS+خǮT3wꖩp[p+xfxIxx+CI}jJ|]MWEyɾ3*ݠ3~vCfusMu:yːA0ܽ:AڨhmVfA擢3'PNm6ѦGvBim?4MKP-8kL72{7QVma|&fНvg5UT_b-\ G4B'BiKH7Hnj˒N} dh>JY*dv;`PD4eHul:duaB\wTѝ/nrV-n+l7rLtZN"Zdf퍒ji'@*7B\s[#=F!Y+S n4YSV!ӼPt8={`+~gJD=y?-wG*I >+}&1#k$O*6dP#i*dv7G$ܽo3Vnsxd3<'-|!cգǏ>Wn[m4'rY{;AFg9pYu@ -aJa-QI[niPM[HTsP.`J;#_-Fb8yL"^9Bqx3CWҤ]htMBA4ģa]ӑhs_[ȇ^Po 4D?|y] r#Bah>!%8CR,[p&+90g#"ͧIk17%:ɘ[pjD箊DQy>ΙP.UxzP"FF<}s/nL<[q1+K\1GG4Tk ١GƆS&r#r[,}#.=.!})uǤveNy11튘z``K cٙP 4GJ_@+f.7ɈL"2羅I ed MB( h*?zC_)>wyzWFdwОs@%9g3I/@[SӻA? }T OgUgiN4_?4;|#+lʯ&a,jxCÎ;L{h|6WQrtr枔.Ǘߠ9"޴H;rÞBp ԯ&A5„t{\&!P9wVC:ͤC'ss4S]"$\xXW֌掳S܌m' ~sRrS e\NG:E݌c%ۂK=Lǐ9 ]' yiPCb5%ܲ^'lI)NH _KU.UE+-GK Ds{,를lIYv1ЯjRPF]#"wR,\>E>]RPR K(TQ5$z$R<}wv uqKg7u;)qR48qwB4ARgu˧\BN"IX$9MŜ\hWyM؂WRBGZTE} JrLl?ӦěW[1- nsܲ* D1+J?REZpGL~thfx=(|_ϣyeS![>~|`bRio`zrPjmyRŃjfugLDн@soYe#닺Jo6<@ 9ǣTȔ\эT ZN ,VYX?JQ^Tn 5Jgd][d$:ҮHֻE="Ȃ,+SS1G+4r2PI-`R" j9{GPPNʉ‡}ԨiwafQ4 ܑR+;QdK٘R`TFL+ܥ@-/&,l5t~CE((| 5Fe RΟY?qё'Ŝ0Q]<'*QgESy˥>4@Ra[C=JU5Jp%]]8ӊ9l͵ WZeG[J (ڞke$`XFZFɢ'*R Iĝ!ij%*rcY0\]?.+ej.ҞH${#K!#wؑ }<; 1mn~[P$_{q#^%@ f]sC@6İS:CKWu <ʀ@l!G_IG" c<מ׳YE9z$C#D?ǜ$V=+\"^ 1E;8`X섨ʧG!呣U5 PHL_J4s A? 8? fdR8S+{iYxr<Ӡy?\TAOqBZmq8M0z ߖJ6IO'&x[J>N1*oKpo)zwcCa2:'ARX&si}ͼitQZbNHF,x`O3֔sic8jgwś0JsHP.G0ب(2".\wʓ[y$|Fec9b#_FlKM"q\\N9ߢxgO`? ܦޤgmgJ/5s|K[s7 1h6bX]t,nnO͎AIxiJ[1t?]?? T5iF>d%~`8EÂmR՗[dxS6@rNyr]u.)K@TR}J~`p]e*Nl=Ԍ9Ha7u_-Cv\w؀AulV.w`h "R{CksELj. d ]anH(|uHYmoEK's69jM[W׊[2YJ f)6t%V. SÏ%zyON.xJB 'ء $ *'}`/ݕ&VR nۗ%8-[ op,B?u\$ItP=n @60p]¸O0ݼ%@ nх)KɷlpOY @ ;"8-/Y rTXpWPb72|kpo8yR0Wn,t03 ysl;sɪ\UrG0mMt〼a}zDbliX e;TILL.: *oB͜ uAvNx}j҂?ۛx5T%r1OMab۔m nu[ BLl2ޖ6N7'ѩh<>fs '|KT1-4=:e5 ]GR %6 -vq5~Zy]ѺCxS+BbAp*IB7SݡFKTpr0۳NԢyLjB2(V ڦU34|'Lbies03%K,쯋'X7ipr+ϟ@Dp@仂˫iq PmnSP\n%%ΒxRea\>cgu*8i#vjͱL Y.C}EkĶR[p$Bdp-^-I]FŲ./Jَ6˪P)7 )6Oĥ ,[V5;c̎IO󜷍@)1e)q@('8BݥP:n1ϻrB/0f;/)PS>) n$(S dܤ%3P5݀hml+i_(O .6 $(S3Ua3R%]$ y3]Kp)B}a x{can8b#7pO3Vs5BRvmzdRVҰUҔkfc{)p ꃕ[I%Υap 6f :vĄɈ+R.3&1wy\kLU }/j!QF]4}4sFcu9Kv6;?, &C ^ Jlr7I#pDJ]P&hn@ߊm}"ewY gD nJ)H!$J6\Ŵ"ZshRktYDw2! OmI@@-Y 4=ܐMBny#nPm f+Й-u픨Q-zLUX*RCk/Q x{lSJn9!3mZg(sڡbMؐ@oìO6d[ȉ9J 焟2@~jto,0GIm4 f|5hŝ 9)PGu"M(|D~r(j#^\%"|EMEWc9.r 3b{)[%Jܺb]wMҠSނ+J,5枢ܕ K#q [UCU1ԎSдӬߣ:RCg2v^aT2-'67sLX7'HYMZ8Mcg )P)P(T<Ү}kQg"lT%-Si $ԩ[ujMPlYHN,7(tԨJՈ& #(ZClMi$nwNDh[u{X7Kn$hgP63-R71Oe+\꘩aFepuУ^θPD6~ٍ스;uR*sg?Fga $Н req#z-FlMĠf*%}T;I@.P* (C &N(C fsTlAJ#* ^(^g %(LtUūFo{FJalۃΆA# ޖ.NSVgR!q`)P(dyg#`)؆Q&Jٛee&I= +¿9c7EB 7/r-"āu)PתAHd9aѬ G=s܌JJad]7hݢdY T}praλ89՟~(qL[.@Πk.7ۡ30v%@)PӬC&gm[is;#J0C Po?cT˓3"'*8"Ǥ5ddGPޘs MW9G[*\R4Ea@2`8c n?)E]lRDfcV4ՑxRJo>9 x\HL7po:LtY>Z*H,WO)PȒs{af~eF$.@ QM1L('$yRbǃsDPl=fA܍~t\:,59˩s|RYF;2+vF#)C{PlKnee ]$.ܾ^boU>fm%P-kHyJNR >$$=@0ؐӤu"c,aB~zSFcz n^5qalԃDtzt"SKy(a lcu ~8\8nPFO;8Jt'Cf$$Tq;_;$W9ˀLab1QORnWjrCLd)PPw(>`J5^nH s.a'7Bv[7!ŻM R#9;eT)P2! vzhw>N;@ {@>T5[Pg,8oJ YPBmBYuq 1\(`~δvEhLt֕n fMjPt50:K/),]zCM.G,4AmR핼)PPLRjqkӻ'e(X3'Go@,)۪w^*[BY'KaX]I(51ޑMؕt n*H9pfu*;* _vXыx Tp>U,vI* CZ6䓘{B E9i*}R;*r^aGE^"WtZPTBl>8q^φyS&E *pŊ@ޮ`R=,Ii΀n/XDvPLCG!E 1[Am!ȆH7Ao:A  ݇˦$K'"5Sx' .VG-h)P(k)% tØO iwvv*W\=A]f 9u&R**~5E[v5d/-SڂU .bFqέDŹ %.oM0nBeK@ 쭆GbGmj**6T7-1ZT5%ַ6N6Rs+KV6/JJY3:\`JcZAhypq)FߗNr/3> %<=a :qA'=kP5;`Rm31g@ nI 5ġ"*+B*J脰o*QͺI(}ӎ%4)dDJ+Z~BJ;$T)jYף9qzŜS H$^=.Ďm0HgBfw B;NtS.#"8pVۀ)$T@ώzӒ'\̻鋎|ŌMN!O+r Laں"lekxGmJ۬MhT|^a{+zʃbO.3:ْiI n `, L<).{"'IA?)P npEC ڌ&R0騬MXO7>=UHcqX=T,@ gojr3Ή3r}QXRAO%XCtؙ9L49㡋G#fy/,f*48d: 9.Y54݋6PPZra{C+'-)H@Hl[k]&:t/#@?IiI q Tc!S/e [j(۴EI(Id9qI&=359ᵀj;W.57 nt^ LlQC S|@#"]Aps|곡Be %QХR`9\<ːlQar`縷R j)'UleGuiP)PUf9)nZXRjuB!.XG^ɡ soGdCz.4: :p/A-'mJuHgt#XdIx1RF@s.QRCȁ44ږ\B$Cl:dtH-癕(T)ZiPKV6)P~.K:G}fTˢ&is%Hs!`ǚq[C:+ܿ.7S: Whd Y$*R9&#W*@"Mf9en˽3fXSZy*u۲WD7КyPXc(T nKOCL8nF8979U@w_0\x@k/e ӎE>S FD6v m-1θ[l|1ۂ wm͎4 01!A"&@'2B#%(3#Ur G$.+adt<9'пn٠k)R6il*4}ݓl}iJrin_݅k3:`[y.%R evէ r]+ ~ *<:qQOaeΰl&Ixp6ӽ.Jʅ_س5ڰ){؎.Xu- I0% wM{4]q tg_wq};$h䴧՝mxw"MxEhyT^3mlRq> իھO8e|<}GI^Zq5cg;$/2YZݏ}{kzY\ؽ5H8{U W4׸{ q9_.-B/Yެ_$o\UhtY"Dxzm}! ^XvY4ԹΌYU =Wζ;yu-I]䑯ـ3ۜBl+6L>}4%iӧN{[7emI&J++L1Tl3C;{nu B˞$aM4ѯ9f~kUz/qMIg^oh*m- m.f`z@gf["#qպT,V-0!mz Z2B]TٌZLW'䰄J*r+ 6j Կ*ygT;E]Of{9,i)LUs眯XBrOg^8s?%6cno]Jm,Hkmf a8Hw}5Mԗ>>uOd54M{ QR۹ }2dv kߏgN:Un%ٍ}ô1mdjgN^*P:nzD|qeOCO}Ԕ+Ǎko&xCsՁz;{;7[A+:H'b`3@/ 8;]iUp1 . 2춚CJj_^h2?o#Byjfss|u8]r|ȁLޜMv̺!Mֺ:|B=9%ƌ;BmxL_ǞhڪqM'gUZVPc--nN|$ գN~1Ѵz:IEIXF)2"̔oZ?x0! 㝼x_w() dR%ͭB\MnbXPfo>vܹ}P3 //A%OV=kU9m<|3=H-*MZy2|1ѷQo-8"lD#)[W0B"4ll IX\܇[W +Z0^I54ŧ\ۺsUa\7*5uV;NmW^GLqFH͋׍[?<;j؅"k^׋7jvc)hb6aY%Q3G[rX ({do,c"gHD$>!8>6=u0NxXCٵY>WuQ]Df]H;u0hF+j<|ԣ;)UMZ煅 H8>سt5rX"b<˳u^%(N8GK|UϾ{qW7K߲f<|;l\}Ȼxإb~ qc͋.MТ1KLA!'is+j|%`~Spt=S9p#c9؜ӄ&b.iMGeBZ6K,g>8Y|喳ݡ=`U[gNyV8qN+K>uT!z y)k{ugu$&:-a1`<|@d&[[\FKhޯƇef:qZUTyn #%oMu0YVY(K3L &wh.cscb܋]l阿m\<#6ulɫ30\#KˀSWc^%{h~~VZ!?gB!#N]=D^|*U@}<9uQR(n3oZb'0;sLAqm ٍV/<^_|Qs>^ys<z3Bzv;306kgP{Ll{yJk6k!]?dX^y獖v{굟9BNi&uX)pOFEMAb ㏚׾e]S5%>r'o0 32zMv]Sz@!͖:lv,'j+ :ӊC+_9p^;}q.ގc1Q_$.ݿ .{OkTIm4κx|Z)kHȞ\u:+9Y*׼=`Ȼˬ${Χ%fhN u,,~&x[k7s T `h6N2SBl|-asMjzwuYCs,BiS% hEԹreuKϵ.y> hxb׶;|uqKsNqWnڰs_ (صD+dY>3&miO-zה#ʗ|fc(%m ZҩZhb5c}yvV.*.6) d|],3)ŃeԴUgP a|)Ye^Ni~a&<= ^" ausbTV"5rsg_P[ t;f^UjgOf͋NMٰ';?e.(Kl(ۦlȃb>L  y`W *B[.96^1?<,利>gޝuBlZCB]^ͽ'z2CFR43Y(b,h^X|YXflXOcqgeɻUDZd$i0+h^b91EE׾v9DkT{7Uf,Ua*̬^x?b3׏lp 7tgFxVФ,s`?<X J裖XF6j(+͠V QAXhQBPzcuXAaH+K`#tSk$E/mkm׻Nx=yТh2)#/'Teg.6{4 sB^ө;z+Ƭ@QaVfn]x}kc5BTu=4v8 YAkpF2f1cg>0fX70mUr{k&h% ?ﳦ3X:i}: فamUo]D֧7\NCKhڹm~T!_A]LiVoՂ1 7O:F}Wz>겦}FV?P0pzca43݅:YUحݠ-R f:Y0~Z1 zi<|z[ sFȍjq6CǶVLmu )R*tYm䊎5]ul[kޢMp'ȿfͅ|DVOU=mxUf*#~6yq൱f(tG&KH oY]s_xOe%ǰZ" m,LgIUi&{YVp ekbXluϧ|~<~[dWk 2bJՆײe?Yώ}Ytq>VKg2j6BWÑu<j\=%rSoN_\{uSV*qnc{#_9qG{Y;8s4O㋱iF_^55C_  JLLNڕ?3pv[E_ ^x3gQgNj5E]U-fϹCPA <-)^BӷbEL齛TVzs<#<)}\f%lZǞxht -v'Ůq?7էZ5딚 < xkk=|;j^3U'%Xݺh*. FJ׶;sٌfP(0,_%ݙ"tF0<|}E6RdYA)/ӑitݪaM|=G XDvοTPen˵[ 1h2XqQ+O`4`&t/O;CuN(;m?N2uTdmvsz,{!MÀo\غǵX .HH{u괢R`;OS\5` C~{f>{#^c'GuNZС)0kí~ϲOHkS ㄠF)渪fϧ^uSԜ8L\RD,y:ehIզaJֳ<Ujjtd3b&.%LၝFmCE(ߧ5r 7m9žHkE.mgVUt5XV^9שv)mUwڂvOrOGEԫ ˈxg_7/9L<^Όjي-XwEpj14fϴ-l~3|~/:FVq.6R!BXv'Ϟw׮ W]Qa5pUK\ |s!صgǞJ/:{:=:h4<ipYK ^zlpƴit LX,$P~,Kq۸ekD֤ڸeWZz]+'݊yc.I0{\w bZE}5"w\"[Q uRjܯx28{jDչʫe B0Җs[Ty||nJ2v-rϯ1k7/5V=a=tqu<2sk=`&3733gM+ols8 Oyk8ըpkXkNm,+V$&@ysWy Zz] /!Aۖ #38I m'p޾[\|ĸeeju{# MŽ[N(7{g$KAWNkJ &1Sҵtpҭ Cukѭ{CRvͽmOs^~η$}Y겮]-ZBwukomZl˪w˿~:ͳ%^F~ߑgox`bQ,v`c{@q{UB.ߦZ* .2N󊝨5ʣE[i[};H|sN*˹b=C,lvL,wRkJbqyD@XIߓ}-;5/ +/fVizqwb Ŏ`߮~gFJ:\(6Iu bƒ,5gk:l 5KNc9=M 5[ro۸x>)yRC  ժfw'nXFhjDVׂ[t%Z6w;m۽k`s7jMU%DZ8͝Q-xf 01(X5:Wefq7V 5./qh |q`(4Fu#U>ǯ HcF_tR<+!zkRL6l܌"XGWp–؈g'r%N|X`Þ?FugJ3vxh7ZCVT;~Lت<7ޚVbPW>-'[kJy`)l/տDFL-*% _NZφ!t4O_}V ԅdxeG qSXq6QآJru*15V̚ەҫbW[dSY<v%isSEp2z@f e;kT֒-C!-Xc:yeֶ\>;9P=UJHp#R&DER7: ^>MVZ⼦맳(nɲ]+uj4Ql~lV7fڳ;:wB2 /Мn,ؽ6LSYo:ck[zt˹J\ĮsK*RËz%~ȑFStiq&FaL[Հ0wբ< r`|iq#όGti>d2egUTV/QlKzyC8ظ3wJCBSڲX|Ğݒۦ VyOcfo[ONŰ-~Q Ln8nM䦈_fzkF9anwz|<,`)֩@+Q7Yx%ʋ=x6ZwätQ%h6,X6 μo]]U7c j p-aD>@+ٌpI&n[\}#lD1KYҖK$|u}kpjXpuTDh!7"|؈'+T@cw]PGоRa6ְ ?EY Qr_-o'Z|QtޢtMwN$hA NE\u̗%i1aV0 !A,$U[ľKޠ[*f~m vLl#?OդI- Q?|gu^QZBc>LB:[}Bt(!Iہ_cN>G 7*Em #`CO&|3정ז}{ == 4~v6uTš:iǛkCeuӦFjFC/NRaj=_ʺgC=eFZM폝995Caٝc;cvcDW& _M:<:ubR_],U]:珄F}0Yaf鞛:PN|kw,qWh__EuAvZGhЋ/_cun,)U* <f _<|sϷ3X4/OCtzM%/~1|sp!eVA+Nl\Zl팷4x-B,Ctjco+G#nͭ ?ϷL{L#Ep'=S߸]yu5. /[ 6h"IXdܿ8U6xm72|QlZl #'*W 'kW_7=OKO6qh,nx\]a[`Bt?|(a7A7B1E^~~ ԃRzN~q%i<Ë*L1ږk1NכB/Jy[Q eqd6|e臡m.bڒʄ/ݣN5ܝ|s_LWVlp]M&9?|pxϾyf? w7ZZUȝ^qA,W>赡RgΝj C4?KLJ3pp0 [{p,ogfۦޖT]m1Xo k񂶜SJb;F%m-u4!LkBeSiBsu~5̆gn4ŴRjrf]&qH1)݁#5qY;NĬU,+j6kl_`oٯ^uGmcqKegTj#cL)ub?YT 4$9pO|1;l12VNM듓J񏇩'\ߺrx'k\ێs dddk*pj\{瞦J1-0Wx*mçh)HT&FLbALmA%E!fS"FiQЙ*RyQI2J̵xJ {s,h(y `'`B 5@^Q\ it>ckdkݭ"uW!!,~4W\8mjֿN Ö6yKA,WvmLO-5D') u z0`g3Z􎍵1)5 xGSCzĶ㷟KC]b{5/z`!}LLFίZz?oud2{2^eE۷.ƫ3X`;@X.ZQ0?3['3hk3Pcȅ6 J5+7JSo|gϋКW_<~v }mt0$V*B:x ]z!yd:˚gO`lbKe'zW<+{Gy_ (X*S /Ks s줫#;pRd!ug8=M;V"PƟO6!uYvQ8XɈQ1o]m=2#L߮[6Fݻt4;6GD̎:nf/i5tv\ئڣΜo|\[oMiefc\H*e&jr' ti6*x!-P\>?7lxPFٻ^zslg9bYx#H5ii小9Pxt!5Ƽu3'=NQVI{r@{-6:b,5 _4,tsZ԰۾٬"2n4 ,iYpfX~SI^P&\XrR+{"p}2ɪ 0coYO!?\(5V'ێ*z:ꮤwcIbg$uMcHU>YO_[36^UvhD͹XP`^wסa-,޴d 4 [2h+:B<V9ftVᓪYIw5V$n=OE=COj*u,W}Љú+ؼ<$mFJO#\M֬){v Ek ]볂S \M$/.*e;V]6KǪ}W!ʳ2}kbwl@q﷧]"`Kr~=6lOpf99c mIalS.͟ C'(-VgQ[k]HxG~w;U}ι U*Znhλj+I;5Q R*9VSw;c?xnP5"Hxu =˟Yͻӭge\ mcqƳϼ;b`[ӌ%X( ߾3k_[SFgqƇNZ&]QIY`?_#W[ڥ/eiܷ2<2[mw8폏y=SZTFR.?8ڴ?`ZXڧXl.HJۄuyiZck~tUnSѡ_kJ0fG0V8:p *qxܪ9 Bnشۮ=i:@R!U11.'LC!2%iώZȪliޢ{n>^=b{55PBX=KN(S"rbUs {AJvuO|c; _oV.|"lBςU͛:cwoPԒ0dTڬuJs>,sv{ק3Trd*هR  ڵR][76 `|oHONS6irJ<kDq{'%ۤӋ ,+S"W\yUkq>`) ۚĎu4G;ՠWC`;:".7L}8zUr4[4&Գz !i]tƼs>9·f2qPhjuh QE9Rȓ`^ñV-7:53WF{疋`(ZqHm2RR]bYJb>#kOqR85wU/ }B"- "))ӵI_ oF Ą+H15;jĶ_ZX;.߾q7 i_dN=;嗲KzC.;GtP >zJ m[oitWM(倰+z߂ VZW.RFIxSk@klq+b_0VپUz*^[)=l$3^tԉJ߇l32u iQ :ҡpk%)K8 W R!Ǽ#G}MYԚ!7v5UM*?9hAYďW"7!JQX=FU;:zƿa>t MSa^r N<'ԕL0k B[}=l+^F=zw>%VXeGv_aF%&lH7xi,&s¢>'ȋ[6B59!Խ =Q\niق?GOp]Frfj>w AUJ9akyQcfuM|T1YVgL޸{LNv'qW:~0Kض>~xi C_R\|ƨV^ڼ+cSNƀ8^BQO ])zʬW\=6tݧtȐ"r$tPp^:ɏDm>F .'+LCYjs=sU\mSIVxCSwiBWBQLlWKMtC?@GQ{%q[X/Sj断4u%""+B}ݣSn-sۨ:#}/HcS^gչ}% +? 9Ksb[FŽuH"OL;/D^/ַՒM*{GءY7ltMkA8pjVz@zk:Sώ?z ^ wIUNP %O*5c׵WJ? ד`uőgt*?_[W;:ϾxW{%whac$I=8uf 0*\x#l '/l[0B֌Eׯ|5z@,^i-k\8,YUUbj9k|O}6+d<3_UA=骘Y^6ۯ,?]4hCBóHR&DHڙ}y$ LaySd^}N6;v3WKΩYl\RY^;\t޶ Iٷm{e24RzI͔Yjr(ry2ku8p5J&GKtڀPB"Dݻxk3AMaI?p45t=aj/-6գP\ ɡ /=JkC`>'ƛ/߮|P0Z+CljYVO﹀KmcFG-p5,PΦW4$0#+Dtέi҈靟OlgJq&׳JȦѦZkN ]vOHg>z}!WVSӝE۞+!(3Ne]:=;ۥ[띬Xj4d;V%ZlB%!1uWkXEҘE;?V- ABd z*TeVQ+*X`X>+0eTD=5 pUkt]*p=Pwr"t'FRu!_06-< Q:O4HWzB$Rwnč)T;,-n(nqmq}ZrSǻ#bvmJYN_FힸǏ6 ㏖I%FrozAj)rU=!|BšT&^/ 唫)uE[R?{wοկ,ξ~v)iWLsFڞAy}dC#J7?cƼ1trDv2wՕ$Wo @co'Gy{V,Kv<ZZzeA+NqNCJV 76bfuĖxK `aXfn[MQIℂ;XKl xdzgݚ[:Z߭]ztX({ozUYj]x-$A*%aՓ.+H1[zBqG~-=E2VubpNԳZ8Jh8sD;9[Dw #0c>}xuXf}bV['t:YX͡3o]x ]涮b=<=X1TaYJ1ya‰B ,;ۊ!o,dyLtbm B8MOZ|b돆xͳU*5w'5d"h>`NWOV,|,&IZlS񏗜bj//ҵV "lȤeױpϴ/'V:6#eǞ~{葥hu} T&=do\t48F1mhݥy>ǁ cTn ΪRWb:^O 0HH q侁}o;ߢ4c5<ΦժţdV9 Gjh#{ףpH1Uu LtVw<B45KTcdMdh;&4hJB'4ܬ1{`=-^rt6v};6Qӂh^ HQ|{8k,uգ@9Ͽlőg^HQEVV˷o7 h(@%2״T+t>WmF ~hݪN PkXH?kPDO'[VX!{\1FĮݾW^"@W;AArjSV:EH%fGln6*m7O$Fŋ/D"3?Fw cAK"YQl#ԗcX4}{zv%*B4 ̏#L,W: hsiOQڝ_YǞ-T+MUicѭCVusn.bZd? TU+}Ӿ*e9^䌟-w2< 0'{xo&Ywt!2v$*B=,ݪ[ Qu%K Y 0"a4ٯwO=zDc,0$2[F]Y p?SuBZԈZ"'L"#/P\56~ώlWk=nh01yy(M <JX:m,EKfS:FϜ|$oKp|K:d=FQT(b(`y[eYW.ޛ:!賹_ZT)İ珌hn]PmdnN,+ ŎqdqKzFṙ2`pM<LO&NM0tkUGCAN[)o?12'𢒅M*;HZWν]uȕ&)Q?I^1P$6ֻil^ރN$W=Ə65,OZclXW ;Q9a xi*W+u', [f Z| <-rBm6!6P qq ʚ#^A}ԥ>q'7Ll" F.Zx^N;2vJ9WԍZE}Pj){ IRV; xM/hhPǑy[MRlaKUr=^|ԤqAUm]v$9b0TL>[Yç3I\bRHvy' mp?UN| >v Rr¿i:fG]at$ѫXұi 6t 3=P!- jT:ȉ}5߷.} wԈʫ@zգ7VXv-'b&m{xN`Xhr K:l\Hؚ =יx}Ƙ[GߦV!g<%6x-,`+0gxݤO[}OdxB B"Rb{{WrIo8Z٭w`SLODbA?y`gF [֋Qu[UxE؊³KCq,׊2ފn8RDfyg& @~yx8rCd*yۿNގk ogbkN>qǓ+"WLPUvل~ V } өoWV46ͫ=qƀ(E.Al>zcgAQ$DYP덛y5ܧA/Y+j>6Ԗ,/&[zR2Z|fÌBһ .{Գx{Z7I\,$4 |C!iw*O [Uz۸p'~;c@Ai@J$7y\WVݵ!Tx϶}vb82|v|҈~vܷYyK#~U_]v=C֟zW՘c+Gs9cIAc1'sDT .J1ф`c"6cq{)эR4~?xxPk f8;mN?\cӣdlzf\CPiOoKzw?eB W К$3Λܥ~t.ѦҼ a:Rkv9\y嘅1,t1Bj F!LmV%z^f]h! ZƸkMy M뮪rS79Oyo`hQX{pp=UyOկ4L Al]Czra_;$,gVՁ)@!g gu^+R) #E˾azq{ i ⬉,4 FG0a=/Mԋ_2t{` .WZ8 PQ)ժ%G{_MkZ5_3˔[gdiN +}zׯks "{'ʢd,ɈH=WC U*`#T rJÐzΉ-T؀Q @-}b{LVVjɻ{utۭ;mׯn?V Xzss = BW"6p `䙊P"6`}~kmvd}cVi춌r㘪 Pzp8|!Pl4 s?͢.u},k4xx[)_R|ݫV)U<9yWK-EUzԋ]6}_&2VzqXfPld%v;gipp@q`G Ty] >8$ˊ2,X6R,S!jCfK Q f?_&J!K^ךY\kp%D.2N" ;iYPcv&2 EF΋B_vӷWׇp\'Ѿ\]^8X ^"&q;nG;Vk!zk&8ywV]me-u! a.̓d5K,_ UF;y11U+]i{H Fv:_%F. Ic2I\w~Vupvy=yYf FSL(9b&.`SCwׯE|n]e'& Vi+6o8yvh'W07?EW~r^rǛj\>ylıi 04UC0ZiBa55~tN&; C1 j[i:Sd"@TϪі5U咚tٯzUf#{`,bhϧաuc.y Re4ξƇEҭJ,ǜqk:Y:@Yh21C(TFy,B1<:H*',j[%U! -M]``5yI=>o"gO_:Jq^&2N>|"}M,fת!Ht";.&D \z|֢!{VeV8 k &GM_ukoE}P!:n)lq;I]h*~3qv >'mP0}d[0ׅ> jV )s㌶Hk?Q1%*^w趰 L_Y=~&wQ/ރO6lWm4iOek_PUiuNGWC]FvMf~ftLJO:8cU9hR_]efZqx ;eí?/<,.i%XcxKgϾyb)<=Q \0c3VPKO/t,ު]Dc>}Ƶ1N׵tJXhJj|j|#L}_t'NDg?@ d疭n,^ҞסB,40Q}?Ao׎8Dj$ko^~O1s%Hka125vP-PeT͙N^T'qbM^ݪ/<~Z2fpJ iΎXx|O ]I%`Ϛ,^:$i3L9cDdHg>9&Thq5Z=W2(R!]s-TK=X=ʯML ?  v~cȱpw*6F gϾMv,K.I,rjX%ww{0 w)86 ?Pڭ 7x~Buq/U?xgC7lZ$3qܞĬ.h ,j84q>.YkJ-]s k[շ,`O^ [7jCk k:Z]e" nv:ϿՌ"޿Uƛ( c0r<8ܖJ:^HKVDbWg~)nc϶{x{c폯 ڢ9V9g^m/. >Ysqx*6Ձ urYT:/xeHԠcl/p@O%T漗v*OxìA5m‡a7 P5iϿ36'ijA6pMZfB aiy*./ʼnzyqcIqT7{猖>Tk8yU-$2?>xG~+GmV'M`}L.!hAUQZqm",E|H (+23c½m||.ѳ]^=2W<]5Jx:e-? ƭj^7מq"UqycxK.`-HԀG pm\lYz%.ѷV_?ڦy@ t6]/+~8RByŵXL닚QyH1ˋ>>Րel)YPp]\_!Sx^>zN^c!>u\gIC݈)cWˮA1&4ym% Qao#@v:5o:U-]۶_d VP-苉B IZbDc9-vg(?ڔ7a+֋[Zg*d UۍuBi?x2=5?Ͼ|pέ_3ƗڵDHm԰,Uvǎ F=^|1ƕM!Po:9hZ ط3BeBX_mAv0+kNcָ΁ M 1=}kJU{:*ujx6hyAA6/6-r>DguYb4}F?^Iæ05Vx\$ĺBkZ_2ԙƸ\5M9͵)K`,BkaFtBzY1*ɬZ¤dZ#<䱇Og⻟[թQMNC]ucnE>$-{'ZEpEtZh:2#Nz|[l` ~{srr<5n?\.JsEs<i.܇qWTF~UHfP^gZ~r 1Z'YJC(|4ZZvׯxq[!;Z,~5fhb  )߶qtڲyǶ͝uH@|{lcvtǺ/׌NQÖiNh`T~oN&?\߮ݻ>?~G2\cO+eM[/lFTG-7ƨAŵ>Q| hkZBoK*LZ&o_׾x5 a&GԤۙ;5U{5Q1p<݁C|DUh?l[;*ّO.ր'|ӧN> =pdZ0lj*_ :&Ɯ(v: mA̷خ,ư+0D:cPǾxE~ tր6u̒}&cK,:6ߧ߷ wccԷ z8z6(~ѤaT r|8,S 'R/^bV4Ѻez!mʰEHݿChl\V5-Fd[5<0(#× q|[n)g{/D~i[ Aǫ?l̝}K ; jͿ|uMց5>\TɖDlMUtUs{NMRLyFR4ԝK9˯٬?ϜΝV 2x?de.ao݈coij|)w ی]°}KY<U2Vm CAUPzf%D|9 1H..qkiH듊`/MFMt<ӲoLW\1cˌ#j13Ý|V;aѣFǎg>8yb($1c_dQ/u^3?PU\, n]U2N1۷6<R[kU)dn{+&TG+,?ǥ>ۮ6Oד)+M`3_F'.{kxXd5݋UXRxtnK_/ifcjh:{j- n_jKgJh.$c+GϳeKJT(ExeꓣkT {#(ɑ6|B948'a"{8:1 ls=:^;Ƕ{gcn6R^3{@IguL[> GDdV7 q{R]v$) R# aE"^,CfcW1? pՅ6c^5h Ac3-|Y6۷m_еR QG}\kdF oГ]` aJBed콣dvϐQ"el/ö<7;VL?F}  v[ .!OCBpVA; by 0K:c}\&Tz4Ѕ = :(,_!sƵ+c1R@IJ|ZϗF>Ԓ}Nns~뙚1bQRRsLn^,ӳIEI5p)'<k(iKR@˱4SpN #D?H>ql!UKroLߣmA(O"Al `]yL| ׋ /}9 ڷ|Lv{6.9aY.XBJUVU!duڻN[{2ɍV|8ujz^1{a#N%o!l_ϿWMU /n~s:d =S+K-ɳ@]H'bՑ1V;WU$̯V8Laq PFNH <U[ۮm)+\!BFlT5 ٭Eߚ3<竎a+gIݬBZ:rmXD'_8b\x?tQZփǮ/wms_kspcETfQ¤hZokMSuZ@'Y\aл2n|=GDgX5zZ]ӫV>"nh,ϕ=*e9p 6kZd[N U rV?^ 9Ӯ>ǜ#No lS;Bm}SqN Ƀ,v]zE ? V$: X!DQJB=[VbjH@k'3|( ;%Dez%[n?o}z#{_RS$ &/az&hQ`n4=Z6$.`=a7 8f DbGX+grf`.PLHtD&w_X-ǯ-1Yě*Ǜ$YS/ېã2壯P o};t۲[BHe)(l'z))=zc_?.خXmA2J ߂U %3jaPpˆje9LST>Y򖧅@ qWV,z=Z͋tZd k -V*TXZ gi_]}~F>1r ZM:l۽t7Շf>NzkA w$knjs^[{xn_I:!HT!VX5u04ڀ׫M=Uc7v/]HZ ZVy.fJ$}jilr\i"bg4 j^0?V" T+hm;"<.# Ҳkޫjںtv{ d;GX:}f@ϩڧޡ)XzFlؘ&H^ks"o[$u^nGӮl؉$k4Гz>~ro6)te[jo %F>}N]`LŖ+WƩl[xA z}N'if4MdڻW٦Դ*|+ Pڽ Tu=c Xq`5Nˮ]Sí11~ݒ>=kGD">ΑRI޾> iuG 5406EH\cmVa8&/"B"2sV=plr4z!Fd8Bz^Dd*r_Sj"4tU|GRj\~P*2c?)WkrzI2O-3/1Gͭrrvij&M:?Ԡ{*z)C$g> N3׷NuA[WQ@54>/VRg,RK/1GW|"F.I6( 4@ʺC3e\oUaBh"nc]ի0KƟ&u1l03Ǒ1[U>k*Z.?y]+woKE4RT,WI>89A)af95ruU<v!ί@CTWD_}y#/y'^Wɠˊ ̌FU'3Nh%husI5aK4))O_5Sf8%~f> %.FuؔQ7o}PҬ P /212:?,1*@ gZt :im$jR=m۵hQueC1;g v϶ g\j,%wo?eZPPipEZ rZHi )#DIi|QW֒oM'؜otz;cJag'K)bᱨ=ע;Wd{E,z3 i:e>Hh\T`пݯj{ŎvF޻gǟ?.Ggv*Gr3"GzF OÑ[퍝~% ^{K0Z~žg-m41?[yTNZe382Uly;=;op+D}';RȟAՆdZ4jW^*²V+1k,-Y_:h֌"v]}dw[Sag>9'H*rrAXe`XeNRhgA+ Izy1cœ9L|sǴN К4c(6göx'it8d3{W$$==| 6ľ[ϟq{iiB,.D^krX=vڳoM }) )=B2 ~dھͳ|8ڸRz;!JLA0^Yض%ge#&ޡ&gUKVmmArPiBΉEuZD?Q &ۗElPV!/{$+{*|cŷju"ճ]ւ P=vFtǞo^LP>HG߮Nך(Dk,?{=lTc~luln,fj;ͣl ?Wfu3[xzi5JEOƤ}nl6QYP2ݺ5ݢQ}x2̦0ݩasruiԔKcCa2E]e"ϟg$'_a:9n|tL2CRf٦jwk@Dg`[$GYqo)rnղ|wJz!%M\gLt9(kzB=@!NGVJ@EwHP+ {^ܮKiVC맘I/`m8g5{bg/$ޞf^z0j-~8#JAHlz\?,SZXc@lS@@nYuLvzl yŠpűVZq^4O3ɲ{Y|wZ1lm\CWOm„ :qbnfqngIkH U<;}^LtK^`-QX$`v`CRm\a8v؉(:SSG^qo\ba[W6(j~z6kű=I޷?񑧮_Nֆ;3k׿O.IjtXFW-%ǔUX6.{U^+'y卣js*%{ 7P`Si$yX-WaO^kV丑Et/8 u泥zg̳q)eR= 2\ ,8OY)~W^:*:\YIgÎgyFX:"k.)7^qW8Q@@b y#;v3:`ƉLO:aa9 ^ _ uRH 90ދ~ -nGI^wj \ۇ Lv>ǭojq+v #ϋ\޸K4ʍ+"9woMzzjyplv*mZ-7^HrUPK86$ٸ|s];ݯO`[UQ)<׮ބwa02k!q&,m_Do8-lή6D:Hhf'7lWC2S-i>ixݟߴn,cxJkЯߧk!F/^zOT+,O^qI.,ww껖5,5x[qxlg G# i*jJR)Czۯb_G~޵ vdq{<=`^wbs|gB}: ˇ| W,u{{~ӯ\$Q3(3Jwb3ޢnIUHQ0 :lY9މyvw ݈蝆hm9k -GHcѿk0瓂t,f̤Esvl Z=~9 }x鍝fUr;(ԯ0&uq)#|{$[^vz]vn' ?4ݣ.- ߩEyk}FSDqT%Qk\&gq|Յh{%8)^~h#nş9'8Y<*]Ycj3t^v츫tѡu^[Dup/J~aꋧTr(v ZZ!ԦSlN zggtK=n1ХQh0}pޣga"vľ 3.vE{@5 F y9fǨѼs5,˟\{=69xVA:|2> `4%^#;-|ٖJPeaolQz_yXJyrSկ,Ԭ*.yxU姮֦YXSQvL+yakSLtO>۷i؃ow \!ɵsdD~NH-Wɩ'&zXxt<eJƇ]=.-ePC2,}u fdY:'F:PH".:QK L'pҒVދ@ 0x+'JҀᨿ[ }^ _tC0 2Zj;,H8%XLx_liX(]ޚ`|3Ns>|̇Sf`hZnG^l䩑GջV,6t˰{ A}8׎1z ųU%JjkY޽X.7i#R*lqQo&I~6RKhjjJ` 9TYo9G+dh!5z4{Z{u|oۥ懯 ̩ uX# & Yc~}uNR]c8'I{Kګg&~vM˔ ʍ+ۗ2Eq;$wq딭*Ȥby<\Ȑt+\UuXǭ;cnkn%s|o]m-+vPAX5Dν:0"u)t&jbcqbuܔ{N[Ypb,&ߗg K*ѳy7.M&V%i],EC##v!MX(j^? qkMGYAG.!rgOX5C992/,<Ez<):cNV1Iߥq`4_skVv[awbz}jԂȩaklitzW>벫3 8beWN8h9 ga-8Ǐݗ<`n,;mMqV4&VN,^9]bwl؇:F*`Z1a=߯sPM<,sob"FW.0~Q1̉JOm:3evRPћu( 7`F,A6ҺL",D;mxtlV1OK49,vjF%=sN uaxz w_d vudQUS .~9!J c,^V}~ uO/JMU%azkW:vG#VP^ &GVcTt;SG-SM3ΫqeoTQI;kɝS~qPGi%wkX5|r֖ҵV?`L$^nekG\u%yk'} ՔmРB8ݬ#nE[E=d{+=ڗE H!}%n~,u䜉MpppoXXMaeǯ;T'WnݏCkq[8&$qqSS}/yI\<b$M2"Ho^]H݉FճgHfM>1R-,y27J6Ks:5_PhlbE KSo)ul׻_? 1 Y;|zttTB&Vb@7rh׷) xX=--1VdmzNTE6_lTW⸰G;de͡hI1TXbגd3&D]r9N=/@5PhA%,'jv7tnp*yhq?G|ݔ͌<)?_A1 ڲP͐@Wi[ęWOzaV)iջ^$Ff=}ِT͑2GgZٲ-%8ۃRk:{tuL E^ڤkۋSYc8 axb~1 F;b5s ~,I&Q7a{G5`J7ȴmqaEh/O9mk@P™]Yd5. o^~l{Z+$ls(g HR\LgW2(Bϧ]wZmS, ;d$S{v]1u~"D?yjB.:L4%~7>Px$a5@͡XϢZe4cJhNl2Qnjە41l:؛n~+Ҋ}p"ܽ1QBkk݂ \AH9]XWkٱ$+>;ztҺfKFYQCJ Bvc0M,o ]AңΏk(p7G'I*^-؆k,~ynAYYYᵳV d y2lA$\`d*oL oo*KOg.zƑdiq""F鳠{sVn>{ t@v h~2M%tY׭PO*R,WPP@Xޡܙ wmL_LB4~/B.rd8"*bn 17+  J_ ,ت.FC07_xMle6Iנ } FoutZ.f= 'YuJVڭ !Q-k+0IpRZt@v8]*@l|U#KS3<,Us̗x"in:ٯnx5F-}5BӿT_<Wj B_+l5N+v)/vm)5nbBG-l{MnVﯮu>12TUVSsgp1mI_H#)uDß`FKXʅD|X珌ȱŮfM?;%|;z(|oh4еZ?jc%|u_q )#v=FeuP,r(D Usׯ_{^[ /<gkl2g,bِ$ \y~~1jak^㝿w(gEg78;>8ջYXcؿu=;]"fXs }h0~ֱ(Vl 5 t9DNl("dCo.\}=nz/}D]-PH:HAiʽ:"ƋZ+2Źy><۳[djU䳚z蹏|,W6ͰB-~J nUK-۶#?V B}gz\۳}Gו>fCksߧ 9ҵo˿ZkݻES 2: ͻtz:4} rW v?N9 oNjO{?9OZ`Azӽ?ލ0UHu@4i1/jm^s> WN'r\v^s~gty NݛC%˓iuݝT!Zс qܿ۶u(^6_??f !1"2AQa #Bq03CRbr$S%4cs5D&@ETd67'Ut8eu? ,av`g=,Tk8)yž6q)2˟jj1K#?#b%:P򢿒BKaSv&UIbzsa.\ymlfnNLEpɢHp~KĹLSkcnDwኞKӞ  aۨ9Ge=g_t!#p`rkxsV{A_>yx> }b N&W2^Y2CA4]E:_{>E(\C,ż\vKPhC&Ւjtm>]?'7.e:*Yh[rDm\vB)j('JZӇ|~涞6/$q2^\NK@+q~yġ Rԫ¨ܝ3Fޮ3_}o*9J`Qѽ/ Qᰎ1 | JTb# Gק׉G/ ЇҶڅq*Ȝۓ>ۥ;}8uq8g*.n(i¢GϖZƶ!joTu~#5dRF)mp4oog} gDF] vҭi&ƱXJ" !{wݜ;q#\.%ܝӡsVVQw PSŨ J`}(۰(Us :E-'[2c.:a!BóUM;]6`Y#cs (;kO*;6xFNYUI:)Yzjm!Ir]R7DB\5W)>Z_*1A MfܮCÀJpGw-jDIi/(p7` &:HZ(A;}(GMl&ܸ v#:mݣrA8g)mE$G[lY'{O/.QNݿTxޕqZhLOoڊޛsRϩpqjJa/vl֕ҳC5VrJFn[M(x3lEKK{) ;֋/},TeswM҅[VcNA2!m֗ J@:(ɋyכ꛾Wt76K*M !N#7,fPۿ6@X|P%R./iV (T1kN ۢBڼD 1B%ѥ)6#B 7|L*Lb27NuO"f8QB]> ˜pJ?E%<8_eN1e[g+*Ayi@' ɕ<$В"g]A))™@'~<{̬dSIIg_9k=5iGܾ+%2AI8{&VrԵ)\V/CPOe^Z„ RU{E3Snlzm9qPV{Ó򢽵`/}[BEdAN1GF_^YzGK(WW<[CJoH%:%=ʵ1"=} 'xamtR\Poaԥe6龱{qOQ9y$4[%>t,weI%Sz}$< )_wd}܏ XE$-Ai~n䓧uw%$c9.C?{ϫGyEJṙ WW>Y)l% pw}+{Md,[GrSE_Vr6? 7cQOq^Н0Sw%@*Fz?ssR:c+|]4q6™eWJpwlU3~$uQȼ&vJXsC َ{*5Ⱦx}ERfR~\-&He )O_s?|p1jn>il~뉷}bU*'qK,*>rl=fa!|"Q>0mWqiՖB S*">7GDIKsMԏv3})@]{P\k8Ğ#?P$˄vXm=xk#F"&NkOFq1>#7(X≖7;U!mc^ѰZkmt^ftW>N7Rǒڿlb7V )IBYBx{# lE=G7{<2xUձSeI 8ֶ|CeMK@,ecICn;<]\w#V6:J '̙}4H e8 I2% LNW7~ T: mecЮÉٮ6mc3JM7AӫrLn IK]c3A1y([[*Iㄽ[HA"E%ɨDb}Ď6Q_Ī#i%Z= ?2s ZZ3΂NQ۱3 յ’a={׫ e Y)HgM07w@Ds|1R˴:Y[b"Ѳ}(W2ܘ+z-b=b< JɪT-ґ' ɮ_rUs^<g.~S[ DbDOs+荰(M'JR<r&uUSARCu?;ا_5C=cH8E.Jb$vEVuF0n{G oQs=i|ԕt6 c D2ZVj%(m= ncC\Z?4wU OY(x,Y_;ɯ4j!݀$m2ѧT؉͎?ߎ8S\}6qC3y4ǭs~汈kؙ./9M- S{ջүÉ-}Qqv+Ѿnb2%{c~ iIƪ>j}o6J s5 Z<6GIx6?.9J > PԿ_%TnM:2+]%k;qP(lSdB.)kM9EQSsju7܉͍b/HCQ5ho>G'y4Mfk'J-Pǎ7+=W?+2i6ڛLdP{ TSsneڎa%ƦȨ/B;OMWC#[1FyNJ .N(궟hO*v#Vz*47i#F)ԝ`ˎ:VM]RT_NuoVАZ=Ϊ/PdYm8JDjOCoኇ'n}.EA Rl\\rcյ͟tTt4i*`tx{*߄1(q  əvQm_ŢRpFU6}y OtQqUSTg:ܝJUUJ1n$n{< m˨hkiaNF\%7W˵&\Wq¤Hy(mqj沽֞!f2Pu7xc1Pk.7k&$ mK wWX\7EhӊAjd6dM&tY(R!c5b}Flpg҅Fcm4rdjG8}tMd;'{V$)&@{oqŧD[u;$ mH9L亁+1Aҧ㍔F}[vMg*]<[σ8," hGHZqVK mph*RoTyJ?E.'НU6xWrUѤqS·L4ɐQ >W23mŌz.{I8ѕhՔm%,}Wb$Ef$+չaEjŞ Y2fP@LICi+=z=FU"|fb*b?+6'LF-I_7.]'өꬕV9, t8nzË)_Q$Lz EjTZN||DeU1|܆Τo p)nc!Eqm\|H+M23tw6:J 9z 5HPFZ$WjC>+jQ@()d,j|Rn>#O*+~/InU}'W[Q̳44MAd4ލ?K&V-){;ƚU..X2gdht*.y/W6JR7سiOyoώG&$oN7&;q){F&r39N fVwsRW'o4j68_*OX68Jo!YFbn[SS#)_ǁa3j߲=RJ.zo/ =9Z~rlj7JfjSW}~1e}e6q-J}0T[3(% O}|UƎqN&^5%'z)qT6=љKmY !>k3R&C{`|~&j1lKa.|!$= ŷѽ|#U7ѹi(if1&Y fTeS\;鿂{"f([V %m Bg־-yh~Iv2*E6ai}]~13UF[Vտg Eb\RILrJ> q݇%fTzs"VҀ߁:JeL;oF z j۾zՉhC}&l.T {YU/AfҸCgCE>UڤxqzKg g6p*.kP}|k/;,+G;Vt0&Jc,6JO nԊDCeXܤÉ>><3 qot QAQ0)}@UY<944urFb gsnħW0W*!N~iq90P[:sҠ#QĈK`OHnXq˻ro) {=d*UN;e\YSJujs -=>&`hU)ÀۧG+1*aS"Bէ/XP¡YȎ8MO3#1T/ΫoldWZ*CpPR৆P3Y[RڟM:XfjJt'n?ә\LdtqҢwxv]?.Mq RִR5u/o,R~mG RN?̓iNNthX v\qU6q+/ioBe$V9gLW;1Yauv*HO>O3M]IB}G%{S?b>R f3(sH48w9UfG\ڶ5 =R~*1B#x6ŧVP:u'Wz0U*>V_⯑WUfQLriT6D-7[OcT}…6h Gج!$+IjKI_)s~ au6$snqUЇHYu (mƹu[u=:&9w-}e-co2ݯ=ə20SYaABn*rm6!\kQq>6¹Mo1Gڔ%$n>=TNR%H-zR`6ͤA_ypp{ڄ׬|PbvSce)JѤ: .ځx#bgxm}y_ݍ&-VW$ozRzn1G;J_yN ҝ&C10ޑ)32Yۍmn.)v)YL9 )l'NվO'bJTRu}n$ e[Ô>Jh)iPo7ʖ`UaWi$ =z#.ŒwXN/5}ujm8vok?%r),TTK)J[=HU, (JkGD Ay^kNAJ=$TJ_tوmz=loV5Ddei#i5 |ws>z1{wN.p@n: t1H*&%ʯMIXwj> Ɵ}YG&MjS!ħYbVFePL9*=p(Gụ>2kjWŲѩ\Ҕ+hN*qsT u4 )fH'8q8jYz`KG#{iPO'SyR|6TâZJUùZk^'W?*J@SnĞp'.Ne#PcxBW{k;WA\: syR6r=І@! ҕ4j!V.164L=%GܿyW*+s`EA~CӿmD駬=3+-RNHWjO8#_Y j#Ii[Vmr86ẞgK_n~`F4w X~'aYڇ =%*-d26'Lw\ylWȗA  6q݈smx :RF]S3#MΡI]2e*Aw,g+-ם٩qP 2'8xbnJ̵>{[ήJVB=o1iޭԥ޷Cucis#ז[Rgh›TF#>q58p>Y 522YZaURT ?/̥]8;0hu]o{.,Ss 1| 2Ozexۊ%Զ;kn~TO%ūJR;g_Oސb;?֩˦0 J!FDzvoMdt9eUZ^S*DT6:^h6P) %,U)5wI;uGUu&lbef*ZgK_qV~s4m~p㡫IZ.OGRB\Wl}/R~BE*szʚy=Pxg+f>PvT@h}潝nRҔnR'>@Kֈl1+'R;,^ĩ6Rwa{adw Mt?''0#n†Hld')6f):$ttUwi<*S/ )[Aj+UތIbvepjkY@aT*rێ)ΫJP;LU-HCIE&މxL@8xS a  5bA&L?ϼR|3숆P~5,G]̖?r( t;GgO QIjok|0zJ6Om;~R:>_ V}ZW1TqXLE:IkhFP@v -[9]DiHx!۷a^@L!6 q=`vujԇk$&pjq<5&B%+4>$(`Zao4lj./7'Mu*ԥ7ƫo9jDfj~sni F$#꫕cG>(o r_zw*DFσ#E[OUҗK)))ɔ-tWAL2s2EghaєC"6R\6|q2[Ki('C9KIs͕sW>Pf3 HsnK۽bp1N?ʖiz)O7,&Ͳ7! {'eټZ;fNRF)=be;H쩈6SVKV*9CNV0$G^zwd-zdN/ࠓٮJLԶa=v?YUA"Ftt?/dw<;f MHi.6EUzneo#,̎SCtT$Z肒Nqjóbp%yW #A-rbc u4u^q8TφpҢЛTm)\(?Q($&)EOIԱ#*u ΑbNhK&DGUO2R((pA"~We7Qk"O8FZ\gd'NKHAVy/嬭^`!7\J@%'J0sҩ) hN2IT%jwrn@9i^ERbC~eǪaM%Ӷ n[:XHܞG":v[0|H:՝R4-Gk>oҚqȽ)͑qN+㉏3/ DHBԞī;y:0]y8erONB.*uSZH].(}%졿#%b@e CP*@OHwe"7%y":jmPq$$\_pڔJʋU;RQ[7->|R?ΙJxZH16rg#hԷ[j*^҆jk(r#! +1*?"'Ն[wf*}6=&IH@aiiFBčFv6kPʌ>ғ9m|Sz]i_eBf:$Se4פ/Qr*{!*Cs媊.m^lqB޶+4G.窵5!R{9>5޲CNz7SmޅjZbE萟@ @I#q#'*.D=O̦Ƃl6Zwٹ߸,Y8':XwʦH)Vۊ%3\qT7 HZs-O@icf$'(Y< kq*|pcHNHMUwx^Is'ImM'r]y`۝46Q|_VA͛ƕC(r+&]1=o>q8\PM'S!#H=XB[4pw݇j'}F$0omCt~8z&kB\P`HRGrP^ȱ3|PFәӖ ^αjNb:TJK-I!Ё&9UGԪÈj0tSrLeyĪve[.-8M&w~mERr+kB*Bdӧԋ6fDVȠB[> 7pٖ1[e( iTJOnH@HH@/:iRJ命)ʷpk)ӿG){F5Iu?1׍J)Wj=pm".4sd{6 ٍ56#m=Ϋw[2b^ؾӿ#MEԪGzƓۗ)>H6Ls\9,Bci?9L![|-2]Nb+?pṱ i'u*J)y",Z_O4*[*:8X?hV`+@?TrBfIv[)kuI}xK˵VGM;8s.QT :ރY.7zH6=vn1+6>Trn *}H~HN`PĚn*_I͔pт=o&>u!3Tf$HCr*ۮ%=$ o"1]}pJ@8 -mJЗ4cTQuLBsD%@SkIRO9%Ϣ: H亂N΃P~J\T=eRSw]W4}_ނZU$/2 &8e5|w_j3$ 6 d8 4Y)H|rA2ѯD$8 [;waEna3(CSZi{v4:ukm/Vj* x\JEf4;|iQƹ2X?49?6%xMRdGj^3܏F&%? GeK29ykHQeKiд5y ~ maI#qlW!AJe dIbo> h@Yl?F'' ߫l88Jt_q POx^[\Z'c,eMIJsb¨'S}trq H;؊;VfZ=!U jt: 7mRvwM^%4lx[ m ICR K=~?@3%f<&t& SvJ3NbjYsdHlMЮ'gUjNdsSlNdڔVKڔqjQ>?Rr&j0}5PM)A[%(b0^ZƂ8iO|OCA5,-5iOGo b&c;Xڥ~-WQ~oaWb2Jy@]_AM8@h54*53)7Jyz]:87::+-?y,YqZ~y'[&"ֶ IPCTn\ý9-Reۊ'L xOЖEa6hSu[Y_8EJRtښxSk eDhx-અGB^_x^pjTpu7R}%ǧ>[P΂ܔծHwarF`>sq%HgOH'w/2fHmӽKuz@©|+Ddqʸ跎ŻM3.R~}Qz"J'H6nQ)9‡_MXճu#Rz?[۽1uO^r|p_>b\Tbڿ>7&Si %.:n9F\tݨ*s')^`9T9*@N Gل!߄hَ;sZ$(P-#'~0jϪ rV EϬ/䖉)3$V?"gtTZ`-2z&ߞX)PH'/j{qVmaI" ̈́앎(Xޕ|Ϙ3xN^mMQp#B;O3nij<ZG{O^]P$Z'}fVO,t %[@'78wq`8’tvrteTUG9O:Mۤ,FиKZVPI)I*k!ruK4dF/ZG5v³u*9֝ZbUhfcqPVskdzT)1vMQGQZM=y좔zړ:=QshEUܕU-r`z’3z ||rҕoytoB CHF FkQI !Z?\Cxl+jdr0 Khv>؇P4d$)I?Jʣׇg7ZoUS+B%Ka*i.9Ė)0ۖ['N[;1M^"7җH.+Jڰ ,) N(v9չ9M+Ȏ]e^6 n~I9D7\zY9)f:NvpHCM#JSL-{]"$}eV:7V4*nWMn 0aKIqSkn-& ЕUTͫhƴ[$ Ps u*,,!I='3Vt2$/.ŲY dĿ/ !EaG|&4fRhMӥ xj Zl肃Z>뷅k!"V!e_OoT u괥#ĜFc6T!4ݤɒ_Sj*ٞ^u)RQCC<rj)syRw}7ùnLJj(i"Juj*#uya"q))ЄCwu O h皩 pjgڝbcw2c1܍o9XƂլDvJ⯎Nd8:vGȠ) a 1EǥUqEHW A$o LT%4DW/?Џ[SؑI jWa6ں7IJfk/# L*CYRH#AїWI`$}-qrѨc.STDRۤUSMk]V鲆Til㕉n?24iαmINkᆜR^Esz>]S3ٌ-v݈Gq2Q]+1*;R-R\- xwck2ﳥ=ؖqslK AH˙9NDJObbW%g$ҡe|*tR@CM ynPme1U Wtom$f#Z31Zt-ܕI̜"91 W6Oh QE1H &!Ȕ1 tLv]^u c?R&S[e%iULZ|<~"_%MV* +*(Bn\EܿĐ䛖z33J%6kA|C>қypRH%vN=Mq )i*#y9L̼\]wwkR8U.E^ha'5*T8Z'?~LJ|~K[8]oN"GU٩Dd1&ĥjF/2trQ ZROb*8v {ge!Pe*IBl0f"3RM@RljR'zX .iR)jnxSu‹ ] VrHїhאF⥝/Hy(Bxfat|Edl7+q['j/Fw˨QBqI QȤ<~̛/? Q>kVG~/)-J- 8b6k՜uȒyҘY)GA_ T<bCIqi$\")Gawuz@p-˦bZvauQk+u%#G07~x^^eиr%SiV)8XU깲e’-k C!E? H\f.1 AlFp5.à דòj?_ց?WnKh [Ѓ{Z9S@Dpv+GIRPJVͰÿS 6t<&v"($YS28^BR}&SoS2(Wqc^3vVB% a J~Y%uW(ۢ~LHD)ZY|+׳\:ܿ%+̒mi<qCf\zF5f'_ǻfc 4%ѿNGUaƟ8īwbW*4tFmVI~!^֞C~)R2;OiW`B#16aTbN*PܑnJFizoӛ=9?2cx+l웩V[1Mg&"A{g/~ssy2fI{jy!}p@ yʌ&yG+񅄖~)?Ęr$SYIBM23Cf{o͑z'3Y'1~Qd8Ėo6i$XVC8JSU RßG>Ahޥ@|T![|?z刵z3.:]lBԑzee2׀:}[4+Ĉt\'rE T[kf[)qxJTtŐE6o٨OYR5a|JwN>\-w7k&ؿ4\M2>wUd,4ue j,a=gd8? Y*${5* 69DKj>& 6QlY 2BS14i-Lz۬kWqJ{4m:i\H݅Ք'*#jjtJ# CHƬ}A;qYcYX #{uՅ:PM5W 8I.;φVP{ЏsO&o79$nƥa0)P}F#J}|^̕uJV\)T7U =3p$r&f EOcGׄAf3(2a*oN97av$JEG#l7-'Ù&!UԦbŽ@Óqɍ8w<ȇKiz6u Rܪl)viP`-lzDOwyߔù]INlZ$EIK Lg4Un)KvL1b)kk SKV 1䉓ĩ릶OOb+Wd:.iqCOJZwҵWOT}n㏖f\ԔNuOar:4cI|TBRN.8#BT)sߧ*ғB̦n w8`P on=G=M&Mr#kj+e:mE $]8zY 22w1ZĝF9G4+-bf7YSA#tm%_u XMOUj=jNmH>'crD;jC+ U3zUI Sӹ \}`noM2,k)F?8U-3/~xcLfLG~f{/Uw>ܟ,_P4zbޫT?4zۓU&rqwÃ> ,=1gT&+nϊտg:R;.KަE|[*E!M[g$n&f79bHG\|GKZ@bg0S>,\C֮.1`\>ԟ5fuǖšy>Cy"͑K)yǨ::I MP u]6iN[l?f+_E%tw3n$#KRkQH.eNcL2yA)mo)TMVA%cN+ѲcMU#"l1ѩuTC犣֝j99rt 6Npj)VDΒ!?H ]$>E=Wmh#ȳ5Wg id!}]gEK./ΔdpOB~ %;,H^-8Q|P? 2I3-Pm)}~8켣 4'dQ]=Z=KNDʥoT' 5$7ቭT)$ҳ TNWB~|mMnjvmk+Q䋨bIeI4MvTR8`_y)<\CR>򺊷' eZT0!HB;aI4DPZܹ+ħߍ*BY9 %חU~'ȵz` q7b.JHJ$D_}F֙%[Ir[yO-+ DWnW3K{);~[0*" cixyƕƕCI.ou_q2<4hC:1.Ϭ67.ʭ^\ ^~̫}eRx_h } 4S6ܟMt E\U]&̔ʤL!<\@W#W6)" OFl}ZbB!%:u[NdZ{[[+ rGGb2co|M؈x6a*гt`Oiy~^ņ Prq[PA)yQ{NFc*I&Ȝ%:UNi&33:T(yGK 4-o=T!:eQul+b6xrvZ}y*TvDTh=c+P.dz"Cl*Iw\MS1U.1l崋{,Kd*U6yV6S*Sd:W$j {5]_ VDr.lXͣݼ+$x\WT>CIRVAZzRu*F:2ԏČQ_-|]hܣh1YKLȹc!]lI#xK2nF_-PÂaC1,k GwuG8)Im RM'%X{]DС[E?7ͧ/GsPԆ۩#"ؑj򶳲ܮbYlS|[)8zO?'yQ9%Rc0BCJܠ^8d'F=(|QޅzRMf[ m~#`Ƭ(9CPm+X߉TJo;'F/=:f&5A7+?o8u]]1.M-xU+^zZ+ W(MaWb'bŠHPt1h밮\hmU0s l34ʚKjZ_m7G@_߃=!n1NSYuޯWd [qÎ1x]U'ȖD ote&<ńkITSVsk#,һXin7Es$Sوܖ]VAJk7Oyps?'QZSLj#ݰ{@%#~3왬4DŇSA)G*:GZǕ&@H 6(5Y\m2KmRn/b<čJGo'zTN93V:TfL9z ߎ8_Fj>̚)u HdևdM`fZlu#;2uJGhKceXG'T37ьu0i5mTδj&#-Y*-Af*Ff%XtP GhCuC(RʈN+(!V1BWMiYNr?*YMJc( ?E?32IeSj͸7iXo'u'\Z2~JCTe3)n)}?\D &CԔ9m Bz+v&S&yޏg*OWf*ߊ^xMVߴި_ [Ъ䜎8M ]\ ij$+x]͹®҇+FBת3/鳘)_)?BGsQQm63 :E)"i˔sNh=ř[m%̷xMY<'yã7܏a¨uтUT=-FgBTM)f+6,Rӭ)?md'kE4t*{ICn%wu}uylR?-TJU}CJ ? e(s_}~sk̆EBNIU"+96&PP+z)T|q¹(;.xч]ωR)81ft9LZdRGSr ytGTPڜZGQ(HO]2tW䴦])˞VZq 6uZ7\ǠRNU9/,E)OCS*C Pxy?7ev *S++t_rͨtu|wbJR"TV#є#SoH m}z{zX\ IVaO۱.<6{Y_Bc1 Z%8:~0>h)Q' AJ8~)J eMzM-bF^8UPͤFR}+ R&NVmwh\/aĚ~3T#E$YHh[IW&uw#ċt=blh8چĬ[=q¶ޓtCpľO(˯}No.;wϪNf3  |N\mB:f%$+ҵA8Fy rrQwĊIL\q2RUNZːqnշImhv7|1{|C!K)Q#өMrRޓ豶[3tFsD[K; uʎj:m)MR:e'qF :mI~3?u{ܯ;iPo9e ;E;-8kԽ'F/#K5TY~^ө̣HxDp- icIՊ#&C*}!ڛQ_3ԑͩ]IHKV).i݈ߓ^eWèwIǚZ"MoGoWn,q:=[E^`oezV/Y1x4}Y-iHReM9!uѦ.#Z?B56 VtKB:$2}bj0YE}1T'ْndZh9LY]O+oGOf]= @D>4/߯1mD2M:FTFD|}Y3߰Iҏijפʬ5Wv-nB~ ;|=CȘD8q/:b@ 8f!M@HOO G)#c2K(~cqG摩`o6ap^N}-͊\vID'*r3vb\%:/w$OebV`Q[fl\qZ'q/U&s+jxmTލ+;ec=vsV8,%Y\EE$bv ?[O2+0e!}d۾,f(C Ia]7:xRMqkyfP%Rl)Cz3#)Qj:UdN- ,$.ÀI=-Qw$^A;*迴@Aza'lң[ߋv{*: A/r8Eʓ IPo%tSYmbB kBݥm?*yHRlщT]9GCec#9rct9Z#k7*}?. )}nEҝF]e_dO**.DUV/KTIWH,6 ɘndu"#r3S̕XI%Ћ >(#Ȗ+8=\[:?Q5R "| n|O=Q#2\qliHA);:"2ӥZVPҬHlJf 8˜|}͑+ XaI$~WS ZW(#Z Y);L'6:WP-|um%Λ HP#}qVt&%1TICw tt(D;d֘ p~$l) '.N Q] ^_E_I#Qj5ͦ*͛,NEP{R|Rn>0|F}5~*[[5'6|/9CC`v".%Rn+O~G[zut/o剜_iGp'ێΧ+Xp)$) 2f:qEHh_U^ffިv;\N]~%N˔tri o$wI`R. R1Bf6RԱAN#!; aQj-RlTt݁z3ǩ›_݆QfDZMOs6?=N[/[q'=d5Ll9M!)#*vRDT[1 BB M䲱mC[ ѕ`| xe=8\Ybk-ZqN@˱W뚋mcMz&*CroD厡¨kYi =G]Ns.1Z*Obǁ^;f=7Vwsb6WRPSquXɠoCU",ʂ<1j֖P4}HY{G8I]5d1&JТ{S.Vl5řo |պz?WkV{#e~sQ!1q[hb%#Flx'7q'6r{Q@ RRuC6+JHաaG_[&cC%$l wf^'VVd&x .l&Sx~]_oGUpsd㳞*EtUθS/Rl//=fSڣH4z K^q[ۥOsF{t.RQq06W|E}Tꖯi4WP)mRr+z/z_ ͊Sn- Rk6 䶌̵l߀[a|rR(D FL2'|qR zW'q3#e"W *2)i͞I8"b 67O=K*vcgFYAzu*܍=qF~ #ofIeiW lSqlMJx{Ҟd7ߘ x٧j3(44$|7yQ_7z:GY&kuǙ/2'3KŸe. Hs[R}T4q&'dB#JPG:GI)UKpϩp*)Qwo1f)/M[JpRpt44I|䙗8 ,xc:/Bt-,v༖~B9܊+–:qM}"IIje522;YA~`~Yӫ&4fTM v&eMO7އ[O~+q 1ϫrTߥTcZSOm #8vWy΂ woHN9"0ŋ]f}ÇҾU$(죣 2jz-j%=j+?GDh=_8|pj9 Aݞ#-nR 2JFSݺ=H'EG*%%SR=Oe~XFk%ODgj3YqNvl}8鰾˧Pk6 ܾu{(l{b椤с=~n7~%6)JZZW:mkSr]35 Ҹ"wʅJ[l0л!82.YZ[-=\Oigw ~͚W 65~ⴄ/c>V{s*S\C?hb ^ G rID2i3yTdWEw*OHNނO SF3)ҳPH6\J.QK+Gi)o %O8_3/HpK`88l~R2vfAq.Q0IΚ  0CM6hi via6:J>4 )qz=aql6MrW֨vHMǩl-yAQe*e{@Ri)=q{bp,@.1MUoRWrF|"ߟ֯gS~%LٯC:v)Aդ'Nܽi?nRb-{2 CۈW3jR\ؼԞ74nzHe!ɬTcDhkogrR."4~Հ$G)uxmȎ𳬺IWadnj:K)Ӳ#G~k*Yr!R]ƥlINKE7^lpiեt9A P7~jy:wv'[ J"Δ:CXяw6qo.;9)L2\}nWmC᷀c*h5H A)a)jMz~QyVf="T"y{UH)P(ܛ:}͡;#.PsB$l5L;Уlx]!6r˥2rӥK>ԓnDFKѤ[ywf [J89JO N ku@e|oZ 3k##@0(Fkx\ E)6͘Ny=V#x`be{J82*4F8MOS9N*; LbͮO*\$:"ʽ:QLQ ɍ>Afm<7-i:GU3ZIRoXV>Gxs"_('NEBْ7sDAs!Ãrp5ZLy1&R5^y0̾Bl%G{ OUi^A a } &_TܝS%-CP6Oa8)H?wϺct`]B96.^^0b]W1݈>ӿ ayI_; U U!QQz,oUln1c8 =wCrd\dCTxP? νD::NM1̨"=,p/+o7<.~U)&8VkÀe_-=Yh7xs|T 2NMďca4 Ff$62mAi%;ĪEm~?8E]_0j;Q_F7bM8\ (]ӳ>_&)Mpԝ,OA8GSu k/>{s?`jH}.uwPUd _t bʞW2-2QLX]tJ8=dNes;"jZeZuXoYf"yBC_H8jŎӹ$˨RytBFzq8s9nTA.tͬvú6f \f5qlز.9F/SQ;<ʀ)q_74pW>Ds͈F?dlz>b%<\F͵/Qq^EJ! 4uⴄiHr]Jr,b㎮+?w*yx޵H+|R)j4é1lcV:#輢bljlDvvZl!q;Tޖs͓'WP+jWAuvѿwCCZBT'էnVRT~m;)V&?f7+8b"s=JdlTmm\@bvy%%K~Yit}݈驡˱UM[FٹkógNM& E{WZW߇vn0Ǵ Ru(BT;qF&g}zĴ2&V(6j4M:o/ٔʛppJQYZ_m7qo:rNYAIib“hJxF5w*U5ʓA;NTFmNQM~|7boGi?K4"UCݧm O\iq&I;yҘΩԧS2~q#!h85z1ctߐm#pukC^ s7 fqSa'N}~B|&*3| N1un,zju=eb$UFӈ;T)PiMMk\JP vaT^MB~hWŲQE*ua]~y5{1J͹7="48=jMp%fMG:mnd}ۂxlT3J_rӏe VCCwPUPZg˜qK:&[M%Цw OzR_PE*I!t6Qn=0Sv]AjyVϛ+S`p)=OZKu8n*-M;T<CChf5Ŗš}"ؗO2ǤHuЄ36$XU+z!I ҹp?mhj8{9ۚ|QT6Spc}뿻}+6TK MVGJT!WӸۢ( r˨C 6ԇ IWYsⓤwGncoH=c4J;]:qmI^'<5*fRV3%#խ]ڇG߆=n%fC`Q@(#~2z194UCR)a>o<Ԋ`i-i\;3'4MhtaR/e~BMr<=Pe⪅Sq^_l_? |V2T)R\t #Iu[Zp ķ%4Z1t澣:V?>Z;'D䞚^B76fUFNiZogu\srZc.tp{ m՚l]FYzwMTr&xTTT;@8NWW6"YE6ۭniykGIk*:辄ݨӔ:B_I|㤿rl0&Kf$vŐ VUv%F_Sۇd(i"~E穅+cR7~c~ t0%.F\>E=6^h"T(% R$YCܠAfHz$:ނJ@ $MHkZHW A( QLske+ܖ[=TJA«T$8ecm\~#nq+4G.\{=#f7l&JI6y>ߤ3MBTTFJ!";ͱG\'EPݯJVcsPũ4 ֙L+hp]{DZ\`Hm[)0Ā⎝72!+1"CVYܞvcioNw=m6H<v귒dOxm 8]0F|OUƝ*⡕f$Z\rQ78_l9}v~r|Tg9.gSHy_7Xj%G2}x'_ݑ]5eg61( xvlĦXFņ!3ZԿg:M:%EL~;"jBc?S-ի' wrVr6rBWiN)YǓ*<#͌*3<1Rz ikj=HAв \|gw"R-/&# WkffK–'r)K4"?MRlIt`f]Ȗi~ItY#޻sO,5Eɍr&8 ҾϿwzMnleQieT ljTV'Nv'uo MډZŶJ2bIRd$4m#u6OUd$ ^_c!Ѿi پ%)Tã}1>']'1>J.X꾩⟈9Sn?CB\: ӳiMgPUz+>NU"ƟGo,o񑀺UT+o?~r[+A%2,*T6ޛn!J{tJ xTd [^P-ש/o4} 1 ӉHt|:8 FE&z51%4okB.evx|=)U]& nuNL=5GAE]wٷ9%j{j87):lFSV!GO<eAwNU[TVQc->8i/\Ci;kk6q6vbe qzBQ19'EwOgTm)|1\n0@=+įf}\bSO1-NHjXtYXeݎ͉@WUO Aa@yP١.6u mIwf68jN=Fd > zlB,tE CBl8>YܜODMrDm]8qhg@n=P|<ŚeE%C+EJTvIDh$-a 4ڤ[kBO_Uy/g#Jbs/v /ez4 JQⰏs#I\#[v/u&ߕ8v}p;87-?(\PiR]Օ"HeGy$[ ̙l%gQS:D\|q1O5~ (^*$~M~Cu gvZ趸QM| Z}>8rW#fSjHoҽ~+elN<ҡGe>ۋAC~&vLs8OQ8EwIU'D(3{R1F޿6ըt'l%ഺܤT!aJ6N1C̹U9 (RKIߤbM&օX2}MX?z^+9cp$6xK#v#ƨ1ͪa;Ү N]d"ڇY ╧MjmS5q,TXt8k9ږTܷGi} q}iXfRy<4^h$햁tR8$#C(7FT'swOgY­9D 7WA[n$ipy^${#❙sL|.Y~J[АwGIf R3%l-ЕUJ9G#xwv)sǎ]nfs|Եb'z~x'J;ϒ*VIڏԔ^eaIPT Ty n*SNZD:op6Yֲ8t~!G K-u8F݀'Rwi* v)Sz[aS^O{M߽W>,"r_7>SrYܘRҝ{'nS;qRIU,Bz_Kizr)E׻wtLcGi6iJGYz=Lif׵~p#Ul*Ǖ q8\M`vƥF;u#&+5ǘ^d}<(J'BGN*o流|wvR_%\Oh8f%&`*Z{s qyS}Q!<:졾 x[ۅQ3-5qVBk$o#x)tzs1cXl%#e":TtWmz0:<ټQH|n Lʙ6)K2[ $IbOÙ)zc2? p3(MLќ2)`tG/.L^5ȯ4[[*"e.6 mbI#x8ɍi"fMCV}%OBK4<ֶZJz?NctG Bs#eT(XeٲLRhwWVÕ>Lhs(SV 8.|r.eFHn,y7`E.ĞJ+(AMžv*fU~KQˀxz =ǿr1-X#:* f~>ßRԵs\ѓo!~4Y_Y PJU%G_'\ڤR[py%*GW2dI*u$w)\0*r5_8IΈiU U:kp g=j8NҍԘĩA1t=&\ON#WInSAa ''|':'J]3|߈*TM&O!>uWn8 BT{ERĖ2~j;NnGu)FfCrd$}tv݆TIz; e$*%䶄 ūHHlbbș$LFR>ߖ"Ǥʫպ(n \zpK嘒5>ʧ(AZ=8bshEeM\ \~Upὂl7cˤ/P]sjVN''u>+lZiJZT*ÊDHk"0,8]d>Nh0Ad?P]n fPɰ.ZPn_UV#xU7?T{b6zEYVU@3rNO2|1k =bs-Q UHzQXm7)'yy\U܍(iPh݇SjQ1 ݃0[#"Yg]6b+Chǹ(*jal2I#ۓsHZy @P6qEDz1ߎٳ_XvyA¨-W_o5[ s\#`cTq j;K 69쨭]7|p2Foj.ѲgUm\TÕCW.H֣}pb1 .<~]S%hV q߁$ZZ |ڝm4Q߻rtB#T7nŵ+T;sxV4i}eù_.f4GkQ6v2F*og9[D&}*bg]TMYb[Tyq*?UBCh\q@"1MRgR!~-(⁞9ʐ 5-KVA;Q!'5G}֝+IN'U'-Tv늮 ²='NRGvBlHk3)yEmǓ%µq)$q2r ҔND4jZ@!~ώCoY59w]v}R4w$ lFa'96uuV5‚8m*G#Tu)]7#ޓgJmZISw$(+=^y;(wFm]+|E˔F qb4 {wZ؍%i.:TNU…щNP֪c\S+'x[*5L_թ+J/n1Q*r].W:@i?"^]21zAW̺OQĘ*lmvm jwrVX&qD5$TE=cvn|LSTr*u_*Oر EJubsHb*4zmڧ}Qqb$Imut79V g ʶ WxUyB#>5^nQөHZH;?%fG!j}0 wK4Kֵ *_TcGh]p!)ND2ʇ0C }l0i5=S{cz ?"rm05oV ;hdڦKݫ ϴ$t֣͜5}bU~>1sJpqt~#`l;ZpnR>Z)LɗmG!a'kMN)VZڔ*5X$;ܫDԁ!"JG+,/R@RR/EPB}*灗j-'Y /ruHO 詜y^ w%Ml\ u DƮy7ǂ۾2J*PʕI}Ēup}߳I ,7WҚUrb[jIČZciJ4w($yX'SR [WOC N괥#lJXRi"{~q5nYn'ʛ"3*=eyq,5Mm(G핻h JE=&]2RçDFOw݊;h&њQΟP ĮTCNd} Pcª>ڕ̝7җ'xW tKrH\GbW,)i>QXnP=2|4EƔ'.r#"%ͷJ w 7 ܗ?z*@.g_Vbe%mi)*F8?3un]1P+\Gr߆*Y9«jѓW{Il~"?$lT 96mK M[o - 8&%! Wchh BSJAvq (yH> ?+R9>ǪOj=8o' k[E> c:͉hM>3)~J=C?,m Q޹ҽsgjbIZ ]IFRdPQ}o&޺o,O~$r -pk9a:m&݊ ⭐SnY72%.vJ;vQ|Kũ5}}?F-esM8]n#z-q<Ԋ@oZQo5$0c uxPAL/*z~m;Ar٭E$0YGEZ!fDyTLltOG_YNeo\9mg;AW |ںI8 B’);jX[LFfޅ8.X2 -IbXz\EG^ۑj$5qd:ODʚK*oé=݉On7weJdVe.c~cwE0W!%F͔5k=Cd{(ĊvC^`y B Waz#X.q{l ؓ@ŔConٞ^֫I/i9`ۣ~!r"U5IVpnLEsTykOzO Ǒrq(BkZ;o+%B〶:sQg1:P6R[_Y2R, n~\՘s$]W{-E"6jnJ;+%JD)PIYt(=Zg%*#M(GE&mfoA>8+ʹG4xGѯ9nکOwն8ڸG\1lD2 lKŦWJhaD+aVܓ݆7QԳ۫vp<ᗞo#W' UaSRK>DBe$b~A+L-G*;]&O|<|Z4yΘ٬sn^p^~#Co,zoReS0߶ޙJwhw~yVo8z&_GkJUuljܖj ʏIKփccbNE[N +xT97}j;+ҿww RTS}V']ܻpĺtScVNwoJÔܯ.hBtJ=r㈵SO7,:PPIs/A##Xߡ˽&Az#W;uOwp'gR!5E]CWgF"7SYFx oԹTVlmII)'' 9fX-hP`Mڨڹ*n>{pʴ搦SI_ [ZV#w -TS:Hpggv1346y7-nnENR;I,BR<ùk2Dtd%$p)=:gj){M8 PEX،*'y)j;2CSZ28bNsS lc>>L[M0heFp{~<.lHR5p90VЅPW~,z {4K+0˖S#* A#=Y O⑙7n*2[Tt:v*{?JvE9,5*MK#{DRWmʸ i"JE%Gȸf\&TNeiul-٨Yi}&EjS+ht_#t24e6"$h^@jtE4am>9KSٕߝbCahWn}L8l!N6t<).W*!VS|]xH\a)2JTT|cbrlY 2 =M#a(6H_yцXJ^nQj@ޢml<J!|BϪY/?Zn4XϺMeuH&A+yԓmH?5wBgBnGQl̎:ezw|277Ds"~Ib2ver.اMWon}n%rH.D1jJC84?a78g>̮RWV%=#i8NeʴjYB1ee/dzuU;0I,v0ބ"ݛ8MNn`x47,::ZlE7l]%nI8;(m ojmt~8v\~oXԷRw-Nô/C-~)F`ry<$%Xfu 1A^[bDy%R%!m6lw`ljuNbեZGX g*K$ Ԟ,s^y/i~[dI3$:ӳL:ҕ!»;rKvHNnC8˨ԕv$&H=0Ql M?{z v"U0 () ) 4Jn}W)LњDy{]tЏ[ WjlD?!ЄH]Q9m)M221Niln s_8 *$X5FT"?XqSmt;~*Ifd)ż"uJR SᷩjHݩGF/ I'FnIq]E ɮeC1+VE);m#U튮g96ĦOvARRڱwa]Z-*܀ENl "~OrĈqBZBw-{|/9Ba@zE^}kʾ1sɊDH.$JxZl <$幑K^lZJm#m_l5(G,TtCƑVI~*,كUL(22N<Eens=AP9hΙek4'GU6~s>YyFb=shn5v&rm-c,5>Һ7Ӽm8&~7+J7M)4ҿ,GE}84/ka~dNj*qZBGeJ&0%% ^dIu'#XSFl4:-Do5ŐZIJ{AČ TmQn1VV"שYwH RϫYP%--eAIv˹r(Cm RgItG+-,2ӊor囝KGc!yK(J=IJHN&d*"snwMoMj98Hm"MaĨoԮN=iCRvx+A)~G9RDa-IoԎ;w1aGm,F(&hEG뎿hlj4!%2[p+.WR0&^s6P};Y"PQ$PfӼwn* ۄn/n[ ysDtxU%kBjw.;ޓ*^މJog=[g!KGA5 ToZTU:Ѭ۱êg|Ȫ}_֢PIIT9q: J4͎F~|~>>SmFJe|Z[K,{IP8xw.wtdH05 Nw>˒B'bi܄nΨm[괁+eY}bſwO=O!kJn~OU.UUmګw~'<6P.eYp댥6'PF$HÓ_SҜBznMR5]ʮFUZ!WX{HW♖%V. tÿݏNS3`j/b'zup@v"GСow7SD[R*]) )*Gvɳ_6XTŻl[&ןT/~7qidoJG| ee:FŶvqp ZiCkkW*1%tu6{R6h-c]5r_:{w n"Sa8?_71B4Κ|H*3\"֘' Aܦʨ9уډӬ*i?X{)`5iT1=ܤfj tP)$x^v.u5zWG<̧bBQW+  !ӭ_YxG ^VGF}qWćS|M)xGg*-/9}8#ymNiiO1'PQ% <@2m"5X󈵹@Og?-:aFKJqAdv3֒-ІMb :"J0tX?>8$7U4W%gqcp4pOHԚS ewBCj*;6ilIٯܓ|UT3eZ֦ͧq?EJؘ\lU}uѩϩu@ܣܬ=Mʹ^ho))qR_"헫V}$o=\0 8hЇ];k-s)p8g5WkH=ǮaL[<blw#إJTT8PEk܍Qq)*5z2P {ث3)EO4eFeӌ:%+r, )AY۶|&s5O8Km)E/\)ýI)مu=0%~l[iM}dĞ>Yxv{h :72T}G8)'o=9N[daOp$%FضݨiMFԠwc :hοNTȴ$i܋#(EE'օ[ֺ? 3H>m|-GY`[fHnW:?K=$qK-13#~rSАkCwYOGM􏸫p(̹춘zml"TgqhP1_lifE.->%>]5846jS>݄=|qU>[%t=5Èݘ19p[7^d;ʽCJBL;#SqNrKnse~BzMicsTqOJy'ӣOH> +ܬ/F~ rrɍoH9߆r tKo`V3;^t$;)T>q^hMvatp Cw \`,_M70ʼAp̑aC8;R}ďq¨w]U4]"^O}mvP U[*t(X[n6c%1ilJBGjZqMBKuvw~ſ!#Pj3>nпeIzao<:|GZ0PQԹ3)bc6p\G=3TG# 9M`vktZڒ~8]  }8qSΕ *+PMRlZTs8retP/ .BrS[oO6!Kf+C:Mcĩ;/{@]ިE L) pim)m㌽}z[ӟqѡ. ~q0Z5^l2tE$v*r]wt:l6=Ip_)#^E^VM8yEU^jxWnT YVvl`fЇZO+>>dEmՒ̗Bv[$7$d>=vHt=l,t9r-$t)P_Mn/"Td9S%R{A²WÏZ+V=xf'9.K.Ȧ$;EWoWDFE;S*i$c{0U^ř Ȉ'adBِқyY$X1rPU5?@ht AK\'Xj:"l{zOTjk<>k!]IR/t@/ɼ U5.6_ \wACELN`'$ Z1W>E*b< H'$U&&#aG)9Ӷ@ňtN]Պ%,Ӳ`%mSЪ6jU%@bHe:TQG@6?[UZ/7f:}[@Cp=a^yʐ\Q*I"D纩7oNܩL^FzwkBQjiݥhYPPLO3Th5w_Zߦ_3]Ҩ"HhX'b5n%2ZW%JBwTN77.tX?DN$Q4mCN=S1uBՑRHzD$pDŵqJLj6#uDAuPZd#r[<ªFL!͚IIB >F/*4T]Q W_Q"[%m֓p$Q6D➲H=o%P3Kk=due]?5$jyUJ 6̹ZGov)rؠjK j!N-s+H fN@&o9fjxL),UGv6\d*0w+Yǔ'5O2D8~qd]Yv.UrLUҙ"2WMj겒k\afj(v}1" "令n :y43Њ3th]iGĜ [?c￑@*MS.?Σܔ\j>eY.: O&ԠV=2hE_]OeQ\C ]%Cr.\ׇ[—GU!Β8p2wIS-oޥԣTi酃8N3h."* *:dө:3;;PZufIH1/M[P sM.h}ϻӝj1~ȝVk*]M=iJ[0ο-OKߊ'\S\@+V"IORwɳyw)7Ő<(V2m\ N*Q3vWKlIJ Zg'e|ќVV침Uc]@RT,b\J^sk}+3|&H3lcԲOP=e"EATvUwzV#1fe8#st1FVw,f@@+ޣaRU;/JT'v-e~ڒ> T9qq Sn7wzlSGեF Hb"[/DScNd̒^OZRh?7A䢷.2'T]6!'PSwvZǿX4:LQW][ ɼΥIk &Wgqvt=TŊna04"4= D{ i;F IX]C~4%%Z>4TRݝ?~U܈sJŻb:miV7r$AKW$dVUY2{^gv5!aCI*R,9Eu B@ H! FFtH)>ڒqg[pܴ%6pCZ.55)8R;,q H")SU֫%[h=ؔJ FFmJj)vYor}vɧ9YS2vXʺ6a;pr,[6%7xWIՉY]AaaTi icr>̕ɒ*=׊ %#4ЂHi)o͵6w 6Z0El䶢/rC~(iʢ m?8mWϐ;]d{} cϬzC[yqC#  N~G]S1ӄjeUaӥIӫGf.~/C-2ֵ<f#rҧ#48) ̴ʖ Q"R8hhB'I5CS~#7a*jSI#iBI+#p~kAD$skS\OgFU\N7=iUO JKm]u FbIXV^uk^׭uy!fʎ Yu[z~ǸbErLj)77 < }0k5*ZmtXHl~h_xrU7(#2HZq+qM6Rq2MD͡=+8ċ|B:/,Ԝ9q7u7dž#捃";5@A>GJ{x3r}VGaRq`ATP-j7l|vjD N'dOg\{ }G݆3p/N:~&E[D1!ɵXS)ǣaSHlI;F:;R)sr{ *IFMmp1U[46qm^CsnGC'I>SklIh-"Bm~v>*y SS ک'rvKJYq+JI>A'1ڍ'Sx!zfBS7,=LH1ld̘CX \RJA 97%s}3 [aeH |3 SL /2'MsoM/Jk5Hr &KhGM:@}G4*ZgU*26: /2)y]Re؅~*ΖQQ(Ҥʹӻ~ʧ_WVʴ̖?p|)(z8u#3MJ], Ĩwm-F%:]ygy JԥLKYzfzFv!lVܤ%Ij2y̺L"YrkO Y 2ЕK9llc DϩC+Ki:r;+v)Y\~8W(ͷ]~Tܕk ;ѫY~Zu?вcdLO}QeVZN oQr:̽ ؁r^7d+lm_+)Cc4#5:mv [M:aԔ>G?"r]j)Z{} b[iUjD.)6pU]H)HqnA)eŔ1IҠΣ 7!k} J9̱eӊ44/I/oؐ&ZW@{LsTտ":6MGp周ϹuJfJVUJa-y2qO,inCI_.ZT.{A!ZIS)H'v[xiTu]9QVԘAA%BըHEْ}.4Y%tLx%4N9}j;-$MB@pR+S&pPVzM(wL+)=׶W(5w$^-`' (-Ҩm;tۂdz!L"lW4lZV%Z}OQS⺤/R,,$;y$O7*%MODd ks j:Wm;a5ꛎU|Q [}TX#%ݲ};С8<'[yAHF7:wE.QՈ '*-Og}c*'K6ox߈vȲx8ڼR05!i!h=zbl ui-G)5%;b-l;S"쇶˦kS_؎7zj7؁276i܄G-ҘS|!qq֛POgXMRq$_T2V; Du!ˎINFL`17bGEiǒz U5 nm#z6xڃ9u}n|PR) Fqqd[WI$%-*!4*5Y5JW;sJOv&aHdN|#lds?8:b0lw"ֱ&%8VGQ> &SF &QrwϬtG$8 7vI# pҠ11Qv*L)-.'[ ,ʕXD1VOTȎTiE8Zy$ص9Fa!ٔu꾫h|KVJe'8>W¥E+߲Aq.x+W?rpľPAܬQ訣z!xңz-򈛦Pn<Sݍk J$JE=B48s*'$RjSGȵ;xH[fM&M]9/eDvwaUn/5ճEq_q<.4*euJĶ|f?GjrUZ$ζ7%]MKRVFd/ەHTn(i  ~:^=dlϙCE R{HÃ%eB_H_bHFOn%Pj%Mh]',f=QM?}*H KP+jMŰnhJK6J|&%c[xH,Lj4ҙ,hl9%tW)Gc+mNZYVNjJ"%7k_;ǎ?E.}̓{"vy$bWҶ짶\ꄦan)Hps KNm,'{_ ~΍(!`#Ka @RIq iPYZ+EH8o7V-L$?ISIEv:VB*߉\T獴36œܭ՛i\瘺VקbOڌie G4\ 0w:;SnO;&*J-۸&ǾXK$˥ֶkԞ#~dZi a'ŎHQZ5eLLa.qm_/^dAB% ZxF#.; .sՠ9[儉XEo͔tHVM-ٴ>ֆr6ַuU~`yy ):zd{3Nxv JTM /iH=v`)Lit>dÙpp'fZUҪţn ؋' ɵJjy#iZWSg-|־n"^R=ƂR-#p/mn4}RԋEc",fqQbHqPrqDG(|MG*|Lt7մu<,ݿ0VVK9[~CO'M͍=lѤ5ĒXrײG-bm&uUZ%;>;~$ 4ˋ܉?=//.BR.<5=vU6~eɛ+>q: U5j>)0Ŗi|!K,_k<&S; )(fe*8܆Õ  Vle3%F)Z_x}=FR%e.0}\YKMmJq{ntf]Y;azƩOi ӽRt)6$\cTc!%˪]Oy I-+eQ*['қpowy%Ne=UX7>]*K23f$ID3Ƨm_Kv?)yS(ǟT…oIM US00)l[pi߻v*~Rj*Kpͬ1,Ysu*6ap^LOeg.B?F7Wxvn@rNәlp&Oj4fSfe:REeD}Q-/VDAq(ޟq=ҘUqZwOh[v.10k uZۈn#xi0%ClM$w1dGS:n`&iy2hZ샿Uk 2L%6)=p%PLyQ)ZـIz*+|OċŨ(&;. nW աfxmyEIkB[X%}SxXI$J"կ`7-}w⯚h=5LRX@AaV]1 a_6L]*B{Ro)ҥiize;͠W~W8,e:zJ2RAP݊n8si,s4YshXnn¨qn>^yǜַ\gD46Fɦ+pupZiTA.b.$'j٤tY{zQ1cB7{Tw^'zn'w*˜"2?^<$cU̼ʛK* atzz[ű3dzvNy2/G4߸-SSmZf2eki qXn=!Hvԡ5aMGc`Ì"E(pOkm݁`M%ꦹU{-8`w(z:jKUuO\y~:)AWTJKjJe7Ύ=aܷuoFjQ}Uc*;<"\?e\0Xy ]h'r>,|Ws FY̷4ܭ$rG OҰ>R/L\zY ĶnjJ;xʆj,?-L5ܷ/ 9SH ZMBP8< (jaO%xxܝVl}[p>[ fm0&tT&K`z֐~ov#)Cѥ4eI>ܛyz2 b|/SeSۉ=OSm u] -¡ey4sL.neڌfiY]YZ ϏtM˭)J Bu X "qСf> a Y(BlycrLc{6R=_0M el?MLc+߈IVdr}n &RFKify:J\dzR[a.+i _xLOvmn$f%Ba+g+/)5*:$~㊯"_tɡ mM)8]ewd˜S೩r]WwnRkt)OQ9rt_RoܴzE @!BvC3ke-#brKTPE)k= }[^{PuK`؞+8ϙ˔m:e'#G~8{/rKr [ɺtB vԘfVnRx|0-_\u`TѤA#cJ,wq0O!mC\;ױJmQIbtn{4mB=RБ:u"'7S/h/5\YfyVnC)+ d=bEEI>LJ+-njOaR,'6.W)qW&?6GQR5ʆeu%7aOZw);ob[{٧5ڷ|{L@w˩>ZҍNo^p_޲I<1P䱜":$hYb6Bv6Ɉnq~.Y^j/v錒IjRE@\*tv=91R9|ziumG+[JnhnW V_S,ǡaOc~5T+f:i$s<>' JGE)\GQ%Z {i9y2o}W~ N3Ӄr}!J#5q:$) n ZD^2w(C͓*4iR/v8(oSrY\#ZgcK:B)8KNBe ’{F"CCmkZN#RyT?~.djc-e|#K6[Z`zwu$bH&vaMMUOFw O٢H(RlGB{1MEW^D8ROke_ѓ k)ܡA HʙflF,XܫCf.bXI.^ۏ%=zcqr(F,ꫬdĈ/}olTRI83!eƦ)r\&"6Ӈw&Lwq!M<<&)3rზ‡ܥ;Ŋ~*J*LICjlti=q!f|2 Fq>lec-}:.P\YZ#HAB݈Ri556)CZRIZ}%U%]l#+O;~IȼTj̢DzXMJگ #=geTaLf*6lDm]dg+GPe*#KQi7vًQLPGpEf*LCLv}P8B[EC{= WN) ~&MW4VbVx%ݳDn"4+dUS *ݍK+(‚ca^Y+Hu5`ݸM}a!CM6,m'JR;fUIbGFMvKq:HYy;бU,ʧyOwĊZ9ra㚺:Qmv߆)JC{ӳð*ϫ^cU:Bs?><vLG"͢Ep,IJ}e :e7]{g7VqvNֈȂcgV"[Z ֈxOs*<*=oBa)8U߼uȬ.Y̡>/9tr\tӨС>ǵkJUlS-b A$1]7C/rH3ٓ/jE6j~)³W.9 4)e#TT6a:Ye( `v2Hܫ$܊HL ]F:k[_ 5Z- 0)Qƥ{kNX/#YTge,o݆^a$vg]o1*߃r4.fZ,i4}r/L%zv&S53 S.YQĪBgS u=<}kJRH26H=@w3w,QOF _>./NHtb0eT{OȽF6nr7}&p{2H;jJ:.'}En$R3"ۉ啖,- (wlG2qQUf4RFlۡ!0CYrJV5ʔ/}~ҡ2Tzl![A W+.U mKqS#.HJqlHcq'%8ZEBtɶn ދ9zsIM?x72#ƞ@[N$)'a^. C6O{?/)-:Qدr{iAiǴödp98zE`BKE-gڡpyB:_IyXεܫ;),B* c.p+CeBm)M )(^UbvMUiSjk,xx g )(UgCW ]/$vn?yMWY{/æm%[aIv"풜q ¯قktݙ8D@SkIP<>3* 9(Hnu|qIx;S!\Oh8\-7"$+i#W~*ܜɧEuS"! J}9FHCN溣{!(qOJlsڝQ5qw'fIQTdRoe8ay DѮz,JF|rB.d*H&cVDJ.("9:-Fv&chÀoh |;p+sF[)^Ť#}Is**r*ϣTgswT8!:zBη^?Yŝ;Jd[ :|/9f kWsT=GgM#/F>Q˫#1T CD}[w ~G}:6m;0^ː+Bx(=MLRn67M>g2 -$Gv!dJ2bB=ii'[=Ǭ!eF]ݤ|?qyK`mots?B(R== !O=U9>?K̹inLu{ivs#P SmI&u_!RZ^1ĮOkN%aqANR-GLd0=ǿ U)q=DM&dJ?ݨ֖ |#ᷲD`\ˉۻZ8<Ξhp}^QےϘ&> e_SS~ vJ#ĉtyfFtMiZS@_W 0ĂMndwoIߦS^Z0қ7{W<})GK ۞z; 4=:trmIR߉8=PLt͉JJ=d*'L>gpYQOY[%. >o6}C24j٨ݸ>nsEW.iỿI)̯R$556'|q',C /eWmhq)Z>!ǒm^~r:/ۂ) |0sG(H.供M` 1{y&e3#M8tԤ\-6PafJSHXxbVWOA}{Fy^5D12t,g,,iG};б8 5oU2KHݬHN$1f i{Kto*e:cDf;<1S܈:\ga4}B7R7Qy6Tj~ wpx (b*YEI NPQJ?Y$[QߋNE|]C~D,]&DAh^JG*Tvrfg!/|0 By51 Vjʌk:R, .^M;j'5)S*-t crHu[h[y>'l g) +;B=M~?bNnԌڂZSv78U2MtL9}8@u ݻ&91$-5T|8{hU?<&ܟU{tjE=;W{/~8.W+Rxii*w(~HYe*2TP= {&y.4IRNq;)WyJTPD[6ƛ߷݊zB!ևW_Z:ԛz\=(\v<:&Aڰ=uHiMڽb17 rh掯kuOʱ*.Bf0)ZLz)J@k֡J.f)N)|W9oZvCy+W:Jx'~VkSʱ' HU)wد):EY'!PX@nKڕaFx)nd'O -nEՖ޴ϯr_\ 0B(K e[9Hsc-%~$vY56Z#_4Ƕ%qÙ"9.GF|ucէNW{V|qm gBMԟqQq蕊ĉ<o3PeQKOVU8E&Nj4vEScf:گzq"(W3YMԌF[R134W+trsf6U+O8bGΒ/Q$ݧ#X-hɿ ]nOs[˩FU2CmTԫt(ẘcc!$:!G};@"U1i YSSpוSuh.{׆QYPPw!1LyS}q6ĜW z^8<|uҝYk_=4rA {#׳IYOIū|0ٕS) F(q'[F8,S!Om}e`6$$nJR,J[m ZG!h-PR"8)%Xt[Mc'!=.VBXH߉ "'a M5:=^֛#ǵ} 4VZ}fOY\=qn3(w{"co)|RqPy-i|bg%.g!.L쐥Q88iRKTPa8 Qڌ$fC{~Mr6(/ p{**p*Q[b:7z.4qa2fU/f ÕjE7^٭mNɨ1{J.n}q#-R2MiΪp^Ӗ1tCkN Qѡ*C :v5)@&.|%OH9C: "vRP]ig2@Q?ݤ'~Rk[Z-9"\*Z?4 {ӊZTR,[poC7(CQV518};0YvQbfB7-?=A9jt7}ŵaM(v&Iu( ,K sȪ5I/pܬK[ okDkUј&y0OuW͑h]o3S UPhTh]n ֶ-.E+3H}G6_/6U4SmwM*;dl%EƗ`lG8Re݉NQG;+ۈJ6?"mE$8c1voQڝ;"7)+)7݉!0Uh({]A]tIa-SkQiQy3bY}f�7Lą!i;; θelRxA?3;ԍnnxϰ}U|Z/4ߖCC4. BA5J uj[4|7~XfQYWYALnԺn72# ' KjP^i2GWqD4DmlVMQj<QMZEfjM (G߈4RhM9Bte*ήzSd:ĖBANs#RwT3Nx>#Љʕ!`UXo"Owio=ǿ);ܫ7X*GxW7|ỳL(f4⎔8 [qXu(ub2<ܕ|a i_C2cM;ΩӍ$9z٘2hGQ 8fXl%>ΣkaR STL~J-pݏѩT\M.`5ة/`3O)6UF Z/Z=iW8ɫLcy;TzmS vXJZ.]R\p{JveQ{-LHic+o;:/G l;P|o(;Eک[օpOqc1F/`̧F=]\z'22ai(཈)={T\a:R8ÿ(*f"q7n*H'*-Ӗ(H״puP(^H&LjBA;RO)ùfWMJlv(u6my.RޝM-,(lŒF^-n lսe hߨާ2GqGFX1 :x6x~&hR ZT<01R6SoQ"! Ԝ G\YJX¹Ոu*SN].}fA OљȇNʷ` e*@)!u(\TU,NmV@z[:cPz(O ÿʆjP)3>Pœ+H>;B-2NI1RTMzdfi-OǒDtnH=qUXو2"V^o MJwtTꔸ-_w|qrוhKUIMg[&V7GIgj",f9!5t`N<K8}bf^MqLeʎ58IIHszT☦HV cH+۬Of_^ZǿT/k! q)[օnR#8 gQT^+mm߆jT u e$7^%P&}uUDj!0Z ;K)uG );ѤWԩny<]gWXc?FKd[}$Lst?.* EGty(uwp99b8 ˓7GZ;;Ǘv'7_|6u&CPvNҕK-?uoH͜i[9Pͯ=[y I0y02EFJrc<ڬN"A܂ĮOuf٭"o?lvve#SO4IXlO['6K6WrS1":<4ksŎI J`fs*F '&Y-yrm(b t-|P3SFZM W@+D*+CaA"%[ɹb)9°T^fTvX^7[.OUO3fSp6q2\*Mƞ'v>oA:8wD9-֒|9*7YWXײ(PvY_R):lJ>eU:rJVݴ#{tn7Ɗ£x/݉yh>la4~Xޔ=ob"Tz@'z4|➧&Zk, nJ%-K :P)7,e\qٍH:dGqIe0ԝBp3N7cTd@q7tǏDbeWޙHOeEH=|q3"rX=HFɤwY9VO͐Sܐ9+.Dv-T:k=Gwm2.:+SN{F$f:aKbHA6Ԑٸ_`yrj,iT"XDbB7({GQ{N +%L㍤&oꋊ>hRTjӿ+ʙ窯U61 NI!VTMvKu)k/8nZ_S`:^Vʓ~xs)rM~n^ΕJפ[kQ6v:a0[8yȉN݋px豛ZEŢ` /~lrUx줩םVV^uӔ}YΎLe܄R8_Tz)e/`s 8pBs!kБ1๲TԁB}koRq<$saT~'yfLHl8˩टBdžgڇ%R9+S,6Liw[ WiPmmeHXP7ʕ+h;{Gc|BmM$Q5UQd{.w# Vw%#JR%wѸzRΣ==DRw2w\IYTiIt1?*jBT XtX>c eq_Yj}&&U)/ݴkR}waa:=qp8ɬt,k dtkʄFn(%`xTQ?M:tczjҭ'h=q«,֓WB'R|AU3(5)T(ehCd=DqnqGqH|;[)ujHɡU[KE O80e0fg,JB]aGwIW2Ċf,1ME>F۩JΠ@#hz\4Lipñ%Vۓ91N^=$Z_ee?4Uvu:JNS(ѧ\ 6+;TڹIIYJP}W4[WbG(NO@zAեcn@.JتEia)ݲ~U; IuYtIP /'Ri邝iz4Wy$$~mɷ@.#zN#רe2ec? M)NI|2 +9Gs-JTV֑.u^K13}y7Be }^WxA!Ki-c[߆y&< ImU%Џ>j@7:Q=/Pƍ6b%椮5%^mxy#eSk'd[`JeGV^jslZj_RG]{ CM6CmHa:ԄmDnV%1U\թO~Z47FH4l'qG,.4"8lM7_a)=˪jz0sBG|Kc!#I ޥ+.Xn5cf Mm#b۰9KSOdmO[jIB tۆ8(\4y:)7i6m)&\y-){REBLΣYuG{9n>',Uq[u#h#dR̅f?Zjvb!xGm>'bm@.·ԛul5'(b0B坕q^`X}3r{% Ƌk kww"O ]iemcrBZRև @ǻ T >X}.-'͔FA0J* %_Olԣ 6a&)F_f}ҙ?5/i4^m6CJ/n''/TJ\:?u#V츟v54U>@nRAm]GMÏ&jTf69٭Q8k1āfy˺J߇ix2(R֗)auh= P5D>*=߅<7mGhe)Jw NeT7 7rZL Hb?.Y ,L /aݴGX~Xzc68χ_:ҷX%_J!|c)ר< vd.3m(v NͰ5nZGVlvy7!ju|N&;M(vfͥ=󻅰C:)s=3\ޤJa#R\apGx$~%n۸: 5ĖZ{߸꡴sc2PK3"ނAiܡ(UXف> QE)څ'em3yr Gg,p/{Y:W3_n#pi"JEZܐ2nޥ:Ŭ=R3 %*/JISRP=.l6Rp&LA%/-j"op<ɉ@'0T|͘Vw +zb?VJ6 Ӻ^dyG݊ y4<󯹭ǜQqRbS RMu$ )Pxa\JSiw|:*F_R];XN*q_Yg5Ib7gzH&ztK2RB&oDdWbG5TΰVC="CUWһ܎8a|yPN'PX8F^IvFX]IèTx0q L)F-N4}ㇽ'Nό i '<Bv?QN2~pKUEp-$sfRi敩o}k[ DTSTdӽIޓľNk26 (qKÞ߇W2ɼ(?8x ;T^NEڊXrK*J𨜑SE5*]^\;f ,8du.Tyj}ҏ hQp?@=/~ yд I#Fh<2R޶#GNқSE3|͎b,茵;Rk6[2b=/yGXa⼗um-I<>1h]]Vb2*|*efF1)%\>1+!P^uJT5:x݇%>@-[Gx W33Da wdw0,:uJ&"QxQ}/^Af*^)Iʓ Y蘹k>6)#aNjdLv4nsI0j#As-hX!@rI=9Ou\ޞ+*j{#t-[$+hG"_[&jb}fjc^۷ ݻ#,a-WKix:uۉ,k8VY7< p|e)C׿ܔA?u%a̫F\>+i^#~)L(S\Ѥܠ ae͈Oo~# Uiq}!:sTէ(nl^9Z{ oOiVL頹6_W5%4[eQI]QzK֠7+w [f67kg@)u_CRbfZ}#j눿"dk۳S O7ÏNqĚ\HrD){^Re\RxOTGg:3}K1JvP! ̎!zOhÐf6(q AO|Qy3:$e A[҅W޶6jD,`r-FsH}vo 46i4 9AɄJHNW1-ϪӢn֜U)PsN&Y^bRf81@*z̉ :c'^>|lbU%6 $|1Oo)Se"gDD(t#T[y+I#(3^eԸnw c~:ָv fHhO3!=G5> u i$?.Y- \B(#AQyji9}OF;U rqY¦CJP)RO] >?)l$[HOv'yhyU̙/Ω);Zt߷zلV9BM41m@e$# &eSV}Eu:#SN6 )$qI`N (/&$6t} reXa[ը]*I+R|5+=a4uGGsV~wx&$HiƖm)Hzʁ*YJ&ˢaϔu30p '\v& ~pڕؐ!dvb]k1QNCj (H=PM߳%vr:O*U,ڪ 'T~$5R8v#)B tYnV7nÏZ«24si!4fQ$h:9f.#N>XҢ6vZMG3gĈu)6;:SA6TZ݈j>/w) BeBM*,*%Oe+O?B+ugT74+x=@TΘ#=;ۍ:\n\3UOL|U5Rr \!}Xwb!!3?O \Dv\8*57jINC rT'Q4PPV{jRu #~U45lIU KyUh&Ͳ@&3e1Lԧ>9⑄Jm8Zt,k1PT9a4{1aIHNlUrRX.25j{} T^fVT s":[<l15M?RsOԪdiuv/'Tq )eO8@#͊ڟ0 ) ͊_4{E/Fޗ}eؓYeSY"7qg̨r ^#7u|=kqb:n>.Uͩ(?T7e+1tR[kOnNو<ʣ%SFκ}l>HW+ÀJE9ЭMmrI²pQʿ ~lktV; $ D2 N܁)w~Da@Yym:@\搟*km0;T{%HXW-T@S,]6r{G}ܞ˷ ҩ =vEqdۈ)Zh8ɵUeK9BQ~%eZ33ϾҤJw08+f!o~H_+2SYJ,Ά}&39"4Oq{GF'w6R]54ISR˕7KCEbhՆk ݷQq0-P>]V$Ov 渴ht"RdsK`}kŜR'Zt./(o#kq%NoJuvTxt'R9/l \)/K:oBN'噹Y0޿mmNVn 'nUvJ"SFI p$g]:[[<O`srک2HUӹ9vhvJǟ 8] Ҟ\x-d" 3uQ]ln\qPd̪Lis.x71>Ȉkq8]\On%RPCA riӮ);"IIK Pmpnh|Ð֌wXRͫ1t\ 9aSI]n*Y3ٙ*RuݭfvyLwPob&ou;FnM{r(9Ե9ŝk!pCrhS9;,M,\H$o? `ץE=Z#̡1#G:Tc,z{\pGoS(QaMjHOI˟^6 ;1iaL.C iO8߻w=n >+l0tIҔwȶ6cX0Л߮>=Es4$Gm\_sI! >PhTۘ镠Ei,&itFXe1YN;UvNf)ة#裣lb-ңKO=ɏztO':S=#)%.v֭RL!X㳳2f nGXf\1G+XRⱱFlX~oӤl8˨7 I~V5lTj+)gzH;BNeq=/v&SD*|FVTnvrD&DlNRx_8RJp);c)[O[u*'2ZFuQaF=NU(i_UKP|7a0Ri]f!^)7Nn0 &|{Y8نì˩P1BQI(U{GHR[)rɃ*CRy;%^hCZxTtnČTLJW+QVz<17 NP oC?rzMU/!rgGFD3盅RSl9IF}5x#-֗)GXb]6o{?V8P^]:HS4ג '΍M]KE6yn;%mEVE&\U!]2qÙW?z[خoEtLepx>ZʔT̕c]~ϰpdTꞥ2dzMkmXSyQ̕IYvC^/FJ'o_ayZ7c5?%&ͤoRլJ=)yas68?!R>w?GecJh8hm,Rwet)%ܼչ8~?''4W#tZ$/\?doĎSyISZ/5tFOՎ<~ !P!Xdw~)Ev6_QmۿE%6k7:= p^q*v˖^mҿbG)|[Sd--^o%fZR45(φ&Ce֒j{%BwAlΑLfgMϽ'K:G+aONv{n9c!֝AKPP=TGwV.ctwvj ƌ={(p!feD&wGV72bl5MAn4vSfe\U2PZ?=(Uܤntç?T7b><O5;IB}zc=!_hG7WN KOp!O2xao/UKX(m_BtJ~Bɕ4鉝t2Cwݩ V}FY2R-saJkш9Vi?EG{BRw~Xo7 ~D=Qqa٩}-vf0f=HݧkE",FqT"wdz~xK)*J(wh{Gұ{ "b3:5s%R:,S<4aGQ=zƅwn}7$Ԩvwy]嬺JPQvB)CMc(ߢu1;4L˵6P׺E[WQmnau֡A*ܔ̉ZW _ro'\m6KIQ#a{" b*Ͽ Q(1ܓڢ{I-!:(p4k.o#n.%4S}x'zO8vi1X;ͪRzv-?abxauSn$d}#$ jdܼM`aie>%"5Cڢ;~$z::Xm*5-HlYau~~GﬣXO'Nt,xEMF5MOhW7iy(y I1N4D9þSQ;{ŎMZ۽Ėn{@8{*搖4g&[~̆wbC0=S1oQ2o+O~Tscε"ʗZjIgp~a4%.li7%~VU:c37O_bkN*9S>p^.2lRӹXCijH^ʠCؐc9>|2I㮫HH8ܩPRsZBJU=)qԮ-Hǒiԝrsfӛ -{_exuU3F_^8__ Jː%VTOxnX9:jU% w#@>)o2Ĕh/\̞.0~]>:ɮViKA Gpi]pyLDg(}Lإ8_yݏzE@6Bޟ"jiM=>#-Eoc-Fnnh$_tbʵ5ʜDRdz%:xn 9Lsvb"v ŭGo0BB^7y&Q" E`*ޕᇘGyZiU ȗ MoWrS'v;Iܓ&DLښeo_wp՚EN:`G}yrT5:B VQ2'DB\\fQ?9׺*k6ԚYx4J),%"RHȹӴ5Jg1lxC%Jn㉴>O22K^#;|0EUj-ue*m52Q?7doՈ?o %{_ðy(5M M s)u$isv ; *ףR/ttw1.ƞmTʍL<#3kYGja`hMaq'>KKPiԛ [{ qČehWZSsN{>3FDKKm[Ϗ'/UAHEڻAsRarV7oZe-쫑ZOZ]#P5JlCAƝO$RZ㶻5>fPdTf"xGocqPș_)w]R%TUJ n=w r{ k݄Q9c~qQRͪ>'V+jX-G&ztw(^?[k֖=]&McE_rRj@H߻ e҄Y(Hx4쏣>m~ihVT7p1F&2AZ}NnI(ࡰ*1R\{O{,Tjio'NkQkpĈTl>ºUvdof I72ww\y]2: J\DR߳g:zjdݿH4JF:[ikc?u_J:UhZdJa?GCw1̟\<f6gJ\}IT,>!C1y7Y7^{Vj)d+Qُy݊=k/QOB=mm\q}hmEVi5Nl{TbVwo,%Uy-IOk6\i}زpxO cP& ?BշmO>3EC G-3O(YU*Rm!>#~#VO#h-xV?C$H򜡩|#[ԟq*e:yiJy'E]]ִI?t LHOm;TOarXqjQjxa&Cz϶e%kH\p DV*Lheq kIq-چ$q?㗕C{DwDVn>VVs-Qzǹ#>:Zdz"Wn)?٧G©j+[kq}gw@ vSK;_݄T# 3QnSNe4'N dRuJƲ=ދ%POqļ\rhBwȊ~eˢ|P{OG(\Fץ<8H͙rc[9MQ8`̋5TUh7_.Zy\i?aGy!zӫB*)!^ ?}t|6uDV&J}e, N2Spf+r]ݡù]72B&KCC? ~5u:ˈNJF4 ?KϠгm{. %^!=5l[ҝǕگi}5Nwyem,xJR2^2UVި{>*0j FRS`=~s- imkAOzO/|6"0og[qCҙ);]!BqCh܄t%Q@aaیpZ7>L))s*S6ʔ~F$j:.=m9aBQ57',wIOP'Rֳ`Ҳ$i&զ^c+DX!*}- z|eluJ=%JzsB_[4(6Q+y3Mli͛>s_C%o,ȩ M3#I{o;GvZ*fj;+#'%;F@^d8Ԁ QTEJ}Sb6RG&鏘rMk˭@YQ>B/~-rbn0."0߽'v n',^>hYjIH0UݤjO~E\R5h6)s"ȎS菩z>$XW#@X3C[NܶOaؑA %!M9Gpog,HjQ7C,m>'ʔMjHg3~i_ aEN>#7n!Ӹ|C[?*D-+Tdj;/o@ ܩ:&JOs)}#.[;⾲J8 Y'ڈ=,T/e71UUVBC"6fcx1#f-p@ώ%f*ԘS)*:G#N= *qInX3ёR;R%FGO8zQHH',ߛ'3'yʰ>{ɓ2Lsi6Lˎ`uu;SFV@R;ҙ*HI[@" }};p/yIP? r!NqZBGy=4NU>}2"e<;S 'o;Sr-Vo\f ؉NaULT*R5vYeJ)7z REǸ+pHy?EjGv& ƒmيeķt^s;s?iNMR~xYiE T*h9WտG¶3VQl= _Hc􆔥c*[ZZoI[26Ke,HAԅcx*77G'{Iwx[N=(H[ =.qrj>4qGf$yV%#n6Wr1ʆ[akKoDOǿi}NJPJ6w jMfGԃbN.gJ忶WWi {j)y3͛3ެGxo nGIP^ܿt~ NU'5RڵƦ3~O++$ȭMҧU,fӭ oQc9{/<4Sf۶i OBwjb=]*Ix6