{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Lecture 23: Data Exploration\n", "\n", "CSCI 1360: Foundations for Informatics and Analytics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://www.unofficialgoogledatascience.com/2016/10/practical-advice-for-analysis-of-large.html" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Overview and Objectives" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We've previously covered the basics of exploring data. In this lecture, we'll go into a bit more detail of some of the slightly more formal strategies of \"data munging,\" including introducing the `pandas` DataFrame for organizing your data. By the end of this lecture, you should be able to" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - Generate histograms and plots for exploring 1D and 2D data\n", " - Rescale and normalize data to more directly compare different distributions\n", " - Import data into pandas DataFrames and perform basic analyses" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Part 1: Exploring" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "As has been (hopefully) hammered at you over the past few weeks, one particularly important skill that all data scientists must have is the ability to **explore your data.**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "If you recall way back in [Lecture 13 on working with text](http://nbviewer.jupyter.org/format/slides/github/eds-uga/csci1360e-su16/blob/master/lectures/L13.ipynb#/), I mentioned something about structured versus unstructured data, and how the vast majority of data out there falls in the latter category." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "You can't work directly with data that is unstructured! So you have to give it structure. But in order to do that, you have to *understand* your data." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### One dimension" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "This is about as simple as it gets: your data consist of a list of numbers. We saw in previous lectures that you can compute statistics (mean, median, variance, etc) on these numbers. You can also visualize them using histograms. We'll reiterate that point here, using a particular example." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset 1 :: 1.60 (avg) :: 57.68 (std)\n", "Dataset 2 :: 1.88 (avg) :: 57.92 (std)\n" ] } ], "source": [ "import numpy as np\n", "np.random.seed(3908544)\n", "\n", "# Generate two random datasets.\n", "data1 = np.random.normal(loc = 0, scale = 58, size = 1000)\n", "data2 = 200 * np.random.random(1000) - 100\n", "\n", "# What are their means and variances?\n", "print(\"Dataset 1 :: {:.2f} (avg) :: {:.2f} (std)\".format(data1.mean(), data1.std()))\n", "print(\"Dataset 2 :: {:.2f} (avg) :: {:.2f} (std)\".format(data2.mean(), data2.std()))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Both datasets contain 1000 random numbers. Both datasets have very nearly the same mean and same standard deviation." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "But the two datasets *look* very different!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\nhvHqq68aDQ0NhmEYxjvvvGMsWbLE4ori04ULF4yqqqpLblu8eLHR0dFhGIZhrF692vjzn/9sRWlx\n5Re/+IVRWVlpfP3rXzcM48rnqK+vz6isrDS8Xq/hdruNyspK4+LFi1aWHRP02ZGhzw4PfXZo6LND\nY1afbcpQiltvvVVr1qwJ/D44OCiv16upU6dKkr74xS9q7969evvttzV79mxJ0nXXXSe/36+BgQEz\nSkoIBw4cUG9vr+655x595zvfkcvluuK5a2trs7jS+MA2t6Hp6urS0NCQamtrtWjRIu3fv1+dnZ1y\nOBySPrjitW/fPourtN706dO1devWwO8HDx685By1tbXpb3/7m4qLi5WRkaHs7GwVFBQElkBLZPTZ\nkaHPDg99dmjos0NjVp8d1VCK3//+9/rNb35zyW1NTU2aN2+e2tvbA7d5PJ7AvwQkKSsrS0ePHtXY\nsWOVl5cXuD0zM1ODg4OaMGFCNGUlhCudO6fTqe985zv68pe/rLffflvLly/X1q1bLzt3x44dG+ly\n41Ik29ymorFjx6q2tlZ33XWXXC6X7rvvPhkfWaUxKytLbrfbwgrjw9y5c3X8+PHA7/99jgYHB+Xx\neC55z2VmZibUuaPPjhx9dvTos0NDnx0as/rsqIJxdXW1qqurgz7uPwX+h8fjUW5urkaNGnXJNqX/\n/QKS2ZXO3b///W+lp6dLkoqLi9XX13fFc5eTkzOitcarSLa5TUUFBQWaPn164Oe8vDx1dnYG7uc9\ndWUffS/95xxlZ2cn9OeRPjty9NnRo88ODX12ZGLVZ4/IOzI7O1ujR4/W0aNHZRiG3njjDRUXF+uW\nW27RG2+8IcMwdOLECRmGccnViFTz5JNPBq5IdHV16brrrrvquQPb3IbqpZde0oYNGyRJvb29Ghwc\n1OzZswNXCFtbW3lPXcGNN96ojo4OSR+eo8985jN6++23dfHiRbndbh05ckSFhYUWVxp79Nmhoc8O\nD312aOizIxOrPtu0VSn+29q1a7V8+XL5/X7Nnj07MJO5uLhYX//612UYhlavXj1S5cSl+++/XytW\nrAjM+G5qapIkrVmz5ornLtXNnTtXe/fu1Te+8Q1JCpwvXKq6ulorV65UTU2NbDabNmzYoLy8PDU2\nNsrr9cput6uiosLqMuNOfX29Vq1adck5SktL0913362amhoZhqG6ujqNHj3a6lJNQZ8dHH12eOiz\nQ0OfHZlY9dlsCQ0AAACIDT4AAAAASQRjAAAAQBLBGAAAAJBEMAYAAAAkEYwBAAAASQRjAAAAQBLB\nGAAAAJBEMAYAAAAkSf8fbsLf5SkpRvcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "plt.figure().set_figwidth(12)\n", "plt.subplot(121)\n", "plt.title(\"Dataset 1\")\n", "_ = plt.hist(data1, bins = 20, range = (-100, 100))\n", "plt.subplot(122)\n", "plt.title(\"Dataset 2\")\n", "_ = plt.hist(data2, bins = 20, range = (-100, 100))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Behold: the importance of viewing your data! Dataset 1 is drawn from a Gaussian (normal), while Dataset 2 is uniform." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Two dimensions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Two (and even three) dimensions? **Scatter plots** are your friend. Consider the following fake datasets." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "np.random.seed(8493248)\n", "\n", "X = np.random.normal(size = 1000)\n", "Y1 = (X + np.random.normal(size = 1000) / 2)\n", "Y2 = (-X + np.random.normal(size = 1000) / 2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "If you plotted `Y1` and `Y2` using the histograms from the previous strategy, you'd get two datasets that looked pretty much identical." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure().set_figwidth(12)\n", "plt.subplot(121)\n", "plt.title(\"Dataset Y1\")\n", "_ = plt.hist(Y1, bins = 50, range = (-4, 4))\n", "plt.subplot(122)\n", "plt.title(\"Dataset Y2\")\n", "_ = plt.hist(Y2, bins = 50, range = (-4, 4))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Maybe *slightly* different shapes, but qualitatively (and statistically) identical." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "But what if we visualized the data in 2D using a scatter plot?" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfEAAAFtCAYAAAAXllNFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXtcVHX+/1/DDDByHRjuyU1EECEUL6llu94qLaPQFK1N\nv6v53fy15bd2t4tm2XbZ2ray2tptu2gXJQpbzNVSUQvNxZRLgDqOyE0uAwzXGRiGYfj9ged45soM\nDMzF9/Px8IGcOefz+bzPDPM+7/fnfeENDAwMgCAIgiAIp8PN3gsgCIIgCGJ4kBInCIIgCCeFlDhB\nEARBOCmkxAmCIAjCSSElThAEQRBOCilxgiAIgnBSSIkThB1JTExEe3u72XPefvtt5Obmmj1HoVBg\n7dq1Rl979913MWfOHNx777245557sGzZMjz88MOoqqpiz7n33nuhUCiGNT73+m+++Qa/+93vzK7V\nGH//+99x9OhRAJbJSxDEIAJ7L4Agrmd4PN6Q5zz66KNDntPe3o7S0lKTr995553YunUr+3tubi7W\nrVuH//znP/D29sY333wzovGHun4o/vvf/yI+Ph6AZfISBDEIWeIEYUe4tZa+/PJLLFu2DPfccw/W\nr1+P6upqAMDTTz+NTz75BABw44034t1338Xq1auxaNEifPrppwCAZ555BiqVCvfeey8sqd+Unp6O\nuLg47N+/H8A1j0BLSwvWr1+PjIwMZGRk4O233zYYX6vVIjk5GZs3b8aSJUtQVlam41FoamrChg0b\ncPfdd+Phhx+GXC4HAPzmN7/BoUOH2DUwv3/xxRcoKyvDa6+9hiNHjujIe+bMGaxatQrp6elYsWIF\n8vPzAQw+NGzatAmPPPIIli1bhoyMDFy6dGn4bwRBOCmkxAnCATh16hQ+/vhjfPbZZ/j3v/+Nu+66\nC5s2bTI4T61WIzAwEHv27MGOHTvw+uuvQ61W45VXXoFQKMQ333xjkXUPAAkJCbh48SKAax6B7Oxs\nREZGYu/evfjiiy9QXV0NhUKhM76bmxs0Gg0WLlyIgwcPIjk5WWfO6upqPPfcc9i3bx8mTZqEl156\nyew67r//fiQnJ+PJJ5/EokWL2OPt7e147LHHsHXrVuTm5uIvf/kL/vjHP6Kurg7AoILftm0bvv32\nW6SlpeGjjz6ySG6CcCVIiROEHWGU34kTJ7BkyRKIRCIAg3vMTU1NrMLisnDhQgDAlClT0NfXh56e\nnmHPLRQKAVzzCMybNw+HDh3Cxo0b8eWXX+KJJ56Aj4+P0eunT59u9PjcuXMRGRkJAFixYgVOnjxp\n0Xr0PQglJSWIjo5GSkoKAGDixImYPn06Tp8+DWBQ/pCQEABAUlLSkLEFBOGKkBIniDHk/PnzrPXL\nIBAIoNVqDc7VarXQaDQGxz09Pdn/DwwMWOQ+N0ZpaSkSEhJ0jqWkpCAvLw+rVq1CXV0dVqxYgeLi\nYqPXe3l5GT3u5nbta0Wr1cLd3R3A4EMDd619fX1m12dMtv7+fvaecO+D/tgEcb1ASpwgxpBjx47h\nww8/BACUlZUhMDAQPj4+mDdvHg4ePIjW1lYAQE5ODgICAhAdHW3RuKYeBEzx1Vdf4cqVK1iyZInO\n8b/97W/4+9//joULF2LLli2YOHEiqqqqhhyfq0ALCgrQ2NgIAMjKysKtt94KAAgMDERZWRkAoKam\nBhKJRGf9+g8sqampqKqqYgPqpFIpzp49i1mzZlksJ0G4OhSdThBjyAMPPIA//OEPuOuuu9Df38/u\nF8+dOxdr165l07gCAgLwz3/+0+B6/f1u5vfg4GBMnjwZS5cuxZ49e+Dv769z3oEDB3D27FkAgwo3\nNjYWn332mY6VDABr167Fk08+iWXLlsHDwwOJiYm48847wefz2fF3795tch3A4F77M888g+bmZsTF\nxeGFF14AADz88MN46qmncPz4cUyYMEFHGc+fPx+vvvoq1Go1eywgIAA7duzAn//8Z/T09IDP5+OV\nV15BdHQ0CgsLLb3lBOHS8KgVKUEQBEE4J3azxDMyMtiAmfHjx+Pll1+211IIgiAIwimxixJnXGZM\njitBEARBENZjl8C2CxcuoLu7G+vXr8e6detQUlJij2UQBEEQhFNjlz3xixcvoqSkBPfddx+qqqrw\n0EMP4fvvv9dJTSEIgiAIwjx2cafHxMSwqTMxMTEQiURobm5GaGio0fMHBgYsrkJFEARBENcLdlHi\nOTk5uHjxIp577jnIZDIolUoEBwebPJ/H46G5uWsMVzi2BAf7uqx8riwbQPI5OySf8+LKsgGD8lmC\nXZT4ihUr8PTTT2PNmjVwc3PDyy+/TK50giAIgrASuyhxd3d3vP766/aYmiAIgiBcBjJ/CYIgCMJJ\nISVOEARBEE4KKXGCIAiCcFJIiRMEQRCEk0JKnCAIgiCcFFLiBEEQhNNTVHQWy5bdhkcf/R0eeWQj\nHn54PY4ePWL2GpmsESdP5ttk/s7OThw+/J3R1/r7+7F165M4ffq/NpmLC/UTJwiCIFyC6dNn4vnn\nXwIA9PT04JFHNiIqKhoTJ8YbPb+w8Ayqq6tw883zRjz3pUsXceLEj1i8+A6d43V1V/Dii8+hpaUZ\nwL0jnkcfUuIEQRCEyzFu3Dikp2fg+PE8TJgQh7/+9WU0NTVBLm/BLbfcit/+diM+/3wnent7kZKS\nCm9vb3zyyb8wMDCAnp5uPPfcSwgJCcW2bU9BqVRCpVJh48ZNmDnzJhw9egTZ2bvB5/Nx441T8b//\n+//w2WefoKLiEr799t9Ytuwedh0qlQpPP/0sPv9816jISUqcIAiCGHPq6+vw4IOrIRAIsHv31wgM\nDLT5HIGBgbh4UYKmpiZMmZKCJ59Mh1qtRkbGUmzY8Ds88MA61NRU4+ab5+Gbb77Gtm1/hlgchM8+\n+wTHjh3BLbf8Ch0dHfjb395BW1sramtr0NnZiY8//gAfffQZPD098ec/b8OZM6fx4IO/RW7uXh0F\nDgBxcRNtLhcXUuIEQRDEmFNcXITS0hLw+XxIpRLcdNMcm8/R2NiAkJAQ+Pn54vz5chQVncG4cd7o\n6+szODc4OBhvvvlXeHl5obm5CTfeOBWxsRNw99334vnnn4FG048VK1ahrq4W7e1t+OMfH7tqtfeg\nru4KoqKibb5+SyAlThAEQYw5S5bciS1bnoO7uwdmzZptkzG5nbWVSgW+/TYXL774Kg4c+Ba+vn74\n4x+fwZUrtfj2228ADDbX0mq1AIBXX30J2dm5GDduHF566XkMDAzg8uVL6O7uxmuvvQW5vAUPP7we\n//rXLoSGhuHNN/8OPp+Pgwf3Iz4+AUqlgh1rLCElThAEQYw5PB4Pjz76uE3HLCo6i0cf/R14PDdo\ntf3YsOF/ERkZBY1Gg+3bt6Ks7Be4u7sjMjIaLS0tiIubiM8++wSTJiXi9tuXYtOm9Rg3zguBgYFo\naWlGZGQ0Pv74Xzh27AgGBgawYcPD8PcXYdWqNXjkkYfQ369FeHgEFixYjK6uTly+XIGvvsrCffdl\n2lQuc/AGuI8uDoyrt5xzVflcWTaA5HN2SD7nxZVlAyxvRUp54gRBEAThpJASJwiCIAgnhZQ4QRAE\nQTgppMQJgiAIwkkhJU4QBEEQTgopcYIgCIJwUihPnCAIgnB6iorOYtu2pxEbOwFarRb9/f24777V\nWLBgkclrZLJGXLoktUkDlM7OThQU/GTQAOXMmdP48MN/QCAQICAgEFu3boenp+eI52MgS5wgCIJw\nCaZPn4m33/4H3n33A7zxxrv44otduHRJavL8wsIzKC0tscncTBczfd588zX85S9v4N13P8D48ZHY\nv//fNpmPgSxxgiAIwuVwlC5m77zzT4hEIgBAf78GHh62s8IBUuIEQRCEHejq6sTBg/vg5uaGu+66\nF0LhOJvP4QhdzAIDxQCAH344iqKis3jooU02lZGUOEEQBDHmNDfL0NLSBB6Ph7a2VoSH32DzORyl\ni1l29m4cP34Uf/vbu3B3d7epjKTECYIgiDEnNnYiZs++BW5ufISFRdhkTEfsYrZr10eQSiV46633\n4OHhYRM5uZASJwiCIMYcHo+HtLRZNh3T0bqYtbW1YufOD5GQMBlPPPF78Hg8LFiwGPfcs9xmMtut\ni5lcLsfy5cvxySefIDY2dsjzXb1bjavK58qyASSfs0PyOS+uLBvg4F3MNBoNnnvuOQiFQntMTxAE\nQRAugV2U+KuvvorVq1cjJCTEHtMTBEEQhEsw5kp87969EIvFuPnmm2EnTz5BEARBuARjvif+wAMP\ngMfjAQAuXLiA2NhYvP/++xCLxWO5DIIgCIJweuwW2AYAv/nNb/DCCy9QYJsLB2i4smwAyefskHzO\niyvLBjh4YBsDY5ETBEEQBGE9ds0T//TTT+05PUEQBEE4NdTFjCAIgiCcFFLiBEEQBOGkkBInCIIg\nCCeFlDhBEARBOCmkxAmCIAjCSSElThAEQbgEubk5WL16OXJzc+y9lDGDWpESBEEQLkFW1m7k5R0G\nAKSn267dpyNDSpwgCIJwCTIz1+j8vB4gJU4QBEG4BOnpy68bC5yB9sQJgiAIwkkhJU4QBEEQTgop\ncYIgCIJwUkiJEwRBEISTQkqcIAiCIJwUUuIEQRAE4aSQEicIgiAIJ4WUOEEQBEE4KaTEHQipVIL9\n+/dCKpXYeykEQRCEE0AV2xwIiaQcNTVVAID4+AT7LoYgCIJweEiJOxAJCVN0fhIEQRCEOUiJOxDx\n8QlkgRMEQRAWQ3viBEEQBOGkkBInCIIgCCeFlDhBEARBOCmkxAmCIAjCSSElTrg0lHtPELYhNzcH\nq1cvR25ujr2XQnCwS3S6VqvF1q1bUVlZCTc3N2zfvh0TJ060x1IIF4dy7wnCNmRl7UZe3mEAQHr6\ncjuvhmCwixI/evQoeDwe9uzZg9OnT+ONN97Ae++9Z4+lEBYglUogkZQjIWGK0ylCyr0nCNuQmblG\n5yfhGNhFiS9atAgLFiwAANTV1cHf398eyyAsxJmtWcq9JwjbkJ6+3CYWeG5uDrKydiMzcw1Z9DbA\nbsVe3Nzc8NRTT+HIkSN4++237bUMwgLImiUIwlaQW9628AYGBgbsuQC5XI777rsPBw4cgFAotOdS\nCIIgiFEmOzsbO3fuxLp167By5Up7L8fpsYslnpubC5lMho0bN8LT0xNubm5wczMfKN/c3DVGqxt7\ngoN9XVY+V5YNIPmcHZJvdNB3mev/Pn/+EgAj+16/Ht47S7CLEr/tttvw9NNP44EHHoBGo8GWLVvg\n4eFhj6UQBEEQNkbfZU4u9NHDLkp83LhxeOutt+wxNTEGcKPZg4Nn2Hs5BEGMMfqR7BTZPnpQFzPC\n5nCj2efOJSVOENcb+pHstopsJwyhim2EzUlImIKoqBiKZicIwuYwleOys7PtvRSHgJS4A1BWVuZS\npUHj4xNw110ZlJ9NEAQA25ZsZfbXd+7cOfKFuQDkTncASkpKnLaYiimYffGZM6cjNDTa3sshCMKO\n2DKwjdlXX7du3UiX5RKQEncAUlNToVZrXMr9zOyLe3gIcNttpMQJ4nrGloFtzP66q6eYWQopcQcg\nOTnZ5axV5oEkNTVV5/hI6rA7cw13grieocC20YOUODEqMDXL9Z+WR1KH3ZlruBMEQYwGpMSJMWUk\nddiphjtBEIQupMSJMWUkXcWoIxlBOC7Uncw+kBInCIIgRgyVVrUPpMQJgiCIEUOlVe0DFXshRh2p\nVDJkMRtT51h63JI5CMIZsGVhlLEkPX059uzJISt8jCFLnBh1LIkqN3aOVCpBfn4eVCqVwbX651Pk\nOuEqkFuasAZS4sSoY0lUubFzJJJyqFQqCIVCg2v1z6fIdcLRGG6gF7mlCWsgJU6MOsONKucqZv3r\n9cekyHXC0bDGotZX+I5mgVPkueNCe+KEQ8C4wyWScvYY00gFAO13E05HZuYaLFy42CKLmlH4WVm7\nx2BllsHdm3e09eXm5mDp0qVOFzcwGpAlTgwbW5ZBNecON7XfzZ2fOY9KshKOgjUWtSO60LmeBEdb\nH7M2tVpz3XsGSIkTw8aWwWTm3OGmFDx3fgBGA+NIsRPOgL1d6Mbc5VzFPRrrG4mLPjNzDTw8BMjI\nWGnTNTkjpMSJYTNWwWTGFLxUKoFSqYBYHKwzv35gHEWsE2PBcBXSaOw1c8fcsGGdRdcY278f7QeL\nkUThp6cvx4YN66iLGUiJE0Ngzpq1ZzCZRFIOubwFQqHQ5FooYp2wJeYU7nAV0mikkzFjymSN2Ls3\nGxkZK4cc2x7uckdz0Tsr/Oeff/55ey/CErq71fZewqjh7e3psPKdOvUjamqqoNH0YdKkyVZfP1qy\n8XhuqK+vhUqlMrk2sTgIPJ4bJJJy8HhuEIuD2NekUglOnfrR4Li1OPJ7ZwtIvmts3/4s8vIOo7u7\nGytWrNJ5zd1dgO7ubmRmrkFiYpLF81tyXW5uDrZvfxbu7gL2HGPH9MdUKhX46aeTRterT2JiElas\nWGXV2kfKSOe8Hj6blkCWOGEWR7VmGaubG9hmDFMudXK1E9ZiznIcrut5qOtyc3Pw1FN/gFwuZ88H\nzFvwzJi5uTmsJU64LpRiRpiFSfMabUU3nLKp3LWZuj4hYQqiomKMFovhHqeyra7PSMuZMmVFAYxZ\nWdSsrN2Qy+UQi8XIzFzDyhAXF2cyfY05BwAOHDhw3UdvuzpkiROjSllZGX7++eyQEeIjtYxNXW9q\n317/OFnmro+t9p/HsiyqfoT46tXL2bmZBwpz67M0sI1wXkiJX+eMdhpWSUmJRcpxJG77wUh1JXx8\nfKFUKiGVSqyWxVG3DQjbYatAqrEMyNJ3t1syNwWMXV/wBgYGBuy9CEtw5VSC4GBfu8m3f/9e1NRU\nISoqhq2OZimWPADIZNUWWeLMWP7+AejoaLPqoYKRQSgUQqVSDUuW4WLP924sIPlGn9EsacrIZ80c\nzlJi1RHeu9EkONjXovPG3BLXaDR45plnUFdXh76+Pvzud7/DggULxnoZxFVGYoEyLmilUmFSmScn\nJyM0NHrIsQoLCyCXt0AgqING0wfAcrc2s3buAwBBOAOmAtdsjTVbANRFzbkYcyW+b98+BAQE4LXX\nXkNHRwfuueceUuJ2xNJcb2NWN6MslUqlDfaTeQAAoVCIwMAbLFbErliVzRVlIgbRt3L1A9dsOTYX\na1zs5I53LsZciS9ZsgR33HEHAECr1UIgoG15Z8BY4BfzAKBfw3w4pKXNGpbicsWANFeUiRhE38rV\nD1wDhu/OtiTtzBLsXQKWsI4xL/bi7u4Od3d3KBQK/P73v8dDDz2E+Pj4Ia9z9aR+W8lnqyIm+vB4\nbtBo+pCQMMVgXLE4CJMmTTY6n6WymRtjuOuyhuHet9EoOGErmWyBoxXUMFfkZDgMRz7uGiSS81at\nR7+4i7GCJ+aKylgztjXy2fq+jgWO9tm0NZYWe7FLYFtDQwMeeeQRPPDAA7j33nvHenqX5osvvsCl\nS5cwceJE3H///fZejtNA9805WLp0KQ4ePIglS5bgwIEDYzp3dnY2du7ciYaGBhQXF2PJkiUAYPP1\nMPNMmjQJFy9exLp16wAAO3fuxLp167Bype2Lt9jzvhIjY8x92S0tLVi/fj22bduG2bNnW3ydq0ch\n2kq+2NgEqNUaxMYmOMQ905fNUfd7h3vfrocIWUeSLyNjJdRqDTIyVtpkXdbI98EHHyIv7zDGj4+E\nWCxGZGQ0Zs68yabrAYD585dg/vwlbE64Wq2BTNaIsrJSlJaW4YMPPrTY1W6pfLa+r2OBo302bY2l\n0elj7k5/8803UV5ejkuXLmHv3r3497//jTvvvBN8Pt/sda7uNrGVfMN1S48W+rKNtBb7aDHc+3Y9\nuPQcST5r620P5SYeSj7u9cnJKeju7kZ/vwbV1VXo7e1FVVWlSYU6Uhc11z1eUHAKTU1N0Gq1kEgu\nWOxqt/T9s0ft9JHiaJ9NW+OwtdO3bNmCLVu2jPW0hIPgSkVVpFIJDh2SIDbWft3cCPOMNF2Ke/2e\nPTlsTfKsrN2QyRrZbmH6gWgjTR0zFtyWlbUbcXFxqKiooMhxgoVCwwmbw3WZBwfP0HltNNuXDtdV\nb+11zPlKpRJyeTPUag0pcQdluOlSjBIFBiAWixEXF6dznBmPq8wB3QYlw0kd4z4glJWVsmNyI8av\nrY3yuAlS4sQowE2Rmjt3hsHrI9kXl0olKCw8DWAAaWk3jbj+uVQqQX5+HlQqlcXXMYVpfHx8MXHi\nRMTGWj6XI8YDuDLDTZdiLHCxWAy5XI6Kigqd44ChZc5V1sZSx6yZNzk5xWSDEyrGQnAhJU7YnKFc\n5tYoW33FJ5GUQy5vZsfhXp+QMAVKpRJKpcLi+ukSSTlUKhWEQqEVLv7BwjSenkLcf//9FgfXjERu\nYmRYW3ZUJmtEcnIK5s69Wcd9bcyyN2YlZ2auMdmgxByWKH8qxkJwGfPAtuHi6gEMriQfN0jM29sT\nJSWlOjnY1uRBcwPheDw31NRUgs/nw9fXDykp03SuF4uDUFVVgcbGeosD55i16Fv1DMbyxz09hdBo\n+pCSMg2RkREG8g01l7Vym5JjtGoCcHGVz6ap3GuufEwgWl7eYZSVlSIlJRXvvfehTsCXuQAwZh+8\nvLzM6hxvBksCzBITk+DuLsCOHW9g166PIRKJDM5nZBEKPREbO3QdDmtwlJxyV/lsmsJhA9uI6w99\nC9SaffFB61oBpVKJwsLTkMtbzDY4sTZwbqi1mKtUZ+6c4czFxRI5qLKb5VhivZpzZVtiye/Y8Qbk\ncjl8fHxG3UrOytrN7plnZe02WBMji4eHAPPnL7FpUxNy5zsWpMSJUWc4bm4GxoVeU1MFsTgIUVEx\nZhXbSAPn9N3YlihT7oPGcNqgGsMSOVwp0t/W6CstbsAZYFz5mHNlW6O4YmJix6TPuEzWyP7f2OsA\n2EIxtlS85M53LMid7gC4mluI6+aNjIyAUOhrtZsbAPLzjyEv7yC8vLwhEgUgJWUa5syZN6o58Iwb\nu6OjHVVVFQgKCjE7p7e3p458zHWj6eJmGIuaAMP9bI6Fy9XcHMbc58aOceUz5crOzc1BXt5hhISE\nYsOGjSblEYlE6O7uNnuOrWRNTEzC2rXrsXbteqNzMbLMmpWG7m610ZKsw8VRcspd7XtTH3KnE3bD\nWHS6NVYjYw3X1w+2JW1uluG3v900auvlcq0zm8IqV7X+dUql8roOTBsLl6uxORgLnEkJMxUxbgn6\n6V4LFy42K4stG4cY63Y2kvtJTU1cF1LihM0xprCtaXnKpHz5+PhCo+EjPt72ld30O69x09buuivD\n6s5s+h3drH0IGA3sGeE+Wi5XrnIzNod+ChgXaxQZt1iLuXSv0cJctzOC4EJKnLA5jMKQSMrh5ydE\naGi0xddyU77mzLl11JQP11sAwCBtzZKHDmMV22zZnnWk2DPwbSiFaYt2m0yeNhdbKTtusZbHHnt8\nzK1YfTnIkiZMQXviDoAj7+0MN42J2Vvu6+tDXJzlCmSolK/hrpV5TSZrRGlpEfz9A9Dfr0FfXx+C\ng0PR398PLy8vg7Q1c2OfOvUjKisvo76+Fj4+fgbpbsx+9VikghmDx3NDR0c7+vrU8PQUDmvu0fps\nWtNu01j9clN7u5bu1w6VgsXsIW/e/ISO8rTlXr+5sRg5rG11qo8jf7dwGc59dRbZhgvtiRM2YbjW\nHGOBpqamWjWfNdHl+tXbmLUqlQoDNzLzmlDYCJVKhagowNvbBzU1VfD29saqVb/RGVf/eqZKm1Kp\nYI8lJExBS0sTuru7IZGUXz3PsJqcvSxibmS/fmEce2ONxTyU9T0cdux4A2VlpZDLm9HZ2W3gFTBm\n+Zqrhz4cz4Il+9zXSzrX9SLnaEBKnDDLcNOYGGU8mu0CudXbCgtPIy1tFgBAqVQaKE1m/f7+Aejo\naNORR18240qXp/dz8DU/PyF+/vksEhKmmKwm5+8fAKGwEf7+AQDGdq/aUdPQrHEP28pFbqw8KmC5\nAjFXD50Zg2mGwm1UMpLKa9fLXvj1IudoQO50B8CR3ULWpjHpu45HIttQbujBCm5V0Gq18PLywq23\nLsSkSZPZimrcymiMHNHRseDx3CCRlJtMHzNWWY1bpY17fmxsJMaPj2Mr0XV0tIPP50OrHWBd2KWl\nRZDLWyAUCjFp0mSDKnSj5Wq3xcPCaH42LXWhWuIit2Qsrgt/w4aNqKy8DDc3N6Sk3AiRKACZmWvM\nuq9Nudi5rymVChQUnEJVVeWQldssrc42knQuR/5u4TIcOZ1FtuFiqTudlLgD4EofRv1yocOVjYlS\nl8tbTOaWi8VB8PMTGSjXoR48hippamw/m1H4ra1ykw8pYnEQkpNTUVtbrZMTr/9QwP2dsfqZc225\nf26L3u2j+dm0Zl/cFmNxc6XT05fju+8O4NSpnyASBWDPnhwkJiax4/z00wlERkbqKBVzioZ5jckV\nv/nmW9gHg9HcOx8Kc++fo5RPHS6u9L1pDNoTJ+yCrdy3ljQm0bc0TVme+fnHIJWeR3z8ZMybN9+q\nNeq71o252pl5GVe9v38AoqKujc/dG2d+17eMr6W6Ge69DxdHdKUPlSI2XIyNZaxqG9eCzsxcAw8P\nATIyVuocKy4uhFwuN1rOdChGI4p8tPaLaR/aNSBL3AFwpSdKfSt4uLJZ0phE31I35aYuKjoNlUqF\nlpYm+PsHID4+weItAnNWNGOJHzlyGDU1VejsbIdc3oKWliZERsZg2rRrbVhNWcXMmBJJOWSyRly5\nUnt1e8AbycnWBQXqY4uKbrb+bDKWbmXlZVRVVQ67lrexCmb6VrK+dW7smo0bf4vIyDj2msTEJERG\nRqKy8jKUSoXR5iK2wlJLeCTV1sy9f7as4mYPXOl70xhkiRNOh74lPVRjEn1LnftT12KejPLyEmi1\nWqujtPXXYc6K9vcPYOeRSs9j3rz5BucYs4q5kfMaTR+EQiEbpGcJztS2lLGUZbLGEVmBlliR+tY5\nc01xcaHZ69LTl7PR6//3f78f9hrNYS7S3dh6RsNSptxz14AscQfAlZ8orZHNmj1cY5Y61/LkWszT\nps2Av39s3nB9AAAgAElEQVSAjgVtbO/ZkmNSqQRHjhxAefkv8PQUsrXhmaC5np4edHa2Iz5+8HeG\n1lY55PJmBAWFGFjGMlkjOjvbERwcCpEowKoceUtiB0bCSD+bpixmZu94uFagJVakvnXu7i7ATz+d\ngFwuZ61zU/Lt2vUxmpqaoFarbbJnr38ftm9/FuXlZRCLxdi8+QmTrUT1rXRrj9N3i/NCljjhdFi6\nh2uJ5am/D62Psb1tS44NppG1AADy8/OMVqTTaDSorLyEsLAIi3LFOzraoFKpwOPxdFqsmpKTe9yS\n2AF7YspitsQKNJd7PRwrktvJbKh9+Mceexw7drwB4JolP5J2nubKqBobizn/hx+O4eefC/Dii68Z\nHcfU+KawZUtSwjEgS9wBcOUnSlOyGbN6Ld3DtTRFi3ueXN6sY+Uzlrq/fwBKS4vA47khKCjEILXM\n2J54R0cb+vr6oFarDSrS5eUdhFqthlqt1rGMjaWtMTCWuJeXN4qLz7BWvn7kujG5EhKmDLvCnSWM\n9LM5kn1XW0avMyQmJsHdXYCsrN1wdxcgLW0q9uzZY2DFJiYmQSQSoaqqEsnJKTqR66bWY26PW/8+\nDJVS5e4uwMGD/4FGo0FVVSUeeWSz0XFMjc+g//6Nxj21F678vQmQJU44OMOtYiaVSqBUKuHj4wul\nUoHCwtNsgRX9cbhFVsLCIgAYWvmVlZegUHRBqVRg1aoHDcYwtSfOWMOBgYHYv38vZx9/Ms6fL4VQ\nOM7iBjCMJd7cLINKpWLvjynPBPe4pTXe7bVnPpJ91+FEr1tiaXKt1g0b1lls3ZpbT25uDv7v/34P\nhUIBmaxxxNXc0tOX4+efC5CT8xWWL79P57ixMSy9z1RUxfUgJU6MGVxlMtz0J6YqmlAohELRBbE4\nCFFRMew43DkY5djR0YZ58+brKLBrDxGGldiMrdeUcj90aJ/Ow8i8efN1AtosGZMbGFdfXwuAZ1RB\nc6/lut2HWq89G6GMBEaRPfXUH3RcyuYYyq2cm5sDmawRyckpOgpNIrmAgoJT2Lr1T+w8mZlrIJM1\nQiZrRG5ujllFmZW1GwqFYlhrMsWLL75mkczWQMFsrgcpcWLM4CqTu+7KGJZCYazr4OBQ8Hg8swrL\n3INCQsIUNDU1svvJxqLBTSk/rrJMTU2FWq0xmMMahWrOmtbf/zanjE29bu98cVOWqCUWak7OV5DL\n5cjJ+YpVaNye4UxpUwAm+4hzycrabdAbPD19OZ566g9QKBQ683D7eA+VM84ofGBwP13/NXNrIoiR\nQEqcGDNsoUxMBYEZm8OccuQGnCUkTEFjYz3y8/N0Hg5MrfdaoxUlAgL84e8foFPIBTBetIXZChCL\ngywuYKP/UKJUKqBUKiGVSkymuumPbU1TmdHAEnc18ztXIWdmrsHy5fcZuJS5QV8ajQYyWSMaGurZ\ndC39PuKAruIHrinU7OxsfPDBh5g6dRqKi4t05uGep6+Ahyoko3+OsTURhC0gJU6MGSNRJtyqaNxq\naCOZg3tufn4eVCoVamur2dcZb4FUKtHZ92bmVioVuHTpEtzc3KDVaqFUKjl72YZuemYrICoqxmy0\nObfPOVfpD9WVzN7K2hSmFCFjvUokF9j9ZAammQgAhIdHYObMm3SuY6qqicViAIBcLoePj4+O65sL\nk/ctkzXi6NGT7PFXXnkFxcXFGD8+ElOnpunMA5h2P9uqA5kl3giKKCfMYTclXlJSgtdffx2fffaZ\nvZZAOBGM8oqKglELfKRwC8Lop2sxczc1NV49d1BZ5ucfQ1tbK3sNMMAq4LS0WTrBaYBpS9nUFoAx\npT+UN8OYG1+/ZStzfKyUg7lgLMa9DQACgQBxcXGsIpXJGtnXsrJ2sz/j4uIQHh6B8PAI1nWdlbWb\nPX845VLb29us2re2VQcyakdKjBS7pJh9+OGHeP/998Hn87FixQqLrnH1VAJXlc9WsumnaA23UYip\n66KjY9mCMPrpWjyeG+rra6FSqXTSvUpLi9De3gahUIh58xYiPHw8u0YABsVd9FPomLUM7vML4e8f\ngLq6GlYBG0tLG05zl1OnfkRjYz16erp1jluSbjSc98+axhru7gJUVl5Gd3c3VCoVRKIAbNnyPFsQ\nprLyMkJCQrFhw0ZWmVVVVaK6ugopKanYsuV5iwrIMK9t2LCR7VRWXHwWdXVXEBQUjKVL70Jvb6/F\npVZt1YHMkhS80Sq76uy4smyAg3cxk8vlePDBB3H48GFS4nDtD6OtZNNXXsPt0GXuOmPdy3g8N8TH\nJ8DHx89oDrmb2wBSU2ciPj5B53pL1secIxQKcdddGSgtLdK5Rr/KmyUPLsYUP9Mi1cvLS6fb21DK\nITc3B1u3PgM3NzerlIc1uciJiUlYu3Y9YmJidNbCeAk2bNiI2bPnsBa4SBSAm2++xajCNac0JZLz\nKCsrRXJyCqf8ahEaGhoQEhKKXbuysGvXxygrK0Vl5WWsXbuevQfWVEizltFuR0rfLc6LQ+eJL168\nGHV1dfaYmnAR9N3K5tLBuF3MLA2u04/0NrbfHB+fgLlzZ6C5uYs9Zunevb4MxoLeLOmgpo+pdeof\nsyaf2tfXH3y+YSYAF+7913cj5+bmsNXP5s69mY0oN1fBjZnbWNBabm4OG7W+Y8cbFm0JcF3ScXFx\nOHr0CPr7+02ez9wfrkvfmgpptI9NjBVOE9gWHOxr7yWMKq4s32jIFhw8A3PnXusSduiQBDU1VfDw\nEOgcB4CKCglUKhUqKiTIyLjb4HUAKCsrQ0lJCVJTU5GcnIyZM6fDw0OA1NTUIdfPfZ1Zx8SJAvzP\n/6y1SIaysjIcPHgQ3d3dmDhxIru+sLAQtLQ0ISwsBMHBvpg5czp6e3vQ29sDmawaycnJQ94nU+zd\nm428vMPw8BBg9uwZOrIzbNy4AR4eAsycOd3kvdWX28NDgA0b1mHDhnXsa3//+w5WETY2NqClpQUl\nJUXw8/PCypUrjY7HzN3Q0AC5XI6goCBs3LgBwcG+2Ls3mz0mEPBZObhzZmdnY+fOnVi3bh1WrlzJ\njrdu3Trs3LkTAwMDAAA+n4/IyPFISpqAmTNnQiDgs2suLi7G1KlTsWTJEqxbt07nfeaOZ+zzwb2/\nGzasw+bNm/HFF1/g/vvvx1tvvWXZm2Qj6LvFtbGrEmf+kCyBa+24GsHBvi4r31jJFhubALVag9jY\nBIP54uISIJWeR1yc4WsMx4//CLm8GVVV1ejsVCE+PgG33TZYE725ucukpa8vn7l1mOLnn8+iu7sb\nQqGQvU4qleCXX36BSqVCYWEhKioqkZY2CxqNFnJ5M3Jy9uLixctmC8uYIyNjJdRqDTIyVuLnn8+i\npqYKarVGpw78/PlLsHLlSvz00xkUFhagra0DP/10xqg1HhubgNraK9i3bz96evp0rE+NZtDi9fHx\nQUbGCuTkfIWWlhZs2rQJeXnHjFrm8+cvQWdnN3bseAPJySl47LHHMX/+EjQ3d7FrZyz9HTveQG3t\nFXz44U62ytm4cV64cqUWarUG8+cvYf8BQGdnN0pLy9De3ob169fj888/h1wuR35+Pjw9PSGXy5Gc\nnIKFCxfrrIv7fnLHM/Y+R0ZGQywWIzIyGs3NXfjoo4+gUCjw0UcfYcuWPw/rPRsOx44dxAcffOiS\nHgFX/t4ELH9AsasS5/EMq2QRxHDQb3jCVTRDVVEbZPCBUqPp00nfYpS3Uqk0Wd7V0nUMRokXAOAh\nLW2WTsS5Uqlk18BcP1iClQeNRgO5vPnqmMw5AwbtTq2B675mXPlKpcJo/vlQqW3MOdu2PYO8vMOQ\ny+U6CuOxxx7XcS3PnHkT24aTcYsza+K6oY0VZtFfO3DNtZ2VtZtNPfPx6cXChYsRFxeH1auvlUxl\nxi4sHHx/goN90dPTq6P4xWIxHnvs8REpvYqKCsjlclRUVAAARKIAKBQKeHp6susZC6W6c+dOimx3\ncezWAMXPz8/ioDaAAtucldGUTT/Qy1QwmSUBYZ6eQnR0tMHLy1sn+IsZ08vLC8HBIQbR8e7uAvj4\niHTGMrUObpR4R0cbqqoq2MC5qqoKNDbWGzRo6e/vh1qthkDgjhkz5iA8fDzq6mrR39+P8PAbkJCQ\nNOxIfYYTJ37A+fNlAAZ01swEtp09+zPKysowfvx4TJ9+k8k5TAXK6QdmJSYmITIyEt3d3bj55lsg\nEgWw13CD4jIz11gUlc2d19/fH1VVlVi1ajXee+9D/Otf/2DHy8s7jIKCUzqBa97enpg9+1d45JHN\nCAsLQ3d3NzZvfsIqhWcsyE3/XjBj83g8FBScGrMGJCKRD9raOobd8tWRceXvTcDBA9sIwhZwK6eZ\nCiZj+m0zjUWsCQgDDCvAMTAV2Xp7e7B8uW4rUn//AAgEV9DaKtexbJmKawAPvb0qnYpu+gF3+o1W\nuPMzcjc3y9jXuQFv1jY8ycrajYaGOixatAiLF9+pczwv7zDEYjHkcjnkcjnWr99kchyuhcxY1Hff\nnY7ubgWKioohEol0XOfGFCW3XjlgvvqaMWtWv944N8iOCa4bav25uTlWWcvGgtz05eOObUkrVFux\ncuVK1u1PuCbUitQBcOUnytGUjbFW+/rUaGysZ1O1uJbiqVM/Qi5vuVof/SaDHO2hrFdTednl5b+g\np6cbPj4+SEq6Uee10tIitLW16rQj1XelNzfL0NPTDS8vbyQnp5qcx9hx/bx1f/8AdHa2IyIiEtHR\nsVan37m7C1BdXY2FC2/D3Lnz2ON9fb1ISIhHSsqNUCq7WXf7v/71D7MpV3w+H0ePfo9ffilBQIA/\nPDzc0dbWim+/3Yfy8jJUVl7Gd98dMJqelZiYhO++O2DSWs3NzcFTT/0B5eVl6O7uhru7gP3d2Lhc\nLwA3V5x53djn09p2ndbkcY8kXWw40HeL8+LQeeLDwdXfLFeVbzRlYxScp6fQZK9uRtHrF3AZbp45\nAzPnnDmz4eMj0nko0Gg0aG1tgYeHB3uuRFKuU3AlJWUa+9NaF7hYHAQfHz+2r3lXVye6ujohFAp1\nXPHG7ocxTCmW6uoKqNW9SEiYjMuXK1FQcApVVZU6CpRR3Iw12t3djYiIMKjVvfD29oanpxAiUQDq\n6xuQljYdIlEAlEqFWZeyu7sARUWFqKiQorlZhgULFrOvbd/+LMrLyyAWi7F58xPIytrN/u7r62t2\nXG6uuDklbkn+PNd9PtaK2Rrou8V5ISXuRLjyh3E0ZNO3os1VMTP1mrWKztS4sbGRKCkpRX5+HuTy\nFmg0fWhtbbnqNh+sr15fX4uIiEj092vYPff4+ASzldeMyak/P7OPrr9fLxYHgcdzg0RSbtbTwIx/\n9uzPePnlFwwsY6aYTXt7J3788QeEhITi9tvvYPewuYqbu389eXIyzpwpQH5+Pnp6evHSS69j6dJl\nWLBgsU5ltSlTkvDjj0dRV3cFKSmp7LyJiUl4663X0dHRAYnkAv7735/YtTEV3vr7+1FSUoTU1FSI\nRAHYvPkJzJ49x6jyZZRuTs5XKCkpMtgT1/98MvNkZe026i2w1lK3J/Td4rzQnjjhsgynPzZT8IXb\npcxWNdiZSHKBwB1KpRK9vb0AAKFwHDSaPran+apVD7LXmKpnzn392LHvodFo2H1z/b1upi1rRESk\nQZQ6c49qa2uwY8ffsHjx7Qb7u8y+fldXl9EIZqaYzaJFt7FR4sb6Wxvb405JmYby8vPIzFyj00Hs\np58Gm4889tjjKC0tQmBgICoqLhqMuXz5fdi9+3P09PSwRV+YOZio9StXatnzd+x4A4899rjBHjrj\nfmcapABAe3s7u+fNzS3nYq6Yy1A10fX3vanoCzGakBInnI7htDSVSs9DpVKhrq4WWq0WgOUPAJau\nR6lUQC5vho+P79Wc74kIC4swaIQCXOtoxvxfPxUtPz8PGo3m6hEeex734YVpy9rR0WZ0TUy/dIHA\nTacpCPMwwDxsBAQEYuHCxbj77nSdbm0MXKXFfZAwB1epr169/GqZ00I2nSwrazemTElCVVUV/Pz8\nda7Nzc1BRUUFYmJi2SIxXLi9uwGw53CrtzFzyGSNbLez5cvvQ0VFBWSyRlZBc5U4V/maU9SmgvIY\n9FusUooXMZqQEiecDmOR5ENFZMfHTzawxM1dN9Rxf/8AdHS0YebM6QaR5K2tcqhUKtTX12LevPlG\n1zMYwV6n0zHtWk66go2m9/HxRVraLACDirm1VY76+jrk5x8z+zDDzPnjj3nQaLQ6yoh5GBCLgxAY\nKEZCwhRs3Ph77N+/16iHg6u0uOfoW6umosYZpdve3o7x470gEonYaHFmj3rr1msFUJhxk5NTkJyc\nAgBstzL99XBLugIwUJ7GiraYihDnyrNnj2E7U/1rTSllYw8AYxWNTlx/kBInXIKhXOymCr6Yum6o\n40LhoJXr4SHAbbdF6yj9wsLTUCi6wFjQxh4IOjraoNH0ITDwBoPUMbE4GEKhECqVCoGBg/2yGQtZ\no+mDRtPHFnoZqvCMYbGZ0+jtHXT95+efwOLFtxukwCmVSqNFX5hzmJ/6yopb75xxnzMpZaGhYaxL\nnnF5c5WvKSt4KOvVWFqbvvLUH8Ncehv3pzEsaQtqLL2MIEYLCmxzAFw5QGOsZLMkUM1YoJip67jH\nW1vl7HVBQSHQaPoQERF5NW1tGnx8RDrR7vqR58Yi4U11G2tqaoRSqUBoaDhEogC2rzhzfUREJDo7\n2xEcHAqp9AJkskaUlhaxP80Fsv3739no6uqEWq1Gb28vtNp+HDiwH97e3pBIzuOdd97C+PHj0dXV\nya6V+/7l5ubgnXfeQmzsBFy6JMHJkycRERGBr7/Oxq5dH7NBZkz0uURyARLJBRw7lodf/erXbEAc\n0wrUx8cbnZ0duP32O5Cf/yPy8g6jsvIyqqoqWeVrTbcwbpT4UMFpDFz59KPMLSni4ujQd4vzQoFt\nxHWFqWItXIxZ16au4x7nupDvuivDaO10JsjM3z/AYExjbm+uC567Dz24F96H5mYZfvvbTVdLoiog\nFgezLvx58xYaeASYn8zYxgLnioqKERYWAn9/f7i7uyMiIgIKhQI7dryB0NAwNDTUoaWlBTExMUZd\n9IcPf4/Q0GDIZPXw8PBAVNR4tLS0QKvtx7lz59DQUI+//OV1AIMWq0RyAQqFAgqFAhUVFdizJwdS\nqQRffvkZGhrqIJPJ2NKkjPXL7Fcz1jy3ixgz7kiKsFiDJUVcCMLemLTEB/NA3cd4OaZx9ScuV5XP\nkWQzZXVzLXSu1T2UtQ5ck6+0tIgtKqOfd87tC86Mz1jONTWVaGysR0dHO6qqKuDl5Q21upe1tGtq\nKiGXtyA4OAStrS1obKxHU1MjtNoBeHl5ISYmDkKhkPUMMJ6D/Pw8dHV1siVek5NT0denRlNTI7y9\nvQEACoUC+fn5iIyMxIIFC3DDDTfA19cHwcEhmDNnnkE/8YaGWohE/uDzBzt98fl8BAYGIjAwEBKJ\nBDfccAN8fLwwf/5ibNy4CWFhYaisvAwPD0/092sgEonQ2toMtboX48aNg0RyEUFBQejv12D27DnY\nsuV5Nv2MseZDQkKRkpKKuLg4vPPOW2yOurEiMJs2PYRduz5me4xbYjWb+nwy7U61Wi1+9atf6+Sq\nOxOO9Pdna1xZNsAGeeJLly5FUlISIiIibLmuYePqb5aryudIspnKGee6u+XyZgPXt7k8dEY+c4r+\nyJGDrKLu7GxHTU0VOjvbIZe3QK3uBZ8vAI8HNDc3wd3dHQEBgejuVqKxsR58Ph9ubm7w8vK+avVq\nodUOQKnsQnBwCBYvXopJkyYjOjqWXSNTpY7Zk2eqwiUmJiE8/AbU19dCo9HA19cPzc0tWLBgAXp7\nVRCLxXBzc2Mrv23f/iwOHfqeVZq+vn7QaPrQ06NCT083vL19IRAIUFJSgs7OLixatAghIYPbDZ9+\n+gneeect3H77HWhubkZZWSkqKy9j3bqHcOZMAU6cOIHa2hpotVpcuXKFzd1mXNrc6mpbtjyPF198\nHtXVVfDx8cEf/vCkQR74U0/9AdXVVWhqamIL0Riz2vWVfVraVKOfz+3bn0VJSRG79WCqwpyj40h/\nf7bGlWUDbKDEJ0yYgGeffRYNDQ2YNWsW+/RtL1z9zXJV+ZxBNq4CZva8LS0Cw8inr+i51n1Dw5Wr\nJVa9EBwcyu5pq9W96Ovrg1arha+vH7y8vNHR0YG2tlZ4eXlDq9WiqakJfL4buruV0Gg0EAgECA+/\nAWp1LyIiIqFWq3Hq1I+QSM7h5MnjUCgUiImJg0bTh6ioWAiFQp2qcEy1N42mD9On34SNGzfB19cP\ndXW1aGqSgc/ns94Ed3cBNBo17rxzGaqrKxAUNGih//Wvf8Gnn+4CwMPly5U4fPgQOjs7wefzkZyc\ngunTb8K2bc9ALpejqqoSvr6+aGpqQkhIKB5//E9oa2vD6dMF8PDwRFdXF/r7+9Hd3Y3mZhlb0jU9\nfbnO/vSOHW+gs7MTISGhePPNd3XeA6aKm4+PDyZNSsCGDRt1CtFwrfbt259FQcEpVtk/+OBvDD6f\nubk5V3uBeyIqarAufkHBKfz00wlERkZaVMXNUXCGv7/h4sqyATbYE7/llluwb98+7NixAytWrMC2\nbdt0rHJHsdAJYqTo72Fz96qZfWhLm4kwMIVUlEoF0tJuYqPTmcIwzc0yBAeHoqGhDkLhOPYcubz5\nasDcLGzb9gzbmCQqKhoKxeDeO4/HY/PDOzraUFNTBTc3N2i1WrNR69woeW6hG6aNKDNXQEAQHnlk\nI6ZNm4rXXnuN7TdeXFyIlJRpBlHcMlkjqqoqcfr0aVRUVKCysgpa7QD4fD6mTp2GzMz7daLGmX3l\n1auXswVbFAoFdu3aid5eFXvOUHCLyDDr0b+OaUXKRMrHxcWx6W4yWSOys7MNGoRwW6Du2ZOjUzCG\nm2+vfw3lgxP2wGx0uru7O6ZPn47CwkK8//77OHDgAPbu3YtvvvkGa9euHcNlkiXurDirbIyLnXF7\nm6qxbko+pkGKl5c3br11AWulc5uXqNW9UKvV8PX1Q0NDHRSKLvj6+mH27HmIj09gG5PMmXMz3N3d\n4eXlhZ6eXtTWVsPd3R1RUbGs1e3r6we1uhfx8YOudQauR4AJhqurq8Vf//oXg6hrpgnK8ePHEB0d\nCTc3N/T19WHixMk4c6YAzc3NALSIi4vH448/yUaBr127HjExMTh2LI8tldrZ2YGBgQF4e3ujqqoS\ncXFxyM//0WDOAwf2Y2BgsEe6QMDH5MlJUCoV7L42w5df7kZTUxOioqKxdu16nUYoIlEA9uzJMdr+\nlGlFytR8F4kC8O233+P48aMoKDgFpVKJe++9T+e9099L57ZOjYuLM9oAxlGj1p31788SXFk2wEbR\n6cePH8cLL7yAW265BceOHWPLFhKEq8NEZw8MDKC5WQZ//wCDc6RSCQ4dkiA21jDCPS1tltHKZtyc\ncGbs3t7eq3nlQGCgmD2HsViZ6PioqBhIpRcRGBgIALh4UdfqZixtbo43NyI/IWEKZLJGfPPNXpw+\nfZqdg/szK2s3Zs6cDqFQiP7+fpw5cwaff/45oqJiEBsbCw8PD5w9W4BVq5bjV7/6Nfbs2WtwX0Si\nAMTEXHuQaGioQ2TkDWhoqNOxZNPTl2P79m24cqUWU6YkY9myu3D5chWys7OQlbUbwGBE/LRpU/HQ\nQ/+LfftydXLSmUps5sqfymSNSE5Owdy5N+tEwTM/J02aZFHbUa73wJjFTVHrhL0wqcQfffRRnDt3\nDi+99BLmzJkzlmsiCLuh73Lev38vW31NvyQpoyDVao1V1d70xxaLfeHp6QlgsJKc/vXcFLWuLgUk\nknPQaDTQarU6azKWQqef3lZVVQmFQgEfHx+TFcvEYjGmTZuK2toahISEXK1vXoHbb18CqfQ8/vvf\n/0Kj0eCHH46zLm2ZrBFRUVGYNWsWkpJSEBQ0WAnu3LkyXLhQDl9fH4jFQUhM1H2oee65F3QeHCZM\niGErrGVl7UZoaDDrYueiX3rVGFy3OFPzndsrfM+eHKxdu8pAKY+kbjpBjDUm3elnzpzBO++8gwkT\nJozxkozj6m4TV5XP2WTTL8xyrWd5Hxob63Xc6jJZIxSKToSHj9dxYZtqc2pq7JSUabj11oVsX3Hm\nvJKSIkgk5YiOnoA5c+ZBLA5CSkoqOjo68PXXXyE6OhpabT8uX5bim2++gkgUiJCQwW5mJ078gO3b\nn0VoaCjuvns5O65W2w93d3f09qrxyiuDOd1MUFZcXBxEogCkp9+Lffv2oaysFB4eHrh06RLa29uR\nmjoVXl4+2LnzE/T1qfHrX89HWVkZGwQ2b948xMTEgM93g1zegvr6WowfHwWFohNarRZisRje3l46\n6XtMKlhOzlcYGBiAXN6Gjz/+nD1+6dIljB8/Hj/8cByHDx/SiWI313ccMO7i1u9AJhL5oK2tQ+cc\nc65xR247agxn+/uzBleWDbCBO/3ZZ5+12WIIwlnQt1yZoLc9ez5Fa2srAgKuRax3dLShu7vboAGJ\nqZrmljZuSUiYgoKCUxgYGICvrw/bIIWx0JOSkpGUNAUDAwPo7+8Hn89HWFgYDh7cDz8/EWSyRhQV\nFbPWZFbWF/jhh+PIyFiOadOmQaPR4qGH/pcN3CstLUJDQx0A4IUXXoZEUo4pU5IgkzVgYGAAYWFh\n8PHxweHD30Mul6OtrVUn6AsYfKCpr69HWFgY5HI5goKCoVKpIJWeh0ajgVAoRE9PD9tZjbm3zN52\naGgoPDw8cNNNM9j7wHVRf/HFFwb3aSir2JiLW/+alStXGgS2mXKNW1I3nSDGGt4AE1Xi4DQ3d9l7\nCaMGU/XLFXEV2Zi9UG7tb6lUgspK43vilsDd69Zvi7p58+8QExMDHo+HtLRZmDdvPj766D0D1zKP\n54aBgcGubA0NDejq6sKkSZPg6SnEkSN5yMxcg4cffohNT/vhh1MoLCxAR0cHNJo+tkZ7a2srUlKm\ngcB30XcAACAASURBVM/noaamCq2trVCpVIiIiGAfFDw9hQgKCjWZf820Fr148SI0Gi2mTZuKiopL\niIubCC8vH+za9TEWLlwIb2/vq+OrsXv351AoFHjggQcwceJEeHoKsX79JoN7NVoKlPl8WjK+sc+A\no+Mqf3/GcGXZgEH5LIHKrhKEBRiz+ph+20N9kZjaIzdnmU+aNIn9P2PpFxUVIzo6kq24JhQKMW/e\nQuzd+yX4fDf09/dDo9HC01OIW29dyCrDw4e/g7u7AH19mqtpbC3s9fHxk9HR0YbFi+/EuXNl+O67\n7zBt2lTExU1CTU0lAMDfX8R2O4uPTzBQclKpBHw+D7/61UJcvHgeGo0WixffrtONjNmLV6lUSEtL\nQ2FhIWpqaqBQKAAA586dg1arRWtrK44cydNpnsK1jJmAN1sqcm4KmbmxaT+ccESoAYoD4Mp7O64i\nW2JiElJTp6K1tVlnT9cS+UztkRurBMfsT0dHDxYZ4fHcMGvWXIjFQejrU+P48aPw9vaGt7cPtNoB\n7NuXC7VahZCQELS2tmLTpsegUvVAo9GwDVECAvwhEPAxfnwkTpw4gdDQUAwMDODcuXP48ssszJo1\nB3PnzsP27c9i//59EIuDMGVKEoKDQ652WgsCj8dDUFCI0QI43HS8W29dCD8/v6vKdgCdnR3o7+9H\nS8vgg0NPTw8aG2WoqKhASEgooqKi4eHhCaWyGx0dnejs7EJBwSmUlBSjouISu3ctlUpw9Oj3+OWX\nElRXVxstu6pfbMWSAize3p7405/+hPLyMojFYmze/ITJc51tPxxwnb8/Y7iybAA1QCEImzNUu1NT\ndHUpDPbTjcG1CKdOTYWvrw+bcsaNAv/uu+/w6KOPIjAwEAKBGxQKBbq7uyEWBxk0RlEqFQB4EIuD\nkJ9/AmVlv+hY82VlpWzaF2NhTps29eoYg6729nYpPDw80NQ0GA1+7lwZsrJ24+670+Hr68M2f1Gp\nVJBIynWi3OVyOZKTIyASiQBc6wvOdV0zbuqEhERkZq5h7wE3fUwiKUdgYCDuueceKBRKLFhwMzte\nevpyoxHlzLHi4kL2Hpvqdw4MFoYZDUufIEYTUuIEYSGWBqbps29fLruXunr1gybPG0ypCsUdd9wB\nAIiKutZNjOkgFhoajAUL5iMsLAJqtQrjx0fC19cX/f0anfOZSnP19XXQaPoAADNmzISHhwDe3t5Q\nKpW4cOECkpNTkJm5hnWJ3313Ok6ePIFp06YiPn4yDh8+iMuXLyMtLQ0AdJR0ZOQNiImJQVQU2M5q\n3D7j+i5xLtzf4+LiUFxciLi4OB0FzL0uIWEK+xABKNjOZswDCHcMhszMNSguLmQrrQEwm+NtKgec\nIBwZUuIEYSGWtDsFBveIf/wxD0VFxVi8+HaL91IzM9fg5MkfEBMTg9bWVp1gt2nTpqK3V3W17agQ\nbm6Dx728xmHcuHE6e9bcNT7yyEZMmjQRAoEAWm2fzt7zffetxK23LkR8fAIbZNfa2ors7CzI5XKs\nX78JH330TwQFBaGmpgaLFt0Gf/8ALFq0EF1dHTh9+jQ8PT1x7twF9PcPsIrv3LkyAMDMmTex+dnm\naG9vx+2334729nYAxqPDGZl+/DEPFy9exPjxkRCJROw9raiogFwux08/ncTq1ctZL8G2bdt1isSY\nex9oz5twRmhP3AFw5b0dV5YNMC7fqVM/orW1BW1trSgoKMCWLc8b3U/XJzExCS0tzaivvwKAh/ff\n/zu7n+vr64czZwpQWloKgUCA2tpa+Pr6gs/nw9fXDxkZmUbbq4aGhuHy5Uvw9xdh8uRkDAxoodFo\nrgbODbAlWGNjJyAkJATe3r7w8/PDzTfPha+vHwYGBluIikQinD9/DipVN/r7NUhISIRc3obz58/j\n2LGjOHjwP2hrk2PBgsUGudjM3nRfXy+qqyt07oFUKoFC0QGxOBDBwUFQqVRszj23ZKxYHASxOAh/\n/etfcPjwIcyceRPb6MTdXYDk5BSdFqaTJk2EWt2LkJAQPPPM80hMTIJEch5lZaVITk5h97W5758z\n7nkPhSv//bmybIANupiNFgMDA3j++efxz3/+E/v27cOMGTPg7+8/5HWu/ma5qnyuJJu+UgGMy8fj\nuaGurhb19Q1YvPg2VFdXoKamyqBYjDFSUlJx660LkJ2dBT8/H1y6dAlLly6DWByEtrY2XLhwDp6e\nnigsLMSFCxeu9vKWoq9PDT6fz66vsPA0Ghvr4e3tjcce+xNmzpyN6OhYdHa2g8cDQkJC4eXlDZms\nEV5e4yCVSrF585+QkpIKrbYPra2D9eLd3QVQKpVwc3ODt7c33K66APr6+hAeHobu7m54egqxcOEC\nNDc3obe3G+Hh4QgKCkF6+r1ITExilXp0dCS02n7U1dWitrYG7777FhSKDjZFDgCqqi7jwIH9WLBg\nsdGAQG4hFm6nsi1bnoe7u4DtQb5o0e3w9vZGX58anp5CiMVBBg8XAPCf/+TimWeecrjuY7bClf7+\n9HFl2QAHDmw7cuQI1Go1srKyUFJSgldeeQXvvffeWC+DIKzG0sA2rkubcVOLxUE6e9ZDwbjPPT2F\nOkVemFxskUiE3t5edHV1QSBww+HD37M53oMM6P0chLuvL5GUw8vLC15eXoiNnaBzjlKphFKpQFzc\nBMjlcmg0GvD5fDZnXKvVXm1zmoLo6GiEh4dDqVSy6Wt33HEHux3AuKerq6uvFrDxxQ8/HEdgYCAG\nBgbHCQ4OhURyHsXFxTh79ixefPE1owGB6enLkZSUDImkHHffnQ6ZrBEyWSMb+MeUWV29+kH23jPF\ncoy5y3fu3En74IRTM+aW+FdffYVZs2YhPj4eYWFhePXVV/E///M/Q17n6k9criqfK8nG7TsuFgch\nNzcHW7c+Azc3N5NWHLe0KlM6Vd+iN2bh+/pe6/nNPDxoNH2QyRoxbtw48Pl8iEQieHt7IzQ0FL6+\nPhgY4CE8PAIJCVMQHj6enZfrZuemtUkk59DZ2QGBwB1+fn6sxSoWB6GqqgKNjfUYN24cpk27CZWV\nFejrU6OpqQkNDQ24cuUKQkJC4OnpCZWqFzJZIyoqKiASiRARMV5nXsZN7ebmhtbWFohEIvD5fJw+\nfRqBgYGIiIjE119/jYaGBhQVFWL58vuwYMFivPzyC8jK2oO+vj6kpk7leBkKrnoZvHDlSh1bejUz\nc41OuVT990vfXS6VSiAQ8BAdHY0ZM2bA19fPoh7yzoQr/f3p48qyAQ5siSsUCvj6XqtEMxhwo2Xd\ndAThqOgHjTHuXLVaY9KKMxYMp2/RG7PwmTSuzMw1SEpKBnCtAUpFxUWMHx+NK1eqceHCBUydOhVe\nXl64cqUa69Y9BADYuvVPyMn5CsuX32cyuKy5WQYA0Gr7IZe3sBYrMxcApKamorNTBU9PDwwMaBEb\nOwFffPEF2tvboVarMWnSJPD5bggICEBAQACiomIhlV7E2bM/w8/PH1u3/hmAbkGY+vpauLnxsWTJ\nUkRFxeDkyRMIDQ1Ga2srpk5Nw8yZNwHQDTTj3iOAx/7knqMfEDdUIKJEUg6lUomJEyey6XHDqbxH\nEPZkzJW4j48PlEol+7ulCtzSEnTOiivL56qybdy4AaGhwZg2bRpksmokJydbdF1YWAhaWpoQFhaC\n4GBfzJw5HR4eAqSmprL3au/e7KuNRQTYsGEd5s4drCk+d+4MlJWVoaSkBE1NDTh16hTGjRuHyZMn\nIy4ujnP915DL5di792v885/vAwCys7Oxa9cuREVFYfr06bjxxhtRVlaG8PBw8Hg8nfmDg2fAz0+I\nkpIS1NTUQK1Wg8fjQSTyx403pmD37t24cqUWMTExCAsLY2W7fFkKtboXMTExaGpqYsc7dEiCmpoq\nTJwoQECACHJ5C3x9fXD5shQTJ06Ah4cHGhsb8Y9//IOVmfkHAGVlZejt7UFvbw/i4mIREOCP1NRU\nJCcns+cYIzs7Gzt37sS6deuwcuVKndeY+x4YGIjW1lYd+UcK8x4xa7Qnrvr3B7i2bJYy5ko8LS0N\nx44dwx133IHi4mKd8pLmcPUaua4qnyvLNn/+EvT19eHSpUv4+eezCA2Ntui6kpJf0NurQknJL5gx\n4xaEhkbjttsGr2XuVUbGSqjVGmRkrDS4fz//fPZqC1Q1urq6EBoaejXtTMC5fgVycr7CmjX345NP\ndqGlRY6qqgpMnToVHh4euHDhAtLTV2HGjFsglUpw7NghnD59GhcvXsTy5YNBX2fO/Bfh4eFQq9VQ\nKBTw9vaGTCZDSsqNuOOOVkRHR2PChHio1Sp0dnagt7cXhw8fxoIFCwAAIpGIXY9c3o7W1lbI5e2Y\nMeMmtLW1o6qqCufPn0dKSgrCw29AQEAQFi5cbFTm0NBoeHoOyi2Xt8Lf3x+dnaohP1sffPAh6y0Z\nP36CTvnb0NBo3H9/ss4YtvqsXnuPNBZ/LkYDV/77c2XZAAeunb548WKcPHkSmZmZAIBXXnllrJdA\nEDYjNTUVarXGqgIwRUXFEAjcoNFoIZVKUFhYAICHiIjxuHjxPJtfznQJY/pfcwufKJUKCATumDdv\nHni8Qfdye/u1bmpr167H7NmzoVT+//bOPC7K89z7P2AYBhjWYVErIJkQXDAoURMxJsEliWlaPhVj\nUZNIGmvavH3rScxrbLM05phjTtraenqyNNoknlq3ip+S1zebW6qJFk0QAqgjIAQB2R5gYIZlZph5\n/xjvJ8/MPLPBwCxe338iM89y3cOE33Nd97Vo0NjYgOHhYSQlJfHvx8XF8/9WqapvtFeNR3x8PLZs\neRkDA/1ITk7G97//fURGRiI6OhoSiTkzvK9Pg5ycHEilUoSHy5CQoEBe3v24eLEKVVUXkZqaDqNR\nj5SUNBw48D8AglBaegYAcOXKFcyZcyciI+VITZ0CvV6HqKgoaDR9/MAWe1sTrOHL4OCgTfjfHvZC\n8mMdNh9pYyCCcJdxT2wLCgpCXl4eVqxYgRUrViAuLs6l8wI9gSFQ1+fPaxNLOLMmPT0Fkycr3UqI\nam9vRXi4DBMnTkRPTzc4rhMDA/1oaLiK4OAgRESEo6ysDA899APRsqgvvvgnLl2qRlhYGGJjY/H5\n558jNDQU//rXWURGRmLq1Ol8eVZERCRMJiOMxu/KuPR6cz/0mTOzAZiT7xobG9DS0oLS0lK0tbVB\nrVZjYGAAERERmDBhAiQSCQYHB9Hd3Q2jcRjR0dHQ6XSQSqXo6GhHRUUZEhKS8MILr+DEiU8BAGp1\nDwYGBjAw0M8n4JknmHWA4zqRlJSEe+9dcqOzXAs6OtphNBowceL3RBP+FIoEyOXRUKt7EBERYZO0\nJ0ZISAgmTZqAadOykJCQZJHoBozd91OsL7438Of//5wRyGsDfLhOfKQE+i8rUNfnz2uzN7hEiLvr\nKykpRmtrE6RSKQATX+L17bcNuHjxIuLj4xEZGYmoKDnmz19oURfNsqq3bHkJ33xTgYkTJ0KpvA0n\nT57A2bNn0dTUxIu9MCs+Le0WXL5cDbVajZ6eHnz66adoaWnhHwoUigTccced+PLLU0hISMCUKemY\nMGES7r33PqjVPWhubkZ/fz8AYOLEiRgeHsbw8DCMRhNfbmYymfD1119Dr9fh5MnjmDRpEoKDg2E0\nGhESIoFEEoru7i6YTCaEhoZCp9MhNDQM9967GNXVFRgeNvBzyxsbG/Dxx/8XbW3X0dPTDbW6G2Fh\nMpw9ewoJCUm4555FCAuTQaWqdviAZf07nD9/oY2w+vP30xUCeX2BvDaARNyvCOQvoz+vzbpECbCd\njOXu+rZseQmtrdcxYcIExMTEYt68BbjnnsU4duwzHD9+DENDQzAYDOC4bjz00A9Eu4iFhkrw7bff\nYvHi+7FixSp8/vkJXL1aB4VCgQUL7sbOne8gOTkZP/xhAbq6OKhU1Zg//x78+tfP4/Tp0+ju7sbm\nzS/YlMWdOnUCEydOhMFgQFdXNy5fvoQzZ77E4OAQLl++DLW6FyEh5iTU+Pj4Gwmp5jp0iUSCyZMn\n48MPP0RiYgISEsyfl16vh1arhVQqxcDAAI4dO4bIyEioVCoYDDocO2YekwqYR55OmDAJjY3fIjY2\nFjqduYHNwMAAKirKMDjYzz9Q/eMfB9HV1Ynm5mvIyZlrsQ7h72jatCyo1d3Q6/V8CZ0Qf/5+ukIg\nry+Q1wb4cIkZQfgLYiVKO3ZsR1VVJdraWkfUHIR1Gpsy5VaL87dufQNbt77BNy1x1L/bupRKuO9r\nPc2L7QM3NTWiqOgJnD59CosWLeLL1tj9lEolGhsbkJaWhm+//RbHjx/F8uXL8dBDy1BbW4vDhw9j\n+vTpCAoKQkNDA2JjYxEREQGJJJRvAnPbbdOQkJB8o/GMBMPDBkilUkRERCImJgYSSSiysm6HVCrD\n1KlTER8fz1eqMM/84YeXW5TRGY16DA4Ooq+vFxpNHy5evIy+Pg06OzvQ19eHnp5em89H+Bns21fM\nfwZUQkYEIuSJ+wCB/EQZaGvbvfs9tLe3IykpGWvXPun2+oR7tF988U9s2fISysu/xs6d7yA0VILp\n07MwadIExMXF8/PA7YWLmceZlTUTL7xg7g8eGipBff1VaLUaxMaa+6U3NNTBaDQiJiYa996bB61W\ng6++KkV3dzcveA0N9aisrERsbDzS029BQ0M9li5dioiICMTExCAsLBwPPPAAYmJikJSUhPDwcADm\nvg/BwUEwGo3o7e3BnDl34bHHnkBzc9MNMQ/B5MmpkMvl6O7uwh13zMHPfvZLNDc3ob6+Dp2dndDp\ndPjss8/4ED9rPTtr1h2Qy6PR3HwNDQ3f4sSJE1Cre/C9701EZGQkNBoNysrKEBsbaxOpcNT0RUig\nfT+tCeT1BfLaAPLECcJjCL3jDRuedegpsxaprIzJGmGGNPPqv/jiNIaGBtHW1opnn91oMQ8csMyk\nLikpxtGjn2L27Fm4cKHcpmUom619/Xozvvzyn+jv12LGjGzU1FxCRsY0TJgwCaWlZ3H69GlcuXIF\nS5YsRnJyImSycAwODmDmzNtx4UI5OI7DtWvmOvD4+ETs21eMDz7YCZ2uF6Ghobw9PT09GB4eRlxc\nPN8wBQAqKy+gsbERn3zyCRYvXopXX/0PAN9lawvHs+blLUVt7VXRz1QYDVm0aAFuv30mZDIZZDIZ\nurvVFvPQGe42fSEIf4ZEnCCcYB2edRRGd1bGJF56ZLJ5n80Dty5R2rFjO26/fSaGhgYRFxfDzwPf\nt+9/UFd3BUrlbRYjTS9erORHcS5cmIcXX9yEv/xlF4aHh7Fw4UIMDQ0iNTUVMpkMAwMDGBoaxC23\nTMHixUshl0fjwoULWL7c3CSlru4KJk6cCI1Gg/DwcJhMJhiNRkydmsX3M8/MnIGyslLEx8djyZIl\nCA4O4cVZq9XeKKeDw05rYtTUqLBmzRrU1dUiLEyGhQsXQ6FIBsdx/LXYA5TwsxupeDt7GCMIX4FE\nnCCc4M6caTGRFnry+fkFvCgwr16pVKKurg6Fhat5r7GkpBg7dmxHT08PYmNjkZu7AHV1dWhubobR\nOIygoCBcuHABMpkMnZ1t6OzsRHx8PC/k0dHR6OzsxPnz51FWVgYAmD49C4OD/cjMzIRKpcL06TMR\nFSXHsWOfAQC6uroQHx+PiIgIrFmzBmfOfIG4uDgUFx/A/v170denRl9fH2pra3HXXXchPj4eubl3\n84NO2LrKys4BAFJT0/Dssxv5YSsc1wHAnDFuMOixevVqBAUFoaZGZSOU1iKqUlVjaGjQ5n75+QWo\nqVHhyJHD0Go14LhOu1EMdxjPmnKCGA0k4gQBW6EV4sxTtCfSDOtkM+F12fvW92UTuQCgqekarl9v\nAcdxCAkJQXd3F+rqrmJoaBCrV6/G0NAgoqOjMTQ0CJksHE1N3yI+Ph5XrlxBWVkZ5HI52tpacerU\ncdxyyy0wGAzo7e1DREQktm//PXp6etDT0w2NRgOFQoHnnvs/aGxswOTJkwGYk87+8Y9/oLGxEefO\nnYNcLseaNY8jKkrOP6wIIwFz5tzJ9yVvbGyAVqvB0NAQgoNDEBERgcHBQRgMejQ3X+Pr1531l3fU\nPIUdq1AkIjV1it0ohjtQsxbCX6DENh8gkBM0/GVtYk1VANuSMmsiI8OwadMm0XMZLNFKqVTyCWwq\n1SU8/fRPceDAXqhUl3HmzBdobW3h38/Kmon6+quQSsOQmpqGBx54EA0N9dBqtVAoFFi1ag3a2tqg\n0WiQmJiIiAjzZLOgoCDIZDJotVqcPn0aRqMRKSmpqKqqhEKRgMmTJ6Ol5Tp+8pOf8nvyvb29WLRo\nER566CH86EcrkJ6uRGdnO0wmc5g/JCQE4eHhuHr1KoxGEwYG+tHUdA1FRT/FqVPH8d57O6HRqJGU\nlISWliZkZWWD4zqQmJiM4WED1Go1BgcHYDKZMGHCJMjl5g5tsbHxSExMQmbmDD7Jj33O1slojpqn\nWE+KS0tLd7nRir3vp680axkt/vL/30gI5LUBlNhGEG6hVCpRXl4GpVJp8bo9L1qIs3A78+RXrSrg\nrwWA97SzsrJw++23o7y8DOfOmUPRbO+deflz596JuXPvtJhsJpNJcezYMeh05j9kw8PDkEgkGBoa\nQn//AFJTU/HMM/+HX8fSpQ9YrGHLlpcBAGFhMtx7730YGhpEVJQcanU3jEYj9Ho9wsPD0d3dja++\n+gocx0Eul2NoyHw+C3GnpaWgubkZYWFhUCpv4z3j1FQgMlIOjuuERBIKmUyGlpZmdHd3ISoqCv39\nGtxxx53IyMjEjh2/h1KZjsuXq/nyNwBobW0R3Ztm7WqHhoYQFhaGSZNS+KQ6sfA37XETgQqJOEEA\nqKurA8dxqKurs3jdlf1wVxKzSkqK0dbWyieiAUBbWysA4OGHvw+ZTIaEhATU1dVZPEhYJ9Wx1+bO\nvQPx8fG46675kMlkAACJJBS9vb2IipIjMTEMd9wxh98/ZvYJQ/+xsbFoarqGvLz7IJdHQS7/Ljxe\nXV11ozZbg7y8paiursbChQsRFiZDa2sbZs+ehZiYOAQFNSIyMhKpqak4f/5rzJw5G319GnR1dSEu\nLgFz5pjHirJ98cbGBvT19SEszOxlsNrt2bNnYWhokH8NgE2WPnvvuz32TgCARtMHrVbjcB+c9riJ\nQIXC6T5AIIeF/GVt5eVfo6GhHgsW3I1Fi5byrws7pomF1u2tz/rYLVteQmnpWcycmc3XdK9d+yTW\nrn2S7+ldXl6Br746j9jYOISGSrBly0tQKpWIjY27McDjEjZvfg7V1VXQ6XQwmUxob2+HXj+MyZMn\nIy/vfgQHB0Gt7kFwcDBSUqZAp9NZ9B8XbhusW7ce4eHhyMnJQX+/FomJSZg/fyEUigSoVNWIiAhH\namoqfvzjxxAaGgKjcRiZmdNw6623oqurEzKZDPPm5cJg0OP8+a9w5MiHCA8Ph14/iGPHjqGlpQVR\nUXLU1qrQ2tqCyZPT0NjYgLNnzyIpKRmZmdMQExOHysoL+N73UjA8bEBERCQSE5PR1dWJkJAQBAeH\nQCoNg9FowvXrTWhtbeHD7A0NV2EymRAcHIKpU7Mgk8lEa8EBc8hdrHPbeH0/XenDPxb4y/9/IyGQ\n1wZQOJ0g3MKeJy7EldC62LEAbLxwISwj/V//+hcUCgWUSiV/fnl5GV5//Xd8OJ6FtFtarqO/fwA9\nPT1oarqGM2e+xLFjx/HDH+ZDJpNhcHAQarW573hjYwPa281e/w9/mI8ZM6ZBqbwN+fkFCAkJuuHx\nyngvvKSkGBculGP27Fl48MEHAZg96ba2VnzyySdYsOBupKZO4UPTGRmZGB42geM43qNesmQJZs6c\njcrKC4iPj4fBoMelS1XQ6w3QaDSorr6IF1/8dxw48D/guE4oFBr8+MePAwCOHDl8I8vcvA6JJBQa\nTR/k8iiL+5aVlYLjOhEXF4eFC/Mc/j7Mx58Dx3WgrOzcuHvjFAkgxgryxH2AQH6i9Je1iQ0aceUY\nsfWVlBTj+PGjSEpKxrp167F//14LL9weO3e+g+rqKqhUl6HVamE0GqFWq/mEOXb/9PQpmDp1KhSK\nRPT19aG9vR1GoxEq1WXo9XoUFf0UBoMefX0anDx5AvHxcTAajfjyy1OIjIyEVBqKpKSkG9PL6hER\nEYm77lrIi8uWLS/hyJEPAQThuec2or9fB4UiAb/97es4cuRD6PV6pKffgmPHPsEHH+xCcHAw8vML\nsGLFjxEVFQ2DQY97712C3NyFaG5uQkdHG8LCZDAahxEWJkV8fDwuXboEqTQUvb1qGI1GREREIivr\nu6lqBoMekyalQCaTQa/XQ6fTISoqGsuXF/KebFiYjE9oY6858njLys7x/dizs++w+/uzd53ReNOO\nusaNJf7y/99ICOS1ATQAxa8I5C+jL65NLCwuNmjEGrFjrNdXUlKMzZufw7ffNvCi7coDAmB+SDhz\n5guo1Wr09vYiKSkZRqMRWq0WEyZM4IWyq6sDsbExmDx5MhYtWor6+qsAgpCamobs7GwcPnwIM2bM\nxFtv/TdOnjwBjUaDoKAgtLS0QKGIh0QSiujoGHBcB1pbW5CYmISEhCReoJKTk3l7c3Jm8esTruPy\n5WokJSUhLi4OZWVlyMi47Ub9twFDQ4MwGAyorLyA22+fjR/+sACxsfFQq7sREREJleoKTp48gRkz\nzG1iJZJQ5Obew4sbywxnWeYREXIbsRYeJ3zN3uS5mhoVamtVMBqNiIqK5h8Y7H0/xa7jylQ7e3gr\n290X///zFIG8NoDC6QRhF3fC4iO5NsdxkEgkfIIaS3wrKSnGqlUFFjXhrKkLYG7+UlDwCPbu3YPY\n2Dg+8Uyj0WD//r389WfMmA7AxIfEWU15ZuZU1NXV4fr1ZlRWXsDkyd9DVVUl2ts7oNPpsWBB7o2E\nMhM6OtqwcOFiAOC7rHFcJ7Rac1ib2btmzRpMmTIFQ0NDSE1Nx759xaipUaGtrQX9/VpERkZiIcpb\nHwAAIABJREFU9uxZfLiYJaKJJaTl5Jgz0WWyCHAch7AwKQDciCJ8l1luzjw/B8DEn+NqCNpefbdK\nVQ2DQQ8AGBoaEm0w4+w6VDtO+CIk4sRNhzsd2EZy7fLyMtH9dbGHB2FTlx07tiM5eQI0Gg3uvHM+\nCgtX813bVKrLeOaZ/w2NRsNff/HipVi16nGb9bB96HvvvQ96/TAAE8rLLyAsTAa5PAqDg4PIyJhm\nIY6syxoQxNt79OinSEtLgVQqhVQqRV3dFQDfCeLEiZMQGSm3EDXWaEXYcMV6Pzg/vwDTp2fh8OH9\n0Gg0iIqKsnhf2N1NbPKYo3Ixe4LPat4Bcza7s4lmYtehHuyELxLsbQMIwpMwb7ekpNjuMfn5BRY9\n0B2d48r1hMcBQEHBI3yCmhClUmnzemHhasjlcoufs7Jm8uVnJ058iczMqbxHrlAoUFDwCBYvXir6\nEJKfX4Af//gxpKZOwT33LMa+fcXo6+vFAw88gH/96ywef/ynWL/+f6Orq8tiXTk585CaOgU5OfP4\na82ePQuRkZEwGAwYHBxEU1MTSkqKkZk5A2FhMpw+/QWGh83iyER14cI8PPzwckyYMIm/TkxMHGQy\nGWJi4vjXVKpqREVFISYmhh+o0tXFoaZGdWPfOBEKRQJiYuJw5Mhh1NSoLM5tbGxAWVmpzXv26Oho\nu/GvICgUiR71plnbV1fsIAhPQ544EVCMJFTOzmlra7Vpgerq9ayz0cU8cZYBf+bMl1i0aAEAcwj9\nD3/4k8V92bXYdK7CwtW8qG/Y8KyNHdY2ZmRk4uLFKjz11E8AAIsW5SE+Ph6pqami57DhJTExcRZh\n7dtum4a6OhU6OjoQGRkJmUyG/fv3Yt++Yrz88q9x/PhRcByHNWvW8J70xYtV2L9/L5YsWczXfQPg\ns+UZmZkz0NLSbLEOjaYPp08fx8KFi5GTMw8qVTVaWq7x9eDMC2YCzNq6ssx7AA489GmoqbmExMRk\nBAUFYSSIhfnZPSnznPAWlNjmAwRygsZ4rY0lqwnrqh0lkQlhCVtarQalpWct2qeKtUxl1y0pKcaL\nL/4awcHByMqaySd9Cf8tPJZlrPf09KC2tgbt7e3o7+9HVtZMVFVVIitrpuhM8Pz8Aqxd+ySk0lBU\nVJTxGeHs2sIa976+Xr4W3Lwf3o64uDjk5t6N3Nx7+cQqYZJaV1cHGhsb0NXVie7uLqjV3cjKykZl\n5QV0dnZAp9NBr9ejqamJT+wTnj9tWhafef2nP/0Rx48fhUKRgKlTp6Gjox1VVd8gMTEJd9xxp0Xy\nWm2tCgMD/QCA4OBghIRIoNPpYDDowXFmm8x140kWWd0sSSwsTIaWlmt8L3Z2jjDxjGWUT5miRFra\nLbh0qRIc1wm1uhsNDXUIDZVALo91+P1g12hsbADHdWBgoN/iHt7KPHcF+tviv1BiG3FTIdbZzFWE\niWfWs8KtW6aWl5fxr7N76nQG0RGlLBlNmHy2eLG5kUxT0zXI5XIUFq628aTFvHHgu1GgfX19+PnP\nf4rz50uxdesbvIdfXPx3nDnzJf9AIJfLodFo0NTUzHdus14XAD4M3NXFQaPpA9sXz8ycAalUgvr6\nBgwPG3D33Qst5pZbz+wGvtuXX7r0AYSEBIHjOhAcHIzr11v4Y9me9qRJKVCr1TAY9IiIiLyRdBck\nuscuRkZGJlpbW3DpUhW6ujikp9+K1FTLxDOhlwyYIwLBwcEYGhoCx3VCKpXg/vvTRK9vfQ1zD/dE\nACaLe4xmr5zawRKjhTxxHyCQnyjHa22OyricDTFhOCozY+VfHMehvv4qPvnkIyiVSiQlJeKRRwpt\nzrEeqCK076675qO+/ipiY+Nw113zRT13sfU0NzfhyhUVvvrqK7S1taGhoR6/+MW/WdiWlJSMmTOz\nsW7dejz44EPo7++HXB6Jl17ajC+/PIXi4oMIDZUgJCQEx459jOrqCkycOBnz5y9ERIQczc3XUFp6\nDnq9Drm5C7F//x4cP34cKSkpuP/+79t4mta108LPMCgoGM3N1zA8bEBsbCzvvTKvtquLg0wmQ1RU\nDCSSEHBcp0XXuNtum4bKygsOy7oqKy+gu7sLOp0OMpkMDz+83MJGoZeckJCElpZr0Ov1iIqKRmJi\nEnJyZvOeuL06cOGAlXvuWYSsrGyPedyjKVtzBfrb4r+QJ04QN3BlX9vRKFLhefv370VbWyu/hy6R\nhGDLlpexY8d2fr9arE+6tbcPmAegsD1msd7m1hGFVasex4cfluDixYuQSCQoKHjExjY2m1x4z2nT\n0sFxHP75z89hMBgAAGvWrOEzwE+dOo6XX/41CgtX49ix4/xed35+Af72t7+hs7MTdXV1ePbZX9t8\nLsxLZfvSQm+SeahCbxMwe8rt7eYSNI3GXPbFWqFaJ5w5KuuqqVFBq9VALo9CWFgYMjNn2Hi2Yl6y\n8P3ExCh0dPRZrMXeOsYCV8vWyGMn7EGeuA8QyE+U47E21mClurpKdByoK81W7I0iFcK8zNjYWH4P\n/ZtvvkFvby/a29t5D53tRw8PD2PJkvst7vn00z9FaelZSKVhmDv3ThubnNnB1rJ58wt4+ukNFraF\nhkrwpz/90eZzaG1tQUNDPe66az5uuUUJpVKJqqoqTJw4EXFx8SgtPYcjRz7kPyPhZ9XT04na2loU\nFDxi0VOeERQUzO9Lq9U9aGioQ1BQMLq6ON6rZUlywj1tuTwajY0NMBqNNxraaHgvXIhYk5SaGhWO\nHfsIly9fhFarwYQJk/hObs48W3Y9Zl9oqATXr7fh7NlTfBZ9ZuYMdHVxfKRC2Gvd07jaBGakHjv9\nbfFfyBMnbhpYgxWFQmG37MpZpro7teNCr3rr1lfQ2tqGxMREAMDx40eRlTUTCoUCHMfxe9rMw+7p\n6QEAxMbGiu7ds0x0leoyFi1agA0bnsX586UoLv47Cgoewdatb9hdi73PYevWN7B27ZO8JyfMLN+3\nrxgyWSQ4juOjEMKowJUrV/je7WIIM7S1Wo3F/rOjjG3hecKaclcQTjBjoiscTcpKyE6fPomamkvI\nyJhm01uded1SqQQ6nYEfncpyB8z92+3Xqo811p43NZoh7EEiTvgEzsLZjhAK8Eg7sLki9AyhrdOn\nT8e3336LzMypfHMWwFwrXldXx9u2Y8d2VFVVYvLkFLs13ozr11vAcRyamq5h8+bnMDQ0BI1Gg717\n9/DXFLNV7HNgtrKSL+HMdOtQvzXCxD1Hn429sDngWHTcDVOz68fExEEu5yya1rChKQAQH68AAFRX\nV8BoNKKm5pKNiDO7srOz0ds7aPGaWJh+vLEO7VOjGcIeXhPxo0eP4pNPPsHvf/97b5lA+BCjaYXq\njgAzmLixPWR3HgCEE8YeffRR6HQGXhAbGuqh0WgAmBu1WNPT081PKTt/vtTi3mxbgE0q0+v14DgO\ncXHxUCgUCA+PEK1nd7SPzh4eurs5zJ07F6dPn8bEid+zOM7eA1Rh4WpIpRIsX77SQkCZ1+ysoxn7\nt9h+rrXgu7Lfy4QtNdW8h67R9KGlpclKdGV8lzij0QjAPGfdus0qs5XtiQvfY55+auoUm6x+R4xk\nTfYgz5twFa/sib/22ms4ePAgEhMT8cADD7h0TqDvfQTq+lxdm6tDQlzNNHd2Dtt7bmiot7uX7shW\nlg0eHx+PRx4p5IW9qakJANDf348pU6bwc8hZ/blGo+HvaX3vLVteQnV1FRQKBX73uz+ipuYK2tvb\nceutt+L8+W8wYcIE9Pf3o7m5CRUVF1BffxVr1z5ps48uXG9p6Vm0t7fj+vXrGBrSYcKESS7vw0+d\nOh3r1/8EKSlKfk+2t7cHHNfp1t6s2H7usWMfo7W1BWp1D3p7e+wOLRFmiwszza9fb8LAQD8iIiLQ\n26tGa2uLxd44O1YiCYVa3W3X3vr6Gnz++Qn+HjU1qhv16RE2A1ecTTETrlOsZt0dPDUwhf62+C8+\nvSeek5ODpUuX4sCBA964PeGDuOpNj6Yjm/AcpVKJ8vIyzJo1G0AQlEqlzXASR7ay6xYVFeHdd3fx\ne+FZWTN5b3zz5uf441jtdnLyBLBe5tb3Foa5hfewDnsvWrQATU3XeHus9/OF692w4VmLASvOwvD2\nYB6hu/vXwnOF4Wq1uufGuyaL94XeLPO8tVoN/5rQM7YO3bMWrcLM9NOnT0Kr7bNo+cpsUKmqMTQ0\ngLa2Nv7106ePY3BwEKmpU0Sz2h3t8zsamkIQY8WYivihQ4ewe/dui9e2bduGZcuW4dy5c3bOIgj7\nuJOAJgyZW5/DGqQAQdi3r5hv5sJg53300f9DT083Vq9+FFu3vuGSTTt2bEdDQz2f2Ga9V71qVYHd\newvD3PYebDZseFZU3Fn/duuHAVceSljrVXvTvaxD5SUlxXxZmrPrW5/LBqjIZDKbKWUHDvwPOK4T\nLS3NmDYtC6mptu1VxfaI2b64tciq1d0WLV+ZeGu1GnBcJ6Kjo/m+7ipV9Y0JbDKLBw72sOCs3M06\nfE572MR4MKYivmLFCqxYscIj10pMjPLIdXyVQF6fK2s7ePAgPvjgAxQVFWHlypV2X1u3rgjr1hW5\ndP7hwwdx/PhRSKUSHDv2mcXx69evg1QqQVFRERIToyx+/uCDD3D8+FFUVFxAZ6c5WWrfvr/hz39+\nmz9feO2PPvqIt+mhhx5CVVUlZs2ahYkTJ6KoyPy6VCpBdHSEzb1OnvwYHNeBWbNmYf36dRafldia\nrD8D4TGO1uuMzz5T8dnaublzLN4T+/0J7yX2+wCAqqoqVFRUIDs7G1lZWfzrc+feAalUYvM6AEgk\nIQAAg0GPgYE+PPHEWlRVVeHjjz9Gf38/vvnmK9TXq5CdbZ4HLry+8LrMZuvX2DqTk5Nx6623oq+v\nD729vRgY6BO1S/i5rFmzBrm5c1BVVYXPPvvQ7nHCz8/eZzCe3Ox/WwIdv8lOZw0ZAhFhw4lAw9W1\nsZC0TmdAXt4yu68JESZkCTOp2bHLl6/EtWtNuHatCbt2fWDhMeblLUNe3jKUlBRjyZL7UVi4Grt3\nm7d3env7odMZoFQqsXv3+xgaGkJMTKzFOpYvXwmdzoCioiKb1ysrq1BbW4t58+5CXt4y3tNmtuXl\nLUNvbz/efXcX2tpa+XaseXnL+GsJk9zE1s/Wzs5nyXU6nQEpKWn8mgC4lPWfnp6Ja9ea8OGHRzAw\noOePtff7Y+tfvnyl3d/v+fNfo7GxATqdAb29gxaeKmt1an3u7bfPQVlZKYAgpKdnoqOjD8nJaViw\nIO+GB61FbW0turt7oNVqMDg4CJ3OgOTkNPT2DvL3YtdNTk7D/fenoaZGhfff342YmDikpk7h7Whr\n+xbnz3+N8PAonD//NTIzZyA5OY0/Pz09EzqdgbfFel3JyWl2j7N37HhRU6NCfb0K6emBmdkeyH83\nAdcfUPxGxInARixMLvaamHDbO9ZeD3Ih9iaYsWPnzr3Tpp86u3Z+fgFOnvzYYiJZfn4BP/d77949\n2Lr1DVHb2H2zsmZalJwJxdle7btQ4IXnW/d5Z7iSQ3DxYhV+97vfguM4vltbSUkxDh8+iOXLV9qc\n60qYXhh+dnXSl71SKusyNq1WaxP6FuseZx0+Z73VVapqtLa2YGCgz6F9wvuy/XaxsLo9u72ZZc7W\npNMZAlLECTNeE/F58+Zh3rx5zg8kblrEhMKecIsdK9b+VOz9yZNT0NBQj6qqSlExF+43W5d1cVwH\nqqoqAYBPZIuNjYNGo0FsbJzdddirbWfrmzw5hZ8dLvYZcBwHiUSC3NwF2Lr1DQv7WNKeUqnE3Ll3\nWtzPHmKNYlytEwcg2lhFTNjEWqM6wl4bVbFrCNu5spGqLFFNoUjkPXAmbsHBjTAajdDpDE7FVijy\nwmOsS++sS/C8Wd/NBtikp5OABzLkiRM+gatZ586E2/qaLFRtzwuvqqqEQqGARqOBQmFuEiJmh7V9\n7OdZs2bxGekske03v3lV1HsXYs92dk5bWyuamq7ZzCRnx5SXl1nMLLc3z9xRhzex+wofKoR14s6o\nqbmEwcFB0cYqgKVHy4SVvf7dNWyF2Z1+5sJzmFgzbz0nZx7/nrm9qlnsIyIibITb3gMCYM6AZ/a3\nt7ciMjIKHNfBX4/919pe55+f53ujZ2RkIjd3TkCHnAkSccJHcDXr3LotqKP9XmEL05ycGYiNjbUo\ns2L3EjZ8ASAqwELvVnhtwBxGB8xZ6ew1d8ehWq9PbCyqkPDwCMjlQzaZ92LbEe7c1/q1deuKXBKB\njIxpvCfuCLEMcOF71oLtbjjanvefkZGJAwf+Co7rgFzOITJSjsjIKNx33z3o7R0UFWatVmsTBThw\n4K83RDoIg4ODiIyUIzV1iqgn7g6ubjcANAyFsIREnPAJRtJ1zZ73LhTA5OQJfLi7qemaxd649T3N\nTVJe5ruqCd9jJWnCCWHC/fZ9+4r5n1lY3VqMHa3P+jhHn8f+/Xv5OvG6ujrRe4y0/aw7WN9XzAO3\nRijKYmKr1Wqh1Wpw+vRJXgzd6ZomxFrQh4bMHvLAQD80mj6kpk5BVlYW3n9/Nz9nXCjMwl7w313H\nBACQy+WIj1c4FFJHvdutcedhxRXBZ0I/d+4d455QR4wvJOKEX+Jov9t637ytrRU9PT2IjY116J0K\nxbG4+O8WdeH2PF1huLmwcDVKS8+C4zjs2LHdQugBW2EtKSnmG7EA4B82XBnWwjx+6wS/8RBvhrP7\n2qudtic8GRmZFg1ePB2WZq1aw8MjeAEGxBvZsNB/WVkptFotXz+fk3OnxR64Y1scbzFYr93Vdboi\n+MIBL6wSgAhMSMQJv8TRfjcTOSZ0wh7mwoYo1j3TCwtXQ6W6jJ6ebn5WN0Mswc2a/PwCvlc5u5dK\ndRlyuZwPe4utATB7dsIHEibw7OFDuA3gbD99vHC2BeJOiJjhbmc4a9F2dM+cnHk2vc2jo2UOM+LZ\n9crKSi26xok1lrE933aLwROhcFcEXzjghQhsaJ64DxDIPYAjI8Owb98+t/udO4P1Wlcqldi58x2L\na0+dOh2ffPIR369c2A/cUc/0qVOn46mn/hc2bNiIvr5eUZuFfcarqirx2WefWlyDzRpft2499u/f\ni4qKC9DpdIiNjROdc15ff5XvqZ6UlIyGhnqEhkqwf/9elJae5WeVuzLn3FOfrRBH301n9xX2One1\nBzjrGZ6Wlm4x99uVfuW33TbN4T2F/cjZeXq9HkqlrSCyPulsxrher0drawsMBj2CgoLt9lcXkpaW\njtmz5yItLZ2/XmNjA3+dkfRUdxW21vT0lID+2xKoawNc751OIu4DBPKXMTIyDJs2bcLx40dx5swX\nSElJ8YjYMAHZufMd0eEd9gaqsNcnTJiA3l41Fiy4W1Swn376pygtPcsPGRGeX19/FVqtBtnZ2Rge\nNqCvrw+xsbGYOnW6hbCxY6XSMAwPG/hjhGtYu/ZJdHS0oaGhHsPDw6iouMDbzc5NTU3DunXrx0Sk\nGfYGy4zmu+mJIR5iw1OEWIu2q/dsa2tFb28PpkyZgkmTUu3eVyaT4eGHlyMsTMbfh9WYJyYmYf78\nhW6tIyIiAomJSU4fbJwNW3GVQP/bEqhrA3x8AApxcyEsibLXdGWkWGeNM+yFnIUNUViiWl1dnct7\nytYh85SUyfj4449F12XdfMXe2lnSXFbWJH4uuVgWviv2jRRv7Ks7G1GakZEpOjxFrG7cXVhP9a6u\nLlF7rO9rL+vd3locrcMVe0eyFUHcnJAn7gME8hNlZGQYUlKUSElJcWnUqCOsvcWSkmL86U9/BMdx\nGBoawieffORyyL68/Gs0NNRjwYK78cADy2xsY2Hx7Oxsm3D97t3vob29HUlJydiw4Zfo7laLhvUZ\njkL/wvfXrVuPF154xeZ8e6NCR4vw88zKmin6+/Hkd9Pau2TeqVrdg4aGOgQFBfPixTxva8/amWfu\n6v0TEpJgMOiRkzMbcnmszbXnz19o16MX8/at7bL+2VGEQMzrHslWhBiB/rclUNcGkCdOeAhXS6Sc\nMZISMmusvcUdO7aD4zjI5XIAtk1aHNkuLBkTa4gi1sKUHSOcIrZy5UqL/ujC4+xdq7y8zOI4Z5+N\nO5Pb3EH4ee7bVzzmHri1d8m8U2Epl7nMTGORES5kNG1Mhfd/+OHlfO90YTtVVuJWU6Piz3HmPdfU\nqNDVZe6gFxMTh5oaFbRaDRSKxBGXjAk9f6oLJxxBnrgP4MtPlKP1Aj25Nut9buYR33ZbJjZseJbf\nq2Z7z45st7dn7uyegGVCF1ufM2+bXevkyeNQq9U4efI4Ojra7B4rZKwS11z5DDz5+xPbvw4KCsb1\n682IiIjEzJmzkZGRiYaGOrvJX/Y8Wmtv1lXv9syZU6ivv8p73+zeanUPamsvg+M6nXr9Z8+eQkdH\nO4xGI2QyGTiuw609c3tetyeS4Xz5b8toCeS1AZTY5lf48pfRVbGzx0jXJpZoZS1mwpD36dOnoNVq\nUFVVyYu2I9tdFUZnx7H1seO2bn0FpaVncfLkcUyZMsUmka2k5DDa29uh0+ksMuRDQyUez+B3hiuf\ngSe/m9YCzFqw9vX1WgjeSELJ9sLZwlB9RkamTcZ7WtpkaLUDyMycga4ujk8+GxoaQn9/PySSUMyZ\nM9+hHUFBwVCre/hsdRaqd9V+ew8m7ibDieHLf1tGSyCvDaBwOuEhPBEGHwmuJFpZh6mtJ4IJa7ut\nJ42NNRqNRjSRbcOGZ/kGL7m5C/hadW81bPEm9lqwupKsJgwxA7AJX7P+6ENDg+C4Dv667L4sfP3E\nE2v5jmZHjhwGx3UgNXUKgCBoNH2IiYl1aoujPu7WtroTDnc3GY64OSERJ3wSd/aB7U0EYwibquzY\nsd0je/xsv339+nUWs76FIm2vIYwr+9/+jKui5UykHF1HKMQAbowZncIfx7LPFYooi+5s1ve1Zw+7\nhydGiI4009ybE9AI/4FEnPBJ3IkA2BsXyhC2KQVcm68tRCxBjnnOUqnEQsRHGrnwVsRjLBjt7HBX\nriMmxPaEWsxLdjSzXPizEE941KOFktwIa0jEiXFltNnujs63F5K2N/nM2fXYe21trTZ9zdn5RUVF\nbq/B2X39HU+JlqPrOBPcsfBiv+vrrnVLSD1pC9WPE9aQiBPjymj3fh2d70oI3trjdXQ99p71Xrvw\nOomJUSOa1xzIe+CeEi1fCScz7zcmJg4KhRZqdbfNPvt4IdzzZ6VxvvAZEd6DstN9gEDKsrTOKrde\n22iz3T2Rce7q9Zw1YQFG/rsb7efgDHttVN3FX76bI2lTWlOjwqlTJ2E0wuE5whasUqkU3d1dkMlk\nyMm5c1SNWEYCy2SvrLzgUtMbf/n9jYRAXhtA2emEl3DmYTrb+3UWZmav7dixHTt2bB91trk9e8Y6\n3D3We+CB7Olbw0rV3B1dykLTOp3BplUqe1+sBSv7t6dGpI7kWE/us7sK7cf7JiTixIgREzqxkLY7\nguiK+Fhnm7sjUta22LPN30VwrLq8eRN7IsJK1YKDgxETE+fy9TIzZ0AqlSA93bb0DIBNdzfGSARM\nbC/b0Xqcjzkd/60G2o/3TUjEiREjJnTC7G0AWLeuyC1BdEV8CgtXo7T0LDQajcu22ktSY7a1tbVa\niPloRdDbiWuBlO3OsCcimZkz0N7eisHBQajV3S5fLyMjE7m5c/icBjHv1lN7z6xuXfiQ4Wg91nb4\nAr5q180OiTgxYuwJnVC0160rcksQXREf4YOCqyJrL0mN/betrdWjnjebdNbW1hpwYuoNzP3ItVAo\nEmxERNjEZTSiy7xbYSJbTc0lt8P0YrC6deFDhj1RdNQ33ZshbV9JNCQsIREnRow9wbUWSHslXqPd\nywa+8/jd8fDFys+sS8/GOpzubU/d31Cpqvluao5qvI8cOew05CsUwsTEOaL3MieytYp2lBsJ9rLK\nndWiW5e1abUacFynw/URNxeUne4DBFqW5dSp0xEaKsH+/Xshk4UhPT2Df8+TYzXduZZKdQnHjx9F\naelZfkCKtc3CzHZXs8ft/e5YX/d169aLnj9W40U9ja98N13tp+7KccI+66GhEnz++QnRQSmTJqXw\nWeijFUyxrPKgoGCbjHrrHvDMFr1eh9bWFkRERLrVR91Tv7+RZP+PNb7y3RwrKDud8Cr2Opp5MuHK\nnWsJk+FYT3NH3vBo95S9NV40UHE1lOvKccIwdkVFhd0xoDU1Krf22F1BeG+xPXHrELt1iN9bmeGU\n1Oa7kIgTY4K9jmaeTLhy51pKpfKGFx435iFzV0LlgZh45i8IhT46WgadziAaLh8L4RJ7yHBl+Iu3\n96Mpqc13GXcR12g0eO6556DVaqHX67F582bMmjVrvM0gxpjRdjQTQ0wc2WtKpZKfCCYmjnV1ddBo\nNLjzzvkOy+E8gb+XpwU6Qq82N3cOP8XM+v2YmDikpronXO54zN4WZnfwJ1tvNsZdxN9//33k5ubi\n8ccfR319PTZu3IjDhw+PtxmEB3DF4zx48CDefXeXqPC6m9QlLAdjk8IAoKqqEuXlZeA4DoC4cIoJ\n9lh5wxQq922EHnZurv3EttRUc434SK9NokeMB+Mu4k888QSkUikAwGAwICzMtc17wvdwxeP84IMP\nbI4ZqacqLAdj+9usZEzoiYvhqmCPJmtceO6+fcVunUuMH85Cw6MJHXsi7My8eZPJhI6ONmRkTMPC\nhXlun28v+36s8Pa+/c3KmIr4oUOHsHv3bovXtm3bhqysLHR0dGDTpk144YUXxtIEYgxxxeMsKiqC\nTmewOMbeea60XGUJacwTH23bVWtG+oBRUlKMzZufcxgNIHwDZ6FhV0PHYqLlibAz8+aDg4NhNBpR\nU3PJLRF3FmkYKygK4R3GVMRXrFiBFStW2LyuUqnw3HPP4fnnn8ecOeP3JSNsGY3n6ci7Zdddv36d\njVdq7zwxAX3xxU0oLv47Cgoewdatbzi9rz07XF3fSB8w9u/fC47joFAoKIx+k2AtWp6ZllEXAAAP\nCUlEQVTyRJkXL/TER3L+eCehUfKblzCNMzU1NaYHH3zQdPny5fG+NSHCsmXLTABMy5Yt8/p1Dxw4\nYFq2bJlpw4YNpmXLlpkOHDhgSkhIMAEwhYaGmg4cOGBzrPA1T9kxkuu4ag8ROFRWVpr27Nljqqys\nNJlMJtPbb79teuWVV0xvv/22ly2zxdpWInAY9z3x7du3Q6fT4bXXXoPJZEJ0dDTefPNNp+d5KsPZ\nF/FkBre7LF++EjqdAcuXr/SoDey6RUVFotcV82zz8pYhL28ZVq0qwPHjR2/YtQLvvbcLer0e7767\ni685f/fdXfwx7DUxr92d9Tnytu1dh/3umO1AYH1XvfndHA/cWZ+1p52cnIb77zdntnd09MFgMAIA\nDAajz3xmbH3nz3/NT2yzzsa3h6/vcd8M301XGHcRf+utt8b7loQDxipD21mJmXXoXCig1i1S5869\n06ZPuljYu7j47+A4DsXFf7cIvbP7CX8Ww9F+ONV1E872fHNy5lmMMvUlERxJqJv2uP0DavZCjJqR\n7Ktbi7BQQPftKxbtby5E7LWCgkd4T1yIq8lq7paGlZQU4/Dhg1i+fCUJ/E2AMyG0TmpzRQTHS+hH\nknA3mj1uX3qACXRIxIlRM5KMbmsRdmcOub3Xt259g/fAhbgqzu5622zdOp2BRNyPcVVw3BVCRyLI\n7qnVasFxHfz1R2rbWDCaTHvy4scPEnFi1HiiuYmYgNp7OHD3oWEsm7pIpRIsX77S49cmxo+xEhxH\nIsjuqVAkIDV1io3QOxN5XxpRKgZlqo8fNMXMB/D3aTzWE8CEjGZtbJKYUqnEzp3vIDRUwk9IYxPG\nVKpL2LLlJf698WTq1OlYv/4nSElRjut9xxN//246IzIyDAMDBpcmpHkSNp1s5szZmD9/oc192TSz\niIgI0all7P2WlmuQy6P5hwLr6WgpKZPs/v7GcjIZm9o2lp/nzfDddAXyxAmfhXnQLFtd+BrzrK3f\nIwh3sfaYx8OrdRaqFnqyYrbFxMTx886ZrVqtFlqtBmVl53jv3VGzFwp5BwYk4oTP4yhcT33KCU8g\nFG5fEDd7Ii/s675w4WKLhw1nIXprKOQdGJCIEz6Poz1tKv0iPIFQuIXi5st7zdZCb897twdNJgsM\nSMQJp4ymNet44i92Er6HPXE8cuSw171ywDJSYG+y2mhE2dceVgjXCfa2AYTvw7LBWcMUZ5SUFGPV\nKnMDF1de9xTu2kkQjIyMTDz88HIbAcvMnOFSaHqk1NSocOTIYdTUqBwexyIFKlX1mNgx1tcnxg7y\nxAmnuLvvLCwBW7euSPR1muNN+ANjHXJ2df99rPevx3N/nLx+z0IiTjjF3X1ne2I6ko5o7oTHaX+c\n8DdcEU9Pip69a43n/rgvJA4GEiTihMexJ6Yj7YjGziWIQMMV8fSk6PmCgFJWvGchESd8AjGv+2YM\nj1NyHmGNJ0XPFwSUsuI9C4k44ROQ122GPgfCGk+KHglo4EEiTjhkvDxDMa/7ZhS0mzH6QBDEyCER\nJxwyXkIqtl8uFLSbJcxMyXkEQbgD1Yn7AAcPHhzT+unRUFi4GosXL4VSqRx3G/PzC/jZ4q7WgI91\nLTpBEIQvQZ64D/DBBx/4bNjY3hCS8cbVMPPNGIInRoenSriE1wHgU7XQ41GmRngHEnEfoKioCDqd\nwaf3Qb29V+tqmNnbdhL+h6fKroTXAeD1Ui4hgVamRnwHibgPsHLlSuTlLfO2GQ7xl71af7GT8B3M\nYzw10Gq1qKlRjViYxMq3fKUWOtDK1IjvIBEnCOKmRjjGU6WqHrGIW5dv+ZKXSmVqgQslthEeh5LL\nCH9jrAedEMRYQZ444XHsDUAhCF+FvEvCXyERJzwOJZcRBEGMDyTihMeh5DKCIISMRYnb3Ll3IDk5\nzUMW+i+0J04QBEGMKcLEQU9dq6KiwgOW+T/kiRMEQRBjyliUuGVnZ4/6WoHAuIv4wMAANm7ciN7e\nXkilUrz++utISkoabzMIgiCIcWIsStwSE6PQ0dHnkWv6M+MeTj948CCysrKwZ88e/OAHP8DOnTvH\n2wSCIIibgqqqKhw5chg1NSpvm0KMEePuia9duxYmkwkA0NLSgpiYmPE2gSAIwm8YTVJYRUUFtUgN\ncMZUxA8dOoTdu3dbvLZt2zZkZWVh7dq1qKmpwXvvvTeWJhAEQfg1o+lVnp2dDZ3OQE1sApggE3OL\nvcDVq1fx1FNP4ejRo94ygSAIwqepqqpCRUUFsrOzkZWV5bf3IMaGcQ+nv/vuu0hOTkZ+fj4iIiIQ\nEhLi0nmBnMDgyQSNkpJi7N+/F4WFq32iVjvQk09off6NP6wvOTkN999vrod211ZX13f+/NdobGyA\nTmcYt9rr0daO+8PvbjQkJka5dNy4i3hBQQGef/55HDp0CCaTCdu2bRtvEwIaf5+n7WsPIQRxM+CN\nyWQ00tQzjLuIKxQK7Nq1a7xve9Pg7y1P/f0hhCD8EWEJmCe7qzliNA8ONTUqfPaZCunp1POemr0E\nGP7e8tTfH0IIwt8ZLw95NLXjzEadzkAi7m0DCEKIvz+EEIS/443QurtkZs6AVCpBevrNLeAAiThB\nEAQhwB/GsmZkZCI3d05AJ7a5Cg1AIQiCILxKTY3KI53lPHUdf4I8cYIgCMKreGof/mbMeCcRJwiC\nILyKp/bh/WE/39OQiBMEQRBjirOyNU/tw/vDfr6nIREnCIIgxpSbMcw9XpCIEwRBEGPKzRjmHi9I\nxAmCIIgx5WYMc48XVGJGEARBEH4KiThBEARB+Ckk4gRBEAThp5CI+xAlJcVYtaoAJSXF3jaFIAiC\n8AMosc2HoDGcBEEQhDuQiPsQNIaTIAiCcAcScR+CxnASBEEQ7kB74gRBEAThp5CIEwRBEISfQiJO\nEARBEH4KiThBEARB+Ckk4gRBEAThp5CIEwRBEISfQiJOEARBEH4KiThBEARB+Ckk4gRBEAThp3hN\nxOvq6jBnzhzodDpvmUAQBEEQfo1XRFyj0eCNN95AWFiYN25PEARBEAGBV0T85ZdfxrPPPguZTOaN\n2xMEQRBEQDCmA1AOHTqE3bt3W7w2adIkfP/730dmZiZMJtNY3p4gCIIgApog0zgr6QMPPIDk5GSY\nTCZUVFQgOzsbf/3rX8fTBIIgCIIICMZdxIUsWrQIn376KUJDQ71lAkEQBEH4LV4tMQsKCqKQOkEQ\nBEGMEK964gRBEARBjBxq9kIQBEEQfgqJOEEQBEH4KSTiBEEQBOGn+I2IB2qb1oGBATz99NN49NFH\n8ZOf/ATt7e3eNsmjaDQa/OxnP8Njjz2GwsJClJeXe9ukMeHo0aPYuHGjt83wCCaTCb/5zW9QWFiI\nxx9/HNeuXfO2SWNCRUUFHnvsMW+b4XEMBgM2bdqENWvWYOXKlThx4oS3TfIoRqMRv/71r7Fq1Sqs\nWbMGtbW13jbJ43Ach/vuuw/19fVOj/ULEQ/kNq0HDx5EVlYW9uzZgx/84AfYuXOnt03yKO+//z5y\nc3Px17/+Fdu2bcOrr77qbZM8zmuvvYY//OEP3jbDYxw7dgw6nQ779+/Hxo0bsW3bNm+b5HF27dqF\nF198EXq93tumeJwPP/wQcXFx+Nvf/oadO3fi3//9371tkkc5ceIEgoKCsG/fPmzYsAHbt2/3tkke\nxWAw4De/+Y3LHU39QsQDuU3r2rVr8fOf/xwA0NLSgpiYGC9b5FmeeOIJFBYWAjB/OQPxQSwnJwev\nvPKKt83wGF9//TUWLlwIAMjOzkZVVZWXLfI8aWlpePPNN71txpiwbNkybNiwAYDZa5VIxrQx57iz\nZMkS/sGkubk54P5m/ud//idWrVqFpKQkl473qd9uoLdpFVvftm3bkJWVhbVr16Kmpgbvvfeel6wb\nPY7W19HRgU2bNuGFF17wknWjx976li1bhnPnznnJKs+j0WgQFRXF/yyRSGA0GhEc7BfP/C6xdOlS\nNDc3e9uMMSE8PByA+fe4YcMGPPPMM162yPMEBwdj8+bNOHbsGP7rv/7L2+Z4jMOHD0OhUGDBggV4\n5513XDrH5+vEb6Y2rVevXsVTTz2Fo0ePetsUj6JSqfDcc8/h+eefx9133+1tc8aEc+fO4cCBA/j9\n73/vbVNGzeuvv45Zs2bhwQcfBADcd999+Pzzz71r1BjQ3NyMjRs3Yv/+/d42xeNcv34dv/jFL/Do\no4/iRz/6kbfNGTM4jsMjjzyCjz76KCAitY8++iiCgoIAAJcvX0Z6ejrefvttKBQKu+f4lCcuxqef\nfsr/e9GiRX7tqYrx7rvvIjk5Gfn5+YiIiEBISIi3TfIotbW1+Ld/+zf88Y9/RGZmprfNIVwgJycH\nJ0+exIMPPojy8nLcdttt3jZpzPBxH2ZEdHZ24sknn8TLL7+Mu+66y9vmeJySkhK0tbVh/fr1CAsL\nQ3BwcMBEifbs2cP/+7HHHsOrr77qUMABPxBxIYHYprWgoADPP/88Dh06BJPJFHBJRNu3b4dOp8Nr\nr70Gk8mE6OjogN2LDBSWLl2KL7/8ks9lCLTvpBDm9QQSf/7zn9Hb24u33noLb775JoKCgrBr1y5I\npVJvm+YR7r//fvzqV7/Co48+CoPBgBdeeCFg1ibE1e+mz4fTCYIgCIIQJzBiEARBEARxE0IiThAE\nQRB+Cok4QRAEQfgpJOIEQRAE4aeQiBMEQRCEn0IiThAEQRB+Cok4QRA8586dw913342uri7+tb/8\n5S/45S9/6UWrCIKwB4k4QRA88+bNQ35+Pl588UUAQHl5OQ4ePIj/+I//8LJlBEGIQc1eCIKwQK/X\nY+XKlVi+fDn27NmD3/72t7j99tu9bRZBECKQiBMEYUNtbS3y8/Px1FNPUSidIHwYCqcTBGHD119/\njbi4OJw5cwZGo9Hb5hAEYQcScYIgLKitrcV///d/Y//+/ZBKpXjrrbe8bRJBEHYgEScIgmdoaAjP\nPPMMnn/+eUyePBmvv/469uzZg4qKCm+bRhCECCTiBEHwbNu2DVOnTsXDDz8MAJg0aRJ+9atfYdOm\nTRgYGPCydQRBWEOJbQRBEAThp5AnThAEQRB+Cok4QRAEQfgpJOIEQRAE4aeQiBMEQRCEn0IiThAE\nQRB+Cok4QRAEQfgpJOIEQRAE4aeQiBMEQRCEn/L/AXXLjQNHYGzCAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(X, Y1, marker = \".\", color = \"black\", label = \"Dataset 1\")\n", "plt.scatter(X, Y2, marker = \".\", color = \"gray\", label = \"Dataset 2\")\n", "plt.xlabel(\"X\")\n", "plt.ylabel(\"Y\")\n", "plt.legend(loc = 0)\n", "plt.title(\"Joint Distribution\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "DIFFERENT, again!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "These two datasets are *anticorrelated*. To see what this means, we can derive the correlation coefficients for the two datasets independently:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.896816214735\n", "-0.895177590207\n" ] } ], "source": [ "print(np.corrcoef(X, Y1)[0, 1])\n", "print(np.corrcoef(X, Y2)[0, 1])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "\"Correlation\" means as we change one variable (X), another variable changes by a similar amount (Y). Positive correlation means as we increase one variable, the other increases; negative correlation means as we increase one variable, the other *decreases*." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Anticorrelation, then, is the presence of both positive and negative correlation, which is what we see in this dataset: one has a correlation coefficient of 0.9 (1.0 is perfect positive correlation), while the other is -0.9 (-1.0 is perfect negative correlation)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**This is something we'd only know from either visualizing the data or examining how the data are correlated.**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### More than two dimensions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "If you have 3D data, matplotlib is capable of displaying that. But beyond three dimensions, it can get tricky. A good starting point is to make a *correlation matrix*, where the $i^{th}$ row and $j^{th}$ column of the matrix is the correlation coefficient between the $i^{th}$ and $j^{th}$ dimensions of the data." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Another strategy is to create 2D scatter plots of every pairwise combinations of dimensions. For every $i^{th}$ and $j^{th}$ dimension in the data, create a 2D scatter plot like we did in the last slide. This way, you can visualize each dimensions relative to each other dimension and easily spot any correlations." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The upshot here is to **find a way to visualize your data**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Part 2: Rescaling" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Many data science analysis techniques can be sensitive to the *scale* of your data. This is where normalization or *scaling* your data can help immensely." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Let's say you're interested in grouping together your friends based on height and weight. You collect the following data points:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAGAQig31gIqKCgWDQfl8vu6Pvf322zp27Nhdj6uvr9eBAweUlJT0v58SAIBBKuQVdXp6usrKyrqP\nL1++rN27d2vt2rXdH3POqampSevXr1deXt6nIg4AAPom5BV1Tk6OmpubJUkff/yxiouLtXr1asXH\nx8s5J0nq7OxUIBBQYWGhurq6VFBQoKysLI0ZM6Z/pwcAwONChvqT6uvr9a9//UsbN27UjRs39M9/\n/lPbtm3T6tWrFQgElJCQoISEBE2ZMkUNDQ1hhTolxd/n4S3xwh5e2EHyxh5e2EFiD0u8sIPknT16\nI+x3fTvnlJWVpVdffVW/+MUvtHPnTo0aNUo/+clP1NjYqLy8PDnndOvWLZ09e1bjx4/vz7kBABgU\nwr6ijomJ+cw/y8zM1Jw5c7RgwQLFxcVp7ty5yszM/J8MCADAYBbj7vygGQAAmMMNTwAAMIxQAwBg\nGKEGAMAwQg0AgGG9+j3q/6vy8nL9/ve/161bt7R48WKNHz9emzdv1pAhQxQfH6+SkhJ94QtfGMiR\neu3eHb7xjW9o3bp1km7fxW3r1q164AH75z/37jF//nxJt+/hfujQIR05ciTCE4bn3j3GjRunpUuX\nKiMjQ5KUl5enxx57LLJDhnDvDjNmzFBxcbHa29v10Ucf6YUXXlBaWlqkxwzpk3vk5eXpz3/+s1pb\nW+WcU3NzsyZOnKjS0tJIj3lfPX2P2rBhg2JjY5WRkaGtW7dGesSw3LvH2LFjtWHDBiUkJOjhhx9W\ncXFxpEcM6fjx4/rVr36lmJgY3bhxQw0NDTp06JB++tOf6oEHHtDo0aO1YcOGSI95Xz3t8Kc//UmJ\niYnatm2bvvrVr2rhwoWhn8gNkDNnzrhly5Y555zr6Ohwe/fudfn5+a6hocE559yRI0fctm3bBmqc\nPulph2eeeca9+eabzjnnVq9e7X73u99FcsSw9LSHc87V19e7JUuWuIULF0ZyvLD1tMfRo0fdwYMH\nIztYL/S0w+rVq93rr7/unHPuL3/5i6uqqorkiGH5rK8p55z7z3/+4+bMmeNaW1sjNV5YPuvf9+nT\np51zzj377LPu1KlTEZwwPD3tMW/ePPe3v/3NOefc7t273a9//etIjthrzz//vDt69KhbtmyZq6mp\ncc45t379+qj4fnvHnR3+/e9/u+9///suJyfHHTlyJKy/O2CXfn/84x81ZswYLV++XE8//bRmzJih\nXbt26Wtf+5okqaurSwkJCQM1Tp/0tMPevXuVnZ2tmzdv6tKlS/L77d81p6c9rly58ql7uFt37x7T\np09XfX29qqqqlJ+fr7Vr16qzszPSY95XTzvU1tbq4sWLKiws1IkTJzR58uRIjxlST19Td+zZs0f5\n+fkaMWJEBCcMrafPxbhx43T58mU559TR0aHY2AF9EbJPetrjgw8+0IQJEyRJEydO1NmzZyM8Zfj+\n/ve/6x//+IcWLFig+vp6ffOb35QkTZs2TdXV1RGeLjyf3KGzs1MrVqxQbm5u2H9/wL7qLl++rJaW\nFu3fv1/vv/++nn76aZ08eVKSVFtbq8OHD+vll18eqHH65LN2aGlpUWFhofx+vx5++OFIjxnSvXss\nW7ZMmZmZn7qHu3U9fT6WLl2qxx9/XOPGjdOLL76ovXv3qqioKNKjfqaedmhubtbnP/95HTx4UGVl\nZSovL9ePfvSjSI96X5/1b6OtrU1nzpyJihPAnnZYsWKFNm3apBdffFF+v1+TJk2K9Jgh9bTHyJEj\nVVNTo0ceeUSnTp3Shx9+GOkxw1ZeXq4VK1Z86uM+n0/t7e0RmKj3ysvL9cMf/lCSNHLkSI0cOVKn\nT58O++8P2BV1UlKSvv3tbys2NlYPPfSQEhIS1NbWptdee03PP/+8ysvLlZycPFDj9Mln7ZCamqrf\n/va3WrhwobZt2xbpMUO6d4+LFy+qqalJGzdu1LPPPtt9D3frevp8fOc739G4ceMk3f4fyjQ0NER4\nyvvraYePP/5YM2fOlCTNnDlT9fX1EZ4ytHv3+NznPqe2tjadPHlSs2fPvu+dDa3o6XPx4x//WIcP\nH9Zrr72m3Nxc/exnP4v0mCH1tMeaNWu0f/9+FRYWasSIEea/197R3t6uCxcu6JFHHpGku97/09HR\noeHDh0dqtLDd2eH/cpI3YKHOzs7WH/7wB0nSBx98oOvXr+v06dM6dOiQKisr9eUvf3mgRumze3f4\n8MMPtXbtWjU1NUm6fYYXDW8ku3ePBx98UL/5zW8+dQ9363r6fCxdulTnzp2TJFVXV5u/53xPO3z3\nu99VVVWVJKmmpkajRo2K4ITh6WmP5ORkVVdXa9q0aRGeLjw97fCVr3xFPp9PkvSlL31JV69ejeSI\nYenpe21tba1KS0t18OBBXblyRd/61rciPGV4ampqNGXKlO7jsWPHqqamRpJ0+vRpZWdnR2q0sN27\nQ18M2Evf06dP15tvvqnvfe97cs5p/fr1WrVqlVJTU/XMM88oJiZGkyZN6n55wKJ7d9iwYYN8Pl/3\nS8ZDhw7Vli1bIj1mSD3tEY3u3WPjxo1KTk7Wpk2bFBcXp5SUFG3atCnSY95XTzs89NBDWrt2rY4c\nOSK/32/+ndJSz19TMTExunDhQlS8Y13qeYehQ4dq5cqVio2NVXx8vDZv3hzpMUPq6XvtzZs3tWTJ\nEg0dOlSTJ0+OmpOn9957766vn6KiIq1bt063bt1SZmamZs2aFcHpwnPvDn3Bvb4BADDM/uu0AAAM\nYoQaAADDCDUAAIYRagAADCPUAAAYRqgBADCMUAMAYNj/Bw6ULn+11sEjAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "personA = np.array([63, 150]) # 63 inches, 150 pounds\n", "personB = np.array([67, 160]) # 67 inches, 160 pounds\n", "personC = np.array([70, 171]) # 70 inches, 171 pounds\n", "\n", "plt.scatter(personA[0], personA[1])\n", "plt.scatter(personB[0], personB[1])\n", "plt.scatter(personC[0], personC[1])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "And you compute the \"distance\" between each point (we'll just use standard Euclidean distance):" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A to B: 10.77\n", "A to C: 22.14\n", "B to C: 11.40\n" ] } ], "source": [ "import numpy.linalg as nla\n", "print(\"A to B: {:.2f}\".format( nla.norm(personA - personB) ))\n", "print(\"A to C: {:.2f}\".format( nla.norm(personA - personC) ))\n", "print(\"B to C: {:.2f}\".format( nla.norm(personB - personC) ))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "As you can see, the two closest data points are person A and person B." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "But now your UK friend comes to you with the same dataset but a totally different conclusion! Turns out, this friend computed the heights of everyone in *centimeters*, rather than inches, giving the following dataset:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A to B: 14.28\n", "A to C: 27.53\n", "B to C: 13.37\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe0AAAFVCAYAAADCLbfjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFcdJREFUeJzt3X9o1If9x/FXvuYSzN2FE3usCOECMUIrqZSACoLMYKBj\nISQRV8/l0qZSWtw/MwXjaipiDNsSo2IXYXoiLEVZwK8cSvU/4/7JgiRrnKlR2NWsRISEpDU/0DTb\n5/uH7X01ZbuLl0/i2zwff/UTPz3evvnQ530u6ScZjuM4AgAAL7z/WewBAABAaog2AABGEG0AAIwg\n2gAAGEG0AQAwgmgDAGBEZion9fX16ciRI2pvb1ddXZ1GRkbkOI6Ghob05ptvqrW1VYcPH9bf/vY3\neb1eSdLJkyfl8/lcHR4AgKUkabSj0ahisVgixkePHpUkPXz4UO+8844+/vhjSdKXX36pM2fOKBAI\nuDguAABLV9KPx0OhkNra2n709RMnTqi6ulorV66U4zgaHBzUgQMHFA6HdeHCBVeGBQBgKUt6p11a\nWqqhoaFnvjY6Oqru7m7t379fkjQ1NaVIJKLa2lrNzMyopqZGRUVFWrNmjTtTAwCwBD3XD6JdvXpV\nZWVlysjIkCQtX75ckUhE2dnZ8nq92rhxowYGBpK+Dk9QBQAgdSn9IJr0bGC7urq0e/fuxPFXX32l\nPXv2KBaLaWZmRj09Paqqqkr6mhkZGRoeHp/jyJiLYNDPjhcAe3YfO3YfO3ZfMOhP699POdo/3FVL\n0r1795SXl5c4LigoUEVFhbZv3y6Px6PKykoVFBSkNRgAAHhWxmL/li/e1bmLd84Lgz27jx27jx27\nL907bR6uAgCAEUQbAAAjiDYAAEYQbQAAjCDaAAAYQbQBADCCaAMAYATRBgDACKINAIARRBsAACOI\nNgAARhBtAACMINoAABhBtAEAMIJoAwBgBNEGAMAIog0AgBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0\nAQAwgmgDAGAE0QYAwAiiDQCAEUQbAAAjiDYAAEYQbQAAjCDaAAAYQbQBADCCaAMAYATRBgDACKIN\nAIARRBsAACOINgAARmQu9gAAAMyH0dFvVF9/TYODuQqFvlVzc4lWrAgs9ljzimgDAF4K9fXXFItF\nJGXoiy8cSe06fbpysceaV3w8DgB4KQwO5krK+P4o4/vjlwvRBgC8FEKhbyU53x85CoUeLuY4ruDj\ncQDAS6G5uURS+/ff036o5uYtiz3SvCPaAICXwooVgZfue9iz8fE4AABGEG0AAIxI6ePxvr4+HTly\nRO3t7aqrq9PIyIgcx9HQ0JDefPNNtba2qqOjQ3/+85/l8Xj04Ycf6qc//anLowMAsLQkjXY0GlUs\nFpPX65UkHT16VJL08OFDvfPOO/r44481MjKi9vZ2Xbx4UY8ePVI4HNamTZvk8XjcnR4AgCUk6cfj\noVBIbW1tP/r6iRMnVF1drZUrV+rmzZsqLi5WZmamfD6f8vPzdefOHVcGBgBgqUoa7dLSUi1btuyZ\nr42Ojqq7u1tVVVWSpImJCfn9/sSf5+TkaHx8fJ5HBQBgaXuu/+Xr6tWrKisrU0bGkyfP+Hw+TUxM\nJP58cnJSubmpPYkmGPQnPwlpYccLgz27jx27jx2/2FKOtuM4iX/u6urS7t27E8dvvPGGjh8/runp\naT1+/FjxeFyFhYUpve7wMHfkbgoG/ex4AbBn97Fj97Fj96X7pijlaP9wVy1J9+7dU15eXuL4lVde\nUSQS0c6dO+U4jurq6pSVlZXWYAAA4FkZztO30IuAd3Xu4p3zwmDP7mPH7mPH7kv3TpuHqwAAYATR\nBgDACKINAIARRBsAACOINgAARhBtAACMINoAABhBtAEAMIJoAwBgBNEGAMAIog0AgBFEGwAAI4g2\nAABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYAwAiiDQCAEUQbAAAjiDYAAEYQbQAAjCDaAAAYQbQB\nADCCaAMAYATRBgDACKINAIARRBsAACOINgAARhBtAACMINoAABhBtAEAMIJoAwBgBNEGAMAIog0A\ngBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYAwAiiDQCAEZmpnNTX16cjR46ovb1d\no6Ojamho0Pj4uP71r3/p97//vfLy8tTU1KTe3l55vV5J0smTJ+Xz+VwdHgCApSRptKPRqGKxWCLG\nLS0tKi8v11tvvaXu7m7F43Hl5eWpv79fZ86cUSAQcH1oAACWoqQfj4dCIbW1tSWOe3t79eDBA9XW\n1ury5cvasGGDHMfR4OCgDhw4oHA4rAsXLrg6NAAAS1HSaJeWlmrZsmWJ46GhIQUCAZ09e1avvvqq\nTp06pampKUUiEbW0tCgajercuXO6e/euq4MDALDUpPQ97acFAgFt2bJFklRSUqLjx48rJydHkUhE\n2dnZys7O1saNGzUwMKA1a9Ykfb1g0D/3qTEn7HhhsGf3sWP3seMX25yjXVxcrOvXr6u8vFw3btzQ\n6tWrFY/HtWfPHsViMc3MzKinp0dVVVUpvd7w8Pich0bqgkE/O14A7Nl97Nh97Nh96b4pmnO06+vr\n1dDQoPPnz8vv96u1tVV+v18VFRXavn27PB6PKisrVVBQkNZgAADgWRmO4ziLOQDv6tzFO+eFwZ7d\nx47dx47dl+6dNg9XAQDACKINAIARRBsAACOINgAARhBtAACMINoAABhBtAEAMIJoAwBgBNEGAMAI\nog0AgBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYAwAiiDQCAEUQbAAAjiDYAAEYQ\nbQAAjCDaAAAYQbQBADCCaAMAYATRBgDACKINAIARRBsAACOINgAARhBtAACMINoAABhBtAEAMIJo\nAwBgBNEGAMAIog0AgBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYAwAiiDQCAEUQb\nAAAjiDYAAEakFO2+vj5FIhFJ0ujoqHbv3q1IJKKdO3fq66+/liR1dHRo27Zt2rFjhzo7O10bGACA\npSoz2QnRaFSxWExer1eS1NLSovLycr311lvq7u5WPB7X8uXL1d7erosXL+rRo0cKh8PatGmTPB6P\n638BAEvH6Og3qq+/psHBXIVC36q5uUQrVgQWeyxgwSS90w6FQmpra0sc9/b26sGDB6qtrdXly5e1\nYcMG3bx5U8XFxcrMzJTP51N+fr7u3Lnj6uAAlp76+muKxSL64osKxWI12rv32mKPBCyopHfapaWl\nGhoaShwPDQ0pEAjo7Nmzamtr06lTp5Sfny+/3584JycnR+Pj4ykNEAz6k5+EtLDjhcGe3Xf//gpJ\nGd8fZej+/RXsfZ6xzxdb0mjPFggEtGXLFklSSUmJjh07pqKiIk1MTCTOmZycVG5ubkqvNzycWtzx\nfIJBPzteAOzZfcGgX6tWjUpy9CTcjlatGmPv84jr2H3pvimac7SLi4t1/fp1lZeX68aNGyosLFRR\nUZGOHTum6elpPX78WPF4XIWFhWkNBgCzNTeXSGr//nvaD9XcvGWxRwIW1JyjXV9fr4aGBp0/f15+\nv1+tra3y+/2JnyZ3HEd1dXXKyspyY14AS9iKFQGdPl252GMAiybDcRxnMQfgoxh38XHXwmDP7mPH\n7mPH7kv343EergIAgBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYAwAiiDQCAEUQb\nAAAjiDYAAEYQbQAAjCDaAAAYQbQBADCCaAMAYATRBgDACKINAIARRBsAACOINgAARhBtAACMINoA\nABhBtAEAMIJoAwBgBNEGAMAIog0AgBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYA\nwAiiDQCAEUQbAAAjiDYAAEYQbQAAjCDaAAAYQbQBADCCaAMAYATRBgDACKINAIARRBsAACOINgAA\nRmSmclJfX5+OHDmi9vZ23b59Wx988IHy8/MlSeFwWD/72c/U1NSk3t5eeb1eSdLJkyfl8/lcGxwA\ngKUmabSj0ahisVgixrdu3dJ7772nd99995nz+vv7debMGQUCAVcGBQBgqUv68XgoFFJbW1viuL+/\nX52dnaqurtb+/fs1NTUlx3E0ODioAwcOKBwO68KFC64ODQDAUpQ02qWlpVq2bFnieN26ddq7d68+\n++wz5eXl6dNPP9XU1JQikYhaWloUjUZ17tw53b1719XBAQBYalL6nvbTtm7dKr/fL+lJ0A8fPqyc\nnBxFIhFlZ2crOztbGzdu1MDAgNasWZP09YJB/9ynxpyw44XBnt3Hjt3Hjl9sc472rl279Mknn6io\nqEhdXV1au3at4vG49uzZo1gsppmZGfX09Kiqqiql1xseHp/z0EhdMOhnxwuAPbuPHbuPHbsv3TdF\nc472wYMH1djYKI/Ho2AwqEOHDsnr9aqiokLbt2+Xx+NRZWWlCgoK0hoMAAA8K8NxHGcxB+Bdnbt4\n57ww2LP72LH72LH70r3T5uEqAAAYQbQBADCCaAMAYATRBgDACKINAIARRBsAACOINgAARhBtAACM\nINoAABhBtAEAMIJoAwBgBNEGAMAIog0AgBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE\n0QYAwAiiDQCAEUQbAAAjiDYAAEYQbQAAjCDaAAAYQbQBADCCaAMAYATRBgDACKINAIARRBsAACOI\nNgAARhBtAACMINoAABhBtAEAMIJoAwBgBNEGAMAIog0AgBFEGwAAI4g2AABGEG0AAIwg2gAAGEG0\nAQAwgmgDAGBEStHu6+tTJBKRJN2+fVubN29WTU2NampqdOXKFUlSR0eHtm3bph07dqizs9O1gQEA\nWKoyk50QjUYVi8Xk9XolSbdu3dJ7772nd999N3HOyMiI2tvbdfHiRT169EjhcFibNm2Sx+NxbXAA\nAJaapHfaoVBIbW1tieP+/n51dnaqurpaDQ0Nmpyc1M2bN1VcXKzMzEz5fD7l5+frzp07rg6O/250\n9Bu9//5FrV9/Se+//78aG/tmsUcCAKQp6Z12aWmphoaGEsfr1q3TL37xC73++uv64x//qD/84Q96\n7bXX5Pf7E+fk5ORofHzcnYmRkvr6a4rFIpIyJDmS2nX6dOUiTwUASEfSaM+2devWRKC3bt2qw4cP\na/369ZqYmEicMzk5qdzc3JReLxj0Jz8Jc3b//go9CbYkZej+/RXs2mXs133s2H3s+MU252jv2rVL\nn3zyiYqKitTV1aW1a9eqqKhIx44d0/T0tB4/fqx4PK7CwsKUXm94mDtyN6xaNaond9hP7rRXrRpj\n1y4KBv3s12Xs2H3s2H3pvimac7QPHjyoxsZGeTweBYNBHTp0SF6vV5FIRDt37pTjOKqrq1NWVlZa\ngyE9zc0lktp1//4KrVo1pubmLYs9EgAgTRmO4ziLOQDv6tzFO+eFwZ7dx47dx47dl+6dNg9XAQDA\nCKINAIARRBsAACOINgAARhBtAACMINoAABhBtAEAMIJoAwBgBNEGAMAIog0AgBFEGwAAI4g2AABG\nEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYAwAiiDQCAEUQbAAAjiDYAAEYQbQAAjCDaAAAYQbQBADCC\naAMAYATRBgDACKINAIARRBsAACOINgAARhBtAACMINoAABhBtAEAMIJoAwBgBNEGAMAIog0AgBFE\nGwAAI4g2AABGEG0AAIwg2gAAGEG0AQAwgmgDAGAE0QYAwAiiDQCAEUQbAAAjUop2X1+fIpHIM1+7\ndOmSduzYkThuamrStm3bVFNTo5qaGk1MTMzvpAAALHGZyU6IRqOKxWLyer2Jr3355Ze6cOHCM+f1\n9/frzJkzCgQC8z8lAABIfqcdCoXU1taWOB4bG9Px48e1f//+xNccx9Hg4KAOHDigcDj8o6ADAID0\nJb3TLi0t1dDQkCTp3//+txoaGrRv3z5lZWXJcRxJ0tTUlCKRiGprazUzM6OamhoVFRVpzZo17k4P\nAMASkjTaT+vv79c///lPHTx4UI8fP9Y//vEP/fa3v9W+ffsUiUSUnZ2t7Oxsbdy4UQMDAylFOxj0\nP/fwSA07Xhjs2X3s2H3s+MWW8k+PO46joqIiXbp0SX/605909OhRrV69Wr/5zW8Uj8cVDoflOI6+\n++479fT0aO3atW7ODQDAkpPynXZGRsZ//LOCggJVVFRo+/bt8ng8qqysVEFBwbwMCAAAnshwfvjG\nNAAAeKHxcBUAAIwg2gAAGEG0AQAwgmgDAGDEgkT76WeX3759W5s3b048o/zKlSuSeHZ5up7e8ejo\nqHbv3q1IJKKdO3fq66+/liR1dHRo27Zt2rFjhzo7OxdxWptS2THXcfqe3nNdXZ1qamoUiURUUlKi\njz76SBLXcrpS2fHhw4e5ltMwu3tvv/22fvnLXz7zNNHnuo4dl50+fdopKytz3n77bcdxHKejo8M5\ne/bsj84Lh8PO2NiY2+O8lGbveN++fc6VK1ccx3Gcv/71r05nZ6czPDzslJWVOd99950zPj7ulJWV\nOdPT04s5timp7NhxuI7TNXvPP/j222+diooKZ2RkhGs5Tans2HG4ltMxe8e/+tWvnL/85S+O4zjO\nRx995Fy7du25r2PX77RnP7u8v79fnZ2dqq6u1v79+zU1NcWzy9M0e8e9vb168OCBamtrdfnyZW3Y\nsEE3b95UcXGxMjMz5fP5lJ+frzt37izi1LaksmOu4/TN3vMPTpw4oerqaq1cuZJrOU2p7JhrOT2z\nd/zaa69pbGxMjuNocnJSmZmZz30dux7t0tJSLVu2LHG8bt067d27V5999pny8vL06aefJp5d3tLS\nomg0qnPnzunu3btuj/bSmL3joaEhBQIBnT17Vq+++qpOnTqliYkJ+f3//3jCnJwcjY+PL8a4JqWy\nY67j9M3es/TkWxHd3d2qqqqSJK7lNKWyY67l9MzecX5+vpqamvTzn/9co6OjWr9+/XNfxwv+g2hb\nt27V66+/LunJX2xgYEA5OTmJZ5d7vd7Es8vxfAKBgLZs2SJJKikp0a1bt+T3+5/5ntTk5KRyc3MX\na0TzZu+4v7+f69glV69eVVlZWeKpjD6fj2t5ns3e8fLly7mW51FTU5POnTunzz//XOXl5frd7373\n3P9NXvBo79q1S3//+98lSV1dXVq7di3PLp9nxcXFun79uiTpxo0bKiwsVFFRkXp6ejQ9Pa3x8XHF\n43EVFhYu8qR2zd7x6tWruY7nkfPUgxq7urq0efPmxPEbb7zBtTwP/tuOv/rqK67leRQIBOTz+SRJ\nP/nJT/Tw4cPn/m/ynH7L13w4ePCgGhsb5fF4FAwGdejQIXm9Xp5dPo/q6+vV0NCg8+fPy+/3q7W1\nVX6/P/GTzo7jqK6uTllZWYs9qln/acdcx/Pj6d91cO/ePeXl5SWOX3nlFa7lefDfdszvk5hfjY2N\n+vWvf63MzExlZWWpsbHxua9jnj0OAIARPFwFAAAjiDYAAEYQbQAAjCDaAAAYQbQBADCCaAMAYATR\nBgDAiP8DaSPJi8T4r+gAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "personA = np.array([160.0, 150]) # 160 cm, 150 pounds\n", "personB = np.array([170.2, 160]) # 170.2 cm, 160 pounds\n", "personC = np.array([177.8, 171]) # 177.8 cm, 171 pounds\n", "\n", "plt.scatter(personA[0], personA[1])\n", "plt.scatter(personB[0], personB[1])\n", "plt.scatter(personC[0], personC[1])\n", "\n", "print(\"A to B: {:.2f}\".format( nla.norm(personA - personB) ))\n", "print(\"A to C: {:.2f}\".format( nla.norm(personA - personC) ))\n", "print(\"B to C: {:.2f}\".format( nla.norm(personB - personC) ))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Using this data, we arrive at the conclusion that persons B and C are most similar! Oops...?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "It can be very problematic if a simple change of units completely alters the conclusions you draw from the data. One way to deal with this is through scaling--we've actually done this before in a homework assignment." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "By rescaling the data, we eliminate any and all units. We remove the mean (subtract it off) and divide by the standard deviation, so if you had to include a unit, it would essentially be units of \"standard deviations away from 0.\"" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== BEFORE ===\n", "Means: [ 0.4303258 0.53938706 0.52770194]\n", "Stds: [ 0.17285592 0.27353295 0.23789391]\n", "=== AFTER ===\n", "Means: [ -2.66453526e-16 -6.66133815e-17 -4.44089210e-17]\n", "Stds: [ 1. 1. 1.]\n" ] } ], "source": [ "def rescale(data):\n", " # First: subtract off the mean of each column.\n", " data -= data.mean(axis = 0)\n", " \n", " # Second: divide by the standard deviation of each column.\n", " data /= data.std(axis = 0)\n", " \n", " return data\n", "\n", "np.random.seed(3248)\n", "X = np.random.random((5, 3)) # Five rows with three dimensions.\n", "\n", "print(\"=== BEFORE ===\")\n", "print(\"Means: {}\\nStds: {}\".format(X.mean(axis = 0), X.std(axis = 0)))\n", "\n", "Xs = rescale(X)\n", "\n", "print(\"=== AFTER ===\")\n", "print(\"Means: {}\\nStds: {}\".format(Xs.mean(axis = 0), Xs.std(axis = 0)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Of course, like anything (everything?), there are still caveats." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - There is an implicit assumption being made when you rescale your data: that your dimensions are distributed like a Gaussian. If this is not true--or even worse, true for *some* dimensions but not others--you risk creating more problems than you solve by putting dimensions on \"equal\" footing that shouldn't be." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - On the other hand, rescaling your data can do wonders to mitigate or even eliminate the effects of outliers on your data. Rescaling will maintain *relative* distances (in terms of standard deviations) between dimensions, but will eliminate *absolute* differences that could just be flukes." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - As always, be careful about numerical round-off errors. You'll notice none of the means in the previous slide were *exactly* 0; this has to do with the precision of floating-point numbers and this precise behavior can vary depending on what operating system you're using." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Part 3: DataFrames" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "*DataFrames* are a relatively new data structure on the data science scene. Equal parts spreadsheet, database, and array, they are capable of handling rich data formats as well as having built-in methods for dealing with the idiosyncrasies of unstructured datasets." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "As Jake wrote in his book, *Python Data Science Handbook*:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " > NumPy's `ndarray` data structure provides essential features for the type of clean, well-organized data typically seen in numerical computing tasks. While it serves this purpose very well, its limitations become clear when we need more flexibility (such as attaching labels to data, working with missing data, etc.) and when attempting operations which do not map well to element-wise broadcasting (such as groupings, pivots, etc.), each of which is an important piece of analyzing the less structured data available in many forms in the world around us. Pandas [...] builds on the NumPy array structure and provides efficient access to these sorts of \"data munging\" tasks that occupy most of a data scientist's time.\"" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "What exactly is a DataFrame, then?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Well, it's a collection of Series! ``" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.25\n", "1 0.50\n", "2 0.75\n", "3 1.00\n", "dtype: float64\n" ] } ], "source": [ "import pandas as pd # \"pd\" is the import convention, like \"np\" is for NumPy\n", "data = pd.Series([0.25, 0.5, 0.75, 1])\n", "print(data)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Think of a `Series` as a super-fancy 1D NumPy array. It's so fancy, in fact, that you can give a `Series` completely custom indices, sort of like a dictionary. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 b\n", "2 a\n", "3 c\n", "dtype: object\n" ] } ], "source": [ "data = pd.Series({2:'a', 1:'b', 3:'c'})\n", "print(data)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "If a `Series` is essentially a fancy 1D NumPy array, then a DataFrame is a fancy 2D array. Here's an example." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " area population\n", "California 423967 38332521\n", "Florida 170312 19552860\n", "Illinois 149995 12882135\n", "New York 141297 19651127\n", "Texas 695662 26448193\n" ] } ], "source": [ "# Standard Python dictionary, nothing new and exciting.\n", "population_dict = {'California': 38332521,\n", " 'Texas': 26448193,\n", " 'New York': 19651127,\n", " 'Florida': 19552860,\n", " 'Illinois': 12882135}\n", "population = pd.Series(population_dict) # Oh right: you can feed dicts to Series!\n", "\n", "area_dict = {'California': 423967,\n", " 'Texas': 695662,\n", " 'New York': 141297,\n", " 'Florida': 170312,\n", " 'Illinois': 149995}\n", "area = pd.Series(area_dict)\n", "\n", "# Build the DataFrame!\n", "states = pd.DataFrame({'population': population,\n", " 'area': area})\n", "print(states)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "DataFrames are really nice--you can directly access all the extra information they contain." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['California', 'Florida', 'Illinois', 'New York', 'Texas'], dtype='object')\n" ] } ], "source": [ "print(states.index) # Our row names" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['area', 'population'], dtype='object')\n" ] } ], "source": [ "print(states.columns) # Our Series / column names" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "You can also directly access the property you're interested in, rather than having to memorize the index number as with NumPy arrays:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "California 38332521\n", "Florida 19552860\n", "Illinois 12882135\n", "New York 19651127\n", "Texas 26448193\n", "Name: population, dtype: int64\n" ] } ], "source": [ "print(states['population'])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "But you can also access the same information *almost* as you would with a NumPy array:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "California 38332521\n", "Florida 19552860\n", "Illinois 12882135\n", "New York 19651127\n", "Texas 26448193\n", "Name: population, dtype: int64\n" ] } ], "source": [ "print(states.iloc[:, 1])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Note the use of the `.iloc` attribute of DataFrames." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This is to handle the fact that you can assign *entirely customized* integer indices to DataFrames, resulting in potentially confusing behavior when you slice them--if you slice with `1:3`, are you referring to the first and third items in the DataFrame, or the items you specifically indexed as the first and third items? With DataFrames, these can be two different concepts!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - Use `.iloc` if you want to use *implicit* ordering, meaning the automatic Python internal ordering.\n", " - Use `.loc` if you want to use *explicit* ordering, or the ordering that you set when you built the DataFrame.\n", " - Use `.ix` if you want a *hybrid* of the two." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "If you just want the whipper-snappers to get off your lawn, don't worry about this distinction. As long as you don't explicitly set the indices yourself when you build a DataFrame, just use `iloc`." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Missing data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "So what do DataFrames have to do with data exploration?...besides making it really easy, of course." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "pandas has some phenomenal missing-data capabilities built-in to Series and DataFrames. As an example by comparison, let's see what happens if we have a `None` or `NaN` in our NumPy array when we try to do arithmetic." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "TypeError", "evalue": "unsupported operand type(s) for +: 'int' and 'NoneType'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/opt/python/lib/python3.5/site-packages/numpy/core/_methods.py\u001b[0m in \u001b[0;36m_sum\u001b[0;34m(a, axis, dtype, out, keepdims)\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_sum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 32\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mumr_sum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_prod\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'NoneType'" ] } ], "source": [ "x = np.array([0, 1, None, 2])\n", "print(x.sum())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Welp, that crashed and burned. What about using `NaN` instead?" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nan\n" ] } ], "source": [ "x = np.array([0, 1, np.nan, 2])\n", "print(x.sum())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Well, it didn't crash. But since \"NaN\" specifically stands for \"Not A Number\", it makes arithmetic difficult since any operation involving a `NaN` will return `NaN`." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "A Series has a bunch of tools available to us to sniffing out missing values and handling them gracefully." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - **`isnull()`**: generate a boolean mask which indicates where there are missing values.\n", " - **`notnull()`**: opposite of `isnull()`.\n", " - **`dropna()`**: return a version of the data that drops all `NaN` values.\n", " - **`fillna()`**: return a copy of the data with `NaN` values filled in with something else or otherwise imputed." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 False\n", "1 True\n", "2 False\n", "3 True\n", "dtype: bool\n", "\n", "0 1\n", "2 hello\n", "dtype: object\n" ] } ], "source": [ "data = pd.Series([1, np.nan, 'hello', None])\n", "print(data.isnull()) # Where are the null indices?\n", "print()\n", "print(data[data.notnull()]) # Use the boolean mask to pull out non-null indices." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "This is but a tiny taste of the majesty that is the pandas package. I highly recommend checking it out further." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Review Questions\n", "\n", "Some questions to discuss and consider:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "1: What are the advantages and disadvantages of using pandas DataFrames instead of NumPy arrays?\n", "\n", "2: Name three strategies for visualizing and exploring 5-dimensional data. What are the pros and cons of each?\n", "\n", "3: You're putting your data science skills to work and writing a program that automatically classifies web articles into semantic categories (e.g. sports, politics, food, etc). You start by counting words, resulting in a model with 100,000 dimensions (words are dimensions!). Can you come up with any kind of strategy for exploring these data?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Course Administrivia" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - One more week left of class! (after this week)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - A10 is due Thursday evening, and A11 (the final assignment!) will be released that morning." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ " - Penultimate flipped lecture tomorrow!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Additional Resources\n", "\n", " 1. Grus, Joel. *Data Science from Scratch*, Chapter 10. 2015. ISBN-13: 978-1491901427\n", " 2. VanderPlas, Jake. *Python Data Science Handbook*, Chapter 4. 2015. ISBN-13: 978-1491912058" ] } ], "metadata": { "anaconda-cloud": {}, "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python [default]", "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.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }