├── 02_nlp ├── dataset │ └── textlist.txt ├── origin_stopwords.txt ├── main.ipynb └── cleaning.ipynb ├── README.md ├── LICENSE ├── .gitignore ├── requirements.txt ├── 01_regression └── main.ipynb └── 03_deeplearning └── main.ipynb /02_nlp/dataset/textlist.txt: -------------------------------------------------------------------------------- 1 | akutagawa/ababababa.txt 2 | akutagawa/agunino_kami.txt 3 | akutagawa/aki.txt 4 | akutagawa/imogayu.txt 5 | akutagawa/inuto_fue.txt 6 | akutagawa/rokunomiyano_himegimi.txt 7 | akutagawa/umano_ashi.txt 8 | akutagawa/yabuno_naka.txt 9 | akutagawa/yasukichino_techokara.txt 10 | 11 | dazai/asamasiki_mono.txt 12 | dazai/bishojo.txt 13 | dazai/enten_kandan.txt 14 | dazai/goodbye.txt 15 | dazai/hashire_merosu.txt 16 | dazai/hinotori.txt 17 | dazai/ichimon_itto.txt 18 | dazai/ippo_zenshin_niho_taikyaku.txt 19 | dazai/kahei.txt 20 | dazai/uso.txt 21 | dazai/viyon.txt 22 | 23 | mori/abe_ichizoku.txt 24 | mori/bara.txt 25 | mori/jiisan_baasan.txt 26 | mori/kanazukai_iken.txt 27 | mori/maihime.txt 28 | mori/takasebune.txt 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 実践編Pythonコード 2 | 石川 聡彦 著『人工知能プログラミングのための数学がわかる本』(2018年2月/KADOKAWA社)の実践編で取り扱ったPythonコードです。 3 | 4 | ## Overview 5 | 石川 聡彦 著『人工知能プログラミングのための数学がわかる本』(2018年2月/KADOKAWA社)の実践編で取り扱ったPythonコードです。Amazonなど全国書店で発売中です。 6 | https://www.amazon.co.jp/dp/4046021969/ 7 | 8 | 本著「CHAPTER 5 実践編1 回帰モデルで住宅価格を推定してみよう」が `01_regression`、「CHAPTER 6 実践編2 自然言語処理で文学作品の作者を当てよう 9 | 」が `02_nlp`、「CHAPTER 7 実践編3 ディープラーニングで手書き数字認識をしてみよう」が `03_deeplearning`フォルダのコードに該当します。 10 | 11 | Pythonコードは、コードを実行しながら中身を理解できるように、全てJupyter Notebook形式で幾つかのセルに分けて準備されています。 12 | 13 | ## Requirement 14 | - Python3.4 以上 15 | - Jupyter Notebook環境 16 | - pipでインストールする項目は `requirements.txt`を参照ください。 17 | 18 | ## How to use 19 | - `02_nlp`は、`cleaning.ipynb`を`main.ipynb`より先に実行ください。 20 | - その他のコードは`main.ipynb`を順に実行ください。 21 | 22 | ## ミスの指摘などに関して 23 | ご迷惑をおかけしており大変申し訳ございません。Pull Requestをお送り頂くか、support@aidemy.net までお気軽にご連絡くださいませ。 24 | 25 | ## さらに学習したい方は... 26 | エンジニアのテックカレッジ「Aidemy」がオススメです。Pythonの基礎からディープラーニングまで、今なら一部無料で学習できます。 27 | https://aidemy.net/ 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 AkihikoIshikawa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | 103 | # Mac 104 | .DS_Store -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | alabaster==0.7.10 2 | asn1crypto==0.23.0 3 | Babel==2.5.1 4 | beautifulsoup4==4.6.0 5 | bitarray==0.8.1 6 | bkcharts==0.2 7 | blaze==0.10.1 8 | bleach==2.1.1 9 | bokeh==0.12.10 10 | boto==2.48.0 11 | bs4==0.0.1 12 | bz2file==0.98 13 | certifi==2017.7.27.1 14 | cffi==1.11.2 15 | chainer==3.0.0 16 | chardet==3.0.4 17 | click==6.7 18 | colorama==0.3.9 19 | contextlib2==0.5.5 20 | cryptography==2.1.2 21 | cycler==0.10.0 22 | Cython==0.27.2 23 | cytoolz==0.8.2 24 | dask==0.15.4 25 | datashape==0.5.2 26 | decorator==4.1.2 27 | docutils==0.14 28 | entrypoints==0.2.3 29 | filelock==2.0.12 30 | Flask==0.12.2 31 | Flask-Cors==3.0.3 32 | gensim==3.0.1 33 | get==0.0.21 34 | graphviz==0.8.1 35 | gunicorn==19.7.1 36 | h5py==2.7.1 37 | HeapDict==1.0.0 38 | html5lib==0.999999999 39 | httplib2==0.10.3 40 | idna==2.6 41 | imagesize==0.7.1 42 | ipykernel==4.6.1 43 | ipython==6.2.1 44 | ipython-genutils==0.2.0 45 | ipywidgets==7.0.3 46 | itsdangerous==0.24 47 | Janome==0.3.5 48 | jedi==0.11.0 49 | Jinja2==2.9.6 50 | jsonschema==2.6.0 51 | jupyter==1.0.0 52 | jupyter-client==5.1.0 53 | jupyter-console==5.2.0 54 | jupyter-core==4.3.0 55 | Keras==2.0.8 56 | llvmlite==0.20.0 57 | lxml==4.1.0 58 | Markdown==2.6.9 59 | MarkupSafe==1.0 60 | matplotlib==2.1.0 61 | mecab-python3==0.7 62 | mistune==0.8 63 | mock==2.0.0 64 | mpmath==1.0.0 65 | multipledispatch==0.4.9 66 | nbconvert==5.3.1 67 | nbformat==4.4.0 68 | networkx==2.0 69 | ngram==3.3.2 70 | nltk==3.2.5 71 | nose==1.3.7 72 | notebook==5.2.0 73 | numba==0.35.0 74 | numexpr==2.6.4 75 | numpy==1.13.3 76 | numpydoc==0.7.0 77 | oauthlib==2.0.6 78 | odo==0.5.0 79 | olefile==0.44 80 | opencv-python==3.3.0.10 81 | packaging==16.8 82 | pandas==0.20.3 83 | pandas-datareader==0.5.0 84 | pandocfilters==1.4.2 85 | parso==0.1.0 86 | pathlib2==2.3.0 87 | patsy==0.4.1 88 | pbr==3.1.1 89 | pep8==1.7.1 90 | pexpect==4.2.1 91 | pickleshare==0.7.4 92 | Pillow==4.3.0 93 | pip-review==1.0 94 | post==0.0.13 95 | prompt-toolkit==1.0.15 96 | protobuf==3.4.0 97 | psutil==5.4.0 98 | ptyprocess==0.5.2 99 | public==0.0.38 100 | pycparser==2.18 101 | pycrypto==2.6.1 102 | pycurl==7.43.0 103 | pydotplus==2.0.2 104 | pyflakes==1.6.0 105 | Pygments==2.2.0 106 | pyOpenSSL==17.3.0 107 | pyparsing==2.2.0 108 | pyperclip==1.5.27 109 | python-dateutil==2.6.1 110 | python-louvain==0.9 111 | pytz==2017.2 112 | PyWavelets==0.5.2 113 | PyYAML==3.12 114 | pyzmq==16.0.2 115 | QtAwesome==0.4.4 116 | qtconsole==4.3.1 117 | QtPy==1.3.1 118 | query-string==0.0.12 119 | request==0.0.13 120 | requests==2.18.4 121 | requests-file==1.4.2 122 | requests-ftp==0.3.1 123 | requests-oauthlib==0.8.0 124 | scikit-image==0.13.1 125 | scikit-learn==0.19.1 126 | scipy==1.0.0 127 | seaborn==0.8.1 128 | setupfiles==0.0.50 129 | simplegeneric==0.8.1 130 | six==1.11.0 131 | sklearn==0.0 132 | smart-open==1.5.3 133 | snowballstemmer==1.2.1 134 | Sphinx==1.6.5 135 | sphinxcontrib-websupport==1.0.1 136 | SQLAlchemy==1.1.14 137 | statsmodels==0.8.0 138 | sympy==1.1.1 139 | tables==3.4.2 140 | tensorflow==1.3.0 141 | tensorflow-gpu==1.3.0 142 | tensorflow-tensorboard==0.1.8 143 | terminado==0.6 144 | testpath==0.3.1 145 | Theano==0.9.0 146 | toolz==0.8.2 147 | tornado==4.5.2 148 | traitlets==4.3.2 149 | tweepy==3.5.0 150 | urllib3==1.22 151 | wcwidth==0.1.7 152 | webencodings==0.5.1 153 | Werkzeug==0.12.2 154 | widgetsnbextension==3.0.6 155 | xlrd==1.1.0 156 | XlsxWriter==1.0.2 157 | xlwt==1.3.0 158 | zict==0.1.3 159 | -------------------------------------------------------------------------------- /02_nlp/origin_stopwords.txt: -------------------------------------------------------------------------------- 1 | 、 2 | の 3 | 。 4 | に 5 | は 6 | て 7 | を 8 | た 9 | 《 10 | 》 11 | が 12 | と 13 | で 14 | し 15 | も 16 |   17 | 」 18 | 「 19 | ない 20 | な 21 | い 22 | だ 23 | か 24 | ある 25 | から 26 | へ 27 | う 28 | まし 29 | いる 30 | その 31 | ます 32 | 人 33 | こと 34 | ん 35 | れ 36 | それ 37 | 私 38 | もの 39 | よう 40 | 云 41 | さ 42 | ば 43 | 一 44 | です 45 | この 46 | お 47 | ぬ 48 | する 49 | 二 50 | ふ 51 | 事 52 | ず 53 | つて 54 | 来 55 | 何 56 | つ 57 | あり 58 | や 59 | よ 60 | 中 61 | ながら 62 | なっ 63 | せ 64 | 男 65 | ね 66 | 見 67 | そう 68 | 女 69 | 御 70 | 三 71 | 十 72 | 時 73 | なら 74 | あっ 75 | なり 76 | ? 77 | ませ 78 | まで 79 | あの 80 | 顔 81 | 彼 82 | やう 83 | これ 84 | 五 85 | | 86 | ひ 87 | 日 88 | なる 89 | でも 90 | もう 91 | という 92 | ゐる 93 | 出 94 | さん 95 | 言っ 96 | き 97 | だけ 98 | たち 99 | ござい 100 | 上 101 | ゐ 102 | なく 103 | られ 104 | しかし 105 | また 106 | —— 107 | あなた 108 | 假名 109 | 前 110 | る 111 | たら 112 | いい 113 | ばかり 114 | 家 115 | たり 116 | 声 117 | いや 118 | 自分 119 | など 120 | 手 121 | 思っ 122 | おれ 123 | あ 124 | 夫 125 | 遣 126 | … 127 | ひと 128 | どう 129 | じゃ 130 | わ 131 | より 132 | り 133 | なかっ 134 | み 135 | 心 136 | たる 137 | 気 138 | ま 139 | ので 140 | ご 141 | それから 142 | こう 143 | 君 144 | とき 145 | く 146 | 見る 147 | 目 148 | ] 149 | 年 150 | たい 151 | あたし 152 | 少し 153 | 今 154 | わたし 155 | さちよ 156 | 出し 157 | 外 158 | 話 159 | まだ 160 | うち 161 | 間 162 | 様 163 | 位 164 | 又 165 | め 166 | 余 167 | けれども 168 | 方 169 | - 170 | いま 171 | 僕 172 | かけ 173 | 所 174 | 眼 175 | ら 176 | 保吉 177 | 一つ 178 | 後 179 | 誰 180 | え 181 | 我 182 | 居る 183 | まま 184 | 下 185 | 云う 186 | ため 187 | だっ 188 | そんな 189 | くれ 190 | あつ 191 | お前 192 | 者 193 | れる 194 | 犬 195 | ひとり 196 | 口 197 | ほう 198 | す 199 | ぢ 200 | 言う 201 | どこ 202 | 出来 203 | 彼女 204 | 来る 205 | 的 206 | 六 207 | らしい 208 | でしょ 209 | 店 210 | ほど 211 | なかつ 212 | ところ 213 | あれ 214 | なけれ 215 | って 216 | ここ 217 | でし 218 | 下さい 219 | 居り 220 | として 221 | ただ 222 | 無い 223 | くらい 224 | つた 225 | すぐ 226 | じ 227 | 聞い 228 | 右 229 | 知れ 230 | ふと 231 | 感じ 232 | こ 233 | 行 234 | メロス 235 | そこ 236 | 言い 237 | だろ 238 | 思う 239 | 身 240 | 四 241 | 思ひ 242 | け 243 | 思ふ 244 | まい 245 | 同じ 246 | 知ら 247 | 見え 248 | なん 249 | 言葉 250 | 父 251 | 行っ 252 | のに 253 | 忠利 254 | 信子 255 | 國 256 | 度 257 | 光 258 | ゝ 259 | やはり 260 | そうして 261 | だって 262 | 大 263 | 七 264 | 是 265 | 主人 266 | 物 267 | つけ 268 | 第 269 | 馬 270 | 來 271 | にて 272 | ち 273 | 程 274 | ! 275 | 百 276 | 思い 277 | ども 278 | かも 279 | ( 280 | こんな 281 | 子 282 | 知っ 283 | しまっ 284 | わたくし 285 | 人間 286 | ぞ 287 | しよ 288 | 夜 289 | ねえ 290 | ほ 291 | なつ 292 | 母 293 | さえ 294 | 仁 295 | 之 296 | 田島 297 | とも 298 | げ 299 | 酒 300 | ど 301 | 考え 302 | 部屋 303 | 郎 304 | すると 305 | 頃 306 | 利 307 | 立っ 308 | 頭 309 | 殉死 310 | 衛門 311 | 或 312 | 本 313 | よく 314 | 語 315 | のみ 316 | あら 317 | 内 318 | 風 319 | どうも 320 | 言 321 | 歩い 322 | 色 323 | 妻 324 | 婆さん 325 | いっ 326 | 姫君 327 | 持っ 328 | 斯 329 | ) 330 | 八 331 | 自身 332 | わけ 333 | ああ 334 | 々 335 | ろ 336 | 皆 337 | やっ 338 | 勿論 339 | 死ん 340 | そこで 341 | 行く 342 | 申し 343 | とか 344 | 侍 345 | 髪長 346 | 彦 347 | 姫 348 | 其の 349 | 此 350 | 笑っ 351 | ほか 352 | かう 353 | 石 354 | やら 355 | 通り 356 | 朝 357 | あと 358 | 姿 359 | いけ 360 | でき 361 | 氏 362 | 数枝 363 | つい 364 | 居 365 | はいっ 366 | べき 367 | 青年 368 | 半 369 | 得 370 | まあ 371 | 足 372 | 先 373 | 用 374 | うし 375 | 字 376 | 阿部 377 | 忘れ 378 | 帰っ 379 | それでも 380 | もと 381 | 早く 382 | どんな 383 | 弟 384 | 1 385 | ちょっと 386 | キヌ子 387 | 大谷 388 | だい 389 | 彼等 390 | とうとう 391 | っ 392 | 常子 393 | 悪い 394 | 耳 395 | 音 396 | 空 397 | 胸 398 | ばか 399 | しょ 400 | 涙 401 | 有 402 | 道 403 | 山 404 | 窓 405 | 違 406 | やつ 407 | ふも 408 | 子供 409 | 神 410 | 命 411 | 聞え 412 | 行き 413 | 婆 414 | あろ 415 | 少女 416 | 思わ 417 | わから 418 | ほとんど 419 | られる 420 | 様子 421 | 数馬 422 | 乙彦 423 | つき 424 | かみ 425 | 火 426 | 水準 427 | 歳 428 | 金 429 | はじめ 430 | 相手 431 | 名 432 | 書い 433 | 昔 434 | 今日 435 | 伊織 436 | なんて 437 | 例 438 | 微笑 439 | 円 440 | しか 441 | 遠藤 442 | ましょ 443 | 妹 444 | たく 445 | 生活 446 | ゆ 447 | 唯 448 | 信じ -------------------------------------------------------------------------------- /02_nlp/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "# モジュール読み込み\n", 18 | "import csv\n", 19 | "import pickle\n", 20 | "\n", 21 | "import gensim\n", 22 | "from gensim import models\n", 23 | "from sklearn.linear_model import LogisticRegression\n", 24 | "from sklearn.model_selection import train_test_split\n", 25 | "from sklearn.metrics import classification_report\n", 26 | "from sklearn.metrics import confusion_matrix" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 2, 32 | "metadata": { 33 | "collapsed": true 34 | }, 35 | "outputs": [], 36 | "source": [ 37 | "dataset_file_name = './dataset/corpus.csv'\n", 38 | "model_file_name = 'logistic.pkl'" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 3, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "name": "stdout", 48 | "output_type": "stream", 49 | "text": [ 50 | "sum_words: 102532\n" 51 | ] 52 | } 53 | ], 54 | "source": [ 55 | "# csvファイルを扱いやすいフォーマットに変形\n", 56 | "\n", 57 | "with open(dataset_file_name, 'r') as f:\n", 58 | " data = list(csv.reader(f))\n", 59 | "\n", 60 | "texts, label_ids = [], []\n", 61 | "label2id = {}\n", 62 | "idx_label, idx_sentence = 0, 1\n", 63 | "sum_words = []\n", 64 | "\n", 65 | "for counter, row in enumerate(data):\n", 66 | " if counter == 0:\n", 67 | " continue\n", 68 | " label = row[idx_label]\n", 69 | " if label not in label2id:\n", 70 | " label2id[label] = len(label2id)\n", 71 | " label_ids.append(label2id[label])\n", 72 | " word_list = row[idx_sentence].split(' ')\n", 73 | " texts.append(word_list)\n", 74 | " \n", 75 | " for line in word_list:\n", 76 | " for word in line:\n", 77 | " sum_words.append(word)\n", 78 | "\n", 79 | "print('sum_words: ', len(sum_words))\n", 80 | "id2label = {v: k for k, v in label2id.items()}" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 4, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [ 91 | "# テキストとラベルのデータをtrain, testに分割します\n", 92 | "X_train_texts, X_test_texts, y_train, y_test = train_test_split(texts, label_ids, test_size=0.2, random_state=42)" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 5, 98 | "metadata": { 99 | "collapsed": true 100 | }, 101 | "outputs": [], 102 | "source": [ 103 | "# trainのテキストデータから、tfidfで重み付けされた単語文書行列を作成します\n", 104 | "\n", 105 | "# テキストデータから辞書を作成します\n", 106 | "dictionary = gensim.corpora.Dictionary(X_train_texts)\n", 107 | "# 辞書を用いてBoW形式に文章を行列化します\n", 108 | "corpus = [dictionary.doc2bow(text) for text in X_train_texts]\n", 109 | "\n", 110 | "# BoW形式で作成したcorpusをtfidfを用いて重み付けします\n", 111 | "tfidf_model = models.TfidfModel(corpus)\n", 112 | "tfidf_corpus = tfidf_model[corpus]\n", 113 | "\n", 114 | "num_words = len(dictionary)\n", 115 | "X_train_tfidf = gensim.matutils.corpus2dense(tfidf_corpus, num_terms=num_words).T" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 6, 121 | "metadata": { 122 | "collapsed": true 123 | }, 124 | "outputs": [], 125 | "source": [ 126 | "# testのテキストデータから、tfidfで重み付けされた単語文書行列を作成します\n", 127 | "\n", 128 | "# 辞書を用いてBoW形式に文章を行列化します\n", 129 | "corpus = [dictionary.doc2bow(text) for text in X_test_texts]\n", 130 | "# BoW形式で作成したcorpusをtfidfを用いて重み付けします\n", 131 | "tfidf_corpus = tfidf_model[corpus]\n", 132 | "\n", 133 | "num_words = len(dictionary)\n", 134 | "X_test_tfidf = gensim.matutils.corpus2dense(tfidf_corpus, num_terms=num_words).T" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": 7, 140 | "metadata": {}, 141 | "outputs": [ 142 | { 143 | "data": { 144 | "text/plain": [ 145 | "LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n", 146 | " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", 147 | " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", 148 | " verbose=0, warm_start=False)" 149 | ] 150 | }, 151 | "execution_count": 7, 152 | "metadata": {}, 153 | "output_type": "execute_result" 154 | } 155 | ], 156 | "source": [ 157 | "# trainデータを用いて分類器を構築します\n", 158 | "clf = LogisticRegression(C=1, penalty='l2')\n", 159 | "clf.fit(X_train_tfidf, y_train)" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": 8, 165 | "metadata": {}, 166 | "outputs": [ 167 | { 168 | "name": "stdout", 169 | "output_type": "stream", 170 | "text": [ 171 | " precision recall f1-score support\n", 172 | "\n", 173 | " dazai 0.72 0.95 0.82 732\n", 174 | " mori 0.94 0.66 0.78 492\n", 175 | " akutagawa 0.87 0.72 0.79 551\n", 176 | "\n", 177 | "avg / total 0.83 0.80 0.80 1775\n", 178 | "\n", 179 | "[[698 8 26]\n", 180 | " [132 327 33]\n", 181 | " [143 13 395]]\n" 182 | ] 183 | } 184 | ], 185 | "source": [ 186 | "# testデータを用いて分類器の精度を評価します\n", 187 | "y_pred = clf.predict(X_test_tfidf)\n", 188 | "target_names = list(id2label.values())\n", 189 | "\n", 190 | "print(classification_report(y_test, y_pred, target_names=target_names))\n", 191 | "print(confusion_matrix(y_test, y_pred))" 192 | ] 193 | } 194 | ], 195 | "metadata": { 196 | "kernelspec": { 197 | "display_name": "Python 3", 198 | "language": "python", 199 | "name": "python3" 200 | }, 201 | "language_info": { 202 | "codemirror_mode": { 203 | "name": "ipython", 204 | "version": 3 205 | }, 206 | "file_extension": ".py", 207 | "mimetype": "text/x-python", 208 | "name": "python", 209 | "nbconvert_exporter": "python", 210 | "pygments_lexer": "ipython3", 211 | "version": "3.6.1" 212 | } 213 | }, 214 | "nbformat": 4, 215 | "nbformat_minor": 2 216 | } 217 | -------------------------------------------------------------------------------- /02_nlp/cleaning.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import os\n", 12 | "import re\n", 13 | "import sys\n", 14 | "\n", 15 | "import MeCab" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 2, 21 | "metadata": { 22 | "collapsed": true 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "nm = MeCab.Tagger('-Owakati')\n", 27 | "\n", 28 | "# txtファイルを全部読み込んで分かち書きやクリーニングをしていく\n", 29 | "files = [f for f in os.listdir('./dataset/raw_datas') if f.split('.')[1] == 'txt']\n", 30 | "authors = {'dazai': [], 'mori': [], 'akutagawa': []}\n", 31 | "cleaned_data = []" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 3, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "name": "stdout", 41 | "output_type": "stream", 42 | "text": [ 43 | "akutagawa\n", 44 | "mori\n", 45 | "dazai\n" 46 | ] 47 | } 48 | ], 49 | "source": [ 50 | "def clean(raw_text):\n", 51 | " \"\"\"\n", 52 | " ルビや入力者注を削除して一文毎に分割,分かち書き\n", 53 | " \"\"\"\n", 54 | " text = raw_text.replace('\\n', '').replace('\\u3000', '')\n", 55 | " text = re.sub('[[《]', '/', text)\n", 56 | " text = re.sub('[]》]', '\', text)\n", 57 | " text = re.sub('/[^\]*?\', '', text)\n", 58 | " text = text.replace('。', '。\\n')\n", 59 | " text = text.replace('「', '')\n", 60 | " text = text.replace('」', '\\n').split('\\n')\n", 61 | "\n", 62 | " return [nm.parse(t).split(' ') for t in text if t]\n", 63 | "\n", 64 | "for f in files:\n", 65 | " name = f.split('.')[0]\n", 66 | " print(name)\n", 67 | " with open('./dataset/raw_datas/'+str(f), 'r') as f:\n", 68 | " clean_text = clean(f.read())\n", 69 | " authors[name] = clean_text\n", 70 | " cleaned_data += clean_text" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 4, 76 | "metadata": {}, 77 | "outputs": [ 78 | { 79 | "name": "stdout", 80 | "output_type": "stream", 81 | "text": [ 82 | "sorted_stop:13928\n", 83 | "freq_num:417\n", 84 | "cleaned_data:8876\n" 85 | ] 86 | } 87 | ], 88 | "source": [ 89 | "def make_stopdic(lines):\n", 90 | " \"\"\"\n", 91 | " 空白区切りの文の集まりのテキストのリストからストップワードの辞書を作成する。\n", 92 | " \"\"\"\n", 93 | " calc_words = {}\n", 94 | " for line in lines:\n", 95 | " for word in line:\n", 96 | " if word in calc_words:\n", 97 | " calc_words[str(word)] += 1\n", 98 | " else:\n", 99 | " calc_words[str(word)] = 1\n", 100 | " sorted_stop = sorted(calc_words.items(), key=lambda x:x[1], reverse=True)\n", 101 | " print(\"sorted_stop:\"+str(len(sorted_stop)))\n", 102 | " freq_num = int(len(sorted_stop)*0.03)\n", 103 | " n = 0\n", 104 | " stop_words = []\n", 105 | " print(\"freq_num:\"+str(freq_num))\n", 106 | " for data in sorted_stop:\n", 107 | " stop_words.append(str(data[0]))\n", 108 | " #print('High frequency word: ',str(data[0]), str(data[1]))\n", 109 | " n += 1\n", 110 | " if n > freq_num:\n", 111 | " break\n", 112 | " # 作成したストップワードの辞書の保存\n", 113 | " with open('./origin_stopwords.txt', 'w') as f:\n", 114 | " f.write('\\n'.join(stop_words))\n", 115 | "\n", 116 | "make_stopdic(cleaned_data)\n", 117 | "print(\"cleaned_data:\"+str(len(cleaned_data)))" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 5, 123 | "metadata": {}, 124 | "outputs": [ 125 | { 126 | "name": "stdout", 127 | "output_type": "stream", 128 | "text": [ 129 | "akutagawa.txt\n", 130 | "mori.txt\n", 131 | "dazai.txt\n" 132 | ] 133 | } 134 | ], 135 | "source": [ 136 | "# ストップワードリストの作成\n", 137 | "stop_data = {}\n", 138 | "for f in files:\n", 139 | " with open('./dataset/raw_datas/'+str(f)) as f1:\n", 140 | " print(f)\n", 141 | " nm = MeCab.Tagger('-Owakati')\n", 142 | " text = nm.parse(f1.read()).split(' ')\n", 143 | " for word in text:\n", 144 | " if word in stop_data:\n", 145 | " stop_data[str(word)] += 1\n", 146 | " else:\n", 147 | " stop_data[str(word)] = 1" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 6, 153 | "metadata": {}, 154 | "outputs": [ 155 | { 156 | "name": "stdout", 157 | "output_type": "stream", 158 | "text": [ 159 | "14900\n", 160 | "447\n", 161 | "High frequency word: 、 13365\n", 162 | "High frequency word: の 8869\n", 163 | "High frequency word: 。 8102\n", 164 | "High frequency word: に 6747\n", 165 | "High frequency word: は 6410\n", 166 | "High frequency word: て 5906\n", 167 | "High frequency word: を 5388\n", 168 | "High frequency word: た 5329\n", 169 | "High frequency word: 《 4561\n", 170 | "High frequency word: 》 4556\n", 171 | "High frequency word: が 3447\n", 172 | "High frequency word: と 3082\n", 173 | "High frequency word: で 2866\n", 174 | "High frequency word: し 2176\n", 175 | "High frequency word: も 2105\n", 176 | "High frequency word:   1802\n", 177 | "High frequency word: 」 1614\n", 178 | "High frequency word: 「 1575\n", 179 | "High frequency word: ない 1194\n", 180 | "High frequency word: な 1170\n", 181 | "High frequency word: い 1092\n", 182 | "High frequency word: だ 1076\n", 183 | "High frequency word: か 1067\n", 184 | "High frequency word: ある 938\n", 185 | "High frequency word: から 894\n", 186 | "High frequency word: へ 842\n", 187 | "High frequency word: う 832\n", 188 | "High frequency word: まし 727\n", 189 | "High frequency word: いる 712\n", 190 | "High frequency word: その 693\n", 191 | "High frequency word: ます 663\n", 192 | "High frequency word: 人 653\n", 193 | "High frequency word: こと 642\n", 194 | "High frequency word: ん 608\n", 195 | "High frequency word: れ 556\n", 196 | "High frequency word: それ 543\n", 197 | "High frequency word: 私 542\n", 198 | "High frequency word: もの 530\n", 199 | "High frequency word: よう 526\n", 200 | "High frequency word: 云 513\n", 201 | "High frequency word: さ 505\n", 202 | "High frequency word: ば 505\n", 203 | "High frequency word: 一 482\n", 204 | "High frequency word: です 467\n", 205 | "High frequency word: この 448\n", 206 | "High frequency word: お 434\n", 207 | "High frequency word: ぬ 430\n", 208 | "High frequency word: する 420\n", 209 | "High frequency word: 二 409\n", 210 | "High frequency word: ふ 398\n", 211 | "High frequency word: 事 397\n", 212 | "High frequency word: ず 352\n", 213 | "High frequency word: つて 351\n", 214 | "High frequency word: 来 341\n", 215 | "High frequency word: 何 334\n", 216 | "High frequency word: つ 331\n", 217 | "High frequency word: あり 327\n", 218 | "High frequency word: や 317\n", 219 | "High frequency word: よ 308\n", 220 | "High frequency word: 中 305\n", 221 | "High frequency word: ながら 305\n", 222 | "High frequency word: なっ 299\n", 223 | "High frequency word: せ 297\n", 224 | "High frequency word: 男 293\n", 225 | "High frequency word: ね 289\n", 226 | "High frequency word: 見 285\n", 227 | "High frequency word: そう 279\n", 228 | "High frequency word: 女 275\n", 229 | "High frequency word: 御 274\n", 230 | "High frequency word: 三 273\n", 231 | "High frequency word: 十 273\n", 232 | "High frequency word: 時 265\n", 233 | "High frequency word: なら 263\n", 234 | "High frequency word: あっ 260\n", 235 | "High frequency word: なり 254\n", 236 | "High frequency word: ? 254\n", 237 | "High frequency word: ませ 252\n", 238 | "High frequency word: まで 249\n", 239 | "High frequency word: あの 246\n", 240 | "High frequency word: 顔 246\n", 241 | "High frequency word: 彼 240\n", 242 | "High frequency word: やう 240\n", 243 | "High frequency word: これ 240\n", 244 | "High frequency word: 五 235\n", 245 | "High frequency word: | 234\n", 246 | "High frequency word: ひ 233\n", 247 | "High frequency word: 日 233\n", 248 | "High frequency word: なる 230\n", 249 | "High frequency word: でも 223\n", 250 | "High frequency word: もう 220\n", 251 | "High frequency word: という 218\n", 252 | "High frequency word: ゐる 212\n", 253 | "High frequency word: 出 212\n", 254 | "High frequency word: さん 208\n", 255 | "High frequency word: 言っ 198\n", 256 | "High frequency word: き 197\n", 257 | "High frequency word: だけ 193\n", 258 | "High frequency word: たち 193\n", 259 | "High frequency word: ござい 191\n", 260 | "High frequency word: 上 183\n", 261 | "High frequency word: ゐ 181\n", 262 | "High frequency word: なく 179\n", 263 | "High frequency word: られ 178\n", 264 | "High frequency word: しかし 175\n", 265 | "High frequency word: また 173\n", 266 | "High frequency word: —— 167\n", 267 | "High frequency word: あなた 166\n", 268 | "High frequency word: 假名 165\n", 269 | "High frequency word: 前 162\n", 270 | "High frequency word: る 162\n", 271 | "High frequency word: たら 160\n", 272 | "High frequency word: いい 158\n", 273 | "High frequency word: ばかり 156\n", 274 | "High frequency word: 家 156\n", 275 | "High frequency word: たり 155\n", 276 | "High frequency word: 声 154\n", 277 | "High frequency word: いや 151\n", 278 | "High frequency word: 自分 151\n", 279 | "High frequency word: など 146\n", 280 | "High frequency word: 手 145\n", 281 | "High frequency word: 思っ 145\n", 282 | "High frequency word: おれ 144\n", 283 | "High frequency word: あ 143\n", 284 | "High frequency word: 夫 143\n", 285 | "High frequency word: 遣 143\n", 286 | "High frequency word: … 142\n", 287 | "High frequency word: ひと 142\n", 288 | "High frequency word: どう 141\n", 289 | "High frequency word: じゃ 140\n", 290 | "High frequency word: わ 139\n", 291 | "High frequency word: より 137\n", 292 | "High frequency word: り 137\n", 293 | "High frequency word: なかっ 137\n", 294 | "High frequency word: み 136\n", 295 | "High frequency word: 心 136\n", 296 | "High frequency word: たる 133\n", 297 | "High frequency word: 気 132\n", 298 | "High frequency word: ま 131\n", 299 | "High frequency word: ので 131\n", 300 | "High frequency word: ご 131\n", 301 | "High frequency word: それから 130\n", 302 | "High frequency word: こう 129\n", 303 | "High frequency word: 君 125\n", 304 | "High frequency word: とき 122\n", 305 | "High frequency word: く 121\n", 306 | "High frequency word: 見る 120\n", 307 | "High frequency word: 目 120\n", 308 | "High frequency word: ] 119\n", 309 | "High frequency word: 年 118\n", 310 | "High frequency word: たい 118\n", 311 | "High frequency word: あたし 118\n", 312 | "High frequency word: 少し 115\n", 313 | "High frequency word: 今 114\n", 314 | "High frequency word: わたし 114\n", 315 | "High frequency word: さちよ 114\n", 316 | "High frequency word: 出し 113\n", 317 | "High frequency word: 外 113\n", 318 | "High frequency word: 話 113\n", 319 | "High frequency word: まだ 111\n", 320 | "High frequency word: うち 110\n", 321 | "High frequency word: 間 109\n", 322 | "High frequency word: 様 108\n", 323 | "High frequency word: 位 107\n", 324 | "High frequency word: 又 107\n", 325 | "High frequency word: め 107\n", 326 | "High frequency word: 余 107\n", 327 | "High frequency word: けれども 106\n", 328 | "High frequency word: 方 105\n", 329 | "High frequency word: - 102\n", 330 | "High frequency word: いま 101\n", 331 | "High frequency word: 僕 101\n", 332 | "High frequency word: かけ 100\n", 333 | "High frequency word: 所 100\n", 334 | "High frequency word: 眼 100\n", 335 | "High frequency word: ら 99\n", 336 | "High frequency word: 保吉 98\n", 337 | "High frequency word: 一つ 98\n", 338 | "High frequency word: 後 98\n", 339 | "High frequency word: 誰 98\n", 340 | "High frequency word: え 98\n", 341 | "High frequency word: 我 97\n", 342 | "High frequency word: 居る 97\n", 343 | "High frequency word: まま 96\n", 344 | "High frequency word: 下 96\n", 345 | "High frequency word: 云う 96\n", 346 | "High frequency word: ため 95\n", 347 | "High frequency word: だっ 95\n", 348 | "High frequency word: そんな 95\n", 349 | "High frequency word: くれ 94\n", 350 | "High frequency word: あつ 94\n", 351 | "High frequency word: お前 94\n", 352 | "High frequency word: 者 93\n", 353 | "High frequency word: れる 93\n", 354 | "High frequency word: 犬 91\n", 355 | "High frequency word: ひとり 91\n", 356 | "High frequency word: 口 90\n", 357 | "High frequency word: ほう 90\n", 358 | "High frequency word: す 89\n", 359 | "High frequency word: ぢ 88\n", 360 | "High frequency word: 言う 88\n", 361 | "High frequency word: どこ 88\n", 362 | "High frequency word: 出来 88\n", 363 | "High frequency word: 彼女 88\n", 364 | "High frequency word: 来る 87\n", 365 | "High frequency word: 的 87\n", 366 | "High frequency word: 六 86\n", 367 | "High frequency word: らしい 86\n", 368 | "High frequency word: でしょ 85\n", 369 | "High frequency word: 店 84\n", 370 | "High frequency word: ほど 84\n", 371 | "High frequency word: なかつ 84\n", 372 | "High frequency word: ところ 84\n", 373 | "High frequency word: あれ 83\n", 374 | "High frequency word: なけれ 83\n", 375 | "High frequency word: って 83\n", 376 | "High frequency word: ここ 82\n", 377 | "High frequency word: でし 82\n", 378 | "High frequency word: 下さい 82\n", 379 | "High frequency word: 居り 81\n", 380 | "High frequency word: として 80\n", 381 | "High frequency word: ただ 80\n", 382 | "High frequency word: 無い 80\n", 383 | "High frequency word: くらい 80\n", 384 | "High frequency word: つた 78\n", 385 | "High frequency word: すぐ 77\n", 386 | "High frequency word: じ 77\n", 387 | "High frequency word: 聞い 77\n", 388 | "High frequency word: 右 77\n", 389 | "High frequency word: 知れ 76\n", 390 | "High frequency word: ふと 76\n", 391 | "High frequency word: 感じ 76\n", 392 | "High frequency word: こ 76\n", 393 | "High frequency word: 行 76\n", 394 | "High frequency word: メロス 76\n", 395 | "High frequency word: そこ 75\n", 396 | "High frequency word: 言い 75\n", 397 | "High frequency word: だろ 75\n", 398 | "High frequency word: 思う 75\n", 399 | "High frequency word: 身 75\n", 400 | "High frequency word: 四 75\n", 401 | "High frequency word: 思ひ 74\n", 402 | "High frequency word: け 74\n", 403 | "High frequency word: 思ふ 74\n", 404 | "High frequency word: まい 74\n", 405 | "High frequency word: 同じ 73\n", 406 | "High frequency word: 知ら 73\n", 407 | "High frequency word: 見え 72\n", 408 | "High frequency word: なん 72\n", 409 | "High frequency word: 言葉 72\n", 410 | "High frequency word: 父 72\n", 411 | "High frequency word: 行っ 71\n", 412 | "High frequency word: のに 70\n", 413 | "High frequency word: 忠利 70\n", 414 | "High frequency word: 信子 69\n", 415 | "High frequency word: 國 69\n", 416 | "High frequency word: 度 68\n", 417 | "High frequency word: 光 68\n", 418 | "High frequency word: ゝ 68\n", 419 | "High frequency word: やはり 67\n", 420 | "High frequency word: そうして 67\n", 421 | "High frequency word: だって 67\n", 422 | "High frequency word: 大 67\n", 423 | "High frequency word: 七 67\n", 424 | "High frequency word: 是 67\n", 425 | "High frequency word: 主人 66\n", 426 | "High frequency word: 物 66\n", 427 | "High frequency word: つけ 66\n", 428 | "High frequency word: 第 66\n", 429 | "High frequency word: 馬 66\n", 430 | "High frequency word: 來 66\n", 431 | "High frequency word: にて 66\n", 432 | "High frequency word: ち 65\n", 433 | "High frequency word: 程 65\n", 434 | "High frequency word: ! 64\n", 435 | "High frequency word: 百 64\n", 436 | "High frequency word: 思い 64\n", 437 | "High frequency word: ども 64\n", 438 | "High frequency word: かも 63\n", 439 | "High frequency word: ( 63\n", 440 | "High frequency word: こんな 63\n", 441 | "High frequency word: 子 63\n", 442 | "High frequency word: 知っ 63\n", 443 | "High frequency word: しまっ 63\n", 444 | "High frequency word: わたくし 63\n", 445 | "High frequency word: 人間 63\n", 446 | "High frequency word: ぞ 62\n", 447 | "High frequency word: しよ 62\n", 448 | "High frequency word: 夜 62\n", 449 | "High frequency word: ねえ 62\n", 450 | "High frequency word: ほ 61\n", 451 | "High frequency word: なつ 61\n", 452 | "High frequency word: 母 61\n", 453 | "High frequency word: さえ 61\n", 454 | "High frequency word: 仁 61\n", 455 | "High frequency word: 之 61\n", 456 | "High frequency word: 田島 61\n", 457 | "High frequency word: とも 60\n", 458 | "High frequency word: げ 60\n", 459 | "High frequency word: 酒 60\n", 460 | "High frequency word: ど 60\n", 461 | "High frequency word: 考え 60\n", 462 | "High frequency word: 部屋 60\n", 463 | "High frequency word: 郎 60\n", 464 | "High frequency word: すると 59\n", 465 | "High frequency word: 頃 59\n", 466 | "High frequency word: 利 59\n", 467 | "High frequency word: 立っ 58\n", 468 | "High frequency word: 頭 58\n", 469 | "High frequency word: 殉死 58\n", 470 | "High frequency word: 衛門 58\n", 471 | "High frequency word: 或 57\n", 472 | "High frequency word: 本 57\n", 473 | "High frequency word: よく 57\n", 474 | "High frequency word: 語 57\n", 475 | "High frequency word: のみ 56\n", 476 | "High frequency word: あら 56\n", 477 | "High frequency word: 内 56\n", 478 | "High frequency word: 風 56\n", 479 | "High frequency word: どうも 55\n", 480 | "High frequency word: 言 55\n", 481 | "High frequency word: 歩い 55\n", 482 | "High frequency word: 色 54\n", 483 | "High frequency word: 妻 54\n", 484 | "High frequency word: 婆さん 54\n", 485 | "High frequency word: いっ 54\n", 486 | "High frequency word: 姫君 54\n", 487 | "High frequency word: 持っ 54\n", 488 | "High frequency word: 斯 54\n", 489 | "High frequency word: ) 53\n", 490 | "High frequency word: 八 53\n", 491 | "High frequency word: 自身 52\n", 492 | "High frequency word: わけ 52\n", 493 | "High frequency word: ああ 52\n", 494 | "High frequency word: 々 52\n", 495 | "High frequency word: ろ 52\n", 496 | "High frequency word: 皆 52\n", 497 | "High frequency word: やっ 52\n", 498 | "High frequency word: 勿論 51\n", 499 | "High frequency word: 死ん 51\n", 500 | "High frequency word: そこで 51\n", 501 | "High frequency word: 行く 51\n", 502 | "High frequency word: 申し 51\n", 503 | "High frequency word: とか 51\n", 504 | "High frequency word: 侍 51\n", 505 | "High frequency word: 髪長 51\n", 506 | "High frequency word: 彦 51\n", 507 | "High frequency word: 姫 51\n", 508 | "High frequency word: 其の 51\n", 509 | "High frequency word: 此 51\n", 510 | "High frequency word: 笑っ 50\n", 511 | "High frequency word: ほか 49\n", 512 | "High frequency word: かう 49\n", 513 | "High frequency word: 石 49\n", 514 | "High frequency word: やら 49\n", 515 | "High frequency word: 通り 48\n", 516 | "High frequency word: 朝 48\n", 517 | "High frequency word: あと 48\n", 518 | "High frequency word: 姿 48\n", 519 | "High frequency word: いけ 48\n", 520 | "High frequency word: でき 48\n", 521 | "High frequency word: 氏 48\n", 522 | "High frequency word: 数枝 48\n", 523 | "High frequency word: つい 47\n", 524 | "High frequency word: 居 47\n", 525 | "High frequency word: はいっ 47\n", 526 | "High frequency word: べき 47\n", 527 | "High frequency word: 青年 47\n", 528 | "High frequency word: 半 47\n", 529 | "High frequency word: 得 47\n", 530 | "High frequency word: まあ 46\n", 531 | "High frequency word: 足 46\n", 532 | "High frequency word: 先 46\n", 533 | "High frequency word: 用 46\n", 534 | "High frequency word: うし 46\n", 535 | "High frequency word: 字 46\n", 536 | "High frequency word: 阿部 46\n", 537 | "High frequency word: 忘れ 45\n", 538 | "High frequency word: 帰っ 45\n", 539 | "High frequency word: それでも 45\n", 540 | "High frequency word: もと 45\n", 541 | "High frequency word: 早く 45\n", 542 | "High frequency word: どんな 45\n", 543 | "High frequency word: 弟 45\n", 544 | "High frequency word: 1 45\n", 545 | "High frequency word: ちょっと 45\n", 546 | "High frequency word: キヌ子 45\n", 547 | "High frequency word: 大谷 45\n", 548 | "High frequency word: だい 44\n", 549 | "High frequency word: 彼等 44\n", 550 | "High frequency word: とうとう 44\n", 551 | "High frequency word: っ 44\n", 552 | "High frequency word: 常子 44\n", 553 | "High frequency word: 悪い 43\n", 554 | "High frequency word: 耳 43\n", 555 | "High frequency word: 音 43\n", 556 | "High frequency word: 空 43\n", 557 | "High frequency word: 胸 43\n", 558 | "High frequency word: ばか 43\n", 559 | "High frequency word: しょ 43\n", 560 | "High frequency word: 涙 43\n", 561 | "High frequency word: 有 43\n", 562 | "High frequency word: 道 43\n", 563 | "High frequency word: 山 43\n", 564 | "High frequency word: 窓 42\n", 565 | "High frequency word: 違 42\n", 566 | "High frequency word: やつ 42\n", 567 | "High frequency word: ふも 42\n", 568 | "High frequency word: 子供 42\n", 569 | "High frequency word: 神 42\n", 570 | "High frequency word: 命 42\n", 571 | "High frequency word: 聞え 42\n", 572 | "High frequency word: 行き 42\n", 573 | "High frequency word: 婆 42\n", 574 | "High frequency word: あろ 42\n", 575 | "High frequency word: 少女 42\n", 576 | "High frequency word: 思わ 42\n", 577 | "High frequency word: わから 42\n", 578 | "High frequency word: ほとんど 42\n", 579 | "High frequency word: られる 42\n", 580 | "High frequency word: 様子 42\n", 581 | "High frequency word: 数馬 42\n", 582 | "High frequency word: 乙彦 42\n", 583 | "High frequency word: つき 41\n", 584 | "High frequency word: かみ 41\n", 585 | "High frequency word: 火 41\n", 586 | "High frequency word: 水準 41\n", 587 | "High frequency word: 歳 41\n", 588 | "High frequency word: 金 41\n", 589 | "High frequency word: はじめ 41\n", 590 | "High frequency word: 相手 40\n", 591 | "High frequency word: 名 40\n", 592 | "High frequency word: 書い 40\n", 593 | "High frequency word: 昔 40\n", 594 | "High frequency word: 今日 40\n", 595 | "High frequency word: 伊織 40\n", 596 | "High frequency word: なんて 40\n", 597 | "High frequency word: 例 39\n", 598 | "High frequency word: 微笑 39\n", 599 | "High frequency word: 円 39\n", 600 | "High frequency word: しか 39\n", 601 | "High frequency word: 遠藤 39\n", 602 | "High frequency word: ましょ 39\n", 603 | "High frequency word: 妹 39\n", 604 | "High frequency word: たく 39\n", 605 | "High frequency word: 生活 38\n", 606 | "High frequency word: ゆ 38\n", 607 | "High frequency word: 唯 38\n", 608 | "High frequency word: 信じ 38\n" 609 | ] 610 | } 611 | ], 612 | "source": [ 613 | "sorted_stop = sorted(stop_data.items(), key=lambda x:x[1], reverse=True)\n", 614 | "\n", 615 | "print(len(sorted_stop))\n", 616 | "\n", 617 | "freq_num = int(len(sorted_stop)*0.03)\n", 618 | "n = 0\n", 619 | "stop_words = []\n", 620 | "print(freq_num)\n", 621 | "for data in sorted_stop:\n", 622 | " stop_words.append(str(data[0]))\n", 623 | " print('High frequency word: ',str(data[0]), str(data[1]))\n", 624 | " n+= 1\n", 625 | " if n > freq_num:\n", 626 | " break\n", 627 | "\n", 628 | "# 作成したストップワードの辞書の保存\n", 629 | "with open('./origin_stopwords.txt', 'w') as f:\n", 630 | " f.write('\\n'.join(stop_words))" 631 | ] 632 | }, 633 | { 634 | "cell_type": "code", 635 | "execution_count": 7, 636 | "metadata": { 637 | "collapsed": true 638 | }, 639 | "outputs": [], 640 | "source": [ 641 | "def stopword_bydic(text):\n", 642 | " \"\"\"\n", 643 | " 辞書によるストップワードの除去\n", 644 | " \"\"\"\n", 645 | " # 読み込むストップワード辞書の指定。\n", 646 | " with open('./origin_stopwords.txt') as f:\n", 647 | " data = f.read()\n", 648 | " stopwords = data.split('\\n')\n", 649 | " lines = []\n", 650 | " for line in text:\n", 651 | " words = []\n", 652 | " for word in line:\n", 653 | " if word not in stopwords:\n", 654 | " words.append(word) \n", 655 | " lines.append(words)\n", 656 | " return lines" 657 | ] 658 | }, 659 | { 660 | "cell_type": "code", 661 | "execution_count": 8, 662 | "metadata": {}, 663 | "outputs": [ 664 | { 665 | "name": "stdout", 666 | "output_type": "stream", 667 | "text": [ 668 | "sum_lines: 8876\n", 669 | "sum_words: 13489\n" 670 | ] 671 | } 672 | ], 673 | "source": [ 674 | "sum_lines = len(stopword_bydic(cleaned_data))\n", 675 | "sum_words = []\n", 676 | "for line in stopword_bydic(cleaned_data):\n", 677 | " for word in line:\n", 678 | " if word not in sum_words:\n", 679 | " sum_words.append(word)\n", 680 | "print('sum_lines: ', sum_lines)\n", 681 | "print('sum_words: ', len(sum_words))\n", 682 | "with open('origin_words.txt', 'w') as f:\n", 683 | " f.write('\\n'.join(sum_words))\n", 684 | "cleaned_data = []\n", 685 | "for author, data in authors.items():\n", 686 | " data = stopword_bydic(data)\n", 687 | " for line in data:\n", 688 | " #if len(line) > 2:\n", 689 | " cleaned_data.append(author+','+' '.join(line))" 690 | ] 691 | }, 692 | { 693 | "cell_type": "code", 694 | "execution_count": 9, 695 | "metadata": { 696 | "collapsed": true 697 | }, 698 | "outputs": [], 699 | "source": [ 700 | "# 作成したコーパスの保存\n", 701 | "with open('./dataset/corpus.csv', 'w') as f:\n", 702 | " f.write(''.join(cleaned_data))" 703 | ] 704 | } 705 | ], 706 | "metadata": { 707 | "kernelspec": { 708 | "display_name": "Python 3", 709 | "language": "python", 710 | "name": "python3" 711 | }, 712 | "language_info": { 713 | "codemirror_mode": { 714 | "name": "ipython", 715 | "version": 3 716 | }, 717 | "file_extension": ".py", 718 | "mimetype": "text/x-python", 719 | "name": "python", 720 | "nbconvert_exporter": "python", 721 | "pygments_lexer": "ipython3", 722 | "version": "3.6.1" 723 | } 724 | }, 725 | "nbformat": 4, 726 | "nbformat_minor": 2 727 | } 728 | -------------------------------------------------------------------------------- /01_regression/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 13 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 14 | ] 15 | }, 16 | { 17 | "data": { 18 | "text/plain": [ 19 | "'%.3f'" 20 | ] 21 | }, 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "# データ加工モジュール\n", 29 | "import numpy as np\n", 30 | "from pandas import DataFrame\n", 31 | "\n", 32 | "# データ可視化モジュール\n", 33 | "import matplotlib.pyplot as plt\n", 34 | "%matplotlib inline\n", 35 | "\n", 36 | "# 機械学習モジュール\n", 37 | "from sklearn import linear_model\n", 38 | "from sklearn.datasets import load_boston\n", 39 | "from sklearn.cross_validation import train_test_split\n", 40 | "from sklearn.metrics import mean_squared_error\n", 41 | "\n", 42 | "# 小数第3まで表示\n", 43 | "%precision 3" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 2, 49 | "metadata": { 50 | "collapsed": true 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "## データの用意\n", 55 | "# ボストンデータをインポート\n", 56 | "boston = load_boston()\n", 57 | "\n", 58 | "# 説明変数たちをDataFrameへ変換\n", 59 | "df = DataFrame(boston.data, columns = boston.feature_names)\n", 60 | "\n", 61 | "# 目的変数をDataFrameへ追加\n", 62 | "df['MEDV'] = np.array(boston.target)" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 3, 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "data": { 72 | "text/html": [ 73 | "
\n", 74 | "\n", 87 | "\n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | "
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATMEDV
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.9824.0
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.1421.6
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.0334.7
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.9433.4
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.3336.2
\n", 195 | "
" 196 | ], 197 | "text/plain": [ 198 | " CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n", 199 | "0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 \n", 200 | "1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 \n", 201 | "2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 \n", 202 | "3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 \n", 203 | "4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 \n", 204 | "\n", 205 | " PTRATIO B LSTAT MEDV \n", 206 | "0 15.3 396.90 4.98 24.0 \n", 207 | "1 17.8 396.90 9.14 21.6 \n", 208 | "2 17.8 392.83 4.03 34.7 \n", 209 | "3 18.7 394.63 2.94 33.4 \n", 210 | "4 18.7 396.90 5.33 36.2 " 211 | ] 212 | }, 213 | "execution_count": 3, 214 | "metadata": {}, 215 | "output_type": "execute_result" 216 | } 217 | ], 218 | "source": [ 219 | "# 最初の5行を表示\n", 220 | "df.head()" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": 4, 226 | "metadata": {}, 227 | "outputs": [ 228 | { 229 | "data": { 230 | "text/plain": [ 231 | "Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,\n", 232 | " normalize=False, random_state=None, solver='auto', tol=0.001)" 233 | ] 234 | }, 235 | "execution_count": 4, 236 | "metadata": {}, 237 | "output_type": "execute_result" 238 | } 239 | ], 240 | "source": [ 241 | "# オブジェクト生成\n", 242 | "model = linear_model.Ridge()\n", 243 | "\n", 244 | "# fit関数でパラメータ推定\n", 245 | "model.fit(boston.data,boston.target)" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": 5, 251 | "metadata": {}, 252 | "outputs": [ 253 | { 254 | "name": "stdout", 255 | "output_type": "stream", 256 | "text": [ 257 | "[ -1.036e-01 4.741e-02 -8.547e-03 2.554e+00 -1.079e+01 3.849e+00\n", 258 | " -5.368e-03 -1.373e+00 2.896e-01 -1.291e-02 -8.766e-01 9.754e-03\n", 259 | " -5.341e-01]\n", 260 | "31.6186044111\n" 261 | ] 262 | } 263 | ], 264 | "source": [ 265 | "# 回帰係数を出力\n", 266 | "print(model.coef_)\n", 267 | "print(model.intercept_)" 268 | ] 269 | }, 270 | { 271 | "cell_type": "code", 272 | "execution_count": 6, 273 | "metadata": { 274 | "collapsed": true 275 | }, 276 | "outputs": [], 277 | "source": [ 278 | "# 75%を学習用、25%を検証用データにするよう分割\n", 279 | "X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size = 0.25, random_state = 100)\n", 280 | "\n", 281 | "# 学習用データでパラメータ推定\n", 282 | "model.fit(X_train, y_train)\n", 283 | "\n", 284 | "# 作成したモデルから予測(学習用、検証用モデル使用)\n", 285 | "y_train_pred = model.predict(X_train)\n", 286 | "y_test_pred = model.predict(X_test)" 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": 7, 292 | "metadata": {}, 293 | "outputs": [ 294 | { 295 | "data": { 296 | "image/png": "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\nP9q1qdK/tsi/AAAAAElFTkSuQmCC\n", 297 | "text/plain": [ 298 | "" 299 | ] 300 | }, 301 | "metadata": {}, 302 | "output_type": "display_data" 303 | } 304 | ], 305 | "source": [ 306 | "# 学習用、検証用それぞれで残差をプロット\n", 307 | "plt.scatter(y_train_pred, y_train_pred - y_train, c = 'gray', marker = 'o', label = 'Train Data')\n", 308 | "plt.scatter(y_test_pred, y_test_pred - y_test, c = 'blue', marker = 's', label = 'Test Data')\n", 309 | "plt.xlabel('Predicted Values')\n", 310 | "plt.ylabel('Residuals')\n", 311 | "\n", 312 | "# 凡例を左上に表示\n", 313 | "plt.legend(loc = 'upper left')\n", 314 | "\n", 315 | "# y = 0に直線を引く\n", 316 | "plt.hlines(y = 0, xmin = -10, xmax = 50, lw = 2, color = 'black')\n", 317 | "plt.xlim([0, 50])\n", 318 | "plt.show()" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": 8, 324 | "metadata": {}, 325 | "outputs": [ 326 | { 327 | "name": "stdout", 328 | "output_type": "stream", 329 | "text": [ 330 | "MSE Train : 20.636, Test : 27.987\n", 331 | "R^2 Train : 0.741, Test : 0.716\n" 332 | ] 333 | } 334 | ], 335 | "source": [ 336 | "# 学習用、検証用データに関して平均二乗誤差を出力\n", 337 | "print('MSE Train : %.3f, Test : %.3f' % (mean_squared_error(y_train, y_train_pred), mean_squared_error(y_test, y_test_pred)))\n", 338 | "\n", 339 | "# 学習用、検証用データに関してR^2を出力\n", 340 | "print('R^2 Train : %.3f, Test : %.3f' % (model.score(X_train, y_train), model.score(X_test, y_test)))" 341 | ] 342 | }, 343 | { 344 | "cell_type": "markdown", 345 | "metadata": {}, 346 | "source": [ 347 | "## 参考\n", 348 | "- http://tekenuko.hatenablog.com/entry/2016/09/19/151547" 349 | ] 350 | } 351 | ], 352 | "metadata": { 353 | "kernelspec": { 354 | "display_name": "Python 3", 355 | "language": "python", 356 | "name": "python3" 357 | }, 358 | "language_info": { 359 | "codemirror_mode": { 360 | "name": "ipython", 361 | "version": 3 362 | }, 363 | "file_extension": ".py", 364 | "mimetype": "text/x-python", 365 | "name": "python", 366 | "nbconvert_exporter": "python", 367 | "pygments_lexer": "ipython3", 368 | "version": "3.6.1" 369 | } 370 | }, 371 | "nbformat": 4, 372 | "nbformat_minor": 2 373 | } 374 | -------------------------------------------------------------------------------- /03_deeplearning/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "import keras\n", 18 | "from keras.datasets import mnist\n", 19 | "from keras.models import Sequential\n", 20 | "from keras.layers import Dense, Dropout, Activation\n", 21 | "from keras.optimizers import RMSprop\n", 22 | "import matplotlib.pyplot as plt\n", 23 | "from keras.layers.normalization import BatchNormalization\n", 24 | "import h5py\n", 25 | "%matplotlib inline" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 12, 31 | "metadata": { 32 | "collapsed": true 33 | }, 34 | "outputs": [], 35 | "source": [ 36 | "# 自分で設定するパラメータ\n", 37 | "\n", 38 | "# バッチサイズ\n", 39 | "batch_size = 2000\n", 40 | "\n", 41 | "# エポック数\n", 42 | "epochs = 100" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 13, 48 | "metadata": {}, 49 | "outputs": [ 50 | { 51 | "name": "stdout", 52 | "output_type": "stream", 53 | "text": [ 54 | "60000 train samples\n", 55 | "10000 test samples\n" 56 | ] 57 | } 58 | ], 59 | "source": [ 60 | "# データ抽出\n", 61 | "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", 62 | "num_classes = 10\n", 63 | "x_train = x_train.reshape(60000, 784)\n", 64 | "x_test = x_test.reshape(10000, 784)\n", 65 | "x_train = x_train.astype('float32')\n", 66 | "x_test = x_test.astype('float32')\n", 67 | "x_train /= 255\n", 68 | "x_test /= 255\n", 69 | "print(x_train.shape[0], 'train samples')\n", 70 | "print(x_test.shape[0], 'test samples')\n", 71 | "\n", 72 | "# one-hot-label に変換\n", 73 | "y_train = keras.utils.to_categorical(y_train, num_classes)\n", 74 | "y_test = keras.utils.to_categorical(y_test, num_classes)" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 14, 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "name": "stdout", 84 | "output_type": "stream", 85 | "text": [ 86 | "_________________________________________________________________\n", 87 | "Layer (type) Output Shape Param # \n", 88 | "=================================================================\n", 89 | "dense_13 (Dense) (None, 256) 200960 \n", 90 | "_________________________________________________________________\n", 91 | "dropout_10 (Dropout) (None, 256) 0 \n", 92 | "_________________________________________________________________\n", 93 | "dense_14 (Dense) (None, 128) 32896 \n", 94 | "_________________________________________________________________\n", 95 | "dropout_11 (Dropout) (None, 128) 0 \n", 96 | "_________________________________________________________________\n", 97 | "dense_15 (Dense) (None, 32) 4128 \n", 98 | "_________________________________________________________________\n", 99 | "dropout_12 (Dropout) (None, 32) 0 \n", 100 | "_________________________________________________________________\n", 101 | "dense_16 (Dense) (None, 10) 330 \n", 102 | "=================================================================\n", 103 | "Total params: 238,314\n", 104 | "Trainable params: 238,314\n", 105 | "Non-trainable params: 0\n", 106 | "_________________________________________________________________\n", 107 | "Train on 60000 samples, validate on 10000 samples\n", 108 | "Epoch 1/100\n", 109 | "60000/60000 [==============================] - 3s - loss: 2.3037 - acc: 0.1137 - val_loss: 2.2390 - val_acc: 0.1884\n", 110 | "Epoch 2/100\n", 111 | "60000/60000 [==============================] - 2s - loss: 2.2192 - acc: 0.1953 - val_loss: 2.1569 - val_acc: 0.3133\n", 112 | "Epoch 3/100\n", 113 | "60000/60000 [==============================] - 3s - loss: 2.1419 - acc: 0.2774 - val_loss: 2.0593 - val_acc: 0.4337\n", 114 | "Epoch 4/100\n", 115 | "60000/60000 [==============================] - 2s - loss: 2.0491 - acc: 0.3526 - val_loss: 1.9442 - val_acc: 0.5171\n", 116 | "Epoch 5/100\n", 117 | "60000/60000 [==============================] - 2s - loss: 1.9424 - acc: 0.4110 - val_loss: 1.8132 - val_acc: 0.5709\n", 118 | "Epoch 6/100\n", 119 | "60000/60000 [==============================] - 2s - loss: 1.8188 - acc: 0.4602 - val_loss: 1.6671 - val_acc: 0.6097\n", 120 | "Epoch 7/100\n", 121 | "60000/60000 [==============================] - 2s - loss: 1.6907 - acc: 0.4972 - val_loss: 1.5153 - val_acc: 0.6413\n", 122 | "Epoch 8/100\n", 123 | "60000/60000 [==============================] - 3s - loss: 1.5586 - acc: 0.5343 - val_loss: 1.3651 - val_acc: 0.6757\n", 124 | "Epoch 9/100\n", 125 | "60000/60000 [==============================] - 2s - loss: 1.4318 - acc: 0.5740 - val_loss: 1.2247 - val_acc: 0.7154\n", 126 | "Epoch 10/100\n", 127 | "60000/60000 [==============================] - 3s - loss: 1.3129 - acc: 0.6179 - val_loss: 1.0978 - val_acc: 0.7594\n", 128 | "Epoch 11/100\n", 129 | "60000/60000 [==============================] - 2s - loss: 1.2095 - acc: 0.6531 - val_loss: 0.9866 - val_acc: 0.7998\n", 130 | "Epoch 12/100\n", 131 | "60000/60000 [==============================] - 3s - loss: 1.1219 - acc: 0.6824 - val_loss: 0.8917 - val_acc: 0.8215\n", 132 | "Epoch 13/100\n", 133 | "60000/60000 [==============================] - 3s - loss: 1.0375 - acc: 0.7072 - val_loss: 0.8123 - val_acc: 0.8341\n", 134 | "Epoch 14/100\n", 135 | "60000/60000 [==============================] - 3s - loss: 0.9706 - acc: 0.7252 - val_loss: 0.7466 - val_acc: 0.8422\n", 136 | "Epoch 15/100\n", 137 | "60000/60000 [==============================] - 3s - loss: 0.9147 - acc: 0.7389 - val_loss: 0.6929 - val_acc: 0.8498\n", 138 | "Epoch 16/100\n", 139 | "60000/60000 [==============================] - 2s - loss: 0.8620 - acc: 0.7512 - val_loss: 0.6486 - val_acc: 0.8563\n", 140 | "Epoch 17/100\n", 141 | "60000/60000 [==============================] - 2s - loss: 0.8248 - acc: 0.7622 - val_loss: 0.6125 - val_acc: 0.8603\n", 142 | "Epoch 18/100\n", 143 | "60000/60000 [==============================] - 2s - loss: 0.7890 - acc: 0.7696 - val_loss: 0.5827 - val_acc: 0.8648\n", 144 | "Epoch 19/100\n", 145 | "60000/60000 [==============================] - 2s - loss: 0.7600 - acc: 0.7771 - val_loss: 0.5573 - val_acc: 0.8672\n", 146 | "Epoch 20/100\n", 147 | "60000/60000 [==============================] - 2s - loss: 0.7340 - acc: 0.7840 - val_loss: 0.5358 - val_acc: 0.8707\n", 148 | "Epoch 21/100\n", 149 | "60000/60000 [==============================] - 2s - loss: 0.7081 - acc: 0.7901 - val_loss: 0.5174 - val_acc: 0.8731\n", 150 | "Epoch 22/100\n", 151 | "60000/60000 [==============================] - 2s - loss: 0.6886 - acc: 0.7968 - val_loss: 0.5013 - val_acc: 0.8759\n", 152 | "Epoch 23/100\n", 153 | "60000/60000 [==============================] - 3s - loss: 0.6724 - acc: 0.7987 - val_loss: 0.4873 - val_acc: 0.8776\n", 154 | "Epoch 24/100\n", 155 | "60000/60000 [==============================] - 3s - loss: 0.6543 - acc: 0.8063 - val_loss: 0.4750 - val_acc: 0.8795\n", 156 | "Epoch 25/100\n", 157 | "60000/60000 [==============================] - 2s - loss: 0.6406 - acc: 0.8091 - val_loss: 0.4637 - val_acc: 0.8817\n", 158 | "Epoch 26/100\n", 159 | "60000/60000 [==============================] - 2s - loss: 0.6272 - acc: 0.8146 - val_loss: 0.4535 - val_acc: 0.8825\n", 160 | "Epoch 27/100\n", 161 | "60000/60000 [==============================] - 2s - loss: 0.6170 - acc: 0.8157 - val_loss: 0.4448 - val_acc: 0.8842\n", 162 | "Epoch 28/100\n", 163 | "60000/60000 [==============================] - 4s - loss: 0.6074 - acc: 0.8184 - val_loss: 0.4369 - val_acc: 0.8857\n", 164 | "Epoch 29/100\n", 165 | "60000/60000 [==============================] - 4s - loss: 0.5901 - acc: 0.8231 - val_loss: 0.4285 - val_acc: 0.8870\n", 166 | "Epoch 30/100\n", 167 | "60000/60000 [==============================] - 3s - loss: 0.5858 - acc: 0.8264 - val_loss: 0.4214 - val_acc: 0.8877\n", 168 | "Epoch 31/100\n", 169 | "60000/60000 [==============================] - 3s - loss: 0.5721 - acc: 0.8304 - val_loss: 0.4149 - val_acc: 0.8897\n", 170 | "Epoch 32/100\n", 171 | "60000/60000 [==============================] - 3s - loss: 0.5651 - acc: 0.8323 - val_loss: 0.4087 - val_acc: 0.8912\n", 172 | "Epoch 33/100\n", 173 | "60000/60000 [==============================] - 3s - loss: 0.5565 - acc: 0.8348 - val_loss: 0.4027 - val_acc: 0.8927\n", 174 | "Epoch 34/100\n", 175 | "60000/60000 [==============================] - 2s - loss: 0.5497 - acc: 0.8352 - val_loss: 0.3976 - val_acc: 0.8943\n", 176 | "Epoch 35/100\n", 177 | "60000/60000 [==============================] - 2s - loss: 0.5397 - acc: 0.8406 - val_loss: 0.3925 - val_acc: 0.8957\n", 178 | "Epoch 36/100\n", 179 | "60000/60000 [==============================] - 2s - loss: 0.5346 - acc: 0.8412 - val_loss: 0.3877 - val_acc: 0.8962\n", 180 | "Epoch 37/100\n", 181 | "60000/60000 [==============================] - 3s - loss: 0.5304 - acc: 0.8414 - val_loss: 0.3833 - val_acc: 0.8966\n", 182 | "Epoch 38/100\n", 183 | "60000/60000 [==============================] - 3s - loss: 0.5187 - acc: 0.8461 - val_loss: 0.3784 - val_acc: 0.8973\n", 184 | "Epoch 39/100\n", 185 | "60000/60000 [==============================] - 3s - loss: 0.5179 - acc: 0.8471 - val_loss: 0.3745 - val_acc: 0.8979\n", 186 | "Epoch 40/100\n", 187 | "60000/60000 [==============================] - 3s - loss: 0.5104 - acc: 0.8473 - val_loss: 0.3702 - val_acc: 0.8991\n", 188 | "Epoch 41/100\n", 189 | "60000/60000 [==============================] - 4s - loss: 0.5043 - acc: 0.8510 - val_loss: 0.3665 - val_acc: 0.9001\n", 190 | "Epoch 42/100\n", 191 | "60000/60000 [==============================] - 3s - loss: 0.4986 - acc: 0.8515 - val_loss: 0.3630 - val_acc: 0.9015\n", 192 | "Epoch 43/100\n", 193 | "60000/60000 [==============================] - 3s - loss: 0.4922 - acc: 0.8528 - val_loss: 0.3593 - val_acc: 0.9020\n", 194 | "Epoch 44/100\n", 195 | "60000/60000 [==============================] - 3s - loss: 0.4904 - acc: 0.8540 - val_loss: 0.3560 - val_acc: 0.9034\n", 196 | "Epoch 45/100\n", 197 | "60000/60000 [==============================] - 3s - loss: 0.4857 - acc: 0.8574 - val_loss: 0.3530 - val_acc: 0.9037\n", 198 | "Epoch 46/100\n", 199 | "60000/60000 [==============================] - 3s - loss: 0.4805 - acc: 0.8574 - val_loss: 0.3495 - val_acc: 0.9047\n", 200 | "Epoch 47/100\n", 201 | "60000/60000 [==============================] - 2s - loss: 0.4769 - acc: 0.8597 - val_loss: 0.3465 - val_acc: 0.9055\n", 202 | "Epoch 48/100\n", 203 | "60000/60000 [==============================] - 3s - loss: 0.4736 - acc: 0.8613 - val_loss: 0.3433 - val_acc: 0.9068\n", 204 | "Epoch 49/100\n", 205 | "60000/60000 [==============================] - 2s - loss: 0.4693 - acc: 0.8607 - val_loss: 0.3410 - val_acc: 0.9076\n", 206 | "Epoch 50/100\n", 207 | "60000/60000 [==============================] - 2s - loss: 0.4637 - acc: 0.8632 - val_loss: 0.3379 - val_acc: 0.9080\n", 208 | "Epoch 51/100\n", 209 | "60000/60000 [==============================] - 2s - loss: 0.4599 - acc: 0.8649 - val_loss: 0.3354 - val_acc: 0.9085\n", 210 | "Epoch 52/100\n", 211 | "60000/60000 [==============================] - 2s - loss: 0.4551 - acc: 0.8644 - val_loss: 0.3326 - val_acc: 0.9100\n", 212 | "Epoch 53/100\n", 213 | "60000/60000 [==============================] - 2s - loss: 0.4523 - acc: 0.8660 - val_loss: 0.3301 - val_acc: 0.9104\n", 214 | "Epoch 54/100\n" 215 | ] 216 | }, 217 | { 218 | "name": "stdout", 219 | "output_type": "stream", 220 | "text": [ 221 | "60000/60000 [==============================] - 2s - loss: 0.4482 - acc: 0.8670 - val_loss: 0.3275 - val_acc: 0.9109\n", 222 | "Epoch 55/100\n", 223 | "60000/60000 [==============================] - 2s - loss: 0.4431 - acc: 0.8698 - val_loss: 0.3251 - val_acc: 0.9113\n", 224 | "Epoch 56/100\n", 225 | "60000/60000 [==============================] - 2s - loss: 0.4428 - acc: 0.8684 - val_loss: 0.3228 - val_acc: 0.9114\n", 226 | "Epoch 57/100\n", 227 | "60000/60000 [==============================] - 2s - loss: 0.4383 - acc: 0.8708 - val_loss: 0.3203 - val_acc: 0.9119\n", 228 | "Epoch 58/100\n", 229 | "60000/60000 [==============================] - 2s - loss: 0.4346 - acc: 0.8714 - val_loss: 0.3179 - val_acc: 0.9123\n", 230 | "Epoch 59/100\n", 231 | "60000/60000 [==============================] - 2s - loss: 0.4306 - acc: 0.8732 - val_loss: 0.3160 - val_acc: 0.9134\n", 232 | "Epoch 60/100\n", 233 | "60000/60000 [==============================] - 2s - loss: 0.4279 - acc: 0.8747 - val_loss: 0.3134 - val_acc: 0.9136\n", 234 | "Epoch 61/100\n", 235 | "60000/60000 [==============================] - 2s - loss: 0.4225 - acc: 0.8756 - val_loss: 0.3115 - val_acc: 0.9139\n", 236 | "Epoch 62/100\n", 237 | "60000/60000 [==============================] - 2s - loss: 0.4179 - acc: 0.8768 - val_loss: 0.3090 - val_acc: 0.9141\n", 238 | "Epoch 63/100\n", 239 | "60000/60000 [==============================] - 3s - loss: 0.4195 - acc: 0.8759 - val_loss: 0.3073 - val_acc: 0.9150\n", 240 | "Epoch 64/100\n", 241 | "60000/60000 [==============================] - 2s - loss: 0.4156 - acc: 0.8778 - val_loss: 0.3050 - val_acc: 0.9151\n", 242 | "Epoch 65/100\n", 243 | "60000/60000 [==============================] - 2s - loss: 0.4097 - acc: 0.8807 - val_loss: 0.3030 - val_acc: 0.9155\n", 244 | "Epoch 66/100\n", 245 | "60000/60000 [==============================] - 2s - loss: 0.4088 - acc: 0.8799 - val_loss: 0.3010 - val_acc: 0.9164\n", 246 | "Epoch 67/100\n", 247 | "60000/60000 [==============================] - 2s - loss: 0.4079 - acc: 0.8797 - val_loss: 0.2993 - val_acc: 0.9171\n", 248 | "Epoch 68/100\n", 249 | "60000/60000 [==============================] - 2s - loss: 0.4034 - acc: 0.8830 - val_loss: 0.2974 - val_acc: 0.9176\n", 250 | "Epoch 69/100\n", 251 | "60000/60000 [==============================] - 2s - loss: 0.4015 - acc: 0.8809 - val_loss: 0.2955 - val_acc: 0.9182\n", 252 | "Epoch 70/100\n", 253 | "60000/60000 [==============================] - 2s - loss: 0.4026 - acc: 0.8817 - val_loss: 0.2938 - val_acc: 0.9185\n", 254 | "Epoch 71/100\n", 255 | "60000/60000 [==============================] - 2s - loss: 0.3967 - acc: 0.8821 - val_loss: 0.2918 - val_acc: 0.9196\n", 256 | "Epoch 72/100\n", 257 | "60000/60000 [==============================] - 2s - loss: 0.3966 - acc: 0.8842 - val_loss: 0.2903 - val_acc: 0.9196\n", 258 | "Epoch 73/100\n", 259 | "60000/60000 [==============================] - 2s - loss: 0.3940 - acc: 0.8840 - val_loss: 0.2887 - val_acc: 0.9197\n", 260 | "Epoch 74/100\n", 261 | "60000/60000 [==============================] - 2s - loss: 0.3898 - acc: 0.8874 - val_loss: 0.2871 - val_acc: 0.9201\n", 262 | "Epoch 75/100\n", 263 | "60000/60000 [==============================] - 2s - loss: 0.3882 - acc: 0.8868 - val_loss: 0.2854 - val_acc: 0.9203\n", 264 | "Epoch 76/100\n", 265 | "60000/60000 [==============================] - 2s - loss: 0.3859 - acc: 0.8864 - val_loss: 0.2839 - val_acc: 0.9209\n", 266 | "Epoch 77/100\n", 267 | "60000/60000 [==============================] - 2s - loss: 0.3841 - acc: 0.8875 - val_loss: 0.2821 - val_acc: 0.9210\n", 268 | "Epoch 78/100\n", 269 | "60000/60000 [==============================] - 2s - loss: 0.3819 - acc: 0.8879 - val_loss: 0.2807 - val_acc: 0.9212\n", 270 | "Epoch 79/100\n", 271 | "60000/60000 [==============================] - 2s - loss: 0.3809 - acc: 0.8886 - val_loss: 0.2790 - val_acc: 0.9215\n", 272 | "Epoch 80/100\n", 273 | "60000/60000 [==============================] - 2s - loss: 0.3749 - acc: 0.8903 - val_loss: 0.2774 - val_acc: 0.9216\n", 274 | "Epoch 81/100\n", 275 | "60000/60000 [==============================] - 2s - loss: 0.3738 - acc: 0.8895 - val_loss: 0.2756 - val_acc: 0.9217\n", 276 | "Epoch 82/100\n", 277 | "60000/60000 [==============================] - 2s - loss: 0.3726 - acc: 0.8922 - val_loss: 0.2745 - val_acc: 0.9224\n", 278 | "Epoch 83/100\n", 279 | "60000/60000 [==============================] - 2s - loss: 0.3693 - acc: 0.8926 - val_loss: 0.2728 - val_acc: 0.9231\n", 280 | "Epoch 84/100\n", 281 | "60000/60000 [==============================] - 2s - loss: 0.3695 - acc: 0.8919 - val_loss: 0.2715 - val_acc: 0.9226\n", 282 | "Epoch 85/100\n", 283 | "60000/60000 [==============================] - 2s - loss: 0.3659 - acc: 0.8923 - val_loss: 0.2698 - val_acc: 0.9230\n", 284 | "Epoch 86/100\n", 285 | "60000/60000 [==============================] - 2s - loss: 0.3661 - acc: 0.8899 - val_loss: 0.2684 - val_acc: 0.9238\n", 286 | "Epoch 87/100\n", 287 | "60000/60000 [==============================] - 3s - loss: 0.3636 - acc: 0.8918 - val_loss: 0.2671 - val_acc: 0.9236\n", 288 | "Epoch 88/100\n", 289 | "60000/60000 [==============================] - 2s - loss: 0.3605 - acc: 0.8945 - val_loss: 0.2656 - val_acc: 0.9242\n", 290 | "Epoch 89/100\n", 291 | "60000/60000 [==============================] - 2s - loss: 0.3591 - acc: 0.8952 - val_loss: 0.2644 - val_acc: 0.9244\n", 292 | "Epoch 90/100\n", 293 | "60000/60000 [==============================] - 2s - loss: 0.3583 - acc: 0.8953 - val_loss: 0.2631 - val_acc: 0.9247\n", 294 | "Epoch 91/100\n", 295 | "60000/60000 [==============================] - 2s - loss: 0.3550 - acc: 0.8963 - val_loss: 0.2618 - val_acc: 0.9259\n", 296 | "Epoch 92/100\n", 297 | "60000/60000 [==============================] - 3s - loss: 0.3526 - acc: 0.8971 - val_loss: 0.2602 - val_acc: 0.9260\n", 298 | "Epoch 93/100\n", 299 | "60000/60000 [==============================] - 2s - loss: 0.3517 - acc: 0.8982 - val_loss: 0.2591 - val_acc: 0.9263\n", 300 | "Epoch 94/100\n", 301 | "60000/60000 [==============================] - 2s - loss: 0.3497 - acc: 0.8968 - val_loss: 0.2578 - val_acc: 0.9271\n", 302 | "Epoch 95/100\n", 303 | "60000/60000 [==============================] - 2s - loss: 0.3455 - acc: 0.8994 - val_loss: 0.2562 - val_acc: 0.9272\n", 304 | "Epoch 96/100\n", 305 | "60000/60000 [==============================] - 2s - loss: 0.3444 - acc: 0.8993 - val_loss: 0.2551 - val_acc: 0.9279\n", 306 | "Epoch 97/100\n", 307 | "60000/60000 [==============================] - 2s - loss: 0.3434 - acc: 0.8992 - val_loss: 0.2539 - val_acc: 0.9282\n", 308 | "Epoch 98/100\n", 309 | "60000/60000 [==============================] - 2s - loss: 0.3438 - acc: 0.8987 - val_loss: 0.2526 - val_acc: 0.9284\n", 310 | "Epoch 99/100\n", 311 | "60000/60000 [==============================] - 2s - loss: 0.3376 - acc: 0.9017 - val_loss: 0.2510 - val_acc: 0.9291\n", 312 | "Epoch 100/100\n", 313 | "60000/60000 [==============================] - 2s - loss: 0.3394 - acc: 0.9009 - val_loss: 0.2499 - val_acc: 0.9291\n", 314 | " 9408/10000 [===========================>..] - ETA: 0sTest loss: 0.24992457343\n", 315 | "Test accuracy: 0.9291\n" 316 | ] 317 | } 318 | ], 319 | "source": [ 320 | "# モデルの構築\n", 321 | "model = Sequential()\n", 322 | "\n", 323 | "# 最初の隠れ層(入力784 -> 出力256)\n", 324 | "model.add(Dense(256, activation=\"relu\",input_shape=(784,)))\n", 325 | "model.add(Dropout(0.1))\n", 326 | "\n", 327 | "# 2つ目の隠れ層(256 -> 出力128)\n", 328 | "## 隠れ層は以下の2行をコピペすることで追加できます\n", 329 | "model.add(Dense(128, activation='relu'))\n", 330 | "model.add(Dropout(0.1))\n", 331 | "\n", 332 | "# 3つ目の隠れ層(128 -> 出力32)\n", 333 | "## 隠れ層は以下の2行をコピペすることで追加できます\n", 334 | "model.add(Dense(32, activation='relu'))\n", 335 | "model.add(Dropout(0.1))\n", 336 | "\n", 337 | "# 出力層(入力32 -> 出力10)\n", 338 | "model.add(Dense(10, activation='softmax'))\n", 339 | "\n", 340 | "# モデル概要表示\n", 341 | "model.summary()\n", 342 | "\n", 343 | "# モデルのコンパイル\n", 344 | "model.compile(loss='categorical_crossentropy',\n", 345 | " optimizer='SGD',\n", 346 | " metrics=['accuracy'])\n", 347 | "\n", 348 | "# フィッティング(学習)\n", 349 | "history = model.fit(x_train, y_train,\n", 350 | " batch_size=batch_size,\n", 351 | " epochs=epochs,\n", 352 | " verbose=1,\n", 353 | " validation_data=(x_test, y_test))\n", 354 | "\n", 355 | "# スコアの計算・表示\n", 356 | "score = model.evaluate(x_test, y_test, verbose=1)\n", 357 | "print('Test loss:', score[0])\n", 358 | "print('Test accuracy:', score[1])" 359 | ] 360 | }, 361 | { 362 | "cell_type": "code", 363 | "execution_count": 9, 364 | "metadata": {}, 365 | "outputs": [ 366 | { 367 | "name": "stdout", 368 | "output_type": "stream", 369 | "text": [ 370 | "10000/10000 [==============================] - 0s \n" 371 | ] 372 | }, 373 | { 374 | "data": { 375 | "text/plain": [ 376 | "[0.3218956942975521, 0.90890000000000004]" 377 | ] 378 | }, 379 | "execution_count": 9, 380 | "metadata": {}, 381 | "output_type": "execute_result" 382 | } 383 | ], 384 | "source": [ 385 | "model.evaluate(x_test, y_test, verbose=1)" 386 | ] 387 | }, 388 | { 389 | "cell_type": "code", 390 | "execution_count": 10, 391 | "metadata": {}, 392 | "outputs": [ 393 | { 394 | "data": { 395 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmsAAAJcCAYAAACmM+PxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VFX6x/HPmVQgAUKABEhICL0jCTFIkaDSVOyCIqI/\nFXXVdS27Yu+rK2sXC4soKhJRARERQYrAAgLBQGhChIQuLZQAIWXO748Z2IQECGUyKd/363Vfmbnn\n3LnPPER4vPeec4y1FhEREREpmxzeDkBERERETk7FmoiIiEgZpmJNREREpAxTsSYiIiJShqlYExER\nESnDVKyJiIiIlGEq1kRERETKMBVrIlKpGGPSjTGXejsOEZGSUrEmIiIiUoapWBMRAYwxdxlj0owx\ne40xk40x9d37jTHmTWPMTmPMAWNMqjGmjbutnzFmtTHmoDFmqzHmUe9+CxGpiFSsiUilZ4zpCbwC\n3AjUAzKAJHdzL6A70Ayo4e6zx932MXC3tTYYaAPMKsWwRaSS8PV2ACIiZcAgYLS1dhmAMeZxINMY\nEw3kAsFAC2CxtXZNgeNygVbGmOXW2kwgs1SjFpFKQVfWRESgPq6raQBYa7NwXT1rYK2dBbwHjAB2\nGmNGGmOqu7teB/QDMowxvxhjOpdy3CJSCahYExGBbUDUsTfGmGpAKLAVwFr7jrU2FmiF63bo3937\nl1hrrwLqApOA8aUct4hUAirWRKQy8jPGBB7bgHHA7caYDsaYAOCfwK/W2nRjTCdjzIXGGD/gEJAN\nOI0x/saYQcaYGtbaXOAA4PTaNxKRCkvFmohURlOBIwW2HsDTwLfAdqAxMNDdtzrwH1zPo2Xguj06\n3N02GEg3xhwA7sH17JuIyHllrLXejkFERERETkJX1kRERETKMBVrIiIiImWYijURERGRMkzFmoiI\niEgZVqFWMKhdu7aNjo726DkOHTpEtWrVPHqOsk45UA5AOQDlAJQDUA5AOYCzy0FycvJua22d0/Wr\nUMVadHQ0S5cu9eg55syZQ48ePTx6jrJOOVAOQDkA5QCUA1AOQDmAs8uBMSbj9L10G1RERESkTFOx\nJiIiIlKGqVgTERERKcMq1DNrIiIiUjpyc3PZsmUL2dnZ1KhRgzVr1ng7JK86VQ4CAwOJiIjAz8/v\nrD5bxZqIiIicsS1bthAcHEx0dDRZWVkEBwd7OySvOnjwYLE5sNayZ88etmzZQqNGjc7qs3UbVERE\nRM5YdnY2oaGhGGO8HUqZZowhNDSU7Ozss/4MjxVrxphIY8xsY8xqY8wqY8yDxfQZZIxZYYxJNcYs\nMMa0L9CW7t6fYozx7HwcIiIicsZUqJXMuebJk7dB84BHrLXLjDHBQLIxZoa1dnWBPhuBi621mcaY\nvsBI4MIC7YnW2t0ejPGMJGdkMuWPHIIbZRIbFeLtcERERKQS8NiVNWvtdmvtMvfrg8AaoMEJfRZY\nazPdbxcBEZ6K51wlZ2Ry038W8e36XAaNWkRyRubpDxIRERGPCQoK8nYIpcJYaz1/EmOigblAG2vt\ngZP0eRRoYa290/1+I5AJWOAja+3Ikxw3FBgKEBYWFpuUlHTe4weYnJbDhLRcwFXhXtvUjysa+3vk\nXGVdVlZWpfkP5GSUA+UAlANQDqDy5qBGjRo0adIEgPz8fHx8fEo9hnr16rF9+/ZSP29xTpeDtLQ0\n9u/fX2hfYmJisrU27rQfbq316AYEAcnAtafok4jryltogX0N3D/rAsuB7qc7V2xsrPWUpel7bdMn\np9qox6bY6GFT7IK0XR47V1k3e/Zsb4fgdcqBcmCtcmCtcmBt5c3B6tWrj78+cOBAiY5Zmr7Xvjdr\nvV2avve8xFCtWjVrrbVOp9M++uijtnXr1rZNmzY2KSnJWmvttm3bbLdu3Wz79u1t69at7dy5c21e\nXp4dMmTI8b5vvPHGeYnldDkomK9jgKW2BLWUR6fuMMb4Ad8CY621E07Spx0wCuhrrd1zbL+1dqv7\n505jzEQgHtfVOa+IjQph3F0J/HvSryzcns8XizZxYaNQHA49XCkiIpXbv6b/wfrdR07Z52B2Lmt3\nHMRpwWGgRXgwwYEnn3esVf3qPHtl6xKdf8KECaSkpLB8+XJ2795Np06d6N69O19++SW9e/fmySef\nJD8/n8OHD5OSksLWrVtZuXIlAPv27Sv5F/UST44GNcDHwBpr7Rsn6dMQmAAMttauK7C/mntQAsaY\nakAvYKWnYi2p2KgQ7m4fyBP9WvBD6nbe+nnd6Q8SERERDmTn4XQ/eeW0rvfny/z587npppvw8fEh\nLCyMiy++mCVLltCpUyc++eQTnnvuOVJTUwkODiYmJoYNGzbwwAMPMG3aNKpXr37e4vAUT15Z6wIM\nBlKNMSnufU8ADQGstR8CzwChwPvuYa151nXvNgyY6N7nC3xprZ3mwVjPyF3dYvhj5yHemZVGozrV\nuOaCMjsuQkRExOMe69X4tJPiJmdkMmjUInLznPj5Onh74AUen1mhe/fuzJ07lx9++IHbbruNhx9+\nmFtvvZXly5fz008/8eGHHzJ+/HhGjx7t0TjOlceKNWvtfOCU9witazDBncXs3wC0L3pE2WCM4cWr\n27Bp72Ee+yaVyJCqxEXX8nZYIiIiZVZsVAhj70xg0YY9JMSEntdCrVu3bnz00UcMGTKEvXv3Mnfu\nXIYPH05GRgYRERHcddddHD16lGXLltGvXz/8/f257rrraN68Obfccst5i8NTtNzUWfL3dfDBLR25\n5v0FDP08mUl/6ULD0KreDktERKTMio0K8cjVtGuuuYaFCxfSvn17jDG89tprhIeHM2bMGIYPH46f\nnx9BQUF89tlnbN26ldtvvx2n0wnAK6+8ct7jOd9UrJ2JjIU0TP8KNleFyHhqVvXn4yFxXPP+Au4Y\ns4Rv/3IR1U/xsKSIiIicP1lZWYDrjtfw4cMZPnx4ofYhQ4YwZMiQIsctW7asVOI7X7Q2aEllLIRP\n+9Eo/UsY0x82LwYgpk4QH9zSkY27D3Hf2GXk5Tu9HKiIiIhUJCrWSmrTArDW9RBeXjakzzvedFHj\n2rx8TRvmrd/NC1NWn/QjRERERM6UboOWVHQ38A3E5h3BYMG/8KiXAZ0asmHXIT6au4HGdYIYclG0\nd+IUERGRCkVX1koqMh6GTCY9agDUaAhzXoHM9EJd/tGnBZe1CuP571cx5/ed3olTREREKhQVa2ci\nMp6MRjfDrZPA5sO4m+Fo1vFmH4fhrQEdaBFenfu//I3fdxz0YrAiIiJSEahYOxuhjeH60bBrDUy6\nF5z/G1RQLcCXj2+Lo6q/D3eMWcLurKNeDFRERETKOxVrZ6vJpXDZC7BmMswtPFS4Xo0qjBoSx+6s\no9z8n0W8/fM6kjMyvRSoiIiIlGcq1s5F5/uh3UCY809YM6VQU7uImjyQ2IR1f2bx5s/rGTRqkQo2\nERERLwoKCjppW3p6Om3atCnFaEpOxdq5MAaufBvqd4SJd8Ofq4u0H1tv62iuk0Ub9pR6iCIiImXG\n5sUw7/Xjc5VKyWjqjnPlFwgDx8LIRBg3EIbOgaqudUITYkIJ8HOQnevEArWq+XszUhEREY8ImP0s\n7Pn91J2OHoA/V4J1gnFAWBsIqH7y/uFtoe+rp/zIYcOGERkZyX333QfAc889h6+vL7NnzyYzM5Pc\n3FxeeuklrrrqqjP6PtnZ2dx7770sXboUX19f3njjDRITE1m1ahW33347OTk5OJ1Ovv32W+rXr8+N\nN97Ipk2bsNby9NNPM2DAgDM63+noytr5UL0+DPgCDm6Hr2+D/Dzgf4vW/rVnE+oG+/POzPXs0YAD\nERGpjLL3uwo1cP3M3n/OHzlgwADGjx9//P348eMZMmQIEydOZNmyZcyePZtHHnkEa+0Zfe6IESMw\nxpCamsq4ceMYMmQI2dnZfPjhhzz44IOkpKSwdOlSIiIimDZtGvXr12fBggWsXLmSPn36nPP3OpGu\nrJ0vkZ1ct0Qn3QvTnzr+fwPHFq3t1Tqcaz9YwINJKYz5v3h8HOY0HygiIlI+HE18Hv/g4FN32rzY\ntVxjfg74+MN1o1xzmJ6DCy64gJ07d7Jt2zZ27dpFSEgI4eHhPPTQQ8ydOxeHw8HWrVv5888/CQ8P\nL/Hnzp8/nwceeACAFi1aEBUVxbp16+jcuTMvv/wyW7Zs4dprr6Vp06a0bduWRx55hGeeeYZrr72W\nbt26ndN3Ko6urJ1PHW6GhL/Arx/Ab18UamrToAYvXdWG+Wm7eXPGOi8FKCIi4iXuyeXp+aTr5zkW\nasfccMMNfPPNN3z11VcMGDCAsWPHsmvXLpKTk0lJSSEsLIzs7Ozzcq6bb76ZyZMnU6VKFfr168es\nWbNo1qwZy5Yto1WrVjz11FO88MIL5+VcBenK2vl22YuwczVMeQhqNyv0y3hjp0iWbcrkvdlpdIis\nyaWtwrwYqIiISCmLjD9vRdoxAwYM4K677mL37t388ssvjB8/nrp16+Ln58fs2bPJyMg448/s1q0b\nY8eOpWfPnqxbt45NmzbRvHlzNmzYQExMDH/961/ZtGkTK1asoEWLFtSqVYuBAwdSr149Ro0adV6/\nH+jK2vnn4wvXfwLVG0DSINi/tVDzc/1b06ZBdR4an8KmPYe9FKSIiEjF0Lp1aw4ePEiDBg2oV68e\ngwYNYunSpbRt25bPPvuMFi1anPFn/uUvf8HpdNK2bVsGDBjAp59+SkBAAOPHj6dNmzZ06NCBlStX\ncuutt5Kamkp8fDxdunTh+eef56mnnjrv31FX1jyhai24aRyMuhQ+vxraXA+NEyEynkA/Hz4YFMsV\n787nni+SmfCXiwj08/F2xCIiIuVWamrq8de1a9dm4cKFxfbLysoqdj9AdHQ0K1euBCAwMJBPPvmk\nSJ9hw4YxbNiwQvt69+5N7969OXjwIMGne27vLOnKmqfUbQnd/w6717kmzR3T//i8MpG1qvLWgA6s\n2XGApyatPONRKiIiIlJ56MqaJ9l8wAAW8o5C+rzj9+oTW9TlgZ5NeWfmemKjQrgpvqFXQxUREakM\nUlNTGTx4cKF9AQEB/Prrr16K6PQ8VqwZYyKBz4AwwAIjrbVvn9DHAG8D/YDDwG3W2mXutiHAsRu/\nL1lrx3gqVo+J7ga+gZB3BHBCaLNCzQ9e0pSUzft49rtVtK5fnXYRNb0Tp4iIyFmw1uL6p7z8aNu2\nLSkpKaV6znO9g+bJ26B5wCPW2lZAAnCfMabVCX36Ak3d21DgAwBjTC3gWeBCIB541hgT4sFYPePY\nMOXOD4BvFdeUHs78480+DsPbAzpQJziAe79YRuahHC8GKyIiUnKBgYHs2bNHj/KchrWWPXv2EBgY\neNaf4bEra9ba7cB29+uDxpg1QAOg4AKaVwGfWdef9CJjTE1jTD2gBzDDWrsXwBgzA+gDjPNUvB5z\nbJhyWGuYdA/MfxO6P3q8OaSaP+8P6sgNHy7kwa9S+OS2TpowV0REyryIiAi2bNnCrl27yM7OPqdi\npCI4VQ4CAwOJiIg46882pVERG2OigblAG2vtgQL7pwCvWmvnu9/PBB7DVawFWmtfcu9/Gjhirf13\nMZ89FNdVOcLCwmKTkpI8+l2ysrIICgo68wOtpeWa16mzawG/XfAqB6sXviU6e1MuY1bncFVjP65p\nWrbXED3rHFQgyoFyAMoBKAegHIByAGeXg8TExGRrbdzp+nl8gIExJgj4FvhbwULtfLHWjgRGAsTF\nxdkePXqc71MUMmfOHM76HAkXwIddiU3/AO6eBwH/+0O92Fqyvl7BhN+2cHX3DiQ2r3t+AvaAc8pB\nBaEcKAegHIByAMoBKAfg2Rx4dOoOY4wfrkJtrLV2QjFdtgKRBd5HuPedbH/5VqUmXPMRZKbDtMcK\nNRljeOnqNrQIr879Y5fxz6lrSM7I9E6cIiIiUmZ4rFhzj/T8GFhjrX3jJN0mA7calwRgv/tZt5+A\nXsaYEPfAgl7ufeVfdBfo+rBr7dBVkwo1VfH34f7ExhzKyWfk3A0MGrVIBZuIiEgl58nboF2AwUCq\nMebYGNkngIYA1toPgam4pu1IwzV1x+3utr3GmBeBJe7jXjg22KBC6DEMNsyG7/8KEXFQ438PHabv\nOXxsZjaO5jpZtGEPsVHlbyCsiIiInB+eHA06H9eMsKfqY4H7TtI2GhjtgdC8z8cPrv0PfNgNJt4D\nt34HDteSUwkxoQT4OcjOdWKBukEB3o1VREREvErLTXlLaGPo95prVYMF7xzfHRsVwtg7E/hrzybU\nqurPh3P/IDs3/xQfJCIiIhWZijVv6jAIWl0Ns16Cbb8d3x0bFcLDvZrz9k0d+GPXIV6b9rsXgxQR\nERFvUrHmTcbAlW9BUBh8eyfkHCrU3K1pHYZ0jmL0fzeyIG23l4IUERERb1Kx5m1VQlzTeez5A6Y9\nXqR5WN+WxNSuxqNfL2f/kVwvBCgiIiLepGKtLGjUDbr+DZaNgTXfF2qq4u/DGwM68OfBozw/eZWX\nAhQRERFvUbFWVvR4AupfAJMfgAPbCjV1iKzJfYlNmPDbVn5M3e6lAEVERMQbVKyVFb7+cO0oyDsK\n426Cuf+GzYuPNz/QswntImrwxMRUdh7M9mKgIiIiUppUrJUltZtA/N2wPcU1QnRM/+MFm5+Pgzdu\nbM/hnHyGfZuKa4o6ERERqehUrJU1AcHuFxbyc1zzsLk1qRvMY31aMGvtTpKWbPZOfCIiIlKqVKyV\nNY26gW+g+42Fhl0KNd92UTRdmoTy4pTVbNpzuPTjExERkVKlYq2siYyHId9DiyvAOmH32kLNDodh\n+PXt8XEYHh6fQr5Tt0NFREQqMhVrZVFkPAz4AqK7wfRn4EDhEaD1a1bhhataszQjk5FzN3gpSBER\nESkNKtbKKmPgyrch/yhMfRROGFBwdYcG9Gsbzhszfmf1tgNeClJEREQ8TcVaWRbaGHo8DmunwOrv\nCjUZY3jp6rbUqOLPw+NTOJqnxd5FREQqIhVrZV3n+6Fee5j6dziSWaipVjV/Xru+LWt3HOQf36xg\nxOw0kjMyT/JBIiIiUh6pWCvrfHyh/7tweA9Mf6pIc88WYVzWMozvUrbx+vTfGTRqkQo2ERGRCkTF\nWnlQrz1c9AD89gVsmFOkuXX96gA4LeTmOVm0YU8pBygiIiKeomKtvOgxDGo1hu8fhJzC86t1a1YH\nfx/3H6UxJMSEeiFAERER8QQVa+WFXxXo/w5kpsOcfxZqio0KYdzQBNo2qI61lkA//bGKiIhUFPpX\nvTyJ7godh8DCEbB1WaGm2KgQPr/jQmpV8+fxCamaLFdERKSC8FixZowZbYzZaYxZeZL2vxtjUtzb\nSmNMvjGmlrst3RiT6m5b6qkYy6XLXoBqdWHyA5CfW6ipZlV/nr2yNSu27OeT/270UoAiIiJyPnny\nytqnQJ+TNVprh1trO1hrOwCPA79Ya/cW6JLobo/zYIzlT5WacPnr8OdK+O/bRZqvaFePni3q8vr0\ndWzeq7VDRUREyjuPFWvW2rnA3tN2dLkJGOepWCqclldAq6vgl9dg9/pCTcYYXry6DQ4DT05aibW6\nHSoiIlKeGU/+Y26MiQamWGvbnKJPVWAL0OTYlTVjzEYgE7DAR9bakac4figwFCAsLCw2KSnpvMVf\nnKysLIKCgjx6jpLwP5pJpyX3cahaFCkdXgZTuO6ekZHL2DU5DG0XwEX1fc/ructKDrxJOVAOQDkA\n5QCUA1AO4OxykJiYmFySO4jn91/xs3Ml8N8TboF2tdZuNcbUBWYYY9a6r9QV4S7kRgLExcXZHj16\neDTYOXPm4OlzlFidLGpOvp8eQRuh0x2Fmro5Las+WMA3fxzmnqsuolY1//N22jKVAy9RDpQDUA5A\nOQDlAJQD8GwOysJo0IGccAvUWrvV/XMnMBGI90JcZd8Ft0Cj7jDjWTiwrVCTj8Pw6nVtOXAkl5d+\nWO2lAEVERORcebVYM8bUAC4Gviuwr5oxJvjYa6AXUOyI0krPGLjybXDmwTf/B3Nfh82Ljze3CK/O\nPRc3ZsKyrcxdt8uLgYqIiMjZ8uTUHeOAhUBzY8wWY8wdxph7jDH3FOh2DTDdWnuowL4wYL4xZjmw\nGPjBWjvNU3GWe7ViXFfYNi2EWS/CmP6FCrb7ezYhpnY1npyUyuGcPC8GKiIiImfDY8+sWWtvKkGf\nT3FN8VFw3wagvWeiqqCCwtwvLOTnQPo8iHTdOQ708+GVa9syYOQi3vp5PU/0a+m9OEVEROSMlYVn\n1uRcxVwMPgGu18ZAdLdCzRfGhHJTfCSj5m1g5db9XghQREREzpaKtYogMh5umwINYsGZD76BRboM\n69uS0KAAHvt2BXn5Ti8EKSIiImdDxVpFERkPg76BqrXgh0fAWbggq1HFj+f7t2bVtgN8PF9LUYmI\niJQXKtYqkqq1XGuHblkMKWOLNPdtE86lLcN48+d1bNqjpahERETKAxVrFU37myHyQvj5WThceLUv\n11JUrfF1OHhiYqqWohIRESkHVKxVNA4HXP4GHNkHM18o0lyvRhUe69Oc+Wm7mbBsqxcCFBERkTOh\nYq0iCm8DF94NyZ/C1uQizYMujCI2KoRnJ69k+E9rSc7ILP0YRUREpERUrFVUPR53zb825WHXCNEC\nHA7DrQlRZB3NZ8TsPxg0apEKNhERkTJKxVpFFVgder8M21Mg+ZMizVv2HcG4X+fkOVm0YU/pxici\nIiIlomKtImtznWuC3JkvQFbhtUETYkIJ8HX98VsLHRvW9EaEIiIichoq1ioyY+Dy1yHnMMx4plBT\nbFQIY+9K4IbYCCyweKNug4qIiJRFKtYqujrNofN9sPxLyFhYqCk2KoThN7Tnyvb1GTEnjY27D3kp\nSBERETkZFWuVwcX/gOoRrpUN8vOKND99eUsCfBw8891Kzb0mIiJSxqhYqwz8q0HfV2HnKlj8UZHm\nutUD+Xuf5sxbv5vvV2z3QoAiIiJyMirWKosWV0CTy2D2P+HAtiLNgy6Mol1EDV6cspr9R3K9EKCI\niIgUR8VaZWEM9HsN8nPhpyeLNPs4DC9f3ZY9WUd5ffrvXghQREREiqNirTKpFQNdH4JVE2DDnCLN\nbSNqcGvnaD5flMHyzftKPz4REREpQsVaZdP1bxASDT88CnlHizQ/0qsZdYICeGJiKnn5ztKPT0RE\nRApRsVbZ+FWBfv+GPeth4XtFmoMD/Xj2ytas2naAzxdleCFAERERKUjFWmXU9DLXgIM5r8L0Z2Dz\n4kLN/dqGc3GzOrw+fR079md7KUgREREBDxZrxpjRxpidxpiVJ2nvYYzZb4xJcW/PFGjrY4z53RiT\nZowZ5qkYK7V2AyE/Bxa8DWP6FyrYjDG8cFVrcvOdvDBllReDFBEREU9eWfsU6HOaPvOstR3c2wsA\nxhgfYATQF2gF3GSMaeXBOCunPevg2FLu+UchfV6h5qjQajzQswlTU3cwe+3O0o9PREREAA8Wa9ba\nucDeszg0Hkiz1m6w1uYAScBV5zU4cS3w7hvgem0tNOhUpMtd3WNoXKcaz0xeyZGc/FIOUERERACM\nJ5cXMsZEA1OstW2KaesBfAtsAbYBj1prVxljrgf6WGvvdPcbDFxorb3/JOcYCgwFCAsLi01KSvLA\nN/mfrKwsgoKCPHqO0lJ9/1rCt/9M/R0zSI+6kfRGg4r0WbMnn38tyeaKGD+ub+YPVKwcnC3lQDkA\n5QCUA1AOQDmAs8tBYmJisrU27nT9fM86qnO3DIiy1mYZY/oBk4CmZ/oh1tqRwEiAuLg426NHj/Ma\n5InmzJmDp89RenoA98C3dxG9ehLRVz4GtZsU6bE+P4Xvl2/jwas60zQsuILl4OwoB8oBKAegHIBy\nAMoBeDYHXhsNaq09YK3Ncr+eCvgZY2oDW4HIAl0j3PvEU3q9BL6BMPUR1y3REzzRryVV/X15cpIW\nehcRESltXivWjDHhxhjjfh3vjmUPsARoaoxpZIzxBwYCk70VZ6UQHAY9n3atarBqYpHm2kEBDOvb\ngsUb9/LtMtXNIiIipcmTU3eMAxYCzY0xW4wxdxhj7jHG3OPucj2w0hizHHgHGGhd8oD7gZ+ANcB4\na63mj/C0TndAeDuY9jhkHyjSPCAuko4Na/L896v4dl0OyRmZXghSRESk8vHkaNCbrLX1rLV+1toI\na+3H1toPrbUfutvfs9a2tta2t9YmWGsXFDh2qrW2mbW2sbX2ZU/FKAU4fOCKNyHrT9dkuSc2Owy3\nJERxMDuP7zfkMmjUIhVsIiIipUArGMj/RMRB7G3w64ewI7VI8/b92cdmZiMnz8miDXtKNTwREZHK\nSMWaFHbJM1ClJvzwCDgLL+SeEBNKgK/rV8Za6NiwpjciFBERqVRUrElhVWvBZS/A5l9h+ZeFmmKj\nQhh7VwLdG/higbnrd3snRhERkUpExZoU1f5miEyA6U/D4cKLUMRGhfB/bQO4MS6CkXM3sGrbfi8F\nKSIiUjmoWJOiHA64/HXI3g8zny+2yxP9WhJS1Z9h36aSl+8sto+IiIicOxVrUrzwNpBwLySPgc1L\nijTXrOrP8/1bk7p1P5/8N7304xMREakkVKzJyfUYBsHh8MPDkJ9XpLlf23AubRnG6zN+Z9Oew14I\nUEREpOJTsSYnFxAMfV6BHStg6cdFmo0xvHh1a3wdDp6YmKqlqERERDxAxZqcWquroXFPmPUSHPyz\nSHO9GlV4rG8L5qft1lJUIiIiHqBiTU7NGOj3b8jLhulPFdtlUHxD4qJCeHHKanYdPFrKAYqIiFRs\nKtbk9EIbQ9eHIHU8bJxbpNnhMLx6XVuO5OTzwpTVXghQRESk4lKxJiXT9SGoGQWT/kLD9K9g8+JC\nzU3qBnN/zyZ8v3wbM9cUvV0qIiIiZ0fFmpSMXxXodBfs30yj9C9hTP8iBds9FzemWVgQT01aSdbR\noqNHRURE5MypWJOSc+YAuBZzz8+B9HmFmv19Hbx6XTt2HMhm+LS1pR+fiIhIBVSiYs0Yc40xpkaB\n9zWNMVd7Liwpk6K7gW8grgk6LDS8qEiXjg1DGNI5ms8WZZCcsbdIu4iIiJyZkl5Ze9Zae3wRSGvt\nPuBZz4RhrWFIAAAgAElEQVQkZVZkPAz5nl11uoB1wrZlxXZ7tHdz6teowmPfpnI0L7+UgxQREalY\nSlqsFdfP93wGIuVEZDyrW/0dmvWBmS/Cnj+KdAkK8OWla9qQtjOLD+YUbRcREZGSK2mxttQY84Yx\nprF7ewNI9mRgUoYZA1e8CT7+MPkBcBZdyD2xeV2u6lCfEbPTWP/nQS8EKSIiUjGUtFh7AMgBvgKS\ngGzgPk8FJeVA9frQ55+Q8V9YMqrYLs9c0YqgAF/u+3IZ781aT3JGZikHKSIiUv6VqFiz1h6y1g6z\n1sZZaztZa5+w1h7ydHBSxnUYBI0vgZ+fg8z0Is2hQQEMTohi3Z9ZvD59HYNGLVLBJiIicoZKOhp0\nhjGmZoH3IcaYnzwXlpQLxkD/d8A4XLdDi1nIPcDP9StmgZw8J4s27CnlIEVERMq3kt4Gre0eAQqA\ntTYTqHuqA4wxo40xO40xK0/SPsgYs8IYk2qMWWCMaV+gLd29P8UYs7SEMYo31IiAXi+6lqFK/qRI\nc0JMbQJ83QWbhdiomkX6iIiIyMmVtFhzGmMaHntjjIkGil5GKexToM8p2jcCF1tr2wIvAiNPaE+0\n1naw1saVMEbxltjboNHFMP0Z2Le5cFNUCF/elcA1FzTAAj+v3umVEEVERMqrkhZrTwLzjTGfG2O+\nAH4BHj/VAdbaucBJZ0W11i5wX6EDWARElDAWKWuMgf7vuuZe+/6vRW6HxkaF8OaADgxOiGLU/I3M\nXbfLS4GKiIiUP8YW85xRsR2NqQsMBX4DqgA73QXZqY6JBqZYa9ucpt+jQAtr7Z3u9xuBTFxX7z6y\n1p541a3gsUPdcREWFhablJRUou9ztrKysggKCvLoOcq6k+Wg/tapNFv/EWubP8COepcWac/Jtzy3\n8AiHcuHFLlWo7m9KI1yP0O+BcgDKASgHoByAcgBnl4PExMTkEt1BtNaedgPuBFJxFVCzgSPArBIc\nFw2sPE2fRGANEFpgXwP3z7rAcqB7SeKMjY21njZ79myPn6OsO2kO8vOt/eRya/8Zae3+rcV2Wb1t\nv2365FT7f58stk6n03NBeph+D5QDa5UDa5UDa5UDa5UDa88uB8BSW4L6pqS3QR8EOgEZ1tpE4AJg\n36kPOT1jTDtgFHCVtfb4MEFr7Vb3z53ARCD+XM8lpcDhcI0OdebC938rdnRoy3rVebxvC2au3cnn\nizK8EKSIiEj5UtJiLdtamw1gjAmw1q4Fmp/Lid0DFiYAg6216wrsr2aMCT72GugFFDuiVMqgWjFw\nyTOw/idY8VWxXW67KJoezevw8g9rWKfVDURERE6ppMXaFvc8a5OAGcaY74BTXhYxxowDFgLNjTFb\njDF3GGPuMcbc4+7yDBAKvH/CFB1huAYzLAcWAz9Ya6ed4fcSb4q/GyIT4MfH4OCOIs3GGIZf357g\nQF/+Ou43snO12LuIiMjJlGgxdmvtNe6XzxljZgM1gFMWUNbam07TfieuZ+FO3L8BaF/0CCk3HA64\nagR82AWmPAwDx7pGjBZQJziA4Te05/ZPlvDqj2t5rn9rLwUrIiJStpX0ytpx1tpfrLWTrbU5nghI\nKojaTSDxSfj9B1j5bbFdEpvX5fYu0Xy6IJ3ZazX/moiISHHOuFgTKbHO90GDONdgg5kvwObFRbo8\n1qcFLcKD+fs3y9l18KgXghQRESnbVKyJ5zh8IOEeyDkI816HMf2LFGyBfj68c9MFHMzO49Gvl+N0\nlmzePxERkcpCxZp41r5NgPt5tbxsSJ9XpEuzsGCeurwlv6zbxacL0ks1PBERkbJOxZp4VnQ38A10\nv7EQUKPYbrckRHFpy7q8+uNa1mw/UHrxiYiIlHEq1sSzIuNhyGS4+DGoHgFzXzvpdB7/uq4dNar6\naToPERGRAlSsiedFxkPiE3DLN3D0IHx9O+TnFukWGhTAGze2Z/3OLP6WlMKI2WkkZ2R6IWAREZGy\nQ8WalJ66LeHKt2HTApj5fLFdujWtQ//29Zi2agf//ul3Bo1apIJNREQqNRVrUrra3Qid7oIF78Lq\nycV2aVI3CAAL5OQ5WbRhT7H9REREKgMVa1L6er/smn9t0l9gd1qR5i5N6hDg6/rVtBZahAeXdoQi\nIiJlhoo1KX2+AXDjGPDxg/GDIedQoebYqBC+vCuBwQlR+PkY3p2VpgEHIiJSaalYE++oEQHXfww7\n18CUh1yX0AqIjQrhxavb8O7NHVm+ZR+PjNeEuSIiUjmpWBPvadzTNUp0xVew9ONiu/RuHc4TfVvy\nQ+p2/j3991IOUERExPtUrIl3dXsUmlwG0x6HLcnFdrmzWyNuvrAh78/5g/FLNpdygCIiIt6lYk28\ny+GAa0dCUDh8PQQOFR35aYzh+f6t6da0Nk9MTOW/abu9EKiIiIh3qFgT76taCwZ8Bll/woQ7wVl0\nMIGfj4MRgzoSU6ca93yRTNrOg14IVEREpPSpWJOyof4F0Pc1+GMW/PJasV2qB/ox+rZOBPj6cPun\nS9iddbSUgxQRESl9Ktak7Ii9DdrfDL/8C9bPKLZLREhVRg2JY9fBowz9bKmm9BARkQpPxZqUHcbA\n5a9DWGvX+qHTn4bNi4t06xBZkzdv7MCyTft49GtN6SEiIhWbijUpW/yrQrdHIOcgLHgHxlxZbMHW\nt209hvVtwZQV23ljxjovBCoiIlI6PFqsGWNGG2N2GmNWnqTdGGPeMcakGWNWGGM6FmgbYoxZ796G\neDJOKWMyN3L8VzMvG9JmFtvt7u4xDOwUyXuz0/h6qab0EBGRisnTV9Y+Bfqcor0v0NS9DQU+ADDG\n1AKeBS4E4oFnjTEhHo1Uyo7obq4lqYz71/P3qZBzuEg3YwwvXt2Grk1cU3os/EMLvouISMXj0WLN\nWjsX2HuKLlcBn1mXRUBNY0w9oDcww1q711qbCczg1EWfVCSR8TBkMvR8Cno8DjtSXWuI5hUd/Xls\nSo/o0GrcOWYJL05ZTXJGpheCFhER8QxjrWcfzjbGRANTrLVtimmbArxqrZ3vfj8TeAzoAQRaa19y\n738aOGKt/XcxnzEU11U5wsLCYpOSkjzzRdyysrIICgry6DnKutLOQfj2GbT4/T121e7M6lZ/xzp8\nivRZsiOXESk5APg54LFOgTQJKdrvfNHvgXIAygEoB6AcgHIAZ5eDxMTEZGtt3On6+Z51VGWEtXYk\nMBIgLi7O9ujRw6PnmzNnDp4+R1lX+jnoAYsiqDNtGBfvGw9Xf+Ba+aCAVbPTcJjfcVrIdcJmRzh3\n9mjtsYj0e6AcgHIAygEoB6AcgGdz4O3RoFuByALvI9z7TrZfKquEe123RVckwdRH4IQrwgkxofj7\nOnAY1/uvkzfrdqiIiFQI3i7WJgO3ukeFJgD7rbXbgZ+AXsaYEPfAgl7ufVKZdXsUuj4ES0fD9KcK\nFWyxUSGMvTOBR3o158NbOlI3OIDBH/+qdURFRKTc8+htUGPMOFzPn9U2xmzBNcLTD8Ba+yEwFegH\npAGHgdvdbXuNMS8CS9wf9YK19lQDFaQyMAYueRZyDsHC9yAgGHoMO94cGxVCbJRr0HDHqBBu/Xgx\nt3+yhPduvoBercO9FbWIiMg58WixZq296TTtFrjvJG2jgdGeiEvKMWOgz79cBducV8C/Glz0QJFu\ndYMDSRqawJBPlnDv2GW8fkN7rr6ggRcCFhEROTfevg0qcuYcDuj/LrS+xnU7dMnHxXarWdWfsXde\nSHx0LR4an8IXizJKOVAREZFzp2JNyieHD1wzEpr1gR8egeVfFdstKMCXT27vRM/mdXlq0ko+mPNH\nKQcqIiJybsr91B1Sifn6ww1j4MsbYNK9sH8LGFwrIETGH+8W6OfDh4NjeXj8cv41bS1ZR3N5tFdz\njDHei11ERKSEVKxJ+eYXCAPHwahLYdYLgMO1VNWQyYUKNj8fB28N6EBQgA8jZv9BVnYez17ZGodD\nBZuIiJRtug0q5V9AELS80v3G6Vr8PX1ekW4+DsM/r2nL0O4xjFmYwaPfLCcv31m6sYqIiJwhXVmT\niqHpZbDgHVehhoVtyyE/D3wK/4obY3i8bwuCA3x5fcY6tmYeoUuTULo0qXN82g8REZGyRFfWpGKI\njIch30PPp6HNdbDmO9ezbEf2FelqjOGBS5pye5doft24lzdmrOfm/yzSigciIlImqViTiiMyHro/\nCtePdk3tsXEefHwZ7Cl+BGjtoACOPbF2NM/JV0s2lV6sIiIiJaRiTSqmjrfCrZPg0G4YdQlsnFuk\nS0JMKAF+rvVEDTB+6RbenLGOfKct+nkiIiJeomJNKq7ornDXLAgKg8+vgeRPCzUXXE907J0Xcm3H\nBrw9cz23jPqVnQezvROziIjICVSsScVWqxHcMR1iesD3D8K0x10DD9xio0K4L7EJFzWpzRs3dmD4\n9e34bXMm/d6er0XgRUSkTFCxJhVfYA246StI+Asseh/GDYTs/cV2vSEuksn3d6VmVT9u+fhX3vpZ\nt0VFRMS7VKxJ5eDjC31egSvegg2zYdRlsHdDsV2bhQUz+f4uXHNBA976eT2DP9ZtURER8R4Va1K5\nxN0OgyfCoZ3wn0tg8SiY9zpsXlyoW1V/3+O3RZdtct0WXaDboiIi4gUq1qTyadQd7pwJ/tVg6iMw\n80UY079IwQau26Lf3deVGlV8GaTboiIi4gUq1qRyCm0M7W9yv7GQdwTWTCm2a/PwYCbf3/X4bdGr\nR8zn63VHNYmuiIiUChVrUnk1vQx8q8CxqXEXj4Qlo8BZdL3QagGu26L3JTYmdesBftiQx4CPFrIk\nfW/pxiwiIpWOijWpvCLjYchkuORpuPFzaHgh/PAIfNYfMtOLPaSqvy8Od22X57Tc/+Uylm3SFTYR\nEfEcFWtSuUXGQ7dHoFV/GDwJrnwHtqXA+xfBryOLXGVLiAnF39eBA/DzMeTkObn2/QX8/evl7M46\n6p3vICIiFZqKNZFjjIHYIXDfIojqDD/+HcZcUWht0WOrHlzb1I+koZ2Z91hP7u4ew8TfttLz33P4\nbGG6BiCIiMh55dFizRjTxxjzuzEmzRgzrJj2N40xKe5tnTFmX4G2/AJtkz0Zp0ghNSJg0Ddw1fuw\nYyV80AUWvg/OfMBVsF3R2J/YqBCCAnx5vF9Lpv2tG20javDMd6u48t35JGfoWTYRETk/PFasGWN8\ngBFAX6AVcJMxplXBPtbah6y1Hay1HYB3gQkFmo8ca7PW9vdUnCLFMgYuGOS6ytaoO/z0OHzSD3an\nFdu9Sd1gvrjjQkbc3JHMwzlc98FCHhm/nF0HdWtURETOja8HPzseSLPWbgAwxiQBVwGrT9L/JuBZ\nD8Yjcuaq14ebv4IVX8GPj8GHXaDjrTTcdQg2V3U98+ZmjOHydvXo0bwO781OY9S8DUxftYOHezWj\ndf3qLEnPJCEmlNioEC9+IRERKW+MtZ55vsYYcz3Qx1p7p/v9YOBCa+39xfSNAhYBEdbafPe+PCAF\nyANetdZOOsl5hgJDAcLCwmKTkpI88XWOy8rKIigoyKPnKOsqaw78j+6l1arh1DywGgtY40tK+5c4\nULNlsf23ZzkZuyaHlXvyj00Ogp8D/tEpkCYhPqUWt6dU1t+DgpQD5QCUA1AO4OxykJiYmGytjTtd\nP09eWTsTA4FvjhVqblHW2q3GmBhgljEm1Vr7x4kHWmtHAiMB4uLibI8ePTwa6Jw5c/D0Ocq6Sp2D\nKhth1osYLMbm0TH9A7j2P65pP4ox8HLLQ1+lMCllGwA5TliTF8odF7fHGFPsMeVFpf49cFMOlANQ\nDkA5AM/mwJMDDLYCkQXeR7j3FWcgMK7gDmvtVvfPDcAc4ILzH6LIGWrUDXwDceIAhx9kH4DRvWDs\njbAjtUh3YwyDO0cT6OvA4Jp+99vkrVz53nymrdyOUyNHRUTkNDxZrC0BmhpjGhlj/HEVZEVGdRpj\nWgAhwMIC+0KMMQHu17WBLpz8WTeR0uOeSDe90SC4fSo8vAoueRY2L4IPu8I3dxSa6gPc033clcCj\nvZuTNDSB165rR1Z2Hvd8sYzeb81l0m9bycsvumqCiIgIePA2qLU2zxhzP/AT4AOMttauMsa8ACy1\n1h4r3AYCSbbww3MtgY+MMU5cBeWr1loVa1I2RMazKeowMccGF3R7GOJuhwXvwqIPYNVE6DgYuv8D\najQAXAXbsYEFF8aEcl1sBD+kbmfErDT+9lUKb8xYx709GnNtxwYE+Jb/59lEROT88egza9baqcDU\nE/Y9c8L754o5bgHQ1pOxiZxXVULgkmcg/m6Y9zosHQ0p4yD+Luj6MFQLLdTdx2Ho374+V7Stx89r\n/uS92Wk8PiGVd2auZ2j3GAZ2akgVfxVtIiJSdgYYiFQMwWHQ7zXofB/MeRUWvQ/JY6D11a5pQJpc\nWmi6D4fD0Kt1OJe1CmPe+t28NzuN579fzXuz0ujbph6hQX50b1ZX032IiFRiWm5KxBNCouCaD+De\nhVCvHfz2OfzyL/ikL6ycUKS7MYbuzeow/u7OjL+7M5G1qvLFrxm8PTONGz9cyLjFm/DUNDsiIlK2\nqVgT8aS6LaDJJWDc/6k58+Cb2+GL62Dd9CILxQPEN6rFZa3CcLhn9si3lscnpNL37Xl88t+N7Duc\nU4pfQEREvE3FmoinRXcDnwAwPuAbCBcMdk3z8eUN8G5HWDgCjuwrdEhCTCj+vg58DAT6Orinewz+\nvg6e/3418f+cyYNJv7Hwjz262iYiUgnomTURT3NP90H6PFfhFhkPeTmwZjIs/g/89ATMegnaDYD4\noRDWyjXdx50JLNqwp9ASVau27eerJZuZ+NtWvkvZRnRoVQZ0asj1sRHUCQ7w8hcVERFPULEmUhoi\n4wsNLMDXH9pe79q2pbiKtpQvIfkTV0EXP5TYanWI9V0Ajm64ltqF1vVr8MJVNXi8b0t+XLmdpMWb\n+de0tbw+/XcuaVmXuOhaHM3Np3Pj2hqUICJSQahYE/G2+h3g6hFw2Qvw22ew5GMYPxiOrSjq6w9D\nphQq9qr4+3Btxwiu7RjBH7uy+GrJZpIWb+KnVX8C4ONYzzNXtOKWhCh8HOV7WSsRkcpOz6yJlBXV\nQqHrQ/DXFGh7I7iWi4e8o/D1bfDrSMjaVeSwxnWCeKJfS+7sFnN8wfh8p+XZyauIf/lnHp+Qyrz1\nu8jVKgkiIuWSijWRssbH1zWZrm8V16AEh69rgMKPf4fXm7tGki5PgqMHCx3WpUltAvz+Nyjh0V7N\n6Nw4lO9StjL448V0evln/vHNcmb/vpOcPBVuIiLlhW6DipRFxQ1K+HM1pH4Nqd/AxLtdxVzzvtDu\nRmh8yUkHJWTn5vPLul38mLqdH1N3MH7pFoIDfbmsVRh929QjKMCHZZv2FTpGRETKDhVrImXViYMS\nwlpB2LOuZa02/+oq3FZOgFUTXMtdtbqa2LA2xPrsA0d3jg1KCPTzoXfrcHq3DudoXj7/TdvN1NQd\nTF+1gwnLth7/eD8fw3s3d6R36/BS/qIiInIqKtZEyhtjoGGCa+vzKvwxG1LHu0aT5h919/GBnk+7\nbqcGBB0/NMDXh54twujZIoyca9ryxMRUvkneAkBuvuXuz5NpUjeI7k3r0K1ZbRIahWqNUhERL1Ox\nJlKe+fhBs16uLfRV13qkWLD5MPM5mPNPiOoCzXq7tloxxw/193VwU3xDpqzYRm6eE18fBwM7RbJh\n9yHG/prB6P9uxN/HQadGIa7irWkdWtYLxhiNLhURKU0q1kQqisY9Yf5bkJ/jKuIuexH2ZcD66TBt\nmGsLbeoq2pr2goadT/mc2+KNe5m7bhfz1u/mlR/X8sqPa6kTHEC3JrWJrFWVtI1HCW6UqefcREQ8\nTMWaSEVR3KAEgN4vw94NrrVI1/8Ei0fCwvfAPxia9CQ2tCmx1gmOvhR8zq17szp0b1YHgB37s5m3\nfhdz1+9mxuodHDyaD8DUDxbQo3kd+rQJJy66FjG1q+nKm4jIeaZiTaQiOXFQwjG1YiDhHtd2NAs2\nzHEVbmumwOrvXH3mvwktLoc210JUVwgOO354eI1AboiL5Ia4SN6btZ43ZqzDaV0zwS3asJfZv7vm\nfwut5k9cdAidomsRF12L1vWr4+ejGYJERM6FijWRyiYgCFpe4dpqRsPsl8A6Aeu6Zbp2iqtf7WYQ\n3dW1FSjeOjeujf/sNHJynfj7OfjijnhqVPVnafpelqRnsjRj7/GVFKr4+dAhsiadGtWiZhVf9h/J\npXuzurp1KiJyBlSsiVRmjbrB3AD3c27+MHiia3mr9PmubcXXsHS0q2/t5hDdldjornzf28n6JTOJ\n6XodLaJrAdCkbhAD4xsCsPNANkvSM1mSvpelGXt5d+Z6rPuU78xMo1uz2vRoVpd2ETVoVb86Vf31\nV5GIyMnob0iRyuxkz7k1iIUuD0J+HuxYXqB4Gw9LP6Yp0AQwU7+CPfdAm+sgvA34BgBQt3ogl7er\nx+Xt6gHw5ox1vDtr/fFbp8sy9jF33W4AHAaa1g2mbUQN2kXUoG2DGrSsV51APx+SMzKLDH4QEals\nVKyJVHYne84NXEtfNYgtXLz9+Bgs/RhzbIqQRSNcm8MPwtu6+kbEuX7WagwOB92b1eGjuX+Qm+fE\nz9fBmP+LJzKkCiu27GfF1v2kbtnHnN93Hp/zzddhiAipwua9R3Bai5+Pg1FD4o4PeBARqUw8WqwZ\nY/oAbwM+wChr7asntN8GDAeOTaP+nrV2lLttCPCUe/9L1toxnoxVRErAxxfaD4CUsTjzjuLwDYDr\nPnYVbVuTXdvycbDkP67+ATWgwQXENojl5wv92PHnDoLaXkkL91WyS1sFcmkr17Nw1lq2789mxZb9\npG7dxw8rtpNvXTdPc/Kd3Dp6MfVrBNI8PJjm4dVpER5M8/BgGtcJwt9XgxhEpOLyWLFmjPEBRgCX\nAVuAJcaYydba1Sd0/cpae/8Jx9YCngXicN01SXYfm+mpeEWkhNy3TtNnfUZMz1v/d1WuVX/XT2c+\n7F73v+JtazLMf4sIm08EwOZPIaWja+BCeDvX1bjQJhgfX+rXrEL9mlXo0yacni3CGDRqETl5Tnwd\nhhviIsk6msfvOw4yP203ufmuQs7XYWhcJ8hdxAXj6zDsOZRDr1ZhxLmfpxMRKc88eWUtHkiz1m4A\nMMYkAVcBJxZrxekNzLDW7nUfOwPoA4zzUKwiciYi49kUdZiY4m6fOnygbkvXdsEtrn1z/gW/vOoe\ndWrg4Hb49aP/LY/lG+jqH972eAEXG96aSf39yFw9i5BWPWnRqe3xU+TkOdm4+xBrdxzg9x0HWbvj\nIMkZmUxevu14n5FzNxAVWpW2DWrQuE4QjesG0bhONWJqB2kJLREpV4y19vS9zuaDjbke6GOtvdP9\nfjBwYcGraO7boK8Au4B1wEPW2s3GmEeBQGvtS+5+TwNHrLX/LuY8Q4GhAGFhYbFJSUke+T7HZGVl\nERQUdPqOFZhyoBzAmeWg+v61tF/+NMaZh3X4srz9ixwMbkLVw1sJytro3jYQlLURv7yDx4879reT\nNT5kNLyePbUTOFy1AU6fgGLPM2F9Dt//kXv8uPBqhnwn7D5iKfg3XWigoV6Qg3rVDPWqOXBayMx2\n0qGuD01DSv7/sPo9UA5AOQDlAM4uB4mJicnW2rjT9fP2AIPvgXHW2qPGmLuBMUDPM/kAa+1IYCRA\nXFyc7fH/7N13fFf1vfjx1/u7v9mTBAiEsIcgyBCc4Cp2oLVa60RbtcPd1l61/dV7296O2/Zab2tt\nrVpnHbXaWqt142KDKHuTkIQQsud3f35/nJPkS0ggQTJI3s/H4zzOyPmc7+f78Zi8+cz58495JuMt\nWbKEnv6M/k7LQMsAulsG8+Gkk1pHnZ7U2YAGY6xat7L1sPwBZNc7AIiJUlD4LAWFzwICaSMhe4K1\nZU2A7ImQPZ7kghjlDz3OTLORNTKFO66+mpn56QTCUfZUNrKzvJFdBxrYeaCBnQca+XBfA02hUOvH\n/2t3hBHpDiYOTSE/I4H8rERrn5nA8DQ/rrgJftcUVvPym6u4bOqJg3qkqv6/oGUAWgbQs2XQk8Fa\nCTAi7jyPtoEEABhjKuNOHwL+Jy7t/HZplxzzHCqles/hRp22EIGUYdbmT4ei5W1rnS76rTUX3IGt\nULHV2u96t60pFZiZkMnTzmoghnG4cBQ7IHEhvrR8JuamMDE35aCPM8bwi39v4cH3dhEzIIDH5aSw\nspH3tx8gEI613utyCMPT/YzMSCDR4+LNzfuJxgwv7V7OQ1frSFWlVM/pyWBtFTBORAqwgq+vAJfH\n3yAiQ40x++zTRcBm+/g14Kci0vLP1fOAu3owr0qp/qazOeDixaJQvcca0HBgC2x4EWmy/g0osQi8\n8QNrEwekjrCW3coYDZljIGM0kjGa8yaks27pjrbauIut2rhYzFBeH6SwspHCqiZrX9lEUVUTK3dX\nEYnZI1Uj1kjVZJ+L4Wl+8tITyEv3t27D06zztAQ3a4tqdN44pVS39ViwZoyJiMhNWIGXE3jEGLNR\nRH4ErDbGvATcIiKLgAhQBVxjp60SkR9jBXwAP2oZbKCUGkSOVBvncFqBV+YYmHA+5J8Kjy1qq41b\n+Atrot6qXfa2E9Y/D8Ha1kecBDztFMCAOJFPdkHtaTjS88lNyye3YAgnj8486GPXFFZz+Z/skapO\n4YqTRwJCcXUTxdVNLN9VSUMwclAar8tBKBLDAE6HcMnMPGbmpzM01U9uqo+hqT4SvYf+StaJgZVS\nPdpnzRjzCvBKu2s/jDu+i05qzIwxjwCP9GT+lFIDTFdq44yB5mqo3GkFcOueQna/a/8sCmsetbYW\nLp/VRy4tH9LzIS2fmen5/PvM/ez4ZDkjTr+ciXNOaPcRhrrmCMU1TRRXN1Nc3cwr6/exptCafSga\nMzyzai/PrNp7ULoUn6s1eBuW5iMWgxc+KiYasyYG/uNVMzlzfDYicgwLTSnV3/X1AAOllDq2jlQb\nJ1ooaY4AACAASURBVAIJGdY2YjZkFMBjK9vWR738OUgaAjWFUF1o7/dY+70rW2vlCuyNV/4GH+RB\n1lhIyYPU4UjKcFJTh5OakseUscPBm8v0EWn8Mm7ww63XXMHwtAT21TazrzbAvtoAZbXNlNYGKKsN\nsLG0joqGtv54wUiMa/68Co/TwZAUL0OSveSk+MhJ8ZHdeuxlSLKPstpmNpTWMnd0ltbGKTUAaLCm\nlBrcOquNGzKx4/ubq+Ht/4ZVDwP2vHHeZAjWw443oWE/0G5KJG8qMxPSedpVBCaGEReOXZUwch4j\nk3MhKxcS860VIuIs31XBvY88xSw2spLJnHDyuXhcDsrrgpTXB9he3sAHOyqoDxzc5NpmG2OyE8nP\nTCQ7yUtWsoesJC9ZSV6yk+19kpcUv0v70ynVj2mwppRSXRmp2sKfDtO+DB892bbk1qL/a0sfCVnT\nj9SVQG0J1BVDXSnsehcx1uhSMRH48D5rayEOSBwCybmt29xYlKc9z0AsAg43jrHjYPx5Vn+8OM2h\nKOX1AfbXBXli+R5e/nhfa7gYM1BWG2BDSS2VjSGisUPn1nQ5pHXAhEPg9HFZjM9JJiPRS2aSh8xE\nDxmJVqCXkeghweNERKzpS3aGSC6o1gBPqR6kwZpSSnVXZ0tuAbg8Vt+29PyD0+xdefDghy89YgVl\nDWVWcFffst9vBXnFq6GpgtaZ3WIheNYeUJ+QCUk5VnNtUi7+pCHkJ+WQn5xLaoEf96ZlFJhilsqJ\nfPeSa1oDqVjMUN0UoqIhREVDkIqGIAfqg7y+qYyVu63+dDEDHxXVsHxXFcFIjI54XQ6SfS4qG0MY\nAy/sWMrCE3KZkJNCeqKb9AQP6Qke0hLcpCd6yEjwtK4aoQMmlOo+DdaUUupoHG7JrU7uP+Lgh/b2\nfAhPXmQFeA4XzP0muBOsptaGcivAq1xqndvzzU0A/tdeTesmXkSeuQ+Sh0FiJo6ELDITs8hMyGJC\nYiYkZsOILOaleLi3+GMmmt2slhO449qrOWlkGk2hKFWNISobQ1Q2BKlsDFFlbx/uqKCiwZpQOGbg\nzU3lvLK+rNOv4nU5SPS4qG4KYbBq8M6eOITRQ5JI81uBXZrfTarfTWqCm7QED2l+NwkepzbRqkFP\ngzWllOot3WluBRh1Kiz+55EDPGMgUGsFcMt+C2ufAAyCQHqBNclw4wHY9zE0VVj3xpkCPORs6Wn3\nHPK3P0LKcBITMkj0ZzAiIcNq/k3IgKwMGJnBpqEufvvCWsbF9rDSMY07rruaaXmp1DSFqW4KUd0Y\noropTE2Tta9uCrF0RwVVTW0B3tKdlby7rYJQtOMaPACnA1p+LALTR6QxMiOBFJ8d2PndpPhd9t7d\nen1PZSMf761h3hgdZKGOfxqsKaVUf9bVlR/8adY24yr45K9to1vP/8Wh6aNhaKq0ArjGClj7OGx8\nEcEAAr5UcPutfndlG6C5CsJNBz1iMvCAE3CC4Xnk2d9Cci7ZCelk+9PBb4+49adDagbkprMly80f\n/7mMsaaIZTKd2792LSeNTCMQjlHTHKKmKUxNU5ja5jC19vnbW8oJ71nOXMdmlscmUVozlarGELXN\nYeqaw3TQBa+dbWQlWf3trGDORbIvbu+39sk+F/vrAuw+0MicggxOHp1JktfV2j+vM9pvT/UGDdaU\nUmog6Upzq9PdNpABwJMIW19tC/C+cN+h6cIBK2hrqrL2ax6DDX+jtQYvdZjV3NpcDeWb7fuqrbnr\nbBOBe+0m2hv5Bzz+M0jIxO9Lxe9LZagvzQoUWzZ/GouySsksfRAnUSK4KJ53L2NmLwRfCsbpoSEY\nsQO3iB3khfn7uhLKN77XGuAFU2YxLM1PXXOY0poA9cF66poj1Ac6DvaeXFHUeuwQSPS6SPG5SfK6\nSPK5SPa5SPK6CIajvL31ANGY4e87l3HDGQVMHpZq3ed1kWjvW449LqsHovbbU92lwZpSSg003W1u\n7UqA5/aB2163FazJgrf8q21E7Gd/dWg6YyBYZwVtTVWw6iFY9xdoqcEbPhMyx1rNsoFaq+9dxda2\ncxNjKNatAE7CjHn3JrDnMBanl2RfCsm+VPCmgC8FvCnMDTSQ5FmCgxhRnFQM/zpDJ86x7vGmgDcb\nvMkYbxKN+KkPRnnwvV18sux1TpbNrDCTyJx4OrNGpVMfiFAfiNAQjNAQiFAfDFPdGKKoqon9tYHW\n0bWRmOH3S3Ydtpg9Tgdet4OGQMQqAYET89IYluYjweNqrclL9LpIbNnbW3FVE9vLG5g9Kp05BZkk\neJz43U4cjsPX+mlQODBosKaUUuqoA7wOR8S2EGmrJUsfBbFrYMMLbTV45/7o8P3wgvWw613429cg\nFrYGWZx6OyRlQ6AGAnVWMBi/ry8jrbYEIzEEcBBl6Prfw/rfH5o9IAkhyZvM3bhxuqsQDDGExqY5\npFSNBU8SJCZDRpI1n54n2dp7k9hclcCDf3/D6rcnU7nsK1dSkJ1MfSBCY9Da6oMHH6/YVYmjeFVb\ns27tVBri7mkMRTucXqXFo0v3HHTudztJ8DhJ8DpJcLusvcdJKBJjTWE1MWMtb/bFGcMYnZ1EgttJ\ngseF32On87jsvRO/x8n28gY+2VvDaWOzmDkqo0uvgjYF9zwN1pRSSh2dnhwRK2LVlE3+AiS/3L1R\ntHtXIvHTpFz0kLV+bLDe3ura7etxFy7F7Ku0AzxDSv0uaC6172k4qDm3xSTsZl0nfIuX4Pn/Bnei\n1azsSQRvkhXstZx7kqhKqCbZ82+cLbV+E77B0AkzW+8z7kRCDh9N+GjER33Uw5OrStmy6k1OFivA\ny5h4GrNHZdAYitIcitj7KI3BCM1ha7+3qonpbGOu00rz/Jojdu47yL1vbm+dosVnB4R+txXQte1d\nNATDvLm5vLUpePG8fMbnJuNzH3y/zz5uub5lXx0f7a3u1iobg7mmUIM1pZRSvae7NXhHk+ZopkmJ\nC/DE6YGv/KUtnTEQboZQQ1zAVw8fPQmfPEtrs27BGZA71bov1GhtwXqrCbhmL4QayWg60K7W735Y\n35YNAbz21hKO/FhciNtapcIAwcrR+KO54EmwBoK4EyHBD2mJ9nkCZfv2krHxsdagsGzOXeRMmkdz\nzE0zHpqNhybjoSHmojHqoSkC//qklPJN77fW+jmGn8z43GQCoShNoSjNYSsorGgI0RSKEAjHqGoM\ncaLZ2hoUPvxh94JC2EaS10mS143P7cDnbgvoWs79bif1gQhvby0nFjM4HcJlc0YydkhS6z1el/Og\n9D63A5/Lyfb9DXxSUsMpYzKZOzqzS+vq9segUIM1pZRSA8+xDPBErMDIk2BNRNzC5YVN/2jrt3fW\nD478mYfU+v0JssbbwZ0d5IWbDgr4HLvewRQubem6h9/tAIfT6gtYW2LdH26yA8pGwJALcX39Ioxc\n9WNYZQWBaR3ly+HmfIcbp8ca9WsQgs0F+KtzrO/p8oPXawWDLp+1uX0c2F9C2ra/2QNAnJRM/SYp\no2YQxEsAD0HjpskODJtibhqNi9e21HFg+8rWoNDkzGHckCQC4RiBsBUUBsMxKhtDNIeiBCJRqhoO\nDgqfWN69oPC3b+8AwONy4HM58NoBXUuQ17IPhGN8VGQ1H/vcDp66bm6/CNg0WFNKKaWgZ/rtdZKm\nW7V+o+cfXOt34QOH7+sXCcKeD+DZK6xpWhwuawqX9FEQCdiBnb2PBKwgL9yMa8+HmOIVdoxn8Lud\nVkAZarJqByMBK10k0JouOxZuDQo9RCnY8DvYcPivcxFgPG3nkbos3NF0exCLXVvo97fWEuL2UVl5\ngJSdL+MkShQn+yd/lbT8qYTEQ1C8BHETNG4CxkOzcdFs3LyxrZbSrWs40bGTpbHJuAtOZeqINILh\nGMFI1N5bAWLLvri6rfl4ZXQSy3eN02BNKaWUOq51t9+enabHmnVFrKBn3Dldm1A5Xvum4At/f+R0\nhcvgiQuJRUI4XB644AHIGtsWBLbfh5thxxuw8x0Eg0Fwp+dBxmj7Pvuepko7oGyGcBOZwXoQq9+g\ngyh5m/8Emw+ftQVgVSUCt/M3TClIuc+qKXR67b2nbe/x0pjUiC+4EcEQxENh0lRg7JHLrodpsKaU\nUkr1d/21r1/+PFj8z+7VLubNQgqXtQWFn/1ll5qPD1pb95JHIXuiVYsYiavtiwTtoC8Im1/CbPlX\na1Aoo06DYTOsZ0SC1hZt2VvXEqP7MGIQwCdRJgY+Bs458nfqYRqsKaWUUspylEFhj6+TezRpMgqQ\nHW+1BYVn/7BbfQrF6bE+qx/QYE0ppZRSvau/1hQeTZpeoMGaUkoppQam3ggKe4GjrzOglFJKKaU6\n16PBmogsFJGtIrJDRO7s4OffFpFNIvKJiLwlIvlxP4uKyDp7e6kn86mUUkop1V/1WDOoiDiB+4Fz\ngWJglYi8ZIzZFHfbR8AsY0yTiHwT+B/gUvtnzcaY6T2VP6WUUkqp40FP1qzNAXYYY3YZY0LAM8AF\n8TcYY94xxjTZp8uBvB7Mj1JKKaXUcUeM6e46Xl18sMjFwEJjzHX2+VXAycaYmzq5/3dAmTHmJ/Z5\nBFgHRICfG2P+3km6G4AbAHJycmY+88wzx/y7xGtoaCApKalHP6O/0zLQMgAtA9AyAC0D0DIALQM4\nujJYsGDBGmPMrCPd1y9Gg4rIlcAs4My4y/nGmBIRGQ28LSLrjTE726c1xjwIPAgwa9YsM3/+/B7N\n65IlS+jpz+jvtAy0DEDLALQMQMsAtAxAywB6tgx6shm0BBgRd55nXzuIiJwDfB9YZIwJtlw3xpTY\n+13AEmBGD+ZVKaWUUqpf6slmUBewDTgbK0hbBVxujNkYd88M4Hms5tLtcdfTgSZjTFBEsoBlwAXt\nBid09JkHgMJj/mUOlgVU9PBn9HdaBloGoGUAWgagZQBaBqBlAEdXBvnGmOwj3dRjzaDGmIiI3AS8\nBjiBR4wxG0XkR8BqY8xLwC+BJOCvIgJQZIxZBEwC/igiMazav58fKVCzP/OIX/jTEpHVXWlfHsi0\nDLQMQMsAtAxAywC0DEDLAHq2DHq0z5ox5hXglXbXfhh33OHqqMaYpcDUnsybUkoppdTxQFcwUEop\npZTqxzRY674H+zoD/YCWgZYBaBmAlgFoGYCWAWgZQA+WQY8NMFBKKaWUUp+e1qwppZRSSvVjGqwp\npZRSSvVjGqx1kYgsFJGtIrJDRO7s6/z0FRHZIyLrRWSdiKzu6/z0BhF5RETKRWRD3LUMEXlDRLbb\n+/S+zGNP66QM/lNESux3YZ2IfLYv89jTRGSEiLwjIptEZKOI3GpfHxTvwmG+/2B7D3wislJEPrbL\n4b/s6wUissL+G/GsiHj6Oq895TBl8KiI7I57F6b3dV57kog4ReQjEXnZPu+xd0CDtS4QESdwP3A+\nMBm4TEQm922u+tQCY8z0QTSnzqPAwnbX7gTeMsaMA96yzweyRzm0DADutd+F6fZUPQNZBPiOMWYy\nMBe40f49MFjehc6+Pwyu9yAInGWMORGYDiwUkbnAL7DKYSxQDXytD/PY0zorA4A74t6FdX2XxV5x\nK7A57rzH3gEN1rpmDrDDGLPLGBMCngEu6OM8qV5ijHkPqGp3+QLgMfv4MeDCXs1UL+ukDAYVY8w+\nY8xa+7ge65f0cAbJu3CY7z+oGEuDfeq2NwOchbUiDwzg9wAOWwaDhojkAZ8DHrLPhR58BzRY65rh\nwN6482IG4S8pmwFeF5E1InJDX2emD+UYY/bZx2VATl9mpg/dJCKf2M2kA7L5ryMiMgprveIVDMJ3\nod33h0H2HtjNX+uAcuANYCdQY4yJ2LcM+L8R7cvAGNPyLvy3/S7cKyLePsxiT/sN8D0gZp9n0oPv\ngAZrqrtOM8achNUkfKOInNHXGeprxpr/ZlD9q9L2ADAGqxlkH/Drvs1O7xCRJOBvwG3GmLr4nw2G\nd6GD7z/o3gNjTNQYMx3Iw2p5mdjHWep17ctARE4A7sIqi9lABvAffZjFHiMinwfKjTFreuszNVjr\nmhJgRNx5nn1t0DHGlNj7cuBFrF9Ug9F+ERkKYO/L+zg/vc4Ys9/+hR0D/sQgeBdExI0VqDxljHnB\nvjxo3oWOvv9gfA9aGGNqgHeAeUCaiLQs4Tho/kbElcFCu6ncGGOCwJ8ZuO/CqcAiEdmD1S3qLOA+\nevAd0GCta1YB4+yRHh7gK8BLfZynXiciiSKS3HIMnAdsOHyqAeslYLF9vBj4Rx/mpU+0BCi2LzLA\n3wW7T8rDwGZjzP/G/WhQvAudff9B+B5ki0iafewHzsXqv/cOcLF924B9D6DTMtgS948WweqvNSDf\nBWPMXcaYPGPMKKx44G1jzBX04DugKxh0kT0c/TeAE3jEGPPffZylXicio7Fq0wBcwF8GQzmIyNPA\nfCAL2A/cA/wdeA4YCRQCXzbGDNgO+J2UwXyspi8D7AG+Htd3a8ARkdOA94H1tPVTuRur39aAfxcO\n8/0vY3C9B9OwOo87sSo8njPG/Mj+/fgMVvPfR8CVdg3TgHOYMngbyAYEWAd8I24gwoAkIvOB7xpj\nPt+T74AGa0oppZRS/Zg2gyqllFJK9WMarCmllFJK9WMarCmllFJK9WMarCmllFJK9WMarCmllFJK\n9WMarCml1KckIvNF5OW+zodSamDSYE0ppZRSqh/TYE0pNWiIyJUislJE1onIH+3FqBvsRac3ishb\nIpJt3ztdRJbbi1K/2LJAuYiMFZE3ReRjEVkrImPsxyeJyPMiskVEnrJncVdKqU9NgzWl1KAgIpOA\nS4FT7QWoo8AVQCKw2hgzBXgXa3UGgMeB/zDGTMOatb/l+lPA/caYE4FTsBYvB5gB3AZMBkZjrR+o\nlFKfmuvItyil1IBwNjATWGVXevmxFl2PAc/a9zwJvCAiqUCaMeZd+/pjwF/ttXGHG2NeBDDGBADs\n5600xhTb5+uAUcAHPf+1lFIDnQZrSqnBQoDHjDF3HXRR5P+1u+9o1+CLXwMwiv5+VUodI9oMqpQa\nLN4CLhaRIQAikiEi+Vi/By+277kc+MAYUwtUi8jp9vWrgHeNMfVAsYhcaD/DKyIJvfotlFKDjv7L\nTyk1KBhjNonID4DXRcQBhIEbgUZgjv2zcqx+bQCLgT/Ywdgu4Fr7+lXAH0XkR/YzLunFr6GUGoTE\nmKOt8VdKqeOfiDQYY5L6Oh9KKdUZbQZVSimllOrHtGZNKaWUUqof05o1pZRSSql+TIM1pZRSSql+\nTIM1pZRSSql+TIM1pdRxTUSWiEi1iHj7Oi9KKdUTNFhTSh23RGQUcDrWqgOLevFzdY5KpVSv0WBN\nKXU8uxpYDjyKNYktACLiF5Ffi0ihiNSKyAci4rd/dpqILBWRGhHZKyLX2NeXiMh1cc+4RkQ+iDs3\nInKjiGwHttvX7rOfUScia+JWPEBEnCJyt4jsFJF6++cjROR+Efl1/JcQkZdE5PaeKCCl1PFPgzWl\n1PHsauApe/uMiOTY13+FtWj7KUAG8D0gZi8v9SrwWyAbmA6s68bnXQicDEy2z1fZz8gA/oK12LvP\n/tm3gcuAzwIpwFeBJqxF4S+zV1FARLKAc+z0Sil1CA3WlFLHJRE5DcgHnjPGrAF2ApfbQdBXgVuN\nMSXGmKgxZqkxJoi19uebxpinjTFhY0ylMaY7wdrPjDFVxphmAGPMk/YzIsaYXwNeYIJ973XAD4wx\nW43lY/velUAtcLZ931eAJcaY/Z+ySJRSA5QGa0qp49Vi4HVjTIV9/hf7Whbgwwre2hvRyfWu2ht/\nIiLfFZHNdlNrDZBqf/6RPusx4Er7+ErgiU+RJ6XUAKedZJVSxx27/9mXAaeIlNmXvUAaMBQIAGOA\nj9sl3QvM6eSxjUBC3HluB/e0Lvli90/7HlYN2UZjTExEqgGJ+6wxwIYOnvMksEFETgQmAX/vJE9K\nKaU1a0qp49KFQBSr79h0e5sEvI/Vj+0R4H9FZJjd0X+ePbXHU8A5IvJlEXGJSKaITLefuQ64SEQS\nRGQs8LUj5CEZiAAHAJeI/BCrb1qLh4Afi8g4sUwTkUwAY0wxVn+3J4C/tTSrKqVURzRYU0odjxYD\nfzbGFBljylo24HfAFcCdwHqsgKgK+AXgMMYUYXX4/459fR1wov3Me4EQsB+rmfKpI+ThNeDfwDag\nEKs2L76Z9H+B54DXgTrgYcAf9/PHgKloE6hS6gh0IXellOoDInIGVnNovtFfxEqpw9CaNaWU6mUi\n4gZuBR7SQE0pdSQarCmlVC8SkUlADdZAiN/0cXaUUscBbQZVSimllOrHtGZNKaWUUqofG1DzrGVl\nZZlRo0b16Gc0NjaSmJjYo5/R32kZaBmAlgFoGYCWAWgZgJYBHF0ZrFmzpsIYk32k+wZUsDZq1ChW\nr17do5+xZMkS5s+f36Of0d9pGWgZgJYBaBmAlgFoGYCWARxdGYhIYVfu02ZQpZRSSql+TIM1pZRS\nSql+TIM1pZRSSql+bED1WetIOBymuLiYQCBwTJ6XmprK5s2bj8mz+gOfz0deXh5ut7uvs6KUUkqp\nDgz4YK24uJjk5GRGjRqFiHzq59XX15OcnHwMctb3jDFUVlZSXFxMQUFBX2dHKaWUUh0Y8M2ggUCA\nzMzMYxKoDTQiQmZm5jGrdVRKKaXUsTfggzVAA7XD0LJRSiml+rdBEawppZRS6ji3dyW8/2tr39/S\n9LAB32dNKaWUGpT2roQ978Oo02HEnB5NM7LwedibcGgaYyAahmgQIiGIhqzj4jVQvBJyp8GQiRCN\nQOwwW/lW+OB/rWOHC05aDElDINIMkSCE7X0k0LY1HoCyDYABBLLGgTcFHE4Qx8Fby7VAHaZkNZgY\nxunDcc0/u14OPahPgjURWQjcBziBh4wxP2/383zgESAbqAKuNMYU91b+1hRWs3xXJXNHZzIzP723\nPlYppZTqWPsgKhqGcJMVpIQarX242b7WBGWfwLu/bAtu5twAaSPBxABj7dtvNXth3VMQi1rBy6RF\n4E+3A6yQFQy1Bl72cXMVpmI7BRjMw08iCRkHB2jR0LEvi1gYVj8EgHG4we3DOH0Yp5eYy0vM4SXm\n8uFoqsWDQQCDoTkYJuDyYSIxiMXAhDAmZn1fY5WJp6mM5FgMEYhGQuxb9zrDB2OwJiJO4H7gXKAY\nWCUiLxljNsXd9ivgcWPMYyJyFvAz4KpP+9n/9c+NbCqtO+w99YEwW8rqiRlwCEzMTSbZ1zatRTQa\nxel0tp5PHpbCPV+YcthnXnjhhezdu5dAIMCtt97KDTfcwL///W/uvvtuotEoWVlZvPXWWzQ0NHDz\nzTezevVqRIR77rmHL33pS5/uSyullOo5HdUqGWMFAPFBTdTeR4JQuhaKV0HmOEgZBsF6CDVAsAFC\n9dY+/lpDGaZyJ1YNEYg4wUS7nsdYGJbf362vZWIRzOaXMZ4kYk4PxuEh5nATc3qIiZuYw0PU4UYa\ng6QYg0MgZgxlMoT6rGmEcRPGRVjchHARxkXIuAkaF0OrljGj4QOcYoga4X3/WaxJPYdQzEEw6iBo\nhGDUQSgmNMccBGPCsMAefmR+i4soYZx8LXwHy2OTiR2mN9dJso2nPD/FTYQwLq6sWMzaA+MP+71b\n0xgrzbLoZC7uVsn1jL6oWZsD7DDG7AIQkWeAC4D4YG0y8G37+B3g772VubpAhJj1/wMxY53HB2tH\n45FHHiEjI4Pm5mZmz57NBRdcwPXXX897771HQUEBVVVVAPz4xz8mNTWV9evXA1BdXf2pPlcppQaE\nnmzOi0bagqq9K2DPBzBkEqSOgGAdBOra7WvbzutKMRXb7FqlJxB3glVDFQnSElh1l3ElEPMkEnUn\nEnUlEXElEG2OxAVEUJR8IhVD5tGM19qMhybjoTHmpcF4aIi58dXu5sa6e3ERJYKTH3jvZJt7AsEI\nhKKGQNQQjhqCUSEYNcQQpssOnvD8vDW4uaL5btY2dS+4ubHqUtZWHprG5RDcTgcup3BCNJlHHCta\n0zwePosDkWm4nYLb68DjcuB2OnA7Bb/TQarTwebyMVxemsJcx2aWxybhKZjLraOzcLsEj7PlfitN\ny/Gbm4ZxxScwVzazwkxi4uxz+H+z8nA5HDgdgsspuBxindvHG0tncc2TDmaxkTUyhTtmLDiq/47H\nmhhzdC/UUX+gyMXAQmPMdfb5VcDJxpib4u75C7DCGHOfiFwE/A3IMsZUdvC8G4AbAHJycmY+88wz\nB/08NTWVsWPHdjl/64rruP6pTwhHY7idDv50xTSm56W0/rx9zVpX/PSnP+Xll18GoKioiJtvvplt\n27bx8MMPH3TfGWecwSOPPNKt/B4LO3bsoLa2tsv3NzQ0kJSU1IM56v+0DLQMQMsAul8GKbVbSKvZ\nQE3aCdSlTgQTxRkN4owGccSCOKMB+ziAMxogqX43+UV/RUwUIw725Z5D2JOOmDCOWARHLHzIsSdY\nQ3L9NsTuq9TsywFxxt3btgmxLuc9JF4CjkQCjgSaxY8nUk9OtKw1iNriHM8O90RCuAnitGqScBE0\nLoJ2rdKs6FrOM8twiiFihCein+Hh6OeoMz4a8RHl0L8v7WuIrgjdzVrTFhC5HeBxgtsheJzgcUBj\nGApCW1uDm/2JExiR7MApgsuBtQl2sAJOB2yvjuKu3NKaxjFkEifluHCJ1dLkdIDTTuMQ67i0McaG\nzRuYzSZWMZmTp57A2DQnLofgtD/HKeCIm3lgR3WU11d/wmw2s4pJnDdrGmPTD/93dUd1lP9ZFSAS\ns575vdm+HknTkm5LVZSJGc4u3d/iaH4fLFiwYI0xZtaR7uuvAwy+C/xORK4B3gNKgA7rfI0xDwIP\nAsyaNcu0X/F+8+bN3ZrE9vRJyTx1fUKnfda6OynukiVLeP/991mxYgUJCQnMnz+fk08+md27dx/y\nHIfDQVJSUq9Puuvz+ZgxY0aX71+yZAnty3mw0TLQMoABVgad1UQZY/V7igTiOnDbNVElayjdkECP\nrQAAIABJREFU+hLDTjgDUofZzXgNVh+qYL21b23ea4D6MkzFNlqb85yebvVpEhNl+L7XAKwmOYcH\n43ATdbiJiZuIw0NU3EiwGjEGsZvmaqIeynxjCBoXzcZFc9RFc8xJU8xJY9RFQ9TJSWYT8x0ftzbN\nPRedz5PRc6nDT71JoAE/kXZ/MtvXKv00ejV7/Sd0UMtj7T1OBwfKRzK/cXVrmm3Z57Fowhx8bic+\ntwOvy9r73M7W46KqKSz+l4PZbGQ1U/jmlV9hdkE6PrcTj9OBw3HoFExrCqu54iHh48h43C4HT101\n94h9sK00tKW56OQu9dteUziLp99cxZ3nzO7S/fOBGSedxPJdlfxHF/uGW2m615/8aNK0pDsaPfn7\noC+CtRJgRNx5nn2tlTGmFLgIQESSgC8ZY2p6K4Mz89OP2cCC2tpa0tPTSUhIYMuWLSxfvpxAIMB7\n773H7t27W5tBMzIyOPfcc7n//vv5zW9+A1jNoOnpOsBBqUGtq815xlgBVKgRCj+0tuyJkDbi0D5Q\n7ftF1ZZgyj6hZdSc+NOt45bgzHRe+zQMYN/rh1yPOb1EXYlEXAmEnImEnX6kqZH0uOa87a4J7Eib\nSUPMQ33MQ33UTW3ETU3EQ03ERVXYzUhTyi/dD7b2VVocupNVZgKmK32V7IDoO8HrKfVMxe92kuh1\nkeBx2lvb8Xu7l3PKgf9oTVM6+kvcPvc8/B5nayDld1vHfrcTv8fJhpJ5XPuwg5mxjaxxTOGO667s\nQkA0lmsfCjDT2M1sF17Upb83U4ZdzfJdlXyvi0HHzPx0nrpubrcClaNJ05KufoynW383j+bvbG+l\n6Y/6IlhbBYwTkQKsIO0rwOXxN4hIFlBljIkBd2GNDD0uLVy4kD/84Q9MmjSJCRMmMHfuXLKzs3nw\nwQe56KKLiMViDBkyhDfeeIMf/OAH3HjjjZxwwgk4nU7uueceLrroor7+CkqpjhxuuoLOFK2AXe/A\nsJkwZELc6L1mCDW1HbfsK7bCR09andXFAaNOA5evrcYq1Bi3NXS507lx+Yi5rX5REVci0aYakuJq\nokokh4rUqQSM26qJirlpirlojLbURLmYFljJudEPWpvzHot+hocin6MRL034DqmFgkODqP8KfJl9\n7mkkeJ0k+FwkepwkeK19vsfFZK+TT4pruXxHNnMdVr+j4dPm89D0YXhcVi2U1+Wwjx2t17aUzeHa\nxxzMbOl3dN1VXQiihnLtQ/VtQdTZnz9imlmjMrjjuqt5+s1V3NHFWqWZ+enccZ0VeN3RzYBIg5vB\nq9eDNWNMRERuAl7DmrrjEWPMRhH5EbDaGPMSVi3kz0TEYDWD3tjb+TxWvF4vr776aoc/O//88w86\nT0pK4rHHHuuNbCml4nWl9soYKyhqroLd78HLt1MQDcOfn4GZ11hTHIQarM7nwfp2WwM0V0O4sdtZ\ns2eIwpgokdJPCCQOI+zwE3SkEHANodntpynRR6PxUW+85NZ+zIzAytbmvL87zuFZOZ/KsIeKsIfG\nDgKp9kHULdWXsrZqPD63o7X2KdHjsoIqu0aq7EAuZ9a1dRIvGXY+35h+Bv7WWisnfndbzZXf42R7\n+WyufaK7QVQ1V+ypam2au/uUUUdMk52cTcL13QuIPk0Q1Ru1Smpw65M+a8aYV4BX2l37Ydzx88Dz\nvZ0vpdQA0JXAKxq2RvUFamHPh/DKd6xrDhdMuxTcPmiqgqbKuH2lNWowjoA1LcKqP1ln3mTwJFn7\nli15KDFPEpHy7bj3rUawRt6V5p7NtsyzqYu6qQlbTX5VISeVQScVQSf7A06GBXbwZ/cv2jqW193K\n2tpDR9q5nUKi10Wix8X4SD6/56PWIGpp0nmMGz2HE9s1+7Uc+z1OiqtPYPHLbX2ibv/q5ZwyJgtn\nB32hWqwpHMO1DzW3NQF+7oIjBiB56QmkHEUQdbRNc1qrpAaK/jrAQCmlOg68WvpmtdZgtUyrUA/7\n1sEHv7EnAnXCmLPA4bYDsxporrH2oYaOPy8WhnVPWrVkCZnWljYChp1oHfsziPgzaK4pJ+HDX0As\njHG4eXfm/WzxT6e6KUJVU4jqxhDVTWGqa0JUNYaoD0Ts2quPWwOvWwpPY+2efBwCKX43qX43aX43\nKUlucrLdTEhws6M8hyt2393aBFgwYwF3zRlJosdFktdFotdJks+F19U2Ym1N4QyufSja1px38SVd\nCkAmDe1+n6juNgG2pNMgSqnu0WBNKdU72gdesajVNNhUZTUtttRitRwf2ArbX7c7twsk59g1YnVW\nUHUksQgULYfUPPClWbO3504Df5p17k8j4kmhqXofiR/8DGIRjMPNm7P+wDbvVKrjgq6ayhBVTSFq\nGsPUByNAJifJ3a1THKx9PxHYToLHSXqCh/REN+kJHvIzE6zzBA/rS4ZwxZa2wGvW6Qv584KxJHtd\nHY7mg5bReTVtTYAn5x8xaOntPlHdbQJUSnWfBmtKqe7rrHN9qAka9kNDub23j8vWw/bX2gIvT2Ln\ntVsATo+1tY5CNJCQbX2WL8VuYkyxN7u50ZdCtGIXvPj11hqvD+c8wHbPZKoarRquyvoQlfuC1rFd\n4wUpBwde73mBbSR7XaQluslI8JCW4KEgK5G01sCrhrc2w9roeBwC3zhzNLedMx6fu/M5mdYUVnPF\njoq2wGtKLqn+w0+43ZtNgEqp/kuDNaXUkcWiUF8GtcXWaMb3fklBLAKP/AVyJttBWrk1JUR74oCW\nmd0BMNYM8WPOtpsaM+xmx4zWpkY8iVC8itijX7Bq05xuAuf9ktLkqeyvC1BWG6CsLsD+fQHrvC7I\n/toKyus9TOeutsDrDQE243IIGYkeMhI9ZCZ5mJqeRqZ9vqGkljc2tQVe35o/htvPHY/b2fnUEGsK\nq/lgRwWhcAyPy8G5k3MPG6iBBl5KqaOnwZpSg93elbDjTcgYYwVNtXutoCx+qys5ZFoIAetaoA6G\nz4SkHEgaYu/jjhOzoGTNQYGX4zM/ba2RC0djlNcH2V8XYP/eAPvrDlBWV8ymfYbG5js5WTazPDiJ\ntX+qAt49KA8pPhe5qT5yUnyMG5JFcXUTK3aNbw28rjutgJvPGkeK34VI502N720/QDgSw+1ycPak\nnMMGatAWeD395iou6+H+WkoppcGaUoNJsB7Kt0D5JmsrWm51ym/P4bIWmE4dCfmnWP2+UvOs9RKb\nq+Glm4hFQjhcXvjSQ52OumwKRSitaOa9wixeDd7FbLOJleHJmJcjBMLvs78uQEXDoTPYu52C3+2k\nLjaeNYxHgDPHZ/PFGcPJSfHZAZqXBM/Bv8KsPl7LWwOv86cOJTWh55oatb+WUqo3aLDWkaNZNPgY\nSUpKoqHhMH15lDqclnd3xFyrI335Zti/0dqXb4SaorZ73YngT41L7IBZ18AZd1g1Yo7Om/W2BNPZ\n+f7fyJy1CHdsLCUfl1Ja08y+mmZKagLWcW0z1U3xAwHGsYpxAAypauKE4alMy0sjJ8VLbopVO2Zt\nXtITPHy0t+agwOuWs8d1qXO9NjUqpQaawRWsvXqn1dH5cIJ1sH+D1b9GHJBzgtWJ2eaPRsAZV2y5\nU+H8n/dQhpU6guYaqNxhbbvehU+eOXRpIIcLMsdB3mw46WoYMsXqM5aWDyWr4bFF1vqMTg+ceJlV\no2arC4QpqmyiqKqJwsomiqoa2VBSy4aSIIbPwysxYFnr/Sk+F8PS/AxL83NSfhpDU/0MT/PTEIjw\n439tIhK1Aq8HrpypgZdSSnXR4ArWuiJQ2/bHzsSs87hgrbvuvPNORowYwY03Wosw/Od//icul4t3\n3nmH6upqwuEwP/nJT7jggguO+KyGhgYuuOCCDtM9/vjj/OpXv0JEmDZtGk888QT79+/nG9/4Brt2\n7QLggQce4JRTTjnq76J6WWst2cmQmA0V2+3AbDtU7rTOmyriEggtC2SDwJQvwhnftQI1l6fDjzB5\ns1l9xqNUbnyLyuw57NuUSuEHH1FU2UhRVVO7mjHISPTgdTniP4UvzRzODWeMYWiqj2Rf502Ok4al\naOCllFJHYXAFa12pAdu78uCahnb9cZrr60lOTu7yR1566aXcdtttrcHac889x2uvvcYtt9xCSkoK\nFRUVzJ07l0WLFnXaAbqFz+fjxRdfPCTdpk2b+MlPfsLSpUvJysqiqqoKgFtuuYUzzzyTF198kWg0\nqs2rx4NQE5R+BBtegDWPdLyAduIQyBwLEz9r7TPHWfvGA/Dkl9re3bnfhJwpADQEI+ypaGTngQZ2\nHWhkd0Ujuyoa2LG/gUAkBsyHQnDIDoan+8nPSOT8qUMZmZFAfkYCIzMTGJmRQLLP3dovLBSO4XE7\nuGxOPuNzjvz/hAZeSil1dAZXsNYVI+bA4peOWZ+1GTNmUF5eTmlpKQcOHCA9PZ3c3Fxuv/123nvv\nPRwOByUlJezfv5/c3NzDPssYw913331IurfffptLLrmErKwsADIyMgB4++23efzxxwFwOp2kpqZ2\n+mzVB4yBql1QvBqKV0LxKijb0MFi3AKTL4RTb7ZHbKZ1/Liscaw4489UbniLfWmz2LXaz+5Xl7Or\nooH9dW3LJInAsFQ/o7MTmTwshY+KajCAQ+D2c8dz81njDpvtox0JqZRS6uhosNaREXOO6cCCSy65\nhOeff56ysjIuvfRSnnrqKQ4cOMCaNWtwu92MGjWKQCBwxOccbTrVD+xdCTvesuYSC9ZbgVnxKmum\nfrDWkxx+Epx2G+TNAXHCc1e11ZLN+5Y1PYbNGMO+2gCfFNeyoaSWT0pq+aiomvpADFgARZDgKWF8\nTjKnjs1iTHYSBVmJjM5OZFRmYuucYO1HT54yJqtLX0dHQiqlVO/RYK0XXHrppVx//fVUVFTw7rvv\n8txzzzFkyBDcbjfvvPMOhYWFXXpObW1th+nOOussvvjFL/Ltb3+bzMxMqqqqyMjI4Oyzz+aBBx7g\ntttua20G1dq1XhJutkZhln4E29+wlk1q7emF1XQ5fiHkzbKCsyGTDhl9ueUzT1K96W3SJ51FaspU\nPtlYxoaSWtaX1LK+uJbKRmvKC6dDGDckifyMBDaW1mEAp8CNC8Zw44Ku1ZJ1ty+ZUkqp3qPBWi+Y\nMmUK9fX1DB8+nKFDh3LFFVfwhS98galTpzJr1iwmTpzYped0lm7KlCl8//vf58wzz8TpdDJjxgwe\nffRR7rvvPm644QYefvhhnE4nDzzwAPPmzevJrzo4tF9qKRK0RhCXrrOCs9J1cGCztTYlWLP3twRq\n4oDTvwNn/aDTx1c3hnh+bTG/eDVEJHYqbA4CbwNWU+X4nGQWTBzC1OGpTM1LZfLQFHxu5yG1ZHNH\nd72WTIM0pZTqvzRY6yXr17dNGZKVlcWyZcs6vO9wgwAOl27x4sUsXrz4oGs5OTn84x//OIrcqk4V\nrYDHv0BBJGQttZRRANWFbQuL+zNg2HQYfx4MmwFDp0NdKTx+QVuT5rjzWh8XisTYvK+OdXtrWLe3\nho+KqtlT2XTIx549aQjfmj+WyUNT8Hs6nv9Ma8mUUmpg0mBNqSOJhqFoGWz9N6z7C0SCbUstxaIw\n70YrMBs2A9JGWj3446WNaG3SJP80DlTlsW7dJtbtrWZDaR2hiDXic0iyl+kj0vjy7BEkelz87JXN\nhO15yb41f2yXgi+tJVNKqYFHg7V+aP369Vx11VUHXfN6vaxYsaKPcjQINddY62VufRV2vGHNt+f0\nQu402LcOE4siLi9c9GCng1GMMWzb38Czq4p4dGmQmDkVNhvgI3xuB1OHp3LNKaOYPiKN6SPSGJrq\nO2j6lhOGp2otmVJKqcERrBljjjiHWX8ydepU1q3rYL3GHmCMOfJNA1n80mKJ2VZwtu1VKFxq9TlL\nyIKJn4cJ58PoBeBNgr0r2f3244w+6+qDAjVjDDsPNLJsVyXLd1ayfFdl6yCAFgJcNS+f//f5yV1a\nLFyDNKWUUgM+WPP5fFRWVpKZmXlcBWy9wRhDZWUlPp+vr7PSNwqXw+P2BMhA6yCA7Ilwys0w/nxr\ntGa7UZprYuN4OrKIy6JjyapsZNnOSpbawVl5vTWf2bBUH2dOyGbe6EySfS5ue3Zda8f/C6YPP2Kg\nppRSSrUY8MFaXl4excXFHDhw4Jg8LxAIDKjgxufzkZeX19fZ6D3RCBQthc3/hHVPQ7RtsljGfcZa\n5SJjdKfJ39lazg2PryYcNTy/vW2wR3ayl3mjM5k3JpN5ozPJz0w46B8HTyX7tElTKaXUURnwwZrb\n7aagoOCYPW/JkiXMmDHjmD1P9YJI0FrkfPNLsPUVayJal8+aZLZ4JcRi1ijNM757SKBmjGHr/nre\n2lzO21vKWVtYHT9bGudMzuHOhRMZk5142JpbbdJUSil1tPokWBORhcB9gBN4yBjz83Y/Hwk8BqTZ\n99xpjHml1zOqjl+hRmuAwOZ/wrbXIFgHnmQY/xmYvAjGngOexIP7rNn9zwLhKMt2VvL2FitAK6lp\nBmDq8FQumZXH39eVEolY62J+88wxjB2S1JffVCml1ADX68GaiDiB+4FzgWJglYi8ZIzZFHfbD4Dn\njDEPiMhk4BVgVG/nVR1ndr4Dax+DhnIoWQuRZmves8mLYNIFMPpMcHkPSrImNo7lkQzG1yVzYEUR\nb2/Zzwc7KgiEYyR4nJw2Notbzh7LgglDGJJiNX9fOnukrouplFKq1/RFzdocYIcxZheAiDwDXADE\nB2sGSLGPU4HSXs2hOr7UlcIbP4T1f227NmkRzL4O8k8FZ8ev+Ttb9nP942uIxNoaNvPS/Vw6awRn\nTcrh5IKM1jU04+m6mEoppXqT9PbUDSJyMbDQGHOdfX4VcLIx5qa4e4YCrwPpQCJwjjFmTSfPuwG4\nASAnJ2fmM88806P5b2hoIClpcDd79ZcySGjcy4i9fydn/xLERAGDADEc7Cm4gqL8iztMt7s2ypuF\nEZaVRojZ1wQ4N9/FZRM9XRo13F/KoC9pGWgZgJYBaBmAlgEcXRksWLBgjTFm1pHu668DDC4DHjXG\n/FpE5gFPiMgJxphY+xuNMQ8CDwLMmjXLzJ8/v0cztmTJEnr6M/q7Pi+DohXw4W+swQIuP8z+Kow6\nDV74OkRDOJweRp91NaPj5kALRWK8umEfjy7dw0dFjSR6nHzmhFze3lJOxF4l4OufndPl2rI+L4N+\nQMtAywC0DEDLALQMoGfLoC+CtRJgRNx5nn0t3teAhQDGmGUi4gOygPJeyaHqf2Ix2P4afPAb2Lsc\n/Olw5p0w53pItBcsTx56yGCB8roAT60o4i8rizhQH6QgK5F7vjCZi2fmkexzs6awWqfUUEop1a/1\nRbC2ChgnIgVYQdpXgMvb3VMEnA08KiKTAB9wbCZKU8eXSAjWPwcf/h9UbIXUkXD+/8CMK63RnPFG\nzIERczDGsLawmseW7uGV9fuIxAwLJmSz+JRRnDEuG4ejrZlTp9RQSinV3/V6sGaMiYjITcBrWNNy\nPGKM2SgiPwJWG2NeAr4D/ElEbscabHCNGfTrIg0yO9+BZb+D0nXQVAE5J8BFD8GUC8Hp7jDJsp0V\nPL6skK1l9eyqaCTZ6+LqeaO4el4+o7ISO0yjlFJK9Xd90mfNnjPtlXbXfhh3vAk4tbfzpfqBaBje\nuAeW32+diwM+81OY+y3opON/JBrjV69v5Q/v7rKSANefMZrbzh5Hore/dstUSimlukb/kqn+wRjY\n8i9rCo6qnXE/EIgEOgzUjDG8uqGMX722lV0Vja3XHQJpfrcGakoppQYEXU1a9b3iNfDnz8KzV4DD\nBef+xBrlKU5rGahRpx+S5IPtFVxw/4d866m1uJzCnedPxOd24BRwuxzMHZ3ZB19EKaWUOva06kH1\nnepCeOtHsOF5SMyGz98LM662JrEdefIhIzsBPimu4X/+vZUPdlQwPM3Pry45kS/OGI7TIcwelaEj\nO5VSSg04Gqyp3tdcDe//Glb80ao9O+MOOPVW8Ca33WOP7Gyx80ADv359K6+sLyMj0cMPPz+ZK+aO\nxOtqW2FAR3YqpZQaiDRYU70nEoLVD8O7v4DmGph+OSz4PqQO7zRJWW2A+97axnOri/G5HNx69jiu\nO72AZF/HI0KVUkqpgUaDNdXzilbAqj/Bng+gfh8UnAnn/QSGTus0ybtby7l/yQ4+KqoB4Kq5+dx0\n1liykrydplFKKaUGIg3WVM/a9ho8/RUwMUDgvP+GeTd2Og2HMYZ739jG/729AwCnCL+7fAbnTx3a\ni5lWSiml+g8N1lTPKVoOz3/VDtSw5kyLBjsN1AorG/n+ixv4YEdF3FVz0LQcSiml1GCjU3eoY88Y\nWP4APPo5a9CA03vYaTjC0RgPLNnJefe+x8d7a7j+9AKdhkMppZSyac2aOraCDfDSzbDxBZjwWbjw\nAajY1uE0HAAfFVVz1wvr2VJWz8IpufznoinkpvpYeMJQnYZDKaWUQoM1dSwd2AbPXgmV2+Hse+DU\n28DhOGQaDoD6QJhfvbaVx5cXkpPs48GrZnLelNzWn+s0HEoppZRFgzV1bGx4wapRc/ngqhdh9PxO\nb31tYxn3/GMj++sDLJ43iu+cN16n4lBKKaU6ocGa+nSiYWs9z+W/h7zZcMljnc6bVlYb4J6XNvDa\nxv1MzE3mgStPYsZIrT1TSimlDkeDNXX06vbBX6+BvcthztetudNcnkNuW72nij+8u5MPd1QSM4b/\nWDiR604vwO3U8S1KKaXUkWiwpo7Ong/gr9dCqAG+9DBMvbjD2z7cUcFVD68gZsAh8NvLZvC5acN6\nObNKKaXU8UuDNdU9RSuY+vF/wZJ1kDkaFr8EQyZ1eGt9IMz3nv+YmLHOhf/f3p3HV1Xf+R9/fbIB\nGkAWCWoggIKAGzYh4kINVjuIU5eWtrhVp7W08ysdO51qpZ3ajt1razud2k7RWu1UjdZaSytoLRqV\nGhqIguyLmASQnQQIkIQkn98f90Kz3EBIcs+5yX0/Hw8eueecb+795MN5hA/nu0HZ7oPBxSoiItID\nqFiT9itfBI9OY5A3RBa4nfbDNgu1vYcOc/uvS9i6t4b0VKOx0bVmmoiISAeoWJP2cYeXvgbeED1h\n8N6bcOaUVk2rDtZx669KWLNtH7+4JZfBmb20ZpqIiEgHqViT9nnjf2BzCaSk0djYSEobuxHsOVDH\nzQ//nXd2VPPLW3O5YmwWgIo0ERGRDtJ0PDm+t38Xeap2zg1w2/OUjbw5MlatxUK3O/fXMmNOMRt3\nVvPwbXlHCzURERHpOD1Zk2PbWATP/SvkXAbX/y+k96Yip4ZRLQq17ftquOmhRbxXVcOvb5/IJWcN\nDideERGRHkbFmrRt23IovAUGj4YZj0N675jN3qs6xE0PLWLn/loe+2Q++SMHBhyoiIhIzxVKN6iZ\nTTWztWa2wczuiXH9x2a2NPpnnZlVhRFnUquqgN9Oh9794OZnoM8pMZtt2nOQj88pZnd1Hb/51EUq\n1ERERLpY4E/WzCwVeBC4CtgMLDazue6+6kgbd//3Ju0/D1wYdJxJ7eAe+O1HoP4QfPLFNrePKt99\ngBvnLKK6tp7HP30R52fHLuhERESk48J4spYPbHD3je5eBxQC1x2j/Y3Ak4FEJnD4EDx5I1SWwYwn\n21xH7Z2d1Xzsl8UcOtzAkzMnqVATERGJE3P3YD/QbDow1d3viB7fClzk7rNitM0BFgHZ7kcX+GrZ\nZiYwEyArKyu3sLAwbrEDVFdXk5mZGdfPCI03cM7KHzB4199ZNf4udg65tFWTDZUNLNx0iJIdRloK\n3D2xD9l9k29ScY++D9pJOVAOQDkA5QCUA+hYDqZMmVLq7nnHa5foEwxmAM+0VagBuPscYA5AXl6e\nFxQUxDWgoqIi4v0ZoXCHeV+CXYtg6vc5Z9JnWzUpLa/k/r8uorbeAPjpjAlcOyF2F2lP12PvgxOg\nHCgHoByAcgDKAcQ3B2E8EtkCDGtynB09F8sM1AUajIUPwOKH4ZJ/gxiFGsAra3ZQW98IRDZl31R5\nKMgIRUREklIYxdpiYLSZjTSzDCIF2dyWjcxsLDAAKA44vuSz9AlYcB+c91G48r9iNnF3St7dDUQ2\nZM/QPp8iIiKBCLwb1N3rzWwW8CKQCjzi7ivN7D5gibsfKdxmAIUe9KC6ZLPhrzD38zDycrju55AS\nu35/oqSCkrJKbrs4hwO73uPGKydqCykREZEAhDJmzd3nAfNanLu3xfE3gowpKb31W/jTF6D/cPj4\nbyEtI2azDTv2880/r2Ly6MF8/UPn8Npru1SoiYiIBCT5pvFJxMZX4Y+zoPEw7H8Pdq6J2ay2voHP\nP7mUkzLS+NFHLyAlxQIOVEREJLmpWEtWRd8Boj3MDYeh7PWYzX7wwlpWb93H/dPPZ0i/2NtNiYiI\nSPwk+tIdEg9bl0FFCVhq5Dg1A0ZMbtWsaO0OfrXwXW67OIcPjMsKOEgREREBFWvJp7EB/nQnnDwY\nbvhFpHAbMRmG5TdrtnN/LV/63TLOzurL7GmxdzEQERGR+FOxlmxK5sB7b8H0R+CsKyN/WnB37n5m\nGftq6nn8jkn0Tk8NIVAREREBjVlLLns3w8vfgrOugnM+3Gazx94o45W1O/nqtHGcPbRvgAGKiIhI\nSyrWkoU7zLsLvBGu+RFY7Fmdq7fu4zvz13DF2CF84uKcgIMUERGRllSsJYvVf4K186BgNgyIXYTV\nHG7g3558i/590rl/+vlYGwWdiIiIBEdj1pJBzV6YfzcMPQ8m/b82m337+dWs31HNbz6Zz6DMXgEG\nKCIiIm1RsZYMFnwTqrfDjMchNfZf+UurtvN/i8r59OSRvH/MqQEHKCIiIm1RN2hPt2kxLH4Y8mfC\nGbkxm2zfV8PdzyzjnNP78aV/OjvgAEVERORYVKz1ZA2HI2uq9TsdrvjPmE0aG53/eHoZhw438N8z\nLqRXmpbpEBERSSTqBu3Jin8GO1bCjCegV+wlOB5euJGFG3bx3Q+fx1lDMgMOUERERI7zOOQJAAAf\nf0lEQVRHT9Z6qj3vQtH3Yew/w9hrYjb53eJNfG/+Gi4aOZAZE4cFHKCIiIi0h4q1nsgdnv8ipKTB\ntPtjNil+Zxd3//5tGh2WbqrizYqqgIMUERGR9lCx1hMtfwbeeRk+cG9kvFoMP12wHo++rm9oZNHG\n3cHFJyIiIu2mMWs9zcE98MI9cEYeTPxUzCart+6j5N09pJoBTnpaCpNGDQo2ThEREWkXFWs9zUv3\nwqFK+MQfIaX1zM76hka+/Pu3GXByBj/86AWsfG8fk0YNIjdnQAjBioiIyPGoWOtJyv4Gb/0fXHon\nDD03ZpNH/vYub2/ey89uupCCs4dQcPaQgIMUERGRE6Exaz1F2UJ4+lbIHAqX3xO7ya4DPPDSOq4c\nl8U1550WcIAiIiLSESrWeoJNJfCb6+Dgbji0B7avaNXE3Zn97HLSU1L41vXnapN2ERGRbiKUYs3M\npprZWjPbYGYxHwOZ2cfMbJWZrTSzJ4KOsVtZ9UdorI+8bmyAstdbNXlq8SaKN+5m9rRxDO3fO+AA\nRUREpKMCH7NmZqnAg8BVwGZgsZnNdfdVTdqMBmYDl7p7pZlpYFVb3CNP1gAsFVIzYMTkZk2276vh\n2/NWM2mUFr8VERHpbsKYYJAPbHD3jQBmVghcB6xq0ubTwIPuXgng7jsCj7K7WDsfNpdA/megb1ak\nUBuWf/Syu/O151ZQV9/I9z58Pikp6v4UERHpTszdj9+qKz/QbDow1d3viB7fClzk7rOatHkOWAdc\nCqQC33D3F9p4v5nATICsrKzcwsLCuMZfXV1NZmZi7KGZ0lBLfsksGlJ7syTvx3hK69p78bZ6Hlxa\ny8fOTmfayIwu+dxEykFYlAPlAJQDUA5AOQDlADqWgylTppS6e97x2iXq0h1pwGigAMgGXjOz89y9\n1Z5I7j4HmAOQl5fnBQUFcQ2sqKiIeH9Gu738bajdAbc/z+UjLmt1uepgHV964FXOO6M/3/nEJaSl\nds0QxYTKQUiUA+UAlANQDkA5AOUA4puDMCYYbAGaDpzKjp5rajMw190Pu/u7RJ6yjQ4ovu5h9zvw\nt5/AeR+DGIUawLeeX03lwcN87yPndVmhJiIiIsEK41/wxcBoMxtpZhnADGBuizbPEXmqhpkNBsYA\nG4MMMqG5w/wvQ2ov+OA3YzZ5ff1OnindzGcvH8U5p/cPOEARERHpKoEXa+5eD8wCXgRWA0+7+0oz\nu8/Mro02exHYbWargFeAu9xdO40fsXYebHgJpsyGvkNbXT5QW8/sZ5cz6tST+fwVeiApIiLSnYUy\nZs3d5wHzWpy7t8lrB74Y/SNN1R2E+ffAkPGQPzNmkx/9ZR2bKw/xu89eTO/01vuDioiISPeRqBMM\npC0LH4C9FXD7PEhNb3X5zYpKfv3Gu9w6KYeJIwaGEKCIiIh0JY067052vwN/++/opIJLW12uq2/k\nnt+/zdB+vbl76tkhBCgiIiJdTU/Wuot2TCr4edEG1m2v5pHb8+jbu/VTNxEREel+9GStu1jzfHRS\nwVdiTip47q0t/HTBeiaPHswVY7NCCFBERETiQcVad1B3EF64B4acE3NSQWnZHv796aU0OpS8u4fS\n8soQghQREZF4ULHWHSx8APZugmn3Q2rrnutHi8s4smtYfUMjizZqlRMREZGeQmPWEt2RSQXnfzzm\npIKaww0s2rgbA1IM0tNSmDRqUPBxioiISFx0qlgzsxuAl919b/T4FKDA3Z/riuCSnjvMuwvSesNV\nsScVPPpGGTv31/GND43nQF0Dk0YNIjdnQMCBioiISLx09sna1939D0cO3L3KzL5OZLso6aw1f4Z3\nFsDU70Hf1pMGdlXX8uDLG/jA2CHcfunIEAIUERGReOvsmLVY36+u1a5QdxBemB2ZVDDx0zGb/OSv\n6zh4uIHZ08YFHJyIiIgEpbPF2hIze8DMzoz+eQAo7YrAkt7rP4pMKrjmhzEnFazfvp8nSzZxy0XD\nOWtIZggBioiISBA6W6x9HqgDngIKgRrgc50NKuktfxYW/hjOvBJyLonZ5DvzVnNSRip3Xjkm4OBE\nREQkSJ3qsnT3A8A9XRSLAGwqgWc/Bd4I5Qsjx8PymzV5bd1OXlm7k69MG8vAkzNCClRERESC0Kkn\na2b2UnQG6JHjAWb2YufDSmIrn4sUagANh6Hs9WaXGxqdbz+/mmED+3DbJSOCj09EREQC1dlu0MHu\nXnXkwN0rgSGdfM/ktu+9yFdLhdQMGDG52eWnl2xi7fb9zL56HL3SUkMIUERERILU2ZmbjWY23N0r\nAMxsBOCdDSpp1VZHluoYdQWMvCxSqDXpAq2uredHf1lHXs4Arj639f6gIiIi0vN0tlj7KrDQzF4F\nDJgMtN68Utrn7aegdl9ks/ZhE1td/t+id9hVXctDn8jFzEIIUERERILW2QkGL5hZHpEC7S0ii+Ee\n6orAko47lDwEp02A7LxWl7dUHeKh1zdy3YTTuXC4digQERFJFp3dbuoO4E4gG1gKTAKKgSs6H1qS\nKXsddq6G634OMZ6a3f/CGhy465/ODj42ERERCU1nJxjcCUwEyt19CnAhUHXsb5GYSuZAn4Fw7odb\nXVq2qYrnlr7HHZeNJHvASSEEJyIiImHpbLFW4+41AGbWy93XAHr0c6KqNsGa5+F9n4D0Ps0uuTvf\nen4VgzMz+NeCM0MKUERERMLS2QkGm6PrrD0HvGRmlUB558NKMqW/jnzN+2SrSy+s2Mbiskq+c8N5\n9O2dHnBgIiIiErZOPVlz9xvcvcrdvwF8DfgVcP3xvs/MpprZWjPbYGatdkAws9vNbKeZLY3+uaMz\ncSa0wzVQ+iiMuRoG5DS7VFvfwHfnr2FMViYfy8sOJz4REREJVWefrB3l7q+2p52ZpQIPAlcBm4HF\nZjbX3Ve1aPqUu8/qqvgS1qrn4OBuyP90q0u/eaOcij0HeeyT+aSldrbHWkRERLqjMCqAfGCDu290\n9zoiG8BfF0IciaFkDgweA6MKmp3ec6COn768nsvHnMrlY04NJTQREREJn7kHu+GAmU0Hprr7HdHj\nW4GLmj5FM7Pbge8CO4F1wL+7+6Y23m8m0YV4s7KycgsLC+Maf3V1NZmZmV3yXn33rSP3zbtYN3om\n751xTbNrv11Vy4KKer51aR/O6JtYT9W6MgfdlXKgHIByAMoBKAegHEDHcjBlypRSd2+9uGoLXdYN\n2sX+BDzp7rVm9hngMdpYu83d5wBzAPLy8rygoCCugRUVFdFln/Hsk5DRlzHT72VMr75HT89duoUF\nm5Zy5fgsbv7Qcf8OA9elOeimlAPlAJQDUA5AOQDlAOKbgzAe2WwBhjU5zo6eO8rdd7t7bfTwYSA3\noNiCU70TVj4LE26EJoVaaXklX3hqKe7w2rqdlJZXhhikiIiIhC2MYm0xMNrMRppZBjADmNu0gZmd\n1uTwWmB1gPEF483HoKEOJjafWPDq2h00Rnum6xsaWbRxdwjBiYiISKIIvBvU3evNbBbwIpAKPOLu\nK83sPmCJu88F/s3MrgXqgT3A7UHHGVcN9bDkkcikglPHNLt0ZARhikF6WgqTRg0KOjoRERFJIKGM\nWXP3ecC8FufubfJ6NjA76LgCs3Ye7NsC0+5vdWn11v0MOjmDf7l0BBefOZjcHG3aLiIikswSdYJB\nz1YyB/oPhzFTm52urq3ntfU7uSl/OLOuGB1ScCIiIpJIEmtNiGSwYzWUvQ4TPwUpqc0uvbxmB3X1\njUw777Q2vllERESSjYq1oJXMgbTekU3bW3hhxVYGZ/ZS16eIiIgcpWItSIeqYFkhnDsdThrY/FJd\nA6+s2ck/nZNFaoqFFKCIiIgkGhVrQVr2JBw+GHMf0FfX7eDQ4QZ1gYqIiEgzKtaC0tgIJQ9Bdj6c\nPqHV5fkrtjHgpHQuGjkwxjeLiIhIslKxFpSNL8OedyB/ZqtLtfUNLFi9gw+OH0paqv5KRERE5B9U\nGQSl5CE4eQiMv67VpYXrd1FdW8/U84aGEJiIiIgkMhVrQdjzLqx7EXJvh7SMVpfnr9hG395pXHrm\n4OBjExERkYSmYi0Iix+OrKmW98lWlw43NPLSqu1cNS6LjDT9dYiIiEhzqg7ire4gvPV/MO5D0K/1\nTM/id3az99Bhpp6rLlARERFpTcVavL36A6jZCyMmx7w8f8U2Ts5I5f1jTg04MBEREekOVKzF06YS\neOMnkdcvfjVy3ERDo/OXlduYMnYIvdNTY7yBiIiIJDsVa/G0YQG4R1431EX2BG2i5N097D5Qx9Xn\naiFcERERiU3FWjz17h/5aimQmtGqK/SFFVvpnZ5CwdnqAhUREZHY0sIOoEc7tAcweP/dcNYHYFj+\n0UuNjc78Fdu4fMypnNxLfw0iIiISm6qEeCovhtMugCmzW116a1MlO/bXai9QEREROSZ1g8ZLfR1s\nWQI5l8S8PG/5NjJSU7hi7JCAAxMREZHuRMVavGxdCvU1MPziVpfcnRdWbGPy6MH07Z0eQnAiIiLS\nXahYi5fyNyJfYxRry7fsZUvVIS2EKyIiIselYi1eKoph0GjIbD3Tc97ybaSlGFeNzwohMBEREelO\nVKzFQ2MjVCyC4ZNaXYp0gW7l4jMHccpJrTd1FxEREWkqlGLNzKaa2Voz22Bm9xyj3UfMzM0sL8j4\nOm3naqipijm5YM22/ZTtPqiFcEVERKRdAi/WzCwVeBC4GhgP3Ghm42O06wvcCfw92Ai7wDHGq81f\nvpUUgw+eoy5QEREROb4wnqzlAxvcfaO71wGFwHUx2n0T+D5QE2RwXaKiGPqeBgNGtLo0f8U28kcO\nZHBmr+DjEhERkW7H/MjelUF9oNl0YKq73xE9vhW4yN1nNWnzPuCr7v4RMysCvuTuS9p4v5nATICs\nrKzcwsLCuMZfXV1NZmZm2w3cubj4U+ztP45V59zV7NJ71Y18ZeEhbhmXwZU53XfJjuPmIAkoB8oB\nKAegHIByAMoBdCwHU6ZMKXX34w71SrgdDMwsBXgAuL097d19DjAHIC8vzwsKCuIWG0BRURHH/IzK\nMnh1N0MmXs+Q/Obt/mfBemAdn79hMln9escxyvg6bg6SgHKgHIByAMoBKAegHEB8cxBGN+gWYFiT\n4+zouSP6AucCRWZWBkwC5nabSQblxZGvscarrdhGbs6Abl2oiYiISLDCKNYWA6PNbKSZZQAzgLlH\nLrr7Xncf7O4j3H0EsAi4tq1u0IRT8Qb07g9Dms+ZKN99gFVb93G1FsIVERGRExB4sebu9cAs4EVg\nNfC0u680s/vM7Nqg4+ly5cUwbBKkNE/t/BXbALRrgYiIiJyQUMasufs8YF6Lc/e20bYgiJi6RPVO\n2L0eLry51aX5K7ZxfnZ/sgecFEJgIiIi0l1pB4OutGlR5Ovw5ovhbqk6xLJNVVoIV0RERE6YirWu\nVF4Mab3h9AnNTr8Q7QLVeDURERE5USrWulLFG3BGLqQ1X/B2/vKtjDutHyMGnxxSYCIiItJdqVjr\nKrXVsPXtVkt27NhXQ2lFpZ6qiYiISIeoWOsqm0vAGyCnebH20OsbcYecgZpYICIiIidOxVpXKS8G\nS4Hs/KOnSssr+dXCdwH48rNvU1peGVZ0IiIi0k2pWOsqFcUw9Dzo3e/oqb9t2EVjdOvVw/WNLNq4\nO6TgREREpLtSsdYV6utg8+JWS3YM6ReZaJBikJ6WwqRRg8KITkRERLqxhNvIvVvauhTqa1qNV6uu\nqQfgM5efyZXjssjNGRBGdCIiItKNqVjrCuVvRL62mAlaWl5J9oA+fHnq2BCCEhERkZ5A3aBdoaIY\nBp0FmUOOnnJ3lpRXkqenaSIiItIJKtY6q7ERKha1eqq2ufIQO/fXkjtiYEiBiYiISE+gYq2zdq6G\nmirIaT65YEn5HgByh+vJmoiIiHScirXOqiiOfI0xXq1vrzTOHto3hKBERESkp1Cx1lnlxZA5FAaM\naHZ6SVklE4afQmqKhROXiIiI9Agq1jrDPfJkLedisH8UZftqDrN2+34t1SEiIiKdpmKtM6oqYN+W\nVovhLq2owh3ycjS5QERERDpHxVpnHBmv1mIx3CXllaQYTBh+SghBiYiISE+iYq0zyt+AXv1hyPhm\np0vL9zB2aD8ye2nNYREREekcFWudUVEMwy+ClNSjp+obGllaUUXeCI1XExERkc5TsdZRB3bBrnWt\nluxYs20/B+oaNLlAREREukQoxZqZTTWztWa2wczuiXH9s2a23MyWmtlCMxsf631CdXS8WvPJBaXl\nlQAq1kRERKRLBF6smVkq8CBwNTAeuDFGMfaEu5/n7hOAHwAPBBzm8ZUXQ2ovOP3CZqdLyysZ2q83\nZ5zSJ6TAREREpCcJ48laPrDB3Te6ex1QCFzXtIG772tyeDLgAcbXPhVvQHYepPVqdrq0vJLcEQMw\n02K4IiIi0nnmHmwdZGbTganufkf0+FbgInef1aLd54AvAhnAFe6+vo33mwnMBMjKysotLCyMZ/hU\nV1fTv3cqly28iYrhH+HdUbccvbanppEvFh3iprEZfHBEelzjCFN1dTWZmZlhhxEq5UA5AOUAlANQ\nDkA5gI7lYMqUKaXunne8dgm7toS7Pwg8aGY3Af8J3NZGuznAHIC8vDwvKCiIa1xFRUVMHtYICxvJ\nef8Mcs76x+f9adl7wFvMuHIi52f33DXWioqKiHeeE51yoByAcgDKASgHoBxAfHMQRjfoFmBYk+Ps\n6Lm2FALXxzWiE1VeDJYC2fnNTpeWV9InPZVxp/ULKTARERHpacIo1hYDo81spJllADOAuU0bmNno\nJofXADG7QENTUQxZ50Lv5kVZaXklFwzrT3qqVkQRERGRrhF4VeHu9cAs4EVgNfC0u680s/vM7Npo\ns1lmttLMlhIZtxazCzQM1ngYNi9ptWTHgdp6Vm3dp/1ARUREpEuFMmbN3ecB81qcu7fJ6zsDD6qd\n+u7fCPWHWi2Gu2xzFQ2NTq52LhAREZEupP66E9R/78rIi5aL4ZZFFsN93zAVayIiItJ1VKydoP57\nV8HAMyFzSLPzS8orGZOVSf+Teu6SHSIiIhI8FWsnorGR/ntXQ87FLU47b1ZUkqvxaiIiItLFVKyd\niJ1rSK+vhuHNu0DX76hmf0299gMVERGRLqdi7UQseyLyNeOkZqeXlO8BIE/FmoiIiHQxFWvttakE\nin8e2aT0D/8aOY4qLa9kcGYGOYNOavPbRURERDpCxVp7lb0O3oABNNRFjqNKyyt533Bt3i4iIiJd\nT8Vae42YDGl9aCQFUjMix8DO/bWU7z5IntZXExERkThQsdZew/LhtrmUjbwZbpsbOSbyVA3Q5AIR\nERGJi1B2MOi2huVTkXOQUcP+sYF7afkeMtJSOPeM/iEGJiIiIj2Vnqx10pLySs4/oz+90lLDDkVE\nRER6IBVrnVBzuIEVW/aqC1RERETiRsVaJyzfspfDDa5iTUREROJGxVonLCnT5AIRERGJLxVrnVBa\nXsnIwSczKLNX2KGIiIhID6VirYPcj2zerqdqIiIiEj8q1jpo464D7DlQp/1ARUREJK5UrHWQFsMV\nERGRIKhY66DSskr690nnzFMzww5FREREejAVax20pHwPuTkDSEnR5u0iIiISPyrWOqDyQB3v7Dyg\nLlARERGJOxVrHfBmhcariYiISDBCKdbMbKqZrTWzDWZ2T4zrXzSzVWb2tpktMLOcMOJsy5LyStJS\njAuyTwk7FBEREenhAi/WzCwVeBC4GhgP3Ghm41s0ewvIc/fzgWeAHwQb5bGVllVyzun96JOhzdtF\nREQkvsJ4spYPbHD3je5eBxQC1zVt4O6vuPvB6OEiIDvgGNtU3+gs21xFbs7AsEMRERGRJGDuHuwH\nmk0Hprr7HdHjW4GL3H1WG+1/Bmxz92+1cX0mMBMgKysrt7CwMD6BR63YWs0Plxmfm9CLiUPT4vpZ\niaq6uprMzOReskQ5UA5AOQDlAJQDUA6gYzmYMmVKqbvnHa9dQlcbZnYLkAdc3lYbd58DzAHIy8vz\ngoKCuMb0wq9fAur4xLTLyOrXO66flaiKioqId54TnXKgHIByAMoBKAegHEB8cxBGsbYFGNbkODt6\nrhkzuxL4KnC5u9cGFNtxbahqIHtAn6Qt1ERERCRYYYxZWwyMNrORZpYBzADmNm1gZhcCvwSudfcd\nIcQYk7uzvqpR+4GKiIhIYAIv1ty9HpgFvAisBp5295Vmdp+ZXRttdj+QCfzOzJaa2dw23i5Qm/Yc\nYm+ta301ERERCUwoY9bcfR4wr8W5e5u8vjLwoNqhtGIPgGaCioiISGC0g8EJmL98G2kGB+rqww5F\nREREkoSKtXYqLa/kpVXbqXe49Vd/p7S8MuyQREREJAmoWGunRRt3YxZ5fbi+kUUbd4cbkIiIiCQF\nFWvtNGnUIDLSUkgB0tNSmDRqUNghiYiISBJQsdZOuTkDePyOSXx4dDqP3zFJM0JFREQkEAm9g0Gi\nyc0ZwP4zM1SoiYiISGD0ZE1EREQkgalYExEREUlgKtZEREREEpiKNREREZEEpmJNREREJIGpWBMR\nERFJYCrWRERERBKYuXvYMXQZM9sJlMf5YwYDu+L8GYlOOVAOQDkA5QCUA1AOQDmAjuUgx91PPV6j\nHlWsBcHMlrh7XthxhEk5UA5AOQDlAJQDUA5AOYD45kDdoCIiIiIJTMWaiIiISAJTsXbi5oQdQAJQ\nDpQDUA5AOQDlAJQDUA4gjjnQmDURERGRBKYnayIiIiIJTMWaiIiISAJTsdZOZjbVzNaa2QYzuyfs\neMJiZmVmttzMlprZkrDjCYKZPWJmO8xsRZNzA83sJTNbH/06IMwY462NHHzDzLZE74WlZjYtzBjj\nzcyGmdkrZrbKzFaa2Z3R80lxLxzj50+2+6C3mZWY2bJoHv4ren6kmf09+m/EU2aWEXas8XKMHDxq\nZu82uRcmhB1rPJlZqpm9ZWZ/jh7H7R5QsdYOZpYKPAhcDYwHbjSz8eFGFaop7j4hidbUeRSY2uLc\nPcACdx8NLIge92SP0joHAD+O3gsT3H1ewDEFrR74D3cfD0wCPhf9PZAs90JbPz8k131QC1zh7hcA\nE4CpZjYJ+D6RPJwFVAKfCjHGeGsrBwB3NbkXloYXYiDuBFY3OY7bPaBirX3ygQ3uvtHd64BC4LqQ\nY5KAuPtrwJ4Wp68DHou+fgy4PtCgAtZGDpKKu2919zejr/cT+SV9BklyLxzj508qHlEdPUyP/nHg\nCuCZ6Pkeex/AMXOQNMwsG7gGeDh6bMTxHlCx1j5nAJuaHG8mCX9JRTnwFzMrNbOZYQcToix33xp9\nvQ3ICjOYEM0ys7ej3aQ9svsvFjMbAVwI/J0kvBda/PyQZPdBtPtrKbADeAl4B6hy9/pokx7/b0TL\nHLj7kXvh29F74cdm1ivEEOPtJ8DdQGP0eBBxvAdUrMmJuszd30ekS/hzZvb+sAMKm0fWv0mq/1VG\n/QI4k0g3yFbgR+GGEwwzywR+D3zB3fc1vZYM90KMnz/p7gN3b3D3CUA2kZ6XsSGHFLiWOTCzc4HZ\nRHIxERgIfDnEEOPGzP4Z2OHupUF9poq19tkCDGtynB09l3TcfUv06w7gD0R+USWj7WZ2GkD0646Q\n4wmcu2+P/sJuBB4iCe4FM0snUqg87u7PRk8nzb0Q6+dPxvvgCHevAl4BLgZOMbO06KWk+TeiSQ6m\nRrvK3d1rgV/Tc++FS4FrzayMyLCoK4D/Jo73gIq19lkMjI7O9MgAZgBzQ44pcGZ2spn1PfIa+CCw\n4tjf1WPNBW6Lvr4N+GOIsYTiSIESdQM9/F6Ijkn5FbDa3R9ocikp7oW2fv4kvA9ONbNToq/7AFcR\nGb/3CjA92qzH3gfQZg7WNPlPixEZr9Uj7wV3n+3u2e4+gkg98LK730wc7wHtYNBO0enoPwFSgUfc\n/dshhxQ4MxtF5GkaQBrwRDLkwcyeBAqAwcB24OvAc8DTwHCgHPiYu/fYAfht5KCASNeXA2XAZ5qM\n3epxzOwy4HVgOf8Yp/IVIuO2evy9cIyf/0aS6z44n8jg8VQiDzyedvf7or8fC4l0/70F3BJ9wtTj\nHCMHLwOnAgYsBT7bZCJCj2RmBcCX3P2f43kPqFgTERERSWDqBhURERFJYCrWRERERBKYijURERGR\nBKZiTURERCSBqVgTERERSWAq1kREOsnMCszsz2HHISI9k4o1ERERkQSmYk1EkoaZ3WJmJWa21Mx+\nGd2Mujq66fRKM1tgZqdG204ws0XRTan/cGSDcjM7y8z+ambLzOxNMzsz+vaZZvaMma0xs8ejq7iL\niHSaijURSQpmNg74OHBpdAPqBuBm4GRgibufA7xKZHcGgN8AX3b384ms2n/k/OPAg+5+AXAJkc3L\nAS4EvgCMB0YR2T9QRKTT0o7fRESkR/gAkAssjj706kNk0/VG4Klom98Cz5pZf+AUd381ev4x4HfR\nvXHPcPc/ALh7DUD0/UrcfXP0eCkwAlgY/x9LRHo6FWsikiwMeMzdZzc7afa1Fu06ugdf0z0AG9Dv\nVxHpIuoGFZFksQCYbmZDAMxsoJnlEPk9OD3a5iZgobvvBSrNbHL0/K3Aq+6+H9hsZtdH36OXmZ0U\n6E8hIklH//MTkaTg7qvM7D+Bv5hZCnAY+BxwAMiPXttBZFwbwG3A/0aLsY3Av0TP3wr80szui77H\nRwP8MUQkCZl7R5/4i4h0f2ZW7e6ZYcchItIWdYOKiIiIJDA9WRMRERFJYHqyJiIiIpLAVKyJiIiI\nJDAVayIiIiIJTMWaiIiISAJTsSYiIiKSwP4/j9fi7DRIYq4AAAAASUVORK5CYII=\n", 396 | "text/plain": [ 397 | "" 398 | ] 399 | }, 400 | "metadata": {}, 401 | "output_type": "display_data" 402 | } 403 | ], 404 | "source": [ 405 | "# 学習の様子をプロット\n", 406 | "loss = history.history['loss']\n", 407 | "val_loss = history.history['val_loss']\n", 408 | "\n", 409 | "acc = history.history['acc']\n", 410 | "val_acc = history.history['val_acc']\n", 411 | "\n", 412 | "plt.figure(figsize=(10,10))\n", 413 | "plt.subplot(2,1,1)\n", 414 | "plt.title('Loss')\n", 415 | "epochs = len(loss)\n", 416 | "plt.plot(range(epochs), loss, marker='.', label='loss')\n", 417 | "plt.plot(range(epochs), val_loss, marker='.', label='val_loss')\n", 418 | "plt.legend(loc='best')\n", 419 | "plt.grid()\n", 420 | "plt.xlabel('epoch')\n", 421 | "plt.ylabel('acc')\n", 422 | "\n", 423 | "plt.subplot(2,1,2)\n", 424 | "plt.title('Accuracy')\n", 425 | "plt.plot(range(epochs), acc, marker='.', label='acc')\n", 426 | "plt.plot(range(epochs), val_acc, marker='.', label='val_acc')\n", 427 | "plt.legend(loc='best')\n", 428 | "plt.grid()\n", 429 | "plt.xlabel('epoch')\n", 430 | "plt.ylabel('acc')\n", 431 | "plt.show()" 432 | ] 433 | }, 434 | { 435 | "cell_type": "code", 436 | "execution_count": null, 437 | "metadata": { 438 | "collapsed": true 439 | }, 440 | "outputs": [], 441 | "source": [] 442 | } 443 | ], 444 | "metadata": { 445 | "kernelspec": { 446 | "display_name": "Python 3", 447 | "language": "python", 448 | "name": "python3" 449 | }, 450 | "language_info": { 451 | "codemirror_mode": { 452 | "name": "ipython", 453 | "version": 3 454 | }, 455 | "file_extension": ".py", 456 | "mimetype": "text/x-python", 457 | "name": "python", 458 | "nbconvert_exporter": "python", 459 | "pygments_lexer": "ipython3", 460 | "version": "3.6.1" 461 | } 462 | }, 463 | "nbformat": 4, 464 | "nbformat_minor": 2 465 | } 466 | --------------------------------------------------------------------------------