{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "file_path = \"words_new.txt\"\n", "with open(file_path) as f:\n", " lines = f.readlines()\n", "\n", "label_raw = lines[18:] # Skipping the initial lines that are comments\n", "\n", "image_texts = []\n", "image_paths = []\n", "default_path = \"iam_words/words/\"\n", "for label in label_raw:\n", " parts = label.strip().split() # Using strip() to remove any leading/trailing whitespaces\n", " if len(parts) < 9: # Check if the line has fewer parts than expected\n", " print(f\"Skipping line due to unexpected format: {label}\")\n", " continue # Skip this iteration and move to the next line\n", " if parts[1] == \"ok\":\n", " image_texts.append(parts[-1])\n", " image_id = parts[0]\n", " subdir1 = image_id.split(\"-\")[0]\n", " subdir2 = f\"{subdir1}-{image_id.split('-')[1]}\"\n", " image_paths.append(os.path.join(default_path, subdir1, subdir2, f\"{image_id}.png\"))\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "image_texts=image_texts\n", "image_paths=image_paths" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1sAAAIjCAYAAAD1OgEdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQ0klEQVR4nO3deVwV9f7H8fdRFhE5kAsgqUhqKqWWWkqaK1dUKr3aYlmpYSuWu+attLx19eo1tUWpW4kt3tJuaUmKuKeiGWqppbmQaAh4Uzhisgjz+6MH8/OIG8h4QF7Px2Mej853vuc7nzlzhno3Z75jMwzDEAAAAACgTFVxdQEAAAAAcC0ibAEAAACABQhbAAAAAGABwhYAAAAAWICwBQAAAAAWIGwBAAAAgAUIWwAAAABgAcIWAAAAAFiAsAUAAAAAFiBsAUA58vLLL8tms12VbXXp0kVdunQxX69du1Y2m02ff/75Vdn+4MGD1bBhw6uyrdLKzs7W0KFDFRgYKJvNphEjRri6pBI79zhfa6729xYASoKwBQAWiY2Nlc1mM5dq1aopKChIEREReuONN3Ty5Mky2U5qaqpefvll7dixo0zGK0vlubbL8Y9//EOxsbF6+umn9dFHH+mRRx45b7/Q0FC1atWqWPuXX34pm82mzp07F1v3wQcfyGazacWKFWVed2k0bNhQd911l6vLuKAFCxZo1qxZri4DAEqEsAUAFps8ebI++ugjzZ07V88++6wkacSIEWrRooV+/PFHp74vvviiTp8+XaLxU1NT9corr5Q40KxYscLy/9C/WG3//ve/tXfvXku3f6VWr16t9u3ba9KkSXr44YfVpk2b8/br2LGjdu3apaysLKf2jRs3ys3NTVu3blV+fn6xdVWrVlVYWJhl9V9LCFsAKiLCFgBYrFevXnr44Yc1ZMgQTZgwQfHx8Vq5cqUyMjJ0zz33OIUrNzc3VatWzdJ6/vjjD0mSh4eHPDw8LN3Wxbi7u8vT09Nl278cGRkZ8vPzu2S/jh07qrCwUJs2bXJq37hxo+6//36dPn1aSUlJTus2bNigli1bysfH54pqPHXq1BW9HwBgHcIWALhAt27d9NJLL+nQoUP6+OOPzfbz3bOVkJCgjh07ys/PTzVq1FDTpk31t7/9TdKf96vcdtttkqQhQ4aYP1mMjY2V9Of9OjfffLOSkpLUqVMnVa9e3Xzvhe7lKSgo0N/+9jcFBgbK29tb99xzjw4fPuzUp2HDhho8eHCx95495qVqO989W6dOndLo0aNVv359eXp6qmnTpvrXv/4lwzCc+tlsNg0bNkyLFy/WzTffLE9PT910001avnz5+T/wc2RkZCgqKkoBAQGqVq2aWrVqpfnz55vri+4DSk5OVlxcnFn7r7/+et7xOnbsKOnPcFUkJydH27ZtU79+/XTDDTc4rTt27Jh++eUX832StH37dvXq1Ut2u101atRQ9+7dtXnzZqftFP00dd26dXrmmWfk7++vevXqmevfffddNWrUSF5eXrr99tv17bffXtbnURIff/yx2rRpIy8vL9WsWVMDBgwo9v0o+t799NNP6tq1q6pXr67rr79e06ZNKzbeoUOHdM8998jb21v+/v4aOXKk4uPjZbPZtHbtWnO8uLg4HTp0yDwW5353CgsL9dprr6levXqqVq2aunfvrv379zv12bdvn/r376/AwEBVq1ZN9erV04ABA4pdkQSAsuLm6gIAoLJ65JFH9Le//U0rVqzQ448/ft4+u3fv1l133aWWLVtq8uTJ8vT01P79+83/cG/evLkmT56siRMn6oknntCdd94pSbrjjjvMMX7//Xf16tVLAwYM0MMPP6yAgICL1vXaa6/JZrNp/PjxysjI0KxZsxQeHq4dO3bIy8vrsvfvcmo7m2EYuueee7RmzRpFRUXplltuUXx8vMaOHavffvtNM2fOdOq/YcMGffHFF3rmmWfk4+OjN954Q/3791dKSopq1ap1wbpOnz6tLl26aP/+/Ro2bJhCQkK0aNEiDR48WJmZmRo+fLiaN2+ujz76SCNHjlS9evU0evRoSVKdOnXOO+YNN9ygoKAgbdiwwWzbunWr8vLydMcdd+iOO+7Qxo0bzXGKroAVha3du3frzjvvlN1u17hx4+Tu7q533nlHXbp00bp169SuXTun7T3zzDOqU6eOJk6caF7Zev/99/Xkk0/qjjvu0IgRI3Tw4EHdc889qlmzpurXr3/Bz6MkXnvtNb300ku6//77NXToUB07dkxvvvmmOnXqpO3btztdBTxx4oR69uypfv366f7779fnn3+u8ePHq0WLFurVq5ekP8N1t27ddPToUQ0fPlyBgYFasGCB1qxZ47TdF154QVlZWTpy5Ij5PahRo4ZTn6lTp6pKlSoa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mjhxourWrSsvLy+Fh4dr3759TmMcP35cAwcOlN1ul5+fn6KiopSdne3U58cff9Sdd96patWqqX79+po2bdpV2T8AAAAAlZNLw9aJEyfUoUMHubu7a9myZfrpp580Y8YMXXfddWafadOm6Y033lBMTIy2bNkib29vRUREKCcnx+wzcOBA7d69WwkJCVq6dKnWr1+vJ554wlzvcDjUo0cPBQcHKykpSdOnT9fLL7+sd99996ruLwAAAIDKw2YYhuGqjT///PPauHGjvv322/OuNwxDQUFBGj16tMaMGSNJysrKUkBAgGJjYzVgwAD9/PPPCg0N1datW9W2bVtJ0vLly9W7d28dOXJEQUFBmjt3rl544QWlpaXJw8PD3PbixYu1Z8+eS9bpcDjk6+urrKws2e32Mtp7uELD5+NcXcIF/To10tUlAAAA4BJKkg1cemXrq6++Utu2bXXffffJ399ft956q/7973+b65OTk5WWlqbw8HCzzdfXV+3atVNiYqIkKTExUX5+fmbQkqTw8HBVqVJFW7ZsMft06tTJDFqSFBERob179+rEiRPF6srNzZXD4XBaAAAAAKAk3Fy58YMHD2ru3LkaNWqU/va3v2nr1q167rnn5OHhoUGDBiktLU2SFBAQ4PS+gIAAc11aWpr8/f2d1ru5ualmzZpOfUJCQoqNUbTu7J8tStKUKVP0yiuvlN2OVjLl+eoRAAAAcLW49MpWYWGhWrdurX/84x+69dZb9cQTT+jxxx9XTEyMK8vShAkTlJWVZS6HDx92aT0AAAAAKh6Xhq26desqNDTUqa158+ZKSUmRJAUGBkqS0tPTnfqkp6eb6wIDA5WRkeG0/syZMzp+/LhTn/ONcfY2zubp6Sm73e60AAAAAEBJuDRsdejQQXv37nVq++WXXxQcHCxJCgkJUWBgoFatWmWudzgc2rJli8LCwiRJYWFhyszMVFJSktln9erVKiwsVLt27cw+69evV35+vtknISFBTZs2LfYTQgAAAAAoCy4NWyNHjtTmzZv1j3/8Q/v379eCBQv07rvvKjo6WpJks9k0YsQIvfrqq/rqq6+0c+dOPfroowoKClLfvn0l/XklrGfPnnr88cf13XffaePGjRo2bJgGDBigoKAgSdJDDz0kDw8PRUVFaffu3frss880e/ZsjRo1ylW7DgAAAOAa59IJMm677TZ9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AAAAYIFSha2DBw+WdR0AAAAAcE0pVdhq3Lixunbtqo8//lg5OTllXRMAAAAAVHilClvbtm1Ty5YtNWrUKAUGBurJJ5/Ud999V9a1AQAAAECFVaqwdcstt2j27NlKTU3VBx98oKNHj6pjx466+eab9frrr+vYsWNlXScAAAAAVChXNEGGm5ub+vXrp0WLFumf//yn9u/frzFjxqh+/fp69NFHdfTo0bKqEwAAAAAqlCsKW99//72eeeYZ1a1bV6+//rrGjBmjAwcOKCEhQampqerTp09Z1QkAAAAAFYpbad70+uuva968edq7d6969+6tDz/8UL1791aVKn9mt5CQEMXGxqphw4ZlWSsAAAAAVBilCltz587VY489psGDB6tu3brn7ePv76/333//iooDAAAAgIqqVGFr3759l+zj4eGhQYMGlWZ4AAAAAKjwSnXP1rx587Ro0aJi7YsWLdL8+fOvuCgAAAAAqOhKFbamTJmi2rVrF2v39/fXP/7xjysuCgAAAAAqulKFrZSUFIWEhBRrDw4OVkpKyhUXBQAAAAAVXanClr+/v3788cdi7T/88INq1ap1xUUBAAAAQEVXqrD14IMP6rnnntOaNWtUUFCggoICrV69WsOHD9eAAQNKVcjUqVNls9k0YsQIsy0nJ0fR0dGqVauWatSoof79+ys9Pd3pfSkpKYqMjFT16tXl7++vsWPH6syZM0591q5dq9atW8vT01ONGzdWbGxsqWoEAAAAgMtVqrD197//Xe3atVP37t3l5eUlLy8v9ejRQ926dSvVPVtbt27VO++8o5YtWzq1jxw5Ul9//bUWLVqkdevWKTU1Vf369TPXFxQUKDIyUnl5edq0aZPmz5+v2NhYTZw40eyTnJysyMhIde3aVTt27NCIESM0dOhQxcfHl2bXAQAAAOCy2AzDMEr75l9++UU//PCDvLy81KJFCwUHB5d4jOzsbLVu3Vpz5szRq6++qltuuUWzZs1SVlaW6tSpowULFujee++VJO3Zs0fNmzdXYmKi2rdvr2XLlumuu+5SamqqAgICJEkxMTEaP368jh07Jg8PD40fP15xcXHatWuXuc0BAwYoMzNTy5cvv6waHQ6HfH19lZWVJbvdXuJ9tELD5+NcXQIqkV+nRrq6BAAAgHKhJNmgVFe2itx444267777dNddd5UqaElSdHS0IiMj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z2636+jRo+Zy6NChq1Txteumm25y+kw3bNhwwb6bNm3Sgw8+qKioKG3fvl19+/ZV3759tWvXrqtY8bVn69atTscgISFBknTfffdd8D2cC1fu1KlTatWqld5+++3zrp82bZreeOMNxcTEaMuWLfL29lZERIRycnIuOOZnn32mUaNGadKkSdq2bZtatWqliIgIZWRkWLUbFd7FjsMff/yhbdu26aWXXtK2bdv0xRdfaO/evbrnnnsuOW5J/rbh0ueDJPXs2dPpM/3Pf/5z0TE5H0ruUsfh7M//6NGj+uCDD2Sz2dS/f/+Ljsv54EIGUA5kZGQYkox169ZdsM+8efMMX1/fq1dUJTBp0iSjVatWl93//vvvNyIjI53a2rVrZzz55JNlXFnlNnz4cKNRo0ZGYWHheddzLpQ9ScaXX35pvi4sLDQCAwON6dOnm22ZmZmGp6en8Z///OeC49x+++1GdHS0+bqgoMAICgoypkyZYknd15pzj8P5fPfdd4Yk49ChQxfsU9K/bXB2vuMwaNAgo0+fPiUah/PhylzO+dCnTx+jW7duF+3D+eBaXNlCuZCVlSVJqlmz5kX7ZWdnKzg4WPXr11efPn20e/fuq1HeNW3fvn0KCgrSDTfcoIEDByolJeWCfRMTExUeHu7UFhERocTERKvLrDTy8vL08ccf67HHHpPNZrtgP84FayUnJystLc3p++7r66t27dpd8Puel5enpKQkp/dUqVJF4eHhnCNlKCsrSzabTX5+fhftV5K/bbg8a9eulb+/v5o2baqnn35av//++wX7cj5YLz09XXFxcYqKirpkX84H1yFsweUKCws1YsQIdejQQTfffPMF+zVt2lQffPCBlixZoo8//liFhYW64447dOTIkatY7bWlXbt2io2N1fLlyzV37lwlJyfrzjvv1MmTJ8/bPy0tTQEBAU5tAQEBSktLuxrlVgqLFy9WZmamBg8efME+nAvWK/pOl+T7/r///U8FBQWcIxbKycnR+PHj9eCDD8put1+wX0n/tuHSevbsqQ8//FCrVq3SP//5T61bt069evVSQUHBeftzPlhv/vz58vHxUb9+/S7aj/PBtdxcXQAQHR2tXbt2XfL3w2FhYQoLCzNf33HHHWrevLneeecd/f3vf7e6zGtSr169zH9u2bKl2rVrp+DgYC1cuPCy/k8Zyt7777+vXr16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7UZOTo5Te6NGjYx33nnHMAzDmDRpklG9enXD4XCY68eOHWu0a9fOMAzDcDgchru7u7Fo0SJzfWZmplG9enWnuoKDg42ZM2cWq02SsX//frPt7bffNgICAi64PwCAq8PNxVkPAAB16dJFp06d0tatW3XixAndeOONqlOnjjp37qwhQ4YoJydHa9eu1Q033KAGDRroxx9/VH5+vjp06GCO4e7urttvv10///yz09ht27Y1//nAgQPKy8tTu3btzLaaNWuqadOmpa79hx9+UHZ2tmrVquXUfvr0aaeJPBo2bCgfHx/zdd26dZWRkSFJOnjwoPLz83X77beb6319fS+7rurVqzvdx3b22AAA1yFsAQBcrnHjxqpXr57WrFmjEydOqHPnzpKkoKAg1a9fX5s2bdKaNWvUrVu3Eo/t7e1d1uU6yc7OLnbPWZGzZzB0d3d3Wmez2VRYWFgmNZxvbMMwymRsAEDpcc8WAKBc6Nq1q9auXau1a9c6TfneqVMnLVu2TN999515v1ajRo3k4eGhjRs3mv3y8/O1detWhYaGXnAbjRo1kru7u7Zs2WK2nThxQr/88kup627durXS0tLk5uamxo0bOy21a9e+rDFuuOEGubu7O03wkZWVVawuDw8PFRQUlLpWAMDVxZUtAEC50LVrV0VHRys/P9+8siVJnTt31rBhw5SXl2eGLW9vbz399NMaO3asatasqQYNGmjatGn6448/FBUVdcFt1KhRQ1FRURo7dqxq1aolf39/vfDCC6pS5dL/77GgoEA7duxwavP09FR4eLjCwsLUt29fTZs2TTfeeKNSU1MVFxenv/71r04/Y7wQHx8fDRo0yNwff39/TZo0SVWqVHGadbBhw4Zav369BgwYIE9Pz8sOcwAA1yBsAQDKha5du+r06dNq1qyZAgICzPbOnTvr5MmT5hTxRaZOnarCwkI98sgjOnnypNq2bav4+Hhdd911F93O9OnTlZ2drbvvvls+Pj4aPXq0srKyLllfdna2br31Vqe2Ro0aaf/+/frmm2/0wgsvaMiQITp27JgCAwPVqVMnp/24lNdff11PPfWU7rrrLtntdo0bN06HDx9WtWrVzD6TJ0/Wk08+qUaNGik3N5efCgJAOWcz+EsNAEC5c+rUKV1//fWaMWPGRa/WAQDKL65sAQBQDmzfvl179uzR7bffrqysLE2ePFmS1KdPHxdXBgAoLcIWAADlxL/+9S/t3btXHh4eatOmjb799lvuywKACoyfEQIAAACABZj6HQAAAAAsQNgCAAAAAAsQtgAAAADAAoQtAAAAALAAYQsAAAAALEDYAgAAAAALELYAAAAAwAKELQAAAACwwP8Bo/yaDGsomEUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "word_lengths = [len(word) for word in image_texts]\n", "plt.figure(figsize=(10, 6))\n", "plt.hist(word_lengths, bins=range(1, max(word_lengths) + 1))\n", "plt.title('Distribution of Word Lengths')\n", "plt.xlabel('Word Length')\n", "plt.ylabel('Frequency')\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1sAAAIyCAYAAAA9sNAjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKs0lEQVR4nO3deXxN1/7/8feROSQiISINMVMzcZFKkVJBqtqiraGmtFpDlZTitlfR9mopvdpSeq/xmlpDaWtMiTnmoFTVnJjCNSRiiAz794dfzren5sh2Mryej8d5POy11tn7s5eIvLP3XsdiGIYhAAAAAEC2KmDvAgAAAAAgLyJsAQAAAIAJCFsAAAAAYALCFgAAAACYgLAFAAAAACYgbAEAAACACQhbAAAAAGACwhYAAAAAmICwBQAAAAAmIGwBAIA8p1u3bipdurS9ywCQzxG2AMAkFovlgV5r1641vZZvvvlG7du3V6lSpWSxWNStW7e7jr18+bJ69uypYsWKqWDBggoNDdWuXbse6DhNmjSRxWJRhQoV7tgfFRVlPe8FCxZk5VTua9myZRo+fPhDv++HH35Qy5YtVbRoUTk7O8vf318vv/yy1qxZk/1F5hGtWrVSkSJFZBiGTXtsbKwsFosCAwNve8+aNWtksVj07bffPq4yAcBuHO1dAADkVf/9739ttmfOnKmoqKjb2p988knTa/nss8905coV1atXT2fOnLnruIyMDIWHh2vPnj0aNGiQihYtqokTJ6pJkybauXPnXUPUn7m6uurw4cPatm2b6tWrZ9M3e/Zsubq66saNG498TnezbNkyTZgw4YEDl2EY6tGjh6ZPn67atWsrMjJSfn5+OnPmjH744Qc1bdpUmzZt0lNPPWVazblVSEiIli9frn379ql69erW9k2bNsnR0VFxcXE6efKkAgICbPoy3wsAeR1hCwBM0rlzZ5vtLVu2KCoq6rb2x2HdunXWq1qFChW667gFCxZo8+bNmj9/vtq1aydJevnll1WxYkV9+OGHmjNnzn2PVa5cOaWlpWnu3Lk2YevGjRv64YcfFB4eroULFz76SWWTsWPHavr06erfv7/GjRsni8Vi7Xv//ff13//+V46O/Hd5J5mBaePGjbeFrVatWmnNmjXauHGjXn31VWvfxo0b5ePj88i/ZLhx44acnZ1VoAA36QDIufgOBQB2dPXqVb377rsqWbKkXFxcVKlSJX3++ee33ZZlsVjUt29fzZ49W5UqVZKrq6uCgoK0fv36BzpOYGCgTYi4mwULFqh48eJ66aWXrG3FihXTyy+/rCVLliglJeWBjtehQwd99913ysjIsLb99NNPunbtml5++eU7vic2NlYtW7aUp6enChUqpKZNm2rLli02Y1JTUzVixAhVqFBBrq6u8vHxUUhIiKKioiTdek5nwoQJkmxv47yb69eva9SoUapcubI+//zzO4597bXXbELj0aNH1b59e3l7e8vd3V0NGjTQ0qVLbd6zdu1aWSwWff/99xoxYoSeeOIJeXh4qF27dkpMTFRKSor69+8vX19fFSpUSN27d79tbjP/zufPn68qVarIzc1NwcHB+vXXXyVJkydPVvny5eXq6qomTZro+PHjt9U+f/58BQUFyc3NTUWLFlXnzp116tQpmzHdunVToUKFdOrUKb3wwgsqVKiQihUrpoEDByo9Pf2ucydJ9erVk7Ozs/VqVaZNmzapUaNGqlevnk1fRkaGtmzZoqeeeso61w8zn/PmzdMHH3ygJ554Qu7u7kpKSpIkLV68WNWqVZOrq6uqVaumH3744Y71zps3T0FBQfLw8JCnp6eqV6+u8ePH3/McAeBR8Ks6ALATwzD0/PPPKzo6WhEREapVq5ZWrlypQYMG6dSpU/riiy9sxq9bt07fffed+vXrJxcXF02cOFEtWrTQtm3bVK1atWypKTY2VnXq1LntakG9evX07bff6o8//rC5gnE3HTt21PDhw7V27Vo988wzkqQ5c+aoadOm8vX1vW38/v379fTTT8vT01PvvfeenJycNHnyZDVp0kTr1q1T/fr1JUnDhw/XqFGj9Prrr6tevXpKSkrSjh07tGvXLj377LN68803dfr06TvernknGzdu1MWLF9W/f385ODjcd3xCQoKeeuopXbt2Tf369ZOPj49mzJih559/XgsWLNCLL75oM37UqFFyc3PTkCFDdPjwYX311VdycnJSgQIFdOnSJQ0fPlxbtmzR9OnTVaZMGQ0bNszm/Rs2bNCPP/6oPn36WPf33HPP6b333tPEiRPVu3dvXbp0SaNHj1aPHj1sni+bPn26unfvrr/97W8aNWqUEhISNH78eG3atEmxsbHy8vKyjk1PT1dYWJjq16+vzz//XL/88ovGjh2rcuXKqVevXnedj8zQv3HjRmtbfHy84uPj9dRTT+ny5cs2wenXX39VUlKS9YrYw87nRx99JGdnZw0cOFApKSlydnbWqlWr1LZtW1WpUkWjRo3ShQsX1L17d5tbF6Vbzwt26NBBTZs21WeffSZJOnDggDZt2qR33nnnrucIAI/EAAA8Fn369DH+/G138eLFhiTj448/thnXrl07w2KxGIcPH7a2STIkGTt27LC2nThxwnB1dTVefPHFh6qjYMGCRteuXe/a16NHj9valy5dakgyVqxYcc99N27c2KhataphGIZRt25dIyIiwjAMw7h06ZLh7OxszJgxw4iOjjYkGfPnz7e+74UXXjCcnZ2NI0eOWNtOnz5teHh4GI0aNbK21axZ0wgPD79nDX+d53sZP368Icn44YcfHmh8//79DUnGhg0brG1XrlwxypQpY5QuXdpIT083DMOwnmO1atWMmzdvWsd26NDBsFgsRsuWLW32GxwcbAQGBtq0STJcXFyMY8eOWdsmT55sSDL8/PyMpKQka/vQoUMNSdaxN2/eNHx9fY1q1aoZ169ft477+eefDUnGsGHDrG1du3Y1JBkjR460OX7t2rWNoKCg+87JoEGDDEnGyZMnDcMwjLlz5xqurq5GSkqKsWzZMsPBwcFa69dff21IMjZt2pSl+Sxbtqxx7do1m+PXqlXLKFGihHH58mVr26pVqwxJNnP6zjvvGJ6enkZaWtp9zwkAsgu3EQKAnSxbtkwODg7q16+fTfu7774rwzC0fPlym/bg4GAFBQVZt0uVKqU2bdpo5cqV973d60Fdv35dLi4ut7W7urpa+x9Ux44dtWjRIt28eVMLFiyQg4PDbVcqpFtXVVatWqUXXnhBZcuWtbaXKFFCHTt21MaNG623i3l5eWn//v06dOjQw57aHWXu18PD44HGL1u2TPXq1bNZ3KFQoULq2bOnjh8/rt9++81mfJcuXeTk5GTdrl+/vnVBjj+rX7++4uPjlZaWZtPetGlTm+XLM6/wtW3b1qbmzPajR49Kknbs2KFz586pd+/e1r87SQoPD1flypVvu01Pkt566y2b7aefftq6v3vJnIsNGzZIunULYVBQkJydnRUcHGy9dTCzz9XVVXXr1pX08PPZtWtXubm5WbfPnDmj3bt3q2vXripcuLC1/dlnn1WVKlVs3uvl5aWrV69abzkFgMeBsAUA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from collections import Counter\n", "word_counts = Counter(image_texts)\n", "common_words = word_counts.most_common(10)\n", "words, counts = zip(*common_words)\n", "\n", "plt.figure(figsize=(10, 6))\n", "plt.bar(words, counts)\n", "plt.title('Top 10 Most Common Words')\n", "plt.xlabel('Words')\n", "plt.ylabel('Frequency')\n", "plt.xticks(rotation=45)\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The presence of \".\", \",\", \"of\", \"to\", \"and\", \"a\", \"in\", \"is\", \"=\", as the top words is indicative of common English language usage, particularly in written text where these words and symbols are frequently used for basic sentence structure and meaning.\n", "\n", "The right-skewed distribution of word lengths suggests that while most words are relatively short, there's a long tail of longer words. This is typical of many natural language datasets, where a large number of unique words are used infrequently, contributing to a long tail in the distribution. For handwriting recognition, this implies that your model needs to handle a wide range of word lengths, from short to very long words, which can be challenging in terms of both recognizing the individual characters and understanding the spatial relationships between them in longer words." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['!', '\"', '#', \"'\", '(', ')', '*', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '?', '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', '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']\n" ] } ], "source": [ "\n", "### get vocabulary for the current dataset\n", "vocab = set(\"\".join(map(str, image_texts)))\n", "print(sorted(vocab))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "19" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "max_label_len = max([len(str(text)) for text in image_texts])\n", "max_label_len\n", "\n", "#Output = 19" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "maximum label length among your images' text labels is 19 characters. This information is crucial for several reasons:\n", "\n", "Model Input and Output: Knowing the maximum label length helps in defining the architecture of your neural network, especially the output dimensions of your model. For a handwriting recognition model, especially one based on a sequence-to-sequence framework like CTC (Connectionist Temporal Classification), you need to ensure that the model can handle sequences of this length.\n", "\n", "Padding Sequences: When training your model, you'll likely need to pad the sequences to ensure that all of them have the same length. This is important for batching purposes, as deep learning models require inputs to be of a uniform size. Knowing the maximum label length allows you to apply the correct amount of padding to each sequence.\n", "\n", "Performance Considerations: The maximum label length might also have implications for your model's performance. Longer sequences can be more challenging to predict accurately due to the increased possibilities for errors and the dependence on longer-term dependencies between characters. You might need to consider model architectures that are particularly good at capturing these dependencies, such as RNNs with LSTM or GRU layers." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([24, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,\n", " 76, 76])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "char_list = sorted(vocab)\n", "\n", "def encode_to_labels(txt):\n", " # encoding each output word into digits\n", " dig_lst = []\n", " \n", " for index, char in enumerate(txt):\n", " try:\n", " dig_lst.append(char_list.index(char))\n", " except:\n", " print(char)\n", " \n", " return pad_sequences([dig_lst], maxlen=max_label_len, padding='post', value=len(char_list))[0]\n", "\n", "padded_image_texts = list(map(encode_to_labels, image_texts))\n", "\n", "padded_image_texts[0]\n", "\n", "#Output : array([24, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This step is essential for a few reasons:\n", "\n", "Numerical Representation: Deep learning models work with numerical data, so converting your textual data into a numerical format is a necessary preprocessing step. Your choice of encoding each character to its index in a sorted list of all characters (char_list) is a common and effective approach.\n", "\n", "Sequence Padding: By padding the sequences, you ensure that all your input data to the model has a uniform shape. This is crucial for batching and processing through your neural network layers, which require consistent input dimensions. You've chosen 'post' padding, which adds any necessary padding at the end of the sequences, ensuring that the beginning of each text (where the actual data is) aligns.\n", "\n", "Handling Unknown Characters: Your try-except block within the encode_to_labels function is a good practice for handling characters that might not be present in your char_list. If you encounter such a character, your current setup will silently ignore it. Depending on your application, you might want to log these instances or add a special token to your char_list to represent unknown characters.\n", "\n", "Preparation for Model Training: This encoding and padding process prepares your dataset for model training, specifically for models that rely on a fixed input size, such as Convolutional Neural Networks (CNNs) combined with Recurrent Neural Networks (RNNs) for sequence prediction tasks like handwriting recognition.\n", "\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABN4AAAJwCAYAAABWN6yCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABhO0lEQVR4nO3debiVVd0//vcBDofxgBMcEERyxHlWckQRVCpNn3IWDTMNSiCHr+XjgJalOZUDDQiW+qQ2qI8jOIATKqKWaZFTkingNxUEBA6wf3/4Y389Igi4b49HXq/rOtfFXvfa615r7w/3wbf3UFUqlUoBAAAAACqqWWNPAAAAAAA+jwRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AwGfKOeeck6qqqk9lX3vttVf22muv8uvx48enqqoqv//97z+V/R977LFZf/31P5V9rarZs2fn+OOPT11dXaqqqjJ06NDGntJK+/D3/HnzadctALDiBG8AQGHGjBmTqqqq8k+rVq3StWvX9O/fPz/72c/y7rvvVmQ/r7/+es4555w888wzFRmvkj7Lc1sRP/rRjzJmzJicdNJJ+e1vf5ujjz76I/ttttlm2XrrrZdq/9Of/pSqqqrsueeeS2275pprUlVVlbFjx1Z83qti/fXXz5e+9KXGnsYy3XDDDbnssssaexoAwEoQvAEAhRsxYkR++9vf5uqrr853vvOdJMnQoUOz5ZZb5i9/+UuDvmeeeWbee++9lRr/9ddfz7nnnrvS4dbYsWMLD32WN7df/epXmTJlSqH7/6Tuv//+7LLLLjn77LNz1FFHZfvtt//Ifrvttlv++te/ZubMmQ3aH3nkkbRo0SKTJk1KfX39UtuaN2+e3r17Fzb/zxPBGwA0PYI3AKBw+++/f4466qgcd9xxOeOMM3LPPffk3nvvzYwZM/KVr3ylQdDWokWLtGrVqtD5zJ07N0nSsmXLtGzZstB9LU91dXVqamoabf8rYsaMGenYsePH9tttt92yePHiPProow3aH3nkkXz961/Pe++9l8mTJzfY9vDDD2errbZK+/btP9Ec58yZ84neDwBQFMEbANAo9t577/z3f/93Xn311Vx33XXl9o+6x9u4ceOy2267pWPHjmnXrl022WSTfP/730/y/v2tdtxxxyTJcccdV76sdcyYMUnev7/XFltskcmTJ2ePPfZImzZtyu9d1r2/Fi1alO9///upq6tL27Zt85WvfCX/+te/GvRZf/31c+yxxy713g+O+XFz+6h7vM2ZMyff+9730r1799TU1GSTTTbJT3/605RKpQb9qqqqMmTIkNxyyy3ZYostUlNTk8033zx33333R3/gHzJjxowMGjQonTt3TqtWrbL11lvn2muvLW9fct+wV155JXfccUd57v/85z8/crzddtstyftB2xLz5s3LU089lYMPPjhf+MIXGmx78803849//KP8viR5+umns//++6e2tjbt2rXLPvvsk8cee6zBfpZcvjxhwoR8+9vfTqdOndKtW7fy9l/+8pfZYIMN0rp16+y000556KGHVujzWBnXXXddtt9++7Ru3TprrrlmDjvssKXqY0ndPf/88+nTp0/atGmTddddNxdeeOFS47366qv5yle+krZt26ZTp04ZNmxY7rnnnlRVVWX8+PHl8e644468+uqr5e/iw7WzePHi/PCHP0y3bt3SqlWr7LPPPnnxxRcb9HnhhRdyyCGHpK6uLq1atUq3bt1y2GGHLXWmIgBQGS0aewIAwOrr6KOPzve///2MHTs23/zmNz+yz3PPPZcvfelL2WqrrTJixIjU1NTkxRdfLIc4vXr1yogRI3LWWWflhBNOyO67754k+eIXv1ge4z//+U/233//HHbYYTnqqKPSuXPn5c7rhz/8YaqqqnL66adnxowZueyyy9K3b98888wzad269Qqvb0Xm9kGlUilf+cpX8sADD2TQoEHZZpttcs899+TUU0/Nv//971x66aUN+j/88MP54x//mG9/+9tp3759fvazn+WQQw7J1KlTs9Zaay1zXu+991722muvvPjiixkyZEh69uyZm2++Occee2zeeeednHzyyenVq1d++9vfZtiwYenWrVu+973vJUnWWWedjxzzC1/4Qrp27ZqHH3643DZp0qQsWLAgX/ziF/PFL34xjzzySHmcJWfGLQnennvuuey+++6pra3Naaedlurq6vziF7/IXnvtlQkTJmTnnXdusL9vf/vbWWeddXLWWWeVz3gbNWpUvvWtb+WLX/xihg4dmpdffjlf+cpXsuaaa6Z79+7L/DxWxg9/+MP893//d77+9a/n+OOPz5tvvpmf//zn2WOPPfL00083ODvw7bffzn777ZeDDz44X//61/P73/8+p59+erbccsvsv//+Sd4PWvfee++88cYbOfnkk1NXV5cbbrghDzzwQIP9/uAHP8jMmTPz2muvleugXbt2Dfr8+Mc/TrNmzXLKKadk5syZufDCC3PkkUfm8ccfT5IsWLAg/fv3z/z58/Od73wndXV1+fe//53bb78977zzTjp06FCRzwgA+IASAEBBRo8eXUpSmjRp0jL7dOjQobTtttuWX5999tmlD/4T5dJLLy0lKb355pvLHGPSpEmlJKXRo0cvtW3PPfcsJSmNHDnyI7ftueee5dcPPPBAKUlp3XXXLc2aNavcftNNN5WSlC6//PJyW48ePUoDBw782DGXN7eBAweWevToUX59yy23lJKUzj///Ab9/uu//qtUVVVVevHFF8ttSUotW7Zs0PbnP/+5lKT085//fKl9fdBll11WSlK67rrrym0LFiwo9e7du9SuXbsGa+/Ro0dpwIAByx1via997Wul1q1blxYsWFAqlUqlCy64oNSzZ89SqVQqXXXVVaVOnTqV+55yyimlJKV///vfpVKpVDrooINKLVu2LL300kvlPq+//nqpffv2pT322KPctqSmdtttt9LChQsbzL9Tp06lbbbZpjR//vxy+y9/+ctSkgbfybJ83Fr/+c9/lpo3b1764Q9/2KD92WefLbVo0aJB+5K6+81vflNumz9/fqmurq50yCGHlNsuvvjiUpLSLbfcUm577733SptuumkpSemBBx4otw8YMKBBvSyxpG579erVYO2XX355KUnp2WefLZVKpdLTTz9dSlK6+eabP/azAAAqw6WmAECjateu3XKfbrrkDKJbb701ixcvXqV91NTU5Ljjjlvh/sccc0yD+47913/9V7p06ZI777xzlfa/ou688840b9483/3udxu0f+9730upVMpdd93VoL1v377ZYIMNyq+32mqr1NbW5uWXX/7Y/dTV1eXwww8vt1VXV+e73/1uZs+enQkTJqzS/HfbbbcG93J75JFHymf37brrrpkxY0ZeeOGF8raePXuma9euWbRoUcaOHZuDDjooX/jCF8rjdenSJUcccUQefvjhzJo1q8G+vvnNb6Z58+bl108++WRmzJiRE088scF9+4499tiKncn1xz/+MYsXL87Xv/71/N//+3/LP3V1ddloo42WOkutXbt2Oeqoo8qvW7ZsmZ122qnB93P33Xdn3XXXzVe+8pVyW6tWrZZ5BujyHHfccQ3WvuQMyyX7W/I53HPPPeX7HAIAxRK8AQCNavbs2cu9uf6hhx6aXXfdNccff3w6d+6cww47LDfddNNKhXDrrrvuSj1EYaONNmrwuqqqKhtuuOEy729WKa+++mq6du261OfRq1ev8vYPWm+99ZYaY4011sjbb7/9sfvZaKON0qxZw38KLms/K+qD93krlUp59NFHs+uuuyZJtthii9TW1uaRRx7JvHnzMnny5HL/N998M3Pnzs0mm2yy1Ji9evXK4sWLl7qHWs+ePZdaU7L0d1ddXd0gzPskXnjhhZRKpWy00UZZZ511Gvz87W9/y4wZMxr079at21L3K/zw9/Pqq69mgw02WKrfhhtuuNLz+3A9rLHGGklS3l/Pnj0zfPjw/PrXv87aa6+d/v3758orr3R/NwAokHu8AQCN5rXXXsvMmTOXGzK0bt06Dz74YB544IHccccdufvuu3PjjTdm7733ztixYxuc9bS8MSrtw0HJEosWLVqhOVXCsvZT+tCDGD4tW2+9ddq3b5+HH344BxxwQN56663yGW/NmjXLzjvvnIcffjgbbLBBFixY0ODBCiuriO/04yxevDhVVVW56667PvKz//A91z7t72dF9nfxxRfn2GOPza233pqxY8fmu9/9bi644II89thjDR5SAQBUhjPeAIBG89vf/jZJ0r9//+X2a9asWfbZZ59ccsklef755/PDH/4w999/f/nSvmWFYKtqyeWQS5RKpbz44osNniK5xhpr5J133lnqvR8+W2xl5tajR4+8/vrrS116+/e//728vRJ69OiRF154YamzBj/pfpo3b55ddtkljzzySB5++OHU1tZmyy23LG9f8oCFJQ/GWBK8rbPOOmnTpk2mTJmy1Jh///vf06xZs499OMKSOX/4u6uvr88rr7yySuv5sA022CClUik9e/ZM3759l/rZZZddVnrMHj165KWXXloqjPvw00iTytX5lltumTPPPDMPPvhgHnroofz73//OyJEjKzI2ANCQ4A0AaBT3339/zjvvvPTs2TNHHnnkMvu99dZbS7Vts802SZL58+cnSdq2bZskHxmErYrf/OY3DcKv3//+93njjTfKT6JM3g9hHnvssSxYsKDcdvvtty91SeTKzO2AAw7IokWLcsUVVzRov/TSS1NVVdVg/5/EAQcckGnTpuXGG28sty1cuDA///nP065du+y5556rPPZuu+2WN998M6NHj87OO+/c4HLWL37xi5kyZUpuvfXWrLXWWuVLW5s3b55+/frl1ltvbXA57/Tp03PDDTdkt912S21t7XL3u8MOO2SdddbJyJEjG3wnY8aMqVhdHHzwwWnevHnOPffcpYKyUqmU//znPys9Zv/+/fPvf/87t912W7lt3rx5+dWvfrVU37Zt236iy0JnzZqVhQsXNmjbcsst06xZs/LfJQCgslxqCgAU7q677srf//73LFy4MNOnT8/999+fcePGpUePHrntttvSqlWrZb53xIgRefDBBzNgwID06NEjM2bMyFVXXZVu3bqVz5jaYIMN0rFjx4wcOTLt27dP27Zts/POOy91H7AVteaaa2a33XbLcccdl+nTp+eyyy7Lhhtu2OCG98cff3x+//vfZ7/99svXv/71vPTSS7nuuusaPOxgZef25S9/OX369MkPfvCD/POf/8zWW2+dsWPH5tZbb83QoUOXGntVnXDCCfnFL36RY489NpMnT87666+f3//+93nkkUdy2WWXLfeeex9nyXcyceLEnHPOOQ227bLLLqmqqspjjz2WL3/5yw3O4Dr//PMzbty47Lbbbvn2t7+dFi1a5Be/+EXmz5+fCy+88GP3W11dnfPPPz/f+ta3svfee+fQQw/NK6+8ktGjR6/UPd5efPHFnH/++Uu1b7vtthkwYEDOP//8nHHGGfnnP/+Zgw46KO3bt88rr7ySP/3pTznhhBNyyimnrPC+kuRb3/pWrrjiihx++OE5+eST06VLl1x//fXlvxMf/Iy233773HjjjRk+fHh23HHHtGvXLl/+8pdXeF/3339/hgwZkq997WvZeOONs3Dhwvz2t79N8+bNc8ghh6zUvAGAFdRIT1MFAFYDo0ePLiUp/7Rs2bJUV1dX2nfffUuXX355adasWUu95+yzzy598J8o9913X+nAAw8sde3atdSyZctS165dS4cffnjpH//4R4P33XrrraXNNtus1KJFi1KS0ujRo0ulUqm05557ljbffPOPnN+ee+5Z2nPPPcuvH3jggVKS0v/8z/+UzjjjjFKnTp1KrVu3Lg0YMKD06quvLvX+iy++uLTuuuuWampqSrvuumvpySefXGrM5c1t4MCBpR49ejTo++6775aGDRtW6tq1a6m6urq00UYblS666KLS4sWLG/RLUho8ePBSc+rRo0dp4MCBH7neD5o+fXrpuOOOK6299tqlli1blrbccsvyvD483oABAz52vCXmzJlTXufYsWOX2r7VVluVkpR+8pOfLLXtqaeeKvXv37/Url27Ups2bUp9+vQpPfroow36LKmpSZMmfeT+r7rqqlLPnj1LNTU1pR122KH04IMPfuR38lF69OjRoF4/+DNo0KByvz/84Q+l3XbbrdS2bdtS27ZtS5tuumlp8ODBpSlTppT7LKvuPuo7f/nll0sDBgwotW7durTOOuuUvve975X+8Ic/lJKUHnvssXK/2bNnl4444ohSx44dS0nK4yyp25tvvrnBuK+88kqDenv55ZdL3/jGN0obbLBBqVWrVqU111yz1KdPn9K99977sZ8NALBqqkqlRrr7LgAA8JEuu+yyDBs2LK+99lrWXXfdxp4OALCKBG8AANCI3nvvvQZPaZ03b1623XbbLFq0KP/4xz8acWYAwCflHm8AANCIDj744Ky33nrZZpttMnPmzFx33XX5+9//nuuvv76xpwYAfEKCNwAAaET9+/fPr3/961x//fVZtGhRNttss/zud7/LoYce2thTAwA+IZeaAgAAAEABmjX2BAAAAADg80jwBgAAAAAFcI+3FbB48eK8/vrrad++faqqqhp7OgAAAAA0olKplHfffTddu3ZNs2bLPq9N8LYCXn/99XTv3r2xpwEAAADAZ8i//vWvdOvWbZnbBW8roH379kne/zBra2sbeTY0BfX19Rk7dmz69euX6urqxp4OTZhaolLUEpWilqgEdUSlqCUqRS2xsmbNmpXu3buXM6NlEbytgCWXl9bW1greWCH19fVp06ZNamtrHbT5RNQSlaKWqBS1RCWoIypFLVEpaolV9XG3JPNwBQAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACtCisScALN+gMZMqPuaoY3es+JgAAABAQ854AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAjRq8Lb++uunqqpqqZ/BgwcnSebNm5fBgwdnrbXWSrt27XLIIYdk+vTpDcaYOnVqBgwYkDZt2qRTp0459dRTs3DhwgZ9xo8fn+222y41NTXZcMMNM2bMmE9riQAAAACspho1eJs0aVLeeOON8s+4ceOSJF/72teSJMOGDcv//u//5uabb86ECRPy+uuv5+CDDy6/f9GiRRkwYEAWLFiQRx99NNdee23GjBmTs846q9znlVdeyYABA9KnT58888wzGTp0aI4//vjcc889n+5iAQAAAFittGjMna+zzjoNXv/4xz/OBhtskD333DMzZ87MqFGjcsMNN2TvvfdOkowePTq9evXKY489ll122SVjx47N888/n3vvvTedO3fONttsk/POOy+nn356zjnnnLRs2TIjR45Mz549c/HFFydJevXqlYcffjiXXnpp+vfv/5Hzmj9/fubPn19+PWvWrCRJfX196uvri/go+JxZUieVqJcWWfyJx/gwddx0VLKWWL2pJSpFLVEJ6ohKUUtUilpiZa1orVSVSqVSwXNZIQsWLEjXrl0zfPjwfP/738/999+fffbZJ2+//XY6duxY7tejR48MHTo0w4YNy1lnnZXbbrstzzzzTHn7K6+8ki984Qt56qmnsu2222aPPfbIdtttl8suu6zcZ/To0Rk6dGhmzpz5kXM555xzcu655y7VfsMNN6RNmzaVWjIAAAAATdDcuXNzxBFHZObMmamtrV1mv0Y94+2Dbrnllrzzzjs59thjkyTTpk1Ly5YtG4RuSdK5c+dMmzat3Kdz585LbV+ybXl9Zs2alffeey+tW7deai5nnHFGhg8fXn49a9asdO/ePf369VvuhwlL1NfXZ9y4cdl3331TXV39icYacv1TFZrV/3PFkdtVfEyKUclaYvWmlqgUtUQlqCMqRS1RKWqJlbXk6siP85kJ3kaNGpX9998/Xbt2beyppKamJjU1NUu1V1dX+wvISqlEzSws4FaM6rjpcfyhUtQSlaKWqAR1RKWoJSpFLbGiVrROGvXhCku8+uqruffee3P88ceX2+rq6rJgwYK88847DfpOnz49dXV15T4ffsrpktcf16e2tvYjz3YDAAAAgEr4TARvo0ePTqdOnTJgwIBy2/bbb5/q6urcd9995bYpU6Zk6tSp6d27d5Kkd+/eefbZZzNjxoxyn3HjxqW2tjabbbZZuc8Hx1jSZ8kYAAAAAFCERg/eFi9enNGjR2fgwIFp0eL/XfnaoUOHDBo0KMOHD88DDzyQyZMn57jjjkvv3r2zyy67JEn69euXzTbbLEcffXT+/Oc/55577smZZ56ZwYMHly8VPfHEE/Pyyy/ntNNOy9///vdcddVVuemmmzJs2LBGWS8AAAAAq4dGv8fbvffem6lTp+Yb3/jGUtsuvfTSNGvWLIccckjmz5+f/v3756qrripvb968eW6//facdNJJ6d27d9q2bZuBAwdmxIgR5T49e/bMHXfckWHDhuXyyy9Pt27d8utf/zr9+/f/VNYHAAAAwOqp0YO3fv36pVQqfeS2Vq1a5corr8yVV165zPf36NEjd95553L3sddee+Xpp5/+RPMEAAAAgJXR6JeaAgAAAMDnkeANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAoQKMHb//+979z1FFHZa211krr1q2z5ZZb5sknnyxvL5VKOeuss9KlS5e0bt06ffv2zQsvvNBgjLfeeitHHnlkamtr07FjxwwaNCizZ89u0Ocvf/lLdt9997Rq1Srdu3fPhRde+KmsDwAAAIDVU6MGb2+//XZ23XXXVFdX56677srzzz+fiy++OGussUa5z4UXXpif/exnGTlyZB5//PG0bds2/fv3z7x588p9jjzyyDz33HMZN25cbr/99jz44IM54YQTyttnzZqVfv36pUePHpk8eXIuuuiinHPOOfnlL3/5qa4XAAAAgNVHi8bc+U9+8pN07949o0ePLrf17Nmz/OdSqZTLLrssZ555Zg488MAkyW9+85t07tw5t9xySw477LD87W9/y913351JkyZlhx12SJL8/Oc/zwEHHJCf/vSn6dq1a66//vosWLAg11xzTVq2bJnNN988zzzzTC655JIGAR0AAAAAVEqjBm+33XZb+vfvn6997WuZMGFC1l133Xz729/ON7/5zSTJK6+8kmnTpqVv377l93To0CE777xzJk6cmMMOOywTJ05Mx44dy6FbkvTt2zfNmjXL448/nq9+9auZOHFi9thjj7Rs2bLcp3///vnJT36St99+u8EZdkkyf/78zJ8/v/x61qxZSZL6+vrU19cX8lnw+bKkTipRLy2y+BOP8WHquOmoZC2xelNLVIpaohLUEZWilqgUtcTKWtFaadTg7eWXX87VV1+d4cOH5/vf/34mTZqU7373u2nZsmUGDhyYadOmJUk6d+7c4H2dO3cub5s2bVo6derUYHuLFi2y5pprNujzwTPpPjjmtGnTlgreLrjggpx77rlLzXfs2LFp06bNJ1gxq5tx48Z94jEOWOPj+6ysO++8s/KDUqhK1BIkaonKUUtUgjqiUtQSlaKWWFFz585doX6NGrwtXrw4O+ywQ370ox8lSbbddtv89a9/zciRIzNw4MBGm9cZZ5yR4cOHl1/PmjUr3bt3T79+/VJbW9to81qdDbn+qYqPecWR21V8zCXq6+szbty47Lvvvqmurv5EYzW1tVNZlawlVm9qiUpRS1SCOqJS1BKVopZYWUuujvw4jRq8denSJZtttlmDtl69euUPf/hDkqSuri5JMn369HTp0qXcZ/r06dlmm23KfWbMmNFgjIULF+att94qv7+uri7Tp09v0GfJ6yV9PqimpiY1NTVLtVdXV/sL2EgWFvAckE/ju6xEzTTVtVNZjj9UilqiUtQSlaCOqBS1RKWoJVbUitZJoz7VdNddd82UKVMatP3jH/9Ijx49krz/oIW6urrcd9995e2zZs3K448/nt69eydJevfunXfeeSeTJ08u97n//vuzePHi7LzzzuU+Dz74YIPrb8eNG5dNNtlkqctMAQAAAKASGjV4GzZsWB577LH86Ec/yosvvpgbbrghv/zlLzN48OAkSVVVVYYOHZrzzz8/t912W5599tkcc8wx6dq1aw466KAk758ht99+++Wb3/xmnnjiiTzyyCMZMmRIDjvssHTt2jVJcsQRR6Rly5YZNGhQnnvuudx44425/PLLG1xOCgAAAACV1KiXmu64447505/+lDPOOCMjRoxIz549c9lll+XII48s9znttNMyZ86cnHDCCXnnnXey22675e67706rVq3Kfa6//voMGTIk++yzT5o1a5ZDDjkkP/vZz8rbO3TokLFjx2bw4MHZfvvts/baa+ess87KCSec8KmuFwAAAIDVR6MGb0nypS99KV/60peWub2qqiojRozIiBEjltlnzTXXzA033LDc/Wy11VZ56KGHVnmeAAAAALAyGvVSUwAAAAD4vBK8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFCAFo09AYBlGTRmUsXHHHXsjhUfEwAAAD6KM94AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAjRq8nXPOOamqqmrws+mmm5a3z5s3L4MHD85aa62Vdu3a5ZBDDsn06dMbjDF16tQMGDAgbdq0SadOnXLqqadm4cKFDfqMHz8+2223XWpqarLhhhtmzJgxn8byAAAAAFiNtWjsCWy++ea59957y69btPh/Uxo2bFjuuOOO3HzzzenQoUOGDBmSgw8+OI888kiSZNGiRRkwYEDq6ury6KOP5o033sgxxxyT6urq/OhHP0qSvPLKKxkwYEBOPPHEXH/99bnvvvty/PHHp0uXLunfv/+nu9jPmEFjJlV8zFHH7ljxMQEAAACaokYP3lq0aJG6urql2mfOnJlRo0blhhtuyN57750kGT16dHr16pXHHnssu+yyS8aOHZvnn38+9957bzp37pxtttkm5513Xk4//fScc845admyZUaOHJmePXvm4osvTpL06tUrDz/8cC699NLVPngDAAAAoDiNHry98MIL6dq1a1q1apXevXvnggsuyHrrrZfJkyenvr4+ffv2LffddNNNs95662XixInZZZddMnHixGy55Zbp3LlzuU///v1z0kkn5bnnnsu2226biRMnNhhjSZ+hQ4cuc07z58/P/Pnzy69nzZqVJKmvr099fX2FVt74WmRxxccs6vNpSnP94NiV2EdTW3slrc5rX6KStcTqTS1RKWqJSlBHVIpaolLUEitrRWulUYO3nXfeOWPGjMkmm2ySN954I+eee2523333/PWvf820adPSsmXLdOzYscF7OnfunGnTpiVJpk2b1iB0W7J9ybbl9Zk1a1bee++9tG7deql5XXDBBTn33HOXah87dmzatGmzyuv9rDlgjcqPeeedd1Z+0DStuX7QuHHjPvEYTXXtlbA6r/3DKlFLkKglKkctUQnqiEpRS1SKWmJFzZ07d4X6NWrwtv/++5f/vNVWW2XnnXdOjx49ctNNN31kIPZpOeOMMzJ8+PDy61mzZqV79+7p169famtrG21elTbk+qcqPuYVR25X8TGTpjXX5P3ke9y4cdl3331TXV39icZqamuvpNV57UtUspZYvaklKkUtUQnqiEpRS1SKWmJlLbk68uM0+qWmH9SxY8dsvPHGefHFF7PvvvtmwYIFeeeddxqc9TZ9+vTyPeHq6uryxBNPNBhjyVNPP9jnw09CnT59empra5cZ7tXU1KSmpmap9urq6s/VX8CFBTzUtqjPpynN9cP7+KT7aaprr4TVee0f9nk7/tB41BKVopaoBHVEpaglKkUtsaJWtE4q/1+1n8Ds2bPz0ksvpUuXLtl+++1TXV2d++67r7x9ypQpmTp1anr37p0k6d27d5599tnMmDGj3GfcuHGpra3NZpttVu7zwTGW9FkyBgAAAAAUoVGDt1NOOSUTJkzIP//5zzz66KP56le/mubNm+fwww9Phw4dMmjQoAwfPjwPPPBAJk+enOOOOy69e/fOLrvskiTp169fNttssxx99NH585//nHvuuSdnnnlmBg8eXD5j7cQTT8zLL7+c0047LX//+99z1VVX5aabbsqwYcMac+kAAAAAfM416qWmr732Wg4//PD85z//yTrrrJPddtstjz32WNZZZ50kyaWXXppmzZrlkEMOyfz589O/f/9cddVV5fc3b948t99+e0466aT07t07bdu2zcCBAzNixIhyn549e+aOO+7IsGHDcvnll6dbt2759a9/nf79+3/q6wUAAABg9dGowdvvfve75W5v1apVrrzyylx55ZXL7NOjR4+PfUrhXnvtlaeffnqV5ggAAAAAq+IzdY83AAAAAPi8ELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQgFUK3l5++eVKzwMAAAAAPldWKXjbcMMN06dPn1x33XWZN29epecEAAAAAE3eKgVvTz31VLbaaqsMHz48dXV1+da3vpUnnnii0nMDAAAAgCZrlYK3bbbZJpdffnlef/31XHPNNXnjjTey2267ZYsttsgll1ySN998s9LzBAAAAIAm5RM9XKFFixY5+OCDc/PNN+cnP/lJXnzxxZxyyinp3r17jjnmmLzxxhuVmicAAAAANCmfKHh78skn8+1vfztdunTJJZdcklNOOSUvvfRSxo0bl9dffz0HHnhgpeYJAAAAAE1Ki1V50yWXXJLRo0dnypQpOeCAA/Kb3/wmBxxwQJo1ez/H69mzZ8aMGZP111+/knMFAAAAgCZjlYK3q6++Ot/4xjdy7LHHpkuXLh/Zp1OnThk1atQnmhwAAAAANFWrFLy98MILH9unZcuWGThw4KoMDwAAAABN3ird42306NG5+eabl2q/+eabc+21137iSQEAAABAU7dKwdsFF1yQtddee6n2Tp065Uc/+tEqTeTHP/5xqqqqMnTo0HLbvHnzMnjw4Ky11lpp165dDjnkkEyfPr3B+6ZOnZoBAwakTZs26dSpU0499dQsXLiwQZ/x48dnu+22S01NTTbccMOMGTNmleYIAAAAACtqlYK3qVOnpmfPnku19+jRI1OnTl3p8SZNmpRf/OIX2WqrrRq0Dxs2LP/7v/+bm2++ORMmTMjrr7+egw8+uLx90aJFGTBgQBYsWJBHH3001157bcaMGZOzzjqr3OeVV17JgAED0qdPnzzzzDMZOnRojj/++Nxzzz0rPU8AAAAAWFGrFLx16tQpf/nLX5Zq//Of/5y11lprpcaaPXt2jjzyyPzqV7/KGmusUW6fOXNmRo0alUsuuSR77713tt9++4wePTqPPvpoHnvssSTJ2LFj8/zzz+e6667LNttsk/333z/nnXderrzyyixYsCBJMnLkyPTs2TMXX3xxevXqlSFDhuS//uu/cumll67K0gEAAABghazSwxUOP/zwfPe730379u2zxx57JEkmTJiQk08+OYcddthKjTV48OAMGDAgffv2zfnnn19unzx5curr69O3b99y26abbpr11lsvEydOzC677JKJEydmyy23TOfOnct9+vfvn5NOOinPPfdctt1220ycOLHBGEv6fPCS1g+bP39+5s+fX349a9asJEl9fX3q6+tXan2fZS2yuOJjFvX5NKW5fnDsSuyjqa29klbntS9RyVpi9aaWqBS1RCWoIypFLVEpaomVtaK1skrB23nnnZd//vOf2WeffdKixftDLF68OMccc8xK3ePtd7/7XZ566qlMmjRpqW3Tpk1Ly5Yt07FjxwbtnTt3zrRp08p9Phi6Ldm+ZNvy+syaNSvvvfdeWrduvdS+L7jggpx77rlLtY8dOzZt2rRZ4fV91h2wxsf3WVl33nln5QdN05rrB40bN+4Tj9FU114Jq/PaP6wStQSJWqJy1BKVoI6oFLVEpaglVtTcuXNXqN8qBW8tW7bMjTfemPPOOy9//vOf07p162y55Zbp0aPHCo/xr3/9KyeffHLGjRuXVq1arco0CnPGGWdk+PDh5dezZs1K9+7d069fv9TW1jbizCpryPVPVXzMK47cruJjJk1rrsn7yfe4ceOy7777prq6+hON1dTWXkmr89qXqGQtsXpTS1SKWqIS1BGVopaoFLXEylpydeTHWaXgbYmNN944G2+88Sq9d/LkyZkxY0a22+7//UfwokWL8uCDD+aKK67IPffckwULFuSdd95pcNbb9OnTU1dXlySpq6vLE0880WDcJU89/WCfDz8Jdfr06amtrf3Is92SpKamJjU1NUu1V1dXf67+Ai5ctVv8LVdRn09TmuuH9/FJ99NU114Jq/PaP+zzdvyh8aglKkUtUQnqiEpRS1SKWmJFrWidrFLwtmjRoowZMyb33XdfZsyYkcWLG96H6f777//YMfbZZ588++yzDdqOO+64bLrppjn99NPTvXv3VFdX57777sshhxySJJkyZUqmTp2a3r17J0l69+6dH/7wh5kxY0Y6deqU5P3TQmtra7PZZpuV+3z40rJx48aVxwAAAACAIqxS8HbyySdnzJgxGTBgQLbYYotUVVWt9Bjt27fPFlts0aCtbdu2WWuttcrtgwYNyvDhw7PmmmumtrY23/nOd9K7d+/ssssuSZJ+/fpls802y9FHH50LL7ww06ZNy5lnnpnBgweXz1g78cQTc8UVV+S0007LN77xjdx///256aabcscdd6zK0gEAAABghaxS8Pa73/0uN910Uw444IBKz6eBSy+9NM2aNcshhxyS+fPnp3///rnqqqvK25s3b57bb789J510Unr37p22bdtm4MCBGTFiRLlPz549c8cdd2TYsGG5/PLL061bt/z6179O//79C507AAAAAKu3VX64woYbbljpuWT8+PENXrdq1SpXXnllrrzyymW+p0ePHh/7lMK99torTz/9dCWmCAAAAAArZJXuXP69730vl19+eUqlUqXnAwAAAACfC6t0xtvDDz+cBx54IHfddVc233zzpZ7k8Mc//rEikwMAAACApmqVgreOHTvmq1/9aqXnAgAAAACfG6sUvI0ePbrS8wAAAACAz5VVCt6SZOHChRk/fnxeeumlHHHEEWnfvn1ef/311NbWpl27dpWcI8BqadCYSWmRxTlgjWTI9U9l4ardlrOBUcfuWIGZAQAAsCJWKXh79dVXs99++2Xq1KmZP39+9t1337Rv3z4/+clPMn/+/IwcObLS8wQAAACAJmWVTp84+eSTs8MOO+Ttt99O69aty+1f/epXc99991VscgAAAADQVK3SGW8PPfRQHn300bRs2bJB+/rrr59///vfFZkYAAAAADRlq3TG2+LFi7No0aKl2l977bW0b9/+E08KAAAAAJq6VQre+vXrl8suu6z8uqqqKrNnz87ZZ5+dAw44oFJzAwAAAIAma5UuNb344ovTv3//bLbZZpk3b16OOOKIvPDCC1l77bXzP//zP5WeIwAAAAA0OasUvHXr1i1//vOf87vf/S5/+ctfMnv27AwaNChHHnlkg4ctAAAAAMDqapWCtyRp0aJFjjrqqErOBQAAAAA+N1YpePvNb36z3O3HHHPMKk0GAAAAAD4vVil4O/nkkxu8rq+vz9y5c9OyZcu0adNG8AYAAADAam+Vnmr69ttvN/iZPXt2pkyZkt12283DFQAAAAAgqxi8fZSNNtooP/7xj5c6Gw4AAAAAVkcVC96S9x+48Prrr1dySAAAAABoklbpHm+33XZbg9elUilvvPFGrrjiiuy6664VmRgAAAAANGWrFLwddNBBDV5XVVVlnXXWyd57752LL764EvMCAAAAgCZtlYK3xYsXV3oeAAAAAPC5UtF7vAEAAAAA71ulM96GDx++wn0vueSSVdkFAAAAADRpqxS8Pf3003n66adTX1+fTTbZJEnyj3/8I82bN892221X7ldVVVWZWQIAAABAE7NKwduXv/zltG/fPtdee23WWGONJMnbb7+d4447Lrvvvnu+973vVXSSAAAAANDUrNI93i6++OJccMEF5dAtSdZYY42cf/75nmoKAAAAAFnF4G3WrFl58803l2p/88038+67737iSQEAAABAU7dKwdtXv/rVHHfccfnjH/+Y1157La+99lr+8Ic/ZNCgQTn44IMrPUcAAAAAaHJW6R5vI0eOzCmnnJIjjjgi9fX17w/UokUGDRqUiy66qKITBAAAAICmaJWCtzZt2uSqq67KRRddlJdeeilJssEGG6Rt27YVnRwAAAAANFWrdKnpEm+88UbeeOONbLTRRmnbtm1KpVKl5gUAAAAATdoqBW//+c9/ss8++2TjjTfOAQcckDfeeCNJMmjQoHzve9+r6AQBAAAAoClapeBt2LBhqa6uztSpU9OmTZty+6GHHpq77767YpMDAAAAgKZqle7xNnbs2Nxzzz3p1q1bg/aNNtoor776akUmBgAAAABN2Sqd8TZnzpwGZ7ot8dZbb6WmpuYTTwoAAAAAmrpVCt523333/OY3vym/rqqqyuLFi3PhhRemT58+FZscAAAAADRVq3Sp6YUXXph99tknTz75ZBYsWJDTTjstzz33XN5666088sgjlZ4jAAAAADQ5q3TG2xZbbJF//OMf2W233XLggQdmzpw5Ofjgg/P0009ngw02qPQcAQAAAKDJWekz3urr67Pffvtl5MiR+cEPflDEnAAAAACgyVvpM96qq6vzl7/8pYi5AAAAAMDnxipdanrUUUdl1KhRlZ4LAAAAAHxurNLDFRYuXJhrrrkm9957b7bffvu0bdu2wfZLLrmkIpMDAAAAgKZqpYK3l19+Oeuvv37++te/ZrvttkuS/OMf/2jQp6qqqnKzAwAAAIAmaqWCt4022ihvvPFGHnjggSTJoYcemp/97Gfp3LlzIZMDAAAAgKZqpe7xViqVGry+6667MmfOnIpOCAAAAAA+D1bp4QpLfDiIAwAAAADet1LBW1VV1VL3cHNPNwAAAABY2krd461UKuXYY49NTU1NkmTevHk58cQTl3qq6R//+MfKzRAAAAAAmqCVCt4GDhzY4PVRRx1V0ckAAAAAwOfFSgVvo0ePLmoeAAAAAPC58okergAAAAAAfDTBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABWjU4O3qq6/OVlttldra2tTW1qZ379656667ytvnzZuXwYMHZ6211kq7du1yyCGHZPr06Q3GmDp1agYMGJA2bdqkU6dOOfXUU7Nw4cIGfcaPH5/tttsuNTU12XDDDTNmzJhPY3kAAAAArMYaNXjr1q1bfvzjH2fy5Ml58skns/fee+fAAw/Mc889lyQZNmxY/vd//zc333xzJkyYkNdffz0HH3xw+f2LFi3KgAEDsmDBgjz66KO59tprM2bMmJx11lnlPq+88koGDBiQPn365JlnnsnQoUNz/PHH55577vnU1wsAAADA6qNFY+78y1/+coPXP/zhD3P11VfnscceS7du3TJq1KjccMMN2XvvvZMko0ePTq9evfLYY49ll112ydixY/P888/n3nvvTefOnbPNNtvkvPPOy+mnn55zzjknLVu2zMiRI9OzZ89cfPHFSZJevXrl4YcfzqWXXpr+/ft/6msGAAAAYPXQqMHbBy1atCg333xz5syZk969e2fy5Mmpr69P3759y3023XTTrLfeepk4cWJ22WWXTJw4MVtuuWU6d+5c7tO/f/+cdNJJee6557Lttttm4sSJDcZY0mfo0KHLnMv8+fMzf/788utZs2YlSerr61NfX1+hFTe+Fllc8TGL+nya0lw/OHYl9tHU1l5Jq/Pak/fXv+QzqNRn0ZTWT2VV8rjE6k0tUQnqiEpRS1SKWmJlrWitNHrw9uyzz6Z3796ZN29e2rVrlz/96U/ZbLPN8swzz6Rly5bp2LFjg/6dO3fOtGnTkiTTpk1rELot2b5k2/L6zJo1K++9915at2691JwuuOCCnHvuuUu1jx07Nm3atFnltX7WHLBG5ce88847Kz9omtZcP2jcuHGfeIymuvZKWJ3XnjRcf781ZlRkzKa0fopRieMSJGqJylBHVIpaolLUEitq7ty5K9Sv0YO3TTbZJM8880xmzpyZ3//+9xk4cGAmTJjQqHM644wzMnz48PLrWbNmpXv37unXr19qa2sbcWaVNeT6pyo+5hVHblfxMZOmNdfk/eR73Lhx2XfffVNdXf2Jxmpqa6+k1Xntyfvrb5HF6bfGjIx9u1MWVuC2nE1p/VRWJY9LrN7UEpWgjqgUtUSlqCVW1pKrIz9OowdvLVu2zIYbbpgk2X777TNp0qRcfvnlOfTQQ7NgwYK88847Dc56mz59eurq6pIkdXV1eeKJJxqMt+Sppx/s8+EnoU6fPj21tbUfebZbktTU1KSmpmap9urq6s/VX8BK/Ef8hxX1+TSluX54H590P0117ZWwOq89abj+hWlWkc+jKa2fYnzefpfReNQSlaCOqBS1RKWoJVbUitZJoz7V9KMsXrw48+fPz/bbb5/q6urcd9995W1TpkzJ1KlT07t37yRJ79698+yzz2bGjP93Cda4ceNSW1ubzTbbrNzng2Ms6bNkDAAAAAAoQqOe8XbGGWdk//33z3rrrZd33303N9xwQ8aPH5977rknHTp0yKBBgzJ8+PCsueaaqa2tzXe+85307t07u+yyS5KkX79+2WyzzXL00UfnwgsvzLRp03LmmWdm8ODB5TPWTjzxxFxxxRU57bTT8o1vfCP3339/brrpptxxxx2NuXSAz41BYyZVfMxRx+5Y8TEBAAA+bY0avM2YMSPHHHNM3njjjXTo0CFbbbVV7rnnnuy7775JkksvvTTNmjXLIYcckvnz56d///656qqryu9v3rx5br/99px00knp3bt32rZtm4EDB2bEiBHlPj179swdd9yRYcOG5fLLL0+3bt3y61//Ov379//U1wsAAADA6qNRg7dRo0Ytd3urVq1y5ZVX5sorr1xmnx49enzsU/r22muvPP3006s0RwAAAABYFZ+5e7wBAAAAwOeB4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAArQorEnAABN1aAxkwoZd9SxOxYyLgAA8OlyxhsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABWjU4O2CCy7IjjvumPbt26dTp0456KCDMmXKlAZ95s2bl8GDB2ettdZKu3btcsghh2T69OkN+kydOjUDBgxImzZt0qlTp5x66qlZuHBhgz7jx4/Pdtttl5qammy44YYZM2ZM0csDAAAAYDXWqMHbhAkTMnjw4Dz22GMZN25c6uvr069fv8yZM6fcZ9iwYfnf//3f3HzzzZkwYUJef/31HHzwweXtixYtyoABA7JgwYI8+uijufbaazNmzJicddZZ5T6vvPJKBgwYkD59+uSZZ57J0KFDc/zxx+eee+75VNcLAAAAwOqjRWPu/O67727wesyYMenUqVMmT56cPfbYIzNnzsyoUaNyww03ZO+9906SjB49Or169cpjjz2WXXbZJWPHjs3zzz+fe++9N507d84222yT8847L6effnrOOeectGzZMiNHjkzPnj1z8cUXJ0l69eqVhx9+OJdeemn69+//qa8bAAAAgM+/Rg3ePmzmzJlJkjXXXDNJMnny5NTX16dv377lPptuumnWW2+9TJw4MbvssksmTpyYLbfcMp07dy736d+/f0466aQ899xz2XbbbTNx4sQGYyzpM3To0I+cx/z58zN//vzy61mzZiVJ6uvrU19fX5G1fha0yOKKj1nU59OU5vrBsSuxj6a29kpandeevL/+JZ9BpT6LIta/On9PRaw9KWb9lTwusXpTS1SCOqJS1BKVopZYWStaK1WlUqlU8FxWyOLFi/OVr3wl77zzTh5++OEkyQ033JDjjjuuQQiWJDvttFP69OmTn/zkJznhhBPy6quvNrhsdO7cuWnbtm3uvPPO7L///tl4441z3HHH5Ywzzij3ufPOOzNgwIDMnTs3rVu3bjD+Oeeck3PPPXepOd5www1p06ZNJZcNAAAAQBMzd+7cHHHEEZk5c2Zqa2uX2e8zc8bb4MGD89e//rUcujWmM844I8OHDy+/njVrVrp3755+/fot98NsaoZc/1TFx7ziyO0qPmbStOaavJ98jxs3Lvvuu2+qq6s/0VhNbe2VtDqvPXl//S2yOP3WmJGxb3fKwgrclrOI9a/O31MRa0+KWX8lj0us3tQSlaCOqBS1RKWoJVbWkqsjP85nIngbMmRIbr/99jz44IPp1q1bub2uri4LFizIO++8k44dO5bbp0+fnrq6unKfJ554osF4S556+sE+H34S6vTp01NbW7vU2W5JUlNTk5qamqXaq6urP1d/ASvxH/EfVtTn05Tm+uF9fNL9NNW1V8LqvPak4foXpllFPo8i1r86f09FrD0pdv2ft99lNB61RCWoIypFLVEpaokVtaJ10qhPNS2VShkyZEj+9Kc/5f7770/Pnj0bbN9+++1TXV2d++67r9w2ZcqUTJ06Nb17906S9O7dO88++2xmzJhR7jNu3LjU1tZms802K/f54BhL+iwZAwAAAAAqrVHPeBs8eHBuuOGG3HrrrWnfvn2mTZuWJOnQoUNat26dDh06ZNCgQRk+fHjWXHPN1NbW5jvf+U569+6dXXbZJUnSr1+/bLbZZjn66KNz4YUXZtq0aTnzzDMzePDg8llrJ554Yq644oqcdtpp+cY3vpH7778/N910U+64445GWzsAAAAAn2+Nesbb1VdfnZkzZ2avvfZKly5dyj833nhjuc+ll16aL33pSznkkEOyxx57pK6uLn/84x/L25s3b57bb789zZs3T+/evXPUUUflmGOOyYgRI8p9evbsmTvuuCPjxo3L1ltvnYsvvji//vWv079//091vQAAAACsPhr1jLcVeaBqq1atcuWVV+bKK69cZp8ePXrkzjvvXO44e+21V55++umVniMAAAAArIrPxMMVAICmZ9CYSRUfc9SxO1Z8TAAAaCyNeqkpAAAAAHxeCd4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAALRp7AgAATc2gMZMqPuaoY3es+JgAADQuZ7wBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUQPAGAAAAAAUQvAEAAABAAQRvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABGjV4e/DBB/PlL385Xbt2TVVVVW655ZYG20ulUs4666x06dIlrVu3Tt++ffPCCy806PPWW2/lyCOPTG1tbTp27JhBgwZl9uzZDfr85S9/ye67755WrVqle/fuufDCC4teGgAAAACruUYN3ubMmZOtt946V1555Uduv/DCC/Ozn/0sI0eOzOOPP562bdumf//+mTdvXrnPkUcemeeeey7jxo3L7bffngcffDAnnHBCefusWbPSr1+/9OjRI5MnT85FF12Uc845J7/85S8LXx8AAAAAq68Wjbnz/fffP/vvv/9HbiuVSrnsssty5pln5sADD0yS/OY3v0nnzp1zyy235LDDDsvf/va33H333Zk0aVJ22GGHJMnPf/7zHHDAAfnpT3+arl275vrrr8+CBQtyzTXXpGXLltl8883zzDPP5JJLLmkQ0AEAAABAJTVq8LY8r7zySqZNm5a+ffuW2zp06JCdd945EydOzGGHHZaJEyemY8eO5dAtSfr27ZtmzZrl8ccfz1e/+tVMnDgxe+yxR1q2bFnu079///zkJz/J22+/nTXWWGOpfc+fPz/z588vv541a1aSpL6+PvX19UUst1G0yOKKj1nU59OU5vrBsSuxj6a29kpandeevL/+JZ9BpT6LIta/On9PRaw9KWb9lTwuLeG7r6ymsvYiaonVjzqiUtQSlaKWWFkrWitVpVKpVPBcVkhVVVX+9Kc/5aCDDkqSPProo9l1113z+uuvp0uXLuV+X//611NVVZUbb7wxP/rRj3LttddmypQpDcbq1KlTzj333Jx00knp169fevbsmV/84hfl7c8//3w233zzPP/88+nVq9dScznnnHNy7rnnLtV+ww03pE2bNhVaMQAAAABN0dy5c3PEEUdk5syZqa2tXWa/z+wZb43pjDPOyPDhw8uvZ82ale7du6dfv37L/TCbmiHXP1XxMa84cruKj5k0rbkm7yff48aNy7777pvq6upPNFZTW3slrc5rT95ff4ssTr81ZmTs252ysAK35Sxi/avz91TE2pNi1l/J49ISvvvKaiprL6KWWP2oIypFLVEpaomVteTqyI/zmQ3e6urqkiTTp09vcMbb9OnTs80225T7zJgxo8H7Fi5cmLfeeqv8/rq6ukyfPr1BnyWvl/T5sJqamtTU1CzVXl1d/bn6C1iJ/4j/sKI+n6Y01w/v45Pup6muvRJW57UnDde/MM0q8nkUsf7V+XsqYu1Jseuv5O8y331lNZW1L/F5+3cRjUMdUSlqiUpRS6yoFa2TRn2q6fL07NkzdXV1ue+++8pts2bNyuOPP57evXsnSXr37p133nknkydPLve5//77s3jx4uy8887lPg8++GCDa2/HjRuXTTbZ5CPv7wYAAAAAldCowdvs2bPzzDPP5Jlnnkny/gMVnnnmmUydOjVVVVUZOnRozj///Nx222159tlnc8wxx6Rr167l+8D16tUr++23X775zW/miSeeyCOPPJIhQ4bksMMOS9euXZMkRxxxRFq2bJlBgwblueeey4033pjLL7+8waWkAAAAAFBpjXqp6ZNPPpk+ffqUXy8JwwYOHJgxY8bktNNOy5w5c3LCCSfknXfeyW677Za77747rVq1Kr/n+uuvz5AhQ7LPPvukWbNmOeSQQ/Kzn/2svL1Dhw4ZO3ZsBg8enO233z5rr712zjrrrJxwwgmf3kIBAD5nhlz/VEUvuR117I4VGwsA4LOiUYO3vfbaK8t7qGpVVVVGjBiRESNGLLPPmmuumRtuuGG5+9lqq63y0EMPrfI8AQAAAGBlfWbv8QYAAAAATZngDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDQAAAAAKIHgDAAAAgAII3gAAAACgAII3AAAAACiA4A0AAAAACiB4AwAAAIACCN4AAAAAoACCNwAAAAAoQIvGngAAABRh0JhJFR9z1LE7VnxMAODzyxlvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUoEVjTwAAAKisQWMmVXzMUcfuWPExAeDzzhlvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAAAAUADBGwAAAAAUoEVjTwAAAKCSBo2ZVPExRx27Y8XHBODzzxlvAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAE8XAEAAOBzwoMlAD5bVqsz3q688sqsv/76adWqVXbeeec88cQTjT0lAAAAAD6nVpvg7cYbb8zw4cNz9tln56mnnsrWW2+d/v37Z8aMGY09NQAAAAA+h1abS00vueSSfPOb38xxxx2XJBk5cmTuuOOOXHPNNfk//+f/NPLsAAAAWF24JBhWH6tF8LZgwYJMnjw5Z5xxRrmtWbNm6du3byZOnLhU//nz52f+/Pnl1zNnzkySvPXWW6mvry9+wp+Sxe+9W/Ex//Of/1R8zKRpzTVJ6uvrM3fu3PznP/9JdXX1Jxqrqa29klbntSfvr39xFmduzdz//8+f/CTlIta/On9PRaw9KWb9lTwuLeG7r6ymsvYltVSp49ISjk+V9VlfexHHpA/6rK+/SE1l7afc9OeKjNMii7N3x7n59q8nZGGa5adf37oi4xatqXxPq5Oij0t8/rz77vt/j0ul0nL7VZU+rsfnwOuvv5511103jz76aHr37l1uP+200zJhwoQ8/vjjDfqfc845Offccz/taQIAAADQhPzrX/9Kt27dlrl9tTjjbWWdccYZGT58ePn14sWL89Zbb2WttdZKVVVVI86MpmLWrFnp3r17/vWvf6W2traxp0MTppaoFLVEpaglKkEdUSlqiUpRS6ysUqmUd999N127dl1uv9UieFt77bXTvHnzTJ8+vUH79OnTU1dXt1T/mpqa1NTUNGjr2LFjkVPkc6q2ttZBm4pQS1SKWqJS1BKVoI6oFLVEpaglVkaHDh0+ts9q8VTTli1bZvvtt899991Xblu8eHHuu+++BpeeAgAAAEClrBZnvCXJ8OHDM3DgwOywww7Zaaedctlll2XOnDnlp5wCAAAAQCWtNsHboYcemjfffDNnnXVWpk2blm222SZ33313Onfu3NhT43OopqYmZ5999lKXLMPKUktUilqiUtQSlaCOqBS1RKWoJYqyWjzVFAAAAAA+bavFPd4AAAAA4NMmeAMAAACAAgjeAAAAAKAAgjcAAAAAKIDgDVbSBRdckB133DHt27dPp06dctBBB2XKlCnLfc+YMWNSVVXV4KdVq1af0oz5rDrnnHOWqotNN910ue+5+eabs+mmm6ZVq1bZcsstc+edd35Ks+WzbP3111+qlqqqqjJ48OCP7O+YxBIPPvhgvvzlL6dr166pqqrKLbfc0mB7qVTKWWedlS5duqR169bp27dvXnjhhY8d98orr8z666+fVq1aZeedd84TTzxR0Ar4rFheLdXX1+f000/PlltumbZt26Zr16455phj8vrrry93zFX5PUnT9nHHpGOPPXapmthvv/0+dlzHpNXPx9XSR/27qaqqKhdddNEyx3RMYlUJ3mAlTZgwIYMHD85jjz2WcePGpb6+Pv369cucOXOW+77a2tq88cYb5Z9XX331U5oxn2Wbb755g7p4+OGHl9n30UcfzeGHH55Bgwbl6aefzkEHHZSDDjoof/3rXz/FGfNZNGnSpAZ1NG7cuCTJ1772tWW+xzGJJJkzZ0623nrrXHnllR+5/cILL8zPfvazjBw5Mo8//njatm2b/v37Z968ecsc88Ybb8zw4cNz9tln56mnnsrWW2+d/v37Z8aMGUUtg8+A5dXS3Llz89RTT+W///u/89RTT+WPf/xjpkyZkq985SsfO+7K/J6k6fu4Y1KS7Lfffg1q4n/+53+WO6Zj0urp42rpgzX0xhtv5JprrklVVVUOOeSQ5Y7rmMQqKQGfyIwZM0pJShMmTFhmn9GjR5c6dOjw6U2KJuHss88ubb311ivc/+tf/3ppwIABDdp23nnn0re+9a0Kz4ym7uSTTy5tsMEGpcWLF3/kdsckPkqS0p/+9Kfy68WLF5fq6upKF110UbntnXfeKdXU1JT+53/+Z5nj7LTTTqXBgweXXy9atKjUtWvX0gUXXFDIvPns+XAtfZQnnniilKT06quvLrPPyv6e5PPlo+po4MCBpQMPPHClxnFMYkWOSQceeGBp7733Xm4fxyRWlTPe4BOaOXNmkmTNNddcbr/Zs2enR48e6d69ew488MA899xzn8b0+Ix74YUX0rVr13zhC1/IkUcemalTpy6z78SJE9O3b98Gbf3798/EiROLniZNyIIFC3LdddflG9/4RqqqqpbZzzGJj/PKK69k2rRpDY47HTp0yM4777zM486CBQsyefLkBu9p1qxZ+vbt61hFAzNnzkxVVVU6duy43H4r83uS1cP48ePTqVOnbLLJJjnppJPyn//8Z5l9HZNYEdOnT88dd9yRQYMGfWxfxyRWheANPoHFixdn6NCh2XXXXbPFFlsss98mm2ySa665Jrfeemuuu+66LF68OF/84hfz2muvfYqz5bNm5513zpgxY3L33Xfn6quvziuvvJLdd98977777kf2nzZtWjp37tygrXPnzpk2bdqnMV2aiFtuuSXvvPNOjj322GX2cUxiRSw5tqzMcef//t//m0WLFjlWsVzz5s3L6aefnsMPPzy1tbXL7Leyvyf5/Ntvv/3ym9/8Jvfdd19+8pOfZMKECdl///2zaNGij+zvmMSKuPbaa9O+ffscfPDBy+3nmMSqatHYE4CmbPDgwfnrX//6sdf29+7dO7179y6//uIXv5hevXrlF7/4Rc4777yip8ln1P7771/+81ZbbZWdd945PXr0yE033bRC/8cNPsqoUaOy//77p2vXrsvs45gENJb6+vp8/etfT6lUytVXX73cvn5P8mGHHXZY+c9bbrllttpqq2ywwQYZP3589tlnn0acGU3ZNddckyOPPPJjHzTlmMSqcsYbrKIhQ4bk9ttvzwMPPJBu3bqt1Hurq6uz7bbb5sUXXyxodjRFHTt2zMYbb7zMuqirq8v06dMbtE2fPj11dXWfxvRoAl599dXce++9Of7441fqfY5JfJQlx5aVOe6svfbaad68uWMVH2lJ6Pbqq69m3Lhxyz3b7aN83O9JVj9f+MIXsvbaay+zJhyT+DgPPfRQpkyZstL/dkock1hxgjdYSaVSKUOGDMmf/vSn3H///enZs+dKj7Fo0aI8++yz6dKlSwEzpKmaPXt2XnrppWXWRe/evXPfffc1aBs3blyDM5dYvY0ePTqdOnXKgAEDVup9jkl8lJ49e6aurq7BcWfWrFl5/PHHl3ncadmyZbbffvsG71m8eHHuu+8+x6rV3JLQ7YUXXsi9996btdZaa6XH+Ljfk6x+XnvttfznP/9ZZk04JvFxRo0ale233z5bb731Sr/XMYkVJXiDlTR48OBcd911ueGGG9K+fftMmzYt06ZNy3vvvVfuc8wxx+SMM84ovx4xYkTGjh2bl19+OU899VSOOuqovPrqq6v0f1b4/DjllFMyYcKE/POf/8yjjz6ar371q2nevHkOP/zwJEvX0cknn5y77747F198cf7+97/nnHPOyZNPPpkhQ4Y01hL4DFm8eHFGjx6dgQMHpkWLhneScExiWWbPnp1nnnkmzzzzTJL3H6jwzDPPZOrUqamqqsrQoUNz/vnn57bbbsuzzz6bY445Jl27ds1BBx1UHmOfffbJFVdcUX49fPjw/OpXv8q1116bv/3tbznppJMyZ86cHHfccZ/y6vg0La+W6uvr81//9V958sknc/3112fRokXlfz8tWLCgPMaHa+njfk/y+bO8Opo9e3ZOPfXUPPbYY/nnP/+Z++67LwceeGA23HDD9O/fvzyGYxLJ8mtpiVmzZuXmm29e5r9/HJOomMZ+rCo0NUk+8mf06NHlPnvuuWdp4MCB5ddDhw4trbfeeqWWLVuWOnfuXDrggANKTz311Kc/eT5TDj300FKXLl1KLVu2LK277rqlQw89tPTiiy+Wt3+4jkqlUummm24qbbzxxqWWLVuWNt9889Idd9zxKc+az6p77rmnlKQ0ZcqUpbY5JrEsDzzwwEf+TltSL4sXLy7993//d6lz586lmpqa0j777LNUjfXo0aN09tlnN2j7+c9/Xq6xnXbaqfTYY499SiuisSyvll555ZVl/vvpgQceKI/x4Vr6uN+TfP4sr47mzp1b6tevX2mdddYpVVdXl3r06FH65je/WZo2bVqDMRyTKJU+/vdbqVQq/eIXvyi1bt269M4773zkGI5JVEpVqVQqFZ7uAQAAAMBqxqWmAAAAAFAAwRsAAAAAFEDwBgAAAAAFELwBAAAAQAEEbwAAAABQAMEbAAAAABRA8AYAAAAABRC8AQAAAEABBG8AAGSvvfbK0KFDG3saq2TMmDHp2LFjY08DAGApgjcAgEY2cuTItG/fPgsXLiy3zZ49O9XV1dlrr70a9B0/fnyqqqry0ksvfapz/KyEW+uvv34uu+yyxp4GAMAKEbwBADSyPn36ZPbs2XnyySfLbQ899FDq6ury+OOPZ968eeX2Bx54IOutt1422GCDld5PqVRqEO4BAFAswRsAQCPbZJNN0qVLl4wfP77cNn78+Bx44IHp2bNnHnvssQbtffr0SZLMnz8/3/3ud9OpU6e0atUqu+22WyZNmtSgb1VVVe66665sv/32qampycMPP5w5c+bkmGOOSbt27dKlS5dcfPHFn3gN77zzTo4//viss846qa2tzd57750///nP5e3nnHNOttlmm/z2t7/N+uuvnw4dOuSwww7Lu+++W+7z7rvv5sgjj0zbtm3TpUuXXHrppQ0ugd1rr73y6quvZtiwYamqqkpVVVWDOdxzzz3p1atX2rVrl/322y9vvPHGJ14XAMAnIXgDAPgM6NOnTx544IHy6wceeCB77bVX9txzz3L7e++9l8cff7wcvJ122mn5wx/+kGuvvTZPPfVUNtxww/Tv3z9vvfVWg7H/z//5P/nxj3+cv/3tb9lqq61y6qmnZsKECbn11lszduzYjB8/Pk899dQnmv/Xvva1zJgxI3fddVcmT56c7bbbLvvss0+Dubz00ku55ZZbcvvtt+f222/PhAkT8uMf/7i8ffjw4XnkkUdy2223Zdy4cXnooYcazOuPf/xjunXrlhEjRuSNN95oEKzNnTs3P/3pT/Pb3/42Dz74YKZOnZpTTjnlE60JAOCTErwBAHwG9OnTJ4888kgWLlyYd999N08//XT23HPP7LHHHuUz4SZOnJj58+enT58+mTNnTq6++upcdNFF2X///bPZZpvlV7/6VVq3bp1Ro0Y1GHvEiBHZd999s8EGG6Rly5YZNWpUfvrTn2afffbJlltumWuvvfYTXYL68MMP54knnsjNN9+cHXbYIRtttFF++tOfpmPHjvn9739f7rd48eKMGTMmW2yxRXbfffccffTRue+++5K8f7bbtddeW57XFltskdGjR2fRokXl96+55ppp3rx52rdvn7q6utTV1ZW31dfXZ+TIkdlhhx2y3XbbZciQIeWxAQAaS4vGngAAAO9fRjlnzpxMmjQpb7/9djbeeOOss8462XPPPXPcccdl3rx5GT9+fL7whS9kvfXWy1/+8pfU19dn1113LY9RXV2dnXbaKX/7298ajL3DDjuU//zSSy9lwYIF2Xnnnctta665ZjbZZJNVnvuf//znzJ49O2uttVaD9vfee6/BQyDWX3/9tG/fvvy6S5cumTFjRpLk5ZdfTn19fXbaaafy9g4dOqzwvNq0adPgvncfHBsAoLEI3gAAPgM23HDDdOvWLQ888EDefvvt7LnnnkmSrl27pnv37nn00UfzwAMPZO+9917psdu2bVvp6TYwe/bspe5Rt8QHn4RaXV3dYFtVVVUWL15ckTl81NilUqkiYwMArCqXmgIAfEb06dMn48ePz/jx47PXXnuV2/fYY4/cddddeeKJJ8r3d1ty2egjjzxS7ldfX59JkyZls802W+Y+Nthgg1RXV+fxxx8vt7399tv5xz/+scrz3m677TJt2rS0aNEiG264YYOftddee4XG+MIXvpDq6uoGD4eYOXPmUvNq2bJlg8tPAQA+y5zxBgDwGdGnT58MHjw49fX15TPekmTPPffMkCFDsmDBgnLw1rZt25x00kk59dRTs+aaa2a99dbLhRdemLlz52bQoEHL3Ee7du0yaNCgnHrqqVlrrbXSqVOn/OAHP0izZh///2MXLVqUZ555pkFbTU1N+vbtm969e+eggw7KhRdemI033jivv/567rjjjnz1q19tcKnrsrRv3z4DBw4sr6dTp045++yz06xZswZPL11//fXz4IMP5rDDDktNTc0KB3sAAI1B8AYA8BnRp0+fvPfee9l0003TuXPncvuee+6Zd999N5tsskm6dOlSbv/xj3+cxYsX5+ijj867776bHXbYIffcc0/WWGON5e7noosuyuzZs/PlL3857du3z/e+973MnDnzY+c3e/bsbLvttg3aNthgg7z44ou5884784Mf/CDHHXdc3nzzzdTV1WWPPfZosI6Pc8kll+TEE0/Ml770pdTW1ua0007Lv/71r7Rq1arcZ8SIEfnWt76VDTbYIPPnz3c5KQDwmVZV8q8VAAA+g+bMmZN11103F1988XLP4gMA+KxyxhsAAJ8JTz/9dP7+979np512ysyZMzNixIgkyYEHHtjIMwMAWDWCNwAAPjN++tOfZsqUKWnZsmW23377PPTQQ+7jBgA0WS41BQAAAIACfPzjqwAAAACAlSZ4AwAAAIACCN4AAAAAoACCNwAAAAAogOANAAAAAAogeAMAAACAAgjeAAAAAKAAgjcAAAAAKMD/B+76Ym3jqlfjAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Word Lengths Statistics:\n", "count 38305.000000\n", "mean 4.302415\n", "std 2.679270\n", "min 1.000000\n", "25% 2.000000\n", "50% 4.000000\n", "75% 6.000000\n", "max 19.000000\n", "dtype: float64\n" ] }, { "data": { "text/plain": [ "'\\nWord Lengths Statistics:\\ncount 38304.000000\\nmean 4.302371\\nstd 2.679291\\nmin 1.000000\\n25% 2.000000\\n50% 4.000000\\n75% 6.000000\\nmax 19.000000\\ndtype: float64\\n'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word_lengths = [len(text) for text in image_texts]\n", "\n", "# Plotting the distribution of word lengths\n", "plt.figure(figsize=(15, 7))\n", "plt.hist(word_lengths, bins=50, alpha=0.7)\n", "plt.title('Distribution of Word Lengths')\n", "plt.xlabel('Word Length')\n", "plt.ylabel('Frequency')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "# Display basic statistics\n", "print(\"Word Lengths Statistics:\")\n", "print(pd.Series(word_lengths).describe())\n", "\n", "\n", "'''\n", "Word Lengths Statistics:\n", "count 38304.000000\n", "mean 4.302371\n", "std 2.679291\n", "min 1.000000\n", "25% 2.000000\n", "50% 4.000000\n", "75% 6.000000\n", "max 19.000000\n", "dtype: float64\n", "'''" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABmsAAANXCAYAAADaWmsEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACPmklEQVR4nOzdebhWZaH//89W3BskNuAASBIgjghOVEg5YBJbpQG1waFARVFDUzQHOoYgnSDNgY4mx5OCniCHjpqKR8WRjO2YiEOaA0gmgxNsQZn374/z4/m6BRW2G5fC63Vdz3V41rrXve71QH+c3q21ympra2sDAAAAAABAITYqegEAAAAAAAAbMrEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAPgVlZWU56aSTil4GfGLjxo1LWVlZZsyYsc7PddRRR6VDhw6l7zNmzEhZWVl+85vfrPNzJ8mwYcNSVlb2qZwLAIANm1gDAACfwEsvvZTjjz8+22yzTRo3bpzKysp8/etfz+jRo/Pee+8VvbxP7LXXXsuwYcMyderUT+2c999/f8rKylb7Oeywwz61dWwIPvhbV1RUpHXr1unZs2d+9atf5fXXX2+Q87z77rsZNmxY7r///gaZryF9ltcGAMCGo1HRCwAAgM+riRMn5vvf/34qKirSr1+/dOnSJUuWLMmDDz6YM844I88880yuuOKKopf5ibz22msZPnx4OnTokN122+1TPfdPf/rTfOUrX6mz7f13WdBwVv7Wy5cvz+uvv54pU6bk3HPPzUUXXZTrr78+3/jGN0pjf/zjH+ewww5LRUXFGs//7rvvZvjw4UmSnj17rvFx//Vf/5UVK1as8fj6+Ki1nXPOOTn77LPX6fkBACARawAAoF6mT5+eww47LO3bt8+9996brbbaqrRv0KBBefHFFzNx4sRPdU0LFy5M06ZNP9Vz1tearHXvvffO9773vTWab9myZVmxYkXKy8sbYnkbnNX91k8++WR69+6dQw89NM8++2zp3/jGG2+cjTfeeJ2uZ+W/j0022WSdnufjNGrUKI0a+X+bAQBY9zwGDQAA6uH888/PggULcuWVV9YJNSttu+22OeWUU1bZfvPNN6dLly6pqKjIzjvvnDvuuKPO/ldeeSU/+clPssMOO6RJkybZfPPN8/3vf3+V94OsfG/IAw88kJ/85Cdp1apVtt5667WaI0nmzZuXwYMHp0OHDqmoqMjWW2+dfv365Y033sj9999furPl6KOPLj0qa9y4caXjH3744RxwwAFp3rx5Nt100+y7777561//WuccK9/78eyzz+aII45Iy5Yts9dee63Jz7xa739vySWXXJJOnTqloqIizz77bJLkueeey/e+971sttlmady4cb785S/nlltuWWWeZ555Jt/4xjfSpEmTbL311vnlL3+Zq666apX3sZSVlWXYsGGrHN+hQ4ccddRRdbbNmzcvp556atq1a5eKiopsu+22+fWvf13n7pD3r/+KK64orf8rX/lKHn300VXO89xzz+UHP/hBttxyyzRp0iQ77LBD/u3f/i1Jct9996WsrCw33XTTKsdNmDAhZWVlqa6uXpOfdRW77rprLrnkksybNy+XXnppafvq3lnz2GOPpaqqKltssUWaNGmSjh075phjjild75ZbbpkkGT58eOnf0crf9KijjsoXvvCFvPTSSznooIPSrFmzHHnkkaV9H3Y31cUXX5z27dunSZMm2XffffP000/X2d+zZ8/V3sXz/jk/bm2re2fNsmXLMmLEiNLfW4cOHfLzn/88ixcvrjOuQ4cO+da3vpUHH3wwX/3qV9O4ceNss802ueaaa1b/gwMAsEHzPxECAIB6uPXWW7PNNtvka1/72hof8+CDD+bGG2/MT37ykzRr1iy//e1vc+ihh2bmzJnZfPPNkySPPvpopkyZksMOOyxbb711ZsyYkcsvvzw9e/bMs88+m0033bTOnD/5yU+y5ZZbZujQoVm4cOFazbFgwYLsvffe+fvf/55jjjkme+yxR954443ccsstefXVV7PTTjvlvPPOy9ChQzNw4MDsvffeSVK65nvvvTcHHnhgunXrlnPPPTcbbbRRxo4dm2984xv5y1/+kq9+9at11vr9738/2223XX71q1+ltrb2Y3+vd955J2+88UadbZtttlnpz2PHjs2iRYsycODAVFRUZLPNNsszzzyTr3/96/niF7+Ys88+O02bNs3111+fvn375n/+539y8MEHJ0lmz56d/fbbL8uWLSuNu+KKK9KkSZM1/vv8oHfffTf77rtv/vWvf+X444/Pl770pUyZMiVDhgzJrFmzcskll9QZP2HChLzzzjs5/vjjU1ZWlvPPPz+HHHJIXn755dIdJdOmTcvee++dTTbZJAMHDkyHDh3y0ksv5dZbb82///u/p2fPnmnXrl3Gjx9furaVxo8fn06dOqVHjx71vqbvfe97GTBgQO666678+7//+2rHzJ07N717986WW26Zs88+Oy1atMiMGTNy4403Jkm23HLLXH755TnxxBNz8MEH55BDDkmS7LLLLqU5li1blqqqquy11175zW9+s8q/8w+65ppr8s4772TQoEFZtGhRRo8enW984xt56qmn0rp16zW+vjVZ2wcde+yxufrqq/O9730vp59+eh5++OGMHDkyf//731eJZi+++GLpN+zfv3+uuuqqHHXUUenWrVt23nnnNV4nAAAbgFoAAGCtzJ8/vzZJ7Xe/+901PiZJbXl5ee2LL75Y2vbkk0/WJqn9j//4j9K2d999d5Vjq6ura5PUXnPNNaVtY8eOrU1Su9dee9UuW7aszvg1nWPo0KG1SWpvvPHGVcavWLGitra2tvbRRx+tTVI7duzYVfZvt912tVVVVaWxK8/dsWPH2m9+85ulbeeee25tktrDDz98lfOszn333VebZLWf6dOn106fPr02SW1lZWXt3Llz6xy7//7713bt2rV20aJFddb6ta99rXa77bYrbTv11FNrk9Q+/PDDpW1z586tbd68eek8KyWpPffcc1dZZ/v27Wv79+9f+j5ixIjapk2b1v7jH/+oM+7ss8+u3XjjjWtnzpxZW1tbW1r/5ptvXvvWW2+Vxv35z3+uTVJ76623lrbts88+tc2aNat95ZVX6sz5/t98yJAhtRUVFbXz5s2rcy2NGjVa7brfb+VvfcMNN3zomF133bW2ZcuWpe8r/+2t/I1uuumm2iS1jz766IfO8frrr3/o79i/f//aJLVnn332ave1b9++9H3lb9ekSZPaV199tbT94Ycfrk1SO3jw4NK2fffdt3bffff92Dk/am0r/+2uNHXq1Noktccee2ydcT/72c9qk9Tee++9pW3t27evTVI7efLk0ra5c+fWVlRU1J5++umrnAsAgA2bx6ABAMBaqqmpSZI0a9ZsrY7r1atXOnXqVPq+yy67pLKyMi+//HJp2/vv7Fi6dGnefPPNbLvttmnRokX+9re/rTLncccdt8r7Q9Z0jv/5n//JrrvuusodGUlWefTTB02dOjUvvPBCjjjiiLz55pt544038sYbb2ThwoXZf//9M3ny5FVeDH/CCSd85JwfNHTo0EyaNKnOp02bNqX9hx56aOkRVkny1ltv5d57780PfvCD0l05b7zxRt58881UVVXlhRdeyL/+9a8kye23354999yzzt0/W265ZenxW/Vxww03ZO+9907Lli1L537jjTfSq1evLF++PJMnT64z/oc//GFatmxZ+r7yzqWV/x5ef/31TJ48Occcc0y+9KUv1Tn2/X8//fr1y+LFi/OnP/2ptO26667LsmXL8qMf/aje17PSF77whbzzzjsfur9FixZJkttuuy1Lly6t93lOPPHENR7bt2/ffPGLXyx9/+pXv5ru3bvn9ttvr/f518TK+U877bQ6208//fQkWeU9VZ07dy79vSb/929shx12qPOfeQAASDwGDQAA1lplZWWSfOR/gb06H/wv3JOkZcuWefvtt0vf33vvvYwcOTJjx47Nv/71rzqPC5s/f/4qx3fs2HGVbWs6x0svvZRDDz10ra5hpRdeeCFJ0r9//w8dM3/+/DoxYnVr/Shdu3ZNr169PnT/B+d78cUXU1tbm1/84hf5xS9+sdpj5s6dmy9+8Yt55ZVX0r1791X277DDDmu1xvd74YUXMm3atDoB6YPnfr8P/ntY+Vut/Pew8r/Q79Kly0eed8cdd8xXvvKVjB8/PgMGDEjyf49A23PPPbPtttuu/YV8wIIFCz4yTO6777459NBDM3z48Fx88cXp2bNn+vbtmyOOOCIVFRVrdI5GjRqV3rm0JrbbbrtVtm2//fa5/vrr13iO+njllVey0UYbrfK7tmnTJi1atMgrr7xSZ/ua/GceAAASsQYAANZaZWVl2rZtu8oLzT/OB++AWen9MeXkk0/O2LFjc+qpp6ZHjx5p3rx5ysrKcthhh61yp0qS1b5jZW3nqI+V81xwwQXZbbfdVjvmC1/4wseu9ZP44Hwr1/Szn/0sVVVVqz2mIeLFSsuXL1/l/N/85jdz5plnrnb89ttvX+f7mvx7WFP9+vXLKaeckldffTWLFy/OQw89lEsvvXSt5/mgpUuX5h//+MdHBqOysrL86U9/ykMPPZRbb701d955Z4455phceOGFeeihh1b5d7A6FRUV2Wijhn3wQ1lZ2Wp/yw/+vdV37jXRkH/HAACs38QaAACoh29961u54oorUl1d/Yle4P5Bf/rTn9K/f/9ceOGFpW2LFi3KvHnzGnyOTp06fWxw+rD/Unrl49wqKys/8u6XT9M222yTJNlkk00+dk3t27cv3R30fs8///wq21q2bLnKb7dkyZLMmjWrzrZOnTplwYIFDfZ7rLyeNYmChx12WE477bT88Y9/zHvvvZdNNtkkP/zhDz/xGv70pz/lvffe+9D49X577rln9txzz/z7v/97JkyYkCOPPDLXXnttjj322DWOG2tqdX93//jHP9KhQ4fS95YtW672cWMfvPtlbdbWvn37rFixIi+88EJ22mmn0vY5c+Zk3rx5ad++/RrPBQAA7+edNQAAUA9nnnlmmjZtmmOPPTZz5sxZZf9LL72U0aNHr/W8G2+88Sr/q/v/+I//WKu7AdZ0jkMPPTRPPvlkbrrpplXmWHl806ZNk2SVWNGtW7d06tQpv/nNb7JgwYJVjn/99dfXeL0NpVWrVunZs2f+8z//c5WQ8sE1HXTQQXnooYfyyCOP1Nk/fvz4VY7r1KnTKu+bueKKK1b5PX/wgx+kuro6d9555ypzzJs3L8uWLVur69lyyy2zzz775KqrrsrMmTPr7Pvg3+8WW2yRAw88MH/4wx8yfvz4HHDAAdliiy3W6nwf9OSTT+bUU09Ny5YtM2jQoA8d9/bbb6+ynpV3Wy1evDhJsummmyZZ9d9Rfd18882l9w8lySOPPJKHH344Bx54YGlbp06d8txzz9X5e3/yySfz17/+tc5ca7O2gw46KElyySWX1Nl+0UUXJUn69OmzVtcBAAArubMGAADqoVOnTpkwYUJ++MMfZqeddkq/fv3SpUuXLFmyJFOmTMkNN9yQo446aq3n/da3vpX//u//TvPmzdO5c+dUV1fn7rvvzuabb97gc5xxxhn505/+lO9///s55phj0q1bt7z11lu55ZZbMmbMmOy6667p1KlTWrRokTFjxqRZs2Zp2rRpunfvno4dO+b3v/99DjzwwOy88845+uij88UvfjH/+te/ct9996WysjK33nrrWl//J3XZZZdlr732SteuXXPcccdlm222yZw5c1JdXZ1XX301Tz75ZJL/i23//d//nQMOOCCnnHJKmjZtmiuuuCLt27fPtGnT6sx57LHH5oQTTsihhx6ab37zm3nyySdz5513rhJDzjjjjNxyyy351re+laOOOirdunXLwoUL89RTT+VPf/pTZsyYsdYB5be//W322muv7LHHHhk4cGA6duyYGTNmZOLEiZk6dWqdsf369cv3vve9JMmIESPW6jx/+ctfsmjRoixfvjxvvvlm/vrXv+aWW25J8+bNc9NNN6VNmzYfeuzVV1+d3/3udzn44IPTqVOnvPPOO/mv//qvVFZWluJGkyZN0rlz51x33XXZfvvts9lmm6VLly4f+z6eD7Pttttmr732yoknnpjFixfnkksuyeabb17nEXTHHHNMLrroolRVVWXAgAGZO3duxowZk5133jk1NTWlcWuztl133TX9+/fPFVdckXnz5mXffffNI488kquvvjp9+/bNfvvtV6/rAQAAsQYAAOrpO9/5TqZNm5YLLrggf/7zn3P55ZenoqIiu+yySy688MIcd9xxaz3n6NGjs/HGG2f8+PFZtGhRvv71r+fuu+9eo8dQre0cX/jCF/KXv/wl5557bm666aZcffXVadWqVfbff//Sy9432WSTXH311RkyZEhOOOGELFu2LGPHjk3Hjh3Ts2fPVFdXZ8SIEbn00kuzYMGCtGnTJt27d8/xxx+/1tfeEDp37pzHHnssw4cPz7hx4/Lmm2+mVatW2X333TN06NDSuK222ir33XdfTj755IwaNSqbb755TjjhhLRt2zYDBgyoM+dxxx2X6dOn58orr8wdd9yRvffeO5MmTcr+++9fZ9ymm26aBx54IL/61a9yww035JprrkllZWW23377DB8+PM2bN1/r69l1113z0EMP5Re/+EUuv/zyLFq0KO3bt88PfvCDVcZ++9vfTsuWLbNixYp85zvfWavz/Pa3v03yf3/fLVq0yE477ZThw4fnuOOOy5ZbbvmRx64MFtdee23mzJmT5s2b56tf/WrGjx+fjh07lsb9/ve/z8knn5zBgwdnyZIlOffcc+sda/r165eNNtool1xySebOnZuvfvWrufTSS7PVVluVxuy000655pprMnTo0Jx22mnp3Llz/vu//zsTJkzI/fffX2e+tVnb73//+2yzzTYZN25cKWQNGTIk5557br2uBQAAkqSs1psNAQAAkiTjxo3L0UcfnenTp9d5/8nnwbJly9K2bdt8+9vfzpVXXln0cgAAgLXgnTUAAADrgZtvvjmvv/56+vXrV/RSAACAteQxaAAAAJ9jDz/8cKZNm5YRI0Zk9913z7777lv0kgAAgLXkzhoAAIDPscsvvzwnnnhiWrVqlWuuuabo5QAAAPXgnTUAAAAAAAAFcmcNAAAAAABAgcQaAAAAAACAAjUqegHrixUrVuS1115Ls2bNUlZWVvRyAAAAAACAAtXW1uadd95J27Zts9FGH33vjFjTQF577bW0a9eu6GUAAAAAAACfIf/85z+z9dZbf+QYsaaBNGvWLMn//eiVlZUFrwYAAAAAAChSTU1N2rVrV+oHH0WsaSArH31WWVkp1gAAAAAAAEmyRq9O+eiHpAEAAAAAALBOiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoECFxpqRI0fmK1/5Spo1a5ZWrVqlb9++ef755+uMWbRoUQYNGpTNN988X/jCF3LooYdmzpw5dcbMnDkzffr0yaabbppWrVrljDPOyLJly+qMuf/++7PHHnukoqIi2267bcaNG7fKei677LJ06NAhjRs3Tvfu3fPII480+DUDAAAAAAC8X6Gx5oEHHsigQYPy0EMPZdKkSVm6dGl69+6dhQsXlsYMHjw4t956a2644YY88MADee2113LIIYeU9i9fvjx9+vTJkiVLMmXKlFx99dUZN25chg4dWhozffr09OnTJ/vtt1+mTp2aU089Nccee2zuvPPO0pjrrrsup512Ws4999z87W9/y6677pqqqqrMnTv30/kxAAAAAACADVJZbW1tbdGLWOn1119Pq1at8sADD2SfffbJ/Pnzs+WWW2bChAn53ve+lyR57rnnstNOO6W6ujp77rln/vd//zff+ta38tprr6V169ZJkjFjxuSss87K66+/nvLy8px11lmZOHFinn766dK5DjvssMybNy933HFHkqR79+75yle+kksvvTRJsmLFirRr1y4nn3xyzj777I9de01NTZo3b5758+ensrKyoX8aAAAAAADgc2RtusFn6p018+fPT5JsttlmSZLHH388S5cuTa9evUpjdtxxx3zpS19KdXV1kqS6ujpdu3YthZokqaqqSk1NTZ555pnSmPfPsXLMyjmWLFmSxx9/vM6YjTbaKL169SqN+aDFixenpqamzgcAAAAAAGBtfWZizYoVK3Lqqafm61//erp06ZIkmT17dsrLy9OiRYs6Y1u3bp3Zs2eXxrw/1Kzcv3LfR42pqanJe++9lzfeeCPLly9f7ZiVc3zQyJEj07x589KnXbt29btwAAAAAABgg/aZiTWDBg3K008/nWuvvbbopayRIUOGZP78+aXPP//5z6KXBAAAAAAAfA41KnoBSXLSSSfltttuy+TJk7P11luXtrdp0yZLlizJvHnz6txdM2fOnLRp06Y05pFHHqkz35w5c0r7Vv7fldveP6aysjJNmjTJxhtvnI033ni1Y1bO8UEVFRWpqKio3wUDAAAAAAD8/wq9s6a2tjYnnXRSbrrpptx7773p2LFjnf3dunXLJptsknvuuae07fnnn8/MmTPTo0ePJEmPHj3y1FNPZe7cuaUxkyZNSmVlZTp37lwa8/45Vo5ZOUd5eXm6detWZ8yKFStyzz33lMYAAAAAAACsC4XeWTNo0KBMmDAhf/7zn9OsWbPS+2GaN2+eJk2apHnz5hkwYEBOO+20bLbZZqmsrMzJJ5+cHj16ZM8990yS9O7dO507d86Pf/zjnH/++Zk9e3bOOeecDBo0qHTnywknnJBLL700Z555Zo455pjce++9uf766zNx4sTSWk477bT0798/X/7yl/PVr341l1xySRYuXJijjz760/9hAAAAAACADUZZbW1tbWEnLytb7faxY8fmqKOOSpIsWrQop59+ev74xz9m8eLFqaqqyu9+97s6jyd75ZVXcuKJJ+b+++9P06ZN079//4waNSqNGv2/FnX//fdn8ODBefbZZ7P11lvnF7/4RekcK1166aW54IILMnv27Oy222757W9/m+7du6/RtdTU1KR58+aZP39+Kisr1+6HAAAAAAAA1itr0w0KjTXrE7EGAAAAAABYaW26QaHvrAEAAAAAANjQiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgRoVvQA2DB3Onliv42aM6tPAKwEAAAAAgM8Wd9YAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAoUKGxZvLkyfn2t7+dtm3bpqysLDfffHOd/WVlZav9XHDBBaUxHTp0WGX/qFGj6swzbdq07L333mncuHHatWuX888/f5W13HDDDdlxxx3TuHHjdO3aNbfffvs6uWYAAAAAAID3KzTWLFy4MLvuumsuu+yy1e6fNWtWnc9VV12VsrKyHHrooXXGnXfeeXXGnXzyyaV9NTU16d27d9q3b5/HH388F1xwQYYNG5YrrriiNGbKlCk5/PDDM2DAgDzxxBPp27dv+vbtm6effnrdXDgAAAAAAMD/r1GRJz/wwANz4IEHfuj+Nm3a1Pn+5z//Ofvtt1+22WabOtubNWu2ytiVxo8fnyVLluSqq65KeXl5dt5550ydOjUXXXRRBg4cmCQZPXp0DjjggJxxxhlJkhEjRmTSpEm59NJLM2bMmE9yiQAAAAAAAB/pc/POmjlz5mTixIkZMGDAKvtGjRqVzTffPLvvvnsuuOCCLFu2rLSvuro6++yzT8rLy0vbqqqq8vzzz+ftt98ujenVq1edOauqqlJdXf2h61m8eHFqamrqfAAAAAAAANZWoXfWrI2rr746zZo1yyGHHFJn+09/+tPsscce2WyzzTJlypQMGTIks2bNykUXXZQkmT17djp27FjnmNatW5f2tWzZMrNnzy5te/+Y2bNnf+h6Ro4cmeHDhzfEpQEAAAAAABuwz02sueqqq3LkkUemcePGdbafdtpppT/vsssuKS8vz/HHH5+RI0emoqJina1nyJAhdc5dU1OTdu3arbPzAQAAAAAA66fPRaz5y1/+kueffz7XXXfdx47t3r17li1blhkzZmSHHXZImzZtMmfOnDpjVn5f+Z6bDxvzYe/BSZKKiop1GoMAAAAAAIANw+finTVXXnllunXrll133fVjx06dOjUbbbRRWrVqlSTp0aNHJk+enKVLl5bGTJo0KTvssENatmxZGnPPPffUmWfSpEnp0aNHA14FAAAAAADAqgqNNQsWLMjUqVMzderUJMn06dMzderUzJw5szSmpqYmN9xwQ4499thVjq+urs4ll1ySJ598Mi+//HLGjx+fwYMH50c/+lEpxBxxxBEpLy/PgAED8swzz+S6667L6NGj6zzC7JRTTskdd9yRCy+8MM8991yGDRuWxx57LCeddNK6/QEAAAAAAIANXqGPQXvsscey3377lb6vDCj9+/fPuHHjkiTXXnttamtrc/jhh69yfEVFRa699toMGzYsixcvTseOHTN48OA6IaZ58+a56667MmjQoHTr1i1bbLFFhg4dmoEDB5bGfO1rX8uECRNyzjnn5Oc//3m222673HzzzenSpcs6unIAAAAAAID/U1ZbW1tb9CLWBzU1NWnevHnmz5+fysrKopfzmdPh7In1Om7GqD4NvBIAAAAAAFj31qYbfC7eWQMAAAAAALC+EmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAAClRorJk8eXK+/e1vp23btikrK8vNN99cZ/9RRx2VsrKyOp8DDjigzpi33norRx55ZCorK9OiRYsMGDAgCxYsqDNm2rRp2XvvvdO4ceO0a9cu559//iprueGGG7LjjjumcePG6dq1a26//fYGv14AAAAAAIAPKjTWLFy4MLvuumsuu+yyDx1zwAEHZNasWaXPH//4xzr7jzzyyDzzzDOZNGlSbrvttkyePDkDBw4s7a+pqUnv3r3Tvn37PP7447ngggsybNiwXHHFFaUxU6ZMyeGHH54BAwbkiSeeSN++fdO3b988/fTTDX/RAAAAAAAA71NWW1tbW/QikqSsrCw33XRT+vbtW9p21FFHZd68eavccbPS3//+93Tu3DmPPvpovvzlLydJ7rjjjhx00EF59dVX07Zt21x++eX5t3/7t8yePTvl5eVJkrPPPjs333xznnvuuSTJD3/4wyxcuDC33XZbae4999wzu+22W8aMGbNG66+pqUnz5s0zf/78VFZW1uMXWL91OHtivY6bMapPA68EAAAAAADWvbXpBp/5d9bcf//9adWqVXbYYYeceOKJefPNN0v7qqur06JFi1KoSZJevXplo402ysMPP1was88++5RCTZJUVVXl+eefz9tvv10a06tXrzrnraqqSnV19Yeua/HixampqanzAQAAAAAAWFuf6VhzwAEH5Jprrsk999yTX//613nggQdy4IEHZvny5UmS2bNnp1WrVnWOadSoUTbbbLPMnj27NKZ169Z1xqz8/nFjVu5fnZEjR6Z58+alT7t27T7ZxQIAAAAAABukRkUv4KMcdthhpT937do1u+yySzp16pT7778/+++/f4ErS4YMGZLTTjut9L2mpkawAQAAAAAA1tpn+s6aD9pmm22yxRZb5MUXX0yStGnTJnPnzq0zZtmyZXnrrbfSpk2b0pg5c+bUGbPy+8eNWbl/dSoqKlJZWVnnAwAAAAAAsLY+V7Hm1VdfzZtvvpmtttoqSdKjR4/Mmzcvjz/+eGnMvffemxUrVqR79+6lMZMnT87SpUtLYyZNmpQddtghLVu2LI2555576pxr0qRJ6dGjx7q+JAAAAAAAYANXaKxZsGBBpk6dmqlTpyZJpk+fnqlTp2bmzJlZsGBBzjjjjDz00EOZMWNG7rnnnnz3u9/Ntttum6qqqiTJTjvtlAMOOCDHHXdcHnnkkfz1r3/NSSedlMMOOyxt27ZNkhxxxBEpLy/PgAED8swzz+S6667L6NGj6zzC7JRTTskdd9yRCy+8MM8991yGDRuWxx57LCeddNKn/psAAAAAAAAblkJjzWOPPZbdd989u+++e5LktNNOy+67756hQ4dm4403zrRp0/Kd73wn22+/fQYMGJBu3brlL3/5SyoqKkpzjB8/PjvuuGP233//HHTQQdlrr71yxRVXlPY3b948d911V6ZPn55u3brl9NNPz9ChQzNw4MDSmK997WuZMGFCrrjiiuy6667505/+lJtvvjldunT59H4MAAAAAABgg1RWW1tbW/Qi1gc1NTVp3rx55s+f7/01q9Hh7In1Om7GqD4NvBIAAAAAAFj31qYbfK7eWQMAAAAAALC+EWsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAjYpeAKyNDmdPrPexM0b1acCVAAAAAABAw3BnDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKVGismTx5cr797W+nbdu2KSsry80331zat3Tp0px11lnp2rVrmjZtmrZt26Zfv3557bXX6szRoUOHlJWV1fmMGjWqzphp06Zl7733TuPGjdOuXbucf/75q6zlhhtuyI477pjGjRuna9euuf3229fJNQMAAAAAALxfobFm4cKF2XXXXXPZZZetsu/dd9/N3/72t/ziF7/I3/72t9x44415/vnn853vfGeVseedd15mzZpV+px88smlfTU1Nendu3fat2+fxx9/PBdccEGGDRuWK664ojRmypQpOfzwwzNgwIA88cQT6du3b/r27Zunn3563Vw4AAAAAADA/69RkSc/8MADc+CBB652X/PmzTNp0qQ62y699NJ89atfzcyZM/OlL32ptL1Zs2Zp06bNaucZP358lixZkquuuirl5eXZeeedM3Xq1Fx00UUZOHBgkmT06NE54IADcsYZZyRJRowYkUmTJuXSSy/NmDFjGuJSAQAAAAAAVutz9c6a+fPnp6ysLC1atKizfdSoUdl8882z++6754ILLsiyZctK+6qrq7PPPvukvLy8tK2qqirPP/983n777dKYXr161Zmzqqoq1dXVH7qWxYsXp6amps4HAAAAAABgbRV6Z83aWLRoUc4666wcfvjhqaysLG3/6U9/mj322CObbbZZpkyZkiFDhmTWrFm56KKLkiSzZ89Ox44d68zVunXr0r6WLVtm9uzZpW3vHzN79uwPXc/IkSMzfPjwhro8AAAAAABgA/W5iDVLly7ND37wg9TW1ubyyy+vs++0004r/XmXXXZJeXl5jj/++IwcOTIVFRXrbE1Dhgypc+6ampq0a9dunZ0PAAAAAABYP33mY83KUPPKK6/k3nvvrXNXzep07949y5Yty4wZM7LDDjukTZs2mTNnTp0xK7+vfM/Nh435sPfgJElFRcU6jUEAAAAAAMCG4TP9zpqVoeaFF17I3Xffnc033/xjj5k6dWo22mijtGrVKknSo0ePTJ48OUuXLi2NmTRpUnbYYYe0bNmyNOaee+6pM8+kSZPSo0ePBrwaAAAAAACAVRV6Z82CBQvy4osvlr5Pnz49U6dOzWabbZatttoq3/ve9/K3v/0tt912W5YvX156h8xmm22W8vLyVFdX5+GHH85+++2XZs2apbq6OoMHD86PfvSjUog54ogjMnz48AwYMCBnnXVWnn766YwePToXX3xx6bynnHJK9t1331x44YXp06dPrr322jz22GO54oorPt0fBAAAAAAA2OAUGmsee+yx7LfffqXvK98B079//wwbNiy33HJLkmS33Xarc9x9992Xnj17pqKiItdee22GDRuWxYsXp2PHjhk8eHCdd8k0b948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eXk23XRTsQYAAAAAAGANbVSfg95+++06nwULFuT555/PXnvtlT/+8Y8NvUYAAAAAAID1Vr1izepst912GTVq1Cp33QAAAAAAAPDhGizWJEmjRo3y2muvNeSUAAAAAAAA67V6vbPmlltuqfO9trY2s2bNyqWXXpqvf/3rDbIwAAAAAACADUG97qzp27dvnc8hhxySYcOGZZdddslVV121xvNMnjw53/72t9O2bduUlZXl5ptvrrO/trY2Q4cOzVZbbZUmTZqkV69eeeGFF+qMeeutt3LkkUemsrIyLVq0yIABA7JgwYI6Y6ZNm5a99947jRs3Trt27XL++eevspYbbrghO+64Yxo3bpyuXbvm9ttvX/MfBAAAAAAAoJ7qFWtWrFhR57N8+fLMnj07EyZMyFZbbbXG8yxcuDC77rprLrvsstXuP//88/Pb3/42Y8aMycMPP5ymTZumqqoqixYtKo058sgj88wzz2TSpEm57bbbMnny5AwcOLC0v6amJr1790779u3z+OOP54ILLsiwYcNyxRVXlMZMmTIlhx9+eAYMGJAnnniiFKGefvrpevw6AAAAAAAAa65ej0FrKAceeGAOPPDA1e6rra3NJZdcknPOOSff/e53kyTXXHNNWrdunZtvvjmHHXZY/v73v+eOO+7Io48+mi9/+ctJkv/4j//IQQcdlN/85jdp27Ztxo8fnyVLluSqq65KeXl5dt5550ydOjUXXXRRKeqMHj06BxxwQM4444wkyYgRIzJp0qRceumlGTNmzKfwSwAAAAAAABuqesWa0047bY3HXnTRRfU5RaZPn57Zs2enV69epW3NmzdP9+7dU11dncMOOyzV1dVp0aJFKdQkSa9evbLRRhvl4YcfzsEHH5zq6urss88+KS8vL42pqqrKr3/967z99ttp2bJlqqurV7mmqqqqVR7L9n6LFy/O4sWLS99ramrqdZ0AAAAAAMCGrV6x5oknnsgTTzyRpUuXZocddkiS/OMf/8jGG2+cPfbYozSurKys3gubPXt2kqR169Z1trdu3bq0b/bs2WnVqlWd/Y0aNcpmm21WZ0zHjh1XmWPlvpYtW2b27NkfeZ7VGTlyZIYPH16PKwMAAAAAAPh/6hVrvv3tb6dZs2a5+uqr07JlyyTJ22+/naOPPjp77713Tj/99AZd5GfRkCFD6tyNU1NTk3bt2hW4IgAAAAAA4PNoo/ocdOGFF2bkyJGlUJMkLVu2zC9/+ctceOGFDbKwNm3aJEnmzJlTZ/ucOXNK+9q0aZO5c+fW2b9s2bK89dZbdcasbo73n+PDxqzcvzoVFRWprKys8wEAAAAAAFhb9Yo1NTU1ef3111fZ/vrrr+edd975xItKko4dO6ZNmza555576pz34YcfTo8ePZIkPXr0yLx58/L444+Xxtx7771ZsWJFunfvXhozefLkLF26tDRm0qRJ2WGHHUqxqUePHnXOs3LMyvMAAAAAAACsK/WKNQcffHCOPvro3HjjjXn11Vfz6quv5n/+538yYMCAHHLIIWs8z4IFCzJ16tRMnTo1STJ9+vRMnTo1M2fOTFlZWU499dT88pe/zC233JKnnnoq/fr1S9u2bdO3b98kyU477ZQDDjggxx13XB555JH89a9/zUknnZTDDjssbdu2TZIcccQRKS8vz4ABA/LMM8/kuuuuy+jRo+s8wuyUU07JHXfckQsvvDDPPfdchg0blsceeywnnXRSfX4eAAAAAACANVavd9aMGTMmP/vZz3LEEUeU7lhp1KhRBgwYkAsuuGCN53nsscey3377lb6vDCj9+/fPuHHjcuaZZ2bhwoUZOHBg5s2bl7322it33HFHGjduXDpm/PjxOemkk7L//vtno402yqGHHprf/va3pf3NmzfPXXfdlUGDBqVbt27ZYostMnTo0AwcOLA05mtf+1omTJiQc845Jz//+c+z3Xbb5eabb06XLl3q8/PAeqXD2RPrfeyMUX3W2VwAAAAAAOuLesWaTTfdNL/73e9ywQUX5KWXXkqSdOrUKU2bNl2reXr27Jna2toP3V9WVpbzzjsv55133oeO2WyzzTJhwoSPPM8uu+ySv/zlLx855vvf/36+//3vf/SCAQAAAAAAGli9HoO20qxZszJr1qxst912adq06UeGFwAAAAAAAFZVr1jz5ptvZv/998/222+fgw46KLNmzUqSDBgwIKeffnqDLhAAAAAAAGB9Vq9YM3jw4GyyySaZOXNmNt1009L2H/7wh7njjjsabHEAAAAAAADru3q9s+auu+7KnXfema233rrO9u222y6vvPJKgywMAAAAAABgQ1CvO2sWLlxY546ald56661UVFR84kUBAAAAAABsKOoVa/bee+9cc801pe9lZWVZsWJFzj///Oy3334NtjgAAAAAAID1Xb0eg3b++edn//33z2OPPZYlS5bkzDPPzDPPPJO33norf/3rXxt6jQAAAAAAAOutet1Z06VLl/zjH//IXnvtle9+97tZuHBhDjnkkDzxxBPp1KlTQ68RAAAAAABgvbXWd9YsXbo0BxxwQMaMGZN/+7d/WxdrAgAAAAAA2GCs9Z01m2yySaZNm7Yu1gIAAAAAALDBqddj0H70ox/lyiuvbOi1AAAAAAAAbHDW+jFoSbJs2bJcddVVufvuu9OtW7c0bdq0zv6LLrqoQRYHAAAAAACwvlurWPPyyy+nQ4cOefrpp7PHHnskSf7xj3/UGVNWVtZwqwMAAAAAAFjPrVWs2W677TJr1qzcd999SZIf/vCH+e1vf5vWrVuvk8UBAAAAAACs79bqnTW1tbV1vv/v//5vFi5c2KALAgAAAAAA2JCsVaz5oA/GGwAAAAAAANbOWsWasrKyVd5J4x01AAAAAAAA9bdW76ypra3NUUcdlYqKiiTJokWLcsIJJ6Rp06Z1xt14440Nt0IAAAAAAID12FrFmv79+9f5/qMf/ahBFwMAAAAAALChWatYM3bs2HW1DgAAAAAAgA3SWr2zBgAAAAAAgIYl1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAK1KjoBQCsrQ5nT6z3sTNG9WnAlQAAAAAAfHLurAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBPvOxpkOHDikrK1vlM2jQoCRJz549V9l3wgkn1Jlj5syZ6dOnTzbddNO0atUqZ5xxRpYtW1ZnzP3335899tgjFRUV2XbbbTNu3LhP6xIBAAAAAIANWKOiF/BxHn300Sxfvrz0/emnn843v/nNfP/73y9tO+6443LeeeeVvm+66aalPy9fvjx9+vRJmzZtMmXKlMyaNSv9+vXLJptskl/96ldJkunTp6dPnz454YQTMn78+Nxzzz059thjs9VWW6WqqupTuEoAAAAAAGBD9ZmPNVtuuWWd76NGjUqnTp2y7777lrZtuummadOmzWqPv+uuu/Lss8/m7rvvTuvWrbPbbrtlxIgROeusszJs2LCUl5dnzJgx6dixYy688MIkyU477ZQHH3wwF198sVgDAAAAAACsU5/5x6C935IlS/KHP/whxxxzTMrKykrbx48fny222CJdunTJkCFD8u6775b2VVdXp2vXrmndunVpW1VVVWpqavLMM8+UxvTq1avOuaqqqlJdXb2OrwgAAAAAANjQfebvrHm/m2++OfPmzctRRx1V2nbEEUekffv2adu2baZNm5azzjorzz//fG688cYkyezZs+uEmiSl77Nnz/7IMTU1NXnvvffSpEmTVdayePHiLF68uPS9pqamQa4RAAAAAADYsHyuYs2VV16ZAw88MG3bti1tGzhwYOnPXbt2zVZbbZX9998/L730Ujp16rTO1jJy5MgMHz58nc0PAAAAAABsGD43j0F75ZVXcvfdd+fYY4/9yHHdu3dPkrz44otJkjZt2mTOnDl1xqz8vvI9Nx82prKycrV31STJkCFDMn/+/NLnn//859pfFAAAAAAAsMH73MSasWPHplWrVunTp89Hjps6dWqSZKuttkqS9OjRI0899VTmzp1bGjNp0qRUVlamc+fOpTH33HNPnXkmTZqUHj16fOh5KioqUllZWecDAAAAAACwtj4XsWbFihUZO3Zs+vfvn0aN/t+T21566aWMGDEijz/+eGbMmJFbbrkl/fr1yz777JNddtklSdK7d+907tw5P/7xj/Pkk0/mzjvvzDnnnJNBgwaloqIiSXLCCSfk5Zdfzplnnpnnnnsuv/vd73L99ddn8ODBhVwvAAAAAACw4fhcxJq77747M2fOzDHHHFNne3l5ee6+++707t07O+64Y04//fQceuihufXWW0tjNt5449x2223ZeOON06NHj/zoRz9Kv379ct5555XGdOzYMRMnTsykSZOy66675sILL8zvf//7VFVVfWrXCAAAAAAAbJgaffyQ4vXu3Tu1tbWrbG/Xrl0eeOCBjz2+ffv2uf322z9yTM+ePfPEE0/Ue40AAAAAAAD18bm4swYAAAAAAGB9JdYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKFCjohcAUKQOZ0+s97EzRvVpwJUAAAAAABsqd9YAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAjYpeAMD6osPZE+t13IxRfRp4JQAAAADA54k7awAAAAAAAAok1gAAAAAAABRIrAEAAAAAACiQWAMAAAAAAFAgsQYAAAAAAKBAYg0AAAAAAECBxBoAAAAAAIACiTUAAAAAAAAFEmsAAAAAAAAKJNYAAAAAAAAUSKwBAAAAAAAokFgDAAAAAABQILEGAAAAAACgQGINAAAAAABAgcQaAAAAAACAAok1AAAAAAAABRJrAAAAAAAACiTWAAAAAAAAFEisAQAAAAAAKJBYAwAAAAAAUCCxBgAAAAAAoEBiDQAAAAAAQIHEGgAAAAAAgAKJNQAAAAAAAAUSawAAAAAAAAok1gAAAAAAABToMx1rhg0blrKysjqfHXfcsbR/0aJFGTRoUDbffPN84QtfyKGHHpo5c+bUmWPmzJnp06dPNt1007Rq1SpnnHFGli1bVmfM/fffnz322CMVFRXZdtttM27cuE/j8gAAAAAAAD7bsSZJdt5558yaNav0efDBB0v7Bg8enFtvvTU33HBDHnjggbz22ms55JBDSvuXL1+ePn36ZMmSJZkyZUquvvrqjBs3LkOHDi2NmT59evr06ZP99tsvU6dOzamnnppjjz02d95556d6nQAAAAAAwIapUdEL+DiNGjVKmzZtVtk+f/78XHnllZkwYUK+8Y1vJEnGjh2bnXbaKQ899FD23HPP3HXXXXn22Wdz9913p3Xr1tltt90yYsSInHXWWRk2bFjKy8szZsyYdOzYMRdeeGGSZKeddsqDDz6Yiy++OFVVVZ/qtQIAAAAAABuez/ydNS+88ELatm2bbbbZJkceeWRmzpyZJHn88cezdOnS9OrVqzR2xx13zJe+9KVUV1cnSaqrq9O1a9e0bt26NKaqqio1NTV55plnSmPeP8fKMSvn+DCLFy9OTU1NnQ8AAAAAAMDa+kzHmu7du2fcuHG54447cvnll2f69OnZe++9884772T27NkpLy9PixYt6hzTunXrzJ49O0kye/bsOqFm5f6V+z5qTE1NTd57770PXdvIkSPTvHnz0qddu3af9HIBAAAAAIAN0Gf6MWgHHnhg6c+77LJLunfvnvbt2+f6669PkyZNClxZMmTIkJx22mml7zU1NYINAAAAAACw1j7Td9Z8UIsWLbL99tvnxRdfTJs2bbJkyZLMmzevzpg5c+aU3nHTpk2bzJkzZ5X9K/d91JjKysqPDEIVFRWprKys8wEAAAAAAFhbn6tYs2DBgrz00kvZaqut0q1bt2yyySa55557Svuff/75zJw5Mz169EiS9OjRI0899VTmzp1bGjNp0qRUVlamc+fOpTHvn2PlmJVzAAAAAAAArEuf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/fzhj3nY5wwMM2jv13XNdTFnuec+h7N+7rMQERERERERERGRGbFYQ0REREREREREREREZEYs1hAREREREREREREREZkRizVERERERERERERERERmxGINERERERERERERERGRGbFYQ0REREREREREREREZEYs1hAREREREREREREREZkRizVERERERERERERERERmxGINERERERERERERERGRGbFYQ0REREREREREREREZEYs1hAREREREREREREREZkRizVERERERERERERERERmxGINERERERERERERERGRGbFYQ0REREREREREREREZEYs1hAREREREREREREREZmRpbkTICIiIioJqg5fX+hx48PfMmImRERERERERPRfwztriIiIiIiIiIiIiIiIzIjFGiIiIiIiIiIiIiIiIjNisYaIiIiIiIiIiIiIiMiMWKwhIiIiIiIiIiIiIiIyIxZriIiIiIiIiIiIiIiIzIjFGiIiIiIiIiIiIiIiIjNisYaIiIiIiIiIiIiIiMiMWKwhIiIiIiIiIiIiIiIyI0tzJ0BERET0oqk6fH2hx40Pf8uImRARERERERHR84B31hAREREREREREREREZkRizVERERERERERERERERmxMegEREREZVQfJwaERERERER0X8DizVERERE/wEs/BARERERERGVXHwMGhERERERERERERERkRmxWENERERERERERERERGRGLNYQERERERERERERERGZEd9ZQ0REREQGKez7b/juGyIiIiIiIqK8sVhDRERERGZR2KIPkLvwY8xYRERERERERKbGYg0RERER0f9h0YeIiIiIiIjMge+sISIiIiIiIiIiIiIiMiPeWUNEREREVAx4lw4REREREREpxWINEREREVEJxnf7EBERERERvfhYrCEiIiIiIoMZq/DDAhIRERERERGLNURERERE9IJgAYmIiIiIiJ5XLNYQEREREREVk5LwGLvifBweC2RERERERMbBYg0RERERERG9MFj4ISIiIqLnEYs1RERERERERHkw1t1MRERERET6sFhDREREREREVIz46DkiIiIi0ofFGiIiIiIiIiIqNBaQiIiIiIqOxZocZs6ciUmTJuH69euoX78+pk+fjiZNmpg7LSIiIiIiIiJSiIUfIiIiet6wWJPFsmXLMGTIEMyePRtNmzbFTz/9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8+a673/88YfUrFlTUazevXsr+ihx7NgxqVKliqjVaqlevbocPnxYypcvLw4ODqLRaMTCwkJWr16tN463t7fMnj1b9/2ff/4Ra2trycjIUJRHVtu3b9d9tm3bJnZ2drJo0aJs3bdv3643zquvvip//vmn7nvOZSoyMlJeeeUVvXE8PDzk5MmT+faPi4uTypUr642T6cmTJzJ8+HDx9fUVPz8/3fyNiIiQChUqSKVKlSQ8PFxxvPwcOXJE8TKbdbkJCQkp8m8/fPhQevToITY2NmJlZSXh4eGi1WoNirFmzZp8P19++aXY2dkpPt5Qq9Vy48YN3XdHR8dsy8L169cNWr8fP34sUVFRMmrUKGnRooXY2NiIWq2WWrVqKY6hUqmy5VTYbV7Tpk2lf//+ec5frVYr/fv3V7ScZw7/1ltviUqlkgYNGki3bt3kvffek3r16olKpZKgoCCD8yvI06dP5ciRI4qGLerx62effSZ16tSR69ev5+p37do1qVu3rgwaNEh58gUwZN2bP39+np+ffvpJevbsKdbW1tm2Y/lZvny52Nraytq1a7N1T05OlubNm4uPj49cvXrV4GlRqVS5lusaNWoUaX+Y071796Rz586K87lx44Y8efJEunfvLmXLlpVt27YpXofLlSsn/fv3l/379+c7TFJSkvzyyy9Su3ZtmTp1ar7D/fjjj+Ls7CyNGzeWcePGyaZNm+TYsWNy9uxZ2bdvn8ybN0969+4tZcqUkcDAwAKPh0+fPi1VqlTRHWu89tpr2f5fSqdv48aNYm1tLc7OzmJra6s7LwoICJDWrVuLhYWFREVF6Y0jIlKzZk25c+eOiDw7p65ataqULl1aGjduLM7OzlKuXLk8zwULktfylNnd399fYmNj9cZITk6WiIgIee2110SlUomPj4+Eh4fLtWvXFOfRvHnzbOcDkZGRumPwu3fvSoMGDWTgwIGK48XHx4u/v7+4urrK//73Pxk7dmy2jxKZ292c5/kqlUoaN25s0Dn/+PHjxdHRUbp27Spubm4SHh4uLi4u8s0338iECRPE1dVVRo8erShWYmKi7m8nJyddm0udOnUkISFBUYxM9erVk3/++UdERObOnSt2dnYycOBAmTVrlgwaNEgcHBxk3rx5euNUq1ZNxo0bJ3fv3pXevXtLjRo15OzZswblkilznSvMcmQqJ0+elO++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nJyMuLg42NnZwcfHp1DL0bRp07J9FxFcu3YNkZGRaNmyJRYvXqw41qNHj/DOO+/A1dUVdevWzTXP83tpnqkcPXoUU6ZMwaJFi6DVahW9+DmrAQMGYOHChahcuTJeeeUVAMC+ffuQkJCA4ODgbNNb0PKVnJyMwYMHY+HChbrtgaWlJXr16oUpU6agVKlSOHLkCACgQYMG+caJjIzEO++8A1tbW4OmI1PW9eXp06eYP38+PDw88py26dOnF+o3imLu3Ll45513dC+hNid/f39Fw+X3cuVMOV9qbWyJiYn47bffMH/+fKSlpeHUqVNwcHAolt8qSEpKCpYtW4aIiAjs378fGRkZmDx5Mvr06WPQC2ON5fbt2+jSpQtiYmLg4OCABQsWoHPnzrr+r7/+Ol555RV8++23Js1LrVbjxo0bcHV1BQA4Ojri2LFjupe/Kn1haEhIiKLf++233wzOMWdOSn322WfYsmULDh48mGsb9fjxYzRq1AgBAQGYOnVqgXFu3LiBl19+GRYWFggLC9O93PzUqVOYOXMmMjIycOjQIcUvhrewsMD169fznedKFec8L4rbt2+jbNmyefbbsWMHWrZsqSjO999/j++++w5ubm6YMGECgoKCCp2TWq3GG2+8oTtGWbduHVq3bq075klNTcWmTZsKXM6trKxQoUIFdOrUCa1atULLli2L9HJtY/7/li1bhilTpuDgwYO6abCwsICvry+GDBmCd999V9FvWVtb49KlS6hQoUKe/a9evQpPT0+kpqYqimdMRT1+7dOnD86fP49//vkH1tbW2fqlpqYiMDAQXl5eiIiI0JtLx44d0aBBA4wbNy7P/kePHkXDhg2h1WoVTl3+Bg0ahFOnTmHTpk0FDtelS5ds3zds2ID69eujYsWK2bqvWrWqyDmR8TVp0gQDBgxAz549c/ULCwvDokWL8ODBA7374vr16+O7775Du3btAAAnTpxAjRo1dC+Sj46ORq9evXDhwgW9OanVatSpUweWlpY4e/Ys5s+fj65du+r679y5E++//z4uX75syKQWydWrVzF//nzMnz8f586dQ7NmzdC3b1+8++67Bp3DJicno2/fvli1ahUyMjLg5+eH33//Xbcf/vvvv3H//n288847xTUpei1duhSDBg3CrVu3cPz4cdSqVUvxuKNGjcKcOXMQFBSEqKgovPfee1i8eDFGjBgBlUqFb7/9Fm+//baitggbGxs0aNAAzZs3x5w5c7B//37Url0bjo6OOHr0KCpWrIgDBw7g1Vdf1Rvr6tWraN68OTw8PNCoUSPMmjULvr6+qFmzJk6fPo29e/di9erVePPNNxVPa1Gp1Wpcv3493/MiEcGWLVvQpk0bk+VkTMba9+V3/rh06VL069cP/v7+2LBhg95tVNeuXbF582ZMnDgRAwYM0HXfvXu37rho/vz58PPzM2QyyYRYrCGzSUtLw7lz55CcnIxatWqZpZGpIHfv3oWTkxNUKlWhxn/06BHOnz8PAHjppZdgb29vzPQMUlDjo74Gx5LKWA2qxS0lJSXbcmBokcaYcjZQqdVquLq6onXr1hgxYoRBDavz5s3Dxx9/DFtbW7i4uGRbT1QqlaKTE2MSERw+fBjbt2/H9u3bERMTgwcPHqBevXpo2bIlpkyZYlA8Yy9fycnJunni5eVl8u3d87K+vEj0nZQURmpqKlatWoWIiAjExMSgffv2CAkJQbt27aBWq432O4V1+vRpzJs3D5GRkUhKSkKbNm3w559/miWX+/fvw8HBARYWFtm63717Fw4ODrlOpIqbMRqxjS1no2POnDLpa3S8ceMGGjRoAGtra4SFhaFatWoAni0PM2bMwNOnT3H48GFFRZZLly7hk08+webNm5F5iqJSqRAYGIiZM2caVGjRN8+VTt+LTq1Ww87ODgEBAbnWl6yUzCdjFEZSUlIQHR2N7du3Y9u2bThy5AiqVauGli1b6oo3mQU4c0lPT8ft27cBAGXLls11wYo+OQuJOSkt3hanwh6/Xr58GY0aNYKNjQ0+/fRT1KhRAyKCuLg4/Pzzz0hNTUVsbCwqV66sN1Z0dDRSUlJ0DeJ55RgbG6uoMJn1opWs7t+/j0OHDuHMmTPYuXMnfH19C4xTUou3pMzEiRMRHR2NDRs25Nk/NDQUs2fP1lsAnD17NipXroy33norz/4jR47EzZs38euvv+rN6euvv872/ZVXXkFgYKDu+xdffIHLly9jyZIlemMZwxtvvIEtW7agbNmyCA4ORp8+fXQXTxTWkydP8PTp0xLX3pPp8uXLOHjwIAICAgw6V9dqtQgPD8eePXvQrFkzDB8+HMuWLcOwYcPw6NEjdOjQATNmzFAU8/bt29izZw92796NyZMnQ6VSoXHjxti/fz8WLVqEjh07GnTsmpSUhPDwcKxbtw4XLlyAVqtFhQoV0Lx5cwwePBiNGjVSHMsYPD09ERsbW6SLL0oyJfu+AwcOwMPDo8A4BZ0/HjlyBJ06dUJiYqLe44PmzZtj/vz58PHxydXv8ePHGD58OGbNmoW0tDTDJpRMhsUaIiIymJubGwYOHIjhw4eXiEZiJycnJCcno379+roGnRYtWpSIOzWIjCE0NBRLly5F5cqV0adPH/To0SPfq+rNLSMjA+vWrUNERITZijUlTUls4DNmThcvXsQnn3yCf/75J1uRpU2bNvj555/h5eVlUG737t3DuXPnICLw8fGBk5OTQeMDJXOel0S9e/dWdGGSuebTw4cPERMTg23btmH79u04evQofHx8cOLECbPkYww5C4k5maN4a0wXL15EaGgo/v7771zbgxkzZsDb29vkOeV30YpGo0H16tXxySefGHzXHdGLqGPHjujbty/at29fYAGfio+TkxN27tyJuLg4BAcHw83NDTdu3ECTJk2wY8cOc6dH+TDGvm/Hjh1o3ry57i69nO7cuYP169cjODi4wDharVZvG83OnTvx2muv6c2JzIPFGiIiMpizszMOHDiAl156ydypAADWr1+PFi1aQKPRmDsVomKhVqvh4eGBhg0bFtiw+l+/S4DM6+7duzh37hwAwNvbG87OzmbOiJ53Wq0WBw4cwLZt27Bt2zbExMTgyZMnz20hA/jvFBLv3buHs2fPAuD2gIhIKScnJxw9ehQeHh66x6DZ29tjx44deO+998ydHunBfR8ZA4s1RERksMGDB8PV1RUjR440dypE/wkl/ep3IiJj0Gq1iI2N1T0GbdeuXUhJSUHFihXh7++v+1SpUsXcqRIRERldYmIiKlasqHuf0caNGxU9OpKIXhws1hARkcEGDhyIhQsXon79+qhXr16u57UreZEiERERUVYajQYpKSlwc3PTFWZatWpVYu7kJSIiIiIqTizWEBGRwQp6YT1fUk9ERESFMWfOHPj7+6NatWrmToWIiIiIyORYrCEiIiIiIiIiIiIiIjIjtbkTICIiIiIiIiIiIiIi+i9jsYaIiIiIiIiIiIiIiMiMWKwhIiIiIiIiIiIiIiIyIxZriIiIiIjoP0GlUmHNmjXmToOIiIiIiCgXFmuIiIiIiOiFcP36dQwYMABeXl6wsbFB5cqV0aFDB0RFRZk7Nb169+6NTp06mTsNIiIiIiIyE0tzJ0BERERERFRU8fHxaN68OcqUKYNJkyahbt26SE9Px+bNm/Hpp5/i1KlTxfK7aWlpsLa2LpbYhVHS8iEiIiIiImV4Zw0RERERET33QkNDoVKpsH//fnTt2hXVqlVD7dq1MWTIEOzdu1c33O3bt9G5c2fY29vDx8cHf/75p65fRkYG+vbtC09PT9jZ2aF69eqYOnVqtt/JvAPm22+/hbu7O6pXrw4AiIyMRKNGjeDo6Ag3Nze8//77uHnzZrZx//33X7Rv3x4ajQaOjo5o0aIFzp8/j7Fjx2LBggVYu3YtVCoVVCoVtm/fDgBITEzEu+++izJlysDZ2RlBQUGIj4/Xm8/PP/8MHx8f2Nraonz58nj77beNObuJiIiIiMjIeGcNERERERE91+7evYtNmzbh22+/RalSpXL1L1OmjO7vr7/+Gt9//z0mTZqE6dOno0ePHrh06RKcnZ2h1WpRqVIlLF++HC4uLti9ezf69++PChUq4N1339XFiIqKgkajwT///KPrlp6ejvHjx6N69eq4efMmhgwZgt69e2PDhg0AgCtXruC1115Dq1atsHXrVmg0GuzatQtPnz7F0KFDERcXhwcPHuC3334DADg7OyM9PR2BgYHw8/NDdHQ0LC0t8c0336Bdu3Y4duyY7g6anPnExsZi4MCBiIyMRLNmzXD37l1ER0cbfb4TEREREZHxqEREzJ0EERERERFRYe3fvx9NmzbFqlWr0Llz53yHU6lU+N///ofx48cDAFJSUuDg4ICNGzeiXbt2eY4TFhaG69evY8WKFQCe3cmyadMmJCQkFPi4sdjYWDRu3BgPHz6Eg4MDRo4ciaVLl+L06dOwsrLKNXzv3r2RlJSENWvW6Lr9/vvv+OabbxAXFweVSgXg2WPOypQpgzVr1qBt27Z55rNq1SqEhITg8uXLcHR0LHjmERERERFRicDHoBERERER0XPNkOvP6tWrp/u7VKlS0Gg02R5XNnPmTPj6+sLV1RUODg745ZdfkJCQkC1G3bp1cxVqDh48iA4dOsDDwwOOjo5o2bIlAOjGPXLkCFq0aJFnoSY/R48exblz5+Do6AgHBwc4ODjA2dkZT548wfnz5/PNp02bNqhSpQq8vLzQs2dPLFq0CI8ePVL8u0REREREZHos1hARERER0XPNx8cHKpUKp06d0jtszmKJSqWCVqsFACxduhRDhw5F37598ffff+PIkSMICQlBWlpatnFyPmotJSUFgYGB0Gg0WLRoEQ4cOIDVq1cDgG5cOzs7g6crOTkZvr6+OHLkSLbPmTNn8P777+ebj6OjIw4dOoQlS5agQoUKGD16NOrXr4+kpCSDcyAiIiIiItNgsYaIiIiIiJ5rzs7OCAwMxMyZM5GSkpKrv9Iixa5du9CsWTOEhoaiYcOG8Pb2znYHS35OnTqFO3fuIDw8HC1atECNGjWy3a0DPLujJzo6Gunp6XnGsLa2RkZGRrZuL7/8Ms6ePYty5crB29s726d06dIF5mRpaYmAgAB8//33OHbsGOLj47F161a900JERERERObBYg0RERERET33Zs6ciYyMDDRp0gQrV67E2bNnERcXh2nTpsHPz09RDB8fH8TGxmLz5s04c+YMRo0ahQMHDugdz8PDA9bW1pg+fTouXLiAP//8U/denExhYWF48OABunXrhtjYWJw9exaRkZE4ffo0AKBq1ao4duwYTp8+jdu3byM9PR09evRA2bJlERQUhOjoaFy8eBHbt2/HwIEDcfny5Xzz+euvvzBt2jQcOXIEly5dwsKFC6HValG9enVF84GIiIiIiEyPxRoiIiIiInrueXl54dChQ/D398fnn3+OOnXqoE2bNoiKisKsWbMUxfjoo4/QpUsXvPfee2jatCnu3LmD0NBQveO5urpi/vz5WL58OWrVqoXw8HD88MMP2YZxcXHB1q1bkZycjJYtW8LX1xdz587VPZbtww8/RPXq1dGoUSO4urpi165dsLe3x86dO+Hh4YEuXbqgZs2a6Nu3L548eQKNRpNvPmXKlMGqVavQunVr1KxZE7Nnz8aSJUtQu3ZtRfOBiIiIiIhMTyWGvI2TiIiIiIiIiIiIiIiIjIp31hAREREREREREREREZkRizVERERERERERERERERmxGINERERERERERERERGRGbFYQ0REREREREREREREZEYs1hAREREREREREREREZkRizVERERERERERERERERmxGINERERERERERERERGRGbFYQ0REREREREREREREZEYs1hAREREREREREREREZkRizVERERERERERERERERmxGINERERERERERERERGRGbFYQ0REREREREREREREZEb/D6WRN9Fg90q3AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from collections import Counter\n", "\n", "# Flatten the list of all characters in image_texts\n", "all_chars = [char for text in image_texts for char in text]\n", "\n", "# Calculate the frequency of each character\n", "char_counter = Counter(all_chars)\n", "\n", "# Sort characters by frequency\n", "sorted_chars = sorted(char_counter.items(), key=lambda pair: pair[1], reverse=True)\n", "\n", "# Plotting\n", "plt.figure(figsize=(20, 10))\n", "plt.bar([pair[0] for pair in sorted_chars], [pair[1] for pair in sorted_chars])\n", "plt.xlabel('Characters')\n", "plt.ylabel('Frequency')\n", "plt.title('Character Frequency Distribution')\n", "plt.xticks(rotation=90)\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Most common characters:\n", "[('e', 19616), ('t', 14237), ('a', 12299), ('o', 11704), ('i', 11218), ('n', 11037), ('s', 9880), ('r', 9870), ('h', 8403), ('l', 6383)]\n", "\n", "Least common characters:\n", "[('#', 36), ('6', 28), ('?', 28), ('7', 24), ('!', 21), ('/', 9), ('Q', 6), ('Z', 5), ('X', 4), ('*', 3)]\n" ] }, { "data": { "text/plain": [ "\"Output\\nMost common characters:\\n[('e', 19615), ('t', 14237), ('a', 12299), ('o', 11703), ('i', 11218), ('n', 11037), ('s', 9880), ('r', 9870), ('h', 8403), ('l', 6381)]\\n\\nLeast common characters:\\n[('#', 36), ('6', 28), ('?', 28), ('7', 24), ('!', 21), ('/', 9), ('Q', 6), ('Z', 5), ('X', 4), ('*', 3)]\\n\"" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Displaying the most and least common characters\n", "print(\"Most common characters:\")\n", "print(sorted_chars[:10]) # Top 10\n", "\n", "print(\"\\nLeast common characters:\")\n", "print(sorted_chars[-10:]) # Bottom 10\n", "\n", "'''Output\n", "Most common characters:\n", "[('e', 19615), ('t', 14237), ('a', 12299), ('o', 11703), ('i', 11218), ('n', 11037), ('s', 9880), ('r', 9870), ('h', 8403), ('l', 6381)]\n", "\n", "Least common characters:\n", "[('#', 36), ('6', 28), ('?', 28), ('7', 24), ('!', 21), ('/', 9), ('Q', 6), ('Z', 5), ('X', 4), ('*', 3)]\n", "'''" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 1 corrupt images during re-check.\n" ] } ], "source": [ "# Re-checking for any corrupt images after the initial cleanup\n", "recheck_corrupt_images = []\n", "\n", "for path in image_paths:\n", " try:\n", " img = cv2.imread(path)\n", " if img is None:\n", " raise ValueError(\"Image not readable\")\n", " except Exception as e:\n", " recheck_corrupt_images.append(path)\n", "\n", "print(f\"Found {len(recheck_corrupt_images)} corrupt images during re-check.\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Observations:\n", "\n", "Word Lengths Statistics:\n", "count 38304.000000\n", "mean 4.302371\n", "std 2.679291\n", "min 1.000000\n", "25% 2.000000\n", "50% 4.000000\n", "75% 6.000000\n", "max 19.000000\n", "dtype: float64\n", "\n", "Most common characters:\n", "[('e', 19615), ('t', 14237), ('a', 12299), ('o', 11703), ('i', 11218), ('n', 11037), ('s', 9880), ('r', 9870), ('h', 8403), ('l', 6381)]\n", "\n", "Least common characters:\n", "[('#', 36), ('6', 28), ('?', 28), ('7', 24), ('!', 21), ('/', 9), ('Q', 6), ('Z', 5), ('X', 4), ('*', 3)]\n", "\n", "1. Character Distribution: The most frequent characters are common English letters ('e', 't', 'a'), which is expected given the nature of English text. The least common characters include special symbols and less common letters ('Q', 'Z', 'X'), which might not be surprising but warrants attention when designing your model to ensure it can recognize these infrequent characters adequately.\n", "2. Word Lengths: The average word length in your dataset is around 4 characters, with a standard deviation of approximately 2.68. This variability indicates that your model will need to handle a wide range of input lengths. The maximum word length is 19, which is crucial for defining the dimensions of your model's input layer or for padding sequences.\n", "3. Class Imbalance: There's a significant imbalance between the most and least common characters. This imbalance can lead to a model that performs well on frequent characters but struggles with rare characters or symbols.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Approach to Address Class Imbalance\n", "One effective strategy is to use a weighted loss function during training, where less frequent classes (characters) are given higher weights, encouraging the model to pay more attention to these classes. This section will outline how to calculate class weights and apply them in a training loop, assuming a hypothetical neural network model setup for context." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0: 103.26065162907268, 1: 4.93957559045678, 2: 60.235380116959064, 3: 8.571042230081131, 4: 30.978195488721806, 5: 33.88240131578947, 6: 722.8245614035088, 7: 1.43607528755664, 8: 3.8448114968271745, 9: 1.0425354251012147, 10: 240.94152046783626, 11: 11.473405736563631, 12: 15.489097744360903, 13: 34.4202172096909, 14: 37.38747731397459, 15: 58.607396870554766, 16: 38.043397968605724, 17: 77.44548872180451, 18: 90.3530701754386, 19: 60.235380116959064, 20: 44.254564983888294, 21: 28.91298245614035, 22: 42.51909184726522, 23: 77.44548872180451, 24: 4.683528475616687, 25: 6.213391645302368, 26: 7.451799602098029, 27: 13.46878064727035, 28: 8.997816117056125, 29: 10.180627625401533, 30: 7.228245614035088, 31: 6.950236167341431, 32: 5.5037403152551425, 33: 29.303698435277383, 34: 24.92498487598306, 35: 8.121624285432683, 36: 3.700467037901922, 37: 8.960635058721182, 38: 15.379245987308698, 39: 6.905967147167281, 40: 361.4122807017544, 41: 7.972329721362229, 42: 4.93957559045678, 43: 3.3056001283697047, 44: 23.31692133559706, 45: 43.369473684210526, 46: 9.073111649416427, 47: 542.1184210526316, 48: 52.889602053915276, 49: 433.69473684210527, 50: 0.17631300790393742, 51: 0.9149677992449479, 52: 0.4972423031897561, 53: 0.372461986295178, 54: 0.11054617068773075, 55: 0.6296381196894676, 56: 0.7722484630379367, 57: 0.25805946497804666, 58: 0.1933030561785101, 59: 14.456491228070176, 60: 2.3596013973999197, 61: 0.33972641143827764, 62: 0.5829230333899265, 63: 0.19647310720399805, 64: 0.18527628880814476, 65: 0.7657039845376152, 66: 14.751521661296097, 67: 0.21970351410440997, 68: 0.2194811421265715, 69: 0.15231254366864694, 70: 0.5459400010600519, 71: 1.383837705303463, 72: 0.7624731660374565, 73: 8.605054302422724, 74: 0.7879628212974297, 75: 29.70511896178803}\n" ] } ], "source": [ "from sklearn.utils.class_weight import compute_class_weight\n", "import numpy as np\n", "\n", "# Assuming 'char_list' is a list of all characters, and 'image_texts' contains all the words in the dataset\n", "all_chars = ''.join(image_texts)\n", "char_freq = {char: all_chars.count(char) for char in char_list}\n", "\n", "# Create a list of all characters in the dataset in the same order as 'char_list'\n", "y = np.array([char for word in image_texts for char in word])\n", "\n", "# Calculate class weights\n", "class_weights = compute_class_weight('balanced', classes=np.unique(y), y=y)\n", "class_weight_dict = {i: weight for i, weight in enumerate(class_weights)}\n", "\n", "print(class_weight_dict)\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"\\n# Load class weights from JSON file\\nwith open('class_weights.json', 'r') as infile:\\n class_weight_dict_loaded = json.load(infile)\\n\\n# Convert keys back to integers if necessary\\nclass_weight_dict_loaded = {int(k): v for k, v in class_weight_dict_loaded.items()}\\n\"" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import json\n", "\n", "# Assuming 'class_weight_dict' is your dictionary of class weights\n", "class_weight_dict_str = {str(k): v for k, v in class_weight_dict.items()}\n", "\n", "# Save to JSON file\n", "with open('class_weights.json', 'w') as outfile:\n", " json.dump(class_weight_dict_str, outfile)\n", "\n", "'''\n", "# Load class weights from JSON file\n", "with open('class_weights.json', 'r') as infile:\n", " class_weight_dict_loaded = json.load(infile)\n", "\n", "# Convert keys back to integers if necessary\n", "class_weight_dict_loaded = {int(k): v for k, v in class_weight_dict_loaded.items()}\n", "'''" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Defining the Model Architecture\n", "\n", "Let's define a function to create a VGG-like model. We will simplify the architecture to fit the context of character recognition from handwriting. This involves using Convolutional layers followed by MaxPooling layers, and finally, a Flatten layer to connect to the dense layers leading up to the LSTM layers for sequence prediction." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def build_vgg_model(input_shape=(224, 224, 3), num_classes=76):\n", " model = Sequential([\n", " # First Conv Block\n", " Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=input_shape),\n", " Conv2D(64, (3, 3), activation='relu', padding='same'),\n", " MaxPooling2D((2, 2), strides=(2, 2)),\n", " \n", " # Second Conv Block\n", " Conv2D(128, (3, 3), activation='relu', padding='same'),\n", " Conv2D(128, (3, 3), activation='relu', padding='same'),\n", " MaxPooling2D((2, 2), strides=(2, 2)),\n", " \n", " # Third Conv Block\n", " Conv2D(256, (3, 3), activation='relu', padding='same'),\n", " Conv2D(256, (3, 3), activation='relu', padding='same'),\n", " Conv2D(256, (3, 3), activation='relu', padding='same'),\n", " MaxPooling2D((2, 2), strides=(2, 2)),\n", " \n", " # Fourth Conv Block\n", " Conv2D(512, (3, 3), activation='relu', padding='same'),\n", " Conv2D(512, (3, 3), activation='relu', padding='same'),\n", " Conv2D(512, (3, 3), activation='relu', padding='same'),\n", " MaxPooling2D((2, 2), strides=(2, 2)),\n", " \n", " # Flatten and Fully Connected Layers\n", " Flatten(),\n", " Dense(4096, activation='relu'),\n", " Dropout(0.5),\n", " Dense(4096, activation='relu'),\n", " Dropout(0.5),\n", " Dense(num_classes, activation='softmax')\n", " ])\n", " \n", " return model\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\n", "from tensorflow.keras.optimizers import Adam\n", "\n", "\n", "model = build_vgg_model(input_shape=(224, 224, 3), num_classes=76)\n", "optimizer = Adam(learning_rate=0.0001)\n", "model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 115320 images belonging to 76 classes.\n", "Found 2146 images belonging to 30 classes.\n" ] } ], "source": [ "import numpy as np\n", "import tensorflow as tf\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\n", "from tensorflow.keras.optimizers import Adam\n", "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "\n", "train_datagen = ImageDataGenerator(rescale=1./255)\n", "val_datagen = ImageDataGenerator(rescale=1./255)\n", "\n", "train_generator = train_datagen.flow_from_directory(\n", " 'iam_words/words/',\n", " target_size=(224, 224),\n", " batch_size=16,\n", " class_mode='categorical')\n", "\n", "validation_generator = val_datagen.flow_from_directory(\n", " 'iam_words/words/a02/',\n", " target_size=(224, 224),\n", " batch_size=16,\n", " class_mode='categorical')\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\DELL\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\trainers\\data_adapters\\py_dataset_adapter.py:120: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.\n", " self._warn_if_super_not_called()\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "End of batch 0, loss=178.15127563476562\n", "\u001b[1m 1/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m251:06:00\u001b[0m 125s/step - accuracy: 0.0000e+00 - loss: 178.1513End of batch 1, loss=207.32989501953125\n", "\u001b[1m 2/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m591:50:01\u001b[0m 296s/step - accuracy: 0.0000e+00 - loss: 192.7406End of batch 2, loss=199.74803161621094\n", "\u001b[1m 3/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m636:42:38\u001b[0m 318s/step - accuracy: 0.0000e+00 - loss: 195.0764End of batch 3, loss=174.29595947265625\n", "\u001b[1m 4/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m622:20:36\u001b[0m 311s/step - accuracy: 0.0039 - loss: 189.8813 End of batch 4, loss=192.43576049804688\n", "\u001b[1m 5/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m606:30:57\u001b[0m 303s/step - accuracy: 0.0081 - loss: 190.3922End of batch 5, loss=175.5897979736328\n", "\u001b[1m 6/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m603:38:21\u001b[0m 302s/step - accuracy: 0.0102 - loss: 187.9251End of batch 6, loss=185.0625\n", "\u001b[1m 7/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m607:14:08\u001b[0m 304s/step - accuracy: 0.0113 - loss: 187.5162End of batch 7, loss=180.98373413085938\n", "\u001b[1m 8/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m604:02:07\u001b[0m 302s/step - accuracy: 0.0119 - loss: 186.6996End of batch 8, loss=172.88616943359375\n", "\u001b[1m 9/7208\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m615:07:47\u001b[0m 308s/step - accuracy: 0.0121 - loss: 185.1648" ] } ], "source": [ "class_weights = {0: 103.25689223057644, 1: 4.939395755904568, 2: 60.23318713450293, 3: 8.570730185146662, 4: 30.977067669172932, 5: 33.8811677631579, 6: 722.7982456140351, 7: 1.4360230045311955, 8: 3.8446715192235907, 9: 1.0424974696356275, 10: 240.9327485380117, 11: 11.472988025619605, 12: 15.488533834586466, 13: 34.41896407685881, 14: 37.38611615245009, 15: 58.60526315789474, 16: 38.04201292705448, 17: 77.44266917293233, 18: 90.34978070175438, 19: 60.23318713450293, 20: 44.25295381310419, 21: 28.911929824561405, 22: 42.51754385964912, 23: 77.44266917293233, 24: 4.683357962941912, 25: 6.2131654350776655, 26: 7.45152830529933, 27: 13.468290290944752, 28: 8.997488534614545, 29: 10.180256980479367, 30: 7.227982456140351, 31: 6.949983130904184, 32: 5.503539941223617, 33: 29.30263157894737, 34: 24.924077434966726, 35: 8.121328602404889, 36: 3.700332315430214, 37: 8.960308829926054, 38: 15.378686076894363, 39: 6.927778711955608, 40: 361.39912280701753, 41: 7.972039473684211, 42: 4.939395755904568, 43: 3.305479781771502, 44: 23.316072439162422, 45: 43.3678947368421, 46: 9.072781325699186, 47: 542.0986842105264, 48: 52.88767650834403, 49: 433.67894736842106, 50: 0.17630658889682943, 51: 0.9149344881190318, 52: 0.49722420014723806, 53: 0.3724484261150988, 54: 0.11054778163864926, 55: 0.6296151965279051, 56: 0.7722203478782426, 57: 0.2580500698372135, 58: 0.19329601861669685, 59: 14.455964912280702, 60: 2.359515491667144, 61: 0.33982051979973443, 62: 0.5829018109790606, 63: 0.19646595423050695, 64: 0.185285374420414, 65: 0.7656761076419863, 66: 14.750984604368062, 67: 0.2196955153842052, 68: 0.21947315150223737, 69: 0.15230699844364018, 70: 0.5459201250861292, 71: 1.383787324085581, 72: 0.7627135901660589, 73: 8.604741019214703, 74: 0.7879341340269278, 75: 29.704037490987744}\n", "\n", "from tensorflow.keras.callbacks import LambdaCallback\n", "\n", "print_callback = LambdaCallback(\n", " on_epoch_end=lambda epoch, logs: print(f'End of epoch {epoch+1}, val_loss={logs[\"val_loss\"]}, val_accuracy={logs[\"val_accuracy\"]}'),\n", " on_batch_end=lambda batch, logs: print(f'End of batch {batch}, loss={logs[\"loss\"]}'),\n", ")\n", "\n", "model.fit(\n", " train_generator,\n", " epochs=1,\n", " validation_data=validation_generator,\n", " class_weight=class_weights,\n", " verbose=1,\n", " callbacks=[print_callback]\n", ")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.save('vgg_model.h5')\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "val_loss, val_accuracy = model.evaluate(validation_generator)\n", "print(f'Validation loss: {val_loss}')\n", "print(f'Validation accuracy: {val_accuracy}')\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.models import load_model\n", "\n", "# Load the model\n", "loaded_model = load_model('vgg_model.h5')\n", "\n", "# If you want to continue training\n", "loaded_model.fit(train_generator, epochs=additional_epochs, validation_data=validation_generator)\n", "\n", "# For inference\n", "predictions = loaded_model.predict(test_data) # Assuming test_data is prepared\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "predictions = model.predict(test_data)\n", "# You may want to convert these predictions into actual class labels depending on your use case\n", "predicted_classes = predictions.argmax(axis=-1)\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.11.7" } }, "nbformat": 4, "nbformat_minor": 2 }