Programming Exercise 8: Anomaly Detection and Recommender Systems
\n",
"
Introduction
\n",
"In this exercise, we will implement the anomaly detection algorithm and apply it to detect failing servers on a network. In the second part, we will use collaborative filtering to build a recommender system for movies. To begin, we import necessary libraries. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# used for manipulating directory paths\n",
"import os\n",
"from os.path import join\n",
"\n",
"# Scientific and vector computation for python\n",
"import numpy as np\n",
"\n",
"# Plotting library\n",
"from matplotlib import pyplot\n",
"import matplotlib as mpl\n",
"\n",
"# Optimization module in scipy\n",
"from scipy import optimize\n",
"\n",
"# will be used to load MATLAB mat datafile format\n",
"from scipy.io import loadmat\n",
"\n",
"# tells matplotlib to embed plots within the notebook\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
1 Anomaly detection
\n",
"In this exercise, we will implement an anomaly detection algorithm to detect anomalous behavior in server computers. The features measure the throughput (mb/s) and latency (ms) of response of each server. Whil operating, we collected m = 307 example of how they were behaving. We suspect the vast majority are \"normal\", but there may be some anomalous examples.\n",
"\n",
"We will use a Gaussian model to detect anomalous example in the dataset. We begin on a 2D dataset to visualize what the algorithm is doing. The following cell will visualize the dataset."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# The following command loads the dataset.\n",
"data = loadmat(os.path.join('Data', 'ex8data1.mat'))\n",
"X, Xval, yval = data['X'], data['Xval'], data['yval'][:, 0]\n",
"\n",
"# Visualize the example dataset\n",
"pyplot.plot(X[:, 0], X[:, 1], 'bx', mew=2, mec='k', ms=6)\n",
"pyplot.axis([0, 30, 0, 30])\n",
"pyplot.xlabel('Latency (ms)')\n",
"pyplot.ylabel('Throughput (mb/s)')\n",
"pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To perform anomaly detection, we first need to fit a model to the data's distribution. To do so, we need to estimate the mean and variance parameters."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def estimateGaussian(X):\n",
" \"\"\"\n",
" This function estimates the parameters of a Gaussian distribution\n",
" using a provided dataset.\n",
" \n",
" Parameters\n",
" ----------\n",
" X : array_like\n",
" The dataset of shape (m x n) with each n-dimensional \n",
" data point in one row, and each total of m data points.\n",
" \n",
" Returns\n",
" -------\n",
" mu : array_like \n",
" A vector of shape (n,) containing the means of each dimension.\n",
" \n",
" sigma2 : array_like\n",
" A vector of shape (n,) containing the computed\n",
" variances of each dimension.\n",
" \"\"\"\n",
" m, n = X.shape\n",
" mu = np.zeros(n)\n",
" sigma2 = np.zeros(n)\n",
"\n",
" mu = np.mean(X, axis=0)\n",
" sigma2 = np.var(X, axis=0)\n",
" return mu, sigma2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following cells visualize this distribution and how our dataset falls into it."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def multivariateGaussian(X, mu, Sigma2):\n",
" \"\"\"\n",
" Computes the probability density function of the multivariate gaussian distribution.\n",
"\n",
" Parameters\n",
" ----------\n",
" X : array_like\n",
" The dataset of shape (m x n). Where there are m examples of n-dimensions.\n",
"\n",
" mu : array_like\n",
" A vector of shape (n,) contains the means for each dimension (feature).\n",
"\n",
" Sigma2 : array_like\n",
" Either a vector of shape (n,) containing the variances of independent features\n",
" (i.e. it is the diagonal of the correlation matrix), or the full\n",
" correlation matrix of shape (n x n) which can represent dependent features.\n",
"\n",
" Returns\n",
" ------\n",
" p : array_like\n",
" A vector of shape (m,) which contains the computed probabilities at each of the\n",
" provided examples.\n",
" \"\"\"\n",
" k = mu.size\n",
"\n",
" # if sigma is given as a diagonal, compute the matrix\n",
" if Sigma2.ndim == 1:\n",
" Sigma2 = np.diag(Sigma2)\n",
"\n",
" X = X - mu\n",
" p = (2 * np.pi) ** (- k / 2) * np.linalg.det(Sigma2) ** (-0.5)\\\n",
" * np.exp(-0.5 * np.sum(np.dot(X, np.linalg.pinv(Sigma2)) * X, axis=1))\n",
" return p"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def visualizeFit(X, mu, sigma2):\n",
" \"\"\"\n",
" Visualize the dataset and its estimated distribution.\n",
" This visualization shows you the probability density function of the Gaussian distribution.\n",
" Each example has a location (x1, x2) that depends on its feature values.\n",
"\n",
" Parameters\n",
" ----------\n",
" X : array_like\n",
" The dataset of shape (m x 2). Where there are m examples of 2-dimensions. We need at most\n",
" 2-D features to be able to visualize the distribution.\n",
"\n",
" mu : array_like\n",
" A vector of shape (n,) contains the means for each dimension (feature).\n",
"\n",
" sigma2 : array_like\n",
" Either a vector of shape (n,) containing the variances of independent features\n",
" (i.e. it is the diagonal of the correlation matrix), or the full\n",
" correlation matrix of shape (n x n) which can represent dependent features.\n",
" \"\"\"\n",
"\n",
" X1, X2 = np.meshgrid(np.arange(0, 35.5, 0.5), np.arange(0, 35.5, 0.5))\n",
" Z = multivariateGaussian(np.stack([X1.ravel(), X2.ravel()], axis=1), mu, sigma2)\n",
" Z = Z.reshape(X1.shape)\n",
"\n",
" pyplot.plot(X[:, 0], X[:, 1], 'bx', mec='b', mew=2, ms=8)\n",
"\n",
" if np.all(abs(Z) != np.inf):\n",
" pyplot.contour(X1, X2, Z, levels=10**(np.arange(-20., 1, 3)), zorder=100)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Estimate my and sigma2\n",
"mu, sigma2 = estimateGaussian(X)\n",
"\n",
"# Returns the density of the multivariate normal at each data point (row) \n",
"# of X\n",
"p = multivariateGaussian(X, mu, sigma2)\n",
"\n",
"# Visualize the fit\n",
"visualizeFit(X, mu, sigma2)\n",
"pyplot.xlabel('Latency (ms)')\n",
"pyplot.ylabel('Throughput (mb/s)')\n",
"pyplot.tight_layout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have estimated the Gaussian parameters, we can investigate which examples have a very high probability given this distribution and which examples have a very low probability. The low probability examples are more liekly to be the anomalies in our dataset. One way to determine which examples are anomalies is to select a threshold based on a cross-validation set. In this part of the exercise, we will implement an algorithm to select the threshold epsilon using the F1 score on a cross validation set. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def selectThreshold(yval, pval):\n",
" \"\"\"\n",
" Find the best threshold (epsilon) to use for selecting outliers based\n",
" on the results from a validation set and the ground truth.\n",
" \n",
" Parameters\n",
" ----------\n",
" yval : array_like\n",
" The ground truth labels of shape (m, ).\n",
" \n",
" pval : array_like\n",
" The precomputed vector of probabilities based on mu and sigma2 parameters. It's shape is also (m, ).\n",
" \n",
" Returns\n",
" -------\n",
" bestEpsilon : array_like\n",
" A vector of shape (n,) corresponding to the threshold value.\n",
" \n",
" bestF1 : float\n",
" The value for the best F1 score.\n",
" \"\"\"\n",
" bestEpsilon = 0\n",
" bestF1 = 0\n",
" F1 = 0\n",
" \n",
" for epsilon in np.linspace(1.01*min(pval), max(pval), 1000):\n",
" predictions = (pval < epsilon)\n",
" tp = np.sum((predictions == 1) & (yval == 1))\n",
" fp = np.sum((predictions == 1) & (yval == 0))\n",
" fn = np.sum((predictions == 0) & (yval == 1))\n",
" prec = tp / (tp + fp)\n",
" rec = tp / (tp + fn)\n",
" F1 = (2*prec*rec) / (prec + rec)\n",
"\n",
" if F1 > bestF1:\n",
" bestF1 = F1\n",
" bestEpsilon = epsilon\n",
"\n",
" return bestEpsilon, bestF1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following cell will run our threshold selection function and circle the anomalies in the plot."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best epsilon found using cross-validation: 9.00e-05\n",
"Best F1 on Cross Validation Set: 0.875000\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOyddXxUx9eHnxsPEJJAEgLB3YprcQhatAR3LVpKnZZCFagXqFKKu7sVintwCK4hIe6yycp5/9iQ0r607G4SCL/O8/kMm9y9M3Pukr3fOzNnztFEBIVCoVAocht2z9oAhUKhUCgehxIohUKhUORKlEApFAqFIleiBEqhUCgUuRIlUAqFQqHIlSiBUigUCkWuJMcEStM0F03TTmiadk7TtEuapn2UcXyBpmm3NU07m1Fq5JQNCoVCoXh+ccjBttOAliKSpGmaI3BI07TtGe+9JSJrcrBvhUKhUDzn5JhAiXkHcFLGr44ZRe0KVigUCoVFaDkZSULTNHvgFFAW+EFE3tE0bQHQEPMIaw/wroikPabuSGAkQN68eWtXrFgxx+xUKBQKRc5y6tSpKBHxtqZOjgpUZiea5gGsB8YD0UAY4ATMAW6KyMf/Vr9OnToSGBiY43YqFAqFImfQNO2UiNSxps5T8eITkThgH9BORB6ImTRgPlDvadigUCgUiueLnPTi884YOaFpmivgD1zRNK1wxjEN6ApczCkbFAqFQvH8kpNefIWBhRnrUHbAKhHZomnaH5qmeQMacBYYlYM2KBQKheI5JSe9+M4DNR9zvGVO9alQKBSK/x1UJAmFQqFQ5EqUQCkUCoUiV6IESqFQKBS5EiVQCoVCociVKIFSKBQKRa5ECZRCoVAociVKoBQKhUKRK1ECpVAoFIpciRIohUKhUORKlEApFAqFIleiBEqhUCgUuRIlUAqFQqHIlSiBUigUCkWuRAmUQqFQKHIlSqAUCoVCkStRAqVQKBSKXIkSKIVCoVDkSpRAKRQKhSJXogRKoVAoFLkSJVAKhUKhyJUogVIoFApFrkQJlEKhUChyJUqgFAqFQpErUQKlUCgUilxJjgmUpmkumqad0DTtnKZplzRN+yjjeClN045rmnZd07SVmqY55ZQNCoVCoXh+yckRVBrQUkSqAzWAdpqmNQA+B74VkXJALDAsB21QKBQKxXNKjgmUmEnK+NUxowjQEliTcXwh0DWnbFAoFArF80uOrkFpmmavadpZIAL4HbgJxImIIeOU+4DfP9QdqWlaoKZpgZGRkTlppkKhUChyITkqUCJiFJEaQFGgHlDpcaf9Q905IlJHROp4e3vnpJkKhUKhyIU8FS8+EYkD9gENAA9N0xwy3ioKhD4NGxQKhULxfJGTXnzemqZ5ZPzsCvgDl4G9QEDGaYOAjTllg0KhUCieXxyefIrNFAYWappmj1kIV4nIFk3TgoAVmqZ9CpwBfstBGxQKhULxnJJjAiUi54Gajzl+C/N6lEKhUCgU/4iKJKFQKBSKXIkSKIVCoVDkSpRAKRQKhSJXogRKoVAoFLkSJVAKhUKhyJUogVIoFApFrkQJlEKhUChyJUqgFAqFQpErUQKlUCgUilyJEiiFQqFQ5EpyMhafQvFMMegN6NMNmAxGjAYTRoMRo9GEmARNAzQNOzsNTdOws7fDwckBJxdHHBwd0DTtWZuvUPznUQKleG5ITdZx+/xd7l97QGx4PLHhccRFxhMbHk98ZAKpSTp0yWnoknWkpaRjNBht7svR2REnF0fy5HfFzTMfeT3ykM8jL/k881KgkAdFyvjiW7oQRcoUwrtoQewd7LPxShUKBSiBUuRSjAYjQUevEXT0GjfO3ubmmdvcv/YAkT/zWzq7OuFZyB2PQh54Fy2Iq5sLLnlccMnrjHMeZ1zyOOPo7IC9gz32DvbY2dth72CHpmmICCKYX02CyWhCn25An6YnXZeOPs1Aui6dlMRUkuOSSYxNJvxuJDfP3iHmQSwG/Z/iZ+9gT9HyhanlX4267WtSvVllnFycnsXHplD8T6E9+oXPrdSpU0cCAwOftRmKLCAipCSkEBMWR3xkArqUdNJT00nLKHpdOvp0A0a9kVsX7nJ862kSY5IA8CnuRdmapShboxRlapSkRJWiFPD1wDWf6zO5FqPRSHRIDKE3w3lwy1yun77F+f1BpOv0OLs6Ub1FFaq8WBGXvM44Ojng4OSAg6P51TWfC3nd85DXPQ/5PMyvrm6u2NmpJWHF/y6app0SkTrW1FEjKEW2k5aaxtm9lzi+5RQ3z98lNiyOmAexpKWmW1TfrUA+6r9Ui4ad6lCjRVXyF3TLYYutw97eHp/i3vgU96ZGi6qZx3UpaZzfH8TJ7Wc4ufMsJ7adsbhNl7zOlKxSjJJVi1O6WglKvVCc0tVLkL9A7rp2heJpokZQimwhNjyOo5tPcWxLIGd2X0CXkoZLXmcq1C1LwSKeFPD1pEBhTwr4euDhkx/nPM44uzrh5OpkfnVxzBxlOOdxwt7++V/TSU3WYUg3YEg3ZI4O09P06JJ0JMenkBSXnPGaQmRwFLcv3uP2+bvERyUCYGen0ahbPV6e8BJVGlVUjhuK5xo1glI8FUQEXUoaKQmphN2OYPNPO9m38ghGgxGf4l60GdycBp3qUL15FZycHZ+1uc8M17wukNe6OiJCbHgct87f48yeC2yfu5uDa49TrnZpXp7wEi80qUT+gvlwyeuiBEvxP48aQSn+EX26nhtn7hB8JcRcroZw70ooD26G/cVJwDWfCx2Gt6LtkBaUrFr8mdw4DXoDKYmppCbqMl5TSU3SoU8zYNAbzG7mGa8mk8m83qOBnZ0dmp2Gvb0dji6OOLk4/WVkl88zL/kLuj0zoU1N1rFnyUHWzdxK8JWQzONOLo64e+fHwzs/7t75KVO9JC36NKZ0tRJKuBS5EltGUEqgFP+P9DQ9O+fvZfn0dUQGRwPg4GhPkbK+FKvoh1/ZwuQv6Jbhgp2Xuu1qkNfdyqGCDcRHJXDpyFVuX7hH1P1ookJizOV+NHGRCTnadx43V/J7ueHu5YZ3MS9KVCpK8Up+FK9clGIViuDs6pyj/ZtMJs7vD+LBrXASopOIj4wnLiqBuIgE4iLiuXXuLkaDkZJVitGybxNa9m1MoRLeOWqTQmENSqAUWSI9Tc/OeX+wfPp6Iu9HU7lheV6e8BJlapTEt5QPDo5Pd0b4wa1wzu27xKXDV7h05CrBV0Mz38tf0A2vogXw8iuAt19BChYpkOEN50IeN1dc3VxxzeeCk4sj9o5mN3MHR3vzNWiAmG/6IiAmE0aDiXSd2bMwXac3exempJEYm0xCVCIJ0YnERyeQEJVI2O0IQm6EYTKaANA0jaLlC1O7TXXqdaj1TNzM46MSOLD6KHuWHeTS4asAVGtWmX7vd6dmqxfUqErxzFECpbAIESE6NIZ7V0L/Mn1369xd4iITqNywPAM/7Ekt/2rZdmNLT9MTeiOM4CshPLgVTnJ8CikJqSQnpJCSkEJyQirpOr3ZoSBNT2piKmF3IgGzV1+VFyuYS6OKlKtdGpc8OTtisfR67gbd597l+1w+fp1zey9mupkXKumNg5MDzhlThc55nHFydcIljzP5C+QzO4xklIKFPfAp4W1es8oGwu5EsHf5YTb/vJPI4GiKVfTDt5QPBQt74lPMi8Yv16PUCyWypS+FwlKUQCn+lbTUNDbM3sHqrzZmeoqBefqqWMUiFCnrS9vBLbJFmBJjk9gxby/n91/i3pUQwm6FYzL9+bdmZ6eRJ795D1Ce/K7kye+Ks6sTDk4OODo74ujsSKV65ajdtjrFKhR5LvYIpaWmcW5fECd3nCEmLC5j06+etJS0zBFZWko68VEJ6JLT/lLXwdGeF5pWpl77mtRtX5PiFf2y/H+QnqZnx29/cHLnGaJDY4kOjSU2LA4RoUqjCnQe3ZbG3Rv8px1ZFE8PJVCKx2I0GNm1cB+LPlxFVEgM9TrUpH6H2hSrWIRiFf0oWNgz20ZKty/cZcPs7exZepC01HRKVC5KiSrFKFahCMUr+lG8UlEKlylEHjfX//S0U0piKjEPYol+EEvMgzhunL7Fie1nuHMpGADfkt7Uf6k2HUe1oWSVYtnWb0J0IjsX7GPLzzsJvRmOh3d+2g5pQZdx7fEuWjDb+lEo/o4SKEUmIsK1U7c4t/ciOxfs5d7lECo1KMfwGf2p1rRyltpOiksmJiyOuIj4jGJeqD+3/xLn9wfh7OpEy75N6DKuHWWql8yeC/qPEH43khPbz3ByxxlO7TpHuk5P7TbVqdKwAm4F8uFWIB9+5XwpWbV4lqY5TSYTp3dfYMvPOzm6KRAHJwfaD2tF5YblMx8oVLgmRXaSqwRK07RiwCLAFzABc0RkpqZpHwIjgMiMU98TkW3/1pYSKMvQp+s5ty+IIxtOcHRzIFEhMQCUrFKMwZ/05sUudW0etUSFRHNg9TH2rTrM5WPXH3tOkTKFeGlka9oNa6kiIGQD8VEJbJ2zmy2/7Mr0pnyIpmn4lfOlVLUSlH6hBHXaVqdivXI29RN2J4IFU1awb8WRzAC7dnYaFeuXY+i0vlRvViXL16JQ5DaBKgwUFpHTmqa5AaeArkBPIElEvrK0LSVQ/05sRDyLP1zFnmUHSUlIxSWPM7XbVqdRl3rUbV8DD293m9pNjE1i34rD7F15mIsHryAilKlRksbd6lOkrC8ePu54+uTHw8ed/AXdnmlEbxEhMSaJyPvRRN2PJvK+2f08OSGFtJR00lLTSEtJQ5cR5fzR4LH2DvY4Ojng5mkeoeQv6GYuXm74lfWlcJlCzzyyhdFgJCkumbjIBIKvhHD7/D1uXbjLrXN3CL0ZDkDtNtUZMKUHVV6sYFMf6Wl6Qq4/4O6lYO5cDGbXon1EBkfTqFs9RnzeH7+yhbPzkhT/MXKVQP2/jjRtI/A90Ij/mkDduwebNkFcHHh4QJcuUCzr6woJMYns+O0Pln62lrSUdFr2a0zT7g2p2aqqzftydClphN+JYN/KI6ybuZWUhFSKV/Kjea9GNO/1IsUq+GXZbktJT9OjS9aRrtNnOhzo0/To0wwYDUbCbkdw9eQNrp26xa2zd9Cl/NXxQNM0s/NFHmdc8pg96ZzzOGNnb4fJaMJkzMgRZTCiTzOQGJNEUmzSX5w5wJx6o1jFIpSsUowSlYtRpkZJ3Arkw8HRLGz2jg44OpuDwLrkdcHZ1emprq8lxyezdc5uVn+1ibjIBGr5v0DAG50pW7MUnj62PZyA2elj7bdbWTFjPfo0PV3GtqP7653UWpXCJnKtQGmaVhI4AFQFXgcGAwlAIPCGiMT+W/3nVaDmTw+jz5FxuGxbDyZT5nGxs+NmtW6U3f49+Ppa1WZCdCKrvtzIyZ1nuX3+HiJCg461GfnlAJvEQ0Q4u/ci677bytWTN4gNj898r1G3evR972XK1Sqd7Tfc1GQdwVdCzG7aQfcJvhpCXGQCSbHm1BZJsUmk6/RPbMcljzNla5WibM1SFC5VyLw3qmhBvIsWpICvh9WjOpPJRHJ8innfU2QCwVdDzSOKoPvcvRRMxL2oJ7ahaRqu+VxwdXOhgK8HXkUL4uVX0Lxnq2hBytcpTfFKRXPkM93y8++s+nIjcRHm/8dCJbypWL8sleqXp1KDcpStWcrqtaWYsFgWfLCSHfP+QESo16EmAa93okaLqv9pRxeFdeRKgdI0LR+wH/hMRNZpmlYIiAIE+ATzNODQx9QbCYwEKF68eO27d+/mqJ3ZzfzpYTR9rxFluIU4OqJ17gwVKqA7fxX7LRtxxEC8V2ncLx6BQoWe2J7RYGTrnN0s+GA5yQmpVG9ehWpNK1O7TXUq1bd+7cFoNHJo3QlWfbmRa4E38SzkTv0OtfAtXYjCpXwoU7MUJSoVteXS/5F7V0LY9utuDm84QfidyMzcTg+jVBTw9SCfZz7yeeTFzTMveT3yZmy2NQeTfZhE0MHJnOOpYBFPilfye6rTb8kJKdw+f5eURB0GvTkQrEFvJF1nHu3pktPQJenQJZsDwkaHxWVGvXiYPgTMKUTqtqtJvfY1qdmqaramDnkYVf3e5ftcOXGdK8dvEH7XvOTr6OxIh+Gt6PdBgNWjq+CrIfyx7BBbft5FXGQCpauXIGBiJ5r3fhFHJ+Wqrvh3cp1AaZrmCGwBdorIN495vySwRUSq/v29R3keR1C6TgG4bFnLKWrxVrmNrDhkvtm3aAHxQffZ6dKFKrrT0L07rFnzr22d23eJHybM4/aFe9RoWZUx3w2hVNXiNtmlT9ezY95eVn+1iQe3wvErV5ieb3bGf0DTHPHaStelc3DtcbbO+Z0LBy/j4GhP3fY1KV+7DCUqF6V45aL4lfV96lEqngW6lDQi7kVx4YB5r9Tp3RdITdLh4GhPTf9qdHylNfVfqpUjghv9IJYrx69zbMspdi3ch7OrEz3e6Ez31zuSx806cUzXpbNn6UHWfruFu0H3KVDYk/6Tu9NhpP8zX6tT5F5ylUBp5rH/QiBGRF575HhhEXmQ8fNEoL6I9P63tp47gbp3D0qVQuztaVXyFnuvF8U7IyxaZCRUrgz7lwTjVa+0eervzp3Hrkmd23eJxR+v5ty+S/gU92LU14No/HJ9q6ZVkuKSuRZ4k6snb3L15HWCjl4jNjyeivXK0vPtrrzYpU6WbyqpSakE7jxHyI0wc+6nsFhiMnJARd2PQZeSRpGyvrw0wp/Wg5pnaV3kfwl9up5Lh69ycvsZ/lh+iKiQGPJ55MXT1wN3Lzc8C7lTskpxytY0J2r0Ke6VLVNqwVdDmP/BCg6uOUZe9zxUqFeWJi83oO2Q5laNhESEwF3nWD59HRcOXKZYhSK0GdScVv2bqnUqxf8jtwlUY+AgcAGzmznAe0AfoAbmKb47wCsPBeufeO4E6vvvYfx46N6diB/XULWqWZgAvL3h4kXw8QECAmDtWvP5Y8dmVo8KjeHXtxfzx7JD+BT3otOoNnR9tYNV+17C70Yyd9JS9q88kjmV5leuMBXqlsG/f1PqtK2RpZtdarKOE9vOsH/1EU5sPZ2ZjNA1n0tm3qcChT0o4OvJi13qUq1Z5eciGsSzwqA3cHRTIKd3nychJomEqASiQmIIuR6W+f/n5pmXMjVK0qJPE1oPbJrlabXLx6+z7dfdXD52jbtB9ylUwpt+k7vTemAzq0a0IsLBtcdYP2sbFw9dQdM0arSsSucxbWnUtZ5ap1IAuSwflIgcwhyW8+/8656n/wni4syvFZ7g7lu+vPk11uwjYtAb2DB7O4s/Wo0+3UD/DwLo/W5XqzzyUhJTWT59PWu/3YKdnUaPNzpRq3U1ytcpg5tnPluu5i9cPn6ddTO3cmxTILqUNDwLudN2SAua9mhI+dqln1ka9ucdB0cHmnRvQJPuDf5yPDVZx52Lwdw4c5ubZ+9w6fAVvh35M0s+Xk2PNzvTfngrmzfsVqpfjkr1y5lHQjvPsmDKSr4Z8TMrZqyn/5QetOzb2KLRtaZpNA1oSNOAhoTeDGPPkoP8vng/H3X/ilqtqzF+9jCKli9ik42K/zb/OoLSNM0F6Ag0AYoAqcBFYKuIXHoqFvL8jqB0HbtT+9YagoL4f1N8e/eCz5g/R1CnKzblp4nzuXMxmLrtazJ25hCr9p2E3gxj7/LDbPxhO7Hh8bTq14Sh0/riU8zL5ssw6A3cPHeXkOsPCLn+gAsHL3NmzwXcCuSjWY+GNO/ViKpNKj7zdQcRISUxlbSUNNJ1Znd0c1TydAx6458u5RmviICmoWkamgZoGnZ2WmZGXwcnBxydzK8ueZ0zoqO7PPPrfHitgbvOsXzaOi4cvIyHjzvNejSkdLUSVGlcMUsx/ESEo5sDWTh1JbfO3aVE5aJ0GduOhl3q4lWkgFVtGY1GNv+0i/mTl6PX6ek+sSM93uqsNnD/h8nWKb6MiA+dgH2YN9lGAC5AeaBFxs9viMh52022jOdOoO7dQ0qVwmCypxS3cK9clL17zW+1aAFBQdCyXDC7b5cm1ujIz50ns3fTGXxL+TD6m8E07FzH4ptMckIKyz5dy7qZWzHojVRrVpkRn/e3OaoAmJ/at8/dw5qvNxN53xzBQNM0fEv50PGV1nQa3eapjZRMJhNRITEZEddDuX81lPC7kSTEJJEYnUhiTBIJMUmZqS9yEpc8zri6ueDunR/vDNdx76IFKehXgMKlfahYv1y2RSS3hAsHL7N8xnouHrxMapIOAHcvN6o2rkiVRpWo3boapatZH7XcZDJxaN1xFn24irtB9wGoWL8cjbrWo/HL9SlazvIHp5iwWH59Zwl7lhzENZ8L3SZ0oNc7XZ/q56TIHWS3QL0kIlv/pTMfoLiI5LhyPHcCBdyoGUDZs2u55FKLQkc24FXT7AQREQF9Ggcz43pXQolnnmMN9HaO9Jn0Mr3e6WKxJ53JZGLPkoPMfXcJMWFxtB3cgkEf98rS4nRibBIbv9/B+lnbSIhO5IUmleg0ui0lqxajSJlCOZ6U7yFhdyI4tO44hzec4Mbp23/ZgJvHzRXf0j64e+U3x6bzzEf+gubXhyktnFwczVlxXRyxd3TA3t4Ou0eKppkHUWL+JzMnlEFvRJ9uwJjxqk/To0tOIzUxlZTEVFISzJl646ISMqNVPIwODmBnb0f52qWp2rgSLzSpRNXGFclfMOdHDCKSOcK9ePgKFw9ezowu8WKXugz5tI9NAWdFhHuX73No/QmObDzJtcCbALQe1Izh0/tRwNfT4rZuX7zHkk/WcGD1UQqV8Gb898Oo/1Jtq21SPL/kuJOEpml2QD4Rydn0pX/jeRQowsKIf6ER7lG3wMHBHD2ifHm4do1rG/Yx01ida1oBajWtwPg5Y6yao798/Do/TZzP5WPXqVivLGNnDbV5xPTw5rZz/l42/rCD1CQd9V+qRe93u1G1UUWb2rS0X12yjrhIcxLA+KhEbpy5zaF1x7h++jYApauVoFqzyhSvZM5aW7RCkWyNvJ4dGPQGYh7EcjfovlkgDl3hyokb6NP0aJrGC00r0bzni/iVL0I+jzy4eeajQGGPHBf7qNAYdi3Yx8ovNpCaqMN/YFO6jGlHmRolbXbpjwiOYvOPO1nzzWacXJ0YOLUnHUe1tupaLhy8zMzRc7gbdJ8m3eszZuZQq6cPFc8nOSJQmqYtA0YBRsxTfe7ANyLypa2GWstzKVAAYWEwbhysN0eSSMWeRVRhnVYOd2cY/d0Qmo/sYPENN+JeJL++s4R9K4/gWcidYdP70XpgM6u94+5evs+ZPRe4cPAyFw4EERsej6ZpNOvZkN7vdsv2CORJcclcOXGDy8euceXEdW6fv0dcZAL6tP8fKaJSg3I07lafRt3qPbex39J16VwLvMnp3RfYt/LwXzIBP8TLrwCFyxSiSGlzrL/ydcpQy/+FbF/nSohOZMWM9Wz4fgf6ND0ueZ3pPLotfd57mXweeW1q8/61UH58bT4nd5wlf0E3Oozwp/vElyyO+ahP17Pm6y0s+WQ1Ti5OjJs9jJZ9G+eqBw9F9pNTAnVWRGpomtYPqA28A5wSkWq2m2odz61APSQ4mBPT5zNrxRXC4/S81K8hw2e/YvENIjVZx8rPN7D6q00A9HyrCz3e7Gz1BsvQm2H8+s4SDq07DoB3sYJUa1aZak0qU7PVCxQu/eSIFpYSERzFxtnbObb1FPcuhwDmdawSlYtStlYpCvh64u7lRn6v/Lh7ueHu5Uahkuasr/9LPByhxobHkxibZA5oGxxN6K0wHtwMJ/RmODEPzF6cPsW9aD+sFe2Gtcz2UUVsRDzn913i6OZA/lh2CLcC+RgwtQcdX2lt04hKRDi/P4j1s7ZyZGMg+TzyMHRaPzqMaGXxA1PIjQd8MfgHgo5cpUGn2oz/fniWnHoUuZucEqhLmPctLQO+F5H9mqadE5HqtptqHc+zQMWGx/HT6wvYu/wwxSv5MfGXV6jauJJFdUWEP5YdYu67S4gKiaF570aMmNEPn+LeVtmQHJ/M0k/XsmH2duwd7On5dhdaD2yGb0kfWy7pX7kaeJO1325m/6qjAJm5jCo1KEeFumXI627bU/v/MqnJOgJ3nGXLnN85/ft57OztaNi5Dh1faUPt1lnPbvx3rp++xZy3FnF27yWKVSjC8M/707CT5Y45f+duUDCzx/3GuX2XqFivLBN+GknZmqUsqms0Gln33TYWTlmBnb0dQ6f1pdPoNrnCY1KRveSUQL2KedR0DngJKA4sEZEmthpqLc+jQIkI+1cdYfa430hNTKXPey/T652uFqfXDr4awnej5nB+fxDlapdmzHdDrF4TunnuDmu/3cLhDSdITdTRZlBzBn/aO9uezlOTdQQducq5fZe4cPAy9y6HkBCdSB43VzqM8Kfr+PYUKmGdmP7XCbnxgG2/7mHXgr3ERSaQ1z0PxSoUwa98YYqV96NohSLUaVudvPnzZKkfEeHYllP8+vZigq+GUrpaCdoOaUGrfk1w98pvU3t7lh7klzcXkRCVQMdRbRj8SW+L9949uB3OzNG/cmrXOeq0rc6UNW8qT7//MbLbi68hcEz+dkJGCCN7ETHYbKmVPG8CFRUaw6wxv3J0UyDl65Th7QVjKVHZMi8qfbqelZ9vZNlna3HO48yILwbQbmgLq9aZEmISWfDBSrb+sgtXN1cad6tPl3HtKFertK2XlElEcBTbft3N2b0XuXriBga9ETt7OyrULUPpaiUpU70ELfs1yfIN9L9OepqeQ2uPcfHwVe5fM7vXP3T5d/PMS/fXO9F1fPssf84GvYFdC/ax9dfdXAu8iYOjPQ271KXdkJbUblPN6pFMUlwy8ycvZ8vPu8jvlZ/R3w6mRe9GFo3ORIStc3Yze+yvVKhXlk+3TFL7pv6HyG6B+hmoB1wDdgA7RCQsy1bawPMiUCLC9t/+YM5bi9Cn6Rn8SR9entDB4pQPQUev8u3IX7hzKZjmvV5k9LeDrXLlNRqN7PjtD+a9v5yk2CQ6jW7LoI97ZUsEiegHsayYvp6tc37HaDRRvk4ZqjerTPUWVanaqIKKIPEUSE3WceP0bVZ9uZFjW05lq1AB3L5wl53z97J7yQHioxIpXLoQo78dTMNOVt1TALhx9jYzR83hyokb1GlbnY99lzsAACAASURBVFd/HEHhUpatcR7ecILPen+Lp68Hr/3yCnXb1rC6f0XuI6em+CoC7YG2mD349mIWrMMiYrTRVqt4HgQqNSmVD7t/xenfz1OtWWVe/3WUxV5oqUmp/DZpGZt+3IlX0QJM+HGE1XtETv1+jt8mLeX66du80LQS42YNs2mT5qMkRCdydHMg5w8EsX/lEfTpBtoMak7/DwJyzdSd0WA0526KSkSXrCMtJR1dijl7blpKOga9AaPhr8kJMwJJmCNJ2JkjStjZ22VGj3B0dsTR2fyaN78red3zmEtG+o/cEFPwauBNlny8OlOoWvZtQp22NajevHKWHxb06XqObT7FwqkruRt0n7rtazJsWl+rvTuNRiObf9zFvPeXYTKaGPnlQDqNbmPRaOry8et8NfQH7l0O4aWRrXn1x+G54nNX2M7T2AflijmKRHugobWd2UpuF6igY9f4auiPhFwLZeysYXQc1driL9P5A0F8NfRHwm5H0GVsO4Z81scq77yokGh+en1h5gbIYdP70bzXi1laWE9LTWP9zG2s+HwDyfEpuHnmpUHnOvR7v/szcf1OiE7k1vm73L5wj1vn7xJy4wFxEQnERyaQGJOENX/DWUXTNDwLuVOopDeFSvrgW9IH35LeFKvoR6UG5Z56XqSrgTdZPn0dgTvOkpaajoOjPVUbV6R2mxo07FTb4qnlx2HQG1g/azvLPltLUlwyTQIaMOjDnla3GREcxXej5nBy+xnaDWnBmJlDLBLRdF06Cz5YweqvN9NlbDvGzhqqXNGfY3JMoDRNqwU0xhyB/LCInLbNRNvIrQKVrktn4dRVrPl6EwX9CvDmb2Oo5W+Z970uJY157y1j/axtFC5diDfnjaFa08oW9200GNn4ww4WTlmJPt1Av/e70+OtzhY7YTy2TaOR3YsPsHDKSiLvR9OgU20GTOlB2ZqlnurTa2pSKse3nubAmqMEHb1GdOifCZfdvdwoVtEPT18PPLzy4+HjjoePO+5ebrjkc8EljzPOeZzMkSRcnXB0dsTO3g57B3vsHeywt7fjYSiJh9EkxCQYjSaMegP6NAPpaXoM6QbSdXpSE1NJiksmOT6F5PgUkuKSiQ6NJfxuJGG3I4i4F4XRYJ5IcMnrTI2WVanTpgZ129WgSBnrsiVnhXRdOhcPX+XUzrME7jrHrfPmBJ8t+zZm6Gd9szTiTYpLZs03m1k/cxu6ZB2dx7Rj8Ke9rZpWNJlMLJq6imXT1lGohBev/fIKtVtb5gj88xsLWfvtFoZ82oe+771s62UonjE5NcU3BegBrMs41BVYLSKf2mSlDeRGgbp++hbT+88i+EoIHYa3YuRXAy3+wl4+fp3PB84m5PoDuoxtx7AZ/azyWLpy4jrfjZrDzbN3qNuuBuNmD8vSzdBoNHJ8y2kWTFnB7Qv3qFC3DCO+GED1ZlVsbtPivg1Gwu9GEnIjjKj70ZzceTYzfUcBXw9q+r9AmWolKVWtBKWrFcezkEeueoo2GoxEh8Zw48wdAnee5eTOs4TdjgCgSFlfmvVoSLnaZfDyK4CXXwGb0tDbQvSD2MyoDyaT0O3VDnQd3z5LobASohNZOHUlm3/aRYHCHoydNYwmL9e3qo2Lhy7zzYifCb4aStvBLRg768mjKZPJxBeDvmfP0oNMnDOKDsNb2XwNimdHTgnUZaCmiOgyfncFTouIZZt5soHcJlDJ8ckMrTwROzuNN34bQ502lj0JGvQGlk9bz9LP1uLlV4A3542hRot/TSb8F1KTUlnwwUo2zN6Gp68HY74bQpPuDWy+YUeFRLN97h9s/20PkfejKVKmEEOn9aNpgO1t/hsiwrl9lzi6KZD710MJuR5G2O2IzBEIgIePO026N6B5rxep0qjCc7cfRkQIuRFG4M6zHNtyijO7z2My/fkds7PTKFm1ONWaVqZa8ypUa1rJJrduS4m8H838ycv5fdF+NE2jZquqDJjSw+K9eI/j0Qek1oOaMW7WMKumpdN16Sz+eA2rvthATf9qfLLpnSdOjerT9XzQ+XNO7TpHp9FtGfFFf+WG/pyRUwK1HegjInEZv3tg3gfV0WZLrSQ3CVRaahpfD/+JfSuOMPvYNCrULWtRvVvn7/LlkB+4ceY2Lfs2ZuysoVa50J7ceZaZo+YQfjeSTqPbMmx6X5s8tx6ma9jy8y6ObTmFyWiidpvqvDSyNQ071c6R1OuxEfH8vnAf2+buIeT6A1zyOONXvjBFyvriV7YwfuUK41fWFy+/AviU8HruROnfSIxNIvxuJFH3Y4gKiSEyOIorJ64TdORaZhDcklWLUb9DLbqMy9oI598IvRnG7sUH2DZ3N9GhsbTq14Thn/e3eU+cQW9gySdrWD5tHYVK+vD2grFWi96O+Xv5etiPtOrfhLcXjHviNHJaahrzJ69g3XdbKVymEG8vGEeVF5+Qc02Ra7BFoMxz8I8pwGxgFrABCAEWAPOB+8CKf6qXE6V27dqSG7gaeEOGVp4g/lqALPpolUV19Ol6Wfzxamnn1EsCCg2TQ+uPW9VnXGS8zBg4S/y1ABlSaYJcOBhki+kiInInKFje8v9I/LUACSg0TOa+u0RCb4bZ3N6/YTKZ5PyBIPm09zfSzqmX+GsB8lqTyfL74v2iS9HlSJ/PE+lp6XLx8BVZ+tlaebvNx9LGoae0dewlMwbOkhtnb4vJZMqRflOSUmXe+8ukvXNv6eTWX1Z8vkHSdOk2t3fhYJD0LzVa/LUAmTnmV0mKT7aq/pJP14i/FiDvtvtEIoKjLKpzdt9F6VdytLSx7yFzJy3Nkv2KpwcQKFbe+/9tH9SgJwjbQquUMAvkhhHUuX2XeLftJ3j4uFs8rSciTOv7HftWHqF570aMmzXUqumci4cu82nvb4mLSKD3u13p+97LFqfjeJSE6EQWf7SazT/vwiWvM4M/6c1LI/2z1eMsNVnH1RM3CDp6jcvHzCU+KhE3z7y0HticDiNaZcmj7H+dsDsRrPtuK9t/24MuOQ0PH3cq1i+Lf/9mvNilTrZ7B4beDOOn1xdwbPMpfEv5MGxaX5r1tM378+HU8/pZ2yhaoQhf7J5i8chMRNj80y5+fXsxTq5OzNg52aIN5ckJKfz8+kJ2zPsD/wFNeWfheKvtVjxdctzN/FnxrAXqwe1wxtWbhLt3fr479IlFU3Ox4XF8M/Jnjm0+xaCPetH/gwCL+9OlpDH//eWsn7WNQiW9mbr2TcrWsCy22aPo0/VsmL2DZZ+tJSUhhfbDWjHok954+lgWddoSkuKSWfP1ZtbN3JqZNK9YRT8qNyjPC00r0aznizanJP8vkhCTyP6VR7hy8gZn9lwgMjgaDx932g1pQYcR/tka0BfMU8e/TVqa6XAz/vvhNvdxdu9FpnT5nAKFPflyz1SrpiuDr4Ywqd1nJMUlM23be1RuaNnU3S9vLmLdd1uYtHQCzXs1ssluxdMhW6f4HhbMKd/PADFAApAIJFg7VMtKeZZTfCmJKTKy+hvS1XOQBF8LtajO4Q0nJMBnqLR36SNrvtksRqPR4v4uHLosg8qPz5wySUlMscnu8weCMqcjJ3X4TG5fvGdTO/9ESmKKLP1srXT1HCT+WoB80utrObb1lMRHJ2RrP/9lDAaDHNt6Sj7oMkPa2PeQ1nY95N12n8jZvRezvZ91M7dKJ7f+0sG1jyyfvk706Xqb2rp4+Ip0zj9ABpQZK+F3I6yqG343QgaVHy8d8/WTM39csKhOfHSCjG84Sfy1AJkxcJbVU4yKpwc2TPFZIlA3gGpkjLaeRXmWAjV9wExpY99DTuw4Y9H58ycvF38tQF6p+abVorDyiw3S2q6H9C81Wk7vOW+LuZKmS5fZ4+aKvxYg/UqOlmNbT9nUzj8Rfi9Sfn5joQT4DBV/LUAmd5ou18/cytY+FP+fiOAoWfThKunlN0L8tQB5s+VU+X3xfklJSs3WPj7s/qX4awEy/IWJcuPsbZvauXz8mnTxGCgBhYZZ/L15SPSDGBn+wkTp4NpHLhy6bFEdg94gC6eulDb2PaR/6TESGRJti9mKHCanBGovYGdtw9lZnoVAGfQGWTBlhfhrAfLLmwstqhN8NUTaOPSU6f1nSnqadQu3vy/eL/5agHzU4ytJTrBt1BQRHCXjGpifJn+YMC9bb15JcUky990l0sG1j7Rz6iWTO0+XS0evZlv7CstIS02TVV9tynRM6Jivn8wYOEsuHbmSbX0c2XRSehYZIe2cesmST9bYNJq6ffGeDH9horS26yELp64Ug8Fgcd34qATpW2KUdM4/QPYsPWBxvQuHLksH1z7yYfcvrbZXkfPYIlCWuJnXBT4B9gNpj0wNfmPVXGIWeNprUBHBUczoP4sLBy/TemAzXv1xhEXrKJ/1/Y5jmwJZdPN7PAt5WNRXckIKP742n10L9lG1cUU+3/WBTY4QZ/64wLS+M0lLSePNeWNoGtDQ6jYehz5dz5aff2fJJ2tIiE6kVb8mDP6kd47kkspu9Ol6EmOSSIr7MwpEclwy+jQDDg/j7mW8uuRxwqtoQbz8CuSIq312YzKZuHT4KrsX72f/6qMkx6fQok8jhs/ony1J/+Ii4/nh1XnsW3mEMjVK8ua8MVavg+pS0pg15ld+X7SfWq2rMWnJqxZn3Q27E8GMAbO4dPgq/gOaMm72MIu2Vaz4fAO/TVrK1LVv0ribdZuIFTlLTu2D2gUkARcA08PjIvKRLUbawtMUqMBd55jW9zv0aXpe/XEErQc0s6je1ZM3GFd/Er3f7cawaX0tqxN4k097fk3EvSj6THqZ/lMCrL45pqfpmfPmIjb+sINiFYowdd1blKhU1Ko2HoeIcGj9Cea+s5jQm+HUaFmVkV8MyJaUHVnFZDKRFJdMfGQCcREJxEUmkBCVQEqijoSoBO5dCeHe5fuE3gzHZDQ9ucFH0DSNgkU88SnhjU9xL4pX8CO/lxv5PPKSz8McMLaArwfexQo+9bh7/0Rqso5VX2xk1Zcb0TSNXm93JeCNjtkSYf7Q+uPMGvMrCdFJ9JnUjQFTe1gV9krEHOH/+/G/4e7lxofr36ZCnTIW1TUajCz7bB1LPllNoZI+fLjurScGQDboDYyt9y5xEQnMC/pWJcjMReSUQAVa22hGvWLAIsAXs7DNEZGZmqYVAFYCJYE7QE8Rif2nduDpCVR6mp4BpcbgViAfH65/m6LlLAuMun/1Ub4Z/hNOrk78FvStRV5+yfHJjHjhDTQ7jfeWvWbThsPkhBQ+fPlLzv5xka7j2zN0Wt9s2V1/48xtfnp9Aef3B1GySjFGfDGAuu1qPPUQQyJC+N1Ic6DY8/e4deEut8/fJfRm+F+iTzyKvYM9fuV8KV6pKMUr+lGwSIFMYXkoMg5ODhj0Rox6I/p0A4Z0A6lJOiKDo4i4F0VEcBQRGbH2wu5EPrYfOzuNgn4FzMFiS/lQrIIftVpXo1ytpxu38FHC7kQw5+3FHFxzDA/v/PR9vzudx7TNcmilhJhEfpq4gN2LD9BpVBvGfT/M6mu8ceY2U7t9gaZpzNj1gcXfLYCLh6/wccBXFK1QhG/2ffzE84OOXWPCi+/T+91uDP2sT64KjfVfJqcEagbwh4jsstKYwkBhETmtaZobcApzHL/BQIyIzNA07V3AU0Te+be2npZA/b54P18M+p7pOyZbtM8pXZfOL28uYtOPO6nUoBzvL59ocVDOb0f+zI55fzDzyGdUrFfOalujH8TyXofPuHvpPm/8Ntrikd6T2pz//nJ2LdxH/oL5GPRxbzoMb/VUYsc9yv1roexcsI/di/cTFRKTebxw6UKUrlacouWLUMDXE3fv/Hj45M8MFuvq5opLXudsjUSRnqYnOS45M2BsYmxGsNg7EZkBY8PuRBAZbE4m6O7lRq3W1ajbtia121SzKp9XdhF07Brz31/G2b2XKFOjJK/9PNKmv7FHERF+m7SUlV9spEaLKrw1fyw+xa0LQBt07BqTX5qGQW/k1R9H4N+/qcV1V36xkbnvLmHupW+fOEMgIkzp+jnHNp+i9aBmvPqDZVP0ipwlp9zMEzGPgFLJgps5sBFoDVzFLFwAhYGrT6r7NJwkTCaTjKr1lgytPMGiXfwhNx7I6NpvZTpRWLOQfOr3c+KvBcictxbZZOu9K/elf6nR0jFfP6u9pB6HPl0vy6evk475+kk7p17yy5sLJTE2KcvtWkNcZLxsm7tbJjR+X/y1AGlj30Pe7zhNNv+8Sy4dvWqz48jTIjYiTvYsPSAzBs6SgELDxF8LyHQLP7zhxFOPnmEymeTAmqPSs8gIaW3XQ2aPm5tlF2yTySTbf9sjndz6SxePgbJ7ieUODA8JvxshrzWZLP5agHw+aLbF/68x4XHSzqmX/DRxvkXnGwxmz77Wdj1kRLXX5d6V+1bbqsheyAkvvuwomKfz7gH5gbi/vRf7pPpPQ6AuHAwSfy1ANv2084nnmkwmGVhunHQrMEiObDppVT9XA29IzyIjZHCF8TbdtC4eviI9Cw+XAJ+hcuXkDavr/53Qm2Eytt474q8FyJSun8v965bt9coqyQkpcmxLoPz42nwZUe118dcCMsM5rfh8g0SFxjwVO3ICo9Eo10/fkgVTVmS6hbd17CWj67wts8b+Kmf+uJBjoYz+TlJcksweN9e8faH0GLkamD1/Mw8fJHbM/8Pq+o+6hX/c82uL633a+xtp79xb9q8+YnGdkzvPSnfvIdLLb4QKsfWMyVaBAkr+a0XQgKJP7ADyYZ7eeznjd4sEChgJBAKBxYsXz6nPTETMsb0CfIZKF4+BEhsR98Tzr5+5Jf5agGz/bY/FfZhMJtn88y5p79xb+hR/xeq9Q0ajUZZNWydtHHpK/9Jj5NaFu1bVfxx7VxySzu4DpIvHQKu+9LZi0Bvk98X75bUmk6Wtozk+X3uXPvJ2649k2bR1cvn4tad2435aGPQGOb7ttPz23lJ5s9WH0smtv/hrATK6ztuyd8UhMegtd7/OChcOXZY+xV6R9s69ZdVXm6xy+34cBoNBXm8+RTrnHyBhd6zbkPuQ+R+Y9wxaut8qKjQmc1PunLcWWfzZnd13Ufy1AFk/a5tNdiqyh+wWqNXAWmAgUAXwAYoDLTG7nR8BWv9r4+AI7ARef+RYrpniM5lMsn7WNmnr2EuGVHxV7l62bBpg0UerpLVdD4kJi7Xo/JSk1MyAr++2+0TiIuOtsjP6QYy83doc5PXT3t9IUlzWpt9Sk3Xy9fCfxF8LkFdffE8e3A7PUntP4qEwDa5gjpAxrMprMnfSUjm1+/x/7qk2LTVNtvyyK/Oz6F9qtKyftS1b96z9E3GR8TKl6+firwXIhMbvZ3m0HHorTDq59Zc3W061KlrKQxJiEqWLx0Cr9i2l6dJl5ug55s3KrT606IFSRGRi0w+kd9GRKrDsMyTbp/iAysBnwL4MYTkDLAP6Ay5PqKth9uL77m/HvwTezfj5XeCLJxmZUwL18AlucufpFt/0Lx6+Ip3dB8irjd636Hyj0Shj6r4jre16yKKPVln9RY4IjpIevsPkpTx9Zeuvu7M8wrh35X7mBsq5k5baHNLGEmLCYmX59HUysOxY8dcCZGSNN+TQ+uM23cz+1zAajXJo/XF5tZF5qqy79xBZMGVFjk9tmkwm2bVon3TxGCgv5emb5Ugj2+buFn8tQGaPm2vTaHDh1JXirwXIuf2XrKq3c8Fe6eDaR/qVHG3ROlbgrrNWz3oospdctQbFnynizwNnM0oHoCCwB7ie8VrgSW3lhEDFhMdJB9c+8kmvry2+YR7ZdFI6uPaRQeXHW/z0eXaveXphyy+7bLLz6+E/SXvn3jaHnXnIwwXujnn7SbeCg7PFueKf0KXoZOlna6Vjvn7irwXIxGYfyMF1x5Qw/QMXDl2WyZ2mS2u7HtLWsZdM6/edBB27lqN9Rt6PktG135KX8vSVi4dtj0JhMpnkhwnzMsMvWTqieUhCTKL0LTFKXsrTV/auOGRV3ePbTou/FiD7Vj15etpkMkkP32HyxZDvrepDkX3kKoHKzpITAjXv/WXS2q6Hxd492+buljYOPWVsvXes+hJ+Pfwn6eTWX1KTrZ/KCjp2Tdo49JTvX/3N6rqPkhibJJ/0+jrzJhJ537K8O9ZiMplk36oj0q+kOQzP1Je/UN5TVnD/eqj8+Np86ew+QPy1ABnXYJKcP2B7/q8nERMel+nsc+v8nSy1tXPBXmnv0kf6lhgl107dtM6OsNhMz765k5ZavD5mMBjkZa8hMr3/TIvOf7fdJ9LDd1i2rN8qrEcJlIUkJ6RIV89B8lGAZXPfq7/elLl+ZE108ZTEFOniMVBmDJxltY2/L94v7V3MUxiWrnU9jpvn7piTuzn0lGXT1mV5cfyfuH76lkxs+oF5Kq/6GxZHo1b8f5ITUmTD99ulT/FXxF8LkOkDZlo9MrGU0Fth0rPICOmYr5/8sdy6EczfuRp4Q/oUf0U6uPaRA2uOWlU3PS1dvh35c+aUu6VTz58Pni1dPQdZdP6Ns7elZ5ER0jn/ADm127ZgzArbUQJlISd3muejT/1+7onn6lJ00jFvP3m/4zSr1msSYhLl9eZTxF8LkLP7rEuPcGj9cWlj30PebDnVaoeKR0lN1smg8uOll9+IHAvsqkvRyZy3Fkkb+x4S4DNUtvyyK8dE8L/Go9lvX/YaInuWHcwRL8fI+1GZDxebftyRpbZiI+JkdJ23pWeREVavSZlMJln1lflh0FKv0r0rDllld0RwlAyvOlG6FRhkdToQRdbIEYEC9lhyLCdLdgvUpp92ir8WYFGK6WNbT4m/FmDVms2D2+EytPIEaefUy6pozCLm/VgdXPvIuAaTsuTZFRMWKxObmW86tqbueBLn9l+SgeXGib8WIN+M+Ompb+79T3D3rtx+b4aMKzpQ/LUA+aDN1BxJJ5GWmiaTO08Xfy1AVn25MUttHVp/XPy1AKv3CIqYp+36FHtFJnX4zKLzdSk6eaPFVPHXAmTlFxssEvD710Olc36zo1NOOgkp/kp2u5m7AAWAc4Bnxs8FMjbdXra2o6yU7Baon15fIO2de1u0aP/dqF+kY75+FrunXjt1U3oWHi5dPQdZnVjuzqV70tVzkAyuMD5LI6fLx69J76Ij5aU8fa0WSEtISUyRmWN+NbtJlx6TYwL4X2betAeS2rG7iJ2dCIgBZDXlpIPWTTo7dJfdP2zK9j716Xr5tPc34q8FyMKpK20erenT9dLDd5iMbzjJpugV8ycvlzb2PSx6gBQxu54/XGP9YcI8i77Xe5YdzFzzUjwdslugJgC3MafYuP1IOQeMs7ajrJTsFKjrp29JZ/cBMq7+uxadP6j8ePmgywyLzjUYDNK3xCjpW2KU3LlkfQbbN1pMlYBCwyT0VpjVdR/y4Ha4dHYfIP1Lj8mRRILh9yJlVK23pLVdj2zPOZXTfP+9SPhjtnyFh5vfyy3Mm/ZAblBaBMTk6CjSvbvIe+9Jasfucgt3eZXm4q8FyPyJc7N9ys9gMMiXQ34Qfy0gSy7oe5YdlLaOveTVF9+zOit0yI0H4q8FyLqZWy2uYzQa5cfX5ptdyedZFt3iyyE/SGu7HhL94PmNWvI8kVNTfOOtbTS7S3YJ1I2zt6VbwcHSp/grFolAbESctHHoKb+9Z9lT1sO9Fpa4vf6dhJhEaePQU+a9v8zqug8xGAzyWpPJ0tl9QI5svj22JVC6FRwsndz6y/Ftp7O9/Zzk++/Nf+2VK/9VpMLDzccg94hUasfuIiCB1JIW5YIlPPxPO/0IlvPOteRraom/FiA/vjY/20VKn66X/qVGy/AXJkp8VILN7RxYe0za2PeQt/w/krTUNKvq9in2ioys8YbER1vev8lkkpE13pChlSdYNIq6dPSq+GsBcmDtMatsU9hGTgnUwMcVazvKSskOgbp1/o687DVE+hR7RUJuPHji+dEPYmR4VXPqaUtj3k3r9510KzDI6i+jyJ+LvVnZk7Lk0zXirwXI74v329zG49Cn62XOW4syN9sGXw3J1vafBo8K0UORetyxZ87duyJ2dmJydJQW5YIFRLy9zeWhnZGn74nJ3kF+0GqIvxYgXw//KdsdU45tPSXtnXvL4ArjJfSm7SP6XQv3mdfOusywar3n2JZAae/cW0ZUe90qL9Y9Sw9YvP6VpkuX9i595Oc3LMuYrcgaOSVQsx8pvwK3gDXWdpSVklWBSklMkR6+w6SX3wiLNtim6dJlRLXXpWPefha7S6cm66SDax+ZOXqO1fYlxibJ8KoTpbv3EJtvNPeu3Je2jr3k0z7fZusTtdFolEkdPhN/LUC+G/WLTeKbW3hUkP5+088V4iQiMnu22aju3SU8/E8bH9qcaWf37mICmdfOHGh3Wr/vJD0te8P4XDgYJN0KDpYevsOyFOFi4w87bIref+r3c9Ixbz8Z/sJEi6/NoDdIv5Kj5c1WH1p0/mtNJlscFUaRNWwRqCdmHROR8Y+UEUBNwPqc5M+Qo5tPERsez7uLX8Wv7JMTpa3+chO3L9xj8sqJ1GhR1aI+7l8NJV2np0ZLy85/iC4ljcmdpnP/WijvLH7V5lxG2+fuQUQY/c2gbE3QtubrzZzcfoaxM4cy4aeRNqWjf1aIGBBjBKK/woZVR3GSrRz9YzFT35pLz06L6NJmJaMGb+DTD7bh7b4fMdxFxMAPP0BExP9vLyICfvghh42OizO/VnhCAsvy5dGAIY08GfJpH/5Ydoh3235KQkxitplStXElvt73EcnxKXw36peHD6xW03lMW5oENGDXwn0YjY9PNPk4avlXY9KyCdy5GMzmnyxLR2fvYE+DjrW5dvKmRfYWLlOIyOAoi21SPF2syy9uJgXIWvazp8y+lYfx8itAtWaVn3hu6M0wlk1bS7OeDan/Um2L+wi5/gAAPysyherT9Xzc42uCjlxj8sqJ1G1bw+K6j/L7ov2s/XYLTQIaZGuCC3QtLQAAIABJREFUvKuBN5k/eTmNX65Pl3Htsq3dnEJMcZB+BtGfgvTToL+A2ccHOjfFHHgLmPL6Y+pm5HQ2Gh1pWrUEZ/aVplHT0uT1rA9OdYmMdKJFCwgKMp83dmwOXYSHBwC681dp0QIiI8E7Iy9gZCS0aAF794LPtWvmg56e9B37MoVKePP1sB+Z8OL7fLJ5klUZa/+NUlWLM+TTPvzy5iJ2Lzlgc2LM5j1f5OCaY1w8eIXqzatYXK9hpzrUal2NJR+vxn9AU4uyVRevVJSUxFSiQmLwLlrwX8/18MpPQlT2iboie3niCErTtM2apm3KKFsxB43dmPOmZQ9Jccmc3H6GZj1ftChN9Q8T5uHg6MCobwZb3IfRaGTbb3twcLSnSFlfi+t9+8ovnNx+htd+HknTgIYW13uUPUsP8uWQH6jeoipvzsu+u+bFw1d4p/XHePp6MPGXV3Jl2mwRI2uWnyEp7GtMUS8hEfWQuFcgeR56fTrnrvdByz+VBG0mQ15fzAvNtlKi9lHylzlDhUbHKVnnAOUa7KaW/zbuxK9Ayz+DNPvBhEeVoFiR6zga5iKxQzCG1+f03ldpWncpndpfp0eAKecuqnNnxM4O+y2biA+6T+XKcPGiuVSubBbIPo2DkY0bwc4OOncGoFW/JnyxewoJ0Um82vA9bpy9nW0mdZvQgSqNKvDjhPnEhsfZ1Ebd9jVxdnXiwJqjVtXTNI1RXw0kOT6FZZ+utahO8Up+ANy7fP+J5+b3yk9aajqpyTqr7FI8JZ40Bwg0e6Q0woIcUNldsrIGdWr3eYujRsRFxou/FiALpqywqo+HzgnrZ1uebyb0ZliWsuqKmPPjdM7/f+ydd1xT1/vHPzcQ9l6C4sKNu+69ELWiFgngRtx71Lq1bq1Vq9ZV9957VOusC/dCQEWQKXtvEpI8vz8uQaRo7k2C4/vL+/U6LzCcc+4Jkvu55znPGExT28/XaNmKyNfvyd3Kh3xqTlS51o+mUbiIy+X5JM+7TLL0WZQV3pJkcTVIHF2b8uIGkzxrM8nFDykhPvcjzzxPT6IzZ4j09dnXGIbI0pL9vjDMiJydiQID2f4rVhDVrElkaJhLA0TXaefauRT5tC3J4mqwLbELybP3UUJ8dpl4/oU0Yr34Ag1+oKRnH8IVEhKIOteIoif4oeicqiQxoXHkaT+c8xkMV8JeRqidaWJW9yU0uvEvKo1dJFpF/RxHceobH5FILoyILu64prTvnVMPyIUR0aHlp1RalxbuoKxSHQGwB9AbQC8A9nwvom5TR6D+3naVXBgRpxutIgI+4A73BJ3+t4LIVceTlg9cx8s5QVFTKiEqifOYkiwbsJZ6GPTXaBXc1Pg0GuQ0jo3HUsN7S5Ns3EgkFIppwYxDJIkrFIr4JpQaMZUGeZ4nC/N0srcv3TOvVy/2e13dD+KkcDpQNBMT9qu9/YfXatUiMjb+8G8dHTl1bBdJw/ofoyh/T5LF1aC0t01oxdzfafdODVchjoujdBunDwv38CCaPZt1jFC8EScnovjS/38UuSPV8QgtiVwupwGVx3DOX1kaW6bupp5GA1Qqy3H6z4ucs7/kZuWSCyOiIyvPKO0rl8tpifcactXxpMeXX/BelxbulIlAARgBtlz7HgB7AUQAGMb3Quo0dQRqx6wD1F3Pm5N33Japu6mHQX/OWSPSEtPJu8JI8qk5kVNNGgVyuZx8ak6kXzov4DymJIqd4d4FR1WeoyR5Ofk0ocUs6mk0gN48CtHYvOogl8soPf4kRT7rRLK4GvT4ijelxt+ihHhJkRApdkbFPfPs7IjmziW6devDz0trurpEFhYf/l2tGnvv/1T/ypXZPi2bPKMjWyeR5H0tksTUptcPp5FcqkGhiotjhUmxxVM0gYB9/RPiRMTm8POw9aVZ3Zdobj3EBra6Ww9VuWyK39lH5MKIaMvU3aw7/YYNREuWsF+jPh/Y/uZRCK/SGv0rjaYhNSZQZmqW0v652Xk0ssHP5G7l8808lP0vUlYCFQzAuti/rcGhCq4mmzoCtXzgOhpcbTynvlPbz+flcrpj1gFy1fXinbEh6s17tWpEERHN6LqIBlQeo1HT3rFVZ8mFEZHfmUcam1Md5JI3JEv2IllcDcqPc6eRPrcIkH8kRPb2RFOmEFlbly4odnasSAmFnxadkgJUsSK3vjo6RJUdo2nVguWUFVafciKa0MlDl4rMkRox/0VFsRMtWcJ+VXIjV3D09zNq/42V5Or+W2yGiQtPVJ5jXOsNbH5IptxHv0y5QMCaNuNKj1GUiCXUTejNOWg+4O5r6ib0prWj/uLUPyY0jnqbD6al/f7g/F608EMVgVLuNQC8B1DczSULQLSqZ15fmuz0HJhYGnPqm/Q+BfZVbDn1JSLcOfUQjTrXQ/VGVXmtKep1DACgemN+4xRI8iUIvPsGbd1bQN9QX6U5SkJEuLL3Jpxb1UTrPs00Mqc6a6GcfaCUvoAsEoz5SuiVO4mlv7eHrS2DpCTWo83EBIiPB9at++CdDbC+AwoSE4Hu3QGplNu1IyOBaI5/3TIZEPneEdMXzUYH9wsIflcFP3WaBN28eWjeLA8TJmjALb1iRdZlcN489mvFipyGefzshmbdG2HjxJ0I9Huj5iJY2vZtgYq1K+CPkX8hLTGD9/jdK+Ix8d462FM2tqABZO4ewJw5yHfzgFQuQPUXJ5FRvw2QkPCfsUI9ISzLmSM1jpuTRr02tdFrjCsu7byO8MAopf3LV7NHlwHtcO/sY+Rk5vJ+b1rKBi4CFQPgIcMwCxmGWQDgAYBQhmF+ZhimFIfdb4ucjFwYmxsp7UdESIlNg015K07zRr56j5iQOLR1b8F7TdFvWIFyrFWe91gACLoXDEl+ARp3qa/S+NJ4+zQMEUHRcPXpqLE5VYHkGaD08aCspYB+GzA2F8EYupfqRaivD1SuzH6vCK8RCAB5CSe7vDz2Mb0seeZfCc27HcZvG0Zh+IDjuLC/L+rXeYOsr+TBrKOjg9kHJ8Ousi0Wi1Yj6X2K2nMaGOlj3pGpyErLwSrfTZCX/EUrof+9CaiNd+iCHITDHEdbjkTi5GVoEnYCVRGOIIMfYJ4c9kkffkt7C6Ty8CIc9KsIhqaG2D7zAKf+LoPbQ5JfgDsnH3K+hpayhYtAvQNwBkVRJDgLIA6AaWH7psnJyIWxmaHSfllp2SgQF8DKgVsc0YPzTwBApd3G+7dxsHKwhLGZcuEsDf+bQRDoCFC/fR2VxpfGv4fuQKgvRAev1hqbky8kzwKleAHiW2BMZ4Gx2ApGwD4wJCYCDRt+iAuytQVSUoD3JTyJed4zNYpUKsTc5b+ge79dsDTPxMNLIoz29ftq6zG1NMHiMzOQnyPG6uGbNTKnU4PKGLPGB48vPce1/be5D4yKgsHF0yChEPuqH0QaOWP77KOoV1eGV68Ac2dHlLt3BtDVBU6fLnUba2VvgdS4NM6XNLcxw8B5Ijy+9Byv7gcr7V+nZU2Ur26PW8e+3v+Zlo/hkkli0efal1ikOkjyC6BnqDz7QU4Gu63nag4MD4xCucq2sOYoaMVJT8qAtYMF73EKYkLjUa6yrcoCVxIiwvMbgajbuiZMLLi9f01DJAdlzABk0WAsd4IxHla0a1KIU3w8oKcHjBrFBquamn7YOX1LXL/TBl29z0FHvyrMMQ4kefLV1lLZuSK8Z/yEZ1dfIi78v6YzVeg11hUVa5XH5T3/ch907hwgl4Pp3RtH/Coiw6w7dCkLkuRQ2Nqy/582jSsCffqwTxnnzv1nChMLY+Rm5vFa648jOkMgYPD4nxdK+zIMgwbtnRH6PILXNbSUHVwCdWsyDLONYZgrDMPcULQvsThNUCAugFBfqLRffjYbqGdoYsBp3piQOFSoqVq0fmZKFkytTFQaCwCJUckoV9lG5fEl+ffwXYS9jEQHrzYam5M3OdsA8XUwpjPB6LcEgKKUQxMmsOIEABIJsGwZm1Fhw4avt1xlvA62xoELuwGBPShtJKgg4KutxWVwewDgt+P5DAzDoFP/tgi4/RqJXNMElUjhlC1ks0lYIfDjfjVrsl/T/rtTMjA2QF4WP4EyNjdGjSZOePFvoPLOACo7OyI9MQMZyZm8rqOlbOBi4jsO4DmAeQCmF2vfBVKJFEI95QKVx0OgiAjv38ZxyutXGlmp2eoJVGQSbCtpRqDysvPw17S9qNWsGnqM6KyROflC4tug7HWAQU/AaAgAVpwmTGB3TsePA3Z2H86bANbUN3ToV1kuJxgGaNHKBozVXkBgCUodBpIqP6wvC8pVtkWjTnVxbf8thSeu2nQe0BZEhFtH73EbUCKFU3yKGXJ1qqKc8GVRCqfERADFUjiVpFrDykhPyuQsNgoadaqHNw9DOGWLqFyXdUKJCPpu/MD+p+EiUFIi2kJEj4joqaKV+co0gFwuR36OGEI95SkHxXkSAOCUDFWcJ0FORi7sKn4+z1dpSPIlSH6fCks71Ux8RIT0xAxYlVPdRFgcRSLdkSsHq5yoVh2IJKDMRYBuNTBmy4rMep6ebGqf+HjWGSIxkb3pC5U/a3wTEAEeHkBSij0Yyz0gykPAw11fbT2tejVD7LsEpKvgfVcaFao7wLGmA149eMttQCkpnNwGVoe9WfRnUzgVp5tvJxibG+H6AX47wZpNq0FaIENsaLzSvg5V7QAAye9TeV1DS9nwSYFiGMaKYRgrAOcZhhnHMIyD4rXC1795Xt1/i7zsfNRpqTy3rbSAPczQ5SBm2WnZAAATS/67oEeXniM/V4yWvbgnoi1OTGg8pAUy2ChJgskVvzOPYGVvoVGHi8/xn0zhufsBWTQyZHOwecuHMzU7O/Zcwt4eELP5XhERARQUfJFlaoTgYGDXLiAptRJOX+qNqg6nsX2bZgSCL1XqaX5nUNnZkVO+OwBApUp418AdQhTgskEf3DoQjSq1bJGdmoVLF/LRuUY0fg/5CYxUCri7l+pOr2egh+Y/NsaDC095ZUW3rchaGxKjlJsjzaxZvy+tie/b4HM7qKcAngDwAWvSu1f4muL1b567Jx9AqKeLFm7KxUDGQ6Cy0nIAAKYcHSqKc/OoHyxszTiX8SjJjYN3wDAM2ro3V2l8ccR5Yjy6+Ayt+zTjlEhXXRRmO4U5h+RpoOwtkKA92nZu85+4oePH2R3UV9jYqY1esY14p07A4lVDYGyUh359jn+V9VRydgTAhkdoioq1KiA2NB7SAm5BZtUvbUSGjRPq5j+DTXMnlDtzkP3BmEG4Fu6EJngGODl9NnisVa9mSE/KRPCjUM7rtC20dCRFK3e1N7YwAsMwyEzRZjj/FvjkXYmIqhKRU+HXks1J2cQMw+xiGCaRYZjAYq8tZBgmhmGYF4XtR029kdJ4efsV6revw8nbTfEh09FVfqNWHNQacXBfL4n/v0Fo0bMJdHRVu+s+veqPOq1qwqaC+juody8ikJ8jRrMejdWeiwsKs92rV+xNOzPpCkCZGDDqZ7x6xf7M05Ptu2kTEBcHVKv2bXrqfQ49PdaZw8QE+OMP9v3KmNooQCMY6179KmuydrCEgZE+4sM048kHAA7V7CEtkCEllqPrt709zAP8WNunXA7rR6ypLuXKbTByOfv6vXtAuXKfnKKJawMAQOBd7sHHVvYWYBiGk4u6jo4OjMwMkZOuDdb9FlC6XWAYpm8pL2cACCCiUsq6FbEHwEYA+0q8vpaIVnNeoRokx6SiemOlWgoAIDl7eMxlJ1EgYcWMy26rOBJxAdKTMuHg9OkPoDISo5LR2EUzAbophVH5dhpyuFCGwmynqKt0eH8oBnkY4syF2nB2BgYPZvspdlrAx1khvhckEnbXl53NNoUbtVC/OiC+9VXWxDAMjMyNkJulubISivhChYMRJ+ztgRMngOho6P95AFjzDJKxE4DZvpyyZJhZmcLASB9pCdxNpQKBAHoGQkjyJZz6C/WFnHeFWsoWLh//4QB2ABhY2LYD+BmAH8Mwgz81iIhuA/hqJ40yqQzpiZmwLs8tTknh3cQIlNc9kknZaFBdIT+BUjzBcV3Tf68rQ2pcGuwcNSMoafGsQFnZa8bhojRKnjkpRMraGqji+A6v3laDjY0A1asDs2ez4tWxI7tzAr5u4K06lLbrY3QcAXkSiL5O7SFDEwON1j0yKPR45SVQCipWhN7gAQAASRdXzimcAMDCzgxpifzqUrECxe0AU1eoA6lEK1DfAlwESg6gDhF5EJEHAGewZUpbAJipwjUnMAzzstAEqLnyryXITMkCEcHc1oxTf4X3LZfCfDIpe/cR6PB7vFc89VnYmfMapyA9KRNyOXHOdqEMxUGw4mBY05Q8c1KQlMSGxThVjkJYREXk5bFxmfr67M7KywuoXr1MllRmmJn996xMkfFC4UadmVNYzFL2OcND2WFgrI98TQqUEZsHUpwrVmm8ngHrkslVOBSYWpvyroIrNNDjJ1DS78yu/D8KlztsFSIqbrhOBFCTiFIB8PWp2gKgGoBGYNMlrflUR4ZhRjEM84RhmCdJSUk8L4Oi/HtcI88VusQlTkRQuMsino/3JhbsmhRZK/iiGJ9V6EWoLoqzuVyewY9cKXnmlJgIBAUBTZqwO4yEJBs4lk9GdjYrTmLxB5G6fLlMllQmMAyQmfnxrsne/r+VcP/aUngGIii7HevnKBAXcAqj4IpEzH78uQTClwYfz9ni5GXl8T7/lRVIOV9HJpV/lZALLf+Fi0DdYRjmAsMwPgzD+IDNxXebYRhjALz22USUQEQyIpKDNRV+0hWNiLYRUVMiampryy3DeHH0DPRgYmHMOXeXYuekOIv6HArTnuIDxhXrwkS0KbGqWT71DfVhbmPKyRuJCxbl2J0cH3s+HxTmPMUN2tmZDbxVCFHdBk5o2ewdnJ0/vCYWf3hY+F4o+UxjZwf4+7Nfi/8ODIUxEEtMwQi47eo1TV52PgyNuWVK4UJ+DrtzMjBWLaP+h9hDfgKXnpgJC1t+VghJfgHn60gLpNAVagXqW4CLQI0H6/DQCEBjsE4P44koh4g68bkYwzDFUy+4AyXznGgWKwcLJHMUA8XZE5cMzTqFf7x8BcrI1BAGxvpqZZa2cbRGYhT/HWVpWBYKFJ8EnHxR3KAVyV1lMtYU9vQpYGlbDQKk4uaNpCKRMjIq+8zjmsKshM4oHrqnTmXftwLF76DXj9HQN6rw5RZYgrysfJXFpDQU6cFUnVNSKFD6HHJlFo0RFyA7PYeXmZyIIM6TcBcoibToM67l68IlWSwR0QkimkpEUwq/V3oLYRjmMID7AGoxDPOeYZjhAH5nGCaAYZiXADoBmKr2O/gMNX5wQsDt10VnRp9DcZ4klykXKMUHUpXD4RpNnPDs2kuVU87UblYdAXdea+Swu0q9ShAIGLy89UrtufhgYcEKFvTaAxDA2nAH/v0XmDv3Q1Du90B+sf8CHR1WfO3tgWHD/tvX1joFlR3uAXqqBWirS05GDrLTc4p28ZpAkYdP1TPR9CT+Z6AK93KnBpWV9PxAdnoO5DI5p+sQEXKz8mFkyj+ERIvm4ZIsNothmMzCls8wjIxhGKVh1kTUn4gciEhIRI5EtJOIBhNRfSJqQES9iShOM2+jdNq4t0BmShZe3lZ+A1akQ+KyKzItzCCRk57De00dvdog6nUMIjgUUSuNTgPaIj9HjPvn1I+VtrQzR902teF35pHac32KxET2/KlkmYxOnYCktBqAYV8g9wDSU6KwejV7k/8eXMsZhnUn19P7EKtlb88GFpd0CgEA5B0BUADG6JOOr2VKZGGRzMp1HTU2Z3RwDOwq2ahsNkwqzOzAJ8zhwfknEOoLeYVaKEziiowSnyM3Kw8yqazMHIe08IPLDsqUiMwKmwEAD7DxTd88zbo3glBPF08u+yvtq1N4riTjIFAfnBX4C1Q7jxYQCBjcOn6f91gAqN+uDhiG4Z5iRgltfmqO8IAoxIRq/llBUSZDcf5U0mmgYUMgNX8yCLoIfroKYjFBXx94+ZLdTX2LQmVoyIosEVu6SCIBRowANm5kz50U7+14sYQRRGJQ7mFArx0YXW5xeZomqjCDRGVnDQrUm1hUrK26yTIxKgkGRvqcEycTER5ceIrGXerxEsWkwp2eLYfcmYoMEqZagfom4H0LIKIzAL5O2mueGBjpw9jcCLkcSjjr6bMCxSWYz8jMCEJ9IdLi+Z/dWJazgF1lW8SHq+ZqLBAIYGplgvREzeQKa+fRAjq6Oji0/JRG5iuOokyGvj5w7NgHp4Fjx9jX4uOBcRPL4VHgGPR0uYxZkw/gl1/YsadPszFQCpH6Vhwn8vLYs6devYAXL1hhmjWLLQKrOGvauPFDUViiAlD6FECeCMZ4xFdb94ubgTCxMIZ9VTvlnTmQlZaN8JeRqMbD1FaS8MAolK9uzym0AwCeXH6BuLAEtPNoxfM6bP7B8tWUB8inxLBn1mUZG6iFO1xMfH2LNRHDML/hQ3Xdbx5dPV1OQXeKoEOFZ9LnYBgG5auVQwyH7MilYWploparuF0lGyS951iHR+lctvCc1gtX9txEwJ3XGplTwcaNH5K9enmxO6rERPZ7sZj92caNQMsuoxER2xmLZ6zAjcvP0Lr1h13Xv/+yKYO+BccJhRPEu3dsIlhb2/9WJ7ezKy5OMrYIo/g6GLMFYPT53Vg1RW5WHvxOPUIHr9Yac5++e+ohCiRStFexArMkX4LAu2/QsGNdzmMe/v0MRqaG6DKwLa9r+d8MRKU6FTh5/kUVmkIr1fl6zixaPsBlB9WrWOsGIAtAn7JclCYR6guLUhN9DkUdKK4xQRVqOCAmRDWzmKmVCbJS1ROoxEjNCBQADJwvgpWDJU6uu6CxOYEP7tYKs1e9emxTiI/CFZthBKja6HdAUB7Hd06CoX4SdHWBLVvY1GzZmgn7UhlDQ3adMtmHJLBv335sxisJkRyUOR/I/xuM6QwwRgO/zGJL4e6ph8jPFaPrkA4am/PG4buoUMMBNZuoZrJ8df8tJPkFaNyF+1lSbnYeTK1MONV3UyAtkBYKIbfkzBFB0TAw0v9i6b+0fB4uZ1C+xdpIIlqmJAffNwXXHFwKrx2ugb2ONcsjNjQe+SpE0ZtZm6plorOvYof48ESN5QszMNJH4y71EHT3DSePRz4UdzNPSvrgLPHvvx+7YjMCM+hab0Q520zcPjsA9esEoXNnYHVh1sbiD/5f6mxKYXnKywNGjmRFVSJhSxUVN+OVhOSpoPSxQN4JwHj8VzXt5Wbl4cjKMyhf3R7OrWpqZM6ge8Hw/zcInfu35WyeK8nNI37Q0dVBgw7OnMfkZuZxrnit4NHF58jPEaNxZ24C9fbpO1Rydvwi2f21KIeLic+RYZjThZnJExiGOckwjOZOWssYQ1NDTgkyzWxMIRAwRfnplNHEtSEKJFI8ufyC95oqVLNHQmRSUSQ+X5xb10J+rhhvn7xTaXxptPdohfSkTJXej6ZghLWhY70Ltrb58DvvhdFD9iMlhcAwH7I02NiwThR2mjlKKZWOHVkRio8vqlAOB4cP50tnz35GnMQPQMm9AfFdMKbzwJhMKruFKkEul+N3nw2ICYnDlL9GqSwmxclKy8byAetgX9UOHj+7qTRHeEAkLu28jl5jXDlVGlCQlpBRFFzOBZlUhh2zD6JCDQe06t1Uaf/4iEQE+QWjdZ9mnK+hpWzh8piwG8A5AOUBVABwvvC17wIjM0NOqYV0dHRgaW/BOctDg/Z1YGplopKLtmOt8pDL5Ih7p9oZVqNOrN3++Q3NxTk369EI5jamuLJPs9m2S3Mz/6jEdwk2b2+KGi3O4tqdNtiwfAnO7RuNihViYGnJilJyMrBo0YcKu+rwKZFLTAS2b2d/fvv2h91S8fOlkhBJIc9aB0rzARhjMNbHwRgP0YgoqMqhZafgd+YxRq8agsad1c+AT0RYO+ovpMSmYc6hybzEpfgcW37eC2NzIwxe6MlrbFp8Oi/nhYs7riP6TQxGrhzEKbHzjUN3AbDl7LV8G3ARKFsi2k1E0sK2BwD/3ENfCWNzI87xStblrZAUw02gdIW6aNmrCe6fe4LMVH6JKxWuuRFBqrmKm9uYwalhZTz8+6nKAb8lEeoJ0al/W9w/+xixKgpnSRTi9Ck389JEqmNHIDvHCr0Hb8XkefPQofUjBN76EVNHrYVEnAFnZ2DBAlYs1H3rimszDGBcWHtSkQtQsbbPiRLA3nBJ7AdK7QfkbAYM+4KxPgVGyN10VRY8vvwC+xYeQ5dB7eA+WTNl155de4k7Jx9i6JJ+qN1ceZXq0vj3iB+eXw/AkIXeMLPi7spNREiNS4MlxwwSaQnp2LfgKOq3q8NpR5SfK8bl3TdQr21tOFRVvRyOFs3CRaCSGYYZxDCMTmEbBEAzyeC+ANYOlkiOSeV0I69SryJCnoZxSncEAH0n9YQ4V4w1w7fwEoqq9SvB1NIY98895jymJD2Gd8HrByG4c/KBynOUpO+UnjA0NcTcnss1UlH0+PGPvfFK5qYrGS9U3MOPYRhs3DkE9TpcxIUrnTB3yha8e9gZF45uxuVL2aXuvooj5JHe7eZNICwMH+UELLm2krCxTSdBKb1Bab6ALA6M+R8QmK8AI+BfaVmTEBF2zDoAh2rlMHXraI3t4p5e8YdQTxc/Teyh0vjwgEj8MWILnFvXgtuYrrzGxoTGQ5wnQaU63E4Xlg9cj7zsfEzYMFzp+ycirBu9FXFhiRgw14PXurSUMUT02QagElgTXxLYTOZnAFRWNk6TrUmTJqQqJ9ddIBdGRGmJ6Ur7Xtp5nVwYEUUERXGffy07/6n1f/Na19rRW8nNeCDlZuXyGqdAWiCl0Y1/oX6Oo1SeozQC7ryiHvr9aGr7+STOl6g938aNRAkJ/309IYH9Wcm+AJG+PvtVR4f9ChDVr/OaTu8eQ7K4GpQe2oiObptIg0SnycoytahPyWZrW/rrJduKFR/W5OzKuFewAAAgAElEQVTMvubpWfr7kUvjSJ71J8kSWpIsrgbJktxInnOc5PJ8tX9XmuLeucfkwojo8p5/NTrv2CbTaVqnBSqP3z3/MLnqeFJqgvLPYkmu7LtJLoyIwgIilfaViCXkwoho19xDnOZWfIYPLD3Be11auAPgCfG89392B8UwjA4AD2LTEtkSkR0R/UREkWWsmxqjfDW2Bk/sO+Wlruu1qwMAeHmbezyQ++Qf0bJXE2yfsR/Bj0M5j3MZ1A75uWLcPqHaDkhHVweTNo1Ackwq9sw/qtIcpVGvbR1M3zMBAXdeY9XQjWp79SnObkpSmuls/Hi2RIdYDNSsyebsU/A+vjZGz9yClj2O48jpnmjd7Bn2bpiB+IBW+Pf0AEwfvw0NnF9DIPiwXisroFu3j69RrRqbpcK6lKQCxQNtjx1jXyN5Dij/CuQZ8yBPcgUltQdlbwCE9cBY7gZjfQ6MkQgMo7kkrOogERdg/+LjsK9qp9GzlMyULIQ+j0CjTty84UojOjgWDtXsOZvpivP6/lsYmRpyik/KTGHjEmwclWeOePv0HbZO34c27s3Rf7Y773VpKVs+K1BEJMN3FPNUGlXrVwIABHIIQq1Q3R4Va5XHqXUXOHvYMQyD6bvGw8rBEr/2Wcn5hu7cuhacGlbG5im7Efo8nNOY/8zRqhZ6je2GU+v/xsGlJ1WaozQ69WuDEb8Nws2j97DQYxVkpZWHLSOOHQNWrGDPhVJSPjhWpKUBlpZAX++GkBouxdYTt+Ex4gSWrx8Lc9MsLJ21Fs+v90FqcFMEP/TFnys2oGI5P7yPjIaxUQ4AQq1abFzV0qWsCa9mode1qWmhJUGWBFuLRxjnewTyzOWQp/qCEluA0icA+RcBXScwpjPB2PwDgeV2MPptvqoTREkyU7Iwy3UJQp6GwXdJP94Vnz/Hnl/ZhyBVPdxkMhkC77xGtUZVeI/NTMnCv0f80LhLPU6BxorURtYcktgG3H4NuUyOCRuGa13Lv0WUbbEALAObe68dgB8Uje9WTZ2mjomPiGhcs5k0tukMTn0fX37BbveX8NvuX9p1g1wYEb0PieU8JiEqifpXGk2icsN5jSuOVCql34b8SS6MiI6sPKPSHJ9CYR49/Ntpjc77OYqb2Zyd2X+XfC0w8MO/FWbAihViaJDoLG1csYCC7vQiaWxN1gRX2LLD65Ekrj3Jkn4iWbI3yZLcSRzXk1JCXEiW0J5k8Y0+6i+Lb0CypN4ky1hG8vx7JJerb+4sS6KDY2hIjQnUw6A/3Th8V6NzP78RQC6MiLb8vEflOV7efkUujEiltW2ctJNcdTwpPJCb6f3KXtYcGPXmvdK+O+ccJFddL5LL5bzXpYUfUMHEx+URS5HLZHFxXcN3ko8PADp6tca2GfsRExqHCtUdPtu3qWtDtPdshUPLT6LzgLZwcOLm0eNYo9CUGBqv9BoK7Cra4LfL8zG13XzMcl2CtXeXwoZnOQQdHR38smscstNycHjFKbhP6qGxqqnuk35E0L1g7Jl/BI271EetptU0Mu/nKM2xAmC/V3gELlrEflUUOLS1BfIl5XHgRG8cP98bYjGwZnU2/G76w9wkDjbWqajkmIZhQ1Oho5MKkBgQmEJXRw8WBvoAowcwRmB0qgC6TmwT2INhvo8n6pe3X2Gh++/Q0dXB6hsL4NyqlsbmzsvOw5oRW1C+uj2GLumn8jx3Tj6AUF+IFj1/4DXufUgczm+5gh7Du6BK3YqcxkS9fg8dXR1On93M5CyY25h+UzthLcXgq2hfo6m7g0qITCRXXS+a0XURifPESvsnvU+m3maDaUS9qZQan8bpGmmJ6eTCiGj/4uO81/fmUQj1Mh3EeZdXGk+vvSyTXVRmahb1rzSafrL0obunH2p07k+hzLEiIYHI3v7Tuyw7O6JatT44SiicJRR9/5d4etWf3IwHkm+dyRT7Ll6jc2ckZ9LktnOpq8CTXt5+pfI8ir/vBe4reY1Ljk2l4XWnUG+zwZw/h0REk1rPoZENfubUd/aPy2hUw2m81qVFNaDCDoqLiU8fwAAAcwD8qmh8L6ROU1egiIj+2X2Dugo8afaPyzh5pz2/EcB+8GtP4vzhmNphPg2tNVElc8HxNefIhRFR9FvVTH1yuZwWeqyi7nreFPoiXKU5PkVsWDyNazaTXBgRbZq8iyTir2vuUnj7lRSchASimjWpyDvvUybC/xWRenDhCfUw6E8jG/zM6wbOhdiweBpaayL1MOhPN4/6qTxPRFAUuVsPpUFVx1LS+2TO4+IjEmlI9fHkZjKQXvwbyHlc0L035MKI6OS6C0r7yuVycrceSquHbeI8vxbVKSuB+gfAUQAzAExTNL4XUqdpQqCIiP7edpVcGBHN672C001WYTc/tPwUp/kVbupB997wXlvsu3iV3NWLk56UQV4OI2hEvamcdop8EOdLaNPkXeTCiGh885m8bjZlwad2WStWfFq8FCJV0r39e+T2ifvUXc+bxjWbSRkpmRqff1qnBfSTpQ8F3H2t8hyxYfHkXWEkeTmMoJjQOF5jxzefSX0shlDQ/WBe4xZ6rCJ3Kx9OoRdRb96TCyOiizuu8bqGFtUoK4EK5DupppumBIqI6Oymf8iFEdHvvtzuUl4OI2ilzwZOfXMyc8nNeCDN6LqI8nL4x8X41p5EY5tMVyv+6NGlZ+TCiGiRaBXlZuepPM+nuHPqAfUyHUTeFUbSg7+fanx+TcAn9up7o0BSQPsXHydXXS+a1GYuZadna/waCicDLruQTxH5+j0NqjqW3K18KOxlBK+xmalZ1FXgSfsWHuM17v75J9RV4Ek75xzk1P/YqrO84x61qE5ZCdQ2APX5TqzJpkmBIiJaNmAt9bEYwqnvItEq6uc4irPZ7sLWK9RV4EkTWsziHZB486gfuTAiWuK9hmQyGa+xxTm+5hy56njSyAY/835y5ULI8zAaXncKuTAi+m3In5SRrPkneC3/5Z1/BI1tMp1cGBEtG7BWowHaCi7uuEZdBZ70S+cFau3CxzaZTiK7YfTmcSjvsee2XCYXRsRr7N/br5GrjieNazaTMlOzlPYPC4ikHw3706zuS7QefF8IjQoUgEAALwG8AlAAILjw3wEAXvK9kDpN0wJ1bDV73sPlD1nhPh7yPIzz/H5nHlFPowE0uNp4ig6O4be2wqc6dVx6iVh3eXfroeRuPZQSopLUmqs0xPkS2j3/MHUTepOo3HC6dfyexq+hhUUiltDeBUeLfte3T9xXPigykmjDBqIlS9ivUcp3Cac3XCQXRkSzeyyl/FzVM2O8ffqOXBgRnd5wUaXxE1rOphH1p3ISDrlcTvsWHitaNxfRzsvJpxH1ppKn/XCNn91p+TSaFqg0AJU/1fheSJ2maYG6c+oB5ye01Pg0cmFEtH3mfl7XePXgLYnshpG79VBeuxi5XE4bJ+0sisVS5+kuOjiG3EwG0tQO88vEFEREFPoivOipfl6vFSo7eWgpnUC/NzSi/lRyYUS0YtB6Sk/K+Gz/XcvjKM/Ng0ggoOL5nOQCAYU08iCK++/fokwmo/2Lj5MLI6Jff1qplolZJpPRikHrqYdBf04PgCVRODkcX3OOU39FjNaKQeupQFKgtL9UKqWVPhvIhRHRkysveK9Pi+poWqCe8Z2srJqmBSohKolcdb1o6y97OfVfJFpFLoyIjv7Oz4U78vV7ctX1om0z+ImbVCqlFYPWkwsjoqX9/uD0wfsUV/ffIlddLxpUdSzvA2euSAukdGzVWeptNpi663nTlp/3UFZa2Qji/xdiQuOKbqT9K46me+ceKx2za3kchcKJFSShkMjDg2jOHMpz8yAJdIkASrdxIor/4I4uzpfQvF4reN3kP0VOZi4t9GA/K1w/W8W5eeweuRkPpP4VRysVYgXbZuyn7nrelJ2Rw2l9c92Wkwsjon2L+J1vaVEfTQvUewA/f6rxvZA6TdMCRcSeQ/U2G8zpRirOl9AS7zXkwoho2/R9vHY1c3ouowGVx/A+U5LL5XRg6QlyYUR0dtM/vMaWJOjeGxpUdSy56nrRgaUnSCqVqjXfp0iJS6XVwzdTV4Enedj60rktl0laUDbX+l9ELpfT06v+NK/3Cuoq8KTuet60Y/ZBzmdNeW4eRAA9wQ/UqUb0Ry72FRBNgQY/sB95Dw8iYnc7S/v9wZrj/ryo1m79fUgsjag3lVx1POnEH+d5zSWTyWj3vMPkwohoUpu5lBKXynmsb53JNMN1Mae+K4duIFddLzq35TLn+bVoDk0LVFxhzNOC0hrfC6nTykKgQp6FkQsjooPLTnLqL5VK6c/x24s8ALk+aV47cJtcGJFKgY5yuZymtp9PXuVHqu2Rl52eTUv7ryUXRkTTOi3gdRPgS8izMJraYT65MCIaUn08HVx2kvMT8f9HxPkSurD1SpHjichuGO2ef5iSYlK4TxIZSSQQkFwopE41oksNUk56FkWkq0skEJAsIqLo7/nYqrNqrf/RP8/pJ0sfcrceSk+v+vMaKy2Q0gL3leTCiGj18M28zIvRwTFF4soFn5oTaaHHKl7r06I5vikTH4BdYMtzBBZ7zQrAVQAhhV8tucxVFgJFxO5uugm9OT89yuVy2rfoGC839dysXPrJ0oe8yo9USaQC7r6mrgLWIy/iVTTv8cWRy+X0z+4b1NNoAHk5jKDnNwLUmk/Zte6cekDTOi0gF0ZEbiYDacesA1qhKkZmahYdXnGKvMqPJBdGRGObTKcre2+q5j23YUPR7igh4eNSI7a2xdzuPTwoFsb0c43hKpviivP26TvqJvSmUQ2nUWwY/0wWijIah5af4rXrinz9nnzrTKbuet6UEJmotH/021jqKvDk/ECqRfNoWqCe852sxPj2YBPLFheo3wHMKvx+FoCVXOYqK4HKTs+m+X1+IxdGRCuHbuB8Y/jddyO5GQ/k3P+dfwT51JxIrrpedGzVWd6mlEeXnpHIbhi5GQ+kSzuvq+0W+84/gnxrTyJXHTbWpKxMfgoigqJo2YC11FXgSW4mA+mvaXvJ/1bQV89I8bWIDYunjZN2kpvJQHJhRDSz2xJ6etVfvf/XJUvYj/OcOZ8UKLlcTue7jyM3/ES9Dbzo0q4bal1TnCem4XWnkHeFkSoFC0ulUhpaayKNajiNlwn89skH1NtsMInshnHOMrF62Cb60bC/1mvvK6JpgbLiO1kpc1QpIVDBABwKv3cAEMxlnrISKCLW/q1wUx3ffCYn0Xn0z3NyYUS8AlWzM3JokedqcmFEtMB9JW8ngqSYFPqly8KiGJicTPViYHKzcouyoP/SeQE/c5KKRLyKpmUD1pKrjie7qzIeSLO6L6EjK89Q8JNQ1c+rVHCp/pLk5eST/60gOrLyDM11W06uOuz50kqfDfTOP0IzFyncQeW5eRRlzChu4qtbK5tmu7EODDPQjhIWr1b7klt/2UsujIgeXXqm0niF+ZuT2zyx5sDtM/eTCyOiCS1mUWI0t2wm8RGJ1E3oTRsn7lRpnVo0Q5kE6qrTShGo9BI/T+MyT1kKlIJzm9kME35nHyntK86XUC/TQTS++UzOHxIi9gn25NoL5KrrRXPdlvN+epVKpXRg6Qly1fGkKe3macRT7p/dN8jNeCD1tfGlSzuvqxUgzJWstGzyO/OINk7cWXTuojh72TJ1N+fMA6q4VH8p5HI5vXkUQquHbyY344FF73FI9fG0bcZ+zaeKiowkuUBAEgipAqI/ykPYuOITaoMx1IXxomOC2iRnBGqJuLRASvsWHqOuAk9aO3qrSnO8vP2KTctVfyrnv7mdcw6SCyOitaO3cj6rSo1Po6kd5rOmwDKIB9TCnf8pgQIwCsATAE8qVapUFr+vj5CIJeTlMIJm/7iMU//bJ+5TL9NB1NfGlx5e5PcEeeKP8+TCiOj6wduqLJVuHvWj7nqs3T85Vn1nh4hX0TSpzdyicxB1MlerQnJsKl0/eJsWidhkty6MiMY2nUFnNl6ihMjEUoVcFZfqsiY9KYNuHL5Lv/tuJO8KI4t2iauHb6YHF56U+flbSCPWiy/Q4AdKehZFSTEpRbv2Lvrj6SRaUXEvPlWIfhtLE1rMKnJL55vSSyplxc1Vx5OG1JjAeQcpzpdQXxtf+vUn7hnR/W8FkVf5kfSjYX+6uv8Wr3Vq0Tzfg0B9cya+4igcILhmf4gOjqFRDaeRCyOiHbMOcDZRSaVSmtByNvW18aW0RH7pkBQ8vvyC3EwG0iCncSoXOyyOXC6n64fuUP9Ko8mFEdFirzUqHXqrS3pSBp1a/zeNbvxL0a6jj8UQmtJuHq0fu43ObblMz28EUHAHD0qDHj3i6FKtKaRSKSW9T6aAu6/p2oHbdGDpCVozYguNazaTugpY06W7lQ8t8V5Dl3Ze/7LxYHFxlG7jRPkQ0FFBbeot9KAfhZ50sK4HiXWE7O/DSXXRfnjxGbkZDyR3Kx+VMpynJqQXeXeuGLyel5n6xuG75MKI6PFlbsG1J9exlgqfmhM1Z0bVohaqCBTDjisbGIapAuACEdUr/PcqAClE9BvDMLPAnnPNUDZP06ZN6cmTJ2W2TgVpCekYWHksWvZuitkHJkGoJ1Q6RpwnxpYpe/D39mto2LEuVl6ZDx1d5WWpI4KiMfaH6Wjs0gBzD02Gsbkx7/W+eRSCuT1XQKAjwOwDk/CDSwPec5QkP1eME2vO4+jKM5DJ5PCY0hP9Zv2k0vrUJexlJIL83iA8IAphAZEID4hCbmbeR30IDArIFHJdU8gYQ+QWWMDApgKmTzRCncVjYCvPhcmrFzCoVe2zRemICBnJmUiMSkZSdAoSo5IRH56I8MAoZCRlIjs9B9npOf+5PgBYljOHY63y+KFLAzRxbYiaTZ04lSbXNHK5HFc3nMPu2QeQks+gGcVhPF6gAnIAgQBwdwc2bQLKcSvCqYCIcOPQXawZsQVV6jpi8dmZsKlgzWuOvOw8LOy7CoF332DKX6PRdUgHzmOz0rIxq9tSZCZnYm/oRqWl2ZNjUjCg0lg0cW2AeUd/hrGZEa+1aikbGIZ5SkRNeY0pK4FiGOYwgI4AbAAkgI2fOgPgGIBKAKIAeBJRqrK5vpRAAcD+xcexb+Ex1GxaDXMOTeZcHffspn+wceJOTNs5Dt19O3Eac27zZWyatBO2FW0wc99E1G9Xh/d6o97EYKH774gOjkWvsd0w5g8f6OkrF1ZlJMekYOecQ7i2/zbMrE0xcK4H3Ma6amRuVSEiJEUn4/2qv5CxcRsyGrVAbGcRtm/JhCwvE7rIh7FuCowFcZAVyD4aK9ARwNjcCCYWxhDq60IqkUJaIINUIkWBRIr8HDEKxAUfjdE31EOVehVhXd4KxhZGMDE3homFMSzLmcO+qh3KVbGDXSUbGBjpf8lfQ6kE3QvG5im78fbJO9RpWQMjfnZFg4QgIC0NsLQEevcGKnKrSFuc5JgUrB+3HQ/OP4Vzq5pYcm4WzKxNec0RHRyDRR6rEf0mBlO2jkaP4V04jw248xorBq1Halw6ZuwZj84D2ikds3zgOtw9+RDbA//g/PnVUvZ8UwKlSb6kQAHA3dMP8ceILZBJ5Zi8ZSSnDwURYXzzWchKycLu4D+hK9TldK1XD95i5eA/EReWiMG/emLwAk/e6xXnibF73hGcXHsBtVvUwK/Hp8HWkd8T7qcIfR6OHbMP4ukVf9hXscXQJf3RqX8bpU+xZcrSpcD8+cCcOUicvAz16gFJSeyPbG2BF8+lkGUnIHb+70g5fh7Z3dyQ3aQlcjJykZORC4m4AHr6QugKdaEr1IGuni70DfVg42gNu0o2Rc3M+tsuBS4RF+DRxWe4svcm7p97Auvylhi5cjA6D2ir9rqJCJf33MRfP+9BgbgAvkv7w33yj7x3hndOPsDqYZuhZyDE7ENT8EOX+pzGyaQy7F98HIeXn4K9UznMOTgZtZpVVzru8eUXmNNjGQb/6okhC714rVVL2aKKQJXpGZSm2pc6gypOQmQiTWk3j1wYEf2z+wanMQ/+fqpSFufcrFxaMZjNvXdm4yVVlktEbHxIL9NBJCo3nHdEvzKeXvWnMT+wSWFHNZxGZzZeUivjtVoocakuKlbowToNfPdFoEoQ8Sqa1o/dRu5WPuTCiMjTfjjtnn9YY+U3UuJSi/LzTe0wX6UEwBKxpMgNfULL2by8XWUyGc3+cVlRQDzXs6rs9Gwa5DSOfGtPUivhrZayAd+ak4Sm2tcQKCLWnXZ041/Iw9aX4iOUR6vL5XKa2mE+dRV40paf9/DKCCCVSml2j6VFcU6q1liKeBVNvnUmF324NVmrSSaT0fVDd4ocQ7zKj6QzGy99+YDbz7hUKwSrc40okhem9fnW4qJUJfhJKP3uu5FcdTypp9EAWjZgLT269Exj+Q5lMhmd/+sK9bEYQj30+9HJdRdUCjvITs8u8gpdP247L7GQSqX0u+9GNgXTam4ZzYnYjCuKfJMvbnIvEa/ly6EVqDIgOjiG+lgMoTE/TOfkUpubnUfrx24jF0ZEI+pN5VVHqkBSQPsWHaNuQm/ytB9Od08/VGnNeTn5tGPWAeom9Ka+Nr50ZuMltbJUl4b/rSCa2p71yBpYZSxd2nVD42XmP0dJl2oFCQmsOD1B2XjxfWmyM3Lo3JbLRSVNehoNoM1Tdqvs/fkpwl5G0KTWc4oCt6PevFdpnqy0bJrQYhZ1E3rTv0fu8horLZDS8oHrirKNc4kTlMlktHv+YXLV8aRBTuMo6N4bldatpezRClQZ8eACW0p6xaD1nINrH158Rl4OI6i7njfvujOhL8KL3KxXDFqvsukm7GUE/dKZzYXnW2cy3Tv3WKPVQ+VyOT2+/ILGNZtJLoyIuut504SWs2nzlN1086hfmSakVbhUE8AmQPXwIJo9m8jDg905qelS/TWJfRdP1w/doVW+m4qCfEc1nEZnN/2jcbf1jORM+mvaXuom9CYPW1+6su+myn8jGSmZNLbpDOqu580p4L04BZICWuzFVgw4vOIU53F/b7/Gpirz2cCp5IaWr4dWoMqQA0vY0heLPFdzNptlJGfSiHpTqbfZYLq44xqvD36BpKAooNGn5kSVzRZyuZz8zj6iobUmkgsjolndl/Cu8svlGo8vv6BtM/bT1Pbz6UfD/uTCiMhV14uW9l9Lz28ElE1Z7bg4VphKZJIggYB9/TsSJ7lcTk+uvKAZrouL4r/cTAbSmhFb6PXDtxr//UkLpHR6w0X6ydKHugo8afXwzWqZg59ceUGDqo6lHvr96MGFJ7zGRr15TxNbzSYXRkQn/jjPedyNw3fpJ0sfGt98prZs+3eAKgKl9eLjiFwux7Hfz2LvgqMwszbFrAOT0Lizco+khMgkrPLdBP+bQWjWvRGmbhvDy8Pu+Y0A/DHyL8SHJ6LnSBeMWDkIJhb8Y5KkBVKc23QZexcehSRPgg7erdFzZFfUa1tb455q0gIp3r2IwL+H7+LynpvITs9B+er26DGsM1yHdoSVvaVGr4foaODcObVdqr80MpkM4QFReHnrFa7svYl3LyJgZW+Bnyb+iOY/NkZlZ0fO3qB8eHn7FTZN2oWwl5Fo3KU+xq4diqr1Kqk0V05mLrZM2YPLe/6FY00H/LJrPOq2rsV5fMCd15jdfSn0DPUwadMIdPRuo3RMZkoW/hy/HbeO3UftFjUw5+BkODjxi+3S8uXRupl/AUJfhGP5gPVIT0jHztfrYWlnrnSMXC7Huc2XsXPWQegIdTDmj6HoNrQjZ2HIy8nH/oXHcHLtBViUs8DEjcPR1r2FSutPjU/DwaUnce3AbeRm5qFi7QroOdIFXYd04B3fwgVxnhh3Tj7ExR3XEHD7NQQ6AjRxbYiq9SqhQnV7lK9ujwo1HGBd3vLruq6XMRJxAVJiU5EUnYLgR6F4efsVAu++QXZ6DgCgSr2K8Jjihs4D25VJrBkR4fWDtzi94RJuHvGDXSUbjFnjg7Z9W6j8gBJ0Lxi/Df4TiZFJ8JreB4MXeELPQI/z+IigaExtNx+W5cyx6sZCWDsof3B5ePEZ/hixBZkpWRi8wAveM/pwCozX8vXRCtQXIvJVNMY0no4GHeti9oFJsLBVLlIAEPsuHquHbUbAnddo27cFpm4dzUsU3j59hzUjtiDMPxJt3Jtj3Dpf2FW0Uek95OXk49ax+7i4/SpePwiBUF8IV5+OGLzAk9ONQhXev43FpZ03cP/8E8SHJaBAIi36mVBfCOvylmjQwRkdvVqjcZf6ZbJ7+FIkRifj4d/PcPOoHyKDopGRnPXRzx1rOqBBe2fUb++MBh2cVf5/VAYR4daxe9i74Cjev42DgZE+RNN6wXvmTyoHGOfninFwyQkcW3UWdpVtMWv/JF67JgDwvxWE3wb9Cbmc8Oe9ZShX2VbpmINLT2LPr0dQpV5FzNw3EdUbVVVp/Vq+DlqB+oL8ve0qNk3aBWNzI0zcNALtRa04jZPL5Ti++jx2zzsMc1szTNsxFs17NOZ8XWmBFCfWnMeBJSfACBgMWegN90k91LqZh72MxLnNl/HPrhsQ6unCY6obPKf3LtMUMTKZDMnvUxETEoeY0HjEvYtHfGQSnl7xR25mHkytTNCmTzM06FAXNZtVg2MNh2/6STkvJx8vb73C0yv+eHrVH1GvYwAAlZ0dUa9tHdg6WsO6ghVsKlihav1KZfYQUJyge8HY+stevH4Qgqr1K6HvFDe0F7WEkamhynM+uvQcGybsQHx4Irr7dsKYtUN5/Z3kZOZix8wDuLD1KspXK4cFJ6fDqUFlpeMu7riOtaP+QpeB7fDzjrFfNaOJFtXQCtQXJjwwCqt8NyHkaRg6eLXChA3DOe+mQp+HY6XPBkQERqPnSBeMXjMEhibcbxxx4QnYNGkXHv79DE4NKmPylpFwbsXvKbYkMaFx2D3vMG4duw8LWzMMnCdCz9EunHISagqJuABPr/jj1rF7eHL5RdHOQ6gvRGVnR1StX7dNQtQAACAASURBVAmONcvDws4cFrZmMFc0G1MYmhhofNcll8uRl52PnPScokwUKXHpSIhIRHxEEhIiE5EYmYyYkDgUSKTQMxCiQQdnNOnaEE1cG6JK3YpfLBuFJF+CQL9gPL3ij2fXXiL0eTisHCzhu6Qfuvp0UCs/4OuHIdjz6xE8u/oSFWtXwOQtI9GwQ11ec/jfCsLKIRuQEpMK98k9MXRJP067uIcXn+HXPivRpGsDLD4787veWf9/RitQXwFpgRRHfz+LA4uPw8zGDL9dnsf5wFmSL8HeX4/i+JrzsK9qh2k7x/L60BMR/M48wubJu5H0PgVdh3TA0MXesKuk3FzyOYIfh2L7zAPwvxkEy3LmaNDBGe08WqGdR4svek4kLZAiIjAa4QFRCA+IRHhgFMIDopASm/bJMTq6OtA30oO+oR70jfQh1NOFQEcAHV0d6OgKINARgBEIQHI5irxY5QS5XM7m5RNLUSAugFQihURcgLysfHzqM2JqaYxyVexQrootHGs4oHGX+qjfrg6vcxh1keRLcHnPTfideYSA268gyS+ArlAHzq1roWXPJnAb05XXg09JIl9FY8esg3hw4SnMbUzhPdMdfSZ057WDkcvlOLPhErZN3w8HJzvM2DsRdVrU4DTW/1YQ5vVcgYq1y2PNzUVqvRctXxetQH1FQl+EY3a3pcjJyMWAuR7oN+snzk96AXdeY5XvJsSFJaDH8C4Y+fsgmFqacL52XnYeDiw+gTMbL4FhGPSf3Reev/RS60ZJRHj8zwtcO3ALAbdfIzkmFVXrV4LPIm+07tPsq+aoE+eJkZGUibTETGQkFbbkTIhzJcjPFUOSJ4E4V4z8PDFkBTLIpDLIZXLIpHL2ezlBIGAAhoFAwIBhGDACBkJ9IYR6uhDq6UJXTxdCfSGMTA1hbGEMY3OjomZZzhz2VWy/SoZ3BZJ8CS7uuI4jv51GSmwaKtaugKau7K6tQfs6at/Is9NzcHDpSZz+8yIMTQzg+UtvuE/qwXveiKBorB29Fa/uBaOlWxPM2j+R0+8tLzsPu+YextmN/8ChWjmsvb1Y896fWr4oWoH6yqQlZmDzlN24ecQPTg0qY9rOsajZpBqnsfm5YuxbcBQn116Aua0Zxv85HO1FLXkJQUJkErb+shd3Tj6Eg1M5jPnDB616NVVbTGQyGW4du4/9i47h/ds4VGtUBW36NEeDDs6o07LGF90x/H+npDDVb1cHQxZ6oWHHuhr5f352LQBX992E3+lHKBBL0X1YZwxfMQDmNma813lw6UkcW3UWRmZGGLPGBy6D23NaY2JUEmZ1W4ro4Fj0Gd8dw5YPUOvcTMu3gVagvhHunXuM9WO3Iz0hHaJpveGzyIvzTTzkWRjWjvoLIc/C0dKtCSZuGsHbw+vZ9QBsmrQTUa9j0LhLfXQf1hlt3ZurLSQyqQzXD97BmQ0XEfo8AkQEob4QtVtUR4P2znBqUBk1fnDSxqRoiMyULAT6vcH74FhEB8ciJiQOEYFRyErL0agwvQ+Jw+VdN3DtwG0kx6TC1NIYnfq3xY8jXVCtYRXe8z38+yk2T9mN2HcJ6DqkA0avHsJZ4KLexGCW6xLkZuVh4anpaNSpHu/ra/k20QrUN0R2eg62Td+PSzuvo2LtCpi6dTTnek8yqQyn1l/EvgVHAQboN8sdop/doG/I3S1YWiDF2Y3/4Piac0iJTYN9FVuM+G0Q2nu20oh5ListG4F33+DlrVd4efsVQp+FQS5n/5ZaujWBx1Q3jdw8/7+hiFe6uP06bh71gzhPAgCwsDOHY00HONYsj07926Jx53pq/27TEtKxb+ExXNxxHQDQrHsjuPp0RMteTVXykkuITMLmKbtx7+xjVKxdARM2DOdeXkMmw9mN/2D3vMMwMDbAb5fnqSSOWr5dtAL1DfL48gv8OXYb4iOSeGeCiAtPwNZpe+F35jFsK1pj+PKBvGsxyeVyPL3ijx2zDiLsZSTqtqmFMWt8ULs5t0NqruRl5yEmJB73zz3Buc3/ID0pE9UbV0X3YZ3h3KomqtavpPW++gyZqVm4tv82Lu24joigaBgY66Nz/7bo6tMRlZ0deZ1JKkOcJ8bJtX/j6MozEOdJ0GuMK/rNdlfZ9b1AUoCTa//GwSUnAAAD54vgMbUnZ+/Pd/4RWDvqLwQ/fodmPRpjypaRajv6aPn20ArUN8pHmSDszDFu/TBe50v+t4KwddpehDwLR61m1TBmjQ/qteVXfVcmk+Hy7pvYM/8w0hIyULF2BTRoVwcNOrDBopoqcAiwN8DrB+/i5NrzRfFAegZCVP/BCXWaV0f1H5xgWc4c5jZmMLMxhbmNKa/d4fcIEUGcJ0F2WjYSo1MQH5aA2HcJiAtPQFxYAt48DEWBuAC1m1dHjxEu6OjdWuPnLpkpWbh//gn2LjiKpOgUtO7TDCNXDoJjzfIqzZefK8a1/bdxcu15vH8bhzY/NcPYtb6cgm4Bdpd/eMVpHFx6EqaWxhi7zhed+rXR7rr/R9EK1DdOyLMwrB29FSFPw9Ci5w8Y/+cwOFTldl4jl8tx/eAd7JpzCMkxqWjVuylGrx7Cu6R1blYe/t52DS/+DUDg3TfIzcwDAFStXwkD54nQtm9zteJlikNESIhMwpuHIXjzMASvH4Ui9FkYJPkF/+mrb6iHSs6OaOveAm37tkCl2hU0soavBREh7GUkbh69hzsnHyAxMumjzBkKbCpYwcGpXNFuk0vQKl/8bwZh9/zDCPILBgDUaOKE0auH8I5jUiCTynBh61XsXXAUWanZqN64KnwWeaOlWxPOcwQ/eYd1o7ci9Hk4ugxsh3HrfMsk1ZaWbwetQH0HyKQynNlwCXt+PQKSEwbNF8HjZzfO5pD8XDFOrfsbR347DalECtG0Xug/210lt2KZTIbwl2yy0gtbryA6OBYVajjAc1ovdB3SoUy886QFUsSExiMzOQuZKVnISM5CZnIm0pMy8ep+MF4/CAEAVKpTAW3dW8C5VU04NazyzefqK5AUIORZOILuvkGg3xsE+b1BRnIWBDoCNO5SH9UbVYGJpQlMLIxh62gFe6dysK9iW6Y7x5BnYdg19xCeXPaHraM1eo7uivrt6qBe29oq/y4D777Ghok7EeYfiUad62HIAi9eCYdzMnOxZ94RnNv8DyzszDFhw3C082ip0lq0fF9oBeo7IjE6GVum7sHdUw9R2dkRkzaPRIP2zpzHp8SlYcesA7i2/zZsKlhh5O+D1TKPyP6vvTuPj7K6Fz/++SaZ7HtC9oQskLCEVRYxgIBIEQVF0Iq1tbXWtj+3an+3t9ttvW297e1m7y1ee63WfaGCCKiIgCDKIvsWICzZ933PZJac+8czGaImLElIZsJ5v17zmsnkmWfO4Qnzneec83y/djs71+5l1e/XcXr/OcKiQ1j6yM3c/N35BIcP3Dfb6pIadr6zj0/f3kP2rtNY242zLV9/H+JGxpCYEUdMchTBEUEEhQcSFB5IcEQQgaEBzgt0vX29Mfma8PY1XfbZYEdHBzarHZvFhs1io63ZTGtTG21NbbQ2mWlraqO+qpGaklqqSmqoLqmlpqSWstwK55lh3IgYMmeOIjNrFNcunnJJCYX7Q2VhFcd35pC98xTZu3I4dzifoPBAVvzkdpb8vwW9CoadZ4I71+5l5zt7yT1awLDECL73p3uZtezSh6ltVhtbXv2EF//tDWrL6ln8/QXc9+SKQb2WTBtYOkC5oT3vHmDlw89TUVDF/K/P5v7f3XNZk9XZu3J4+pHnOXMwj+Sxicy7exZLH13U60SgSikObzvOP/+wjv2bjgAQHhtG/MgYUscNZ8mDCwds+K2loYUzB/OMJdanSyk6XUrx6TIq8quw2+yXtA8RwcPTyCDh6dmZSUJQHV2Lop0PTB32jkvar4eHEBYT6syxF5McxdjrMhiblTFgF5SaW9v54B8fcWjrMc4czKWqqAYAv0BfRl87kknzxrH4+wt6FQSa61v45x/Wse3NnZTnVSIiZM4cxcyl01n0wPxL/vtSSrF91S5e+PkblOVWkD4ljYdXfrvfF+lork8HKDfVmR16zVPvYvIx8Y0n7uTWhxZe8qo3u93O5pc+5sOXt3Nsx0mGJURw33/czby7Z/ZpWOzs4Tz2vn+IkrNllJwp4+zBPCxmK9ffOYMF984ZtIzjSinMLWaaaptprG2mqbaZ5roWzK3tWM1WLGYr7W0WLG0W7DY7dnsHHV1vHR14eHggAoiRScLDQ/Dy9sLLZGSRMB574hvgg3+QH35BfvgH+eIX5EdIZBBh0aGDlry2pbGVDf+ziTVPvUt9VSMJ6bGkTUwmM2s0Y7MySB0/vNdta65vYe1/vc+av7xLa2MbUxZOZObS6cxYcvlnggUni1n58PMc/ug4aROTnfNUehHE1UkHKDdXcraMpx99gX0bD5GcmcjDK++/rGE/MIrR/e2HL3HmQC6jpo3gvv+4m8yZo/ol4Wt9VQNr/vwu65/ZZGQcDwtgxq1Tmb3sWibNH68zTF8hSinK8yvJPVLAiV05vP/cVprrW5i6cCIrfnL7JV9fdyHN9S28/Zf3ePu/3qOloZWspdP4+i/uuOxrkZRSnD6Qy6YXtrHxuS34Bvhy35MrWPTA/H5bfKO5Jx2ghgClFLvW7eOZx16koqCKuSuyWP744ktOmQTGcNWWV3bwj5+9Tk1pHSYfEyMmJZMxZQQZ00aQddvUPuVqs7RbObj5KDtW72bXun20NLTiH+xH8thEwmJCCY8ONe5jQomMD2fivMwhv4y8P7Q0tnJo6zHqKxtprGmiprSWvGOF5B4toKWhFTCGFq+7bRorfrL0sv4mutPe1s6eDQfI3pXDhy9tp6WhlZm3T+eef1t+2YGpobqRjc9tZfMrH1N4sgSTj4kb7p7Jfb/92oDNwWmuTQeoIcTc2s6bv13LW39aj8Vs5YZ7ZnH/7+4hMi78kvfR1mJm73sHObX3LDn7z3Jmfy7m1nbCokNY9thibn5gfq/Kx3dltVg5tPU4u97ZS2luBXXl9dSW19NYc75AX1BYAPO/fj2LvjOf5LGuX4p9INltdnL2nWXzyx+z5dUdmFvanb/zD/YjOTOJtAnJpE0YTuqEZJIzE/EL8O3be9rtbH55By//chVVxTWYvL2Yfss1vQpMbS1mNj63lVf+/S2a61vInDmKG79+PbPvmNHnvy1taHGbACUi+UATYAdsF2v01RigOrU0trLqP99h9Z824Gny5Gs/X87tP7i5V8Npdrud7J05vPrr1Rzaegy/QF9u+vYNLH10ETHJUf3abqvFSl1FA4UnS9j04jY+XbMHm9XOmOsyWPCN6xl5TSqJo+L7/GHrjqqKa9i/6TD7Nh3m0JZjNNe3YPIxMXdFFgu/NY/YVGOVYn8v829rMXPgwyO89ItV5GcXkTE1jW/9ZgXjrx9z2UPAlYVVrHt6Exuf20JTXQuTbhjH95/65iWXmtGuPu4WoKYopaovZfurOUB1Kj1Xzt9++BK71+8nbkQMi+6fz4Q5Yxg5ObVXE+JnD+Wx+s8b2L5qF0opZi+/lqzbphGTEkVMShQhkcH9OpldX9XA5pd38P7fN1N8usz5fFRSJEmj40nMiCcsOpTAsAACQwMIDAsgKCwA3wBfTD5G6QtvX5OzJIanyXPQ5jSUUtistvPL0a12rO1WzC3ttDWbMbeYMTebaW0yU1tWR3VJLdWlxnL0qqJqyvOrAIiIC2PqVyYy5SsTmXzj+H5PZ1R6tpyTn50lZ+8ZTu07S/7xIjrsHSSkx/Kt36y4rGXiYAwdn9iVw9q/buTTtz8Dpci6fTq3P7KIsVmXfi2UdnXSAeoqsO+DQzz/09c5dzgfgLDoEL75q7v4yn1ze/WBXVVcwzv//T7vPrvZmVUCICE9lq/9fDlzV2T1ayBQSlF4qoTCE8UUniyh8JRxX5xTirm1/eI76CIxI470KWmkX5NG6oThxI2IISI2rF9X17U0tlJ4soSCE8UUniii4GQxOXvPOiv9XgpvXxOR8eHOku8jJ6cx5StXptpufnYRr/1mNTve2u1M3hsUFkDGtBFkTB3B6OkjuWbBhMtafamU4pM1e3jux69RlltBYGgAi+6/gSUPLrzktEaa5k4BKg+oAxTwv0qpZ7vZ5gHgAYCkpKRrCgoKBraRLq62vI5jO07yzsqNHP/0FKnjh3PPL+5gylcm9GrYrPMbd3l+FWXnKtj04jZyjxYQkxLFnDuvY/YdMxgxKeWKfktub2unub6V5rpm57251YLFbHFWurWYrcZ9m4W844Xk7Dv7uQq7IkJYdIgzGASGBeDja1TX9fX3wcffB08vD+y2DkcRQ6OgobXdSlNdC011zTTWNBlL2KubqC2vd+7b5GMiMSOOtEnJxKfFYvI5vyzd5OOFb4AvvgE++AWevw+LCSUoLPCKn13kHSvglV+v5pPVe5xDtxlT00ifOoL4ETG9fv9Te8/wtx++RPbOHFLHD2fZY7cwa3o8fls2QX09hIbCrbdCop5b1C7MnQJUnFKqVESigM3Aw0qpHT1tr8+geqaUYsfqPfz9R69QUVCFt6+JSTeMY8biKUy/5ZrLWlTRVUdHBzvX7uW9v2/h0NZjdNg7iEuLZvbyGWQtNYYCg8IDXWLpcHVpLQXZRVTkV1FdUktVcQ01pbVUl9TS2thmVNdtbae91dJt+fbOa6ACwwIJjjifnSIoLJD4ETEkjUlg+JgEYlKiXKK/LY2t5B8vIu9YIXnHCjh3JJ/snTn4B/lx28M3seyxW/qU166prpmC7CLe/d/NbH3tE+Ms/dcrKKsYzdf2PILv+2uh4/wFzcrDg3PjlzJi40qIiemPLmpDkNsEqM81QOQJoFkp9ceettEB6uJsVhtHd5xkz4b97N6wn/K8SgBSxw9n0g3j+Oq/3tbr5b4N1Y3sfGcfO1bvdgYrMD7YgyOCCBkWTMiwYFIyk1j8/QUMH+Oa36aVUlgtNuxWG55ennh6eRqZJVx47qTgZDHrn/6AghPFNNU201Dd+LkzRv8gP5IzE5k8fzxLH13Uq7RUSimjTMozm8g7VkhtmbF/k4+J5Y/fwl0/XsqqlQ3M/mkWaeSiTCZkyRLIyMB8NAfPd9dhwkZDZCohx3dBtC5YqX2ZWwQoEQkAPJRSTY7Hm4FfKaU+6Ok1OkBdHqUUBSeK2bNhP4e2HefwR8fx8fPmjh8uYdnjt/SpjENjTROHPjpOXXk99VUN1Fc20lDdSF1FPaf352JttzJxXia3PXQT1y6+xiXOONxNdWkt+zcdYcdbu9j3wWFMPiYypqY5cw/Gj4glZVwSKeOSiB4+rNcBtr2tnR1v7WH9M5s49dkZYlOjyZw1iuQxiQwfm0j6lDTnlxrz4uX4vruGA0zmX0au481PEwCYOxcaThSzyfdWxpoPwrJlsHp1v/1baEOHuwSoVGCt40cv4HWl1JMXeo0OUH1TlFPCCz9/g0/WfEZoVAhf+9kypi2aRHTysH4NIJ0Xa65/ZhNVRTVEDx/G9XfMIHF0AokZcSRmxOmSCl+glKK5voWzh/LY/8Fh9n94hNyjxnxrZHw4Nz9wI7d870ZCh/Xfxa752UW89+xmtryyg+b6FhLSY1n22GJu+va87heYFBZCSgrK05MbknPZdiaBYY61EVVVMGYMfPxqEZHTUo2hv/x8PSelfYlbBKje0AGqf5z87AzP/+Q1jmzPBsDk7UX8yFgSMuJISI8jfmQss5ZNJyDYv0/vY7fZ2bV+P+ufNhZw2KznE7sGRwQRlxZNYFgAfkF+BAT54R/sj3+wH96+3s4FBwEh/ky6YVyv59AGi81qI3tnDoWnSrBZbM6cgO2t7bS3WWhvs9BYYyy+qC2ro6683lknysvkSeas0UxZMJGpCyeSMi6pz8OPlYVV7N5wgOriGmrK6ig8WUzOvnOYvL2YuWw6N3/nRsZfP+bC77NyJTz8MCxbRuX/rCYz0whMAMOGwfHjEBUFLF8Oa9YY2z/4YJ/arQ09vQlQugb3VWT09JH8YesvOX0gl7yjBRTllFKUU0JBdhG71+/HbrPz7P9/iWWPLea2R27qdaDy9PJk1u3TmXX7dOw2O2V5lRTnlFKUU0pxTgnlBVU017dSWVhNa2ObcWtq63ZfSaPjGTdrDGNmpDNmRjrxI2Ndas7IYrZQcqaMU3vPsnfjIQ5uOfq55fqdTD4moxSInzfBEYGEx4aRkB5LeHSoI1t8LBPmjOlTCqquinJKWPvfG9n43BZsVjteJk/CY8OITIjggT98gwX3Xk9IZPCl7azesZIxI+PC26WnG/d1dRfeTtMukQ5QVxkRIWNKGhlTPp/HzWa1cfpALm/89m1e/MWbrHlqA7f/4BaWPnJTn2r2eHp5kjAyloSRsResuNrR0YHNYsNqMZaT15bVs3/TYQ59dIztq3by3rObAQgKD2Tk5BQiEyKIjAt3Xl8UERtGQIg/fkF+zmXefcnkbrfZaW+zGMvNa5ocN+NxRX4lhadKKDpVQnlepfN6o2EJEcy58zqmLZpMxtQ0vH2NgOTtaxqQYovl+ZVsX7WL7at2cu5wPp5eniy8bx53/ssSYlKiet+G0FAAzEdzmDvXOHvqOsQ3dy5s2wZRp08bT4YNTLkRbejTQ3zal5w+cI5Xf72a3ev3IyJEJw8jIT2WhPQ4EjPiiR8ZQ1B4IP7B/oREBvVrBoTudHR0UHiyhBO7T3Nydw55xwupKa2jtqzOGRy64xvgg8nHhJfJ07lqz9PkiYeHGK9Tynlvt3dgabM4S3VcqC6UycdEQnosSaPjSRqVQOKoeFLHJ5E0OuGKnt1ZzBZnnsOGKqMKcWN1E/WVDRz5ONtZjXj0tSOZ89UsZt8xo3+GSAsLUSkp2Do8SSGXkDEJbNtm/GruXDhxAuaNLGJLXiqi56C0Hug5KK1fnTmYy+71+41CgTmlFJ8u/VwyUzDOyLKWTmP544sZe91FhoD6md1up66igZqSWmrL651DheYuVXCtFht22/kLcu02oyiheIhxRiEYtaE8BB9f42zH21GV18fPm4DQAIIjjOuiQiKDCI4IIjgyaEBXJ1YUVLFu5Ubef26rM6t5Vx6eHqSMS2LOV7O4/s4ZxKb0/zLvs5OWM+LwGrJ9JxO96x0iJxkBqLISVsws4vdnbuMa9Co+rWc6QGlXlFKK6pJaSs+V09LQSmtjG3nHCp0JQ+NGxDB90WSmLZrM+Nmj+z3Z6dXEbrdzYtdp1v71fXa+/RmIMGvZdKYsmEhwZBAhkca1ZyGRRrn7Kz4vV15Ow7gsQqpzwcvLyB6Rng6nT6PWrUNsNkhNhV36OiitezpAaYOircXM1lc/Ydf6fRzZdhyL2Yqvvw+T5o9jzIwMImLDCI0OIdxRI2qgz0Bckd1up63JTEtDKy0NrVQV15B/vIj87ELyjxdReLIYi9lKUFgAi74znyUPLiQqMXJwG11eDg89BGs/n0kCDw9YuhSefloHJ61HOkBpg87c2s6R7dl89t5B9r5/kIqCqm63c65qcwyp+fh542nyxOTtRdqEZGYsmcqkG9yv0KHVYiV7Zw77PjhM9q5TmFvanYs/7FY7VovNOQTZnWEJESRnJpI8NpG0iSlcd9tU1ytJUlQE69cbq/XCwmDJEj3npF2UDlCay2lrbqO2vN5ZyLC2vJ7G6qbz1we1WbC0G49tVmPl3Kk9Z2htasPb10S6Y8Vh6oRk0iYmkzQ6vl/K1/cHpRQN1Y2U51Vy9lA++z44xKGtx2hrNuNl8iRj2giCI4LwMnni5W0klfXy8sIv0Bf/YD8CQvydt/DYMJLHJuoif9qQpa+D0lyOX6Af8SP8iB8Re8mvsVqsHNl+goObj3Dk4xNs+NuHWMxWwLiYNTYthvCYUEKjggmJDCY0KoTQYcH4BvoaGcX9vfEN8MXH3xuTtxcenh6fz73nIagOhVKOW4exms/abnXcbM7HrY1tNNe3GNnV61toqW+hpqyOstwKyvMqaWs2O9sdlRTJvLtnMe2mSUycl9mnlFKapukzKM0N2G12is+UkXukgNwj+RSfKTOWWVc2UF/ZQFNdy4C0w8PTg8DQAMJjQolJjSImOYrY1GhiUqJIGhXvchcRa5or0WdQ2pDk6eXJ8NEJDB+dwNy7sr70e6vFSmNNM+YWM+2tFsyt7Zhb2mlvbcdmtdPhXGLegd1u1IHy8BAQwcNDEBHEQ4xqvZ3Vex2P/YP9CQz1JyA0AF9/Hx2ANG0A6QCluT2Tt4mIWJ29QNOGmiuff0XTNE3TekEHKE3TNM0l6QClaZqmuSQdoDRN0zSXpAOUpmma5pJ0gNI0TdNckg5QmqZpmkvSAUrTNE1zSTpAaZqmaS5JByhN0zTNJekApWmaprkkHaA0TdM0lzQoAUpEFopIjoicFZEfD0YbNE3TNNc24AFKRDyBp4GbgDHAChEZM9Dt0DRN01zbYJxBTQPOKqVylVIW4E3g1kFoh6ZpmubCBqMeVDxQ1OXnYmD6FzcSkQeABxw/tovI8QFo20CKBKoHuxH9TPfJPQy1Pg21/sDQ7FPG5b5gMAJUdyVJv1R3Xin1LPAsgIjsv9xSwa5O98k96D65vqHWHxi6fbrc1wzGEF8xkNjl5wSgdBDaoWmaprmwwQhQ+4CRIpIiIt7AXcD6QWiHpmma5sIGfIhPKWUTkYeATYAn8A+lVPZFXvbslW/ZgNN9cg+6T65vqPUHdJ8AEKW+NP2jaZqmaYNOZ5LQNE3TXJIOUJqmaZpLcukANRRTIolIvogcE5HDvVl26SpE5B8iUtn1+jQRCReRzSJyxnEfNphtvBw99OcJESlxHKvDIrJoMNt4uUQkUUS2ichJEckWkUcdz7vzceqpT257rETEV0T2isgRR5/+3fF8ioh85jhOqxyLytzCBfr0oojkdTlOEy+4H1edg3KkRDoN3IixNH0fsEIpdWJQG9ZHIpIPTFFKYyuyZAAABiJJREFUufVFeCIyG2gGXlZKZTqe+z1Qq5T6neMLRZhS6l8Hs52Xqof+PAE0K6X+OJht6y0RiQVilVIHRSQIOADcBnwT9z1OPfXpTtz0WImIAAFKqWYRMQGfAo8CjwNvK6XeFJG/AUeUUs8MZlsv1QX69D3gXaXU6kvZjyufQemUSC5MKbUDqP3C07cCLzkev4TxweEWeuiPW1NKlSmlDjoeNwEnMTK5uPNx6qlPbksZmh0/mhw3BcwDOj/I3e049dSny+LKAaq7lEhu/YfooIAPReSAI53TUBKtlCoD44MEiBrk9vSHh0TkqGMI0G2Gwr5IRJKBScBnDJHj9IU+gRsfKxHxFJHDQCWwGTgH1CulbI5N3O7z74t9Ukp1HqcnHcfpKRHxudA+XDlAXVJKJDeUpZSajJHN/UHH0JLmmp4B0oCJQBnwp8FtTu+ISCCwBviBUqpxsNvTH7rpk1sfK6WUXSk1ESOzzjRgdHebDWyr+uaLfRKRTOAnwChgKhAOXHBo2ZUD1JBMiaSUKnXcVwJrMf4Yh4oKxxxB51xB5SC3p0+UUhWO/2QdwN9xw2PlGP9fA7ymlHrb8bRbH6fu+jQUjhWAUqoe2A5cC4SKSGcyBbf9/OvSp4WOIVqllGoHXuAix8mVA9SQS4kkIgGOiV1EJABYAAylLO3rgXsdj+8F1g1iW/qs80PcYSludqwcE9XPAyeVUn/u8iu3PU499cmdj5WIDBORUMdjP2A+xtzaNmC5YzN3O07d9elUly9GgjGndsHj5LKr+AAcS0X/wvmUSE8OcpP6RERSMc6awEgz9bq79klE3gDmYJQFqAB+CbwD/BNIAgqBO5RSbrHwoIf+zMEYMlJAPvDdzrkbdyAiM4FPgGNAh+Ppn2LM2bjrceqpTytw02MlIuMxFkF4Ypw0/FMp9SvH58WbGENhh4B7HGceLu8CffoIGIYxhXMY+F6XxRRf3o8rByhN0zTt6uXKQ3yapmnaVUwHKE3TNM0l6QClaZqmuSQdoDRN0zSXpAOUpmma5pJ0gNI0BxHpcblrN9vOEZHrrmR7LvL+PxCRb/TDft4UkZH90SZN6286QGla78wBBiVAObIL3Ae83g+7ewb4UT/sR9P6nQ5QmnYBIrLYUZPnkIhsEZFoR5LS7wGPOWrazHJcOb9GRPY5blmO1z/hSF66XURyReSRLvv+hiNp5hEReUVEghy1ckyO3weLUT/M9IVmzQMOdiYSdez7KRHZIUadpKki8rYYdYR+49gmQETec7zXcRH5qmNfnwDzu6TU0TSXof8oNe3CPgWuVUopEbkf+JFS6oeO+jzO+kMi8jrwlFLqUxFJAjZxPuHnKGAuEATkiMgzQDrwM4zkwdUiEq6UahKR7cDNGFk57gLWKKWsX2hTFkYdpK4sSqnZYhTwWwdcg1E+5JyIPIVxxleqlLrZ0d4QAKVUh4icBSZ0s09NG1Q6QGnahSUAqxw5xLyBvB62mw+MMVKMARDcmXcReM+RoqZdRCqBaBy1fjoLV3ZJNfQcxpDbO8C3gO90816xGLnauurMU3kMyO5M8yMiuRhJl48BfxSR/8QoGPdJl9dWAnHoAKW5GD3Ep2kX9ldgpVJqHPBdwLeH7TyAGUqpiY5bvKOgHkDX/Gl2jC+GQjflE5RSO4FkEbke8FRKdZdMs62bdnS+R8cX3q8D8FJKncY4qzoG/FZEftFlG1/HPjXNpegApWkXFgKUOB7f2+X5Jowhu04fAg91/iAiEy+y363AnSIS4dg+vMvvXgbewChH0J2TwIiLtrwLEYkDWpVSrwJ/BCZ3+XU6kH05+9O0gaADlKad5y8ixV1ujwNPAG+JyCdAdZdtNwBLOxdJAI8AUxyLHk5gLKLokVIqG3gS+FhEjgBdy2G8BoRhBKnubAQut9DlOGCvGBVOfwZ0Lp6IBtrcJfO3dnXR2cw1zcWIyHLgVqXU1y+wzVqMBRtn+vhejwGNSqnn+7IfTbsS9CIJTXMhIvJX4CZg0UU2/THGYok+BSigHnilj/vQtCtCn0FpmqZpLknPQWmapmkuSQcoTdM0zSXpAKVpmqa5JB2gNE3TNJekA5SmaZrmkv4Prcfje/owoMsAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"pval = multivariateGaussian(Xval, mu, sigma2)\n",
"\n",
"epsilon, F1 = selectThreshold(yval, pval)\n",
"print('Best epsilon found using cross-validation: %.2e' % epsilon)\n",
"print('Best F1 on Cross Validation Set: %f' % F1)\n",
"\n",
"# Find the outliers in the training set and plot the\n",
"outliers = p < epsilon\n",
"\n",
"# Visualize the fit\n",
"visualizeFit(X, mu, sigma2)\n",
"pyplot.xlabel('Latency (ms)')\n",
"pyplot.ylabel('Throughput (mb/s)')\n",
"pyplot.tight_layout()\n",
"\n",
"# Draw a red circle around those outliers\n",
"pyplot.plot(X[outliers, 0], X[outliers, 1], 'ro', ms=10, mfc='None', mew=2)\n",
"pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have run our code successfuly on a small, low dimension dataset, we can apply it to higher dimensions. The following cell will do so on a dataset where each example is described by 11 features. "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best epsilon found using cross-validation: 1.38e-18\n",
"Best F1 on Cross Validation Set : 0.615385\n",
"\n",
"\n",
"# Outliers found: 117\n"
]
}
],
"source": [
"# Loads the second dataset. You should now have the\n",
"# variables X, Xval, yval in your environment\n",
"data = loadmat(os.path.join('Data', 'ex8data2.mat'))\n",
"X, Xval, yval = data['X'], data['Xval'], data['yval'][:, 0]\n",
"\n",
"# Apply the same steps to the larger dataset\n",
"mu, sigma2 = estimateGaussian(X)\n",
"\n",
"# Training set \n",
"p = multivariateGaussian(X, mu, sigma2)\n",
"\n",
"# Cross-validation set\n",
"pval = multivariateGaussian(Xval, mu, sigma2)\n",
"\n",
"# Find the best threshold\n",
"epsilon, F1 = selectThreshold(yval, pval)\n",
"\n",
"print('Best epsilon found using cross-validation: %.2e' % epsilon)\n",
"print('Best F1 on Cross Validation Set : %f\\n' % F1)\n",
"print('\\n# Outliers found: %d' % np.sum(p < epsilon))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
2 Recommender Systems
\n",
"In this part of the exercise, we will implement the collaborative filtering learning algorithm and apply it to a dataset of movie ratings. This dataset consists of ratings on a scale of 1 to 5. The dataset has 943 users and 1682 movies. \n",
"\n",
"To begin, we load and plot the dataset ex8_movies.mat."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average rating for movie 1 (Toy Story): 3.878319 / 5\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Load data\n",
"data = loadmat(os.path.join('Data', 'ex8_movies.mat'))\n",
"Y, R = data['Y'], data['R']\n",
"\n",
"# Y is a 1682x943 matrix, containing ratings (1-5) of \n",
"# 1682 movies on 943 users\n",
"\n",
"# R is a 1682x943 matrix, where R(i,j) = 1 \n",
"# if and only if user j gave a rating to movie i\n",
"\n",
"# From the matrix, we can compute statistics like average rating.\n",
"print('Average rating for movie 1 (Toy Story): %f / 5' %\n",
" np.mean(Y[0, R[0, :] == 1]))\n",
"\n",
"# We can \"visualize\" the ratings matrix by plotting it with imshow\n",
"pyplot.figure(figsize=(8, 8))\n",
"pyplot.imshow(Y)\n",
"pyplot.ylabel('Movies')\n",
"pyplot.xlabel('Users')\n",
"pyplot.grid(False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We begin constructing our collaberative filtering algorithm by implementing the regularized cost function which returns our cost and cost gradient. "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def cofiCostFunc(params, Y, R, num_users, num_movies,\n",
" num_features, lambda_=0.0):\n",
" \"\"\"\n",
" Collaborative filtering cost function.\n",
" \n",
" Parameters\n",
" ----------\n",
" params : array_like\n",
" The parameters which will be optimized. This is a one\n",
" dimensional vector of shape (num_movies x num_users, 1). It is the \n",
" concatenation of the feature vectors X and parameters Theta.\n",
" \n",
" Y : array_like\n",
" A matrix of shape (num_movies x num_users) of user ratings of movies.\n",
" \n",
" R : array_like\n",
" A (num_movies x num_users) matrix, where R[i, j] = 1 if the \n",
" i-th movie was rated by the j-th user.\n",
" \n",
" num_users : int\n",
" Total number of users.\n",
" \n",
" num_movies : int\n",
" Total number of movies.\n",
" \n",
" num_features : int\n",
" Number of features to learn.\n",
" \n",
" lambda_ : float, optional\n",
" The regularization coefficient.\n",
" \n",
" Returns\n",
" -------\n",
" J : float\n",
" The value of the cost function at the given params.\n",
" \n",
" grad : array_like\n",
" The gradient vector of the cost function at the given params.\n",
" grad has a shape (num_movies x num_users, 1)\n",
" \"\"\"\n",
" # Unfold the U and W matrices from params\n",
" X = params[:num_movies*num_features].reshape(num_movies, num_features)\n",
" Theta = params[num_movies*num_features:].reshape(num_users, num_features)\n",
"\n",
" J = 0\n",
" X_grad = np.zeros(X.shape)\n",
" Theta_grad = np.zeros(Theta.shape)\n",
"\n",
" predMovieRatings = np.dot(X, Theta.transpose())\n",
" predMovieError = predMovieRatings - Y\n",
" error_factor = np.multiply(predMovieError, R)\n",
" J = (.5)*np.sum(np.sum(np.square(error_factor)))\n",
" X_grad = error_factor.dot(Theta)\n",
" Theta_grad = np.dot(error_factor.transpose(), X)\n",
" J += (lambda_/2)*np.sum(np.sum(np.square(Theta))) + (lambda_/2)*np.sum(np.sum(np.square(X)))\n",
" X_grad += lambda_*X\n",
" Theta_grad += lambda_*Theta\n",
" \n",
" grad = np.concatenate([X_grad.ravel(), Theta_grad.ravel()])\n",
" return J, grad"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can confirm our gradient vector is correct by comparing it to a numerically computed alternative."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def computeNumericalGradient(J, theta, e=1e-4):\n",
" \"\"\"\n",
" Computes the gradient using \"finite differences\" and gives us a numerical estimate of the\n",
" gradient.\n",
"\n",
" Parameters\n",
" ----------\n",
" J : func\n",
" The cost function which will be used to estimate its numerical gradient.\n",
"\n",
" theta : array_like\n",
" The one dimensional unrolled network parameters. The numerical gradient is computed at\n",
" those given parameters.\n",
"\n",
" e : float (optional)\n",
" The value to use for epsilon for computing the finite difference.\n",
"\n",
" Returns\n",
" -------\n",
" numgrad : array_like\n",
" The numerical gradient with respect to theta. Has same shape as theta.\n",
"\n",
" Notes\n",
" -----\n",
" The following code implements numerical gradient checking, and\n",
" returns the numerical gradient. It sets `numgrad[i]` to (a numerical\n",
" approximation of) the partial derivative of J with respect to the\n",
" i-th input argument, evaluated at theta. (i.e., `numgrad[i]` should\n",
" be the (approximately) the partial derivative of J with respect\n",
" to theta[i].)\n",
" \"\"\"\n",
" numgrad = np.zeros(theta.shape)\n",
" perturb = np.diag(e * np.ones(theta.shape))\n",
" for i in range(theta.size):\n",
" loss1, _ = J(theta - perturb[:, i])\n",
" loss2, _ = J(theta + perturb[:, i])\n",
" numgrad[i] = (loss2 - loss1)/(2*e)\n",
" return numgrad"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def checkCostFunction(cofiCostFunc, lambda_=0.):\n",
" \"\"\"\n",
" Creates a collaborative filtering problem to check your cost function and gradients.\n",
" It will output the analytical gradients produced by your code and the numerical gradients\n",
" (computed using computeNumericalGradient). These two gradient computations should result\n",
" in very similar values.\n",
"\n",
" Parameters\n",
" ----------\n",
" cofiCostFunc: func\n",
" Implementation of the cost function.\n",
"\n",
" lambda_ : float, optional\n",
" The regularization parameter.\n",
" \"\"\"\n",
" # Create small problem\n",
" X_t = np.random.rand(4, 3)\n",
" Theta_t = np.random.rand(5, 3)\n",
"\n",
" # Zap out most entries\n",
" Y = np.dot(X_t, Theta_t.T)\n",
" Y[np.random.rand(*Y.shape) > 0.5] = 0\n",
" R = np.zeros(Y.shape)\n",
" R[Y != 0] = 1\n",
"\n",
" # Run Gradient Checking\n",
" X = np.random.randn(*X_t.shape)\n",
" Theta = np.random.randn(*Theta_t.shape)\n",
" num_movies, num_users = Y.shape\n",
" num_features = Theta_t.shape[1]\n",
"\n",
" params = np.concatenate([X.ravel(), Theta.ravel()])\n",
" numgrad = computeNumericalGradient(\n",
" lambda x: cofiCostFunc(x, Y, R, num_users, num_movies, num_features, lambda_), params)\n",
"\n",
" cost, grad = cofiCostFunc(params, Y, R, num_users,num_movies, num_features, lambda_)\n",
"\n",
" print(np.stack([numgrad, grad], axis=1))\n",
" print('\\nThe above two columns you get should be very similar.'\n",
" '(Left-Your Numerical Gradient, Right-Analytical Gradient)')\n",
"\n",
" diff = np.linalg.norm(numgrad-grad)/np.linalg.norm(numgrad+grad)\n",
" print('If your cost function implementation is correct, then '\n",
" 'the relative difference will be small (less than 1e-9).')\n",
" print('\\nRelative Difference: %g' % diff)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 13.86445373 13.86445373]\n",
" [ -0.50346339 -0.50346339]\n",
" [ -0.25274807 -0.25274807]\n",
" [ -7.16541284 -7.16541284]\n",
" [ 3.10313028 3.10313028]\n",
" [ 0.56829314 0.56829314]\n",
" [ -1.04192584 -1.04192584]\n",
" [ 2.07795586 2.07795586]\n",
" [ -0.68986789 -0.68986789]\n",
" [ 1.86079356 1.86079356]\n",
" [ -2.40363355 -2.40363355]\n",
" [ -0.20257324 -0.20257324]\n",
" [ -2.35627103 -2.35627103]\n",
" [ 0.99584362 0.99584362]\n",
" [ -0.94845546 -0.94845546]\n",
" [ 6.87482798 6.87482798]\n",
" [ -1.90959988 -1.90959988]\n",
" [ 0.30039997 0.30039997]\n",
" [ 1.99317192 1.99317192]\n",
" [ -0.71867099 -0.71867099]\n",
" [ -0.13605671 -0.13605671]\n",
" [-19.15609492 -19.15609492]\n",
" [ 6.2449762 6.2449762 ]\n",
" [ 0.34766409 0.34766409]\n",
" [ 3.77041093 3.77041093]\n",
" [ -4.92417175 -4.92417175]\n",
" [ 0.16311157 0.16311157]]\n",
"\n",
"The above two columns you get should be very similar.(Left-Your Numerical Gradient, Right-Analytical Gradient)\n",
"If your cost function implementation is correct, then the relative difference will be small (less than 1e-9).\n",
"\n",
"Relative Difference: 2.96831e-12\n"
]
}
],
"source": [
"# Check gradients by running checkCostFunction\n",
"checkCostFunction(cofiCostFunc, 1.5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have a working collaborative filtering cost function and gradient, we can start training our algorithm to make movie recommendations. The following cells will take in your user ratings, train the model, and make recommendations."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"def loadMovieList():\n",
" \"\"\"\n",
" Reads the fixed movie list in movie_ids.txt and returns a list of movie names.\n",
"\n",
" Returns\n",
" -------\n",
" movieNames : list\n",
" A list of strings, representing all movie names.\n",
" \"\"\"\n",
" # Read the fixed movieulary list\n",
" with open(join('Data', 'movie_ids.txt'), encoding='ISO-8859-1') as fid:\n",
" movies = fid.readlines()\n",
"\n",
" movieNames = []\n",
" for movie in movies:\n",
" parts = movie.split()\n",
" movieNames.append(' '.join(parts[1:]).strip())\n",
" return movieNames"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"New user ratings:\n",
"-----------------\n",
"Rated 4 stars: Toy Story (1995)\n",
"Rated 3 stars: Twelve Monkeys (1995)\n",
"Rated 5 stars: Usual Suspects, The (1995)\n",
"Rated 4 stars: Outbreak (1995)\n",
"Rated 5 stars: Shawshank Redemption, The (1994)\n",
"Rated 3 stars: While You Were Sleeping (1995)\n",
"Rated 5 stars: Forrest Gump (1994)\n",
"Rated 2 stars: Silence of the Lambs, The (1991)\n",
"Rated 4 stars: Alien (1979)\n",
"Rated 5 stars: Die Hard 2 (1990)\n",
"Rated 5 stars: Sphere (1998)\n"
]
}
],
"source": [
"# Before we will train the collaborative filtering model, we will first\n",
"# add ratings that correspond to a new user that we just observed. This\n",
"# part of the code will also allow you to put in your own ratings for the\n",
"# movies in our dataset!\n",
"movieList = loadMovieList()\n",
"n_m = len(movieList)\n",
"\n",
"# Initialize my ratings\n",
"my_ratings = np.zeros(n_m)\n",
"\n",
"# Check the file movie_idx.txt for id of each movie in our dataset\n",
"# For example, Toy Story (1995) has ID 1, so to rate it \"4\", you can set\n",
"# Note that the index here is ID-1, since we start index from 0.\n",
"my_ratings[0] = 4\n",
"\n",
"# Or suppose did not enjoy Silence of the Lambs (1991), you can set\n",
"my_ratings[97] = 2\n",
"\n",
"# We have selected a few movies we liked / did not like and the ratings we\n",
"# gave are as follows:\n",
"my_ratings[6] = 3\n",
"my_ratings[11]= 5\n",
"my_ratings[53] = 4\n",
"my_ratings[63] = 5\n",
"my_ratings[65] = 3\n",
"my_ratings[68] = 5\n",
"my_ratings[182] = 4\n",
"my_ratings[225] = 5\n",
"my_ratings[354] = 5\n",
"\n",
"print('New user ratings:')\n",
"print('-----------------')\n",
"for i in range(len(my_ratings)):\n",
" if my_ratings[i] > 0:\n",
" print('Rated %d stars: %s' % (my_ratings[i], movieList[i]))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"def normalizeRatings(Y, R):\n",
" \"\"\"\n",
" Preprocess data by subtracting mean rating for every movie (every row).\n",
"\n",
" Parameters\n",
" ----------\n",
" Y : array_like\n",
" The user ratings for all movies. A matrix of shape (num_movies x num_users).\n",
"\n",
" R : array_like\n",
" Indicator matrix for movies rated by users. A matrix of shape (num_movies x num_users).\n",
"\n",
" Returns\n",
" -------\n",
" Ynorm : array_like\n",
" A matrix of same shape as Y, after mean normalization.\n",
"\n",
" Ymean : array_like\n",
" A vector of shape (num_movies, ) containing the mean rating for each movie.\n",
" \"\"\"\n",
" m, n = Y.shape\n",
" Ymean = np.zeros(m)\n",
" Ynorm = np.zeros(Y.shape)\n",
"\n",
" for i in range(m):\n",
" idx = R[i, :] == 1\n",
" Ymean[i] = np.mean(Y[i, idx])\n",
" Ynorm[i, idx] = Y[i, idx] - Ymean[i]\n",
"\n",
" return Ynorm, Ymean"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Recommender system learning completed.\n"
]
}
],
"source": [
"# Now, we will train the collaborative filtering model on a movie rating \n",
"# dataset of 1682 movies and 943 users\n",
"\n",
"# Load data\n",
"data = loadmat(os.path.join('Data', 'ex8_movies.mat'))\n",
"Y, R = data['Y'], data['R']\n",
"\n",
"# Y is a 1682x943 matrix, containing ratings (1-5) of 1682 movies by \n",
"# 943 users\n",
"\n",
"# R is a 1682x943 matrix, where R(i,j) = 1 if and only if user j gave a\n",
"# rating to movie i\n",
"\n",
"# Add our own ratings to the data matrix\n",
"Y = np.hstack([my_ratings[:, None], Y])\n",
"R = np.hstack([(my_ratings > 0)[:, None], R])\n",
"\n",
"# Normalize Ratings\n",
"Ynorm, Ymean = normalizeRatings(Y, R)\n",
"\n",
"# Useful Values\n",
"num_movies, num_users = Y.shape\n",
"num_features = 10\n",
"\n",
"# Set Initial Parameters (Theta, X)\n",
"X = np.random.randn(num_movies, num_features)\n",
"Theta = np.random.randn(num_users, num_features)\n",
"\n",
"initial_parameters = np.concatenate([X.ravel(), Theta.ravel()])\n",
"\n",
"# Set options for scipy.optimize.minimize\n",
"options = {'maxiter': 100}\n",
"\n",
"# Set Regularization\n",
"lambda_ = 10\n",
"res = optimize.minimize(lambda x: cofiCostFunc(x, Ynorm, R, num_users,\n",
" num_movies, num_features, lambda_),\n",
" initial_parameters,\n",
" method='TNC',\n",
" jac=True,\n",
" options=options)\n",
"theta = res.x\n",
"\n",
"# Unfold the returned theta back into U and W\n",
"X = theta[:num_movies*num_features].reshape(num_movies, num_features)\n",
"Theta = theta[num_movies*num_features:].reshape(num_users, num_features)\n",
"\n",
"print('Recommender system learning completed.')"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Top recommendations for you:\n",
"----------------------------\n",
"Predicting rating 5.0 for movie Great Day in Harlem, A (1994)\n",
"Predicting rating 5.0 for movie Saint of Fort Washington, The (1993)\n",
"Predicting rating 5.0 for movie Entertaining Angels: The Dorothy Day Story (1996)\n",
"Predicting rating 5.0 for movie Santa with Muscles (1996)\n",
"Predicting rating 5.0 for movie Star Kid (1997)\n",
"Predicting rating 5.0 for movie They Made Me a Criminal (1939)\n",
"Predicting rating 5.0 for movie Aiqing wansui (1994)\n",
"Predicting rating 5.0 for movie Prefontaine (1997)\n",
"Predicting rating 5.0 for movie Marlene Dietrich: Shadow and Light (1996)\n",
"Predicting rating 5.0 for movie Someone Else's America (1995)\n",
"\n",
"Original ratings provided:\n",
"--------------------------\n",
"Rated 4 for Toy Story (1995)\n",
"Rated 3 for Twelve Monkeys (1995)\n",
"Rated 5 for Usual Suspects, The (1995)\n",
"Rated 4 for Outbreak (1995)\n",
"Rated 5 for Shawshank Redemption, The (1994)\n",
"Rated 3 for While You Were Sleeping (1995)\n",
"Rated 5 for Forrest Gump (1994)\n",
"Rated 2 for Silence of the Lambs, The (1991)\n",
"Rated 4 for Alien (1979)\n",
"Rated 5 for Die Hard 2 (1990)\n",
"Rated 5 for Sphere (1998)\n"
]
}
],
"source": [
"p = np.dot(X, Theta.T)\n",
"my_predictions = p[:, 0] + Ymean\n",
"\n",
"movieList = loadMovieList()\n",
"\n",
"ix = np.argsort(my_predictions)[::-1]\n",
"\n",
"print('Top recommendations for you:')\n",
"print('----------------------------')\n",
"for i in range(10):\n",
" j = ix[i]\n",
" print('Predicting rating %.1f for movie %s' % (my_predictions[j], movieList[j]))\n",
"\n",
"print('\\nOriginal ratings provided:')\n",
"print('--------------------------')\n",
"for i in range(len(my_ratings)):\n",
" if my_ratings[i] > 0:\n",
" print('Rated %d for %s' % (my_ratings[i], movieList[i]))"
]
},
{
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}