diff --git a/posts/2024-attention.ipynb b/posts/2024-attention.ipynb
new file mode 100644
index 0000000..d5d7e50
--- /dev/null
+++ b/posts/2024-attention.ipynb
@@ -0,0 +1,687 @@
+{
+ "cells": [
+ {
+ "cell_type": "raw",
+ "id": "12a1fd37",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "---\n",
+ "author: Nipun Batra\n",
+ "badges: true\n",
+ "categories:\n",
+ "- ML\n",
+ "date: '2024-5-30'\n",
+ "title: RNN\n",
+ "toc: true\n",
+ "\n",
+ "---\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "c1e75d2d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "%config InlineBackend.figure_format = 'retina'\n",
+ "import torch\n",
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "from einops import rearrange, reduce, repeat"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "88b73e31",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "--2024-05-30 09:41:48-- https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt\n",
+ "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.108.133, ...\n",
+ "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 8752 (8.5K) [text/plain]\n",
+ "Saving to: ‘names-indian.txt’\n",
+ "\n",
+ "names-indian.txt 100%[===================>] 8.55K --.-KB/s in 0s \n",
+ "\n",
+ "2024-05-30 09:41:49 (33.8 MB/s) - ‘names-indian.txt’ saved [8752/8752]\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "!wget https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt -O names-indian.txt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "0821eb9b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Abhishek | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Aman | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Harsh | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Ayush | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Aditi | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 1160 | \n",
+ " Prasoon | \n",
+ "
\n",
+ " \n",
+ " 1161 | \n",
+ " Madhusudan | \n",
+ "
\n",
+ " \n",
+ " 1162 | \n",
+ " Prastuti | \n",
+ "
\n",
+ " \n",
+ " 1163 | \n",
+ " Rampratap | \n",
+ "
\n",
+ " \n",
+ " 1164 | \n",
+ " Madhukar | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1165 rows × 1 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 0\n",
+ "0 Abhishek\n",
+ "1 Aman\n",
+ "2 Harsh\n",
+ "3 Ayush\n",
+ "4 Aditi\n",
+ "... ...\n",
+ "1160 Prasoon\n",
+ "1161 Madhusudan\n",
+ "1162 Prastuti\n",
+ "1163 Rampratap\n",
+ "1164 Madhukar\n",
+ "\n",
+ "[1165 rows x 1 columns]"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "pd.read_csv('names-indian.txt', header=None)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "a3cc557e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# convert all names to lowercase\n",
+ "names = pd.read_csv('names-indian.txt', header=None)[0].str.lower().values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "562eb3c2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['abhishek', 'aman', 'harsh', ..., 'prastuti', 'rampratap',\n",
+ " 'madhukar'], dtype=object)"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "e23abf7d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Text(0, 0.5, 'Density')"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAALmCAYAAAD4wPyKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AABy40lEQVR4nOzde5iWVb0//veDwxkURVER8oQEmjtNMBUNqaQUleigHUwxMMudqV/Svrkr2e3MzPwaWu0kUNRtSbmNMjJ1s0ERIcAwbYsipAaICp44jcjI8/vDH8+WOM4wB27m9bquua41z73utT4z3N4zvmc96y6Vy+VyAAAAAAAonBZNXQAAAAAAAHUj4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKCqmroAiuONN97I448/niTZa6+9UlXl8gEAAACAbVVTU5OlS5cmSQ4//PC0adNmu8eU0LHNHn/88Rx99NFNXQYAAAAAFN7MmTPTt2/f7R7HFg0AAAAAAAVlBS/bbK+99qq0Z86cmX333bcJqwEAAACAYlmyZEnlHfLvzNq2h4CXbfbOPXf33XffdOvWrQmrAQAAAIDiqq/nW9miAQAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACioqqYuAABoPMPGzWrqEprM2KF9m7oEAACAemcFLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAt4kzz33XEaMGJFevXqlffv22WOPPdK3b99cc801Wb169XaNvXr16tx111358pe/nL59+2b33XdPy5Yt07lz5xx77LEZOXJkXnjhha2Oc+KJJ6ZUKm3TBwAAAADQPFQ1dQFN7e67785ZZ52V5cuXV15bvXp1Zs+endmzZ2fMmDGZOHFievToUeuxH3vssfTr1y8rV67c6Ngrr7ySGTNmZMaMGbnuuusyevTonHnmmdv1tQAAAAAAzUuzDnjnzJmTM888M9XV1enQoUO+8Y1vZMCAAamurs4dd9yRn//855k3b14GDRqU2bNnp2PHjrUaf/ny5ZVwt1+/fjn11FPTp0+fdO7cOUuXLs1dd92Vn//851m+fHk+97nPZdddd83JJ5+8xTH79OmTm2++uc5fMwAAAACw82jWAe9FF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFmr8Vu0aJEzzjgjV1xxRQ499NCNjg8cODAnn3xyhgwZkrfeeisXXnhhnn766S1us9C+ffu85z3vqVUdAAAAAMDOqdnuwTtz5sxMnTo1STJs2LANwt31RowYkd69eydJRo0albVr19ZqjuOOOy7jx4/fZLi73uDBg/Pxj388SbJgwYLMmTOnVnMAAAAAAM1Xsw14J0yYUGmfe+65m+zTokWLnH322UmS1157LZMnT26QWgYMGFBpL1iwoEHmAAAAAAB2Ps024H3ooYeSvL3lwVFHHbXZfv3796+0p02b1iC1rFmzptLeZZddGmQOAAAAAGDn02z34J07d26SpEePHqmq2vy3oVevXhudU98eeOCBSnv9lhCb8+STT+b9739/nnrqqbzxxhvZc889c9RRR+UTn/hEPvOZz6Rly5Z1rmPRokVbPL5kyZI6jw0AAAAA1L9mGfC+8cYbWbZsWZKkW7duW+y7++67p3379lm1alUWLlxY77X85S9/ycSJE5Mkhx9++FYD3hdffDEvvvhi5fPFixdn8eLF+d3vfperr746d95551bH2Jzu3bvX6TwAAAAAoGk0y4B3xYoVlXaHDh222n99wLty5cp6rWPNmjUZPnx43nrrrSTJlVdeudm+LVq0yIc+9KGccsopee9735vOnTtnxYoV+fOf/5wbb7wxc+fOzRNPPJEBAwZk5syZede73lWvtQIAAAAAO55mGfC+8cYblXarVq222r9169ZJkurq6nqt4ytf+Upmz56dJDnnnHNy2mmnbbbvXXfdlU6dOm30+gknnJALLrgg5513Xm655Za8+OKLufjii3PXXXfVup6trVBesmRJjj766FqPCwAAAAA0jGYZ8LZp06bSfvPNN7faf/1D0Nq2bVtvNVx11VUZM2ZMkqRv3775yU9+ssX+mwp312vZsmXGjBmTGTNm5KmnnspvfvObLF68OPvtt1+tatradhUAAAAAwI6lRVMX0BQ6duxYaW/LtgurVq1Ksm3bOWyLG2+8MZdffnmStx/i9oc//CHt27ffrjGrqqoybNiwyufvfHAbAAAAALBzapYBb5s2bdK5c+ckyaJFi7bY99VXX60EvPXxELJf/vKXueCCC5Ik+++/f+6///7sueee2z1ukhx66KGV9uLFi+tlTAAAAABgx9UsA97kf8PQ+fPnp6amZrP9nnzyyUq7d+/e2zXn7373u5x99tlZt25d9t1330yaNKlet0UolUr1NhYAAAAAsONrtgHv8ccfn+Tt7RceeeSRzfZ751YH/fr1q/N8kyZNyhlnnJGampp07tw5999/fw4++OA6j7cpTzzxRKXdtWvXeh0bAAAAANjxNNuA92Mf+1ilffPNN2+yz7p163LrrbcmefshZwMGDKjTXA8//HAGDx6cNWvWZLfddsu9996bww47rE5jbU5NTU1uuummyucf+MAH6nV8AAAAAGDH02wD3qOPPjonnHBCkmTs2LGZPn36Rn2uvfbazJ07N0ly0UUXpWXLlhscnzJlSkqlUkqlUoYOHbrJeR599NEMGjQoq1atSvv27TNx4sQcddRRtap18uTJee211zZ7fO3atRk+fHil1tNOO61e9gsGAAAAAHZsVU1dQFMaNWpU+vXrl+rq6gwcODCXX355BgwYkOrq6txxxx0ZPXp0kqRnz54ZMWJErcdfsGBBPvKRj1TC2e9+97vZbbfd8te//nWz53Tp0iVdunTZ4LVbbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVetaAQAAAIDiadYB75FHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOvxp06dmpdeeqny+SWXXLLVc6644oqMHDlyo9dXrlyZX/ziF/nFL36x2XMPP/zw3HHHHTnwwANrXSsAAAAAUDzNOuBN3t7O4LHHHsuoUaMyceLELFq0KK1atUqPHj3yqU99Kl/5ylfSrl27Jq3x61//eo444ohMnz49TzzxRJYuXZpXXnklrVu3zt57750+ffrkk5/8ZIYMGZJddtmlSWsFAAAAABpPqVwul5u6CIph0aJFlb19Fy5cmG7dujVxRQDU1rBxs5q6hCYzdmjfpi4BAABo5hoiX2u2D1kDAAAAACg6AS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoKqaugAAaArDxs1q6hIAAABgu1nBCwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4kzz33HMZMWJEevXqlfbt22ePPfZI3759c80112T16tXbNfbq1atz11135ctf/nL69u2b3XffPS1btkznzp1z7LHHZuTIkXnhhRdqNd4PfvCD9O3bN3vssUfat2+fXr16ZcSIEXnuuee2q1YAAAAAoFhK5XK53NRFNKW77747Z511VpYvX77J4z179szEiRPTo0ePWo/92GOPpV+/flm5cuUW++26664ZPXp0zjzzzC32mz9/fk455ZQ8/fTTmx3n9ttvz6mnnlrrWrfFokWL0r179yTJwoUL061btwaZB6AxDBs3q6lLoJGNHdq3qUsAAACauYbI15r1Ct45c+bkzDPPzPLly9OhQ4dceeWVefjhhzNp0qScd955SZJ58+Zl0KBBWbFiRa3HX758eSXc7devX6666qrcf//9+fOf/5x77703559/flq0aJHly5fnc5/7XO65557NjrVixYoMGjSoEu6ed955mTRpUh5++OFceeWV6dChQ5YvX54zzzwzjz76aO2/GQAAAABA4VQ1dQFN6aKLLkp1dXWqqqpy33335dhjj60c++AHP5hDDjkkl112WebNm5drr702I0eOrNX4LVq0yBlnnJErrrgihx566EbHBw4cmJNPPjlDhgzJW2+9lQsvvDBPP/10SqXSRn2vueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRdnypQptaoVAAAAACieZruCd+bMmZk6dWqSZNiwYRuEu+uNGDEivXv3TpKMGjUqa9eurdUcxx13XMaPH7/JcHe9wYMH5+Mf/3iSZMGCBZkzZ85GfdauXZvrr78+SdK7d++MGDFik3MNGzYsSfLAAw9k1ixvPQYAAACAnV2zDXgnTJhQaZ977rmb7NOiRYucffbZSZLXXnstkydPbpBaBgwYUGkvWLBgo+OTJ0/O66+/niQ555xz0qLFpv/Zhg4dWmn/5je/qd8iAQAAAIAdTrMNeB966KEkSfv27XPUUUdttl///v0r7WnTpjVILWvWrKm0d9lll42Or6/1H+v5R3369Em7du2SNFytAAAAAMCOo9kGvHPnzk2S9OjRI1VVm9+KuFevXhudU98eeOCBSnv9lhDv9MQTT2yynn9UVVWVHj16JGm4WgEAAACAHUezfMjaG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9V7LX/7yl0ycODFJcvjhh28y4F20aFGSt1cbd+rUaYvjde/ePY899liWLl2aNWvWpHXr1ttcy/p5NmfJkiXbPBYAAAAA0PCaZcC7YsWKSrtDhw5b7b8+4F25cmW91rFmzZoMHz48b731VpLkyiuv3GS/9fVua63rrVy5slYBb/fu3be5LwAAAADQ9JrlFg1vvPFGpd2qVaut9l8fklZXV9drHV/5ylcye/bsJG8/PO20007bZL/19dam1qT+6wUAAAAAdizNcgVvmzZtKu0333xzq/3XPwStbdu29VbDVVddlTFjxiRJ+vbtm5/85Ceb7bu+3trUmtS+3q1tQbFkyZIcffTRtRoTAAAAAGg4zTLg7dixY6W9LdsurFq1Ksm2bZGwLW688cZcfvnlSd5+aNof/vCHDbZW+Efr661NrUnt693afsQAAAAAwI6lWW7R0KZNm3Tu3DnJ1h8s9uqrr1ZC0/rYo/aXv/xlLrjggiTJ/vvvn/vvvz977rnnFs9ZH7yuWrUqr7322hb7rl+Fu9dee9Vq/10AAAAAoHiaZcCbJIceemiSZP78+ampqdlsvyeffLLS7t2793bN+bvf/S5nn3121q1bl3333TeTJk3aplWz62v9x3r+UU1NTRYsWFAvtQIAAAAAO75mG/Aef/zxSd5eFfvII49stt8DDzxQaffr16/O802aNClnnHFGampq0rlz59x///05+OCDa1XrP9bzj2bPnl1Zbbw9tQIAAAAAxdAs9+BNko997GO56qqrkiQ333xz3v/+92/UZ926dbn11luTJJ06dcqAAQPqNNfDDz+cwYMHZ82aNdltt91y77335rDDDtvm80888cTstttuef3113PLLbfksssuS6lU2qjfuHHjKu0hQ4bUqVYA2FkNGzerqUtoEmOH9m3qEgAAgAbUbFfwHn300TnhhBOSJGPHjs306dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0E3O8+ijj2bQoEFZtWpV2rdvn4kTJ+aoo46qVa2tWrXKV7/61STJ3Llz88Mf/nCjPtOnT8/YsWOTJP3790/fvv5nDgAAAAB2ds12BW+SjBo1Kv369Ut1dXUGDhyYyy+/PAMGDEh1dXXuuOOOjB49OknSs2fPjBgxotbjL1iwIB/5yEcqD0b77ne/m9122y1//etfN3tOly5d0qVLl41ev/TSSzN+/PjMmzcvl112WebPn59Pf/rTadu2bSZPnpzvfe97qampSdu2bfOjH/2o1rUCAAAAAMXTrAPeI488MuPHj89ZZ52V5cuX5/LLL9+oT8+ePTNx4sR07Nix1uNPnTo1L730UuXzSy65ZKvnXHHFFRk5cuRGr3fs2DETJ07MKaeckqeffjqjR4+uBNDr7brrrrn99ttzxBFH1LpWAAAAAKB4mu0WDeuddtppeeyxx3LJJZekZ8+eadeuXTp16pQ+ffrk6quvzpw5c9KjR4+mLjNJ0qNHj8yZMydXX311+vTpk06dOqVdu3Z597vfnUsuuSSPPfZYTj311KYuEwAAAABoJKVyuVxu6iIohkWLFqV79+5JkoULF6Zbt25NXBFA3TXXB27R/HjIGgAA7DgaIl9r9it4AQAAAACKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQTV6wPuVr3wlc+bMaexpAQAAAAB2Oo0e8P70pz9Nnz59cuSRR+aGG27IK6+80tglAAAAAADsFBo94G3ZsmXK5XL+8pe/5OKLL85+++2XM888M3/84x9TLpcbuxwAAAAAgMJq9IB3yZIl+dGPfpQjjjgi5XI5a9asyZ133plBgwZl//33z7e+9a0sWLCgscsCAAAAACicRg9499hjj3z1q1/Nn//85/z5z3/OV77yleyxxx4pl8tZtGhRvve976Vnz5458cQTc9ttt6W6urqxSwQAAAAAKIRGD3jf6Ygjjsj111+f559/Pr/+9a9z8sknp0WLFimXy5k6dWqGDh2afffdN+eff35mzJjRlKUCAAAAAOxwmjTgXa9ly5b5xCc+kYkTJ+bvf/97vve97+WQQw5JuVzO8uXLM2bMmPTr1y+HHXZYrr322rz00ktNXTIAAAAAQJPbIQLed9p3333zf//v/82TTz6Ze+65J/vss0+SpFwu58knn8xll12W7t2759Of/nQeffTRpi0WAAAAAKAJ7XABb5I8+OCDOffcc/PJT34yL774YsrlcpKkffv2KZfLWbt2bX7961+nT58+ueiii7Ju3bomrhgAAAAAoPHtMAHvwoUL893vfjc9evTIgAEDcuutt2bVqlVJkpNOOinjx4/Pyy+/nHnz5uXrX/96dt9996xbty4//vGP8+Mf/7iJqwcAAAAAaHxNGvCuWbMmv/zlLzNw4MAceOCBueKKK/K3v/0t5XI5++23X771rW/lb3/7W+6999586lOfSsuWLdOjR49cddVVWbBgQU488cSUy+WMHj26Kb8MAAAAAIAmUdUUk86cOTM333xzxo8fn9dffz3J23vstmzZMqeeemqGDx+ej370oymVSpsdY7fddsu//uu/pn///lmwYEFjlQ4AAAAAsMNo9ID3sMMOy5NPPpkklb11e/bsmWHDhuWcc85Jly5dtnmsrl27JknefPPN+i8UAAAAAGAH1+gB79y5c5Mkbdu2zSc/+ckMHz48J5xwQp3G2nXXXXP22WdvcaUvAAAAAMDOqtED3iOPPDLDhw/P5z73uey6667bNdZee+2VcePG1U9hAAAAAAAF0+gB7yOPPNLYUwIAAAAA7JRaNPaE3/nOd/Kd73wny5Yt2+ZzXn311cp5DeG5557LiBEj0qtXr7Rv3z577LFH+vbtm2uuuSarV6/errHXrVuXJ554IuPGjcsFF1yQvn37pnXr1imVSimVSpkyZco2jXPiiSdWztnaBwAAAADQPDT6Ct6RI0emVCrlk5/8ZPbcc89tOueVV16pnPftb3+7Xuu5++67c9ZZZ2X58uWV11avXp3Zs2dn9uzZGTNmTCZOnJgePXrUafzbbrstQ4cOradqAQAAAAD+V6MHvDuSOXPm5Mwzz0x1dXU6dOiQb3zjGxkwYECqq6tzxx135Oc//3nmzZuXQYMGZfbs2enYsWOt5yiXy5V2y5Ytc/jhh2ft2rV5/PHH61Rznz59cvPNN9fpXAAAAABg51KIgHft2rVJ3g5I69NFF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFnrOQ499NBcf/316du3b4444oi0adMmI0eOrHPA2759+7znPe+p07kAAAAAwM6l0ffgrYtHH300SbLXXnvV25gzZ87M1KlTkyTDhg3bINxdb8SIEendu3eSZNSoUZWguTaOPvroXHjhhTnmmGPSpk2b7SsaAAAAAOAdGnwF76233rrJ13/7299m9uzZWzx3zZo1WbBgQW666aaUSqX07du33uqaMGFCpX3uuedusk+LFi1y9tln5xvf+EZee+21TJ48OQMHDqy3GgAAAAAAtkeDB7xDhw5NqVTa4LVyuZxvfvOb2zxGuVxOixYtctFFF9VbXQ899FCSt7c8OOqoozbbr3///pX2tGnTBLwAAAAAwA6jUbZoKJfLlY9Nvbalj5YtW6Zfv3753e9+t0HYur3mzp2bJOnRo0eqqjafc/fq1Wujc5rSk08+mfe///3p1KlT2rRpk27dumXw4MG59dZb67SFBAAAAABQXA2+gveZZ56ptMvlcg466KCUSqXce++9OeSQQzZ7XqlUSps2bdK5c+fssssu9VrTG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9VpHXbz44ot58cUXK58vXrw4ixcvzu9+97tcffXVufPOOyv7BtfWokWLtnh8yZIldRoXAAAAAGgYDR7w7r///pt8vWvXrps91tBWrFhRaXfo0GGr/dcHvCtXrmzIsraoRYsW+dCHPpRTTjkl733ve9O5c+esWLEif/7zn3PjjTdm7ty5eeKJJzJgwIDMnDkz73rXu2o9R/fu3RugcgAAAACgoTR4wPuP1q1b19hTbuSNN96otFu1arXV/q1bt06SVFdXN1hNW3PXXXelU6dOG71+wgkn5IILLsh5552XW265JS+++GIuvvji3HXXXY1fJAAAAADQqBo94N0RtGnTptJ+8803t9p/zZo1SZK2bds2WE1bs6lwd72WLVtmzJgxmTFjRp566qn85je/yeLFi7PffvvVao6tbUGxZMmSHH300bUaEwAAAABoOM0y4O3YsWOlvS3bLqxatSrJtm3n0FSqqqoybNiwXHbZZUmSBx54IJ/97GdrNcbW9iMGAAAAAHYsDRbwfuELX0jy9sPSxo4du9HrdfGPY9XV+oe3vfzyy1t9sNirr75aCXh39D1qDz300Ep78eLFTVgJAAAAANAYGizgHTduXEqlUpJsEMq+8/XaKJfL9RbwJm+HoVOnTs38+fNTU1OTqqpNfyuefPLJSrt37971MndDqcv3FQAAAAAorgYLeN/1rndtMnDc3OuN7fjjj8/UqVOzatWqPPLII3n/+9+/yX4PPPBApd2vX7/GKq9OnnjiiUq7a9euTVgJAAAAANAYGizgffbZZ2v1emP72Mc+lquuuipJcvPNN28y4F23bl1uvfXWJG8/5GzAgAGNWmNt1NTU5Kabbqp8/oEPfKAJqwEAAAAAGkOLpi6gqRx99NE54YQTkry9hcT06dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0AardfLkyXnttdc2e3zt2rUZPnx4pdbTTjtth98vGAAAAADYfg22grcIRo0alX79+qW6ujoDBw7M5ZdfngEDBqS6ujp33HFHRo8enSTp2bNnRowYUed5xo0bt8Hnjz76aKX9xz/+cYNVzT169Mjxxx+/Qf9bbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVedaAQAAAIDi2GED3jVr1uS1117LXnvtlRYtGmah8ZFHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOd5zj333M0eu/rqqzf4/Jxzztko4E2SlStX5he/+EV+8YtfbHasww8/PHfccUcOPPDAOtcKAAAAABRHo2/RsHLlyvzhD3/IH/7wh6xcuXKj48uWLcsnPvGJ7LrrrunatWt23333jBgxImvWrGmQek477bQ89thjueSSS9KzZ8+0a9cunTp1Sp8+fXL11Vdnzpw56dGjR4PMva2+/vWv57rrrssZZ5yR97znPdl7773TsmXLdOjQIQcffHDOPPPM/PrXv86cOXNy6KGHNmmtAAAAAEDjKZXL5XJjTnjLLbfk3HPPTbdu3fLss89usDp33bp1ef/7358///nPeWdZpVIpH/vYx/Kf//mfjVkq/2DRokWVvX0XLlyYbt26NXFFAHU3bNyspi4BGsXYoX2bugQAAOD/1xD5WqOv4L333nuTJEOGDNlo64Xx48fnkUceSZK8733vyyWXXJL3ve99KZfLmTBhQv74xz82drkAAAAAADusRt+D969//WtKpVKOO+64jY7deuutSZKjjjoqDz/8cKqqqrJ27dqccMIJmTVrVm655ZZ89KMfbeySAQAAAAB2SI2+gvell15Kko0eBLZ27do8+OCDKZVK+ed//udUVb2dPbds2TJf+tKXUi6XM3PmzMYuFwAAAABgh9XoAe8rr7ySJGnVqtUGr8+aNSvV1dVJstEq3Z49eyZJXnjhhUaoEAAAAACgGBo94G3Xrl2S/13Ju96DDz6YJOnRo0f23nvvDY61bdu2cYoDAAAAACiQRg94Dz744CTJlClTNnj9N7/5TUqlUj7wgQ9sdM7SpUuTJF26dGnw+gAAAAAAiqLRA96TTjop5XI5P/3pT3PPPfdk5cqVueGGGzJr1qwkyWmnnbbROY899liSpGvXro1aKwAAAADAjqyqsSe86KKL8rOf/SwrVqzIqaeeusGx3r17bzLgnThxYkqlUo488sjGKhMAAAAAYIfX6Ct4991339x9993ZZ599Ui6XKx8HHXRQ7rzzzpRKpQ36L1iwIFOnTk2SfPjDH27scgEAAAAAdliNvoI3SU444YQ888wzmTZtWl544YXsu+++Of7441NVtXE5S5Ysybe+9a0kycCBAxu7VAAAAACAHVaTBLxJ0qpVqwwYMGCr/Y4//vgcf/zxjVARAAAAAECxNPoWDQAAAAAA1A8BLwAAAABAQTXZFg1J8pe//CVTp07N3/72t6xYsSJvvfXWFvuXSqWMHTu2kaoDAAAAANixNUnA+9RTT+ULX/hCZsyYsc3nlMtlAS8AAAAAwDs0esC7ePHifOADH8iyZctSLpeTJB06dMjuu++eFi3sGAEAAAAAsK0aPeC98sors3Tp0pRKpQwfPjxf+9rX0rNnz8YuAwAAAACg8Bo94P3jH/+YUqmUs88+O6NHj27s6QEAAAAAdhqNvifC888/nyQ5++yzG3tqAAAAAICdSqMHvLvvvnuSpFOnTo09NQAAAADATqXRA94+ffokSebNm9fYUwMAAAAA7FQaPeD96le/mnK5bP9dAAAAAIDt1OgB70knnZSvf/3rmTx5cr785S9n7dq1jV0CAAAAAMBOoaqxJ7z11lvTu3fvHHfccRk9enTuvvvufPKTn0yvXr3Srl27rZ7v4WwAAAAAAG9r9IB36NChKZVKlc+XLFmSG264YZvOLZVKAl4AAAAAgP9fowe8SVIul5tiWgAAAACAnUqjB7zPPPNMY08JAAAAALBTavSAd//992/sKQEAAAAAdkotmroAAAAAAADqRsALAAAAAFBQTfKQtfWefvrp3HrrrZk+fXpeeOGFVFdX5957702PHj0qff7617/m73//e9q3b5/+/fs3YbUAAAAAADuWJgl4161bl8suuyyjRo3KunXrUi6XkySlUilvvvnmBn3//ve/59RTT01VVVWeeeaZ7Lfffk1RMgAAAADADqdJtmg4//zzc9111+Wtt95K165d88lPfnKzfU855ZQceOCBeeutt3LnnXc2YpUAAAAAADu2Rg94J02alLFjxyZJLr/88jz77LP51a9+tcVzPvWpT6VcLue///u/G6NEAAAAAIBCaPQtGkaPHp3k7ZW53/3ud7fpnKOPPjpJ8j//8z8NVhcAAAAAQNE0+gre6dOnp1QqZdiwYdt8Trdu3ZIkL7zwQkOVBQAAAABQOI0e8L700ktJkgMOOGCbz2nZsmWSpKampiFKAgAAAAAopEYPeNu3b58kWbp06Tafs2jRoiTJHnvs0SA1AQAAAAAUUaMHvAcddFCS5Iknntjmc+65554kyWGHHdYgNQEAAAAAFFGjB7wDBw5MuVzOT37yk6xbt26r/Z944omMGzcupVIpp5xySiNUCAAAAABQDI0e8H71q19N+/bts2DBgnzpS1/a4r66999/fwYOHJg33ngje+yxR84777xGrBQAAAAAYMdW1dgT7r333vnZz36Ws88+O2PHjs29996bQYMGVY6PGjUq5XI506ZNy5NPPplyuZwWLVpk3Lhx6dChQ2OXCwAAAACww2r0gDdJPve5z6Vly5Y5//zzs3Dhwtx4440plUpJkjFjxiRJyuVykqRDhw655ZZbNgiBAQAAAABogi0a1jvjjDMyf/78/Ou//muOOuqo7LLLLimXy5WPww47LN/4xjcyf/78DBkypKnKBAAAAADYYTXJCt71OnfunG9961v51re+lXXr1uWVV17JW2+9lT322CMtW7ZsytIAAAAAAHZ4TRrwvlOLFi2y5557NnUZAAAAAACF0egB71tvvZVZs2Zl6tSpmTdvXl599dWsWLEiu+66a/bYY4+8+93vzvHHH58+ffqkRYsm20ECAAAAAGCH12gBb01NTX7yk5/khz/8YZ5//vmt9u/evXsuvfTSfOlLX8ouu+zSCBUCAAAAABRLowS8L7/8coYMGZJp06YlScrl8lbPWbhwYb761a/mrrvuyq9//evsscceDV0mAMBOZ9i4WU1dQpMZO7RvU5cAAAANrsED3rfeeiuDBg3KrFmzUi6XUyqVMnDgwHz4wx/O+973vnTu3DkdOnTIihUrsmzZssyZMyf3339/Jk2alHK5nClTpuT000/Pgw8+aMsGAAAAAIB3aPCA9/vf/35mzpyZUqmUI488MrfddlsOPfTQzfb/8Ic/nEsvvTR//etfc/bZZ+fRRx/N9OnTc8011+TrX/96Q5cLAAAAAFAYDbokdu3atbn++usr4e60adO2GO6+03ve8548/PDDOfLII1Mul3PdddelpqamIcsFAAAAACiUBg1477777ixdujSlUin/8R//kTZt2tTq/DZt2uS2225LqVTK0qVL8/vf/76BKgUAAAAAKJ4GDXgfeuihJG9vu9CrV686jXHooYfmpJNOSpJMnTq13moDAAAAACi6Bg14H3nkkZRKpXzoQx/arnE+9KEPpVwu55FHHqmnygAAAAAAiq9BA96FCxcmSf7pn/5pu8ZZf/5zzz233TUBAAAAAOwsGjTgff3115Mku++++3aNs/789eMBAAAAANDAAe/y5cuTJB06dNiucdq3b58kWbFixXbXBAAAAACws2jQgPett96q1/HWrVtXr+MBAAAAABRZgwa8AAAAAAA0nKrGmOSnP/1punTpUufzX3rppXqsBgAAAABg59AoAe+///u/N8Y0AAAAAADNSoMHvOVyuaGnAAAAAABolho04J08eXJDDg8AAAAA0Kw1aMDbv3//hhweAAAAAKBZa9HUBQAAAAAAUDcCXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXiTPPfccxkxYkR69eqV9u3bZ4899kjfvn1zzTXXZPXq1ds19rp16/LEE09k3LhxueCCC9K3b9+0bt06pVIppVIpU6ZMqdV4q1evzg9+8IP07ds3e+yxR9q3b59evXplxIgRee6557arVgAAAACgWKqauoCmdvfdd+ess87K8uXLK6+tXr06s2fPzuzZszNmzJhMnDgxPXr0qNP4t912W4YOHVovtc6fPz+nnHJKnn766Q1ef+qpp/LUU09lzJgxuf3223PqqafWy3wAAAAAwI6tWa/gnTNnTs4888wsX748HTp0yJVXXpmHH344kyZNynnnnZckmTdvXgYNGpQVK1bUaY5yuVxpt2zZMu973/ty+OGH13qcFStWZNCgQZVw97zzzsukSZPy8MMP58orr0yHDh2yfPnynHnmmXn00UfrVCsAAAAAUCzNegXvRRddlOrq6lRVVeW+++7LscceWzn2wQ9+MIccckguu+yyzJs3L9dee21GjhxZ6zkOPfTQXH/99enbt2+OOOKItGnTJiNHjszjjz9eq3GuueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRfXeusHAAAAAKB4mu0K3pkzZ2bq1KlJkmHDhm0Q7q43YsSI9O7dO0kyatSorF27ttbzHH300bnwwgtzzDHHpE2bNnWqde3atbn++uuTJL17986IESM26nPcccdl2LBhSZIHHnggs2bNqtNcAAAAAEBxNNuA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AAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAFvkueeey4jRoxIr1690r59++yxxx7p27dvrrnmmqxevbre5rnnnnsyZMiQdOvWLa1bt063bt0yZMiQ3HPPPVs9d+jQoSmVStv08eyzz9ZbzQAAAADAjquqqQtoanfffXfOOuusLF++vPLa6tWrM3v27MyePTtjxozJxIkT06NHjzrPsW7dunzxi1/M2LFjN3h98eLFWbx4cSZMmJDhw4fnxhtvTIsWMncAAAAAYNs064B3zpw5OfPMM1NdXZ0OHTrkG9/4RgYMGJDq6urccccd+fnPf5558+Zl0KBBmT17djp27Finef7lX/6lEu4eeeSRueyyy3LwwQdnwYIF+cEPfpA5c+ZkzJgx2WuvvfK9731vi2N17do199577xb77LfffnWqEwAAAAAolmYd8F500UWprq5OVVVV7rvvvhx77LGVYx/84AdzyCGH5LLLLsu8efNy7bXXZuTIkbWeY968efnhD3+YJOnTp08efPDBtG3bNknSt2/fnH766enfv39mz56da665Jl/4whe2uFq4ZcuWec973lPrOgAAAACAnU+z3Q9g5syZmTp1apJk2LBhG4S7640YMSK9e/dOkowaNSpr166t9Tw/+tGPUlNTkyS54YYbKuHueu3atcsNN9yQJKmpqcl1111X6zkAAAAAgOap2Qa8EyZMqLTPPffcTfZp0aJFzj777CTJa6+9lsmTJ9dqjnK5nN/+9rdJkl69euWYY47ZZL9jjjkm7373u5Mkv/3tb1Mul2s1DwAAAADQPDXbgPehhx5KkrRv3z5HHXXUZvv179+/0p42bVqt5njmmWfy/PPPbzTOluZZvHhxnn322VrNAwAAAAA0T8024J07d26SpEePHqmq2vxWxL169dronG31xBNPbHKc7Znn5ZdfTv/+/dO5c+e0bt06++67bz7ykY/kxz/+cVavXl2r+gAAAACAYmuWD1l74403smzZsiRJt27dtth39913T/v27bNq1aosXLiwVvMsWrSo0t7aPN27d6+0tzTPypUr8+CDD1Y+f+GFF/LCCy/kvvvuy/e///386le/ynHHHVerOjdV76YsWbKkTuMCAAAAAA2jWQa8K1asqLQ7dOiw1f7rA96VK1c22Dzt27evtDc1T6lUyjHHHJPTTjst73vf+7L33nvnjTfeyOOPP56xY8dm5syZWbx4cQYOHJipU6fmyCOPrFWtyYYhMwAAAACw42uWAe8bb7xRabdq1Wqr/Vu3bp0kqa6ubrB51s+xuXmuu+66dOrUaaPXjz322Jx33nn55je/me9973tZtWpVhg8fntmzZ6dUKtWqXgAAAACgWJplwNumTZtK+80339xq/zVr1iRJ2rZt22DzrJ9jc/NsKtxdr1Qq5corr8yf/vSnTJo0KX/+85/z8MMPp1+/frWqd2tbUCxZsiRHH310rcYEAAAAABpOswx4O3bsWGlvy7YLq1atSrJt2znUdZ71c9RlnvXOP//8TJo0KUnywAMP1Drg3do+wQAAAADAjqVFUxfQFNq0aZPOnTsn2fqDxV599dVK+FrbPWrfGZhubZ53rp6t6164hx56aKW9ePHiOo0BAAAAABRHswx4k/8NQ+fPn5+amprN9nvyyScr7d69e9dpjn8cp77nWc+euwAAAADQvDTbgPf4449P8vbWCI888shm+z3wwAOVdm23PDjwwAPTtWvXjcbZlAcffDBJst9+++WAAw6o1TzrPfHEE5X2+nkBAAAAgJ1Xsw14P/axj1XaN9988yb7rFu3LrfeemuStx9yNmDAgFrNUSqVMnjw4CRvr9CdMWPGJvvNmDGjsoJ38ODBdV6Je+ONN1ba/fv3r9MYAAAAAEBxNNuA9+ijj84JJ5yQJBk7dmymT5++UZ9rr702c+fOTZJcdNFFadmy5QbHp0yZklKplFKplKFDh25ynosvvji77LJLkuTCCy9MdXX1Bserq6tz4YUXJkmqqqpy8cUXbzTGjBkzsmTJks1+LeVyOd/85jfzX//1X0mS9773vbVebQwAAAAAFE9VUxfQlEaNGpV+/fqluro6AwcOzOWXX54BAwakuro6d9xxR0aPHp0k6dmzZ0aMGFGnOXr27JlLL7003//+9zN79uz069cvX//613PwwQdnwYIFufrqqzNnzpwkyaWXXppDDjlkozH++Mc/5vvf/34++tGP5qSTTsqhhx6aTp06Zc2aNXnsscdy00035U9/+lOSpF27dvn5z39uP14AAAAAaAaadcB75JFHZvz48TnrrLOyfPnyXH755Rv16dmzZyZOnJiOHTvWeZ4rr7wyL730Um666abMmTMnn/70pzfqM2zYsHz3u9/d7Bhr1qzJb3/72/z2t7/dbJ93vetd+cUvfpG+ffvWuVYAAAAAoDiadcCbJKeddloee+yxjBo1KhMnTsyiRYvSqlWr9OjRI5/61Kfyla98Je3atduuOVq0aJGxY8fmE5/4REaPHp1Zs2Zl2bJl2XPPPdO3b9+cf/75Ofnkkzd7/rnnnpu9994706dPz2OPPZaXXnopL7/8cqqqqrLnnnvmfe97X0477bR89rOfTZs2bbarVgAAAACgOErlcrnc1EVQDIsWLUr37t2TJAsXLky3bt2auCJgew0bN6upSwCgAYwd6h1dAAA7oobI15rtQ9YAAAAAAIpOwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUFVNXQAAAFC/ho2b1dQlNImxQ/s2dQkAAI3OCl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUFVNXQBAUxs2blZTlwAAAABQJ1bwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAVlD14AAGCn0Jz31R87tG9TlwAANBEreAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBVTV1ATuC5557Ltdff30mTpyYhQsXpnXr1jn44INzxhln5J//+Z/Trl27epnnnnvuyejRozNr1qwsXbo0e+21V/r27ZsvfvGLOfnkk7dpjJqamowZMya33357nnzyyaxcuTJdu3bNhz/84Xz1q1/NYYcdVi+1AgAAxTFs3KymLqHJjB3at6lLAIAmVSqXy+WmLqIp3X333TnrrLOyfPnyTR7v2bNnJk6cmB49etR5jnXr1uWLX/xixo4du9k+w4cPz4033pgWLTa/qHrZsmU55ZRTMmvWpn95a926dX784x9n+PDhda51SxYtWpTu3bsnSRYuXJhu3bo1yDzQ2Jrz/xABABSdgBeAImmIfK1Zb9EwZ86cnHnmmVm+fHk6dOiQK6+8Mg8//HAmTZqU8847L0kyb968DBo0KCtWrKjzPP/yL/9SCXePPPLI/PKXv8zMmTPzy1/+MkceeWSSZMyYMfnmN7+52THeeuutDBkypBLufvzjH88999yTP/3pT7n++uvTpUuXrFmzJueff37uueeeOtcKAAAAABRHs17B+4EPfCBTp05NVVVVHnzwwRx77LEbHL/mmmty2WWXJUmuuOKKjBw5stZzzJs3L4cddlhqamrSp0+fPPjgg2nbtm3l+OrVq9O/f//Mnj07VVVVmTt37iZXC990000ZNmxYkuSCCy7IT37ykw2Oz58/P0cddVSWL1+eHj16ZO7cuamqqt8dOKzgZWdlBS8AQHFZwQtAkVjBW49mzpyZqVOnJkmGDRu2UbibJCNGjEjv3r2TJKNGjcratWtrPc+PfvSj1NTUJEluuOGGDcLdJGnXrl1uuOGGJG/vr3vddddtcpwf/vCHSZI99tgj11xzzUbHe/TokW984xtJ3g57f/Ob39S6VgAAAACgWJptwDthwoRK+9xzz91knxYtWuTss89Okrz22muZPHlyreYol8v57W9/myTp1atXjjnmmE32O+aYY/Lud787SfLb3/42/7ioet68eZk7d26S5IwzztjsQ9+GDh1aaQt4AQAAAGDnV7/v4S+Qhx56KEnSvn37HHXUUZvt179//0p72rRpGThw4DbP8cwzz+T555/faJzNzfPUU09l8eLFefbZZ3PggQduVOvWxtlnn33Ss2fPzJs3L9OmTdvmOgEAAIrKdlvNj205ADbUbAPe9Stie/ToscW9anv16rXROdvqiSee2OQ42zLPOwPe2o4zb968LFy4MKtWrUr79u23ud5FixZt8fjChQsr7SVLlmzzuLCjW/XKi01dAgAAsI229v+uADuyd2Zq67d13V7NMuB94403smzZsiTZ6kbGu+++e9q3b59Vq1ZtEHBui3f+0NnaPOs3V06y0Tx1GadcLmfRokWVrR+2xTtr2Jqjjz56m/sCAABAfRk/oqkrAKgfS5cuzQEHHLDd4zTLPXhXrFhRaXfo0GGr/devgl25cmWDzfPOlbb/OE99jQMAAAAA7Fya7Qre9Vq1arXV/q1bt06SVFdXN9g86+fY1Dz1Nc7WbG2F8htvvJEnn3wye++9d/baa68tbm0B22rJkiWVFeEzZ87Mvvvu28QVsbNzzdGYXG80Ntccjcn1RmNzzdGYXG80lJqamixdujRJcvjhh9fLmM0yoWvTpk2l/eabb261/5o1a5Ikbdu2bbB51s+xqXn+cZx3fl6bcbZma9s/JG/vWQwNZd99992m6xDqi2uOxuR6o7G55mhMrjcam2uOxuR6o77Vx7YM79Qst2jo2LFjpb0t2xisWrUqybZt51DXedbPsal56mscAAAAAGDn0iwD3jZt2qRz585Jtv70zVdffbUSmtbmIWTJhititzbPO7dH+Md56jJOqVTy1yUAAAAA2Mk1y4A3SQ499NAkyfz581NTU7PZfk8++WSl3bt37zrN8Y/j1HaeuozTvXv3DR64BgAAAADsfJptwHv88ccneXtLg0ceeWSz/R544IFKu1+/frWa48ADD0zXrl03GmdTHnzwwSTJfvvtt9E+HOtr3do4L7zwQubNm1enWgEAAACA4mm2Ae/HPvaxSvvmm2/eZJ9169bl1ltvTZJ06tQpAwYMqNUcpVIpgwcPTvL2ytoZM2Zsst+MGTMqK28HDx6cUqm0wfGePXtWVvX+6le/yurVqzc5zrhx4yrtIUOG1KpWAAAAAKB4mm3Ae/TRR+eEE05IkowdOzbTp0/fqM+1116buXPnJkkuuuiitGzZcoPjU6ZMSalUSqlUytChQzc5z8UXX5xddtklSXLhhRemurp6g+PV1dW58MILkyRVVVW5+OKLNznO1772tSTJK6+8kssuu2yj4wsWLMhVV12VJOnRo4eAFwAAAACagWYb8CbJqFGj0rZt29TU1GTgwIG56qqrMmPGjEyePDnnn39+JUjt2bNnRowYUac5evbsmUsvvTRJMnv27PTr1y/jx4/P7NmzM378+PTr1y+zZ89Oklx66aU55JBDNjnOOeecU9l24Sc/+Uk++clP5t57783MmTPz4x//OMcdd1yWL1+eFi1a5Prrr09VVVWd6gUAAAAAiqNULpfLTV1EU7r77rtz1llnZfny5Zs83rNnz0ycODE9evTY6NiUKVMq2zacc845G2yR8E7r1q3Leeedl5tuummzdQwbNiyjR49Oixabz9yXLVuWU045JbNmzdrk8datW+fHP/5xhg8fvtkxAAAAAICdR7NewZskp512Wh577LFccskl6dmzZ9q1a5dOnTqlT58+ufrqqzNnzpxNhru10aJFi4wdOzYTJ07M4MGD07Vr17Rq1Spdu3bN4MGD84c//CFjxozZYribJHvuuWcefvjh/PSnP83xxx+fzp07p02bNjnooINy3nnn5ZFHHhHuAgAAAEAz0uxX8AIAAAAAFFWzX8ELAAAAAFBUAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrAC9TZ7Nmz853vfCcDBw5Mt27d0rp163To0CE9e/bMueeem4ceeqhe5hk5cmRKpdI2fUyZMqVe5mTHtK3XwYknnlgv8/3yl7/MwIEDs88++6RNmzbZf//9c9ZZZ2X69On1Mj47rhNPPHGbr7ftuf+4vzUfL730Un7/+9/n29/+dk4++eTsueeelX/boUOH1nq8e+65J0OGDKn8/O3WrVuGDBmSe+65p17rXr16dX7wgx+kb9++2WOPPdK+ffv06tUrI0aMyHPPPVevc1F/6uN6W716de666658+ctfTt++fbP77runZcuW6dy5c4499tiMHDkyL7zwQr3Ue8ABB2zTffCAAw6ol/mof/VxzY0bN26bfyaOGzeuXupetmxZvv3tb+ef/umfsuuuu2bXXXfNP/3TP+Xb3/52Xn755XqZg4axvdfcs88+W+vf9bbnHuQ+R0OrauoCgGL6wAc+kKlTp270+ptvvpmnn346Tz/9dMaNG5ezzz47P//5z9OqVasmqBLqprq6Op/85Cfzhz/8YYPX//73v+f222/PL3/5y3z729/OFVdc0UQVsqNp0aJFDjnkkKYugx3Y3nvvXS/jrFu3Ll/84hczduzYDV5fvHhxFi9enAkTJmT48OG58cYb06LF9q3lmD9/fk455ZQ8/fTTG7z+1FNP5amnnsqYMWNy++2359RTT92ueah/23u9PfbYY+nXr19Wrly50bFXXnklM2bMyIwZM3Lddddl9OjROfPMM7drPoqvvu5xjelPf/pTPvaxj230h4rHH388jz/+eMaMGZMJEybk6KOPbqIK2ZKmuObe/e53N/qcsK0EvECdPP/880mSrl275lOf+lROOOGEvOtd78pbb72V6dOn59prr83ixYtz6623Zu3atfnFL35RL/M+/vjjWzx+4IEH1ss87Ni+/OUv54ILLtjs8fbt22/X+F/4whcq4e6AAQNy0UUXpWvXrnn88cfzve99LwsWLMjIkSOz77775otf/OJ2zcWO6eabb86qVau22OeJJ56ohBof+tCHst9++23XnO5vzce73vWu9OrVK/fdd1+tz/2Xf/mXSrh75JFH5rLLLsvBBx+cBQsW5Ac/+EHmzJmTMWPGZK+99sr3vve9Ote4YsWKDBo0qBLunnfeefn0pz+dtm3bZvLkybnqqquyfPnynHnmmZk2bVqOOOKIOs9Fw6rL9bZ8+fJKuNuvX7+ceuqp6dOnTzp37pylS5fmrrvuys9//vMsX748n/vc57Lrrrvm5JNP3u5aBw8enO9+97ubPW7BQDFszz1uvXvvvTddu3bd7PFu3brVeewkWbhwYU477bQsXbo0VVVV+T//5/9U/lj1+9//Pv/v//2/LFmyJKeddloeeeSR7Z6PhlWXa26//fbb6u9eSXLVVVdV/l/2nHPOqXON67nP0WDKAHUwaNCg8vjx48s1NTWbPL506dJyz549y0nKScoPPPBAnee64oorKuPQvK2/Dq644ooGm2PSpEmVeU477bSNrvGlS5eW3/Wud5WTlDt16lR+5ZVXGqwWdmyXXXZZ5Vq57bbb6jSG+1vz8e1vf7t89913l1944YVyuVwuP/PMM5V/+3POOWebxnjqqafKVVVV5STlPn36lFevXr3B8VWrVpX79OlTTlKuqqoqP/3003Wu91vf+lalvh/84AcbHZ82bVqllv79+9d5HhrG9l5v06ZNK59xxhnl//mf/9lsnwkTJpRLpVI5Sfnggw8ur1u3rs717r///rX6b4EdT33c426++ebKOc8880zDFVsulz//+c9X5vrVr3610fHx48fXun4aV31cc1tTU1NT7tq1azlJuWPHjhv93K0N9zkamj14gTr5/e9/nzPOOCO77LLLJo/vueeeufbaayuf33nnnY1VGmyXH/7wh0mSqqqq/PSnP93oGt9zzz1z9dVXJ0lee+21jBkzptFrpOmtW7cut99+e5KkQ4cO+fjHP97EFbGj+9d//deceuqp2/WW0h/96EepqalJktxwww1p27btBsfbtWuXG264IUlSU1OT6667rk7zrF27Ntdff32SpHfv3hkxYsRGfY477rgMGzYsSfLAAw9k1qxZdZqLhrG919txxx2X8ePH59BDD91sn8GDB1fufQsWLMicOXPqNBc7h/q4xzWWF154ofIz/CMf+Ug+9alPbdTnjDPOyEc+8pEkyW233VZv+01Tfxrjmvuv//qvyjtXP/nJT270cxd2JAJeoMEMGDCg0l6wYEETVgLbZsWKFZk0aVKS5MMf/vBm34738Y9/PLvuumuS5De/+U2j1ceOY9KkSVm8eHGSt3/hb9euXRNXxM6uXC7nt7/9bZKkV69eOeaYYzbZ75hjjqnsEfjb3/425XK51nNNnjw5r7/+epK33466ub183/kQG/fC5snvehTR7373u6xbty5Jcu6552623/p73Lp16/K73/2uMUpjB3PrrbdW2vWxPQM0JAEv0GDWrFlTaW9upS/sSGbNmpU333wzSdK/f//N9mvVqlUlXJk1a1bWrl3bKPWx43jnL/xnn312E1ZCc/HMM89UVhFt6f70zuOLFy/Os88+W+u5HnrooY3G2pQ+ffpU/rgxbdq0Ws9D8fldjyLa1nvcO4+5xzU/K1asyIQJE5IkBxxwQD7wgQ80bUGwFQJeoME88MADlXbv3r3rZcyBAwemS5cuadWqVbp06ZITTzwx3//+9/Pqq6/Wy/gUw69//esceuihadeuXTp27JhDDjkk55xzTiZPnrxd4z7xxBOVdq9evbbYd/3xmpqajZ4wz85t5cqVldWK+++/f0488cR6Gdf9jS2py/0pSebOndtgc1VVVaVHjx51nofiq+/f9R588MEcccQR6dixY9q1a5cDDzwwZ555ZiZMmFCn1egU17nnnpuuXbumVatW2XPPPXPMMcfkm9/8ZuXdM9tj/T1ut912yz777LPZfvvuu2/lHVvucc3PnXfemdWrVydJPv/5z6dUKtXLuO5zNBQBL9Ag1q1bl+9///uVz88444x6Gff+++/P0qVLs3bt2ixdujQPPPBAvvGNb+Sggw6qvHWVnd8TTzyRuXPnprq6OitXrsz8+fNz66235oMf/GCGDBlSeWtxbS1atKjS3trTkrt3715pL1y4sE7zUUz/+Z//mVWrViVJzjrrrHr7hd/9jS1pzPvT+rnat2+fTp06bdNcS5cu3WA1Jzu/v/zlL5k4cWKS5PDDD6+XgPeZZ57JX/7yl6xcuTLV1dV59tln86tf/SpDhgzJCSecUC/hHsUwZcqULFmyJGvXrs3LL7+cP/3pT7nyyivTo0eP3Hjjjds19vp73Nbupcn/3uP8rtf8NNS7tdznaChVTV0AsHO67rrrMnPmzCRv71d61FFHbdd4hx9+eD72sY/l6KOPTteuXbN27do89dRTuf3223Pffffltddeyyc+8YncfffdOfnkk+vjS2AH1K5du5x++un50Ic+lF69eqVDhw6VIOxnP/tZXn755UyYMCGDBw/O/fffn5YtW9Zq/BUrVlTaHTp02GLf9u3bV9orV66s3RdCodX3L/zub2yLxrw/rZ9ra/Nsaq7WrVvXej6KZ82aNRk+fHjeeuutJMmVV165XeO1atUqp59+egYOHJj3vOc92W233fLaa69l+vTp+fd///csXLgw06ZNy0knnZTp06dnt912q48vgx3QQQcdlI9//OM59thjK+Hq3/72t/znf/5n7rzzzrzxxhv50pe+lFKplC9+8Yt1mqMu9zi/6zUvf//73yvvUDjuuOMq71bZHu5zNLgyQD2bMmVKuaqqqpyk3KVLl/KLL764XeO9+uqrWzz+s5/9rJyknKTctWvXcnV19XbNx45rS9fCCy+8UD7yyCMr18KoUaNqPf4XvvCFyvkLFizYYt+xY8dW+t522221notiWrhwYblFixblJOVjjjlmu8dzf2u+nnnmmcq/7TnnnLPV/t/5zncq/SdNmrTFvpMmTar0/bd/+7da13bQQQeVk5S7d+++1b6f//znK3MtXLiw1nPROGp7vW3N8OHD63W8Ld0Lly9fXh44cGBlvksuuWS756Ph1eWae+2118rr1q3b7PG777673LJly3KScrt27cpLliypU23rf46fcMIJW+17wgknlJOUd9lllzrNReOpz/vclVdeWRnrZz/7Wb3U5z5HQ7NFA1Cv/ud//idDhgxJTU1N2rRpk1//+tfp0qXLdo25tbeHnn/++Rk2bFiS5Pnnn89//ud/btd87Li2dC3svffeufPOOyurdm+44YZaj9+mTZtKe/3D1jbnnW9Fbtu2ba3nopj+4z/+o/Lk7fp4mrL7G9uqMe9P6+fa2jz1MRfFc9VVV2XMmDFJkr59++YnP/nJdo+5pXthx44d86tf/Sp77LFHkmT06NHbdG1SPLvtttsWtz069dRT8+1vfztJsnr16owdO7ZO89TlHuf+1rzcdtttSZLWrVvnzDPPrJcx3edoaAJeoN4888wzGThwYF599dXssssuueOOOxrtaaPnn39+pf3OB37QvBx00EE56aSTkiTz58+vPHF+W3Xs2LHS3tpb8dbvwZps21v82Dk0xC/8W+P+RtK496f1c23LW5LdC5uXG2+8MZdffnmStx/A94c//GGDbToaym677ZZPf/rTSd6+5mbPnt3gc7Jj+uIXv1gJgev6M7Eu9zj3t+Zj5syZefLJJ5Mkp59++lb/GF9f3OfYXgJeoF48//zz+fCHP5znn38+pVIpN910UwYPHtxo8x966KGVto3pm7ftuRbe+bCNdz7QaFPe+bCNdz7QiJ3X7NmzK0/ePvXUU7P77rs3yrzubySNe39aP9eqVavy2muvbdNce+21l/13d3K//OUvc8EFFyRJ9t9//9x///3Zc889G21+90KSpEuXLuncuXOSul8H6+9xW7uXJv97j/O7XvPRUA9X2xbuc2wPAS+w3ZYtW5aTTjopf/vb35K8/db4xv5hWF9Psaf4tudaeOcvVev/cr85649XVVXlkEMOqfOcFMc7f+Gvj+0ZtpX7G0nd7k9J0rt37wabq6amJgsWLKjzPBTH7373u5x99tlZt25d9t1330yaNGmDPzo0BvdC1tvea2H9Pe7111/PCy+8sNl+S5YsyfLly5O4xzUXa9euzR133JHk7T8mfPSjH23U+d3n2B4CXmC7vP766/nIRz5SWdX2/e9/P//8z//c6HWsnz9Junbt2ujzs+PYnmuhb9++adWqVZItv+3vzTffzIwZMyrnrN/3l53XO3/h32uvvXLyySc32tzubyTJgQceWPn339rbkh988MEkyX777ZcDDjig1nMdf/zxlfaW5po9e3bl7cv9+vWr9TwUw6RJk3LGGWekpqYmnTt3zv3335+DDz640etwLyRJli5dmmXLliWp+3Wwrfe4dx5zj2seJk6cmJdffjlJ8tnPfjZVVVWNOr/7HNtDwAvU2erVqzNo0KD8+c9/TpL8y7/8S77+9a83SS033nhjpd2/f/8mqYGm98wzz+T+++9Pkhx88MHZb7/9anV+x44d86EPfShJ8l//9V+bfeveXXfdVVnRMWTIkO2omKK45557snTp0iSN/wu/+xvJ26t61m999OSTT1b+yPSPZsyYUVl1O3jw4DqtBjrxxBOz2267JUluueWWlMvlTfYbN25cpe1euHN6+OGHM3jw4KxZsya77bZb7r333hx22GGNXsfrr79e+SNbu3bt0qdPn0avgR3D6NGjK/ekuv5MPP3009OixdtRyM0337zZfuvvcS1atMjpp59ep7kolqZ6t1biPsf2E/ACdfLmm29myJAhmTZtWpLkoosuyne/+91ajzNu3LiUSqWUSqWMHDlyo+OPP/545s+fv8UxRo8eXXma8z777ON/MndSd999d2pqajZ7/MUXX8wnPvGJyhNn1+8T+E5bu96S5Gtf+1qSt996/M///M956623Nji+bNmyyh8yOnXqlOHDh9fly6Fg6rIfm/sb9e3iiy/OLrvskiS58MILU11dvcHx6urqXHjhhUne3j7m4osv3uQ4Q4cOrVybU6ZM2eh4q1at8tWvfjVJMnfu3Pzwhz/cqM/06dMrT7Dv379/+vbtW9cvix3Uo48+mkGDBmXVqlVp3759Jk6cmKOOOqrW45x44omV6+3ZZ5/d6Pgf//jHja7ld1q5cmXOOOOMyqq6YcOG2e95J/Tss89mzpw5W+zz+9//Pt/5zneSJG3bts255567yX5bu+b22WeffO5zn0uS3Hvvvbnzzjs36vPrX/869957b5Lk85//fPbZZ5/afDkU0CuvvJKJEycmSQ4//PAcccQR23yu+xw7gsZdbw7sND7zmc/kvvvuS5J88IMfzLBhw/LXv/51s/1btWqVnj171nqeRx55JMOHD8+AAQNy8skn5/DDD0/nzp1TU1OTJ598Mrfffnuljl122SWjR49ulKc50/guvPDCrF27Np/4xCdy7LHH5oADDkjbtm2zbNmyTJkyJTfeeGPlLXvHH398nbcK+eAHP5hPf/rTueOOO/K73/0uJ510Ui6++OJ07do1jz/+eK688sr8/e9/T5JcffXVjfagLZrOq6++mt///vdJkve85z153/veVy/jur81Lw899NAGgf76+1WSzJ8/f4PVsMnbIew/6tmzZy699NJ8//vfz+zZs9OvX798/etfz8EHH5wFCxbk6quvrgQkl1566XbtD37ppZdm/PjxmTdvXi677LLMnz8/n/70p9O2bdtMnjw53/ve91JTU5O2bdvmRz/6UZ3noWFs7/W2YMGCfOQjH6k8ZO+73/1udtttty3+rtelS5d06dKl1rV+//vfz+c+97l8/OMfz/HHH5+DDz44HTp0yOuvv56HH344P/vZzyo/d9/97ndv9g+0NK3tveaeffbZDBgwIMcee2xOO+20vPe9761cT3/7299y55135s4776ys3v3hD39Y63dqvdOVV16ZP/7xj1m6dGk+85nPZPbs2Tn11FOTvB0kX3vttUne3papLotYaHj18XP1ne64447KQpH6Xr3rPkejKAPUQZJafey///6bHOfmm2+u9Lniiiu2eHxLH507dy5PmDChYb9omtT++++/TdfCJz7xifKrr766yTG2dr2tt3r16vIpp5yy2TlatGixxfPZufz7v/975d/+Bz/4wTaf5/7GO51zzjm1+rm5OW+99Vb5C1/4whbPHTZsWPmtt97aplomT5682X5PP/10+ZBDDtnsPLvuumv57rvv3p5vCw1ke6+3bb0/vfNjcz8X+/fvX+nzzDPPbPH4lj769+9fXrRoUT1/p6gv23vNTZ48eZvOa9euXfnGG2/cYi1bu+bWmzFjRnmfffbZ7Fz77LNPecaMGdv7raGB1NfP1fXe//73l5OUd9lll/KSJUtqVYv7HDsCK3iBHdopp5ySsWPHZvr06ZkzZ05efPHFvPzyyymXy9ljjz3y3ve+Nx/96EczdOjQ7Lrrrk1dLg3olltuyQMPPJDp06fnb3/7W5YtW5bly5enQ4cO6d69e4477ricc845OfbYY7d7rrZt22bixIn5xS9+kXHjxuUvf/lLXnvttey999454YQT8pWvfKVe5qEYbrvttiRvr6Jd/5bO+uD+Rl20aNEiY8eOzSc+8YmMHj06s2bNyrJly7Lnnnumb9++Of/88+vtIYA9evTInDlz8pOf/CS//vWvM3/+/Lz55pvp3r17TjnllFx00UXZf//962Uumq8f/vCHmTRpUqZPn56nnnoqy5Yty2uvvZZ27dqla9euef/735/PfOYzGThwoCfM78SOOuqo/Md//EemT5+e2bNnZ8mSJVm2bFlqamqy++6757DDDsuHPvShDB8+vE4rxTfl/e9/fx5//PGMGjUqEyZMqLy1/sADD8zgwYNz8cUXp3PnzvUyFzu2p59+On/605+SJCeddFK9b8nhPkdjKJXLm3lqAgAAAAAAOzQPWQMAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAADsxIYOHZpSqZQDDjigqUvZ4RxwwAEplUoZOnRoU5cCAFBnAl4AABrdlClTUiqVKh9nnnnmVs9ZH1SWSqVGqBAAAIpBwAsAQJP79a9/nccff7ypy2AnYMUyANDcCHgBAGhy5XI5V1xxRVOXAQAAhSPgBQCgSe25555Jkt/85jeZM2dOE1cDAADFIuAFAKBJffWrX03r1q2TJN/+9rebuBoAACgWAS8AAE2qe/fu+eIXv5gk+f3vf5+ZM2fWaZx169blv//7v/O1r30t/fr1y5577pmWLVumU6dOOeKII/K1r30tf//737c4xoknnphSqZQTTzwxSTJ//vx86UtfykEHHZS2bdvmgAMOyLBhw/Lcc89tcN5f//rXnHvuuTnooIPSpk2bdO/ePV/+8pfz0ksvbVPtEyZMyKc+9am8613vSps2bdKpU6f06dMn//qv/5pXX321Tt+P2nr99ddz1VVXpV+/ftlrr73SqlWr7LvvvjnttNNy5513plwub/bc9Q+/GzlyZJJk1qxZ+cxnPpNu3bqldevW2W+//fL5z38+c+fO3Wodq1evzr/927/ln/7pn9K+fft07tw5xx9/fG666aaUy+UNHtA3ZcqUynkjR45MqVTKLbfckiR57rnnNniQ37Y8oO+pp57KeeedlwMOOCCtW7fO3nvvnSFDhmTGjBlb/wYCADSVMgAANLLJkyeXk5STlG+++eby888/X27btm05SXngwIGbPOecc86pnLMpV1xxReX45j7atWtXvuuuuzZbV//+/ctJyv379y/ff//95Y4dO25ynC5dupTnzp1bLpfL5V/84hflVq1abbLf/vvvX168ePFm53vllVfKH/zgB7dYc5cuXcrTp0+vxXd309+3/ffff7N9/uu//qvcuXPnLdZxyimnlFesWLHJ89f3ueKKK8o/+clPylVVVZv9/j/wwAObrWPhwoXlQw45ZLM1nHrqqeX77ruv8vnkyZMr527Lv/8/Xjv7779/OUn5nHPOKd91113ldu3abfKcXXbZpXzHHXfU6vsOANBYrOAFAKDJ7bvvvvnyl7+cJLnvvvvy0EMP1XqMmpqa7Lvvvrngggty2223Zdq0aXnkkUcyYcKEXHbZZenQoUNWr16dz372s1tdSfr888/njDPOSKdOnXLDDTfkT3/6U6ZOnZqLL744pVIpL730UoYPH55Zs2bl7LPPzsEHH5wxY8Zk5syZmTx5cj7/+c8neXsV6f/5P/9nk3OsWbMmH/7wh/Pf//3f2WWXXfL5z38+v/zlLzNjxoxMnTo1V155ZTp37pyXXnopp5xyykarhuvLtGnTcvLJJ+fll1/O3nvvne9+97u5++6788gjj+Tuu+/OWWedlST5wx/+kHPOOWeLY91777258MILc9hhh+Wmm27KrFmz8uCDD+aSSy5JixYtsnr16nz+85/Pm2++udG5a9euzaBBg/L0008nSQYNGpQJEyZk9uzZmTBhQk455ZT8/ve/z7e+9a1Nzn3BBRfk8ccfz+DBg5MkXbt2zeOPP77Rx6Y8/vjj+exnP5u99947P/7xjzNjxoxMnz49I0eOTJs2bfLWW2/li1/8YpYuXbrN31cAgEbT1AkzAADNzz+u4C2Xy+UXX3yx3L59+3KS8oABAzY6Z2sreJ955pnym2++udk5Fy5cWN5vv/3KScpnnXXWJvv8f+3df0xV9R/H8ReGXEiv3HCwwdCsRpkZVBYyXbYh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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "image/png": {
+ "height": 371,
+ "width": 700
+ }
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# KDE plot of name lengths\n",
+ "plt.figure(figsize=(8, 4))\n",
+ "plt.hist([len(name) for name in names], bins=range(1, 20), density=True, alpha=0.7)\n",
+ "plt.xlabel('Name length')\n",
+ "plt.ylabel('Density')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "be610546",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['^abhishek$', '^aman$', '^harsh$', '^ayush$', '^aditi$']"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Attach START and END tokens to each name. Need to add these two to the vocabulary.\n",
+ "start_symbol = '^'\n",
+ "end_symbol = '$'\n",
+ "\n",
+ "names = [start_symbol + name + end_symbol for name in names]\n",
+ "names[:5]\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "ba6f75fd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['$', '^', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 28\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Find unique characters in the dataset\n",
+ "vocab = set(''.join(names))\n",
+ "vocab = sorted(vocab)\n",
+ "print(vocab, len(vocab))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "e27963c8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create a d dimensional lookup table for each character in the vocabulary\n",
+ "class CharTable:\n",
+ " def __init__(self, vocab):\n",
+ " self.vocab = vocab\n",
+ " self.char2index = {c: i for i, c in enumerate(vocab)}\n",
+ " self.index2char = {i: c for i, c in enumerate(vocab)}\n",
+ " self.vocab_size = len(vocab)\n",
+ " \n",
+ " def encode(self, name):\n",
+ " return torch.tensor([self.char2index[c] for c in name])\n",
+ " \n",
+ " def decode(self, tensor):\n",
+ " if type(tensor) == torch.Tensor:\n",
+ " tensor = tensor.cpu().numpy()\n",
+ " return ''.join([self.index2char[i] for i in tensor])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "4f38b691",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ct = CharTable(vocab)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f9113c55",
+ "metadata": {},
+ "source": [
+ "Let us process the first name in the dataset "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "b63bb74d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# create embedding layer\n",
+ "class CharEmbedding(nn.Module):\n",
+ " def __init__(self, vocab_size, embed_size):\n",
+ " super(CharEmbedding, self).__init__()\n",
+ " self.embedding = nn.Embedding(vocab_size, embed_size)\n",
+ " \n",
+ " def forward(self, x):\n",
+ " return self.embedding(x)\n",
+ "\n",
+ "embedding_dim = 4\n",
+ "char_embedding = CharEmbedding(ct.vocab_size, embedding_dim )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "eba870c4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "^abhishek$ tensor([ 1, 2, 3, 9, 10, 20, 9, 6, 12, 0]) ^abhishek$ tensor([[ 1.5891, 0.8863, 0.5558, -1.0004],\n",
+ " [ 2.4161, 0.1106, -0.5029, 1.6437],\n",
+ " [-0.0986, 0.0308, 0.2803, 1.6360],\n",
+ " [ 1.7311, 0.3999, -0.1855, 0.4308],\n",
+ " [-2.3946, 0.0651, -0.9694, 1.3782],\n",
+ " [ 0.3705, 0.3209, -0.7172, -1.1866],\n",
+ " [ 1.7311, 0.3999, -0.1855, 0.4308],\n",
+ " [ 2.0051, -0.9762, -0.5970, -0.0305],\n",
+ " [ 0.8369, 0.1552, 0.2730, 0.1157],\n",
+ " [ 1.1796, 0.8084, -0.7100, 0.0446]], grad_fn=)\n"
+ ]
+ }
+ ],
+ "source": [
+ "name = names[0]\n",
+ "\n",
+ "encoding = ct.encode(name)\n",
+ "print(name, encoding, ct.decode(encoding), char_embedding(encoding))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "df8b8f38",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "torch.Size([10, 4])\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(char_embedding(encoding).shape)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "9b81e142",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "xs=[]\n",
+ "for i in range(len(name)):\n",
+ " xs.append(char_embedding(ct.encode(name[i])))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "a569105d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "length_name = len(name)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "8fdad8b3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "d = 4\n",
+ "val_linear = nn.Linear(d, d)\n",
+ "\n",
+ "query_linear = nn.Linear(d, d)\n",
+ "key_linear = nn.Linear(d, d)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "79cdc3b3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vs = []\n",
+ "for i in range(length_name):\n",
+ " vs.append(val_linear(xs[i]))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "a789b442",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[tensor([[-0.3461, -0.2448, -0.9961, -0.9596]], grad_fn=),\n",
+ " tensor([[ 1.5822, -0.3118, -0.5811, -1.5842]], grad_fn=),\n",
+ " tensor([[ 0.6367, -0.1960, -0.6915, -0.9352]], grad_fn=),\n",
+ " tensor([[ 0.6783, -0.3742, -0.6622, -1.1489]], grad_fn=),\n",
+ " tensor([[ 0.2293, -1.0647, 0.0114, 0.0629]], grad_fn=),\n",
+ " tensor([[-0.2407, -0.8153, -0.2297, -0.0817]], grad_fn=),\n",
+ " tensor([[ 0.6783, -0.3742, -0.6622, -1.1489]], grad_fn=),\n",
+ " tensor([[ 1.0542, -0.1283, -0.1633, -0.4887]], grad_fn=),\n",
+ " tensor([[ 0.2097, -0.1923, -0.7083, -0.7685]], grad_fn=),\n",
+ " tensor([[ 0.3976, -0.8262, -0.4771, -0.9123]], grad_fn=)]"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "vs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "e40dd109",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qs = []\n",
+ "for i in range(length_name):\n",
+ " qs.append(query_linear(xs[i]))\n",
+ "\n",
+ "ks = []\n",
+ "for i in range(length_name):\n",
+ " ks.append(key_linear(xs[i]))\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "6ffcd4d9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[tensor([[-0.5431, -0.8826, -2.0655, 0.3620]], grad_fn=),\n",
+ " tensor([[ 0.2952, -0.6107, -0.4607, 1.6180]], grad_fn=),\n",
+ " tensor([[0.3232, 0.1415, 0.1938, 0.1639]], grad_fn=),\n",
+ " tensor([[-0.0149, -0.6881, -0.9877, 0.9795]], grad_fn=),\n",
+ " tensor([[ 1.0182, 0.6256, 1.4679, -0.5539]], grad_fn=),\n",
+ " tensor([[-0.2207, -0.9287, -0.9676, 0.4366]], grad_fn=),\n",
+ " tensor([[-0.0149, -0.6881, -0.9877, 0.9795]], grad_fn=),\n",
+ " tensor([[-0.6503, -1.5170, -0.6902, 1.8153]], grad_fn=),\n",
+ " tensor([[-0.2690, -0.6013, -0.9059, 0.4749]], grad_fn=),\n",
+ " tensor([[ 0.2936, -0.5395, -0.8663, 0.6923]], grad_fn=)]"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "qs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "17100afd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[tensor([[-0.0686, -0.6523, -0.3398, -0.2891]], grad_fn=),\n",
+ " tensor([[-1.8098, -0.3927, -0.2086, 0.4891]], grad_fn=),\n",
+ " tensor([[-0.5030, 0.1248, -0.1280, -0.0116]], grad_fn=),\n",
+ " tensor([[-0.9497, -0.3944, -0.1638, 0.1935]], grad_fn=),\n",
+ " tensor([[0.2378, 0.7928, 0.6968, 0.3017]], grad_fn=),\n",
+ " tensor([[-0.0548, 0.0063, 0.2924, 0.2715]], grad_fn=),\n",
+ " tensor([[-0.9497, -0.3944, -0.1638, 0.1935]], grad_fn=),\n",
+ " tensor([[-1.5675, 0.1323, -0.1190, 0.7133]], grad_fn=),\n",
+ " tensor([[-0.4218, -0.1489, -0.2049, -0.0142]], grad_fn=),\n",
+ " tensor([[-0.5909, -0.3664, 0.1543, 0.2502]], grad_fn=)]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ks"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "53f1a8be",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "attns = torch.zeros(length_name, length_name)\n",
+ "for i in range(length_name):\n",
+ " for j in range(length_name):\n",
+ " attns[i, j] = torch.matmul(qs[i], ks[j].T)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "5040c6f4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tensor([[ 1.2102, 1.9374, 0.4234, 1.2723, -2.1590, -0.4814, 1.2723, 1.2385,\n",
+ " 0.7785, 0.4162],\n",
+ " [ 0.0670, 0.5930, -0.1845, 0.3490, -0.2468, 0.2845, 0.3490, 0.6654,\n",
+ " 0.0378, 0.3831],\n",
+ " [-0.2277, -0.6008, -0.1716, -0.3628, 0.3736, 0.0843, -0.3628, -0.3941,\n",
+ " -0.1994, -0.1719],\n",
+ " [ 0.5024, 0.9822, 0.0367, 0.6368, -0.9418, -0.0264, 0.6368, 0.7484,\n",
+ " 0.2971, 0.3536],\n",
+ " [-0.8166, -2.6654, -0.6156, -1.5613, 1.5939, 0.2270, -1.5613, -2.0829,\n",
+ " -0.8154, -0.7429],\n",
+ " [ 0.8236, 1.1794, 0.1140, 0.8188, -1.3313, -0.1581, 0.8188, 0.6496,\n",
+ " 0.4234, 0.4306],\n",
+ " [ 0.5024, 0.9822, 0.0367, 0.6368, -0.9418, -0.0264, 0.6368, 0.7484,\n",
+ " 0.2971, 0.3536],\n",
+ " [ 0.7440, 2.8044, 0.2052, 1.6802, -1.2906, 0.3171, 1.6802, 2.1955,\n",
+ " 0.6157, 1.2878],\n",
+ " [ 0.5812, 1.1442, 0.1708, 0.7329, -1.0286, -0.1250, 0.7329, 0.7886,\n",
+ " 0.3818, 0.3583],\n",
+ " [ 0.4260, 0.1997, -0.1121, 0.2098, -0.7526, -0.0848, 0.2098, 0.0653,\n",
+ " 0.1241, 0.0637]], grad_fn=)"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "attns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "d32c2a4c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tensor([[0.1250, 0.2586, 0.0569, 0.1330, 0.0043, 0.0230, 0.1330, 0.1286, 0.0812,\n",
+ " 0.0565],\n",
+ " [0.0816, 0.1381, 0.0634, 0.1082, 0.0596, 0.1014, 0.1082, 0.1484, 0.0792,\n",
+ " 0.1119],\n",
+ " [0.0942, 0.0649, 0.0996, 0.0823, 0.1718, 0.1287, 0.0823, 0.0798, 0.0969,\n",
+ " 0.0996],\n",
+ " [0.1074, 0.1735, 0.0674, 0.1228, 0.0253, 0.0633, 0.1228, 0.1374, 0.0875,\n",
+ " 0.0925],\n",
+ " [0.0508, 0.0080, 0.0622, 0.0241, 0.5664, 0.1444, 0.0241, 0.0143, 0.0509,\n",
+ " 0.0547],\n",
+ " [0.1318, 0.1882, 0.0648, 0.1312, 0.0153, 0.0494, 0.1312, 0.1108, 0.0883,\n",
+ " 0.0890],\n",
+ " [0.1074, 0.1735, 0.0674, 0.1228, 0.0253, 0.0633, 0.1228, 0.1374, 0.0875,\n",
+ " 0.0925],\n",
+ " [0.0451, 0.3538, 0.0263, 0.1149, 0.0059, 0.0294, 0.1149, 0.1924, 0.0396,\n",
+ " 0.0776],\n",
+ " [0.1076, 0.1890, 0.0714, 0.1253, 0.0215, 0.0531, 0.1253, 0.1325, 0.0882,\n",
+ " 0.0861],\n",
+ " [0.1422, 0.1134, 0.0830, 0.1145, 0.0438, 0.0853, 0.1145, 0.0991, 0.1051,\n",
+ " 0.0990]], grad_fn=)"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# applt softmax to get attention weights\n",
+ "attns = F.softmax(attns, dim=-1)\n",
+ "attns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "dfe5e1de",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.15"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/posts/2024-rnn.ipynb b/posts/2024-rnn.ipynb
new file mode 100644
index 0000000..d760ffa
--- /dev/null
+++ b/posts/2024-rnn.ipynb
@@ -0,0 +1,900 @@
+{
+ "cells": [
+ {
+ "cell_type": "raw",
+ "id": "12a1fd37",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "---\n",
+ "author: Nipun Batra\n",
+ "badges: true\n",
+ "categories:\n",
+ "- ML\n",
+ "date: '2024-5-30'\n",
+ "title: RNN\n",
+ "toc: true\n",
+ "\n",
+ "---\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "c1e75d2d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "%config InlineBackend.figure_format = 'retina'\n",
+ "import torch\n",
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "from einops import rearrange, reduce, repeat"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "88b73e31",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "--2024-05-30 09:41:48-- https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt\n",
+ "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.108.133, ...\n",
+ "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 8752 (8.5K) [text/plain]\n",
+ "Saving to: ‘names-indian.txt’\n",
+ "\n",
+ "names-indian.txt 100%[===================>] 8.55K --.-KB/s in 0s \n",
+ "\n",
+ "2024-05-30 09:41:49 (33.8 MB/s) - ‘names-indian.txt’ saved [8752/8752]\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "!wget https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt -O names-indian.txt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "0821eb9b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Abhishek | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Aman | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Harsh | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Ayush | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Aditi | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 1160 | \n",
+ " Prasoon | \n",
+ "
\n",
+ " \n",
+ " 1161 | \n",
+ " Madhusudan | \n",
+ "
\n",
+ " \n",
+ " 1162 | \n",
+ " Prastuti | \n",
+ "
\n",
+ " \n",
+ " 1163 | \n",
+ " Rampratap | \n",
+ "
\n",
+ " \n",
+ " 1164 | \n",
+ " Madhukar | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1165 rows × 1 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 0\n",
+ "0 Abhishek\n",
+ "1 Aman\n",
+ "2 Harsh\n",
+ "3 Ayush\n",
+ "4 Aditi\n",
+ "... ...\n",
+ "1160 Prasoon\n",
+ "1161 Madhusudan\n",
+ "1162 Prastuti\n",
+ "1163 Rampratap\n",
+ "1164 Madhukar\n",
+ "\n",
+ "[1165 rows x 1 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "pd.read_csv('names-indian.txt', header=None)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "a3cc557e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# convert all names to lowercase\n",
+ "names = pd.read_csv('names-indian.txt', header=None)[0].str.lower().values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "562eb3c2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['abhishek', 'aman', 'harsh', ..., 'prastuti', 'rampratap',\n",
+ " 'madhukar'], dtype=object)"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "e23abf7d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Text(0, 0.5, 'Density')"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAALmCAYAAAD4wPyKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AABy40lEQVR4nOzde5iWVb0//veDwxkURVER8oQEmjtNMBUNqaQUleigHUwxMMudqV/Svrkr2e3MzPwaWu0kUNRtSbmNMjJ1s0ERIcAwbYsipAaICp44jcjI8/vDH8+WOM4wB27m9bquua41z73utT4z3N4zvmc96y6Vy+VyAAAAAAAonBZNXQAAAAAAAHUj4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKCqmroAiuONN97I448/niTZa6+9UlXl8gEAAACAbVVTU5OlS5cmSQ4//PC0adNmu8eU0LHNHn/88Rx99NFNXQYAAAAAFN7MmTPTt2/f7R7HFg0AAAAAAAVlBS/bbK+99qq0Z86cmX333bcJqwEAAACAYlmyZEnlHfLvzNq2h4CXbfbOPXf33XffdOvWrQmrAQAAAIDiqq/nW9miAQAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACioqqYuAABoPMPGzWrqEprM2KF9m7oEAACAemcFLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAt4kzz33XEaMGJFevXqlffv22WOPPdK3b99cc801Wb169XaNvXr16tx111358pe/nL59+2b33XdPy5Yt07lz5xx77LEZOXJkXnjhha2Oc+KJJ6ZUKm3TBwAAAADQPFQ1dQFN7e67785ZZ52V5cuXV15bvXp1Zs+endmzZ2fMmDGZOHFievToUeuxH3vssfTr1y8rV67c6Ngrr7ySGTNmZMaMGbnuuusyevTonHnmmdv1tQAAAAAAzUuzDnjnzJmTM888M9XV1enQoUO+8Y1vZMCAAamurs4dd9yRn//855k3b14GDRqU2bNnp2PHjrUaf/ny5ZVwt1+/fjn11FPTp0+fdO7cOUuXLs1dd92Vn//851m+fHk+97nPZdddd83JJ5+8xTH79OmTm2++uc5fMwAAAACw82jWAe9FF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFmr8Vu0aJEzzjgjV1xxRQ499NCNjg8cODAnn3xyhgwZkrfeeisXXnhhnn766S1us9C+ffu85z3vqVUdAAAAAMDOqdnuwTtz5sxMnTo1STJs2LANwt31RowYkd69eydJRo0albVr19ZqjuOOOy7jx4/fZLi73uDBg/Pxj388SbJgwYLMmTOnVnMAAAAAAM1Xsw14J0yYUGmfe+65m+zTokWLnH322UmS1157LZMnT26QWgYMGFBpL1iwoEHmAAAAAAB2Ps024H3ooYeSvL3lwVFHHbXZfv3796+0p02b1iC1rFmzptLeZZddGmQOAAAAAGDn02z34J07d26SpEePHqmq2vy3oVevXhudU98eeOCBSnv9lhCb8+STT+b9739/nnrqqbzxxhvZc889c9RRR+UTn/hEPvOZz6Rly5Z1rmPRokVbPL5kyZI6jw0AAAAA1L9mGfC+8cYbWbZsWZKkW7duW+y7++67p3379lm1alUWLlxY77X85S9/ycSJE5Mkhx9++FYD3hdffDEvvvhi5fPFixdn8eLF+d3vfperr746d95551bH2Jzu3bvX6TwAAAAAoGk0y4B3xYoVlXaHDh222n99wLty5cp6rWPNmjUZPnx43nrrrSTJlVdeudm+LVq0yIc+9KGccsopee9735vOnTtnxYoV+fOf/5wbb7wxc+fOzRNPPJEBAwZk5syZede73lWvtQIAAAAAO55mGfC+8cYblXarVq222r9169ZJkurq6nqt4ytf+Upmz56dJDnnnHNy2mmnbbbvXXfdlU6dOm30+gknnJALLrgg5513Xm655Za8+OKLufjii3PXXXfVup6trVBesmRJjj766FqPCwAAAAA0jGYZ8LZp06bSfvPNN7faf/1D0Nq2bVtvNVx11VUZM2ZMkqRv3775yU9+ssX+mwp312vZsmXGjBmTGTNm5KmnnspvfvObLF68OPvtt1+tatradhUAAAAAwI6lRVMX0BQ6duxYaW/LtgurVq1Ksm3bOWyLG2+8MZdffnmStx/i9oc//CHt27ffrjGrqqoybNiwyufvfHAbAAAAALBzapYBb5s2bdK5c+ckyaJFi7bY99VXX60EvPXxELJf/vKXueCCC5Ik+++/f+6///7sueee2z1ukhx66KGV9uLFi+tlTAAAAABgx9UsA97kf8PQ+fPnp6amZrP9nnzyyUq7d+/e2zXn7373u5x99tlZt25d9t1330yaNKlet0UolUr1NhYAAAAAsONrtgHv8ccfn+Tt7RceeeSRzfZ751YH/fr1q/N8kyZNyhlnnJGampp07tw5999/fw4++OA6j7cpTzzxRKXdtWvXeh0bAAAAANjxNNuA92Mf+1ilffPNN2+yz7p163LrrbcmefshZwMGDKjTXA8//HAGDx6cNWvWZLfddsu9996bww47rE5jbU5NTU1uuummyucf+MAH6nV8AAAAAGDH02wD3qOPPjonnHBCkmTs2LGZPn36Rn2uvfbazJ07N0ly0UUXpWXLlhscnzJlSkqlUkqlUoYOHbrJeR599NEMGjQoq1atSvv27TNx4sQcddRRtap18uTJee211zZ7fO3atRk+fHil1tNOO61e9gsGAAAAAHZsVU1dQFMaNWpU+vXrl+rq6gwcODCXX355BgwYkOrq6txxxx0ZPXp0kqRnz54ZMWJErcdfsGBBPvKRj1TC2e9+97vZbbfd8te//nWz53Tp0iVdunTZ4LVbbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVetaAQAAAIDiadYB75FHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOvxp06dmpdeeqny+SWXXLLVc6644oqMHDlyo9dXrlyZX/ziF/nFL36x2XMPP/zw3HHHHTnwwANrXSsAAAAAUDzNOuBN3t7O4LHHHsuoUaMyceLELFq0KK1atUqPHj3yqU99Kl/5ylfSrl27Jq3x61//eo444ohMnz49TzzxRJYuXZpXXnklrVu3zt57750+ffrkk5/8ZIYMGZJddtmlSWsFAAAAABpPqVwul5u6CIph0aJFlb19Fy5cmG7dujVxRQDU1rBxs5q6hCYzdmjfpi4BAABo5hoiX2u2D1kDAAAAACg6AS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoKqaugAAaArDxs1q6hIAAABgu1nBCwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4kzz33HMZMWJEevXqlfbt22ePPfZI3759c80112T16tXbNfbq1atz11135ctf/nL69u2b3XffPS1btkznzp1z7LHHZuTIkXnhhRdqNd4PfvCD9O3bN3vssUfat2+fXr16ZcSIEXnuuee2q1YAAAAAoFhK5XK53NRFNKW77747Z511VpYvX77J4z179szEiRPTo0ePWo/92GOPpV+/flm5cuUW++26664ZPXp0zjzzzC32mz9/fk455ZQ8/fTTmx3n9ttvz6mnnlrrWrfFokWL0r179yTJwoUL061btwaZB6AxDBs3q6lLoJGNHdq3qUsAAACauYbI15r1Ct45c+bkzDPPzPLly9OhQ4dceeWVefjhhzNp0qScd955SZJ58+Zl0KBBWbFiRa3HX758eSXc7devX6666qrcf//9+fOf/5x77703559/flq0aJHly5fnc5/7XO65557NjrVixYoMGjSoEu6ed955mTRpUh5++OFceeWV6dChQ5YvX54zzzwzjz76aO2/GQAAAABA4VQ1dQFN6aKLLkp1dXWqqqpy33335dhjj60c++AHP5hDDjkkl112WebNm5drr702I0eOrNX4LVq0yBlnnJErrrgihx566EbHBw4cmJNPPjlDhgzJW2+9lQsvvDBPP/10SqXSRn2vueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRdnypQptaoVAAAAACieZruCd+bMmZk6dWqSZNiwYRuEu+uNGDEivXv3TpKMGjUqa9eurdUcxx13XMaPH7/JcHe9wYMH5+Mf/3iSZMGCBZkzZ85GfdauXZvrr78+SdK7d++MGDFik3MNGzYsSfLAAw9k1ixvPQYAAACAnV2zDXgnTJhQaZ977rmb7NOiRYucffbZSZLXXnstkydPbpBaBgwYUGkvWLBgo+OTJ0/O66+/niQ555xz0qLFpv/Zhg4dWmn/5je/qd8iAQAAAIAdTrMNeB966KEkSfv27XPUUUdttl///v0r7WnTpjVILWvWrKm0d9lll42Or6/1H+v5R3369Em7du2SNFytAAAAAMCOo9kGvHPnzk2S9OjRI1VVm9+KuFevXhudU98eeOCBSnv9lhDv9MQTT2yynn9UVVWVHj16JGm4WgEAAACAHUezfMjaG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9V7LX/7yl0ycODFJcvjhh28y4F20aFGSt1cbd+rUaYvjde/ePY899liWLl2aNWvWpHXr1ttcy/p5NmfJkiXbPBYAAAAA0PCaZcC7YsWKSrtDhw5b7b8+4F25cmW91rFmzZoMHz48b731VpLkyiuv3GS/9fVua63rrVy5slYBb/fu3be5LwAAAADQ9JrlFg1vvPFGpd2qVaut9l8fklZXV9drHV/5ylcye/bsJG8/PO20007bZL/19dam1qT+6wUAAAAAdizNcgVvmzZtKu0333xzq/3XPwStbdu29VbDVVddlTFjxiRJ+vbtm5/85Ceb7bu+3trUmtS+3q1tQbFkyZIcffTRtRoTAAAAAGg4zTLg7dixY6W9LdsurFq1Ksm2bZGwLW688cZcfvnlSd5+aNof/vCHDbZW+Efr661NrUnt693afsQAAAAAwI6lWW7R0KZNm3Tu3DnJ1h8s9uqrr1ZC0/rYo/aXv/xlLrjggiTJ/vvvn/vvvz977rnnFs9ZH7yuWrUqr7322hb7rl+Fu9dee9Vq/10AAAAAoHiaZcCbJIceemiSZP78+ampqdlsvyeffLLS7t2793bN+bvf/S5nn3121q1bl3333TeTJk3aplWz62v9x3r+UU1NTRYsWFAvtQIAAAAAO75mG/Aef/zxSd5eFfvII49stt8DDzxQaffr16/O802aNClnnHFGampq0rlz59x///05+OCDa1XrP9bzj2bPnl1Zbbw9tQIAAAAAxdAs9+BNko997GO56qqrkiQ333xz3v/+92/UZ926dbn11luTJJ06dcqAAQPqNNfDDz+cwYMHZ82aNdltt91y77335rDDDtvm80888cTstttuef3113PLLbfksssuS6lU2qjfuHHjKu0hQ4bUqVYA2FkNGzerqUtoEmOH9m3qEgAAgAbUbFfwHn300TnhhBOSJGPHjs306dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0E3O8+ijj2bQoEFZtWpV2rdvn4kTJ+aoo46qVa2tWrXKV7/61STJ3Llz88Mf/nCjPtOnT8/YsWOTJP3790/fvv5nDgAAAAB2ds12BW+SjBo1Kv369Ut1dXUGDhyYyy+/PAMGDEh1dXXuuOOOjB49OknSs2fPjBgxotbjL1iwIB/5yEcqD0b77ne/m9122y1//etfN3tOly5d0qVLl41ev/TSSzN+/PjMmzcvl112WebPn59Pf/rTadu2bSZPnpzvfe97qampSdu2bfOjH/2o1rUCAAAAAMXTrAPeI488MuPHj89ZZ52V5cuX5/LLL9+oT8+ePTNx4sR07Nix1uNPnTo1L730UuXzSy65ZKvnXHHFFRk5cuRGr3fs2DETJ07MKaeckqeffjqjR4+uBNDr7brrrrn99ttzxBFH1LpWAAAAAKB4mu0WDeuddtppeeyxx3LJJZekZ8+eadeuXTp16pQ+ffrk6quvzpw5c9KjR4+mLjNJ0qNHj8yZMydXX311+vTpk06dOqVdu3Z597vfnUsuuSSPPfZYTj311KYuEwAAAABoJKVyuVxu6iIohkWLFqV79+5JkoULF6Zbt25NXBFA3TXXB27R/HjIGgAA7DgaIl9r9it4AQAAAACKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQTV6wPuVr3wlc+bMaexpAQAAAAB2Oo0e8P70pz9Nnz59cuSRR+aGG27IK6+80tglAAAAAADsFBo94G3ZsmXK5XL+8pe/5OKLL85+++2XM888M3/84x9TLpcbuxwAAAAAgMJq9IB3yZIl+dGPfpQjjjgi5XI5a9asyZ133plBgwZl//33z7e+9a0sWLCgscsCAAAAACicRg9499hjj3z1q1/Nn//85/z5z3/OV77yleyxxx4pl8tZtGhRvve976Vnz5458cQTc9ttt6W6urqxSwQAAAAAKIRGD3jf6Ygjjsj111+f559/Pr/+9a9z8sknp0WLFimXy5k6dWqGDh2afffdN+eff35mzJjRlKUCAAAAAOxwmjTgXa9ly5b5xCc+kYkTJ+bvf/97vve97+WQQw5JuVzO8uXLM2bMmPTr1y+HHXZYrr322rz00ktNXTIAAAAAQJPbIQLed9p3333zf//v/82TTz6Ze+65J/vss0+SpFwu58knn8xll12W7t2759Of/nQeffTRpi0WAAAAAKAJ7XABb5I8+OCDOffcc/PJT34yL774YsrlcpKkffv2KZfLWbt2bX7961+nT58+ueiii7Ju3bomrhgAAAAAoPHtMAHvwoUL893vfjc9evTIgAEDcuutt2bVqlVJkpNOOinjx4/Pyy+/nHnz5uXrX/96dt9996xbty4//vGP8+Mf/7iJqwcAAAAAaHxNGvCuWbMmv/zlLzNw4MAceOCBueKKK/K3v/0t5XI5++23X771rW/lb3/7W+6999586lOfSsuWLdOjR49cddVVWbBgQU488cSUy+WMHj26Kb8MAAAAAIAmUdUUk86cOTM333xzxo8fn9dffz3J23vstmzZMqeeemqGDx+ej370oymVSpsdY7fddsu//uu/pn///lmwYEFjlQ4AAAAAsMNo9ID3sMMOy5NPPpkklb11e/bsmWHDhuWcc85Jly5dtnmsrl27JknefPPN+i8UAAAAAGAH1+gB79y5c5Mkbdu2zSc/+ckMHz48J5xwQp3G2nXXXXP22WdvcaUvAAAAAMDOqtED3iOPPDLDhw/P5z73uey6667bNdZee+2VcePG1U9hAAAAAAAF0+gB7yOPPNLYUwIAAAAA7JRaNPaE3/nOd/Kd73wny5Yt2+ZzXn311cp5DeG5557LiBEj0qtXr7Rv3z577LFH+vbtm2uuuSarV6/errHXrVuXJ554IuPGjcsFF1yQvn37pnXr1imVSimVSpkyZco2jXPiiSdWztnaBwAAAADQPDT6Ct6RI0emVCrlk5/8ZPbcc89tOueVV16pnPftb3+7Xuu5++67c9ZZZ2X58uWV11avXp3Zs2dn9uzZGTNmTCZOnJgePXrUafzbbrstQ4cOradqAQAAAAD+V6MHvDuSOXPm5Mwzz0x1dXU6dOiQb3zjGxkwYECqq6tzxx135Oc//3nmzZuXQYMGZfbs2enYsWOt5yiXy5V2y5Ytc/jhh2ft2rV5/PHH61Rznz59cvPNN9fpXAAAAABg51KIgHft2rVJ3g5I69NFF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFnrOQ499NBcf/316du3b4444oi0adMmI0eOrHPA2759+7znPe+p07kAAAAAwM6l0ffgrYtHH300SbLXXnvV25gzZ87M1KlTkyTDhg3bINxdb8SIEendu3eSZNSoUZWguTaOPvroXHjhhTnmmGPSpk2b7SsaAAAAAOAdGnwF76233rrJ13/7299m9uzZWzx3zZo1WbBgQW666aaUSqX07du33uqaMGFCpX3uuedusk+LFi1y9tln5xvf+EZee+21TJ48OQMHDqy3GgAAAAAAtkeDB7xDhw5NqVTa4LVyuZxvfvOb2zxGuVxOixYtctFFF9VbXQ899FCSt7c8OOqoozbbr3///pX2tGnTBLwAAAAAwA6jUbZoKJfLlY9Nvbalj5YtW6Zfv3753e9+t0HYur3mzp2bJOnRo0eqqjafc/fq1Wujc5rSk08+mfe///3p1KlT2rRpk27dumXw4MG59dZb67SFBAAAAABQXA2+gveZZ56ptMvlcg466KCUSqXce++9OeSQQzZ7XqlUSps2bdK5c+fssssu9VrTG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9VpHXbz44ot58cUXK58vXrw4ixcvzu9+97tcffXVufPOOyv7BtfWokWLtnh8yZIldRoXAAAAAGgYDR7w7r///pt8vWvXrps91tBWrFhRaXfo0GGr/dcHvCtXrmzIsraoRYsW+dCHPpRTTjkl733ve9O5c+esWLEif/7zn3PjjTdm7ty5eeKJJzJgwIDMnDkz73rXu2o9R/fu3RugcgAAAACgoTR4wPuP1q1b19hTbuSNN96otFu1arXV/q1bt06SVFdXN1hNW3PXXXelU6dOG71+wgkn5IILLsh5552XW265JS+++GIuvvji3HXXXY1fJAAAAADQqBo94N0RtGnTptJ+8803t9p/zZo1SZK2bds2WE1bs6lwd72WLVtmzJgxmTFjRp566qn85je/yeLFi7PffvvVao6tbUGxZMmSHH300bUaEwAAAABoOM0y4O3YsWOlvS3bLqxatSrJtm3n0FSqqqoybNiwXHbZZUmSBx54IJ/97GdrNcbW9iMGAAAAAHYsDRbwfuELX0jy9sPSxo4du9HrdfGPY9XV+oe3vfzyy1t9sNirr75aCXh39D1qDz300Ep78eLFTVgJAAAAANAYGizgHTduXEqlUpJsEMq+8/XaKJfL9RbwJm+HoVOnTs38+fNTU1OTqqpNfyuefPLJSrt37971MndDqcv3FQAAAAAorgYLeN/1rndtMnDc3OuN7fjjj8/UqVOzatWqPPLII3n/+9+/yX4PPPBApd2vX7/GKq9OnnjiiUq7a9euTVgJAAAAANAYGizgffbZZ2v1emP72Mc+lquuuipJcvPNN28y4F23bl1uvfXWJG8/5GzAgAGNWmNt1NTU5Kabbqp8/oEPfKAJqwEAAAAAGkOLpi6gqRx99NE54YQTkry9hcT06dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0AardfLkyXnttdc2e3zt2rUZPnx4pdbTTjtth98vGAAAAADYfg22grcIRo0alX79+qW6ujoDBw7M5ZdfngEDBqS6ujp33HFHRo8enSTp2bNnRowYUed5xo0bt8Hnjz76aKX9xz/+cYNVzT169Mjxxx+/Qf9bbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVedaAQAAAIDi2GED3jVr1uS1117LXnvtlRYtGmah8ZFHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOd5zj333M0eu/rqqzf4/Jxzztko4E2SlStX5he/+EV+8YtfbHasww8/PHfccUcOPPDAOtcKAAAAABRHo2/RsHLlyvzhD3/IH/7wh6xcuXKj48uWLcsnPvGJ7LrrrunatWt23333jBgxImvWrGmQek477bQ89thjueSSS9KzZ8+0a9cunTp1Sp8+fXL11Vdnzpw56dGjR4PMva2+/vWv57rrrssZZ5yR97znPdl7773TsmXLdOjQIQcffHDOPPPM/PrXv86cOXNy6KGHNmmtAAAAAEDjKZXL5XJjTnjLLbfk3HPPTbdu3fLss89usDp33bp1ef/7358///nPeWdZpVIpH/vYx/Kf//mfjVkq/2DRokWVvX0XLlyYbt26NXFFAHU3bNyspi4BGsXYoX2bugQAAOD/1xD5WqOv4L333nuTJEOGDNlo64Xx48fnkUceSZK8733vyyWXXJL3ve99KZfLmTBhQv74xz82drkAAAAAADusRt+D969//WtKpVKOO+64jY7deuutSZKjjjoqDz/8cKqqqrJ27dqccMIJmTVrVm655ZZ89KMfbeySAQAAAAB2SI2+gvell15Kko0eBLZ27do8+OCDKZVK+ed//udUVb2dPbds2TJf+tKXUi6XM3PmzMYuFwAAAABgh9XoAe8rr7ySJGnVqtUGr8+aNSvV1dVJstEq3Z49eyZJXnjhhUaoEAAAAACgGBo94G3Xrl2S/13Ju96DDz6YJOnRo0f23nvvDY61bdu2cYoDAAAAACiQRg94Dz744CTJlClTNnj9N7/5TUqlUj7wgQ9sdM7SpUuTJF26dGnw+gAAAAAAiqLRA96TTjop5XI5P/3pT3PPPfdk5cqVueGGGzJr1qwkyWmnnbbROY899liSpGvXro1aKwAAAADAjqyqsSe86KKL8rOf/SwrVqzIqaeeusGx3r17bzLgnThxYkqlUo488sjGKhMAAAAAYIfX6Ct4991339x9993ZZ599Ui6XKx8HHXRQ7rzzzpRKpQ36L1iwIFOnTk2SfPjDH27scgEAAAAAdliNvoI3SU444YQ888wzmTZtWl544YXsu+++Of7441NVtXE5S5Ysybe+9a0kycCBAxu7VAAAAACAHVaTBLxJ0qpVqwwYMGCr/Y4//vgcf/zxjVARAAAAAECxNPoWDQAAAAAA1A8BLwAAAABAQTXZFg1J8pe//CVTp07N3/72t6xYsSJvvfXWFvuXSqWMHTu2kaoDAAAAANixNUnA+9RTT+ULX/hCZsyYsc3nlMtlAS8AAAAAwDs0esC7ePHifOADH8iyZctSLpeTJB06dMjuu++eFi3sGAEAAAAAsK0aPeC98sors3Tp0pRKpQwfPjxf+9rX0rNnz8YuAwAAAACg8Bo94P3jH/+YUqmUs88+O6NHj27s6QEAAAAAdhqNvifC888/nyQ5++yzG3tqAAAAAICdSqMHvLvvvnuSpFOnTo09NQAAAADATqXRA94+ffokSebNm9fYUwMAAAAA7FQaPeD96le/mnK5bP9dAAAAAIDt1OgB70knnZSvf/3rmTx5cr785S9n7dq1jV0CAAAAAMBOoaqxJ7z11lvTu3fvHHfccRk9enTuvvvufPKTn0yvXr3Srl27rZ7v4WwAAAAAAG9r9IB36NChKZVKlc+XLFmSG264YZvOLZVKAl4AAAAAgP9fowe8SVIul5tiWgAAAACAnUqjB7zPPPNMY08JAAAAALBTavSAd//992/sKQEAAAAAdkotmroAAAAAAADqRsALAAAAAFBQTfKQtfWefvrp3HrrrZk+fXpeeOGFVFdX5957702PHj0qff7617/m73//e9q3b5/+/fs3YbUAAAAAADuWJgl4161bl8suuyyjRo3KunXrUi6XkySlUilvvvnmBn3//ve/59RTT01VVVWeeeaZ7Lfffk1RMgAAAADADqdJtmg4//zzc9111+Wtt95K165d88lPfnKzfU855ZQceOCBeeutt3LnnXc2YpUAAAAAADu2Rg94J02alLFjxyZJLr/88jz77LP51a9+tcVzPvWpT6VcLue///u/G6NEAAAAAIBCaPQtGkaPHp3k7ZW53/3ud7fpnKOPPjpJ8j//8z8NVhcAAAAAQNE0+gre6dOnp1QqZdiwYdt8Trdu3ZIkL7zwQkOVBQAAAABQOI0e8L700ktJkgMOOGCbz2nZsmWSpKampiFKAgAAAAAopEYPeNu3b58kWbp06Tafs2jRoiTJHnvs0SA1AQAAAAAUUaMHvAcddFCS5Iknntjmc+65554kyWGHHdYgNQEAAAAAFFGjB7wDBw5MuVzOT37yk6xbt26r/Z944omMGzcupVIpp5xySiNUCAAAAABQDI0e8H71q19N+/bts2DBgnzpS1/a4r66999/fwYOHJg33ngje+yxR84777xGrBQAAAAAYMdW1dgT7r333vnZz36Ws88+O2PHjs29996bQYMGVY6PGjUq5XI506ZNy5NPPplyuZwWLVpk3Lhx6dChQ2OXCwAAAACww2r0gDdJPve5z6Vly5Y5//zzs3Dhwtx4440plUpJkjFjxiRJyuVykqRDhw655ZZbNgiBAQAAAABogi0a1jvjjDMyf/78/Ou//muOOuqo7LLLLimXy5WPww47LN/4xjcyf/78DBkypKnKBAAAAADYYTXJCt71OnfunG9961v51re+lXXr1uWVV17JW2+9lT322CMtW7ZsytIAAAAAAHZ4TRrwvlOLFi2y5557NnUZAAAAAACF0egB71tvvZVZs2Zl6tSpmTdvXl599dWsWLEiu+66a/bYY4+8+93vzvHHH58+ffqkRYsm20ECAAAAAGCH12gBb01NTX7yk5/khz/8YZ5//vmt9u/evXsuvfTSfOlLX8ouu+zSCBUCAAAAABRLowS8L7/8coYMGZJp06YlScrl8lbPWbhwYb761a/mrrvuyq9//evsscceDV0mAMBOZ9i4WU1dQpMZO7RvU5cAAAANrsED3rfeeiuDBg3KrFmzUi6XUyqVMnDgwHz4wx/O+973vnTu3DkdOnTIihUrsmzZssyZMyf3339/Jk2alHK5nClTpuT000/Pgw8+aMsGAAAAAIB3aPCA9/vf/35mzpyZUqmUI488MrfddlsOPfTQzfb/8Ic/nEsvvTR//etfc/bZZ+fRRx/N9OnTc8011+TrX/96Q5cLAAAAAFAYDbokdu3atbn++usr4e60adO2GO6+03ve8548/PDDOfLII1Mul3PdddelpqamIcsFAAAAACiUBg1477777ixdujSlUin/8R//kTZt2tTq/DZt2uS2225LqVTK0qVL8/vf/76BKgUAAAAAKJ4GDXgfeuihJG9vu9CrV686jXHooYfmpJNOSpJMnTq13moDAAAAACi6Bg14H3nkkZRKpXzoQx/arnE+9KEPpVwu55FHHqmnygAAAAAAiq9BA96FCxcmSf7pn/5pu8ZZf/5zzz233TUBAAAAAOwsGjTgff3115Mku++++3aNs/789eMBAAAAANDAAe/y5cuTJB06dNiucdq3b58kWbFixXbXBAAAAACws2jQgPett96q1/HWrVtXr+MBAAAAABRZgwa8AAAAAAA0nKrGmOSnP/1punTpUufzX3rppXqsBgAAAABg59AoAe+///u/N8Y0AAAAAADNSoMHvOVyuaGnAAAAAABolho04J08eXJDDg8AAAAA0Kw1aMDbv3//hhweAAAAAKBZa9HUBQAAAAAAUDcCXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXiTPPfccxkxYkR69eqV9u3bZ4899kjfvn1zzTXXZPXq1ds19rp16/LEE09k3LhxueCCC9K3b9+0bt06pVIppVIpU6ZMqdV4q1evzg9+8IP07ds3e+yxR9q3b59evXplxIgRee6557arVgAAAACgWKqauoCmdvfdd+ess87K8uXLK6+tXr06s2fPzuzZszNmzJhMnDgxPXr0qNP4t912W4YOHVovtc6fPz+nnHJKnn766Q1ef+qpp/LUU09lzJgxuf3223PqqafWy3wAAAAAwI6tWa/gnTNnTs4888wsX748HTp0yJVXXpmHH344kyZNynnnnZckmTdvXgYNGpQVK1bUaY5yuVxpt2zZMu973/ty+OGH13qcFStWZNCgQZVw97zzzsukSZPy8MMP58orr0yHDh2yfPnynHnmmXn00UfrVCsAAAAAUCzNegXvRRddlOrq6lRVVeW+++7LscceWzn2wQ9+MIccckguu+yyzJs3L9dee21GjhxZ6zkOPfTQXH/99enbt2+OOOKItGnTJiNHjszjjz9eq3GuueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRfXeusHAAAAAKB4mu0K3pkzZ2bq1KlJkmHDhm0Q7q43YsSI9O7dO0kyatSorF27ttbzHH300bnwwgtzzDHHpE2bNnWqde3atbn++uuTJL17986IESM26nPcccdl2LBhSZIHHnggs2bNqtNcAAAAAEBxNNuA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AAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAFvkueeey4jRoxIr1690r59++yxxx7p27dvrrnmmqxevbre5rnnnnsyZMiQdOvWLa1bt063bt0yZMiQ3HPPPVs9d+jQoSmVStv08eyzz9ZbzQAAAADAjquqqQtoanfffXfOOuusLF++vPLa6tWrM3v27MyePTtjxozJxIkT06NHjzrPsW7dunzxi1/M2LFjN3h98eLFWbx4cSZMmJDhw4fnxhtvTIsWMncAAAAAYNs064B3zpw5OfPMM1NdXZ0OHTrkG9/4RgYMGJDq6urccccd+fnPf5558+Zl0KBBmT17djp27Finef7lX/6lEu4eeeSRueyyy3LwwQdnwYIF+cEPfpA5c+ZkzJgx2WuvvfK9731vi2N17do199577xb77LfffnWqEwAAAAAolmYd8F500UWprq5OVVVV7rvvvhx77LGVYx/84AdzyCGH5LLLLsu8efNy7bXXZuTIkbWeY968efnhD3+YJOnTp08efPDBtG3bNknSt2/fnH766enfv39mz56da665Jl/4whe2uFq4ZcuWec973lPrOgAAAACAnU+z3Q9g5syZmTp1apJk2LBhG4S7640YMSK9e/dOkowaNSpr166t9Tw/+tGPUlNTkyS54YYbKuHueu3atcsNN9yQJKmpqcl1111X6zkAAAAAgOap2Qa8EyZMqLTPPffcTfZp0aJFzj777CTJa6+9lsmTJ9dqjnK5nN/+9rdJkl69euWYY47ZZL9jjjkm7373u5Mkv/3tb1Mul2s1DwAAAADQPDXbgPehhx5KkrRv3z5HHXXUZvv179+/0p42bVqt5njmmWfy/PPPbzTOluZZvHhxnn322VrNAwAAAAA0T8024J07d26SpEePHqmq2vxWxL169dronG31xBNPbHKc7Znn5ZdfTv/+/dO5c+e0bt06++67bz7ykY/kxz/+cVavXl2r+gAAAACAYmuWD1l74403smzZsiRJt27dtth39913T/v27bNq1aosXLiwVvMsWrSo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woRK+9xzz91knxYtWuTss89Okrz22muZPHlyreYol8v57W9/myTp1atXjjnmmE32O+aYY/Lud787SfLb3/42/7ioet68eZk7d26S5IwzztjsQ9+GDh1aaQt4AQAAAGDnV7/v4S+Qhx56KEnSvn37HHXUUZvt179//0p72rRpGThw4DbP8cwzz+T555/faJzNzfPUU09l8eLFefbZZ3PggQduVOvWxtlnn33Ss2fPzJs3L9OmTdvmOgEAAIrKdlvNj205ADbUbAPe9Stie/ToscW9anv16rXROdvqiSee2OQ42zLPOwPe2o4zb968LFy4MKtWrUr79u23ud5FixZt8fjChQsr7SVLlmzzuLCjW/XKi01dAgAAsI229v+uADuyd2Zq67d13V7NMuB94403smzZsiTZ6kbGu+++e9q3b59Vq1ZtEHBui3f+0NnaPOs3V06y0Tx1GadcLmfRokWVrR+2xTtr2Jqjjz56m/sCAABAfRk/oqkrAKgfS5cuzQEHHLDd4zTLPXhXrFhRaXfo0GGr/devgl25cmWDzfPOlbb/OE99jQMAAAAA7Fya7Qre9Vq1arXV/q1bt06SVFdXN9g86+fY1Dz1Nc7WbG2F8htvvJEnn3wye++9d/baa68tbm0B22rJkiWVFeEzZ87Mvvvu28QVsbNzzdGYXG80Ntccjcn1RmNzzdGYXG80lJqamixdujRJcvjhh9fLmM0yoWvTpk2l/eabb261/5o1a5Ikbdu2bbB51s+xqXn+cZx3fl6bcbZma9s/JG/vWQwNZd99992m6xDqi2uOxuR6o7G55mhMrjcam2uOxuR6o77Vx7YM79Qst2jo2LFjpb0t2xisWrUqybZt51DXedbPsal56mscAAAAAGDn0iwD3jZt2qRz585Jtv70zVdffbUSmtbmIWTJhititzbPO7dH+Md56jJOqVTy1yUAAAAA2Mk1y4A3SQ499NAkyfz581NTU7PZfk8++WSl3bt37zrN8Y/j1HaeuozTvXv3DR64BgAAAADsfJptwHv88ccneXtLg0ceeWSz/R544IFKu1+/frWa48ADD0zXrl03GmdTHnzwwSTJfvvtt9E+HOtr3do4L7zwQubNm1enWgEAAACA4mm2Ae/HPvaxSvvmm2/eZJ9169bl1ltvTZJ06tQpAwYMqNUcpVIpgwcPTvL2ytoZM2Zsst+MGTMqK28HDx6cUqm0wfGePXtWVvX+6le/yurVqzc5zrhx4yrtIUOG1KpWAAAAAKB4mm3Ae/TRR+eEE05IkowdOzbTp0/fqM+1116buXPnJkkuuuiitGzZcoPjU6ZMSalUSqlUytChQzc5z8UXX5xddtklSXLhhRemurp6g+PV1dW58MILkyRVVVW5+OKLNznO1772tSTJK6+8kssuu2yj4wsWLMhVV12VJOnRo4eAFwAAAACagWYb8CbJqFGj0rZt29TU1GTgwIG56qqrMmPGjEyePDnnn39+JUjt2bNnRowYUac5evbsmUsvvTRJMnv27PTr1y/jx4/P7NmzM378+PTr1y+zZ89Oklx66aU55JBDNjnOOeecU9l24Sc/+Uk++clP5t57783MmTPz4x//OMcdd1yWL1+eFi1a5Prrr09VVVWd6gUAAAAAiqNULpfLTV1EU7r77rtz1llnZfny5Zs83rNnz0ycODE9evTY6NiUKVMq2zacc845G2yR8E7r1q3Leeedl5tuummzdQwbNiyjR49Oixabz9yXLVuWU045JbNmzdrk8datW+fHP/5xhg8fvtkxAAAAAICdR7NewZskp512Wh577LFccskl6dmzZ9q1a5dOnTqlT58+ufrqqzNnzpxNhru10aJFi4wdOzYTJ07M4MGD07Vr17Rq1Spdu3bN4MGD84c//CFjxozZYribJHvuuWcefvjh/PSnP83xxx+fzp07p02bNjnooINy3nnn5ZFHHhHuAgAAAEAz0uxX8AIAAAAAFFWzX8ELAAAAAFBUAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrAC9TZ7Nmz853vfCcDBw5Mt27d0rp163To0CE9e/bMueeem4ceeqhe5hk5cmRKpdI2fUyZMqVe5mTHtK3XwYknnlgv8/3yl7/MwIEDs88++6RNmzbZf//9c9ZZZ2X69On1Mj47rhNPPHGbr7ftuf+4vzUfL730Un7/+9/n29/+dk4++eTsueeelX/boUOH1nq8e+65J0OGDKn8/O3WrVuGDBmSe+65p17rXr16dX7wgx+kb9++2WOPPdK+ffv06tUrI0aMyHPPPVevc1F/6uN6W716de666658+ctfTt++fbP77runZcuW6dy5c4499tiMHDkyL7zwQr3Ue8ABB2zTffCAAw6ol/mof/VxzY0bN26bfyaOGzeuXupetmxZvv3tb+ef/umfsuuuu2bXXXfNP/3TP+Xb3/52Xn755XqZg4axvdfcs88+W+vf9bbnHuQ+R0OrauoCgGL6wAc+kKlTp270+ptvvpmnn346Tz/9dMaNG5ezzz47P//5z9OqVasmqBLqprq6Op/85Cfzhz/8YYPX//73v+f222/PL3/5y3z729/OFVdc0UQVsqNp0aJFDjnkkKYugx3Y3nvvXS/jrFu3Ll/84hczduzYDV5fvHhxFi9enAkTJmT48OG58cYb06LF9q3lmD9/fk455ZQ8/fTTG7z+1FNP5amnnsqYMWNy++2359RTT92ueah/23u9PfbYY+nXr19Wrly50bFXXnklM2bMyIwZM3Lddddl9OjROfPMM7drPoqvvu5xjelPf/pTPvaxj230h4rHH388jz/+eMaMGZMJEybk6KOPbqIK2ZKmuObe/e53N/qcsK0EvECdPP/880mSrl275lOf+lROOOGEvOtd78pbb72V6dOn59prr83ixYtz6623Zu3atfnFL35RL/M+/vjjWzx+4IEH1ss87Ni+/OUv54ILLtjs8fbt22/X+F/4whcq4e6AAQNy0UUXpWvXrnn88cfzve99LwsWLMjIkSOz77775otf/OJ2zcWO6eabb86qVau22OeJJ56ohBof+tCHst9++23XnO5vzce73vWu9OrVK/fdd1+tz/2Xf/mXSrh75JFH5rLLLsvBBx+cBQsW5Ac/+EHmzJmTMWPGZK+99sr3vve9Ote4YsWKDBo0qBLunnfeefn0pz+dtm3bZvLkybnqqquyfPnynHnmmZk2bVqOOOKIOs9Fw6rL9bZ8+fJKuNuvX7+ceuqp6dOnTzp37pylS5fmrrvuys9//vMsX748n/vc57Lrrrvm5JNP3u5aBw8enO9+97ubPW7BQDFszz1uvXvvvTddu3bd7PFu3brVeewkWbhwYU477bQsXbo0VVVV+T//5/9U/lj1+9//Pv/v//2/LFmyJKeddloeeeSR7Z6PhlWXa26//fbb6u9eSXLVVVdV/l/2nHPOqXON67nP0WDKAHUwaNCg8vjx48s1NTWbPL506dJyz549y0nKScoPPPBAnee64oorKuPQvK2/Dq644ooGm2PSpEmVeU477bSNrvGlS5eW3/Wud5WTlDt16lR+5ZVXGqwWdmyXXXZZ5Vq57bbb6jSG+1vz8e1vf7t89913l1944YVyuVwuP/PMM5V/+3POOWebxnjqqafKVVVV5STlPn36lFevXr3B8VWrVpX79OlTTlKuqqoqP/3003Wu91vf+lalvh/84AcbHZ82bVqllv79+9d5HhrG9l5v06ZNK59xxhnl//mf/9lsnwkTJpRLpVI5Sfnggw8ur1u3rs717r///rX6b4EdT33c426++ebKOc8880zDFVsulz//+c9X5vrVr3610fHx48fXun4aV31cc1tTU1NT7tq1azlJuWPHjhv93K0N9zkamj14gTr5/e9/nzPOOCO77LLLJo/vueeeufbaayuf33nnnY1VGmyXH/7wh0mSqqqq/PSnP93oGt9zzz1z9dVXJ0lee+21jBkzptFrpOmtW7cut99+e5KkQ4cO+fjHP97EFbGj+9d//deceuqp2/WW0h/96EepqalJktxwww1p27btBsfbtWuXG264IUlSU1OT6667rk7zrF27Ntdff32SpHfv3hkxYsRGfY477rgMGzYsSfLAAw9k1qxZdZqLhrG919txxx2X8ePH59BDD91sn8GDB1fufQsWLMicOXPqNBc7h/q4xzWWF154ofIz/CMf+Ug+9alPbdTnjDPOyEc+8pEkyW233VZv+01Tfxrjmvuv//qvyjtXP/nJT270cxd2JAJeoMEMGDCg0l6wYEETVgLbZsWKFZk0aVKS5MMf/vBm34738Y9/PLvuumuS5De/+U2j1ceOY9KkSVm8eHGSt3/hb9euXRNXxM6uXC7nt7/9bZKkV69eOeaYYzbZ75hjjqnsEfjb3/425XK51nNNnjw5r7/+epK33466ub183/kQG/fC5snvehTR7373u6xbty5Jcu6552623/p73Lp16/K73/2uMUpjB3PrrbdW2vWxPQM0JAEv0GDWrFlTaW9upS/sSGbNmpU333wzSdK/f//N9mvVqlUlXJk1a1bWrl3bKPWx43jnL/xnn312E1ZCc/HMM89UVhFt6f70zuOLFy/Os88+W+u5HnrooY3G2pQ+ffpU/rgxbdq0Ws9D8fldjyLa1nvcO4+5xzU/K1asyIQJE5IkBxxwQD7wgQ80bUGwFQJeoME88MADlXbv3r3rZcyBAwemS5cuadWqVbp06ZITTzwx3//+9/Pqq6/Wy/gUw69//esceuihadeuXTp27JhDDjkk55xzTiZPnrxd4z7xxBOVdq9evbbYd/3xmpqajZ4wz85t5cqVldWK+++/f0488cR6Gdf9jS2py/0pSebOndtgc1VVVaVHjx51nofiq+/f9R588MEcccQR6dixY9q1a5cDDzwwZ555ZiZMmFCn1egU17nnnpuuXbumVatW2XPPPXPMMcfkm9/8ZuXdM9tj/T1ut912yz777LPZfvvuu2/lHVvucc3PnXfemdWrVydJPv/5z6dUKtXLuO5zNBQBL9Ag1q1bl+9///uVz88444x6Gff+++/P0qVLs3bt2ixdujQPPPBAvvGNb+Sggw6qvHWVnd8TTzyRuXPnprq6OitXrsz8+fNz66235oMf/GCGDBlSeWtxbS1atKjS3trTkrt3715pL1y4sE7zUUz/+Z//mVWrViVJzjrrrHr7hd/9jS1pzPvT+rnat2+fTp06bdNcS5cu3WA1Jzu/v/zlL5k4cWKS5PDDD6+XgPeZZ57JX/7yl6xcuTLV1dV59tln86tf/SpDhgzJCSecUC/hHsUwZcqULFmyJGvXrs3LL7+cP/3pT7nyyivTo0eP3Hjjjds19vp73Nbupcn/3uP8rtf8NNS7tdznaChVTV0AsHO67rrrMnPmzCRv71d61FFHbdd4hx9+eD72sY/l6KOPTteuXbN27do89dRTuf3223Pffffltddeyyc+8YncfffdOfnkk+vjS2AH1K5du5x++un50Ic+lF69eqVDhw6VIOxnP/tZXn755UyYMCGDBw/O/fffn5YtW9Zq/BUrVlTaHTp02GLf9u3bV9orV66s3RdCodX3L/zub2yLxrw/rZ9ra/Nsaq7WrVvXej6KZ82aNRk+fHjeeuutJMmVV165XeO1atUqp59+egYOHJj3vOc92W233fLaa69l+vTp+fd///csXLgw06ZNy0knnZTp06dnt912q48vgx3QQQcdlI9//OM59thjK+Hq3/72t/znf/5n7rzzzrzxxhv50pe+lFKplC9+8Yt1mqMu9zi/6zUvf//73yvvUDjuuOMq71bZHu5zNLgyQD2bMmVKuaqqqpyk3KVLl/KLL764XeO9+uqrWzz+s5/9rJyknKTctWvXcnV19XbNx45rS9fCCy+8UD7yyCMr18KoUaNqPf4XvvCFyvkLFizYYt+xY8dW+t522221notiWrhwYblFixblJOVjjjlmu8dzf2u+nnnmmcq/7TnnnLPV/t/5zncq/SdNmrTFvpMmTar0/bd/+7da13bQQQeVk5S7d+++1b6f//znK3MtXLiw1nPROGp7vW3N8OHD63W8Ld0Lly9fXh44cGBlvksuuWS756Ph1eWae+2118rr1q3b7PG777673LJly3KScrt27cpLliypU23rf46fcMIJW+17wgknlJOUd9lllzrNReOpz/vclVdeWRnrZz/7Wb3U5z5HQ7NFA1Cv/ud//idDhgxJTU1N2rRpk1//+tfp0qXLdo25tbeHnn/++Rk2bFiS5Pnnn89//ud/btd87Li2dC3svffeufPOOyurdm+44YZaj9+mTZtKe/3D1jbnnW9Fbtu2ba3nopj+4z/+o/Lk7fp4mrL7G9uqMe9P6+fa2jz1MRfFc9VVV2XMmDFJkr59++YnP/nJdo+5pXthx44d86tf/Sp77LFHkmT06NHbdG1SPLvtttsWtz069dRT8+1vfztJsnr16owdO7ZO89TlHuf+1rzcdtttSZLWrVvnzDPPrJcx3edoaAJeoN4888wzGThwYF599dXssssuueOOOxrtaaPnn39+pf3OB37QvBx00EE56aSTkiTz58+vPHF+W3Xs2LHS3tpb8dbvwZps21v82Dk0xC/8W+P+RtK496f1c23LW5LdC5uXG2+8MZdffnmStx/A94c//GGDbToaym677ZZPf/rTSd6+5mbPnt3gc7Jj+uIXv1gJgev6M7Eu9zj3t+Zj5syZefLJJ5Mkp59++lb/GF9f3OfYXgJeoF48//zz+fCHP5znn38+pVIpN910UwYPHtxo8x966KGVto3pm7ftuRbe+bCNdz7QaFPe+bCNdz7QiJ3X7NmzK0/ePvXUU7P77rs3yrzubySNe39aP9eqVavy2muvbdNce+21l/13d3K//OUvc8EFFyRJ9t9//9x///3Zc889G21+90KSpEuXLuncuXOSul8H6+9xW7uXJv97j/O7XvPRUA9X2xbuc2wPAS+w3ZYtW5aTTjopf/vb35K8/db4xv5hWF9Psaf4tudaeOcvVev/cr85649XVVXlkEMOqfOcFMc7f+Gvj+0ZtpX7G0nd7k9J0rt37wabq6amJgsWLKjzPBTH7373u5x99tlZt25d9t1330yaNGmDPzo0BvdC1tvea2H9Pe7111/PCy+8sNl+S5YsyfLly5O4xzUXa9euzR133JHk7T8mfPSjH23U+d3n2B4CXmC7vP766/nIRz5SWdX2/e9/P//8z//c6HWsnz9Junbt2ujzs+PYnmuhb9++adWqVZItv+3vzTffzIwZMyrnrN/3l53XO3/h32uvvXLyySc32tzubyTJgQceWPn339rbkh988MEkyX777ZcDDjig1nMdf/zxlfaW5po9e3bl7cv9+vWr9TwUw6RJk3LGGWekpqYmnTt3zv3335+DDz640etwLyRJli5dmmXLliWp+3Wwrfe4dx5zj2seJk6cmJdffjlJ8tnPfjZVVVWNOr/7HNtDwAvU2erVqzNo0KD8+c9/TpL8y7/8S77+9a83SS033nhjpd2/f/8mqYGm98wzz+T+++9Pkhx88MHZb7/9anV+x44d86EPfShJ8l//9V+bfeveXXfdVVnRMWTIkO2omKK45557snTp0iSN/wu/+xvJ26t61m999OSTT1b+yPSPZsyYUVl1O3jw4DqtBjrxxBOz2267JUluueWWlMvlTfYbN25cpe1euHN6+OGHM3jw4KxZsya77bZb7r333hx22GGNXsfrr79e+SNbu3bt0qdPn0avgR3D6NGjK/ekuv5MPP3009OixdtRyM0337zZfuvvcS1atMjpp59ep7kolqZ6t1biPsf2E/ACdfLmm29myJAhmTZtWpLkoosuyne/+91ajzNu3LiUSqWUSqWMHDlyo+OPP/545s+fv8UxRo8eXXma8z777ON/MndSd999d2pqajZ7/MUXX8wnPvGJyhNn1+8T+E5bu96S5Gtf+1qSt996/M///M956623Nji+bNmyyh8yOnXqlOHDh9fly6Fg6rIfm/sb9e3iiy/OLrvskiS58MILU11dvcHx6urqXHjhhUne3j7m4osv3uQ4Q4cOrVybU6ZM2eh4q1at8tWvfjVJMnfu3Pzwhz/cqM/06dMrT7Dv379/+vbtW9cvix3Uo48+mkGDBmXVqlVp3759Jk6cmKOOOqrW45x44omV6+3ZZ5/d6Pgf//jHja7ld1q5cmXOOOOMyqq6YcOG2e95J/Tss89mzpw5W+zz+9//Pt/5zneSJG3bts255567yX5bu+b22WeffO5zn0uS3Hvvvbnzzjs36vPrX/869957b5Lk85//fPbZZ5/afDkU0CuvvJKJEycmSQ4//PAcccQR23yu+xw7gsZdbw7sND7zmc/kvvvuS5J88IMfzLBhw/LXv/51s/1btWqVnj171nqeRx55JMOHD8+AAQNy8skn5/DDD0/nzp1TU1OTJ598Mrfffnuljl122SWjR49ulKc50/guvPDCrF27Np/4xCdy7LHH5oADDkjbtm2zbNmyTJkyJTfeeGPlLXvHH398nbcK+eAHP5hPf/rTueOOO/K73/0uJ510Ui6++OJ07do1jz/+eK688sr8/e9/T5JcffXVjfagLZrOq6++mt///vdJkve85z153/veVy/jur81Lw899NAGgf76+1WSzJ8/f4PVsMnbIew/6tmzZy699NJ8//vfz+zZs9OvX798/etfz8EHH5wFCxbk6quvrgQkl1566XbtD37ppZdm/PjxmTdvXi677LLMnz8/n/70p9O2bdtMnjw53/ve91JTU5O2bdvmRz/6UZ3noWFs7/W2YMGCfOQjH6k8ZO+73/1udtttty3+rtelS5d06dKl1rV+//vfz+c+97l8/OMfz/HHH5+DDz44HTp0yOuvv56HH344P/vZzyo/d9/97ndv9g+0NK3tveaeffbZDBgwIMcee2xOO+20vPe9761cT3/7299y55135s4776ys3v3hD39Y63dqvdOVV16ZP/7xj1m6dGk+85nPZPbs2Tn11FOTvB0kX3vttUne3papLotYaHj18XP1ne64447KQpH6Xr3rPkejKAPUQZJafey///6bHOfmm2+u9Lniiiu2eHxLH507dy5PmDChYb9omtT++++/TdfCJz7xifKrr766yTG2dr2tt3r16vIpp5yy2TlatGixxfPZufz7v/975d/+Bz/4wTaf5/7GO51zzjm1+rm5OW+99Vb5C1/4whbPHTZsWPmtt97aplomT5682X5PP/10+ZBDDtnsPLvuumv57rvv3p5vCw1ke6+3bb0/vfNjcz8X+/fvX+nzzDPPbPH4lj769+9fXrRoUT1/p6gv23vNTZ48eZvOa9euXfnGG2/cYi1bu+bWmzFjRnmfffbZ7Fz77LNPecaMGdv7raGB1NfP1fXe//73l5OUd9lll/KSJUtqVYv7HDsCK3iBHdopp5ySsWPHZvr06ZkzZ05efPHFvPzyyymXy9ljjz3y3ve+Nx/96EczdOjQ7Lrrrk1dLg3olltuyQMPPJDp06fnb3/7W5YtW5bly5enQ4cO6d69e4477ricc845OfbYY7d7rrZt22bixIn5xS9+kXHjxuUvf/lLXnvttey999454YQT8pWvfKVe5qEYbrvttiRvr6Jd/5bO+uD+Rl20aNEiY8eOzSc+8YmMHj06s2bNyrJly7Lnnnumb9++Of/88+vtIYA9evTInDlz8pOf/CS//vWvM3/+/Lz55pvp3r17TjnllFx00UXZf//962Uumq8f/vCHmTRpUqZPn56nnnoqy5Yty2uvvZZ27dqla9euef/735/PfOYzGThwoCfM78SOOuqo/Md//EemT5+e2bNnZ8mSJVm2bFlqamqy++6757DDDsuHPvShDB8+vE4rxTfl/e9/fx5//PGMGjUqEyZMqLy1/sADD8zgwYNz8cUXp3PnzvUyFzu2p59+On/605+SJCeddFK9b8nhPkdjKJXLm3lqAgAAAAAAOzQPWQMAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAADsxIYOHZpSqZQDDjigqUvZ4RxwwAEplUoZOnRoU5cCAFBnAl4AABrdlClTUiqVKh9nnnnmVs9ZH1SWSqVGqBAAAIpBwAsAQJP79a9/nccff7ypy2AnYMUyANDcCHgBAGhy5XI5V1xxRVOXAQAAhSPgBQCgSe25555Jkt/85jeZM2dOE1cDAADFIuAFAKBJffWrX03r1q2TJN/+9rebuBoAACgWAS8AAE2qe/fu+eIXv5gk+f3vf5+ZM2fWaZx169blv//7v/O1r30t/fr1y5577pmWLVumU6dOOeKII/K1r30tf//737c4xoknnphSqZQTTzwxSTJ//vx86UtfykEHHZS2bdvmgAMOyLBhw/Lcc89tcN5f//rXnHvuuTnooIPSpk2bdO/ePV/+8pfz0ksvbVPtEyZMyKc+9am8613vSps2bdKpU6f06dMn//qv/5pXX321Tt+P2nr99ddz1VVXpV+/ftlrr73SqlWr7LvvvjnttNNy5513plwub/bc9Q+/GzlyZJJk1qxZ+cxnPpNu3bqldevW2W+//fL5z38+c+fO3Wodq1evzr/927/ln/7pn9K+fft07tw5xx9/fG666aaUy+UNHtA3ZcqUynkjR45MqVTKLbfckiR57rnnNniQ37Y8oO+pp57KeeedlwMOOCCtW7fO3nvvnSFDhmTGjBlb/wYCADSVMgAANLLJkyeXk5STlG+++eby888/X27btm05SXngwIGbPOecc86pnLMpV1xxReX45j7atWtXvuuuuzZbV//+/ctJyv379y/ff//95Y4dO25ynC5dupTnzp1bLpfL5V/84hflVq1abbLf/vvvX168ePFm53vllVfKH/zgB7dYc5cuXcrTp0+vxXd309+3/ffff7N9/uu//qvcuXPnLdZxyimnlFesWLHJ89f3ueKKK8o/+clPylVVVZv9/j/wwAObrWPhwoXlQw45ZLM1nHrqqeX77ruv8vnkyZMr527Lv/8/Xjv7779/OUn5nHPOKd91113ldu3abfKcXXbZpXzHHXfU6vsOANBYrOAFAKDJ7bvvvvnyl7+cJLnvvvvy0EMP1XqMmpqa7Lvvvrngggty2223Zdq0aXnkkUcyYcKEXHbZZenQoUNWr16dz372s1tdSfr888/njDPOSKdOnXLDDTfkT3/6U6ZOnZqLL744pVIpL730UoYPH55Zs2bl7LPPzsEHH5wxY8Zk5syZmTx5cj7/+c8neXsV6f/5P/9nk3OsWbMmH/7wh/Pf//3f2WWXXfL5z38+v/zlLzNjxoxMnTo1V155ZTp37pyXXnopp5xyykarhuvLtGnTcvLJJ+fll1/O3nvvne9+97u5++6788gjj+Tuu+/OWWedlST5wx/+kHPOOWeLY91777258MILc9hhh+Wmm27KrFmz8uCDD+aSSy5JixYtsnr16nz+85/Pm2++udG5a9euzaBBg/L0008nSQYNGpQJEyZk9uzZmTBhQk455ZT8/ve/z7e+9a1Nzn3BBRfk8ccfz+DBg5MkXbt2zeOPP77Rx6Y8/vjj+exnP5u99947P/7xjzNjxoxMnz49I0eOTJs2bfLWW2/li1/8YpYuXbrN31cAgEbT1AkzAADNzz+u4C2Xy+UXX3yx3L59+3KS8oABAzY6Z2sreJ955pnym2++udk5Fy5cWN5vv/3KScpnnXXWJvv8f+3df0xV9R/H8ReGXEiv3HCwwdCsRpkZVBYyXbYh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",
+ "text/plain": [
+ "