Created
February 21, 2020 05:12
-
-
Save ljmartin/7533d3837bad597b0b2971488808d87b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/home/lewis/miniconda3/envs/lew_nn/lib/python3.7/site-packages/numba/types/containers.py:3: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", | |
| " from collections import Iterable\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import numpy as np\n", | |
| "import scipy\n", | |
| "from scipy.spatial.distance import pdist, squareform\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "%matplotlib inline\n", | |
| "from scipy.cluster.hierarchy import dendrogram as show_dendrogram\n", | |
| "\n", | |
| "import networkx as nx\n", | |
| "import sknetwork as skn\n", | |
| "\n", | |
| "adjacency = skn.data.karate_club()\n", | |
| "paris = skn.hierarchy.Paris(engine='python')\n", | |
| "dendrogram = paris.fit_transform(adjacency)\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Balanced cut:\n", | |
| "Straight cuts often have one large group with many small groups. \n", | |
| "\n", | |
| "As opposed to a straight cut, balanced cuts leave all clusters having around the same size. \n", | |
| "\n", | |
| "----------------\n", | |
| "\n", | |
| "Example with karate club:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def balancedCut(dendrogram, maxClusterSize):\n", | |
| " labels = np.zeros(len(dendrogram)+1).astype(int)-1\n", | |
| " mask = np.ones(len(dendrogram)+1).astype(bool)\n", | |
| " last_cluster_id = 0\n", | |
| "\n", | |
| " for n_clusters in range(1, len(dendrogram)+1):\n", | |
| " temp_labels = skn.hierarchy.straight_cut(dendrogram, n_clusters=n_clusters)\n", | |
| " ids, counts = np.unique(temp_labels[mask], return_counts=True)\n", | |
| " if min(counts)<maxClusterSize: #do we at have at least one group under the min cluster size?\n", | |
| " smaller_than_max = ids[counts<maxClusterSize] #if yes, then get those group IDs.\n", | |
| " for temp_id in smaller_than_max: #There might be multiple. For each group, set the \n", | |
| " #instance labels to the queued cluster ID \n", | |
| " labels[temp_labels==temp_id]=last_cluster_id\n", | |
| " mask[temp_labels==temp_id]=False #so we don't increment previously assigned clusters.\n", | |
| " last_cluster_id+=1 #increment the cluster ID\n", | |
| " if min(labels)!=-1:\n", | |
| " break\n", | |
| " return labels\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Using max cluster size of 10\n", | |
| "Cluster ID 0 has 5 items\n", | |
| "Cluster ID 1 has 9 items\n", | |
| "Cluster ID 2 has 8 items\n", | |
| "Cluster ID 3 has 6 items\n", | |
| "Cluster ID 4 has 6 items\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "adjacency = skn.data.karate_club()\n", | |
| "paris = skn.hierarchy.Paris(engine='python')\n", | |
| "dendrogram = paris.fit_transform(adjacency)\n", | |
| "\n", | |
| "\n", | |
| "maxClusterSize = 10\n", | |
| "labels = balancedCut(dendrogram, maxClusterSize)\n", | |
| "ids, counts = np.unique(labels, return_counts=True)\n", | |
| "print(f'Using max cluster size of {maxClusterSize}')\n", | |
| "for j,k in zip(ids, counts):\n", | |
| " print(f'Cluster ID {j} has {k} items')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3iN5xvA8e85J9sWM0XsGiH2JrZf0VAj0aq2FK0RK7WK2qtia2xV2hqlsVo0sWIrIkHsvWKLyDzj/f1xJBVZZ+acJM/nulytc95xR5L3Ps+6H5kkSRKCIAiCkEPILR2AIAiCIGQmkfgEQRCEHEUkPkEQBCFHEYlPEARByFFE4hMEQRByFJH4BEEQhBxFJD5BEAQhRxGJTxAEQchRROITBEEQchSR+ARBEIQcRSQ+QRAEIUcRiU8QBEHIUUTiEwRBEHIUkfgEQRCEHEUkPkEQBCFHEYlPEARByFFE4hMEQRByFJH4BEEQhBxFJD5BEAQhR7GxdACCIAj/kYBXwGtAifazuT1QGLCzYFxCdiKTJEmydBCCIOR0KuARcA9twtO8854cbUJ0BkoB+TI9OiF7EYlPEAQLiwXOok1+mgyOlQMfAOUAmZnjErIrkfgEQbCgWOA02qSnKzlQFPgQkfwEQ4jJLYIgWIgGCEG/pJd43mO0XaOCoD+R+ARBsJBn6J/0EmmAW2jH/gRBPyLxCYJgIXcBtRHnq4EXJopFyElE4hMEwQJigGgjr6FGOwtUEPQj1vEJgmAB0ZhmYsobE1wDtF2mkWjXD6oABdp1g4URj8nsR3xHBUGwABWmGZ/LaPmDLnFEoG05JqCNKTEuOXAVbfIrBeQ28l6CtRCJTxAEC1BgmhafMaM1Mfw3qzS1BJr42hPgKVAabQIUSyiyOjHGJwiCBTiY5Cr37j1l586dREVF6XlmLHAGbSsvo1aj9PaY28BNvWMUrI9IfIIgWEAejO1wUqshNPQ5CxcuxMXFhSZNmjB58mSOHj2KUqlM50xj1g/eR7uGUMjKROUWQRAs5D5wA8PH6RRAY0BBTEwMR44cISgoiMDAQG7duoWHhwetW7emTZs2fPjhh8hkiV2UEWjH7gxdSuEANEB0eWZdIvEJgmAhKuAYhiWgxJqd5VN99+nTp+zbty8pEWo0mqQk2L17aWxt4w0PGzlQA1EsO+sSiU8QBAt6CYShX6tPhnaGZS10Ga2RJIlr164RFBTE1atnmTGjK05Oxo4xFgbcjLyGYCki8QmCYGHPgQvolvzkaMcHq2PYGGEEknQFmczYZRAOQEMjryFYipjcIgiChTkDdYBCgBz1ez2f2s/miQvKy6DtZjR0YowKmUmG5owptSZYmkh8giBYgVxANaAhJ0485MqVJ0AuIiJiCAm5j7ZbsRHadXTGPLYUxocKRsYgWJr47gmCYEXsWLkykODg10A9QkNtGDVqHVAQ08yitDfhdYSsSiQ+QRCsSkhICDVq1ACgYsWKXL161YRXL4Dxjz0FUNIEsQiWIia3CIJgNeLj48mfPz8vX77EwcEBtVpN7ty5ef78OU5OTia6y23gDsatH2yCaDdkXeI7JwiC1bhw4QLly5fHwUG73EChUFC2bFmuX79uwru4GHGuHCiBeHRmbeK7JwiC1Th37hw1a9ZM9lrFihW5du2aCe9iB1RF/8df4vrB0iaMRbAEkfgEQbAa747vJapQoYKJx/lAu3TiQyRJjkaj6/rBvIA74rGZ9YnvoCAIViMkJCTVFp/pEx9AMVatOsP58/fRtuZSzvaMiopFkmzRtvKMWT8oWBOR+ARBsApqtZqwsLAULT5zJb7bt28zZsx08udvjrbodEm0rTontF2azowdu55Dh5SAK+JxmX2Ijy+CIFiFGzduUKhQIQoUKJDsddOP8Wn5+voydOhQXF1d375SLsUxJUq4s2nTZpo3b2Hy+wuWIz7CCIJgFVIb3wMoWrQocXFxvHz50mT3CgoKIiQkhJEjR6Z7nJeXF1u3bkWl0nfvPsGaicQnCIJVSG18D0Amk1GhQgWTtfqUSiVDhgxh3rx5ODo6pnts2bJlcXV15eDBgya5t2AdROITBMEqpLaUIZEpx/kWL15MyZIl6dSpk07He3l5sXnzZpPcW7AOIvEJgmBxkiSl2eID0yW+iIgIZsyYwcKFC9/ZkT19Xl5e/PnnnyiVSqPvL1gHkfgEQbC4R48eoVar+eCDD1J931QTXMaMGUOfPn2oVKmSzue4urpSvnx59u/fb/T9BesgZnUKgmBxia29tFphpljEfvz4cQIDA7l8+bLe53p7e7Np0ybatWtnVAyCdRAtPkEQLC698T34L/EZWlNfrVbj4+PD7NmzyZMnj97nd+vWje3bt5OQkGDQ/QXrIhKfIAgWl974HkCBAgVwdHQkIiLCoOuvWbMGBwcHevbsadD5JUuWpHLlygQGBhp0vmBdROITBMHi0lrD9y5DJ7i8ePGC8ePHs3jxYp0ntKRGzO7MPkTiEwTBoiIjI3n8+DEVK1ZM9zhDJ7j88MMPdOnSJd0WpS66devGjh07iIuLM+o6guWJyS2CIFhUaGgo1apVQ6FQpHucIRNcQkND2bx5M5cuXTImRABcXFyoXr06//zzD56enkZfT7Ac0eITBMGiMhrfS6RvV6ckSfj4+DB58mScnZ2NCTFJ4uxOIWsTiU8QBIvSZXwP9E98GzduJCoqiv79+xsTXjJdu3blr7/+IjY21mTXFDKfSHyCIFiUri2+8uXLc+vWLdRqdYbHvnnzhpEjR7J48eIMu1D1UbRoUWrXrs3u3btNdk0h84nEJwiCxcTHx3P16lWqVauW4bGOjo4UKVKEu3fvZnjs9OnTad68OU2aNDFFmMmI2Z1Zn0h8giBYzMWLFylfvjwODg46Ha/LBJdr166xcuVKfvzxR1OEmELXrl3Zs2cP0dHRZrm+YH4i8QmCYDG6ju8l0mWcb9iwYYwaNQoXFxdjw0tVoUKFqF+/Pn///bdZri+Yn0h8giBYTEalyt6XUeLbtWsX169fZ9iwYaYIL01eXl5idmcWJhKfIAgWo+vElkTpJb64uDiGDRvGokWLsLOzM1WIqfrkk08IDAzkzZs3Zr2PYB4i8QmCYBEajYbQ0FDc3d11Pie96i3z5s3Dzc0tU3ZQKFiwII0bN2bnzp1mv5dgeiLxCYJgEdevX8fZ2ZmCBQvqfE7p0qV5+PAh8fHxyV6/d+8e8+bNY968eaYOM03e3t5idmcWJRKfIAgWoe/4HoCNjQ2urq7cuHEj2esjR45k4MCBlC1b1pQhpqtTp07s37+f169fZ9o9BdMQiU8QBIvQd3wv0fvjfAcOHOD48eOMGTPGlOFlKH/+/Hh4eLB9+/ZMva9gPJH4BEGwCH2XMiR6d5xPpVIxZMgQ5s6di5OTk6lDzJBYzJ41icQnCEKmkyTJJC0+f39/ihQpQteuXU0dok48PT0JDg7m5cuXFrm/YBiR+ARByHQRERGo1WpKlCih97mJ1VuePHnC1KlTWbRokVEbzBojb968tGzZUnR3ZjEi8QmCkOkSW3uGJKzEFt/333/P559/TtWqVc0Qoe7EVkVZj0ySJMnSQQiCkLNMnz6dV69eMWfOHL3P1Wg0ODk5kT9/fq5cuUK+fPnMEKHu3rx5wwcffMDNmzdNtu+fYF6ixSekKVoZx9PYVzyOfUlkQjTiM5JgKoaO7yVSKBR8++23Fk96ALlz56Zt27YEBARYOhRBRzaWDkCwLmpJw9VX9zj+JJxncZEoZHJAhkbSYK+wpV7hSrg7l8PRxt7SoQpZ2Llz55g6dapB5/7yyy84ODhQsWJFE0dlOC8vL1auXEnfvn0tHYqgA9HVKSS5+foh2+4cRZIkEjSqVI+xkSkAifpFKtO0WHWLTSoQsq7IyEg++OADIiMj9d4kNjIykkqVKvG///2PMmXK8MMPP5gpSv3ExMTg4uLCtWvXKFy4sKXDETIgujoFAC6+uMXWW4eJVyvTTHoAKkmNStJw6slldt45Lro/Bb2Fhobi5uZm0M7okyZNomPHjjRv3jzD7Ykyk5OTEx999BF//vmnpUMRdCASn8CdqMf8fe8UKkmt8zlKSc3VyHscfBRqxsiE7MiQUmWg3bT2t99+Y8aMGTrty5fZxFZFWYdIfDmcJEn8fe+kXkkvkVJS8+/Ty7xOiDFDZEJ2ZcjEFkmSGDJkCBMmTKBw4cJJ1Vusqcfho48+IiQkhIiICEuHImRAJL4c7kHMM6JVcUZd4+wz6/rkLVg3QxLf1q1befr0KQMGDADA2dkZmUzGs2fPzBGiQRwcHOjQoQNbt261dChCBkTiy+FOPrmEMp0xvYyoJQ1nn11DLWlMGJWQXcXHx3PlyhXc3Nx0PicmJgZfX18WL16Mjc1/E9GtsbtTbFWUNYjEl8Pdinpk9DUkJJ7EvjJBNEJ2Fx4eTrly5XB0dNT5nJkzZ9KwYUM8PDySvW6Nia9t27acP3+ehw8fWjoUIR0i8eVgkiSh1Og/tvc+GTJiVfEZHyjkePp2c968eRN/f3/8/PxSvGeNic/e3h5PT0+2bNli6VCEdIjEJ5iEWM8n6ELfxDd8+HB8fX1TLWb97vZE1kTM7rR+IvHlYDKZDDu58cV7JCQcFXYmiEjI7vTZg2/Pnj1cvHgRX1/fVN9P3KXB2rRu3ZrLly9z7949S4cipEEkvhyuQr4SyDCutWYjU1DEMb+JIhKyK41GQ1hYmE6JLyEhgaFDh7JgwQLs7VMvj1ehQgWuX7+ORmNdE6vs7Ozo3Lkzf/zxh6VDEdIgEl8OV79w5bf1OA1jI1NQt0gl5EZcQ8gZbty4QcGCBSlYsGCGxy5YsIDy5cvTsWPHNI/JnTs3BQoU4P79+6YM0yTE7E7rJp5WOVxRpwIUsM9t8PkSEjWcy5kwIiG70nV87+HDh/z4448sWLAgw2OtdZyvRYsW3Lhxg9u3b1s6FCEVIvEJdCjV8G3xaf3YyhR4FHfHycbBDFEJ2Y2u43ujRo2iX79+VKhQIcNjrXFmJ4CtrS1dunQR3Z1WSiQ+geJOBelSpqleyc9WpqBmoQrUL1LZjJEJ2YkuNTqPHDnCwYMHGTdunE7XtNYJLiBmd1ozkfgEAMrldaFn+Vbks82FbTozPRNi4rCV29Dyg5q0+qBWJkYoZHUZdXWq1Wp8fHzw8/Mjd27dut+ttcUH4OHhwb1797hx44alQxHeIxKfkMQlVyEGVPHEq2xzyuf9ABkyFDI5NjIFMmQUcshH+B9HcL0up1Yh69kEVLB+jx49QqVSpboeL9GKFSvIly8f3t7eOl/XmhOfjY0NXbt2FZNcrJDYiFZIk0bSEKdWIkka7BV22MgVbNq0iaVLl3Lw4EFLhydkIbt372bu3LkEBQWl+v7z58+pXLkyQUFBVK9eXefrJiQkkDdvXqKiorC1tTVVuCZz6NAhhg0bRkhIiKVDEd4hWnxCmuQyOU429uSydcRGrh3/69KlC9euXSMsLMzC0QlZSUbdnOPHj8fb21uvpAfaNXMlSpTg1q1bxoZoFk2aNOHx48dW2yrNqUTiE/Ria2vLt99+y+LFiy0dipCFpJf4zp49S0BAAFOmTDHo2tY8wUWhUNCtWzfR3WllROIT9Na/f3+2bNnCixcvLB2KkEWklfgkScLHx4epU6dSoEABg6794YcVuXPnBhAPqADrGr3x9vYWszutjBjjEwzSq1cvqlevzsiRIy0dimDlXr9+jYuLC5GRkSgUyZfMrF+/noULF3Ly5MkU72UsGriHSvUASZLejvFJgC1QAnB5+/+WpdFocHV1Ze/evVSpUsXS4QiIFp9gIB8fH/z9/VGrjd/WSMjeQkNDcXNzS5HYXr9+zZgxY1iyZImeSS8eOAOcBh5hYyPH1lYBaNAmvgTgNnAMuPL2dcuRy+V0796dHTu2Ao+B+2//RABxFo0tpzK+NL+QI9WrV48iRYqwa9cuOnXqZOlwBCuWVjfn1KlTadOmDQ0aNNDjajHAWTLu0kxMdhFvz3HHcp/zoxg7tjN58sQiSVeQySS0scvf/jcfUAooAEYWjBd0I1p8gsF8fHzEJBchQ6klvsuXL/Pzzz8za9YsPa6UAIQASnQfx9MAr4GLepxjKhJwFThLoUJqHBzskMnU/NcyTfz/l8AFIPTta4K5icQnGKx79+5cuHCB8PBwS4ciWLFz584lq9EpSRJDhw7l+++/p1ixYnpc6SbapKcvDfACbYLJLBLaZPsI0JDxPs1qIBJta1YkP3MTiU8wmL29Pf3792fJkiWWDkWwUgkJCVy5coVq1aolvbZ9+3bu3buHj4+PHldSoR0fM7TVpgEyc2PY28Bz9Btf1KDtlhUfJM1NJD7BKN9++y0bNmwgMjLS0qEIVujixYuULVsWR0dHAGJjYxk+fDiLFi3Ss9LKYxNE84rMmUyiBu5i2KSaxNZpjEkjEpITiU8wiouLC+3atePnn3+2dCiCFXq/m3POnDnUrl2b1q1b63mlx5hmdmZmrD19gnGTVCS0sz4FcxHr+ASjHT16lK+++oorV64gl4vPUjmXhLZV9Qhty0rD5cvXefxYiYdHD+7ceUjt2rU5c+YMrq6uel77JMa2giQJoqIKodGUxNHRETs7O2QZD74Z4AQQa+Q15EATQP99MoWMieUMgtEaNWpE3rx52bNnD+3bt7d0OEKm0wAP0XbvqXh3ckalSkWpUEECjvHgwRWmTBljQNIDU8zI1GjULF3qz6xZG4mJiUGlUuHk5GTiP45UqRKrw2SWjMjQfnjIZfTXLaQkWnyCSaxdu5ZNmzaxe/duS4ciZCo1EIZ2yUD6XZFqtRq53BaZzA1w1vM+Z97ewxhyoDzwAQAqlYrY2FhiYmJM9kcu13D48Czs7IxtUyiA6kB+I68jpEYkPsEk4uLiKFWqFEeOHKFiRbFXX86gAc6hTUj6PEbkaB/q+tTmvId2OYMx43xyoB7gaMQ1MqIBDpngOgqgJpDHBNcS3icGZASTcHBwoG/fvvz000+WDkXINLeBKPTvhtQA59F2i+pKn/V+acmDeZMeaB+pphiX0wB2JriOkBrR4hNM5t69e7i7u3Pnzh3y5BGfVLM3DXAEwxdby4GyQEk9zgnH8GUNCqAKUMjA8/VxFe2YpzGP1rxAbdOEI6QgWnyCyZQsWZKWLVvyyy+/WDoUweyeGnl+4oJyfZJDWQybjydD29rTd1zRUCUwbjmDAm3tTsFcROITTMrHx4clS5ag0Vi2Ir5gbvcwvrSWCv0mrDgANQAFuvdTydHOjKxG5hWAdkKbaA29n5zMS9I5k0h8gkk1a9YMOzs7goKCLB2KYFamqoCi73XyAHV49SqO2NiEdI6T8V8CqUXmr9yqauA9Eyf+iEezOYl/XcGkZDKZ2LUhRzBFiz5xhwL9PH0aTcWKX/D4cTG0iU2GtntQgSTJiYqKQaUqhnYGpxuWWQRuj3ZWpm5l2TQaDQkJarRJL68Z4xJAJD7BDHr27Mnx48e5efOmpUMRzMYUyUSGIa2iyZMn06NHD0qXdkebKJoAdYBayGT1+N//pnPkSATmn8GZkVxAXaAoICchIbVZrDJARnx8Llq1GsWZM+J3JjOIxCeYnJOTE7179xZLG7I1U1QUkfS+Tnh4OJs2bWLSpEnvvGqDdlwtN+BIkyZNOXDggAniMwV7tLNJG7Fo0S5u3nxCVFQC2qUKTmhntTbE0bEBAweO5PPPPycmRhSoNjexnEEwi1u3blGnTh3u3r1Lrlyi7FL28wLt5qnGTHDJhbY7Unft27endevWjBgxIs1j9uzZw8yZMzl0yBQLyU3j2bNnlCtXjvr16zNs2LA0S/v17NmTAgUKiK2+zEy0+ASzKFOmDE2aNOHXX3+1dCiCWRRAozHm8aEA9KvZuXfvXq5du8bgwYPTPa5JkyacOXOG2FhjC0Wbzr59+2jWrBm3b9+mbNmyaR73008/sXPnTv7+++9MjC7nEYlPMJvESS6iUyH7OXz4COPGrSIuzpAd0UGb+ArrfLRKpcLX15c5c+ZgZ5d+RZPcuXNTrVo1jh8/bmBsphcUFESrVq24e/cupUuXTvO4/Pnz88svv9C3b1+ePjV2raSQFpH4BLNp1aoVGo2GgwcPWjoUwUTi4uIYOXIk3t7eNGzYBQeHUujzGFGrNUhSYh1K3c9btWoVhQsXplOnTjod36JFC6sZ55MkicDAQKpVq0ahQoVwcHBI9/jmzZvTq1cv+vXrZ/CHRkmS0ERcQ3VgNcods1Fum47qn59QXzmKpDb0w0r2IRKfYDZiaUP2cubMGWrXrs3t27cJCwvD09MT+BBwQZdHSVyckpcvoxg/PgBJ0n3GZWRkJJMmTWLevHk675/XvHlzq0l8169fR6lUIpfL0+3mfNeUKVO4c+cOq1ev1utekkaN+uJ+lL/4oPpjIprQ3Ug3TiHdOovm4n7Ugf4ol/VBdWQ9UkykIV9OtiAmtwhm9ebNG1xdXTl79qyB+7AJlqZUKpk5cyZLlixhwYIFfPrpp6kkoFdo9+N7gXaK/rvr/BS8evWGQ4duMmLEHGQyW4YPH86gQYN0uv+oUaN49uwZa9as0Tnm6OhoihQpwpMnTyw+ucrf359Tp07RrFkzgoODWbt2rU7nhYeH4+HhwbFjx6hQoUKGx0vKOFTbZyI9ugaq+PQPltuAvSM23aYgL5TzyqOJFp9gVrlz5+aLL75g6dKllg5FMEB4eDiNGjXi2LFjhISE8Nlnn6XR6sqPdk1dQ6Ac2lqTHwBlADciIsrQr98URo36Hjs7OyZPnqzTrMubN2+yevVqpk+frlfcuXLlokaNGhw7dkyv88whMDCQNm3acPPmTZ1bfABVqlThhx9+4PPPP0epTL97UlIrUW2dgvTwSsZJD0Cjgtg3qDZ9j/Tyoc4xZRci8QlmN2jQINasWWNVs+yE9Gk0GubNm4eHhwd9+/Zl9+7dfPDBBzqcaY+2SHM5oCJQGihIpUqVadiwISqVilKlStGhQwd69OjBnTt30r3a6NGjGT58OMWLF9f7a2jRooXFx5dVKhUHDx6kdevWeic+0P7u5M+fP8PErw5eh/T0Fug1fieBMg7l1slIGmPrrmYtIvEJZle+fHnq1q3Lhg0bLB2KoINbt27RokULAgICOHHiBN98843OY2vpGTVqFPPmzWPp0qXs2rWLXr168cknn6S5YPvw4cOcPHkSX19fg+5nDRNcTp8+TalSpShatKhBiU8ul/Pzzz+zdOnSNGepSgmxaC4EgSq92qVpkCSIe4N0O0T/c7MwkfiETCGWNlg/SZJYuXIl9erV4+OPP+bgwYOUK1fOZNdv3LgxRYsW5fTp00ybNo1Dhw5RuXJl+vbtm+LnQqPRMHz4cGbOnImjo2Glxxo2bEhYWBhv3rwxRfgGCQwMpHXr1gAGJT4AFxcXli5dSq9evYiKikrxvvpSMBjzwUQZh/rfbYafnwWJxJeFaFRq3tx5zIuwG0RevUf8K8v9Quurbdu2REdHc+TIEUuHIqTi4cOHdOjQgWXLlnHw4EG+++47FArTF3ceOXIkc+bMoW/fvuTKlQs3NzeuXr2Kn59fsuN+/fVXFAoFn376qcH3cnJyolatWhw9etTYsA2WOL4XFRVFdHQ0RYsWNeg6Xbp0oVmzZgwfPjzFe5qzO0Gpw7heOqTH15Fe55x1gyLxZQHRD55yZvwaNhTpQkDV3vzdbBg76gxgY7Gu7Gkzkgf/nEay8v3v5HI5gwcPFksbrNDGjRupWbMmdevW5cSJE1StWtVs9/L09OTVq1ccOXKEVatWMXfuXObOncv8+fPZu3cvoJ2R+f333zN//nzkcuMeUc2bN7fYOF9UVBQhISE0a9aMW7duUaZMGaO6jBcuXMiBAwfYtu291lnUMyMjBRS2SJERxl8ni8jsTaoEPWiUKo59O5+bG/ZrF6TGpxy4frTvLE9PXsIuXy5a75yOc43yFohUN1999RWTJk3i/v37lChRwtLh5HjPnj1j0KBBhIWFsWvXLurWrWv2eyoUiqQKLLt27eKHH35g/PjxbNiwAS8vL44ePcpvv/1GkyZNaNSokdH3a9GiBWPHjjVB5Po7dOgQdevWxcnJyeBuznflyZOH9evX06VLF+rXr0/x4sW1XcSmWpCeYKo9Fq2faPFZKXV8Antaf8fNTQdQxyWkmvQSqd7EEvPgGX83HUpEcFgmRqmfvHnz8tlnn7Fs2TJLh5Lj7dq1C3d3d0qUKMHZs2czJekl+uKLLzh9+jQXL15k8ODBSJJEWFgYkyZNokOHDixcuJBZs2aZ5F4NGjTgwoULqY6NmVtiNycYPr73vkaNGtG/f3/69OmDJEnaFqRCtz3/MmRn6W2cMo9IfFZIkiQO9ZzBs9NXUcfo3nevio4jsOP3vLp814zRGWfw4MGsXLmSuLic8+nSmrx+/Zqvv/6aIUOG8PvvvzN37lyDJ48YytHRkcGDB+Pn54dcLmf16tVMnjyZdu3aIUkShQoVolQp0yyqdnR0pE6dOhYZWw4KCjJ6YktqJkyYwPPnz/H399e+kFf3mqdpUiuR5S9m/HWyCJH4rNDTE+E82Psv6lj9B6xV0XGcGu5vhqhMo1KlSri7u7N582ZLh5LjHDhwgOrVq6NQKAgNDcXDw8NisQwYMIDt27fz4MEDPvzwQ0aPHo23tzeRkZEULFiQadOmmexelihf9uDBAyIiIqhVqxZg2sRna2vLr7/+yqRJk7h06RKKWh+Dbfr1PzMiK1YBWZ5CJokvKxCJzwpd8NuMSo+WXjKSxKOD54h+YL0ztHRZ2hCVEMOhh6EsubgNv7DNzAndxMLzW9l2+wiPYp5nYrRZX2xsLMOGDaNXr174+/uzYsUK8uTJY9GYnJ2d+fzzz1m0aBEAw4YN4/Lly7Rt25aAgABWrlzJ9u3bTXIvSyxkDwoKomXLlkkzY02Z+AAqVqzI9OnT6dmzJ+pyDbTr8Qxl64CibmeTxZYViMRnZeKevuL+7lPG/SADl5fuNFFEpte+fXueP3/OyZMnU7z3OiGaTTcOsPTSDk4+vUSUMgalRoVKUhOjjufyq3v8di2IFZd2cTsq58xCM9SpU6eoWbMmjx8/JiwsLJCfUXQAACAASURBVM0NUC1h+PDhrFq1itevX7Njxw5cXFzYs2cPKpWKrVu30rdvX8LDw42+T/369QkPDycyMvOKMr87vqfRaLh9+3a62xEZol+/fpQoUYKJ02Yir9YGbNLfrilVMhk45kHmWsOksVk7kfiszKMD55DZGjfZVhOv5PbWYBNFZHoKhSLVpQ1PYl+x+spubkVFoJY0qKWUSzQkJJSSmufxr/nj5iFCn9/IrLCzlISEBCZMmMDHH3/MlClT2LBhAwULFrR0WMmUKVOGtm3bsnTpUkaNGsVPP/3E0KFD6d+/P3Xr1sXPz49OnTrx8uVLo+7j4OBAvXr1Mm2cT5IkgoKCkhLfw4cPKViwIE5OTia9j0wmY9WqVfzyyy8cl5VGVrQcSo0+yyVkYOeEbddJyOSmX7NpzUTiszLxz18jqYyvm5fw0roXt/fp04e///6biAhtqy0yIZrfrgcRp05AQrfWrkpS88/901yNvG/OULOc8+fPU79+fUJCQjh37hxeXl6WDilNI0eOZObMmVSqVInWrVszevRoIiIiWLduHV9++SUdOnTgs88+Q6027nciM8uXnT9/nly5clGmTBnA9N2c7ypSpAgrV66k15e9WRlRiON3XxGdoMr4RIUtOOXFtseMHDWpJZFIfNZGbnxNRACZia5jLvnz58fb25vly5cDsPPOMeINWI+kktTsuHOUBLG5Jmq1mtmzZ9OyZUt8fHzYuXOnQcWdM1OJEiWIjo6mWbNmgHbixpo1axg5ciSPHj1izpw5xMfHM27cOKPuk5kL2d9t7YF5Ex9Ahw4dcHd3Z8SoMcy+IBGodAXnUtquT9l7j3hbB3DIjbzuJ9h+sRBZwZy5nlYsYLcyDs55kdsoMLbNZ1cgt0niMafBgwfTtm1bBvj68Cjmhc4tvZRkXHx5m5qFMt6zLLu6fv06X375JXZ2dvz7778mH08yl0mTJtG+fXt+++03Ro0ahUwmo2bNmnzzzTcMGDCAgIAANm/eTN26dalRowY9evQw6D716tXjypUrvHr1ivz585v4q0guMDCQvn37Jv3d3Inv+vXrHD9+nFy5cnH56lU6/f03dvb2aJ7cQnPlCFLUc1AnIHPKj9zVHVnZOjmua/N9osVnZYq3ro1GqUNXRToUDnaU69naRBGZj5ubG5UqVWLzyT1oUhnP05VSo+L4k/AcWQBbkiT8/f1p0KABXl5e7Nu3L8skvYsXL7Jly5akDWYTS5YBjB8/nmvXrrFp0yYKFSrEtm3b8PHx4dy5cwbdy97envr163P48GGTxJ6W+Ph4jh49SsuWLZNeM2fie/nyJR07dmTkyJGAttzb06faGd3yImWwadoL2/bDsP14FDat+iMvXz/HJz0Qic/q2OfPjWuXpsgUxn1rKva1ntl76fHx8eG5fSwag1t7WjGqOJ7HvzZRVFnD/fv3adeuHWvXruXIkSMMHTrU6NqWmcnX15dx48bh7OzMyJEjWbt2OXADOIq9/QnOn1/C//6Xi/j407i7u7JkyRI++eSTpAe7vjJjnO/YsWNUrlyZAgUKJL1mrsSnVCrx8vKiXbt2nD17lj59+uDr68uXX36Jxspr91pa1vktyUHcfLsjtzesDJEaDZGlciHPZ9oZZObSsWNHbJzsjb6OHDnRypxRDUaSJNavX0+tWrVo1qwZx44do1KlSpYOSy+7d+/m5s2bDBgwAIijZ0831q79Fo3mLpAAaJDLIX/+3NjaRgKheHuXYuLEwXh5eWW4I3lqMmOc791lDInMkfgkSWLo0KHY2Njg4eHB6dOnmTx5MmPGjCE+Pp4FCxaY9H7ZjUh8Vsi5ZgXKfdYKhQEJwT5fbo67KqlVqxanTp0yQ3SmZWNjg9wEm5yCdqJLdvfkyRO6du3Kjz/+yN69exk/fjw2NllrqF6pVOLr64ufnx92dgnAv8jlkTg42JFag1XbitUAcXz5ZR26d29k0Oa0devW5fr167x48cLYLyFN75YpA23XY2RkJMWKmXbm5JIlSzh06BDLli3Dx8eH1atX4+TkhEKhYP369cycOZOwMOut22tpIvFZqQb+Q3lSSIFK1+54uQzbvLn4aN9cftuzjR9++AFPT09GjRpFbGysWWM1hkwmQyEzfsxBAhwUBizgzUICAgJwd3enQoUKnD59mpo1a1o6JIOsXLmS4sWL8/HHbYAQQAU6dnXLZBoGDGiDQvGMn3/+Wa/72tnZ0bBhQ4KDzbPG9cWLF1y+fJmGDRsmvXbr1i1Kly5t0i7oPXv2MGPGDHbt2sXkyZPp3Llz0qxY0K6P9PPzo2fPnqImbhpE4rNSP86Zw+8FHlB1SBcUjvbY5Eq9Fp9MIUfhZE+BqqXxPL2UQrUqIpPJ8Pb25vz589y9e5caNWpYdDPOjLjkcjb6GhpJQ2GHfCaIxvq8evWKL7/8kpEjR7JlyxZmz56Nvb3x3cOW8OrVKyZPnsy8efOQyS6jTXr6kckk5s7tx/Tpk1Ot/pMec3Z37t+/nyZNmiT73pi6mzM8PJwvvviCP/74g2vXrrF///5Ud7L44osvqFSpEt9//73J7p2diMRnhTZs2MCyZcvY9dcuGs0dRI+Hm6k942tylSyMzEYBdjao5SC3s6GMd3PaBy+gc+gq8pb/INl1ChcuzMaNG5k1axbdu3dn2LBhREdHW+irSluDIlVQGPGjKEeGW4Ey2JlqexYrEhgYSPXq1cmdOzfnzp2jcePGlg7JKNOmTcPT0xN394qA4ZOR5HI5AQFL6datG48ePdL5PHNOcDH3+N7Tp0/5+OOP8fPzw93dnf79+6dZd1Umk7Fs2TI2b95MUFCQSe6fnciknDgH3IodPnyYrl27sm/fPqpVq5bsPUmSUMXEcfCvf5izcD57gvchV+jWTfjixQuGDRvG0aNHWb16Nc2bNzdD9IbRSBoWXwggRm1YYW4bmYLeH/6PQtmoxRcdHc2oUaPYuXMnq1atom3btpYOyWjXr1+nfv36XLx4kWLF3gD30bWLM3V2TJ26n927d3PgwAGdWsFKpRJnZ2du3bqFs7PxPQ3vKlu2LDt27MDNzS3ptaFDh1K6dGmGDx9u1LXj4+Np3bo1TZo0YebMmQwePJiYmJikpSBpCQwMpE+fPoSGhlKwYAEgEu2/+xtADSgAJ6AEUACw7sIXpiJafFbkypUrdO/end9//z1F0gPtpzjbXI4ULFeCZ7GvdU56AAULFmTdunUsWrSIXr16MXDgQItszpkauUxOyw9qIjNgBraNTEG5vC7ZKukdO3aMGjVqEBUVRVhYWLZIegCjR4/G19f37USPCIxLegBqxo0bQrFixZI2tM2Ira0tjRs35tChQ0beO7kbN24QGxtL1apVk71uihafJEl8++23FC5cmOnTpxMcHMy2bduYO3duhue2adOGbt26sX69H5J0AggDngKxaGfPxgLPgQvAMYz/MJI1iMRnJZ4+fUqHDh2YMWNGsllhqcmbNy+vXxvWTdShQwfOnz9PQkIC1apV459//jHoOqZWrWBZ6hepjDIuQedzbGQKCjvmx9O1kRkjyzzx8fGMGTOGrl27Mnv2bNatW2f2KiOZ5dChQ5w5c+adlo9xRRoSyeUqbZHm48dZunSpTueYY5wvcTan7L0ZyqZIfHPmzCE0NJT169cTFxfH119/zU8//ZRsrWDaJObM6Ue/fs2QyeIgzZpQarSJ8AYQjnYWbfYlEp8ViI2NxdPTk08//ZQ+ffpkeLwxiQ+0dTJXrVrFihUr6N+/P19//TWvXr0y+Hqm0qJETRQ3XqNRqVG8X2PwHTJAGRdPcdv8fF6+NTbZoBLFuXPnqFu3LleuXCE0NJQuXbpYOiST0Wg0jBgxglmzZr2z27vxrQptC08iT548bN++ncmTJ+s0Y9Mc43ypje9JksStW7eSilUbYtu2bSxatIgdO3aQK1cuJk6cSJ06dejUqZOOV7iOjc1TnHReGqUBngGXyc4tP5H4LEyj0dCrVy/Kli3LlClTdDrH2MSXqG3btpw/fx57e3vc3NzYtWuX0dc0Vr82PVjWYwLV85TGQWGHndwGO7ktdnIbpAQ1klpD5fyuJBy+x54Z67N80lOpVEyfPp22bdvy3Xff8eeff1KkSBFLh2VS69atw87ODm9v73deNf77FhsbT2K54XLlyrF+/Xq8vb25e/duuufVqlWLu3fvGlwB5n1qtZr9+/en6KmJiIggT5485M5tWN3cc+fO0a9fPwICAihRogSnTp1i/fr1SZv3Zuwl8BD9W28atN2h1ruZtbFE4rOw0aNH8/TpU9asWZOimyQtDg4OqNVq4uMN3KX9HXny5MHf359ff/2VoUOH0qtXL7Mu8M1IkSJFaNnYg7AtwQxx60L3ss3pUKo+H5WsT9nXeQie9DudSjdm7EBfgoODzV570ZyuXLlC48aNOXjwIGfOnOGLL77Q+Wcgq3jz5g3jxo1j/vz5731txo/JymQajh4NTfp727Zt8fX15ZNPPiEmJibN82xsbGjSpInJxvnOnDmDi4sLLi4uyV43ppvz0aNHeHp64u/vT926dYmPj6dPnz4sWLCAwoUL63iVOxjeZal5e372JBKfBfn7+7Nz504CAgL0Wpclk8nImzevSSenNG/enLCwMJydnXFzc+PPP/802bX15ePjg7+/P2gkSuUuQqX8pahSwJU2NZty7NAR1Go1uXLlYs6cOQwePBiVyjTjRZlFo9GwaNEiGjduzJdffsnevXspWbKkpcMyizlz5uDh4UGDBg3ee6ckxrX6ZDx5IuOrr/omS3K+vr5UrlyZfv36pTvZpUWLFiYb5wsMDEx1XN7QxBcbG0vnzp3p168f3bt3B2D69OmUL1/+vVZzeuIAY4cvYtDO/sx+ROKzkL/++otp06bx999/G7Qztqm6O9+VK1cuFixYwB9//MHYsWPx9vY2WXeQPurUqUPx4sXZuXNnstednZ1xcXHhwoULAHh5eVGwYMGkPf2ygjt37tC6dWs2btzI8ePHGThwYJYqLK2P+/fvs2TJklQXWGunzhtTak2Gq2tj6taty4QJE/57VSZj5cqVXL58mXnz5qV5dvPmzU02zpfa+B4YlvgkSaJ3796UL1+e8ePHAxAaGsqyZcvw9/fXo0fgsV73TZ0G0H2NZFaSPX/jrNzZs2fp3bs3AQEBBneFmCPxJWrcuDHnzp2jdOnSVKtWjY0bN2b6lj8+Pj4sXrw4xeuNGjXi+PHjgPYht3jxYiZNmmSRBK0PSZJYs2YNderUoV27dhw+fJgKFbL3/oFjx45lwIABlCpVKpV3ZUB5DHsEyYGCQG4WLVrE77//zokTJ5LedXR0JCAgAD8/vzRnLdesWZMHDx7w+LFxCSI6OprTp0/j4eGR4j1DEt/kyZO5c+cOq1evRiaToVQq6d27N7Nnz07RlZq+WEwzOcV6yx0aQyS+THb37l08PT1ZtmwZ9evXN/g65kx8oH14zJ49mx07djB16lS6dOmiV4UMY3Xr1o3w8HAuXryY7PWGDRty7NixpL+7ubnx+eefW3VppoiICDw9PVm0aBH79+9n9OjRKPRYg5kVnTp1in379jF69Oh0jiqCRuNKXJzuOy3ExMQTF6cAtOvlChUqxKJFi+jdu3eyupSlSpVi06ZN9OrVixs3bqS4jkKhoGnTpkaP8wUHB1O7du1UJ7Dom/g2btzI2rVr2bZtGw4O2hKFfn5+FC5cmK+++krPyExVsD17Fn4Xic9ENGo1cc8iibr1iLinr9CoUv7AREZG0qFDB3x9fY2erm7uxJeoXr16nD17Fjc3N2rUqMG6desypfVnZ2fHN998w5IlS5K93rBhw6QWX6JJkyaxa9cuq9yN4o8//qBGjRq4u7tz6tSpVAsTZDeSJDFixAimTp2aajmtd/3wwyoWLNiFJMlI/3Gkff/x4wTq1fuWV6/++9nv1q0bVapUSTErulmzZkycOJFOnTrx5k3KsSpTLGtIq5sT9Et8J0+exMfHhx07dlC0aFEALl26xLx581ixYoUBk55MVbA9+5UBBEASjPL61iPppK+/tD5vB+kXh3bSutztpV8c/yety91eOjZ4ofTq6j1JkiQpISFBat26tTR48GBJo9EYfd8ePXpIv/32m9HX0cfZs2cld3d3qX379tK9e/fMfr+HDx9K+fPnl16+fJn0mlqtlvLlyyc9fvw42bE///yzVLduXUmtVps9Ll08f/5c+vTTT6WKFStKJ06csHQ4mWrz5s1SjRo1JJVKle5xGzdulFxdXd9+L+MlSbolSdJhSZIOvffnoCRJFyVJei1JkiQNGTJEatu2raRUKpOu9ejRI6lIkSLS6dOnk91Do9FIX3/9tdSlS5cUPxtnzpyRKlWqZMyXKrm5uaX6/Y2JiZHs7e0z/DeQJEm6c+eO5OLiIu3YsSPpNZVKJTVs2FBasmSJgZFFSNp/u/0G/9FoDkqSdNfA+1s30eIzkDIqhqBO4wmo0ptLS7ahjIpFHa9EFR2HOi4BVXQcV1b8xXb3fuxpM5JBvfvh6OjIggULTDJlPbNafO+qWbMmp06dokGDBtSsWZNVq1aZtfVXvHhxPvroo2Tbz8jlcurXr59sTAe01egVCgVr1641Wzy62r17N9WrV6dw4cKEhIQY1aWd1cTFxTFq1CjmzZuXbnfumTNnGDx4MNu2bXu7btEOKA00BtyBKkAloBrQ6O3fta3HuXPnIpPJGDFiRNL1ihUrxty5c+nduzcJCf9V/5HJZPz00088evSI6dOnJ4vB3d2diIgIg7vwHz16xP3796ldu3aK927fvo2rq2uGXdpv3rzB09OT4cOH8/HHHye9vnjxYmxsbN5u1GsIXZc8pC0uLpaBA6dy8uRJE/+ea9BWiYnHUl2pIvEZIO55JDvqDuDBP6dRxyWgSUh9Or2kVKGOS+DhwRCqbrnDmvk/mWxsxxKJD7RdkBMmTGD//v0sX76ctm3bcvv2bbPdz8fHhyVLlqBW//cL8u4El0RyuZwlS5bw/fff8/LlS7PFk56oqCi++eYbBgwYwLp161i4cCFOTk4WicVSFi5ciLu7Oy1atEjzmEePHvHJJ5+wfPlyatSo8d67MrRr/AoBRdDO/kze3WZjY8PGjRsJDAxMNqO3Z8+elCpVipkzZyY73t7enq1bt7J8+XJ27NiR9LpCoaBZs2YGj/MFBQXRokWLVDcC1qWbU61W07NnT2rXrp1sY90bN24wbdo0Vq9ebfCMX40GQkOfER+vewnA5GRAEVxdy/HZZ59Rs2ZNli5dasQzRwJeAOeAYOA4cOLt/59COws188qkicSnJ3V8AnvbjOTN7Qg08boNysvUEvk0tgR3nIDyjWlmSVkq8SWqVq0ax48fp3Xr1tStWxd/f380GtP/4DZo0IACBQqwe/fupNfen+CSqHbt2nTu3JmJEyeaPI6MBAcH4+7ujlKpJDQ0lJYtW2Z6DJb2+PFj5syZw48//pjmMXFxcXzyySf07dvXqHHu/Pnzs3PnTiZOnJg0Tpe4Fc+SJUtS7D5evHhxtm7dSt++fbl06VLS68aM8wUFBRk1vjd27FgiIyNZunRpUi+QJEn069ePMWPGGDzrN3H7qmHD/IiPN3SNqwxHxw8ZPXo0165dY86cOezbtw9XV1f69+/PmTNn9LjWK7QFsC+grSYjoU1yic+LaOAKcARtpRnzE4lPT9fW7uX11QdptvLSIqnUvLn7hMtLd2R8sA4snfhA+8l79OjRBAcHs379elq2bMn169dNeg+ZTJZiaUP9+vU5c+YMSmXKDx7Tp09n48aNKR585hIXF4evry89evRg4cKFrFmzhnz5ss9OEfqYOHEivXr1omLFiqm+L0kS/fv3p1SpUsnW3hmqfPnybNiwgU8//TTp565EiRLMmjWLPn36pChsUL9+fWbPnk3nzp2TatMaupBdkiSjJrb8/PPP/Pnnn2zduhU7u/8moqxcuZLo6GiDtjGKjIxk6NChtGvXDhcXF8LDb3Dpki36P+blgBuQS/s3uZw2bdqwZcsWwsPDcXV1pWvXrtSpU4eVK1emOnHoP0+AULRdm+l1a6rf/rkG3NQzXv2JxKcHSZI4/+MmVDFxGR+cCnVsPBfn/YFkgpaRNSS+RJUrV+bIkSN06tSJBg0asGDBgmRdk8by9vbm3LlzXLlyBYB8+fJRpkwZQkNDUxzr7OzMlClTdN6mxhinT59OqvsYFhaWbIwmpzl//jx//vknP/zwQ5rH+Pn5ceHCBdauXWuy0mwtWrRg8uTJfPzxx0nJrE+fPhQoUAA/P78Ux/fu3Zt27drx2WefoVarqVatGs+ePePhQ/1aGuHh4djb21OuXLlU308v8R06dIjRo0eza9euZHsC3rt3j3HjxrFmzRq9hkQkSWLDhg1UqVKFFy9eUK1aNR4/fsyZM2eoX78tUBNtsYCMHvdytNV0qgGp71VYvHhxxo0bx40bN5gyZQq7du2iVKlSDBw4MJXfx1fAJfTrwtQA99Buj2Q+IvHp4cnxcOKeGDd+pIyJ42GgPt0EqbOmxAfa8ZLhw4dz4sQJAgICaNasGZcvXzbJtR0cHOjXr1+ypQ2pLWtI1K9fP968ecPGjRtNcv/3KZVKJk2aRIcOHZgwYQKbN2+mUKFCZrlXViBJEr6+vkyYMCHNrXL++usv5s+fz/bt200+7vnNN9/Qpk0bevTogUqlSqre4ufnl6xbM9HcuXOJjY1lwoQJyOVyPDw89G71JZYpSyuBp5X4bty4gbe3N7/99huVKlVKel16u+fekCFDUuzpl55Lly7RqlUrfvzxRyZOnEhwcDA1a9bkwIEDlChR4u1ReYEGQFnAHm1yk5O4RET7d1vA9e1xGVeSUigUtG/fnu3btxMWFkbRokXp2LEjDRo0YO3atcTERKN/0kukQbs9ku7rO/UlEp8e7m47YnBrL5EqKpZbfxw0OhZrS3yJypcvz4EDB/jss89o0qQJs2fPNkktzW+//Zbffvst6WtObYJLIoVCweLFixk5cqTJN9sNDw+nYcOGnDx5kpCQED799NNsV1haX3///Td3797l22+/TfX98PBwevfuzdatW81Wk3TevHlJCRigdOnSTJkyhT59+qTofbC1tWXz5s38/vvvbN682aDyZel1c0qSxM2bN1NsR/Tq1Ss6duzIDz/8kOLcX3/9lfv37zNmzBid7h8dHc33339Ps2bN6NSpEz179mT8+PEsWrSIOXPmYGv7/vo7W7T1URuibdGVR5sIy6Pt1myMdlat/uv/SpQowcSJE7l16xbff/89f/zxB127tiE+3tg6nxFGnp82kfj0EPPouUmqAMVGGL/7gbUmPtCOCQwaNIjTp08TFBREw4YNk+prGqpEiRK0bt2aX375BUh7gkuixo0b06pVK6ZNm2bUfROp1Wrmzp2Lh4cH/fv35++//9azhFT2pFQq8fX1xc/PL5WHLTx//hxPT0/mzJlDw4YNzRaHjY0NmzZtYu/evaxYsQLQfliys7NLdRufwoULs23bNgYNGoSLi4teiS8hIYHDhw/TqlWrVN9/8uQJTk5O5M2bN+k1lUqFt7c3rVu3ZuDAgcmOj4iIwNfXlzVr1qT6b/guSZLYvn07VatW5c6dOxw+fJiDBw+yadMmTp48qcM+fTK0M2U/AEq9/W/Bt68bx8bGBk9PT/766y+2bp2Pra0x6SWxy9M8wxUi8elDY6JvggkuY82JL1Hp0qX5559/6N+/Py1atGDq1KmpTkjRVeLSBo1GQ8WKFXnz5k26a7Bmz57N6tWrje5yvXnzJi1atGD79u2cPHmS/v375/hWXqLly5dTsmRJOnTokOI9pVKJl5cXnTt35ssvvzR7LIkzPSdMmMCBAweQy+WsXr2a6dOnpzrpqkaNGkk9Ay9evODevXs63efEiRNUrFgx2fjcu1Lr5hw+fDgymYz58+enOH7w4MH07ds31fWA77p16xaenp6MGTOGNWvWMGLECDp06EDJkiU5cuSIURvempqTU6wJiq8rMVetUJH49ODo4gwmeOBtO7CXNm3aMGLECNauXcuZM2eIjdXvG5wVEh9oZ2X269ePs2fPcvz4cerVq0dISIhB12rSpAmOjo4EBgYik8lo0KBBmt2doF3UPG7cOIYMGWLQRBdJkli+fDn16tWjU6dOHDhwwOCi4tnRy5cvmTp1KvPmzUv1g8CIESOws7Nj9uzZmRZThQoVks30LF++POPGjePrr79OdblNjx498PLywsbGhn379ul0j/S6OSFl4vP392ffvn1s2rQpxZq/LVu2cPHixXQnBcXHxzNt2jTq1q2bVED+ypUr/O9//2PWrFksWrRIr23NzE+DaVpqMsw1zicSnx5KfdwIuYNxtets8jjS138yw4cPp2jRogQFBdGnTx8KFizIhx9+SLdu3ZgyZQoBAQFcv349zbVxWSXxJSpZsiR//fUXw4YNo127dkyYMEHvjXTfX9qQUXcnaD9NP3jwgG3btul1rwcPHtC+fXtWrFhBcHAwvr6+2b6wtL6mTp1K586dU60/umLFCgIDA9mwYUOm/7u1bNmSSZMm4enpSWRkJEOGDCEhIYFly5alevyMGTMoXLgwc+bM0en6ae2/l+jdxBcYGMiUKVPYuXNnimUuz58/Z8iQIaxevTqpKHVq96pWrRpnzpzhzJkzDBo0iK+++orly5dz7NixpP36rIspuyfN09Upk8w95zsbSEhIICAggJ+W/ETn41BAY3jycyicD++HfyB/72GgVCq5cuUK58+fT/oTFhbG8+fPqVKlCtWrV6datWpJf5ydnbG1tSUhISHLPZAfPnzIgAEDuHHjBj///DN169bV+dzY2FhKlSrFiRMnuHv3LuPHj+fo0aPpnrNv3z769u1LeHg4jo6O6R6bODV82LBhDBw4kHHjxmU47pITXbt2jYYNG3Lx4sWkosqJ90lJ2QAAIABJREFUDh06hJeXF0eOHLHo1ks+Pj5cv36dnTt3cu3aNZo2bcrp06cpXbp0imOPHTuGh4cHq1atSrdb9uXLl5QqVYqnT5+mmax69+5NkyZNaNy4MR4eHmzZsoWmTZumOK5Xr144OzuzYMGCFO89ePCAESNG8O+//7Jo0SI6duzI+fPn6datGx4eHixcuDDDn2VL0Gg0XLp0iUqVHqNQGNs7JgfqkLie0JRE4kvHgwcPWLFiBStXrqRixYoMGjSIyhEKzo5dhTpGv9YKgMLBDvcJn+M+tqfO50RGRnLhwoVkyfD8+fM42TsQ+zySL3p9QY3G9aheswZVqlSxyl+G1EiSxMaNGxk+fDhffvklkyZN0jn20aNHo1QqmTJlCkWLFuXFixcZdvV4eXlRpUoVJk2alOYxz549Y8CAAYSHh7Nu3boMx1xyss6dO9OgQYMUsxBv3bpFw4YNWb9+fbrdgZlBpVLRvn17qlatyvz585k1axb79+9n7969KbpmJUnC2dkZmUzG7t27qVevXqrX/PPPP1m+fDl79+5N874eHh4MHz6c7777jvHjx6e6pdBff/3FkCFDCAsLI1eu/x7sSqWSxYsXM2PGDAYOHMjYsWNxdHTk559/TqqB2qtXL8P+QcxApVIREhLC4cOHCQ4O5siRI+TLl49t2ybj5uZi5Fi4LdrZpqYfTxeJ7z2SJHHo0CF++ukngoKC+PTTTxk4cCBubm4AqGLj2VlvIJFX7yEpdV+kLVPIye1aFM+zy7HLa9gnGEmj4dH+EM7P2cTD/SEo1SoUNgpkKoknDkp2qm7yskxuqlavlqx1WLZsWavd5fvJkycMHjyYsLAw1qxZQ6NGjTI8586dO9SqVYs7d+7QrFkz/P39adCgQbrn3L17l5o1a/Lvv/+mOk63c+dOvvnmGz777DOmTZuW5qd5AQ4cOECfPn24dOlSsn+nqKgoGjVqRL9+/RgyZIgFI/zPy5cvadCgAd999x29e/emQYMGDBgwgK+//jrFsV5eXhQvXpw///yTf//9l2LFiqU4ZuDAgZQtW5bvvvsuzXuWLFkSFxcXmjdvnur4ZmRkJG5ubvzyyy/JStsdOXKEgQMHUqxYMZYsWULFihWJjo5m0KBBnDp1ii1btlClShUD/yVMIzY2llOnTiUluhMnTuDq6krTpk1p1qwZTZs25YMPPkBbl/MChhehlqNdV1jaRJEnJxLfW1FRUaxfvx5/f3/UajWDBg3iiy++SDYlOVHsk5fsqj+ImEcv0CRkPPgqs7XBoVBeOp74idwlixgUX0RwGId6TichMhpVGvU+bXI7IslA1rMe4flik1qJz58/p2rVqsmSYfXq1a1q0fXWrVsZPHgwPXr0YNq0ack+Bafmk08+oV27dpw/f57y5cvrVOJpxowZnDp1Ktl43+vXrxk2bBgHDx5k7dq1NGvWzOivJTtTq9XUqVOHsWPH4uXllfS6RqOhS5cuFC5c2MD948zn6tWrNG3alE2bNlGwYEFatWpFSEjIOwu8tZYuXcqpU6eSZiPv378/RU9ChQoV2LJlC+7u7qneKzY2ljx58tChQwcCAgJS/cCZOCs4scD206dPGTVqFIGBgcyfP59u3bohk8m4dOkS3bt3TyoQndpmt+b2+vVrjh07RnBwMIcPHyYkJISqVasmJbrGjRunMbtVQluIWv+eMS052jWHptpXMLkcn/jCw8Px9/fn999/p0WLFgwaNIgWLVpk+Isb/+oNB7pP4snRi2jU6lRbfzKFHLmdLc41y9MqYAoOhfMbFOPtrcEEfzELdaxuP0QKJ3uqj/mMGuM/B/7rLk3sJk384+jomCIZVq5c2WLdpc+fP2fo0KGcOHGCVatW0bx58zSP3b9/P0OGDGHUmNEcPH+CYaN9UWs0OChsKe7kTH77lA+J+Ph4qlatyuLFi/noo4/Yv38/ffr0oV27dvj5+WW4aaql3P8/e+cdFsXV9uF7Cx2UYsGORgUUsaGIvcWCWLF3Y++SRGPsJdiiMbF3JbH3jkYj9oaigKKIKNgARUBByrb5/uBl4wrIsgvE5OO+rr1Yppw5Mwzzm/OcpzxLwP9KJHFvk1EqVBSxNKZ6zVJUr1kKsbhgBWbLli1s3ryZy5cva/yPTJ8+nUuXLnH27FmN3JNfCmfPnqV///5cuXKF7du3c/PmTY4fP65xDg8ePKB9+/Y8efIET09PSpQooVH9ISIigvr16xMdHZ2tBWXKlCn89ttvvH37Nkuh+uuvvxgyZAjBwcGYm5uzadMmZs6cyYABA5gzZ476Hty5cycTJ05k4cKFDB06tMBeJN68eaMezV26dInQ0FBcXFzUozk3N7dcCPBb0kd9uc3ekr+jPfh/KnwKhYIjR46wevVqQkJCGD58OCNHjsz0BqgN70KfE7LiAI99ziAgIFPIEQvpwZyV+rSk+qTuWDnpHl8TfSmIP9tN1Vr0MpCYGuH62zjsh7pnuV4QBJ4/f64hhMHBwYSFhVGhQgUNMaxRowYVK1YsMHPpsWPHGD16NJ07d2bRokVZCtK7tCTGLp6KUwc3UlNTMbewQBAExCIRSkFFGdNiNChZjUoWpTQeGhmepW3atOHIkSNs3LiR9u3bF8h55QaVSsD/aiQnDt4n6sU7FAoVqo/iSI2NpRiZGNC+kyPN21bBxDT/xSYxMRF7e3sOHz6sMQe2a9cupk2bxs2bNyleXP86cPnFmjVrWLVqFRcuXKBVq1ZMmTKF/v37q9cLgkCpUqW4fv06NjY2NGjQgPHjx6sz0mzcuBE/Pz927tyZZftHjx5lyJAhODk5ZVnqKCkpCWdnZ1atWkXJkiUZPXo0hoaGrF27Vu0Zm5qaipeXF2fPnmXfvn1ZlG3KW549e6YWuYsXLxIVFUXDhg3VQufi4qJnqMQr0hNPayt+YsAWqEp+zO1l8P9K+KKjo9m4cSPr16/Hzs6OsWPH4unpmSdvqEqZnNTXCaxYvIxUFMxaugCJkX7tCoLAvkr9+BAZo9P+EhMj+kTvx8BC+9yIMpksS+/SuLg4qlevnsm7NL/MpQkJCXz77becO3eOjRs3ajhKBMQ+4q+Xd1AoFfCZEY+hWIqVkQW9v2qJqTT9n/fGjRu0atWKypUrc+7cOaytc85LWNDI0hSsXHyB0JDXpKV+Pt2boaEE8yJGTPNuQ/GS+TtinTlzJk+fPmX79u3qZbdu3cLd3Z2zZ8/i7Oycr8fPC8aOHcvTp0+ZM2cOHTt2JDAwUGMur3fv3rRt25YhQ4bw+PFjGjVqpPbK7NmzJ+3bt2fIkCGZ2g0MDKR169YMHjyYpKQk1q5dm2mbiRMnEh0dTbFixThw4ACLFi1i4MCB6hfK8PBwevToQeXKldm0aVOW0yz6IAgCoaGhapG7ePEiKSkpapFr2rQpzs7O+eAlHguE/O97dnN+GS/VdqRnlMnfEe5/XvgEQeDy5cusXr2aU6dO0bNnT8aOHZutjV5ffv31V548eZJlmqTcEn0xiDMdfkTxQbf8oFIzY1wWj8BxTE5pjHImISEha+9SU9NMYlitWrU8cw45deoUI0eOpE2bNixdupT7qS+4GnMPuUq7SXMJYswNTehXsRVLflrIpk2bmDFjBnPnzuXu3bs6jfLzE6VSxeJZZ3gS9ha5TLtzFIlFmJkZMv9XD6xt8qfwbYZz0N27d9X5NqOioqhfvz4rVqyga9eu+XLcvEYul+Pu7k6NGjUwNjbm4cOHHDhwQG0VWL9+PVeuXOH3338H4PTp0wwZMoSrV69St25dAgMDM90z0dHR6pJHGU4xkydP1tjm8uXLeHh4YGRkRLdu3fD29tZ46Tp48CCjRo1i1qxZjB07Nk9Mm0qlksDAQA3TpampqYbQVa1atYDMqCrgDfCM9Pp7GUIn8Hce0VKkV5HIf/6zwpeUlMSOHTtYs2YNKSkpjBkzhsGDB2Npqds8m7Zs2bKFS5cusXXrVr3bOtNpOi9O3AA9/kTmFUrS/cmOfLm5PzWXZojh48ePsbOz0xBDfcyl79+/Z8qUKdyPfUqHaYMQctmECHj7NIrQrRfYsGEDtra2zJw5k8ePH7Nr165c9yc/2bHZn/N/hiFLy503nFgiwrZUERas7Jgvf+t+/frx1VdfMW/ePCDdJNesWTM8PDzypLZeQZLh6enl5cWKFSuYO3euOhD80aNHtG7dmsjISPV1XLJkCdu2bUOpVKpLY2WQkpJCixYtaNeuHXPmzKFr1670798fT09P9Ta3b9+mSZMmlCpVit27d2vErcpkMqZMmcKRI0fYu3dvrmJaPyUtLY1bt26pRe7q1auULl1aw+OyfPnyOrefd8hIz8gikC50RuT3CO9T/nPCFxoaypo1a9i+fTuNGzdm7NixtG7dusDmp/bt28eePXvYv3+/Xu0IgoCPUVsEhX517SSmRnQJ3ESRrwouofLH5tKPHWri4+MzeZdqay4VBIHlAXtJk+h2PURKgV5VWlKxSCkAkpOTcXR0xMfH57NONAVJSoqcCYP2IdNypPcpRsZSvKa3wLFGZjd8fbhx4wbdunUjNDQUc3NzBEFg4MCByGQydu/e/UV5cGpLhqfnnDlzmDdvHkFBQRQvXhxBEChTpgyXLl1S19oTBIHatWuTmprKgwcPNKql9+vXD5VKxa5duxCJRNSqVYutW7dSu3ZtkpKSmDt3LqtXr8be3p5bt25pmBEjIyPp2bMnJUuWxMfHJ9uSTtmRlJTEtWvX1EJ369Yt7O3tadq0KU2bNqVx48Zf9JzrP0nBjCv/hyI5lad7zhOy+jApr96iksmRmptQ3NURp297UKy+g07/RAqFguPHj7N69WoCAwMZOnQoAQEBVKhQIR/O4vNYWFjkSSoxfcsfqZGIef3kOQalrTA2Ni6Qh5ShoaFa1Pr27atenmEuzRDDvXv3EhwcjJmZWZbepR+bS18mx6IyEOlW3gsQJCKuv3mgFj5TU1OWLVvG+PHjuXPnTqYciv8EV88/QaSHl2ZamoKTh+7nqfAJgoCXlxc//fST2pvv559/5sXjh5xcNRfVjf0IChkiY3NEpe0RlbL/Vwhh1apV2bFjB/3798fDw4OJEyeyc+dORCIRLVq04Pq501S0aA9KOSIjM4pZWfL02XOWL1/Ot99+C6SnbAsPD+f8fh+Ep7dRydMoL0qgYkkrDhw4gJeXF87OzpiZmeHr66shesePH2fo0KFMnjyZ7777Tqtr9vbtWy5fvqw2XYaEhFC7dm2aNm3K1KlTadiwYZ7PC/5XKZARnyI5lVvTNhG22RdEosxxaGIRUmMjTMsWo96SkZTvlHMQM6QHP2/atIl169ZRunRpxo4dS48ePf7R4OMrV67w/ffffzZ5sjbIk1LYYd1Z7xFfqkjJBvNwHspikclkmJiYYGpqqv6YmZlp/bs22xoZGeXqwZdhLv001OJTc6lVy6okmuk5+hWJGeXYiSKGpupjf/3113Tq1OmLCLiePOowr6P1qx8oNRCzfGM3iljmTUjKnj17WLx4Mbdu3UIsFnNx/1Ziz2yjQzVbRGIJKGSAAGIJSKRgaonEpQtix6aIDL78JACrV69m1apVyGQyli9bikf1UkSd3ICl4h0GxiaACEFQkZSYhNy+KR4/rmTR6k28i43h5vZfmNOpLhJZEogkCCoV75MSMTGQcvPVByya9mXY7F+YPHmy2ntUoVAwY8YMduzYwe7du2nUqFG2fXv58qWGx+WzZ89wc3NTmy7r169fmGhBR/Jd+FLfvsO3xbckPn6FMlWW4/YSEyNqzuhPzR/7ZrleEASuX7/O6tWrOX78OJ6enowZM+aLSS8VHBxMnz599K4/JwgCPoZtEJQ6DnH+h9TMmE6311G0ajlUKhUpKSl8+PCB5ORkkpOTNb7n9Ls262QyWZ6IqqGhIW/evOHFixdERkZSun99jIro57hhJDagYwU3qhT92zkhJCSEZs2ace/evUw5Jwuabzy3o1Tq9+9oYmrA97NaUdlBfxNXamoqDg4O+Pj40LRpU2IO/4px2AVMDKSIPpc8WGoEJhYY9JiPqKhuCRsKkjFjxiB7do+f3CyxKmKBSJGNtUUiRaUSuBT+hrplimBiYoJElX0CC5kg5nmiAvvJ2xCbFuXly5f06dMHExMTtm/frmGGFASBx48faziivHv3jiZNmqiFrlatWl+EZeK/QL4KnyIljeNu43j34BkqufZVuCWmRtRbMlLDGzE5OZldu3axevVq3r17x5gxYxgyZMgX544eERFBs2bNiIyM1Lst31bfEe13V682TEpa0evlXkQFNMepVCoziasuAvrp7/22TcXQVL+3W3lKGv4+p4m8GoJEIkEkEiEIAi9fvkShUKi99QRB+OxHm21yux2CCPfGy/Q2E0qkAg1amuFYowRWVlZYW1tjbW2t08hg4cKF+Pv7c/DgQZJOrkBx7xymBlq6uovEYGSKQb+liIp82fNMssc3ST20CGOpdtdeEASt/06CSILIzJKrZT3o881Ixo4dy7Rp0wC4d++eOqzg0qVLSCQS9fxckyZNcHR0/GJTDf7byVfh85+ynpBVh1FpMdL7FImJIV2CNvNaSGbt2rX4+PjQoEEDxo4dS9u2bb/YG+Lt27dUqVKFuDj9q6y/OHUTv57zsk1RlhMSEyNqzxlEjcm99O7LP83y4P2kKnN/H32MLDmVC6sPcv+sP4mJiaSlpWFubo6ZmRlv3ryhSpUqlC5dGgsLCywsLChSpEiWn6JFi2JhYYG5uTlisRiRSJTtB/js+o+3mzzilEaQum7ISRQu8yYujLi4OPVHIpFoCKG1tfVnf1coFLRv357r169jl/yU1DPrtRYGNSIxFCmOweCV6WbRLxDV6yco9swAha6ptXJGKcDj2GQulmrPh5RULl26xOXLlylRooSGx6Wdnd2/Yn70v0C+jZuVaTJC1x/XSfQAlHIFC1sNYtOHuwwZMoSbN2/+K4qAZji35OatMDvKtHFBamass/AhCFT5pp1effiniImJwd/fn5s3b3Lz5k2cRrfBpoJ+ThtisZiEmDjkcjn16tXDycmJypUrU758ee7cucO+ffsYMWIEiYmJJCQkqD/Pnz/X+D3jk5KSQtGiRbG0tNTpY25urnGPWFqbEBebrNc5GhgYsXn9Kqys/zYLC4JASkqKWgTj4+M1RDE+Pp5nz55p/P7o0SNkMhnVq1cjfEZbbIvoMNoWVJD8DuHJLUSVXfU6r/xC6bc5X0UPQCKCMkUMCT+7B0WFugwcOJCNGzdmmQS7kIIh30Z84TvOcnX0r7o/tAGMpPR4tRdzq6I5b/sFYWRkREJCQp7kvPTfdIg7I1dgkMvgNampMc7T+2U7V/olkZSUxO3btzWE7t27d9SrV4/69etTv359zKrZcufDU+SC7g4uJhIjJjh15c3rNxqxh0FBQYSEpGeWcHBwoHPnzuqg/K+++ipb64JcLuf9+/eZBDE+Pj5Lofz0k5qaqiGcZYs3oqhxbUR6vI/aVy/JNO82Ou8P6VlI2rRpQ2hoKBe2r6Tph9uYGeo+Ygt+ncr315O1GmlaW1tneiHIL4SEaOS/TwJl/lT5/hRRiUoY9NOu2G0h+Uu+Cd+JJhN5fUU/Bw8DC1Oa/D6VCp2z93z6EilevDj379+nRAn9JvZv3LhB165dmdWsD6ZHH2idr1NqasRXg9ritmrCF2c6kcvl3Lt3Ty1wN2/e5MmTJzg7O2sIXeXKlTUEJ1UhY+X9Qyh0FD6pSEIjWycalqye5XqFQsHRo0f55ptvGDp0KGFhYQQFBREbG6tO1fZxhpqsM9LnDrlczrt379RCGBMdx/6tMWiZlCYTKkGGTHIbC2uZViNOMzOzLOvSff3113Tt2pXq1asjPziPphWt9AovVomlBFTtRVSykGmkmdXvqampGmKorYnWysoqV84fCr/NqIJOo/MFzy1SQwz6LkFkU65gjldItuSbqTP55Ru921ApFKS8epsHvSlYLCwsSExM1Ev4Dh48yMiRI9m6dSseHh5EHrrMpcGLEQQh+7JEpkYIKoGaMwdQY0rvf1z0BEHgyZMnGiJ39+5d7Ozs1AI3ZswYatSokWO+VGOpIQ6W5XmQEIlSyL2nq0wm4yvD7P8eUqmUbt268ddff5GamsrRo0cBzcoWQUFB7N69m+DgYIoUKaIWwgxRtLe3z1XeVwMDA4oVK6YRwB/19CrXLjxBocjd+6iAijTZB6q5lqRs2TLqUWdUVFSmkaYizQQrc0eMDItibGgKYhlyIRqx0VuSkz/w4MEDypcvz9SpU4mY1Q6RrsGT/0MsNaRBlTKItTR3ymQy4uPjsxXGsLCwTMKZsb2pqanW85guD69gWFCi9z9Urx4iKRS+f5x8G/HtLttTb9ESG0pxWTic6l7d86hXBUPNmjXZtm0btWvXzvW+giDw66+/smzZMo4cOaIRpqFMkxGx/yLBi3fzLuwFEkMDEIFKrsTIxoIa3/ei8qA2GBYt+LpdkB5X+bG58ubNm5iamqpFrn79+tStW1fnINtUpYwtob68lyUjfM6d/hPkqTKi/gzmzO9H2LlzZ7bVtQHi4uJwdHTk1KlT2f79BEEgMjJSLYYZMYgRERFUrVpVQwydnZ0pVaqU1i8hfucusGLhNYpalCE3+m5iYkCLTuZ8+/1I+vTpg7e3t0ZWfZVK4MalCI4fvMfrqETkcqVGJjwDw/T+hT79i2q1zDl6fD81atTgQNsiGIn1e0Qkpsn5/sh9dga80HD4ySCr759blt3PDHLyolWpVAiCwLPZbbEugKoWf5+IBEmjvkjqdSm4YxaSJfkmfAccB/M+9LlebYhNDHFbOYGq33x5ZWM+R+PGjVmwYEGui5oqlUomTZqEn58fJ0+e/GxeveToONJi3yEoVRhaW2BWtniBjvA+fPhAQECAhsjFx8drmCvr1atH6dJ5myotUZbM9sdniU95j0iS87ynVCRBGpbIL15zmTx5Mt7e3kyaNIkpU6Zkm4V+w4YN+Pj4ZKo5lxMpKSmEhISohTAoKIjAwEBUKpWGEDo7O1O9enVMTTXjEo8ePcqwYcPYuuUPzh1PIOZlEhLJ5x/MEqkYExMDps7/mnJ2VsTGxjJy5EjCwsLYvn07zs7OyGRKVi25wMPgGNLSPh9WJAhKBBQY2dxj4+blyNcNhtQkra9BVshFBtwr0ZAo0/KoVCq18CiVSg0x+nhddt+12fbT7QD1sT5e/0PxcMzE+o1mc4VEiqTxACR1PArumIVkSb4J35VRywnb4qtX5hG5SMUqqydUa+1GixYtaNGiBVWqVPnHTXg54e7uztixY+nQoYPW+yQlJdGnTx9SU1PZv38/RYt+OQ49CoWCe/fuaYzmHj9+jJOTk8ZorkqVKgUSZnLN/zqr/tpJzfYNESPK5PCiVCgRCVDSwoZWZepQ0cIWHx8fpk6dytatW1m0aBFisZg//viDMmXKZGpfqVTi6urKxIkTGTBggF59FQSBmJgYDTEMCgri4cOHlCtXTi2EMTEx7Nu3j+PHj+Pg4ECtWnWYMHIRkWEiPiTJ0gXro/9UY2MpiKB5myq071IdSysTjWP+/vvvfP/990yePAXl+5qEP4rVutqDIAiYmBowZ6k7Nn7z4E2EXtcAA2OknrMRl6qqXzu5IC0tjZiYGKKjo9U/P/2+tZUlFSz1qTWXOxLTFKx/qEBmVw9XV1fq16+fJ3PFeYXwIR7h5UOEtCQQSxCZFEFUrgYig4K7RgVFvglfwoNIjrqMznUB1Y+xrl2Zmgd+xM/PT/0RBEEtgi1btsTOzi7vOp1H9OrVi65du9K7d2+tto+KisLDw4OaNWuyfv16DAwM8rmH2SMIAk+fPs00L1e+fHkNkatRo4aeBSp1Q6FQUK9ePb777jt69OnF/binHL5zDjMrCwyNjTAUS3kZHM6hX3x4cDNIY999+/Yxbtw4Dh06hJ+fHytXrmTdunV06ZLZ9HT9+nW6devGw4cP8yX/oVwuJywsjMDAQNavX8/NmzcpWrQoSUlJmJiYYGNjw9ixY6lRowamhmUIuvWa+LgUlEoVFkWMqelShvqNKmDwmYDyiIgIJo5cQRFjJ8Si3N1TIhFYWpmwaLwFyvObMci2jpoWWBTDYOg6vV9YFQoFb968yVLEPv4eHR3Nhw8fKFmyJCVLlsTW1hZbW9tM3+3f38PyyUVEBeTVqRRJ8LXtzK2g+9y4cUNdwsjV1RVXV1caNGiAs7NzgVawFwQB4WUIyltHEJ4FpaedUynTbwCRGFQqxNVbIKndAZFVwSW6z2/yNYD9aP3RvL31SKd9peYmNNr4HZV6tVAvy0jr87EQmpiYqIWwRYsWX0R9tWHDhlG/fn1GjBiR47b37t3Dw8ODYcOGMX369AIfzb558ybTvJyxsXGmebkvZQS6fPlyTpw4wZkzZ9TXqnbt2mzYsEFd0uX+/fvUrFmT27dvZ6q7eOLECYYMGcLevXsxNjamb9++tG3blmXLlmUyPX7zzTdYW1uzdOnSfDkXlUqFl5cX58+fx9fXl9KlS7Nnzx4mTZrE999/z6NHj9RhF1ZWVpmcaapWrfrZlyRZmoJxg/blWMw2O8QSgUdPd3OyjzEmuQ1ez8DACHHj/khruWe5WqVS8fbt288KWcb3+Ph4bGxsshWyj79bWVnlaH14ExmG6f6pGBRALgyFCnzD3zNg2xXKlClDjRo1qF69OlZWViQnJ/P06VP8/f0JDw+nZs2aNGjQQC2IFSpUyJ+yYvJUFEcXI0SFgvx/OVezQiwBkRhxva5IGvT84i1u2pCvwhd1/i5nOkzL9ahPJJVgUdGWLsGb0x04skEQBB48eKAWwfPnz2Ntba0hhAWVf1GlVPLy9C1CVh7k6fUgpIIIq1IlsKldmepe3SlezyHTPmfPnqVv374sX76cfv365Xsfk5OTM83LvX37NtO8XFbmvy+BZ8+eUadOHa7tyRBsAAAgAElEQVRevUrVqulmM5VKhYWFBVFRURojMxsbGzp27Mi2bdsytePn50evXr3w8fGhYcOGjBkzhrt377Jr1y6NKuIxMTE4OTlx4cIFqlWrlqfnIpPJGDRoEK9eveLIkSNYWlry9u1bnJ2d2blzJ82aNVNvq1KpiIiI0HCkCQoK4vnz51StWlVj7rBGjRrY2toiEom4fC6c3zfc1Fn4AEqUMmJhryRUwWf+l5A6dyjEBviW8ODF66zF7c2bNxQpUiRHIbO1taVYsWJ5Uh08ISGBpUuXsnbtWs56taOauQyRDp7CuUJqiLT3QpSWZQgLC1O/0GQUd46OjsbBwQEHBweKFClCWloaL1++JDAwEEA9InR1daVevXpYWFjo1R1BkYZ89zSIe6l9HKPUCHH1FkhbDtfr2F8C+Z6kOnTjcW54rUGZrJ34iaQSjKwt6HR7HWZlcpfjT6VSERwcrBbCixcvUrp0abUINm/ePM9t6oJKxf1fDxC8ZDeK5LRMoQYisRiJsSGm5YpT13sodt2aALB161amTp3K3r17NR5yeYVCoSAkJERD5B49epRpXq5q1apfbPq3T+nSpQt16tRh1qxZ6mWRkZE0bNiQly9famw7bNgw9u/fT3x8fJZvqNeuXaNz586sXbsWT09Ptm/fjpeXFzNnzmT8+PHqfX777TeOHTumMcLUl8TERDw9PTEzM2Pnzp2YmJggCAK9evWibNmy/PLLL1q1k5yczP379zXmDoOCghCJRDg7O1PBuidKuX6JvQ0MJXj/0g6rCwsRYp8hUmkvoilyFbNvJBIltclW1IoXL15gpr3k5GRWrlzJ0qVL8fDwYM6cOZS3MiH192+RyPVItJHTceVKrqdY02bmpmz/15KSktR/y48/giBQpUoVihYtilKpJCYmhsePH/PVV19pmEirVauWq5cC+eGF6abN3KYBlBohbjIAaa1/l8PhpxRIWaInu89xeejPIPDZCg1ScxNMS9vQ/twyTEvnXJw0J5RKJXfu3FEL4ZUrV6hYsaJaCJs2bapXRXZFqoxznrOJuRCIQgthl5gaUW1CN46II9ixcycnT57EwSHzSDC3CIJARESEhsnyzp07lC1bVkPknJ2d/5F5ubzg8OHDTJ06lcDAQI1zOH36ND///DNnz57V2D4gIIAGDRpw/vx5GjbMuszVnTt3cHd3Z8mSJQwYMIDw8HD69u1L8eLF2bp1K8WLF0ehUFC7dm1mz55N9+76h9W8efMGd3d3ateuzZo1a9QB17t27WL+/Pncvn1br4w/giAQFRVFcHAwu9dHo1Lp91KjVKXx8Nk+Xr24wf6Bdalua4FJDomqBUAkNULq7oX4K90riucVMpmMzZs389NPP+Hm5sa8efPUI/iwsDDG9vLg4IBaGIpUaBNDIgAiRGRrGvwYqRGyyg1pv2APpUuXxsfHR+uE4RmOUZ+K4YMHD7C0tMTGxgZBEIiNjeX9+/e4uLjQsGFDtSCWKlUqy3ZVsc9Q7PpBpxE8AEZmGIzcgkjy760UUWAV2JOj4whdf4yQlYcQFEoElYCgVCGWSlDJFVjV/ArnKb0p19ENsTR/EtrK5XJu3bqlFsLr16/j4OCgFsImTZqoi23mhKBS8VeXmbw6G6BVuaUMlBK4bStj7u0DOge4x8bGZpqXMzAwUHuKZczL6SPqXxKJiYlUr16d33//PVO19N9++42wsDBWrVqlsVwQBKytrWnXrh27du3Ktu2QkBDatm3LjBkzGDlyJHK5nNmzZ+Pj48PWrVtp06YN58+fZ+DAgTx48AAzMzOdzyMiIoI2bdrQu3dv5s6dqx5Bvnr1itq1a3PixAlcXFx0bv9T8qLMkYGhiE69qtCiTTXMTIxQ3T6G6s7x9IemXLN8jyAxIC0tFVG5mpi1GoK4uJ1ex9YXpVLJrl27mD17NpUrV8bb21vj+oaFhdGyZUvmzJnDN54dkJ9YBnEvUMjSkGZREFgpNkAkErHsXCij+3TBPCYk3QEki1yfSokh8e+TKNp2BGb1OpKamsqgQYOIiori8OHDelWVUSqVhIeHq82kwcHB3L17lxcvXmBpaZmekzYhAXNzc+rXr0/z5s1xc3OjTp06mJiYoDizBtV9P61EPksMjJG2HYe4ipvO5/BPU2DCl4FKoST6QiDJL2NRpKRhaGmOTe3KFK1a8NkM0tLSuHHjhloIb926hbOzs9pjtGHDhtm+fYduOM6Nb7U34X6MxMQQ9wu/UszFPsdtk5OTuXPnjobIxcbG4uLiojGa+1Ln5fICLy8vEhIS2Lp1a6Z1o0ePpnr16owbNy7Tum+++Ya9e/eSkJDw2VRW4eHhtG7dmnHjxvHdd98B6fOAAwcOpFevXixYsIBBgwZRuXJl5s+fr9M5BAUF4e7uztSpUzX6KggC7u7uuLq6MmfOHJ3azo6RvXeRqsf8HqTX9xvzfROc6/x9fwkqJULEXZTBZyAxFkEpT6/AXqEms3afR2Jho/N1ygsEQeDo0aPMmDEDc3NzFi5cmOmF6WPRGzp0qHp5XFggR+aNpG89O1QKOUqVCgOJmFiFIReTLOk981dWr9vIH3/8weW/TiMKvYgq8BTChwSU8jQ+pMqJFZlj3/s7Bs5YRlV7B7VpXqVSMWXKFE6cOIGvr2+ee6RnxJFmmL5v3rzJvXv3SElJwdDQkJSUFCpXKIv/6DoYSfQz24tKVsag7+I86nnBU+DC9yWTkpLC1atX1UIYGBhI3bp11ULo6uqKkZERgiCw/6v+JEVE63QckVhMhe5NabF7psZypVKZaV4uNDSU6tWra4icvb39v2ZeTl8CAgJo37499+/f10jtlUGLFi2YPn06rVu3zrTu6tWrtG7dmsOHD9OmzecTNz9//pzWrVvTt29fZs2ahUgk4u3btwwbNoxnz57xyy+/4OnpyfXr16lcuXKuzuHixYt0796dVatW0bNnT411GzZsYMOGDVy7di3Pw1imTzjGi2cJerVhYCjB+7eOlCylnTPFw4cPad68OZGRkf+IWd3Pz49p06bx4cMHvL298fDwyDQ3m53oAWzevJn9+/cTExNDDceqrF7xG2ZWxbhzN5BevXrx6NEjBEGgXbt2NGnShJkzNf+Hx44di4+PD6NHj2bIkCE0adKE0NBQjXt35cqVLFq0iKNHjxZIAe3Y2FiCg4MJCAjgRcBFZtQACyM9zZQSKYYT9uRNB/8BCoXvMyQlJXH58mW1ED548ABXV1faVqpN8R33EFJ0rw8nNjKg0fVl3Hn0t9AFBARQpkwZDQ/LmjVr6lRE9L+AUqlU12AcPHhwltuUKlUKf3//LMNYVCoVVlZWtGrVioMHD+Z4vJiYGL7++mvatm3LkiVL1IVq169fz8yZM2nWrBlpaWkcO3ZM63M4fPgwI0aMYOfOnZnE+cmTJ7i6uuaL1+jz58+ZM30DKXHlMZDqfv9UrGLDnJ+zDkXIjq+//prBgwcXiKdyBv7+/kybNo0nT54wb948evfunaWzx+dED8DFxYWwsDDmz5+v4eQkCAIVK1bk6NGjODs78/LlS+rUqZPJPH3hwgUmT55M6dKlefbsGfb29pQuXZply5ZpHOfQoUOMGDECHx8f3N1zd331QRUZiOL4UpDpV/4KwGDi3i+2zmJOFApfLnj37h0XL14k7IdtFH0Yj1iPnPUylJy0iEHUwl4tdC4uLv+Zebm8YOXKlRw4cAA/P78sPSoTEhIoV64c79+/z9bjcvDgwezZs4e4uDitnEbi4uJo164ddevWZfXq1eqRdUhICL169SIiIoKNGzdqlZxg06ZNzJo1i2PHjmV6s1cqlTRv3pyuXbvy7bff5tiWNiiVSnx9fZk/fz4BAQGYmJjTtdVyEHR7OBmbSBk+oREubtmnzsuKI0eOsGjRIq5du6bTcXNDSEgIM2fO5Pr168ycOZOhQ4dmO3L+nOipVCqmTZvGkiVL8PX1pW3btpn2//bbbylSpIjaJL17927mzp37v2udfm/Fx8dToUIF4uPj2bx5Mz/++COpqanqxN8fc+3aNbp168a8efMYPrxgQgRUL+6jOLJIf+ETiTCYuO9fG9P3/8NelkcULVqUjh07Ym9dRi/RAzBEwqwJkzl8+DDTpk2jdevWhaL3ES9fvmTu3LmsW5d9xo/Q0FDs7e0/+883YMAADA0NOXnypFbHtba25uzZs4SEhDB48GAUivQ5smrVquHv70/Lli0ZMGAAf/31V7ZtCIKAt7c3Cxcu5MKFC1mas5YvX45YLGbSpEla9etzxMTEMG/ePEqWLEmPHj2Iiopi7dq1xMbG0KGrM4ZGuRc+kQiMTQyoVS/3CSE8PDx49eoVt27dyvW+2hIREcHgwYNp3rw5DRo0ICwsjFGjRmUreo8ePcpW9OLi4ujQoQOHDx+mdevWWYoegKenJwcOHFD/3rt3b2rVqsXUqVPVy6ysrLC0tCQyMpIRI0Zw5coVLCwsaNKkCW/eaFascXNz4+LFiyxevJiZM2dSEGMQkbk15CIkJVuMMpe0+jdRKHw6oNAjDZtGO4n6mxv+q0ycOJExY8Z8Ntzj4cOHOYaDNG3aFKVSyaZNm7Q+dpEiRfD19eX169f07t0bmSzdpG1sbMyRI0dwcXGhS5cuzJ49Wy2MGahUKiZMmMC+ffu4fPkyVapUydT+/fv3Wbx4Mdu2bdN5rlYQBPz8/OjcuTN2dnYsXLiQatWqcfLkSSIjIxk2bBiGhoZ49quF3VfWqHL5sDMylvLDvK+RSnPfP4lEwpgxY1i9enWu982J6Ohoxo8fT926dSlXrhxhYWFMnjw5U9adj3n06BGtWrXKUvQCAgKoW7cu1atXx97e/rPmWTc3N2JjY3n06O9sVKtXr+bgwYOcOXNGvaxmzZrqwHMHBwcCAwN58+YNTk5OnD59WqPNKlWqcPXqVf78808GDRqkvtfyC5FlKSiiX51QJFLE1VrkvN0XTKHw6YChZR6U/RGJMC5upX87/0GOHz9OYGAg06ZN++x22gifgYEBnTt35vz587x7907rPpiamnLkyBGUSiVdunQhJeXvAOedO3diYGCAn58fzZo1IyIiAkj3Eu7Tpw/BwcFcuHAhyzgqmUzGgAEDWLBgARUrVtS6PxnExcWxfPlyKlWqRLdu3Thz5gx9+vTh7t27XLx4kRYtWnzyJi4Q8HAzSOMw0sKhQamUY2IqYfrCdpQuq3uauqFDh3L48GFiY2N1buNjEhISmDZtmjpQ+8GDB8yfPz/HVHoZojd37txMordlyxbatWvHkiVLmDNnDufPn6dTp07ZtiUWi+natSuHDh1SL7O2tmbLli0MHTqU+Ph4AJydnQkK+jtPbMmSJZk9ezYODg4MGzYMLy8vUlP/DgUpUaIEfn5+vH//Hnd391zdp7ogqdcVDPTxGxAhySYF3b+FQuHTAdumzoiN9cs2ITUzxrp27rwD/z/w4cMHxo0bx9q1a3N06tFG+AD69OmDmZmZxgNLG4yMjNi7dy9WVla4u7uTmJgIQMWKFZkwYQIlS5bE09OT+vXrs23bNjp06IBCoeDUqVPZPpB/+uknbG1tGTZsmNb9EASB69evM2jQIMqXL8+SJUtITEzku+++49mzZ2zZsgV7+8yhMYIg4OXlRVx8LBt2jGXQaFfKlLfE0EjCp1YqY2MpJqYGlKmk5FHU75SroJ/ZvVixYnTp0oXNmzfr1c6HDx9YtGgRVapUISYmhrt37/Lrr79qFQP7seh988036uWpqakMHz6cn3/+mQsXLtCjRw98fX1p0KABVlaffxnt1q2bhrkT0p15OnfurA5T+XjEl8H48eN5/PgxW7du5fnz59SvX5979+6p15uamnLgwAEcHBxo0qQJL168yPH8dEVctSGZbgBtEUkQlbZHVFTPUeM/TKFziw4kR71lX6V+qNJ0z+puXMKSXi/3Is6D3IP/JSZPnkx0dDR//PFHjts6Ojqyb98+nJycPrtdamoq1tbWuLq64ufnl+s+KZVKRo8eTVBQEL6+vlhZWZGSkoKjoyObN29GEAQ8PDyoUKECN27cyHau1t/fHw8PD+7evZttVo2PSUxMZMeOHaxdu5aoqChEIhHFihVjypQp9O7dO8dwgaVLl+Lj48OlS5c0+hT5JI6rF57w9s0H5HIVRYoa41SrFHVdyyESk6Mnrbbcvn2bbt268eTJk1zn2JTJZGzcuBFvb28aN27MvHnzcpXlKDvRi4yMxNPTk0qVKrF582Z1zsvevXvTsmXLHBPLy+VySpUqRUBAgIazSnJyMnXq1GHu3LnUrFkTDw8PHj9+rLHvunXrOHDgAH/++Sfbtm1jypQpzJo1i3Hjxml4jy5dupSVK1dy/PhxjdyxeYnqWTCKIwtymb1FBCYWGPRflj5X+C+mUPh05EzHabw4eRN0uHwSEyNqzRyA89Q++dCzfy+BgYG0adOG4ODgHN/o5XI5FhYWJCQkaBXu0aNHD06ePMmTJ090SlwuCALfffcd586d488//6REiRIcOnSIyZMnIxKJ6NG3F2nFDXgvSsPFrT7FrKyxMSpKLZuvsDQyJyUlhTp16jBnzhx69er12WPdvXuXdevWsXv3bkqXLk1UVBRubm589913tGzZUiungl27dvHDDz9w5coVypXLXXKInGInc4ObmxtTp06lc+fOWm2vVCrZsWMHs2fPxt7eHm9v71zHumUneqdPn2bQoEFMmTIFLy8v9XVMTU3F1taWR48eaTWSHDJkCLVq1WLixIkayzNebPz9/XF0dCQ6OlojmbRcLsfR0ZH169fTqlUrwsLC6NevH8WKFWPr1q0a9+Xu3buZMGECu3btolWrVrk6f21Rhl1HeWpFlplnMiESp4tej3mIrP/5Cjj6Umjq1JHacwcjMdHN3Ck1MaTq8H+3jTyvUSqVjBw5Em9vb60ePuHh4ZQtW1brGMeePXtStGhR9u7dq1P/RCIRy5Yto1OnTjRr1oyXL19SsWJF5CYiuswdjmU3J2ybOFCpkRNx4mQevXvBjdcP2PDwONvDzjBn1SJq1qyZreilpKTg4+NDgwYNaNeuHf7+/giCQJMmTbh69SonT56kVatWWomen58fEydO5MSJE7kWPYA6derQt29fJk+enOt9P2XcuHGZ0sllhSAIHD58WF2Tctu2bZw6dUon0WvZsqWG6KlUKubPn6/O5PPtt99qXMc///yTWrVqaZ1CsFu3blnGhdarV48xY8YwfPhwqlWrpmHKhPT55vnz5zNt2jR18ukrV65Qp04datWqxYkTJ9Tb9u7dm/3799O3b1+trB+6IKnSAGmPuYhKVQWpYXr5oU+RGoLEAFGVBukjvf+A6EHhiE8vnuzx4/I3P+eq7JLU3AT3i79iU6twfu9j1q5dy86dO7lw4YJWno6HDx9m06ZNHD9+XKv2k5KSKFGiBE5OTty8eVOvvi5ZsoTly5fzVRNnOvwwEBUCYsnn+yxPlVGvuD3tKjXQeOg+fPiQ9evX88cff1CpUiUUCgUvX75k3LhxjBo1iuLFc1ehJDg4mFatWrFnzx5atNDd8+5z+VFzQ1paGhUqVMDPzw9HR8cst/nrr7+YNm0aqampLFiwAHd3d51c5TNEb968eWrRi4+PZ8CAASQkJLB3715Kl85cTHXQoEG4uLgwfvx4rY6TMUIMDQ3NZD2Qy+U0btwYiUTCwIEDGTVqlMZ6lUpFnTp1mD17Nl27dlUvv3jxIgMGDKBjx478/PPP6rjAkJAQ3N3dGT58ONOmTcu3EAIh/hXKOydQPQ1Ij/ETScDEHHH1lkiqt0Jkol8ZpC+NwhGfHlTq1YLmu2YgNTXK0dlFamaMUbEidLiyolD0PiEqKopZs2axbt06rd37tXVsycDc3JzWrVvz8OFDnjx5omtXgXQX9HL1HWjzbR+QiHIUPQADY0PuJz3j/Ku7yGQytTA1b96cR48eYWNjQ0pKCuPHjycyMpKZM2fmWvRevHhBhw4d+O233/QSPQALCwtWrFjBqFGjSEvTPXzHyMiI4cOHs2bNmkzrbty4QevWrRk1ahSTJk3izp07dOjQIc9E7+7du7i4uFClShX8/PyyFD2ZTMaxY8fo1q2b1scyNjamXbt2HDlyJNM6AwMD/vjjD4KCgrh48WKm9WKxmAULFjB9+nSNUJimTZsSGBiozsOb4RxTrVo1rl27xoEDBxg5cmSm8Jm8QmRVGmnL4RgOXYvhaB8MR23BcNAKpC5d/nOiB4XCpzflOzXEM+wPnKf0wtDKAgMLEyQmhogMpEhMjZCaGWNuZ4vLkpH0CN+BdY1K/3SXvzi8vLwYMWIE1atX13qfhw8fZjuCyI4ePXpgY2PD7t27c9tFNRs2bGCa92w854zAIJeevXJBybWo+zTr3o5Vq1ZRvHhxBEFApVKxatUqgoKCGDJkiE4p6hISEmjfvj3jx4+nT5+8mTvu0qUL9vb2LFmyRK92Ro4cyY4dO3j//j2QHsfYtWtXPD096dmzJyEhIfTp00fnmMasRM/Hx4evv/6aBQsWsHz58mwD28+dO4e9vX2uk7x7enpmmwavatWqDBs2jGPHjiGXZ3aAa9++PcWKFctkwrS0tGTXrl1MnTqV1q1bs3z5clQqFaVKleLChQs8f/6cTp06kZSUlKu+FpKZQlNnHqJSKHl15hZJETHIP6RiWNQMy+p2lHCr9q/OcpCfnDp1irFjx3Lv3r1c1aFr0KABy5Yto1GjRlrvEx8fT5kyZahYsSL379/PVT8FQeCnn35i27ZtLDiyjghFLCpt6rFlwYdX8azuN4Pu3bszadKkXAl+VqSlpdGuXTucnJxYsWJFnt5rGVXvr127lmUwvrb06NEDJycnwsPDOXXqFD/88ANjxozRq/YgZBa9tLQ0Jk6cyPnz5zlw4ECO13b48OHY29vz/fff5+q4SUlJlC5dmsjIyCxDIOLi4ihRogTTp09n7ty5mdZfuXKFvn37EhoamuWLzpMnT+jfvz8WFhZs27aNUqVKIZfLGT16NHfu3OHEiRPY2trmqs+F/E3hiC8PEUsllG3visPoTtT4vif2wztQsmH1QtHLhuTkZMaMGcOaNWty9QAUBCHXpk5ITyfVuHFjdXFPbVEqlYwfP56DBw9y/tJFnivjdBY9AOPiFlwPvs3GjRv1Fj2VSsWQIUOwsrLi119/zfN7rXz58kybNo3Ro0frnFIrKioKhULBvHnzsLOz4/Hjx3z33Xd5LnrPnj1Tpwa7efNmjtdWoVBw5MgRPD09c31sc3NzWrZsme0cs7W1NSVLlmT16tX4+/tnWt+oUSOcnZ1Zt25dlvtXqlSJixcv4ubmRu3atTly5AgGBgZs3LiRLl264ObmxoMHD3Ld70LSKRS+Qv4x5s+fn17tIpvciNkRExODgYEBNjY2uT5m9+7dKVfGgfUrT7Njsz/bN97k2L5gnj5+m+X2GdlY7t+/z/nz50kwTtM9+Pd/iEQiVh//PU+ymkydOpXIyEh27NiR61g5bZkwYQJv375lx44dudovPj6eH3/8EScnJ+zs7KhatSrNmjWjSJEievfpU9E7e/Ys9evXp0ePHuzfv1+rY1y6dImyZcvqlEEHsg5m/5jatWszePBgBgwYQHJy5vSE3t7eLFq0SJ0Y4VOkUilz5szhwIEDeHl5MWrUKJKTk5k5cyZz5syhefPmXLp0Sae+/3+nUPgK+Ue4d+8emzZtYvny5bneV5fRnkqpwv9qJJEhJalefgjvom3489hDzpwI5eCuQBZMP82P449y2S8cuVwJoE4hpVKp8PX1pWjRosSlJSLXM8mvWCqhWMVS1KpV67PJrnNi5cqVHD16lKNHj+o9evocUqmU9evXM3nyZOLi4nLc/sOHDyxYsIAqVaoQGxvL3bt3Wb58OZMmTdIqtCEnQkND1aI3ePBgFixYwMCBA9m9e7c6rlIbDhw4QPfu3XXuR8eOHTl37ly2c241a9bEwsKCunXr8sMPP2Ra7+zsTOvWrfnll18+e5xGjRpx584dkpOTqVu3LgEBAQwaNIjt27fj6empc4jO/2ckc/K67HMhheSASqWiW7duTJo0SSdX+VOnTiGXyz+bV/Fj0tIULP/pHGdPhhIfm4JYLEEk+vudTxBAqRRIfJ/G/cAobl9/hl0VEzp4tMfZ2ZmtW7diaJjuyBKa8JyolJwf/jlRpngpBrXsxuDBg4mJiaFZs2a5GrEdPHiQ6dOnc+7cuSy9FfOaMmXKEBERwenTp+nYsWOW26SlpbF27Vp69OiBsbEx27dvZ8iQIer0bQ4ODnh5edG7d2+dK5GEhobSqlUr5s+fT7du3ejVqxd3797lzJkzucpyolKpGDFiBIsXL9Y5SN/ExITz589TpEiRLM2qsbGxnDt3jnXr1jFp0iScnJz46quvNLapVasWw4YN45tvvsHMzCzbYxkbG9O1a1dsbGzo378/AP369aNt27YMHjwYQRBwc3MrnFbRksIRXyEFzqZNm9QPHl3IzYhPLleyaMafPAp5TVpqziO1tFQFL58lMHXcQTw6dGbNmjUagiRSCDpl6/mU8NAwbt++zaJFi/D396dhw4aEhYVpte+VK1cYNWoUx44d09lMpwve3t6cPHmSy5cvayxXKpX4+Pjg4OCAr68vJ0+eZM+ePZnyh5qbmzNw4MBs57Vy4mPRq1u3Li4uLtjZ2XH+/Plce2Vev34dKyurLHOc5obsgtnh75ydVlZWbNmyhW+++UadyDqDSpUq0adPHxYuXKjV8fr06cPNmzc5evQoX3/9NTY2Nly9epVt27YxceJElEqlXufz/4VC4SukQImJiWHGjBmsX79eZ/f13Aifz7obvIhMQC5Xad2+UilgamKFmejvN+hbt24xbNgwZn8/DXmq7jlaAUQCFDMswuvXr9m1axcREREEBQXh6OhIvXr1mD59Ojt27OD27dt8+PBBY9+HDx/i6enJH7yah4oAACAASURBVH/8QZ06dfTqR24pWrQoy5cvZ9SoUchkMgRB4ODBg9SoUYNNmzbx+++/c/LkSWrXrp1tG2PGjGHz5s0a1Qm04WPRk0qltGrVinnz5rFixQr1aDw3HDhwQCenlk/p0qULvr6+WZ5P5cqViYqKIikpidatW9OtWzfGjh2babsZM2bg4+PDs2fPtDpmhti3bNmSunXrcvPmTS5dusS9e/fo3r17lvOJhWhSGM5QSIHSr18/ypYty+LFi3Vuw87Ojr/++iuT2ehT3r9LxWvYARS5EL2PMTCU4OyWwhaflbx48QJra2tev33D9yd/RWKUdVyYNogEGOHogbXx3w4YycnJ+Pr6MmnSJIoWLUrVqlUJDw8nLCyM4sWL4+DgQPny5Tl06JC6tE2JEiUK3LQlCAIdOnTA1taW4OBg5HI5CxYsoH379lr3pX379vTr1Z0+LhUQoh8jpLxHZGgKlqWQVGuOyELTaSlD9GbPnq02ax48eDDH5OSfO4eKFSty9OjRPEkC3bRpU6ZMmYKHh0emdfXq1WPFihW4ubmp87XOnj2b3r17a2w3ffp0oqOjc13N4saNG/Tr14/mzZuzZMkSJk6cyOPHjzl69GiuEyD8f6JwxFdIgXHmzBmuXr3KrFmzdG4jOTmZmJgY7Ozsctz2/J9hiPUQhrRUGQd33yIsLIwWLVrg7e3Ni8jnuJZxQozu7cY8ek77Zl9z9OhRdYiAqakpnp6ePHr0iObNm3Pnzh3Wrl1LYmIifn5+DBs2DF9fXypUqMClS5dwdHTExsaGhg0bMnToUJYuXcrx48cJDw/PV3PXjRs3SEhIwMfHhwEDBhAQEJCrFGNCQjSretSm45vjKM9vRRV8BuHxDVQhfqhu7EW+dSzyg/NQPU/Pc5khel5eXmzevJlXr17h7++vs+hBehJuAwMDatSooXMbH/M5c+fHtflMTEz4448/mDBhAi9fvtTYbvLkyRw7dizXIQqurq7cuXMHlUqFq6sr48ePp2XLljRs2DBTdYhC/qZwxFdIgZCSkkKNGjVYsWIF7u66J+i+e/cuAwYM0CoOb/ygfbx/lzuT2qdIJPDL5i5YWv6dtikhLYlNoSeQq3IvMFKRhG52Tbhz5ire3t4olUqmT59O9+7dNeYSjx07xvDhwxkzZgyTJ0+ma9eulC9fnvXr1yMSiRAEgTdv3vDw4UMePHig/vngwQNev35NlSpVcHBwwNHRUf3T3t5eZ+/P4OBgZsyYQUBAALNnz+b169dcvHgRX19frUVPFXEHxbGfQakAIYdrJzUivoIbdccsVidqnjRpElOmTNF7lDtt2jRUKhWLFi3Sq50MMoL8o6KiMmWIWbFiBQ8fPtRI2TZ//nwuXbrEqVOnNMz9S5Ys4caNG58Nkfgc+/btY+zYsXh5eWFlZcXcuXM5fPgwrq6uup3Yf5hC4SukQJg5cyYPHz5k3759erWza9cuDh48mGM7sjQFI/vsRqXS7/Y2MpYy75cO2JbWjAsLe/eSfY/9EGmRpzMDA7EEtxLVaWSbPloRBIGTJ0/y008/ERcXx48//ki/fv3UD89Xr14xYMAA7t27h5OTE6dPn0YqzbmK+ocPHwgNDc0kiuHh4dja2mqIYcbP7Dwbnzx5wqxZszhz5gxTp05l9OjRGBsbI5fLqVOnDjNmzMixzBKAKjIQxdFFuar/lixT8tdrCeN2XmX79u15Up5HEAQcHBzYvn079erV07u9DOrVq8eiRYsy9fH8+fPMmDFDwyFIoVDQuHFj+vfvry5eC+nWjKpVq3Lo0CGd+/b8+XMGDBiAIAgMHjyYKVOmsGnTps+WhRLev0b4kABKORiZIbIqg0iquyn/30Ch8BWS7zx48ECdhFdf1/vZs2ery8x8joT4FL4feQi5TD+zn4mpAT/M+5qKlTXnnbZt28a2k3twnzYIFQJCDplcpCIJjW1r0KCEY6YRiyAI+Pn54e3tTXh4OD/88IM6Z+fMmTPx8fEhNTWVNWvW5Bh3lpCWxOP3L0lWpKESVJhKjaloYUtxE0sUCgVPnz7VEMOMn1KpFEdHR7UYlihRglOnTuHr68uECRPw8vLKFBR+9epVevTowf379z8bniAkxSPfNg7kuR99pyhUpDUdRgnXDrneNyvu3btHhw4diIiIyNP50UWLFvH8+XNWr16tsTwuLg47OzsSEhI0RnePHj2iYcOGXLlyRcOzdP369ezbt4+zZ8/q3BelUsnSpUtZtmyZOnZy+vTpGo41gkKGKuwaSv9DkBADkv+9UAkCICCu0RpJLXdERXNfu/LfQKHwFZKvqFQqmjdvTs+ePTXebnWlV69edOrUiX79+n12u9QUOWP670Gp1O/2NjaRMvtnd0qXLape5uvry5AhQzh//jzF7Upz4/UD7sdHkJqSgvSjxNUSkQQQqGRRigYlq1HWLGdng2vXruHt7c2dO3do1KgRt2/f5tq1azx79ow+ffrQrFkzfvvtN42YL0EQeJIYxfWYEF4mxyJChOJ/pkSJSIwIEdZGFriVrIa9ZXkkIs1RqiAIxMTE8ODBA27fvs2uXbsICgrC2NgYhUKBvb29xujQ0dGRKlWqYGxszKhRoxCLxVlWX8hAcWUnqttH00cUulCsAoYDPh/krS1z584lISFBp8QJnyNjbvbFixeZvJXLlSvHhQsXqFRJM0H92rVr2bp1K1euXFGP8uVyOdWqVWPt2rW0bt1arz7dvn2bvn374uTkRFBQEF27dk037z4PQnF8abrIZfcyIpaCSIS4aiMkX49GJMnZ0vBvotC5pZB8Zdu2baSmpjJ69Og8aU/bqgxGxlKkBvqn8FIoVFhZ/z0v5u/vz8CBAzl48CAODg7YGBfBvbwrIyq7c+rXXdQoaoeDZXlqWn9FU9sajK3Wme6VmmklepBesfz48eP88MMPHDt2jPj4eDZu3EjlypUJCAhAqVRSp04dAgIC0vunUnIw4hKHIi7z7MNrlIJKLXqA+vfXqQmcfH6T3x/9Scon5kaRSIS5uTlXrlxh0aJFuLi48PTpUxITE3n9+jWbNm3C3d0dmUzG7t276dWrF5aWllSuXJmnT5/y+++/M336dK5evZops4ugVKAKPKW76AEkRKF6E6H7/h+RV2EMn1K1alVsbGy4fv16pnU1a9ZUO7h8zKhRo7CxscHb21u9zMDAgJ9++okff/xR59yoGWRkebGx+b/27jysqmp94Ph37zMxk+KEI06gaKACaSaZmYo4JaaVQ2lZFpFlDvXzmkOWlCVeE1O7DdfZbjhjKmampmVmlDnPpuhVcECR4Uz79wcX0pjOOfuA6Fmf5+npCc9ee2nH85691nrf1w+z2cymTZuYGfckprUfgDGn9CdwqxksJqzHdmFeMQVFzf+/Skg88QnlJj09nZYtW7Jx48ZSc7tsZbFY8Pb25tKlS3h5eZX5+i/m7GDb5lPg4AlMSYLWD9Tjtf97BIDjx48TGRnJ/Pnzi1SN2bFjB6NHj1bd5Bbyg2t0dDTJycn4+PgQHx/PN998U9i37ttvv2XkyJGMe+tN/HuFcj778m3BrjQaZHwMngwLjMKg0ZGXl8f8+fOJj4+nU6dOTJkyxaYuDCaTiRMnTnD48GGWLVvG5s2badSoEUePHsXd3b3wCbF7s+p0kY6htar44JRk5OBOaLvGOj4G+U9lHTt2JC0tzeEc0tJMmjSJrKwsZsyYcdvPx48fj8FgYNKkSUWuOX/+PK1bt2bdunU88MADQP4qSVhYGBMmTHBakF61ahWfTR3L0qfvx11r5+9dq0dqFI6ux2inzKUyEE98QrkZM2YMgwcPdkrQg/zTc9WqVSsz6J05c4bXX3+die89BziWwweg12uJ7hsM5CfeR0VFMWXKlGJLpf3www92tUgqyfHjx+nduzeff/45bdu2pXnz5ixcuJCff/6Z9PR0AgMD2bNnD+vWreOIdIlTV9NsDnoAFqxcN95kxcntfPnllwQGBpKSksLGjRtZunSpza2HdDodzZo14/HHH2f58uWEh4fz1FNPkZmZya+//srbb79Ny5YtMaf/adeBlmIpVpSMM+rGIP9pr2/fvuUS9OCvtIa/P0uU9MQHULt2bRITE28rZC3LMvHx8UyYMMFpjWf79u3L13Hd7Q96AGYjyslfsF465ZS5VAYi8AnlYuvWrXz//ffF9iJzVFkVW37//XcGDx5MmzZt0Ov17N7zPS1C66Bx4C+7JEtUre5Bk6DqZGVl0aNHDwYNGlRimbWdO3eqDnzp6el0796dSZMmFQmujRo1Yv78+ezbtw+LxcLjT8QQENkSjd7+03cWxcqJK+f4esNqlixZQnJyMqGhoQ7PW5IkPvnkE95//33+/PNP6tSpQ+fOnYmLi6NPdDe0svpDJIoxR/UY5bXMWSAkJASNRkNqamqRnxd0VC9O//79iYiIYNy4cYU/69atGzVr1mThwoVOmZs1/TTamyq6gVjMWH9d55S5VAYi8AlOl5eXx0svvcTs2bNtWpK0VXGBT1EUvvvuO6KioujePb+o9MmTJ5k+fTp16tQhdvTD+Pi6Idvz4SuBu7uOMRM7YzabeeKJJ2jdujUl1XO3Wq3s2rVLVeDLzs6mV69eDBgwgJdeeqnE19WtW5d//vOfLNm2RkUKPWj1OuI+Gk+HDh1UjPKXJk2aMGrUKOLi4m574pH07iCp32uV9PZ3pb/V6dOnOXPmDB07dlQ9l5JIklRsMnvTpk0LS5eVJDExkbVr15KSklI4Vnx8PJMnT7a7vFtxrL+uy8+fdJRixXr0R5S8m2W/9i4gAp/gdO+//z7BwcE2d0+w1a2Bz2w285///IeIiAheeeUVBgwYwKlTpxg3blxhNwAALx8DEz+Iwq+6Jzpd2W93WSPh7W1gwvvd8KvuyfDhw9HpdMydO7fE4++HDx+mSpUq+Pv7O/T7MpvNPPXUUwQFBfHuu+/adM3BnHNIWhUBRYIDV0+rbrF0q7Fjx3LixAlWrVr1123u8wet/bU0byPJSH71VQ2xcuVK+vTpY1MepBr9+vUrEvgKUkVKK7pw33338eWXX/L8888XHhAqaEI7d+5c1fOynk4FxfFlfwA0WpQLR1XPpTIQgU9wqiNHjjB79mw+/vhjp499+PBhAgIC+OSTTwgKCuLjjz9m4sSJHDhwgOeeew6DwVDsdVWreTJ1Zg+iHm+Bh6ceN/eiH36yxorFasTHL5P3Pu5FnXr3MX78eI4cOcLy5ctL/cBUs8ypKApxcXHk5ubyr3/9y6bcMoti5YZJfSFiWZLINDrvG7xer2fevHmMHDmS69evAyA1ClPduBeNDrmV49V+oPyXOQtERERw/fr1IqXHStvnK9C5c2f69etHbOxfh3gKmtUW/Hk6zKj+qREU8cQnCH+nKAovv/wyEyZMoF69ek4d+/Lly+zdu5dnn32WlJQUFi5cyA8//EDv3r1tOqzg7qHniUGtmL2gP8NfbU9Y23o0CapO48BqhIbXYcAzoazbNpZN22fj4+tGYmIiK1euJDk5udQ+aaAu8MXHx7N7926SkpJs7jKQZzEVycVzhIREnpOPqT/88MN069aNt99+O/8eGh1yaNe/EqQd4VMduWajsl9XgvPnz3Po0CGnVH4piyzLxS53lrXPVyA+Pp59+/axbNkyAFq2bEm3bt3KbFZbJicl60tOeN9VBvdWVqJwRy1atIjMzEynJKoXOHXqFAkJCSxevBij0ciePXtsyuMriVYrE9G+ARHtGxT5tS5dHuW7774jISGBhIQEfvjhB5ualO7cuZMxY8bYPZeFCxfy6aefsmvXriJVUUqjkzVYnZCFpKCgk53/ETB9+nRatGjBkCFDCA8PRxMajTV1A+DAsqrWgKbdAFXzWbVqFT169HCofZEjYmJieOONN/jHP/5R+LPQ0FCbyvUVFLLu3r07kZGR1K1blylTphAeHk5sbCw1atRwbFIGT4cq5xSdoHfZr7kL3BvhW7jjLl++zLhx45g/f75T9lFSU1N5+umniYiIwMvLi4ULF9KqVStVQa8sw4cPR5IkJk6cSHJysk1NXi9evEhGRgbBwcF23Wvz5s2MHTuWDRs22F3GTSdr0cnqD4xYFCteOseKVpfGz8+P6dOnM2LECMxmM5K3H9oeb9i/16c1ILd4FE2QutOyFbXMWaBDhw6cO3eOU6f+Ov5f0KXBai17ny0sLIyRI0cybNgwrFYrDRs2ZODAgUybNs3hOcnNI0Gjvv6mVNu2PpiVnQh8glOMGzeOJ598kvDwcIfHUBSFzZs306VLF3r16kV4eDgnT54kPj6ejIwMm5vPOsrf359r167h5uZm8/H+Xbt28eCDD9qVG/bbb78xaNAgkpKSHA7koX6N0aj861vfqwYe2uL3RdUaMmQIvr6+hbUr5UbhaKNHgdYAtiyXaQ3I93dB0+k5VfNIT09n7969dOvWTdU49tBqtfTp0+e25c6qVavi6+vLmTO25SO+9dZbZGVlFf75TZgwgUWLFtl8/d9pQrs7dN1fA2iRQ7ohOSF4VgYi8Amqbd++nZSUlDILR5fEbDazbNky2rRpw+uvv87gwYM5efIko0ePLlwCPHToULkGvrNnz9KrVy969eoF5NfMtIW9ietnzpyhZ8+efPLJJ0RGRjo0V4DwakGOFqQB8p8a29Ww7ynVHpIkMXfuXKZOncq5c+cAkBs/gG7gB0hBHfKfPv7+BChrQaNHqt0cbc8xaB8ZpnpPac2aNXTr1s3hdkyOUrPPB/nBc+HChbzzzjscPnyYmjVrEhsbW2JKTVkk72pIdZrb9qWj+BHQhEY5eG3lIwKfoEpeXh4jRoxg1qxZdu1TQX77nNmzZ9O0aVPmzZvHu+++yx9//MGzzz5bZD+mrOR1Na5evUpUVBQjR44kISGB3NxcFi9ebNO1O3futDkX7sqVK3Tv3p2xY8eW2WWhLPcZvKjnWcPhhrgeGgMNvMq38n5QUBBxcXGMHDmy8GeSXz103V9D9+LnyB0GIwVFIjVohdS0HXJYb3TPzET35LvIDds4ZQ4VvcxZoHPnzhw8eJALFy4U/syWk523atq0KVOnTmXw4MGYTCbGjBnD+vXrOXjwoENz0j72EjiSD6k1ILcbgORz73R0F7U6hTJdu5JN5rVcTCYLHp56atT0KiwA/e6777J7927Wrl1rc5uX9PR0EhMTmTt3LpGRkYwdO5Z27dqVek1gYCCrV6+2ey+tLLm5uXTt2pWwsDASEhKQJIkHH3yQgwcPkpGRUaSx6K1ycnKoVq0a6enpeHh42HSfiIiIIrUcHZVtzuXzIxu4acotsy3SrfSylqGBUfi52fdFxRG5ubmEhoby4YcfOj2vsyzXrl2jfv36pKWl4e1d8YcyBg8eTPv27QvTE5YvX87XX39tV6NZRVHo0aMHERERTJkyhY8++ohdu3aV2PG9LNaLJzAnTQZTzv9aEJWhYMm541CntnG600TgE4plNltJ/fks61ce4NyZq4WBTrEqSJLEI1FNaRrsRrfuHdm7dy8NGhQ9Jfl3J06cICEhgWXLltG/f39Gjx5NYGBgmdfl5eXh6+vL9evXnXoyz2KxMGDAAHQ6HUuXLi3cp1uyZAmvvPIKy5cvJyqq5OWd7du3M3bsWHbv3l3qfaxWK08++SQajea2+zhDpvEmS459S5Y5B0sZCcoSEgaNlqcbd6aWR1WnzaEsW7duZejQoRw4cMCplXzKsmjRIpKSklizZk2F3fNWq1atYs6cOYW99Q4dOkTv3r05duyYXeNcuHCB1q1bs2bNGkJCQggMDCQpKcnhzurKtQuYv5mJcvlsfjWX4t43OjeQZTQPDbqnljgLiMAnFHH04CVmxW/FbLaSm1P8EXStVsZkMlKlppEZn7yAtpR6mL/88gsffvghW7ZsYcSIEbz66qvUqlXL5vkcPHiQvn37cuTIEbt/LyVRFIVXX32VgwcPsmHDhtuS3wue5Lp3705SUlKJY8THx5Oenl5mjtWoUaNITU1l06ZNJSbZq5FrNrLz4n5+u3wcAOPfqrHoJA0KEFylAZG17sdHX3peYnl45plnqFGjBh999FGF3fPxxx8nJiaGZ555psLueavs7Gz8/f05efJkYWsgX19fLl68aPcXgKSkJMaPH09qaipLly5l2bJlbNmyRdVTmDXjT6ypyViP7ART3l+5ftUD0Eb0RWr8wD3Xh6+ACHzCbX775Rxzpm/HaGPncr1eQ0ATP96c8tht/e8URSElJYXp06dz7NgxRo0axfDhwx1aclq5ciULFixw6jf3+Ph4li9fzvbt228rcVZg6NChfPXVV1y5cqXEgxE9e/Zk2LBhpe4hJSQk8MUXX7Bjxw6qVKnitPkXx2y1cCTzLH9cOUW2ORdFUXDTGmjmW4+WVRtiuIMn8gpaVG3atIlWrVqV+/2ysrKoXbs2Z86cKfc/99L069ev8H0CEB4eTmJiYplL+8UZMmQIPj4+zJo1ixYtWpCYmEiXLl2cMk/FYgarJb8F0T20pFkScbhFKHTq+GXmfGh70AMwGi2cPn6ZeTN/APL7tC1ZsoRWrVoxduxYhg4dyokTJxg1apTD+yzOPtiyYMEC5s+fz4YNG4oNegBxcXFIksTatWuL/XVbClN/9dVXzJw5kw0bNlTIh69W1tCiSgBPNe7Ec0Hdeb5ZNIOadCaseuAdDXoA1atXZ9q0aYwYMQKLxfb3l6O++eYb2rdvf0eDHhSt3WnPyc6/mz17NsnJyXz77bdMnTrVKc1qC0gaLZLO4BJBD0TgE26x6NOfMebZ/6FkNFr4/Zc0pk1NpEmTJnz22Wd88MEH/P777wwZMqTUAyK2cGbg27hxI+PGjSszcTwsLAw/Pz8SExNLnFOVKlVKXLLdtm0br776KuvXr3d6+ba71bBhwzAYDMybN6/c77VixQrVJ2edoUePHmzbtq2w1qa9JztvVVDIevjw4XTq1AlFUew6KCP8RQQ+AYD/pl3nz9NXHb4+N9fIgV9vkJSUxNatW4mKinLat0dnBb49e/YwZMgQVq1aVWbiuCRJxMXF8dNPP3Ht2rUiv15a/t6BAwcYMGAAy5YtIyQkRPW87xWyLDNv3jwmT57M+fPny+0+OTk5bNy4kT59+pTbPWzl6+tLZGQk33zzDaDuiQ/g0UcfpX///sTFxTFt2jSnNqt1JSLwCQCkJB/CanG8bYksa3DX1ie4uXM/6BVF4fDhwwQFBaka59bO5u3bt7fpmoISZosWLSryayXl76WlpREdHU1CQkKFFEW+2wQHB/Piiy8yatSocrvHpk2bCAsLo3r1ypF3FhMTU/hkFhISwh9//KFqiXLatGns37+fjIwM/P39WbBggbOm6jJE4BMASN1zDotF3X6BVqfh6MFLTppRvgsXLuDu7k7Vqo4fv7948SJRUVFMmTLFrlwyPz8/wsPDmTNnDtev5XDiaDoHfr/AiaMZ7P4ptcgTX2ZmJtHR0cTGxjJo0CCH53uvmzBhAnv37mXDhg3lMv6dSlovSZ8+fUhJSSEnJwc/Pz+8vb05ffq0w+O5u7uzePFiRo0axeuvv87kyZPJyVHfod6VaCY7WgNHuKesXr4Ps0ldo0qNRiY4pBb1GzovR2zPnj0cOHCg8FScvbKysujatSv9+vWzu4OCoigopqqcO+bJT1uv8tOO0/y88ww7t56guk84WZlaqlT1oFoNT0wmE3369CEsLIz33nvPZQ4JOEKn09GsWTNiY2N54YUXVO8B38poNDJixAhmz559R5LWi+Ph4cHmzZupVq0azZo1Y8uWLdStW1fV8r2/vz9Go5GvvvqKgIAALl26ZPNKhiCe+IT/ccYHteSkcW6lZn/PZDLxxBNP0Lp1a7trHKZfzOLN2DXs2ZaHf/UWmM1WcrJN5GSbyM0xo5F1/JF6npnvbeX/4tby3NBYvL29mTVrlgh6NujatSvt2rXjnXfeceq4W7ZsoXnz5nZ3vChvt9buVLvPV+DNN98kOzub5s2bM336dDIzM1WP6SruzexEwW6eXnqybxpVjSHJEt4+zk3QdjTwKYrC8OHD0el0zJ07165gdCEtk3fGbSQ3x4TVqpRcKFmBvFwzF9KugbUtsz5+HI1GfbsgV5GQkEBISAiDBw+mZcuWThmzsi1zFujbty8TJ07EaDQSGhpaamEEWxUUsn7wwQd56KGHmDHjIyY/3w/L3rUoGWfz++9p9Ug+NZDb9ERu8sA9011BLfHEJwDQvmNDtDp1bwerRSGohXMLHzvalWH8+PEcOXKE5cuX29UfMOt6HvH/SCEn24jVauuep4xW40bCO9u4maXuy4MrqVWrFlOnTmXEiBE29akri9lsZs2aNcTExDhhds5Vp04dgoKC2Lp1q9Oe+ACaNGnCu1OnEqrN4AVtKqa101HO/A43r4AxG7Kvofz3KJbNn2Ca9xzmH5ejWMs/j7KyE4FPAKBTVKCaLjdoNBKRnRthMDh3EcGRJ77ExERWrlxJcnIynp72ledKST7EzZtGm+r33kpRICvLyJYNziur5gpeeOEFFEXhs88+Uz3W9u3badCgAQEBAeonVg4KktkDAwNJS0sjKytL9ZiKYuW5RhZGt61BTW8Dkjmv+BeacsGYjfWXNZhXvINiKuF1LkIEPgGAKlU9aB5SC0l2LPzJGpkuPZ3bHf3GjRtcvnyZ+vXr23xNUlIS8fHxbNy4kWrVqtl1P7PZyub1Rxw+5GMyWkhZpy4txNUU5PZNmDCBixcvqhqrsi5zFoiJiWH16tVIkkTz5s3Zv3+/6jEt33+JcmQnblob/96ajSgXjmBe94FLP/mJwCcUeubFtri7278HYDBo6dqrGbVqO7fNzdGjR2natKnN+2bbt28nNjaW5ORkGjZsaPf9Un8+q3rJzWSy8PveNFVjuJqQkBCGDRvGG2+84fAYVquVVatWVerA16hRI2rXrs3OnTsJDQ1VGoeluAAACspJREFUvdxpPXcA6/4tUNJTXkksJpS0w1j++FbV/e9mIvAJharX9OLNdx7D3UOHrWdB9AYNbTs0oP/g1k6fz+HDh8ussFJg//799O/fn6VLl9K6tWNz2ffr+RK7UdgqN8fMvtTyq0pyr5o4cSK7du1i8+bNDl3/448/4ufnZ1ObqzupIJk9JCTE4dJlBSx7VoHZwT1lcx7WX1Y7rdbn3UYEPuE2AY39mDIjmvoNq6LXa5BLWPo0uGkxuGl5/MlQnot7sFyO8Nu6v3f27Fmio6OZOXMmjz32mMP3u56Z6/C1t41zzTnjuBJPT0/mzJlDbGysQ8nYlX2Zs0BBWoPaAy5K1hWUs/vBjgbEReRcRzl/2PHr72Ii8AlF1PT34Z2EHkyc3p2HHmmETpcfALVaGSTwr+vDMyMeIHFBf3rEtCi3vDVbAt/Vq1eJiopi5MiRDBw4UNX9Sgry9tKU0ptQKFl0dDStWrVi2rRpdl2nKAorV668KwJfcHAwnp6eWCwWVaXLrEd3qZ+MKQ+riy53ijw+oUT1AqowfGR7nn/1QYxGC2aTBXd3HbKmYj7Yywp8ubm59OnTh65duzJ69GjV96vq54EkYfeJzltJUv44gmNmzZpFaGgoAwcOtHmZe+/evRgMBqflApYnSZKIiYlhy5YthaXLHNmPVm5kgMWkcjYKyo10lWPcncRXU6FMkiRhMGjx9DJUWNCzWCwcP368xD0bi8XCoEGDqF27NjNmzHDKU2e7hwPQ69V9F9TpNbTtEKB6Lq6qdu3aTJo0iZdeesnmp6GCZc67pWJOv379WLFiBffff7/j+3zOSkdwdI/wLicCn1ApnT59mpo1a+LhUfTpSVEUXnvtNa5evcqCBQuQZee8jZsEVcfnPjdVY/hV96RhEz+nzMdVvfzyy2RnZ/Pvf/+7zNcW9KS7G5Y5C7Rp0waj0Uid2v4c3bcX5dp/UbIuo9gThDyKb6BsN7fKUc+0oomlTqHSsCpWbphyyLOY+P34AVqE3l/s695//3127NjB9u3bMRicVyJNkiR6xLRg6Re/ONSQ12DQ0KNv5V9uq+w0Gg2ffvopUVFR9OzZs9T2Qvv378dkMtGmTZsKnKFKuTf4+NnOtPfMxEObiWnxaFCsYLUiNQpHE94HqVbTUp9gZf9ArDq3/MR0R2kNSPVc8/0qKa56nlWoNLJMOfyacYy9GUcxWy3IkoTRaESRoKGvP+1qtiDAqyaSJLFgwQImTZrErl27yqUQsdls5f0JKZw6cdmuRHatTqZJUHXGTXkMTQUtB9/r3njjDa5cuVL45KcoCjdvGMnKykOSJLy8DUz/8D2ysrKYMWPGnZ2sDRSrBcv3X2DdvwWLVUGjFJM6I0mg1YOXH7rebyFVrVPiWKZPX4AcFYWpNTp0L36G5Obl+Bh3KRH4hDvGoljZdHYP+6+eKvzv4uhkLe4aPf4XtLw86Hm+//57mw8+OCIn20j8hM1cOJeJ0Vj2k59er6FO/ft4a2oX3BwoACAULysri+DgYL74/N/opfqsX7mfjEs3C0/Nms1Wrmedp3f/UAY+0xmtrvIWCFcsZsyrp+WnD9iUcC6B3g1tv8nItZoU+wrzzyuw/pQEFgf26SQZKbA9uujyawhcmYnAJ9wRFquF5Se3cv7mZcyKDcuKChhz84iQGhDd7tFyn5/RaGHRp7v5cdtpJJlilz71Bg2KAg890ojBL0Sgq8QfvHerf37wH37ZeQMPDw/ycosvLuDmpkWSJV587SHatK1XwTMsm6IomDf8E+XEz/YfJjF4oBv0EZJv0eLvSu4NTP8eCTk3sDufT2dAN3A6UtW69l13jxCBT6hwiqKw+vQPHL9+3ragdwu9rGVoYDf83Jy0uV+Gm1l5bP/2OCnrDnP1SjYgwf9SFrr1bk6HTo3x9NJXyFxczYolqWxce8jm/Va9XsPTz4XzaFTlqt5ivXAUc9Jk+0uLQf6TWeMIdL3GFT92xp+YvxoPxlxsDn5aPdpe45ADnF9t6W4hAp9Q4dJuZrDs+BZMdga9Ag29/XmqcScnz6psiqJgMlnR6eS75uj83eq7jUdZ9qX9h4z0eg2xYyJp/UDlefIzrfsQ5cRuxxNENTp0w+cjlXCSU7mShunrifkHXUo77KI1gCyj7fN/yHVbODaXe4TYhRcq3O5Lh+x+0rvVn1kXuWHMduKMbCNJEnq9RgS9cpabY2KZgydrjUYLnyf+WGk6ZCg511FO7VVXFQGp1ILSUtU66J6fh6bzCPCrnx/g9O75/9a55f/jXQ05cjC64Z+6fNADkc4gVLBscy7Hr6epqTAIwK8Zx+hYO9QpcxIql13bTqr6cmEyWdj363laRdz5/Svrn/tA1qirsmIxYj2yA9qWnKsoaXVomj+MpvnDWDPOoFw+l9+IVueG5FMDyT9QfGG7hQh8QoX6M+sSGkku8QSnLSyKlUOZf4rAdw9SFIVvVh0kL8/xLhm5OWbWr9xfKQIfOTfAGX3vcm/a/FK5WgOo1kD9Pe9hYqlTqFA55jysTthWznPkCLdQ6V29nM21q/Z3Z/i7Y4fTsVSS5U6h8hGBT6hgzlpuEcs296KsG3n5XUBU0mhlcm6qLeLsBO7e+Uudarl5qh9DKCQCn1ChPLQGZCfsNbhpRKL4PcsZ58wryVl1ud796pc6NXrkwIecMyEBEIFPqGANvGqq2t8D0EgaWlQJcM6EhErFy9uA2QlLlBaLFXfPO//lSPLwRQpog7oVCgVNSFcnzUgAEfiECuam1dPMtz6Syg+C1n7Fl3ES7m5V/DyoUtVd9TiBwTUqTc1UTXjv/PqbjpAkpIBWJebwCY6pHO8MwaU8UKMZGsmxt56ERENvfzx16j8chcpHkiSi+7bA4Ob4gXODm7ZSdcmQ/IOQGoY5Fvx07mgfHur0Obk6EfiEClfLoyotqgSgk+zf9NdrtHSpE1YOsxIqi/YdG9rchLY4BoOW+1v7O3FG6kiShLb7SCT/wPykctuuAp0b2n4Tke6rVa7zc0Ui8Al3RFS9CAK8a9kV/PSylqcbd+Y+g+u1UXElBjcdQ4ZHoDc48MVIr2H4yPbIlWSZs4Ck0aGNmYgc3BE0OtCU9PSXH/DwrYnu6Q+QazWt0Hm6ClGrU7hjFEVh64Xf2Jt+FEkCUzGn3yQktJKMr8GLmIBI/Nx87sBMhTthzX/2kbxiv11Fqoe8EMHDXSp3sFCyM7HsS8Gauj6/tqasyS9pZrUgNWyNJqwPUu1motJKORKBT7jjci1G/rh8it3ph7hpykGWZJT/nUcP9K1L2xrN8ffwu8OzFO6EHVtOsPizn0GB3JLaErlr0WhkRrzegdDw4hu3VkaKYs2v7JKblb//5+6DpLN1KVRQQwQ+odJQFAWT1UyuxYRWlnHT6JEdPAQj3DtMJgt7dp1h/YoDXEjLvK0RbcPGfvSIaUGriLqV5hSnUPmJwCcIwl0jJ9vIzSwjkiTh5a3H4Hbnc/WEu48IfIIgCIJLEWsDgiAIgksRgU8QBEFwKSLwCYIgCC5FBD5BEATBpYjAJwiCILgUEfgEQRAElyICnyAIguBSROATBEEQXIoIfIIgCIJLEYFPEARBcCki8AmCIAguRQQ+QRAEwaWIwCcIgiC4FBH4BEEQBJciAp8gCILgUkTgEwRBEFyKCHyCIAiCSxGBTxAEQXApIvAJgiAILuX/AfZpQDWUqUx4AAAAAElFTkSuQmCC\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "graph = nx.from_scipy_sparse_matrix(adjacency)\n", | |
| "\n", | |
| "cmap = plt.cm.get_cmap('Spectral')\n", | |
| "colors = cmap(np.arange(labels.max()))\n", | |
| "nx.draw(graph, node_color=[cmap(i) for i in labels/labels.max()])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Better example\n", | |
| "Larger graphs give more exaggerated differences between the biggest cluster and the long tail of smaller clusters that occurs with single straight cuts. \n", | |
| "\n", | |
| "Using the wikivitals graph here." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "data = skn.data.load_wikilinks_dataset('wikivitals')\n", | |
| "adjacency = data.adjacency\n", | |
| "paris = skn.hierarchy.Paris(engine='python')\n", | |
| "dendrogram = paris.fit_transform(adjacency)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "#adjacency = skn.data.miserables()\n", | |
| "#paris = skn.hierarchy.Paris(engine='python')\n", | |
| "#dendrogram = paris.fit_transform(adjacency)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### First, a straight cut:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Using max cluster size of 10\n", | |
| "Cluster ID 0 has 1234 items\n", | |
| "Cluster ID 1 has 1003 items\n", | |
| "Cluster ID 2 has 912 items\n", | |
| "Cluster ID 3 has 687 items\n", | |
| "Cluster ID 4 has 659 items\n", | |
| "Cluster ID 5 has 590 items\n", | |
| "Cluster ID 6 has 586 items\n", | |
| "Cluster ID 7 has 582 items\n", | |
| "Cluster ID 8 has 542 items\n", | |
| "Cluster ID 9 has 503 items\n", | |
| "Cluster ID 10 has 360 items\n", | |
| "Cluster ID 11 has 334 items\n", | |
| "Cluster ID 12 has 313 items\n", | |
| "Cluster ID 13 has 309 items\n", | |
| "Cluster ID 14 has 287 items\n", | |
| "Cluster ID 15 has 286 items\n", | |
| "Cluster ID 16 has 252 items\n", | |
| "Cluster ID 17 has 224 items\n", | |
| "Cluster ID 18 has 219 items\n", | |
| "Cluster ID 19 has 130 items\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<BarContainer object of 20 artists>" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "labels = skn.hierarchy.straight_cut(dendrogram, n_clusters=20)\n", | |
| "ids, counts = np.unique(labels, return_counts=True)\n", | |
| "print(f'Using max cluster size of {maxClusterSize}')\n", | |
| "for j,k in zip(ids, counts):\n", | |
| " print(f'Cluster ID {j} has {k} items')\n", | |
| " \n", | |
| "plt.bar(np.arange(counts.size), counts)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "#Dont try and draw the wikivitals graph its too big.\n", | |
| "\n", | |
| "#graph = nx.from_scipy_sparse_matrix(adjacency)\n", | |
| "#cmap = plt.cm.get_cmap('Spectral')\n", | |
| "#colors = cmap(np.arange(labels.max()))\n", | |
| "#nx.draw(graph, node_color=[cmap(i) for i in labels/labels.max()])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Next, a balanced cut:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Using max cluster size of 10\n", | |
| "Cluster ID 0 has 912 items\n", | |
| "Cluster ID 1 has 586 items\n", | |
| "Cluster ID 2 has 586 items\n", | |
| "Cluster ID 3 has 812 items\n", | |
| "Cluster ID 4 has 219 items\n", | |
| "Cluster ID 5 has 599 items\n", | |
| "Cluster ID 6 has 582 items\n", | |
| "Cluster ID 7 has 590 items\n", | |
| "Cluster ID 8 has 542 items\n", | |
| "Cluster ID 9 has 584 items\n", | |
| "Cluster ID 10 has 417 items\n", | |
| "Cluster ID 11 has 687 items\n", | |
| "Cluster ID 12 has 659 items\n", | |
| "Cluster ID 13 has 709 items\n", | |
| "Cluster ID 14 has 294 items\n", | |
| "Cluster ID 15 has 44 items\n", | |
| "Cluster ID 16 has 649 items\n", | |
| "Cluster ID 17 has 541 items\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<matplotlib.lines.Line2D at 0x7fccc9041a10>" | |
| ] | |
| }, | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "maxClustSize=1000\n", | |
| "labels = balancedCut(dendrogram, maxClusterSize=maxClustSize)\n", | |
| "ids, counts = np.unique(labels, return_counts=True)\n", | |
| "print(f'Using max cluster size of {maxClusterSize}')\n", | |
| "for j,k in zip(ids, counts):\n", | |
| " print(f'Cluster ID {j} has {k} items')\n", | |
| " \n", | |
| "plt.bar(np.arange(counts.size), counts)\n", | |
| "plt.axhline(maxClustSize, linestyle='--', c='k')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "#Dont try and draw the wikivitals graph its too big.\n", | |
| "\n", | |
| "#graph = nx.from_scipy_sparse_matrix(adjacency)\n", | |
| "#cmap = plt.cm.get_cmap('Spectral')\n", | |
| "#colors = cmap(np.arange(labels.max()))\n", | |
| "#nx.draw(graph, node_color=[cmap(i) for i in labels/labels.max()])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "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.7.6" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 4 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment