{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Chapter9\n", "D3.js in Actionの9章の勉強ノートです。\n", "\n", "9章では、グラフと表を同時に表示したダッシュボックスの作成方法を説明しています。\n", "\n", "ここでは、高岡市の地図と高岡市が公開しているオープンデータ(人口分布)を使って高岡市のダッシュボックスを作成します。\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loaded nvd3 IPython extension\n", "run nvd3.ipynb.initialize_javascript() to set up the notebook\n", "help(nvd3.ipynb.initialize_javascript) for options\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "$.getScript(\"https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.7.0/nv.d3.min.js\")" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "$.getScript(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function() {\n", " $.getScript(\"https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.7.0/nv.d3.min.js\", function() {})});" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%load_ext sage\n", "from IPython.core.display import HTML\n", "from string import Template\n", "import json\n", "import nvd3\n", "nvd3.ipynb.initialize_javascript(use_remote=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 高岡市のオープンデータを取り込む\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/lib/sagemath/local/lib/python2.7/site-packages/traitlets/traitlets.py:770: DeprecationWarning: A parent of InlineBackend._config_changed has adopted the new @observe(change) API\n", " clsname, change_or_name), DeprecationWarning)\n" ] } ], "source": [ "# python用のパッケージ\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt \n", "import seaborn as sns\n", "%matplotlib inline\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandasでExcelのデータを扱えるようにするために、xlsxWriter xlrdをインストールします。また、python-nvd3も合わせてインストールします。\n", "\n", "
\n",
    "$ sudo sage -sh\n",
    "(sage-sh) $ pip install xlsxWriter xlrd\n",
    "
\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
地区\n", "コード地区名人  口Unnamed: 4Unnamed: 5世帯数
NaNNaNNaNNaNNaN
2NaN01 平米地区NaN1514176632801563.0
3NaN02 定塚地区NaN4370485592254006.0
4NaN03 下関地区NaN4442456290044022.0
5NaN04 博労地区NaN52535738109914653.0
\n", "
" ], "text/plain": [ " 頁 地区\\nコード 地区名 人  口 Unnamed: 4 Unnamed: 5 世帯数\n", "NaN NaN NaN NaN 男 女 計 NaN\n", "2 NaN 01 平米地区 NaN 1514 1766 3280 1563.0\n", "3 NaN 02 定塚地区 NaN 4370 4855 9225 4006.0\n", "4 NaN 03 下関地区 NaN 4442 4562 9004 4022.0\n", "5 NaN 04 博労地区 NaN 5253 5738 10991 4653.0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 高岡市のオープンデータから平成27年7月の人口データ(h270731.xlsx)を取り込みます\n", "# 古いデータが公開リストから削除されるため、ダウンロードしたh290531.xlsxを使用するように修正しました。\n", "# d = pd.read_excel('http://www.city.takaoka.toyama.jp/joho/shise/opendata/documents/h290531.xlsx', header=3, index_col=1)\n", "d = pd.read_excel('data/h290531.xlsx', header=3, index_col=1)\n", "d.head()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "地区コードと地区名はセル結合していたり、頁が全てNaNになっているので、少し加工します。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codemalefemalepopulationhousehold
201 平米地区1514176632801563.0
302 定塚地区4370485592254006.0
403 下関地区4442456290044022.0
504 博労地区52535738109914653.0
605 横田地区2720295356732243.0
\n", "
" ], "text/plain": [ " code male female population household\n", "2 01 平米地区 1514 1766 3280 1563.0\n", "3 02 定塚地区 4370 4855 9225 4006.0\n", "4 03 下関地区 4442 4562 9004 4022.0\n", "5 04 博労地区 5253 5738 10991 4653.0\n", "6 05 横田地区 2720 2953 5673 2243.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# カラム名を付け直し、最初の5個を表示\n", "d.columns = ['not_used', 'code', 'region', 'male', 'female', 'population', 'household']\n", "# 最初の番号(index)が1より大きなcode, population, householdを抽出します。\n", "d1 = d[d.index > 1][['code', 'male', 'female', 'population', 'household']]\n", "d1.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "地区ごとの男性、女性、世帯数がどのように分布しているか、可視化してみましょう。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAI5CAYAAABelRX2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt0HNWZ7/2vZNnCsmTJsmVJFrbM9cEYMvFADHGCCRAu\nuQCLWzJAmAFmGJjD5CWBMIdkViYM550c3mSRSUgmOQHCJUzIYU4GEhgGAhyYBALBJCErxDaPCUaW\n44ssWxckyzdJ/f5RJdFqd0stqatL6v591vKyqmrXrl1dW7sf7dq1qySRSCAiIiIiByuNuwAiIiIi\nU5UCJREREZEMFCiJiIiIZKBASURERCQDBUoiIiIiGShQEhEREcmgLOoDmNlxwI+Br7n7t83sUOBB\ngiBtG3CFux8ws8uBG4AB4C53v8/MyoD7gWagH7jK3VvM7D3Ad4BB4Hfufn3U5yEiIiLFJ9IeJTOr\nAO4Enk1afRvwTXc/FXgLuDpM90XgdOA04EYzqwEuAzrd/RTgy8DtYR5fBz4drq8xs7OjPA8REREp\nTlHfetsLfISg52jIh4DHw58fB84ETgLWuHuvu+8FXgQ+CJwBPBqmfRZYZWYzgcPc/TdJeXw4ypMQ\nERGR4hRpoOTug+6+L2X1HHc/EP68A2gE6oH2pDTtqevdPQEkgAagIyntUB4iIiIiORXHYO7kd6aU\nhMslKWlGW0/K+qG0IiIiIjkV+WDuNHrNrDzsaWoCtgJbgHOT0jQBL4frG4DXw4HdJWH6+Slpk2/t\npZVIJBIlJalxl0xxkV4w1YlpS/VC0lG9kFQ5uWBxBErPAhcBD4X/PwWsAe4xs7kET7KtIngCrhq4\nBHgGOA943t0HzGy9ma1y95eACwkGjI+qpKSE9vaeSRe+rq5K+eQpr7q6qhyUJrNc1QmYetehUPMZ\nyitKuawXyXL5GSjf9PlGabz1YrznOZHPJepjFEL6XIg0UDKzPwXuIHi8/4CZXQxcDjxgZtcCm4AH\nwuDnFuBpgkDpVnfvMbOHgTPN7AWCgeFXhll/FviumZUAr7j7c1Geh4iIiBSnSAOl8Mm009JsOitN\n2keAR1LWDQJXp0m7Hlido2KKiIiIpKWZuUVEREQyUKAkIiIikoECJREREZEMFCiJiIiIZBDH9AAF\nbWBggJaWjaOmWbr08DyVRkRERCZDgVKOtbRs5IavPkZF9cK02/u6d/CNm8+joeFP81wyERERGS8F\nShGoqF5I5bymuIshIiIik6RASUSmhEQiwbrWLja39bKkvpJlzTWURPtWCpnCVB8knTjqhQIlEZkS\n1rV2cccPXxtevunSFSxvnhdjiSROqg+SThz1Qk+9iciUsLmtd9RlKS6qD5JOHPUilh4lM5sDfB+o\nBWYCtwHbge8QvOvtd+5+fZj2ZuDicP1t7v5k+PLchwhemtsDXObuXXk/ERHJmSX1lSOWF6csS3FR\nfZB04qgXcd16uxJ4w93/3swagOeBrcCn3f03ZvYDMzsbcOATwMnAPOAFM3sK+AzwvLvfYWbXALeE\n/0RkmlrWXMNNl65gc1svi+srOba5Ju4iSYxUHySdOOpFXIHSTuD48Of5wC7gsPAlugCPA2cCi4An\n3X0A2GlmLcBy4AzgqqS0/5GfYotIVEooYXnzPI1DEUD1QdKLo17EMkbJ3R8Gms3sTeC/gJuBzqQk\nO4BGoB5oH2P9DqAh4iKLiIhIEYolUDKzy4FN7n4UcDrwQEqSEiAR/p+sNM36obQiIiIiORXXrbcP\nAD8FcPfXzawSqEja3kQwZmkLcEyG9Q0EA7mbgG3ZHLSurmrSBR8rn87OsQeW1dZW5q08ceST67yi\nNBXPWfnEL6qyKt9o843aeMsddfp8HGO6p8+FuAKlPxAM0H7UzJoJAp63zewD7v4L4ELgTuBN4EYz\n+wdgIbDI3deZ2TMEg7z/CbgIeCqbg7a390y64HV1VaPm09Ex9qOKQ2nyUZ5855PLvPLxCzEVz1n5\njJ1X1HJV1mS5/AyUb/p8ozaeco/3PCfyuUR9jEJInwtxBUrfBe41s/8CZgDXEkwPcJeZlQCvuPtz\nAGZ2N/ACwfQA14X73wn8q5n9nGBs06fyW3wREREpBrEESu6+G/hkmk2r06T9F+Bf0ux/QTSlExER\nEQloZm4RERGRDBQoiYiIiGSgQElEREQkAwVKIiIiIhkoUBIRERHJIK7pAURkGkskEqxr7WJzWy9L\n6itZ1lxDyUET6UsxUt0oXgODCdZu6iy4a69ASUTGbV1rF3f88LXh5ZsuXaGXlwqgulHM1qzdXpDX\nXrfeRGTcNrf1jrosxUt1o3ht2tY9YrlQrr0CJREZtyX1I99puLh+7HccSnFQ3SheSxurRywXyrXX\nrTcRGbdlzTXcdOkKNrf1sri+kmOba+IukkwRqhvFa+XyhoK89rEFSmZ2OXAzcAD4IvB74EGCXq5t\nwBXufiBMdwMwANzl7veZWRlwP9AM9ANXuXtL3k9CpEiVUMLy5nkFMf5Ackt1o3iVlhbmtY/l1puZ\n1QL/AKwCPk7w3rbbgG+6+6nAW8DVZlZBEESdDpwG3GhmNcBlQKe7nwJ8Gbg9/2chIiIihS6uHqUP\nA8+4ex/QB1xrZhuBa8PtjwOfAzYAa9y9F8DMXgQ+CJwBPBCmfRa4N49lFxERkSIR12DupcAcM/uJ\nmf3MzE4HKtz9QLh9B9AI1APtSfu1p6539wQwGN6OExEREcmZuIKLEqCW4JbbUuB5IJGyPRH+n7pf\nuvWlKfuLiIiITFpcgVIb8JK7DwIbzawHOMTMyt19H9AEbAW2AOcm7dcEvByubwBeH+pJcveBsQ5a\nV1eVk8KPlk9n59iPQ9bWVuatPHHkk+u8ojQVz1n5xC+qsirfaPON2njLHXX6fBxjuqfPhbgCpaeB\n+8zsK8B8oBJ4CrgY+AFwUbi8BrjHzOYCgwSDv28AqoFLgGeA8wh6pMbU3t4z6YLX1VWNmk9Hx9gT\nbA2lyUd58p1PLvPKxy/EVDznuPNJfgXFUUvmcXjDnEm/hiDX9StquSprslx+BnHlm4vXk0RZ3qiN\np9zjPc+JfC5RH2O8dSCO8oyVPhdiCZTcfauZ/Qj4JcEts+uBXwEPmtlfA5uAB9x9wMxuIQisBoFb\n3b3HzB4GzjSzF4C9wJVxnIdIIdIrKCQT1Q0pxjoQ2wBod78buDtl9Vlp0j0CPJKybhC4OrrSiRSv\ndK+gKPSGULKjuiHFWAf0ChMRGUGvoJBMVDekGOuAHqkXkWGDg4O807efc97fTE1lOUceWs1hRdAQ\nSmaDg4O84u20bu9laWMVf3f5Clq2FdYrKmRsyWOTrjn/OHZ19zG7fCZlpZAgMelxjFOZAiURGfaK\nt3P3T9YOL197wfEcXj89n1CS3EitE9ecv5xzVi6OsUQSh9SxSatXNPHz1zYChT9OSbfeRGRY6/aR\n4w82bX8nppLIVJFaJ1KXpTikjk3as68/47ZCo0BJRIYtaRjZe9TcMDemkshUkVonljToVmwxSh2b\nNLv83RtShT5OSbfeRGTYScsWAMtp3d7LkoZKzjl5KZ2du+MulsQotU6ctKwu7iJJDJY113DTpSvY\n3BaMT5tRCg3zKopirFrWgZKZfQw4zN2/ZWZHABvD96yJyDQy2oRxpZTy/mX1vH9ZPQBlZep0Libp\nJhtNrRNSWLKdRLSEEpY3zxsxFumYxYU7LilZVoGSmf1/wFFAM/At4DJgIfDp6IomIlEoxgnjJDuq\nG8VH13xs2f65eKq7Xwi8A+Du/wM4IbJSiUhk0k0YJwKqG8VI13xs2d562xP+nwAwsxnAjEhKJCI5\nldq1XowTxkl6qhuS7poP1Yvtr22hsbZiQu/0KyTZBkovmdl9wCIzuxG4APivyEolIjmT2rV+3QXH\ncfnZxju793P04pqCH4gpmaWrG0MDdo9cMo8jGubEWDrJh9RB2sc217Buk27HJcsqUHL3vzezi4E+\n4FDgn8N3sE2YmR0CrAX+EXgOeJDgVuA24Ap3P2BmlwM3AAPAXe5+n5mVAfcTjJfqB65y95bJlEWk\nkKV2pf/a23l1XRsQNIDF/JdisUtXN1b/ySLOWbl4Qm+zl+kn3SDtDZu7RqTZsLmrqAOlUccomdnh\nQ/+A3wB3EAzm/m24bjK+COwMf74N+Ka7nwq8BVxtZhVhmtOB04AbzayGYCB5p7ufAnwZuH2S5RAp\naKPNf6LxCMUtXd1QnZC5c8pTlmfFVJKpYawepf9LMC4p3Z+cCWBCwZKZGXAM8ESY96nAteHmx4HP\nARuANe7eG+7zIvBB4AzggTDts8C9EymDSLFI7lqvrprFQz/14W0ag1LcljXXcM35y/ntmzuZXV7G\nr9e3cd0Fx8ddLInZoQtms3pFE3v29TO7vIymBRVxFylWowZK7n5Ypm1m9oFJHPcO4HrgynB5jrsf\nCH/eATQC9UB70j7tqevdPWFmg2ZW5u79iMhBkrvWEySYWzFrxHgEKV4llHDysoXDdeK6C45XnRCO\nXlxD/yBs7+ijobYCW1zcdSLbeZTmAp8CFoSryoGrgEXjPaCZXQG85O6bgo4lIHyaLlRC+l6sTOtL\nU/bPqK4uNy/3HC2fzs6x/0Kvra3MW3niyCfXeUVpKp5zLvIZGEzwh+29bNrWzdLGalYub6C0NPjV\nWVg3vteSTKXzypeoyhp3vgODCdas3X5QvchUJ+Iu71Qz3nJHnX6yx8hUH2D87UQuyhNF+lzI9qm3\nh4FNwNnAj4CzgL+Z4DE/BhxmZucCTcB+YLeZlbv7vnDdVmALcG7Sfk3Ay+H6BuD1cGA37j6QzYFz\nMTBxrAGOHR1j398fSpOP8uQ7n1zmlY9fiKl4zrnI5w/be/ny/WuGlyf61MpUO6+hvKIWxSDmqAZH\njyfftZs6s36aaSqUd7z5Rm085R7veU7kc5nsMcaqD1GfQz7S50K2E04e4u7XAZvc/WaCwdWfmMgB\n3f3P3P0kd38/cA/BQO5ngYvDJBcBTwFrgBPNbK6ZVQKrgBeAZ4BLwrTnAc9PpBwihWzTtu4Ryxqg\nK6DJBWUk1YfsZBsolZvZHKDUzOa7ewdwZA6OP3Qb7UvAX5jZz4B5wAPuvhe4BXg6/Heru/cQ9G6V\nmdkLBL1an89BOUQKytLG6hHLGrQtkH5yQSleqg/ZyfbW2/eBawh6gNaZ2U7gzcke3N3/MWnxrDTb\nHwEeSVk3CFw92WOLFIJML7RcubzhoEnkpPik1o9jmqtVL4pEurYhVbrJJuVg2QZKjxHcGmsOf14I\n/DaqQolIdta1dvG/Hn2dE5bV8/b2d+juO8DJy+ooLT14EjkpLolEgl++sYPfvrmTivIynnjpba67\n4HjViwKWHBxVV5Xz0E/fYPfe4IHwmy5dcdAA7XSTTcrBsg2U/pNgwsktwPbwX7a37UQkIpvbejlh\nWT0/f20LAK+ua2NuxcENohSfda1d3P2TtcPLq1c0sbmtV1+KBSz1lTSrVzQNtw0afzRx2QZKHe6u\n210iU8yS+kre3v7OiHVqEAUOrgd79vVrDEqBS3fNh+jaT1y2gdKj4XvXXiZ4vxoA7t4aSalEJKPU\nsQcn2MLhd7eBGsRilnrrZc4hZcO3Xt571AKNQSlAY13zwxrmavzRJGUbKL0HuBzYlbQuASzJeYmm\ngR8/8Qx/aG1Lu61jZxvBEC6R3Ms07kQDMiVd3bjsbKO7Z/9wvdALkAvPG5u7ePWNHezZ109FZxlX\nfOQYOrr36ZrnULaB0slAbfjIftFbv3Ebb+4+NO223t6sJgkXGbehL8J0407OWblYY0+KWKa60d2z\nn3NWLo6xZBK1rbv6hschARy6sFLXPMeyHZD9KsFrS0QkJutau/jtmztHrNO4EwHVjWLW2bNv1GWZ\nvGx7lA4FWsxsPSPHKK2OpFQicpDNbb1UlI/8ldW4EwHVjWI2v/qQkctz1aeRa9kGSv8UaSlE5CCp\ng7YPa6zkiZfeZvWKJvbs6+e9Ry3g5GULNQahSA3Vj+2vbaG6qpznft2qulHAMk0guah29vB1n11e\nRuP8iphLWniyCpTc/WdRF0RERkqdE+WmS1dw3QXHjxi0rS/C4pVaP645f7kGbhewdO3Bwrq5HL24\nhv5BhtsFW6xexFzLtkcp58zsK8AHgRnA7QTjoB4kGDe1DbjC3Q+E0xLcAAwAd7n7fWZWBtxPMFN4\nP3CVu7fk/SREIpTuhZUatC1DUuuHBm4XtkwvsNXs2tGLZXZtM/sQcKy7rwI+AnwduA34lrufCrwF\nXG1mFcAXgdOB04AbzawGuAzodPdTgC8TBFoiBUUvrJTRqH4UF13v+MTVo/Qz4JXw505gDnAqcG24\n7nHgc8AGYI279wKY2YsEvVBnAA+EaZ8F7s1PsUXyRy+slNEM1Y/tHX001FaofhQ4tQfxiSVQcvcE\nsCdc/CvgCeBsdz8QrtsBNAL1QHvSru2p6909YWaDZlbm7v1McwMDA7S0bMy4fenSw5kxY8aE9h1r\nf4lP8sDcxtoKloVjTNSlLpB+IO9Q/fjQiUtob++Ju4iSI5mutdqD+MQ2RgnAzM4HrgbOAt5M2lRC\nMPN36mjETOtLw/WjqqurmnBZk82eXQa7J75/bW1lxvJs2LCBG776GBXVB8/u3de9gwf/52UcffTR\nI9YP5TPavqPtn5pPLuQyryhNlXN++fVtIwZqfuHKlbz/+MbYyjOV88mHqMo60XzHqh9Trbxx5Ru1\n8ZZ7IunH2xbko0zTOX0uxDmY+2zg8wQ9ST1m1mtm5e6+D2gCtgJbgHOTdmsieN/cFqABeD0c2I27\nD4x1zFz81VVXV8WePZPruOro6M1Yno6OXiqqF1I5rynjvsn71dVVDS+PtW+6/dPlM1m5yisfvxBx\nn/PQX4+vv7VrxPo/tHZyZMPExyDk8hpMpXyG8opaFD00E/kMsqkfufxsk03HfKM2nnKP9zzr6qpo\na+vmtxt2jFg/WlswkWMUW/pciGsw91zgK8DH3b07XP0scFH480XAU8Aa4EQzm2tmlcAq4AXgGeCS\nMO15wPP5KrtIrgy9duKOH77GvgMj43wN1BTVj+KzxtvZvefAiHW61vGLq0fpk8B84N/MbOh22l8A\n3zOza4FNwAPuPmBmtwBPA4PArWHv08PAmWb2ArAXuDKOkxCZjDc2d7Gjcy/vO7aeWWWlnHbCoSQS\n0FQ3RwM1hTdaVT+KzbaOPmaWlXL+6iPo6dvPwnmzmVkGT63ZPGK8kuRXXIO57wbuTrPprDRpHwEe\nSVk3SDC2SWTa2ty+m5/8/K3h5dUrglumDbUVagyF1vZe1Y8iM3fOLB5/4e3h5cvONl76/Y7hl97e\ndOkKDeaOQayDuUWKTfITLe/s2T9iW8UhwesH1FtQ3IbqSFfvwfXjPYfXaublApLcHhy1ZB49u0de\n8x0dfezZ9+6Y2M1tvQqUYqBASSRPEokEr7yxg5btPcydM4v62pHvZKqaPYvGBVXqLShi/f2DvLi2\njS3tvSyqm8OcQ8rYvTf4omycX8Exi/UlWUg2/LGLlrYeunr2MWNr90FtwsBggtlJLzvWeKV4KFAS\nyZN1rV3c9ZO1w8unnXAoV3zkGNp29VE/v4KmBbM5aXkDu3b1jpKLFLIX17Xx/SfXDy9fcc4xbN21\nm8ULK1l1XH2MJZMobO3Yw78/94fh5UtOP4orP7aMXd17mTtnFk0LgsCpYV6FJpmMkQIlkQgld63P\nnDljRA9B754DbNvVx2WnHzmcvrRUvUnFJrmOJEoYUUe27tzNe49aoNstBST5epNyvdu79vDO7hl8\n8rQjRuyjnsR4KVDKs8TgIK2tm6itrRyeTylZa+umGEolUUl94/fqFU3DAzNnl5dxaN2cuIomU8Ro\ndaSpTr0IhWa06z2/+hBq55bHVTTJQIFSnu3paeeOh3dS8dS2tNt3/XE98w9dludSSVRS3/hdPWcW\nH3n/Uipnz6S6ciYnHZt+FnUpHql1ZM4hMznjfYtpqqvkg++p15i1ApN6vStnz+TMlUtYOG82NZWz\nWHHU/JhKJpkoUIrBaLNn93W35bk0EqXUN34fvbhGt1FkhNQ6cuxSvc+rkKVe72Xh+9uimrFcJk+B\nkkiODQ4O8oq307q9l6WNVfzd5Sto2aY3fsu7VEeKi6739KZASSSHEokEL65t4/4n3n1y6Zrzl3PO\nysUxlkqmEtWR4qLrPf3F8q43kUK1rrWLlm0ju89bt+txf3mX6khx0fWe/qZtj5KZfQ04meAdcJ9x\n91/FXCQpYgODCdZu6uT3GztYlPIk25IMb/6W4qI6Ulx0vQvHtAyUzGw1cKS7rzKzY4B7gVUxF0uK\n2Jq124cf+Z1zSBmXnWVs3bmbpY1VnLSsLubSyVSgOlJcdL0Lx3S99XYG8GMAd38DqDEzhegSm03b\nuod/3r23n13deznB6jjl+AZKp+2vmeSS6khx0fUuHNOyRwloAJJvte0M1/0hffLCMDRZZbLOzncn\nrtRklfFZ2lg9Yvm4w2v1iLeMoDpSXHS9C8d0DZRSZ2ArARJj7VRXV5WTg8+eXQa7c5LVuAxPVlk9\n8ckqa2srM34Oufp8cp1XlHJVzvnzK/nClSvZtK2b5sZqTlreMOHXkeSqTIWaTz5EUdZc1pFUUX22\n0y3fqI2n3BO53hP5XMa7T7Glz4XpGihtIehBGrII2D7WTrmYzKuuroo9e/onnc9ETXayyo6O3rSf\nQy4nO8tVXvn4hcjlOR/ZUMmR4SDNib7YNpefXSHmM5RX1KKY+C9XdSRdvlGVd7rlG7XxlHu813si\nn8t49ynG9LkwXW+UPg1cDGBmK4At7h5DH4+IiIgUsmkZKLn7y8CvzewXwDeA62MukoiIiBSg6Xrr\nDXf/QtxlEBERkcI2LXuURERERPJBgZKIiIhIBgqURERERDJQoCQiIiKSwbQdzC3jl25m7yE7d86m\no2M3M2Zkjp2XLj2cGTNmpN02MDBAS8tGYORs4dnsKyIiMlUpUCoio83sveuP65ldNZ+K6oVp9+3r\n3sE3bj6PI444Ku32lpaN3PDVx9LuP9a+IiIiU5UCpSKTaWbvvu62UWf9nkzeIiIi05XGKImIiIhk\noEBJREREJAMFSiIiIiIZ5H2MkpnNAL4HHB4e/3Pu/pKZvQf4DjAI/M7drw/T30zwAtxB4DZ3f9LM\n5gIPAdVAD3CZu3fl+1xERESksMXRo3QF0Ovuq4G/Av45XP914NPufgpQY2Znm9lS4BPAKuBc4Gtm\nVgJ8Bng+TPsocEuez0FERESKQBxPvT1I0BsE0A7UmtlM4DB3/024/nHgTGAR8KS7DwA7zawFWA6c\nAVyVlPY/8lN0ERERKSZ5D5TCoGcgXPwM8ANgAdCRlGwH0AjsJAimUtfXJ63fATREWORx6+vekXHb\nnp4OoGRC2yez72Tz7uvekXGySoDW1k0Zz3u0z0NERGQqK0kkEpFlbmZ/SXB7LUHwLZwAvuTuz5jZ\n9cDHCG6p1QOPu/sJ4X5DPUZrCW7TfTNc/yDwAPAvwInu3hOOeWpx98WRnYiIiIgUpUh7lNz9ewQD\nt0cIA6iPAee7+4CZ7SDoVRrSBGwFtgDHZFjfQDCQuwk4eKppERERkUnK+2BuMzscuBa40N0PALh7\nP7DezFaFyS4EngKeBz5qZmVmtghY5O7rgGcIBnkDXBSmFREREcmpOAZz/yVQC/xn+ARbAjgL+Czw\n3XDdK+7+HICZ3Q28QDA9wHVhHncC/2pmPwc6gU/l9xRERESkGEQ6RklERERkOtPM3CIiIiIZKFAS\nERERyUCBkoiIiEgGCpREREREMlCgJCIiIpKBAiURERGRDBQoiYiIiGSgQElEREQkAwVKIiIiIhko\nUBIRERHJQIGSiIiISAaRvxTXzI4Dfgx8zd2/bWaHAg8SBGnbgCvc/YCZXQ7cAAwAd7n7fWZWBtwP\nNAP9wFXu3mJm7wG+Q/Ci3N+5+/VRn4eIiIgUn0h7lMysArgTeDZp9W3AN939VOAt4Oow3ReB04HT\ngBvNrAa4DOh091OALwO3h3l8Hfh0uL7GzM6O8jxERESkOEV9620v8BGCnqMhHwIeD39+HDgTOAlY\n4+697r4XeBH4IHAG8GiY9llglZnNBA5z998k5fHhKE9CREREilOkgZK7D7r7vpTVc9z9QPjzDqAR\nqAfak9K0p6539wSQABqAjqS0Q3mIiIiI5FTkY5TSSCT9XBIul6SkGW09KeuH0o5+0EQiUVKSmp1M\ncZFesHzXiQ0bNnDF5x+ionph2u193Tt48H9extFHH523Mk1TBVUvJGdULyRVTi5YHIFSr5mVhz1N\nTcBWYAtwblKaJuDlcH0D8Ho4sLskTD8/JW3yrb20SkpKaG/vmXTh6+qqlE+e8qqrq8pBaTLLVZ2A\n7M65o6OXiuqFVM5rGjXdVLqeUy2fobyilMt6kSyXn4HyTZ9vlMZbL8Z7nhP5XKI+RiGkz4U4pgd4\nFrgo/Pki4ClgDXCimc01s0pgFfAC8AxwSZj2POB5dx8A1pvZqnD9hWEeIiIiIjkVaY+Smf0pcAfB\n4/0HzOxi4HLgATO7FtgEPODuA2Z2C/A0wSP/t7p7j5k9DJxpZi8QDAy/Msz6s8B3zawEeMXdn4vy\nPERERKQ4RRoohU+mnZZm01lp0j4CPJKybhC4Ok3a9cDqHBVTREREJC3NzC0iIiKSQRyDuaWIJBIJ\n1rV2sbmtlyX1lSxrrqEk2odTRKQAqO2QdOKoFwqUJFLrWru444evDS/fdOkKljfPi7FEIjIdqO2Q\ndOKoF7r1JpHa3NY76rKISDpqOySdOOqFAiWJ1JL6yhHLi1OWRUTSUdsh6cRRL3TrTSK1rLmGmy5d\nwea2XhbXV3Jsc03cRRKRaUBth6QTR71QoCSRKqGE5c3zNLZARMZFbYekE0e90K03ERERkQwUKImI\niIhkoEBJREREJINYxiiZ2Rzg+0AtMBO4DdgOfIfgXW+/c/frw7Q3AxeH629z9yfNbC7wEFAN9ACX\nuXtX3k9EREREClpcPUpXAm+4+2kEQdA3gH8GPu3upwA1Zna2mS0FPgGsAs4Fvha+CPczwPNh2keB\nW/J/CiJqEYPdAAAgAElEQVQiIlLo4gqUdgLzw5/nA7uAw8KX6AI8DpxJ8ELdJ919wN13Ai3AcuAM\nggBpKO2H81RuERERKSKxBEru/jDQbGZvAv8F3Ax0JiXZATQC9UD7GOt3AA0RF1lERESKUFxjlC4H\nNrn7R8zseODfCcYaDSkBEuH/yUrTrB9KO6a6uqoJl1n5xJdXlPJ5zp2d2c0gO9Wu51TLJx+iKqvy\njTbfqI233FGnz8cxpnv6XIhrwskPAD8FcPfXzawSqEja3gRsBbYAx2RY30AQXDUB27I5aHt7z9iJ\nxlBXV6V88pRXPn4h8nnOHR3ZvZNoKl3PqZbPUF5Ry1VZk+XyM1C+6fON2njKPd7znMjnEvUxCiF9\nLsQ1RukPwMkAZtZMEPD83sw+EG6/EHgKeB74qJmVmdkiYJG7rwOeIRjkDXBRmFZEREQkp+LqUfou\ncK+Z/RcwA7iWYHqAu8Kn2l5x9+cAzOxu4AWC6QGuC/e/E/hXM/s5wdimT+W3+CIiIlIMYgmU3H03\n8Mk0m1anSfsvwL+k2f+CaEonIiIiEtDM3CIiIiIZKFASERERyUCBkoiIiEgGCpREREREMojrqTeZ\nJhKJBOtau9jc1suS+kqWNddQctA8oCIiAbUZxWtgMMHaTZ0Fd+0VKMmo1rV2cccPXxtevunSFSxv\nnhdjiURkKlObUbzWrN1ekNdet95kVJvbekddFhFJpjajeG3a1j1iuVCuvQIlGdWS+pHvJ1tcn937\nykSkOKnNKF5LG6tHLBfKtdetNxnVsuYabrp0BZvbellcX8mxzTVxF0lEpjC1GcVr5fKGgrz2CpRk\nVCWUsLx5XkHcZxaR6KnNKF6lpYV57WMLlMzscuBm4ADwReD3wIMEtwO3AVe4+4Ew3Q3AAHCXu99n\nZmXA/UAz0A9c5e4teT8JERERKWixjFEys1rgH4BVwMcJ3tt2G/BNdz8VeAu42swqCIKo04HTgBvN\nrAa4DOh091OALwO35/8sREREpNDF1aP0YeAZd+8D+oBrzWwjcG24/XHgc8AGYI279wKY2YvAB4Ez\ngAfCtM8C9+ax7CIiIlIk4nrqbSkwx8x+YmY/M7PTgQp3PxBu3wE0AvVAe9J+7anr3T0BDIa340RE\nRERyJq7gogSoJbjlthR4HkikbE+E/6ful259acr+adXVVU2stAWWz8BggjVrt7NpWzdLG6tZubwh\np+XJdV5Ryuc5d3Zm96jsdK9fUeeTD1GVdbrnm67tKC0d/8zL06kuJBtvuaNOn49jjLcOTMXPaLLi\nCpTagJfcfRDYaGY9wCFmVu7u+4AmYCuwBTg3ab8m4OVwfQPw+lBPkrsPjHXQ9vaeSRe8rq5q2uUz\n9EqBDZu7mDunnKqKMv7Xo78f3n7TpSv40IlLclKebMuUbT5Ry+c5d3RkN/nadKtf+cxnKK+o5aqs\nyXL5GeQz38HBQV7xdlq399JYN4f/8+wGdu/tByY283KU5Y3aeMo93vOcyOcS9TGS0yd/j7yzez+/\nWt/G7r39XHP+ck5etpASSvJanmzT50JcgdLTwH1m9hVgPlAJPAVcDPwAuChcXgPcY2ZzgUGCwd83\nANXAJcAzwHkEPVKSQeorBc5ffcSI7YUye6qI5N4r3s7dP1k7vLx6RRM/f20LELQdhfYouKSX+j0y\nVA9+++ZO5lbMKuh6EMsYJXffCvwI+CXwH8D1wJeAvzCznwHzgAfcfS9wC0Fg9TRwq7v3AA8DZWb2\nAvA3wOfzfxbTR2og1NO3f8RyocyeKiK517p9ZPuxZ1//8M9qO4pH6vfIUD2YXV5W8H9sxzYA2t3v\nBu5OWX1WmnSPAI+krBsEro6udIUl9ZUCiUSCa85fTnfP/oKaPVVEcm9Jw8jbF8sPq+WwhrlqO4pM\n6vfIogWVrF5Rxq/Xt3HdBcfHVKr80JNiRWDolQLBGKVZNC2owBbXUHLQmHgRkZFOWrYAWE7r9l6W\nNFRy0rI6SvWa0KKT+mqaGaXQsq2U6y44vuAD5jEDJTObB/w90ODunzKzc4Ffunv7GLvKFKFXCojI\nRJVSyvuX1fP+ZfVxF0VilO575JjFxfGdks2fBfcArcBh4XI57072KCIiIlKwsgmU6tz9TmA/gLv/\nCKiItFQyKYlEgrWbOnlqzWbWbeokMfYUUyIiI9qOX76+TW1HEdD3xdiyGqNkZjMJJ3Q0s3pgTpSF\nkvEbmuNic1sv1VWzRjzOO5G5TkSkOKjtKG6pj/3fdOkKjl1Sw7rWLra/toXG2gqWNRf3mNZsAqVv\nAa8CjWb2GLCSYC4jmUKSK/v7jh05lkBznYhIJmo7ilvqo/1Dy6nBUzHXgzFvvbn7vwEfB/6WYLzS\nCnd/OOqCyfgkV/aK8pHxr+Y6EZFM1HYUt9TH/hfXV2YMnopVxh4lM0s3T1EV8BEzw93vja5YMl5L\nGypZvaKJPfv6mVVWyl+fv5wuzZMkIqNIJBJUV83ifcfWU1FextqNO4fnWDtyyTyOaNAoi0KX+tj/\nsc01zChh+PukoryMpY3FHTCPduvtlFG2JQAFSlPIQILh1wpA0FV6sh7nFZFRrGvtGjEmaTLv7ZLp\nKd1j/6nfJyceszCOok0ZGQMld78q0zYz+3+iKY5MVLqu0mK+pywiY0ttN7p79hf1oF0J6PtkpGwm\nnHwv8AVgQbiqHFgM3DmZA5vZIcBa4B+B54AHCcZMbQOucPcDZnY5wcDxAeAud7/PzMqA+4FmoB+4\nyt1bJlOW6ST5CZUl9ZWcMj/oEk13n1lEJFlq+3FYo9qNYpZaH4aebtP3yUjZPPX2bYKg6BaCGbov\nIQicJuuLwM7w59uAb7r7I2b2T8DVZvZgmOZEgoDoVTN7FDgP6AxnCT8TuB34sxyUZ1pIfZRzVvlM\njmyoTHufWUQkWbpHwdVuFK909WF587zh75PtHX001FYUfb3IZsLJPnf/30CXuz9B8DLamydzUDMz\n4BjgCaAEOBV4PNz8OHAmcBKwxt173X0v8CLwQeAM4NEw7bPAByZTlukmtUt007Zu4N37zOesXMzy\n5nnqPheRg2S6paJ2ozhlerpt6Pvkz846RvWC7AKlQ8zsOGCvmZ0KzAeWTvK4dwA3wvCnP8fdD4Q/\n7wAagXog+X1y7anr3T0BDIa344pCapdoc2N1TCURkelGt1QkmepDdrIJMP47cATwJYJxRAuBr0z0\ngGZ2BfCSu28KOpYARsyZXhIup4awmdaXpuxf0FJvsZ20vIFdu4p7jgsRyY5u0Usy1YfsjBkoufsv\nkhaPzsExPwYcZmbnAk0E75DbbWbl7r4vXLcV2AKcm7RfE/ByuL4BeH2oJ8ndB7I5cF1dVQ6KH38+\nC+vm5iSfVLnKJ9d5RSmf59zZmd1fa1Ptek61fPIhqrJOhXxT249c5Tse06kuJBtvuaNOn4tjjFUf\npto5x1F3snnq7cPA3wA1JPXmuPvpEzmguw8PvDazfwBagFXAxcAPgIuAp4A1wD1mNhcYDNPcAFQT\nDCh/hmBg9/PZHjsXc4Lkam6RbPLJ9ERCXOXJd175+IXI5zl3dGTX8zeVrudUy2cor6hFMX9QVPMS\nZco3m/ZjIvlOVpT5Rm085R7veU7kc0ndZ6xrHnWZpmL6XMjm1tt3gP8X+GNOjjjS0BX8EvCgmf01\nsAl4wN0HzOwW4GmCQOlWd+8xs4eBM83sBWAvcGUE5ZoSUp9IuPxs0wsKRSQrqe1H8mSSUpjSXfPu\nnv3DQZNMTDaB0gZ3fyCKg7v7PyYtnpVm+yPAIynrBgmevCt4qU8kbNjcxQ9+6kX/gkIRGVtq+/Hb\nN3cyt2KW2o4Clu6av7quDQge/R/PbVd5VzaB0t1mdg/wEsF8RgC4+/cjK5UABz+RMDt8YWWxz5Iq\nImNL136o7Shsmb4zQC+2nYxsAqUvALsJZuQekgAUKEUk+T7zNecfx67uPnZ27+PX64O/DPQIp4ik\nkzpG5boLjuPX3s7s8jJ+vb6N6y44Pu4iSo6lXvO/u3wFLdt6qa6axUM/9eF0+t6YuGwCpf3uflrk\nJREgqPS/fGMHv31zJxXlZTzx0ttcd8HxHNYIDfMq9AiniKSVqe1Y/SeL2NzWy3UXHK+2owC9sbmL\nV9/YwZ59/bR19nHSsQs5Z+ViEiSYWzFLj/7nQDaB0mNmdhrwC0beehuMrFRFLPVt3qtXNLG5rXd4\n5lwRkXTUdhSnrbv6+PlrW4aXD11YyTGL5w3Prq1rP3nZBEpfBOaEPw9N+JgAZkRVqGKVSCTYsLlr\nxLo9+/rVZTpN7N69mz179mTc3ts7uTECAwMDtLRsHDXN0qWHM2OGfjWLjdqO4vXO7v2jLsvkZTPh\n5PScGWwaWtfadVAlf+9RC9RlOk3cfue9/KGjPOP2ku43YN6KCeff0rKRG776GBXVC9Nu7+vewTdu\nPo8jjjhqwseQ6UltR/FqXDBn5PL8iphKUriymXByHsGA7gZ3vyKcUfuX7t4+xq4yTpvbevnV+jZW\nr2hiz75+jl5co3lPppHyirnMLlmcOUF/G5N97qSieiGV85ommYsUGrUdxat39/7h6z67vIzevgNj\n7yTjks2tt3uAnxHMjA3B028PAB+NqlDFJPmJheqqoDdi6H7z6j9ZpIZORNIaaju2v7ZFbUcRSDfr\nNsCiBXN46JkNw+luunTivdaSXjaBUp2732lmFwC4+4/M7G8jLlfRyDSTqp5SEJHRqO0oLqnXe2gC\nSb3YNnrZBEqY2UyCAdyYWT3vDu6WSUqdBKy7Zz/nrBzl9o2ICGo7ik3q9R5a1tNt0csYKJnZInff\nCtwNvAo0mtljwErgM5M9sJl9BfggwdNzt4fHeBAoBbYBV7j7ATO7nOBluAPAXe5+n5mVAfcDzQRT\nFlzl7i2TLVMcUmdS1VMqIpINtR3FRdc7PqP1KD1mZh8geK/axwjGKO0F/huwdTIHNbMPAce6+yoz\nqwVeA/4v8C13/3cz+yfgajN7kGB6ghMJAqJXzexR4Dyg090/ZWZnEgRafzaZMsVF3aYiMhFDbcf2\njj4aaivUdhQ4fVfEZ7RAaSPBq0tKgVYYMTJwsvMo/Qx4Jfy5k+BW3qnAteG6x4HPARuANe7eC2Bm\nLxL0Qp1BMKAc4Fng3kmUJVbqNhWRiRhqOz504hLa23viLo5ETN8V8ckYKLn7JwDM7G53vyaXB3X3\nBDA0M99fAU8AZ7v70HONO4BGoB5InoagPXW9uyfMbNDMyty9nyks+amFo5bM4/CGOXoyRUTGlO6J\nJ7UdhUnXeurJZsLJnAZJyczsfIJbe2cBbyZtGpr9O7V2ZFpfGq6fsobew5T8ioGbLl2hvw5EZFRq\nO4qHrvXUlNVTb1Ews7OBzxP0JPWYWa+Zlbv7PqCJYBzUFuDcpN2agJfD9Q3A6+HAbtx9YKxj1tXl\nZpLx8eQzMJjg1bXbaW1756CnFrZ39PGhE5fktTz5yCfXeUUpl+UsP6Ts3X7SNGbOzO5udaYydXaO\nPXiztrZyeP+pVi+mS52A6MoaVdsxFco7FfKN2njLPd70G9t289aWd0as+8OWd9je0cfSxmpWLm+g\ntHRkP0HUZZru6XMhlkDJzOYCXwHOcPfucPWzwEXAQ+H/TwFrgHvC9IMEA8pvAKqBS4BnCAZ2P5/N\ncXNxH7+urirrfBKJBK+8sYPWtl727OtnxozSEdsbaismXabxlCcf+eQyr3z8QuTynPftHf3O74ED\nAzBr4mXq6Bh7Xu+Ojl7a23umXL3Idf2KWhRjfsb7GWz4Yydbdu7hjdZOltSPPOfktiOXn22y6Zhv\n1MZT7vGeZ11dFX9sf4d5VSNfg/TO7n385OdvAQf3Lk3kGMWWPhfi6lH6JDAf+DczG7qd9hfA98zs\nWmAT8IC7D5jZLcDTBIHSrWHv08PAmWb2AsGTeFfGcRJjWdfaxV1JXagfft9iVq9oorSkBGuep6cW\nRCSjLbv28OBTbwCwbuMuLjrtSHZ17+WoxdVqOwrU3n0DPPVyy4hX0bR19A1v39zWq9twMYglUHL3\nuwnmZ0p1Vpq0jwCPpKwbJBjbNKUdNCHc7v28uq6Na85fzkdXHcauXZN985eIFKqtO3cP/7x7bz+t\nbT2896gFeodbAevevZ/de/uHX0Uzr6qc7qSXHWvupHjENkapkA0MDPKLdW0kUtqyRQsqufJjtZy8\nbOFB95lFRIbajj+276apbuQLEJYtrVWQVGAGBwdZ4+20tvVSXVlO4/yR17x6TjnNDVUc1jBXcyfF\nSIFSBH7pO9i49R327x/gotOOZP+BAWYfUkZtVTkn2gI1dCKS1lDbsWdfP4ODCa762DI2t+/m0Lo5\nfOD4erUdBeZXb+7kjdYu9uzrZ8++fuYcUsaff3QZ23fupn5+BU0LZnNUk6YHiJsCpQi803tguOuU\ntXDR6UfCIKy0hfEWTESmtBFtB0HbUVtZzurjG2MslUSl4519I673+auPoG1XH392+pExlkpSlY6d\nRMard8+BEcs9u/fr3rKIjEltR3E56Hr37WdJg673VKMepRxJnk310IWVzDmkjN3h4+JLG6t0b1mm\nvIGBAVpaNo5Y19lZOWJagqVLD2fGjMm8vUhSqe0oLsnXu6lu5PVubqjkpGV1MZdQUilQypF1rV3c\n8cPXhpevOX853T37hwfg6R6zTHUtLRu54auPUVGd/hZxX/cOvnHzeRxxxFF5LllhU9tRXDJd7yOX\nzOMIvdZqSlKglCMHTQXQs59zVi6OqTQiE1NRvZDKeU1xF6OoqO0oLpmud1QTccrkKVCahMHBQV7x\ndlq399JYN2dEF6rGFYhIJmo7iouu9/SmQGmCEokEL65t4/4n1g+vu/Jjy+jb06/5LkQkI7UdxUXX\ne/pToDRB61q7aNk2spt0284+PnnaETGVSESmA7UdxUXXe/qbtoGSmX0NOJngHXCfcfdf5fP4m9t6\nmV99yIh1eqxTRMaitqO46HpPf9MyUDKz1cCR7r7KzI4B7gVW5ePYA4MJ1m7qZM/+fg70D3LJ6UfR\n3rWHpY1VeqxTRDJS21FcdL0Lx7QMlIAzgB8DuPsbZlZjZpXuHvlbZtes3T7i0c7LzzZOsDo9xisi\no1LbUVx0vQvHdJ2ZuwFoT1reGa6L3KZt3SOWDxwYZHnzPFV8ERmV2o7ioutdOKZrj1JqTSsBEvk4\n8NLG6hHLerRTporE4CCtrZuAg2fUhmDmbShhxoz0fx8N7SvRUNtRXHS9C8d0DZS2MLIHaRGwfayd\n6uqqJn3g+fMr+cKVK9m0rZvmxmpOWt5AaenE/kLIRXmmYj65zitKuSxn+SFlsCfz9pkzs3v1R6Yy\ndXaO3tDu6Wnnjod3UlG9Le32XX9cz+yq+Rln3t71x/XMP3TZqMeora2c8Gc2XeoERFPWXLYdqaL6\nbKdbvlEbT7kncr0n8rmMd59iS58L0zVQehq4FbjbzFYAW9x991g75WLW07q6Ko5sqOTI8KmFXbsm\nNiwqV7OwTrV8cplXPn4hcnnO+8IJ5DI5cGAAZk28TKk9ROmMNrN2X3fbmNvH0tHRO6HPLNf1K2pR\nzJCcq7YjXb5RlXe65Ru18ZR7vNd7Ip/LePcpxvS5MC3HKLn7y8CvzewXwDeA62MukoiIiBSg6dqj\nhLt/Ie4yiIiISGGblj1KIiIiIvmgQElEREQkAwVKIiIiIhkoUBIRERHJYNoO5hYpNInBQd5+++2M\n0wDEPSFk8oSWo1m69HBmzEg/Z9TAwAAtLRsnvL+ISL4pUBKZIvb0tPMPd+2c1ISQURprQkuAvu4d\nfOPm8zjiiKPSbm9p2cgNX30s4zmOtb+ISL4pUBKZQiY7IWTURitfPvMQEckXjVESERERyUCBkoiI\niEgGCpREREREMsj7GCUzmwF8Dzg8PP7n3P0lM3sP8B1gEPidu18fpr8ZuDhcf5u7P2lmc4GHgGqg\nB7jM3bvyfS4iIiJS2OLoUboC6HX31cBfAf8crv868Gl3PwWoMbOzzWwp8AlgFXAu8DUzKwE+Azwf\npn0UuCXP5yAiIiJFII6n3h4k6A0CaAdqzWwmcJi7/yZc/zhwJrAIeNLdB4CdZtYCLAfOAK5KSvsf\n+Sm6iIiIFJO8B0ph0DMQLn4G+AGwAOhISrYDaAR2EgRTqevrk9bvABoiLLKIiIgUqUgDJTP7S4Lb\nawmgJPz/S+7+jJldD6wguKVWn7JrSdI+yUrTrB9KKxKrfX1d7NvRkXF7oncnfTMqMm7f09PBwVV+\n+myHYMLIdLN3d3ZW0tHRS2vrJvq6d4y6v4jIVFKSSOQ/xggDqIuA8939gJmVAW+5e3O4/c+B44Df\nA8e4+xfC9c8Bfwt8C7jW3d80syXAj9x9Zd5PRERERApa3gdzm9nhwLXAhe5+AMDd+4H1ZrYqTHYh\n8BTwPPBRMyszs0XAIndfBzxDMMgbgoDrqXyeg4iIiBSHOAZz/yVQC/xn+ARbAjgL+Czw3XDdK+7+\nHICZ3Q28QDA9wHVhHncC/2pmPwc6gU/l9xRERESkGMRy601ERERkOtDM3CIiIiIZKFASERERyUCB\nkoiIiEgGCpREREREMlCgJCIiIpKBAiURERGRDBQoiYiIiGSgQElEREQkAwVKIiIiIhkoUBIRERHJ\nQIGSiIiISAaRvxTXzL4CfBCYAdwOvAo8SBCkbQOucPcDZnY5cAMwANzl7veZWRlwP9AM9ANXuXuL\nmb0H+A7Bi3J/5+7XR30eIiIiUnwi7VEysw8Bx7r7KuAjwNeB24BvufupwFvA1WZWAXwROB04DbjR\nzGqAy4BOdz8F+DJBoEWYz6fD9TVmdnaU5yEiIiLFKepbbz8DLgl/7gTmAKcCj4XrHgfOBE4C1rh7\nr7vvBV4k6IU6A3g0TPsssMrMZgKHuftvkvL4cMTnISIiIkUo0kDJ3RPuvidc/CvgCWCOux8I1+0A\nGoF6oD1p1/bU9e6eABJAA9CRlHYoDxEREZGcinyMEoCZnQ9cDZwFvJm0qYQg+ClJ2WW09aSsH0or\nIiIiklP5GMx9NvB54Gx37zGzXjMrd/d9QBOwFdgCnJu0WxPwcri+AXg9HNhdEqafn5J221jlSCQS\niZKS1LhLprhIL5jqxLSleiHpqF5IqpxcsEgDJTObC3wFOMPdu8PVzwIXAQ+F/z8FrAHuCdMPAqsI\nnoCrJhjj9AxwHvC8uw+Y2XozW+XuLwEXAneOVZaSkhLa23smfU51dVXKJ0951dVV5aA0meWqTsDU\nuw6Fms9QXlHKZb1IlsvPQPmmzzdK460X4z3PiXwuUR+jENLnQtQ9Sp8k6P35NzMbukX2F8D3zOxa\nYBPwQBj83AI8TRAo3Rr2Pj0MnGlmLwB7gSvDfD8LfDfM8xV3fy7i8xAREZEiFGmg5O53A3en2XRW\nmrSPAI+krBskGNuUmnY9sDpHxRQRERFJSzNzi4iIiGSgQElEREQkAwVKIiIiIhkoUBIRERHJIC8T\nTkrxSiQSrGvtYnNbL0vqK1nWXENJtNOdyDRV7HVlYGCAlpaNo6ZZuvRwZsyYkacSiUw9cbQTCpQk\nUutau7jjh68NL9906QqWN8+LsUQyVRV7XWlp2cgNX32MiuqFabf3de/gGzefxxFHHJXnkolMHXG0\nEwqUJFKb23oPWi6mLz/JnuoKVFQvpHJeU9zFEJmy4mgnNEZJIrWkvnLE8uKUZZEhqisiMpY42gn1\nKEmkljXXcNOlK9jc1svi+kqOba6Ju0gyRamuiMhY4mgnFChJpEooYXnzvKK7hSLjp7oiImOJo53Q\nrTcRERGRDBQoiYiIiGSgQElEREQkAwVKIiIiIhlEPpjbzI4Dfgx8zd2/bWb3AScAO8MkX3X3J83s\ncuAGYAC4y93vM7My4H6gGegHrnL3FjN7D/AdYBD4nbtfH/V5iIiISPGJtEfJzCqAO4FnUzbd4u6n\nh/+eDNN9ETgdOA240cxqgMuATnc/BfgycHu4/9eBT4fra8zs7CjPQ0RERIpT1Lfe9gIfAbaNke4k\nYI2797r7XuBF4IPAGcCjYZpngVVmNhM4zN1/E65/HPhwzksuIiIiRS/SW2/uPgjsM7PUTX9rZjcB\nbcCngQagPWl7O9AI1A+td/eEmSXCtB1JaXeEaUVERERyKo7B3N8nuPV2BvBb4FY46NW/JUAiw3pS\n1g+lFREREcmpvM/M7e7PJy0+Dnwb+D/Ax5PWNwEvA1sIepBeDwd2lwBbgfkpace6tQdAXV3VxAuu\nfGLLK0pT8ZyVT/yiKuto+XZ2jv3OqtrayrR5xFHeqZhv1MZb7qjT5+MY0z19LuQ9UDKzHwE3u/vb\nwIeA3wNrgHvMbC7Bk2yrCJ6AqwYuAZ4BzgOed/cBM1tvZqvc/SXgQoIB42Nqb++ZdPnr6qqUT57y\nyscvxFQ8Z+Uzdl5Ry1VZk431GXR09GbclpwmNY9cfrbTPd+ojafc4z3PiXwuUR+jENLnQqSBkpn9\nKXAHweP9B8zsYuCbwMNmthvoJXjkf6+Z3QI8TRAo3eruPWb2MHCmmb1AMDD8yjDrzwLfNbMS4BV3\nfy7K8xAREZHiFPVg7t8QPO6f6tE0aR8BHklZNwhcnSbtemB1joopIiIiklbeb73J9JJIJFjX2sXm\ntl6W1FeyrLmGkoPG2EuxUb0QkVQDgwnWbuosuHZBgZKMal1rF3f88LXh5ZsuXcHy5nkxlkimAtUL\nEUm1Zu32gmwX9K43GdXmtt5Rl6U4qV6ISKpN27pHLBdKu6BASUa1pH7kI8uL68d+hFkKn+qFiKRa\n2lg9YrlQ2gXdepNRLWuu4aZLV7C5rZfF9ZUc21wTd5FkClC9EJFUK5c3FGS7oEBJRlVCCcub5xXE\nfWbJHdULEUlVWlqY7YJuvYmIiIhkkHWPkpn9CVBL0nvWNNGjiIiIFLKsAiUz+3fgT4DNSasTgAIl\nERERKVjZ9igtdfcjIy2J5E26yQJFhiTXj6OWzOPwhjkFMWmciExeMU42m22g5GY2y933R1oayYt0\nk0KWdRsAACAASURBVAUurJsbY4lkKtFkkiKSSTG2D9kGSgPAOjNbA/QPrXT3P4+kVBIpTRYoo0lX\nPwq9IRSR7BRj+5BtoPRs+E+moaGu0g2bu5g7p5za6kNGbC+UScFk8gYHB6mYXcb7jq2noryMX61v\nU/0QkeHvkT37+zl1RRO/Wt/G7r39VFfNIkGioG+/ZRUoufsDZrYU+FOCQdy/dvfWKAsmuZPaVXra\nCYdyzfnL6e7ZX1CTgsnkveLt3P/E+uHlKz9+rOqHiBz0PXL+6iPo7NnLQz915lbMKuhepWyfersO\n+O/AqwRzL91hZv/o7g9kse9xwI+Br7n7t83sUODBMJ9twBXufsDMLgduILjNd5e732dmZcD9QDPB\nLb+r3L3FzN4DfAcYBH73/7d353FyVWX+xz+9ZOt09nS6Q5MFQnhIMqhhJ0AgAURFcZRFAVFwGZxx\n5gcOMsM444jMuIwIIy7jwogibugICioIyKowLMoIZnkAQxZC0tk6IZ3uLN1dvz/OrU51paqrurrW\nru/79corXbdOnTq36qlbp8499zzu/pFB7XWVSR4q7ejax46de3nTcTNK1CIpV2s39o+VjVt3Detf\niiKSneTvkVe3dPD08ra++4ZzRynbBScvAea5+wXufh5wJPDhTA8yswbgS/Q/bXcd8GV3PxX4M/D+\nqNwngKXAEuDvzWwicBHQ7u6nAJ8BPhfV8UXg76LtE83srCz3oyol5+UaM6pep1MkpZkt4/rdntWi\nSf4ikvp7JG64f59kO0ep2913x2+4+y4zy+YKuN3Am4FrEradBlwe/X038DHgBeApd+8AMLPfAicD\npwPxUasHgG+Z2QjgEHf/Q0IdZwC/znJfqk48L1eYozSS1qkN2AydTpEDHT9vKrCAtRs7mNnSyJtO\nmE17+65SN0tESiw5v2NdLbRMaqiK6RvZdpTWmdmXgfuj22cBGecouXsvsMfMEjePdfd90d+bgOlA\nM7A5oczm5O3uHjOzGNACbEsoG69D0lBeLslWLbWcOK+ZE+c1A1BfryxHIpL6e+SIGdXxnZJtR+mv\ngP8HXBbdfgL4co7PGUv4uya6nTwJYqDtJG2Pl5VINS4IJtlTfIhInI4HmQ3YUTKzGnePEU6hfT5P\nz9lhZqPcfQ/QCrwKrAfellCmldAZW08YQXo+mthdE5WfklR2QzZP3NQ0LnOhYVDPE89v6Hd1wscv\nPY4Tj8w86Jav9uS7rkIqx30udD2DjY9y269iKFRbB6q3vT3zPI/JkxtT1lGK9pZjvYU22HYXunw+\nniPT8aDc9rkUsZNpROk3hAnW3aQeCarL4TkfAM4FfhD9fy/wFPDfZjaecCXbIsIVcBOA8wmn/M4B\nHnL3HjNbYWaL3P1x4J2ECeMZbd68M4fm9tfUNK4s60n8VdC1t7tfmZfWtnNYy8AH4Xy1J591FeMD\nUY77XMh6YrEYz7+0ud+2geKj3PYrXleh5autiTK9Btu2ZV74ddu2jgPqyOdrW+n1Ftpg2j3Y/czl\ndcnHc7y0tv2A23Oax7J87XY2butk+uSGrEeZCr3PuZTPhwE7Su6+NPpzirv3ezXN7NBMlZvZUcAN\nhMv795nZecDFwK1mdjmwBrg16vxcA9xH6Chd6+47zex24Ewze4wwqnVpVPVHgW+YWQ3wpLtXfXLe\nleu28/TKTXTt6WZmc//gGO5XJMjAEjvRE8aNYtfu/h1pxYdI9Uq+mm1Gc2O/75NXNnVQW1s985FS\nyThHycxqgTvMbCn7R5JGAj8nLBOQVnRl2pIUd70xRdk7gDuStvUC709RdgWwOFPbq8mrWzt59Nn1\nACxftZVL3nwEe/b0VMUVCTKw5IXizjh2BosXttK1p5vDZ0xUfIhUseSr2ebPmsiDz77a930CcPC0\nRnWU0jGzC4FPAYcRFoKMixFOmUmZeG3X/tUadu3uZvvOPbzj5ENK2CIpF8kLxe3YtbdvobjFrz9I\nEzdFqliqq9kSv09S3a42mU69/RD4oZld6+7XJt5nZhMK2TAZHJsxkbsTbh+udZIkkjy0/oa5Uzmk\nZbxGG0UkJX2f9JdtrrdrzWw+MDXaNIowgXpeoRomg5Nq+FQEUseGRpFEJJ34MWPjtk5aJjdU/fdJ\ntrnevkhYZLIFeAmYA3yhgO2SNJLXvDhlShgt0KKSkqinN8ayNe19cTJ/1kTFhoj0k24Npfj3yWnH\nzCzIFYqVJtsFJ49z93lm9pC7LzGzo4F3FLJhklryxNyRo0ZkvPRfqs9Tyzb2i5OrLlyojpKI9JP8\nfaLjRGrZ5ieIz+QaFS1C+XvgpAK1SQaQPDF3zYYdJWqJlLPkuEiOGxGR5OOCjhOpZTui5Gb2N8Cj\nwP1m5kB1n7QskeSJubOma069HGh2UlxorSQRSZZqDSU5ULYdpQ8Dk4DtwLsJyWo/W6hGSX+J55EP\nmd7Yb2Lu8Qta2LpVvwKqVbo5BsctaNHkfpEqlurYkEwXAWUn0zpKS1Ns3hj9Oxx4pRCNkiAe6C+s\n285ru/byzIo2du3u5qoLF/Km42YAUFurq5eq2fK12/n6nc9z9LxmXt74Gjs693HCvCZqazW5X6Ta\nJK/C/4Nfr+xbif+qCxcyrWl8v/K6CCg7mUaUPjHAfTGg6lOHFFLyRLvFC1t59Nn1rGvrUGALEOYU\nHD2vuW8V3aeXtzG+4cADoogMf+m+M0Dzj4Yi04KTqdKPSJEkB3bXnvDLQOeRJW5mcyMvb3yt3zYd\nEEWqU7rvDND3xlBku47SY4QRpH7cXfnWCiA+fNq1t5tTF7b2nXI7fMZEFr/+IJ1HrnLJcw+Otml9\nKUlAB0SRapJ8um3s6Pq+021ahT8/sp3M/S8Jf48ElgL62VoAsViM/125if97cQsNo+p5ZkUbf3nq\nnL7VUbWicnVLjo9fPv4yH37HkZqQKVKlVq7bztMrN9G1p5uG9nouefMRbNuxR6vw51G2KUweSdp0\nv5n9qgDtqWrxL8Gbf76sb9viha3s29erOUmSNj7WtXXwpuNmKEZEqtCrWzv75iEBHDytse9iH8mP\nbE+9HZq0aQZguT6pmZ0K/AT4E1ADPAdcD9xGWARzA3CJu+8zs4uBK4Ae4Jvu/m0zqwe+A8wCuoHL\n3H11ru0pF8vXbuf/XtzSb1vXnm6dShFA8SEiB2rfuWfA2zJ02Z56+03C3zHgNeDaIT73w+5+QfyG\nmd0CfNnd7zCzTwPvN7PbCFfeHUPoED1tZncC5wDt7v4eMzsT+BxhfaeKtq6tg4ZR/d+SN8ydqlMp\nAig+RORAUyaM7n97/KgStWT4yvbU2yEFeO7kE6enAZdHf98NfAx4AXjK3TsAzOy3wMnA6cCtUdkH\ngFsK0L6im9ncyC8ff5nFC1vp2tPNG+ZO5YR503SOWQDFx3CwfOVKfnrv49TV1R1wX/vWTYS847np\n6elh9epVae+fPfvQlM8rle2gyWP6jgljRtUzfUpDqZs07GR76m0+cB0wnzCi9BzwSXd/YQjPPd/M\nfgZMjupucPd90X2bgOmEFcA3Jzxmc/J2d4+ZWa+Z1bt7NxUm+Qqmj5x7JKs3dGginhwQG0fMmsCH\n33Fkv0nbio/KsnrNOl7aOZ26EQf+6u/oyjb1Zpq6V6/iiuvvomHCtAPu69yxiZuuPoc5c+YO6Tmk\ndNKttH34jIl099J3XLAZGmHOt2xPvX0H+Drwz4SRoFOA7wIn5Pi8LwLXuvtPovlPDwEjEu6vIXTI\nkr8F0m2vJcXyBcmamsbl2NzC1fPE8xv6LRD28UuP45Kz55esPfmSz7oKqRz3OV5Pqtg47ZiZJWtP\nudRTDIVq6/jxY4CdOT9+8uTGlG1rahpHe3sjDROm0TipdVCPHUihXodKioVEhX79Biqf6ngwrWl8\n379StKkSyudDth2lXe6eeHprpZmdm+uTuvurhMncuPsqM9sIHGNmo9x9D9AKvAqsB96W8NBW4Ilo\newvwfDSxG3fvyfS8mzfnfoCKa2oal9d6Xlrb3m/7S2vbOawl+8m5+W5PPuSzTYVWjvscr2cosVFu\ncZHv+Cq0fLU1UVPTOF57rWtIdWzb1nFA2+Kv7bZtA6/YkuqxA8nne1asegutkK9fpvKpjgcnHjm9\npG2qhPL5kG1H6UEz+0vgPsLozVLgCTOrAWrcvXcwT2pmFwHT3f0GM2shnEr7NnAe8H3gXOBe4Cng\nv81sPNALLCJcATcBOB+4nzCx+6HBPH85UfZmSUexISJxOh6UTrYdpX8FUs0C/CThlNdgZwjeBfzA\nzN5OOOV2OfBH4Ltm9lfAGuBWd+8xs2sIHbRewum6nWZ2O3BmtGL4buDSQT5/SSSeY547cxKHtoxV\n9mYB9sfGxmfXM31yA/NmTVRsiFShVHORaqjR8aCEsr3qbUTmUtmLrmI7J8Vdb0xR9g7gjqRtvcD7\n89mmYkhOWHjVhQv7MjdrscDqptgQEUh/LKihRseDEsn2qrdG4KPAsYQRpCeAm9x9aCfcq0T8F8Lz\nf97ab/u6tg4FfZVTbIhIXG9vLyvW9J+LpGNB6WV7PerNwHjgG9HfLdH/kkE87cQNP3yWPfv6zzfX\nOWaJ/3pUbIjIk76ZXV37+m2bMG4k9z61juVr2ollvrhbCiDbOUrN7n5hwu1fmNnDBWjPsBKLxXhy\n5SZWvfoapy5sZdmqLSxe2EptTY3OMQs9Pb28srmDY+c3M7K+liVHH0wsBq1NYxUbIlVo49ZORtTX\n8vbFc9jZuZemiaO58+GX2LIjpCWJn4aT4sp2RGmsmfUt92lmY4HRA5QXwmjBN3++jN88vY5Hnl3P\n/EOn8uiz6+mNxZjRPF6LBVa53y1v4/YHXuTp5W3c//Q6enpj9MZitExuUGyIVKFJ40fzwNPr+Pmj\nf+bBZ9Yxsr6O+YdO7bt/XdvAS0BIYWQ7ovQNYIWZ/T66fTQhB5ukEYvFeGHd9n7bamtqOH/pXA6Z\n3sjxC1rYulVBX20Sr2jZ1tE/eeWYkfXMOXiCRpNEqkTyldCbtnX2u3/9lg669uxPOKFT8qWRbUfp\nJ4TFHi8iTOb+ZrRNUuju7uW3y9rYu6+HUxe28syKNnbt7qY3FmPiuJEcMWMStbUaMag28VOxqzfu\nZPzYkcyYNrbf/c1TGjjrhNnqQItUiRde2c7qtp1s37mHuld3cHDSMWHSuNHMaZ3AIS3jNV2jhLLt\nKP0Q2Ap8kZA+5ORo218WqF0V7bfL2/juPSv6bl9wxlxivTBlwiiOsakDPFKGs/ip2LglRx/MJW8+\ngg1bOjl42lhOOrJZHWiRKvLqti5++uBLfbfPXzqX975lHhu37KJ5SgOtU8cwt1U5HUst247SJHd/\na8Ltr5vZo4Vo0HCwfnP/EYGt23fzhrlTNQmvyiXPL+jo2seGrZ1cdPphJWqRiJRS29b+p9o2b+9i\n1Ig63r1Ux4Rykm1H6WUza3H3jQBm1gy8lOExVSXxXHNrUyNjR9eza3c4t9zapCHTapUYFxPGjeoX\nF2NG1XNw09gMNYjIcJJ4TDhoWv/viikTRjN5/KgSt1CSZdtRmgX82cyWEa6UOwJYHh9VcvfFBWpf\nxUheTfW9b57H+i2h03Ty65o1dFqlkuPig29fwPpNu2gcM4IJjSM4fv60ErZORIot+Zhw6dnzWL95\nF9MmjWFi40gWzp1SwtZJKtl2lP6loK0YBpJPq+ze083Fp88tUWukXCTHxWs793L+qYeWqDUiUmrJ\nx4TOrm4uXHoYTU3j2Lx5Z4laJQPJNtfbI4VuSCXq7e3lSd/M2o0dTG8a228IVZdxVi/FhYgk0jGh\nsmU7oiRJYrEYv13Wxnd+uf/qtkvPnkdnV7cu46xiigsZbnp6eli9etWAZWbPPpS6uroitaiy6JhQ\n+dRRytHytdtZvaH/MOmGLZ28a8mcErVIyoHiQoab1atXccX1d9EwIfV8us4dm7jp6nOYM0dTDVLR\nMaHyVWxHycxuBE4AeoEr3f2ZYj7/urYOpkzon8VlZouGUKud4kKGo4YJ02ic1FrqZlQkHRMqX0V2\nlMxsMXCYuy8ysyOAW4BFxXjunt4Yy9a007W3m33dvZy/dC6bt3cxe/o4jp/XVIwmSBlSXIhIIh0T\nho+K7CgBpwM/A3D3lWY20cwa3b3guR+eWrax36WdF59lHG1NzJ+l1VOrmeJCRBLpmDB81Ja6ATlq\nATYn3N4SbSu4NRt29Lu9b18vC2ZNUuBXOcWFiCTSMWH4qNQRpeRIqyEk6x1QU9O4IT/x7OkT+t0+\nbOaknOvNR3vKsZ5811VI+Wqn4qJ49RRDodo6fvwYIPe1ciZPbkzZtqamcbS3DzzvJd1jB5JNvbnU\nXUmxkGgw7c7lmJDL65LLe1pN5fOhUjtK6+k/gnQQsDHTg/KxmNdxC1q46sKFrGvrYEZzI3NaxuZU\nb74WFyu3evJZVzE+EPnaZ8VFceqJ11VohVj4r6lpHK+91jWkOrZt6zigbfHXdtu2gWcepHrsQLKt\nd7B1F2phxXKLi8EeE3J5XQb7mGosnw+V2lG6D7gWuNnMFgLr3X1XMZ64traGBbMmKcGt9KO4EJFE\nOiYMHxXZUXL3J8zs92b2O6AH+Eip2yQiUkix3l7Wrl1zwPb29ka2betIeV+mx8b19PQANdTV7Z+2\nmk29ItWgIjtKAO7+8VK3QUSkWLp2buaG27fQMGFDyvu3vrKCKQfPy/mxY8ZNSbmo5ED1ilSDiu0o\niYhUm4EWfuzc0Takx6a7P1O9IsNdpS4PICIiIlJw6iiJiIiIpKGOkoiIiEga6iiJiIiIpKGOkoiI\niEga6iiJiIiIpKGOkoiIiEgaWkdJRERylmnVb4DZsw+lrq7ugO09PT2sXr0qp8eKFIs6SiIikrNM\nq3537tjETVefw5w5cw+4b/XqVVxx/V0pVwTP9FiRYlFHSUREhmSgVb8L+ViRYtAcJREREZE01FES\nERERSUMdJREREZE0ij5HyczeB/wb8FK06X53/6yZvQ74GtALPOfuH4nKXw2cF22/zt3vMbPxwA+A\nCcBO4CJ3317kXREREZFhrlSTuX/k7v+QtO2LwN+5+x/M7PtmdhbgwAXACcAk4DEzuxe4EnjI3W8w\nsw8B10T/RERERPKmLK56M7MRwGx3/0O06W7gTOAg4B537wG2mNlqYAFwOnBZQtlfFLXBIiIiUhVK\n1VE6zcx+BYwAPgZsAtoT7t8ETAe2AJtTbG9O2L4JaCl0g0VECq1zx6a093Xt3AbU5HR/qR4LYZ8S\nF6Rsb29k27YOANauXTPgPg90n0ix1MRisYJVbmYfAD4IxAifpBjwQ+ClaK7RicDXgTcDv3D3o6LH\nxUeMlgEd7v7laPttwK3AV4Fj3H2nmdUBq919RsF2RERERKpSQUeU3P1bwLcGuP8JM2sijA5NSbir\nFXgVWA8ckWZ7C2EidyuQeklYERERkSEo+vIAZna1mb07+vsvgM3uvg9YYWaLomLvBO4FHgLeYmb1\nZnYQcJC7LwfuJ0zyBjg3KisiIiKSV6WYo/QD4DYz+zBQB3wg2v5R4BtmVgM86e4PApjZzcBjhOUB\nPhyV/RLwPTN7lDC36T1FbL+IiIhUiYLOURIRERGpZFqZW0RERCQNdZRERERE0lBHSURERCQNdZRE\nRERE0lBHSURERCQNdZRERERE0lBHSURERCQNdZRERERE0lBHSURERCQNdZRERERE0lBHSURERCSN\nUiTFxczGAt8FJgMjgOuAjcDXCMlvn3P3j0RlrwbOi7Zf5+73mNl4QnLdCcBO4CJ33170HREREZFh\nrVQjSpcCK919CaETdBPwn8DfufspwEQzO8vMZgMXAIuAtwE3mlkNcCXwUFT2TuCa4u+CiIiIDHel\n6ihtAaZEf08BtgKHuPsfom13A2cCS4B73L3H3bcAq4EFwOmEDlK87BlFareIiIhUkZJ0lNz9dmCW\nmb0IPAxcDbQnFNkETAeagc0Ztm8CWgrcZBEREalCpZqjdDGwxt3fbGZHAj8lzDWKqwFi0f+JalNs\nj5cdUCwWi9XUJFcnZa6gb5hiomIpLiQVxYUky8sbVpKOEnAS8GsAd3/ezBqBhoT7W4FXgfXAEWm2\ntxA6V63AhkxPWFNTw+bNOzMVy6ipaZzqKVJdTU3j8tCa9PIVE1B+78NwrSdeVyHlMy4S5fM1UL2p\n6y2kwcbFYPczl9el0M8xHMrnQ6nmKL0EnABgZrMIHZ4/mdlJ0f3vBO4FHgLeYmb1ZnYQcJC7Lwfu\nJ0zyBjg3KisiIiKSV6UaUfoGcIuZPQzUAZcTlgf4ZnRV25Pu/iCAmd0MPEZYHuDD0eO/BHzPzB4l\nzG16T3GbLyIiItWgJB0ld98FvCvFXYtTlP0q8NUUj39HYVonIiIiEmhlbhEREZE01FESERERSUMd\nJREREZE0SrWO0vuBS9i/JtLRwMko19uwE4vFWL52O+vaOpjZ3Mi8WROpKexyJ1KhFCuSSPEg5aJU\nk7lvAW4BMLPFwPnAFwm53v5gZt83s7MAJywDcAIwCXjMzO5lf663G8zsQ4Rcb8r3VoaWr93ODT98\ntu/2VRcuZMGsSSVskZQrxYokqpZ46OnpYfXqVbS3N7JtW0fKMrNnH0pdXV2RWyZxpVoeING/EpLk\nPpoi19tBRLnegC1mtpr9ud4uSyj7iyK2VwZhXVvHAbeH48FOhk6xIomqJR5Wr17FFdffRcOEaSnv\n79yxiZuuPoc5c+YWuWUSV9KOkpkdA6wFekid620LyvVW0WY2N/a7PSPptkicYkUSVVM8NEyYRuOk\n1lI3Q9Io9YjSB4HvEOYppcrflrdcb1Ia82ZN5KoLF7KurYMZzY3MnzWx1E2SMqVYkUSKBykXpe4o\nnQb8bfT3lITtec/1BvnL+6J6BlfXtKbxeas33wq1z6ont3rKJVYKlTdM9Q6u3nKJh7jBvh7ZlG9v\nzzxSNnlyY9q6CtGm4VQ+H0rWUTKz6cBOd++Obq8ws0Xu/jgh19uXgBeBvzezfwWmEeV6M7N4rrdP\nM4hcb+WU3HO41pPPuorxgSjHfVY9mesqtEpLBqt6yy8ust3PdBO4k8ukqqsck9CWW/l8KOWI0nTC\n/KK4jwLfUK43ERERKRcl6yhFV7idnXB7Bcr1JiIiImVEK3OLiIiIpKGOkoiIiEga6iiJiIiIpKGO\nkoiIiEgapVwe4GLgamAf8AngT8BthM7bBuASd98XlbuCsHr3N93922ZWT1iochbQDVzm7quLvhMi\nIiIyrJVkRMnMJhNyvC0C3kq4gu064MvufirwZ+D9ZtZA6EQtBZYQ1lSaCFwEtLv7KcBngM8Vfy9E\nRERkuCvViNIZwP3u3gl0Apeb2Srg8uj+u4GPAS8AT7l7B4CZ/RY4mZAU99ao7APALUVsu4iIiFSJ\nUs1Rmg2MNbOfm9kjZrYUaHD3fdH9qZLfEv3db7u7x4De6HSciIiISN6UqnNRA0wmnHKbDTxE/8S2\n6ZLiZkqWKyIiIpI3peootQGPu3svsMrMdgKjzWyUu++hf/LbtyU8rhV4gv1JcZ+PjyS5e0+mJ63E\nJKGVWE++6yqkctxn1VN6pU4Gq3rLk5LiVl75fChVR+k+4Ntm9nlgCtBISGx7HvB99ie6fQr4bzMb\nT8j1tohwBdwE4HzgfuAcwohURuWU3HO41pPPusotyeVAyu19GK71xOsqtEpLBqt6yy8ulBS3PMrn\nQ0nmKLn7q8D/AP8L/AL4CPBJ4H1m9ggwCbjV3XcD1xA6VvcB17r7TuB2oN7MHgP+Gvin4u+FiIiI\nDHelTIp7M3Bz0uY3pih3B3BH0rZe4P2Fa52IiIiIVuYWERERSUsdJREREZE01FESERERSUMdJRER\nEZE0BpzMbWYzB7rf3dfm8qRmdirwE0Ii3BrgOeB6lBS37MRiMZav3c66tg5mNjcyb9ZEag5Y71Oq\njeJC0lFsyHCT6aq337F/JeyDgNeAOsK6R38G5g7huR929wviN8zsFkJS3DvM7NOEpLi3EZLiHkPo\nED1tZncS1k5qd/f3mNmZhKS47x5CWySN5Wu3c8MPn+27fdWFC1kwa1IJWyTlQHEh6Sg2ZLgZ8NSb\nu89w95mEy/OPcfdJ7j4eOBG4Z4jPnfwT4zRCMlyi/88EjidKihutqZSYFPfOqOwDwElDbIuksa6t\nY8DbUp0UF5KOYkOGm2znKC10976fCO7+JDB/iM8938x+ZmaPmtkZKCluWZrZ3H95/RnNmZfbl+FP\ncSHpKDZkuMm2c9FrZp8ljOjEU4mMHsLzvkhYZfsnZnYoIQXJiIT7C5IUt9xyVlVCPadMaWTkqBGs\n2bCDWdMncPyCFmprM883qJRcTsr1lls9ucRFpcQEVF6Os3KqN5vYqKRYSKRcb5VXPh+y7ShdQJhQ\nfTmhk7I82paTKIXJT6K/V5nZRuCYQifFLaecVZVUz2EtjRzWEj7MW7dmHkZXrrfqqGcwcaFcb5WZ\nOy3XegeKDeV660+53so/11umq97ip+a2ECZV54WZXQRMd/cbzKyFcCrt2xQ4Ka6IiIjIYGQaUeom\n9Smt+Cmwuhyf9y7gB2b2dsIpt8uBPwLfNbO/AtYQkuL2mFk8KW4vUVJcM7sdODNKirsbuDTHdlQN\nXbIr2UiOk1OmaH5JtdOxQ6rdgB0ldy/IgpTu3kEYCUqmpLgFknjJ7tjR9Vx0lrFj596+A58IhDj5\n+p3Pc/S8Zl7e+Bo793Rz3OFT9cVYxTIdOxQbMtxlNUfJzBqBjwLHEkaSngBucveuArZN8ijxEt2j\n5zVz88+X9d2+6sKFTGsaX4pmSZlZ19bB0fOaefTZ9QA8vbyNRq2DU9UyHTsUGzLcZTuZ+2bgFeAb\nhNNuZ0Tb3lOgdkkexWIxJowbybHzm2kYVU93b2+/+7XOicTNbmlkT3dvX6w8s6KNdW0d+jKsYrNb\nGlm8sJWuPd1MHj+asaPr2bW7G0CxIVUh245Ss7tfmHD7F2b2cAHaIwWwfO32fr8CLz17Hr/7ejAw\ntwAAIABJREFU44a+21rnROJ6YvDzR//cd3vxwlbFR5XribF/hJE2Fi9s7but2JBqkG1HaayZNbh7\nJ4CZjWVo6yhJESWPGHV2dXPVhQtZ19bBjOZG5muOkkSSY2XSuNGKjyqXHBMTxo7kgqVzdeyQqpFt\nR+kbwEoze4Zw6u0ohrhcgJmNBpYBnwIeRAlxCybVSrkLZk3SkLkcIDlWFhw6RZN1q1xyTBw+Y6KO\nHVJVsuooufstZnY/oYME8Lfuvn6Iz/0JwvpMANehhLgFM2/WRI0gSVaSY+X4BS1ZLTIqw5eOH1Lt\nsr3qrYHQYZlIGFE6y8xw91tyeVIzM+AI4JdRfacS1lKCkBD3Y8ALRAlxo8ckJsS9NSr7AJBTG4ab\n3t5envTNrN3YwcyWcRw/byq1USq/Gmo0glTFktfBqa2F1RtSr4mTHCvZpKuRyhWPjRfWbWf82FEc\nPHUMh88YOCZEqk22p95+SRjVeSVhW4zcOyk3AB9h/0KRY3NNiGtmvWZW7+7dObZlWHjSN/ebsA0L\nOHFec8naI+UjcR0coN9kXF3eXd1SxUZ3L4oJkQTZdpRGu/uJ+XhCM7sEeNzd14SBJaD/6t8FSYgL\nlZFsNNd61j3y537b1m3q4JzFh5WkPfmuq5DKcZ/zXc/GZ/ufJe/as/83xcZtnZx2zMyitqcSlFOS\n2ULWmyo2EmOi3NpbakqKW3nl8yHbjtIfzGyqu2/JXDSjs4FDzOxthCS3e4FdhU6IC8M7Ke6Maf2D\nZ8a0xoImGyxGXeWW5HIg5RoXANMnN/S7b8yo/R/7lskNAz5fue1XvK5CK7cks4WqN1VsxGOiHNub\nqd5CU1LcyiufD5mS4j5GGK2pB14ws5WEU3AAuPviwT6hu/dNvDazfwVWE5LdKiHuEBw/byqwIJqj\n1Mjx85pK3SQpE8mTcetqoWVSgybmSl9shDlKI2md2oDNUEyIJMo0ovQvBX7++Gm0TwK3KSFu7mqp\n5cR5zZw4rzlM0FyjJJYSJE/GjcVi9PSG9XFqQPFRxVLFRvzYMXfmJA5tGavYkKqXKSnuI/G/zexs\n4BB3/4qZzQFWDfXJ3f1TCTeVEDdPkidoasKuJFJ8SDqKDZED1WZTyMz+A/gAcFm06SLgS4VqlKQX\ni8VYtqade59ax/I17fT2HjiPPXklXeVyqz49vf3jJJZwvYPio3olHz9iSdfBKDZEDpTtZO5T3f0E\nM3sIwN3/zcweL2C7JI3kX3wjR43gsJb+V02kWolbqstTyzamHRlQfFSvTCNGio38+/SNX2d374i0\n97etexFGLyhii2Swsu0odUX/xwDMrA6oK0iLZEDJv/DWbNhxQEdJK+nKmg07+t1OzPKu+KheqUaM\nEjtKibFx2MxJzGkZW+wmDjsbd/Sya8whae/fumsto5Q5taxl21F63My+DRxkZn8PvBN4OJcnNLMx\nhFxtzcAo4N+BP6Jcb1lJ/sU3a/qEA8poJV2ZnRQXiSMDio/qlWnEKDE2CnUZv0ilyTbX2z+b2XlA\nJ3AwcGM00ToXbwOedvcvmNlMwmX+vwO+4u4/Va63gSkXl2TjuAUtGjWSA2g0UWTwss31NgL4X3f/\nHzN7PfA6Mxvr7rsG+4Tu/uOEmzOBdSjXW9aUi0uyUVurUSM5kEYTRQYvq6vegO8CJ5hZK/A/wJHA\nt4fyxGb2O+B7wEcZQq43oDe+QreIiIhIPmXbUTrI3f8HeBfwNXf/B2DyUJ7Y3U8inEb7PkXK9SYi\nIiIyGNmOxIwysxrgHYT1lAByum7UzI4CNrn7K+7+XHQFXVFyvZVbcs/hWk++6yqkctxn1VN6lZYM\nVvUWRy4JXOvrB75AvC6L6RNKipt7+XzItqP0MLADuNfdXzCzKwHP8TkXE65Y+6iZNRM6XPdQhFxv\n5ZTcczD1xGIxlq9NnZKkXJOWKilucepJFxvlFhdKiluapLgDHTuGUu9QVFtS3O7uHki/jBI9vbGM\nX8RKipt7+XzI9qq3a8zsc+6+Pdr0M+ArOT7n14FvmdmjwGjgr4Hfo1xvaSmtgKSj2JCBKD5Ehi7b\nq95uA2JmlnzXewf7hO6+G7g4xV3K9ZZGpkXipHopNmQgig+Rocv21NsDCX+PBJYAL+e/OZIoPmze\ntbebUxe28syKNnbt7lZaAekzs7mRsaPrOXpeM117upkwbtQB+bukOsViMSaMG8mx85tpGFXPMyva\ndOwQyUG2p95uTdp0s5n9ogDtkQTJw+YXn2W0TG7QInHSZ96siVx0lnHzz5cB8PTyNsY3LGRa0/gS\nt0xKbfna7X1xAfChty/QsUMkB9meekteRmAGMDf/zZFEycPm+/b1athc+qmhhh079/bbpozvAgfG\nwY6de7OeyC0i+2V76q2b/msY7SCkDpE8isVirFy3nQ3bOtn22h7Gjx3JmcfO4PHnN+iUmxwQH5PG\njebgqWM4ZLoyvle7VLExecJoxo6uZ9fubkBxIZKrbE+9ZbswZdbM7POElCR1hE7X01R5Ytzla7fz\n9MpNPPrs+r5tixe28penztEpN0kbH8ceMU35u6pcuti46Cxjx869iguRIcj21FsjIdXIsYSRpSeA\nm9y9K5cnNbPTgPnuvsjMJgPPAr+hyhPjrmvroGtPd79tXXu6dcpNgPTxsa6tgzcdN0MxUsXSxcaO\nnXt503EzStQqkeEh25Gim4HxwDeiv1ui/3P1CGHRSIB2YCwhMe5d0ba7gTOB44kS40bLCiQmxr0z\nKvsAcNIQ2lI2ZjY30jCqf991zKh6DZkLoPiQ9BQbIoWT7RylZne/MOH2L8zs4VyfNEpmGx+N+iDw\nS+CsXBPjmlmvmdW7e/+fVBVm3qyJ1NaGg97W1/YwadwoWqc2YDM0ZC6KD0lPsSFSONl2lMaaWYO7\ndwKY2VjCqtpDYmZvJywe+UbgxYS7qjIxbg01HDFjEkfM0CkUOZDiQ9JRbAxfsd5e1q5dk/K+9vZG\ntm0LVzfOnn0odXUD55WT3GTbUfoGsMLMfh/dPpowdyhnZnYW8E+EkaSdZtZR6MS45Zbcc7jWk++6\nCqkc91n1lF6lJYNVvcVRiqS4XTs3c8PtW2iYsCFtmc4dm7jtsxdx+OGHZ9Wmwaj08vmQbUfpR4TJ\n1FMJozm/H8RjDxAluv08cLq774g2P0BIiPsDCpQYt5ySe8brGUrSykK0Jx+UFDc/9ZRDQtNyqyde\nV6FVQjLYeHxs3NbJ9MkNgz52ZKKkuAcqVVLchgnTaJzUOmCZdIlzU7UpW8OhfD5k29n5JbCPMJIT\nNwe4JcfnfRcwBfixmcVPp72PkCz3cqooMa6SVko6ig0ZiOJDpDiy7SiNdvcl+XpSd7+Z1FfNDbvE\nuJlGBZS0srolx8cpU/ZfpaTYqG46doiUh2w7Sn8ws6nuvqWgrRmGMv3qm9msVZWrWXJ8jBw1gsNa\nQgwoNqqbjh0i5WHAjlJ0aisWlXvBzFYS5ioB4O6LC9u8ypfpV9+8WRO1qnIVS46PNRt29HWUFBvV\nLdtjx8ZtnVq5X6SAMo0o/UtRWjGMzW5pZPHCVrr2dNMwqp7ZSXm5aqhhwaxJGjKvQrFYjAnjRnLs\n/GYaRtXzzIo2Zk2f0He/YqO6ZXvsOO2YmQWZHC0iwYAdJXd/pFgNGa56YvDos+sZO7qeE4+cztpN\nu1ixZjtHHjaVOS2NyuZdxZav3c7NP1/WFxtvPfkQlq3awt49+/J+BZNUnnTHDpsxUfEhUkQ5X+I/\nVGb2F8DPgBvd/b/M7GCGWVLcWCxGW3snpx87g+bJY+nu6eFH978AwN2/fVlXqVS5tvZOzl86l9d2\n7WXqxNF8/9fed59iQ9LFx90oPqQ0enp6WL16Vdr729sbGT9+2rBb+LIkHSUzawC+RFg7Ke464Mvu\nfsdwSYq7fO12vnfv/i+/pcf0T06pq1SqW31dLd97MMTHsfOb+92n2BDFh5Sb1atXccX1d9EwYVrK\n+zt3bOKmq89hzpy5RW5ZYZVqRGk38GbgmoRtpwGXR3/fDXwMeIEoKS6AmSUmxb01KvsAua/nVBDx\ny3r/tGpbv+3jx47sd1tXqVSfxEu+t3fs6duenNBUsVGdFB9S7rJZ/HK4KUlHKVoHaY+ZJW4eO1yS\n4q5ct52nV25i8vj+6fA6OveyeGErjWNG8IbDm5jTooNdtYnHRteebuYmJCx9ZkUb5y45jK693cyb\nOUlXMFWpjPGxp5t5sxQfIsVUsjlKKSQmtS1IUtxi5az63YqNNE0cw7adu7noLGNX1z7Gjx1J155u\nDp85ieMXTKc2Q36ffLan2PXku65CKuY+9/TGaHtuA/V1tbQ2NbL9td287+x5tG3rZFLjaOYcPJ5j\n5+cvNsotLiolJqB0Oc7ix46tO3bT3d3LB86Zz/rNuzLGR6XlZKukWEhUilxv2Zo8uTGr9g0lt1p7\ne+Yf99m2Ix/tKZZy6igVPClusXJW7d7Tw08feqnv9oVnGtMmjumbU7B1a0fZ5dBSrrehyWafl61p\n57u/WtF3e/HCVsbt6eaCU+f0bautrSmr97Pc6onXVWilynGW6tixYPbkfseOXOrNRSXWW2ilyvWW\njWLketu27cD4y6Ud+WpPNuXzoTYvteRHPCku9E+Ke4yZjTezRkJS3McIyXDPj8pmnRS3WDZv6+p3\ne9P2zgMWj5PqkxwDXXu62bFrb4laI+VIxw6R8lOqq96OAm4gXN6/z8zOAy4Gbq3UpLiJkzAPmtbI\n2NH17NodpkxNHDdKky+rVGJcTBg3ql9cjBlVz8xpiotqp2OHSHkr1WTuPwCpkuxWbFLc5LxMl549\nj1c376J5SgOtU8cwt1WTL6tRclx86O0LWL95F41jRjB5/CiOsaklbJ2UAx07RMpbOc1RqmjJw+Od\nXd28e+lhJWqNlIvkuNixcy/nLT60RK2RcqRjh0h5U0dpCHp7e3nSN7N2YwfTm8b2GzLXcHn1UlxI\nJooRyadYby9r164ZsExPTw9btjSyY0dX2vuhhrq6/VOX29sb+03gzvQcw5U6SkPwpG/m5p8v67t9\n6dnz6OzqVqb3Kqe4kEwUI5JPXTs3c8PtW2iYsCFtma2vrGDMuClpV9XOdH+8zJSD5w25vZVGHaUc\nxWIx1mzof5nihi2dvGvJnDSPkGqguJBMFCNSCJlWzO7c0TZgmUz3x8tUo4rtKJnZjcAJhKvhrnT3\nZ4rxvD29MZataeeFdduZOmlMv/tmaqXtqqW4kEwUIyKVqSI7Sma2GDjM3ReZ2RGEXG+LivHcTy3b\n2HeFytjR9Vz0RuPVLbuY0dzI8fOaitEEKUOKC8lEMSJSmcppwcnBOB34GYC7rwQmRgtSFtyaDTv6\n/t61u5sXX9nOw394hWkTx1BbsS+nDJXiQjJRjIhUpoocUSKkL0k81bYl2vZS6uL5M3v6hH63D58x\nkcWvP0gTMKuc4kIyUYyIVKZK7SilS5Y7oHzkfZkypZGPX3ocazbsYNb0CRy/oCXnJKbllmxUSXFz\np7goXj3FUIi25jNGklVa8tpKioVE5ZwUt1woKW75iCfFjTsI2JjpQflK7nlYSyOHRZMvUyWpzLae\ncko2qqS4Q6O4KE498boKrVBJW/MRI6nqrbTktUqKu1++kuKWi+GYFLdS35/7gGuBm81sIbDe3XeV\ntkkiIiLVK5uFLwFmzz6UurrUI209PT2sXr0q5X2JC2AOVEe+VWRHyd2fMLPfm9nvgB7gI6Vuk4iI\nSDXLZuHLzh2buOnqc5gzZ27K+1evXsUV19814MKXmerIt4rsKAG4+8dL3QYRERHZL9OilcWqI590\nTaqIiIhIGuooiYiIiKShjpKIiIhIGiWZo2RmpwI/Bi5z919F214HfI2Qu+05d/9ItP1q4Lxo+3Xu\nfo+ZjQd+AEwAdgIXufv24u+JiIiIDGdFH1Eys0OBjwKPJd31ReDv3P0UQkqSs8xsNnABIY/b24Ab\nzawGuBJ4KCp7J3BNsdovIiIi1aMUp95eBd5BGAkCwMxGALPd/Q/RpruBM4ElwD3u3uPuW4DVwAJC\nrrc7E8qeUZymi4iISDUp+qk3d98NYGaJm6cC7Qm3NwHTCTncNqfY3pywfRP9V+kWERERyYuCdpTM\n7APABwl52OL52D7p7vcnFU2Xuy15e22K7VnleRMRESm2fbs209u5L+39PR3r6awfn/b+rp3bOPCr\nMP9lilVH545Nfat3J660Hbd27Ro6d2zKWEcxFbSj5O7fAr6VRdFNhFGluFbCKbr1wBFptrcQTt+1\nAumXAd2vptySew7XevJdVwHlLSag/N6H4VpPEeQ1LhKp3sLWW2CDjoumpnH89NYvFKg5w9MJJxzF\nBRe8o9TN6KfUywPUALh7N7DCzBZF298J3As8BLzFzOrN7CDgIHdfDtxPmOQNcG5UVkRERCSvamKx\n4p61MrO3AFcDRphntMHd32Rm84BvEDpPT7r7x6LyHwHeQ1ge4J/d/WEzGwt8D5hCmNv0HnfPfzpq\nERERqWpF7yiJiIiIVIpSn3oTERERKVvqKImIiIikoY6SiIiISBolyfWWb2ZWR1iG4FDCPn3M3R/P\nZ/44M7sROCF6zJXu/kyatnweOBmoAz4HPA3cRuiUbgAucfd9ZnYxcAXQA3zT3b9tZvXAd4BZQDfw\nYeBXwKeAB4dQz8+Ay4B9wCeAP+VQ1yHAXODP0f3XARsH+freDRwX1XEy0DiEfbrM3Vene48VFxUT\nF8dH+7ABeAH4GPDVQsVE1I73Af8GvBRtut/dP1vIfJPZxklC+VOBn0TvSQ3wHHB9Du9P32tD+Lz9\nDLjR3f/LzA4eSn3Ra/1O4PuEJVt+DTQARxMWCwa4Pnq9Bvv+/QoYD3QR4n0on5ds4yKfOUgPJix7\ns4+Qcmv3IF/7VqAT2AZ8HrgYWBo19THgnQnlryR8DrcQLm76TPR+pysff71uIaT/+jfgnAHK/wtw\nGOHzshF4Ptq/geqfBIwC2oBPEtZTHKj85Oi12hC9Joui5zkMcODppNf+AsJx/RXC5+8LhNRob4j2\n7afu/qEs36uMn9/hMqJ0CdDh7osJb8h/Rtvzkj/OzBYDh7n7oqj+L6VqhJmdBsyPyr05ev7rgK+4\n+6mEL5P3m1kD4YtpKSFNy9+b2UTgIqA9asNngDvYf8C5DvhyDvV8mfBBWAS8lZA+ZtB1EYLqAWAN\nIehuil7nbF/fq4GDgFuBP0avb6779BlCZyPle5zwliguyjsuGoAfEuLhxuj1/VGO+5NtTMT9yN2X\nRv8+m+5x+cg3mW2cpPBw1L4l7n4FQ/u8XB897wMJ9Q/p8xeV/W/gl4T3byLhM35Nwmt7Tw7v33eA\nVe4+HngU+DpD+7xkjAvLYw5S4J+BHdHfHwS+MsjX/pOEz8Ru4F2Eq8GPAD4AnE/oICSW/xKho7AP\n+BDwzQzl46/Xpwmf4ROj8u9PU/6jwM8Jnc53AM9kKH8uYRHo16L34mMZyi8F/iKq/53A74AV0Wt4\nDbAqxWt/a/RvJOG4czMh9pYA/wgsytfnF4ZPR+k24O+jvzcDky3kjzvE85M/7nTCrwHcfSXhTWtM\n0Y5HCIEAIQDHAqcCdyW14XjgKXfv8JDS5beE0YbENqwl/Er4JeEX5anR4wdbTz1Q4+6d7t7m7pcD\np+VQ1xZC4J9EWJZh6yBf38WEQN1A+KVwRo7tgHDAWZTmPU583xQX5R0Xcwi/CJ9KKGs57k+2MZGS\nFTbfZLZxkix5iePTyP21OYHQSd+Qp/oWEb7YdhA+z/E6DkqxH4N9/yYB8U7MT4Fx5P55yTYu8pmD\n9HRCZ++M6P0eT/gyz+q1J6wLeG60P39BGAmcGO3/A4TFmRP3/zZ3/1xU/i2ETspA5TsIo207gZVR\n2ydG7TigPGFUL5b0+g5U/kTgPkKn04B1A5VP8f5dRujEzSZ0kk9Kfu0Jx/OG6LU/ntBhGhW9V3cD\no7N8r+Kv/4DHiGFx6s3dewjDbRB6it8nvBnbEooNJX9cC6EXHbcl2vZSwjbcPUYIKgi/JH4JnOXu\n8fXrUz0X0d/J22+I2l8X3R6bYz2zgRozu4swzPgpoGGwdbn7g2Z2abTfDxOGar+SUD6b13d9tG1n\nVM+IXPbJ3WNmFovqSPUeE5VTXKSvZzalj4sWYBqwK2FbfSFjIsFpZvYrYAThF+8mCpdvMqs4SWG+\nmf2McFriOnJ4f6Dvtell/2chLqfYSXitmznwtW4A/tbMriKcdvm7aF8H9f65e/zzcgyhgzHUtmY6\nVuQzB2kL8Hv2x8QWwnuYKO3+xI8XZraZMBqyldAJ2Be1sTvN/p9NeP1XAkdkKH8D8AvCcWA8MDJD\n+fmEY87phM7xQOVnE34MLiKMFmUqH7eZ/aenNxNGBeOxuyXxtXf326PjzkmEjlk7+9+rTdE+5S1f\nbMV1lGyA/HEWFqdcSBi5aE566FDyx6XLRZeujW8nDDO+EXgxizb0225mlwCPA69PeJ7k9mSsJ2Fb\nHWFIcyZhOHjQdUXnktcQzlG/lTB/Yme68glSvb7x/cl1n0i4HW/fBwijR01m9gSKi7T1JGwrt7gY\nzHufMSYibwHOMrPHEx73Q0Js3GNmJwLfJYy2pHqvc4mLZIOKk8iLwLXu/pPotNBDhE5dpvZlanei\nvH3+Ev7+M+HU23Nm9g/AtcATudQZfV7eTBilWJKvtg50rEjzuEz1J8dEDf3f41TvdzavvRE6iisI\nc28ylb+V0Bm+inDaLmX5hOPImDTtS67/RcL7+DrCj5pPAnsGKF9D6Bj+OKF8xwDlE7efTBjdq0m4\nvzbFPsSPO1sIp2e/yv6OUrxs3vLFVtypN3f/lruf6O6LEv6/Pwr+s4G3RyMJA+WPm55me0vCtsRh\n0sT7IAwvb0zVvui89z8Bb/KwWniHmY0aZBvOBt5O+LX9fsJ53F051AOh17zH3bvdfRXhSyyXuk4i\npI7B3f9IGA5uTlM+U5smEl7fXF4bLEzWrIm2T4na9C3gP4DvKC4qLi4aE7bty1dMRJ4Dvp10vPiy\nu98TtfkJoCl6PaakeY7BxkWyrOMkzt1fdfefRH+vispPHMJrEx9hTZS3z19C2f9z9+ei23cTTh29\nMtg6Ez4vXyKcuin4sYID5XqsiOcojcdEqvd7wP2J9n8JYb7NWmCPmY2K9qc+sbyZHWVhcngroVPZ\nDexNV579x5HLCaMxswYqnxCLrYTP005g3AD1txE6YvHyuzO0J/F1nAMsI/womBKP3ahc4mNOIlw8\n0EqY0xRLqKs1amO+Pr+V11FKJfrFdTnRTHrIe/64+wjnmDGzhcB6d99FEgsz6T8PvNXdd0SbH4jq\nS6z3KeAYMxsfzVVYRDifez9wvru/m/BBvp0wWfK6qJ7zBlNPVLaG8AVYY2ZTCV9KudT1EiGVzENm\nFj+//SczOymH13dhVHbQr01U9hzCRLweUr/H8fdDcVEZcbEg4Tn/NNjXJSqbVUxE78fVZvbu6O+/\nIAzl70vzuFziIllWcZLUxoui01eYWQuh8/ltcnuvz4n2I1lePn/AjGj7O4HjzeyQ6PZphPdzsHW+\nQDh9+1bCiFLBjxVJamBIx4r7CPNs7h3g/R5of1oJk7N3EDoD90d/nxvtz9bE8oS5ONdE+7+S/XPH\nzktT/q8Ip9C2ESZ+f2+g8mb2ATP7p6h+j16fFweo//GoTYsInZ4B25Pw/p1C6JzeF+3rCsJFQA8l\nv/aECd5nEDqhuwjzJF+LjjvnEia25y1f7LBIYWJmnyZcHbCW/cNobyRctpyX/HFm9hnChMIe4CPu\nHp/AmNiODxGGGV9IaMf7CJeojyIMFV7m7j0WLqv9h6gNX3L3H5lZLeELcC6hF34p4TTjy4QPzG05\n1hM/UMcIVzo9k0NdRujtr4peg08QfiV9M8vXdxHhyolGwgfnD8C7CcPFOb027r7e0uQIVFyUf1wQ\nDm7/STi41hAOeCcC/1WomIja0cr+S7PrgI+6+zPpHpdLXKSIgYxxklS+kXBF4UTCr+trCVdCfTfH\n1+YLhC/TWYQvkfWES85z/vwROm9fI5ySiRFOg1xBGAnaRTjdcpm7bxnk+/cJwiXpXYQYeYkhfl6y\nOFbkOwdpC6FDsI/Q6fvrQbz2XyCMcrwYtSUW/f/GqLkPAO9OKP+PhCvJthB+qHwqqv/Nacr3vV7R\n/q4mTJ5PV/4awmX6bcD2qP73AW8aoP6pUbu3Av9OuPotU3vuInSW3ha9f68jHFteAB5Leu3fG+3z\n+mifP0045Xgs4TP2PQ9Xiubl8zssOkoiIiIihTAsTr2JiIiIFII6SiIiIiJpqKMkIiIikoY6SiIi\nIiJpqKMkIiIikoY6SiIiIiJpqKM0zJjZy9FCi1LhzOzHZvZMtFBavuv+tpm9P9/1Svkys4fMbGmG\nMhcm/P2ghUzrUkJmdqqZPVbuz2lmvdEaVsnb15nZzPy1rvjUURp+tDDW8PFO4CR3f7XUDZGq8an4\nl527L/WQoFVKrxTvw2CfM135io+hikuKWw3M7FTCysWvEFYa/V9Czpx3EJINvoWwFPx7CckJdwPv\ncvfXSEj2F61MvYiQ/PARd//HIu6GDIGZ3Uz4IXOvmd0CfCi6azPwQXdvN7OdhBW1zwFGAp+Jyh0O\n/LW7PxAt6f8fhBhpAP7G3f8v6bkuAP42uf6C7qAcIPrc/zthpeZDCCsGX0hIx3E5YbXrNuBD7t5h\nZvsIaWyWErK1X+ruy83sZeB0d18Vr9PdT0l4nhrg64RVmUcCT7n7lWZ2LWEF5t9EKyZvJXxHjCas\ntD4jun2bu3/dzN5HSCNRF9W12t3jaTkkv+rN7KvAUYTP8tmEzAap4qIXqHf33vh75O6XmNnnCGll\n9hDynb3X3fcN8D1xwHO6e2c0En3A88YbambTCAlxa4FnOTAxbcXRiFL5Ohb4aPT/xcA2d19KSP1x\nHuHgdaa7LyEcWN+T+GAzO4+Q12aJu58AzDWzs4u5A5I7d/8Q4ZfYewhL85/u7ouBR4AxO47ZAAAE\nSUlEQVSPR8XGAk+7+8mEg9Zb3f1swpftX0dlpgIfdvczCCkLPk4CC8k0P55U/z8Xct9kQEcBH3P3\nkwgdlSsJ6W+WRJ//VwjHBQgdlOejY8DXCZ2mVJJ/0U8C/ujup7n7IuAsM5vv7tdG9y+NOsrxx/0/\noN3dTyXkCPtHM5sd3XcioYN2NPB6M3t9rjsuAzoC+KS7n0hIg3Ie6eMi+f2OmdlE4G+AE6P38adA\nc4bvicTn7CbEyQxCOp1Uzxt3BfBEdDz5DiEfW0XTiFL5WhFPoGpmW4Enou3rgQmEztE90a+HWYRf\nCImWACea2YOEHv14wq9UqRw1hF9604FfRyMBIwl51eJ+F/3/CiEZZfzvidHfG4EvmNnoaNu2pOc4\nMUX9L+d5PyR7y9w9nmn+cUJH6ffu3hlte5jwaz7uvuj/3wH9ctoNYDsw08weJ4wutBA61HHxfIRx\nxxMS8uLuu83saUKHDsJo1N7o73WEEW/Jv5XuviX6ez3h/UoXFweM4Lj7djO7F3jUzO4Ebo/y36X7\nnng+6Tnjx5SjgGcGiEeAIwn58XD3Z83stdx3uzyoo1S+uge4PZNwqmS+u281s+tTPH4P8E13v7FQ\nDZSi2E1IxnlOivti9I+LxL/jB8vbCEPjj0S/FK9KqmPPAPVL8SWO8id3WFJtq02xPfH+kSme492E\nRMQnuXss6vgkyjSnpDahTPJxquJPs5SpTK9zqliBhPff3S8ws8OBtwIPR6NJKb8nolO26Z6zJmlb\nqhjtTbhdl6JdFUWn3irTNGBL1EmaTMgqPSqpzG+Bd5hZHYCZfcLM5hS5nTJ0zwLHmVkzhFOqZva2\n6L5svpSmAcujCbrnc2CcPD1A/VJ8R8TfC+Bk4PvA0VG2cwhzgp5IKB+/iu0UwjxGgNcI84kS70/U\nDHjUSTqakKE9Hhcx9n+5xuPrCUJ2eaJ2HAX8fvC7Jnk0mvRxsYP97/8SADObbWZXuvsLUafoTuB1\nhO+Jdw7ie+IZ4Kg0zxuPl+WEkXDM7HigMffdLA8aUaoMsaS/nyWcd34SeAn4V+BrZvareFl3vyMK\n0sfNrIdwYFuFVJIY4ZTqlcAvzGwX0Am8L+F+Uvyd6PPAQ8Bq4HrgNjP7f+yPkw1mdkWa+qX4lgOf\nNbPDCKdJbySc0vqNme0mnAL5p4TyC83sbwinRd4bbbsBuMXMnP2nZmF/jPwEuNvMHoru/wLwJTM7\nAbgXeMbM3p5Q/svAN83sEUIn6lPuvtbMktte8Vc3VYgYsAH4BKnj4nPAfWb2IvBHQqfpFUKs/C/Q\nQYitT7n7rjTfEweneE6i03Xpnjf+/t8E/NjMHiDE85/zuvclUBOLKbZFREotOt3xb9Ek2GzK9wJ1\nuoRfpLB06k1EpDLF0JwgkYLTiJKIiIhIGhpREhEREUlDHSURERGRNNRREhEREUlDHSURERGRNNRR\nEhEREUlDHSURERGRNP4/SWy6v+vGQGkAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 男性、女性、人口、世帯数を取り出し、ペアプロットを表示\n", "# N:地区のindexの最大数(合計やその他のデータを除くため)\n", "N = 35\n", "d2 = d[d.index > 1][['male', 'female', 'population', 'household']]\n", "d2 = d2[d2.index <=N]\n", "\n", "sns.pairplot(d2, size=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### データからスプレッドシートを作る\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting css/spreadsheet.css\n" ] } ], "source": [ "%%writefile css/spreadsheet.css\n", "div.table {\n", " position:relative;\n", "}\n", "div.data {\n", " position: absolute;\n", " width: 90px;\n", " padding: 0 5px;\n", "}\n", "\n", "div.head {\n", " position: absolute;\n", "}\n", "\n", "div.datarow {\n", " position: relative;\n", " width: 100%;\n", " border-top: 2px black solid;\n", " background: white;\n", " height: 25px;\n", " overflow: hidden;\n", "}\n", "\n", ".svgMap {\n", " float: left; \n", " background: #fcfcfc;\n", "}\n", "\n", ".svgChart {\n", " display: inline-block;\n", " background: #fcfcfc;\n", "}\n", "\n", ".spreadSheet {\n", "}" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codemalefemalepopulationhouseholdschoolDistrict
001 平米地区1514176632801563.0平米小学校
102 定塚地区4370485592254006.0定塚小学校
203 下関地区4442456290044022.0下関小学校
304 博労地区52535738109914653.0博労小学校
405 横田地区2720295356732243.0横田小学校
\n", "
" ], "text/plain": [ " code male female population household schoolDistrict\n", "0 01 平米地区 1514 1766 3280 1563.0 平米小学校\n", "1 02 定塚地区 4370 4855 9225 4006.0 定塚小学校\n", "2 03 下関地区 4442 4562 9004 4022.0 下関小学校\n", "3 04 博労地区 5253 5738 10991 4653.0 博労小学校\n", "4 05 横田地区 2720 2953 5673 2243.0 横田小学校" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# データをCSVにして、D3が処理しやすいようにする\n", "d1 = d[d.index > 1][['code', 'male', 'female', 'population', 'household']]\n", "d2 = d1[d1.index <=N]\n", "# 小学校区をマージ\n", "schoolDistrictDf = pd.read_excel(\"data/schoolDistrict.xls\")\n", "d3 = pd.merge(d2, schoolDistrictDf, on=\"code\", how=\"left\")\n", "# CSVで保存\n", "d3.to_csv(\"data/d3.csv\", index=False)\n", "d3.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", " \n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%HTML\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", " \n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### スプレッドシートの表示\n", "スプレッドシート(表)を表示します。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "d3.csv(\"data/d3.csv\",function(error,data) { createSpreadsheet(data, \"#spreadsheet\")});\n", " \n", " function createSpreadsheet(incData, target) {\n", " \n", " var keyValues = d3.keys(incData[0])\n", " \n", " d3.select(target)\n", " .append(\"div\")\n", " .attr(\"class\", \"table\")\n", "\n", " d3.select(target).select(\"div.table\")\n", " .append(\"div\")\n", " .attr(\"class\", \"head\")\n", " .selectAll(\"div.data\")\n", " .data(keyValues)\n", " .enter()\n", " .append(\"div\")\n", " .attr(\"class\", \"data\")\n", " .html(function (d) {return d})\n", " .style(\"left\", function(d,i) {return (i * 100) + \"px\"});\n", "\n", " d3.select(target).select(\"div.table\")\n", " .selectAll(\"div.datarow\")\n", " .data(incData)\n", " .enter()\n", " .append(\"div\")\n", " .attr(\"class\", \"datarow\")\n", " .style(\"top\", function(d,i) {return \"18px\"});\n", " \n", " d3.select(target).selectAll(\"div.datarow\")\n", " .selectAll(\"div.data\")\n", " .data(function(d) {return d3.entries(d)})\n", " .enter()\n", " .append(\"div\")\n", " .attr(\"class\", \"data\")\n", " .html(function (d) {return d.value})\n", " .style(\"left\", function(d,i,j) {return (i * 100) + \"px\"});\n", " }" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%javascript\n", "d3.csv(\"data/d3.csv\",function(error,data) { createSpreadsheet(data, \"#spreadsheet\")});\n", " \n", " function createSpreadsheet(incData, target) {\n", " \n", " var keyValues = d3.keys(incData[0])\n", " \n", " d3.select(target)\n", " .append(\"div\")\n", " .attr(\"class\", \"table\")\n", "\n", " d3.select(target).select(\"div.table\")\n", " .append(\"div\")\n", " .attr(\"class\", \"head\")\n", " .selectAll(\"div.data\")\n", " .data(keyValues)\n", " .enter()\n", " .append(\"div\")\n", " .attr(\"class\", \"data\")\n", " .html(function (d) {return d})\n", " .style(\"left\", function(d,i) {return (i * 100) + \"px\"});\n", "\n", " d3.select(target).select(\"div.table\")\n", " .selectAll(\"div.datarow\")\n", " .data(incData)\n", " .enter()\n", " .append(\"div\")\n", " .attr(\"class\", \"datarow\")\n", " .style(\"top\", function(d,i) {return \"18px\"});\n", " \n", " d3.select(target).selectAll(\"div.datarow\")\n", " .selectAll(\"div.data\")\n", " .data(function(d) {return d3.entries(d)})\n", " .enter()\n", " .append(\"div\")\n", " .attr(\"class\", \"data\")\n", " .html(function (d) {return d.value})\n", " .style(\"left\", function(d,i,j) {return (i * 100) + \"px\"});\n", " }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 小学校区の表示\n", "次に小学校区を表示します。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "var width = 450, height = 350;\n", "var takaokaBoundingBox = {geometry: {coordinates: [[[136.904778, 36.822525], [137.072662, 36.822525], [137.072662, 36.658552], [136.904778, 36.658552], [136.904778, 36.822525]]], type: \"Polygon\"}, id: 999999, properties:{}, type: \"Feature\"};\n", "\n", "d3.select(\"#map\").select(\"svg\").attr(\"style\", \"width:450px;height:350px;border:1px lightgray solid;\");\n", "d3.select(\"#map\").select(\"svg\").append(\"g\").attr(\"id\", \"tiles\");\n", "d3.select(\"#map\").select(\"svg\").append(\"g\").attr(\"id\", \"vectors\");\n", "\n", "var tile = d3.geo.tile()\n", " .size([width, height]);\n", "\n", "var projection = d3.geo.mercator()\n", " .scale((1 << 19) / 2 / Math.PI)\n", " .translate([width / 2, height / 2]);\n", "\n", "var center = projection([137.025970, 36.754062]);\n", "\n", "var path = d3.geo.path()\n", " .projection(projection);\n", "var zoom = d3.behavior.zoom()\n", " .scale(projection.scale() * 2 * Math.PI)\n", " .translate([width - center[0], height - center[1]])\n", " .on(\"zoom\", redraw);\n", "d3.select(\"#map\").select(\"svg\").call(zoom);\n", "projection\n", " .scale(1 / 2 / Math.PI)\n", " .translate([0, 0]);\n", "\n", "var geoPath = d3.geo.path().projection(projection);\n", "\n", "d3.json('data/A27-10_16-g_SchoolDistrict.json', function (schoolDistnct) {\n", " var data = schoolDistnct.features.filter(function(d) { \n", " return d.properties.A27_006==\"高岡市立\"; \n", " });\n", "\n", " d3.select(\"#map\").select(\"#vectors\").selectAll(\"path.countries\").data(data)\n", " .enter()\n", " .append(\"path\")\n", " .attr(\"d\", geoPath)\n", " .attr(\"class\", \"countries\")\n", " .style(\"fill\", \"red\")\n", " .style(\"stroke-width\", 3)\n", " .style(\"stroke\", \"black\")\n", " .style(\"fill-opacity\", .25) \n", " \n", "}); \n", "\n", "redraw();\n", "\n", "function redraw() {\n", " var tiles = tile\n", " .scale(zoom.scale())\n", " .translate(zoom.translate())();\n", " \n", " var image = d3.select(\"#map\").select(\"#tiles\")\n", " .attr(\"transform\",\n", " \"scale(\" + tiles.scale + \") translate(\" + tiles.translate + \")\")\n", " .selectAll(\"image\")\n", " .data(tiles, function(d) { return d; });\n", " \n", " image.exit()\n", " .remove();\n", "\n", " image.enter().append(\"image\")\n", " .attr(\"xlink:href\",\n", " function(d) { return \"http://\" \n", " + [\"a\", \"b\", \"c\"][Math.random() * 3 | 0] \n", " + \".tile.openstreetmap.org/\" + d[2] + \"/\" + d[0] + \"/\" + d[1] \n", " + \".png\"; }) \n", " .attr(\"width\", 1)\n", " .attr(\"height\", 1)\n", " .attr(\"x\", function(d) { return d[0]; })\n", " .attr(\"y\", function(d) { return d[1]; });\n", " \n", " projection\n", " .scale(zoom.scale() / 2 / Math.PI)\n", " .translate(zoom.translate());\n", "\n", " d3.select(\"#map\").selectAll(\"path\")\n", " .attr(\"d\", geoPath);\n", "}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%javascript\n", "var width = 450, height = 350;\n", "var takaokaBoundingBox = {geometry: {coordinates: [[[136.904778, 36.822525], [137.072662, 36.822525], [137.072662, 36.658552], [136.904778, 36.658552], [136.904778, 36.822525]]], type: \"Polygon\"}, id: 999999, properties:{}, type: \"Feature\"};\n", "\n", "d3.select(\"#map\").select(\"svg\").attr(\"style\", \"width:450px;height:350px;border:1px lightgray solid;\");\n", "d3.select(\"#map\").select(\"svg\").append(\"g\").attr(\"id\", \"tiles\");\n", "d3.select(\"#map\").select(\"svg\").append(\"g\").attr(\"id\", \"vectors\");\n", "\n", "var tile = d3.geo.tile()\n", " .size([width, height]);\n", "\n", "var projection = d3.geo.mercator()\n", " .scale((1 << 19) / 2 / Math.PI)\n", " .translate([width / 2, height / 2]);\n", "\n", "var center = projection([137.025970, 36.754062]);\n", "\n", "var path = d3.geo.path()\n", " .projection(projection);\n", "var zoom = d3.behavior.zoom()\n", " .scale(projection.scale() * 2 * Math.PI)\n", " .translate([width - center[0], height - center[1]])\n", " .on(\"zoom\", redraw);\n", "d3.select(\"#map\").select(\"svg\").call(zoom);\n", "projection\n", " .scale(1 / 2 / Math.PI)\n", " .translate([0, 0]);\n", "\n", "var geoPath = d3.geo.path().projection(projection);\n", "\n", "d3.json('data/A27-10_16-g_SchoolDistrict.json', function (schoolDistnct) {\n", " var data = schoolDistnct.features.filter(function(d) { \n", " return d.properties.A27_006==\"高岡市立\"; \n", " });\n", "\n", " d3.select(\"#map\").select(\"#vectors\").selectAll(\"path.countries\").data(data)\n", " .enter()\n", " .append(\"path\")\n", " .attr(\"d\", geoPath)\n", " .attr(\"class\", \"countries\")\n", " .style(\"fill\", \"red\")\n", " .style(\"stroke-width\", 3)\n", " .style(\"stroke\", \"black\")\n", " .style(\"fill-opacity\", .25) \n", " \n", "}); \n", "\n", "redraw();\n", "\n", "function redraw() {\n", " var tiles = tile\n", " .scale(zoom.scale())\n", " .translate(zoom.translate())();\n", " \n", " var image = d3.select(\"#map\").select(\"#tiles\")\n", " .attr(\"transform\",\n", " \"scale(\" + tiles.scale + \") translate(\" + tiles.translate + \")\")\n", " .selectAll(\"image\")\n", " .data(tiles, function(d) { return d; });\n", " \n", " image.exit()\n", " .remove();\n", "\n", " image.enter().append(\"image\")\n", " .attr(\"xlink:href\",\n", " function(d) { return \"http://\" \n", " + [\"a\", \"b\", \"c\"][Math.random() * 3 | 0] \n", " + \".tile.openstreetmap.org/\" + d[2] + \"/\" + d[0] + \"/\" + d[1] \n", " + \".png\"; }) \n", " .attr(\"width\", 1)\n", " .attr(\"height\", 1)\n", " .attr(\"x\", function(d) { return d[0]; })\n", " .attr(\"y\", function(d) { return d[1]; });\n", " \n", " projection\n", " .scale(zoom.scale() / 2 / Math.PI)\n", " .translate(zoom.translate());\n", "\n", " d3.select(\"#map\").selectAll(\"path\")\n", " .attr(\"d\", geoPath);\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 円グラフの表示\n", "次に各地域ごとの人口を円グラフで表示します。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "var width = 350,\n", " height = 350,\n", " radius = Math.min(width, height) / 2;\n", "var maxValue = 17744;\n", "d3.select(\"#chart\").select(\"svg\").attr(\"style\", \"width:350px; height:350px;border:1px lightgray solid;\");\n", "\n", "var color = d3.scale.linear()\n", " .interpolate(d3.interpolateHcl)\n", " .domain([0,maxValue]).range([\"yellow\", \"red\"]);\n", "\n", "var arc = d3.svg.arc()\n", " .outerRadius(radius - 10)\n", " .innerRadius(0);\n", "\n", "var labelArc = d3.svg.arc()\n", " .outerRadius(radius - 40)\n", " .innerRadius(radius - 40);\n", "\n", "var pie = d3.layout.pie()\n", " .value(function(d) { d.selected = false; return d.population; });\n", "\n", "var svg = d3.select(\"#chart\").select(\"svg\")\n", " .attr(\"width\", width)\n", " .attr(\"height\", height)\n", " .append(\"g\")\n", " .attr(\"transform\", \"translate(\" + width / 2 + \",\" + height / 2 + \")\");\n", "\n", "d3.csv(\"data/d3.csv\", type, function(error, data) {\n", " var g = svg.selectAll(\".arc\")\n", " .data(pie(data))\n", " .enter().append(\"g\")\n", " .attr(\"class\", \"arc\");\n", "\n", " g.append(\"path\")\n", " .attr(\"d\", arc)\n", " .style(\"stroke\", \"lightgray\")\n", " .style(\"fill\", function(d) { return color(d.data.population); });\n", "\n", "});\n", "\n", "function type(d) {\n", " d.population = +d.population;\n", " return d;\n", "}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%javascript\n", "var width = 350,\n", " height = 350,\n", " radius = Math.min(width, height) / 2;\n", "var maxValue = 17744;\n", "d3.select(\"#chart\").select(\"svg\").attr(\"style\", \"width:350px; height:350px;border:1px lightgray solid;\");\n", "\n", "var color = d3.scale.linear()\n", " .interpolate(d3.interpolateHcl)\n", " .domain([0,maxValue]).range([\"yellow\", \"red\"]);\n", "\n", "var arc = d3.svg.arc()\n", " .outerRadius(radius - 10)\n", " .innerRadius(0);\n", "\n", "var labelArc = d3.svg.arc()\n", " .outerRadius(radius - 40)\n", " .innerRadius(radius - 40);\n", "\n", "var pie = d3.layout.pie()\n", " .value(function(d) { d.selected = false; return d.population; });\n", "\n", "var svg = d3.select(\"#chart\").select(\"svg\")\n", " .attr(\"width\", width)\n", " .attr(\"height\", height)\n", " .append(\"g\")\n", " .attr(\"transform\", \"translate(\" + width / 2 + \",\" + height / 2 + \")\");\n", "\n", "d3.csv(\"data/d3.csv\", type, function(error, data) {\n", " var g = svg.selectAll(\".arc\")\n", " .data(pie(data))\n", " .enter().append(\"g\")\n", " .attr(\"class\", \"arc\");\n", "\n", " g.append(\"path\")\n", " .attr(\"d\", arc)\n", " .style(\"stroke\", \"lightgray\")\n", " .style(\"fill\", function(d) { return color(d.data.population); });\n", "\n", "});\n", "\n", "function type(d) {\n", " d.population = +d.population;\n", " return d;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 地図にマウスイベントを追加\n", "地図にマウスオーバイベントを追加して、マウスの位置の小学校区と表の該当する行を青色に変えて表示します。\n", "また、スプレッドシートが大きく画面では全て表示できないので、mouse-overイベントでその小学校区の情報を表示します。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "d3.select(\"#vectors\").selectAll(\"path.countries\")\n", " .on(\"mouseover\", hover)\n", " .on(\"mouseout\", mouseOut);\n", "\n", "var explode = function(x,index) {\n", " var offset = 10;\n", " var angle = (x.startAngle + x.endAngle) / 2;\n", " var xOff = Math.sin(angle)*offset;\n", " var yOff = -Math.cos(angle)*offset;\n", " return \"translate(\"+xOff+\",\"+yOff+\")\";\n", "};\n", "\n", "var inplode = function(x,index) {\n", " var offset = -0;\n", " var angle = (x.startAngle + x.endAngle) / 2;\n", " var xOff = Math.sin(angle)*offset;\n", " var yOff = -Math.cos(angle)*offset;\n", " return \"translate(\"+xOff+\",\"+yOff+\")\";\n", "};\n", "\n", "function hover(hoverD) {\n", " d3.select(\"#chart\").selectAll(\"path\")\n", " .filter( function (d) { d.data.selected = d.data.schoolDistrict == hoverD.properties.A27_007; return d.data.selected; })\n", " .transition()\n", " .duration(500)\n", " .attr(\"transform\", explode);\n", " d3.selectAll(\"div.datarow\")\n", " .filter( function (d) { return d.schoolDistrict == hoverD.properties.A27_007})\n", " .style(\"background\", \"#94B8FF\")\n", " .style(\"display\", \"block\");\n", " d3.select(\"#vectors\").selectAll(\"path.countries\")\n", " .filter( function (d) { return d == hoverD; })\n", " .style(\"fill\", \"blue\");\n", "};\n", "\n", "function mouseOut() {\n", " d3.select(\"#chart\").selectAll(\"path\")\n", " .filter( function (d) { return d.data.selected; })\n", " .transition()\n", " .duration(500)\n", " .attr(\"transform\", inplode);\n", " d3.selectAll(\"div.datarow\").style(\"display\", \"none\");\n", " d3.select(\"#vectors\").selectAll(\"path.countries\").style(\"fill\", \"red\");\n", "};" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%javascript\n", "d3.select(\"#vectors\").selectAll(\"path.countries\")\n", " .on(\"mouseover\", hover)\n", " .on(\"mouseout\", mouseOut);\n", "\n", "var explode = function(x,index) {\n", " var offset = 10;\n", " var angle = (x.startAngle + x.endAngle) / 2;\n", " var xOff = Math.sin(angle)*offset;\n", " var yOff = -Math.cos(angle)*offset;\n", " return \"translate(\"+xOff+\",\"+yOff+\")\";\n", "};\n", "\n", "var inplode = function(x,index) {\n", " var offset = -0;\n", " var angle = (x.startAngle + x.endAngle) / 2;\n", " var xOff = Math.sin(angle)*offset;\n", " var yOff = -Math.cos(angle)*offset;\n", " return \"translate(\"+xOff+\",\"+yOff+\")\";\n", "};\n", "\n", "function hover(hoverD) {\n", " d3.select(\"#chart\").selectAll(\"path\")\n", " .filter( function (d) { d.data.selected = d.data.schoolDistrict == hoverD.properties.A27_007; return d.data.selected; })\n", " .transition()\n", " .duration(500)\n", " .attr(\"transform\", explode);\n", " d3.selectAll(\"div.datarow\")\n", " .filter( function (d) { return d.schoolDistrict == hoverD.properties.A27_007})\n", " .style(\"background\", \"#94B8FF\")\n", " .style(\"display\", \"block\");\n", " d3.select(\"#vectors\").selectAll(\"path.countries\")\n", " .filter( function (d) { return d == hoverD; })\n", " .style(\"fill\", \"blue\");\n", "};\n", "\n", "function mouseOut() {\n", " d3.select(\"#chart\").selectAll(\"path\")\n", " .filter( function (d) { return d.data.selected; })\n", " .transition()\n", " .duration(500)\n", " .attr(\"transform\", inplode);\n", " d3.selectAll(\"div.datarow\").style(\"display\", \"none\");\n", " d3.select(\"#vectors\").selectAll(\"path.countries\").style(\"fill\", \"red\");\n", "};" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 0 }