Planar data classification with one hidden layer

你会学习到如何:

  • 用单隐层实现一个二分类神经网络

  • 使用一个非线性激励函数,如 tanh

  • 计算交叉熵的损失值

  • 实现前向传播和后向传播

1 - Packages(导入包)

需要导入的包:

  • numpy:Python中的常用的科学计算库
  • sklearn:提供简单而高效的数据挖掘和数据分析工具
  • matplotlib:Python中绘图库
  • testCases: 提供了一些测试例子来评估函数的正确性
  • planar_utils: 提供各种有用的在这个任务中使用的函数
# Package imports
import numpy as np
import matplotlib.pyplot as plt
from testCases import *
import sklearn
import sklearn.datasets
import sklearn.linear_model
from planar_utils import plot_decision_boundary, sigmoid, load_planar_dataset, load_extra_datasets %matplotlib inline np.random.seed(1) # set a seed so that the results are consistent
% testCases.py 保存在本地

```python
import numpy as np def layer_sizes_test_case():
np.random.seed(1)
X_assess = np.random.randn(5, 3)
Y_assess = np.random.randn(2, 3)
return X_assess, Y_assess def initialize_parameters_test_case():
n_x, n_h, n_y = 2, 4, 1
return n_x, n_h, n_y def forward_propagation_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3) parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} return X_assess, parameters def compute_cost_test_case():
np.random.seed(1)
Y_assess = np.random.randn(1, 3)
parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} a2 = (np.array([[ 0.5002307 , 0.49985831, 0.50023963]])) return a2, Y_assess, parameters def backward_propagation_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
Y_assess = np.random.randn(1, 3)
parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} cache = {'A1': np.array([[-0.00616578, 0.0020626 , 0.00349619],
[-0.05225116, 0.02725659, -0.02646251],
[-0.02009721, 0.0036869 , 0.02883756],
[ 0.02152675, -0.01385234, 0.02599885]]),
'A2': np.array([[ 0.5002307 , 0.49985831, 0.50023963]]),
'Z1': np.array([[-0.00616586, 0.0020626 , 0.0034962 ],
[-0.05229879, 0.02726335, -0.02646869],
[-0.02009991, 0.00368692, 0.02884556],
[ 0.02153007, -0.01385322, 0.02600471]]),
'Z2': np.array([[ 0.00092281, -0.00056678, 0.00095853]])}
return parameters, cache, X_assess, Y_assess def update_parameters_test_case():
parameters = {'W1': np.array([[-0.00615039, 0.0169021 ],
[-0.02311792, 0.03137121],
[-0.0169217 , -0.01752545],
[ 0.00935436, -0.05018221]]),
'W2': np.array([[-0.0104319 , -0.04019007, 0.01607211, 0.04440255]]),
'b1': np.array([[ -8.97523455e-07],
[ 8.15562092e-06],
[ 6.04810633e-07],
[ -2.54560700e-06]]),
'b2': np.array([[ 9.14954378e-05]])} grads = {'dW1': np.array([[ 0.00023322, -0.00205423],
[ 0.00082222, -0.00700776],
[-0.00031831, 0.0028636 ],
[-0.00092857, 0.00809933]]),
'dW2': np.array([[ -1.75740039e-05, 3.70231337e-03, -1.25683095e-03,
-2.55715317e-03]]),
'db1': np.array([[ 1.05570087e-07],
[ -3.81814487e-06],
[ -1.90155145e-07],
[ 5.46467802e-07]]),
'db2': np.array([[ -1.08923140e-05]])}
return parameters, grads def nn_model_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
Y_assess = np.random.randn(1, 3)
return X_assess, Y_assess def predict_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
parameters = {'W1': np.array([[-0.00615039, 0.0169021 ],
[-0.02311792, 0.03137121],
[-0.0169217 , -0.01752545],
[ 0.00935436, -0.05018221]]),
'W2': np.array([[-0.0104319 , -0.04019007, 0.01607211, 0.04440255]]),
'b1': np.array([[ -8.97523455e-07],
[ 8.15562092e-06],
[ 6.04810633e-07],
[ -2.54560700e-06]]),
'b2': np.array([[ 9.14954378e-05]])}
return parameters, X_assess ```
% planar_utils.py 保存在本地

```python
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model def plot_decision_boundary(model, X, y):
# Set min and max values and give it some padding
x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1
y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1
h = 0.01
# Generate a grid of points with distance h between them
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Predict the function value for the whole grid
Z = model(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the contour and training examples
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.ylabel('x2')
plt.xlabel('x1')
plt.scatter(X[0, :], X[1, :], c=y.ravel(), cmap=plt.cm.Spectral) def sigmoid(x):
"""
Compute the sigmoid of x Arguments:
x -- A scalar or numpy array of any size. Return:
s -- sigmoid(x)
"""
s = 1/(1+np.exp(-x))
return s def load_planar_dataset():
np.random.seed(1)
m = 400 # number of examples
N = int(m/2) # number of points per class
D = 2 # dimensionality
X = np.zeros((m,D)) # data matrix where each row is a single example
Y = np.zeros((m,1), dtype='uint8') # labels vector (0 for red, 1 for blue)
a = 4 # maximum ray of the flower for j in range(2):
ix = range(N*j,N*(j+1))
t = np.linspace(j*3.12,(j+1)*3.12,N) + np.random.randn(N)*0.2 # theta
r = a*np.sin(4*t) + np.random.randn(N)*0.2 # radius
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
Y[ix] = j X = X.T
Y = Y.T return X, Y def load_extra_datasets():
N = 200
noisy_circles = sklearn.datasets.make_circles(n_samples=N, factor=.5, noise=.3)
noisy_moons = sklearn.datasets.make_moons(n_samples=N, noise=.2)
blobs = sklearn.datasets.make_blobs(n_samples=N, random_state=5, n_features=2, centers=6)
gaussian_quantiles = sklearn.datasets.make_gaussian_quantiles(mean=None, cov=0.5, n_samples=N, n_features=2, n_classes=2, shuffle=True, random_state=None)
no_structure = np.random.rand(N, 2), np.random.rand(N, 2) return noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure
```

2 - Dataset(导入数据集)

首先,我们导入需要工作的数据。下面的代码将导入一个 "flower"二分类数据集到变量 X 和 Y.

X, Y = load_planar_dataset()

使用matplotlib可视化数据集。数据看起来像一朵“花”,上面有一些红色(标签y=0)和一些蓝色(y=1)点。您的目标是建立一个适合这些数据的模型。

# Visualize the data: c: 颜色;s:线宽; cmap:模块pyplot内置了一组颜色映射
plt.scatter(X[0, :], X[1, :], c=Y.reshape(400), s=40, cmap=plt.cm.Spectral);

你有:

  • 一个 numpy-array (矩阵)X: 包含你的特征(x1, x2)
  • 一个 numpy-array (向量)Y: 包含你的标签(red:0,  blue:1).

来第一次得到更好的数据是什么样子的感觉:

Exercise: 你有多少训练样本?另外,X和Y的维度是什么?

### START CODE HERE ### (≈ 3 lines of code)
shape_X = X.shape
shape_Y = Y.shape
m = shape_X[1] # training set size
### END CODE HERE ### print ('The shape of X is: ' + str(shape_X))
print ('The shape of Y is: ' + str(shape_Y))
print ('I have m = %d training examples!' % (m))
The shape of X is: (2, 400)
The shape of Y is: (1, 400)
I have m = 400 training examples!

Expected Output:

shape of X (2, 400)
shape of Y (1, 400)
m 400

3 - Simple Logistic Regression(简单的逻辑回归)

在建立一个完整的神经网络之前,让我们先看看逻辑回归在这个问题上的表现。可以使用sklearn的内置函数来实现这一点。运行下面的代码来训练数据集上的逻辑回归分类器。

# Train the logistic regression classifier
clf = sklearn.linear_model.LogisticRegressionCV();
clf.fit(X.T, Y.T);

3.1 绘制这些模型的决策边界

# Plot the decision boundary for logistic regression
plot_decision_boundary(lambda x: clf.predict(x), X, Y)
plt.title("Logistic Regression") # Print accuracy
LR_predictions = clf.predict(X.T)
print ('Accuracy of logistic regression: %d ' % float((np.dot(Y,LR_predictions) + np.dot(1-Y,1-LR_predictions))/float(Y.size)*100) +
'% ' + "(percentage of correctly labelled datapoints)")
Accuracy of logistic regression: 47 % (percentage of correctly labelled datapoints)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhoAAAGBCAYAAAAg8Bg7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz%0AAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo%0AdHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzsvXmQJOd5n/m8mXWffV/T19wDzOAk%0AQIAACYAgRZEgRVKmLNG2di17Y3clr72ODa8ty+G1tGt5FXY4vFbI8h5erWRbDlm2ZIn3BZIAQYAk%0AAILA4Jh7pu/7qq77yPz2j6zu6equq3u6uqt6vgdRMeisLzO/yqrM/OV7ilIKjUaj0Wg0mkZgHPYE%0ANBqNRqPRHF200NBoNBqNRtMwtNDQaDQajUbTMLTQ0Gg0Go1G0zC00NBoNBqNRtMwtNDQaDQajUbT%0AMLTQ0Gg0Go1G0zC00NBoNBqNRtMwtNDQaDQajUbTMLTQ0Gj2ERH5JRFRIvLIAe/3N0RkV2V+RSRQ%0AXO+ZMu9tfI7RfZjbM8VtbbwsEVkUkS8d9HE6bLYci2cOey4azUGhhYZGczT4f4EP7HKdAPDrwDNl%0A3vtKcXuzdzatEv5BcZvPAP8YeAJ4UURO7+M+mp03cI7BG4c9EY3moHAd9gQ0Gs2do5SaAqb2cXuL%0AwOJ+ba/INaXUD4v//5KIrAH/FvhFHMFzYIiIAD6lVPog96uUWgd+WHOgRnOE0BYNjeYQEJFhEflD%0AEVkQkayIXBKRvyMixrZxgyLyJyISF5E1EfkPIvJo0fz+S1vG7XCdiMizIvKCiCyLSFpEJkTkT4su%0Ak1FuC4lf3+LW+IPiumVdJyLycRH5tojERCRVnPev7fEwvF78t7fM8flocT/rxf28LCIfKTPuMyJy%0AsXgMb4rI365wLJSI/CsR+WURuQRkgb9afM8jIv9QRC4Xt7MoIr8vIt3btlHxeG4Z8ysi8paIJIrf%0A2WUR+d+3vF/WdSIinxaRHxQ/a1xEviUiH9g25jeK654XkT8qfgfzIvL/iUi03oOu0Rw02qKh0Rww%0AxRvYK4AH+F+AMeBTwD8HTgJ/ozguCHwX6AB+FbgOfBz44zr2MYrj/ngJ+OvAGnCsuL4HxyXyceDr%0AwO/huF6gihVDRP4b4N8ALwK/DCwAZ4AL9XzuMhwv/nt1235+Efh3wBdwxEAe+O+Bb4jITyulvl0c%0A93HgvwDfA34B53r2P1NGuBT5LPAh4H8D5oCForD7QnH5P8P5XkaA/xV4QUQeUUql6zieKRH5PPCv%0Agd8pzsMGTgH3VjsIIvKXgf8AfBP4S4AX+HvF/X9EKfX9bav8Kc5v4PeA+4DfKi7/69X2o9EcGkop%0A/dIv/dqnF/BLgAIeqTLmt4pj3r9t+b/GuTmdKf79N4rjPr5t3P9VXP5LW5b9hnM6b/79ueKYB6rM%0Ao6s45jeqfI7R4t8hIIZzo5VdHpNnitv6eRwx4MeJz7gMvAu0bRkbAJaBL27bhgG8Cfxoy7JXgQnA%0As2VZCFjaeiyKyxWOOGjftvzzxff+wrbljxSX/8oujufvAKt1HotntnyuaeAiYGz7HPPAy9u/Y+Dv%0Abtvm7wLp3X4v+qVfB/XSrhON5uB5FnhPKfXqtuV/AEjxfYCngbhS6uvbxv1RHft4E8gB/4+I/FUR%0AOXEH8wVHGESAf62U2lV2yxb+GMc6kQJeLm7vk0qptW376QD+rYi4Nl44N+SvA4+KSLBo7XkE+HOl%0AVG5jZaVUAvhShf1/Rym1um3Zp3AEyJe27e9NHKvHM8Vx9RzPV4G2olvjMyLSVccxOQsMAP9eKWVv%0A+xx/Cjy+1TVT5Ivb/r4I+ICeOvan0Rw4WmhoNAdPJ+WzOWa2vL/x73yZceWWlaCUugF8FMe98bvA%0ADRG5ISJ/e/fTBWAjXuFOAk5/FXgUR0D9ExwXx5+LiHfLmA23x5/giJKtr1/FEWIdQHvx/3dzfMod%0A816gDUdEbN9fH47Vp67jqZT69zjuixEckbAgIj8SkZ+qMB+4/V1X+j0YOJ91K8vb/s4W//VX2Y9G%0Ac2joGA2N5uBZBvrLLB8o/ru0Zdz7y4zrq2cnSqmXcLI7TJyn/78F/EsRmVdK/cfdTXkzdmNwl+tt%0A5aZSaiMA9HsikgZ+szivf15cvvHZ/xaVszPmATeOG6FcPEal41POErOEc5w/XmGd+ObKdRxPpdTv%0AA79ftLg8hRPr8WUROaOUGi+z/Q3RUOn3YAPbrTAaTUuhLRoazcHzbeBeEXl42/L/Gudm+N3i3y8C%0AYRH5xLZxn9/NzpRSllLqR8D/UFy0sd/dPAm/ghOj8csiIrvZfxX+GU6A698XkXBx2cs4rox7lVKv%0AV3jllFJJnKyVz4qIZ2ODIhLCcYfUy5dxrApmhX1d2b5CleO5dUxSKfU1HMuNBzhfYf9XcGI0/vLW%0A41oUKp8DfqCUSu3i82g0TYe2aGg0jeHZ7amhRb4K/B84ouIrIvKPgHHgkzjBn/+nUmojC+PfAv8T%0A8Ici8g9xbsqfAH66+L5NBUTkl3FiPb6CEzDp43ZWwvMASqm4iIwDnxGRbwMrwJJSamz79pRSCRH5%0AOzjZKc+LyL/BsSycwgmQ/Ju1DkiZbeZF5B8A/wn428BvFvfzt3BiNDpwXCgLOK6bB4BupdSvFDfx%0Aj4qf7xsi8tuACfxdIIHjXqmH/wj8FeCrxW28iuM2GQQ+DHxBKfVn9RzP4jFJ44ilWRzLyq/hCLTX%0AKhwDW0T+Hk7WyZdF5P/GyTr5uzgunb9f5+fQaJqXw45G1S/9OkovbmdrVHqNFscN49xclnDiAy7j%0ApEQa27Y3hOPvjwPrODfeTxS39ekt436D0qyTx3FSP8eATHE/LwA/s237H8GpUpkpbvMPtn2O0W3j%0AP1HcTgJI4mSN/L0ax+SZ4rZ+rsL7P8QROdEty57CsTYsF4/PVPHvn9u27mdxgiGzOILtV4HfBla2%0AjVPAv6qwfxfwd3ACPtPFY30JJ7vnVL3HE0c8fgcniDSLY6n4Y+C+MsfimW1z+EzxOKSLx/Z54Ilt%0AY36juG5Xhd/caLnPp1/6ddgvUWqvAeQajeYwKFoBfhMYVk5FUE0REXHjCIZppdTHDns+Go1Gu040%0AmqZGRDZcEpdxAiCfBf5H4A+1yAAR+T3gW9x2VfwycA+OK0aj0TQBWmhoNM1NCidOYxTHdz8B/FMc%0Ai4YGwjgZK904sRVvAM8ppZ4/1FlpNJpNtOtEo9FoNBpNw9DprRqNRqPRaBqGFhoajUaj0WgahhYa%0AGo1Go9FoGsZdFQxarLw3wJaywhqNRqPRaOomDMyoXQR43lVCA0dk3PUpgRqNRqPR3AGDOAXp6uJu%0AExpxgD878yxB82776BqNRqPR7J2kVeBnr34HdukVuCvvtkHTRdB0H/Y0NBqNRqM58uhgUI1Go9Fo%0ANA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1G%0Ao9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUML%0ADY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0%0ADUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DcN12BPQaDQaTXlyORurAC634HbLYU9Ho9kT%0AWmhoNBpNk5FKWizM5clm1OayQNCgu8+Nz6cN0ZrWQv9iNRqNpolIxC0mx3IlIgMglbSZuJklk7YP%0AaWYazd5oWaEhIr8mIkpE/uVhz0Wj0Wj2A6UUczO5Ku/D/Gzl9zWaZqQlhYaIPAr8d8DFw56LRqPR%0A7BeppBOTUY1MWpHLaquGpnVoOaEhIiHgPwD/LbB6yNPRaDSafSOXU7UH7WKcRtMMtGIw6O8CX1FK%0APS8i/7DaQBHxAt4ti8INnZlGcwisuiO8Ez3NeHAAG6E3s8SF2HWOZRYOe2qaXWKa9Y7TGSia1qGl%0AhIaIfB54H/BInav8GvDrjZuR5m6hkFesrRZIJiyUAn/AoK3Dhdd7uEbBW4FjfKvvCQCUOHMZDx5j%0ALDTEwyvv8Ojqu4c5Pc0uCYVMRPKoKgYLlxt8fi00NK1DywgNERkCfhv4mFIqU+dqvwX8iy1/h4Gp%0A/Z6b5miTSlpMjedKLv7ZjMXaikVvv5u2jsM5jZKmj+f7PoBCQG7feDYExxsdF+jNLDOcnjuU+d1N%0AZLM2+azCMB0RKiIopUgmbOIxC8tSuD1CtN1VNT3VMIVgyCARrxyD0dHpRkQLDU3r0DJCA8eS0QP8%0AeMtJZgJPicjfBLxKKWvrCkqpLJDd+FufnJrdUiioHSJjK/Ozebw+wR/YafO2LEVstUBs1aJgKVwu%0Aoa3dRbTdxDDK/xYLBUU8ZlEoKExTiERNXBUKNV2KnNwhMrYiyubttjNaaDSQTNpmfjZHJn37B2Ka%0A0NHtIh6zSpYDrK1YtHeadPeWFwuWpaqKDHBEjUbTSrSS0Pg2cN+2Zb8PXAb+6XaRodHsB7HVQlUz%0ANsDqcmGH0CjkFRNjWfJbgvZylmJhLs/aaoHhUS+ma4sVQilWlwsszpemHCzO5+noctHV49pxY5rz%0AdW1aL8qhxGDO113rI2r2SDZjM3Eru+P3YVmwOFc5dWR12cLlEjxeg2TCuWz5/AbhiMn6Wu3L2Pqa%0ARSTqjPN4jIpCVKNpFlpGaCil4sA7W5eJSBJYVkq9U34tjebOSCZrPz0mEzvHzE7nSkTGVnJZxfxs%0AjoGh23HKsVVrh8jYYGWpgAh09bhLlgvKKaxQw1KnAH0r2n8W56vHUlRfd/t37VQCDQZrx/woBZNj%0At2tpBEIGvf1uPJ6WSyLU3CXoX6ZGU406biTbh+SyNqkaAiW+blPIO2sqpVhayJcdlwqGmRs6yXu+%0AYdbFX/LesfR8jYkpCoaLLw48S9rwVB+r2RWFgiorMO8E23J+F7sllbAZu54lk9EuFU1z0jIWjXIo%0ApZ457DlojjaBgEE6Vf0CHgiU6vV0nSWi02mbsNsknbKxtlnMs14/lx98ktXewc1ll5TieHKKpxdf%0Aw2vnObt+izfaz1PALO9CKVo65n2dfL3/KT47/by2bOwThUJz1bFQCiZuZTl5xqdTXzVNh7ZoaDRV%0AiHbULmzQ3lmq1+u9zG94POxtIqNgunjzyY+z1j2wY4VbgWP8afuHuHkzR3YpxU/PfA9T2VSz4Ssx%0AWPB1Mu3vrXNmmlq4mvBmrmxYXS5vGdNoDhMtNDSaKrjdBgODld0Ond0ugqFSMRII1lF1ScDvN1BK%0AYdulImF25AzpYARllDk9DYN4WzdTHcPMz+YpXJriL976CrV8PGLb3AgOVh2jqR+XWwjUEU9x0Kyu%0A6Jh4TfPRfGeKRtNkhKMmoye9RNtNTJeTvhgKGwyNenYEaIJzEwpHq59a0TYTMWByLMvsdOlT6NzQ%0AqeoTUvbmmExasT6XgirZJ+DIkNWE6M6f+0hXj7vpomxty4n50WiaiZaO0dBoDgqvz6BvoP6Ayr5+%0AD/lcdkcdBYBA0KCz28XNa5myDbRyPn/1TBIxyPkCm38mV7L4C2nSpq/yegL+eIzJsSzHT/twuZrs%0ADtmC+AMGQyMe5qbz5PO3v2cRx9IVihisrTiF3Q4MgXxe4XbrukGa5kELDY2mARimMDTqIb5ubxbg%0AcrmFYNDA7YGp8VzFLp3edJK8p4posG28qcTtvxWcWbrGxd77qjpQ+ieuY9tObZDO7p2WGM3uCQRN%0Ajp92AoZzOYVpOJU9jWIMR3uHHKzQUHDrWhbTdGKHOrp21l/RaA4aLTQ0mn1EKcXaSoHVZWvzKdfl%0AhmDIyS5ZiNfoAQ70j1/j2v2dlQcYBv0T10oW3bN4ianIMZZ97bA1tsO2wTA49fareDMpAOLrlhYa%0A+4iIEAiaBII736s3O0UE2jtNVpb2R5RYFiwtFEinbI4Ne7TY0BwqOkZDo9kn8nnFzWsZFuYKJab0%0AQt4pyJXL1nfT6Zu8Tii24oiE7SibtsUZOucnNxeJAUahwD0vfI3hG+/gym1W3SccW+HCq99mcOzy%0A7U1oF/6BUW/VTqWgrX3/n/uSCZv4ug4Q1Rwu2qKh0ewDtq2YuJWlsA/ZhaZt8cAr3+D6fY+xMHh8%0As0aGWBb9E9c4+e5rGFvUQlu7ydx0HpcNJy69wejlN8n5/Bi2hSe7s/+g17tjkaZBeDwGXh+U+Rp2%0AkIjbBENGzUJgPr+Ujf2pxNqKRSSqL/Waw0P/+jSafWA9Zm1W+twP3IUc9/zkJS6M/RjrWA/rqwX8%0ACwu487mSccGQgccrJcYPQ9n40smK204lFStLedo7y/vvCwVFIa8wTXDrstZ3TFePh+mJXM1x2axN%0Ad5+b1I2d/VM2aO80MU0hk67tgtsgp5uwaQ4ZLTQ0mn0gHmuMedpaTcHqGPcMu7F7ILZmYBVutxwP%0AhoyKPVIqbtNyem1k0jb9g7f997mszeJ8vqR7qM8vdPe666sNoinL9sqxlTAEvF6D4RNe5qZzZDNb%0AMlkMaGszyWVtkondCdpKnYI1moNCCw2NZh+wrMYGPszN5Dl5xkekbecpu9c4v/i6TThuE444N7Dx%0Am9kdYSGZtGJyLMexYQ+hsBYbe8EwBX/QIF2j/00o4hxfn89g9KSPTMYml7UxDMEwFVNje2viFo4a%0AxNct1tcKFAoKt9sRqYGgoYNENQeCtotqNPuAx9vYC7ZVKN8lFrgjAbC24lhD5ufyZWNPN5ibzulC%0AUHdAZ1f1ZzqfX/Bvs3z4fAaRqAvTlD2LDBFIJixmJnMk4jaZtCK+bjM1nmNmUn+nmoNBCw2NZh+4%0Ak4yBtjr6qQAVs1bK3aTqJZe1yaRtUjUCEC2LEpeKZncEQyZ9x9xlrU8+vzA47C1rXchkbCZuVY7Z%0AqIXLVTkQNRG3WVrYndtNo9kL2nWi0ewD/oBBpM1kfa3+WA3DgJ5+N16vUVdRJ6OCHhERBoY8TI1n%0AS/z69aCA8ZvZmuMA8jkb0O6TvRJtcxEKmazHLLJZG0Mcd4k/UNmFsTR/Z2lM+Rqrry4X6Ox26TgO%0ATUPRQkOj2QdEhL4BN16vsLJcKKn6GQgK/QMexBQSccsJ5nQbBMMGhiEo5VQNrZW1Us1F4nIJIye8%0ApIp1E2zbiRtJ1YgLqFSdtBx3280ok7ZJJR0B6A+Y+PxyxzENpkt2dPuthGWpmqmu1XB7IF8j2UUp%0A53PqYF9NI9FCQ6O5A2xLkc8rxAC3W+joctPe6SKXU6DA7ZGSG3S0bDCn0NXjYm668uNnW4dZsz+J%0AiBAMmwSLgsSyFLeul++nshc2ghWPIkopEus2q8t50mmFArK+ALbpwZtOYdpZvD7HcuQ5oJRfq86q%0AopWoJTI20GEamkajhYZGswesgmJpIU9szdq8UHu8Qme3i0jUhXeXwaHRNhe2BQvz+R0d36PtJj19%0Auy8ZbprC8KiXqYkc+VzpRl1udlVcrL3TdWQbsSmlWJjLb7qvFvpHGD/zAMloBwBmPkf/xFVGL7/J%0A5K0so6d8mGbjj4V5QMfb69OheprGooWGRrNLLEsxfiu74+adyypmp/IUCtBRp3l8K+2dLiJRx4ef%0ALxbMikTNOyqa5fEaHD/luFRSSRuF0z3W5xduXKkvNqOtw6S79+heKpIJe1NkTJ64lxsX3l/ymG+5%0APUwdv5e1zn4efPlrxFYLdHQ1vleMaQqhsFEzCHe3onErkahxZAWkpnk4ulcPjaZBrCwWdoiMrSzO%0A5YlEzLr7XGxlNz78etnuUgHnKd7lgkINt0pnl4uuXuemalmKeFEEGSZEIncmgpqF1WXnIGR8AW6c%0Af8RZuD0WwzBIRNuZOnmewPjFAxEaAF29blLJnfVNNmjvMIntIgB5K16v0NPvuYPZaTT10fpXCY3m%0AAFFKsbZaO+ghttbcaYMiQltHdUEjAm1F0bO2UuDGlQzzs3lWlgoszRe4eS3L3Ezr12LIZJy7+Nzw%0A6R1uqxLEYHr0XMOLs23F6zUYPu7F5y8VPoYJPX1uuvvcdcVYuNxOgzcxwOMRevrcDJ/wHogLSKPR%0AFg2NZhfYVvmmqtvJVbF4NAvtnS6SCZt0qvwH6htw43IJ67EC87PlbfOxVQsR6G3hJ+MN40UqFIEa%0A9928z4/hO9jP6vUZjJzwkc3Y5HIKw3DSqTeCjH1+o+J3uEEk6qK792CsMBrNdrTQ0Gh2gdRpAzRb%0AwFZoGMLgiIe1lQKry4VNN0owZNDR5SIQNFFK1SzqtLZi0dml9uQqOmwsDHIDvcSTILaNKFBVPobY%0ANh3Rg5vfVrw+pxPsdto7XaRT1VNM2tqPbsaQpvnRQkOj2QWGUV+AXrhF2nIbxu2UXKWcp/uttSJy%0AWVU1HmWDRNyq6YppJhTwZts53mo7R9b0Ogtty6miVgGxbfoWJ4hGm0tFhsIG0XaT2Gr5WI2+Y+4j%0AEUujaV1a58qg0TQJnd1uEvHKGRsbWR2thIiULY9t2fW5gA4ybmE/eKnrfVyKnCwN+jTM29km2w+G%0AUoDi8ezlpmtEJiL09rsJBk1Wl/NkMgoEQiGD9k73nsvTazT7hRYaGs0u8fkNBkc8zEzlsLc9RAZD%0ABgPF1uu2rYivW6RTNiIQCJqEwq3VMdPjru8m1Upuk0VPO5eip8q/KbIpNsS2AYUyTFz5HB+Ze4We%0AfOzgJroLRIRw1CQc1S4STfOhhYZGsweCIZOTZ3wk4hbZjBOgFwqbm8WP0imLqYlSIbK2YuF2O3ER%0AHm9rPGW63ILXJzV7qNQqn95MXI4cR5SNqhJw486kGBi/im2aBNdX6Z4Zp73fgDKVXZuBdNpmdSlP%0AMmGjlBMs2t7pIhhqLWGrOZo051mj0bQAhiFEoi7YFhyYz9lMjuXKph3m84qJsSzHD6i65H5QJWxh%0Ak9iaRWd3a2Q1xF3BqiIDEfJeH8evvFm6XDWnOIytFXaUr08lbVLJHO0dJt19bi02NIdKc545Gk0L%0As7piVa1tYBXYVZfXw6aedN477ctxkPjsHKJqVNss0/bU14SxDvmcXbVHzuqKdUeN2TSa/aD5zhyN%0ApsWJx2oX64qvt47QcNcRf9FKMRqn4+PVLRq2Td/k9ZJF/oCBtwndXWsVMk22slH5VKM5LJrvzNFo%0AWpx6EjXsOrM5moFoe20Pa1sdY5qFwfQc/emF8lYN28ZVyDN4493NRS439A82X0GybNZmvY4KtLWK%0AeWk0jaZ1rg4aTYvg9dau1NhKHTODIYNAyCBVwQTv9QrRFioIpRCGk9MsetspbFg2ikVEIpl1Lrzx%0AIr5cCtMjRNtM2jpcTRFPo5QilbRJxB13SD31TWBnpq5Gc9BooaHR7DNtHWZNodFKxa1EhGNDHpbm%0A86ytlsafhKMGvf2ezXLYzY6N8HzvB7gVHNz2jgKE86mb3NefgX7/YUyvIvm8zdR4jlx295awYLh1%0ARK3maNI6VzuNpkUIR0wSEYv4enmx0dHlwu9vrYu/YTidPjt7FJm0k0Lp87dei/Gr4VFHZGx/zC9a%0ANn7Q+RAjyVmihcQhzK48ylZMjuXqtmBsp72zNbKBNEeX1rraaTQtgIjQP+ihp89dEkjp8Qr9x9x0%0A9bSuvjdNIRgyCYXNlhIZqlg87a3gKaq1aBUUlyInDm5idRBft/YsMnoHWk/Uao4erXvF02iaGBGh%0AvdNFW4eJZTlNQQ0TXc/gEIivW8zP5LAsiD0QrdoZT4nBsrftAGdXm7U7SIUOBFsndkZzdNFCQ6Np%0AICKC6y45ywoFRWLdwrIUbrcQipiHHruRTFhMT+aIdfSS9QcQ20YZVW6+SuHaXlf+ELEKinRy71kj%0A9dRA0WgazV1yCdRomhPbUmSzChEne0NaJKhyK0oplhcKLC+Vploas3l6+t1ED6lst1KKd61e3vvo%0AY2QDoa1vVE7FEGE0NX0wE6yDWB3pq5UQqa8GikbTaLTQ0GgOAdtSLC7kiW3J4jBNaO900dHlaikX%0Ay/LiTpEBztP03HQewxDCkYM34d/09POTh56qe7wom2AhzcnEZANntTsSd1DYLRw1myItV6PRQkOj%0AOWBsWzE5niWTLg3wsyxYWiiQyyn6BlqjP4VlKVbKiIycx8ty7xC26SKeWeNhtYZxgJ9HAT/sfdj5%0AY0eGye0OrSiFAMowCBVSfHLmRVyqeVwn1UrZV8PtFrp7dbaJpjnQQkOjOWBiq9YOkbGV9TWLaJvZ%0AEoF8iXhpXQ1bhBvnH2Vm9BzKMDbdFFezcZ5d/BF92eUDmde8t5OEN1x5QFF8tC3N0ikpThTmGEnO%0AYFbJSDkMfAGDTKa68BEDNoqcigHRNpPObndLZQVpjjZaaGg0B8zaam2/e2zVagmhYW37KFfvf4K5%0A4VO3rQjFf+OeIF8aeIa/MP08nblYw+eVcvnqGtc/fZMPBqcOPWi1EsGQydpKdaExMOghEDCwbcf9%0A1opxPpqjjU6w1mgOmHpqImSzrZEu4PbcvqklQ1HmRk6XD7QUA1tMXg6eP5B5BQqZusb1BHNNKzLy%0AeZu56VzVMW0dJsGQgWEKLndrBhNrjj5aaGg0B4xZh6Eim1Ek4s0TK1CJUMjY/DwLx45XDyoQYbZ9%0AkHim8TfD3uwykXy88nyUwpdPc8ZYavhc9srSQgGrxk+go7O1Aoc1dydaaGg0B0ykznTPmckc+Xxz%0AxQxsRwyhd8DpbJrxB+tYQZjIhWqPu0MEeGLpJ84f28VGMW7kyZWfYDRZTMYGtq2Ix2oLzfU7yErR%0AaA4KLTQ0mgOmvcNFtZpRGygFsTriOQ6bcMRkcMSD4ZK6WoWuuCL7un/LUqSSFqmkUyxsg5HULD89%0A931ChVTJ+ICV5qNzr3CqidJYt2NZqq6Mk8IeS5NrNAeJDgbVaA4Yl1sYPu5l7Hq25thUwoKe5k9T%0ADIZMzpjLzHKq5lhT7U/8iW0rFudLa5GIQLTdpLvXjWEIo6kZRiZmmPV1k3L58Rcy9GcWm9aSsYFZ%0AZ6yFqTNLNC2AFhoazSFQr1vdtpv7hriVkdRs9aqbAEpxLLcEdXhZqqGUYmo8Rzplb1sOaysW2Yxi%0AaNSDiCDAQGbxznZ4wBimEAobJOLVRVkk2vyZSRqNdp1oNIdAtkodja24Pa1zivrtLKdiNysHYNo2%0A3bPjDARrW3JqEV+3doiMraSDceaSAAAgAElEQVRTNvEWj1/o7HFX1WyRNhOPt3V+H5q7F/0r1WgO%0AgXotGoFQaz2xPrXyJt3JovVgo6NX0VUSWl/lmZXX9kU8ra3WFhH1jGlmfD6DwVEPrjL9Sto6TPoG%0Amt+lptFAC7lOROTXgL8AnAPSwCvAryqlrhzqxDSaPeAPGiWVsCsROYQeIXeCWxX4zPwLXF8f5N3g%0AcZLuIL5sihPLN7lgT+H1748rqJ4gyKMQKBkImJw4bZBK2uSyCsOAYNjUVT81LUXLCA3gaeB3gddw%0A5v1PgG+KyL1KqeShzqwB5MXkZmiIJU87BjYjyRn6M4voy8vRwDSFaHv1qo/RdrMlg/1MFGfTk5xN%0Ab8nqEGAfNZPpgny+9phmxbYVybhNPm9jmkIoXPm7FhGCIZNg47OCNZqG0MSnYilKqY9v/VtE/hqw%0AALwP+N6hTKpBTPl7+VbvE+QMNwY2CuFi2zm6Mit8Yu4lAlZ9VQ81zU1Pr5tCXpUN+HO5IJ2ymLiV%0AJRwxibTpTpxbiba5yKSrK43Dak9fi/VYgfmZ/KZnCQDJ09nlorNbF+DSHD1aOUYjWvx3pdIAEfGK%0ASGTjBVTpstQcLHuifK3/Q+QMN4hgi4kS52ta9rbx5f6nsbVd40gghjAw5GFo1EOkzSQQNPB6ne+2%0AUIBc1glqXJjLc+tapmXKkh8EkTazpPz5dtweIdLWfG6nRNxidmqbyABQsLxYYHmx+eumaDS7pTkl%0Afw3Ekfz/Avi+UuqdKkN/Dfj1g5nV/vBW21kU5QsfKTFY9bYxEehnNDWz7/vOiYtr4RGm/H0oEXoz%0AS5xbv4XfvvMsAU15RIRA0OnUuh4rMDtV/indsmBqPMuJ0767+olXKcflkMvZRKIG6zGL/LZ2IIGg%0AQf+gp+l6mCjl1P2oxvJSgfZOl7ZeVSDuCpA2fQQLaYJWuuwYG+FGaJh3o6dYdUdwqQKnEpNciF0l%0AvK1428b4q+FR3omeZtUTxVAWx5NTPLB2ZbMBYNZwcy00ypyvE0ExmJ7nZGISl2rtgOODQlQ95eea%0ADBH5XeCTwAeVUlNVxnkB75ZFYWDqm/d8jKDZfBHbCvi945/DMirrP1E2JxMTfGThR/u67wVvB1/t%0Af4qs4bm9L8BQNh+df2XXwkYB6+4QeXERLiTx2jUc6hrGbmTIZqqfjwODHsJ3ae0ExxqQ22kN2EIo%0AbDAw5GlKMZbN2IzdqC3ao+0mfQOemuPuJuZ8Xfyw437m/d2by46l5nh8+S26cmuby2yEb/U+wVho%0AEFH2pjVYlI2pbD418wK92eWd44PHnAXF340ox27803Pfx1A23+h7koK4kGKhNyUG/kKG52ZfLNn/%0AUSdp5fnYpW8CRJVS6/Wu13IWDRH5HeDTwFPVRAaAUioLbJ7ZzXjx2U41kQGgEAo1xuyWjOHhK/1P%0AkzdcJZYUBVgYfLPvSf7i5Ddoz9f3u7oeGuL19gvEPE6paUNZnIqPM5yaJekK4LYLDKdmCOpYk01s%0AS9UUGQDJpNWyQqNQUMRWC8TXnUqePp/Q1uHGH6jtwU0lLaYnSk0XCii4PRi2jVnsV5+I28zP5pvy%0ARr21PHo1YqsWwZBFuMUyjhrFlL+Hr/Y/vaOW67S/lz8d/BijiSkeWXuXzlyMn7Sd2xQNGyJj4/8t%0A4Ot9H+QXx7+EiaNW342ecsZvuzcoMVBK8c3eJwDBEgNEHGtzkYzp4csDz/D5ia/is6t32b3baRmh%0AUXSX/A7ws8AzSqlbhzylfUeASD7OuitUsdCCoGjL1S0k6+JK+PhmTMjOHTo5mG9Hz/Doytu83XaG%0Ay+HjZEwvfivDufWb3Be7hs/OoYAXux7hSvRkSd6mLSZXw8e5GjmBKLXxTMDZ9Vt8aOmNzZP+bqZu%0Au2LrGSABJ9ZkajxbYo3IZRXrsSyd3S66apRZn5+9fSG3xWDq5L1MH7+HbLGRW3RplpFrb9OxOENs%0A1aKzW+EuU3/iMNnNfBbn84TCRks8HDUSBXyn5/Hy7uTi32OhQcZCg7Rn11j1tlW8dioxyLh83AoN%0AcioxgQJ+0nau8s5FsDZSpSq4srOGh6vhUe6PXd3Dp7t7aBmhgZPa+peBzwBxEekrLo8ppco761qQ%0A87Hr/KDzwYrvK4R71m/u6z7HgwNV31dicDN4jPFgP2nTt/mkkHIF+En7vVyOnOCR5be5Gj7OXKDH%0AWanCRUFtLheuRE4w4+/h2YVX6cyt4VbOU+myJ8o70dNMBvqxEfozi1yIXaM/07wtve8Uw3ACGPM1%0Aaj/U8/TfbNiW2iEytrK8WMDrMyo+wefzilzRLmmLwduPfYTV7tLfbKyjl4sf6Of0Wz/g2PgVEusW%0A7Z3NdXlzewwCQacmRi3yOcfC5fMfXaFhYTAV6CVp+glYGYZSczseOt5sO0fa5a++oeI1ZdXXXnOf%0AhrKZ93ZyKjHBmitM2hWoPdEaYu9W8JgWGjVorjOxOr9S/PeFbcv/GvAHBzqTBnI+dp2x4DHmfN1b%0Absps+hsfW3mLSGF/y4ZsmAWrkTWLoS5lTIwpV4Dv9T62+x2LEPeE+cLgRzDsAvfEb9GVXeF73Y9u%0AbhvgVnCQm6FhHlt+iwfXLu9+Py2AiNDe6WJhtnIsi2FAOGpi24pUwsayFR6Pgc8vTf3kux6zqsZV%0AAKwu5SsKjVzu9sozo2cdkbH98xrOb+Xa/Y/ROT+JZTWnKbunz83YzWxdlqlCoUXNV3VwLTTCK10P%0AkjF9m8u8VpbHl9/iXNwxVivgzWgVi8MeULAZZ3ElcvzONyhCQVrpNno4tMwRUko175V0HzGxeW72%0ARd5su4d3o6c2T8SO3BoPr17iRLJqWMqe6MmssOjtKPFp7qDBNzLbcPFe5CRqo/vn1liR4rx+1PkA%0APZnllmuQVS9t7SbplEU8tvOuLAIDQ25WV5wUyK0NUD1eoW/A07TWjnqe4NNphVKqrGDaumj6eI0b%0Aj4K54dMcT72322keCF6fQU+vi4W52mmszeb6KYcCEq4ACiFUSNXVFfd6cIjv9D6+oyxu1vDwYs/7%0AWfK24bYLJF1+ci5vha3scb5iMJieB2CihiUXqOu6t+YOczF6hvOxa5it6ttsMC0jNO4mXMrmkdV3%0AeXj1PVKmDxMbv9W4FNN716/zTvR0w7ZfL0qMqt0/Rdm8HT1dIjQUEHcFyRsuwvkknqL7Zd0VZN7X%0ABSj604uEKqTCNRMiQv8xD+GwzepKgWzWxhDHitHW4WJ1uVC2kmguq5gcyzJ83IvP35xi407wFhuH%0A2SKkQ9Hqg0VIRtsJmc0bSNnW4WJ5sYBVJTPS6xO8vub9LhVwKXKSN9vOEXc7JUv9hQwXYld5YO1y%0AxRuujfDDrgfLn+fFeLB3o2cwlL3vt2xRNpF8gqHULFC05O4DBcPFDzofZDLQx8dnX9JiowxaaDQx%0ABupAbpDt+ThPLr3By93vK0kJq9nyuxFU2Z8Sg1l/z+bfN4ODvN5xgVWPc/MxbYvjyQkypo8pf9+W%0AVDXF8cQkTy293vRptiJCOGruyCxJxK2q5cqVcgIIh0b39wlwP/AHjJqdVKu5f0xTCAQNkkkbsW2U%0AUeUGoRRBr8JINa81QETo7fcwM1XZvdPb33zp91t5pfNB3mk7W2KVSLt8vNZxHxOBfn5m5rtlb7hz%0Avi6S1eIiir8Be59EwCZK4S+keW72e5t5I92ZFeKuYGVLbr3Xv+KYKX8flyKnuLB+bX/mfIRoXsms%0AOVAurF/nUzPfZTA1h6GsYh558ylzKV7Y3omc4lt9T7Lqjmy+Zxkm10OjJSIDnADUW6FBvtL/NFYL%0A/uRtWzEzWTvmIJW0m9KvH2kzqaYNgJqBm739bgwDumbHqRrwYRicyU3vYZYHSzhqcmzIs6O6qdcn%0ADB334A80r0Vm3tvpiAwoa5WY93fzH4c/ycqWc3ODtHk4QthA8fnJr5XEt51fv77v7uJmsAw3I9qi%0AodnkWHqBY+kFwDGN/rvRz5QEax02omyG0nOkTC+vdD1UXFg+u2U7SgwWfZ3cDA1yOjHR4JnuL4li%0A3Yl6yKQtQuHmOq1NUzg27GFqPFf2c7R3umrWjPB4DUaOe8lMv8di/0jZp80N0/hIcv+r5jaCUMQk%0AGDbIZhRWQeFyN7e7ZIP3IidKLZ9lSLgCfPHYs3xu6psl1TiDhUNwYSrFycQE7m1VPPszSzy88i5v%0AdJzfUdyrlhu3LCLEPGH+aOg5vHaeU4lxzsZvNb0V9SBoriuSpmkQYCQ5w9XwaHXVXy8bd5haJ26l%0AcUqhEO5bu8rV8GhxhrtDlM2V8PGWExrpVP11RtIpm1ATdvQJBE2On/KytmIRj1soW+HzG7R1uAiG%0A6nt69/oM7vcl8E9/nxePPYGFWVKpsS0f57mZF+sKSGwWRORQU1jnvZ28HT3NTNEl2Zde4HRigsH0%0A/I4b8warnmjta4IIOcPNW23n+ODSG5uLe7PLRHJx1t2VawVVZePmX68IUAoDxQNrV8q+/ejqO3Rl%0AV7nYdpY5X5czx8wyw6lpXq1SZqDa/tY9YVCKRW87b7Wd49PT3ya6z5mCrYYWGkeUBW8H70ZOsejr%0AwLQtRlPT3LN+c1edX++PFW/qu1X228cXxUNbbp01b7SimBBlYyiF859R8oQBwlOLr9GdW+W96EkE%0AVVKlr65piUGyVk5+M7KrQ9+8sQluj0F3n0F3397iDxa8HbwXOcmSt53O7BpBK41LWbjtAiOpaYZS%0Ac7rd4C54O3qaV7oeLjlfb4VHuBUeAWVzNj7Goytv76jg67HzdV0TlBhcDY/y5NIbm9+LAB9c+jFf%0A638KpRRsFSw1AsEHU3MMpedIG15uhIadG/rWdeG2CCniUgU+Ov8DOquUCT+emuZ4anpTnm7MIGt4%0Aeav9nt1d/zbGFf9NmT7+dPBjfHb6eeLuEG9HzzDv60SUYjg1x32xK/RmK/YFPTJooXEE+XH7vbze%0AcV+JCXDZ28Zb0XN8cvaFun/YHbkYH5t7med7nyiNbah20ikbj10gZ94uAR0qJHly6SeMpGaY83Vx%0ANTTKRKCflDsAxZ4CSgz8VoafmnuFcCHFe5GTTAb6sMWgP73I+fXrtOXjgHOh28szqyibUJmmSlvJ%0AGm6uhI8zXXzC688scbbOxnJ5MckaHrx2ruLT4F4IBs2qgaBbqdbRtJV5rf1CqYm7eDPxW1k+NfNd%0AOuosj69xWPB2OCIDKlQENrgSHmUq0MfPTn2rRGycTEwy7e+taz95w42NlASGDqXneW72e7zc9RBr%0AnhpZREWUGHxg+a3NNgiPrr7DoreDlOkja7jJmF4UgoEi5g5ji0FXdoXT8fHNTLRabD8Kj61cpCMX%0A46XuR/ZeK0OEvOnhT4Z+GiVmiYvmZmiQG6Ehnll8lbPxsb1tv0VoyaZqe6XYKj7WrE3V9oOxwADf%0A6P9Q2fdE2bjtAr84/qXNKpz1kDa9XA6fYMbXzUygB5syBb6UwlQ2n5v8Bm2FOHO+LlKmj4CVoS+z%0AVPZJc8UTZSLQT0FMurKrDKdm6zJ7L3rb+S+DH6t7/lv56NzLnKxQi2TG183X+z9EfttFxVQWH5t7%0AmeH0XNn11txhXm8/z83QEEqMzcZ3j6y+SzSf2NM8t6KU4ta1LPl89WMjAifP+pq+86dtK9ZjFqmE%0A4xLyBQyibWbFeV8PDvHtvifKvifKJmBl+EvjX9ZphThp3ddDw2RML6FCitPx8bIi+Vs9j3MzNFzz%0ASV2UzanEBM9uaeKYF5P/PPRx4q5gzfW9VpZfGvvzsu8pYMnTTsrlw2vl+GHnAyz4OkvdMkVrwkOr%0A7/L+lWqNuhvDuivIH418qnE7UI5d9hcmvtIS7pW7pqmapjoX285WDNRSYpAz3FwLj3Dv+o0d7xfE%0AJG+48Fi5kou238ry0NolHuISy542vtL/FGmXv+jScLbrtXN8fPYl2guO1aGecuEduRgdxTbMu6E7%0Au8pwcobJQN/Oz1nFLdObWeJ4snxGQtL08bX+p8pWSbUw+UbfB/n5ya8TLZQKh2VPG1849iwFMTfn%0AosTgRmiYscAx7l2/jqlsovk4J5JTe7J0iAiDIx7Gb2Wxq6ze0+duepGRSTs9T7bWkIivWyzN5zk2%0A7Ckbr/Fm2zlQdqmZvYjjDgswFhzkZHKykVNvamyEl7se4r3IKZzWXwobgx92PsD7Vy7y4LYYhe2Z%0AWZXY+C0/ufTGZlCjW1n8zMx3+XL/M6Xui22IsrmnzHVm832gO7cKxYSqT86+yBvt9/Je5NSmRTSa%0AT/Dg2iXOxg+ntVWq0cHwIqBsLkVO8vjKxcbu6xDRQuMIYSPM+rprXkBea7/A6+3n8dh5TifG6U0v%0A8V70FGPBQZQILjvPufVbPLz63o6noc7cGn9l/MvcDA0y4+9BFXuRnExM4tpHd0EtPjr/Ct/teYxb%0AoaHNls62GHjsHJ25GHO+rs0bv6FszsRv8cTSTypaTN6LnMQSo3yQW7Fr47vRUzyx/GbJW9/tebRE%0AZGygxKBgCBfb7ykuULykHuVDi69xNjG+68/r8RqcPO1jZaXA6nKhRHB4PEJXj7vpu7paBaewWLns%0AVKVgeiLH6EkvHu/tY5m2TZZ9HVW3K8pm2t97VwuNH3Xez3uRU5u/1Y1fuUL4UeeDeK0898Rv90ja%0ATYC3LQYJVxDvljiHcCHF5ye/ytd7P+hU2Cwj7IOFNPdXCMIsh1tZPLbyNo+svEvcHcRQNuFC8lDj%0AbuqKabvDekNKjM1A1KOKFhpHjVo/eBEyphdESCsfr7efh3ZxgiuL6xYMN+9ET/Nu9BT3rN/godVL%0AJYXDTGxOJyYONXvDrSw+Nv8KqythxoLHKIiL9nyM44lpTGySpo9Fr3OD6s0s4a/Rxnk8eKzqxVeJ%0AwVjwWInQWPK0seytchPc+l2IYGHwQu/jeOw8x1O7T8E0TKGr201Xt5tCQZHPKQzTERrN3Otkg9ha%0AoazIKJgu0sEIhm2xspKgr/92fM/SYgHqKE3QxDGwDSdjeHgneqbyua8Ur3ec52z81qbQjuQTLBuV%0AO51ux10mRVOAj89/n5+03cNbbec2rRCiFCPJGT649OOa5105TOzNeKzDJlJI0pteYsFXuUWDKBtV%0Azp1cL8XMmKOMFhpHCANFT2ap/r4lIoATpb1jfPHJ6L3IKa6HRvj0zHfo3IObo9G05+O0l2m0FrQy%0ABHdxM6+nEuH2MauenQWJqlI87t/veh+jEzN39KTmcgkuV2vdXRPbqoPm3R5u3fMwc0OnsE3nUuRL%0AxXks4ZjKlaVILWfwJ2Kkg5HKNVIQejPLDZ9/szIRGKj++xUh5Qqw6O2gN+scpwdiV5x+I7VQio7c%0AGuEK8QMCPLx2iftjV1jwdmKJSUcuRrAFSv7Xy+Mrb/HFgQ9XtFw8tnKROV83Y6HBPe9jeA8PHq1E%0A81eH0eyK+9eu7L7uRTUlLkLecPHNviePtObuySxvxpyUQ5RNz7abmduuP6B2Kyl3gDV3Exa7aDD2%0Alh9QweXmJ09+gpnhM5siAyDjD/Fiz/v5cft5cnkFCoZuvFt5o8rGXchxssVqo+wnOcO1o0FZOfLG%0A7eN8KjFOWy5Wfb3ijfXRlXdqimKXshnILDKUnjtSIgOgL7PEp2Ze2BHY7bWyfHDxdR6IXeVj8y9z%0Aer1KHIlS5Y91MUD/XLV1jwDaonHEOJGc4v61y1xsO1ezel+9KDFYd4eZ8vcyVOx8eNQ4H7vOlciJ%0Aiu8rMbgQK+1hcCy9gMsuUDB2fxplDU/tQUcMn98gm3GsGpMnz5MKR3cGeBZF7487LjC6fAvI0j9+%0AlVh7D/PDp5zy4xv1zG0bw7Z48uoLuH0HFx90UKy5Qyx52ymIScwdYiw4RM5w0Z5b5971GxxPTiHg%0AuBnqMNtHt7gjBPjM9Hf4cv8zLPvaSwthFTGVzQcXf8zoEX/aroeBzCK/MPlV5r2dxN0hvHaWY6kF%0ATJyHEwE+vPgqQSvDm23nigG5TmaNQhhKzTAV6L9tPS4eZ7dt8dzsi/j24GJqJbTQOGII8IHltxhK%0AzfJu5DSLvg5EKRLu4J1tV9ks+Do3hcayJ7qZS9+XWaKnxYvOdOdWeXzpTX7Y9WDZcsQPr7yzoz29%0AWxV4YO0yP24/v+uCZpVM0ZtDgBlfD2ueCG67wHBqpuUvRm0dLmKrlvPZRs6WzSLZQJTNjc6TdHtW%0AyOcU5978Pl1zE0wfP0cy0oFhFeiZGWPg1mVGB/IcJeNs3BXghe73MxPYUqtii9k+bfqYDvRxPDHJ%0AR+d/wLH0PKF8koQrUPZ3KMrmWHq+pBQ4gM/O8bnpbzLj7+FmcIiky09BTCL5OJ25GKcSE7p89hYE%0A6Msu05ct76YTHDfK+dg1roVHSbr8BAppTifGCRdSJEw/70VPMu/twkAxmJrjbPxWy5/X9aCFxhFl%0AML3AYLFviY3whyM/Q9r03VF0tKEUKdPL8z1PMBvo2cwBVyJ0Z5b5qflXdlzMWokHYlfozK1xMXrW%0AKdgl0Jde4v7YFUaKraW3877Vd8kZbt6OnilWKwWQqoF5wUJqR7XFrcx5O/lO7+NO++3iDcZQNhdi%0AV3ls+WLLBo75fAbdvS7mFhV5X/UKrQpY94Q41+1ibjrvpELOTdA9V+oiCYYMvL7m61i7V9Kmlz8/%0A9hHnXN1KSZNAR1TdCg5yse0sD65d5sMLP+IrA0+jlJRYMUXZeOx8SRnwks1S2uNIc+eErDQPrV0q%0Au/wwaoE0A1po3AUYKO6PXeFHHQ/seRtKDPrTC3xp4MPENuIL5HYa3ZK3nS8MPMtfnPpGSz8FDabn%0AGdyFe0iAJ5bf5ELsGtdDI8Rdfq6FRrAMV9miZgAfWny94vaWPW18eeDD2NtKGdticDF6lpy4eHrp%0Ax7v6TM1ER5cbt9fCsC1so3I6rgBeK0+0zUUhr1ha2BkP4w8Y9A8eLRfUxegZ0qavbpfnxegZ7l+7%0AwkBmkc9OfZvXOi4wGegHkc3CcY+uvFPStVSzN5Y9USYD/Vhi0J1ddTpdt6joP2i00LhLeGDtCq+3%0AX8DaQyndjWJXa54Ia+7y0f8bhZMuRU7yYJkskKNOpJDk4bX3AHggdpUvDDxLxrXlqVQ53tqnFl5n%0ApEKFUYDX2s9ji1Ss53E5eoq2fJwHYlfveM7ZjE0+rzBNp7HXQaXIhsMmpxITXAuPVLyhKjE2Azw7%0Au91EoiaxNYtcTmEaTpt1f8BoibTe3XA5fKL+uCoR0i4/cVeAaCFJd26V5+ZeImN4yBoe/Fam7vLb%0AmspkDA/P936A6UBfSZHCUD7Jx+Zfpju7esgzbH600LhLcBJZ96a+PXYen5XhRx331xx7NTx6VwqN%0ArbTl4/zi+BcZCx7jZnCIgmHSm17iwvr1qhf+nLgYDx6r0UtG8cOuh1BibB7njOFBieCzsnWlzKZT%0ANvOzObKZ278Ht1vo7j24ol8Prl3iRmgImzLFo5Qikk/QsaVAlNtj0NVzdOIwyqHAqXGzS7Z/5z47%0Ad1f4/e8UG2EsOMCMvxeF0JdZ5ERiajPAc2PMV/ufYsnbDpT+VpMuP18a+DA/N/kNbTGqgRYadxGR%0AfJIVT3TXgYtZ08t4cNCJo66RCpu5C7MpymGiOJmcqthXpRxZ01NXwTWAVzvux2XnuRw5yXLxIhjK%0AJ7kvdpULsWsVTbrptM3kWHZHpl0+r5iZytGn3ETbGn9ZaM/H+dTsi3yr5wPF5nqlNQrW3SH+cOTT%0APL34Gmf2UEm1FRGccv9pV51lr5UiaKVrNgrU7GTVHeYr/U+TdAc3rRTvRU/xSmeGT8y9tBncPhHo%0AZ9HXWXYbSgwKOG0fKsXAaByO9iOCpoTz69f3vK4q0wNkO6JsrezvAJ+VxaizjLsCXu5+hOUt3S8T%0ArgA/6HyQb/U+gV3BtrEwm6taOmFhNo9tH4zfuTe9yBMv/An++FppjQFxBK0tBt/teYypYifdu4Gz%0A8Zt11cTY4IG1yzpOYJdkDTd/fuwjJF0BwLm2bVgqMqaHLw88Q8J0gpVvFFscVEKJwbXQSOMn3eJo%0Ai8ZdxNn1W1wLjTBfoUNiWXZh/VBiVG2ipKmOW1mcik9wNTxSNfUT2FLd1dixbCw0yDd5gmVvO1nT%0AQzif5N716xxfukEmXf2mZNswOZalq8dNINjYGIhE3GbJ30063FZ+QLGuw9f7PsS96zc4H7t2YB0u%0Ac1mb1ZUC8XULFHh9Bu2dLoKhxh6T+9euciV8nLSrSlZO8Xw9G7+1o7aLpjavtt9HzqhgPRSDPI51%0A4/0rb5M1PDVjZvLG0ewEvp9oi8ZdhInNc7Mvcl/satneBTvYxZOVKEV/eoFT8bvDzN0oHll9x8na%0AqXXsa1R0HA8eI+EOkjfcrHiifL/rffznU5/m2oX3s9bRU/UZOJNWTI3nmJ7INdS6sb5WYKl/GCnX%0AAGUDESzDxTvR0/ynoU8w4e9r2Hw2SMYtbt3IsrZiYRXAsiCVtJmeyLEwl0ft4rzYLX47y89OP08w%0AX0FQKYWpLD4y9wpPL752qA3HWpWrkdHqA8TgemgYcLrHVrNooBQhbcWtiRYadxluZfGB5bf4r8a+%0AwOcmv8HPTX6dk0UfeMkJtYuOhC67wIXYVZ6b/V5Je3nN7gkXUvzs1PP4rUx1MVEjVmZ7QzdEyLh8%0ATB+/hzc/+Bw/efIT5N3V42mSCZul+calKlsFhWW6oI7fjBIDWwy+2fckaaNxdTOsgmJ6MldxSmsr%0AlmPlaCDhQoq/MvFl7l+9hLm1zL1SDKdm+fzEVzmVnNQiYw+suiMUDHfNa1u2aKU4F79Z06JxPrZ3%0Al/Tdgnad3KW4lUVXMar/Iws/YiQ1yzvR0yx72jCVTaiQYtUTqXySKZv2XJynFl+jMxfDrdPo9o1o%0AIcFzs9/jzwZ/yukPUqEex66Lr20Ntmzv5u33f4SHXv5a1RvW2qpFZ4+TArvfuD0GwfjqrtI5LUwu%0AR47zUIMym2JrhZrGpNXlApFoYy+dAnxg5SLvX3mHeV8nBTFpz6+3dEG8g0YBBTExlb0Zx5KsJ9BW%0AKfxWFoDOXGyzpcP2h0ukd98AACAASURBVC9RNp3ZNe69g9i3uwUtNDQI7Gj7vu4K8kfDn6yyksFD%0Aa5cqluPV3BlduTWem32R53s+QMblw1C20zdBDDqzayx7K8Q11IthsN7Zy6sf/iwj19+md/Jm2fRn%0ApSCTsgmG9z/tNdph0jt1k5v3PuIU76pTOM36unmIxgiNdLqKmbxIJq1QSh1IDQ8Te0fpe81t8mKS%0AMn147PxmS/qcuLjYdpb3IidJu/wYyuJEYpKH1i4TKFSuyLuJCCPJ2/1dHl9+i3A+yZvt92wGkLrs%0AAufWb/Loytu46wzgvpvRQkNTlkghyQeX3uD73e8rbc5WfNw7lRjn1F2SdnhYHEsv8IvjX2Q8eIwV%0ATxSXshhJThMqpPjjoU+QcvnL1qDYjaUjHYpy+aEPsdQ7xPnXXywrNuZmc8is4PYInd0uAsH9ER1+%0Av4FPZTj75stcevip0oZpVWjk7V20Q6IlSJo+Xu+4wNXQ6GaF2YHUPA+sXeaHnQ+wtsUaa4vJjdAw%0At4JDfGL2RTqzqyx72iqeJ4ayeWT1dqlwAS6sX+fe9RusucPYYhDNJ7QVdxdooaGpyPn160Tz67zV%0Ado4pfx+I0J6LcX/sKmfjt+74kpwXk5zhwWPn9FNBBUwUJ5JTnNhWj+NnZr7L1/qfJuYJYxRja+w6%0AUpB3UBy/1D/C9OhZBsd2WgoKeQBFPq9IJXP4A8LgiBfDuLNfQD6vsArQO30LTybNxOn7WO05VnO9%0AgQb25QgEjc0YDAWs9BxjevQciWgHpmXRPTPGyYWriOjf62GRNH382eBPkdpWqn3W383MRir0tvNA%0AiYGNzbd7n+DD8z/gawNPO89MW8cVRfoTS2+UvR4ZKDry6434SEceLTQ0VdlozmYXn3X3I9gz5g7x%0Aevt5boaGscXAKPZkeN/Ku0QLCcC5yC96O5gI9KMQurMrDKdmdc2AItFCkp+f/BqTgT4mi8eoJ7vM%0AldAoc/7u+uMetjB18l6OjV2uKSDTKcXkWJbh4947ch9srUzavjxH+/IcSz2DvPP4R8uvoGzcyuJs%0A/Nae91myOaU2jSgbnyPSZrK4kMey4Np9jzNz/FyJpWXi1AVmTt5DZPZF7TY8JH7Y+cAOkQHcbr9e%0A4TepxCDt8pE3PTw3+z1e6n4f6xt9m3Dq2Dy2cpFz/z977x0kx5Un6H0vs7xr770DuuE9YQjaoZ0Z%0AupnZ8Tu7O7eru5VCurjQhbQX0unuD0kRd6vTRuhipVVIG9qd3eFyHDkcDi1IgCQIkIRHo9Fwjfbe%0Al3eZT39UdaELXa4b3SDQqC8Cga7Mly9fZWXm+72fXaX7K88t8oJGnpxYrQl+2lTAb6ufJKqoi1Sb%0AsXCyfls1L458hEUL8n7lw4xbShEylnpKFwr2iI9n8rUFEihIGvyjSZVl632jvFX9KDPmouWZUYQg%0AaHehqQYMWnaVcDAgGRuJUFltXLGwkcpKUjoxRHPXKW5u3ovQdWS8kZA6itR5dvTTO06vrWmSmako%0Ac7NR9PjC1elSKC4zYrEo1DWY+SJaFxMybh+ooqBJeLfqMD/s/11eE3eXCSnGWOhpOkE6y72oSJ1p%0AUyF7Zy/xvYG3GbeU4jHYsGghqgMT+ai5RViOvpL4+1/9ZSysPBryQ/f7y+4rL2jkuat8XLY3SchY%0AQAqFiGLgWNleokJlzuRKbF949P3x2gLfGXw3732fBqse4pWhI/Q6auLajXKiIndHy+UIlO45DUWB%0A8gojYgVmFKtNQVFiCoPF1Pd0UTQ1ynBjO+7icixGSaN/hE3uHuxaYNnnWYwWlfT3hoiEk7+nx63j%0A9YSobTBhs6uM125JK6hJoRBSTPQ46vOr37uIjuBY2d7syewyIAE1LhwKoDI4xdpnZrl32PFclOeV%0A/zq3xn+5eufNCxp57hrTpsK0dQMg9gLPtj8CdBZs4OD0+TUY4fpARafVO0ird5CIMHCuqINOVxtR%0ANX0Gw1iF3mk62k3cvB4gkqPSYG5GwzOvUV1nWraTqKIIikoMTE8u1aA452dov3CCwmKViqrVq58z%0APhJeImQsICWMDIapb3cwmyWqRyAZs5TmBY27yPnCdvrstdkbZjGfNPhHUu67Hznwt7cKXT7+64e/%0AwpFkJi9o5LlrzMa1FFmRegbVqMI1Z0NWQUMC/bZqugpamTEVYpBRmr2DbJ6/geMOV8X3E0YZZd9M%0AJ7tmunit/nl8qSJViL2At8dzU1htCpFw9jDPBTQNhvrDNLaYMZmXt9osKTMQjUrmZ5eaIJwFCuWV%0Aq5fe2e/T8Hgyfy9NA583bw6514gKhQuF7blp5tK0EVKn1j9OSXh+lUe3+qQyW6Tk13dhMKtAXtDI%0Ac9cw6DmGg2VRjYayVIiVwLGyvVxzNSeF5l4obKeroI1vjBxLVGd8UDCg843RY/yu6rF4LgAJQold%0AHwT7py/QGF/pFZcYcc+FltW/lDAzHaWyennaByEEldUmiop13HMakajEYABXgQGLdfUSF0sZq06b%0AC5o/QklohhlTYVqnWimUNY1+uV+JCBUBGFbZd2XSXExYzeHekjIWvmouSgrVlkKhMjjFkxMnV3Vc%0Ay+GrMlvcC+QFjTx3jZrARHJOjhUj8KrWtJqJblcL15xNAEnnWijr/E7lYX448DsMmWoYrEMKIl6+%0AO/gOPY56+uw1RIRKaXieDncPhRFPol2sgJjK7PTyJgvPvEZl9crGZrYolFWuXUUEv08nBx9XIOb7%0AuWPuKh9WHEi5X0gdixaixTu4iiO8f5HAVWcTFws3MhuvJlwenGb73JUlYdkrRc/xnVEamuGl4Y/w%0AGaxcdTYxb3Rg0iO0eAepDk6sapaU+8VscS+QFzTy3DWMMkpJaI4pc9Hy8z0sRgjGrGW0LspkuoAE%0ALhZsTHuoFApBg4Wb9jo2ePsZNxfT7Wph1uTCpEVo8Q3S6h1Y9RXZvYJRarR7erP6FpRXmjAaI0yM%0A5Z6UKFNttFyRUhIMSNzzUaJRidEgcBUZsFiWJ4RIKfF6dAI+DUnMJJIrDqdKkXeAaVMB54s23RKO%0A48nqTHokXtfnwRJUUyGBT8r2cMXVklSbZ9JcxAeVh9g9c4k9s113fJ7i0HxOi5RDU+dQ0XFFfexd%0AlHRrOaw3s8W9QF7QyHNX2TJ/jWMV+9M3yDEkM11sREgxMW9yptkbQ0idMUspU+YiOgs3LppIdIbs%0AVZwr6uCbw0cfKF+OVBSVGLHaVAb7QjkJEUbTrd8tFNSJRmM1UswWkVMIrK5LRofDeN3JJ5ud0Sgo%0AVKnIMZTWPR9lbDiynOLDCaw2kfAzeWimkwbfCF0FrUybizDoGs2+QTa6bybSXT/o9NuqY0IGJD23%0ACwLBmeItNPhH7jgk3arHNEg9jrqUwoaQOkVhNxUZcpv8m6//eW4nW2dmi3uBvKCR567S4hvki+gO%0AAqoptS+GEJmdQQGkpDI4lXJXqhTaS9vEHFPH4lkEEy+u+P8eg513qw7zraH3H/iE1BarQlObhZmp%0ASFZTSmGxAb9PY2IskpSMy2QSlFUacWSplzIxFlkiZCwwP6dhMApKyzM7h46PhpmbWaE2SkBNXbIf%0AQGVomsqJfGIuiAn3Q9YKbjgaCKomnFE/k6aijM+rkDpdrlYemzx1x+c/OHWWSXMRbqMDKQQLyegl%0AoBlUOpsbOLc9R2Eiz10lL2jkuasYpM5zo5/wVvVjRBRDYpJf0CpsmbtGQDVzM8PKpd43mjaPhkmP%0AUByaY8ZUkFYzoguFOaMzY56EaXMRo5ayfEErwGAQlFeaUJRIylBUAKtVYDYLBvturfRDZiuewhKE%0AlPhHJqiv0nC6Ugsb6SJPFjMzHaW41JA29fn0ZGTlQgZQVm5ANaydn8j9TFgYeLfqMKPW8sSzmosp%0AQwolZirNkWxmC6HpOGeDOOdCqFEdXRH4Csy4iy1oxtUv/JdndcgLGnnuOmXhWb47+DZXnC30OOqI%0ACpWS8Byb3TeoDkwQVozMmVyxwkcQ13LEVsiFYQ+PTn6Ztm8BbJ+7wtE05pkFR76AwZpxjELqDNkq%0A84LGIkrLjRhNgpnJKOF4LgpFiWkyiktVBnrj1TNNZq5v3c9kdUNipatoUfoHrvK01oVBLNU6+X3Z%0ABQSpQ8CvY3csnVCiEcnUxMqLXBUVqxSVrJ/XoYZCr6OWXnsNUaFSHJ6nw30TV9S3ov6Ole9jzFIK%0A3NIA5uTULSUGPbpqZgupKrhLbbhLbbn1l+eeYP08WXnuK2xaiF1zl9k1d3nJPrMe4aXhD7nuaOCK%0AqxmvwYY9GqDdc5M2T1/WtM9t3n6mzYVcLGxf4shn1sM8OvEl71Y/mrEPAcgH3nCylIJCA64ClWhE%0AIiUYjQKhCIJBnXBIElUNnD/0HH67K0mdrqsGBhs38Z67gOenPltyZbVobg4V6QKF5mZzFzIUFex2%0AFU2TmEyCgqLVDaX9qvEYbLxV/RhuozMRvjxoq+J8YQcHp8+xdf76svqbN9jpddStaCxSCLobGlZ0%0AbJ71Q17QyHNPYpAaHZ6bdHhuLvtYARyYvkCTb5guVwvTpkKMMkqzd4iNnl6MegSLFiSoWtL2oQuF%0A8mButvmwMDBgryKkmHFGvdT6x9d18TchRJLjJ8Q0CgAjjRvxO9KYrYRgqKCWYV8FtYHxpF2RSG7X%0Ay2xJLfwF/LlHgFitCtV1q5dt9F5CR/B21SN4DHZgkfYhLtqdKN2FK+JNqo+zQDqzhWM2SPG4b0Vi%0At66Ar8C8giPzrCfygkaedUtlcCqt0+jm+RucKdqcckIUUsemBbOmKpbA6aLNnCvsQCpqwufDpIV5%0AbOILmtZRquNsqGrsOo42bMjYTkidK86mJYKG35ddUFAUMJoUZo1ObjrqCCtGCiJeWrwDQO4JxoqK%0A1+9rb9BWyVw8l0UqJPBG8xOMN6Rok8ZsIVYSvhNnrtSGrq4fbVGelbF+n7g8eTKwc7abcUsJQ7aq%0AJK95IXWMepRnRo9n1UqcLN5OZ1H7rQ1xoSWsmni/8mGeHf2UhsDSlWM2okIhIoyY9PB9U03SYhUY%0AjBCy2DKGJ0uh4DXal2zPxXQijSpHyvfT42yIV/WV6CicKNnBTu1LHJevZe3D4VKwOe7fiS9bkqji%0AMS+OuVBa7YMALIEoQpfIHAvhhS2GFRsRQ7bVSyGf5/4lL2jkeSBR0Xlu9FOuOxvocrUxZ3RgklFa%0APf1smb+eNYdGUDHSWZg+MRjAx+V7+cP+N3Me07SpgLNFm+i11yKFgkGP0O7uZefcZWza8lKC322E%0AEJRXmDCFggRVQ8Z6E7Zo8rXVdYnBIIhmETaubjvIqKMeSK7qq6FyuvUgW6f9lIynz0RpdypU15pW%0AXNZ+LVm1JFE5yqVCypx9kEJWA2GTgjGs5yxwSCBiUomY85EgefKCRp4HGAXJRk8fGz19yz72QkGW%0AAk9CEDBYmTIVUJpDEadRSym/r3oMXYiEXT2qGOkqaKXXXsPLw0ewa0Eg9hIfN5cQUC3YtQBloZl7%0Awm3VWaDSNneTTttWSDMiKRQ2xK+3pslYSOqsltbJcwG/3clIVUvqnUIgpM7w1p2UTgylTNRVXKpS%0AVrF2fhkaCkO2CoKqGWfER1VwEsHdTxIVthhgPr1QGss5oaDnqM0AQAimqp1UDLhR9FviiWTBaTr5%0A1164/LMVmbVbeR4c8oJGnjwrYMZcmFMW00lzSVZBQ0fwYfl+NCGWJD6SQsFvsHKyZCdfmzhJr72G%0AEyU78BodiTYFYTcPT51d4vcAsZf+dUcjnQVtTJsLUaSkwT/M9rmra1JYblf4Jr3R1pRVYoXUqQxO%0AUe8fRdMkAzdDiTDZbMw3NGbM2yCFwoythLKOYrRJN16PBjJWibaw2IB5GSnMdUSS2SwiVOaMTsx/%0AvB1NFxQ4ovyP3VuRaizsumjch2M+hLLoq0SMCjOVS01Ea43PZaJowhermZemjbvIsmwBIGIxMNpU%0AgGsmiH0+hKJLNINCyGLA4g+jLhIUo0aFmQo7Qfv6dLjNs3zygkaePCvApIdzellbc0hjPmSrwJfC%0Ab2EBKRRuOmrp9jfxSfneJfvnjQ7ernqE50c/SRI2JPBR+UPccDYm/FA0Ab32WnrtdTwxcZLWDIXB%0AdAQDtirmjU6MMkqDbzihVdERDFkr8BrtmLUQ9f5RjFLDood5cfhDjpY/xIitYtGXkDR7B3lk4hRo%0AOlMTkSQhQxcKYbMFVdMASdRgwhQKoOqxUOYwhrhgl/laXizbTJVzgorgNB6jA7dqRo/6qQxOpT3U%0AcvQVJgfgo5+pjPYqiVV60KqiGVVs7jAKwJFbq/VaMUPAYcLqDScJGAsYIjrlgx7G61yE7HfPT0Gq%0ACpM1TsqHPEmahoUhBuxGPMXpo60yoRlVZivszFbYk4VsKbH4IyhRiWZUCFnTm87yPJgsS9AQQmwH%0AvgnMAL+QUk4t2ucC/kpK+SerO8Q8ee49Ns/fiE3gGRBST6lluJ0ZU0HWLItSKHxRuj3e8W0vcaEg%0Apc5npTv5g8F3E5PLVWcTNxwNiTaL+0JKjpY/RHVgEltceFjMkLWCj8ofImCwJnIxHC/dRYe7hxr/%0AGMfL9sSSnsUnHIMeYc9MF9vmr+LQAjzZ8yHnTU1cr9tC0OYEIei11RBQAzReP4cpHBMgogYj/Ru2%0AMdKwEc142wpYStRIiNreK5i8vuwJoqTkSkELVwqWmlgiC6tsx9JVtuXfhSkfilWvXbh2MadJDQJa%0AkoCS2C/B7klf72RBWCma8DHWVJh53KtM0GFitLEA10wAmyeMkDF/CU+RBW+heXWEgMV9CJHXXuTJ%0ASM76RCHE08CXwPeA/w7oFkI8vqiJFfjJ6g4v5Tj+XAjRK4QICiHOCCEOr/U58+S5ncrQNK6wJ30D%0AKWl338ypFL1R13JyzAupGSYJoTBnKmDKdCvd86WCtvSdCYFE4YqzacmucXMxb1c9QkCN5T+QQom1%0AFwqXXa18UPkwgYUcJPHxRBUjn5fu4ELBRibHI3wZradz4wGC1luaGl01MFK/gXMPf52I0UxUNXDu%0A0HMMNm9eKmTE+9ZMFvo37uDG1n0ILUrGSmkZJlBDRKd8yIPFd5twICVlw8lCRqK7FNuWgwDMIQ1D%0A6O5XAo5YDExXOxncWMLAxmJGmwvxrsBkkifParCcOK9/B/yllHIL0Aj8B+BNIcSzazCulAghvgv8%0AFfA/AzuBT4F3hBD1d2sMefIs8MLIR7EIihSTX3VgnENTZ3Pqp8E3nLmBlJiiuUWd3JgwcO1ygBtX%0AA7EU7plCTYFJc/GS7aeLt8T+SFf0buFfCk4VbWHEa+batgNxbcdtfSgKAZuDvo3bGWjbis9VGEuQ%0AkQWpqEhD3ASxgnr0C6MtGvcn/V72uG/FWk6/ajQ2XqHr1F27zuHf/Z5H33iTDefOo0Yia3jmOHnh%0AIs9XzHJMJ5uBHwNIKSXwH4UQQ8CvhBDfJ6btWGv+FfD/Sin/n/jnfymEeAb4F8Bf3IXz58mTwK4F%0A+d7A77nhqOeyq5WgaqYg4mHb/DXq/KM5T14OLcAGTx/XnY3xqpS3IQRt3n66CjMnwwJQ/QGkhGg0%0AHsKYaZKREqEnr7aDiimWW2SF6IrKzY6dSEVJP8EpCqP1bQg9S5XexSzqyzE/g7eodNljE4AprGEM%0AaUQssVef1bv2E71mVHDOzPLcz1/F6r/ls9N47Tr7PjrGRy+9wEhL85qPI0+er4rlaDRCQJKxUUr5%0AKvBT4J+Al1dxXEsQQpiA3cD7t+16HziY5hizEMK18A9wruUY8zx4GKVGh6eXbw1/wA8H3uIbox9T%0AvwwhY4Ht1z+ndLQPiK18ha7HVu5Ssmf6IgemL2DWQulNB1Ji8blxzcaKwAmgeHwo8+pfUZbknQgp%0Ad+i4KCVBW6zGRiZ0gxHNtJLU1JKi6TEOvvdPCG1lJokFDQOAXMPFvgSCFhXQ+Mbf/0OSkLGAoml8%0A7devUzie2ZfHEA7jmp7B4l1ZUbQ8eb5KlqPROA88DpxZvFFK+ZoQQgH+bjUHloJSQAVufyLHgXQZ%0Abv4C+J/WclB58mQjGpHMzUbxezV0KTGbVZwuBbtTRQiBez7K5HCEzcMf43F1MlHbRMRoxuL3Ujl4%0Ag1pXGLXMyP7pC3xcvm9pWG1c+GjtOpUk4NT1XGK6si51GK6uYwoFME6O8NobP+DCm7E1hNAldddn%0ASFFgNTcUBWM4SE7GiBzCg5cgFLyuYkyhIJaAl4Ddtew+tEWl4H0FZhwZnDozkmH8C5dvrtxOx5kz%0AGMOpz7HgNHrwvSO8/Yc/XLLf6vGy8/hxmi9fiUfkwFhtDRcOHWSsIW8xznN/sBxB4/8EHkm1Q0r5%0Aajzb3p+txqCycPsrUKTYtsD/CvynRZ+dQPrUgXnyrDI+r8bwQDhJEREKarjnNRQlQnGpgdmZW5VH%0Ane4ZnJeT81tMh2L1Odo9vQB8XrI95hgaxxQK0Nb5BaVjyaGqhTMTtJ8/zpXth5InRSEwhQJsP/k+%0AhkAgIWQASEXgc5qwu8PpRYV0E6yUqNEwddc7ma7KULFz4fiV+A5IiaLFrld1/zV6Nu3J/VAgYk7O%0AVhm0G4mqAlVbZq3ehe+Q5lpEDQrT1Q5CNiNtFzszdiWA0rGxJX1ZPV6+/rN/xOrzoSy6gcqHR3j6%0AF7/i2IvfZGBDBoffLAhNo+5GDyXjE2iqylBLMzOVFdkPzJNnmeQsaEgpXwdeF0J8TUp5JMX+V+Pm%0AibViCtBYqr0oZ6mWY2FMIRZVW7oXUw/nuf8IBjQ8bh2QOF0qFmvqNMuRiFwiZCxG12FqInt5cymh%0A6oe1/NTzYmKD1RdBieoUT4yx/4PfJE1Ei6kc7KFwcpTRhg14CkpQdI2S8SHKh3tRdA1vwdLiWnNl%0Atlj/t02+C3kZhJRIKZOdOOOTZNOVsxTOTVEyNsh0eU1qR887fA5LxwYAqOq7ymhdK35nZqfX2Nhj%0Ao58tty8JzRxrcFHdO4+QKbJdLtTBuU0IcMxPUzw+zHBzO5rxltAXNQjmS2xJYaTGUAahbWEYgCES%0AIWq6FX2z++NPlggZAIqMfZtD77zLcFMjmnEZ5i4pqb9+g22fnaR4cjLxXaUQ7PzsBKP1dXz84jcJ%0AWa2595knTxZWkrDr90KI/wz8hZQyDCCEKAP+FjgE/M0qji+BlDIshDgDPAW8vmjXU8Bv1+KcefIs%0AJhzWGeoLJ5U0n5nSMBigrsmMyZQ8qc7PRjNGY+aKBP7DJw2xOCuIpTeP54OImCtiDp8ZTmQJ+mm6%0Aen5pv0Jwdce2Jds1o8poQwHFEz6s3khikowaFcJmnf0ffEBf+y48RWWJY8wBL82Xz3DxwE5mywvY%0AdPpjLu86HNNsZFn954yuYw4FKB3tR1MUDFqUjrPHuL5lH+6SqluOpSnOEzWqzFTaCaZInqWZDAy1%0AFeOa9uOYDyN0HV1V8DsVnnn1Z8yV1uB3FqKpCg73LAUzE9h8sZDYqzs3MF/qQo3qRI0qYYu65NwB%0Aux1zMJhR2IilBr/1OjYGgzRduZpWgBSAKRSm4dp1bm7elPXSxU4i2fvRMTadOZuUzGtBeASoGBjk%0Aa7/8NW//6Acxh948eVaBlQgajwA/A74mhPgBsVDXvwUuA9tXb2gp+U/Az4QQp4GTxEw19cD/tcbn%0AzfOAo2mSvp5Qypoc0Sj03QjRvMHMv33xv0psf/7v/4Gy1Mq2ZSEgpeYBIGy1cm37NtrPX1hWOW9d%0ACNzFxVzdsSPlfs2kMlkbm0ANYQ1dETGTgxB88sIz7PrkOBvPf0bIascYDuFzmDn76MNM1NUy0tJM%0AxGCgpvcmPmcRQUdc0blSISMuOESNKppR49qObQgpmS0tZefx4+w4eQTNYGKuuBxPUSmGSBir103A%0AZuXyvn3MlRVnzVYpFcF8mZ35suQMrcdefpEnf/0bykd6E5O+LgQS+OKpJ5mor806/Mt7dnPovdt9%0A2JOZqK5Omtgdbg9KljBeTVFwzcxmPf8CdTd62HQmFnKd7kooQOnYOFs+/4LOgwdy7jtPnkwsW9CQ%0AUn4hhNhJbHI/Q+ze/B+A/xgPe10z4o6nJcC/BaqAS8DzUsr+tTxvngeTxSW5/9v/MsIWPX1eDCnh%0ACMl+CYqe++Nwe2GqxdsDdjsjjel9Hk4//igOt5u6npvoxB7IdP0B6IpCb/tGvnzycaLmzBkdNYOS%0A5DwJ4C4p4djLL2L2+7F5vIRsVvzOWwFd9VeuYwib6d7zeOYEW7kiBBKJ32FitqqJobZYkrE9Hx3D%0A4g+gSIkSCVE2PkjZeLKfytnHD95RqfLx+jpe/9Of0nahk9qeHlRNZ6Kmmqs7dzBXlluI7Y1tW9j2%0A+ec4591L9sn4v8+f/lrS9ogpe6ZNISWRLL/fYtrPnkvcH5mQwM7jJ3AXF9PfHqtQbHe7MfsD+B0O%0Ago67X8Mlz/3NSmudbAT2EnOsrAbaARuw5rFXUsq/Bv56rc+T5/5EypihXcSrU0ajEvecRjQqUVVw%0AFag4P/s2f3ctltlysSPkEhaV5P5e53/OOHlLoP5GT9K28boaiiYn06q/F9DjK20JSW11AQLByWee%0AyqjG1g0GPnrlJSoHBmi9eInC6Rmcs7OYIpEkn4PRhnou7dvLTEU5IZst45hyIWSzLenHNh9E0VzM%0AVMUTga2SX5RAYPdGSKzfpaTtYmfGa6srgtbOS5x5/NE7OnfA4eDioQNcPLTCFb4QvPlHP+Hp135B%0A2ViyhitiMvHhyy8yV16WtN1b4GKmvIzCyan05hMp6V+GM2jp6FhO+QwW7pcD731AyGJh5/ETlI+M%0AQHz7cFMjZx57NCZoLYwt7/+WJwPLFjSEEP898O+B/xv410AL8A/ARSHEj6SUJ1d3iHnyZMfj1jgf%0ALaF8dBSAqfJyPMVFNFy7hiA2mQspmZyIMrrnU6itxu90Ymy3EjFnz+dgiEQy2tgFxMIPF/kHXN2x%0AnY4z57L2rUjJqccfpbbnJlUDt1bkM+XlnHnsEcYaMkRwJAYgGGtouNVWSiqGhimcmiJqMDDU0rwq%0AwkUmisa8OOeCSbRamAAAIABJREFUSCW1c2xGcvDfUKO38mYYIlFMaUJGAdyFpQw1dTBXUk1V7xx+%0AhwlvoRnNuIKxrQJRs4m3//BHuKZnaOy+gkGLMllVxVBrS2ohUgjOPXyIJ3/zRkoBVwpBz6YOvIW5%0A11HRl+FzEUufHuKpX/wq6XcRQHVvH1X9AwQcdhxuD5qqMtDWGhNi81EreVKwEo3GfwO8JKV8J/65%0ASwixD/hfgGPASrLw5MmTxGKzxeO/fjjxtzkQoPXiJcqHh0EIRuvrsHs8bOk6TakYS7QrnpigdGIi%0A8VldtCqsGhigcmAAAew78hFnH32E7j27Mo4najKiBEMZhQ39tpBNd0kJJ559moPvxuzzqY7VhWCm%0Aopzu3bu4vHcP9nk3No+HkM2Ku3hpevCcEYLxulrG67L7EKwGrmk/rrkQIJafz1vqseN0PX06cl3H%0AFPYBsZV/1GggajBgiC6N2ulr20Zfx65Ef6aQhjEUwDUTYKLO9ZVWF3WXFHPx4ZT5BZcw1NrC8eee%0AYf8HH6JGo+iKgpASRUpudrRz8pmnlnXuoZZmmi93Z9WwLbA4ymgxCiB1Hbs75hCrahoNV6/RcO06%0AR196gaHWpUXt8jzYrETQ2Lq4aiuAlDIC/GshxFurM6w865XX/uYHib9zNVssUN3bx+Ov/xZ10eRS%0Ad/1GYl5b/ALNtHZbXCzLoGns++goEZORG9u2pj3mZkcHHeeWRm4sZripccm2G9u2MltWxrbPTlDb%0A25cITVwYx0hjA59+4/nEqtZX4MJXsJZR4quPY9pP4WQgo2kpLVISsijsOH6U7r2Pp2+nKFj808R8%0AzwEh6NmymbYLF5N+9+ny2piQET9mAUEsGVn1zWn2f/BLVC3KfEkxI42NXNuxDU/RrWJ09xI9W7cw%0AsKGNxu6ruOZmCZvN9G3ciKd4+eO9vGc3zZe7c/6dsmnwFqPEQ54f+d1b/PLP/3lOWsI8Dw4rcQad%0AyrDv4zsbTp77lX/z9T/PreGbK+vfOTvLE795A0XTlqqRubOiWBLY+elxerZsTusLcebRw7Re6kpp%0AQlnIQ/Dlk6knyumqSo5++5WYOWNwiNLRMXRVYaSpkfmSkjsY+VeLIaRRMurBHFz6m2QkXoNFV2C8%0ArgCpQun4IM1dp7i5eW+yGSX+txoJM1mVnEKn86G9NHZfwRgOJ4SNwZbN6TUjQqCrBiZqm6ntvULR%0A5BRFk1NsOXWa8eoqPnrlJcJrbF5aCRGzmespwpCXy2xFOZ988+s88tbbSF3P6jS83OcqlgskSvPl%0Abq7uTB3NlOfBZKXOoHnWMenMFl8VQtfZ8vmXiBRCBtx55U0B2Hx+yodH0poaNJOJ1//kj3j+56/i%0A8HiT9kVMJj74zrfwZlsVC8F4fR3j9XV3OOKvHkNYo7J/HkVffkZNKWCuzIqn0IJUlZhWQtep6+li%0AoroJb+Ei4SsucGiqAWNYwRDSiMYze/oKCnjnh9/n8FtvUzIxgQTmSiqyVoOdK6mktvdK0rgrRkb5%0Ag7/+G04890zueSnuQ/rbN/Krmho2XLxI3fUeiuPXbbWEd6koFI9PZG8ImP1+NlzopLnrMqZQEHdR%0AEdd2bKevfWM+h8c6Iy9oPEDcidniq0CJRtny5Wnaz57D6vev+flMwWDG/YECF7/+F/8FpcMjtF7q%0AQkidwZaWmE36AfO6L5rwrVDIkIw1FBK23go5re25CcB8cXn6qqyKgpBQMO1nuvpWKO18aQlv/dGP%0AKR4bp2hiIrffIU0bVdc5/Pt3qL96jQuHDjJbUZ77d7uPCDgdXDh0kAuHDtLcdZn97x/BEImgK0pC%0AM3Rt6xZaui5jWEHhOl3N7nDrmpnh2Z+/hiUQiFURBiz+AJVDwzR3XeboKy/l1E+e+4O8oLEOWGuz%0Axd1AjUQwB4OELBY0oxFF03jyV7+hanBoWYmo7gRPUW4e/FM11UzVVK/xaO5dlKielDE0GxKJQOCz%0AG5mucSLV5NWqGo0igImaJoSup13NCsDuCTOdIkJlprKCmcoKKvrnMQeiGcdWMJ0+idpCmHLDjR6G%0AGxv4+MVvrmt/g5ubNzHQ1kb9tWs45+YIWyz0b9yA3+nE73Ky8/iJZfWn6DqD2UreS8njr/8WcyCQ%0A9GwvCDk1fX1sO/E55w8fWvb3yXNvkhc07jHuNbPFWuKcmWXP0WPU3uxFxFc1EhhubGSqqpKqgcE7%0ANovkwkLkx1xpbgmY1jOu6WlsXh9+hx13Gv8RQ1Rf5u8imCuxMl+W2v9hurKCqv4BokZz2uqIiZ5k%0A7F+68u7uYivlw57UO6WOqmlUDt7IMNJbVPUP8Phvfsv73/vOutZYRU1Gbm7ZvGT7xQP7UTSdrV98%0AmRAAhZ7+t9eFiDnYNjVmPF/lwCCF0zNp9wsZSy528cBD6Ib8FLUeyP+Kd4n7zWyx1lQMDPLUL365%0ARP0ugNq+Pmr6+lbtXIuTVi2cYwFdCHRV5eTTywsVXG9UDAyy5+gxShfZ16cqKjj9xGNL/FZ0JbdJ%0Ad+F6T9Q4CDrTawWubd/Gli9OYfZ707ZZQFNEWiEDIOA0MVdipXD6tigYXUfRdbZ88SHGSG5l4RUp%0AqRocpHx4mInauxMmfE8hBOcPH6J7904ar17D4vfjc7kwBYLs/viTWJO4Y68iJZ6iQo5851tZhbLy%0A4RH0+DHpMIdCFMzMMntbIrM89yd5QeMOWQ9mi7uNGonwxOtvZLTx566Wz95WAOcP7meyupqtX3xJ%0A5eBQ4tiRxgbOPnqY2fL1aY/Phcr+fp76xVIJt3higqf/6Rd88AffZqyhPrE9alIJWVRMGaJNFqaQ%0A6arMQgbEnDrPHT5Ex5kLDG5IH10hAW+RJetENl9mI2g34pwNYg5EUfQoDde7qO67gjWwvOTFuqLQ%0AcPXagyloxAnZbEuiSPrbN9B2oTOWEM5oZGBDG4Mtzcgc/CoyCYoraZfn3icvaCziQTJbfJU0Xrma%0AU+nsTKTSTqRqI4ArO7Zz4dBBEIKR5iZsHg8Wn5+Aw07A4biDUawDpOTAe0cA0pYj3//+Ed74Z3+c%0ANMHPldkoH/SkjViIGBWmqx1JTp/pELpO28VOLH4v9dcuMLBhe8pMoVKAtyC32h4hmzGpxokhUkHT%0AlbM53TfJJ5WYQrlpQB4kfC7Xin0oxurrUeRnGdsEbFbmV5CwTmga9Td6KBkdQ1dVhpsamaypXtem%0Ar/uBB1LQ+PfP/CkGcwp78QNitrjbqJEI5cMjqNEos2WllI2OZT8oCwI49sI3sHm97PvoWJIqNqGy%0Ar67mzOOPMFlTk3Ss3+lMKgL2IFM2PIJrbi7tfgEUzM5SOjrKVPUtB9ig3cRkjZOSMS+qJpN8K9zF%0AFubKbDm/3Otu9OCamwegfLiXwdatyBTHCgmlI17GGgqWPXH0bu5gvL6WjWfPx4SaQCBnYWM+Q3Is%0AoesUTUyi6BrzJSXr2nF0tZisrmKqooLiiYmU5hNJLLlYRu2IlDjm3ajRKGGzCZvXh3N2lv0fHMEc%0ACifux+0nP2emrIwPvvOtfDG4r5AHUtDIc+eokQiNV65Sf/0GhkiEmfJypqoqqBgaxhwI4iks5MaW%0AzTR3d7P5y9OJuhQS8Llyn+RTrZh1IXAXFTHQ1opUVaaqqug4c5bKgUGkgJHGRrp378rXXcgBh3tp%0ARdGU7ebdSYIGxPwhhhxFWL1hjGEdXRX4HSZ0w/JyINTc7E0IioMtW2KTRCpBAzAHNSy+CEFH7lVL%0AF/A7nZx79DDnHj1M4+Vu9h49hs2XPWz6xpYtSzdKyaZTp9n2+ReYgyEANFWhZ/NmTj/2CBGLZdnj%0Ae2AQgqMvv8Czr/4Cx3xMwFyoR6RISW9HO1379qY9vLH7CttPfE7h9DSQ+h2x+HPR5CTf+LufMdrY%0AQMn4OFGDkYENrVzftnXN6//kiZEXNPIsG+fMLE+/9kvsnph3vyDmob/wslhg28nPE/sXEIDN7clp%0ANakLiBpNGMPhWJ0HYuFzc2WlfPitlxMrnsma6ph6NM+yCVmtd9ZOCAJOM4EVnl+JRqm5eTNhppmo%0AacqYcEsSC3FdiaCxmL5NHfR1tFPd28eBd9/H5vUm0tbrQjBZVY+voISRxgZ01bTElHP4rbdp7r6S%0A1KeqxUxAZSOjvP2j7xPNodT7g4rf5eLNP/4JzZcv03S5G3PwVsKukcaGtBqrTadOs/fox0katFx8%0AtOw+X6LOiwRKx8fZ8sUp3v/ud/ILkrtAXtDIsyyEpvHUL36FzetdIkDAUjt/KhZSHy8+7nYkcH3b%0AVk498ThNV65SMjaOpqoMtTQxVl+ft7muEmP1dQSt1ljipBRIIGizMbZGxdl2fHYSmzfmoCmFyMmZ%0AUOirlFcl7rPz5p/8hB2fnaTtYid+RyFdex8nbLEh42vlqn43EYPCXKkVf4GZ2hs9S4SMRJdA4dQU%0A7efOc+mhfbimZ6i/fh1DJFZbpX9DWz5kM07UZOTaju1c27E9p/Y2j4fdx+LRLis438K7SQBIiTEc%0A5qlf/ppf/fM/RTNm9yXKs3Lyd3yeZVF//QbOHNXtmVgIN00lcEhgtL6ez59+CoTgxtYt3NiaQn2d%0A547RVZUzjx7mULzC7O0I4OwjD+ckACwXNRJh47nzSUKqOeAjZEnv3yGkTtS4uumpIxYLp558nAsH%0ADlI5EAuxjRXeuzUGQ1SnbMyHNuGjrfNqxmgnAWw/foLtn53EEI0iiWlJVCkJWSx8+vXnGM6W1CrP%0AElo7L61qf7H7LUBT95WMBRXz3Dn5hPJ5lkVNbx/6KtUhEMC5QwfwOR1oioKmKMwWF3PkWy/zwTpP%0AknQvcWPbVj5/6kkiptiqbsH8FTaZOPn019bsJVwwPZPw3Vmguje1puAWAotvek3G43BH4mdIddYY%0Aig69HfuYL84cDq1qWqKEvQDU+GraFAzyxG/eoHRkZJVG/eDgmpld9T6lEFQODK56v3mSyWs08iwL%0ARdNi9upVIGow0HnwAJ2HDq5Kf3mWiZRYfBGcc0E8rgaOvvBjTCE3Nu8MAYeVwdaWtVUpp5jRa3u7%0AmaxuwOsqTvbViPtINFw9T8SiM9ZUv/TgO8Tmzh5yvaCJ62vfyY4T72Vsl+n47Sc+58Nvv7KicT6o%0ARMzm2OJjlUsS3K0SBw8yeY1GnmUxVVW5Kg+mLgQ9WzbntRZfFVJSMualYsiD1RvBGNExhnWkcOAp%0AbGCouXXN7dZzpaWEbovOULUoOz57l9rebtRoJLHd6nPTfvZTGq5fxBgKrcl4lFx9PxSFudIqQubc%0AHGmXHC4lNTd7MeTzcyyLvvaNKLq+qn0KKZmorcneMM8dkddo5FkWPZs3sfvjTxOFsLKRLjw1YjLR%0A+VD6ELY8a4tzNoh9PjbRLfw+CfOAJikf8jDSXLimgqCuqlzevYsdn50gYHcRsDkxRoI456Zp7TpF%0AU/dZgjYHiq5h8XsTUU2eovR5Le6EqFHBEMm9jkvUaMIcWlm8jQCM4TBRcz4yJVfGa2sYraujYmgo%0Ao9P54ndOJl8aXQiiRiM9mzat8kjz3E5e0MizLCIWCx+/8A0ee+NNhJRJSbJSCRRRkxE1HEnYqAFm%0Ayss4/vXn8RUU3L2B57mFlLhmgml3C8AYiVVoDTjXdiK8snM3AVslYasrsc3i89DcfYbykT7s3vnk%0AsUnJ9W1r4xjsKbJQNJE9rwYAuo4puNKgXogYjYRsK9OIPLAIwdFXXuSRN9+itrcPnQWnXZLCXT0F%0ALkCgGQ30bWjD7vGyofNSUlK/hRpHH73yUl7YuwvkBY08ICXF4xO4ZmcJWyyM1dZgjETQVTVlpsOh%0A1hbe+smP2HTqDA3XrqNqGu7CQsJmM6Wjo3HvejPXtm/j0r69CCmp7uuPZwYtY7qq8iv4knkWUKM6%0AhmhmFbQEzIG1FTSMwSgVgx5CVleSkBq0Obi85zG0c8epildaXRBkzx0+hLcwQ1HCO8BTaMHmCWct%0AMy+BsFVhsqaS6v6BxHZdCAQSkcUCowvB9W1b0dcgkme9EzGb+fA736JwcpL66z2o4TCqrhExmYmY%0AzQy0teItvG0BIyX9GzfQfu58LEzeYKB/YxtXdu5Iu9gpmJ6mcmAwZlqprs7n2rhDhHyAHGGEEC5g%0A/tC//GXqFOQPIKWjoxx4932KJ6cS2xZrJyarKuncv4/Btrac+hO6jhqJEjUZ8/4X9yhqRKO2J33a%0AcYjdA54iC7MVa5e2uermHMZwmsJsUqJGIxx87zVUXWO+qIiLB/dzc/PaqrmFLimYDuCcCaCkeDVK%0AYtVrxxoLiJpUnLNz8cJiBsImM8//46sImb5YoE6siNzvf/yDJVkpC6amaT93Lh4FIRhuauTqzu1r%0AZirKsxSz38/ht96mpq8/KfR+oqqKT178Bj6XK9Ph655oyM9nf/UdgAIpZc55DvKCxgNM0fgEz//j%0AqyialtbmuaBuPP3YIxnTAue5Q6TE7okVKfM7nWsrpElJTc8cajSzP8JEjXPNNBpmX5jKQU/Wdn67%0ARtBhwlO4/Pomd4Qucc4Fcc4EMEZvmQcDdiOzFXaiptTaiOauyxx6+11gafI6TVHo2bKJs48cXiJk%0AtHZe4uA77yVKrkM8zFgIPn7hGwxsSC/oG8JhyodHUDSNmYryfB2fFaJEo3z9Z/9I4dT0kt9OFwK/%0A08Hv/ugPCa9CenlF0zCGQoTN5jXJUbNWrFTQyJtOHmB2f/xJRiEDbr0sdx/7hIHWVjwZCkzlWT5C%0A1+k4c5ZNp89g98SSRXldLrr27ubKrp13NLmqEQ1jSAMhCFkNSCXelxC4i9P7I0hijpEBx9pFnTjn%0AcogckRLHvI/Jusw5K9YEReAptuIpsmAMaSi6JGpU0IyZJ4WbmzcxVVnJxvPnqewfBAGTVVUMbGhl%0AsqYmpSmyaHyCg+/EQmUXP4uKlEgpefTNt3j9n/3xEpOR0HV2HP+MjjPnMEZiEToSGGht4fOnn8oX%0AEbuNwskpNp4/T/nQMFJRGGpu5tqObQnBrOnK1STN7mIUKbF7vLRd6KQr7sRe1ddP+9lzlMYrxQ60%0AtXJl146MGijn7CzbTn5BU3c3qqYTNRjo2byJiwcewr+OtSV5QeMBxeL1Ud3Xn7OHvRSCDRcucubx%0AR9d0XA8UUvLw79+h6bZ01na3m30fHqVocpKTzzy9bGFDjWgUj/uweiOJ31dXwF1sZb7ECkLgKbJg%0ACkZxuMMJU9nCFKergsnatdWqmAKR7I2AysF+pqorcc4GMUR0pCLwuUy4i61ptQqrihBELMt7TbpL%0Aijn15BM5t+84ezZJk5F0ekBKycZzF5KfvUX3zu2lAOp6blL8j6/y1h/+kHCOtWzWOxvPneehDz5M%0Aus5FE5NsPnWaD7/1EmMNDTR3XU5yGF2ClLReukTXvj3s/vgTtnx5Oql9+9lzbDx/gY9eeYmRpsYl%0AhxdNTPLsz/8JQySSOMYQjdJ2sZOGa9d5+0c/wFO0Nv5HXzX5PBoPKFa/b1n1AhQpKZxKLe3nWRl1%0A8ZoZC57zCyx83nDxElWLnA1zQYloVPbNJwkZEMtoWTAVoHjMFz+JYLrKwUStk4DdSNSgEDGrzJXZ%0AGGkqJGJe2zWIyPHumy+upmjCl/DlUHSJYy5IVe9czsLKvU5130BWrWJ1f3/StrKR0cS9k6q93e2m%0A4+y5VR7p/UnZ0DD7P/gwdv/cpjFSo1Ge+M0bWHx+LD5/xt9BAGZ/gPrrN9jy5elEH4v7UzSNx1//%0ALabbawdJycNvv5MkZCw+zhQMsv+91GUA1gN5QeMBJWBbnlp1IeY8z+qx8dz5pGq3t6MLwYbzF3Lu%0AzxCMUnNzDoOW2hlRAM75EMZgNL5BEHCYmKxzMdxaxGhTIe4S67LLvK+EoM0AMnPkizEUwOcqigkl%0Ai66TQKDokrIhz6pnifxKyOU73NaktfNSxlIAipS0Xei8w4GtDzadPpP2OROAIarR2tmJp7Ag6/Po%0ALShg06nTGftTo1FaL3UlbS8ZG6d4YjKtIKNISfXAIM7Z1U+zfi+QN508ACiaxobzF9h47gKu2Vk0%0Ag4G+9g1MVFVROjaWW8VVKRnIMfLkQcU+P0/HmXM0dV/BEIkwX1LMlZ076N3UgUwxKRROz2RdyRbl%0AqEVSIzpV/fNZQysl4JgPMbtMc8Bq43eacLgzZMaUEs1gBJFmMhUCgybvSq6PtWa0oZ7m7u60mUl1%0AIRhtSE65bvN4smbJtPp8qzbG+5nqvv7M77h4+H3X3j003OhJ20xIybXtWznw/pGs78zyoWEu792T%0A+Jzrc1w4Nb0uo4zygsY6xhQMYnO72f/Bh5QPx4o4CUCJRGjtvCVx62RWbcUkeRf9G/OCRjpKR0Z4%0A+rVfoUajiZdQydg4h99+l8ar1zj60gtLvMvDJhM20mculPE2uVAw5U8ZjpkKNbK6aZxXgnM2lDFr%0AoyngI2xzZOxD6DpWb/C+FzS6d++ipetyyn0LP+nV20qpB+32zP4EkDI6whgKUXvjJuZQEE9BASNN%0AjSmF4AeJWNl4GG5uYqC1hbqeniUCuy4EU1VV3NzUwYH3j2TtU96m8Ygacptq16vWOC9orENc09Ps%0A+uQ4dTd6Yp7rLH2hL07Re/trRnLrQVGkxF1UxJHvfAs9x4flQUPRNJ74zW+ThAy4Zb+t7bnJ5lOn%0AubT/oaTj+jo2sv2zkxlrx/R1tOc0Brs79/ofuuGrzW9iCGtY/Zn9K7IJGRC7T+0eNzNV97e3/kxl%0ABZ8/9TX2f3BkaXgrcPzrzy2J9urZvGmJen4xsaRgizKoSsm2k1+w9fMvEqXrBeC32znx7NPrumz9%0AeG0NNb19GUP4x+tqQQhOPPs0j7/xJuVDw7ccqYWgt6Odz59+Ct1oZKy+jsqBwYxC3lh9XdLnkaZG%0ANFVF1bS0x4RNJsbXad2V/MyxziicnOS5f/wnDOFwQoDINK0sfpi8BQWceeQQFn+AkolJdFVlqLnp%0AwVv1SEn50DDFk5Noqspwc1PG3AT1165j9WdOXd1x5hxd+/YmXcdr27fTceYspmAoZdx+0Gbjxtbc%0A0m1nM5kk2gHegqUhlncTYyiaY7sAEZMlffSLoiDk+ihMdm3ndqaqK2k/e46q/kGkiCXsurJrJ/Ol%0AJUvaj9XXMdTUmNIsoAtByGrl8u7diW3bPzvJjhMnE58XrqjV5+PJX7/OB9/5FqNNjav+ve4Fuvfs%0Apu5mb8p9EpCK4Pr2rZiCQZ559RcUzMzc1khSd6OHy3t2M1NZQde+vUkZYRezUMdpcWI5JRpFiWpc%0A2bGdTWfOpn0fd+7ft24Xc+vzWz3AHHjvSJKQkSuKlLjm5gg4XQy057aKXo8UTUzwyO9+T+H0zC3/%0AOyHo2byJs4cPUTo2jpCSqcqKRNx72cgomqKgprGZC8Dm82H1epNi5YN2G+9977s8+evXcbjdCec+%0ARdfxFhTw4bdezpocSInqOGdjdUsymSIW9gfsRsJfsX9GrmGzpSP9jDaluRd1nYKZCcbr109yqpmK%0ACk4892xujYXg2Esv8NCRj2i51JUkbExVVXL8688n8miYAwG2fv5F6m7i/z/xmzf47U//eGn67nXA%0AaGMDZw8fYtenny2pd7KQEM3vdHLg3fcomFnqN6UAhkiEx377O37zZz9lpKmR048eZs/Hnyb6W9AC%0AR41GjnznFUyhEFtPfE7dzZu4ZmZRpERTBO7CQgrm5pKcSRUp6dqzm0sP7bt7F+Uukxc07nOMoRD1%0A129g9XqRQPnIyIr70hVBzc1eJmuqUaJRSsYnEFJntqwsZaKhrxKz3091bz+GaISZ8nKmKyuWTGCu%0A6Wk2nTlHY9w5M2yxMFpfz6knHiXoWKqad8zN8ezPX8MQT36U6E1KWi510XKpK8nkNNDWyslnnkIq%0AuQVrptIKzZWV8ps/+ym1PTepGBpCIhirr2O4uSnrhKzGQ1nVNFEmtxNVBZM1a5x1NAc0JbfzqxEP%0AddcvMti2DaHrseun66AoONyzbDp9lJ0nQlw4sJ/zDx/8yr/X3UYzGjnx3DOcPfww1f39KJrGdGUl%0As+VlSe3qr17P6jhq0DSefvU1Xv+zn+aUqdIQCmMOBQlarWj3gV9B54H9jNfW0n72HBXDw+iKwlBL%0AC927duAuKcEYDNLS1Z0xKsQ5P09V/wCjjQ10PbSP0cYGNp47T+noGJpqYLCthetbt7L1iy/pOHM2%0AcezCXanqsT7CRiN9He0IqeN3OOnZsmldOoAuJi9o3K9IyabTZ9n56XHUaBQpREZbf05dIlC1KNuP%0An2DTmbOYQjG7v6aq3Ni6hdOPPvKVVzpUNI09Hx1j44WLSS/PmfIyPv3688yVlQKxrH1P/vp1FO1W%0ALQ2L30/zlSs0XbnCqccfpXuRVzjAli9OpYxzh9Q+LnU3eiicnubMI4fZfOpM2jFLYL64mIA9dUix%0AVBQG21oZbGvN9vWTqBhwY9Cy/+Yy/m+8wQU5TvJrSbaCbgtcfmg/T7z+C8qHehmrbyNgdyLjVTe9%0ABSV88dR3sM/PUtPXTevFTm5s37bGI783CTrsGWvAWAJ+pKIgsggbTo+HhmvXMQeDbDx7HtfcLFGj%0Akd72di7v3Y2nqIiiiUm2f3Yi4f+lqQq9HR2cP3QQX8G97SszUVfLRF1tyn0FMzMZ/ScgpgEpHh9n%0AtLEBiGmgTj77TFKbnZ8cpyODeUSREkM0SuHUNO/86PvL/g73K3lB4z5l4/kL7D16LPH5ToUMAFXX%0AKRseoXx4JOlBUTWNtgsXKR4f593vf/crtSMeevtdmq5cWeKTUDg5xbM//yfe+smPCVqtPPbGm0lC%0ABtwSFgSw7+jHBO12ejd1xDZKSUvX5ZxCfRdQpMQ1M4tzdo65khJcKdSuC+e79NDeVV1xO2aDGHOI%0AHllIJz5R60Qz3RuP++0e+ekI2mz87ic/ZsfxE3Sc+5LJynou73ks1kdcO+QpLOHKrkcoGh9IaDvy%0AJONzubIKGRCLPtv70VGsvpi/kQBULcSG8xfYcP4CPpcLu8eNkItW6ZpOy6Uu6q7f4Pd/+MP7dmWe%0ASyVdAei30IFjAAAgAElEQVRq+mfIFAyy+dTprNpFRUrKR0YomJpO6X+zHsk/lfchSjTKzk+Pr2qf%0AuhCELBYqbhMyEueUktLRMdo6L63qeZdD8dh4LBtiCllAkRJjOMyWL76kubsbYzic1V9h+/HPEsmS%0AFE3DEM3NSfF2Nlzs5Mi3X8bndCa0B0DC56Jz3156tmxeUd/pcM4EsjcCZsqsjLQUEV3jTJ/LIWgz%0AoGd5G+sCgjYjYasVv8tJyGShe/cjSCGSTVDxv2fL6ygbuX+SHRlDUYrGfZQNuSkZ8WLxhtcs+dhA%0AW1tOYZMCsPr8SzLVKvHPTneykLH4OFMoxCO/+/1qDfmuUxl37sz0CwgpGWpuSru/pqc3q1ZkMQ9S%0ApuV75+2TJ2eq+gcwB3MPZ1zM4gdpccSJZjAwVVlBVX/mdMgbzl/g6s4dKzixxOrzIePRFCtZ3bdk%0AqUWgxLUSqqZlNSUJoGBunoKZGeZLStBVlZDFgjkYXNaYBGDzevEVFPDbn/4RTd1XaLx6DWMoxFxp%0AKVd3bGemsmJZfaZCjWg45kMYgxqqpmPKMRfGvaLFWIxUFTxFFlwzwZTCoAQ8xVakGg+xjmqM17ei%0AK2rG+8bsvw+yhEpJ0YQf12ww6Vl0uEMErQYmap1IdXXXf1GTkS+ffJxD776f1WE43T6Rw/6SsXFc%0AU9O477NVeunIKHuPfQKk/346MNjakrGopDEcznp9F7Nec2ak4t57C+XJynInw8UsFM9a7NQoheDj%0AF77O9hOfZ83175jPrTKwORCgqfsK9vl5CmZmKRkbxxbPVDhfXMSlfXtjoZvLEDgsWUJIIVakqPpm%0Ab86mJEM4ns9BCK5t38bmL08ty3wigUDcu18zGrmxbSs3tm3N+fhccMwGKR5ffpZHSTzV9z3IXJkN%0ANaonirotsBB+O1d6qxjYbHkZpqAxtuJPd78IgaqTuc09gHM2iCseJXT7KM2BKKUjXibrVt/X4ca2%0ArZQPDafNvbGcCTIdAmi9dImzj61t4UWz30/7ufO0dnZhDgTwOxxc376Vq9u3r8iHrP3suazJz4J2%0AG927d7H5iy8RUjJRU8NEbU3SveYuLsr5GoZNpiW5NtYz9+ZbKE9GPAV3FoK2pICXlOw5+kki13+m%0ABy5qNHLwnXdxzcwStljo7Winf+OGJBvnplNn2PXxJyi6nvIF5pqZ5dC771M4Nc3pJx7Ledy+DLks%0AFpCA1e/P6YHXFQXPonC+rn17aLxyFbvbnbuwIQTXV1mwWIzVG6ZkhUKGLlj11fGqIQTT1U7cxVEc%0A86F4yWwFn8u8pFrqUEszZcPns3Z5z+szpMQ1HUg7qcfCoCMYQhpR8+pXpj357NNY/H5q4zklFms0%0AV8PHC3JfiKwU+7yb537+KlavL/GMumZn2f3xJ7R0dvHeD75LaJkVayuGhrM+76ZgiGdf+2UiLFWR%0AktnSUo6+/ELCL2Wsvg5P3I8lU5ZeScxn636I1lkt7tG3UJ5MTNZUM19UmPbFqhOTmBfHamd6jBQp%0AKZyZYbqyMuMDJ4nlg2jpukzF8Ag1N3t55K23+cbf/QOWuLai9WIne48eQ9X1WLpzWGLzXfh78+kz%0AlA0PZ/u6CXq2bs46vtvPlQ4d6N24IamMdshq5e0ffp+BDW1J105XFFIZKnQh8LpcXF3DaAfXlH9F%0AE6gANPXeWtkLXaf1Yiff+P/+nh/9b/873/+r/4O9R48g1QBT1U7myu0pS7JLRWGksTqjo2dMe2O8%0Ap7UZxpCWtuDdAhKw+tYmCZlUFI6+8hJfPPUk7rgJQBeCoZZm3vnBd5kvLrojYU0CXtfaRp4cfuv3%0ASUIGLCyWYpEj+458tOw+9RwisRZ8LxQpE+cumJ7m2Z+/hnmhUqsQfPb8s0hFWVJ0TS76d3nPbjpv%0AyxK83slrNO5HhODzp5/iqV/+GrnoxofYi0MKwYfffpn54mIKp6YpGh/noaMfZ+wyVp3VwHRFOUUp%0Aqgwu/rRQ/GnxA/fob3/H+9/7A3YcP5GzGlYXgo3nLjBZk1va3fmSErp37aD97Pkl/Wc65+37dMDv%0AdHLm8aUq3qDDzscvfhOL10fh9DSaQWW+uIS9R4/RfFtUymhDPZ899yyRLEm1VoohGMESzN25bDES%0ACNvunRWT0HUee/1N6npiRatiEQ1hWi5dpvlyNx+98jIjTY1pjx+rr6DuxgyKlto0IgB3ydr8DqtF%0ArlqDXLO8rgSpKFzduYOrO3cgNC3mWPv/t3efwZFd14HH/+e9zhEZmDzDTJESh1lMokRZFCVTtlVK%0Alu11Kpe8VpW93rJdtdryru0PWtXuB5Vcttaqkl2rsi2VbNmW5CAqWMEUKUpiGqZhEIecDAyAAdA5%0Av7sfXncPQqO7gelGhzm/qqkBGt2Ni0bjvfPuPfec6uv53Jtv5+6vfX3bzy3Q1VLmIwsLTJ/ZvE6Q%0AZQwHX3qZx+97K/lNtpI3cuayy4g8fWTTi5jNji2WMQSzWa585tl6e4Fz+/fx0C98mMOPPMqe14/X%0Al6pT8TinLzvEi7feTHpkpO2xDQsNNAbU3IH9fP3nP8gt3/sPps7O1m9f2L2bJ972FhZ378ZbKHDo%0A6ItNeyLUiDGUvV6+954Hec9f/y2+dYlNtT+YRixjmDl9hkMvHCWcTrf9M1jGMLqwSCiZ5LKjLxJK%0AZ8hG3C2nmU2ujH789vvIhSNc/+PH63U+Wh2XV+ellGybY296I8/c+eamB6N8JMxc5MLXH333Azz5%0AlnuYOXUKcQyLu2e6tpXPU6wwNpdp2Q+kGQFSo/1z4r32yafdZlXrbreMwVQM9371X/jSR3+T8mZN%0A5Cxh9kCc6VNJ7LL7G1/9nlyaDpMP93dztZLPxkjzQEKAYqDzyyaNrC/Mdey6NxBdXuGGx35Yb7TY%0A9kUDsDQ15fYM6ZKJ2bmW97GMYfzcvFvwrk0v3XSYq488gzEbZ5taxnzGcPnzR9f0MTq/a4Zvf+B9%0A+LNZ/Lk8uXCoaxcjg0IDjQG2sHcPD/3SLxBZWSGYyZALR+olhD3FIg984e8YWVxsO9/g7KFD3Pad%0A726sjFnV7IDjiDBz+vSWxm8Afz7H+z/zWXfbYnWt+KaHH+GF227hyXvfsvHqVYTn7ridF269makz%0AZ7DLFd74wx81vdIBt+jYP33kNygEA9uuA5KPhNtucrZddqnCzImEe+W+DbUTQ2I8SDHYJzMaxqyp%0AlLie4GbsX3b0RV5Z16V0tbLfw9nLRgknCwTTRcQxFAMe0iMByr6dOTlfDGNbpGN+IonCprttyl7L%0AXQLqBRGO3HMXx6+5miuffdbt9zO/4DZerB5Dau+v2rvT4AYkiYlxvvP+93Z16ardfkvtLIWslhwb%0A4+EH3+1uz10VbNRyV1rt0vEVGifnF0IhCqHQlsYyrDTQGALpkZEN03FXP32E0cXFtqZrHRFOXXE5%0AYNh37LVtj6Po33rUHk65MyBizJo6Atf/+AlKPj/P3vnmho9zPB7mDrgV+iZmZ5k8O9u0O+PCnt3k%0Aoq07gvbayGIWq82S4o0UAzbJsSDZWP+UjPfl80SSzZMEjWUxPjsHTQIN935CeiRAemQwrxCXp0L4%0Ac2W8RXdJbM3uL0tY7IMS8SuTEzz+9vsAtyz/tU8+zcGXX8YulVmemuTElVcSTiWJLy1T8vk4cfVV%0AnLri8q43Xpzdv6/lDEvZ42Fh9+4tPe/kmbPc/u/fwTKmnoslQCEQYGV8nOkzmyeLOiKkLsGlkK3S%0AQGNIXX3k2ZYFgGp/tPN79vDoux/g0IsvbXubm2UMZw8dZHRhoWULZWgv0/36H/2Yo7fcTNnX/Arv%0AJze8iTf98McNpz5rY3vx5pta/AS9J44hnGxeaKyR2jbWhb0xTB+UGF9v36vH2rpfO9UZB52xLeYO%0AxIku54iuFPCUHRxLyMR8JMeCfTczkx4Z4fG3v43H3/62Xg+FbCzG69dczcGXX2l4fDG4yyCbLr81%0AEFlJ8I6//wfsarG+1aGSP59v2GRtNcuYprNwyqW7ToZUOJlsecLKhsN86wPv4xsf/iAlv3/bW9wc%0AEZIjcc4ePMCPfurtlNbteKkx1fuCW1661fi8pRIzJxu3Y14tG43y/Z9+l9sHY/VukerHz996S3XG%0Apr9ZFWdbiYACrEyF+zLIuOyFo9z90DdarnVbjrOldfVBZmwhORHizBWjnLh6jFNXjbE0E+m7IKMf%0APfbO++szFrW/79r/J6+8gqfvuXtLz3ftk09hl8sNgwnLGELZLAsz0w3fv44IZw/s5/UuL6cOA53R%0AGFJFv59Ak8Jejgjn9u9bk+k/v3t3y5N/7Q9u9Tpmye/nu+/9WRAhOT7Gv/3yL3Lj9x/lwKorj6XJ%0ACRLjY+TCEWYP7MdTLHLvv36t5c/hLba31e/4tdeQGBvj2iefYt+xY1iOw8KuXbx4801dzYTvJMe2%0A2mr1Lus+XpoK9b71ewNWucxt3/5Oy5/JnX6OXzKBxhp9vB23H5X9Pr7x4Q+y99hrXPbCUYKZDOlY%0AjFffdD1z+/dv+fU89OJLTWcsHBEKwSBH7r6Ta594qn5MLfp8vHzjDRy5686uLxkNg/47OqmOeO26%0AN3DNU083Ldf9Wq2hWNXy9BTzu3cxMTvX8HEOsLBnF95iiehKgqLfx2vXvYGXbrqR7KpiWqnRUR7+%0AmQfx5vMEMxkKweCGpKjR+YW2fo6V8fbLGS9PT/GDdz/Q9v37jbGEbMRLKF1qWurZEUCEfMhDcixI%0AoY+2sa6297XX2yqVnwuH+PcPvF8P2Kot2+123Egt8X0zbg+lEs/eeQfP334b8cXziDEkxscuqYJb%0AF2sgAg0ROQj8D+A+YAY4C/wt8HFjTHeq2wy4o7fezOXPv4C3WNwQNDgiLM7MNKxb8PB7fpp3feGL%0ABNOZesb1hS2EU3z7/e+j5G8v0bAUCGy6rWt5apLFmWnGzs03DmpEWJ6cZHl6qq3vNSwSE0FC6VLD%0AWQCDW557aVf/J7WC2wOmnZyfx+5/R323VCfYpRIji+cxIqxMjPe027Dqb4mxMcbmGx+DwD0OrVR7%0Atzi2fckdjzplUP4Cr8HNJ/lN4FXgeuCzQBj4/R6Oq29lYjG+8eEPce9X/4X48rKbfIm7u+PMoYN8%0A/8F3N7yCzMTj/POv/jJXH3mWK55/Hn82RyYW5ZXDN/Dq9dd1NIr/wQPv5IEvfBFPqbSh6FjF4+HR%0Ad72zY99rIBhDdLmwac2Sot9maab9QkS9lmsjDwcgG2tdWr4ddqnE4Ud+wNVHnsFbvVItBAIcvfkm%0Anrvj9oGbMfHmy4STBayKoeK1SMf9VLyax9FJL990mDsf+samX7eM4ZUuVv69VIjpUmvibhORPwB+%0AyxjT9gK8iMSAxF2/+yU8/ktkf7MxzJw8xfjcHI5tc+bQQZJbWI7ottj5JQ4/+oN6Pocjwomrr+LI%0AXXf01Th3QjBVZOpMqul9Zg/E+qc+Rgt2qcSHPv0XeIuNp6cNbrXXr/76r1x0roJUKrzty/+MY4XI%0AxMYQx2H83Ckm5k4ixnD86qt4+GceHIycCMcwMZsmnCpuCDgTE0ES48HB+DkGgDgO9/3TV9izrv9L%0AbSbuudtv46l77+nV8PpOuZDl0U99ACBujGm7sc2gzGg0EgeWmt1BRPzA6nn+zlw6DRIR5g7sZ+7A%0A/l6PpKHk+BgP/8yDeApF/PkchUBwWx0Yh0FkJd+ylHp0Oc/5AQk0Kl4vT77lHt7coP9E7QT6+Nvu%0A7chJ88BLx3nt2rvcWYvqxdO5/VcQyCS54bFvcujlV3j1+ImmZc77xdi5DKGUuyK8/pUZWcxR8VgD%0AW0ek3xjL4jvv/Vmu//ETXPPUU4QybofoxPgYz992K8euv67HIxwOAxloiMjlwG8Dv9firh8D/qj7%0AI1IXq+z3XbIBRo0/X25dhXCbvU965eWbbgQRbnz4EfyFC4mh2UiEH97/U5ztwE4TX66Esao5HiJr%0AApd8MMIzd9zPLd/9Klc+82zfBxp2qbJp5VBwA7T4Yo503K+zGh1ibJvn7rid52+/lWA6jbEscuGw%0Avr4d1NNAQ0T+mNaBwK3GmCdWPWY38HXgS8aYv2zx2E8An1z1eRTYWp1spXaIYwl2k9Ljhq2XV+4H%0AL994mJ+88Xr2vH4cf87N+Znbv79jOROx8zl3FqPR81kW+XCMpZl9xJeWO/L9uimYbr4LQgBP2cFX%0AqPTlluZBZiyLbJe7z16qev1O/XPgiy3uc7z2QTXI+C7wGPCRVk9ujCkA9cso0QhV9bFs1EdsKd90%0AViMbHcxZH8fj6ch2xA2MIZQuNW0hj+OwOLOP0YXjnf/+HSZOmx1e27yfUv2gp4GGMWYRWGznviKy%0ABzfIeBL4NWOM0+IhSg2U1GiA6HIeTOOtrY4tZEb6p4dJv2h5+SCCY9m8dt21re7ZcyW/3VbRvJJW%0AEVUDZCD2e1VnMr4HnMLdzjopIjMiMtPTgSnVQRWvzfy+GI4lbpMtLiRNVmzh3L4Yjj0Qf7I7R4Si%0Az25R4tzgLeYGolR0PuylUv39N1K7fe+xZSZPJ/Fnmy+1KNUPer100q77gSuq/9bnWOh6iBoahZCX%0AM1eMEkoWCOTKbsO0sNddMunjpT+r4hBOFPDn3OZU+bCXTMy/I/1XUqMBxs5lGn+xugPluTtuGIxK%0AjiJUPBZWsXHSb/3VNG4+Ryhd4vx0mPSo7kJR/WsgAg1jzOeAz/V4GErtCGMJmZEAmQHpPh1IF5k8%0Ak1rTEC6UKjIyn2V+X4xisLuHmfSIn2C6SDDjXt1fOBkbjMD5mSiZ+GCciO1SBd8mQcZ6tZ9z7FyG%0AfNirTdlU39J5WKXUtnmKFaaqQYaw9p/lGKZOJbEqXU6nEmFhb5Sl6TBlr3tIM0A24uPc/jiZAao5%0AYTXZdbQZAUbms50fjFIdooGGUmrbokuNk1fhQrARWWndWO2iiZAe8bMyGSIb9lDw2zh2dVQDVP24%0A4rVa5Js0FshqyyfVvwZi6UQp1WeMIZAtEUk0344Lbmn15Hiwq8Oxyg7Tp5L4CpV6dVVTqBBJFknF%0A/W6PmD7OcalxbIts1EcoVdxS8pmle/BUH9NAQym1JXapwtSpFL5ipeXVd62RX7dNnE3hLVTq33P1%0A/5FEAccWjAh2xaHiscjE/H2b07AyGSKQKWE5RjPd1VDQQEMp1TZxDNMnk3hK7iV0OzUfup0M6s2X%0ACWbLm35dgPhSfk1QFF/MkRwLsDIZ6ruZjrLPZu5gnNFzGYKZUlvBxuAsDqlLkeZoKKXaFk4W8JSc%0Atq+0BUh1ORkzmCm1daJdn6waX8q75cv7UNlns7AvxpnLRyj4WudtlAL9OTujFGigoVTvGEMgXSS+%0AmCV2Poc3v/lVeb+odRVtpXZiXJ4MUerjnhzxpXxfl/OueG0Sk6GWgd1Kl3NglLoY/XsEUGqI+XJl%0AJs+k8JSd+kl5dAFyIS+LeyJ9WwFUKq3zBgyQD3lIjgXJR7rfm6UQ8Gw7l8FyDP5saUfGuV25iI9M%0ANUEULixX1d43mai3r8evVH8ezZQaYp5ihelTCezyhTyH2skjkC0xdSrZt1syS/7m5b4NUPRbzO+P%0A79jJrxDyUGpjeWEzVh/PaAAgwuLuCCuTISr2hZCq4hGWJ0Oc3x3tuzwTpVbTGQ2ldlh0KYc4m9ee%0A8OcrBDMlcn14lZoPeYkmNq+LIUBqLLRzAwK3YNeeKNMnk1irZlxq21xbKfkHIL9BhOR4kORYoJ6I%0AW/ZaGmCogaAzGkrtsHCyeY0Eg5t02W/sssPYuUzDmYNaA7hsyEMmtvMBUsnvYfbQCMnxIGWPhSNu%0AAFH2bD7TYYB8wEPJP0DXWyKUfba7NVeDDDUgBugvTKnh0GqqXnBzIfpNZDm/aW0HwT1x53rY/K3i%0AsViZDLlbVqu8+TIzJxOwbgbJAI7AyoQmUSrVbRpoKNVBnmKF6HKecLKAOIaS3yY1EiAT99dPwGWv%0A1XSLqIG+LCYVThZaLkWEUkXSo/1z8i4FPMweHCG+mK3PJNWWVGwD06dT5MJelnZFqHh0glepbtC/%0ALKU6xJ8tsev1FaLLeeyKwTLgy1cYn8sweTpVT/BMt6grIUA67t+BEW9Nq4Zf0sZ9eqHsszm/K0Iu%0A5N2QtyG4dTimTyS63/xNqUuUBhpKdYJj6q3S15/Iaiez2FIegNRogGKD3Ru1zxNjgb6sPVHytd5x%0AUurDmRhwd/OEso2rbArgKTlElvM7PSylLgn9dzRTagCFU0XsFlfz0SW37LWxhHP744wsZoms5LGq%0AD6t4LBLjQdIj/TebAZAeDRCYTW/6danepx9FVgotd6FEEwWSEzu8Y2YrjCGcKBBdyeMpOji2kIn7%0ASY0EcHTZR/UxDTSU6gBfvtz0RCaAp2Kwyw4Vr42xheXpMCuTITzFCkh1NqCPdxJkYj5CSe+G/hu1%0AnzsV91Pocl+T7bLLzcumC24H2H4ljmHqVBJ/zq0eK4DtGOKLOaLLeeb2x/CUHCzHUPZaFAOevn4v%0AqUtLfx4VlBpSZt3B31jSl8skDYmwsDdK/HyunocC7kxMcixAajTQtye3SnWba7ME3H6txgoQX8zi%0Az5U3jL+WF7P79cSarzkW5EI+kuMBDTpUzw3IEU6p/paLeIk1WeOv5S849oAf8EVITIRIjAfxFN09%0Ao4NQOCod9xNu0aelvmRlzJrZgV4HIOIYosv5prNlGx8DoXSRcLpINuxlcU8UY/X370gNLw00lOqA%0AfMhL0WfjLVY2TThMjgf7/oTcNhHKg1BRsyof9pINb1z2gep2Yq9FajRAMFVkZDGLr1Cpfy0b9bE8%0AFaLi7c3P6y1U6nk87Vr9MwYzJcZm05zfE+3ouJRqV//OFSo1SESY3xd1r+65sIOk9v/KeLAnFTM7%0Axhh2HT/O1U89zWXPv4A/15/t1TclwuKeKOm4f8POmXzIy7n9MYKpIlNnUnirQQa4J+xQqsiu4wns%0AUoVeMBcZmwpusrKn2JvxK6UzGkp1SMVrM3tohFCqSChZwFpVsGtg8jAamD55iru/9hCRZKqe51Cx%0ALI7echNPv+UejDUY1yvGEpZ2uc3JAtkSAMWAh7LPRiqmXl59szyIkYWs28Bsh5X8NhVLsC+y+Vt0%0AKcfyTKRDo1KqfYNxhFBqAFgVh+hS7kLinmMo+j19W1uixlsoMLKwQDiR2NA1dnx2jnf8/T8QSrnb%0AWmsnYdtxuP7HT3Drd767w6O9eI7HIhvzk4356xVYw6nChhooqwnVHjW9KOolQiHo2XZ32proSgF/%0AptSRISm1FYN7maVUH/HmS0yfTNX7mAhgFSqMncsQSeQ5ty+O6bNE0GA6zU3/8X0OvfgStuOeQJem%0AJjly152cuvIKAA4/8ihiDFaDtvUCXPPUEV649VYy8dhODr3j2llWEMBTdij1IDm07Lm4906t9Pro%0AQoa58EhHxqRUu3RGQ6mL5M2X2XU8WW84Vjsl1D725SuMzmfqMx4j8xli53M9XTMPpDP89N98nsuO%0AvlgPMgBGFha578tf5Yrnnsefy7Hn9eMNg4waI8KhF1/ciSF3Vbs7S5weLROZDgQ3AvjzFTwFzdVQ%0AO0tnNJS6COIYpk8mWhaDiiQKRBJrW7+PLGRJj/hZmg7v+G6UGx95lGA6syGIsIzBALd/69ssTU62%0AbKJmRAhkBywxtIFs1MfIQnbTrxugEPRQ8fYm0MhG/cSXmm+fbvcdZFccyvT3cp4aLjqjodRFCCUL%0A2G0s28sm/yIrBUbnM90c4gaeYonLXji66UyFAHa5zMypUzgtAiDLGDKxwV42AbfxWqMdKbCqB00P%0Ay5MXg556U7j1arelI+1dN2qXWrXTdEZDqYsQyJa2dDW5ngDR5QKJ8VB3+1UYQyhVJJwo4CuUeOnw%0A3fjzWRLj0+RDEbzFAjOnXmX38Vfwlgo4lkUoleb4NVdz8KWXNw1KHBFee8M13Rv3DlqaCQOsmXkS%0AwLGE87vC5MPeHo3MtbAnwuSZNMHqe67GCJzfFSEf8hJ+dblp9dNCdZeNUjtJAw2lLkKnFjxC6WLL%0A9vHbZVUcpk4m8Rcq9aBocfdBd7nGGLf4ltfP69fcxJmD13Djow/hz2Uo+v28dNNh9rx+HG+hsCbY%0AqD3P02+5m0KojxuRbYW4218TE0FCqaK7Pdlnk434oA+qahrbYn5/DF+uTChVQBx362sm5sPYFqPn%0ANp8Zq/3mlqeH5HelBorOoSl1ETrVREwuskZCM+Nn0/VKl/XTZW1JZPX/IhT9QY7e/FYsYzh+zVWk%0AR0b42i99mLn9+9Y8ZzYS4dEH7ueF227t2rh7peK1SY0FSUyEyMb8fRFkrFYMeliZCrM8EyY9GsDY%0AFlJxiK40L1Mu9Hc/FzW8dEZDqYuQjvkZmc9CkxoMrQi0P51tDMF0ya37UDGUfTapET9lf+M/ZU+x%0AQmgrtRMsi9ToBC8evpnk+DgAybExvvWhDxBOJIgtL1Py+Tk/Mz0whbouBf58GWkjVg1kS6R16UTt%0AMA00lLoIxrZY2Btl8nRqW8GGASoeIRf2Qm1WY5MraKvsMH0qia+6BAJApkRsOc/KeJDExMZeKoHM%0ANnJIjOGlmzbOVGTicTLx+FaeaWiMzZ3jDU88yb5Xj2E5Duenp3jx5ps4cfVVA9O/pntzZko1p4GG%0AUhcpH/Yxe2iE6HKeULKAp9LeIb12r0zMz67jifryRiFgkxwLutP2q0yu6sOx/tQ2cj5H2WuR6UCe%0AhxHR2YpVDrz0Mm/5l38DoV6QbfLsLNNn/pVX3vRGHnvnOxoHG8bgLVSwK24X2O0kYXrzZaLLefy5%0AEkaEXMRHeiRAxSPYFVNtby8UA56WAaUA+Q4t9Sm1FfquU6oDyj6b5ekw+ZCHqTPpth6TD3pwbCG+%0AlF9ztenLV5g8m2alUCEx6Sbv+XJlArnyps9lgPj5HJm4f81Jrxj0bHmWRcCdYVEE0hnu+devIcas%0AWZqoJcZe9exzzO3fx+tvuHbN40LJAiMLWbylC3ufcyEPy9NhSpssc61hDGOzaaLJ4poAwlfIET+f%0Ao3mpzaQAABDtSURBVGJLPaAt+myS40HScR+RRLHh79sA+ZBn0yU2pbpJL1uU6iDTZuLgyliA5HiQ%0AcNrNn1j9qNrHI+dz+HLu14PpYtOpbwG8JQdPaW1Rj2LAQyFgtz1tboBcyKsnpKorn3vODTI2+boj%0AwrVPPLXmtvBKnsmz6Q2/i0C2zMzxBN7CuoDRGKyyU08I9ubL7P3JMtFkEWj83rBXzZp5ixUmZtM4%0AtlX/Xa/uHmyAstfqSUM4pUBnNJTqqHzQiyNgNTmzGyA5FmRiNt10utsA0eU854Pe9mclGnzfxd1R%0AZo6vtFVYrOSzWNytHT5rJmbnkCYl2C1jGD93rr5NWJzmXWAxMDKfZWFfDKviEF/MEUnksZxakOch%0AkC8jTX5XDZ8XiC/lOXsghq9QIbJSwFOqUPFYZOJ+0vFA3/XaUZcODTSU6iRLSEyEGN2knLUBEmMB%0AjMfCly+3XFP35d2cjKLfbhlsOJZQblAiu+yzSY8EiC1tvv2xZnFXpLuFwwZMO71NjCX15apQqtiy%0AC2wwU8KTLzN1JoWn5KzpjRPMlusfb5UBookCSzORjuTqKNUpekRRqsOSYwE3mIAN/1Kj/nreRatl%0AFgOY6l9oNuqjYsumSyAGSI24yaN2qYK1rp25024tiD6rGdFrZw8dbPp1R4Qzhw7VP/eU2usCOz6b%0AXhNkrP7axWyT9ua1YZrqPzqjoVSnibAyFSY1GiCcKOApO+4Udsy/ZudBNuprOcuQjfrrz7mwJ8rU%0AqeSabbS1wKPot7EqDvteWapfPRR9FkvTYQphH/mwD1ls3vysYgslrbGwxuvXXsuN338Ufy63oQy7%0AAcQYXrj1lvptlTYLYvkLlY5VlV09nvryiDHYZQdxoOK12s4dUqobdEZDqS6peG2SEyGWZiIkJkIb%0AtjemRgMYaVzfwODOQqTjF7a4FkJeZg+NkB7x41gXkvwS40GscoVIorjmD9pXdJg+lWLkXIZi0EO+%0AugWykVreyKDUhNgpZZ+Xb33w/RQDgTVJlo4IRoTH3vkO5vftrd8/G/W19bzdepWzUR+hZIFdxxPs%0APbbCntdX2PuTJUbPZZBKG0k6SnWBzmgo1WXiGHx5d+296Lcx1aveitdmYU+UyTOpNdGGWypamN8X%0A25AvUfbZLM1EWJqJ1BMQx2bTeCqbn7ziy3mKAQ+Le6JMn0rgLTr1ZMXa/5mYj+SYrus3sjw1yT9+%0A5De4/OhR9h57DbtcZnHXDK/ccAPpkY0FzLJRn5ursYNjdAu/WVgVw/hcZk1AaRk3qTiQKTF3IFZ/%0A/ym1UzTQUKpbjGFkIUt0OV/fhWLELVu+PB3GqjiMncvU6zPUTvwABb9N0b9xGUMcd0rciBuoSMUh%0Akig0TT4EGJvPcPqKUWYPjhBKFggni1gVp1rCPEAh5NHZjCbKfh8v33iYl2883PDrVsVh9FyGcLK4%0AYVkLujeDUR+f12JxV4SZk8mG309wt8HGlvL1HCGldooGGkp1gzFMnkkRTJfW1kEwbhvyWi2F9QmB%0AtY+D2TIjC1lWptzW5VbFIb5Q3QpZPYMV/DbpuL+tk5hdMfgKFYoBD5mRgO5K6CBxDNMnkniLlQ2/%0Ay+2U/XaXzcBymgcoq7fQektOPcjYdJxAdCXfsFS9Ut2kc2hKdUEgUyK0LsioEcCfrxDIb54QWDsp%0AiGOwKg4zJxJEV/Jr6nP4ChXG5xtvo21k/U4U1RmR5fyGIKNmO7tI8gEPJV/riq6b1dNoxq6YrnYK%0AVqoRDTSU6oLISr7l1Wyrr1sOeAtlYudzeIqNt0KuTlBspezVHSXdEF3JN/36Vn5HBvAXypsmCbfS%0AKthwt0zrbIbaWRpoKNUF3gY1ElbbSqXP6ErrHIzqXTd7CvIBz7aaeqnW7HJ7v+t2AgfBXV4L5poX%0Ac9sOA2QjXl02UTtOAw2luqBiW01PLO20bncEcEy9Y2gzRZ9Vf97138cILM+EWz6H2h6nxS4Og9uR%0Atxiw19y2mVbB43bzPgCSE5oIqnaeBhpKdUGmjSTNkqd5pU/LwK7TqbZOLLmIj8XdESrr+lkUQh7m%0ADsQpBjTvu1vScX/LwCE5HmLu4AhnD8YobmFmabsJpbB2ycaxhPm9UX0fqJ7Qd51SXZCJ+ogt2Xgb%0AVICs1TyY3xth6syFLp+r61psZXJbcCuIFoMeslEfnmIFu2IoeywqulzSdanRAJFEHru8scurAQpB%0AD7mIF0+xwtSplJuQuYXnr70vMlEfmZiP6TPpth+bjvsphLxkoj4tL696ZuBmNETELyJHRMSISONN%0A7Ur1miWc2xcjH/YCa68uCwGbuQMxygEvswfjLE+FKPptd6mkgWZr/LW27sVg9ZpBhLLfQyHk1SBj%0Ahzgei7n9cQrV2YLVLdqzUR/ze6MgwsTZrQcZqxlbyEf9FH2OW6yt2X2BXNjL0q4ImbhfgwzVU4M4%0Ao/F/gLPADb0eiFLNOB6L+X0xPIUKgWwJMYZCyLtm+trYFqmxIOmRAPt+stTWroEawT2ZLO6OdmP4%0AagsqPptzB+N482X8+bKbgBv2Uqnu9PHlyvgvsuGZEWHq1Gnu+8o/cvyqGzhz6FqMvfYQXpsRKwZs%0Azu+OXNT3U6pTBirQEJF3AfcD7wPe1ePhKNWWst8m3aDK52p22alXCG0mH/JSDNgYS8hGfJR0zb2v%0AlAKehr8Tf67UVgLwZgR3x8iDf/MQVqXMFUef5MArz7E0uYv06ASp2Bhlnx/HEk5cc8DtuaK7S1Sf%0AGJijlIhMA58Ffg5oq0qRiPgB/6qb9NJP9SXHbu+kUAh5SOjOgYFj2jzpNwpG3F0rHsbmzxJJXqj+%0A6S0XmZ49wfTsiTX3PXHtR0D8KNUvBiJHQ0QE+BzwGWPME1t46MeAxKp/pzs/OqUunmNb5ELelrsX%0AMlE9gQyifNjb3nZmLuTzXMjp8bCwL8rI+aWWAYsAsaXlixusUh3W0xkNEflj4I9a3O1W4E4gBnxi%0Ai9/iE8AnV30eRYMN1acSE0ECJxtPsRvcDqvlFkswqj+VfTbZsJdgpnFZegMkx4KkxgKEEwW8hYq7%0APBb1UQi6De9KPm/LJFD3e3k7Pn6lLkavl07+HPhii/scB/4QeDNQkLUR/RMi8nljzK80eqAxpgAU%0Aap+LrlmqPlYIeVnYG2V8No1dMWtmNzIxH+dnNLlvkJ3fHWHqVBJ/vlIPJmv/Z6O+erOz1Fiw4eNP%0AX34ZRgTZJNhwK39GOD893aWfQKnt6WmgYYxZBBZb3U9Efgc32KjZDXwD+BDwo+6MTqmdl4v4OH3F%0AKKFUEW+xglO9qq1on5KB59gWcwfihFJFwskCdtlQ9lqkRwLkQ56WyZv5cJiXD9/ANU8f2bSB2zN3%0A3YGxBmJFXF1Cej2j0RZjzMnVn4tIrWLNMWOMLoWo4SJCNqa5GEOp+rvd7u/38fveiqdU4srnX8AR%0AWTPD8fQ9d/GTG97UwcEq1RkDEWgopZQCY9v84N0P8Pybb+PQ0Zfw53NkojGOXfcG8hHtZ6P600AG%0AGsaY42x/S7pSSg205NgYz9x9Z6+HoVRbdDFPKaWUUl2jgYZSSimlukYDDaWUUkp1jQYaSimllOoa%0ADTSUUkop1TUaaCillFKqazTQUEoppVTXaKChlFJKqa7RQEMppZRSXaOBhlJKKaW6RgMNpZRSSnWN%0ABhpKKaWU6hoNNJRSSinVNRpoKKWUUqprNNBQSimlVNdooKGUUkqprtFAQymllFJdo4GGUkoppbpG%0AAw2llFJKdY0GGkoppZTqGg00lFJKKdU1GmgopZRSqms00FBKKaVU13h6PYBeKBeyvR6CUkopNVC2%0Ae+4UY0yHh9K/RGQPcLrX41BKKaUG2F5jzJl273ypBRoC7AZSvR5Lh0VxA6i9DN/P1m/0td4Z+jrv%0AHH2td8awvM5R4KzZQvBwSS2dVF+YtqOwQeHGTwCkjDHJXo5l2OlrvTP0dd45+lrvjCF6nbc8dk0G%0AVUoppVTXaKChlFJKqa7RQGM4FIA/qf6vuktf652hr/PO0dd6Z1yyr/MllQyqlFJKqZ2lMxpKKaWU%0A6hoNNJRSSinVNRpoKKWUUqprNNBQSimlVNdooDHERMQvIkdExIjI4V6PZ5iIyEER+SsReV1EciJy%0ATET+RER8vR7bMBCRj1Zf27yIPCki9/R6TMNERD4mIo+LSEpE5kXkKyJyda/HNeyqr7sRkU/1eiw7%0ASQON4fZ/gLO9HsSQugb37+c3geuA/wr8Z+B/9XJQw0BEPgR8Cvg4cCPwfeAhEdnf04ENl3uBTwNv%0ABt6BWyX6myIS7umohpiI3Ap8BHi212PZabq9dUiJyLuATwLvA14AbjTGHOntqIabiPwB8FvGmMt6%0APZZBJiI/Ap4yxvzWqtteBL5ijPlY70Y2vERkEpgH7jXGPNzr8QwbEYkATwEfBf4QOGKM+d3ejmrn%0A6IzGEBKRaeCzwH8CttfXV21HHFjq9SAGWXXp6Wbgm+u+9E3gzp0f0SUjXv1f37/d8Wng34wx/97r%0AgfTCJdVU7VJQ7VD7OeAzxpgnRORgTwd0iRCRy4HfBn6v12MZcBOADZxbd/s5YGbnhzP8qseMTwKP%0AGGOe7/V4ho2I/Dxu8HxLr8fSKzqjMSBE5I+rSUTN/t2Ce7KLAZ/o8ZAH0hZe59WP2Q18HfiSMeYv%0AezPyobN+TVca3KY648+BNwEf7vVAho2I7AP+FPhFY0y+1+PpFc3RGBAiMoF7tdfMceCLwHtYe1C2%0AgQrweWPMr3RlgEOi3de5dtCoBhnfBX4E/KoxxunyEIdadekkC3zAGPPlVbf/KXDYGHNvzwY3hETk%0Az4CfA95ijHm91+MZNiLyc8CXcY+/NTbu8dkB/MaYSqPHDhMNNIZMNTM/tuqm3cA3gPcDPzLGnO7J%0AwIaQiOzBDTKeBH7pUjhg7IRqMuiTxpiPrrrtKPBVTQbtjOpyyZ8B7wXeaoz5SY+HNJREJAocWHfz%0A/wNeAv73pbJUpTkaQ8YYc3L15yKSrn54TIOMzqnOZHwPOAn8PjDpHrvBGDPXu5ENhU8CfyMiTwCP%0A4W4J3A98pqejGi6fBn4B+FkgJSK1/JeEMSbXu2ENF2NMClgTTIhIBjh/qQQZoIGGUtt1P3BF9d/6%0AAE52fjjDwxjzdyIyDvxPYBfugfrdxpgTvR3ZUKltHf7eutt/DTeZXKmO0aUTpZRSSnWN7jpRSiml%0AVNdooKGUUkqprtFAQymllFJdo4GGUkoppbpGAw2llFJKdY0GGkoppZTqGg00lFJKKdU1GmgopZRS%0Aqms00FBKKaVU12igoZTqGyKyS0S+ICIvi4gjIp/q9ZiUUhdHAw2lVD/xAwvAx4FnejwWpVQHaKCh%0AlNoxIjIpInMi8t9X3Xa7iBRF5H5jzHFjzH8xxvw1kOjhUJVSHaLdW5VSO8YYsyAivw58RUS+CbwE%0A/C3wf40x3+zt6JRS3aCBhlJqRxljviYinwU+DzwO5IH/1ttRKaW6RZdOlFK98Pu4FzofBH7RGJPv%0A8XiUUl2igYZSqhcuA3bjHoMO9HgsSqku0qUTpdSOEhEf7rLJ3+HmaPyViLzRGHOutyNTSnWDBhpK%0AqZ32cSAO/A6QBt4F/BXwIICIHK7eLwJMVj8vGmOO9mCsSqmLJMaYXo9BKXWJEJG3At8C3maMeaR6%0A237gWeBjxpi/EJFGB6UTxpiDOzZQpVTHaKChlFJKqa7RZFCllFJKdY0GGkoppZTqGg00lFJKKdU1%0AGmgopZRSqms00FBKKaVU12igoZRSSqmu0UBDKaWUUl2jgYZSSimlukYDDaWUUkp1jQYaSimllOoa%0ADTSUUkop1TX/H3aC+2hmHJy5AAAAAElFTkSuQmCC" alt="" />

解释:数据集不是线性可分的,所以逻辑回归不表现良好。希望一个神经网络能做得更好。现在让我们试试这个!

4 - Neural Network model(神经网络模型)

Logistic回归在“flower dataset”上效果不佳。你要训练一个只有一个隐藏层的神经网络

Here is our model:

Mathematically:

For one example x(i):

Given the predictions on all the examples, you can also compute the cost as follows:

提醒:建立神经网络的一般方法是:

  1.  定义神经网络结构(神经网络的输入单元,隐藏单元,输出单元等)
  2. 随机初始化模型的参数
  3. 循环:
    • 实现前向传播
    • 计算损失值
    • 实现后向传播来获得梯度值
    • 更新参数(梯度下降)

构建helper函数来计算步骤1-3,然后融合他们为一个 nn_model()函数。学习正确的参数,你可以在新数据上做出预测。

4.1 - Defining the neural network structure

Exercise: Define three variables:

  • n_x: 输入层的大小
  • n_h: 隐藏层的大小(设置为4)
  • n_y: 输出层的大小

Hint: 使用X 和 Y 的维度来计算 n_x, n_y。隐藏层大小设置为4

# GRADED FUNCTION: layer_sizes

def layer_sizes(X, Y):
"""
Arguments:
X -- input dataset of shape (input size, number of examples)
Y -- labels of shape (output size, number of examples) Returns:
n_x -- the size of the input layer
n_h -- the size of the hidden layer
n_y -- the size of the output layer
"""
### START CODE HERE ### (≈ 3 lines of code) n_x = X.shape[0] # size of input layer
n_h = 4
n_y = Y.shape[0] # size of output layer ### END CODE HERE ###
return (n_x, n_h, n_y)
X_assess, Y_assess = layer_sizes_test_case()
(n_x, n_h, n_y) = layer_sizes(X_assess, Y_assess)
print("The size of the input layer is: n_x = " + str(n_x))
print("The size of the hidden layer is: n_h = " + str(n_h))
print("The size of the output layer is: n_y = " + str(n_y))
The size of the input layer is: n_x = 5
The size of the hidden layer is: n_h = 4
The size of the output layer is: n_y = 2

Expected Output (these are not the sizes you will use for your network, they are just used to assess the function you've just coded).

n_x 5
n_h 4
n_y 2

4.2 - Initialize the model's parameters(初始化模型参数)

Exercise: Implement the function  initialize_parameters(). 

Instructions:

  • 确认你的参数正确。
  • 使用 随机值初始化权重矩阵
    • 使用:  np.random.randn(a,b) * 0.01  来随机初始化(a, b)维度的矩阵。
  • 偏置向量初始化为零
    • 使用:  np.zeros((a,b))  用 0 初始化(a, b) 维度的矩阵
# GRADED FUNCTION: initialize_parameters

def initialize_parameters(n_x, n_h, n_y):
"""
Argument:
n_x -- size of the input layer
n_h -- size of the hidden layer
n_y -- size of the output layer Returns:
params -- python dictionary containing your parameters:
W1 -- weight matrix of shape (n_h, n_x)
b1 -- bias vector of shape (n_h, 1)
W2 -- weight matrix of shape (n_y, n_h)
b2 -- bias vector of shape (n_y, 1)
""" np.random.seed(2) # we set up a seed so that your output matches ours although the initialization is random. ### START CODE HERE ### (≈ 4 lines of code) W1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros(shape=(n_h, 1))
W2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros(shape=(n_y, 1)) ### END CODE HERE ### assert (W1.shape == (n_h, n_x))
assert (b1.shape == (n_h, 1))
assert (W2.shape == (n_y, n_h))
assert (b2.shape == (n_y, 1)) parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2} return parameters
n_x, n_h, n_y = initialize_parameters_test_case()

parameters = initialize_parameters(n_x, n_h, n_y)

print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
W1 = [[-0.00416758 -0.00056267]
[-0.02136196 0.01640271]
[-0.01793436 -0.00841747]
[ 0.00502881 -0.01245288]]
b1 = [[ 0.]
[ 0.]
[ 0.]
[ 0.]]
W2 = [[-0.01057952 -0.00909008 0.00551454 0.02292208]]
b2 = [[ 0.]]

Expected Output:

W1 [[-0.00416758 -0.00056267] [-0.02136196 0.01640271] [-0.01793436 -0.00841747] [ 0.00502881 -0.01245288]]
b1 [[ 0.] [ 0.] [ 0.] [ 0.]]
W2 [[-0.01057952 -0.00909008 0.00551454 0.02292208]]
b2 [[ 0.]]

4.3 - The Loop

Question: 实现前向传播 forward_propagation().

Instructions:

  • 查看上面的数学公式表示你的分类器
  • 使用  sigmoid()
  • 你可以使用 function  np.tanh() . 这是 numpy库的一部分
  • 这些步骤你必须实现:
    1. 从字典 "parameters" (initialize_parameters()的输出)检索每个参数,用 parameters["..."]。
    2. 实现前向传播。计算: (所有训练集样本预测的向量)
  • 反向传播所需的值存储在“cache”。cache将作为反向传播函数的输入。
# GRADED FUNCTION: forward_propagation

def forward_propagation(X, parameters):
"""
Argument:
X -- input data of size (n_x, m)
parameters -- python dictionary containing your parameters (output of initialization function) Returns:
A2 -- The sigmoid output of the second activation
cache -- a dictionary containing "Z1", "A1", "Z2" and "A2"
"""
# Retrieve each parameter from the dictionary "parameters"
### START CODE HERE ### (≈ 4 lines of code)
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
### END CODE HERE ### # Implement Forward Propagation to calculate A2 (probabilities)
### START CODE HERE ### (≈ 4 lines of code)
Z1 = np.dot(W1, X) + b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2) # print (W1.shape)
# print (X.shape)
# print (b1.shape)
# print ("A1:", A1.shape)
# print ("Z1:",Z1.shape)
# print ("Z2:", Z2.shape)
# print ("A2:", A2.shape) ### END CODE HERE ### assert(A2.shape == (1, X.shape[1])) cache = {"Z1": Z1,
"A1": A1,
"Z2": Z2,
"A2": A2} return A2, cache
X_assess, parameters = forward_propagation_test_case()
A2, cache = forward_propagation(X_assess, parameters) # Note: we use the mean here just to make sure that your output matches ours.
print(np.mean(cache['Z1']) ,np.mean(cache['A1']),np.mean(cache['Z2']),np.mean(cache['A2']))

Expected Output:

0.262818640198 0.091999045227 -1.30766601287 0.212877681719

现在你已经计算(在Python变量“A2”中),其中包含了每个示例的,你可以如下计算代价函数

Exercise: Implement  compute_cost()  to compute the value of the cost J.

Instructions:

  • 实现交叉熵损失(cross-entropy loss)的方法有很多种。我们如何实现
logprobs = np.multiply(np.log(A2),Y)
cost = - np.sum(logprobs) # no need to use a for loop!
# GRADED FUNCTION: compute_cost

def compute_cost(A2, Y, parameters):
"""
Computes the cross-entropy cost given in equation (13) Arguments:
A2 -- The sigmoid output of the second activation, of shape (1, number of examples)
Y -- "true" labels vector of shape (1, number of examples)
parameters -- python dictionary containing your parameters W1, b1, W2 and b2 Returns:
cost -- cross-entropy cost given equation (13)
""" m = Y.shape[1] # number of example # Compute the cross-entropy cost
### START CODE HERE ### (≈ 2 lines of code)
logprobs = np.multiply(np.log(A2), Y) + np.multiply(np.log(1 - A2), 1 - Y)
cost = - np.sum(logprobs) / m
### END CODE HERE ### cost = np.squeeze(cost) # makes sure cost is the dimension we expect.
# E.g., turns [[17]] into 17
assert(isinstance(cost, float)) return cost
A2, Y_assess, parameters = compute_cost_test_case()

print("cost = " + str(compute_cost(A2, Y_assess, parameters)))
cost = 0.692919893776

Expected Output:

cost 0.693058761...
使用前向传播期间的cache, 现在可以实现反向传播。

Question: Implement the function  backward_propagation(). 

Instructions: 下面提供6个公式矢量化的实现。

Tips: 

计算 dZ1,你需要计算 。由于是一个 tanh 激励函数,如果 

所以你可以用(1 - np.power(A1, 2)) 计算 

# GRADED FUNCTION: backward_propagation

def backward_propagation(parameters, cache, X, Y):
"""
Implement the backward propagation using the instructions above. Arguments:
parameters -- python dictionary containing our parameters
cache -- a dictionary containing "Z1", "A1", "Z2" and "A2".
X -- input data of shape (2, number of examples)
Y -- "true" labels vector of shape (1, number of examples) Returns:
grads -- python dictionary containing your gradients with respect to different parameters
"""
m = X.shape[1] # First, retrieve W1 and W2 from the dictionary "parameters".
### START CODE HERE ### (≈ 2 lines of code)
W1 = parameters["W1"]
W2 = parameters["W2"]
### END CODE HERE ### # Retrieve also A1 and A2 from dictionary "cache".
### START CODE HERE ### (≈ 2 lines of code)
A1 = cache["A1"]
A2 = cache["A2"]
### END CODE HERE ### # Backward propagation: calculate dW1, db1, dW2, db2.
### START CODE HERE ### (≈ 6 lines of code, corresponding to 6 equations on slide above)
dZ2 = A2 - Y
dW2 = (1 / m) * np.dot(dZ2, A1.T)
db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(dZ1, X.T)
db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)
### END CODE HERE ### grads = {"dW1": dW1,
"db1": db1,
"dW2": dW2,
"db2": db2} return grads
parameters, cache, X_assess, Y_assess = backward_propagation_test_case()

grads = backward_propagation(parameters, cache, X_assess, Y_assess)
print ("dW1 = "+ str(grads["dW1"]))
print ("db1 = "+ str(grads["db1"]))
print ("dW2 = "+ str(grads["dW2"]))
print ("db2 = "+ str(grads["db2"]))
dW1 = [[ 0.01018708 -0.00708701]
[ 0.00873447 -0.0060768 ]
[-0.00530847 0.00369379]
[-0.02206365 0.01535126]]
db1 = [[-0.00069728]
[-0.00060606]
[ 0.000364 ]
[ 0.00151207]]
dW2 = [[ 0.00363613 0.03153604 0.01162914 -0.01318316]]
db2 = [[ 0.06589489]]

Expected output:

dW1 [[ 0.01018708 -0.00708701] [ 0.00873447 -0.0060768 ] [-0.00530847 0.00369379] [-0.02206365 0.01535126]]
db1 [[-0.00069728] [-0.00060606] [ 0.000364 ] [ 0.00151207]]
dW2 [[ 0.00363613 0.03153604 0.01162914 -0.01318316]]
db2 [[ 0.06589489]]

Question: 执行更新参数规则。使用梯度下降算法。你不得不使用 (dW1, db1, dW2, db2) 来更新 (W1, b1, W2, b2).

一般梯度下降规则:。(α 是learning rate;θ 表示参数)

Illustration: 梯度下降算法具有良好的学习速率(收敛) 和 差的学习速率(发散)。图片如下:.

# GRADED FUNCTION: update_parameters

def update_parameters(parameters, grads, learning_rate = 1.2):
"""
Updates parameters using the gradient descent update rule given above Arguments:
parameters -- python dictionary containing your parameters
grads -- python dictionary containing your gradients Returns:
parameters -- python dictionary containing your updated parameters
"""
# Retrieve each parameter from the dictionary "parameters"
### START CODE HERE ### (≈ 4 lines of code)
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
### END CODE HERE ### # Retrieve each gradient from the dictionary "grads"
### START CODE HERE ### (≈ 4 lines of code)
dW1 = grads["dW1"]
db1 = grads["db1"]
dW2 = grads["dW2"]
db2 = grads["db2"]
## END CODE HERE ### # Update rule for each parameter
### START CODE HERE ### (≈ 4 lines of code)
W1 = W1 - learning_rate * dW1
b1 = b1 - learning_rate * db1
W2 = W2 - learning_rate * dW2
b2 = b2 - learning_rate * db2
### END CODE HERE ### parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2} return parameters
parameters, grads = update_parameters_test_case()
parameters = update_parameters(parameters, grads) print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
W1 = [[-0.00643025  0.01936718]
[-0.02410458 0.03978052]
[-0.01653973 -0.02096177]
[ 0.01046864 -0.05990141]]
b1 = [[ -1.02420756e-06]
[ 1.27373948e-05]
[ 8.32996807e-07]
[ -3.20136836e-06]]
W2 = [[-0.01041081 -0.04463285 0.01758031 0.04747113]]
b2 = [[ 0.00010457]]

Expected Output:

W1 [[-0.00643025 0.01936718] [-0.02410458 0.03978052] [-0.01653973 -0.02096177] [ 0.01046864 -0.05990141]]
b1 [[ -1.02420756e-06] [ 1.27373948e-05] [ 8.32996807e-07] [ -3.20136836e-06]]
W2 [[-0.01041081 -0.04463285 0.01758031 0.04747113]]
b2 [[ 0.00010457]]

4.4 - Integrate parts 4.1, 4.2 and 4.3 in nn_model()

Question: 在 nn_model() 里构建神经网络模型

Instructions: 神经网络模型必须按照正确的顺序使用前面的函数。

# GRADED FUNCTION: nn_model

def nn_model(X, Y, n_h, num_iterations=10000, print_cost=False):
"""
Arguments:
X -- dataset of shape (2, number of examples)
Y -- labels of shape (1, number of examples)
n_h -- size of the hidden layer
num_iterations -- Number of iterations in gradient descent loop
print_cost -- if True, print the cost every 1000 iterations Returns:
parameters -- parameters learnt by the model. They can then be used to predict.
""" np.random.seed(3)
n_x = layer_sizes(X, Y)[0]
n_y = layer_sizes(X, Y)[2] # Initialize parameters, then retrieve W1, b1, W2, b2. Inputs: "n_x, n_h, n_y". Outputs = "W1, b1, W2, b2, parameters".
### START CODE HERE ### (≈ 5 lines of code)
parameters = initialize_parameters(n_x, n_h, n_y)
W1 = parameters['W1']
b1 = parameters['b1']
W2 = parameters['W2']
b2 = parameters['b2']
### END CODE HERE ### # Loop (gradient descent) for i in range(0, num_iterations): ### START CODE HERE ### (≈ 4 lines of code)
# Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache".
A2, cache = forward_propagation(X, parameters) # Cost function. Inputs: "A2, Y, parameters". Outputs: "cost".
cost = compute_cost(A2, Y, parameters) # Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads".
grads = backward_propagation(parameters, cache, X, Y) # Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters".
parameters = update_parameters(parameters, grads) ### END CODE HERE ### # Print the cost every 1000 iterations
if print_cost and i % 1000 == 0:
print ("Cost after iteration %i: %f" % (i, cost)) return parameters
X_assess, Y_assess = nn_model_test_case()

parameters = nn_model(X_assess, Y_assess, 4, num_iterations=10000, print_cost=True)
print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))

Expected Output:

W1 [[-4.18494056 5.33220609] [-7.52989382 1.24306181] [-4.1929459 5.32632331] [ 7.52983719 -1.24309422]]
b1 [[ 2.32926819] [ 3.79458998] [ 2.33002577] [-3.79468846]]
W2 [[-6033.83672146 -6008.12980822 -6033.10095287 6008.06637269]]
b2 [[-52.66607724]]

4.5 - Predictions

Question: 使用您的模型通过构建 predict()来进行预测。使用前向传播来预测结果。.

Reminder:

例如,如果要根据阈值将 matrix X 条目设置为 0 和 1,则需要执行以下操作: X_new = (X > threshold)

# GRADED FUNCTION: predict

def predict(parameters, X):
"""
Using the learned parameters, predicts a class for each example in X Arguments:
parameters -- python dictionary containing your parameters
X -- input data of size (n_x, m) Returns
predictions -- vector of predictions of our model (red: 0 / blue: 1)
""" # Computes probabilities using forward propagation, and classifies to 0/1 using 0.5 as the threshold.
### START CODE HERE ### (≈ 2 lines of code)
A2, cache = forward_propagation(X, parameters)
predictions = np.round(A2)
### END CODE HERE ### return predictions
parameters, X_assess = predict_test_case()

predictions = predict(parameters, X_assess)
print("predictions mean = " + str(np.mean(predictions)))

Expected Output:

predictions mean 0.666666666667

使用单个隐藏层,n_h个隐藏单元测试模型。

# Build a model with a n_h-dimensional hidden layer
parameters = nn_model(X, Y, n_h = 4, num_iterations = 10000, print_cost=True) # Plot the decision boundary
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
plt.title("Decision Boundary for hidden layer size " + str(4))
Cost after iteration 0: 0.693048
Cost after iteration 1000: 0.288083
Cost after iteration 2000: 0.254385
Cost after iteration 3000: 0.233864
Cost after iteration 4000: 0.226792
Cost after iteration 5000: 0.222644
Cost after iteration 6000: 0.219731
Cost after iteration 7000: 0.217504
Cost after iteration 8000: 0.219440
Cost after iteration 9000: 0.218553

Expected Output:

Cost after iteration 9000 0.218607

# Print accuracy
predictions = predict(parameters, X)
print ('Accuracy: %d' % float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100) + '%')

Expected Output:

Accuracy 90%

与Logistic回归相比,准确性很高。这个模型已经学会了花的叶子图案!与Logistic回归不同,神经网络甚至能够学习高度非线性的决策边界.现在,让我们尝试几个隐藏层的大小。

4.6 - Tuning hidden layer size (optional/ungraded exercise)(调整隐藏层大小)

您将观察不同隐藏层大小的模型的不同行为。

# This may take about 2 minutes to run

plt.figure(figsize=(16, 32))  # 设置图像大小
hidden_layer_sizes = [1, 2, 3, 4, 5, 20, 50]
for i, n_h in enumerate(hidden_layer_sizes):
plt.subplot(5, 2, i+1)
plt.title('Hidden Layer of size %d' % n_h)
parameters = nn_model(X, Y, n_h, num_iterations = 5000)
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
predictions = predict(parameters, X)
accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)
print ("Accuracy for {} hidden units: {} %".format(n_h, accuracy))
Accuracy for 1 hidden units: 67.5 %
Accuracy for 2 hidden units: 67.25 %
Accuracy for 3 hidden units: 90.75 %
Accuracy for 4 hidden units: 90.5 %
Accuracy for 5 hidden units: 91.25 %
Accuracy for 20 hidden units: 90.5 %
Accuracy for 50 hidden units: 90.75 %

Interpretation:

  • 较大的模型(有更多的隐藏单元)能够更好地适应训练集。直到最终最大的模型过拟合数据。
  • 最好的隐藏层大小似乎在n_h=5左右。实际上,这里似乎与数据很好的吻合。同时也不好引起明显的过拟合。
  • 稍后你还能了解正则化(regularization),他允许你使用非常大的模型(例如n_h = 50),而且没有太多过拟合。

Optional questions:

  • 可以将tanh激活函数改成 sigmoid() 和 relu 激活函数时,会发生什么?
  • 修改学习率(learning rate)
  • 如果更改数据集怎么办?

你已经学会了:

  • 建立一个完整的隐藏神经网络
  • 充分利用一个非线性单元实现前向传播和反向传播,并训练一个神经网络
  • 看看改变隐层大小的影响,包括过拟合。

5 - Performance on other datasets

如果需要,可以为下列每个数据集重新运行整个notebook(减去DataSet部分)。

# Datasets
noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure = load_extra_datasets() datasets = {"noisy_circles": noisy_circles,
"noisy_moons": noisy_moons,
"blobs": blobs,
"gaussian_quantiles": gaussian_quantiles} ### START CODE HERE ### (choose your dataset)
dataset = "noisy_moons"
### END CODE HERE ### X, Y = datasets[dataset]
X, Y = X.T, Y.reshape(1, Y.shape[0]) # make blobs binary
if dataset == "blobs":
Y = Y % 2 # Visualize the data
plt.scatter(X[0, :], X[1, :], c=Y.reshape(200), s=40, cmap=plt.cm.Spectral);

parameters = nn_model(X, Y, n_h=5, num_iterations = 5000)
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y) predictions = predict(parameters, X)
accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)
print("Accuracy: ", accuracy)

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)的更多相关文章

  1. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer

    Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...

  2. Coursera, Deep Learning 1, Neural Networks and Deep Learning - week3, Neural Networks Basics

    NN representation 这一课主要是讲3层神经网络 下面是常见的 activation 函数.sigmoid, tanh, ReLU, leaky ReLU. Sigmoid 只用在输出0 ...

  3. 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 3 - Shallow Neural Networks(第三周测验 - 浅层神 经网络)

    Week 3 Quiz - Shallow Neural Networks(第三周测验 - 浅层神经网络) \1. Which of the following are true? (Check al ...

  4. 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week1 Introduction to deep learning课堂笔记

    Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week1 Introduction to deep learn ...

  5. Neural Networks and Deep Learning

    Neural Networks and Deep Learning This is the first course of the deep learning specialization at Co ...

  6. [C3] Andrew Ng - Neural Networks and Deep Learning

    About this Course If you want to break into cutting-edge AI, this course will help you do so. Deep l ...

  7. 第四节,Neural Networks and Deep Learning 一书小节(上)

    最近花了半个多月把Mchiael Nielsen所写的Neural Networks and Deep Learning这本书看了一遍,受益匪浅. 该书英文原版地址地址:http://neuralne ...

  8. 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week2 Neural Networks Basics课堂笔记

    Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week2 Neural Networks Basics 2.1 ...

  9. Neural Networks and Deep Learning学习笔记ch1 - 神经网络

    近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的. ...

随机推荐

  1. Jquery ajax 数据更新

    $(function(){ var $personWifePs=$("#wife-money tbody tr"); var $personWife=$("#wife-m ...

  2. css CSS常见布局解决方案

    CSS常见布局解决方案说起css布局,那么一定得聊聊盒模型,清除浮动,position,display什么的,但本篇本不是讲这些基础知识的,而是给出各种布局的解决方案.水平居中布局首先我们来看看水平居 ...

  3. spring学习总结(一)_Ioc基础(中)

    本篇文章继续上篇文章讲解Ioc基础,这篇文章主要介绍使用spring注解配置Ioc 上篇文章主要是通过xml配置文件进行Ioc的配置.这次进行改造下,通过注解进行配置 首先先看一个简单的demo 简单 ...

  4. python+django+uwsgi 搭建环境

    第一步: 搭建python环境 最好使用  pyenv可以很好的管理多版本下的python环境 第二步:搭建django环境 使用    pip install django==1.12.1   来安 ...

  5. wordpress文章页两侧添加分页导航箭头

    分页导航 如果添加在文章页的两侧,很方便读者翻阅,小编发现好多站长的博客都添加了这一功能,百度了一下,就是JS和css的功能,经过测试成功,分享一下流程. 1.添加Js 在headr.php或者foo ...

  6. nagios 配置 check_traffic 流量监控模块(Server 端)

    安装软件包yum -y install net-snmp*chkconfig nrpe onchkconfig snmpd onchkconfig nagios on 修改snmp参数,vi /etc ...

  7. 【Luogu1937】仓配置(贪心,线段树)

    [Luogu1937]仓配置 题面 直接找洛谷把... 题解 很明显的贪心吧 按照线段的右端点为第一关键字,左端点第二关键字排序 然后线段树维护区间最小就可以啦 #include<iostrea ...

  8. Linux磁盘和文件系统简介

    Linux磁盘和文件系统简介 1.文件系统:存储设备上存储数据的方式方法 磁盘主要由盘片.机械手臂.磁头和主轴马达组成,而数据的写入实际是写在盘片上,磁盘的最小存储单位为扇区,每个扇区为512字节,扇 ...

  9. 两场CF

    分别是正规赛998和虚拟赛935 998我神速A了前三题之后挂了,第四题是一个打表找规律题然而我并没有想到打表... 然后靠着速度拿到470名,上了蓝名.这告诉我们:输入数据是一个数/两个数(noip ...

  10. CF 991

    843名... 正规比赛肯定要掉分了...... 就算C没WA也是765名...为什么会这么菜呢? A,水.我加了两个特判. B,水.以 n * 4.5 为目标即可. C,裸二分,可耻的WA了一次是为 ...