Skip to content

Instantly share code, notes, and snippets.

@thesps
Created June 4, 2020 02:03
Show Gist options
  • Save thesps/c7e59cf5597804693b8663ddc9496b64 to your computer and use it in GitHub Desktop.
Save thesps/c7e59cf5597804693b8663ddc9496b64 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/sioni/miniconda3/envs/kt-avx/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
"/home/sioni/miniconda3/envs/kt-avx/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
"/home/sioni/miniconda3/envs/kt-avx/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
"/home/sioni/miniconda3/envs/kt-avx/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
"/home/sioni/miniconda3/envs/kt-avx/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
"/home/sioni/miniconda3/envs/kt-avx/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
"Intel(R) Data Analytics Acceleration Library (Intel(R) DAAL) solvers for sklearn enabled: https://intelpython.github.io/daal4py/sklearn.html\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"import hls4ml\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.datasets import fetch_openml\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import LabelEncoder, StandardScaler\n",
"import json\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"data = fetch_openml('hls4ml_lhc_jets_hlf')\n",
"X, y = data['data'], data['target']\n",
"le = LabelEncoder()\n",
"y = le.fit_transform(y)\n",
"y = tf.keras.utils.to_categorical(y, 5)\n",
"X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"scaler = StandardScaler().fit(X_train_val)\n",
"X_train_val = scaler.transform(X_train_val)\n",
"X_test = scaler.transform(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Processing fc1 in Keras model...\n",
"Processing relu1 in Keras model...\n",
"Processing fc2 in Keras model...\n",
"Processing relu2 in Keras model...\n",
"Processing fc3 in Keras model...\n",
"Processing relu3 in Keras model...\n",
"Processing output in Keras model...\n",
"Processing softmax in Keras model...\n",
"Done taking outputs for Keras model.\n"
]
}
],
"source": [
"model = tf.keras.models.load_model('TEST_model.h5')\n",
"trace = hls4ml.model.profiling.get_ymodel_keras(model, X_test)\n",
"X = trace['output'].numpy() # the input to the hls4ml models\n",
"y = trace['softmax'].numpy()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"sft = tf.keras.models.Sequential()\n",
"sft.add(tf.keras.layers.Input((5,)))\n",
"sft.add(tf.keras.layers.Activation(activation='softmax', name='softmax'))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Interpreting Sequential\n",
"Topology:\n",
"Layer name: softmax, layer type: Activation\n",
"{'LayerName': {'softmax': {'Precision': 'ap_fixed<16,6>', 'ReuseFactor': 1, 'table_size': 1024, 'table_t': 'ap_fixed<18,8>', 'exp_table_t': 'ap_fixed<18,8>', 'inv_table_t': 'ap_fixed<18,8>'}}}\n",
"Interpreting Sequential\n",
"Input shape: [5]\n",
"Topology:\n",
"Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n",
"Creating HLS model\n",
"Writing HLS project\n",
"Done\n"
]
}
],
"source": [
"cfg = hls4ml.utils.config_from_keras_model(sft, granularity='name')\n",
"cfg['LayerName']['softmax']['exp_table_t'] = 'ap_fixed<18,8>'\n",
"cfg['LayerName']['softmax']['inv_table_t'] = 'ap_fixed<18,8>'\n",
"print(cfg)\n",
"hls_model = hls4ml.converters.convert_from_keras_model(sft, output_dir='softmax_new', hls_config=cfg)\n",
"hls_model.compile()\n",
"y_new = hls_model.predict(X)\n",
"hls_model.build()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Now copy over the Softmax header file from master branch and repeat..."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Interpreting Sequential\n",
"Topology:\n",
"Layer name: softmax, layer type: Activation\n",
"{'LayerName': {'softmax': {'Precision': 'ap_fixed<16,6>', 'ReuseFactor': 1, 'table_size': 1024, 'table_t': 'ap_fixed<18,8>', 'exp_table_t': 'ap_fixed<18,8>', 'inv_table_t': 'ap_fixed<18,8>'}}}\n",
"Interpreting Sequential\n",
"Input shape: [5]\n",
"Topology:\n",
"Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n",
"Creating HLS model\n",
"Writing HLS project\n",
"Done\n"
]
}
],
"source": [
"cfg = hls4ml.utils.config_from_keras_model(sft, granularity='name')\n",
"cfg['LayerName']['softmax']['exp_table_t'] = 'ap_fixed<18,8>'\n",
"cfg['LayerName']['softmax']['inv_table_t'] = 'ap_fixed<18,8>'\n",
"print(cfg)\n",
"hls_model = hls4ml.converters.convert_from_keras_model(sft, output_dir='softmax_old', hls_config=cfg)\n",
"hls_model.compile()\n",
"y_old = hls_model.predict(X)\n",
"hls_model.build()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n/wGPYCdHhSf2swAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEHCAYAAABV4gY/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAcC0lEQVR4nO3de5BV5Znv8e9vQECNQUDNURqmGzWK\nl4kMrcFTFWMuCJ4jGg0z02hlvEAo5sSYc0uFVBIHz+ioJzlJxpKEYhIUMwa8ZCaCIpJxgnpOJd5R\nUUdB0NiQCoiGmERR8Dl/rNW42OzdvXfva6/+faq66P3utd717NX0s99+1rvfpYjAzMzy5U+aHYCZ\nmdWek7uZWQ45uZuZ5ZCTu5lZDjm5m5nl0NBmBwBw2GGHRXt7e7PDMDMbUB5//PHXIuLwYs81NblL\nmgHMOOaYY3jssceaGYqZ2YAj6ZVSzzW1LBMRKyNi7siRI5sZhplZ7rjmbmaWQ01N7pJmSFq8c+fO\nZoZhZpY7Ta25R8RKYGVnZ+fnmxmHmbWGd999l+7ubt5+++1mh9JSRowYQVtbGwcccEDZ+7TEbBkz\nM4Du7m4OOeQQ2tvbkdTscFpCRLBjxw66u7vp6Ogoez+XZcysZbz99tuMGTPGiT1DEmPGjKn4rxnP\nljGzluLEvr/+nBPPljEzy6GW+RCTWatZsKD499Y4tT7v5fQ3ZMgQTj75ZHbv3s3EiRNZunQpBx10\n0D7tHR0d/OhHP+LQQw/db//LLruMu+++myOOOIL169fvbX/qqaeYN28ev//972lvb+fWW2/lgx/8\nIC+//DITJ07kuOOOA2DKlCksWrSo6tfqsoyZWcaBBx7IunXrWL9+PcOGDdubaLPto0ePZuHChUX3\nv+SSS1i9evV+7XPmzOG6667jmWee4fzzz+eb3/zm3ueOPvpo1q1bx7p162qS2MFlGbOS2tsX7P2y\nweljH/sYGzdu3K/99NNPZ8uWLUX3OeOMMxg9evR+7S+88AJnnHEGAFOnTuUnP/lJbYMt4ORuZlbE\n7t27uffeezn55JP3ad+zZw/3338/5557bkX9nXTSSaxYsQKAO+64g1dffXXvc5s3b2bSpEl8/OMf\n56GHHqo+eJzczcz28dZbb3HKKafQ2dnJ+PHjmT179j7tY8aM4fXXX2fq1KkV9btkyRIWLlzI5MmT\n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\nInYDlwP3Ac8Dt0fEs5Uc3CN3M7P6KGvkHhGzSrSvAlb19+D1HLnXa7TtT5aa2UDQ1IXDPHI3M6uP\npiZ3STMkLd65c2czwzAzyx2P3M3McsjruZuZ5ZDLMmZmOeSyjJlZDrksY2aWQ07uZmY51NTb7LXa\n8gP+gJKZ5YVr7mZmOeSyjJlZDjm5m5nl0KCouRfW0r1sr5nlnWvuZmY55LKMmVkOObmbmeWQk7uZ\nWQ45uZuZ5ZCTu5lZDg2KqZC98ZIDZpZHngppZpZDLsuYmeWQk7uZWQ45uZuZ5ZCTu5lZDjm5m5nl\nkJO7mVkOObmbmeWQk7uZWQ4pIpodA5K2A69U2c1hwGs1CKfWHFdlHFdlHFdl8hbXn0bE4cWeaInk\nXguSHouIzmbHUchxVcZxVcZxVWYwxeWyjJlZDjm5m5nlUJ6S++JmB1CC46qM46qM46rMoIkrNzV3\nMzN7X55G7mZmlnJyNzPLoZZP7pJGS/qZpA3pv6NKbLda0m8l3V3Q3iHp4XT/2yQNS9uHp483ps+3\n1ymui9NtNki6OG07RNK6zNdrkr6bPneJpO2Z5+Y0Kq60fa2kFzLHPyJtb+b5OkjSPZL+XdKzkq7L\nbF/x+ZI0PX2NGyXNL/J8ydcq6atp+wuSppXbZzn6G5ekqZIel/RM+u8nM/sU/Xk2MLZ2SW9ljr8o\ns8/kNOaNkm6QpAbFdFHB7997kk5Jn2vU+TpD0hOSdkuaWfBcqd/Nys5XRLT0F/C/gfnp9/OB60ts\n9ylgBnB3QfvtQFf6/SLgb9Lv/wuwKP2+C7it1nEBo4FN6b+j0u9HFdnuceCM9PtLgBvreb56iwtY\nC3QW2adp5ws4CPhEus0w4CHg7P6cL2AI8BIwIe3rKeCEcl4rcEK6/XCgI+1nSDl91jmuScBR6fcn\nAVsy+xT9eTYwtnZgfYl+HwFOBwTc2/MzrXdMBducDGxqwvlqB/4MuAWYWebvZkXnq+VH7sB5wNL0\n+6XAZ4ptFBH3A29m29J3tk8CdxbZP9vvncCnKhw5lBPXNOBnEfF6RLwB/AyYXhDjscARJAmrFmoS\nVx/9NvR8RcQfI+LnABHxDvAE0FbBsbNOAzZGxKa0r+VpbKVizb7W84DlEbErIjYDG9P+yumzbnFF\nxJMRsTVtfxYYIWl4hcevS2ylOpR0JPDBiPhFJJnrFkr8btc5plnAsgqOW5PYIuLliHgaeK9g36K/\n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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"h_new, b = np.histogram((y - y_new).flatten(), bins=np.linspace(-0.1,0.1,100))\n",
"h_old, b = np.histogram((y - y_old).flatten(), bins=b)\n",
"plt.bar(b[:-1], h_new, width=b[1]-b[0], color='b', alpha=0.5, label='PR 195')\n",
"plt.bar(b[:-1], h_old, width=b[1]-b[0], color='y', alpha=0.5, label='v0.2.0')\n",
"plt.legend()\n",
"plt.xlabel('y_keras - y_hls4ml')\n",
"plt.savefig('residual.png')\n",
"# And again but log\n",
"plt.figure()\n",
"h_new, b = np.histogram((y - y_new).flatten(), bins=np.linspace(-0.1,0.1,100))\n",
"h_old, b = np.histogram((y - y_old).flatten(), bins=b)\n",
"plt.bar(b[:-1], h_new, width=b[1]-b[0], color='b', alpha=0.5, label='PR 195')\n",
"plt.bar(b[:-1], h_old, width=b[1]-b[0], color='y', alpha=0.5, label='v0.2.0')\n",
"plt.legend()\n",
"plt.semilogy()\n",
"plt.xlabel('y_keras - y_hls4ml')\n",
"plt.savefig('residual_log.png')"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEMCAYAAADal/HVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3zN1//A8de5IztCFokkQmLGCGKT\nUqu0RovSparo0qpqf53fVnWo6lQt2upEq7SqNtWGUrWDGBFEIoNE9rrJHef3xwdVIyKynefj4dHc\nc+/n3Pcn9L7v53POeR8hpURRFEVRrkZX2QEoiqIoVZtKFIqiKEqxVKJQFEVRiqUShaIoilIslSgU\nRVGUYqlEoSiKohRLJQpFURSlWCpRKIqiKMUyVHYA1yKEcAY+A4qACCnlwkoOSVEU5aZSKVcUQoiv\nhBApQoioS9pvE0JECyGOCSFeONd8F7BUSjkeGFzhwSqKotzkKuvW0zfAbRc3CCH0wKfAAKAFcI8Q\nogXgB5w69zJrBcaoKIqiUEm3nqSUm4UQgZc0dwSOSSlPAAghfgSGAAloySKSYhKbEGICMAHA0dGx\nvb+/f6lis9ls6HQ319CNOuebgzrnmi078wyOZgdsDjrsXV1L1cfRo0fPSim9Lm2vSmMU9fn3ygG0\nBNEJmAXMFkLcDqy42sFSys+BzwHCwsLkrl27ShVEREQEPXv2LNWx1ZU655uDOuea63TeaaKn3kl3\np2gOt19Iy8EDStWPECLuSu1VKVGIK7RJKWUe8FBFB6MoilJdxGXHsdR+AJGprzIgsF6Z91+VrskS\ngIvvF/kBSZUUi6IoSrVx6OwhGscexO9UBIY6dcu8/6qUKHYCjYUQDYUQdsAo4Lfr6UAIMUgI8XlW\nVla5BKgoilIV7UuNpJZxL62zVuDgUrvM+6+UW09CiB+AnoCnECIBeE1KOV8IMRFYB+iBr6SUB6+n\nXynlCmBFWFjY+EufM5vNJCQkYDKZiu3Dzc2Nw4cPX8/bVmsODg4IcaW7foqiVBf93VvTr8ECdrrc\nhZuh7L//V9asp3uu0r4aWF0e75mQkICrqyuBgYHFfjDm5OTgWsoZA9WNlJK0tDScnZ0rOxRFUUpJ\nSsn0w18TlTaHQps9E/Vlnyiq0q2nG1bcrSeTyYSHh4f69nwRIQQeHh7o9frKDkVRlFLalLAJk6WA\nFkf/JDBhFwaVKIonpVwhpZzg5uZ2xedVkric+p0oSvX267Ff6Zqdic4ocDGbsVOJQlEURTnPJm1E\nxm/mrTNFuDaxUeBQG7tyGKNQiaICubi4XPh59erVNG7cmPj4+EqMSFGU6uyvxL9Iw8zbponsLhjO\nITffcnmfqrTg7qaxceNGnnzySdavX09AQECJjrFYLBgM6q9LUZR/7TqtVaBok7kDj6PRxDk7AaPL\n/H1q1BVFdVhH8ddffzF+/HhWrVpFUFAQAKmpqQwbNowOHTrQoUMHtm7dCsDUqVOZMGEC/fr1Y/To\n0Zw8eZIePXrQrl072rVrx99//w1AcnIy4eHhhIaG0rJlS/76669KOz9FUSpOUk4iz6alc5vzduoU\nHaN+XnK5vE+N+opa3DqKi72+4iCHkrKv+JzVai3VLKAWvrV4bVBIsa8pLCxkyJAhRERE0KxZswvt\nkyZNYvLkyXTv3p34+Hj69+9/YS3H7t272bJlC46OjuTn57NhwwYcHByIiYnhnnvuYdeuXSxatIj+\n/fvz8ssvY7Vayc/Pv+74FUWpXrKLstHnpnBHhpFdutuIbjGY0IPvlst71ahEUdUZjUa6du3K/Pnz\n+fjjjy+0//777xw6dOjC4+zsbHJycgAYPHgwjo6OgLZocOLEiURGRqLX6zl69CgAHTp0YOzYsZjN\nZoYOHUpoaGgFnpWiKJVhTewa1qTvw7fofox5tyJzDyM8rjzj80bdlImiuG/+5bngTqfT8dNPP9Gn\nTx/efvttXnrpJUArhbxt27YLCeFiFy+G+/DDD6lbty779u3DZrPh4OAAQHh4OJs3b2bVqlU88MAD\nPPfcc4weXfb3KRVFqTq+j/oOnZQEGbdhPZGFf8peROugcnkvNUZRwZycnFi5ciULFy5k/vz5APTr\n14/Zs2dfeE1kZOQVj83KysLHxwedTsf333+P1art4xQXF4e3tzfjx4/n4YcfZs+ePeV/IoqiVJpT\nOad47MQeZp9JZYfpPvJrN8cmDFi9PMvl/WrUFUVJxygqm7u7O2vXriU8PBxPT09mzZrFE088QevW\nrbFYLISHhzN37tzLjnv88ccZNmwYS5YsoVevXheuNiIiIpg5cyZGoxEXFxe+++67ij4lRVEq0Ee7\nPyLN1YUeJ+4kz+TH6doW2hScIdtXTY+t9nJzcy/87O/vT2xs7IXHixcvvuz1U6dO/c/jxo0bs3//\n/guPp0+fDsCDDz7Igw8+WMbRKopSVf11KgJpdKRxbh+KMCPzj6ADii6aJFOWVKJQFEWpRtJXPUNY\nbhYtTYWkeGdR+9ARBu5fhN7dHVlOBT5r1BiFoihKjWYpolbkIiak6NHbbsPztDuuvqEIBwd0tWqV\n29uqKwpFUZTq4tgGnq3tQt2jU8lJ8cQLSZc7myPXmtCrRFEyQohBwKDg4ODKDkVRFKXs5JyGvz/h\nyOFl7HO1o27tWGqle+Am0ghe9ydZgGOrVuX29jXq1tO1yowriqJUS7u+hm2fstGqx1pYn05nOuFj\n1XFngzNkLVsGgEvPW8rt7WtUolAURalxck7D3x9zuCAcy7H3aHxsPIVCYulQh8bPPoXe3R2EwKlr\n13ILQSWKCqTX6y8U7hsxYsSFmkwXtw8aNIjMzMwrHj927Fi8vb1p2bLlf9r37dtHly5daNWqFYMG\nDSI7W6tjdfLkSRwdHQkNDSU0NJRHH320fE9QUZSyk58O3wyCWe3AXEBUGz8iff9gi0c0W+rY+N+w\nJlhSU7FmZGDfvDm6ctypUiWKCuTo6EhkZCRRUVHY2dldWFR3cbu7uzuffvrpFY8fM2YMa9euvax9\n3LhxvPPOOxw4cIA777yTmTNnXnguKCiIyMhIIiMjr7iIT1GUKur4RmTsZmKy2xLv/xw7DjZhj+8G\ndGZXpoQZiO/blzNvvQ1S4vfB++UaikoUlaRHjx4cO3bssvYuXbqQmJh4xWPCw8Nxd3e/rD06Oprw\n8HAA+vbty88//1y2wSqKUnEy4uDMIVg+kYSiVqzPmsKCXZ1xzwzCK78+XYKb0L1zM+yCgshZtw63\nYXdhFxhYriHVqFlP12PkvG2Xtd3R2oehLT0oKLIy5usdlz0/vL0fI8L8Sc8r4rEFu//z3OJHupT4\nvS0WC2vWrOG22277T7vVamXjxo08/PDDJe4LoGXLlvz2228MGTKEJUuWcOrUqQvPxcbG0rZtW2rV\nqsWbb75Jjx49rqtvRVEq0Kkd8PUAEHqkQx1iar2MNUOy0D0BszGH2jY9n47oi0w9gykqCoTAY8KE\ncg+rRiWKqj49tqCg4EIJ8B49elxICOfbT548Sfv27enbt+919fvVV1/x1FNPMW3aNAYPHoydnR0A\nPj4+xMfH4+Hhwe7duxk6dCgHDx6kVjnOt1YUpZQKc+H31zFZ7PkzfwqZ1o6kHzdj56hH1tuAvVM0\n7y+tRUby/8hetx5ZVITXlGewL+EumTeiRiWK6ykKeLUrgJycHBzt9MVeIbg7213XFcR558cirtae\nlZXFHXfcwaeffspTTz1V4n6bNWvG+vXrATh69CirVq0CwN7eHnt7ewDat29PUFAQR48eJSws7Lpj\nVxSlnBRkwoqnIGYjmHMpcGpLfEZbLLlmXAKcWeGeic7+MFgdaNAlnKwlv4DZjPu4cXiOr5j6p2qM\nogpxc3Nj1qxZvPfee5jN5hIfl5KSAmj7Wrz55psXZjelpqZeKEV+4sQJYmJiaNSoUdkHrihK6W3/\nHA4tx1QoKGj9COss72Ixg2c3b97OT2df6m7c84oY2KAzhRsjwGzG84nHqfvslAoLUSWKKqZt27a0\nadOGH3/88bLn7rnnHrp06UJ0dDR+fn4X9rP44YcfaNKkCc2aNcPX15eHHnoIgM2bN9O6dWvatGnD\n8OHDmTt37hUHwxVFqWA2GyTuhqifYfMM0i1+fJ/5Dd/+MYC0hFxa9/Kj5+AgLDYzjx/8kbe+tTLm\n81gsZ85Q97XX8HryyQoNt0bdeqrqLi4zXlz7ihUrrvi6H3744YrtkyZNYtKkSZe1Dxs2jGHDhl1n\nlIqilLtVz8Ceb0BK8G6BqfVMzIuKkDZJy5716XRXEC/8cgCd6042trXiny7wPBSDz/Tp1L5zaIWH\nqxKFoihKRZASivJg5dNwYAk2qSPS611E4778vTAWJHS4PZAlphyen7aKRnGHaNo9kgmLbDQ8Ax4T\nHq6UJAEqUSiKolSMhSMgNgKsZrB342zP79n2nRWiYtHpBf0ntCSwlScvf7SZ/vvWMeLYJsx7bdiZ\nwXXM/XhPnlxpoasxCkVRlPK24ws4tgGsZmyNB2KbEsPB494gITjMmwdndEP6OnL3vG3EpORyMKg9\nhwLgxTE6IkY2IeCFlys1fHVFoSiKUh4Kc2DFZMhJhrgtYHQio+eXrFxTBzl1FznphTRo6U6fh1rw\n/oajrFqxjbti/iQ/bBBv7P6O9fVtmIw6uj4xtbLPpGYliqq+4E5RlJuEzQYb34SopYCEW56H7s8g\nz1rJSd+BtEm8G7gy4LHW6PU6jHpB3byz9EjaT781UZypa8eXt+lxMboQ6hVa2WdTsxLF9Sy4UxRF\nKXNpx2HjG3ByC+Sngs4ORnxDkqEbhqRClr2/F2mTNOvqQ/h9TVm+Lwm7zDQ+3RjPtJRIHC2F6Bxd\n+fWpUEjdSu+A3gghKvus1BhFZfv2229p3LgxjRs35ttvv73ia5577jmaNWtG69atufPOO69ahnzt\n2rU0bdqU4OBg3nnnnfIMW1GUS5kL4JdH4NAyLUk07g8vniLFqQfL3t/DzzP3YCmyEdo3gN6jm7No\nezy/z5iD75Oj+WHdG7Q9sQe9pyeOv3zFxtStADzc6vrqvpUXlSgqUXp6Oq+//jrbt29nx44dvP76\n62RkZFz2ur59+xIVFcX+/ftp0qQJ06dPv+w1VquVJ554gjVr1nDo0CF++OEHDh06VBGnoSg3L5sN\ntn0Gq5+DTztD4k6wd4P7l8F9P4HRgbOJOegNAqdaRu6Y2JqudwVxNsfErI1H2ecZhE2nw6UgB+fw\ncII3RbA2/W8AWnm2oqFbw0o+QU2NuvVUlT3//PM0aNCAxx9/HICpU6diNBrp27fvhdXSffv2Ze3a\ntdxzzz3/ObZfv34Xfu7cuTNLly69rP8dO3YQHBx8oUTHqFGjWL58OS1atCivU1IUZf9PsOF/YLNA\nnYYwbD6E3EVulpmNH+0lL6uQjOR86vg4MWRSW47nFjDphfkEHNpBWvNBPB+/FWezidqjRuEz9TUA\nDqVrX/Be6/JaZZ7Zf9y0VxQj521jyS6tHLfZamPkvG0s25sAQEGRlZHztrFiXxIA2SYzI+dtY21U\nMgDpeUWMnLeN3w+dASAlx3TN9xs1ahSLFy++8Pinn37CarXi7+9/oc3Pz++qe1Gc99VXXzFgwIDL\n2hMTE6+7L0VRSuHMIfiiN7zfHH59REsSnR6HiTuh1XDQ6chKzScxOuNCkhj2XHuca9uTnGXCPuYw\nHU/t54N/5tErYS++H314IUl8svcTtiVto4tPF5q6N63kE/2XuqKoIG3btiUlJYWkpCRSU1OpU6cO\njo6OFBYW/ud1xQ1cvfXWWxgMBu67777LnpNSXtZWFQbBFKXGsNkgOxEWDIMc7Uskvu1gxLdQRyv1\nnZuhfWlc9dl+pISGoZ7cNqEl+0+k4JhxllkbExmaFoeXKYu6dpIGP/6AQ1MtIaQVpPHL0V/It+Qz\nvnXVmo9z0yaKi8uEG/W6C4+vVGa8loPxP48vLTPu7epQovccPnw4S5cu5fTp04waNQpPT08iIiIu\nPJ+QkEDPnj2veOy3337LypUr2bhx4xUTgJ+f3382LEpISMDX17dEcSmKUgybVVtVnXESMuO0Kwif\nULjzc/D+91v/6RNZ/PrBHgz2eswmK616+hE+qgnzNh3HNu0VWqbFMs1iwslSiF2jhgQsWIjRvc6F\n4+fum8tZ01k61e1Eh3odKuFEr+6mTRSVYdSoUYwfP56zZ8+yadMm7O3teemlly4MYK9fv/6KA9Vr\n165lxowZbNq0CScnpyv23aFDB2JiYoiNjaV+/fr8+OOPLFq0qFzPR1FqNLMJ8tNgyRhI2AFCD61H\nQviz4BF02csNdjoM9nqKCix0GtyIsIGBJGbkM39LLD4BHel0+iCOVjO1R42k3muv/ecLX05RDsti\nlgEwuUPlleq4GpUoKlBISAg5OTnUr18fHx8fAP73v//RoYP27eHVV1+9MLA9btw4Hn30UcLCwpg4\ncSKFhYUXdr7r3Lkzc+fOJSkpiXHjxrF69WoMBgOzZ8+mf//+WK1Wxo4dS0hISOWcqKJUd4dXwdIx\nYC3SHrv5w7AvIaDzf14mpeTItmSETvDn90cwGHUMntSWZHvJ/17+gtxjJzgb2JWnj/+Jo7Ti8+67\n1B486LK3e2/nexTaCmng2oAQj6r3/61KFBXswIED/3k8duxYxo4de9nrvvzyyws/Hzt27Ip9+fr6\nsnr16guPBw4cyMCBA8soUkW5ydhsUJgFcdvgp9EgLaC3hwEzIOyhKx6SlpjHH98fAQlCQJ+xLfBr\nWofvVh/GfdcWeqUeo0/Cbpo6SvzXrMa+QYMr9rMteRsAT7d7utxO70aoRKEoimKzwacdIS8VTJng\n6A4dJ0D4/4Fef9XDkmIyQQICWo1pSrKdld2bDrFgUwxjdTrq5adjcIAG3y3BeJUxw+yibDILM3Gz\nc+PWBreW0wneGJUoFEW5OdlsELcVUo9AxHRtPMLoBAPfh3YPgMH+iodZzTY2/RiNzWoj+p8z6PSC\nwU+FMmb1fu5e8Rn1c1JYUJiFY1EBhrp1Cfz5Z4yeHlcN44v9X1BgKeDRdo+iE1VzxUKNShTXKgoo\npVRTRi9xpWm1ilLjSQm/jNO2IgVAQMNbtHEIF+9iD7WYrcQdSCM/uwibi55bJ4QwccMhYs7ksscr\nmE7JBzFKK25DhuAz/W2E7uof/lGpUXx78FsMOgPDmlTd3ShrVKIoriigg4MDaWlpeHh4qGRxjpSS\ntLQ0rFZrZYeiKOXPZtPqMBXmwNF1EL0aEND8Dhj4HrjWK/bwIpMFvVHHtmXHyc8pwj3IlXcLMljx\n4c+4FWQT1KApjyX/jVFa8X13Bm6DB18zpI/2fIREMrLxSNzs3croRMtejUoUxfHz8yMhIYHU1NRi\nX2cymXBwKNm6iJrAwcGBvLy8yg5DUcqPlNqfTe/A5pkgbWBfC9o+AH1eB+er3xY6r8hk4ZeZuyky\nWclIK8DT24mgIYGYFqRx76F1tMxLxuWQDZ1OR71ZH1ProrI7V/NXwl9sP70dg87AhNAJZXGm5eam\nSRRGo5GGDa9dYCsiIoK2bdtWQERVR1xcXGWHoCjlwi/+V3hvnLZXtTkf0EGnR7X9IZzcS9yP3igo\nzLcQm5XPEjczLevZs/2rHXi52NGgexjOP3+Pwd8f/3nzsG907c+ZQmshk/6cBMDwxsNxdyh5LJXh\nmolCCNFSShlVEcEoiqLcsIyT2rTWv2cRdOLrc406aDUCbv8AHGqVuKvcDBM2m42Vs/eTm1FIrqOO\nPCSWnduZazlOy7Dm5Cz4HmE04jd3TomSBMBvx37DbDNjr7dnYtuJ13+OFawkVxRzhRB2wDfAIinl\nlTdDUBRFqWx7FsJvj4MwgLRQaOeBQ5fx2mpqvfG6upJSsuqz/SSm5LFKZyLYXs86oxk3JyMvt7DH\n5df95Oz8E2E0EvjTYhyCLl+tfTWrYlcBMK3rtCo9NnHeNROFlLK7EKIxMBbYJYTYAXwtpdxQ7tEp\niqJcS/QaiFkHMRshK15ra9wPer/CP4dTr1o/7VqkTeLq4cCelAzi7GwclzbuaOjIe+NuIefzGM6m\npSEcHWm0/FfsAgJK3O+cyDnEZMTQ1rstAxpeXgm6KirRGIWUMkYI8QqwC5gFtBXa1KGXpJS/lGeA\niqIol7HZtKXQO+fD2ue1Qn0AXs1hyKfg1157fDjiurtOTshhzrLDFCTkEpgFentJgJcTHxOF/aKf\nyHMcx9lPZmMMCKDB999hrFu3xH2fyTvDV1FfYbKamBI2pdrMwCzJGEVr4CHgdmADMEhKuUcI4Qts\nA1SiUBSl4kT9AqumgGtdSDmstfl1gsGf/Keaa2lt+jkG1yM5JBqt2NnpGHBfc+4OC8B83I+EzRtI\neecdnDp1wn/uHHSOjtfV9we7P8BkNXGr/6208Wpzw7FWlJJcUcwGvkC7eig43yilTDp3laEoilK+\nzsZATjL88Tac0uoi4eAGt78PLUeA443d5z+bW8j8LbHkmSzEHU+lnTTgaW/kmceC0O38B1rXJeml\nlyk6GoPe3R3/OZ9dd5LYfWY3q2NXY6ezY1q3aTcUb0UrSaIYCBRIKa0AQggd4CClzJdSfl+u0SmK\nouxdAMsnohVVApw8octE6DYJiln1fD027k3kyOp4EvRWhhbZI+oYeeft7qS8M4PMpUtJee89bDk5\n2DVqROCSn9Bdpdz/1VhtVh7b8BgAY1qOqRYD2BcrSaL4HegD5J577ASsB7qWV1CKotzk1r4ICTu1\nTYOS9mhtdRrBbW9D07IZAN6fkElCej4eLvas3HCS9kV6AnQCh1pGHpjaGSEErnfcTvrChWCxUGvw\nIHxnzCjVuMK2pG0UWAuw19nzcMuHyyT+ilSSROEgpTyfJJBS5gohri+dKoqiFKcwVyurkRkPu76E\nLG3/eryaQ48p0OZe8LxyDbfSkFLyzE/7OJ6ai5TQxeCIEUHHEG+6BZwi6aEx1Ht9KolPTwYp8X52\nCh7jxpX6/dbFrQPg+Y7P42Ssfh+fJUkUeUKIdlLKPQBCiPZAwTWOURRFKZmcZFgwAs6c36tFgHcL\n6PoUtBmlzW4qA1JKfo1MJNDdmSlL9nEiNY/uJgPB9V3xOmHC1cOBfuNaYtpyFltuLnGjHwSLhcBF\nC3FsU/qB53Un17E9eTsBLgEMbzK8TM6lopUkUTwNLBFCnNtNHB9gZPmFpChKjVeQCUsfBqGDExFg\nKwKDI4TcBbdNv+HB6Ss5nprLM4v3nR/poKm7E+EpeswnTNqmQ0O9MNrryUlKpvDoUYTRSMNffsa+\nceNSv2eRtYgPd39Icl4yb3R9o9pMh71USRbc7RRCNAOaAgI4IqU0l3tkiqLULPnpkBGnjT1sfg/y\nzmjtbR+AkKEQ3KfM37LIKtl0NJUmdV349M/jSMCgg6mDW3JXi3p894o2g6pX8Cmyx0+B228n6+ef\nwWAg4LtvbyhJAHy4+0MScxNp4NqAwcHXriZbVZW0KGAHIPDc69sKIZBSflduUSmKUrPknYU5XSE3\nhQuzl+q2guHzwevG1z5czcLDhWzasAMHg8AmBWO7BTKhSyCpURmsmBWJtchGSA9fGg8I5dTONWT9\n/DPCwYHApUtxCC55SY4rWXFsBQsOL0Ag+KzPZ1V2U6KSKMmCu++BICASOL9xgQRUolAU5eqOroff\np4JvG4haBpYC0BnP7f8wE5y9yuVtd51Mx8lOz6Id8WxK0D6y/N2dmftAe4K8XNj3xym2LolBSvAX\n8YSPuoXciAhMkfsQDg40WvEbdv7+NxSDyWLilb+1ZWaPtHmEgFolL/FRFZXkiiIMaCEraSs0IUQj\n4GXATUpZPUeCFOVmYLPByb/AsbZWWuPAEq20d/pxCLkTfNtBh3FltvbhSrJNZu77cjsWqw2rBL2A\n1waH8EDnBhfGBxp38Gbv+jhqZZ+k8R8zSHn3NBkLF2IXFITfrI9vOEkALD26FJu04eXgxeNtHr/h\n/ipbSRJFFFAPSL7ezoUQXwF3AClSypYXtd8GfAzogS+llO9crQ8p5QngYSHE0ut9f0VRKsD5jYF+\nfw3+nvVvu84AjfvDkNnX3F70RpitNiKiUwlv4snciOMUWmwI4M7Q+txSJ52hXQIBSD2Vg72TgZ9n\n7MaUZ6bv0wPR+50iY9EijP7+BC5aiN7txgfRzTYzmxI2IRB83PvjajuAfbGSJApP4NC5qrGF5xul\nlCUZmfkGrQTIhdtUQgg98CnQF0gAdgohfkNLGtMvOX6slDKlBO+jKEplWDAc8s9Cbipkn1v74N4I\nOj0GYQ9dd2nv0vhu20neWHmY2k4GMvMt3NnWl5dvb46niwMREREA2GyS9V8eJC+zEF3mGZp28MUt\n5TCnFiwAJD7TXi+TJJFvzmf4iuEk5CQwrMkwWnm2uuE+q4KSJIqppe1cSrlZCBF4SXNH4Ni5KwWE\nED8CQ6SU09GuPhRFqaqS9mpF+bISIGY9FJ1bi9uoF3R/WpveWoKtRW/U4eRsiiw2Vh9IZv6WEwCY\nLTa+GB1G3xaXV3PV6QR+zeoQFXGKztFf4pYsOPXpKQDqf/ghzh06lElcu07v4mzBWez19kxqO6lM\n+qwKREmGHoQQDYDGUsrfz63K1kspc0r0BlqiWHn+1pMQYjhwm5Ry3LnHDwCdpJRX3OZJCOEBvIV2\nBfLluYRypddNACYA1K1bt/2PP/5YkvAuk5ubi4uLS6mOra7UOd8cSnvOeksBVr097mm7aH7kIwyW\nPARgE0YyarcktuF95Na6sWmk18MmJc9EFJBdKLGhjUP0CTAwoqkdBt1/b/Pk5uZilM5Iq+T4Wm3Z\nRkjIcTznzUYUFZE5YTxF7dqVSVwF1gKmJk0l35bPkNpD6ONW9tN9r+VG/1336tVrt5Qy7NL2ksx6\nGo/2AeyONvupPjAX6F3KWK50w+6q2UpKmQY8eq1OpZSfA58DhIWFydJuVhIREVHqjU6qK3XON4dS\nnfPhVbB0DHgEQ8ohrc2jCfR4Bl2bUXgIQflfP4DFamPF/iT6NK/Lt3+fJNccgw0Y2LIe79/dBke7\nK3+UrVr8J8cjJI7OeuqkR9HpxRE4/bqJzKIi3O68kxbPPFMm8WUVZjHk1yHk2/Lp7NOZN/pWzuK6\n8vp3XZJbT0+g3S7aDhc2MdQZP5oAACAASURBVLqRkakE4OJpBX5A0lVeqyhKRbIUQsQMbd/pU9sg\n+9z/mrmp0P9treaSU50KD2vj4TNMXrwPB4MOk8VG1yAP3hjSkiDv4r89O3pAw1AvzMsXEXxiObW2\n2Di7+CdcevXC5603yyy+T/d+SpopDReDC5/1+axGDGBfrCSJolBKWXT+xIUQBoq5AiiBnUBjIURD\nIBEYBdx7A/1dIIQYBAwKDi674mGKUuMV5kL6CbB3hRWTIHbTv895t4D2D0H7MWCwq9Cwjqfmciot\nn6QsE2+uPAiAvUHHV2M60DXYs9hjpZRImyQ7QZJ84Cz1wgfj2tzM2c/m4Ny1C36fzEKU0TTdrMIs\nlhxdAsAnvT/BqCv/AfyKVpJEsUkI8RLgKIToCzwOrChJ50KIH4CegKcQIgF4TUo5XwgxEViHNtPp\nKynlwVJFfwkp5QpgRVhY2Piy6E9Rarz8DPi8p1aYz1oICHDxgTYjtf0enNwrLbTJP0ZyMDkbq00i\ngBHt/Zh+VysM+mt/wB+ISOTw30mYDxxFV7sh3VpL0p5ZhbCzw3fmTIShpEUpincy6ySLoxdjkRbG\nhIwhrN5lt/drhJL8tl4AHgYOAI8Aq4EvS9K5lPKeq7SvPtePoigVbf8SWPN/YF8LMk9qbUZn6Pw4\ndBwPbvUrJSyrTfLjzngGtqzHyv3JxKblYbVJ2jeow+x72+LjVvId5Vzq2JN3JouO+z7F1rE3ac/9\nDkIQsOB7DB5lN6oyddtU9pzZQ2uv1jzd7uky67eqKUlRQBvaVqhflH84iqKUudwU2D6POplOsPI3\n2DVfay9IB7cAaPcAdJ0ERvtKDTPyVAYvL4vijRWHMFlsdAisw0sDm9M24PrHRHIzTBQU6TnS7mFC\n9n4NVis+06fj1Lp1mcW7LGYZu8/s1rY27ToNvU5fZn1XNVdNFEKIn6SUdwshDnCFMQkpZdn9xsuI\nGqNQlHPSjoPNov1380xI2kMb0GotebeAJgOgx2RtXKISnUrPZ09cBkVWG68uj7rQ/smoUO5o43vd\ng8LbfzuByM/i8Mp96NwaEJC1FYqK8Hj8MWrfObRMYrZJG3Mi5zBv/zwAPr71Y4Jq31gBwaquuCuK\n86tFqs0iODVGodzUrBbQG+DEJlhwF0ib9gfArhYnfAfTaNir4Hr5grTK8s7aI6w5kIzt3FfRkR38\neWtoyxKNQ1zKZrWRFJOJdddftD60GNvIR3HaGIX72LF4P/VUmcW8PnY9c/fPBWBK2BS61+9eZn1X\nVVdNFFLK87WddECylNIEIIRwBKrOvzRFUeDXxyFuKzh7Q8IOrc3gAA3DoeeLUL8d8RERNKrkJJFj\nMvP55hPc0dqHbcfT+OfYWWwSGnk68/kD7QmuW/orHJ1eR7Mu9fgrKoBGnXrj9P07mNq1w/u5Z8ss\nfpPFxLR/pgHQN6AvD7Z4sMz6rspKMpi9BOh60WPrubayWfOuKMr1S42G3d+A0QkiF2qzlgD09hD+\nPAT1hAZdi+uhUqTnFfFZxHHmRBzHcm6g+p2ejejTrO4NrT04uuM0jsd2sGmrC261dDiuW4pwcCD7\n/vvKZE2D1Wbl3Z3vkmfJI8ecQ9+Avrzf8/0at17iakqSKAxSyqLzD86tqajYCdUlpMYolBotOwns\nXLSy3Usf1v4LgIB6raHHs9BicJntMV1Wft2byPbYNKSEpbsTsNokTnZ6Ph7emoGtfG74wzb7bAG/\nf32QBrGbcHMNpGHSuRlOX3zB6bzcMjmH6PRofon5BZPVxIgmI/hf5//dNEkCSpYoUoUQg6WUvwEI\nIYYAZ8s3rNJRYxRKjXXsD23cwdUHcs6tlnby0LYRDf8/sHeu3PguYbNJdOfqLq3cn8Tvh7Ui0PYG\nHRPCGzGlbxP0pRiHuJJano4EtvYkM60RtYpScEs7iseECTh1CINz1WNLyyZtHM88zkPrHsJkNTEk\naAivdH7lpkoSULJE8SiwUAgxG61O0ylgdLlGpSg3Oylh6UOQHqvdVso9t7+0nQvcNgOaD6q09Q7X\ncjw1l0e+282QUB92xWWy6Wgq9nrBvZ0a8PyAZjgYy24aaWFWLubsAk4eSMPo6kfo1tk4deyI9zOT\nb7hvs83MkxufZHvydizSQv/A/kzrNq1ab2laWiVZR3Ec6CyEcEGrNluiqrGKolynk1sheR806Q+r\n/w+O/661Cx3UawOdH4PWI8t1h7jSklKSkW+mjpORTdEpxKbl8f6GGGo7Gni2XxNGdw2klkPZlrYw\n5ZlZ+OIWAo6tRBcwAP+4Dbh0747/nM/KpP9jmcfYlrwNm7QxvPFwXu3y6k13JXFeceso7pdSLhBC\nPHNJOwBSyg/KOTZFqflSo8Gziban9Nr/g/w0WPciCD24+UPYWOj6lDbttQp7ctFeIk9lkl9kIT3f\nDMAtTTz5eGRbajuXz5CmtEnqB7uSk+SDW85Jmrgk4j/nJ4TxxhKS2Wom3ZTO5D8nY5M27mt+Hy90\nfKGMoq6eivvX53Tuv5W7Iuc6qMFspVrZ/D78MU3bBc6qfbji0VjbV7oK31o6L/p0DsHeLqTlFXIm\nx0RCZgEAXRp58P7I1vi6OV2jh9KzFRXh6GqHc31PdDmJNIteRN1vvr7hJAHw7KZn2X56O3nmPB5p\n9QhPtH2iDCKu3opLFOeXGh6SUi6piGBulBrMVqq0nDPw20RthlLqETiy8twTOmgxFG59BTwrbgOg\nG7E7LoNhc/4mxNeVYyl5FFpstG9Qh2lDQgjxvfEtRYtjy8sjYty7eLWoT1R8AKG58Th37IBzp443\n3PfxjONsS95GgaWAqV2mMqzJsDKIuPorLlEMFEK8AryItm5CUZTrlRGnDURbCmHDa5C0W9tC1MEN\nmt0BofdBs4GVHWWJZOQVEZuWh7Odnik/RQJwMCmHPs28efH25gR5VcyOgXm5Vo66deNUbAbowcGa\ni9+cn26oT5PFxB/xf/Da369hspp4pPUjKklcpLhEsRZtGqyzECL7onYBSCllrXKNTFGqKym1tQxZ\nifBFLyjI+LeUhrMX9H8LQoZV+XGHSz22cDd74zMptGjn0sjLmel3tqJTo4rY404jbTZc69aiw9DG\n/PNrLA3i1tDojRfQO93Yba4X/3qR3+O1yQN3N7mbJ0LV7aaLFfcv9RUp5XNCiOVSyiEVFpGiVGdR\nP8PGN8E3FA7/phXmE3po1Eu7teRXffYrsNokv+5NpH9IXaKSsknOMlFoseHqYODNoS0ZElqxYyi5\nmzaRPO8bGs5+n70rY9BbLDQNMOE24LZS9yml5J/kf9gYvxGAcS3HMan9pGscdfMpLlFsA9oB2cW8\nRlFublYLxKwD7+aw82vY8w0UZmtrH9qOhroh2u5w1ezqAeBgUhZTluxj6goDOSYL3q72vDSwGWO6\nNsTOUPFTdC15Jra4DCXq470UWgx46lIJml36yZeLjyxm5YmVRKdHA1qBvzEhY8oo2pqluH+9dkKI\nB4GuQoi7Ln1SSvlL+YVVOmrWk1Jhzt9eivoFll08d0JA4/4wfH6ll/Aujb3xGRxPzaNeLXumLNkP\nQK7JwrP9mjC2e0Oc7Cov4bn06UPTM7vIWfA1Lr5dueP9QehKOcspISeBufvmctZ0lmbuzZgZPpNA\nt8CyDbgGKe5v/VHgPqA2MOiS5yRQ5RKFmvWklDspYfH9YM4HSxHEbdHanetqu8N1fgzsK2ZQtzzM\n/vMYm4+mYrZqdb/bBtTmi9FheLpU3qZGWcuXIxwcce3TG9fPX8AtIwWPAX1w9r7+DY3O5J1hfdx6\nPtj9ARabhe6+3Zl16yyM+pq3z3VZKq7M+BZgixBil5RyfgXGpChVS1aCtmo6sDuseBKOafezcQvQ\nEkPzIdCgS+XGWEppuYV88scxxnYL5PfDKeyJy8Bslfi6OfDG0Jb0bl65ZcmllGT+/Au5RneKVu/i\npGc4+YE+DHvs+odNbTYb966+l5R8re7Uwy0fZlK7STftauvrUdzK7P+TUr4rpZwvhBhx8VoKIcTb\nUsqXKiZERakENqtWOkMIWPP8RWse0Ka29npFWxhXBctpXI/8Iis/7Ijnlz2JZJvMdAisw6O3BHFr\nM+8q8QEqhCBg/pesm/knJ09YsPoYqdvIDQfnkl8B2KQNKSUvbnmRlPwUdOiY3Xs2Pfx6lGPkNUtx\nt55GAe+e+/nStRS3ASpRKDVTUiT8cI9Wsvt4BJw9orW7+WuVWttX75qYP+08RfTpbFr71+adNUco\ntNgotNiYeGswU/o2qRIJAiB79Wpcbr0VodfTYNVbZPgOI909hN5jQkrch1maefz3x7HT27E5YTOe\njp4sHLAQX1ffcoy85ikuUYir/Hylx4pSfdlscOx3sHPWai398aZWynv7XPBtC+0fgq5Pgkf13RdZ\nyn+3vY88lcnS3aco2noSgFB/N965qzXNfKrO0qjCY8dInPIsXs9MxpyURFahPenuIXg1cKVOvZKX\nVI8xxRCZHkmeJY/2ddvzYc8PqeNw/WMbN7viEoW8ys9Xeqwo1Y+lCAx22hjEkge11dPSqj3n5gd3\nfQ4BXavcRkDXKy4tj8mLIxnoYyF5RzwbDiVTZJW08HFl5vA2hNQv35IbpWEfHEyD774lL/YUf/5u\nxtp5IlgEXYdfe0ZjkbWI2XtnE58Tz8YUbTzpgeYP8EzYMxh01W+aclVQ3G+tzbkV2QJwvGh1tgAc\nyj2yUlDTY5WSCjyxAPZO1PaUPvirNotJGKBhT7htOtRtUdkh3rDzmwfVdjQSl5bP9FNFWOUB2gXU\n5pN7mtI5yLOyQ7yMlBLLmTMY69XDrmFDDj35CoVNxiAd3KjlYMSvifs1+9ievJ2vD34NgJ2wY3af\n2XTxrZ6TDaqK4mY9ld3uIhVETY9Vrio3FfZ+Dy2HQ8Tb+J9aBtKilfduehv4d4AO47VKrjXAZxHH\n2HrsLHe08uGt1UfILbRgEPB//ZvyWM+gKjMOcanslatIfuUVGiz4noRJT+OcmUSXJulsTKhLx0FX\nv/UnpSQyNZJ6TvWYHKFtWhReP5whuiEqSZQBdR2m1Fw2G1gLwegI2+fAX+/DxtcB0AG0GgGDPtbG\nJmoYB4OOyPhMth5LQwADW/kwpF4m/XtV7attp44dcX/wQc5++SV5Z3Nxad+Rv/NDsXey0rSzz1WP\n+/noz7z+z+vY6+2x2WwXVllH3OBWqIpGJQqlZirKgzldwb+zVpQvZp3W7uYHHSfwl6kZ4b37V26M\nZSiv0MIzP0XSr0Vd0vKKmBNxnLwiK2383Jhzf3t8aztW6Q9NKSVIibGuN04dO5D2+eccbD8FGRRC\nTkoBQW29MNpffpNDSsnuM7t5d6c2QbO5e3Pe7P4mDWo1qOhTqNFUolBqjrPHIDkSXLzh99ch46T2\nx6E2dHxEWxzn3hAAWxX+0LweOSYzrg5G7PU6Ik9lsuHQGWwSOjV057n+TQkLvPY9/aogY8FC8rb/\ng+8775Ay8z0wGmk3IpQd/xQC0OGOhpcdsz15O69sfYXTeacBGNFkBC91ekkNWJcD9RtVaobCXFg6\nFk7v58KkPIfa0PNFaP+gdvuphnlvXTTL9iYybXALXv71IGeyC9HrBG8NCeG+ztXsG7WUCKHj7Nx5\nFEZHU//jjzG3bEbu2h3U8nLAo/5/y6Kcyj7Fy1te5kz+GQzCwIe9PqSnf8/Kif0mUNzK7ByKmQar\n9qNQKl1SJKx4Cm55HvYvhtP7tPb67eHWV6HRLdV+auuldsSm08K3Fi72BtoG1Gbp7gQe/m43AMFe\nLiwY15F6btUvKbqPfgB93bokPf00xlv6EGffgugF2kLH7sP/3fUvOj2aqLQo1pxYw5n8M/g4+bDw\n9oV4OXlVVug3heJmPbkCCCGmAaeB79Gmxt5HNdpHW6lh8tLAnAdF+bDlAzhzEH68F/R20OpuGDAD\nnKrH7ZbrFX06h7vnbePhbg1xttfz3T9xZOab8a/jyAcj29AhsOI2ECormct+xc7fD7vgYJKfew6A\ngn5j2PzjUQz2Opzc7GjYRksCVpuVyRGTScxNxCZtPNr6UR5p84i61VQBSvIb7i+l7HTR4zlCiO38\nW95DUSqG1QKfdtDqMJkytTadEXr9D8IeAufq90F5LVkFZqISs+gW7MnZ3EI8ne2YvzUWgJ5NvZjY\nK4iwapggAKTFQvpX8zE2aIA5MQlZVITnxCfwGtYee//TbPjqED3ubkRCTgImi4mn/nyKUzmncHdw\nZ/ats2nl1aqyT+GmUZJEYRVC3Af8iHYr6h7AWq5RlZJacFcDJe6GI6sh/FlYMUkrsQFgdILQeyH8\nOXCtV7kxlqPXVxxk3cHTBHu5sC8hC4DGdV14e2grOjSs3ldOwmAg8McfSfv2O3J/34hdo0Z4TZwI\nwPG9qSDAq4UDA5f3p9BaiETS3L05X/f/GucaOKW5KitJorgX+PjcHwlsPddW5agFdzXE+bpEQsDu\n72DfItjxubZznLM39HoJQu/Tym/UMFJKIqJTCalfC29XB7oGebB8byL7ErKoX9uRz+5rRxv/2pUd\n5g2RViuZP/9M7bvuAoOBtC++AJ2OBgu+Z/uKExQVWDi8P4569TwZt+khTFYTAsHjbR7n0TaPVtnF\ngjXZNROFlPIkoPbMVipGRhz8MBJ828HRtf9eQTS8Bbo8DkG3Vm585ex0tokJ3+/ijta+2Gw2lu9L\npo6Tkaf7NOHBroGVHV6ZyNuyhdOvvobB0wvTwYPIggK8X3kZg7s7uWmnOXI8lgXtpxIuB3Ai6wTB\ntYOZ13ce3k7elR36TeuaiUII4QWMBwIvfr2Ucmz5haXcVIryIDNe23c6ahmkRkPKYUCAXwfo/zb4\nd6zsKMtNak4hf8Wkclc7P8wWSQufWizbm4hOwFO9G/PYLUE42lW7ijpX5XLLLQR88zUFR45w9tNP\ncb4lHI/776fIWkSnewP485WtBKa3ZKPHrzza5lEea/MYOlG99/2o7kpy62k58BfwO1V0bEKp5haO\nOJcoQiBmLQi9VpNp4MwaO4PpYl9uOcHXW06ydHcCfx/XrqDcHI1881AH2gbUnJLY+bt3Y/D2xs7f\nH2mTpM54F52TE34ffcSMHTPYlbib0xkpjMh5CbNDAe+Ne5VGtRtVdtgKJUsUTlLK58s9EuXmkXkK\ndn6hrX/YPBNObQebRSu10WMKdJuk7SJXQ0kpWbE/mSZ1XWhWrxZ3ta3Pon/i+ft4Gg5GHeO6N+TJ\n3o2xN9ScqwhpsZD04ksYfXzwnfEOp8aPx4ak/rszSLVlszX2H27d9AixdfajlwYeuWsUjWqrW01V\nRUkSxUohxEAp5epyj0a5OaQegb8/gX/mgLUIdAZtc6BbXwHnqlf6uqzlFFp4dXkU3YM9aR9Qh482\nxlBgtjIyzJ//u60pHi72lR1imRMGA/7z5iKMRuLuu590RyvvPVGPfp4xLF75Jjm5+Zysvxe/081w\n93WmUahKElVJSRLFJOAlIUQhYEZbdCfVymylxGw2iJgOzl7QfBCsmAzSpq2HaHU3DHwPHGvuFQRA\nQkY+v+5N5IlewdjpdXQN8mDl/mRW7k+mtZ8bb9/ZipZVcAOhG2UrKCD3r7+o1a8f9g0bEv/UU5gT\nE5FhQSTbneWzfZ/h5+LHC7e+QPO8DqycvY8W3dQ2pVVNSWY9qVXYSulIqU1xtVng0HKwmWHdS1qS\naNQThn99U4xBAGw8nMInfxzD3qBj1h/HyDFZsNPreH1wC0Z1DKixUz7Tv/2O1FmzsF/xG+uilvG5\n3x8MCzHyYe+TSItgYMOBPNP0eYTJwJ/LDwPQvOvVy4krlaMks57Cr9Qupdxc9uEoNcaJTbD2Beg+\nGdY+D/npWnurEVqhvmq8/3RJWKw2Fu86hV8dJ25p4kX/kLr8sieBt1Zr9YtuberFx/e0xdWhZmyU\ndDUeD4/FsU1rCvbvZ+vGb4gLE3wwyEZ9Vz/e6vYW7eu1Z9uvx9m7Pg5pA6dadtg5qpIcVU1J/kae\nu+hnB6AjsBuo2RPalesnJVhMWqXWjDhIPw6/nFv7WK8N3Dm3RmwxWlJfbYmljV9tth5L5ftt8RSY\nrTT2dmH2vW1pWq9m37nN+eNPHDt24JfE1ZiLThP68lyCm4K+nZ5nOv0fo0NGX3htaB9/8jILif7n\nNAEhN8cVZnVTkltPgy5+LITwR9V5Ui5ls8LXA8EzWCvvvX2edqvJIxgGvKstlKuht1fO2x2XwVdb\nYvloVChGvY4XBjTlmcX7yCm00ruZF8/0a0qIb80bh7iU+UwKiU8/TZ377mVF073od0cRapPEtfNl\n1YjvqO9a/z+vd3SxI/6QNi246zBVfqcqKs01XgLQsqwDUaqprARt17iTf0P6CW3jIIsJ6rWG22ZA\nYNfKjrDcSSkRQpBVUMTe+Ax2xKbx/vqj7InXChfe3sqHWaNC0etvjkVjfxTspcmHbzCzYA295+0n\n7JgkckgzXnxhAc7Gf2s02WyS9V9E0bRLPQqyzbj7OuPoUvPKstQEJRmj+IR/96XQAaHAvvIMqrRU\nUcAKFrkIlj8BdRpqt5kAXOrByO9r9Erq80xmK88u2Ue7gDqM7d6Qnk28GNrWl/u/3IEE6td25L0R\nrekSVPOn/AKcnTuXvKb+/N+pl5BScv9GC51iJHl9OnDfjO8ue31+VhEpcTnoDNqVZkh3NdupqirJ\nFcWui362AD9IKbeWUzw3RBUFrABm07nifF5wYIk2gyn9ONi5asX6OjwMhpq3DuBiRRYbdgYdDkY9\nRRYbFquN/QmZfPbncdYePI2rg4FXBjZnZMeAyg61wqSkxZOzciU7dxdg627DuVAQEiexa9aE5rMv\nTxIALnXsuff1Tiz/cC916jnRqpdfBUetlFRJxii+FULYAU3ONUWXb0hKlWWzwZe9tUVxwX0gdrNW\nbqPn89D5CbB3uXYf1dzyyESmrz7CuqfDcXUw0C3Yg3fXRvP2miPoBTzXvymP3RKETlezx2MutvnU\nJp6OmEzfR7uyJjWCXgm1eeSnbJyCQ2jw3bdXPCYrNR9XD0cORCRy+kQ2XYcF19gpwjVBSW499QS+\nBU6iLbbzF0I8qKbH3kTy0rSSGv98qhXsy4yHExHgE6rdZqpds785W6w2iqw2nOwMNK3nSlhgHVbu\nT2LmumgyC8wAdA/25M2hLQn0vHn2SbBYLaTO/oSUg2uwdbOyOm0Tr+8IoPmfsRi8vfGfOwed8+W/\nD0uRlV8/2Ev9pnWI3ZcKQPNuau1EVVaSW0/vA/2klNEAQogmwA9A+/IMTKkiEnbBN7drC+Oyk7Q2\n14Zw1xfQuB/oavYAbaHFyqBPttAt2JPXBoUQ6OGMo1HPy79GARDWoA7vDm9NI6+afzV1sfkH5rMh\nbgNdo06gy85Fjz1fJPbH5c8VCEdHGixcgMHryvtY6406ug4LJi+riOh/TuPXrA4OTjV7PUl1V5JE\nYTyfJACklEeFEOpvtaYrzNVuJcVs0GYxZSeBwQF6T4VOj9T4BJGUWYBvbUfsDXoGtfbFw8WOd9ce\nYdWBZOLS8gn2cmHO/e1oXPfmKlwgpcSal8fJY3s4mH2Qg90k/i4NWGI3msLp0xB2dgStXYOxbt2r\n9iGEoHFYXZZM3wlAx8ENKyp8pZRKNJgthJgPfH/u8X1oC+6UmmrDqxC9Fhr3he1ztbbWI6H/9Bq5\nL/WlftwRz/+WR7Hu6XDqONmRkFHAB78fRUrwqWXPl6PD6N3c+6a6p55VmMUrW15hYKOB1HtuNj0T\nT7D6YQOj2jzIBH1Pku4fA0IQ8O03xSaJXWtO4uxmh4efKylxObi62+PTqHrv2HczKEmieAx4AngK\nbYxiM/BZeQalVAKrRVsQp9ODQx3IToRtsyG4r7YvhHvN/taXkVeEyWLFx82RW5t7czw1kHmbjrNs\nbxJFVhs6AaM6+DNtaEuMN8l6iIs5ZBaQknualcdXktomDo9uPvw84ivqJRUQ9+AYdE5O+MyYgVPb\ntlftQ0pJwpF0XOs4cGTbaQBuHd28ok5BuQHFJgohhB6YL6W8H/igYkJSKprBnA2f94T2D0JWImz9\nUHti0MfQfkxlhlYhLFYbd3yyhRDfWnw+OgxvVwfsDHoW74oFtHGID+4OJcDDqZIjrViRKZHM3T+X\nJ1wHY53wHP7hsC7sCN26dGdG+LsYj8ZzcvSDCKDBwgU4NC/+Q18IwdDJ7UiNz2HpO7sI6eGLXzNV\nsqM6KDZRSCmtQggvIYSdlLKoooJSKojNBjodFoOrVnpjy0eQnaDtDzFyITS9rbIjLDcWm2TdwdP0\nD6mHQa/j5dubU/D/7J1neFRV14bvMy2TTCa99wRIIZRA6L0XqQIqzQKIBRQLqNgL+KoI74e+FrAi\n0lSkCQgoEJDepBMglEAa6T2Tafv7ceIA0gIklDD3deVKTt8nk5zn7L3XepbJwserE0nKLGb1oXNE\n+Trzbr96tIio+cNtl6PQWMjf5/5maMom7m8OJ2Nc+aDNa/SK6IXhwAGShz+MMBrx/+STa4pEWZER\npUqBWqtkzTeHkFQSTXvX7F5qTaIyQ0+ngc2SJC0DSv5ZKYSw9zDuZo7/IVt+j1qDT+ZfcHS57M2k\n94OHl4JP9O1uYbWScNbMnDW7+e2ZNmjVCuZsS7aVIQV4rnMduXaE6t4ZZhJCMC9xHgCNCeXMq2NR\ndxPoXJ1p8vJrvFurD5Ikkf31N2RNmwaA55NP4Nq92zXPvWnhcdKTCqjXPpD8zFKiW/qhc63ZiZk1\nicoIRVrFlwK4t0I8ajJ6P3D0gA1TiDkyQ56fqDcI+n8JqprntyOE3IPw0DnQLNyDdkEqurZoyOak\nLD5ecwwhZJeaFhEe/Of++vdcuCvIQ0N/pfzFmaIzzE86w+tnrQx17MQTQ6ajUqiwlpVx5ukxlG7b\nBioVgVM/xqVH5XqdcV1C8K9VyLalstVLywE122a+plGZzOx3b0VD7NwCjv8BmUeg9ThQqCHzMJzd\nRrZXC7xHzKvREU0moplsMgAAIABJREFUi2DyiiPEBbvRLNwDIWDPmTw+XZuEAGp763i2cx36xQVe\n81w1iYLyAr7Y+wWP13+cRUd/JWfHZs4GQffmPag9+gVausu/j4KlS8mcOg1zVhYqPz9CZ89GExJ8\nzfMbDWY0WhXewXoKMkspLzETGOWGk97em7ibqExm9m+cNwX8hwJkD6iZQghDdTTMTjVweKns7mo1\nw7rJICxQbyCHvB6hQw0UiQMpBczZlsx/BtRHo1Iw9/HmeOo0fL4+iW//KiW3PAkfvQNv9Iqh7z0m\nEP+QX57Pr8d/ZfmJ5bTZnM87a61sfa8/o9r9B0mSsFqtpIx+gpLNm9GEhxP8/mSc2122ltkllBUb\n+fn9ncT3CKVe+yC2LJJ7E+0GR1XnLdmpBioz9HQS8EbOxgZ4CDiH7P30NfBw9TTNTpWQvAVcAsA9\nTE6Wm/cArH0XJIVcJ6L5k5CQcJsbWT2cyS1lbeI5TudEEODqyMLdKczYcAKTRaCUYNaIpnSI8rnd\nzbzlHM87zvb07QyLGcay9TPwOmcg1aucvC6N8Ojaj1H9BiFJEiW7dpH63PNYcnJQ+foSvnQJCk3l\nhyWVKgUhsZ74RriSkphLUY4Bz0AdHv73js1JTaEyQtFICHHhK8RvkiRtFEK0kyTpUHU1zE4VUF4E\n8wdDZHeI6AhLnpbXO/vBYyvkSKcaRJnRwsRF+2kR4cmQZiH0rOdHu0gvfthyms/Xn6DMZAGgYZAr\nQ8ON96RIACxJWsKyE8tYcfw3xkzej6e3hMv/ptC7Vm/bPhkffkTerFkA6Nq0IejLL1CoK2/IIIRA\no1XRcXg0Vqvgh1c34+Ckos+4uKq+HTu3gMoIhbckSSFCiDMAkiSFIPcwAOwhs3ci+Wdkoz4HPXSd\nBBunwP6fwSdWrjTXbVKNrDanVSvILTFSbDADUGay8OHKI8zdcRaAKF9nXugaRY96fiTU0F7U5RBC\nsPzkcgqMBVgMBtwS9lPsU8TB8sMce+4+HuryAs5+5y2+M/9vOnmzZiFpNATPnIGuZcvrul5mciFb\nFiXRdUQsOjcHfp9xgNICI837Rdgjne5SKiMU44FNkiSdQM7MDgfGSJKkQ3aVtXMnceov+LE/PPij\nXDdi+fNyzYiuk6HlGDnzugax9UQOH69O5IeRzdBr1cwe2YxSo4UR3+9gd3IehQYz8aFuvN07lgbB\n96ZVRLGpmI93fkyoIpR9737CyMXFbByuZezIr2kR0MK2n7BayZ4xg5yZM9HUqUPQJ5/gEHH9uQ4l\nBUbKikwoVQqO7sjg9P5sXL0die8RWpW3ZecWUpmop5WSJNUBopGFIlFeLcqB6dXcPiRJ6g/0AnyA\nz4UQa6r7mnclVossAiEtoMXTsHEapO2S5yIGfAMNHrjdLawWnDRKSo0WMovK0WvVrDyQzvhf9mEw\nWQn1dOKLYfG0qXNvVJi7kHxDPr+d/I3hMcOx7trPgLwIvnXajRQp0I2N5fuxC1Apzv/7l+7axdmx\nz2AtKEDXri1Bn3yCwtHxhq4d3sCL0HqeGIqMrJ11BCTo8US9e8obq6ZRmain74QQI6kof1rRk1gG\ndK7MsUBvIFMIUe+C9T2ATwAl8I0Q4sMrnUMIsQRYIkmSOzAVsAvFv/l7Luz4CkauAmMx7PgGzGXg\n4AKP/gYBNWdcWAjBJ2uPIyHxXJc6NAx24/fn2pKeb6DvZ5vYn1KABIxqHcYbvevesw+nNclrmLZr\nGvU9Yil+6wUCFcUwTMnUDv+lW/j5BDkhBOlvvEHBr4sAcO3XD/8PP7ju35sQgi2LTuBfy5WIOG8k\nCRZN24OwClr0r4VXsD0F626mMkNPqZIkfSmEeLriYb0COdqpMswCPgNstRAr/KM+B7oCKcDOiqxv\nJfDBv44fKYTIrPj5jYrj7PwbvR84+0L2cVgyRhaJuOHQ9381zg5ckiTO5JQiSRJCCCRJ4veDGUz4\nZR+lRguBblq+fawp0X4ut7upt5y/M//GbDVTt9wTvxnLqdUqmHEJz6PpXUq7RgN539z0IpHIW7iQ\nc+9NQhiNKHQ6/D/6EJcuXW7o2maTlfSkfAAi4rzZsfwUBZlluHo70rh7zS5sdS8g/ZORetWdJOkj\nwBW5WNGHQohfK30BSQoDlv/To5AkqSXwjhCie8XyqwBCiH+LxD/HS8CHwB9CiD+vcp0ngCcAfH19\n4xcsWFDZJl5EcXExzs53eFauEPhlrAOsZPh3xcGQRdze19GU56IUJg7VnUCWT9tKn+5Ov+dcg5X5\niUYeitLg5ajAYhUoFRKbU03sOmfm70wrTiroHqamby11pd6G7/R7vl6swsqH6R+iREnwiXzG/JTP\n5CFKMkLdGO45nGjH6PP3LAQuP/6I45atABhr1SLvuXFwHaGvl22DWSApwVQCx1cKJAki+4LK4fa9\nrNS0z/la3Oz9duzYcbcQosm/11+xRyFJ0oALFncAb1Z8F5IkDRBCLLrBtgQCZy9YTgGaX2X/Z4Eu\ngKskSbWFEDMut5MQ4ivgK4AmTZqIDh063FDjEhISuNFjbxlmI8z7BBQqokPvg7ljwVwu9yqGLCA2\nsPF1ne5Ov+e0/DL+s2sT+pC6dIj1I7fEyFNzdrPjlGw9NrJ1OC91j8JRU/mJ+jv9niuDyWJicdJi\n+kf049xn/6N7uolZsemkhMDp5115qPloHq77MBqlLAAJCQnUO3aM/F8WYjp7FteBA9F36Yy+Y8cb\nbkNhThl715yhRf9aaBxVcoTVZ/tA5DLolSb4hN7enl1N+Jyvh+q636sNPfX51/LfgLpivQBuVCgu\n97p3xW6NEOJT4NMbvFbNQgiwmGQvpsHzYcOH8MN98jaPCBi5GpxrRm7AxmNZbD2Zwys9oglwc2TT\nK53QqpUcTC3g0e92kFNixEmt5JMhcXSt63e7m3tb2JWxk0nbJnEk9wgxG5ag0ZbjGe/Ds42fpX+t\n/igviHArP34cz1dfIysvDyQJj8dH4TN+/E3P4aQk5nFs5zniuoWgcVSRMCeRM4dyiWzme9tFwk7V\ncUWhEEKMqKZrpgAXmsQEIZsO2rkWq16FnOOySOyZBZunAwro/znEDb3dratSdiXnsfpgBmM61EKv\nVaNVK9l6IodHvtuOySIIdndk3ugWBHvcWzUiUopSOFlwkvhULZ6T/0NYf3cWHltI8NAAXmg+gYTQ\nrhftb7VYSHtxPEWrV6MCtA0aEPTll6g9q6YORN3WAUTEeaPVqUncms7hzeko1QraD7fbdNQkKhP1\n9APwnBAiv2LZHZhWEQl1I+wE6kiSFA6kAoOBKnnKSZLUB+hTu3bNyji24VtXDoHd8ZVcrlTpAMMW\nQkTlvHfuZIxmK99sOkmLCE8ah7gzpkMtxnashYNKidliJbvYyKwtpzBZBLW9dcx/oiXe95ixnLW0\nlOnrJ/F3eRKDtW3wLTmJOU9B3ehYFvRacEnvwJSRQdrLL1O6YyeSoyP5AwYQ8+YbVdKWE39n4uyu\nxTfMBa1OTXGegXWz5VDYPs82RKOpTJyMnbuFynyaDf4RCQAhRJ4kSVeud3gBkiTNBzoAXpIkpQBv\nCyG+lSTpGWA1cqTTd0KIKrECEUL8BvzWpEmT0VVxvjsCIaDgrJxpHd0bEj6SiwuFtoaB38g+TjUA\no8XK7C3JFBnMNA5xR6tWkppfxswNJ1h1MIPcknLMVhjVJpzx3SJxukceREIIVp1eRQvPeLL7PsTw\nptHsaSL4NHcRPKpkdP3RjGs87qJjypPPkDpuHOXHj4Mkoe/Vi4ApH7Hxr7+qpE0Wi5XtS0+i93Sk\nz7MNMRrMLJi0AyGg1YBaBEa6V8l17Nw5VOa/TSFJkrsQIg9AkiSPSh6HEGLIFdavBFZWupX3Mgkf\nwvYZMGI1fNdF9m8KawsPLwZl5b137kSyi8uZv/0MYzvWxtlBxfJxbfBydsBqFXy+Ponpa49jtQoE\nEObpxP89FEejkHvnIWTOzSV57TJeLZvO2LixNB/ak6l5v5BlMBDpHslnnT/DX+d/0TF5vy4i4803\nwWrF5b778HrmmRvKrr4aSqWCfi80QqWWo5k2L0yivNRMRCNvGnWzZ1/XRCrzwJ8GbJEkaWHF8gPA\n+9XXpBunRg49xQ2VbcG/7QLGIqjbDx6cfe3j7gLWJ2by6brjdIz2oV6gK17ODhSXmxk7dw8bjmXZ\n9hvROoxXe8bcM9Xmcspy2Jmxk8ZLEjF+8w2fzn2fbYajDHeYg0eYB2/GvcSDUQ9edEzJ9u2kvTIR\nc0YGAD4TX8HzsceqtF2nD2STcaKAFv1r2TybslOKOLI5jdD6nvR4ot41zmDnbqUyFh6zJUnaDXRE\njlgaIIQ4XO0tuwFqzNCT1QrH18g1qyUFbPtSDk5vMBgGzLzdrbspTmeXkFFooEWEJ4Pig2gW7kGo\n53nb6fVHMtmclA1A2zpejOlQm5a1al6tjMthzs0la/onLIsp5hvLRn5/6CcOx0q8t/8trMJKgC6A\nOffNwdvJ+6LjDElJnBn1OJjNqAMDCZg2Fae4qs/GT0nMI+14PvE9w1A7KBFCsOKLAwig/ZCoezYL\n/l6gskNIhyRJygK0IDvI/uMma6caOPALLH4Chi+G9e/LItH4Ueh790cJj/9lH/mlRv54oT0KhUSo\npw6DycLkFYc5kl7I7uR8/F0ceLlnNPc3Crr2CWsAVqORzZnbCVJ4Yk5IoHfkY6ga1qVvwnCKTEUA\ntPRvyaedPkWr0tqOK966ldKdu2x24H7vvYv7gw9e7hI3jBCC8lIzWp2aVgNrYzFZUTvIYbd/zjpC\nca6B4Bh39B7aa5zJzt1MZaKe+iIPPwUAmUAocASIrd6m3cPUfwAMBXByA6Tugk5vQbvxt7tVN8y+\ns/lE+enRqpV8NLABeq0KhUJ++9xwNJMJv+wnq7gcgMdahTGxZzRadc1yub0SGZMmU5J4mJd7naJH\neA9eXfM7H+z5mIV75JHe2m61mdJ+CnXc6tiOMZ45Q8pzz1N+5AgADnVjCPrvf9GEhVV5+zb9fJyz\nR3IZNLEJGq0KRYVInPw7i2PbM1BpFNz3dIMqv66dO4vK9CgmAS2AP4UQjSRJ6ghcdpLazk1gtcKm\n/0KTkVCaC+vekyeuQ1pB2xdvd+tumFPZJdz/xWZe7BrJM53qUNtHthcoKTfz5tKDLNqTCoCLVsW3\njzWlaVjVxPffyZTt3YspOpw/z66lU926KF1d+abzRIospTzy50gO5Rwi3CWcKe2nEO0RbTvOdO4c\nZx4bgfHUKQAULi4ETJ2Kvl3l7Vqul9D6nujcHGy9CIBT+7P5feYBAHo+WR/VdWTE27k7qYxQmIQQ\nOZIkKSRJUggh1ld4P91x3NWT2VlHYMMUOZJp6xeySPjVh8Fz78oiQ2dzSwn2cCLcS8e0BxvSJcb3\nou1TVifaRKJrjA//G9r4nuhFFG/cyNknnuT4ywN5R7mM4O7fsvr0Yf5MGEeOIQeA8fHjeazeYxcd\nV7rnb848/jiitBSFXo/Xs8/iMWwokrJqf2cWk5UNC47iHaynfocgQup6ElL3/ByR1SpYPycRgG6j\nYwmJvTfmj+51KiMU+ZIkOQMbgbmSJGUC5upt1o1xV09m+8bCk3/Bz49AcQa4hcHDS8Hp7nvDnrnh\nBNP/PM4fL7YjyN3JNtdgsljJLi5nxf505mxNRqWQmNgzmlFtwmvsRKgQgqI1fyCp1Zyo5w61dYRN\nnkR4z24UJkfzzNpnKDWXAqBVavm629fE+ZyfiC5an0DurFmUbt8OgMeokfi+9FK1tVehkigrNGIo\nMV2yzWgws/rrQ5QVGmnYOZg68b6XOYOdmkhlhKIfUAa8AAxDdpF9rzobdc9gtcLKCRDZAyK7wdp3\nIDsR9IHw9Ca5lOldgtUqMJgtOGlU9GkYgEUIfF3OT3CeKzQwctZOjqQXYhXQKMSN6Q/FXRTxVJMQ\nFovtbT/nq69QeLjzao8UQl1CmTFoBkXlRUzfM51ySzlKSUnviN681vw1nNSyJYk5L48zj42g/OhR\nABwbNiRw+v+h9ve/4jVvFLPRwu5VyTTsFIzWWc19TzdAUlwq3Cu+2E/asXya9g6nWe+qzc2wc2dT\nmfDYkoofrZIkrQByRGW8ye1cG1MJpO6WXV+VKji6Ujb1e3LDXScSD3+3HW9nB6YPbkSAmyNjOpwf\n/lt5IJ1x8//GbJX/bPrFBfDfB+NQXuZhVBPIW/AT2TNnErRiCcvO/E6/zz7FwceXTwtPUmIqYVPq\nJj7a8RHllnL0aj1L+i/Bx+m8mWP2zK/Imj4dhEDh4kLQJ9Ovu2719ZCfWcaeNcm4eDkS08r/EpGw\nWqz88sEuslOKcfdzsovEPcjVbMZbINeByEWe0P4R8ELO1H5ECLHq1jSx8tw1cxRWKyBkMRi5CgpS\nYGYHcA2Gx9eCs/e1znBHYLUKFAoJhUKifaQ3bk4X1zMwWaxM+GUfS/fKno/1A1z5YnjjGmfkZ0pL\nI/eHH/AYORK1ry+asFCc27Rm24n1TN4zmcAuX9JEePDlvi/5I/kP23EvN32ZIdFDbCVJzXl5ZLzz\nLkWrVwPgPmwofm++WS1ttlqspJ8oIDDSHa8gZ4a92wIXz0tLn/6TK5GdUoyLt5aBE+OrpT127myu\n1qP4DHgNeahpHdBTCLFNkqRoYD5wxwnFXTFHIQT89qxc47rfF6DUwLddwVQM/X8C/d0x7puUWcyY\nubv5aGADGoW480S7Wpfs886yQzaReL1XNKPbXrrP3YoxJQVJklAHBmItLydv3nycmjblpDqfc0FG\n2k2ahJ8QzPevRT2veny440ObSDTxbcKL8S9S37u+7Xw5P84h+//+D2tpKSo/P/wnvYdz2+qLZtqz\n5gw7lp1kyNvNcffTXVYkyorK+eXD3RTlGHDQqRj6dguU90h2vJ2LuZpQqIQQawAkSXpPCLENQAiR\nWFMnHm8JwgruYbJQKBTw86NQlge1OkF4m9vdukrj6+KAm6MGo9l60fqScjP/98cx9qXks/N0HgAb\nX+pIiOfd34sQViuSQoHVYOBkn7649u+H/9tv4xAeTp2tW1A6O/PhqhHkGnJpE9gGhaTA29GbPov7\ncLrwNABT2k2hZ3hP2znN+fmcHfU4hkOHkHQ6QufNxanx9RWeqnT7hcBYZkbjqKJBhyDcfJxw8738\n55KdUszGBUcpyjGg99Ty0OtN7SJxD3M1objwCVD2r232OYobRaGEdhVRK3tmw+EloNHBQ/Nub7sq\nwR+Hz7Hk71T+N6QReq2an5+6eNx8yd+pvLRwHyaL/Ocxum0447tF1Yiw14z33sOUlk7wjC9RaLUE\nfjwFbd26WIWV5SeX0zmkMzrgvdbv4aJxQSEpWHFyBa/+9Sqi4t/lw7Yf2kTCajCQOn4CxevWgRAo\n3d0JW7AATWj11ZdO3SZYvnsf/V9sjMZRRe34yxe5OrghhQ3zjwEQ2y7Abs9h56pC0VCSpEJkfyfH\nip+pWLbn698If74rRziFNIeck/Db8/L6oQtBc2nX/04jr9TI6ZwSckuNeDlfXAti2uqj/G99EgBe\nzhqmPtCQDlF3b7W9soOHKFy5Ep+XJshDTCEhKHQ6hBBIkoS+SxcAjuYe5Y1Nb1DUrIhhMcMIcg5i\n+cnlfLD9A5v9xvut36dPrT5IkoQwGkl/7z0Kli4DkwnUatwfeADfN9+o9oexs79EeLDPZUtM/sPq\nrw+StDsTlUbBkLea4+J15/9d2ql+rlbh7u5/DbyTKM2VPZzUTrJQrP8PCAt0fQ/CWt3u1l0WIQRz\nt5/BW+9A91g/HogPYkCjQFTKi4cg3lx6kB+3JiMB859oTosIr9vT4JtACEH50aNoQkJQODlRfvQo\n+T/9hPvQIWiCgi5yYi0xlbA3cy+tA1sT5RHF7J6zaeDdgISzCbyz5R1b4tw/Ia96jR5TairpkydT\ntmMn1hI5kNBt8GD83n6r2gTCVG5h44KjhDfwJqKRN25hEg07BF92XyEEi6buJuNEIUq1gl5jGthF\nwo6NGlX95Y6OenLygDFb5ap0e+fDwYVQbxC0fu52t+yKmK2C+TvOEOWrp3usH5IkoVKef6iVGS2s\nTTzHj1uTcXZQsXJcG0LusryIf3oIhn37OD14CAEff4xrn9649O6FS6/7UGgv7TxP3z2dxUmL+WPQ\nH7hr3YnziWP4yuHsy9oHQLBzMGMbjaVXRC8AcmbNIvOjKSAEDpGReI5+HJcePZDU1VtPRKGUyE0v\nxd2/9Kr7Wa1WFn28h3OnZJEYNbXtRZYdduzUKKG4Y6OeTm6Qiw056CF5GywdA47u0POOdELhz8Pn\naFPHC61ayY+jmuPudPEDLbPIwBfrT7DqUAaZhQYC3RyZN7r53SUSZjPJjzyKrlVLvJ56Cm2DBvhP\nnoSuTWsAFA4XD62dKTyDg9IBX50vTzZ8kp7hPUkvSUchKXhv63vsy9qHg9KBiU0nMihqEAAlu3aT\nOm4cltxcAFz69sX/3XdQOFbfm7rFZGXfurM06BSESq1kwEuNUSqvPAltMVtZ/fVBzp0qxMlVw/B3\nW9hFws4l1CihuCNJ3wez+0KPj6DZE7BgiBz5dP8M0N15QzSH0wp5fPYu3ugVw+NtI/DQnc+NEELw\n3ebTfLDyiC15zkElsWRs67uifnVRQgKm1FQ8hg0DlQp1cBBKD9kiRVIocBs06LLHlZpKGbJiCG2D\n2jI4ajDLTy5nzek15JXnodfoKTIW0TuiN2+2eNOWWV20bh0pY8YC4BAdTfCML1H7+VX7PWacKmDr\n4hO4eDlSO97nmiKxddEJTu3Lpna8N11HxqK4yv527l3sQlHd+DWAQd9BZE9YNhbKcuV615Hdb3fL\nLiKz0ICPi5a6AS58/1hT2ta5WMRKys08/9Ne/jh8DlVF5m60n54vh8ffsSIhrFYMR47gGCs74hf9\n8Qdlu3bjPkQ2Pw54/+qFGo/nHaeOex2c1E682+pddp/bzcO/P4xKocJitQCgRMl33b+jqV9TrGVl\nZHz8AdbiYgoWLQLA94038Bg+rBrvUk58zEkpxjtET2CkO4PfaoZngPNVj8lLL2b5Z/spzDEQGOVG\n99H1r7q/nXsb++tDdWIul51f6w2EAwth7zx5jmLYwmsfewtJOGuiw9QETmfLk6wdo30umbDWqpWk\n5pWhkECjlPhxVDNWPd+OcK87b7jpH4eZ3NmzOT1wEKZU2aXW9+WXiVixHElx7T/7lSdXMmDZAPac\n2wNA55DOLD+5HEeVI2arGYFgYrOJbBy8kaZ+TSlau5ZjrVqTN3s2BYsW4RAdTcTy36pdJAC2Lz3J\noo93U5xnALiqSJjKLcx/bzvz3t1BYY4BrbOa7qPtJUztXB17j6K6SN0N84fC4HkQ2BhWVNSUeGwF\naO6M5LN/JnIbeivRegXj53rpxO2JrGK8dA688PNeDqcXondQ8ef49hcZ/t0plJ88ReqLL+I7cSK6\nFs1x6dEDlZc3Sk/ZClvp6nrV481WM7mGXHycfOgY0pEX418koySD7enbWXhsIfnl+QCMrj+ax+s/\njpPaiYLffyf99TcQpfKEsUKvJ3jGlzg2blyt4a5CCCxmKyq1kgYdg/Dwd0LndvWeXVGalW/H/4Wl\nIkkyrmswLe+vbSsiZcfOlbALRXWhdoLAePCqDUd/B6sJIjpCcNPb3TIAPlt3nJNZJfz3oTjctQom\ndoi+ZJ9T2SU8/M12Cg0misvloZa1E9rjo78zREJYLBQsWYrK2wvndu1Q+/vJYiDkB6Hazw/X3r0q\nfb5n1j1DniGPuT3nsvbMWuYemcu50nO27d6O3vzQ4weC9EEYk5I4NnIUlqws23b3Rx/F9+WXqrxG\nxL8RQrD660NICuj+eD10bg5Etbi6q6zVKkjfLc9LhMR60H10PTRa+7+/ncpRo/5S7qjwWJ8YGDIP\nLCZ5AltSwkNzbnerbPzj/2uyWC+7fc+ZPEbO2klJuRmTReDupGbH611Q3+bJTmE0YkxJwSEiAhQK\ncr7+Gm39+ji3a4fC0ZHQH2ZV+lwmq4nEnETMVjONfBsxOGowCxIX0GtxL9JK0nBSyT0/R6Uj87vM\nwudgGvkTP+Topk0IoxEATWgoPq+8jL5Tp+q43YvIP1eKm68TkiThE6ZHQrL1Cq9G0p5MVn91EIC4\nLsG0HlTnqvvbsfNvapRQ3BHhsZlH5LmIDq/KQ0yz+8vr44aCw9UnGKsTq1Uwe+tpGgS70TjEnWc6\n1b7iA2bNoQzGLfgbwGbHsfXVzrddJABSX36Fsv37qP3nn0gKBaE/zkbpdX3RYwazgVX5q3h9wesU\nmgrRq/VsGbqFDsEd2JGxw9aLKDWX0ie4B0/vcKO4y0OkmM/X63Jq1gz/Se+hCQ2t0vu7Ekm7M1n9\n9UEGvhKPX7grjbtV7ropibk2kfCog10k7NwQNUoo7giS/oS9c+VEunMHIXmTvL7r7a31VGqy8PVf\np+gc40PjEPcrioTZYuXj1UdRKxUUGcxE+epZ+kzr2+bXVLR+PZlTpxH20wKUzs54PDwca3F/23aV\n9/VZsm84u4G3Nr9Fbnku7QPbU24tp2+tvgAkFyaz7MQyCsoLAHg3YDSxr86juKDAdrxTm9b4TpiA\nNvrSobqqxGoVnNidic5NQ0Add0JiPWh5fy3cr2DidzlKCspZ8cV+ABr3CKHcLaW6mmunhmMXiqqm\n1bMQN0we2/m+wiW09fO3paSpEIINx7JoV8cbZwcVi8a0wucKoaxCCMxWwYr96RzPLAYgPtSdOaOa\n31KRsBQWUrB4Mc4dOqAJDUXl4YHazw9Lbi5KZ2ec4m+uHsLfmX9TYi7hae+nGdNljG39f7b/h/mJ\n8/HOF0xOqkXdJCPmU1/anDHdhw7F943XKxUxdTP8M5QkhGDL4iQC67gTUMcdjVZF4+6V770Yik3M\nf3c7ZqOVWo29adm/NgkJdqGwc2PYhaKqyD8jz0d41pJFYckYsJrBJRA6v31bmrQ5KYfHvt/J/z3U\nkPsbBV0xUsnxAsHTAAAgAElEQVRsFYz/eR9HzxVxKE32fny+Sx2e7xJ5S9ppKS7BWlyE2s8Pq8HA\nuY+mgEKJx8OhODZsSMi339zQeUtNpezN2svO9J1klWUxqfUkOgR3oMBYQHiZXKUtrTiN59Y/R8Hx\nI/xnnQO1k0qBY5gBTZ06+L/7Lk6NG1XdzV6Fw5vSSNyWzv0vytnU97/YGL3H9QcOCCH45aNdlJfK\nQ2XdRsVWdVPt3GPYhaKqWPUqnN0Bzx8ApVqep0CCpzbLdSduIXklRtx1GlrX9uSzoY3oWe/KETHZ\nxeW8vaWM1GI5vFPvoGTFuHbVXj9CmExIajXCauVknz44NW5M4LSpqH18qL32zxuuDS2E4NuD3/Jn\n8p8k5iZiEXK0VpBzECWmEuJ84ojziSMhIYG9mXt5+PeHaZ5o5Z0lVhSiIsTVzQ2/11/DtU+fKrvf\nK1GQVYqzmxalWoHKQYFWp6a8zIxWp74hU76iXAM/vb+D8hJZJIa81dyebW3nprELRVVx31Q4dwjU\nWtj1HSCg5Thwcr+lzZix4QTf/HWK1c+3xdPZgd4NAq64b26JkcFfbSOt+Hx5kdUvtCfArXpdQ9Pf\neQfD4SOE//wTkkKBz4TxaAIDbdtvVCT+IdI9km1p2xhVfxTxPvGsPLWSBt4NcNacDyaYmTmTIyf2\n0/4wjF1xPvIr7Jefcax/a7KUc1KL+WnyDjoMj6Zu6wAim/oR2fTGbT4KsktZMGkH5nIrfhEu3D++\nsV0k7FQJdqG4WczloHIAF3/5y2KCY2vkbe3G3/LmdIzyIa/UiM7h6h+tEIJh32wjqWI+oraPMz8/\n2fIib6eqIv/XX8n59jsili1FUqlwjItD5eNjG4937VX5XIfLYbFaWH92PUfzjjI2biweWg8KjYU8\nEPkAfjo/WgWet3EvMhYxclYfHvj1HG8lnz+HY1wcofPnVXtNiORDORjLzNRp4otHgI5WA2sTWs/z\nps+buC2ddT8cQQho3D2UlvfXnLKzdm4/dqG4WX4dBRo99P9CtuvYPQuO/Q7BLcDRrdovL4Rg2ppj\nmK2CiT2jifLT82rPmKsek1tczrgFezmSLhfWqe+lZOG4NjioqmbSumzfPjKnTiNg6seofX1Renqi\njY7GUlSEyt0dt/79r32SSlBiKmFJ0hLmHJ5DSnEKgc6BDIkegpuDGwJBriEXP538hm4pLOTMc+Mw\nbN3OhfFnTq1bEzRtKkq36vusLsx12L/2LIYSE7XjfZAkibguN1/R7q+fjrF/vTxRHdsuwC4Sdqqc\nGiUUtzzhzmoF/zhQO8oiYbXA+gqjuZZjb0kTJEkit9SIxSKumXwlhOCjVYl8u+mULT9i5sPxOGQl\n3pRImLOyyPr8c9zuvx/Hhg2RHB2xFBVhzsxC7euLvkMH9B063PD5L8RitaBUKNmbuZcxf46hyFRE\nnHccTf2a4qB0wEPrgYfWg597/wwWC1aDgbw5c8icOs12jlIXBywdutF44kRUHtUbjZZ8KIfNvxxn\nwEvxaHVqOj0ag1anrrKey7YlJ2wi0fqB2sR1rr5SqnbuXWqUUNzyhDuFAtpNOL+8bwGU5ck/16q+\nTF2rVfD9ltN0jvYhzEvHpH71UF7Dr8dgsvDqogMs/ls2yJvUP5aHW4QBkJCQeF3XF2YzefPmowkN\nwbl9eyRHJ4p+X4Vjg4Y4NmyINjKSiCWLb+jeLmRr2la2pm8lpShF/ipOYXT90YyoN4IgfRBtgtow\nLGYYDb0bMn33dI7nH8dkNSFS0sn/+WfyflkIQmAtlCO5tkfCgdHtmdZnBgkJCdUmEiUF5UiShJOL\nBp2rA456DYZiE1qdGp1r1Tntnj6Qze5VySgUEgNeaoxv+NW9rOzYuVFqlFDcUrZ+Lns5hbSQl4WA\ndRWDGn3/V61Z2Nkl5Xzy5zHySoxM6B51TZEoNZp5cOZWDqbKD8zeDfxtIlFZSrZtw1pcLNeKVirJ\n/eEHdG3b4Ny+PUpnHXW2bK5Sj6NcQy7PrX8Os9VMoHMgQfogGno3JMZTHlZTK9Q4qhxRKeQ/4Wca\nPUPpugTSRz9NyebNoFSCRY54SvWAiSOUPNf6FabVfbjK2ng5jGVm5r61jZjW/rR9MBKvIGfuH9+4\nSq+RnVLEuh+OkHVWnl/q90KcXSTsVCt2obgRhIC/58jhsP8IxelNUJQBWjdoVPUPIyEE207m0rKW\nJz56LSvGtSXIvXLRSS/+tM8mEu0jvfls6LUfXKb0dMqPHcO5fXsAcr75FnN2NvouXZAkifBFv17k\nxlrVRngeWg/m3TcPP53fRdFKtutJEptTNxOlDiLWMxaVQkX+vPkYjhxBodPZ6lL/0lril3ZKJjab\nyLCY6rH8zjhVwLmThTTsHIzGUUW7wZH41araB3deRglmk5Uzh3LYvuwUoqJwVI8n6hFQ59ZG1tm5\n97ALxY0gSfDkX2DIP79OXZEY1eoZeXsV89v+dMbN/5vZI5vRLtKbYI/K5TlYrILkHPmh2bdhAJ8O\nuXzymDCZKDt4EKdG8vacb78jf+FCIrdtRaHV4v/uO7ZqcHBty+4b5ddjv1JoLGREvRHUdr94rulo\n7lGWJC3h5aYvo1frmV06lMKR0yn5tiG6Zs1Q+ftj2bIFgFRvBUuawb4m7vzU7SvqetatsjaaTRZy\n00rwDHBGqVZwYncmR7dnULdNAGoHJdEtby6893L88uEuTAbLReuGvNUcj4A7rx6InZqHPcj6RlGq\nLi5lurFisrTRI1V6mSKDCYD76vkx9YGGtKldeQO8zUlZtPloHUcyiujTMIBPBsddtN2clYW1vByA\n/IULSR4yFOPp0wB4PPoI4b8uRKqoHa0ODKzWWs8F5QVM2TmFd7a+w/aM7bYKcheyP3s/K0+t5PTJ\nv8l46y0KPvgYXbt2mLOyONqkKQW//orSzY3Z77bihccVSPd14q8hm25aJIrzytmzOpmiXLkw0On9\nOfzywS5y0iqsTnqGMXxSyyqvNZ20OxNjmZw41+nhaLTOcu1yRxcNo6a1tYuEnVuGvUdxvVjMMHcQ\nNH8KonrI65Y+I4fEhrQCvW+VXWrKqkRWHcpgxbNtcdQoGRQfVOlj52xL5o0lsmvoY63CeLtPXbBa\nsZrNKBwcKN3zN8lDhxI040sAnDt1JtDTE5WPDwCa4OAqu4+rkVGSwVf7v+K3E79hsBh4KOohJjab\niFKhlOsuJK/GyaKiXa0uDKwzkEaLDmN4exgGwKVPb8pPnCRtvBxQ4NSmNR8OlNiUuY0mvk34X+f/\nVbodFosVq0Wg1igpyjWw/scjNOoaSnBdDwwlRrYuPoGbjxN6Dy0Bddzo8UQ9W+a0Vqeu0t+J0WBm\n39qz7PjtFI17hNKgQxDblpzEUGwirIEXvcY0qNLr2bFzLexCcb0UZ4ChQC5EBGA2wv6f5J8Hfl2l\nl2of6Y1VcM3J6n/z654Um0h8+lBD+jYKwlJYyInuPfB84gk8RzyGtl4s3s8/j0PtOpB0HLWvD+pu\n3aq0/VfDbDXbJqJXnFzBfRH3MTR6KFEeUbZSpua8PGasmYxHWjHNhv6MNjISD/8wLGPHYExJpXDp\nUgCcmjTB/aPJjNozgcTMRFr6t2R6x+lXvLawCkoyBTmpxXgGOmMoMTHrlc206B9BXJcQHJxUGErM\nmE1yr8bDX8eoaW1tguDkoqFWY58q/50k7c4kcWs6qcfzMZdbCIx0I/lgNntWyZmBtRr70H203bfJ\nzq3HLhTXi2sQPLH+fOWfffPBYoSwdvK2m+RIeiHHzhXRLy6Q5hGeNI+ofNau1Sr4eM1Rvkw4AcDc\npAVELNsFjd5G6eKC28ABaGNke2yFRoPXU0/KByYdv+l2V5acshw+2fMJmWWZfNn5S/x0fqx/cD1O\nannOZdXpVXx34DtmuD5Fzuvv8IK1gLAmHVG5u8sCIklkf/4FAEoPD0J/mIWmdm2eW/8cibmJOCgd\nmNF1Bgrp4lHVXb+fRufqQEwrf5DgzF8CZ3Mq7YdGodWpadQ9xBY5pNGqePC185UIFUoFWl31jNIW\nZpeh99AiKSRyUospyCojurkfoQ08WT3zIGaTFa9gZ1oPrE1Q9K13ILZjB+xCcX1YLXKZTaX6/IT1\nXxVzE53fqpJLfLYuib1n8+ke63fd9t4HPpqOy587oOlwWtf2pI5PY1QXFPXxmTDhKkdXPyWmEkat\nHkVyUTLDY4ZjFmbUkprssmzchBsuGhdcNa7o0vI58u5Y/P1r03zKTLQxMZTt3cvZp8dgOHgQhU6H\nz4TxFHZpyqqCQ7z14yAUZiX1neKZN3gWAH98fwiAriPkN/BT+7LxDNAR08ofSZIIbS/RtFu4rW3N\n+0Tcst9DcZ6BDfOPkXGigPJSE837RRDfI4ymvcNp3jeCkoJyZr2yGYAOw6KIbRt4jTPasVO92IXi\neji5Hn4dDY8uA7/6kHUU8pNlK/GbqIUthKDcbEWrVvLBwPqUGS2VEomihAQKFi/BY8pUnBxUbD6R\ngwRE+zrz/WPN0Kha3HCbqhohBG9ufpNThaeY2XUmLfzltqUXp9NnSR+ebfQsj9d/nJYBLamjeADL\nwBxcH3qQzI8+omTDRtt5PEaMQBrxAIMXvoB+1lqO+mwH4P7Tz1JHeX5Yxs3n4qiwgS/Ho7hgCM/J\nS06Iu5UIIVj/YyIn92ZhMVuJbO6Hk4uGqOZylJRCIZFxsoBfp+wGoH6HILtI2LkjsAvF9eDkCZE9\nwLOinOScgfL3FmOufMw1EEIw/pd95JYY+fbRprho1bhoLz85Wn7yFHlz5uD93DiUrq5Y8vIpPZ7E\nkx/8xiGDBrxagldL9j3ZCo3qzgpo++HQD/yR/AcTmkygxFjCvCPzGBozFH9nf95u/iax605TlLUO\nfadOeI0eTfqbb3KiVx8UQnZ2za7Vjvz2j5DZ8yjTf+9Ly6z+1D3XiheGjKCuV11KTgtM5ecjpZr2\nCr/o+orrnOepDiRJwtXHkaBoD1r0i8Dtgmp1acfzWfnlflsNiegWfrQbfGvqgdixcy3sQnE9BDSC\n++UoIQrToOCs/PNN+DpJkkSTUA/yy4z8+1lmKSqiYNkydC1b4hARgaUgn/zFi3Hp2QOnpk1R39eL\nF1M8OZFZDBW12Ha/0QVXp6qNwqkKWga25EnTkzxS9xFe3/Q6x/OPMzh6MOazKTR++1eKDhzh1P0a\nYlq0JmX4UE7munC07X/pG3OSwOef4ruFiziz7TjLd3wJKjgWuoX/m/A6Op2cv+JevZVJb4qSgnLO\nHMohplUA8T3CLtm+/PN9JB/IsS03uS+M5n1v3VCYHTvXokYJRbWaAuYlg0p7Pvz1p4rs6/u/uqEE\nu71n8zFZrDQN82Boc9nITVitlGzfjsJZj2O9WITJxLnJ7+Pzyss4RETg2LChnADn4IDZYuW5Bfs4\nnFZIRZIuvz7dCk/nqvMSqgoMZgM7MnbwxqY3WNB7AZIkMbH5RKyFSjZO+R3XJdNxshQivfABG3c5\nUNq+P65Fp3F2DqZevAseQ0axMWUj00vfgQagV+tZ0HMeddzr3O5bqxSn92fz5w+HsRithMR6XuT1\ntHH+UQ5sSLUtx/cIpUV/u/OrnTuPGiUU1WoKmPChnCsxIUlOtsuUJ0uJuf4qaFar4LVFB1ArJX4Z\nVBtLTg6OsfL4euqL49G1bk3gx1NQeXjI1d4C5OJDkkKB5OBAmdHCEz/u4q/j2bZztojwID70zrFy\nSMxNBKOC6bs/wUnnQCt9OxI+PU2rPhrC6nuRdvQQh09qiI9uTuz7Y0j/8jvi9u1GV5qOOiiIxnN/\nRO3rS7GxmGcWPwPAZ50+o31w+9t8Z5XDUGJi54pT7F+XglewM91GxdpEwmoVfDlmvW1fhUriwVeb\n4hlYff5gduzcDDVKKKqV1s9BVE9ZJIqzwFQGLgGgqXzJUKtVYDWbsaSmMGN4PM5aFWmPP4YwmQhf\n+AuSQkHIN1+jCQ21HfOPSFyIg0phi84FeLN3XUa1Cb9kv1uJsApOH8xB56pB42dl5LLHGbrtHYpD\nVHR7oA29fLqxfPtOilathvrD8G9Zl0GHtmM8XMKJTp0B8AB8Xn4Zz5EjALk30vkXeVuH4A53jUhY\nLFZ+mryD4vxy6rUPpPWg2qgqghMSt6az9ocjtn0f+6h1lTrK2rFTHdiForL4RMtfACtfkr8HVM4V\n1FJQgNVZz9Nz9jBgwxxqHdxK5JbNSCoV2pdfQqE7b8WgrXtluwmLVZCWX4ZGpWBTktybeKNXzC0V\niQtrXmxdcgK9uwP12gexOnkNx78Br1gHZrq9Q5FUwIk6m3jEIYLoD1dyasc71DWZkLRaLE/2oTzp\nBDn//fj8iSWJ8CVL0EZFVtyrhaZzz0eS/bfDf2/ZPd4IZpOFpN2ZRDX3Q6lU0GpgbTz8dbZeQsbJ\nAhZP3YO1YpxQ5+bAw++3RGkvVWrnLsAuFJVh/8/gWUu2FQc4XFFr4b6pl91dWOWJZUmhIH/RYtLf\neIPa69cT7OFISaee+D/Yw5aw948J37WwWgX//eMo328+jbXi2En9Ynm4ZdiN39c1KCs2UlpgtD3s\nVs08gBDQ8ym5pnTqiRy8/eUktbSSVHa32M6k7m9x4lhnuoR1JXLDac698y7GoCDchw1D16YNTk3i\nyfrf/8j99jsAHBs1Imz+vEuu/d6283Xo9j+yv9pLlN4MBzemsvv30xTnlaN31xIY5U6dJuetXPas\nTmbr4hO25XaDI6nf4eaTM+3YuVXYheJaWC2w+jWI7C4LxckEeb3KUa6R/S/KDh3i7JNPEThtGrrm\nzTjuFYbHqCeQVEre7hMLXL8FQ7nZwuM/XDwnAfBg06r1Y0o9lkd2SjENO8nnXf9jInkZpQx7V855\n8A13hYrn9b6sfXzkM5bp7adTbAwkWOnNFHUnSp95ibH9+uHesgWWXrE4hITg1KIFkkJ+cz71wIMY\nDhwAwO2BQfhPmnRJO9aeWcui44sA2Dls5x0tEke3Z7Bh3lF8QvV0fjSGwKjz80TnThey8MNdtmV7\n8pyduxW7UFwLhRKe3Q1G2aqbw7K/EAO+AuQQ1pSnx+Davx9ugwahCQ1D17w5Cp2OUqOZpzZk0zyi\nDV94Vt6K40IsVsGLP+27RCSOvNfjhsqXGg1mNFr5Yz+2I4PDm9JwbST3UE4fyOHQX6nU7xCEQiHR\nuHsoZpPcOxJCYG2YVeHqGoJWqSXGK4YFqz5m99okWh+ykFMOmvBwFM5yD0Sp16Nr1cp27dPDhttE\nIvTH2Tg1vXyS4vPrnwfgg7YfoFVpr/seqwOL2UpZkZHSQiMuXo5odWp2rjjFjt9O4Rvuwv3jG6Os\nyF3Zvz6FrYuSbL87gF5jGxBWv/LOv3bs3EnYhaIyaF3lL4DkrWTscUEVkIFXXVA4O6PQ6Wx23Epn\nHf4ff2xL8Prm0SZEeN94NMvy/WmsOJBuW972amf8XCv38DQUm0hLyic4xgO1g5LDm9JYPyeREVPa\n4OSikUe/pPP+hk3uC6NF3whb2/0iLq45MXnbZNy17vg7+zN85XAMFgMf/6wmKA2sHVsTOPxx9E2b\nX7YHkPba65TtljOO62zehOoywllmLqPfkn625d4RvSt1n9WFocTEwY2pHP4rzWYxDvLQW0ScN4GR\n7rR9SE10Sz+bSKydfYTELec/r86PxRDdourrU9ixcyuxC8XVMJXBoicoKG2MsUiF97hnIesI5nIf\npBw5QUqSJIJnzrAdUmQwMWbuHu5vFMiAxkE0Crm5kNXMwvMPqJ2vd8Fbf+UImYKsMvatO0uDDkG4\n+TqRfrKA32ccYMBL8fjXcsU33IXmfSP4xy8vqrkfUc39SEhIAMDB8eI/h7XJa/nh8A982+1b1Eo1\n0zpMw7tcS9FHXzBv5Az0voG4tylB5eV11UJGBcuWUbBIHkoKnTf3siKRa8il/U/no5rWP7j+kn1u\nNUaDmR2/nSIoyo2Y1v44uWhwctHYzAMD6rgRUMcNkKO+DmxIsYnEgAmN8a/tdtvabsdOVWIXistQ\ndvAQxQkJeD/QEVL3UJauo+xkNl6PPYgEBHW2wsuvXvZYrVqJQpJsSXA3yvL9aUT56nl/ZSIAP4xs\nhrfegdJCI5ICHJ01FOaUseLz/TTvE0FEI2+sFitHtqQTEuOBm68TAXXcGPhyPF5Bco/GM9D5mrH6\nGSUZ6DV6dGodGqUGCYkcQw46tY59C7+i1sw/0JSZCOzYEX1EPFwhP0yYTKSOn0Dxhg2IiuJI4UuX\n2qKaLiS7LJuOP3e0LW94aAMe2lvvlGqxWDmwPoXM5CK6jYrFxdORR95vhbP71cNXhRD89P5OclLl\nQkZtHqhjFwk7NQq7UFyGsn17yfn6a9wefAD18wfwNZnkoaW/58o7+Na75JitJ3JoEOSKzkHFrBFN\nb2oC9mxuKa8s3I8QEGNUUre2O+0jvSkvM/P9y5to0V92G3Vy0eDi5YhaK89VuPk68cT/tUOqGDpy\ncFRdMnx0NdKK0+i1qBfPxz/Po7GP0iawDVEeUSzY+S1On8+n9X4TmUHO1P9+NvrYuCue53i79pgz\nMy9a5/fO25cViTxD3kUise+RfZdYhN8KhFXw26d7ST2aT2h9T0xGC2qN8poiAfDlmPW2vJZH/tMK\nvcedMa9ix05VYReKCzCePo0yPR23/v1x698fhZMTSJJt/oGDC+Xvsf0vOi4tv4xHvtvOyNbhvHpf\nzHWLhNViRVERTz9j+i7WJudQ6mBBCOhYpiXe2QWQH/wdhkXZHv4qtfKiameSJNmikirLptRNbCna\nQgc6EOAcwISmE+gQ3AFTRgar87bw1q7JjFxRTsuDAjHyQdq98AaS+vJeUlaDgfxFi2wioe/RA/9J\n76HU6y+7/4U9iQjXCJb2X3p9jb9OhBCUl5opyS+nLOd8l2/XylOcOZxLelIBTXvJdt+V/QxXfXXA\nJhIjp7bB0fnWOtLasXMrsAvFBWS8/x9cz55FMWQIHFoC6ybD8F/BvSJT+sQ6+XtUL+B88lmAmyMz\nhsfTohJFhopyDZQUlONXMc69/LN9CAF9nm1IUmYRx0/k4aFRIjCDBF3HNaBBnfPnrYrwSovVglIh\n90KWJi1lX9E+JoqJSFZBq1UpFC4bSmF6JjGfTGZAnQH0+aAvPsUKHOtf2pMy5+VxZsRIyhMTL1of\ntnAhjvWuHAoshLCJhL/Ov1pFwlBsIuVoHjtXnCI3TY5e07gAFea/mclFlJeaaXl/LRp1C6mUSBze\nlMaWRUk2t9eH329pFwk7NRa7UFyA99gxnN25U17QuoB31Pmqdf+8Nio1oPchu7ic5xfsZUL3KOKC\n3egcc/la2WcO5ZB5pogmPcMA2PzLcbJTihk+qSUAYfXPi8AfhzNZojdhqZjg+PPFdtT2ufzb+I2y\nOXUzb215i3n3zcNX58trzV9jz9Y9UGbg7IQJGNat50ysN01HvIq+QSve8B942fOUJyWR++Mc8n/6\nybZO16olDlHRODVrelWR2JG+g1FrRtmW1wxaU3U3CJQWGkk9lkdAbTd0bg6c3JfF+h8TUTkoCYn1\nJLqlH8dPH7btf9/Tla9BLayCPWuS2bbkpG1dv+fjcPF0rNJ7sGPnTsIuFBfgGBeHKT9fXqjVSf76\nh2Or5O9txwOgkCQyiwxkFJRR4uKIk4sGSZI4siWdAwkpPDCxCZJCIvVYHoc3pdO4eygKhUR8zzCb\njQNAvfbnM3TDvXQ2kdj4UkdCPCvvI3U1ThWcQq1QE6QPItQllBiPGMrMZQC4a91RSkrSXnmF4vUJ\nfN9VQefxr+ER1uOK50t54QWKfl9lW9Z360bgJ9Ov+SZeYiph3Lpx7MjYAfx/e+ceXVV15/HPlyTk\nBZhIghAUgvIQQXmJVUEetUhkHBClCB1tGS1Uqy21rWuxStthtK2OdPpwYGnlIfXBFKSDzaBWpIgg\n8khU5BUQBJQA8nIEQiAJyW/+OCfXS0huLiQ3Mffuz1p3rbP32Wfv3+++fmfvffZ3Q3yzeNaMX1MP\nHnqcLipj5YKP2JF3EPhygVunXhlc3K4fmR1bBiQz9hUVhKqqWnbkH2Tp7C2B9MCxXQKLEx2OaMYF\niiBKdu4kvrAQyk6DmkF80FDCuzMAWNNsEOlrDnB5n0xe++FNbFt9gHkzVgfE3RISvQnQ0tNnSExJ\noP8/deL6UVcEJpgzO5zdQygrr2Dq4k2M7N2e+1/01hk8NqpHvQWJ4rJixi0Zx/Ds4Tw64FEubXkp\nM26ecU65g+OH8se0t8jOuYOcGoJExcmTbO93bSB9yc9/TtrYb9Ksee1DLlPfmUrux7mB9J1d7mTa\njdPO36Ea2PXBYVbM30ZJ8Rn6Du9Ap96Zgfc6uUXzCx4WMjNOnShj/ZLdbFnpSYKnt03h1vuvJr1t\nai1XOxzRgQsUQRz8jydptXcv9ErC/ud+9OBavqjI4r3X99BnVyGf6Ap+9rdjjDlZQKuMZLK6pNG+\naxo33dUlsOCqc782dO7XJlBnfPOaV0+XnCnnwZc+YFnBQRbmF3rXt2lRZ/2mFXtXkPdZHo/0f4SU\nhBSmD55Oj9bnDgWdWL6c4vz3ONm3O48dnklK3048c92Uaus8vnQp+344OZDump9PXIvQf5RmxpzN\nc5hfMJ/Dpw4D0CuzFy/c+kKdngorOXWGY4eKOXb4FNlXZ5CQGMe2tQdITUtk5OQ+gceB68qpolLm\n/vSds/JuGH0FfYd3rOEKhyM6cYEiiMzJk9mx6n3+/GIGN17573RJ7whHyvhky1E6x6XTu9VuvpfT\nncGXXswl/nqE9LapF3RnebSohLvnrKfgwHGaCSoM4pqJ1yffdEG2nyw7SUp8CpLY/vl2Vu1bxYO9\nHyQlIYVBlw46q6yZ8flz8zg0fTpJPXtyonsmvTJ7cW/Pe0lJOLcnU7JjRyBIpPTvT4d5z6G40PIh\nFVZBr+d7nZX315F/pWv6hW/veXRfEWsWf8wnm7/cDW7sz/qT2cHTWYpPjKsXNdaKCmP58wVsX/sZ\nAGomBmwBkCgAAAtXSURBVNzZmR6DsgJy4Q5HLPGVDxSSugOTgQzgH2b2dKTaSu7ZAx08RFZiJqkD\nvwVxCRQnlrH68hJGHNiDLuvPuBuz66WtJ/++nYIDxxndJ4vFH+wH4KNf3UrcBeztvPHwRia9OYmn\nhj7Fde2uY0LPCUy8ZmK16xGsrIzPHn2ML15+mZY5OaT/6pe0zf+Q3w2ZUG3dFSUl7PrnkYCn9Nrx\nhedrtWfu5rk8veHLj+nd8e+SmpBap/URRwqLWPjr9SQkxXPtiGwyL2vJRW2SSWvjBbbEetr+9fTJ\nMub8ZFUgnX1NBiMeuPorLUzocESaiAYKSXOB24BDZtYzKD8H+CMQB8w2sydqqsPMCoD7JTUDZkXS\n3v3vbOZMwQFuGd8B0r3HV4+fPsOm/cfZZe1oWykzXkfMjFbJ8Uy8qROzVu0GPA2n8wkSW45uobS8\nlD5t+tDt4m7kZOfQOtl7gioxruZFYoWTf0TR8uWkT5rIkptb8uKro3m49cPV21lRwfZe3sK6xO7d\nq5UDD+Zk2UmGLRrGidITgbz8u/ND2hOK0tNnOLjnOJddeTGt26cycGwXuvZvS1KLyOwJXlZaflaQ\nmPiHQQEBRYcjlon0r2AeMAMI3IZKigNmAsOAQiBPUi5e0Hi8yvX3mtkhSSOBKX5dEWP1CxsoLgGO\n9OWzQU/Q9usPcGXbVqzMmknSZ1uh0/Ra6wgHSYzpdxnD/7ASgPSUhLCF/sALNFNWTiEzJZO5w+eS\nGJcY9sRw2h2jKRnYmx9f9BabNmxiWMdhxJWfO5xipaXsun10IN1p4YJzylTl+vnXB44X3raQ7q27\nh2VTVcrLK9i6aj95r+6mrKSc7zw+gKTUBK4ZGrknjLas2seKl7YH0t9/eqjrRTgcPhENFGa2UlJ2\nlezrgJ1mtgtA0l+AUWb2OF7vo7p6coFcSa8CoW9r68CAe3pT8H4eGzv9mofeTOTxDkcY0DmDpJPe\n0BAX133j+9c2HSAtJYFvzVoHwEXJCbz/i2G1Xvf23reZv20+M2+eSXyzeH47+LdktTh3m9TqKM7P\np/TTvaTdMZrkrw9h8iu/59iJY0wfNJ2cTjkBUUDwehEnli07Z+K6ptXYlRw99eW8QV02Gtqz6Qir\nF+3ki4PFZHVJ48Y7OpOUGpkeBMDegs9ZvWgHR/d5C/FaZSRx92M3uCDhcAQhszqq19XWgBcollQO\nPUkaA+SY2Xf99D3A18zsoRquHwLcASQCG81sZg3lJgGT/GQ3YHt15cIgAzhSa6nowvkcGzifo5+6\n+tvRzDKrZjbGAGx1t2o1RiszWwGsqK1SM3sWePaCrfKRlG9m19ZeMnpwPscGzufoJ1L+NsbO7oVA\n8GDzpcD+RrDD4XA4HGHQGIEiD+giqZOk5sA4ILeWaxwOh8PRSEQ0UEj6b2AN0E1SoaT7zOwM8BDw\nBlAALDSzLaHqaWDqPHzVBHE+xwbO5+gnIv5GfDLb4XA4HE2bxhh6cjgcDkcTwgUKh8PhcIQkZgOF\npBxJ2yXtlHSOZKqkREkL/PPrqlk42OQIw+cfS9oqaaOkf0hq8jKptfkcVG6MJJPUpB+lDMdfSWP9\nz3mLpIgtYG0owvhed5D0lqQP/O/2iMawsz6RNFfSIUmbazgvSU/578lGSX3r1KCZxdwLTy7kY+By\noDnwIXBVlTLfB57xj8cBCxrb7gbweSiQ4h8/EAs+++VaAiuBtcC1jW13hD/jLsAHQLqfbtPYdjeA\nz88CD/jHVwF7GtvuevB7ENAX2FzD+RHA63jr1q4H1tWlvVjtUQRkRMysFPgLMKpKmVHAn/3jRcDN\natq6DrX6bGZvmVmxn1yLt8alKRPO5wzwGPAkcLohjYsA4fg7EZhpZv8HYGaHGtjG+iYcnw1o5R9f\nRBSs2zKzlcDnIYqMAp43j7VAmqR2F9perAaK9sDeoHShn1dtGfMe6T0GtKbpEo7PwdyHd0fSlKnV\nZ0l9gMvMbElDGhYhwvmMuwJdJa2WtNZXcm7KhOPzNOBuSYXAa8APGsa0RuV8f+8hiVUN5XBkRM5L\naqQJELY/ku4GrgUGR9SiyBPSZ1+6/vfAhIYyKMKE8xnH4w0/DcHrMa6S1NPMvoiwbZEiHJ/HA/PM\n7D8l3QC84PtcEXnzGo16/f+K1R5FODIigTKS4vG6rKG6el91wpJOkfQNYCow0sxKGsi2SFGbzy2B\nnsAKSXvwxnJzm/CEdrjf67+ZWZmZ7cYTz+zSQPZFgnB8vg9YCGBma4AkPPG8aKZepZJiNVCEIyOS\nC3zHPx4DLDd/lqiJUqvP/jDMn/CCRFMfu4ZafDazY2aWYWbZZpaNNy8z0szyG8fcOhPO9/oVvIcW\nkJSBNxS1q0GtrF/C8flT4GYI7JiZBBxuUCsbnlzg2/7TT9cDx8zswIVWFpNDT2Z2RlKljEgcMNfM\ntkh6FMg3b/+LOXhd1J14PYlxjWdx3QnT5+lAC+Blf97+UzMb2WhG15EwfY4awvT3DeAWSVuBcuAR\nMztac61fbcL0+SfALEkP4w2/TGjiN32V8khDgAx/7uXfgAQAM3sGby5mBLATKAb+tU7tNfH3y+Fw\nOBwRJlaHnhwOh8MRJi5QOBwOhyMkLlA4HA6HIyQuUDgcDocjJC5QOBwOhyMkLlA4ogpJU31V1I2S\nNkj6mp8/W9JVEWivqIb8cr/9ytcUP/8m374NkpIlTffT0yXdL+nbIdrKkrSovn1wOGrDPR7riBp8\neYbfAUPMrMRfUNbczCImAiepyMxanEf+M3hKns/56eNAZhSsgndEMa5H4Ygm2gFHKv90zexIZZCQ\ntKJSmkPSfZI+8vNmSZrh58/zNfzflbRL0hg/v4W8/Tnel7RJUnUKtLUi6bvAWOCXkl6SlAukAusk\n3SVpmqSf+mU7S1om6UO/3SskZVfuPyApzu+F5Pm9p+/5+UN8vxZJ2ua3I/9cf9+3DyWtl9RS0ipJ\nvYNsXC3pmgvxzxG9xOTKbEfUshTvT/gjYBnefhpvBxeQlAX8Ak/L/wSwHG8Pg0raAQOBK/FkEBbh\nyY+PNrPjfi9lraTcWlb3JkvaEJR+3MxmSxoILDGzRb49RWbW2z+eFlT+JeAJM1ssKQnvpq5N0Pn7\n8GQZ+ktKBFZLWuqf6wP0wNP2WQ0MkLQeWADcZWZ5kloBp4DZeKKIP5LUFUg0s40h/HLEIK5H4Yga\nzKwI6AdMwtPyWSBpQpVi1wFvm9nnZlYGvFzl/CtmVmFmW4FL/DwBv5G0ES8AtQ86VxOnzKx30GtB\nuH5Iagm0N7PFvl+ng/YJqeQWPC2fDcA6PAn8SnG/9WZW6KujbgCygW7AATPL8+s87svnvwzcJikB\nuBeYF66djtjB9SgcUYWZlQMr8BRhN+EJO84LKlLb5lPBcwWVZf8FyAT6mVmZPKXZpPqwtwbC2SBL\nwA/M7I2zMqUhnO1DOd7vXFQjM21mxZLexNvoZiyevLzDcRauR+GIGiR1kxQsmd0b+KRKsfXAYEnp\n8uTj7wyj6ouAQ36QGApEdC9xMzsOFEq6HQL7t6dUKfYG8IDfE0BSV0mpIardBmRJ6u+Xb+n7D97w\n01NAnpk1ZSl9R4RwPQpHNNEC+C9JacAZPOXMScEFzGyfpN/gDdfsB7bi7V4YipeA/5WUjzeUsy0M\nW6rOUfzdzKaE5wYA9wB/8lVQy4BvAsEb7czGG1J635+sPgzcXlNlZlYq6S689ycZb37iG0CRmb3n\nP3313HnY54gh3OOxjphDUgszK/LvqBfjSVMvbmy7Ggt/gn8FcGWU7/rmuEDc0JMjFpnm3+1vBnbj\nbeYTk/gL/NYBU12QcNSE61E4HA6HIySuR+FwOByOkLhA4XA4HI6QuEDhcDgcjpC4QOFwOByOkLhA\n4XA4HI6Q/D/Ddy8ihKbUrAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import roc_curve\n",
"def roc(y_true, y, linestyle):\n",
" for i in range(5):\n",
" fpr, tpr, _ = roc_curve(y_true[:,i], y[:,i])\n",
" plt.plot(tpr, fpr, linestyle=linestyle)\n",
" \n",
"roc(y_test, y, '-')\n",
"plt.gca().set_prop_cycle(None)\n",
"roc(y_test, y_new, '--')\n",
"plt.gca().set_prop_cycle(None)\n",
"roc(y_test, y_old, ':')\n",
"plt.semilogy()\n",
"plt.xlabel(\"Signal Efficiency\")\n",
"plt.ylabel(\"Background Efficiency\")\n",
"plt.ylim(0.001,1)\n",
"plt.grid(True)\n",
"\n",
"from matplotlib.lines import Line2D\n",
"lines = [Line2D([0], [0], ls='-'),\n",
" Line2D([0], [0], ls='--'),\n",
" Line2D([0], [0], ls=':')]\n",
"plt.legend(lines, ['Keras', 'PR 195', 'v0.2.0'])\n",
"plt.savefig('ROC.png')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 1 solution(s) in softmax_new//myproject_prj.\n",
"Reports for solution \"solution1\":\n",
"\n",
"C SIMULATION RESULT:\n",
"INFO: [SIM 2] *************** CSIM start ***************\n",
"INFO: [SIM 4] CSIM will launch GCC as the compiler.\n",
" Compiling ../../../../myproject_test.cpp in debug mode\n",
" Compiling ../../../../firmware/myproject.cpp in debug mode\n",
" Generating csim.exe\n",
"INFO: Unable to open input/predictions file, using default input.\n",
"0.199219 0.199219 0.199219 0.199219 0.199219 \n",
"INFO: Saved inference results to file: tb_data/csim_results.log\n",
"INFO: [SIM 1] CSim done with 0 errors.\n",
"INFO: [SIM 3] *************** CSIM finish ***************\n",
"\n",
"SYNTHESIS REPORT:\n",
"================================================================\n",
"== Vivado HLS Report for 'myproject'\n",
"================================================================\n",
"* Date: Thu Jun 4 03:45:13 2020\n",
"\n",
"* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n",
"* Project: myproject_prj\n",
"* Solution: solution1\n",
"* Product family: kintexu\n",
"* Target device: xcku115-flvb2104-2-i\n",
"\n",
"\n",
"================================================================\n",
"== Performance Estimates\n",
"================================================================\n",
"+ Timing: \n",
" * Summary: \n",
" +--------+---------+----------+------------+\n",
" | Clock | Target | Estimated| Uncertainty|\n",
" +--------+---------+----------+------------+\n",
" |ap_clk | 5.00 ns | 3.789 ns | 0.62 ns |\n",
" +--------+---------+----------+------------+\n",
"\n",
"+ Latency: \n",
" * Summary: \n",
" +---------+---------+-----------+-----------+-----+-----+----------+\n",
" | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n",
" | min | max | min | max | min | max | Type |\n",
" +---------+---------+-----------+-----------+-----+-----+----------+\n",
" | 5| 5| 25.000 ns | 25.000 ns | 1| 1| function |\n",
" +---------+---------+-----------+-----------+-----+-----+----------+\n",
"\n",
" + Detail: \n",
" * Instance: \n",
" +--------------------+---------+---------+---------+-----------+-----------+-----+-----+----------+\n",
" | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n",
" | Instance | Module | min | max | min | max | min | max | Type |\n",
" +--------------------+---------+---------+---------+-----------+-----------+-----+-----+----------+\n",
" |grp_softmax_fu_107 |softmax | 5| 5| 25.000 ns | 25.000 ns | 1| 1| function |\n",
" +--------------------+---------+---------+---------+-----------+-----------+-----+-----+----------+\n",
"\n",
" * Loop: \n",
" N/A\n",
"\n",
"\n",
"\n",
"================================================================\n",
"== Utilization Estimates\n",
"================================================================\n",
"* Summary: \n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"| Name | BRAM_18K| DSP48E| FF | LUT | URAM|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|DSP | -| -| -| -| -|\n",
"|Expression | -| -| 0| 6| -|\n",
"|FIFO | -| -| -| -| -|\n",
"|Instance | 4| 5| 240| 123| -|\n",
"|Memory | -| -| -| -| -|\n",
"|Multiplexer | -| -| -| 36| -|\n",
"|Register | -| -| 87| -| -|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Total | 4| 5| 327| 165| 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Available SLR | 2160| 2760| 663360| 331680| 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Utilization SLR (%) | ~0 | ~0 | ~0 | ~0 | 100|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Available | 4320| 5520| 1326720| 663360| 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Utilization (%) | ~0 | ~0 | ~0 | ~0 | 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"\n",
"+ Detail: \n",
" * Instance: \n",
" +--------------------+---------+---------+-------+-----+-----+-----+\n",
" | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n",
" +--------------------+---------+---------+-------+-----+-----+-----+\n",
" |grp_softmax_fu_107 |softmax | 4| 5| 240| 123| 0|\n",
" +--------------------+---------+---------+-------+-----+-----+-----+\n",
" |Total | | 4| 5| 240| 123| 0|\n",
" +--------------------+---------+---------+-------+-----+-----+-----+\n",
"\n"
]
}
],
"source": [
"hls4ml.report.read_vivado_report('softmax_new/')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 1 solution(s) in softmax_old//myproject_prj.\n",
"Reports for solution \"solution1\":\n",
"\n",
"C SIMULATION RESULT:\n",
"INFO: [SIM 2] *************** CSIM start ***************\n",
"INFO: [SIM 4] CSIM will launch GCC as the compiler.\n",
" Compiling ../../../../myproject_test.cpp in debug mode\n",
" Compiling ../../../../firmware/myproject.cpp in debug mode\n",
" Generating csim.exe\n",
"INFO: Unable to open input/predictions file, using default input.\n",
"0.199219 0.199219 0.199219 0.199219 0.199219 \n",
"INFO: Saved inference results to file: tb_data/csim_results.log\n",
"INFO: [SIM 1] CSim done with 0 errors.\n",
"INFO: [SIM 3] *************** CSIM finish ***************\n",
"\n",
"SYNTHESIS REPORT:\n",
"================================================================\n",
"== Vivado HLS Report for 'myproject'\n",
"================================================================\n",
"* Date: Thu Jun 4 03:46:27 2020\n",
"\n",
"* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n",
"* Project: myproject_prj\n",
"* Solution: solution1\n",
"* Product family: kintexu\n",
"* Target device: xcku115-flvb2104-2-i\n",
"\n",
"\n",
"================================================================\n",
"== Performance Estimates\n",
"================================================================\n",
"+ Timing: \n",
" * Summary: \n",
" +--------+---------+----------+------------+\n",
" | Clock | Target | Estimated| Uncertainty|\n",
" +--------+---------+----------+------------+\n",
" |ap_clk | 5.00 ns | 4.256 ns | 0.62 ns |\n",
" +--------+---------+----------+------------+\n",
"\n",
"+ Latency: \n",
" * Summary: \n",
" +---------+---------+-----------+-----------+-----+-----+----------+\n",
" | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n",
" | min | max | min | max | min | max | Type |\n",
" +---------+---------+-----------+-----------+-----+-----+----------+\n",
" | 6| 6| 30.000 ns | 30.000 ns | 1| 1| function |\n",
" +---------+---------+-----------+-----------+-----+-----+----------+\n",
"\n",
" + Detail: \n",
" * Instance: \n",
" +--------------------+---------+---------+---------+-----------+-----------+-----+-----+----------+\n",
" | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n",
" | Instance | Module | min | max | min | max | min | max | Type |\n",
" +--------------------+---------+---------+---------+-----------+-----------+-----+-----+----------+\n",
" |grp_softmax_fu_107 |softmax | 6| 6| 30.000 ns | 30.000 ns | 1| 1| function |\n",
" +--------------------+---------+---------+---------+-----------+-----------+-----+-----+----------+\n",
"\n",
" * Loop: \n",
" N/A\n",
"\n",
"\n",
"\n",
"================================================================\n",
"== Utilization Estimates\n",
"================================================================\n",
"* Summary: \n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"| Name | BRAM_18K| DSP48E| FF | LUT | URAM|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|DSP | -| -| -| -| -|\n",
"|Expression | -| -| 0| 6| -|\n",
"|FIFO | -| -| -| -| -|\n",
"|Instance | 13| -| 757| 4561| -|\n",
"|Memory | -| -| -| -| -|\n",
"|Multiplexer | -| -| -| 36| -|\n",
"|Register | -| -| 88| -| -|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Total | 13| 0| 845| 4603| 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Available SLR | 2160| 2760| 663360| 331680| 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Utilization SLR (%) | ~0 | 0| ~0 | 1| 100|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Available | 4320| 5520| 1326720| 663360| 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"|Utilization (%) | ~0 | 0| ~0 | ~0 | 0|\n",
"+---------------------+---------+-------+---------+--------+-----+\n",
"\n",
"+ Detail: \n",
" * Instance: \n",
" +--------------------+---------+---------+-------+-----+------+-----+\n",
" | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n",
" +--------------------+---------+---------+-------+-----+------+-----+\n",
" |grp_softmax_fu_107 |softmax | 13| 0| 757| 4561| 0|\n",
" +--------------------+---------+---------+-------+-----+------+-----+\n",
" |Total | | 13| 0| 757| 4561| 0|\n",
" +--------------------+---------+---------+-------+-----+------+-----+\n",
"\n"
]
}
],
"source": [
"hls4ml.report.read_vivado_report('softmax_old/')"
]
},
{
"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.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment