|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- {
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Automatically created module for IPython interactive environment\n",
- "# Tuning hyper-parameters for precision\n",
- "\n",
- "Best parameters set found on development set:\n",
- "\n",
- "{'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "\n",
- "Grid scores on development set:\n",
- "\n",
- "0.986 (+/-0.016) for {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.959 (+/-0.029) for {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.988 (+/-0.017) for {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.982 (+/-0.026) for {'C': 10, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.988 (+/-0.017) for {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.982 (+/-0.025) for {'C': 100, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.988 (+/-0.017) for {'C': 1000, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.982 (+/-0.025) for {'C': 1000, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.975 (+/-0.014) for {'C': 1, 'kernel': 'linear'}\n",
- "0.975 (+/-0.014) for {'C': 10, 'kernel': 'linear'}\n",
- "0.975 (+/-0.014) for {'C': 100, 'kernel': 'linear'}\n",
- "0.975 (+/-0.014) for {'C': 1000, 'kernel': 'linear'}\n",
- "\n",
- "Detailed classification report:\n",
- "\n",
- "The model is trained on the full development set.\n",
- "The scores are computed on the full evaluation set.\n",
- "\n",
- " precision recall f1-score support\n",
- "\n",
- " 0 1.00 1.00 1.00 89\n",
- " 1 0.97 1.00 0.98 90\n",
- " 2 0.99 0.98 0.98 92\n",
- " 3 1.00 0.99 0.99 93\n",
- " 4 1.00 1.00 1.00 76\n",
- " 5 0.99 0.98 0.99 108\n",
- " 6 0.99 1.00 0.99 89\n",
- " 7 0.99 1.00 0.99 78\n",
- " 8 1.00 0.98 0.99 92\n",
- " 9 0.99 0.99 0.99 92\n",
- "\n",
- " micro avg 0.99 0.99 0.99 899\n",
- " macro avg 0.99 0.99 0.99 899\n",
- "weighted avg 0.99 0.99 0.99 899\n",
- "\n",
- "\n",
- "# Tuning hyper-parameters for recall\n",
- "\n",
- "Best parameters set found on development set:\n",
- "\n",
- "{'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "\n",
- "Grid scores on development set:\n",
- "\n",
- "0.986 (+/-0.019) for {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.957 (+/-0.029) for {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.987 (+/-0.019) for {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.981 (+/-0.028) for {'C': 10, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.987 (+/-0.019) for {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.981 (+/-0.026) for {'C': 100, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.987 (+/-0.019) for {'C': 1000, 'gamma': 0.001, 'kernel': 'rbf'}\n",
- "0.981 (+/-0.026) for {'C': 1000, 'gamma': 0.0001, 'kernel': 'rbf'}\n",
- "0.972 (+/-0.012) for {'C': 1, 'kernel': 'linear'}\n",
- "0.972 (+/-0.012) for {'C': 10, 'kernel': 'linear'}\n",
- "0.972 (+/-0.012) for {'C': 100, 'kernel': 'linear'}\n",
- "0.972 (+/-0.012) for {'C': 1000, 'kernel': 'linear'}\n",
- "\n",
- "Detailed classification report:\n",
- "\n",
- "The model is trained on the full development set.\n",
- "The scores are computed on the full evaluation set.\n",
- "\n",
- " precision recall f1-score support\n",
- "\n",
- " 0 1.00 1.00 1.00 89\n",
- " 1 0.97 1.00 0.98 90\n",
- " 2 0.99 0.98 0.98 92\n",
- " 3 1.00 0.99 0.99 93\n",
- " 4 1.00 1.00 1.00 76\n",
- " 5 0.99 0.98 0.99 108\n",
- " 6 0.99 1.00 0.99 89\n",
- " 7 0.99 1.00 0.99 78\n",
- " 8 1.00 0.98 0.99 92\n",
- " 9 0.99 0.99 0.99 92\n",
- "\n",
- " micro avg 0.99 0.99 0.99 899\n",
- " macro avg 0.99 0.99 0.99 899\n",
- "weighted avg 0.99 0.99 0.99 899\n",
- "\n",
- "\n"
- ]
- }
- ],
- "source": [
- "# Parameter estimation using grid search with cross-validation\n",
- "from __future__ import print_function\n",
- "\n",
- "from sklearn import datasets\n",
- "from sklearn.model_selection import train_test_split\n",
- "from sklearn.model_selection import GridSearchCV\n",
- "from sklearn.metrics import classification_report\n",
- "from sklearn.svm import SVC\n",
- "\n",
- "print(__doc__)\n",
- "\n",
- "# Loading the Digits dataset\n",
- "digits = datasets.load_digits()\n",
- "\n",
- "# To apply an classifier on this data, we need to flatten the image, to\n",
- "# turn the data in a (samples, feature) matrix:\n",
- "n_samples = len(digits.images)\n",
- "X = digits.images.reshape((n_samples, -1))\n",
- "y = digits.target\n",
- "\n",
- "# Split the dataset in two equal parts\n",
- "X_train, X_test, y_train, y_test = train_test_split(\n",
- " X, y, test_size=0.5, random_state=0)\n",
- "\n",
- "# Set the parameters by cross-validation\n",
- "tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],\n",
- " 'C': [1, 10, 100, 1000]},\n",
- " {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]\n",
- "\n",
- "scores = ['precision', 'recall']\n",
- "\n",
- "for score in scores:\n",
- " print(\"# Tuning hyper-parameters for %s\" % score)\n",
- " print()\n",
- "\n",
- " clf = GridSearchCV(SVC(), tuned_parameters, cv=5,\n",
- " scoring='%s_macro' % score)\n",
- " clf.fit(X_train, y_train)\n",
- "\n",
- " print(\"Best parameters set found on development set:\")\n",
- " print()\n",
- " print(clf.best_params_)\n",
- " print()\n",
- " print(\"Grid scores on development set:\")\n",
- " print()\n",
- " means = clf.cv_results_['mean_test_score']\n",
- " stds = clf.cv_results_['std_test_score']\n",
- " for mean, std, params in zip(means, stds, clf.cv_results_['params']):\n",
- " print(\"%0.3f (+/-%0.03f) for %r\"\n",
- " % (mean, std * 2, params))\n",
- " print()\n",
- "\n",
- " print(\"Detailed classification report:\")\n",
- " print()\n",
- " print(\"The model is trained on the full development set.\")\n",
- " print(\"The scores are computed on the full evaluation set.\")\n",
- " print()\n",
- " y_true, y_pred = y_test, clf.predict(X_test)\n",
- " print(classification_report(y_true, y_pred))\n",
- " print()\n",
- "\n",
- "# Note the problem is too easy: the hyperparameter plateau is too flat and the\n",
- "# output model is the same for precision and recall with ties in quality."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_split.py:1943: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
- " warnings.warn(CV_WARNING, FutureWarning)\n",
- "/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.\n",
- " \"avoid this warning.\", FutureWarning)\n",
- "/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.\n",
- " \"avoid this warning.\", FutureWarning)\n",
- "/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.\n",
- " \"avoid this warning.\", FutureWarning)\n",
- "/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.\n",
- " \"avoid this warning.\", FutureWarning)\n",
- "/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.\n",
- " \"avoid this warning.\", FutureWarning)\n",
- "/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.\n",
- " \"avoid this warning.\", FutureWarning)\n",
- "/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_search.py:841: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n",
- " DeprecationWarning)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "GridSearchCV(cv='warn', error_score='raise-deprecating',\n",
- " estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n",
- " decision_function_shape='ovr', degree=3, gamma='auto_deprecated',\n",
- " kernel='rbf', max_iter=-1, probability=False, random_state=None,\n",
- " shrinking=True, tol=0.001, verbose=False),\n",
- " fit_params=None, iid='warn', n_jobs=None,\n",
- " param_grid={'kernel': ('linear', 'rbf'), 'C': [1, 10]},\n",
- " pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
- " scoring=None, verbose=0)"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn import svm, datasets\n",
- "from sklearn.model_selection import GridSearchCV\n",
- "iris = datasets.load_iris()\n",
- "parameters = {'kernel': ('linear', 'rbf'), 'C': [1, 10]}\n",
- "svc = svm.SVC()\n",
- "clf = GridSearchCV(svc, parameters)\n",
- "clf.fit(iris.data, iris.target)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['mean_fit_time',\n",
- " 'mean_score_time',\n",
- " 'mean_test_score',\n",
- " 'mean_train_score',\n",
- " 'param_C',\n",
- " 'param_kernel',\n",
- " 'params',\n",
- " 'rank_test_score',\n",
- " 'split0_test_score',\n",
- " 'split0_train_score',\n",
- " 'split1_test_score',\n",
- " 'split1_train_score',\n",
- " 'split2_test_score',\n",
- " 'split2_train_score',\n",
- " 'std_fit_time',\n",
- " 'std_score_time',\n",
- " 'std_test_score',\n",
- " 'std_train_score']"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "sorted(clf.cv_results_.keys())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "dict_values([array([0.00032242, 0.00050696, 0.00030732, 0.00045021]), array([5.32061151e-05, 8.45866051e-05, 1.21523332e-05, 2.86382520e-05]), array([0.0001688 , 0.00019749, 0.00016387, 0.0001924 ]), array([8.85899620e-06, 4.74580085e-06, 9.39730861e-06, 5.54376603e-06]), masked_array(data=[1, 1, 10, 10],\n",
- " mask=[False, False, False, False],\n",
- " fill_value='?',\n",
- " dtype=object), masked_array(data=['linear', 'rbf', 'linear', 'rbf'],\n",
- " mask=[False, False, False, False],\n",
- " fill_value='?',\n",
- " dtype=object), [{'C': 1, 'kernel': 'linear'}, {'C': 1, 'kernel': 'rbf'}, {'C': 10, 'kernel': 'linear'}, {'C': 10, 'kernel': 'rbf'}], array([1. , 0.98039216, 1. , 0.98039216]), array([0.96078431, 0.96078431, 0.92156863, 0.96078431]), array([0.97916667, 0.97916667, 1. , 1. ]), array([0.98 , 0.97333333, 0.97333333, 0.98 ]), array([0.01617914, 0.00902067, 0.03715363, 0.01592466]), array([1, 3, 3, 1], dtype=int32), array([0.97979798, 0.96969697, 0.95959596, 0.95959596]), array([1., 1., 1., 1.]), array([0.99019608, 0.98039216, 0.98039216, 0.98039216]), array([0.98999802, 0.98336304, 0.97999604, 0.97999604]), array([0.00824863, 0.01254825, 0.01649726, 0.01649726])])"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "clf.cv_results_.values()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Automatically created module for IPython interactive environment\n"
- ]
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbwAAAEICAYAAAAk60G8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzsnXd8FMX7x99zd8ldegdC6L13kN6kKk2RYq8g9oYVCzYU9WcviBVE7B27X0UFkSad0AmEkJDe+938/tgl3OXukgtpR5j365VX7p597plnd3b3szM7OyuklCgUCoVC0dAx1HcCCoVCoVDUBUrwFAqFQnFWoARPoVAoFGcFSvAUCoVCcVagBE+hUCgUZwVK8BQKhUJxVlDngieEWCiEWFHX5dZ1HkKIXUKIkfpnIYR4TwiRIYTYIIQYJoTYWwtlthBC5AohjDUd+3TR82lT33kozhyEEFII0c7NskuFEL/UdU525Vd47AohWun5m+oyr/rCi87nHm33SgVPCLFCCJEohMgWQuwTQlznwW8uEUJs0k92iUKIH4UQQ6uyAmc6UsquUsrV+tehwFigmZRygJTybyllx+qWIYSIE0KMsSvzqJQyUEpprW7smkLP51BNxxVChAoh3hVCJAkhcvR9876aLqcmKF9P5ZbFCCFKhRBtXSz7SgjxXDXKrfGTrxBipB7zq3L2nrp9dU2V5Qop5YdSynG1WUYl5TscuxXVbX1wtgluVfGkhfcU0EpKGQxMAZ4QQvR15yyEuBN4EVgENAZaAK8DU6uf7hlLSyBOSplX34k0IF4AAoHOQAjavnmgXjMqhycnHSllAvA/4PJyvw0HzgOW1U52lVNB/inAICFEhJ3tSmBf7WelaIjUmUBLKT3+AzoCicBMN8tDgFxgRgUxFgIr7L5/BiQBWcBfQFe7ZecBu4EcIAGYr9sjgVVAJpAO/A0Y3JTXFfhV9zsBPFAXeQBxwBjgWqAQsOrb5lFgJHDMLn5z4Eu0E0ka8Kpubwv8rttSgQ+BUH3ZB4ANKNDj3gO0AiRg0n2aAt/quR0A5pSrh0+B5fp67QL6udmGDnF122rgOv1zO+BPfdulAp/Y+Umgnf75feA14Hu9zPVAWzvfccBePc7reszr3OS0E5h2mvleBawFXtXL2gOcW873KWADkA18A4TbLZ+ib69M3bez3bI44F5gO1AEfFS+nlzkewlwsJztRmCL3fdOnNqP92J3DAJ+wP8BR/T1WaPbjurbIVf/G4R2kfug7pus139Iue12rf7bv1zkOhI4BiwBbtJtRrTj4mFgtZ3vS0C8vg03A8PslhmBB4CD+r6wGWhut8/MA/br2/g1QNjV3Zpy+5dLX335NUAskAH8DLR0s88sA+7SP8focU+uX1t9uxuwO3ap+Bi8Ut+GqcCCCs6H7uqurJxy+9YY/fMAYJO+bU8Az+v2063zq/W6ytC3Z3+0fTgT/XxU2fkc8EHb378AfPVy79PrOA3tfBPubl+rbNt5GM/kLlcppWeCh3byydcD/gcEuvGbAJRWVCjOQnMNEASY0VqGW+2WJaIfJEAY0Ef//BTaAeej/w3Dbie3+32QHuMuwKJ/P6cu8sBx57wKx4N0JKcOGiOwDa3FEqDnOVRf1g6tK9QMROk7xYuuDgBXla77v67H7IUmqKPt1r8QTcyN+rr866bOnHYmHAXkI2AB2g5Zlr/dCcle8NLQDlYTmoB/rC+LRDt4L9SX3QaU4F7w3kYTnauB9lXM9yq0/fQOvd5moZ1swu18E4Buep18wamDugOQp9eLD9pJ7gDga1cnW9EuYvxc1ZObk15Wue22Drhd/xyAdjK6Wt82vdFOBl305a/pOcfodTkYbZ9xtR2u0fNtg9ZC/hL4oNx2W66X6eci15FogjcYWK/bzkMTk+twFLzLgAg957vQLigt+rK7gR1oF9EC6AlE2O0zq4BQtB6iFGCCm2OpIt+p+rp21nN4EPjHTR1cA3ynf74E7aT6id2yb8ofu5Ucg2/p9doT7cKns5ty3dWdQzkuzinrgMv1z4HAwAr2fU/qfAnasTsO7bzwNdBIzysZGFHR+Vxf1+/RjnGjvuw24F+gmb5ObwIfudvXKtt2HsarvuDZnZiH6juNjxufS4GkSuIsxE5oyi0L1ZM+efVxFLgeCC7n9xjaVXe7Ssq6GLur5LrMA88FbxDaQVphRem+03C86i8ro3ylo51wrUCQ3fKngPft1v83u2VdgAI35TrtTDgKyHJgKdo9yvK/LS94b9stOw/Yo3++Alhnt0ygneTdCZ4fWgthM5owHgAmepjvVcBxHFsCGzh1AlkNPF1u2xSjHQMPAZ/aLTOgieNIuzq5xt2+UEHdvg0s1T+318trpH+fBfxdzv9N4BG9/AKgp4f19j/gRrvvHfXtZ7Lzb1NBniM5te/u13//Mdqx7yB4Ln6bcTJPtFbqVDd+Ekfx/xS4z82xVJHvj8C15eoqHxetPLRWXIbuswTteD+5nsuAO8uvfyXHYDM72wZgtosyK6o7h3LKl4V2MfsoEFlDdR5jtzwNmGX3/Qv0iy8XeS5E60X6E3gZx2MqFseek+iK9rXKtp2H8So8j3o8SlNKaZVSrkFT1xsA9MEoufrfpfqGivS0P1YIYRRCPC2EOCiEyEarUNCu9gGmo50Ujwgh/hRCDNLtz6Kd4H4RQhyqYLBCc7QrtfrOoyKaA0eklKUu8moshPhYCJGg57XCLqfKaAqkSylz7GxH0K7YTpJk9zkfsJxmX/o9aAK1QR+dek0FvuXLDLTLN/7kAqnt0cfcBZFSFkgpF0kp+6K1Ij4FPtPvfXlCgl7GSY7oOZwkvtwyH7Rt31T/fjIPm+4b4+a3nrIMmCGEsKDdz/tZSpmsL2sJnCOEyDz5hyYwTfScLHiwn+s45K9/NqHdb69q/h8ANwOjgK/KLxRCzBdCxAohsvScQzi1/1Z2bLrbT6ri2xJ4yW6bpaPtpzHlfo+U8iBay70XWk/NKuC4EKIjMALthF4VPMm/qnVnz7VovQ17hBAbhRCTKvD1pM5P2H0ucPG9ou0/EOiBdpFof0y1BL6y2/6xaBfhle1rFdVnZfEq5HQeSzChXQ0hpZwotVF4gVLKD9Ga2UVoLRFPuASt22EM2sHQSrcLPf5GKeVUtKb112gnNaSUOVLKu6SUbdDup9wphDjXRfx4tGZ8fedREfFACzdCswjtqqW71AYNXXYyJx3p4jcnOQ6ECyGC7Gwt0FojVeXkYBt/O1uTsiSkTJJSzpFSNkW7Mn7d3bDyCkhEu5gCtEc57L9XhJQyG21bBQCtK8tXJ0Yv4yQt0LbZSZqXW1aC1o14HO3As8+zOY7btXy9VFRPJ1mDdkKeilbP9oNV4oE/pZShdn+BUsob9JwK0Y9JD8p1yF9ft1IcT3Ce5Aua4N0I/CClzLdfIIQYhnYhNBMIk1KGonXbntzm8W5yrknigevLbTc/KeU/bvz/BC5C655O0L9fiXYbY6ub33i6rVxRUd3lYbf/6o8aRZUVKuV+KeXFaOekxcDnQogAN/l4UufV4Re03qP/CSHKi9nEctvfom/bslWpQjmexKuQCgVPCNFICDFbCBGot4LGo3UT/s+Vv5QyC+3G9WtCiGlCCH8hhI8QYqIQ4hkXPwlCE8g0tMpdZFe2r9CeuQmRUpag3d+x6csmCSHa6SebLDSVt7mIvwqIFkLcLoQwCyGChBDn1EMeFbEB7WT/tBAiQAhhEUIMscsrF8gSQsSg3few5wRuBF1KGQ/8Azylx+yBdlVY5WdmpJQpaCf0y/T94BrsDlIhxAwhxElxykDbiau6Hb4Huuv7jQm4CWeRKkMI8ZAQor9ePxa0/v1MYG9l+eo0Am7V988ZaPd5frBbfpkQoosQwh+t6/pzqT3u8SlwvhDiXCGED9q9qSK0be0Ot/V0Ev3KeDnaySsU+M5u8SqggxDicj1fH33dO+stzHeB54UQTfX1HSSEMKN1ldvKlf0RcIcQorUQIhBtX//EVQ9DZUgpD6O1fha4WByEdlJNAUxCiIeBYLvlbwOPCyHaC40ewnHUZ02wBLhfCNEVQAgRote1O/5Ea7H+pX9frX9fI90/6lNp3bqjkrrbh9bjcr6+nz2Idt8KfV0uE0JE6TEydbONWq7zCtblGWAlmuidbMUvAZ4UQrTUc44SQlRntH6141XWwpNo3ZfH0E5kz6H15X7r9gdS/h9wJ1oFpaCp8s1oLaPyLEdrXiegjYL8t9zyy4E4oXXnzUPrxgHtHsdvaGKwDnhdSvmHi1xy0AYXTEZrJu9H636p0zwqQj+QJqMNUDmKtq1n6YsfBfqgien3aDeb7XkKeFBv4s93Ef5itNbqcbQup0eklL9VJT875qAJbhrayFf7E3x/YL0QIhetP/82WcVn76SUqcAM4Bm9jC5oo9CK3P0EeI9Tra6xwPlSylwP8gVthGh7/fdPAhdJKdPsln+Ads8xCa3b6VY9z71oLbBX9N9OBiZLKYsrWL3K6ukky9Guvj+RUpatt74fjwNm6+uahCaMJ0+A89EGgGxEayUuRhstnK+v21q97IFoJ9gP0E7qh9FaGLdUkFOFSCnXSCmPu1j0M/AT2on7iF6OfffV82gXD7+gXUS+g3ZftsaQUn6Fti0+1o/dncDECn7yJ5pQnxS8NWgXwH+5/YXndesOd3WXhdZ6fhvtvJSHYxf/BGCXfsy9hHafq6Au6twdUsrH0c7zvwnt1sJLaOeDX4QQOWjnVVcNDk+pdryTIwoVCq9CCGFAO8AvrepFhAexr0IbwOJyMgShPTy9Qkr5dk2Wq1Ao6hc1l6bCaxBCjBfaDCpmtBGYAufWtkKhUJwWSvAU3sQgtBFrJ7sKp0kpC+o3JYVC0VBQXZoKhUKhOCtQLTyFQqFQnBU06Bm1g0LDZVRTjx7lUigUZwCGE/vrO4WzgoPphalSyqjKPc8sGrTgRTVtxpMf/lC5o0KhOCMIeHZsfadwVjD1oz1HKvc681BdmgqFQqE4K1CCp1AozghU605RXZTgKRQKr0eJnaImUIKnUCi8GiV2ippCCZ5CofBalNgpahIleAqFQqE4K2jQjyUoFIozE9WyU9QGqoWnUCi8CiV2itpCCZ5CofAalNgpahMleAqFwitQYqeobZTgKRQKheKsQAmeQqGod1TrTlEXqFGaCoWi3lBCp6hLVAtPoVDUC0rsFHWN1wieECJOCLFDCLFVCLHJxXIhhHhZCHFACLFdCNGnPvJUKBTVR4mdoj7wti7NUVLKVDfLJgLt9b9zgDf0/wqFQqFQVIrXtPA8YCqwXGr8C4QKIaLrOymFQlE1VOtOUV94k+BJ4BchxGYhxFwXy2OAeLvvx3SbA0KIuUKITUKITTkZ6bWUqkKhOB2U2CnqE2/q0hwqpUwQQjQCfhVC7JFS/lXVIFLKpcBSgDZdesiaTlKhUFQdJXQKb8BrWnhSygT9fzLwFTCgnEsC0NzuezPdplAovBgldgpvwSsETwgRIIQIOvkZGAfsLOf2LXCFPlpzIJAlpUys41QVCoVCcYbiLV2ajYGvhBCg5bRSSvmTEGIegJRyCfADcB5wAMgHrq6nXBUKhYeo1p3Cm/AKwZNSHgJ6urAvsfssgZvqMi+FQnH6KLFTeBte0aWpUCgaFkrsFN6IV7TwFApFw0AJncKbUS08hUKhUJwVKMFTKBQ1gmrdKbwdJXgKhaLaKLFTnAkowVMoFNVCiZ3iTEEJnkKhOG2U2CnOJJTgKRQKheKsQD2WoFAoqoxq2SnORFQLT6FQVAkldoozFSV4CoXCY5TYKc5klOApFAqPUGKnONNRgqdQKBSKswIleAqFolJU607REFCjNBUKhVuU0CkaEqqFp1AoXKLETtHQ8BrBE0IYhRBbhBCrXCy7SgiRIoTYqv9dVx85KhRnC0rsFA0Rb+rSvA2IBYLdLP9ESnlzHeajUCgUigaEV7TwhBDNgPOBt+s7F4XibEe17hQNFa8QPOBF4B7AVoHPdCHEdiHE50KI5u6chBBzhRCbhBCbcjLSazxRhaIho8RO0ZCp9y5NIcQkIFlKuVkIMdKN23fAR1LKIiHE9cAyYLQrRynlUmApQJsuPWQtpKxo4BzdH8u2tasx+/lxzthJhIRH1ndKtY4SOsXZgDe08IYAU4QQccDHwGghxAp7ByllmpSySP/6NtC3blNUnA1IKfnwhcd5+qbLSE9J4sDOrcy/cCSb//ylvlOrVZTYKc4W6r2FJ6W8H7gfQG/hzZdSXmbvI4SIllIm6l+noA1uUShqlF0b1rJp9S88+8XvBASFAHBw11YW33w5L/+wHouffz1nqFAoqoM3tPBcIoR4TAgxRf96qxBilxBiG3ArcFX9ZaZoqKz/3/eMueiyMrEDaNu1F607d2fHv3/VY2a1h2rdKc4m6r2FZ4+UcjWwWv/8sJ29rBWoUNQaEoRwvgYUwgCy4d0OVmKnONvw2haeQlHXDDh3Iv/7YgX5uTlltrg9Ozm0exvdzhlWj5nVPErsFGcjXtXCUyjqk27nDKPH4JHcM+NcBo2bQl52JptW/8x1Dz6DX0BgfadXIyihU5zNKMFTKHSEEFx596MMn3QRW9f+TnijJsy4cT5hUU3qO7UaQYmd4mxHCZ5CUY7WnbvTunP3+k6jRlFip1Coe3gKRYNHiZ1CoaFaeIoGjZSSPf/9y1Z95pTB46fSpEXr+k6rzlBip1CcQrXwFA0WKSVvPXY3bz1+L75mC7mZmTx81VTWfP9lfaemUCjqAdXCUzRYtq79g4O7tvLURz9j9vMDYPT0S1h49YX0GT4G/yB3b6I681EtO4XCGdXCUzRYNv3xM6MuuKRM7ACatelAh5592blhTT1mVrsosVMoXKMET9FgMZlMlBQVOdlLioowmhpm54YSO4XCPUrwFF6JzWZj29o/WPbsI3z8ytMcO7i3yjEGjZ/Cb59/QHZGWpltz3/riT+wh+4NbOYUUGKnUFRGw7zMVZzR2Gw2Xn/wVuIP7GHo+ReRl53JE9fPZtbN9zJq2myP43Tqcw7DJ8/g7umj6TN8DHk5WezZsoFbnnoNX4tf5QEUCkWDQgmewuvY8vdvJBzaz+MfrMLXbAFgxNRZPHT5ZPqPnkBgcKjHsaZffwdDz7+Q7ev+xOznz7yFzzfIwSqqdadQVI4SPIXX8d9fvzFy2sVlYgcQ3aI1HXv1Z+f6NQwcO6lK8Ro3a8nYGVfUdJpegRI6hcJz1D08hdfh42umqCDPyV6Yn+sggmc7SuwUiqqhBE/hdQyeMI1fP1tORkpSmW3H+r85HneQbucMrZecbFYrG3//kbcev5cPnlvIod3b6yWPkyixUyiqjld1aQohjMAmIEFKOancMjOwHOgLpAGzpJRxdZ6kotbp0LMv42Zexd0XjaHn4BHkZWcRt2cntz2zpF5aeDarlZfuvYHUxGMMnzyTvJxMnrv9ai647lbGzryyzvNRKBSnh1cJHnAbEAu4GlVwLZAhpWwnhJgNLAZm1WVyirpj8lU3MOS8aez492/Mfv70HnquwwPkdcmm1b+QmniMR9//GpOPLwDDzp/O/RdPZOC4KQSFhtVpPqp1p1CcHl7TpSmEaAacD7ztxmUqsEz//DlwrhBC1EVuivohvFE0I6bMZODYSfUmdgBb1/7OiCkzy8QOIKppczr17s+uOp6xRYmdQnH6eFML70XgHiDIzfIYIB5ASlkqhMgCIoBUeychxFxgLkBkk5haS1Zx9mD28yc/J9vJnp+Tjdk/oE5yUEKnUFQfr2jhCSEmAclSys3VjSWlXCql7Cel7BcUFl4D2SnOBAoL8nnv6QXcdeFI7p05ll8/W15jsYeedwG/fraclOPHymxb/v4fSfFxdBswpMbKcYcSO4WiZvCWFt4QYIoQ4jzAAgQLIVZIKS+z80kAmgPHhBAmIARt8IriLKe4sJD5F44kODSCSVfMIy8rg8/f+D+2r/uTu55/p9rx23btxeSrbuT+2ePp3G8gedlZJB09zB3PvYWPr7kG1kChUNQFXiF4Usr7gfsBhBAjgfnlxA7gW+BKYB1wEfC7lFLWZZ4K7+TjV58mMDiUxz/4rmxS6EETpnHntOHEH9xH87Ydql3GhIuvYfCEqezasBaLfwDdzhlaJ2KnWncKRc3hFV2a7hBCPCaEmKJ/fQeIEEIcAO4E7qu/zBTexM71f3PuRZc5vAEhonE0nXoP4I+vVtZYOcFhEQwaP4Xew85VYqdQnIF4RQvPHinlamC1/vlhO3shMKN+slJ4M75mC1lpqU727PRUOvUeUA8ZVR8ldgpFzeN1gqc4u8hKT+X5u+ZwIj4OAfQZMY45Dy2uUozzLpvDu4seYOh5F9CkRWsA1v/2PUnxcUy8bE6VYpUUF7Hmh6/YuuZ3zH7+DJ90UZ3O7qKErnYpsdpYHZfN5uO5mE0GRrcOoWcT9yNtq+qv8G6U4CnqjdycLO6aNoKYNu25/K6Hyc3O4pu3X2b+hRt47ss/PI4zeMI0tq75g3tnjqV1lx7kZWeSmpjANQ8swuLn73Gc0pISnrn1KpCSkdNmkZedxdtP3svIqbOZdu0tp7GGCm+i1CZ57E9tpO2YNiHkFtt4fWMSY9qEMKNrZLX9Fd6PEjxFvfHyPfNo3Lwlj7zzBQajEYBzzj2P2yYPYeeGNXQb4HnL6sYnXmLGjfP5/auPCAwKYezMK/G1VG0asvW/raK0uIiH3vqsLJ8B557H/OmjGTl1FqGRjaoUr6qo1l3tsvZoNqU2yROjW2A0aHNWDG4exE3fH2JMm1DC/EzV8ld4P149aEXRsIk/sI9RF1xcJi4AoZGN6NznHFYtf7PK8aKaNmfWTfdw/hXXV1nsAHauX8OQ8y5wyqdrv0HEbv63yvGqghK72mdbUj7DWwaXiRdAmJ+J7o392ZmcX21/hfejBE9RbxiNRtKTk5zs6clJhNVya8oVAcEhZKYkO9kzUk4QEBxSe+UqsasTAn0NZBSWOtnTC0oJ9DVW21/h/SjBU9QbEy65lp9WvsOxg3sBkFLy16rPSUk4yhXzH3X5m+LCAn7++H0W33IFL94zj81//oqU0q29KgyfNIPfvljhkM/fq74gKz2Vrv1rZ0YVJXZ1x+jWIfy0P5OjWUWAVr9/HM4is9BKj8bO93qr6q/wflQntKLeGD/7Kr557zUWXHo+MW3ak5edRXZGGh169cMvMNDJv6S4iKdvugxLQCCjL7iYvOwsVr70JAd2/MfeLRuc7Id2b2PGDfM9zqdFh85cevuDPHbdRTRr04G8nCxKiou564V3HJ7xU5yZtAqzcHXvRjzw2xGah5jJK7ZRYrOxYHiMQ7fl6forvB91FCvqjXW/fEfL9p24adGr/P3dZwQEh9J7+BjunXEu6cmJhDeKdvI3GI3Mf/E9DAatc6LPiLHcMWUYzdq2d7LfdcEIzp1+qVOcihg2aTr9z53I/m2bMPsF0K5777KYNYlq2dUPo1qHMKh5EHtSCrD4GOgQYcFQwUtXquqv8G6U4CnqjdhN6xg0fiphkY2YcvVNZfYu/QazZ8sGBo+f6tLfXoCCwyLo2KsfoVFNnOzu4lSGxc+f7gOHn+ZaVY4Su/rFYjLQK9rzZ+mq6q/wXpTgKeqNwJAw0pISnOxpSQkEhTq/6cKt/4lE/IOc3xnsLk5tMCvrubLPn4S470ZVYqdQ1B9K8BQAFObn8euny9n2zx+YLf4MmzSdc8ZOoqrv2HUXp6gg38k+fMoMnpw7i/6jJ9K6c3eklPz+5UrysrPo2m+wU+wRU2fyxJyZTv4FeTns+PdvDsfu8ChOTWMvdhWhxO4UBSU2ftyfwebEPCwmwajWIQxpHlTl/U2hqApK8BQUFxXy5LzZhDeKZvKVN5CXk8VXb7/M4dgdXHzbA9WOc2DnFvZu3ehk7zVkFFfd9wSLb76cyOgY8nKy8TVbmP/S+w7Pwp2kWZsOLv3vfXUF8Qf2eBynJnEldrOynquwlXe2U2y18dAfR4n0MzG9czi5xTY+3ZnGwfRCruxV94+jKM4elOAp+Oenb/ALCOL2Z98su8LuMWgEd04bztiZVxIZ7dmb493FuX3yEJq16+Q2/is/rufgrm1Y/ANo2aFLhVf5A8dOou+IsU7+Ma3bubTXJp627EC17uz560g2/iYD9w6NKauj3tEB3LDqIOe1DyMqwKeeM1Q0VJTgKdjz33oGluu+DAwJo0u/wezbvsljwXMXp0Ov/oRFNXYbf/D4qVV6q4GPr9mlvzt7bVCZ2J1s5Smhc2ZXcgFDWwQ77A9BZiPdGgcQm1qgBE9RayjBUxASEUVywlEne3LCUULCo6odJ+V4PP6BQdWO7w2oVl31CbUYScotdrKfyC0m1KJmMFHUHkrwFIyYMpNHr7mQPsPH0KFnP2xWKz9/8j7FhYV07juw2nFKS0rYunY1Cy49j/QTSRhMRiIaN6UwP5+ops15Yu4sEg7tx2gy0nPIKK6+fxHFBfn8uPIdtq39A7OfNshl6PnTq/xMXH5Odo3EgaqJncI957YJ4f7fjtI/JpDOUf5YbZIf9mdQbJV0a6RmMFHUHqKq0y/VShJCWIC/ADOaCH8upXyknM9VwLPAyXHpr0op364obpsuPeSTH/5Q8wk3QDb/+QvvLnqAgOAQ8nNzCItqzM1PvkLj5q2qHeeqex/nqRsupfug4YybeQW52Vl8+tqzCKHNU9ntnGFl9s9efxajyReQNGvTgdEXXqy9NuidV2jfsx9X3u16yjFXFBUUsPCaC6odB05f7FYt/fm0ftfQWX8shyWbThDoayCvxEa4n4m7BjUlOsi3vlNTAFM/2rNZStmvvvOoabxF8AQQIKXMFUL4AGuA26SU/9r5XAX0k1Le7GlcJXhVo7SkhKP7Y7H4B9C0Vdsai/P6g7eRnpzIgjc/Kbtvk5+TzU0T+tOkRSsWrfzJwT5vTG869xvIfa+ucLDfPnUoT3ywikYxLTzK4/cvV7Lxj5+45+Vl1YpTnZadEjz3lNokcZlFWEyCZsHm+k5HYUdDFTyv6NKUmurm6l999L/6V+KzDJOPD2269KjxOIf37OS8S69zGKTgHxRM574DKS4scLJHNI5m4JhJTvYu/QZzYMcRzxHWAAAgAElEQVR/HgvVvm2bGDB6YrXjVIdJc8cDSvhcYTII2oVX/TVOCsXp4jVvSxBCGIUQW4Fk4Fcp5XoXbtOFENuFEJ8LIZq7iTNXCLFJCLEpJyO9VnNWeEZAcDAJh/Y72KSUHI87SPkOBikl+bk5JBx29k86coiwqMYelxsa2YjEI4eqFUfdt1MoGg5e0cIDkFJagV5CiFDgKyFENynlTjuX74CPpJRFQojrgWXAaBdxlgJLQevSrIPUGwQ5mRmsWr7EYXDH6AsvdTu4I/HIYZY8cgeJRw9hNJro2n8w8x57EZOLtwpMv/5Onr/jWnoNHU3XAUOwlpayavkScjLTST+RyCv330zCoX34WvwIDo+guLiIv779jIyU5DJ7aEQUNpuVjr3P8TifC+bczmPXTqfHoBFl5f6wYilS2tzGOUl1hS4tq4DnPtnMT+uPEODnQ08/G+PbhbqdeDi7yMpXsWn8l5iH2WRgVKtgxrcLJbfY5tKuJjBWKKqOV9zDK48Q4mEgX0rp8qwjhDAC6VLKCt/Kqe7heUZhfh4PXTGFDj37Mkp/vc5Xb71E83aduHbBU07+manJzL9wJP1GTWDMjMvJy87ik1cXY7NaefqTX1z633b+IIw+PpgtfhQVFmIwGggICqG0pJhuA4YydtaV5GVn8fErTxPROJr4g3vp1HsAY2deWRY/pnV7bnry5Srlc/FtD/DuUwsAKMrPI6ZNe+Y9+gJRTZu53R7VFbvcgmIG3fAJg7pFc9353cjIKeKJ5esJLS3i+j7OM4kUlNi4+5c4OkX5Ma5tKLnFVj7ZmUazYF/2phY42VuGmrmxf5Nq5ahQVIS6h1eLCCGigBIpZaYQwg8YCywu5xMtpUzUv04BYus4zQbLmh++pEnzlsx56JkyW8de/bl98hAmXXG900jNFc8/RttuvZn36PMO/jeO68euDWvpOmCIk3+nvgO5++VlbP9nNYEhYbRo34m5o3rS7Zyh3PD4iw5xbjlvIK07deWGxxztt08ewon4uCrlYzL58MI3f5MYdxCzn3+lD9HXRBfmil/30DYmlKXzx5TZhnSPpvXMd5jSPtRpJOLquCyig3y5ecCp1xh1jvTnum8P0CbM4mS//ruDXNApXI1oVCiqiLfcw4sG/hBCbAc2ot3DWyWEeEwIMUX3uVUIsUsIsQ24FbiqnnJtcBzYsYU+I8Y52Cz+AXTuN4iDu7Y6+R/ZF8vAcZOd/fsOZOMfP7r1N5lM+jN6fbH4BxDRJJr+oyc4xenQsx9RzVrWWD4Gg4GYNu3rROwANsQmMXlwawdboJ8vo/u2ZH9aoZP/vrRCBsQ4vvDWz8dA50h/mgT6ONm7NfJ3GUehUFSMVwielHK7lLK3lLKHlLKblPIx3f6wlPJb/fP9UsquUsqeUspRUso99Zt1wyG8cTQJh/Y52KSUJBza5/LlqUGhYRzdH+vkf+zgXqJbOj/O4M4/LzuL+P17nOzH4w5QkJtda/m4oiYHpzSLCiL2iOOAKSklsUfSifB37lSJ9DcRn1Xk5H8su4j8YquTPT67yGUchUJRMV4heIr6ZdS02fy96gv+++s3pJQUFxXyxZLnMfn40tHF3JQzb7qHP776yMH/szeeJT83h7Ezr3Tp//uXK/m/O67lzmnDuW/2eJ6+6VJKS0tY88OX5eI8h4+vmZ3r19ZaPvbMynquxkdiXnNeVz74ZQ+r1h1CSklhcSmPvv8vvj4G7lkwzcl/TJsQ/ojLZmNCrpa/1cZHO1PxMQq2JuU52D/cnopRCLpE+dVIrkcyCrnzp8Nc8vk+Lv9iP4v+OkZxqa1GYisU3oZXDlqpKdSgFc/ZvWkd7z21gLycLIqLimjfvTdzH3mWsCjXgyN++PBtvlz6IiApLS4mMDSMu154h9adujv5FuTlctcFI+g7chxjZ1xBXnYWH728iKCQMOL27UZarUi01wtZ/ALo0KsfY2dcUWv5nKQ2HzlYvfUYN7/4B5m5RRQUlXJOlya8ffcYmkYGunwmb8eJPJZsOkFeiY3iUhsdI/24tHskD/zvKH4+2nVpsVViNgr8fIy8MalNtXNMyy/hpu8PM7JVMBPah5JXbGPZtmTyi228en714yvOXBrqoBUleIoypJSkJh7D1+JHSHhkpf42m4192zYREBxK87Yd3Pr9/PH7xG5ex+3PvllmKy4s4OaJA2jdpQf3vbqirFw//wBunTSYR975giYtWtdKPlA3z9dJKTlyIgd/s4lGYafmiHT3ELqUkuS8EswmA6EWE4vXJFBikywYFlNm9zMZuOrrA9w9uCl9mga6jOMpi9ckaO+mG3HqkdaiUluNxVecuTRUwVNdmooyhBBENW3ukbgAGAwGOvUeUKm4HI7dRs8hoxxsvhY/OvTsT2R0M4dyfS1+dOk7kMOx22stn7p6mFwIQasmwQ5iB6dmX3Hl3zjQl1CLdn/uWE4x58QEOtjNJgPdGvuz8XiuyxhVIT6riIHNHN9iYTYZ6BrlVyPxFQpvQwmeotaJbNLM7aCSvOwsJ/vR/XuIjHb/nNzZQrCvgUOZzoNZDmcU0TKk+nNPhliMHEx3HO0ppeRwZs3EVyi8DTXUq4GSnpzIF2++yLZ/9JlTzp/OpCuux+Tj+tktd/5H98fy5sL5pByPx2A00rZrL+547k0s/p53d42cNpsHLplIx179GXDueRQXFvD5kufxCwxi98Z/+PfXVWX2L5e+iH9gEO179K2pTeFATbfuElJyeWzZen7aEEeAxYfLx3Xirll98fWp+L1unsyxeXmPKB7+I55uUX4Mah5EUank452pFJfaaBPqy60/HiY5twSDATpEWLhncDMKSq18vDOVzYl5WIwGRrUOZlqnCHyMzjOzXN4jiof+iKd7Y/+y+B/tSKHYKukb7c9rGxKd4mQXlbqMn11Uyqex6WxJysdiMjC8eSBTO4a7LBe0+4ee5qlQ1BTqHl4DJC8niwcuOY+BYycx+oKLycvJ4rPXnyMgOISbF73qsb/Jx5ddG9dy7kWXMWb6ZeTlZLHyxUWkJyfy/Nd/VSmfu6efi9FopCA/F2tpKUEhYbTq3J1JV1zP+4sfIuV4PNbSUrqfM4xrFjzlcTemp9RGN2ZmbhH95q5kxsj22owquUU8/O46wgLNfPjQRI9iVDap9E/7M/hwRypFpTasEiL8TdzQtzGL1x5nQvtQxuszsCzflkJKfgk2GwxpEVQ2M8vKHakE+hq5a3BTt/FXbNdEziohws/InYOa8vy6RKc4FpPgYHqRS3tcdgmXTOjK3MndycgtYsHSNZRm5XLHAOdBRrnFVu78Ka5KeSrqloZ6D08JXgPkx5XvsH/7Zm59+vUyW0lxEbdNGsyCJR8T06a9R/43jutHq45dWfDmxw72G8b24cbHX6LP8DF4wsn4tzz1Gtnpqfj4mvExm8vyadq6XZndPyi4mmvvTG3ds3v58y2s253ERw+fErei4lLaXPwevz0/nc4twz2KU5no2Ww24rOK8fc1EBXgy1N/HwMhuH/oqQfpS6w2rvjqAB0jLCwc1cLBPufbgzw+ugXN3XRTlo//3d509qQWcPcQx/jXfHOQduFmHhnZwsl+TrdofnpuusN2aDnjHR4ZGu1Urrv4leWpqDsaquCpe3gNkCN7d9Jj4HAHm4+vmU69B3Bk3y6P/dv36EPj5i2d7J16D2D7utVVzkcIQUhEFP5BwQ752NtrmtocoLLlQApj+zm+Ysjsa2JYjxi2HkipsXIMBgMtwyxEBWjd0cdzS+gfHeDg42M00CXKj0YBPs72Rv4cznC8F1hR/EMZhfRu4hy/Y6SFKH/n+J0i/WgZHepgN/uaGNo92mW57uJXlqdCUV2U4DVAGsW05PCenQ42m81G3N5dNIpp6bH/0f2xZKWnOdkP79lJy47dai2fmqK2R2O2iQ5hy/5kB5vNJtl6IIU20RXOa14tQs1G9mU4DjaxScmhjCKyi6xO9sMZhTQuN0VZRTQO9OWgi/hxGUXkFDvHj8ssJDUz39Fuk2w9kOqyXHfxq5qnQlFV1KCVBsjIabN44OKJtO3WiyETplFYkMfnb/wfIeGRtO3Wy6X//bPHO/h/8uozBIWGs33dav5a9bmdfTHW0lK69h/M6w/extZ//sBi8WfopOlMu/YWDsfuYOmjd5OalIDRaKRVp25cff8inpw70+N8aoK6ePTgmvO60nfuSvp3asIlYzqSW1DCI++uo3GYPwM6e/7evklzx1fpBbFX9ozi/t+OEJ9ZRHxWMWaTIMzPRKnNxq7kfH4/nMWIlsEUlNpYuSOVUIuJDhGuX7T6z9Fslv6XTF6xFYMQhFqM3DMkmkdXJ9A+ws8hTpifiS2JuVz7zQGyi6wYBQT4GAgyG1n931GW/xxbth0eenstgQbpstyxbUK446c4p/gV5alQ1ATqHl4D5dDubSx/7lGO7NkJQtB35DiuvPsxgkLDnHxzszK4+6LRWPwDyUg5gQBCIqOIad2egWMnsfKlReRmZQIQFdOcmx5/mRfvmcvIqbMZfaH2OqFPXnuGkqIi9m7dyPmXz+Xc6ZeSl53Fhy88yfEjB7ht8Rse51Md6vqFrZv2nuDOV/9ky4EUBIIpQ9rw0i0jiAip2tRfVRG8nCIrN31/iAntQhnfLpS8Ehvv/pcMSC7tEcU7/yVzKKMQIWBATBBz+jYm2Ow8avRAWgEP/O8oF3SOYFzbEPJKbLy/NZn96YU8PLyZU5wxrYN58u8EpnUKLyv3vS3J7E8r4JGRzVm2I40DaQUADGwezDU9I12WC7A/rcDjPBV1T0O9h6cEr4GTn5ONyccHX4v7E/D3H7zJkb27ufGJl8r8DUYjt00azH2vraB5u06kJiZg8fcnMCTMwf8kpSXFzB3Vk56DR3DbM0sc7DeM7cPch5+l/+iJHuVzutTn28mzcovw9THiZz79ThNPRe/r2DQOZxZxx6BTIxpLrJK53x1k4cjmtAw1k1dsxWQQmE3u71rc8sMhWoRauHuwY5yrvt7PrK6RTOkU7hDn5u8P0SLEzD0Og2Xc+3tCVf0VdUNDFTy1lzVw/IOCKxWX+AN76NJvkIO/yceXjr36E39Ae5tBZHQMgSFhTv4nMfn4EhIRSc/BI53sHXv1Z9fGtR7nczrUp9gBhASaqyV2VeFIVhHdGznO3uJjFHSO8uOI/qB6gK+xUhHJLbHRu7FznC6N/NmcmOsUJ7fYSh+nwTKCzpF+Lv09oar+CkV1UHuagibNW3Nw1zYHm81m41Dsdpq0aO2xf05WBnu3bnSOs3sbbbvWzr06qH+xq2uig3zZl+486ONgeiHRQZ4P+rAYBbFpznH2pxbSKcL5osTPZCA2tcDZP921v0LhbXjFoBUhhAX4CzCj5fS5lPKRcj5mYDnQF0gDZkkp4+o4Va8j6ehhPn7labau/R2zxZ/hky/ionnzyUhJcmk3+zmfmEZOm839F0+gVceuDJ8yg4K8XD55dTGRTZrRunMPl/73XHQucXt2EH9gL74WP8IbRRMV3Zx1v3xH2269GDFlJgV5uax88UmkhLbd+/Di3dd7lM/pcCAhk/uXruXH9dqMJ1eM78yjVw/E3+JaAP63+Sjz/u93jibn4GM00KNtBN8umkJmXnGV48xZ/AvHUvMwGgQ92kbx/eKpZOYVc89rf/HzpqP4m41cMb4zj183hHW7El36R4b6ezx4ZWybUG7/6TBtwsyc2zqE/BIbH2xPIcrfh6OZRTz2Zzx5xTYMBkGIr5Gnx7SgVMKHu9LZeCwbi4+RUa2CubZXI55em8CRjEKOZBVhNhqI9DdRbLUxrEUgT69JYPPxXCwmA6Nbh3Bt70Ys/uc47cMtnNtGK/f9rcmUWCUzu7p+5jAxp5hl21Ic4lzSPZL0glKX9ppq7dVXuQrvxivu4QkhBBAgpcwVQvgAa4DbpJT/2vncCPSQUs4TQswGLpBSzqoobkO/h5edkc4DF49n/OxrGHVy8Miri8nLziLh0D4ne1FBAXe/9J7LWEf3xbLihceJ3fwvJh8fBo2fwmV3POTy2bjjcQdZcMlEps257dTglOcf5+DubRQXFmAwmsjNysBgMBAQFEp0yzakHD9apXw8ZVbWc6RmFdDnupXccmFPrpvUjYycIha8/Q95hSV8u2iK02/2xmfQf+5KHrz8HOZM1vzvXvI3G2KTEIgqxelzzQpmdo1gfDttxpD3t6YQl1uKBMa3DGJc2xBtJpGdachAfzbEnnDyP5JnJf6LOYDn9/HiMgp5d0syu1LyMRkEQ1sEM6xFEE/+ncDsbhGMbxdGbrGV97Yks/NEPv4WE3fM7secyd3JyCni/jf/Zv++JPak5DOzawQT2mv+7/6nDVoRwKQOYYzT8/xgWwpFpTa6NvLn891p5JfYEECw2cijo5rTMtR5dGV2USm3/xjnFCe3yEp8drHL+A/avbnhdKmvchsSDfUenlcInj1CCH80wbtBSrnezv4zsFBKuU4IYQKSgChZwQo0dMH77v03SDi8n3mPPl9ms5aWMm9ML/oMH8MNj73oYL99yhDmv/geLTt0cRuzpLgIo9GEweh+tNwzt1yJf1AwNy96xSH+jeP6EtOmAw+//Rn5udn4+loQBkO18nGHfTfmsx9tIvZoOu/eO67MVmq10e6S9/jmySn0bBfl8NvJ931DSKCZFQ9OcPCPmLyEaUPbsuyB8R7FmXTv1+QnZ3LnoFNvYbfaJFd9fYBOUf4sGBbjYL/mm4O0Dbfw8IhmTv5L7x3HjFGn3vLgqfCVWG0YhMBoENy06iBtwi3cNdix3Cu/PkC7ZmFsevtSh/UKO+81+jcN5E67wS8n8+kYYXEQAatNGxTz4PBmtA6zkFVQgq/JgF8Fc4Z+uTuN+OxibhvouH2u+HI//WMCub1cufbxq0N9lduQaKiC5zXteCGEUQixFUgGfrUXO50YIB5ASlkKZAERdZuld5FweB+dyr0B3GgyERweSec+A53s7Xv0JeHQvgpj+viaKxQ7gJTEeLoNGOIyvsGo7VL+gcGYfH2rnY8ryt+z230knaHdYxxsJqOBQV2bsvtIutPv45KyGd2nuZN/k3B/RvRq5mR3F+dgQgY9Gjl2yRoNgo6RfoSZDU729hEWIv2MTvbOjfz5a3uCm7WtGB+jAaNBm3A5r8RGz8aOg0qMBkGnSD+Kyr3F3GQ04G820aPc4BejQdAhwo9wP5OTvVOkH/FZxQCE+PlUKHYA8dlFdI1y3j4hFiPdXJRrH7861Fe5Cu/HawRPSmmVUvYCmgEDhBCeT+VhhxBirhBikxBiU06G80mqIdG0VTv2bd/sYLNZrWSnpzkPHrFaObBjC01btat2uZFNYti9+V8Hmxb/P6RNOtlrMh9XA1Q6tQhj3a5EB5vVamP97kQ6tXB+zq9F4yD+3HbMyf9ERj5rdOGxWm1IKSuM07ppKDtTHAdxWG2SfakFZBbbnOwH0gtJK7A62fek5DO4W7RDueXfmWe1SVx1Ztjb/X0M7EjOd1q+L7UAs4/joW612sgvKnWZ//60AjJc5LkvrYBmwa7ftuGKmGCz0yAXq02SXWRlt6vtZhff3frWdrmKho3XCN5JpJSZwB/AhHKLEoDmAHqXZgja4JXyv18qpewnpewXFObZ5L1nKiOmzmLrmt/58cO3KSzIJ+1EIkseuZOWHTqzZc3v/LDirTL7qwtuoUnzVrTqdFrXEQ5ccsdDbPzfD07xjSYTiUcOusxn2z+rnexNW7WtUj7uRmNePbErP66P46XPt5BXUMKxlByuXvwrHVuE07t9Iyf/Z+cN48s/D/DCZ/+V+V/25E/4W3z4/t84el/3If7jXyPk/Dfodd2HtI0JdRnnuRuG8098Dt/sSaew1EZqfgkv/JuI2eLDwcxivtmT5mBv3yKMHcn5Tv4Wsw8920Yx6b5v8B//GqHnv8HNL/5BfomVo1naIJQZn+5l9uf7WbIpqcy+aO1xZn62j0u+PMDSLclc26eRns+pcp9fd5xSm+RIYrbD+l76xE+0DLXwz9Fsp3yMBsH+jEK+tbO/vD6RmCAzbcI97/Yb0yaEzYl5TnFahlj4L8nZHhNkxmQULte3KpxOuVVZL8WZi1fcwxNCRAElUspMIYQf8AuwWEq5ys7nJqC73aCVC6WUMyuK29Dv4QEkHD7ARy89ybZ/VmO2+DP0/AuZeOl1PHzFFMIbR3PswF58/fyIbNKUoLAIHnzzkxopd8vfv/Pe0w+QlpSI0WSiWdsO3PPyMvJysp3ymX3LfaSdSHRpt/gHVFYUUPmjB3uOpnPvm2v4af0RAiwmLhvXmUVzBhPo53zlfiI9jy5XLsfiYyI5swAfk4GwIDMtGgcRl5jN/ZcNYM6kbmTmFnHPkr9JTMvjt+enuygVfvj3MPOe/Y3j6drgkS6twlm2YDxj7vyS6FA/YuMzsfgaadEokPBgP3bGpWESkJZTjMkgCAsy07ppCEdO5HD/pf259nyt3AfeWsvW7UeJzyjkoq4RjG2jzWzywbZkkvNKSMy38tBVg7hOz/O+JX8Tu+c4A6L9WLEtldxiG0aDINjXwH1DY1j0TyKtmoay83Aa/hYTzaMC8SkuZnL7EN7clExKXglGg6BlqJmHhjcjr0QbUPOfPppxZKtgLu/ZCD+fql0jH8suchknraDEyT6lYzj3/XbEaX3TC0p5dFSLygs7zXJPZ70aOg31Hp63CF4PYBlgRGt1fiqlfEwI8RiwSUr5rf7owgdAbyAdmC2lPFRR3LNB8E5ysh6FEHzz7qskJxxlzkPPlNmlzcYdU4dx+7Nv0rpz9xor12bTuu4MBscThn0+ntjdUdVn7DyJ//SHGzmUmMXS+WPK8pcSoi98iylD2vD2PWPLfK1WGx0uW8Znj55Pnw7OrbyT2G8H+/gn87HZJK1nv0u/To358vHJHpXb5IKl9ImycMs5joMv5nx7kMG9mvH1oqkO/m1nv8sdfaNoG27BatVaRUajkc93p2FsEsE79413yMfev6r1WFU82R8+35VGUl4xNw9wXN95qw5x39AY2p5GK6ym9sOzjYYqeF7xHJ6UcjuakJW3P2z3uRCYUZd5nUnYH7iJRw7Sqfc5DnZhNNK2Wy8SjxysUcErf4J0lY8ndleczgPlnsTfG5/BsB7aIBf7/CND/BjczfEFpEajgQGdm2iPIFQgePZx7OOfzMdoFPTt0JioUH+Pyw0PNNM50nnwRdtwC40jAp38+3dqREJ2EW3DLRjtBh4l5Zcys0czp3zs/ataj1XFk/0hIaeIrlGuBtFYSMguPi3Bq4n9UNFwUO34BkhMm47s2eI4yLW0pIR92zbRrE3HesqqatTm7CldW0Xwtz44paColJJSKyWlVk5k5PPn1mNO9n92Hqdrq3AHu6fxT1JSamV9bBIn0vMASM8uJL+wuMJyU7ML2a3PhFJUaqPUJinVB1kcT85xirNuVxItQnwd/AFiAnxY/d9Rp3zs/d1hH6e2aR5iZleK46CbUpskNrXA5XpVh7pcL4X34BVdmrXF2dSlaU9OZgb3XzyeMRddzugLLyUvR3vQ21pSzF0vvFvf6VVKbU8VlpZVQLerPyDIbCI+NQ+jEERH+NMqOpRtB1OICLFwJCkHo1EQHR5A6+hgFs8bxm0v/s6GvcmYDIILh7fjpdtGERro/HbutKwC+sxZybwp3fUHvQu1B9gLSlgfm4TRIMjMLUIIQWigmc4twtgTn+Eyn+0HkjFjIzmvFIOACD8TkQE+HM4qxiAgp1CzB1t8aBlm4YruESzbkcbuE9pMLkNbBjO9YxgP/5nALTN6M3dKDzJyCrl/yRqSjqVx3+BoF1tIe0lr+ThX9Ygk0Lf23maQXWTl9p8OM1F/C0RusY0PtqVQapNc3D2Sd/5LZm9qAUYDDG4ezLV9GlU5n0MZhTUSp6HTULs0leA1UE7Ex/HJa8+wdc3vWPwDGHb+dKZff0etTNxc09S24CWm5dH9yuVc0iWMUa1DKSjVTqzJ0sieY5m8ePMIrpzQhZz8Yu5ZsoZV6w4jbTZmdw5jVKsQ7f1tO1PJ8TGz+pWZLrvHDiZk8uA76/jh38ME+vlw+bjOTBvWlrF3fskLNw/nivFa/PuWruG7tYcpLbU65ZNu8OHg8SwH+7KtycTpU4HN7dvYwb7xeC5CCBbfeCr+A0vXsGlrPNf3juTj2Aw2HsvBz9fIyJZBzOoS4XJKrfSCUu769ShPzRvqFGfh8Ka12h2YmFPMiu0pbDqeh59JMKp1COPbhnLPr0e4rGdU2fZfsT2FhOxinhjd3ON80gtKuf3Hw9WOczagBO8M5GwWvDOVupgI+vFl69mwbh/X9zl1T84mJdd9e0gbDPLkqWnEbDZJxOQ3GBQTyI39Gjv43/LzET5fNJX+nZp4VO74+V/SonEQb919anBKRfGv/uYgA5sHcUNfR/u13xykbZjZYSYUm5Rc8/UBerRvzO8vz3CI3+7id7mlVwTtPZzg+bNdafg1i2JJuTyrGqem+HRnKmkFpdzQ/9R2tknJDasOMX9wU4/zqak4ZwMNVfDUPTyFVzAr67k6e+vB/qPptC1378ogBK1DzTQOd3xMwmAQhAea6RBmdvJvG+7HgYQsj8tNSM1jUFfHwSkVxQ/0NdI+1NneOszsNBOKQQjahVswlGuxGQyCPu2jSMwp8TjPEwWlDHCRZ1Xj1BSJucW0LzdgRdv+lirlU1NxFGcuSvAU9U5FQpeRU0heQc2ejHp1aMSutCIHW4lVsi+9gCNJjgJWXGLlRFYB2/UZOnKLrRSW2iixSnYn59GjTWSFZdnn3z4mhJ82xFUY3z6fzMJSdqQWOtn3pRZyIq/EyR6bWkBxSalT/H92JdIqzPleozuaB/rw20bnPKsap6ZoFWph+wnHwSwlVklsSkGV8qmpOIozF+PChQvrO4da46XX3lh47vRLK3dU1BvuxG5DbBIzHvmeBW//wzN44PIAABnGSURBVHOf/Mf2Q6mM7NXM7Wt6qkKnluEsXLmJzPwSmgb5kpxXwqsbk2jdIoL1e5LJKyihfbNQ4hKzue6ZXykssXIoNY8f92fw2a40vopN57dDmbRvGc69lw5wWYar/O+7tD8Pv7vOZfy0AitZ+cU0CdTyWbolhU7tGrH9WJZDnq+sTyTMYmJPWgGFpbLM/vL6RApKbGTmFJGRV1wW//rnfiXIVsrEdqEeb59mwb4sXRtf7Tg1RbNgX1ZsTyGnyEq0vn3e2HSCxgE+nN/Becq32o5zNvDxztTEhQsXLq3vPGoadQ9PUW+4E7tjKTn0m/sR/3fjcGaP7kBeYQkL3/+XjbEn+OuVGdUeXHAsJYfe131I1xbh7IpLw99solmjIEDw7I1Dmfvc78QlZeNjNNCnQxQXjWjPna/+yU0DmjCsRTBFVm1QyR+Hs8n88QZMJpNTfHf5L543xCn+V49PJjOviIfeXsuP/x7B32LiyolduGJCF/rPWUnzQBNHs4qxmAyE+xkpsUoSc4oI8DWRVWTFKASBvgZCLEbuHRLDp3sy2HQ8Fz8fIyOaBzK9czg+xqp15qTklfBJbHq149QUKXklrNyRWvYeu1Gtg7moS8RprVdNxGnoNNR7eErwFPVCRd2Yjy37l9SsQl6+dWSZTUpJlyuX89594xjYxfVQek+pavxGU5bQr7EfN9oNdpD64JGJw9qx7H7HiZ5rKv+F761j64YDXNf71OAaKSVzvztEuzAz9w5r5mC/8fvD3D4wmo6RavCFono0VMFTlzWKOsWTwSmHE7PpVe7dc0IIeraN4nBidrVzqGr8kuJSOpQb7CCEoE2Yma37k2st/0PHMmlVbhZ/IQQtQ30JMhud7K3DzJzIVYMvFAp3KMFT1BmejsLs074Rv2w84mArLC7lr20J9G4f5eZX7pFScjw1l/TsQo/il/cPDDSzPiHXwb/YamNXSgEXDnd+vVFV47ujX5cmbC83aKXYamNfWhHJ+SVO9l3J+bQJV4MvKkNKSVp+CTlFVXsLg+LMR3VpKuqEqjxykJVbRP/rP2Lq0LbMmdSN9JxCFr73L1GhfnywoPxboypmzY4EbnlxNcfT8igutTKiZzOemTeUSfd94zL+9VO6O/nPmdSVGQ+tYlzbUCa2DyO32MqyrckcySoi6+dbqpT/9VO6c8Ozv5GYlkeJVTK8R1Peum8cTcKd3xqRlVtEn2tX0DvSzNjWIeQWW/kkNp2WraL4Z2s8A5sFMa5tKLnFVlbuSCXEbOTOwU2d4ihOsTslnzc3nSC9oJRSm6RbI39u7N+EMD+vmFbYa2ioXZpK8BS1zuk8X5eYlscTy9fzw/o4Ai0+XD6+M3fM6I2PyfMpoI4kZf9/e/cdXlWV7nH8+4YEQgi9hoQmTQSkRUBQBEVBZFTUsRcclSIwMOp1HGbUq6OjV7mOOvqIWEBQmoDKIIiOYAXREHrRSxMIJZQQ0gvnvX/kgAkpJHBO9j7nvJ/nyWOys87e74kP+WWtvfZa9Bw1mzceupzrL2lNdm4+z8z4kWWJe1jw96E8O+PHIue/4dI29B07t1j7Jat2sWvfcepFR3DwWBbhYUKDulHUia7GT1NuL3ESTUn139CvNb1HzmZkt4b0iosm74Qyd/NRtmcrP711R6nneXrqSj5duZMakeEMH9KJh27pzuHUbB54bB4JpyZf1Oa68+sRHmarhZQmOSOPh5fu4sGLmpz6+c/ZeJj1BzN58aoWttJKIRZ4AcgCzx0q64Hy0z357krSsnJ5acxlp46pKp3vfZ83H76Cvp2blqt97I1vcfOA9rw8rnznKc3jb69gU+IO/tD1t2FZVWXCF7uZ/uTQcp/npEVTllaofaj7YP0hsvI93N/9t5VrVJWxi3cytmcTOpy2U0MoC9bAs3t4xq+cCjuA3clpdGxZv8gxEaFjy/rs9u42UJ72taOr0fm88p+nNL/uT6VZzaLPEYoIzWtHVug8Jw0dMejMjcwphzPzaFG76D1OEaFF7Wocysgv5VUmmFjgGZ/zeDzEb/4b/XY8Vc72yvakY+w/kuHTOi5q35jFq3YVOZaZncfX6/YS375RseuebF/4eGZ2HvsOZ7Bo5c5Sz1NevTrFsCa56IoqOfkeNhxML/M8+fkelifuZu22Q+W+VkV4VNmflsvRrOD+pd+mXnUS9hWdfJST72FjciZt6ld8rz0TeFxxp1ZEmgHTgcaAAlNU9ZXT2vQHPgFO/uZZoKpPV2ad5sw2rvqO2U+NICMzl6y8E/Ro14hpfx1MXMOaJbb/cvVuxr6ynMzsfDKy8+jRvjHvPDqw1PYVcdegDkyas5qRk/7D6Ou7FGzT89YKLu/WjN0H07h24sIi131l3GX8z6wEmlw3mTAgK89DVLUqXBnfjM27Uhj78nLuH9qJlLRs/v7eKoZe3Iq2ceVfoePuQRfw6odrmJJ4kIHeSSjztqbwuz6tSz3PpNkJPD3tB8KA3HwPdaKr8cnz5V+w+kzWHchgcsJBck54yMn30KZewQ7rDaLOfUUbtxnQqhaf/pLC5IQDpyb7zNl4mItio2las+x9AU1wcMU9PBGJAWJUNVFEagKrgetVdXOhNv2BR1R1aHnPa/fwKldy0m6eunUA4+Ib0T2mBvkeZcHWFNan5rN26l3FJgXs3J9K79FzmPaXqxjcswW5eSd4YdZqPv5uOwlTbjvnSQQ796fSc+Rs+neLZfOuo0RVC6dxvSh+PXCcgylZvDdxUJHrzln+C/sPpfHHixqfqn/elqNsPH6CL/55Iy/MWs2SVbuoEVmw3c+D119IlYqu9HEsk+dm/MinK3cQFRnBvUM6MWZYlxLP8826vQx+ZAF/7htbpJ7F245xZNHoIruUn839vIPpuTzy+a9M6B1z6vzztxzlhz1p/HNwy6CcxJGanc/8zUdYvT+DauFhDGhZiyFt61LFJvsUEaz38FwReKcTkU+A11T1i0LH+mOB52rrJw3j57U7Gd6l6KSMh/6zh3cfH8KlF8YWaf/4OyvIzj3Bi6MvLdK+630f8NqEAcXaV1Rp5+9w93S6tW3ErCeuLnI89oa3uDimOvd2LbqySWn1+1u/sXOpn5/Dfd2L1jNq0Q4m/qEPY4Z1PXX8bALv/fWHyDuh3HvaSi7jl+xiZHxjOjaySRyhKlgDz3X38ESkJdANWFXCty8WkXUiskREOpby+hEikiAiCWkpR/1YqSnsltRJ7D14nKbRxSdlxNWqxt5D6cVek3Q4nfbN6xZrf37zeiW2r6jSzt++WV1qRhWvMzoynNiaxVc2Ka1+fzt8LJNmtYvX07xOJFt3pxQ5fjYTWI5k5hNbwkoucbWqciQzuO/nmdDkqsATkWhgPjBBVU9fgykRaKGqXYB/AR+XdA5VnaKq8aoaX7NuPf8WbIosFdbnwlgSD2ZReNQgM+8EGw6k06tD8XtOvTrE8O8VO4q0T8vM5au1e0tsX1Glnf/7DfvYsT+12PEDx7JJOJBZ7vr9rXv7xqzYk1ZCPRnceFnbcz5/+waR/JiUXvz8yZm0a2CTOEzwcc2QpohEAIuApar6Ujna7wLiVfVwaW1sSNO/Tn/kICMrj873TKdljTCGeFck+WD9YXp1a877j19d7PUZWXn0GTOH+PaNT00GeXbGj3Rt05DX/3T5OdeXkZVHh7vfo1+XOMYM+23SSsuYmuzYd7zYdTu2rM+KDUnEVRMGtqpFeu4J5m9NoW98SyY/MvCc66mo5JRM2t0+lfiYGgxuUzDJ4v31h4iuXYO1U+8q8TUVGdrMzvfw6Oe/0qZeJFd5zz9342HOqxvJqIsqP+CNewTrkKZbZmkK8A6wpbSwE5EmwEFVVRHpSUHv9EgllmkKKen5un1H0knLySfuwhbM+CWZqGrhdO0Uy7rth/F4lLDTJgbUqB7BV6/cxEtzExn3ynJqREYw/OqO3DekxNHqCluxaR8padlUCRPGvbKcqGrhtI6tzbLEPfw84x5eXbC22HVTM3KYNHs1M77fTo3ICP54Ry/uu6aTT+qpqEZ1o1jz7p3c8+xSnvt+H+FVhEG9WvHun6/yyfkjw8P4x8DmfLz1KG8mHCAyPIyB59VhYOvaPjm/MW7jih6eiFwCfAtsADzewxOB5gCqOllExgKjgXwgC3hIVVeUdV7r4flHaQ+TT3zrezwe5fmRl5w6pqr0eGAmL429jP5d40p8nb9cOm4uvS+IKTZp5fy73mP09V2YcFO3Sq2nMtjqK8YXrIfnR6r6HVDmvGBVfQ14rXIqMmfjwNEM+nQqujyWiNAmro7PHyovj2PpOSVOWmnXrC7bk45Vej2VYeiIQRZ6xpTCVZNWTOXIz8tl+6a17N3xCxXt4Ze1VFifTk1Z8M22IudMTc/hqzV7ubhjDLl5J/hp6wE27zpS4euejR7tGjHzP1uL1fP12iRuubyd36/vK5X9czMmWLliSNNfbEizuJ+WLWHq83+jVt36ZKYdp2bdeox97nVimrcq83XlWRMzKyeffuM+pG2zOtx/TcFkkOc++Il+XWK59MJYxr68nEZ1ojiWkUPD2tX54PHBFVqppKKOHs+m7R3TGNAtjge9K608/s5KqkWEseadO/12XV/66NttZ/Vzs16eORc2pGkCXtLObbz9zGP81yvTaNO5Gx6Phy/mTmfS+OG8OG8ZYVVK3nqnvAtAV68Wzpf/vIHXPlrHk++uJKp6BBN+350e7RrSf/x8Fv7jWnpd0ASPR3njk/VcO3EhG6feVeHVSsor+VgmIpB0KJ27nv2M8CphtGhck4MpGZw44fHbdX1l6+6jjPrfZZX+czMmWNm/mBDyzcK5DBh2G206F0zWCAsLY9Ctw6lWvQZbVv9Q4msquttBrRrVmHhnT7597WaWvjiMO688n/c+28L913Sk1wVNvNcVxgzrQnRkVb5el3Rub6oM05ZsZuTvOrPyjVtJmv8Av869j2/+dTO1oiL9el1fmbZksyM/N2OClQVeCEk9ephGsc2LHW8U24zUlOKPM/pqa5/kY5m0jCk+1b1lTC2Sj2X65Bpuuq6vnEv9Q0cMsu2DjDmNBV4I6dCjNys//3eRiQ/pqSls+ul72ne5qEhbX+5j169LHB8uLzpB5ujxbJav2UPfThXb9DQQrlv4Wq/OW8OMz7fg8XjO2D4rJ5+v1+4l4eeDqKrj9RsTbGzSSgjJzcnmmRG3ULt+Ay4fdjsZx1NZOO11uve7klvHPQb4Z8PW7Nx8rvjTfBrVjSqYzJKewwszExjapxX/eKCvz6/n9HUBxr+6nCkLNxBTsyoZuSfIPqG8//jV/K5v6xLbz172M+Nf/ZrWTWuTkp5NeFgY0/86qGDCyjnWbxNYTEUF66QVC7wQk52VyZfz32ftd8uJjIri0mtu5KLLr0ZE/Lo7eUZWHlP+vaFge53qEdx55fnc0K+N37egceK6n3y3nTueXsxzVzSnVd1IVJUvdqQydU0yRxaNpmrVonPFNu08wsCH5/PZC8Po0qYhqsq7izfx/MwEVr95G+8s3nRO9VvgmYqywAtAFnjl58+wCzW9R82iZfgJ7rywYZHj4xbvZPQt8Tx6W9HfI49O/pbqVcN56g8XFz3P6Nk8c38fBvYoft+1oiz0TEUEa+DZPTxjYedjx9NzaBBV/ImfhjUiSCphm6Ejqdk0bRBd7Hhsw2gOp2b5pUZjQpEFnjE+dlmP5ny58zieQqMnx7Lz2XAwg3sGdyjWfkD3ZsxZ9jMez2/tk1My+WrNXvpV8qazxgQzC7wQZ70733tx5CUcyfHwxPI9fL/7OJ9vO8ZDS3fRp1NTurdrXKz9zf3bogrXPPYJ877+P95atJF+f/yQ8Td1LbHndzbsEQVjbKWVkGVB5z/RUVX5ZeZwHnxpGTPXJRERUYWxv+/BE8N7l9i+akQVlrx4PVOXbGb60i1EV4/gpTH9GNK77OXejDEVY5NWQpCFXeiyySumPGzSigkKFnbGmFBlQ5ohxOmwS0nL5qu1e6kRGcGAbnFEhJe8WLXxn5P38qynZ0KRK3p4ItJMRJaLyGYR2SQi40toIyLyqohsE5H1ItLdiVoDldNhN3nhetrcPo23P93IU9N+oM3t00j4+aCjNRljQotbenj5wMOqmigiNYHVIvKFqm4u1OZqoK33oxfwhve/pgxOBx1A4i/JPDP9R3568zbOa1qwGPJH327jhr8tYtvM4VSNsJ6eMcb/XNHDU9X9qpro/TwN2AKc/gDSdcB0LfADUEdEYiq51IDihrADmPH5FkZd2/lU2AEMu7QNLZvU5MvEPQ5WFrrsMQUTilwReIWJSEugG7DqtG/FAoV/O+6leCgiIiNEJEFEEtJSjvqrTNdzS9gBpGXmUr9WZLHj9WtXJy0z14GKjDGhyFWBJyLRwHxggqoeP5tzqOoUVY1X1fiadev5tsAA4aawAxjUsyXTl24hL//EqWN7ktP4Zl0SA7rFOVhZaLNengk1brmHh4hEUBB2H6jqghKaJAHNCn0d5z1mXG7Ypa15/4st9B8/j3sGX8Cx9Bxe/2gdT97Ti4Z1opwuzxgTIlwReFKw18k7wBZVfamUZguBsSIym4LJKqmqur+yagwUbuvdAYRXCWP+00NZ8M02Fv+wi+jqEcz57yH0vsBuwRpjKo8rAg/oC9wFbBCRtd5jE4HmAKo6GVgMDAG2AZnAvQ7U6VpuDLrCwquEcfOAdtw8oJ3TpZhCho4YZM/kmZDhisBT1e+AMne01II10MZUTkWBxe1hZ4wxbuCqSSum4izszLmyySsmVFjgBTALO2OMKT8LvABlYWd8aeiIQdbTM0HPFffwTPlZ0BljzNmxHl4AsbAzxpizZ4EXICzsTGWwYU0TzCzwAoCFnTHGnDsLPGNMEdbLM8HKAs/lrHdnjDG+YbM0XcqCzhhjfMt6eC5kYWecZsOaJhhZ4LmMhZ0xxviHBZ6LWNgZN7Fengk2FnguYWFnjDH+ZZNWHGZBZ9zsZC/P9swzwcB6eA6ysDPGmMrjisATkXdFJFlENpby/f4ikioia70fT1R2jb50S+okCzsTUOx+ngkGbhnSnAa8Bkwvo823qjq0csoxxhgTbFzRw1PVb4CjTtdRGaxnZwKV9fJMoHNLD688LhaRdcA+4BFV3VRSIxEZAYwAaNAkthLLK5sFnTHGOMsVPbxySARaqGoX4F/Ax6U1VNUpqhqvqvE169artALLYmFngoX18kwgC4jAU9Xjqpru/XwxECEiDRwuq1ws7Iwxxh0CIvBEpImIiPfznhTUfcTZqs7Mws4YY9zDFYEnIrOAlUB7EdkrIveJyCgRGeVtchOw0XsP71XgVlVVp+otDws7E6xsWNMEKldMWlHV287w/dcoeGzB9SzojDHGnVzRwwsWFnYmVAwdMch6eibgWOD5iIWdMca4mwWeD1jYGWOM+1ngGWPOmg1rmkBigXeOrHdnjDGBwQLvLNmOB8YUsF6eCRQWeGfBgs4YYwKPBV4FWdgZU5z18kwgsMCrAAs7Y4wJXBZ45WRhZ4wxgc0C7wxscoox5WPDmsbtLPDKYEFnjDHBwwKvFBZ2xlScrbFp3MwCrwQWdsYYE3ws8IwxPme9PONGFninsd6dMcYEJ1dsACsi7wJDgWRV7VTC9wV4BRgCZALDVTXRlzVY0BljTHBzSw9vGjC4jO9fDbT1fowA3vDlxS3sjPE9G9Y0buOKwFPVb4CjZTS5DpiuBX4A6ohIjC+ubWFnjDGhwRVDmuUQC+wp9PVe77H9pzcUkREU9AIB0m/v3uznsk58u68qPDcNgMNOF1GJ7P0GN3u/ga+F0wX4Q6AEXrmp6hRgitN1VISIJKhqvNN1VBZ7v8HN3q9xK1cMaZZDEtCs0Ndx3mPGGGNMuQRK4C0E7pYCvYFUVS02nGmMMcaUxhVDmiIyC+gPNBCRvcCTQASAqk4GFlPwSMI2Ch5LuNeZSv0moIZgfcDeb3Cz92tcSVTV6RqMMcYYvwuUIU1jjDHmnFjgGWOMCQkWeA4TkSoiskZEFjldi7+JyC4R2SAia0Ukwel6/E1E6ojIPBHZKiJbRORip2vyFxFp7/3/evLjuIhMcLoufxKRP4nIJhHZKCKzRCTS6ZpM2ewensNE5CEgHqilqkOdrsefRGQXEK+qwfaQbolE5D3gW1V9W0SqAlGqeszpuvxNRKpQ8NhQL1X91el6/EFEYoHvgAtUNUtE5gKLVXWas5WZslgPz0EiEgdcA7ztdC3Gt0SkNtAPeAdAVXNDIey8rgC2B2vYFRIOVBeRcCAK2OdwPeYMLPCc9TLwKOBxupBKosDnIrLauwRcMGsFHAKmeoes3xaRGk4XVUluBWY5XYQ/qWoSMAnYTcESh6mq+rmzVZkzscBziIic3A5ptdO1VKJLVLU7BbtfjBGRfk4X5EfhQHfgDVXtBmQAjzlbkv95h26vBT50uhZ/EpG6FCxq3wpoCtQQkTudrcqciQWec/oC13rva80GLheR950tyb+8fxWjqsnAR0BPZyvyq73AXlVd5f16HgUBGOyuBhJV9aDThfjZQGCnqh5S1TxgAdDH4ZrMGVjgOURV/6KqcarakoIhoGWqGrR/IYpIDRGpefJz4Cpgo7NV+Y+qHgD2iEh776ErgM0OllRZbiPIhzO9dgO9RSTKu0H1FcAWh2syZ+CKpcVMSGgMfFTwu4FwYKaqfuZsSX43DvjAO8y3g+BbEq8I7x8yVwIjna7F31R1lYjMAxKBfGANtsSY69ljCcYYY0KCDWkaY4wJCRZ4xhhjQoIFnjHGmJBggWeMMSYkWOAZY4wJCRZ4xhhjQoIFnjHGmJDw/wb5SsiWrgzmAAAAAElFTkSuQmCC\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "print(__doc__)\n",
- "\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "from sklearn import svm, datasets\n",
- "\n",
- "# import some data to play with\n",
- "iris = datasets.load_iris()\n",
- "X = iris.data[:, :2] # we only take the first two features. We could\n",
- " # avoid this ugly slicing by using a two-dim dataset\n",
- "Y = iris.target\n",
- "\n",
- "\n",
- "def my_kernel(X, Y):\n",
- " \"\"\"\n",
- " We create a custom kernel:\n",
- "\n",
- " (2 0)\n",
- " k(X, Y) = X ( ) Y.T\n",
- " (0 1)\n",
- " \"\"\"\n",
- " M = np.array([[2, 0], [0, 1.0]])\n",
- " return np.dot(np.dot(X, M), Y.T)\n",
- "\n",
- "\n",
- "h = .02 # step size in the mesh\n",
- "\n",
- "# we create an instance of SVM and fit out data.\n",
- "clf = svm.SVC(kernel=my_kernel)\n",
- "clf.fit(X, Y)\n",
- "\n",
- "# Plot the decision boundary. For that, we will assign a color to each\n",
- "# point in the mesh [x_min, x_max]x[y_min, y_max].\n",
- "x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
- "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
- "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
- "Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
- "\n",
- "# Put the result into a color plot\n",
- "Z = Z.reshape(xx.shape)\n",
- "plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)\n",
- "\n",
- "# Plot also the training points\n",
- "plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolors='k')\n",
- "plt.title('3-Class classification using Support Vector Machine with custom'\n",
- " ' kernel')\n",
- "plt.axis('tight')\n",
- "plt.show()"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
|