From f3e5ec81833f756ea1016f59a67e488e55032701 Mon Sep 17 00:00:00 2001 From: RamiyapriyaS-NIH Date: Thu, 5 Jun 2025 20:54:23 +0000 Subject: [PATCH 01/10] Fixing typos and grammar mistakes --- ...ubmodule_0_Tutorial_1_GithubDownload.ipynb | 23 ++++++-------- ...module_0_Tutorial_2_JupyterNotebooks.ipynb | 31 ++++++++----------- .../Submodule_0_Tutorial_3_AzureML.ipynb | 17 +++++----- ...odule_0_Tutorial_3b_AzureML_CloudLab.ipynb | 14 +++++++-- .../Submodule_0_Tutorial_4_GitHub4You.md | 17 +++++----- .../Submodule_0_Tutorial_5_ManagingGit.md | 8 ++--- 6 files changed, 51 insertions(+), 59 deletions(-) diff --git a/Submodule 0/Submodule_0_Tutorial_1_GithubDownload.ipynb b/Submodule 0/Submodule_0_Tutorial_1_GithubDownload.ipynb index b5b133c..15f3e12 100755 --- a/Submodule 0/Submodule_0_Tutorial_1_GithubDownload.ipynb +++ b/Submodule 0/Submodule_0_Tutorial_1_GithubDownload.ipynb @@ -9,11 +9,6 @@ "--------------------------------------------" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -120,7 +115,7 @@ "\n", "Or, perhaps you are going to use more of this module (Introduction to Github and Python for Bioinformatics). \n", "\n", - "You should click on the link to that module from the list. It will take you to another Github Repository. Of course, the interfaces will also start with the file structure as all Github repositories look the same. These Modules typically contain a Readme.md file that explains the structure & contents of the overall tutorial module. Inside of each Module are folders (\"Submodules\") that contain the lessons in the form of Jupyter Notebooks (next lesson in this list)\n", + "You should click on the link to that module from the list. It will take you to another Github Repository. Of course, the interfaces will also start with the file structure as all Github repositories look the same. These modules typically contain a README.md file that explains the structure & contents of the overall tutorial module. Inside of each module are folders (\"Submodules\") that contain the lessons in the form of Jupyter Notebooks (next lesson in this list)\n", "\n", "
Attention: Please go to that module in another tab on your browser before following the next set of directions.
\n" ] @@ -136,7 +131,7 @@ "
\n", "So, in order to use the contents of any of the learning modules in the Sandbox, you need to copy them to a \"virtual machine\" (like moving to the hard drive of a computer running in GCP, Azure, or AWS). Github is quite prepared for this, in fact, it is one key purpose of the NIGMS using Github as a place for you to collect the materials.\n", "
\n", - "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the #option# to download or to copy.\n", + "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the **option** to download or to copy.\n", "
\n", "![<> CODE button](./images/Code_button.png)\n", "
\n", @@ -179,7 +174,7 @@ "
\n", "1. Click on the copy button next to the URL.\n", "2. Go to the Azure terminal\n", - "3. type: git clone *then paste the url you copied*\n", + "3. type: `git clone` then paste the url you copied. \n", "\n", "
\n", "The whole set of folders and proper file structure will instantly be in your notebook list.\n" @@ -193,7 +188,7 @@ "\n", "## Familiar, inelegant version: Downloading the contents of the repository then uploading\n", "\n", - "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the #option# to download or to copy.\n", + "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the **option** to download or to copy.\n", "
\n", "![<> CODE button](./images/Code_button.png)\n", "\n", @@ -205,7 +200,7 @@ "\n", "# \"Unzipping\" your folder\n", "\n", - "The folder of materials does not download in a ready-to-use format. It is compressed (\"zipped\") so it needs to be extracted| into its full form before you upload it to use as a tutorial.\n", + "The folder of materials does not download in a ready-to-use format. It is compressed (\"zipped\") so it needs to be extracted into its full form before you upload it to use as a tutorial.\n", "\n", "**To unzip a file on Windows:**\n", "\n", @@ -217,7 +212,7 @@ "![Unzip](./images/extractAll.png)\n", "\n", "
\n", - "4. Choose the destination folder where you want to extract the folder. (it is fine to extract them in the same folder the file is already)\n", + "4. Choose the destination folder where you want to extract the folder (it is fine to extract them in the same folder the file is already).\n", "5. Click \"Extract\" to start the unzipping process. \n", "\n", "
\n", @@ -260,9 +255,9 @@ ], "metadata": { "kernelspec": { - "display_name": "conda_python3", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "conda_python3" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -274,7 +269,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule 0/Submodule_0_Tutorial_2_JupyterNotebooks.ipynb b/Submodule 0/Submodule_0_Tutorial_2_JupyterNotebooks.ipynb index 80d3fac..726f6d8 100755 --- a/Submodule 0/Submodule_0_Tutorial_2_JupyterNotebooks.ipynb +++ b/Submodule 0/Submodule_0_Tutorial_2_JupyterNotebooks.ipynb @@ -51,7 +51,7 @@ "\n", "**What is a Jupyter Notebook?**\n", "\n", - "It is a tool that lets you write text and run computer code (typically R or Python) all mixed into a single file, making it easy to see and understand. That is, Instead of just writing programming code in one tool and the descriptions or explanations in another file or a textbook, it blends them together sequentially.\n", + "It is a tool that lets you **write text** and **run computer code** (typically R or Python) all mixed into a single file, making it easy to see and understand. That is, Instead of just writing programming code in one tool and the descriptions or explanations in another file or a textbook, it blends them together sequentially.\n", "
\n", "Also, Jupyter lets you type that computing code into boxes (called \"cells\") and run each part separately. \n", "
\n", @@ -84,17 +84,19 @@ "![image.png](attachment:90fea28a-e4ae-4a89-a13a-280dbd0819fb.png)\n", "\n", "
\n", - "The top line is clearly text-based (the tool for that in Jupyter is called \"Markdown\")\n", + "The top line is text-based (the tool for that in Jupyter is called \"Markdown\")\n", "\n", "The next cell below is a **code cell** that has in it: \n", + "```\n", "#this is a code cell\n", "print(\"This is the output from a code cell\")\n", - "
\n", - "Finally, the bottom material is not in a cell but is the output (This is the output from a code cell)\n", - "
\n", - "The kind of code it is able to run is **Python**. If you look at the top right, you can see that this Jupyter Notebook is running Python 3 (Python language version 3) in the code cells. \n", + "```\n", + "Below this cell, the output redered by running the cell can be found. \n", + "\n", + "The code cells are able to run Python code. If you look at the top right, you can see that this Jupyter Notebook is running Python 3 (Python language version 3) in the code cells. \n", "\n", "In the above image the code in the cells has already been run (Markdown is also a kind of code that renders the text in some format, so we \"run\" that too) Take a look at the same notebook before the two cells were executed:\n", + "\n", "![image.png](attachment:cc6d0953-136b-4038-a6fb-0992b25aec95.png)\n", "\n" ] @@ -107,7 +109,7 @@ "\n", "Jupyter Notebooks are useful because:\n", "\n", - "1. They are easy to Use – You don’t need to run an entire program at once. You can run small pieces of code step by step, see what happens, and fix mistakes as you go.\n", + "1. They are easy to use – You don’t need to run an entire program at once. You can run small pieces of code step by step, see what happens, and fix mistakes as you go.\n", "2. You can take notes while you code – Instead of keeping your notes in a separate document, you can write explanations right next to your code to make it easier to understand later. In this module, it means that notes can be given to you to describe the code.\n", "3. They help you to see your results clearly & immediately – If your code creates a table, chart, or graph, Jupyter Notebook will show it right inside the document.\n", "4. It's great for learning and sharing – You can save your notebook and send it to someone else so they can see your work and try it themselves.\n", @@ -133,7 +135,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To run a single code cell in Azure:\n", + "To **run** a single code cell in Azure:\n", "\n", "- Click inside the cell to select it.\n", "- Click the Run button (right-pointing triangle for 'play' in the toolbar)\n", @@ -186,7 +188,7 @@ "source": [ "# Viewing a Jupyter Notebook in Azure\n", "\n", - "To use a notebook, you'll need to OPEN a notebook. In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. IN the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", + "To use a notebook, you'll need to OPEN a notebook. In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. In the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", "\n", "![opening_notebook.png](./images/opening_notebook.png)" ] @@ -220,7 +222,7 @@ "\n", "# Adding code or markdown boxes\n", "\n", - "You can create a code box or a text (Markdown) box very easily.\n", + "You can create a code box or a text (markdown) box very easily.\n", "
\n", "In Azure, to add another box hover over the space above the left side of a current box, and the following options will appear:\n", "\n", @@ -247,13 +249,6 @@ "## Clean up\n", " In the main tutorials, you'll be reminded here to \"shut down your compute instance.\" Check out the Azure tutorial for more explaination." ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -272,7 +267,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule 0/Submodule_0_Tutorial_3_AzureML.ipynb b/Submodule 0/Submodule_0_Tutorial_3_AzureML.ipynb index 543c40f..b01a502 100755 --- a/Submodule 0/Submodule_0_Tutorial_3_AzureML.ipynb +++ b/Submodule 0/Submodule_0_Tutorial_3_AzureML.ipynb @@ -14,7 +14,7 @@ "metadata": {}, "source": [ "## Overview\n", - "This tutorial is intended to get you started on Azure ML with a \"compute instance.\"\n", + "This tutorial is intended to get you started on Azure ML with a **compute instance.**\n", "\n", "The process is not (novice) user-friendly *the first time.* You will have to set up a few things (accounts, subscriptions, workspaces) but these will be your defaults after the first time. It will thus be really easy to go back to or to use AzureML for other cloud computing modules provided at the NIGMS Sandbox. \n", "\n", @@ -94,7 +94,7 @@ "Cost Details:\n", "- Azure will provide the first $200 worth of charges, which is an enormous amount of computing if you are just learning and running notebooks\n", "- The cost is low (~ 15cents/hour for the smallest virtual computer)\n", - "- You will need a credit card, so they could charge you for use of computingafter the trial period has expired.\n", + "- You will need a credit card, so they could charge you for use of computing after the trial period has expired.\n", "\n", "### To create the subscription\n", "To create an Azure Machine Learning (AzureML) subscription where you can run the Jupyter Notebook tutorials, you need to first create a regular Azure subscription if you don't already have one. \n", @@ -117,9 +117,7 @@ "|**Student (Azure for Students)**| **Free $100 credit (no credit card needed) +free services**|**Verified students (with .edu email)**|\n", "|NIH Subscription|For CloudLab|See below|\n", "\n", - "4. Provide a credit card for billing that subscription, if applicable\n", - "\n", - "-------------------------------------------------------------------------------------" + "4. Provide a credit card for billing that subscription, if applicable.\n" ] }, { @@ -148,7 +146,7 @@ "source": [ "# Step 3: Create a workspace\n", "\n", - "AzureML requires that you do all of your cloud computing in a \"workspace. They imagine that you might have several distinct projects. You *can* run all of your NIH tutorials in a single workspace.\n", + "AzureML requires that you do all of your cloud computing in a workspace. They imagine that you might have several distinct projects. You *can* run all of your NIH tutorials in a single workspace.\n", "\n", "To create your workspace, select this button from the home screen of a different part of Azure: [Azure ML](https://ml.azure.com/)\n", "\n", @@ -200,7 +198,7 @@ "source": [ "## Step 4: Open a Jupyter notebook\n", "\n", - "In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. IN the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", + "In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. In the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", "\n", "![opening_notebook.png](./images/opening_notebook.png)\n", "\n", @@ -277,8 +275,7 @@ "metadata": {}, "source": [ "## Clean up\n", - "
Attention: To avoid unnecessary charges, please STOP your compute instance if you started one.
\n", - "(you did not NEED a compute instance to run anything on this page)" + "
Attention: To avoid unnecessary charges, please STOP your compute instance if you started one.
\n" ] } ], @@ -298,7 +295,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule 0/Submodule_0_Tutorial_3b_AzureML_CloudLab.ipynb b/Submodule 0/Submodule_0_Tutorial_3b_AzureML_CloudLab.ipynb index 3e87a2a..fc3b400 100755 --- a/Submodule 0/Submodule_0_Tutorial_3b_AzureML_CloudLab.ipynb +++ b/Submodule 0/Submodule_0_Tutorial_3b_AzureML_CloudLab.ipynb @@ -48,7 +48,7 @@ "source": [ "# Step 2: Using Azure\n", "\n", - "You should be able to return to the [AzureML module](Submodule_0_Tutoral_3_AzureML.ipynb), starting at step 3, to make a workspace and use your NIH subscription. The latter is what is paying for your cloud *computing* so you must have a subsription to select. \n" + "You should be able to return to the [AzureML module](Submodule_0_Tutoral_3_AzureML.ipynb), starting at step 3, to make a workspace and use your NIH subscription. The latter is what is paying for your cloud computing so you must have a subsription to select. \n" ] }, { @@ -57,8 +57,16 @@ "metadata": {}, "source": [ "# Conclusion\n", - "This mini-tutorial was designed to direct you to the NIH CloudLab information. You do not have to use CloudLab; you can use pay-as-you-go on Azure and other Cloud Computing platforms. Regardless of what tool you use, be sure to **always turn off the computer (\"compute instance\")** when you leave. Even tens-of-cents an hour can add up if you forget it's running." + "This mini-tutorial was designed to direct you to the NIH CloudLab information. You do not have to use CloudLab; you can use pay-as-you-go on Azure and other cloud Ccmputing platforms. Regardless of what tool you use, be sure to **always turn off the computer (\"compute instance\")** when you leave. Even tens-of-cents an hour can add up if you forget it's running." ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3a43538-9d16-47b0-9bbb-855675d125cb", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -77,7 +85,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule 0/Submodule_0_Tutorial_4_GitHub4You.md b/Submodule 0/Submodule_0_Tutorial_4_GitHub4You.md index 5106ce4..01e2982 100755 --- a/Submodule 0/Submodule_0_Tutorial_4_GitHub4You.md +++ b/Submodule 0/Submodule_0_Tutorial_4_GitHub4You.md @@ -33,8 +33,6 @@ By the end of this lesson, you will be able to: ## Prerequisites None -------------------------------------------- - # FAIR Data principles You may already have seen that the NIH requires researchers to share their data in ways that make it FAIR to maximize its value. Ensuring data is well-documented, openly available, and in standardized formats not only enhances transparency and collaboration but also aligns with NIH’s commitment to advancing scientific discovery. @@ -119,9 +117,9 @@ Before you can start using GitHub for your materials, you need to create an acco To get started, you need to sign up for a free GitHub account. This will give you access to your own profile, repositories, and collaboration tools. Follow the steps below to create your GitHub account. - Go to GitHub's website -- Click on Sign up in the top-right corner. +- Click on 'Sign up' in the top-right corner. - Enter your email address, username, and password. -- Click Create an account and follow the instructions. +- Click 'Create an account' and follow the instructions. - GitHub will send a verification email. Click the link in the email to verify your account.

@@ -156,12 +154,11 @@ A repository (A "repo") is like a folder where you store your research data and ### Instructions 1. Open GitHub Desktop and click “File” → “New Repository”. - ![NewRepository](./images/github_new_repository.png) 2. Give your repository a name (e.g., "Climate_Data_Study_2024"). 3. Choose a location **on your computer** where the repository will be stored. -4. Select Private (if you are using it for your lab group). You can name "collaborators" later (students, postdocs, etc) -5. Check “Initialize this repository with a README” (important for documenting your dataset). This is the appropriate spot to include summary information about this particular repository's purpose +4. Select 'Private' (if you are using it for your lab group). You can name **collaborators** later (students, postdocs, etc). +5. Check “Initialize this repository with a README” (important for documenting your dataset). This is the appropriate spot to include summary information about this particular repository's purpose. 6. Click Create Repository.

@@ -201,8 +198,8 @@ Once your repository is set up, you can start adding data files like Excel, CSV, ![CommitMessage](./images/commit_msg.png) -5. Click the bottom "Commit to _____" button (this saves the version to your local repository). -6. Click Push to Origin (this uploads your data to GitHub.com). +5. Click the bottom 'Commit to _____' button (this saves the version to your local repository). +6. Click 'Push to Origin' (this uploads your data to GitHub.com). ![PushImage](./images/push_origin.png) @@ -227,7 +224,7 @@ Using GitHub Desktop, you can track protocol changes alongside your datasets. 2. Edit or add a new protocol document (e.g., data_collection_protocol_v2.docx). 3. Open GitHub Desktop, and you’ll see the updated file. 4. Write a commit message (e.g., "Updated protocol to include new sensor calibration process") as above for data -5. Click Commit to main, then Push to Origin. +5. Click 'Commit' to main, then 'Push to Origin'. Now, every protocol update is documented and timestamped, ensuring full transparency. diff --git a/Submodule 0/Submodule_0_Tutorial_5_ManagingGit.md b/Submodule 0/Submodule_0_Tutorial_5_ManagingGit.md index 088edcd..1b4822e 100755 --- a/Submodule 0/Submodule_0_Tutorial_5_ManagingGit.md +++ b/Submodule 0/Submodule_0_Tutorial_5_ManagingGit.md @@ -4,7 +4,7 @@ This tutorial helps research PIs and project leads set up GitHub to manage lab data with clarity and control. You'll learn how to protect the main branch, require review of changes, and maintain traceability across your team’s contributions. ## Learning Objectives -In this tutorial, you will strengthen your abilities to: +In this tutorial, you will strengthen your ability to: - Explain the risks of uncontrolled data changes in research labs - Define key GitHub terms like commits, branches, pull requests, and main - Set up branch protection to safeguard official data and protocols @@ -13,7 +13,7 @@ In this tutorial, you will strengthen your abilities to: - Apply Git/GitHub tools to support data integrity and FAIR principles ## Prerequisites -Please complete tutorial 4 before tutorial 5. +Please complete Tutorial 4 before Tutorial 5. -------------------------------------------------------------- ## Why use Git for your research lab team *DATA?* @@ -105,7 +105,7 @@ main (or master, depending on your repo) ✅ Restrict who can push to matching branches (You can list yourself or other senior members who are allowed to approve changes) -Click Create or Save changes. +Click 'Create' or 'Save' changes. 👥 What This Looks Like for Your Collaborators Now, your students and research assistants won’t be able to push changes directly to the official version. Instead, they will: @@ -133,7 +133,7 @@ As the lab PI, you now have: ## Conclusion -You should now be able to use Github and the underlying tool of Git to keep track of and protect your data. However, it is not yet FAIR data because you need a fixed identifier for a set of data (even if you later update it) to inlcude with your journal articles. +You should now be able to use Github and the underlying tool of Git to keep track of and protect your data. However, it is not yet FAIR data because you need a fixed identifier for a set of data (even if you later update it) to include with your journal articles. For that information, view the [last tutorial on Git](Submodule_0_Tutorial_6_DOI.md) in this submodule. From 3c1413c738b39c308e84d7fd6f1bae3bcde20420 Mon Sep 17 00:00:00 2001 From: RamiyapriyaS-NIH Date: Mon, 9 Jun 2025 13:33:13 +0000 Subject: [PATCH 02/10] Updating typos --- ...Tutorial_1_GithubDownload-checkpoint.ipynb | 265 +++++++++++++++ ...torial_2_JupyterNotebooks-checkpoint.ipynb | 280 ++++++++++++++++ ...dule_0_Tutorial_3_AzureML-checkpoint.ipynb | 303 ++++++++++++++++++ ...orial_3b_AzureML_CloudLab-checkpoint.ipynb | 85 +++++ ...dule_0_Tutorial_4_GitHub4You-checkpoint.md | 273 ++++++++++++++++ ...ule_0_Tutorial_5_ManagingGit-checkpoint.md | 139 ++++++++ .../Submodule_0_Tutorial_6_DOI-checkpoint.md | 82 +++++ .../GitHub_First_View-checkpoint.png | Bin 0 -> 205171 bytes 8 files changed, 1427 insertions(+) create mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb create mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb create mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb create mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb create mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md create mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md create mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md create mode 100755 Submodule 0/images/.ipynb_checkpoints/GitHub_First_View-checkpoint.png diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb new file mode 100755 index 0000000..3313e26 --- /dev/null +++ b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial 1: How to download a Tutorial from the NIH Sandbox\n", + "--------------------------------------------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "Congratulations! You have decided to make use of the fantastic NIH tutorials that are stored in the NIGMS Sandbox at the site called Github.\n", + "\n", + "To use these resources, you need to understand a little about \"where\" these files are and how to save them in a way that will let you use them to learn about the technique. \n", + "\n", + "The intent of this tutorial is to make sure you have clear instructions (with pictures) that will work for the most novice user." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Learning Objectives\n", + "+ Navigate the Github sandbox to find a tutorial\n", + "+ Find & read the \"readme\" file\n", + "+ Download a tutorial\n", + "+ Have a preliminary understanding of Github" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "- Knowledge of file saving & retrieving\n", + "- An internet connection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get Started\n", + "Make sure that you are connected to the internet\n", + "\n", + "-------------------------------------------------------------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 1: Get to the NIGMS \"Sandbox\" & overview" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Background\n", + "In technology and software development, a \"sandbox\" is a place to \"play,\" trying out new ideas or collaborating. \n", + "\n", + "The National Institute of General Medical Sciences (NIGMS) is one of the NIH Institutes. That institute sponsored the development of many short courses (modules) to help biomedical researchers learn some of the techniques that can take advantage of the powerful options of \"cloud computing.\"\n", + "\n", + "You are likely familiar with cloud data storage, for example with your files saved on OneDrive (Microsoft) or Google Drive (Google). Cloud *computing* takes that a step farther and carries out data processing and runs programs on computers that are located in some distant site. \n", + "\n", + "The advantage of \"cloud computing\" is that the computational speed and power is not limited by what you have in *your* desktop or laptop. Rather, cloud computers are very FAST computers with substantially more memory (to work on big biological data sets). Additionally, the providers of cloud computing can make more (or fewer) processors available to your job, depending on the need. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What you see when you arrive at the \"Sandbox\"\n", + "It is possible that you are reading this file having already navigated to the \"Sandbox.\" \n", + "\n", + "The [Sandbox](https://github.com/NIGMS/NIGMS-Sandbox) is housed at github.com. Github is a collaboration tool/website/repository that is being used by NIGMS as a great way to share materials.\n", + "\n", + "BUT, what you see when you get to github is NOT what a novice in cloud-computing-user might expect. It looks something like this picture below. It is certainly **overly complicated** for a novice because Github is not designed with novices in mind. Thus, EVERY Github site (or \"repository\" of materials) looks basically the same. It shows a lot of needed tools and a list of the folders in the repository. \n", + "\n", + "**The key point:** scroll down ON THAT PAGE to see the nice description and information you want about the repository. It is information in the \"readme\" file that is displayed for you. It is just very unfortunate that unless you know to scroll past the folder structure, you start with a mysterious interface.\n", + "![Github_splash.png](./images/Github_First_View.png)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 2: Choose a course (module) to use\n", + "If you have scrolled down on the Sandbox readme page, you have encountered the list of available courses (\"modules\") that you might want to use to learn a technique. \n", + "\n", + "Or, perhaps you are going to use more of this module (Introduction to Github and Python for Bioinformatics). \n", + "\n", + "You should click on the link to that module from the list. It will take you to another Github Repository. Of course, the interfaces will also start with the file structure as all Github repositories look the same. These Modules typically contain a Readme.md file that explains the structure & contents of the overall tutorial module. Inside of each Module are folders (\"Submodules\") that contain the lessons in the form of Jupyter Notebooks (next lesson in this list)\n", + "\n", + "

Attention: Please go to that module in another tab on your browser before following the next set of directions.
\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 3: Two ways to make a copy of the Github Repository\n", + "\n", + "Unlike just reading a web page as you are doing now, the Sandbox tools are all constructed as special kinds of pages (\"Jupyter notebooks\") that combine text with interactive boxes where you will be able to write and use computer code to carry out bioinformatics functions.\n", + "
\n", + "So, in order to use the contents of any of the learning modules in the Sandbox, you need to copy them to a \"virtual machine\" (like moving to the hard drive of a computer running in GCP, Azure, or AWS). Github is quite prepared for this, in fact, it is one key purpose of the NIGMS using Github as a place for you to collect the materials.\n", + "
\n", + "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the #option# to download or to copy.\n", + "
\n", + "![<> CODE button](./images/Code_button.png)\n", + "
\n", + "\n", + "There are two main ways to clone (that is, make a copy) of this material. The most efficient way to accomplish this is to clone the whole collection directly from cloud storage to cloud storage. For large files, this makes the most sense. \n", + "
\n", + "The more familiar brute-force way is to download a copy of the repository to your computer's hard drive, then upload it again to the cloud. \n", + "
\n", + "Both options are described below.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Elegant Version: Clone into a Virtual Machine\n", + "\n", + "This method requires that you already have a cloud computing instance (what a virtual computer is called) up and running. You can see how to get that started in [Microsoft Azure](Submodule_0_Tutorial_3_AzureML.ipynb )\n", + "\n", + "### Open a terminal\n", + "In the Notebooks portion of the Workspace, you need to open up a command line terminal. \n", + "
\n", + "![where to find the terminal button](./images/Azure_terminal.png)\n", + "\n", + "After you are in the terminal view, you'll need to turn on the computer instance with the `play` button on the top menu. \n", + "
\n", + "![start button](./images/startCompute.png)\n", + "\n", + "That button could be found in somewhat different places, depending on how collapsed the terminal window is. For example:\n", + "
\n", + "![start button2](./images/StartComputeCollapsed.png)\n", + "
\n", + "It is the same `play` button. If you want to make the terminal bigger, click on the << button (yellow arrow).\n", + "\n", + "### Clone in the repository\n", + "\n", + "It is very easy to clone a public repository into the terminal with `git clone`. You need the web address for the Module:\n", + "
\n", + "![clone URL](./images/githubURL.png)\n", + "
\n", + "1. Click on the copy button next to the URL.\n", + "2. Go to the Azure terminal\n", + "3. type: git clone *then paste the url you copied*\n", + "\n", + "
\n", + "The whole set of folders and proper file structure will instantly be in your notebook list.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "## Familiar, inelegant version: Downloading the contents of the repository then uploading\n", + "\n", + "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the #option# to download or to copy.\n", + "
\n", + "![<> CODE button](./images/Code_button.png)\n", + "\n", + "
\n", + "The menu you will see has the more elegant options, and also the button to download a zipped version:\n", + "
\n", + "\n", + "![Github Download Code Menu](./images/Download_zip.png)\n", + "\n", + "# \"Unzipping\" your folder\n", + "\n", + "The folder of materials does not download in a ready-to-use format. It is compressed (\"zipped\") so it needs to be extracted| into its full form before you upload it to use as a tutorial.\n", + "\n", + "**To unzip a file on Windows:**\n", + "\n", + "1. Locate the zip file (it's probably in \"downloads\" but you can look at this button near the top right of Chrome, for example, to see where it downloaded)\n", + "2. Once you find the zipped folder, right-click on the zip file\n", + "3. Select \"Extract All\": From the context menu, which should look something like this on the menu bar:\n", + "
\n", + "\n", + "![Unzip](./images/extractAll.png)\n", + "\n", + "
\n", + "4. Choose the destination folder where you want to extract the folder. (it is fine to extract them in the same folder the file is already)\n", + "5. Click \"Extract\" to start the unzipping process. \n", + "\n", + "
\n", + "\n", + "**To unzip a file on a Mac:**\n", + "\n", + "
\n", + "1. Double-click the zipped file\n", + "2. The file will automatically decompress and a new folder will appear in the same location as the zipped file. \n", + "
\n", + "You should now be ready to upload those files to run the lessons in Azure. \n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Conclusion\n", + "If you have followed these steps, you should now have a copy of the lessons module on your local computer or already cloned into Azure. \n", + "\n", + "To learn how to use these lessons in a cloud computer at Amazon (AWS), [Google Cloud Computing (GCP)](https://github.com/STRIDES/NIHCloudLabGCP/blob/main/docs/vertexai.md), or Microsoft's Azure ([Azure ML](./Module_0_Tutorial_3_AzureML.ipynb)) you can use one of the linked tutorials. \n", + "\n", + "Or, if you want to learn more about how to use [Jupyter Notebooks](./Submodule_0_Tutorial_2_JupyterNotebooks.ipynb)\n", + "\n", + "For the \"Intro to Github and Python for Bioinformatics\" module, we provide information for those using [Azure](./Submodule_0_Tutorial_2_AzureML.ipynb) and have tested to make sure that all the materials work as expected on Azure. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clean up\n", + "On most Jupyter notebooks in these modules you will see directions here to \"stop your compute instance\" (we'll explain later). But, since this is just a web page, you are done. \n", + "\n", + "Good work & we hope you enjoy learning these powerful techniques for bioinformatics!\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_python3", + "language": "python", + "name": "conda_python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.16" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb new file mode 100755 index 0000000..80d3fac --- /dev/null +++ b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb @@ -0,0 +1,280 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Overview\n", + "You are already looking at a Jupyter Notebook, but **what is it? What's it for?** \n", + "\n", + "This tutorial will help you to be ready for all the other tutorials in this module. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jupyter Notebooks\n", + "--------------------------------------------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Learning Objectives\n", + "**After this module, you will be able to:**\n", + "+ Define what a Jupyter notebook is and explain its purpose\n", + "+ Navigate the Jupyter interface\n", + " - Differentiate between code cells and Markdown (text) cells\n", + " - Execute cells individually\n", + " - Use the toolbar & menus\n", + "+ See how to write and execute code within Jupyter Notebooks (but you can't do that yet)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "- You only need to know how to read\n", + "- if you would like to make your own notebook to play with, you can use [Google Colab](https://colab.research.google.com/)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction to Jupyter Notebooks\n", + "\n", + "**What is a Jupyter Notebook?**\n", + "\n", + "It is a tool that lets you write text and run computer code (typically R or Python) all mixed into a single file, making it easy to see and understand. That is, Instead of just writing programming code in one tool and the descriptions or explanations in another file or a textbook, it blends them together sequentially.\n", + "
\n", + "Also, Jupyter lets you type that computing code into boxes (called \"cells\") and run each part separately. \n", + "
\n", + "As it turns out, **this page** was written as a Jupyter Notebook but as the user, you only see it as a web page. Since it doesn't have any code (yet) to run, it basically *is* a web page.\n", + "
\n", + "BUT, when you look at a Jupyter notebook in the right kind of interface, the user can edit the text not just view it.\n", + "
\n", + "**and that user can change the code and run it!**\n", + "\n", + "The top line is clearly text-based (the tool for that in Jupyter is called \"Markdown\")\n", + "\n", + "The next cell below is a **code cell** that has in it: \n", + "#this is a code cell\n", + "print(\"This is the output from a code cell\")\n", + "
\n", + "Finally, the bottom material is not in a cell but is the output (This is the output from a code cell)\n", + "
\n", + "The kind of code it is able to run is **Python**. If you look at the top right, you can see that this Jupyter Notebook is running Python 3 (Python language version 3) in the code cells. \n", + "\n", + "In the above image the code in the cells has already been run (Markdown is also a kind of code that renders the text in some format, so we \"run\" that too) Take a look at the same notebook before the two cells were executed:\n", + "![image.png](attachment:cc6d0953-136b-4038-a6fb-0992b25aec95.png)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Why Use Jupyter for Coding and Data Science?\n", + "\n", + "Jupyter Notebooks are useful because:\n", + "\n", + "1. They are easy to Use – You don’t need to run an entire program at once. You can run small pieces of code step by step, see what happens, and fix mistakes as you go.\n", + "2. You can take notes while you code – Instead of keeping your notes in a separate document, you can write explanations right next to your code to make it easier to understand later. In this module, it means that notes can be given to you to describe the code.\n", + "3. They help you to see your results clearly & immediately – If your code creates a table, chart, or graph, Jupyter Notebook will show it right inside the document.\n", + "4. It's great for learning and sharing – You can save your notebook and send it to someone else so they can see your work and try it themselves.\n", + "\n", + "That is, Jupyter Notebooks are especially useful for students, researchers, and anyone working with data because it helps break things into small, easy-to-understand steps.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Running Code in Jupyter Notebooks\n", + "\n", + "In Jupyter Notebook, you can run little bits of Python in code cells to \"execute the code\" inside them. Here’s how to run a code cell and manage the output:" + ] + }, + { + "attachments": { + "4dc097e1-dbaf-452d-951f-6917b20d0bb9.png": { + "image/png": "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FwRB8GFE5AVBEHwYEXkf58iRIyhWrBiefPJJK8Y98+bNQ+bMmTF27FgrJmNx8eJFNGrUSJ0Tzy2xuIxGSq9DcnnvvffUcD1eNw3nGcd1ScE0YWFhWLNmjRXjOVJyHEL6ISLvBv3D5I1qDzly5MDrr7+O8+fPWykFQRAyJiLyyaB48eLo2rWrCs888wxy5cqFkSNHKuvx+PHjVqpbR0xMDN5//300aNAgzZZs69atERUVhR49elgxgiB4MyLyyYDi+fnnn6swceJEbN++HcOHD8e6devwww8/WKluHXzKeMGCBdi/f78VIwiC4EBEPhXwkeYnnngChQoVwj///GPFCoIgZDxE5FMJhZ7BjrvONVfrdIchw9GjR/HGG2+oTk/6/VmBfP/99wneG+QKdmrx5UnLli3DgQMHULBgQbW9q2PgPuhyCgoKUmkqV66strOTWGfZ7t270aFDh/htw8PD0bdvX9WKSAqewx9//IH69eurMtPbjxgxwkrhIDIyMsHxse+Dbqjo6GgrhWdgfuPHj1duOO6HwV1ZcLpixQrceeedapnn8Mgjj6jydCY2NhbfffddfN5M26VLlxS70djfw36ffPnyxR8jW5Q7duywUngWXqMlS5aoctDH3bJlS5f74zmyBcv3U9mPbcuWLVaKpNHXmveB3l/Dhg3x77//WimArVu3Ktfo008/fcPv4JVXXlG/FWcja+7cuSqv3377zYoRRORTyalTp9QPkS8uSisUSvrAV69ercRnyJAhqgLo2LFjkjdrmzZt8O2336JcuXLInj27cin9+OOPeOmll6wUDni8bH3QpfP111+je/fu6gf8wAMPKLeTO7i+Zs2a+PvvvzFw4EBMmTIF999/P9auXav6A9xx7do19OnTR/2AKYpjxoxRIkjh4zFpeFyNGzfGnDlzMGDAALWPJk2aqIrk1VdfVfl4ig8//FCJRK1atdR+xo0bp44lsbKgwD/11FO45557VPp7771XiRxFyl4B8Ri7deumrhsrqC+//FJdT17Xhx9+GCdPnrRSJg2vD8uqbdu2qrwGDRqkRsBwmQLpaWhQsBJnmevrs2jRItx1110JyoRiO2rUKDz66KMoUaKEKo9hw4ap61evXj11jyQFK9MqVapg6tSpePbZZ9X92rt3b6xfv17t76efflLpihQpotJt2rQJZ8+eVXGE5bh48WJV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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run a single code cell in Azure:\n", + "\n", + "- Click inside the cell to select it.\n", + "- Click the Run button (right-pointing triangle for 'play' in the toolbar)\n", + "\n", + "![image.png](attachment:4dc097e1-dbaf-452d-951f-6917b20d0bb9.png)\n", + "\n", + "The code will execute, and any output (like text, numbers, or graphs) will appear below the cell.\n", + "\n", + "👉 Tip: If a cell has been run, a number appears next to it, like this: [1]. This means it was the first cell run in this session." + ] + }, + { + "attachments": { + "adda38fc-7e85-4e83-a1ed-60dff732a84e.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run the **whole** notebook (all the code cells in a single page, a \"notebook\"):\n", + "\n", + "![image.png](attachment:adda38fc-7e85-4e83-a1ed-60dff732a84e.png)\n", + "\n", + "--------------------------------------------" + ] + }, + { + "attachments": { + "e4215b07-982a-4b44-961f-c7d2c495d363.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Erasing code that has already been run in Jupyter Notebooks\n", + "\n", + "You can also erase all or some of the cell outputs.\n", + "\n", + "![image.png](attachment:e4215b07-982a-4b44-961f-c7d2c495d363.png)\n", + "\n", + "-------------------------------------------------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Viewing a Jupyter Notebook in Azure\n", + "\n", + "To use a notebook, you'll need to OPEN a notebook. In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. IN the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", + "\n", + "![opening_notebook.png](./images/opening_notebook.png)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How should you use Jupyter Notebooks from the Sandbox tutorials?\n", + "\n", + "While there will surely be sets of directions unique to each tutorial, they are written in a similar fashion.\n", + "1. A title, overview, learning objectives, and pre-requisites for the submodule or the specific Jupyter notebook.\n", + "2. A \"Getting Started\" list, for how to work on the specific notebook\n", + "\n", + "So, do read through that initial material. It may look similar from notebook to notebook, yet have unique and VERY helpful information.\n", + "\n", + "Often, the **first code box** in the tutorial will be one that you should \"run\" because it will have many pieces of code that will be necessary for that particular page, or at least the code boxes on that page, to function as the author intended. \n" + ] + }, + { + "attachments": { + "3eced4ba-4bf4-4f9a-8ad1-35129c2b1118.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Adding code or markdown boxes\n", + "\n", + "You can create a code box or a text (Markdown) box very easily.\n", + "
\n", + "In Azure, to add another box hover over the space above the left side of a current box, and the following options will appear:\n", + "\n", + "![image.png](attachment:3eced4ba-4bf4-4f9a-8ad1-35129c2b1118.png)\n", + "
\n", + "Simply click on one or the other." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "After this module, you should have a stronger understanding of what the Jupyter Notebook is and does for you. You are ready to use these notebooks to run code in the tool of your choice.\n", + "\n", + "The next tutorial shows you how to use Microsoft's Azure ([Azure ML](./Module_0_Tutorial_3_AzureML.ipynb)) for cloud computing." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clean up\n", + " In the main tutorials, you'll be reminded here to \"shut down your compute instance.\" Check out the Azure tutorial for more explaination." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb new file mode 100755 index 0000000..b01a502 --- /dev/null +++ b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb @@ -0,0 +1,303 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Submodule 0 Tutorial 3: Notebooks in Azure ML\n", + "------------------------------------------------------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "This tutorial is intended to get you started on Azure ML with a **compute instance.**\n", + "\n", + "The process is not (novice) user-friendly *the first time.* You will have to set up a few things (accounts, subscriptions, workspaces) but these will be your defaults after the first time. It will thus be really easy to go back to or to use AzureML for other cloud computing modules provided at the NIGMS Sandbox. \n", + "\n", + "The steps below for setup might take 10-15min. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Learning Objectives\n", + "After this tutorial, you should be able to:\n", + "1. Understand what Azure is\n", + "2. Create an Azure account\n", + "3. Create a subscription\n", + "4. Create a workspace\n", + "5. Import Jupyter notebooks to Azure ML\n", + "6. Start & Stop a compute instance" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "You will need to know your Microsoft account login information, if you already have one\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Background: What are Azure and AzureML?\n", + "\n", + "Microsoft Azure is a platform that lets you use remote computers (\"the cloud\") to run programs and store data without needing the physical hardware. Azure can provice a virtual environment where you can run Jupyter Notebooks, Python or R programs, or other tools.\n", + "\n", + "Azure \"Machine Learning\" (ml.azure.com) is a service within Azure that makes it easy to set up and manage Jupyter notebooks in the cloud. It’s useful if you need to run data analysis or machine learning experiments on more powerful machines than your local computer. You can choose different numbers of virtual \"cores\" (the numbers of parallel computers processing your program) depending on your needs. \n", + "\n", + "The remote computers are secure and cost a nominal amount to use. \n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 1: Create a Microsoft Azure account\n", + "\n", + "You need to make an [Azure account](https://azure.microsoft.com/en-us/pricing/purchase-options/azure-account/).\n", + "\n", + "The tutorials offered at the NIGMS Sandbox are all short enough (computing time, your time) that you should be able to use only the free tier of an Azure account.\n", + "\n", + "![free_azure.png](./images/free_azure.png)\n", + "\n", + "After selecting the free account button, Microsoft will take you to your login (if you already use a Microsoft account). If you do not have an account with them, you can make one (or sign in at this menu)\n", + "\n", + "![azure_signin.png](./images/azure_signin.png)\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 2: Set up your subscription, if not provided by your University or the NIH\n", + "You need a subscription to use Azure computing (required for running Python or R code). If not provided for you through your organization or the NIH, this is probably the most complicated step. \n", + "\n", + "The process assumes that you are creating an account for a long-term relationship with a substantial budget. Generally, you can accept the default information.\n", + "\n", + "Cost Details:\n", + "- Azure will provide the first $200 worth of charges, which is an enormous amount of computing if you are just learning and running notebooks\n", + "- The cost is low (~ 15cents/hour for the smallest virtual computer)\n", + "- You will need a credit card, so they could charge you for use of computing after the trial period has expired.\n", + "\n", + "### To create the subscription\n", + "To create an Azure Machine Learning (AzureML) subscription where you can run the Jupyter Notebook tutorials, you need to first create a regular Azure subscription if you don't already have one. \n", + "\n", + "1. Select the subscription icon\n", + "\n", + "![azure_services.png](./images/azure_services.png)\n", + "\n", + "2. In the new page, select add (to create a new subscription)\n", + "\n", + "![add_subscription.png](./images/add_subscription.png)\n", + "\n", + "3. Choose Your First Subscription Type\n", + "You will likely be offered one of the following options (see table). The student account, if applicable, is ideal because the $100 credit does not have a time limit. \n", + "\n", + "|Subscrption Type | Description | Recommended for |\n", + "|:---------------|:----------------------|:------------------------|\n", + "|Free Trial|200 credit for 30 days |First-time users & experimentation |\n", + "|Pay-As-You-Go |Pay only for what you use, no upfront cost |Faculty or staff|\n", + "|**Student (Azure for Students)**| **Free $100 credit (no credit card needed) +free services**|**Verified students (with .edu email)**|\n", + "|NIH Subscription|For CloudLab|See below|\n", + "\n", + "4. Provide a credit card for billing that subscription, if applicable.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2b: If you have an NIH-provided subscription\n", + "\n", + "It is hard to predict exactly what might happen when YOU log in. In order to switch to the NIH-cloudlab subscription, follow the following steps.\n", + "\n", + "1. In the upper right corner of the Azure Machine Learning Studio page is a button with your initials:\n", + "\n", + "![where2switch_subscription.png](./images/where2switch_subscription.png)\n", + "\n", + "2. The menu that will appear should give you the option to switch the account to an NIH CloudLab account:\n", + "\n", + "![switchSubscriptNIH.png](./images/switchSubscriptNIH.png)\n", + "\n", + "You will have to login again." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 3: Create a workspace\n", + "\n", + "AzureML requires that you do all of your cloud computing in a workspace. They imagine that you might have several distinct projects. You *can* run all of your NIH tutorials in a single workspace.\n", + "\n", + "To create your workspace, select this button from the home screen of a different part of Azure: [Azure ML](https://ml.azure.com/)\n", + "\n", + "![create_workspace_button.png](./images/create_workspace_button.png)\n", + "\n", + "It will open another menu where you need to provide an official name that is unique within your group (i.e., Tutorials). You do not have to make a \"friendly name\".\n", + "\n", + "The pull-down menu should have your subscription option.\n", + "![create_new_workspace.png](./images/create_new_workspace.png)\n", + "\n", + "Your [Azure ML](https://ml.azure.com/) (at ml.azure.com) will likely open directly to this when you return OR it will be the top option under the left menu option of \"Workspaces.\"\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 4: Loading the tutorial into in AzureML" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Notebooks\n", + "Azure uses their \"machine learning studio\" to view jupyter notebooks. \n", + "\n", + "1. Go to [ml.azure.com](http://ml.azure.com)\n", + "2. Select the notebook option (** if your system opens up with workspaces, click on a workspace & it will take you to this menu list)\n", + "\n", + "![notebooks.png](./images/notebooks.png)\n", + "\n", + "3. To add the tutorial folders/files, you should upload with this button (OR you can clone a repository with the \"elegant\" directions in [Github download tutorial 1](Submodule_0_Tutorial_1_GithubDownload.ipynb)\n", + "\n", + "![upload.png](./images/upload.png)\n", + "\n", + "With the + button, you can upload the zipped modules that you have downloaded from Github. The entire file structure will be reproduced in Azure notebooks when you upload the whole unzipped folder. \n", + "\n", + "![upload_folder.png](./images/upload_folder.png)\n", + "\n", + "
Attention: The Sandbox tutorials assume that you will have the folders that they provide. Hyperlinks usually refer to the folder, not to a web address. Please upload the whole tutorial folder.
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Open a Jupyter notebook\n", + "\n", + "In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. In the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", + "\n", + "![opening_notebook.png](./images/opening_notebook.png)\n", + "\n", + "NOTE: You cannot **run** any code boxes in the Jupyter notebook yet! If you click on the \"play\" arrows nothing will happen until you start a compute instance (see next box) \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 5: Start & Stop compute instances\n", + "While you can read a Jupyter notebook in AzureML, or even in github, you cannot run any of the Python code without \"computing.\" This takes additional resources so Azure makes you initiate a \"compute instance.\" (Some places on the NIGMS sandbox say \"spin up a compute instance\" but it really all just means \"start up\" or \"turn on\")\n", + "\n", + "This is a technical name for starting cloud workstation-- basically a computer operating through the internet.\n", + "\n", + "This is the thing for which Azure will charge you, so you start it and stop it as needed.\n", + "\n", + "For NIGMS Sandbox Notebooks, there are two main types of \"Kernels\": Python or R usually with a number for the version. \n", + "
\n", + "![List_of_kernels.png](./images/List_of_kernels.png)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## To START the compute instance\n", + "It is simple to start the compute instance. Above the notebook on the toolbar, there is a \"play\" button (right pointing triangle).\n", + "\n", + "![startCompute.png](./images/startCompute.png)\n", + "\n", + "\n", + "When you click on that, it will take 1-2 minutes for the cloud workstation to start up. During that time, you *can* run code boxes and the system will queue those boxes until the instance begins.\n", + "\n", + "
\n", + "TYPICALLY, the correct type of kernel will start up automatically with the next step. If it's Python, you should see the following banner in the upper right:\n", + "
\n", + "\n", + "![type_of_kernel.png](./images/type_of_kernel.png)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## To STOP the compute instance\n", + "When you have finished with the jupyter notebook, you should **stop** the compute instance because you are being charged for the whole time it is running, whether or not you are actively using the tool. \n", + "\n", + "To stop this, use the stop button that is in the same spot as the start (\"play\") arrow. It is a square in a circle on the toolbar.\n", + "\n", + "![stopCompute](./images/stopCompute.png)\n", + "\n", + "Sometimes a compute will start automatically, so it's important to check to make sure it is not \"playing\" when you don't want it to be.\n", + "\n", + "*Azure can be configured to stop the compute automatically after some time, but be sure to STOP at the end of your work time to avoid being charged per hour* " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "After this tutorial, you should have all you need to run the tutorials in AzureML.\n", + "\n", + "You can now:\n", + "+ learn how to [leverage Github for FAIR data practices](./Submodule_0_Tutorial_4_Github4You.md) in your research lab\n", + "+ Return to the folder list and proceed to Submodule 1\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clean up\n", + "
Attention: To avoid unnecessary charges, please STOP your compute instance if you started one.
\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb new file mode 100755 index 0000000..3e87a2a --- /dev/null +++ b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb @@ -0,0 +1,85 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f5e4cdce-9644-4d62-8181-e91e2e5bf8d4", + "metadata": {}, + "source": [ + "# Submodule 0, Tutorial 3b: Using your Cloud Credentials on AzureML\n", + "-----------------------------------------------------------" + ] + }, + { + "cell_type": "markdown", + "id": "3bf6db1e-62fc-4e4f-b090-2d0c4fb3efd3", + "metadata": {}, + "source": [ + "## Overview\n", + "This mini-tutorial is designed for those needing and using an NIH Cloud Lab assigned NIH Cloud Lab account on AzureML. NIH extramural researchers, including INBRE, can often obtain an account for cloud computing that will be managed by and paid for by the NIH.\n", + "\n", + "## Learning Objectives\n", + "\n", + "You should have signed up with or requested a CloudLab-paid account for Azure\n", + "\n", + "\n", + "## Prerequisites\n", + "\n", + "You need only know your university affiliation and your email.\n" + ] + }, + { + "cell_type": "markdown", + "id": "ba80c35a-c7d4-4d17-a661-1e89c7e73aa1", + "metadata": {}, + "source": [ + "# Step 1: Request an account\n", + "\n", + "Proceed to the registration form at the GitHub page for the [NIH cloud lab](https://github.com/STRIDES/NIHCloudLab/blob/main/SignUp/extramural_account_registration.md). Be sure to scroll down to see all the useful directions on that page.\n", + "\n", + "**Note:** They recommend using an incognito window (browser.) To make such a window on Google Chrome, click on the three dots in the upper right-hand corner of the Chrome window. A top option is \"New Incognito Window.\"\n", + "\n", + "You should be contacted with additional information after completing the registration form with one of their many options." + ] + }, + { + "cell_type": "markdown", + "id": "029c1d82-1eb6-4ea4-bf15-05f93efdf051", + "metadata": {}, + "source": [ + "# Step 2: Using Azure\n", + "\n", + "You should be able to return to the [AzureML module](Submodule_0_Tutoral_3_AzureML.ipynb), starting at step 3, to make a workspace and use your NIH subscription. The latter is what is paying for your cloud *computing* so you must have a subsription to select. \n" + ] + }, + { + "cell_type": "markdown", + "id": "89670a62-9271-4a91-868b-769247f5be86", + "metadata": {}, + "source": [ + "# Conclusion\n", + "This mini-tutorial was designed to direct you to the NIH CloudLab information. You do not have to use CloudLab; you can use pay-as-you-go on Azure and other Cloud Computing platforms. Regardless of what tool you use, be sure to **always turn off the computer (\"compute instance\")** when you leave. Even tens-of-cents an hour can add up if you forget it's running." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md new file mode 100755 index 0000000..5106ce4 --- /dev/null +++ b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md @@ -0,0 +1,273 @@ +# Tutorial 4: GitHub For YOUR purposes +---------------------------------------------------------- + +## Overview +Git is a powerful version control tool that helps track changes to your data files over time. While Git is traditionally used for computer code, it can be just as effective for managing structured data by recording each change, allowing you to compare versions and collaborate efficiently. + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 1 + +
+ Click above image to watch introductory video +

+ +

+ + NIH/NIGMS Sandbox Foundations of Python Video 12 + +
+ Click above image to watch introductory video +

+ + +## Learning Objectives +By the end of this lesson, you will be able to: +- Define FAIR data practices +- Understand the purpose of git tools +- Create a GitHub account +- Set up GitHub Desktop to track data files (Excel, CSV, etc.) +- Create your first repository +- Push data to GitHub (your first "commit") + +## Prerequisites +None + +------------------------------------------- + +# FAIR Data principles + +You may already have seen that the NIH requires researchers to share their data in ways that make it FAIR to maximize its value. Ensuring data is well-documented, openly available, and in standardized formats not only enhances transparency and collaboration but also aligns with NIH’s commitment to advancing scientific discovery. + +The FAIR data principles are: + +- Findable: Data should be assigned unique identifiers (e.g., DOIs) and be discoverable through metadata and search engines. +- Accessible: Data should be retrievable through standardized protocols, with clear terms on access (open or restricted). +- Interoperable: Data should use standardized formats and vocabularies to enable integration with other datasets. +- Reusable: Data should be well-documented with clear licensing to support reuse and replication in different contexts. + +## Why Research Labs Need Version Control for Data? +Research labs handle large datasets, evolving protocols, and multiple contributors over years. Without version control, it’s easy to: +- ❌ Lose track of previous datasets when files are updated. +- ❌ Overwrite important files when multiple people are working on them. +- ❌ Forget why a dataset changed, especially if students and researchers rotate over time. + +How can GitHub Desktop helps with these challenges in data management +- Automatic version history for all data files. +- Clear tracking of protocol changes in README files. +- Collaboration with multiple researchers while preventing data loss. +- Integration with automated checks for data integrity (e.g., missing values in CSVs). + +The key word: *AUTOMATICALLY* though we'll not get to THAT until the next tutorial. + +Version control tools like Git provide a structured way to track, manage, and document changes to data over time, ensuring that every update, correction, or modification is properly recorded. + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 2 + +
+ Click above image to watch introductory video +

+ + +### Why Version Control for Research Data? +
1️⃣ Ensuring Data Integrity Over Time +
+Many research projects span years and generate large datasets. +Without version control, researchers might accidentally overwrite or lose critical data. +Git keeps a full history of changes, so you can always revert to a previous dataset if errors occur. +
2️⃣ Managing Changes in Protocols and Methods +
Research methodologies evolve over time—new equipment, updated software, or adjusted data collection techniques may be introduced. +
+If a dataset changes due to a new collection protocol, Git allows researchers to: +- Document protocol changes in commit messages. +- Compare "before and after" versions of the dataset. +- Maintain a clear audit trail of why and how data collection changed over time. +
+3️⃣ Tracking Contributions from Multiple Students and Researchers +
+Labs often have a rotating group of students and researchers working on different aspects of the same dataset. +Without version control, files may be duplicated, overwritten, or lost. + +With Git, every change is linked to the individual who made it, making it easy to: +- Assign credit for contributions. +- Resolve conflicts between different updates. +- Prevent accidental data loss due to human error. + +
+4️⃣ Supporting Automated Data Collection and Analysis Pipelines +
Many labs use automated sensors, scripts, or instruments that generate data continuously. +
Git can be integrated with data pipelines to: +- Automatically log changes when new data is added. +- Run data validation checks to detect anomalies. +- Ensure that analysis scripts always run on the correct version of the dataset. + +
+5️⃣ Reproducibility and Compliance with FAIR Principles +- Scientific research relies on reproducibility—other researchers should be able to replicate results. +- Keeping a clear history of data versions, updates, and methodology changes ensures that future researchers can trust and understand the dataset. +- Many funding agencies and journals now require data provenance tracking, which Git provides naturally. + +Now that we understand why research labs need version control, let's set up Git to support long-term data collection. + +### Step 1: Creating a GitHub Account + +Before you can start using GitHub for your materials, you need to create an account. GitHub is a platform that allows you to store, share, and collaborate on code. It is widely used by developers, students, and organizations for managing software projects using Git, a version control system that tracks changes in your code. + + +To get started, you need to sign up for a free GitHub account. This will give you access to your own profile, repositories, and collaboration tools. Follow the steps below to create your GitHub account. + +- Go to GitHub's website +- Click on Sign up in the top-right corner. +- Enter your email address, username, and password. +- Click Create an account and follow the instructions. +- GitHub will send a verification email. Click the link in the email to verify your account. + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 4 + +
+ Click above image to watch introductory video +

+ + +## Step 2: Setting Up a GitHub Account & Installing GitHub Desktop + +Before tracking your data, you need to install GitHub Desktop, a user-friendly application that simplifies version control without needing command-line commands. + +### Instructions: + +1. Go to [Github](https://desktop.github.com/download/) and download the desktop version for your operating system. +2. Install GitHub Desktop and sign in with your GitHub account. +3. Set up your GitHub profile with your name and email (important for tracking contributions) from the account you set up in step 1. + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 5 + +
+ Click above image to watch introductory video +

+ +## Step 3: Creating a Repository for Your Research Data +A repository (A "repo") is like a folder where you store your research data and track changes over time. + +### Instructions +1. Open GitHub Desktop and click “File” → “New Repository”. + +![NewRepository](./images/github_new_repository.png) +2. Give your repository a name (e.g., "Climate_Data_Study_2024"). +3. Choose a location **on your computer** where the repository will be stored. +4. Select Private (if you are using it for your lab group). You can name "collaborators" later (students, postdocs, etc) +5. Check “Initialize this repository with a README” (important for documenting your dataset). This is the appropriate spot to include summary information about this particular repository's purpose +6. Click Create Repository. + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 5 + +
+ Click above image to watch introductory video +

+ +

+ + NIH/NIGMS Sandbox Foundations of Python Video 10 + +
+ Click above image to watch introductory video +

+ +Now, you have a version-controlled folder on your computer where you can store and track your research data. + +## Step 4: Adding Data Files to GitHub Desktop +Once your repository is set up, you can start adding data files like Excel, CSV, or JSON datasets. + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 9 + +
+ Click above image to watch introductory video +

+ +### Instructions: +1. Open your repository folder *on your computer.* +2. Copy or move your data files (e.g., temperature_data_2024.csv) into the folder. +3. Open GitHub Desktop, and you’ll see the new files listed as "Uncommitted Changes." +4. Add a commit message (e.g., "Initial dataset upload - July 2025"). + +![CommitMessage](./images/commit_msg.png) + +5. Click the bottom "Commit to _____" button (this saves the version to your local repository). +6. Click Push to Origin (this uploads your data to GitHub.com). +![PushImage](./images/push_origin.png) + + +**Why Commit Messages Matter?** +Every time you save changes in GitHub Desktop, you write a commit message explaining what changed. This helps future researchers understand: +- ✔ What was added/modified? +- ✔ Why was the data updated? +- ✔ Who made the change? + +The previous commit is NOT overwritten. Rather, the beauty of git is that it saves what has changed. Thus, it is possible to revert to a previous commit (if something has gone wrong) or to specify a particular version of a data set for a publication. + +## Step 5: Managing Protocol Changes & Dataset Updates +In research, data collection methods evolve. You might introduce: +- 🔹 New measurement instruments 📏 +- 🔹 Revised calibration methods ⚙️ +- 🔹 Updated sampling locations 🌍 + +Using GitHub Desktop, you can track protocol changes alongside your datasets. + +### Instructions: +1. Open your repository folder. +2. Edit or add a new protocol document (e.g., data_collection_protocol_v2.docx). +3. Open GitHub Desktop, and you’ll see the updated file. +4. Write a commit message (e.g., "Updated protocol to include new sensor calibration process") as above for data +5. Click Commit to main, then Push to Origin. + +Now, every protocol update is documented and timestamped, ensuring full transparency. + +## Managing a lab group using the same git repository +It is rather unlikely that ONLY one person would be the involved in collecting all of the data for a research lab. In order to control and protect overwriting, Git provides clear management tools. That is covered in the next tutorial. + +### Additional Resources: + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 13 + +
+ Click above image to watch introductory video +

+ +

+ + NIH/NIGMS Sandbox Foundations of Python Video 14 + +
+ Click above image to watch introductory video +

+ +

+ + NIH/NIGMS Sandbox Foundations of Python Video 15 + +
+ Click above image to watch introductory video +

+ +

+ + NIH/NIGMS Sandbox Foundations of Python Video 16 + +
+ Click above image to watch introductory video +

+ + + +Go to the [next tutorial](Submodule_0_Tutorial_5_ManagingGit.md) \ No newline at end of file diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md new file mode 100755 index 0000000..1b4822e --- /dev/null +++ b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md @@ -0,0 +1,139 @@ +# Tutorial 5: Managing your GitHub data repositories +--------------------------------------------------------------- +## Overview +This tutorial helps research PIs and project leads set up GitHub to manage lab data with clarity and control. You'll learn how to protect the main branch, require review of changes, and maintain traceability across your team’s contributions. + +## Learning Objectives +In this tutorial, you will strengthen your ability to: +- Explain the risks of uncontrolled data changes in research labs +- Define key GitHub terms like commits, branches, pull requests, and main +- Set up branch protection to safeguard official data and protocols +- Require collaborators to submit changes for review (via pull requests) +- Maintain a clean, auditable history of contributions and updates +- Apply Git/GitHub tools to support data integrity and FAIR principles + +## Prerequisites +Please complete Tutorial 4 before Tutorial 5. + +-------------------------------------------------------------- +## Why use Git for your research lab team *DATA?* +In a research lab environment, managing data properly is just as important as collecting it. Labs often deal with long-term datasets, changing protocols, and *multiple* contributors, which can lead to data integrity issues if not properly managed. + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 11 + +
+ Click above image to watch introductory video +

+ +🧪 GitHub Repo Management Guide for Science Lab PIs + +🎯 Goal: +As the lab PI or project manager, you want to: + +- Ensure collaborators don’t accidentally overwrite important files. +- Control when changes are added to the main dataset/code. +- Require collaborators to submit changes for review before those changes are finalized. +- Protect your team’s research integrity and maintain FAIR data practices. + +GitHub makes this possible with a system of branch protection and pull requests—and you can manage it all through a point-and-click interface (no coding required). + +## Key Concepts (Plain Language) +🔹 What is a “commit”? +
+A commit is like saving a version of your file with a note attached—"I added this graph," "I fixed a typo," etc. Every team member commits their own changes as they work. + +🔹 What is “push” vs. “pull”? +
Push: Upload your saved changes to GitHub (shared with the team). +
+Pull: Download the latest team updates from GitHub to your computer. + +🔹 What is the “main” branch? +
Think of the main branch as the “official” version of the project or dataset. You want to keep it clean and stable—like a published paper. + +## Why You Should Protect the “Main” Branch +Without protection 🔒: +- A student or collaborator might accidentally delete or overwrite key data. +- Anyone could push changes at any time—even if they weren’t reviewed. +- There’s no record of who approved changes or when. + +With protection: +- Collaborators must submit proposed changes (like peer review). +- You (or a designated reviewer) can approve or deny changes before they go public. +- The main branch stays clean, traceable, and trustworthy. + +## Step-by-Step: Set Up GitHub to Control When Collaborators Can Commit +✅ 1. Log into GitHub and Open Your Repository +Go to github.com and click on the repository you want to manage. + +✅ 2. Go to Settings +Click the “Settings” tab at the top of the repo. + +In the left sidebar, scroll down and click “Branches”. + +✅ 3. Add a Branch Protection Rule +This sets the rules for your "main" branch. + +On the "Branches" page: +Click “Add rule”. + +In Branch name pattern, type: + +main (or master, depending on your repo) + +

+ + NIH/NIGMS Sandbox Foundations of Python Video 8 + +
+ Click above image to watch introductory video +

+ + +**Check the following boxes:** + +✅ Require pull request reviews before merging +(This forces team members to submit changes for your approval) + +✅ Require status checks to pass +(Optional: useful if you’re using automated testing or data validation scripts) + +✅ Require branches to be up to date +(Ensures everyone works from the latest version) + +✅ Restrict who can push to matching branches +(You can list yourself or other senior members who are allowed to approve changes) + +Click 'Create' or 'Save' changes. + +👥 What This Looks Like for Your Collaborators +Now, your students and research assistants won’t be able to push changes directly to the official version. Instead, they will: + +- Create a new branch (a personal workspace). +- Add or update files. +- Use GitHub Desktop or GitHub.com to create a pull request (PR). + +You (or a trusted reviewer) will get a notification. + +You can review the changes, leave comments, and then click “Merge” to accept them. + +🧠 Think of a Pull Request like a manuscript submission—it gets reviewed before being added to the “published” record. + +## Summary: What You’re Gaining + +As the lab PI, you now have: + +|🔒 Protection From |✅ Tools You Now Have| +|:--------------------:|:----------------------:| +|Accidental data loss| Branch protection rules| +|Unreviewed changes| Pull requests (PRs)| +|Unclear authorship |Contributor tracking| +|Unapproved protocol changes| Review workflows| + +## Conclusion + +You should now be able to use Github and the underlying tool of Git to keep track of and protect your data. However, it is not yet FAIR data because you need a fixed identifier for a set of data (even if you later update it) to include with your journal articles. + +For that information, view the [last tutorial on Git](Submodule_0_Tutorial_6_DOI.md) in this submodule. + diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md new file mode 100755 index 0000000..529e4cf --- /dev/null +++ b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md @@ -0,0 +1,82 @@ +# Tutorial 6: Digital Object Identifiers for your Github Data +------------------------------------------------------------------ +## Overview +There are a few tools and platforms that offer DOI creation for files, datasets, or software associated with GitHub. However, **Zenodo** is the most widely known and trusted service for assigning DOIs to GitHub-hosted content. Thus, this tutorial will focus on using this tool. + +## Learning Objectives +After completing this tutorial, you will be able to: +- Understand the purpose of a DOI in scholarly communication and FAIR data compliance. +- Identify Zenodo as a trusted research data repository for archiving GitHub-hosted data and software +- Create and connect a Zenodo account to GitHub to enable DOI generation. +- Prepare a GitHub repository for archiving, including adding a README, license, and release. +- Create a formal GitHub release that can be archived and assigned a DOI. +- Locate and cite the DOI generated by Zenodo for their release. + +## Prerequisites +Please complete tutorials 4 and 5 in advance. + +----------------------------------------------------------------- +## Introduction +A DOI (Digital Object Identifier) provides a persistent, globally unique, and **citable reference** to a specific version of your dataset or software. Under the FAIR data principles—Findable, Accessible, Interoperable, and Reusable—DOIs play a critical role in ensuring that: + +🔎 Findable: Data can be reliably located through metadata indexing services like DataCite or CrossRef. + +🔗 Accessible: A DOI ensures there’s a stable link to a publicly available version (or metadata record). + +📚 Reusable: Citation via DOI promotes proper attribution, credit, and encourages ethical data reuse. + +🧬 Versioned and Documented: DOIs can be assigned to specific releases of data/software, creating an auditable research trail. + +In short, DOIs support transparency, reproducibility, and proper data citation, making them a key element of FAIR-aligned research. + +[Zenodo.org](https://zenodo.org/) is a free, reputable platform maintained by CERN and OpenAIRE. It integrates with GitHub to automatically archive releases and assign a DOI. + +## ✅ Step-by-Step Instructions + +1. Prepare Your GitHub Repository +Make sure your repository has: +- A clear README.md (describing the project or data). +- A LICENSE file (open licenses like MIT, CC-BY, etc. are recommended). See [Github](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-a-license-to-a-repository) +- A versioned release (Zenodo will archive specific releases, not your live repo). See [Github](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) + +2. Create a Zenodo Account +- Go to https://zenodo.org +- Click Sign In (you can use your GitHub, ORCID, or other credentials). + +Once signed in, go to your Dashboard. + +3. Connect Your GitHub Account to Zenodo +- Go to Zenodo GitHub Settings +- Click Connect GitHub. +- Authorize Zenodo to access your GitHub account. + +You’ll see a list of your repositories—flip the toggle to enable archiving for the repo you want to assign a DOI. + +4. Create a GitHub Release +**DOIs are generated only for releases, not for every commit.** + +- In your GitHub repository, click the "Releases" tab. +- Click “Draft a new release”. +- Tag it with a version number (e.g., v1.0.0). +- Add a title and description (e.g., “Initial release of dataset”). +- Click Publish release. + +Zenodo will automatically archive this release and assign a unique DOI. + +5. Find Your DOI on Zenodo +- Go back to Zenodo.org +- Click Dashboard → Uploads or GitHub +- Click on your project + +You’ll see a permanent DOI like this: + +**10.5281/zenodo.1234567** + +This DOI is now persistent, citable, and indexed. + +----------------------------------------------------------------------- +## Conclusion + +You have finished the introductory tutorial that enables you to use GitHub to retrieve tutorials and to use its features for version control of your own data. + +The next submodule will begin your Introduction to Python programming! \ No newline at end of file diff --git a/Submodule 0/images/.ipynb_checkpoints/GitHub_First_View-checkpoint.png b/Submodule 0/images/.ipynb_checkpoints/GitHub_First_View-checkpoint.png new file mode 100755 index 0000000000000000000000000000000000000000..3d3b827f0d731a7a5b38f5bf639e9649add03976 GIT binary patch literal 205171 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 Date: Mon, 9 Jun 2025 13:34:24 +0000 Subject: [PATCH 03/10] Github Action: Lint Notebooks --- ...Tutorial_1_GithubDownload-checkpoint.ipynb | 265 --------------- ...torial_2_JupyterNotebooks-checkpoint.ipynb | 280 ---------------- ...dule_0_Tutorial_3_AzureML-checkpoint.ipynb | 303 ------------------ ...orial_3b_AzureML_CloudLab-checkpoint.ipynb | 85 ----- ...dule_0_Tutorial_4_GitHub4You-checkpoint.md | 273 ---------------- ...ule_0_Tutorial_5_ManagingGit-checkpoint.md | 139 -------- .../Submodule_0_Tutorial_6_DOI-checkpoint.md | 82 ----- .../GitHub_First_View-checkpoint.png | Bin 205171 -> 0 bytes 8 files changed, 1427 deletions(-) delete mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb delete mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb delete mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb delete mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb delete mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md delete mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md delete mode 100755 Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md delete mode 100755 Submodule 0/images/.ipynb_checkpoints/GitHub_First_View-checkpoint.png diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb deleted file mode 100755 index 3313e26..0000000 --- a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_1_GithubDownload-checkpoint.ipynb +++ /dev/null @@ -1,265 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tutorial 1: How to download a Tutorial from the NIH Sandbox\n", - "--------------------------------------------" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "Congratulations! You have decided to make use of the fantastic NIH tutorials that are stored in the NIGMS Sandbox at the site called Github.\n", - "\n", - "To use these resources, you need to understand a little about \"where\" these files are and how to save them in a way that will let you use them to learn about the technique. \n", - "\n", - "The intent of this tutorial is to make sure you have clear instructions (with pictures) that will work for the most novice user." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Learning Objectives\n", - "+ Navigate the Github sandbox to find a tutorial\n", - "+ Find & read the \"readme\" file\n", - "+ Download a tutorial\n", - "+ Have a preliminary understanding of Github" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "- Knowledge of file saving & retrieving\n", - "- An internet connection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get Started\n", - "Make sure that you are connected to the internet\n", - "\n", - "-------------------------------------------------------------" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 1: Get to the NIGMS \"Sandbox\" & overview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Background\n", - "In technology and software development, a \"sandbox\" is a place to \"play,\" trying out new ideas or collaborating. \n", - "\n", - "The National Institute of General Medical Sciences (NIGMS) is one of the NIH Institutes. That institute sponsored the development of many short courses (modules) to help biomedical researchers learn some of the techniques that can take advantage of the powerful options of \"cloud computing.\"\n", - "\n", - "You are likely familiar with cloud data storage, for example with your files saved on OneDrive (Microsoft) or Google Drive (Google). Cloud *computing* takes that a step farther and carries out data processing and runs programs on computers that are located in some distant site. \n", - "\n", - "The advantage of \"cloud computing\" is that the computational speed and power is not limited by what you have in *your* desktop or laptop. Rather, cloud computers are very FAST computers with substantially more memory (to work on big biological data sets). Additionally, the providers of cloud computing can make more (or fewer) processors available to your job, depending on the need. " - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## What you see when you arrive at the \"Sandbox\"\n", - "It is possible that you are reading this file having already navigated to the \"Sandbox.\" \n", - "\n", - "The [Sandbox](https://github.com/NIGMS/NIGMS-Sandbox) is housed at github.com. Github is a collaboration tool/website/repository that is being used by NIGMS as a great way to share materials.\n", - "\n", - "BUT, what you see when you get to github is NOT what a novice in cloud-computing-user might expect. It looks something like this picture below. It is certainly **overly complicated** for a novice because Github is not designed with novices in mind. Thus, EVERY Github site (or \"repository\" of materials) looks basically the same. It shows a lot of needed tools and a list of the folders in the repository. \n", - "\n", - "**The key point:** scroll down ON THAT PAGE to see the nice description and information you want about the repository. It is information in the \"readme\" file that is displayed for you. It is just very unfortunate that unless you know to scroll past the folder structure, you start with a mysterious interface.\n", - "![Github_splash.png](./images/Github_First_View.png)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 2: Choose a course (module) to use\n", - "If you have scrolled down on the Sandbox readme page, you have encountered the list of available courses (\"modules\") that you might want to use to learn a technique. \n", - "\n", - "Or, perhaps you are going to use more of this module (Introduction to Github and Python for Bioinformatics). \n", - "\n", - "You should click on the link to that module from the list. It will take you to another Github Repository. Of course, the interfaces will also start with the file structure as all Github repositories look the same. These Modules typically contain a Readme.md file that explains the structure & contents of the overall tutorial module. Inside of each Module are folders (\"Submodules\") that contain the lessons in the form of Jupyter Notebooks (next lesson in this list)\n", - "\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 3: Two ways to make a copy of the Github Repository\n", - "\n", - "Unlike just reading a web page as you are doing now, the Sandbox tools are all constructed as special kinds of pages (\"Jupyter notebooks\") that combine text with interactive boxes where you will be able to write and use computer code to carry out bioinformatics functions.\n", - "
\n", - "So, in order to use the contents of any of the learning modules in the Sandbox, you need to copy them to a \"virtual machine\" (like moving to the hard drive of a computer running in GCP, Azure, or AWS). Github is quite prepared for this, in fact, it is one key purpose of the NIGMS using Github as a place for you to collect the materials.\n", - "
\n", - "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the #option# to download or to copy.\n", - "
\n", - "![<> CODE button](./images/Code_button.png)\n", - "
\n", - "\n", - "There are two main ways to clone (that is, make a copy) of this material. The most efficient way to accomplish this is to clone the whole collection directly from cloud storage to cloud storage. For large files, this makes the most sense. \n", - "
\n", - "The more familiar brute-force way is to download a copy of the repository to your computer's hard drive, then upload it again to the cloud. \n", - "
\n", - "Both options are described below.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Elegant Version: Clone into a Virtual Machine\n", - "\n", - "This method requires that you already have a cloud computing instance (what a virtual computer is called) up and running. You can see how to get that started in [Microsoft Azure](Submodule_0_Tutorial_3_AzureML.ipynb )\n", - "\n", - "### Open a terminal\n", - "In the Notebooks portion of the Workspace, you need to open up a command line terminal. \n", - "
\n", - "![where to find the terminal button](./images/Azure_terminal.png)\n", - "\n", - "After you are in the terminal view, you'll need to turn on the computer instance with the `play` button on the top menu. \n", - "
\n", - "![start button](./images/startCompute.png)\n", - "\n", - "That button could be found in somewhat different places, depending on how collapsed the terminal window is. For example:\n", - "
\n", - "![start button2](./images/StartComputeCollapsed.png)\n", - "
\n", - "It is the same `play` button. If you want to make the terminal bigger, click on the << button (yellow arrow).\n", - "\n", - "### Clone in the repository\n", - "\n", - "It is very easy to clone a public repository into the terminal with `git clone`. You need the web address for the Module:\n", - "
\n", - "![clone URL](./images/githubURL.png)\n", - "
\n", - "1. Click on the copy button next to the URL.\n", - "2. Go to the Azure terminal\n", - "3. type: git clone *then paste the url you copied*\n", - "\n", - "
\n", - "The whole set of folders and proper file structure will instantly be in your notebook list.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Familiar, inelegant version: Downloading the contents of the repository then uploading\n", - "\n", - "There isn't a normal download button that you can see in a repository. At Github, most of the materials are code that developers want to download. Thus, you will click on the green code button to get the #option# to download or to copy.\n", - "
\n", - "![<> CODE button](./images/Code_button.png)\n", - "\n", - "
\n", - "The menu you will see has the more elegant options, and also the button to download a zipped version:\n", - "
\n", - "\n", - "![Github Download Code Menu](./images/Download_zip.png)\n", - "\n", - "# \"Unzipping\" your folder\n", - "\n", - "The folder of materials does not download in a ready-to-use format. It is compressed (\"zipped\") so it needs to be extracted| into its full form before you upload it to use as a tutorial.\n", - "\n", - "**To unzip a file on Windows:**\n", - "\n", - "1. Locate the zip file (it's probably in \"downloads\" but you can look at this button near the top right of Chrome, for example, to see where it downloaded)\n", - "2. Once you find the zipped folder, right-click on the zip file\n", - "3. Select \"Extract All\": From the context menu, which should look something like this on the menu bar:\n", - "
\n", - "\n", - "![Unzip](./images/extractAll.png)\n", - "\n", - "
\n", - "4. Choose the destination folder where you want to extract the folder. (it is fine to extract them in the same folder the file is already)\n", - "5. Click \"Extract\" to start the unzipping process. \n", - "\n", - "
\n", - "\n", - "**To unzip a file on a Mac:**\n", - "\n", - "
\n", - "1. Double-click the zipped file\n", - "2. The file will automatically decompress and a new folder will appear in the same location as the zipped file. \n", - "
\n", - "You should now be ready to upload those files to run the lessons in Azure. \n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Conclusion\n", - "If you have followed these steps, you should now have a copy of the lessons module on your local computer or already cloned into Azure. \n", - "\n", - "To learn how to use these lessons in a cloud computer at Amazon (AWS), [Google Cloud Computing (GCP)](https://github.com/STRIDES/NIHCloudLabGCP/blob/main/docs/vertexai.md), or Microsoft's Azure ([Azure ML](./Module_0_Tutorial_3_AzureML.ipynb)) you can use one of the linked tutorials. \n", - "\n", - "Or, if you want to learn more about how to use [Jupyter Notebooks](./Submodule_0_Tutorial_2_JupyterNotebooks.ipynb)\n", - "\n", - "For the \"Intro to Github and Python for Bioinformatics\" module, we provide information for those using [Azure](./Submodule_0_Tutorial_2_AzureML.ipynb) and have tested to make sure that all the materials work as expected on Azure. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Clean up\n", - "On most Jupyter notebooks in these modules you will see directions here to \"stop your compute instance\" (we'll explain later). But, since this is just a web page, you are done. \n", - "\n", - "Good work & we hope you enjoy learning these powerful techniques for bioinformatics!\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "conda_python3", - "language": "python", - "name": "conda_python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.16" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb deleted file mode 100755 index 80d3fac..0000000 --- a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_2_JupyterNotebooks-checkpoint.ipynb +++ /dev/null @@ -1,280 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Overview\n", - "You are already looking at a Jupyter Notebook, but **what is it? What's it for?** \n", - "\n", - "This tutorial will help you to be ready for all the other tutorials in this module. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Jupyter Notebooks\n", - "--------------------------------------------" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Learning Objectives\n", - "**After this module, you will be able to:**\n", - "+ Define what a Jupyter notebook is and explain its purpose\n", - "+ Navigate the Jupyter interface\n", - " - Differentiate between code cells and Markdown (text) cells\n", - " - Execute cells individually\n", - " - Use the toolbar & menus\n", - "+ See how to write and execute code within Jupyter Notebooks (but you can't do that yet)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "- You only need to know how to read\n", - "- if you would like to make your own notebook to play with, you can use [Google Colab](https://colab.research.google.com/)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction to Jupyter Notebooks\n", - "\n", - "**What is a Jupyter Notebook?**\n", - "\n", - "It is a tool that lets you write text and run computer code (typically R or Python) all mixed into a single file, making it easy to see and understand. That is, Instead of just writing programming code in one tool and the descriptions or explanations in another file or a textbook, it blends them together sequentially.\n", - "
\n", - "Also, Jupyter lets you type that computing code into boxes (called \"cells\") and run each part separately. \n", - "
\n", - "As it turns out, **this page** was written as a Jupyter Notebook but as the user, you only see it as a web page. Since it doesn't have any code (yet) to run, it basically *is* a web page.\n", - "
\n", - "BUT, when you look at a Jupyter notebook in the right kind of interface, the user can edit the text not just view it.\n", - "
\n", - "**and that user can change the code and run it!**\n", - "\n", - "The top line is clearly text-based (the tool for that in Jupyter is called \"Markdown\")\n", - "\n", - "The next cell below is a **code cell** that has in it: \n", - "#this is a code cell\n", - "print(\"This is the output from a code cell\")\n", - "
\n", - "Finally, the bottom material is not in a cell but is the output (This is the output from a code cell)\n", - "
\n", - "The kind of code it is able to run is **Python**. If you look at the top right, you can see that this Jupyter Notebook is running Python 3 (Python language version 3) in the code cells. \n", - "\n", - "In the above image the code in the cells has already been run (Markdown is also a kind of code that renders the text in some format, so we \"run\" that too) Take a look at the same notebook before the two cells were executed:\n", - "![image.png](attachment:cc6d0953-136b-4038-a6fb-0992b25aec95.png)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Why Use Jupyter for Coding and Data Science?\n", - "\n", - "Jupyter Notebooks are useful because:\n", - "\n", - "1. They are easy to Use – You don’t need to run an entire program at once. You can run small pieces of code step by step, see what happens, and fix mistakes as you go.\n", - "2. You can take notes while you code – Instead of keeping your notes in a separate document, you can write explanations right next to your code to make it easier to understand later. In this module, it means that notes can be given to you to describe the code.\n", - "3. They help you to see your results clearly & immediately – If your code creates a table, chart, or graph, Jupyter Notebook will show it right inside the document.\n", - "4. It's great for learning and sharing – You can save your notebook and send it to someone else so they can see your work and try it themselves.\n", - "\n", - "That is, Jupyter Notebooks are especially useful for students, researchers, and anyone working with data because it helps break things into small, easy-to-understand steps.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Running Code in Jupyter Notebooks\n", - "\n", - "In Jupyter Notebook, you can run little bits of Python in code cells to \"execute the code\" inside them. Here’s how to run a code cell and manage the output:" - ] - }, - { - "attachments": { - "4dc097e1-dbaf-452d-951f-6917b20d0bb9.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEWCAYAAACDoeeyAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAFMlSURBVHhe7Z0HYBRFG4bfFFJI6L33DlICShMQKUpVEAsoFsQKClJURKSLKE3EjiICoiIdfwUBUYqoNOm9hd5bQkmy/75zO2FzXC7tArnje8Kwu7Ozs7uze+98883srp8BmP8EQRAEX8TfmgqCIAg+SLwlf+3qVRVhJ1OmTNbcjRjG9QYA5+0hLi5OhdjYWMTExCA6Ohrnz59HuXLlrC0ET7J9+3ZkzZoVoaGhCAwMREBAAPz9/VXw8/NLEDT2eUEQfJBBg4CBA9PfkrdXBkL6ImUtCIIz6SbyIji3Dil7QRA0N80nL8Jj52d08vNDxff3WsvA3vcrws+vk7km5UjZCoKQGBm+49Uhfgn9ygx2gRQEQRBc4yWjazpigWmt0mJVYecHQN+S8OucGrtXEATh9sFLRN6J0r2wYGQF4NupqXJvCIIg3C54p8iblChf3ZoTBEEQEsNrRX7vtnVA5Row7XkH8zrBz68iRu2yljW7RqGinx86zbOWTX7u7Odw9VjrUu7nd3ScJt5H4Lw+dR2qgiAIacU7Rd4U9JJ9t6Lj8F4oYUWlmG9bwu9BXPf1z+2IrX1LJqgMXKIqhpaY9sSCBH0E8e0Ka/26kXvi1y94YhpaitALgnAL8BKRp0jaLOMfOynxnNraWp0qOmLBRlsl0XooPqhs7ulHd1K8F6Me7I2tFPjJLaw4k9K9MLWPI6efB5vrK3+ABdYyaTF5gbm3aegtI4IEQbjJeInIXx9ds0d1uLZM2uJOiic6wSbTJiVQgeb4uq2mlCfCrpmYuMk8mg4Jt7zOz5j6rbn+hhZGBdQwK5CtG7day0K6s/8/YGI3oFtJR5g/2lohCLcXXueuKdFnCxY8YVrcbW6B+2PrWmylYMd3BDixayvWmZNpbWytDhVKordZOQg3gahzwKx3gT5VgV8nAMfNKpthci9gxmArkSDcPnilT77FgA9MqXVyf1SwdcKmF0nto3QF5ZvvONfy1TsHu4tH8Dzr/ge8VQf4rp8V4cTqmdaMINw+eGfHqzVOfmvflk6jabZirZNHZO+siWash1AivhUTZyXm0HG4Zdz79QWPcjUaWPSpQ9zfNSvRQ26utn+ANSMItw/eKfImJfp8gI6m4PYebAlq6XboQoG1u3F2jULLvp70g7fAVGsUToIhk+Z+OqnlEug1vKPqM3AejvlzZxld41H2rQem9AW65ge+eBHY+Ze1wg13PmjNCMLtg9eKPAV3aIJOWFNgNzpGscSPxOEQyZ107XiQ1lOvv1ZB76fMRNR40OpqdbXeDL2rDHXq6BVSjBEHrPwe+KCdWb7VgbnvA9HnrZVJ0GUC0L6/tSAItw/p9tEQfjCE02vXruHy5cs4d+4cypcvb20heJJt27YhW7ZsCAkJUdeMHwvRHw6xVzQMGvt8hoe+9jVmTf7n1OSLuuaBN4BmpqWfu6gVIQi3CTfroyGCkCq2rwCmvu4Y/khf+8JPUibwlRsDvWcCHd8VgRdua0TkhYzDmcOO8exv1ATerg/MGekY/pgSytUFun4KDFgsPnhBMBGRF249axcAE54Eni/kGM++Z421IgU0NLfvvxAYYrYAmj5vRQqCICIv3BqO7gJmDQd6VgRGtAKWTbZWpAC6YR4ZDHy0B3h5EnBHU2uFIAgaEXnh5vLXDGB0B+CVMsB3b7kf154YDZ4Aepn5fLwfaP82kDfhSyQEQbiOiLyQ/pw/Acz7wGG1U+Ap9CmlZhvgxYnApLNAN9Pqv6u9tUIQBHekWuSjLl7AmVMnVOC8INzAztXA1684Hlj6tk/KrfYKDYCnxgIT9gJ95wD3PANkzmatFAQhOaRK5Cnqly9Hx4+L57wIvRAPH1h6rzXwVm3gf+MdDzElF4p4yx6ODtRBy4AWrwJ5ilsrBUFIKakS+StXLltz13EVJ9xGXLnkeAK1ZwVg7KPAmvnWimRStTnw4lfAxBPAk2McQyEFQUgzqRJ5Wu/OuIqz41VPWHoZt7Rs+WrfmcOAl4o53iVzaJu1IhnkLAQ8+CYwcp1p9f8C3PM0EJD4U9aCIKScdOt4FVG/ddyUsj971PF+9heLAtP7AxdOWSuSAa32V6YCn0YCjw0HilezVgiC4GnSTeQ1IvY3j5tS1utNi/uTZ4DnCgA/vJOyVw3wHTJDljus9vodrUhBENKTdBd5QvERsU8/0r18Tx9yvGKAX1safj+w9GtrRTIoUBboNAL47DDw7MdAuXrWCkEQbgbpKvIi7Dcfj5b57n8c30l9obDjZWH8bmpyqW5WBq9+B4zbDrQ1t81hWv6CINx0PCryWmDsliVfd8sQGBiI6OhoFSd4DpYpy1aXM7GXv56miE1LHO9sf/NOx3dSU0LdR4B3lprb/gzUe9SKFAThVpFqkXcWD1diouP4bnO+53zPnj2IiopScULaYVmyTFm2LGPi7jpoXKVRHNkJfNYVGHwv8PcsKzKZ3N0JGPQH0GM6UKmRFSkIwq0mVR8NOX3yuJrah01yPkeuPGrKj4Vwqj8cEhMToz4cQlG6dOmSmufHRBjPdM5B47xMnNPZ96U/UFKmTBnceadphd5CtmzZgn379sV/vMNOoiJrYV/PeedAy53Xhh8JCQsLQ+bMmdW8tui5T6bjvH07jX1ecfE08MtHjo7UlBAcBjTu4uhELXOXFSkIQobA+mhIuog8A8VXBy3AV819XLlyRU0p8LoS0NvofPQ8cTWv0+ht9X50/hcvXkTp0qURERGh0t9stm/fjiNHjiA4ODhecN2KbCLYt9PzWsQp6EFBQWofnGprnut10NvooImf57BHumP4XpnoFDyxXMW09Os95rDeM4VYkYIgZCjSS+SJs/gyUNAp7DrY1zGtDkRPiT3OOY19e11p0JJnuHDhAkqWLInq1aur9DeL3bt34/jx48qypvhqsSXOUzvu4jjVwS7iFHodXAk8p/btFQc3w2/HSrMmMgNfFMYnVZPL/d2BBp2BUjWtCEEQMiyeEHliF92cufOqqRZgPbUHbb07W/E66Lw0zvP2dPZ8dZ7aZcMOSVr0xYsXR9WqVR0vyuJ7VAhHfnQeDRTy7Ddn9+7di1OnTiE0NDSBZa0F1nmaFPb09sA8dd7O4s6g0/jFXIXf7r/ht3cd/PatA3ascrzHPSXwqVSOb+fLwWSEjCB4D54WeWJ31+igBdg+b1+2p2XQ6HnnOOdgz5OBFr1d6KMunEPD5e8ifN/fVi423lsLlPCMpU//++nTp5V/nBa8XeB10NjnE8M5vT3YhVwHvRz436/w3/anKe7/wG/rH1YOqaR9f8eHsOl7FwTBu0ivD3nbxUgHZ1GyW6H2oN0OzvPugj0d82TFRJGlu4SCW3P1R64FnqxN4Uu0EkELPDtB6SPnMST3+F2FpMrBXoYqXL6ATL99iuABdRH4wQPwnz8qbQLf6Clg1CbgkSEi8ILg5XjUkre7a4izpe687ByInmrsy/a09qCteLpr7O6gTHv+RqlJT1pbu4BPY/JhnTSwf/9+nD17Nt6CZ5nZKzZ70Njnk0KnteejQ8C+dci0+gcELvnSvIAeeAvo3Y8DzV6Qp1IFwRfwlLuGUGiJFnliF+Gkgk6vsc8T5zScMtgrDS3sdrHPPWcgsq+eqrZxSWgW4JsUvHvFiQMHDsQLPC14Wt3auqYIc0q0KGvs8+5wtU3A0Z0I3LwYARsXqeAR+Dm9phR3eb2vIPgM6SXyRC9rAXa17Bxvnzpjj9fb6aCFnlMdtNjn+/hhhOxNxFVD+DEKfnUoFVDgz58/rzpZ7WPU7SKvA3GepgRa7AGbfkPgxoXw3/mXFZsG+LASv7pEUa/Y0LzQMgxSEHwOT4o8odBqkSdcdp7qoJddTTX2ZVfznNoFXk91iI25hkJvlIOfOzdGRGvg9bnWQvI5ePBgsgVeB4193h201v03L4X/hl/hf2iLFZsKchd1uF9K1gBKmIEPLYmfXRB8H0+LPNHj5DV2QXY3JfZ5VzindQ52gWcINC3fHJ+4f53tocfGo9CD3ayl5BEZGakEXney6o5RindSVjyxz9vxO3sU/uYx+21agoB1Cxwf40gtpnVu0AVT/m6gQJlE9ykIgg+THqNrnMXELnL2oIXQLohaIJMbXI02YaDoMoTsdu/WiM5ZHLtyVlFPpyaXQ4cOqbH34eHhyoJnJahFXk/1sdiP09W8Wt63DoELRiPovZYI6l4cgZ89i4AV01It8MY9z8AYsAQGXxDGce0i8IJw2+NRS97ZJ2/HHpfU+sRwzkMv03LXy9qSDx/SEAEHNqj1rjjU7j0cLXOvEu0CBQqgbNmy1hrXaIG3d7Jq0XausHQgekrUw0kbfoXf1mXwW/c/+B3daa1JA4XKw+CoGD6JmquwFenAvm9BEG4z0sNd48on74yr+MTSOmNPp+c5tQcKvN/h7cj8VuLvrYmu2ARHn/w8/hUIfGlavnz51IvNXHH48GGXAk8R1Va5FnYdiP/xPcD+DfA7uAl+nJrCjthral2aKBkBo0ZLGFWawq+86+GO+hgEQbhNSW+RJ1qI3ZGcNHbs6fU8p/YQMGsYMs0aqta54mSv/+FyocpqFA5faKaejI2KUkLP993Y0QKflA/e/3Qk/PeutQR9vXriFGeOWLmkHaNiI6BGC+COZkCxO6xY14jAC4JwU0Reo8XYU9jz0/Na4LF9BTINvkfFueLiEx8iuvaj8W4dvgaBb6+kRU+hz5s3L4oVK6bS8k2StPIp8HzQyS7wgaaQ++9biwAK+86/zNbDNrWNxwgKBWo9AKNyY1PYmzpGySSBiLsgCPHcTJF3xhOin5jQBwyoD79dq9WyM1fu74moB95W4s60DFro+b4bWvUMuXPnVoKuXTQsh6DTBxC0eTECtyyF//bl8EvJB6yTC1+YVu1+h7BXbQ4EBForXCOiLghCotxKkXeFXbSTg3N6LvvNHw3/qX2tmITEmuIZ1f37GwSecErXDcWegesunj+HLGf3IcueVQjbsQwhu11XHGnlWoVGuFa+Aa6VqYeYYlWt2BtJqaCn5VoIguADZDSRTw0JhP7MYfjxg9OuCM2CywP+QFyBsvHiroVe56Hj/Q9uQtB/vyBw/c8IjkzBh6uTiRGWE1erNENMufqmwDdEXNb0KTN314IVGSuxy5ejVQtGl4EgCL5D1rHjkH3ch94t8kQLlN+nzwJLv1LzzsQ8MwGx93SJF3XnwE7TgLXzELhmLgJ3rLC28gABmRBToiZiilZBbKEKiC1Y0bTWq1kr0xdX14IdzFdMYb9gCnxo5jAEh4QgICBQ3D6C4IMEDhuGTGbwepEnRtQ5+D2V3VpKCEelxLy1UIk5Ll+EcXwv/E4fUgFm8D+4EQGmuHuCmOLVEVOy1nVBL1qVfhZr7c3F1bU4e+Y0Ll26iKzZsiMw0PW1FQTBN/ApkceUvsDc960FJ/g64atRZoh2fNPUQxiZs+JaqdqmZW4KuynmMSUigDDXFc2twPla0EVz5NBBZM+ZSwReEG4DfEvku+YDzrk+Jk8SY1roVys1wzW2DsrUsWIdZDSXh/O1OHv6FGJiYxEWnsWKEQTBl9Ei7/EvQ910Dm1LV4G/VrwGLrXsi7N9fsHZN5cgqs0bCQSe4u4NPm12stIHLwjC7YX3i/zJ/daM5zCKV8eRhi9h+7Pf42yv+Yi+v6ca3ugs6N4g7hqOomEnqyAItxfeL/L+AdZMGsldFEbr3ogb9Afi3v0Hx+s+g8t5SsULubOge5PAE3Y8e9sxC4KQdrxf5Ks0AbLkshaSwM88XXbEVm3ueC3vQ+/AeO5zxI1Yg7iP9sLo9J76wIZd2HWwI2IpCIK34P0iTx5N/GVkCn4RqfnLMJ7/HMZrP8Lo9z/ghS+BDu8A9z4LvxLVEwi6Dq5ILF4QBCEj4hsiXzLx1wor9q4Ffp2gHpjy61MVfj3Kw4/DLjcuthIkjTvhFwRByKj4hsiXqgVUu89aSAZHdgDzPoDf0KbwG36/Kfa/WSuuo0VdxF0QBG8mQ4v8hStx2H82mR/ZeGQIUPpOayEF8EtNQ5uZVn4X+EVuFlEXBMGnyNAif/5KLO7/ej9G/XkKsXHqma3EKVUT6D0TaNnDikghS78GelUBpr5u7viEFSkIguDdZHh3TdTVOPT++ShaTz6AA0lZ9TkLAU+OAYb9BbR4FShS2VqRAuaMBLqXRu6/JlsRgiAI3otX+ORrFQ7Fyv3RqD5+N2ZtPg++a8wtZe4CnhoLjNoIfHYY6DMLaN/f8SGO5BB9HgUWj0XZz9oheNV3VqQgCIL34RUi36ZCFvz3ailUyReCh6YeRKfvI3Hucqy1NglyFFCf0VM++7d+AT6NBLp+mqzP6QWf3Iewb3sgy9gHEbT+ZytWEATBe/AKkSdFs2fCwi7FMKRpXszdegERH+3B4t2XrLUpgC6dps8D47YDHQZake7JtGMlwj9/GmFTegKx7l1GbGVM+fc0ft2a+s8DclvmkWSLRRAEIQm8RuRJUIAf+t2TB38+XwKB/n5o/tU+9F94HNHXHJ/xSxGZQhwPQ43frR6USg7BK6ch5PeJ1pJrODCnaI4gvPPLEczfknKh5zbclnnIIB9BENKKV4m8pnrBEKzrXhLd6uTCiGUnUPvjvdh6/Iq1NoXkKwl0+cjRWVungxWZOEEbfrHmEqdBqXCMbFMIQ39NmdAzLbfhtsxDEAQhrXilyJPQTP4Y0zI/fn6qGM5ejkWtCXuSN9QyMdhZ2/MHoO8coEIDK/JGYviKhGRgF/o5G8+5db1wHdOIwAuC4Gm8VuQJ3RnNyoRjbfdSaFo6DH3/l8yhlu6o2QYYtAyRrd7BlZzFrEgHcTkLqY9wJxct9O/+dhRzN7kWesZxHdOIwAuC4Gm8WuQ1uTIHYObjRfFNh0IpG2rphjNV22LHi7Nw8elPEN36DRXO9V+GmNK1rRTJw53Qi8ALgpDe+ITIuyLWFNC4tKi8xdVa7dRHQxiMkNR9Os+V0IvAC4JwM/AJkT8VFYt2Uw7gyR8PoW6xUKzrXgoPVc6KAP+MMzzFLvRzTHFnEIEXBCG98WqRpzW8cOdF1Bi/G4t2XcLI+/NjXueiakx9RkQL/dCFR1QQgRcyEgP+GIC8Y/NiReQKK0Y4f/U86k+uj8wjM8cHLjPeW/BakefY+J4LjqLFpP3IHhKAf14uiV5358pQ1rsrKOrj2xXBhIeKiMB7gEtRVzDlp39wR+N3UbrOYGzYcsha412MXj0aZT8pi0MXHMc/ZPmQNAkut+P2dnFyFR6e+bC1hfczdMVQVPysolRSTnilyK87fBnVx+/BR6tO4Y2GefDXSyVQIW+wtTbjU6dEGO4qFmYtCanhwsXLGPXpElPcR6DngJk4csx7LCtXnIw+ibxheZEl2NHvczLqJEICQpArNJmfthTw37H/VDl6kqxBWbG883JE9Y3C0R5HUSN/8oZQZyS8SuSvxhoYvvQE7v5sL2LiDPz6THEMbZZXjZkXbi9+nLceI8YvQpx5H7z2/D2IuKOItcY72XV6F0IDQxHoF6iWj1w8gpDAEGQJSl1nf73C9XC8x3ElTgyLOi5CeFA4WpVuFR/H8EO7H6wtBF/Fa9SRY9+bTdyPtxcdVy8sW9OtJO4tJdbw7Uq9O0viiYdqYfncnnjl2YbIHBpkrfEeDp4/iFIfl1Juk/m75is3Q+4xueOXIy9EoswnZW66nzw2LhZfrv8ShT8srI6F0/H/jodh/jmz7tg6NJ3WFNlHZVdpi39UXG0bayTzBYJuWH5weYK8i4wvgjeXvonzV6632tiPwHW6zC5evai20XEM2od+6dolNJ7aWJXx0v1LrRyuQ1cZ3T0M2m2WGvac3YNOczoh1+hcav8FxhXAwD8Hqv2nFZZ3vW/qxZeJc5i+ZbpKx+mmE5vUvFeIPF9Idse43dh47DJmdCqCqY8URraQAGutcDtSrlRejB7UDoXyZ7NiBE8QExeD7gu7o8eiHjh9+bSK4/TtZW9j3s55alkze8dsNP+uuaqArsZeVXHHo47jlYWv4Jn5z+BaXOofSpy7cy5a/dAqQd6nok9h3D/j8PPu1L0RNixTGDpV7oTLMZcxe/tsK/Y6fxz4AwfOH0CL0i1QKEshKzZl/HvkXzSZ2gSzts9CdEy0ijt35RxGrhqJlt+3TFOHLY+vxfQWSuh1mSQHrxD5fyKj44dGPlgpq7y4S/AJimQtgt0v7cael/egZPaS6F27t3Kh7HxxJwpnKRzvWqHbhe6XmwEFcOfpnWhesjn2dduHM73OoHvN7kpUpm92WInk8MXDSvgD/ALw8X0fq3SX+l7CiidXoEqeKliwa4GyxFML9+Xv54/JbSbjQp8L8eXSrWY3JdaawQ0Gx7ueWF50SdE1peMY6FOnb53cV/I+FM1aFIv2LkpgrbNC+mHrD8genB0dK3W0YlMGLfW3fn9LVYr96/XH0VePqv1v7LoRTUs0VRXAj1t/tFKnDB7fmL/HqIrjtbteU3mzXBY+tlDdK8WzFceW57fg0YqPWltcJ8OLfOYgf3zQImMPjRSEtLD/3H7VYVgmRxm1TDcNLb4qeauo5ZsJhbVDhQ6Y9sA05M2cF8EBwehYuSNyhORQVr5mzZE16rhfrfUqnrrjKZXOz/yrnq86hjYaijgjLk0iXzBLQVWxzN85HxeuXlBxtK5HNh6J1mVaq+XUwDxoqbOM/z78txUL7D6zW51Ts5LNUD1/dSs2Zew6s0u5SNqVa4c3672JrMGOiqVUjlJ4r/F7yBmSE4v3LlZxKYXifiLqBAqGF8TLES+rvFnB1i9SH23LtlX3T2Iupgwt8lmDA/C/p4t5xdBIQUgp2p98z5R7lJ/5+f89n2D53ZXvqmWmu1lkzpQZz1V/Tom2huLETmA764+tV6I/ePngeH+wDm1/bKtaBFtPbrVSp5y36r2FuwrepazrIh8WQcRXEfhs3WcJ/PGp5bFKj6nWwOSNk+NdSnTfRMVE4YkqT6jKKjWw85yuGfrDw0aGJSiTGhNrxAuxrrRSAjvk2THPFhT7PKKuRal+j9/2/oaftv3kdiRWhhb5LMH+KCbWuyBkONLib08ObDn81uk35Xp5sNyDOHzhMHou6okSE0rg243fWqlSxx1570DtQrVVRbXnzB7lZlm4d6GKv7PgnVaqlMMyYQsmPWDl+0bdN5DJP5Oq/Nl5nOX9LGjzYxvVD/J01adRLlc5K3VCvMInLwi+iPYnD204NIEv+c26byZYZrqMRsXcFdV0bNOx6hhdBbp80gItavZF0C9/+NXDKr+ggCC8t+o9HL101EqVciiUnat0Vh257Dug22bj8Y2qU9bu708p7GPhdetaravL8mBY9sSyVA2LZQXCloefn59y/7Ac6Fqj+4bXYMDdAxJtgYjIC8It5uyVs0p4KBCEP2j+gAP9HWPmMyL0vecLy4fBfw7GpP8mefQxf+bVcXZHTFgzAccuHVNxFDA+iMQORvqnr7n4DCf91BxCyaeHad26o1GxRiiXsxxmbp+p3CvsjE2Lr5+w4iuWtRimbJqCEStHxB+7Jzh68ajq42ClN+/heaqz/mKfi9j10i48W+1Z5Z+3w8qK9xQRkRe8Er6+gK8xyFPpTRSvNRB/rt6Nc+ej0aTDRyqO4dfft1mpMzb05dLnTd832XZym/qR0krLqNA1QHGhD/qlX15C/rH5E/ig0zq2n0MZ+yzuo9wzOs/yn5bHhuMbVGdj/vD8VsrrtCnbRlm4/9v9PzVeX2/n6l0zdAe1L98ea4+uVe6flmVaqo5mZ1gB6Hx4jkzPoM+XzznweQfCPHvV7qXm2VdhP3Yd9Dj2lBIcGKyMgF/3/KrG8etnGBg4Zp7PBuhx8SSiQITqvCYi8oJwi2EHJjvVMgVkUg8csUNNL2dk+tXrhxntZyhfNsXVU3C44yf3f4I2ZdrEuzZoqdJNweGaX7X6Kt5KtUNL/MNmH6p0zpatK+jrZ2skW3A2NULFE3AII/sSWBHxGnoKVkAv1nhRnRfLhEM9NRyFxAq19Q+tsf3UdhVHA0GXnR9fbc6Za1dvHFyfKZPrm+z0SddNoZy5b6wJXWF44D3v6c3GDevUtFCh1D0UcatxvhYH9u1BnnwFrCVBEJYdWKZe0NakeBN80/YblxVHRmHVoVVoN6MdGhRtoCo5e98BR9y0n9FetXK4To+VDxw2DJnMkO6WPAXdOQiCINwqrsReUcMOH5/9uLKMu9XqpoYoZmSdoguKrrHoa9Gqw9g8QhXPoZSrIlcpoac7h52/znjckvcVEU/sHL0FseQFISH0nfMZBL78jdDFNK7ZODXSJjlwZMutgq956Dy3c6KvM2BHPR9KG9N0THyLxOOWfHJqP51GggQJEm5FILTeK+epjOkPTMfjlR+/YX1iJCdNesH+hjkd5ihfv30IJv3+HPP/U/ufML75eJcuJ49Y8vrEna1HVwVyqwoppYglLwi3F64s9cSs91tp1ScXj1nyiQm5jtfz7uIk3IQg5S5BQqLBlS7Z45xxFZdRSZMl73yiOXLlseYSFk5cnONRX28qmNOnTlhz3klO27UgB/fvRe68N44tFgThOtpC9/d32L9ctlvtzhZ8RrbotSWfapF3Fmwu645XBgo7Q2xsbHycxj6fUTnj5SJvr3BJ5IF9yJUnn7UkCIIdZyFnCAgIUGLPoOP0ejvOyxmFNIn8qRMJH9fVok1h4TyF/dq1awgLC8uwBSAIguAO6tjp06eVDlLwvU3oU+2Td7bC9TKndoHPnDmzCLwgCF4LhT1nzpxKz5w9EnqqcV7OSKSp49V+wgzaPXPlypV4n5YgCIK3QqG/evWq0jXqm9Y6oqcZnRQpsauTsp8wAwsjJub6F2QEQRC8GepZUpY8cRWXEUi1uW0/IT2vO1vZvBEEQfAFqGfUOGobcaV9GZk0u2uuB8eyFnpBEARfYNfkyZhduTKWdeiAq+fO4cjixfipZEnMrVYNZzdutFJlLI789hsu7Nmj5lMl8s61lxJ4/imxv17jCYIgeD0BAWoIYkBYmJoPyZMHmbJmRVCWLAjOnTteD2MuXcKfHTvip2LFEoT5ERFY88YbiD58WKVLC9fOn8ffr7yCFU8/rfaXHJIt8jcKu2M5Pt6ccl4HQRAEXyCUrxt3oW1+HFziNMDElfJdOXkS+777DotbtcKZ9eut2NQRe/myyiPuyhUrJmnS7K5RU5sVzyCWvCAIvoLSNXMakj8/AkJDEWha8YGWVa+E3om89eqh7ZYtaL9/P9rt2YNmS5eiYLNmuHLqFDaNHJlsC9xTpEnkiaXzCUSeQRAEwRcIypEDgVmyxGubf0gI/DNlQmiBAkr03eFnVgRZSpZEtcGDEVakCKIiI5XIn9+xA/Nr1MDv7doh5sIFK/V1ji1bhlllymD9gAGIuXgx3g20oFYtXDQrj+MrVmBOxYoJ3ELbP/3U2johKRZ5u4DHz1tTXQj2NIIgCN5MlnLl0NwU3erDhqll+uGbLl6MepMnOyx6k6Q0L+7aNcTFxirRp/VP4c979904t3Urzm5z+haxmVfk/PkICA5GkQce4OO01orUkSyRdz4BVyek4zhN6oQFQRC8BbumudI25zj7kmEK+/nt27F+4EDV8UphD86VC36BgShmWvFxMTGInDePmVhbAJdMa//EqlXIU7s2spvWOiuSu6dNU+6flv/8g3DTare7hHQo98ILVg4JSbW7Jv6kLX+8mjenrgpBEATBm7Frm/O8M3ZXykzTYl/UrBmOmpZ/zmrVUO7FF+Mt81w1aiBHlSpK0Omv15z6919EHzuGkk88gYCQECs29aTZJ69xdbKCIAi+REp1jhZ7tgoVUHP0aDT4/nvlx9fQz093zIXdu3F85UoVx9EzB2bPVuLPSsATeEzkNfZaThAEwdtJqaYlGF1jCniTX35BsfbtXVrl+e+5B5kLFlQPWBkxMbh04IB6wIriz0rAE3hU5EXcBUHwVdJD38IKF0b+xo1xwrTkL+zdi0M//4zAzJmV+HsKj4i8iLsgCLcLHtU7Pz9ltcdGR+PAzJk49scfKPrgg0r8XcGhmxy2eWrNGkTOnatG7SSFx901RERfEARfIb31jCNockZEYPvHH+P8rl3qwanEhk0GZc+OPPXqKd89X5Uwq3Rpz4+TFwRBEDwHffX02XMMfc7q1ZGlTBlrjQtM8a/UqxfKvfRSgk5cdyTr83/2mozz/PwfpwxxDNYL9cOzZsdls4Y5d+4cypcvb20hCILgvaxfvx7ZsmVDiCnGgYGB6oNI+vuv+pOAOmhS9FU8U0O3f/IJtowZgzvHj0eh++6zVqSNVH/+T/Bu3nvvPXUDzuMDGBau4tLKxYsX0ahRIxU478uw3FJSfmPHjlWfx/RkeXuSI0eOoJjZ/LdfO1dxQtrhKw22mPfD5lGj1MNP+e6+21rjOUTk3aBvbP6A7SFHjhx4/fXXcf78eSulIAhC8uH73ulHn1O5MraaIs/XHNQYMSL+NQmeREQ+GRQvXhxdu3ZV4ZlnnkGuXLkwcuRIZdUcP37cSiX4MrReX3vtNTz00ENptmR79OiBqKgotG7d2ooRblcyhYej+GOPof433yAzX2mcDojIJ4MGDRrg888/V2HixInYvn07hg8fjnXr1uGHH36wUgm+zAWzWf3TTz/h5MmTVowgpJ4CTZqoh6XabN6MCNOCDy1Y0FrjeUTkUwE7XZ544gkUMmvef/75x4oVBEHIeIjIpxIKPYMd7cN/8sknrZjruFrHZr/unDx69CjeeOMN1SFHvz8rkO+//z7ByCZ3bNmyBa1atUJQUJDantOePXvikoc/UMDj+eOPP1C/fn11/rqPYtSoUYl+wD06Ohrvv/++SqfT81xdHRu/is/WUeXKlVVahnz58mHYsGHx6fn1/MfMJi7z2bRpk4qzc+jQIeVio2uFaYnOl6O+dL5sobHckoLXrKBpaR04cADLli1DlixZ1PbssHZmxYoVqFOnjlrP8nnkkUfUtbXjqqOb5bpgwQJUr149/vh4DrNnz7ZSuIdlPH78eLWNffvVq1dbKRzwfFu2bBl/7Xiffffdd6p8BN9ERD6VnDp1SnW8cmhVWuGwU/pp+YPkD3XIkCGqAujYsSN+++03K1XisAK5//77sXHjRgwcOFD9aNu3b69GcfTu3Tte6DzB2rVr1b7Onj2rjnXKlClKmLifDz/80Ep1HZ5bt27d8Nlnn2HQoEH48ssvUa1aNSV0Dz74YAL/NoWKfR4URlZ2TMtQsWJF9O/fH23btlXDczmMjSLPY/j999+tra/z559/KkGmyDMtBZSV0KOPPooSJUqoY2alsd9sLterVw9///23taVrXnrpJeWqy549O8qVK4dvv/0WP/74I9q0aWOlcECB57HXqlVL7ePee+9VFUvnzp2T9OOPHj1a+ei5D57zhAkTEB4erlyDSREZGakqrFdeeQUVKlRQ+2YeERERqow0PE+eL/McM2aMSlO2bFl06tRJlU9yDQrBy+A4eYarV6/eEDRxcXHxwazxjeNHDxvHjhwyjh6ONA4fOmhEHthnHNi3xzh9+rRx+PBhY+vWrdaW3g3PpWjRoob5I7ViHERFRRldunQxzB+kYYqeFZt4euJq3YULF4yGDRvyl2V07do1QZmb1rJhWuOGKUyGaSFbsa4xLUXDFFF1XBrm1aFDByNnzpyGab1ZsYYxYsQItb+5c+daMa7jEuO///4zzBaGYVYcVoxhnDx50jCFzTDF2Dhx4oSKs5+baQknODZua1ryap1ZIVmxhvHJJ58YpnVpmBWAutc0nDdFT6V/5513VBzP2bTKjebNmyfIm2XFMuM6piELFy40goODjWnTpiXId+/evUbJkiWNFi1aGGYFY8W6Rl8/nhPPzQ7LjcfG+8GsqK3Y69fArGgMs+KxYm8sb/5uatasaZitI8M0HFQcYTmxbN2h9+Hv72/MmDHDir2RY8eOGZUqVbrhWnD7p556KsF94upc3Z2/r7Nu3Tpjz549qgyOHz+ursmZM2cM0+BQ14vlYVbihtnSjA8s41sdrr71ltJ2seSTAd0Tzz33nApsutPtQkvOFA1lxaaV/PnzK/eFfviM0F1xxx13KCuNFq476M7gsYXaPkXGvGjJ0ZI2L7gVm3aqVKmChx9+OIGriqONaEHSWnV22dAypZVvPzZuy5FKPG+6LMzfkbLQJ02ahDvvvBPPP/+8ciVoOE9r86677lIuDfMHhrx58ypLma2f3bt3WymBgwcPKkue65iGrZivvvoKtWvXVpayPV+6M+i62LBhg0c6VHmMtOI1vAZsPfAYkjMKi+4oU3StJUc5sWzdYVa6qkxefPFFtGvXzoq9kSVLlqjWTffu3W+4T3jcLFPTOLNiBV9CRD4Z7Nu3D1988YUKkydPVgK8Y8cO5bbwBKVLl0aePHmsJQf88YWFhakfZlJNfUJx5Q+5b9++aNKkiRI4VhwUeNMCsVJ5BooRxZnuAYqnaQWqcqFQOu+L50a/rzM8Pro+6D9nftxu586dSuRducAYx3I3LSrl46ZYU0BZNnaXzcqVK2G2JpRwMQ3dFRRCuy/dHuhyosCZlq6VQ+pp3LixytOOrrh5bonBitC0xtVoLV47lm1i/RvObNu2TV1jVlbO+7bDcjEtTpgthgTnz9C0aVNV0bo7RsF7EZFPBvSp8kdAK4t+zOXLlysRofXpCXQnWGrhY9elSpWK9wFTVGk906fvaWg1UqDpj2alUqlSJQwdOhR3J/KkHisqLXTuoFCx1eGqQtCUKVMmQcuErQq2VubPn69aO7SYZ82apVpX9OMTiiUrAh4fW1+uAltk9NWnleScpyt47Xv16qWOg5UeyzZ37tz46KOPkhR7tvTYf8Fr4g7eq6xM2LfgqgwYnPsYBN9ARD4F8EfcpUsXvPvuu0rg2JlI8b+VUNy0q4etC7Y6vvnmG2XR093jSWjtsvKoUaOG6njmyBY+N8COyZSKJMWaFjc7RilynLKyo8glBtdlzZpVjaohtO7vu+++eJcNLdGlS5fi8ccfj28N8P0izJujjdjyYmesc2CHLlsjtxKeOzuT2YnOSqtkyZLKtdKnTx+39xivO+8BtkbcwXQcQcOWkqsyYKDLTfA9RORTAX3GbFZT7O3j5PlD4ogI7YKwQ3eEJ/y+ztAdQV8qhzTS0rXjTjBTA61Guo84VNMuihTsxM6NIzlc+aMpyLt27VJ+dlr7tOCLFCmiRoC4aiExjuvYH2L3U9PPzhYWXTbsO6GYt2jRwlrrqAg4bHLz5s1pcsnoyiK9odjT9cLzYeuDrht3/nxdkbN16Q72FdBd42rIqeDbiMinAgo5hzlSXDi0T/vM2RymNbRq1aoEPyY2udn09mQHqDMUMHsHLQWRQ/3SA3Zu2q1LunB++eUXaykh9J87ux0o2G+//bYSTd1ZSPcE3WK0yp1bSJyfOnWqOqennnoqgc+ebhmKIZ9GnT59unrmoGjRotZaqDcHsiLgcYwYMeIG9wevFf3VScGKiJUQK++kXCgphfnZhzoS7o8uGB4/hT8xKN60zseNG+f2PGgEsIw5jJVDR+2cPn1adU4LvomIfCrhD4vvMlm0aJESJULRolDRsm3WrJnyVdOdwbRshjt3rnoC5knL9ddff1VuB4ohX55GYfN085sdpRxnzTHcHGXEfXFUD104HG/tCm6zcOFCVR4sC46lpx998eLFeOedd5TrR/PCCy8o9wuPnxY+0zNw25dffhnPPvuscpfZ4UgRjren5UtrlsflbHHTDcJ82XFOf/3HH3+s8mWHY926dZXrKSkouuz4/ffff5X/nL5tnr8nYCuIZcLj4XExX45gmjlzpjofdyNsWOGxEuU5s7LjOH1uz3z4rATvC8LKkG49tqBo/bOMWSmyzAsXLqw6pgUfheMoGThe1jlo9Bh5Bhknfx099ti0kAzTcldxLCPzx2MULFiQpqiRKVMmo0ePHsaOHTsSHSfvauyxXsdteBzuMFsSah/cF/fJYzJFL9lj4l3FJYZZWRmmAKlx2dzGFBZj+/bt6rwyZ85smCKo0tnPjedu38YUfjWm2z5mXWO2dgyzIjCKFSum0ur0zmPz7ezevdvInz9/grHxzjDfkSNHGqZ1HJ8vy8ldvs7w3DkmndvyXCZNmqTi9Th5V+Wn17GMNc7lzWPr169fmo7NbF0ZZiUYfw/w+MwKOcEzEixvs3I1qlWrFr8f7rNv375qzLdG3/f2+9JV3O2Ct4+Tl4+GCIIguCHdPxqSTshHQwRBEG4DROQFQRB8GBF5QRAEH0ZEXhAEwYcRkRcEQfBhROQFQRB8GBF5QRAEH0ZEXhAEwYcRkRcEQfBhROQFQRB8GBF5QRAEH0ZEXhAEwYcRkRcEQfBhROQFQRB8GBF5QRAEH0ZEXhAEwYcRkRcEQfBhROQFQRB8GBF5QRAEH0ZEXhAEwYcRkRcEQfBhROQFQRB8GBF5QRAEH0ZEXhAEwYcRkRcEQfBhROQFQRB8GBF5QRAEH0ZEXhAEwYcRkRcEQfBh/AzA/Adcu3pVRdjJlCmTmhqGSqLg/KkTx9SUIY4hNhZxcXEIz5odly9fxrlz51C+fHlrC0EQBO9l6eJFyJIlC4KDgxFoaqK/nx8CAgLg72/ayOa8n5nGj1MzaOzzt4qsY8ch+7gPReQFQRDcsW3bNmTLlg0hISFKEynuWuS1uGdEkcegQcDAgeKuEQRB8GVE5AVBEHwYEXlBEAQfRkReEATBhxGRFwRB8GFE5AVBEHwYEXkf58iRIyhWrBiefPJJK8Y98+bNQ+bMmTF27FgrJmNx8eJFNGrUSJ0Tzy2xuIxGSq9DcnnvvffUcD1eNw3nGcd1ScE0YWFhWLNmjRXjOVJyHEL6ISLvBv3D5I1qDzly5MDrr7+O8+fPWykFQRAyJiLyyaB48eLo2rWrCs888wxy5cqFkSNHKuvx+PHjVqpbR0xMDN5//300aNAgzZZs69atERUVhR49elgxgiB4MyLyyYDi+fnnn6swceJEbN++HcOHD8e6devwww8/WKluHXzKeMGCBdi/f78VIwiC4EBEPhXwkeYnnngChQoVwj///GPFCoIgZDxE5FMJhZ7BjrvONVfrdIchw9GjR/HGG2+oTk/6/VmBfP/99wneG+QKdmrx5UnLli3DgQMHULBgQbW9q2PgPuhyCgoKUmkqV66strOTWGfZ7t270aFDh/htw8PD0bdvX9WKSAqewx9//IH69eurMtPbjxgxwkrhIDIyMsHxse+Dbqjo6GgrhWdgfuPHj1duOO6HwV1ZcLpixQrceeedapnn8Mgjj6jydCY2NhbfffddfN5M26VLlxS70djfw36ffPnyxR8jW5Q7duywUngWXqMlS5aoctDH3bJlS5f74zmyBcv3U9mPbcuWLVaKpNHXmveB3l/Dhg3x77//WimArVu3Ktfo008/fcPv4JVXXlG/FWcja+7cuSqv3377zYoRRORTyalTp9QPkS8uSisUSvrAV69ercRnyJAhqgLo2LFjkjdrmzZt8O2336JcuXLInj27cin9+OOPeOmll6wUDni8bH3QpfP111+je/fu6gf8wAMPKLeTO7i+Zs2a+PvvvzFw4EBMmTIF999/P9auXav6A9xx7do19OnTR/2AKYpjxoxRIkjh4zFpeFyNGzfGnDlzMGDAALWPJk2aqIrk1VdfVfl4ig8//FCJRK1atdR+xo0bp44lsbKgwD/11FO45557VPp7771XiRxFyl4B8Ri7deumrhsrqC+//FJdT17Xhx9+GCdPnrRSJg2vD8uqbdu2qrwGDRqkRsBwmQLpaWhQsBJnmevrs2jRItx1110JyoRiO2rUKDz66KMoUaKEKo9hw4ap61evXj11jyQFK9MqVapg6tSpePbZZ9X92rt3b6xfv17t76efflLpihQpotJt2rQJZ8+eVXGE5bh48WJV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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run a single code cell in Azure:\n", - "\n", - "- Click inside the cell to select it.\n", - "- Click the Run button (right-pointing triangle for 'play' in the toolbar)\n", - "\n", - "![image.png](attachment:4dc097e1-dbaf-452d-951f-6917b20d0bb9.png)\n", - "\n", - "The code will execute, and any output (like text, numbers, or graphs) will appear below the cell.\n", - "\n", - "👉 Tip: If a cell has been run, a number appears next to it, like this: [1]. This means it was the first cell run in this session." - ] - }, - { - "attachments": { - "adda38fc-7e85-4e83-a1ed-60dff732a84e.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run the **whole** notebook (all the code cells in a single page, a \"notebook\"):\n", - "\n", - "![image.png](attachment:adda38fc-7e85-4e83-a1ed-60dff732a84e.png)\n", - "\n", - "--------------------------------------------" - ] - }, - { - "attachments": { - "e4215b07-982a-4b44-961f-c7d2c495d363.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Erasing code that has already been run in Jupyter Notebooks\n", - "\n", - "You can also erase all or some of the cell outputs.\n", - "\n", - "![image.png](attachment:e4215b07-982a-4b44-961f-c7d2c495d363.png)\n", - "\n", - "-------------------------------------------------" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Viewing a Jupyter Notebook in Azure\n", - "\n", - "To use a notebook, you'll need to OPEN a notebook. In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. IN the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", - "\n", - "![opening_notebook.png](./images/opening_notebook.png)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How should you use Jupyter Notebooks from the Sandbox tutorials?\n", - "\n", - "While there will surely be sets of directions unique to each tutorial, they are written in a similar fashion.\n", - "1. A title, overview, learning objectives, and pre-requisites for the submodule or the specific Jupyter notebook.\n", - "2. A \"Getting Started\" list, for how to work on the specific notebook\n", - "\n", - "So, do read through that initial material. It may look similar from notebook to notebook, yet have unique and VERY helpful information.\n", - "\n", - "Often, the **first code box** in the tutorial will be one that you should \"run\" because it will have many pieces of code that will be necessary for that particular page, or at least the code boxes on that page, to function as the author intended. \n" - ] - }, - { - "attachments": { - "3eced4ba-4bf4-4f9a-8ad1-35129c2b1118.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "# Adding code or markdown boxes\n", - "\n", - "You can create a code box or a text (Markdown) box very easily.\n", - "
\n", - "In Azure, to add another box hover over the space above the left side of a current box, and the following options will appear:\n", - "\n", - "![image.png](attachment:3eced4ba-4bf4-4f9a-8ad1-35129c2b1118.png)\n", - "
\n", - "Simply click on one or the other." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "After this module, you should have a stronger understanding of what the Jupyter Notebook is and does for you. You are ready to use these notebooks to run code in the tool of your choice.\n", - "\n", - "The next tutorial shows you how to use Microsoft's Azure ([Azure ML](./Module_0_Tutorial_3_AzureML.ipynb)) for cloud computing." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Clean up\n", - " In the main tutorials, you'll be reminded here to \"shut down your compute instance.\" Check out the Azure tutorial for more explaination." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb deleted file mode 100755 index b01a502..0000000 --- a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3_AzureML-checkpoint.ipynb +++ /dev/null @@ -1,303 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Submodule 0 Tutorial 3: Notebooks in Azure ML\n", - "------------------------------------------------------" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "This tutorial is intended to get you started on Azure ML with a **compute instance.**\n", - "\n", - "The process is not (novice) user-friendly *the first time.* You will have to set up a few things (accounts, subscriptions, workspaces) but these will be your defaults after the first time. It will thus be really easy to go back to or to use AzureML for other cloud computing modules provided at the NIGMS Sandbox. \n", - "\n", - "The steps below for setup might take 10-15min. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Learning Objectives\n", - "After this tutorial, you should be able to:\n", - "1. Understand what Azure is\n", - "2. Create an Azure account\n", - "3. Create a subscription\n", - "4. Create a workspace\n", - "5. Import Jupyter notebooks to Azure ML\n", - "6. Start & Stop a compute instance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "You will need to know your Microsoft account login information, if you already have one\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Background: What are Azure and AzureML?\n", - "\n", - "Microsoft Azure is a platform that lets you use remote computers (\"the cloud\") to run programs and store data without needing the physical hardware. Azure can provice a virtual environment where you can run Jupyter Notebooks, Python or R programs, or other tools.\n", - "\n", - "Azure \"Machine Learning\" (ml.azure.com) is a service within Azure that makes it easy to set up and manage Jupyter notebooks in the cloud. It’s useful if you need to run data analysis or machine learning experiments on more powerful machines than your local computer. You can choose different numbers of virtual \"cores\" (the numbers of parallel computers processing your program) depending on your needs. \n", - "\n", - "The remote computers are secure and cost a nominal amount to use. \n", - "
    \n", - "
  • If you have an NIH Cloud Account, the costs are covered when you use your Cloud credentials and subscription. (See tutorial 3b to learn how) and skip to Step 4
  • \n", - "
  • Otherwise, you will have to provide payment information for your work
  • \n", - "
  • After that, you will need to create a workspace to be able to run the NIGMS tutorials now and, hopefully, your own data analysis in the future. At first, this seems overly complex since you only need one place to work. Remember that this is a tool for programmers and for companies who may have lots of projects running.
  • \n", - "
\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 1: Create a Microsoft Azure account\n", - "\n", - "You need to make an [Azure account](https://azure.microsoft.com/en-us/pricing/purchase-options/azure-account/).\n", - "\n", - "The tutorials offered at the NIGMS Sandbox are all short enough (computing time, your time) that you should be able to use only the free tier of an Azure account.\n", - "\n", - "![free_azure.png](./images/free_azure.png)\n", - "\n", - "After selecting the free account button, Microsoft will take you to your login (if you already use a Microsoft account). If you do not have an account with them, you can make one (or sign in at this menu)\n", - "\n", - "![azure_signin.png](./images/azure_signin.png)\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 2: Set up your subscription, if not provided by your University or the NIH\n", - "You need a subscription to use Azure computing (required for running Python or R code). If not provided for you through your organization or the NIH, this is probably the most complicated step. \n", - "\n", - "The process assumes that you are creating an account for a long-term relationship with a substantial budget. Generally, you can accept the default information.\n", - "\n", - "Cost Details:\n", - "- Azure will provide the first $200 worth of charges, which is an enormous amount of computing if you are just learning and running notebooks\n", - "- The cost is low (~ 15cents/hour for the smallest virtual computer)\n", - "- You will need a credit card, so they could charge you for use of computing after the trial period has expired.\n", - "\n", - "### To create the subscription\n", - "To create an Azure Machine Learning (AzureML) subscription where you can run the Jupyter Notebook tutorials, you need to first create a regular Azure subscription if you don't already have one. \n", - "\n", - "1. Select the subscription icon\n", - "\n", - "![azure_services.png](./images/azure_services.png)\n", - "\n", - "2. In the new page, select add (to create a new subscription)\n", - "\n", - "![add_subscription.png](./images/add_subscription.png)\n", - "\n", - "3. Choose Your First Subscription Type\n", - "You will likely be offered one of the following options (see table). The student account, if applicable, is ideal because the $100 credit does not have a time limit. \n", - "\n", - "|Subscrption Type | Description | Recommended for |\n", - "|:---------------|:----------------------|:------------------------|\n", - "|Free Trial|200 credit for 30 days |First-time users & experimentation |\n", - "|Pay-As-You-Go |Pay only for what you use, no upfront cost |Faculty or staff|\n", - "|**Student (Azure for Students)**| **Free $100 credit (no credit card needed) +free services**|**Verified students (with .edu email)**|\n", - "|NIH Subscription|For CloudLab|See below|\n", - "\n", - "4. Provide a credit card for billing that subscription, if applicable.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step 2b: If you have an NIH-provided subscription\n", - "\n", - "It is hard to predict exactly what might happen when YOU log in. In order to switch to the NIH-cloudlab subscription, follow the following steps.\n", - "\n", - "1. In the upper right corner of the Azure Machine Learning Studio page is a button with your initials:\n", - "\n", - "![where2switch_subscription.png](./images/where2switch_subscription.png)\n", - "\n", - "2. The menu that will appear should give you the option to switch the account to an NIH CloudLab account:\n", - "\n", - "![switchSubscriptNIH.png](./images/switchSubscriptNIH.png)\n", - "\n", - "You will have to login again." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 3: Create a workspace\n", - "\n", - "AzureML requires that you do all of your cloud computing in a workspace. They imagine that you might have several distinct projects. You *can* run all of your NIH tutorials in a single workspace.\n", - "\n", - "To create your workspace, select this button from the home screen of a different part of Azure: [Azure ML](https://ml.azure.com/)\n", - "\n", - "![create_workspace_button.png](./images/create_workspace_button.png)\n", - "\n", - "It will open another menu where you need to provide an official name that is unique within your group (i.e., Tutorials). You do not have to make a \"friendly name\".\n", - "\n", - "The pull-down menu should have your subscription option.\n", - "![create_new_workspace.png](./images/create_new_workspace.png)\n", - "\n", - "Your [Azure ML](https://ml.azure.com/) (at ml.azure.com) will likely open directly to this when you return OR it will be the top option under the left menu option of \"Workspaces.\"\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 4: Loading the tutorial into in AzureML" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Notebooks\n", - "Azure uses their \"machine learning studio\" to view jupyter notebooks. \n", - "\n", - "1. Go to [ml.azure.com](http://ml.azure.com)\n", - "2. Select the notebook option (** if your system opens up with workspaces, click on a workspace & it will take you to this menu list)\n", - "\n", - "![notebooks.png](./images/notebooks.png)\n", - "\n", - "3. To add the tutorial folders/files, you should upload with this button (OR you can clone a repository with the \"elegant\" directions in [Github download tutorial 1](Submodule_0_Tutorial_1_GithubDownload.ipynb)\n", - "\n", - "![upload.png](./images/upload.png)\n", - "\n", - "With the + button, you can upload the zipped modules that you have downloaded from Github. The entire file structure will be reproduced in Azure notebooks when you upload the whole unzipped folder. \n", - "\n", - "![upload_folder.png](./images/upload_folder.png)\n", - "\n", - "
Attention: The Sandbox tutorials assume that you will have the folders that they provide. Hyperlinks usually refer to the folder, not to a web address. Please upload the whole tutorial folder.
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step 4: Open a Jupyter notebook\n", - "\n", - "In Azure, after you've loaded in some notebooks, you need to open the folder, then double click on a notebook so it will open. In the image below, the arrow shows where you can find the list of notebooks. Circled is the button to expand the notebook & shrink the file structure. \n", - "\n", - "![opening_notebook.png](./images/opening_notebook.png)\n", - "\n", - "NOTE: You cannot **run** any code boxes in the Jupyter notebook yet! If you click on the \"play\" arrows nothing will happen until you start a compute instance (see next box) \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Step 5: Start & Stop compute instances\n", - "While you can read a Jupyter notebook in AzureML, or even in github, you cannot run any of the Python code without \"computing.\" This takes additional resources so Azure makes you initiate a \"compute instance.\" (Some places on the NIGMS sandbox say \"spin up a compute instance\" but it really all just means \"start up\" or \"turn on\")\n", - "\n", - "This is a technical name for starting cloud workstation-- basically a computer operating through the internet.\n", - "\n", - "This is the thing for which Azure will charge you, so you start it and stop it as needed.\n", - "\n", - "For NIGMS Sandbox Notebooks, there are two main types of \"Kernels\": Python or R usually with a number for the version. \n", - "
\n", - "![List_of_kernels.png](./images/List_of_kernels.png)\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## To START the compute instance\n", - "It is simple to start the compute instance. Above the notebook on the toolbar, there is a \"play\" button (right pointing triangle).\n", - "\n", - "![startCompute.png](./images/startCompute.png)\n", - "\n", - "\n", - "When you click on that, it will take 1-2 minutes for the cloud workstation to start up. During that time, you *can* run code boxes and the system will queue those boxes until the instance begins.\n", - "\n", - "
\n", - "TYPICALLY, the correct type of kernel will start up automatically with the next step. If it's Python, you should see the following banner in the upper right:\n", - "
\n", - "\n", - "![type_of_kernel.png](./images/type_of_kernel.png)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## To STOP the compute instance\n", - "When you have finished with the jupyter notebook, you should **stop** the compute instance because you are being charged for the whole time it is running, whether or not you are actively using the tool. \n", - "\n", - "To stop this, use the stop button that is in the same spot as the start (\"play\") arrow. It is a square in a circle on the toolbar.\n", - "\n", - "![stopCompute](./images/stopCompute.png)\n", - "\n", - "Sometimes a compute will start automatically, so it's important to check to make sure it is not \"playing\" when you don't want it to be.\n", - "\n", - "*Azure can be configured to stop the compute automatically after some time, but be sure to STOP at the end of your work time to avoid being charged per hour* " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "After this tutorial, you should have all you need to run the tutorials in AzureML.\n", - "\n", - "You can now:\n", - "+ learn how to [leverage Github for FAIR data practices](./Submodule_0_Tutorial_4_Github4You.md) in your research lab\n", - "+ Return to the folder list and proceed to Submodule 1\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Clean up\n", - "
Attention: To avoid unnecessary charges, please STOP your compute instance if you started one.
\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb deleted file mode 100755 index 3e87a2a..0000000 --- a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_3b_AzureML_CloudLab-checkpoint.ipynb +++ /dev/null @@ -1,85 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "f5e4cdce-9644-4d62-8181-e91e2e5bf8d4", - "metadata": {}, - "source": [ - "# Submodule 0, Tutorial 3b: Using your Cloud Credentials on AzureML\n", - "-----------------------------------------------------------" - ] - }, - { - "cell_type": "markdown", - "id": "3bf6db1e-62fc-4e4f-b090-2d0c4fb3efd3", - "metadata": {}, - "source": [ - "## Overview\n", - "This mini-tutorial is designed for those needing and using an NIH Cloud Lab assigned NIH Cloud Lab account on AzureML. NIH extramural researchers, including INBRE, can often obtain an account for cloud computing that will be managed by and paid for by the NIH.\n", - "\n", - "## Learning Objectives\n", - "\n", - "You should have signed up with or requested a CloudLab-paid account for Azure\n", - "\n", - "\n", - "## Prerequisites\n", - "\n", - "You need only know your university affiliation and your email.\n" - ] - }, - { - "cell_type": "markdown", - "id": "ba80c35a-c7d4-4d17-a661-1e89c7e73aa1", - "metadata": {}, - "source": [ - "# Step 1: Request an account\n", - "\n", - "Proceed to the registration form at the GitHub page for the [NIH cloud lab](https://github.com/STRIDES/NIHCloudLab/blob/main/SignUp/extramural_account_registration.md). Be sure to scroll down to see all the useful directions on that page.\n", - "\n", - "**Note:** They recommend using an incognito window (browser.) To make such a window on Google Chrome, click on the three dots in the upper right-hand corner of the Chrome window. A top option is \"New Incognito Window.\"\n", - "\n", - "You should be contacted with additional information after completing the registration form with one of their many options." - ] - }, - { - "cell_type": "markdown", - "id": "029c1d82-1eb6-4ea4-bf15-05f93efdf051", - "metadata": {}, - "source": [ - "# Step 2: Using Azure\n", - "\n", - "You should be able to return to the [AzureML module](Submodule_0_Tutoral_3_AzureML.ipynb), starting at step 3, to make a workspace and use your NIH subscription. The latter is what is paying for your cloud *computing* so you must have a subsription to select. \n" - ] - }, - { - "cell_type": "markdown", - "id": "89670a62-9271-4a91-868b-769247f5be86", - "metadata": {}, - "source": [ - "# Conclusion\n", - "This mini-tutorial was designed to direct you to the NIH CloudLab information. You do not have to use CloudLab; you can use pay-as-you-go on Azure and other Cloud Computing platforms. Regardless of what tool you use, be sure to **always turn off the computer (\"compute instance\")** when you leave. Even tens-of-cents an hour can add up if you forget it's running." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md deleted file mode 100755 index 5106ce4..0000000 --- a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_4_GitHub4You-checkpoint.md +++ /dev/null @@ -1,273 +0,0 @@ -# Tutorial 4: GitHub For YOUR purposes ----------------------------------------------------------- - -## Overview -Git is a powerful version control tool that helps track changes to your data files over time. While Git is traditionally used for computer code, it can be just as effective for managing structured data by recording each change, allowing you to compare versions and collaborate efficiently. - -

- - NIH/NIGMS Sandbox Foundations of Python Video 1 - -
- Click above image to watch introductory video -

- -

- - NIH/NIGMS Sandbox Foundations of Python Video 12 - -
- Click above image to watch introductory video -

- - -## Learning Objectives -By the end of this lesson, you will be able to: -- Define FAIR data practices -- Understand the purpose of git tools -- Create a GitHub account -- Set up GitHub Desktop to track data files (Excel, CSV, etc.) -- Create your first repository -- Push data to GitHub (your first "commit") - -## Prerequisites -None - -------------------------------------------- - -# FAIR Data principles - -You may already have seen that the NIH requires researchers to share their data in ways that make it FAIR to maximize its value. Ensuring data is well-documented, openly available, and in standardized formats not only enhances transparency and collaboration but also aligns with NIH’s commitment to advancing scientific discovery. - -The FAIR data principles are: - -- Findable: Data should be assigned unique identifiers (e.g., DOIs) and be discoverable through metadata and search engines. -- Accessible: Data should be retrievable through standardized protocols, with clear terms on access (open or restricted). -- Interoperable: Data should use standardized formats and vocabularies to enable integration with other datasets. -- Reusable: Data should be well-documented with clear licensing to support reuse and replication in different contexts. - -## Why Research Labs Need Version Control for Data? -Research labs handle large datasets, evolving protocols, and multiple contributors over years. Without version control, it’s easy to: -- ❌ Lose track of previous datasets when files are updated. -- ❌ Overwrite important files when multiple people are working on them. -- ❌ Forget why a dataset changed, especially if students and researchers rotate over time. - -How can GitHub Desktop helps with these challenges in data management -- Automatic version history for all data files. -- Clear tracking of protocol changes in README files. -- Collaboration with multiple researchers while preventing data loss. -- Integration with automated checks for data integrity (e.g., missing values in CSVs). - -The key word: *AUTOMATICALLY* though we'll not get to THAT until the next tutorial. - -Version control tools like Git provide a structured way to track, manage, and document changes to data over time, ensuring that every update, correction, or modification is properly recorded. - -

- - NIH/NIGMS Sandbox Foundations of Python Video 2 - -
- Click above image to watch introductory video -

- - -### Why Version Control for Research Data? -
1️⃣ Ensuring Data Integrity Over Time -
-Many research projects span years and generate large datasets. -Without version control, researchers might accidentally overwrite or lose critical data. -Git keeps a full history of changes, so you can always revert to a previous dataset if errors occur. -
2️⃣ Managing Changes in Protocols and Methods -
Research methodologies evolve over time—new equipment, updated software, or adjusted data collection techniques may be introduced. -
-If a dataset changes due to a new collection protocol, Git allows researchers to: -- Document protocol changes in commit messages. -- Compare "before and after" versions of the dataset. -- Maintain a clear audit trail of why and how data collection changed over time. -
-3️⃣ Tracking Contributions from Multiple Students and Researchers -
-Labs often have a rotating group of students and researchers working on different aspects of the same dataset. -Without version control, files may be duplicated, overwritten, or lost. - -With Git, every change is linked to the individual who made it, making it easy to: -- Assign credit for contributions. -- Resolve conflicts between different updates. -- Prevent accidental data loss due to human error. - -
-4️⃣ Supporting Automated Data Collection and Analysis Pipelines -
Many labs use automated sensors, scripts, or instruments that generate data continuously. -
Git can be integrated with data pipelines to: -- Automatically log changes when new data is added. -- Run data validation checks to detect anomalies. -- Ensure that analysis scripts always run on the correct version of the dataset. - -
-5️⃣ Reproducibility and Compliance with FAIR Principles -- Scientific research relies on reproducibility—other researchers should be able to replicate results. -- Keeping a clear history of data versions, updates, and methodology changes ensures that future researchers can trust and understand the dataset. -- Many funding agencies and journals now require data provenance tracking, which Git provides naturally. - -Now that we understand why research labs need version control, let's set up Git to support long-term data collection. - -### Step 1: Creating a GitHub Account - -Before you can start using GitHub for your materials, you need to create an account. GitHub is a platform that allows you to store, share, and collaborate on code. It is widely used by developers, students, and organizations for managing software projects using Git, a version control system that tracks changes in your code. - - -To get started, you need to sign up for a free GitHub account. This will give you access to your own profile, repositories, and collaboration tools. Follow the steps below to create your GitHub account. - -- Go to GitHub's website -- Click on Sign up in the top-right corner. -- Enter your email address, username, and password. -- Click Create an account and follow the instructions. -- GitHub will send a verification email. Click the link in the email to verify your account. - -

- - NIH/NIGMS Sandbox Foundations of Python Video 4 - -
- Click above image to watch introductory video -

- - -## Step 2: Setting Up a GitHub Account & Installing GitHub Desktop - -Before tracking your data, you need to install GitHub Desktop, a user-friendly application that simplifies version control without needing command-line commands. - -### Instructions: - -1. Go to [Github](https://desktop.github.com/download/) and download the desktop version for your operating system. -2. Install GitHub Desktop and sign in with your GitHub account. -3. Set up your GitHub profile with your name and email (important for tracking contributions) from the account you set up in step 1. - -

- - NIH/NIGMS Sandbox Foundations of Python Video 5 - -
- Click above image to watch introductory video -

- -## Step 3: Creating a Repository for Your Research Data -A repository (A "repo") is like a folder where you store your research data and track changes over time. - -### Instructions -1. Open GitHub Desktop and click “File” → “New Repository”. - -![NewRepository](./images/github_new_repository.png) -2. Give your repository a name (e.g., "Climate_Data_Study_2024"). -3. Choose a location **on your computer** where the repository will be stored. -4. Select Private (if you are using it for your lab group). You can name "collaborators" later (students, postdocs, etc) -5. Check “Initialize this repository with a README” (important for documenting your dataset). This is the appropriate spot to include summary information about this particular repository's purpose -6. Click Create Repository. - -

- - NIH/NIGMS Sandbox Foundations of Python Video 5 - -
- Click above image to watch introductory video -

- -

- - NIH/NIGMS Sandbox Foundations of Python Video 10 - -
- Click above image to watch introductory video -

- -Now, you have a version-controlled folder on your computer where you can store and track your research data. - -## Step 4: Adding Data Files to GitHub Desktop -Once your repository is set up, you can start adding data files like Excel, CSV, or JSON datasets. - -

- - NIH/NIGMS Sandbox Foundations of Python Video 9 - -
- Click above image to watch introductory video -

- -### Instructions: -1. Open your repository folder *on your computer.* -2. Copy or move your data files (e.g., temperature_data_2024.csv) into the folder. -3. Open GitHub Desktop, and you’ll see the new files listed as "Uncommitted Changes." -4. Add a commit message (e.g., "Initial dataset upload - July 2025"). - -![CommitMessage](./images/commit_msg.png) - -5. Click the bottom "Commit to _____" button (this saves the version to your local repository). -6. Click Push to Origin (this uploads your data to GitHub.com). -![PushImage](./images/push_origin.png) - - -**Why Commit Messages Matter?** -Every time you save changes in GitHub Desktop, you write a commit message explaining what changed. This helps future researchers understand: -- ✔ What was added/modified? -- ✔ Why was the data updated? -- ✔ Who made the change? - -The previous commit is NOT overwritten. Rather, the beauty of git is that it saves what has changed. Thus, it is possible to revert to a previous commit (if something has gone wrong) or to specify a particular version of a data set for a publication. - -## Step 5: Managing Protocol Changes & Dataset Updates -In research, data collection methods evolve. You might introduce: -- 🔹 New measurement instruments 📏 -- 🔹 Revised calibration methods ⚙️ -- 🔹 Updated sampling locations 🌍 - -Using GitHub Desktop, you can track protocol changes alongside your datasets. - -### Instructions: -1. Open your repository folder. -2. Edit or add a new protocol document (e.g., data_collection_protocol_v2.docx). -3. Open GitHub Desktop, and you’ll see the updated file. -4. Write a commit message (e.g., "Updated protocol to include new sensor calibration process") as above for data -5. Click Commit to main, then Push to Origin. - -Now, every protocol update is documented and timestamped, ensuring full transparency. - -## Managing a lab group using the same git repository -It is rather unlikely that ONLY one person would be the involved in collecting all of the data for a research lab. In order to control and protect overwriting, Git provides clear management tools. That is covered in the next tutorial. - -### Additional Resources: - -

- - NIH/NIGMS Sandbox Foundations of Python Video 13 - -
- Click above image to watch introductory video -

- -

- - NIH/NIGMS Sandbox Foundations of Python Video 14 - -
- Click above image to watch introductory video -

- -

- - NIH/NIGMS Sandbox Foundations of Python Video 15 - -
- Click above image to watch introductory video -

- -

- - NIH/NIGMS Sandbox Foundations of Python Video 16 - -
- Click above image to watch introductory video -

- - - -Go to the [next tutorial](Submodule_0_Tutorial_5_ManagingGit.md) \ No newline at end of file diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md deleted file mode 100755 index 1b4822e..0000000 --- a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_5_ManagingGit-checkpoint.md +++ /dev/null @@ -1,139 +0,0 @@ -# Tutorial 5: Managing your GitHub data repositories ---------------------------------------------------------------- -## Overview -This tutorial helps research PIs and project leads set up GitHub to manage lab data with clarity and control. You'll learn how to protect the main branch, require review of changes, and maintain traceability across your team’s contributions. - -## Learning Objectives -In this tutorial, you will strengthen your ability to: -- Explain the risks of uncontrolled data changes in research labs -- Define key GitHub terms like commits, branches, pull requests, and main -- Set up branch protection to safeguard official data and protocols -- Require collaborators to submit changes for review (via pull requests) -- Maintain a clean, auditable history of contributions and updates -- Apply Git/GitHub tools to support data integrity and FAIR principles - -## Prerequisites -Please complete Tutorial 4 before Tutorial 5. - --------------------------------------------------------------- -## Why use Git for your research lab team *DATA?* -In a research lab environment, managing data properly is just as important as collecting it. Labs often deal with long-term datasets, changing protocols, and *multiple* contributors, which can lead to data integrity issues if not properly managed. - -

- - NIH/NIGMS Sandbox Foundations of Python Video 11 - -
- Click above image to watch introductory video -

- -🧪 GitHub Repo Management Guide for Science Lab PIs - -🎯 Goal: -As the lab PI or project manager, you want to: - -- Ensure collaborators don’t accidentally overwrite important files. -- Control when changes are added to the main dataset/code. -- Require collaborators to submit changes for review before those changes are finalized. -- Protect your team’s research integrity and maintain FAIR data practices. - -GitHub makes this possible with a system of branch protection and pull requests—and you can manage it all through a point-and-click interface (no coding required). - -## Key Concepts (Plain Language) -🔹 What is a “commit”? -
-A commit is like saving a version of your file with a note attached—"I added this graph," "I fixed a typo," etc. Every team member commits their own changes as they work. - -🔹 What is “push” vs. “pull”? -
Push: Upload your saved changes to GitHub (shared with the team). -
-Pull: Download the latest team updates from GitHub to your computer. - -🔹 What is the “main” branch? -
Think of the main branch as the “official” version of the project or dataset. You want to keep it clean and stable—like a published paper. - -## Why You Should Protect the “Main” Branch -Without protection 🔒: -- A student or collaborator might accidentally delete or overwrite key data. -- Anyone could push changes at any time—even if they weren’t reviewed. -- There’s no record of who approved changes or when. - -With protection: -- Collaborators must submit proposed changes (like peer review). -- You (or a designated reviewer) can approve or deny changes before they go public. -- The main branch stays clean, traceable, and trustworthy. - -## Step-by-Step: Set Up GitHub to Control When Collaborators Can Commit -✅ 1. Log into GitHub and Open Your Repository -Go to github.com and click on the repository you want to manage. - -✅ 2. Go to Settings -Click the “Settings” tab at the top of the repo. - -In the left sidebar, scroll down and click “Branches”. - -✅ 3. Add a Branch Protection Rule -This sets the rules for your "main" branch. - -On the "Branches" page: -Click “Add rule”. - -In Branch name pattern, type: - -main (or master, depending on your repo) - -

- - NIH/NIGMS Sandbox Foundations of Python Video 8 - -
- Click above image to watch introductory video -

- - -**Check the following boxes:** - -✅ Require pull request reviews before merging -(This forces team members to submit changes for your approval) - -✅ Require status checks to pass -(Optional: useful if you’re using automated testing or data validation scripts) - -✅ Require branches to be up to date -(Ensures everyone works from the latest version) - -✅ Restrict who can push to matching branches -(You can list yourself or other senior members who are allowed to approve changes) - -Click 'Create' or 'Save' changes. - -👥 What This Looks Like for Your Collaborators -Now, your students and research assistants won’t be able to push changes directly to the official version. Instead, they will: - -- Create a new branch (a personal workspace). -- Add or update files. -- Use GitHub Desktop or GitHub.com to create a pull request (PR). - -You (or a trusted reviewer) will get a notification. - -You can review the changes, leave comments, and then click “Merge” to accept them. - -🧠 Think of a Pull Request like a manuscript submission—it gets reviewed before being added to the “published” record. - -## Summary: What You’re Gaining - -As the lab PI, you now have: - -|🔒 Protection From |✅ Tools You Now Have| -|:--------------------:|:----------------------:| -|Accidental data loss| Branch protection rules| -|Unreviewed changes| Pull requests (PRs)| -|Unclear authorship |Contributor tracking| -|Unapproved protocol changes| Review workflows| - -## Conclusion - -You should now be able to use Github and the underlying tool of Git to keep track of and protect your data. However, it is not yet FAIR data because you need a fixed identifier for a set of data (even if you later update it) to include with your journal articles. - -For that information, view the [last tutorial on Git](Submodule_0_Tutorial_6_DOI.md) in this submodule. - diff --git a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md b/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md deleted file mode 100755 index 529e4cf..0000000 --- a/Submodule 0/.ipynb_checkpoints/Submodule_0_Tutorial_6_DOI-checkpoint.md +++ /dev/null @@ -1,82 +0,0 @@ -# Tutorial 6: Digital Object Identifiers for your Github Data ------------------------------------------------------------------- -## Overview -There are a few tools and platforms that offer DOI creation for files, datasets, or software associated with GitHub. However, **Zenodo** is the most widely known and trusted service for assigning DOIs to GitHub-hosted content. Thus, this tutorial will focus on using this tool. - -## Learning Objectives -After completing this tutorial, you will be able to: -- Understand the purpose of a DOI in scholarly communication and FAIR data compliance. -- Identify Zenodo as a trusted research data repository for archiving GitHub-hosted data and software -- Create and connect a Zenodo account to GitHub to enable DOI generation. -- Prepare a GitHub repository for archiving, including adding a README, license, and release. -- Create a formal GitHub release that can be archived and assigned a DOI. -- Locate and cite the DOI generated by Zenodo for their release. - -## Prerequisites -Please complete tutorials 4 and 5 in advance. - ------------------------------------------------------------------ -## Introduction -A DOI (Digital Object Identifier) provides a persistent, globally unique, and **citable reference** to a specific version of your dataset or software. Under the FAIR data principles—Findable, Accessible, Interoperable, and Reusable—DOIs play a critical role in ensuring that: - -🔎 Findable: Data can be reliably located through metadata indexing services like DataCite or CrossRef. - -🔗 Accessible: A DOI ensures there’s a stable link to a publicly available version (or metadata record). - -📚 Reusable: Citation via DOI promotes proper attribution, credit, and encourages ethical data reuse. - -🧬 Versioned and Documented: DOIs can be assigned to specific releases of data/software, creating an auditable research trail. - -In short, DOIs support transparency, reproducibility, and proper data citation, making them a key element of FAIR-aligned research. - -[Zenodo.org](https://zenodo.org/) is a free, reputable platform maintained by CERN and OpenAIRE. It integrates with GitHub to automatically archive releases and assign a DOI. - -## ✅ Step-by-Step Instructions - -1. Prepare Your GitHub Repository -Make sure your repository has: -- A clear README.md (describing the project or data). -- A LICENSE file (open licenses like MIT, CC-BY, etc. are recommended). See [Github](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-a-license-to-a-repository) -- A versioned release (Zenodo will archive specific releases, not your live repo). See [Github](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) - -2. Create a Zenodo Account -- Go to https://zenodo.org -- Click Sign In (you can use your GitHub, ORCID, or other credentials). - -Once signed in, go to your Dashboard. - -3. Connect Your GitHub Account to Zenodo -- Go to Zenodo GitHub Settings -- Click Connect GitHub. -- Authorize Zenodo to access your GitHub account. - -You’ll see a list of your repositories—flip the toggle to enable archiving for the repo you want to assign a DOI. - -4. Create a GitHub Release -**DOIs are generated only for releases, not for every commit.** - -- In your GitHub repository, click the "Releases" tab. -- Click “Draft a new release”. -- Tag it with a version number (e.g., v1.0.0). -- Add a title and description (e.g., “Initial release of dataset”). -- Click Publish release. - -Zenodo will automatically archive this release and assign a unique DOI. - -5. Find Your DOI on Zenodo -- Go back to Zenodo.org -- Click Dashboard → Uploads or GitHub -- Click on your project - -You’ll see a permanent DOI like this: - -**10.5281/zenodo.1234567** - -This DOI is now persistent, citable, and indexed. - ------------------------------------------------------------------------ -## Conclusion - -You have finished the introductory tutorial that enables you to use GitHub to retrieve tutorials and to use its features for version control of your own data. - -The next submodule will begin your Introduction to Python programming! \ No newline at end of file diff --git a/Submodule 0/images/.ipynb_checkpoints/GitHub_First_View-checkpoint.png b/Submodule 0/images/.ipynb_checkpoints/GitHub_First_View-checkpoint.png deleted file mode 100755 index 3d3b827f0d731a7a5b38f5bf639e9649add03976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205171 zcmdqIWmH^C6E+$wxCgi3?!f{K5Zv7@xD(vn3GTt&-QC^Y9fC8s>zyO-Iq!S#-}~cR z-(G8G@0qo$ySlo%y1J^KP&pY={~ zuaK)q=B~j{={Ni~PEJ9krKQJOT3T~e4hU!ezMW5QR5)O#M6Jk{SUJLky2ncx8ecga zI5<8o{c6M%^-s4{&w1hVbz=!3S4a>Z@r=WYWOgyzvt&a5TnmFNYB_EFq)}HGyXa&d zZUO(2-s6lKBnw0gHDGV$dI)BG(nB&O`R7{IU#5!zUYh25_}1V3Llbg^IcgSaIrxW^ zz^pVHRY*hdBX}@k*TY2g_4O4fm4_m{Bhq$8}c*i>-HP)Y{3 zGt#650ffizDYB}hdGk#>Tjr0qECvWSm&NG+p&}s}759-H(GMMJ2?qld9Fhf-`?i-s z-v8D|!@??Lpi5lvi#sxObImMg6e%kf{m*EZyY0wppw;O+$#crKr-hNIY3q-rAl$k1 zPWXvtX;JO39avQ=er#ZW)@*-p(YC1_wk@F{KmR3W*| zg+detes7(15g`}faYZB{YB|3V6Mf?)diiuxnXA=o_Y~dzczwWZzc1xUb*@~ZB(97S zyR{2q?53J)@Ba`SSYt8=UnvKT>*NLsIt#G(5?(U`Aqe+aUJUsZ-)z#)psJFmX)r4dQoi;V1IOo$^ zOkF#a$$Tx89SOehfT_(bTu-?O`;gC>glS=SWk08A+EI6v*O>rs3~6XP^A-xBs^smn z1=0>qP+IUM;ygJ~z2|fKF6*3T&H^1I!auY0dV{ExilPA&>cL0^Gjmdj4_$okFS*F% zt&S&{cW3LR<}=F*dm{8iv}1hlf~7kg|fW{|DtGrHG*NrpsxMNB$z-*U3WK=GEOnEU#S zbftY|7RvetVY}J;if&td~Qf|m2KC~)|zct$P zK7wPzCpb75Kw)CN*5oS-coc$qwj^(a@L)g(0}@?m=Sv(1mc_<3b$0T}WbhP64SN&1 z9TLy088|r90VuqqOO}0oeO-RXh|cwwYPUKS>2?BWl!~%QHdQOM68e$e;Ej>cbqS#(GtAQmpj7BkyHXLV_%EADQEG-rMW=& zJ$uat%jv-to#9w=X3Hg}ho`3!J=h)buafG<#nY6?cam1UEA1c;BxG?w>mT3vC3f21$!j6UC5E|ew1HH|(Bj9gY~w?j&&f80+!t}Gu8)wRZEiB$*kHp6t@Z@5#FyrI=+GU99wLt~0pgSa~YNOv>1D1{ut9cdHd6=Nqj9m40kN-XMPXhS?eA z>V6wTZD_@fvtL+l|KjTTc!M>wyYbO~&_MtLNMCK-QF{7=l69>#t3Nk=iYALr;*+>5 z(wF;Xb`$H&gb%u51>iU91G3ocgC>ztT zxxc+V|G?*QLAgI$mvqziLr_3s5bzrs5`%<>UNtKjj?e1}P+DUu;D`tESgq7a(Te|O zH;bZ^O%kZAPl7RNdTXOHJg zZ>yUb8!awy!gy;>w}Xjf;Ld={wW8@aSEO8ec>a87C~+D;BBlJa?7CS#-hcb{P08l& zq_T6sdDAmkxm1Omx1Si1KN6pdrC;WkDoaT-C7oHCaz;u$}+x_Mb?0AIm>0Omiw<=0Pk7{6GShlNjDkKBaL>{6``*OQn#PB_qZx7w3ptg%vx zu2QpEX+O1p#a_o#7J^N}YqCsBDjO|#>06%kB>QXg;|gg*I$a_)8yv-6i~H;s?nh%te=So#8OFk#@=#jE9%BFt}Bo&SP4qT~!*a>5tQ>0R8EeE+XGzuAuEZj#X z4e!JKk_y8TEk3T-`^9O?S9L#?h7(F|2Q)nSUT+kG(#J?iUA^%idhWAlsK)j`SoL&z zTDg#ZENrlz9Xzz|C&46_d%rxZ8d>gXXa3m!26>zSnG;#wy@pKjeWb7(=1rkxlF9Q5 zvh95wH$aOmlaNG3lQ6y_A`uvS*X!?Z_Dk3M`eQj)w2BA0gggy zs7WQoz>?BR-5P8Ij3DMx{;bkU^v704L;4M~xLs4a!nJn}skv)Esre+b%lqrm!x$%{ zr*;9|*zSt^-|oQj=RFUF{a=LCy>%F{UiGHa-)<$J-Q?wizJx2NP$hupu_oe4H0R8n zq0?(ND6u`CYFqGHY-S4v+dN$8%`=W>EM75mQ5rRd+FY4IEf&nmWht1fbvjEzou;KB zj0=LiIPQeYM--)Jz;0j}*Tj3X)KAI(2pW{*; z$N{$&CJ>&)N8%ZN@=J9SL!D$43^2Quk@m^!!t?U- zdiu3Sj(k1JBEIVId~fphxm+ne8bN19N_M_P`L_B_*e_9mv|2ol;^K}yzR_~MMcMJ& zNJGRf5hs*n57&1XExhnx`{}EYsE7p-ip3T5;ciikbxEWLE-pMjj|yQ_-Rj0;wDmTG zxP4f41{0w~%a9qu3M%zEMDB0;Qw0+8ZL7=B!e^9OkOURH;t6y6OP zkz~C>bd<)sMt%X!C1hJ3#hm}Aspt>7pkt4GlZ_q*Ra{rWoSi)+TJ-61ZQ*f}hWh|+ zXfd1hnwm5v)`#L{3M|^$LSr&fE1hU~tE*u)@?~gNcoxatMg_+Xp-?pOh&{mVoFa{K zao+dW-6+1fCUVI{!zJhTEzgk%Jv)ZkG!{eDFya;-Y!}j;ettXWf;9L3SI><&5I@VM?qineTV$HZ90#{ z+5jF@Pxs7pf(Kb2i(Jl8oHAp+?j%!3U{1CLY%@|YZtn87WZO%B?>CNXSRp+2Nz(Bq zU_@}i_00IFfxr5#B6mZv zMp|bEps2e~VT9st$|18kV-ow*J^1WUryPdi^j9!qVMKO@x#`LV79oeM-oh2rT+utq zh%#MNfK@AM3JGqWES57yFb7an0Y2L3gtSP78fa*bjdyoq;MuYj%7C0bH2+>@vw>uI z6mF2V*|| zX@uX}vXJH0Pfk;_yi}C^d#7#Yc()VF#QDrVgjmrV3QZzixc_PtDbV;zU-?-5750(cK_IyIebMEo}ElhfpM!6`+-VN>bXFp1F9rNfJG zZM_PISmH+Vq(D3;)lN{tA^a?{60!5>$f;4p9R%1UigE-NG0GCe+qd}mAB=ej?k9G- z5-2g?`{x#t#5EMYE9NpECtI5;ze!w~z}+{vnDxlWu+gLR7T5Z zNIO^iyx(7gEfy<^-^P@R%&3lxaQTioDcS%{m$A=;)~NmOy7@&@pC&SQYY0zHyRQgCqg z0y;{#b`>kg!pF$pUe;Sz!27y~)oDD%d?szQ$S5RQJs6stpTC~1HzSz<9cOp@hnLk; z_W{w^$cr zC)HdqDx+|mlj|QOYd*LMk^$ZhSTG4%e0L9ikWTl*BGO`tyavPN2L8~4jAsaede`n< ze}E)wa?eux4fqt&nSA5gppq|vF)wbVF3v&AX1S*}juh%FCMCMk9cLNTK$2-@c;q^R zhM1G9Y+{QD+C(-&(J7g{-(Ea)?HSo%$;5Fbcd@p`*dBiy(*JSjG(X4}1^-^7Ga#d& zx#Ayg%|i#vGWx}Se@tF>Neo4C1=Dh=DjPTPav^>_%lW9{hr!IKwp?vIUQTc1_xr?k zPCKXzt9x)al_8#k{pDB9YO7H%EjeY+99z3lb}O}$yS(rT460jpontL@;Yxh@*gWErn-`3)AU#zbxg1#ZID=+nqFkwNOuzYncPG}omLYY+Bw@fxOWNkNM zyz$Ph5mOK~NGm)O+Ka|o8kr)q`{ZK}oxY}*(O4+dtLAu4MD0GS*7@@F>-yU}$U|p~|MFM?t!MT_}cG zT&i7aWKVBVK2Xs=su&G%E)QXUUH#lTOx~vXR9csOaQ_~7y2-N9mEwO;-|Uj>*{K&wbu!tD4oiR#soq@_Dz1NpG;1W$P&BK)`_jbG>UQuD zy7tMbkqH!Tw7ZvjnK77w_P7$hMx4>h8nl})iJ^r_)MF}nX&NgK@%(1Zc6)Q|@mr?m ze}n~|W1o#Y^A&<2HAds9bIqkbLPBO)ueX@%3`XY5^crfbFK;Zwqdak212Zdcxq64| zQP9wL>WyOVU=cSK8v~d#msZFBQ@`T$FTe3=P!3_@niPaUyD!X;`XmYu7754Ca zBdv7F5R#-3Kh+X@xKxGx6N}cT7wi1{bB4vkEB_a?`pSM`^N$-*qG_qYDVZHI|x zamFPPElaXaQcI~z=0-2;khi!@DhXjebGGq|*`UgNo<=#{3ltN>W;0h(cr&vY*70G4 zfoPo*(pwvd$=n>EJ@*Jmt~K7tb=K)#<;$EpvtvQNAb7L@bfh>!P9GEQQZS4?N#HHC z^yAH)h~!&55Ia=g;haxQ>16uCR*v;qbBVes3C8IJnblM>y_8^eov9Bz;w|XS=w^q^ z>Xa_OkQRM8X#mEt*>b2y!K9CH)0eguu2epfZ{zidcG?Qpq-q`35mAHHQnI&O{QCYe z=bJrdb%=H=vPr$Vi;`8um(Z`Eg(yEbtC{(#cJpkl)o}oKF5=1Tv}SR**v)tSA+gu0 zP_1m)UFEs+(V>7|LuFbg^qbgm17w_`J$L@@Ri_!^hQw z6sNbheL<;5J3=qb4*bsXcZ5yg3=+(uUD5o44Wih7WxxK@D<)kG+TQoeNe=Lc#-_^J|OQ)JbG81*=)_+a&1;t7M&v~M&w&q z_=y6K^IP;J_Antf)$9$=3;p%d38P6rL^2{DM<#W~Cw}hLtg~W17Ik%751x_8| z+;3QbCt9P`kQndr{t6qP6z4gUo7O zC*I5w7#1uh#g?ovA^)>r{oX?R`g{q|kE?K~7R&~(;(cZ(JDTU>o`y9;f}>S4ziBr+ z-{|J>^=0)ntA;5>UVf75&7f%8##?{KHX1=WYz`MZkx~dsaU|?~Z6=bp34SN_oaV%< zrgi3Mo{s2`P%={xPErN*1rrsVijZYiC@u%>Ju_Oc-Uz=U6~OOAFi3lD6M7Rqzl(W$ z>PNi{I5l1m?Y)zA)*k?DE)1jrin6-B`o@r zkAgcr1%*id1-CQ9BXsS}D5q<=*Xt7v3Y9?i)Rdg(&o*>Wat=I)+v!xUSNP{A`6G5l zt)?sm9Ep|Lx!=4s3}|(3r`3aV?g3-F!9-qil?S>C)+YgdA@m`emlS8|ni0>T3`M8f zA2xI*n%o&tZCB2)uqqu_Hr?;j<%(k&&6V6?U}daresaM!vf6LsS8p)2@beic(_`H?T7nG za2zhsmXZPq4@qdZ&~tHXe<#3?VPYj5UHM6Y%{wOjiB5$qp**iAl1j6o>?u{z4*wun z!z20Q!|&fB$*iic%Y;US$4!vX`5&_&oq_Uq=3{#qr*yL8KXsyK_x3J~f>5c2NO)Fa z8&2rZaT;b&=2%dZZDe2R6>_SdQax=$c;adXvbs^zLgF2%z!_P=So2lb;u*?b+g&iP zSwmVIinKJWO5qE~t!T$*;G;1q)+L?`N{XHEVhW=UUt4+`vle*1q7^4Sskm{lo)O6F zLb)LsM37%@8-!Kui-k8Fza2gp@_HJoH0MSqcOBkJZo?q6IwTp)z}J$swjDD~47TRz zr$>rOL}O=_%c`pit_+WnkXEmJ_2wo(2j~P?Wv@hhLlu92pb&AW)Grb?8qsTHs&a)_u{CkiW);I~ktGi_;oKq4M>Spp)3;>iJixr+3ni=A3}L zbVM&t6pceKrd117X6g%$G9gU`Vm~R%m-Lhv?jF?q zS6g}=q~Ti>gX*_R?IwI(@On2SkvO;&jz$Z!pC15!g<+OCWG+=T$ePtN^ggs%+ljnQSf}9-TC;94%$tXYd_E=+6c_ER8VshVJXpN zgk(`9Y$;x#X~~ZJ&W_iv;D`IR^Q`DR4RTZVfx)gY=hCE^j*^su6md!OQmy9v>k|h} z(CUiwN^T-$%7gok@i!7D{LWA|_e#CtjFTmFFX;La%${E|fM2hMP-~HreeKUHQe;6{ zz5GJu<%e52{i!iCZ7 zz|-x}h;ZyA)hia0gt;A$%YLl5tM99+YhO{wH*c~8{4efSe;90a`HIhU=xC$YAT=*0C#pD=SvRHmB_~Y(xFoEa`I2ZY>$wslF|DDaXN)XC}bX zZY+4dDT#g~73F-OQDkbCCEDn{t;PFbz>2q~XNOnP9yl&YE*?@OVo7V6$zl73nP8jOjT=tGu-k z(-_B`UhE8HaH}eZ(onsfT6q4%jz<_$D@Cz-bkkwA)IhJ?_{=oMfq@^Ui09R164%)? zGFub#GM%rR^qarj-QdRanxJi=loVH$5gz$KO(-z4=S(nZ7O^Yeo#)q;O>p1(?kwNd z42CIi3AxGi#JNU29f+t*1<7 zx9XAQd(CUeHO$2O>R{Tk7e5Jjrh~(v$ty_Ea4!Jf@S>0<<;Sstib>>K?ZiLXI)9t~ zra|ewp04P4r9on@LLb%l;C}2W5ec;pqPZgr9oL-3aE(s-lha~{j9`4IwEX)H^3YI`i%BXh^)r_asn3wiWvO6ig-bkFyj-pbzj5(!gT0uTu! z%(UsetzNHgiC>3@Ev2TZ5qnqMZDhqz6tIy4%8KN3gPv%WTdyTVVjkCEF2o(5ixmq? zg1quIT6xl0J)a!riWNmONj#Tz2{}G7&4o-R{lrN8<{|Bdtbeo%k0pbiC`l{>MGlu+ zwe3s8`ZL=`05}O;WjeiG_#G7qwxN!E^PMlT3`u}aB5Na8_A@Q4Cvs-YhX`7a69*-> zYCH4Q1(XE1S_xJwFE@H_A;O*%ORY&Vg1toxGT~h4k~!vb=l#P~Gdy;psF^duk}M-= z=O*VOWL>L*q^NQM<6)6;@gLlQmKu?Jql%8DPNld-N8C};n{<6=r9KvcG)%_LH=rp0 zF~(w|?VwiMyEi)1-t2eC$&BF5NS#>#$AK0+Sz-P}F%97pM;cc3aT{gm20#h zgRkrqMi;Z~^k3(x^-R&1dWn32Wwrr-Rky^HiwB|^jJLPJTnGyb>)o9$m+%6H4exs3 z8Mi=*`L1YUK_w2i8`F86B<6&Cm;GduSo7!QIKf~fJy20WiEavwM5WZc+63*aM5}v4 z;vyTA@}reL_!_T7cexF7-ymg4!^s&XS;5iHIc1ScmT2`%i2a??`RxApU-E>^UT!g| z2lAf*A46prR=%2%=FPH~$EC97RBZIGpmSVm&7xtibwl$Zl!t@ehLtXQuj2#`9;6E| zo(nR&YC|&UL6S`F9a?rRmkz975!)-*#gOsYiVMfFR6bxquI3IdJU(4etWPnw6At2oF2rq`FeHwM72RvQ~uAhcQDFR~3<=;XcHCA~=?CF=80D z(WCBass4N-{?VM1YK21`Y%`YU>@Op(`Heh*@+~FJpY4#9;^soDw>g^!m?$FHOl;K? z*9%kF9iJ95I0E=aRAo#`GUnwrgjdnzv#Xwf;2Ey7<%8#z;vFyS^@bzNgNoR?N;&a1n0#vzu>Z~uzk58peb<;o6hw-k#~ zuR$9#BEPScXIS?sabEt-ejV$YYpnhV_9^h<9l-!8SXZ@sdB*GLOYB-1i-ZL&syi@e z*y}j5VX|TVZj%cC%@+2Xwb`cfiI-_F_TL3KM!gBNswnvQX>$`vdAsrZKl9@FGaxa^ zT<$<=-R*^P&5Nrmg>F7~ge!3s7CjAW;Sqo7(SV2qfwK7wb(K9wpUH>E`}4t3pW`G6 z8-%x*;eu#@p4-1Sgy+f6XzJ zdTX^r@dw6(E70MFLGoF}_iCRVdHcZ7SZl{``n>`^jXUq#S2332Y;@}j|K#1AMnxBiO zD7w<;TA2*n{klDn4=`VZuEdS{Zd0NZd>h2$mtwZEA~C5URAR3M_Nh2u#BjC2J_e0J z=n;x z#^-5?%V*siv+ARHTjA1bQ4(JZAYdx7Qf?x~6=lzx713>I&NYD0Z5qrR+_r>r)2}w$ zc1!!|80Z`~V$;Z(Uy^oY-4SQsia+R7o-Hdl`)~WVaTxvCS+<1IFFh1Gs@cv5j zP(c;knYvl^49R=>Hn);^Pk9J}TuL#ug<~Mg7{eZOtJf_cZPwbU{bl-cS_wH=>DVt4 z%q(egsNRnCrZm~kK*^&HImL98(EE~!9dC8?*@RZcY!eiu3udNrv{`7!e1aNr#tB4; z`%-fT%n)3as0iV0_!t%m9L%vgKt0!ivU+Z0es2Fy8cqb<8B~A8y5arq>2W>Iq1IrT zJkmhw+X)I8?+g-oD;f1DtWN6qd!U71-QFs{g6hfS_kPLp-hR??J0hRweZ84APh)oy}?D3g&$`^s{p1^tCVlM_t3j3GWSLM%gcFd9)X3aLk zn{E0}bpc%BlUqyR?AevlJcB13JPYTQEAsAy?Eg5Rx_|wTkq;*$wTv;og^E(347C@ zjS!bHd38xoifA7HqwQb#@JranOnQ=pt#n<97CF&$d#sO z1QSAJh@?uK@sFXtJT2dI7DHQ_1Nfkb+5s@UsqtOIj_%5MF2uyP7e7>>_h{yXR*}l( z3ym@6%4X3B+-?Nk?=Y(M+viAlL!%+Rzf{U2VVpRL92mb9Y2_oOI35SS$=3N+isCa^ zKEcI#$!;_vjwafbA@d#7L;YD?DGP&r*dl10~}q8NFZnUzfaV z!H=Jl1e47X>tCCwkLQY_2BcGR%;FMZPGEc~ZQpO){X9Q=_8WHGHcgnDmKj?q`PG&dj$y+u3oYcIp+?EB>~lhVc=n z5ha{2r*mkCcnt#2>?>|_bBno-?hY1;P{L^jC|3uKYR=Pgj29xqxTdG2>sj-rKacl* z=31t+AFkA6j0_5IXE+f$vn?+il~*#g?f?9By>iDzY_MbdRKsmP=MA&>l9HvY4P4P} z0Y7dy`#H!xC$tlIZ8LKQp>S&O)DZeJ-1kSVQ_-#}SU#HNxb_{O*7CuoVJ>P4{ zs~fH}5EF;EvHljZ$j7eUZ>r7-%EevvTf}~P-L*9>@K>bhL*nCub!x}n+N%DL&qpe+ z^G^$7IBat%^eWWx4^$cjArVzS+k&wT*5cm5vlypRFMeWy{0(m z8*=G_ctPu>DuH*h)!2g1WRALOYQK&Z7O`Vl1kGAY{|NA_Tg;c_j|^VdoX&}joaF0A zMt=zaIVuwJlCm@of8^=PbERnaei0KBm+1S`larAdY9ywfD78AmHf0|A(Ku?976=)} zNJSy5e^a%pS+$*5YO-WU)6d&C*nn=6!su{BU2F%pX*A{H?B4`S)1D_8aTD`6`z}Pc zgN9}+tC{Tl))JzQM|!#FYkJD<4J}^{8?vYq*YJ_3R1;w%&?h~{Is}HxXXL<3d6kk; zxmZEi(GDMX^r%*Hhd35oZRcx)rGgA#b|{5f08dD?l;I=>CZajTW1)pOMB@;>6cB^Z>Cnz8G z&q+htG_m(AzKDdW+{#TnvNX`U5UpC5iqqBTbt_oHw<0#8DNn1V1~=McZlv`{c-)Lj z;5X-tkB%bWYSi=dX1a4$AJbaKr+FTQXx(F|WV8kE%p;y`9bg0>vaT|{zeZKfkPR5B z1l%PPnV$36fHkg5=9;f#uJGXI8V8azIZew!C=0#aqHbi?qdoW58(kL{mz%(UsgNhM zZWOEsvcVc0oGupD5x(EmZ%1IKu@no(6I8#`O?PCLK@;gajrGQxg;gD?aps(1`Z)*M zQ5Amu;j$6+?V;LA?eX;!WaZ3ebT&#Emy>#{L48%?dP{;@$H6Ct%^7R+wzfDvjx!b+ zpjv=gW@P{|sWV_zW^iFkF0UbZf?yzJ>`pr-5E$S5`e5})5fC6uj7d0rBENcaoyuktE0zfo**nz)8w``Ph4bBqh&TJ516n&T$Av)e#H$C8t7?vz?hqv z2(71SBC#7phS`XDdnCVmSbWeE{RHmZhShoi?ePS} z#g7aT$ewvKE%OxF^|7P!IN)h`Kd z@+>!1$eK*F2;E~2PlJ5e{kJ!Z2qfZZ;3-u<1CT;sI(=R>-~0M`;kQpMb$#2(+@$*? zH|T9k7MMPtHQeoO&Mt_L%+x0toEz|8$6_xvVPg`73@oNr7MS%8i2J$9Kz%TAR^noY zHX>=D80TPgJf4Fk;C50vfHZq&p(GP7PfN-}{38)@Vql-?Q4qsM8_DZ@hM%$6f)Dl3 zM;gVGBeTU-PGUBhXPlbmf?vO%!3716sWg9>PviP{wRc+`bUckV73b05es?O51@5jV z{y`eItsYZcc(p(p?~Caae|;~d85m2;LsN6}k>|n!1iCR_XbESik>KWJ79#fu{TYEy z4>xdRXNQkyr?lQR)4E&dA5q7cZg#XEv(#9xf1T%QnG@)!?0oy$i}1bqXx({Jd9NeZ z?*bGEQI-CZObYxcp#p%N*l4zgj-!yC(H-_&D9h8cnh5lin`tCY(_T|TmsXuP4YGJq zepP0}4EHmxGPP>(KX46$ z#!@uiJfI@ZhyBzaN_Q-pRmM<=rLo7>#)`obLSt(#+_{TQ{~!FsuCM$3_V0Z|HDN1_ z;%(?fKXbIG!`%z+dTbpI8H({iLa`~2xgz-zYG#Y*1`58%-{=V%iz?V#q%6b&UtkN2 z`W6HLCy@6oTfoW80Nphst;n{JFnL=WT6xTl4lgQgHFvHj7_X-;KlamqKs{G#G71h~ zX<)0?+gxW0x*-&2K4y7%sX&-2?8<^uAI;y@Qc%~{7lzxKadH)kaimiDGPs*EPARzA z$Y`L3-{)V%H*$Zu^Re(FH|Iiva}cob5;!d>TBp9=y9 zou=NNEUJ3j@7w`bX(Thtqb4O1Xo}~WVsYeBd}=X2J`Cxp$HFNhVQYR_prQ2O;nG_XbZ_i{!x@{f7{M5L0b?u( zgYlNJ8CT<^Kk!fga)v7ZL`OYIPRsfcn3fh(^c5>^LOntid(GbTFQ}E@ckxtDb)$6l z`+sI6-|YLLvzJF}$%U?jUg9UgW_< zdhfLc2!pf-kG3^x1}F2cs77#LPt{l2&`^!iLEyd+m_2yA?k!>ee}+hPUX_+OztnhtqU}JatH+;pvV(;}|B!`P_No!m8r2FJawA;GcaX{c?CbBp3`PBi zG)JrJPk{$&O9^bf=l5%3T79}mzyAO68&{n2|2 zgr3j8AVm=2kS~aV|Jag0?!Wm#+V|gW*nLL0_=oX79=K3GKKxJT_%IM2|J{TTQs19A zL;`MS1=9a{bLb6$(-jUvHeCYgqTXy>qn-bM=kETM5WI?-lWd`e@u33>ldTD#Zr6pGkBe zKpgLuN|q1%gt#}`IT-~7$=L?)S{shPg(|7-(T=c{mfsuAUrM(};r?1KCM5J2S3U|p z?^qG;m40p0cCvPRB2T4K7635BE7+XAEuwAmctqRT-MLjIAUgN7qmYf%8(?c9aENRo zpdjnh)Bomi2jO8fs?1N`NptLHb30gI-P{rM+WZ@tB$?a_?zT9d7ycfy})N%dp-`iC$H$w;Q9I;N>xde}^b zJqP~9*Ttu8q@|a0P&&^^Yh7!5PZ>YIZM5k8@MU=xrqf2pd*1ePgYw|&7~3m)7k3Tm zV`K|~-KVWmOgZ$kKseHy-?n{yOWroay}jsO%B7@t6IN-QPC`T$@8)wwz6{z#!mCa| zxomx?_)F?stNXf5#nW`|CYK|Uo{8Y?&D)de-;27oca}weOE1QX>|F(6+KYDJ&>%D< z#B#K^7s5;VwOj{NjXo>LDV=tQ$tdS&xb#D2@gIOlyW0=S6-Q!w^~GEoT+O*d7nt;Z69FstmegZa%UqE6c+;#G=SY2Kd3=5i4S1QdK8mA|SxWrC}!Ea3dEQ zXt(K< zxXVOI`#F+qFO4^8u^{*!&^*~P$h3>=x7yt`-Pn5(0#7q^P!?4iqNExhQjnWbXV`4? zXvBLeJs3$)ZP}l>ROg7N;|aXQhq@Q?ahhd*8fRXrcIWVV1tNd>G5yUu@Xv`GYQcYP zBtb>plU<;J|Dtv9^LN-*Mmrb7W{f*=Jgu%g(Jr>jxdGk+ZxGJnmJ`zu^6K_T!f46n z&WFq|U#ObJ@>_C9)SJgo6sa*dI)pnqhBq*|ixg5UyWVKPoddh|gwZ6qG9hZup^nRq!8SEJ`l2(V;~YQII2)~G5GK1DgUc^VO|~^|HWo4ECNsZ$q|d%pZ9=< zq+A0|B2Qh=>RCe?2C?6aLFMBPf=LTTO8?2f7`MxMi}Pae)xuPEFO%7oq32%>Q=K4m zVi?>KgY@t@F0Q8QMTx?E5@a;4%i7pWn`D;=qx2yDl!+lG^g~)&TJ*19MaW$2>d5Lu zn$J6>l^099Q73|TdVRE{mrr=PH-9ulLXuO){Gu`k4eH`l4kYwz#pI&)(TJ;+1!QNr zbT-?}Dqg}~5Tk$dDnEfhbP1Pnw5Ur|!-!5HBLwnY{^aP-w*L64F+sRk<_E=|F1mw> zjs?x;5iUe+Wsz?@Yp~uPUY$M59A9n^GO?%5aoFB#02@vA&kb)9615%4VJt?Y$AbU8 zqZ(FXZ`Jz#=y;Ynmptk6g=oSitawtb)QLFwh$w{keysK~%4n`-9upG-1IrZzTy5As zoc;qtJEbdbwx{czZ4J~oyuVRYtM+Kd#d1GDVz*w&ds4iPc26NZ?_<(UEhZ> zsr_|=yGWxx1rWdR=IMUhVVK0A(>I0nF?Vq{s(5Sd!FG4*ZTqt_e5G5$i0MWiY>UHL zK;n1`NtT8(TZi;0rpxm$TD-_6eIk^kzGU!#> zTxL!{ryU!6+N{oRLax%0lLC|NKKFnJn5f(12p?Rw?Onx>fpE>e{qq?8lJP#7n}VjB z*{mWR09=E?&M=L7i<5IF4?94~?-TgWU>Xw_Yda^W?k!@*lFz1IDp~wsO2r!VM`>1O z2mAX4lf(yUXkft1hG~%NgnDH5Y6ETg=3EZ={a{%Qh@+4l2vHRQjoI^M`jbbzz_Z7~ z-N=yYq{*_2)QOSt^oTja*|U{`j4R^Gg!Pe#QIIDltZA()nd}9 z+ytsJGrnSc1^@^_xbJ}q;OgaM3!9jf5}y%uSPHv^FJ`$$X%7w-ma3=a-C8G6l)cHM z{%Yd*QnNuSATeYJV07%yZah|UA z1SxD5p&PP%5UQ%Zue+YWjhFKTZ~gI-1oI^^KX?BOZ-MktmA7X6(mFFcL7g+?oYCC% z>Filj>N{vj?G6uEU1;yfqN38LUuCJ$D8ZqymkqEN82=A@Zxs|*+r4=w5CTC$6qh6< z5D39tL$KiPK^u1oPD27g0yG47_r~4bf=lD>4vlt0L&NMm|L6U_nwgrKlR282KG+mR z72SLHE$d$Ex_*n{D-IZi@C(e#6YAmHz+OT*TRn9=2omaXoI<^UsbrfgCG)sT>mWN& zBxgiS@!=W)gwuhJ%M+x41^$mB_)in~8j)dRKn@O~QjPIKANM5LtpnTpac^WdO7rg` zkr`cdF%SJ_VTbQ#TLvBaop822V%YAw45jWhuBY=rsv)lmHEw^czkWSux5tByIdE`x z7IpUV`L=iZemI4o+b)E7xAe)=*|a7Gd?t+&3W+8zGJke@nkG^w6)X()3Zq$ShS4~c zdR?YO-TLycYzl@$S96xvQZ{A1sXLHS_PlcMMKbV#--pI|!Mx?TF0NE^0olgwM~a<~ z9wEz}2TZNM-i5m`lV$Ye&~lSL|{SrvuqTfQaqI>MT;8&xE@LvQ2WG&}n5)z&o4QU83voaSj5FBC0E7Z$h@ zl90A1s$~Ydm!_%~<5g8}2v1$yYx~1sI})q@T{o5hhH| zmH7iJZ93CJg#t)gQDLo%$5GD?()VBJ$(Tr_7?Gh%Wf{+QfnHjf_;0- zIhwANmHo{PCY+eOp6K;IeqGg%yhxf+0y#(S60KZoKSuO^FCL~w!DWsd^t?AYW7L)Y zh?<_Yq8~;?#7)|pzO~7N?oO6hlC`+PscyMJ3`}2fR61uPi03oZ3b}UB--IXcE{NHy zokn>>NqD6jg_#S7t=jLd#cT@ik35#}3xG^~%RTDpfjY+qwx2f8I?C7hjm5jt<_B^c z`~0qO;+6RL^4y+Z;MSOWGA-(?o)u7caa|6l3T9zAoSNuV^1Gbl)Y#2KeS*R6s06d~ zmQZxvF?RC^m+1&f8$K`tLo@1lTSfWaT5%gyG2zSTU%+}3&5~U__jsTWu&PcnKCt01 zXgux+8qqMg9%K0$8aV=M%>VLL!0Ab0>|opP2?s@R%lKgud3N~V!j4)5>e|IHSBS~~ zp(v|UH`C7m@;r8?UM9xG38}O{h_`igj{J4pPPHw=<0)D{o}%2GBJ<>$Kl+s~@`Nw8 zqj;Qdo?Ke8#2)ed8Xf3yCv6B>HRP!QVVQ>S`@I+mCDi|+7`0m>Zqq)|kFwgu?Kl9_ z!XwbLvf_&korBB+)dO=CMR*c+;D)09;;X+Hqs@nQaJHSZb9RP0SEMcD7MLF!Zwnl< z$nTm@-Q?ilfJ4~&{SI-^F@i^&|Jh%M+YY*mEpUwiB&~`^ezCo=;LX`et@iW$yhVQ& zJCeRIX}U3e$>_%5VRGY?5OmNb8dLZd3mJQNlEm;Jjsx~=;rX+-Gc7hDd&H3?HfUk1 z$!caUM3~3QX0QJl%N5#Hjh1~Zd3z2!pbGwOBbCls2VzVPPTNg;u@H6HW5%AVO|kGi zvd6J|eEDRkh6Is{N0Dk_qwBez3lCX4-&KM3oaD$5Pul;Ad^fpVvDu$MaP-Uf z=m@HNI4#-g&!7g~1yM#-)zh^LmY*#9RJ>StK3`+2zU}(d*q;m6#?cgrY{H->bi}My zE~lML{JXqPN!gp$lYD0(hkuQG3Z}Btf!6EW)IMFyK4y9`!Yn(6&CI24uaBz@LjQ35 zj&ycj*7gO@YZ#2Dzq*V=`nrg{M&vGaH+D8>QzyDm1h zaPgzcOJDZ~Xy4S}lfk{Fsy<~V$$NaxyBP`=Iz2u5cV7{KC@c1Nek?{~ufT2n4YEDs zqK#$W#$P>{I#!yWkM>kzzMR1M3@66UY!n)1oNn0RV2ZkDcNc*(Xuo{X86+%k)X8x+ zfZ=MR1-)*Uq^|mEI}``RG4EZ!kW-Gdu!spRGGfKC3*F*)-pyyVTBZu@@LpsQ+5=Vo zm|OGXvbadxwxaeYpUR8Km#6KQ4{)-F1f>QNbc~lyNyWsXiySu@JgCcT=1rTKbI7Ml z_rYz>QQj)krMjX)sTKp%@Yfe{L5^|8@2sbqa`p)MeI5%lUg}{TRIHD-V`{dXyG}9# zl31S(MZW-r82wR$ul@}2 zNpV?9v+U!GvE2vDSthGq7-K$Px58x~$4@ujHA`xN%^VC+KEfOoPb@#L_dSi^ec92t=yBZ4qBy8HHNq19h^sFp*8v=Z$X6VL|f9G{<$zlV5PdbI_D@SV0}%dsz9yHRt=Npj)h}8_ z4Dr`RWy0nQWP)Tk_4bd9OMlZbe}UE}*VM;7O{n#f*dj~ck0)d?`RY^ljO^*At3OZ` z^2r%uqQ~dT%g@VO!j5Lpl7`F3#7J5Q1k>i7z0F)WGY{{b(C77TO=15~KxE@0#UI=& z8dh){07+`=%?sUgeXzQ^dg*kfJPD^(#4MhF@Ggho7MZs3Esnp|t`q5GMrRWG+hq&j zxpdyZPvUO9AKAygH_X4-HaDK#pDHXx)mqQSAA*fwt@~>Iy6!XOat1m;z{k=ShewvH z@^W$_Cxp1%S;q0Dmk#cj{99lToDLiZP9B2IBU1|w7VB)ulc=USNLS`=Xyd8F?W_f z7e!hKw^{Z{eF*OwXU1;V4?pZq)eB%fl%aW*PaN=={6`-H$Q_s(n)Lw^mm|K@d8 zgdWbI8~aCky}-Oi{VNs-G4A$eL)|!)@yL<}{AV)P^6i=62rP}EOhjY2c7#=3( zugf7?^gXR%y94-K*sapFEtY zoRQKr;D+TQM;@v^Ih&R$Ida$6R7r2m$t7X#!;XJ??}rn1x`om!qj?Fjo%Wm;{cd~h zB-i8VhM)^qcxtE$jaJIFxb@c(ALbYjgFVLmpO+71Nq>D>7k!=Q)1Hn(v-HXuXw34H zV>Vip?)zCJKOVy@7s8=nk+{g&;xEoaEj{(Q$Ik}Il3YjaQXGWr_IG%FK(^OWPZ=&J z{CRPx1m${_mu(sTgr@wwNodI3g1P)T?Z?@eg(-d2x1U`HyPs6I?KR)8{hoeTbg@8w*jg)Po?>P0`m2`CEAgYTD%@a zw)2dCLO>!yDsuiIqzf_f(at9dSohgz{o_kY0?71rDz7lz=VRseN~`>p#7f_Zs84a= zKm^w9jn}0~wDEvUgUn*RiQC%z&=3I?m4(%k8g!#@E{AQhMpUwy`JJ7e-33x&kl^p~ zu5ifL_fnq=o#f8jki(>huTecGmeSy^R!@8V_+UN{d7r=5My)_{h}Uc9Nejw|mMK7g zwD;aGT0(jrUjAKhm?%Sc)wo{;HsOIrL6nnG<*j{IU>+SAhjl)x((iuD*JH)aLGrLD z%VPK4n^`9heH0Zm5|3cTqBvkM3|5UWTdE>k&un5P-Z_niOD?2Z4u#6ToAI&fKV6cY!)F_O& zgGav=#jX_e)FSZ*haI595pESZsTI$jY6^l`9M2DzwSp(H37U_b`9M_}(_&A0oH@MW z${S-l6c?hW>I=&~(rO4Hi6Kksd=nMy%TL*b+joxSR&~ZHk7!9_RLOsLwzg$5!}t-w zS?fpCESXsu=r7%qlzN<~6|}yu3f5w_OJh26&A?BG>=M%q`Qd-QYp@W3 zUt6d*pFbsYWxjN!_~p*;3!BJ|`PM|f6()jwSTOe{+69OFylqFzs{C9{@DFkXM^=&W zh51*^(RG5TiMB)EvDTd1guFPzjt{dwe1DS~%BKjfrM&w}N=hF3Q(s}r+Xn}sd-pk2 zTZb;sdo?XW;8{=e3&N#~x7rj=w2rq)<|c+%GKbq!xX`BFVJ9@# zS$dASHPOifnM)uLi?_t-IXs;FM@>wTO6jnGLKOl2_j!ourK_1d%+sZNpkkq2Fntdi zZ5}*5Q8ooRfaZS5EVjB}qG53v-wv40xmH~kdUtMPQShvI%xMEV-l!raPnN>3X6w{% z4E%go!h?X@*uApLRjW!hH#kk7^A?V{zrd%>snLA*kcZPyOieI1H5 z84R&8+(?-uxg4|n($rh)`Pfe|d|K^C-AvY??{Mz4($XPQKQy1`P!O|K(sWDW9YiSuEIwFMQb#q4r; zbuaMfIqacrMYb;cCE2>j)9aJ{&&|TvJ&f}OV6((bxiPRd6kd4up}i86AoDIBtZ8c8-#Mz5Ri~(G@HFZJ)9I7(a1Hru&`0j z6>0r;=}P@zxsaS?dq@ulx=cW0X7lOi$(iMOHxG=9HER6Ca*f8`VCgOXfjYJbSke%c zsMv|z-pitN6*h=$u~8?KdCcUA^|;;I`RldC*&&|K%S-(3({f(?CxAv+2^UMwn|rar zqGW7uaIq=jrjY@t8a0ndyx}sq6F;;YV=z}8U}4A!94iueZPPAqsIa#ZFJp3^$n&sy z??oGAJFu2kvvjV*YpJ%6X;x1L0Ev3ajQn zcVRy*^sDEDp3~{Hw5X-_Uj9Ol)j)}D^*IK&-NXdG%BV^}f>9iNBOWx7xy?^aZ)7zt zISzuy)>8xZgU6%hb}r`5cIL`nEMyLoPl-$wn$u703qH)^&(V-qdekg|luVLFoi@HJ z4K#yIAK!{~3gD5pg0z<2AG#*GYJs7~wv&N|H#;S6?~fu4wX)V$)S+y1kEalYO=vAC zG1_2{x5S9)A~o_($(FFEr7al^KSl`Dt4G$?j#l&h&seVq48G#vslaOBqx2ShyHxv= zIuK&$287)=iLC`BSd^{f6Eu%uYqAHLw2IYg;WMOd%^PI-#Gap-{g{N zNAuoTMbu1n`InvT*-7Y82t6xpImt!wpZJBVDhkm=&W-20ojmiPo^5P%33&BAds@I- zVA}%qZfKiUP;qA)`CA$i6!J-Ge(-;_CsphT$3QJYI7SKSX^l0+mbM5$A7Wb;(%J%6J$UKa6MaJxkyzd26q zdf4xdRe+S{M^XW=)Gy6WyzX;7G5s#1=4taSTfvVYsO@ze>cN(m!1C`*HI-UWzYB>Z zA&#nr!P9cgR__dngj&Z3s4%(5LG6p!&S|NkIgLQ5Fr{eRC}hU9)#&A=@n90}&w5sc zR-|?{P#5;9RPo^}$miZm1P8q(;=h}|FSwi>2+1QfxCr$osUMFgn!sz3gDfXe=L$VH z#;K9Ijsu*KmE|6G@41GPezsgl(qT=py=cB4Regqz*D7>aIe*CLR!Poxr$AU^DX9Z1 z5mik?2?$b_qMDF=uXbVzG+S6-V5<-JZ0I?&NDR|=G&41XvomcAoTIJ%5RX>_kL)1# zQ6p{NX#<=jyZU!Y>Xa{lbVWqW*I%->@OoJ;AJ1rd6?r(OZO;tqb^n=Wt0*oQH^Ve5 zH$W+uY+6!|d!;9p;7iI)i}6{Bx%VcsEE(rRSZiYNtiD`NbnP9XOjz%ItPfd|%Yhg4 z{&aH!^TZJ8uGimYRhxKM1#LVI1yy=iZs?Q zCvn=-x^uCxE{aZSOU?aTj;&Ef~uS5kT)?xy3Z6i;Oba(Tete-+X`tc5Ahyb zUWeC!6J0qLeS+SXs^)7xQb2$uE@VV(jWlMecGG z=~ha=e3jGy-sdv1B~fn%i<6K3AOeEb2~cD!pn^tJT@38M1%5eE9}O2FlPBs3G6urVia52!E}el=c9X zYa7(n;w}o4x=ZlfCGi;aVij*LUv|rt0N4lywM8F;SAj3ciAh` zB;Sfab?&^44zxu1E$1mI^UU4Ik~)v}yIs;5dm~C(lgb`T^=(fV`2A!X7MyjVyZbWS z2OWqk!#X$Khfx?1HR=$n>+B_~y{-G!$;qcTjSkydf}e61)1x`Io>G7JAlz+!%3sDJ zcO7?DhOpl%c>JbjSkfNqm{S=Q*Fh2}R`0>`^OEga;BY3Tnub1pSBL+K{)-nYhLg+g z>rNufGH?~u`%q0tA9%aq1SrNB3r0lrA-7(hb9~WK>*KxxC%kOi2;iS5e8X}7y=tWe zlq1E~d?G&>aYsJWIxCAgiVR=fUNNalTzK(o3zrLvxjlmCaFKIAD?*6KTVZW=&$g}J z=cG7Wn8n%h{w-fobB5SGGA;g&?Hd*WRQ&2xAL`f($%Xa2 z{&u3j$4{?SSRgfeM569<_YonPlW5oVnxeG?{ZR?GfB}agb#7>Li`loFuA_=m)JEUE z=%rV3^@u*}OFRS}b_=_s*>Z&{Y^gm}&GWTz)&hh2aLjk+r&=YzA(!N8E4EhnRI5Qi+Uk_=GJ3)dHBRc*xf9h!;@^o;$5V}fUkgb-V8mG-KUc%umr1et0`@-QnxM<>95W0~)L@ubYVuTgW-P=q3*3lr532x>+)vCiAhmV-RXQ$Nr)bwq;w=Mf<2MM;^AjfD6HR ztLS_$X-F{26uPNDz66i9#`%yV}SKU}`IfS1z?uS8y+tP%Cm&J-2h?qK%X6szVN-B?&apjWPoAXHAx%l{(Jr5x!Y)0D_CV;lA| zNYsLxh8Cx0W+vxreYld)?;n+${}NL&0z;2wntT8UR|zyX9iM(E&9ZGqSu9yuPb(zW z7bgSnpH$#z(Zde(Um48IE9H~;dTv=M0++GqJN3r7A#py(w=VmQo- z$x`~^s(#!?nR7jO0F;KHK9l{e;~%XD zbsc6Zx1$kvsuq0Y(~_J8Ph;iN_bgRC2zk2i7f`t&=}j-k;M3PmUPL#}iAS8x?Jbce zk@LHK_5C{&nVBwDRoMGZOI<3+YER;YBBDu>w)kQ#!D(Oj{=x+ zRw}~1(GE1D^sk(8E7@407uCc{6D(@sX6>{h{2mm+DVrDP9W8zihfV+Bi6|E zw8Pe=g_yCTyzBP3yXduFZg8xalvYgqhusI9L-juj>#n?-6uR9PmJq4O8N23KDymyf1@U2hI`8!BgVB7NTRSScD)4gNwJj zeW@_^F((tpN7Afm8)SLyiwx;?d6IJ_Cph3>{A?iErMtIpv+i#+bc`V31(9;?wKJA} zwn*a`q-Sn5rJrNu*wYg_^IAV*G7X#WZ+WjS25%+%u?eLkbG=9}X;k<=J0jX>ddzA1 zs@aO{&v|E10_e&6@ISqhG}?!r-aA5vf!4KmQb1TjdTn-S`7=;o5lvWYQ%V+J`!igD z^qWU^;a+%9T@d&#$98i#z{RdDl|0viZ*er&{ocZ}VbI7FK86~RqZ8+Y3frHlJrSL| zu5?VsOR7J+G59hg!d>F(Y_y1c<$2A%Y7|QG{CxLZzc*UT%6>zd0ym}@QbM!T9nGo$ zbUoncBCu7CeddapQBY&ifAoTBM_3Xne1_Yg?$8P8^jWQBEnTTrDg_;gS#ZOdDMr%2 zULzLgJ<@&|`KN!bo0GF9qT+q~hJSl)4~it^;msiknkd$x_Qxfbe!B8O4O-P-@|LjW zGPi*?(Mq~^$TyJEv9pA7Ugg2n=P*hok;i~Oz7_jj+Xv3GpJ{1nvvYO1#*4)0vL|OP z*R%j<_qfzBpMZ9rVeQmpQXx!)N*@1qnU21JS0Afz@U5eexA#tnh4PfNeW~Yyf5y~D!Tw@bo!%W640{B!fO!}5;Nhx0=znzy<20s>l5FAT~>`uDV} z_w%bBUms*6^dezVEa!NFzqelgJn|rSjfJ(Om8#Rdly<8o4?nC#Y0@3;_MVk14QXB< zVUuGt#!fC!{JJ8KHTZ@JW{Hva@Ql!kySP$k28BA_FVAhX-aNr6GA!11CU=;+#8R~k zSS_&1woIFBHavCA?ya5N;1H>ihr4{%MRTi&{b3Na*`qk%o~kQ+@l&ZZmjM4U$rPgn zHBXsy*is(2r?8!*xK@y)+?3+sZ3edZhl{oeE&P*zYUNj~H)n)rYOOaCq*p!W-*%@k zOA2r$AlZu=UVbqs_fjpCpY#+tg&21Vz1Y3%EBm&Yo<{l!VgEj^;ys_taP2=VC-6KRumBdx6eI1m4+ zTBefv4G+Xxwwhi=&+(pya9H5d-+4U2XbOCMpyHE*Q1e42XhfH*W_&)%SArdXiKpO4 zQXbT?7H6oJd=?Ke!k5_We@Dk3huEQrsIMj<5cJ!W@zFq!A6f3*({Dxvc*?uypVW4T zsJ3#l0!2G6JFY0a-?i@gU0Tr+QKhI+qsejvT} zqC^zq_Utg3#;z5=BpLmL!I;5gz$3f?eMmsC%X?Q@doOM4V59wVEB!XV=*lrQ^y7hl z1YS6)?@s^_2XiWi4>B>Pa1*mHQ~EiijdUNpn{z#J`K^~UqOWiFMk( ziDT#ISY_3fKnXT{E!^;e5kwBoAh}9m9V!8`xW$uU7a2R*x-wu)Y{P{}zxX-vWg-o3 zgK}09efPJfExB+^ZdarB8TXk>M|)**`j&9BQnUiF_xCTGoN`ahlJ9YDM&J=^Vq#8(}xsLXH%QbAdWjA;(G_7^6i0a;Xkse;a8>lFbAhS*# zz9mOZHmxjuKE4bq_jrx#w#xD`+N94kIa(S+96dIeIYReF^3~yXg0!rx4kLx@$P@f} zS7Zt5!%@P6FGstjcv(=h&IUU>(Q||9pQ_vm zrn#|omt}o{M|525PvyHXY_5tsb#x4`CzZBxc$Ub@x|YP2YkgNx&d;{}#FCe?EE@B1 z?uYf^cy|bo>#$nZq6k`|{i z)xp|k8EU;i=!CGeb3ux(lo?nD0d^q!C?-ohQv~7nWK+QmK;UY7Aa3~IRF{j46)dAiWfV!4H5zXYVO**Sn{WG;Q0 z3}(KJ-s{tP6x`UEC-ED%Z77vf18bw9mZd6?u0V)JUB3Gd^Ta12EurO=G}pJ&w)hl& zIoC$^Hl6t2n2CcSj>(#RJ?$R$x^7tM$VQp6)gB_o$cbFNUPe?=(0Z?8nFMv`NrmB~ z9zn`#4{;mCYWXp5|h2_RgsJE-0yjP z)5z|ZsGCYKicEO;<>@f}%smAHI|Ayi)yvj_NEOhLUdW-+cbybHH{SQo*A8=+(t<2i zK9b<~+g^Me{%L0~540*Zs6jRkL2(s?gbLBJx^En;32FwI6cL8_a?RjuQ~k45lF_Os zPpUBs+2>lM#V4#uep^x{DtF`4vzCgzmW6!Ro-TYQaB$5x7ySht_Bnsl1wYlYgm4Yl z=w=HV z&WzT@HV~L;2`m66SYawh{5<(oMReGw@rS}wg|!Xv7VtF}lP<2tdZ8LnW@rmk^YM5q zXflro@Js-5X+gnk0&gap#P^$;eMSO8JDN`CHy{zr>(x)0b9ZxnICw3ZRh;_mOA;!j zzLx?D=!@*lAdTfROXOTW>t0~0;9QL}&_k_!JB>Qj8;!jqT3;wRl1hT!A_2b#&DUtv z+_-;McJ?kNZZMm*41EOsp3c2(xITs>)(fb$%pC(~%##;u@L~G4{uPJ4yYRk+S#IKj zbkIRb4hcw>Fg{^3q}*$sRZOh+&D5kZ?-NK+Rw3*5Cc^yo)Dpb5Kw|^{)$Dm%wir2> zOci(%5?Xy+LGvO+-wvx4LBj&Rl22}i+Bm_mL)Jh~!K)-LB?*v|#l2TM&R{Ro+XQ2C zKP8IAFlI*7k(trWOhMmrbDv|^QZ(Eflc;Hy>ORia#@mb2H&6$mHSLP%`NPb$QY6L5q8+QIL+8}n zw-=X`UP-ato26nKvV-%pDB)MeP?EuhG2uj#S9?Nh)0ZJ$MbJnQ3!n-wU+b$M-_~8Vl^2TyNEuBOY_OK zlVnvuR2`A-Ne-Ot1e2bvAr{no@Uez5xKEe`s39{qP{<;T^V588PSyN&ic|uAksY@D zA9Re)y@yT6k{YUY7K9e)-af}I%8N8?;h}WRL=B*nWZ|>W6>h)0z5o8(HAk$he*WUB zSq~m3l_vpA2>k*iNw$?yb5=HYEL-j-|J+DyD3R2%k3C=mS5`~mL zbf(AW=5r8u(4HozpmZG`RAhxLp_KYjG|_9I-q&fx+|Yueg?+P= zWllMH7oC)4SIgBX#i=jf;Sg59yRtvmWP$0edmbfZT%TMN{w_PEk=h%jMcuz3N$njJ zE}WQ2sI~k@L%-8Aigs5t!Lvxx)%p^t4-Pu59PuR}aBtz zbFoedImOXM%I%Sq?p>8URkD!@s0LwM*=lM20h99RRrhwWdjWeqctTPail0B(?-tU>2@) z-Egz;!^j*hw9ZL8Dmgs}4*j{j1DsnconH40b6f0n)Uzcby`ND6ZJ7Ex0%9PIU@S9) zb$5mE?dN!LVI2Xb%HEKjN#!I-rS*p)os;bRW!9^24#K6Iy=~vmmNBCc<^h4yb?tIg zf$~9}kf5`f%00T9>g%RHq%zKAW0P+SB|}zr6+B(e^`dL~LvP5Mp?Qfu&+w3Hnb@i>r5e2T!%~ox zJZ$`*fYAd*VsO{e%;U9lucOLpzB`0?NNDs;waHtO_oRc`RhB6)UIf90@qF&;Dej7N zKnQSb|Dog9K|f?O(jC`ocv^kFRDRKefrXLN=k5E`^noLnkv`yaMSl+6Zo30+b8K~z1 zy}$hp%;<1_`3R^TN>H=$xQ!|<=E0p8(<-RSWJgpKgdw#(VR8;M z5eZq6;h83txu_?bX5+`(mq;N+G!gm<-QS#KH63yy9YfTCPl;O%~Et7%6<0WkB_Cih8>Z4WSP^qQj&Q6#p zR%EwEJG&aYb}Y-oOY5nJX{y}9?rU{wjew8ikgpexT=p(RzT2PLeEOiq^4Fdk!#d!E zn(8G}EmD1?Ka>c$L%;#tx_7?ieV`peTeD(My9SM`tE&x)Y!7^TD|n44xH5THN7sVS zRU<8arRygVaGtz8*sl(<`)eT*a}iPY7`{6qS4$GX70-DxIR!p3UjnDE=Z0ps%L_kG_YaH*0;XO!ubK1#&Rz`e z^ARE82Y-!K2ui*zplbAfPf0bWEc%mXGm3y^qk9#q?9W<9CxW6T9v*N2dZ~S}HXC9P z)#3IBsHM0^03*CD;DQu;;4!5@x+N1{L9r?R5v8Ex1J64dTfd3a!$m8ct^Nk`k?EP+9VQd?@&g-L##C7wk@q;Y(0qL3kK- zc*5PaEZ|rHIx_yGSIOHGopstBf5(xpgI!+UWG{eYIZ;$_+yCev`|*4JgWXyqz;Q8J z;r!}Wvx0=U=;oVE08}9Sq?Aj%FDa1a`p(zktq66RHWjdIohvJ|IBnP;dD#wWSC5rD z5#PY0EKnqX4bo^}jw&Hy;@is)SD9Y*xW|m@vN<`iE1zTs3I6sk)u1VTb#SBgav`Ga zd-bdpubnMp+@Ol4QwyR2ecE_n>uLqo2U2C9Yf}}{O$Mf*rX@KWspoNN-euajS4|6# z0by~bT~urKG5SotlNm6@z~b zVa|8=Y=l{|wX2ETKLJg3@Bt1U%NCFh;L-O@ToD7x~DIS zZsqV0V#Dv6@sp}vUM|;SeDt)3mfLPVOuO20S5%AJ`VZcv$=I9!7(qc-hqalTd~5Yc zosPp`aw@1cuD?CD=T>ODuODfZZd~B~mfRuj^nblNme*a0*`uZ#d?Z|8jMu-hI|LB}!c_q5%jRa<#w?k+{) zm4j;(54K&77W)3>c|`ax1jmRE?d7a^pgE>SQj&oI8!okSxG<~uGAL@!g*11+>i3}N z*1NN4clNr!z=W%m?7|zHlQ&*`hcr!BK!ucR6Enu!Y1giG4X{!f9VC?+jyK)~x-WzM zbopy^IO`;%$*ce)>OPlE+097nd4{nagbFfSX;yH%^-Z^^lNW`zRqTkV< zw}(@^Yd$8CE&%=~WcoCM#iVpU`rj4Q&U=B5Ld2!k)BCywFribOAGWq4tI6^)B$ z^T_T)gX46&K*qeCXlg4h3xV;}K93nx@AigNRGHD0Blu7H*Q?XZn-FH;GXc&VQ~o-- zwY9Yip#k)HC*i;C!bR%Hy74364uqp} zYFgUA-t50VTok# zAkBdQa9jJ`R8jr}9O5_USs&?$FOmW7JK0}XaChrXX1LTAocg-+nRN9qFZ*ZPTg&pqx~yQlAcH5LmCX{g2r8?r1>3hPl^=kT(#AjJ zh0^@x>81>dJ@&^>di zcOy9@BxEUWYFzmCQ`WeVDu7?^YTMZ=VFSho?sq9_Kk{qZ249S> z*Y9^owF08=XJ!gCLQHzppk?68RhJ()Bb{dX3ol@vZ~p^;3+&ISZKmq-b>{1x%*K#? zdVfvbGtHj0LR<-zPO&X-7FvDu;W9Ng`|1KyS^TM#Jon<5czdE){(1WiO?e7_-v@`- zPALx|XG71+0l#zn2H)FhntG(e$qsL*PeD5&kgxh8T7>MC7%ln+GdigA$6{sYEy#`!_jtprKGv1V`>=75_ z2AI-#eu0m>RlsSVFT3rl2yj0S5)9OqduDu|sdHy%0Kgw{Uv-HB4s&_7Mnx5#4ccf*#6I6c3&be|2jHhGS$Uzcc-%hB;@ga zr~vE@%p?C`9@zwQ4{hOv`$>1Yg@l`se}EX(_g*ekB2VW+dH$C`4889PGiTvkI=T}8 zVdL)z`AA1+7EP~1)GZS$F_uYX|3UE;4ABAnu|lSwX8mZf6PTWLE}Y8M<-|RL;LhDhmGxXTctBnZ^a<$D_9mjg5s4x$T0l zJK6N~;&zQa+|xq;f3j6CKnwfJ!+Nh=^*;C|bB3?W>}z-wa=`1KN&NTnr<_%sZkDpt zs2gaDK=WXt$bapfbQ`Ra1h=k!4InTEwLFEW(1oubxBKxpp(r)BVs0Se%No~fr#Y?bKuQJ7sDuCz?T>-f&nFuj zpO1P)4<1u4g^L0wqMb3Cx-`O(tN(g>gl|B>@&J?0_QeN13PI|9|A!E=eGr?=)#*D% z^q~fj?)yS5O8Csev&g!>!XBVR_?NLv4#)GJqMZB!S0?(NU%I0Cz>E=~-{=Jxj9m^_ z-s-mt>g`U%bn+Dnr5YC4jEVE$`YX3P{h*vaQ8J#ZH_}M>@&iSxzwos8K6{srT^{R zIk2R!*9vE|hA>xF62MFZ0V0HEPs9!=iqmEZ1E?i*0eRAyW~V@*DYhIL&n%^=Ttm*Q-oGH{Q0@Frt^oCm;zw1S*-%yTZp6ycg_RQOHwYMb)~l5(rIX7q z2X5N{d`6+S3XL8ZQ>{=jnY`55u z)005sKekHTQDy;q_;RD*YYqdz9STAbkgxv9@C*87_%ZaR$RUdss!RGBtH9@`g@n^; zQbdW6@a4@sz!aIQeJH?BLQns}MAg~5ZBCuv zf4ihUazIjiP@^k-ZT!LU@Cn`Lu+{T|DCn|kCDF$ytK-9dZ33ZLez3@|M{b(?j?C~lEGpZ1Dr$N3 z1Aquq94=MplF|^5*xhz>xcqW40dC>;!uo92wURjHUqVt4KA46Qg6RvMFd>d+AtR=; z;(#Wc)B2GVbJbs2tLao6^i|fU9~dO3YxWl$0-O4_b4crNsB`*B+p+)7h@XRVln{yW zk$%(%e6F)c@7BxtOlD-D-iTOvg80gD8q?wS&q(%^UdCtti`VmjMMm64#A=PR3nPXO z)M;`k@YMNPNWlJjkmKU3L1BjJyf4;w0$->lrxdF#onLM|SKfD9yR1Fg&!h&BC;8pg z@V8HzZ4Vi|xB$8BO>3>1fx_kWw4x6^`$8*3mF(4rsKAR2Ds(fUkZ)~mxX{!O&8r4} zr`iK6L(P6Gp1*-d4$TOLmvV>%h9{7Tkw{>pSLu$AeAu+Ou<%4Nixx*TLQ0ZD!E50QFSO%=7f_?%myMEuuVyue{{zX0>}vYJLlF z%QNVLlvHu@!^=3||Bgh&+MZt0+!s9)8U5~MCPwEifxHL|X$z%!5Q>B|@RV-CyI)6@ z0{+k2-5w?DUzN|Fp61`3EHxAVapbR!|Al>Tktlm3Yjx1!ZnPi=HOS$_mW^RjT|7#X6Kd9T_}kG8yO?c-a+Qm(dcE!TG`E zmTrg*n@L;j9AP|ND5$shMwD^36zR9zM$ge^(2bZCL{6g;@1=L~^5sbNun+55NFA`4 zIa4?cb*bZ^R6!z&p_xWQC2~v4 zU-ASlo1Ez1>F#v{M({gh^LU!BMQ@@lU#8!P_`g8rg^x4>0z`hy`X%>I2$sKH(#V>c z@!wTGKbe)^Gq~EW2cPec%S)?J6&L>x&YW&Esm`*QnhU3zJC47}tE*9*R93GZnWOb! z`WG=l;9W?!{bldFpOXU%;c;S5&GIdxJ_8_9A#K-HQ*eG|KYfIO?0vkFe=&jGa^eEvk~7bKH9#PqJiySDj4E zCJFcuU$dScFZjprW(yL;xk)hp1jzh(7|}=fjPR*PS{f4cW7GWhB>>J7a6I;C%vYf+C7hoqkirLRwTlh#-epi73?j=S zl_*>IS*(E6Ig*@xVo8f;tsC4Y{A76GyZ#+vKL>N9Vc$u%qbD4jq4?Qvu3TJoMr}4r z1qi#3Skli^%oRW8y4M_zo-5NXwmiX;TGoj*op8@&jooan1IaF)Qjsj!Lz1CtuI(Mud?5SB5J@=o#^P{U{Je z%@OcGp_652v^$cfD>_%f=7k#5a2r5kTgv{A=20}&(EP8xa_wWIa;i7meA47zuP7+$ zgoXSMV2PgO`_j-ZU|R#Q<)A0t$`}Zjp(C_taolAnnP<4Ogv6NwCW^d#2P2N!=Uh-C zy_20G`9T)0FKH8bjvsQnXAZ4*XrHGJJE>#)v4)UWnTmNg% zL(wT7RyWooVO1oN)q8`3s;*#LMebL#72j*dto5=eVa0ldnQKVa_Yl%{mi@m7?K(I@ zdnilfZrb1H;YR4&enYv`e#i_ODc_IEj^wb2P23x{&pCin1s>kzs(#R+K5NGloDQq_ zR>L+NcL`qt3m@Mq*K~H(il*9TO3b_EG+2n*tLEXZL3MfOvBRRr6HW(`Lqg*IIMm_( z09#YDxzqk)i9}dQ?s7b<;a9$Q81tsA>?v{~dLuGhJDUHffiM?9F`!gqOgDRGbTqyo zQI{9T0r8Yrg|o;MLG~JIBL=dsx%n|mZy&e_hmmAyA$7;E{4DsG3@NE0X^}H-W;HBe z>veRe8v{pO{8bSdOU=9XXIYpC-qW1s2Rh3RADy>HQe%R=z<0&XjW><@YQld{m?q<< zFaC&xpXxNK+5c(15;XjHb@vfG4(!Fcv;6AHJ`H6P{-Er7?O^@2>kle>lE&)(-R@J;moTDgSOyt>)mt`i&q1mhHYx zN;T=V(VaO?MTh9flOe&uN|%yN!3mAv-YR&eiNVYQ#OsISdE$emAK2eYTb1G0=hC!O&ucsjqhP>{sm+$QU~GU*bWw}SD*@CX_y zZXHixKvQCLm_&)GDJ9(eF+b_5=a&akwWT)c%q?AL=ynYYsi;_61I&45Tnm^dG;n9o zOKQdDiSlLx-GREi~ z&9EB8yRjqRY*##aG(fQT*^pFouGKA_h@Y@R^YsW{frF4lIko_Jb zKbpTBiP!FE;JdRKd+Pu@$$TJ2(Q3p>M%{JAaD0=ua(A~~8RnfHR->}g7OSYQM z#1(aLts_>uQ0lnuX~`bln|p<|vUY08qe+BR_Q~e8MBcj{Xh+Md0rj!Y@1Jc*!?_m+ zdd_oxH)g#{&q8MV8TX_pmNi$%>#56M8ll@kQ=8rUV>Fh6AXz>sc~R#kB=h|ljT!e~ zj20m##d?qenZy`7q$-kEt9`y|gUAB49zGviDssX3d?w9uYZ|=2O^H`Kr5HWc7<0E& z+aAKHvP`!H6xaNQw~H})s{MY2@CszFTA{3ly58&~`NWBMC(w?f<@B+L#)6khuyEnx z-1D*JKyubj=8V{__^IM&2YN<=YX8zXbZy$VC+GQIOnQ8RGNa>@xBBW8AhiAWIcZWh z_|k*&isl zC_9O5sQWnRc4F@MOMxI}q5{(;*3UKgBt0t9({JyQ)uPMYncfcChwJ6ZSpZx_7P)OT z*zmfx|IEVcP|5a&0~eJYg?1@=W=iBj2|hR$y1+vSmn-`6WDB1KlcQAx$yCZEr`DOV zeQ=qz%P~KBG-N&U@+{(N$06kw;620UA*n5&El^;l-!q|2j|>Y_@|!j)Yc~7HDMP?% zQ-Yp?>qP01nK&~ySkt)n<@{)g+u0WXKCv`>Z!FbZj~MFF*qt22AB#N7n8B5^~;y{>brONz7Wgc$JRI~n@ZD1IVcI-xWJfJp=c;75QMpm? z=-UIpBJotKDK)9tQioo{y1CA2VOL^J$uV&I>Ix+8|Ap0Ts@N0D7StEF*ut?lqmrlcdSY}4nyWDA8j!n=|{dM zf;ctxqshE(04#BPOqgl?FC$cG##sIF6U;Na$w5D^A~=)zu@LisvBwE)p<>YulTR(U zW&jo~<_$p9o|>Xi`>y8ew|@r<+41@=DRfJ;mp8;iSR`J&v38Q<@2J22e(62wneK_c za-8$fI<$`f@H+`3m1x7v3wTpq=td?-oZ?*Zf_GU%*#h?`B!oLC$pLVGD*}$ZB&=_T z`x1$XPsNK`f4IetUy)jj$ep>xj<0IdSX`I71kSjmtWB`m*57+zMm{;+Sft+eIO8Xj zLW~<+&H;{sr$3eHX{f1@jz=@l<**sQxz}C5B{Glf#^w4Zqj!B(ThW9CahK7{J7=C# zexTO4R~k(5g5Evyb0N5n^$(JrCQn91?6DlPG7BXg>7!I=6ew2mh~ayc zY#rX&DrR>EN6= z0JAR`vOncfmMNk7aFXq_xBa;dr771UdWX>4Yqz3N4a<*3{z*{w?>{Yk`C%w@{hH3FI!&OvBy77{qoYxthLT9CwR})o?rVyoJ!eDCr>^c8c#gi zz4DDoB?sJ2Dfy+=RzzMnlg(J?qGH2N< z_hGL@fGCKP^LjXep%6XanT5Ie`*Qm)PG#qN1Iypp-yS;WCgLFYMh14fWGD(sqMyyr zJ&NPV^9yy)2h7N8zl#U3$`j8!rn?SwHW#1yfaS#}l9GyzmT#W>W)>5+l}XkM%?x*j zjY{UZKgUuNT)4wY(BF7_qnK7`TbbKwlXO5AE;<9~uIIm}pEDFlv|Zvo>Y2ds6D$GQ zZ%CTIu8w%l9>?E&2mN!J*<9h;G;o$0mRWq}R`Zej9IiDC>Ll=RFMvJJ03OPnp_3vj zEiN(-PYDjJtI1rKb4=~S(b(xv`rJ3}*SJ5#toA|DB6wH3IJ&Ydk#<~XoQ@D8i=BL* zeupXN*vzKRn9FqWbcfD-ZV(DMv5X z;gtxfcUMyHtlysDTb)VSv#?m6;rE?o1jUf1WkTwF&RU7-6^{XM$re0`J*WV?VbkV| zh)~Y$Nshk#p-T`lhKkNOd z$Fu0NO7Jl?6ug@@FantwsZOD-Ad2Vn>sb~HVH|H^joW4AZv#h1A^C9rJNpts-6qXxy`sr`NUV2ESI3=uv#weLgp#mTSLo*{=xfJSwh%?Qm&+W_O1LVq(&q z0<3N2YfK!s&hXQYIO%e@0*W<``f6k>j7g)o@v*Xa$=IN=aNv-dJ|1hhI_82ip4g+-I!MGgers5$yoDhM$wZv(c3D%>-S2?z)8O z>M*XZ#!PH&D2E?4F@NJ$o;fSu01JMO!}aI6376{=ye%&czH-0NV}wy=~3SB{_kgNzX2~0gk==7=nbM zl&7r=jf`ZlF2QV!=%H|JxC+kQDxB83#3dk0#%lZ|k zA_EX%AQhI?cfjM$A1i)yBloyjw=$9B+dS4rYW3lai@j$I0a;F+-D!=UN-?EbcK^ax znzX#|IYp!D_VMlH7%DNlHBV-7t}39}^R|X)W!g9>+?Fd5R`p>ZFnV~J0L~NVm(wM< zxyOsJoYcon)`&=G?3|(W`*iTLfR2nc>}+eNAA7h=_F3Q?l;C^+mtd*Y|Gi#m1vDc&9R*2hbbb7qn!ZW2nuzK$XEv)+S%!_=Ob z#N=mu-$_%*VMb_j@dD58R+$?!E;W2cXD6;F5D79u^COMBVqi^>cYTRoy1}xye=rF_ z)@n>q7U1(D40I1Ne55$>u}2PRVCi1yKiVefXHG&-5a@kNq3AJqD0}SB{;G&BXSZ!& z2-fXKEA%#Ae)pvGw??OH`Ws+CyYPe2=K^2bB8-pJ6m0SYXADm!M9)@q1&xr;xdFx$ zAKp9A*d@O26CD=q04~)FzCAEF!ixJoI+% z#|9e=6Yo@z9F1WXSjGjdWP&p7zn@A0fowllLk_}y@glK>nR@2+$L3oawiq#Hg7)f zhs8hyLBDSTJ@NdQJqS+)kIlxqRq)r4J~-=5sp04E_QcWS{o3VGN69L}W**M1A)+k{ z0_FDtm6~)W9p{4FWz}bTBazT^;|Vp7IL&EcX~arP0IaqV`M_X&;V)mm8W5$VcSGX% zvSS(v4rJoTEwmN-->v!*j)65PG2K{FE=7 zE2^>wk9uzduEvc_#bbOb8zw3$d^bvp9S4<%>)So^StmqwVpYD6m9w@V_f9&3+MRCC zCAnOi+hSQPzs5(n@}gv?Moe>871_De`T3yv@{>l2d9i#t;3Sqo&**QV3znveDb`&% z@V{CE{RX2>pXN7S`uL9sU`OS>LV%#QF3>IKHnj%Nvz`8SU4i{9b&O#aBEanf1{Kw1 z)Z~A_%}4d4c4>-rxSRN7Q)9oZvRAg71I}At$MaYW2`%&YbA<&dAefpA5wZ5xJ^YGE zo|Mp{InjAAYd3$2R5nDDXPUIC7;jM#wUI2AlAa4MwpenB*?8U`YWj|9xK4>G4OGrx zHD6LTb`nly9Ps%r)zmFd1k97zF37g2cWnwybJR!%*kk)>6i~}79|tg$8P(8`^FXT} zD-UE;Z!Anh3(a^(pS_udpinI5qZPS~w1o9qY34=vX5HlSAZzs@BV#gLp+WK>6&HY_J+j zVH6d`r9WTErZzrPjdKn2;ck9tAHg)JfHbp$7MM+`r7X!x6XljVua)#nmGwg?hzhNpsBN z^hqrwh^UJE65IlV8TZFL^?d(OYO9OgnO1(A60s<6tPH3)fBe33Kgy=jl3(1$a8K46 z>mBUw^-yGF*cQNN+JRDzB>p8%Dc$u&DQcM!e&CV=ut4=!XTBQ;ewvQO9IvHFEGUsgrQC6S> zzu2!4l7!<@s=8~>GJ|28Jpb*8?z;2+9>>>6aHYE9cAaiDKCIP7dMjXZ;%CU9&Z{s4 zH&}v=y+RT-^6dLvJN_KoiF5%a-c}Sa1pqf<1pK#d5zg94V~lncrc6RHNFzPCljkv_ z?r5)|+sSQWuh4LBV?BA3fW+ebwDn0nYNDOsDcC2K?+$Fvwhvc+%O~2N|os2wtDBZUq|Dbk>w|(;GdFS z=U2gTGEFC|CY2k9)@#)JAr90*+h+5RVOE0`2~%VvZ}qWn$}%~7 z45lpde<<&I^5Oot-dgg6x*>OF8LExePY_+tfEU5Z(0-kx50fpCq=2lOU?pypn?uNZ zMD(%H9f(IYaP1~826Fq`{G>;&I?GOdrWVA@?&tNH-D5bI!upZ-qKa7%V2!ckG&fiaWzh>iHbN~ zMB(&OQNTXL`^;-f>zUa8H!$T;pk2I8C0k$QxKhd^+9Bj}tP`;Pn$dF0>I|i&YQlxR z(f8w>aPAUZM1`WGcXm7+!6ltbg|Q}KmXD|UiG$-}TFsH6naDPiKtEVzAl_6dtfo1IvX5COF% zx+h)F&&blLCj|T;v>2>%w5&#Ql?(Q$DLG~Ho%$5adqRk4m>j@4fiz5U`u!x!Tq3^ZpZ5eE= z;z8aD5<+u<6xAdVu=fn5xGjj*12c@rQ=ea1qjwL#J*umFz2yE`x2sArLW6@v|Fx0E zs3b0x7FpaakE5LRhVGPMlRQu$c37o>@^?f*oD#7W&X&RyUA%_IA&2ZlESsiBC(S|& z#7tJTFw!oLPr5llI4^y^oqWFnu$+#qoho3J(NYa6s%JG!$ zNy3t3EBvYV1E4ThX+F;?$v_R?o?(rf`Q>4RJ(&SK{AG9Z_o#X!g!m_G5elxB06&C8 zQ(N4~LZjpEHIVC97?esleEE6*&}hk}50=ypnp5YK$G6z1&nt&6P)SxDTe&D-4Jk+q zCv3TUXnZb6Th4<33R@#_cPw!$X!WS3t@h0x?Dkx(*Qt^AdaEY~r;PG#k_#+DDK?c} zcIee%kovKTcF=uEs*gksj`n=LJK{Am4WDrrla>w_uziokwK?f0Y}EhN0g$I)4Sd-W z3Jj_nC(NXB=S3$qiChELKHFXwcqM?c_AzRj>r+}wtE1i$P zUOt9$xAr}g#b*~(=nJFTX2f513R8bQ>4AmD&I=)tS9iXT&;059Uh0{yEIR7X^B8V! zyKD|QE#_TtKy$h7D0i_H^3?uq&;o9vgVJor7n{0cZVZIrBGDwABDEoG@Y1X7_GE#N z|2*upUgq`en;{zZhoACbV*PNbmH2X##Jqxv()nA8kGKx0BjC_+U@m~c67_PRrM-Hg z)mEs#!L_f?r*J2NR7*F_A2W*ch_&{&z(pACx|>!h8NkD$z-=CX zSMsalK9XPv7JeFb029@Pf{b6z+L<@a=uZt!cq)DZw+kVZ_Ku;Pow6CZeY8zi5?-ES zX!5y1lC{>rui#5S(LmJ>UGHsB)qCz%a>+mzjO2YZ>6;fe9{=4aIo2rZpQ@GZ1EnQyKaRHnbX+R*58>+G)jq#X;)i(ul7pV zWjRr2#=#Nyl9qMPi`rd9?;*&QsJASdGRN~(+{Z5^JJ*>R^&wUEu;l-QkydOKQq4Hf zn@pI@T)rNl5xBO5+|9jC7_RU#9|6T-dMXLzS*o=zmIgH-B4{c_ekTLoG)%v#)X*4> zX(R^mwOZ6%X>zdxfLw@QPrtMZMYy&v>oYT@?n0?Z|7V~~rdSP)9-%j3ZpolO*S5J>^cg(`Ph=k>I`2jtONa$m9S`_iH;54BMFmXJBL~P5| zy`Rhum^#_K*GI+k0KYmrsz?RyisP)`e5- z(TCFyXA;K(UGw|c@M4>r#fj4Ea+{4rEl(~$KMt&{-Tn1xCh*~bM|SARM) zj}vGWtGNykdC1h7S8&?jI4FvGK~;9cZ2(5YkH+8HD1s+$yM zFua>J&nMUIRNDF!{6#z5{QbHkFc%jQFv7ekr^Y=BZzV48^wtv^ot`{JV?nZ%_l6|O z%Z?lzHc`TSUIK8X3kS!iriTBZKx+ttV4Yjhje3!SNH~^geE_Q{fH2(%pN>Ygjs@gO zSG)oy8!v>2d)NLZm`&Wgj>B|JTZhLo`8_C0^G3LthJKdl=e0gdc@l_A5x`RV^;GUG zn;vQFw$$iX5gJ*0hpP|H>HQhqBN(VLIo5e81Hf*4nwTDnKMrpJu&9GwDpGG-BzQyX zVuX`qdz++=a!Q2t?V@a_)xTx&tW8-1XCZ5>4?YJwHHPa9c1BYjgpQvT*GS{v-_geY z*&YLM-nNVFn)4kedWXPn&BKLCv-1u|zun+aX{71(Ysvg!X~60fWk|J$5gLB~UA+_G z+&O03vT<-{hr(Q`)^A5Y3eze*t?t0!!|Ftt}-$%b_CP_+=1LJmty_4w+7jm}& z5z?wjSIkpE7_OG*#&{eUH8aPf2Ad8R3t3V>*;I_bc!v7$KQA=vW#nv0$7g#^z(hTC z;}3p@d4xLd#Jc`@xApMIsY$H;vAN<1I!~_~m8{ zQw+5<^1z2fF~5-N1GcZDbZf#;eYCa;hJSmA68a3?NVm@$?4U{<9~#)hLjx1^ctUu` zK`(C2op82f{+A57ZzB)9I~e1GeX*$P;l0XIYJc$^)R>yDpW?cD>eMqiv9(!p8cQtD^OKsd_0I&}=!^qW0(M>Y5f{I`cK%~FvsRO z$K8=!@lr0w^`ANGnB;>uMM0XQ2yYI7J`JKGWioyXG zRu%os`XnACXH1U%48(LVkSBJDqP>Xu{s1}4{n8hHL_|hSjcBFLk`(QA@b(ajAa9Ky zI_wZ~8RkZFuxF$b-mK3oHWb@%q`G-$aM;M>bCk!Ymaf*7{(BlvhZK%w7Se8i-jTlk zgJFu<{q{Y2G@LeLp>`s|e7c|TJ8D{o z?LcM+EO>#`A9@^};kXf<8DF94eq)AGX%U^4rvD{3CQ%EcT6AE%NC)W8r^d5`(s65r zK}ut(iHq2GVuxOn?e_*WU260SsUDiyDP zV>M5bPzud43<^hlPvg3w13p_)oMo;B-?0D#&QtPloDhSx$Vgp}$}M6YIocKI0= zjQ$lq&q;@C+`|c`4a9J=+5;(1P7{z1Jz|oRLwkQn_Ay)iw`BZ*Mb6ucln#|Y_)hu{ zsi0KIxj2RTy~eB4UV*8sOlCHwy@-K6N5i`<&DcNsHh%{)bNe z>;KfL5BLwAdSj9QkbSTDPn~+L|J12x{7;>Fod1L*A$R}Z_!!DtY-CU9nu|Px95pJS zrFXTNRzKb`M;#H-Grw1vu406~59m2Bb^7-W{_{Gx;{7W#0DW2|68++7p^*u39->xQ z)YOcX_Ps>kMz!#NUu*u-TO#SedP`4&ICrZky%wP)$wBFVU!#jpyrJWEAIvAwH?=0 z*$?UZ17-i8r9gt<{Xc)ffBQfCNdJ#m*8l&HQS?KB2~* zNe>Y%3eB3~MyyXbT$E0d#%0(sub|+o4cCh)^jr)VSjS2*a>R=1YChL-KbOoN4U3KY zOnn5N&*}UBF^)Xi_}!|Snt+Uq43O#R zsRLx(Mr@_MT*#7di7V}6y;gC1%~)*nkPKm__c_|yFT})yzpbY~_O1#pM|7KTY=Ui& zKncjMNA>HX)F<8YF zObjFab7=8ZUS1@}dtWa6{>^{wNu^8bmt+mDuA$-K%KI4Dq_(!Uj{W0f#~QP|cN+PY zoIJd(TjRvjW_Xy`Kk`j4@ReKY2$fZ09k!RSUF4s`HZmj2nMj1Zi^j>>74C*MYD53Y zii^XNZfzOtYR{nv@J7!y!obBX9RHV2Iy_?difPI7I-LXZ_(F=Hm`~Dc(M>A99WzYw zUANB2+sENUQA8BiO6f1X1H81{1VY_)t^wbN0rmt;(G_^Sa1u(FX{T$K!+1=#SUvsc7-5Cc=U>`vnDAv3uPQovHo=G zrljQfyjOGK_ecqA3TM#@o_?3Sz552#aD?mMg-ugoYYR7hco+!huC9o15favwNfLR# zEM0AAVuOG*plt6zhl&)UOsfTwPc=i0xij(p_4yTc+0K60e#Cr?zQUi|stVT{Yl&wr zm*0&n)xmE*m!k*BPTRU@xe{`X{F4PoS#UKaC8m~)`>^*uSOs`*IsMnWV`Af?p+$X_ zmsT%4urRPOLDk{+;z@K2h^u8t*BkEa<21sUHtcZMWu!@DLF;W{p1XUrw|D;hKJay4 zaC>!1C^-w@P0n?p}~E)GmIaFmY)~LphK0bDbL@?8cj;c z#3UzF>=};{-L#-7CMij-m-??jBVK6`xAz7eJ#Iur>C#LEgyY%(u4)+aQV(c)D@4bO zS)AjX67+s|xviaHW2c((h-kaI`~x}#rKGM7=Dc=zc+(zvg@0Zlwk?H>1LG8(YLViU z;c}SLP3t!UJkyM?I-rhnmCl%iqbEigi0QU(o5e6xYRz^#{IkV(O za@5YOi6BP_{{3VsHQq<(&r8e5b#1Q@B-iN{D@T2m{n}YxW$!|bskDjdMw@WUh~x&T z3H60yR98>A-_Qb>S;zv66Wx``8`cf^ZLQ3ZB;k+T)iucK5Y*%cBRLaa5ecY^{F{d7 zPLAB;SOg2zZ4k-@Q9Aq1I@X4wckyFq{DEp7S9HkJmBY zo9X0WDt7@0)4#a(z#XZ?zw@%`6G?Oqp?3DQ@x%cqiibrCvANglohTyuK|$1l0TF7OCLoGyLSDc4wFZ(mu| zp#uJtC3DRi7Ah-ed^%gAry#^C?6&vuYz>WNu1iqFTliA24}!g};|+V9)A-AfMv;Tk z&;SmC3qSWBhtJbY+dDe;Z;*@D!LR;_j(_C`HwX3o1Fy}XO!LX#+1|`dp(Wy^{L&T$ZT0X0q#>^h%-M zoap|1(IICUh2w?Fpf2y*)QOGfr#C-VngAyVUMXSc3>}To=Pfr3;J>`O7BfG;4xFo9 z0gdP8WET19{#G;zE^U+}F4NT9Tr8txfSKY2MvH=X7kG9!JI+w6gDHE}HDhQ3!4eSqIe zV&<|=sqi9R`oilJt8AeSscXM-^GYsb9&kH%9&;bn#-rYb249a z)2qL3U5f;sFgc%su(t<*)JQi3T-HC1W=nG60@RM3m2zoZjzBRA4k>P(Fj-06R{FBh z_R-#l4?EiUbYc*(FW%mae{!FDgHMJ=Mmrv8U@Z~EVeFr{Sq>PSmWn{OdbK6^h`wkUCuF`+9szn51 zq>^|?6l4nv3#|q?*;z{YnLx|Op8UD0C!Ecc-EhRHBD_WB%Scmz%C(ez$Z*ZdEbPyM zRm$y&`Er7^cPS-zvRWL~y=9?G=-ShgX3XhQEHc>lfZu{-j(I}#VzPjQPwrNQ=BL`* z7prL$c4N&X)RjV^Bg=aRj();3wCD60x<%*~3q|X>;^?xzHt~GZpN`s_-yt!dcCSc1 zZD@>OG3VE;4Vmf>V`t8$T19&D1DJGy+YT6{`x3J z$$HCKwyWJFr9xZ1W`a1fig__{@y+oJ{;yK007=6bJnGLD;fxuM1hfhFI8{& z{Zn{uh-G4Qsg;HE`IIQhr<4jdHtF9ANrUe|y4xoU*_2C-erS;dbX|eT$v+1eqlLMM z`NOwCRThbSrT?6qT%{Ulqh;u41?sy!g{=b*D#xcaIv`@+&089ecaW@whiLZ4W)rmF z(r7};^Q;I)@d(qgT}GD8&y&7z;yBcp80m|4sknlr0a~v+OHypl?MRlyO}FAx%cb2l zJ>b>|=F#?-peVfS%SPyJ238Va6GO-OwMB zO@!IT?JFp#;*QenB!ZqlbT&7?O3B6TBO99GyFQ?SK%ia54iGbQk?GSv^3hoKEVD22 z>A4y2Ke*xw%ii6nxok-tyn&4kRCD|$wQMS?eHW%Mtu&|-I^iaeY7)=D^+j?NbtTw> znBD|c9>+iG8uIOWChB6-foa#@O`P=O$A0146u1*w7ky;jg8VC?y*4#bdwII-_PG+! zUbiR#kLClFK-=ydaebq{@LkPTS5zFoT091giqDh&WW3v7F>nQt&`BtexH1uIx#+qg zw$mPGc?(S7NyVJFE~0!}mb?BiFpfr^jEzl+q*ARmQQ%FORM;CKUs;lQY(l~a_!PqM zHVFxd`AQQT5pe>tG7=g|JdCNyK(j?bPahTap<_%%v2-wjmK@?^8vibm)%=L4?9qnm z5$RKa7ngz+rw_h*+ajSHJ#W`I!B^?863PVM_O%f`h9nb(HI(!N3%-y`J0vpe5vY}@ zCO!bIC#zxvV4!>%_X{#<67+ZX8qf1X#UJ=wPG}qLDjfm+m01OfW@M&Ji{E`7&=2aj zMIT%Z?v}@9gGN6CmdYiL8>_Ac!Vcz}-lzAf#O1rvp|M$KYyji|U$_J}^icd72v+*O z7~*4c#U>W7(#mLUTxjdaJi-FdUB)!M5=S2Y5ezti}3HzX!e8 z5pR}oah7GQ0JKv_77mWQiHU*Ob9{Vt7(KmXA}Fw;H20#&nmDX(fC|HK8$mKDrxM{D zWGkSKqD~X8Dml8^in6WkUNVjU-cDcQLO8A3BzOEmft5K#f|3oW7kKxnr%AwD0a#3| z#DYGM7nn3Lu%Vrjvww-nb3H-8c#{<>rP9laG{TLzHG2Bd?rLzH3uZDl>_!m6GH*Aqw!Zi67vF^DYY+YR^Qm!{BNM{g zSNSqWL~!1y5va-Sgl9@+iz^Z$#YNVtV-`4I@MyWl1eqDoM5Z8o8c*i$fV)xX$A?r2 zoP3jzF@qnBl8gX5OZXOIyz=Zuw?;IFt><+kHb1V%1}zs~C}TEF_kP7T$mp(7^xgGz zIoEC-_wuS}D*2NIyF{d?R;De>SYvf{q7hCAn#rprI0I_fa--eIc8+TO;3P3S6vk@M z{pu$nH%TBO+L!r?)t%V6)Q$()k_=(4Cstygw1@6RCBODsCr3%O+u)bkcZ0l|9Z#f0 zONu<)**nxMr|MIr`W@E-^fC%E@0O$O)(HH;t9h=AIAHRXsEFsje}w4=0n+I!U^eqo|{kup<-LF4+{K~pHb?!~?00m7-Oqlf*;>S-huuZYD zLlqMx-R;%|-KuC(MdR;F=|7H!HH{}gPTC#K*`Z9$I~z+WPgA{=ez=T%4>c?u0bya0 zU6)t`vveD9`hu&rlf1(G&6y#U(CCPy!k#==w?EC}l^Mfm@1TCU)I;=Bzz7`MXvyVa zfow4pip=Z3j>|m2w(IFf9l5byh$;5Sat3v5yX%r5LRKNcv?UexA318OzPh;^w7xlp zP^5mcr7$~bPIOJMbDa7bx0FXaa5s_p`OXwa&kuHs`$beV=7LrvBiG*9S?ZR+MZzm`9UG+ zVS_7Y3YNffSio?5Dcp9=Hb)H16(IYO(ODgF)MUKwM!MbCh_mT-+E%K0JLkI+KajDJ zIbb_8nvJSs{e7a`*&?3#GJWB9a`wf*$j@Jgr8-r&Jw1 zi7g{5IPXM2qzeA+RQCte`g5HiJM_`?w0WVUs|mX^>7PZVq$?3`Qv-d=5h=dOg!0i4 z&IeXGOLKoZ{eR@WWl&sQ*RGoYK>`E|?hxF9Lu0`S5ZqmYySoQ>cXxO9;O_43?!H&@ zJn#O#s(tGG*j4A$5q{8BO?T64%9?YIao^WqmQRh0rfMjOPT8I;fFdp4V#j(WI&>=7 z3iu{s4kMBMBE?_Mw5xZVfav+nZZLw8M?#>_z1P)$IfO4++-q`(qnBu%&hB?a^bmca zu7$WP*}(y^`4<2d8~pTvX2eJj+@O4M|9McZWu>?dbOqyx7$#yB67~8HU2;uoH_`Ln zt^2GSYv*tLcQ;>bkG7z2^}*xxSo!(&>DIJ5w94jmncZ}?MX>Gb;r8~g_{Y1sIIQ7; zA{5q)>D>##6R%4Vzf5?k8EM>jxq?MiT-jP?RnZB) zUSVbZF6YrRWGy%rUo73AcW>Uk%a+-&=Zx5$?84>m*(34+F}M40x|Awhv(@>7$IFXi z9Hm&6W)>coMn{9y7O*l1u=AJe2$~tEDv0#|c&S4JbkjHr{jq`EY zvwY26!_1;6b4@4x`JP7!WKFPZAv3h2pNy*dzAOGYyA7xwo1~}aEdY}`TmolIXR{%Vhj|8knb~yb#G$fW>i-(TxZ+A3HM5{5-&z$NKARi5xO2zc;jvDif zvR1uqM(vo3q|I%bg{*cebFgI5=cUp%db$^Z@#0uX;PVSh;nJMx5(Uo&ol`PF zYZ#Kc!%nHXt$<$RLC?l*D%!pENcp0D<6V8N(yhjs+EcITjRvt?T;J*XC7x5a;qJH} z4NC`EObrE$<{BlN!)w;GCmgxhnx77RIvbjx1rGb0ulFA1M9ud4l-%#R#^qR{BWxk5gnx|CFO?D?&wV(8 zVDNG_;~v=Ic+7T*4hd-(U*D;4m>7!~BBF#5RqUpW$2zB~a)&=7`d%)^qd0wzofWnh z9==u#t<(w+C8621ldKI5KZHS>&K*EAl$UK$*SYQlJ*~`bd&a3(XTft{zUs4n1qxT^ z@L$Ib{#uk-B{F)bJ-vJbJ$#)=o4)FUihoPB?wowFxHx8ig*A$|;+rcQ>UIJg*k8UjA!Hb(5N;YklWG!&VocJ>9`Vgj-8zEa*B(MHvXNk$#gB_D1gi( zhVfD~jv59ZAOAXLH`#usfEw?BLMmHnP_aX zejz&^r&vZImXM#={NNO4>iB~>mGBv49{`KSJ*NBnIsIaen|YkTj~J@LqRSL+GDQH( z>O!_3c^k33+NiG6{go0fA@qkA=2@e~6Ie)LHg^Jo!UIJly8&F&Ev^sio*DnDHC^@K z+*2`zh*VBa&ieJi)MZ1zp&0;s4f83tkatp+zC8obaF_SdkVfrUgtTCID>kA$)44 znKp>NviwPRPr@u>tTluK5*~}%fkL19qW)|$H(2dZ7O}Gxs3movca=D5e9V>y`PRy@ zIhD?;^=gvneaff8pfhb>oEW!sk&R)u`nBc88K3Dcw#`6=`gA2!ez76CrX7!6)qtR%cDN!8uIJTIX7syx{NABTD{1A$-I>z(PoD=#Ap4wr8f3?Hw9euL;LP) zQ*SbF$#1IDQ#eQYX`QD|LdOlPkQ-GR%GQ#$DYdZg-54J)s5q06Y`=SeA1`#`bMOpF zju+$azB+w^ntjrh^Uph{(1m&u-{ZQ~qs%nA1Dw_V*Dp;4j5bp{D96i{0Qza#Gd~z4 zSz+UA(B%#dM7L~goJ(n6=dJmi+uyGEL&ehv+Qi{)ahjn$O4769QH`0_6e~CPSx!t$ z7Uny1UAb&MY>?_qZ^s(L2mNF#HplTwQrRKg;i)=v*)*Odsu`YLY}FOr7}E14_~G!q!lc=fvvu- z%kD7eYR`r^Oq6F@LGk>zdFl^&gZ+DP5sRX*aQ=0PB_~h6wSejo_40iDwl$OFaj|$m znmJe!`qQVl>W5#z7IoYDf*Ovatl*}h#chJ$25j$&v#9@~`KaOi1W7Ia493CVfpKJK zcyA)B$ePyrOq3ujAabHyOWa?D{OH{mu9k2Ys{zkinv`O$aEJCwMQ{H`jpq{24b785 zXlo_0auPiMYfxKl#xHH#hMJzsyEI|>i?qXog6evFQdbsLGNnXT647m*4*icGoID_r z8IBj4q5Kiv{QVK|iMY7-LI|WM&mM0~lFUBQf%hc*3KwSo(uz|W21f)Pgx)>D5GueJN7W${$RgH1nx79Vss zibrBYmWkK2svTRQ&iV1T<5Getq7u?`T%SMVz79GBaw+TvO)o&vhg;SP2s$;29@IzT$WMC= zo_#&>*GfHRRJ{M8amn!oh<9PDmU9jXoDNL1;mhkSYp{#Z|65!}asCd%Cn+*LC+?Ts=?pNnp4 zYm@cER{DTRz!<7cyrgj7CA)#4bDg8S3T<*pKkXG_gR(Pxx>^;d{4F=`M!T6?9)Tue zo?D$N-PCm3cbsl5FOE?<*Y*lA| zQJG|^NDsF$!k%8Wv06zfsr6W7?qW2!Pl!nv72g4e7<`WcJi<3V^D*kG^#%XBM@b=(Ex(|kx3RW-Unwee|qaQB&U5h!@$HS zahAXGFy)ecLsrwN-PLh&0OFt7_~&rj;RUYL_Dn{tc8}Wjcqm4#(IVpZdA|7$-zg0P zh~Igas@4y7c97{ghC`B53E`#o4n}Hf=kIQc?&II<>`JIffv>|q>cOk8JsFVpy176= zHjh?e`sL!^^2!%Vlc=u+-Sw5Tw5YL!(8MROI-IY~rEgi>_$;r!u)FgVE5uPL;`+qU zXMY~uV{BzKkQg#!Y#yUp+|JWv9nd37Cj~4_K;5w&BeHxMYo~){CgW*DX5-nIzOBv8 zO6{&kKKN4#TAhU)a|~t!Dha=053;_GhTOI+vn8o%ZVM7z#TT~~bLTzypwh3`syK~B zEorIIEvVyn`$V(t^eC#A5o#%G_Et|FL=eXcO^nWDvhnvWiZTs}XV|VoSs=R^=thW1$1=0q1Gvbs)Y1=$Gwmo)H7K}TgR9=>h zzONJ(7T1U}nI}yzIx?^%l3lK!bZh-I-u4B6WOtHFf~n|De` z%Uo(#PM_nTRY?0Z%*2UYFcIM?PiK3X;O8pN($l^6^s{<{s}6b_UaJ2$O;>1d515Yi zI@Fv{cX_=6mG>(z4g_*{%LDl+r0s=a27Pk~?s}dH!O2KpE0|p=5n<%UwJgcG$xzZlkShR$%2f^QZ`t#=njLp^sO;o zH8^1z4ZfE@T|C_zUTCN>GI&WpOKjf#qaeGo+_}_ySd$40+aI4ezX_gCPyz%##j=lh zy%@Coq@s>2#?wl82=MTNGBUL2As%x-_ZPB^iAjkd7nAP z6&rakC*V`2f1*INgv3A3ZFz$zj@MkJ;Yk}h8k0Dqvg<)JKp8Y>gzl$A9~@%MF5$zR z*%xA^+fnBmF51oDb_qThT&z2HKh6V_&<}3F8ak|a99cdN=++P5PI}AZ@QYOxN=I#u zzQj@JV)A+P-dO5Q=i1Wf2~eTUh3ln9DrR0C8PcAT1aNrwSU_mCGb|Z~+YGo52fIZk zon}TMB^QRQHE}#L$A;()jw#LyEInV1sVgt;0`q>G<>5+v{etOOvnPvQ?7r1>gr*RRgk zXuW?VE>Pr>JE%nuX`%_;GhHuvIli`vzh{eWy>@$oJpR4Ie^mX`_drZwzwPX6p{mJs z>MgD}gC1SlgB5k&ORhZwLA6i#b*pu>qaHk|T}nVM@1c!knU_a-ASM|OgXHvn1ciV3 z3Q@@A)ChTq(D?D*gw-GzM4H_0FUarZ%oWVN!OpJl8y)yb#0p_?2`&!aCA!u&=8S zuZS-@u#Q`bC}dND3c#r<@8U4(y)0IiA3OTHTTzk*kR~Bg9`)#Nmj}r`Qml_0OkY*+ zt`q-BLH76tqa)(w{mKJ8Wx;VYs)Jii0+v9Puqq9fX7?9AoPvQ8(}k-2mF9Za5uxSn zyRkHnX<_TA$jtofE><}Bo!1uIs;gPe4(5yUY*yp;jH$QP(rBfUknaNcd{Y-U2-p=y zPdscjZ|}l9rY0I-)2g%!O4~}Hsj*N40vi2k4hu{L*@$K)o}HiX2lQ(bH(xMCD%2MA zu67lzy&s(=YA;NMw^Xx*RGJQEW0%PIrnPu6W9Eh+!60L0&w|2(hhDLY-{(EM3T`|< zTsfP`#>lR=DF2+|UNMt-#v@7;0a9FdTIHtBJRCgBrG)b$jszzWqlB>hcG(X>Uud6;E64~aYLmsq6G&ZO6eO~ibSc3h@A z^%eqr;_i+4s5$!0YO@cNLq?y>=ChvGsh}s$f1e5v{9Z)apvaXP1>rf2;mP5<@!kID zIbO2`W3^`&rOHj@sW|y8sXtB1QxD)9Z>q{1L0x(d@`!Hl{$k;ERSU z42c+J;=5*tw@@hK!qH_z#%lo{SGS}tMLEQYkx|$eaMo?dEDqPD8{X`XqIDCsSJ>Mg zUb~JaH^$Vd42WjfPg#6M2h{uK7-j16PgH~1IbXK89kfL}e!om69s(n@UlgK)8IbKo zfN$(>E^_T8d8Im-UB~v>-or_WZGzDwTq#(STc3%WMuOju8onMXCdBp$Ku4F+anx^= zsJ)EA{O}v?v}DGt6lzBpFZY_?e^);%of+c9b8AjFbm{BgJ@Li&Q(GMY6Kk| za@|&gr|J5RcNHK}Tc`$CLX4K1~|%~)uGP!cm*1}_+>o1=u^xyaq3!19O3hYG67 zpBUQGie!<;Khp~F(_PH`v#EqUEjk z<$Zk5kH1#p;WKWLuTv^9p!U>6rz6-AT##8PkqAU3$@Z=}Fv!>`FzbYJPO+`+_Na%` zN1R#Qt^Mo-%Jm)u{>rNUx1 z{t|wKyzmjIj`_QCUF({pSV-2`Ep^4sFgUzg`|HRfHlF`DL(_BboqsxlB%YEL|A>EJuWt|W_Io-ntF znAFMT3s#_%U9hOIBp-FMDb~`xe!;a%<4?z?9o_B4hgYP-v? zv2>CdUbhjE(zExAl+Gi#wYg6B%mHPhEQN`R9ipA?RSl-4zVJ)EeCNx;!u-=%y0Sm2 z1qCcd59eY<55)Z@J{R9~7dd;s;`m#4?_T!-V+EBa$|n-B423~d&X4UmZBx-`0altH zh_WMcag*8@5Voc%qUX_55BQp?I2rXSj7y&}qVvS3vE%el>uDstzwY7ZLT3->;VnWK zf+fTvj@K4Wh9_7Gs<0$y#9Rmz0_uv@0wCR6&TF|F!rhF8fphK_XPs(uhea!#M4!^N zSb6xH9UA`eQ?xUX?!{xQxc&1wj%kc%m^duxuaDO^eL<~zId=;HNiI)U?#+FFJ`2+L zzTtOUjF+dB`FE`ehnpdHj8bII*ej|T^~;gy5n^&5+4R; zNea6@+T{`S1zFIGrBaIhn#^f#~<^7k(oavu+3I$T{L$Rn{ zQ3M*z7)1P*gHjtK0#F&TG zyASh6oK*(Wbyy?>!lavZXGXAn$$f8c?LcAG;N(cW+wvxu_IMG+6Au%uygy*&peR-& zx~a1{e!5`q_y9=4o)Qge66;R&mUob+!J$5R1G+aBL?wlhXDZXt)7o*X8lE_FuAr^H z810b~?gE-K=iJ-I2W+#qM6Zp*Qkt+E`d!6|u~k}X+@k10RRfGVe7VK@+jl%)e5tN} zkdB?$6R##dv(Msw;!SZ(DxLm16@`Rujd8R)+?~QlxoAlH_x?{$UkSZjjj!sy6h@=! zK{sAu_jG10JQ8W}>icqVBhrNYbjoQDC~v#6skx)CxYm)~_EQtz^OO1#-C$u;2y>5y z!(}JxI^$Yh05CCS9yWr1iHS-h@F`|Lg|9U_u5eXr>Ld6RphO#0lc?vS_QM5S|H zhpaI&@>VvI)eZx#CQ}5e61j5+|Ctc-0b>F|g&sq#nl?FSeD+ab?~8rbPxB0k^hm6F z2i@D6V-C;JU_cqp#zE&`gplb-nuSJ_t_VBy1z$Q1|Emg z<=$Ny)tW@tnPU0Aex&Se>g*_%CI>yr?hld{78YsP`w8(zXdX?01PL&u<67eR!mur4Hlm%raks%LWzErDy4EBC-u>H}i7y2~S}3F8+8XB=dHTj*88Qixp`52IZ-CqH_5{4+RyX zsnE5RZXOL=-fR%dxMCJPYfG2WPPQ{1kW3S=DE)>hI%;Fw-X}b-ATf(ou#>v(gx6hy zHx9Y9dtzVcmzNo?Wm0K4nq-6Mx=vQaE=K#&Cu*y!#GlORbh$Os7ukzfL0K49m}iAZ{c)ch>eCLt4nBB0Q>2R3hUZPjXY(7OwI3~}}_d^O)^ zlSiQ2%HH^xRf>4)h$`QCfp!o!mOlF|y?5tN*1s-A!w*S){cyB4T*0WsW=ixr4lA>e zDFirhtORvhp!0T^1dc2aLv445HWFH7-&_{vZl?yuQ-H#<*FO2X&t%M4@eZ^dHD09~ zvW=8LfncA!lXU(*=J;IxoP1x{V>`yrxaeI+w8Mf4*AvDn0h`Sy%HG=HeH+Q* zmg_s`5hgvG?Ck7ym8KfojI^6y_3JWL`~9f>cM_nP-U#J%o!wzc`lHs@^RQ2{pMt6* zy+7`=tE<@W3MXKmBWakI{k#^$UGz?MI=y%St1IUTA-Af|m9@J@DSz_1Zo(INlQ0Y~ z68iErXifOPg=;?Jq4@y?0RYWWGobWsxC9me+RY z?hb#ltq0Od$txExebnzYBnUmOpnbzBPAt_npIe5iK$T=6a%3mnOh zB9U^aD60CtY;0`Y@5HB9UWKQ!xj(bHKVCpJir3~b7#PG*E6<;>K@Y9EV{+xz zEfh5_vh<8Mfj7Y=c+tlFt|f+upu+W)>Ems zG{jXnp+N9NVeyA^88RxMZoye6Wab2P_76A9IepzW0-(~y>9XD%_Jr$Tb4~5oakts5 z76U3h-Hj%KRE7-XHM|7_n$JIse;H{g^IHm zEbYEhy2f>mGViThzdfE$z=H`2ZwPGS{y<=V2oSz}n*F`LWl^L&BdtB#e~>1^GSvfj@&CNc z-hw3NAV83>F4bRFUh!}bp7VW4)CI{!+}%@bDPCt|7IqNK$xfGecWfyjqZlEAyw&Ra zMbqTN_u~~o>JkHmiAfMF$e=fFfUc9o36ATTg|csI%W9%u7P z>S9Aql!Bfn;PuA+&5dKWTob4!9AXld)pFYAai`rgh}vK+|E7`45#m_Fj$o0$6O$925G#iCo4N=M0}h z?$yOJ#DaR7O8%)iMV&IQ*Y%IS*RP$R8&)@!FkvpUX%aA~SsJN6Sm9lQm<<9+LaSQ; zJe4eJZXxVr9C@)j1f0-)#4azcc71O0q91QN%}s<%iqre#gFX6P4xndaJr9FKUhbQ1 zxY1*{Q&ohfjq-#DtphnxV%bLJc>VoIu?*)bO|DkBwsA3&nMyeB@{z93?ID)Vo0Vr@ z-K$wF5XravDbf!O+;-<$12_QNk;PB6HS_1|Romehzw{8wvK^=R~8 zM(HQt3T_|kQ&VnquqI8$G<=4dVnHXyTIW$)N>AGDAu@@+q|j8}c0d7zG)&%<@oc3e z=G~~~$~E1+T_=ngsnk(F$u+_Kxo>a&A#fCi>Bi+c2VrIj98GDURQNUb`z8z77vxAJ zLbi;s#lyI)n7As|n5u)L@I>_>+9m4)_Lnq7uJqK9a(GB@!PzD9Ryctzx!+f3k6r6@ zb9zXmJjK|n!5tHt?XrEoBT7Z_D~A4g#MNVEC@iNV&5qjGeezOXf`6Rhg+kHPz}beRFPd_i~GYc9TGKYLzZ?lc=553+DRvpHXr z19QCmWG>j6Z18}~`Fh*?gSFN-XOFmDYWMCo)2&{3>*mj_jTpq#)Nrcx=0fW{&AE16 zDNUak=_H$g*+0kfXMG_gWs&$a=oGJLTys<;(^#eUaq}{^IH1J=e~(VB+l${nA|c~= zACH7|sIvv|!Tp|@!7MZ~lJODaS9>OwD_IYHyg3|%N*DGHPgKl)G$GP|l@{5-d`k)% z(1bdO53afTwKgxvX8FnnHs=vuj!yl1*;DeX;-kaCqdJ=<2<{b>_~Qc-6CI)fT#Y{< z{sLjDIBf)p()bZ*31a|qET392G(s&Ip6ioxxa`$be^ic~v)T-NSKH{^s8OxG7H`P= zcjy!GS{<~%jNO|(DHiWeIh;YeWvjmH>cQiRboVj87(K=&+}Cnh?HFMMD~z$9pY$QF z4&l@MQ#mvQxuQQfhn{cfLmZTSVTm1AgzyIU>yUh*y=fBfob&S7c3G*gxTl=`;2v(| zGxIgQJpEd=O!z!X+@qMPxf;U5XSeiQ#Azt4-t&6L=!p(cx;rxM+K z>3#~jBg<-Wk~vX`XRp_;{&>EFrsRT%N@B23YrcS-Xmcz8RJo=owC)=od#n{I$6L8@ zof{=r92Ika-t2+3w6~6WItq@`5Y|w5>{4s7g_$#7_AI@AcD7679YPzaeRG9 z?30P+71|)5or5w~iP%Lb{5-$&k5^{qPv$2mFpZWxv&lx}dos1J>>n)Np>?)(;vRM~ z%G#?A52Sy6;!k~d%GzutbVo)p^?3^oUtqu1q`_6zR)G`ZMlEMgy~VU5`|S4xZXOLF zo5SNmFuC(5WDt}WcS0gK4Qmv-bqR#1bwtbZ1N1EWYAdjbn>LGd?(F{;-zgiN?MW@o! z1eP5bbSi)*o}e*1nm~$f%A9Gh0FsT5$;Zx@iAH=J!+|?Q z%D}H^!t-q8NgsHukDHbMp~Y~qi6yQg`^ybdl&>8(;5!f2y;@Tg5h9xd1lZQJk!}x^ z_U>J0V~ahsy*nG&)T>NBBaAvbn$N0A7^4s~@=g622;6z2bvTz@(0+#wgv=yMU~P4TcC$uXOpLkuonFomd;5-qw9Np-6zBUBi{Y^^K!ET z{#|yK)Lx>B;c~_MBo?EPF9+X<1sC7-bC@5HoGrH!(oV@NW};EyBSv`}MMw&q{=NY%djHZHn*SyVtT^k{xYF?5^2ptVPL1_p) zpM=-EWGm0(zd>li@rt)xJ2B!mllBS|U;jj`bLB!^F{$hAryDB>|2%CSa?FZ2)u!Ro z(G_3)@}k2xMqs!FCVr%jYUW4dndyLVedf2frW%$(HQ}7jbJ3{>;m(7E%OL^O$v{PV zu=%0nnMy{CnEkX8m1V_l2><-V+}m$)r6{2Qk(i#I0g-sqW+M(UdaUO8Jyk__c`!wj z!*&SH)*~DLD;R9qN)}F52w)y8UiFh{(*DIN&=R`oJ*YM}P~=jle^FhED%h6&{zxbr zk&;p}D$fQ2iNa5!O-#^R8^mT^=RtP|W+XeNL7%g;&3Dc8$S*3#e|y~OvnHUWpg;m_ z>4XdnGH&o32h4cCS5|PXtR{JXEb0Ot5wK!p1#85wLe4Mu!hYbcb#-;t6yp)&5oE~Q z#98_NfcY_o<|we)!D7q(=Pxz)h6ZFWE(ZijN2l2Mx*eoro4;(R0%-YSW!M3VO&!c? z@ifv|h1m*PWf^XK6y9=VlI{#{a-_RK9`_W#>uaV5S0);g9vvU&CLA1GZPiIgMLKo4 zJ&dugF4(fuQ%4NcTmUCRhf4Lhu0Y?Mx4FCPw_gAi(BLARs>>-&SY(@6<#-=q7Dvsm zv3S1i;&ATAlpyaZS)kO34HT^wMN{XN-G%kFjgc*iAx1_)wxps~1Bi5TjyO4H+R9_r zf6OKO{s>6e*rCGVn~^CoznC6IKQk^0VSQhYA$(-7t*!RS)}>(MX#QPmYqZ?%fpAB3 zy8To}{dZG6h;Q|NdSnG$TH1H|fhQ8v%7)6P;3={JJ@KwgQh>SA86Iov)yG8{86{wt z*9!JLP$0QVj|+$&!Q|xbzCeQ4DOWM|5OwSUZWL<`4UzBPS&FIIBT1C1a%fJMTd53Q zk&sYPsZ30Oy>I8h!XHY7mWcrs)WEfQdCli=L8Bd}FJvTJ(tMnoI=V=>xFq?Ve@$4@ z6DX`3GbZD|(7zSVqr^5Y55@E(%JyBlb(Q!lvd2&y1wP%?yo?|whHj#*qp-FFd%C(; z-7&?m91+$o{AI4lQ-itkJy`DmrC%w&1W}_hl8YIb>4Lj(Z~z>Gt=rUR3#q>`c;MG? zX#b|o9d%#E2UL^OO(Ku(R9C&TgQ87UcnR9F2AjP)kbght=lpk?2a~yxNm1U|b7ciK zm*GH<3A%&1Dje1*2L^-)Sc_KS$f0!Bl6^;6MoAZTrTyp7LX@>B0Ktij-!tTfi-any zvx0Wy$m`?sJM>5q2_1z73Qkag04Xtye28LE!MMuE+r@iXUso`hW{5?sCrlagUf`jQ z!{OA>$2E&nKQcZmdR4NeoV0XX5U|Hc1u_U7`9e1ViYr0n)WqGQ>>V)!CSZL5p z;ksu4_}{+Dar@JVp~F*M{Iqj0g{8S)@(DdiNbvNZpbrQRmfb`A8@vEUqsOLB ze!sJ|osEx=Prvp02dOGJ%ua9NfUuybr`VsCNdW;t$qp!+=k7W!dJy+a+fj+PpDx>H z74m*$#v;6%oC5AuL{N9#?f+^0zmL1WiT;bs^!FJ_svn+XqN$|+j)H$4U_1VwL1X*B zo|zR8@c$k*-Ty{wh;l;aym{HDx(qP>=PvU1vHv-w$sQ@YTzwGwys^P)0O3Ew?w`=v zgA*&^r!%tNY5}r;hvPrbll=dh4fwy&{{J5)CH~*i8X|#xp4U9G>4~Yfg#jHxeHXtK9Rr`b z_n$AuhcgvRrHKUKp#p-OJ?|Toa=ws>_1U&K0uWG%Ka0$FRn-`4YrkYwOkgjxIeMb% zYfbxebni*fNn(F>85|F{<-I?$h=iDss7er14pHip2qlq1){5$q2> znb@L=+G>8Ket6(SC2AvDuz=a39URcl87t*u8osf;9r7`@h=82}hLE+40wLKmH}wpC zmR;MoO@4i`A07zCi-`Y_*+b@1zGbnuth4#ug@S-sx8nzj2QGZrOAz9|yR)qU@iXe5 zou>2U^78UFiYnv-@W&8hZx@oBw=(tCFHkp3;7CY`JV@J9aPq}7znJu+2+~Q?&yp`w zq#*7@nJtBE`AVLbkP}g?o_7z|L+)iO;r@Ve5|REcWGoz6;{FZM;hkIztU9TmkMfj+ z0|Nrc4RkyxXxD?*(_+;Qhl4t~h=^c`>K1gCXzDg}RB7uDK5(H|U0=D$rlJH@r4ZTt zdAp)c>*u3aztO;+?kLl?Y=rx+Up&xGwj^6e{SOwbtJ|G{g$3&(d{g>&5Ni)2k}{~027Sr4 z(roOkQOb&ajc%VkQ&rc2vkppTQf8W6U{_2-5?8eUh~`hDAXLMhH#Rj6Kn)7)ivQ1# zR8tcpKHLCj-vaQEK~R-H(3k8hL&w55ZQC>>Z20z)%0#{!ScX&kLth5o#Qo_ze`O6b zD@#iOYvk&?{+2*Hxsqbw%6}&KWD_In09qP=Fi6{7r*67+mCXi>iS3l}wia;UrC9+t z@+I|uUdlZTIBv|$e1LO^T~I&ge|<#gkMB7-mzyL=(pJQECpy^a_&o=%?F4(jNK(a! zm}%rwi5NVHI>`RhOqlB^sd7B-!xDJ|!1rKk$1MUj;#}|z>0gK_+b)|!=_K}^K7hz# z(&BH~)Kdu%ioATIDdHxcaS_BNcNqM{w8!Cy-8Dz<#l{qNOPja0E19$?S9E?dap zTC6Z)1@OXT(s}>9&v&5O)u|!=hR^nzAD~_mza=L`c-CCo+QGO17(dQO?cU2jhuXi_ z*nb)02q*Fe{s-y`XER=41iRdXS|ou=3jpXUs_OXEOiMsyE`KnLrpgZUaW!47Pe>x7 zq6+w#`SJjVoejxVDV35F4=>HJ^6eda2hlIT*LTU60stH6a9LOX}VmYu_#1ZWD~G&L=tuoq{H)F;JOBh zw=rtc>A>d+;rzaG!!wOuR7p8gJdpu7nela>EFG$CZ98CV#sGIc!uGviH{8ZSz(Mrz zbEMw6EoCrcwf77#;RRm`yzD_=tU@xO!v6y?` z;(`if1$wQltOU!sUqU{e!i-Iq`qS(7b&ZB4W(!FfmU1dPOtka;`Og}Y**CXeP__z zm-vsZOz-TDX5z&zU6IcT@p$5rxlofN93QI93rK~^Pk#^VHSaXW6_~F)VlbFCaJFqH z3qr%gNA|%Zp^s}G@*svLk)z9+`}=Ay+=(R&2w#7u8ieDngg2h3LIp$+AI?6aZfr(b zEypD#`9UF^ZaAJxAHM+sH6MYWmECot^~OJzJrIp1gBa}X>n!QEypHB*FFVP97?1@7nW!A>Up>B*A=e%p&Z zeVJM#wIr+2WKF^{>MGL65jm#js9jQaG^fyRN2MIa!`gg;;c_!N#hNzN;}D`KJ7xGm zRc)<&UyMvzU|=9Xs-=}&;$Z9G#k%aCL)bzy?edzML&QSMgJUhX|lD+;z`MPx*0{#B7@02zNL)rn14Y%4o|u1!TvUMyr_#)*Ir& ze0HS9;`;cg+p`J?Xk`t!IBVeF6H^w7ZT~iaUS+9y)njZ~$*+49AYyPh)f?KJnIjv( z?5j;L%tl{EF*PmOI5_Y%U(t-P@TO3m<#+q_F;o`T7Jn;TIlW+M`gG=fG2qGbVtN^9 z-apNzB{QrW({+Rpjlo8rn-md~WOQ;s+Ps;>%O5DWI1nxBD+dnXJ=r`1=W=!bqTQBHF+ph4-TJk@giA-6Xc9gxA zXVo^5OY=TJ91k|+5yE#C`xk@*M-An&e1?uat#UO}_s{tL1wfPu&^n&@j7@a-?nkj; z68irE4w3Qv#nGjv;vVOAUVhk|mf!h8e{e{lWZouyK@8^1hj~|p!M6Rj&1<85xzR=b zps7yCYB9Lr&R4$bcELBcYB-Y@%9)yy@};!>`(=Ywp4L#<&H35dXKp>)SsQGQhM02y zw)abjZ0*^g>USlkT4x%Vr5ZT?4nlU`?pD%OUx@nawNJ28*z%TVlvkIqb^F>i)(O(b zOpYq`I*a#}R#0z~60(&L+>&&r4Lr0?OoV`~Ou;-bt}sd4FX~b{X;VN}IM}o0J*=8^ z9m20?x)a`XmF^>S(4V-8cuv(b!AM&#(2Qp(iwN3k!mkc~rDd=7aNxTZIS_Z2B%W>F zc)d(yWEq+N`ie~y!CK1mT*OXH!vGggE40qrSp6|2*Pk9)$z51Z{H+chFXUj{-&k=q%hvz~LtmwR2`CxZ zHpBv5c=r{g@;WzD%hYtYPly0Oj4xXf5-@;{05mq%e(B?t{K7RBZ#aOInp`qJ=ZhGb zQeLaeRc7CXxzR*2zb{HaVh)!(u4v#?r@gxTDAs?a)HH8ZP(AP5pf+w49 z(_b5BPOx7!@#1uL)>x5>HSVj+XJEKucLmWzqX+U~E}fj6P^tU(s8VBE4xl8F=EZ`( zjfcz9H}riIf7*eIp{b*KCLJ4k*`_w-aGx%77(B191I3(z3gLKOodn%N0)}H7HgYA` z;;FkV^pPap+sM}{`-H`;dl{tCFxrhzDHb6s7pxRdqYSkfsj0VpI~vImSj5LA>x#*| zbwq!@68)bWH{4)o=H zyDAfM@(z1CH(pvDP9STOX9~gK9NwRN1~>L667g})Leng_PVm6f7uSVcIyCp)-#;mj zPF2A(>DC+3P|;OojeIZnL(%MYe+gEkHtY+a+(u<_kO5E6H@v!BEE7SC@bK_VH`^I< zlop`MW^z&T%P6S{e;RGkXoN5q$(A_y{w-#`6@Hc$qD$uwHj?ZVkSP5#g86<$)M)jA z?gND4$z;>{B8cn*gx%82yNm}SirFzYT52JE{`RWA$xnqf-2=jRQRfXx{@i_M5FY76 z*IMns;=l08<}(Jrq@sy5WpjL?aeGtq(FAC;vb=Q66J&6?Ow1OQkPR1&B%=y+st$HQ zK@YVQ#SYLu4TIu9|IB6NO^ zToQK@le0b}B)nA&BW2lqp^=EpkVhHhWSJu`HkFLtS zn9?HRh7E9#fEB7@?RHqyUCDvbe3^kOb*z1_$(*MSZ+E9=0Ym5y4})lY=wscRjizw= zuSygopB?~-nY%8rI~LRpi4du_-kA7w2%O{lk|!WIh6^{)*T9~#!5!myTDMh{ znXT7&TIPCzPLp=?RKDRQ1IA8MIY^0SqHnRPT|$@7ywg?-X|AVD$n!hW2x_a~(ik$` z$T#-Fkj$>>Sr24IA;U0E<4DqNuVs6GbJpV$ge%}F%)KOC@16t6qj;@O+%>+-diW{qQ5)=f5D7JyOzLw1?2V={;2q;}Sp!WO*K`_)ZJ4pR}KZ`Lby z=@p}Ip+z0=x>HfbuD2!Nv>6M&+@#M2g+6k=ElV#ScB>~RqI2K_?T?TMm?!0`jE+>f zNvqUp@#_ml9uY`tPx&4D4wjw1c?>7e{fy$Yj-IK!Fas76F?+m4tNkcwLf&3ZX+rjL zczqItI=Aq}ByY8BY`MGQ1s;o{7L9L|!i()S&*j?w5yN(@zTozFuZnIjI&-%5RI7zq9~LAcmNo5p6&{0uC&3a;6^NgV+M$4W2Uq+R#G+%1*6gcY3n z=Wz0tZ92Ac8B@7wR(+j)*D;r^%{LRS_tTs^7X zDzTPubMrKb*ERA!k4-{GhP}pS^Jl1|eKbeB?(nABOj!iL=yh=JJfB0r=rJOq6{ciO zHy8H?q8eS^%Wm;l${d#TtK*#$HKo@uo}rX@h`KCF4A9JdRl;QzQLl8}dRAB2JdC@J zQ~R=j>+gYWW*%enXjGsPVdn2SarHCKc=|3L$KjS6LG2T5vSe(mU?kSwlhk#8Ki?C`CY`rM0tFyuutP23ViL`Uqzi~p?yKY1^oiI|M zHMzMt`y@i5vsNo0eV}!4c_~XgZ^NVZ!D6U*xY2;+w z+x1I$8`yLN1Ki)2H}it(>tPSvI;i|r^78NVOsrfvj5M;yWPeIdBp~q4ZnZBd zwbOP)Z*FOoD^?oGRhDx}3#-?gm90NJ-X0>pxm@}3SkuHFyF84WxwQiqC^ubX3(Yuh z?Y{9iZ8eUkkWR)r-#T;lGuTD?rjGbtS=dJ$g;*Jn7qRvZ%*;^OCyr`wgd1e?7!R~F zyun!6lT9DmT4En0cir|hDK&@8z2=wXZHht7^8k*F8P6iY=~%6H24JmAOStSPsPe|G zJsrWYjP|ydC+|2n^^C$Xm-o6`J)IWN2WD}Q&nJjKEec$|5?)haeBLnIBXgR&?j?M1 zSLaCD)H}N@Ue-+wep{e=91QMT+^NGp;i+JIvK(jfRI9?^Ia^Tw!W~R?v|+^9YV??} z9%Qg0JaOwN1J&=Lj1xAnXUs5c0>tq2W5Yjry4Ndz`rwAJkO*9x_uuO0xdU9RA%B!T zZl5(U1O!p`9n5)D@Ai3fCJESZz&R{QPPI8ozw$h{0HO^6wZ}&m48t7AzgLYOyY=ig zo;{d!Y%Y163J={ruI4iRTYE2sCM*JhW!-<%JDN>Job9pbKaGvH&hm6>{euG|pBO=K z6KUW@OM7|ORr<5(70uahWwR5E`dSVg{5+9PpjGsKQ9c$n(dEs->OFH z(}H^@v=XkLs5!3km{RG9)n?7$f>`9~R7CJJ{3lkNyi`iKP6{{rC+Us#4?X4>9agOG zLB+MO{1)j3&%VuiUN4syJaH?9zQvaV>8%ls1v&Gq%iuzI>LKCzya@=rY9(HAmsNsv z$u~f>zSU#%f=#(mV{$6?${OC*y3M|JM6Wog=-^KQ{Nz45=wQW-oSAYH{3<62yAf_AL56MsAVaaMzs z+HBcc5qMb06Ivyl1fx~VA(&4%R3uJw-uMi(pYK@&oxW&>Qux=^!CP9!d#&#XjSdX8 zbJ?p=5~vR>VMawo0p|jazA7gtGtEq2#Woir-HGK=rc4j*j+}m0NaU)m{(^9JJ60yh zNu7onFF$^rMN4k`ufOGv-IC}^y#R%SrE{~kLLQf`juA^>;6*Y6V;L5GeMC?@CrmrD z!AUj@DKGf$DvZR#F7#5~I;Qcp8B*o7lHgJXJ2DCgbN`EY??8QWg7b>wS4 zM?-js%T$%C}<#8Zkyn{ttqp zy*#f}Rp%fV|6U3^QoO5WZZRKlJA=emxfTiZ<4X-GkKIMe1P;e#nD(dHAC7111KZOd zEl9;$En)3vzu!MooxQ9$AT2PF1Q4H_SzwczK9J!Lpl@=S+)G_{#tx9UReinO!RV}X zBc3^pxYS6u=UYi(Mzs!UEa5S{8$q~bH-&Qx)yZ{xGVzKQ;LDIGbZ2ZuG|#RPpNvmI zg~{@XNiSF)%3%bXUy?Nk%vaGsm3%fYX?W|#`eeKpD6z`yJ9@M!u7#4=uic$`=`Grx=RPU&%>O>k+Xwf3X(uCDHF|`+*R9_@ZD!MOa;;Jtxe|uNxtM=+K zfEYOy1v99+7)%{#vt5uIZ;<-NQR1(u40M9kH*@Yu(|vRFU?{<`XPJ7LNLI3MO9Cp-6MSsC({!8cf_XXQ zbK(Vet9Z1c}}KKo<4JOFk>3CmeQ9%dvoiorSu@KA3Xo4L3hr)U{U3^Gbj0s zw?D=D>hShm$6^IAd+lE@EuHA?j~SG$3>qgM5|$)eeS7m$D>2ALGqgU^94lLfT4+VKb9+Z-JqCmvu3xlrKh9BCs~y09~dsX zarDm5FBlf+d|yg1bVc3QoYjpZjd!VP9wle09X`rhU^KiN40f`h?CH3(wOpG;Hhi$` z&s^K#aNQwqZ}LR&ZZ6B@NiYxky=p3L)2<-RNuQY21%FE9jUE=LPIk~^i?x&r&>qk|?|-1D8GvWqJdys9#8riKT_jtNDR%{npYht?wJ z&wI;%;}22+i!%34XYRLiH^~#Q+@OBnIItU}0{3{JGEYFVE(T6?I^1(Ck}9E)-v*}J-5gv!JjTZGxxEo~c2ZG% zj{`F{d?Pj&^N(4V8bG-Mvie6WPMT3(kb5sn_hgK6*3dPUTf$+==AhBu0D8wKh|Bf2 z1h`zTUu{^Iv|^lp*J)Lah(*)w4mYjJ5_8*AX?d8mN*=GDECHe^vR)pye99D8+GyXU zz2EOu^GCfzc{YH14=CThQJScpKfSX%S@%5Oy+d#>$pmM)3osgN;YOqz=Xz6E0rTG> z*LL1g9G==Wrk~o~J>gI?I`0^MH#@k#?4vUgm8*3T^a{bG4UQ%G2 zy_xcqs%So_1X(t4676R;^-t!q!(KFMU^ZieBO=<0Y5+kOCNcvBD6DGa9R}Z|?@E<; zpGs{ooDM}hu@PkF1~r)X7^FZRY^?)hCJWZ;4lY@ zwWCUK6WJ>qPolXN(FWW)15}j?dbU4=iB_^x?u%2BliCtIf(+inC5H~5Sy5RTDOBm* zx^$5+&3*h>zpG(k5abG@2bL~M$>}JqcN5p%5+fTPy!53!*p!5DRYTy&l8f=XJJnm4 zt-PRvmdPBg1Bbq5_$MpF!YTA7oHb)nrY2A|1t3nLNk!u8%yGv-Ct@mu^-SjHX%TIsQj}kZ zDq4UOLVU0WwZO{mDE#5yRO?w`>*;(z91kYcSbUf#Vqx#0Gq07-Y6~uLYOXwg+pUJ% zcBNg&l)GlDT(=s3BVyq+AFl#w(;bnKRiX$)u08!KQkfBuuf*CcuKpx-C&W9E(>su- z=B|y`)rlgonnuYhUv-J%#N$Cn_v5O4({$C4gG@Sw0dZ z?ArUAmkbnSwqc$%7A3z6@gSlnlG9Lmk5K~?#wZX#%s|nRs|L#9;1NbJz*!N9-_tSr z8m4cZ*hvpuZz}L^fOhhr6ddF8g!FE9eClm&cATvD#@^$rz6>`5GU?lTmfDk|`mIxk-P_PrjI(AcKs^@fG0? z?=zO7pfy-qIAI(v3Mn*s^V@Bc>et2<@B6bRUPymbfN<9~ut6lwRJtT4|r zZeX%?2ATb1-xkM+9vwmRO(iGdB~;;(_&dEW7ac|_N4kiCfe2J?!{M*I2zVAq>J5#^ z#RukmJgBl2uP+CjnAKkI`UQ?fcWrJ>C*hO?o?$6f$fAmQug0SpM;>?cC1^LU6{`)5 zuEPv!>cDrjO-{FD>6{hucjY>H80qOuF3!ayRN|D>kKgx=I%c0=c_Uc9j*N-CSX;hH zPoUJ>i%ewpT~C(FUOyCL%1tcuRfS{znX5*prvTaI>^#&fV<&ie_O7! z1p8CM;h{oFf3DaN%2Y*R^cAHSI5d3B={F^ z;^?98gS!1gW6b?Gf`z0iblYiBBm-tN?dlEM} z$AOm!;sbiJcyHEDf6lwbWGZ7LLR{CFM-(+goZ646GU0iC$~B|reOk(4$kvk~5rM__ zeZQ*Y>XSN8t9Xj}eV!4x8N0``0m_%*EAFa><^6I@?hpN8pjNF1`j;JJZzutN!`S9X zO6o{KfKETw@sXvGCN;{=D>cXNlugZZ{Ait|4#-;Q^U*>r8FRTPrwy!n|0vth>Jm&a2`S;+`0%!d>DVYv6W@Rloo#^e_*>gw;ub!B;hB3$B< z5mWlp5cf8g{ckJ$27qJe)h~a5?{Or;w;+y$pd{%0{#@{r3dn51SUbC)W_ktdbA~aAPRmkia+im9HCY zBNN&!%_r;Y-O}_1M|ttv4i40QW#vGgR>634Pp>)dWgqQhlZQZ)*6mYFet#!Eo9R=H zTTUA9Ylr9Ona~=ndUM=KOhRf~O{Kw)wY+lO&f2X%vp4d$>VM+%DWx;m#YaXs5xCe5 zF~Lyx(>mYxXaqVx1*1lKI{N2(Js%CSKg&!>RJ&sPp$!4SC(VPwZK&mxN87Uqyqiix zb*S!M!8;a&Tfsj(ppJH7t;A{?i`cp&a71g*SHB;bnu_>Vdy=9h9DgUyEgG1^+n$3> z4yjF>nR!0#8^A@hQPrIAg%g?uOv2h^HKx#b#zk6+@2>=E(1nQJCe8*s(vU-Eug5l-~Aq;MsQd)b^vvWkzW+XUU)GS6#fvY)h?*4{IHH?!#s9jNJ;%Ds3y z3ql>nWoBxaC~`T1eD2@6KWI?IT4(Ov?!4bFiON$_l!AvBD&Ay(lx_fwJDaX*H?M1y}5i{ zoNc_8&g}sOq%csqapeS?DpTzm&`waKrraxyh--ww-DuUqXAW(zRLx;WtsMM3J7p8~ zANS#pmN7LQzYpJMNMC(H|5#KqvtvpJ6&CJ}C6VyStgNg&TBk)e>ij;{XcJv)l(2X| zb#W%?3z&jT@1knNF`BMd+oDg2 zTT!y3hUjNezoR~Uw32sle9VSgi>KW~-`4ZkFd;G3Bop*Am(pWj?QdOdynVEu4*FM! z;R9Z2jCHi!LxTlnX{b!vlX|sK#Ee#=C9OARQM;cVzYJA7aXN>KTZ?Z7Jr*oR&?9_b zIXujgc!K&c?IaNwSKJzUJWdcjHCV~=#1Gy6Eab4y`{pvAEaIlV0;qox53}DlMPEH0 zc-?HVaz=Vx99$^hS*7;X#1l2F5_d1-L^?G%OmOf^NzWSZowsM$VJ21hvnA1&)g*Mg zLkJ7U>&iO$R+WpYJ4s>Fr!nf_YPA(n)+vEnnREsn=E5mw{7&vN<-q2midL(I2TbiX zZ8eU#T=65iKb-jMcrlsRgdb;iyp}2k4%wKCS_RMNd|HVJ&v_rM@t;m_$nqck;l^2R zQ}s>ba^;^xd?$EwG5)W3~tpToYe>}Hz(k!2kq*T>Pr+UozMmS{bDOn z?>;ge2f2qkPv?iUjl78T3!U}-%w0hVR`SF|{vc=MyXXQ9MAIM^uRaX6tC5x^?XeO8 zVrz8Y*oH-!!)jj969U&*cMjW$vO>|EA&Sv%J{0QytKG_@yFlj$I5ZCWeqCMN)R%S5 z*D>?F)vMV{|9J%pXVaG#E}D$*6-k}mSUfJ6Z`>5*R-u?Kh9#8Ta8tMLPFOv_7bIJa z3kCP;FR!8ZeT@|)A&oTkO-b7Xr-J+?Z)EK55*-bqyq!L=EyNnLvbK3 z)>~+!o31@D`1l6T!-2cMS6V}pH?F^a1vJXaDYmwrf(R-OeB{!LuuSf4U;wHJl~!4> z+tq&n(VKwuwjIOaL-1N*TyJlPA$cN~A{n(UIX@f>g{UgClG zdOqzWnhM|-Kh-ix%Vv!WbT)RVC6XT z?82jK0Fe{R3|EGpGm>~Ow1bUy+_siC2JOW3kIbDd*-#th?K5ovF3*`(a1BX7w3B&z z#FPkaAGOZtqeK`&FY>DPtKb`IWoME!Edov}76F@iP?+_^bj3Yjd9KNSXIp!k4Oc1r zuvy6)9p}Ra8%k+$y+Rd!sv$GT$Z%0#9o|U=b=lpRTxWwr`lIa+>Lw6>BQ;s$%?QGJ zJ%Sc07`R~nDpp$p-4(h*Ap0_(UKw?Kd#nJv+I!g~gi;(86eMEa_E=rDfDyNFJ^qIM z{44$jfj2|C3C-EoswnCtS%tZ3$pCoHtl7;R-19GD7aljTL?!+h>Fu#V4PK z3rNB+^H1<6RW&^~e=t9uuaH^E*lHAfl#=ac)2#G5%oFqDo=SW-#*Wl=m}<|(o<^xo zq_;X!ui+}Wg%kz(q+xJyHz*MC>}S1xpAN>x`YtO66@DLloQ&MSKZnEdv+?H%PSFjD z!24}L&2_LM$NPi=1eek7{YTp0XAU-CMIT1wVWs1xX-YhtJ{K`V~z5? zLw&;F@=psn2q4a4kxPgghfHc&jn?(iZlKzCM29Rdh)(T%F#~ZXXY0+4r)-fIySEbS zsa|iCOs`ws_ScWK!6AJF+wSK&ho;l93T3uFmaOh>6$}tEhy1WB<$Pv*FyvdvFMM3 zA-o@FR;D8jxq_4s&$Ubg*pc8+NahT~L;fDjCQ~J_7w`8=DI(C15d2fUII-fp6R|1K zeu-A1cQqL>pGDEGB#z8L3ehesX$yt|Q0YlkDy`K9aJyNY-jBWKy>lZPAASgz0ki(1 zuuC(>#@}sQd#={cYYne23qvz=VI4!(oAh{Z{8|`*?*T{KfSBS>Z~BN^hv{-o`rTN@ zXd$w>ttk{671!@=n`v#^38}`EXj54>2df@`{(wJCeQN(C9iMU7H5m7@r@+0BFG}TT zHBVn6Er7Noj(x|t3WhZ1LGs8bbBe=9W86a}cNXjnGwjkyC}a~3r1BnZXsoQ``TiN^ z>fL$D^L2`ELHFphDiPtqo0%b$e>vt88Y!dGKQN3PX_x&Y?dT~c^WNZ$pcm~Ep^{dP zB*3&SKAhOOfMuV6x&U_HJ0Iz0;5z}D&Mo2A5ZWfj;QhA+LyF$4rzVtjY6|+^eH$Iq zg>4{#+sFO8`Ps+B9{IcQ9rY8(&(e4D%OKc1zU~Lk zF8!%~PS@3+=4fqqU->>RCDKuJVfjAocxA+s20+I=9Q0m#>V7raqeZ-FOaUd6{q>K8<^p6 zqSF)++8suC&y*m>(J74$U}-J$h4wU&N*p9LTqN56{bIkP{&hi#xIVA~8WJ3qXkW)s z7wQRkPM*Pb`-gseef?Kb(%rxVUr_KJyQ;VC_iB_|{?%w|$OdV4iYi^*qHq;hv3k`HqQ4@1@KF#ry# z*EJc{!ga1fV|fS8)dE4qdi?VJXJ1eP4l24!LnA+1WiD2WN%Zy-h6|_*nq8V|b=oxi zFzvirXFOlhE|MNVc4W36UW~^BZ6NhDME?@_+K$8h(i;!*WYj*taZ?wEoq)}1uWE5JdToM~gNqI}fbSP|;|0Gub@(&z#M zY|GFu<6qmS6`I*fQ~}=iBG7z(Ntm=hhx?0A87v{%Jsx^veDz(K_Ak|*Mhzm|c*M%4 zT6Rc8YPZzA-i;fz?AA@5Tmg_@g@WildeojCM4ujUZ1xcEyLE4U`7U1z+O>**k}K>~ zeR@VVB~5^-SHY=u{`5q8cjIr?lf`Opa+28v5! z))~?E_fE&|YQA|kJ%iBID5kw{m+bn(p0zzaPH4X%VZ3j^-`tcvUEgXeSeE51aze#JcYV+t zt7>QXV6WGLoxAURux%~${TC)>7~{bjXLGzq8b0gTR-h_7e|Smo!?y4R;#afvSz8Hj zp9Bv$kKM-~=9Y0SLG(aSwuNOO4qdJC8Cf8O@f)@bd4OSWYSLAKbvNCorqnx~77WFr zXJINW|0&4k%SAyd8PBPhM(9wNe%9Emde;fuSM;LY{*?eSJ`Wnx-O@#=V*f;)wu7ZoQ-*ZQmes3DFO!Bh< zcX5&J>2}=A^K%19ADhS}wIz@JtHGmRD*t)s3J^#^ApBsx^U(twO=U<8{hcZj6N z)u0*^*Qy}=TevhBwajI28#n7iq`c}=ln+=Q zRCBM6X<~BKo^<}Z+ZX6uWWkMIb;D-d8yA!3Ci6WovdGE4%kf(=@)T@#72%I9>;o>uNLoArrvvkHJSAfzqoA;#QAs)t z(x6!xKk{1(was{XJ!HDEuMjW2nkt3iOgwE05vG02F& z+d3s2MsfQC_(RQfO`(oBkfpY+@DllVoC*yr>>p;j$!vYAw(CaebQAWZDEmOv{@ZrlgNj_`+JBTjG zBK}&ap6s=<{2AO`TD^{^eDt)942jmsR)!Z0^^4S(m)<$JtDmg~t1}D%^l1?wE+yP( zMnv{>{d(tJhx(^kyWhRm{ga3-*GQ0JD_ldB=i$?``Ah#&{3};C z;QTzY>-`*7Kb?JMx) zhk?i{s33vVcrsHHZGVqd5-%ftx*&YHf9e=WwR+jbefi#g!j2OTg+W61@O`q#gt!Z$ z`eHvYvk&b0NT{;nn&Fm;{$;+L;%Ttfou3oLvRb7%(#$w|VB2QG>8<`9qaWgWsv*qGR zsO#(=cda|^x|0kcED84;f!1(<>%L> z2)S6UA(4`n4*cC_f55c6Tfd4*oUg;i);K)5o3XmC1NibKyHo)-Fq)HdDG+2d+T(G1 zv7+$aP-OUAPF+6q)?_Nzrpue5soJ-$PEwjyQODu3Ys<&Q2O^jE?YfDmV~4jJQ%E#I zWIHd9(eeo7&aUqFw<%JIxCf7v%*3GicW7Q-iS*f*~5$D|^;dL8DBMrUWi zF$Bo7_F~I@`!tWJu8qf67Y&C?*bEUD0kc36X!U@4@WeulVb1cdP*tF20@gYEl+dv% zOWXOuJ+%}RzLb`hWtS@L3{Kz(&ZP$<;T5jR<%?e^`9=fA%1S7oPN$d!=M36m8Ar?V zX?FsTVSU~q* zj4Oj-5s7Bs)vO8HS=bz#6uh2(dbIQjn$seKgM+ivlnAtLE?mJEXJ@EJzCdL3mqc`gV+OO~8(G>RaM8O}Ut=WA`KjG)F?hG}kG%tO%9HZ>KM zu=+Q2H5B`{!l|xKK}+jb6N}2_c;p)e%;*;;5M^X!j*hko+bfx?kKerb2z)kr ziot)03|evy^xpit8KQH^G=!_`kJKk=I3lZWQ+e~q_`voJu(an;1&7c3{Owyf)fw2> zFkXaIN=gaiM)a)7FwKt^zKu`l(=hAbmH<5%){w+-=XL`2qG4a>Naw}MbcUDcHC-Os z{V=tjK+xOD+M66G@vzklSru7XsS<+$J5E5o5l{3@J5Y}SDDO(862S3NtP1!~J=i|Ou_JtwwQ|jKJjHMqk#}Xvg#C>JH~$d(P={mJ)*p}F(Orq* zh+nhRf~$O)x^A7Me-*qoLk8}7aA3s1%ABBsI?Hy=GkQz)S8sRJ^wj=9q{_Q6phV~0 z7BT1;`y|xNcqK`3v7XmpIA87&FasW+Jv~2+mv{`HS~9Zs()M&(w`@ju^;a4ch9i!9 zjAy-*vBm;CC4utBH0DV|J;B}H60yfgR>7F1x#AzVB>>Gs^n#9#(Y@H2_pgpR{Ib@b zIXgKo3SQq6*U>PvX?$BEMtQ|vr+>ejSQBI3(EgQeHHz)qc3W%`wH8HMssb$^Q0(@R zTZ*YN;CC=H(VsFJnk(JCy$Y$o=JPxD0FK_)HWwY!9rj&YvmU)~{5Q5`?bwH8hqGS= zSLqxSIZMY%|0$)bB9Z#itiF{YwKP$_)s9;nU?!2pLJ0U2>!(kbznoQ|TAN)G3jYSh z@hey<^q-Wz$_|HTbLA1AR(0TU|ixP81q!%c<)}JyXNi8|ta1zrvYuubwIY z(y>PRYE)3&)Ra_+GRtX^K}=+YIF-cXbK^OB`@db>(cdn_kDVO~gvuaA&1;bZ zrNG~Jiv@^hvcm%PH_KsGqAKTgiqY4?s3k*3J9h{?lu*1do1Zb;b>kwn_{wO5W^f z7c5wU5(H-iSz1?Ull>2x#=Dk3t-z>4;&vJGzI7ifNg3bf2bU)6EC_PU&wLO}0Z z8U;120FWH-Z#0SF^j!u@NlEGHn?Y*6MhRwlw5w09+0oA@UOry-^XfY}v6hyWZa-Bs zrxQ5+3@m{wrDCgQDc(IM#8^SGU%Os)AEfCTTh=qM1dD?+%u%0Q->MDV&WuG}*d+Pu zJz@V&gjV^$JaN0K4`oMJR@eI0*Zs7$h6Bt3*6H4YYQr|v5|WZ~82ELMcrxG!fm(}6 zl-HeGSzhf~?*(H@f&H(X9>AE4PfExsuHJ6kf^S%Oedl(PRr8WWxN%}&5+v7sz*$*C z0=lujfmJV>Xli)OTExLQFc9OlsejHuIIUof8>Gyvwp2I*s{a2X(UNjT^$9Vdm zi(=e@|8E_^UH!H5KRcR@`lsCgc}nL1FwcMf=-__` zxxeb4eW0PH?>P;deL&rIuyypS3&**Ex6Uoj21!Uj@0D=T`~3ZX?8gEhy|>Y-O#8Ja zB{{i!aT5Q*880>?;dlEwt{L6GY>R#ZqMK%uJC~>Fvb^fjd$1oqJTW3rAOY#fV1S8d zxj^~fx%;nlVs+QMtRy5g<;}ifYr)28BLmv_ay=Ry z&1?G?IE6$)FNor?mEbDT)=sA_yCI43=9QO1y2wc@=4=UYiss_v$gO4|P+n-tr~F^v z2#DdXcv+;~$6Wt9db*19XtG2^b`8=Ci1x2)qumFJ5SIchy7xlG+NYLoehjQ!4oy}B zpjI@sihVVhLWeWtyk=ach}hT@p&7UX!Jk(m-U%Pt*{Ew{fS~)bMV8MS#*ZECNQxs* zM)Uz~hh1{2BUS{Q;_GS}gao|#?pyw0qham-*L`Z5VN9SLaoy<9)t~Puu4~npqqyIN zs|Npw3vFMVP$3GTy!48OL`Vyw(rB67l3$#qf1bl_wQ$?16Rc zOnzcy2+p^`_I?*!?HG2$TFuA+v_|*-(Je5`uk;|ySp5Yt0UYwt(b0j4)Bl=dctb&5 zoicu@0rP_XqJQ-p-*ye}zyQU#&o2}|;~PDlR1SYa#2Wsa>@A8r56c>s$aR-;r!uE6 zf?}_KGp@lwrtA*3Q|W&+$h*HtTf^V^ppVpx2@%rMv5)6UWQ*@y6mt1DLLY%8%G-Mx z4>u>D|FlY5c+%YUP3uFq*H0KQS4U(sj=Kwkei+5HAzoKXwhQh^2UVunOiD!6s%@=x z{G1>?i?Zj=vWBfB#|H-DzM{NM8yp6_9d6{k^#W?AMP{D(DU{z>X70sFSFo+IK(*@?Z~Jtj2*O+&&&&mjI$4siKMw(E>XjQKpwo z4n;_M=XLnAxU>V&Dc~Wp^D@kRL+S2W1VNh@Y-uS=)hE>)S+p)+rmguR_5 z9_j3k7k4SBzr}dXTI}pL_L>uS?n*w(XXUue%A>9E!@_(YcFz5$jnb;QD=*sb56>~o z>;BJ#IJ~ix8Fo_0PlJw6K4dU3wQD-(M(BF4-|yLoA^@JQX9xuh%v})X<>psn*8$M} z%Vb5_-wtz6?X_ras*+pK$8GVx?Ro5AA1zOTN3Vev<;nY+P4AML|Q$N$^HD3S>R4RJm;tB*k8H zQ`(#DLgf*vW;|{dXqic*Qy9L3~GlqW*7OXayG867x)&M18MIPUD$CjrStnX?H ztLRcCG`8W0_(5&9s6u42^$6Z;0txqS2)8xx2)ZUx1Zs(scL&J2VntO$*@t&YyfnY5 zjKB0GtKBm+*)U|ZMduF!5LPEWFp}m2x<8J{Csp!Rh6pb&<9wo%9=z-9t_7}MUr~=Y zXN~pnYIch<&XTWx$GvEMw+gl$|9ReT3I5xuLxZ$xg_uW#CrVm**2IWr>dqkRJ*Y~S zkb9Ed@ZqR+$n7dD0}5NTMkm};O5S6OvntH8HT0ySo9@SLEYID4Qjg1}~Ea*3lF?6%-6(OY~ z|4fE1Kpm!Ksotf#Py!w8>PObMRs*g=HwB5TWX{~j2@c^dGdBiuPWNEKW&Hgn04xTS zjjSYu%0tQ0%gr1hGPQ!=&o!d5D`#DtTz<+e^X1=yU3kaU?9*m|J*sopJp9ys;LJWU z_}V*oTn?!G{#E(*+X_>`ahqbGEHR}-YBcg*VmR6<>$kN=+Mm88IJ6SI7u7>Mo7yit zno~LS6+nPSkEwB-90Ht5P?Nn!T)~aGY7hByz{ZeQz;fD~HnVGVN}eKhA!yE8jkFlI zml*@ZE&Bk8DCDq*^x!I9L&KLQ83N)-w1n?66k$J`UmQLZYn0P9x|7KWkYIhjOL6;ay#FIm##y zBnA5oIm|F6WhdIX%pi$X zHzY%oWy#DeMXff23_&owO^XLBDpf`;HU^27Nntg0|3s0nLHz6wJDrQIke%lWaHm9> zO40>zH2v(ZcXE2DdEIr|byMxo;abz^pG1~1T=rh%61X~75Bq`H$!iv}$U`qaE%53X`?NbKhyEu~D8MR_j{c2X zIK2rS_`dCba<%{zd*my>IHi~}icoaXR7<8!#E0MMk>~^70o&r#jxSe|-HRzgC=U)u zIPCt9aaBP28xdwVy@5Y=g22fhA)ldy?>5a*o>jFYEmcQp!Ck`S398q z(35?O`~xn+mb{ozf>&RTjo@3VlB0g$uPc%f+4oS4Z{@ZmT5h;h{jeQ&|1Ji(GRM!1 z^29A)(eI_O(Of$IevFOpYbXwHox{4je?W&K&sye+`|x+GBie~=XF zTa`f$X)wMEsS-D5eZ!#?wtR|%@scFxcn7GA<2T|mDuA#)B?Ru?VU$gra`Mv;O{e_J zDXMCn)ASB%S9+076^QfhbJZ?hthieoozguKiK!ZCMQ*A1`~w`r!%e z{a#V@b4^uzT(7Wfs)rg=pwG3s8d~i2q9{6N9KyKM6@(Y&B;1-wc z)5KkSGSU*O7;^WwcjzTyWjDHUKkx84FmX_~=Q(0cX|&PdWG+7P6ko9WtJ2uRe%Z|k z#@Hewsefu>OSvs7lFb0GFnas973m-1(?i%ynOku3AE#G3OrV{6hx!v!8V7nNXAAv_JmOYy-1n9M~NVU8@B9v}JMH0N=$b-06iPIMZ5y8N|j#SP%>VgMhJu zBqMqNf9Hi7#FxPE*QLX62;4;j=oL?|YhphHHFeeuk<8rvElgHN*Epw# zC3jhK{f@g6Zg7gb=CBoUa74-({#KCkNK-wzR_fnLvcN zkr@&6Vl=#+waRCRXYiyhcA1d;-$kuGGDSdbK|`eb?MG8`Im_8nX-g3a={HWn>0u0+ z)(kh+fjs;png~~tJ2kRd=6i&)0S!Toz+IvB0kf77j;At)12$}EU|Ctb7{4JQ%J&k= zVdoj$80~lrpBjYc2$LcZY=F z?k>SXaCf)h?(R;4LxA8x7hl}noyDES-L?BX?bm*9+rRtcUc2O+nK?7(QIH4HDQh*kJaOBndRo$w z8&dpEyl+sVq>$fQ{zK1AkqEhk>}z>uM$~ig;bIZnN`bH@k3nF`11jGz{IRT$pDzZl zDP0fG$yd(N0=AL~>cbh_!U%7+ZfYo>@l$GgksN4*#vib~_DO~A`s6&bp zGyR`ld&4+u2C|qN0Y}J;`Yg1`1Dsw)cMI4u%XOp-`-)OZf#_{MUcFJkvA^_Re=1$8 zY7%iP5XC%Zne=Dok+x%AOtO9@6HZ8X=)tI9nHoG0+IRiulf(@L02KwJzZFi?G}(An zQql_@Rtn(IH#{qvWo~?Oc|~&gDr<`B65u2dZ^$2L$ACw56ZPStTJY#}h`0+jI@q3SEmzNgXZ5OPWZ}U)f{!s)cuPx9yMPGI zlZjy}rzvS0Iybk&Bqf5M2fRtrQnQ!^^7*t2Mu#b>cv15Y$mX>TZ2f+Ka=}dqKd7*s zUaR%8Lg2v!;QHi8{_(cBbzoCOz2N=pPrU^Yjeb_~^e8E2klpCVE&Jix>3%;gY;NSd zUM;dy`YM-Bzwk^6JHG#GQ6Lh(;gS~49yXC#QNyV zC-W|!J|l>a+`lZsy^fGh``w!4*1N^W)LrglMw~OAWY4$EZb;v398Fo*`YjG@o?WSm zuyHhJZFz{6%Rfyd&q&@BX=;tHYh4N1doG2`LT5QUN8^CABN{H3+1rJt*`pAJSp?n4 z+elX&xrXT9f=6(zKVZ5h3-T_kvFBFcmsC8FpJk(NVBE$_F~JN45K69p_4Dh)Fz%WWlQgNC|3VsGwa}F{W zvC^ANrqsg%tlW-xJ-`!*3aL6EkYh;hKkk&Fc1mYHZUjGv%d_99+pVaxS$MlKypb+# zvLYGiIb~l&37*cSDMCq|u`$}^(&q#_&m>fs$(?$ptmTM1tK#$&C2R%4WK82QW9%+X zP;pA~SSWmBS#{DZ3B+GKS!JR^cUJnWfwKTzOctE{x_TeBk3l_sEvp+yK`bnrnlyjr zHOj*d0d#^iVkq`E$YKvM;XhF12U=DBFo4H|E0>+XRkDxmt$=k-gzVFjfY-)sNvwC9 z!*|oYfnAzub6@%T`z!moND8T<7%>Xzu$!F_!>-W~IYRex_{?8KqBMnu-;8~Jdagp+ zirDo*2tG|exuCNC6Fy7y`AWpyafg|&>WPZN(IirX#b$|Sv{O5bFogv3K;bx`QnBVm z0QN77qG2t^e3SU4)HDhm+S;kD19q9^$?b|}Yb(~FG~r>CE`-#2l3Q_WCdRcd-F%?- zI{SAc;XJt-wtd#d@n19u8m8k0akq1?zb!vl0EA=Lwq|UiS}dYf&z<0)O`iHX>QQTW zmLfBF#1~0KJ^v;=g!c*YqO=z5cMYN_eR@aVa#-u2IsDOY^2S{%mAYtFVgAhK8u$=D z1l{d$+I~(0rOyJ zz+u3ocSWG@@Ky@-qVZUhCcS2_VDk8K+;2V^tR+b&bOTep^WjE?oB2zJl`7o}sx59^QK z6p^HmF&3_nuP=f(q^U5GP`3|5xN*pR4Xl7QVTS6{M37CvGxjk?osIxg*vo?njQike z&^~2Khdudrn5e+01o^pGx&={=@#R=}A)WXWbZV?qnf0=gGCl50R)*L_mWc!< zr0kbaN>^z0EJvdjn$w+R2UD=Kp+IqmMf#Pqi1WxM!Ja(3zXVoeHUts)ZQv6R2m>Y4 z>8(A5lBo1Cn`C}}@-#>Ph4&nN&5&Z!?J@AaNlIIFe3A{u#50P?2jL#@ShurQ4y30< z8gP&bAMKyb<)+n~|Dva(t2M!RyHT^9LoA$c)eGYHyQy%2{-{aP1;Nowl7hdl)vHp0 z!3h|Getv7qTt~0!I5D_>G{yy-%}$x=Z*bReJACjf9fpv8ijGp9(XL2xn5oEG5)st0 z=@k0P*inHSc#(dJa9VV&ZQNOHmmnP0^XG%-wP0b^J?LIas>T%zMXF$#OAl)C_wysM zSZqBf%ClH8#WW?RfJ>a)P_N4c(d4W|KPE6m>?`lREkN~+ZHwth*{t;43WN?LTy3{1 znZ8<__B8`Ph6*azDH6Ep;JtPb)kz4?SozmB4;oR(J&(i99WU+&Gza!7ayd}PZ=S`tFwD&jv8Y-FMZADsM{qB!O z;2C(;a5ZXe^yB8IJ<8M9Vza?b%^^ab!LDZD=flEFLP(WCjzjLaId@DkR$_KtgF;GF zcrK`F=soA4?S*KdnXK}!EaSgc%a9PwXC&jDCn~GyA79^d!l~lK{h?SY+B3pKL8Mxj zPej)FI*>YsJT$SIG*X@!2g%J#tddm?mkK=Tr*%C8f*8_Rm~QZRVdxs*VAX=|OIK&16EupgUcN34N_2VrzV9=*aubK(^17j+62aS1(DDG6%(7L{+7*ZU zEoP};CM!y~KR>TeC3-dFs-LTVexA^`4T#r^J>LFZ`3ZIQ;l97tRHZ$R9pUkd#jIfL zJmQ(tp@UF7KGhxKVg5QdpXXE6;IG4&rF1fUQ;hN~a;;xD=CT_FxT`ym;&-6B-tyTl z&Gq|1#l{O_QuR;xU7dVExFE{WnrA9q7Sr1+?e&RoU1$5dr+9k}D^VqTkhU48pdGN( zl~8iC@#uBG#4lET!$L#px#it=KoWx6Z1MyF#g`53__JNhw8CGwBi~=R|IXYM8k|=B`+{>qKGFY6tV#U;i8Vu^v9U2D zQ@gl$($lTogUAU5g&xDVOhxcH_J4!D|G}%BA&MWxi00;IjK1TAd1(78{mp}e4?Y3{ zTDrR3BO@vgqlVZ2swi@E1LFT1Qt{7Y5?3mFnF3#-ZU5zqgM&KIw;*b#!})AuV`FBR zvt8%r3!O79R9$pzExuvnQ!7LcYHC-`x^QL0#FS)IO92nF!nLnD`|>zAnh3edv^Ya7 zw4&PD%@+`@(tknei9TZI!hR6Nq{kudKm5^I>i?vBzi~ap#>R#cc`{E-h&xWU0Fm0o z<+mPrsGFWL#MZULRQ6B_2sQIUl(|kw?KVYhF{BbM`$b9wgS9yZjM6(9zMB>GfFGS7 zt{$BKJ8SmO*0Q#{cS99kkH|?%g2rX9pW8y|55v;KX z%fhRIGIjDoYN1E$lQ*~E$%FMQf*52WdLKaD(AbE08neFB-FI&Lef7NjS}Z=kW+nQR z8Q}j$4tM?MOI5!-JlseF?bnRV?NH^A<U0snP#!REq zznj0%PHAzo)dAYKZBh_Cp&%|VaNY6Qk<^Uou0T`&^G%(l31bLXCy4u3cj$PMixB?6 zJbOA}M&5%(4aTNwGM$ovUbxL-EvVmBy~+m~b{`kRrpF;t2Qthza_ZDmEG8y9M}?WvKi z8I0;3pTDtx0WG<9vv!kqdcyXVi5VCI<7uP0$YH0ayNRY%EhJ{7P*F?LF#_83g38M1 z4_E&8-{&lXfPm1o@kJQbhM3qI$&rZzTN7do#K%W?XsxNNq!#(j9M;y>F6`dU?i8Yi zryv+LlaZIjEXJI{@=HZYx>Z-|*QT(xYPYX z7+H^~7V^I|UXV>vxOk5mp^zQAX`nu6o2<4=d3gg{XgJYD?sWNAL#;r<9NyK*RSX=j z!0WM3QakIC=u3$@KsuI33+S0Ha8jam=pI;y`n>mzNPlb}384Va4H(lot z0CIB{0}4-6dobX3Bm}VhvqAs;9%u5|*#bLD*0Z6TdQ%&38rZ80bWGjA72wWbyALYd zebZGfdtWYp*yKWGZ`4jrPdziUK8U@fcck{TzUAw`k5~?Wrth+ZoFg{?_)!xrK8=Ek zKUmJ`)SuaK)35=5TDI}33}mI9#1NCszu~Mh24^==+pA}6pJX6EoIY6Jy>aOY2Efvr z!>iE;t^WR4SZuNF{EdHRrcMdgR7=MrRGP=Z^PcQOC#IjVF~i;QU}xu}#pbaHGZkGF zYJhF;^~~Ht9oDq(k}s%JB~$8*MB-5KIjkPqpW{Lbl$DOZ%OtGEN%wS~HK6C!+S>gpcO&<_;YNj<{5s&&W@Q3-!Atj$xRP4r@t z)5$8{hU!>k4F%39lSH7C{SIg8=g~n#|0ExZPu|{!yl$F?tU8=+Li?)QXqdC%k2U&I z)IpYDwIUMR z$RP7-B#2a`x%|}SdV%EX_g7%7a(pUCu}nkU>DE&3?Tl;7huDmh06PsP4@f6a=2G`l znKtC|*270KJd7x%!3{oLaKruFnZ|CajXLd z>(R&qG{ls(0(bk8A_cs$mT+fW_uaGQ%$a*H4+=syXZz8d8x>)3k#O|n`dHpqVvvhw zIH5_%v;+AhDihnDslVpfsi9$Ae%Oe8tCkZA^#GEm&|s~nC3z@1Xr=4QsOm_oyWz6W z%sSm3saub;GcGU&+_w6aG=#ZPP#pqG0w=O6x8kaKirA*( zh~1AJ84OGZ^MHvvAwZ zvE^VKt;^q`-$<~rN-dHy_w~y^;tTFo4|&%s;X6-9bPd?QYIKP{LJ4*+OsgvE!6+6z ziMgtQIYLi=3hcflrzO|j$NhBY!j2xH*ZXe9lT(JKl%ko>`h{G?_g>`F%NzbTdz^y& zuVFn|MXYHnq83!r=IWpA@zzB(?72@!Y>kht!p{6i!_L9SVnh1I3((l99dJB{d+icv zx!oZ}mvFqX1EK~L5c0~H$BKQQ(U&xDyb6ww6fgb+%pg!hGi0&XgBF}c_*ZvKtz7UG z$=+a^lv#qBS#8vcpCsoQ&yVa78rkJ@^!zoLma@*>tP>D-BN{;2RMLVI7kNvJ*}QY@ zL(x>yTO}e+wpekv>}|F-V7i~LdAW-Hx-}oAf38ORhc*c=1;yD1{s9HGhZi_~ns;W+Qtu<@cDhVQdX9nl>88}v!w%%_)ySXdmb*fsEHQUEEg|5_paA?-v$j$Y*>9|c%u$j z40}VXW(2W-0Uc3*``oYM!JOp8SZ}=HmoCd{GjH?ctO&wxuP&ueMv_>nZnpG`_K(00}HjrXX+TzI#2M>RHGE~Hgk4sW3ywwHY z_4p*50nD6VrWSO>{`tE-lm$B>M1B0HtV*i67KM&5%?NB1&rF8a`#pu`d$^b7X<#mmsz42%!&cs<%tom|TdcDaH!8Ieam$CQ>~W>HMUCIjo(L*) z*AAq?E?Jh<)KyM;`kuHvn@=gTJsUpp`7oaur%%a99R7&5JXSm@_P5c6Y}%HI?_bhZ zpa-C1mJ64W3j4y7`@RVI3noRVv|rY02&O%KADHX5HN^X5ytsUSA?A7N?OT0CZTm(C z%ac6Q7JhRdg07p;CZf1WhJ3k>OD!E2{B!!WefRvm3)<0f3iYnu;ffNEmGqNvx<||! z$AyLBvS7kx`u&XOgPRH^-x;m{<00oShKebl6O=KMrQqXE`}QR^?ch+Yj_=$gisC`d z#4qo{#CgzM=XQEiot?;Pnv>DjudW|U*wq{l1V}gx2@*8;Zim~qL>|={vqmPpW;jVT z{3lH&HsHHwc}bmog|=1x)ZPw&mXLKWUyh?{IC2L5+OwNw^HJKKZ;4!KVciV&;pc=I zhJaO^JFDw}y`0dmU~R4FhO+U!eOCKT!SUy_^0F$tAFrt1j)|P})%P8dU8`(c0&w;E2yJAMR7_JPp2hTFGp95jzPwo1gOkV6CeUS_$kpU}(1o{$fw; zO;SyXaT!dAoNbD7*gp0f#0c1ScWwW-lX@Qa!`{Sx>f}%t)mBEqHpSK&Vw!FRGQ>J$ zboV5$1(n7ox_>5pDN^k4j!`J&p!DHi3F= zxtaNAew~$`nk48lHT9;PtPmT%LnRH|?)7e@(nEY>I|sPd33fF?d|)*>M7vgwAld%{ zAcPYFA^|wB2Fg#9>UOxYvWH1F@j;>~7%^J}C;eyQ9M_5SBZ@zZz|&XIR7?`?0B>& z*oa=S$s>$ViHGEb(8GZ(XdH(1d-)BsgWnU+%ezdc>>IX|#W@({Czbi9=ysyWz<@bX zEDSlqeN#N>tV50B8F&f`(C{uz!+nAG5!c9$ zz2{i)dtmE`d(#H3n@$s79-`AJWwdk$^qrPg$}e|ZUA5pVLxxfa-glE`%5{MD^TK>x zAs)BQkm(jpW<$Jz_BJ1+fMfH*ulB1zPoYBmHb1gJ#ats_tS{UX_6s{~W1b2GxU_YX zrjr8Q+rH4`f%gS5HQ-u;gSyMyK=Yn-t21~O(?}s=I)%P8mK&^n@>k{Gpp({iksR%V z$-$#NZX4o877|2hvPD%~%Ev{A%i&;ag3~qRf|7~BFDnTY+L5shE`zDmLlH#*xyGLE zNdsJQ0FiJ{fgUM=D%pPu*BQop$-v36F_eLU0oGq>1>&WF%J8Nr7leV`=x75M#^}8Z z3vhRL+ytys@T3CEJvsV;t!_?19`|RCE^Z-^=IOh<*}>`(6zP&LJ#K4WTTyUU76%E* z$r89ysftnB!UE0*@DZp4X_=9C*M@kpCcpso#chRe4#V~_94fu1U#z}WyvNSXm50#G&;`f{w5<1C|? ze{?cOsurpG>M}%8$dYqX8m@O+jzUcpm!Eg8r zHdI;B1J!z|hS}X`(K8udTl=r)Qe;^gB)$dnwdX3^*sgEgR4!sQCPYMUl&_-Tbiy^Z7@;sTtkswv|+!7!rb7M7|>P|#lOn?O5)Wpc< zcbJ!5icn9D%?KRW zZySKR8y45{;DpDC&r+T>nG`Pz@3&&PNZ$L_@qwj$l1Y%fUTQYnPE?{nTqh=~qJw<# zP6FXfh+^NAY?UF7UffMKE8z_4?sa+vla|i|r=}b$eoQ`gzmIeV zU6$@Cm!Pl```}LctJ-6LsS^CbYA?goRNstA*%d+U2F(+ctYjT8*VOLU2w1 ze6I9hP(&B|wto-!d`xNzw8V5)m;Fz#zw7U4dG>J5&Y@c4IzQI-Q9UI^35UVh+9E32 z8M1@FQv%t8+Usz=Z_lHn%cy8ake%d|gI4SHb}jL`VqY!$?G0MJ+{4;qpvO*j57@ep z(P0DwC)NadK{E&`e?>dtpSp9_yhiLZD0$j3=%Nm3$62H`bnxg$Mz-#&J#i}yay2lU zumExA-3y7v_(K~kS>Y@je6iO@#6IVgI*O}N2E7<=OKv74!VZ7yz+F6-5^69xU<629z2P`KZjoErY$3b@ zSzj|cSr&d!wjm*!$?#g^Rs?Xc0N`?Zid3=2YNi3xkz;C@0c6&Vg@2G0wZPtamn$U(z)^CGQ2dsHTla9#yvzz-3W}w3MK?YW8W6lM+ z$)DXJD^{|*pFE)4Bz3^B_^ieonFeihP7oyR%`9!Gu((Kkv+O>WZm=srFs8=f$im}C zmTLV~R#2KHinN0?pBhhX*xu)j#O}2K!Tng5MNRIB>T~4uxPFc$Fh3NmwXaa^&yv~@ zu+m*KU9U1QDEDb-i^q+b=1D-*O@6tUs?k1PMOB^54j`%_e4#x?a*W8}=3S0G=Zq0- zXtKgShpJ)jW#Vn1DY`yPoG_8D>!BM9;-0_-1C!_y$HA7?+D7}sjeg99o+{;5D(hRv zMeAsiK~1Ekuu4N9;WJ7+gj9#G}Xc#+VuZ{h< zY2;4kDUQ7f4{7_lyy#0VdT?#GEqA-?hD`q5%UIC&J946Tm|u8h#8?hb`yC@3KiXij zmu)9M)Zt0{E@Pu8vcL`5bA>{kYn*zZseorCewXo3s1#?!(g!y?es_BT-(P8ZKv9Nl zITpQfi}$p=`vVM5?j7er7a8)r$H~y7FGX}%?yIqxxAYdm)8sjg^oOfM;S47rHeiHH zwzGo3gJN!66!adgtoik&>6i>NSm z6sx2W+`UK9wzu$g2X$iVd_ID_MFS=q1RNHzKt*4O0*o0()E#a7faCp_n^7AhVA zS>MXTZ`}6PBJmSB+cxs?%jh_We#f^zzUJ`MhL8%NmVq2{I;5pI`9N3K=1}bYBhqeM zKS+O72dqhJy>CbiEv!&h5UptV^ViqTR?#t4vLIa%>1}9q$K!{bgs?`~fwwo`W?-T) zpU1bXS-(VPcXJZN4Y;&i*KG(@MkvmqC(1f3Zle!;ANZ}AwM?E@v2R?E_64;{yGos< z#zA8I9F=q~(x~_bBiSM#?3(7-XHy&v9MQ1ou|7xP>5fgV2az79(mjvQ`0<(=KYQ^O zK=RyXw06h_hB~VJO=3RNC3r6GIL1mPB|dRF{%~<=#2Y1uc2RaY5MIQ$7hf3eN_n5H zGJhZbeAo~|d{o{G<_5E&U{wVq^S&{um3Z}W_?>xX?L*z~gQf7t$dA{=nYO`;-lljVsO z(c!D?X_O(tTJdP){E}y(e|t_ZaMc#d?cvVZk=-@ z{7>T=86OUyI)`G%zJwcS3c-pNhutL|Q+92~NFCT$N>0tIFGPrr#xh$Q67_OJ9AlDK zDlNmv+-2<04z2BBUsYM_nJ>2erid&2j^$paFnuXuM%t_|3rQ*IM@(@RK#8e1q(6Zu}XkCg=yL1|dEg?>= z^dl_z-H(udb%eQv*ak6%4NucJ?eTj1z+$>Dgn4e4PTPSIYX;yFPV^Z)qH({R3pHd5FqzAwm zc03`pc_mQ;&LnFu2=9bgDtq*Vy$8)ULmoG_+n$~+E88rWUnT{ei82@iAORF`-qBS? zTxP7HczfIVsP|wqHWEeQJyZd8ZZwA%gkx?8vE6tkP}?1~uUoV<;uH0*lTbrT#Z%V? zHF^Zlmr*#cmHQhbZ!Jm4)ZiM0G~$HqI|Al057KDN>I<7N$R7)q^z;V)NNQC(~yuF_JKN|j84b%7akBfLDVs7Ai6w9Ls=2TQBX^X9(iCihoA z%}}jE)M)JLrO*VYQft-0;G&~FG`TxPNwVF05$VkFV&cT;9^gIt>)~y){1%4Jd5Y_% zCTu2DcTvEf#WDSZgU3+bkYalwqw#%BJ&|5C2ru~71DUHTeQ1U^5DKy{NUPouwO)VH zi?ZKsBpM-hzsMT8hLZ!<`DpW3{k&^vLSHzY42%Zf4kz6%e6KrRAzwHVm>)c_XjFWt zfm7v)&1NIX2`j02OX7M+Wl7otD&AX$kVaixkyq(|SkWpHF};uam^y(*!0lB3b}edp zdxH}^7|npMQv_&P;7y~CKgXF(*n6gvGmt#!T~FkpAxC)nlM5snlKZ-fYyC?UE;mZi zG`$X`Yz$lL-T(BF(RmQ8g+DQo(DM0?EQA&1OO1iwNu4QUFwgX0W5PYx0YII(Ok8$A zJ8!Zp(}hd-tb|wr=~_U9wTF2@E}w^>Qa!5n}cxrNUAo&00O>Q|CC$rD{b z-wf&-w&mRQheQ&M6P?{C@L-o*N|523;uivd>>16?{cUU~DUyQJPIboyz@k#Z@0a5V zjKH}7invwv+*Qyjac^=-qA9E9k4Kq=k%uism_P0xi#&sxrpVN z(a=y@@xe;Cergdldr9BYIk^72+~HOdbK;YZV005_#svkaO*W+83r0`|_`zkM_WA-f zwWCd>r-0F~@=?OTg>7Wh4I=<#3s+owEH8OQX}j+AOMjeQSas*D&=}B_M6#J{rm0paos;;x;=bBf+b;Oi=Pf~0G~77VcTAG4F^i&z*MRg_q4VB^o6QO(dPz5HSKhs_TvQQ ztv3wak@2oaE91hdsyEN4aXS!S4t!p+jBs^PBaObI^yOP4C;ISUC|$!ZmwpTWC6f5= zo=Ahqo1|dfeuztZ`vB~{XN;u41`hdz`aSm0GtMqLRD!qtXLtXqS;aqHD6ban;fOgW zCtrjBCKem;lNDNFla11wUI9Gmbn`sd+!sjx@&(@|LS{|1xJJqCi&aFz*@>ItJPC9C znl%uZy=zVY2C;EjA~^v!$ z2<=n%c7h^&r|LR+Rt5DSbT(8xTDFlrv$R)+IKpq za`=`Y0oTwZ8_RU<;pyT2pnD4#b2qMERndxbWs4=|eWICDZ$h0H>kV4v`uFDrlM*PG z8F}Z`X<=*)ns9FT(%+Wi)_*w7VE}n@OPe1@BMo9@&rflogWHzk@!husJBQ3S*bdlA z>87Gig6k6q3U{u@d|Vr+!rvatogS=TodpS7B#~Had=?{et56-svtkg1I3Z5jl=d*uVO=krgPo5I3Q#h?F0M z2Z#t@#rJr^`Rm-F`%(yHq}O<`S)3+kiqw!q4jST1pQo3TZ-sBq^-ND40TH0>Ai21rTHc{>6Byee3rXa#*Jsl}X zDcRaE1Oe;F-P`WI-P||*QD-RoP?A4Ml`y`uRI(L+YeRrbVK0rNQlH~)xq{Pu1Jnc6&hWEWQ?q!`%DG&S`P{k*_YG&`@NLyUQNC8R0gUvM?eGE-rl0s(rdggG=668(qI}$e} zz`)mK>*_j-=AVZT9-bo4Fel^D%E=?bX{iz4GEi;FbK=+Y7=F+%HT({0oAyHqzZBnW zn~hxc(_sv)$P@1#2Gl$Y3c$$=v4IQ~dE;L3$aw!|lz?j7slrIZP9iy(#8#`?#S^6~ zcMCzupPz%Id7M;|_WEBE_HY}06DU2s9qW2RKQG3uy%5}KP;sdQwmGoMbDpXwIgSchoQoi+}~ zvPk1pt$q8@s#G5HX<-NR^N;Qb)6-(r40Nn56MRZM_%J*7_dFc|O-=3r>qGb@E{{B( z*#I3LhlLK0o#HzmyPr<@*jg~!y?weZ9TgG2U+o+LEq`15;O^O3C{px!v~G#fL@IfM zNZOYg!aB6#^$itq{0D9NW&QRqJB}8zMY#j4_Al8^WTq*&Y+j^5Ds6&poNeC}jINKE z_{W2s*H!99Y_-^-^Pn_j-uzJ)P8Z*w7Yg013V*2@nqC9Es*gm-u07@JJ}0q_sE37~ zivXTkMQyf&fKDfRnvQrP^FBFaq9*h{8xy4KM2kkkeruGYOh#Z4c-MI=1@(g!wSJq{ zYfVP|93nKu0^1YAk~5o24F9DXIKyn_po&F|SQVC8H$m|iklWEA>4U2-PW#dLN z+Y2pw`ROM4UqX}$^SygU3%Dz*RmzGDr}}*lH=_W5vdMuhrj3}{*`VRWHcEb~lXT{x(OV|~M#Rv6T8aC24&^hOMKqJlj z3sIPZW(<1&(j)AavLE3)_wfplh31tSC!2qM!;@*yMykC19|m3e!0hJGw24J84k>^& zjfbgg@VQ+Vmr-~?2j`wicp7m^s8j!_WjoEz)1gd+gn=0XzrKr3b>7UuRA|U_3;K;2 zSzN4}2zp2I42wdp=giGr^a%wVT}FETI@p+j=vSDhSp8U*un5=jOpz(1<6xV!Qn+efZCT@UbNhcMO)9Sjg#ACM3qMc zW`FNPsE2s6h-q}8z-fSe_fI)r{(qS^eF&DTxOUSYk^{~9)Qx$tT!Sq2geuud*3N3t zXXV-A)722e0MXVsaZ!`bO9B5h6^VxZ#IkV4PEJb`w=jcgE~Rs>f@q5>^qT%K)6oaz ze~m%|^8cyL|41{y-oz`=+gQL5&*zoe2EWuZzkzW4AZB}ffB z6TL0m&$xzsuCMDT{=<8A%qLPxz9xImQ9uu?Li}je*x}F-}@U0H<3ClGMzoP;-w5MO^9JfTmW*>4^oTFCFvOe5eh_ z$uS~tt&%9bKTKBqb%bhc4Bd&9H3ya)+&XqtKgHl$g1ogCZ9`ILzPeNYdA0ij!Y_5O zw>_B`LRR=Hf^L1|OtPN#M58qNz#xqzT1yOlPB#O}b}@Mr0404ogU&MMsFtmxGH)#s z7mp=)xgrwO+mSVrqGx61#g2dpF?Y*3VBxIEh~sFph^spKh;uQ6>KE2#PRFZWQp#`X z>9IG;&=n?fw5udGyvKM~Rn>j5?NvgH_$3S>IKJ&;O{2Q%Qv#igSa63H6^q_CeC}^0 zf1d4CH^qI|mOo6q3WbRa8(bIyhrWlsP?5#gY_sA2yuoQZx`KUuZhzubaVfmSv-Vye zZu`~0kZw0y9bl4P4oPH_OOFp6dqZ@(a1MbLkf4);j{*pYpdj1)$uInCK~^&<)Zp>6 z!Ao$)qby?3@o;C*(f&S{*3#PQt;^N*P?rZhytc&mctUjN@JZzn{KkP5m0Q()E8Yd# zq4N}csphnlJDenTU(*BSSo&aV*;M5ZyNt86WXd^J8)=aa)1YkKH~O=os4O>Gghf^n z|3-qDE4k(99HkU8b6iuZ)o8{YPH2laf%Fz4L|Hx|Mdd)R7P1DNBko9bK1O*e+;F6t z7{ALO1dm&LbyJigvp+=+EgfpKy}OiN=SYY5Zd0qYlA8O4l*n(!j-1TzhRxH<%M`+a zR|5e|QMVSeaHvF~Iqlw*M(OT|d)3Ch({+}Lf)AS^7e|x}P}Za0eX_(C)^PR{w7Zi< zE{p>oW#rQD@HfC*_apg8E9T=u>zxZ*h8%yk8xru_qUpp;Hz%)L4q^Z%Cip3i<9RAa zf{w{*%9+ZDjrwQX&Bb04sj>}G}IZa^x4?;^!3`qNvZqG7-$b8mR_`sU;JlMSUIC4LX) zjOd_S52s?ueRjCXant*hc|uU<=Wl;e^>fE!4o|!X&3Z1b7u^g(+Ly`&e@9ItR;7~lYm>1a zpJ;%+fAR1MzdG?Wb|#p-0vo!8s;Wc5Q1wV zg+Kf_oRWQf3c699hByg;h1@gM{S#f9;!N-EZHz%}4+tr;&II#xB?1(GYL2 z$DBD6qTyy%(viTU-fvKwmQF5;@8j%aCQ-*hZ9UsD)^AY&)dR1Qg;I zrbtrIa9|&1L`(;h^`G1Q>qjD2z`z(MB{O^GQs&-Y#XKtUjsN`p?I)<2}^kh$6bl6@osrnS! zKT++>sDB#Bm9(~p!hx0K^*F+*Dk;hf00`4EFp4>eu|>zoDeGv&m!X|xE-Vo7TwNGuBTo zVv9*LU(y)RO6K{5KTf3W8~N96S#luP3;Jof{JDNqa>C16ZScO7hzqsQxq~cz2CSCB zyV2EeGtOUn<>&?EEn`9pKxls>E~br38p!;!{sotduSZ8;YsHib&ANz?xM#lMnLr!+ z-0{a;BN!m`yKga5KI{lLVv*YaSB{!%-(N{$)HyBN{5B3yoev;rD>5f|K_k@z!SX?M zsVe01FF)Lv{T&%84IV)*zlz~FExdd0*gL;zMT;V4rC33tCNS$~kD$)EJLd?Lst22^Ys7@ojhTpKYkd}YVQL4w6GpZR0;_k+evzDsF* za2;>sj;SvN>=T8h*SgY1E?NQGR7$1Wm380YT$MWcJ1h@s&iGN;`D)4N5NdC6d%QVI z_-52k2rbu(rlJ0MNM>BrfMNc|&c-v5+4agSmV`?ulj_&#-opy^4x9Ci$ke!Mt5F-o z8Wu7)?-bzkvDl&#lzU^B{~{5j`|Xk%S9HuDQee`JctxOG z!@^uc*NoYLkTKRv7Dkf|f!wk5{`MZB#1!3%Ql*qom7XZQKqqfGw3mVKMeR^;*sSHx z-&KKQYjU>Vrq_|zKyF{3_GWu*jqcL~2S=VG=Gynu7Ysc&``4AfTV7IPz`IuhI1E9@ zCxT;^Q(lha_N>K zr^Wj{0h6Q7Kg-T%;`EiQUZZ6X6VoVRtzFIc5xv$GfZEFf6zAbhP-pgSH49HE$vCFh z`|=O&&+d9Hj$)Zeu1@psYEf~OPX@$IRnz3T#?&>o(w{V5RZsZyX)krhh|AHwSwHWG zN%v(s3Ab;OQn?vZy7c|gX2^OFwZe=>HK2b9)pIj<)Rq38D0Qr=s*rdmy%v!KuotUU zV*uV6>vDa@(cw97re(w*WLH^gujZw1@-4_|^)<&-kSSQr$(m^^%HZvkBf+(u6phIx z)q8Eep{OEU9cYUp$9nI%q^;po7C*!L$5IKLru4romCm5Md#4g|{mm6Fh+WX(*@xFS zXg;zL?^8^Trs~huY@DcYS8sGS2Ba-0-%JGLhl}-+jNS z4k_Q_h!*)5p&|=tfbq8aBSY^~WKehPEF_OkY#HI`ZtE5;%rLjAGe(_SP!~qT>WYDZMsSm166k&J zLRo}u#Sg)kCMn78D(ZTT%ys~O8ED3 zTG8nB^R#dVZ495AHvCJYP|h;3wR$Jn;+&f)0u?}v$60n^U|@bzN+vVsUp_DCu(4O0 zi*9_u1LY4Xt7z@g;YREE%>?rmZ{a`a@*_4U(VuFz*b0m55SK)DShn0mJ`Ld402KOg z4{vkHQJ|i+ZIa8%3B`qZ&Q?n%VAJRslv}6dPrt#1vMUfv=V4Us9ZeFSD(}Cw^Qw0> zcH3~~Tv!jdo9%@}JXEZzU-AM5G$ zU*=&2jWlC*akqEiuaq@d52>@`JRQ$5@1Dqz&Pr4CR%09%YkkL_VGSP1gx9dbkeTfr zjR%$7!`=PN)!WgZ{@&!c*r>i^bBApPo+obEO2w-TAu~Yt z>_J-Mb&~)kiG4u~nhy9wE~<%L9UOdo$n?ngo|gm(X#xT~`&&Qc=c$#uy-HIHbGAUu z%S6UX)%8;x3B13*mT_i@{*1A8C;VLJ76Hu4;iMOe(k~b3dHOpm!<>S=$n26z;Ath1 zH0U{|%TAn^a2HfpgaoUJ?R2t;%{xH;GF7A^8r@y5+s2|gvD6PsLqpT!DWRgGT7CVT ztyTA=+D9T7d1~m8v_8GiV57O^;N``KgiPE*Ob~T{SJ{8<|5DRM_37LnUQxlbWIfgS z$EOQs#*Qw;yh9A>8)E8)s3d*H^#I-0JU|nDLtEk7qgubr;%P2G3U0zu7K%NhgJ2`H zE3dZrL*ZWLZ8e}uO5|k)NBZKa$w{mJ?8|R34;niM?^Enx?WyvEHy-Tca@pf0k4)ZYy(?V(OfYeo^qU^O#NU8Lfw~ZvDg7BI6b^3o-uUhB z*~Qs#cu-QcvTqjW^eg6OIgUeQEF;sDO&|}wQuNCocy#g2lzb5u6P%gO-j?zUiQXZN@yrxi)-il}4_AZWNc5iwl=| z+gu80^uq*3&V|FZwjrdooB=X6p(bv+LTmixhWvx8m;ZQoOhoFYfN{UfhZmcZUGQ9f}8ccb6b5*Zr*f z*{=2egm-?-hiu8rIL92BV;sjm%qmvoH5EIzX)P3Gp`yq)Y<`xs60sx@n-}K*)Nkj4 zV36T`kuT!UyZBw>Q*36%99PjZJPTn6vs#6VUG9*BJaw7?yIxHD_6@sryRQ>o?cqe3 z#R~7OuXQ$7v6)D0qif5+5---0aM^cwoBDE#_RG+4KALacPR;Lcr?SHIoHAc-37`WI z8J-e$h;MMW=6gFn53Ss&{NXXu3~t=C6Wc?P=zrv$DmiLiRSp zg;ORhq9BgA_wVtJtXVDoMQ-8UEwl4uI6p`8SCdo8JCfd_fp-p#){jFBIzdo#-d!27 zzaZ1%^5_IMk9@!+jnZPQktoB68+~9C)n(buz^`H0%Yb+TOW?~GF{`afq_#ri;5$l; zlI^9T2<1YROISOm0Ly_nC(}_?B>*mUmQKN}08Pna&e3mnRmUtZce+&;Mxfk5qN{kf zTItr+!vN#q!x0BiKD7~$t-p$@YAWYv-&-#t?ZrhY`a`yHy5wH9V5?O^oLq#+?S+Mt zAU4A57c~pIlUA`6!N6`$kl&i^8{02hki7bXw zd_&+i2^Q}Nbi&RGA+}EO&nIW!xD+5cOW=ycW;S0?!c3BfOb;yMovH?!u8K(Sjdq;# zaZ+vj@_%E;Eoj%@So7E@ncE4$gU3y*Y7lQVoVvO;JIzWBRX_P|ni*WeyE;_?$RbGX z=+ET5PB$zta~U(Iz*9Vt>BDc%X28lX?1n zD`%#)+Iu;Aea}hE60$iWR#!PS^scxtQfXZ7vp(Su z@-lRG)W@`-CnftrrCrEF;-rrMxrUKY}s1lu>eO(|r#%B$%2+8jYDR~>}>ZJj! z@d}L<0eLkIc;;wFj{U6_8|Zh)vUI`s&o!M6xpb&~Lw3%<9pcmNO}^~7f*9_j5_lqd zXioW!Sm}Ye&7F_X-kl^dHG8M8Tw$c!nK;khV5U=9xvYW#C}j0{EY*BubTTNZ9-ZI) z49)`;)zy_NqA{C~D3?f8Uq3STj`Jth+Q8)LlB({v$lx`>wUH^AXT|yqjV@uP1}g%b z^A1K~G0V#Yt$!w|w~_7giR7>jx0Oe_YVGrG!IyLPYw9*WEM*Q*-rr?C`Ixor)^Ur)XP`gP=an}T z)w9s+fkty9-uGxXHd0C^=ZCc);S?nLC$q4NFEunBok1Ua-wc$ovO58a4J_CGvA~(d z0Nz!^m$C#NY&FahnyHoKrmo1B6uY2uT9Vwqan*L}R6AEQwk_t)Pl9|pN0ha0oR9h| zXzf6GYc5py`D73(WPqD0sYTkNiU@{t$U*jK!kT)kYPCyN#SMtAu#YoG=gbltsg2D+Gp~)Z7TI){9L2rwdYBk<%k60;Qr|K8p&5jt z9XxWRAv$^RKz)t6o8%k|-Od{3Z?PPJV_OCW@{Hg40z^+4|2X;0H(6d5JhMFaKok1 z09wI#kA4owtCkgCt4B0vp5A(sR@0>B4!>1r^=d-YKcRNu*{G*XB(d$3*cYER4e!c1 z*8IZ*O+c$Va=6%nZvB!;wLt`$$EiBH677lHJZ zFHyNl%r*)eUz$sF;y}dr!k3lr37x9Rohb-mi>-(=wl@hI=t*`wKXJo4z$z@%4hqiZ zapKygud-z{UK&N|0^J8SS2Nw%Z;0OPGpKy~_Wh_X2#?zrEml!c<(nD>XC_!Yj-r6b z*WumP*ptSZGzwIV%B>@*UH}Yi2lzz_r4O2C-e*K=tlmR+F8Z+u-S0=jl3p@%PiNvq zOy4(k)=oz)h-?FzI_!JVBT)j-i{^1Z4BoEq3gOPcjvpH-G~1Odj-o$!@{DoUD<7o3 z+b4?X)e7TrSyKB)=0MaVVo@i9$7y_wrQd}%W%C63(hET*)bln5via0U=I$1KTNhU+Tu} z<7p+&`YZT+^(5`zF|XyHJb3TAn#4TRCwzTLD7lQwd>q!4zQmIbW~#ZP@|KC{$9b0ArQ*Q)0dsC`&L8~lT4GqrZyrXCTJBJ^lx-pc z8wgW7N6QvCeH)teW*4grdk&TFV4>asLt}D^z_kMXDl?)o^mJ}az3>#j)t}MrEt6UU z-j%?EJO$YBi9yT|ZU0L3RV|e1Vd)|s)ZgYMzgkMk8J_O<#e%VNVli!U=aYP~O6Nhm zo@k&@nvD+)%;^|i1eGzHA)uE@;sM+AG-mJHeg3U4jp_9b58EaBr1%d8q?}j&4ejnv z3Dz|+gJ_}5UYHIOm9^pH=WgFW{BuMC49n1+1z-xS+Ak?obt`ndH(S0L;M&}XX@DZ3 zP*1M2d;nfkK4GVnE^HA7B1k@-oUf!L30s-9JNt4Qb@D=?4kjmt=nT<&cn`CXp~8KK zq;bZ(hbGq|z*lVir~Qw42Yo~X+ZTBzyjK&}AueQMU?Zd9-C3JuFde13a zXoc}god`0XksD>x%YuU%iCu6&_SM_EQ|}MQ&*55rKZ9#olgS&J2s2Snrana7#uefU z%bu7E%O%C4OGiy^(eS{7TnZa_Cwa^#2 z+hh6F7`N4Bk1MiG06y1J2-HXY&-2ZdeI!B=!Xn_loZL>PH)Q>nwu~`k!^;glZl~`TcNtJuQa!!_i z@79f# z!#7x4+uAumP-w}?ettgM`wQ>)axdopu9%UL+1G6G3#Gp-e`M_vAhz^vjng{PwzqM-m=H0eH)%cb)d#8*4QJ7kYHc23z#xWjUEkbh z+|z+XSXCtR$2t@y&b1x--1*;!)C@vFG~H2mT)*j?zv~^(T|yY>kEM6Mo*O!^vp~qV ziLOZgQDMuI@Ol=e!EqN0O4l1C?ukJ_0Mp>a@R}<^Dq$j880j>FbsCQYjnN`ff$09e zT;9kBW%-5rS?tdI$CU!Ro@M8IM#J8H)^wPXLEzv=R!o#Xb0SX(BRd0Bxk0$;hE1)> zZ*L#N?3ns>ph3X9l_c@s^Ki1*?}!9& z#|;evzw~uX{+W2LHC>+AzM5ST!{-G&7XQVKU;kBFZ=1v^qA;9plpUm+7R6h1DXHy_ zCGw`)=TBS$SycWiU}1^^des(q!1qJNH^Wrn$7#x=+gbHG9*x4MR^*Xw<;P7; zTO$XNP&4;7c+gApXSMEquMlFNT_JKUv+o~iU5uYs%1)?WN3u`M_y*+}hpmDk!6HLG z_k2q}sf$lNiObq8uWpQnO-&ZsEjj!9WIW`5O6g{pDY&Y<4%ISKpel&pkoe<_-hK9VM+f0PLGT$`padC&=fse0V& zIyr*Fa{~xarQP(zx34+FQ z6K7GtNA#>k8Vqy%s&fwClx=e8FS>`3r9)Xg3un>|QT^rwg?y0p*{%IVtNlVU|w2`(tU8Wwoyndnf1w>RD~VW{V`$Y`nUfX^Q9 zpD@`uEl)bjvJW0?e;Z{)ZNJC8{reqv?+t+Nb1LXKR&y`B8Vptg=bcbY3Jl~LsLPnz z!~&B;a12)+*B^O(OQ1D{V55#%0jNZ&jHq>+gAQD`2gGSVUFAHVf(Y3;KMDD8|5Y^? zIy)CI*%?@wIzb@^w==Dn!?KODof_#m zQiQyTjuk(rnve#h3^6(A^N{fdqtc-Er(B*5TD1_BL!c*Jt*1MAE-@3K(U@(GABxu> zRZ_}MSu%X_E5+~JWa%J^xZLzgV>*mvwe0K-Nn^vO+gY7#ji5GW>#^u@H3UkR)FTu5 zwDpGDm9poT3~JemOjJiTB>%oa5(Dx?I9~~lwk$>=lfv`#<`6>*1V{! z{2#`=1}^pf+oq>)Q^ANWBRStRwWb8@PE+k2fz;TGVdT#06MqlE1TNxmplf8s>x4MT<5d|9k zr207QT)zj!LDfOa&08D1La@Ia z>6_Xsr{f6`vT1oIZt}{4L9%hC<8RAueUD3k>D#F(R_LWwBY8XF*@;uRGhd8bMTz`< zFU{8}n*Do?h(WIeyo)(?zY8l}Z>LE<=BIZsw?H=^eVWk5?Iz0q#CLp3L9IQ)qpXRD zd!P!Vw7gaBt%LdA`Q$+PoYU0noXOqxN8TZU(>v}|srQtXO}^d4b7AITw#A2L6#rT< za3w9y&(c_2kM-{(x&GfDo!wj++1W)gF&y@z_JuJi7~_Us_)E10{eci6Gc%)5HX^H$ z4(|R5XM}u5%cX>QPpd_3&i9avXH0)TdSM-3?(p^Hx)8z|Fi1$&w}9;&^5bJOGrc5M z$6Bi2^r2l4UD`a(gXuGqndT6ld6pHWN|27f=$s94lP+ppw56po&0pDc;6J@2EDcz& zNAF(shRj`+Ji!R0)JooEfh8r7dM1P*-APBJm_G%zLov-D`RT2cppQR?eS}#+_GBRY z)6u@c6-lRlM#Ta5JJ&0yBnoeK0mkA4b}jX+ke>(LNyI;4TJt=3k>r%0q!#cXnD=mr zB4cAbXl;*$;^2iC(?Zx*1U8L$G|UbjhP^MdYs^_^-J==Y&Ta;@WOBxFa5}75ojvam z`_^fd-o3y1$z}m1@Dw)|5XC+)q-_AL9~5~w8{M&&UBlaM#@0f|Q$nrC*R?Uqj5vdS zaGT|N1ILg&Up?Ox0eEMqEI#)L4H}H*rx|z=LLYBL`DbdSAq97}0X>|1&*!uyrSIC^ zp0#=J&zvn1n}C#$IXH2h(d-d;ss)z~}orWNvUE%O_bP2W;9{eEQf#7g*XOgzRLi9rD_g?9Z4(O5(0w~bd zGtfi%vnYn=8^Ao&0)w;69CC_Gn7iNnFb0^%eQs z*X=eZYLn2(3d9(_x8iClI>YDW`69#{*bZ1=W$Ix|(e>OAvZI6*0aRK;RZYP1K$-4O z>0;}~%*D9lCOnu3yqnTt>H1W2TFaTA1$n<&1oY)H3G;kiHgzC}Y8)8-8IhRB3{ zuf^$l)~xQn9k3f)wKekj+!L*0xQga>SpAqoo79dpTvP;8(3*{1H4h6nZ4`}xrEk&G zGaOIBr`-9Yvw6BibA1Tza}~G&pO_jp#Q*arnZ&fy37`L$-$>ucE@HTzN(v$rzY4Kk zCC%VH1iIR?zdk9)ug0wRL^b~=+l!<HW>#Px@As6?&+l) zP^M%*-0^l^RD@&r&g!ygTY!@1E)A57GGN5H~?Jg>-Zbol0s-a*JZJulD70gWLL_MGem_#jcu@dpeWT<%nw90Og(cGaBE=Mc%fh zpG9){<#Or&@gsf8Q%MxgT%S3TqcrsFez6Hv=Db?B)pPcLhwGhNQh4)l23InYXSkp( z&Jd>TNrqyH$wNG9Q1|i6%NwGk_B=h9)gb3vo;0=7J)@&MjaK#Mj2&Fkoqk%}$_~r6 zt!%P_8|Ofi2>YuK($;NOZtr$X$<~MOlalZ9iQ62orqD%??W2DG?@FiQgiYbfTLWmF z2)Y}cEcK9$3k0CHs=i)seWCbPMB2S_Zj|7cn{WD@$0VzJndNry{3N1|-bSVAU40O= zEZ{E+gv)&^H6(3euE)(mV-*c}A^2V2-HEY9Jn&!iF#WEozZP^H z6jRW-h*yV}w3|D>O zN{AYM?E;?TtvCeQO*w6k&hkc=)c=I($d`+DH9ur>N;W>r@wIAD3D-~2;=J*_3Ft&L zzdx~K2YkJ6S(wakw!#U+URr(*-e1VNEE`2+?D981=4!WpN6>frWMlahIjo+0iwNol zibF$t9&OT23T-xRwOap=b?Jr(7$V#pgSh9+H?fcJ`6G}AM(FBOhu1@3bqL1>vQY?P zdAh2d+GhnqQ$Z5WWP_g`qNP*uythj_`rSFfJIT&iIM}9JqDFYxS>hHZ2nq~{`qPsZ zQQF8GfbK5}UWBwR8QO%6Ke_r+W3&p|mLYgdnEuzsOyI|kG*N(&ZA*haS~Qxo*3;L) z1~lceDQWV;Alm%w5><#1Q1<3GiC%v35n^Lbyn@=#y_H*>ivjgo4j=!Z_agf#5m_zE zu$d*hA`BGIGp?CW)|T-bEvC~9#o(rhg&J6#e91>Z9!&2 zi?8}VJ5H#E5q6{za6!pA`G>t8-aqf+i+drT`GD?JSWj+H-1f^sz^q?!s5ob9QPcod z-PFK11JYrHBU*TEuiXun9hVtPLYuV62jx|1 z`@UV6#JO%a8&F&Y>mdbOR3LUE!@{rOUW!dHbSE;npn>iMv~SX0I-i{vjrSRifMl?2 zF)+ru#aA#zCaVeI#J804d(kp-$(zHm+1_` z;2~YbEr;&v4fh&McRWu3L*pE-epO(=XG@bGF~vc?TkLb)`^!mqN5k4O6xQ*dQQF2X zAQ6F!K0=hM>tFD|$4h@dk^>p}(@7}fO-3nE8SWZd1E@Y!(^C;IQSGR^BM(*|3p;{# z*xG@iN1G6$NyMvq)l>{V87gK-RF=s;O>!nq zs0H}}8CRJrTHlVWq4r`r_|E?22m6^dWn*p7BGJ>$qZeySkCNzHHB@BgzUlYuWlOEP z>6<%~i?4yTUc*vX2XoqldsMcjPaG+A(ql5OYuFuUT+k!GP2M|ai(wWnSp38Qn(*MS zk>^CdvozJ89I1W1HUQ;FlTegbg+`4PVY@v zpvU(0OcC0vVcOa4LC$5GhY3`z2K(f>9t4u^b|p8^{~qM$6CkFfL=sOV5FV*4GIYHe zAn{!7?8<5h0)7iyOFotD%8MS@LmZi!M1NV|ZN3Au(;X>4U~Fw|w`NN?`0?BVxd>V4 z7@-~f8((n#iqZ5dJ{a&Ub1LZB(9I6eUd(R>ShjDc20SVF&F=3ckkYlujI7gwWu_hv z0UN;{6#BP_ug$Nu#V|+pcRn-yfRvGD^)_>iWPppy@k68VIbY@>C_C3y zo575eL62F-W)>_R^d&v8n&Ttr3MhWuOrk*Z$74;fIuJ3v+Xu{CiOP4mnO}V}hgvix z5a=!qvjUq_LRWd&k%qRAn_V0&l^tAU=)7%{|KuqpH>7MEE*Y*F#+ck9Y1~RJ4Gm0E zk)58BS~*S*Uw2TPg}Yd=WZ&=`(n5;#eWwz)3HBi}nu4}{%7qQgVRao-b80~GQbp>6 zw1HC6@1wQNMTyFt6+nhd%F6l~s~vGH?g%ccvm!*n@BRoz<z*wHn+IfWRKJ+J^&D|;BFg!YtN$gK?*J5f1&UUXVqZGZyb(n7IFc*ITsKF zF*Ex;Izuykf0nJ7T(H%Ft(PQT+XZ%`_!z@tJUKJvZkgo-j+CElkqqCQ_962!-`ShP zc%m{Qhy^ zgucbJ*uf|tI|Fy&^4L*DTc#W*|T6rIQNyB77S1BL+*#+g{lBI z6Ko_K`@!eSg_8tp(qsMWBies%_Lr}IT`=VYOWasNUZ#thk$-n;Y+jBR{=8 zZiap*UTXAk5M=WQsB~U}ogKrBr(#^#u8&Kv|4N|3qhh)oPEl{guyp?^QAiJ63QZi+ zLnC`|Pjm5Q(ERavc7C?bDF6~Fbz#xcv;z+-C7yBWKi`lx?cM7Z*}xqaPmZ$Two0nv)fF z`G8`&IOc7C1!!%je1)_jNu1JvY8>~Y&-FpQTin=hCesgYsk6Ego#jr|0mg&${FhRS z7qh6Sh;VW!5cRHB?~J@9;5jk|_T;ocN!|2DSM3bpoJQpShqW$`{L2^H`Od$MvbZm* zEn(Fb>82dTg8j2}2X^OKnOy#P5kMUG^W69Byu0sSGzQix%GXO`=el~q#Imx7==^C$ zOq_bWcYlJ>Ph3V}geD#2)ilZE5r#S*XGRoG>@=yrZ`!SaBlE&3$<<&@I9oVK`&X;c z2={MJ2(~OP^99bE;Oe3Sr&{4~7f0W5gz5-t>*A{6caE13yGg~R#h2=iT1a30jX1)x zvZ~Ov8rozv7nMMEUN3>ZMX7it+r(A;-i{)!3Wf?*onPXxscaY+n5wD;feiozdhRa0 zr71eb$=-WH{E;?y?7_h>R*s}yeu3+>y|iD2zx0u=3{)w0m*lrWPmddX4Crs;+`c&P zGI4J_)})nHEGT88%L%2|JjWP_)>+A*gNrYyBi7g=~;`n@_*pVwfxGSv9#XcL*wMFPRxyU8!;5vM7fhfOk%g|(u zVEw~OxQ)5g-guHd!SGyc9Z-uy1R@DWY+F(bYJM? zi0iHkb%^ns2Jf^GJyyfPMU&v+SY z6U0O-!h_1UtV0LTfy6YW+;&+`msd^ut8)svK+r&E-)Z?iGdFj&uK}Jk+Itv}9jYOn zrYKSQ>_uzo>D6A}3!zy7S)9WkI+^bq-*5HJ=l^2t-X#Op;<=tU!6UDoJH$?&A3{~D zBw-vnF9_=^q+x1NU<+iExuLkehw6_Vm$R35pMima@6&mtb#JG3Pgfz2*P8~LltKoV zjk}?VG^(OA6V5J=xUIWSB~ZW?6LRrq*e08(yNWTa*-(7mg4^ zs8|wO*c4Qt@&zVIS8f|Q*B_Oz541DeYDgeqtaJJ{b)@H?E0&dRqhrV*spMl*UVX*y zu2AF=BEFy^`Ym5NM}c_{ug1KD(e|6lOT6`o)Ag+hbU5SiMGPaknS~<(D+;0}vFL0j zl(s+-GVDuMg?w*(1yjd_B7n4%LNj! z+B!M~b;WShB_*uvCxPJ3<4C7JaV~Mr-!2=TVnZb{4JqoeXoZ=XDH7(~Tw@cnSQM3l ztpmm4d={~79m}^^{olWg>;>A!<$31mmU{&e;TYMym2%+2U`N%wYI!iJQ)A#bCN z72_y0zC=PIlfel(pRln@s|OrU25q>V>62^zWv?pzrl%a%0ddaVHaW@99O};u>hoJO zsftn(jZZF#EkX^}Ivcn!R}^4gW$?(v6Jal2KFmIN)wF73f%4S{PaD^mns_ShrM8mpEtk1we#={nJ`3E*BJ2xh~ohQlfoS>n` z{8t+*DRv2s${sks?ou$Ov*ZV${?m^A&;Eif)!aL$7*ttXuJG{4zRsLplAv`!&!G$M zqI=%pfU;eF3UK)EXPZd1c7JBcOxc(V$s$;?_lIBORKfIS2gf@d_wG z6m%4tWr|cDsJ%_C10GKGDpi>#yK#YO(r*pX1G+yhHZqvMw!JwQuh?FI=~3V6irwF> z`ZibPIqYZ=)Cu+<_M5rOv@2eB_EeSs@_q6rL6(}mC~l;~aIeB&gH^)$jmO?uIge(y zxV#eRZe!QjD~t#AeRY6wmVS6JUjR+`*6B%@9kny%`NnpeutUwkD4S_!*)N{+w`r(d z2t+N-xK{KbC!xnv9NO=lC|9cAQ6g{8DNO{)$t;D8AAz}&(R+z5mJ`J6`gG6$uR zsZ_^V9}<(zF~PK_qM?bBhEdDuRG)9AaqNmkptC2e7}0V{D~8d2i= zz=VfO-$|kWZtp+UmX>N{7gdYLfv^d=#i`A2j38~ov&z;);HWqw8%sxCY)9Na48_^D z^!&H_^QzLiRU8X(ra1AvcZ#once*`^e6v^3vmoH}8Kq;f=qiq3&zGtraewm}AH|^C zD(I5!P$hf06ta^-+x?hHCSU?Ht{4L^af7dL2{&N3ujO`Rdz^s0(nMW${_7FN`oev) z?kls>ON-X2fJH-F0Yu{j?H3BO=6Au}_Z@NQrt%8=dLRzVVxcR+3uGViKIJrP=+iY> zE(ZK?Yt&p@n*A+b`LZ&h!_zV7;xFHoor!nziBl3r*mF|pfZP1)lErOKCrw_DT?gny zNI7ik!RC!1snaBh$~F=f@?dhN=auag?I!R&()xC`*}O+1>*DkiDeYZSdUj0JnJpa_ z!p{;NGAjpa`@B|ZYc)RR_tdE3TP>guws?RKKxeA0C}3-4-=sM2OaJ{Gj;s)~gj;>? zl~*@WH=uLzkmO%s{a79cQ05ml!3?Bcm*zkB0hb5d`jL9W1K@1a zg%*^xI@|`!l8W#S_D4aZVXJ>S(kr*f2V<<_wkN})FC%@?I!tH_c?iq6ip)Q^5Rah` zt>tS+WGu`zx5&^@1+YPO?mmFsC}+W~Rb6#Gy6>Z?k-iL)m1rA6-%(a+;x2t`7)(Nc zWy1z964k6KXMh=75tqH!UFfr+X_0+|or9l>{|n`c_!pFmm1)f8ToGK*e2_0VXSJbp zHb0P#v&6KTJ|=(4XsPdDuV=B7I8)>{If(nq1&c;fk(;m<(qAWFjp94;N$TbU?LAGp zv4Uy+fT>;>)cr_mT1L-fk@ALOwQ(=?2VjgEl zrHn;qy#QsL=_2NYt@X*QLmX7-o`6rr{dx>P%dCXB-{~&|vI9$=lumt~uL=JLj>TTr zn3Y+>^jtmbx(WLmSJC#}Y^&~{k3$>7U9o7k!zph8f z={yH{tiiUx^}+3qj$RTO4=+L&+(cl0vp7hq7ZU`~4sJ3ErTJkR1sZIzxOuGO^4io6}$6-g!b`B^kO!UDBeZl_g=`ngs^?2Bw z;w-;g{KKP~{HuJKgYA~I>Tb6!4F_f9t@u8u9DBmw^22;@t8&H-l7~p5JS^@ zx_K+zAl1_L_o7DQJ{GvT|H5{(>|P~vRH>IlM#L!$XHb%q0Ic_UZRERhgT~TfgUj#E z*jG~oN5lf$huDYL*^}kmwnhhP{pe0k+!A27Z=Dtm+%vT%c6rUI-y_#6P@Y*oJs{W2 zY8@1QM(Yf7iNRkB;hbV(oLm$>MIM~4H<=vK#JTNrKF;|K>Uw?3MIzN;?0Y0Q!EFRL zA#uQGUg4*FlnqOg+MslAE@b@7rNr#)h}U39@<=T;HTu{6+Gp2y;rxVYWxw8;suamu5K^OTz^7U5P=DiJN|Iv;&|O#Pg)Aq}Yn9U`a$VOE z3mG5wSjqPE5cnXXkE#Y)+rIdyoM)=O?sysg%i8jTHzKMt-S~j7*3tpKV007666I+p z)VzF&ivgZ3`@qwz4`7 zLx-634ic{NiYiIx^r)28NwD(AM0?2BKEK>+F12s4+h~9wK&FBeVUgaVysf)dNv^8~ z;P}vp!8HSKVq|l2&#j5@%={o?yZ-juq)7TBic7a`vR*-YJB+2+ zG!|W$L7nXQuQ#KYw`NEXX;+q${=f%4i3@`4?M=}B>D^`#8V)=3EoBM5o)n`%>qM1- z$T6?X7m->f@vE;AVl8Pqhn(*I%hczV_s^fh#J#8US>Xx2<_5w!Z++*^HtCUx?IF%c zznj+fr2OeL{&gwQmgs5tAMVY63y}6~@5kd9j_V$UTJZR)l#u)z zL;Oxh(=d1myX1c$Gylr)9^-1Bosp(|DaG?blAx$|7ey+)lEaKE%%B};|HM*AiUhXx__n(uN+j2Did z5d4l+0rWNdaC{~Iy{h4%{y#6k z{r}?ySIj6eeRuAL1`p#T?g&P(aPmyx%j|ivY%BQ+K+}qUkvQe~gJV&se6k~HjrDnc z!uxA)gdRpx4*7U^2D>}CE+{ffngV?3sO9cKQLd3`(0>Pdf1R`7YW}+!Dt<_3$O}VpNA9*US;C*c zv$0^&EILsNb3}ggaQYcai>16^wz?vkUPO>zG_whI#I_Q;-xJUrfpi|@4m`fRSd z8BL!~cQBG(MT#`htAiMpu(MY2xx9#c`k76!3}cE;dR%V}SKSB8GTP@gu=DDt<>d~d9? z_>i-W%L|Sa>vlY*E2@GyBi`P-h}pWj&bYb4v!hwgI{YO&F>k0x;d@LK>OQ~Ggq8h3 z(JuR1Ju=vPnO1%~@xuif?E`|@-f%27Z7cq-*b2jcLz==G{-1a@Y<6r|ZIlZV)n#;* zu(aVo9%bgIM34Mdbz6T!?w^v#)L)2p0r@i(N-2KlQaJ|w`j5DomBKuQ-c=U~N_wHE zk%8= zgi(BNK$E`!5C5{1<+rxVg=aFoD@6n}7Wx4*mg(uJo!3|`;YvNKMWSf2(1?eY_FDKj z-gG1SuE_Lpd0qR!+J!Y%H1MgG5t9L zB!m3tE-tP!t91_6td8`UIzqk$HenFL?lW@#n;_;fa$Y$!U#UP^u2N4Ecwak74BRl1 z!hF%W4n3^LyIwsRUxY$@mQvI$2$IbhgcBUUdK>0i8uA`&5LN-?<&{EIBPyz4{uPGv zC!?A~I?E=>Occd|viDu==Y14z_Dmg4s@jbp%VLWk;});6p-iO4@&R@b>fW)#Im)f% z+Zq0ECj8GFJB!2fZ(ZKzCNmS}vUKPy27PR&4s!+SB6YzmefjaK!&U-TbphZf1pso9 zjJsV(Qyv+BDgY7ojq@#X(ZO9B3+4SSm&kF$v!m%8T9xHqzY6dHuHn)Wq&(RsJ zBp|h>OX3$I_4%-YZpmnVwfINRhN1dm5`}@qLG=O6Y;i&EcNMyKehOE8q`rmB-$Ea_ zYqZnD$89Rd*hD<0if$uK^^h>3|DUKy(4sbpwOG-YVpPlNpm7b($hh?t*KhrA1KgAO$Ir)p%)_s z1M+xQE9i(7UWb137?Vd(_1DPOp*4!t1AtBAEsb3R>J63+3jB%DRu{rd^zXQ-1{R6y z<_~3_s%dU^ZIVb&OkjSS&XlTVV3E+>^woQ3W1ARU1Vwt@7*u)ji0id@Y5O5H#0(RY z8n1Ni;PK=Aq|G$y_zr!qiCf9f?I*0G(p{;~Bva6$kKOLD0_an4^Y1j&Of4YUy*6H3 ziuC6t3c7&tg2|LNWxegHtvj${2=N``_t@?~9433x)Z!KEv8$KZ0n8&OTjfW(aV_eF z--z4sEuSc`%c?8PnyvX2q9n51?9?+4ef8+TQJ*e|o7q`IMjIx(`MQkj1jpP8V|sUc zX)<@hKSj!-8qdxAr){GKW?xC*F#WQRf=NYRg7Q{8?H)BBC8DN?yMG4#yeT~3*(sG<9U6@8sXx^s?lO#cZVCL2&W z;MMs9heFuM_YAM>EPvzVi$~=+fH;AIuZWH$rs)#;p@T4?S`DW%<>Ee7o0D7x?7m3I zGJBhM;tGFp#FUM8)yUCfwm(S0KoP?Nn)DnmogeJ6Or& z1xfolD7nFdeVRai;?*28+|U%au&?s9!-t0AB?j8es+a9_yfsK8!KAJshYm`f2AAU9 z?#;u;Rr{FTQ&&advu3^x-qnCQw(fy=4xXh*tn!+rDS+_{>ESZ{T8Cq8M#a-OKvfQW{wqWkzq zP15zVgn1X)03@Mi)5LvC^I%ym8P9lMgj+?LSO)P@X>kv4%7dfR;yhtI;-dWs-b2dY zQuGR%HnxVm6nE%O%rV}q-aG4mpPxi6c`r;X`7DT zmF+-&{fZ-?y1$a`e4k1F6utBpn}z`c_g9+2{1+s-8@^^A-aK8qSI2G?22!bkzcT3e zQh=3Ysmm*qiRXMAqS^aq_8;2mvJ<4ZRZZbvqKzV*Fp=lf<@-)(FQn%^+IN~MAxU2l zEhoL#YFnA@_fryTLWIV4H>L_#n-p z&r8@1rnp^AbIqN96V#mW!g67Rt7{=h!TCP>$q7IWuYC=Qirg^!dvZQ6Eh$o`f1alq zU%;)GYfxKZ&yI-Rb432t+pkEq9rtiwsFsXb8Q_jI&~`Wp?N`N3%+J*wFGuL5$7>>tK{4G@pN** zQ6ha9#^U;5E!0NQ?S4AQhZ_3*u4*u{l8vT75O*Eg!K6XVWzgzSD)|a7hz5(486D<5oMGzB||clN?zt>(%cs6 zWhvA5o`pr`Jjz3pxP8T}i821X%9bOi>rn1wyKt^P@iU*i%XGc~isn_rHS=8=1^Gq$;6srV+JWmcPiaaJv(6 zGaexs51lGpb8Hwz7KNT<%UKZ=@%li`{?8VaIq0%x|@*i+WCq zYN=Nc)c*BkC*n~3n=c^+TR-?!D<51#foe}}Ziq%+j59|yLr+o6%d2G!^lh408>I|0 zs$oy5PT;C1e2y9M4(rGl{|{$x8P#_8Z40-hK#Nn{3$(aXT#L6@f#UA&1eX>K1b270 z5Zv9hI0Oj}#oguR`JeZk^St-tsziKK?08!LadR|fd&zZUs z$Pq)F*Y+h=m69SGB{I_LRFu82v`=9z|3qG}HfdTK7>&7)C~baaZ`?cKftaRH%4Wt9M4332mk=qvYq;y08-N-Q_QnFNc)}E3Z=S7JW??r7 zBTW-e0rVNM_O?qO0q>(Y9FL2qzf{=p0#23nXT&?k%T=so8JtV~myR>pG#|@daV6*a z%||D*#97vX95FP*m-)mN96lJhR2SJPl{Ba$4w}yin`iW#KO-hUIwn5$EZL=hDSp$l z_8Iiu+itWj2L&2$vmjdCIbc_Muz7ez{BrKJe9VsEcCiY@4#D;k1C^neM^5Nmba1Km z@q)tJ+=j<+p96KH@tHFq;it&D23DOd@l)9#I%SfkS_{oAxn3X6L`q>q)MB1qoP@#cNNz^7p$c84YSN~CPIhh(&zP{Qi9d-K+3fZ5|lV<*~)a_M?UTh zUr${UoQZUlX-g$z1}1d`*ZQfoRyv7eq$5-2_T>6|uYBJpzTB*c-n~-;M?Iu&6>i}& ztlfgc`;B z&)4cd^Ll>Mt_m7~;zoQk6k>Nb`ZCv7#PIuD(yw=NUMI5N76Fx-+NtIC!L$7O;YD34 zYSyya{Us_Z1(+&zYO36|_r*|K8W)5!jf~xbpz8XM-4a?e$=&2Z0D6^%!a>lf+dP$3 zK5M#!Zb~zNJvTEI*mZwVJ%6;|q^4c~`ZuHunlX*)T2BKGvS}&>pPIHL>0i@>^0#U&RPz5gRo?xc1(Dpet0?dKih7EiK==2h*NI-NOb?da@Usf*sW3#0Nqv3cM#=@cUO((Nz# z7=qHXWNsa@bxuH!576C+Qq4Y+$AWnmwWuCCLX(JBupK4MOCv;40`Sp}43yt^R8A~b zL^yc#cd}g;Cqu$e+DZOWQj|csixXr85+#UfkJOFV{MSR8j2M_j-K|ZiSucLegc{SJo1zq8cTE^L=T*f#v)-4C zQxsvpV?hHZQEk^<-_L6+HzcaAol|XI%9YzHV9oU-L7_d$&@>zVll!)!Px}vHd6guH z$52TpmRRmRag?ND+QHP94;OXWD#tm@3;C_pzg18nTO@UW3Kh{$!jCkihF{y0DPm|^ z;_!C=SjaZ7*ZnRWL`_H{rTIZ8VV4@pelI0OS-ZGD-lx%^IJX%2E`vCz%c;Dz)x8{4 zVt&}k00&Gwz0|6f3`d|-k+c#VY2U!Jr*fOF26L_t@s0|nJb7f>sQ-$mzfLufbP!12P8`p?q1#V#^|h)|@tbEsM!75#DS^z|K>H>EHZM zkQ-oU?ruPWW~qVP-KDG?$&Ud9Q=bE@2hqUsdb7iZK8?!+;w^{wSs?kBWY8%wX7_e| zhxDb)-H&Fhvl0E@s%@Jo31t!6+aO@a*az(rd_lnHcJF?F(HQ^_IY`YfFohcZMsJUu z+*y29kZy#Bn7&+TTN_68{@uF_YmU>Zzsbap4j)YKdgcd6m~g^VUT#t1{A(KuXVioB z^dorrSW*XTCS_gMdrJBT$RaI4?fvccMzuuv?l1NWE@GMSmG81H@a9G_z#ckJMFxGV zh`{Ks3^?)NN3E7&PwmL6(4XthrKF1_H;`)FQe`*EByp*3X6cX34q#D}NaeG~j^GlQ z6^*q!lm==G7D#!hy^&NLFqnP@LuAsXE#M&#wy$QN6DQow8_+Du!-A5wTGmofP*LG! zj2dflI9L4E zGVeL<|F{3eVYza`jn9{#lvR3NoRVzG!?VKrYbDPHD_*7Bp%2s+z^D)MeMuGvp&tTL z@(|W%)!uh4=q#73SADbWGL({Ia%Ety(!mz?(!OdpwGqFxQ2%7}g90P%=PZ9OcFu$! zm`sHV&S83M72Wd1LH1g7;zLh7R|QZHuFc9|U}!x*x%yP8i18FHd}3J1gjo4f9+Kpi z_+3s1ySrpfM ztylJ)Oo!9;DOlQM>A)`sx(U2IG{youuH&N63%ef7287aGhpS;N-c041(rV#L#WXks`hYy|?evN;^O z{rAtAio#DIc6y)00QEMpP+SknKI;1ptFrG!zs_zQlIj&4^^Udq$-dq}7E%jY7MT>< z{3}E(*Q;XR+IUV5V`!0R><$QBg(YT1{)yloRMZq{BMDs#b7xZatuo9gSESikRQ*5N;k%wc`Fv<*Mi!cu|X02oRHtaEK>XPQ>l zpSF{K1n0ilwiV)l7=3@&FWpBaT!Ce3v^0FP?NW!;6w+WY6#l@*&!C{a$~`A^hLt-< z^HG-EMpbW@$}(UuAhg0zussjB6qg?vQphT8)Lo#Hf2sIO}%qsIT*wL~!0~ z_nkdi);E_IC@}XJBTz`p5S)E)9u%#qR$x!S3qAih&u504+diGx&?Hx$`FTJgJ>s*r zq(}UNfqSGH@MdEncEcEAF--S1SSS<^Dm}ZwMr%ZvsY|5JY2OF0b(oMv@BT3volL9` zg&(by2Ukk&3}&)po1!_&g}ZVo74_#fQnIVC-0;`QEv)#mGn#7f@MOJEi626T-r2@u zObGL0Gmg$}0ze?*AQi_fM(~mjLa*O1P+9`QJy(u^81nj$?$<|T{{ypi6}|POB_w7z zT7PtyEx#%(Y+(&k(~kXL ztOW$_-CO-%3^;GRgQ(YhtqIl%W{jUikwQi-U!88V%X|I)XN13&mQd3FCdhNsq@9Jq z)bJlK^!|%RUhqHp9nwEfv>eCpviD0w!I!jQc_U|x^1uJ%pYP4WcK5Gf%ni%AZKY`e z0SHttw{%cGekYNwU?M&W zt;T^Qe_$s$gFf;LHIWa2LwY_l<2UEj)TPK9!b>h7u|`>jxjVETQd<^yQ3`;=jc`G6 zF5dO5>V8wU2_3z^>{@72!QM&yJ?5ty_5{^Qo0i<@GZ$M+Y)8KkUdb7&%?T!LSuv0p zCkgpD;N8pWg{)mudq*?B9fCbE-dR`t*`b~C;I;vS?+>!P8g!e8A3hS^BU2d zBRV!SisOiys;mxG^tOj}oplm5fr5KN{}g{`Ec5rIk5C=rKTo%~&iEG?{+5ef0|U}t z^G@YnRBz!h`FDTC4Nb4XbXQgkF+twgNBAODD{l+;w(}8O=&@V0nX4hy`_U!AX8|1u zH3$?L&B@vuIwf=G(Yp|Zg-%GW*U|UX5%FNWVAq^&l(8C?E2Moj8DCdTehK5nl&>AP z8h4su+Vw`=CYvK5-_YOl@JiZTDUgL+PrFsMf397P+oz+Lc>^Gh9MDe*p7dE+|CtVo z$03p#qL5eXDw8s9~}w?KtI5_nwnztZP)w2?QyX}Y62h4Y(rv#U7pU+B_iwEC>A zTSd{dG5=jd&q(4VJ*>Oo!HPQ0bg(|jZlktJ-eHm+a~f~>(Vk2GCM?E-Nj&50%#SXg zwJ4olxU6kegD{}3EXn9-%Ays*fsL53k@aYphqbDto%qj_(_;P~e53_rRIekDKv#7n ze-L?ir9CZMN0d4Zx!tKsHs1}<^QrUrXNhL4>Y9*%FRuuASWTs5|D*?854Z27^%TC? zbaqjsT_^h&`36c(Nc_Xm0;D`Bm2dito{!saPp=#r^ZUejT%q4b~(|scYPu~{N71tx6FO0rX%?Fq8)BoqgDeVq@v=O zV1C;p71gcVwz9sgkO9~>5>|HYr*h3I!T)gWa3FxODTV$EoF+tih?WQ@1>IrZwhSPwHiO1g3*_voi%lPqs1GPlGzNgJUw{JM)b#}@1J>XWX=a_|2G&}bSSK+Xl$ge zAbu)gRo`L=J=1P8Tc6d*4v;?S|0Gbqg2ysV#6sPBIL|@sMa^;ic{U5F*}wE8M`J{=#Zj>8%hOkukDosU`in$iZ5J#>?32f*?ue z!t?Sk6e%M8hST+_Fr{e~FO`6lYKySYqje|tbKm8_zO*O?`-qDQB!a-+`$6$|$l?BMu_y6SADUzvKe4l{yA| z-0nLo+ES6eKOaK_C$0%+`GT9nd&(CB)|H}x+o;A7#}UZX9G;~9hZ615q24@lagjHh zDIVhMK4v^StWWr+G}rU7P9_>i^|~ZMgWtp_%Ru!n1RM?q)=c#@yNo9X$~S!ay6vRR z=mW(M$Gv2}#|~3r-!qmbi>#9=mTT{ucv;a~jOX8Awwg9ST6vI`!h)6Yt05O71wbB_ z-5m`j^JEcM)CqN*`Rt9uyoFZo$xE(59io|JL9l#0=EZ|9v-yCLcdL-Lmo)QlVc1kh zDrjP#L8rb{yLNGByswSK2-~lp4vSv1wKe4d-BGc~YY%Ki)Rr841yWxFx@IXK_v z=aY*R%o!u?cZZ-5=~un+#?&G*#YzP4layZs&l8G=ZCvH@B=XuK;Tb{*#`eylj?Iq> z+~?nq)^}K=07%{ZmLrRued*J~zNVI#;NkHy%Xp`aFXMW{oxa;&eZ4OCDRRB-%3&F= z9mEioG1A^2e@k+5P_DdiVXqv#*;tickwQ|~Aq+=cu*9Mn&x{z5zWgoyK(%EtGAJ2u zob{w0eq^VM@hTH;uxlf6-5^~lH*)D6zgQQ-V)MpKSWrW|FjY%$MzD-n@!Qs-B(mEr zW=giVnTFZ9LfJ!dkzjGT=hg)r=UOu<*lh8t3uvBqI(j13+vJDXk*VCkIW@w5KgPROe6jHc>6a$XWss;lsx;j&hd zy_-8o#KSVAl%kUaQb-E76$&GeAlue<)RQN0Jmz0bH(ad`{OYYxAz=-+pObisRr%jp_xeenw2)wjD}Qw3n&Ris0feG+gU~4pMamU?#V1?a9gpK5w|tHPR}|p-iW+l9&Ft}G5TaI}?9cqY3f*67 z?(xkSma3<4VyyuF4DV4e_Bs1y2%^b)YNH{?i1 zE~v#`b5T*{GGwe*)bwCli}ZH5`9$@E_~K3r_fi}I+ui>Dxk`+biBJ@assG}s*fov0 zw?;?twv8ab@96I9-FVJZ%jqT`*)iI5jt@!pp&V7a$QkJRvm2V16Uy=78{EfRK75uJ z%n!9k-W>vn2@OGc;3Ds4EnqyE$VT}6=j=@fK@K6bRrMOkQ(h2orNr)F;C4mk=*v3< zgr_wadzq&|#_<4--##V}F7^6}yOBXUdJQqDy5(i$alIfIP!vLaXNWSXHV z)P*DvD4a3*JePUO--1BV+JW-Is^q(i{8&Z%I>|FICn-e0(}lk4nED=e3-i}or`(%c z-CL*w%*si#dv(fOI(39|ZX_%B29G#J(mf=2jToRE?f}Ed>vZ%uY!W7P->tC7sv|f7-zzU3 zpOwDK66hw+3WF_Mh4}ZPYgAv#_A>r0*ikpKe06-d`M$%~_f|5$&!fOToWJq9&!DMd zyrKJI8G}i$6$v&{`)J8}o!*K_iC`xw&Fc2^7#1@9eMV{T3rdtC#al3UAMg3Z&Doi{ zK>ShJ_8}V!fFe+Dbtu3+kZ?+8iwU%a;-I zCvp#rn}?;%?{jwEwHAmQA7+lq{~KikAom za9Gc8yfqQe&r7FE>-B$l$|mzF@^4zLDvZ2SoilY!GN;WNe}Qx)##7g!@piYEBd6bP_;{a>u`ugiuM=d!fVQc~CKUA6b) z9to_?f2&Wgq!~{;p7z`6?|gHReQ^#E?RQZEYU`!Ju!+tmAu@;0ZLV!spc||}K++}( zaiYF?pvWWg<&jPpwe@Oek#-pvp#=xku|SZ-JZ>T9*AUnDGM(XaOH>mzDw|D(0IqGykrab#ym&f~6YoD(6>T2DBg<$6Ro&8xK zxi$D|Ei&kxa`vRDC^J!EaOnyO+miHL~b zM5uJrW({877#BYVwT^CHAshUuR4f+lYTsUP___71<<+uJREqw3T0E%jAbjflvI7ge ztnJZ#!)+Sb?Kfkvx5WZ{)VE(oG&HT0d6Ac4!T#&Fl=1GQc+8&7>ykw19S2SH#mW?P zspePRw)XHM1SKtsIB63to%gfKG7&iqYW}vRMdASOGRY^`>kY?VmWO&X^=v6(C!NG| z2bHu~yj=#K=~;!s`VGr6|>pPfO^$%F;eX=5fuEJoxL?=YlvI?s?_>I? zDTX}{BNC2BoB+SY^s9I9`?k&s?X=Ew6MI!QvMC9aFAv#gqIML?S9|dsRXbOKoCq8N z66EqTliX_Se*$NCrw8g-^n_R@$mNaRME zQcU*!sNwO7{+#yWTJMzWrgLm34Ex20xN>H{aGLz--ZdmZ2Ap*>OF>u?mDYi2vcLOS zJ0_>@k!$nGoDp*lAcS08!=&U+OkYRttNu|y(Ix9K-t7RZj(*3Y$r9$^|)1+9gY4;|vfG6c{t5FcliO$UlNyF7Ld)0`O?c-VL zJMDlzON-2Y{w zMi~?cG>*p0=X%G#(c2)re7(lvv&Q)RUMVpah-<56Y+9I17)Q^jo*r6nhDp0(5E$i) z8&@>i54u?Gv__TsO2qJo?djpZNBzro^v48tfG zjJ`;Zau$>P2x%RID4X9IS3q6_uO@6)wK)OKL=8dh_dIH>54j8hfM| zITELu-|;O+Z&r()Yn8{oj&T(xJd?xSnecia(<8oScGfY6u@)cx;(Ga&)%L;al!Krs zQcW~++f|ZOJgVL5HN5jgq)hZaRASp_6OS6Eb7cT;u48{-9`!OKmBRcBB5xnB>PU`K z8LIQ!THD%rv-oj46CZ_V~R9Wgv{S)T!K#8$#$9#05cA0oI!d@a3KoIq*{0C*Cfd#t1J zB#sgFY8zZPqJGi)M>B5?R*6ebl9c-H_}k*b^CEXXP!^;;$UEwJ#N2u-@ky+uWT{q$ zb6KC;Tu2N~Tvd=Dcvoc7>TH3xzlZfQbHk6IzjsktVc082O5R4ui5+(wJ8jp*I|IE2 zNBd+lJjbhJD~Q8+8L`S`T4{|fgZ2rzqouSd7!J{H26%mg{4u|AYo;yJnUh9Z^72~e zk`keZze`jtr*n^bev20rPs;CRV-r}N(zlP)G| zYHl?IGb=d7qx~g$!%J%2MC)<1A8Tb1ov!V>H|BRXB6#$BV8R;Vb^4!XOIxnGz*9zy z)KLio5WXEQCcPFCdIE;EtyyI1=Px7|X5j(j{>~7-gYaP8fK-1t)+NGtamAB?5rdxU zwC1L+Cdr@k%r}EXu7k9@lzRJHBNhVYgt;udS8_#Y!)oMaQ)Z`!ocC1+pxb45)arjD zYlJ+Pv8k?S!a)L6uD)LqUv}xLS%&7E;K|e``s4O`*G`9VHs3KT_@xb5vwT3uhCeZ) zJY1sOLpe>FC(!c1PfE>|J9b`ieg_M?PHyb3@mHz@v6HDt0-4a-l6Zy+s0@dA@EJ4LxIU502+$ITgIG_HwQSTn+y3Cu0 z#l_uMEkr}{47?fv>^C0^h4^Qh-(^X+A5KEs--XPx^g(BL3MXQ+YZpeOGHp_)CW(%B zj+gl@z7l~nQn-chnNAIh}r)%0}M^agG{kH}1k%0=_sD2qge2>6@Qgb4P{Z13sU|9(3H)^b8l_%Tl@KnikgF@$h?f`WiYVjMgdFEAx_bj@S!nD!VMfAWA+z)# zV(o_FE2h(foNb!@(S6I!C@a~Y)=6NsFypd0qmD*%r&Ed`^Jfj|&dO>+O%dP7ZB)H} z5?MEp7o}3y%f<%heWZsG9+8dM(n%yWo+$qjj)QCI#5Bie6xkd8EA5#iA}h?gy@g` zNcEbT?hX^>pyL}`DQVQa<25AU-eMx#Aixl#f;dB6^G#bH`sW%QTld(^#b z!&v=a4DK6qACMWqQy3L0&v2?=by}+pk6@lWO@Tz9kcJt!14TxN@bXq}q-H91C9u6m z9&8o}PHUgL#`qeg^)+R4a5RQMiuH2eeu%Yp`V>@6L~+?MFcU!T1tEufK3~lh%5xQo zo;6)JBSi_!oNQ-EIgzc%aEI0k@y60#%ezi5ItD9|m2O;=kQld06(ui{ zK3(L8sPH+BFra*L%7IB&xb*_}jurWwy^H0o+uLE}NUA526{>?*3PWeOa08^7+;huO z=s7b9@1S&iK{YZbweP!Y@QI=IrU}`E8o6@Xguc*0RGAWkGyM40=pC^$695d@Cb~Rm zI=!Q>hNNbR++U&p8fT%P7x_!^i(u0sRmMPF`I6a?CAGLk?6I!{ zBiv+{afA=%TJ+bmY#M9X?prfHX=gtda=c?z`jb~)JNS!vhSCd{1zY?&G$KJyssGsN zz$#Y(a)1h}gj&nGhxg3HY}~u^p_9xX+v%F_OU?N)6bAFul1czYtEm5aWFm$(n28J^|Hf)gHr?2VfiM#8Vv!BP) ziI5#y^AID%e&C-jd|ZAvX!sTX`_TAwos7CUEV{O4(X#^3V&4UDqI)@ zIrI8N@klydt2y_6pmv+%bctVE&oeST6py-&N5W+qUcO35slD{dAJ(__E`6z!qDefI zQ?|MN(jlAQv2A z-?zxz&RYOz2avsR#kavz5o9tF)i#p3Bw>SHQkWL}=-s^`_sNe}w=pZyN*^i4!@W=p zhu4^bp*;fLNd1^ItGRC;{AS1n(X(`{;ZB)D?%94v`hIEVwot;o8G=pUd3B=s((f(p zgfF)r&)QJ(PnHS=-!>GKX=RW1jmbHn67jmrZRtvj1g^4D2qta}w);TM@tYY`)Eykl zd>$>mqCZmDc%t{4Y#I}I>~T9V&;$c7S#RG9;2hk2_CqK*`6iJmgB(Q}$G!@q10M-u z-w!zM&425syq-a^(Nl6Q5n8rqXEEQwHJ;bgTs_3TY#}1tF})PxQJQoaxmOL z7bD5>>u>m~8?i7DZ+GPsX8a=qaSBP{u+!J)S%K8VrG5DLsL&|T^}_1NQM0Gw=A%1F z!*!i=NX_W+u=k^rLWXLCO**eCQ|vhEP4FG?P0a640XWrbyJ(P?<2^tW=CXuv(TmOU zeV^dLh*D3A(C!5&yH@24RVtY@>8IjMT?{os__#c!HGD~0xm4|k?(Lj-Tdkk07m(ZT zQ#F!WK*XXoCd&gm<(y1SNGbOaaV@0rp}Y2g_(ZqaWo&Lh`P3N16i&)-2CP#atgx!h zKJ|osV~mN8iI{05Bz*REhKhWMN$~mL2twOc7)TXg9OQ381&v0GaexGy)RqhPE^8CI_Y`k>npy24=*6!t33BQB_EVFVOxt@W2* zf54yzF0QHrhhIeIs^C>#{rX>CQEFgmT(wqVB>p?zayq=URS(=eAMfnx!Y&+h$A(bAeb5>t0V-(a*+z{eJV?MoR^h#>S-?saT>KjrT)FN^&zR)X^!ttC^ zT#s~T`HXI+-g+Gft^P25UnVlaH2l5qPIe;*#QMe_QF&8k9giF>saE66zGHEiBh1Z> z(pvdr*hU`qm&wy4shTQ!Qx-9SFjQ$hhU)XaZ5DHMs%N@H4=15meN1p0OT=LwKf^L! z$$>Z4SuVHAAE7q#mkio=TD`IZT-Nv}MsaWNoLgidc+z)pXG7_o+mOWmd)BwtuI2nJ zv{9mt*!ZBITU5^(A#8vD(?ToGogt}H|(=bfS3efEFKma10>oJG$n?AAsUyi2du zQJfqZ8gQ%Jg6%QgYK0PjxHnjDn@kNZ^plJ_uF38kq~OIGh~I|4n&$6~)(hT;GH=nm zqr8Qnc)y80Xu$r|xuI@Hh`F&5?0Wbdk#BL3@io--I`iUWZidblDe&y*x&+}Vq3vUMrG?9WG4fh7s1`y!aD6PxLM4% zq<{Bm@%KSzV8O6I3g^O~NmA}GEWCUI#`WF5EKRAv4M^NeMCqnPeWrVgGjPLc_=W~@7udcx#) z(-O9|d0w+BP`u^QjI6c&JJI6en6?XBX)^P$G$2kjP42*>%9y&4e1`T^q+ts36O*Ua z4VapV$fqL=3u9W@S1CMQD;?;RsQg#`Hodp$hbu4s#XPMQg$!jfFYAXVlY=;a2_}6) z)Sl_$N|%Z<(i9;#yq+_-_xPH0wkwEXX{$&+OxiM@yB%_BLk){YJN}AzgAMIY$rS@~SD0x8)k_O_HWKl5%BXkfG$J zm1=fQJTs}8UY46a2SE4S0}p#pja0{u<7uU|*f8h@YHjxzke#PS(@)per?<&MgwT^O zqa>J`)sfVcA>-zRJ9Jt5FJrWN#Lo}PFZK#&99O7kC*J{v)ydEIjKgQ|l_Kk!>P)G9 zuV_XplOjsA^N({g{gf+q!8)VTX7yTnrQ@MEFr(G|mHp~i)seI&*dEL9VO;Jg6wXnl zVV*7uFJ8r{(GsO6sm|A5rrx{4X_1OznMlqro$$KJ)ZVgWU=@SJ9HSeh;0(^V1H85qXm7oZG!zB4;AFPslKJ)S#6)|2du38 zNS-7w2N3>pTrZ;SsDy;AjB@{`^CTiwmD@*`$Q0ni)_VzWT4XdxzmcGTA9ZiXN`irw zfxSL&!px0qeY2?#2lj;T2iiH!$_kYZKfnHbrn>_i=iwNvv$tx!=5HFTV9xZ?N?N39 zqec#JW#Q<^Jq=Qp?ZhAQ*4rHQY=P)@1PZ?@ghd){BGQ5D0*a5WQR{BrYuk`QHf^LKte{WqB{3@gMyuyd!ylf1ww!A*^N!4In%PswJeX_!e@v%)*&)#R| zB-E$2Bl`C(0EDfLw;UJdxCL@MJ=@tFY4cU%N>IcQibK`WKZd>%vT;MG58Id6q{he(TU~8 zIQL1BkQ&lWe%``u32&u83Ky${XKjm(!xsWKgQLfSg+~4SMO6a#5o3b55EbmH8~dJt zlP^yQ^&3yJ?0!QH3t5>_W%o`r*EK$dNY^g|-uFpIcchR9XC)+a(~c(r9Y{8+P=)ui zPlIyh(*8)1%mb(hwAen(Psx%9TB&C@5OC1$IpIT;Q= zm}bt7eL<>1o99Eea}d)KWI^pJdJcLq=j1UE6$a2_*C--LAL-@qz*?&L(ny;jBN1k! zYos0)-xG|vRvDBAj^59Mey~L9t4=9EVl4*-vMDO${O2d{ym2aP_b%PLBXDDX+F;!NP|>m4 zLohsVOJDuvW<2A3R;mKReJu^SG+*0A%)}=DuH4?pA0!Lfl9>D`iot zEF>LvM7hS?sc6f{icfGeH_4BCYI&ET+L1t_#CrD&$=hkpv%`~+JbSkoVQ3}8gC{@v z!KxqPWLl};0$7n`dUW?IUI6|^Az{5nSqA3G#v%-58$$iqYh&(WN@vKNvTFv7e(#xg)|RfBr;`mHuGn(SeJOgKWa~E0N*?H z=;Z-?UHTW7fPivy=G&33^M&N)n!&cJTG%9BI=owDPYTOH`#81TG0`gB=EJCV9uiG_BR>nHZmz}cwE!7uD&mOOZTJ?K>w!IbW3$j4v5h|8aT<2R*W}yVj|E=c=?F{Z`<3y)K?a1Pjg*j?v$xh&7ZQJZ zhu$UOO{Qd3rQyZcR(Rn$&lND-1Stshf4o1)!oK;d6Mm563s=qJKRv02AFscQ-=*^1 z&SGBx|08-XDZ)gW&OYBeKtxuD=u}Ib1UJ9%SaHc7 zFkRbB&W9^s38cTyt2|ZOjf(Z|jwq60^E&a<(906LI|&KHha}tJ(D6gCm5jY-Y=?*J zadWxza|g2-HQ{pKDhsiX>6ZhgwzO5dEAFnQZ^C+A1*L_9?t)2Dv4V<%2d%9sH;hYf z3W!qwHv1bAwSP1?FUNA3`NF(pBKOW6BE zxUfUJfXQsNRGM8wQ>|QI^EYpB!xii#6fU`91Q97;tP9plr3{6@k3~7tZ$kQ`n&&M2 zSFRF^i|*ygIY%|=!B0etz90T>?u7!2@Mp$FtbrWudjdooI1i_Os8tp~{xqPSFpm#G z2G837njJ}V6-T`$8NTka7BI9`SEqOrUnp>ZSMQ(Z?3IsVFN8rYhoH4TW60!Wzc+d{ z9&Ovs8bu{sI8nWfDEse01W6Y$&ZUG-jivP&LhA>UQ1F6r)>Wo zf>i>m=#NE2g$(^{$e8epm|4tmi2a>)cVnpBHZeI0nEVUcd+~{)|0+7SBh7wW0wtph zW_=<*=)Vg?tT#|zh|@~S3SRlKLv`GTC1|!xG@m~ab87cia9da^)K(3#uKR3#_3As; zw0A>9FcoCy2O5>&aLnm5TR5o1r<{`~vp4-~Bv;6zhZ{jP4I)EV-QE(7Q4s(9j*F4N z!>FzF3u$fF!w@5A*U!U{Hdvmq6ZQ!0TqmmZVDaS&R&DJ#shRsWI zKICD7ih997m=wvQMah}2i&hA{v6+jHn^0bQS*|~6quTjQ9DRbEpF2=^c zPJ*NJznDkuE#dt375;NqtYQFO!e)2mR->51|EER2`75cW5W&SWLt(Lncm35XiYXi= zTg1?Xt3H9-r8L&Es~~0b*6TM#?6J+ALKmRC)m0?2~9FE2nq=1L1f>W zJ1Y)u4Zk~S4Ok!xrDNM;iAnwbL2ZIK=tqxeRvs&rnO{UB@n(^{bTs#Z4s^Y59~4Zy zj#`&hD=G&~izv6jnKoLymyO;WqaT_38K3fFwiH}Q6>n)g#>Wr$m~}gtx!Nu;93VGU zSh*i`e2tjoAdvzU;S(xBJS8QY1;{cc8Oo;0NvH=-tOm~nELCk3$b1o;*#(_KYOvaF zoo&LFf*PMhsJXU3Ro7+?SMprk{TO4Tc++N5CX!OFR5<-pZo2j>X$Jp7Hcwju4#Yj` z5PufC3)3%<@5)u&nr~6-$4mI)BQ7cznw-Qu>c6aHTo9(;`1I(*og%)+WB$g`<6?K! zq(rHyOXB{armXjp&uonovWf_Bl^I$B9m$+G7&x;kpCr+sY6zg9Q?LNon-Ckk;sR!)V=)M;7>gd3||zG6ay=X*#v(6&JaN+;iCp8 zAce37Vd(P)*oV#crs40EJ?D;eK79pY0J~??x<(*+OsISf+~~m4Y4@EpkEz*8I@xRo zffGd4$F!5cxgV|E53L=e5~>k`zKxI2!CUL>QbSlwF(t1;|te_G~Fe#p2b)a!!VXtnTDfn?hBufGem!YG^JT0apLQ$cu+ zEmb?;Y^Cy;`(y2E)m+w{t?g^1c?+3WgXBTAH^BbXjHY466^$60y8elO05khS?ThtK zA4$(=>hjP?iN>=tK@lXM1fUM(xdL6yexd!>1?o4TOrGWH!4}1i-rCn%um0frpnm&D z`e`TQ7JomNDk@qWflvhoOQnBUzUs5UF_jq#k<>Sa@vuYDNcdG(REuQY-7nrIhVC^R z|I7Ku?w#fxhv(+IiDzRr&UA3?%qe*fiQJe>CVKR#2F|~Q>BDAJT zO~REWoJjTAZClFYz9EfEU6x@vTjzOC3Hf({psu(zfQnvkGfuVaH}$s)8o%I*#_C~V z-zdNZ6?Q47mGnF_A-0Nf)wsh7hpkyiH{$jnwD#@9@nm9!EL>EXnZODcRW5zZ;H;cmb?*@bqB9ky= zr4!s6U#Gs+)06WDPPf(9?ZX3Y&#dcT8nG3u#PANXygYcnJTDG3+M+bfDSq3W%J2Zr zlRVl9UWXEIm8`d@vw4nYK}@V;`7=}V{-YtZBWfN@S zz$m%f&^W4lnogYHuR@eHlj|q7wd{*J+i&jMxHnCx9s1r`Sd7f>E>&J{;A8ZExO>Z} zxR&qFI|-Hq3n92ef&>c?+(Llh5Ik5DTpIUAg9O*$?(WjKdvI-_aT<4bnI`uq_x_*f z<*YTcre4sj=Bz`VQ?hqe?az0!>|K<8KYPj;R%O?mL^Jj+N9tF7l*y6Pd5D4kumXZw zpFkR#C{mwBQ0K4{68%b7wE<_g&Fpb_&`=>62jstuV0Za%bEW7O!9kT+Fn4jGY~`pt zW&LQ?U-(T;_nEqx)L$Fm2>;M4ylf1G6Hx|E`KOcsCVCxI0l1O;PsxDzJpJbvD*v~9 zku}Kv=@zB77DUIU?gb|cO-dgDr9UO_-5+*O6h6^S^-E>r9oeW!^rIgh`Fj563WKE+ z9(as%j1bw99$xalr^G*>#s7~;F+M)b|G{VRN=_!JcWA=lcRnv-2i;tz6}xGeOZ=y2 z!GFovDf}O8_=gVF8viBKC@6A|mCR#5wm#voHTKSx;07}*H{0aDY@`M0;MHTt^&fEg zcgJl;Atlr{vXa{#Nk_Qny0V_L3G(Cc`*({!er{gZZo%aU>z2%?XVf4_8&@YAWw(*p zwVHsE|FW6&NAr1%@L*N@Pect4E2T}>>eYV69r7U-rc>{&(RJ&cMWu08_6*kSrCN_A z^{E&y`D%QckrrjhmJ%P%Kkr5FDXRdwW|AtW32I1s!tRO&&2{0Dl*c>ERuVx!EjG=} zso_q21VO!ciYYp4d zv$W=#^gT%h7#O@0aAHQj!gC*8|48x2wo2PJnF}D-#^b7)x|dgaJkv2Fo~e5= zi)oa3cB|6wTZD0_c2Cau=hQ_z_>N3W&o+kRq#i%CXOR@iV^3?Iu)gKmZggQgfK^2$ zJS^&fQ%BEL{Uo{^8R>nM-FxxQ2+uvRh~R6yS8hk9O-SqjIq zwvavzTVeLtMm0KOy(_G{Ec%^N%hoEUukPZs$c>Tdd;YUDu}R&M_JYr3x`6`s$VhUs z%L1;}$ev5|uGMH`1j~HZUcZpWG!7VD>s*HzttweXAQQ9}y~$&|e$q(6g{;k1QCaC7 z78Z8?*vk^4lgZk1M3%t>nXe$TBtsaV)FkqGq7jAw?$1*{Vx&V?7(Hi`6JMj-s*q;Kf%lx9y!ato4dWXgxY+H2 z#iB&~=xe(_h|3JLAqR&=H|xB>Bs)8YoFiW&STNLvUY6G6LQidq4dW z7(P=}V-`8x3id)MJgSK%LKB$vi-hNKXHAofMKg0Vr)VB2m7~-9S-W;VySzv8q=o(_ zB0N2ei6h;@I|@e68|i-__YE2(BIgtQ{D;d7_uEdI<$6Ok+xG&YWQE7t$+C4mI%#>F zW1KBs@3isVW2Rf3KTFMOW5NzBJ^TleXBBdxYeU>-$bh(Ml;qi%KwEQ!`|@>Lvl+F! z&8u7JB!GGRmCf44SX9RrlWt;L5$hSSxpfGe1?OYIi1henB*?x3MU-c*!bN2 zBrvx}smc-S{icr+?29lhLK9IH&mRT70KxGETCxb42Wf3ug7uI@aR zoM8R927*UrD`|FHzAyO;!Jp6D9X(k7Eg2i2I##pXgefTYIVPZ2Mu^g(IJ66Ek1=8p zhq(2+G?ZS8X!{z&Gmyn>~+9l!mu%c|%G=oT($PdGKXF|^G|+JwvGoV_5O9t;Pzz>);3E)T%8( zBCA8OSrWy=iLkQG_~(dDwe1q;CGr6O3AggNmIh{lB0aR`rF@pSi)nlxhpA?oDEPko zo<|Ui5ybRueq}JCUSEbP%T=@Ib34b0^?-vl8l7>X%nwH1*8sRw$w_Kh=l2f#jog(M zDc|Lp=xrCcDKpF@QB}Idd`=F>}SJs_Y(KhY58yr3-oxgVYdGz zhPS7Apx5_c9U>d)j|0}5951n{(LOU{8rfgh79CBeH><)R>EO_x)}D*y+*=FSFfS8@iRVeu5GgAW}P7$`340b+yrr zI|#xTz4CYh?_sN?ZZH8m1kOz}z2+!xUte{N$aR07_$DB|rmjP6UsaT4?82O_oTTkv zn03XhCg}dTD$_cZff0l5MZQp8!tOG}k+?gA@W}&{DJWmP*{0~qu4~oL2 z)Ari(h!)q6v#lDPjNczWx>?{Py*8<_K={R6AeFye7&e&fcutA=Pyorr8!vM|dP$tG zZfUPJX1SPAp)Z>Jy^^Oe<%Da^gXq<4lAg;LdKzYT%SW8_A%f}4K83f&wldqS7?p;Y zzJBn9_Xo<%9*SPsBp3OWIkv{0Z70E$c+NKqMh<%SW0r+IdsWo})lQ(D9Z&TOk-qvc zot?g6>&{>44hctuhV$T@EpRu>rM?s`vQ!?oCgY8=5)E#MiWzP{y?no6(8-(%+&z=%8WNVQewyQI)C2CVajp&mz?Zs{jh0&5~EL~3%S>I zUOzlGo;?@fc;VS7ZLqg!CTdkmo$D#L9FMZvp>OWn>=z~L{lWU&Oa$XdIQN&Pfmvcy zk^&c~x7-|l4B)s&5eyF-QG{DFGN)-g3N0r3o_0DD%&_JTmYuDe!tR3lI9v5A1}T^C ziVgrRj%lw+1j#XzkytF$m>viIr!TX2$svaI7XD+YCBx`nN z4K1Vp5Wbk~7u5vDTe(>haO{@0hc@h~)d`tT?~F%rgs<4xL`j+}0y3RP;T8EQhvQnb z1}1w;;h9kB{+?%`88Iiu{$$S(W=BduJ6qqSsOsSko&CeuNl6|IZ_vLTrnBw92!W>w zu#94vH|=CDn&hu|e;_rie4q*!XgFnMU$xcnkWOMl&un-aZ$q5J)>W%}fbl?q{bBDZ zz2z9xS$EfV{6l-?v)s=5vEkVE^hla^(iDp0Ld@BrUUyL^ZqgFRd z<|{5MxS&Jl8wXzG2Yb|GP5418qpA3X9ol;E*-u3fb@lz31>#l<=SO&UGA0q%=1Vc# zPj7LHLnoRkt|(2fG)3mN{VNnTUa=R^eD*V440^S*N#G?R+23e2;PzJ2tcLi-LC}>B zlog>%VDOu7GDJ`it{Y;S_2f*5&c>QDU1gR6l{@p{6R6odo&$z1 zChj=Zny2^$jGBkAjXom{*}N9%;e}GB28Xi^@!GV3XFM1^J`!$ADiI-jQh=@oDexJi zD^CAKf35&UoH72_EjvL{w^q41UN|{BKK0?jyK9?g?Vf2S#MWY8`Dyq1a%h>D{&fIM zX6{Ez(>aEKN~k=)uVc&aRvg|4-!M5*!Mo&bPndWqB5~uLX%;=tf+qm*$vU0OqV&lr z=Ppl~6xo^(A?sN2uKOfuy>%oDoX??GYbd`2PnBIN+CK=~EU`Bp<@drQT`mPbpi}Wx zl}<<%*-kuJ^E9$nslRF!Yf8crphmQC$mXi3<~fMI3!M3ZK<(RUjY{%Tt3ceyZ3g@5 z9)b++3Y$%%*vw@zjNhkt&QtT^z{KFb5;J3xmFAfK^yv3zgSR? zas0F~(4qJ>v1Oy8R_J1+fsE_A^@i1{0v;7>X%o%u zf$N)LKBf{1xScu@ys5(6wjuVD>$ROBsc%i#FeqIRunO0+4Ls>+arEaWYl@NgdkaZoDSNQq~aro)5;CCog z+P-=LE(dtpj@xVLj1k%?ZO`-pu3U`79q2JY^SvumPWOz?+?~;FIsG={fX@bVLemkF zV=PkXA`2fm4nv!1b{k58x>EJ(tiMT;J!XQ}ctbM>%8=457}^bX64;I|bz|i@rE?#C z9>^*^v3R;^d1yyt)brj{o8dtW?j-$@!ZJ8Tg`>On8lX z=mg{Yo-?e3i2iGtB{v5#&dm(d6UQCz=g}xuk`5uJbAg{s-i3!z`5DmDIL;BK4XK=- zd%HqXA`J~V6-fN_r1PdNLQWO1F`8SG#n%y}po~&l;f!*a*2wwWb1#wQF z_NMkw>-hsIe98Entk(XQM^J=I_lJX@UI^kGIES?Sp$``Dg_-K>3v!_^3%gBA8dKN` zdeJk}HwSLW@CByDja;}IjC`mjim?z)UGhcl#ZnoXZvS4dzjE})U3EN-24Hz3Oq}_R z$NXGZ#P$r;E~i_knu2GPOn>>}CT~|jh0E7W8%FjeKCrlOUnxb+D?Wo2&G?5-EAywV z`H^D~?CfmzDGQvbW+$@+qPW~tfE#KlKi0FFm5*lkPTa2vzcJ?=NGJ`xm~WNuyE5qA zN}<@K=`&i8bJ@m_rta1?FSd9`U!dMp=R%Ou>uk8Kr#DZ|9;Oj6fRA5sXc1tJA1JImy7Ycpdp%Cg z;NDQruHjY@YD8arXj=V6StAkfo7?w|JaTg5WK3Iuz~KS)cJD8O_1ASQJZp%;bx$ejk>_bAz$`U1b{m9l4**>3uCIH;2qhzyFvaI2jcb-@RL^T$&@ z%lB{&^*x+J?N`1X6dlX?W*-w#OQs;7)l`D(`2=*L@#{w|ZRS$Sf}=)w6wSQ@TI*8& zc9Hc3QqZh+IoK^#Ct_wPr3&qLZeN$S_S_9bQX2I_`7!8Ti*tXI_Mk>mDugufTjrY{ z_q;n)#{=GHQ7CF^0khIY4bPB%9t(v8q-pVzoz|bY2fH~TlX@^of|g3iEQja&$4Xu! zzzJ2jn29@7FJq^<&vmswxxl&h-+(F{N|nZcgi_lW`%0psGKxaC0s~NvEbav;?SCYt zRtqgSPpEjVu9~e0RhMi$v5yho>M+?xI0CqxVOH#p%AHH7g?nc4=SEO15LHudPAP^m zCkLf^R8=4%UZxk;3N!IuQ-#L8c>9J-Qt^C#rln?Vtbn?sbweYL^FltDZ1aVm0vJa~ z7=gavZonHv4L!gbb{KJz; z5y!y)FU6bw_AiRp0wvvV*RyQpBgQ+zQtj7kYx;ZS_TIze&L4|z3G<3RfJ&mY3IsSX zRT*1V88S1`^^GudL-z`4I%?2kQFV~A{&nZ%2Z1}mL1a=nn zwqn9DX?FH$Zs949H(%tEJb$wR+8aTZbb4PUEU4MK?A$bkbC;bot7TtvH+!tjPP;-c zxrkI^2vumNYlr$|#U!;htV!mh$7FUDFl0^VdHR^%qQ0LM#^b=K1f+QC0B|)0v#@)j zOF$&`7x@-++gL?a9D~v`K5(FyiQOy&nvLnI)phmjk*$pZpIK*aA2{!L!g_zTU4*(F zwsy818h2Kn<}~`UU#km$O5`w}Em`Ap%}xwbI2R$P!iRfDg?eY81t0t+pz^b2sL(wl zT(#K1*MR!eE4R_3Maf^uKJ*1qL?K@iR+R@ivO`3hNIAGMq;IiaWcZuEll8{dgdSQ3 z#3StSq*?d;lBeNO9Lt3O$ z0v`$Y?)^L=!8FGM`#`B4)NlpmGY{rW?kA*|FSnmJuHhBJCT3Ixe=uBf3%?L?cAOII zCG<)AZGVqA_Rs{6#0+56y0`?cRBadm~NkNZ0O7O2S9t zN={?CZ4UA$q`h7FnK&ziG~UuF zo1?152T9j`!|%i0Ddj=TaJQYa@xD5Z^wovmtl+Hg8*6xG9{6Gy;DX95fE6%evCY9a zhBj69MH~3s;T)cZ9d(aHo( z-20$E!Vrj8=QTuGDx}RSoq0kkE3Em=Mt_Y~pKcj}i{2(h$yL-}6&62tzVK{uqf@}> z_w%1IbsW99XXB%to!epJ! zL2Ya5t53pmcl?o;d~B^R$FDWwK>X8>Y#+5IP;*zi2H%qQOa~sStFkL+zgD(&U8~Mw z6aB>5<+PSc#N@u1 z%P5BJ8l@J&C^WzAHgl`DsA#{PEw3TBR@ML(C8Ye_+->ggde+PNQ++K0P_(J?R!}U$ zULwi&{-3yRsm_Fz!(P#IXacP1P0jG#Q-pO3u_>q)$Als0%b^a)XHGN24kDFVU6PlU z(-(l34+J(3T_0Ug8})^ch@$(Yo%pM80Zqt2wh}>LUz$uG5NNb_1$m?1E}#TL)XFW~ zu)IhRo`;UmZsM?QCgQ4 zUx;mb##;U!yU$X9w-z3mq$A0t8SMn%?gM)$=M>0&S#}229@n@_z_r&S{o(OO-bM_< zUS^}YL9Iy_h9;?Slg=Ldl9-2@OnfF&HSW@{f@hrC2CS|4;A~uXUg$JF-c2@nl;w>6 z{MBsfr{nc(|I*5zf$xT>v;ir5K~_%1TYClL8{%KpchyFIl?%I^Ei1Bdy9niY^3Tm} z_u`nRmP8Qv<7Peg~e#t2bp3ET2d@u4_PUA01ZC>gUki+{vmTYxf14sKfiKL6mJUrXr|SK zu9kg6bCY1nzbnx3wwI@+#(+W1KuZ2L2qEkPPB=I_vr{Q_zpgWYK}gYtz+o zKgVLWau-sBeNqlgMN@CcOeMBu`cAx$wXqtl=TbIlr){I0w7*-3m~nF6rF)_ScHy3- z?J8FWmTONqV%)>U%E)B+@+`lrnK~tp@Y&-=fR9g$+jkiXwfkO=MU|^G8N4cmeLp?N z-4W-_3LeZQvm8rLB(uwKzc`>?UrXwy@W!2oyL;%REsS|6r|*Lz&R`qgnwJb3%k64v zaRY1{54iaFvYMggpc0)yo8mf8u*uF34)YS>@TvzTM2v0pFrlzdQzIIz8b!j!;}>p- z{2yPH9Q(QBtmTE{&2@{SX;cmAk$TD%AwKw$VtNtUv)dC9Pen!z zN>}xex~GWC2^n4WzQ2fr#x#8k)Am-s=2RLgAD7&DdjRK)LDSibxi6C>1=0o;^R+y= zJ08y4Y6n~ROR}h!{m z0y?|F)pSi6QSWL>wx{*jr_X*`s_xlqy~OwqOF*y>ela~}Tr3$RV+T(~yrUF}o8_?Q z?MY3P_=j{}>Vlq3D1^|p#PA009UU`43DU!)MFoTEM+>!&N(TG9E$vWyEOj!h!O z5Hp$sKKt;fK5EBL`{Ky;O~F_;&ggVyW$GxUXm_O zn2CWc(ga9aH&7uKl(1K5iLV3Pp*PMX3z>XeHnrvqq-2^m>A{Z@r?(!$V8<2KZ*M)+ z_Wp3R`W1dXhl})jD)BbTH){<+8hfq7e*wh1e*ofErvC{LtN#Na4&}`M7~y^_ls@%c z`d&-hz^u^p+=_?`2V1yP0O!^xIp9l6@KpV?lUj5C<5!GqU5Dv0JhI{57vIssJiKPZj-wT;V&PO)jggA|c^1p0=!|ZYVltAu;Ov z&l7oYn@n+3$xgTF8$N$r+0Q^WIYEt5!DZACkkqfSuy~4Z>@;8_o%zU5_wqgR)3o+3 zKKD$o@7eF~-uBeEz7aME!qQVo$;AaqUx7a#l_*a$WC|uf`*8Gg27h)j*P(fqTi9_U zGmdNSm&JJ&Z2ET6`c3~e?5X?)`?j{1Sozt5L69)Ur#QZa#?0x&95*Gu#?RpF0LzC2 z#zF(FkH^*ONDI!fVY;xM*(i(Sx%QluE)=w#dE}Vv?ui$J@J+_2z%?sT76KL<%JJq@+}7Bztg}aJPTR8&hsz?PWg_k2eT@`<7N_M z(H?@}_G+T$oF`dJD~hN3{)j1Yix46`l|ZDNSj|zJ@=;{ygp1S`&t3f%nq_qx5)#3hGtF)SIcdN0hjBVO}e4FIetsMF-0Qq)0OPEW|9}(2$?tS z8l10SM*N<42|{Ez}fSw~U)J8!B@vlh_D;7(JHl2W^(_w#>e0SmTE*_||gT zr;Tf@vU`_UHs9!$a8F-i3e}wd6wgmE+QiG!Z=lrwfwAC*4CB;E-`rXxyW7Y2Ib00w zK@fg6lFfx>s(I=FX=w#k~k(s;srswrBKa2X4m$#K{TbQyRo;A$gWHjVre%5!VU6k+d@131p z>G5t!OAHGdEmwC;A++6NdxOxxow3yEm_cm9h67(~szZ64$(;^gf$v!oyk=9|!nPzM zHPYW0VPr2W)HH8Sg4ybk{B*u`HsNcY%`dJjEG`5I)wrZ0MH)%myND9q&h>P^2+om~VWt78D=i8mzDy8J+aG+%F zo)nYz5xqu^j@+-3b+`);8d;C7))cwy)F&DcEPf_hYF|c^cBM0%<$vzzQxM)kOfR=r z@gCC4(6GAMWWneEJa;ljx83|i?IHl!e}}0f9ft|krWZZ-#hLzP0-6dHecrmn>$(JO z!!V$6(5cj!mtTD{KktTR6~qVUU28N#c1VFcdcfG49Ma9O@?p7dMDO|rk4ravTR&cC zAn-WU!>o${<`PDjutNy(cgd!Pz*P|m3yL$@pjG8UF31}<%cH|Y=e5BrR6y&|_AjMV z+Jbh3PIyTqUG^7qn7zDe!(xwLTk}dP@-`&6@W%Vj8!u@&$juR zkBR?^&b{~`rb*~@LkVv9E(D-Aa=tyqD;>wgt0Z%9ZQKo7+@uYewUogAOPMYlxH7YY z49ALv^VEBDaI%v~SiFB8x4LhC$5w7mNWZj7T z+gox0W=AihA8pQZJvv?Rlonf&(gw=%&e>p+B?D1*O7i&SPJK6?JLXNWp`!w$}i zh}=YUeq9x7lQ$Fn!${e=oyRPev&N|jDGV*C=CM6<0A52!ayJx#`|l_fAuB`$u<7Pg z1jgjk#Usy?wU1^1%2181Y6v25ND=t4_V%U2x$;@q(Zs^<&8gIAg6S3>!V|#--@6t3 zJ`sX^b-=CEt*Phbtzco==#TM6{@9Ee9;t^|8B}$rpuO~suui>QU z1Dr^na?c@uJh;uc=TO5W?kUf_qUFeIZ~;Ao!@9r`FP?1+gh2;%-~f1?dMZbP)E?tY zkB;`rIi7p#k2+mv9o}29A)lt@oW|G{hpU;ny-m}JpZbXk>Pg4hd^j_NCJz0&q| zTT+D$tCpNk_c6`e_O9*y>GWg14S&dl<(F$&-)7d3i|n_2i{0gwo{y>C*I4jbjC6TL zxj4MwEr2;FKQ(DhU4L)gaLs?D=3zaMY?&X=WnSOxRT5d9nc8-L>fuaPe@xCPx$mFWgnfjjaCxAeFzDA0ubIKi;^bryB+dAk&Ot-#d}S*ZcK6F8nzmWt0SP|~vsZ5+ccrgi@c=!#rvX3Bob2il*@_cOD zGW*s?_AA63RmOI(Ts9H-wVuv5C{a2(W*MGMoGWUC@6P`L1VP<|PX2l-OK5afAQusn zkkRzWWKmLT{F9_EyaMsVl^6>feBt41^}aTn`k6+q$8ASsDD5x0F4?g+cXxsdWBaU& zlc{#Wi>sRaSKu+mtmE&K->;H9f?K(ZInfCQo|EQ>1gNTo2C}AwL{dTD5Bv1XH(GKl zT$sWX;x+xys`A^4D>8Js>hf-$dfTsBx;@PeBlUrWhiuN5qCx|QqrT|i=(TAgBGB5R z6fAW4vb^Y^iq&`9m;%%J+a8t*BVLqw)QzI#_NL!0StEH9q(k-EL)VK(nj zSEt?Sy(JVZ)_7v45hxIeoZ&5A2#gJqx68rD5Lnn;aw4R`yMNkJuxJ)VkGEriYfyRo zo`4wheHTS+bfH1<=T-TiY&>>Pj$0Z~bI)4F%L@3usl~A1C(|@}r!<>hYd0_)?XsL^$F4GqZ+e9|=BYrrS%}_v?7i}gIV+;; z6Nz;-(5R>qk0aKG&vm@}V#p5RJCC&kWqqv^?beHnbmP)edNAx6)6#BBHx;v7(#3dz zw|5^ryA96@qJm&zu zaI^TFKO6GE2}_ZQghN6I4_D?1Be%FV2dSSRp%>MGO!rZTsXKU&07EYR=Xz~R*pFq? z?@J2Df?bYX7hOCUEf?<DHP{Pxa|!J&v(O5PjaKPO6(qGGWuqTLjjT2&>dc`lbU)s1COnunw^bns@D#Pbv#X6;%o9d?<}GyR_LdFf3RjPBQ# zd#p{Pq?#1YmV9Bbni^>lW53Y&axUUUUqlN`8SLtB6JF~;Q^FO%suxgTj!R`Ze!|sg z!zUZa`m1(7?Ux|QXHrj9t&P;DQhnYM90Gno)<`3kVOZx2>t;^lWWrL7Wh-NX*M*_B zM8^hYi$erj2Pv6Mda@=MHX?+-`EEdy_-jdADGUg9x~a}$w8e1uFu`kn+aaoc{q{s0 zr&KZ2bP61V5vr+*2Ez}i2s}Jm0tUu46Khx<7K<9Eh1cI|O%B5DO zPm3cut=DK$zLFK8;@vMk)BJ_G`?K%`ihLe%3l*_uv|78M^>QHr@(raDlW>~}d))Vf zIngU%Q~ah)Vglt)7j4n=0P{Ye=;&+xgKue#jn1O;7<0~ix@B=F$Pn!&V`H%HVzb2={$F($u2Jl{FsanwpGA`1IfLT zGr2=iL%YJwujlr?WSbbc9U15`bEdC}OWHJ3bjT!|C#P7@qf&n;HV7077zF`DyWQEt zX0OjgwJ0DJO_A0^A3{XpYwZ}6NrX#%yOs%keXakstgnHtEx@pkU9UDpTdw>CB>FS9S4XM&36ft@uCON|D|o>4FaSq3)@MlXW+m zbP8n-4WM0nAudFGhGe|!W0Cd=W0jaDyvs16l=x1C>OpVkEB^Uk){H_h5=zqL;u6C#*r@-0?;3TWTKrPcFNPWob9 zY_Vn2$+w3ugNPc$8f#oCokv?3zw)!IHlwk(txM5&%Yo1!r#r;#f}96K^X0q`b9DLW z>Ni(6uWfWy$Y29!QnZBtbK0hl(D&ZnY^~XFWkeZ~d2kSk(}|sibDBjz#S&j&OO^(t)nVmcXs(SeA!m z$5#zhSV&V3Vv+E7kaI)`*)54TJs+dp8-ZNrJNdb9PDr?cwvr(H*)I%`Or@}HG+d@E z?sPey4nZ$<*19I=C)nc~wX0%SYE;Z?5;%Dr#_J0kl!6VN_c1nvF52rztj-2Fh-37O ziiyL5(LGx0ioWc(m0s%|e%V-Zu9q#E^Od@xhINWL(&;rs_pZQLU%6kz9XL-a#6*cE zMo(4Pus_jz@4P?58J&mgOX1Ql@2);~h;nUEfaz zqHe_@9Wedxzz&asyDJEi>5t)r#On&qB?#S>h*YcUJ7T*<~1RoIk{DIL@{LDDSHs3^b`ZlcZc&PUsnnZX^qsk zoPEh9UFf41Hg|K$+j7{VR390p+}6JVhMwUs{pBsgU6Blx1NH1;GF0C7of@f8p+)Va zd0IPnD}2p0?8!jv+VG+wj_lpd7iT)vH{TJ1og1Cac*`+1Mlsuk&xcj53GqTdnxkU> zY^ya8z(x;6StvUoLDx!yG8*2GqE~~$EuXqAovQz4o-Fp(To9RBu!n1I1cx?zgQpBN zpqCsxM=(Zzmx0 zQaOOlPH2kdK#44N9?|Y9Sp|Up=mXIA&wjO1Ft3}c?xDRrEy0MX-aCVb`A#DNX9CdJ zKTO$waK_*uBvM$-yzseTG>)MD_Kj4!{F+#x6iIfJL<@N*Y?dfg_klk+XkrUS`*DEH zjg$bwf<9^f!47$Aq1(|!xjvS7(NMtuAj^IcREMv6D*vfma9_vXadc+XrT)BtG+LWV zyFZADYEjH6cAH!~vE(4_hMc`j(}A+YAvTXOYOjYD#eQE-rQO2t#PfWcR06H!_t>SAZ^h!m9* zRWIT>@S`^-uGo{m#6#?Jcfv2C-3|oXG{3KtyWgz?&0U+A4&$qEDTYmUQtzKP@=atz z&q#lg$Ct`k3Jw3B6;&S)Q6=!nZ~W2NiN5_A{cV3*ww4_(?;UMWr#tKsK{F2brvR8u`8h3f-L;>hlFQ3xhsNc(k{KN5uu3il zuzE5qDi@2$K73l$o6f!pZ)3 z{Q%#upcyk1JM^!?Cl6}A!E9Z|^cpqOPp2ep!cQijCCSd^GU~}<^f~Z(W@_(slp?Lw zB8yEshBNB-S<{`6%iilDSNz)1@Iz0I_k_{k2kZ{$Dk(iN?`odzN7+Woji@xoa$l(G z?S`367Mt}@X3=PW0=*mQme1)&O1isNPU;`W%@ab-I!`YXaih6t%9v0h|4P*}b)%0Z zn_By$qF?uJud_VxHnJz-Zd}$Nq9QWaI=_h6Jh>swR@G>F_P6Vd-vo}_(&y$1ac?z6 zWOHQz{kec=s$(APMIX)mx$LK{Epu_e89UQ&+FvY%eUFW2^P)mPdCE;@y;S_6TD9tA zU4-OHMHoY}IoWfS%UZfiH}QO%V{g`UcCM;ZWaKv*YM-|WB&9=}>Y(3)l17ZzLan4< z7Pbl{F#XyuKFAk&gBS$_86K6#+gRZJs-a#UQ?~b*RSLZ0r<>wMFksCC$__ot@;{)v zp&HlNmHR#FL1`ZrV0|wFy}cepUZva0AlWgHkD0(6WE(;~;xDI@F9m#BSQrk!y*jZ! z&_mUo1M)_Nm&1@Suv$p2m(yypcC`Jb5)p4eVS?mOKR3d z(Ij3Nvu%&AuASl7rQVUxb#0$Ku4b{pGgASu!@cJ(?N!tx?;6d%z@Dio32#UUrsbA8 zMO?AFtJi!=mXPUyo;1Gr|H(i*PhO(cG1;%K$edxA6U7fCz2>wBp>G$5Y^Ve)D594q zOnPt537>nvztt_670ZCMZNu;LZ@UOLdLo>`ee~~YRX}iBZGulfKGI-Vy_&XE_M%91 zYL--lXs>A^XNUKYY=+2uEm1pk#p{U6N(LS^F6V?T8@d2>X|s5fbddUj%<(FR81y@p zt};M9(Kls7=I7s-{Q7iF#u~dKX3AM(>3E{MeoDi)c30F0X%n@;4(8izHmK{kTUj+%bn6 z!Bote;^-rj)_WA<$vYEo8>Kf%U(QuaDM90unv*eaO=SpOQaFEdOm)^VY5xo3S79?| zhSSl1%BV~lSfCUL8+m#j$^=&|m@TAbZU@uHRyl@rJTi+j$9y$E|C7(~zlM=0(v`eF z#&tp|3YVY5b#oYg?eX+AU(LIJOa{to^1gv%sE=*)7ZLfJ^<95Vae3owFq#Y~W%lLY zC2xcyVbsc+eLa)Mx>pk_iBkISP#ImYDlwEA>F{Dw<*(QaHa7l^6Cc)c;2W;eUU61`w_;8_Snt;6h?&9DfpkjXxC538a5xb6#r99Md6}4 zKep{M;q5vOd1}534QM&v2F{RXpwEg_z5kzlz14ibDyl3Ir72hS->Q%(m&gH+&VGIq zTGQI>hF4{8=bP;2!ZMrE)&vn>jUV8R_hV%?Na<^g1~Ht}&w#UzC&$Ko{mlYZ8U9nD zdb-|LUttu?chl*Jnw!3FPgK^+2Y~P5CZ*Mduj&CN!Xni@e-{-Q(ZBFNCz*?GMb_Aw z7ZCyU^TmRg`#&j~M6VUb!*8B|QEK?__aI`|QBmorP){ADmp(cuvEIahP{A;*4rJDr ziRTcRsQSATN2Kr{nw67R4Oc(DESf0ab%w{>KX2F- zeie8v2fhC>6ZEolP1}SG$g3B!>(12?)w!~B!0&YR&!Jo$Is~Ps94A!#VsU!hb>f$2 z|NZY0Gx!b|B%|FW$>*WHAJx9-tCd3rzcv#lz-!+4kD3cVh8c%?zNiRRP!WkQpO#T- zE_!S$2eiiy@>dx}ZyRd%HgnHvqAKvCrI(B^ACXaRE|P{{=H3YX_f=T%%SyCd_LQld zn7j6DJ>aJTv!jz5iGB-K#Fvhj^AFU-Kz{k?RJQCK zp&BKUH!mPj1c_11^znV1xe>FI6&!AKNmU@3WoKe$EVa1DyStI@2iz=DvulsiI#<} z3Lu)s!?zRDcc~Y}qqVdzDP|Q>(jx-piKgT{${Eg0a}qROvIX}3{I5|L$Jic1rC^h7f(70NeOnYH`T zG%790I}JU4sR8m*5Z_ zg1ZI??$CH}56}>t5Zv9}J-E}jL!*tu)7N$1=XcI|>-`6ws%L-d+Eu+}?YY*RYs@jn zyiQ7JIagumw5aZae=4fZc(_@Iwm@@7H8iq!-Bz=lpOh@r}D%D$Jc;>mNJSD!***McjhQ7z>}R)D zwf}?+*V(1AZaz;w49i!Z!!Kxd3dF9(tx9GF{SLW*xW+jYe*L_*GOxSbQTBn}>2WMo zRVT$W*5dODrrNd7f9aU~x86=G%o6pzS*TsXUU9Rg5nged$HQBlC!dqr*N3-mv8`N6 zbZ%T7%G^sz*56bLa24rG@eMbr=dG2^mdC)x)(m^m@?Tc0Hx>(41sMzJ%MSN<2bDnJ z7+ql{VaYCR?Nu731TqpMB_+-4RLdPYYTr9p>LC9Owkj^y{j~$3JEO_FY}dJ|!O^kN z0|%-%3|M+l{3@!5s&5{q7{D0*@TS>*?)^=`=AuG2Pzb##50d@$Nc67UJGf1c>Jp0rdt_sgt*OkC+-)@CdnxbLK~-MCTl-! zKH-!(!?X1>QInv}!}v|RHBYe2tu%%?Pi2JnuzRcfJ@XA3d8t)GzuP*wugdNT20c+T zj`v>UXV1jD%1%8xjwytGmv|yXf+F%}=7lo}XrFPi%csm zDvini$1T7a+*|O+btMI=pSd0xJ?Nt5w8J;Q68Wq7O`};dY(Nl5eI4I-8j2Ci@{-A< z46kzSE*`R!^)>Wge7S)D=OLwP&qr{7D&A5!v&F~yg8`<+R|1<+R_#FMDvjy|=HW?gVM+hz_b>!ycRT6*92OHVVnJc#< zC7s+^^`vLG=7%h_@%yS3LIUlEr3&D)=eT_E+kK+%TFjtj zk=lQa7bLjwsU1UF9R$FUfXL8h>LSm#q`zY`C$H0oEI=&&`1UST*+&^3P@;Q)?4`i3 zjjy-jDu1Y7Dtzbc>sVpL2&HSY$U7vnHS6l70!SQ29);pY&f09>$AK4Z&jcR&oKhcw z5e^1Wby^kpOMKBbxUP&Rgy;Q8dJ?p{06u~MfCnSs<++~YKT$>TY~t5kL8S1%Cj28m z7iW#B#p*g+q%#Eqv1utiNPIq|&3oA?xbs+y%fg3bKGREBf12oM|6mC!Rnj>QLl2Es ztl|$Uk0;2}s}N_f$bIZ~bm}Yt5}y_B@QM)$GxxO^nzgr1c)k zY21fVxKF_r5O}R?dHj^^Q!!ORal;A03#ASJib(T7xgIt|P>bqD) zqaQ54B{A|~M9?JXWzhn~_>XzMpHoz564;#Ec+ z^(qUur^`6;idk{1j-IpX|2|$ zgn9R0?Ar1Vv$1uA1}9%D1eRIQTRRdty(5)iiWl}!71FAqMX5|^~EVBvePknmp( zMzV#z9jxdFv0R?~fe*%{XLaQ@+jq~GI@|Gc$e zd|9C~v<+LCWhnofedYXCICVp$lDV4E4)_|mA>B8$SOI`3%jX}}J8P+sJJlof{x!Z! z8zh^xZ>wZD-=S41BV9T0d=jSd?L>3W&Cb%G^1~pwVnUnjQ!+#aV>6s3$r*5+%JAAr ztbOLwT@t|UfAtjGoUif(_wZf7LvZJE9?N0jmhKqY;qhHgR@T|e$?drxLUsTZzB5}@ zwaxu(G}}&-YqrE@V9qyp>I(<(Qd}Bve70?UO@X7jS3Lw zA|?pl5@!iIl);UtLD>Ttxnfop7~s4*M6~95h+?RwdfrA6W1pawD$J+rG-+CF-T;lM zrbbo06zyAQyiWOIyFd@W@i#RLMV_c99f)IT9EIaENgH@GW@NLxJX;iFe;+-f+s$QK z)lFt=Kf)%DV(5=|Iq3ZOqDP+bq6+UGDeQF8U6@Ywg8j8H-RhvTp3~T!K}#PQ57~6w z@W=CQpY!g7ry8YszK4(3^VEBWln+&j(1q4ouv2hmqIE;cu!lu^z)`c)nfFEuTQHCNy!~#I586HpnF75p3S4u2!GueCEoU0(C?G=7ESRfTVNf{~NeOs++(IyA>vU z>gB=nvq96Ym%=!xrqfc+2q&8CL2o;r8hO?@F02Yt;%#qeH0v=fnjT?ZURn?L%hKD(4a-`wkbt2UDeP@&L6u-mgz=~Bdl^mtau9dRQHdwj^a;C?Z9~76Four41x30 zwJqNO?%$Hnn^sOgIv^2NN|s1bv+*WR5UE}5bY#QyY?X-*&ZOjzs6yBp18d(cc{`q^ z`YYs%nc%(yLHYMPj=?GKhcZ?0w?h^j*-4iDMQi0V{Q0D^5^03PVr6e4OuR_kj=d#Y z4n_uFSuW)SHA<}7sOqo11Jmad_uTE>zwr4UlG>lPl?#xUT_(wf^?o+sL3!gPwodWi z$d)v&I2!)RcK-Ps>lYnQ;>KMSVmddbh-xg#6R5Wdp|Lo$`scOA#eI%H!}3))u&N@g z$f?X1-k%*j#OlTrCgmLg@?dq*dPOEU1`-rct_8=a7>B6Ye611lkz$srGH9Ua)Ta-K zZEKglI#Riupj*b+P;C~iCHAwVZH}&e>nvd4x~(XRc|vwz%LokCd}t}TC6IW{S^0A? z(031RbL|&I!@Jh2m^``i#(loV;P(`ioM2j5cTF=o3I_wLD-eko7xPgM8oL&9t2*`1 zy*|8zrEIO9nF&0JA}p4&FbI?>NjgPrgyx{)dy<%C+n8nZYT|we)?5LidFCs@mjyp3 z8eTt2m20ny);5C1ujcJtlc3=U{k)Y4$ypI^t>r4F+K`^6Zrs3Eyz-t!EU0teJUS}z zYvp}llj<{89E;PmmVkqE9%S{II$P6m48=Zzv87FQ@$e4-9bL@?p`9!*LuQ- znR2mvPJc-om7QLVtntsufY%U`lwksuh|D$V#y-^dbL=~12*Jl@MGnNvGQwaSTU2WP zo&n^H^x(3!eNSW!(-P}(P=*Jv6l(M72%O)1=1A+X5G{;H4;!+N6Sws9zi|qcmBXcb ziO&J9D&{{Bnu52Za;M|Be>IYa8&Nfb3Ry?o32`|BhXkkNN9=^n{K?-Nrz+rD?@@8l zV1yFvil|TyK6_x%p?!;QWtGZGLX|M+Sdq6S*<+P?l)+B1{QmzmF$R8D7JS|2l?m*0Rh$mZKlW^QI{6 z-;yFxD07`Sv}HY9{%yzED-YGuX(0DWvi^rvbL`LyteY+7&j|mIDGY0OSU|SefpoO8 z8Z}fqE#de@Pu$$WNvx2;m~f>_pWm#d5Ettfc)Z`+bpmp$SwT^?wg&UJft5vstk>-x_@+c+;ISV}J{|E&v{BBmzqxRzmcRK{{1> zz9O0JB7bMOvsAKW7hYB7g%@*qh7=D3It2$O8at&7(J~HC1L*_{?BCXc`@#i1x!|Eu zH&ihkUgU}%+T$*djvmIbJ!dJ(>d4=~2!m~)-08*LVMWNap^+EIVSu7_U>x$hwqro@>{Ty6JQ_&S?wWLP0 zu{RI#FW=*Ad_D{}-Tly>dVdPA!Tb5CzN+HlWxz#|0@=b!lRCGHDdX_tv8DvOjXWy6 zz`ERoZf)db+#Fu|q2`(k%BgQ_r1pXxC5b_W^hAM~?pLKR-+Ct801Y0{RVbW;XL{tF zu{O$uNDYwf6*4OT%|6BGWl)oTnifk|ve4cVSto@i<9qRpgT5nfsygMfRIk$;P z@(SAi#hXIBkx2|8G7N!gD0`##}zuEfF#Q5cWQ_Lg`d&k$2{^o+@^3&6N49R%> znd3b`t0@wzz#Ft_46S3TpLq-%%#}4#f8QXG!#s#Ef(A<#b|{_3H#2V=1nB;=mqz@a z6jY6xang38+MtsFT6vAuTVd6D&&I+mnY601dY30!dHj;_J+7u6+9#xIUXF8*D+i)X zLtUiU|1IE5hvV!i3xOqgLkTW?JfxfCnpm-{upNXHBnXforZjSJR~ z{i=tyB$N4@!_FDEeUhSoKNBX+!kt9#%|0a?d(~kU|4&L;izZ7}e8%JYQNJiaOC$$q zZGK(q&TquG{%AhJ9gq=Mpp}WUa+W#Y3+BHD>0^Qt{h<11l$bd96XM0982UN-vA8Vr zrK`|+@{HK5E0QBcN#`LPeA@5mSaN^%3uG=J@?-gnOn2W^5O5(o-hLAFcrBjqOKrJA zUvu3N@6`Saf$-RElc(H$G5w@!4DKFI$d}&jqz8yoY^hy3rmAl~7T>io;R0y**Dsq; z0QgFc@-MbXRH!wzf0V~C@20*(uY4tZ>y>Heb*J^H^25$QFPHIG#;?6%i^y>FM9sVx z76q`VX9VuwdSVLEV!uv)9VVDfoE`lHP0z`g?jNhvRK-4VkDOVdR2H&J) zWlBrBW&z^8=4hL-C{=lY|RWv1DT7dO;)W~fk_MnJ%`J#MhiiE}}- zc$QV7NIN(q!rFf;B<#y7O#NBWcbuVU2F(SvN?4N%G|BO2Ym)DMJIfzN%bJYSuJopG z@?b6a-ptzlk6$YZA_6<(0&CtK0ed=tOAjWyrv+&hH^!PF6v`!IsTv0P5Myp@#=`Kj z>xN%Ru>CU(eyuza#`RjDv{pZ3??(TYRw4kVNyXTKLuXpO3EkigjPjU&+GKK`%mFfJ z3x~tifXOkpwZ;5&mWyL$Jwn4wPvGE_DQJvrOJhIc1+SPlT&SDeQou}9fVQ}HmXCuX z@h*}u2Hhjnuf#*x3OBE`h$(n*qUSUbxT;0(FL}-3s6Yr9P-Yd$ue`IlBvHS@u>0*) zkkX}*(QtKd&r`HTxXm=kCKhQ}fqdRDZl4=}CB!)CNUG`}f7B^Cj8#O}M5TuKZM#aY zX^U#~f&R_ueSZ%6Lg>_AfBjp(kiE>s#`QHKCFQn}>l(br3*9s-lv}m~({O30sb?L| zEHR~_83Tbho(f_5`X_<1A#p{+kN!iR#a$w^V1AQR#ql`EG$+<_t|Q{P3ydvi95=;U z(qs{h>}$fnZNZzpt$J1uEEc7Tt4H=BK{?$#(mBd9myR=J`VrdeXlm%p>DA#_m=YX` zKZSKC<>(C@dI~WG#<@t)GSt?cvQ3?4d?dH>oKWxVEsxQlGA^$!`F8?zhEyZ zMOGFmmQ!5jLQaa53Oi*w_cxJ{$Mz$2FvUROsqLj~9_rN#=__qp4Y#1wgM;S1%Ec0J z)~uZTB4ATKMw>pb)!;`t%am!%lnN%*_2|}lqE0GZ;T~=jN7wZNr$T-;D=+-3NMN)) z6FZ%F#%r-J7B?q;+ZTh)^KwfbJ^(FH7z_E}cy{Tbe3-;RZ{HUy!wtqMwtr1KXO2_W zY^#c9E5`QEbBidrIM3{1zdf2w-&p1|)TMKaHRR$-56jtTdJfC@ppu_Q*0n9roVSGP zT$PvLr;u+YL358i5zjy7bvn%oW|}4j=WBFcH?WdN!SpZKMx)%C+M_55&o#~G10BH_ zihf(|wZy)Yk!(+>J%}u>M|n{3V$mtp97Q%ct!sz13oP|XCi!ha($L5xSW|X;M)anQHIFGQ!t2MNp}w-SKQdH^j~`u*STZ`gzgi zDe_jN_Cpn`Z-MEX`0BN)Iep{S4H2P5tA z*2R~m51&5R43F7Z=GX{&#pXm!8wt+sf(J@1$EuJ0+#f`}T#0~PY!K%P^v)eCv-$}# z!blq#3^ioou`AbfbU?ja{4j!~Np)HOW$f*fk#1#*zLRP!Bew}68B7&(O_tJ7_7a%Q zUd`^Aus6&+A$@|^PZHD3gJk1x+yll&%-48x3 zsfQz)2;-XOSFg2d?5a+0@sf#SEc|sRvAdioMyyI(DyZu^c{$$yeh9ACqF#LjmDsO1 zJvT1AYjA4+bOPrxm+WB*CJ8CID_M1Z^JhZ%^5qkD4Y-(}?-sfLesb{I})d7x!qsBB?Kr$F<~QPxsqtQfLxv-NWn)(5tzm}=?zI85OA5$`Xz2)p=ETaefXHUg-C9==+VCYei$5o-YIl7l~S) z9pL#ROrrm0^985lh#yE5FjjeS<#^wQdI(1HEpSwJKD~2X;ya)ed#INua(T5AoT`Ta z0A~l_!YSAuLNeMJyXfkZy+_bhdP;N+!2La^{c%DIO{FQBQ$>sX@QSR|L<`V-S4OP! z{)y_C*o(<2zeKJlJU)%Dsf7fkF-J8!)Ai69rcGNk3ax0)@z1)e*btJgeD?$j+VO>m z5K{iWLpRb{{xP?ihNZabv&ivn?p3MRw!GA+(9-sLL{@$27Jt#kfcX^NZ@H&$4*Ov8 zAJ0NmZ_x+r8oU&G2iyxU&SkX*lRf$D8uBP%8CP?g0=Q({Q%r*({AeBCDJVjXb~vqJ zGg*RdY43md7q7{`3)T*2R?X4~_OBf?wdGklm;Aj~yfl|$%Ud`bXa9%s&F~(p0-?~z zlNy@&E8Dd27>%oVI+3;V`F7jj#Y4p5Wdi>PEJ$V&fin)xRTDk6#$;!JoZ;3_?Kw=Z z2%*mH7m^yDq2Ea5t~pyfehZZ|jTb#jsoD$^S$sUhbnqmXzKArtI0pj=HO_UGv#~PC z($=d|*@-6)}#ISc6kis4#F@2M6q%^q$j zg5&@ob{X35!rFbJD1C0X-+bMnX5!QUOK`1rC770s6guT!24>T!a{hK@h8w;q%y-(M zs1W*$EOO#zae(e5jz0g) zPDq9g&Ds1Nf8|v1l`+!pp7(JO^#iXHvC0IOm+BZhooCGkj)q$(jnFF1l$6{M-)wU4 zQwS4V>{))Y3^EE)XCO52R~GO-E8EWicNR0L;OfeswYJIQXE-B#Aw~*@DwSKU!f)6>5%Twvy1X9cy3xtJ*#xc-GBtl3Bgy;}P^v)q6Ld23i$-@XF9J-i z5<(ZD{m_S~~ zly2%wji0`4h`kmtv-mYGOBn0#=AHDPM5U|rNsg(hp_{kcz7)qs)A_O6hGo5G_IwE?j%o9l&_5eX7b&p=GFF zg6FYDr=GoG|5_)wN$gRvNL=cAtAJLi`I75LZ7WAkaz$uUM)Gjq`mehRhv_6yI;Uzc z=%~1kpJf165!5Br%gb|U#GojN6fCe|bD4vB!u9V=Jg)*0Qywa2rgC<_L&ERwxf@I$F9)FP9N`TTp=cO1kDD4E{mf>Ufr)OnoxZg>2 zSBJBEjFKt__>`z`IvhJrH8fQy(LS0w1qdj^bS_&L9CfZ>Cl7~~G8tS+z4>znAkCob zo#4PTj4^+6jjc_OQqbh#n$uy7;Jf#Us({7yPs-iM;Wm@f(+g5hICEdb=i9)R=(Uo;9ya^2LpWP$pdor!cxoQ8tQ6d4Ve#MOFmS~{4 zeEF%Qy#G$r>It$#-(QtR@o(b;(=@=@)c(sW`yER6jDRARZ>yJfg$v(qo7CM){MXkE zpgXBwF>#HFS?K7>aknA-TF7@5vTIBy32V94Z7ETnn_qOB&+%iPi2JtyPH(C;9I@W_ zJ~_9pO0ZC987*!wP2QE=eUh44_v+^iLW)Iot44WFJjo$m=uxf5&!wFaa7PST3-DyQ z(Y(a|UzdQlOIg~zuMDEFD%53d5O#IF zd-wqCQQ^!BNFb9VRp1%mEg_~bF#1UtW2LY)xiz;HRZ4$L#?PCiyPXlo1bufMM>9 z>4M<-U#6tH{v`sEDWP-Ax?b9XBzOcn7dVyUmXOmnBu6fGn-`(Ns8AAeo(54 zKKQee4CxW6a;4j5e3XVK>SAUf~wp`KW8Lk4`aNs(p=Zj@iG z#~Lv+Uh$3XE?1u{Q&9|-dgCZ1k> z7tA7y@s0ArV$%qUHPs&)B{I&jNuTLFZ&0+RJkfiuglJqi;}~)Zp!@Gt|JTMXVajt1 zPrrmfMdv3=M56eXF{q^BkU8dxY*vxdKMV52BC+kR?F8+@ZoZ(x8Mm`yeJaV(y)78J zd03=?1hT!B{z^umQLb&6UZI4hF;dlh(M_+;PsR2$j?G%fQLFP*8 zXr)F4+Wk_W(MAW+SpV(pBVeA205lQ>{uZAeb2e80qQ~+E*O@}A>j#+EgL{G9Dl3!P z=g^JN$>sI5wMC!mBQP@S_@YwK)avou+*3C>faMrA$5u>;!t{V+Y#*`ev%R24xk1=h zk~`|_b}aM`SdK@&>l%wmFE95*Azu&@7kg_Jx+PJh&QsBV4pd35Dy25QKx)@uf%8|h zpd_P5MX{9KC$h#zPuqN6imnRhMyZF6;|@z4*TvC@(r38u1}PB$=hn+82PIIV((o&) z@t8@5HsZN1?t8SkbjWUdW`bR3q1KZg&yhbAqnGbJ2))5D2kHXMgG6YtYpTq^}1_U)|F%ae`srTQQcDz;{paOyhgD1467 zHIkn6R6XmX@8V7x_JJwra2xh=$yw3fsM1e!d-pL`4*vjZy5GkA`xQR>k;E4?=HLkK zXG+iM4HW8`dNgJkm#WvMbZUuMU`{c@?k+2{>th+ZJRM0cW4_#_d5!E2^XR|9-S_6ELNkpEUf*p$T1uI zLffp)(s&8g>m|=+RXMe5ncC~@%6=JjAK57jX+*;^6hpmGqxlS9F*0!tRC4g4;ng|A znp#tKp8ez<$}08es*a7y3IX?Bx^#Df5rv8E?I=81#->Dya1}s#A{86h+SaWuo&*MpUNk`&=>A#fX0mw7=(Y7%_(0s3zbIpvd(f6Ie$9K1s1Aj zyr1p6qsJoLJc&pz$KkK^vp%LjjBD$4YWiL~Q%>3ORoRNh_*vu}lN&W8y;)-cgCzH+ z?rWy=?uzZI<^sde&n@%@a1H!v@RnaVq*I^(q2{(PWa0*CY57}&!dN-?UCHgqTmn=a z4XIzXEJeuxi+qm%VrB(YQc<~g-(dL3gR#Qu5bN;-3NL7I`LHmp)=4tn%jC!@60WSc z#)r}vGahKatlycHUtvnp#!-CBix=*h>)ISZ0e-mFdvjZqSa9&Wruh@$K8FxHG#<_} z^<*yutlZ1|OLf5fTgzoOSZ45(H*a0g!XIV;fP-NP!^nen_<8V#WZ^Nx?eg?S5E8Vld^q(-H556+jdz}c3J z{e03oH*cxh69qFEZrwlDK)-#182o*4V!e8S64yQG8eN7FteFpN56?lcp%~xoN{Ya# zC93wvp!P_S&hf%v9$1YJ)nnn0dFlFCP!$!_wGq)Yq!0f9Z?;k@vII$oVBu76hT2d! zP*sVtsqb))G_E3i3}VS_Xy`(04e&nsl5+(xVnChd_R~WiPzkM1+b9mmpcTZty%wc9Y zB?~GM!_azcEG-H#Jw#PR#v0RnMC%kbyF{p2z)f2X+)|)gIa0iqU}?yq^o>VEO$@4O z&wLENStyq4*QOr;v^|;j#(X1WJ_nxp(VNL6FM(69s{?XQ(+-I(4z|kI7B@@@S91%2 zOug1I(&G7j^Efa)wTx0Im6OLETJk08W4~RQK8G?(vfrB)KM0PA#?qnHs3-i2tBN0C zXrPe@AcqB=+mohDZG1*0hrvNl9`;lQ{m#Ej;WP|_u+5x&e*$L3Q^$SE7CyK{pV~6C*+#z0h z#rDiS84QT1!=QtkQ0w`m?bNjvN$$dZqptPImDA=IzCLBRNq75Yvqx|#P6n_PuC82P zHe`2Yh+x1`Gc;dv-?Bon{zhmg1ffIXh0lxW85{Fu3MPFzmmM?Qd8i(9#7y&nsCIYm zB4#-w(DI$UwN#g!QNJ>{s{YP%r>vv<H^eh6%8%&m)7}dw4A~9at}Z+Fu;dQLTz#!%iIJT?~%jt5mx+`-J#iwlQaFJg%Mu zZFFup;optvQuvxBa|SnNim>G}G$9gHMtrn?L~liri+UoWd)uoYmxGEO1d1}i$15WT zg=-b7YcRf6bG#^7f)NpDMKFZ24Pz~6IWWx$CdHe3geN3Gk!g2QY3hIVHH?C1KUgND z78;#rUnG36CCV`!3G1*mVoSV}=W(2Gd7t^(Q@rn5A{E!{_5hjB=k^vcdh0K@;q8*W z90I{f8rwl7!QUrG*|}U6mDOmJyi|rPHb11{QK1~hFffURgZsHHw-Pg|gmzE4-fA#O zFvi+{l7|$I5B)Kbr46t#g^3yfxvV?5hdVm@?tZlH;}OOT%YMEyW;W^NRbVsdYvY-82&)*>&htzn=JqbjKr*ua# zd-BIe%V1>;uz#gf;PBnX*zMTd+9T4!of2+g7bzNOhDN82n%sTF2-+q@=uf2ipNHE< zUWzK`F9VlMi@N1Qj4k9VHTuACfDnaOiw>(crOccECmEjz^Lz)=GcT;J{N3beM2h`o zFGKxnp@z-dY8{yxV;50fhBz9Q=|4(CRgLxo{*|T4RCj|4=zc$VkgU`=Ygl@VCcBqj zU1TIeoX@5w)QWCKmYq5>mcrd{%yNX8Ad%>nvfG!(R?8FyuIazB4dDt|DdOK{Vg1U; z8Ip;Xuqs>qYXdz8K!n+D*VoYdp&^}ed+<9G`#x&t9a>x+&|g~#0MaI{Q;9HNn2g9g zbKDMrE%fhS^hfpUAg%&BL=63>&Y5w0Lz?{l0*{HYD6lLGQ58+|RR*9cVM z<>EI~=3n@T2+nVs?#$%QXp>}AY4soBLo6m53nxV?L@1g*1=vl(t_Vz=uA$Lu-(3Ig z+h7;6W z0G=>Tw_yPR0rx^#k~6;77fYrM9ytYn2!3Cd73e$n0!XXKhu@~!(s<1H%H!RMPt3>% z!JyUH@}IW+AjZMOod*bfR9&_23qbfQ0h*%p=%Q}3&e=OpF&1NE0)xr*Sa(;#H5%&Q zg((FC<`dCn)y~?2QEY@kfsLBqpF#$1SB9GM{{wRq_z)LRcpb2GO-Pu6Z{w+ zD8*47JO~n797(kNzH7;)bbWBF5DUz_mf^pFXkO3nn;jTynJwzF#21`;m4mV?=0x4D z@n$>wuu@X%!6s6#kQA?%oseP152R~zHt_dt5}u+M@)=rGovh9DDO>kLRVEYYHLqsG zVWP*iJ||HLH%%$`n;8^&VBnS1_Za=yiV<&yj%`$oS%_;Y|xf3(0LH(vsw`oLA9}mLt z7;y)N{&vYS49b)$_vXU-phfXbd8l&U(ROu&JC6P)wXSA|rDj8+u0gAQ-*bi7Uey1C zkm35nkc*SsUz=at4c>Aan9QM zR!$*|Z%)G9F|E*maIv?=StFuMJ+eUj5pNstv~SJtubk;=u$FSRfA$f0w8MAV6X_vL zus3MFK6ErHFz2~8n?}wW#~}^%Z@kd(`w$v_i}U_`Z6UBZ7azcRnp2d{yR@Sv-pT`*^jyb^SW2GzJk5JklJ*}ysKBpCh=hwfOx3k}M~ z`fcYrySSP3{_#%s@Gtw#DI-a&qgX?O3@*NZcopOgfnY3oa?e3kWxEfm&2iZW+PXVY z`DRlZ#I@1aN{i83Cd;G#DvZ6OUCa3IZEQpHxY$>(;kKJ7q)NQ6tv${W)A><2sC+iZ zjoMouxvIUABO(M-NKXIj@k2`B|3Nj-|F6Gg-Y{a80G@`cI5}O1rP^U!RuW4amv`UW zfb|^XbN*o!7c*|TV%}9_sM<;W<7X_zR0T!OZ=6Go8nM-~V<*ZMw)mf*ulsv)AHFTD z=HDjEuIwM~TRYxG1ayzZbtJP1h6o7@J44#upW(RshbI~xL8~t|oIE?wI($K4s}5ag ztRC7<9Cvo#U#^qVnonKVhTRDxp?5wMWE_{=_^N%=vW_=t=H%Ii*R*aMU$!SkY5v9w zxS6&dE?c<5hJGD7z9pWRJ@~!je(FDk z3jh3=`|v-D#{M}G`v0BypCdFEy5@q1`S#9Q(vdcgt67L!@qbh)XZ1`chy2@Q`>}?( zlzC{oG-{G$a|aC;I%WPn)DF6@{%Jow*@L@jj`P3UPaFRKwx9lg(TQOeZJ0|8r~l39 z{>Nnh&*86VnAbkp(*xt_P{*@8*UyE(7Vf* zyZSm36PxEvy2t4cx~ICjlzK!)*4GVvJ(Ey!LYh;xO*Z<1^xi`+^Ks#SRHa(Ehh7O1 zegFBIRgLom0hF}!Sy$D`f`!hz{rY50OfD#CD@tpz(c|KpFZwXsa3N-^KBKnfmqGUuwZ3%ghIb@o!-?jEoBDsOMj`w9F=szsdFx2)dk-NLbVr^4VtrZ->;4o*OPd!O_duL=DJ)=y}n>}sTVUlA-Uii{{KTcl!)839+G8DHJ&4%sN(yI66|0u3O zEufXdtw8j?Q*J4;L+f#q%i7T~-ZH>P&HHURPUZ6JjQ^gWhR^MBsPvRbReM*Z-$e>} z&kEk<@S^&O*MP~!DJG!{cJ=Oy6pNZAh@KdSUWT%J0t-?rIJAeo`w=|Y_#=d&;_LMs z#}AX;v~O#(AiT$OTXiLGB+jlF*=HD@h@}Mdu+2+C3K6&s_$3qx5hNRS@ufxuiSIr)4`>%-k2qmG+q zzAI71w+Wol37G$DwNQCPUuTj-*bpz4Nxly=AOFqUYzwF%y1@GLr-YBkyvJQ^?)AKv z66Wcvo$3^i@uP;%4>2?~)}y={eU>ghK8nh9c4hbdQwE%pLa1{7zg(&DF%-*J;mk@W z&8sOi$I2E}vU7l!sMT9J-={s7z2w}{Ni3s(iCUEHC{fscqHR=ng@I*Q*bNtJ+1DAE{eg+N6l zddSGL`JW7fASFA`ZvBW}5#GieMrzqt0x3x$8X$i=cYe=v(nqh7)Qp***!+Tmy#oUu zj5b8&MEr5J?E?C3pZ>EhpB)Z;sY5mlF>SSDRb?+N~%1^%2{YAu| z6rkq~N2w^Qd!hf7?e#?(;mUG+Lrw6a748d1rU(hU0s0h zr2yLbep|Op&%AW+lnag`-mY_ML>@5X$X`DFkgG$<%EIat|j8fyq7Kq6`nzzRVmJKbl{%6 zIwL~-^AAJ%fu&rs7hebOR^*y!C^_N$NVB$_?L>LIUae308TPLy{7;`C9zRf_6{_(j zsOPY|-ygU(Ufgn8$KOW6#}Y8T2z~l4pQJMRimcm#Qtj`@9~ zfQ%l6K6Znq8n#?;u+}%vxr_!?VtLAYtSeKK9_Qpge-_2=lIuS2XGDmE)OB<5Qs`~wm!SOd0;kXPo?Q`@$xKY|!=)-c|gEUrt6bpss zQydSv2pEoHJW5x@(Q?L#Z;IHW8|KqLzMa2qMWfajz>A?eXr9GK91ae>GZrew&G{1FHk*XdMB`8 z!@Ts5g}MP~LkxgXU*?JJE6-!o+v`11K7Z3hH7lGLSd$*B`KSf?Mc?H-aOVE2@9&gs zJE5!dO+?C3UqroQbp72zG9`V5qOYTRSSEO`zHT}8iJiG4caLDTyZ;}Kfz8Y_4U*aS zFESi)sGP@JS`@#abH|4Ly=5rN)aja;a}j06?ekMONkWFN!UOZu_0vGV{HX75EnhRP z8D!*yF3$p>ICMRUf}$Lh=X(W&WAut8br(@R?WqIK56vr5c+f>86;o7pO{1c_Jsh?H z?l+0lKY2|LDxh%Nzllv<6YOB!E2GM3Of=(PQv-PCS6^$d zdxro2W>imX;cYYfZ!9w_%HawJ`SgoW_YNAG_A86oQtc`}ppmq#52!(f{qBCIxEloN z>WKwbI#@NlMnpJZLp$u{6Pu%nK5tgJ+k0T369s<`0c&kE<KJ6nJ`O3g!z06zRvMC8F#f7C(Cr6~m5G}%*(fJ= z4MZin#$uVXzrr9gmIOP|{J3zcf1XI;Tg7i|D>NGqe&6NHB2}QH<@$J-;}kE*fB|bd zHUg%Tx3t+!-WOpF$Dd6`S|k@$?Bxg%8Y$uM!5?RRR&}br@)6Pes>w(Ax9`Ji;wuLPH=W@>)Q7B38}(k$HM(fcFC+J2ljPK;W(eV;pY4m4bmnIG}_z!oX9RRz7$hv^2GcGbG1@~ z53{eDD6Q>~RY>qwlwpv*u_qyE3cC)% zu%yHqXa77Jl*RZUEBDhckWhl%QUV8q+fZ&G9Bq&bjj85~N2Oz|2JZP;70w+QZ9)@| zgJf8l5=ukv&4o;~cZ4Otfk?}Kt&H1l_b)x_Y>tB9IL^yhXZhZY=1-tngXzW^)wDRV$ltyd76?G9rZ0A0G%+>w1P!npLS5EQjHk zzvt=xE%L`h^3}Ta@4y}hR@C0_4fRkY}h^z zrm7ijv&B-EBU9Cvd$+bha$G%fI|I=SAvEyP(hYy9#o5nEwvm$ww%l5P&>?a&d@#9T zlQ3aW8FFrr#iX{iE(A6UR=J(te>7aHI>uyYg%3%_UVne8GAW5>fF&SO=xm1vMLm4H z;AIv?c#MOQ9|F^RFeIPSMds+9_A)Fg!kh#Pu* zQO&7M6zur3G{gwFXHQb*$80j+ps0rfE9!-=>B+T_^;Gr%6fiP>xSleNoO!T+Nl417 zusS{r584nyD=;#RC%+{-G)f{=Y}Qvk;zlnIAYkg8#0L9Px{XIKE~reGcyc`anxYyz zBMlRd&?#%Uze@B{T_E~r9JjzGE;<;w{7CYk=*5$*$O*Y5zuPlIB-HG%CeJqlUGKuz zr_SC&+Wa}dOTT9h#pm>+w)Qu(I}lLfsWB0X2lY($S z2zoeexWl5Yi!^lA>|yA>WY)VHW>@?5laN`4u_Re}>0Eetn-XX&2of?AM7D(WN!|*i zSXBlc2Cmyru#~aLa<{tPUTA>)Pt2R_B)NrLW-xceuzinFwm zG@wojO5g_{rVYh_J(^TON9?)EO*x(Kk4oiwUi7TP<+xUQB@yJJ3Zph6e`VGdGJ7U+ z@^25dPnqevc%Z~}jfhItQ{wH9;EJA3GtV#O5M;{GbuaZAt=z4rFu`V}zWZgpm3X)Q z!*Wi+H0jySGKDLlg4;88m+vI4vRBNDc zRH)xRjQ*|xC@SaCF{lsqB6`@D!BpQX+N6*T;UaoP>8<~)5{I?L{bC5#i4(*fms;O_ zDUQvx$fh;8Jr~R$B$Xa~;_J5R`^eA)r^JnU3w|M63HO#y{@fy0cG5mG2an~F7gBG4 zddJ!&3q}62z%`&v2E4nBWTc*vbiWG7L%BFo9vjBbfL8+yn5l~{!Ov#Um$3<`mcHq`_4qnT7G+yg~fOwln8!M6K@ssq``&(HTog`Ls|zNk6V}%fH`+>uvy1 zo_C91{1S-)rN?f`+rgbvFU?CZyIT+~SvBN4HKr^0(!vmam3GCM>^#VGmJ;$F_NJu*vFQiY=xgvue%)5hGSoB$RC1f zc=$X5WV(iI!`{PRt=XUUf<=h)>j+eWYYd9}2v%;Sx>(yzAwuAT0=Wyc0gi1C+OlG5U?%}(b9^Mgr?oa=zYvds^bdbj0Mw_CL#&pxC^!c8`zB?U$E8}2GfcCY$6 z6)cM3^oYHzZcqOW;VW%XgrE9nF}B+Rw51ACnrdzcT~orW%-e`p3vsTw2yEOcP@$yROEh z0th#qehmV+A@`e~by9Vrwcx4(2S8AY@FMpI^)O*vn%s_SV~5razn5*@vU&9PFq`Qme}Q?a44q3!-LkodHrG+A4VCZIt#c zJVjfcXQruJ^ETa+GlVe=1mz4kgjr&`_Oqnf-693CzI0U7%%A_VU{OBpY0-~2CMLgx z&$otlJsJKpTcixX+*5hP#H`eC!Pn**eux}L@5@G#$Fn=EgQ71| z3+!|+ixBi$0X||9%xqmKZ0krygSNgD!-A55bbTn^DP=+3;f;xRdYhYiRMNKs*=Epc z@9NGH9vq;S7(QvkszqBDmu)#Ho)uVjImv6*Qf3wO& z;<_q$!G;462BX1`>V+N1VS6&7?JAUUYg&Uw<&KLSpLQeTnZ%Y146VEfa3k^;1*Im5 zy-nz5j;rL$3y$(8Hm_Wsq8;eRxhI{dB?G&Y_!g>hLaigA2!cTLi>``pD#sO5rX>qAb{%p8NrVp}t=zj*xW;NM6 zp6wXe%hUrla&v_qg3pYD&O+zsniaFn`**L9jRkn#66n)VAE@Y?OXpnw9D5)hO5%H~ zUCFL5{Wh*SJwF!>MUIl_n8P^e;ll~)p_?oDb>M}k{jB$au3;tmBh9eE5;6vn6PlHjA1xHQ>&Ev?A!Ow#3-nfYEQfvD?iulC}%mlB)U) zbHi-8)PukJx6Nget^t#$U8~${(bQ(Ssf4sM}LxyxpZaCx@+<%g$`W5wr7nwg!Qo zJIuQ~(bs*#tk|7Wti|78(K)nmBfiGKJXw42?nZeyTF?8E2COC zxnrk9pavE+m{$1Pvy0;-bf`b_P^HVc8n)qNblf3{jk9-!WRE5upK=?1IAyxxOuM;h zb*z`5I^|1>y6N8T#MF#r_j4ynL@K2}Vp*AR#snz~jqIZifXS7wsotLEpfu+HG+v#+ zRs%ivf}~(0!$RUc%kc|IZ_yc+MLK^J%@ep zbDwA!Jw4-JaYjaQ6w%%=470?4*QN?4!kSjTdkLzmw>tbB+?>DLb;UuN$zM-7oof&= zaTA9~uwtCLcF*?%rE**KOwhst*(EBJimx0)L%zEvw~6q$WmNpAT4Md#P{Y$khDJhK z@qX4fn)2;XsSbOQWN#bYu`4J%-_wbDwyW`=l*cNTo>4I_V@%(DCZ&SBp0Z{;O)B6t zeZUfD)OjsaOTt6@1=kN4TlRLo(ZSqaoyuyrVYY-c7FiDIx4l}UG%utn#6`j^v{idp zA+vj?LO{QXQR+pjP-HhVI^X$PV>3aIzL72)y)Yn=ca`WY?2nLKzQ^T}Mxnh-!hDAW zilTvGC2i?`vczyI3z?lz*R8HR*3Yliyvs#5A+=4vUNO{pC#@4>Els*ehg`T2Orn6h zyhGuQ$v0Zu1OZGbN<17o2 zW~ARqjC+WE->3IK3g5|E(UccAoty%6qsr4VC^J~2bpNneBaF{+-%)`Lae@OT+A!=W z1R>6^YgX(^uM<$7i1J!ty2y?bgb558Ehqjzm$`PMki5Tp|m z?_%Dh&1!v_BD06)Qa+ZMIBPNccu=ZSVnYFIHY`;o&3$h4d6F7=gF^Vv5zhTY%~2XX z!qeu3(D@p9iIJ~=SM7c6*%$WN<}ho!hCJzl@0{41RqTN$?AG^K-d+aKEUfz)-t`W9 zsL%H+O}DFM2fxZMSYH>^Y`;#ssfA-e0#Fklg+sJ5NU+!J!80<4Ce}fSft5PBOmUQ3 zE6QyjZa*06Y5dVTt;6de?1rHaph1oJIiT%W7+LH7GfC0pBRhT!MaJKC%4H?n;Slc~;c zpH?=as&m30J2qnAxHt{rVg!sn*n%IjjN=Nw4oS2QBz?z7YApltEas{CXc3YTDQIqg zAl_hho|j0taX}Dz-~@peGuUn{q+zf&DX3`MZ$QCPrH;7KmJCXYtJb&zUF~IU9rIP- zwHD{u)u}o#2>c3d_<(S_{6^Zs4Kdog;jI`Z#7;S7#W6I{#}kQ8|C*0VefWLsE-bm) zmm%ZBisCWo4i8OU744w*5{k%Nf-+7o2AISS%qn-WXr zd)t623&hs--xHTqC@4>ThYt1ru=Th$_Hyq7X$I9*T()@hU_@@FGwDcC%wMXpB;x45 zEDglY)f1y|)y}ZYayrEmi)8F;60oo)VUJXouz!|1gE&-eku$p%7r2ZM#9l&#marPf zS`uxw{km(7153Vx=&V$^chZXKx8QNJ@AutvI?3Wr4J58$hl=>S9OG)(ms@yEd)~v; zmgbrR4filba}BWNrlDOd@JRqVO|(Eon2KL=ZTrx!o?U$|n0_$aS_B(2fL6iGfMNcU z82l(vS*!UUmWC{7xF%ca#-em&eMBTbAKjU-_TYT6{(V77i?2+bWj9aJbLhH$+!&Ch z&UU^5hpkUFsh+CT#4Y}zKG79S_OmK{?R1gwQb=MKQ~KWKTDrZMZ8`DMz*lcChnvR(R;|&Rl+% z9297!O`iYjr#_6c3%hgg#z_H;ZScEkekFR&Yt#J#D}klbu2dSi(%6NBdzZ;3_UYba z0)RR>b@fV_II6SW@rT+}S-6JsRCpIMZIsWI8W@JF%)xh9SwhHF1e&b4igt(*49KWZ zK(PsPj%n@moAw-2jE=LDJ?6PzKdyyAhZQB293gvwyRK7=F5!iEVC_O!_O(qyW_0w$)x-G0mZiiE}Z>RE!k zihUb(NwdiyqdcU$+YZG8ij$402XrfOEi*7^bA*GrwIaHs)#+xxQ*2P6%5AyKPMV{z zXQufU$B&_R)6p}mmgH~7GxfX;v(i>xIxnf=8s-g4D2)#XtND2XtU@FvVJ-bUF&dkP zX;jiKm9<$v{cZjZP;{9aIkI<6XLKQTXsw~&34)$du36m*_;y2l{2!V)itfrzF!TtpKdkF@kPxM6Mpj1o9W$S!xK0gTbUgP zsm7|Ag^x=OY3z;We5`yILlo0`@`vJm^n&oex0`~JR zNqX}_Fx|Is$s_q3f^sbso@Ri@z)=jr1?uNXpqK?@)Jr2#`d=bzhThbzu_B`#7hFcDjG_?8*(0N^ z!)cE6s5}@+(*oQ4;XCcp$(nm;63XPp=_VB|hBM=!c&a!7B z2xlaK3WqysFO4xB`^u&r_0*wqEESO(C8& zo@`E=3s~8Mub!s4174p4D?PfwhhM_4mE7%c`7sBzwZG42CBGBWp*`c_%>Jk;A|+fu zfi24iglZ`6QvLNCU^D*Kb=3&zuP9j}rW6N%p0-c1GeaJVPe z(0WWc1tsqKFb{On7>WUUhf{Vy#OHTu2tYg^#+1?hG68+ogP)b=g_Jd=$ohmY3z_Mi-D(}2-H7z_LQ1|<1CR``4tpPr6}?%PI0olao}*Yxr-4#GK>}@X9cXE_DRKon&=>BtK!Jc|lkN z#!z+k-F;$6Y{yMKjzEH(Q~ zu(+r72^fj3?ldLwk6=9=QKDXIQ3=V4hT|7<5yW%~zBA9G&&I>AbDENanYRZG_=o-w zkp~b!Ku-Uu>Rs+kLfF=>GB}${qCpHi=EvfBkxAgldv>|qAoZf+N?56<03cnFO6%G? zPf$fS*j1Rp=0l8+tFnm!_~y0M66QR)3l>&4!}2GQU2GPT$?5XvU*}@()}J%H67xpX zf=vi)U>SCZshPC~XJcl-RUauWI@5$~U-aSHFO3FkY^N;QZXisu@uF_*x`2-8tMsdU<|6-M7VQGFrU|p%AwZ3e1lUeU%a` zdvRo(7>Uj7k)|BE3m+IO$wlZc2vWtZtGrX!>JD;wD*2in%hOTUhV<4$Yy3zae!{7^ zvj`V8RwxhVyiRX8889GL@Wl~TvBcvGr9`U$8S%DOp{hj>-nN(W#^B(uZPT7VG`-~t z(&rAMG9@`xtvMm>qQne3C?_D$Curp}--k5Z3Yxne;69Y3M;Y8H^dKaHvEC6!CqOxP zyk%E0`&&pXy^Rbc1gX57*P?xa;lh&HfZ-_UL} z85e4YO4@+U2tcKic%|QQrj6;0^n}-G_aI_FR^^h`{Y?PW>NKId1m>3n{|z`r5LMuA z#Xl1zO#c4-{X1uBe2C*o>A3u&@x8Ti$LuH)7uWpl>XV~7&1?36{V%Mtc=YVXm5jRE z@8nm6OTObjA>A^ANIXw-Ud6A#R1%Qse<%;>4YVp#lzDjW*Io2=OTU|~-*c53$kZ@K zFVG%MyukoY{`XjB@&MEVXtW1yxbrSxZ(h%Sq4$BG)qubQE>ZwL(-TD44;xi(@Ibi$ zjQmOVSycW0I)apTk6|YqxxPJHMEX6|3@^ju47gqXOhD$dF=o`(dPUR&s7WaANTIi*|f6)hk%dazsrpD z+ZybpPBV?o3n`(k`Mv%QZ7qi!s5o}-0^MDq<0Nq*U|%(`OOgI*vE$D{cSvxA&-95- z(tTEJURW1&_>Nqa-Mn5~0x+K`{NMds?w1`gt(u;kj?kExZml>u9oD&x{a}BmOM4!$ zeZsNYUo>}Kgp+i0qmGjbnLr)F17Kb|82bGK^nJ5Y>P0TI;&iS~#Ov&b!m)9=rdF-M z8lm_bj(`3$^*Gv;0V<|{AIpZ}xp-46j(pJ+GVK}d&KtpJ?;7_Ssm*x!m;E=(5UEah zF!@MK7`w5`P|-1)I)+P7slB!QOXe45XFF(NE{p^I{EGG=KcNH#0lnTNM!+HE-|^_M z0w{sD>Jj~2@ULq=(qZeoF^$h%f81U|&t&!kED}ZMViV(W{RUzRpF74$vD=ry>7XTc z0{b1&KSxUt#ZNu3RXr}h4^Ks1t_Ta%{muUXMmKWtChtxi|BK1gaRBNtm-Rzu=>Lf> zl6z)H;8NwMa8OW}Dl6WNN9k0IO@YtfA;*eT7!8e$SJ%7W4>+g(TglPk$Hyl~Kn62mtTvj1Mah~3IanqsmjUJ2EDj;n0 z@q9%3(1aGw(o~dw-hwCOwzW|ddNNIvGBjC+(bUF8&T^+a#5$_C@Uj9M-^}-oF_M&h zlgW->JAsX$(~2)7J6ibjEne5~ozaFFI~zDnptrK2tpoD=vhAuYM(BXz@E)_BG#pMD*<+P2$T6|eePKP#YM{hx=&MM(d7@@+_e~BS@Kg>Ukbv_4;F^63izYq{y4wf#)5(hQ@uFZv_5e zTU8#kOZ>c5&fSX36bYA?%iikmtoy0Yue?RfB_(o&hr-0EDh2u+aZ2QTrVg}|lk&CZ zCOjfiKIew+Ut#;$P$sr_Sjqt{gXS~|QM-yHAew0Y5e)f*2a9Ft>O6FXURXD68@7u_ zEFI8z{0YU)Gn%cT8=?_ZC$Jw71#bxWVs0qv0L58<#P{Y*_>(p=w=H94p0`?uS7x<{qu!)B4^llUs&|Gf;;H$SQv$jqP4lYNZ-bdw@N-W$h zP&zoIgyrbMB4#jhgkb!UWRg!zC*O?-6?hsejI$8>D!Vga z`Wfoz=!n_nba}u%+MV>I^EO?^0=N^V<2CsD!C9HX`4tDOPxXw4dR+yIRnLeKoR3B$KSX0^Sr3@a9nK6(st#eGl<7$Y^U z7k)DdyC!J2d~Rdmtx$vT+M)P|vyohUytDW-c$InI?c zZ7JmvK2Zp}f|&s!CuHZXRIlAEV2c;-TuWri;gY<>@##ZOjgkTWahkFoKwS)NQR_%M z+Yk%))8zb0d)>s7=r0}f6-g7KV|XX%fvWE2SfJTj`MQJs=U8?qEG+!xv|fMCPez6w z&WF!z^J{@nXTKtA;0C|PniHlUPP^ol{4f(BK5vnS_~biHl&z>rXWk0ohRMe1;)!L; z%ZAD3IP9Puu&U7wK}G*PDQWK#*PjSd_HmehlL|X9un+a0-!TPl2PQSwnv)g$2wv_F z+yF58LXf^C>lX3a&myJL1q|xyrmx~}ZdEDRG6s8Nkw|$?=WPF$ZRUjf(3x?dHsQXB zEUj!h?BMn@!@CIA57?$iOl~g+!+`Ebb*y35h??pCV_Lk>^@F}Q8>nN8J zKkkE%BE6w>2Et*30{i~C`RwLiU8#I{h#1dfi{tyw zVw3G)j|*l`$&7og_jch%SqN@Ww+FGSi(bq!$@47W1;}sGB~ZL?nfr*0ZP(v$mq#j+ z{ALLF=YulK$;Ru6rB#W!5!v{N_pfz#8Ho3Lrl*QJ!|{+7Pvxyqd;O@4ln@~5(_Dc{ zcqlG=`U};1T6b)LW<2*JfYFYa%;X|-)>ZY=FGP2Ja1zwRs$weh5w!EzGjVo4+r}P z!vle{>tyTID*SX1_0-vAVCXya7nOAv7C(2u6I}0~lpK&snRa)By-BRfz3pyio_=+_ zi~Tl{lTncwkj;Gh$Hycvf5TO(t2l2*e?KM1#W)4&kP%aNXM6O|3Xs;T_xvN+P#l|S zKQnU3KwXY+h}#0fNNQo(`bRuK`7i?z!E#m_sxs@M#;})mQ?LKawsIu@H|r2XDbB!F z3EKRB?BZTy*pVEdArSMDpswABtX?lJSI5M~#>W$1%`tnN3BP4fQ86$0&+UKZfcbas zt?D-#3?T@~?6lMg2>FV&xb4|mZ+a#?CsXQLTbJeh_u8))s1cZ1Wo6Y{XGFo_MoQMUecR%sn=cp)^``Mjzz*a%a_2l3nKu6#l>+rCVI{kkraKM=s&>%gIGB8xm zZrVHp4-e_K>_5MJ?vlJ?J3Op+{pVlidolx1{|RHW_f`$U?pcvicF#|pANq#*ay;Um z?w<75$+kS*&)tY2)S#jJ1nyCcL1yf(fSg3Pi&=8|6lykrmd{R5ZYOBY&3W8Sn+yHa z;N`9Yf=^XcQ5!kv-ai8#WG$Sx2lTqOc5sEZx{wM$1)#flH{{MKE0KZNe&pr(A?-Uk zV=#E*G05~`^i|(s0DOt}!yMS@rvzP6fi(MfG9GX<`8}$BNCLOCBb({U{QrgPzcx8U zLpmLo;LDl_ySeGZ7EIU0EqESv43ApH%-3F-58FI$ z{M&qO`SvqVhaZ0yNNgM2?|!b|`%W7hn_r0hg>7{e@X>f6X;fVuMDZgbslEXK%spet zM1`}@y*f-HqiR3MWppGg8x|5IUy< ze&$vteFB!B94SC<7|#iQhyF2DVddfO&R}X6cHckn!7Es!nw=NljgzKq3Ld+8%{%Ws zUZdIT%4tNdYdvP-Trf}PMk5UM;>Cdo7uh^f57>H@JX>OMyq(miQ>%dP&tqH*j0S7>nOuq&Vbxi0s%G383}{q2V|7qb3i= zQmLT*jVYY^Et-sK@;!@R-27BKg)FzXK53^OfFA`+I#du@sE zIsyWln}!>HH;Wa_!~eUE%6J#u0%o7PJU}#V<(M^(adqXqyNxJiU|8so;dPs)Y zNg;Sm%!0e&zfK0#iqWrdVe=|cz17t73c<|#x0Q%p8zngvb57z?pja=o@=s0-6r#7C z^NPFVc?}ozp-EZv(RcS!5*-sNnEK~@D>gGhC!v_KF}1kXqj&i138ODpe0|o{R#)1K z8b1AAn7=MNWSH*wB6X7j?j0fHCYdZD1vmgR2BWcB!KD@5=H*Q z(CK>Bl%LDy+pp~Qe6x-TZ%kcdn3kMD2qp!5$HKicI&iO%CcniyC=is&v$U>#`qZ?XZt4z05O$f0;>Vea=K zt_~{EpaF?rcSgMHNSg)lLbn^VUAGGXFaYLke)`)CfB&BtQ9}eTt_dWomQA6Mz0}dp z_8%{uBZ}t3ZhN|L1QBQBUsf&0+E+#_o@)#a>be2y>obLmWLGmdpxx&9jkdQvu6WI6 z+}ur&(B-KAniZkSl^Y4wU=u3=&!qSilzpxx-Z7-#l6I|yK|#>jwRMo_M4~ubgvfO} z2d!pA%F&{Y(U1!i5pHsPN#~h5y&p7KhpzWB^SW=T8FQIJSWV#CVrlf7w3C{giq%G>|x}D5P-Y%Y>neb~} zY{+eV^mDEHqT46-C+Y@G*!TKDq0KU%AtHz~H{jLEX|>Uyy5VV7SNos}h2N0|aHOFX z+-9S#%_twQOi)daxB`2;Kalu3r7Vr4cO8XtYU&UUqQAJ9a!U#KKxcm0$kQebjqMY7 z#O8nABpT@Q^wH>2lx)yxvNk<$&O@2S1wZuaA2LOPg_~?}yE$F;Q@ky{s29jdu`;*i z9(^LQ8~7S}?W{Cf5#Q~23fMcOE57Ld+QV5&n7?ZIX|@fJWaCopmT@Xi(87YyfEpy1 zqbV+>YvhK%!&U>dTDPrUn%~xY-XhgRS+zw_RI^wQ`KbC=c3^7k_kbN;X`$|iR@?v% z;~sC{x^%1@s91(=6Jpvg2p<`+IM0MFLMD72*w1>ZYjpI?51|ko>_5xZa+i=~y?;FM zMlG{c4U$urPQG$SP3HH6Wj(nGupH#G8kfq2Ug$XFmLY3?P+H5S5i*%J*+@(^Gvc2ymJ%nNeUzh zv$m_rIhoLtTOjTOUAC$d;V$R9rn=U^GiUA3txHyS`uOgFmUQ9YkvO_c6O)wdM)ccs zhLqy@UVdvj2|!)VvalfsTPAls-YasXq|b?1_X-qj5tHn%H{R(UK5}9Gbvmd7C%;8k z+5cQFB4@5Qe6-pjY+6bR5Nn^hJVqVpfCO zVIvjNdM;1z_x_7jZl8S|LRTQY8Pyt zaY8?1Jt9xrTN4B+ls6*p=l73%`P{MsJ{bM|--%fE0VsK!T-TD=Acs;oEFQF~EYE7m zb8Rw}MB`SBuEPI6Q28Z(X=yT-=Pe#x8rn}H4z1;y>~h8Io8$M^xD1^oZE+mUy)=AT zBa;phZ0@RPH>$IhVLU-{Yl9Q78K zL*xD24@zbIc2#T6m~7qU4QFD9AKWElKB5)WO*n{N%&O;Z2SOH+7ldE3>qkrOjX#q3 zo+!mzeueWDc}6^F?VGVnJj4B&j*V8~uqlI_xrJZjz+uQ7@#TeTC?((6JevN3SzG#| z6Rn;~z&jq;^sssu=L!wmAy0^{Dh2RtAjD|1)&vxvycFwI(@X?JE2^4eaeP)1?)HU3 z_huoL^7vKamaC6|4`mgL*iaelBV}7S5@nIWW}7{hc;F~47Hcf}@G0!t35;g53xv%@ zr(b7{gV}Ecg5cRDMGIMleNLpHuP2?fOvXO7VcqBawbT;SO!g6hW{MJ3nGG(W6wRH< zIkQ?Ysc&~BW0+`gEDhF3q&`;_xZ40i|HbqIx9a%^i@;7GylSB_Darl>LZ%!Xy;#@5 zpniqO-i`4`Wxz@TpGzd83F&vQs3{jY{#%M3qDS@&io7$Sssg^=S^IjCzbyxR6p>&B6Jc>z0cvwY%4Wc2PQq)to;bc|d(}X!5J&Lkz*Z zuS&Ovz%Ovy%e!@L>CYoZ_#T9)gS**AarZLaF>tn-ttkQcwCTMEMblxE19x_?-pi4ya6SShg60`VfD?&0ur=!VXZRE-^NO_0PyqiZ_?IC}$ z=yD;($6IV=z}G<;(M#lqatB{j;n6Mb$X{eo@yJ)veEuNTW}z8a&<}P*zO&Q$%5PXx zo9N{N_11v|?7e^U#h~`Yq{#5sL4N^UJoFEJaH;uewztNtOhkJppRLoZTNhs)vP4>q z{K0rAeXq_zwthUzGYWcN#I~o@^c7={->l13LTNuZL}@TiZ~6g5;2O%{4R&ZA?lLuh zSmDCDx#9`XGS~0E4|24q6)BU|@*ToIDEBDXn?t>D-Eg&#Mr*s%{vL>6@SO(5(Z}li zkn+;|n`WCze&=~k0*|m}0D>hKk}HYBDwlH+KL2)yG;6Vhj1&wi_y~cK2?1H1J zw!&%y@LR;#}M3qyL-MssBv-eB<}uJ$*o>-?hL z0X6Q$=8HW*QtoiETJq;ZJFZOF`=5R;&g&-%XAhPilHHc@Z+I-Yl}kK9K^)rdU)gok z!eWrT1Lhd34ZE%AZY82n4KE0}Gw(zp{-Up-q@W&=ns ztJf+eD4%)Z+rZSle<5FmLHbWsTQIiQqSZE z=bqC{1NE12&0e0x;XFFHz947aVN(;i3`WJJkea?Kq+^$fPZl6PYS1O+(8zR!Z=%|U zU$^_{Dy(H7t_ghjK_Fsir4eEnVnije80ej&_Q`WDYRRSfD*mfsu#xjFny=U>U2oJp zGaRV$vmK+8#kbFEMn_rw6?jz6Y^Cc9Wn^&l78@Ic-o~D|?qR~&WeG2dWFF1Ezwe5d zUOF+c^;JRGWcC|L%2_9Qh zz87<_7ul%uoV_c4ED;GBrJ{X=ftp)b6Ft zdxGzK7wO$U8rA!22mh)raMUF>K~h(W8K>5J8ItL4pj1&*m`_&hBs>=T1=P*Ej-C*Q z{$lG5M$*sPs`-{eD}hwp9j9mu9$QAbSurufW(<0Wwk-HCQeo5|1Y#QRM}r^$sTU~% zE*ls(ylkS^1(Q=({?5xaqxf|LahNm`vZmvQro)MTebsPy>a$7auJ3PD0SNlvSXllW z3zND&C;q2cFxMX$d(b$`tMzPT9C0crOL8mh_|%ms_CD%kOqk$?HzFE3DE+I`tNug*`;r8MMcZR8eJgrccJ~FE%!#0C@ zIC(|oDBfKdt(EoJdI2^noK6LT5hW7QIiY8_RJ&e$GeZ~3p*cu6Mi!4tuS`zwor*vo_{5>8_G)He#HQ(g#*M>&#FYs zxEfnr_oXA)2I`9lGF9{#F_9SUU(gnA^=#OBtm`fv98?&C*f!QN=ekO%zucMgF=gFc zbfTXw63qv_uH9S^d+rO{TR2u^EUFPLb=t&J9`AjwTcgh}+VS<%0j~;>-9sGyuyPXI z^ux7iR^?i-1sTV@1qkgBP?E(9V~*a|-A@r#t=uHfi6HAAyA%}qI^`Aap{UX+iLKn` zyCtDQ@*K!H7-Fxu8%owW7wHv$*9z|5oy_ohhMO>od!r-r(}EjvQvDCKKrHtsjZ>*MuJJz?y+^;)=z6PM-yc~x%Q zcIM=HwD^#i*UTg_wU#X)>~~*)+T4^a$KPh_dnZ1}&BbNIyl;7=%!hYD`0@a$G#^l5 z1>O;V@kI3cQe)YGoXL`)krFm~Lk<5y^KnJoK97AdIB~Rxv`GDMg?RFGVF&u#ViR`R zFjl@Nc&=tRA~4^aioWC|y@r_7M%cZ`mWi`dyE#tB)abJ$dkg0QIh{KN44Oy)5l~KD z_OPUkFkd+u^K@E*ZY2dQL_DLlxBaNU>Ft&@ck~m{!oM*hztxs96OEP)a$ z2h0gjS3I8vWXT|>Qxnz@RgBW(+3H3|(^NcOOy%rvK|K4mE#pmL1h|xjuM2e8Bo624NJVar8{!Rpwu;{ z9{P>wa0;44SMz33F}7*u-a}z+m1h$4+?C*4maV66eJ(><*Qnck1b$=u^lao-xoorN z>?;OZ2Y<1J$$%Lxhwn23NVas{cOiYT#^yMaKT=x`Ff=SS4rtU}&m66=9GvOttX=*# zS=onUa-c87WV}LiI8^UbNN|kBY0R)9{rHaXS$XE$f#gz6E)641&5?zpc?7{ild>Bl zyxKX^cYX*Eq3cCJyNpU$bqj4*K*_hLqvXV-(-da(XZ?8wV+y_Gp~aQfga|pgXygam zcjt`3^Y_B~b{20Z_`Ok#OMalDEUO+mI3j6j(sE$d_~cg>JN{H@{r}J%iSe8yBk8T2 zAHV<*@R`UN`zdNw+B5#F3kFA}BeHRgzfr>o9IQD&8P>zJgw(@E^A93=hq?;iV+bM@ zC`m5aN#8}+=}lMuRDI4fa#6ZAzc>pL8JwE2v?%-N6T77`k73+dXJRB(mmBknvwJ)V z6hu)6hj?`|_esrA@&3rh@U5_19#sNkW;QDqcUnR+%`LhKYA?=~p(>RikT`#uWL`F& zRuY#$Ww#CPiJ@+1!V3A-Z1youpbpE{wnCgf>DIaw%=ja)4^TAcB83#dkTP*Xp1jH( z1QG%fTWuX$4Xk=7ERQctdLwp^w&Gtq10s^f3e8<{PbwM#WhkH-j`)g~Uu~I`4X)SJ zM9wDrgfTzZvpVT!sjgC4ZZ`ET6lCY})|#3WE?If?#@>6@#pPN{m7T;@Xfu^-pYoLO zj;EL>e`Xi=D!}lws9Kiw>8Gv|b~a-1uTx4f8A31&2*;-u$KkzTG^_KP{4tP} zOD};G-}F(yqSlr<`9O_)@}vDeZi~5s)a~Bd*lr`b?-&H2Y-@42^vmaQK$)G~G_zb) z%Rgx{=xW$a4c94$=FYHbU;xX_#F0mJZFOvl-82Uf$Y|8LHpul8)hUskFsol+Tx#$O zeA#>xtN~|QYl$1OT*L?c(m7r;Qy0K)!IynqHIp6s6^{|-@B!&db~Hic3mVnyd?6E~iUXZXkc6UvwyZAeL}KvWdRj|H41m)+Yz z?gX;QITn%uKJEMiTzoH!)>CBf5uYKay;kWOmOtps&x+eJOh~e2yc3V1Aisk2S0l`u zwRy~zgVigwiDK&=9Kc}{h38gMX!4`ChVACex>(>c0ybrni967Hq!_QL!t zh9+GO2GPV7q_qvSyB0TaG3dk9&k=J0d44us@Vi6FB8(NN$d_{LvL{K& zB5oiP?KUq+LQ;s`R$4xJ=6X#1UOZJ}T=R{;D@gNfo$XyDi)v!>0^$>zn?d``3rX9m z#-T@hwU>xjTc64Iy_(qsjwCI8XSlJ$8L5h{FuqrofvoYaO3 zSLew3_pf3Vrk)qx`nCFHKW05QtfekqJ47-n2sYto2)t;dNex`l>vf&9U zb-7!t4*O~FFtsiCZz~70|5`Z=7cJD`{;%e~Gpeb!X&1XvMT*h|6$J#OiFBnZC@3XB zXd*%&2uK$~Q4whZA|f4>4k1KJ=pi6YdJUn5-btt-kU%)GJkR@n>zsAY-?M+f+H38d zd(Yf$X6~8m5}JR;!bJBbo(fcMb#1iwS3PLSj{1Mt8B1bsP5~~yA59MiKiokdj^~JuXCJ*x!nI#2jN@!IyBGc8!92_r>1{n zm4JP}p?Z5nOVyR(Bb$S;FQP@VTk_-oTfIZHJ=3=NiTTmXceqAp{WwFvPPJg}BO^vp zE*<{+h+QDI1yaa}{k>3mPW%F}o$J#7uY6*PP}cu5pBSw0iV81h8T!uMOR-k76LTS( zT6wpj`k|`y%+o^6CwK?*%Hww`_ZvG1$3J}%yDZtyMP(>&<~y0Qz?1%8Tn1>$Bx~lz zD4r-$g_4IwOs2L}=?GLM)76ry8}D7uso1%mP;1%c6!90%;Th2M&UHsFS~35FX)$sv zOUI5>@k8yq&^CfWVoofgjU{uzA#8(v`AEP2STTNNrCMYFuB+M~d|!Q+rQ_hO$pUdu z!qB}~)SX|oS<;XV#E()hbeRshL(g|OR%qtk;oLHT{ zQRFa#C_mY@PAw}ok2wBmLoW0eK&+h4%mMy{TK4E-7h5VX_RxI#>GdK$j&mjm{wL=I zhBi5)N20ar)!1hY?Pu$movEkGpLy=J2cLhpE2_4YWU|(qwy?ojVR$ps@}|zUa6Ptf zgZAy|e>eoBJH_Sb(<83gD8||4(3WaHUIvEEx)f@KACwrg<|wm7(wK_9syZ2*+y2>( zu4ZC|aS~f{cj@v_;qY74L}TXAK2&;m4DYj`LD8Uu4>i{n&4pu9+?b~u6`v&4^1=f@ z6-5r5gkS1R<~csk@3oC%fZVy0A8eg{rpco`IVV$VsSG6X4Yk*OW9VA$$@$UScrRh5 z<~rq#yS!eCHJojumz+jg!s}Qh*28XHyKDHHeZo!ANr~YZt;DD5-3l}5kJ2wPV5O5cupx01wHT09h(JWDTstFdr8NQ&v}d zG|ppM6#UJ<#mDz=y?9}XU~F{)$5!tD0=$r4#qfU%BY&t~eUzPm;d*Ad(195&lU^YK ztGvic;VKltOC(@sr5F2G!vj-`gJtmAXCI)_BOK{PdFKk@0TU$CWC3&Y%Sbr2$_25> z3l;r8pZ2xZBgmW(-yP$-d3i_oZ&NnX+P$t#$C&R^# zbz82K9gwT3yy`;3?8KAoWdfDgvw0rgqjJMl*EkGZ2r4aX+r_T01VNmYHqSw@7JY)?5hnXlF&y#5+UMU!7Y=oLDR#YTX z5rsY0fQN!J#6Qz#Ia5UKI|7^wsUcd-Gvm61D*lrL=}}Ke9}LQ7Nr)bRTRN1DnbBHvi>ykcYw_BOTj*q@0kw8CfQ2u`9y}r%$1i1obQe+d4W*I~ zfMd(xi~@_bci;|-0zOC6kNNQ`Ud^+Fc+AM9@fzJZf6a05i%0C3GLddiB8M~M#hBQX z*D~-jn<*g$-qi|FW*HzijlBL+J=<@u{87KFK9(y{)cy5dGBHHjRWzWl+}8OJQ5#7# z;i>u+Daz}3MlFf4$oO4d;`xC+jW)Ntoh36pEg}XP@taX5fuu#vsuEav{y!>nSh||M z1%4xa56UHgHzevocI{UTHe#~3c0oP&0*nrA=Q_10@>Y-FK=9q(-f zp}>>Ws)Q%;4K!Amx!cU{>F0uyHMW0YC#a`JFtsR3or!SeQ9Ih^pib( zlHr|!-iY`Eaz0E(KwOr|if1^wUE9oYmzvP^i;}DG()N^E=)v+?oB{d1^2c}7Wa7SG zxaz-K$z_xGQN}+U3+2fNONDyUTPN%^snbi+1fQdlg`{1;(NU$#;A{B57X5I@2Oc7e zn5Vd0k8UV#sHhAmTk!n?989X1RCj`PITf;aGEmQlO(l8nDQSP)!Ha+cbJYihsA>tO z0?4}u97%I?bC-Q~bl-PFR8FCS*HNGzE~>;9j3@k30o44HTSLaRRpxJh7}$Qa==G>U z^I)B$zE_-R?=QFRnq>3{dn@^?wBn5eF*Z*oqwG6PbIJ0{R9S3J-2fyUeTjtAybtTGl^k)<_EtUSU7D`0wu;|- zGYiD$^8M)${pZh9)HUQ30{E%J;}ex%u9lwvlAItXaZgTd{f18K$xLS3#nMee6wh$1 z)05I)#Z^nKPZt^gq<*N37hr^#1lpcj8I5SnackG3>Jlbw#n-!_I6HJ1P4@1@I_9^<*uF&qI)$7$NRHc}{S zWOeH`f5tuE0g(NqeE1MGWstS>?{@z5HGFlOif%l@e{1gQ(>5}-QBR{Bnsh&}Klz)# z{{~1aUplPh9FK*C)>coKYBnh4FFX_|_j>%2sxo=m|B30J&FOcfI~?W@WKbsKCnOe$ z?yIDp(q?K-@plLY#Wi@`V})=uR>QTIx1umPYo&VO!q2OTZ>}bszwnUryTmhf2XHL|(>{0~`=N>Zhy> zvGfy8-6NGy6Fsq;D-^%}>j}Vml|WCVHoIb;ZG(-kycT#|#ZT)>zj?T%)(M%AXaZn4 zRizsPwn5#U#}-E^eK9pk2s|{ZR(yF=%{^7ic3rgZ6MBs8lJ%fVg5bD}kxw_RXbn-$ zUzr48^OH5ubzkaZPZw6PEV^iAW|MNw{9I;^{Z@rk+<6=B!ITcS#p|S19Ua5bE+3IG z|J@uvHr5aNUzA)b2QBDorocBsRO)_h0a}*jFN2>wU_%3h;5Y@33!}u;Dc{~bwE{ zO$59saI=$cwCMw&-dOV#AI$L@^qu^dJ%csgF4>H_rI_y1AzPYRLaNG6!pdPU z*A25T+AkD7;8eN_s6(;|j{&~9d6)Vs41A88nasBC5rd-o$DYAt@!RXhu;879^l^6iM^$4>7_C$`A5)nX5&9(BlG>0j4p8(S2F6`Lvj= zxzd9pVkPEcHnTy_exs7kJKr%;tzE-e3fs~scYMYQ6i3#Fy+3;-(dCri>a!BikGUYF zU(uPA{T4dF>fWo2;Z4uD@ZMp($Id~uIyKMhyyv|1BUA%DaV;uGY1F#T+Zd_xl7YM9 z6>iu)!^(UL!V7&d8?6u9_fMRBPPzov2`kt|Y6lf;SEmH^(9`D5w~rWRSFm?t+WqgfhIjTg zDY&4|=FVBlS#5_4uQ9w4mdG6WZXwDuNjX znoJEMXAyZj*(1W^OY8XXqf#!0*;n%&>HQf@1&3S@wH6hmqlt90uXYh`5}A}2w9>;6!}(0D6CGH+D!S?_&@P1uu>fSMEa zLYZ%w{wTfPCpR8RKV0S-gcS=Y9fNyM`qWrdf>t~`pXg-9?OlOR=Y1sb+G3hy8}IbEdfx85**QI?`wpj|oo$vh<3X*$gT zBMFn5JkKlUBm$-*K7^Se+%l_pi{=^jc?QK?Hmr?ryqpI zVGhh2rqlSZ1b)_!>~Ke+D*Y=#U>KmyUB}3m8cLrNj>LnAXXNr7AEbWm<7jE~f)7Pd zUvR*P_zuv6QWH4?9zMv_*_7!h`(CM5>8<@EF5V@eN7>2O$u(s9iIT7nj-@KnUs8<0 z+&g2YYcjqkQ;8>_v#aJD@%2FD>%Y38>1H!7%;=iGmoBfa391L+%HAT?BlmMRwIlI< zp{*<(eNz!1nj3J!rjz{RboRqvOZ;0T1uf#Ql50j^8Cs6I+W+*83!Gjbt2rE|ec+Oc z3>bt2MK0J`jVmZ_Hk( z5&zj{uCq0tIF#ZOx2nKZj%cprTR4C)UK?&KDBpDG&}x83ya&sa_L51TJpeS? z1usAu=t|uS?Le357EOPv+NZ2^-ibdzeHBI`^6uNVh`wCFW+?>hhuUE+zcL3Mq@Su^ z)~G-8XPi&f&b_=-of0U1^X5YbhvnVTD*fzHc^l^VoNsooJ#rAv=#tjJe4mI(qY(~V|*S7O&W8L}u54-jl%v^3svpR07F@dMkZ$q~}&UOAoH*qj6;oCCj zqOTrH5j*MkclqnqNjoGHwsgc-a243K9m3EN>vE(md<2p%Vuo0DvAaLpzai0hV38ZF z_QZc}LBh|?#k8n7x@RawE8c!0KnUD><560Ijf=_~CFiQH{fTGh7KS{hyC(}<)Bvq= z=Zot6aduj5y0cMSjJ!)3v=Sz9igxF@ctwn_Z?B$GCrVr?W|#5moY36@79c5af-5!FURP|nYnyN3_;y+biloh7fQE|EQ~mbKVsZt z1+5-6ok`JElAKa-n+x?N$Oo}tj{gyHiG5oxb-z~3(8I5w(qZ;A(&E4_7aq6H>bP#{ zzFS&EkYC8lHTLP_#5u&JT%k4m=%}GIG3y8@Eq=-Pa2tMxjymJsc-4qtWk}oW7?Xxi zS8Vd462;&K>3QRwaU@%C)5h%JRY)n5ZU7oaTjC`l2gZB3`~l|j(}x@B|6#3xVlVTJW$vhS6VmrCh^K4&ten6D5){L zC40HwfLo>9hv+8i=U+oG)fcb(F?nvPY$@iLm5xp+)j3#``P+|+;rl7wewHCpdDc~y zuaK%;)_v`1(mDe!+}ZE$L&ly=himgd!&EL!vj1>`_ga>Ia^ATA=spwUsCj#`{5{jw z=Pp9+?QMe+dX^T&;ga#Z@Ldz0fRHX5u4kz{Ct$uXOQ-j@r`zj%lD1NKbXgNKT`Qsi zZYB}!05;E3Rea}5bJtiwyR!5XVgi|W4eFLZ0fl$^3TSJHP3^|83gL?^MQLuG5^P`c zm{n>Y#5X4-E(<%AtXq7Kt^N`TE$eoCfqMSdnagvHJB&GKOJ<(0W!Q1TW0>O3y}GvG z7j5K=YTC2lMCJBXu-(XB>|*kU9NB12{87~%t(jD@DiTv~6wcO5uV<%sTnjdztRb?4Z}%?T zUB1A=k_o|+gVC0x+-sy)I8La)Z?K5$c2Nr!zc$N) z{uO%Tl}I8On5G7Hih+RQYDK5r7`30M4*0^L9q7;<-?*Ev9(NSV(ht0=$r0|Ej;+ZU z9mXiWQws{IWW8pC0xf_?#7YOg_(1U#*C_5cHpH0mz(hFPQ1J)%$y+)DnpK7Fm>S}8 z1aKDlW|kwpf!yHkJ41jCeLGm&RuCy$!|n?gLr&{W8xkTewP5^R;_DUk&J_-F=Hv z<~5SGUldP_q%~GXDLCIRRkqrufN_NqP*O(R$Cw*Zi!a6jSw1}%xx7oege)S2{6E=I zo@b>jRBdM{lL-K00`%wz;wDs?Md8Pd)YuoVv@ z013qHSL@zF>sqDK)_JbVv+_tt!QAb|Jq3~y7b^MaR)7^iQV~$m)n%+1s|E2If;OzJ zEcSnV9wGqzFsp3GjafOlVKhGL*t^yev~uY3X){_{c685RLTv{>VHQ>S3eCK6>`%Wh z8tS`+b21Jt_wsM&2lNnN5*U*nw#Fa69m^izpUoV(xVTLOT*&h~D%@${J;P|ldQ+os zS}lO5z#NL^0~8cR>zqiHSi!)fe_Xjzh+$6Gs!=x0Hm03?Y^(ECvC!yDxqpFwOg`u5 zHT|P^uL#}*qXB$0!lSPP++L?^S|o_GtkJeT(|L&c{H$N*PTR0}+i>9P;t!FJ55;Vb zj(h=7;^|duG(OOB|F^v*r(*U=v#Wdh*&e`o|eQl)bb2 zx*(LK=bSvH>IG`5l5=&wuiacpq3bB*j}=iy5ha(U6UW7xs>QCw#t2fg1nLtTl! z{*|y6ykgxw<2@C~NQXON1Mx=Q7b{C+a_z4v;+IHkY?Hdids!gjfL`zRS@=2cm7!+p>_V`<(bZJ!V|T1tv!vh zIFMA-`>ck!DJBGl{p2QjI{x#?G@vj0+}(b> zT9s#L?)IQFPbkOk$AXlTqskE?mSfB26zLlxcpr|L7tf2=v`J?`JxMZMvF_pc30Lvxn@UlW6d=I&Yk zslRPepHn@1?5}f6y*aOXc8~h+&-MDe>VGvx4LAI!smt%q|1*)P&;I|`)XRnk9MboV zsi&?;2(g^1y0bk0iZ6EK@C<#gir&%13B_f03-ZJ&&XTHxGyf>zHC=lJN(zAVC6tU# z{_HR?^e980rnzkRue_B{n_3k-M>aZeGD4Ci(VCH@9OP-5yY@?->XMY0XQ>YWfBT;% z1x}&lgmLaiqDn_CqqTJ7bwa3JYU9oaaMvkC2kOeXdv;a&`P<~_MBT4}w_RVquCvqR zn2cjID7)}J8dK?FmBD|GQ6nLn8zu_g0XSIni2#eMMp0ZeQ?+i<@O!0PO!^J~47MM= z6;>*dmn8bZfdEqe7bGPKjUTIkYcA}oq1@YI$OaQi(7Tw0lfjUjpZ0Pr7jSF_;hK6i zR^A6svr0a#z3gFSFUq4ha4PwHvBTc!#4Dz{dEh=kq!+s%Xd|d9T-5w&xRGe{jL7%# z>u}{O4X&dG2Bzpc^18SG4whK&EJEm@4%orr%X%+APaYIa;jD<_F6QM(^KS8Xsnra0 z{D4j)&e>4?`J_#8@0Eqi4SH}V8y&bX@+Nh_-WTK8XAmsxvgNXDo>Nri zlcyao7GKk7qu)AgT1^H9BCO_DOA#AE>{R=PI@Ic`*d>omPVGdnF^_1)DRiI*$L9ml zf4-B(Pa}poMw^F<_mZ5nvtPvHzk+ z7^_pg5fA*DIN)w;8_cH&yKXs&Usrh(dT&2T+99jt?ZP(H+odlYWZ9b&e^NXWh>?6k2yfAOr$FXJd!m`}#YpcT~441j++ zqFQ3RmulW!6IM7PS5pdD~Krb=CY ze_tu57ThbhN?=20feYJJkGC@OD;x)9QMN|&RV1RzMLeR6d*~u$*M7w6OF1>{5E$SY z=Jh##^=ae1npSZ^LCv6n{y2qa?*tDHACY{$%8~Os)i)I^nC&vDPV|BBbed4JE!6}d zUYwvKa{EY0Lt0F1ufKzOfr8u1js6W^RcRrFBkM|>&|qm}vlX1@EJ9?-a^VqrC)quY zc`=skLcz_GuYp?bvyDp_nYQ|H^86=khHVjfks$at!Zxt9nGPM#Y&jb*S)zYHK30FK zuobY8*yz?GM>d=0{X0fW#jiLftkkA`nJ7oo3IC;%e4F0K;S zUl?T`a%2|Oskygg=LPtG3)tTB4a{vTT&Zcw?$;OIqcKnL^*Cikg9wpx%cI@967b$aDw?w0dyhO&O61VY2I4ta*P*Bu+$Qi~# zhv{`{u?;ma#d__eHeSDV1)m=2L>&q-zoVfl>GA-^8mNJFSUb6oHLw!2@rBj%%DB`u zVdWN+J;l)h=d+LUeY{^*Vi;EG5S7%B7`QJ7X9Vbo`|Kb(<}Orcm&nduL0wQ!f(j9Z zaQx%oVc;X`;C#=^v5|P>{h`&Y@q5ajeyf)o930FV1x6EU#aI*gu_EGZybSvnSYoAd zpd&Na&CMZS?*!|GrU#Q1?@7{$)7Sx&*=2aE4J`dh%yhWC;WxIP?g1BG3L@=QxrwdU z5_^mUfW)YMMyFZ^SNMypo9aJts`x*_ThdI8HkVe9= zwH5G+5pvA=w1`FFqVmT57@=w}(xI; z&@4W-$?Wm9yr_Mgf3k&;Zn9cjT%4r14}ea@)jrAeaOk!Lkn7)^@U@#>?^dl`G_ZLJ ztgaT0^S&f#fY&4Vq)zBQd|WaiEmx8YUg&APf$p3E`V0FLT$MIgl48#iUobQS4|;=u zd%0Z&idW^N++k3XbsHOJ5#?zwTTK4S z1TtBT0j&C1>v6W{8m{!y44euH)1t2UKOXFGsl2L1`GRJoV-3>l6@Em>dEvr zT*&6^@0r}e!!~3;=eWv_H5%PEvLA`vE_1W`O1}Yh#3Ieu+WS5VmYLSwb0%^Un<BHsj>DIV|Qkr*=nX(t}6$I zWNU-BlYryP7t>i%{mj@to#@?F*3_xD!_d3JCV z9gUbFGRowLDT;OVVTru&+YYS{gYP{Z{}Xi5&r^m=snsfgC{T33esu6?nKg1|W@cyN zz_og9%Upz}un3!bw7*L0G_jS4ptzuX)sc;mRiu%KQP~W`DiWmO`^JvaRMftjhtT*F zgYe3>!qO{w*d(DQ;{I;%a%siYPR@0bNs6PT)J%TX*N5hupVl6$>jZyMx@~n$Yw?ta z{mu?qMhtB~WCVTTQkoLUCB2^Q9ZCGq_qnD;L_{CF3vdJ>^pLYGaWSmlw%np6B`+wL z_uP6^=~%Fp(jteK>9!`G&cePz4XQwWh(B!*`;MhOZEE{7NdWThW$dtA%SvbRE@ zq;KvaLCr;~N}GEZU}D6)k-|?>i1MFib(+D^M;W5y3b=A`hh6jvQ>(C#eNsuMafYE8 zu<#VqnGi@0H2_zuer@5TziU`aose4@NrdRJVIdj-uDXq*d!aKh6+jU7*%T5b4PqCs zR#rFzswzyMoD-rrl7OGMBiVq5GqY5`^y$}szWZ*xD#2&MyTvkh-5ipNcBZaV8oSFj zh(~rZR`Ymm$MmJ8@^3d!kg40;O7W!PGvaZYUMZ@t`p;y#y^#^I_Jz9VQRjQvl**#1 znpZ$2$zN%6$s882Zo%U$_ri&3?czl~c<9fl*!pACxBvBL?ua+HG>?c<+2fb8j{@%X z9H35(8W`CUwId@Ve>u}ig!Sm<(tbUhr3$Eaz?u4P>3_WoqZ0Zlc&|O~3!nF0X=~kC z&P~RNwo0C;zj*ZBq(}KsA{3W5rDj00jRYzf6r!|9+^k0+ Date: Mon, 9 Jun 2025 15:55:59 +0000 Subject: [PATCH 04/10] submodule 1 typo edit --- ...Submodule_1_Tutorial1_PythonOverview.ipynb | 1605 ++++++++++++++++- .../Submodule_1_Tutorial2_Variables.ipynb | 135 +- ...Submodule_1_Tutorial3_DataStructures.ipynb | 91 +- 3 files changed, 1715 insertions(+), 116 deletions(-) diff --git a/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb b/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb index 87be95c..f658e5c 100755 --- a/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb +++ b/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb @@ -25,18 +25,93 @@ "- Find help for Python Tools\n", "- Use functions and methods on variables (at a beginner level)\n", "## Prerequisites\n", - "NONE\n", + "* No prior experience or setup required\n", "\n", "## Getting Started\n", - "Run the next code box(\"play\" button to the left or on the toolbar above) to installall the needed libraries for runningcode on this pagey" + "Run the next code cell (using the \"Play\" button to the left or from the toolbar above) to install all the necessary libraries for running the code on this page." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "9f1b88e0-7934-4205-a643-839f9d3cc457", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T13:36:56.807191Z", + "iopub.status.busy": "2025-06-09T13:36:56.806827Z", + "iopub.status.idle": "2025-06-09T13:37:12.942153Z", + "shell.execute_reply": "2025-06-09T13:37:12.941359Z", + "shell.execute_reply.started": "2025-06-09T13:36:56.807165Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting jupyterquiz\n", + " Downloading jupyterquiz-2.9.6.2-py2.py3-none-any.whl.metadata (16 kB)\n", + "Downloading jupyterquiz-2.9.6.2-py2.py3-none-any.whl (25 kB)\n", + "Installing collected packages: jupyterquiz\n", + "Successfully installed jupyterquiz-2.9.6.2\n", + "Note: you may need to restart the kernel to use updated packages.\n", + "Requirement already satisfied: pip in /opt/conda/lib/python3.12/site-packages (25.1.1)\n", + "Note: you may need to restart the kernel to use updated packages.\n", + "Requirement already satisfied: numpy in /opt/conda/lib/python3.12/site-packages (1.26.4)\n", + "Collecting numpy\n", + " Downloading numpy-2.3.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (62 kB)\n", + "Requirement already satisfied: pandas in /opt/conda/lib/python3.12/site-packages (2.2.3)\n", + "Collecting pandas\n", + " Downloading pandas-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (91 kB)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.12/site-packages (from pandas) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.12/site-packages (from pandas) (2024.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.12/site-packages (from pandas) (2025.2)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", + "Downloading numpy-2.3.0-cp312-cp312-manylinux_2_28_x86_64.whl (16.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.6/16.6 MB\u001b[0m \u001b[31m182.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading pandas-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.0/12.0 MB\u001b[0m \u001b[31m175.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: numpy, pandas\n", + "\u001b[2K Attempting uninstall: numpy\n", + "\u001b[2K Found existing installation: numpy 1.26.4\n", + "\u001b[2K Uninstalling numpy-1.26.4:\n", + "\u001b[2K Successfully uninstalled numpy-1.26.4\n", + "\u001b[2K Attempting uninstall: pandas━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0/2\u001b[0m [numpy]\n", + "\u001b[2K Found existing installation: pandas 2.2.30m━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1/2\u001b[0m [pandas]\n", + "\u001b[2K Uninstalling pandas-2.2.3:0m\u001b[90m╺\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1/2\u001b[0m [pandas]\n", + "\u001b[2K Successfully uninstalled pandas-2.2.3━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1/2\u001b[0m [pandas]\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2/2\u001b[0m [pandas]2m1/2\u001b[0m [pandas]\n", + "\u001b[1A\u001b[2K\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "autogluon-multimodal 1.3.0 requires nvidia-ml-py3<8.0,>=7.352.0, which is not installed.\n", + "amazon-sagemaker-jupyter-ai-q-developer 1.2.4 requires numpy<=2.0.1, but you have numpy 2.3.0 which is incompatible.\n", + "amazon-sagemaker-sql-magic 0.1.4 requires numpy<2, but you have numpy 2.3.0 which is incompatible.\n", + "autogluon-common 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", + "autogluon-common 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", + "autogluon-core 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", + "autogluon-core 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", + "autogluon-features 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", + "autogluon-features 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", + "autogluon-multimodal 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", + "autogluon-multimodal 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", + "autogluon-multimodal 1.3.0 requires transformers[sentencepiece]<4.50,>=4.38.0, but you have transformers 4.51.3 which is incompatible.\n", + "autogluon-tabular 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", + "autogluon-tabular 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", + "autogluon-timeseries 1.3.0 requires coreforecast<0.0.16,>=0.0.12, but you have coreforecast 0.0.16 which is incompatible.\n", + "autogluon-timeseries 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", + "autogluon-timeseries 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", + "autogluon-timeseries 1.3.0 requires transformers[sentencepiece]<4.50,>=4.38.0, but you have transformers 4.51.3 which is incompatible.\n", + "catboost 1.2.7 requires numpy<2.0,>=1.16.0, but you have numpy 2.3.0 which is incompatible.\n", + "gluonts 0.16.1 requires numpy<2.2,>=1.16, but you have numpy 2.3.0 which is incompatible.\n", + "langchain-aws 0.2.19 requires boto3>=1.37.24, but you have boto3 1.37.1 which is incompatible.\n", + "numba 0.61.2 requires numpy<2.3,>=1.24, but you have numpy 2.3.0 which is incompatible.\n", + "sagemaker 2.244.0 requires numpy==1.26.4, but you have numpy 2.3.0 which is incompatible.\n", + "spacy 3.8.5 requires thinc<8.4.0,>=8.3.4, but you have thinc 8.3.2 which is incompatible.\n", + "sparkmagic 0.21.0 requires pandas<2.0.0,>=0.17.1, but you have pandas 2.3.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed numpy-2.3.0 pandas-2.3.0\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ "%pip install jupyterquiz\n", "%pip install --upgrade pip \n", @@ -50,7 +125,7 @@ "source": [ "# Python Commands & Programs\n", "\n", - "We want to use Python to do some job. Thus, we create lines of code which, when run \"do something.\" This is more or less what we think of as a program\n", + "We want to use Python to do some job. Thus, we create lines of code which, when run \"do something.\" This is more or less what we think of as a program.\n", "
\n", "In Python, as in other languages, you build a program by creating these lines of code, often called commands, in a syntactically correct and logically organized way. We must do this because machines are dumb and will only do what we explicity tell them to do. \n", "
\n", @@ -60,10 +135,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "4c221b80-a947-44bd-8454-5d0e3491f6d0", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T13:40:44.070384Z", + "iopub.status.busy": "2025-06-09T13:40:44.070008Z", + "iopub.status.idle": "2025-06-09T13:40:44.074066Z", + "shell.execute_reply": "2025-06-09T13:40:44.073248Z", + "shell.execute_reply.started": "2025-06-09T13:40:44.070361Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!\n" + ] + } + ], "source": [ "print(\"Hello World!\")" ] @@ -73,7 +164,7 @@ "id": "5b3efa13-65aa-4d70-8db5-3134ee82c34d", "metadata": {}, "source": [ - "The Python compiler (the interpreter of code into something that executes) interprets a new line as a new commmand. It also interprets indentations as meaningful. You will see over time that indentation must align.\n", + "The Python compiler (the interpreter of code into something that executes) interprets a new line as a new command. It also interprets indentations as meaningful. You will see over time that indentation must align.\n", "
\n", "
You can tell the compiler to ignore material in the coding box by adding a # in front. Try this in the box above, adding # before print.\n", "\n", @@ -87,7 +178,7 @@ "id": "398865a6-a1a0-48ac-9a76-0af145f35a4f", "metadata": {}, "source": [ - "Python is an object-oriented language. This approach means that you do not have to upload every possible tool in the language to run each program. Rather, you pull in just the pieces you need. \n", + "Python is an **object-oriented language.** This approach means that you do not have to upload every possible tool in the language to run each program. Rather, you pull in just the pieces you need. \n", "
\n", "In contrast, software like Excel is ready for ANYTHING you might ask it to do. Unfortunately, loading EVERY tool just fills up the computer's memory and slows processes.\n", "
\n", @@ -97,10 +188,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "e8bbb045-3327-476b-97cd-fd9c6db5df30", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T13:55:42.647555Z", + "iopub.status.busy": "2025-06-09T13:55:42.647274Z", + "iopub.status.idle": "2025-06-09T13:55:42.716369Z", + "shell.execute_reply": "2025-06-09T13:55:42.715515Z", + "shell.execute_reply.started": "2025-06-09T13:55:42.647533Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Drosophila melanogaster\n" + ] + }, + { + "data": { + "text/html": [ + "
After fetching the ability to do italics: Drosophila melanogaster\n",
+       "
\n" + ], + "text/plain": [ + "After fetching the ability to do italics: \u001b[3mDrosophila melanogaster\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "print(\"Drosophila melanogaster\")\n", "\n", @@ -121,10 +241,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "5945b1cd-a2a2-432c-8391-4384e040042b", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T13:56:09.723818Z", + "iopub.status.busy": "2025-06-09T13:56:09.723131Z", + "iopub.status.idle": "2025-06-09T13:56:09.730528Z", + "shell.execute_reply": "2025-06-09T13:56:09.729719Z", + "shell.execute_reply.started": "2025-06-09T13:56:09.723787Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
Bioinformatics is the number 1 approach to DNA analysis.\n",
+       "
\n" + ], + "text/plain": [ + "Bioinformatics is the number \u001b[1;36m1\u001b[0m approach to DNA analysis.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
>new_dna_sequence \n",
+       "AGCCTAGCCTAGATTGTCTA\n",
+       "
\n" + ], + "text/plain": [ + ">new_dna_sequence \n", + "AGCCTAGCCTAGATTGTCTA\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "print(\"Bioinformatics is the number\", 1, \"approach to DNA analysis.\") #what happens if you eliminate quotation marks?\n", "\n", @@ -144,10 +301,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "c5f018b3-c944-4273-9853-8734969256ec", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T13:56:28.971615Z", + "iopub.status.busy": "2025-06-09T13:56:28.971259Z", + "iopub.status.idle": "2025-06-09T13:56:28.976211Z", + "shell.execute_reply": "2025-06-09T13:56:28.975402Z", + "shell.execute_reply.started": "2025-06-09T13:56:28.971592Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function print in module rich:\n", + "\n", + "print(*objects: Any, sep: str = ' ', end: str = '\\n', file: Optional[IO[str]] = None, flush: bool = False) -> None\n", + " Print object(s) supplied via positional arguments.\n", + " This function has an identical signature to the built-in print.\n", + " For more advanced features, see the :class:`~rich.console.Console` class.\n", + "\n", + " Args:\n", + " sep (str, optional): Separator between printed objects. Defaults to \" \".\n", + " end (str, optional): Character to write at end of output. Defaults to \"\\\\n\".\n", + " file (IO[str], optional): File to write to, or None for stdout. Defaults to None.\n", + " flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False.\n", + "\n" + ] + } + ], "source": [ "help(print)" ] @@ -162,10 +347,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "5f769377-13cc-454c-93f6-61378fac539b", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T13:56:38.904314Z", + "iopub.status.busy": "2025-06-09T13:56:38.904036Z", + "iopub.status.idle": "2025-06-09T13:56:38.909949Z", + "shell.execute_reply": "2025-06-09T13:56:38.908972Z", + "shell.execute_reply.started": "2025-06-09T13:56:38.904294Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'HGYCU'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\"hgycu\".upper() #this method does not need any information in the parenthesis, but some do" ] @@ -189,10 +393,1345 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "efd9b3cc-cc33-4fbd-8670-c1f555efb77d", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T13:56:50.568392Z", + "iopub.status.busy": "2025-06-09T13:56:50.568109Z", + "iopub.status.idle": "2025-06-09T13:56:50.579304Z", + "shell.execute_reply": "2025-06-09T13:56:50.578152Z", + "shell.execute_reply.started": "2025-06-09T13:56:50.568364Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "var questionsoWSEkZnrBwzN=[\n", + " \n", + " {'question': 'What is the purpose of the help(x) function in Python??',\n", + " 'type': 'multiple_choice',\n", + " 'answers': [\n", + " {'code': 'To execute a Python program, X', 'correct': false},\n", + " {'code': 'To display information about function or tool X', 'correct': true},\n", + "\t {'code': 'To fix errors in the code of X', 'correct': false},\n", + " ]\n", + " },\n", + "]\n", + ";\n", + "\n", + "if (typeof Question === 'undefined') {\n", + "// Make a random ID\n", + "function makeid(length) {\n", + " var result = [];\n", + " var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n", + " var charactersLength = characters.length;\n", + " for (var i = 0; i < length; i++) {\n", + " result.push(characters.charAt(Math.floor(Math.random() * charactersLength)));\n", + " }\n", + " return result.join('');\n", + "}\n", + "// Convert LaTeX delimiters and markdown links to HTML\n", + "function jaxify(string) {\n", + " let mystring = string;\n", + " let count = 0, count2 = 0;\n", + " let loc = mystring.search(/([^\\\\]|^)(\\$)/);\n", + " let loc2 = mystring.search(/([^\\\\]|^)(\\$\\$)/);\n", + " while (loc >= 0 || loc2 >= 0) {\n", + " if (loc2 >= 0) {\n", + " mystring = mystring.replace(/([^\\\\]|^)(\\$\\$)/, count2 % 2 ? '$1\\\\]' : '$1\\\\[');\n", + " count2++;\n", + " } else {\n", + " mystring = mystring.replace(/([^\\\\]|^)(\\$)/, count % 2 ? '$1\\\\)' : '$1\\\\(');\n", + " count++;\n", + " }\n", + " loc = mystring.search(/([^\\\\]|^)(\\$)/);\n", + " loc2 = mystring.search(/([^\\\\]|^)(\\$\\$)/);\n", + " }\n", + " // Replace markdown links\n", + " mystring = mystring.replace(//g, 'http$1');\n", + " mystring = mystring.replace(/\\[(.*?)\\]\\((.*?)\\)/g, '$1');\n", + " return mystring;\n", + "}\n", + "\n", + "// Base class for question types\n", + "class Question {\n", + " static registry = {};\n", + " static register(type, cls) {\n", + " Question.registry[type] = cls;\n", + " }\n", + " static create(qa, id, index, options, rootDiv) {\n", + " const Cls = Question.registry[qa.type];\n", + " if (!Cls) {\n", + " console.error(`No question class registered for type \"${qa.type}\"`);\n", + " return;\n", + " }\n", + " const q = new Cls(qa, id, index, options, rootDiv);\n", + " q.render();\n", + " }\n", + "\n", + " constructor(qa, id, index, options, rootDiv) {\n", + " this.qa = qa;\n", + " this.id = id;\n", + " this.index = index;\n", + " this.options = options;\n", + " this.rootDiv = rootDiv;\n", + " // wrapper\n", + " this.wrapper = document.createElement('div');\n", + " this.wrapper.id = `quizWrap${id}`;\n", + " this.wrapper.className = 'Quiz';\n", + " this.wrapper.dataset.qnum = index;\n", + " this.wrapper.style.maxWidth = `${options.maxWidth}px`;\n", + " rootDiv.appendChild(this.wrapper);\n", + " // question container\n", + " this.outerqDiv = document.createElement('div');\n", + " this.outerqDiv.id = `OuterquizQn${id}${index}`;\n", + " this.wrapper.appendChild(this.outerqDiv);\n", + " // question text\n", + " this.qDiv = document.createElement('div');\n", + " this.qDiv.id = `quizQn${id}${index}`;\n", + " if (qa.question) {\n", + " this.qDiv.innerHTML = jaxify(qa.question);\n", + " this.outerqDiv.appendChild(this.qDiv);\n", + " }\n", + " // code block\n", + " if (qa.code) {\n", + " const codeDiv = document.createElement('div');\n", + " codeDiv.id = `code${id}${index}`;\n", + " codeDiv.className = 'QuizCode';\n", + " const pre = document.createElement('pre');\n", + " const codeEl = document.createElement('code');\n", + " codeEl.innerHTML = qa.code;\n", + " pre.appendChild(codeEl);\n", + " codeDiv.appendChild(pre);\n", + " this.outerqDiv.appendChild(codeDiv);\n", + " }\n", + " // answer container\n", + " this.aDiv = document.createElement('div');\n", + " this.aDiv.id = `quizAns${id}${index}`;\n", + " this.aDiv.className = 'Answer';\n", + " this.wrapper.appendChild(this.aDiv);\n", + " // feedback container (append after answers)\n", + " this.fbDiv = document.createElement('div');\n", + " this.fbDiv.id = `fb${id}`;\n", + " this.fbDiv.className = 'Feedback';\n", + " this.fbDiv.dataset.answeredcorrect = 0;\n", + " }\n", + "\n", + " render() {\n", + " throw new Error('render() not implemented');\n", + " }\n", + "\n", + " preserveResponse(val) {\n", + " if (!this.options.preserveResponses) return;\n", + " const resp = document.getElementById(`responses${this.rootDiv.id}`);\n", + " if (!resp) return;\n", + " const arr = JSON.parse(resp.dataset.responses);\n", + " arr[this.index] = val;\n", + " resp.dataset.responses = JSON.stringify(arr);\n", + " printResponses(resp);\n", + " }\n", + "\n", + " typeset(container) {\n", + " if (typeof MathJax !== 'undefined') {\n", + " const v = MathJax.version;\n", + " if (v[0] === '2') {\n", + " MathJax.Hub.Queue(['Typeset', MathJax.Hub]);\n", + " } else {\n", + " MathJax.typeset([container]);\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Choose a random subset of an array. Can also be used to shuffle the array\n", + "function getRandomSubarray(arr, size) {\n", + " var shuffled = arr.slice(0), i = arr.length, temp, index;\n", + " while (i--) {\n", + " index = Math.floor((i + 1) * Math.random());\n", + " temp = shuffled[index];\n", + " shuffled[index] = shuffled[i];\n", + " shuffled[i] = temp;\n", + " }\n", + " return shuffled.slice(0, size);\n", + "}\n", + "\n", + "function printResponses(responsesContainer) {\n", + " var responses=JSON.parse(responsesContainer.dataset.responses);\n", + " var stringResponses='IMPORTANT!To preserve this answer sequence for submission, when you have finalized your answers:
  1. Copy the text in this cell below \"Answer String\"
  2. Double click on the cell directly below the Answer String, labeled \"Replace Me\"
  3. Select the whole \"Replace Me\" text
  4. Paste in your answer string and press shift-Enter.
  5. Save the notebook using the save icon or File->Save Notebook menu item



  6. Answer String:
    ';\n", + " console.log(responses);\n", + " responses.forEach((response, index) => {\n", + " if (response) {\n", + " console.log(index + ': ' + response);\n", + " stringResponses+= index + ': ' + response +\"
    \";\n", + " }\n", + " });\n", + " responsesContainer.innerHTML=stringResponses;\n", + "}\n", + "/* Callback function to determine whether a selected multiple-choice\n", + " button corresponded to a correct answer and to provide feedback\n", + " based on the answer */\n", + "function check_mc() {\n", + " var id = this.id.split('-')[0];\n", + " //var response = this.id.split('-')[1];\n", + " //console.log(response);\n", + " //console.log(\"In check_mc(), id=\"+id);\n", + " //console.log(event.srcElement.id) \n", + " //console.log(event.srcElement.dataset.correct) \n", + " //console.log(event.srcElement.dataset.feedback)\n", + "\n", + " var label = event.srcElement;\n", + " //console.log(label, label.nodeName);\n", + " var depth = 0;\n", + " while ((label.nodeName != \"LABEL\") && (depth < 20)) {\n", + " label = label.parentElement;\n", + " console.log(depth, label);\n", + " depth++;\n", + " }\n", + "\n", + "\n", + "\n", + " var answers = label.parentElement.children;\n", + " //console.log(answers);\n", + "\n", + " // Split behavior based on multiple choice vs many choice:\n", + " var fb = document.getElementById(\"fb\" + id);\n", + "\n", + "\n", + "\n", + " /* Multiple choice (1 answer). Allow for 0 correct\n", + " answers as an edge case */\n", + " if (fb.dataset.numcorrect <= 1) {\n", + " // What follows is for the saved responses stuff\n", + " var outerContainer = fb.parentElement.parentElement;\n", + " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", + " if (responsesContainer) {\n", + " //console.log(responsesContainer);\n", + " var response = label.firstChild.innerText;\n", + " if (label.querySelector(\".QuizCode\")){\n", + " response+= label.querySelector(\".QuizCode\").firstChild.innerText;\n", + " }\n", + " console.log(response);\n", + " //console.log(document.getElementById(\"quizWrap\"+id));\n", + " var qnum = document.getElementById(\"quizWrap\"+id).dataset.qnum;\n", + " console.log(\"Question \" + qnum);\n", + " //console.log(id, \", got numcorrect=\",fb.dataset.numcorrect);\n", + " var responses=JSON.parse(responsesContainer.dataset.responses);\n", + " console.log(responses);\n", + " responses[qnum]= response;\n", + " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", + " printResponses(responsesContainer);\n", + " }\n", + " // End code to preserve responses\n", + "\n", + " for (var i = 0; i < answers.length; i++) {\n", + " var child = answers[i];\n", + " //console.log(child);\n", + " child.className = \"MCButton\";\n", + " }\n", + "\n", + "\n", + "\n", + " if (label.dataset.correct == \"true\") {\n", + " // console.log(\"Correct action\");\n", + " if (\"feedback\" in label.dataset) {\n", + " fb.innerHTML = jaxify(label.dataset.feedback);\n", + " } else {\n", + " fb.innerHTML = \"Correct!\";\n", + " }\n", + " label.classList.add(\"correctButton\");\n", + "\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"correct\");\n", + "\n", + " } else {\n", + " if (\"feedback\" in label.dataset) {\n", + " fb.innerHTML = jaxify(label.dataset.feedback);\n", + " } else {\n", + " fb.innerHTML = \"Incorrect -- try again.\";\n", + " }\n", + " //console.log(\"Error action\");\n", + " label.classList.add(\"incorrectButton\");\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"incorrect\");\n", + " }\n", + " }\n", + " else { /* Many choice (more than 1 correct answer) */\n", + " var reset = false;\n", + " var feedback;\n", + " if (label.dataset.correct == \"true\") {\n", + " if (\"feedback\" in label.dataset) {\n", + " feedback = jaxify(label.dataset.feedback);\n", + " } else {\n", + " feedback = \"Correct!\";\n", + " }\n", + " if (label.dataset.answered <= 0) {\n", + " if (fb.dataset.answeredcorrect < 0) {\n", + " fb.dataset.answeredcorrect = 1;\n", + " reset = true;\n", + " } else {\n", + " fb.dataset.answeredcorrect++;\n", + " }\n", + " if (reset) {\n", + " for (var i = 0; i < answers.length; i++) {\n", + " var child = answers[i];\n", + " child.className = \"MCButton\";\n", + " child.dataset.answered = 0;\n", + " }\n", + " }\n", + " label.classList.add(\"correctButton\");\n", + " label.dataset.answered = 1;\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"correct\");\n", + "\n", + " }\n", + " } else {\n", + " if (\"feedback\" in label.dataset) {\n", + " feedback = jaxify(label.dataset.feedback);\n", + " } else {\n", + " feedback = \"Incorrect -- try again.\";\n", + " }\n", + " if (fb.dataset.answeredcorrect > 0) {\n", + " fb.dataset.answeredcorrect = -1;\n", + " reset = true;\n", + " } else {\n", + " fb.dataset.answeredcorrect--;\n", + " }\n", + "\n", + " if (reset) {\n", + " for (var i = 0; i < answers.length; i++) {\n", + " var child = answers[i];\n", + " child.className = \"MCButton\";\n", + " child.dataset.answered = 0;\n", + " }\n", + " }\n", + " label.classList.add(\"incorrectButton\");\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"incorrect\");\n", + " }\n", + " // What follows is for the saved responses stuff\n", + " var outerContainer = fb.parentElement.parentElement;\n", + " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", + " if (responsesContainer) {\n", + " //console.log(responsesContainer);\n", + " var response = label.firstChild.innerText;\n", + " if (label.querySelector(\".QuizCode\")){\n", + " response+= label.querySelector(\".QuizCode\").firstChild.innerText;\n", + " }\n", + " console.log(response);\n", + " //console.log(document.getElementById(\"quizWrap\"+id));\n", + " var qnum = document.getElementById(\"quizWrap\"+id).dataset.qnum;\n", + " console.log(\"Question \" + qnum);\n", + " //console.log(id, \", got numcorrect=\",fb.dataset.numcorrect);\n", + " var responses=JSON.parse(responsesContainer.dataset.responses);\n", + " if (label.dataset.correct == \"true\") {\n", + " if (typeof(responses[qnum]) == \"object\"){\n", + " if (!responses[qnum].includes(response))\n", + " responses[qnum].push(response);\n", + " } else{\n", + " responses[qnum]= [ response ];\n", + " }\n", + " } else {\n", + " responses[qnum]= response;\n", + " }\n", + " console.log(responses);\n", + " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", + " printResponses(responsesContainer);\n", + " }\n", + " // End save responses stuff\n", + "\n", + "\n", + "\n", + " var numcorrect = fb.dataset.numcorrect;\n", + " var answeredcorrect = fb.dataset.answeredcorrect;\n", + " if (answeredcorrect >= 0) {\n", + " fb.innerHTML = feedback + \" [\" + answeredcorrect + \"/\" + numcorrect + \"]\";\n", + " } else {\n", + " fb.innerHTML = feedback + \" [\" + 0 + \"/\" + numcorrect + \"]\";\n", + " }\n", + "\n", + "\n", + " }\n", + "\n", + " if (typeof MathJax != 'undefined') {\n", + " var version = MathJax.version;\n", + " console.log('MathJax version', version);\n", + " if (version[0] == \"2\") {\n", + " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", + " } else if (version[0] == \"3\") {\n", + " MathJax.typeset([fb]);\n", + " }\n", + " } else {\n", + " console.log('MathJax not detected');\n", + " }\n", + "\n", + "}\n", + "\n", + "\n", + "/* Function to produce the HTML buttons for a multiple choice/\n", + " many choice question and to update the CSS tags based on\n", + " the question type */\n", + "function make_mc(qa, shuffle_answers, outerqDiv, qDiv, aDiv, id) {\n", + "\n", + " var shuffled;\n", + " if (shuffle_answers == true) {\n", + " //console.log(shuffle_answers+\" read as true\");\n", + " shuffled = getRandomSubarray(qa.answers, qa.answers.length);\n", + " } else {\n", + " //console.log(shuffle_answers+\" read as false\");\n", + " shuffled = qa.answers;\n", + " }\n", + "\n", + "\n", + " var num_correct = 0;\n", + "\n", + " shuffled.forEach((item, index, ans_array) => {\n", + " //console.log(answer);\n", + "\n", + " // Make input element\n", + " var inp = document.createElement(\"input\");\n", + " inp.type = \"radio\";\n", + " inp.id = \"quizo\" + id + index;\n", + " inp.style = \"display:none;\";\n", + " aDiv.append(inp);\n", + "\n", + " //Make label for input element\n", + " var lab = document.createElement(\"label\");\n", + " lab.className = \"MCButton\";\n", + " lab.id = id + '-' + index;\n", + " lab.onclick = check_mc;\n", + " var aSpan = document.createElement('span');\n", + " aSpan.classsName = \"\";\n", + " //qDiv.id=\"quizQn\"+id+index;\n", + " if (\"answer\" in item) {\n", + " aSpan.innerHTML = jaxify(item.answer);\n", + " //aSpan.innerHTML=item.answer;\n", + " }\n", + " lab.append(aSpan);\n", + "\n", + " // Create div for code inside question\n", + " var codeSpan;\n", + " if (\"code\" in item) {\n", + " codeSpan = document.createElement('span');\n", + " codeSpan.id = \"code\" + id + index;\n", + " codeSpan.className = \"QuizCode\";\n", + " var codePre = document.createElement('pre');\n", + " codeSpan.append(codePre);\n", + " var codeCode = document.createElement('code');\n", + " codePre.append(codeCode);\n", + " codeCode.innerHTML = item.code;\n", + " lab.append(codeSpan);\n", + " //console.log(codeSpan);\n", + " }\n", + "\n", + " //lab.textContent=item.answer;\n", + "\n", + " // Set the data attributes for the answer\n", + " lab.setAttribute('data-correct', item.correct);\n", + " if (item.correct) {\n", + " num_correct++;\n", + " }\n", + " if (\"feedback\" in item) {\n", + " lab.setAttribute('data-feedback', item.feedback);\n", + " }\n", + " lab.setAttribute('data-answered', 0);\n", + "\n", + " aDiv.append(lab);\n", + "\n", + " });\n", + "\n", + " if (num_correct > 1) {\n", + " outerqDiv.className = \"ManyChoiceQn\";\n", + " } else {\n", + " outerqDiv.className = \"MultipleChoiceQn\";\n", + " }\n", + "\n", + " return num_correct;\n", + "\n", + "}\n", + "// Object-oriented wrapper for MC/MANY choice\n", + "class MCQuestion extends Question {\n", + " constructor(qa, id, idx, opts, rootDiv) { super(qa, id, idx, opts, rootDiv); }\n", + " render() {\n", + " //console.log(\"options.shuffleAnswers \" + this.options.shuffleAnswers);\n", + " const numCorrect = make_mc(\n", + " this.qa,\n", + " this.options.shuffleAnswers,\n", + " this.outerqDiv,\n", + " this.qDiv,\n", + " this.aDiv,\n", + " this.id\n", + " );\n", + " if ('answer_cols' in this.qa) {\n", + " this.aDiv.style.gridTemplateColumns =\n", + " 'repeat(' + this.qa.answer_cols + ', 1fr)';\n", + " }\n", + " this.fbDiv.dataset.numcorrect = numCorrect;\n", + " this.wrapper.appendChild(this.fbDiv);\n", + " }\n", + "}\n", + "Question.register('multiple_choice', MCQuestion);\n", + "Question.register('many_choice', MCQuestion);\n", + "function check_numeric(ths, event) {\n", + "\n", + " if (event.keyCode === 13) {\n", + " ths.blur();\n", + "\n", + " var id = ths.id.split('-')[0];\n", + "\n", + " var submission = ths.value;\n", + " if (submission.indexOf('/') != -1) {\n", + " var sub_parts = submission.split('/');\n", + " //console.log(sub_parts);\n", + " submission = sub_parts[0] / sub_parts[1];\n", + " }\n", + " //console.log(\"Reader entered\", submission);\n", + "\n", + " if (\"precision\" in ths.dataset) {\n", + " var precision = ths.dataset.precision;\n", + " submission = Number(Number(submission).toPrecision(precision));\n", + " }\n", + "\n", + "\n", + " //console.log(\"In check_numeric(), id=\"+id);\n", + " //console.log(event.srcElement.id) \n", + " //console.log(event.srcElement.dataset.feedback)\n", + "\n", + " var fb = document.getElementById(\"fb\" + id);\n", + " fb.style.display = \"none\";\n", + " fb.innerHTML = \"Incorrect -- try again.\";\n", + "\n", + " var answers = JSON.parse(ths.dataset.answers);\n", + " //console.log(answers);\n", + "\n", + " var defaultFB = \"Incorrect. Try again.\";\n", + " var correct;\n", + " var done = false;\n", + " answers.every(answer => {\n", + " //console.log(answer.type);\n", + "\n", + " correct = false;\n", + " // if (answer.type==\"value\"){\n", + " if ('value' in answer) {\n", + " var value;\n", + " if (\"precision\" in ths.dataset) {\n", + " value = answer.value.toPrecision(ths.dataset.precision);\n", + " } else {\n", + " value = answer.value;\n", + " }\n", + " if (submission == value) {\n", + " if (\"feedback\" in answer) {\n", + " fb.innerHTML = jaxify(answer.feedback);\n", + " } else {\n", + " fb.innerHTML = jaxify(\"Correct\");\n", + " }\n", + " correct = answer.correct;\n", + " //console.log(answer.correct);\n", + " done = true;\n", + " }\n", + "\n", + " // } else if (answer.type==\"range\") {\n", + " } else if ('range' in answer) {\n", + " console.log(answer.range);\n", + " console.log(submission, submission >=answer.range[0], submission < answer.range[1])\n", + " if ((submission >= answer.range[0]) && (submission < answer.range[1])) {\n", + " fb.innerHTML = jaxify(answer.feedback);\n", + " correct = answer.correct;\n", + " console.log(answer.correct);\n", + " done = true;\n", + " }\n", + " } else if (answer.type == \"default\") {\n", + " if (\"feedback\" in answer) {\n", + " defaultFB = answer.feedback;\n", + " } \n", + " }\n", + " if (done) {\n", + " return false; // Break out of loop if this has been marked correct\n", + " } else {\n", + " return true; // Keep looking for case that includes this as a correct answer\n", + " }\n", + " });\n", + " console.log(\"done:\", done);\n", + "\n", + " if ((!done) && (defaultFB != \"\")) {\n", + " fb.innerHTML = jaxify(defaultFB);\n", + " //console.log(\"Default feedback\", defaultFB);\n", + " }\n", + "\n", + " fb.style.display = \"block\";\n", + " if (correct) {\n", + " ths.className = \"Input-text\";\n", + " ths.classList.add(\"correctButton\");\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"correct\");\n", + " } else {\n", + " ths.className = \"Input-text\";\n", + " ths.classList.add(\"incorrectButton\");\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"incorrect\");\n", + " }\n", + "\n", + " // What follows is for the saved responses stuff\n", + " var outerContainer = fb.parentElement.parentElement;\n", + " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", + " if (responsesContainer) {\n", + " console.log(submission);\n", + " var qnum = document.getElementById(\"quizWrap\"+id).dataset.qnum;\n", + " //console.log(\"Question \" + qnum);\n", + " //console.log(id, \", got numcorrect=\",fb.dataset.numcorrect);\n", + " var responses=JSON.parse(responsesContainer.dataset.responses);\n", + " console.log(responses);\n", + " if (submission == ths.value){\n", + " responses[qnum]= submission;\n", + " } else {\n", + " responses[qnum]= ths.value + \"(\" + submission +\")\";\n", + " }\n", + " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", + " printResponses(responsesContainer);\n", + " }\n", + " // End code to preserve responses\n", + "\n", + " if (typeof MathJax != 'undefined') {\n", + " var version = MathJax.version;\n", + " console.log('MathJax version', version);\n", + " if (version[0] == \"2\") {\n", + " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", + " } else if (version[0] == \"3\") {\n", + " MathJax.typeset([fb]);\n", + " }\n", + " } else {\n", + " console.log('MathJax not detected');\n", + " }\n", + " // After correct answer, if next JupyterQuiz question exists and has a text input, scroll by current question height\n", + " if (correct) {\n", + " // find the current question wrapper\n", + " var wrapper = ths.closest('.Quiz');\n", + " if (wrapper) {\n", + " var nextWrapper = wrapper.nextElementSibling;\n", + " if (nextWrapper && nextWrapper.classList.contains('Quiz')) {\n", + " var nextInput = nextWrapper.querySelector('input.Input-text');\n", + " if (nextInput) {\n", + " var height = wrapper.getBoundingClientRect().height;\n", + " console.log(height);\n", + " nextInput.focus();\n", + " }\n", + " }\n", + " }\n", + " }\n", + " return false;\n", + " }\n", + "\n", + "}\n", + "// Object-oriented wrapper for numeric questions\n", + "class NumericQuestion extends Question {\n", + " constructor(qa, id, idx, opts, rootDiv) {\n", + " super(qa, id, idx, opts, rootDiv);\n", + " }\n", + " render() {\n", + " make_numeric(this.qa, this.outerqDiv, this.qDiv, this.aDiv, this.id);\n", + " this.wrapper.appendChild(this.fbDiv);\n", + " }\n", + "}\n", + "Question.register('numeric', NumericQuestion);\n", + "\n", + "function isValid(el, charC) {\n", + " //console.log(\"Input char: \", charC);\n", + " if (charC == 46) {\n", + " if (el.value.indexOf('.') === -1) {\n", + " return true;\n", + " } else if (el.value.indexOf('/') != -1) {\n", + " var parts = el.value.split('/');\n", + " if (parts[1].indexOf('.') === -1) {\n", + " return true;\n", + " }\n", + " }\n", + " else {\n", + " return false;\n", + " }\n", + " } else if (charC == 47) {\n", + " if (el.value.indexOf('/') === -1) {\n", + " if ((el.value != \"\") && (el.value != \".\")) {\n", + " return true;\n", + " } else {\n", + " return false;\n", + " }\n", + " } else {\n", + " return false;\n", + " }\n", + " } else if (charC == 45) {\n", + " var edex = el.value.indexOf('e');\n", + " if (edex == -1) {\n", + " edex = el.value.indexOf('E');\n", + " }\n", + "\n", + " if (el.value == \"\") {\n", + " return true;\n", + " } else if (edex == (el.value.length - 1)) { // If just after e or E\n", + " return true;\n", + " } else {\n", + " return false;\n", + " }\n", + " } else if (charC == 101) { // \"e\"\n", + " if ((el.value.indexOf('e') === -1) && (el.value.indexOf('E') === -1) && (el.value.indexOf('/') == -1)) {\n", + " // Prev symbol must be digit or decimal point:\n", + " if (el.value.slice(-1).search(/\\d/) >= 0) {\n", + " return true;\n", + " } else if (el.value.slice(-1).search(/\\./) >= 0) {\n", + " return true;\n", + " } else {\n", + " return false;\n", + " }\n", + " } else {\n", + " return false;\n", + " }\n", + " } else {\n", + " if (charC > 31 && (charC < 48 || charC > 57))\n", + " return false;\n", + " }\n", + " return true;\n", + "}\n", + "\n", + "function numeric_keypress(evnt) {\n", + " var charC = (evnt.which) ? evnt.which : evnt.keyCode;\n", + "\n", + " if (charC == 13) {\n", + " check_numeric(this, evnt);\n", + " } else {\n", + " return isValid(this, charC);\n", + " }\n", + "}\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "function make_numeric(qa, outerqDiv, qDiv, aDiv, id) {\n", + "\n", + "\n", + "\n", + " //console.log(answer);\n", + "\n", + "\n", + " outerqDiv.className = \"NumericQn\";\n", + " aDiv.style.display = 'block';\n", + "\n", + " var lab = document.createElement(\"label\");\n", + " lab.className = \"InpLabel\";\n", + " lab.innerHTML = \"Type numeric answer here:\";\n", + " aDiv.append(lab);\n", + "\n", + " var inp = document.createElement(\"input\");\n", + " inp.type = \"text\";\n", + " //inp.id=\"input-\"+id;\n", + " inp.id = id + \"-0\";\n", + " inp.className = \"Input-text\";\n", + " inp.setAttribute('data-answers', JSON.stringify(qa.answers));\n", + " if (\"precision\" in qa) {\n", + " inp.setAttribute('data-precision', qa.precision);\n", + " }\n", + " aDiv.append(inp);\n", + " //console.log(inp);\n", + "\n", + " //inp.addEventListener(\"keypress\", check_numeric);\n", + " //inp.addEventListener(\"keypress\", numeric_keypress);\n", + " /*\n", + " inp.addEventListener(\"keypress\", function(event) {\n", + " return numeric_keypress(this, event);\n", + " }\n", + " );\n", + " */\n", + " //inp.onkeypress=\"return numeric_keypress(this, event)\";\n", + " inp.onkeypress = numeric_keypress;\n", + " inp.onpaste = event => false;\n", + "\n", + " inp.addEventListener(\"focus\", function (event) {\n", + " this.value = \"\";\n", + " return false;\n", + " }\n", + " );\n", + "\n", + "\n", + "}\n", + "// Override show_questions to use object-oriented Question API\n", + "function show_questions(json, container) {\n", + " // Accept container element or element ID\n", + " if (typeof container === 'string') {\n", + " container = document.getElementById(container);\n", + " }\n", + " if (!container) {\n", + " console.error('show_questions: invalid container', container);\n", + " return;\n", + " }\n", + "\n", + " const shuffleQuestions = container.dataset.shufflequestions === 'True';\n", + " const shuffleAnswers = container.dataset.shuffleanswers === 'True';\n", + " const preserveResponses = container.dataset.preserveresponses === 'true';\n", + " const maxWidth = parseInt(container.dataset.maxwidth, 10) || 0;\n", + " let numQuestions = parseInt(container.dataset.numquestions, 10) || json.length;\n", + " if (numQuestions > json.length) numQuestions = json.length;\n", + "\n", + " let questions = json;\n", + " if (shuffleQuestions || numQuestions < json.length) {\n", + " questions = getRandomSubarray(json, numQuestions);\n", + " }\n", + "\n", + " questions.forEach((qa, index) => {\n", + " const id = makeid(8);\n", + " const options = {\n", + " shuffleAnswers: shuffleAnswers,\n", + " preserveResponses: preserveResponses,\n", + " maxWidth: maxWidth\n", + " };\n", + " Question.create(qa, id, index, options, container);\n", + " });\n", + "\n", + " if (preserveResponses) {\n", + " const respDiv = document.createElement('div');\n", + " respDiv.id = 'responses' + container.id;\n", + " respDiv.className = 'JCResponses';\n", + " respDiv.dataset.responses = JSON.stringify([]);\n", + " respDiv.innerHTML = 'Select your answers and then follow the directions that will appear here.';\n", + " container.appendChild(respDiv);\n", + " }\n", + "\n", + " // Trigger MathJax typesetting if available\n", + " if (typeof MathJax != 'undefined') {\n", + " console.log(\"MathJax version\", MathJax.version);\n", + " var version = MathJax.version;\n", + " setTimeout(function(){\n", + " var version = MathJax.version;\n", + " console.log('After sleep, MathJax version', version);\n", + " if (version[0] == \"2\") {\n", + " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", + " } else if (version[0] == \"3\") {\n", + " if (MathJax.hasOwnProperty('typeset') ) {\n", + " MathJax.typeset([container]);\n", + " } else {\n", + " console.log('WARNING: Trying to force load MathJax 3');\n", + " window.MathJax = {\n", + " tex: {\n", + " inlineMath: [['$', '$'], ['\\\\(', '\\\\)']]\n", + " },\n", + " svg: {\n", + " fontCache: 'global'\n", + " }\n", + " };\n", + "\n", + " (function () {\n", + " var script = document.createElement('script');\n", + " script.src = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js';\n", + " script.async = true;\n", + " document.head.appendChild(script);\n", + " })();\n", + " }\n", + " }\n", + " }, 500);\n", + "if (typeof version == 'undefined') {\n", + " } else\n", + " {\n", + " if (version[0] == \"2\") {\n", + " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", + " } else if (version[0] == \"3\") {\n", + " if (MathJax.hasOwnProperty('typeset') ) {\n", + " MathJax.typeset([container]);\n", + " } else {\n", + " console.log('WARNING: Trying to force load MathJax 3');\n", + " window.MathJax = {\n", + " tex: {\n", + " inlineMath: [['$', '$'], ['\\\\(', '\\\\)']]\n", + " },\n", + " svg: {\n", + " fontCache: 'global'\n", + " }\n", + " };\n", + "\n", + " (function () {\n", + " var script = document.createElement('script');\n", + " script.src = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js';\n", + " script.async = true;\n", + " document.head.appendChild(script);\n", + " })();\n", + " }\n", + " } else {\n", + " console.log(\"MathJax not found\");\n", + " }\n", + " }\n", + " }\n", + " // if (typeof MathJax !== 'undefined') {\n", + " // const v = MathJax.version;\n", + " // if (v[0] === '2') {\n", + " // MathJax.Hub.Queue(['Typeset', MathJax.Hub]);\n", + " // } else if (v[0] === '3') {\n", + " // MathJax.typeset([container]);\n", + " // }\n", + " // }\n", + "\n", + " // Prevent link clicks from bubbling up\n", + " Array.from(container.getElementsByClassName('Link')).forEach(link => {\n", + " link.addEventListener('click', e => e.stopPropagation());\n", + " });\n", + "}\n", + "function levenshteinDistance(a, b) {\n", + " if (a.length === 0) return b.length;\n", + " if (b.length === 0) return a.length;\n", + "\n", + " const matrix = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(null));\n", + "\n", + " for (let i = 0; i <= a.length; i++) {\n", + " matrix[0][i] = i;\n", + " }\n", + "\n", + " for (let j = 0; j <= b.length; j++) {\n", + " matrix[j][0] = j;\n", + " }\n", + "\n", + " for (let j = 1; j <= b.length; j++) {\n", + " for (let i = 1; i <= a.length; i++) {\n", + " const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n", + " matrix[j][i] = Math.min(\n", + " matrix[j - 1][i] + 1, // Deletion\n", + " matrix[j][i - 1] + 1, // Insertion\n", + " matrix[j - 1][i - 1] + cost // Substitution\n", + " );\n", + " }\n", + " }\n", + " return matrix[b.length][a.length];\n", + "}\n", + "// Object-oriented wrapper for string input questions\n", + "class StringQuestion extends Question {\n", + " constructor(qa, id, idx, opts, rootDiv) {\n", + " super(qa, id, idx, opts, rootDiv);\n", + " }\n", + " render() {\n", + " make_string(this.qa, this.outerqDiv, this.qDiv, this.aDiv, this.id);\n", + " this.wrapper.appendChild(this.fbDiv);\n", + " }\n", + "}\n", + "Question.register('string', StringQuestion);\n", + "\n", + "function check_string(ths, event) {\n", + " if (event.keyCode === 13) {\n", + " ths.blur();\n", + "\n", + " var id = ths.id.split('-')[0];\n", + " var submission = ths.value.trim();\n", + " var fb = document.getElementById(\"fb\" + id);\n", + " fb.style.display = \"none\";\n", + " fb.innerHTML = \"Incorrect -- try again.\";\n", + "\n", + " var answers = JSON.parse(ths.dataset.answers);\n", + " var defaultFB = \"Incorrect. Try again.\";\n", + " var correct;\n", + " var done = false;\n", + "\n", + " // Handle default answer pattern: filter out and capture default feedback\n", + " var filteredAnswers = [];\n", + " answers.forEach(answer => {\n", + " if (answer.type === \"default\") {\n", + " defaultFB = answer.feedback;\n", + " } else {\n", + " filteredAnswers.push(answer);\n", + " }\n", + " });\n", + " answers = filteredAnswers;\n", + "\n", + " answers.every(answer => {\n", + " correct = false;\n", + "\n", + " let match = false;\n", + " if (answer.match_case) {\n", + " match = submission === answer.answer;\n", + " } else {\n", + " match = submission.toLowerCase() === answer.answer.toLowerCase();\n", + " }\n", + " console.log(submission);\n", + " console.log(answer.answer);\n", + " console.log(match);\n", + "\n", + " if (match) {\n", + " if (\"feedback\" in answer) {\n", + " fb.innerHTML = jaxify(answer.feedback);\n", + " } else {\n", + " fb.innerHTML = jaxify(\"Correct\");\n", + " }\n", + " correct = answer.correct;\n", + " done = true;\n", + " } else if (answer.fuzzy_threshold) {\n", + " var max_length = Math.max(submission.length, answer.answer.length);\n", + " var ratio;\n", + " if (answer.match_case) {\n", + " ratio = 1- (levenshteinDistance(submission, answer.answer) / max_length);\n", + " } else {\n", + " ratio = 1- (levenshteinDistance(submission.toLowerCase(),\n", + " answer.answer.toLowerCase()) / max_length);\n", + " }\n", + " if (ratio >= answer.fuzzy_threshold) {\n", + " if (\"feedback\" in answer) {\n", + " fb.innerHTML = jaxify(\"(Fuzzy) \" + answer.feedback);\n", + " } else {\n", + " fb.innerHTML = jaxify(\"Correct\");\n", + " }\n", + " correct = answer.correct;\n", + " done = true;\n", + " }\n", + "\n", + " }\n", + "\n", + " if (done) {\n", + " return false;\n", + " } else {\n", + " return true;\n", + " }\n", + " });\n", + "\n", + " if ((!done) && (defaultFB != \"\")) {\n", + " fb.innerHTML = jaxify(defaultFB);\n", + " }\n", + "\n", + " fb.style.display = \"block\";\n", + " if (correct) {\n", + " ths.className = \"Input-text\";\n", + " ths.classList.add(\"correctButton\");\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"correct\");\n", + " } else {\n", + " ths.className = \"Input-text\";\n", + " ths.classList.add(\"incorrectButton\");\n", + " fb.className = \"Feedback\";\n", + " fb.classList.add(\"incorrect\");\n", + " }\n", + "\n", + " var outerContainer = fb.parentElement.parentElement;\n", + " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", + " if (responsesContainer) {\n", + " var qnum = document.getElementById(\"quizWrap\" + id).dataset.qnum;\n", + " var responses = JSON.parse(responsesContainer.dataset.responses);\n", + " responses[qnum] = submission;\n", + " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", + " printResponses(responsesContainer);\n", + " }\n", + "\n", + " if (typeof MathJax != 'undefined') {\n", + " var version = MathJax.version;\n", + " if (version[0] == \"2\") {\n", + " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", + " } else if (version[0] == \"3\") {\n", + " MathJax.typeset([fb]);\n", + " }\n", + " } else {\n", + " console.log('MathJax not detected');\n", + " }\n", + " // After correct answer, if next JupyterQuiz question exists and has a text input, scroll by current question height\n", + " if (correct) {\n", + " var wrapper = ths.closest('.Quiz');\n", + " if (wrapper) {\n", + " var nextWrapper = wrapper.nextElementSibling;\n", + " if (nextWrapper && nextWrapper.classList.contains('Quiz')) {\n", + " var nextInput = nextWrapper.querySelector('input.Input-text');\n", + " if (nextInput) {\n", + " var height = wrapper.getBoundingClientRect().height;\n", + " nextInput.focus();\n", + " }\n", + " }\n", + " }\n", + " }\n", + " return false;\n", + " }\n", + "}\n", + "\n", + "function string_keypress(evnt) {\n", + " var charC = (evnt.which) ? evnt.which : evnt.keyCode;\n", + "\n", + " if (charC == 13) {\n", + " check_string(this, evnt);\n", + " } \n", + "}\n", + "\n", + "\n", + "function make_string(qa, outerqDiv, qDiv, aDiv, id) {\n", + " outerqDiv.className = \"StringQn\";\n", + " aDiv.style.display = 'block';\n", + "\n", + " var lab = document.createElement(\"label\");\n", + " lab.className = \"InpLabel\";\n", + " lab.innerHTML = \"Type your answer here:\";\n", + " aDiv.append(lab);\n", + "\n", + " var inp = document.createElement(\"input\");\n", + " inp.type = \"text\";\n", + " inp.id = id + \"-0\";\n", + " inp.className = \"Input-text\";\n", + " inp.setAttribute('data-answers', JSON.stringify(qa.answers));\n", + " // Apply optional input width (approx. number of characters, in em units)\n", + " if (qa.input_width != null) {\n", + " inp.style['min-width'] = qa.input_width + 'em';\n", + " }\n", + " aDiv.append(inp);\n", + "\n", + " inp.onkeypress = string_keypress;\n", + " inp.onpaste = event => false;\n", + "\n", + " inp.addEventListener(\"focus\", function (event) {\n", + " this.value = \"\";\n", + " return false;\n", + " });\n", + "}\n", + "/*\n", + " * Handle asynchrony issues when re-running quizzes in Jupyter notebooks.\n", + " * Ensures show_questions is called after the container div is in the DOM.\n", + " */\n", + "function try_show() {\n", + " if (document.getElementById(\"oWSEkZnrBwzN\")) {\n", + " show_questions(questionsoWSEkZnrBwzN, oWSEkZnrBwzN);\n", + " } else {\n", + " setTimeout(try_show, 200);\n", + " }\n", + "};\n", + "// Invoke immediately\n", + "{\n", + " try_show();\n", + "}\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "#%pip install jupyterquiz\n", "from jupyterquiz import display_quiz\n", @@ -207,12 +1746,12 @@ "source": [ "## Conclusion \n", "In this lesson, you learned:\n", - "- Programs can be short lines of just text\n", - "- Comments are created with #\n", - "- Functions typically receive arguments in parenthesis and act on them, while method are actions that can be done on certain kinds of data\n", - "- To find out more background, write help(function)\n", - "- To edit functions or methods and run them on your own\n", - "- Python can import other functionalities (or not) to maximize performance efficiency\n", + "- Programs can be short lines of just text.\n", + "- Comments are created with #.\n", + "- Functions typically receive arguments in parentheses and act on them, while methods are actions that can be done on certain kinds of data.\n", + "- To find out more background, you can use the help(function).\n", + "- To edit functions or methods and run them on your own.\n", + "- Python can import other functionalities (or not) to maximize performance efficiency.\n", "\n", "Time to go on to learn about [variables!](./Submodule_1_Tutorial2_Variables.ipynb)" ] @@ -243,7 +1782,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb b/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb index 0fc8799..35add76 100755 --- a/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb +++ b/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb @@ -34,10 +34,10 @@ "source": [ "## Learning Objectives\n", "After this session, you will be able to :\n", - "- Recognize Python's rules for naming and using variables\n", - "- Recognize that variables can hold different data types which are dynamically typed (you don’t need to declare the type of a variable)\n", - "- Use basic string functions\n", - "- Allow you to capture user input to a variable\n", + "- Recognize Python's rules for naming and using variables.\n", + "- Recognize that variables can hold different data types which are dynamically typed (you don’t need to declare the type of a variable).\n", + "- Use basic string functions.\n", + "- Allow you to capture user input to a variable.\n", "\n", "## Prerequisites\n", "\n", @@ -49,10 +49,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "52d5b3cc-839a-4ebd-ab24-95f25d315158", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T14:26:19.664162Z", + "iopub.status.busy": "2025-06-09T14:26:19.663822Z", + "iopub.status.idle": "2025-06-09T14:26:21.282893Z", + "shell.execute_reply": "2025-06-09T14:26:21.281919Z", + "shell.execute_reply.started": "2025-06-09T14:26:19.664140Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: jupyterquiz in /opt/conda/lib/python3.12/site-packages (2.9.6.2)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ "%pip install jupyterquiz\n", "from jupyterquiz import display_quiz" @@ -105,9 +122,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "d7368b6d-9119-44cf-8a28-2572cf6ba6c2", - "metadata": {}, + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T14:27:03.969048Z", + "iopub.status.busy": "2025-06-09T14:27:03.968309Z", + "iopub.status.idle": "2025-06-09T14:27:03.972424Z", + "shell.execute_reply": "2025-06-09T14:27:03.971768Z", + "shell.execute_reply.started": "2025-06-09T14:27:03.969017Z" + } + }, "outputs": [], "source": [ "# The style guide says variables should be all lowercase with words separated by the underscore\n", @@ -124,10 +149,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "acc12cb1-eaa6-41bf-a8c4-8c17a777e115", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T14:27:07.271642Z", + "iopub.status.busy": "2025-06-09T14:27:07.271302Z", + "iopub.status.idle": "2025-06-09T14:27:07.457073Z", + "shell.execute_reply": "2025-06-09T14:27:07.456003Z", + "shell.execute_reply.started": "2025-06-09T14:27:07.271618Z" + } + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'my_Var' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mmy_Var\u001b[49m)\t\u001b[38;5;66;03m# throws an error, the case is different from the declaration\u001b[39;00m\n", + "\u001b[0;31mNameError\u001b[0m: name 'my_Var' is not defined" + ] + } + ], "source": [ "print(my_Var)\t# throws an error, the case is different from the declaration" ] @@ -157,10 +202,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "693dc4fa-6f9a-4327-81c8-ec8c43b487e7", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T14:27:32.711998Z", + "iopub.status.busy": "2025-06-09T14:27:32.711288Z", + "iopub.status.idle": "2025-06-09T14:27:32.715703Z", + "shell.execute_reply": "2025-06-09T14:27:32.715041Z", + "shell.execute_reply.started": "2025-06-09T14:27:32.711968Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Python is case-sensitive\n" + ] + } + ], "source": [ "print(my_var)\t# This is OK, because we have defined a variable my_var, but not my_Var" ] @@ -539,7 +600,7 @@ "Strings have some other special properties in Python.\n", "
    \n", "
    \n", - "Strings are also a sequence object, so are iterable. But, they cannot have characters substituted (they are \"immutable\")" + "Strings are also a sequence object, so are iterable. But, they cannot have characters substituted. This means they are \"immutable\"." ] }, { @@ -619,7 +680,7 @@ "
    \n", "
    \n", "To do this, use the str() function to convert a number variable to a string or a string to a number with the int() function:\n", - "
    Tip: Try this: remove the str() around X in the \"Sarah is\" statement to see what happens if you treat an integer like a string WITHOUT converting it
    " + "
    Tip: Try this: remove the str() around X in the \"Sarah is\" statement to see what happens if you treat an integer like a string WITHOUT converting it.
    " ] }, { @@ -658,8 +719,8 @@ "- How to display characters which you can't see (like tabs and spaces)\n", "- How to display a quotation mark\n", "
    \n", - "
    \n", - "For this, we use the escape character \\ (backslash)." + "\n", + "For this, we use the escape character \"\\\" (backslash)." ] }, { @@ -680,9 +741,9 @@ "\n", "\n", "
    \n", - "The official Python documentation for use of the escape character: https://docs.python.org/3/reference/lexical_analysis.html#literals\n", + "The official Python documentation for use of the escape character: [link](https://docs.python.org/3/reference/lexical_analysis.html#literals)\n", "
    \n", - "Try running the examples below which help you to deal with the requirement in Windows to use backslashes to designate subfolders:" + "Try running the examples below — they will help you deal with the requirement in **Windows** to use backslashes (`\\`) when specifying subfolders." ] }, { @@ -747,8 +808,7 @@ "We can add, divide, concatenate, assign values and many more things.\n", "
    \n", "
    \n", - "It’s important to understand that operators are \"polymorphic\".\n", - "- That is, they behave differently depending upon what it is they are operating on.\n", + "It’s important to understand that operators are \"polymorphic\". That is, they behave differently depending upon what it is they are operating on.\n", "
    \n", "For example, the **+** operator adds numbers but concatenates strings." ] @@ -784,8 +844,7 @@ "print(\"Welcome, \", player1)\n", "\n", "# Square a Number. Again, even though we are asking for a number,\n", - "# the input will still be a string so we will have to convert\n", - "# using what is called a \"cast\" (see below).\n", + "# the input will still be a string so we will have to convert using what is called a \"cast\" (see below).\n", "# In this case, we are casting the string to a float (floating point number).\n", "num1 = input(\"Enter the number you would like me to square: \")\n", "num2 = float(num1)\n", @@ -801,9 +860,17 @@ "Now it’s your turn to apply what you have learned. \n", "\n", "A common unit of bioinformatics data is a FASTA DNA sequence. It looks like this:\n", - ">crab_anapl ALPHA CRYSTALLIN B CHAIN (ALPHA(B)-CRYSTALLIN). \r\n", - "MDITIHNPLIRRPLFSWLAPSRIFDQIFGEHLQESELLPASPSLSPFLM\n", "\n", + "```\n", + ">crab_anapl ALPHA CRYSTALLIN B CHAIN (ALPHA(B)-CRYSTALLIN). \r\n", + "MDITIHNPLIRRPLFSWLAPSRIFDQIFGEHLQESELLPASPSLSPFLM```R" + ] + }, + { + "cell_type": "markdown", + "id": "012aa05c-b112-4828-b8d2-e9234f56125e", + "metadata": {}, + "source": [ "The first line starts with a > then the name\n", "The second (and subsequent) line(s) have DNA, RNA, or protein sequences.R" ] @@ -817,10 +884,10 @@ "
    \n", "\n", "
      \n", - "
    • Prompt for input \"FASTA sequence name: \"\n", - "
    • Prompt for input \"What is the DNA sequence? (use ATGC or atgc) of at least 10 bases \"\n", + "
    • Prompt for input \"FASTA sequence name. \"\n", + "
    • Prompt for input \"What is the DNA sequence? (use ATGC or atgc) of at least 10 bases.\"\n", "
    • Output \"The DNA fragment is: > (since > starts all FASTA sequences) then string together the fragment name, \"\\n\" to get a return and the DNA sequence.\n", - "
    • Print just the last letter of the FASTA code (or any position(s) you choose?)\n", + "
    • Print just the last letter of the FASTA code (or any position(s) you choose).\n", "
    \n", "\n", "The solution is at the end of this Jupyter notebook, after the wrap up." @@ -843,7 +910,7 @@ "source": [ "### Test Your Knowledge\n", "\n", - "Take the following quizzes to check your coding knowledge." + "Take the following quiz to check your coding knowledge." ] }, { @@ -865,9 +932,9 @@ "source": [ "# Conclusion \n", "\n", - "By now, you should have a basic grasp of some of the ways that variables can hold information that Python will process using scripts. .\n", + "By now, you should have a basic grasp of some of the ways that variables can hold information and be used in Python scripts.\n", "
    \n", - "With that foundation, we will can look at more advanced [data structures](./Submodule_1_Tutorial3_DataStructures.ipynb) which will be necessary for Bioinformatics." + "With that foundation, we will look at more advanced [data structures](./Submodule_1_Tutorial3_DataStructures.ipynb)." ] }, { @@ -919,7 +986,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_1/Submodule_1_Tutorial3_DataStructures.ipynb b/Submodule_1/Submodule_1_Tutorial3_DataStructures.ipynb index b2843ef..3ad3c06 100755 --- a/Submodule_1/Submodule_1_Tutorial3_DataStructures.ipynb +++ b/Submodule_1/Submodule_1_Tutorial3_DataStructures.ipynb @@ -6,9 +6,10 @@ "metadata": {}, "source": [ "# Overview: Complex Data Structures\n", - "-------------------------------------------------------------------------------------------------\n", "\n", - "In this tutorial we will move past simple variables to explore more complex and mutable data types. We have already explored basic data types (string, integer). However, these basic types often fall short of the kinds of structures that would be helpful for Python programming in general and bioinformatics processing in particular. Two key data types are provided by Python: will be common to Python (list & dictionaries) while two classes will be imported from Biopython (Seq & SeqRecord)" + "In this tutorial, we will move beyond simple variables to explore more complex and mutable data types. We have already looked at basic data types such as strings and integers. However, these basic types often fall short of the kinds of structures that are useful for Python programming in general—and bioinformatics processing in particular.\n", + "\n", + "Python provides two key data types that are commonly used: lists and dictionaries. Additionally, we will import two important classes from Biopython: Seq and SeqRecord." ] }, { @@ -18,8 +19,8 @@ "source": [ "## Prerequisites\n", "
      \n", - "
    • Submodule Lesson 1:
    • \n", - "
    • Submodule 1 lesson 2: Variables
    • \n", + "
    • Submodule 1- Tutorial 1: Python Overview
    • \n", + "
    • Submodule 1- Tutorial 2: Variables
    • \n", "
    " ] }, @@ -89,10 +90,10 @@ "
    \n", "
    \n", "The contents of a list can be:\n", - "+ edited (they are mutable)\n", - "+ concatenated using $ + $\n", - "+ nested\n", - "+ indexed\n", + "+ edited (they are mutable).\n", + "+ concatenated using \"+\".\n", + "+ nested.\n", + "+ indexed.\n", "+ members can be accessed using [] brackets. Counting starts at 0 but indexing can be positive or negative (as we saw with strings.)" ] }, @@ -172,10 +173,9 @@ "id": "60a241ff-9ea0-4597-852b-23166d37d261", "metadata": {}, "source": [ - "Lists can be aldo be \"nested.\" In other words, a list can contain other lists, which can contain still more lists (or other variable types), and so on. \n", + "Lists can be also be \"nested.\" In other words, a list can contain other lists, which can contain still more lists (or other variable types), and so on. \n", "
    \n", - "We will, in the code box, create a list with two elements\n", - "Each element is a list with a pair of words\n", + "We will, in the code box, create a list with two elements. Each element is a list with a pair of words.\n", "\n", "
    Tip: Try to add another two-part element nested_list.
    " ] @@ -214,7 +214,7 @@ "id": "4edb6835-0dc3-4869-b66f-711f711c84be", "metadata": {}, "source": [ - "
    We can append, insert, and remove list elements.​
    " + "We can append, insert, and remove list elements." ] }, { @@ -251,7 +251,7 @@ "So one element ends up holding an entire list, rather than just one element.\n", "
    \n", "
    \n", - "To fix this problem, use **extend**, rather than **append**:" + "To fix this problem, use **extend**, rather than **append**." ] }, { @@ -279,15 +279,11 @@ "source": [ "# Exercise\n", "\n", - "Test your skill:\n", - "
    \n", - "- Create a list using the numbers 1 through 5​\n", - "
    \n", - "- Create a list using the letters a-e​\n", - "
    \n", - "- Add the lists together and print the result​\n", - "
    \n", - "- Try multiply operator *, what happens?​" + "Test your skill: Create a list using the numbers 1 through 5\n", + "\n", + "- Create a list using the letters a-e\n", + "- Add the lists together and print the result\n", + "- Try multiply operator *, what happens?" ] }, { @@ -305,9 +301,7 @@ "source": [ "## Slicing\n", "\n", - "Slicing is a useful way to get a portion of a string or of a list. In bioinformatics, we might want to look at the first 3 bases or amino acids in each string in a FASTA file. \n", - "
    \n", - "Slicing has 3 arguments.\n", + "Slicing is a useful way to get a portion of a string or of a list. In bioinformatics, we might want to look at the first 3 bases or amino acids in each string in a FASTA file. Slicing has 3 arguments.\n", "\n", "- [ start : stop : increment ]\n", "\n", @@ -315,7 +309,7 @@ "\n", "With slicing, start/stop can be *negative*, impying count from the end.\n", "\n", - "Increment default value is 1, but it can be any integer (including negative)." + "The increment default value is 1, but it can be any integer (including negative)." ] }, { @@ -403,7 +397,7 @@ "metadata": {}, "source": [ "# Test Your Knowledge\n", - "Now it’s your turn to apply what you have learned in the following maatching quiz exercise. You **should feel free** to write the code in a Python cell if you cannot predict the outcome. " + "Now it’s your turn to apply what you have learned in the following matching quiz exercise. You **should feel free** to write the code in a Python cell if you cannot predict the outcome. " ] }, { @@ -432,18 +426,19 @@ "metadata": {}, "source": [ "In bioinformatics, you often need lookup tools or to access parts of a long set of data, without having to know the data's position in a list. The ideal tool for this is a python **dictionary**. \n", - "
    \n", + "\n", + "\n", "In Python, a dictionary is a data structure that stores data in **key-value pairs.** As you can see in the next code box, an example is a dictionary for the genetic code.\n", "\n", "The basic properties of a dictionary are:\n", " + Key-Value Pairs: Each item in a dictionary consists of a unique key and its corresponding value. Think of it like a real-world dictionary where words are the keys and their definitions are the value. Or, for the genetic code, where AUG is the key and Met or Methionine is the value\n", " + Unordered: Unlike lists, dictionaries don't maintain any inherent order for the elements\n", - " + Mutabile: You can add, remove, or modify items in a dictionary after its created\n", + " + Mutable: You can add, remove, or modify items in a dictionary after its created\n", " + Accessing Values: You retrieve values by using their associated keys\n", " + Creating dictionaries: use curly braces {}\n", "
    \n", "\n", - "Let's examine a few common examples" + "Let's examine a few common examples." ] }, { @@ -485,7 +480,7 @@ "Other useful dictionary functions:\n", "\n", "- **del** (This is a keyword, for removing an element),\n", - "- **update()** (This is a method of adding new elements)\n", + "- **update** (This is a method of adding new elements)\n", "
    \n", "
    \n", "Let's see some examples:" @@ -622,23 +617,22 @@ "id": "dd897b29-c445-43c5-983b-3fdb59ed8d9a", "metadata": {}, "source": [ - "## SeqRecord\n", + "### The SeqRecord Object in Biopython\n", "\n", - "In Biopython, the SeqRecord object is used to hold a biological sequence along with its associated metadata.\n", + "In Biopython, the SeqRecord object is used to hold a biological sequence along with its associated metadata.\n", "\n", - "If you are familiar with GenBank or EMBL data structures, you can see that the SeqRecord is well-equipped to include the variety of informative data pieces that are used in addition to the simple DNA or Protein sequence alone.\n", + "If you are familiar with GenBank or EMBL data structures, you’ll see that SeqRecord is well-equipped to store the wide range of informative data often included in addition to the DNA or protein sequence itself.\n", "\n", - "A SeqRecord works a bit like a * dictionary * with some built-in keys that all files will have.\n", + "A SeqRecord behaves somewhat like a *dictionary*, with several built-in attributes that are commonly found across different biological file formats.\n", "\n", - "With a SeqRecord, the key attributes you can access directly are:\n", - "
      \n", - "
    • ID: the sequence identifier
    • \n", - "
    • name: the sequence name
    • \n", - "
    • description: a descriptive string
    • \n", - "
    • seq: The biological sequence, stored as a Seq object
    • \n", - "
    • features: A list of SeqFeature objects which provide structured information about features like gene locations, domains, or other relevant biological annotations on the sequence
    • \n", - "
    • dbxrefs: a list of database cross-references
    • \n", - "
    " + "With a SeqRecord, the key attributes you can access directly include:\n", + "\n", + "- id: The sequence identifier \n", + "- name: The sequence name \n", + "- description: A descriptive string \n", + "- seq: The biological sequence, stored as a Seq object \n", + "- features: A list of SeqFeature objects, which provide structured information about features like gene locations, protein domains, or other biological annotations \n", + "- dbxrefs: A list of database cross-references \n" ] }, { @@ -656,10 +650,9 @@ "id": "b98e62fd-c160-4cb9-bd75-d1d7188f02ed", "metadata": {}, "source": [ - "# Conclusion\r\n", - "After this Tutorial, you've learned to work with several different data structures that are common to bioinformatic data sets.\n", - "
    \n", - "The next tutorial will use tools to analyze and import dataset using [Functions](./Submodule_1_Tutorial4_Functions.ipynb)." + "# Conclusion\r", + "Inr thistTutorial, you've learned to work with several different data structures that are common to bioinformatic data sets.\n", + "
    In thee next tutorial will use tools to analyze and import datasest using [Functions](./Submodule_1_Tutorial4_Functions.ipynb)." ] }, { @@ -688,7 +681,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, From 5b8f5e4f70af7f721504d16e1f81cbccd7cdf142 Mon Sep 17 00:00:00 2001 From: RamiyapriyaS-NIH Date: Mon, 9 Jun 2025 15:59:05 +0000 Subject: [PATCH 05/10] Ignore Jupyter checkpoints --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87620ac --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.ipynb_checkpoints/ From dda30528cae2cb95316f1d2ce5ea08981c709771 Mon Sep 17 00:00:00 2001 From: RamiyapriyaS-NIH Date: Mon, 9 Jun 2025 16:00:00 +0000 Subject: [PATCH 06/10] Further edits to Submodule 1 tutorials --- ...Submodule_1_Tutorial1_PythonOverview.ipynb | 1581 +---------------- .../Submodule_1_Tutorial2_Variables.ipynb | 83 +- .../Submodule_1_Tutorial4_Functions.ipynb | 2 +- 3 files changed, 33 insertions(+), 1633 deletions(-) diff --git a/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb b/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb index f658e5c..8bcc85b 100755 --- a/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb +++ b/Submodule_1/Submodule_1_Tutorial1_PythonOverview.ipynb @@ -33,85 +33,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "9f1b88e0-7934-4205-a643-839f9d3cc457", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T13:36:56.807191Z", - "iopub.status.busy": "2025-06-09T13:36:56.806827Z", - "iopub.status.idle": "2025-06-09T13:37:12.942153Z", - "shell.execute_reply": "2025-06-09T13:37:12.941359Z", - "shell.execute_reply.started": "2025-06-09T13:36:56.807165Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting jupyterquiz\n", - " Downloading jupyterquiz-2.9.6.2-py2.py3-none-any.whl.metadata (16 kB)\n", - "Downloading jupyterquiz-2.9.6.2-py2.py3-none-any.whl (25 kB)\n", - "Installing collected packages: jupyterquiz\n", - "Successfully installed jupyterquiz-2.9.6.2\n", - "Note: you may need to restart the kernel to use updated packages.\n", - "Requirement already satisfied: pip in /opt/conda/lib/python3.12/site-packages (25.1.1)\n", - "Note: you may need to restart the kernel to use updated packages.\n", - "Requirement already satisfied: numpy in /opt/conda/lib/python3.12/site-packages (1.26.4)\n", - "Collecting numpy\n", - " Downloading numpy-2.3.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (62 kB)\n", - "Requirement already satisfied: pandas in /opt/conda/lib/python3.12/site-packages (2.2.3)\n", - "Collecting pandas\n", - " Downloading pandas-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (91 kB)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.12/site-packages (from pandas) (2.9.0.post0)\n", - "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.12/site-packages (from pandas) (2024.2)\n", - "Requirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.12/site-packages (from pandas) (2025.2)\n", - "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", - "Downloading numpy-2.3.0-cp312-cp312-manylinux_2_28_x86_64.whl (16.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.6/16.6 MB\u001b[0m \u001b[31m182.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hDownloading pandas-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.0/12.0 MB\u001b[0m \u001b[31m175.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hInstalling collected packages: numpy, pandas\n", - "\u001b[2K Attempting uninstall: numpy\n", - "\u001b[2K Found existing installation: numpy 1.26.4\n", - "\u001b[2K Uninstalling numpy-1.26.4:\n", - "\u001b[2K Successfully uninstalled numpy-1.26.4\n", - "\u001b[2K Attempting uninstall: pandas━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0/2\u001b[0m [numpy]\n", - "\u001b[2K Found existing installation: pandas 2.2.30m━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1/2\u001b[0m [pandas]\n", - "\u001b[2K Uninstalling pandas-2.2.3:0m\u001b[90m╺\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1/2\u001b[0m [pandas]\n", - "\u001b[2K Successfully uninstalled pandas-2.2.3━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1/2\u001b[0m [pandas]\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2/2\u001b[0m [pandas]2m1/2\u001b[0m [pandas]\n", - "\u001b[1A\u001b[2K\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "autogluon-multimodal 1.3.0 requires nvidia-ml-py3<8.0,>=7.352.0, which is not installed.\n", - "amazon-sagemaker-jupyter-ai-q-developer 1.2.4 requires numpy<=2.0.1, but you have numpy 2.3.0 which is incompatible.\n", - "amazon-sagemaker-sql-magic 0.1.4 requires numpy<2, but you have numpy 2.3.0 which is incompatible.\n", - "autogluon-common 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", - "autogluon-common 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", - "autogluon-core 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", - "autogluon-core 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", - "autogluon-features 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", - "autogluon-features 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", - "autogluon-multimodal 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", - "autogluon-multimodal 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", - "autogluon-multimodal 1.3.0 requires transformers[sentencepiece]<4.50,>=4.38.0, but you have transformers 4.51.3 which is incompatible.\n", - "autogluon-tabular 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", - "autogluon-tabular 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", - "autogluon-timeseries 1.3.0 requires coreforecast<0.0.16,>=0.0.12, but you have coreforecast 0.0.16 which is incompatible.\n", - "autogluon-timeseries 1.3.0 requires numpy<2.3.0,>=1.25.0, but you have numpy 2.3.0 which is incompatible.\n", - "autogluon-timeseries 1.3.0 requires pandas<2.3.0,>=2.0.0, but you have pandas 2.3.0 which is incompatible.\n", - "autogluon-timeseries 1.3.0 requires transformers[sentencepiece]<4.50,>=4.38.0, but you have transformers 4.51.3 which is incompatible.\n", - "catboost 1.2.7 requires numpy<2.0,>=1.16.0, but you have numpy 2.3.0 which is incompatible.\n", - "gluonts 0.16.1 requires numpy<2.2,>=1.16, but you have numpy 2.3.0 which is incompatible.\n", - "langchain-aws 0.2.19 requires boto3>=1.37.24, but you have boto3 1.37.1 which is incompatible.\n", - "numba 0.61.2 requires numpy<2.3,>=1.24, but you have numpy 2.3.0 which is incompatible.\n", - "sagemaker 2.244.0 requires numpy==1.26.4, but you have numpy 2.3.0 which is incompatible.\n", - "spacy 3.8.5 requires thinc<8.4.0,>=8.3.4, but you have thinc 8.3.2 which is incompatible.\n", - "sparkmagic 0.21.0 requires pandas<2.0.0,>=0.17.1, but you have pandas 2.3.0 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0mSuccessfully installed numpy-2.3.0 pandas-2.3.0\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "%pip install jupyterquiz\n", "%pip install --upgrade pip \n", @@ -135,26 +60,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "4c221b80-a947-44bd-8454-5d0e3491f6d0", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T13:40:44.070384Z", - "iopub.status.busy": "2025-06-09T13:40:44.070008Z", - "iopub.status.idle": "2025-06-09T13:40:44.074066Z", - "shell.execute_reply": "2025-06-09T13:40:44.073248Z", - "shell.execute_reply.started": "2025-06-09T13:40:44.070361Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello World!\n" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "print(\"Hello World!\")" ] @@ -188,39 +97,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "e8bbb045-3327-476b-97cd-fd9c6db5df30", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T13:55:42.647555Z", - "iopub.status.busy": "2025-06-09T13:55:42.647274Z", - "iopub.status.idle": "2025-06-09T13:55:42.716369Z", - "shell.execute_reply": "2025-06-09T13:55:42.715515Z", - "shell.execute_reply.started": "2025-06-09T13:55:42.647533Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Drosophila melanogaster\n" - ] - }, - { - "data": { - "text/html": [ - "
    After fetching the ability to do italics: Drosophila melanogaster\n",
    -       "
    \n" - ], - "text/plain": [ - "After fetching the ability to do italics: \u001b[3mDrosophila melanogaster\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "metadata": {}, + "outputs": [], "source": [ "print(\"Drosophila melanogaster\")\n", "\n", @@ -241,47 +121,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "5945b1cd-a2a2-432c-8391-4384e040042b", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T13:56:09.723818Z", - "iopub.status.busy": "2025-06-09T13:56:09.723131Z", - "iopub.status.idle": "2025-06-09T13:56:09.730528Z", - "shell.execute_reply": "2025-06-09T13:56:09.729719Z", - "shell.execute_reply.started": "2025-06-09T13:56:09.723787Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    Bioinformatics is the number 1 approach to DNA analysis.\n",
    -       "
    \n" - ], - "text/plain": [ - "Bioinformatics is the number \u001b[1;36m1\u001b[0m approach to DNA analysis.\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
    >new_dna_sequence \n",
    -       "AGCCTAGCCTAGATTGTCTA\n",
    -       "
    \n" - ], - "text/plain": [ - ">new_dna_sequence \n", - "AGCCTAGCCTAGATTGTCTA\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "metadata": {}, + "outputs": [], "source": [ "print(\"Bioinformatics is the number\", 1, \"approach to DNA analysis.\") #what happens if you eliminate quotation marks?\n", "\n", @@ -301,38 +144,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "c5f018b3-c944-4273-9853-8734969256ec", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T13:56:28.971615Z", - "iopub.status.busy": "2025-06-09T13:56:28.971259Z", - "iopub.status.idle": "2025-06-09T13:56:28.976211Z", - "shell.execute_reply": "2025-06-09T13:56:28.975402Z", - "shell.execute_reply.started": "2025-06-09T13:56:28.971592Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function print in module rich:\n", - "\n", - "print(*objects: Any, sep: str = ' ', end: str = '\\n', file: Optional[IO[str]] = None, flush: bool = False) -> None\n", - " Print object(s) supplied via positional arguments.\n", - " This function has an identical signature to the built-in print.\n", - " For more advanced features, see the :class:`~rich.console.Console` class.\n", - "\n", - " Args:\n", - " sep (str, optional): Separator between printed objects. Defaults to \" \".\n", - " end (str, optional): Character to write at end of output. Defaults to \"\\\\n\".\n", - " file (IO[str], optional): File to write to, or None for stdout. Defaults to None.\n", - " flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False.\n", - "\n" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "help(print)" ] @@ -347,29 +162,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "5f769377-13cc-454c-93f6-61378fac539b", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T13:56:38.904314Z", - "iopub.status.busy": "2025-06-09T13:56:38.904036Z", - "iopub.status.idle": "2025-06-09T13:56:38.909949Z", - "shell.execute_reply": "2025-06-09T13:56:38.908972Z", - "shell.execute_reply.started": "2025-06-09T13:56:38.904294Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'HGYCU'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "metadata": {}, + "outputs": [], "source": [ "\"hgycu\".upper() #this method does not need any information in the parenthesis, but some do" ] @@ -393,1345 +189,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "efd9b3cc-cc33-4fbd-8670-c1f555efb77d", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T13:56:50.568392Z", - "iopub.status.busy": "2025-06-09T13:56:50.568109Z", - "iopub.status.idle": "2025-06-09T13:56:50.579304Z", - "shell.execute_reply": "2025-06-09T13:56:50.578152Z", - "shell.execute_reply.started": "2025-06-09T13:56:50.568364Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "var questionsoWSEkZnrBwzN=[\n", - " \n", - " {'question': 'What is the purpose of the help(x) function in Python??',\n", - " 'type': 'multiple_choice',\n", - " 'answers': [\n", - " {'code': 'To execute a Python program, X', 'correct': false},\n", - " {'code': 'To display information about function or tool X', 'correct': true},\n", - "\t {'code': 'To fix errors in the code of X', 'correct': false},\n", - " ]\n", - " },\n", - "]\n", - ";\n", - "\n", - "if (typeof Question === 'undefined') {\n", - "// Make a random ID\n", - "function makeid(length) {\n", - " var result = [];\n", - " var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n", - " var charactersLength = characters.length;\n", - " for (var i = 0; i < length; i++) {\n", - " result.push(characters.charAt(Math.floor(Math.random() * charactersLength)));\n", - " }\n", - " return result.join('');\n", - "}\n", - "// Convert LaTeX delimiters and markdown links to HTML\n", - "function jaxify(string) {\n", - " let mystring = string;\n", - " let count = 0, count2 = 0;\n", - " let loc = mystring.search(/([^\\\\]|^)(\\$)/);\n", - " let loc2 = mystring.search(/([^\\\\]|^)(\\$\\$)/);\n", - " while (loc >= 0 || loc2 >= 0) {\n", - " if (loc2 >= 0) {\n", - " mystring = mystring.replace(/([^\\\\]|^)(\\$\\$)/, count2 % 2 ? '$1\\\\]' : '$1\\\\[');\n", - " count2++;\n", - " } else {\n", - " mystring = mystring.replace(/([^\\\\]|^)(\\$)/, count % 2 ? '$1\\\\)' : '$1\\\\(');\n", - " count++;\n", - " }\n", - " loc = mystring.search(/([^\\\\]|^)(\\$)/);\n", - " loc2 = mystring.search(/([^\\\\]|^)(\\$\\$)/);\n", - " }\n", - " // Replace markdown links\n", - " mystring = mystring.replace(//g, 'http$1');\n", - " mystring = mystring.replace(/\\[(.*?)\\]\\((.*?)\\)/g, '$1');\n", - " return mystring;\n", - "}\n", - "\n", - "// Base class for question types\n", - "class Question {\n", - " static registry = {};\n", - " static register(type, cls) {\n", - " Question.registry[type] = cls;\n", - " }\n", - " static create(qa, id, index, options, rootDiv) {\n", - " const Cls = Question.registry[qa.type];\n", - " if (!Cls) {\n", - " console.error(`No question class registered for type \"${qa.type}\"`);\n", - " return;\n", - " }\n", - " const q = new Cls(qa, id, index, options, rootDiv);\n", - " q.render();\n", - " }\n", - "\n", - " constructor(qa, id, index, options, rootDiv) {\n", - " this.qa = qa;\n", - " this.id = id;\n", - " this.index = index;\n", - " this.options = options;\n", - " this.rootDiv = rootDiv;\n", - " // wrapper\n", - " this.wrapper = document.createElement('div');\n", - " this.wrapper.id = `quizWrap${id}`;\n", - " this.wrapper.className = 'Quiz';\n", - " this.wrapper.dataset.qnum = index;\n", - " this.wrapper.style.maxWidth = `${options.maxWidth}px`;\n", - " rootDiv.appendChild(this.wrapper);\n", - " // question container\n", - " this.outerqDiv = document.createElement('div');\n", - " this.outerqDiv.id = `OuterquizQn${id}${index}`;\n", - " this.wrapper.appendChild(this.outerqDiv);\n", - " // question text\n", - " this.qDiv = document.createElement('div');\n", - " this.qDiv.id = `quizQn${id}${index}`;\n", - " if (qa.question) {\n", - " this.qDiv.innerHTML = jaxify(qa.question);\n", - " this.outerqDiv.appendChild(this.qDiv);\n", - " }\n", - " // code block\n", - " if (qa.code) {\n", - " const codeDiv = document.createElement('div');\n", - " codeDiv.id = `code${id}${index}`;\n", - " codeDiv.className = 'QuizCode';\n", - " const pre = document.createElement('pre');\n", - " const codeEl = document.createElement('code');\n", - " codeEl.innerHTML = qa.code;\n", - " pre.appendChild(codeEl);\n", - " codeDiv.appendChild(pre);\n", - " this.outerqDiv.appendChild(codeDiv);\n", - " }\n", - " // answer container\n", - " this.aDiv = document.createElement('div');\n", - " this.aDiv.id = `quizAns${id}${index}`;\n", - " this.aDiv.className = 'Answer';\n", - " this.wrapper.appendChild(this.aDiv);\n", - " // feedback container (append after answers)\n", - " this.fbDiv = document.createElement('div');\n", - " this.fbDiv.id = `fb${id}`;\n", - " this.fbDiv.className = 'Feedback';\n", - " this.fbDiv.dataset.answeredcorrect = 0;\n", - " }\n", - "\n", - " render() {\n", - " throw new Error('render() not implemented');\n", - " }\n", - "\n", - " preserveResponse(val) {\n", - " if (!this.options.preserveResponses) return;\n", - " const resp = document.getElementById(`responses${this.rootDiv.id}`);\n", - " if (!resp) return;\n", - " const arr = JSON.parse(resp.dataset.responses);\n", - " arr[this.index] = val;\n", - " resp.dataset.responses = JSON.stringify(arr);\n", - " printResponses(resp);\n", - " }\n", - "\n", - " typeset(container) {\n", - " if (typeof MathJax !== 'undefined') {\n", - " const v = MathJax.version;\n", - " if (v[0] === '2') {\n", - " MathJax.Hub.Queue(['Typeset', MathJax.Hub]);\n", - " } else {\n", - " MathJax.typeset([container]);\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Choose a random subset of an array. Can also be used to shuffle the array\n", - "function getRandomSubarray(arr, size) {\n", - " var shuffled = arr.slice(0), i = arr.length, temp, index;\n", - " while (i--) {\n", - " index = Math.floor((i + 1) * Math.random());\n", - " temp = shuffled[index];\n", - " shuffled[index] = shuffled[i];\n", - " shuffled[i] = temp;\n", - " }\n", - " return shuffled.slice(0, size);\n", - "}\n", - "\n", - "function printResponses(responsesContainer) {\n", - " var responses=JSON.parse(responsesContainer.dataset.responses);\n", - " var stringResponses='IMPORTANT!To preserve this answer sequence for submission, when you have finalized your answers:
    1. Copy the text in this cell below \"Answer String\"
    2. Double click on the cell directly below the Answer String, labeled \"Replace Me\"
    3. Select the whole \"Replace Me\" text
    4. Paste in your answer string and press shift-Enter.
    5. Save the notebook using the save icon or File->Save Notebook menu item



    6. Answer String:
      ';\n", - " console.log(responses);\n", - " responses.forEach((response, index) => {\n", - " if (response) {\n", - " console.log(index + ': ' + response);\n", - " stringResponses+= index + ': ' + response +\"
      \";\n", - " }\n", - " });\n", - " responsesContainer.innerHTML=stringResponses;\n", - "}\n", - "/* Callback function to determine whether a selected multiple-choice\n", - " button corresponded to a correct answer and to provide feedback\n", - " based on the answer */\n", - "function check_mc() {\n", - " var id = this.id.split('-')[0];\n", - " //var response = this.id.split('-')[1];\n", - " //console.log(response);\n", - " //console.log(\"In check_mc(), id=\"+id);\n", - " //console.log(event.srcElement.id) \n", - " //console.log(event.srcElement.dataset.correct) \n", - " //console.log(event.srcElement.dataset.feedback)\n", - "\n", - " var label = event.srcElement;\n", - " //console.log(label, label.nodeName);\n", - " var depth = 0;\n", - " while ((label.nodeName != \"LABEL\") && (depth < 20)) {\n", - " label = label.parentElement;\n", - " console.log(depth, label);\n", - " depth++;\n", - " }\n", - "\n", - "\n", - "\n", - " var answers = label.parentElement.children;\n", - " //console.log(answers);\n", - "\n", - " // Split behavior based on multiple choice vs many choice:\n", - " var fb = document.getElementById(\"fb\" + id);\n", - "\n", - "\n", - "\n", - " /* Multiple choice (1 answer). Allow for 0 correct\n", - " answers as an edge case */\n", - " if (fb.dataset.numcorrect <= 1) {\n", - " // What follows is for the saved responses stuff\n", - " var outerContainer = fb.parentElement.parentElement;\n", - " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", - " if (responsesContainer) {\n", - " //console.log(responsesContainer);\n", - " var response = label.firstChild.innerText;\n", - " if (label.querySelector(\".QuizCode\")){\n", - " response+= label.querySelector(\".QuizCode\").firstChild.innerText;\n", - " }\n", - " console.log(response);\n", - " //console.log(document.getElementById(\"quizWrap\"+id));\n", - " var qnum = document.getElementById(\"quizWrap\"+id).dataset.qnum;\n", - " console.log(\"Question \" + qnum);\n", - " //console.log(id, \", got numcorrect=\",fb.dataset.numcorrect);\n", - " var responses=JSON.parse(responsesContainer.dataset.responses);\n", - " console.log(responses);\n", - " responses[qnum]= response;\n", - " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", - " printResponses(responsesContainer);\n", - " }\n", - " // End code to preserve responses\n", - "\n", - " for (var i = 0; i < answers.length; i++) {\n", - " var child = answers[i];\n", - " //console.log(child);\n", - " child.className = \"MCButton\";\n", - " }\n", - "\n", - "\n", - "\n", - " if (label.dataset.correct == \"true\") {\n", - " // console.log(\"Correct action\");\n", - " if (\"feedback\" in label.dataset) {\n", - " fb.innerHTML = jaxify(label.dataset.feedback);\n", - " } else {\n", - " fb.innerHTML = \"Correct!\";\n", - " }\n", - " label.classList.add(\"correctButton\");\n", - "\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"correct\");\n", - "\n", - " } else {\n", - " if (\"feedback\" in label.dataset) {\n", - " fb.innerHTML = jaxify(label.dataset.feedback);\n", - " } else {\n", - " fb.innerHTML = \"Incorrect -- try again.\";\n", - " }\n", - " //console.log(\"Error action\");\n", - " label.classList.add(\"incorrectButton\");\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"incorrect\");\n", - " }\n", - " }\n", - " else { /* Many choice (more than 1 correct answer) */\n", - " var reset = false;\n", - " var feedback;\n", - " if (label.dataset.correct == \"true\") {\n", - " if (\"feedback\" in label.dataset) {\n", - " feedback = jaxify(label.dataset.feedback);\n", - " } else {\n", - " feedback = \"Correct!\";\n", - " }\n", - " if (label.dataset.answered <= 0) {\n", - " if (fb.dataset.answeredcorrect < 0) {\n", - " fb.dataset.answeredcorrect = 1;\n", - " reset = true;\n", - " } else {\n", - " fb.dataset.answeredcorrect++;\n", - " }\n", - " if (reset) {\n", - " for (var i = 0; i < answers.length; i++) {\n", - " var child = answers[i];\n", - " child.className = \"MCButton\";\n", - " child.dataset.answered = 0;\n", - " }\n", - " }\n", - " label.classList.add(\"correctButton\");\n", - " label.dataset.answered = 1;\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"correct\");\n", - "\n", - " }\n", - " } else {\n", - " if (\"feedback\" in label.dataset) {\n", - " feedback = jaxify(label.dataset.feedback);\n", - " } else {\n", - " feedback = \"Incorrect -- try again.\";\n", - " }\n", - " if (fb.dataset.answeredcorrect > 0) {\n", - " fb.dataset.answeredcorrect = -1;\n", - " reset = true;\n", - " } else {\n", - " fb.dataset.answeredcorrect--;\n", - " }\n", - "\n", - " if (reset) {\n", - " for (var i = 0; i < answers.length; i++) {\n", - " var child = answers[i];\n", - " child.className = \"MCButton\";\n", - " child.dataset.answered = 0;\n", - " }\n", - " }\n", - " label.classList.add(\"incorrectButton\");\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"incorrect\");\n", - " }\n", - " // What follows is for the saved responses stuff\n", - " var outerContainer = fb.parentElement.parentElement;\n", - " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", - " if (responsesContainer) {\n", - " //console.log(responsesContainer);\n", - " var response = label.firstChild.innerText;\n", - " if (label.querySelector(\".QuizCode\")){\n", - " response+= label.querySelector(\".QuizCode\").firstChild.innerText;\n", - " }\n", - " console.log(response);\n", - " //console.log(document.getElementById(\"quizWrap\"+id));\n", - " var qnum = document.getElementById(\"quizWrap\"+id).dataset.qnum;\n", - " console.log(\"Question \" + qnum);\n", - " //console.log(id, \", got numcorrect=\",fb.dataset.numcorrect);\n", - " var responses=JSON.parse(responsesContainer.dataset.responses);\n", - " if (label.dataset.correct == \"true\") {\n", - " if (typeof(responses[qnum]) == \"object\"){\n", - " if (!responses[qnum].includes(response))\n", - " responses[qnum].push(response);\n", - " } else{\n", - " responses[qnum]= [ response ];\n", - " }\n", - " } else {\n", - " responses[qnum]= response;\n", - " }\n", - " console.log(responses);\n", - " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", - " printResponses(responsesContainer);\n", - " }\n", - " // End save responses stuff\n", - "\n", - "\n", - "\n", - " var numcorrect = fb.dataset.numcorrect;\n", - " var answeredcorrect = fb.dataset.answeredcorrect;\n", - " if (answeredcorrect >= 0) {\n", - " fb.innerHTML = feedback + \" [\" + answeredcorrect + \"/\" + numcorrect + \"]\";\n", - " } else {\n", - " fb.innerHTML = feedback + \" [\" + 0 + \"/\" + numcorrect + \"]\";\n", - " }\n", - "\n", - "\n", - " }\n", - "\n", - " if (typeof MathJax != 'undefined') {\n", - " var version = MathJax.version;\n", - " console.log('MathJax version', version);\n", - " if (version[0] == \"2\") {\n", - " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", - " } else if (version[0] == \"3\") {\n", - " MathJax.typeset([fb]);\n", - " }\n", - " } else {\n", - " console.log('MathJax not detected');\n", - " }\n", - "\n", - "}\n", - "\n", - "\n", - "/* Function to produce the HTML buttons for a multiple choice/\n", - " many choice question and to update the CSS tags based on\n", - " the question type */\n", - "function make_mc(qa, shuffle_answers, outerqDiv, qDiv, aDiv, id) {\n", - "\n", - " var shuffled;\n", - " if (shuffle_answers == true) {\n", - " //console.log(shuffle_answers+\" read as true\");\n", - " shuffled = getRandomSubarray(qa.answers, qa.answers.length);\n", - " } else {\n", - " //console.log(shuffle_answers+\" read as false\");\n", - " shuffled = qa.answers;\n", - " }\n", - "\n", - "\n", - " var num_correct = 0;\n", - "\n", - " shuffled.forEach((item, index, ans_array) => {\n", - " //console.log(answer);\n", - "\n", - " // Make input element\n", - " var inp = document.createElement(\"input\");\n", - " inp.type = \"radio\";\n", - " inp.id = \"quizo\" + id + index;\n", - " inp.style = \"display:none;\";\n", - " aDiv.append(inp);\n", - "\n", - " //Make label for input element\n", - " var lab = document.createElement(\"label\");\n", - " lab.className = \"MCButton\";\n", - " lab.id = id + '-' + index;\n", - " lab.onclick = check_mc;\n", - " var aSpan = document.createElement('span');\n", - " aSpan.classsName = \"\";\n", - " //qDiv.id=\"quizQn\"+id+index;\n", - " if (\"answer\" in item) {\n", - " aSpan.innerHTML = jaxify(item.answer);\n", - " //aSpan.innerHTML=item.answer;\n", - " }\n", - " lab.append(aSpan);\n", - "\n", - " // Create div for code inside question\n", - " var codeSpan;\n", - " if (\"code\" in item) {\n", - " codeSpan = document.createElement('span');\n", - " codeSpan.id = \"code\" + id + index;\n", - " codeSpan.className = \"QuizCode\";\n", - " var codePre = document.createElement('pre');\n", - " codeSpan.append(codePre);\n", - " var codeCode = document.createElement('code');\n", - " codePre.append(codeCode);\n", - " codeCode.innerHTML = item.code;\n", - " lab.append(codeSpan);\n", - " //console.log(codeSpan);\n", - " }\n", - "\n", - " //lab.textContent=item.answer;\n", - "\n", - " // Set the data attributes for the answer\n", - " lab.setAttribute('data-correct', item.correct);\n", - " if (item.correct) {\n", - " num_correct++;\n", - " }\n", - " if (\"feedback\" in item) {\n", - " lab.setAttribute('data-feedback', item.feedback);\n", - " }\n", - " lab.setAttribute('data-answered', 0);\n", - "\n", - " aDiv.append(lab);\n", - "\n", - " });\n", - "\n", - " if (num_correct > 1) {\n", - " outerqDiv.className = \"ManyChoiceQn\";\n", - " } else {\n", - " outerqDiv.className = \"MultipleChoiceQn\";\n", - " }\n", - "\n", - " return num_correct;\n", - "\n", - "}\n", - "// Object-oriented wrapper for MC/MANY choice\n", - "class MCQuestion extends Question {\n", - " constructor(qa, id, idx, opts, rootDiv) { super(qa, id, idx, opts, rootDiv); }\n", - " render() {\n", - " //console.log(\"options.shuffleAnswers \" + this.options.shuffleAnswers);\n", - " const numCorrect = make_mc(\n", - " this.qa,\n", - " this.options.shuffleAnswers,\n", - " this.outerqDiv,\n", - " this.qDiv,\n", - " this.aDiv,\n", - " this.id\n", - " );\n", - " if ('answer_cols' in this.qa) {\n", - " this.aDiv.style.gridTemplateColumns =\n", - " 'repeat(' + this.qa.answer_cols + ', 1fr)';\n", - " }\n", - " this.fbDiv.dataset.numcorrect = numCorrect;\n", - " this.wrapper.appendChild(this.fbDiv);\n", - " }\n", - "}\n", - "Question.register('multiple_choice', MCQuestion);\n", - "Question.register('many_choice', MCQuestion);\n", - "function check_numeric(ths, event) {\n", - "\n", - " if (event.keyCode === 13) {\n", - " ths.blur();\n", - "\n", - " var id = ths.id.split('-')[0];\n", - "\n", - " var submission = ths.value;\n", - " if (submission.indexOf('/') != -1) {\n", - " var sub_parts = submission.split('/');\n", - " //console.log(sub_parts);\n", - " submission = sub_parts[0] / sub_parts[1];\n", - " }\n", - " //console.log(\"Reader entered\", submission);\n", - "\n", - " if (\"precision\" in ths.dataset) {\n", - " var precision = ths.dataset.precision;\n", - " submission = Number(Number(submission).toPrecision(precision));\n", - " }\n", - "\n", - "\n", - " //console.log(\"In check_numeric(), id=\"+id);\n", - " //console.log(event.srcElement.id) \n", - " //console.log(event.srcElement.dataset.feedback)\n", - "\n", - " var fb = document.getElementById(\"fb\" + id);\n", - " fb.style.display = \"none\";\n", - " fb.innerHTML = \"Incorrect -- try again.\";\n", - "\n", - " var answers = JSON.parse(ths.dataset.answers);\n", - " //console.log(answers);\n", - "\n", - " var defaultFB = \"Incorrect. Try again.\";\n", - " var correct;\n", - " var done = false;\n", - " answers.every(answer => {\n", - " //console.log(answer.type);\n", - "\n", - " correct = false;\n", - " // if (answer.type==\"value\"){\n", - " if ('value' in answer) {\n", - " var value;\n", - " if (\"precision\" in ths.dataset) {\n", - " value = answer.value.toPrecision(ths.dataset.precision);\n", - " } else {\n", - " value = answer.value;\n", - " }\n", - " if (submission == value) {\n", - " if (\"feedback\" in answer) {\n", - " fb.innerHTML = jaxify(answer.feedback);\n", - " } else {\n", - " fb.innerHTML = jaxify(\"Correct\");\n", - " }\n", - " correct = answer.correct;\n", - " //console.log(answer.correct);\n", - " done = true;\n", - " }\n", - "\n", - " // } else if (answer.type==\"range\") {\n", - " } else if ('range' in answer) {\n", - " console.log(answer.range);\n", - " console.log(submission, submission >=answer.range[0], submission < answer.range[1])\n", - " if ((submission >= answer.range[0]) && (submission < answer.range[1])) {\n", - " fb.innerHTML = jaxify(answer.feedback);\n", - " correct = answer.correct;\n", - " console.log(answer.correct);\n", - " done = true;\n", - " }\n", - " } else if (answer.type == \"default\") {\n", - " if (\"feedback\" in answer) {\n", - " defaultFB = answer.feedback;\n", - " } \n", - " }\n", - " if (done) {\n", - " return false; // Break out of loop if this has been marked correct\n", - " } else {\n", - " return true; // Keep looking for case that includes this as a correct answer\n", - " }\n", - " });\n", - " console.log(\"done:\", done);\n", - "\n", - " if ((!done) && (defaultFB != \"\")) {\n", - " fb.innerHTML = jaxify(defaultFB);\n", - " //console.log(\"Default feedback\", defaultFB);\n", - " }\n", - "\n", - " fb.style.display = \"block\";\n", - " if (correct) {\n", - " ths.className = \"Input-text\";\n", - " ths.classList.add(\"correctButton\");\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"correct\");\n", - " } else {\n", - " ths.className = \"Input-text\";\n", - " ths.classList.add(\"incorrectButton\");\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"incorrect\");\n", - " }\n", - "\n", - " // What follows is for the saved responses stuff\n", - " var outerContainer = fb.parentElement.parentElement;\n", - " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", - " if (responsesContainer) {\n", - " console.log(submission);\n", - " var qnum = document.getElementById(\"quizWrap\"+id).dataset.qnum;\n", - " //console.log(\"Question \" + qnum);\n", - " //console.log(id, \", got numcorrect=\",fb.dataset.numcorrect);\n", - " var responses=JSON.parse(responsesContainer.dataset.responses);\n", - " console.log(responses);\n", - " if (submission == ths.value){\n", - " responses[qnum]= submission;\n", - " } else {\n", - " responses[qnum]= ths.value + \"(\" + submission +\")\";\n", - " }\n", - " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", - " printResponses(responsesContainer);\n", - " }\n", - " // End code to preserve responses\n", - "\n", - " if (typeof MathJax != 'undefined') {\n", - " var version = MathJax.version;\n", - " console.log('MathJax version', version);\n", - " if (version[0] == \"2\") {\n", - " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", - " } else if (version[0] == \"3\") {\n", - " MathJax.typeset([fb]);\n", - " }\n", - " } else {\n", - " console.log('MathJax not detected');\n", - " }\n", - " // After correct answer, if next JupyterQuiz question exists and has a text input, scroll by current question height\n", - " if (correct) {\n", - " // find the current question wrapper\n", - " var wrapper = ths.closest('.Quiz');\n", - " if (wrapper) {\n", - " var nextWrapper = wrapper.nextElementSibling;\n", - " if (nextWrapper && nextWrapper.classList.contains('Quiz')) {\n", - " var nextInput = nextWrapper.querySelector('input.Input-text');\n", - " if (nextInput) {\n", - " var height = wrapper.getBoundingClientRect().height;\n", - " console.log(height);\n", - " nextInput.focus();\n", - " }\n", - " }\n", - " }\n", - " }\n", - " return false;\n", - " }\n", - "\n", - "}\n", - "// Object-oriented wrapper for numeric questions\n", - "class NumericQuestion extends Question {\n", - " constructor(qa, id, idx, opts, rootDiv) {\n", - " super(qa, id, idx, opts, rootDiv);\n", - " }\n", - " render() {\n", - " make_numeric(this.qa, this.outerqDiv, this.qDiv, this.aDiv, this.id);\n", - " this.wrapper.appendChild(this.fbDiv);\n", - " }\n", - "}\n", - "Question.register('numeric', NumericQuestion);\n", - "\n", - "function isValid(el, charC) {\n", - " //console.log(\"Input char: \", charC);\n", - " if (charC == 46) {\n", - " if (el.value.indexOf('.') === -1) {\n", - " return true;\n", - " } else if (el.value.indexOf('/') != -1) {\n", - " var parts = el.value.split('/');\n", - " if (parts[1].indexOf('.') === -1) {\n", - " return true;\n", - " }\n", - " }\n", - " else {\n", - " return false;\n", - " }\n", - " } else if (charC == 47) {\n", - " if (el.value.indexOf('/') === -1) {\n", - " if ((el.value != \"\") && (el.value != \".\")) {\n", - " return true;\n", - " } else {\n", - " return false;\n", - " }\n", - " } else {\n", - " return false;\n", - " }\n", - " } else if (charC == 45) {\n", - " var edex = el.value.indexOf('e');\n", - " if (edex == -1) {\n", - " edex = el.value.indexOf('E');\n", - " }\n", - "\n", - " if (el.value == \"\") {\n", - " return true;\n", - " } else if (edex == (el.value.length - 1)) { // If just after e or E\n", - " return true;\n", - " } else {\n", - " return false;\n", - " }\n", - " } else if (charC == 101) { // \"e\"\n", - " if ((el.value.indexOf('e') === -1) && (el.value.indexOf('E') === -1) && (el.value.indexOf('/') == -1)) {\n", - " // Prev symbol must be digit or decimal point:\n", - " if (el.value.slice(-1).search(/\\d/) >= 0) {\n", - " return true;\n", - " } else if (el.value.slice(-1).search(/\\./) >= 0) {\n", - " return true;\n", - " } else {\n", - " return false;\n", - " }\n", - " } else {\n", - " return false;\n", - " }\n", - " } else {\n", - " if (charC > 31 && (charC < 48 || charC > 57))\n", - " return false;\n", - " }\n", - " return true;\n", - "}\n", - "\n", - "function numeric_keypress(evnt) {\n", - " var charC = (evnt.which) ? evnt.which : evnt.keyCode;\n", - "\n", - " if (charC == 13) {\n", - " check_numeric(this, evnt);\n", - " } else {\n", - " return isValid(this, charC);\n", - " }\n", - "}\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "function make_numeric(qa, outerqDiv, qDiv, aDiv, id) {\n", - "\n", - "\n", - "\n", - " //console.log(answer);\n", - "\n", - "\n", - " outerqDiv.className = \"NumericQn\";\n", - " aDiv.style.display = 'block';\n", - "\n", - " var lab = document.createElement(\"label\");\n", - " lab.className = \"InpLabel\";\n", - " lab.innerHTML = \"Type numeric answer here:\";\n", - " aDiv.append(lab);\n", - "\n", - " var inp = document.createElement(\"input\");\n", - " inp.type = \"text\";\n", - " //inp.id=\"input-\"+id;\n", - " inp.id = id + \"-0\";\n", - " inp.className = \"Input-text\";\n", - " inp.setAttribute('data-answers', JSON.stringify(qa.answers));\n", - " if (\"precision\" in qa) {\n", - " inp.setAttribute('data-precision', qa.precision);\n", - " }\n", - " aDiv.append(inp);\n", - " //console.log(inp);\n", - "\n", - " //inp.addEventListener(\"keypress\", check_numeric);\n", - " //inp.addEventListener(\"keypress\", numeric_keypress);\n", - " /*\n", - " inp.addEventListener(\"keypress\", function(event) {\n", - " return numeric_keypress(this, event);\n", - " }\n", - " );\n", - " */\n", - " //inp.onkeypress=\"return numeric_keypress(this, event)\";\n", - " inp.onkeypress = numeric_keypress;\n", - " inp.onpaste = event => false;\n", - "\n", - " inp.addEventListener(\"focus\", function (event) {\n", - " this.value = \"\";\n", - " return false;\n", - " }\n", - " );\n", - "\n", - "\n", - "}\n", - "// Override show_questions to use object-oriented Question API\n", - "function show_questions(json, container) {\n", - " // Accept container element or element ID\n", - " if (typeof container === 'string') {\n", - " container = document.getElementById(container);\n", - " }\n", - " if (!container) {\n", - " console.error('show_questions: invalid container', container);\n", - " return;\n", - " }\n", - "\n", - " const shuffleQuestions = container.dataset.shufflequestions === 'True';\n", - " const shuffleAnswers = container.dataset.shuffleanswers === 'True';\n", - " const preserveResponses = container.dataset.preserveresponses === 'true';\n", - " const maxWidth = parseInt(container.dataset.maxwidth, 10) || 0;\n", - " let numQuestions = parseInt(container.dataset.numquestions, 10) || json.length;\n", - " if (numQuestions > json.length) numQuestions = json.length;\n", - "\n", - " let questions = json;\n", - " if (shuffleQuestions || numQuestions < json.length) {\n", - " questions = getRandomSubarray(json, numQuestions);\n", - " }\n", - "\n", - " questions.forEach((qa, index) => {\n", - " const id = makeid(8);\n", - " const options = {\n", - " shuffleAnswers: shuffleAnswers,\n", - " preserveResponses: preserveResponses,\n", - " maxWidth: maxWidth\n", - " };\n", - " Question.create(qa, id, index, options, container);\n", - " });\n", - "\n", - " if (preserveResponses) {\n", - " const respDiv = document.createElement('div');\n", - " respDiv.id = 'responses' + container.id;\n", - " respDiv.className = 'JCResponses';\n", - " respDiv.dataset.responses = JSON.stringify([]);\n", - " respDiv.innerHTML = 'Select your answers and then follow the directions that will appear here.';\n", - " container.appendChild(respDiv);\n", - " }\n", - "\n", - " // Trigger MathJax typesetting if available\n", - " if (typeof MathJax != 'undefined') {\n", - " console.log(\"MathJax version\", MathJax.version);\n", - " var version = MathJax.version;\n", - " setTimeout(function(){\n", - " var version = MathJax.version;\n", - " console.log('After sleep, MathJax version', version);\n", - " if (version[0] == \"2\") {\n", - " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", - " } else if (version[0] == \"3\") {\n", - " if (MathJax.hasOwnProperty('typeset') ) {\n", - " MathJax.typeset([container]);\n", - " } else {\n", - " console.log('WARNING: Trying to force load MathJax 3');\n", - " window.MathJax = {\n", - " tex: {\n", - " inlineMath: [['$', '$'], ['\\\\(', '\\\\)']]\n", - " },\n", - " svg: {\n", - " fontCache: 'global'\n", - " }\n", - " };\n", - "\n", - " (function () {\n", - " var script = document.createElement('script');\n", - " script.src = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js';\n", - " script.async = true;\n", - " document.head.appendChild(script);\n", - " })();\n", - " }\n", - " }\n", - " }, 500);\n", - "if (typeof version == 'undefined') {\n", - " } else\n", - " {\n", - " if (version[0] == \"2\") {\n", - " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", - " } else if (version[0] == \"3\") {\n", - " if (MathJax.hasOwnProperty('typeset') ) {\n", - " MathJax.typeset([container]);\n", - " } else {\n", - " console.log('WARNING: Trying to force load MathJax 3');\n", - " window.MathJax = {\n", - " tex: {\n", - " inlineMath: [['$', '$'], ['\\\\(', '\\\\)']]\n", - " },\n", - " svg: {\n", - " fontCache: 'global'\n", - " }\n", - " };\n", - "\n", - " (function () {\n", - " var script = document.createElement('script');\n", - " script.src = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js';\n", - " script.async = true;\n", - " document.head.appendChild(script);\n", - " })();\n", - " }\n", - " } else {\n", - " console.log(\"MathJax not found\");\n", - " }\n", - " }\n", - " }\n", - " // if (typeof MathJax !== 'undefined') {\n", - " // const v = MathJax.version;\n", - " // if (v[0] === '2') {\n", - " // MathJax.Hub.Queue(['Typeset', MathJax.Hub]);\n", - " // } else if (v[0] === '3') {\n", - " // MathJax.typeset([container]);\n", - " // }\n", - " // }\n", - "\n", - " // Prevent link clicks from bubbling up\n", - " Array.from(container.getElementsByClassName('Link')).forEach(link => {\n", - " link.addEventListener('click', e => e.stopPropagation());\n", - " });\n", - "}\n", - "function levenshteinDistance(a, b) {\n", - " if (a.length === 0) return b.length;\n", - " if (b.length === 0) return a.length;\n", - "\n", - " const matrix = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(null));\n", - "\n", - " for (let i = 0; i <= a.length; i++) {\n", - " matrix[0][i] = i;\n", - " }\n", - "\n", - " for (let j = 0; j <= b.length; j++) {\n", - " matrix[j][0] = j;\n", - " }\n", - "\n", - " for (let j = 1; j <= b.length; j++) {\n", - " for (let i = 1; i <= a.length; i++) {\n", - " const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n", - " matrix[j][i] = Math.min(\n", - " matrix[j - 1][i] + 1, // Deletion\n", - " matrix[j][i - 1] + 1, // Insertion\n", - " matrix[j - 1][i - 1] + cost // Substitution\n", - " );\n", - " }\n", - " }\n", - " return matrix[b.length][a.length];\n", - "}\n", - "// Object-oriented wrapper for string input questions\n", - "class StringQuestion extends Question {\n", - " constructor(qa, id, idx, opts, rootDiv) {\n", - " super(qa, id, idx, opts, rootDiv);\n", - " }\n", - " render() {\n", - " make_string(this.qa, this.outerqDiv, this.qDiv, this.aDiv, this.id);\n", - " this.wrapper.appendChild(this.fbDiv);\n", - " }\n", - "}\n", - "Question.register('string', StringQuestion);\n", - "\n", - "function check_string(ths, event) {\n", - " if (event.keyCode === 13) {\n", - " ths.blur();\n", - "\n", - " var id = ths.id.split('-')[0];\n", - " var submission = ths.value.trim();\n", - " var fb = document.getElementById(\"fb\" + id);\n", - " fb.style.display = \"none\";\n", - " fb.innerHTML = \"Incorrect -- try again.\";\n", - "\n", - " var answers = JSON.parse(ths.dataset.answers);\n", - " var defaultFB = \"Incorrect. Try again.\";\n", - " var correct;\n", - " var done = false;\n", - "\n", - " // Handle default answer pattern: filter out and capture default feedback\n", - " var filteredAnswers = [];\n", - " answers.forEach(answer => {\n", - " if (answer.type === \"default\") {\n", - " defaultFB = answer.feedback;\n", - " } else {\n", - " filteredAnswers.push(answer);\n", - " }\n", - " });\n", - " answers = filteredAnswers;\n", - "\n", - " answers.every(answer => {\n", - " correct = false;\n", - "\n", - " let match = false;\n", - " if (answer.match_case) {\n", - " match = submission === answer.answer;\n", - " } else {\n", - " match = submission.toLowerCase() === answer.answer.toLowerCase();\n", - " }\n", - " console.log(submission);\n", - " console.log(answer.answer);\n", - " console.log(match);\n", - "\n", - " if (match) {\n", - " if (\"feedback\" in answer) {\n", - " fb.innerHTML = jaxify(answer.feedback);\n", - " } else {\n", - " fb.innerHTML = jaxify(\"Correct\");\n", - " }\n", - " correct = answer.correct;\n", - " done = true;\n", - " } else if (answer.fuzzy_threshold) {\n", - " var max_length = Math.max(submission.length, answer.answer.length);\n", - " var ratio;\n", - " if (answer.match_case) {\n", - " ratio = 1- (levenshteinDistance(submission, answer.answer) / max_length);\n", - " } else {\n", - " ratio = 1- (levenshteinDistance(submission.toLowerCase(),\n", - " answer.answer.toLowerCase()) / max_length);\n", - " }\n", - " if (ratio >= answer.fuzzy_threshold) {\n", - " if (\"feedback\" in answer) {\n", - " fb.innerHTML = jaxify(\"(Fuzzy) \" + answer.feedback);\n", - " } else {\n", - " fb.innerHTML = jaxify(\"Correct\");\n", - " }\n", - " correct = answer.correct;\n", - " done = true;\n", - " }\n", - "\n", - " }\n", - "\n", - " if (done) {\n", - " return false;\n", - " } else {\n", - " return true;\n", - " }\n", - " });\n", - "\n", - " if ((!done) && (defaultFB != \"\")) {\n", - " fb.innerHTML = jaxify(defaultFB);\n", - " }\n", - "\n", - " fb.style.display = \"block\";\n", - " if (correct) {\n", - " ths.className = \"Input-text\";\n", - " ths.classList.add(\"correctButton\");\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"correct\");\n", - " } else {\n", - " ths.className = \"Input-text\";\n", - " ths.classList.add(\"incorrectButton\");\n", - " fb.className = \"Feedback\";\n", - " fb.classList.add(\"incorrect\");\n", - " }\n", - "\n", - " var outerContainer = fb.parentElement.parentElement;\n", - " var responsesContainer = document.getElementById(\"responses\" + outerContainer.id);\n", - " if (responsesContainer) {\n", - " var qnum = document.getElementById(\"quizWrap\" + id).dataset.qnum;\n", - " var responses = JSON.parse(responsesContainer.dataset.responses);\n", - " responses[qnum] = submission;\n", - " responsesContainer.setAttribute('data-responses', JSON.stringify(responses));\n", - " printResponses(responsesContainer);\n", - " }\n", - "\n", - " if (typeof MathJax != 'undefined') {\n", - " var version = MathJax.version;\n", - " if (version[0] == \"2\") {\n", - " MathJax.Hub.Queue([\"Typeset\", MathJax.Hub]);\n", - " } else if (version[0] == \"3\") {\n", - " MathJax.typeset([fb]);\n", - " }\n", - " } else {\n", - " console.log('MathJax not detected');\n", - " }\n", - " // After correct answer, if next JupyterQuiz question exists and has a text input, scroll by current question height\n", - " if (correct) {\n", - " var wrapper = ths.closest('.Quiz');\n", - " if (wrapper) {\n", - " var nextWrapper = wrapper.nextElementSibling;\n", - " if (nextWrapper && nextWrapper.classList.contains('Quiz')) {\n", - " var nextInput = nextWrapper.querySelector('input.Input-text');\n", - " if (nextInput) {\n", - " var height = wrapper.getBoundingClientRect().height;\n", - " nextInput.focus();\n", - " }\n", - " }\n", - " }\n", - " }\n", - " return false;\n", - " }\n", - "}\n", - "\n", - "function string_keypress(evnt) {\n", - " var charC = (evnt.which) ? evnt.which : evnt.keyCode;\n", - "\n", - " if (charC == 13) {\n", - " check_string(this, evnt);\n", - " } \n", - "}\n", - "\n", - "\n", - "function make_string(qa, outerqDiv, qDiv, aDiv, id) {\n", - " outerqDiv.className = \"StringQn\";\n", - " aDiv.style.display = 'block';\n", - "\n", - " var lab = document.createElement(\"label\");\n", - " lab.className = \"InpLabel\";\n", - " lab.innerHTML = \"Type your answer here:\";\n", - " aDiv.append(lab);\n", - "\n", - " var inp = document.createElement(\"input\");\n", - " inp.type = \"text\";\n", - " inp.id = id + \"-0\";\n", - " inp.className = \"Input-text\";\n", - " inp.setAttribute('data-answers', JSON.stringify(qa.answers));\n", - " // Apply optional input width (approx. number of characters, in em units)\n", - " if (qa.input_width != null) {\n", - " inp.style['min-width'] = qa.input_width + 'em';\n", - " }\n", - " aDiv.append(inp);\n", - "\n", - " inp.onkeypress = string_keypress;\n", - " inp.onpaste = event => false;\n", - "\n", - " inp.addEventListener(\"focus\", function (event) {\n", - " this.value = \"\";\n", - " return false;\n", - " });\n", - "}\n", - "/*\n", - " * Handle asynchrony issues when re-running quizzes in Jupyter notebooks.\n", - " * Ensures show_questions is called after the container div is in the DOM.\n", - " */\n", - "function try_show() {\n", - " if (document.getElementById(\"oWSEkZnrBwzN\")) {\n", - " show_questions(questionsoWSEkZnrBwzN, oWSEkZnrBwzN);\n", - " } else {\n", - " setTimeout(try_show, 200);\n", - " }\n", - "};\n", - "// Invoke immediately\n", - "{\n", - " try_show();\n", - "}\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "metadata": {}, + "outputs": [], "source": [ "#%pip install jupyterquiz\n", "from jupyterquiz import display_quiz\n", diff --git a/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb b/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb index 35add76..cb578ac 100755 --- a/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb +++ b/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb @@ -49,27 +49,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "52d5b3cc-839a-4ebd-ab24-95f25d315158", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T14:26:19.664162Z", - "iopub.status.busy": "2025-06-09T14:26:19.663822Z", - "iopub.status.idle": "2025-06-09T14:26:21.282893Z", - "shell.execute_reply": "2025-06-09T14:26:21.281919Z", - "shell.execute_reply.started": "2025-06-09T14:26:19.664140Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: jupyterquiz in /opt/conda/lib/python3.12/site-packages (2.9.6.2)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "%pip install jupyterquiz\n", "from jupyterquiz import display_quiz" @@ -122,17 +105,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "d7368b6d-9119-44cf-8a28-2572cf6ba6c2", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T14:27:03.969048Z", - "iopub.status.busy": "2025-06-09T14:27:03.968309Z", - "iopub.status.idle": "2025-06-09T14:27:03.972424Z", - "shell.execute_reply": "2025-06-09T14:27:03.971768Z", - "shell.execute_reply.started": "2025-06-09T14:27:03.969017Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# The style guide says variables should be all lowercase with words separated by the underscore\n", @@ -149,30 +124,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "acc12cb1-eaa6-41bf-a8c4-8c17a777e115", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T14:27:07.271642Z", - "iopub.status.busy": "2025-06-09T14:27:07.271302Z", - "iopub.status.idle": "2025-06-09T14:27:07.457073Z", - "shell.execute_reply": "2025-06-09T14:27:07.456003Z", - "shell.execute_reply.started": "2025-06-09T14:27:07.271618Z" - } - }, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'my_Var' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mmy_Var\u001b[49m)\t\u001b[38;5;66;03m# throws an error, the case is different from the declaration\u001b[39;00m\n", - "\u001b[0;31mNameError\u001b[0m: name 'my_Var' is not defined" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "print(my_Var)\t# throws an error, the case is different from the declaration" ] @@ -202,26 +157,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "693dc4fa-6f9a-4327-81c8-ec8c43b487e7", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T14:27:32.711998Z", - "iopub.status.busy": "2025-06-09T14:27:32.711288Z", - "iopub.status.idle": "2025-06-09T14:27:32.715703Z", - "shell.execute_reply": "2025-06-09T14:27:32.715041Z", - "shell.execute_reply.started": "2025-06-09T14:27:32.711968Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Python is case-sensitive\n" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "print(my_var)\t# This is OK, because we have defined a variable my_var, but not my_Var" ] diff --git a/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb b/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb index 8cd6437..3029652 100755 --- a/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb +++ b/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb @@ -545,7 +545,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, From ee615b194ec4574fcd304826028bc3d9eaf18b8b Mon Sep 17 00:00:00 2001 From: RamiyapriyaS-NIH Date: Mon, 9 Jun 2025 17:34:45 +0000 Subject: [PATCH 07/10] Final updates to Submodule 1 --- .../Submodule_1_Tutorial2_Variables.ipynb | 3 +- .../Submodule_1_Tutorial4_Functions.ipynb | 112 +++++++++++------- .../Submodule_1_Tutorial5_Project.ipynb | 27 ++--- ...ubmodule_1_Tutorial5_Project_answers.ipynb | 16 ++- 4 files changed, 93 insertions(+), 65 deletions(-) diff --git a/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb b/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb index cb578ac..d30226f 100755 --- a/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb +++ b/Submodule_1/Submodule_1_Tutorial2_Variables.ipynb @@ -40,8 +40,7 @@ "- Allow you to capture user input to a variable.\n", "\n", "## Prerequisites\n", - "\n", - "- Intro to python (tutorial 1)\n", + "- Submodule 1- Tutorial 1: Python Overview\n", " \n", "## Getting Started\n", "As will be true in every tutorial, please \"run\" the next code box to install needed packages for (in this case) the quizzes" diff --git a/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb b/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb index 3029652..bc7d90a 100755 --- a/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb +++ b/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb @@ -16,15 +16,15 @@ "source": [ "## Learning Objectives\n", "In this lesson, you will:\n", - "
      \n", "* Learn the structure of Python functions\n", "* Call a function\n", "* Utilize bioinformatics functions from BioPython\n", "\n", "## Prerequisites\n", "\n", - "- Some experience in Python or\n", - "- Tutorials 1, 2, and 3\n", + "- Submodule 1 - Tutorial 1: Python Overview\n", + "- Submodule 1 - Tutorial 2: Variables\n", + "- Submodule 1 - Tutorial 3: Data Structures\n", "\n", "## Getting Started\n", "Run the code box below to import the required libraries" @@ -51,27 +51,46 @@ "source": [ "## Functions\n", "\n", - "In Python, a **function** is a block of reusable code that performs a specific task. It takes input, processes it, and optionally returns a value. It only runs when you \"call\" it \n", + "In Python, a **function** is a block of reusable code that performs a specific task. It takes input, processes it, and optionally returns a value. It only runs when you \"call\" it.\n", "\n", - "Lets try to use a very common bioinformatics task to illustrate the strcture of FUNCTIONS in python. \n", - "
      \n", - "They are created with the key word def (you are DEFining the function). The function may be named any way you want and is logical to you.\n", - "
      \n", - "Parentheses surround the variables that will be provided by the user of the function. Within the function, many different jobs can be done, including calculations and perhaps returning a value to you, such as you've already seen with the len(string) function that returns to the console the length of the string \"sent\" to it in the parentheses.\n", - "
      \n", - "In the Python code box below we define a function, \"Count_base\", which needs two pieces of information: some kind of sequence and the base to be counted in the sequence list. Calling that function will give back (return) a number that represents the count of the base you ask for in the sequence you provide. (count is a built-in function in Python that can be used with strings).\n", + "Let’s try using a common bioinformatics task to illustrate the structure of **functions** in Python.\n", + "\n", + "They are created with the keyword `def` (you are **defining** the function). The function may be named in any way that makes logical sense to you.\n", + "\n", + "Parentheses surround the variables that will be provided by the user of the function. Within the function, many different tasks can be performed, including calculations, and possibly returning a value—such as what you've already seen with the `len(string)` function, which returns the length of the string passed to it.\n", + "\n", + "In the Python code box below, we define a function called `Count_base`, which needs two pieces of information: a sequence and the base to be counted in that sequence. Calling this function will return a number representing how many times that base appears in the sequence you provide. (`count` is a built-in Python function that works on strings.)\n", "\n", - "The last line uses the keyword 'return' to tell Python to print to the console the \"result\" of the tasks that it runs.\n", + "The last line uses the keyword `return` to tell Python to print the result of the function’s operation to the console.\n", "\n", - "
      Tip: Try changing the base or making the \"base\" multiple letters (e.g, \"aaa\") and running the Python code box again..
      " + "
      Tip: Try changing the base or making the \"base\" multiple letters (e.g., \"aaa\") and running the Python code box again.
      \n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "ec61f862-6e53-4c16-af46-10fd39b76baa", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2025-06-09T16:46:54.120437Z", + "iopub.status.busy": "2025-06-09T16:46:54.120181Z", + "iopub.status.idle": "2025-06-09T16:46:54.127575Z", + "shell.execute_reply": "2025-06-09T16:46:54.126993Z", + "shell.execute_reply.started": "2025-06-09T16:46:54.120417Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "17" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "def count_base(dna, base): #the function is named count_base and takes 2 inputs- a sequence string and the letter to look for\n", " return dna.count(base)\n", @@ -85,7 +104,7 @@ "id": "dbefcfe0-4bc9-4d9e-bb4d-02e8831e2525", "metadata": {}, "source": [ - "
      Tip: Try this: Instead of just returning the number, edit the function so that it returns \"g=17\" or \"In seq, g=17\".
      " + "
      Tip: Instead of just returning the number, edit the function so that it returns \"g=17\" or \"In seq, g=17\".
      " ] }, { @@ -147,7 +166,7 @@ "id": "66a5efbb-8c5d-4fd8-a273-d247d4ad99bc", "metadata": {}, "source": [ - "Functions can also call another function, though to use these routinely you will need to learn to save these. (see ___ in tutorial). For now, lets write another function that calls our count_base function to calculate the GC %" + "Functions can also call another function, though to use these routinely you will need to learn to save these. For now, lets write another function that calls our count_base function to calculate the GC%. " ] }, { @@ -178,7 +197,7 @@ "id": "9a75092f-c6c4-4835-9c1b-2ef56344d809", "metadata": {}, "source": [ - "**Can you write your own tool that calculates the percentage of the time of all guanines that are found as the pairing AG?**" + "Can you write your own tool that calculates the percentage of the time of all guanines that are found as the pairing AG?" ] }, { @@ -194,15 +213,15 @@ "id": "b9065064-ed5d-4090-9312-278c0c40ab82", "metadata": {}, "source": [ - "There are many other ways that we might want to manipulate, align, and evaluate bioinformatic sets (e.g., FASTA sequences, both DNA and protein.) Fortunately, many of these standard functions have already been written and are freely available to everyone in Biopython: \"A set of python tools for computational molecular biology.\" (biopython.org) \n", + "There are many ways we might want to manipulate, align, and evaluate bioinformatic data sets—such as FASTA sequences, both DNA and protein. Fortunately, many standard functions for these tasks have already been written and are freely available through **Biopython**: *“A set of Python tools for computational molecular biology.”* (biopython.org) \n", "
      \n", - "We will start here using the tools developed for \"sequence input and output\" (SeqIO). \n", + "We will begin by using tools developed for **sequence input and output** (`SeqIO`). \n", "
      \n", - "We import that set of functions and tools (\"objects\") from the whole Biopython toolset with the following syntax: \n", + "We import that specific set of functions and tools (also called \"objects\") from the full Biopython toolkit using the following syntax: \n", "
      \n", - "from Bio import SeqIO\n", + "`from Bio import SeqIO` \n", "
      \n", - "Here we'll use that to look at a provided file (glut_human.fasta) that contains 4 different protein FASTA sequences, something that would be rather challenging for a novice Python programmer without the BioPython tools." + "We’ll use this to examine a provided file, **`glut_human.fasta`**, which contains four different protein FASTA sequences. Analyzing a file like this manually would be quite challenging for a novice Python programmer—Biopython makes it much easier.\n" ] }, { @@ -226,7 +245,7 @@ "id": "77555b0a-dcfc-448a-b30d-47e644c19c31", "metadata": {}, "source": [ - "You should see the 4 different protein identifiers in the file-- in this case with PDB ID numbers. \n", + "You should see the 4 different protein identifiers in the file- in this case with PDB ID numbers. \n", "\n", "There is a lot of information besides just the ID in each of these records, but it is not convenient to access the pieces yet. But, we can load all of that information into a single variable called (here) record_glut. The specific format is as a python LIST. " ] @@ -288,10 +307,10 @@ "metadata": {}, "source": [ "We wrote a function above (count_base) that can now come in handy to determine how many of any amino acid was present in that sequence. Although we conceived of it as a nucleotide counter, the mini program accepts whatever information we submit to it. \n", - "\n", + "```\n", "def count_base(dna, base):\n", " return dna.count(base)\n", - "\n", + "```\n", "We can send it the FASTA sequence of the GLUT protein and count an amino acid, rather than a base. The function takes any sequence and will count the letter you give it in quotes. This helps us to see how these functions \"think\" about the material you provide to it." ] }, @@ -395,18 +414,21 @@ "id": "9bcdcc97-f4dc-411e-aca7-6ea24ca0c272", "metadata": {}, "source": [ - "Fetching records from NCBI using BioPython\r\n", - "The public databases of bioinformatics data have designed ways to access their extensive files without having to go through the GUI interfaces. We can collect the data to use in our analyses or comparisons in bioinformatics tasks.\r\n", - "\r\n", - "In biopython, the modules for doing so are found in Entrez. We must import those as well as the sequence input/output tools (SeqIO) to read and parse these complex files.\r\n", - "\r\n", - "The commands below will fetch and parse the specified genbank refseq file for the human insulin receptor 2 protein.\r\n", - "\r\n", - "(You can learn more about the different database names and how to use efetch from this book chapter: https://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch)\r\n", - "\r\n", - "To run, you'll need to give a proper email address in to Entrez\r\n", - "\r\n", - "The data is read in (by convention) with the name \"handle\" but any variable name can be used. After reading in the information, one always closes the connection = handle.close()" + "Fetching Records from NCBI Using Biopython\n", + "\n", + "The public databases of bioinformatics data have built-in ways to access their extensive files **programmatically**, without needing to use graphical user interfaces (GUIs). This allows us to efficiently collect data for analysis and comparison in bioinformatics tasks. \n", + "
      \n", + "In Biopython, the modules for accessing these databases are found in **Entrez**. We must import both `Entrez` (for data fetching) and `SeqIO` (for reading and parsing sequence files). \n", + "
      \n", + "The commands below will **fetch and parse** a GenBank RefSeq file for the human *insulin receptor 2* protein. \n", + "
      \n", + "🔗 You can learn more about database names and how to use `efetch` from this [NCBI book chapter](https://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch). \n", + "
      \n", + "**Note:** To run these commands, you must provide a valid email address to `Entrez`. \n", + "
      \n", + "The data is conventionally read into a variable named `handle`, but any valid variable name can be used. Once the data is read, **you must close the connection** with: \n", + "`handle.close()`\n", + "ction = handle.close()" ] }, { @@ -436,12 +458,18 @@ "id": "9f35c7af-0412-413b-9d3d-636ce7c9eaec", "metadata": {}, "source": [ - "Reading this genbank file creates a variable of class SeqRecord (i.e, a \"Sequence record\") which is a bit like a \"list\" but it contains an ID, a sequence, and other identifying information. We can find out what \"things\" are in the file by asking for a directory of all the features.\n", + "Reading this GenBank file creates a variable of **class `SeqRecord`** (i.e., a *sequence record*), which behaves somewhat like a list—but also includes useful attributes such as an ID, a sequence, and other identifying information. \n", + "
      \n", + "We can explore what components are included in the file by requesting a **directory of all the available attributes** using the `dir()` function.\n", "\n", - "We'll look at just a few parts of the sequence record in this less, so this will show just the attributes we are most likely to need. Look at what is in various aspects of the file by writing:\n", + "In this lesson, we'll focus on just a few key parts of the `SeqRecord`, highlighting the attributes most commonly used in bioinformatics workflows. \n", + "
      \n", + "For example, to access the description field of the record, you can write:\n", "\n", + "```python\n", "humInsR2.description\n", - "for example. Any of the terms from the directory can be added after the . but only a few end up being useful to us." + "```\n", + "You can replace .description with any other attribute listed in the output of dir(humInsR2), although only a few are typically useful for common tasks." ] }, { diff --git a/Submodule_1/Submodule_1_Tutorial5_Project.ipynb b/Submodule_1/Submodule_1_Tutorial5_Project.ipynb index 94bf222..f35ee6c 100755 --- a/Submodule_1/Submodule_1_Tutorial5_Project.ipynb +++ b/Submodule_1/Submodule_1_Tutorial5_Project.ipynb @@ -7,14 +7,14 @@ "source": [ "# Project for Module 1:\n", "\n", - "Time to put all your new skills into practice! You will download 2 gene sequence files from the NCBI database using biopython, xyz, and align the two genes. \n", + "Time to put all your new skills into practice! You will download 2 gene sequence files from the NCBI database and align the two genes using the packages biopython and xyz.\n", "\n", "## Objectives\n", "\n", "You will compare the human alcohol dehydrogenase 1A gene (NM_000667.4) to a similar gene sequence from the American Mink (Neovison vison, XM_044226065.1), which is the E chain. \n", - "1. Determine the lengths of the two DNA sequences (hint: len(X) gives you the length of any file\n", - "2. Calculate the GC% in each sequence (hint: we wrote a tool called count that you could copy or recreate)\n", - "3. Perform a pairwise global alignment, obtaining the score (hint: tools within pairwise2 imported from bio)\n", + "1. Determine the lengths of the two DNA sequences (hint: len(X) gives you the length of any file.)\n", + "2. Calculate the GC% in each sequence (hint: we wrote a tool called count that you could copy or recreate.)\n", + "3. Perform a pairwise global alignment, obtaining the score (hint: tools within pairwise2 imported from bio.)\n", "\n", "
      Tip: If you need help, you can jump to the solutions from the next box.
      " ] @@ -33,11 +33,10 @@ "metadata": {}, "source": [ "## Prerequisites\n", - "Before taking on this project, you should either do the 4 tutorials in Submodule 1 \n", - "
      \n", - "or\n", - "\n", - "be familiar with Python variables, data structures, and functions, including BioPython tools" + "- Submodule 1 - Tutorial 1: Python Overview\n", + "- Submodule 1 - Tutorial 2: Variables\n", + "- Submodule 1 - Tutorial 3: Data Structures\n", + "- Submodule 1 - Tutorial 4: Functions" ] }, { @@ -74,7 +73,7 @@ "id": "4de267c8-f853-4b86-a557-21bd2b2b6084", "metadata": {}, "source": [ - "Align the two sequences (suggestion: if you'd like to see that it's working, you might want to align and display only a smaller portion of the file, e.g., ...(hum.seq[0:50], mink.seq[100:200])" + "Align the two sequences (suggestion: if you'd like to see that it's working, you might want to align and display only a smaller portion of the file, e.g., `...(hum.seq[0:50], mink.seq[100:200])`" ] }, { @@ -95,7 +94,7 @@ "id": "0c29003d-13db-4f43-8c92-8d3a9655d802", "metadata": {}, "source": [ - "**Congrats on completing your first solo python sequence import and alignment!**" + "Congrats on completing your first solo python sequence import and alignment!" ] }, { @@ -105,12 +104,10 @@ "source": [ "# Conclusion\n", "\n", - "You have completed the first module of the Introduction to Python tutorial!\n", + "You have completed the first module of the Introduction to Python tutorial!\n", "\n", "The next module will help you to develop more advanced data handling skills with NumPy, Pandas, and their powerful data science tools.\n", "\n", - "Start with the Overview page in Submodule_2\n", - "\n", "## Clean up\n", "Be sure to end your compute session to avoid unnecessary charges." ] @@ -132,7 +129,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_1/Submodule_1_Tutorial5_Project_answers.ipynb b/Submodule_1/Submodule_1_Tutorial5_Project_answers.ipynb index 0abb268..8b780b3 100755 --- a/Submodule_1/Submodule_1_Tutorial5_Project_answers.ipynb +++ b/Submodule_1/Submodule_1_Tutorial5_Project_answers.ipynb @@ -21,12 +21,16 @@ "id": "35b54b8d-863b-41f7-9e10-4dc113b45525", "metadata": {}, "source": [ - "Its time to put all your new skills into practice! You will download 2 gene sequence files from the NCBI database using biopython, xyz, and align the two genes. \n", + "Time to put all your new skills into practice! You will download 2 gene sequence files from the NCBI database and align the two genes using the packages biopython and xyz.\n", + "\n", + "## Objectives\n", "\n", "You will compare the human alcohol dehydrogenase 1A gene (NM_000667.4) to a similar gene sequence from the American Mink (Neovison vison, XM_044226065.1), which is the E chain. \n", - "1. Determine the lengths of the two DNA sequences (hint: len(X) gives you the length of any file\n", - "2. Calculate the GC% in each sequence (hint: we wrote a tool called count that you could copy or recreate)\n", - "3. Perform a pairwise global alignment, obtaining the score (hint: tools within pairwise2 imported from bio)" + "1. Determine the lengths of the two DNA sequences (hint: len(X) gives you the length of any file.)\n", + "2. Calculate the GC% in each sequence (hint: we wrote a tool called count that you could copy or recreate.)\n", + "3. Perform a pairwise global alignment, obtaining the score (hint: tools within pairwise2 imported from bio.)\n", + "\n", + "
      Tip: If you need help, you can jump to the solutions from the next box.
      " ] }, { @@ -112,7 +116,7 @@ "id": "4de267c8-f853-4b86-a557-21bd2b2b6084", "metadata": {}, "source": [ - "Align the two sequences (suggestion: if you'd like to see that it's working, you might want to align and display only a smaller portion of the file, e.g., ...(hum.seq[0:50], mink.seq[100:200])" + "Align the two sequences (suggestion: if you'd like to see that it's working, you might want to align and display only a smaller portion of the file, e.g., `...(hum.seq[0:50], mink.seq[100:200])`" ] }, { @@ -169,7 +173,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, From a172ce075ba2f156f14fa8926fe62b7a4e87d689 Mon Sep 17 00:00:00 2001 From: github-action Date: Mon, 9 Jun 2025 17:35:17 +0000 Subject: [PATCH 08/10] Github Action: Lint Notebooks --- .../Submodule_1_Tutorial4_Functions.ipynb | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb b/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb index bc7d90a..ae0fcc5 100755 --- a/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb +++ b/Submodule_1/Submodule_1_Tutorial4_Functions.ipynb @@ -68,29 +68,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "ec61f862-6e53-4c16-af46-10fd39b76baa", - "metadata": { - "execution": { - "iopub.execute_input": "2025-06-09T16:46:54.120437Z", - "iopub.status.busy": "2025-06-09T16:46:54.120181Z", - "iopub.status.idle": "2025-06-09T16:46:54.127575Z", - "shell.execute_reply": "2025-06-09T16:46:54.126993Z", - "shell.execute_reply.started": "2025-06-09T16:46:54.120417Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "17" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], + "metadata": {}, + "outputs": [], "source": [ "def count_base(dna, base): #the function is named count_base and takes 2 inputs- a sequence string and the letter to look for\n", " return dna.count(base)\n", From 169b07d761237727902bba57f4729c0b7dbdf834 Mon Sep 17 00:00:00 2001 From: RamiyapriyaS-NIH Date: Mon, 9 Jun 2025 19:19:57 +0000 Subject: [PATCH 09/10] Typo, spellcheck and grammar correction of submodule 2 --- Submodule_2/Submodule_2_Overview.ipynb | 6 +- .../Submodule_2_Tutorial_1_NumPy.ipynb | 104 +++++++++--------- .../Submodule_2_Tutorial_2_Pandas.ipynb | 95 ++++++++-------- ...le_2_Tutorial_2b_PDB_Pandas_Exercise.ipynb | 6 +- ...bmodule_2_Tutorial_3_VisualizingData.ipynb | 93 ++++++++-------- ...e_2_Tutorial_4_InferentialStatistics.ipynb | 5 +- ...le_2_Tutorial_5_PandasGuidedExercise.ipynb | 18 ++- .../Submodule_2_Tutorial_6_Project.ipynb | 7 +- 8 files changed, 161 insertions(+), 173 deletions(-) diff --git a/Submodule_2/Submodule_2_Overview.ipynb b/Submodule_2/Submodule_2_Overview.ipynb index 9d1eaa7..732cdc3 100755 --- a/Submodule_2/Submodule_2_Overview.ipynb +++ b/Submodule_2/Submodule_2_Overview.ipynb @@ -9,7 +9,7 @@ "\n", "Module 2 takes us from introducing fundamental Python characteristics and functions towards data science. \n", "\n", - "The goal is to be able to use Python programming language to perform data analysis, manipulation, and visualization. This will enable you to use Python to extract meaningful insights from large datasets using the Python libraries of NumPy, Pandas, and Matplotlib.\n", + "The goal is to be able to use Python programming language to perform data analysis, manipulation, and visualization. This will enable you to use Python to extract meaningful insights from large datasets using the Python libraries NumPy, Pandas, and Matplotlib.\n", "\n", "The **NumPy** library expands Python's functionality, focusing on arrays of one or more dimensions. These are the foundation for scientific computing and processing of, especially, numerical data. \n", "\n", @@ -69,7 +69,7 @@ "source": [ "## Clean up\n", "\n", - "Remember to shut down your Jupyter Notebook instance when you are done for the day to avoid unnecessary charges you can do this by stopping the notebook instance in the **Cloud console**" + "Remember to shut down your Jupyter Notebook instance when you are done for the day to avoid unnecessary charges. You can do this by stopping the notebook instance in the **Cloud console**" ] } ], @@ -89,7 +89,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_2/Submodule_2_Tutorial_1_NumPy.ipynb b/Submodule_2/Submodule_2_Tutorial_1_NumPy.ipynb index d5acd82..febb209 100755 --- a/Submodule_2/Submodule_2_Tutorial_1_NumPy.ipynb +++ b/Submodule_2/Submodule_2_Tutorial_1_NumPy.ipynb @@ -5,9 +5,7 @@ "id": "e7cccaee", "metadata": {}, "source": [ - "# Tutorial 1: Numerical Python (NumPy)\n", - "\n", - "-----------------------------------------------------------" + "# Tutorial 1: Numerical Python (NumPy)\n" ] }, { @@ -17,12 +15,12 @@ "source": [ "## Overview\n", "\n", - "Are you ready to supercharge your research and data analysis? As a biologist, you're swimming in data—DNA sequences, protein structures, population stats, or experimental results. Processing all that manually or with spreadsheets? That’s the slow lane. Let me introduce you to NumPy, your new powerhouse for scientific computing!\n", + "Are you ready to supercharge your research and data analysis? As a biologist, you're swimming in data— DNA sequences, protein structures, population stats, or experimental results. Processing all that manually or with spreadsheets? That’s the slow lane. Let me introduce you to NumPy, your new powerhouse for scientific computing!\n", "\n", "**Why Should a Biologist Care About NumPy?**\n", "1. Handle Biological Data Like a Pro\n", "\n", - "Whether you’re analyzing gene expression data, creating protein matrices, or modeling population dynamics, NumPy makes it seamless to store, manipulate, and analyze huge datasets—faster and cleaner than Excel or vanilla Python.\n", + "Whether you’re analyzing gene expression data, creating protein matrices, or modeling population dynamics, NumPy makes it seamless to store, manipulate, and analyze huge datasets— faster and cleaner than Excel or vanilla Python.\n", "\n", "2. Speed Up Your Workflow\n", "\n", @@ -45,7 +43,7 @@ "- Dummy-code (one-hot-encode) categorical data into numerical data with a protein sequence\n", "\n", "## Prerequisites\n", - "- basic python\n", + "- Basic python knowledge\n", "\n", "## Getting Started\n", "- Run the next code box to prepare the quiz\n", @@ -73,14 +71,6 @@ "print(\"done installing required packages\")" ] }, - { - "cell_type": "markdown", - "id": "379832e3", - "metadata": {}, - "source": [ - "----------------------------------------------------------------------------------\n" - ] - }, { "cell_type": "markdown", "id": "8dcebcfb", @@ -88,7 +78,7 @@ "source": [ "## About Numpy\n", "Numerical Python​, or \"numpy\" is one of the most popular modules used in Python. Numpy is considered a foundational module for Python high-end scientific computing.​ \n", - "
      ​\n", + "\n", "The common standard in Python is to import numpy with the alias **np**.​ You will see how often you need to use this alias!\n" ] }, @@ -112,12 +102,10 @@ "metadata": {}, "source": [ "## The Numpy Array \n", - "Among the many components it provides is the **ndarray**.​\n", - "\n", - " - This is a high-performance array or vector and serves as one of the main classes for scientific computing.​\n", - "\n", - " - Only holds one type of element, much like a standard array.​\n", + "Among the many components it provides is the **ndarray**.\n", "\n", + " - This is a high-performance array or vector and serves as one of the main classes for scientific computing.\n", + " - Only holds one type of element, much like a standard array.\n", " - It is created with the **array()** function.\n" ] }, @@ -251,7 +239,7 @@ "\n", "\\[row number, column number]\n", "\n", - "You can also index a whole row or column using a colon, : , in place of the other dimension." + "You can also index a whole row or column using a colon,\":\" in place of the other dimension." ] }, { @@ -310,9 +298,9 @@ "# Test Your Knowledge\n", "(see the solution in the next markdown box)\n", "\n", - "> 1. Create an np array (\"let_arr\") of 10 elements (letters a-j). Note: there is no shortcut for a range of letters\n", - "> 2. Change the 2nd element to 'q' & print to the console\n", - "> 3. Change the 4th element to the string 'cat'. (does it work, what type is it?)" + "1. Create an np array (\"let_arr\") of 10 elements (letters a-j). Note: there is no shortcut for a range of letters.\n", + "2. Change the 2nd element to 'q' & print to the console.\n", + "3. Change the 4th element to the string 'cat'. Does it work, what type is it?" ] }, { @@ -367,8 +355,7 @@ "\n", "By reshaping your NumPy arrays, you adapt your data to fit specific tasks—statistical analysis, visualization, or preparing input for machine learning models. Instead of wasting time manually reorganizing data, you let NumPy do the heavy lifting so you can focus on your biology!\n", "\n", - "Numpy has built-in tools, as we've said, to work with arrays. A single array can be rearranged \n", - "We can reshape an array with **array.reshape()**" + "Numpy has built-in tools, as we've said, to work with arrays. A single array can be rearranged. We can reshape an array with **array.reshape()**" ] }, { @@ -394,10 +381,10 @@ "metadata": {}, "source": [ "## Test Your Knowledge\r", - " 1. Create a 2x5 array of the numbers 1-0\n", - "2. Transpose the array, change rows to columns, columns to rws\n", - "3. . Add the numbers 11 1 \n", - "4. 4. Reshape the array, make it a 2x2x3 array" + "1. Create a 2x5 array of the numbers 1-0.\n", + "2. Transpose the array, change rows to columns, columns to rws.\n", + "3. Add the numbers 11 and 1.\n", + "4. Reshape the array, make it a 2x2x3 array." ] }, { @@ -528,7 +515,8 @@ "metadata": {}, "source": [ "## Test your knowledge\n", - "> -Although you could easily look through the list yourself, use the gene_names and expression_levels arrays again to create a new clean_gene_name array that has removed all genes with zero expression. *This kind of filtering is commonly needed in biological data sets.*" + "\n", + "Although you could easily look through the list yourself, use the gene_names and expression_levels arrays again to create a new clean_gene_name array that has removed all genes with zero expression. *This kind of filtering is commonly needed in biological data sets.*" ] }, { @@ -638,7 +626,7 @@ "\n", "NumPy provides many functions you would expect in highly statistical applications such as data science. We have already been using some of them, such as enumerate and reshape\n", "\n", - "Operations that would take several lines of nested loops in Python can be done in one line with NumPy. Whether you're doing matrix multiplication, statistical analysis, or random sampling, NumPy's tools simplify and accelerate your workflow. We will focus here on ones you might need for bioinformatics. Once you see how these work, you will easily be able to edit and use other functions. The full list is in the [numpy documentation](https://numpy.org/doc/2.1/reference/routines.math.html)\n", + "Operations that would take several lines of nested loops in Python can be done in one line with NumPy. Whether you're doing matrix multiplication, statistical analysis, or random sampling, NumPy's tools simplify and accelerate your workflow. We will focus here on ones you might need for bioinformatics. Once you see how these work, you will easily be able to edit and use other functions. The full list is in the [numpy documentation](https://numpy.org/doc/2.1/reference/routines.math.html).\n", "\n", "- Mathematical functions\n", " * np.sum: Calculates the sum of elements along a specific axis\n", @@ -647,12 +635,11 @@ " * np.min / np.max: Find the minimum and maximum values in an array\n", " * np.std: Calculates the standard deviation\n", " * np.log10: Calculates the log of the value *commonly needed in biolinformatics*\n", - " * \n", "- Logical and Comparison Functions\n", " * np.where: Returns the indices of elements meeting a condition, or replaces elements based on a condition\n", " * np.any / np.all: Checks if any or all elements of an array meet a condition\n", - "- Tools to generate arrays\r\n", - " - np.random.normal\r\n", + "- Tools to generate arrays\r", + " * np.random.normal\r\n", "- For multidimensional arrays\r\n", " * row_means = np.mean(arr, axis=0)\r\n", " * column_means= np.mean(arr, axis =1)\r\n", @@ -729,9 +716,9 @@ "source": [ "
      More on Arrays
      \n", "\n", - "Arrays can also be split, i.e. taking a single array and breaking it up into multiple sub-arrays​\n", + "Arrays can also be split, i.e. taking a single array and breaking it up into multiple sub-arrays.\n", "\n", - "The following code takes one array and splits it into 3 (equal parts)​" + "The following code takes one array and splits it into 3 (equal parts)." ] }, { @@ -753,9 +740,9 @@ "id": "e22c5629", "metadata": {}, "source": [ - "NumPy allows you to conduct array searches using a **where()** method​\n", + "NumPy allows you to conduct array searches using a **where()** method.\n", "\n", - "The return value is an array of indexes where the search condition was satisfied​" + "The return value is an array of indexes where the search condition was satisfied." ] }, { @@ -777,11 +764,9 @@ "id": "97c395d4", "metadata": {}, "source": [ - "Finally you can sort arrays using the sort() method​\n", - "\n", - " - The return value is a copy of the array sorted​\n", + "Finally you can sort arrays using the sort() method. The return value is a copy of the array sorted.\n", "\n", - "Note the sort is only ascending. To do a descending sort you need to reverse the array using slicing​" + "Note the sort is only ascending. To do a descending sort you need to reverse the array using slicing." ] }, { @@ -803,9 +788,10 @@ "metadata": {}, "source": [ "## Test Your Knowledge\r", - "> - \n", - "Use a version of our previous gene expression array (arr = np.array([\"GeneA\", \"GeneB\", \"GeneC\", \"GeneD\", \"GeneE\", \"GeneF\", \"GeneG\", 5.1, 0.3, 8.7, 1.2, 6.5, 0.0, 2.3]) to perform math function\n", - "> - after you rearrange this into a 5x2 numpy array where the gene names are row 1. (you'll need to cope with the way that numpy interprets this single type array)" + " \n", + "Use a version of our previous gene expression array `arr = np.array([\"GeneA\", \"GeneB\", \"GeneC\", \"GeneD\", \"GeneE\", \"GeneF\", \"GeneG\", 5.1, 0.3, 8.7, 1.2, 6.5, 0.0, 2.3)` to perform math function.\n", + "\n", + "After you rearrange this into a 5x2 numpy array where the gene names are row 1. You'll need to cope with the way that numpy interprets this single type array." ] }, { @@ -921,13 +907,13 @@ "## Test your knowledge\n", "\n", "Can you make a similar tool for dummy coding a protein sequence? You'll use this to answer the quiz questions.\n", - "> - Import a protein sequence from NCBI as your sequence (the quiz questions are based on the FASTA sequence human leptin from the **protein** database, id XP_005250397.1.... To fetch them, you can use the project solution from module 1.)\n", - "> - Create a mapping matrix for the amino acids A,C,D,E,F,G,H,I,K,L,M,N,P,Q,R,S,T,V,W,Y\n", - "> - Create a one-hot array for the protein sequence.\n", - "> - Print the head or the tail of the one-hot matrix (the first 10 rows) for practice & to confirm\n", - "> - Get the index of lysine (K) from the array you make of the amino acids.\n", - "> - Count number of lysines for the whole sequence & display the value\n", - "> - Check that answer by using the string.count(character) method from module 1" + "* Import a protein sequence from NCBI as your sequence (the quiz questions are based on the FASTA sequence human leptin from the **protein** database, id XP_005250397.1.... To fetch them, you can use the project solution from module 1.)\n", + "* Create a mapping matrix for the amino acids A,C,D,E,F,G,H,I,K,L,M,N,P,Q,R,S,T,V,W,Y\n", + "* Create a one-hot array for the protein sequence.\n", + "* Print the head or the tail of the one-hot matrix (the first 10 rows) for practice & to confirm\n", + "* Get the index of lysine (K) from the array you make of the amino acids.\n", + "* Count number of lysines for the whole sequence & display the value\n", + "* Check that answer by using the string.count(character) method from module 1" ] }, { @@ -1024,7 +1010,7 @@ "source": [ "# Conclusion\n", "\n", - "In this tutorial, you have learned the many functions associated with the NumPy array. \n", + "In this tutorial, you have learned the many functions associated with the NumPy array.\n", "\n", "The next module introduces you to [Pandas](./Submodule_2_Tutorial_2_Pandas.ipynb)" ] @@ -1037,6 +1023,14 @@ "## Clean up\r\n", "Remember to shut down your Jupyter Notebook instance when you are done for the day to avoid unnecessary charges. You can do this by stopping the noteboko **compute*k instance from the Cloud console." ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0983f205-7499-43b7-b051-c4e996785872", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1055,7 +1049,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_2/Submodule_2_Tutorial_2_Pandas.ipynb b/Submodule_2/Submodule_2_Tutorial_2_Pandas.ipynb index cfbfeb4..0881bd7 100755 --- a/Submodule_2/Submodule_2_Tutorial_2_Pandas.ipynb +++ b/Submodule_2/Submodule_2_Tutorial_2_Pandas.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Tutorial 2: Pandas\n", - "-----------------------------------------------\n", + "\n", "## Overview\n", "NumPy is very fast at handling data. However, it is limited by allowing only ONE data type. Pandas adds the familiar data structure like a spreadsheet, with data organized in rows and columns with names. Why not just use Excel or Sheets, then? Because bioinformatics data sets, such as RNAseq results, are so large and you may need to do complex calculations on the data. Python tools are much faster, more powerful and more flexible than pre-packaged spreadsheet tools. Also, the data is typically not printed to the screen in a GUI interface so the processing speed is faster. If you process in the cloud, you can see substantial increases in speed of analysis.\n", "\n", @@ -54,10 +54,10 @@ "\n", "The scripting in Python is good till now, but what about data organization or handling columns of tabular data with different types? ​\n", "\n", - "Pandas focuses on **data management** which can be combined with **analytics tools**​\n", + "Pandas focuses on **data management** which can be combined with **analytics tools**.\n", "\n", "The core data type is a DataFrame. A DataFrame organizes data into rows and columns, making it easy to access, filter, and process.\n", - "![Structure of a Dataframe](./images/pandasDF.png)\n", + "![Structure of a Dataframe](./images/pandasDF.png).\n", "\n", "You can think of it like an Excel spreadsheet or (more appropriately) like a database table​\n", " - Tabular​\n", @@ -76,7 +76,7 @@ "1. Ease of Handling Tabular Data:\n", " - Rows can represent biological samples, sequences, or variants.\n", " - Columns can represent genes, features, or metadata.\n", - " - Unlike Excel, Pandas does not attempt to display all the values all the time, so it is less demanding on computer memory-- especially for the large datasets common to bioinformatics\n", + " - Unlike Excel, Pandas does not attempt to display all the values all the time, so it is less demanding on computer memory- especially for the large datasets common to bioinformatics\n", "\n", "2. Data Analysis: Perform operations like filtering, grouping, and summarizing efficiently.\n", " - Example: Find the top 10 most expressed genes in RNA-Seq data.\n", @@ -97,11 +97,11 @@ "### Creating Data Frames\n", "\n", "A Pandas dataframe can be constructed in many ways. (see [pandas documentation](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) for more ways). Each column is called a **Series** and has it's own functions in Pandas [see more]\n", - "We can create a dataframe by passing in a dictionary of equal length lists​\n", + "We can create a dataframe by passing in a dictionary of equal length lists.\n", "\n", " * The dictionary keys will be column names​\n", "\n", - "We can also create dataframes from file loads and queries\n", + "We can also create dataframes from file loads and queries.\n", "\n", "Here, you see how it is made with a dictionary as the data that you might assemble yourself. " ] @@ -134,7 +134,7 @@ "\n", "Probably the most common way to create a Pandas dataframe is to **import a CSV** for further analysis. ​\n", "\n", - "You can also import excel, JSON, and the clipboard. [All the data types and import methods](http://pandas.pydata.org/pandas-docs/stable/io.html)\n", + "You can also import excel, JSON, and the clipboard. [All the data types and import methods](http://pandas.pydata.org/pandas-docs/stable/io.html).\n", "\n", "Try the next box to import a portion of a large cancer dataset. " ] @@ -207,11 +207,11 @@ "metadata": {}, "source": [ "### Summary Statistics\n", - "Are the number of rows as expected? What about the column names? General range of continuous variables? It's easy to asses​s (much more so than with a spreadsheet!!)\n", + "Are the number of rows as expected? What about the column names? General range of continuous variables? It's easy to asses​s (much more so than with a spreadsheet!)\n", "\n", - "A Pandas dataframe has a method (df.describe()) that can easily summarize each column. *The summary information is itself a dataframe* To get summary statistics on a single column, just specify that with the name in quotes as shown.\n", + "A Pandas dataframe has a method (df.describe()) that can easily summarize each column. *The summary information is itself a dataframe*. To get summary statistics on a single column, just specify that with the name in quotes as shown.\n", "\n", - "Can you obtain these same statistics for the cancer dataset? Note: these values could be meaningful for normalizing gene expression (later tasks)" + "Can you obtain these same statistics for the cancer dataset? Note: these values could be meaningful for normalizing gene expression(later tasks)." ] }, { @@ -261,8 +261,9 @@ "metadata": {}, "source": [ "As with np arrays, you can reference different dimensions. **df.loc** attribute accesses a group of rows and columns by label(s) or a boolean array in the given DataFrame:\n", - "df.loc [:, range] selects a set of columns\n", - "df.loc[range,:] selects a set of rows​\n", + "\n", + "- df.loc [:, range] selects a set of columns\n", + "- df.loc[range,:] selects a set of rows​\n", "\n", "Thus, you can subset some rows and some columns based on columns. (next, we'll make a subset based on characteristics like size of the population.)\n", "\n", @@ -291,7 +292,7 @@ "source": [ "### Indexes\n", "\n", - "We can select portions of the data frame by indexes (rows and columns) in a variety of ways" + "We can select portions of the data frame by indexes (rows and columns) in a variety of ways." ] }, { @@ -358,8 +359,8 @@ "metadata": {}, "source": [ "### Test your Knowledge\n", - "> 1. Efficiently determine how many states have a life expectancy between 70 and 71\n", - "> 2. What is the average HS Graduate percentage for these states?" + "1. Efficiently determine how many states have a life expectancy between 70 and 71\n", + "2. What is the average HS Graduate percentage for these states?" ] }, { @@ -411,13 +412,7 @@ "source": [ "### Working with Text \n", "\n", - "Strings in Pandas are roughly the same as strings in Python​\n", - "\n", - "We simply operate on series rather than a single object​\n", - "\n", - "Pandas provides many of the same methods, such as **len()**, **lower()**, **upper()**, **split()** and others you have seen before​\n", - "\n", - "Pandas methods also usually ignore missing NaN values​" + "Strings in Pandas are roughly the same as strings in Python. We simply operate on series rather than a single object. Pandas provides many of the same methods, such as **len()**, **lower()**, **upper()**, **split()** and others you have seen before. Pandas methods also usually ignore missing NaN values." ] }, { @@ -536,9 +531,9 @@ "source": [ "### Adding/Deleting columns\n", "\n", - "We can add columns by naming a new column, then assigning a set of values​. If the added column doesn't have enough values, Pandas will automatically add NaN\n", + "We can add columns by naming a new column, then assigning a set of values​. If the added column doesn't have enough values, Pandas will automatically add 'NaN'.\n", "\n", - "Use the **del** keyword to delete a column​\n", + "Use the **del** keyword to delete a column.\n", "\n", "

      Try this: You might have noticed that the first two columns of the cancer dataset are basically the same. Drop one of them & check the head to show you were successful.

      " ] @@ -563,24 +558,25 @@ "id": "6d6e1af2", "metadata": {}, "source": [ - "### Adding/deleting ROWS\n", - "​\n", + "### Adding/deleting Rows\n", + "\n", "The syntax is slightly more complex to add a row to a Pandas dataframe. \n", "\n", "You can make a new row, then **concat**, that is to concatenate the data. This row should be a single dictionary for one row, or multiple dictionaries to add multiple rows. Since it's a dictionary, you don't have to put the data in the 'correct' order of the existing dataframe. \n", - "\n", + "`\n", "new_row= pd.DataFrame(\\[{key:value, key1:value1, key2:value2}]\n", - "\n", + "`\n", "If you do not give a value for each of the columns, then Pandas will use NaN\n", "\n", "Then, add that row of new data by concatenation. \n", + "`\n", "df = pd.concat(\\[df, new_rows], ignore_index=True)\n", - "\n", + "`\n", "**To delete**, and to directly replace the dataframe using the inplace tag:\n", - "\n", + "`\n", "df.drop(index=\\[Rowindex1, Rowindex2], inplace=True)\n", - "\n", - "If you just drop one row, use index=#" + "`\n", + "If you just drop one row, use index=#. " ] }, { @@ -627,7 +623,9 @@ "\n", "You can use that to your advantage (remembering that US VI will always be index 51) or we can reindex:\n", "\n", - "**df.reset_index(drop=True, inplace=True)**\n" + "`\n", + "df.reset_index(drop=True, inplace=True)\n", + "`" ] }, { @@ -684,7 +682,6 @@ "id": "aac18a37", "metadata": {}, "source": [ - "-----------------------------------------------------------------------------------\n", "## Data wrangling\n", "\n", "A large challenge when working with real biological datasets is data \"cleaning.\" This removes values or samples with errors (negative read counts, participants over age 110) or missing data (NaN) that could skew downstream analysis. This process must be carried out systematically and carefully. The normal workflow for this is beyond this introductory module. Please look at the NIGMS Sandbox Machine Learning Module for a full treatment on this topic.\n", @@ -1202,17 +1199,15 @@ "id": "b9892700", "metadata": {}, "source": [ - "We often want to apply functions to groups within our dataset. ​\n", + "We often want to apply functions to groups within our dataset. \n", "\n", - " - What is the mean value within group?​\n", + " - What is the mean value within group?\n", + " - What is the variance within group?\n", + " - Perform a linear regression within group, then get the slope estimates out.\n", "\n", - " - What is the variance within group?​\n", + "The first step is to establish the groups (SPLIT). \n", "\n", - " - Perform a linear regression within group, then get the slope estimates out.​\n", - "\n", - "The first step is to establish the groups (SPLIT)​\n", - "\n", - "In Pandas, we can use the **.groupby()** method for this Use states, and group on the variable we just created ​\n", + "In Pandas, we can use the **.groupby()** method for this Use states, and group on the variable we just created \n", "\n", "Note: \"Groupby\" makes a new groupby pandas object. The **agg** function in a Pandas groupby object is used to apply one or more aggregation functions to grouped data. It allows you to compute summary statistics like mean, sum, min, max, and more, across multiple columns or for specific groups." ] @@ -1239,7 +1234,7 @@ "id": "1a1428dc", "metadata": {}, "source": [ - "We can index the group-by with a dynamically created value" + "We can index the group-by with a dynamically created value." ] }, { @@ -1260,11 +1255,9 @@ "source": [ "# Pandas Visuals \n", "\n", - "The next tutorial is all about python visuals (mainly using matplotlib), but because it is so important to data analytics, pandas provides visuals too​\n", - "\n", - "Pandas supports many types of plots​\n", + "The next tutorial is all about python visuals (mainly using matplotlib), but because it is so important to data analytics, pandas provides visuals too.\n", "\n", - " - Line, bar, area, box, histogram and scatter plots among others" + "Pandas supports many types of plots- line, bar, area, box, histogram and scatter plots among others. " ] }, { @@ -1360,9 +1353,9 @@ "metadata": {}, "source": [ "# Conclusion\n", - "You now have tools to do a LOT of manipulations of data frames with Pandas in Python. You are ready to work through a bioinformatics exercise. [Exploring ligand binding sites](./Submodule_2_Tutorial_2b_PDB_Pandas_Exercise.ipynb) in a pdb file (protein structure file) using pandas and biopandas\n", + "You now have tools to do a LOT of manipulations of data frames with Pandas in Python. You are ready to work through a bioinformatics exercise. [Exploring ligand binding sites](./Submodule_2_Tutorial_2b_PDB_Pandas_Exercise.ipynb) in a pdb file (protein structure file) using pandas and biopandas.\n", "\n", - "If you do not want to practice at this point, the next tutorial picks up with how to [visualize your data](./Submodule_2_Tutorial_3_VisualizingData.ipynb) with graphs in matplotlib\n" + "If you do not want to practice at this point, the next tutorial picks up with how to [visualize your data](./Submodule_2_Tutorial_3_VisualizingData.ipynb) with graphs in matplotlib.\n" ] }, { @@ -1371,7 +1364,7 @@ "metadata": {}, "source": [ "## Clean up\n", - "Remember to stop your Jupyter Notebook compute instance to avoid unnecessary charges.." + "Remember to stop your Jupyter Notebook compute instance to avoid unnecessary charges." ] } ], @@ -1391,7 +1384,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_2/Submodule_2_Tutorial_2b_PDB_Pandas_Exercise.ipynb b/Submodule_2/Submodule_2_Tutorial_2b_PDB_Pandas_Exercise.ipynb index e4ac61a..a736f2c 100755 --- a/Submodule_2/Submodule_2_Tutorial_2b_PDB_Pandas_Exercise.ipynb +++ b/Submodule_2/Submodule_2_Tutorial_2b_PDB_Pandas_Exercise.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Biopandas for PDB files\n", - "-----------------------------------------------------------------------------\n", + "\n", "## Overview\n", "If you are a structural biologist working with molecular structure files, a fantastic way to process pdb files is with Pandas dataframes. The tools are beyond the scope of this Introduction to Python course, but we include it here to give you a taste of how you can use traditional programming to query and calculate with these complex file types.\n", "\n", @@ -156,7 +156,7 @@ "### Step one: Get the file\n", "Assign the pdb file to the variable pdb PDB ID: 4AKE (adenylate kinase with a bound ligand). \n", "\n", - "As always, look at the first few lines of the file to make sure it is what you expected and to see the column names" + "As always, look at the first few lines of the file to make sure it is what you expected and to see the column names." ] }, { @@ -357,7 +357,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_2/Submodule_2_Tutorial_3_VisualizingData.ipynb b/Submodule_2/Submodule_2_Tutorial_3_VisualizingData.ipynb index 6e0866e..84e04ee 100755 --- a/Submodule_2/Submodule_2_Tutorial_3_VisualizingData.ipynb +++ b/Submodule_2/Submodule_2_Tutorial_3_VisualizingData.ipynb @@ -5,8 +5,7 @@ "id": "7c73d63b-45c6-4e52-bc17-d40186fc602b", "metadata": {}, "source": [ - "# Tutorial 3: Visualizing Data\n", - "------------------------------------------------------------------------------------" + "# Tutorial 3: Visualizing Data\n" ] }, { @@ -50,7 +49,7 @@ "metadata": {}, "source": [ "# Matplotlib\n", - "The main plotting set of libraries in Python is **Matplotlib** . It can do 2D and 3D plotting in \"Matlab\" style, and even [animate plots](https://matplotlib.org/stable/users/explain/animations/animations.html#sphx-glr-users-explain-animations-animations-py) (Although that is beyond the scope of this introduction). \n", + "The main plotting set of libraries in Python is **Matplotlib** . It can do 2D and 3D plotting in \"Matlab\" style, and even [animate plots](https://matplotlib.org/stable/users/explain/animations/animations.html#sphx-glr-users-explain-animations-animations-py) (although that is beyond the scope of this introduction). \n", "\n", "It is typical to import the libraries (matplotlib.pyplot) as plt to simplify it's use, much like we have been using np and pd as shorthand for NumPy and Pandas in this module. \n", "\n", @@ -59,10 +58,10 @@ "While it may seem easier to use Excel and its drop-down menus to make plots, there are some fantastic advantages with Matplotlib.\n", "1. You can print in a format with enough dots per inch (dpi) to make publication-qualitity images: fig.saveas('fig.tiff',dpi=600)\n", "2. While it takes a few more steps than excel:\n", - " - you CAN control all the characteristics\n", - " - the code is re-usable and can be applied to the next plot vs. having to start from scratch for each excel or even SigmaPlot figure.\n", - " - python is free\n", - " - you can plot much larger datasets\n" + " - you CAN control all the characteristics.\n", + " - the code is re-usable and can be applied to the next plot vs. having to start from scratch for each excel or even SigmaPlot figure.\n", + " - python is free.\n", + " - you can plot much larger datasets.\n" ] }, { @@ -72,9 +71,7 @@ "source": [ "## Making a plot with PyPlot\n", "\n", - "With Pyplot, we establish a figure, then annotate it and/or add all the necessary plotting elements. By default, the plot() function draws a line from point to point. \n", - "\n", - " 'Dose µM0, 0.1, 0.5, 1, 5, 10, 50, 100, 200, 5000 'Cell Viabilit drug 1y ()': [100, 98, 92, 85, 70, 60, 40, 25, 5Cell Viability with drug 2: 100, 99, 97, 94, 90, 85, 80, 75, 70, 65print(df)\r\n" + "With Pyplot, we establish a figure, then annotate it and/or add all the necessary plotting elements. By default, the plot() function draws a line from point to point. \r\n" ] }, { @@ -108,11 +105,11 @@ "\n", "\"Anatomy\n", "\n", - "At the top of the hierarchy is the **Figure** object, holding one or more **Axes**\n", + "At the top of the hierarchy is the **Figure** object, holding one or more **Axes**.\n", "\n", - "Below that are individual lines, grids, legends and text boxes, ticks and labels\n", + "Below that are individual lines, grids, legends and text boxes, ticks and labels.\n", "\n", - "This gives us a fine granularity and level of control over the plot\n" + "This gives us a fine granularity and level of control over the plot.\n" ] }, { @@ -196,25 +193,35 @@ "source": [ "## Histograms\n", "\n", - "A histogram is a type of bar plot where the X-axis represents the bin ranges while the Y-axis gives information about frequency\n", + "A **histogram** is a type of bar plot where the X-axis represents bin ranges, and the Y-axis shows the frequency of data points within those ranges.\n", + "\n", + "Histograms are appropriate for **continuous numerical data**. They provide insight into the **distribution** (or *density*) of data points.\n", + "\n", + "### Key Components of a Histogram:\n", + "\n", + "1. **Bins**: The range of values is divided into intervals called *bins*. The height of each bin represents the number of data points that fall within that interval.\n", + "2. **X-axis**: Represents the values or ranges of the data being plotted.\n", + "3. **Y-axis**: Represents the **frequency** (or count) of data points within each bin.\n", + "\n", + "---\n", + "\n", + "### Generating Histograms with NumPy & Matplotlib\n", "\n", - "Data that is appropriate for a histogram is continuous. Histograms show us the overall distribution of numerical data, so you are displaying the *density* of data points. \n", + "Histograms are typically created from arrays of data. In this first example, we’ll use **NumPy** to generate random distributions and **Matplotlib** to plot them.\n", "\n", - "The key variables of histograms that affect their appearance are \n", - "1. Bins: The range of values is divided into a set of intervals called bins. The height of each bin represents the frequency of data points falling within that interval\n", - "2. \n", - "X-axis: Represents the values or ranges of the data being plotetd.\n", - "3.\r\n", - "Y-axis: Represents the frequency or count of data points within eachin \n", + "Matplotlib will automatically choose the number of bins, but you **can** specify the number or size of bins manually. Try adjusting the number of bins to see how it affects the shape of the histogram. You can also explore different data distributions, such as exponential vs. normal.\n", "\n", + "---\n", "\n", - "The histogram plots an array of data. In this first demonstration, we will just create rayars os random distributions me bady NumPy\n", + "### Customizing Histogram Appearance\n", "\n", - "Matplotlib will automatically create bins, but you CAN choose the size. Play around with the # of bins and look at the alternative (exponential) array\n", + "You have many options to control how your histogram looks—bin count, bin width, color, edge styling, transparency, and more.\n", "\n", - "You have a lot of options for how your histogram could look. Here are some examples: \n", - "![HistogramTypes./images/](mpl_hist.bmp)\n", + "---\n", "\n", + "### Example Histogram Types:\n", + "\n", + "![HistogramTypes](./images/mpl_hist.bmp)\n", "\n" ] }, @@ -303,8 +310,9 @@ "source": [ "### Histograms in Pandas\n", "The central wrapper is DataFrame.plot() The default value is line plots You can change this with the kind argument: ‘bar’, ‘scatter’, ‘pie’ and others Thus, you can call for a histogram directly (the other plots require X and Y)\n", - "\n", - "df.plot.typeofplot\n" + "```\n", + "df.plot.typeofplot\n", + "```" ] }, { @@ -342,7 +350,8 @@ "source": [ "### Histogram Styles\n", "We can add arguments to plt.hist() for different styles.\n", - "Check help for plt.hist() " + "\n", + "Check help for plt.hist()." ] }, { @@ -392,10 +401,10 @@ "id": "6063ce47-bfba-46e3-9e5b-0db905d0532c", "metadata": {}, "source": [ - "The central wrapper is DataFrame.plot()\n", - "The default value is line plots\n", - "You can change this with the kind argument: ‘bar’, ‘scatter’, ‘pie’ and others\n", - "You can also call hist directly " + "The central wrapper is DataFrame.plot().\n", + "The default value is line plots.\n", + "You can change this with the kind argument: ‘bar’, ‘scatter’, ‘pie’ and others.\n", + "You can also call hist directly ." ] }, { @@ -422,6 +431,7 @@ "metadata": {}, "source": [ "Pandas - Annotate Title\n", + "\n", "Set the blank canvas in order to annotate it." ] }, @@ -445,8 +455,7 @@ "2. Optional Enhancements:\n", " * Additional arguments for customization, such as color (c), size (s), labels, etc.\n", "\n", - "**If you use pandas** you use df.plot(x='Column', y='Column, kind='scatter')\n", - "Pandas uses the column labels for X & Y axis.\n", + "**If you use pandas** you use df.plot(x='Column', y='Column, kind='scatter'). Pandas uses the column labels for X & Y axis.\n", "\n", "See this use for our states data." ] @@ -552,14 +561,12 @@ "\n", "There are two main ways to create subplots\n", "1. plt.subplot() (Simple Grid-Based Subplots):\n", - "\n", - " - Specify a grid layout (e.g., 2x2) and plot in a specific cell.\n", - " - Example: plt.subplot(2, 2, 1) means a 2x2 grid, and the plot is in the first cell.\n", + " - Specify a grid layout (e.g., 2x2) and plot in a specific cell.\n", + " - Example: plt.subplot(2, 2, 1) means a 2x2 grid, and the plot is in the first cell.\n", "\n", "2. plt.subplots() (More Flexible and Modern):\n", - "\n", - " - Creates a grid layout and returns figure and axes objects for better control.\n", - " - Use axes[i, j] to reference individual subplots." + " - Creates a grid layout and returns figure and axes objects for better control.\n", + " - Use axes[i, j] to reference individual subplots." ] }, { @@ -600,7 +607,7 @@ "\n", "The shape and location of the box and whiskers in a boxplot provide insights into the distribution of the data:\n", "\n", - "1. **Box (Middle 50% of Data):**The box represents the interquartile range (IQR), which is the range between the 25th percentile (Q1) and the 75th percentile (Q3). A wide box indicates high variability in the middle 50% of the data, while a narrow box suggests low variability.\n", + "1. **Box (Middle 50% of Data):** The box represents the interquartile range (IQR), which is the range between the 25th percentile (Q1) and the 75th percentile (Q3). A wide box indicates high variability in the middle 50% of the data, while a narrow box suggests low variability.\n", "2. **Line Inside the Box (Median):** The line inside the box shows the median (50th percentile), giving the central tendency of the data.\n", "If the median is closer to one end of the box, it indicates a skewed distribution.\n", "3. **Whiskers:** The whiskers extend from the box to the smallest and largest data points within 1.5 times the IQR.\n", @@ -717,7 +724,7 @@ "metadata": {}, "source": [ "## Clean up\n", - "Remember to shut down your Jupyter Notebook compute instance when you are done for the day to avoid unnecessary charges. " + "Remember to shut down your Jupyter Notebook compute instance when you are done to avoid unnecessary charges. " ] }, { @@ -792,7 +799,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_2/Submodule_2_Tutorial_4_InferentialStatistics.ipynb b/Submodule_2/Submodule_2_Tutorial_4_InferentialStatistics.ipynb index 3ec8342..7570bb5 100755 --- a/Submodule_2/Submodule_2_Tutorial_4_InferentialStatistics.ipynb +++ b/Submodule_2/Submodule_2_Tutorial_4_InferentialStatistics.ipynb @@ -5,8 +5,7 @@ "id": "ed5c8c48-8bae-4d86-ae10-8b83bc60b812", "metadata": {}, "source": [ - "# Tutorial 4: Introduction to Inferential Statistics in Python\n", - "------------------------------------------------------------------------------------------------------------------" + "# Tutorial 4: Introduction to Inferential Statistics in Python\n" ] }, { @@ -1801,7 +1800,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_2/Submodule_2_Tutorial_5_PandasGuidedExercise.ipynb b/Submodule_2/Submodule_2_Tutorial_5_PandasGuidedExercise.ipynb index 1c8dd0b..494649c 100755 --- a/Submodule_2/Submodule_2_Tutorial_5_PandasGuidedExercise.ipynb +++ b/Submodule_2/Submodule_2_Tutorial_5_PandasGuidedExercise.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Pandas RNA-seq exercise\n", - "--------------------------------------------------------------------------------\n", + "\n", "## Overview\n", "\n", "## Learning Objectives\n", @@ -47,9 +47,9 @@ "metadata": {}, "source": [ "## Pandas Exercise: Analyzing RNA-seq Data\n", - "Scenario: You have obtained RNA-seq data from NCBI,and you need to analyze it using Pandas. The dataset contains information about gene expression levels across different samples. Your tasks involve data cleaning, normalization, and exploratory analysis.\n", + "Scenario: You have obtained RNA-seq data from NCBI,and you need to analyze it using Pandas. The dataset contains information about gene expression levels across different samples. Your tasks involve data cleaning, normalization, and exploratory analysis.\n", "\n", - "*you should be able to use other datasets, including your own!*\n", + "*You should be able to use other datasets, including your own!*\n", "\n", "**Recommended Dataset:**\n", "GEO Series Accession: GSE198050\n", @@ -73,9 +73,7 @@ "\n", "Some later steps will use techniques we have not yet covered in the tutorials.\n", "\n", - "If you get stuck, all the required coding can be found at the end. BUT, you should focus on **trying it yourself.**\n", - "\n", - "-----------------------------------------------------------------------------------------------" + "If you get stuck, all the required coding can be found at the end. BUT, you should focus on **trying it yourself.**\n" ] }, { @@ -183,7 +181,7 @@ "1. Create a variable to hold the sum of each column (df.sum())\n", "2. Divide the data (axis=1) by these count values & multiply by 1 million\n", "\n", - "The only challenge is that the first column (or 2?) is gene names. Remove the gene name columns, merging them back onto the dataframe after doing the math " + "The only challenge is that the first column (or 2?) is gene names. Remove the gene name columns, merging them back onto the dataframe after doing the math. " ] }, { @@ -267,8 +265,6 @@ "id": "59c4e3a9-a9ca-4b8b-851e-49a89a13be2b", "metadata": {}, "source": [ - "---------------------------------------------------------------------------------------\n", - "\n", "## Advanced steps\n", "The rest of the steps are provided below. You will need to adjust your variable names (or the ones below) to enable you to demonstrate the remaining steps!" ] @@ -516,7 +512,7 @@ "source": [ "## Conclusion\n", "\n", - "This exercise demonstrated some of the power of Python libraries (NumPy, Pandas, matplotlib, & statsmodel) to perform complex bioinformatics tasks and protein visualizations. After this guided exercise, it is time to tackle the [submodule 2 bioinformatics project](./Submodule_2_Tutorial_6_Project.ipynb) using the many skills you've learned in this module! (or jump to the [solved version](./Submodule_2_Tutorial_7_ProjectSolutions.ipynb) of the project)\n", + "This exercise demonstrated some of the power of Python libraries (NumPy, Pandas, matplotlib, & statsmodel) to perform complex bioinformatics tasks and protein visualizations. After this guided exercise, it is time to tackle the [submodule 2 bioinformatics project](./Submodule_2_Tutorial_6_Project.ipynb) using the many skills you've learned in this module (or jump to the [solved version](./Submodule_2_Tutorial_7_ProjectSolutions.ipynb) of the project)!\n", "\n", "### Clean up\n", "\n", @@ -540,7 +536,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_2/Submodule_2_Tutorial_6_Project.ipynb b/Submodule_2/Submodule_2_Tutorial_6_Project.ipynb index b7a8a90..7a7064c 100755 --- a/Submodule_2/Submodule_2_Tutorial_6_Project.ipynb +++ b/Submodule_2/Submodule_2_Tutorial_6_Project.ipynb @@ -5,8 +5,7 @@ "id": "3c16d197-b287-4bf2-af0c-d1712bc0f655", "metadata": {}, "source": [ - "# Submodule 2 Project: Predictors of Diabetes\n", - "------------------------------------------------------------" + "# Submodule 2 Project: Predictors of Diabetes" ] }, { @@ -28,7 +27,7 @@ "\n", "## Prerequisites\n", "\n", - "You should have completed all the tutorials in Module 2 and developed some level of comfort with the tools\n", + "You should have completed all the tutorials in Module 2 and developed some level of comfort with the tools.\n", "\n", "## Getting Started\n", "The 5 tasks are described below. Solutions for each part are provided in a [solved version](./Submodule_2_Tutorial6_ProjectSolutions.ipynb) of this notebook" @@ -210,7 +209,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, From bb835b28c2e4dd8925c9a12f52f2a364dc33c2fa Mon Sep 17 00:00:00 2001 From: RamiyapriyaS-NIH Date: Mon, 9 Jun 2025 19:46:32 +0000 Subject: [PATCH 10/10] Typo correction in submodule 3 --- Submodule_3/Submodule_3_Overview.ipynb | 5 ++-- Submodule_3/Submodule_3_Tutorial_1_OOP.ipynb | 30 +++++++++---------- Submodule_3/Submodule_3_Tutorial_2_OOP2.ipynb | 12 ++++---- .../Submodule_3_Tutorial_3_Project.ipynb | 9 +++--- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/Submodule_3/Submodule_3_Overview.ipynb b/Submodule_3/Submodule_3_Overview.ipynb index 7b2e8cd..3fab620 100755 --- a/Submodule_3/Submodule_3_Overview.ipynb +++ b/Submodule_3/Submodule_3_Overview.ipynb @@ -5,8 +5,7 @@ "id": "71797b6e-6170-4f01-9578-0e16390e75c8", "metadata": {}, "source": [ - "# Submodule 3 Overview: Python and Object-oriented programming\n", - "---------------------------------------------------------------------------------" + "# Submodule 3 Overview: Python and Object-oriented programming" ] }, { @@ -57,7 +56,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_3/Submodule_3_Tutorial_1_OOP.ipynb b/Submodule_3/Submodule_3_Tutorial_1_OOP.ipynb index c3d6458..d38f30b 100755 --- a/Submodule_3/Submodule_3_Tutorial_1_OOP.ipynb +++ b/Submodule_3/Submodule_3_Tutorial_1_OOP.ipynb @@ -5,8 +5,7 @@ "id": "81a299a1", "metadata": {}, "source": [ - "# Submodule 3 Tutorial 1: Object-Oriented Programming in Python\n", - "---------------------------------------------------------------" + "# Submodule 3 Tutorial 1: Object-Oriented Programming in Python" ] }, { @@ -18,9 +17,9 @@ "Objects in Python (and in Object-Oriented Programming) allow for modular, efficient, and scalable code by organizing data and functions into reusable units. This is especially useful in bioinformatics, where handling large datasets and complex analyses efficiently is critical.\n", "\n", "## Learning Outcomes\n", - "*AFter this tutorial, you should be able to:*\n", - "- Define class, object, methods, attributes, inheritance\n", - "- Write or edit these elements of a Python class " + "* After this tutorial, you should be able to:*\n", + " - Define class, object, methods, attributes, inheritance\n", + " - Write or edit these elements of a Python class " ] }, { @@ -262,7 +261,7 @@ "id": "4dc69382-963c-4c1f-b55f-5c741989bed2", "metadata": {}, "source": [ - "---------------------------------------------------------------------------------\n", + "\n", "
      After the overview, now we delve deeper into the individual pieces.
      " ] }, @@ -387,12 +386,12 @@ "metadata": {}, "source": [ "
      Tip: Try these in the above mutation class code block:\n", - "
      \n", + "\n", " - make a second mutation object (mut2) \n", " - querry other pieces of mut1 and mut2 such as the position.\n", " - see what happens if you do NOT give all expected/required pieces of information. \n", " - add a new element of the variable (\"disease_associated\")
      \n", - "
      \n", + "\n", "*You should be able to tell that Python is using known classes to deal with the values entered, such as integers or strings*\n" ] }, @@ -640,15 +639,16 @@ "source": [ "## Conclusion\n", "\n", - "In this tutorial, you have learned:\n", - "- Some OOP vocabulary\n", - "- Defined a new class\n", - "- Written your own object\n", + "In this tutorial, you have:\n", + "- learned some OOP vocabulary.\n", + "- defined a new class.\n", + "- written your own object.\n", "\n", "You may be ready to try some advanced techniques in OOP in [Tutorial 2: OOP2](Submodule_3_Tutorial_2_OOP2.ipynb)\n", - "
      \n", + "\n", "OR\n", - "Work with [modules and packages](Submodule_3_Tutorial_3_Modules&Packages.ipynb)" + "\n", + "Work with [modules and packages](Submodule_3_Tutorial_3_Modules&Packages.ipynb)." ] }, { @@ -677,7 +677,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_3/Submodule_3_Tutorial_2_OOP2.ipynb b/Submodule_3/Submodule_3_Tutorial_2_OOP2.ipynb index 7f02f18..68e5ebd 100755 --- a/Submodule_3/Submodule_3_Tutorial_2_OOP2.ipynb +++ b/Submodule_3/Submodule_3_Tutorial_2_OOP2.ipynb @@ -433,11 +433,11 @@ "We will examine two types of **error checking**: in the constructor and in a decorator.\n", "\n", "Error checking in the constructor (__init__) ensures that invalid data is caught immediately when an object is created. \n", - "
      \n", + "\n", "Let's examine how to validate that the diagnosis is from an allowed list.\n", - "
      \n", - "You can see that **before** we store the provided diagnosis value in self.diagnosis, we first eliminate issues with capitalization (the interpretation of strings is VERY literal, as you remember, such that diabetes is not Diabetes)\n", - "
      \n", + "\n", + "You can see that **before** we store the provided diagnosis value in self.diagnosis, we first eliminate issues with capitalization (the interpretation of strings is VERY literal, as you remember, such that diabetes is not Diabetes).\n", + "\n", "We also check that the provided diagnosis is in our short list of options. **If** it is, then we can store it as self._diagnosis\n" ] }, @@ -949,7 +949,7 @@ "id": "b58d4914", "metadata": {}, "source": [ - "Because functions are an object like any other variable, Python allows us to pass them just as we would any other varaible.\n", + "Because functions are an object like any other variable, Python allows us to pass them just as we would any other variable.\n", "- We have already seen functions used as paramters in closures, but it is even simpler than that. You can just create functions and pass them to any other function:" ] }, @@ -1058,7 +1058,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/Submodule_3/Submodule_3_Tutorial_3_Project.ipynb b/Submodule_3/Submodule_3_Tutorial_3_Project.ipynb index 34661f2..13212e4 100755 --- a/Submodule_3/Submodule_3_Tutorial_3_Project.ipynb +++ b/Submodule_3/Submodule_3_Tutorial_3_Project.ipynb @@ -18,15 +18,14 @@ "- Build scripts that load, filter, and summarize real-world datasets.\n", "\n", "## Prerequisites\n", - "- Submodule 1\n", - "- Submodule 2 (especially Pandas so you can import the dataset\n", + "- Submodule 1 Tutorials\n", + "- Submodule 2 Tutorials (especially Pandas so you can import the dataset)\n", "- Submodule 3 Tutorials\n", "\n", "## Getting Started\n", "\n", "Below, you will find a task prompt that will require you to define a new Class which can handle a dataset. You can attempt the task on your own, or use the guided prompts which are each followed by a \"fill-in-the-blank\" model. You can copy each of those sections, edit them, and use each to build a class then write a script. If you get stuck, the entire solution is in the next tutorial.\n", - "\n", - "-----------------------------------------" + "\n" ] }, { @@ -328,7 +327,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.9" } }, "nbformat": 4,