|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# RNN 用于时间序列的分析\n",
- "前面我们讲到使用 RNN 做简单的图像分类的问题,但是 RNN 并不擅长此类问题,下面我们讲一讲如何将 RNN 用到时间序列的问题上,因为对于时序数据,后面的数据会用到前面的数据,LSTM 的记忆特性非常适合这种场景。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "首先我们可以读入数据,这个数据是 10 年飞机月流量,可视化得到下面的效果。"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import pandas as pd\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "data_csv = pd.read_csv('./data.csv', usecols=[1])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[<matplotlib.lines.Line2D at 0x1168e7588>]"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<matplotlib.figure.Figure at 0x11571ff98>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(data_csv)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "首先我们进行预处理,将数据中 `na` 的数据去掉,然后将数据标准化到 0 ~ 1 之间。"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# 数据预处理\n",
- "data_csv = data_csv.dropna()\n",
- "dataset = data_csv.values\n",
- "dataset = dataset.astype('float32')\n",
- "max_value = np.max(dataset)\n",
- "min_value = np.min(dataset)\n",
- "scalar = max_value - min_value\n",
- "dataset = list(map(lambda x: x / scalar, dataset))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "接着我们进行数据集的创建,我们想通过前面几个月的流量来预测当月的流量,比如我们希望通过前两个月的流量来预测当月的流量,我们可以将前两个月的流量当做输入,当月的流量当做输出。同时我们需要将我们的数据集分为训练集和测试集,通过测试集的效果来测试模型的性能,这里我们简单的将前面几年的数据作为训练集,后面两年的数据作为测试集。"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def create_dataset(dataset, look_back=2):\n",
- " dataX, dataY = [], []\n",
- " for i in range(len(dataset) - look_back):\n",
- " a = dataset[i:(i + look_back)]\n",
- " dataX.append(a)\n",
- " dataY.append(dataset[i + look_back])\n",
- " return np.array(dataX), np.array(dataY)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 创建好输入输出\n",
- "data_X, data_Y = create_dataset(dataset)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# 划分训练集和测试集,70% 作为训练集\n",
- "train_size = int(len(data_X) * 0.7)\n",
- "test_size = len(data_X) - train_size\n",
- "train_X = data_X[:train_size]\n",
- "train_Y = data_Y[:train_size]\n",
- "test_X = data_X[train_size:]\n",
- "test_Y = data_Y[train_size:]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "最后,我们需要将数据改变一下形状,因为 RNN 读入的数据维度是 (seq, batch, feature),所以要重新改变一下数据的维度,这里只有一个序列,所以 batch 是 1,而输入的 feature 就是我们希望依据的几个月份,这里我们定的是两个月份,所以 feature 就是 2."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import torch\n",
- "\n",
- "train_X = train_X.reshape(-1, 1, 2)\n",
- "train_Y = train_Y.reshape(-1, 1, 1)\n",
- "test_X = test_X.reshape(-1, 1, 2)\n",
- "\n",
- "train_x = torch.from_numpy(train_X)\n",
- "train_y = torch.from_numpy(train_Y)\n",
- "test_x = torch.from_numpy(test_X)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from torch import nn\n",
- "from torch.autograd import Variable"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "这里定义好模型,模型的第一部分是一个两层的 RNN,每一步模型接受两个月的输入作为特征,得到一个输出特征。接着通过一个线性层将 RNN 的输出回归到流量的具体数值,这里我们需要用 `view` 来重新排列,因为 `nn.Linear` 不接受三维的输入,所以我们先将前两维合并在一起,然后经过线性层之后再将其分开,最后输出结果。"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# 定义模型\n",
- "class lstm_reg(nn.Module):\n",
- " def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):\n",
- " super(lstm_reg, self).__init__()\n",
- " \n",
- " self.rnn = nn.LSTM(input_size, hidden_size, num_layers) # rnn\n",
- " self.reg = nn.Linear(hidden_size, output_size) # 回归\n",
- " \n",
- " def forward(self, x):\n",
- " x, _ = self.rnn(x) # (seq, batch, hidden)\n",
- " s, b, h = x.shape\n",
- " x = x.view(s*b, h) # 转换成线性层的输入格式\n",
- " x = self.reg(x)\n",
- " x = x.view(s, b, -1)\n",
- " return x"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "net = lstm_reg(2, 4)\n",
- "\n",
- "criterion = nn.MSELoss()\n",
- "optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "定义好网络结构,输入的维度是 2,因为我们使用两个月的流量作为输入,隐藏层的维度可以任意指定,这里我们选的 4"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Epoch: 100, Loss: 0.00395\n",
- "Epoch: 200, Loss: 0.00337\n",
- "Epoch: 300, Loss: 0.00259\n",
- "Epoch: 400, Loss: 0.00149\n",
- "Epoch: 500, Loss: 0.00109\n",
- "Epoch: 600, Loss: 0.00106\n",
- "Epoch: 700, Loss: 0.00097\n",
- "Epoch: 800, Loss: 0.00092\n",
- "Epoch: 900, Loss: 0.00087\n",
- "Epoch: 1000, Loss: 0.00105\n"
- ]
- }
- ],
- "source": [
- "# 开始训练\n",
- "for e in range(1000):\n",
- " var_x = Variable(train_x)\n",
- " var_y = Variable(train_y)\n",
- " # 前向传播\n",
- " out = net(var_x)\n",
- " loss = criterion(out, var_y)\n",
- " # 反向传播\n",
- " optimizer.zero_grad()\n",
- " loss.backward()\n",
- " optimizer.step()\n",
- " if (e + 1) % 100 == 0: # 每 100 次输出结果\n",
- " print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.data[0]))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "训练完成之后,我们可以用训练好的模型去预测后面的结果"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "net = net.eval() # 转换成测试模式"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 46,
- "metadata": {},
- "outputs": [],
- "source": [
- "data_X = data_X.reshape(-1, 1, 2)\n",
- "data_X = torch.from_numpy(data_X)\n",
- "var_data = Variable(data_X)\n",
- "pred_test = net(var_data) # 测试集的预测结果"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 47,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 改变输出的格式\n",
- "pred_test = pred_test.view(-1).data.numpy()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 49,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x120f7f358>"
- ]
- },
- "execution_count": 49,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsnXl4VOX1xz9vEiBAAgkQAlkgYY/s\nsguCK0XU4q64YlWsitaqbe2vrbVqW637glrccK9bXUu1orgAgoKy7yGEhAAhYSeEbO/vjzN3lmQm\nmUkmZOF8nifPZO69c+87Qb/33O973nOMtRZFURSleRHR0ANQFEVRwo+Ku6IoSjNExV1RFKUZouKu\nKIrSDFFxVxRFaYaouCuKojRDVNwVRVGaISruiqIozRAVd0VRlGZIVENduFOnTjYtLa2hLq8oitIk\nWbp0aYG1NqGm4xpM3NPS0liyZElDXV5RFKVJYozJDuY4tWUURVGaISruiqIozRAVd0VRlGZIg3nu\n/igtLSU3N5fi4uKGHkqzIjo6mpSUFFq0aNHQQ1EU5SjRqMQ9NzeX2NhY0tLSMMY09HCaBdZaCgsL\nyc3NJT09vaGHoyjKUaJGW8YY86IxJt8YsyrA/suMMStcPwuNMYNrO5ji4mI6duyowh5GjDF07NhR\nn4YU5RgjGM99NjCpmv1ZwARr7SDgXmBWXQakwh5+9G+qKMceNYq7tfYbYHc1+xdaa/e43i4CUsI0\nNkVRlCbBunXw6acNPQpfwp0tcw3w30A7jTHTjTFLjDFLdu3aFeZLN05iYmIAyMvL44ILLqj22Mce\ne4yioiL3+8mTJ7N37956HZ+iKHXngQfgnHNg376GHomHsIm7MeZkRNx/F+gYa+0sa+1wa+3whIQa\nV882WsrLy0P+TFJSEu+++261x1QW9zlz5hAXFxfytRRFOboUFsKRI/DBBw09Eg9hEXdjzCDgeWCK\ntbYwHOdsKLZs2UK/fv246qqrGDRoEBdccAFFRUWkpaVxzz33MG7cON555x0yMzOZNGkSw4YN48QT\nT2TdunUAZGVlMWbMGEaMGMGf/vQnn/MOGDAAkJvDHXfcwcCBAxk0aBBPPvkkTzzxBHl5eZx88smc\nfPLJgJRoKCgoAOCRRx5hwIABDBgwgMcee8x9zoyMDK677jr69+/PxIkTOXz48NH8cymKAuxxGdNv\nvtmw4/CmzqmQxphuwL+BK6y1G+o+JBe33grLloXtdAAMGQIuYayO9evX88ILLzB27Fh+8Ytf8PTT\nTwOSLz5//nwATj31VJ599ll69+7N4sWLufHGG/nyyy/51a9+xQ033MCVV17JzJkz/Z5/1qxZZGVl\n8dNPPxEVFcXu3bvp0KEDjzzyCPPmzaNTp04+xy9dupSXXnqJxYsXY61l1KhRTJgwgfj4eDZu3Mib\nb77Jc889x0UXXcR7773H5ZdfXsc/lKIooeC4p3PnQn4+dO7csOOB4FIh3wS+A/oaY3KNMdcYY35p\njPml65C7gI7A08aYZcaYJl8NLDU1lbFjxwJw+eWXuwX94osvBuDgwYMsXLiQCy+8kCFDhnD99dez\nfft2ABYsWMDUqVMBuOKKK/yef+7cufzyl78kKkrurR06dKh2PPPnz+fcc8+lbdu2xMTEcN555/Ht\nt98CkJ6ezpAhQwAYNmwYW7ZsqcM3VxSlNuzdCyNGQHk5vPNOQ49GqDFyt9ZOrWH/tcC1YRuRQxAR\ndn1ROXXQed+2bVsAKioqiIuLY1mAJ4uaUg+ttSGlJ1prA+5r1aqV+/fIyEi1ZRSlAdizBy68EIqK\nxJq56aaGHpHWlvHL1q1b+e677wB48803GTdunM/+du3akZ6ezjuuW7S1luXLlwMwduxY/vWvfwHw\n+uuv+z3/xIkTefbZZykrKwNg927JNI2NjeXAgQNVjh8/fjwffPABRUVFHDp0iPfff58TTzwxDN9U\nUZS6UloKhw5BfLxkzCxYIJOrDY2Kux8yMjJ4+eWXGTRoELt37+aGG26ocszrr7/OCy+8wODBg+nf\nvz8ffvghAI8//jgzZ85kxIgR7AuQF3XttdfSrVs3Bg0axODBg3njjTcAmD59OmeccYZ7QtXh+OOP\nZ9q0aYwcOZJRo0Zx7bXXMnTo0DB/a0VRaoPjt8fFQZcu8vv+/Q03HgdT3SN/fTJ8+HBbuVnH2rVr\nycjIaJDxOGzZsoWzzjqLVav8VltosjSGv62iNEc2boQ+feCVV8BauOoq2darV/1czxiz1Fo7vKbj\nGlXhMEVRlKaGE7nHx8uEKjSOyF3FvRJpaWnNLmpXFKX+cHLc4+LANY3WKFaqqrgriqLUAe/I3ZlI\nVXFXFEVp4nhH7k5lbbVlFEVRmjjekfuhQ/K7Ru6KoihNnD17oEULaN0aIiNlW2OI3DXPPcxMmzat\nxuqPiqI0H/buFUvGGGjVSn4aQ+Su4l4N1loqKioaehiKojRi9u4VS8ahfXuN3BslThndG2+8keOP\nP55XX32VMWPGcPzxx3PhhRdy8OBBAO655x5GjBjBgAEDmD59erX1XxRFab7s2SORu0P79o0jcm+0\nnnsDVvxl/fr1vPTSS9xzzz2cd955zJ07l7Zt2/LAAw/wyCOPcNdddzFjxgzuuusuQKo/fvLJJ5x9\n9tnhHbCiKI2eypF7u3Yq7o2W7t27M3r0aD755BPWrFnjLv9bUlLCmDFjAJg3bx7/+Mc/KCoqYvfu\n3fTv31/FXVGOQfbsgfR0z/vGYss0WnFvwIq/7tK+1lpOP/103qzUXqW4uJgbb7yRJUuWkJqayt13\n302xk+CqKMoxhb/IfdOmhhuPg3ru1TB69GgWLFjAJte/VFFRERs2bHALeadOnTh48KBmxyjKMYq1\n/j13jdwbOQkJCcyePZupU6dyxLWu+L777qNPnz5cd911DBw4kLS0NEaMGNHAI1UUpSEoKpJ6MpWz\nZdRzb4RULhx2yimn8MMPP1Q57r777uO+++6rsn327Nn1OTxFUWrJRx/B6NHh7W/qXcvdoV07idwr\nKiCiAb0RtWUURWn2LFwIU6bAc8+F97zedWUc2rcXu8YpRdBQqLgritLs+fOf5dXV0TJseNeVcWjX\nTl4b2pppdOKui4HCj/5NlWOZb76BuXPl93BPdAaK3OvjWqHSqMQ9OjqawsJCFaMwYq2lsLCQ6Ojo\nhh6KojQIf/6z9DZNSwt/NN2YI/dGNaGakpJCbm4uu3btauihNCuio6NJSUlp6GEoylEnMxO++goe\nfBDefbf+xL0xRu6NStxbtGhBuvdSL0VRlDqwY4e8DhwIn38efnGvzpZp6Mi9UdkyiqIo4aSwUF47\ndqyf/PO9eyEmBqK8wuTGYsuouCuK0mypb3GvvDoVGo8to+KuKEqzxUl97Nixfqo1Vq4rAxLJG6OR\nu6IoSr1RWCiWSWysRNROuYBwsXt3VXGPiJDraeSuKIpSTxQWQocOEknXh12Sn++/nEFjqOmu4q4o\nSrOlsFAsGaifLJadO/2Le2MoHlajuBtjXjTG5BtjVgXYb4wxTxhjNhljVhhjjg//MBVFUUKnPsW9\npEQmVBMTq+5rDGV/g4ncZwOTqtl/BtDb9TMdeKbuw1IURak7u3fXn7g7ay39iXuTsGWstd8A1ZXb\nmQK8YoVFQJwxpmu4BqgoilJbHM8dwi/uO3fKayBbpilE7jWRDOR4vc91bVMURWlQ6tOWyc+X1yYb\nuQeB8bPNb+UvY8x0Y8wSY8wSrR+jKEp9UlQExcUecXdWjoYronYi96bsuddELpDq9T4FyPN3oLV2\nlrV2uLV2eEJCQhgurSiK4h/v1alwdG2Zdu3g8GEoLQ3PtWpDOMT9I+BKV9bMaGCftXZ7GM6rKIpS\na5zVqY7n3qqV/ITTlmndWlakVqYxFA+rsSqkMeZN4CSgkzEmF/gz0ALAWvssMAeYDGwCioCr62uw\niqIowVI5cofw5p/v3CmWjPFjTDvivncvdOoUnuuFSo3ibq2dWsN+C9wUthEpinJM8eabUo73xRfD\ne96jIe6Bmm13deUL5uVBr17huV6o6ApVRVEajIoK+OMf4Y03wn/u+hb3/Hz/k6kA3bvL69at4blW\nbVBxVxSlwfjyS9i8GY4ckZ9w4oi747lD/dgy/kh1pZiouCuKckwya5bn9wMHwnvu3buhTRvwbh8c\nrhTFigpZoRrIlmnTRrz27Oy6X6u2qLgritIg7NwJ77/v8afDnRfuvYDJIVyLi3bvhvLywJE7iDWj\nkbuiKMccL78stdVvvlneHw1xD5ctU90CJodu3TRyVxTlGOSLL2DwYBg1St6HOyc8kLgfOCC2Sl1w\nSg8EsmVAxH3rVrB+1+vXPyruiqI0CHl5kJ4e/rIAAGRlUfjTVjq0KfbZ3L69iG1d/f1gIvfu3eHQ\nISkL3BCouCuK0iBs3y5+e72I+6efsru4NR1LfCuhhGvlaLC2DDScNaPirijKUefIEbFNkpLqp/1d\nxU/L2U0HOpbt9NkeLnHPz4fIyKr9U71p6Fx3FXdFUY46O3bIa31F7vt+zKSCSDoW5fpsD9eNxFmd\nGvHZf2HOHL/HNHTkXmP5AUVRlHCT53JLkpIkDz0qKoziXl5O4Wq5e3Tct9lnVzhtmcRE4NZbITYW\nJk+uckxCgnw3jdwVRTk2OHSI7dklgETuxkj0HjZxz8yksLgNAB0KN/rscp4SwmHLdI4rgQ0bPI8h\nlTDGkzHTEKi4K4py9LAWxo4l7/5XAIncIcydi5YtowApxdgpf410snYRjsj9wAFYvx5SIl2VzXfu\nDJhb2ZC57iruiqL45dAhmDtXuhmFjW+/heXL2b48n6go6y6HG9bIffly8iKkuEuSzfVR13CI+5NP\nyuev7/KhbCgrC5jvqJG7oiiNhoMHYdo08ZRPP11K8oaNf/4T2rYlj650aXOACJcChVvcczsNwRhL\nV7bDpk3uXa1bi79fW3Hfvx8eegjOOgtGbv6XZ0cAa6Z7d9kV1htkkKi4K4riw7ffSmmAn/9c3ufk\nhOnEhYXw7rtw9dVs79CfrsVZbjsj3OK+LbYfiQkVtKAMMjPdu4ypWwmCxx+XIP0vvy+GJUs8y2sD\niLuTMZOb63d3vaLiriiKD5tdCSYPPSTL93furP74oHnlFfG/p08nr21vkkqy4KuvgDA2lC4shNxc\nciO7k9ItQsozeok7SBbLrl2hn7q8HB59FKZMgePLf5AGqeefLztrEPeGsGZU3BVF8SErS1L4unSR\nXO6wifvzz8Po0TBwINsPx9G15W7ZRhgj9+XLAdhWkkBysoGePX1sGZAMnbw8fx+unrw8idonTwYW\nLJCN550nrwHE3VnBWpubSV1RcVcUxYesLEhLg4gIESenSFadOHwY1qyBM86gpAQKCgxJPaLdYhw2\ncf/mGzCG3D1tSElBxL1S5J6UJKUPQsV5ounRA5g/H/r1kzfR0QHvgAkJ8lpQEPr16oqKu6IoPmze\nLAW9IIyRu+NLpKd7VqfGF8vsLSLuhw+L01FrrIXXXuPQ+DPYuy+C5GSkgenmzT6pik7kHmq1Rh9x\nX7YMRowQE79Ll4CRu9MFSiN3RVEanKwsl4AhkXtYxN1JR+ze3bM6tYOvuEMdo/dFiyAzk22TrgHw\nRO5HjsC2be7DunaV7JVQJ1U3b5Z6MqlJ5SLmTi+9xMSA4h4VJfVnNHJXFKVB2bNHRM+J3BMT5X2d\n+5t6ibtjiXRNKAuvuL/6KrRuzbaBkwAkcu/ZU/Z5WTPOwqlQfffNm2WCtMW+AplddU5UTeQO0m5P\nxV1RlAYlK0tevW0ZCIPvvmWLhL3JyZ7IPbFcsmdKSuou7iUl8NZbcM45bNsjpQdSUvCUZvTK53Ta\n+oXqu2/e7Hqicb6AcyIVd0VRGjuVxd3J9qizNZOdLaF0VBTbt4vOJ3Q2su/QobqL+5w50tj0iivc\nOeXJyXgeCby6c9Qlck9Px3NX8Bb3ggJZqeoHFXdFURocn0lDPOJe58g9O9sdRefliR5GtIuRfQcP\n1r0U77x50LYtnH4627ZBXJy8JTZW9nuJe20i94MH5W/Qo4fXB527RGKizM4GmDVVcVcUpWE4eBC+\n/BKys8nabImP99RgcWyZsETuLnF3OjAR4xL3AwfqXq0xN1cM8agocnNdUTvIIqaICLe3j+uysbGh\nRe7OE42PLdOli+9rAGvGEfej3UtVxV1RjnUefxxOPRXS0sh6cR7pqR57ISy2TGmpZKukpQF+xP3g\nwdBtmW++keX/Dtu2uRV92zaX3w6SqhgTU6VpateuoUXuPk8027fL0t1WrWRjDeKekCAT0ocOyfvD\nh4O/bl1QcVeUY50NGyRE/9OfyCpJIj3GYy+0aSPaWCdx37ZN8sxdkfuuXa4nAscyqY24/+pX8Nvf\net7n5bnF3SdyB7/inpQUWuReRdwdbweCitzBE70nJsLvfhf8tWuLiruiHOtkZ0OfPlTc8VuySKcH\nvt2LOneuo+fulQZprZR/6dQJn8jdcU+CFveCAsnAAblxbN8OycmUlorGuiN3kJtIGCL3du1ci5Ly\n8nzFvYbHG29xLyyUoXh/vL5QcVeUY50tWyT//EAMJbQi/cAKn911XsjkiHD37hw6JBZFZXEPuRvT\n7t2S3lheLneesjJITmbHDomOfSJ3P+LuRO7B+uBOGqQxyF3BmUwFebyJjQ0qcq88YV2fqLgryrFM\nWZn4GN27e9Igc7/1OaTO4u5E7t26ubNGOnbER9whBHEvLoaiIhl7Xp5n9WlysvvXYCL3w4eDn8B1\n57g7TwmVQ+9qct0btbgbYyYZY9YbYzYZY+70s7+bMWaeMeYnY8wKY0zVbrGKojQ+8vIk+k1Lc2tw\n2p4ffTyLsNgyiYkQHe0Wd5/I3SW8QZf99e56tGWLR9yTkrx13kNsrE+2jOtQIDhrpqLCqyRDYaHc\nVLwjdwhZ3J11BPVJjeJujIkEZgJnAMcBU40xx1U67I/A29baocAlwNPhHqiiKPWAl2XiROdd2AFL\nl7oPSUwUYSovr+U1srPdmTJ+xd0rcg8qkt6923f8Xoq+YYP86tRRBwJG7uB/UrW8XApYOuTliZXk\nk+MeQuTevr0s2tq1S8Q9MdGVg1/PBBO5jwQ2WWs3W2tLgH8BUyodYwHXfDftgVpUS1YU5ajjNdmZ\nnw8tWljas98nzTAxUaLXWi/E8cpx9xH3yEjpexeqLeMt7tnZIu6RkZCYyIIFUok3Pt7r+ACeO/iP\n3B98EAYM8OS2//STvA4cSNXSAw6dOklU74eICLGhnMj9aFgyEJy4JwPejbZyXdu8uRu43BiTC8wB\nbvZ3ImPMdGPMEmPMkl0NUQNTUZo4M2dKg+aw4eWH79oFCQkGk9HPJ3KvU32Zigop9+sSd0f/HKuC\nmJi6ibsTuXfpQoWJZOFCGDu20vEB8tyhauReXCzdlqyFhQtl29KlMpE6ZAhVV6c6xMXB3r0BZ2gT\nEhqnuBs/2yp/g6nAbGttCjAZeNUYU+Xc1tpZ1trh1trhCU4Ve0VRguaxxyTF++uvw3RCxw9v3dol\n7sDw4VVsGajlpOrOnVLUyytyj4z0rICtk7gnJnrEPTmZtWvFjh83rtLxsbGi2l61X2Jj5dKVI/eX\nX5abmDGweLFsW7pUngZiYghsy8TFyfmLivwOuVMnuZHk5DQucc8FUr3ep1DVdrkGeBvAWvsdEA10\nQlGUsFFaKlaBtXDllXVYqu+NKw0SRNQ6dwaGDRMRc4W1dRJ3pxqjq/Z5QYHkikc4ylMXcR86FLsl\nm/JcyXGfP182V4nc/dSXgart9srLpW/siBFw4om+4j5smOugvDzxfKKjfa8RFyeve/f6HXKnTtJ0\nqqKicYn7D0BvY0y6MaYlMmH6UaVjtgKnAhhjMhBxV99FUcJIdrYI0A03SLB6++1hOqlrstMduQ8e\nLPtWrwbqaMs44u6a4Swo8LJkwMcyadfOk+FYLbt3S/g/cCC3Zc1g1PpXKOuayoIFMtZevSodH0Dc\nk5NxV5AE+OADabf6u9/BqFHSbGnLFrnPucXdXxokBCXuTtmBoyXuUTUdYK0tM8bMAD4DIoEXrbWr\njTH3AEustR8BtwPPGWN+jVg206w92mVyFKV5s3GjvF52mQS7n3xSxxM6fvg55wBe4u6E6q7Zz7g4\naNmy2pLlgXHa63lF7j7iHhvrfgRx9HH3bs8NxS+7d0v4n57O8oq+LGUoz+ftZP5yidpNZSPZq8yB\nN927w9y5nvfz5skNxvXnoKQEXnxRfveJ3Gsp7g6NRtwBrLVzkIlS7213ef2+Bqj8MKQoShhxxL1X\nL/l59VVJ0XPqV4XMzp1ygu7dKS6WwDYhAdcKI9z2Rw1tQqsnJ0cyYlzNRAsKoHdvr/0xMe5URid9\ncevWIMW9e3fykQP/7/OT2XMIZszwc3yAyD0tTbS6pERuXk4ue2SkRO4Azz0n33/oni/hu9Yy1pNO\nqnoNZxIhgFfmiHvLllXnYusLXaGqKE2B2bPZ9F0+sbEifE77Tq/WoKHjXrWU5i5F3rkznjxCr6yU\nyv500OTkyGBd4bS7royDl+fucofcwwqII+5paeTTmZEsZs8hucNV8duhWnG31uMcZWV5FhelpIgI\n79gBfdOKiZlyKpxwghzsT52DjNzT073mG+oZFXdFaezMmgVXX83Gedvo1Ut00hH3nJzqP1otXjnu\njrgnJAAtWoggeuVth1poy01OjjsktzaA515J3J11VQFxiXtZcncK6MQkPuWKKfuIi4OhQ/0cX2kl\nrIPTgW/LFhmbt7iDJ3of1sGV8D57Ntx/v0x6VCZIcT9algyouCtK4+arr+CmmwDYuLuD29IIi7h7\nrU71EXcQa6ZS5B6UuJeWinnt4ETuiLaWlgYW97g48byDFffC4rZYIuhMPs+9EMnKlWJ7VKGayB3k\nHrdjh2RLeouvW9wPL5BG21ddJbOtzl3BG8eWCSDuzt9VxV1RFFHCiy6C3r0pvfk2tpQm06t7KeAp\njFVncY+Ph9hYdyaM2+vu0KGKuO/eLRZ9tXz4IZxyCvz4o5jZ27f7TKaCx9IHRNyPHJHvighusLaM\nM+bE1gdo1THGt1iYNwHEPSVFLJItW6r2jgU47TSIjLRMyH5FvlN1REfLTwBxd/6uKu6KosjM4q5d\n8JvfsKXPRMqJoncbMdnbthVd9k7lq5G5c2HtWs/75cuhf3+AqpG7H3GHICZVnQF9/72npm4lca+S\nLQM+1ky1kXtpqSTDx8e78+47p7WpfkwBxL1FC0mHDCTuw4bBnrk/cvyhb+Hkk6u/BnhWqfohNRVe\negmuvrrm04QLFXdFaax4Kc6m6AEA9C5Z7d6dmhpi5H7VVXDHHfJ7WZkUTRkxAhBxb9HCa+Vox45V\nPHcIwppxwumlS/3muIMfWwaqiHvARGpHPL0i984v3l/9mFq3rtJH1cG5nvOndqwah9jvv5Bf6iju\nANOmVap5U8+ouCtKY8VL3DceFHXtVbDIvTskca+okNTHBQtkJdTq1WIyDx8OiCZ36uSVIx4gcq+V\nuLsi9yp1ZaCKuHfvLgG2d1VfH5wxedsyfeOqH5MxfouHgccG2rxZvmPr1pUO+PJLyMjwtNKrjhrE\n/Wij4q4ojZUtWyAqClJS2JgZQWzEQTpnfufeHZK479kjor5vH6xaBT/8INu9Inef3HJH3CsqgFqI\n+6pVstzTGSjBR+5Qje9eSdyjojyJKtVSjbjn5kob2So11ktKYP78mv12BxV3RVGCIitLLI3ISDZt\ngl7xhZgVy92eRWqqRMMBalX54l07YP58Kenbvr17rb57dapDx44i7K5iL507i7MRlLhHRIg3PmeO\nCJ5LwAsKRIydZthAQHEP6Lt7ifvOnTKuKitS/eGnMiTIk0JFhfw5qoj7Tz/BoUP+Fy35o317FXdF\nUYLAK/F640bolVoiCumaSXSyQ4KaVPUW92+/lch9+HC3MlYRd9eKUkdMIyNFSGsU9507YcwY+X3x\nYp+uGQUFcs/wEWPvCdXiYtL2S/9Wt7hXLmhTKXJ3KiXUSDWRO0jCThVxd2yx4yr3JgpAXFyYqrmF\nBxV3RWmsZGVBWpp7FWVaX1edgRUigCHlujsiOXCg5M6vXOm2ZJzdVWwZCD3XPT8fRo70zBymegrK\nVlnABL4LjJ55hvjThhETY8WWycoSr/ullzzHO2a8S9yrLVPgTQ3iDn7E3blrJlduXxGAGmq6H21U\n3BWlMVJUJFFwejp79oj923WAK0F85UqgluJ+3nly3tJS92TqkSNedWUcnGT0UFapHjok405M9FTa\nClbcDx6EH3/ElJeR1vWIRO6ZmSKUf/iDnBs8N5u4OLctExQBxN2rMkLVHPRt22R8Pj5SNcTFyT9U\ncXGQg6pfVNwVJUyENWBzfIn0dHdNl6TebaWuyfLlQC1sGWM8JQ/BZzIVqrdlIAhx914J5Ufcq9SV\nAV9xd5UYTut0SL6+c77t2+Hhhz3jiYvDRkSGbsv4SYWUQl7yD+c3ck9JCdLUp8YSBEcbFXdFCQM/\n/CB66CSI1Bkvcfdp/tO3r0S0yILIhIQQIvdOnWDQILFMEhLcwutoaDDinp9fTb31SuK+goHYVI/n\nvmuXH3F3OkXv2+fuSp3WfrevuJ9yCvzjH7KCyrU69dAhqY9e18gdIM1mEUVZ1RWuubnBWzKg4q4o\nzZEffpD/p//1rzCd0GtVjTtyT0LExqs8Y9DpkI5BHREhyyQvv9xnMhUCeO6VbJmKimqadniJ+7LE\nnzGYFby+ZzIgC2Pz8yVl3IeoKLlLLV/urm3QPTqffftg79b9sv/ZZ8XuuPVWPljbl3Wth3pWp4ZB\n3AdFrGYAK4ncW6nB9bZtBK5p4AcVd0VpfjgC++67YTphVpaIXpcuvpF7UpJnWT8hiLu3Qf3ww/DI\nI+5dfm0ZJ2fRK3J3Kt0GtGa8xH3tNvGpn31bbhIvvywZN5dc4udzsbGwyLM4K62FlFjIzqqQMffu\nDXfdRdFbH3HRj7/jNzvv8CxgCtaWqVTDxpuHOvyNLzlFSiY4lJfL31nFXVGObRyBXb7c01SjTrgy\nZTCGvDzR2bZtkci9pMQtuikpIUbuwI03wrnnutcnuevFVOlZH+oqVS9xd1ylBQtk/vfVV+GMMwKI\ncUyM3HyMgZgYupXLU0tOXoTxvZI+AAAgAElEQVTnhnTnnSzqO41SWjJ3z/HuB5uQInfwG7232ZVN\nPHt9xX3nThF4tWUU5Rhl+XK4+WZycqw72+K998JwXq8cd5+2nU747OrSkZoqdnUAx8GDl7h/8430\nC33iCTn3I49Anz5+VnqGWl9m504R0datycqSX1u0kJoqeXlS2sYvzqRqjx7QrRupxXJ33Jrf2qPe\nUVF8c+pfACgub8mrr8rmWon7wYOeCN7bZ3I6YoOnC0ookXsNZX+PNiruilIXnnoKnnqKnKwyRo+W\nGuBhsWa8xD0vz6v5j/OLy3cPKh3yyBG5A7iUMC9PguQ774TJk2XXu+/6SQqpFLk75VWqjdxd19iy\nRfz1886T6r/x8XD22QE+54j7gAHQuTOJ+zfSogXk7InxUe9v1iYwsM8R4uMq+Owz2RayuO/dKw3A\n//hHee+UZYiKksjdSXlyUpDUllGUYxBr4fPPqcCQuz2S1FS44AKpmbV5cx3Ou3ev/LhW2PiN3CuJ\ne7XpkF4zpocPi57dcotYPcuWyRqhgQP9fK6SuLdsKcF8MOLuuErTp8uuSy6pptdrJXGP2LWT5GTI\nORjvPl9JCXz3HZxyRivOOjsCaz2Nu4PCEfePP5Z/HNdaAffM7IknylOK8w/nRO6h2DLR0TKgRrJK\nVcVdUWpLZiZkZ7OTRErLIujWDc48U3Z9800dzrtsmbz27Yu1lSJ3R+VDidy9vHBHmIcMgU8/leye\niy4K8LlKtgyI1gW8lkvcKyqk8Fd6ulTKffJJT6DsF0fc+/cX4z8/n9SkcnLKu7rFfckSWRs0fjxM\nmeL+OsHjiPtzz8mr8yUccf/5z+XVsWZyc0Woq+RuVoMxjap4mIq7otSWzz8HICdS7JPUVEnsaNEC\n1q2rw3k//FDC3FNOYe9ecVXckXurViI4rsgyOVk0JShxT0z0Sas8/ni4+OJqPtehg4T5zswrYos7\nk5l+r9O5M3l5Ymm75oOZMcN/T2k3jvC6Inf27CG1wyFySPWZJwAJsH/2M/kzBJ0p432NrVvl1XnU\n8c6lb9PGM6nq5LiH2s3aEfdvvpE1CQ0o9CruilJbPv8cunUjp5c0ckhNFeu2d2/fhkchYa3Mdp5+\nOsTE+Oa4OzjpkMiNpEuX4CN3v+cLRIcOPpUhQcR982awObnuhVZlZXD3ny1n7JxNaccu7kyZyo0v\nAhIbK3mSffq4xTy1xQ5ySaGik0fcMzIksI+Jgd/+tponDn84Twcg/fP27pWJVSdyT06WVbVO5L5t\nW2iWjIMj7o8+KnWEw7aqLXRU3BWlNpSVSSOH008np710SXIskoyMOoj78uUimq4yAT457g5e4g5B\npEPWRdzBx5rp0UPskR1X/hZOPpncLWWMHw9/ucfwKZNYUjzAb8u6arnhBkmEb9XKLe7dSjdRSkvy\no5IoL5eUyvHjPR+55x55IggaJ3Lv0gWuuEJ+z8kRcY+MlBnf0aNl9nf3bk/pgVCJi5Nc2E8+kfeV\nbK2jiYq7otSGJUtk4uz008lp2ZPWFNEhSiLcjAyx42tsJu2wcqXkCRYUSNRujDu1pKbIHYJYyJSf\nL5N9rieBVq2CbPfmFA/zmlR10j03byiDLVv48zW5LFsGM/8od6F52/u5I/fu3YO4BojXftll8rsT\nue+VCc+tJV1Yu1YeHk44Icjz+aN9e3nMmTrV80iRm+u7cveKK2Tm9rnn6ibumzd7ajSouCtKE2Pu\nXBHhU08lpyKZVHIwG9YDIu4VFSE8kX/0EbzyitgFb70FY8e6Rc5v5J6cLCuPyssBj7gHLFzmCJhr\nQVRSUpC1sPzUl3GL+w5pSv3T9yWMHw83nrKOgaxg3sYUsrJkvNHRQX5/bxxxzxPvO+dQB3fTqJEj\na3E+h1atpEnJvfd6RNuJ3B3zfuBAOPVUeOgheTyprS0DYjGBiruiNDl++kn+B+7Uia0HO9CNre5Z\n1H795JCgrZmtW6V557p18uNVuTEvTxwFb8uYpCRPT1RE3A8dqiYDzytFMS+v0o2iOvzYMt27gzGW\nzRXdKes3gNUHuzOoy07Iz+dk5rFgTRzr14fgt1fGEffs+QDk5Lfihx8kbdPRy1ozcqQs83VEOzeX\nKnWDb73V0w+wNpG7s5Dp17+WV+dcDYCKu6LUhjVr3B16cgqiSTW5sF4i97595ZCQxL1/f4ngJ0wQ\n68DF9u1+/PFQFzJVEveg/HYQcWvZ0tNvFYnGkxNK2EwP1l/zD0poxaAFz8KTT3Iy8zhcHMF334Xg\nt1fGZZ90KM+ntTlMTo5cftiw0BNXAuKk2uTkUKVu8OTJMiMOtRP3444TX//SS8X70shdUZoQJSUy\naXbccZSWwvbthtT4Q25xb9tWItygxT07W9rRTZwoXZK81NdvpF2duJeXwxtv+NYj8IpOQxL3mBiY\nNAnefts3HTJ+L5vpwQozCIBBm96DrVuZcH4CxlisrUPkbgx07owBUlvlk5kpc8yuviLhw5mFrhy5\nR0RIKk7LltCzZ+jnnTZNngjatfO7TuBoouKuKKGyaZOIaEaGu0Bjaop1izuEkDFjrUTuXr1GvQkm\ncve2kPnsM5mcHDECVq2SnHmXgB04IJoftLiDLC3NyxO/2kWPNjtE3Hd0JirK0u/AEti6lfh3n2PI\nEDHzay3u4MmYidnD3LmSM+/VETA8pKaKBXb4cNWE+WuvlT98lUpqQRIZKa9NQdyNMZOMMeuNMZuM\nMXcGOOYiY8waY8xqY8wb4R2mojQiXE0lOO44txWS2ruVRPOuCLdfP9F6r4DXP3v2iGHuEnfvRhgV\nFQEi98REiTBd4t61q7zNycEzi1tQIBOE55wjan7ZZe7J2ZDE/eyzZT7grbfcm3pEZJFHMt//2IKM\nDEPLGE8NgJNOktda2zLg8d07HHR31wu7uKekyBMT+F8N5cw31IXGLu7GmEhgJnAGcBww1RhzXKVj\negO/B8Zaa/sDt9bDWBWlcbBmjdgHfft6xH1gvGRYuAQjI0OCQmdBZECcA7p1Y8kS8bTvuEMi7KlT\n5ZROxzo3kZHi67pWqUZFiWDn5CBpeG3bipfxy1/Cm2/y/Rub2Nd9UGg57g4xMXDWWfDOO+47T49i\neST55htp7OTNRRfJfary9pBwxL1zCSALcoNOqwwWr/Z/odUxCIHGLu7ASGCTtXaztbYE+BcwpdIx\n1wEzrbV7AKy1gXq1KErTZ+1a8R3atHFrc+pIV3jtKubudByq0ZrxEvfFi8XtefhhicbffhsefDBA\ng4tAue5ZWZKvmJwMzzzD9z0uYfS4KO68M0DOfDBccokUH/vqKwB67P0REK2vLOKjR8v9rU566Yh7\nsjz2jBgRfBvToPEW95DqGIRAp06NPlsmGfCeh891bfOmD9DHGLPAGLPIGDMpXANUlEaHV6ZMdrYE\naLGDXQngtRX37t3ZtEnKm3z4oejza69JFO9X2JKSfEpBusV982a3J1JWBtdfL7b+6697moiELO5n\nnCER/LvvQkUFPfI9XZPqFKEHwhH3NPGuw27JgG8mTH2Je8eOYrkFvZotvAQj7v7+06q8XCIK6A2c\nBEwFnjfGVC79jzFmujFmiTFmyS6nDKmiNCXKy8VMd6n3li0uy6BrV7FDXAraqZPYtjV2ZcrOltS8\nhAQ2bZIEjZ//HFas8Cza9MuQIXKTcRWmSk2F3FyL3ZzlXmn05JNSYPK228TmeeYZuXm0axfid27d\nWmrd/Oc/sH07nUtzadNSml3Up7gPHBpFXJwk7IQd78i9thOnNeGs8G0gayYYcc8FvP4SpAB5fo75\n0Fpbaq3NAtYjYu+DtXaWtXa4tXZ4Qn39QRWlPsnKkkjMFblv2eLKDDEGevXyUfM+faR2VLU4mTLG\nkJkppwiKiRNlxvWLLwDRquJiQ0FRa0hPZ+9e+NOfJG37oYek4OLOnSGsTq3MWWfJk8LHH2OAHl2L\n6dgxhAVRoTB8OHTvTtKE3uzZA2PG1MM1nD9Ehw5SlqA+aALi/gPQ2xiTboxpCVwCfFTpmA+AkwGM\nMZ0Qm6Yu7QoUJWz89FMQE5vB4mTKZGRgrZe4gyx+qaW4l5cTmriPHCkh+P/+B3hSsjfSG3r0YNky\ncQRuuUU0zGmaEbIl4zB5srzOnAnA2ROPcPHF9eCFg9yJtmzxtH6qD1q2FDumviwZaPzibq0tA2YA\nnwFrgbettauNMfcYY1wV7vkMKDTGrAHmAb+x1jbcNLGieHHeeVIDPCzWp5e479olGTE+4p6V5c4q\n6dNHgl0nnc8vLnHftk3WRgW9bqZFC6lB/tlnYK3H4ycD0tPdXr/rAYPLL5dMnNosugREaIcPl9x5\n4G+PtnZ0vunSo0cd/iBB0MDiHhXMQdbaOcCcStvu8vrdAre5fhSl0VBU5C47zoMP1tARKBhWrpRM\nlPbtyXatynen6fXuLcK+ZQv06uWuhbJpk7TtrEJJiSyW6daNzEzZFHTkDmLNfPABbNxIWs8+tIoq\nY22ZS9z/KXOgjnbFx0uHOW+rOWTOPFOqYSYkyPxCU+fFFz0LjuoDp4tTA2XM6ApVpVnjrOlJTIT7\n7qtj74RVqyQ/0TXDV6UphVOTxGXNOOLutXDVl23bJJWlWzf3uEIWd4D//Y/ISOjbbjvrWg6GNm1Y\nu1YWUnnbJqed5ql7UyucHoJ1Wn7aiOjbN8Q/eIg0dltGUZoyjuf94otis/7+97U8UUWF5BW2bw9/\n/ztA1brllcTd0Y2AvnulNMgWLUJ0CXr2FGvB5btnRG1krRF/Zu1aTzpm2Bg2TEz73lVyJRR/REdL\nelJjtmUUpaniCOv48XDuuVKGvVbMmgULF0rHIFem15YtUr7bqfJK585Sn9cl7m3bilgHFHdn+bvL\nlunRoxYuwc9+JmMqLKTfkRW8feQk8vPloSDs4h4RAfPm1SKX8himAVepauSuNF8KC9m4voKkJPGf\n+/eXVZoh9yxesQJuv10aOTgt2hBt9nEojAktY2azK6EsJYVNm2rpENx0k9QouPtuMvYvxhLBxx/L\nLqeufFjp06d+s1iaGyruihJmCgqgZ082fLXN7X07mSMh9TctLJTiW3Fx8OqrPia2Txqkgx9xX7/e\n1SWpoMDT1WjTJtY8/F/e6HUXNrq1ewFTyPTvD7/4BcycSYZdDcC//y27wh65K6Gj4q4oYeapp2Df\nPjZuj3FbxI64O9mMQXHVVeJx/PvfPit2quS4O/TuLTtKpOhVnz7ypFBYiPhCaWnwyCOsnXw74w/N\n4bJNf+H++yVdstZze3/5C0RH04cNRERY5s6VYmK1ulko4aUB68uouCvNj0OH4Kmn2EM8u0rj6dND\n8s67d5eV9EGLe1GRLLm/7TYYNcpnV2GhXKZKtcLevWXyNSsL8GSnbFhvxd4Bsm9/nIkbnyIqLoZx\n4+D//k+OqbW4JyXBHXcQHVFKerdySkpkGPW18FIJAY3cFSWMvPii+O2X3Q1AbyM2SWSk+NCrVwd5\nHscT95Ok7syFVoncHQ/I5f04bzcsK4L9++HPf+bOExewr3UX/vdVKz74wHOOOkXaf/4zrFhBxgDJ\nkVBLppHQsaPU7Hc1Mz+aqLgrzYuyMqmZO3YsG0+4CoA++Qvcu487LoTIvZrk8yo57g6DB0vO5cKF\n7v1RUbBhqavtXXo6q/emMOHUFgwaJP/vf/KJRO91SrmOjIT+/d2TqPUymaqETseO4uGFPItfd1Tc\nlQZn4UIRIycarhMffywn+s1v2LCzPRGU02Ptf9y7jztOSuPu3x/EuRxx9xNSO7uqiHvr1lL35euv\nAY/3vWGtRG62exqbN/uesn9/+Otfw9MA2onYNXJvJDTgQiYVd6VB2b9f6p6sXw8LFtR8fI0884ys\nsT/rLDZsgO6xu2m16Gt3vztnUnXduiDOtWmT/M8ZH09pqdjvl14q1QfuvFN2xVUpbA1MmABLl8LB\ng4ArHTJbWtHlx/Tg0CF3Vd6wc/LJ0l1v/Pj6Ob8SIiruyrHKrbdKoG1MiCmK/ti0CT7/HK67DiIj\n2bgR+nQvEc/TdfKQMma8ks8vuECq3n72mQjogw9WsyBq/HjxWF3WTJ8+sDG/PRXt4sgslLtBfWWy\npKfLvG2AftvK0aZTJ1n0VW31uPpBV6gqDcbcufDSS/CHP0j/5TqL+6xZ4j1fey3WyuKhMefEwCrg\n22+hf3969BBLPGhxHzeO8nJZ4X/llfDcc/L5ajnhBBnHN9/AxIn06QPF5S3JTR7lLhCmaYrHCCNG\nwL59DXJpjdyVBuPdd2W1/l13iUcclFXiUFTkm/Zy+LBkyZxzDnTtytat0n2o/5h2sqLyu+8A8cD7\n9g1C3I8ckdovvXqxZYssAh0/PghhB1kOO2yY23d3Z8zEi7gb4+6Epyj1hoq7cvRxCfPcuWJxtGwp\n4r5hg7sUes08/LA0dbjqKpg/XzozFxbCjBmAtJcDGDLUyHFejwXHHRdEOmRWlmQ59OrlvhE4lk5Q\nTJgA338Phw/Tp7d0pdwQPZDMTKk306pVCOdSlFqg4q4cXayFCy8ka8BZZGbCaRnbABH30lJPanmN\nrFghFffeeANOPBF27JCcwpNOAmD5comQBw5EUnHWrXPVAJBtW7bUkDHjlQbp1Z8jeMaPl1WqixfT\nNWoXbTnIhvJeVTJlFKW+UHFXji4vvQRz5vDF0N8AcNpjZ8GuXe687KB99w0bJOxfvFiSxFet8tQb\nRyL33r1dPSX69hWPZscOQHpLg3vBqH8qiXtSUoDMmECMGyce0Jw5mC1Z9GEDGw52dVd/VJT6RsVd\nOXps3SrpMRMmMLf3DSR1PEK/I8vgp588beKCEfeKCinO1acPHH+8JIlXari+fLnXwlLnzuEy9Z3t\njnXjl02bpJZvx46sWROiJQNyJzjjDHj9dcjMpC/r+Sm7Azt3auSuHB1U3JWjg7VwzTVQUUHF8y/y\nxZeG004DA7B8Oe3bS12uoCZVt22TCVRnprIS+/eLveNE6O4CL66WSMnJkn5co7j36kWFNaxdWwtx\nB0mvycuDF1+kDxvYUSDFXlTclaOBirtSfxQWSpoJwD//KbmPDz3EioM9KCiA085sJbOLLn8kIyPI\nyN0pkB5A3B27xR25JyeLP+8Sd2NE+Jcvr+YaLnHPyZEU5VqJ+1lnSfT/xRf0idnu3qzirhwNVNyV\navn66xoiXH+sXAlTp0pnol694PHH4Y47pInn9dfz2Wdy2KmnAoMGVRF317xnYGoQd3emjBO5R0RI\n9O71WDB4sAzTX3aO3bef2ZvHk991cO0yZRyio+Hii2WoqYfdm1XclaOBirsSkL174eyzpQlR0Bw4\nAGPHylr9m2+WHPNbb5VFPS+8gMXw8stSfiUpCRH3tWuhpISMDPl4Xl4N19iwQSLxpCS/u5cvF9vF\nZ3ffvj6dqocMkVT2Kl2SfvyRef1ncLV9kWsWXedOmayVuINYM0DvvvK/Wny8/ChKfaMrVJWAPPus\niO2qVSF8aPVq+dD777Nr7DmUHqmg6/x3MEldoVs3Fi4QLX/hBdfxAwdKDuT69fTrNxCQ/cnJ1Vxj\n40ZJhQlQaWvZMhFvr6ZJMqn61lvi1bdu7TOp6hbuVatgzBieiPgQYyyfLOrEmnx5AHFKhITMCSfA\n5MnETZlA54VaFkA5emjkrviluBgee0wC7vx82LUryA+uXCmvgwYxahQkp0aQMONi7pwzHmulQkBs\nrNutkMgdYMUKyUmnBi8cJNx2WTIrV0oGZH6+7CorE42uUoK9b1/xe1wpjv36yeIpH8vp/vvJiurN\nR0d+xm9+Yxg0SCZmax21g9xh/vMfmDaNyy6D88+vw7kUJQRU3BW/vPIK7NwpVjmE0OBi5Upo25b9\nHdLIypI5xfHj4YEH4JZb4O23pQpk27au4/v2lZZBK1bQubN0Nlq8uJrzOyudXOL++ecwZ47UCrMW\n/vEPuTGNG1fpc5UyZlq2lFK77htJdjb861/MzHiSiAjDLbfIHLBxLXANB488ItUkFeVooOKuVKG8\nXKoeDh/uXs0fmrgPGEBmlvyndfXV8N57cP310ta0uBimT/c6vkULCY1dk6qjRtUg7llZMkCXWG/d\nKps/+kgyLf/4R7jsMikx44Mz+VppUtUduT/2GIdoywsbJ3DBBWILjR4tBcN+//sgv7uiNCLUc1eq\n8P774l68846IXPv2QYq7tSLu557r0+fCGJg5U9Ye7dnjlcXiMGgQfPEFIOL+9tuymLRLF69jjhyR\nE1XKlMnOliybrl1l8euQIWL9+PjtII8Kqak+k6pDh8Ls2ZC7ai8pzz3HvBP/wt6vIrj2Ws/HTjst\niO+tKI0QjdwVH6wVC6V3bzj3XBHJ/v2DnFTduVNy2wcMqNLEKDJSRPedd/x8btAgSZEpKHD3ofaJ\n3tevl0F06wZPPinbevcGJHJPTxcb6brr5MbUpk2A8fXvL000XDjX+v7pJXDoEIt7XkpkJIwZE8R3\nVZRGjoq74sO8ebBkiXjtkZGyrX9/idxrzD93JlMHSvXDLl2k+m2NDBsmr599xvHHS0mW77937fv2\nW1Hb/ftF0P/3P2mA0KEDIOLerZs8Ycya5aftnTeTJ0sqjit6HzxYXKHFC8shLo7F2V0YMMBrPkBR\nmjAq7oqH4mIeuDGbxFZ7uPJP3eHppwGZUNy9WwLzavESd68mRjUzYYJ4K/ffT+tWFQwa5IrcKyrg\nootEzBctkuYXc+bAa68BsnK0oCCE9ELHiH//fUDWGA0ZAoszO1IxbATf/2Dc0byiNHVU3BXhs8/Y\n2W8C/1vfnZtiXiG6ogj+/W9AIncIwppZtQoSEyEhgU2bQliJGREhs5arVsF//sOoUfDDD1CxYpWY\n73/4g5RSNEaKcf3sZ4A0ugbJsAmK1FTpjOMSd4BRw8pYcrAfa3ucyb59qLgrzYagxN0YM8kYs94Y\ns8kYEzCZyxhzgTHGGmOGh2+ISr3z008waRJryiUDZfSbv4ILLxRvpLzcLe41Tqq6MmUOH5baXkFH\n7iDlCtLS4K9/ZdRIy/79sO7Nn2TfKaf4/Uh2tryGtDDo3HPle+XmAjCqcxaHiOGl/MnyXsVdaSbU\nKO7GmEhgJnAGcBww1RhTZVmHMSYWuAWoLpFNaYy88w5ERrL2FrFhMjKQPMADB2DdOhITxeKuVtzL\ny+WAgQPdDTdCEveoKPjd72DxYka5/hNa/Nke8dlTU/1+xEmDDEnczztPXj/4AIBR5dLE+oWvehIb\n66kOrChNnWAi95HAJmvtZmttCfAvYIqf4+4F/gEUh3F8ytHggw9gwgTWbo0hNta19N8JYRctci/k\nqba5xfz5srTf5bdDLQpkTZsGiYn0eeevxMZafloTHTBqBxH3yMiAJWb807ev3L3eew+AXlmf08Hs\nYe++CEaM8EwiK0pTJxhxTwZyvN7nura5McYMBVKttZ+EcWzK0WDDBskgOecc1q2TyNUYJGKOj3fn\nJI4bJ1k0hYV+zrFjB1x6qeQknneedxOj0IiOhptuImLOJwxMzGd5aYardKR/srPlRhQV6mqNK6+E\nr76CuXMxS35gZII8aqglozQnghH3ystBANxJccaYCOBRoMbagcaY6caYJcaYJbuCLlaihA1rq9a4\n/fBDeZ0yhbVrvWyJiAgp3bhoESCJJuXlUibFh9JSyWjZs0cmKuPiyMwUG6dW1Q9/+UuIjmZQ9ses\nYBB2wknuXQsWSGLNxInyfuvWECZTvbn1VrnzTJ8OGzYwakARIF9XUZoLwYh7LuBteqYA3kVZY4EB\nwFfGmC3AaOAjf5Oq1tpZ1trh1trhCZXaoinBU1gohbIOHgzxg7ffLv6110IePvgAjj+e/XHd2Lat\nUhPo0aPdVR6HDRP7w7kXAJKqePXVkov+3HPual0hZcpUJiEBrrySQaVL2Us8uUfkv5M//EGeHhYt\nknoyK1d6ctxDJjpa0jyzsgA4/+Ioxo6VG4eiNBeCEfcfgN7GmHRjTEvgEuAjZ6e1dp+1tpO1Ns1a\nmwYsAn5urV1SLyM+xnn6aUn7TkyUMrTO5GWNbN0qxV127oSTTpJJ1I8+gu++c1syUEncR40SAV+y\nhIgImDIFPvvM1VzJWik88/rr8Le/SUEXFyHluPvj1lsZhBj8K1bIE8PTT0v1x/XrxRd/7TVJhax1\nCd3TT4dLLoGoKAZe2I/587XOutK8qFHcrbVlwAzgM2At8La1drUx5h5jzM/re4CKLx98INb2o4+K\nwzJ7dpAfvP9+eV2wQFIOL7pI1Brg/PPd7e18xN3xKVy++5QpsnDoiy+AV1+FZ56B3/6WBSfeyfTp\nsiK1fXsJiOsk7hkZDPjo74CI+48/SuOQyy+XoZ92mqxGLSurpS3j8MIL8t1U1ZXmiLW2QX6GDRtm\nldA4fNja6Ghrb71V3k+caG23btaWl9fwwZwca1u2tHb6dGuttd/896C9eFyOPfLFt7LPWnvnndZG\nRVlbUlLps336WDtmjLUVFba42NrYWGuvvdZae+aZ1qan2y/mVliwtm1bay+5RMZ2xx3WbtlS9++b\nlibn/NvfrAVrd+6U7bNny3uwds6cul9HUZoSwBIbhMZqVcgmxIIFYok4lQqvukrckK+/hpNPruaD\nf/+72Cuu2rV//Htbvpnflp9lp3C1K9Nw7VpJkGnRotJnb79d6vW++SatLr2UyZPh448sFfu+JOL6\n6/j4E0N0tNT9atcuvN/Xaa+any92fufOsv3cc2VIR45oZyNFCYSWH2hCzJ0raX/jx8v7c86RrkYv\nv1zNh1atkq4T114LaWksWyYlWiIjpbFFRYUctnZtJUvG4ZprpLD7HXfA/v2cfTbszDcsPdIfzj6b\nefOkk1y4hR1E3Nevl5uad+nddu2kCQiouCtKIFTcmwozZzL3idWMjl9H7HuzASlte/HF8O67ATJn\nrIVf/UrU8N57AamY26YNPPGE9K34+GMoKYHMzADiHhkpxdh37IC772bSJIgwFfyn5XkU9h/P8uU1\nPDXUgUGDZDL1yJGqdcrNwTUAABGhSURBVNXvvVe+Q2xs/VxbUZo8wXg39fGjnnsI5OXZwtbJ1lBu\n7459SMzmTz+11lr79dfy9p13/Hzu3Xdl51NPWWut3bXL2latrP3lL60tLRVPe9Aga88/Xw577bVq\nxnDDDXLQe+/ZE1p8b4fFb7LvvSeb5s8P/1e21tp16+T8LVpYe/Bg/VxDUZoaBOm5q7g3MsrLra2o\nqLRx+nT7buRFIqTzSqzt1cvajAxrS0psSYlMZt54Y6XP7NplbXKyqHdpqbXW2nvukX/xVavkkJkz\n5X3HjtbefLO1xcXVDOzwYWtHjrS2RQv7V35vwdoLLrC2TRtrjxwJ17f3paxMJpAnTKif8ytKU0TF\nvQlSWmptaqq1jz7qtXHNGltiWtpTU9fZ2FhXNssHH8g/3ZNPWmutnTRJtN5NRYVks7Rsae3SpdZa\nyV5p08bac87xHFZebu3334cgztu2Wduli11mhrizVSZOrMs3rplnnrH2yy/r9xqK0pRQcW+CrFgh\n/yI9e7qi9x9+sOUDB9tLo96yYO2sWa4DKyqsPfVUazt0sHb3bvvAA/K57dtd+x9+WDY88YT78LPO\nkgg/O7uOg1y50la89rpNSZFL/P3vdTyfoighEay464RqGKmokFIrpaUhfrC4GGbMYOkrUlM3MxMW\nnP8IjBzJ7zKn80bZRfztb9IjFJDKXg8/LO2RHn7YPaH51VfItv/7P1lxNGMGID03PvkE/vKXMGSX\nDBiAuUxSIqH+JlMVRakjwdwB6uOnuUXuxcViqTh2xW9/G8KH33/fWrAzeNK2bVFs20Ycstcyyy66\n6GFrTIWdPt2PD2+ttRdfbG3btrY0L9+2a+dao/TkkzKAZcustdZ+/LG1rVtbO3So23oPC6tXi08f\nznMqilIzBBm5Gzn26DN8+HC7ZEnzKT8zb56UHr/2Wom8Fy2SkrRB1Ue76ir4+GNOiPqeyF3b6dlq\nG/+OvID0XlEUFEgOut888nXrpAfebbdx9roHWb8eNrQdKhUdly7l1VelrtfQoVLN0VkEpChK08UY\ns9RaW2O3O7Vl6srevXDppcy9dyGRkZZHHpG08OJiySmvkdJS+Ogjys6cwrKDvRh2fjpXvT6RA0VR\nrFgBjz9ezQKhfv2k4MpTT3HywAI2boRty/LhF7+gvFwq244eLTceFXZFObZQca8rd98Nb77J3HmR\njC5fQOzbL5CRIZb3U08FUZb3q69g717WjbiCw4dh2JQUJpzbgb594ec/h/PPD+L6rVtz8rMXA/BF\n1CS49FKWLBH7fcYMiImp+9dUFKVpoeJeF1atgqeeYs/Vt7EkYiSnddsoy/R37eJ3v5P+Fc8/X8M5\n3n8f2rRhaetxAAwbJq7KkiVSldf4a5XiTXo6LFjA4JhMUsjhnc43QXw8n34qnz399LB8U0VRmhgq\n7rXFWrj5Zmjfnq9OupuKCsNp950kTaXvuovRo8USee21as5RUSE1fM84g6UrW9K2rbT4BIm2W7YM\nciwZGUQsWsgl/VfxWf4Qdu+WuuvDh0vNd0VRjj1U3GvLm2+KpXLffXzxfSwxMTDqknS46SYpNr58\nOaecAsuXQ1FRgHO89hps3w7nnsvSpTLxWesGzUlJTH3lDErLInj+eSlTPmlSLc+lKEqTR8W9Jr75\nBqZOlcad06bBvn1QUCAFuUaOhOnTmTtXWrS1aIF44HFx8Je/MGaMNJTwmxT0n/9IxcXx4yk/9wKW\nLRNLpi4MHQp9+kg+e0UF/OxndTufoihNl2NC3BctkpTAadNkfY9T5rZGioulFdv//iei/vrr0qLu\n+uslS+b558ndHsn69XDqqa7PxMfLxT7+mNE9pQn4d99VOu9338EFF8DgwZT++2Ou/mUrioo8pXxr\nizFyHyoqko5Io0bV7XyKojRhgkmGr4+fo7WIqaLC2uHDpa5KUpKs7/n3v4P88FNPyQec4iZz5siK\nILD2j3+01lr7xhvy1lXCRVi1SjY+/LDt3dvaKVO89uXlWdu1q7U9e9r9WQV24kQ59L77AixUChGn\nkuL559f9XIqiND7Q2jLCd9/Jt5w5U1ZT9uhh7ahRQQjpkSOy5HTsWN+DFy2y9rbbpEqitfamm6yN\nifGzUnPUKGuPO85eeWWF7dzZdYojR+R8bdrYHfPW2GHDrI2MtPb558P5jaW0jM/NRlGUZoOKu4up\nU61t187aAwfk/dNPy7f+6qsaPjhrlvWumz57trWjR0thRG8GD7b2tNMCf/6Z3222YG1mpnXX3N32\n9Ae2Z095CPjkk7p+Q0VRjiWCFfdm7bnn5Umu+DXXeBbyTJsmqzUfeKCaDx48KK1+RoyAiROxFv76\nV/HuJ06UxUEgNvzKlTBunJ9zXHwxtG7NmPXSA2/h1yWyZPXMM3ll3xQyM+GLL+DMM8P5jRVFUYSm\nLe4HDsCPP8KcOX7zDZ99Vtq03XSTZ1vr1nDLLfDf/0ppFr/cey/k5MBjj4ExLFoEGzfCL34hr5Mn\nS2u6RYtkcnbsWD/naNcOrr6aAR/9jZg25Xz3aibs2gW//jWLF0OvXjBmTFj+CoqiKFVouuK+YgUk\nJWGHDeOlM99h2am3+dTaLV2XyfMPFHJGqy/oeeeF8MYb7n2/+IVklrz9tp/zrloFjzwi4f4JJwDS\ngLp1a3j0UXjlFckhf+YZadwcGVlNVso99xAZ346RLZax8DsDAwZgTz6FxYs1k0VRlHomGO+mPn7q\n7Llfcom1sbH263u+cpfZvbTXIpu3KNvae++177eUtnQfjr3f2m7d5IBHHnF//MQTrR04sNI59+2T\nidCOHa0tKLDWyrxpXJy1l18uh1RUiMceH2/tsGHWHn98DeN8/nl7H/8nzTQeft1u3Wq9+2goiqKE\nBM16QjUrS9JMbr/dXnaZte3bW/vb0V/ZaIrsCBbbEqLsGQk/2KTEMsliKSvzdIGePdtaa+3jj8vb\ndetc59y6VdQ+MtKn2/Rbb8lxn3/uufyyZdYaI9tvuaWGsZaX258GXmHB2hefPWLfeUc+t3hx7b++\noijHLs1b3G+5xdqoKFuwYptt1craGTOsteXl9u2L3rFg7TUX7bfGWPunP3l9prhYQu7ISGv/+1+b\nkyPf/q9/tdbu3i3NpNu1s/Z///O51IQJ1qakyP3Bm6uvls+/9VbNw60oKLTJXUrt+edbe8cd0tq0\n2mbUiqIoAWi+4l5QICuSrrzSPvqofIMVKzy7L79cthkjTaF9OHDA2iFDrI2NtXbFCjtmjHQosjff\nbG1EhHSL9uLLL+Vcjz9edRg7d0q6u5NiWRPXXSeXHTVKfhRFUWpD8xX32bOtBVuxfIXNyJDcc2/2\n7pWFSuedF+DzOTmyVDU11T58W64FazdF9Lb2xhuttdbu2SNRdUWFtePGyaGu9Up14sMPrXtuoEYr\nR1EUJQDBinvTy5a56ipYv56nvx3I2rUwfbrv7vbtYfVqKdrol5QU6RZdUsIFj58IwButpsE991Bc\nLF3revWC3/wG5s+XWjTR0XUf9qmnQqtW8vvIkXU/n6IoSnU0PXEH3ljSh5tvhrPPhiuuqLo/OrqG\nWuhDh8KaNXSbOpaT+ZJXYm7CdujI++/Lwqc2beDhh+U+cO214Rlz27ZScww0DVJRlPonKpiDjDGT\ngMeBSOB5a+39lfbfBlwLlAG7gF9Ya7PDPFYAPv1Ugvfx4+GttyAqqG/ghw4d4NVXuWrYHqb9uj0L\nF0oZ9h49YM0aaXbRtasn2g4Hrt4e9OwZvnMqiqL4w4iFU80BxkQCG4DTgVzgB2CqtXaN1zEnA4ut\ntUXGmBuAk6y1F1d33uHDh9slfgudV09mJtx5J7zwQjWNo0Pg4EHo0kWsknnz4O9/l/MriqI0Rowx\nS621w2s6LhhbZiSwyVq72VpbAvwLmOJ9gLV2nrXWWf+/CEgJdcDB0rOn1IsJh7CD1Jw5/3wR9qgo\nqT2jKIrS1AlG3JOBHK/3ua5tgbgG+G9dBnW0ueoqeZ0yRaJ4RVGUpk4wjrXxs82vl2OMuRwYDkwI\nsH86MB2gW7duQQ6x/jnpJMmKufTShh6JoihKeAhG3HOBVK/3KUBe5YOMMacBfwAmWGuP+DuRtXYW\nMAvEcw95tPVERISU9FUURWkuBGPL/AD0NsakG2NaApcAH3kfYIwZCvwT+Lm1Nj/8w1QURVFCoUZx\nt9aWATOAz4C1wNvW2tXGmHuMMT93HfYgEAO8Y4xZZoz5KMDpFEVRlKNAUFni1to5wJxK2+7y+v20\nMI9LURRFqQNNcoWqoiiKUj0q7oqiKM0QFXdFUZRmiIq7oihKM0TFXVEUpRlSY+GweruwMbuA2laO\n7AQUhHE49YmONfw0lXFC0xlrUxknNJ2x1tc4u1trE2o6qMHEvS4YY5YEUxWtMaBjDT9NZZzQdMba\nVMYJTWesDT1OtWUURVGaISruiqIozZCmKu6zGnoAIaBjDT9NZZzQdMbaVMYJTWesDTrOJum5K4qi\nKNXTVCN3RVEUpRqanLgbYyYZY9YbYzYZYxpNt1NjTKoxZp4xZq0xZrUx5leu7R2MMZ8bYza6XuMb\neqwOxphIY8xPxphPXO/TjTGLXWN9y1XiucExxsQZY941xqxz/X3HNMa/qzHm165/+1XGmDeNMdGN\n5W9qjHnRGJNvjFnltc3v39AIT7j+H1thjDm+gcf5oOvffoUx5n1jTJzXvt+7xrneGPOzozXOQGP1\n2neHMcYaYzq53h/1v2mTEndXs+6ZwBnAccBUY8xxDTsqN//f3v2FWFVFcRz/LDKEjCgLyzIYDalI\nKqUHrR6iP6QiRtCDISQU9BJUEFSDEPQYRNlD2UOREFKQSYlQEdazkZEplWUoplgZlEG9GK0e9r54\nnWbQoOacGfYXDvectffAj9+cvebcte/c9Scey8yrsRQPVW1PYkdmLsSOet0XHlG+xnnAM3i+av1F\naZnYB17A+5l5Fa5TNPfK14i4DA/jhsxchLOU3gd98XQTlo+JTeThCiysx4PYOEkaGV/nh1iUmdfi\nG4xCXV9rcE39mZdqjpgsNvmnVhFxOe7AoaHw5HuamVPmwDJ8MHQ9itGudU2g9d36C96HuTU2F/u6\n1la1zFMW9K3YrrRT/BkzxvO6Q53n4YC6PzQU75WvTvYanq18lfZ23NknTzGCvafzUGm8c+9487rQ\nOWbsbmyu56esf6XnxLIuPa2xLcpDyEFc1JWnU+rJ3b9v1t0JETGCxdiJizPzKNTXOd0pO4UNeBx/\n1esL8WuW5iz0x9sFOIbXagnplYiYpWe+ZuYRPKs8rR3FcezST08HTORhn9fZ/XivnvdOZ21gdCQz\nd48ZmnStUy25n3Gz7q6IiHPxNh7NzN+61jMeEbEKP2XmruHwOFP74O0MLMHGzFyM3/WrtAVqvfou\nzMelmKW8FR9LHzw9Hb28FyJivVL+3DwIjTOtM50RcY7SR/qp8YbHif2vWqdacj+jZt1dERFnK4l9\nc2ZureEfI2JuHZ+LPvSYvQmrI+Ig3lRKMxtwfkQMunP1xdvDOJyZO+v1FiXZ983X23EgM49l5gls\nxY366emAiTzs3TqLiHVYhbVZ6xr6p/MK5Y/77rq25uGziLhEB1qnWnI/bbPuroiIwKv4KjOfGxra\nhnX1fJ1Si++UzBzNzHmZOaJ4+FFmrsXHuKdO64vWH/B9RFxZQ7fhS/3z9RCWRsQ59V4Y6Oydp0NM\n5OE23Fc/4bEUxwflmy6IiOV4Aqsz84+hoW1YExEzI2K+sln5SRcaITP3ZOaczBypa+swltR7ePI9\nnczNh/9oA2OlsmP+HdZ3rWdI183K26wv8Hk9Viq17B34tr7O7lrrGN23YHs9X6Asjv14CzO71ld1\nXY9Pq7fv4II++oqn8TX24nXM7IuneEPZCzihJJ0HJvJQKSG8WNfYHuUTQF3q3K/Uqwfr6uWh+eur\nzn1Y0bWnY8YPOrmhOumetv9QbTQajWnIVCvLNBqNRuMMaMm90Wg0piEtuTcajcY0pCX3RqPRmIa0\n5N5oNBrTkJbcG41GYxrSknuj0WhMQ1pybzQajWnI3/9NqZs4jeSdAAAAAElFTkSuQmCC\n",
- "text/plain": [
- "<matplotlib.figure.Figure at 0x120f56d30>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# 画出实际结果和预测的结果\n",
- "plt.plot(pred_test, 'r', label='prediction')\n",
- "plt.plot(dataset, 'b', label='real')\n",
- "plt.legend(loc='best')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "这里蓝色的是真实的数据集,红色的是预测的结果,我们能够看到,使用 lstm 能够得到比较相近的结果,预测的趋势也与真实的数据集是相同的,因为其能够记忆之前的信息,而单纯的使用线性回归并不能得到较好的结果,从这个例子也说明了 RNN 对于序列有着非常好的性能。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**小练习:试试改变隐藏状态输出的特征数,看看有没有什么改变,同时试试使用简单的线性回归模型,看看会得到什么样的结果**"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
|