{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Text Analysis in Python\n", "\n", "I am not an NLP person and this is outside of my expertise, but I know enough to give a basic introduction to text analysis and text processing tools.\n", "\n", "For this tutorial + homework, I'm going to use data from Reddit. I retrieved it from PushShift, using the following code. Unfortunately, Pushshift is not currently available for researchers so this code won't work and you'll just have to grab the version of the data that I've linked to below." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import requests\n", "from datetime import datetime\n", "import time\n", "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from bertopic import BERTopic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "## Code used to create the dataset - no longer works\n", "\n", "endpt = 'https://api.pushshift.io/reddit/search/submission'\n", "\n", "subreddits = ['Coronavirus', 'politics', 'aww']\n", "\n", "# Start and end date (pushshift expects these in epoch time)\n", "start_date = int(datetime.strptime('2021-09-11', '%Y-%m-%d').timestamp())\n", "end_date = int(datetime.strptime('2021-09-25', '%Y-%m-%d').timestamp())\n", "\n", "\n", "def get_posts(subreddit, before = end_date, after = start_date, result = None, min_comments = 20):\n", " params = {'subreddit': subreddit,\n", " 'num_comments': f'>{min_comments}',\n", " 'before': before,\n", " 'size': 500\n", " }\n", " if result == None:\n", " result = []\n", " r = requests.get(endpt, params=params)\n", " print(r.url)\n", " print(datetime.fromtimestamp(before))\n", " for item in r.json()['data']:\n", " created_time = item['created_utc']\n", " if created_time < after: # If we've reached the earliest we want, then return\n", " print(len(result))\n", " return result\n", " else:\n", " try:\n", " result.append((item['title'],item['selftext'], created_time, subreddit))\n", " except KeyError:\n", " print(item)\n", " time.sleep(.5)\n", " return get_posts(subreddit, before = created_time, result = result)\n", "\n", "\n", "sr_data = []\n", "for subreddit in subreddits:\n", " new_data = get_posts(subreddit)\n", " sr_data = sr_data + new_data\n", "sr = pd.DataFrame(sr_data, columns = ['title', 'selftext', 'date', 'subreddit'])\n", "sr.date = pd.to_datetime(sr.date, unit='s')\n", "sr.to_csv('./sr_post_data.csv', index = False)\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "## Code to download and import the file (DO run this code)\n", "sr = pd.read_csv('https://raw.githubusercontent.com/jdfoote/Intro-to-Programming-and-Data-Science/refs/heads/master/resources/data/sr_post_data.csv')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Change the date to a datetime, and put it in the index\n", "sr.index = pd.to_datetime(sr.date)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
titleselftextdatesubreddit
date
2021-09-25 03:59:39FALSE: US records 12,366 deaths due to COVID-1...NaN2021-09-25 03:59:39Coronavirus
2021-09-25 03:55:12Researchers who developed the mRNA technology ...NaN2021-09-25 03:55:12Coronavirus
2021-09-25 02:51:33The United States Completes Donation of 3.5 mi...NaN2021-09-25 02:51:33Coronavirus
2021-09-25 02:25:46When will the pandemic end? Models project a d...NaN2021-09-25 02:25:46Coronavirus
2021-09-25 01:55:31Thousands of teachers may be forced out of NYC...NaN2021-09-25 01:55:31Coronavirus
\n", "
" ], "text/plain": [ " title \\\n", "date \n", "2021-09-25 03:59:39 FALSE: US records 12,366 deaths due to COVID-1... \n", "2021-09-25 03:55:12 Researchers who developed the mRNA technology ... \n", "2021-09-25 02:51:33 The United States Completes Donation of 3.5 mi... \n", "2021-09-25 02:25:46 When will the pandemic end? Models project a d... \n", "2021-09-25 01:55:31 Thousands of teachers may be forced out of NYC... \n", "\n", " selftext date subreddit \n", "date \n", "2021-09-25 03:59:39 NaN 2021-09-25 03:59:39 Coronavirus \n", "2021-09-25 03:55:12 NaN 2021-09-25 03:55:12 Coronavirus \n", "2021-09-25 02:51:33 NaN 2021-09-25 02:51:33 Coronavirus \n", "2021-09-25 02:25:46 NaN 2021-09-25 02:25:46 Coronavirus \n", "2021-09-25 01:55:31 NaN 2021-09-25 01:55:31 Coronavirus " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sr.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summarization\n", "\n", "There are some simple ways to summarize text data that can be useful, without using any special NLP tools.\n", "\n", "\n", "For example, it can be very interesting to see how the frequency of a term changes over time:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAHRCAYAAABAeELJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACaDklEQVR4nOzdd3iTZdvH8W+S7k2B7tKy994FBWSJD6PiBgXcKA7ALY+KCxQVeRTF8YqgiDiYoiDIFMqGsjctLd2L7p37/SM0tMwWktxJen6Oo8chWfePWtIz1zgvjaIoCkIIIYQQVkSrdgAhhBBCiEtJgSKEEEIIqyMFihBCCCGsjhQoQgghhLA6UqAIIYQQwupIgSKEEEIIqyMFihBCCCGsjhQoQgghhLA6DmoHuJRerycxMRFPT080Go3acYQQQghRDYqikJubS1BQEFrtzY9/WF2BkpiYSGhoqNoxhBBCCHED4uPjCQkJuenXsboCxdPTEzD8Bb28vFROI4QQQojqyMnJITQ01Ph7/GZZXYFSMa3j5eUlBYoQQghhY0y1PEMWyQohhBDC6kiBIoQQQgirIwWKEEIIIayO1a1BqQ5FUSgrK6O8vFztKEJlOp0OBwcH2ZIuhBB2xuYKlJKSEpKSkigoKFA7irASbm5uBAYG4uTkpHYUIYQQJmJTBYperycmJgadTkdQUBBOTk7yybkWUxSFkpIS0tLSiImJoWnTpiZpDiSEEEJ9NlWglJSUoNfrCQ0Nxc3NTe04wgq4urri6OjI2bNnKSkpwcXFRe1IQgghTMAmP27Kp2RRmfw8CCGE/ZF3diGEEEJYHSlQhBBCCGF1pEARQgghhNWRAsXCkpOTefbZZ2nUqBHOzs6EhoYybNgw1q1bZ3xMVFQUd9xxB3Xq1MHFxYW2bdvyySefGPu+LF68GJ1OR1xc3BWv0aJFC5577jkA+vbty8SJE4339e3bF41Gg0ajwdnZmeDgYIYNG8aSJUuqlf/555+nc+fOODs706FDhys+5tdff6VDhw64ubkRFhbGRx99VK3XFkIIISpIgWJBsbGxdO7cmfXr1zNjxgwOHjzI6tWr6devHxMmTABg6dKl9OnTh5CQEDZs2MCxY8d4/vnnef/997n//vtRFIXhw4dTt25d5s+ff9k1tm7dyvHjx3n00UevmuPxxx8nKSmJU6dOsXjxYlq1asX999/PE088cd2/g6IoPPLII9x3331XvH/VqlWMHj2a8ePHc+jQIb788ktmzpzJ7Nmzq/ldujGl5aVsjN+IoihmvY4QonYrKS/h1+O/cvr8abWj2D/FymRnZyuAkp2dfdl9hYWFypEjR5TCwkLjbXq9XskvLlXlS6/X1+jvNmTIECU4OFjJy8u77L6srCwlLy9PqVu3rjJy5MjL7l+xYoUCKIsWLVIURVEmT56sNGrU6LIMjzzyiNK5c2fjn/v06aM8//zzV/1zhblz5yqAsnbt2mr9Xd566y2lffv2l93+wAMPKHfffXeV2z799FMlJCSkxt+v6iooKFA27N6gDFw4UPk75m+zXEMIIRRFUT7a+ZHSZl4bpcMPHZQv9n2hFJcVqx3Jalzr9/eNsKk+KFdSWFpOqzf/VuXaR94ZjJtT9b6FmZmZrF69mvfffx93d/fL7vfx8WHp0qVkZGTw4osvXnb/sGHDaNasGT///DP33Xcfjz76KDNnzmTTpk307dsXgPz8fH799VdmzJhR47/L2LFjeeGFF1iyZAkDBgyo8fMrFBcXX9ajxtXVlXPnznH27FnCw8Nv+LWvpqS8hHK9Yfrr+0PfMzBsoDTwE0KYXGpBKouOLwKgTF/GnP1zWBO7hrd7vU37+u1VTmd/ZIrHQk6dOoWiKLRo0eKqjzlx4gQALVu2vOL9LVq0MD6mVatWdO/ene+//954/6+//kp5eTkPPPBAjfNptVqaNWtGbGxsjZ9b2eDBg1myZAnr1q1Dr9dz4sQJZs2aBUBSUtJNvfbVFJRdPPbgUMYhdiXvMst1hBC127cHvqW4vJiOfh35qM9H+Lr4cjr7NA/99RAf7vyQglI5gsWUbH4ExdVRx5F3Bqt27epSLqyNqM4ne+Uq6ygURany/EcffZSJEycye/ZsPD09mTt3LiNHjsTHx6faua72+kOGDOHff/8FICwsjMOHD1frNR5//HFOnz7N0KFDKS0txcvLi+eff56pU6ei01X/+1UTFQWKh5MHlMDcQ3PpFtjNLNcSQtROiXmJ/H7ydwCe7fgsXQO60iOgBx/t/ogVp1ew4OgCNsRv4M2ebxIRFKFyWvtg8yMoGo0GNycHVb5qMo3QtGlTNBoNR48evepjmjVrBnDVxxw7doymTZsa/3z//fej0Wj45ZdfOHXqFFu2bLnm4thrKS8v5+TJkzRs2BCA//u//yM6Opro6Gj++uuvar+ORqPhww8/JC8vj7Nnz5KcnEy3boZiwRzTO3pFT2FpIWB409BqtGxN3MqxzGMmv5YQovb6+sDXlOnL6B7Yna4BXQHwcfHh/d7v89WArwhyDyIhL4En1z7Jf7f8l+zibJUT2z6bL1Bsha+vL4MHD+aLL74gPz//svvPnz/PoEGD8PX15ZNPPrns/hUrVnDy5Mkq0zeenp7cc889fP/998ydO5dGjRoZ16PU1Pz588nKyuKuu+4CIDg4mCZNmtCkSRPCwsJq/Ho6nY7g4GCcnJz4+eef6dmzJ35+fjeU7VoKSgtQUNBqtPQI7MGgsEGAYS2KEEKYwtmcsyw/tRyAZzo8c9n9vYJ7sXTEUka3HI0GDctPL2fEshGsPbvW0lHtihQoFvTll19SXl5Ot27dWLx4MSdPnuTo0aN89tln9OzZE3d3d77++muWL1/OE088wYEDB4iNjeW7775j3Lhx3H333dx7771VXvPRRx8lKiqKOXPm8Mgjj1RrVKegoIDk5GTOnTvHjh07eOWVVxg/fjxPPfUU/fr1u+ZzT506RXR0NMnJyRQWFhpHWUpKSgBIT0/nq6++4tixY0RHR/P888/z22+/GdehmFp+qaHYc9Y5o9FoeKTNIwD8Hfs3CXkJZrmmEKJ2mbN/DuVKObeG3EoHvw5XfIyboxuvdnuVH4b8QCPvRmQUZTB542QmbphIWkGaZQPbC5PsBTKhmm4ztjWJiYnKhAkTlLCwMMXJyUkJDg5Whg8frmzYsMH4mM2bNyu333674u3trTg5OSmtWrVSPv74Y6WsrOyKr9m8eXNFq9Uq8fHxl913pW3GgAIoTk5OSmBgoDJ06FBlyZIl1cpf+fmVv2JiYhRFUZS0tDSlR48eiru7u+Lm5qb0799f2b59e7W/PzV1KuuUciDxgLJ7/27jz8Xjfz+utJnXRnl/+/tmu64QonY4mXlSaTuvrdJmXhvlcPrhaj2nuKxY+Xzv50qH+R2UNvPaKD1/6qksPrHYbK0WrIWptxlrFMW6Olvl5OTg7e1NdnY2Xl5eVe4rKioiJiaGhg0b4uLiolJCYS3K9GUczzyOvlSPJktDk0ZNcHFxYVviNp5Y+wQuOhf+vvtvfF181Y4qhLBRkzdOZu3ZtQwMG8jMvjNr9NzjmceZGjWVQxmHAOge0J23er5FqFeoOaKq7lq/v2+ETPEIm1UxveOkc0KnubhDqEdgD1r6tqSovIhFxxapFU8IYeOOZBxh7dm1aNDwdPuna/z85r7NWXDHAl7s8iIuOhd2JO9g5IqRzD8839i7SVydFCjCZuWV5AHg5lC1MZxGo+GRtoa1KAuPLZTeBEKIG/JF9BcA3NHoDprUaXJDr6HT6hjbeixLhi+he0B3isqL+Hj3xzz414OcyDphyrh2RwoUYZMURSGv9MoFCsDABgMJ9QwluzibpaeWWjqeEMLGRadGs/ncZnQaHU+1f+qmXy/UK5RvB33L2xFv4+noyaGMQ9z3x33M3jebkvISEyS2P1KgCJtUXF5Mmb4MjUaDq6PrZffrtDrGtR4HwPzD8ynVl1o4oRDCls2ONhxwOqLJCMK8at5q4Uo0Gg0jm45kWeQy+jfoT5lSxtcHvuaeP+4hOjXaJNewJ1KgCJtUsf7E3dEdrebKP8bDGw/H18WXpPwk/o5V57wmIYTt2Zm0kx1JO3DQOvBkuydN/vp+bn7M6jeLmX1nUtelLmeyzzBm1Rim75guU9KVSIEibFLF9I674+UHL1ZwcXBhdMvRgKFxm5VtWBNCWCFFUYyjJ3c1vYsgjyCzXWtg2ECWRy4nskkkCgoLjy3kzuV3sjVhq9muaUukQBE2R6/ojSMoHo4e13zsfc3vw83BjRNZJ9iSsMUS8YQQNmxr4lb2pe7DWefME+2eMPv1vJ29ebfXu3w94GuCPYJJzE9k/D/jmbJlCueLzpv9+tZMChRhcwpKC1AUBQetA84652s+1tvZm7ub3Q0YDhEUQoirURSFz/d9Dhg+3Pi5mf54jquJCI5gyfAlPNjyQTRoWHF6BSOWj2B17OpaO/orBYowqfDwcLO1ta9Qef1JdVr7P9TqIRw0DuxO2c2BtANmzSaEsF3r49dzJOMIrg6uxmMzLMnN0Y1Xur3Cj3f8SGPvxmQWZfLSppd4bsNzpOSnWDyP2qRAsbDk5GSeffZZGjVqhLOzM6GhoQwbNox169apHc0kdu3axRNPmHdYtGL9yfWmdyoEuAdwR6M7ADlEUAhxZXpFz+x9hrUnD7Z8kLqudVXL0r5+e34d9itPtX8KB60DG+M3Erk8kt9O/IZe0auWy9KkQLGg2NhYOnfuzPr165kxYwYHDx5k9erV9OvXjwkTJtzQa5aWWtf22fr16+Pmdnlfkgo3m7dMX0ZRWREA7k5XXyB7qYpPQ+vi1hGTHXNTGYQQ9ufv2L85df4Uno6ejG09Vu04OOmceLrD0/w69Ffa1mtLXmke72x7h8fWPEZcTpza8SxCChQLevrpp9FoNOzcuZO7776bZs2a0bp1ayZPnsz27dsBiIuLY8SIEXh4eODl5cW9995LSsrFob2pU6fSoUMH5s6daxyFURSl2s/78ccfCQ8Px9vbm/vvv5/c3FzjY1avXk3v3r3x8fGhbt26DB06lNOnTxvv79mzJ6+++mqVv1NaWhqOjo5s2LABuHyKR6PR8NVXXzFixAjc3d157733mDdvHj4+PlVeZ9myZVWma/bv30+/fv3w9PTEy8uLzp07s3v3buP0jouDC45ax2p/7xv7NKZvSF8UFOYfnl/t5wkh7F+Zvowvo78EYEzrMXg7e6uc6KKmdZry45Afebnry7g6uLIreRcjV4zk+0PfU6YvUzueWdl+gaIoUJKvzlcNFi5lZmayevVqJkyYgLv75Z/8fXx8UBSFyMhIMjMz2bRpE2vXruX06dPcd999VR576tQpfv31VxYvXkx0dDRAtZ53+vRpli1bxsqVK1m5ciWbNm3igw8+MN6fn5/P5MmT2bVrF+vWrUOr1XLnnXei1xuGFEePHs3PP/9cZcHWL7/8gr+/P3369Lnq3/2tt95ixIgRHDx4kEceqd687ujRowkJCWHXrl3s2bOHV199FUdHR2N7+2ttL76aivb3K06vkOPPhRBGK8+sJDYnFh9nHx5s+aDacS6j0+p4qNVDLBm+hB6BPSguL2bmnpmM/ms0xzOPqx3PbBzUDnDTSgtgmvn2qV/T64lQzWmGU6dOoSgKLVq0uOpj/vnnHw4cOEBMTAyhoYbTLn/88Udat27Nrl276Nq1KwAlJSX8+OOP1K9fH4C1a9dW63l6vZ558+bh6ekJwEMPPcS6det4//33Abjrrruq5Pnuu+/w8/PjyJEjtGnThvvuu49JkyaxZcsWbrnlFgAWLlzIqFGj0GqvXuuOGjWq2oVJhbi4OF566SXj96tp06YoimI8u6K6608q6+jXkQ71OxCdFs2CowuY1HlSjV9DCGFfSstL+Wr/V4BhKtjDqebvLZYS4hnCNwO/YdmpZXy0+yOOZBzh/pX381yn53i4zcNqxzM52x9BsREVow7X2nVy9OhRQkNDjUUGQKtWrfDx8eHo0aPG28LCwozFSU2eFx4ebixOAAIDA0lNTTX++fTp04waNYpGjRrh5eVFw4YNAUOxAIb1JQMHDuSnn34CICYmhm3btjF69Ohr/t27dOlyzfuvZPLkyTz22GMMGDCADz74gNOnT1dpb+/mePV1LtdSsRbl1+O/kluSe51HCyHs3dJTS0nIS6CuS13ub3G/2nGuS6PRcGfTO1kRuYKBYQMpU8r4dM+npBemqx3N5Gx/BMXRzTCSoda1q6lp06ZoNBqOHj1KZGTkFR+jKMoVC5hLb790iqi6z3N0rLpmQ6PRGKdvAIYNG0ZoaCjffvstQUFB6PV62rRpQ0nJxYOsRo8ezfPPP8/nn3/OwoULad26Ne3bt7/m3/3SvFqt9rJ9/Zcunp06dSqjRo3izz//ZNWqVbz11lt8M/8bugzocs329tfTJ7QPjb0bczr7NL+d+E2VrYRCCOtQVFbE1/u/BuDxdo/j6nD5uV7Wqp5rPWb2ncnti28nIS+BuJw46rnWUzuWSdn+CIpGY5hmUeOrGj04Kvj6+jJ48GC++OIL8vPzL7v//PnztGrViri4OOLj4423HzlyhOzsbFq2bHnV177R51WWkZHB0aNH+e9//0v//v1p2bIlWVlZlz0uMjKSoqIiVq9ezcKFC3nwwZrP19avX5/c3Nwq34eKtTSVNWvWjEmTJrFmzRpGjhzJgh8WADe2/qSCVqNlXJtxACw4skBOERWiFvvtxG+kFqYS4B7APc3uUTvODQnxDAHgXN45lZOYnu0XKDbkyy+/pLy8nG7durF48WJOnjzJ0aNH+eyzz+jZsycDBgygXbt2jB49mr1797Jz507GjBlDnz59rjlNcqPPq6xOnTrUrVuXb775hlOnTrF+/XomT5582ePc3d0ZMWIEb7zxBkePHmXUqFE1/j50794dNzc3Xn/9dU6dOsXChQuZN2+e8f7CwkKeeeYZNm7cyNmzZ9m6dSu7du2iQZMGwI2tP6nsPw3/g5+bH2mFaaw8s/KmXksIYZsKSgv4v4P/B8CT7Z7ESeekcqIbE+JxoUDJlQJF3ISGDRuyd+9e+vXrxwsvvECbNm0YOHAg69atY86cOWg0GpYtW0adOnW49dZbGTBgAI0aNeKXX3655uve6PMq02q1LFq0iD179tCmTRsmTZrERx99dMXHjh49mv3793PLLbfQoEGDGn0PwDCatGDBAv766y/atm3Lzz//zNSpU43363Q6MjIyGDNmDM2aNePee+9lwKABTHh5QrXa21+Po86RMa3GAIbGbbWp8ZEQwuDnYz+TWZRJiEcII5qMUDvODTOOoNhhgaJRrKzJf05ODt7e3mRnZ+Pl5VXlvqKiImJiYmjYsCEuLi4qJRRqSMlPIb0wHR9nH4I9g6vcdyM/F/ml+Qz8fSC5JbnM6juL/mH9zRFbCGGFcktyuX3x7eSU5DCt9zSGNR6mdqQbtjp2NS9teomOfh35YcgPqma51u/vGyEjKMImVLS3r0n32Gtxd3Tn/uaGFftzD82ttYdxCVEbLTiygJySHBp6N+SOhneoHeemhHoYdm/a4wiKFCjC6lVpb38TC2QvNarlKJy0ThxIP8CelD0me11rUlRWxPi143n070cp1VvXsQhCqOF80Xl+OGIYaZjQYQI6rU7lRDenYoonrTCNwrJCldOYlhQowupVjJ7UtL399dRzrWece557aK7JXteaTN85na2JW9mZvFNOchYCmHd4HnmleTSv05yBYQPVjnPTvJy88HQ09LdKzFOp5YaZSIEirF5+iWE7silHTyqMaz0OrUbLvwn/GrvU2oslJ5ew5OQS45+jEqNUTCOE+tIL01l4bCEAz3R85ob7KVkTjUZjXJdnb9M8tv9/R9g1RVGMIyg3u734Shp4NWBAgwGAYUePvTiacZT3txuOMGhTtw0A2xK3qRlJCNV9d/A7CssKaVuvLX1Crn5+mK0xbjW2s14oN1WgTJ8+HY1Gw8SJE423KYrC1KlTCQoKwtXVlb59+3L48OGbzSlqKVO0t7+eim6yq2JW2cUQaXZxNpM2TqJEX8KtIbfyab9PATiUfojs4myV0wmhjuT8ZH49/itgGD251rEjtsZetxrfcIGya9cuvvnmG9q1a1fl9hkzZjBz5kxmz57Nrl27CAgIYODAgeTmyrknouaMu3duor399bSu15ruAd0pV8r58ciPZrmGpegVPVO2TCEhL4Fgj2Cm9Z5GgHsATXyaoKCwI2mH2hGFUMW3B76lRF9CZ//O9AzsqXYck7LXZm039I6fl5fH6NGj+fbbb6lTp47xdkVRmDVrFlOmTGHkyJG0adOG+fPnU1BQwMKFC00WWtQe+aXmW39SWcUoyuKTizlfdN6s1zKn7w5+x6Zzm3DSOjGz70y8nb0B6BlkeEOWdSiiNjqXe864HuuZDvY1egL22+7+hgqUCRMm8J///IcBAwZUuT0mJobk5GQGDRpkvM3Z2Zk+ffoQFSVvjKJm9IreWKCYY/1JZT2DetLStyWFZYX8fPxns17LXLYlbmN29GwApvSYQqu6rYz3RQRFGB8jPV9EbfPV/q8oU8qICIqgS0DNT1e3dpWneOzp33eNC5RFixaxd+9epk+fftl9ycnJAPj7+1e53d/f33jfpYqLi8nJyanyJQQYzspQFMUk7e2vR6PR8HCbhwH4+ejPNtdPIDk/mVc2v4Je0XNnkzsZ2XRklfs7+3fGUetIYn4iZ3POqpRSCMuLyY7hjzN/AIbRE3sU5B6EBg1F5UVkFGWoHcdkalSgxMfH8/zzz7NgwYJrthS/dPhMUZSrDqlNnz4db29v41doaGhNItkEjUZzza9x48apHdEqVd69Y4kh2YFhAwn2CCarOItlp5aZ/XqmUlpeygubXiCrOIsWvi14vfvrlz3G1cGVTn6dAJnmEbXLnOg56BU9fUP70rZ+W7XjmIWjzpEA9wDAvtah1KhA2bNnD6mpqXTu3BkHBwccHBzYtGkTn332GQ4ODsaRk0tHS1JTUy8bVanw2muvkZ2dbfyKj4+/wb+K9UpKSjJ+zZo1Cy8vryq3/e9//6vy+NJS6fgJldafmKi9/fU4aB0Y23osAPMPz6dMX2aR696sj3d/zIG0A3g6eTKz70xcHK784aFiHYpsNxa1xfHM46yKXQXY7+hJBXtch1KjAqV///4cPHiQ6Oho41eXLl0YPXo00dHRNGrUiICAANauXWt8TklJCZs2bSIiIuKKr+ns7IyXl1eVL3sTEBBg/PL29kaj0Rj/XFRUhI+PD7/++it9+/bFxcWFBQsWMHXqVDp06FDldWbNmkV4eLjxz+PGjSMyMpJp06bh7++Pj48Pb7/9NmVlZbz00kv4+voSEhLC3LkXu6TGxsai0WhYtGgRERERuLi40Lp1azZu3GiZb0Y1mau9/fVENomkjnMdEvISWBO7xmLXvVF/nfnL2HhqWu9phHpefQSyYh3KzuSdlJZLESzs35fRXwIwOHwwzX2bq5zGvOxxJ49DTR7s6elJmzZtqtzm7u5O3bp1jbdPnDiRadOm0bRpU5o2bcq0adNwc3Nj1KhRpktdiaIoqq0XcHVwNdnUwyuvvMInn3zC999/j7OzM9988021nrd+/XpCQkLYvHkzW7du5dFHH2Xbtm3ceuut7Nixg19++YXx48czcODAKtNnL730ErNmzaJVq1bMnDmT4cOHExMTQ926dU3y97lZ5mpvfz2uDq6MajmKL6K/YO6huQxpOMRqV/yfyjrF1G1TAXi87eP0De17zcc3922Or4svmUWZ7E/bb5eLBYWocDj9MOvj16PVaHm6/dNqxzE7e+yFUqMCpTpefvllCgsLefrpp8nKyqJ79+6sWbMGT09PU18KgMKyQrov7G6W176eHaN2mKx52MSJExk5cuT1H3gJX19fPvvsM7RaLc2bN2fGjBkUFBTw+uuGdQivvfYaH3zwAVu3buX+++83Pu+ZZ57hrrvuAmDOnDmsXr2a7777jpdfftkkf5+bZc729tfzQIsHmHtoLsezjrMtcRsRwVce/VNTfmk+kzZOMvz8B3ZnQocJ132OVqOlR2AP/or5i21J26RAEXbt8+jPAfhPw//QyKeRymnMzx67yd5056uNGzcya9Ys4581Gg1Tp04lKSmJoqIiNm3adNmoi7hcly439suidevWaLUX/zf6+/vTtu3FhWA6nY66deuSmppa5Xk9e15sVOTg4ECXLl04evToDWUwNXO3t78eb2dv7mpqKN6s8RBBRVF4K+otYnNi8XPz48NbPqz2iayVtxsLYa/2puxla8JWdBodT7V/Su04FiEjKFbI1cGVHaPU6Y7p6uBqstdyd686UqDVai/bz36lxbOOjlWnPzQazRVv0+v1181gLVMZlmhvfz1jWo1h0bFF7EjeweH0w7Su11qVHFfy09Gf+Dv2bxw0DnzS5xPqulZ/Wq5ioWxF2/uKRm5C2AtFUfh8n2H0JLJJJKFe9rcz9EoqCpTUglSKy4vN3prBEmz+sMCKX2JqfJnzF3r9+vVJTk6uUqRER0eb7PW3b99u/O+ysjL27NlDixYtTPb6N8MS7e2vJ9AjkCENhwDw3aHvVMlwJftS9/HJ7k8AeLHri3Tw61Cj5/u5+Rnb3m9P2n79JwhhY3Yk72B3ym4ctY482e5JteNYTB3nOrg5uKGg2MWZYmAHBYq96tu3L2lpacyYMYPTp0/zxRdfsGrVKpO9/hdffMHSpUs5duwYEyZMICsri0ceecRkr38zLNXe/nrGtRkHwD9n/yEuJ07VLGA4Kv7FjS9SppQxJHwIo1rc2MJz2W4s7FXl0ZN7mt1DoEegyoksR6PREOwZDNjPNI8UKFaqZcuWfPnll3zxxRe0b9+enTt38uKLL5rs9T/44AM+/PBD2rdvz7///svy5cupV6+eyV7/Rlmyvf31NKvTjFuCb0FBYd7heapmKdOX8crmV0gtTKWRdyOmRky94RG8inUoUYlRdtUWW4h/E/7lQNoBXHQuPNb2MbXjWJy9LZS1+TUotmbcuHFVOseGh4df9ZfE+PHjGT9+fJXbKnbnAMybN++y51ypn0lsbOxlt7Vs2bLKNI+1sGR7++p4pM0j/JvwL8tPLefpDk9Tz1WdIm72vtnsTN6Jm4Mbn/b79KbW5lS0vU/KTyI2J5aG3g1NmFQIdegVPbP3Gc6ieqDFA9R3q69yIsuzt4WyMoIirIql29tfT2f/zrSr344SfQk/Hf1JlQzr49Yb18G83ettGnnf3JZJVwdXOvkb2t7LNI+wF+vi1nE08yhuDm7Gc7VqG3tr1iYFirAqlm5vfz0ajYZH2hjW5vxy7BdjPkuJy4njv1v+C8CDLR/k9vDbTfK6st1Y2JNyfTlf7PsCgIdaPUQdlzoqJ1KHvbW7lwKllqmYUrq0jb41KNWXGtvbq73+pLJ+of0I9wontzSX30/8brHrFpYVMmnjJHJLc+no15HJXSab7LWl7b2wJ6tiV3E6+zSeTp6MaT1G7TiqqTzFYw/ry6RAEVajYnTCxcEFB631LI/SarTGIeMfjvxgkV/oiqLw3vb3OJF1Al8XXz669SOTtvxvVqcZvi6+FJQVsD9tv8leVwhLK9WXMid6DgAPt34YLyf7O8+tuoI9DLt4CsoKyCrOUjnNzZMCRVgNNdvbX8/QRkPxc/UjtSCVlWdWmv16i08uZsXpFWg1Wj669SP83a98GviNqmh7D4bdPELYqj9O/0Fcbhx1nOswuuVoteOoylnnjJ+bHwAJuQkqp7l5Nlmg2MPQlajqZtrbW+LnwUnnxIOtHgTg+8Pfo1eu35n3Rh1OP8y0HdMAeK7jc3QL7GaW68g6FGHrSspL+Gr/VwA82vZR1TpPWxN72mpsUwVKRQv3goIClZMIU7uZ9vYVPw+Xtvg3tXua3YOHowcx2TFsit9klmtkF2czeeNkSvWl9AvtZ1ygaw4VDdsOZxzmfNF5s11HCHNZfHIxSflJ1Hetz33N71M7jlWwp63G1jPRXw06nQ4fHx/jwXdubuZtNy8sJ6soC32pHjdHN0qKS6r1HEVRKCgoIDU1FR8fH3S66h2Yd6M8nDy4t/m9zD00l7mH5tKvQT+Tvr5e0fPqv6+SmJ9IqGco7/V+z6w/3xVt70+dP8X25O0m2yEkhCUUlhXyzYFvAHii3RO4OLionMg62NNOHpsqUAACAgIALjudV9i2jMIMisuL8XL2osSxegVKBR8fH+PPhbk92PJBfjzyI9Fp0exN2WvsJ2IK3xz4hi0JW3DWOfNp308tstgvIijCUKAkSoEibMuvx38lvTCdIPcgRjYdqXYcq2FPvVBsrkDRaDQEBgbi5+d3xdN9he0pKS/hxT9fpLS8lM9v+5ww77BqP9fR0dHsIyeV1Xerz/DGw1l8cjFzD801WYESlRjFl9FfAvDfHv+luW9zk7zu9UQERfDDkR+Mbe9lRFLYgvzSfL47aGheOL79eJx0Tionsh6hnobTm6VAUZFOp7PoLyZhPvsS9xFXGIefqx/N/JpZ/S/Jca3HseTkEjad28SprFM0qdPkpl4vKS+JVza/goLCXU3vIrJJpGmCVkMn/044aZ2k7b2wKQuPLiSrOIsGng0Y1niY2nGsSsUUT3JBMqXlpTjqzLs2z5xsapGssE8Vu0h6BvW0+uIEINw7nAFhAwDDjp6bUVJewgubXuB88Xla+rbkte6vmSJitVVuey/bjYUtyCnJMf67e7rD01bVM8ka1HWpi4vOBb2iJyk/Se04N0UKFKG6bUkXCxRb8XBrQ+O2v878RXJ+8g2/zke7PuJg+kG8nLyY2XemKgckVnzfZbuxsAU/HP6B3JJcmvg0kXVTV6DRaOxmJ48UKEJV6YXpHMs8BmBsHGYL2tZvS9eArpQpZfxw5Icbeo2VZ1ay6PgiAKbfMt34pmJp0vZe2Iqsoix+PPIjABM6TECnlWn+K6noKGvrO3mkQBGq2p60HYCWvi2p61pX5TQ1U9Gj5PcTv5NdnF2j557MOsk7294B4Ml2T3JryK0mz1ddFW3vC8sKiU6LVi2HENfz/aHvKSgroKVvS/o36K92HKslIyhCmEDl9Se2pldQL5rVaUZhWSG/HP+l2s/LK8lj8sbJFJYV0jOwJ0+1f8qMKa9Pq9HKNI+wemkFafx87GcAnun4jE2sV1OLvXSTlQJFqEZRFOPCzIppBlui0WiMhwj+dPQn40nM16IoCm9GvUlsTiwB7gF8eOuHVjFMLW3vhbX7v4P/R1F5Ee3rt+eW4FvUjmPVZARFiJt08vxJ0gvTcdG50NGvo9pxbsjt4bcT5B5EZlEmy08tv+7jfzjyA2vPrsVB68AnfT6hjksdC6S8vp6B0vZeWK+kvCR+O/EbAM92fFZGT66jYgQlPjfeps+ukwJFqKbi03qXgC4222jJQevAmNZjAJh3eB7l+vKrPnZPyh4+3fMpAK90fYV29dtZJGN11HerT9M6TVFQ2J68Xe04QhidPn+aqdumUqovpVtAN7oHdlc7ktUL9jQsks0rzSOnJEflNDdOChShmooCxRandyq7s8md+Dj7cC7vHGvj1l7xMemF6by46UXKlXL+0+g/VnmwWcUoikzzCLXpFT0b4zfy+JrHiVweSVRiFDqNjmc7Pqt2NJvg6uBKPdd6gG2vQ5ECRaiiuLyY3Sm7gYu/GG2Vm6Mbo1qMAmDuwbmXDamW6ct4cdOLpBem08SnCW/2eNMqh6grCsWKtvdCWFpuSS4/HvmRoUuH8uz6Z9metB2tRkv/Bv2Zd/s8Ovh1UDuizbCHM3mkBZ9Qxd6UvRSXF+Pn6kdjn8Zqx7lp97e4n7mH5nI08yjbk7ZX2ZX02d7P2JOyB3dHd2b2nYmbo5uKSa+uou19cn4yMTkxNPJupHYkUUvEZMfw87GfWX5qOQVlBQB4Onlyd9O7ua/Ffca+HqL6QjxDiE6LlgJFiJqytfb211PHpQ4jm45k4bGFfH/oe2OB8s/Zf4xtud/t9a5Vn3VT0fZ+e9J2tiVukwJFmJVe0ROVGMWCowvYmrDVeHtj78aMajmKoY2GWm0xbwuMO3lseIpHChShClveXnw1Y1qP4Zfjv7AtaRtHMo7g7ujOG1vfAGBsq7EMDBuocsLriwiKMBYoo1uOVjuOsEP5pfmsOL2ChUcXEpsTC4AGDX1C+jCq5Sh6BPawiw8tapMpHiFuQHphOsezjgPQI8h22ttfT7BHMLc3vJ0/z/zJV/u/4lzeOfJK8+jk14nnOz+vdrxqiQiKYOaemca297Z8EqqwLvE58fx8/GeWnlxKXmkeAB6OHkQ2iWRUi1GEeoWqnNC+2EMvFClQhMVVTO+09G2Jr4uvymlM6+HWD/PnmT/ZEL8BMJws+nGfj3HU2sYv+qZ1mlLXpS4ZRRlEp0XTNaCr2pGEDVMUhR3JO/jpyE9sOrcJBcPi63CvcEa1HMXwxsNxd3RXOaV9qhhBScpPokxfZpOnPtteYmHzKs7fsafpnQrNfZvTK7gXWxO2otPo+LjPx9R3q692rGqraHu/8sxKtiVukwJF3JCC0gJWnlnJwqMLOZ192nh77+DejG45moigCLQa2URqTvXd6uOkdaJEX0JyfrJqh5HeDClQhEVVbm9vi+fvVMfEThNJyE1gTOsxdAnoonacGqsoUKISo3iu03NqxxE2JDEvkUXHFrH45GJjgzBXB1cim0TyQIsHrHqRuL3RarQEewYTkx3DubxzUqAIcT320N7+elr4tuCPO/9QO8YNq+hLcyTjCFlFWVbTjl9YJ0VR2J2ym4VHF7I+fj16RQ8YphhGtRxFZJNIPJ08VU5ZOwV7XChQcs9BoNppak4KFGFR9tDe3t5VtL0/mXWSHUk7uL3h7WpHElaoqKyIVTGr+OnoT8ZF7wA9AnswuuVobgm+xSoOwqzNbH0njxQowqLscXuxPYoIjOBk1kmiEqOkQBFVJOcn88vxX/j9xO+cLz4PgIvOhWGNhzGqxSia1GmibkBhZOu9UKRAERZTVFbEnpQ9gBQo1i4iKIL5R+azLWkbiqJIX4paTlEU9qftZ8HRBfxz9h/KFcOhmEHuQTzQ4gHubHon3s7eKqcUl7L1rcZSoAiL2Zt6ob29m590KbVy0vZeAJSUl7A6djU/Hf2JIxlHjLd3DejK6Baj6RPaxya3r9YWxikeGUER4tq2J17cXiyfyK2bi4MLnf07sy1pm7S9r4UURWHuobn8cOQHMosyAXDWOfOfRv9hVItRNPdtrnJCUR0VIyjZxdnkluTa3GJl2YguLEbWn9iWim3gFf/fRO3xT9w/zNo7i8yiTPzc/Hi+0/OsvXstb0e8LcWJDXF3dDc2w0zIS1A5Tc1JgSIsonJ7++6B3VVOI6qjopDclbyLkvISldMIS1oVswqAu5rexeq7VvNY28dku7mNsuWdPFKgCIuw5/b29qqi7X1hWSH70/arHUdYSEFpAVsStgBwT7N7bOaYBnFlwZ7BgBQoQlxVRYEi0zu2o6LtPcg0T22yJWELhWWFBHsE06puK7XjiJtkywtlpUARZle5vb0UKLal4v+XFCi1x5qzawAYFDZIFrPbgVBPwynRMoIixBWcyDpBRlEGrg6udPDroHYcUQM9AnsAcDTjKFlFWSqnEeZWWFbI5nObARgUPkjlNMIUbLlZmxQowuwqTi/u4i/t7W1Nfbf6NKvTDAWFHUk71I4jzKzy9E7ruq3VjiNMoGKKJyEvgXJ9ucppakYKFGF2Mr1j22Sap/ZYE2uY3hkYNlCmd+yEn5sfDloHyvRlpBakqh2nRqRAEWZVub19xYJLYVsqTjeOSoxCURSV0whzKSorYtO5TYBh/YmwDzqtjmCPCzt5bGyaRwoUYVbS3t72VbS9TylIISY7Ru04wky2JmylsKyQQPdA2tRro3YcYUK22gtFChRhVpW3F8uQsW2qaHsPMs1jz/4++zcg0zv2qGIEJT43XuUkNSMFijArWX9iH2Qdin0rKitiU/yF6R3ZvWN3bHUnjxQowmzSC9M5kXUCDRrjdlVhmyrWD+1O2S1t7+3Q1sStFJQVEOAeQLt67dSOI0ysokBJyLWt83ikQBFmY2xvX7elnONh45rVaSZt7+2Y7N6xb7baTVYKFGE20t7efmg0GpnmsVPF5cWye8fOVYygZBZlUlBaoHKa6pMCRZiFtLe3P3Iuj32KSogivzQfPzc/2tWX6R175OnkibezN2BboyhSoAizqNzevn399mrHESZQue19ZlGmymmEqVQ+e0erkV8J9soWtxrLT6Mwi4rpHWlvbz+k7b39KSkvYWP8RkB279g7404eKVBEbSfTO/ZJ1qHYl6jEKPJK8/Bz85ORTjtniwtlpUARJle5vb0UKPal8joUaXtv+yrv3pHpHfsmIyhCYGhvX6Ivwd/Nn4beDdWOI0yok18nnHXOpBakStt7G1dlekd279g9W2zWJgWKMDlpb2+/pO29/dietJ3c0lzqu9ang18HteMIM6uY4knITUCv6FVOUz1SoAiTk/Un9k3WodiHv2MNZ+8MCBsg0zu1QIB7ADqNjhJ9CWkFaWrHqRb5qRQmlVaQZmxv3z2wu9pxhBlUbDeWtve2q7S8lA3xGwCZ3qktHLQOBLoHArYzzSMFijCp7UnbAWlvb88qt72PTo1WO464AduStpFbkks913p09OuodhxhIba2UFYKFGFSMr1j/6Ttve2r2L0zoMEAdFqdymmEpQR7BAMygiJqIUVR5PydWkLa3tuu0vJS1sevB6Q5W21j1yMoc+bMoV27dnh5eeHl5UXPnj1ZtWqV8X5FUZg6dSpBQUG4urrSt29fDh8+bPLQwjpJe/vao6JAOZopbe9tzY7kHeSW5FLXpS6d/DqpHUdYkF0XKCEhIXzwwQfs3r2b3bt3c9tttzFixAhjETJjxgxmzpzJ7Nmz2bVrFwEBAQwcOJDc3FyzhBfWpWL0pGtAV2lvb+fqudajeZ3mANL23sYYp3fCZHqntgn1CAXsdIpn2LBh3HHHHTRr1oxmzZrx/vvv4+Hhwfbt21EUhVmzZjFlyhRGjhxJmzZtmD9/PgUFBSxcuNBc+YUVkfUntYusQ7E9pfpK0zuye6fWqRhBSS9Mp7CsUOU013fDa1DKy8tZtGgR+fn59OzZk5iYGJKTkxk06OIPvbOzM3369CEq6upvYMXFxeTk5FT5Erancnv7iuF/Yd96BBm2G0vbe9uxM2kn2cXZ+Lr4GhvuidrDy8kLT0dPABLzElVOc301LlAOHjyIh4cHzs7OjB8/nqVLl9KqVSuSk5MB8Pf3r/J4f39/431XMn36dLy9vY1foaGhNY0krMDelErt7b2kvX1tULnt/ZnsM2rHEdWw5qzs3qnNNBqNTa1DqXGB0rx5c6Kjo9m+fTtPPfUUY8eO5ciRI8b7L21trijKNdudv/baa2RnZxu/4uPjaxpJWIHK0zvS3r52kLb3tqVUX8q6uHWA7N6pzWzpTJ4aFyhOTk40adKELl26MH36dNq3b8///vc/AgICAC4bLUlNTb1sVKUyZ2dn466gii9he6KSZP1JbSTrUGzHruRdMr0jjGfy2OUIyqUURaG4uJiGDRsSEBDA2rVrjfeVlJSwadMmIiLkl5Y9SytI42TWSWlvXwtVrDfanSxt761dxe6d/g3646B1UDmNUIstTfHU6Kf09ddfZ8iQIYSGhpKbm8uiRYvYuHEjq1evRqPRMHHiRKZNm0bTpk1p2rQp06ZNw83NjVGjRpkrv7ACFe3tW9VtJe3ta5mmPk2p51qP9MJ0olOj6RbYTe1I4grK9GWsjzPs3hkYNlDlNEJNxhEUG5jiqVGBkpKSwkMPPURSUhLe3t60a9eO1atXM3Cg4Qf+5ZdfprCwkKeffpqsrCy6d+/OmjVr8PT0NEt4YR1ke3HtVdH2fsXpFUQlRkmBYqV2Je8iqziLOs516BrQVe04QkWVR1Cut0ZUbTUqUL777rtr3q/RaJg6dSpTp069mUzChugVvbFBm2wvrp16BvU0FigTO09UO464gordO7c1uE2md2q5QPdAtBotReVFZBRlUM+1ntqRrkrO4hE35WTWSWN7+w71O6gdR6igR6ChH4q0vbdOZfoy1p2V3TvCwFHnSICbYVOLta9DkQJF3JSK6Z2uAV1x1DmqnEaooXLb++2J21VOIy61J2UPWcVZ+Dj70C1ApuDExWme+FzrbushBYq4KbL+RIBsN7ZmsntHXMpWeqFIgSJuWFFZEXtT9gKy/qS2q/j/vy1xm7S9tyLl+nL+ifsHkN074qJgj2BApniEHatobx/gHiDt7Wu5Tv4X2t4XpnL6/Gm144gL9qTsIbMoE29nb9lhJYxspVmbFCjihkl7e1HBWedMF/8uAGxL2qZyGlHBuHsn9DYctbJGTBjIFI+wexXt7WV6R8DFnwNZh2IdyvXl/HPWML0ju3dEZRUFSlpBGsXlxSqnuTopUMQNSS1INba37xHQQ+04wgpI23vrsjd1LxlFGXg5eckRFKKKOs51cHNwQ0EhMS9R7ThXJQWKqDFFUXh/+/sAtK3fFh8XH3UDCatQ0fa+qLyIfan71I5T61Xs3rmtgUzviKo0Go1NnMkjBYqosXmH57E+fj2OWkde6/aa2nGElahoew8yzaO2yrt3BoXJ9I64nC2cySMFiqiRXcm7mLV3FgCvdnuVNvXaqBtIWJXK242Feval7iO9MB1PJ09jp18hKpMRFGFXUgtSeWnTS+gVPcMbD+eeZveoHUlYmcpt7zMKM1ROU3tV7N7pF9pPOjyLK5ICRdiNUn0pL216iYyiDJrWacp/e/xXthaLy9RzrUcL3xYAbE+Stvdq0Ct64+6dweGDVU4jrJVM8Qi7MWvPLPam7sXD0YNP+36Kq4Or2pGElZJpHnVFp0aTVpiGp6MnPQOlBYC4ssojKNba/VkKFHFda2LX8MORHwB4r/d7hHmFqZxIWLOKhbLS9l4dxumdBjK9I64uyCMIDRoKygrIKs5SO84VSYEirikmO4Y3tr4BwMNtHqZ/g/4qJxLWrqNfR2l7rxK9omdt7FpAdu+Ia3PWOePn5gdY7zoUKVDEVRWUFjBpwyQKygro4t+F5zo+p3YkYQMqt72X7caWtT9tP6mFqXg4ekiHZ3Fd1r5QVgoUcUWKojB121ROZ5+mvmt9PurzkRzVLqrN2PY+SQoUS6poztY3tC9OOieV0whrZ+0LZaVAEVe06PgiVsWsQqfR8XGfj6nnWk/tSMKGVKxD2ZO8x6rP+rAnekVvXH8i0zuiOoI9gwEZQRE25EDaAWbsmgHA5M6T6eTfSeVEwtY08WlCfdf60vbegg6kHSC1IBV3R3cigiPUjiNsgIygCJuSWZTJ5I2TKdOXMTBsIA+1ekjtSMIGaTQa2W5sYRWjJ31D++Ksc1Y5jbAFoZ6hACTkJqic5MqkQBFG5fpyXt38KikFKYR7hfNOxDvSjE3csMrbjYV56RU9a8/K7h1RMxWLZJMLkiktL1U5zeWkQBFGc/bPYVvSNlwdXJnZdyYeTh5qRxI2TNreW87B9IMk5yfj5uBmLAyFuJ66LnVx0bmgV/Qk5SepHecyUqAIADaf28zXB74G4M2eb9K0TlOVEwlbV9e1rrS9t5CK3Tt9Qvvg4uCichphKzQajVVvNZYCRXAu9xyv/fsaAPc3v5+hjYaqnEjYC+N2Y+mHYjaKohindwaHydk7omaseaGsFCi1XHF5MZM3TianJId29drxUteX1I4k7Ii0vTe/Q+mHSMpPws3BjV7BvdSOI2yMjKAIqzV9x3SOZh7Fx9mHT/p+Is2dhEl19OuIi86FtMI0Tp0/pXYcu1Sxe6dPiEzviJozFigygiKsydKTS1l8cjEaNHx464cEuAeoHUnYGWedM50DOgMyzWMOiqIY158MCpfdO6LmjFM8MoIirMWxzGO8v+N9ACZ0mCAr/4XZRARemOZJku3GpnY44zCJ+Ym4OrjSO7i32nGEDaoYQYnPjbe6aVgpUGqhnJIcJm2YRHF5MbcE38Lj7R5XO5KwY9L23nwqRk9uDblVpnfEDQnyCAIgrzSPnJIcldNUJQVKLaNX9Ez5dwrn8s4R7BHM9Fumo9XIj4Ewn8Y+jfFz9ZO29yamKIqcvSNumquDK/Vd6wPWN80jv5lqmbmH5rLx3EactE580vcTvJ291Y4k7JxGo6FHkKFpm6xDMZ0jmUdIyEvA1cGVW0JuUTuOsGHGaZ68eJWTVCUFSi2yI2kHn+/7HIDXu79O67qtVU4kagtpe296FdM7twTfgquDq8pphC2z1oWyUqDUEin5Kby8+WX0ip7IJpGMbDpS7UiiFqloe38s8xjphekqp7F9sntHmJK19kKRAqUWKC0v5YVNL5BZlEnzOs2Z0n2KHAIoLKqua11a+rYEpO29KRzNPMq5vHO46Fy4JVimd8TNCfYIBqyvF4oUKLXAzD0z2Z+2H09HTz7t+6ms9heqqGh7L9M8N884vRNyC26ObiqnEbauYgQlITdB5SRVSYFi51bHrGbB0QUAvN/7fUK9QlVOJGoraXtvGrJ7R5haxRqUpPwkyvRlKqe5SAoUO3bm/BnejHoTgMfaPka/Bv1UTiRqM2l7bxrHs44TnxuPs86ZW0NuVTuOsAP13erjpHWiXCknOT9Z7ThGUqDYqfzSfCZunEhhWSHdA7ozocMEtSOJWs5J52Rse/937N8qp7FdlXfvyPSOMAWtRkuwp/WtQ5ECxQ4pisLUqKnEZMfg5+rHh7d+iIPWQe1YQjC80XDA0I/n9PnTKqexPVWmd2T3jjAha9xqLAWKHVp4bCGrY1fjoHHgk76fUNe1rtqRhABgSMMh3BJ8C6X6Ut7c+ibl+nK1I9mUE1knOJtzFmedM31C+qgdR9gRa9xqLAWKnYlOjebjXR8D8EKXF+jg10HdQEJUotFoeLPnm3g4enAg/QA/HvlR7Ug2pWJqrHdwb5neESZlHEGRKR5hDhmFGbyw8QXKlDIGhw9mdMvRakcS4jIB7gG83PVlAD7f9zlnss+onMg2KIrC2rNrARgYNlDlNMLeyAiKMJsyfRkvb36Z1MJUGno35O2It6UZm7BakU0i6RXUixJ9iUz1VNPJ8yeJzYnFSetE39C+ascRdsZYoMgIijC1L6K/YGfyTlwdXPm076e4O7qrHUmIq9JoNEyNmIq7ozv70/bz09Gf1I5k9Sp27/QK7iX/voXJVUzxZBdnk1OSo3IaAylQ7MCGuA3838H/A+DtiLdp7NNY5URCXF+AewAvdnkRgM/2fcbZnLMqJ7JesntHmJuboxu+Lr6A9XSUlQLFxsXnxDNlyxQARrcczZCGQ1ROJET13dX0LnoE9qC4vJg3t76JXtGrHckqnTp/ipjsGMP0TkhfteMIO2Vt0zxSoNiworIiJm2cRG5pLu3rt+eFzi+oHUmIGtFoNLwd8TZuDm7sTd3Lz8d+VjuSVaoYPYkIjsDDyUPlNMJeWVsvFClQbJSiKLy3/T2OZx3H18WXj/t8jKPOUe1YQtRYkEcQL3QxFNez9swiLidO5UTWp2L9iZy9I8zJ2nbySIFio5acXMLy08vRarR8eOuHBLgHqB1JiBt2d7O76R7QnaLyIt6Mkqmeyk6fP82Z7DM4ah1l944wK2vrhSIFig06nHGYaTumAfBsx2fpEdhD5URC3BytRsvUiKm4OriyJ2UPvxz/Re1IVqNi9CQiKAJPJ0+V0wh7VjGCkpAni2TFDcguzuaFjS9Qoi+hb0hfHmnziNqRhDCJEM8QJnWeBMCnez4lPjde5UTWQXbvCEupGEFJyEuwit5EUqDYEL2i57V/XyMhL4EQjxDe6/0eWo38LxT2477m99HFvwuFZYVMjZpa66d6zpw/w6nzp3DQOsj0jjA7Pzc/HLQOlOnLSC1IVTuOFCi2oqC0gPe2v8e/Cf/irHPm036f4u3srXYsIUxKq9HyTsQ7uDq4sjN5J7+f+F3tSKr6+6zh7J2IoAi8nLxUTiPsnU6rI9gjGLCOdShSoNiA7UnbGbliJL+d+A2AKd2n0MK3hcqphDCPUK9Qnu/0PACf7P7EaubD1SC7d4SlWdNWYylQrFh2cTZvbn2Tx9c8TkJeAgHuAXzR/wvubHqn2tGEMKsHWjxAJ79OFJQVMDVqKoqiqB3J4s5ky/SOsLyKhbLWsAZMChQr9c/Zf4hcHsnSU0sBw9z80uFLuTXkVpWTCWF+Wo2Wd3q9g7POme1J21l8crHakSxubazh5OIegT1kOldYjDVtNZYCxcqkF6YzeeNkJm2cRHphOuFe4cy7fR7/7fFf6SApapUwrzCe6/gcAB/v/pikvCSVE1mWcfeOTO8ICzJuNbaC83ikQLESiqKw9ORShi8bztqza9FpdDzW9jF+H/47nf07qx1PCFWMbjmaDvU7kF+az9RttWeqJzY7lhNZJ3DQOHBbg9vUjiNqEWs6j0cKFCtwLvccT6x9gjej3iS3JJeWvi1ZNHQRz3d6Hmeds9rxhFCNTqszTvVEJUax7NQytSNZRMXoSfeg7jK9IyyqYhdPZlEm+aX5qmaRAkVF5fpyfjzyIyNXjGR70nacdc5M6jyJhf9ZKLt0bNyp1DxKy2t3Dw9TaejdkGc6PAPAjF0zSM5PVjmR+VXs3hkcNljlJKK28XTyxMfZB1B/J48UKCo5lXWKMavGMGPXDArLCuni34XFwxfzSJtHcNA6qB1P3IR5W2MYMHMTbyw7pHYUu/FQq4doV78deaV5vL3tbbue6jmbc5bjWcfRaXT0C+2ndhxRC1nLQlkpUCystLyUOdFzuGflPRxIP4CHowdv9HiD7wZ/R5hXmNrxxE2KSc9n+qpjAPyyO56TKbkqJ7IPOq2OdyPexUnrxJaELaw4vULtSGaz9qxh9073wO74uPioG0bUStZyqrEUKBZ0IO0A9668ly/3f0mZvoy+IX1ZOmIp9za/V1rW2wG9XuHl3/dTXKZHqwFFgVn/nFQ7lt1o5NOIpzs8DcCHOz8kJT9F5UTmIc3ZhNqkQKlFCkoL+HDnhzz414OcOn8KXxdfPrr1Iz677TMC3APUjidMZP62WHbFZuHmpOPbMV3QaODPg0kcTsxWO5rdGNt6LG3qtiG3NJd3t79rd1M98TnxHM08ik6jk907QjU2OcUzffp0unbtiqenJ35+fkRGRnL8+PEqj1EUhalTpxIUFISrqyt9+/bl8OHDJg1tS7YlbmPkipEsOLoABYVhjYaxfMRybm94OxqNRu14wkRi0/P5cLVhaue1O1rSv6U/w9oFAfDp2hNqRrMrDloH3u31Lo5aRzad28TKMyvVjmRSFWfvdAvoRh2XOiqnEbVVsKdhJ4/ax0zUqEDZtGkTEyZMYPv27axdu5aysjIGDRpEfv7FrUgzZsxg5syZzJ49m127dhEQEMDAgQPJza1dc/HZxdm8sfUNnlj7BAl5CQS6BzJnwBym3TJN5pXtjF6v8PLiAxSV6unZqC6juzUAYOKApmg18M/RVPbFZamc0n40qdOEp9o/BcAHOz8grSBN5USmY5zeCZfpHaGeihGUhNwEVU8Ur1GBsnr1asaNG0fr1q1p374933//PXFxcezZswcwjJ7MmjWLKVOmMHLkSNq0acP8+fMpKChg4cKFZvkLWKO1Z9cSuTySZaeWoUHDAy0eYOmIpfQO7q12NGEGC3acZWdMJq6OOj68qx1arWFkrFF9D+7qZPiHPlNGUUzq4TYP06puK3JKcuxmqic+9+L0Tv8G/dWOI2qxAPcAdBodJfoSVT8A3NQalOxsw9y6r68vADExMSQnJzNo0MXq39nZmT59+hAVFXXF1yguLiYnJ6fKl61KK0hj0oZJTN44mfTCdBp6N+SHIT/wevfXcXd0VzueMIO4jAI+uLBr59UhLWhQ163K/c/1b4qjTsO/J9PZfiZDjYh2qWKqx0HrwIb4DayKWaV2pJv2x+k/AOgS0EWmd4SqHLQOBLoHAuquQ7nhAkVRFCZPnkzv3r1p06YNAMnJhgZK/v7+VR7r7+9vvO9S06dPx9vb2/gVGhp6o5FUU9GmfsTyEfwT9w8OGgeeaPcEvw37jQ5+HdSOJ8xEr1d4ZfEBCkrK6dbQl4d6XL5NPNTXjfu6Gn6mZ645YRef9K1FszrNeLLdkwBM2zmN9MJ0lRPdmPNF53n939eZs38OAEPCh6icSAjr2MlzwwXKM888w4EDB/j5558vu+/SxZ+Kolx1Qehrr71Gdna28Ss+Xv0jnmsiPjeex9c+bmxT37puaxYNXcSzHZ+VNvV2buHOOLadycDFUcuMSlM7l3qmX1OcHLTsjM1kyynb/CVqrR5t+ygtfFuQXZzN+9vft6kCUFEUVsesZsTyEfxx5g80aHio1UNENolUO5oQVnEmzw0VKM8++ywrVqxgw4YNhISEGG8PCDBsmb10tCQ1NfWyUZUKzs7OeHl5VfmyBeX6cn44/AMjl49kR9IOXHQuvNjlRRbcsYDmvs3VjifMLD6zgOl/HQXg5cEtCK939Sm8AG8X4+jKxzKKYlKOWkfe6/UeDhoH/on7x7gLxtql5Kfw3IbneGnzS2QWZdLEpwk/3vEjL3d9GZ1Wp3Y8IS5uNbaVERRFUXjmmWdYsmQJ69evp2HDhlXub9iwIQEBAaxdu9Z4W0lJCZs2bSIiIsI0ia3AyayTPLTqIT7a/RFF5UV0DejK4uGLGdt6rLSprwUUReG1JQfJLymna3gdxkWEX/c5T/VtjKujjv3x51l3NNX8IWuR5r7Nebzd4wBM2z6NzKJMlRNdnV7R89uJ34hcHsnG+I04aB14uv3T/Dr0V9rXb692PCGMbG6KZ8KECSxYsICFCxfi6elJcnIyycnJFBYWAoapnYkTJzJt2jSWLl3KoUOHGDduHG5ubowaNcosfwFLKikv4YvoL7h35b0cTD+Ih6MHb/V8i+8GfUcDrwZqxxMWsmhXPFtOpePsoGXG3e2vOrVTWT0PZx7uFQ7AJ2tPoNfLKIopPd72cZrVaUZWcRbTdkxTO84VxeXE8diax3hn2zvklebRrl47fhv6G091eApHnaPa8YSowuameObMmUN2djZ9+/YlMDDQ+PXLL78YH/Pyyy8zceJEnn76abp06UJCQgJr1qzB09PT5OEtaX/afu79416+2v8VZfoy+oX2Y9mIZdzd7G5puFaLJJwv5P0/DVM7Lw1uTsNrTO1c6olbG+Hp7MDRpBxWHbL/E3ktyVHnyLu93kWn0fF37N/GfiLWoExfxveHvmfkipHsSt6Fq4MrL3d9mR+G/ECTOk3UjifEFVVM8aQXplNYVqhKBo1iZRPiOTk5eHt7k52dbRXrUQpKC/h83+f8dPQnFBR8XXx5vfvrDAobJIVJLaMoCmPm7uTfk+l0auDDb+Mj0FVj9KSy//1zkk//OUHj+u6smdSnxs8X1/b5vs/55sA3+Lr4smzEMtW36x7PPM6bUW9yJOMIAD0Ce/BWz7eMn06FsGYRP0eQW5LL0uFLq1VMm/r3t5zFcw1RCVFV2tQPbzyc5SOWMzh8sBQntdBvu8/x78l0nBy0fHRP+xsqLh7pHY6PmyOn0/JZHq1uG2l79GS7J2ni04TMokym75yuWo7i8mI+2/sZ96+8nyMZR/B08uSdiHf4ZuA3UpwIm6H2mTxSoFxBdnE2U7ZM4cl/niQhL4Eg9yC+GvAV7/d+X9rU11JJ2YW8u9LwKfiFgc1oXN/jhl7H08WR8X0aA4aTjkvL1WsjbY+cdE681+s9dBodq2JWse7sOotn2Juyl7tX3M23B7+lTCljYNhAVkSu4M6md8oHG2FT1F4oKwVKJYqisCZ2DcOXDWfF6RVo0DC65WiWjlhKr+BeascTKqnYtZNbXEaHUB8eu6XRTb3emJ5h1PNwJi6zgN/3qHtaqD1qXa81D7d5GIB3t7/L+aLzFrlufmk+729/n7GrxxKbE0s913p82vdTZvadST3XehbJIIQpqb1QVgqUC1ILUpm4YSIvbHqBzKJMGnk34ochP/Bqt1dxc3S7/gsIu7V4bwIbj6fh5KDl43va3fS6ETcnB57uaxhF+WzdSYpKy00RU1Qyvv14Gnk3IqMogw93fWj2620+t5nI5ZEsOr4IgJFNR7JsxDIGhA0w+7WFMJfKhwaqodYXKIqisPjEYiKXRbI+fj0OGgfGtx8vbeoFAMnZRbz9x2HAcDpxEz/T7EYb1b0BAV4uJGUXsWhnnEleU1zkrHPm3V7votVoWXlmJRviNpjlOllFWbz676tMWDeB5PxkQjxC+HbQt7wd8Tbezt5muaYQliJrUFQUnxPP42seZ+q2qeSW5tKmbht+GfYLEzpMwEnnpHY8oTJFUZiy9CC5RWW0C/HmiZuc2qnMxVHHs/0Nq+JnbzhNYYmMophau/rtGNt6LGCY6skuzjbZayuKwl9n/mLEshH8eeZPtBotY1qNYfHwxfQI7GGy6wihpsprUNTY8FsrC5QyfRnzD89n5IqR7Eiu2qa+WZ1mascTVmJZdALrjqXipNPy0d3tcdCZ9p/LPZ1DCfV1JT2vmB+2xZr0tYXBhA4TCPcKJ60wjRm7ZpjkNZPzk3l2/bO88u8rZBVn0cSnCQuGLOClri/JdLCwK4HugWg1WorKi8gosvxp7LWuQDmeeZwH/3qQj3d/TFF5Ed0DurNk+BLGth4rZ2AIo9ScIqauMOzaea5/E5oHmL7RoJODluf7GwrirzadJreo1OTXqO0qpno0aFhxegWbz22+4dfSK3p+Pf4rkcsj2XRuEw5aByZ0mMCvQ3+lbf22JkwthHVw1DkS4GY4Y0+NnTy1pkApKS/h832fc//K+zmccRhPR0/ejnibbwd9S6hXqNrxhBVRFIUpyw6RXVhKm2AvnrywLdgcIjsE0ai+O1kFpXy/NdZs16nNOvh1YEyrMQC8HfU2OSU5NX6N2OxYHvn7Ed7d/i75pfm0q29oUz++/XhpUy/sWsU0T3xuvMWvXSsKlOjUaO754x6+OfANZUoZ/Rv0Z1nkMkY2HSl9CcRlVuxPZO2RFBx1Gj66uz2OJp7aqcxBp2XSAMMoyrebz3C+oMRs16rNnun4DGFeYaQWpvLxro+r/bwyfRnfHfyOu1bcxZ6UPbg6uPJqt1f54XZpUy9qBzW3Gtt1gVJQWsD0HdMZs2oMZ7LPUNelLjP7zmRWv1n4ufmpHU9YobTcYt5aYdi180y/prQMNP9xC/9pG0iLAE9yi8v49t8zZr9ebeTi4MI7Ee+gQcPSU0vZkrDlus85mnGUUX+OYtbeWZToS4gIimDpiKWMbjlapoNFrWHcySNTPKazJWELkcsjWXhsIQoKkU0iWR65nIFhA9WOJqyUoii8sewQ5wtKaRXoxdP9zDe1U5lWq2HyQMMoyvdbY0nPK7bIdWubTv6dGN1yNABTo6aSW5J7xccVlRUxa88sHvjzAY5mHsXLyYv3er3HVwO+Itgj2JKRhVCdmt1k7a5AOV90nilbpvDUP0+RlJ9EsEcwXw/8mnd7vSt9CcQ1/XkwidWHk3HQavjonnZmndq51MBW/rQL8aagpJyvNp622HVrm+c6PUeoZygpBSl8svuTy+7fk7KHe/64h+8OfUe5Us6gsEEsj1zOiCYjZDpY1Epq9kKxmwJFURRWx65mxPIRxjb1D7Z8kCXDlxARFKF2PGHl0vOKeXO5YWpnQr8mtA6ybDGr0Wh4YVBzAH7cfpbk7CKLXr+2cHVw5Z2IdwBYfHIxUQlRAOSV5PHe9vcYt3ocsTmx1Hetz6x+s/ik7yfSpl7UahUjKKkFqRSXW3Z01y4KlJT8FJ7b8BwvbXqJzKJMGns35sc7fuSVbq9IXwJRLW8tP0xmfgktAjyZ0E+dxY+3Nq1H1/A6FJfp+WLDKVUy1AZdArowqsUoAKZum8rfsX8TuTySX47/AsBdTe9iWeQy+jfor2ZMIayCj7MP7o7uACTkWbblvU0XKHpFz28nfiNyeSQb4zfioHXgqfZP8euwX2lfv73a8exSQUkZ289k8NWm00z+JZqFO+LQ6y3fYdCU/jqYxJ8Hk9BpNXx8T3ucHNT5Z1F5FGXRrjjiMwtUyVEbPN/peYI9gknKT+LFTS+SUpBCqGco3w36jqkRU/FyMv/iaCFsgUajUW2hrINFr2ZCcTlxTN02lV3JuwBoW68tb0e8TdM6TVVOZj/0eoVTaXlEx51nX/x5ouPPcyIll/JKBcmSfQks3nuOD+9qa7JzaiwpM7+EN5YdAuDpvo1pE6zuOqUejerSu0k9tpxK5/P1J5lxtxTa5uDm6MY7Ee/w2JrH0Gg0jGk1hqc7PI2rg6va0YSwOiGeIRzPOi4FyvWU6cv48ciPfBH9BcXlxbg6uPJsx2cZ1WKUbP27SWm5xUTHnyc6Povo+PMciM8mt7jssscFeLnQIdSHUF9XFu6IY8/ZLO743xaeva0J4/s2tuji0pv11orDZOSX0Mzfg2dus46+FpMHNWPLqXQW701gfJ/GNKrvoXYku9QtsBs/D/0ZVwdXGnmb7pwlIeyNWgtlbapAOZ55nDej3uRIhqEFeY/AHrzV8y3jIh5RfUWl5RxOzGZfnGFkZF/ceRLOF172OFdHHW1DvOkY6kPHBj50CK1DgLeL8f5xvRoyZelBNh5P45O1J/jzYBIz7m5HuxAfC/5tbszqQ8n8sT/ROLXj7GAdBW6nBnXo38KPdcdS+d+6k/zv/o5qR7Jbreu2VjuCEFav4ndsQq5l16DYRIFSXF7M1/u/5vtD31OmlOHp5MlLXV4iskmkbP2rBkVRiEnPvzA6YihGjiblUHbJ2hGNBprU96BDqA8dG9ShQ6gPzfw9rnlIXrCPK9+P68ry6ETe/uMwx5JzifxiK4/d0ohJA5rh6mQdv/QvlZVfwn8vTO08eWsjqyuoJg1sxrpjqazYn8jTfc1zFpAQQlSHWt1krb5A2Zuyl7ei3iI2JxaAgWEDeb3767L17xqy8kuIPnfeuHZkf/x5sgsvP4iunodTlWKkbYg3Xi41P1dEo9EQ2TGYW5rW4+0/jrBifyLfbD7D34eTmT6yLRGNre//1dt/HCY9r5gmfh4819/61i21CfbmjrYB/HUwmU/XnuCrhzqrHUkIUUtVNCg8l3sORVEsNjBgtQVKfmk+n2//nEXHFwFQz7UeU7pPYUDYAJWTWZeSMj1Hk3LYF5dlHCGJzbh894eTg5Y2QV7GYqRDqA8hdVxN+oNW18OZzx7oyIgOQUxZeoizGQWM+nYHD3QL5dUhLfF2tY5D1dYeSWFZdCJaDXx0dztcHK1zlGfSgGasOpTM6sPJHDyXTdsQaTQohLC8II8gNGgoKCsgqzgLXxdfi1zXaguUUX+OIl1JB+DOJnfyQpcXpBMsEJ9ZwN5KxcjhxBxKyvSXPa5hPXc6hvrQoYGhGGkR4GWx7bP9W/rTraEvH64+xoLtcfy8M571x1J5d0QbBrUOsEiGqzlfUMLrSw8C8PitjejYoI6qea6lqb8nkR2CWbovgZlrj/P9w93UjiSEqIWcdc74ufmRUpDCudxzUqCkFKTQoH4D3ur5Fj2DeqodR3V6vcIriw/w257L5wB93ByNoyIVXz5uTiqkvMjTxZH3ItsyrF0Qry45SEx6Pk/8uIf/tAtk6rDW1Pd0ViXXOyuPkJZbTKP67sZThK3Z8/2bsmJ/IhuOp7HnbCadwyzzxiCEEJWFeIYYC5R29dtZ5JpWW6A80PwBXuj9gnSCxbDIdeofh/ltzzm0Gmgb7G0oRC7sqgmv62a1i4W7N6rLqudv4X/rTvLN5jP8eSCJLSfTeXNoK0Z2CrZo7vXHUliyNwGNBj66u73VTu1UFl7PnXs6h7BoVzyfrDnBwsd7qB1JCFELhXiEsCdlj0UXylptgfJ85+elOLng07Un+GHbWTQa+PS+DozoYFsnqro46njl9hb8p20gryw+wOHEHF74bT/LohOYdmdbQn3N//85u7CU15YYpnYe692QzmHWO7VzqWf7N2XJ3gSiTmcQdSqdiCbWt+hYCGHf1DjV2HY6atVS322J4bP1hnNZ3hnRxuaKk8raBHuzbEIvXrm9BU4OWv49mc7gWZv5fmtMle605vDeyiOk5BTTsJ67sZ28rQj2ceWBbqEAfLL2BIpi20cLCCFsjxpbjaVAsWKL95zj3ZWGpnQvDmrGQz3CVE508xx1Wp7q25jVz99Ct3BfCkrKefuPI9z9VRQnU3LNcs2Nx1P5bc85NBqYYcW7dq5lQr8mODto2XM2i40n0tSOI4SoZdQ4j0cKFCu15nAyLy8+AMCjvRuqdsKuuTSq78GiJ3rwXmQbPJwd2Bd3nv98toXP1p284q6kG5VTdHFq5+GIhnQNt81Fpn5eLoyNCAdg5hoZRRFCWFbFCEpyfjKl5Zf31TIHKVCs0LbTGTzz8z7K9Qp3dw5hyh0trXYR7M3QajU82COMNZNu5bYWfpSU65m59gTDZ29hf/x5k1xj2p9HScouIqyuGy8Ntq2pnUs9eWsj3Jx0HEzIZs2RFLXjCCFqkboudXF1cEVBITE/0SLXlALFyhw4d57Hf9hNSZmeQa38+WBkW7Ra+ytOKgvyceW7sV343/0d8HV34lhyLnd+uZX3/zxCYUn5Db/u5hNpLNoVD8CMu9pZbdv96qrr4cwjvRoChlEUvZnX7QghLldarmfVwSSSs4vUjmJRGo2mSkdZS5ACxYqcSs1l7Nyd5BWX0bNRXT57oOM1z8GxJxqNhhEdgvlnch8iOwShV+Dbf2MYPGszUafSa/x6uZWmdsZFhNO9UV1TR1bF47c0wtPFgeMpuaw8mKR2HCFqnSlLD/LUT3sZMHMTP24/W6s+KFh6J0/t+O1nAxLOF/LQdzvJKiilfYg3347tYpOLOW+Wr7sTs+7vyPfjuhLk7UJcZgGj/m8Hr/x+4IrnCV3N9FXHSDhfSANfN16+3bandirzdnPkiVsaATBr7QnKyk23XkcIcW2/7Irj192GX855xWW8sewQ93+znTNpeSonswzjQlkL7eSRAsUKpOcV89D/7SApu4gmfh58/3A3PJyttkWNRfRr4ceayX0Y09Owc+mX3fEMnLmJ1YeSr/vcrafSWbgjDoAP72qHm5N9fS8f7t2QOm6OnEnPZ+k+yx5/LkRtdSghmzeWHwYMuyqnDmuFm5OOnbGZ3P6/f/ly4ylK7fwDQ8UISkKeZd53pEBRWU5RKWPn7uRMej7BPq78+Gg3fN3VbVNvLTycHXhnRBt+G9+TRvXdSc0tZvyCPTz90x5Sc688/5tXXMbLvxt2Pz3UI4yeje1jaqcyD2cHnurbGID/mXjXkxDicucLShi/YA8lZXoGtPTn6b5NGNerIX9PvJVbmtajpEzPjNXHGTF7K4cSstWOazahnoZ+TDLFUwsUlZbz2PzdHE7Moa67Ez8+2o1Ab1e1Y1mdruG+/PXcLUzo1xidVsNfB5MZOHMzv+2Ov2y77YcXpnZC6rjy6pAWKiU2v4d6hFPf05lzWYX8ujte7ThC2C29XmHyr/s5l2WYMv7k3vbGjQuhvm788Eg3PrmnPd6ujhxJymHEF1v5YNUxikpvfIG/tapYJBufe/l7rzlIgaKS0nI9E37ay86YTDydHZj/SDca1fdQO5bVcnHU8dLgFqx4phdtgr3ILizlpd8PMGbuTuIzCwDD9uwft58FDFM77nY8TebqpOOZC71xPl9/0i7fDIWwBl9uPMX6Y6k4O2iZ82AnvF0dq9yv0Wi4q3MI/0zuw3/aBVKuV/hq02mG/O9fdpzJUCm1eQR5BAGQV5pHTkmO2a8nBYoK9HqFl38/wLoLP/TfjetKm2BvtWPZhNZB3ix7uhevDmmB84V2+YM+3cy3m8/wyoXGdqO6N6BXLTiv5v5uoQR5u5CSU8xPF9bcCCFM59+TaXyy9gQA70W2oXXQ1d+n63s688WoTnzzUGf8vZyJSc/nvm+2M2XpQXKLLNPYzNxcHVyp71ofsMw0j0axspaUOTk5eHt7k52djZeXl9pxTE5RFN7+4wjzomJx0Gr4Zkxnbmvhr3YsmxSTns+riw+wIybTeFuwjyurJ96Cp4vjNZ5pPxbtjOPVJQep5+HEppf6WfWoUVZ+CT/vimPd0VSrWkzY3N+TsRHh8iFBVJF4vpChn28hM7+EB7qFMn1ku2o/N7uwlA9WHeXnnYbp10BvF96LbEP/lrb/Xj9m1Rj2pe7joz4fcXv47VXuM/Xvb+t9N7NT/1t3knlRsQB8fE97KU5uQsN67vz8eA9+3hXHB38dI7+kjOkj29aa4gTgrs4hzNl0mrMZBczfFsvTfa3vSISjSTnMj4pl6b4Eiq1wQe+Bc9n8tuccXcLqMK5XOINbB+BYS/oPiSsrKdPz9E97ycwvoU2wF28Na12j53u7OjJ9ZDuGtQ/itSUHOZtRwKPzdzO8fRBvDWtFXQ9nMyU3vxCPEPal7rPICIoUKBb0/dYYZv1zEoC3h7cmsqPtnkxsLbRaDaO7h3FHm0CyCkpq3ToeR52WiQOaMumX/Xy96QwP9gjDywoKtHK9wj9HU/h+awzbz1wc4Wod5MWDPcLw97KON+iSMoVVh5L480ASu89msftsFoHeLjzYI4wHujWQHXW11Pt/HiE6/jxeLg7MGd35hntSRTSux+rnb2XWPyf49t8zrNifyL8n03hrWGtGdAiyySNMLNmsTaZ4LGTJ3nNM/nU/AJMGNOP5AU1VTiTsRbleYfCszZxKzeP5/k2ZNLCZalmyC0r5ZXccP2w7y7msQgB0Wg23tw5gXK9wuoTVsco35ZScIn7aEcfCHWdJzysBwNlBS2SHYMb1CqdloP28F4lrWx6dwPOLogGYO66LyUa5D5w7z8u/H+BYsuHU9r7N6/P+nW0J9rGtnZsrTq9gypYpdA/szv8N+r8q95n697cUKBbwz5EUnlywh3K9wsO9wnlzaCurfJMWtuuvg0k8/dNePJwd+PflftSx8Cf/kym5zIuKZcneBAov7CjycXPkgW4NeLBHmM28CReXlbNyfxLfR8VwKOHiLoXuDX15uFdDBrbyR2fnZ2PVZidSchkxeyuFpeU8e1sTXhhk2i7UpeV6vt50ms/WnaKkXI+7k45XhrTgwe5hNnPm2t6UvYxdPZZgj2BW37W6yn1SoNiY7WcyGDN3JyVlekZ2Cubju9vbzA+isB16vcLQz7dwJCmH8X0aW6QHjF6vsOF4KvOiYvn35MXzkloEeDIuIpzIjsE2e1yDoijsOZvF91GxrD6UTPmF81aCfVwZ0zOM+7s2wNtN/ak0YTq5RaWMmL2VM+n59G5Sj/mPdDNbMXoqNY9XFx9g99ksALqG12H6yHY08bP+KerUglT6/9YfnUbHrgd34ai9+O9AChQbcighm/u/2U5ecRkDWvrz1YOdas3hf8Ly1h1N4dH5u3Fx1LL55X74ebqY5To5RaX8vvsc87fFcjbD0INGq4EBLf15uFdDejTytasRwqTsQn7cdpafd8aRVWDYLurqqOPOTsGMiwinmb+nygnFzVIUhQkL9/LXwWQCvV1Y+Wxvsy9k1esVFuw4y4erjpFfUo6TTsvzA5ryxK2NrHqRtl7R0+2nbhSXF/PXyL+M3WVBChSbcTotj3u+2kZmfgk9Gvky7+FuNvtpUtgGRVG488soouPP83Cv8BrvPLieM2l5zI+K5fc958gvMUzjeLk4cH+3BjzUI4xQXzeTXs/aFJWWsyI6kblbY4zrCAB6N6nHuIhw+rXws5vpH0VRyCoopY6bo10Vm1fzf/+e4b0/j+Ko0/DLkz3p1KCOxa6dcL6QKUsPsvF4GgAtA72YcVc72oZY77b3EctGcCb7DN8M/IaeQT2Nt0uBYgMSzxdy95woErOLaBvszcLHu9eqra9CPVtOpvPgdztw0mnZ+FJfgm5y7Yder7D5ZBrzomKNb6AATfw8GBcRzshOwXZ3GOP1KIrCjphMvt8aw9ojKVyY/aGBrxtjI8K5p0uIVeykqomcolIOxGcTHZ9FdPx5ouPPk55XQrsQb74d0wV/L/OMxlmDXbGZPPDNdsr0Cu+MaM2YnuEWz6AoCsuiE3jnjyNkFZSi1cDjtzZi0oBmVvnBdsK6CWw+t5k3e77JPc3uMd4uBYqVy8gr5p6vt3EmLZ9G9d357cmeNr3nXdgWRVG4/5vt7IjJZFT3Bky7s+0NvU5+cRmL955jXlQsZ9LyAdBo4LbmfozrFU7vJvVqxSfr64nPLGDBdsP0T05RGQBuTjru7hzC2IhwGlvhtveycj3HU3KJjj/PvjhDMXI6LY+r/SYI9HZh7riudrmTKS23mP989i+pucWM6BDErPs6qPpznZ5XzNt/HOGP/YkAhNd1Y/rIdlZ36On0HdNZeGwhj7R5hEmdJxlvlwLFiuUWlfLAt9s5lJBDkLcLvz8VcdOfYIWoqZ0xmdz79TYctBrWv9CXBnWrP/USd6Hh26+74sktNvzC9XB24J4uIYztGU54PXdzxbZpBSVlLN2XwLytsZxMzTPe3qdZfR7uFc6tTeurtjg+KbuQ6Ljz7Is/T3TceQ4mZBt3WlUW6utKh9A6dAj1oWMDH7xcHHnyx92cTsvHw9mBL0Z3ok+z+ir8DcyjrFzPg9/tYPuZTJr5e7BsQi+rGQ3850gK/112iOQcw6ntD3RrwGt3tLCakbkfj/zIjF0zGBw+mI/7fGy8XQoUK1VUWs7YuTvZEZOJr7sTv43vaZWfnkTtMGbuTjafSOOuTiF8cm/7az5WURSiTmfw/dZY1h1LMX6SbljPnbE9w7i7SygeVtxC35ooisLWUxnMi4ph3bFU4/eyUT13xkaEc1fnELN+L/OLyzhwLvvCNI1huiYlp/iyx3k6O9D+QiHSIdSH9qE+1LvCSG92QSnjF+xh25kMdFoN74xozejuYWbLb0kfrDrGV5tO4+6kY8Wzva3u/TqnqJQPVh1j4YVztvy9nHkvsi0DW6nffXxD3Aae2/Acreu2ZtHQRcbbpUCxQmXlesYv2Ms/R1PwcHZg0RM95FwPoar98ecZ8cVWtBpYM6nPFbcvFpaUGz71R8VwIuXip/5bL3zq76Pip357cDYjn/lRZ/lt98XRKE9nB+7pEsrYiDDC6t7caFS5XuFUap6xENkXd54TKbnGNTEVdFoNzf09jcVIxwY+NKrnUe3/tyVlel5bcpDFew2dQ5+8tRGv3N7Cpn82/j6czJM/7gHgy9GduKNtoMqJrm77mQxeXXyA2As75oa2C2Tq8NZXLCgt5WTWSUauGIm3szdb7t9ivF0KFCuj1yu8+Pt+luxNwMlByw+PdKNHI+uaLxS10+M/7GbtkRSGtgtk9qhOxtvPZRXw47azLNoVT3ahYdtsxbqJMT3DbaIXgy3JKy5jyd5zzNsay5n0i+t5+rfwY1xEQ3o1qVutdQ+puUVEX1gzEh1/ngPnssm7UPhUFuTtQocLxUiH0Dq0DfbG1enmFloqisLn608x88LJvkPaBPDpfR2scgHn9cSm5zPs8y3kFpfxWO+G/HdoK7UjXVdRaTmz/jnJt/+eoVyv4OPmyJtDW3Fnx2BV1swUlBbQfWF3ALY+sBUvJ8PvailQrIiiKLyz8gjfb41Fp9Xw9YOdGWAFw29CgOGQviH/+xeAv567hZyiUuZtjWXNkWTjp+xQX1fG9gznni6heLtax/y2varYEfX91lg2nbi4I6qpnwfjeoVzZ8eLO6KKSss5lGCYqqlYO5JwvvCy13Rz0tEuxLvK2hFz7rhZti+Bl38/QEm5ng6hPvzf2C6qfpKvqcKScu78civHknPpGl6HhY/3sOqeI5c6lJDNy78f4EiSocvxrc3qM+3ONoTUsfwW/z6/9CGzKJNfh/5Ky7otASlQrMpn604aP1F8el977uwYonIiIap6ZuFeVh5IwtVRV2VhZK8mdRkX0ZDb7Kh3hy05nZbHD1Gx/LbnHAWVesr0a+HH6bQ8jiXlUnbJXI1GA838PA0jIxdGSJr5e1r8/9+OMxk8uWAP5wtKCfV15ftxXWniZ/3N6hRF4YXfDKPd9Tyc+PO5W2xy+3RpuZ5vNp/hf+tOUlKmx81JxxtDW/FAtwYWzTH6r9EcSDvAzL4zGRg2EJACxWrMj4rlrRWHAXhrWCse7tVQ5URCXO5Uah6DPt2EXgEXRy13dgxhXEQ4zQOs/xdKbZBTVMpvu88xPyqWuMyCKvfV93S+ME1jGBlpF+JjNYuVz6Tl8fC8XZzNKMDLxYGvHupMRON6ase6poU74nh96UG0GvjpsR5Wt3W3pk6nGdrl74o1tMv/9cmedGvoa7Hrv7L5Ff6K+YvJnSfzcJuHASlQrMKyfQlM/CUaQPXTY4W4nn+OpJBwvpARHYLwcbPsIYKiesr1ChuOpXIgIZtm/h50bFCHIG8Xq+41k5lfwuM/7GbP2SwcdRqmj2zH3Z2tcxT5wLnz3D1nGyXlel4d0oLxfRqrHckk9HqFlxcf4Pc952gd5MWKZ3pbbETt832f882Bb7i32b280fMNwPS/v21n8s1KrDuawgu/7QdgXEQ4Ewc0VTmRENc2oJU/YyPCpTixYjqthgGt/Jk8sBlD2wUR7ONq1cUJgK+7Ez891p2h7QIpLVd48bf9zFx7Aiv7zEtWfglPLdhLSbmeQa38efLWRmpHMhmtVsNrQ1rg6eLA4cQcft0db7Frh3gYitFzeefMdg0pUGpgx5kMnv5pL+V6hTs7BvPm0FZW/yYihBDm4uKo47P7OzKhn2FE4rN1J5n0SzTFZZc3glODXq8w8ZdoEs4XEl7XjY/vbW9379l1PZyZNMAwiv/x38eNO/PMLcTzQoGSKwWK6g4lZPPY/N0Ul+np38KPGXe3s+k+AEIIYQparYaXBrfgw7vaotNqWBadyEPf7eR8QYna0fh8/Sk2nUjDxVHLnAc7W00nVlN7qGcYjeu7k5FfwmfrTlrkmhWnGCfmJVKuN09BKgVKNZxJy2Ps3J3kFpfRraEvX4zuZFNb04QQwtzu69qAeQ93xdPZgZ0xmYz8MorYC31f1LDpRBqz1hl2Wb4f2dYuzxKq4KjT8uaF08vnR8VyqtJxC+ZS37U+jlpHypQyUgpSzHIN+S17HUnZhTz03U4y8ktoHeTF/43tYpPNiYQQwtxuaVqf35+KINjHlTPp+YycE8Wes5kWz3Euq4DnF+1DUWBU9wbcZaWLd02pT7P6DGjpR5le4d2VR8y+Fkin1RHsEQyYb5pHCpSrKCot57fd8dz39XYSzhfSqJ478x/pZrdDhEIIYQrNAzxZ+nQEbYO9ycwv4YFvd7DyQKLFrl9cVs6En/ZyvqCUdiHevGkDnWJNZcp/WuGo07DpRBobjqea/XrBnhcKFDMtlJUC5RLJ2UV8/PdxIj5Yz0u/HyAus4Agbxd+eLSbTXVMFEIItfh5ufDLkz0Y2MqfkjI9zyzcx5cbT1lkh8+7K4+w/1w2Pm6OfDGqU60a8W5Yz51Heht6cr278iglZXqzXs+4k0dGUMxHURT2xmXx7M/76P3hemZvOEVmfglB3i68OqQFq56/VZVWwkIIYavcnBz46sHOPHKhieWM1cd5bclBSsvN90tzyd5zLNgeh0YDs+7rQKhv7XvffqZfE+p5OBOTns+8qBizXqtioay5RlCsoy2hSkrK9Px5MJF5W2PZfy7beHu3hr48HBHOwFb+OMhiWCGEuCE6rYY3h7UirK4bb/9xmEW74kk4X8gXozuZfLr8WHIOry89CMBztzWlb3M/k76+rfB0ceSV25vz0u8H+GzdKSI7BuPnaZ6W/hUjKAm5CWZ5/VpZoKTmFrFwRxw/7YgjLbcYACcHLSPaBzE2Ipw2wd4qJxRCCPsxNiKckDquPPvzPv49mc49c7Yx9+GuBPu4muT1c4pKeWrBXopK9dzStB7P9a/dDTTv6hTCgu1n2X8um4//Ps6Mu9ub5TrGXijWsgZl8+bNDBs2jKCgIDQaDcuWLatyv6IoTJ06laCgIFxdXenbty+HDx82Vd6bcuDceSb/Ek2vD9Yz65+TpOUW4+/lzIuDmrHt1dv46J72UpwIIYQZ9G/pz69P9sTP05njKblEfrGVg5VGrm+Uoii89Nt+YtLzCfJ24X/3d6z1B2BqtRrjtuPf9pzjwLnzZrlOxS6ezKJM8ktNv6W8xgVKfn4+7du3Z/bs2Ve8f8aMGcycOZPZs2eza9cuAgICGDhwILm5uTcd9kaUluv5Y38iI7/cyvDZW1myL4HScoVODXz47IGObHnlNp65rSl1ZQGsEEKYVZtgb5ZN6EWLAE/Scou59+ttrDmcfFOv+e2/Z/j7cAqOOg1fPtgZX3c50gGgc1gd7uwYjKLA23+YZ9uxh5MHPs4+gHkWytZ4imfIkCEMGTLkivcpisKsWbOYMmUKI0eOBGD+/Pn4+/uzcOFCnnzyyZtLWwMZecX8vDOOH7efJSXHMI3jqNMwtF0Q4yLCaR/qY7EsQgghDIJ8XPltfE+eWbiPTSfSeHLBHt74Tyvj7pOa2HEmgw9XHwfgzWGt6SDv61W8cnsL/j6czJ6zWazYn8iIDsEmv0aIRwjni89zLu8cgT6BJn1tk64AjYmJITk5mUGDBhlvc3Z2pk+fPkRFRV3xOcXFxeTk5FT5uhmHE7N56bf99PxgPR+vOUFKTjH1PJyZOKApW1+9jU/v6yDFiRBCqMjTxZHvxnZhVPcGKAq8s/IIU1ccplxf/U/5qTlFPPPzPuPZaA92b2DGxLYpwNuFCf2aADD9r2MUlJSZ/BrmPJPHpItkk5MNQ3X+/v5Vbvf39+fs2bNXfM706dN5++23b+q6ZeV61h5J4fuoWHbGXOxa2C7Em4d7hXNH20CcHWrPXnghhLB2Djot70e2IbyuG9P+Osa8qFjiMwv47IGOuDtf+1dTabmht0pabjHN/T15/842dncIoKk82rshi3bFEZ9ZyJyNp3lhUHOTvr45CxSz7KG99AdFUZSr/vC89tprZGdnG7/i46t/XPT5ghK+2nSaPh9t5Kmf9rIzJhMHrYZh7YNY/FQEyyf04s6OIVKcCCGEFdJoNDxxa2PmjO6Es4OWdcdSuffrbaTkFF3zeR/9fZydsZl4ODsw58FOuDnVyg2p1eLiqGPKHYZuul9vPkN8ZoFJX9/YrM0MO3lM+n81ICAAMIykBAZenItKTU29bFSlgrOzM87ONVugejw5l3lRsSzdd46iUkPTH193J0Z1a8CDPcII8DbPnm8hhBCmN6RtIP7eLjw+fzeHE3OI/GIrc8d1veIBf6sPJfHN5jMAfHxPOxrV97B0XJszuLU/EY3rEnU6g2l/HWXOg51N9to2M4LSsGFDAgICWLt2rfG2kpISNm3aRERExE29drleYe2RFEZ9u53Bszbz8844ikr1tAz0Ysbd7Yh69TZeHNxcihMhhLBBnRrUYdmEXjSu705SdhH3fLWNTSfSqjzmTFoeL/52AIAnbm3E7W1MuyjTXmk0Gt4a1hqtBlYdSibqdLrJXruiQEnIS0CvmLZLcI1HUPLy8jh16pTxzzExMURHR+Pr60uDBg2YOHEi06ZNo2nTpjRt2pRp06bh5ubGqFGjbihgdmEpv+2OZ/62WOIzCwHQamBw6wAe7tWQruF1ZO5RCCHsQKivG0ue6sX4BXvYdiaDR+bt4p0RrRndPYyCkjKeWrCXvOIyujX05eXBpl1LYe+aB3jyYI8wfth2lnf+OMLKZ3ubpFO6v5s/DhoHSvWlpBWkXf8JNVDjAmX37t3069fP+OfJkycDMHbsWObNm8fLL79MYWEhTz/9NFlZWXTv3p01a9bg6elZo+ucTstjyfo4Fu89R0FJOQDero7c3y2Uh3qEydk4Qghhh7zdHJn/SDdeW3KQxXvPMWXpIeIyCkjJKeJ4Si71PZ2Z/UBHOYbkBkwe2IwV+xM5lpzLzzvjeKhn+E2/poPWgUCPQOJz40nIM23Le41iieMlayAnJwdvb29CJ/6K1tlQhDTz9+DhXg2J7BCMq5MseBVCCHunKAqfrz/FzLUnjLfptBoWPtad7o3qqpjMtv2wLZY3lx/Gx82RjS/2xcft5hvbPbHmCbYlbeO1dq8xutNosrOz8fK6fP1QTVltCarRwMBW/ix8rDt/T7yVB7o1kOJECCFqCY1Gw3P9mzLrvg44XRgtefX2FlKc3KRR3RrQ3N+T8wWlfFqp+LsZFetQEvMTTfJ6Fax2b9Zfz91C6/AAtWMIIYRQUWTHYFoEehKbXsDg1lfeDSqqz0Gn5a1hrRj1fztYsCOOUd3DaB5QsyUYlzIWKHmmLVCsdgQl1FfWmAghhIAWAV7c3iZANkSYSESTetzeOoByvcI7Kw/f9Dk9Fb1QTL0GxWoLFCGEEEKYx5T/tMTJQcvWUxmsOZJyU69V60ZQhBBCCGEeob5uPHFLIwDe//MoRaXlN/xaFQVKRlGGSbJVkAJFCCGEqIWe6tsYfy9n4jIL+G5LzA2/jpeTF55ON7eO5UqkQBFCCCFqIXdnB14d0gKALzacuu4ZSNdSsQ7FlKRAEUIIIWqpyA7BdGrgQ0FJOR+uOnbDr1MxzWNKUqAIIYQQtVTFOT0AS/YlsDcu64ZeRwoUIYQQQphU+1Af7ulsKDDeXnEYvb7m245likcIIYQQJvfS7c3xcHZg/7lsluyreT8TGUERQgghhMn5ebrw7G1NAPhw9THyistq9PxQj1CTZ5ICRQghhBCM6xVOeF030nKLmb3+VI2eG+ARgFZj2pJCChQhhBBC4Oyg442hrQCYuyWG2PT8aj/XUetIgJtpz8+TAkUIIYQQANzWwo9bm9WnpFzPe38erdFzg9yDTJpFChQhhBBCAIZtx28ObYmDVsM/R1PYfCKt2s8N9gw2aRYpUIQQQghh1MTPkzE9wwF4Z+URSsv11XpeszrNTJpDChQhhBBCVPH8gKb4ujtxKjWPBdvPVus5dzW7y6QZpEARQgghRBXero68OKg5AJ+uPUFGXrHFM0iBIoQQQojL3Nc1lFaBXuQUlTFz7QmLX18KFCGEEEJcRqfV8NYww7bjn3fGcSQxx6LXlwJFCCGEEFfUvVFd/tMuEL0Cb/9xGEWp+Tk9N0oKFCGEEEJc1et3tMTZQcuOmEz+OphssetKgSKEEEKIqwr2cWV8n8YATPvrKEWl5Ra5rhQoQgghhLim8X0aE+TtQsL5Qr7edMYi15QCRQghhBDX5Oqk47U7WgIwZ9MpEs8Xmv2aUqAIIYQQ4rqGtgukW7gvRaV6pq86ZvbrSYEihBBCiOvSaDS8OawVGg38sT+RnTGZZr2eFChCCCGEqJY2wd7c37UBYNh2XK4337ZjKVCEEEIIUW0vDmqGp4sDhxNz+G13vNmuIwWKEEIIIaqtroczz/dvCsBHfx8np6jULNeRAkUIIYQQNTI2IpzG9d3JyC/hs39OmuUaUqAIIYQQokYcdVreGGo4p2deVCyn0/JMfg0pUIQQQghRY32b+9G/hR9leoV3Vx4x+etLgSKEEEKIG/Lfoa1w1GnYeDyNzSfSTPraUqAIIYQQ4oY0rOfOI70aAjBjtWmbt0mBIoQQQogb9sxtTajn4UxsRoFJX1cKFCHsmV4Pp9YZvhTzNVQSQtReni6OvHx7c5O/roPJX1EIob6iHIheCDu/hswLJ482/w/85xPwClQ3mxDC7tzdKYTvN3hhyrZtGkWxro9VOTk5eHt7k52djZeXl9pxhLAtGadh5zew7ycoyTXc5uwFpYWgLwVnbxj0DnQaCxqNulmFEHZl06Gz9G0bbrLf3zKCIoStUxQ4vR52fA0n1wAXPnPUawbdn4R298P5OFjxDCTsgT+eh4O/w7D/Qd3GqkYXQtiPjg3qmPT1ZARFCFtVnAcHFsGObyD9+MXbmw42FCaNb6s6SqIvhx1fwfr3oLQAHFyg3xTo8TTo5LOKEOLmmPr3txQoQtiarFjY+S3s/RGKsw23OXlCx9HQ7Ynrj4pkxhhGUWI2Gf4c2AFGzIaAtuZMLYSwc1KgCFEbKQrE/gvbv4Ljf2GcxvFtBN2ehA6jwKUG/14UBaJ/gr9fh6Js0DpA70lw60vg4GyWv4IQwr5JgSJEbVJSAAd/NawvSa3USrrxbdD9KWgyALQ30S0gNxn+ehGO/mH4c71mMPxzaNDj5nILIWodKVCEqA3Ox8Ou/4O986Ewy3Cboxu0f8CwvqS+iXsOHFkOf74I+amABro9Dv3fBGdP015HVFVWAskHIWE3nNsNBRnQ+k5oew84uqidTogakQJFCHulKBC3zbCQ9ehKUMoNt/s0MEzjdHwQXH3Md/3CLFjzX9i3wPBn71AYOguaDjDfNWsTRTGsH0rYYyhGzu2C5ANQXnL5Y93qQudx0OVR8A62dFIhbogUKELYm9IiOLTYUJgkH7h4e8Nboft4aHY7aHWWy3N6g2ER7fmzhj+3ux9unw5uvpbLYA8Kz0PiXji3x1CMJOyBgvTLH+daB4K7QEgXw1qgPfMg+0K7K40OWo0w/ByEdpPeNcKqSYEihL3ISYRd38Ge7w1D+2DY+tvuPsM0jn9r9bKV5MP692HHHFD04FYP7pgBrUfKL8krKS+D1MMXRkZ2G6Zs0k9c/jito2G3VEhXQ0ES3Nmw0Lny97S8zLAQesdXcHbrxdsDO0CPpwxTQLKQWVghKVCEsGWKYvg0veMrw7oPfZnhdq8Q6PaYocOrNY1UnNsNy5+BtKOGPzcbYmiXX5unHRQFchIuTtMk7IHEaCgrvPyxPmGVipEuhuKkJmtLkg4Yjis48BuUFxtuc68PXR4xfHkGmOSvJIQpSIEihC0qK4HDSw2FSeLei7c3iDCMlrQYar3N0spKYMtM2PzxhXb5XjDwbeg07uZ2ENmK4jxI3HexGDm3G/KSL3+cszcEd7pYjAR3Bo/6psmQn26Y+tn1HeQmGm7TOhpGU7qPh5DOprmOEDdBChQhbEluimEKZ/dcyEsx3KZzMuzS6P4kBLZXN19NpB41jKYk7Db8Oaw3DP/Mvtrl68sh7fiFYmS3Yf1I2lHDNFdlGp1hCq6iGAnpAnWbmr9gKy+FoysM287jd1y8PaSroVBpNQJ0jubNIMRVSIEirEPFMHdJgdpJrFNBOuyZb1j8qi813OYZCF0fNYw8mOqTtaXpyw2/HNe/e7Fdft/XoOcz1jsCdC25KZWKkd2GkZKSvMsf5xViGKUI7mIoBgLbg5Ob5fNWlrDX8P/i0p+xLo8adgDZ6s+YtdPrITvOMLJoTXwbqf5vUAoUoY6ibMMbYsWnyoTdkJ+mdirbENLNMFpiT59us2INO33ObDT8ObA9DJ8Nge3UTHVtJQWQtP9iMZKw5+Jumcoc3atO1YR0se61Hrkphumf3d9VGqVzhrZ3294onTXKT7+48PncbsP7YMURE9bkxVOqF6VSoAjzKy8zdC2t+Ad5rmJHwiU/KloHaeR1NRqdodtrj/GGtQj2SFEgeiH8/ZqhgNXooPdEuPVl9ZuM6fWQcarSL5XdkHzoYm8ZIw34taxajNRvYdlt3aZSVgJHlsH2OZesc+ppmP6x5nVO1qK0qFLjvF2Gn52K7faV6ZzVH0G71DO7wb2eqhGkQBGml51Q6R/kHkiKNgzfX8onzPAGHtL1xnYkCPuUmwKrXjLsSgLDWozhn0NYT8tlyM+oVFDvMvyCLrrCp1yPgIvbe0O6QFBH+yuyFcXwfdjxlaFgqbxTrOuF6R9r2immFkWBzDMXFj5fKEaSD16cLqusXvNKPzddwa+VFHtXIAWKuDkVOxIqD3PnJl3+OGevC8PcXU2/I0HYp6N/wJ8vXJxm6PoY9H+rZocYVkdZseEXiXGb727DlNOlHFwhqMPFYiSkK3gF164+LjmJhgXau7+/2CTOwQXa3WsYVVGz146lFWRWmqa+8N5XmHn549zqVR1RC+4ELt6Wz2uDpEAR1VexI6HyP8jUI1fZkdDqYjFiqR0Jwv4UZsGaN2Dfj4Y/e4XA0E+h2aAbez1FgayYqg3Qkg9euT18vWYXf35Dulz4lGsna35ulrFb8RzD969C+C2GQqX5ENuc1rqashJIOXRxW3jCbsOU36V0zoZ1UyFdLxayPmG1q4g1ISlQxNXlplSdc0/YByW5lz+uyo6ELoYOldY2nyps25mNhkW0FSMbbe+F2z8A97rXfl5h1oVfKhcWYifsudhltzK3upUK6s4Q1Mm85xTZC0WBuO2GQuWy856euHDeUx11M9aUosD5uKoL+BOjLza2q8y3UdWfG/+24OBk8cj2SgoUYVBaaNiRUHl1+bV2JFR8OgjuAl6Bls8rap+SfNgwDbZ/eaFdfl0YMgPa3GX4hFpeaviUWzG6d243ZJy8/HV0ToadKMYh985QJ1w+5d6s8/GGnT975lnmxGxTKcq5cMZRpZ+b/NTLH+fic8lUTWdZe2NmtadAWf4aXu6yAPMyFZ8wUw5fXPxmdGFHQuVixK+lfQ3dCttzbg+seMYwvQiGaYXyUsNi7LKiyx/v26jSL5UuENBGzp4xp5ICOPibYVFtxf8jgEb9DB9urEXFCHHaca64ozCgbdWfm7qNpYi1sNpToLzqiZez/HBdk4f/xaHKkK72uSNB2IeyEtg6CzbNqLpLwsWn6iJW+ZSrHkWB2H9h+1eGwwovLQKsiU+DSuuNukJAO9lRaAVqT4Hy+0S83ORT02UcnA3D3SFdwTtEPiEI25J6zNCqveIXjHzKtU5ZsbD/l4tTP9bA2dPwISykC3j4qZ1GXEHtKVBkDYoQQghhM0z9+1v2kQohhBDC6pitQPnyyy9p2LAhLi4udO7cmX///ddclxJCCCGEnTFLgfLLL78wceJEpkyZwr59+7jlllsYMmQIcXFx5ricEEIIIeyMWdagdO/enU6dOjFnzhzjbS1btiQyMpLp06df87myBkUIIYSwPVa/BqWkpIQ9e/YwaFDV1taDBg0iKirqsscXFxeTk5NT5UsIIYQQtZvJC5T09HTKy8vx9/evcru/vz/JycmXPX769Ol4e3sbv0JDQ00dSQghhBA2xmyLZDWX9DZQFOWy2wBee+01srOzjV/x8Vdo1y6EEEKIWsXB1C9Yr149dDrdZaMlqampl42qADg7O+PsLA3ZhBBCCHGRyUdQnJyc6Ny5M2vXrq1y+9q1a4mIiDD15YQQQghhh0w+ggIwefJkHnroIbp06ULPnj355ptviIuLY/z48ea4nBBCCCHsjFkKlPvuu4+MjAzeeecdkpKSaNOmDX/99RdhYWHmuJwQQggh7IycxSOEEEKIm2b1fVCEEEIIIW6WWaZ4bkbFgI40bBNCCCFsR8XvbVNNzFhdgZKRkQEgDduEEEIIG5SRkYG3t/dNv47VFSi+vr4AxMXFmeQvaApdu3Zl165dascArCsLWFcea8oC1pVHslydNeWxpixgXXmsKQtYVx5ryZKdnU2DBg2Mv8dvltUVKFqtYVmMt7e31SyS1el0kuUqrCmPNWUB68ojWa7OmvJYUxawrjzWlAWsK481ZYGLv8dv+nVM8ip2bsKECWpHMLKmLGBdeawpC1hXHslyddaUx5qygHXlsaYsYF15rCmLKck2YyGEEELcNLvfZuzs7Mxbb70l5/MIIYQQNsTUv7+tbgRFCCGEEMLqRlCEEEIIIaRAEUIIIYTVkQLlgs2bNzNs2DCCgoLQaDQsW7bMeF9paSmvvPIKbdu2xd3dnaCgIMaMGUNiYqLFswBMnTqVFi1a4O7uTp06dRgwYAA7duxQJUtlTz75JBqNhlmzZpklS3XyjBs3Do1GU+WrR48eqmQBOHr0KMOHD8fb2xtPT0969OhBXFycKnku/b5UfH300UcWz5KXl8czzzxDSEgIrq6utGzZkjlz5pg8R3XzpKSkMG7cOIKCgnBzc+P222/n5MmTJs8xffp0unbtiqenJ35+fkRGRnL8+PEqj1EUhalTpxIUFISrqyt9+/bl8OHDJs9S3TxLlixh8ODB1KtXD41GQ3R0tCpZLP0+XJ3vjaXei6uTpTJLvBdbghQoF+Tn59O+fXtmz5592X0FBQXs3buXN954g71797JkyRJOnDjB8OHDLZ4FoFmzZsyePZuDBw+yZcsWwsPDGTRoEGlpaRbPUmHZsmXs2LGDoKAgk2eoaZ7bb7+dpKQk49dff/2lSpbTp0/Tu3dvWrRowcaNG9m/fz9vvPEGLi4uquSp/D1JSkpi7ty5aDQa7rrrLotnmTRpEqtXr2bBggUcPXqUSZMm8eyzz7J8+XKTZ7leHkVRiIyM5MyZMyxfvpx9+/YRFhbGgAEDyM/PN2mOTZs2MWHCBLZv387atWspKytj0KBBVa4zY8YMZs6cyezZs9m1axcBAQEMHDiQ3Nxck2apbp78/Hx69erFBx98YPLr1ySLpd+Hq/O9sdR7cXWyVLDUe7FFKCrZtGmTMnToUCUwMFABlKVLl1a5f/HixcqgQYOUunXrKoCyb98+i2W7Up5L7dy5UwGUs2fPqp4lOztbAZR//vlHlSznzp1TgoODlUOHDilhYWHKp59+atYc18ozduxYZcSIERa5/vWy3HfffcqDDz5o8SxXy3OpESNGKLfddpsqWVq3bq288847VW7r1KmT8t///tfieY4fP64AyqFDh4y3lZWVKb6+vsq3335r1iypqakKoGzatElRFEXR6/VKQECA8sEHHxgfU1RUpHh7eytfffWVWbNcKU9lMTExFn0vvlaWCpZ6H65uHku9F18ti6Xei6dNm6Z06dJF8fDwUOrXr6+MGDFCOXbsWJXHjB07VgGqfHXv3r1G11FtBOV6n7AsVbXfqOzsbDQaDT4+PqrmKCkp4ZtvvsHb25v27dtb/Pp6vZ6HHnqIl156idatW1v8+leyceNG/Pz8aNasGY8//jipqakWz6DX6/nzzz9p1qwZgwcPxs/Pj+7du19zisySUlJS+PPPP3n00UdVuX7v3r1ZsWIFCQkJKIrChg0bOHHiBIMHD7Z4luLiYoAqI1s6nQ4nJye2bNli1mtnZ2cDF4/4iImJITk5mUGDBhkf4+zsTJ8+fYiKijJrlivlUVN1sljyffh6eSz5XnylLJZ8L67uiM5Nj2absKi6YVzj056lq/br5VEURSksLFQ6d+6sjB49WrUsf/zxh+Lu7q5oNBolKChI2blzpypZpk2bpgwcOFDR6/WKoiiqj6AsWrRIWblypXLw4EFlxYoVSvv27ZXWrVsrRUVFFs2SlJSkAIqbm5syc+ZMZd++fcr06dMVjUajbNy40axZrpTnUh9++KFSp04dpbCwUJUsxcXFypgxYxRAcXBwUJycnJQffvjB7FmulKekpEQJCwtT7rnnHiUzM1MpLi5Wpk+frgDKoEGDzJZDr9crw4YNU3r37m28bevWrQqgJCQkVHns448/btYsV8tTmSXfi6+XRVEs+z58rTyWfi++WhY134uvNKJjitFsqzuLx9qVlpZy//33o9fr+fLLL1XL0a9fP6Kjo0lPT+fbb7/l3nvvZceOHfj5+Vksw549e/jf//7H3r170Wg0Frvutdx3333G/27Tpg1dunQhLCyMP//8k5EjR1osh16vB2DEiBFMmjQJgA4dOhAVFcVXX31Fnz59LJblSubOncvo0aPNth7mej777DO2b9/OihUrCAsLY/PmzTz99NMEBgYyYMAAi2ZxdHRk8eLFPProo/j6+qLT6RgwYABDhgwx63WfeeYZDhw4cMVRmkv/PSmKYvZ/Y9fKY2nXy2Lp9+Fr5bH0e/GVsqj9Xny10aWK0WwfHx/69OnD+++/X7Pvy83VTaaBjYyglJSUKJGRkUq7du2U9PR0VbNcqkmTJsq0adMsmuXTTz9VNBqNotPpjF+AotVqlbCwMLNmuVKeq2nSpEmVOX1LZCkuLlYcHByUd999t8rjXn75ZeX/27vbmKbO/w3gV1UeSoowEGgrFDEwMrJExafADIiTskDCcA5NjAqbTjcBh8vINjWCIaIwZTNuLrwwFEOIGW4iMMNmZoszauITytzmA8N0CzKUUnlSQbl/L/zbWAFFR0+P+1+fxBc95/TudaPe+fLtae/o6GiHZhkqz6OOHj0qAIiGhgaH5xgqS29vr3BxcRG1tbV2161YsUIkJCRInudRVqtVtLW1CSGEmDVrllizZo1DMmRmZorAwEDx559/2h1vamoSAMTZs2ftjicnJ4vly5c7JMuT8jxKqrX4aVmkXodH8rN5lCPX4uGyOHMtHq6jMxrdbHZQRqi/vx+LFi3ClStXYDQa4evr6+xIdoQQtvfSpbJs2bJBv+0mJCRg2bJleOeddyTNMpz29nb89ddf0Gg0kr6uq6srZs6cOeijgJcvX0ZwcLCkWR63Z88eTJ8+3Sn3LAEP/i/19/cP2vF07Nixts6Ts3h5eQEArly5gtOnTyM/P39UxxdCICsrCwcOHIDJZEJISIjd+ZCQEKjVahw+fBjTpk0D8ODehvr6ehQWFo5qlpHkkdJIski5Dj/vz8YRa/HTsjhzLR6uuzQa3WwWKP+nu7sbV69etT1ubm5GQ0MDfHx8oNVq8fbbb+Ps2bOora3F/fv30draCuBBS8vV1VWyLL6+vtiyZQuSk5Oh0WjQ3t6O3bt34++//0Zqauqo5nhaFp1ON2iBcHFxgVqtRnh4+KhneVoeHx8f5OXlYeHChdBoNLh27RrWr1+PCRMmYMGCBZJm0el0yMnJweLFixETE4O4uDjU1dWhpqYGJpNp1LOMJA/wYDOvyspK7NixwyEZRpolNjYWOTk5UCqVCA4ORn19Pfbu3Yvi4mKn5KmsrISfnx90Oh0aGxvx4YcfIiUlxe5m1dGQkZGBiooKHDx4EJ6enrZ1xMvLC0qlEgqFAtnZ2SgoKEBYWBjCwsJQUFAADw8PLFmyZFSzjCQPAFgsFpjNZtv3jTwsutVqNdRqtWRZ7t27J+k6/LQ8PT09kq3FT8vi6+sr+VoMAFlZWaiursbRo0cRGBj4xGs1Gg2Cg4Of7fuFRq3P8y9ABm/xGI3GQR+JAiDS0tJsGYb6YzQaJc1y+/ZtsWDBAqHVaoWrq6vQaDQiOTnZYTdmPSnLUBx9Y9aT8vT29gq9Xi/8/PyEi4uL0Ol0Ii0tTZjNZsmzPLRnzx4RGhoq3N3dxZQpU0RVVZVDsow0T0lJiVAqlcJqtTosx0iyXL9+XaSnpwutVivc3d1FeHi42LFjh+0GP6nz7Ny5UwQGBtr+3WzcuFHcvXt31HMMt46UlpbarhkYGBC5ublCrVYLNzc3ERMTIxobG0c9y0jzlJaWDnlNbm6upFmkXoeflkfKtXgkf0+Pc+RaPDAwIDIyMoRWqxWXL18e0XNu3rwp3NzcRFlZ2Yhfx2mbBT76G820adNQXFyMuLg42280j1btSUlJ2LdvH8LDw0e9aiciIqKRW7Nmja2j82iH5mFHp7u7e8huttlsxu+//w5PT88RvY7TChSTyYS4uLhBx9PS0mAwGGAwGIZ87yw3Nxd5eXkSJCQiIqLHDfdJodLSUqSnp+P27dtISUnBuXPnYLVaodFoEBcXh/z8fAQFBY38dZxVoBARERENh3vxEBERkeywQCEiIiLZYYFCREREssMChYiIiGSHBQoRERHJDgsUIiIikh3JCpS2tjasXr0aOp0Obm5uUKvVSEhIwIkTJ6SKQERERC8IyfbiWbhwIfr7+1FWVobJkyfjn3/+wc8//wyLxSJVBCIiInpBSNJBsVqtOHbsGAoLCxEXF4fg4GDMmjULn332GZKSkgAAt27dwqpVq+Dv74/x48dj3rx5OH/+vG2MvLw8TJ06FSUlJQgKCoKHhwdSU1NhtVqlmAIRERFJSJICRaVSQaVSoaqqashtqIUQSEpKQmtrKw4dOoQzZ84gMjISr7/+ul2H5erVq/j2229RU1ODuro6NDQ0ICMjQ4opEBERkYQkKVDGjRsHg8GAsrIyeHt747XXXsP69etx4cIFAIDRaERjYyMqKysxY8YMhIWFYfv27fD29sb+/ftt49y5cwdlZWWYOnUqYmJisGvXLuzbt8+29TQRERH9N0h2k+zChQvR0tKC6upqJCQkwGQyITIyEgaDAWfOnEF3dzd8fX1t3RaVSoXm5mY0NTXZxtDpdAgMDLQ9joqKwsDAAC5duiTVNIiIiEgCkt0kCwDu7u6Ij49HfHw8Nm3ahJUrVyI3Nxdr1qyBRqOByWQa9Bxvb+9hx3u4o+JwOysSERHRi0nSAuVxERERqKqqQmRkJFpbWzFu3DhMmjRp2OvNZjNaWlqg1WoBACdOnMCYMWPw8ssvS5SYiIiIpCDJWzzt7e2YN28eysvLceHCBTQ3N6OyshJFRUV48803MX/+fERFRSElJQU//vgjrl27huPHj2Pjxo04ffq0bRx3d3ekpaXh/Pnz+OWXX7B27VosWrQIarVaimkQERGRRCTpoKhUKsyePRtffPEFmpqa0N/fj6CgILz33ntYv349FAoFDh06hA0bNuDdd9/FjRs3oFarERMTg4CAANs4oaGheOutt5CYmAiLxYLExETs3r1biikQERGRhBRCCOHsECORl5eHqqoqNDQ0ODsKERERORj34iEiIiLZYYFCREREsvPCvMVDRERE/3+wg0JERESywwKFiIiIZMchBcrWrVsxc+ZMeHp6wt/fHykpKYO+jl4Igby8PGi1WiiVSsydOxcXL160nbdYLMjKykJ4eDg8PDyg0+mwdu1a3Lp1y26cLVu2IDo6Gh4eHk/81lkiIiJ6cTikQKmvr0dGRgZOnjyJw4cP4969e9Dr9ejp6bFdU1RUhOLiYnz11Vc4deoU1Go14uPj0dXVBQBoaWlBS0sLtm/fjsbGRhgMBtTV1WHFihV2r9XX14fU1FR88MEHjpgKEREROYEkN8neuHED/v7+qK+vR0xMDIQQ0Gq1yM7OxieffAIAuHv3LgICAlBYWIjVq1cPOU5lZSWWLl2Knp4ejBtn/x1zBoMB2dnZsFqtjp4OEREROZgk96A8fFvGx8cHANDc3IzW1lbo9XrbNW5uboiNjcXx48efOM748eMHFSdERET03+LwAkUIgY8++ghz5szBq6++CgBobW0FALuvsX/4+OG5x7W3tyM/P3/Y7goRERH9dzi8FZGZmYkLFy7g2LFjg84pFAq7x0KIQccAoLOzE0lJSYiIiEBubq7DshIREZE8OLSDkpWVherqahiNRgQGBtqOP9x9+PFuSVtb26CuSldXF9544w2oVCocOHAALi4ujoxMREREMuCQAkUIgczMTHz//fc4cuQIQkJC7M6HhIRArVbj8OHDtmN9fX2or69HdHS07VhnZyf0ej1cXV1RXV0Nd3d3R8QlIiIimXHIWzwZGRmoqKjAwYMH4enpaeuUeHl5QalUQqFQIDs7GwUFBQgLC0NYWBgKCgrg4eGBJUuWAHjQOdHr9ejt7UV5eTk6OzvR2dkJAPDz88PYsWMBAGazGRaLBWazGffv37ftdhwaGgqVSuWI6REREZGDOeRjxkPdRwIApaWlSE9PB/Cgy7J582aUlJSgo6MDs2fPxtdff227kdZkMiEuLm7IcZqbmzFp0iQAQHp6OsrKygZdYzQaMXfu3H89FyIiIpIeNwskIiIi2eFePERERCQ7LFCIiIhIdligEBERkeywQCEiIiLZYYFCREREssMChYiIiGSHBQoRERHJDgsUIho1c+fORXZ2trNjENF/AAsUInIKk8kEhUIBq9Xq7ChEJEMsUIiIiEh2WKAQ0XPp6enB8uXLoVKpoNFosGPHDrvz5eXlmDFjBjw9PaFWq7FkyRK0tbUBAK5du2bba+ull16CQqGw26erqKgIkydPhlKpxJQpU7B//35J50ZEzscChYieS05ODoxGIw4cOICffvoJJpMJZ86csZ3v6+tDfn4+zp8/j6qqKjQ3N9uKkKCgIHz33XcAgEuXLuH69evYuXMnAGDjxo0oLS3FN998g4sXL2LdunVYunQp6uvrJZ8jETkPNwskomfW3d0NX19f7N27F4sXLwYAWCwWBAYGYtWqVfjyyy8HPefUqVOYNWsWurq6oFKpbDuWd3R0wNvbG8CDrsyECRNw5MgRREVF2Z67cuVK9Pb2oqKiQorpEZEMjHN2ACJ68TQ1NaGvr8+uiPDx8UF4eLjt8blz55CXl4eGhgZYLBYMDAwAAMxmMyIiIoYc97fffsOdO3cQHx9vd7yvrw/Tpk1zwEyISK5YoBDRM3ta47Wnpwd6vR56vR7l5eXw8/OD2WxGQkIC+vr6hn3ewyLmhx9+wMSJE+3Oubm5/fvgRPTCYIFCRM8sNDQULi4uOHnyJHQ6HQCgo6MDly9fRmxsLP744w/cvHkT27ZtQ1BQEADg9OnTdmO4uroCAO7fv287FhERATc3N5jNZsTGxko0GyKSIxYoRPTMVCoVVqxYgZycHPj6+iIgIAAbNmzAmDEP7rvX6XRwdXXFrl278P777+PXX39Ffn6+3RjBwcFQKBSora1FYmIilEolPD098fHHH2PdunUYGBjAnDlz0NnZiePHj0OlUiEtLc0Z0yUiJ+CneIjouXz++eeIiYlBcnIy5s+fjzlz5mD69OkAAD8/PxgMBlRWViIiIgLbtm3D9u3b7Z4/ceJEbN68GZ9++ikCAgKQmZkJAMjPz8emTZuwdetWvPLKK0hISEBNTQ1CQkIknyMROQ8/xUNERESyww4KERERyQ4LFCIiIpIdFihEREQkOyxQiIiISHZYoBAREZHssEAhIiIi2WGBQkRERLLDAoWIiIhkhwUKERERyQ4LFCIiIpIdFihEREQkOyxQiIiISHb+Bz80I9y6erPOAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# This code plots the frequency of \"COVID-19\", \"Coronavirus\", and \"Trump\" each day\n", "\n", "for term in [\"COVID-19\", \"Coronavirus\", \"Trump\"]:\n", " curr_df = sr.loc[sr.title.str.contains(term) | sr.selftext.str.contains(term)]\n", " posts_per_day = curr_df.resample('D').size()\n", " posts_per_day.plot(label = term)\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### EXERCISE 1\n", "\n", "Modify the code above to plot how often \"Coronavirus\" is used in each of the three subreddits over time" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "#### YOUR CODE HERE\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A similar approach is dictionary-based. The most well-known version of this is [LIWC](http://liwc.wpengine.com/), but the basic idea is that you create a set of words that are associated with a construct you are interested in, and you count how often they appear.\n", "\n", "This is a very simple example of how you might do this to look for gendered words among our subreddits" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# First we change NAs and removed/deleted to empty strings\n", "sr.loc[(pd.isna(sr.selftext)) | (sr.selftext.isin(['[removed]', '[deleted]'])), 'selftext'] = ''\n", "sr['all_text'] = sr.title + ' ' + sr.selftext" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "male_words = ['he', 'his']\n", "female_words = ['she', 'hers']\n", "\n", "# This puts all of the text of each subreddit into lists\n", "def string_to_list(x):\n", " return ' '.join(x).split()\n", "grouped_text = sr.groupby('subreddit').all_text.apply(string_to_list)\n", "\n", "# Then, we count how often each type of words appears in each subreddit\n", "agg = grouped_text.transform({'proportionMale': lambda x: sum([x.count(y) for y in male_words])/len(x),\n", " 'proportionFemale': lambda x: sum([x.count(y) for y in female_words])/len(x)}\n", " )" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "subreddit\n", "Coronavirus [FALSE:, US, records, 12,366, deaths, due, to,...\n", "aww [This, little, guy, (girl), snuck, into, my, o...\n", "politics [CNN, Expert, Claims, Black, Voters, Don’t, Ha...\n", "Name: all_text, dtype: object" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grouped_text" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
proportionMaleproportionFemale
subreddit
Coronavirus0.0018740.000234
aww0.0111290.003251
politics0.0039500.000525
\n", "
" ], "text/plain": [ " proportionMale proportionFemale\n", "subreddit \n", "Coronavirus 0.001874 0.000234\n", "aww 0.011129 0.003251\n", "politics 0.003950 0.000525" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "agg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### EXERCISE 2\n", "\n", "One of the trickiest parts of analysis is getting the data in the form that you want it in order to analyze/visualize it. \n", "\n", "I think a good visualization for this would be a barplot showing how often male and female word types appear for each subreddit. I'll give you the final call to produce the plot:\n", "\n", "`sns.barplot(x='subreddit', y='proportion', hue = 'word_gender', data = agg_df_long)`\n", "\n", "Now, see if you can get the data in shape so that this code actually works! :)\n", "\n", "*Hint: You'll want to use [wide to long](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.wide_to_long.html)*" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
A(weekly)-2010A(weekly)-2011B(weekly)-2010B(weekly)-2011Xid
00.5488140.5448830.4375870.38344200
10.7151890.4236550.8917730.79172511
20.6027630.6458940.9636630.52889512
\n", "
" ], "text/plain": [ " A(weekly)-2010 A(weekly)-2011 B(weekly)-2010 B(weekly)-2011 X id\n", "0 0.548814 0.544883 0.437587 0.383442 0 0\n", "1 0.715189 0.423655 0.891773 0.791725 1 1\n", "2 0.602763 0.645894 0.963663 0.528895 1 2" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Example of how wide_to_long works (from https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.wide_to_long.html)\n", "\n", "import numpy as np\n", "np.random.seed(0)\n", "\n", "df = pd.DataFrame({'A(weekly)-2010': np.random.rand(3),\n", " 'A(weekly)-2011': np.random.rand(3),\n", " 'B(weekly)-2010': np.random.rand(3),\n", " 'B(weekly)-2011': np.random.rand(3),\n", " 'X' : np.random.randint(3, size=3)})\n", "df['id'] = df.index\n", "df " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
XA(weekly)B(weekly)
idyear
0201000.5488140.437587
1201010.7151890.891773
2201010.6027630.963663
0201100.5448830.383442
1201110.4236550.791725
2201110.6458940.528895
\n", "
" ], "text/plain": [ " X A(weekly) B(weekly)\n", "id year \n", "0 2010 0 0.548814 0.437587\n", "1 2010 1 0.715189 0.891773\n", "2 2010 1 0.602763 0.963663\n", "0 2011 0 0.544883 0.383442\n", "1 2011 1 0.423655 0.791725\n", "2 2011 1 0.645894 0.528895" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.wide_to_long(df, # The data\n", " # The prefixes for the data columns. These will become column names that hold data values.\n", " stubnames = ['A(weekly)', 'B(weekly)'], \n", " # i is a column which uniquely identifies each row\n", " i='id',\n", " # j is what you want to call the prefix\n", " j='year',\n", " # sep is a string that is between the stubnames and the values which will go in j\n", " sep='-')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "## Exercise 2 Code\n", "## This code will get the df ready for pd.wide_to_long (try printing agg_df after running these to see what it looks like)\n", "agg_df = agg.unstack(level=0)\n", "agg_df = agg_df.reset_index()\n", "\n", "### Your code here" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
level_0subreddit0
0proportionMaleCoronavirus0.001874
1proportionMaleaww0.011129
2proportionMalepolitics0.003950
3proportionFemaleCoronavirus0.000234
4proportionFemaleaww0.003251
5proportionFemalepolitics0.000525
\n", "
" ], "text/plain": [ " level_0 subreddit 0\n", "0 proportionMale Coronavirus 0.001874\n", "1 proportionMale aww 0.011129\n", "2 proportionMale politics 0.003950\n", "3 proportionFemale Coronavirus 0.000234\n", "4 proportionFemale aww 0.003251\n", "5 proportionFemale politics 0.000525" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "agg_df" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'agg_df_long' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn [15], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m## Once you've created agg_df_long with the columns proportion and word_gender, you should be able to run this\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m sns\u001b[38;5;241m.\u001b[39mbarplot(x\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msubreddit\u001b[39m\u001b[38;5;124m'\u001b[39m, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mproportion\u001b[39m\u001b[38;5;124m'\u001b[39m, hue \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mword_gender\u001b[39m\u001b[38;5;124m'\u001b[39m, data \u001b[38;5;241m=\u001b[39m \u001b[43magg_df_long\u001b[49m)\n", "\u001b[0;31mNameError\u001b[0m: name 'agg_df_long' is not defined" ] } ], "source": [ "## Once you've created agg_df_long with the columns proportion and word_gender, you should be able to run this\n", "sns.barplot(x='subreddit', y='proportion', hue = 'word_gender', data = agg_df_long)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### EXERCISE 3\n", "\n", "Make your own analysis, with a different set of terms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## TF-IDF\n", "\n", "There are more complicated approaches to summarization in Python, including using LIWC (see [here](https://pypi.org/project/liwc/)).\n", "\n", "Almost all approaches are based on a \"bag of words\" approach, where the order of words is totally ignored. This is obviously a big simplification, but can often work quite well.\n", "\n", "One thing we might want to do is to differentiate groups of texts based on how often words are used. The naive way is to just count how often words appear. However, the most common words will always appear first. So, computational linguists came up with \"term frequency--inverse document frequency\" (TF-IDF). This normalizes words based on how often they appear across groups of texts. A detailed explanation with code is [here](https://towardsdatascience.com/natural-language-processing-feature-engineering-using-tf-idf-e8b9d00e7e76).\n", "\n", "There are a number of NLP / text analysis libraries in Python. The one I'm most familiar with is scikit-learn, which is a machine learning library. NLTK, SpaCy, and textblob are some of the most popular. Here is how to run TF-IDF in scikit-learn." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "## First, we prepare the data for the TF-IDF tool.\n", "# We want each subreddit to be represented by a list of strings.\n", "# So, we take our grouped_text (which is a list of lists of words)\n", "# and change it into a list of three really long strings, where each\n", "# string is all the words that appeared for that subreddit.\n", "\n", "# This called a 'list comprehension'\n", "as_text = [' '.join(x) for x in grouped_text]\n", "\n", "# It is equivalent to the following for loop\n", "as_text = []\n", "for x in grouped_text:\n", " as_text.append(' '.join(x))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "\n", "# Just gets the 5000 most common words\n", "vectorizer = TfidfVectorizer(max_features=5000, stop_words='english')\n", "\n", "tfidf_result = vectorizer.fit_transform(as_text)\n", "feature_names = vectorizer.get_feature_names_out()\n", "dense = tfidf_result.todense()\n", "denselist = dense.tolist()\n", "df = pd.DataFrame(denselist, columns=feature_names).transpose()\n", "df.columns = list(grouped_text.index)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Coronavirusawwpolitics
cat0.0000000.4099080.000000
dog0.0000000.2866040.000858
little0.0000000.2664920.003431
just0.0065420.2069550.031306
cute0.0000000.1718970.000000
girl0.0000000.1718970.000000
baby0.0013080.1718110.000666
new0.0562620.1718110.106574
today0.0000000.1458160.001715
puppy0.0000000.1454510.000000
adopted0.0000000.1322280.000000
old0.0052340.1171440.003997
got0.0117760.1171440.009991
good0.0000000.1156470.003431
think0.0000000.1106190.015439
like0.0091590.1093350.018650
kitten0.0000000.1057830.000000
suggestions0.0000000.1057830.000000
guy0.0000000.1055910.000858
help0.0065420.0976200.015320
\n", "
" ], "text/plain": [ " Coronavirus aww politics\n", "cat 0.000000 0.409908 0.000000\n", "dog 0.000000 0.286604 0.000858\n", "little 0.000000 0.266492 0.003431\n", "just 0.006542 0.206955 0.031306\n", "cute 0.000000 0.171897 0.000000\n", "girl 0.000000 0.171897 0.000000\n", "baby 0.001308 0.171811 0.000666\n", "new 0.056262 0.171811 0.106574\n", "today 0.000000 0.145816 0.001715\n", "puppy 0.000000 0.145451 0.000000\n", "adopted 0.000000 0.132228 0.000000\n", "old 0.005234 0.117144 0.003997\n", "got 0.011776 0.117144 0.009991\n", "good 0.000000 0.115647 0.003431\n", "think 0.000000 0.110619 0.015439\n", "like 0.009159 0.109335 0.018650\n", "kitten 0.000000 0.105783 0.000000\n", "suggestions 0.000000 0.105783 0.000000\n", "guy 0.000000 0.105591 0.000858\n", "help 0.006542 0.097620 0.015320" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This shows the values with the highest TF-IDF for r/Coronavirus\n", "df.sort_values('aww', ascending=False).head(20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Relative frequency\n", "\n", "\n", "An even simpler approach that works pretty well when comparing just two \"documents\" is to rank how much more often a word appears in one rather than the other.\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "politics_str = ' '.join(sr.loc[sr.subreddit == 'politics', 'all_text']).lower()\n", "covid_str = ' '.join(sr.loc[sr.subreddit == 'Coronavirus', 'all_text']).lower()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "def word_ratios(text):\n", " counts = {}\n", " tot_words = 0\n", " for word in text.split():\n", " counts[word] = counts.get(word, 0) + 1\n", " tot_words +=1\n", " result = {}\n", " for word, count in counts.items():\n", " result[word] = count/tot_words\n", " return result\n", " \n", " \n", "politics_ratio = word_ratios(politics_str)\n", "covid_ratio = word_ratios(covid_str)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "ratio_diff = []\n", "for word in politics_ratio:\n", " if word in covid_ratio:\n", " ratio_diff.append((word, politics_ratio[word] - covid_ratio[word]))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "ratio_diff = sorted(ratio_diff, key = lambda x: x[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the words that appear more often in r/Coronavirus" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('covid-19', -0.020888477566596217),\n", " ('covid', -0.012544929169800238),\n", " ('vaccine', -0.00592151224450452),\n", " ('more', -0.005169286900006672),\n", " ('information', -0.004752876614738616),\n", " ('our', -0.004724119177071341),\n", " ('for', -0.004715598694414918),\n", " ('vaccination', -0.004380547049728374),\n", " ('are', -0.003921754318080493),\n", " ('in', -0.003903396786161282),\n", " ('health', -0.0037529976515266027),\n", " ('of', -0.0036447707007916177),\n", " ('there', -0.0033541814836345095),\n", " ('vaccines', -0.0031055833011634434),\n", " ('cases', -0.0030923399997225182)]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratio_diff[:15]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here are those that appear more often in r/politics." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('biden', 0.008418094533021217),\n", " ('to', 0.0066828403369883875),\n", " ('the', 0.004575618874372623),\n", " ('texas', 0.0032892912474584077),\n", " ('bill', 0.0030318005794814544),\n", " ('on', 0.0030221543838544786),\n", " ('a', 0.002709801382600024),\n", " ('that', 0.002206546223422705),\n", " ('court', 0.0021136522597004167),\n", " ('law', 0.001782188016405662),\n", " ('his', 0.0016662137019796605),\n", " ('was', 0.0016506995657533103),\n", " ('from', 0.00162875463244231),\n", " ('calls', 0.0016230775454787474),\n", " ('white', 0.001588833874483722)]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratio_diff[-15:][::-1] # The [::-1] just reverses the list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classification\n", "\n", "Another commonly-used tool in NLP is classification. This is a \"supervised machine learning\" model, where you build a \"training set\" of items that are classified, and a machine learner uses that set to predict the classification of new items.\n", "\n", "One very common example is sentiment. In sentiment analysis, a random set of texts is manually classified as positive, neutral, or negative. This set is then used to train a classifier to predict the sentiment of unseen texts.\n", "\n", "It's beyond the scope of this class to learn how to do machine learning, but there are also pre-trained classifiers. One I found is from [textblob](https://textblob.readthedocs.io/en/dev/).\n", "\n", "NLTK also has a pre-trained classifier, trained on social media data, called VADER. That is pretty similar to what we're looking at, so this example shows how to use it.\n", "\n", "NLTK is interesting - the core is installed in Anaconda, so you should have it. However, to get various pieces to work you need to install them. So, we need to start by installing the vader lexicon." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Downloading package vader_lexicon to\n", "[nltk_data] /home/jeremy/nltk_data...\n", "[nltk_data] Package vader_lexicon is already up-to-date!\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import nltk\n", "nltk.downloader.download('vader_lexicon')" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "from nltk.sentiment.vader import SentimentIntensityAnalyzer\n", "\n", "analyzer = SentimentIntensityAnalyzer()\n", "\n", "def get_sentiment(sentence):\n", " vs = analyzer.polarity_scores(sentence)\n", " return vs['compound']\n", "\n", "sr['sentiment'] = sr.all_text.apply(get_sentiment)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
titleselftextdatesubredditall_textsentiment
date
2021-09-24 15:18:15We’re the League of Women Voters! We launched ...Hi! We’re activists and experts from the Leagu...2021-09-24 15:18:15politicsWe’re the League of Women Voters! We launched ...0.9822
2021-09-20 17:37:13The \"What happened in your state last week?\" M...Welcome to the 'What happened in your state la...2021-09-20 17:37:13politicsThe \"What happened in your state last week?\" M...0.9671
2021-09-13 16:08:17The \"What happened in your state last week?\" M...Welcome to the 'What happened in your state la...2021-09-13 16:08:17politicsThe \"What happened in your state last week?\" M...0.9671
2021-09-17 16:05:41Free Chat Friday ThreadIt's finally Friday! That means it's time to s...2021-09-17 16:05:41politicsFree Chat Friday Thread It's finally Friday! T...0.9650
2021-09-14 02:54:07Hello I know I'm different but my beautiful he...2021-09-14 02:54:07awwHello I know I'm different but my beautiful he...0.9587
\n", "
" ], "text/plain": [ " title \\\n", "date \n", "2021-09-24 15:18:15 We’re the League of Women Voters! We launched ... \n", "2021-09-20 17:37:13 The \"What happened in your state last week?\" M... \n", "2021-09-13 16:08:17 The \"What happened in your state last week?\" M... \n", "2021-09-17 16:05:41 Free Chat Friday Thread \n", "2021-09-14 02:54:07 Hello I know I'm different but my beautiful he... \n", "\n", " selftext \\\n", "date \n", "2021-09-24 15:18:15 Hi! We’re activists and experts from the Leagu... \n", "2021-09-20 17:37:13 Welcome to the 'What happened in your state la... \n", "2021-09-13 16:08:17 Welcome to the 'What happened in your state la... \n", "2021-09-17 16:05:41 It's finally Friday! That means it's time to s... \n", "2021-09-14 02:54:07 \n", "\n", " date subreddit \\\n", "date \n", "2021-09-24 15:18:15 2021-09-24 15:18:15 politics \n", "2021-09-20 17:37:13 2021-09-20 17:37:13 politics \n", "2021-09-13 16:08:17 2021-09-13 16:08:17 politics \n", "2021-09-17 16:05:41 2021-09-17 16:05:41 politics \n", "2021-09-14 02:54:07 2021-09-14 02:54:07 aww \n", "\n", " all_text \\\n", "date \n", "2021-09-24 15:18:15 We’re the League of Women Voters! We launched ... \n", "2021-09-20 17:37:13 The \"What happened in your state last week?\" M... \n", "2021-09-13 16:08:17 The \"What happened in your state last week?\" M... \n", "2021-09-17 16:05:41 Free Chat Friday Thread It's finally Friday! T... \n", "2021-09-14 02:54:07 Hello I know I'm different but my beautiful he... \n", "\n", " sentiment \n", "date \n", "2021-09-24 15:18:15 0.9822 \n", "2021-09-20 17:37:13 0.9671 \n", "2021-09-13 16:08:17 0.9671 \n", "2021-09-17 16:05:41 0.9650 \n", "2021-09-14 02:54:07 0.9587 " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sr.sort_values('sentiment', ascending=False).head()" ] } ], "metadata": { "kernelspec": { "display_name": "teaching", "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.9.19" } }, "nbformat": 4, "nbformat_minor": 4 }