{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/krasserm/bayesian-machine-learning/blob/dev/gaussian-processes/gaussian_processes.ipynb)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "try:\n", " # Check if notebook is running in Google Colab\n", " import google.colab\n", " # Get additional files from Github\n", " !wget https://raw.githubusercontent.com/krasserm/bayesian-machine-learning/dev/gaussian-processes/gaussian_processes_util.py\n", " # Install additional dependencies\n", " !pip install GPy==1.9.8\n", "except:\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Gaussian processes\n", "\n", "## Introduction\n", "\n", "In supervised learning, we often use parametric models $p(\\mathbf{y} \\lvert \\mathbf{X},\\boldsymbol\\theta)$ to explain data and infer optimal values of parameter $\\boldsymbol\\theta$ via [maximum likelihood](https://en.wikipedia.org/wiki/Maximum_likelihood_estimation) or [maximum a posteriori](https://de.wikipedia.org/wiki/Maximum_a_posteriori) estimation. If needed we can also infer a full [posterior distribution](https://en.wikipedia.org/wiki/Posterior_probability) $p(\\boldsymbol\\theta \\lvert \\mathbf{X},\\mathbf{y})$ instead of a point estimate $\\boldsymbol{\\hat\\theta}$. With increasing data complexity, models with a higher number of parameters are usually needed to explain data reasonably well. Methods that use models with a fixed number of parameters are called parametric methods. \n", "\n", "In non-parametric methods, on the other hand, the number of parameters depend on the dataset size. For example, in [Nadaraya-Watson kernel regression](https://en.wikipedia.org/wiki/Kernel_regression), a weight $w_i$ is assigned to each observed target $y_i$ and for predicting the target value at a new point $\\mathbf{x}$ a weighted average is computed: \n", "\n", "$$f(\\mathbf{x}) = \\sum_{i=1}^{N}w_i(\\mathbf{x})y_i$$\n", "\n", "$$w_i(\\mathbf{x}) = \\frac{\\kappa(\\mathbf{x}, \\mathbf{x}_{i})}{\\sum_{i'=1}^{N}\\kappa(\\mathbf{x}, \\mathbf{x}_{i'})}$$\n", "\n", "Observations that are closer to $\\mathbf{x}$ have a higher weight than observations that are further away. Weights are computed from $\\mathbf{x}$ and observed $\\mathbf{x}_i$ with a kernel $\\kappa$. A special case is k-nearest neighbors (KNN) where the $k$ closest observations have a weight $1/k$, and all others have weight $0$. Non-parametric methods often need to process all training data for prediction and are therefore slower at inference time than parametric methods. On the other hand, training is usually faster as non-parametric models only need to remember training data. \n", "\n", "Another example of non-parametric methods are [Gaussian processes](https://en.wikipedia.org/wiki/Gaussian_process) (GPs). Instead of inferring a distribution over the parameters of a parametric function Gaussian processes can be used to infer a distribution over functions directly. A Gaussian process defines a prior over functions. After having observed some function values it can be converted into a posterior over functions. Inference of continuous function values in this context is known as GP regression but GPs can also be used for [classification](https://nbviewer.jupyter.org/github/krasserm/bayesian-machine-learning/blob/dev/gaussian-processes/gaussian_processes_classification.ipynb). \n", "\n", "A Gaussian process is a [random process](https://en.wikipedia.org/wiki/Stochastic_process) where any point $\\mathbf{x} \\in \\mathbb{R}^d$ is assigned a random variable $f(\\mathbf{x})$ and where the joint distribution of a finite number of these variables $p(f(\\mathbf{x}_1),...,f(\\mathbf{x}_N))$ is itself Gaussian:\n", "\n", "$$p(\\mathbf{f} \\lvert \\mathbf{X}) = \\mathcal{N}(\\mathbf{f} \\lvert \\boldsymbol\\mu, \\mathbf{K})\\tag{1}\\label{eq1}$$\n", "\n", "In Equation $(1)$, $\\mathbf{f} = (f(\\mathbf{x}_1),...,f(\\mathbf{x}_N))$, $\\boldsymbol\\mu = (m(\\mathbf{x}_1),...,m(\\mathbf{x}_N))$ and $K_{ij} = \\kappa(\\mathbf{x}_i,\\mathbf{x}_j)$. $m$ is the mean function and it is common to use $m(\\mathbf{x}) = 0$ as GPs are flexible enough to model the mean arbitrarily well. $\\kappa$ is a positive definite *kernel function* or *covariance function*. Thus, a Gaussian process is a distribution over functions whose shape (smoothness, ...) is defined by $\\mathbf{K}$. If points $\\mathbf{x}_i$ and $\\mathbf{x}_j$ are considered to be similar by the kernel the function values at these points, $f(\\mathbf{x}_i)$ and $f(\\mathbf{x}_j)$, can be expected to be similar too. \n", "\n", "Given a training dataset with noise-free function values $\\mathbf{f}$ at inputs $\\mathbf{X}$, a GP prior can be converted into a GP posterior $p(\\mathbf{f}_* \\lvert \\mathbf{X}_*,\\mathbf{X},\\mathbf{f})$ which can then be used to make predictions $\\mathbf{f}_*$ at new inputs $\\mathbf{X}_*$. By definition of a GP, the joint distribution of observed values $\\mathbf{f}$ and predictions $\\mathbf{f}_*$ is again a Gaussian which can be partitioned into\n", "\n", "$$\n", "\\begin{pmatrix}\\mathbf{f} \\\\ \\mathbf{f}_*\\end{pmatrix} \\sim \\mathcal{N}\n", "\\left(\\boldsymbol{0},\n", "\\begin{pmatrix}\\mathbf{K} & \\mathbf{K}_* \\\\ \\mathbf{K}_*^T & \\mathbf{K}_{**}\\end{pmatrix}\n", "\\right)\\tag{2}\\label{eq2}\n", "$$\n", "\n", "where $\\mathbf{K}_* = \\kappa(\\mathbf{X},\\mathbf{X}_*)$ and $\\mathbf{K}_{**} = \\kappa(\\mathbf{X}_*,\\mathbf{X}_*)$. With $N$ training data and $N_*$ new input data $\\mathbf{K}$ is a $N \\times N$ matrix, $\\mathbf{K}_*$ a $N \\times N_*$ matrix and $\\mathbf{K}_{**}$ a $N_* \\times N_*$ matrix. Using standard rules for conditioning Gaussians, the predictive distribution is given by \n", "\n", "\n", "\\begin{align*}\n", "p(\\mathbf{f}_* \\lvert \\mathbf{X}_*,\\mathbf{X},\\mathbf{f}) &= \\mathcal{N}(\\mathbf{f}_* \\lvert \\boldsymbol{\\mu}_*, \\boldsymbol{\\Sigma}_*)\\tag{3}\\label{eq3} \\\\\n", "\\boldsymbol{\\mu_*} &= \\mathbf{K}_*^T \\mathbf{K}^{-1} \\mathbf{f}\\tag{4}\\label{eq4} \\\\\n", "\\boldsymbol{\\Sigma_*} &= \\mathbf{K}_{**} - \\mathbf{K}_*^T \\mathbf{K}^{-1} \\mathbf{K}_*\\tag{5}\\label{eq5}\n", "\\end{align*}\n", "\n", "\n", "If we have a training dataset with noisy function values $\\mathbf{y} = \\mathbf{f} + \\boldsymbol\\epsilon$ where noise $\\boldsymbol\\epsilon \\sim \\mathcal{N}(\\mathbf{0}, \\sigma_y^2 \\mathbf{I})$ is independently added to each observation then the predictive distribution is given by\n", "\n", "\n", "\\begin{align*}\n", "p(\\mathbf{f}_* \\lvert \\mathbf{X}_*,\\mathbf{X},\\mathbf{y}) &= \\mathcal{N}(\\mathbf{f}_* \\lvert \\boldsymbol{\\mu}_*, \\boldsymbol{\\Sigma}_*)\\tag{6}\\label{eq6} \\\\\n", "\\boldsymbol{\\mu_*} &= \\mathbf{K}_*^T \\mathbf{K}_y^{-1} \\mathbf{y}\\tag{7}\\label{eq7} \\\\\n", "\\boldsymbol{\\Sigma_*} &= \\mathbf{K}_{**} - \\mathbf{K}_*^T \\mathbf{K}_y^{-1} \\mathbf{K}_*\\tag{8}\\label{eq8}\n", "\\end{align*}\n", "\n", "\n", "where $\\mathbf{K}_y = \\mathbf{K} + \\sigma_y^2\\mathbf{I}$. Although Equation $(6)$ covers noise in training data, it is still a distribution over noise-free predictions $\\mathbf{f}_*$. To additionally include noise $\\boldsymbol\\epsilon$ into predictions $\\mathbf{y}_*$ we have to add $\\sigma_y^2$ to the diagonal of $\\boldsymbol{\\Sigma_*}$\n", "\n", "$$\n", "p(\\mathbf{y}_* \\lvert \\mathbf{X}_*,\\mathbf{X},\\mathbf{y}) = \\mathcal{N}(\\mathbf{y}_* \\lvert \\boldsymbol{\\mu}_*, \\boldsymbol{\\Sigma}_* + \\sigma_y^2\\mathbf{I})\\tag{9}\\label{eq9}\n", "$$\n", "\n", "using the definitions of $\\boldsymbol{\\mu}_*$ and $\\boldsymbol{\\Sigma}_*$ from Equations $(7)$ and $(8)$, respectively. This is the minimum we need to know for implementing Gaussian processes and applying them to regression problems. For further details, please consult the literature in the [References](#References) section. The next section shows how to implement GPs with plain NumPy from scratch, later sections demonstrate how to use GP implementations from [scikit-learn](http://scikit-learn.org/stable/) and [GPy](http://sheffieldml.github.io/GPy/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementation with NumPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we will use the squared exponential kernel, also known as Gaussian kernel or RBF kernel:\n", "\n", "$$\n", "\\kappa(\\mathbf{x}_i,\\mathbf{x}_j) = \\sigma_f^2 \\exp\\left(-\\frac{1}{2l^2}\n", " (\\mathbf{x}_i - \\mathbf{x}_j)^T\n", " (\\mathbf{x}_i - \\mathbf{x}_j)\\right)\\tag{10}\n", "$$\n", "\n", "The length parameter $l$ controls the smoothness of the function and $\\sigma_f$ the vertical variation. For simplicity, we use the same length parameter $l$ for all input dimensions (isotropic kernel). " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "def kernel(X1, X2, l=1.0, sigma_f=1.0):\n", " \"\"\"\n", " Isotropic squared exponential kernel.\n", " \n", " Args:\n", " X1: Array of m points (m x d).\n", " X2: Array of n points (n x d).\n", "\n", " Returns:\n", " (m x n) matrix.\n", " \"\"\"\n", " sqdist = np.sum(X1**2, 1).reshape(-1, 1) + np.sum(X2**2, 1) - 2 * np.dot(X1, X2.T)\n", " return sigma_f**2 * np.exp(-0.5 / l**2 * sqdist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many other kernels that can be used for Gaussian processes. See \$3\$ for a detailed reference or the scikit-learn documentation for [some examples](http://scikit-learn.org/stable/modules/gaussian_process.html#gp-kernels)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prior\n", "\n", "Let's first define a prior over functions with mean zero and a covariance matrix computed with kernel parameters $l=1$ and $\\sigma_f=1$. To draw random functions from that GP we draw random samples from the corresponding multivariate normal. The following example draws three random samples and plots it together with the zero mean and the *uncertainty region* (the 95% highest density interval computed from the diagonal of the covariance matrix)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD4CAYAAADxeG0DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABEaElEQVR4nO3dd3RUxdvA8e9sye6mJyTUIL1XIVKkioCCCEpTmiICgiDYRREVEbF3BRs/UbCgWMECKkWqIj30XgTS226y2d077x/BvCJSkuzu3U3mcw7nmN29M88N+GQyd+YZIaVEURRFCV4GvQNQFEVRSkclckVRlCCnErmiKEqQU4lcURQlyKlEriiKEuRMenQaFxcna9asqUfXiqIoQevPP/9MlVLG//t1XRJ5zZo12bhxox5dK4qiBC0hxJH/el1NrSiKogQ5lcgVRVGCnErkiqIoQU6XOXJFUcoml8vF8ePHyc/P1zuUoGa1WklISMBsNl/S51UiVxTFa44fP05ERAQ1a9ZECKF3OEFJSklaWhrHjx+nVq1al3SNmlpRFMVr8vPzqVChgkripSCEoEKFCsX6rUYlckVRvEol8dIr7vdQJfJy4u9yxcmOZHIKcnSORlEUb1KJvAz7ev/XTP51MgO+HUD7T9rjcDlISk2i/7f9+ePUH3qHpyg+IYRg+PDhRV+73W7i4+Pp06ePjlH5lnrYWQZ9d+A7ulbvSpWwKlxX+zoSIhKoFl6NUHMoV112FWajmYdWPUT/ev2ZePlEvcNVFK8KCwtjx44d5OXlYbPZWLZsGdWqVdM7LJ9SI/Iy5r3t7/H2trdxuBy0rdKWnjV70rhCY6IsUUWf6VitIwuvX0id6DoAZDmz9ApXUXyid+/eLFmyBIBPPvmEIUOGFL1nt9sZNWoUbdq04fLLL+ebb74B4PDhw3Tq1IlWrVrRqlUr1q5dC8CKFSvo2rUrAwcOpGHDhgwbNoxAO1lNjcjLkHe2vcN3B75j7jVzqRha8YKfjbPF0atWL1IcKQz8biD3tL6HfnX6qQdVitdM/y6JnX9le7XNxlUjefz6Jhf93M0338yTTz5Jnz592LZtG6NGjeK3334DYObMmXTr1o25c+eSmZlJmzZt6N69OxUrVmTZsmVYrVb27dvHkCFDimpCbd68maSkJKpWrUqHDh1Ys2YNHTt29Oq9lYYakZchCeEJl5TE/yk+NJ53e77LvKR5zPp9lg+jUxT/ad68OYcPH+aTTz6hd+/eZ723dOlSnnnmGVq2bEnXrl3Jz8/n6NGjuFwuxowZQ7NmzRg0aBA7d+4suqZNmzYkJCRgMBho2bIlhw8f9vMdXZgakQc5KSVzts6hfmx9etfuffEL/kP9mPos6L2AZ/94FqfHicVo8XKUSnl0KSNnX+rbty/3338/K1asIC0treh1KSWLFi2iQYMGZ33+iSeeoFKlSmzduhVN07BarUXvWSz///+E0WjE7Xb7/gaKQY3Ig9wbW95g6ZGltIxvWap2Qs2hTL9yOjkFORzNPuqd4BRFR6NGjeLxxx+nWbNmZ71+zTXX8PrrrxfNc2/evBmArKwsqlSpgsFg4KOPPsLj8fg95pJSiTyIrTmxhiUHl/D+Ne9TwVbBK22u/Wstk5dPJs+d55X2FEUvCQkJTJo06ZzXp02bhsvlonnz5jRp0oRp06YBcOeddzJv3jxatGjB7t27CQsL83fIJSb0ePqamJgo1cESpZeZn8kpxykaxjb0WptSSqaunorRYGRGhxlea1cpH3bt2kWjRo30DqNM+K/vpRDiTyll4r8/q0bkQeq7A9+R48rxahKHws0Uj7Z7lL0ZezmWfcyrbSuK4hsqkQehI9lHeO6P5zAbLq3EZXGFmkP55LpPqB5ZnewC7y4fUxTF+1QiDzJSSp7e8DSjm42mclhln/VjEAY2ntrILd/fgsPl8Fk/iqKUXqkTuRCiuhBiuRBipxAiSQgx2RuBKf/ttOM0mtQY2mioz/tqXak1TeKaqPXlihLgvDEidwP3SSkbA+2ACUKIxl5oV/mXAk8BlUIr8W7Pd302rfJPQgimtp3KH6f+UEW2FCWAlTqRSylPSik3nfnvHGAXULYr1OjklU2v8P6O9/3aZ6g5lPeveZ9WFVv5tV9FUS6dV+fIhRA1gcuBDf/x3lghxEYhxMaUlBRvdlsu7Enfw5KDS+hfr7/f+64WXo3d6buZs3WO3/tWlOKaOXMmTZo0oXnz5rRs2ZING85JR17VtWtXirOc+vPPP6dJkyYYDIZiXXchXkvkQohwYBFwt5TynKUOUsp3pJSJUsrE+Ph4b3VbLmhS46n1T3HX5XcRa43VJYaEiAQ+2/MZW5K36NK/olyKdevWsXjxYjZt2sS2bdv4+eefqV69ut5hnaVp06Z8+eWXdO7c2WtteqXWihDCTGESXyCl/NIbbZ7P6ezydzq3lJKBdW6hTaUOOt6/hXFN7+XR1Y8xp9sCv8zRK8HHo0lcHk23/o+dOEFshQoYTGZcHo2omMKBj8uj8dSMGSxZspi8vDzat2/PW7PnIISge7dutGzZktVrVmO32/nf/z7g2WefIWnHDgYOGsyTM2Zw+PBh+lzXm1atWrF582YaN27M/z6YR2hoKFKC26Ph8mgsW7qUJ6dPx1ngpHbt2rz3/lzCw8PPitEXG6a8sWpFAO8Du6SUL5U+JOWf3JqbX4//RNvKHTEIfVeLdqnWnXaVO5HpTNc1DkU5nx49enL8+HEaN2rIXRMnsGrlyqL37pwwgXXrN7Bl6zby8vJYsnhx0XvmkBDWb/idsWPvYED/G3nt9TfYvHUbH304r6jg1t49exg3bjzbdyQRGRnJnNmzz+o7NTWVWU8/zY9Ll/L7Hxtp3TqRV15+2S/37Y3M0AEYAXQTQmw586dkZfiUcyw7uoQfj3wTEHXChRCMaXoXYaZwTjtO6R2OEgQMK5/BPCOm6A8nt8DJLWe9Zlj5DACmlxsVvWZ6tysAxsV3n319zskL9hceHs6G3/9g9uw5xMXFM2zoED6c9wEAK1Ysp0P79lzesgUrli8/q0zt9ddfDxROezRu3JgqVapgsVioVas2x44V7nCuXr06V3boAMDQocNYs2b1WX1vWL+eXbt20qVzJxJbt+Kjjz7k6NEjpf0WXpJST61IKVcD+meZMqjAU8BHu9/j0Stm6h3KWVae+JkfjnzDK53f0/23BCWwaV2moHWZcs7rrmkZ57zmvmfXOa95+ryCp88rxerTaDTSpWtXunTtStNmTfnoww8ZfNPNTJo4kXUbfqd69eo8OX06+fn/P035d5lag8FwVslag8GA50zJ2n8Ppv79tZSSq7t3Z/6Cj4sVrzeo/wsD2LpTq6gVWZfGFZrrHcpZrqlxPQID3x36Qu9QFOUse/bsYd++fUVfb92ylRo1ahQl7bi4OHJzc/nyy0XFbvvo0aOsX7cOgE8//YQOHc4+Iahtu3asW7uW/fv3A4VHyu3du7ekt1IsKpEHsM5Vr+bRNoE1GofC7fv3tXqUBbvn4nDZ9Q6nxP6u/HnacZI1f63gz+QN7ErfQU5BNprUgvreyit7bi6333YbzZs1pdXlLdm1ayfTHnuc6OhoRt0+mstbNOe6Xr1ITDyngOBF1W/QgNmz36JZ0yZkZGRwx7hxZ70fHx/Pe+/PZcTwYbS6vCWdOnZgz57d57Tz1VdfkZCQwLp167juuuu45pprSny/fwu6MrblZdXK4kNfEmeNp12VTnqHcl6ZzgyiLTFIKQNiDv9SZDkz2Zi8no2n1/Nn8nrmdJvPsdwjLNr/CXluO3nuPEY2GkfDmCYM+akPLeNac12t/lxRqT1GYdQ7/ICXcuwgDRp6tyJnIDh8+DA39OvLlq3bSt2W2Xhp4+filLFVR70FILsrlw92vc2LHWdf/MM6irbEsPTIYo7mHmZ0k4l6h3NeLs3FqhO/0C3hGpYfX8qmlN9JrNiOEY1GE2uNI9YaR4u41udct7DXj6w4voz5u9/nlP0v+tUeRFp+KnE2tQ9CCSwqkQegrw58SmLFttSIrK13KBfVpnIH5v46m5ZxiSRWaqd3OGfRpMaK48uYu/MtLouoSdvKHbmhzmBuqDP4kq63mWz0qtmXXjX7okmN046TjF8+gqYVWnBHs7tJCL/Mx3egBIqaNWt6ZTTuK2qOPACdtP/FiIZj9A7jkkRbYpiSOJ3nN00nIz/t4hf4iZSSDadWs+jAx9zfahpPX/kq4ebwi194HgZhoHJYVT6+djEt4hO5e+VojuYc9l7AilIKakQeYFyaiwdaP6Z3GMXSMj6Re1o+QqhZ/zMOD2bt5+0dr3LNZX3omtCDdpU7eXX+3mayMbDuUNpUupKE8Ms4mLWf6hE11E5XRVdqRB5AMpzpjFw2ICgPPm5XpRMnco/zw+FvdenfIz3M3/0eD66+k/aVO9GpWjcMwuCzh7CXRdTEIAx8sX8+96waqzZIKbpSiTyAfLxnLu0qd8JmsukdSomEmcN4f+eb7E5P8mu/Tk8+Bgx4pMbsbh9xQ53BfhshP9DqcTpV7cbEFbeyJeVPv/SpKP+mEnmA+Mt+nJ+P/sjwhrfrHUqJVQqtwqQWDzFz41Ry/HDWp0d6+GLfAu74dRge6eHWRmOJt1Xyeb//JITgpvojeKzNs8TZ4tFjOa9ytllPP02L5s1odXlLElu34ncfl7Ht3q0bfxZjOfUDDzxAw4YNad68OTfeeCOZmZmljkEl8gARYgjh/lbTiLHoU6bWWzpX60b36r1Jy/dtzflT9r+4/7fxrDm5kqevfBWTQd/HPc3iWpIQfhkvbn6KFceX6RpLebZ+3Tq+X7KE3//YyKbNW/jxp6UkBFgZ2x49erBjxw62bdtG/fr1mTWr9EcpqkQeAI7nHMGtuelQtYveoXjFrY3GUjOyDm9vf4W9GefWzygNt+Ym15WLJjU6VO3KC51mUzUswat9lEb/Ojfzxtbn2ZyijsbTw8lTJ6kQV6GoXkpcXBxVq1YF4KkZM2jfri0tWzRn/Lg7in576t6tG/ffey/t2rahWdMmbPzjDwYNHEDjhg14bNo0oHBDUNMmjbllxHCaNW3CTYMH4XCceyj5sqVL6dShA22uSOTmmwaTm5t7zmd69uyJyVQ48GjXrh3Hjx8v9X2rRK4zKSWvbn2WP5LX6R2K1zWp0IKH105i/cnfvNLe9tTNjPt1GEsOfUXV8AQG1h0acLsta0fV49E2s5j5+1RS89RJWP4WbGVs586dS69evUp932r5oc7+TN5ASt5petXop3coXtex6lVUsMbz+Pr7eSLkuVIV/3pty7OsO7WK8c3upVPVbl6M0vtaxrfmlS7vEWeLxyM9AffDxp/mbJ3NO9v//4jA+b0+AWD4D0OKXhvbbBzjWoyn56LuRT/8GsY24uPenzJj/ZN8tf//C1z91H8Z8aEVz9vf32VsV//2GytWrGDY0CHMfPppbrl1JCtWLOfF51/AkecgIz2dxo2b0OdM+dr/KmMLFJWxjY6OPqeM7RtvvM69991X1Pc/y9gCFBQU0K7d+TfJzZw5E5PJxLBhwy7hO3lhKpHrbMGeuYxqPEH3OV5faRTblNnd5hNjieV4zhGqhle/5NK3ee48dqZvo3XFtnSo2pXRTSYGxFr1S5EQfhkn7Sd4fP0DPNfxTaItMXqHpItxLcYzrsX4c17fNHzrOa8tHfDzOa9Na/cY09oVb19FMJSx/eCDD1i8eDG//PKLV5bIqqkVnT3R9jk6Vb1K7zB8qoI1DoMw8G7SG9yy9EZe2DSDVSd+Oe/n1/y1gofXTmLwD9fy+b755LvzaV2xbdAk8b9VCatGu8odeXTdPUG5NyAYBUMZ2x9//JHnnnuOb7/9ltDQ0GLH8V/K5jAwCBR4Cnhz2wtMaH5f0FQOLK3H2z7L4eyDbEvdxIncwlNXZm97mRxXFuHmSI7kHOSZK1/HbDDTq0Y/pl7xdKm21QeC2xqPJ21TKrO3v8S9l0/VO5wyz56by92TJ5OZlYnJZKJOnTrMnvP2WWVsK1WqXKoytmPGjKZRo0YXLGPrdDoBmP7kk9SvX/+sz02cOBGn00mPHj2Awgeec+bMoTRUGVudLNr/MZtT/uCp9v450y9QHcs5zOaUjeS4skms2I760Y3K3A+2Ak8BDre9XEyvqDK2F6fK2JYRua5cPtk7j+c7vql3KLqrHlGT6hE19Q7Dp0KMIZgNZp7Y8CCjG08gIaKG3iEpZYyaI9fB4ewD9Kjei1qRdfUORfETIQSXx1/B0xun4dbceoejFJMqY6ucJdOZQZPY5tzR7G69Q1H8rG+tgcRYKjBv19t6h6KUMSqR+1G+O5+7V41mR9oWvUNRdCCE4P7W06gdVU/vUJQyRiVyP3o36TUaxjShWdzleoei6CTGEstVCT1ZenSJXwqLKeWDSuR+sjN9O2tPrmJi8wf0DkUJAHszdvHKllmqWqLiFSqR+0nDmCa80vk9wkMi9A5FCQBjmk7kSM4hlh5dfPEPK8US6GVsp02bRvPmzWnZsiU9e/bkr7/+KnUMKpH7wetbn+dA1l4qhVbWOxQlQFiMVh5JnKGqJHpZMJSxfeCBB9i2bRtbtmyhT58+PPnkk6VuUyVyH1t+fCmbkjdQPbym3qEoAaZ2VD2mJD6p5sq9KBjK2EZGRhb9t91uV7VWAl1qXjJvbnuRhxKnYzVZ9Q5HCUBSSh5eO5k1f628+IeViwqWMrZTp06levXqLFiwoHyOyB0uO3sydvLLsR/54fA3APxv52yG/Hgd09bdx2d7P8TpCYxt/AVaAWOaTKRhTBO9Q1EClBCC0U0m8Ma253G47HqH43Vpb77J/iZNiv7kJyWRn5R01mtpbxbucD7UtWvRa8cGDQIg+fHHz/qsOzn5gv39XcZ29uw5xMXFM2zoED6c9wEAK1Ysp0P79lzesgUrli9n586dRdf9Vxlbi8VSVMYWOKeM7Zo1q8/q+59lbBNbt+Kjjz7k6NEj/xnnzJkzOXbsGMOGDeONN94o5nf1XEG3Rf/+1ePxSDcJ4TVoENMYgH61B3HNZdezJ3Mnu9OTMBnM/HD4W74//DVNK7SgZ43r/LqLMsuZyfw97zGmySSuqXG93/pVglPL+ERaxbdh3q53GN/8Hr3D8aoKEyZQYcKEc16vm3TuAd21Vqw457WK06dTcfr0YvUZDGVs/zZs2DB69+7N9GLe478FXSJ/s+u8c76BsdY4AKqGJ3BVQk8Auib0oEpYNTan/M6UNXfxauf3ibLEEGIM8Wmh/79yj/Pw2sl0rtbNbye5K8FvbNNJ2N3nzqcqxbNnzx4MBgP16hVuurpQGdv+/QcUq+2/y9i2a9/+vGVsJ0+6i/3791O3bl3sdjsnTpw4p/rhvn37iuL75ptvaOiFImNBl8gv9cGAzWSjZXxrWsa35paGYzAaTHx9YCFf7F9A39oD6VWjHxEhkRdvqBiynJnc89sYhjcczfW1/vsfifn4eqx7vkK483FVvpy8FiMxZh5GGoxo4VWgjB4woVxYlCUaq8nKe0lvMLLRuDJ70IivBUMZ2ylTphT9wKlRo0apS9hCOSxjuzs9ia8PfsbG5A3M7/kNBmEgxBhSqjYBUvNSiLPFczz3KAnhl531njFtD8ackxTU7Erkj5Nwx9ZFs1UAg4n8JjcRtvppbDs/x+BIoaB6RzL7zQOT5Tw9KWWVlJIpayfRKr4NN9UfoXc4JaLK2F6cKmPrBQ1jmzAl9kkcLjtWk5XZ214mKX0bfWsNoEtCdyzG4q0u8UgP3x1cxMJ9HzG3++f/n8SlxLb1A2w7PsZgT8bRaiwFNbuSfe1r57Rh7/gI9o6PgNtJyNHfwGTBdGoL7orNwFB+z3ssb4QQTG75EBNXjKRTtauoGpagd0hKkAi6VSsiL80r7fx9bNjYZpMY1uA2VpxYxthfhqJJjZS802Q5M897rd2Vi0dzszX1TwZ/fy0/H/ueFzrNLlpiKBwpIARCKyC38zRSx2zCccW5D3zOYbJQULs7SEn4mlnEfNYXY9q5R0UpZVfVsASGN7id/Zl79A5F+YdAL2MbXFMrmobrrSvxRNXA3v4B3BWbejWuXFcu4eZw5ia9xdcHF2I2mLksohZPX/kKGc501p1cxYZTa9idkcQrnd+lYmgV7K7coh2bosBO2NpnsO7/gdSRq6E0a8elhm3bh4SvfY7sHi/irNvLS3epBItMZ0bQnSqUcuwg9Rs0KHOnPHnTpUytSCnZvXv3JU+tBFciB06nZWDb/hFhf7yO44qJOFrd4eXoCkkpSXemcSznCC3iWrEldSPLjy+lTaUraV2xLTbT2Yemmk5vI/q7URQktCenyxNIWwWvxGHIPo402xAeN9JkRVqjvNKuEthO5B7jnlVjeK/7Z0SGBM/fecbpE0RHRhJbIVYl8/O4WCKXUpKWlkZOTg61atU66z2fJnIhxFygD5AspbzoMNkrDztdDgwFuYXTEL/NwN72bjyx/j9xx2BPBo8TaQ7FnLyDghpdfNJP2IaXCTn4M5kDFiJDgus0eaVkXt/6HC7NFVSHNnvcbrLTTuMucOodSsAyGi7+A85qtZKQkIDZfPYSZl8/7PwAeAP40EvtXZw5FM0ciiiw465Qn9jP+pJftxe5HaYgQ+N937/UsG1fQPiaWeR0epT8pkN9lsQB7G0mY8g6RvTXw8m4cQGYQy9+kRLUbmt8J6N/vold6TtoFOvdaURfMZpMxFSqpncYAa1SpPfLdXjlYaeUchWQ7o22it13SBiONpNIvW0t0hKN8Lgw2JMRzhyf9hv17SisOz4mY+Dn5Dcd6tO+ABAGcro/jyeqBubTgfvQRfGecHM4z3Z4g3rRZW85n+JdQbdq5XykNZrcztPQIqpi2f8DFf7XHtvm98FT4L1OXHnYtn0EUpLbaSoZNy/GHe/HOioGI9nXvIIroR2Wfd+Dx+W/vhVd1Iisxf6sPSw+9KXeoSgBzG+JXAgxVgixUQixMSUlxad95bW4lcwBn2E5uIzYT68HKaEUJ5eL/Cxs2z6iwkdXEXJ0FbgdeGLr6bfGW2rYkj4m6oc7S3VfSnCIscQyd+dbnMg9pncoSoDyWyKXUr4jpUyUUibGx/t+Dtsd34TMAZ+S2eddEIKoJeOIXjQY684v4FKqzHlchBz4qXCTzrHVhBxZQc7Vz5LV510w6/ywURjI7PMewplF5NJ7QGr6xqP4VKXQKgypP5JXtzyjjoZT/lOZ39mpRRXutMy69nUsB5di27mQ0M3vkD5sKZYDP2LMOIg0mMBgJq/ZMIw5fxG66W2se77BHVMbd1wjnPWuw1nvOp3v5F9MVjL7fkD4uhfBna8efpZx/evczL7M3WQVZAbd2nLF97ySyIUQnwBdgTghxHHgcSnl+95o22vMNpwN+uFs0K9o3lwU5GKwn0Z4XEVTFAb7aTRbBdJvXoInptaFWtSfOZTcztMwZB/HfHApzgY36B2R4iNGg4lHrniKfHd+0cY1RfmbVxK5lHKIN9rxmzNFsvIbDYRGA896y1WtLa5qbfWIqsSE5iZixTSkObxwi79SZn2xfwEHsvbyWJtn1IYbpUiZWbVSnnmia5J1/f+I+mkSprK0NPHv+WA1L1xkcL3hHM89ytKjiy/+YaXcKPNz5OWFq2oi2d1fwOClomJ+IyWm1J1oIeFooXFE/XQ3hpwTGHP+oqBGF7KveZWYhTdgzDmBJ6Ia7th65PR4AVNKEtJkwxNTW+878KsQo4WHE2fw0JoJdKh6lZpiUQCVyMsUZ73eheVzt31Ifv1+AV2XReRlELrtA6y7v0K4HGRd8ypaZHWcda7FE1ENT2Q1tLDCYmQZ/T/FmHsKQ+5fGJyFJ86bUncRvupJNGsMznp9sF9xp/6rifykdlRd3u62QCVxpYhK5GWQKXU3UXu+IfPGjwPqgAqRl4Z11yJc1driiUzAYE8mu8eLuKokwpn53vxG/3GyktmGJ6bWWQ+f8xsNJL9hf8wn/yTk4DIwWrHs/Rbzqa04WtyCFlXDX7eli1hrHMuOfs9px0mGN7xd73AUnak58rJGCHK6zkBaY4j+diS4HHpHBC4HYWufJ+5/HQrLCxjMSFsFcrrNwlX1iqIkXmzCgKvqFYWHchiMuOMKS35WWHAt4SsfL/M7Xy+PT+TrgwvZmb5d71AUnalEXhYZjGRdN6ewiJcPD5q+KLcTQ9ZRQGDIzyBt2E9k93oDd3xjn3Tnia1HbudppN26suj8U9Ppbd4t0xBA4mwVmdTiIZ7Z+BiOS9nkFqCklCQ7TrHmrxUsP74UgF3pO9iZto3TjlO41e7li1JTK2WVwYSj9ThEXhqR348ju8eLSFusf/rWPFh3LyJ87XPk17ue3C6Pk9Ptaf/0DWhhFXG0LjwYN3TT25j/2khup0dx1utT8tF/gOpcrRv5bgdCBM+YrMDj5PfTa4mzVaR+dCOG/dQXt+aiXnQjrkroCcC6U7/xZ/J6UvNSyHM7+KbPcnamb6NAK6BFXGsMQXS//hB8B0uU8vDlcudMvfaQQ7+QOWAhWngln3cZ9d3tGOynye34KK6Edj7v72JCjq4ifOV0nLW7Y+/wsN7h+MSh7P2ctp+kXZVOeodyXgUeJwv3zefbg59TI7I2A+oOpV3ljmQ5M4kMiTrvuniP9GAURtb8tZJ5u97G4bZzbY3rGVzvFq8cnO5vpSljqw5fLq+EILfTNMIsEUR/eTPpw3/2SbEvY/p+Qje/S07Xp8jpNgstND5gRr8Fl3UmfeiPCJejsMSxy4EnuqbeYXmVJjVe2DSDBxOfoE2lK/UO5ywnco+R6UynYWxT8twOnuv4JjUj6xS9H2WJvuD1xjPTgx2qduHKKp3Zm7mLNSdXYjaYWXtyJRajldYVg2sTn7ep30/KAyGwt72HzBs+AmHAkHXEe03npROxfCqxn/XFE1UDkGhhFQMmiRcxmpHWKMwnfifm0z6Yj63VOyKvqhNVn+ntnue5jU+wPXWz3uEAcDBrP09seJBJK0dxIGsfRmFkTNO7zkrixSWEoEFMY0Y1Ho8QAoMw8uqWZ3h8/QOctJ/wYvTBRSXyckSLTMCYvo/YT/sQtWQsxvT9JW5L5GchCuyYUpJAc5N66yociXcWlT8IVM76fcju9SbRi0dj3fGJ3uF4VZMKLXj4ihm6z5drZ6pxztv1Ns0qtGT+Nd/St/bAi1xVMu0qd+S9qz+lfkwj3k16A6BcVohUc+TlkCiwY9vyHmF/vk3GDfNxV2l1aRdqHkKO/oY16VMsh38hq/ccCmpd7dtgfcSYvh9T+j6cdXsVlgEuYw/P5u16h67VulMj0n87Xz3Sw/eHv+a7g4t486p5mA3mi1/kRVJK8twO7l89nmENbufKKp0Dsh6NL+bIy9a/XuWSFB6PN5nU29bhrtwS684viPjlYUynt2FM31e4/tqdXzifnJeBMW0vBnsyxowDhK95Gle1NqSO2hC0SRzAE1sXZ91eWPZ/T9S3o8rcAR1VwqoxZe1dfptu2Je5mzuXj2D5sZ94KPEJvydxKJx2CTWHMbrJRN7f+SZT191Dap5vD7EpDs+Rw2iZmT5pW43IFYQjlbA/Xifk8AqE5iZj0CKM6fuI+n4cwuNCmkPJ7vESBbW66R2q93lcRH89Ak9kNXK6vxB4c/ul8M3BhXyx/2Ne6zKXGItvlp4ezzlCpCWatPwUjmQfoku17gExCnZrbj7d+wFdq/Wgclg1TAZ913VIKcm+/Vasg2/mssH9S9zO+UbkKpEr5Z4oyCVm4Y04Wowkv9kwvcPxqnUnV9Gm0pWk5CVTKbSK15JsWn4qH+16l9/++pWpV8ykVcU2XmnXF+Zsf5lMZyYTWzygW32agl+WkffBXCLnLaBydMkPgVFTK4pyHjIknIz+H5Pf8MYyN8XSvkpnjAYTr2yZxX2rx3Eou+QPuP9md+Uy7tdh2Ew25nb/PKCTOMCtjcZhM9kY+8sQtqSUbABZGlJK8t6ZQ+jEyQiDb1KuGpEryt+kJGZhP+xt7i5z00ge6WHxoS/5aNe7jGw8jj61Lv3XeyklR3IOsubkSuyuXMY2nYTdlUtYkFVf/P3UGk46/qJf7UFFm4z8RTt9GkOlws146mGnoviSEOR2fJSoHyeWrQM6KNxU06/2IN7r/hmJFduRXZDFNwcXsiXlT07kHqPA4zzr8wUeJyl5pwGYuHIkj6y9m9S8ZLpX7w0QdEkcoE3lDvSrPYh9mbu549dh7Mvc4/M+pd2O/aUXED4+cF7t7FSUf3BVa0N29xeI/m4UqSPXBFQZYG+ItsSAJYbjuUfZmb6dFcd/JiXvNEPqj6RXzX7ctfI2rEYb+zJ3c32tAYxpehfT275ABWtcQDzE9Ia6UQ24ud4tPLzmLvrXHcJN9UZg9NHD0LwFHyKzMn02pfI3NbWiKP/BkHu6sC6N5vFJSYNApEmNA1l7yXRm0CCmMZEhgXswiTckO07x6d55jGt2D0aD0etTLVpqKlk3DyTyw48xVq1a9LqaWlEUP9HCK2HZ+y2RP0woN2eGGoSBetENuaJS+zKfxAEqhlZmUsuHMBlMTF45mm8PflG0K9Ub3Dt3YBkw6Kwk7isqkSvKeThr9cCUthvb9vl6h6IL08lNWPZ/j23bh1iTPgXAmLYXkZ+pb2BeZhAGHmj1GD8d/Y57Vo3xysoe6XYR0rkroeMneCHCi1OJXFHOx2wjq8+7hK+ZhTHN9w/G9CYcqYSvmEbYmmcACPvjDaxJn2I6tQWDMwsA656viXsvkeivhmFN+qzM/LZSI7IWr3WZS4/LriPP5SDfnU9uQU6J28t99GEKlv/qxQgvTD3sVJQL8MTWI+OG+Xiiauodik+FbniFsD/nkN/wRhwtRwGQ1XfuOZ+zX/kgjsQ7sRxciunUFhAC6+4v0ULjKLiss5+j9i6jMBYty1zz10pe3TKLUU3upOdlfYp1kIVry2Y8SUmYn3jKV6GeQ43IFeUi3FVaYcw5TvhvM8rMCBQAt5OQwysA0CKqkj70x8Ja8mEVL3iZDAknv2F/crs+Wfi1OZTIn+4hYtn9COeljWI9p08h3S6k243Mzw+4ioUdqnZhRvuXWHzoS+5ZNRaXdmnnv0q3G8dzs7BNugdhLflDzeJSiVxRLoEnvDKWg8uK5oqDnenkJuI+6IBt6wegechvPLjEh20461xL2i3LQWqFP+wuQOblYZ/5JNnDbkJmZOD+cyMZPbqS0a416Z3ak//1l4Wf83hKFIs3NYhpzGtd5jK6yQTMBjPfHFzI+lOrL/xDR0qsw28hpHsP/wWKWn6oKJfMmLqb2M/7kz7oSzxxDfUOp8RMpzYT89Uwsnu8WFjG15s0N4bck4RtfIvcDo8gLRH//1ZqKtl3jsXUuAlhD0xBhIUVvSc1DZxOMBhwJ23H8fKLhD0yDVMj3xzUXRKrTvzKgj3voUnJsAaj6JpwdrLWUlPwHDqE+YoLlyxQyw8VRUeeuIZkX/0M4l+7IIOJcGbjjmtMxsDPvZ/EAQwmpCUK3E4qfNgV89HfkJqG5/gxRGwsYfc+QPgTM85K4gDCYEDYbAiLBdPlrbEOGUbOPZNwvPIi0hkY3+/O1box56oFjGl6F5nODABWnfiFZMcpAByvvYLr9/W6xKZG5IpSXG4nlgM/4mzQT+9ILp2UhK17npAT68kY9KVfugw59Cu2H6ZxfFczMFuIeOnVYl2vZWaQv/AzbLePQebkYIiO9k2gJSSl5NWtz7Ly+M90ToljyOenqbToe4TNdsHr1IhcUQKA0FyEr3kGy+6v9A7l0mhuIpfdi+VQ4alO/uJwVePw4lCMjZsSd9uVhScxFYMhOobQseMQRiO5U+7H8dorAfVQVAjB3S2nsLD3D/TfYuXUqH4Im43Xtz7HkkNfcdpx0m+xqESuKMUkQ8LJuu5tIpdPxZh5WO9wLsqUtgeRn0nGoC8vuiLFm0RICGEPP0rY7SMJ3bmAqCV3gCuvRG2FP/sirk0bcTz7dOF8egAxCROXvfguLQZMRkpJ87hWbEndyIQVI3n6j0eBwhOUspyZPotBJXJFKQF3pebktr2HkINL9Q7l/Nz5WLcvwB3XmKy+/0OGhF38Gi8p+PVnRFwcIZ26FNZ7H7AQhIGYLwYiCnKL3Z4hKorIN+agpSSjnTjug4hLRktOJmf0SKBwhC6EoEu17ky9YiYLe/3AhOb3A7Dk8NeMWHoD83e/75M41By5opSSIeckWkQVvcM4m8dF1OLbwWgpnE7xY+Ev9/Zt5DxwL1ELPsNQocL/vyE1LPsW46x3feEBHsaSnesppcT51SIsffoiQkK8FHXJ5D46BUO16pe0Fd+tuclzO6gbV/LfitQcuaL4guYmZuENhBz8We9I/p/mIfKnSQjNQ1avN/2axGV+HrnTHyPsgYfOTuIAwoCzfl+Ey06FeZ0xnfyzZJ143Lg2rCP3/nuQ+SWbqvGGgnVrcW/fju22UZf0eZPBRERIpE9iUYlcUUrDYCL7mleJXHo3hhz/Pdy6IOnBE1uPzD7vgdG/I1bX5s2YmjQl5Orzb4iRIeHkdH2SmK9HFO0sLQ5hMhM+81lETAw5kyYg8/RJ5oaICMIen46wXniVij+oqRVF8YKw9S9hzDhAdq839QtCSkJ/fxVn/b54Ymr7v3uHAxEaipTykg6hMJ/YQMTPD5I+7CcwFX9JntQ0Cr5fTEiv68Bg8NvBF9JuJ//zT7HecluJDoxQyw8VJUDZ20wm56qnwVOgWwxhG17GuudrNGuM3/uWDgdZw2/GfeDAJSdUV7W2pI/4BQwmQg4Vv1KgMBiw9OmLzMoi547b0ZKTi91GcUlNI/eJaWgnTkAAnZjklUQuhLhWCLFHCLFfCDHFG20qSlAxGJHWKCKX3Ufoprf93r1t07tYd35O5oCFSJv/E7njtZcxtbwcU506xbvQYMLgSCPi1ymEbXi5REXJDLGxmDt2JnvMbXiOHS329cWR997byMwMQh98OKCOvit1IhdCGIE3gV5AY2CIECJwCiQoih/lXvkgoRvn+G+zkJQgJe7KLckY9IVf14n/zfXH77jWrCb03vtLdL0WXomMm77DsudbwldMK1Eyt90yEuvIUeQ+eJ/PCm7JM9/r8GdeQJhLtuLGV0o9Ry6EaA88IaW85szXDwNIKWed7xo1R66UZaaUnUQvGkz6sJ/QIqr5riMpCV/9FFpoPI7W43zXz8XCyM9DO52MsUaNUrUj8rOw7vyMvMvHnHmh+CNeLScHERaGduxYqeP5J/e+vVBQgKlJ01K35Ys5cm8cLFENOPaPr48Dbb3Q7jmmf5fE1mOZvmhaUbwqMvQ1sr85RYg8TIHwfl1qITVuz32b+q5dPBn9FLm7SriUr5Qu+2sfAEer1oPfUr3QYmsqb1vMuJzXeTnqIbIM0cVuoWLaCUYvep6F14xmf43SJ95QRw7jF85k6ZX92V6/9AW8WlSP5vHrm5S6nX/y28NOIcRYIcRGIcTGlJQUf3WrKLrINkQR50nm9bQ7qOg55fX2r85fSi33AZ6InkWuwTdrky9KSnr99jmR9iyvNnvKWIXd5sbMSr+Xau7iz3knV6jGguvuZMDPH3Djzx9g0Eo+1VLt9GHGfvEMWxu0ZXv9C5en1ZOaWlEUH7Jtfp/QLe+TftO3yNC40jfocWHIPYkWXgW0AjD7b9v9v7k2rMf+0nNEffJFiZbhXYw16TNCN79L+rClUIyj1v6m5ebg+vUXLH1vwL1vL8Y6dS85Ti0tDUwmZGYGnsOHCOlyVbH7P59AXX74B1BPCFFLCBEC3Ax864V2/5P7wAFkvm+SuczLw3OqcFOHe2cSzmVLcX6/mPyvv0S6XWiZGUXvK8qlyLv8dvLr9yVy+dRSt2XMOET0V0MJ3/By4fZ2HZM4gHPJd9huG+2TJA6Q3+Qm0m9eDJqHkEO/FPt6Q3gElr43IKXE8drLZI8eiXv3rgteIz0e8r9YSNaQgbj//ANjjZpeTeK+Uuo5cimlWwgxEfgJMAJzpZRJpY7sPPLeeg3Xxj8w1W+IuWtXbMNuQWraJf9jki4XWvJptJMnETExmOrUJWfKA3h2JaGlpxPSpSvhTz2De8tmXNu2FtZyMJuxXNsL9/bt2J96AhEejvmKtlhvuQ1j1aq+ulWljLB3mAIuByI/i/DfZmBv/wBaeKVitWHbMpfwtc9jTxyPo/V4H0VaPGGPTff9WmqTFUPOCSJ+nYKzTi9yOz1a7N2qQggiXn2Tgu++IefuiYROnExI7z44v/wCERqKsIViqFoVY7365IwbAwIiZr+LqU5dH92U9wXlzk7pcODesQ0tKwtLj2vImfIA2tEjiIgIRGgo4S+9hvvPjRT8sgzMZmR6WuEuLJuNrJsGYIiPx1CpMpYb+mPp3QfXpj8xVKyIoUpVhPHCdSmkpuHZvw/XHxuw9LgWz6mT5L32MqH33O+VJ9pKGebKI2zDy4Run09u+/vJa37rheugaB6su74gv35fjFmHkdbYYv8A8BX7rKew3jISY7UEv/Qn8jKIXDoZY+5p0gd/BebQErWjZWaCpiEiInC8+BwyLw9pt2Nq3ATbqNG49+7BWK++T9eI+2JqJSgT+b9JpxPPwQNIhwNZ4CSkfQfcBw7g3rQRWVCAoUIFzG3aIaKjC/8STd5YrHOmb5eLgl+W4XjlJSy9+2C7YzzCYvFa+0rZY0zdTcTyqeRc/SwyJBxD7qkzI1uBO7ZwFBhybC3ha54urH3ee7ZvlzEWk2vbFuzTphK16GuEyY/rqaXEfGw1rss6Ycw8XOLDovWmEjmB+7BTS08nf/48bOMmgOYJiEI6SuCzbfsQ27aPgMLNJlm93wIg6qfJ2BPvLCz5GkA7CAFy7p6IuXNXrP0H6hOA5ib2o6txVWlNzlVPlXh0rheVyAncRP5P2eNGY6xbj9AJky56fp+iBBOZl0futEcIf/pZXWuBi4JcIn5+EHPKDjL7fRhUo/NAXbWi/Ev4sy8ic3PJGjIIz+FDeoejKN5jNhPxwsu6H+ggQ8LJ7vUm9ivuQrNEYsg9De7AH+T5ikrkPmCIiiL8iRnYxtyBlp2tdziK4hXuvXvIvv3WwDkAWQjyGw9C2mKx7VhAhQ+vwnx0td5R6UIlch+yXHc9pmbNyfvf+2ipajerEtzyP5hLSM9rAqrq39/s7e4lt8vjRP00ifCVj+sdjt+pRO5jQgiQkpy77kTL8u5WZkXxF8/Jv3D9vgHrjTo94LwEzjrXknbrKvLr9wMpC2ucB8pvDz6mErkfWG+7HXP7DuRMnoB0OPQOR1GKr8BF6D33IUIDe4WIDAnHXaUVIi+N8N9mEP3lEAxZR/QOy+dUIvcDIQS2uyZjHTgYdH5IpCjFJfPzELGxWK67Xu9QLpkMjSN92FIKqnegwoJrMabt0Tskn1KJ3E+EEFj69EU7fYrcGU8g3S69Q1KUS+L85mscz523Bl7gMppxtLmLtOHL8MTWJ+TgUkynt+kdlU+oRO5nhkqVkOlpOF55Se9QFOWipKaR/9knWAYO1juUEtMiE0AIhMtB9FdDCF85XdezVX1BJXI/EyYzYdNn4lq1goLfVukdjqJckGv1KkRkJKbmLfQOpdScDW4g7ZaVmDL2E7Fqut7heJX3io4ol8wQGUn4zGfBizVfFMUXjLVqE3b/QwG55LAkZGgcmf3mIZw5CEcqRvtp3PHePa1HD2pErhNTs+YY69Ql/7OPfXZYrKKUhufUSTCbMTVtpnco3iUMSGsU5pQkYr4YhGWvz45P8BuVyPVkNFLw6y/kz5+ndySKco68d9+m4Mfv9Q7DZwpqdCGj/6dErJxO2PrgfmalErmOhNFI2JMzyf9kAe4d2/UOR1GKaGlpuFYux3LDAL1D8Sl3peakD/0BV8UzZwkE6QYilch1ZqxUmbCHHsG1eZPeoShKEeeXXxBydQ8M0dF6h+JzWlhFCmr3xHLgRyK/Hx+UyVw9bQsAIVddDYDnyGEMl9UoMw+WlOBluXEASE3vMPzKWaMrYRteIWzDy9jb3at3OMWiRuQBQmoauQ8/SMH3i/UORSnnXJs3IXNzMMRX1DsU/zJZyew7D9v2+YV1WoKISuQBQhgMhD0xA8drL6OlJOsdjlJOSSlxvPAsnpMn9Q5FF1p4JTIGLKQgoa3eoRSLSuQBxFS/AZb+A8l77x29Q1HKKdf6taBpmNu20zsU3Xhi6wKC6EU3YbAHx6BKJfIAY7ttNKGTg2t+zhe05GTcO5OAwgMNPEcOq/X2fuD8fCHWW0chDOU8NZhDcVW9gqhvRwbFyUPl/G8r8IiQEDCbyZk8AS0jXe9w/EJKiZabA4B91lNk9utN1tDBOJd8B0DBrz+TM2kCGd06kT16JFLT8Bw9gpaZqWPUZVP4U7MI6d5D7zACgr3dvWgR1Yj85SG9Q7kodfhygHK8+hJaSgrhTwVh1bli8Jw+hf2p6Rhr1iLsvgcpWP0bxmrVMNSoec6oUMvNQTt6FFPjJjiXfIfjpecJ6XEN1iHDMNaoqc8NlCGOt9/CesMADJUq6R1K4HA5MCfvwFWtjdeaVIcvlyO2O8bj3pVEwW8r9Q7FZ5xLfyT7lqGYL29dNJ0U0rETxlq1//NXe0N4BKbGhXUxLNddT9TCrxCxseQ+eB/S5ULLzg6c8ySDjHvvHpzffo2IidE7lMByZoolbMPLiPzAPeFLJfIAJaw2wqZNR4RY9A7F6/5OuMJqJeL12dhGjUaUoICYoUIFQseOJ/LTLxBmM45XXyJ7+M04ly1FauVrDXRp5c+bi3Xo8MKpPeVsQmDIPk7YhsDdxq8SeQAzt7wcU+tECtat0TsUryn49WeyBvfHs2c3IZ27YqrfoNRt/r2BKmzqY9jGTyR/wYfkPqgeGF8qmZ+H5/hxrGV8O35p2K98CFvSQowZB/UO5T+pRB7onE4cs57C9ft6vSMpFSkl9heexfHm64Q/9yKmho283ocwGAjp2InI/31E2EOPFG6yevRhClatUFMuFyCsNiI/mI8IC9M7lIClhVXE3uYuQo4G5hkCKpEHOBEWRujDj2Kf+SQyN1fvcErO40FERhI1bwFmHx9SIIQo3JUoBCHde5I35y2yRw7HtWWzT/sNRtrp02SPH6t3GEHBkXgneS1GgubWO5RzqEQeBELad8Dcph3On5fqHUqxSSnJe+9ttBMnCB07HhEe7re+hRCEdL2KyPmfYhsxEtxuZEEBefM/LDdLOy8mb8FHmBo0UPV9LpEpJYnYT64DLbD2NKhEHiRCH3oE6w39g+rQZiklea+/SsGqlbquhhAGAyHde2BOvALpsOM5dJCsgTeQ+/ijeA4F5pynP2iZGRR8/x3WoSP0DiVouOMaI01WbEmf6B3KWVQiDxLCZEJLTyfr5kFBsxEm//13cG1YR8Rrb2GIjNQ7HAAM0TGET3uCqEXfYqxXH+lwoGWk43jjVVx/bkS6gucHZWlpqalYR4zEULGcFccqDSHI6TKdsLXPIpw5ekdTRCXyIGKIjcV8ZUcczwf+JiEpJeZ2VxLx5pyArGltiI7GNvwWTE2aggRMJhyvv0Jmz244l/4IgOfEiTL7kFTm5WG8rAa2W2/TO5Sg467cktzOj1P4DycwqJ2dQUbm55M1Ygi2seOx9Oipdzj/Ke9/74PJhG3ErXqHUmxaZsaZ/xJkDRsMLhemRo0J6dMPS4+eyNxcv87z+4r9uVmIiEhCx0/QO5SgZUrZiWaJRItMKNZ1vtjZqQ6WCDLCaiX8mRcwRAXGVMW/5X/9Jc5vvyby3f/pHUqJGKL/fy4/ZsnSouJd4szUUNaoWyA/D9PlrQnp2o2Qq7rpFWqJubZtoWDFr0R9ukjvUIKaZf8PGDMPkd3rDb1DUYk8GJnq1EHLzCTvvbex3j42YFYcuLZtIe/t2US+/R6GuDi9w/EKQ8WKhPxjDjnqs0VoR4/i2vg7WvIpAOwvPAsGA+Yr2mK+og3CWvIRl69JTcMxayah9zwQMM8tgpWj5Sji5rbFYE9GC9P3OYOaWglS0uUi+7YRWAfdhKXfjXqHU7glXtPQTv6FsfpleofjV+49u3GtW4Nrw3pkXh5RH8xHut0lKjvgD+69ezDWqx8wA4BgFrH0XjzRNXC0mXzJ1/hiakUl8iDm3r+PnDvHEjH7XUx16uoWh+fwIXKnTiHy/Q8QVptucQQC6XAgQkPJvvMODLGxWG8eiqlpM73DAsBz5AgFq1YE5bOLQCUcKWAKRYZc+q7YgKt+KIQYJIRIEkJoQohzGld8y1S3HqH3PoB25LBuMWgpyeRMnoh1yLByn8QBRGgoAOHPvYCpcRNyH30Y+8wndY7qTImEZ2YG7G8JwUqGxmNK3YX5xAZd4yjt8sMdQH8gMAsQlAOWa3sT0q07Bb8sQ+b797cVKSW5U6dguaE/lj59/dp3oDOER2AdOpyoRd9gGzMO6XRin/kknqNHdImnYMl3SHsulsE369J/WWbIOU74mmf0jaE0F0spd0kp93grGKVkpJQULP8V+4zH/Va+Vebng5SEPTkT68hRfukzGAmjsXDDjdGAoUZNsm8fiWPOm8j8PL/G4Tmwn7CpjyGMRr/2Wx446/bGmHEAY+ou3WLw24YgIcRYIcRGIcTGlJQUf3VbLgghCJv2BNqpU+S9M9vn/Wk5OeTcNZ6CpT9hrFxFPTS7BMJkxjb8FqLmf4p27CjuvXuQHo9fNhxpqSmETr4XU4OGPu+rXDKGkNf8Fmw7v9AthIsmciHEz0KIHf/xp19xOpJSviOlTJRSJsbHx5c8YuU/CYuF8BdeRktO9mk9Fi01lZxxozE2akxIz2t81k9ZZahUifCZz2Ju3pL8Tz8m995JeE6c8Fl/zh+/J/vOO9RBGz5mT7yT3I6P6Nb/RZ98SCm7+yMQpfQMMbGEPzYdLTkZT/Jpn6yWyF/4CSHdrsY6aowaiZeSdfDN5BcUkD1yONYRt2IdcavXvqdSSvLnzcW56AvCX3r1P4/OU7zIHIr52FoMjmScDW7we/fqb7cM8hw5TM799+DausV7bR48gHvvHmzjJ2ILoE1IwUyYzdhuu53I/32IsFoRQqClJHulbZmVhXvbNiLnzsNUr75X2lQuwmgufOgp/f/bT2mXH94ohDgOtAeWCCF+8k5YSmmYr2hD2NTHyJ3yQGHdk1JyJ+0g+8478Bw5ohK4DxgTqmMdfDPS6SR79G3YZz2Flp1dora0nBwcb72OCA8j4qVXCw/YUPzCVSURGRJOyOEVfu+7tKtWvpJSJkgpLVLKSlJKNWkaIEI6dSZqwWeYWrRESonn2NESteP88Qdy7p1E2NTHArZIV1khLBYi538KBgNZg/vj+uP3Yl3vOXGC7NG3IvPyQKhftv1OCBwtRxFy+Ff/d612dpZ9nsOHyB47CuvwW7EOG3HRJWhadjbOr77AetNQPEcOI0JCMNaq7adoFSj8OxNRUWjJyTiefwbL9f0I6d7znHM1pd2O9HjA7SZr+E3Ybr0N601DdYpaKZxWEXCB31wDbmenEhyMNWsR+cECXGt+I+fOsUhNQ0tPx3Pi+FnrmbXMTByz3yRrQD88R44g8/MwNWiokrgOjDVrYYiJxVinDtZbRlKw+jcyr78W16aNeI4dJXvMbWRc252MXt0p+GEJhthYIl6fo5K43oQB87E1hP7h34qIar9uOWGsWpWI2e9SsPhbhMFAwdrV5L07By0tDWEOIeKN2SAEMiOdyA8+wliteDWWFd8QJjMhnbsS0rkrWno6wmYDKbGNm4Cx+mWI+Pii5xamOnV0jlYB0CITCFs8BkerO8Bo9kufamqlnJNSFh6WYLUizP75R6coZV3MJ9dhb3sPBbXPXb2tplYUrxNCYIiIUElcUbwov/EgTGm7/dafmlpRFEXxsrwWI/3anxqRK4qi+IBty1xCDi71S18qkSuKoviANNmwbf/YL32pRK4oiuIDzrq9CTm2GpGf5fO+VCJXFEXxAWmNwlm3F6aUJJ/3pR52Koqi+Ej2ta/7pR81IlcURfGhyJ/uxmD3TlXL81GJXFEUxZc0N5a93/q0C5XIFUVRfCi/4Y1Yd3/p0z5UIlcURfGhgss6I9xOhDPHZ32oh52Koii+ZDSTPuIXn3ahRuSKoig+JhwpRP402Wftq0SuKIriY9JWgZAjqzCm7vJJ+yqRK4qi+JownHno+ZVPmleJXFEUxQ/yG97os9K2KpEriqL4gbtiM7L6feiTtlUiVxRFCXIqkSuKogQ5lcgVRVGCnErkiqIoQU4lckVRlCCnErmiKEqQU4lcURQlyKlEriiKEuRUIlcURQlyKpEriqIEOZXIFUVRgpxK5IqiKEFOJXJFUZQgpxK5oihKkFOJXFEUJcipRK4oihLkSpXIhRDPCyF2CyG2CSG+EkJEeykuRVEU5RKZSnn9MuBhKaVbCPEs8DDwUOnDOr9KkVZfNq8oihJ0SjUil1IulVK6z3y5HkgofUiKoihKcXhzjnwU8MP53hRCjBVCbBRCbExJSfFit4qiKOXbRadWhBA/A5X/462pUspvznxmKuAGFpyvHSnlO8A7AImJibJE0SqKoijnuGgil1J2v9D7QoiRQB/gaimlStCKoih+VqqHnUKIa4EHgS5SSod3QlIURVGKo7Rz5G8AEcAyIcQWIcQcL8SkKIqiFEOpRuRSyrreCkRRFEUpGbWzU1EUJcipRK4oihLkhB4LTYQQKcARv3dcenFAqt5B6EDdd/lTXu890O+7hpQy/t8v6pLIg5UQYqOUMlHvOPxN3Xf5U17vPVjvW02tKIqiBDmVyBVFUYKcSuTF847eAehE3Xf5U17vPSjvW82RK4qiBDk1IlcURQlyKpEriqIEOZXIS0gIcZ8QQgoh4vSOxR/K27F+QohrhRB7hBD7hRBT9I7HH4QQ1YUQy4UQO4UQSUKIyXrH5E9CCKMQYrMQYrHesRSXSuQlIISoDvQEjuodix8tA5pKKZsDeyk81q9MEkIYgTeBXkBjYIgQorG+UfmFG7hPStkYaAdMKCf3/bfJwC69gygJlchL5mUKy/eWmyfF5exYvzbAfinlQSllAfAp0E/nmHxOSnlSSrnpzH/nUJjUqukblX8IIRKA64D39I6lJFQiLyYhRD/ghJRyq96x6OiCx/qVAdWAY//4+jjlJKH9TQhRE7gc2KBzKP7yCoWDM03nOEqkVGVsy6oLHW8HPELhtEqZ461j/ZTgJoQIBxYBd0sps/WOx9eEEH2AZCnln0KIrjqHUyIqkf+H8x1vJ4RoBtQCtgohoHB6YZMQoo2U8pQfQ/QJdaxfkRNA9X98nXDmtTJPCGGmMIkvkFJ+qXc8ftIB6CuE6A1YgUghxHwp5XCd47pkakNQKQghDgOJUspArpbmFWeO9XuJwmP9UvSOx5eEECYKH+heTWEC/wMYKqVM0jUwHxOFo5N5QLqU8m6dw9HFmRH5/VLKPjqHUixqjly5VOXmWL8zD3UnAj9R+MBvYVlP4md0AEYA3c78HW85M0pVApwakSuKogQ5NSJXFEUJciqRK4qiBDmVyBVFUYKcSuSKoihBTiVyRVGUIKcSuaIoSpBTiVxRFCXI/R+Ij6xWGWsKmwAAAABJRU5ErkJggg==\n", "text/plain": [ "