22ML_hw3/ml_hw3.ipynb
2022-11-28 20:34:02 +09:00

11897 lines
802 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 기계학습 - 2022년 2학기"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 과제2. 다중계층 신경망을 이용한 얼굴 표정 분류기 작성\n",
"\n",
"과제 문의: 전북대학교 컴퓨터공학부 시각 및 학습 연구실 (공과대학 7호관 7619)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Requirements\n",
"- Python >= 3.6\n",
"- numpy\n",
"- matplotlib\n",
"- jupyterplot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"이번 과제에서는 사람 얼굴의 표정 데이터셋(Toronto Faces Dataset, [TFD](http://aclab.ca/users/josh/TFD.html))을 분류하는 다중계층 신경망(Multi-Layer Neural Net)을 구현하고 테스트 합니다."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"\n",
"import importlib.util\n",
"try:\n",
" importlib.util.find_spec('jupyterplot')\n",
"except ImportError:\n",
" %pip install jupyterplot\n",
" pass\n",
"\n",
"from jupyterplot import ProgressPlot\n",
"\n",
"try:\n",
" importlib.util.find_spec('tqdm')\n",
"except ImportError:\n",
" %pip install tqdm\n",
" pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Toronto Faces Dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"TFD는 1-Anger, 2-Disgust, 3-Fear, 4-Happy, 5-Sad, 6-Suprise, 7-Neutral의 총 7개의 클래스를 가진 데이터셋입니다.\n",
"\n",
"데이터셋은 학습, 검증, 테스트(training, validation, test)를 위해서 각각 3374, 419, 385장의 48 $\\times$ 48 크기 grayscale 이미지를 제공합니다.\n",
"\n",
"데이터셋의 예시를 확인하기 위해 아래 셀들을 실행해보시기 바랍니다."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#### Please DO NOT DELETE this cell. ###\n",
"\n",
"def LoadData(fname):\n",
" \"\"\"Loads data from an NPZ file.\n",
"\n",
" Args:\n",
" fname: NPZ filename.\n",
"\n",
" Returns:\n",
" data: Tuple {inputs, target}_{train, valid, test}.\n",
" Row-major, outer axis to be the number of observations.\n",
" \"\"\"\n",
" npzfile = np.load(fname)\n",
"\n",
" inputs_train = npzfile['inputs_train'].T / 255.0\n",
" inputs_valid = npzfile['inputs_valid'].T / 255.0\n",
" inputs_test = npzfile['inputs_test'].T / 255.0\n",
" target_train = npzfile['target_train'].tolist()\n",
" target_valid = npzfile['target_valid'].tolist()\n",
" target_test = npzfile['target_test'].tolist()\n",
"\n",
" num_class = max(target_train + target_valid + target_test) + 1\n",
" target_train_1hot = np.zeros([num_class, len(target_train)])\n",
" target_valid_1hot = np.zeros([num_class, len(target_valid)])\n",
" target_test_1hot = np.zeros([num_class, len(target_test)])\n",
"\n",
" for ii, xx in enumerate(target_train):\n",
" target_train_1hot[xx, ii] = 1.0\n",
"\n",
" for ii, xx in enumerate(target_valid):\n",
" target_valid_1hot[xx, ii] = 1.0\n",
"\n",
" for ii, xx in enumerate(target_test):\n",
" target_test_1hot[xx, ii] = 1.0\n",
"\n",
" inputs_train = inputs_train.T\n",
" inputs_valid = inputs_valid.T\n",
" inputs_test = inputs_test.T\n",
" target_train_1hot = target_train_1hot.T\n",
" target_valid_1hot = target_valid_1hot.T\n",
" target_test_1hot = target_test_1hot.T\n",
" return inputs_train, inputs_valid, inputs_test, target_train_1hot, target_valid_1hot, target_test_1hot\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"training dataset\n",
"inputs: (3374, 2304) targets: (3374, 7)\n",
"validation dataset\n",
"inputs: (419, 2304) targets: (419, 7)\n",
"test dataset\n",
"inputs: (385, 2304) targets: (385, 7)\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABFEAAACuCAYAAAD+kpJ4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOx9d5hkVbX9qupQVV2de/IMM+QoCA8BFSVLkCBRQJTkU54gggGzRMGIgmMWHRDGBBieARUUww9FUDEiMk+CDBN6ejpWV3d1ddX9/dHfOr3urnOrqwemGvXu7+uvqqtu3XvCPnuvvc4+5ySCIAgQSyyxxBJLLLHEEkssscQSSyyxxBJLVUnOdQFiiSWWWGKJJZZYYoklllhiiSWWWP4VJCZRYoklllhiiSWWWGKJJZZYYoklllhqkJhEiSWWWGKJJZZYYoklllhiiSWWWGKpQWISJZZYYoklllhiiSWWWGKJJZZYYomlBolJlFhiiSWWWGKJJZZYYoklllhiiSWWGiQmUWKJJZZYYoklllhiiSWWWGKJJZZYapCYRIklllhiiSWWWGKJJZZYYoklllhiqUFiEiWWWGKJJZZYYoklllhiiSWWWGKJpQaJSZRYYoklllhiiSWWWGKJJZZYYokllhokJlFiieVfQLbddluce+657v+f/exnSCQS+NnPfjZnZYollihZs2YNjjzySHR0dCCRSODb3/72XBcpln8ROeSQQ/C85z1vrosRSyzPSbn55puRSCTwxBNPzHVRYvk3l1jXYvl3kK2px3UjUR588EG88Y1vxB577IFsNovly5fjla98JR599FHv9eVyGZ/5zGew9957I5PJoKenB4cddhj++Mc/Vlz7j3/8A6961auwYMECZDIZ7LTTTnjPe97zjO4Zy7+P/PWvf8Vpp52G7bffHi0tLZg3bx4OOuggfPe73/Ve/7e//Q1HH300Wltb0d3djde85jXYtGlTxXXr16/H61//emy33XbIZDLYYYcd8Ja3vAWbN2/e2lX6l5J169bhyiuvxB/+8Ie5LspzTraWXSyXy/jwhz+M7bbbDul0GnvttRe++tWveu/5jW98Ay984QvR2dmJnp4eHHzwwfj+97//jOp1zjnn4M9//jOuvfZa3HrrrXjBC17wjO4XyzOT2djARCIR+feyl70sdO21116LE044AQsXLkQikcCVV15ZpxrF8q8uuVwOV1xxBY4++mh0d3cjkUjg5ptvjry+Vr9cq+174IEHcOGFF2LfffdFU1MTEonEs1m9WLaizEZ3ZtPPn/nMZ3Daaadh+fLlSCQSoYkrn9xzzz047LDD0NHRgba2Nuy77774+te//gxqFsu/gszWdn3yk5/EbrvthlQqhaVLl+Itb3kLRkdHQ9esW7cOr371q7HLLrugra0NnZ2d2H///XHLLbcgCILQtdtuu22kj95pp522RpW3ulx33XX/kpNtjfV60Ic+9CHcd999OO2007DXXnthw4YN+OQnP4n/+q//wv33318x83T++edj9erVOPvss/HGN74Ro6OjeOihh9Db2xu67g9/+AMOOeQQLF26FG9961vR09ODf/7zn3jqqacqylDrPWP595Inn3wSIyMjOOecc7BkyRLk83nceeedOOGEE/C5z30Or3/96921a9euxUEHHYSOjg5cd911yOVy+OhHP4o///nPeOCBB9Dc3Axgyoi+6EUvwujoKC688EJss802+OMf/4hPfvKTuPfee/G73/0OyeTW4ygPOuggjI2NufI8l2XdunW46qqrsO2222Lvvfee6+I8p2Rr2cX3vOc9+OAHP4jXve512G+//fCd73wHr3rVq5BIJHDGGWe461auXIk3velNOPbYY/HBD34Q4+PjuPnmm3HcccfhzjvvxMknnzzrOo2NjeHXv/413vOe9+CNb3zjljVMLM+qzMYG3nrrrRW//+1vf4sbb7wRRx55ZOjz9773vVi0aBH22Wcf/OhHP9rq9Yjl30f6+vpw9dVXY/ny5Xj+859fNauyVr8M1G77fvCDH+Cmm27CXnvthe233z6SuI7luSez0Z3Z9POHPvQhjIyMYP/998f69eurlmHVqlV47Wtfi5e97GW47rrr0NDQgL///e/e2ONfVV7zmtfgjDPOQCqVmuuiPKdkNvr3jne8Ax/+8Idx6qmn4pJLLsHDDz+MlStX4q9//WvIZ/b19WHt2rU49dRTsXz5chSLRdx9990499xz8fe//x3XXXedu/aGG25ALpcLPefJJ5/Ee9/73gof/a8i1113HU499VSceOKJc12U2UlQJ7nvvvuCQqEQ+uzRRx8NUqlUcNZZZ4U+//rXvx4ACL75zW9WvWepVAqe97znBQcccECQz+erXlvrPf8TpFQqBWNjY3NdjDmVycnJ4PnPf36wyy67hD5/wxveEGQymeDJJ590n919990BgOBzn/uc+2z16tUBgOB73/te6PeXX355ACD4/e9//6yWd8WKFcE555zzrN6zXvLggw8GAIJVq1bNdVGec7I17OLatWuDpqam4KKLLnKflcvl4KUvfWmwbNmyYHJy0n2+0047Bfvtt19QLpfdZ0NDQ0Fra2twwgknbFGdnnzyyQBA8JGPfGSLfv9MpFgsVrRnLH6JsoE+ee1rXxskEongqaeeCn3++OOPB0EQBJs2bQoABFdcccUzLtfBBx8c7LHHHs/4PrE8t2V8fDxYv359EAQz+4ha/fJsbN+GDRscbrzooouCOsLhZySrVq0KALix958os9Gd2fTzE0884XxhNpuNxFyPP/54kMlkgje96U1bXonnsORyubkuwnNaatW/devWBY2NjcFrXvOa0OcrV64MAAT/+7//O+OzjjvuuCCbzYZsl0+uueaaAEBw33331V6R55BUG29WZqufW9Nm1m05z4tf/OKKWfOddtoJe+yxB/72t7+FPv/Yxz6G/fffHyeddBLK5XJF2hPlxz/+Mf7yl7/giiuuQCaTQT6fR6lU8l5b6z2BqeVB//jHP2asU39/P972trdhzz33RGtrK9rb23HMMcdUpNZz/4pvfOMbuPbaa7Fs2TKk02kcfvjh+L//+7+K+37qU5/C9ttvj0wmg/333x+//OUvccghh+CQQw4JXVcoFHDFFVdgxx13RCqVwjbbbIO3v/3tKBQKoesSiQTe+MY3YvXq1dhjjz2QSqXwwx/+cMb6/TtLQ0MDttlmGwwODoY+v/POO3Hcccdh+fLl7rMjjjgCO++8M77xjW+4z4aHhwEACxcuDP1+8eLFAIBMJuM+GxoawiOPPIKhoaEZyxUEAd7//vdj2bJlaGlpwaGHHoq//vWvFdf59kRZs2YNTjnlFCxatAjpdBrLli3DGWecEXru2NgY3vSmN2HevHloa2vDCSecgKeffroiFf/cc8/FtttuW/HcK6+8siId9u6778ZLXvISdHZ2orW1Fbvssgve/e53u3Lut99+AIDzzjvPpRxWS338T5KtYRe/853voFgs4sILL3SfJRIJvOENb8DatWvx61//2n0+PDyMBQsWhPq0vb0dra2tIR0GarOLV155JVasWAEAuOyyy5BIJEJ69PTTT+P888/HwoULkUqlsMcee+BLX/pS6B4TExO4/PLLse+++6KjowPZbBYvfelLce+994aue+KJJ5BIJPDRj34UN9xwA3bYYQekUik8/PDDVcsYy5RE2UArhUIBd955Jw4++GAsW7Ys9J3PRvgkn8/jkUceQV9fX83le/jhh3HooYeipaUFS5cuxYc//OHQ91uiJx//+MexYsUKZDIZHHzwwfjLX/4Suvbcc89Fa2srHnvsMRx11FHIZrNYsmQJrr76apdSHQQBtt12W7ziFa+oKPP4+Dg6OjpwwQUX1FzP/1RJpVJYtGhRTdfW6pdnY/sWLlxYYeOi5J///CceeeSRmq5duXIl9thjD7S0tKCrqwsveMEL8JWvfMV9/+STT+LCCy/ELrvs4pZknnbaad71+n/9619x2GGHIZPJYNmyZXj/+9+PcrlcUzn+nWU2ujObfl6xYkVNy7o++9nPolQq4eqrrwYwlZkcmCUXlPXr1+ORRx5BsVic8b5f+9rXsO+++6KtrQ3t7e3Yc889ceONN7rvffgL8O/5sO222+K4447Dj3/8Y+y9995Ip9PYfffd8c1vftP725///Oe48MILsWDBAmfnfff97W9/i6OOOgrz5s1DJpPBdttth/PPPz90z3K5jBtuuAF77LEH0uk0Fi5ciAsuuAADAwMztsG/gtSqf7/+9a8xOTkZyoAD4P7/2te+NuM9tt12W+TzeUxMTFS97itf+Qq22247vPjFLw59Xqvtmm2c+pvf/AZHH300Ojo60NLSgoMPPhj33Xdf6Jpa44hEIoHR0VHccsstLkbgUjpe+/DDD+NVr3oVurq68JKXvAQA8Kc//Qnnnnsutt9+e6TTaSxatAjnn39+XbdUmNONZYMgwMaNGzFv3jz32fDwMB544AHst99+ePe7342Ojg60trZi++23DzlLYGo9IjCl0C94wQuQzWbR0tKCM844A/39/Vt0TwA4/PDDcfjhh89Y/sceewzf/va3cdxxx+FjH/sYLrvsMvz5z3/GwQcfjHXr1lVc/8EPfhDf+ta38La3vQ3vete7cP/99+Oss84KXfOZz3wGb3zjG7Fs2TJ8+MMfxktf+lKceOKJWLt2bei6crmME044AR/96Edx/PHHY+XKlTjxxBPx8Y9/HKeffnrFs3/605/izW9+M04//XTceOONNYPffycZHR1FX18f/vGPf+DjH/847rrrrlA/P/300+jt7fXu37D//vvjoYcecv8fdNBBSCaTuOSSS3D//fdj7dq1+MEPfoBrr70WJ554InbddVd37be+9S3stttu+Na3vjVjGS+//HK8733vw/Of/3x85CMfwfbbb48jjzyyKukHTAUURx11FO6//35cfPHF+NSnPoXXv/71eOyxx0JB0rnnnouVK1fi5S9/OT70oQ8hk8ng2GOPnbFcUfLXv/4Vxx13HAqFAq6++mpcf/31OOGEE5wx3W233RzQeP3rX49bb70Vt956Kw466KAtfua/uzxTu/jQQw8hm81it912C32+//77u+8phxxyCH74wx9i5cqVeOKJJ/DII4/goosuwtDQEC655JLQ72uxiyeffDI+/vGPAwDOPPNM3HrrrbjhhhsAABs3bsQLX/hC3HPPPXjjG9+IG2+8ETvuuCNe+9rXumtY15tuugmHHHIIPvShD+HKK6/Epk2bcNRRR3n31Vm1ahVWrlyJ17/+9bj++uvR3d1dtYz/yTKTDfTJD37wAwwODlb4qtnIAw88gN122w2f/OQna7p+YGAARx99NJ7//Ofj+uuvx6677op3vOMduOuuu9w1s9WTL3/5y/jEJz6Biy66CO9617vwl7/8BYcddhg2btwYuq5UKuHoo4/GwoUL8eEPfxj77rsvrrjiClxxxRUApgDfq1/9atx1110hnAEA3/3udzE8PIxXv/rVs2yhWKJkNn55NrZvNnL22WdX3NMnX/jCF/CmN70Ju+++O2644QZcddVV2HvvvfGb3/zGXfPggw/iV7/6Fc444wx84hOfwP/8z//gJz/5CQ455BDk83l33YYNG3DooYfiD3/4A975znfi0ksvxZe//OVQUB3L3Mg999yDXXfdFT/4wQ+wbNkytLW1oaenB+973/sqSK53vetd2G233fD0009Xvefdd9+NM888E11dXfjQhz6ED37wgzjkkEMqAtPZyJo1a3D66afjmGOOwQc+8AE0NjbitNNOw913311x7YUXXoiHH34Yl19+Od75znd679fb24sjjzwSTzzxBN75zndi5cqVOOuss3D//feHrrvgggtw2WWX4cADD8SNN96I8847D6tXr8ZRRx1VE5n07yKc0LYkXktLCwDgd7/7XcVvxsbG0NfXhyeeeAK33HILVq1ahRe96EVVicCHHnoIf/vb3/CqV72q4rtabRelljj1pz/9KQ466CAMDw/jiiuuwHXXXYfBwUEcdthheOCBB2p+FuXWW29FKpXCS1/6Uhcj2ImI0047Dfl8Htdddx1e97rXAZgaM4899hjOO+88rFy5EmeccQa+9rWv4eUvf3kkqfmsy7Oe2zILufXWWwMAwRe/+EX32e9///sAQNDT0xMsXLgw+PSnPx2sXr062H///YNEIhHcdddd7toTTjjBXXvWWWcFd9xxR/C+970vaGxsDF784he7tLzZ3DMIppZOrFixYsbyj4+PB6VSKfTZ448/HqRSqeDqq692n917770BgGC33XYLpZrfeOONAYDgz3/+cxAEQVAoFIKenp5gv/32C4rForvu5ptvDgAEBx98cKjtkslk8Mtf/jL0/M9+9rMVKV0AgmQyGfz1r3+dsU7/znLBBRcEAFx7nHrqqUF/f7/7nml5X/7ylyt+e9lllwUAgvHxcffZTTfdFHR2drp7AgjOOeecUN8FwXQq2UzLWXp7e4Pm5ubg2GOPDS2vePe73+3uTaFO3XvvvUEQBMFDDz0UAAhuv/32yPv/7ne/CwAEl156aejzc889tyIV/5xzzvGOgSuuuCKUDvvxj388ABBs2rQp8rnxcp7ZyTO1i8cee2yw/fbbV9x3dHQ0ABC8853vdJ9t3LgxOPzww0M6PG/evOBXv/pVxe9rtYuPP/64dznPa1/72mDx4sVBX19f6PMzzjgj6OjocCnXk5OTFUtyBgYGgoULFwbnn39+xXPa29uD3t7eGcsVy8w20CennHJKkEqlgoGBgchrZlrOQ3tVy3Kfgw8+uMIOFwqFYNGiRcEpp5ziPputnmQymWDt2rXu89/85jcBgODNb36z++ycc84JAAQXX3yx+6xcLgfHHnts0Nzc7Ozc3//+9wBA8JnPfCb0/BNOOCHYdtttQ/Y7lpmlmo+YjV+eje1TmWmZB3VyJnnFK14x41I039LzX//61xV1vPTSSwMAwW9+8xv3WW9vb9DR0fEfv5xHZTb4YjbLtqotL2hvbw+6urqCVCoVvO997wvuuOOO4FWvepVXx2hTZuqvSy65JGhvb6+6bMPiL4pvucKKFSsCAMGdd97pPhsaGgoWL14c7LPPPhW/fclLXlLxbHvfb33rWwGA4MEHH4ws4y9/+csAQLB69erQ5z/84Q+9n/+rSzX9I+a+5pprQp+zLVpbWyt+84EPfCCExw4//PDgn//8Z9UyvPWtbw0ABA8//HDFd7Xarlrj1HK5HOy0007BUUcdFfJz+Xw+2G677YKXvexl7rNa44ggiB5vvPbMM8+s+M5nS7/61a8GAIJf/OIX7rN/i+U8Vjjj+aIXvQjnnHOO+5yb5WzevBnf+c538IY3vAGvetWr8JOf/AQ9PT14//vfX3Htfvvth9tuuw2nnHIKrr76alxzzTX41a9+hZ/85Cezvicwlf5by1FIqVTKbR5aKpWwefNmt5zh97//fcX15513Xih1/6UvfSmAqYwWYCpNbvPmzXjd616HxsbpPX/POussdHV1he51++23Y7fddsOuu+6Kvr4+93fYYYcBQEVK88EHH4zdd999xjr9O8ull16Ku+++G7fccguOOeYYlEqlUIrc2NgYAHg30Uqn06FrAGDp0qXYf//9ccMNN+Bb3/oW3vKWt2D16tUVLP65556LIAhq2ul9YmICF198cSjV7dJLL52xbh0dHQCAH/3oR6HZLBUu4dJUZwC4+OKLZ7x/lHR2dgKYSqOO04yfuTwbdnFsbKxmHW5pacEuu+yCc845B7fffju+9KUvYfHixTj55JMrUjhrtYs+CYIAd955J44//ngEQRCyWUcddRSGhoaczWxoaHB2slwuo7+/H5OTk3jBC17gtaunnHIK5s+fv0Xl+k+TmWygleHhYXz/+9/Hy1/+cjfWt0QOOeQQBEFQ8+k9ra2toWyO5uZm7L///s5XArPXkxNPPBFLly51/++///444IAD8IMf/KDiWt0QmcthJyYmXPbrzjvvjAMOOACrV6921/X39+Ouu+7CWWedFZ/08izKbPzybGzfbORnP/tZTTObnZ2dWLt2LR588MHIa3RGuVgsYvPmzdhxxx3R2dkZ0tsf/OAHeOELX+iyaABg/vz5zygjLJZnR3K5HAYGBnDVVVfh6quvximnnILVq1fj6KOPxo033oiRkRF37c033+yWAFaTzs5OjI6OerNEtlSWLFmCk046yf3f3t6Os88+Gw899BA2bNgQuvZ1r3sdGhoaZiwjAHzve9+LzCi5/fbb0dHRgZe97GUhP7/vvvuitbW1Ijb5d5b/+q//wgEHHIAPfehDWLVqFZ544gncdddduOCCC9DU1OS1R2eeeSbuvvtufOUrX3GZJdXsVrlcxte+9jXss88+3oyTWm0XZaY49Q9/+APWrFmDV73qVdi8ebPr39HRURx++OH4xS9+sVVigf/5n/+p+Ext6fj4OPr6+vDCF74QALwYYGvInJAoGzZswLHHHouOjg7ccccdoYHLRtluu+1wwAEHuM9bW1tx/PHH44EHHsDk5GTo2jPPPDN0fyrer371q1nfczZSLpfx8Y9/HDvttBNSqRTmzZuH+fPn409/+pN3/wtdzwvAESNcJ/jkk08CAHbcccfQdY2NjRUGeM2aNfjrX/+K+fPnh/523nlnAKg4rWO77babdf3+3WTXXXfFEUccgbPPPhvf+973kMvlXFAHTOuJ3VMGmBqges19992H4447Dtdeey0uueQSnHjiibj++uvx3ve+Fx/72Me2aF8G9r89omz+/PkVJJqV7bbbDm95y1tw0003Yd68eTjqqKPwqU99KqSHTz75JJLJZIUuWH2bjZx++uk48MAD8d///d9YuHAhzjjjDHzjG9+ICZUtkGfTLtaiw8BUiuQ///lP3HzzzTj11FNx3nnn4Wc/+xkmJia8x8RvqWzatAmDg4P4/Oc/X2GzzjvvPABhm3XLLbdgr732QjqdRk9PD+bPn4/vf//7Xrsa27baZSYbaOXOO+/E+Ph43QO3ZcuWVRARXV1dFWvqZ6MnvqMfd9555wpiMJlMYvvtt6+4DkDo2rPPPhv33Xefs9u33347isUiXvOa19Rcz1hmltn45dnYvq0h73jHO9Da2or9998fO+20Ey666KKK5RhjY2O4/PLLsc0224Rw4+DgYIW/9unsLrvsslXrEMvMEhV7nHnmmRgbG9uiZWMXXnghdt55ZxxzzDFYtmwZzj///Ge8d+GOO+5YYUd9tgyozY8efPDBOOWUU3DVVVdh3rx5eMUrXoFVq1aFxtyaNWswNDSEBQsWVPj6XC73H3ca6p133onnP//5OP/887Hddtvh+OOPxytf+Urss88+aG1trbh+xYoVOOKII3DmmWdi9erV2H777XHEEUdEEik///nP8fTTTz9rPnqmOHXNmjUAgHPOOaeif2+66SYUCoWa9n+crfj0s7+/H5dcconb92j+/Pnuuq1RBp/U7YhjytDQEI455hgMDg7il7/8JZYsWRL6nv/bDTsBYMGCBSgWixgdHUVHR0fktQsWLAAw3emzueds5LrrrsP73vc+nH/++bjmmmvQ3d2NZDKJSy+91BtERrG8s2EJKeVyGXvuuSc+9rGPeb/fZpttQv9vbfDwryinnnoqLrjgAjz66KPYZZdd3KawvqPt1q9fj+7ubjfL9bnPfQ4LFy6sWKd9wgkn4Morr8SvfvWrumf+XH/99Tj33HPxne98Bz/+8Y/xpje9CR/4wAdw//33V2wIOZNEzaTajZszmQx+8Ytf4N5778X3v/99/PCHP8TXv/51HHbYYfjxj38848xGLFPybNrFxYsX495770UQBKF+pF7zXo899hh++MMf4vOf/3zoft3d3XjJS17yjNZiW6E9fPWrXx3KsFHZa6+9AAC33XYbzj33XJx44om47LLLsGDBAjQ0NOADH/iAd2Pb2LZtuVgbaGX16tXo6OjAcccdV9dy1eIrZ6snz7acccYZePOb34zVq1fj3e9+N2677Ta84AUviIPcZ1lm45drtX1bS3bbbTf8/e9/x/e+9z388Ic/xJ133olPf/rTuPzyy3HVVVcBmMr8XLVqFS699FK86EUvQkdHhzt+OZ58+NeQJUuWYM2aNTPGHrORBQsW4A9/+AN+9KMf4a677sJdd92FVatW4eyzz8Ytt9wCoHZctiVSix9NJBK44447cP/99+O73/0ufvSjH+H888/H9ddfj/vvvx+tra0ol8tYsGBBKEtP5T8ta3Tp0qX4f//v/2HNmjXYsGEDdtppJyxatAhLlixxhFY1OfXUU/GFL3wBv/jFL3DUUUdVfL969Wokk8kKQm9LZSbfSxv1kY98BHvvvbf3WpJDz6a++vTzla98JX71q1/hsssuw9577+307+ijj66bLa0riTI+Po7jjz8ejz76KO655x5vkLlkyRIsWrTIuwnTunXrkE6n0dbWBgDYd9998YUvfKHiWm7qysE6m3vORu644w4ceuih+OIXvxj6fHBwMLQpZK3CUy3+7//+D4ceeqj7fHJyEk888YQLMgBghx12wB//+EccfvjhcerwFgqZXTKWS5cuxfz58/Hb3/624toHHnggZDA2btzoNQRMcdySzCb2/5o1a0IzoZs2barZKe+5557Yc8898d73vhe/+tWvcOCBB+Kzn/0s3v/+92PFihUol8t4/PHHQzNcvp23u7q6vKd2cNZVJZlMuk1HP/axj+G6667De97zHtx777044ogjYv2cQZ5tu7j33nvjpptuwt/+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kx133BEveclL8IY3vAGFQgE33HADenp68Pa3vz10XTqdxg9/+EOcc845OOCAA3DXXXfh+9//Pt797ndXzDAfe+yx6Onpwe23345jjjnGpfPHUpt88pOfxODgoJvB/+53v4u1a9cCmFr2wiXWtfrlWm0fMDUbeuuttwKAy3Kh7q5YsSK0t83ZZ5+Nn//85zMuvT7yyCOxaNEiHHjggVi4cCH+9re/4ZOf/CSOPfZYlyl43HHH4dZbb0VHRwd23313/PrXv8Y999yDnp6e0L3e/va349Zbb8XRRx+NSy65BNlsFp///OexYsWKUFDynyq16s5s+vm73/0u/vjHPwKYIpn/9Kc/uWtPOOEER2q84hWvwOGHH44PfOAD6Ovrw/Of/3x8+9vfxv/7f/8Pn/vc50KZe+9617twyy234PHHH6+a/fHf//3f6O/vx2GHHYZly5bhySefxMqVK7H33nu7DUOPPPJILF++HK997WsdcfulL30J8+fPxz//+c+Ke+6888547WtfiwcffBALFy7El770JWzcuBGrVq2aZWtPyS233IJPf/rTOOmkk7DDDjtgZGQEX/jCF9De3o6Xv/zlAKb2TbngggvwgQ98AH/4wx9w5JFHoqmpCWvWrMHtt9+OG2+8EaeeeuoWPf+5JLXq3yWXXILx8XHsvffeKBaL+MpXvoIHHngAt9xyS2j/kWuvvRb33Xcfjj76aCxfvhz9/f2488478eCDD+Liiy/27l24evVqpFIph/F9UqvtqlWSySRuuukmHHPMMdhjjz1w3nnnYenSpXj66adx7733or29Hd/97ncB1B5HAFPxyT333IOPfexjWLJkScX+f1ba29tx0EEH4cMf/jCKxSKWLl2KH//4x3j88ceflXrWLM/6eT8RwmOWov6s/OMf/whOOumkoL29PchkMsFhhx0WPPDAAxXXlcvlYOXKlcHOO+8cNDU1Bdtss03w3ve+N5iYmNjie87miOO3vvWtweLFi4NMJhMceOCBwa9//evg4IMPDh1HzKOj7PGzPHrRHo31iU98IlixYkWQSqWC/fffP7jvvvuCfffdNzj66KND101MTAQf+tCHgj322CNIpVJBV1dXsO+++wZXXXVVMDQ05K4DEFx00UUz1uffVb761a8GRxxxRLBw4cKgsbEx6OrqCo444ojgO9/5jvf6v/zlL8GRRx4ZtLS0BJ2dncFZZ50VbNiwoeK6Rx55JDj11FODbbbZJmhqagpWrFgRvO1tbwtGR0dD19V6xHEQBEGpVAquuuoqp1OHHHJI8Je//CVYsWJF1SOOH3vsseD8888PdthhhyCdTgfd3d3BoYceGtxzzz2h+4+OjgYXXXRR0N3dHbS2tgYnnniiO67zgx/8YOjaH//4x8Hznve8oLm5Odhll12C2267reJosp/85CfBK17ximDJkiVBc3NzsGTJkuDMM88MHn300dC9vvOd7wS777570NjYGB93LLK17GKpVAquu+66YMWKFUFzc3Owxx57BLfddlvFdcViMVi5cmWw9957B62trUFra2tw6KGHBj/96U8rrn2mRxwHwdSRyhdddJEbM4sWLQoOP/zw4POf/7y7plwuu7KnUqlgn332Cb73ve9VHJdX7TmxhGW2NvCRRx4JAARvectbqt63mv7SNgXB7I849h0Ta/t/S/Tk+uuvD7bZZpsglUoFL33pS4M//vGPFc/IZrPBP/7xD+cDFi5cGFxxxRVBqVTylvfCCy8MAARf+cpXZqxbLGHhMay+P3scZa1+uVbbR530/Sl+C4Lajwn93Oc+Fxx00EFBT09PkEqlgh122CG47LLLQnhsYGAgOO+884J58+YFra2twVFHHRU88sgjFT4+CILgT3/6U3DwwQcH6XQ6WLp0aXDNNdcEX/ziF+MjjoPadWc2/czjiH1/FrOMjIwEl1xySbBo0aKgubk52HPPPb16VusRx3fccUdw5JFHBgsWLAiam5uD5cuXBxdccEGwfv360HW/+93vggMOOMBd87GPfSzyiONjjz02+NGPfhTstddeQSqVCnbdddeKOIS/9R1bbO/7+9//PjjzzDOD5cuXB6lUKliwYEFw3HHHBb/97W8rfvv5z38+2HfffYNMJhO0tbUFe+65Z/D2t789WLduXdV2+FeRWvVv1apVwfOf//wgm80GbW1tweGHH+7FVz/+8Y+D4447LliyZEnQ1NQUtLW1BQceeGCwatWq0FHClKGhoSCdTgcnn3xy1XLO9ojjWuPUhx56KDj55JOdrVuxYkXwyle+MvjJT35SUa+Z4oggmMIcBx10UJDJZAIAzhby2k2bNlWUee3atcFJJ50UdHZ2Bh0dHcFpp50WrFu3rgJrbM0jjhNB8CzRU7FsNSmXy5g/fz5OPvlk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",
"text/plain": [
"<Figure size 1400x700 with 7 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data = LoadData('./toronto_face.npz')\n",
"inputs = data[:3]\n",
"targets = data[3:]\n",
"inputs = {k:v for k, v in zip(['train', 'valid', 'test'], inputs)}\n",
"targets = {k:v for k, v in zip(['train', 'valid', 'test'], targets)}\n",
"\n",
"print('training dataset')\n",
"print('inputs:', inputs['train'].shape, 'targets:', targets['train'].shape)\n",
"print('validation dataset')\n",
"print('inputs:', inputs['valid'].shape, 'targets:', targets['valid'].shape)\n",
"print('test dataset')\n",
"print('inputs:', inputs['test'].shape, 'targets:', targets['test'].shape)\n",
"\n",
"classes = ['anger', 'disgust', 'fear', 'happy', 'sad', 'suprise', 'neutral']\n",
"_, labels = np.nonzero(targets['train'])\n",
"\n",
"figs, axes = plt.subplots(nrows=1, ncols=7, figsize=(14,7))\n",
"for idx in range(7):\n",
" axis = axes[idx]\n",
" rnd_idx = np.random.choice(np.nonzero(labels == idx)[0])\n",
" axis.axis('off')\n",
" axis.imshow(inputs['train'][rnd_idx].reshape(48, 48), cmap='gray')\n",
" axis.set_title('{}: {}'.format(rnd_idx, classes[idx]))\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Training Multi-layer Neural Networks"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"1. 기본적인 일반화 (basic generalization): 코드에 주어진 hyperparameter 들을 이용하여 신경망을 학습시킨다. 학습 오차(training error)와 일반화를 위한 검증 오차(validation error) 결과가 어떻게 다른지 설명한다. 두 가지 경우(학습과 일반화 검증)에 대해 오차 커브(error curve)를 그래프로 제시하시오."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. 최적화 (optimization): Learning rate, momentum, mini-batch size 세 가지 종류의 parameter 들을 아래와 같이 변화시키면서 다양한 조합들에 대해 신경망이 cross-entropy 관점에서 어떻게 수렴하는지 살펴본다. 가장 우수한 성능을 나타내는 hyperparameter 들의 조합이 어떤 것인지 제시하시오. (모든 경우의 수를 다 따지면 75 가지 신경망 모델을 테스트해야 하나 시간이 너무 많이 결릴 수 있으므로 이 중에서 일부분의 경우들만 테스트해도 된다. 그러나 어떤 근거로 해당 조합들만 테스트했는지 적당한 설명이 있어야 함.)\n",
" - Learning rate ( $\\epsilon$ ): 0.001 에서 1.0 사이의 5 가지 경우\n",
" - Momentum: 0.0 에서 0.9 사이의 3 가지 경우\n",
" - Mini-batch size: 1 에서 1000 까지의 5 가지 경우"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"3. 신경망 모델 구조 변경: Momentum 을 0.9로 고정시킨 상태에서 신경망의 hidden unit 들의 갯수를 2 에서 100 사이의 3 가지 다른 경우에 대해 성능을 비교한다. 필요한 경우 learning rate 와 학습 기간(epochs)은 신경망 구조에 따라 적당하게 변경할 수 있다. Hidden unit 의 갯수들이 학습에서의 수렴과 신경망의 일반화 성는에 미치는 영향에 대한 데이터(표나 그래프)를 제시하고 경향을 분석하시오."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Method and Class Definitions for Neural Networks"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Utility methods"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def Save(fname: str, data):\n",
" \"\"\"Saves the model to a numpy file.\"\"\"\n",
" print('Writing to ' + fname)\n",
" np.savez_compressed(fname, **data)\n",
"\n",
"\n",
"def Load(fname: str):\n",
" \"\"\"Loads model from numpy file.\"\"\"\n",
" print('Loading from ' + fname)\n",
" return dict(np.load(fname))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Utility Classes"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"from dataclasses import dataclass, fields, asdict\n",
"from os import PathLike\n",
"from typing import List, Tuple, Dict, Any, Union, Optional, TextIO\n",
"import json\n",
"\n",
"\n",
"class BaseDataclass:\n",
" def to_dict(self):\n",
" return asdict(self)\n",
"\n",
" def to_json(self, fp: Union[str, PathLike, TextIO]):\n",
" json.dump(self.to_dict(), fp, indent=2)\n",
"\n",
" @classmethod\n",
" def from_dict(cls, d: Dict[str, Any]):\n",
" return cls(**d)\n",
"\n",
" @classmethod\n",
" def from_json_stream(cls, fp: TextIO):\n",
" return cls.from_dict(json.load(fp))\n",
" \n",
" @classmethod\n",
" def load_from_json(cls, fp_or_name: Union[str, PathLike, TextIO]):\n",
" if isinstance(fp_or_name, str) or isinstance(fp_or_name, PathLike):\n",
" with open(fp_or_name, 'r') as fp:\n",
" return cls.from_json_stream(fp)\n",
" else:\n",
" return cls.from_json_stream(fp_or_name)\n",
" \n",
" def save_json(self, fp_or_name: Union[str, PathLike, TextIO]):\n",
" if isinstance(fp_or_name, str) or isinstance(fp_or_name, PathLike):\n",
" with open(fp_or_name, 'w') as fp:\n",
" self.to_json(fp)\n",
" else:\n",
" self.to_json(fp_or_name)\n",
" \n",
" def keys(self):\n",
" return [f.name for f in fields(self)]\n",
" \n",
" def values(self):\n",
" return [getattr(self, f.name) for f in fields(self)]\n",
" \n",
" def items(self):\n",
" return [(f.name, getattr(self, f.name)) for f in fields(self)]\n",
" \n",
" def copy(self):\n",
" return self.from_dict(self.to_dict())\n",
"\n",
" def __getitem__(self, key):\n",
" return getattr(self, key)\n",
"\n",
" def __setitem__(self, key, value):\n",
" return setattr(self, key, value)\n",
"\n",
" def __iter__(self):\n",
" return iter(self.keys())\n",
"\n",
"@dataclass\n",
"class Config(BaseDataclass):\n",
" \"\"\"Configuration for the neural network.\"\"\"\n",
" num_inputs: int = 2304\n",
" num_hiddens: Tuple[int,int] = (16, 8)\n",
" num_outputs: int = 7\n",
" eps: float = 1e-3\n",
" momentum: float = 0.9\n",
" num_epochs: int = 100\n",
" batch_size: int = 128\n",
" early_stopping: bool = True\n",
" patience: int = 10\n",
"\n",
"@dataclass\n",
"class ModelWeights(BaseDataclass):\n",
" \"\"\"Model for the neural network.\"\"\"\n",
" W1: np.ndarray\n",
" b1: np.ndarray\n",
" W2: np.ndarray\n",
" b2: np.ndarray\n",
" W3: np.ndarray\n",
" b3: np.ndarray\n",
"\n",
" \n",
" def to_json(cls, fp: Union[str, PathLike, TextIO]):\n",
" raise NotImplementedError('Cannot save model weights to JSON.')\n",
" \n",
" def save_json(cls, fp_or_name: Union[str, PathLike, TextIO]):\n",
" raise NotImplementedError('Cannot save model weights to JSON.')\n",
"\n",
" @classmethod\n",
" def from_json_stream(cls, fp: TextIO):\n",
" raise NotImplementedError('Cannot load model weights from JSON.')\n",
"\n",
" @classmethod\n",
" def load_from_json(cls, fp_or_name: Union[str, PathLike, TextIO]):\n",
" raise NotImplementedError('Cannot load model weights from JSON.')\n",
" \n",
" def copy(self):\n",
" return ModelWeights(\n",
" W1=self.W1.copy(),\n",
" b1=self.b1.copy(),\n",
" W2=self.W2.copy(),\n",
" b2=self.b2.copy(),\n",
" W3=self.W3.copy(),\n",
" b3=self.b3.copy(),\n",
" )\n",
"\n",
" def save(self, fp: Union[str, PathLike, TextIO]):\n",
" \"\"\"Saves the model to a numpy file.\"\"\"\n",
" np.savez_compressed(fp, **asdict(self))\n",
"\n",
" @classmethod\n",
" def load(cls, fp: Union[str, PathLike, TextIO]):\n",
" \"\"\"Loads model from numpy file.\"\"\"\n",
" # Since the numpy version after 1.16.2, In response to CVE-2019-6446(https://nvd.nist.gov/vuln/detail/CVE-2019-6446),\n",
" # np.savez_compressed allow_pickle=False by default.\n",
" # In 1.16.2 and earlier, Arbitrary code execution can be performed by loading a maliciously crafted .npy file.\n",
" # So, I set allow_pickle=False to prevent this vulnerability.\n",
" data = dict(np.load(fp, allow_pickle=False))\n",
" \n",
" return cls(**data)\n",
"\n",
"@dataclass\n",
"class Statistic(BaseDataclass):\n",
" \"\"\"Statistics for the neural network.\"\"\"\n",
" train_ce: List[Tuple[int, float]]\n",
" valid_ce: List[Tuple[int, float]]\n",
" train_acc: List[Tuple[int, float]]\n",
" valid_acc: List[Tuple[int, float]]\n",
" test_ce: float\n",
" test_acc: float\n",
"\n",
" def keys(self):\n",
" return [f.name for f in fields(self)]\n",
" \n",
" def __getitem__(self, key):\n",
" return getattr(self, key)\n",
"\n",
" def best_valid_acc(self):\n",
" return max(self.valid_acc, key=lambda x: x[1])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"if False:\n",
" import io\n",
" # Test the dataclass\n",
" # Config\n",
" config = Config(2304, (100, 50), 7, 0.01, 0.9, 100, 100)\n",
" fp = io.StringIO()\n",
" config.save_json(fp)\n",
" fp.seek(0)\n",
" config = Config.load_from_json(fp)\n",
" print(config)\n",
"\n",
" # ModelWeights\n",
" model = ModelWeights(np.random.randn(2304, 100), np.random.randn(100), np.random.randn(100, 50), np.random.randn(50), np.random.randn(50, 7), np.random.randn(7))\n",
" fp = io.BytesIO()\n",
" model.save(fp)\n",
" fp.seek(0)\n",
" model = ModelWeights.load(fp)\n",
" print(model.keys())\n",
" \n",
" # Statistic\n",
" stat = Statistic([(1, 0.1), (2, 0.2)], [(1, 0.3), (2, 0.4)], [(1, 0.5), (2, 0.6)], [(1, 0.7), (2, 0.8)], 0.9, 1.0)\n",
" fp = io.StringIO()\n",
" stat.save_json(fp)\n",
" fp.seek(0)\n",
" stat = Statistic.load_from_json(fp)\n",
" print(stat.keys())\n",
" print(stat.best_valid_acc())\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Neural Networks\n",
"아래는 neural networks 의 초기화 및 forward pass를 구현한 코드 입니다."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def Affine(x: np.ndarray, w: np.ndarray, b: np.ndarray) -> np.ndarray:\n",
" \"\"\"Computes the affine transformation.\n",
"\n",
" Args:\n",
" x: Inputs\n",
" w: Weights\n",
" b: Bias\n",
"\n",
" Returns:\n",
" y: Outputs\n",
" \"\"\"\n",
" # y = np.dot(w.T, x) + b\n",
" y = x.dot(w) + b\n",
" return y\n",
"\n",
"def ReLU(x: np.ndarray) -> np.ndarray:\n",
" \"\"\"Computes the ReLU activation function.\n",
"\n",
" Args:\n",
" x: Inputs\n",
"\n",
" Returns:\n",
" y: Activation\n",
" \"\"\"\n",
" return np.maximum(x, 0.0)\n",
"\n",
"def Softmax(x: np.ndarray) -> np.ndarray:\n",
" \"\"\"Computes the softmax activation function.\n",
"\n",
" Args:\n",
" x: Inputs\n",
"\n",
" Returns:\n",
" y: Activation\n",
" \"\"\"\n",
" x -= np.max(x, axis=1, keepdims=True)\n",
" return np.exp(x) / np.exp(x).sum(axis=1, keepdims=True)\n",
"\n",
"def InitMLP(num_inputs: int, num_hiddens: Tuple[int, int], num_outputs: int):\n",
" \"\"\"Initializes NN parameters.\n",
"\n",
" Args:\n",
" num_inputs: Number of input units.\n",
" num_hiddens: List of two elements, hidden size for each layer.\n",
" num_outputs: Number of output units.\n",
"\n",
" Returns:\n",
" model: Randomly initialized network weights.\n",
" \"\"\"\n",
" W1 = 0.1 * np.random.randn(num_inputs, num_hiddens[0])\n",
" W2 = 0.1 * np.random.randn(num_hiddens[0], num_hiddens[1])\n",
" W3 = 0.01 * np.random.randn(num_hiddens[1], num_outputs)\n",
" b1 = np.zeros((num_hiddens[0]))\n",
" b2 = np.zeros((num_hiddens[1]))\n",
" b3 = np.zeros((num_outputs))\n",
" model = ModelWeights(W1, b1, W2, b2, W3, b3)\n",
" return model\n",
"\n",
"def NNForward(model: ModelWeights, x: np.ndarray) -> Dict[str, np.ndarray]:\n",
" \"\"\"Runs the forward pass.\n",
"\n",
" Args:\n",
" model: Dictionary of all the weights.\n",
" x: Input to the network.\n",
"\n",
" Returns:\n",
" var: Dictionary of all intermediate variables.\n",
" \"\"\"\n",
" h1 = Affine(x, model.W1, model.b1)\n",
" h1r = ReLU(h1)\n",
" h2 = Affine(h1r, model.W2, model.b2)\n",
" h2r = ReLU(h2)\n",
" y = Affine(h2r, model.W3, model.b3)\n",
" var = {\n",
" 'x': x,\n",
" 'h1': h1,\n",
" 'h1r': h1r,\n",
" 'h2': h2,\n",
" 'h2r': h2r,\n",
" 'y': y\n",
" }\n",
" return var"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"아래는 neural networks 의 backward 구현하기 위한 코드들입니다.\n",
"아래 세 부분을 채워 코드를 완성시키기 바랍니다.\n",
"\n",
"1. Affine layer 의 backward pass equations (linear trainsformation + bias).\n",
"2. RELU activation function 의 backward pass equations.\n",
"3. Momentum 이 포함된 weight update equations."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def AffineBackward(grad_y: np.ndarray, x: np.ndarray, w: np.ndarray) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:\n",
" \"\"\"Computes gradients of affine transformation.\n",
"\n",
" Args:\n",
" grad_y: gradient from last layer\n",
" x: inputs\n",
" w: weights\n",
"\n",
" Returns:\n",
" grad_x: Gradients wrt. the inputs.\n",
" grad_w: Gradients wrt. the weights.\n",
" grad_b: Gradients wrt. the biases.\n",
" \"\"\"\n",
" grad_x = grad_y.dot(w.T)\n",
" grad_w = x.T.dot(grad_y)\n",
" grad_b = np.sum(grad_y, axis=0)\n",
" return grad_x, grad_w, grad_b"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def ReLUBackward(grad_y: np.ndarray, x: np.ndarray, y: np.ndarray) -> np.ndarray:\n",
" \"\"\"Computes gradients of the ReLU activation function.\n",
"\n",
" Returns:\n",
" grad_x: Gradients wrt. the inputs.\n",
" \"\"\"\n",
" grad_x = grad_y * (x > 0)\n",
" return grad_x"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def NNBackward(model: ModelWeights, err: np.ndarray, var: Dict[str, np.ndarray]) -> Dict[str, np.ndarray]:\n",
" \"\"\"Runs the backward pass.\n",
"\n",
" Args:\n",
" model: Dictionary of all the weights.\n",
" err: Gradients to the output of the network.\n",
" var: Intermediate variables from the forward pass.\n",
" Returns:\n",
" grads: Gradients to all the weights.\n",
" \"\"\"\n",
" dE_dh2r, dE_dW3, dE_db3 = AffineBackward(err, var['h2r'], model['W3'])\n",
" dE_dh2 = ReLUBackward(dE_dh2r, var['h2'], var['h2r'])\n",
" dE_dh1r, dE_dW2, dE_db2 = AffineBackward(dE_dh2, var['h1r'], model['W2'])\n",
" dE_dh1 = ReLUBackward(dE_dh1r, var['h1'], var['h1r'])\n",
" _, dE_dW1, dE_db1 = AffineBackward(dE_dh1, var['x'], model['W1'])\n",
"\n",
" grads = {}\n",
" grads['W1'] = dE_dW1\n",
" grads['W2'] = dE_dW2\n",
" grads['W3'] = dE_dW3\n",
" grads['b1'] = dE_db1\n",
" grads['b2'] = dE_db2\n",
" grads['b3'] = dE_db3\n",
" return grads"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def InitMomentumState(model: ModelWeights) -> Dict[str, np.ndarray]:\n",
" \"\"\"Initializes momentums for all the weights.\n",
"\n",
" Args:\n",
" model: Dictionary of all the weights.\n",
"\n",
" Returns:\n",
" momentums: Dictionary of all the momentums.\n",
" \"\"\"\n",
" momentums = {}\n",
" for key in model.keys():\n",
" momentums[key] = np.zeros_like(model[key])\n",
" return momentums\n",
"\n",
"def NNUpdate(model: ModelWeights, eps: float, momentum: float, optimizer_state: Dict[str, np.ndarray], grads: Dict[str, np.ndarray]):\n",
" \"\"\"Update NN weights.\n",
"\n",
" Args:\n",
" model: Dictionary of all the weights.\n",
" eps: Learning rate.\n",
" momentum: Momentum.\n",
" optimizer_state: State of the optimizer.\n",
" tape: Gradients to all the weights.\n",
" \"\"\"\n",
" for key in model:\n",
" # Momentum update\n",
" # optimizer state is the velocity\n",
" optimizer_state[key] = momentum * optimizer_state[key] - eps * grads[key]\n",
" model[key] += optimizer_state[key]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 훈련"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def Train(model, forward, backward, update, eps, momentum, num_epochs,\n",
" batch_size):\n",
" \"\"\"Trains a simple MLP.\n",
"\n",
" Args:\n",
" model: Dictionary of model weights.\n",
" forward: Forward prop function.\n",
" backward: Backward prop function.\n",
" update: Update weights function.\n",
" eps: Learning rate.\n",
" momentum: Momentum.\n",
" num_epochs: Number of epochs to run training for.\n",
" batch_size: Mini-batch size, -1 for full batch.\n",
"\n",
" Returns:\n",
" stats: Dictionary of training statistics.\n",
" - train_ce: Training cross entropy.\n",
" - valid_ce: Validation cross entropy.\n",
" - train_acc: Training accuracy.\n",
" - valid_acc: Validation accuracy.\n",
" \"\"\"\n",
" inputs_train, inputs_valid, inputs_test, target_train, target_valid, \\\n",
" target_test = LoadData('./toronto_face.npz')\n",
" rnd_idx = np.arange(inputs_train.shape[0])\n",
" train_ce_list = []\n",
" valid_ce_list = []\n",
" train_acc_list = []\n",
" valid_acc_list = []\n",
" \n",
" num_train_cases = inputs_train.shape[0]\n",
" if batch_size == -1:\n",
" batch_size = num_train_cases\n",
" num_steps = int(np.ceil(num_train_cases / batch_size))\n",
"\n",
" pp = ProgressPlot(\n",
" plot_names=['Cross entropy', 'Accuracy'],\n",
" line_names=['Train', 'Validation'],\n",
" x_label='Iteration',\n",
" x_lim=[0, num_epochs*num_steps]\n",
" )\n",
" optimizer_state = InitMomentumState(model)\n",
"\n",
" valid_ce = 0\n",
" valid_acc = 0\n",
" for epoch in range(num_epochs):\n",
" np.random.shuffle(rnd_idx)\n",
" inputs_train = inputs_train[rnd_idx]\n",
" target_train = target_train[rnd_idx]\n",
" for step in range(num_steps):\n",
" # Forward prop.\n",
" start = step * batch_size\n",
" end = min(num_train_cases, (step + 1) * batch_size)\n",
" x = inputs_train[start: end]\n",
" t = target_train[start: end]\n",
"\n",
" var = forward(model, x)\n",
" prediction = Softmax(var['y'])\n",
"\n",
" train_ce = -np.sum(t * np.log(prediction)) / x.shape[0]\n",
" train_acc = (np.argmax(prediction, axis=1) ==\n",
" np.argmax(t, axis=1)).astype('float').mean()\n",
" pp.update([[train_ce, valid_ce], [train_acc, valid_acc]])\n",
"\n",
" # Compute error.\n",
" error = (prediction - t) / x.shape[0]\n",
"\n",
" # Backward prop.\n",
" grads = backward(model, error, var)\n",
"\n",
" # Update weights.\n",
" update(model, eps, momentum, optimizer_state, grads)\n",
"\n",
" valid_ce, valid_acc = Evaluate(\n",
" inputs_valid, target_valid, model, forward, batch_size=batch_size)\n",
" \n",
" pp.update([[train_ce, valid_ce], [train_acc, valid_acc]])\n",
" train_ce_list.append((epoch, train_ce))\n",
" train_acc_list.append((epoch, train_acc))\n",
" valid_ce_list.append((epoch, valid_ce))\n",
" valid_acc_list.append((epoch, valid_acc))\n",
"\n",
" # print()\n",
" train_ce, train_acc = Evaluate(\n",
" inputs_train, target_train, model, forward, batch_size=batch_size)\n",
" valid_ce, valid_acc = Evaluate(\n",
" inputs_valid, target_valid, model, forward, batch_size=batch_size)\n",
" test_ce, test_acc = Evaluate(\n",
" inputs_test, target_test, model, forward, batch_size=batch_size)\n",
" print('CE: Train %.5f Validation %.5f Test %.5f' %\n",
" (train_ce, valid_ce, test_ce))\n",
" print('Acc: Train {:.5f} Validation {:.5f} Test {:.5f}'.format(\n",
" train_acc, valid_acc, test_acc))\n",
" pp.finalize()\n",
" stats = {\n",
" 'train_ce': train_ce_list,\n",
" 'valid_ce': valid_ce_list,\n",
" 'train_acc': train_acc_list,\n",
" 'valid_acc': valid_acc_list\n",
" }\n",
"\n",
" return model, stats\n",
"\n",
"def Evaluate(inputs, target, model, forward, batch_size=-1):\n",
" \"\"\"Evaluates the model on inputs and target.\n",
"\n",
" Args:\n",
" inputs: Inputs to the network.\n",
" target: Target of the inputs.\n",
" model: Dictionary of network weights.\n",
" \"\"\"\n",
" num_cases = inputs.shape[0]\n",
" if batch_size == -1:\n",
" batch_size = num_cases\n",
" num_steps = int(np.ceil(num_cases / batch_size))\n",
" ce = 0.0\n",
" acc = 0.0\n",
" for step in range(num_steps):\n",
" start = step * batch_size\n",
" end = min(num_cases, (step + 1) * batch_size)\n",
" x = inputs[start: end]\n",
" t = target[start: end]\n",
" prediction = Softmax(forward(model, x)['y'])\n",
" ce += -np.sum(t * np.log(prediction))\n",
" acc += (np.argmax(prediction, axis=1) == np.argmax(\n",
" t, axis=1)).astype('float').sum()\n",
" ce /= num_cases\n",
" acc /= num_cases\n",
" return ce, acc"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def CheckGrad(model, forward, backward, name, x):\n",
" \"\"\"Check the gradients\n",
"\n",
" Args:\n",
" model: Dictionary of network weights.\n",
" name: Weights name to check.\n",
" x: Fake input.\n",
" \"\"\"\n",
" np.random.seed(0)\n",
" var = forward(model, x)\n",
" loss = lambda y: 0.5 * (y ** 2).sum()\n",
" grad_y = var['y']\n",
" grads = backward(model, grad_y, var)\n",
" grad_w = grads[name].ravel()\n",
" w_ = model[name].ravel()\n",
" eps = 1e-7\n",
" grad_w_2 = np.zeros(w_.shape)\n",
" check_elem = np.arange(w_.size)\n",
" np.random.shuffle(check_elem)\n",
" # Randomly check 20 elements.\n",
" check_elem = check_elem[:20]\n",
" for ii in check_elem:\n",
" w_[ii] += eps\n",
" err_plus = loss(forward(model, x)['y'])\n",
" w_[ii] -= 2 * eps\n",
" err_minus = loss(forward(model, x)['y'])\n",
" w_[ii] += eps\n",
" grad_w_2[ii] = (err_plus - err_minus) / 2 / eps\n",
" np.testing.assert_almost_equal(grad_w[check_elem], grad_w_2[check_elem],\n",
" decimal=3)\n",
"\n",
"\n",
"def main():\n",
" \"\"\"Trains a NN.\"\"\"\n",
" model_fname = 'nn_model.npz'\n",
" stats_fname = 'nn_stats.npz'\n",
"\n",
" # Hyper-parameters. Modify them if needed.\n",
" num_hiddens = [16, 32]\n",
" eps = 0.01\n",
" momentum = 0.0\n",
" num_epochs = 1000\n",
" batch_size = 100\n",
"\n",
" # Input-output dimensions.\n",
" num_inputs = 2304\n",
" num_outputs = 7\n",
"\n",
" # Initialize model.\n",
" model = InitMLP(num_inputs, num_hiddens, num_outputs)\n",
"\n",
" # Uncomment to reload trained model here.\n",
" # model = Load(model_fname)\n",
"\n",
" # Check gradient implementation.\n",
" print('Checking gradients...')\n",
" x = np.random.rand(10, 48 * 48) * 0.1\n",
" CheckGrad(model, NNForward, NNBackward, 'W3', x)\n",
" CheckGrad(model, NNForward, NNBackward, 'b3', x)\n",
" CheckGrad(model, NNForward, NNBackward, 'W2', x)\n",
" CheckGrad(model, NNForward, NNBackward, 'b2', x)\n",
" CheckGrad(model, NNForward, NNBackward, 'W1', x)\n",
" CheckGrad(model, NNForward, NNBackward, 'b1', x)\n",
" print('Done.')\n",
" # Train model.\n",
" print('training...')\n",
" trained_model, stats = Train(model, NNForward, NNBackward, NNUpdate, eps,\n",
" momentum, num_epochs, batch_size)\n",
"\n",
" plt.figure(0)\n",
" plt.plot(np.array(stats['train_ce'])[:, 0], np.array(stats['train_ce'])[:, 1], 'b', label='Train')\n",
" plt.plot(np.array(stats['valid_ce'])[:, 0], np.array(stats['valid_ce'])[:, 1], 'orange', label='Validation')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Cross Entropy')\n",
" plt.legend()\n",
"\n",
" plt.figure(1)\n",
" plt.plot(np.array(stats['train_acc'])[:, 0], np.array(stats['train_acc'])[:, 1], 'b', label='Train')\n",
" plt.plot(np.array(stats['valid_acc'])[:, 0], np.array(stats['valid_acc'])[:, 1], 'orange', label='Validation')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Accuracy')\n",
" plt.legend()\n",
" plt.show()\n",
" # Uncomment if you wish to save the model.\n",
" Save(model_fname, model)\n",
"\n",
" # Uncomment if you wish to save the training statistics.\n",
" Save(stats_fname, stats)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Early Stopping 이 적용된 훈련"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"사양이 좋지 않은 컴퓨터에서 `ProgressPlot` 이 항목 수가 많아지면서(약 10000부터) 더 이상 그래프가 제대로 그리지 못하고 느려지는 있습니다. 이 문제는 `ProgressPlot`이 그래프를 그리는 것이 O(N)의 복잡도를 가져서 그렇습니다. 이를 해결하기 위해 `ProgressPlot`에서 `Tqdm` 으로 변경하였습니다. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"from tqdm import tqdm\n",
"\n",
"def TrainAdvanced(model: ModelWeights, \n",
" forward=NNForward,\n",
" backward=NNBackward,\n",
" update=NNUpdate,\n",
" eps = 0.01,\n",
" momentum = 0.0,\n",
" num_epochs = 1000,\n",
" batch_size = 100,\n",
" early_stopping: bool = True,\n",
" patience: int = 10,\n",
" verbose: bool = True,\n",
" tqdm_leave: bool = True,\n",
" pplot: bool = False,\n",
" ) -> Tuple[ModelWeights, Statistic]:\n",
" \"\"\"Trains a simple MLP.\n",
"\n",
" Args:\n",
" model: Dictionary of model weights.\n",
" forward: Forward prop function.\n",
" backward: Backward prop function.\n",
" update: Update weights function.\n",
" eps: Learning rate.\n",
" momentum: Momentum.\n",
" num_epochs: Number of epochs to run training for.\n",
" batch_size: Mini-batch size, -1 for full batch.\n",
" early_stopping: Whether to use early stopping.\n",
" patience: Number of epochs to wait before early stopping.\n",
" verbose: Whether to print training statistics.\n",
" tqdm_leave: Whether to leave tqdm progress bar.\n",
" pplot: Whether to plot training statistics.\n",
"\n",
" Returns:\n",
" model: Trained model.\n",
" stats: Dictionary of training statistics.\n",
" - train_ce: Training cross entropy.\n",
" - valid_ce: Validation cross entropy.\n",
" - train_acc: Training accuracy.\n",
" - valid_acc: Validation accuracy.\n",
" \"\"\"\n",
" # load data\n",
" inputs_train, inputs_valid, inputs_test, target_train, target_valid, \\\n",
" target_test = LoadData('./toronto_face.npz')\n",
" \n",
" rnd_idx = np.arange(inputs_train.shape[0])\n",
" train_ce_list = []\n",
" valid_ce_list = []\n",
" train_acc_list = []\n",
" valid_acc_list = []\n",
" \n",
" num_train_cases = inputs_train.shape[0]\n",
" if batch_size == -1 or batch_size > num_train_cases or batch_size == 0:\n",
" batch_size = num_train_cases\n",
" num_steps = int(np.ceil(num_train_cases / batch_size))\n",
"\n",
" try:\n",
" if pplot:\n",
" # initialize plot\n",
" pp = ProgressPlot(\n",
" plot_names=['Cross entropy', 'Accuracy'],\n",
" line_names=['Train', 'Validation'],\n",
" x_label='Iteration',\n",
" x_lim=[0, num_epochs]\n",
" )\n",
" pbar = range(num_epochs)\n",
" else:\n",
" # Tqdm progress bar.\n",
" pbar = tqdm(range(num_epochs), disable=not verbose or num_epochs == 1, leave=tqdm_leave)\n",
"\n",
" # Initialize optimizer state\n",
" optimizer_state = InitMomentumState(model)\n",
"\n",
" # Initialize stats.\n",
" valid_ce = 0\n",
" valid_acc = 0\n",
"\n",
" # Early stopping\n",
" best_valid_ce = np.inf\n",
" best_valid_acc = 0\n",
" best_epoch = 0\n",
" best_model = None\n",
"\n",
" epsilon = np.finfo(float).eps\n",
"\n",
" for epoch in pbar:\n",
" np.random.shuffle(rnd_idx)\n",
" inputs_train = inputs_train[rnd_idx]\n",
" target_train = target_train[rnd_idx]\n",
"\n",
" train_ce = 0\n",
" train_acc = 0\n",
" for step in range(num_steps):\n",
" # Get mini-batch.\n",
" start = step * batch_size\n",
" # min is used to handle the case when batch_size does not divide num_train_cases\n",
" end = min(num_train_cases, (step + 1) * batch_size)\n",
"\n",
" input_batch = inputs_train[start: end]\n",
" target_batch = target_train[start: end]\n",
"\n",
" # Forward prop.\n",
" var = forward(model, input_batch)\n",
" prediction = Softmax(var['y'])\n",
"\n",
" # Compute loss.\n",
" train_ce += -np.sum(target_batch * np.log(prediction + epsilon)) / input_batch.shape[0]\n",
" train_acc += (np.argmax(prediction, axis=1) ==\n",
" np.argmax(target_batch, axis=1)).astype('float').sum()\n",
"\n",
" # Compute error.\n",
" error = (prediction - target_batch) / input_batch.shape[0]\n",
"\n",
" # Backward prop.\n",
" grads = backward(model, error, var)\n",
"\n",
" # Update weights.\n",
" update(model, eps, momentum, optimizer_state, grads)\n",
"\n",
" train_ce /= num_steps\n",
" train_acc /= num_train_cases\n",
"\n",
" # Compute validation error.\n",
" valid_ce, valid_acc = Evaluate(\n",
" inputs_valid, target_valid, model, forward, batch_size=batch_size)\n",
"\n",
" train_ce_list.append((epoch, train_ce))\n",
" train_acc_list.append((epoch, train_acc))\n",
" valid_ce_list.append((epoch, valid_ce))\n",
" valid_acc_list.append((epoch, valid_acc))\n",
"\n",
" if pplot:\n",
" # Update plot.\n",
" pp.update([[train_ce, valid_ce], [train_acc, valid_acc]])\n",
" else:\n",
" # Tqdm progress bar.\n",
" pbar.set_description(f\"Train CE: {train_ce:.4f}, Valid CE: {valid_ce:.4f}, Train Acc: {train_acc:.4f}, Valid Acc: {valid_acc:.4f}\")\n",
"\n",
" # Early stopping.\n",
" if valid_ce < best_valid_ce:\n",
" best_valid_ce = valid_ce\n",
" best_valid_acc = valid_acc\n",
" best_epoch = epoch\n",
" best_model = model.copy()\n",
" elif early_stopping and epoch - best_epoch >= patience:\n",
" model = best_model\n",
" break\n",
" \n",
" test_ce, test_acc = Evaluate(\n",
" inputs_test, target_test, model, forward, batch_size=batch_size)\n",
"\n",
" stats = Statistic(train_ce_list, valid_ce_list, train_acc_list, valid_acc_list,\n",
" test_ce=test_ce, test_acc=test_acc)\n",
" finally:\n",
" if not pplot:\n",
" pbar.close()\n",
" else:\n",
" pp.finalize()\n",
" \n",
" return model, stats"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"def TrainMLP(conf: Config, pplot: bool = False) -> Tuple[ModelWeights, Statistic]:\n",
" \"\"\"Trains a simple MLP.\n",
"\n",
" Args:\n",
" conf: Configuration.\n",
" pplot: Whether to plot training statistics.\n",
"\n",
" Returns:\n",
" model: Trained model.\n",
" stats: Dictionary of training statistics.\n",
" - train_ce: Training cross entropy list.\n",
" - valid_ce: Validation cross entropy list.\n",
" - train_acc: Training accuracy list.\n",
" - valid_acc: Validation accuracy list.\n",
" - test_ce: Test cross entropy.\n",
" - test_acc: Test accuracy.\n",
" \"\"\"\n",
" # Initialize model.\n",
" model = InitMLP(\n",
" conf.num_inputs, conf.num_hiddens, conf.num_outputs)\n",
"\n",
" # Train model.\n",
" model, stats = TrainAdvanced(\n",
" model,\n",
" eps=conf.eps,\n",
" momentum=conf.momentum,\n",
" num_epochs=conf.num_epochs,\n",
" batch_size=conf.batch_size,\n",
" early_stopping=conf.early_stopping,\n",
" patience=conf.patience,\n",
" verbose=True,\n",
" tqdm_leave=False,\n",
" pplot=pplot)\n",
"\n",
" return model, stats"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def PlotStats(stats: Statistic, title: str = '', save_path: Optional[str] = None, show: bool = True):\n",
" \"\"\"Plots training statistics.\n",
"\n",
" Args:\n",
" stats: Dictionary of training statistics.\n",
" - train_ce: Training cross entropy list.\n",
" - valid_ce: Validation cross entropy list.\n",
" - train_acc: Training accuracy list.\n",
" - valid_acc: Validation accuracy list.\n",
" - test_ce: Test cross entropy.\n",
" - test_acc: Test accuracy.\n",
" title: Plot title.\n",
" \"\"\"\n",
" fig, ax = plt.subplots(1, 2, figsize=(12, 4))\n",
" fig.suptitle(title)\n",
" ax[0].set_title('Cross Entropy')\n",
" ax[0].set_xlabel('Epoch')\n",
" ax[0].set_ylabel('Cross Entropy')\n",
" ax[0].plot(*zip(*stats.train_ce), label='Train')\n",
" ax[0].plot(*zip(*stats.valid_ce), label='Valid')\n",
" ax[0].legend()\n",
" ax[1].set_title('Accuracy')\n",
" ax[1].set_xlabel('Epoch')\n",
" ax[1].set_ylabel('Accuracy')\n",
" ax[1].plot(*zip(*stats.train_acc), label='Train')\n",
" ax[1].plot(*zip(*stats.valid_acc), label='Valid')\n",
" ax[1].legend()\n",
" if save_path is not None:\n",
" plt.savefig(save_path)\n",
" if show:\n",
" plt.show()\n",
" # close the plot\n",
" plt.close()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# Test PlotStats.\n",
"if False:\n",
" mock_stats = Statistic(\n",
" train_ce=[(0, 0.5), (1, 0.4), (2, 0.3)],\n",
" valid_ce=[(0, 0.6), (1, 0.5), (2, 0.4)],\n",
" train_acc=[(0, 0.7), (1, 0.8), (2, 0.9)],\n",
" valid_acc=[(0, 0.6), (1, 0.5), (2, 0.4)],\n",
" test_ce=0.3,\n",
" test_acc=0.9,\n",
" )\n",
" PlotStats(mock_stats, title='MLP')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"\n",
"def ExperimentMLP(conf: Config, title: Optional[str] = None, save_dir: Union[str, PathLike] = 'results', show: bool = True, pplot: bool = False):\n",
" \"\"\"Runs a simple MLP experiment.\n",
"\n",
" Args:\n",
" conf: Configuration.\n",
" save_dir: Directory to save results.\n",
" show: Whether to show plots.\n",
" \"\"\"\n",
" if title is None:\n",
" title = f'MLP [{\",\".join([str(s) for s in conf.num_hiddens])}] lr:{conf.eps} m:{conf.momentum} b:{conf.batch_size}'\n",
" # Create save directory.\n",
" os.makedirs(save_dir, exist_ok=True)\n",
"\n",
" # Train model.\n",
" model, stats = TrainMLP(conf, pplot=pplot)\n",
" conf.save_json(os.path.join(save_dir, 'conf.json'))\n",
" model.save(os.path.join(save_dir, 'model.npz'))\n",
" # Plot training statistics.\n",
" PlotStats(stats, title='MLP', save_path=os.path.join(save_dir, 'stats.png'), show=show)\n",
" stats.save_json(os.path.join(save_dir, 'stats.json'))\n",
"\n",
" return model, stats"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"if False:\n",
" import traceback\n",
" import time\n",
" try:\n",
" begin = time.time()\n",
" # Test ExperimentMLP.\n",
" ExperimentMLP(Config(), save_dir='test_mlp', show=True)\n",
" end = time.time()\n",
" print(f\"Time: {end - begin:.2f} seconds\")\n",
" except TypeError as e:\n",
" print('TypeError: ', e)\n",
" traceback.print_exc()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 테스트"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"def load_experiment(path: Union[str, PathLike], load_model = False) -> Tuple[Config ,Statistic, Optional[ModelWeights]]:\n",
" \"\"\"Loads experiment result\n",
"\n",
" Args:\n",
" path: Path to experiment directory.\n",
" load_model: Whether to load model.\n",
"\n",
" Returns:\n",
" conf: Configuration.\n",
" stats: Dictionary of training statistics.\n",
" - train_ce: Training cross entropy list.\n",
" - valid_ce: Validation cross entropy list.\n",
" - train_acc: Training accuracy list.\n",
" - valid_acc: Validation accuracy list.\n",
" - test_ce: Test cross entropy.\n",
" - test_acc: Test accuracy.\n",
" model: Trained model.\n",
" \"\"\"\n",
" stat = Statistic.load_from_json(os.path.join(path, 'stats.json'))\n",
" conf = Config.load_from_json(os.path.join(path, 'conf.json'))\n",
" model = None\n",
" if load_model:\n",
" model = ModelWeights.load(os.path.join(path, 'model.npz'))\n",
" return conf, stat, model"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"if False:\n",
" if not os.path.exists('test_mlp'):\n",
" ExperimentMLP(Config(), save_dir='test_mlp', show=True)\n",
" conf, stats, model = load_experiment('test_mlp', load_model=True)\n",
" print(conf)\n",
" print(stats)\n",
" print(model)\n"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [],
"source": [
"def load_experiment_metafile(path: PathLike, init_task_if_not_exists: Optional[List[Any]] = None) -> Dict[str, List[Any]]:\n",
" \"\"\"Load meta data of all experiments\n",
" \n",
" Args:\n",
" path: Path to meta file.\n",
" init_task_if_not_exists: Initialize meta file if not exists.\n",
"\n",
" Returns:\n",
" meta: Dictionary of meta data.\n",
" \"\"\"\n",
" # load previous experiments if any exist\n",
" try:\n",
" with open(path, 'r') as f:\n",
" experiments = json.load(f)\n",
" except FileNotFoundError:\n",
" experiments = {\n",
" \"remain_experiments\": [],\n",
" \"completed_experiment_results\": [] # list of completed experiment\n",
" }\n",
" if init_task_if_not_exists is not None:\n",
" experiments[\"remain_experiments\"] = init_task_if_not_exists.copy() # list of remaining experiment\n",
" return experiments\n",
"\n",
"def save_experiment_metafile(path: PathLike, experiments: Dict[str, Any]):\n",
" \"\"\"Save meta data of all experiments\n",
" \n",
" Args:\n",
" path: Path to meta file.\n",
" experiments: Dictionary of meta data. \n",
" \"\"\"\n",
" with open(path, 'w') as f:\n",
" json.dump(experiments, f, indent=4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 문제"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. 기본적인 일반화 (basic generalization): 코드에 주어진 hyperparameter 들을 이용하여 신경망을 학습시킨다. 학습 오차(training error)와 일반화를 위한 검증 오차(validation error) 결과가 어떻게 다른지 설명한다. 두 가지 경우(학습과 일반화 검증)에 대해 오차 커브(error curve)를 그래프로 제시하시오."
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Checking gradients...\n",
"Done.\n",
"training...\n"
]
},
{
"data": {
"text/html": [
"<style>svg.learning-curve {\n",
" width: 100%;\n",
" shape-rendering: crispEdges;\n",
" font-size: 14px;\n",
"}\n",
"\n",
"svg.learning-curve .tick text {\n",
" font-size: 14px;\n",
" fill: #505050;\n",
"}\n",
"\n",
"svg.learning-curve .tick line {\n",
" stroke-width: 2;\n",
" stroke: #505050;\n",
"}\n",
"\n",
"svg.learning-curve .background {\n",
" fill: #EBEBEB;\n",
"}\n",
"\n",
"svg.learning-curve .facet {\n",
" font-size: 14px;\n",
"}\n",
"\n",
"svg.learning-curve .facet-background {\n",
" fill: #D9D9D9;\n",
"}\n",
"\n",
"svg.learning-curve path.line {\n",
" fill: none;\n",
" shape-rendering: geometricPrecision;\n",
" stroke-width: 1;\n",
"}\n",
"\n",
"svg.learning-curve .grid line {\n",
" stroke: #fff;\n",
" stroke-width: 2;\n",
"}\n",
"\n",
"svg.learning-curve .grid .minor {\n",
" stroke-opacity: .5;\n",
"}\n",
"\n",
"svg.learning-curve .grid text {\n",
" display: none;\n",
"}\n",
"\n",
"svg.learning-curve .axis path,\n",
"svg.learning-curve .grid path {\n",
" display: none;\n",
"}\n",
"\n",
"svg.learning-curve .axis.hide-axis {\n",
" display: none;\n",
"}\n",
"\n",
"svg.learning-curve .legned rect {\n",
" fill: #EBEBEB;\n",
"}\n",
"\n",
"svg.learning-curve .legned line {\n",
" stroke-width: 2;\n",
"}\n",
"</style><script>(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n",
"window.d3 = Object.assign(\n",
" {},\n",
" // d3.select\n",
" // d3.selectAll\n",
" require('d3-selection'),\n",
" // .transition()\n",
" require('d3-transition'),\n",
" // d3.extent\n",
" require('d3-array'),\n",
" // d3.axisBottom\n",
" // d3.axisLeft\n",
" require('d3-axis'),\n",
" // d3.scaleLinear\n",
" // d3.scaleTime\n",
" require('d3-scale'),\n",
" // d3.line\n",
" require('d3-shape')\n",
");\n",
"\n",
"},{\"d3-array\":2,\"d3-axis\":3,\"d3-scale\":10,\"d3-selection\":11,\"d3-shape\":12,\"d3-transition\":16}],2:[function(require,module,exports){\n",
"// https://d3js.org/d3-array/ v2.4.0 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"function ascending(a, b) {\n",
" return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n",
"}\n",
"\n",
"function bisector(compare) {\n",
" if (compare.length === 1) compare = ascendingComparator(compare);\n",
" return {\n",
" left: function(a, x, lo, hi) {\n",
" if (lo == null) lo = 0;\n",
" if (hi == null) hi = a.length;\n",
" while (lo < hi) {\n",
" var mid = lo + hi >>> 1;\n",
" if (compare(a[mid], x) < 0) lo = mid + 1;\n",
" else hi = mid;\n",
" }\n",
" return lo;\n",
" },\n",
" right: function(a, x, lo, hi) {\n",
" if (lo == null) lo = 0;\n",
" if (hi == null) hi = a.length;\n",
" while (lo < hi) {\n",
" var mid = lo + hi >>> 1;\n",
" if (compare(a[mid], x) > 0) hi = mid;\n",
" else lo = mid + 1;\n",
" }\n",
" return lo;\n",
" }\n",
" };\n",
"}\n",
"\n",
"function ascendingComparator(f) {\n",
" return function(d, x) {\n",
" return ascending(f(d), x);\n",
" };\n",
"}\n",
"\n",
"var ascendingBisect = bisector(ascending);\n",
"var bisectRight = ascendingBisect.right;\n",
"var bisectLeft = ascendingBisect.left;\n",
"\n",
"function count(values, valueof) {\n",
" let count = 0;\n",
" if (valueof === undefined) {\n",
" for (let value of values) {\n",
" if (value != null && (value = +value) >= value) {\n",
" ++count;\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n",
" ++count;\n",
" }\n",
" }\n",
" }\n",
" return count;\n",
"}\n",
"\n",
"function length(array) {\n",
" return array.length | 0;\n",
"}\n",
"\n",
"function empty(length) {\n",
" return !(length > 0);\n",
"}\n",
"\n",
"function arrayify(values) {\n",
" return typeof values !== \"object\" || \"length\" in values ? values : Array.from(values);\n",
"}\n",
"\n",
"function reducer(reduce) {\n",
" return values => reduce(...values);\n",
"}\n",
"\n",
"function cross(...values) {\n",
" const reduce = typeof values[values.length - 1] === \"function\" && reducer(values.pop());\n",
" values = values.map(arrayify);\n",
" const lengths = values.map(length);\n",
" const j = values.length - 1;\n",
" const index = new Array(j + 1).fill(0);\n",
" const product = [];\n",
" if (j < 0 || lengths.some(empty)) return product;\n",
" while (true) {\n",
" product.push(index.map((j, i) => values[i][j]));\n",
" let i = j;\n",
" while (++index[i] === lengths[i]) {\n",
" if (i === 0) return reduce ? product.map(reduce) : product;\n",
" index[i--] = 0;\n",
" }\n",
" }\n",
"}\n",
"\n",
"function cumsum(values, valueof) {\n",
" var sum = 0, index = 0;\n",
" return Float64Array.from(values, valueof === undefined\n",
" ? v => (sum += +v || 0)\n",
" : v => (sum += +valueof(v, index++, values) || 0));\n",
"}\n",
"\n",
"function descending(a, b) {\n",
" return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n",
"}\n",
"\n",
"function variance(values, valueof) {\n",
" let count = 0;\n",
" let delta;\n",
" let mean = 0;\n",
" let sum = 0;\n",
" if (valueof === undefined) {\n",
" for (let value of values) {\n",
" if (value != null && (value = +value) >= value) {\n",
" delta = value - mean;\n",
" mean += delta / ++count;\n",
" sum += delta * (value - mean);\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n",
" delta = value - mean;\n",
" mean += delta / ++count;\n",
" sum += delta * (value - mean);\n",
" }\n",
" }\n",
" }\n",
" if (count > 1) return sum / (count - 1);\n",
"}\n",
"\n",
"function deviation(values, valueof) {\n",
" const v = variance(values, valueof);\n",
" return v ? Math.sqrt(v) : v;\n",
"}\n",
"\n",
"function extent(values, valueof) {\n",
" let min;\n",
" let max;\n",
" if (valueof === undefined) {\n",
" for (const value of values) {\n",
" if (value != null) {\n",
" if (min === undefined) {\n",
" if (value >= value) min = max = value;\n",
" } else {\n",
" if (min > value) min = value;\n",
" if (max < value) max = value;\n",
" }\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null) {\n",
" if (min === undefined) {\n",
" if (value >= value) min = max = value;\n",
" } else {\n",
" if (min > value) min = value;\n",
" if (max < value) max = value;\n",
" }\n",
" }\n",
" }\n",
" }\n",
" return [min, max];\n",
"}\n",
"\n",
"function identity(x) {\n",
" return x;\n",
"}\n",
"\n",
"function group(values, ...keys) {\n",
" return nest(values, identity, identity, keys);\n",
"}\n",
"\n",
"function groups(values, ...keys) {\n",
" return nest(values, Array.from, identity, keys);\n",
"}\n",
"\n",
"function rollup(values, reduce, ...keys) {\n",
" return nest(values, identity, reduce, keys);\n",
"}\n",
"\n",
"function rollups(values, reduce, ...keys) {\n",
" return nest(values, Array.from, reduce, keys);\n",
"}\n",
"\n",
"function nest(values, map, reduce, keys) {\n",
" return (function regroup(values, i) {\n",
" if (i >= keys.length) return reduce(values);\n",
" const groups = new Map();\n",
" const keyof = keys[i++];\n",
" let index = -1;\n",
" for (const value of values) {\n",
" const key = keyof(value, ++index, values);\n",
" const group = groups.get(key);\n",
" if (group) group.push(value);\n",
" else groups.set(key, [value]);\n",
" }\n",
" for (const [key, values] of groups) {\n",
" groups.set(key, regroup(values, i));\n",
" }\n",
" return map(groups);\n",
" })(values, 0);\n",
"}\n",
"\n",
"var array = Array.prototype;\n",
"\n",
"var slice = array.slice;\n",
"\n",
"function constant(x) {\n",
" return function() {\n",
" return x;\n",
" };\n",
"}\n",
"\n",
"function range(start, stop, step) {\n",
" start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n",
"\n",
" var i = -1,\n",
" n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n",
" range = new Array(n);\n",
"\n",
" while (++i < n) {\n",
" range[i] = start + i * step;\n",
" }\n",
"\n",
" return range;\n",
"}\n",
"\n",
"var e10 = Math.sqrt(50),\n",
" e5 = Math.sqrt(10),\n",
" e2 = Math.sqrt(2);\n",
"\n",
"function ticks(start, stop, count) {\n",
" var reverse,\n",
" i = -1,\n",
" n,\n",
" ticks,\n",
" step;\n",
"\n",
" stop = +stop, start = +start, count = +count;\n",
" if (start === stop && count > 0) return [start];\n",
" if (reverse = stop < start) n = start, start = stop, stop = n;\n",
" if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n",
"\n",
" if (step > 0) {\n",
" start = Math.ceil(start / step);\n",
" stop = Math.floor(stop / step);\n",
" ticks = new Array(n = Math.ceil(stop - start + 1));\n",
" while (++i < n) ticks[i] = (start + i) * step;\n",
" } else {\n",
" start = Math.floor(start * step);\n",
" stop = Math.ceil(stop * step);\n",
" ticks = new Array(n = Math.ceil(start - stop + 1));\n",
" while (++i < n) ticks[i] = (start - i) / step;\n",
" }\n",
"\n",
" if (reverse) ticks.reverse();\n",
"\n",
" return ticks;\n",
"}\n",
"\n",
"function tickIncrement(start, stop, count) {\n",
" var step = (stop - start) / Math.max(0, count),\n",
" power = Math.floor(Math.log(step) / Math.LN10),\n",
" error = step / Math.pow(10, power);\n",
" return power >= 0\n",
" ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n",
" : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n",
"}\n",
"\n",
"function tickStep(start, stop, count) {\n",
" var step0 = Math.abs(stop - start) / Math.max(0, count),\n",
" step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n",
" error = step0 / step1;\n",
" if (error >= e10) step1 *= 10;\n",
" else if (error >= e5) step1 *= 5;\n",
" else if (error >= e2) step1 *= 2;\n",
" return stop < start ? -step1 : step1;\n",
"}\n",
"\n",
"function sturges(values) {\n",
" return Math.ceil(Math.log(count(values)) / Math.LN2) + 1;\n",
"}\n",
"\n",
"function bin() {\n",
" var value = identity,\n",
" domain = extent,\n",
" threshold = sturges;\n",
"\n",
" function histogram(data) {\n",
" if (!Array.isArray(data)) data = Array.from(data);\n",
"\n",
" var i,\n",
" n = data.length,\n",
" x,\n",
" values = new Array(n);\n",
"\n",
" for (i = 0; i < n; ++i) {\n",
" values[i] = value(data[i], i, data);\n",
" }\n",
"\n",
" var xz = domain(values),\n",
" x0 = xz[0],\n",
" x1 = xz[1],\n",
" tz = threshold(values, x0, x1);\n",
"\n",
" // Convert number of thresholds into uniform thresholds.\n",
" if (!Array.isArray(tz)) {\n",
" tz = tickStep(x0, x1, tz);\n",
" tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n",
" }\n",
"\n",
" // Remove any thresholds outside the domain.\n",
" var m = tz.length;\n",
" while (tz[0] <= x0) tz.shift(), --m;\n",
" while (tz[m - 1] > x1) tz.pop(), --m;\n",
"\n",
" var bins = new Array(m + 1),\n",
" bin;\n",
"\n",
" // Initialize bins.\n",
" for (i = 0; i <= m; ++i) {\n",
" bin = bins[i] = [];\n",
" bin.x0 = i > 0 ? tz[i - 1] : x0;\n",
" bin.x1 = i < m ? tz[i] : x1;\n",
" }\n",
"\n",
" // Assign data to bins by value, ignoring any outside the domain.\n",
" for (i = 0; i < n; ++i) {\n",
" x = values[i];\n",
" if (x0 <= x && x <= x1) {\n",
" bins[bisectRight(tz, x, 0, m)].push(data[i]);\n",
" }\n",
" }\n",
"\n",
" return bins;\n",
" }\n",
"\n",
" histogram.value = function(_) {\n",
" return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n",
" };\n",
"\n",
" histogram.domain = function(_) {\n",
" return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n",
" };\n",
"\n",
" histogram.thresholds = function(_) {\n",
" return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n",
" };\n",
"\n",
" return histogram;\n",
"}\n",
"\n",
"function max(values, valueof) {\n",
" let max;\n",
" if (valueof === undefined) {\n",
" for (const value of values) {\n",
" if (value != null\n",
" && (max < value || (max === undefined && value >= value))) {\n",
" max = value;\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null\n",
" && (max < value || (max === undefined && value >= value))) {\n",
" max = value;\n",
" }\n",
" }\n",
" }\n",
" return max;\n",
"}\n",
"\n",
"function min(values, valueof) {\n",
" let min;\n",
" if (valueof === undefined) {\n",
" for (const value of values) {\n",
" if (value != null\n",
" && (min > value || (min === undefined && value >= value))) {\n",
" min = value;\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null\n",
" && (min > value || (min === undefined && value >= value))) {\n",
" min = value;\n",
" }\n",
" }\n",
" }\n",
" return min;\n",
"}\n",
"\n",
"// Based on https://github.com/mourner/quickselect\n",
"// ISC license, Copyright 2018 Vladimir Agafonkin.\n",
"function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) {\n",
" while (right > left) {\n",
" if (right - left > 600) {\n",
" const n = right - left + 1;\n",
" const m = k - left + 1;\n",
" const z = Math.log(n);\n",
" const s = 0.5 * Math.exp(2 * z / 3);\n",
" const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n",
" const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n",
" const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n",
" quickselect(array, k, newLeft, newRight, compare);\n",
" }\n",
"\n",
" const t = array[k];\n",
" let i = left;\n",
" let j = right;\n",
"\n",
" swap(array, left, k);\n",
" if (compare(array[right], t) > 0) swap(array, left, right);\n",
"\n",
" while (i < j) {\n",
" swap(array, i, j), ++i, --j;\n",
" while (compare(array[i], t) < 0) ++i;\n",
" while (compare(array[j], t) > 0) --j;\n",
" }\n",
"\n",
" if (compare(array[left], t) === 0) swap(array, left, j);\n",
" else ++j, swap(array, j, right);\n",
"\n",
" if (j <= k) left = j + 1;\n",
" if (k <= j) right = j - 1;\n",
" }\n",
" return array;\n",
"}\n",
"\n",
"function swap(array, i, j) {\n",
" const t = array[i];\n",
" array[i] = array[j];\n",
" array[j] = t;\n",
"}\n",
"\n",
"function number(x) {\n",
" return x === null ? NaN : +x;\n",
"}\n",
"\n",
"function* numbers(values, valueof) {\n",
" if (valueof === undefined) {\n",
" for (let value of values) {\n",
" if (value != null && (value = +value) >= value) {\n",
" yield value;\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n",
" yield value;\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"function quantile(values, p, valueof) {\n",
" values = Float64Array.from(numbers(values, valueof));\n",
" if (!(n = values.length)) return;\n",
" if ((p = +p) <= 0 || n < 2) return min(values);\n",
" if (p >= 1) return max(values);\n",
" var n,\n",
" i = (n - 1) * p,\n",
" i0 = Math.floor(i),\n",
" value0 = max(quickselect(values, i0).subarray(0, i0 + 1)),\n",
" value1 = min(values.subarray(i0 + 1));\n",
" return value0 + (value1 - value0) * (i - i0);\n",
"}\n",
"\n",
"function quantileSorted(values, p, valueof = number) {\n",
" if (!(n = values.length)) return;\n",
" if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n",
" if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n",
" var n,\n",
" i = (n - 1) * p,\n",
" i0 = Math.floor(i),\n",
" value0 = +valueof(values[i0], i0, values),\n",
" value1 = +valueof(values[i0 + 1], i0 + 1, values);\n",
" return value0 + (value1 - value0) * (i - i0);\n",
"}\n",
"\n",
"function freedmanDiaconis(values, min, max) {\n",
" return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(count(values), -1 / 3)));\n",
"}\n",
"\n",
"function scott(values, min, max) {\n",
" return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count(values), -1 / 3)));\n",
"}\n",
"\n",
"function maxIndex(values, valueof) {\n",
" let max;\n",
" let maxIndex = -1;\n",
" let index = -1;\n",
" if (valueof === undefined) {\n",
" for (const value of values) {\n",
" ++index;\n",
" if (value != null\n",
" && (max < value || (max === undefined && value >= value))) {\n",
" max = value, maxIndex = index;\n",
" }\n",
" }\n",
" } else {\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null\n",
" && (max < value || (max === undefined && value >= value))) {\n",
" max = value, maxIndex = index;\n",
" }\n",
" }\n",
" }\n",
" return maxIndex;\n",
"}\n",
"\n",
"function mean(values, valueof) {\n",
" let count = 0;\n",
" let sum = 0;\n",
" if (valueof === undefined) {\n",
" for (let value of values) {\n",
" if (value != null && (value = +value) >= value) {\n",
" ++count, sum += value;\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n",
" ++count, sum += value;\n",
" }\n",
" }\n",
" }\n",
" if (count) return sum / count;\n",
"}\n",
"\n",
"function median(values, valueof) {\n",
" return quantile(values, 0.5, valueof);\n",
"}\n",
"\n",
"function* flatten(arrays) {\n",
" for (const array of arrays) {\n",
" yield* array;\n",
" }\n",
"}\n",
"\n",
"function merge(arrays) {\n",
" return Array.from(flatten(arrays));\n",
"}\n",
"\n",
"function minIndex(values, valueof) {\n",
" let min;\n",
" let minIndex = -1;\n",
" let index = -1;\n",
" if (valueof === undefined) {\n",
" for (const value of values) {\n",
" ++index;\n",
" if (value != null\n",
" && (min > value || (min === undefined && value >= value))) {\n",
" min = value, minIndex = index;\n",
" }\n",
" }\n",
" } else {\n",
" for (let value of values) {\n",
" if ((value = valueof(value, ++index, values)) != null\n",
" && (min > value || (min === undefined && value >= value))) {\n",
" min = value, minIndex = index;\n",
" }\n",
" }\n",
" }\n",
" return minIndex;\n",
"}\n",
"\n",
"function pairs(values, pairof = pair) {\n",
" const pairs = [];\n",
" let previous;\n",
" let first = false;\n",
" for (const value of values) {\n",
" if (first) pairs.push(pairof(previous, value));\n",
" previous = value;\n",
" first = true;\n",
" }\n",
" return pairs;\n",
"}\n",
"\n",
"function pair(a, b) {\n",
" return [a, b];\n",
"}\n",
"\n",
"function permute(source, keys) {\n",
" return Array.from(keys, key => source[key]);\n",
"}\n",
"\n",
"function least(values, compare = ascending) {\n",
" let min;\n",
" let defined = false;\n",
" if (compare.length === 1) {\n",
" let minValue;\n",
" for (const element of values) {\n",
" const value = compare(element);\n",
" if (defined\n",
" ? ascending(value, minValue) < 0\n",
" : ascending(value, value) === 0) {\n",
" min = element;\n",
" minValue = value;\n",
" defined = true;\n",
" }\n",
" }\n",
" } else {\n",
" for (const value of values) {\n",
" if (defined\n",
" ? compare(value, min) < 0\n",
" : compare(value, value) === 0) {\n",
" min = value;\n",
" defined = true;\n",
" }\n",
" }\n",
" }\n",
" return min;\n",
"}\n",
"\n",
"function leastIndex(values, compare = ascending) {\n",
" if (compare.length === 1) return minIndex(values, compare);\n",
" let minValue;\n",
" let min = -1;\n",
" let index = -1;\n",
" for (const value of values) {\n",
" ++index;\n",
" if (min < 0\n",
" ? compare(value, value) === 0\n",
" : compare(value, minValue) < 0) {\n",
" minValue = value;\n",
" min = index;\n",
" }\n",
" }\n",
" return min;\n",
"}\n",
"\n",
"function greatest(values, compare = ascending) {\n",
" let max;\n",
" let defined = false;\n",
" if (compare.length === 1) {\n",
" let maxValue;\n",
" for (const element of values) {\n",
" const value = compare(element);\n",
" if (defined\n",
" ? ascending(value, maxValue) > 0\n",
" : ascending(value, value) === 0) {\n",
" max = element;\n",
" maxValue = value;\n",
" defined = true;\n",
" }\n",
" }\n",
" } else {\n",
" for (const value of values) {\n",
" if (defined\n",
" ? compare(value, max) > 0\n",
" : compare(value, value) === 0) {\n",
" max = value;\n",
" defined = true;\n",
" }\n",
" }\n",
" }\n",
" return max;\n",
"}\n",
"\n",
"function greatestIndex(values, compare = ascending) {\n",
" if (compare.length === 1) return maxIndex(values, compare);\n",
" let maxValue;\n",
" let max = -1;\n",
" let index = -1;\n",
" for (const value of values) {\n",
" ++index;\n",
" if (max < 0\n",
" ? compare(value, value) === 0\n",
" : compare(value, maxValue) > 0) {\n",
" maxValue = value;\n",
" max = index;\n",
" }\n",
" }\n",
" return max;\n",
"}\n",
"\n",
"function scan(values, compare) {\n",
" const index = leastIndex(values, compare);\n",
" return index < 0 ? undefined : index;\n",
"}\n",
"\n",
"function shuffle(array, i0 = 0, i1 = array.length) {\n",
" var m = i1 - (i0 = +i0),\n",
" t,\n",
" i;\n",
"\n",
" while (m) {\n",
" i = Math.random() * m-- | 0;\n",
" t = array[m + i0];\n",
" array[m + i0] = array[i + i0];\n",
" array[i + i0] = t;\n",
" }\n",
"\n",
" return array;\n",
"}\n",
"\n",
"function sum(values, valueof) {\n",
" let sum = 0;\n",
" if (valueof === undefined) {\n",
" for (let value of values) {\n",
" if (value = +value) {\n",
" sum += value;\n",
" }\n",
" }\n",
" } else {\n",
" let index = -1;\n",
" for (let value of values) {\n",
" if (value = +valueof(value, ++index, values)) {\n",
" sum += value;\n",
" }\n",
" }\n",
" }\n",
" return sum;\n",
"}\n",
"\n",
"function transpose(matrix) {\n",
" if (!(n = matrix.length)) return [];\n",
" for (var i = -1, m = min(matrix, length$1), transpose = new Array(m); ++i < m;) {\n",
" for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n",
" row[j] = matrix[j][i];\n",
" }\n",
" }\n",
" return transpose;\n",
"}\n",
"\n",
"function length$1(d) {\n",
" return d.length;\n",
"}\n",
"\n",
"function zip() {\n",
" return transpose(arguments);\n",
"}\n",
"\n",
"exports.ascending = ascending;\n",
"exports.bin = bin;\n",
"exports.bisect = bisectRight;\n",
"exports.bisectLeft = bisectLeft;\n",
"exports.bisectRight = bisectRight;\n",
"exports.bisector = bisector;\n",
"exports.count = count;\n",
"exports.cross = cross;\n",
"exports.cumsum = cumsum;\n",
"exports.descending = descending;\n",
"exports.deviation = deviation;\n",
"exports.extent = extent;\n",
"exports.greatest = greatest;\n",
"exports.greatestIndex = greatestIndex;\n",
"exports.group = group;\n",
"exports.groups = groups;\n",
"exports.histogram = bin;\n",
"exports.least = least;\n",
"exports.leastIndex = leastIndex;\n",
"exports.max = max;\n",
"exports.maxIndex = maxIndex;\n",
"exports.mean = mean;\n",
"exports.median = median;\n",
"exports.merge = merge;\n",
"exports.min = min;\n",
"exports.minIndex = minIndex;\n",
"exports.pairs = pairs;\n",
"exports.permute = permute;\n",
"exports.quantile = quantile;\n",
"exports.quantileSorted = quantileSorted;\n",
"exports.quickselect = quickselect;\n",
"exports.range = range;\n",
"exports.rollup = rollup;\n",
"exports.rollups = rollups;\n",
"exports.scan = scan;\n",
"exports.shuffle = shuffle;\n",
"exports.sum = sum;\n",
"exports.thresholdFreedmanDiaconis = freedmanDiaconis;\n",
"exports.thresholdScott = scott;\n",
"exports.thresholdSturges = sturges;\n",
"exports.tickIncrement = tickIncrement;\n",
"exports.tickStep = tickStep;\n",
"exports.ticks = ticks;\n",
"exports.transpose = transpose;\n",
"exports.variance = variance;\n",
"exports.zip = zip;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],3:[function(require,module,exports){\n",
"// https://d3js.org/d3-axis/ v1.0.12 Copyright 2018 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(factory((global.d3 = global.d3 || {})));\n",
"}(this, (function (exports) { 'use strict';\n",
"\n",
"var slice = Array.prototype.slice;\n",
"\n",
"function identity(x) {\n",
" return x;\n",
"}\n",
"\n",
"var top = 1,\n",
" right = 2,\n",
" bottom = 3,\n",
" left = 4,\n",
" epsilon = 1e-6;\n",
"\n",
"function translateX(x) {\n",
" return \"translate(\" + (x + 0.5) + \",0)\";\n",
"}\n",
"\n",
"function translateY(y) {\n",
" return \"translate(0,\" + (y + 0.5) + \")\";\n",
"}\n",
"\n",
"function number(scale) {\n",
" return function(d) {\n",
" return +scale(d);\n",
" };\n",
"}\n",
"\n",
"function center(scale) {\n",
" var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n",
" if (scale.round()) offset = Math.round(offset);\n",
" return function(d) {\n",
" return +scale(d) + offset;\n",
" };\n",
"}\n",
"\n",
"function entering() {\n",
" return !this.__axis;\n",
"}\n",
"\n",
"function axis(orient, scale) {\n",
" var tickArguments = [],\n",
" tickValues = null,\n",
" tickFormat = null,\n",
" tickSizeInner = 6,\n",
" tickSizeOuter = 6,\n",
" tickPadding = 3,\n",
" k = orient === top || orient === left ? -1 : 1,\n",
" x = orient === left || orient === right ? \"x\" : \"y\",\n",
" transform = orient === top || orient === bottom ? translateX : translateY;\n",
"\n",
" function axis(context) {\n",
" var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n",
" format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n",
" spacing = Math.max(tickSizeInner, 0) + tickPadding,\n",
" range = scale.range(),\n",
" range0 = +range[0] + 0.5,\n",
" range1 = +range[range.length - 1] + 0.5,\n",
" position = (scale.bandwidth ? center : number)(scale.copy()),\n",
" selection = context.selection ? context.selection() : context,\n",
" path = selection.selectAll(\".domain\").data([null]),\n",
" tick = selection.selectAll(\".tick\").data(values, scale).order(),\n",
" tickExit = tick.exit(),\n",
" tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n",
" line = tick.select(\"line\"),\n",
" text = tick.select(\"text\");\n",
"\n",
" path = path.merge(path.enter().insert(\"path\", \".tick\")\n",
" .attr(\"class\", \"domain\")\n",
" .attr(\"stroke\", \"currentColor\"));\n",
"\n",
" tick = tick.merge(tickEnter);\n",
"\n",
" line = line.merge(tickEnter.append(\"line\")\n",
" .attr(\"stroke\", \"currentColor\")\n",
" .attr(x + \"2\", k * tickSizeInner));\n",
"\n",
" text = text.merge(tickEnter.append(\"text\")\n",
" .attr(\"fill\", \"currentColor\")\n",
" .attr(x, k * spacing)\n",
" .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n",
"\n",
" if (context !== selection) {\n",
" path = path.transition(context);\n",
" tick = tick.transition(context);\n",
" line = line.transition(context);\n",
" text = text.transition(context);\n",
"\n",
" tickExit = tickExit.transition(context)\n",
" .attr(\"opacity\", epsilon)\n",
" .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n",
"\n",
" tickEnter\n",
" .attr(\"opacity\", epsilon)\n",
" .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n",
" }\n",
"\n",
" tickExit.remove();\n",
"\n",
" path\n",
" .attr(\"d\", orient === left || orient == right\n",
" ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter : \"M0.5,\" + range0 + \"V\" + range1)\n",
" : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",0.5H\" + range1));\n",
"\n",
" tick\n",
" .attr(\"opacity\", 1)\n",
" .attr(\"transform\", function(d) { return transform(position(d)); });\n",
"\n",
" line\n",
" .attr(x + \"2\", k * tickSizeInner);\n",
"\n",
" text\n",
" .attr(x, k * spacing)\n",
" .text(format);\n",
"\n",
" selection.filter(entering)\n",
" .attr(\"fill\", \"none\")\n",
" .attr(\"font-size\", 10)\n",
" .attr(\"font-family\", \"sans-serif\")\n",
" .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n",
"\n",
" selection\n",
" .each(function() { this.__axis = position; });\n",
" }\n",
"\n",
" axis.scale = function(_) {\n",
" return arguments.length ? (scale = _, axis) : scale;\n",
" };\n",
"\n",
" axis.ticks = function() {\n",
" return tickArguments = slice.call(arguments), axis;\n",
" };\n",
"\n",
" axis.tickArguments = function(_) {\n",
" return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n",
" };\n",
"\n",
" axis.tickValues = function(_) {\n",
" return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n",
" };\n",
"\n",
" axis.tickFormat = function(_) {\n",
" return arguments.length ? (tickFormat = _, axis) : tickFormat;\n",
" };\n",
"\n",
" axis.tickSize = function(_) {\n",
" return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n",
" };\n",
"\n",
" axis.tickSizeInner = function(_) {\n",
" return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n",
" };\n",
"\n",
" axis.tickSizeOuter = function(_) {\n",
" return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n",
" };\n",
"\n",
" axis.tickPadding = function(_) {\n",
" return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n",
" };\n",
"\n",
" return axis;\n",
"}\n",
"\n",
"function axisTop(scale) {\n",
" return axis(top, scale);\n",
"}\n",
"\n",
"function axisRight(scale) {\n",
" return axis(right, scale);\n",
"}\n",
"\n",
"function axisBottom(scale) {\n",
" return axis(bottom, scale);\n",
"}\n",
"\n",
"function axisLeft(scale) {\n",
" return axis(left, scale);\n",
"}\n",
"\n",
"exports.axisTop = axisTop;\n",
"exports.axisRight = axisRight;\n",
"exports.axisBottom = axisBottom;\n",
"exports.axisLeft = axisLeft;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"})));\n",
"\n",
"},{}],4:[function(require,module,exports){\n",
"// https://d3js.org/d3-color/ v1.4.0 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"function define(constructor, factory, prototype) {\n",
" constructor.prototype = factory.prototype = prototype;\n",
" prototype.constructor = constructor;\n",
"}\n",
"\n",
"function extend(parent, definition) {\n",
" var prototype = Object.create(parent.prototype);\n",
" for (var key in definition) prototype[key] = definition[key];\n",
" return prototype;\n",
"}\n",
"\n",
"function Color() {}\n",
"\n",
"var darker = 0.7;\n",
"var brighter = 1 / darker;\n",
"\n",
"var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n",
" reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n",
" reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n",
" reHex = /^#([0-9a-f]{3,8})$/,\n",
" reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n",
" reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n",
" reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n",
" reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n",
" reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n",
" reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n",
"\n",
"var named = {\n",
" aliceblue: 0xf0f8ff,\n",
" antiquewhite: 0xfaebd7,\n",
" aqua: 0x00ffff,\n",
" aquamarine: 0x7fffd4,\n",
" azure: 0xf0ffff,\n",
" beige: 0xf5f5dc,\n",
" bisque: 0xffe4c4,\n",
" black: 0x000000,\n",
" blanchedalmond: 0xffebcd,\n",
" blue: 0x0000ff,\n",
" blueviolet: 0x8a2be2,\n",
" brown: 0xa52a2a,\n",
" burlywood: 0xdeb887,\n",
" cadetblue: 0x5f9ea0,\n",
" chartreuse: 0x7fff00,\n",
" chocolate: 0xd2691e,\n",
" coral: 0xff7f50,\n",
" cornflowerblue: 0x6495ed,\n",
" cornsilk: 0xfff8dc,\n",
" crimson: 0xdc143c,\n",
" cyan: 0x00ffff,\n",
" darkblue: 0x00008b,\n",
" darkcyan: 0x008b8b,\n",
" darkgoldenrod: 0xb8860b,\n",
" darkgray: 0xa9a9a9,\n",
" darkgreen: 0x006400,\n",
" darkgrey: 0xa9a9a9,\n",
" darkkhaki: 0xbdb76b,\n",
" darkmagenta: 0x8b008b,\n",
" darkolivegreen: 0x556b2f,\n",
" darkorange: 0xff8c00,\n",
" darkorchid: 0x9932cc,\n",
" darkred: 0x8b0000,\n",
" darksalmon: 0xe9967a,\n",
" darkseagreen: 0x8fbc8f,\n",
" darkslateblue: 0x483d8b,\n",
" darkslategray: 0x2f4f4f,\n",
" darkslategrey: 0x2f4f4f,\n",
" darkturquoise: 0x00ced1,\n",
" darkviolet: 0x9400d3,\n",
" deeppink: 0xff1493,\n",
" deepskyblue: 0x00bfff,\n",
" dimgray: 0x696969,\n",
" dimgrey: 0x696969,\n",
" dodgerblue: 0x1e90ff,\n",
" firebrick: 0xb22222,\n",
" floralwhite: 0xfffaf0,\n",
" forestgreen: 0x228b22,\n",
" fuchsia: 0xff00ff,\n",
" gainsboro: 0xdcdcdc,\n",
" ghostwhite: 0xf8f8ff,\n",
" gold: 0xffd700,\n",
" goldenrod: 0xdaa520,\n",
" gray: 0x808080,\n",
" green: 0x008000,\n",
" greenyellow: 0xadff2f,\n",
" grey: 0x808080,\n",
" honeydew: 0xf0fff0,\n",
" hotpink: 0xff69b4,\n",
" indianred: 0xcd5c5c,\n",
" indigo: 0x4b0082,\n",
" ivory: 0xfffff0,\n",
" khaki: 0xf0e68c,\n",
" lavender: 0xe6e6fa,\n",
" lavenderblush: 0xfff0f5,\n",
" lawngreen: 0x7cfc00,\n",
" lemonchiffon: 0xfffacd,\n",
" lightblue: 0xadd8e6,\n",
" lightcoral: 0xf08080,\n",
" lightcyan: 0xe0ffff,\n",
" lightgoldenrodyellow: 0xfafad2,\n",
" lightgray: 0xd3d3d3,\n",
" lightgreen: 0x90ee90,\n",
" lightgrey: 0xd3d3d3,\n",
" lightpink: 0xffb6c1,\n",
" lightsalmon: 0xffa07a,\n",
" lightseagreen: 0x20b2aa,\n",
" lightskyblue: 0x87cefa,\n",
" lightslategray: 0x778899,\n",
" lightslategrey: 0x778899,\n",
" lightsteelblue: 0xb0c4de,\n",
" lightyellow: 0xffffe0,\n",
" lime: 0x00ff00,\n",
" limegreen: 0x32cd32,\n",
" linen: 0xfaf0e6,\n",
" magenta: 0xff00ff,\n",
" maroon: 0x800000,\n",
" mediumaquamarine: 0x66cdaa,\n",
" mediumblue: 0x0000cd,\n",
" mediumorchid: 0xba55d3,\n",
" mediumpurple: 0x9370db,\n",
" mediumseagreen: 0x3cb371,\n",
" mediumslateblue: 0x7b68ee,\n",
" mediumspringgreen: 0x00fa9a,\n",
" mediumturquoise: 0x48d1cc,\n",
" mediumvioletred: 0xc71585,\n",
" midnightblue: 0x191970,\n",
" mintcream: 0xf5fffa,\n",
" mistyrose: 0xffe4e1,\n",
" moccasin: 0xffe4b5,\n",
" navajowhite: 0xffdead,\n",
" navy: 0x000080,\n",
" oldlace: 0xfdf5e6,\n",
" olive: 0x808000,\n",
" olivedrab: 0x6b8e23,\n",
" orange: 0xffa500,\n",
" orangered: 0xff4500,\n",
" orchid: 0xda70d6,\n",
" palegoldenrod: 0xeee8aa,\n",
" palegreen: 0x98fb98,\n",
" paleturquoise: 0xafeeee,\n",
" palevioletred: 0xdb7093,\n",
" papayawhip: 0xffefd5,\n",
" peachpuff: 0xffdab9,\n",
" peru: 0xcd853f,\n",
" pink: 0xffc0cb,\n",
" plum: 0xdda0dd,\n",
" powderblue: 0xb0e0e6,\n",
" purple: 0x800080,\n",
" rebeccapurple: 0x663399,\n",
" red: 0xff0000,\n",
" rosybrown: 0xbc8f8f,\n",
" royalblue: 0x4169e1,\n",
" saddlebrown: 0x8b4513,\n",
" salmon: 0xfa8072,\n",
" sandybrown: 0xf4a460,\n",
" seagreen: 0x2e8b57,\n",
" seashell: 0xfff5ee,\n",
" sienna: 0xa0522d,\n",
" silver: 0xc0c0c0,\n",
" skyblue: 0x87ceeb,\n",
" slateblue: 0x6a5acd,\n",
" slategray: 0x708090,\n",
" slategrey: 0x708090,\n",
" snow: 0xfffafa,\n",
" springgreen: 0x00ff7f,\n",
" steelblue: 0x4682b4,\n",
" tan: 0xd2b48c,\n",
" teal: 0x008080,\n",
" thistle: 0xd8bfd8,\n",
" tomato: 0xff6347,\n",
" turquoise: 0x40e0d0,\n",
" violet: 0xee82ee,\n",
" wheat: 0xf5deb3,\n",
" white: 0xffffff,\n",
" whitesmoke: 0xf5f5f5,\n",
" yellow: 0xffff00,\n",
" yellowgreen: 0x9acd32\n",
"};\n",
"\n",
"define(Color, color, {\n",
" copy: function(channels) {\n",
" return Object.assign(new this.constructor, this, channels);\n",
" },\n",
" displayable: function() {\n",
" return this.rgb().displayable();\n",
" },\n",
" hex: color_formatHex, // Deprecated! Use color.formatHex.\n",
" formatHex: color_formatHex,\n",
" formatHsl: color_formatHsl,\n",
" formatRgb: color_formatRgb,\n",
" toString: color_formatRgb\n",
"});\n",
"\n",
"function color_formatHex() {\n",
" return this.rgb().formatHex();\n",
"}\n",
"\n",
"function color_formatHsl() {\n",
" return hslConvert(this).formatHsl();\n",
"}\n",
"\n",
"function color_formatRgb() {\n",
" return this.rgb().formatRgb();\n",
"}\n",
"\n",
"function color(format) {\n",
" var m, l;\n",
" format = (format + \"\").trim().toLowerCase();\n",
" return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n",
" : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n",
" : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n",
" : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n",
" : null) // invalid hex\n",
" : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n",
" : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n",
" : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n",
" : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n",
" : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n",
" : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n",
" : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n",
" : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n",
" : null;\n",
"}\n",
"\n",
"function rgbn(n) {\n",
" return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n",
"}\n",
"\n",
"function rgba(r, g, b, a) {\n",
" if (a <= 0) r = g = b = NaN;\n",
" return new Rgb(r, g, b, a);\n",
"}\n",
"\n",
"function rgbConvert(o) {\n",
" if (!(o instanceof Color)) o = color(o);\n",
" if (!o) return new Rgb;\n",
" o = o.rgb();\n",
" return new Rgb(o.r, o.g, o.b, o.opacity);\n",
"}\n",
"\n",
"function rgb(r, g, b, opacity) {\n",
" return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n",
"}\n",
"\n",
"function Rgb(r, g, b, opacity) {\n",
" this.r = +r;\n",
" this.g = +g;\n",
" this.b = +b;\n",
" this.opacity = +opacity;\n",
"}\n",
"\n",
"define(Rgb, rgb, extend(Color, {\n",
" brighter: function(k) {\n",
" k = k == null ? brighter : Math.pow(brighter, k);\n",
" return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n",
" },\n",
" darker: function(k) {\n",
" k = k == null ? darker : Math.pow(darker, k);\n",
" return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n",
" },\n",
" rgb: function() {\n",
" return this;\n",
" },\n",
" displayable: function() {\n",
" return (-0.5 <= this.r && this.r < 255.5)\n",
" && (-0.5 <= this.g && this.g < 255.5)\n",
" && (-0.5 <= this.b && this.b < 255.5)\n",
" && (0 <= this.opacity && this.opacity <= 1);\n",
" },\n",
" hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n",
" formatHex: rgb_formatHex,\n",
" formatRgb: rgb_formatRgb,\n",
" toString: rgb_formatRgb\n",
"}));\n",
"\n",
"function rgb_formatHex() {\n",
" return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n",
"}\n",
"\n",
"function rgb_formatRgb() {\n",
" var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n",
" return (a === 1 ? \"rgb(\" : \"rgba(\")\n",
" + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n",
" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n",
" + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n",
" + (a === 1 ? \")\" : \", \" + a + \")\");\n",
"}\n",
"\n",
"function hex(value) {\n",
" value = Math.max(0, Math.min(255, Math.round(value) || 0));\n",
" return (value < 16 ? \"0\" : \"\") + value.toString(16);\n",
"}\n",
"\n",
"function hsla(h, s, l, a) {\n",
" if (a <= 0) h = s = l = NaN;\n",
" else if (l <= 0 || l >= 1) h = s = NaN;\n",
" else if (s <= 0) h = NaN;\n",
" return new Hsl(h, s, l, a);\n",
"}\n",
"\n",
"function hslConvert(o) {\n",
" if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n",
" if (!(o instanceof Color)) o = color(o);\n",
" if (!o) return new Hsl;\n",
" if (o instanceof Hsl) return o;\n",
" o = o.rgb();\n",
" var r = o.r / 255,\n",
" g = o.g / 255,\n",
" b = o.b / 255,\n",
" min = Math.min(r, g, b),\n",
" max = Math.max(r, g, b),\n",
" h = NaN,\n",
" s = max - min,\n",
" l = (max + min) / 2;\n",
" if (s) {\n",
" if (r === max) h = (g - b) / s + (g < b) * 6;\n",
" else if (g === max) h = (b - r) / s + 2;\n",
" else h = (r - g) / s + 4;\n",
" s /= l < 0.5 ? max + min : 2 - max - min;\n",
" h *= 60;\n",
" } else {\n",
" s = l > 0 && l < 1 ? 0 : h;\n",
" }\n",
" return new Hsl(h, s, l, o.opacity);\n",
"}\n",
"\n",
"function hsl(h, s, l, opacity) {\n",
" return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n",
"}\n",
"\n",
"function Hsl(h, s, l, opacity) {\n",
" this.h = +h;\n",
" this.s = +s;\n",
" this.l = +l;\n",
" this.opacity = +opacity;\n",
"}\n",
"\n",
"define(Hsl, hsl, extend(Color, {\n",
" brighter: function(k) {\n",
" k = k == null ? brighter : Math.pow(brighter, k);\n",
" return new Hsl(this.h, this.s, this.l * k, this.opacity);\n",
" },\n",
" darker: function(k) {\n",
" k = k == null ? darker : Math.pow(darker, k);\n",
" return new Hsl(this.h, this.s, this.l * k, this.opacity);\n",
" },\n",
" rgb: function() {\n",
" var h = this.h % 360 + (this.h < 0) * 360,\n",
" s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n",
" l = this.l,\n",
" m2 = l + (l < 0.5 ? l : 1 - l) * s,\n",
" m1 = 2 * l - m2;\n",
" return new Rgb(\n",
" hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n",
" hsl2rgb(h, m1, m2),\n",
" hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n",
" this.opacity\n",
" );\n",
" },\n",
" displayable: function() {\n",
" return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n",
" && (0 <= this.l && this.l <= 1)\n",
" && (0 <= this.opacity && this.opacity <= 1);\n",
" },\n",
" formatHsl: function() {\n",
" var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n",
" return (a === 1 ? \"hsl(\" : \"hsla(\")\n",
" + (this.h || 0) + \", \"\n",
" + (this.s || 0) * 100 + \"%, \"\n",
" + (this.l || 0) * 100 + \"%\"\n",
" + (a === 1 ? \")\" : \", \" + a + \")\");\n",
" }\n",
"}));\n",
"\n",
"/* From FvD 13.37, CSS Color Module Level 3 */\n",
"function hsl2rgb(h, m1, m2) {\n",
" return (h < 60 ? m1 + (m2 - m1) * h / 60\n",
" : h < 180 ? m2\n",
" : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n",
" : m1) * 255;\n",
"}\n",
"\n",
"var deg2rad = Math.PI / 180;\n",
"var rad2deg = 180 / Math.PI;\n",
"\n",
"// https://observablehq.com/@mbostock/lab-and-rgb\n",
"var K = 18,\n",
" Xn = 0.96422,\n",
" Yn = 1,\n",
" Zn = 0.82521,\n",
" t0 = 4 / 29,\n",
" t1 = 6 / 29,\n",
" t2 = 3 * t1 * t1,\n",
" t3 = t1 * t1 * t1;\n",
"\n",
"function labConvert(o) {\n",
" if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n",
" if (o instanceof Hcl) return hcl2lab(o);\n",
" if (!(o instanceof Rgb)) o = rgbConvert(o);\n",
" var r = rgb2lrgb(o.r),\n",
" g = rgb2lrgb(o.g),\n",
" b = rgb2lrgb(o.b),\n",
" y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n",
" if (r === g && g === b) x = z = y; else {\n",
" x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n",
" z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n",
" }\n",
" return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n",
"}\n",
"\n",
"function gray(l, opacity) {\n",
" return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n",
"}\n",
"\n",
"function lab(l, a, b, opacity) {\n",
" return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n",
"}\n",
"\n",
"function Lab(l, a, b, opacity) {\n",
" this.l = +l;\n",
" this.a = +a;\n",
" this.b = +b;\n",
" this.opacity = +opacity;\n",
"}\n",
"\n",
"define(Lab, lab, extend(Color, {\n",
" brighter: function(k) {\n",
" return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n",
" },\n",
" darker: function(k) {\n",
" return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n",
" },\n",
" rgb: function() {\n",
" var y = (this.l + 16) / 116,\n",
" x = isNaN(this.a) ? y : y + this.a / 500,\n",
" z = isNaN(this.b) ? y : y - this.b / 200;\n",
" x = Xn * lab2xyz(x);\n",
" y = Yn * lab2xyz(y);\n",
" z = Zn * lab2xyz(z);\n",
" return new Rgb(\n",
" lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n",
" lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n",
" lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n",
" this.opacity\n",
" );\n",
" }\n",
"}));\n",
"\n",
"function xyz2lab(t) {\n",
" return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n",
"}\n",
"\n",
"function lab2xyz(t) {\n",
" return t > t1 ? t * t * t : t2 * (t - t0);\n",
"}\n",
"\n",
"function lrgb2rgb(x) {\n",
" return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n",
"}\n",
"\n",
"function rgb2lrgb(x) {\n",
" return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n",
"}\n",
"\n",
"function hclConvert(o) {\n",
" if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n",
" if (!(o instanceof Lab)) o = labConvert(o);\n",
" if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n",
" var h = Math.atan2(o.b, o.a) * rad2deg;\n",
" return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n",
"}\n",
"\n",
"function lch(l, c, h, opacity) {\n",
" return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n",
"}\n",
"\n",
"function hcl(h, c, l, opacity) {\n",
" return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n",
"}\n",
"\n",
"function Hcl(h, c, l, opacity) {\n",
" this.h = +h;\n",
" this.c = +c;\n",
" this.l = +l;\n",
" this.opacity = +opacity;\n",
"}\n",
"\n",
"function hcl2lab(o) {\n",
" if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n",
" var h = o.h * deg2rad;\n",
" return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n",
"}\n",
"\n",
"define(Hcl, hcl, extend(Color, {\n",
" brighter: function(k) {\n",
" return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n",
" },\n",
" darker: function(k) {\n",
" return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n",
" },\n",
" rgb: function() {\n",
" return hcl2lab(this).rgb();\n",
" }\n",
"}));\n",
"\n",
"var A = -0.14861,\n",
" B = +1.78277,\n",
" C = -0.29227,\n",
" D = -0.90649,\n",
" E = +1.97294,\n",
" ED = E * D,\n",
" EB = E * B,\n",
" BC_DA = B * C - D * A;\n",
"\n",
"function cubehelixConvert(o) {\n",
" if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n",
" if (!(o instanceof Rgb)) o = rgbConvert(o);\n",
" var r = o.r / 255,\n",
" g = o.g / 255,\n",
" b = o.b / 255,\n",
" l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n",
" bl = b - l,\n",
" k = (E * (g - l) - C * bl) / D,\n",
" s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n",
" h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n",
" return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n",
"}\n",
"\n",
"function cubehelix(h, s, l, opacity) {\n",
" return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n",
"}\n",
"\n",
"function Cubehelix(h, s, l, opacity) {\n",
" this.h = +h;\n",
" this.s = +s;\n",
" this.l = +l;\n",
" this.opacity = +opacity;\n",
"}\n",
"\n",
"define(Cubehelix, cubehelix, extend(Color, {\n",
" brighter: function(k) {\n",
" k = k == null ? brighter : Math.pow(brighter, k);\n",
" return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n",
" },\n",
" darker: function(k) {\n",
" k = k == null ? darker : Math.pow(darker, k);\n",
" return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n",
" },\n",
" rgb: function() {\n",
" var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n",
" l = +this.l,\n",
" a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n",
" cosh = Math.cos(h),\n",
" sinh = Math.sin(h);\n",
" return new Rgb(\n",
" 255 * (l + a * (A * cosh + B * sinh)),\n",
" 255 * (l + a * (C * cosh + D * sinh)),\n",
" 255 * (l + a * (E * cosh)),\n",
" this.opacity\n",
" );\n",
" }\n",
"}));\n",
"\n",
"exports.color = color;\n",
"exports.cubehelix = cubehelix;\n",
"exports.gray = gray;\n",
"exports.hcl = hcl;\n",
"exports.hsl = hsl;\n",
"exports.lab = lab;\n",
"exports.lch = lch;\n",
"exports.rgb = rgb;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],5:[function(require,module,exports){\n",
"// https://d3js.org/d3-dispatch/ v1.0.6 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"var noop = {value: function() {}};\n",
"\n",
"function dispatch() {\n",
" for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n",
" if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n",
" _[t] = [];\n",
" }\n",
" return new Dispatch(_);\n",
"}\n",
"\n",
"function Dispatch(_) {\n",
" this._ = _;\n",
"}\n",
"\n",
"function parseTypenames(typenames, types) {\n",
" return typenames.trim().split(/^|\\s+/).map(function(t) {\n",
" var name = \"\", i = t.indexOf(\".\");\n",
" if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n",
" if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n",
" return {type: t, name: name};\n",
" });\n",
"}\n",
"\n",
"Dispatch.prototype = dispatch.prototype = {\n",
" constructor: Dispatch,\n",
" on: function(typename, callback) {\n",
" var _ = this._,\n",
" T = parseTypenames(typename + \"\", _),\n",
" t,\n",
" i = -1,\n",
" n = T.length;\n",
"\n",
" // If no callback was specified, return the callback of the given type and name.\n",
" if (arguments.length < 2) {\n",
" while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n",
" return;\n",
" }\n",
"\n",
" // If a type was specified, set the callback for the given type and name.\n",
" // Otherwise, if a null callback was specified, remove callbacks of the given name.\n",
" if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n",
" while (++i < n) {\n",
" if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n",
" else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n",
" }\n",
"\n",
" return this;\n",
" },\n",
" copy: function() {\n",
" var copy = {}, _ = this._;\n",
" for (var t in _) copy[t] = _[t].slice();\n",
" return new Dispatch(copy);\n",
" },\n",
" call: function(type, that) {\n",
" if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n",
" if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n",
" for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n",
" },\n",
" apply: function(type, that, args) {\n",
" if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n",
" for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n",
" }\n",
"};\n",
"\n",
"function get(type, name) {\n",
" for (var i = 0, n = type.length, c; i < n; ++i) {\n",
" if ((c = type[i]).name === name) {\n",
" return c.value;\n",
" }\n",
" }\n",
"}\n",
"\n",
"function set(type, name, callback) {\n",
" for (var i = 0, n = type.length; i < n; ++i) {\n",
" if (type[i].name === name) {\n",
" type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n",
" break;\n",
" }\n",
" }\n",
" if (callback != null) type.push({name: name, value: callback});\n",
" return type;\n",
"}\n",
"\n",
"exports.dispatch = dispatch;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],6:[function(require,module,exports){\n",
"// https://d3js.org/d3-ease/ v1.0.6 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"function linear(t) {\n",
" return +t;\n",
"}\n",
"\n",
"function quadIn(t) {\n",
" return t * t;\n",
"}\n",
"\n",
"function quadOut(t) {\n",
" return t * (2 - t);\n",
"}\n",
"\n",
"function quadInOut(t) {\n",
" return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n",
"}\n",
"\n",
"function cubicIn(t) {\n",
" return t * t * t;\n",
"}\n",
"\n",
"function cubicOut(t) {\n",
" return --t * t * t + 1;\n",
"}\n",
"\n",
"function cubicInOut(t) {\n",
" return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n",
"}\n",
"\n",
"var exponent = 3;\n",
"\n",
"var polyIn = (function custom(e) {\n",
" e = +e;\n",
"\n",
" function polyIn(t) {\n",
" return Math.pow(t, e);\n",
" }\n",
"\n",
" polyIn.exponent = custom;\n",
"\n",
" return polyIn;\n",
"})(exponent);\n",
"\n",
"var polyOut = (function custom(e) {\n",
" e = +e;\n",
"\n",
" function polyOut(t) {\n",
" return 1 - Math.pow(1 - t, e);\n",
" }\n",
"\n",
" polyOut.exponent = custom;\n",
"\n",
" return polyOut;\n",
"})(exponent);\n",
"\n",
"var polyInOut = (function custom(e) {\n",
" e = +e;\n",
"\n",
" function polyInOut(t) {\n",
" return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n",
" }\n",
"\n",
" polyInOut.exponent = custom;\n",
"\n",
" return polyInOut;\n",
"})(exponent);\n",
"\n",
"var pi = Math.PI,\n",
" halfPi = pi / 2;\n",
"\n",
"function sinIn(t) {\n",
" return 1 - Math.cos(t * halfPi);\n",
"}\n",
"\n",
"function sinOut(t) {\n",
" return Math.sin(t * halfPi);\n",
"}\n",
"\n",
"function sinInOut(t) {\n",
" return (1 - Math.cos(pi * t)) / 2;\n",
"}\n",
"\n",
"function expIn(t) {\n",
" return Math.pow(2, 10 * t - 10);\n",
"}\n",
"\n",
"function expOut(t) {\n",
" return 1 - Math.pow(2, -10 * t);\n",
"}\n",
"\n",
"function expInOut(t) {\n",
" return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n",
"}\n",
"\n",
"function circleIn(t) {\n",
" return 1 - Math.sqrt(1 - t * t);\n",
"}\n",
"\n",
"function circleOut(t) {\n",
" return Math.sqrt(1 - --t * t);\n",
"}\n",
"\n",
"function circleInOut(t) {\n",
" return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n",
"}\n",
"\n",
"var b1 = 4 / 11,\n",
" b2 = 6 / 11,\n",
" b3 = 8 / 11,\n",
" b4 = 3 / 4,\n",
" b5 = 9 / 11,\n",
" b6 = 10 / 11,\n",
" b7 = 15 / 16,\n",
" b8 = 21 / 22,\n",
" b9 = 63 / 64,\n",
" b0 = 1 / b1 / b1;\n",
"\n",
"function bounceIn(t) {\n",
" return 1 - bounceOut(1 - t);\n",
"}\n",
"\n",
"function bounceOut(t) {\n",
" return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n",
"}\n",
"\n",
"function bounceInOut(t) {\n",
" return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n",
"}\n",
"\n",
"var overshoot = 1.70158;\n",
"\n",
"var backIn = (function custom(s) {\n",
" s = +s;\n",
"\n",
" function backIn(t) {\n",
" return t * t * ((s + 1) * t - s);\n",
" }\n",
"\n",
" backIn.overshoot = custom;\n",
"\n",
" return backIn;\n",
"})(overshoot);\n",
"\n",
"var backOut = (function custom(s) {\n",
" s = +s;\n",
"\n",
" function backOut(t) {\n",
" return --t * t * ((s + 1) * t + s) + 1;\n",
" }\n",
"\n",
" backOut.overshoot = custom;\n",
"\n",
" return backOut;\n",
"})(overshoot);\n",
"\n",
"var backInOut = (function custom(s) {\n",
" s = +s;\n",
"\n",
" function backInOut(t) {\n",
" return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n",
" }\n",
"\n",
" backInOut.overshoot = custom;\n",
"\n",
" return backInOut;\n",
"})(overshoot);\n",
"\n",
"var tau = 2 * Math.PI,\n",
" amplitude = 1,\n",
" period = 0.3;\n",
"\n",
"var elasticIn = (function custom(a, p) {\n",
" var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n",
"\n",
" function elasticIn(t) {\n",
" return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n",
" }\n",
"\n",
" elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n",
" elasticIn.period = function(p) { return custom(a, p); };\n",
"\n",
" return elasticIn;\n",
"})(amplitude, period);\n",
"\n",
"var elasticOut = (function custom(a, p) {\n",
" var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n",
"\n",
" function elasticOut(t) {\n",
" return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n",
" }\n",
"\n",
" elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n",
" elasticOut.period = function(p) { return custom(a, p); };\n",
"\n",
" return elasticOut;\n",
"})(amplitude, period);\n",
"\n",
"var elasticInOut = (function custom(a, p) {\n",
" var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n",
"\n",
" function elasticInOut(t) {\n",
" return ((t = t * 2 - 1) < 0\n",
" ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\n",
" : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n",
" }\n",
"\n",
" elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n",
" elasticInOut.period = function(p) { return custom(a, p); };\n",
"\n",
" return elasticInOut;\n",
"})(amplitude, period);\n",
"\n",
"exports.easeBack = backInOut;\n",
"exports.easeBackIn = backIn;\n",
"exports.easeBackInOut = backInOut;\n",
"exports.easeBackOut = backOut;\n",
"exports.easeBounce = bounceOut;\n",
"exports.easeBounceIn = bounceIn;\n",
"exports.easeBounceInOut = bounceInOut;\n",
"exports.easeBounceOut = bounceOut;\n",
"exports.easeCircle = circleInOut;\n",
"exports.easeCircleIn = circleIn;\n",
"exports.easeCircleInOut = circleInOut;\n",
"exports.easeCircleOut = circleOut;\n",
"exports.easeCubic = cubicInOut;\n",
"exports.easeCubicIn = cubicIn;\n",
"exports.easeCubicInOut = cubicInOut;\n",
"exports.easeCubicOut = cubicOut;\n",
"exports.easeElastic = elasticOut;\n",
"exports.easeElasticIn = elasticIn;\n",
"exports.easeElasticInOut = elasticInOut;\n",
"exports.easeElasticOut = elasticOut;\n",
"exports.easeExp = expInOut;\n",
"exports.easeExpIn = expIn;\n",
"exports.easeExpInOut = expInOut;\n",
"exports.easeExpOut = expOut;\n",
"exports.easeLinear = linear;\n",
"exports.easePoly = polyInOut;\n",
"exports.easePolyIn = polyIn;\n",
"exports.easePolyInOut = polyInOut;\n",
"exports.easePolyOut = polyOut;\n",
"exports.easeQuad = quadInOut;\n",
"exports.easeQuadIn = quadIn;\n",
"exports.easeQuadInOut = quadInOut;\n",
"exports.easeQuadOut = quadOut;\n",
"exports.easeSin = sinInOut;\n",
"exports.easeSinIn = sinIn;\n",
"exports.easeSinInOut = sinInOut;\n",
"exports.easeSinOut = sinOut;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],7:[function(require,module,exports){\n",
"// https://d3js.org/d3-format/ v1.4.2 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"// Computes the decimal coefficient and exponent of the specified number x with\n",
"// significant digits p, where x is positive and p is in [1, 21] or undefined.\n",
"// For example, formatDecimal(1.23) returns [\"123\", 0].\n",
"function formatDecimal(x, p) {\n",
" if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, +/-Infinity\n",
" var i, coefficient = x.slice(0, i);\n",
"\n",
" // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n",
" // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n",
" return [\n",
" coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n",
" +x.slice(i + 1)\n",
" ];\n",
"}\n",
"\n",
"function exponent(x) {\n",
" return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n",
"}\n",
"\n",
"function formatGroup(grouping, thousands) {\n",
" return function(value, width) {\n",
" var i = value.length,\n",
" t = [],\n",
" j = 0,\n",
" g = grouping[0],\n",
" length = 0;\n",
"\n",
" while (i > 0 && g > 0) {\n",
" if (length + g + 1 > width) g = Math.max(1, width - length);\n",
" t.push(value.substring(i -= g, i + g));\n",
" if ((length += g + 1) > width) break;\n",
" g = grouping[j = (j + 1) % grouping.length];\n",
" }\n",
"\n",
" return t.reverse().join(thousands);\n",
" };\n",
"}\n",
"\n",
"function formatNumerals(numerals) {\n",
" return function(value) {\n",
" return value.replace(/[0-9]/g, function(i) {\n",
" return numerals[+i];\n",
" });\n",
" };\n",
"}\n",
"\n",
"// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\n",
"var re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n",
"\n",
"function formatSpecifier(specifier) {\n",
" if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n",
" var match;\n",
" return new FormatSpecifier({\n",
" fill: match[1],\n",
" align: match[2],\n",
" sign: match[3],\n",
" symbol: match[4],\n",
" zero: match[5],\n",
" width: match[6],\n",
" comma: match[7],\n",
" precision: match[8] && match[8].slice(1),\n",
" trim: match[9],\n",
" type: match[10]\n",
" });\n",
"}\n",
"\n",
"formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n",
"\n",
"function FormatSpecifier(specifier) {\n",
" this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n",
" this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n",
" this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n",
" this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n",
" this.zero = !!specifier.zero;\n",
" this.width = specifier.width === undefined ? undefined : +specifier.width;\n",
" this.comma = !!specifier.comma;\n",
" this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n",
" this.trim = !!specifier.trim;\n",
" this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n",
"}\n",
"\n",
"FormatSpecifier.prototype.toString = function() {\n",
" return this.fill\n",
" + this.align\n",
" + this.sign\n",
" + this.symbol\n",
" + (this.zero ? \"0\" : \"\")\n",
" + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n",
" + (this.comma ? \",\" : \"\")\n",
" + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n",
" + (this.trim ? \"~\" : \"\")\n",
" + this.type;\n",
"};\n",
"\n",
"// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\n",
"function formatTrim(s) {\n",
" out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n",
" switch (s[i]) {\n",
" case \".\": i0 = i1 = i; break;\n",
" case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n",
" default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;\n",
" }\n",
" }\n",
" return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n",
"}\n",
"\n",
"var prefixExponent;\n",
"\n",
"function formatPrefixAuto(x, p) {\n",
" var d = formatDecimal(x, p);\n",
" if (!d) return x + \"\";\n",
" var coefficient = d[0],\n",
" exponent = d[1],\n",
" i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n",
" n = coefficient.length;\n",
" return i === n ? coefficient\n",
" : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n",
" : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n",
" : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n",
"}\n",
"\n",
"function formatRounded(x, p) {\n",
" var d = formatDecimal(x, p);\n",
" if (!d) return x + \"\";\n",
" var coefficient = d[0],\n",
" exponent = d[1];\n",
" return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n",
" : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n",
" : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n",
"}\n",
"\n",
"var formatTypes = {\n",
" \"%\": function(x, p) { return (x * 100).toFixed(p); },\n",
" \"b\": function(x) { return Math.round(x).toString(2); },\n",
" \"c\": function(x) { return x + \"\"; },\n",
" \"d\": function(x) { return Math.round(x).toString(10); },\n",
" \"e\": function(x, p) { return x.toExponential(p); },\n",
" \"f\": function(x, p) { return x.toFixed(p); },\n",
" \"g\": function(x, p) { return x.toPrecision(p); },\n",
" \"o\": function(x) { return Math.round(x).toString(8); },\n",
" \"p\": function(x, p) { return formatRounded(x * 100, p); },\n",
" \"r\": formatRounded,\n",
" \"s\": formatPrefixAuto,\n",
" \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n",
" \"x\": function(x) { return Math.round(x).toString(16); }\n",
"};\n",
"\n",
"function identity(x) {\n",
" return x;\n",
"}\n",
"\n",
"var map = Array.prototype.map,\n",
" prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"u\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n",
"\n",
"function formatLocale(locale) {\n",
" var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n",
" currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n",
" currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n",
" decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n",
" numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n",
" percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n",
" minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n",
" nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n",
"\n",
" function newFormat(specifier) {\n",
" specifier = formatSpecifier(specifier);\n",
"\n",
" var fill = specifier.fill,\n",
" align = specifier.align,\n",
" sign = specifier.sign,\n",
" symbol = specifier.symbol,\n",
" zero = specifier.zero,\n",
" width = specifier.width,\n",
" comma = specifier.comma,\n",
" precision = specifier.precision,\n",
" trim = specifier.trim,\n",
" type = specifier.type;\n",
"\n",
" // The \"n\" type is an alias for \",g\".\n",
" if (type === \"n\") comma = true, type = \"g\";\n",
"\n",
" // The \"\" type, and any invalid type, is an alias for \".12~g\".\n",
" else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n",
"\n",
" // If zero fill is specified, padding goes after sign and before digits.\n",
" if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n",
"\n",
" // Compute the prefix and suffix.\n",
" // For SI-prefix, the suffix is lazily computed.\n",
" var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n",
" suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n",
"\n",
" // What format function should we use?\n",
" // Is this an integer type?\n",
" // Can this type generate exponential notation?\n",
" var formatType = formatTypes[type],\n",
" maybeSuffix = /[defgprs%]/.test(type);\n",
"\n",
" // Set the default precision if not specified,\n",
" // or clamp the specified precision to the supported range.\n",
" // For significant precision, it must be in [1, 21].\n",
" // For fixed precision, it must be in [0, 20].\n",
" precision = precision === undefined ? 6\n",
" : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n",
" : Math.max(0, Math.min(20, precision));\n",
"\n",
" function format(value) {\n",
" var valuePrefix = prefix,\n",
" valueSuffix = suffix,\n",
" i, n, c;\n",
"\n",
" if (type === \"c\") {\n",
" valueSuffix = formatType(value) + valueSuffix;\n",
" value = \"\";\n",
" } else {\n",
" value = +value;\n",
"\n",
" // Perform the initial formatting.\n",
" var valueNegative = value < 0;\n",
" value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n",
"\n",
" // Trim insignificant zeros.\n",
" if (trim) value = formatTrim(value);\n",
"\n",
" // If a negative value rounds to zero during formatting, treat as positive.\n",
" if (valueNegative && +value === 0) valueNegative = false;\n",
"\n",
" // Compute the prefix and suffix.\n",
" valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n",
"\n",
" valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n",
"\n",
" // Break the formatted value into the integer \"value\" part that can be\n",
" // grouped, and fractional or exponential \"suffix\" part that is not.\n",
" if (maybeSuffix) {\n",
" i = -1, n = value.length;\n",
" while (++i < n) {\n",
" if (c = value.charCodeAt(i), 48 > c || c > 57) {\n",
" valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n",
" value = value.slice(0, i);\n",
" break;\n",
" }\n",
" }\n",
" }\n",
" }\n",
"\n",
" // If the fill character is not \"0\", grouping is applied before padding.\n",
" if (comma && !zero) value = group(value, Infinity);\n",
"\n",
" // Compute the padding.\n",
" var length = valuePrefix.length + value.length + valueSuffix.length,\n",
" padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n",
"\n",
" // If the fill character is \"0\", grouping is applied after padding.\n",
" if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n",
"\n",
" // Reconstruct the final output based on the desired alignment.\n",
" switch (align) {\n",
" case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n",
" case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n",
" case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n",
" default: value = padding + valuePrefix + value + valueSuffix; break;\n",
" }\n",
"\n",
" return numerals(value);\n",
" }\n",
"\n",
" format.toString = function() {\n",
" return specifier + \"\";\n",
" };\n",
"\n",
" return format;\n",
" }\n",
"\n",
" function formatPrefix(specifier, value) {\n",
" var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n",
" e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n",
" k = Math.pow(10, -e),\n",
" prefix = prefixes[8 + e / 3];\n",
" return function(value) {\n",
" return f(k * value) + prefix;\n",
" };\n",
" }\n",
"\n",
" return {\n",
" format: newFormat,\n",
" formatPrefix: formatPrefix\n",
" };\n",
"}\n",
"\n",
"var locale;\n",
"\n",
"defaultLocale({\n",
" decimal: \".\",\n",
" thousands: \",\",\n",
" grouping: [3],\n",
" currency: [\"$\", \"\"],\n",
" minus: \"-\"\n",
"});\n",
"\n",
"function defaultLocale(definition) {\n",
" locale = formatLocale(definition);\n",
" exports.format = locale.format;\n",
" exports.formatPrefix = locale.formatPrefix;\n",
" return locale;\n",
"}\n",
"\n",
"function precisionFixed(step) {\n",
" return Math.max(0, -exponent(Math.abs(step)));\n",
"}\n",
"\n",
"function precisionPrefix(step, value) {\n",
" return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n",
"}\n",
"\n",
"function precisionRound(step, max) {\n",
" step = Math.abs(step), max = Math.abs(max) - step;\n",
" return Math.max(0, exponent(max) - exponent(step)) + 1;\n",
"}\n",
"\n",
"exports.FormatSpecifier = FormatSpecifier;\n",
"exports.formatDefaultLocale = defaultLocale;\n",
"exports.formatLocale = formatLocale;\n",
"exports.formatSpecifier = formatSpecifier;\n",
"exports.precisionFixed = precisionFixed;\n",
"exports.precisionPrefix = precisionPrefix;\n",
"exports.precisionRound = precisionRound;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],8:[function(require,module,exports){\n",
"// https://d3js.org/d3-interpolate/ v1.4.0 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) :\n",
"typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}, global.d3));\n",
"}(this, function (exports, d3Color) { 'use strict';\n",
"\n",
"function basis(t1, v0, v1, v2, v3) {\n",
" var t2 = t1 * t1, t3 = t2 * t1;\n",
" return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n",
" + (4 - 6 * t2 + 3 * t3) * v1\n",
" + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n",
" + t3 * v3) / 6;\n",
"}\n",
"\n",
"function basis$1(values) {\n",
" var n = values.length - 1;\n",
" return function(t) {\n",
" var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n",
" v1 = values[i],\n",
" v2 = values[i + 1],\n",
" v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n",
" v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n",
" return basis((t - i / n) * n, v0, v1, v2, v3);\n",
" };\n",
"}\n",
"\n",
"function basisClosed(values) {\n",
" var n = values.length;\n",
" return function(t) {\n",
" var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n",
" v0 = values[(i + n - 1) % n],\n",
" v1 = values[i % n],\n",
" v2 = values[(i + 1) % n],\n",
" v3 = values[(i + 2) % n];\n",
" return basis((t - i / n) * n, v0, v1, v2, v3);\n",
" };\n",
"}\n",
"\n",
"function constant(x) {\n",
" return function() {\n",
" return x;\n",
" };\n",
"}\n",
"\n",
"function linear(a, d) {\n",
" return function(t) {\n",
" return a + t * d;\n",
" };\n",
"}\n",
"\n",
"function exponential(a, b, y) {\n",
" return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n",
" return Math.pow(a + t * b, y);\n",
" };\n",
"}\n",
"\n",
"function hue(a, b) {\n",
" var d = b - a;\n",
" return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n",
"}\n",
"\n",
"function gamma(y) {\n",
" return (y = +y) === 1 ? nogamma : function(a, b) {\n",
" return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n",
" };\n",
"}\n",
"\n",
"function nogamma(a, b) {\n",
" var d = b - a;\n",
" return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n",
"}\n",
"\n",
"var rgb = (function rgbGamma(y) {\n",
" var color = gamma(y);\n",
"\n",
" function rgb(start, end) {\n",
" var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r),\n",
" g = color(start.g, end.g),\n",
" b = color(start.b, end.b),\n",
" opacity = nogamma(start.opacity, end.opacity);\n",
" return function(t) {\n",
" start.r = r(t);\n",
" start.g = g(t);\n",
" start.b = b(t);\n",
" start.opacity = opacity(t);\n",
" return start + \"\";\n",
" };\n",
" }\n",
"\n",
" rgb.gamma = rgbGamma;\n",
"\n",
" return rgb;\n",
"})(1);\n",
"\n",
"function rgbSpline(spline) {\n",
" return function(colors) {\n",
" var n = colors.length,\n",
" r = new Array(n),\n",
" g = new Array(n),\n",
" b = new Array(n),\n",
" i, color;\n",
" for (i = 0; i < n; ++i) {\n",
" color = d3Color.rgb(colors[i]);\n",
" r[i] = color.r || 0;\n",
" g[i] = color.g || 0;\n",
" b[i] = color.b || 0;\n",
" }\n",
" r = spline(r);\n",
" g = spline(g);\n",
" b = spline(b);\n",
" color.opacity = 1;\n",
" return function(t) {\n",
" color.r = r(t);\n",
" color.g = g(t);\n",
" color.b = b(t);\n",
" return color + \"\";\n",
" };\n",
" };\n",
"}\n",
"\n",
"var rgbBasis = rgbSpline(basis$1);\n",
"var rgbBasisClosed = rgbSpline(basisClosed);\n",
"\n",
"function numberArray(a, b) {\n",
" if (!b) b = [];\n",
" var n = a ? Math.min(b.length, a.length) : 0,\n",
" c = b.slice(),\n",
" i;\n",
" return function(t) {\n",
" for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n",
" return c;\n",
" };\n",
"}\n",
"\n",
"function isNumberArray(x) {\n",
" return ArrayBuffer.isView(x) && !(x instanceof DataView);\n",
"}\n",
"\n",
"function array(a, b) {\n",
" return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n",
"}\n",
"\n",
"function genericArray(a, b) {\n",
" var nb = b ? b.length : 0,\n",
" na = a ? Math.min(nb, a.length) : 0,\n",
" x = new Array(na),\n",
" c = new Array(nb),\n",
" i;\n",
"\n",
" for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n",
" for (; i < nb; ++i) c[i] = b[i];\n",
"\n",
" return function(t) {\n",
" for (i = 0; i < na; ++i) c[i] = x[i](t);\n",
" return c;\n",
" };\n",
"}\n",
"\n",
"function date(a, b) {\n",
" var d = new Date;\n",
" return a = +a, b = +b, function(t) {\n",
" return d.setTime(a * (1 - t) + b * t), d;\n",
" };\n",
"}\n",
"\n",
"function number(a, b) {\n",
" return a = +a, b = +b, function(t) {\n",
" return a * (1 - t) + b * t;\n",
" };\n",
"}\n",
"\n",
"function object(a, b) {\n",
" var i = {},\n",
" c = {},\n",
" k;\n",
"\n",
" if (a === null || typeof a !== \"object\") a = {};\n",
" if (b === null || typeof b !== \"object\") b = {};\n",
"\n",
" for (k in b) {\n",
" if (k in a) {\n",
" i[k] = value(a[k], b[k]);\n",
" } else {\n",
" c[k] = b[k];\n",
" }\n",
" }\n",
"\n",
" return function(t) {\n",
" for (k in i) c[k] = i[k](t);\n",
" return c;\n",
" };\n",
"}\n",
"\n",
"var reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n",
" reB = new RegExp(reA.source, \"g\");\n",
"\n",
"function zero(b) {\n",
" return function() {\n",
" return b;\n",
" };\n",
"}\n",
"\n",
"function one(b) {\n",
" return function(t) {\n",
" return b(t) + \"\";\n",
" };\n",
"}\n",
"\n",
"function string(a, b) {\n",
" var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n",
" am, // current match in a\n",
" bm, // current match in b\n",
" bs, // string preceding current number in b, if any\n",
" i = -1, // index in s\n",
" s = [], // string constants and placeholders\n",
" q = []; // number interpolators\n",
"\n",
" // Coerce inputs to strings.\n",
" a = a + \"\", b = b + \"\";\n",
"\n",
" // Interpolate pairs of numbers in a & b.\n",
" while ((am = reA.exec(a))\n",
" && (bm = reB.exec(b))) {\n",
" if ((bs = bm.index) > bi) { // a string precedes the next number in b\n",
" bs = b.slice(bi, bs);\n",
" if (s[i]) s[i] += bs; // coalesce with previous string\n",
" else s[++i] = bs;\n",
" }\n",
" if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n",
" if (s[i]) s[i] += bm; // coalesce with previous string\n",
" else s[++i] = bm;\n",
" } else { // interpolate non-matching numbers\n",
" s[++i] = null;\n",
" q.push({i: i, x: number(am, bm)});\n",
" }\n",
" bi = reB.lastIndex;\n",
" }\n",
"\n",
" // Add remains of b.\n",
" if (bi < b.length) {\n",
" bs = b.slice(bi);\n",
" if (s[i]) s[i] += bs; // coalesce with previous string\n",
" else s[++i] = bs;\n",
" }\n",
"\n",
" // Special optimization for only a single match.\n",
" // Otherwise, interpolate each of the numbers and rejoin the string.\n",
" return s.length < 2 ? (q[0]\n",
" ? one(q[0].x)\n",
" : zero(b))\n",
" : (b = q.length, function(t) {\n",
" for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n",
" return s.join(\"\");\n",
" });\n",
"}\n",
"\n",
"function value(a, b) {\n",
" var t = typeof b, c;\n",
" return b == null || t === \"boolean\" ? constant(b)\n",
" : (t === \"number\" ? number\n",
" : t === \"string\" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string)\n",
" : b instanceof d3Color.color ? rgb\n",
" : b instanceof Date ? date\n",
" : isNumberArray(b) ? numberArray\n",
" : Array.isArray(b) ? genericArray\n",
" : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n",
" : number)(a, b);\n",
"}\n",
"\n",
"function discrete(range) {\n",
" var n = range.length;\n",
" return function(t) {\n",
" return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n",
" };\n",
"}\n",
"\n",
"function hue$1(a, b) {\n",
" var i = hue(+a, +b);\n",
" return function(t) {\n",
" var x = i(t);\n",
" return x - 360 * Math.floor(x / 360);\n",
" };\n",
"}\n",
"\n",
"function round(a, b) {\n",
" return a = +a, b = +b, function(t) {\n",
" return Math.round(a * (1 - t) + b * t);\n",
" };\n",
"}\n",
"\n",
"var degrees = 180 / Math.PI;\n",
"\n",
"var identity = {\n",
" translateX: 0,\n",
" translateY: 0,\n",
" rotate: 0,\n",
" skewX: 0,\n",
" scaleX: 1,\n",
" scaleY: 1\n",
"};\n",
"\n",
"function decompose(a, b, c, d, e, f) {\n",
" var scaleX, scaleY, skewX;\n",
" if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n",
" if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n",
" if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n",
" if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n",
" return {\n",
" translateX: e,\n",
" translateY: f,\n",
" rotate: Math.atan2(b, a) * degrees,\n",
" skewX: Math.atan(skewX) * degrees,\n",
" scaleX: scaleX,\n",
" scaleY: scaleY\n",
" };\n",
"}\n",
"\n",
"var cssNode,\n",
" cssRoot,\n",
" cssView,\n",
" svgNode;\n",
"\n",
"function parseCss(value) {\n",
" if (value === \"none\") return identity;\n",
" if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n",
" cssNode.style.transform = value;\n",
" value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n",
" cssRoot.removeChild(cssNode);\n",
" value = value.slice(7, -1).split(\",\");\n",
" return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n",
"}\n",
"\n",
"function parseSvg(value) {\n",
" if (value == null) return identity;\n",
" if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n",
" svgNode.setAttribute(\"transform\", value);\n",
" if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n",
" value = value.matrix;\n",
" return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n",
"}\n",
"\n",
"function interpolateTransform(parse, pxComma, pxParen, degParen) {\n",
"\n",
" function pop(s) {\n",
" return s.length ? s.pop() + \" \" : \"\";\n",
" }\n",
"\n",
" function translate(xa, ya, xb, yb, s, q) {\n",
" if (xa !== xb || ya !== yb) {\n",
" var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n",
" q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n",
" } else if (xb || yb) {\n",
" s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n",
" }\n",
" }\n",
"\n",
" function rotate(a, b, s, q) {\n",
" if (a !== b) {\n",
" if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n",
" q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n",
" } else if (b) {\n",
" s.push(pop(s) + \"rotate(\" + b + degParen);\n",
" }\n",
" }\n",
"\n",
" function skewX(a, b, s, q) {\n",
" if (a !== b) {\n",
" q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n",
" } else if (b) {\n",
" s.push(pop(s) + \"skewX(\" + b + degParen);\n",
" }\n",
" }\n",
"\n",
" function scale(xa, ya, xb, yb, s, q) {\n",
" if (xa !== xb || ya !== yb) {\n",
" var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n",
" q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n",
" } else if (xb !== 1 || yb !== 1) {\n",
" s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n",
" }\n",
" }\n",
"\n",
" return function(a, b) {\n",
" var s = [], // string constants and placeholders\n",
" q = []; // number interpolators\n",
" a = parse(a), b = parse(b);\n",
" translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n",
" rotate(a.rotate, b.rotate, s, q);\n",
" skewX(a.skewX, b.skewX, s, q);\n",
" scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n",
" a = b = null; // gc\n",
" return function(t) {\n",
" var i = -1, n = q.length, o;\n",
" while (++i < n) s[(o = q[i]).i] = o.x(t);\n",
" return s.join(\"\");\n",
" };\n",
" };\n",
"}\n",
"\n",
"var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\n",
"var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n",
"\n",
"var rho = Math.SQRT2,\n",
" rho2 = 2,\n",
" rho4 = 4,\n",
" epsilon2 = 1e-12;\n",
"\n",
"function cosh(x) {\n",
" return ((x = Math.exp(x)) + 1 / x) / 2;\n",
"}\n",
"\n",
"function sinh(x) {\n",
" return ((x = Math.exp(x)) - 1 / x) / 2;\n",
"}\n",
"\n",
"function tanh(x) {\n",
" return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n",
"}\n",
"\n",
"// p0 = [ux0, uy0, w0]\n",
"// p1 = [ux1, uy1, w1]\n",
"function zoom(p0, p1) {\n",
" var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n",
" ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n",
" dx = ux1 - ux0,\n",
" dy = uy1 - uy0,\n",
" d2 = dx * dx + dy * dy,\n",
" i,\n",
" S;\n",
"\n",
" // Special case for u0 u1.\n",
" if (d2 < epsilon2) {\n",
" S = Math.log(w1 / w0) / rho;\n",
" i = function(t) {\n",
" return [\n",
" ux0 + t * dx,\n",
" uy0 + t * dy,\n",
" w0 * Math.exp(rho * t * S)\n",
" ];\n",
" };\n",
" }\n",
"\n",
" // General case.\n",
" else {\n",
" var d1 = Math.sqrt(d2),\n",
" b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n",
" b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n",
" r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n",
" r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n",
" S = (r1 - r0) / rho;\n",
" i = function(t) {\n",
" var s = t * S,\n",
" coshr0 = cosh(r0),\n",
" u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n",
" return [\n",
" ux0 + u * dx,\n",
" uy0 + u * dy,\n",
" w0 * coshr0 / cosh(rho * s + r0)\n",
" ];\n",
" };\n",
" }\n",
"\n",
" i.duration = S * 1000;\n",
"\n",
" return i;\n",
"}\n",
"\n",
"function hsl(hue) {\n",
" return function(start, end) {\n",
" var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h),\n",
" s = nogamma(start.s, end.s),\n",
" l = nogamma(start.l, end.l),\n",
" opacity = nogamma(start.opacity, end.opacity);\n",
" return function(t) {\n",
" start.h = h(t);\n",
" start.s = s(t);\n",
" start.l = l(t);\n",
" start.opacity = opacity(t);\n",
" return start + \"\";\n",
" };\n",
" }\n",
"}\n",
"\n",
"var hsl$1 = hsl(hue);\n",
"var hslLong = hsl(nogamma);\n",
"\n",
"function lab(start, end) {\n",
" var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l),\n",
" a = nogamma(start.a, end.a),\n",
" b = nogamma(start.b, end.b),\n",
" opacity = nogamma(start.opacity, end.opacity);\n",
" return function(t) {\n",
" start.l = l(t);\n",
" start.a = a(t);\n",
" start.b = b(t);\n",
" start.opacity = opacity(t);\n",
" return start + \"\";\n",
" };\n",
"}\n",
"\n",
"function hcl(hue) {\n",
" return function(start, end) {\n",
" var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h),\n",
" c = nogamma(start.c, end.c),\n",
" l = nogamma(start.l, end.l),\n",
" opacity = nogamma(start.opacity, end.opacity);\n",
" return function(t) {\n",
" start.h = h(t);\n",
" start.c = c(t);\n",
" start.l = l(t);\n",
" start.opacity = opacity(t);\n",
" return start + \"\";\n",
" };\n",
" }\n",
"}\n",
"\n",
"var hcl$1 = hcl(hue);\n",
"var hclLong = hcl(nogamma);\n",
"\n",
"function cubehelix(hue) {\n",
" return (function cubehelixGamma(y) {\n",
" y = +y;\n",
"\n",
" function cubehelix(start, end) {\n",
" var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h),\n",
" s = nogamma(start.s, end.s),\n",
" l = nogamma(start.l, end.l),\n",
" opacity = nogamma(start.opacity, end.opacity);\n",
" return function(t) {\n",
" start.h = h(t);\n",
" start.s = s(t);\n",
" start.l = l(Math.pow(t, y));\n",
" start.opacity = opacity(t);\n",
" return start + \"\";\n",
" };\n",
" }\n",
"\n",
" cubehelix.gamma = cubehelixGamma;\n",
"\n",
" return cubehelix;\n",
" })(1);\n",
"}\n",
"\n",
"var cubehelix$1 = cubehelix(hue);\n",
"var cubehelixLong = cubehelix(nogamma);\n",
"\n",
"function piecewise(interpolate, values) {\n",
" var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);\n",
" while (i < n) I[i] = interpolate(v, v = values[++i]);\n",
" return function(t) {\n",
" var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n",
" return I[i](t - i);\n",
" };\n",
"}\n",
"\n",
"function quantize(interpolator, n) {\n",
" var samples = new Array(n);\n",
" for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n",
" return samples;\n",
"}\n",
"\n",
"exports.interpolate = value;\n",
"exports.interpolateArray = array;\n",
"exports.interpolateBasis = basis$1;\n",
"exports.interpolateBasisClosed = basisClosed;\n",
"exports.interpolateCubehelix = cubehelix$1;\n",
"exports.interpolateCubehelixLong = cubehelixLong;\n",
"exports.interpolateDate = date;\n",
"exports.interpolateDiscrete = discrete;\n",
"exports.interpolateHcl = hcl$1;\n",
"exports.interpolateHclLong = hclLong;\n",
"exports.interpolateHsl = hsl$1;\n",
"exports.interpolateHslLong = hslLong;\n",
"exports.interpolateHue = hue$1;\n",
"exports.interpolateLab = lab;\n",
"exports.interpolateNumber = number;\n",
"exports.interpolateNumberArray = numberArray;\n",
"exports.interpolateObject = object;\n",
"exports.interpolateRgb = rgb;\n",
"exports.interpolateRgbBasis = rgbBasis;\n",
"exports.interpolateRgbBasisClosed = rgbBasisClosed;\n",
"exports.interpolateRound = round;\n",
"exports.interpolateString = string;\n",
"exports.interpolateTransformCss = interpolateTransformCss;\n",
"exports.interpolateTransformSvg = interpolateTransformSvg;\n",
"exports.interpolateZoom = zoom;\n",
"exports.piecewise = piecewise;\n",
"exports.quantize = quantize;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{\"d3-color\":4}],9:[function(require,module,exports){\n",
"// https://d3js.org/d3-path/ v1.0.9 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"var pi = Math.PI,\n",
" tau = 2 * pi,\n",
" epsilon = 1e-6,\n",
" tauEpsilon = tau - epsilon;\n",
"\n",
"function Path() {\n",
" this._x0 = this._y0 = // start of current subpath\n",
" this._x1 = this._y1 = null; // end of current subpath\n",
" this._ = \"\";\n",
"}\n",
"\n",
"function path() {\n",
" return new Path;\n",
"}\n",
"\n",
"Path.prototype = path.prototype = {\n",
" constructor: Path,\n",
" moveTo: function(x, y) {\n",
" this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n",
" },\n",
" closePath: function() {\n",
" if (this._x1 !== null) {\n",
" this._x1 = this._x0, this._y1 = this._y0;\n",
" this._ += \"Z\";\n",
" }\n",
" },\n",
" lineTo: function(x, y) {\n",
" this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n",
" },\n",
" quadraticCurveTo: function(x1, y1, x, y) {\n",
" this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n",
" },\n",
" bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n",
" this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n",
" },\n",
" arcTo: function(x1, y1, x2, y2, r) {\n",
" x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n",
" var x0 = this._x1,\n",
" y0 = this._y1,\n",
" x21 = x2 - x1,\n",
" y21 = y2 - y1,\n",
" x01 = x0 - x1,\n",
" y01 = y0 - y1,\n",
" l01_2 = x01 * x01 + y01 * y01;\n",
"\n",
" // Is the radius negative? Error.\n",
" if (r < 0) throw new Error(\"negative radius: \" + r);\n",
"\n",
" // Is this path empty? Move to (x1,y1).\n",
" if (this._x1 === null) {\n",
" this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n",
" }\n",
"\n",
" // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n",
" else if (!(l01_2 > epsilon));\n",
"\n",
" // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n",
" // Equivalently, is (x1,y1) coincident with (x2,y2)?\n",
" // Or, is the radius zero? Line to (x1,y1).\n",
" else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n",
" this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n",
" }\n",
"\n",
" // Otherwise, draw an arc!\n",
" else {\n",
" var x20 = x2 - x0,\n",
" y20 = y2 - y0,\n",
" l21_2 = x21 * x21 + y21 * y21,\n",
" l20_2 = x20 * x20 + y20 * y20,\n",
" l21 = Math.sqrt(l21_2),\n",
" l01 = Math.sqrt(l01_2),\n",
" l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n",
" t01 = l / l01,\n",
" t21 = l / l21;\n",
"\n",
" // If the start tangent is not coincident with (x0,y0), line to.\n",
" if (Math.abs(t01 - 1) > epsilon) {\n",
" this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n",
" }\n",
"\n",
" this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n",
" }\n",
" },\n",
" arc: function(x, y, r, a0, a1, ccw) {\n",
" x = +x, y = +y, r = +r, ccw = !!ccw;\n",
" var dx = r * Math.cos(a0),\n",
" dy = r * Math.sin(a0),\n",
" x0 = x + dx,\n",
" y0 = y + dy,\n",
" cw = 1 ^ ccw,\n",
" da = ccw ? a0 - a1 : a1 - a0;\n",
"\n",
" // Is the radius negative? Error.\n",
" if (r < 0) throw new Error(\"negative radius: \" + r);\n",
"\n",
" // Is this path empty? Move to (x0,y0).\n",
" if (this._x1 === null) {\n",
" this._ += \"M\" + x0 + \",\" + y0;\n",
" }\n",
"\n",
" // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n",
" else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n",
" this._ += \"L\" + x0 + \",\" + y0;\n",
" }\n",
"\n",
" // Is this arc empty? We're done.\n",
" if (!r) return;\n",
"\n",
" // Does the angle go the wrong way? Flip the direction.\n",
" if (da < 0) da = da % tau + tau;\n",
"\n",
" // Is this a complete circle? Draw two arcs to complete the circle.\n",
" if (da > tauEpsilon) {\n",
" this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n",
" }\n",
"\n",
" // Is this arc non-empty? Draw an arc!\n",
" else if (da > epsilon) {\n",
" this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n",
" }\n",
" },\n",
" rect: function(x, y, w, h) {\n",
" this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n",
" },\n",
" toString: function() {\n",
" return this._;\n",
" }\n",
"};\n",
"\n",
"exports.path = path;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],10:[function(require,module,exports){\n",
"// https://d3js.org/d3-scale/ v3.2.1 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format')) :\n",
"typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3));\n",
"}(this, function (exports, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) { 'use strict';\n",
"\n",
"function initRange(domain, range) {\n",
" switch (arguments.length) {\n",
" case 0: break;\n",
" case 1: this.range(domain); break;\n",
" default: this.range(range).domain(domain); break;\n",
" }\n",
" return this;\n",
"}\n",
"\n",
"function initInterpolator(domain, interpolator) {\n",
" switch (arguments.length) {\n",
" case 0: break;\n",
" case 1: {\n",
" if (typeof domain === \"function\") this.interpolator(domain);\n",
" else this.range(domain);\n",
" break;\n",
" }\n",
" default: {\n",
" this.domain(domain);\n",
" if (typeof interpolator === \"function\") this.interpolator(interpolator);\n",
" else this.range(interpolator);\n",
" break;\n",
" }\n",
" }\n",
" return this;\n",
"}\n",
"\n",
"const implicit = Symbol(\"implicit\");\n",
"\n",
"function ordinal() {\n",
" var index = new Map(),\n",
" domain = [],\n",
" range = [],\n",
" unknown = implicit;\n",
"\n",
" function scale(d) {\n",
" var key = d + \"\", i = index.get(key);\n",
" if (!i) {\n",
" if (unknown !== implicit) return unknown;\n",
" index.set(key, i = domain.push(d));\n",
" }\n",
" return range[(i - 1) % range.length];\n",
" }\n",
"\n",
" scale.domain = function(_) {\n",
" if (!arguments.length) return domain.slice();\n",
" domain = [], index = new Map();\n",
" for (const value of _) {\n",
" const key = value + \"\";\n",
" if (index.has(key)) continue;\n",
" index.set(key, domain.push(value));\n",
" }\n",
" return scale;\n",
" };\n",
"\n",
" scale.range = function(_) {\n",
" return arguments.length ? (range = Array.from(_), scale) : range.slice();\n",
" };\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return ordinal(domain, range).unknown(unknown);\n",
" };\n",
"\n",
" initRange.apply(scale, arguments);\n",
"\n",
" return scale;\n",
"}\n",
"\n",
"function band() {\n",
" var scale = ordinal().unknown(undefined),\n",
" domain = scale.domain,\n",
" ordinalRange = scale.range,\n",
" r0 = 0,\n",
" r1 = 1,\n",
" step,\n",
" bandwidth,\n",
" round = false,\n",
" paddingInner = 0,\n",
" paddingOuter = 0,\n",
" align = 0.5;\n",
"\n",
" delete scale.unknown;\n",
"\n",
" function rescale() {\n",
" var n = domain().length,\n",
" reverse = r1 < r0,\n",
" start = reverse ? r1 : r0,\n",
" stop = reverse ? r0 : r1;\n",
" step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n",
" if (round) step = Math.floor(step);\n",
" start += (stop - start - step * (n - paddingInner)) * align;\n",
" bandwidth = step * (1 - paddingInner);\n",
" if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n",
" var values = d3Array.range(n).map(function(i) { return start + step * i; });\n",
" return ordinalRange(reverse ? values.reverse() : values);\n",
" }\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? (domain(_), rescale()) : domain();\n",
" };\n",
"\n",
" scale.range = function(_) {\n",
" return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n",
" };\n",
"\n",
" scale.rangeRound = function(_) {\n",
" return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n",
" };\n",
"\n",
" scale.bandwidth = function() {\n",
" return bandwidth;\n",
" };\n",
"\n",
" scale.step = function() {\n",
" return step;\n",
" };\n",
"\n",
" scale.round = function(_) {\n",
" return arguments.length ? (round = !!_, rescale()) : round;\n",
" };\n",
"\n",
" scale.padding = function(_) {\n",
" return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n",
" };\n",
"\n",
" scale.paddingInner = function(_) {\n",
" return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n",
" };\n",
"\n",
" scale.paddingOuter = function(_) {\n",
" return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n",
" };\n",
"\n",
" scale.align = function(_) {\n",
" return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return band(domain(), [r0, r1])\n",
" .round(round)\n",
" .paddingInner(paddingInner)\n",
" .paddingOuter(paddingOuter)\n",
" .align(align);\n",
" };\n",
"\n",
" return initRange.apply(rescale(), arguments);\n",
"}\n",
"\n",
"function pointish(scale) {\n",
" var copy = scale.copy;\n",
"\n",
" scale.padding = scale.paddingOuter;\n",
" delete scale.paddingInner;\n",
" delete scale.paddingOuter;\n",
"\n",
" scale.copy = function() {\n",
" return pointish(copy());\n",
" };\n",
"\n",
" return scale;\n",
"}\n",
"\n",
"function point() {\n",
" return pointish(band.apply(null, arguments).paddingInner(1));\n",
"}\n",
"\n",
"function constant(x) {\n",
" return function() {\n",
" return x;\n",
" };\n",
"}\n",
"\n",
"function number(x) {\n",
" return +x;\n",
"}\n",
"\n",
"var unit = [0, 1];\n",
"\n",
"function identity(x) {\n",
" return x;\n",
"}\n",
"\n",
"function normalize(a, b) {\n",
" return (b -= (a = +a))\n",
" ? function(x) { return (x - a) / b; }\n",
" : constant(isNaN(b) ? NaN : 0.5);\n",
"}\n",
"\n",
"function clamper(a, b) {\n",
" var t;\n",
" if (a > b) t = a, a = b, b = t;\n",
" return function(x) { return Math.max(a, Math.min(b, x)); };\n",
"}\n",
"\n",
"// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n",
"// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\n",
"function bimap(domain, range, interpolate) {\n",
" var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n",
" if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n",
" else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n",
" return function(x) { return r0(d0(x)); };\n",
"}\n",
"\n",
"function polymap(domain, range, interpolate) {\n",
" var j = Math.min(domain.length, range.length) - 1,\n",
" d = new Array(j),\n",
" r = new Array(j),\n",
" i = -1;\n",
"\n",
" // Reverse descending domains.\n",
" if (domain[j] < domain[0]) {\n",
" domain = domain.slice().reverse();\n",
" range = range.slice().reverse();\n",
" }\n",
"\n",
" while (++i < j) {\n",
" d[i] = normalize(domain[i], domain[i + 1]);\n",
" r[i] = interpolate(range[i], range[i + 1]);\n",
" }\n",
"\n",
" return function(x) {\n",
" var i = d3Array.bisect(domain, x, 1, j) - 1;\n",
" return r[i](d[i](x));\n",
" };\n",
"}\n",
"\n",
"function copy(source, target) {\n",
" return target\n",
" .domain(source.domain())\n",
" .range(source.range())\n",
" .interpolate(source.interpolate())\n",
" .clamp(source.clamp())\n",
" .unknown(source.unknown());\n",
"}\n",
"\n",
"function transformer() {\n",
" var domain = unit,\n",
" range = unit,\n",
" interpolate = d3Interpolate.interpolate,\n",
" transform,\n",
" untransform,\n",
" unknown,\n",
" clamp = identity,\n",
" piecewise,\n",
" output,\n",
" input;\n",
"\n",
" function rescale() {\n",
" var n = Math.min(domain.length, range.length);\n",
" if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n",
" piecewise = n > 2 ? polymap : bimap;\n",
" output = input = null;\n",
" return scale;\n",
" }\n",
"\n",
" function scale(x) {\n",
" return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n",
" }\n",
"\n",
" scale.invert = function(y) {\n",
" return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y)));\n",
" };\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n",
" };\n",
"\n",
" scale.range = function(_) {\n",
" return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n",
" };\n",
"\n",
" scale.rangeRound = function(_) {\n",
" return range = Array.from(_), interpolate = d3Interpolate.interpolateRound, rescale();\n",
" };\n",
"\n",
" scale.clamp = function(_) {\n",
" return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n",
" };\n",
"\n",
" scale.interpolate = function(_) {\n",
" return arguments.length ? (interpolate = _, rescale()) : interpolate;\n",
" };\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" return function(t, u) {\n",
" transform = t, untransform = u;\n",
" return rescale();\n",
" };\n",
"}\n",
"\n",
"function continuous() {\n",
" return transformer()(identity, identity);\n",
"}\n",
"\n",
"function tickFormat(start, stop, count, specifier) {\n",
" var step = d3Array.tickStep(start, stop, count),\n",
" precision;\n",
" specifier = d3Format.formatSpecifier(specifier == null ? \",f\" : specifier);\n",
" switch (specifier.type) {\n",
" case \"s\": {\n",
" var value = Math.max(Math.abs(start), Math.abs(stop));\n",
" if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision;\n",
" return d3Format.formatPrefix(specifier, value);\n",
" }\n",
" case \"\":\n",
" case \"e\":\n",
" case \"g\":\n",
" case \"p\":\n",
" case \"r\": {\n",
" if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n",
" break;\n",
" }\n",
" case \"f\":\n",
" case \"%\": {\n",
" if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n",
" break;\n",
" }\n",
" }\n",
" return d3Format.format(specifier);\n",
"}\n",
"\n",
"function linearish(scale) {\n",
" var domain = scale.domain;\n",
"\n",
" scale.ticks = function(count) {\n",
" var d = domain();\n",
" return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n",
" };\n",
"\n",
" scale.tickFormat = function(count, specifier) {\n",
" var d = domain();\n",
" return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n",
" };\n",
"\n",
" scale.nice = function(count) {\n",
" if (count == null) count = 10;\n",
"\n",
" var d = domain(),\n",
" i0 = 0,\n",
" i1 = d.length - 1,\n",
" start = d[i0],\n",
" stop = d[i1],\n",
" step;\n",
"\n",
" if (stop < start) {\n",
" step = start, start = stop, stop = step;\n",
" step = i0, i0 = i1, i1 = step;\n",
" }\n",
"\n",
" step = d3Array.tickIncrement(start, stop, count);\n",
"\n",
" if (step > 0) {\n",
" start = Math.floor(start / step) * step;\n",
" stop = Math.ceil(stop / step) * step;\n",
" step = d3Array.tickIncrement(start, stop, count);\n",
" } else if (step < 0) {\n",
" start = Math.ceil(start * step) / step;\n",
" stop = Math.floor(stop * step) / step;\n",
" step = d3Array.tickIncrement(start, stop, count);\n",
" }\n",
"\n",
" if (step > 0) {\n",
" d[i0] = Math.floor(start / step) * step;\n",
" d[i1] = Math.ceil(stop / step) * step;\n",
" domain(d);\n",
" } else if (step < 0) {\n",
" d[i0] = Math.ceil(start * step) / step;\n",
" d[i1] = Math.floor(stop * step) / step;\n",
" domain(d);\n",
" }\n",
"\n",
" return scale;\n",
" };\n",
"\n",
" return scale;\n",
"}\n",
"\n",
"function linear() {\n",
" var scale = continuous();\n",
"\n",
" scale.copy = function() {\n",
" return copy(scale, linear());\n",
" };\n",
"\n",
" initRange.apply(scale, arguments);\n",
"\n",
" return linearish(scale);\n",
"}\n",
"\n",
"function identity$1(domain) {\n",
" var unknown;\n",
"\n",
" function scale(x) {\n",
" return isNaN(x = +x) ? unknown : x;\n",
" }\n",
"\n",
" scale.invert = scale;\n",
"\n",
" scale.domain = scale.range = function(_) {\n",
" return arguments.length ? (domain = Array.from(_, number), scale) : domain.slice();\n",
" };\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return identity$1(domain).unknown(unknown);\n",
" };\n",
"\n",
" domain = arguments.length ? Array.from(domain, number) : [0, 1];\n",
"\n",
" return linearish(scale);\n",
"}\n",
"\n",
"function nice(domain, interval) {\n",
" domain = domain.slice();\n",
"\n",
" var i0 = 0,\n",
" i1 = domain.length - 1,\n",
" x0 = domain[i0],\n",
" x1 = domain[i1],\n",
" t;\n",
"\n",
" if (x1 < x0) {\n",
" t = i0, i0 = i1, i1 = t;\n",
" t = x0, x0 = x1, x1 = t;\n",
" }\n",
"\n",
" domain[i0] = interval.floor(x0);\n",
" domain[i1] = interval.ceil(x1);\n",
" return domain;\n",
"}\n",
"\n",
"function transformLog(x) {\n",
" return Math.log(x);\n",
"}\n",
"\n",
"function transformExp(x) {\n",
" return Math.exp(x);\n",
"}\n",
"\n",
"function transformLogn(x) {\n",
" return -Math.log(-x);\n",
"}\n",
"\n",
"function transformExpn(x) {\n",
" return -Math.exp(-x);\n",
"}\n",
"\n",
"function pow10(x) {\n",
" return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n",
"}\n",
"\n",
"function powp(base) {\n",
" return base === 10 ? pow10\n",
" : base === Math.E ? Math.exp\n",
" : function(x) { return Math.pow(base, x); };\n",
"}\n",
"\n",
"function logp(base) {\n",
" return base === Math.E ? Math.log\n",
" : base === 10 && Math.log10\n",
" || base === 2 && Math.log2\n",
" || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n",
"}\n",
"\n",
"function reflect(f) {\n",
" return function(x) {\n",
" return -f(-x);\n",
" };\n",
"}\n",
"\n",
"function loggish(transform) {\n",
" var scale = transform(transformLog, transformExp),\n",
" domain = scale.domain,\n",
" base = 10,\n",
" logs,\n",
" pows;\n",
"\n",
" function rescale() {\n",
" logs = logp(base), pows = powp(base);\n",
" if (domain()[0] < 0) {\n",
" logs = reflect(logs), pows = reflect(pows);\n",
" transform(transformLogn, transformExpn);\n",
" } else {\n",
" transform(transformLog, transformExp);\n",
" }\n",
" return scale;\n",
" }\n",
"\n",
" scale.base = function(_) {\n",
" return arguments.length ? (base = +_, rescale()) : base;\n",
" };\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? (domain(_), rescale()) : domain();\n",
" };\n",
"\n",
" scale.ticks = function(count) {\n",
" var d = domain(),\n",
" u = d[0],\n",
" v = d[d.length - 1],\n",
" r;\n",
"\n",
" if (r = v < u) i = u, u = v, v = i;\n",
"\n",
" var i = logs(u),\n",
" j = logs(v),\n",
" p,\n",
" k,\n",
" t,\n",
" n = count == null ? 10 : +count,\n",
" z = [];\n",
"\n",
" if (!(base % 1) && j - i < n) {\n",
" i = Math.floor(i), j = Math.ceil(j);\n",
" if (u > 0) for (; i <= j; ++i) {\n",
" for (k = 1, p = pows(i); k < base; ++k) {\n",
" t = p * k;\n",
" if (t < u) continue;\n",
" if (t > v) break;\n",
" z.push(t);\n",
" }\n",
" } else for (; i <= j; ++i) {\n",
" for (k = base - 1, p = pows(i); k >= 1; --k) {\n",
" t = p * k;\n",
" if (t < u) continue;\n",
" if (t > v) break;\n",
" z.push(t);\n",
" }\n",
" }\n",
" if (z.length * 2 < n) z = d3Array.ticks(u, v, n);\n",
" } else {\n",
" z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows);\n",
" }\n",
"\n",
" return r ? z.reverse() : z;\n",
" };\n",
"\n",
" scale.tickFormat = function(count, specifier) {\n",
" if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n",
" if (typeof specifier !== \"function\") specifier = d3Format.format(specifier);\n",
" if (count === Infinity) return specifier;\n",
" if (count == null) count = 10;\n",
" var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n",
" return function(d) {\n",
" var i = d / pows(Math.round(logs(d)));\n",
" if (i * base < base - 0.5) i *= base;\n",
" return i <= k ? specifier(d) : \"\";\n",
" };\n",
" };\n",
"\n",
" scale.nice = function() {\n",
" return domain(nice(domain(), {\n",
" floor: function(x) { return pows(Math.floor(logs(x))); },\n",
" ceil: function(x) { return pows(Math.ceil(logs(x))); }\n",
" }));\n",
" };\n",
"\n",
" return scale;\n",
"}\n",
"\n",
"function log() {\n",
" var scale = loggish(transformer()).domain([1, 10]);\n",
"\n",
" scale.copy = function() {\n",
" return copy(scale, log()).base(scale.base());\n",
" };\n",
"\n",
" initRange.apply(scale, arguments);\n",
"\n",
" return scale;\n",
"}\n",
"\n",
"function transformSymlog(c) {\n",
" return function(x) {\n",
" return Math.sign(x) * Math.log1p(Math.abs(x / c));\n",
" };\n",
"}\n",
"\n",
"function transformSymexp(c) {\n",
" return function(x) {\n",
" return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\n",
" };\n",
"}\n",
"\n",
"function symlogish(transform) {\n",
" var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));\n",
"\n",
" scale.constant = function(_) {\n",
" return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;\n",
" };\n",
"\n",
" return linearish(scale);\n",
"}\n",
"\n",
"function symlog() {\n",
" var scale = symlogish(transformer());\n",
"\n",
" scale.copy = function() {\n",
" return copy(scale, symlog()).constant(scale.constant());\n",
" };\n",
"\n",
" return initRange.apply(scale, arguments);\n",
"}\n",
"\n",
"function transformPow(exponent) {\n",
" return function(x) {\n",
" return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n",
" };\n",
"}\n",
"\n",
"function transformSqrt(x) {\n",
" return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n",
"}\n",
"\n",
"function transformSquare(x) {\n",
" return x < 0 ? -x * x : x * x;\n",
"}\n",
"\n",
"function powish(transform) {\n",
" var scale = transform(identity, identity),\n",
" exponent = 1;\n",
"\n",
" function rescale() {\n",
" return exponent === 1 ? transform(identity, identity)\n",
" : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n",
" : transform(transformPow(exponent), transformPow(1 / exponent));\n",
" }\n",
"\n",
" scale.exponent = function(_) {\n",
" return arguments.length ? (exponent = +_, rescale()) : exponent;\n",
" };\n",
"\n",
" return linearish(scale);\n",
"}\n",
"\n",
"function pow() {\n",
" var scale = powish(transformer());\n",
"\n",
" scale.copy = function() {\n",
" return copy(scale, pow()).exponent(scale.exponent());\n",
" };\n",
"\n",
" initRange.apply(scale, arguments);\n",
"\n",
" return scale;\n",
"}\n",
"\n",
"function sqrt() {\n",
" return pow.apply(null, arguments).exponent(0.5);\n",
"}\n",
"\n",
"function square(x) {\n",
" return Math.sign(x) * x * x;\n",
"}\n",
"\n",
"function unsquare(x) {\n",
" return Math.sign(x) * Math.sqrt(Math.abs(x));\n",
"}\n",
"\n",
"function radial() {\n",
" var squared = continuous(),\n",
" range = [0, 1],\n",
" round = false,\n",
" unknown;\n",
"\n",
" function scale(x) {\n",
" var y = unsquare(squared(x));\n",
" return isNaN(y) ? unknown : round ? Math.round(y) : y;\n",
" }\n",
"\n",
" scale.invert = function(y) {\n",
" return squared.invert(square(y));\n",
" };\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? (squared.domain(_), scale) : squared.domain();\n",
" };\n",
"\n",
" scale.range = function(_) {\n",
" return arguments.length ? (squared.range((range = Array.from(_, number)).map(square)), scale) : range.slice();\n",
" };\n",
"\n",
" scale.rangeRound = function(_) {\n",
" return scale.range(_).round(true);\n",
" };\n",
"\n",
" scale.round = function(_) {\n",
" return arguments.length ? (round = !!_, scale) : round;\n",
" };\n",
"\n",
" scale.clamp = function(_) {\n",
" return arguments.length ? (squared.clamp(_), scale) : squared.clamp();\n",
" };\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return radial(squared.domain(), range)\n",
" .round(round)\n",
" .clamp(squared.clamp())\n",
" .unknown(unknown);\n",
" };\n",
"\n",
" initRange.apply(scale, arguments);\n",
"\n",
" return linearish(scale);\n",
"}\n",
"\n",
"function quantile() {\n",
" var domain = [],\n",
" range = [],\n",
" thresholds = [],\n",
" unknown;\n",
"\n",
" function rescale() {\n",
" var i = 0, n = Math.max(1, range.length);\n",
" thresholds = new Array(n - 1);\n",
" while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n);\n",
" return scale;\n",
" }\n",
"\n",
" function scale(x) {\n",
" return isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)];\n",
" }\n",
"\n",
" scale.invertExtent = function(y) {\n",
" var i = range.indexOf(y);\n",
" return i < 0 ? [NaN, NaN] : [\n",
" i > 0 ? thresholds[i - 1] : domain[0],\n",
" i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n",
" ];\n",
" };\n",
"\n",
" scale.domain = function(_) {\n",
" if (!arguments.length) return domain.slice();\n",
" domain = [];\n",
" for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d);\n",
" domain.sort(d3Array.ascending);\n",
" return rescale();\n",
" };\n",
"\n",
" scale.range = function(_) {\n",
" return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n",
" };\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" scale.quantiles = function() {\n",
" return thresholds.slice();\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return quantile()\n",
" .domain(domain)\n",
" .range(range)\n",
" .unknown(unknown);\n",
" };\n",
"\n",
" return initRange.apply(scale, arguments);\n",
"}\n",
"\n",
"function quantize() {\n",
" var x0 = 0,\n",
" x1 = 1,\n",
" n = 1,\n",
" domain = [0.5],\n",
" range = [0, 1],\n",
" unknown;\n",
"\n",
" function scale(x) {\n",
" return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown;\n",
" }\n",
"\n",
" function rescale() {\n",
" var i = -1;\n",
" domain = new Array(n);\n",
" while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n",
" return scale;\n",
" }\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1];\n",
" };\n",
"\n",
" scale.range = function(_) {\n",
" return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();\n",
" };\n",
"\n",
" scale.invertExtent = function(y) {\n",
" var i = range.indexOf(y);\n",
" return i < 0 ? [NaN, NaN]\n",
" : i < 1 ? [x0, domain[0]]\n",
" : i >= n ? [domain[n - 1], x1]\n",
" : [domain[i - 1], domain[i]];\n",
" };\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : scale;\n",
" };\n",
"\n",
" scale.thresholds = function() {\n",
" return domain.slice();\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return quantize()\n",
" .domain([x0, x1])\n",
" .range(range)\n",
" .unknown(unknown);\n",
" };\n",
"\n",
" return initRange.apply(linearish(scale), arguments);\n",
"}\n",
"\n",
"function threshold() {\n",
" var domain = [0.5],\n",
" range = [0, 1],\n",
" unknown,\n",
" n = 1;\n",
"\n",
" function scale(x) {\n",
" return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown;\n",
" }\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n",
" };\n",
"\n",
" scale.range = function(_) {\n",
" return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n",
" };\n",
"\n",
" scale.invertExtent = function(y) {\n",
" var i = range.indexOf(y);\n",
" return [domain[i - 1], domain[i]];\n",
" };\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return threshold()\n",
" .domain(domain)\n",
" .range(range)\n",
" .unknown(unknown);\n",
" };\n",
"\n",
" return initRange.apply(scale, arguments);\n",
"}\n",
"\n",
"var durationSecond = 1000,\n",
" durationMinute = durationSecond * 60,\n",
" durationHour = durationMinute * 60,\n",
" durationDay = durationHour * 24,\n",
" durationWeek = durationDay * 7,\n",
" durationMonth = durationDay * 30,\n",
" durationYear = durationDay * 365;\n",
"\n",
"function date(t) {\n",
" return new Date(t);\n",
"}\n",
"\n",
"function number$1(t) {\n",
" return t instanceof Date ? +t : +new Date(+t);\n",
"}\n",
"\n",
"function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n",
" var scale = continuous(),\n",
" invert = scale.invert,\n",
" domain = scale.domain;\n",
"\n",
" var formatMillisecond = format(\".%L\"),\n",
" formatSecond = format(\":%S\"),\n",
" formatMinute = format(\"%I:%M\"),\n",
" formatHour = format(\"%I %p\"),\n",
" formatDay = format(\"%a %d\"),\n",
" formatWeek = format(\"%b %d\"),\n",
" formatMonth = format(\"%B\"),\n",
" formatYear = format(\"%Y\");\n",
"\n",
" var tickIntervals = [\n",
" [second, 1, durationSecond],\n",
" [second, 5, 5 * durationSecond],\n",
" [second, 15, 15 * durationSecond],\n",
" [second, 30, 30 * durationSecond],\n",
" [minute, 1, durationMinute],\n",
" [minute, 5, 5 * durationMinute],\n",
" [minute, 15, 15 * durationMinute],\n",
" [minute, 30, 30 * durationMinute],\n",
" [ hour, 1, durationHour ],\n",
" [ hour, 3, 3 * durationHour ],\n",
" [ hour, 6, 6 * durationHour ],\n",
" [ hour, 12, 12 * durationHour ],\n",
" [ day, 1, durationDay ],\n",
" [ day, 2, 2 * durationDay ],\n",
" [ week, 1, durationWeek ],\n",
" [ month, 1, durationMonth ],\n",
" [ month, 3, 3 * durationMonth ],\n",
" [ year, 1, durationYear ]\n",
" ];\n",
"\n",
" function tickFormat(date) {\n",
" return (second(date) < date ? formatMillisecond\n",
" : minute(date) < date ? formatSecond\n",
" : hour(date) < date ? formatMinute\n",
" : day(date) < date ? formatHour\n",
" : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n",
" : year(date) < date ? formatMonth\n",
" : formatYear)(date);\n",
" }\n",
"\n",
" function tickInterval(interval, start, stop) {\n",
" if (interval == null) interval = 10;\n",
"\n",
" // If a desired tick count is specified, pick a reasonable tick interval\n",
" // based on the extent of the domain and a rough estimate of tick size.\n",
" // Otherwise, assume interval is already a time interval and use it.\n",
" if (typeof interval === \"number\") {\n",
" var target = Math.abs(stop - start) / interval,\n",
" i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target),\n",
" step;\n",
" if (i === tickIntervals.length) {\n",
" step = d3Array.tickStep(start / durationYear, stop / durationYear, interval);\n",
" interval = year;\n",
" } else if (i) {\n",
" i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n",
" step = i[1];\n",
" interval = i[0];\n",
" } else {\n",
" step = Math.max(d3Array.tickStep(start, stop, interval), 1);\n",
" interval = millisecond;\n",
" }\n",
" return interval.every(step);\n",
" }\n",
"\n",
" return interval;\n",
" }\n",
"\n",
" scale.invert = function(y) {\n",
" return new Date(invert(y));\n",
" };\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? domain(Array.from(_, number$1)) : domain().map(date);\n",
" };\n",
"\n",
" scale.ticks = function(interval) {\n",
" var d = domain(),\n",
" t0 = d[0],\n",
" t1 = d[d.length - 1],\n",
" r = t1 < t0,\n",
" t;\n",
" if (r) t = t0, t0 = t1, t1 = t;\n",
" t = tickInterval(interval, t0, t1);\n",
" t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n",
" return r ? t.reverse() : t;\n",
" };\n",
"\n",
" scale.tickFormat = function(count, specifier) {\n",
" return specifier == null ? tickFormat : format(specifier);\n",
" };\n",
"\n",
" scale.nice = function(interval) {\n",
" var d = domain();\n",
" return (interval = tickInterval(interval, d[0], d[d.length - 1]))\n",
" ? domain(nice(d, interval))\n",
" : scale;\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n",
" };\n",
"\n",
" return scale;\n",
"}\n",
"\n",
"function time() {\n",
" return initRange.apply(calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n",
"}\n",
"\n",
"function utcTime() {\n",
" return initRange.apply(calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);\n",
"}\n",
"\n",
"function transformer$1() {\n",
" var x0 = 0,\n",
" x1 = 1,\n",
" t0,\n",
" t1,\n",
" k10,\n",
" transform,\n",
" interpolator = identity,\n",
" clamp = false,\n",
" unknown;\n",
"\n",
" function scale(x) {\n",
" return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n",
" }\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\n",
" };\n",
"\n",
" scale.clamp = function(_) {\n",
" return arguments.length ? (clamp = !!_, scale) : clamp;\n",
" };\n",
"\n",
" scale.interpolator = function(_) {\n",
" return arguments.length ? (interpolator = _, scale) : interpolator;\n",
" };\n",
"\n",
" function range(interpolate) {\n",
" return function(_) {\n",
" var r0, r1;\n",
" return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)];\n",
" };\n",
" }\n",
"\n",
" scale.range = range(d3Interpolate.interpolate);\n",
"\n",
" scale.rangeRound = range(d3Interpolate.interpolateRound);\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" return function(t) {\n",
" transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n",
" return scale;\n",
" };\n",
"}\n",
"\n",
"function copy$1(source, target) {\n",
" return target\n",
" .domain(source.domain())\n",
" .interpolator(source.interpolator())\n",
" .clamp(source.clamp())\n",
" .unknown(source.unknown());\n",
"}\n",
"\n",
"function sequential() {\n",
" var scale = linearish(transformer$1()(identity));\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, sequential());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function sequentialLog() {\n",
" var scale = loggish(transformer$1()).domain([1, 10]);\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, sequentialLog()).base(scale.base());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function sequentialSymlog() {\n",
" var scale = symlogish(transformer$1());\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, sequentialSymlog()).constant(scale.constant());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function sequentialPow() {\n",
" var scale = powish(transformer$1());\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, sequentialPow()).exponent(scale.exponent());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function sequentialSqrt() {\n",
" return sequentialPow.apply(null, arguments).exponent(0.5);\n",
"}\n",
"\n",
"function sequentialQuantile() {\n",
" var domain = [],\n",
" interpolator = identity;\n",
"\n",
" function scale(x) {\n",
" if (!isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x, 1) - 1) / (domain.length - 1));\n",
" }\n",
"\n",
" scale.domain = function(_) {\n",
" if (!arguments.length) return domain.slice();\n",
" domain = [];\n",
" for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d);\n",
" domain.sort(d3Array.ascending);\n",
" return scale;\n",
" };\n",
"\n",
" scale.interpolator = function(_) {\n",
" return arguments.length ? (interpolator = _, scale) : interpolator;\n",
" };\n",
"\n",
" scale.range = function() {\n",
" return domain.map((d, i) => interpolator(i / (domain.length - 1)));\n",
" };\n",
"\n",
" scale.quantiles = function(n) {\n",
" return Array.from({length: n + 1}, (_, i) => d3Array.quantile(domain, i / n));\n",
" };\n",
"\n",
" scale.copy = function() {\n",
" return sequentialQuantile(interpolator).domain(domain);\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function transformer$2() {\n",
" var x0 = 0,\n",
" x1 = 0.5,\n",
" x2 = 1,\n",
" s = 1,\n",
" t0,\n",
" t1,\n",
" t2,\n",
" k10,\n",
" k21,\n",
" interpolator = identity,\n",
" transform,\n",
" clamp = false,\n",
" unknown;\n",
"\n",
" function scale(x) {\n",
" return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));\n",
" }\n",
"\n",
" scale.domain = function(_) {\n",
" return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2];\n",
" };\n",
"\n",
" scale.clamp = function(_) {\n",
" return arguments.length ? (clamp = !!_, scale) : clamp;\n",
" };\n",
"\n",
" scale.interpolator = function(_) {\n",
" return arguments.length ? (interpolator = _, scale) : interpolator;\n",
" };\n",
"\n",
" function range(interpolate) {\n",
" return function(_) {\n",
" var r0, r1, r2;\n",
" return arguments.length ? ([r0, r1, r2] = _, interpolator = d3Interpolate.piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)];\n",
" };\n",
" }\n",
"\n",
" scale.range = range(d3Interpolate.interpolate);\n",
"\n",
" scale.rangeRound = range(d3Interpolate.interpolateRound);\n",
"\n",
" scale.unknown = function(_) {\n",
" return arguments.length ? (unknown = _, scale) : unknown;\n",
" };\n",
"\n",
" return function(t) {\n",
" transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1;\n",
" return scale;\n",
" };\n",
"}\n",
"\n",
"function diverging() {\n",
" var scale = linearish(transformer$2()(identity));\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, diverging());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function divergingLog() {\n",
" var scale = loggish(transformer$2()).domain([0.1, 1, 10]);\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, divergingLog()).base(scale.base());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function divergingSymlog() {\n",
" var scale = symlogish(transformer$2());\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, divergingSymlog()).constant(scale.constant());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function divergingPow() {\n",
" var scale = powish(transformer$2());\n",
"\n",
" scale.copy = function() {\n",
" return copy$1(scale, divergingPow()).exponent(scale.exponent());\n",
" };\n",
"\n",
" return initInterpolator.apply(scale, arguments);\n",
"}\n",
"\n",
"function divergingSqrt() {\n",
" return divergingPow.apply(null, arguments).exponent(0.5);\n",
"}\n",
"\n",
"exports.scaleBand = band;\n",
"exports.scaleDiverging = diverging;\n",
"exports.scaleDivergingLog = divergingLog;\n",
"exports.scaleDivergingPow = divergingPow;\n",
"exports.scaleDivergingSqrt = divergingSqrt;\n",
"exports.scaleDivergingSymlog = divergingSymlog;\n",
"exports.scaleIdentity = identity$1;\n",
"exports.scaleImplicit = implicit;\n",
"exports.scaleLinear = linear;\n",
"exports.scaleLog = log;\n",
"exports.scaleOrdinal = ordinal;\n",
"exports.scalePoint = point;\n",
"exports.scalePow = pow;\n",
"exports.scaleQuantile = quantile;\n",
"exports.scaleQuantize = quantize;\n",
"exports.scaleRadial = radial;\n",
"exports.scaleSequential = sequential;\n",
"exports.scaleSequentialLog = sequentialLog;\n",
"exports.scaleSequentialPow = sequentialPow;\n",
"exports.scaleSequentialQuantile = sequentialQuantile;\n",
"exports.scaleSequentialSqrt = sequentialSqrt;\n",
"exports.scaleSequentialSymlog = sequentialSymlog;\n",
"exports.scaleSqrt = sqrt;\n",
"exports.scaleSymlog = symlog;\n",
"exports.scaleThreshold = threshold;\n",
"exports.scaleTime = time;\n",
"exports.scaleUtc = utcTime;\n",
"exports.tickFormat = tickFormat;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{\"d3-array\":2,\"d3-format\":7,\"d3-interpolate\":8,\"d3-time\":14,\"d3-time-format\":13}],11:[function(require,module,exports){\n",
"// https://d3js.org/d3-selection/ v1.4.1 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"var xhtml = \"http://www.w3.org/1999/xhtml\";\n",
"\n",
"var namespaces = {\n",
" svg: \"http://www.w3.org/2000/svg\",\n",
" xhtml: xhtml,\n",
" xlink: \"http://www.w3.org/1999/xlink\",\n",
" xml: \"http://www.w3.org/XML/1998/namespace\",\n",
" xmlns: \"http://www.w3.org/2000/xmlns/\"\n",
"};\n",
"\n",
"function namespace(name) {\n",
" var prefix = name += \"\", i = prefix.indexOf(\":\");\n",
" if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n",
" return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n",
"}\n",
"\n",
"function creatorInherit(name) {\n",
" return function() {\n",
" var document = this.ownerDocument,\n",
" uri = this.namespaceURI;\n",
" return uri === xhtml && document.documentElement.namespaceURI === xhtml\n",
" ? document.createElement(name)\n",
" : document.createElementNS(uri, name);\n",
" };\n",
"}\n",
"\n",
"function creatorFixed(fullname) {\n",
" return function() {\n",
" return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n",
" };\n",
"}\n",
"\n",
"function creator(name) {\n",
" var fullname = namespace(name);\n",
" return (fullname.local\n",
" ? creatorFixed\n",
" : creatorInherit)(fullname);\n",
"}\n",
"\n",
"function none() {}\n",
"\n",
"function selector(selector) {\n",
" return selector == null ? none : function() {\n",
" return this.querySelector(selector);\n",
" };\n",
"}\n",
"\n",
"function selection_select(select) {\n",
" if (typeof select !== \"function\") select = selector(select);\n",
"\n",
" for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n",
" if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n",
" if (\"__data__\" in node) subnode.__data__ = node.__data__;\n",
" subgroup[i] = subnode;\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Selection(subgroups, this._parents);\n",
"}\n",
"\n",
"function empty() {\n",
" return [];\n",
"}\n",
"\n",
"function selectorAll(selector) {\n",
" return selector == null ? empty : function() {\n",
" return this.querySelectorAll(selector);\n",
" };\n",
"}\n",
"\n",
"function selection_selectAll(select) {\n",
" if (typeof select !== \"function\") select = selectorAll(select);\n",
"\n",
" for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n",
" if (node = group[i]) {\n",
" subgroups.push(select.call(node, node.__data__, i, group));\n",
" parents.push(node);\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Selection(subgroups, parents);\n",
"}\n",
"\n",
"function matcher(selector) {\n",
" return function() {\n",
" return this.matches(selector);\n",
" };\n",
"}\n",
"\n",
"function selection_filter(match) {\n",
" if (typeof match !== \"function\") match = matcher(match);\n",
"\n",
" for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n",
" if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n",
" subgroup.push(node);\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Selection(subgroups, this._parents);\n",
"}\n",
"\n",
"function sparse(update) {\n",
" return new Array(update.length);\n",
"}\n",
"\n",
"function selection_enter() {\n",
" return new Selection(this._enter || this._groups.map(sparse), this._parents);\n",
"}\n",
"\n",
"function EnterNode(parent, datum) {\n",
" this.ownerDocument = parent.ownerDocument;\n",
" this.namespaceURI = parent.namespaceURI;\n",
" this._next = null;\n",
" this._parent = parent;\n",
" this.__data__ = datum;\n",
"}\n",
"\n",
"EnterNode.prototype = {\n",
" constructor: EnterNode,\n",
" appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n",
" insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n",
" querySelector: function(selector) { return this._parent.querySelector(selector); },\n",
" querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n",
"};\n",
"\n",
"function constant(x) {\n",
" return function() {\n",
" return x;\n",
" };\n",
"}\n",
"\n",
"var keyPrefix = \"$\"; // Protect against keys like \"__proto__\".\n",
"\n",
"function bindIndex(parent, group, enter, update, exit, data) {\n",
" var i = 0,\n",
" node,\n",
" groupLength = group.length,\n",
" dataLength = data.length;\n",
"\n",
" // Put any non-null nodes that fit into update.\n",
" // Put any null nodes into enter.\n",
" // Put any remaining data into enter.\n",
" for (; i < dataLength; ++i) {\n",
" if (node = group[i]) {\n",
" node.__data__ = data[i];\n",
" update[i] = node;\n",
" } else {\n",
" enter[i] = new EnterNode(parent, data[i]);\n",
" }\n",
" }\n",
"\n",
" // Put any non-null nodes that don't fit into exit.\n",
" for (; i < groupLength; ++i) {\n",
" if (node = group[i]) {\n",
" exit[i] = node;\n",
" }\n",
" }\n",
"}\n",
"\n",
"function bindKey(parent, group, enter, update, exit, data, key) {\n",
" var i,\n",
" node,\n",
" nodeByKeyValue = {},\n",
" groupLength = group.length,\n",
" dataLength = data.length,\n",
" keyValues = new Array(groupLength),\n",
" keyValue;\n",
"\n",
" // Compute the key for each node.\n",
" // If multiple nodes have the same key, the duplicates are added to exit.\n",
" for (i = 0; i < groupLength; ++i) {\n",
" if (node = group[i]) {\n",
" keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n",
" if (keyValue in nodeByKeyValue) {\n",
" exit[i] = node;\n",
" } else {\n",
" nodeByKeyValue[keyValue] = node;\n",
" }\n",
" }\n",
" }\n",
"\n",
" // Compute the key for each datum.\n",
" // If there a node associated with this key, join and add it to update.\n",
" // If there is not (or the key is a duplicate), add it to enter.\n",
" for (i = 0; i < dataLength; ++i) {\n",
" keyValue = keyPrefix + key.call(parent, data[i], i, data);\n",
" if (node = nodeByKeyValue[keyValue]) {\n",
" update[i] = node;\n",
" node.__data__ = data[i];\n",
" nodeByKeyValue[keyValue] = null;\n",
" } else {\n",
" enter[i] = new EnterNode(parent, data[i]);\n",
" }\n",
" }\n",
"\n",
" // Add any remaining nodes that were not bound to data to exit.\n",
" for (i = 0; i < groupLength; ++i) {\n",
" if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n",
" exit[i] = node;\n",
" }\n",
" }\n",
"}\n",
"\n",
"function selection_data(value, key) {\n",
" if (!value) {\n",
" data = new Array(this.size()), j = -1;\n",
" this.each(function(d) { data[++j] = d; });\n",
" return data;\n",
" }\n",
"\n",
" var bind = key ? bindKey : bindIndex,\n",
" parents = this._parents,\n",
" groups = this._groups;\n",
"\n",
" if (typeof value !== \"function\") value = constant(value);\n",
"\n",
" for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n",
" var parent = parents[j],\n",
" group = groups[j],\n",
" groupLength = group.length,\n",
" data = value.call(parent, parent && parent.__data__, j, parents),\n",
" dataLength = data.length,\n",
" enterGroup = enter[j] = new Array(dataLength),\n",
" updateGroup = update[j] = new Array(dataLength),\n",
" exitGroup = exit[j] = new Array(groupLength);\n",
"\n",
" bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n",
"\n",
" // Now connect the enter nodes to their following update node, such that\n",
" // appendChild can insert the materialized enter node before this node,\n",
" // rather than at the end of the parent node.\n",
" for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n",
" if (previous = enterGroup[i0]) {\n",
" if (i0 >= i1) i1 = i0 + 1;\n",
" while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n",
" previous._next = next || null;\n",
" }\n",
" }\n",
" }\n",
"\n",
" update = new Selection(update, parents);\n",
" update._enter = enter;\n",
" update._exit = exit;\n",
" return update;\n",
"}\n",
"\n",
"function selection_exit() {\n",
" return new Selection(this._exit || this._groups.map(sparse), this._parents);\n",
"}\n",
"\n",
"function selection_join(onenter, onupdate, onexit) {\n",
" var enter = this.enter(), update = this, exit = this.exit();\n",
" enter = typeof onenter === \"function\" ? onenter(enter) : enter.append(onenter + \"\");\n",
" if (onupdate != null) update = onupdate(update);\n",
" if (onexit == null) exit.remove(); else onexit(exit);\n",
" return enter && update ? enter.merge(update).order() : update;\n",
"}\n",
"\n",
"function selection_merge(selection) {\n",
"\n",
" for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n",
" for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n",
" if (node = group0[i] || group1[i]) {\n",
" merge[i] = node;\n",
" }\n",
" }\n",
" }\n",
"\n",
" for (; j < m0; ++j) {\n",
" merges[j] = groups0[j];\n",
" }\n",
"\n",
" return new Selection(merges, this._parents);\n",
"}\n",
"\n",
"function selection_order() {\n",
"\n",
" for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n",
" for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n",
" if (node = group[i]) {\n",
" if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n",
" next = node;\n",
" }\n",
" }\n",
" }\n",
"\n",
" return this;\n",
"}\n",
"\n",
"function selection_sort(compare) {\n",
" if (!compare) compare = ascending;\n",
"\n",
" function compareNode(a, b) {\n",
" return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n",
" }\n",
"\n",
" for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n",
" if (node = group[i]) {\n",
" sortgroup[i] = node;\n",
" }\n",
" }\n",
" sortgroup.sort(compareNode);\n",
" }\n",
"\n",
" return new Selection(sortgroups, this._parents).order();\n",
"}\n",
"\n",
"function ascending(a, b) {\n",
" return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n",
"}\n",
"\n",
"function selection_call() {\n",
" var callback = arguments[0];\n",
" arguments[0] = this;\n",
" callback.apply(null, arguments);\n",
" return this;\n",
"}\n",
"\n",
"function selection_nodes() {\n",
" var nodes = new Array(this.size()), i = -1;\n",
" this.each(function() { nodes[++i] = this; });\n",
" return nodes;\n",
"}\n",
"\n",
"function selection_node() {\n",
"\n",
" for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n",
" for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n",
" var node = group[i];\n",
" if (node) return node;\n",
" }\n",
" }\n",
"\n",
" return null;\n",
"}\n",
"\n",
"function selection_size() {\n",
" var size = 0;\n",
" this.each(function() { ++size; });\n",
" return size;\n",
"}\n",
"\n",
"function selection_empty() {\n",
" return !this.node();\n",
"}\n",
"\n",
"function selection_each(callback) {\n",
"\n",
" for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n",
" for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n",
" if (node = group[i]) callback.call(node, node.__data__, i, group);\n",
" }\n",
" }\n",
"\n",
" return this;\n",
"}\n",
"\n",
"function attrRemove(name) {\n",
" return function() {\n",
" this.removeAttribute(name);\n",
" };\n",
"}\n",
"\n",
"function attrRemoveNS(fullname) {\n",
" return function() {\n",
" this.removeAttributeNS(fullname.space, fullname.local);\n",
" };\n",
"}\n",
"\n",
"function attrConstant(name, value) {\n",
" return function() {\n",
" this.setAttribute(name, value);\n",
" };\n",
"}\n",
"\n",
"function attrConstantNS(fullname, value) {\n",
" return function() {\n",
" this.setAttributeNS(fullname.space, fullname.local, value);\n",
" };\n",
"}\n",
"\n",
"function attrFunction(name, value) {\n",
" return function() {\n",
" var v = value.apply(this, arguments);\n",
" if (v == null) this.removeAttribute(name);\n",
" else this.setAttribute(name, v);\n",
" };\n",
"}\n",
"\n",
"function attrFunctionNS(fullname, value) {\n",
" return function() {\n",
" var v = value.apply(this, arguments);\n",
" if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n",
" else this.setAttributeNS(fullname.space, fullname.local, v);\n",
" };\n",
"}\n",
"\n",
"function selection_attr(name, value) {\n",
" var fullname = namespace(name);\n",
"\n",
" if (arguments.length < 2) {\n",
" var node = this.node();\n",
" return fullname.local\n",
" ? node.getAttributeNS(fullname.space, fullname.local)\n",
" : node.getAttribute(fullname);\n",
" }\n",
"\n",
" return this.each((value == null\n",
" ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n",
" ? (fullname.local ? attrFunctionNS : attrFunction)\n",
" : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n",
"}\n",
"\n",
"function defaultView(node) {\n",
" return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n",
" || (node.document && node) // node is a Window\n",
" || node.defaultView; // node is a Document\n",
"}\n",
"\n",
"function styleRemove(name) {\n",
" return function() {\n",
" this.style.removeProperty(name);\n",
" };\n",
"}\n",
"\n",
"function styleConstant(name, value, priority) {\n",
" return function() {\n",
" this.style.setProperty(name, value, priority);\n",
" };\n",
"}\n",
"\n",
"function styleFunction(name, value, priority) {\n",
" return function() {\n",
" var v = value.apply(this, arguments);\n",
" if (v == null) this.style.removeProperty(name);\n",
" else this.style.setProperty(name, v, priority);\n",
" };\n",
"}\n",
"\n",
"function selection_style(name, value, priority) {\n",
" return arguments.length > 1\n",
" ? this.each((value == null\n",
" ? styleRemove : typeof value === \"function\"\n",
" ? styleFunction\n",
" : styleConstant)(name, value, priority == null ? \"\" : priority))\n",
" : styleValue(this.node(), name);\n",
"}\n",
"\n",
"function styleValue(node, name) {\n",
" return node.style.getPropertyValue(name)\n",
" || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n",
"}\n",
"\n",
"function propertyRemove(name) {\n",
" return function() {\n",
" delete this[name];\n",
" };\n",
"}\n",
"\n",
"function propertyConstant(name, value) {\n",
" return function() {\n",
" this[name] = value;\n",
" };\n",
"}\n",
"\n",
"function propertyFunction(name, value) {\n",
" return function() {\n",
" var v = value.apply(this, arguments);\n",
" if (v == null) delete this[name];\n",
" else this[name] = v;\n",
" };\n",
"}\n",
"\n",
"function selection_property(name, value) {\n",
" return arguments.length > 1\n",
" ? this.each((value == null\n",
" ? propertyRemove : typeof value === \"function\"\n",
" ? propertyFunction\n",
" : propertyConstant)(name, value))\n",
" : this.node()[name];\n",
"}\n",
"\n",
"function classArray(string) {\n",
" return string.trim().split(/^|\\s+/);\n",
"}\n",
"\n",
"function classList(node) {\n",
" return node.classList || new ClassList(node);\n",
"}\n",
"\n",
"function ClassList(node) {\n",
" this._node = node;\n",
" this._names = classArray(node.getAttribute(\"class\") || \"\");\n",
"}\n",
"\n",
"ClassList.prototype = {\n",
" add: function(name) {\n",
" var i = this._names.indexOf(name);\n",
" if (i < 0) {\n",
" this._names.push(name);\n",
" this._node.setAttribute(\"class\", this._names.join(\" \"));\n",
" }\n",
" },\n",
" remove: function(name) {\n",
" var i = this._names.indexOf(name);\n",
" if (i >= 0) {\n",
" this._names.splice(i, 1);\n",
" this._node.setAttribute(\"class\", this._names.join(\" \"));\n",
" }\n",
" },\n",
" contains: function(name) {\n",
" return this._names.indexOf(name) >= 0;\n",
" }\n",
"};\n",
"\n",
"function classedAdd(node, names) {\n",
" var list = classList(node), i = -1, n = names.length;\n",
" while (++i < n) list.add(names[i]);\n",
"}\n",
"\n",
"function classedRemove(node, names) {\n",
" var list = classList(node), i = -1, n = names.length;\n",
" while (++i < n) list.remove(names[i]);\n",
"}\n",
"\n",
"function classedTrue(names) {\n",
" return function() {\n",
" classedAdd(this, names);\n",
" };\n",
"}\n",
"\n",
"function classedFalse(names) {\n",
" return function() {\n",
" classedRemove(this, names);\n",
" };\n",
"}\n",
"\n",
"function classedFunction(names, value) {\n",
" return function() {\n",
" (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n",
" };\n",
"}\n",
"\n",
"function selection_classed(name, value) {\n",
" var names = classArray(name + \"\");\n",
"\n",
" if (arguments.length < 2) {\n",
" var list = classList(this.node()), i = -1, n = names.length;\n",
" while (++i < n) if (!list.contains(names[i])) return false;\n",
" return true;\n",
" }\n",
"\n",
" return this.each((typeof value === \"function\"\n",
" ? classedFunction : value\n",
" ? classedTrue\n",
" : classedFalse)(names, value));\n",
"}\n",
"\n",
"function textRemove() {\n",
" this.textContent = \"\";\n",
"}\n",
"\n",
"function textConstant(value) {\n",
" return function() {\n",
" this.textContent = value;\n",
" };\n",
"}\n",
"\n",
"function textFunction(value) {\n",
" return function() {\n",
" var v = value.apply(this, arguments);\n",
" this.textContent = v == null ? \"\" : v;\n",
" };\n",
"}\n",
"\n",
"function selection_text(value) {\n",
" return arguments.length\n",
" ? this.each(value == null\n",
" ? textRemove : (typeof value === \"function\"\n",
" ? textFunction\n",
" : textConstant)(value))\n",
" : this.node().textContent;\n",
"}\n",
"\n",
"function htmlRemove() {\n",
" this.innerHTML = \"\";\n",
"}\n",
"\n",
"function htmlConstant(value) {\n",
" return function() {\n",
" this.innerHTML = value;\n",
" };\n",
"}\n",
"\n",
"function htmlFunction(value) {\n",
" return function() {\n",
" var v = value.apply(this, arguments);\n",
" this.innerHTML = v == null ? \"\" : v;\n",
" };\n",
"}\n",
"\n",
"function selection_html(value) {\n",
" return arguments.length\n",
" ? this.each(value == null\n",
" ? htmlRemove : (typeof value === \"function\"\n",
" ? htmlFunction\n",
" : htmlConstant)(value))\n",
" : this.node().innerHTML;\n",
"}\n",
"\n",
"function raise() {\n",
" if (this.nextSibling) this.parentNode.appendChild(this);\n",
"}\n",
"\n",
"function selection_raise() {\n",
" return this.each(raise);\n",
"}\n",
"\n",
"function lower() {\n",
" if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n",
"}\n",
"\n",
"function selection_lower() {\n",
" return this.each(lower);\n",
"}\n",
"\n",
"function selection_append(name) {\n",
" var create = typeof name === \"function\" ? name : creator(name);\n",
" return this.select(function() {\n",
" return this.appendChild(create.apply(this, arguments));\n",
" });\n",
"}\n",
"\n",
"function constantNull() {\n",
" return null;\n",
"}\n",
"\n",
"function selection_insert(name, before) {\n",
" var create = typeof name === \"function\" ? name : creator(name),\n",
" select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n",
" return this.select(function() {\n",
" return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n",
" });\n",
"}\n",
"\n",
"function remove() {\n",
" var parent = this.parentNode;\n",
" if (parent) parent.removeChild(this);\n",
"}\n",
"\n",
"function selection_remove() {\n",
" return this.each(remove);\n",
"}\n",
"\n",
"function selection_cloneShallow() {\n",
" var clone = this.cloneNode(false), parent = this.parentNode;\n",
" return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n",
"}\n",
"\n",
"function selection_cloneDeep() {\n",
" var clone = this.cloneNode(true), parent = this.parentNode;\n",
" return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n",
"}\n",
"\n",
"function selection_clone(deep) {\n",
" return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n",
"}\n",
"\n",
"function selection_datum(value) {\n",
" return arguments.length\n",
" ? this.property(\"__data__\", value)\n",
" : this.node().__data__;\n",
"}\n",
"\n",
"var filterEvents = {};\n",
"\n",
"exports.event = null;\n",
"\n",
"if (typeof document !== \"undefined\") {\n",
" var element = document.documentElement;\n",
" if (!(\"onmouseenter\" in element)) {\n",
" filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n",
" }\n",
"}\n",
"\n",
"function filterContextListener(listener, index, group) {\n",
" listener = contextListener(listener, index, group);\n",
" return function(event) {\n",
" var related = event.relatedTarget;\n",
" if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n",
" listener.call(this, event);\n",
" }\n",
" };\n",
"}\n",
"\n",
"function contextListener(listener, index, group) {\n",
" return function(event1) {\n",
" var event0 = exports.event; // Events can be reentrant (e.g., focus).\n",
" exports.event = event1;\n",
" try {\n",
" listener.call(this, this.__data__, index, group);\n",
" } finally {\n",
" exports.event = event0;\n",
" }\n",
" };\n",
"}\n",
"\n",
"function parseTypenames(typenames) {\n",
" return typenames.trim().split(/^|\\s+/).map(function(t) {\n",
" var name = \"\", i = t.indexOf(\".\");\n",
" if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n",
" return {type: t, name: name};\n",
" });\n",
"}\n",
"\n",
"function onRemove(typename) {\n",
" return function() {\n",
" var on = this.__on;\n",
" if (!on) return;\n",
" for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n",
" if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n",
" this.removeEventListener(o.type, o.listener, o.capture);\n",
" } else {\n",
" on[++i] = o;\n",
" }\n",
" }\n",
" if (++i) on.length = i;\n",
" else delete this.__on;\n",
" };\n",
"}\n",
"\n",
"function onAdd(typename, value, capture) {\n",
" var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n",
" return function(d, i, group) {\n",
" var on = this.__on, o, listener = wrap(value, i, group);\n",
" if (on) for (var j = 0, m = on.length; j < m; ++j) {\n",
" if ((o = on[j]).type === typename.type && o.name === typename.name) {\n",
" this.removeEventListener(o.type, o.listener, o.capture);\n",
" this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n",
" o.value = value;\n",
" return;\n",
" }\n",
" }\n",
" this.addEventListener(typename.type, listener, capture);\n",
" o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n",
" if (!on) this.__on = [o];\n",
" else on.push(o);\n",
" };\n",
"}\n",
"\n",
"function selection_on(typename, value, capture) {\n",
" var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n",
"\n",
" if (arguments.length < 2) {\n",
" var on = this.node().__on;\n",
" if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n",
" for (i = 0, o = on[j]; i < n; ++i) {\n",
" if ((t = typenames[i]).type === o.type && t.name === o.name) {\n",
" return o.value;\n",
" }\n",
" }\n",
" }\n",
" return;\n",
" }\n",
"\n",
" on = value ? onAdd : onRemove;\n",
" if (capture == null) capture = false;\n",
" for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n",
" return this;\n",
"}\n",
"\n",
"function customEvent(event1, listener, that, args) {\n",
" var event0 = exports.event;\n",
" event1.sourceEvent = exports.event;\n",
" exports.event = event1;\n",
" try {\n",
" return listener.apply(that, args);\n",
" } finally {\n",
" exports.event = event0;\n",
" }\n",
"}\n",
"\n",
"function dispatchEvent(node, type, params) {\n",
" var window = defaultView(node),\n",
" event = window.CustomEvent;\n",
"\n",
" if (typeof event === \"function\") {\n",
" event = new event(type, params);\n",
" } else {\n",
" event = window.document.createEvent(\"Event\");\n",
" if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n",
" else event.initEvent(type, false, false);\n",
" }\n",
"\n",
" node.dispatchEvent(event);\n",
"}\n",
"\n",
"function dispatchConstant(type, params) {\n",
" return function() {\n",
" return dispatchEvent(this, type, params);\n",
" };\n",
"}\n",
"\n",
"function dispatchFunction(type, params) {\n",
" return function() {\n",
" return dispatchEvent(this, type, params.apply(this, arguments));\n",
" };\n",
"}\n",
"\n",
"function selection_dispatch(type, params) {\n",
" return this.each((typeof params === \"function\"\n",
" ? dispatchFunction\n",
" : dispatchConstant)(type, params));\n",
"}\n",
"\n",
"var root = [null];\n",
"\n",
"function Selection(groups, parents) {\n",
" this._groups = groups;\n",
" this._parents = parents;\n",
"}\n",
"\n",
"function selection() {\n",
" return new Selection([[document.documentElement]], root);\n",
"}\n",
"\n",
"Selection.prototype = selection.prototype = {\n",
" constructor: Selection,\n",
" select: selection_select,\n",
" selectAll: selection_selectAll,\n",
" filter: selection_filter,\n",
" data: selection_data,\n",
" enter: selection_enter,\n",
" exit: selection_exit,\n",
" join: selection_join,\n",
" merge: selection_merge,\n",
" order: selection_order,\n",
" sort: selection_sort,\n",
" call: selection_call,\n",
" nodes: selection_nodes,\n",
" node: selection_node,\n",
" size: selection_size,\n",
" empty: selection_empty,\n",
" each: selection_each,\n",
" attr: selection_attr,\n",
" style: selection_style,\n",
" property: selection_property,\n",
" classed: selection_classed,\n",
" text: selection_text,\n",
" html: selection_html,\n",
" raise: selection_raise,\n",
" lower: selection_lower,\n",
" append: selection_append,\n",
" insert: selection_insert,\n",
" remove: selection_remove,\n",
" clone: selection_clone,\n",
" datum: selection_datum,\n",
" on: selection_on,\n",
" dispatch: selection_dispatch\n",
"};\n",
"\n",
"function select(selector) {\n",
" return typeof selector === \"string\"\n",
" ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n",
" : new Selection([[selector]], root);\n",
"}\n",
"\n",
"function create(name) {\n",
" return select(creator(name).call(document.documentElement));\n",
"}\n",
"\n",
"var nextId = 0;\n",
"\n",
"function local() {\n",
" return new Local;\n",
"}\n",
"\n",
"function Local() {\n",
" this._ = \"@\" + (++nextId).toString(36);\n",
"}\n",
"\n",
"Local.prototype = local.prototype = {\n",
" constructor: Local,\n",
" get: function(node) {\n",
" var id = this._;\n",
" while (!(id in node)) if (!(node = node.parentNode)) return;\n",
" return node[id];\n",
" },\n",
" set: function(node, value) {\n",
" return node[this._] = value;\n",
" },\n",
" remove: function(node) {\n",
" return this._ in node && delete node[this._];\n",
" },\n",
" toString: function() {\n",
" return this._;\n",
" }\n",
"};\n",
"\n",
"function sourceEvent() {\n",
" var current = exports.event, source;\n",
" while (source = current.sourceEvent) current = source;\n",
" return current;\n",
"}\n",
"\n",
"function point(node, event) {\n",
" var svg = node.ownerSVGElement || node;\n",
"\n",
" if (svg.createSVGPoint) {\n",
" var point = svg.createSVGPoint();\n",
" point.x = event.clientX, point.y = event.clientY;\n",
" point = point.matrixTransform(node.getScreenCTM().inverse());\n",
" return [point.x, point.y];\n",
" }\n",
"\n",
" var rect = node.getBoundingClientRect();\n",
" return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n",
"}\n",
"\n",
"function mouse(node) {\n",
" var event = sourceEvent();\n",
" if (event.changedTouches) event = event.changedTouches[0];\n",
" return point(node, event);\n",
"}\n",
"\n",
"function selectAll(selector) {\n",
" return typeof selector === \"string\"\n",
" ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n",
" : new Selection([selector == null ? [] : selector], root);\n",
"}\n",
"\n",
"function touch(node, touches, identifier) {\n",
" if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;\n",
"\n",
" for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {\n",
" if ((touch = touches[i]).identifier === identifier) {\n",
" return point(node, touch);\n",
" }\n",
" }\n",
"\n",
" return null;\n",
"}\n",
"\n",
"function touches(node, touches) {\n",
" if (touches == null) touches = sourceEvent().touches;\n",
"\n",
" for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {\n",
" points[i] = point(node, touches[i]);\n",
" }\n",
"\n",
" return points;\n",
"}\n",
"\n",
"exports.clientPoint = point;\n",
"exports.create = create;\n",
"exports.creator = creator;\n",
"exports.customEvent = customEvent;\n",
"exports.local = local;\n",
"exports.matcher = matcher;\n",
"exports.mouse = mouse;\n",
"exports.namespace = namespace;\n",
"exports.namespaces = namespaces;\n",
"exports.select = select;\n",
"exports.selectAll = selectAll;\n",
"exports.selection = selection;\n",
"exports.selector = selector;\n",
"exports.selectorAll = selectorAll;\n",
"exports.style = styleValue;\n",
"exports.touch = touch;\n",
"exports.touches = touches;\n",
"exports.window = defaultView;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],12:[function(require,module,exports){\n",
"// https://d3js.org/d3-shape/ v1.3.7 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) :\n",
"typeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}, global.d3));\n",
"}(this, function (exports, d3Path) { 'use strict';\n",
"\n",
"function constant(x) {\n",
" return function constant() {\n",
" return x;\n",
" };\n",
"}\n",
"\n",
"var abs = Math.abs;\n",
"var atan2 = Math.atan2;\n",
"var cos = Math.cos;\n",
"var max = Math.max;\n",
"var min = Math.min;\n",
"var sin = Math.sin;\n",
"var sqrt = Math.sqrt;\n",
"\n",
"var epsilon = 1e-12;\n",
"var pi = Math.PI;\n",
"var halfPi = pi / 2;\n",
"var tau = 2 * pi;\n",
"\n",
"function acos(x) {\n",
" return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n",
"}\n",
"\n",
"function asin(x) {\n",
" return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n",
"}\n",
"\n",
"function arcInnerRadius(d) {\n",
" return d.innerRadius;\n",
"}\n",
"\n",
"function arcOuterRadius(d) {\n",
" return d.outerRadius;\n",
"}\n",
"\n",
"function arcStartAngle(d) {\n",
" return d.startAngle;\n",
"}\n",
"\n",
"function arcEndAngle(d) {\n",
" return d.endAngle;\n",
"}\n",
"\n",
"function arcPadAngle(d) {\n",
" return d && d.padAngle; // Note: optional!\n",
"}\n",
"\n",
"function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n",
" var x10 = x1 - x0, y10 = y1 - y0,\n",
" x32 = x3 - x2, y32 = y3 - y2,\n",
" t = y32 * x10 - x32 * y10;\n",
" if (t * t < epsilon) return;\n",
" t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n",
" return [x0 + t * x10, y0 + t * y10];\n",
"}\n",
"\n",
"// Compute perpendicular offset line of length rc.\n",
"// http://mathworld.wolfram.com/Circle-LineIntersection.html\n",
"function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n",
" var x01 = x0 - x1,\n",
" y01 = y0 - y1,\n",
" lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n",
" ox = lo * y01,\n",
" oy = -lo * x01,\n",
" x11 = x0 + ox,\n",
" y11 = y0 + oy,\n",
" x10 = x1 + ox,\n",
" y10 = y1 + oy,\n",
" x00 = (x11 + x10) / 2,\n",
" y00 = (y11 + y10) / 2,\n",
" dx = x10 - x11,\n",
" dy = y10 - y11,\n",
" d2 = dx * dx + dy * dy,\n",
" r = r1 - rc,\n",
" D = x11 * y10 - x10 * y11,\n",
" d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n",
" cx0 = (D * dy - dx * d) / d2,\n",
" cy0 = (-D * dx - dy * d) / d2,\n",
" cx1 = (D * dy + dx * d) / d2,\n",
" cy1 = (-D * dx + dy * d) / d2,\n",
" dx0 = cx0 - x00,\n",
" dy0 = cy0 - y00,\n",
" dx1 = cx1 - x00,\n",
" dy1 = cy1 - y00;\n",
"\n",
" // Pick the closer of the two intersection points.\n",
" // TODO Is there a faster way to determine which intersection to use?\n",
" if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n",
"\n",
" return {\n",
" cx: cx0,\n",
" cy: cy0,\n",
" x01: -ox,\n",
" y01: -oy,\n",
" x11: cx0 * (r1 / r - 1),\n",
" y11: cy0 * (r1 / r - 1)\n",
" };\n",
"}\n",
"\n",
"function arc() {\n",
" var innerRadius = arcInnerRadius,\n",
" outerRadius = arcOuterRadius,\n",
" cornerRadius = constant(0),\n",
" padRadius = null,\n",
" startAngle = arcStartAngle,\n",
" endAngle = arcEndAngle,\n",
" padAngle = arcPadAngle,\n",
" context = null;\n",
"\n",
" function arc() {\n",
" var buffer,\n",
" r,\n",
" r0 = +innerRadius.apply(this, arguments),\n",
" r1 = +outerRadius.apply(this, arguments),\n",
" a0 = startAngle.apply(this, arguments) - halfPi,\n",
" a1 = endAngle.apply(this, arguments) - halfPi,\n",
" da = abs(a1 - a0),\n",
" cw = a1 > a0;\n",
"\n",
" if (!context) context = buffer = d3Path.path();\n",
"\n",
" // Ensure that the outer radius is always larger than the inner radius.\n",
" if (r1 < r0) r = r1, r1 = r0, r0 = r;\n",
"\n",
" // Is it a point?\n",
" if (!(r1 > epsilon)) context.moveTo(0, 0);\n",
"\n",
" // Or is it a circle or annulus?\n",
" else if (da > tau - epsilon) {\n",
" context.moveTo(r1 * cos(a0), r1 * sin(a0));\n",
" context.arc(0, 0, r1, a0, a1, !cw);\n",
" if (r0 > epsilon) {\n",
" context.moveTo(r0 * cos(a1), r0 * sin(a1));\n",
" context.arc(0, 0, r0, a1, a0, cw);\n",
" }\n",
" }\n",
"\n",
" // Or is it a circular or annular sector?\n",
" else {\n",
" var a01 = a0,\n",
" a11 = a1,\n",
" a00 = a0,\n",
" a10 = a1,\n",
" da0 = da,\n",
" da1 = da,\n",
" ap = padAngle.apply(this, arguments) / 2,\n",
" rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n",
" rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n",
" rc0 = rc,\n",
" rc1 = rc,\n",
" t0,\n",
" t1;\n",
"\n",
" // Apply padding? Note that since r1 >= r0, da1 >= da0.\n",
" if (rp > epsilon) {\n",
" var p0 = asin(rp / r0 * sin(ap)),\n",
" p1 = asin(rp / r1 * sin(ap));\n",
" if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n",
" else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n",
" if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n",
" else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n",
" }\n",
"\n",
" var x01 = r1 * cos(a01),\n",
" y01 = r1 * sin(a01),\n",
" x10 = r0 * cos(a10),\n",
" y10 = r0 * sin(a10);\n",
"\n",
" // Apply rounded corners?\n",
" if (rc > epsilon) {\n",
" var x11 = r1 * cos(a11),\n",
" y11 = r1 * sin(a11),\n",
" x00 = r0 * cos(a00),\n",
" y00 = r0 * sin(a00),\n",
" oc;\n",
"\n",
" // Restrict the corner radius according to the sector angle.\n",
" if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n",
" var ax = x01 - oc[0],\n",
" ay = y01 - oc[1],\n",
" bx = x11 - oc[0],\n",
" by = y11 - oc[1],\n",
" kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n",
" lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n",
" rc0 = min(rc, (r0 - lc) / (kc - 1));\n",
" rc1 = min(rc, (r1 - lc) / (kc + 1));\n",
" }\n",
" }\n",
"\n",
" // Is the sector collapsed to a line?\n",
" if (!(da1 > epsilon)) context.moveTo(x01, y01);\n",
"\n",
" // Does the sector's outer ring have rounded corners?\n",
" else if (rc1 > epsilon) {\n",
" t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n",
" t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n",
"\n",
" context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n",
"\n",
" // Have the corners merged?\n",
" if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n",
"\n",
" // Otherwise, draw the two corners and the ring.\n",
" else {\n",
" context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n",
" context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n",
" context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n",
" }\n",
" }\n",
"\n",
" // Or is the outer ring just a circular arc?\n",
" else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n",
"\n",
" // Is there no inner ring, and it's a circular sector?\n",
" // Or perhaps it's an annular sector collapsed due to padding?\n",
" if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n",
"\n",
" // Does the sector's inner ring (or point) have rounded corners?\n",
" else if (rc0 > epsilon) {\n",
" t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n",
" t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n",
"\n",
" context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n",
"\n",
" // Have the corners merged?\n",
" if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n",
"\n",
" // Otherwise, draw the two corners and the ring.\n",
" else {\n",
" context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n",
" context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n",
" context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n",
" }\n",
" }\n",
"\n",
" // Or is the inner ring just a circular arc?\n",
" else context.arc(0, 0, r0, a10, a00, cw);\n",
" }\n",
"\n",
" context.closePath();\n",
"\n",
" if (buffer) return context = null, buffer + \"\" || null;\n",
" }\n",
"\n",
" arc.centroid = function() {\n",
" var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n",
" a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n",
" return [cos(a) * r, sin(a) * r];\n",
" };\n",
"\n",
" arc.innerRadius = function(_) {\n",
" return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n",
" };\n",
"\n",
" arc.outerRadius = function(_) {\n",
" return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n",
" };\n",
"\n",
" arc.cornerRadius = function(_) {\n",
" return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n",
" };\n",
"\n",
" arc.padRadius = function(_) {\n",
" return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n",
" };\n",
"\n",
" arc.startAngle = function(_) {\n",
" return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n",
" };\n",
"\n",
" arc.endAngle = function(_) {\n",
" return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n",
" };\n",
"\n",
" arc.padAngle = function(_) {\n",
" return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n",
" };\n",
"\n",
" arc.context = function(_) {\n",
" return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n",
" };\n",
"\n",
" return arc;\n",
"}\n",
"\n",
"function Linear(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"Linear.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n",
" case 1: this._point = 2; // proceed\n",
" default: this._context.lineTo(x, y); break;\n",
" }\n",
" }\n",
"};\n",
"\n",
"function curveLinear(context) {\n",
" return new Linear(context);\n",
"}\n",
"\n",
"function x(p) {\n",
" return p[0];\n",
"}\n",
"\n",
"function y(p) {\n",
" return p[1];\n",
"}\n",
"\n",
"function line() {\n",
" var x$1 = x,\n",
" y$1 = y,\n",
" defined = constant(true),\n",
" context = null,\n",
" curve = curveLinear,\n",
" output = null;\n",
"\n",
" function line(data) {\n",
" var i,\n",
" n = data.length,\n",
" d,\n",
" defined0 = false,\n",
" buffer;\n",
"\n",
" if (context == null) output = curve(buffer = d3Path.path());\n",
"\n",
" for (i = 0; i <= n; ++i) {\n",
" if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n",
" if (defined0 = !defined0) output.lineStart();\n",
" else output.lineEnd();\n",
" }\n",
" if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data));\n",
" }\n",
"\n",
" if (buffer) return output = null, buffer + \"\" || null;\n",
" }\n",
"\n",
" line.x = function(_) {\n",
" return arguments.length ? (x$1 = typeof _ === \"function\" ? _ : constant(+_), line) : x$1;\n",
" };\n",
"\n",
" line.y = function(_) {\n",
" return arguments.length ? (y$1 = typeof _ === \"function\" ? _ : constant(+_), line) : y$1;\n",
" };\n",
"\n",
" line.defined = function(_) {\n",
" return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n",
" };\n",
"\n",
" line.curve = function(_) {\n",
" return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n",
" };\n",
"\n",
" line.context = function(_) {\n",
" return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n",
" };\n",
"\n",
" return line;\n",
"}\n",
"\n",
"function area() {\n",
" var x0 = x,\n",
" x1 = null,\n",
" y0 = constant(0),\n",
" y1 = y,\n",
" defined = constant(true),\n",
" context = null,\n",
" curve = curveLinear,\n",
" output = null;\n",
"\n",
" function area(data) {\n",
" var i,\n",
" j,\n",
" k,\n",
" n = data.length,\n",
" d,\n",
" defined0 = false,\n",
" buffer,\n",
" x0z = new Array(n),\n",
" y0z = new Array(n);\n",
"\n",
" if (context == null) output = curve(buffer = d3Path.path());\n",
"\n",
" for (i = 0; i <= n; ++i) {\n",
" if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n",
" if (defined0 = !defined0) {\n",
" j = i;\n",
" output.areaStart();\n",
" output.lineStart();\n",
" } else {\n",
" output.lineEnd();\n",
" output.lineStart();\n",
" for (k = i - 1; k >= j; --k) {\n",
" output.point(x0z[k], y0z[k]);\n",
" }\n",
" output.lineEnd();\n",
" output.areaEnd();\n",
" }\n",
" }\n",
" if (defined0) {\n",
" x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n",
" output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n",
" }\n",
" }\n",
"\n",
" if (buffer) return output = null, buffer + \"\" || null;\n",
" }\n",
"\n",
" function arealine() {\n",
" return line().defined(defined).curve(curve).context(context);\n",
" }\n",
"\n",
" area.x = function(_) {\n",
" return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n",
" };\n",
"\n",
" area.x0 = function(_) {\n",
" return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n",
" };\n",
"\n",
" area.x1 = function(_) {\n",
" return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n",
" };\n",
"\n",
" area.y = function(_) {\n",
" return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n",
" };\n",
"\n",
" area.y0 = function(_) {\n",
" return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n",
" };\n",
"\n",
" area.y1 = function(_) {\n",
" return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n",
" };\n",
"\n",
" area.lineX0 =\n",
" area.lineY0 = function() {\n",
" return arealine().x(x0).y(y0);\n",
" };\n",
"\n",
" area.lineY1 = function() {\n",
" return arealine().x(x0).y(y1);\n",
" };\n",
"\n",
" area.lineX1 = function() {\n",
" return arealine().x(x1).y(y0);\n",
" };\n",
"\n",
" area.defined = function(_) {\n",
" return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n",
" };\n",
"\n",
" area.curve = function(_) {\n",
" return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n",
" };\n",
"\n",
" area.context = function(_) {\n",
" return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n",
" };\n",
"\n",
" return area;\n",
"}\n",
"\n",
"function descending(a, b) {\n",
" return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n",
"}\n",
"\n",
"function identity(d) {\n",
" return d;\n",
"}\n",
"\n",
"function pie() {\n",
" var value = identity,\n",
" sortValues = descending,\n",
" sort = null,\n",
" startAngle = constant(0),\n",
" endAngle = constant(tau),\n",
" padAngle = constant(0);\n",
"\n",
" function pie(data) {\n",
" var i,\n",
" n = data.length,\n",
" j,\n",
" k,\n",
" sum = 0,\n",
" index = new Array(n),\n",
" arcs = new Array(n),\n",
" a0 = +startAngle.apply(this, arguments),\n",
" da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n",
" a1,\n",
" p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n",
" pa = p * (da < 0 ? -1 : 1),\n",
" v;\n",
"\n",
" for (i = 0; i < n; ++i) {\n",
" if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n",
" sum += v;\n",
" }\n",
" }\n",
"\n",
" // Optionally sort the arcs by previously-computed values or by data.\n",
" if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n",
" else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n",
"\n",
" // Compute the arcs! They are stored in the original data's order.\n",
" for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n",
" j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n",
" data: data[j],\n",
" index: i,\n",
" value: v,\n",
" startAngle: a0,\n",
" endAngle: a1,\n",
" padAngle: p\n",
" };\n",
" }\n",
"\n",
" return arcs;\n",
" }\n",
"\n",
" pie.value = function(_) {\n",
" return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n",
" };\n",
"\n",
" pie.sortValues = function(_) {\n",
" return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n",
" };\n",
"\n",
" pie.sort = function(_) {\n",
" return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n",
" };\n",
"\n",
" pie.startAngle = function(_) {\n",
" return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n",
" };\n",
"\n",
" pie.endAngle = function(_) {\n",
" return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n",
" };\n",
"\n",
" pie.padAngle = function(_) {\n",
" return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n",
" };\n",
"\n",
" return pie;\n",
"}\n",
"\n",
"var curveRadialLinear = curveRadial(curveLinear);\n",
"\n",
"function Radial(curve) {\n",
" this._curve = curve;\n",
"}\n",
"\n",
"Radial.prototype = {\n",
" areaStart: function() {\n",
" this._curve.areaStart();\n",
" },\n",
" areaEnd: function() {\n",
" this._curve.areaEnd();\n",
" },\n",
" lineStart: function() {\n",
" this._curve.lineStart();\n",
" },\n",
" lineEnd: function() {\n",
" this._curve.lineEnd();\n",
" },\n",
" point: function(a, r) {\n",
" this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n",
" }\n",
"};\n",
"\n",
"function curveRadial(curve) {\n",
"\n",
" function radial(context) {\n",
" return new Radial(curve(context));\n",
" }\n",
"\n",
" radial._curve = curve;\n",
"\n",
" return radial;\n",
"}\n",
"\n",
"function lineRadial(l) {\n",
" var c = l.curve;\n",
"\n",
" l.angle = l.x, delete l.x;\n",
" l.radius = l.y, delete l.y;\n",
"\n",
" l.curve = function(_) {\n",
" return arguments.length ? c(curveRadial(_)) : c()._curve;\n",
" };\n",
"\n",
" return l;\n",
"}\n",
"\n",
"function lineRadial$1() {\n",
" return lineRadial(line().curve(curveRadialLinear));\n",
"}\n",
"\n",
"function areaRadial() {\n",
" var a = area().curve(curveRadialLinear),\n",
" c = a.curve,\n",
" x0 = a.lineX0,\n",
" x1 = a.lineX1,\n",
" y0 = a.lineY0,\n",
" y1 = a.lineY1;\n",
"\n",
" a.angle = a.x, delete a.x;\n",
" a.startAngle = a.x0, delete a.x0;\n",
" a.endAngle = a.x1, delete a.x1;\n",
" a.radius = a.y, delete a.y;\n",
" a.innerRadius = a.y0, delete a.y0;\n",
" a.outerRadius = a.y1, delete a.y1;\n",
" a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;\n",
" a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;\n",
" a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;\n",
" a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;\n",
"\n",
" a.curve = function(_) {\n",
" return arguments.length ? c(curveRadial(_)) : c()._curve;\n",
" };\n",
"\n",
" return a;\n",
"}\n",
"\n",
"function pointRadial(x, y) {\n",
" return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\n",
"}\n",
"\n",
"var slice = Array.prototype.slice;\n",
"\n",
"function linkSource(d) {\n",
" return d.source;\n",
"}\n",
"\n",
"function linkTarget(d) {\n",
" return d.target;\n",
"}\n",
"\n",
"function link(curve) {\n",
" var source = linkSource,\n",
" target = linkTarget,\n",
" x$1 = x,\n",
" y$1 = y,\n",
" context = null;\n",
"\n",
" function link() {\n",
" var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\n",
" if (!context) context = buffer = d3Path.path();\n",
" curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv));\n",
" if (buffer) return context = null, buffer + \"\" || null;\n",
" }\n",
"\n",
" link.source = function(_) {\n",
" return arguments.length ? (source = _, link) : source;\n",
" };\n",
"\n",
" link.target = function(_) {\n",
" return arguments.length ? (target = _, link) : target;\n",
" };\n",
"\n",
" link.x = function(_) {\n",
" return arguments.length ? (x$1 = typeof _ === \"function\" ? _ : constant(+_), link) : x$1;\n",
" };\n",
"\n",
" link.y = function(_) {\n",
" return arguments.length ? (y$1 = typeof _ === \"function\" ? _ : constant(+_), link) : y$1;\n",
" };\n",
"\n",
" link.context = function(_) {\n",
" return arguments.length ? ((context = _ == null ? null : _), link) : context;\n",
" };\n",
"\n",
" return link;\n",
"}\n",
"\n",
"function curveHorizontal(context, x0, y0, x1, y1) {\n",
" context.moveTo(x0, y0);\n",
" context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n",
"}\n",
"\n",
"function curveVertical(context, x0, y0, x1, y1) {\n",
" context.moveTo(x0, y0);\n",
" context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n",
"}\n",
"\n",
"function curveRadial$1(context, x0, y0, x1, y1) {\n",
" var p0 = pointRadial(x0, y0),\n",
" p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\n",
" p2 = pointRadial(x1, y0),\n",
" p3 = pointRadial(x1, y1);\n",
" context.moveTo(p0[0], p0[1]);\n",
" context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n",
"}\n",
"\n",
"function linkHorizontal() {\n",
" return link(curveHorizontal);\n",
"}\n",
"\n",
"function linkVertical() {\n",
" return link(curveVertical);\n",
"}\n",
"\n",
"function linkRadial() {\n",
" var l = link(curveRadial$1);\n",
" l.angle = l.x, delete l.x;\n",
" l.radius = l.y, delete l.y;\n",
" return l;\n",
"}\n",
"\n",
"var circle = {\n",
" draw: function(context, size) {\n",
" var r = Math.sqrt(size / pi);\n",
" context.moveTo(r, 0);\n",
" context.arc(0, 0, r, 0, tau);\n",
" }\n",
"};\n",
"\n",
"var cross = {\n",
" draw: function(context, size) {\n",
" var r = Math.sqrt(size / 5) / 2;\n",
" context.moveTo(-3 * r, -r);\n",
" context.lineTo(-r, -r);\n",
" context.lineTo(-r, -3 * r);\n",
" context.lineTo(r, -3 * r);\n",
" context.lineTo(r, -r);\n",
" context.lineTo(3 * r, -r);\n",
" context.lineTo(3 * r, r);\n",
" context.lineTo(r, r);\n",
" context.lineTo(r, 3 * r);\n",
" context.lineTo(-r, 3 * r);\n",
" context.lineTo(-r, r);\n",
" context.lineTo(-3 * r, r);\n",
" context.closePath();\n",
" }\n",
"};\n",
"\n",
"var tan30 = Math.sqrt(1 / 3),\n",
" tan30_2 = tan30 * 2;\n",
"\n",
"var diamond = {\n",
" draw: function(context, size) {\n",
" var y = Math.sqrt(size / tan30_2),\n",
" x = y * tan30;\n",
" context.moveTo(0, -y);\n",
" context.lineTo(x, 0);\n",
" context.lineTo(0, y);\n",
" context.lineTo(-x, 0);\n",
" context.closePath();\n",
" }\n",
"};\n",
"\n",
"var ka = 0.89081309152928522810,\n",
" kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n",
" kx = Math.sin(tau / 10) * kr,\n",
" ky = -Math.cos(tau / 10) * kr;\n",
"\n",
"var star = {\n",
" draw: function(context, size) {\n",
" var r = Math.sqrt(size * ka),\n",
" x = kx * r,\n",
" y = ky * r;\n",
" context.moveTo(0, -r);\n",
" context.lineTo(x, y);\n",
" for (var i = 1; i < 5; ++i) {\n",
" var a = tau * i / 5,\n",
" c = Math.cos(a),\n",
" s = Math.sin(a);\n",
" context.lineTo(s * r, -c * r);\n",
" context.lineTo(c * x - s * y, s * x + c * y);\n",
" }\n",
" context.closePath();\n",
" }\n",
"};\n",
"\n",
"var square = {\n",
" draw: function(context, size) {\n",
" var w = Math.sqrt(size),\n",
" x = -w / 2;\n",
" context.rect(x, x, w, w);\n",
" }\n",
"};\n",
"\n",
"var sqrt3 = Math.sqrt(3);\n",
"\n",
"var triangle = {\n",
" draw: function(context, size) {\n",
" var y = -Math.sqrt(size / (sqrt3 * 3));\n",
" context.moveTo(0, y * 2);\n",
" context.lineTo(-sqrt3 * y, -y);\n",
" context.lineTo(sqrt3 * y, -y);\n",
" context.closePath();\n",
" }\n",
"};\n",
"\n",
"var c = -0.5,\n",
" s = Math.sqrt(3) / 2,\n",
" k = 1 / Math.sqrt(12),\n",
" a = (k / 2 + 1) * 3;\n",
"\n",
"var wye = {\n",
" draw: function(context, size) {\n",
" var r = Math.sqrt(size / a),\n",
" x0 = r / 2,\n",
" y0 = r * k,\n",
" x1 = x0,\n",
" y1 = r * k + r,\n",
" x2 = -x1,\n",
" y2 = y1;\n",
" context.moveTo(x0, y0);\n",
" context.lineTo(x1, y1);\n",
" context.lineTo(x2, y2);\n",
" context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n",
" context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n",
" context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n",
" context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n",
" context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n",
" context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n",
" context.closePath();\n",
" }\n",
"};\n",
"\n",
"var symbols = [\n",
" circle,\n",
" cross,\n",
" diamond,\n",
" square,\n",
" star,\n",
" triangle,\n",
" wye\n",
"];\n",
"\n",
"function symbol() {\n",
" var type = constant(circle),\n",
" size = constant(64),\n",
" context = null;\n",
"\n",
" function symbol() {\n",
" var buffer;\n",
" if (!context) context = buffer = d3Path.path();\n",
" type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n",
" if (buffer) return context = null, buffer + \"\" || null;\n",
" }\n",
"\n",
" symbol.type = function(_) {\n",
" return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n",
" };\n",
"\n",
" symbol.size = function(_) {\n",
" return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n",
" };\n",
"\n",
" symbol.context = function(_) {\n",
" return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n",
" };\n",
"\n",
" return symbol;\n",
"}\n",
"\n",
"function noop() {}\n",
"\n",
"function point(that, x, y) {\n",
" that._context.bezierCurveTo(\n",
" (2 * that._x0 + that._x1) / 3,\n",
" (2 * that._y0 + that._y1) / 3,\n",
" (that._x0 + 2 * that._x1) / 3,\n",
" (that._y0 + 2 * that._y1) / 3,\n",
" (that._x0 + 4 * that._x1 + x) / 6,\n",
" (that._y0 + 4 * that._y1 + y) / 6\n",
" );\n",
"}\n",
"\n",
"function Basis(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"Basis.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x0 = this._x1 =\n",
" this._y0 = this._y1 = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" switch (this._point) {\n",
" case 3: point(this, this._x1, this._y1); // proceed\n",
" case 2: this._context.lineTo(this._x1, this._y1); break;\n",
" }\n",
" if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n",
" case 1: this._point = 2; break;\n",
" case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n",
" default: point(this, x, y); break;\n",
" }\n",
" this._x0 = this._x1, this._x1 = x;\n",
" this._y0 = this._y1, this._y1 = y;\n",
" }\n",
"};\n",
"\n",
"function basis(context) {\n",
" return new Basis(context);\n",
"}\n",
"\n",
"function BasisClosed(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"BasisClosed.prototype = {\n",
" areaStart: noop,\n",
" areaEnd: noop,\n",
" lineStart: function() {\n",
" this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n",
" this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" switch (this._point) {\n",
" case 1: {\n",
" this._context.moveTo(this._x2, this._y2);\n",
" this._context.closePath();\n",
" break;\n",
" }\n",
" case 2: {\n",
" this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n",
" this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n",
" this._context.closePath();\n",
" break;\n",
" }\n",
" case 3: {\n",
" this.point(this._x2, this._y2);\n",
" this.point(this._x3, this._y3);\n",
" this.point(this._x4, this._y4);\n",
" break;\n",
" }\n",
" }\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n",
" case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n",
" case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n",
" default: point(this, x, y); break;\n",
" }\n",
" this._x0 = this._x1, this._x1 = x;\n",
" this._y0 = this._y1, this._y1 = y;\n",
" }\n",
"};\n",
"\n",
"function basisClosed(context) {\n",
" return new BasisClosed(context);\n",
"}\n",
"\n",
"function BasisOpen(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"BasisOpen.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x0 = this._x1 =\n",
" this._y0 = this._y1 = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; break;\n",
" case 1: this._point = 2; break;\n",
" case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n",
" case 3: this._point = 4; // proceed\n",
" default: point(this, x, y); break;\n",
" }\n",
" this._x0 = this._x1, this._x1 = x;\n",
" this._y0 = this._y1, this._y1 = y;\n",
" }\n",
"};\n",
"\n",
"function basisOpen(context) {\n",
" return new BasisOpen(context);\n",
"}\n",
"\n",
"function Bundle(context, beta) {\n",
" this._basis = new Basis(context);\n",
" this._beta = beta;\n",
"}\n",
"\n",
"Bundle.prototype = {\n",
" lineStart: function() {\n",
" this._x = [];\n",
" this._y = [];\n",
" this._basis.lineStart();\n",
" },\n",
" lineEnd: function() {\n",
" var x = this._x,\n",
" y = this._y,\n",
" j = x.length - 1;\n",
"\n",
" if (j > 0) {\n",
" var x0 = x[0],\n",
" y0 = y[0],\n",
" dx = x[j] - x0,\n",
" dy = y[j] - y0,\n",
" i = -1,\n",
" t;\n",
"\n",
" while (++i <= j) {\n",
" t = i / j;\n",
" this._basis.point(\n",
" this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n",
" this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n",
" );\n",
" }\n",
" }\n",
"\n",
" this._x = this._y = null;\n",
" this._basis.lineEnd();\n",
" },\n",
" point: function(x, y) {\n",
" this._x.push(+x);\n",
" this._y.push(+y);\n",
" }\n",
"};\n",
"\n",
"var bundle = (function custom(beta) {\n",
"\n",
" function bundle(context) {\n",
" return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n",
" }\n",
"\n",
" bundle.beta = function(beta) {\n",
" return custom(+beta);\n",
" };\n",
"\n",
" return bundle;\n",
"})(0.85);\n",
"\n",
"function point$1(that, x, y) {\n",
" that._context.bezierCurveTo(\n",
" that._x1 + that._k * (that._x2 - that._x0),\n",
" that._y1 + that._k * (that._y2 - that._y0),\n",
" that._x2 + that._k * (that._x1 - x),\n",
" that._y2 + that._k * (that._y1 - y),\n",
" that._x2,\n",
" that._y2\n",
" );\n",
"}\n",
"\n",
"function Cardinal(context, tension) {\n",
" this._context = context;\n",
" this._k = (1 - tension) / 6;\n",
"}\n",
"\n",
"Cardinal.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x0 = this._x1 = this._x2 =\n",
" this._y0 = this._y1 = this._y2 = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" switch (this._point) {\n",
" case 2: this._context.lineTo(this._x2, this._y2); break;\n",
" case 3: point$1(this, this._x1, this._y1); break;\n",
" }\n",
" if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n",
" case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n",
" case 2: this._point = 3; // proceed\n",
" default: point$1(this, x, y); break;\n",
" }\n",
" this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n",
" this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n",
" }\n",
"};\n",
"\n",
"var cardinal = (function custom(tension) {\n",
"\n",
" function cardinal(context) {\n",
" return new Cardinal(context, tension);\n",
" }\n",
"\n",
" cardinal.tension = function(tension) {\n",
" return custom(+tension);\n",
" };\n",
"\n",
" return cardinal;\n",
"})(0);\n",
"\n",
"function CardinalClosed(context, tension) {\n",
" this._context = context;\n",
" this._k = (1 - tension) / 6;\n",
"}\n",
"\n",
"CardinalClosed.prototype = {\n",
" areaStart: noop,\n",
" areaEnd: noop,\n",
" lineStart: function() {\n",
" this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n",
" this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" switch (this._point) {\n",
" case 1: {\n",
" this._context.moveTo(this._x3, this._y3);\n",
" this._context.closePath();\n",
" break;\n",
" }\n",
" case 2: {\n",
" this._context.lineTo(this._x3, this._y3);\n",
" this._context.closePath();\n",
" break;\n",
" }\n",
" case 3: {\n",
" this.point(this._x3, this._y3);\n",
" this.point(this._x4, this._y4);\n",
" this.point(this._x5, this._y5);\n",
" break;\n",
" }\n",
" }\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n",
" case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n",
" case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n",
" default: point$1(this, x, y); break;\n",
" }\n",
" this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n",
" this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n",
" }\n",
"};\n",
"\n",
"var cardinalClosed = (function custom(tension) {\n",
"\n",
" function cardinal(context) {\n",
" return new CardinalClosed(context, tension);\n",
" }\n",
"\n",
" cardinal.tension = function(tension) {\n",
" return custom(+tension);\n",
" };\n",
"\n",
" return cardinal;\n",
"})(0);\n",
"\n",
"function CardinalOpen(context, tension) {\n",
" this._context = context;\n",
" this._k = (1 - tension) / 6;\n",
"}\n",
"\n",
"CardinalOpen.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x0 = this._x1 = this._x2 =\n",
" this._y0 = this._y1 = this._y2 = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; break;\n",
" case 1: this._point = 2; break;\n",
" case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n",
" case 3: this._point = 4; // proceed\n",
" default: point$1(this, x, y); break;\n",
" }\n",
" this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n",
" this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n",
" }\n",
"};\n",
"\n",
"var cardinalOpen = (function custom(tension) {\n",
"\n",
" function cardinal(context) {\n",
" return new CardinalOpen(context, tension);\n",
" }\n",
"\n",
" cardinal.tension = function(tension) {\n",
" return custom(+tension);\n",
" };\n",
"\n",
" return cardinal;\n",
"})(0);\n",
"\n",
"function point$2(that, x, y) {\n",
" var x1 = that._x1,\n",
" y1 = that._y1,\n",
" x2 = that._x2,\n",
" y2 = that._y2;\n",
"\n",
" if (that._l01_a > epsilon) {\n",
" var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n",
" n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n",
" x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n",
" y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n",
" }\n",
"\n",
" if (that._l23_a > epsilon) {\n",
" var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n",
" m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n",
" x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n",
" y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n",
" }\n",
"\n",
" that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n",
"}\n",
"\n",
"function CatmullRom(context, alpha) {\n",
" this._context = context;\n",
" this._alpha = alpha;\n",
"}\n",
"\n",
"CatmullRom.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x0 = this._x1 = this._x2 =\n",
" this._y0 = this._y1 = this._y2 = NaN;\n",
" this._l01_a = this._l12_a = this._l23_a =\n",
" this._l01_2a = this._l12_2a = this._l23_2a =\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" switch (this._point) {\n",
" case 2: this._context.lineTo(this._x2, this._y2); break;\n",
" case 3: this.point(this._x2, this._y2); break;\n",
" }\n",
" if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
"\n",
" if (this._point) {\n",
" var x23 = this._x2 - x,\n",
" y23 = this._y2 - y;\n",
" this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n",
" }\n",
"\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n",
" case 1: this._point = 2; break;\n",
" case 2: this._point = 3; // proceed\n",
" default: point$2(this, x, y); break;\n",
" }\n",
"\n",
" this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n",
" this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n",
" this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n",
" this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n",
" }\n",
"};\n",
"\n",
"var catmullRom = (function custom(alpha) {\n",
"\n",
" function catmullRom(context) {\n",
" return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n",
" }\n",
"\n",
" catmullRom.alpha = function(alpha) {\n",
" return custom(+alpha);\n",
" };\n",
"\n",
" return catmullRom;\n",
"})(0.5);\n",
"\n",
"function CatmullRomClosed(context, alpha) {\n",
" this._context = context;\n",
" this._alpha = alpha;\n",
"}\n",
"\n",
"CatmullRomClosed.prototype = {\n",
" areaStart: noop,\n",
" areaEnd: noop,\n",
" lineStart: function() {\n",
" this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n",
" this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n",
" this._l01_a = this._l12_a = this._l23_a =\n",
" this._l01_2a = this._l12_2a = this._l23_2a =\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" switch (this._point) {\n",
" case 1: {\n",
" this._context.moveTo(this._x3, this._y3);\n",
" this._context.closePath();\n",
" break;\n",
" }\n",
" case 2: {\n",
" this._context.lineTo(this._x3, this._y3);\n",
" this._context.closePath();\n",
" break;\n",
" }\n",
" case 3: {\n",
" this.point(this._x3, this._y3);\n",
" this.point(this._x4, this._y4);\n",
" this.point(this._x5, this._y5);\n",
" break;\n",
" }\n",
" }\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
"\n",
" if (this._point) {\n",
" var x23 = this._x2 - x,\n",
" y23 = this._y2 - y;\n",
" this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n",
" }\n",
"\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n",
" case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n",
" case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n",
" default: point$2(this, x, y); break;\n",
" }\n",
"\n",
" this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n",
" this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n",
" this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n",
" this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n",
" }\n",
"};\n",
"\n",
"var catmullRomClosed = (function custom(alpha) {\n",
"\n",
" function catmullRom(context) {\n",
" return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n",
" }\n",
"\n",
" catmullRom.alpha = function(alpha) {\n",
" return custom(+alpha);\n",
" };\n",
"\n",
" return catmullRom;\n",
"})(0.5);\n",
"\n",
"function CatmullRomOpen(context, alpha) {\n",
" this._context = context;\n",
" this._alpha = alpha;\n",
"}\n",
"\n",
"CatmullRomOpen.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x0 = this._x1 = this._x2 =\n",
" this._y0 = this._y1 = this._y2 = NaN;\n",
" this._l01_a = this._l12_a = this._l23_a =\n",
" this._l01_2a = this._l12_2a = this._l23_2a =\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
"\n",
" if (this._point) {\n",
" var x23 = this._x2 - x,\n",
" y23 = this._y2 - y;\n",
" this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n",
" }\n",
"\n",
" switch (this._point) {\n",
" case 0: this._point = 1; break;\n",
" case 1: this._point = 2; break;\n",
" case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n",
" case 3: this._point = 4; // proceed\n",
" default: point$2(this, x, y); break;\n",
" }\n",
"\n",
" this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n",
" this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n",
" this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n",
" this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n",
" }\n",
"};\n",
"\n",
"var catmullRomOpen = (function custom(alpha) {\n",
"\n",
" function catmullRom(context) {\n",
" return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n",
" }\n",
"\n",
" catmullRom.alpha = function(alpha) {\n",
" return custom(+alpha);\n",
" };\n",
"\n",
" return catmullRom;\n",
"})(0.5);\n",
"\n",
"function LinearClosed(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"LinearClosed.prototype = {\n",
" areaStart: noop,\n",
" areaEnd: noop,\n",
" lineStart: function() {\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" if (this._point) this._context.closePath();\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" if (this._point) this._context.lineTo(x, y);\n",
" else this._point = 1, this._context.moveTo(x, y);\n",
" }\n",
"};\n",
"\n",
"function linearClosed(context) {\n",
" return new LinearClosed(context);\n",
"}\n",
"\n",
"function sign(x) {\n",
" return x < 0 ? -1 : 1;\n",
"}\n",
"\n",
"// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n",
"// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n",
"// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n",
"// NOV(II), P. 443, 1990.\n",
"function slope3(that, x2, y2) {\n",
" var h0 = that._x1 - that._x0,\n",
" h1 = x2 - that._x1,\n",
" s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n",
" s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n",
" p = (s0 * h1 + s1 * h0) / (h0 + h1);\n",
" return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n",
"}\n",
"\n",
"// Calculate a one-sided slope.\n",
"function slope2(that, t) {\n",
" var h = that._x1 - that._x0;\n",
" return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n",
"}\n",
"\n",
"// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n",
"// \"you can express cubic Hermite interpolation in terms of cubic B'ezier curves\n",
"// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\n",
"function point$3(that, t0, t1) {\n",
" var x0 = that._x0,\n",
" y0 = that._y0,\n",
" x1 = that._x1,\n",
" y1 = that._y1,\n",
" dx = (x1 - x0) / 3;\n",
" that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n",
"}\n",
"\n",
"function MonotoneX(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"MonotoneX.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x0 = this._x1 =\n",
" this._y0 = this._y1 =\n",
" this._t0 = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" switch (this._point) {\n",
" case 2: this._context.lineTo(this._x1, this._y1); break;\n",
" case 3: point$3(this, this._t0, slope2(this, this._t0)); break;\n",
" }\n",
" if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" var t1 = NaN;\n",
"\n",
" x = +x, y = +y;\n",
" if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n",
" case 1: this._point = 2; break;\n",
" case 2: this._point = 3; point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n",
" default: point$3(this, this._t0, t1 = slope3(this, x, y)); break;\n",
" }\n",
"\n",
" this._x0 = this._x1, this._x1 = x;\n",
" this._y0 = this._y1, this._y1 = y;\n",
" this._t0 = t1;\n",
" }\n",
"};\n",
"\n",
"function MonotoneY(context) {\n",
" this._context = new ReflectContext(context);\n",
"}\n",
"\n",
"(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n",
" MonotoneX.prototype.point.call(this, y, x);\n",
"};\n",
"\n",
"function ReflectContext(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"ReflectContext.prototype = {\n",
" moveTo: function(x, y) { this._context.moveTo(y, x); },\n",
" closePath: function() { this._context.closePath(); },\n",
" lineTo: function(x, y) { this._context.lineTo(y, x); },\n",
" bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n",
"};\n",
"\n",
"function monotoneX(context) {\n",
" return new MonotoneX(context);\n",
"}\n",
"\n",
"function monotoneY(context) {\n",
" return new MonotoneY(context);\n",
"}\n",
"\n",
"function Natural(context) {\n",
" this._context = context;\n",
"}\n",
"\n",
"Natural.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x = [];\n",
" this._y = [];\n",
" },\n",
" lineEnd: function() {\n",
" var x = this._x,\n",
" y = this._y,\n",
" n = x.length;\n",
"\n",
" if (n) {\n",
" this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n",
" if (n === 2) {\n",
" this._context.lineTo(x[1], y[1]);\n",
" } else {\n",
" var px = controlPoints(x),\n",
" py = controlPoints(y);\n",
" for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n",
" this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n",
" }\n",
" }\n",
" }\n",
"\n",
" if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n",
" this._line = 1 - this._line;\n",
" this._x = this._y = null;\n",
" },\n",
" point: function(x, y) {\n",
" this._x.push(+x);\n",
" this._y.push(+y);\n",
" }\n",
"};\n",
"\n",
"// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\n",
"function controlPoints(x) {\n",
" var i,\n",
" n = x.length - 1,\n",
" m,\n",
" a = new Array(n),\n",
" b = new Array(n),\n",
" r = new Array(n);\n",
" a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n",
" for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n",
" a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n",
" for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n",
" a[n - 1] = r[n - 1] / b[n - 1];\n",
" for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n",
" b[n - 1] = (x[n] + a[n - 1]) / 2;\n",
" for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n",
" return [a, b];\n",
"}\n",
"\n",
"function natural(context) {\n",
" return new Natural(context);\n",
"}\n",
"\n",
"function Step(context, t) {\n",
" this._context = context;\n",
" this._t = t;\n",
"}\n",
"\n",
"Step.prototype = {\n",
" areaStart: function() {\n",
" this._line = 0;\n",
" },\n",
" areaEnd: function() {\n",
" this._line = NaN;\n",
" },\n",
" lineStart: function() {\n",
" this._x = this._y = NaN;\n",
" this._point = 0;\n",
" },\n",
" lineEnd: function() {\n",
" if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n",
" if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n",
" if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n",
" },\n",
" point: function(x, y) {\n",
" x = +x, y = +y;\n",
" switch (this._point) {\n",
" case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n",
" case 1: this._point = 2; // proceed\n",
" default: {\n",
" if (this._t <= 0) {\n",
" this._context.lineTo(this._x, y);\n",
" this._context.lineTo(x, y);\n",
" } else {\n",
" var x1 = this._x * (1 - this._t) + x * this._t;\n",
" this._context.lineTo(x1, this._y);\n",
" this._context.lineTo(x1, y);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" this._x = x, this._y = y;\n",
" }\n",
"};\n",
"\n",
"function step(context) {\n",
" return new Step(context, 0.5);\n",
"}\n",
"\n",
"function stepBefore(context) {\n",
" return new Step(context, 0);\n",
"}\n",
"\n",
"function stepAfter(context) {\n",
" return new Step(context, 1);\n",
"}\n",
"\n",
"function none(series, order) {\n",
" if (!((n = series.length) > 1)) return;\n",
" for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n",
" s0 = s1, s1 = series[order[i]];\n",
" for (j = 0; j < m; ++j) {\n",
" s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n",
" }\n",
" }\n",
"}\n",
"\n",
"function none$1(series) {\n",
" var n = series.length, o = new Array(n);\n",
" while (--n >= 0) o[n] = n;\n",
" return o;\n",
"}\n",
"\n",
"function stackValue(d, key) {\n",
" return d[key];\n",
"}\n",
"\n",
"function stack() {\n",
" var keys = constant([]),\n",
" order = none$1,\n",
" offset = none,\n",
" value = stackValue;\n",
"\n",
" function stack(data) {\n",
" var kz = keys.apply(this, arguments),\n",
" i,\n",
" m = data.length,\n",
" n = kz.length,\n",
" sz = new Array(n),\n",
" oz;\n",
"\n",
" for (i = 0; i < n; ++i) {\n",
" for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n",
" si[j] = sij = [0, +value(data[j], ki, j, data)];\n",
" sij.data = data[j];\n",
" }\n",
" si.key = ki;\n",
" }\n",
"\n",
" for (i = 0, oz = order(sz); i < n; ++i) {\n",
" sz[oz[i]].index = i;\n",
" }\n",
"\n",
" offset(sz, oz);\n",
" return sz;\n",
" }\n",
"\n",
" stack.keys = function(_) {\n",
" return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n",
" };\n",
"\n",
" stack.value = function(_) {\n",
" return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n",
" };\n",
"\n",
" stack.order = function(_) {\n",
" return arguments.length ? (order = _ == null ? none$1 : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n",
" };\n",
"\n",
" stack.offset = function(_) {\n",
" return arguments.length ? (offset = _ == null ? none : _, stack) : offset;\n",
" };\n",
"\n",
" return stack;\n",
"}\n",
"\n",
"function expand(series, order) {\n",
" if (!((n = series.length) > 0)) return;\n",
" for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n",
" for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n",
" if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n",
" }\n",
" none(series, order);\n",
"}\n",
"\n",
"function diverging(series, order) {\n",
" if (!((n = series.length) > 0)) return;\n",
" for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n",
" for (yp = yn = 0, i = 0; i < n; ++i) {\n",
" if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {\n",
" d[0] = yp, d[1] = yp += dy;\n",
" } else if (dy < 0) {\n",
" d[1] = yn, d[0] = yn += dy;\n",
" } else {\n",
" d[0] = 0, d[1] = dy;\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"function silhouette(series, order) {\n",
" if (!((n = series.length) > 0)) return;\n",
" for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n",
" for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n",
" s0[j][1] += s0[j][0] = -y / 2;\n",
" }\n",
" none(series, order);\n",
"}\n",
"\n",
"function wiggle(series, order) {\n",
" if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n",
" for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n",
" for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n",
" var si = series[order[i]],\n",
" sij0 = si[j][1] || 0,\n",
" sij1 = si[j - 1][1] || 0,\n",
" s3 = (sij0 - sij1) / 2;\n",
" for (var k = 0; k < i; ++k) {\n",
" var sk = series[order[k]],\n",
" skj0 = sk[j][1] || 0,\n",
" skj1 = sk[j - 1][1] || 0;\n",
" s3 += skj0 - skj1;\n",
" }\n",
" s1 += sij0, s2 += s3 * sij0;\n",
" }\n",
" s0[j - 1][1] += s0[j - 1][0] = y;\n",
" if (s1) y -= s2 / s1;\n",
" }\n",
" s0[j - 1][1] += s0[j - 1][0] = y;\n",
" none(series, order);\n",
"}\n",
"\n",
"function appearance(series) {\n",
" var peaks = series.map(peak);\n",
" return none$1(series).sort(function(a, b) { return peaks[a] - peaks[b]; });\n",
"}\n",
"\n",
"function peak(series) {\n",
" var i = -1, j = 0, n = series.length, vi, vj = -Infinity;\n",
" while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;\n",
" return j;\n",
"}\n",
"\n",
"function ascending(series) {\n",
" var sums = series.map(sum);\n",
" return none$1(series).sort(function(a, b) { return sums[a] - sums[b]; });\n",
"}\n",
"\n",
"function sum(series) {\n",
" var s = 0, i = -1, n = series.length, v;\n",
" while (++i < n) if (v = +series[i][1]) s += v;\n",
" return s;\n",
"}\n",
"\n",
"function descending$1(series) {\n",
" return ascending(series).reverse();\n",
"}\n",
"\n",
"function insideOut(series) {\n",
" var n = series.length,\n",
" i,\n",
" j,\n",
" sums = series.map(sum),\n",
" order = appearance(series),\n",
" top = 0,\n",
" bottom = 0,\n",
" tops = [],\n",
" bottoms = [];\n",
"\n",
" for (i = 0; i < n; ++i) {\n",
" j = order[i];\n",
" if (top < bottom) {\n",
" top += sums[j];\n",
" tops.push(j);\n",
" } else {\n",
" bottom += sums[j];\n",
" bottoms.push(j);\n",
" }\n",
" }\n",
"\n",
" return bottoms.reverse().concat(tops);\n",
"}\n",
"\n",
"function reverse(series) {\n",
" return none$1(series).reverse();\n",
"}\n",
"\n",
"exports.arc = arc;\n",
"exports.area = area;\n",
"exports.areaRadial = areaRadial;\n",
"exports.curveBasis = basis;\n",
"exports.curveBasisClosed = basisClosed;\n",
"exports.curveBasisOpen = basisOpen;\n",
"exports.curveBundle = bundle;\n",
"exports.curveCardinal = cardinal;\n",
"exports.curveCardinalClosed = cardinalClosed;\n",
"exports.curveCardinalOpen = cardinalOpen;\n",
"exports.curveCatmullRom = catmullRom;\n",
"exports.curveCatmullRomClosed = catmullRomClosed;\n",
"exports.curveCatmullRomOpen = catmullRomOpen;\n",
"exports.curveLinear = curveLinear;\n",
"exports.curveLinearClosed = linearClosed;\n",
"exports.curveMonotoneX = monotoneX;\n",
"exports.curveMonotoneY = monotoneY;\n",
"exports.curveNatural = natural;\n",
"exports.curveStep = step;\n",
"exports.curveStepAfter = stepAfter;\n",
"exports.curveStepBefore = stepBefore;\n",
"exports.line = line;\n",
"exports.lineRadial = lineRadial$1;\n",
"exports.linkHorizontal = linkHorizontal;\n",
"exports.linkRadial = linkRadial;\n",
"exports.linkVertical = linkVertical;\n",
"exports.pie = pie;\n",
"exports.pointRadial = pointRadial;\n",
"exports.radialArea = areaRadial;\n",
"exports.radialLine = lineRadial$1;\n",
"exports.stack = stack;\n",
"exports.stackOffsetDiverging = diverging;\n",
"exports.stackOffsetExpand = expand;\n",
"exports.stackOffsetNone = none;\n",
"exports.stackOffsetSilhouette = silhouette;\n",
"exports.stackOffsetWiggle = wiggle;\n",
"exports.stackOrderAppearance = appearance;\n",
"exports.stackOrderAscending = ascending;\n",
"exports.stackOrderDescending = descending$1;\n",
"exports.stackOrderInsideOut = insideOut;\n",
"exports.stackOrderNone = none$1;\n",
"exports.stackOrderReverse = reverse;\n",
"exports.symbol = symbol;\n",
"exports.symbolCircle = circle;\n",
"exports.symbolCross = cross;\n",
"exports.symbolDiamond = diamond;\n",
"exports.symbolSquare = square;\n",
"exports.symbolStar = star;\n",
"exports.symbolTriangle = triangle;\n",
"exports.symbolWye = wye;\n",
"exports.symbols = symbols;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{\"d3-path\":9}],13:[function(require,module,exports){\n",
"// https://d3js.org/d3-time-format/ v2.2.2 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) :\n",
"typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}, global.d3));\n",
"}(this, function (exports, d3Time) { 'use strict';\n",
"\n",
"function localDate(d) {\n",
" if (0 <= d.y && d.y < 100) {\n",
" var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n",
" date.setFullYear(d.y);\n",
" return date;\n",
" }\n",
" return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n",
"}\n",
"\n",
"function utcDate(d) {\n",
" if (0 <= d.y && d.y < 100) {\n",
" var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n",
" date.setUTCFullYear(d.y);\n",
" return date;\n",
" }\n",
" return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n",
"}\n",
"\n",
"function newDate(y, m, d) {\n",
" return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n",
"}\n",
"\n",
"function formatLocale(locale) {\n",
" var locale_dateTime = locale.dateTime,\n",
" locale_date = locale.date,\n",
" locale_time = locale.time,\n",
" locale_periods = locale.periods,\n",
" locale_weekdays = locale.days,\n",
" locale_shortWeekdays = locale.shortDays,\n",
" locale_months = locale.months,\n",
" locale_shortMonths = locale.shortMonths;\n",
"\n",
" var periodRe = formatRe(locale_periods),\n",
" periodLookup = formatLookup(locale_periods),\n",
" weekdayRe = formatRe(locale_weekdays),\n",
" weekdayLookup = formatLookup(locale_weekdays),\n",
" shortWeekdayRe = formatRe(locale_shortWeekdays),\n",
" shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n",
" monthRe = formatRe(locale_months),\n",
" monthLookup = formatLookup(locale_months),\n",
" shortMonthRe = formatRe(locale_shortMonths),\n",
" shortMonthLookup = formatLookup(locale_shortMonths);\n",
"\n",
" var formats = {\n",
" \"a\": formatShortWeekday,\n",
" \"A\": formatWeekday,\n",
" \"b\": formatShortMonth,\n",
" \"B\": formatMonth,\n",
" \"c\": null,\n",
" \"d\": formatDayOfMonth,\n",
" \"e\": formatDayOfMonth,\n",
" \"f\": formatMicroseconds,\n",
" \"H\": formatHour24,\n",
" \"I\": formatHour12,\n",
" \"j\": formatDayOfYear,\n",
" \"L\": formatMilliseconds,\n",
" \"m\": formatMonthNumber,\n",
" \"M\": formatMinutes,\n",
" \"p\": formatPeriod,\n",
" \"q\": formatQuarter,\n",
" \"Q\": formatUnixTimestamp,\n",
" \"s\": formatUnixTimestampSeconds,\n",
" \"S\": formatSeconds,\n",
" \"u\": formatWeekdayNumberMonday,\n",
" \"U\": formatWeekNumberSunday,\n",
" \"V\": formatWeekNumberISO,\n",
" \"w\": formatWeekdayNumberSunday,\n",
" \"W\": formatWeekNumberMonday,\n",
" \"x\": null,\n",
" \"X\": null,\n",
" \"y\": formatYear,\n",
" \"Y\": formatFullYear,\n",
" \"Z\": formatZone,\n",
" \"%\": formatLiteralPercent\n",
" };\n",
"\n",
" var utcFormats = {\n",
" \"a\": formatUTCShortWeekday,\n",
" \"A\": formatUTCWeekday,\n",
" \"b\": formatUTCShortMonth,\n",
" \"B\": formatUTCMonth,\n",
" \"c\": null,\n",
" \"d\": formatUTCDayOfMonth,\n",
" \"e\": formatUTCDayOfMonth,\n",
" \"f\": formatUTCMicroseconds,\n",
" \"H\": formatUTCHour24,\n",
" \"I\": formatUTCHour12,\n",
" \"j\": formatUTCDayOfYear,\n",
" \"L\": formatUTCMilliseconds,\n",
" \"m\": formatUTCMonthNumber,\n",
" \"M\": formatUTCMinutes,\n",
" \"p\": formatUTCPeriod,\n",
" \"q\": formatUTCQuarter,\n",
" \"Q\": formatUnixTimestamp,\n",
" \"s\": formatUnixTimestampSeconds,\n",
" \"S\": formatUTCSeconds,\n",
" \"u\": formatUTCWeekdayNumberMonday,\n",
" \"U\": formatUTCWeekNumberSunday,\n",
" \"V\": formatUTCWeekNumberISO,\n",
" \"w\": formatUTCWeekdayNumberSunday,\n",
" \"W\": formatUTCWeekNumberMonday,\n",
" \"x\": null,\n",
" \"X\": null,\n",
" \"y\": formatUTCYear,\n",
" \"Y\": formatUTCFullYear,\n",
" \"Z\": formatUTCZone,\n",
" \"%\": formatLiteralPercent\n",
" };\n",
"\n",
" var parses = {\n",
" \"a\": parseShortWeekday,\n",
" \"A\": parseWeekday,\n",
" \"b\": parseShortMonth,\n",
" \"B\": parseMonth,\n",
" \"c\": parseLocaleDateTime,\n",
" \"d\": parseDayOfMonth,\n",
" \"e\": parseDayOfMonth,\n",
" \"f\": parseMicroseconds,\n",
" \"H\": parseHour24,\n",
" \"I\": parseHour24,\n",
" \"j\": parseDayOfYear,\n",
" \"L\": parseMilliseconds,\n",
" \"m\": parseMonthNumber,\n",
" \"M\": parseMinutes,\n",
" \"p\": parsePeriod,\n",
" \"q\": parseQuarter,\n",
" \"Q\": parseUnixTimestamp,\n",
" \"s\": parseUnixTimestampSeconds,\n",
" \"S\": parseSeconds,\n",
" \"u\": parseWeekdayNumberMonday,\n",
" \"U\": parseWeekNumberSunday,\n",
" \"V\": parseWeekNumberISO,\n",
" \"w\": parseWeekdayNumberSunday,\n",
" \"W\": parseWeekNumberMonday,\n",
" \"x\": parseLocaleDate,\n",
" \"X\": parseLocaleTime,\n",
" \"y\": parseYear,\n",
" \"Y\": parseFullYear,\n",
" \"Z\": parseZone,\n",
" \"%\": parseLiteralPercent\n",
" };\n",
"\n",
" // These recursive directive definitions must be deferred.\n",
" formats.x = newFormat(locale_date, formats);\n",
" formats.X = newFormat(locale_time, formats);\n",
" formats.c = newFormat(locale_dateTime, formats);\n",
" utcFormats.x = newFormat(locale_date, utcFormats);\n",
" utcFormats.X = newFormat(locale_time, utcFormats);\n",
" utcFormats.c = newFormat(locale_dateTime, utcFormats);\n",
"\n",
" function newFormat(specifier, formats) {\n",
" return function(date) {\n",
" var string = [],\n",
" i = -1,\n",
" j = 0,\n",
" n = specifier.length,\n",
" c,\n",
" pad,\n",
" format;\n",
"\n",
" if (!(date instanceof Date)) date = new Date(+date);\n",
"\n",
" while (++i < n) {\n",
" if (specifier.charCodeAt(i) === 37) {\n",
" string.push(specifier.slice(j, i));\n",
" if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n",
" else pad = c === \"e\" ? \" \" : \"0\";\n",
" if (format = formats[c]) c = format(date, pad);\n",
" string.push(c);\n",
" j = i + 1;\n",
" }\n",
" }\n",
"\n",
" string.push(specifier.slice(j, i));\n",
" return string.join(\"\");\n",
" };\n",
" }\n",
"\n",
" function newParse(specifier, Z) {\n",
" return function(string) {\n",
" var d = newDate(1900, undefined, 1),\n",
" i = parseSpecifier(d, specifier, string += \"\", 0),\n",
" week, day;\n",
" if (i != string.length) return null;\n",
"\n",
" // If a UNIX timestamp is specified, return it.\n",
" if (\"Q\" in d) return new Date(d.Q);\n",
" if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n",
"\n",
" // If this is utcParse, never use the local timezone.\n",
" if (Z && !(\"Z\" in d)) d.Z = 0;\n",
"\n",
" // The am-pm flag is 0 for AM, and 1 for PM.\n",
" if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n",
"\n",
" // If the month was not specified, inherit from the quarter.\n",
" if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n",
"\n",
" // Convert day-of-week and week-of-year to day-of-year.\n",
" if (\"V\" in d) {\n",
" if (d.V < 1 || d.V > 53) return null;\n",
" if (!(\"w\" in d)) d.w = 1;\n",
" if (\"Z\" in d) {\n",
" week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n",
" week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week);\n",
" week = d3Time.utcDay.offset(week, (d.V - 1) * 7);\n",
" d.y = week.getUTCFullYear();\n",
" d.m = week.getUTCMonth();\n",
" d.d = week.getUTCDate() + (d.w + 6) % 7;\n",
" } else {\n",
" week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n",
" week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week);\n",
" week = d3Time.timeDay.offset(week, (d.V - 1) * 7);\n",
" d.y = week.getFullYear();\n",
" d.m = week.getMonth();\n",
" d.d = week.getDate() + (d.w + 6) % 7;\n",
" }\n",
" } else if (\"W\" in d || \"U\" in d) {\n",
" if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n",
" day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n",
" d.m = 0;\n",
" d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n",
" }\n",
"\n",
" // If a time zone is specified, all fields are interpreted as UTC and then\n",
" // offset according to the specified time zone.\n",
" if (\"Z\" in d) {\n",
" d.H += d.Z / 100 | 0;\n",
" d.M += d.Z % 100;\n",
" return utcDate(d);\n",
" }\n",
"\n",
" // Otherwise, all fields are in local time.\n",
" return localDate(d);\n",
" };\n",
" }\n",
"\n",
" function parseSpecifier(d, specifier, string, j) {\n",
" var i = 0,\n",
" n = specifier.length,\n",
" m = string.length,\n",
" c,\n",
" parse;\n",
"\n",
" while (i < n) {\n",
" if (j >= m) return -1;\n",
" c = specifier.charCodeAt(i++);\n",
" if (c === 37) {\n",
" c = specifier.charAt(i++);\n",
" parse = parses[c in pads ? specifier.charAt(i++) : c];\n",
" if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n",
" } else if (c != string.charCodeAt(j++)) {\n",
" return -1;\n",
" }\n",
" }\n",
"\n",
" return j;\n",
" }\n",
"\n",
" function parsePeriod(d, string, i) {\n",
" var n = periodRe.exec(string.slice(i));\n",
" return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n",
" }\n",
"\n",
" function parseShortWeekday(d, string, i) {\n",
" var n = shortWeekdayRe.exec(string.slice(i));\n",
" return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n",
" }\n",
"\n",
" function parseWeekday(d, string, i) {\n",
" var n = weekdayRe.exec(string.slice(i));\n",
" return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n",
" }\n",
"\n",
" function parseShortMonth(d, string, i) {\n",
" var n = shortMonthRe.exec(string.slice(i));\n",
" return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n",
" }\n",
"\n",
" function parseMonth(d, string, i) {\n",
" var n = monthRe.exec(string.slice(i));\n",
" return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n",
" }\n",
"\n",
" function parseLocaleDateTime(d, string, i) {\n",
" return parseSpecifier(d, locale_dateTime, string, i);\n",
" }\n",
"\n",
" function parseLocaleDate(d, string, i) {\n",
" return parseSpecifier(d, locale_date, string, i);\n",
" }\n",
"\n",
" function parseLocaleTime(d, string, i) {\n",
" return parseSpecifier(d, locale_time, string, i);\n",
" }\n",
"\n",
" function formatShortWeekday(d) {\n",
" return locale_shortWeekdays[d.getDay()];\n",
" }\n",
"\n",
" function formatWeekday(d) {\n",
" return locale_weekdays[d.getDay()];\n",
" }\n",
"\n",
" function formatShortMonth(d) {\n",
" return locale_shortMonths[d.getMonth()];\n",
" }\n",
"\n",
" function formatMonth(d) {\n",
" return locale_months[d.getMonth()];\n",
" }\n",
"\n",
" function formatPeriod(d) {\n",
" return locale_periods[+(d.getHours() >= 12)];\n",
" }\n",
"\n",
" function formatQuarter(d) {\n",
" return 1 + ~~(d.getMonth() / 3);\n",
" }\n",
"\n",
" function formatUTCShortWeekday(d) {\n",
" return locale_shortWeekdays[d.getUTCDay()];\n",
" }\n",
"\n",
" function formatUTCWeekday(d) {\n",
" return locale_weekdays[d.getUTCDay()];\n",
" }\n",
"\n",
" function formatUTCShortMonth(d) {\n",
" return locale_shortMonths[d.getUTCMonth()];\n",
" }\n",
"\n",
" function formatUTCMonth(d) {\n",
" return locale_months[d.getUTCMonth()];\n",
" }\n",
"\n",
" function formatUTCPeriod(d) {\n",
" return locale_periods[+(d.getUTCHours() >= 12)];\n",
" }\n",
"\n",
" function formatUTCQuarter(d) {\n",
" return 1 + ~~(d.getUTCMonth() / 3);\n",
" }\n",
"\n",
" return {\n",
" format: function(specifier) {\n",
" var f = newFormat(specifier += \"\", formats);\n",
" f.toString = function() { return specifier; };\n",
" return f;\n",
" },\n",
" parse: function(specifier) {\n",
" var p = newParse(specifier += \"\", false);\n",
" p.toString = function() { return specifier; };\n",
" return p;\n",
" },\n",
" utcFormat: function(specifier) {\n",
" var f = newFormat(specifier += \"\", utcFormats);\n",
" f.toString = function() { return specifier; };\n",
" return f;\n",
" },\n",
" utcParse: function(specifier) {\n",
" var p = newParse(specifier += \"\", true);\n",
" p.toString = function() { return specifier; };\n",
" return p;\n",
" }\n",
" };\n",
"}\n",
"\n",
"var pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n",
" numberRe = /^\\s*\\d+/, // note: ignores next directive\n",
" percentRe = /^%/,\n",
" requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n",
"\n",
"function pad(value, fill, width) {\n",
" var sign = value < 0 ? \"-\" : \"\",\n",
" string = (sign ? -value : value) + \"\",\n",
" length = string.length;\n",
" return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n",
"}\n",
"\n",
"function requote(s) {\n",
" return s.replace(requoteRe, \"\\\\$&\");\n",
"}\n",
"\n",
"function formatRe(names) {\n",
" return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n",
"}\n",
"\n",
"function formatLookup(names) {\n",
" var map = {}, i = -1, n = names.length;\n",
" while (++i < n) map[names[i].toLowerCase()] = i;\n",
" return map;\n",
"}\n",
"\n",
"function parseWeekdayNumberSunday(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 1));\n",
" return n ? (d.w = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseWeekdayNumberMonday(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 1));\n",
" return n ? (d.u = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseWeekNumberSunday(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.U = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseWeekNumberISO(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.V = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseWeekNumberMonday(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.W = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseFullYear(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 4));\n",
" return n ? (d.y = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseYear(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseZone(d, string, i) {\n",
" var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n",
" return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseQuarter(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 1));\n",
" return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseMonthNumber(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseDayOfMonth(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.d = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseDayOfYear(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 3));\n",
" return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseHour24(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.H = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseMinutes(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.M = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseSeconds(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 2));\n",
" return n ? (d.S = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseMilliseconds(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 3));\n",
" return n ? (d.L = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseMicroseconds(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i, i + 6));\n",
" return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseLiteralPercent(d, string, i) {\n",
" var n = percentRe.exec(string.slice(i, i + 1));\n",
" return n ? i + n[0].length : -1;\n",
"}\n",
"\n",
"function parseUnixTimestamp(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i));\n",
" return n ? (d.Q = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function parseUnixTimestampSeconds(d, string, i) {\n",
" var n = numberRe.exec(string.slice(i));\n",
" return n ? (d.s = +n[0], i + n[0].length) : -1;\n",
"}\n",
"\n",
"function formatDayOfMonth(d, p) {\n",
" return pad(d.getDate(), p, 2);\n",
"}\n",
"\n",
"function formatHour24(d, p) {\n",
" return pad(d.getHours(), p, 2);\n",
"}\n",
"\n",
"function formatHour12(d, p) {\n",
" return pad(d.getHours() % 12 || 12, p, 2);\n",
"}\n",
"\n",
"function formatDayOfYear(d, p) {\n",
" return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3);\n",
"}\n",
"\n",
"function formatMilliseconds(d, p) {\n",
" return pad(d.getMilliseconds(), p, 3);\n",
"}\n",
"\n",
"function formatMicroseconds(d, p) {\n",
" return formatMilliseconds(d, p) + \"000\";\n",
"}\n",
"\n",
"function formatMonthNumber(d, p) {\n",
" return pad(d.getMonth() + 1, p, 2);\n",
"}\n",
"\n",
"function formatMinutes(d, p) {\n",
" return pad(d.getMinutes(), p, 2);\n",
"}\n",
"\n",
"function formatSeconds(d, p) {\n",
" return pad(d.getSeconds(), p, 2);\n",
"}\n",
"\n",
"function formatWeekdayNumberMonday(d) {\n",
" var day = d.getDay();\n",
" return day === 0 ? 7 : day;\n",
"}\n",
"\n",
"function formatWeekNumberSunday(d, p) {\n",
" return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2);\n",
"}\n",
"\n",
"function formatWeekNumberISO(d, p) {\n",
" var day = d.getDay();\n",
" d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d);\n",
" return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2);\n",
"}\n",
"\n",
"function formatWeekdayNumberSunday(d) {\n",
" return d.getDay();\n",
"}\n",
"\n",
"function formatWeekNumberMonday(d, p) {\n",
" return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2);\n",
"}\n",
"\n",
"function formatYear(d, p) {\n",
" return pad(d.getFullYear() % 100, p, 2);\n",
"}\n",
"\n",
"function formatFullYear(d, p) {\n",
" return pad(d.getFullYear() % 10000, p, 4);\n",
"}\n",
"\n",
"function formatZone(d) {\n",
" var z = d.getTimezoneOffset();\n",
" return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n",
" + pad(z / 60 | 0, \"0\", 2)\n",
" + pad(z % 60, \"0\", 2);\n",
"}\n",
"\n",
"function formatUTCDayOfMonth(d, p) {\n",
" return pad(d.getUTCDate(), p, 2);\n",
"}\n",
"\n",
"function formatUTCHour24(d, p) {\n",
" return pad(d.getUTCHours(), p, 2);\n",
"}\n",
"\n",
"function formatUTCHour12(d, p) {\n",
" return pad(d.getUTCHours() % 12 || 12, p, 2);\n",
"}\n",
"\n",
"function formatUTCDayOfYear(d, p) {\n",
" return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3);\n",
"}\n",
"\n",
"function formatUTCMilliseconds(d, p) {\n",
" return pad(d.getUTCMilliseconds(), p, 3);\n",
"}\n",
"\n",
"function formatUTCMicroseconds(d, p) {\n",
" return formatUTCMilliseconds(d, p) + \"000\";\n",
"}\n",
"\n",
"function formatUTCMonthNumber(d, p) {\n",
" return pad(d.getUTCMonth() + 1, p, 2);\n",
"}\n",
"\n",
"function formatUTCMinutes(d, p) {\n",
" return pad(d.getUTCMinutes(), p, 2);\n",
"}\n",
"\n",
"function formatUTCSeconds(d, p) {\n",
" return pad(d.getUTCSeconds(), p, 2);\n",
"}\n",
"\n",
"function formatUTCWeekdayNumberMonday(d) {\n",
" var dow = d.getUTCDay();\n",
" return dow === 0 ? 7 : dow;\n",
"}\n",
"\n",
"function formatUTCWeekNumberSunday(d, p) {\n",
" return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2);\n",
"}\n",
"\n",
"function formatUTCWeekNumberISO(d, p) {\n",
" var day = d.getUTCDay();\n",
" d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d);\n",
" return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2);\n",
"}\n",
"\n",
"function formatUTCWeekdayNumberSunday(d) {\n",
" return d.getUTCDay();\n",
"}\n",
"\n",
"function formatUTCWeekNumberMonday(d, p) {\n",
" return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2);\n",
"}\n",
"\n",
"function formatUTCYear(d, p) {\n",
" return pad(d.getUTCFullYear() % 100, p, 2);\n",
"}\n",
"\n",
"function formatUTCFullYear(d, p) {\n",
" return pad(d.getUTCFullYear() % 10000, p, 4);\n",
"}\n",
"\n",
"function formatUTCZone() {\n",
" return \"+0000\";\n",
"}\n",
"\n",
"function formatLiteralPercent() {\n",
" return \"%\";\n",
"}\n",
"\n",
"function formatUnixTimestamp(d) {\n",
" return +d;\n",
"}\n",
"\n",
"function formatUnixTimestampSeconds(d) {\n",
" return Math.floor(+d / 1000);\n",
"}\n",
"\n",
"var locale;\n",
"\n",
"defaultLocale({\n",
" dateTime: \"%x, %X\",\n",
" date: \"%-m/%-d/%Y\",\n",
" time: \"%-I:%M:%S %p\",\n",
" periods: [\"AM\", \"PM\"],\n",
" days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n",
" shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n",
" months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n",
" shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n",
"});\n",
"\n",
"function defaultLocale(definition) {\n",
" locale = formatLocale(definition);\n",
" exports.timeFormat = locale.format;\n",
" exports.timeParse = locale.parse;\n",
" exports.utcFormat = locale.utcFormat;\n",
" exports.utcParse = locale.utcParse;\n",
" return locale;\n",
"}\n",
"\n",
"var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n",
"\n",
"function formatIsoNative(date) {\n",
" return date.toISOString();\n",
"}\n",
"\n",
"var formatIso = Date.prototype.toISOString\n",
" ? formatIsoNative\n",
" : exports.utcFormat(isoSpecifier);\n",
"\n",
"function parseIsoNative(string) {\n",
" var date = new Date(string);\n",
" return isNaN(date) ? null : date;\n",
"}\n",
"\n",
"var parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n",
" ? parseIsoNative\n",
" : exports.utcParse(isoSpecifier);\n",
"\n",
"exports.isoFormat = formatIso;\n",
"exports.isoParse = parseIso;\n",
"exports.timeFormatDefaultLocale = defaultLocale;\n",
"exports.timeFormatLocale = formatLocale;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{\"d3-time\":14}],14:[function(require,module,exports){\n",
"// https://d3js.org/d3-time/ v1.1.0 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"var t0 = new Date,\n",
" t1 = new Date;\n",
"\n",
"function newInterval(floori, offseti, count, field) {\n",
"\n",
" function interval(date) {\n",
" return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n",
" }\n",
"\n",
" interval.floor = function(date) {\n",
" return floori(date = new Date(+date)), date;\n",
" };\n",
"\n",
" interval.ceil = function(date) {\n",
" return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n",
" };\n",
"\n",
" interval.round = function(date) {\n",
" var d0 = interval(date),\n",
" d1 = interval.ceil(date);\n",
" return date - d0 < d1 - date ? d0 : d1;\n",
" };\n",
"\n",
" interval.offset = function(date, step) {\n",
" return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n",
" };\n",
"\n",
" interval.range = function(start, stop, step) {\n",
" var range = [], previous;\n",
" start = interval.ceil(start);\n",
" step = step == null ? 1 : Math.floor(step);\n",
" if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n",
" do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n",
" while (previous < start && start < stop);\n",
" return range;\n",
" };\n",
"\n",
" interval.filter = function(test) {\n",
" return newInterval(function(date) {\n",
" if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n",
" }, function(date, step) {\n",
" if (date >= date) {\n",
" if (step < 0) while (++step <= 0) {\n",
" while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n",
" } else while (--step >= 0) {\n",
" while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n",
" }\n",
" }\n",
" });\n",
" };\n",
"\n",
" if (count) {\n",
" interval.count = function(start, end) {\n",
" t0.setTime(+start), t1.setTime(+end);\n",
" floori(t0), floori(t1);\n",
" return Math.floor(count(t0, t1));\n",
" };\n",
"\n",
" interval.every = function(step) {\n",
" step = Math.floor(step);\n",
" return !isFinite(step) || !(step > 0) ? null\n",
" : !(step > 1) ? interval\n",
" : interval.filter(field\n",
" ? function(d) { return field(d) % step === 0; }\n",
" : function(d) { return interval.count(0, d) % step === 0; });\n",
" };\n",
" }\n",
"\n",
" return interval;\n",
"}\n",
"\n",
"var millisecond = newInterval(function() {\n",
" // noop\n",
"}, function(date, step) {\n",
" date.setTime(+date + step);\n",
"}, function(start, end) {\n",
" return end - start;\n",
"});\n",
"\n",
"// An optimized implementation for this simple case.\n",
"millisecond.every = function(k) {\n",
" k = Math.floor(k);\n",
" if (!isFinite(k) || !(k > 0)) return null;\n",
" if (!(k > 1)) return millisecond;\n",
" return newInterval(function(date) {\n",
" date.setTime(Math.floor(date / k) * k);\n",
" }, function(date, step) {\n",
" date.setTime(+date + step * k);\n",
" }, function(start, end) {\n",
" return (end - start) / k;\n",
" });\n",
"};\n",
"var milliseconds = millisecond.range;\n",
"\n",
"var durationSecond = 1e3;\n",
"var durationMinute = 6e4;\n",
"var durationHour = 36e5;\n",
"var durationDay = 864e5;\n",
"var durationWeek = 6048e5;\n",
"\n",
"var second = newInterval(function(date) {\n",
" date.setTime(date - date.getMilliseconds());\n",
"}, function(date, step) {\n",
" date.setTime(+date + step * durationSecond);\n",
"}, function(start, end) {\n",
" return (end - start) / durationSecond;\n",
"}, function(date) {\n",
" return date.getUTCSeconds();\n",
"});\n",
"var seconds = second.range;\n",
"\n",
"var minute = newInterval(function(date) {\n",
" date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n",
"}, function(date, step) {\n",
" date.setTime(+date + step * durationMinute);\n",
"}, function(start, end) {\n",
" return (end - start) / durationMinute;\n",
"}, function(date) {\n",
" return date.getMinutes();\n",
"});\n",
"var minutes = minute.range;\n",
"\n",
"var hour = newInterval(function(date) {\n",
" date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n",
"}, function(date, step) {\n",
" date.setTime(+date + step * durationHour);\n",
"}, function(start, end) {\n",
" return (end - start) / durationHour;\n",
"}, function(date) {\n",
" return date.getHours();\n",
"});\n",
"var hours = hour.range;\n",
"\n",
"var day = newInterval(function(date) {\n",
" date.setHours(0, 0, 0, 0);\n",
"}, function(date, step) {\n",
" date.setDate(date.getDate() + step);\n",
"}, function(start, end) {\n",
" return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n",
"}, function(date) {\n",
" return date.getDate() - 1;\n",
"});\n",
"var days = day.range;\n",
"\n",
"function weekday(i) {\n",
" return newInterval(function(date) {\n",
" date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n",
" date.setHours(0, 0, 0, 0);\n",
" }, function(date, step) {\n",
" date.setDate(date.getDate() + step * 7);\n",
" }, function(start, end) {\n",
" return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n",
" });\n",
"}\n",
"\n",
"var sunday = weekday(0);\n",
"var monday = weekday(1);\n",
"var tuesday = weekday(2);\n",
"var wednesday = weekday(3);\n",
"var thursday = weekday(4);\n",
"var friday = weekday(5);\n",
"var saturday = weekday(6);\n",
"\n",
"var sundays = sunday.range;\n",
"var mondays = monday.range;\n",
"var tuesdays = tuesday.range;\n",
"var wednesdays = wednesday.range;\n",
"var thursdays = thursday.range;\n",
"var fridays = friday.range;\n",
"var saturdays = saturday.range;\n",
"\n",
"var month = newInterval(function(date) {\n",
" date.setDate(1);\n",
" date.setHours(0, 0, 0, 0);\n",
"}, function(date, step) {\n",
" date.setMonth(date.getMonth() + step);\n",
"}, function(start, end) {\n",
" return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n",
"}, function(date) {\n",
" return date.getMonth();\n",
"});\n",
"var months = month.range;\n",
"\n",
"var year = newInterval(function(date) {\n",
" date.setMonth(0, 1);\n",
" date.setHours(0, 0, 0, 0);\n",
"}, function(date, step) {\n",
" date.setFullYear(date.getFullYear() + step);\n",
"}, function(start, end) {\n",
" return end.getFullYear() - start.getFullYear();\n",
"}, function(date) {\n",
" return date.getFullYear();\n",
"});\n",
"\n",
"// An optimized implementation for this simple case.\n",
"year.every = function(k) {\n",
" return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n",
" date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n",
" date.setMonth(0, 1);\n",
" date.setHours(0, 0, 0, 0);\n",
" }, function(date, step) {\n",
" date.setFullYear(date.getFullYear() + step * k);\n",
" });\n",
"};\n",
"var years = year.range;\n",
"\n",
"var utcMinute = newInterval(function(date) {\n",
" date.setUTCSeconds(0, 0);\n",
"}, function(date, step) {\n",
" date.setTime(+date + step * durationMinute);\n",
"}, function(start, end) {\n",
" return (end - start) / durationMinute;\n",
"}, function(date) {\n",
" return date.getUTCMinutes();\n",
"});\n",
"var utcMinutes = utcMinute.range;\n",
"\n",
"var utcHour = newInterval(function(date) {\n",
" date.setUTCMinutes(0, 0, 0);\n",
"}, function(date, step) {\n",
" date.setTime(+date + step * durationHour);\n",
"}, function(start, end) {\n",
" return (end - start) / durationHour;\n",
"}, function(date) {\n",
" return date.getUTCHours();\n",
"});\n",
"var utcHours = utcHour.range;\n",
"\n",
"var utcDay = newInterval(function(date) {\n",
" date.setUTCHours(0, 0, 0, 0);\n",
"}, function(date, step) {\n",
" date.setUTCDate(date.getUTCDate() + step);\n",
"}, function(start, end) {\n",
" return (end - start) / durationDay;\n",
"}, function(date) {\n",
" return date.getUTCDate() - 1;\n",
"});\n",
"var utcDays = utcDay.range;\n",
"\n",
"function utcWeekday(i) {\n",
" return newInterval(function(date) {\n",
" date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n",
" date.setUTCHours(0, 0, 0, 0);\n",
" }, function(date, step) {\n",
" date.setUTCDate(date.getUTCDate() + step * 7);\n",
" }, function(start, end) {\n",
" return (end - start) / durationWeek;\n",
" });\n",
"}\n",
"\n",
"var utcSunday = utcWeekday(0);\n",
"var utcMonday = utcWeekday(1);\n",
"var utcTuesday = utcWeekday(2);\n",
"var utcWednesday = utcWeekday(3);\n",
"var utcThursday = utcWeekday(4);\n",
"var utcFriday = utcWeekday(5);\n",
"var utcSaturday = utcWeekday(6);\n",
"\n",
"var utcSundays = utcSunday.range;\n",
"var utcMondays = utcMonday.range;\n",
"var utcTuesdays = utcTuesday.range;\n",
"var utcWednesdays = utcWednesday.range;\n",
"var utcThursdays = utcThursday.range;\n",
"var utcFridays = utcFriday.range;\n",
"var utcSaturdays = utcSaturday.range;\n",
"\n",
"var utcMonth = newInterval(function(date) {\n",
" date.setUTCDate(1);\n",
" date.setUTCHours(0, 0, 0, 0);\n",
"}, function(date, step) {\n",
" date.setUTCMonth(date.getUTCMonth() + step);\n",
"}, function(start, end) {\n",
" return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n",
"}, function(date) {\n",
" return date.getUTCMonth();\n",
"});\n",
"var utcMonths = utcMonth.range;\n",
"\n",
"var utcYear = newInterval(function(date) {\n",
" date.setUTCMonth(0, 1);\n",
" date.setUTCHours(0, 0, 0, 0);\n",
"}, function(date, step) {\n",
" date.setUTCFullYear(date.getUTCFullYear() + step);\n",
"}, function(start, end) {\n",
" return end.getUTCFullYear() - start.getUTCFullYear();\n",
"}, function(date) {\n",
" return date.getUTCFullYear();\n",
"});\n",
"\n",
"// An optimized implementation for this simple case.\n",
"utcYear.every = function(k) {\n",
" return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n",
" date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n",
" date.setUTCMonth(0, 1);\n",
" date.setUTCHours(0, 0, 0, 0);\n",
" }, function(date, step) {\n",
" date.setUTCFullYear(date.getUTCFullYear() + step * k);\n",
" });\n",
"};\n",
"var utcYears = utcYear.range;\n",
"\n",
"exports.timeDay = day;\n",
"exports.timeDays = days;\n",
"exports.timeFriday = friday;\n",
"exports.timeFridays = fridays;\n",
"exports.timeHour = hour;\n",
"exports.timeHours = hours;\n",
"exports.timeInterval = newInterval;\n",
"exports.timeMillisecond = millisecond;\n",
"exports.timeMilliseconds = milliseconds;\n",
"exports.timeMinute = minute;\n",
"exports.timeMinutes = minutes;\n",
"exports.timeMonday = monday;\n",
"exports.timeMondays = mondays;\n",
"exports.timeMonth = month;\n",
"exports.timeMonths = months;\n",
"exports.timeSaturday = saturday;\n",
"exports.timeSaturdays = saturdays;\n",
"exports.timeSecond = second;\n",
"exports.timeSeconds = seconds;\n",
"exports.timeSunday = sunday;\n",
"exports.timeSundays = sundays;\n",
"exports.timeThursday = thursday;\n",
"exports.timeThursdays = thursdays;\n",
"exports.timeTuesday = tuesday;\n",
"exports.timeTuesdays = tuesdays;\n",
"exports.timeWednesday = wednesday;\n",
"exports.timeWednesdays = wednesdays;\n",
"exports.timeWeek = sunday;\n",
"exports.timeWeeks = sundays;\n",
"exports.timeYear = year;\n",
"exports.timeYears = years;\n",
"exports.utcDay = utcDay;\n",
"exports.utcDays = utcDays;\n",
"exports.utcFriday = utcFriday;\n",
"exports.utcFridays = utcFridays;\n",
"exports.utcHour = utcHour;\n",
"exports.utcHours = utcHours;\n",
"exports.utcMillisecond = millisecond;\n",
"exports.utcMilliseconds = milliseconds;\n",
"exports.utcMinute = utcMinute;\n",
"exports.utcMinutes = utcMinutes;\n",
"exports.utcMonday = utcMonday;\n",
"exports.utcMondays = utcMondays;\n",
"exports.utcMonth = utcMonth;\n",
"exports.utcMonths = utcMonths;\n",
"exports.utcSaturday = utcSaturday;\n",
"exports.utcSaturdays = utcSaturdays;\n",
"exports.utcSecond = second;\n",
"exports.utcSeconds = seconds;\n",
"exports.utcSunday = utcSunday;\n",
"exports.utcSundays = utcSundays;\n",
"exports.utcThursday = utcThursday;\n",
"exports.utcThursdays = utcThursdays;\n",
"exports.utcTuesday = utcTuesday;\n",
"exports.utcTuesdays = utcTuesdays;\n",
"exports.utcWednesday = utcWednesday;\n",
"exports.utcWednesdays = utcWednesdays;\n",
"exports.utcWeek = utcSunday;\n",
"exports.utcWeeks = utcSundays;\n",
"exports.utcYear = utcYear;\n",
"exports.utcYears = utcYears;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],15:[function(require,module,exports){\n",
"// https://d3js.org/d3-timer/ v1.0.10 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n",
"typeof define === 'function' && define.amd ? define(['exports'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}));\n",
"}(this, function (exports) { 'use strict';\n",
"\n",
"var frame = 0, // is an animation frame pending?\n",
" timeout = 0, // is a timeout pending?\n",
" interval = 0, // are any timers active?\n",
" pokeDelay = 1000, // how frequently we check for clock skew\n",
" taskHead,\n",
" taskTail,\n",
" clockLast = 0,\n",
" clockNow = 0,\n",
" clockSkew = 0,\n",
" clock = typeof performance === \"object\" && performance.now ? performance : Date,\n",
" setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n",
"\n",
"function now() {\n",
" return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n",
"}\n",
"\n",
"function clearNow() {\n",
" clockNow = 0;\n",
"}\n",
"\n",
"function Timer() {\n",
" this._call =\n",
" this._time =\n",
" this._next = null;\n",
"}\n",
"\n",
"Timer.prototype = timer.prototype = {\n",
" constructor: Timer,\n",
" restart: function(callback, delay, time) {\n",
" if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n",
" time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n",
" if (!this._next && taskTail !== this) {\n",
" if (taskTail) taskTail._next = this;\n",
" else taskHead = this;\n",
" taskTail = this;\n",
" }\n",
" this._call = callback;\n",
" this._time = time;\n",
" sleep();\n",
" },\n",
" stop: function() {\n",
" if (this._call) {\n",
" this._call = null;\n",
" this._time = Infinity;\n",
" sleep();\n",
" }\n",
" }\n",
"};\n",
"\n",
"function timer(callback, delay, time) {\n",
" var t = new Timer;\n",
" t.restart(callback, delay, time);\n",
" return t;\n",
"}\n",
"\n",
"function timerFlush() {\n",
" now(); // Get the current time, if not already set.\n",
" ++frame; // Pretend we've set an alarm, if we haven't already.\n",
" var t = taskHead, e;\n",
" while (t) {\n",
" if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n",
" t = t._next;\n",
" }\n",
" --frame;\n",
"}\n",
"\n",
"function wake() {\n",
" clockNow = (clockLast = clock.now()) + clockSkew;\n",
" frame = timeout = 0;\n",
" try {\n",
" timerFlush();\n",
" } finally {\n",
" frame = 0;\n",
" nap();\n",
" clockNow = 0;\n",
" }\n",
"}\n",
"\n",
"function poke() {\n",
" var now = clock.now(), delay = now - clockLast;\n",
" if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n",
"}\n",
"\n",
"function nap() {\n",
" var t0, t1 = taskHead, t2, time = Infinity;\n",
" while (t1) {\n",
" if (t1._call) {\n",
" if (time > t1._time) time = t1._time;\n",
" t0 = t1, t1 = t1._next;\n",
" } else {\n",
" t2 = t1._next, t1._next = null;\n",
" t1 = t0 ? t0._next = t2 : taskHead = t2;\n",
" }\n",
" }\n",
" taskTail = t0;\n",
" sleep(time);\n",
"}\n",
"\n",
"function sleep(time) {\n",
" if (frame) return; // Soonest alarm already set, or will be.\n",
" if (timeout) timeout = clearTimeout(timeout);\n",
" var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n",
" if (delay > 24) {\n",
" if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n",
" if (interval) interval = clearInterval(interval);\n",
" } else {\n",
" if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n",
" frame = 1, setFrame(wake);\n",
" }\n",
"}\n",
"\n",
"function timeout$1(callback, delay, time) {\n",
" var t = new Timer;\n",
" delay = delay == null ? 0 : +delay;\n",
" t.restart(function(elapsed) {\n",
" t.stop();\n",
" callback(elapsed + delay);\n",
" }, delay, time);\n",
" return t;\n",
"}\n",
"\n",
"function interval$1(callback, delay, time) {\n",
" var t = new Timer, total = delay;\n",
" if (delay == null) return t.restart(callback, delay, time), t;\n",
" delay = +delay, time = time == null ? now() : +time;\n",
" t.restart(function tick(elapsed) {\n",
" elapsed += total;\n",
" t.restart(tick, total += delay, time);\n",
" callback(elapsed);\n",
" }, delay, time);\n",
" return t;\n",
"}\n",
"\n",
"exports.interval = interval$1;\n",
"exports.now = now;\n",
"exports.timeout = timeout$1;\n",
"exports.timer = timer;\n",
"exports.timerFlush = timerFlush;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{}],16:[function(require,module,exports){\n",
"// https://d3js.org/d3-transition/ v1.3.2 Copyright 2019 Mike Bostock\n",
"(function (global, factory) {\n",
"typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) :\n",
"typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) :\n",
"(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3));\n",
"}(this, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { 'use strict';\n",
"\n",
"var emptyOn = d3Dispatch.dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\n",
"var emptyTween = [];\n",
"\n",
"var CREATED = 0;\n",
"var SCHEDULED = 1;\n",
"var STARTING = 2;\n",
"var STARTED = 3;\n",
"var RUNNING = 4;\n",
"var ENDING = 5;\n",
"var ENDED = 6;\n",
"\n",
"function schedule(node, name, id, index, group, timing) {\n",
" var schedules = node.__transition;\n",
" if (!schedules) node.__transition = {};\n",
" else if (id in schedules) return;\n",
" create(node, id, {\n",
" name: name,\n",
" index: index, // For context during callback.\n",
" group: group, // For context during callback.\n",
" on: emptyOn,\n",
" tween: emptyTween,\n",
" time: timing.time,\n",
" delay: timing.delay,\n",
" duration: timing.duration,\n",
" ease: timing.ease,\n",
" timer: null,\n",
" state: CREATED\n",
" });\n",
"}\n",
"\n",
"function init(node, id) {\n",
" var schedule = get(node, id);\n",
" if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n",
" return schedule;\n",
"}\n",
"\n",
"function set(node, id) {\n",
" var schedule = get(node, id);\n",
" if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n",
" return schedule;\n",
"}\n",
"\n",
"function get(node, id) {\n",
" var schedule = node.__transition;\n",
" if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n",
" return schedule;\n",
"}\n",
"\n",
"function create(node, id, self) {\n",
" var schedules = node.__transition,\n",
" tween;\n",
"\n",
" // Initialize the self timer when the transition is created.\n",
" // Note the actual delay is not known until the first callback!\n",
" schedules[id] = self;\n",
" self.timer = d3Timer.timer(schedule, 0, self.time);\n",
"\n",
" function schedule(elapsed) {\n",
" self.state = SCHEDULED;\n",
" self.timer.restart(start, self.delay, self.time);\n",
"\n",
" // If the elapsed delay is less than our first sleep, start immediately.\n",
" if (self.delay <= elapsed) start(elapsed - self.delay);\n",
" }\n",
"\n",
" function start(elapsed) {\n",
" var i, j, n, o;\n",
"\n",
" // If the state is not SCHEDULED, then we previously errored on start.\n",
" if (self.state !== SCHEDULED) return stop();\n",
"\n",
" for (i in schedules) {\n",
" o = schedules[i];\n",
" if (o.name !== self.name) continue;\n",
"\n",
" // While this element already has a starting transition during this frame,\n",
" // defer starting an interrupting transition until that transition has a\n",
" // chance to tick (and possibly end); see d3/d3-transition#54!\n",
" if (o.state === STARTED) return d3Timer.timeout(start);\n",
"\n",
" // Interrupt the active transition, if any.\n",
" if (o.state === RUNNING) {\n",
" o.state = ENDED;\n",
" o.timer.stop();\n",
" o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n",
" delete schedules[i];\n",
" }\n",
"\n",
" // Cancel any pre-empted transitions.\n",
" else if (+i < id) {\n",
" o.state = ENDED;\n",
" o.timer.stop();\n",
" o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n",
" delete schedules[i];\n",
" }\n",
" }\n",
"\n",
" // Defer the first tick to end of the current frame; see d3/d3#1576.\n",
" // Note the transition may be canceled after start and before the first tick!\n",
" // Note this must be scheduled before the start event; see d3/d3-transition#16!\n",
" // Assuming this is successful, subsequent callbacks go straight to tick.\n",
" d3Timer.timeout(function() {\n",
" if (self.state === STARTED) {\n",
" self.state = RUNNING;\n",
" self.timer.restart(tick, self.delay, self.time);\n",
" tick(elapsed);\n",
" }\n",
" });\n",
"\n",
" // Dispatch the start event.\n",
" // Note this must be done before the tween are initialized.\n",
" self.state = STARTING;\n",
" self.on.call(\"start\", node, node.__data__, self.index, self.group);\n",
" if (self.state !== STARTING) return; // interrupted\n",
" self.state = STARTED;\n",
"\n",
" // Initialize the tween, deleting null tween.\n",
" tween = new Array(n = self.tween.length);\n",
" for (i = 0, j = -1; i < n; ++i) {\n",
" if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n",
" tween[++j] = o;\n",
" }\n",
" }\n",
" tween.length = j + 1;\n",
" }\n",
"\n",
" function tick(elapsed) {\n",
" var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n",
" i = -1,\n",
" n = tween.length;\n",
"\n",
" while (++i < n) {\n",
" tween[i].call(node, t);\n",
" }\n",
"\n",
" // Dispatch the end event.\n",
" if (self.state === ENDING) {\n",
" self.on.call(\"end\", node, node.__data__, self.index, self.group);\n",
" stop();\n",
" }\n",
" }\n",
"\n",
" function stop() {\n",
" self.state = ENDED;\n",
" self.timer.stop();\n",
" delete schedules[id];\n",
" for (var i in schedules) return; // eslint-disable-line no-unused-vars\n",
" delete node.__transition;\n",
" }\n",
"}\n",
"\n",
"function interrupt(node, name) {\n",
" var schedules = node.__transition,\n",
" schedule,\n",
" active,\n",
" empty = true,\n",
" i;\n",
"\n",
" if (!schedules) return;\n",
"\n",
" name = name == null ? null : name + \"\";\n",
"\n",
" for (i in schedules) {\n",
" if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n",
" active = schedule.state > STARTING && schedule.state < ENDING;\n",
" schedule.state = ENDED;\n",
" schedule.timer.stop();\n",
" schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n",
" delete schedules[i];\n",
" }\n",
"\n",
" if (empty) delete node.__transition;\n",
"}\n",
"\n",
"function selection_interrupt(name) {\n",
" return this.each(function() {\n",
" interrupt(this, name);\n",
" });\n",
"}\n",
"\n",
"function tweenRemove(id, name) {\n",
" var tween0, tween1;\n",
" return function() {\n",
" var schedule = set(this, id),\n",
" tween = schedule.tween;\n",
"\n",
" // If this node shared tween with the previous node,\n",
" // just assign the updated shared tween and we're done!\n",
" // Otherwise, copy-on-write.\n",
" if (tween !== tween0) {\n",
" tween1 = tween0 = tween;\n",
" for (var i = 0, n = tween1.length; i < n; ++i) {\n",
" if (tween1[i].name === name) {\n",
" tween1 = tween1.slice();\n",
" tween1.splice(i, 1);\n",
" break;\n",
" }\n",
" }\n",
" }\n",
"\n",
" schedule.tween = tween1;\n",
" };\n",
"}\n",
"\n",
"function tweenFunction(id, name, value) {\n",
" var tween0, tween1;\n",
" if (typeof value !== \"function\") throw new Error;\n",
" return function() {\n",
" var schedule = set(this, id),\n",
" tween = schedule.tween;\n",
"\n",
" // If this node shared tween with the previous node,\n",
" // just assign the updated shared tween and we're done!\n",
" // Otherwise, copy-on-write.\n",
" if (tween !== tween0) {\n",
" tween1 = (tween0 = tween).slice();\n",
" for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n",
" if (tween1[i].name === name) {\n",
" tween1[i] = t;\n",
" break;\n",
" }\n",
" }\n",
" if (i === n) tween1.push(t);\n",
" }\n",
"\n",
" schedule.tween = tween1;\n",
" };\n",
"}\n",
"\n",
"function transition_tween(name, value) {\n",
" var id = this._id;\n",
"\n",
" name += \"\";\n",
"\n",
" if (arguments.length < 2) {\n",
" var tween = get(this.node(), id).tween;\n",
" for (var i = 0, n = tween.length, t; i < n; ++i) {\n",
" if ((t = tween[i]).name === name) {\n",
" return t.value;\n",
" }\n",
" }\n",
" return null;\n",
" }\n",
"\n",
" return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n",
"}\n",
"\n",
"function tweenValue(transition, name, value) {\n",
" var id = transition._id;\n",
"\n",
" transition.each(function() {\n",
" var schedule = set(this, id);\n",
" (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n",
" });\n",
"\n",
" return function(node) {\n",
" return get(node, id).value[name];\n",
" };\n",
"}\n",
"\n",
"function interpolate(a, b) {\n",
" var c;\n",
" return (typeof b === \"number\" ? d3Interpolate.interpolateNumber\n",
" : b instanceof d3Color.color ? d3Interpolate.interpolateRgb\n",
" : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb)\n",
" : d3Interpolate.interpolateString)(a, b);\n",
"}\n",
"\n",
"function attrRemove(name) {\n",
" return function() {\n",
" this.removeAttribute(name);\n",
" };\n",
"}\n",
"\n",
"function attrRemoveNS(fullname) {\n",
" return function() {\n",
" this.removeAttributeNS(fullname.space, fullname.local);\n",
" };\n",
"}\n",
"\n",
"function attrConstant(name, interpolate, value1) {\n",
" var string00,\n",
" string1 = value1 + \"\",\n",
" interpolate0;\n",
" return function() {\n",
" var string0 = this.getAttribute(name);\n",
" return string0 === string1 ? null\n",
" : string0 === string00 ? interpolate0\n",
" : interpolate0 = interpolate(string00 = string0, value1);\n",
" };\n",
"}\n",
"\n",
"function attrConstantNS(fullname, interpolate, value1) {\n",
" var string00,\n",
" string1 = value1 + \"\",\n",
" interpolate0;\n",
" return function() {\n",
" var string0 = this.getAttributeNS(fullname.space, fullname.local);\n",
" return string0 === string1 ? null\n",
" : string0 === string00 ? interpolate0\n",
" : interpolate0 = interpolate(string00 = string0, value1);\n",
" };\n",
"}\n",
"\n",
"function attrFunction(name, interpolate, value) {\n",
" var string00,\n",
" string10,\n",
" interpolate0;\n",
" return function() {\n",
" var string0, value1 = value(this), string1;\n",
" if (value1 == null) return void this.removeAttribute(name);\n",
" string0 = this.getAttribute(name);\n",
" string1 = value1 + \"\";\n",
" return string0 === string1 ? null\n",
" : string0 === string00 && string1 === string10 ? interpolate0\n",
" : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n",
" };\n",
"}\n",
"\n",
"function attrFunctionNS(fullname, interpolate, value) {\n",
" var string00,\n",
" string10,\n",
" interpolate0;\n",
" return function() {\n",
" var string0, value1 = value(this), string1;\n",
" if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n",
" string0 = this.getAttributeNS(fullname.space, fullname.local);\n",
" string1 = value1 + \"\";\n",
" return string0 === string1 ? null\n",
" : string0 === string00 && string1 === string10 ? interpolate0\n",
" : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n",
" };\n",
"}\n",
"\n",
"function transition_attr(name, value) {\n",
" var fullname = d3Selection.namespace(name), i = fullname === \"transform\" ? d3Interpolate.interpolateTransformSvg : interpolate;\n",
" return this.attrTween(name, typeof value === \"function\"\n",
" ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n",
" : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n",
" : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n",
"}\n",
"\n",
"function attrInterpolate(name, i) {\n",
" return function(t) {\n",
" this.setAttribute(name, i.call(this, t));\n",
" };\n",
"}\n",
"\n",
"function attrInterpolateNS(fullname, i) {\n",
" return function(t) {\n",
" this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n",
" };\n",
"}\n",
"\n",
"function attrTweenNS(fullname, value) {\n",
" var t0, i0;\n",
" function tween() {\n",
" var i = value.apply(this, arguments);\n",
" if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n",
" return t0;\n",
" }\n",
" tween._value = value;\n",
" return tween;\n",
"}\n",
"\n",
"function attrTween(name, value) {\n",
" var t0, i0;\n",
" function tween() {\n",
" var i = value.apply(this, arguments);\n",
" if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n",
" return t0;\n",
" }\n",
" tween._value = value;\n",
" return tween;\n",
"}\n",
"\n",
"function transition_attrTween(name, value) {\n",
" var key = \"attr.\" + name;\n",
" if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n",
" if (value == null) return this.tween(key, null);\n",
" if (typeof value !== \"function\") throw new Error;\n",
" var fullname = d3Selection.namespace(name);\n",
" return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n",
"}\n",
"\n",
"function delayFunction(id, value) {\n",
" return function() {\n",
" init(this, id).delay = +value.apply(this, arguments);\n",
" };\n",
"}\n",
"\n",
"function delayConstant(id, value) {\n",
" return value = +value, function() {\n",
" init(this, id).delay = value;\n",
" };\n",
"}\n",
"\n",
"function transition_delay(value) {\n",
" var id = this._id;\n",
"\n",
" return arguments.length\n",
" ? this.each((typeof value === \"function\"\n",
" ? delayFunction\n",
" : delayConstant)(id, value))\n",
" : get(this.node(), id).delay;\n",
"}\n",
"\n",
"function durationFunction(id, value) {\n",
" return function() {\n",
" set(this, id).duration = +value.apply(this, arguments);\n",
" };\n",
"}\n",
"\n",
"function durationConstant(id, value) {\n",
" return value = +value, function() {\n",
" set(this, id).duration = value;\n",
" };\n",
"}\n",
"\n",
"function transition_duration(value) {\n",
" var id = this._id;\n",
"\n",
" return arguments.length\n",
" ? this.each((typeof value === \"function\"\n",
" ? durationFunction\n",
" : durationConstant)(id, value))\n",
" : get(this.node(), id).duration;\n",
"}\n",
"\n",
"function easeConstant(id, value) {\n",
" if (typeof value !== \"function\") throw new Error;\n",
" return function() {\n",
" set(this, id).ease = value;\n",
" };\n",
"}\n",
"\n",
"function transition_ease(value) {\n",
" var id = this._id;\n",
"\n",
" return arguments.length\n",
" ? this.each(easeConstant(id, value))\n",
" : get(this.node(), id).ease;\n",
"}\n",
"\n",
"function transition_filter(match) {\n",
" if (typeof match !== \"function\") match = d3Selection.matcher(match);\n",
"\n",
" for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n",
" if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n",
" subgroup.push(node);\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Transition(subgroups, this._parents, this._name, this._id);\n",
"}\n",
"\n",
"function transition_merge(transition) {\n",
" if (transition._id !== this._id) throw new Error;\n",
"\n",
" for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n",
" for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n",
" if (node = group0[i] || group1[i]) {\n",
" merge[i] = node;\n",
" }\n",
" }\n",
" }\n",
"\n",
" for (; j < m0; ++j) {\n",
" merges[j] = groups0[j];\n",
" }\n",
"\n",
" return new Transition(merges, this._parents, this._name, this._id);\n",
"}\n",
"\n",
"function start(name) {\n",
" return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n",
" var i = t.indexOf(\".\");\n",
" if (i >= 0) t = t.slice(0, i);\n",
" return !t || t === \"start\";\n",
" });\n",
"}\n",
"\n",
"function onFunction(id, name, listener) {\n",
" var on0, on1, sit = start(name) ? init : set;\n",
" return function() {\n",
" var schedule = sit(this, id),\n",
" on = schedule.on;\n",
"\n",
" // If this node shared a dispatch with the previous node,\n",
" // just assign the updated shared dispatch and we're done!\n",
" // Otherwise, copy-on-write.\n",
" if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n",
"\n",
" schedule.on = on1;\n",
" };\n",
"}\n",
"\n",
"function transition_on(name, listener) {\n",
" var id = this._id;\n",
"\n",
" return arguments.length < 2\n",
" ? get(this.node(), id).on.on(name)\n",
" : this.each(onFunction(id, name, listener));\n",
"}\n",
"\n",
"function removeFunction(id) {\n",
" return function() {\n",
" var parent = this.parentNode;\n",
" for (var i in this.__transition) if (+i !== id) return;\n",
" if (parent) parent.removeChild(this);\n",
" };\n",
"}\n",
"\n",
"function transition_remove() {\n",
" return this.on(\"end.remove\", removeFunction(this._id));\n",
"}\n",
"\n",
"function transition_select(select) {\n",
" var name = this._name,\n",
" id = this._id;\n",
"\n",
" if (typeof select !== \"function\") select = d3Selection.selector(select);\n",
"\n",
" for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n",
" if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n",
" if (\"__data__\" in node) subnode.__data__ = node.__data__;\n",
" subgroup[i] = subnode;\n",
" schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Transition(subgroups, this._parents, name, id);\n",
"}\n",
"\n",
"function transition_selectAll(select) {\n",
" var name = this._name,\n",
" id = this._id;\n",
"\n",
" if (typeof select !== \"function\") select = d3Selection.selectorAll(select);\n",
"\n",
" for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n",
" if (node = group[i]) {\n",
" for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n",
" if (child = children[k]) {\n",
" schedule(child, name, id, k, children, inherit);\n",
" }\n",
" }\n",
" subgroups.push(children);\n",
" parents.push(node);\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Transition(subgroups, parents, name, id);\n",
"}\n",
"\n",
"var Selection = d3Selection.selection.prototype.constructor;\n",
"\n",
"function transition_selection() {\n",
" return new Selection(this._groups, this._parents);\n",
"}\n",
"\n",
"function styleNull(name, interpolate) {\n",
" var string00,\n",
" string10,\n",
" interpolate0;\n",
" return function() {\n",
" var string0 = d3Selection.style(this, name),\n",
" string1 = (this.style.removeProperty(name), d3Selection.style(this, name));\n",
" return string0 === string1 ? null\n",
" : string0 === string00 && string1 === string10 ? interpolate0\n",
" : interpolate0 = interpolate(string00 = string0, string10 = string1);\n",
" };\n",
"}\n",
"\n",
"function styleRemove(name) {\n",
" return function() {\n",
" this.style.removeProperty(name);\n",
" };\n",
"}\n",
"\n",
"function styleConstant(name, interpolate, value1) {\n",
" var string00,\n",
" string1 = value1 + \"\",\n",
" interpolate0;\n",
" return function() {\n",
" var string0 = d3Selection.style(this, name);\n",
" return string0 === string1 ? null\n",
" : string0 === string00 ? interpolate0\n",
" : interpolate0 = interpolate(string00 = string0, value1);\n",
" };\n",
"}\n",
"\n",
"function styleFunction(name, interpolate, value) {\n",
" var string00,\n",
" string10,\n",
" interpolate0;\n",
" return function() {\n",
" var string0 = d3Selection.style(this, name),\n",
" value1 = value(this),\n",
" string1 = value1 + \"\";\n",
" if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name));\n",
" return string0 === string1 ? null\n",
" : string0 === string00 && string1 === string10 ? interpolate0\n",
" : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n",
" };\n",
"}\n",
"\n",
"function styleMaybeRemove(id, name) {\n",
" var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n",
" return function() {\n",
" var schedule = set(this, id),\n",
" on = schedule.on,\n",
" listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n",
"\n",
" // If this node shared a dispatch with the previous node,\n",
" // just assign the updated shared dispatch and we're done!\n",
" // Otherwise, copy-on-write.\n",
" if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n",
"\n",
" schedule.on = on1;\n",
" };\n",
"}\n",
"\n",
"function transition_style(name, value, priority) {\n",
" var i = (name += \"\") === \"transform\" ? d3Interpolate.interpolateTransformCss : interpolate;\n",
" return value == null ? this\n",
" .styleTween(name, styleNull(name, i))\n",
" .on(\"end.style.\" + name, styleRemove(name))\n",
" : typeof value === \"function\" ? this\n",
" .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n",
" .each(styleMaybeRemove(this._id, name))\n",
" : this\n",
" .styleTween(name, styleConstant(name, i, value), priority)\n",
" .on(\"end.style.\" + name, null);\n",
"}\n",
"\n",
"function styleInterpolate(name, i, priority) {\n",
" return function(t) {\n",
" this.style.setProperty(name, i.call(this, t), priority);\n",
" };\n",
"}\n",
"\n",
"function styleTween(name, value, priority) {\n",
" var t, i0;\n",
" function tween() {\n",
" var i = value.apply(this, arguments);\n",
" if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n",
" return t;\n",
" }\n",
" tween._value = value;\n",
" return tween;\n",
"}\n",
"\n",
"function transition_styleTween(name, value, priority) {\n",
" var key = \"style.\" + (name += \"\");\n",
" if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n",
" if (value == null) return this.tween(key, null);\n",
" if (typeof value !== \"function\") throw new Error;\n",
" return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n",
"}\n",
"\n",
"function textConstant(value) {\n",
" return function() {\n",
" this.textContent = value;\n",
" };\n",
"}\n",
"\n",
"function textFunction(value) {\n",
" return function() {\n",
" var value1 = value(this);\n",
" this.textContent = value1 == null ? \"\" : value1;\n",
" };\n",
"}\n",
"\n",
"function transition_text(value) {\n",
" return this.tween(\"text\", typeof value === \"function\"\n",
" ? textFunction(tweenValue(this, \"text\", value))\n",
" : textConstant(value == null ? \"\" : value + \"\"));\n",
"}\n",
"\n",
"function textInterpolate(i) {\n",
" return function(t) {\n",
" this.textContent = i.call(this, t);\n",
" };\n",
"}\n",
"\n",
"function textTween(value) {\n",
" var t0, i0;\n",
" function tween() {\n",
" var i = value.apply(this, arguments);\n",
" if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n",
" return t0;\n",
" }\n",
" tween._value = value;\n",
" return tween;\n",
"}\n",
"\n",
"function transition_textTween(value) {\n",
" var key = \"text\";\n",
" if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n",
" if (value == null) return this.tween(key, null);\n",
" if (typeof value !== \"function\") throw new Error;\n",
" return this.tween(key, textTween(value));\n",
"}\n",
"\n",
"function transition_transition() {\n",
" var name = this._name,\n",
" id0 = this._id,\n",
" id1 = newId();\n",
"\n",
" for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n",
" if (node = group[i]) {\n",
" var inherit = get(node, id0);\n",
" schedule(node, name, id1, i, group, {\n",
" time: inherit.time + inherit.delay + inherit.duration,\n",
" delay: 0,\n",
" duration: inherit.duration,\n",
" ease: inherit.ease\n",
" });\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Transition(groups, this._parents, name, id1);\n",
"}\n",
"\n",
"function transition_end() {\n",
" var on0, on1, that = this, id = that._id, size = that.size();\n",
" return new Promise(function(resolve, reject) {\n",
" var cancel = {value: reject},\n",
" end = {value: function() { if (--size === 0) resolve(); }};\n",
"\n",
" that.each(function() {\n",
" var schedule = set(this, id),\n",
" on = schedule.on;\n",
"\n",
" // If this node shared a dispatch with the previous node,\n",
" // just assign the updated shared dispatch and we're done!\n",
" // Otherwise, copy-on-write.\n",
" if (on !== on0) {\n",
" on1 = (on0 = on).copy();\n",
" on1._.cancel.push(cancel);\n",
" on1._.interrupt.push(cancel);\n",
" on1._.end.push(end);\n",
" }\n",
"\n",
" schedule.on = on1;\n",
" });\n",
" });\n",
"}\n",
"\n",
"var id = 0;\n",
"\n",
"function Transition(groups, parents, name, id) {\n",
" this._groups = groups;\n",
" this._parents = parents;\n",
" this._name = name;\n",
" this._id = id;\n",
"}\n",
"\n",
"function transition(name) {\n",
" return d3Selection.selection().transition(name);\n",
"}\n",
"\n",
"function newId() {\n",
" return ++id;\n",
"}\n",
"\n",
"var selection_prototype = d3Selection.selection.prototype;\n",
"\n",
"Transition.prototype = transition.prototype = {\n",
" constructor: Transition,\n",
" select: transition_select,\n",
" selectAll: transition_selectAll,\n",
" filter: transition_filter,\n",
" merge: transition_merge,\n",
" selection: transition_selection,\n",
" transition: transition_transition,\n",
" call: selection_prototype.call,\n",
" nodes: selection_prototype.nodes,\n",
" node: selection_prototype.node,\n",
" size: selection_prototype.size,\n",
" empty: selection_prototype.empty,\n",
" each: selection_prototype.each,\n",
" on: transition_on,\n",
" attr: transition_attr,\n",
" attrTween: transition_attrTween,\n",
" style: transition_style,\n",
" styleTween: transition_styleTween,\n",
" text: transition_text,\n",
" textTween: transition_textTween,\n",
" remove: transition_remove,\n",
" tween: transition_tween,\n",
" delay: transition_delay,\n",
" duration: transition_duration,\n",
" ease: transition_ease,\n",
" end: transition_end\n",
"};\n",
"\n",
"var defaultTiming = {\n",
" time: null, // Set on use.\n",
" delay: 0,\n",
" duration: 250,\n",
" ease: d3Ease.easeCubicInOut\n",
"};\n",
"\n",
"function inherit(node, id) {\n",
" var timing;\n",
" while (!(timing = node.__transition) || !(timing = timing[id])) {\n",
" if (!(node = node.parentNode)) {\n",
" return defaultTiming.time = d3Timer.now(), defaultTiming;\n",
" }\n",
" }\n",
" return timing;\n",
"}\n",
"\n",
"function selection_transition(name) {\n",
" var id,\n",
" timing;\n",
"\n",
" if (name instanceof Transition) {\n",
" id = name._id, name = name._name;\n",
" } else {\n",
" id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + \"\";\n",
" }\n",
"\n",
" for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n",
" for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n",
" if (node = group[i]) {\n",
" schedule(node, name, id, i, group, timing || inherit(node, id));\n",
" }\n",
" }\n",
" }\n",
"\n",
" return new Transition(groups, this._parents, name, id);\n",
"}\n",
"\n",
"d3Selection.selection.prototype.interrupt = selection_interrupt;\n",
"d3Selection.selection.prototype.transition = selection_transition;\n",
"\n",
"var root = [null];\n",
"\n",
"function active(node, name) {\n",
" var schedules = node.__transition,\n",
" schedule,\n",
" i;\n",
"\n",
" if (schedules) {\n",
" name = name == null ? null : name + \"\";\n",
" for (i in schedules) {\n",
" if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {\n",
" return new Transition([[node]], root, name, +i);\n",
" }\n",
" }\n",
" }\n",
"\n",
" return null;\n",
"}\n",
"\n",
"exports.active = active;\n",
"exports.interrupt = interrupt;\n",
"exports.transition = transition;\n",
"\n",
"Object.defineProperty(exports, '__esModule', { value: true });\n",
"\n",
"}));\n",
"\n",
"},{\"d3-color\":4,\"d3-dispatch\":5,\"d3-ease\":6,\"d3-interpolate\":8,\"d3-selection\":11,\"d3-timer\":15}]},{},[1]);\n",
"</script><script>;(function () {\n",
" 'use strict';\n",
" const d3 = window.d3;\n",
"\n",
" const margin = {top: 10, right: 10, bottom: 10, left: 35};\n",
" const axisMargin = { top: 10, right: 15, bottom: 10, left: 15 };\n",
" const facetWidth = 30;\n",
" const legendHeight = 40;\n",
" const xAxisHeight = 30;\n",
" const xLabelHeight = 20;\n",
"\n",
" function computeLimit(original, data, lineKeys, fn) {\n",
" let min = Infinity;\n",
" let max = -Infinity;\n",
"\n",
" for (const lineKey of lineKeys) {\n",
" const [localMin, localMax] = d3.extent(data.get(lineKey).map(fn));\n",
" min = Math.min(min, localMin);\n",
" max = Math.max(max, localMax);\n",
" }\n",
"\n",
" return [\n",
" original[0] === null ? min : original[0],\n",
" original[1] === null ? max : original[1]\n",
" ];\n",
" }\n",
"\n",
" function highestMinorMod(majorTickCount, minorTickMax) {\n",
" return Math.floor((minorTickMax - 1) / (majorTickCount - 1));\n",
" }\n",
"\n",
" function createGridTicks(majorTicks, minorMod) {\n",
" const minorTicks = [];\n",
" for (let majorIndex = 0; majorIndex < majorTicks.length - 1; majorIndex++) {\n",
" minorTicks.push(majorTicks[majorIndex]);\n",
" const distance = majorTicks[majorIndex + 1] - majorTicks[majorIndex];\n",
" for (let i = 1; i <= minorMod - 1; i++) {\n",
" minorTicks.push(majorTicks[majorIndex] + (i / minorMod) * distance);\n",
" }\n",
" }\n",
" minorTicks.push(majorTicks[majorTicks.length - 1]);\n",
" return minorTicks;\n",
" }\n",
"\n",
" class SubGraph {\n",
" constructor({ container, id, index, height, width, drawXAxis, lineConfig, facetLabel, ylim, xlim }) {\n",
" this.container = container;\n",
"\n",
" this.graphWidth = width - facetWidth - margin.left - margin.right;\n",
" this.graphHeight = height - margin.top - margin.bottom;\n",
"\n",
" this.axisWidth = this.graphWidth - axisMargin.left - axisMargin.right;\n",
" this.axisHeight = this.graphHeight - axisMargin.top - axisMargin.bottom;\n",
"\n",
" this.xlim = xlim;\n",
" this.dynamicXlim = this.xlim.includes(null);\n",
" this.ylim = ylim;\n",
" this.dynamicYlim = this.ylim.includes(null);\n",
"\n",
" this.lineKeys = Object.keys(lineConfig);\n",
" this.lineConfig = lineConfig;\n",
"\n",
" // Create graph container\n",
" this.graph = this.container.append('g')\n",
" .attr('transform',\n",
" 'translate(' + margin.left + ',' + margin.top + ')');\n",
"\n",
" // Create facet\n",
" this.facet = this.container.append('g')\n",
" .classed('facet', true)\n",
" .attr('transform', `translate(${margin.left + this.graphWidth}, ${margin.top})`);\n",
" this.facet.append('rect')\n",
" .classed('facet-background', true)\n",
" .attr('width', facetWidth)\n",
" .attr('height', this.graphHeight);\n",
" const facetTextPath = this.facet.append('path')\n",
" .attr('d', `M10,0 V${this.graphHeight}`)\n",
" .attr('id', `learning-curve-${id}-${index}-facet-text`);\n",
" const facetText = this.facet.append('text')\n",
" .append('textPath')\n",
" .attr('startOffset', '50%')\n",
" .attr('href', `#learning-curve-${id}-${index}-facet-text`)\n",
" .attr('text-anchor', 'middle')\n",
" .text(facetLabel);\n",
" facetText.node()\n",
" .setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', `#learning-curve-${id}-${index}-facet-text`);\n",
"\n",
" // Create background\n",
" this.background = this.graph.append(\"rect\")\n",
" .attr(\"class\", \"background\")\n",
" .attr(\"height\", this.graphHeight)\n",
" .attr(\"width\", this.graphWidth);\n",
"\n",
" // define scales\n",
" this.xScale = d3.scaleLinear()\n",
" .range([0, this.axisWidth]);\n",
"\n",
" this.yScale = d3.scaleLinear()\n",
" .range([this.axisHeight, 0]);\n",
"\n",
" // compute tick marks\n",
" this._updateXscale(this.xlim);\n",
" this._updateYscale(this.ylim);\n",
"\n",
" // create x-grid\n",
" this.xGrid = d3.axisBottom(this.xScale)\n",
" .tickValues(this.xTicksGrid)\n",
" .tickSize(-this.graphHeight);\n",
" this.xGridElement = this.graph.append(\"g\")\n",
" .attr(\"class\", \"grid\")\n",
" .attr(\"transform\", `translate(${axisMargin.left},${this.graphHeight})`);\n",
"\n",
" // create y-grid\n",
" this.yGrid = d3.axisLeft(this.yScale)\n",
" .tickValues(this.yTicksGrid)\n",
" .tickSize(-this.graphWidth);\n",
" this.yGridElement = this.graph.append(\"g\")\n",
" .attr(\"class\", \"grid\")\n",
" .attr('transform', `translate(0,${axisMargin.top})`);\n",
"\n",
" // define x-axis\n",
" this.xAxis = d3.axisBottom(this.xScale)\n",
" .tickValues(this.xTicks);\n",
" this.xAxisElement = this.graph.append('g')\n",
" .attr(\"class\", \"axis\")\n",
" .classed('hide-axis', !drawXAxis)\n",
" .attr('transform', `translate(${axisMargin.left},${this.graphHeight})`);\n",
"\n",
" // define y-axis\n",
" this.yAxis = d3.axisLeft(this.yScale)\n",
" .tickValues(this.yTicks);\n",
" this.yAxisElement = this.graph.append('g')\n",
" .attr(\"class\", \"axis\")\n",
" .attr('transform', `translate(0,${axisMargin.top})`);\n",
"\n",
" // draw axis\n",
" if (!this.dynamicYlim) this._drawYaxis();\n",
" if (!this.dynamicXlim) this._drawXaxis();\n",
"\n",
" // Define drawer functions and line elements\n",
" this.lineDrawers = new Map();\n",
" this.lineElements = new Map();\n",
" const self = this;\n",
" for (const lineKey of this.lineKeys) {\n",
" // create drawer function\n",
" const lineDrawer = d3.line()\n",
" .x((d) => self.xScale(d.x))\n",
" .y((d) => this.yScale(d.y));\n",
" this.lineDrawers.set(lineKey, lineDrawer);\n",
"\n",
" // create line element\n",
" const lineElement = this.graph.append('path')\n",
" .attr('class', 'line')\n",
" .attr('transform', `translate(${axisMargin.left},${axisMargin.top})`)\n",
" .attr('stroke', lineConfig[lineKey].color);\n",
" this.lineElements.set(lineKey, lineElement);\n",
" }\n",
" }\n",
"\n",
" _updateXscale(xlim) {\n",
" this.xScale.domain(xlim).nice(6);\n",
" this.xTicks = this.xScale.ticks(6);\n",
" this.xTicksMod = highestMinorMod(this.xTicks.length, 19);\n",
" this.xTicksGrid = createGridTicks(this.xTicks, this.xTicksMod);\n",
" }\n",
"\n",
" _drawXaxis() {\n",
" // update x-grid\n",
" this.xGridElement.transition()\n",
" .call(this.xGrid.tickValues(this.xTicksGrid))\n",
" .call((transition) => transition\n",
" .selectAll('.tick')\n",
" .style('stroke-opacity', (v) => this.xTicks.includes(v) ? '1.0' : '0.5')\n",
" );\n",
"\n",
" // update x-axis\n",
" this.xAxisElement.transition().call(\n",
" this.xAxis.tickValues(this.xTicks)\n",
" );\n",
" }\n",
"\n",
" _updateYscale(ylim) {\n",
" this.yScale.domain(ylim).nice(3);\n",
" this.yTicks = this.yScale.ticks(3);\n",
" this.yTicksMod = highestMinorMod(this.yTicks.length, 9);\n",
" this.yTicksGrid = createGridTicks(this.yTicks, this.yTicksMod);\n",
" }\n",
"\n",
" _drawYaxis() {\n",
" // update x-grid\n",
" this.yGridElement.transition()\n",
" .call(this.yGrid.tickValues(this.yTicksGrid))\n",
" .call((transition) => transition\n",
" .selectAll('.tick')\n",
" .style('stroke-opacity', (v) => this.yTicks.includes(v) ? '1.0' : '0.5')\n",
" );\n",
" // update x-axis\n",
" this.yAxisElement.transition().call(\n",
" this.yAxis.tickValues(this.yTicks)\n",
" );\n",
" }\n",
"\n",
" setData (data) {\n",
" // Compute x-axis limit\n",
" if (this.dynamicXlim) {\n",
" const xlim = computeLimit(this.xlim, data, this.lineKeys, (d) => d.x);\n",
" if (xlim[0] !== this.xlim[0] || xlim[1] !== this.xlim[1]) {\n",
" this._updateXscale(xlim);\n",
" }\n",
" }\n",
"\n",
" // Update y-axis limit\n",
" if (this.dynamicYlim) {\n",
" const ylim = computeLimit(this.ylim, data, this.lineKeys, (d) => d.y);\n",
" if (ylim[0] !== this.ylim[0] || ylim[1] !== this.ylim[1]) {\n",
" this._updateYscale(ylim);\n",
" }\n",
" }\n",
"\n",
" // Update line data\n",
" for (let lineKey of this.lineKeys) {\n",
" this.lineElements.get(lineKey).data([\n",
" data.get(lineKey)\n",
" ]);\n",
" }\n",
" }\n",
"\n",
" draw() {\n",
" if (this.dynamicXlim) this._drawXaxis();\n",
" if (this.dynamicYlim) this._drawYaxis();\n",
"\n",
" // update lines\n",
" for (let lineKey of this.lineKeys) {\n",
" this.lineElements.get(lineKey)\n",
" .attr('d', this.lineDrawers.get(lineKey));\n",
" }\n",
" }\n",
" }\n",
"\n",
" class LearningCurvePlot {\n",
" constructor({ container, id, height, width, facetConfig, lineConfig, xAxisConfig }) {\n",
" this.facetKeys = Object.keys(facetConfig);\n",
"\n",
" const innerHeight = height - legendHeight - xLabelHeight - xAxisHeight;\n",
" const subGraphHeight = innerHeight / this.facetKeys.length;\n",
"\n",
" this._container = d3.select(container)\n",
" .classed('learning-curve', true)\n",
" .style('height', `${height}px`)\n",
" .style('width', `${width}px`)\n",
" .attr('height', height)\n",
" .attr('width', width)\n",
" .attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n",
"\n",
" // Create a SubGraph for each facet\n",
" this._facets = new Map();\n",
" for (let facetIndex = 0; facetIndex < this.facetKeys.length; facetIndex++) {\n",
" const facetKey = this.facetKeys[facetIndex];\n",
" this._facets.set(\n",
" facetKey,\n",
" new SubGraph({\n",
" container: this._container.append('g')\n",
" .attr('transform', `translate(0, ${facetIndex * subGraphHeight})`),\n",
" id: id,\n",
" index: facetIndex,\n",
" height: Math.round(subGraphHeight),\n",
" width: width,\n",
"\n",
" drawXAxis: facetIndex == this.facetKeys.length - 1,\n",
"\n",
" lineConfig: lineConfig,\n",
" facetLabel: facetConfig[facetKey].name,\n",
" ylim: facetConfig[facetKey].limit,\n",
" xlim: xAxisConfig.limit\n",
" })\n",
" );\n",
" }\n",
"\n",
" const afterSubGraphHeight = height - legendHeight - xLabelHeight;\n",
" const plotWidth = width - margin.left - margin.right;\n",
" const xAxisWidth = plotWidth - facetWidth;\n",
"\n",
" // Draw x-axis label\n",
" this._xLabel = this._container.append('text')\n",
" .attr('text-anchor', 'middle')\n",
" .attr('transform', `translate(${margin.left}, ${afterSubGraphHeight})`)\n",
" .attr('x', xAxisWidth / 2)\n",
" .text(xAxisConfig.name);\n",
"\n",
" // Draw legends\n",
" this._legend = this._container\n",
" .append('g')\n",
" .classed('legned', true)\n",
" .attr('transform', `translate(${margin.left}, ${afterSubGraphHeight + xLabelHeight})`);\n",
" this._legendOfsset = this._legend.append('g');\n",
"\n",
" let currentOffset = 0;\n",
" for (const {name, color} of Object.values(lineConfig)) {\n",
" // Draw rect with line inside [-]\n",
" this._legendOfsset.append('rect')\n",
" .attr('width', 25)\n",
" .attr('height', 25)\n",
" .attr('x', currentOffset);\n",
" this._legendOfsset.append('line')\n",
" .attr('x1', currentOffset + 2)\n",
" .attr('x2', currentOffset + 25 - 2)\n",
" .attr('y1', 25/2)\n",
" .attr('y2', 25/2)\n",
" .attr('stroke', color);\n",
" currentOffset += 30;\n",
"\n",
" // Draw text\n",
" const textNode = this._legendOfsset.append('text')\n",
" .attr('x', currentOffset)\n",
" .attr('y', 19)\n",
" .text(name);\n",
" const textWidth = textNode.node().getComputedTextLength();\n",
" currentOffset += textWidth + 20;\n",
" }\n",
" currentOffset -= 20;\n",
"\n",
" this._legendOfsset\n",
" .attr('transform', `translate(${(plotWidth - currentOffset) / 2}, 0)`);\n",
" }\n",
"\n",
" setData(data) {\n",
" for (let facetKey of this.facetKeys) {\n",
" this._facets.get(facetKey).setData(data.getFacetData(facetKey));\n",
" }\n",
" }\n",
"\n",
" draw() {\n",
" for (let facetKey of this.facetKeys) {\n",
" this._facets.get(facetKey).draw();\n",
" }\n",
" }\n",
" }\n",
"\n",
" // Class to accumulate and store all data\n",
" class LearningCurveData {\n",
" constructor(facetLabels, lineLabels) {\n",
" this.facetKeys = Object.keys(facetLabels);\n",
" this.lineKeys = Object.keys(lineLabels);\n",
"\n",
" this.data = new Map();\n",
" for (const facetKey of this.facetKeys) {\n",
" this.data.set(facetKey, new Map());\n",
" for (const lineKey of this.lineKeys) {\n",
" this.data.get(facetKey).set(lineKey, []);\n",
" }\n",
" }\n",
" }\n",
"\n",
" appendAll(rows) {\n",
" for (const facetKey of this.facetKeys) {\n",
" for (const lineKey of this.lineKeys) {\n",
" const storage = this.data.get(facetKey).get(lineKey);\n",
" for (const row of rows) {\n",
" storage.push({\n",
" x: row.x,\n",
" y: row.y[facetKey][lineKey]\n",
" });\n",
" }\n",
" }\n",
" }\n",
" }\n",
"\n",
" getFacetData(facetKey) {\n",
" return this.data.get(facetKey);\n",
" }\n",
" }\n",
"\n",
" window.setupLearningCurve = function (settings) {\n",
" const data = new LearningCurveData(settings.facetConfig, settings.lineConfig);\n",
" const graph = new LearningCurvePlot({\n",
" container: document.getElementById(settings.id),\n",
" ...settings\n",
" });\n",
"\n",
" let waitingForDrawing = false;\n",
" function drawer() {\n",
" waitingForDrawing = false;\n",
" graph.setData(data);\n",
" graph.draw();\n",
" }\n",
"\n",
" window.appendLearningCurve = function(rows) {\n",
" data.appendAll(rows);\n",
"\n",
" if (!waitingForDrawing) {\n",
" waitingForDrawing = true;\n",
" window.requestAnimationFrame(drawer);\n",
" }\n",
" };\n",
" };\n",
"})();\n",
"</script><svg id=\"772b7ed5-4fb1-461a-b6e2-13bfe8bd154c\" class=\"learning-curve\"></svg><script> window.setupLearningCurve({\"id\": \"772b7ed5-4fb1-461a-b6e2-13bfe8bd154c\", \"width\": 600, \"height\": 490, \"lineConfig\": {\"Train\": {\"name\": \"Train\", \"color\": \"#1f77b4\"}, \"Validation\": {\"name\": \"Validation\", \"color\": \"#ff7f0e\"}}, \"facetConfig\": {\"Cross entropy\": {\"name\": \"Cross entropy\", \"limit\": [null, null]}, \"Accuracy\": {\"name\": \"Accuracy\", \"limit\": [null, null]}}, \"xAxisConfig\": {\"name\": \"Iteration\", \"limit\": [0, 34000]}});</script>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": "window.appendLearningCurve([{\"x\": 124.0, \"y\": {\"Cross entropy\": {\"Train\": 1.8584183756742794, \"Validation\": 1.8472406692662053}, \"Accuracy\": {\"Train\": 0.23, \"Validation\": 0.27923627684964203}}}]);",
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn [121], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m main()\n",
"Cell \u001b[1;32mIn [116], line 67\u001b[0m, in \u001b[0;36mmain\u001b[1;34m()\u001b[0m\n\u001b[0;32m 65\u001b[0m \u001b[39m# Train model.\u001b[39;00m\n\u001b[0;32m 66\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m'\u001b[39m\u001b[39mtraining...\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m---> 67\u001b[0m trained_model, stats \u001b[39m=\u001b[39m Train(model, NNForward, NNBackward, NNUpdate, eps,\n\u001b[0;32m 68\u001b[0m momentum, num_epochs, batch_size)\n\u001b[0;32m 70\u001b[0m plt\u001b[39m.\u001b[39mfigure(\u001b[39m0\u001b[39m)\n\u001b[0;32m 71\u001b[0m plt\u001b[39m.\u001b[39mplot(np\u001b[39m.\u001b[39marray(stats[\u001b[39m'\u001b[39m\u001b[39mtrain_ce\u001b[39m\u001b[39m'\u001b[39m])[:, \u001b[39m0\u001b[39m], np\u001b[39m.\u001b[39marray(stats[\u001b[39m'\u001b[39m\u001b[39mtrain_ce\u001b[39m\u001b[39m'\u001b[39m])[:, \u001b[39m1\u001b[39m], \u001b[39m'\u001b[39m\u001b[39mb\u001b[39m\u001b[39m'\u001b[39m, label\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mTrain\u001b[39m\u001b[39m'\u001b[39m)\n",
"Cell \u001b[1;32mIn [53], line 68\u001b[0m, in \u001b[0;36mTrain\u001b[1;34m(model, forward, backward, update, eps, momentum, num_epochs, batch_size)\u001b[0m\n\u001b[0;32m 65\u001b[0m error \u001b[39m=\u001b[39m (prediction \u001b[39m-\u001b[39m t) \u001b[39m/\u001b[39m x\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m]\n\u001b[0;32m 67\u001b[0m \u001b[39m# Backward prop.\u001b[39;00m\n\u001b[1;32m---> 68\u001b[0m grads \u001b[39m=\u001b[39m backward(model, error, var)\n\u001b[0;32m 70\u001b[0m \u001b[39m# Update weights.\u001b[39;00m\n\u001b[0;32m 71\u001b[0m update(model, eps, momentum, optimizer_state, grads)\n",
"Cell \u001b[1;32mIn [51], line 15\u001b[0m, in \u001b[0;36mNNBackward\u001b[1;34m(model, err, var)\u001b[0m\n\u001b[0;32m 13\u001b[0m dE_dh1r, dE_dW2, dE_db2 \u001b[39m=\u001b[39m AffineBackward(dE_dh2, var[\u001b[39m'\u001b[39m\u001b[39mh1r\u001b[39m\u001b[39m'\u001b[39m], model[\u001b[39m'\u001b[39m\u001b[39mW2\u001b[39m\u001b[39m'\u001b[39m])\n\u001b[0;32m 14\u001b[0m dE_dh1 \u001b[39m=\u001b[39m ReLUBackward(dE_dh1r, var[\u001b[39m'\u001b[39m\u001b[39mh1\u001b[39m\u001b[39m'\u001b[39m], var[\u001b[39m'\u001b[39m\u001b[39mh1r\u001b[39m\u001b[39m'\u001b[39m])\n\u001b[1;32m---> 15\u001b[0m _, dE_dW1, dE_db1 \u001b[39m=\u001b[39m AffineBackward(dE_dh1, var[\u001b[39m'\u001b[39;49m\u001b[39mx\u001b[39;49m\u001b[39m'\u001b[39;49m], model[\u001b[39m'\u001b[39;49m\u001b[39mW1\u001b[39;49m\u001b[39m'\u001b[39;49m])\n\u001b[0;32m 17\u001b[0m grads \u001b[39m=\u001b[39m {}\n\u001b[0;32m 18\u001b[0m grads[\u001b[39m'\u001b[39m\u001b[39mW1\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m=\u001b[39m dE_dW1\n",
"Cell \u001b[1;32mIn [49], line 14\u001b[0m, in \u001b[0;36mAffineBackward\u001b[1;34m(grad_y, x, w)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mAffineBackward\u001b[39m(grad_y: np\u001b[39m.\u001b[39mndarray, x: np\u001b[39m.\u001b[39mndarray, w: np\u001b[39m.\u001b[39mndarray) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Tuple[np\u001b[39m.\u001b[39mndarray, np\u001b[39m.\u001b[39mndarray, np\u001b[39m.\u001b[39mndarray]:\n\u001b[0;32m 2\u001b[0m \u001b[39m\"\"\"Computes gradients of affine transformation.\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \n\u001b[0;32m 4\u001b[0m \u001b[39m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 12\u001b[0m \u001b[39m grad_b: Gradients wrt. the biases.\u001b[39;00m\n\u001b[0;32m 13\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m---> 14\u001b[0m grad_x \u001b[39m=\u001b[39m grad_y\u001b[39m.\u001b[39;49mdot(w\u001b[39m.\u001b[39;49mT)\n\u001b[0;32m 15\u001b[0m grad_w \u001b[39m=\u001b[39m x\u001b[39m.\u001b[39mT\u001b[39m.\u001b[39mdot(grad_y)\n\u001b[0;32m 16\u001b[0m grad_b \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39msum(grad_y, axis\u001b[39m=\u001b[39m\u001b[39m0\u001b[39m)\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"main()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"학습 오차(training error)와 일반화를 위한 검증 오차(validation error) 결과는 다음과 같습니다.\n",
"\n",
"```\n",
"CE: Train 0.25610 Validation 0.97890 Test 0.78023\n",
"Acc: Train 0.90486 Validation 0.73986 Test 0.77143\n",
"```\n",
"\n",
"그래프는 다음과 같습니다.\n",
"\n",
"![loss_graph](./defaultLossGraph.png)\n",
"![accuracy_graph](./defaultAccuracyGraph.png)\n",
"\n",
"학습 오차가 크게 감소하고 일반화 검증 오차는 점점 증가하는 것을 확인할 수 있습니다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. 최적화 (optimization): Learning rate, momentum, mini-batch size 세 가지 종류의 parameter 들을 아래와 같이 변화시키면서 다양한 조합들에 대해 신경망이 cross-entropy 관점에서 어떻게 수렴하는지 살펴본다. 가장 우수한 성능을 나타내는 hyperparameter 들의 조합이 어떤 것인지 제시하시오. (모든 경우의 수를 다 따지면 75 가지 신경망 모델을 테스트해야 하나 시간이 너무 많이 결릴 수 있으므로 이 중에서 일부분의 경우들만 테스트해도 된다. 그러나 어떤 근거로 해당 조합들만 테스트했는지 적당한 설명이 있어야 함.)\n",
" - Learning rate ( $\\epsilon$ ): 0.001 에서 1.0 사이의 5 가지 경우\n",
" - Momentum: 0.0 에서 0.9 사이의 3 가지 경우\n",
" - Mini-batch size: 1 에서 1000 까지의 5 가지 경우\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 실험 코드"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{1, 2, 7, 14, 241, 482, 1687, 3374}"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import itertools\n",
"# 3374 can be factorized into 2 * 7 * 241\n",
"factor = set([1, 2, 7, 241])\n",
"# make all the multiplication of combinations of factors\n",
"combinations = [set(np.prod(x) for x in itertools.combinations(factor, i)) for i in range(1, len(factor)+1)]\n",
"combinations = set.union(*combinations)\n",
"combinations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"나머지가 없는 Mini-batch size는 1, 2, 7, 14, 241, 482, 1687, 3374 입니다."
]
},
{
"cell_type": "code",
"execution_count": 165,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[3.9810717055349727,\n",
" 15.848931924611136,\n",
" 63.095734448019314,\n",
" 251.1886431509581,\n",
" 1000.0]"
]
},
"execution_count": 165,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[1000**(i/5) for i in range(1, 6)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1000을 배수단위로 5등분을 하면 3.98, 15.84, 63.09, 251.18, 1000 이 됩니다."
]
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(65, 59, 0.09230769230769231),\n",
" (69, 62, 0.10144927536231885),\n",
" (64, 46, 0.28125),\n",
" (68, 42, 0.38235294117647056),\n",
" (63, 35, 0.4444444444444444),\n",
" (62, 26, 0.5806451612903226),\n",
" (67, 24, 0.6417910447761194),\n",
" (61, 19, 0.6885245901639344),\n",
" (56, 14, 0.75),\n",
" (60, 14, 0.7666666666666667)]"
]
},
"execution_count": 203,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# pick top 10\n",
"center, width = 63, 15\n",
"cand = [(i,3374 % i, (i - 3374 % i) / i) for i in range(center-(width//2), center+(width//2))]\n",
"cand = sorted(cand, key=lambda x: x[2])\n",
"cand[:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"그래서 2, 14, 65, 241, 844를 선택하였습니다."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "ExperimentMLP() missing 1 required positional argument: 'title'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn [20], line 12\u001b[0m\n\u001b[0;32m 1\u001b[0m conf \u001b[39m=\u001b[39m Config(\n\u001b[0;32m 2\u001b[0m num_inputs\u001b[39m=\u001b[39m\u001b[39m2304\u001b[39m,\n\u001b[0;32m 3\u001b[0m num_hiddens\u001b[39m=\u001b[39m[\u001b[39m16\u001b[39m, \u001b[39m32\u001b[39m],\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 10\u001b[0m patience\u001b[39m=\u001b[39m\u001b[39m100\u001b[39m,\n\u001b[0;32m 11\u001b[0m )\n\u001b[1;32m---> 12\u001b[0m _, stat \u001b[39m=\u001b[39m ExperimentMLP(conf, save_dir\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39mresults/example_lr=0.5\u001b[39;49m\u001b[39m'\u001b[39;49m, show\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, pplot\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m)\n\u001b[0;32m 13\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mTest accuracy: \u001b[39m\u001b[39m{\u001b[39;00mstat\u001b[39m.\u001b[39mtest_acc\u001b[39m:\u001b[39;00m\u001b[39m.4f\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m, Test cross entropy: \u001b[39m\u001b[39m{\u001b[39;00mstat\u001b[39m.\u001b[39mtest_ce\u001b[39m:\u001b[39;00m\u001b[39m.4f\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mDone\u001b[39m\u001b[39m\"\u001b[39m)\n",
"\u001b[1;31mTypeError\u001b[0m: ExperimentMLP() missing 1 required positional argument: 'title'"
]
}
],
"source": [
"conf = Config(\n",
" num_inputs=2304,\n",
" num_hiddens=[16, 32],\n",
" num_outputs=7,\n",
" eps=0.5,\n",
" momentum=0.0,\n",
" num_epochs=1000,\n",
" batch_size=844,\n",
" early_stopping=True,\n",
" patience=100,\n",
")\n",
"_, stat = ExperimentMLP(conf, save_dir='results/example_lr=0.5', show=True, pplot=True)\n",
"print(f\"Test accuracy: {stat.test_acc:.4f}, Test cross entropy: {stat.test_ce:.4f}\")\n",
"print(\"Done\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"위 셀에서 lr을 변경해서 나올 수 있는 결과는 다음과 같습니다.\n",
"\n",
"![lr1.0plot](./lr1plot.png)\n",
"\n",
"> lr 1.0 plot\n",
" \n",
"![lr0.5plot](./lr0.5plot.png)\n",
"\n",
"> lr 0.5 plot \n",
"\n",
"다음 그래프를 보면 알 수 있듯 배치를 아무리 높여도 lr = 0.5 일때 최적화가 잘 될 수 없다고 판단 하였습니다. 그래서 제외하였습니다. 1.0도 마찬가지이므로 제외하였습니다."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"conf = Config(\n",
" num_inputs=2304,\n",
" num_hiddens=[16, 32],\n",
" num_outputs=7,\n",
" eps=0.01,\n",
" momentum=0.0,\n",
" num_epochs=1000,\n",
" batch_size=100,\n",
" early_stopping=True,\n",
" patience=50,\n",
")\n",
"\n",
"# Grid search for hyperparameters.\n",
"lr_candidates = [0.1, 0.05, 0.01, 0.005, 0.001]\n",
"momentum_candidates = [0.0, 0.5, 0.9]\n",
"mini_batch_size_candidates = [2, 14, 65, 241, 844]\n",
"\n",
"# Make all combinations of hyperparameters.\n",
"import itertools\n",
"\n",
"experiments_list = [*itertools.product(lr_candidates, momentum_candidates, mini_batch_size_candidates)]"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"All experiments completed\n"
]
}
],
"source": [
"import time\n",
"\n",
"experiments = load_experiment_metafile('experiments.json', \n",
" init_task_if_not_exists=experiments_list)\n",
"\n",
"if len(experiments[\"remain_experiments\"]) == 0:\n",
" print(\"All experiments completed\")\n",
"\n",
"# Run experiments.\n",
"# tqdm nested progress bar is not working in my jupyter notebook\n",
"# so I just print the progress\n",
"while len(experiments['remain_experiments']) > 0:\n",
" # get next experiment\n",
" lr, momentum, mini_batch_size = experiments['remain_experiments'].pop(0)\n",
" # set experiment directory\n",
" save_dir = f\"results/lr={lr}_momentum={momentum}_batch_size={mini_batch_size}\"\n",
" # create experiment config\n",
" conf.eps = lr\n",
" conf.momentum = momentum\n",
" conf.batch_size = mini_batch_size\n",
" # print experiment parameters\n",
" print(f\"Experiment: lr={lr}, momentum={momentum}, batch_size={mini_batch_size}\")\n",
" \n",
" start = time.time()\n",
" # run experiment\n",
" ExperimentMLP(conf, save_dir=save_dir, show=False)\n",
" \n",
" end = time.time()\n",
" # add experiment to completed experiments\n",
" experiments['completed_experiment_results'].append({\n",
" \"lr\": lr,\n",
" \"momentum\": momentum,\n",
" \"mini_batch_size\": mini_batch_size,\n",
" \"save_dir\": save_dir,\n",
" \"time\": end - start\n",
" })\n",
" # print completed experiments , remaining experiments and time taken\n",
" print(\"\\n\".join([f\"Completed experiments: {len(experiments['completed_experiment_results'])}\",\n",
" f\"Remaining experiments: {len(experiments['remain_experiments'])}\",\n",
" f\"Time taken: {end - start:.2f} seconds\"]))\n",
" # save experiments\n",
" save_experiment_metafile('experiments.json', experiments)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"위의 셀들를 실행하면 실험을 진행할 수 있습니다."
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [],
"source": [
"from tqdm import tqdm\n",
"def get_lbm_experiment_results(experiments: Dict[str, Any], use_tqdm: bool = False):\n",
" \"\"\"Get experiment results from meta data\"\"\"\n",
" experiments_results = experiments['completed_experiment_results']\n",
" if use_tqdm:\n",
" experiments_results = tqdm(experiments_results)\n",
" results = []\n",
" for experiment in experiments_results:\n",
" # load experiment statistics\n",
" _, stat, _ = load_experiment(experiment['save_dir'], load_model=False)\n",
" i, best_valid_acc = stat.best_valid_acc()\n",
" # add experiment parameters and statistics to results\n",
" results.append({\n",
" \"lr\": experiment['lr'],\n",
" \"momentum\": experiment['momentum'],\n",
" \"mini_batch_size\": experiment['mini_batch_size'],\n",
" \"test_acc\": stat.test_acc,\n",
" \"test_ce\": stat.test_ce,\n",
" \"train_acc\": stat.train_acc[i][1],\n",
" \"train_ce\": stat.train_ce[i][1],\n",
" \"valid_acc\": best_valid_acc,\n",
" \"valid_ce\": stat.valid_ce[i][1],\n",
" \"time\": experiment['time']\n",
" })\n",
" return results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 결과"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 75/75 [00:00<00:00, 612.94it/s]\n"
]
}
],
"source": [
"# load experiments\n",
"experiments = load_experiment_metafile('experiments.json')\n",
"# get experiment results\n",
"results = get_lbm_experiment_results(experiments, use_tqdm=True)"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"#### Momentum = 0.0\n",
"| |0.1|0.05|0.01|0.005|0.001|\n",
"|---|---|---|---|---|---|\n",
"|2|28.16|44.87|75.18|76.37|75.42|\n",
"|14|71.12|74.22|77.57|76.37|72.32|\n",
"|65|74.46|76.61|74.46|74.70|66.11|\n",
"|241|65.16|73.27|73.51|66.83|47.26|\n",
"|844|50.60|68.97|63.48|55.61|28.16|"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"#### Momentum = 0.5\n",
"| |0.1|0.05|0.01|0.005|0.001|\n",
"|---|---|---|---|---|---|\n",
"|2|27.92|35.08|72.55|76.61|75.66|\n",
"|14|47.26|70.41|74.46|77.33|74.22|\n",
"|65|53.22|67.78|75.42|74.94|69.69|\n",
"|241|47.97|67.54|72.55|71.12|59.43|\n",
"|844|50.12|64.20|70.64|63.96|27.92|"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"#### Momentum = 0.9\n",
"| |0.1|0.05|0.01|0.005|0.001|\n",
"|---|---|---|---|---|---|\n",
"|2|27.92|27.92|27.92|47.73|73.51|\n",
"|14|27.92|27.92|69.45|72.32|76.37|\n",
"|65|27.92|47.73|74.46|75.89|73.27|\n",
"|241|32.70|58.47|75.66|73.51|71.84|\n",
"|844|35.80|53.46|72.79|71.36|60.86|"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.display import display, HTML, Markdown\n",
"\n",
"for m in momentum_candidates:\n",
" markdown_table_content = []\n",
" markdown_table_content.append(\"| |\" + \"|\".join(map(str, lr_candidates)) + \"|\")\n",
" markdown_table_content.append(\"|\" + \"|\".join([\"---\"] * (len(lr_candidates) + 1)) + \"|\")\n",
" for batch in mini_batch_size_candidates:\n",
" inner_content = []\n",
" markdown_table_content.append(\"|\" + str(batch) + \"|\")\n",
" for lr in lr_candidates:\n",
" # filter results\n",
" filtered_results = [result for result in results if result['lr'] == lr and result['momentum'] == m and result['mini_batch_size'] == batch]\n",
" if len(filtered_results) == 1:\n",
" result = filtered_results[0]\n",
" inner_content.append(f\"{result['valid_acc'] * 100:.2f}\")\n",
" markdown_table_content[-1] += \"|\".join(inner_content) + \"|\"\n",
" display(Markdown(f\"#### Momentum = {m}\\n\" + \"\\n\".join(markdown_table_content)))\n",
" # print(f\"#### Momentum = {m}\\n\"+\"\\n\".join(markdown_table_content))\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Momentum = 0.0\n",
"| |0.1|0.05|0.01|0.005|0.001|\n",
"|---|---|---|---|---|---|\n",
"|2|28.16|44.87|75.18|76.37|75.42|\n",
"|14|71.12|74.22|77.57|76.37|72.32|\n",
"|65|74.46|76.61|74.46|74.70|66.11|\n",
"|241|65.16|73.27|73.51|66.83|47.26|\n",
"|844|50.60|68.97|63.48|55.61|28.16|\n",
"\n",
"##### Momentum = 0.5\n",
"| |0.1|0.05|0.01|0.005|0.001|\n",
"|---|---|---|---|---|---|\n",
"|2|27.92|35.08|72.55|76.61|75.66|\n",
"|14|47.26|70.41|74.46|77.33|74.22|\n",
"|65|53.22|67.78|75.42|74.94|69.69|\n",
"|241|47.97|67.54|72.55|71.12|59.43|\n",
"|844|50.12|64.20|70.64|63.96|27.92|\n",
"\n",
"##### Momentum = 0.9\n",
"| |0.1|0.05|0.01|0.005|0.001|\n",
"|---|---|---|---|---|---|\n",
"|2|27.92|27.92|27.92|47.73|73.51|\n",
"|14|27.92|27.92|69.45|72.32|76.37|\n",
"|65|27.92|47.73|74.46|75.89|73.27|\n",
"|241|32.70|58.47|75.66|73.51|71.84|\n",
"|844|35.80|53.46|72.79|71.36|60.86|\n",
"\n",
"다음과 같은 결과가 나왔습니다."
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAbYAAAHWCAYAAAAb/awqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADB60lEQVR4nOydd1xb1/n/P5LQQBISexrjjfdeeOGBjW0w03tm9tuRNt+66a/Nt20SJ6nTNs3oStOm2dN7YsB4b2zjBR6AsY0xNhsh0Jbu+f1BoMYsCV1dDc47r/uKdTj3nEfS1X3uec4zeIQQAgqFQqFQPAS+swWgUCgUCoVNqGKjUCgUikdBFRuFQqFQPAqq2CgUCoXiUVDFRqFQKBSPgio2CoVCoXgUVLFRKBQKxaOgio1CoVAoHgVVbBQKhULxKKhio1BcGB6Ph9dee6319WeffQYej4d79+51e26/fv3w1FNPOUw2CsVVoYqNYjNarRavvfYajh075mxROkSlUuEHP/gBgoKCIJPJMGfOHFy6dMnq82/evImFCxdCLpfD398f69atQ3V1tQMlplAobEIVG8VmtFotNm3a5JKKjWEYJCQk4JtvvsELL7yAP/3pT6iqqsLs2bNRXFzc7fkPHjzArFmzcPv2bWzevBkvvfQSMjIyMH/+fBiNRg7eQdesW7cOOp0OUVFRzhaFQnFZvJwtAIXCJtu3b8eZM2ewbds2LF26FACwfPlyDBkyBK+++iq++eabLs/fvHkzNBoN8vLy0LdvXwDA5MmTMX/+fHz22Wf4wQ9+4PD30BUCgQACgcCpMjgTvV4PkUgEPp8+k1M6h14dPeS1114Dj8dDUVER1q5dC6VSiaCgIPzud78DIQRlZWVITk6GQqFAaGgo3nnnnXZjVFVV4dlnn0VISAgkEgnGjBmDzz//vE2fe/fugcfj4c9//jP+8Y9/YMCAAZBKpViwYAHKyspACMEbb7yBPn36wNvbG8nJyairq2s3V2ZmJmbOnAmZTAYfHx8kJCTg+vXrbfo89dRTkMvlKC8vR0pKCuRyOYKCgvDSSy/BYrG0yhMUFAQA2LRpE3g8Xpt9oNmzZ2P27Nnt5n/qqafQr18/1t/Xk2zfvh0hISFIS0trbQsKCsLy5cuxZ88eGAyGLs/fsWMHEhMTW5UaAMTFxWHIkCHYunVrp+eZTCb4+/vj6aefbvc3tVoNiUSCl156CQBgNBrxyiuvYMKECVAqlZDJZJg5cyaOHj3a7fvraI+NEII333wTffr0gVQqxZw5c9p9t13x5z//GdOmTUNAQAC8vb0xYcIEbN++vcO+X331FSZPngypVAo/Pz/MmjULBw8ebNMnMzMTsbGx8PHxgUKhwKRJk9o8UHS29/fktXPs2DHweDx89913+O1vf4uIiAhIpVKo1WrU1dXhpZdewqhRoyCXy6FQKLBo0SJcvXq13bh6vR6vvfYahgwZAolEgrCwMKSlpaGkpASEEPTr1w/JyckdnqdUKvE///M/Vn6SFFeBKjY7WbFiBRiGwR/+8AdMmTIFb775Jt5//33Mnz8fERER+OMf/4hBgwbhpZdewokTJ1rP0+l0mD17Nr788kusWbMGb7/9NpRKJZ566in85S9/aTfP119/jQ8++AA//elP8Ytf/ALHjx/H8uXL8dvf/hZZWVn41a9+hR/84AfYt29f6w20hS+//BIJCQmQy+X44x//iN/97ne4ceMGZsyY0c4JwWKxID4+HgEBAfjzn/+M2NhYvPPOO/j3v/8NoFlJ/POf/wQApKam4ssvv8SXX37ZRpHYgj3vqyMuX76M8ePHt3uinzx5MrRaLYqKijo9t7y8HFVVVZg4cWK7v02ePBmXL1/u9FyhUIjU1FTs3r27ncly9+7dMBgMWLlyJYBmRfef//wHs2fPxh//+Ee89tprqK6uRnx8PK5cudLte3ySV155Bb/73e8wZswYvP322xgwYAAWLFgAjUZj1fl/+ctfMG7cOLz++uvYvHkzvLy8sGzZMmRkZLTpt2nTJqxbtw5CoRCvv/46Nm3ahMjISBw5cqS1z2effYaEhATU1dXh5Zdfxh/+8AeMHTsWWVlZNr+vFt544w1kZGTgpZdewubNmyESiXDnzh3s3r0biYmJePfdd/HLX/4S+fn5iI2NxcOHD1vPtVgsSExMxKZNmzBhwgS88847ePHFF9HQ0ICCggLweDysXbsWmZmZ7R6c9u3bB7VajbVr1/ZYdoqTIJQe8eqrrxIA5Ac/+EFrm9lsJn369CE8Ho/84Q9/aG2vr68n3t7eZMOGDa1t77//PgFAvvrqq9Y2o9FIYmJiiFwuJ2q1mhBCyN27dwkAEhQURFQqVWvfl19+mQAgY8aMISaTqbV91apVRCQSEb1eTwghpLGxkfj6+pLnn3++jfwVFRVEqVS2ad+wYQMBQF5//fU2fceNG0cmTJjQ+rq6upoAIK+++mq7zyU2NpbExsa2a9+wYQOJiopqfW3v++oMmUxGnnnmmXbtGRkZBADJysrq9NwLFy4QAOSLL75o97df/vKXBECX82dnZxMAZN++fW3aFy9eTAYMGND62mw2E4PB0KZPfX09CQkJaSf7k5/zp59+SgCQu3fvEkIIqaqqIiKRiCQkJBCGYVr7/d///R8B0Oaa6wytVtvmtdFoJCNHjiRz585tbSsuLiZ8Pp+kpqYSi8XSpn/LvCqVivj4+JApU6YQnU7XYR9CCImKiupQrievnaNHjxIAZMCAAe1k1Ov17eS4e/cuEYvFba7fTz75hAAg7777brv5WmQqLCwkAMg///nPNn9PSkoi/fr1ayM7xT2gKzY7ee6551r/LRAIMHHiRBBC8Oyzz7a2+/r6Ijo6Gnfu3GltO3DgAEJDQ7Fq1arWNqFQiJ/97GdoamrC8ePH28yzbNkyKJXK1tdTpkwBAKxduxZeXl5t2o1GI8rLywEAOTk5UKlUWLVqFWpqaloPgUCAKVOmdGj++uEPf9jm9cyZM9vIziY9fV+dodPpIBaL27VLJJLWv3d1LoAenz937lwEBgZiy5YtrW319fXIycnBihUrWtsEAgFEIhGAZmeXuro6mM1mTJw40SbvTQA4dOgQjEYjfvrTn4LH47W2/+///q/VY3h7e7eRt6GhATNnzmwjy+7du8EwDF555ZV2q+GWeXNyctDY2Ihf//rXrZ/Xk316woYNG9rICDR/Ry1yWCwW1NbWQi6XIzo6uo3cO3bsQGBgIH7605+2G7dFpiFDhmDKlCn4+uuvW/9WV1eHzMxMrFmzxi7ZKc6BOo/YyeN7MQCgVCohkUgQGBjYrr22trb1dWlpKQYPHtzuJjFs2LDWv3c3DwBERkZ22F5fXw8ArZ6Ac+fO7VB+hULR5rVEImndQ2vBz8+vdTy26en76gxvb+8O99H0en3r37s6F0CPz/fy8kJ6ejq++eYbGAwGiMVi7Ny5EyaTqY1iA4DPP/8c77zzDm7dugWTydTa3r9//y7eXXtarpPBgwe3aQ8KCoKfn59VY+zfvx9vvvkmrly50ua9P35DLykpAZ/Px/Dhwzsdp6SkBAAwcuRIq+W3ho4+E4Zh8Je//AUffPAB7t6927oHDAABAQFtZIqOjm7zkNQR69evxwsvvIDS0lJERUVh27ZtMJlMWLduHXtvhMIZdMVmJx15qHXmtUYIYXUea+ZiGAZA8z5bTk5Ou2PPnj1WjWctnT3dPn7jsWa+nn6GYWFhePToUbv2lrbw8PAuz32875Pn+/v7d7iae5yVK1eisbERmZmZAICtW7di6NChGDNmTGufr776Ck899RQGDhyIjz/+GFlZWcjJycHcuXNbvy+uOHnyJJKSkiCRSPDBBx/gwIEDyMnJwerVq+26XrvC1muko4eJzZs3Y+PGjZg1axa++uorZGdnIycnByNGjOjRZ7hy5UoIhcLWVdtXX32FiRMnIjo62uaxKM6HrticRFRUFK5duwaGYdqs2m7dutX6dzYYOHAgACA4OBhxcXGsjNmVacbPz69Ds+WTK1BHMXbsWJw8ebLd55qbmwupVIohQ4Z0em5ERASCgoJw8eLFdn87f/48xo4d2+38s2bNQlhYGLZs2YIZM2bgyJEj+M1vftOmz/bt2zFgwADs3LmzzWf56quvWvEO29JynRQXF2PAgAGt7dXV1Vatsnfs2AGJRILs7Ow2SvvTTz9t02/gwIFgGAY3btzo9HNoudYKCgowaNCgTuf08/ODSqVq115aWtrmPXTF9u3bMWfOHHz88cdt2lUqVRtrycCBA5GbmwuTyQShUNjpeP7+/khISMDXX3+NNWvW4PTp03j//fetkoXietAVm5NYvHgxKioq2uzHmM1m/O1vf4NcLkdsbCwr88THx0OhUGDz5s1tTF4t9CSjhlQqBYAOb04DBw7ErVu32ox79epVnD592uZ5esLSpUtRWVmJnTt3trbV1NRg27ZtWLJkSZubd0lJSav5rIX09HTs378fZWVlrW2HDx9GUVERli1b1u38fD4fS5cuxb59+/Dll1/CbDa3M0O2rEYfXxHl5ubi7Nmztr1ZNIciCIVC/O1vf2sznrU3ZYFAAB6P12a1dO/ePezevbtNv5SUFPD5fLz++uvtVkQt8y5YsAA+Pj546623Wk23T/YBmq+Rc+fOtfEeffIzt0buJ1eU27Zta7cHm56ejpqaGvz9739vN8aT569btw43btzAL3/5SwgEglYvVor7QVdsTuIHP/gB/vWvf+Gpp55CXl4e+vXrh+3bt7c+Kfr4+LAyj0KhwD//+U+sW7cO48ePx8qVKxEUFIT79+8jIyMD06dP7/BH3xXe3t4YPnw4tmzZgiFDhsDf3x8jR47EyJEj8cwzz+Ddd99FfHw8nn32WVRVVeHDDz/EiBEjoFarWXlPXbF06VJMnToVTz/9NG7cuIHAwEB88MEHsFgs2LRpU5u+8+bNA4A2IQ//93//h23btmHOnDl48cUX0dTUhLfffhujRo3qMEatI1asWIG//e1vePXVVzFq1KjWfdMWEhMTsXPnTqSmpiIhIQF3797Fhx9+iOHDh6Opqcmm99sSZ/jWW28hMTERixcvxuXLl5GZmdlun7cjEhIS8O6772LhwoVYvXo1qqqq8I9//AODBg3CtWvXWvsNGjQIv/nNb/DGG29g5syZSEtLg1gsxoULFxAeHo633noLCoUC7733Hp577jlMmjQJq1evhp+fH65evQqtVtsao/ncc89h+/btWLhwIZYvX46SkhJ89dVXrSs+a0hMTMTrr7+Op59+GtOmTUN+fj6+/vrrdiu+9evX44svvsDGjRtx/vx5zJw5ExqNBocOHcKPf/zjNvFrCQkJCAgIwLZt27Bo0SIEBwdbLQ/FxXCSN6bb0+LuX11d3aZ9w4YNRCaTtesfGxtLRowY0aatsrKSPP300yQwMJCIRCIyatQo8umnn7bp0+IW//bbb7dpb3GF3rZtW5v2FnfwCxcutOsfHx9PlEolkUgkZODAgeSpp54iFy9e7Fb2lvf6OGfOnCETJkwgIpGonUv6V199RQYMGEBEIhEZO3Ysyc7O7tTd39731RF1dXXk2WefJQEBAUQqlZLY2NgOz4uKimojUwsFBQVkwYIFRCqVEl9fX7JmzRpSUVHR7bwtMAxDIiMjCQDy5ptvdvj3zZs3k6ioKCIWi8m4cePI/v37231GhHTv7k8IIRaLhWzatImEhYURb29vMnv2bFJQUNCpW/2TfPzxx2Tw4MFELBaToUOHkk8//bTD75yQZvf5cePGEbFYTPz8/EhsbCzJyclp02fv3r1k2rRpxNvbmygUCjJ58mTy7bfftunzzjvvkIiICCIWi8n06dPJxYsXO3X3f/JaIKTZ3f8Xv/hF63uePn06OXv2bIfhJlqtlvzmN78h/fv3J0KhkISGhpKlS5eSkpKSduP++Mc/JgDIN9980+3nRnFdeIQ4aIeYQqFQ3Iyf//zn+Pjjj1FRUdFqcqe4H3SPjUKhUNAc0vHVV18hPT2dKjU3h+6xUSiUXk1VVRUOHTqE7du3o7a2Fi+++KKzRaLYCVVsFAqlV3Pjxg2sWbMGwcHB+Otf/2pVWAfFtaF7bBQKhULxKOgeG4VCoVA8CqrYKBQKheJRuPUeG8MwePjwIXx8fGgGbgqF4hEQQtDY2Ijw8HDWKoXr9fp2dQJ7ikgkale9wdVwa8X28OHDdlngKRQKxRMoKytDnz597B5Hr9ejf5QcFVUdJ5m2ldDQUNy9e9ellZtbK7aWtFMzxanw4gnB5/MQOSwCjwRVCA2IwrS4KXbPodFpsO9INhLTkiER2x/bcjgvD/U1D5CYmmz30xghBPuOZUMokSJu3iy7ZbOYTNiZtRtB0dGYOW6U3eM1qBrw0Z6v4T1pKPhiUYd9vHgCPD18ArxYejI9X3wWqnuPkJa02K5xynXVOFt7pdO/88BDX2kYJvmPsGueFkxGE/ILDqOmtAayABnipsTAx1fOyti9AQsx43LdHlhg7rSPgCfEeL9k8HltK0eYDCZs3ZmBuGTra68dvpIHba0ac6YtslrGvXsPYM6EmfB5opzQ3bp6HCwsbn3N6PW4//s3WUurZzQaUVFlwd28KCh87PudqRsZ9J9QCqPRSBWbo2i5CL14Qgj5IoDHQwW/Fn1CBiF20Uy7x9fptcg8cRTpq1ZCKrX/JpOTdwkNdRVYtnoV+HaWhwGA3UezIZH5YHHCArvHsljM2JqzD2GjRmHO5PF2j6fXaHDkTA5mpy1GXmNNp/2mhkVBrmDnB2zQalFbXIbVq5fCS9R5JndrGOgjRZGlDGqTBgRPOg7zwAcPY8KGw1sos2seVWUtLl3OhlFrRMjgUDwbNw8CL/uvjd7IAK+xuK+92unfo6TjIJd2cK35AP59A3C3+jxGDOy4buGTJMyYia++2AKhWAyB0LrbaEJCPDKzD2FpwvI27dFSKS5X16JeqwPz2LXG9vaKwodvt2JzF9xasT2Ol8gLlgEEocF9WVFqBqMeO7L2Y0laMitK7fCVq6i8X4T0VctZUWr7Th4BYzFjSXKC3WMxDINtB3bCv39/VpSa2WjErswdSEpJhFSpBB6KkVddDh54AA8AAQgIJgT3waRg+00tQPN7yM7agZQli+xWakDzimxu8GQcr85DnbGhWXbwQMBAxPfCjMBxUAp7dl2YjSZcyc9G9Z0qSP1lWBwbC6W/ovsTKV3SRzoSFmJCue4mmlVC88VGAER4D0eEtPPV9eKZs7BtTyZGWJmHmcfjwX9wJE5ePozZk+OtOkemVIAwBLrGRng/thrj83hIGTkM+28UorKpCXwH+QtYCAOLncFdFsJtvcCe4hGKbUrCeNyqLoWP1BdzE2bbPZ7JZMS2zL3oGzUKch+l3eMdvVaAh3euI23Vcgi6qeRrDRlnT8CgaUJS2hK7xyKEYHvWbigjIjBv2mRWxtuVvQvBo4ZB5tv82c2I6IcxQWG4VV8NjckImVCEYX7BkIs6Nk/2hCOnM6CMCoEiwJe1MSUCMeJDp6HKUIeHumowhIGfSIG+0jAIeLY/+TZU1+HSpWzoG/UIGRyKdavT6OqMVXiIko1HqHc0avR3YWR0EPGlCJL0h4jf9TaCt8wbIm8RGmrqoQy0rvL4oilT8dWXW8FMZKzeVlgwNxZZpw8jdUFKm3apSITlY0fiYUMjih+Uo31FQ/thQNqsCHs6hjvgEYrtVvVdyCQKzE+yv5Cm2WLG1sw96NNnOKbNHmv3eE2NDSgrvoq0lcsgFNp/I888fwZNdTVIXZZqt6mCEIIdB/dCGhiA+TOn2S0bAOw/fRDSQH/MGz+uTbuPSIxJIeyszp7kXPEZGNQapCxgp5DqkwSL/REs9u/RuWaTGVevH0RVcQW8faVYOGMmfAPtf1iidI6YL0OEdKTN5yXMjsXeQxmIS1xrVX++QADfvqE4U3AcM0bPseocZXAgjBoNjHo9RO32qHgIVyrg7yXAbttEpzyBRxhc+XwB4lMW2j0Ow1iw7cBehIUNxoy5E+weT6ttws6D+5GyLA0isf0brQcvnUdDRTlSlqawYn/fdfQARHI5Fs6x3/EEALIun4CxsRGL581mZTxrMOr0eHS5EOlJi10q5ENdq8KxnO+Qs+dLAMDaValYkZRAlZoL4+PnA0IItGrra+ItnjEDNYWl7YqWdkVA9EBknT/SExHtgmHpP3fAI1ZsCxKts3F3BcMw2Jq5H0FBUZjFgjelXq/F9sw9SEpPgURqn4MBAORczUPN/TtIW7mUldiWPScOgi8QYPEC6zbLu+PQjXNofPAI6cvtX0laCyEEWdnb0WfKCAg78brkEovZ0rw6u10BsVyC+GnT4RdsnVmL4hosmjULh3L3Y/Z866pne4mEkAX74VzRacREz7DqnHkTJ2DLF9/BYjazsjVhLRZCYLEzg6K953OFR6zYWDHJZR+An18oZsfbb5IzGg3YdmA3ElOXQCq33+PvcMFVVJUUInV5OgQC+38I+84cgdloQMIi+70pAUDX2IjqG0VIS7c/hMEWjpw9AEV4EOYOG83ZnB3RWNeA44e34OCuz8FYGKxenoyVKYlUqbkhAaH+0DfqYdDprT4nITYW1TfuWt2fx+PBd0AUsi4e64GEFGvwiBWbPRBCsPNgFmRyP8xbZL9JzmQyYkvGTkQMGgW5wtfu8Y7eLMCjwnykrVwGL6H93n4ZF05Cr25ASloyKysri9mMPdm7kZy6xGq3ZzbILTkLXW0DVi5P5WzOx2EsFly9kYPKokcQycRYEDMdAaE924ejuBZ9Rkbi4oUMTJ+VblV/sVQCkcwbDdW1UAYFWHXOgulTseWLb8FMtt7xxF56k/OIR6zY7GHPkUMQi6VYkGi/Sc5sNmNLxk6E9RuGGdPG2D2eplGN8utXkLIsHUKR2O7xMi+fRVNVJZJTk1hRaoQQ7MraiYBhgyBlKRbNGox6Ax7m3cLSlETO99W06iacOLIVWTs+h1lvwuplyViVuoQqNQ9i7uhJaHikgtnUebD3kyyeE4uTuQet7s/n86GIjMDBK6d6ImKPYEBgsfOgis0N2HfsGAAeFibbb5JjGAu2HtiF4D6DMGum/bFgOk0TdmXvRdLSVIi9ve0eL/vaeTSU3UdqegprT4j7TmbBO9Af8ydPYmU8ayCEIPvgdkRMGsb5vlpB8WEcz96KOeMm46n1S5E4azaEYvtX0RTXgsfjIWxYOC5dybT6HJmy+cFOq260+pyFs2ag/s49mxxPKNbRaxXbgZOnYDLqkZBqX+oloNnxZMuBPfAP7YvZs+2PBTPoddiRuRtL0pLgLWPB8eTGJdTeKUHqsjRWgsOBZmcRU5MGi+fGsjKetRzLzYI82B/zRozldN68Kwfw6GY51q5KRWB4gEt5YFLYZ8Gkaai+UwWGsd4LcNHsWThxLtvq/gKhF2RBATh8M7cnItpMiynS3sMd6JWKLev0OWg0KixZar9JjhCCbdn7oAwIwdy5MXbLZjIasC1jBxYnJ0DqY382isOFV1F16ybSlqez5oHV4iySwrEp8PzdXDRV1WHJnNmczQkAZ07vQlNtI1YvS4YXh/uIFOfB5/MR2D8IV69bb170DQ6AUaODQauz+pyFc2JRW1jSExFtpsUr0t7DHeh1ii3n3EU0NFQima0A55wDkMp9ETff/jReZpMJW/fvQHj0KPj42u9R16iqR0V+PlKXpbPieAL811kkKSWRU2cRk8GA8gs3ON9Xu3YzB0atAcsTF3Pq8UlxPotiZuDRzYc2mQqDhvfHiQvWK0ORtwQimQwN1dU9EZHSCb3ql3rkwhXUVN9H6op0Vm5Su48chJdQjPhF1mUd6AqLxYytGTsQMnAoZk6x3/FE26jGnkP7kbIsFSKJ/Y4nLew5vBcB0QMhU3KX27B5X20HwicMZfW9dIe2UYMH+WVYutj+4H+K+yEUCaEMVeJ6sfXB1PPHToCmqh5mk8nqcxbOi8XBc44P2GZYOtyBXqPYjuXl49Gj20hduQx8vv37THuOHwEhBIuXsOB4YrFgW8ZOBPYdiNhpbDieaLAzew+S01MgltpfaqeFzIvHIBCJMH+q/fuItnDsQja8A5SIGzWu+84swVgsOJ69FUuTFtJ8jr2YxbNi8aCgzOr+PB4PAUP64uSlQ1af463wAY/Pg6ZB3RMRrcZej8iWwx3oFYrtxOUbePDgZnMsGAv7TPtPnYBRr0FCsvW1mDqDEIJtmbvhGxaJOTPt9y406vXYkbkTS1KS4C1nr57X0ZLLaHzwEEsWsxPUbS3n75xDU0UtkuexkyHFWk6f2ImwoWHw8eMujKG3YbFYoG3UoraiDpVlVSgveYj7RWUoL3mIivuVqHlYi/pqFZpUTdBpdDAZTDY5c7CBxFsMiY8Eqspaq89ZOGUqVKUVYCzWF/ZcMDcW2eesV4aUrvH4nfDGpgbcLy1A2qrl7CQhPncWGnUdUljao9uevRfygGDMm82W48l2hI0Zw6qp0Kg3oOLSNaSzZMK1FoNWh/KLN7FqVTqn+2r5RYdgNpgRP2k6Z3P2BnQaHe7cOoDK0gZYLAz4fB4kUiHEUiGEIgG8RAIIBHxYLAzMJgssJgYWc/O/zd//22JmwDAELZcDIcDjlwaPz4OXlwB8AQ99Bgeg/5BEu+VOiJ2N3dkHMH/JOqv68/l8+PULx6n8Y5g1dp5V5ygCA2DW6WHQWe94YisWAhbK1rAji6PxaMWm0TZh96EspK5YChELAc7ZF85DVV2O1BVLWVFquw4dgETmgwVx9jueWMxmbNu/AyEjRiJ2rP3Vr1sghGB39k6EjB0JkTd3FXMtZjOyMrehz9SRnMar6Zu0KLtcinVr0jib05OxWCy4V5SB+7eai832GRyAVakJEEscE//HMM2K0GAw4btdmeg/xP4x5UoZeDwemlRqyH2te2BcNH06vv1mO8gYYvW9wj96ILLOHUb8ZPv37DuCjT0yusfmZHR6LXYezEDy0lRIJPbvM+XkXULNw3tIWZ7Gyqpl7/Ec8L28sHCh/SY2i8WMrfu3IzB6CGZPsN/x5HH2ncyCPDQYc8eyO25XMBYLDmRsQdCI/pg7lD0l3e28DINj2VuQlrSQuvXbiaqmAWcPfonD2z+BVm3AsiWLsGFlCuZNmOkwpQY0r5ZEYiF8FFLIFGKo66wPmO6KxbGzcCE3w+r+XkIvyEP9cbbQ+swi8yaMh67ONscTSsd45K+3TfVrGQtJiB+rfs1KEuKTR2Axm5CYxE5w+LYDO+HXvx/mTra/1M7jtARhL1nomDpnHcFYLMjI+A4BgyMRP567jCYAcObULgQPCqXVrHuI2WTG7ev7UFZUC6lCjPlTZyAwxHlleiKjA3D7egbGz7QuU39X+AX7wagxwKDVQyy1znKREBuLrdv3AEOts8jweDz4DeqPQ5dP2iNqpzDgwQL7LE2Mnedzhcet2P5b/XokO9Wv85urX6euXMpS9euTMGiakMhC/bDHq1/HTbO/1M7j6JqaOA/CZhgGBw5sgf+ACMRP5NbzsqD4MIwaAxZNta70COW/NNSpcS7nKxzZ+SkYhmD9iiSsSk5wqlIDgOlDp6C6nJ0VGwD0Gd0XFy7st7q/SCKGWCGDqtL6GLX5UyejqbyiJ+J1C0PYOdwBj1qxta1+bb9reFNjAx4UX0PqiqWsOJ5kXTiLprpqdqtfB7BX/boFi9mMPVm7OM3Y36LUfPuFYeHkqZzM2YJeo0PppXtYt9o5lQLcEYvZgts39uF+YQ28ZSLMj5mBoFBfZ4vVBj6fD4W/BKqaBlYKvM4ZORGfX94Os9EEL5F15tSEObOx50A2Epestqo/n8+Hom+EHVJSAA9asTmq+nXy0lSWql9fgOpRGVLS2SkX01r9ei471a8fpyUIm6uM/QzDIDNzK5SRIVg0xX7vUFvnPpa9BWmJ8RBaebPqzTTWNyL38Nc4tP0TmI0WrFu2BKtTE11OqbUQOz4GxQUHWBmLx+MhbHgELl6yfjypjww8Ph8aVYPV58yfwe6DaguW702R9h7ugEes2BxV/XpJejIr1a8PXb2EmvslzdWvWUhCvOfEQfD4fNaqXz8O10HYhBBkZW2DT0QQFsc45gfdFefO7EZgvyBWnug9FYvFgju39qP0ZjXE3kLExcxAcKivWySCDgn3Q11OIwix3juxK+aPn4rPvtgOZpLF6t/yojmxyD55EIvil1nV31GfKxuKiSo2Dtlz+CACAvuwWv06ISURMrn9TgRHCq6isuQW0lYuY8fx5OxRmI0GJCUl2D3Wk7QEYS9dtZT1sTuCEILM7G2QhfgjYRr3MWM37hyFVqVFShx3zjHuRJOqCTcv70VdRRPCB/pjTfoSh3o0OgIejwffYBnqKutZqZnH5/MRPDAEV/KzMX6sdc5fykA/mHQGGLRaVjMBUTrHI0yRMrkv69WvfZT2JyFWq+rwsDAfqSvYSUKcceEk9A0qJCUlsP5U1xKEnZKWxEkQNiEEWQe3Qxboi8SZ9sfx2YpBq8fdC3ewnAUnHk+CYRiU3NyLwzs/xqVT2xHazxfPbUhHwsy5bqfUWpg9Pga3C6yvrdYdi2JmoKLwkU3JkYNH9Mfx89YnR3YEDOGxcrgDHrFimxtvf00wi4X96td7Dx1AynJ2q1+nLrXf8eRJuA7CJoQg+9AOePsrkDiL/T1Ca+Y/lr0Fg6YPoYVCv0ej1uDm5b2ofdiI0P6+WJWSAIk3t4VcHUVgiBKqGi1r5kiBlwC+ffyRX3gIo4fOt+qcuNHj8dXVrTAbjfASOedzpabIXgbDWLAlg8Xq11oNdmbtQfKyNHaqX+c3V79OW+6YlFb7TmZBHhbCWRB2zrHdECtkWBLLbZHSFs6d3QP/Pv6YNXisU+Z3FRiGwb2iDNy7UQ2BFx/9RwYhdf4Cj1vB8ng8KAK80VCrZm0vdfH0mfhuxz6MHmq9DIFDo3Ai7xDmxtgfv0rpGo8wRdpDs+PJHviHsFj9+sAuLElLZq/6dQm71a8f59CNczBpNFg0mxtz4PGLB8Hj8ZE0xzFpg7rj5t1jaKptRMJM5yhVV0DbpEPeie+Qs+U/UNfpsDxpEdYtS8KMYTEep9RamD5qMu7cZM8cKfYWw9tXipv3jll9TvzEyWgoq7QpOTKbWMBn5XAHevWKrTkJ8T4o/EIwdx47SYi3Z+zE4qTFkCnYq36dvoKd4PAnaamEvXz1ck5uaGcLT6HxUQ1WLndOvJhRb8Cd3NtYu4p9c66rQwjBveLm1RmPB/QfEYyUuPm95nMIj/RHzXH2grUBIDF2NnZkZGNYP+v68/l8+A+IwKmrRzFrPPcOS4SFPTJC99hcm5bq195yX8QtYK/6dVj0SPj42e991Vr9esVSh9jkWyphcxWE3VSnQmV+CeeZ+lto2VcbOG0IRBLP2DuyBp1Gh1uX96KyrAEhkUosS4iHVM5dMmtXgc/nQywVQtukg1Ru//YAAEh9pBAIBWisa4CPv3UmzkXTpuObr7eBjGNnv4/SMb1Wse0+muPy1a9Tl6U5rGL0nkPcBWGbDAbkHNqF5ctSnJZc+Pz5vVCGKhEbzV2xUmdBCMH9kgO4e70KhCHoNyIYSXPjev2NNHyAH+7eOoARE9NZGzNhdiwOnMjA3IXWZRYReAngEx6IMzdOYPoIbs3h1HnEw9l74igYxoIlKQvtHothGFarX+u1jql+/TiZF49BIOYmCJsQgqzs7YiYOAwSGTtPyrZy6/4JNFQ0YO2KFKfMzxV6nQGFV/ag4p4KgREKpC1aALmPcz5zV2TWyBh8tX0fRkxkb0xlgBJmvQn6Ji0kcut+rwmzZmHL1t3ACPbksAYL4cNC7Nsjo/XYXJSM0ydh0DUhKS3J7rEcUf16+4GdWJKyhNXq14/DdRD2kdMZ8AkNxLyRYzmZ70lMBiNKzhZjzQp2Upm5GoQQPLibiTvXq2AxMYgaFohn17NTWsnTEIq8AB5gMphYDfPoM6YvLlzIwMw51mUWEYpFkPjKkXv7DKYM4j7bTm+gVym2zHNn0dRQy271a/8glqpfGx+rfu2Y9E5cV8I+W3gK+oYmrFia7PC5OoIQgmMHt2DA5IEQezvGpOssDDoDCq/txaM79fAP80Hy/DgolDSrRXeERvniXvEBDB7J3jU5Z/hEfJa3HSaD0eqiuAmzY7FrfxbAoWJjwANjp1cjA/dYsvUaxXbwwgUXr369HSHDR7Ba/fpxuA7C1jU2ofLabaxabf/n3VMu5mVAHuCD2cPZrVPnLAghqHlYi5uX98NksCBqWBCeWZcGgYCuzqwldnQMdmQexOCR7I4bPjwCF/MOIGZailX9vX1kEIi80FSngtzfl11hOoHusXkYhy5dQvXDu81JiF2x+nXGdgQOGYLZE8faPV5ncBmEbTGbkZ29A6nJi53mLFL44CTqymqxbpX7l6Ix6o0ovLYXD+/Uwy9YhqR586DwtT9GsjcilUtg1JthsVggYDEudP74qfjs822wmC0QeFk37uI5s3HgaDYWL1rBmhyUZjxesR25eg0VpSxWvz51FBaTCYnJLFa/7tcPc6c4blXREoTNVSXsnCO7ETSsH+S+zqlEbdDpcftUIVa78b4aIQR1FXW4cWk/DDoTooYG4Zm1qXR1xgKBET54cDcLUYPYSyTO4/EQMiQUV/KzMGGcdeP6+CthMZmhb9JAInf8gwo7ziPUFOl0juYXoLykoDmzPkvVr/VNaiSnJbFW/VoRzn7168fRNTai5kYxlq1exslN/sTlQ+CLvLBwkuPeU1cwFguOZn6HQTOiIZG6X7yWyWBCUf5ePLhdB99AKRJmz4Gvv2MciXors8ZMRfbpE4gaxO648ZOn44uvdoCMtT5GLXjEABzPzUb8vDR2hemA5j02++4B9p7PFR6r2JoaG1BWdBVpK5exkoSY9erXOc3VrxfMctzmscVsxp6Du5GUmshJEPaF+xeguvsIq1azFydkKyeObEPokFC3ywNZV1mPm5f2QdtkRN/oQDy9JgVeVpq0KLbhF+CDxno9a0mRWxB4CeAXGYBrN3MwZvgCq86JGzUOX10phslggFDsWQ5OzsQjFVtr9etlaaxWv05dzk7WjF3HMiGSyhxS/fpx9hzai4Ah3AVhPzhXgBXLU53man7+wj54ibwQP4n72m49wWQ04fb1fSgrqoWPvzfiZ8TCP5CbquW9Hd8gKeqrVPAPsb881eMkzJiFr7fuwehh1ivNwKFROHExB/OmJ7Iqy5MwLOR6dBevSKcb7MvLy7F27VoEBATA29sbo0aNwsWLF3s83uPVr71ZrH6dspydJMR7ThwEj8fD4vh5do/VFZkXj0EgEXMehC12kvnv4qUMaGqbkBZv3ZOyM6mvVuFM9pc4tvtzgAdsWJWMFYmLqVLjkBmjJ+NuYRbr4wrFQsgD5Lh595jV58RPnIzGhzWwmM2sy/M4LXts9h7ugFNXbPX19Zg+fTrmzJmDzMxMBAUFobi4GH5+PXuKcvnq1+eOwmwwICmZ/erXj3O05BL3QdhhzgvCzrtyAOrKBqxMTXRZZxGzydy6OpMpxZg/dSYCgp3jXEMBQsL9UHukySFjL54Vix37MjF8gHX9eTwe/Af2wakrRxA70fUfzNwBpyq2P/7xj4iMjMSnn37a2ta/f/8ejWU2mxxS/Tpt5TJ2ql9fPAl9vQop6Y711GsOws7nNAjboNZgebr9mVx6wuVrmVCV12NlmmsqtYY6NW7m7YW6TofIIQFYvyKpOQMGxanw+Xx4y0VoatBArmTXI1Eq94aXRAh1rQqKAF+rzlkUE4Ovv9oGZjzDqiyPw4DfawK0nbqu3Lt3LyZOnIhly5YhODgY48aNw0cffdRpf4PBALVa3eYAAAtjxpb9LFa/bvq++vUydqpfZ1/NRVNFBSvelF3REoQdOm4Up0HY6ckJTlEqVwqyUHu/FivTEl0qhZTFbEHhtd3I2fYfFOTuxpyJ0/Dc+nTET51NlZoL0ZIU2REkxM7GhdwMq/vzBQIo+gTjzI0TDpEHACyEx8rhDjj1bnDnzh3885//xODBg5GdnY0f/ehH+NnPfobPP/+8w/5vvfUWlEpl6xEZGQkA2Jm9D0F9BrJW/XpX1l4kpaewUv36cOFV1JaUICU9xeE3330nMyEPC8GcMaMdOg/g/CDsK9ezUXO3BqvSl7iMUlPXNSL30Nc4tP0TmI0WrFu2BKtSEhEU6uts0SgdMGPEVFSWNThkbIW/DxizBdpGjdXnLJ4xAzW3SkHcJFbMlXHq4yPDMJg4cSI2b94MABg3bhwKCgrw4YcfYsOGDe36v/zyy9i4cWPra7VajcjISPgFRbJa/ToxNYmVJMSP11RzRKHQx8m5fhYmjRZLFs536DwtHDy8y2lB2FdvHER1SSVWLU1yulKzWCy4c3M/Sm9VQ+wtRFzMDASH+rqkWZTSFqHQCwIBHwadwSG5RPuM7osL5/cjdp51mUWEYhGkgUpcvJPLuiwAWKmAbaGmyO4JCwvD8OHD27QNGzYM9+/f77C/WCyGQqFocwDALBaUWkv164gRY1mpfq1RN9dUS1mW6rCaai3oGhtRc7MYKcnc7DOduHwIArHQKUHY127loLLoEVYtTWI1JZKtNKmacOHoNzi09WPotSasSV+CNWlLEBLmR5WaGxHa3xf3ihxjjpw9bAJ0Ki2MeoPV5yTExqL6ZqlD5GEIn5XDHXDqim369OkoLCxs01ZUVISoqChO5Wipfh0aPRIzJtqfHdVkNGDXwT1IWZrqsJpqLXBdCduZQdj5RYfw6OZDrFme7DSlVlqSgdtXKiAUCzBvynSExvtTRebGzBoVg637shDtoBSqESMjcfFiBqbNsC6ziETmDaGHVaJwBk5Vvz//+c9x7tw5bN68Gbdv38Y333yDf//73/jJT37CmQwt1a+DB0ZjFgvVry0WM7Yf2IXQESMhkTk+/xvXlbAfnCvA0jTu97UKig/jYcGDZqXmpIwc+bnbcP9mDValJmBtehLC+gRQpebmeEvFMJsssJgtDhl/3pjJUJXX2zT+wtmOSdzQYoq093AHnCrlpEmTsGvXLnz77bcYOXIk3njjDbz//vtYs2YNJ/M3V7/ehcC+AzB7mv1JiC0WM7bu3w7/AQMcmqm/hcyLR7kPwp7EfRD29ZIjeJBfhtVOUmqEEOQe+hpGgxmr0xIh8bau5hbFPQiOVOB+iWPMkTweD6HRYbh0JdPqc7ytrMRtKwzs94x0XDACuzhd/SYmJiI/Px96vR43b97E888/z8m8hBBsz9wNZWgE5sy0XzG0KrX+AzAvxv5q2t3RHIT9CEsWceMs0loJe8RYTuZr4cadoyi7Uoo1y5Od4n1JCMHJjM+hCPBG6vx4ukLzQGLHxKC8pN5h4y+YPA1VJZVgGHdRC+6P0xWbMyCEYEf2Psj8AxE3h50kxDsP7oNfVD9OlFpLEHZKGjdegS2VsBNjHZvb8klu3j2G0kv3sNpJSg0A8s9vh2+QDPFTZztlforjUfjKoFEbHOZmLxAIENgvENduHHTI+NbSEqBt7+EOuIeULLPrcCZEMhkWxLFzo96fexxe3hLETXe8lyAhBLuzuA/CXprCbWaPW6XHce/iHaxZngyhyP7MLz3hYVkWah82ImGm/QVlKa6Nf6gctY/qHDb+omkz8fDGQ6fGqDkrV+Q//vEP9OvXDxKJBFOmTMH58+c77Tt79mzweLx2R0KCbWkIe51i23MsB3yBAIsWspOE+FDhFTRWPELi4nhWxuuOfSczIQ/37CDsW/dP4E5uCVYvT4ZQ7BylZtQbce3UfaxIXkzNj72AmaOn4M6tbIeNLxQJoQhR4EbJUYfN4Yps2bIFGzduxKuvvopLly5hzJgxiI+PR1VVVYf9d+7ciUePHrUeBQUFEAgEWLZsmU3z9irF1lz92ojFCewkGjUaDKjIz0dyWgonN7/mSthaLJo90+FzAc6phF344CTunLuNNSuSIZI4x0mDEIIz2V9jZEwkdRTpJQSFKlFfZX2WkJ6QMCsWD651HKPLBS2FRu09bOHdd9/F888/j6effhrDhw/Hhx9+CKlUik8++aTD/v7+/ggNDW09cnJyIJVKqWLrjAPnTkLf2IBElp7ACSHYkbULYaNGOzwAG2gOwq6+UcRpEDbXlbCLHpxEyekirF6e5DSlBgDXL+6Ab5AM06KdUwWcwj08Hg9yXwnUdY0Om0MilUAkE6Oh2nEmz65g0xT5ZM5eg6F9ELrRaEReXh7i4uJa2/h8PuLi4nD27FmrZP7444+xcuVKyGwMneoVii3r4lk01lQhicUkxLuPZ8EnLAyx47kxCXIahF16Hqq7j5C6kLsSGo21Ktw+XYRVy5Mckt7IWh6VZ6OyrAFLZju2Xh7F9Qgf4Ie7hda75feExNmzcSHXMaEFXBIZGdkmb+9bb73Vrk9NTQ0sFgtCQkLatIeEhKCioqLbOc6fP4+CggI899xzNsvn8anGD166gPryMqSxWMYl+2ouzDo9liQsZGW87uA8CDv3OqeVsBvrGnDi0A6sXp4EiZMKlQKAyWDC1ROlWLd8Cd1X64VMHzYFn3+7B4hx3BxyXzlAAK26CVKF/flobYGdXJHN55eVlbWmNASa0x2yzccff4xRo0Zh8mTbw7E8esV26Npl1NwvQeoKdqpfA4C2UY2a28VISnFsGfcWnBKEzWEl7CaVGidytmPl0iVOVWqEEJzN+RojpvSBt5SmNOqNeHkJIBQLoNfqHTrPothZOH9uv0Pn6AiG8Fg5ALTL2duRYgsMDIRAIEBlZWWb9srKSoSGhnYpq0ajwXfffYdnn322R+/VYxXbkevXUHn7JlKXp7NS/RpoNgnuyt6LpNQkh2frB5wYhM1RJWxNQyOOZ2/DyvRESOX2lwiyh6tnt0HhL8X0YVOdKgfFuYT198PdQseaCv1D/KBv0sOgc6wCdTYikQgTJkzA4cOHW9sYhsHhw4cRE9P1snjbtm0wGAxYu3Ztj+b2SMXW2FCPh7euIWV5OivVr1vYkbMXgUOGwNvH8SZBZwRhG9QazoKwteomHMvaihVpCZD6ODZRdHcUF+yBpkFP99UomDUqBo/uqhw+T5+Rkbh4wfpCpGzAsJAn0tYA7Y0bN+Kjjz7C559/jps3b+JHP/oRNBoNnn76aQDA+vXr8fLLL7c77+OPP0ZKSgoCAgJ69F49bo9N06TGnpwMpCxPg4hFu+/+3OMQSaWcZBZxVhD2qtVLOdlb0jZqcDRzC5anJkCmcHyi6K54cC8T9wtrsGFlMt1Xo0AsEYIQArPJ7NDYzbmjJ+Gzy9tgNprgxVECAjbKzth6/ooVK1BdXY1XXnkFFRUVGDt2LLKyslodSu7fv9/uwb2wsBCnTp3CwYM9z9TiUYqtbfVr9lYBLUHYS1ctZ23MrvDkIGyTwYijB77D8pTFkCudq9TUdY24frYMG1YlO71gKcV1CI5UovT2AQwcluSwOXg8HsKGR+DS1SxMnrTEYfO4Ai+88AJeeOGFDv927Nixdm3R0dF2Z2jxmF+z0aDHjsxdSExZwkr169Zx9XpOg7BbKmFzFYTNZSVsxmLB4YxvMHDqoGbvMCfSWN+IM9nfYnV6IkROym5CcU1mjZmKhw5MitzCgokxqL5TxVmaLQt4rBzugEcoNpPRgG37dyBi2BjIlErWxmUYBjuydnMahO2plbAJITiesxVh0WGIHTre4fN1RZOqCaezvsXq9ATIfJzniUlxTXwUUug0Rodn4+fz+fCPDED+rUMOnaeF3lRB2z2k7IZdWXubq19PGsXquHuOZ8MnnAZhs0Fu7l5IFBIsmMhONYWe0tSgwanMb7AqbTHkPs71xKS4LgFhPqh5WOvweRZNm4GHN8sdPk9vwyMUW1D/QaxUv36c7Ku5MOv1WDiHGy/BPYf2ImDoIE6DsLmqhH399hE01TQiea5zvQ41ag1OHfgaK1MXw0fhXE9Mimsza8xU3LnpuKTILYi9xRBzlGbLAjbMke6BRyi2GVPGsTqe04Kwp3DjcZmVxV0lbF2jBqV5d7HcyVnytY1anMz4GitTFkGhpEqN0jX+QT5oqNVxsv+VOHs2zp91fMA2NUX2Yjw9CPvwqf3wCeemEjZjseBY1hakJy1yWk01ANBpdDix/yssT1oIha9zPTEp7gGPx4MiwBsNtWqHzyX3lcNLJISqyvGmz94CVWxP4NFB2LdOwtioReIsbsyrJw5vQ/iIPlD4O/6z7Ay9Vo/je7/EsiXx8PV3ricmxb2YPmoy7t7K4mSuxLlzHJ4c2VmFRp2Be0jJER4fhJ1fgvTkBE5MgpevZUIgFGDBBAdmlO0Gvc6A43u+wNLEePgFOE+5UtyT8Eh/VJc7fsUGAHKlDDweD5oGx5XNISzUYiPU3Z87NB3UArKVliDshEXceAlyHoSdtZ2zIOyiBydRebsSaU94XDaY6lFleIQGk+NjhAw6A47v/hxjZkXBP9A+pUaICQZzKfSmu7AwjrvxUNiCwGipgM50B0ZLJYCe7ZPx+XyIpUJom3TsitcJ86dNQ97lLFQbaziZz5PxiMwj3525hoF9whA7rD+kYtsLVLYEYaetWMZpEPaShdzsqx08vAtBw/tzEoRtMhhR/H2x0Bbzao2hAjcbr0JrbmrtJ/OSY6jPWASKQzobqscYdAYc2/MFRs+KwuQB9qy+Gaj159BkuAICU2urxGsAfL3nQsCn+3Wuht58D/W64zAzqtY2L74f/LxjIfGKsnm88AF+uHvrAEZMTGdRyvYQEFTLa1BcWoxHoY65B7FhSqSmSA4hAEpr6rHzfAH0RlO3/R+HBmGzByEER7O+w4ApA1tL0FQbHiGv/nQbpQYAGnMT8upPocbQfcFBWzDqjTi25wuMmh6JKXYpNaBeewiNhgttlBoA6M13Ud20BQzh5kmeYh060x1Ua/bCzDS0aTczKlRr9kBvvmfzmLNGxqCiVMWOgF1wqf4KipqKIY/wAb+myiFzsFm2xtXxCMUGAAwBGvVGXLtv241y76kcziphMwyDPQe5C8JuqldxGoR9/vxeKMN8MXvYBADNT6E31Je7PKe7v9uCxWzB8b1fYOS0SEwdZF/9OqOlAlrTzU7+SmAhTWgyXLFrDgqbEKh0x1r//eTfAKBed7SDv3WNUOQF8ACTjQ/MtlBvVOG+tgwAEDrUB/VF1DvSXjxGsQHNl+yNB5Xd9muhsb4OepUK8XO4ycuYcSYHyqg+nARhMwyDQ4f3IDV5MScel00qNerL67Fk1uzWtnpjDfSWrlc1OosW9Ub7f8iEEJzJ/goDR4cgZrD9RVm1xhtAlxvlBBpjgd3zUNjBYC6HmTSic8VFYGbUMJgf2Tx2cIQCZXcc5x1Zqr0P3vfXmlAqhETpGGcye0vWsFGBmyvcQ0ob0JrMgBVBlQzDYO/RTCQmceMl2KRSQVdTi4WzZjh8LgA4fj4bfv3CIPVx/D4QIQSnDu9AekJ8m8/S0I1Sa+3HaO2W4VruNvj4eWP2mOl2jwUAFqYJ3T3dM0TbbR8KNzR/X1b0I9b1e5xpIyajsqyh+449RGfRgzx2HfWZ4O+Qeagp0o0RewkAKxTVvjOHoezTBxIZNzf+/Uf2Y0kSN9k3NA1qND6sQcJMblaiFy/uh3/fwHYZ+0UC6/YsRXz7nlDvFu6DukbHaqFQPt8bXa/YAB5P3G0fCjc0f1/dI+DZnh/U11+OxjrH7aeK+aLWFRsAWkKJBTzqE+TzgGHhwd3202k00FRXI56j0jCZF4/CJzwU3j7cBAgfObYPKUsWcqJEDVo9au5VI3FmbLu/+YuCIeJ3rdzEfAn8RIE9nl/bqEXR5QqsYDlll1Q4DF2vxniQiYazNh/FPiRekRDwuk6VJuDJIPaKsHlsHo8Hb5nIYW7/faWRbVZsjoL5vgK2vYc74B5SWgGfB4i9vDAmKqzbvvtP5SA+Po6TG7/FbEbDvTLO6qvl3j4DkcwbMiU3Acnnzu5B1MT+HX6WPPAQ7dO1U060YnSbp1VbIITgbM63SE9YAC8vQY/G6AyxVwQkXv3Q8YqMBz5PArnIueV3KI/Dh6+k69+Yr/dM9PSWFxjhg/LSnld07nJscQBCJSE9/h1Yi4XwWDncAY9RbIE+MqRNGgGZpOs4Nm2jGhajEcqgIE7kyrxwFH4D+4EvYPfG2xGEEFRcu40lcXMdPhfQnOBYr9ZjzvCJnfYJ9+6LUcqJEPLb5ooU8kUYpZyEMElkj+cvvLob/iFyuwOwO4YHf1nC9yu3tj9moSAYQfJlEPBpii5XQioaCn/vBeA/YW7k87wR4B0PqTC6x2NPHjwBNQ8dF5w/2X8S+kojHa7cegseEaCdNnE4IkK7N0ECwP4TOVgYH+dgiZoxm0xoLH+EletXcTLfucJTkAYoOcnaDwDnTu9F4rw53fYL945CqCQStcZKGBg9xHwJAsUh4NnxXKVt0qH0Vg2eXZfa4zG6gwcv+EnnQ0GmwWC6DwILRIJgCAXWXWsU7pGJhkEqGgK9qRQM0YLPk0Ei7Ase7Huw9PWXo6lez5KU7RHw+BjvNxbDFcNwv6YMX+E71udgw/nDXZxHPEKx+Vvp+Zdx8ST4IiHkfn4OlqiZzHOHEDBkICcmT0IIKvNLsHJlmsPnAprd+80mM/xDrPss+Tw+gsTdm4mtgRCC3JxvkbZoPicb7QKeDFLRMIfPQ2EHHgTwFg5gd0weD3wvHswms0PT0kkEYvSRhjtkbMJC2RlCM4+4FpmXTqOpshJJSQmczGfUG6CpqsH8qfbHVFnD6evH4RMeCGEPUor1hHOn9nJm8nyS4oI9UARIERDs+BRhFEoL/iFy1FY4viAoxX56hWLLunwW6ocPkbo0lTNX2syzBxE4bAgnqzWGYVB94y4SY9t7JjqChpp68Pg8KP25Vyx6rR53C6qQNJcbczKF0sLkIeNRfu+Is8XoMfZXz24+3AGPMEV2BMMwyMm/gNq7dyCSyThVagatFnqVGsmJiziZ79TVI/DtFwYvjop55p7eh1SOqiA8ybmcbzF6ZhQEgl7xTEZxIYJCfVF/QuNsMXoMQ+zfI2PcJB+BRyk2QgjUtTU4dPkc9OoGyIKCkJKeApGEG2eKFg6cOoigET33wLIFxmJBbXEZ1q5bzsl8t0qPQ+QtglzJfWb72zf2QqaUYMpAx9fLo1CexMtLAMZCQAjhxBJD6Tkeodg06gZkXTgBbU0tJH6+mDMzBj7+/k65+HRNTTDpdJg7biwn853IO4SAQZGchBMAwL28u1iWvJiTuR5HrzPg9tUKPLPWcV6QFEp3KPy90VCrhm+g0tmi2AzDgvOIvedzhUcotpzzJzBvTiz8QkOc/iR14GQWFsWzl9qpKywmM+rvPcTa9Ss4me/67SOQ+ckglduelshezh/+FqOm92U9EJtCsYXACB+U3zsE30DH1mdzBC1VsO0dwx1wD/XbDUuSE+EfFup0pdakUoFYGPgEOCaJ6ZMcu5CNoGH9ONk7JITg/uV7WDKn+7g1tim5uRdibyErWfspFHuYMngSah7RKuqujkcoNlch69RBzlZrJoMBjeXVWDh5Kifz5d86BEWoL8Teji/G+jhGvRHFVyqQMp+bauMUSldIZWIYdWZni9EjaEotis2oa2vB8xJA5suN7f1YbjaCRw7gLPj7wbX7WBI72+FzPUnu4W8xMiYSQg4Ks1Io1iCWekGncb/q6S17bPYe7oB7SOkGZJ06iMULuFmtGXV6aKtVWDCeG+/AKwXZ8I8KhFDMTThBC3eL9sNLJMC06CmczkuhdEVAmA/KS3OcLQalC6hiY4EjRRchlHpzVpbm6JkDCBk9iLPg74c3yjssS+NITAYTCvMeIm2Bc+LlKJTOmDJkImrK1c4Ww2YYsFBo1E2cR6h9x04IIaguKERKehIn8+mbNDCoNZg/hpuSKZeuZCJ4YAgEHHsjnj/6HYZPiYBQRC9RimvhFyBHowMTIjsKwoJXJHETxUZXbHZy+GYuJH5KiKXcuMAfPX0ACRzlaLSYLagsrsCiaTM4ma+F0pIM8HjAjGExnM5LoVjD4wmRKa4JVWx2QAhBzY1iLJ7PjQu8Vt0Ii8EE35AATua7eCkDYUPDIeAo+BsATEYTbp4vR1o8NUFSXBf/YDnqKuudLYZN2G2GZKHsDVdQxWYHB6+dhiwkEEIxNy7wR09mIHE+N6s1s9GE2rvVWDhlOifztXDx2HcYOjEcIo4dVSgUW5jkhgmRqVckpVsO3cxF/e27WBzHzWqtsbb56dAnwJeT+c5f2I+IUZGcBr2X3T0Ai5lg1shpnM1JofSEoFAl6qqanC0GpRPozryNEEKw/3Q2DA2NWLZqGQRe3HyEx09nImkRN0HKRr0BDQ/rkTKPm/AFADCbzLh+7gE2rEzmbE4KpacIhV5gzO6VEJlW0KZ0SGNdHbJOHYQ0JBDpy1I4u6DP3z0HgVgImdKHk/lyz+1D5NgoTn+wece3YMi4MIgl1ARJcQ98/CRQ16mhDHCPhMi9KVckVWzdoNdocOjaGTSVV0Cs9MHCBfPgE+DHqQwVV4qRnsxN5W+9RgdNXROWLornZD4AKC/NhEFvwuwx3O7nUSj2EBDugwf3DkEZ4H4JkT0dqtg6wKg34FD+aTQ+eASBUAhFVASWr13OWWmYxzlXfBpipRwSuZSb+c7sQdT4fpzMBTSHFOSfKcP6FdzEAVIobBEzZBJ2Zh90thhWQ02RvRCL2YxDBWehvl8OwhAo+oYjfUUavITOM40RQlBx9TaWL+Nm30nbqIFRY8DsYRM4mQ8ALp3cgsFjQyHxFnE2J4XCBlK5BHqNydliWA1VbBzx2muvYdOmTW3aoqOjcevWLU7mZywWHL51Hg33ymAxmOATEYrklESIvLmtuN0ZZ2+ehCzYD2KO5Dl3eg8SOQr+BoCHZVnQNhqRvpDbAHAKhS0kMiF0Gh28ZdzXKKR0jtNXbCNGjMChQ4daX3s52MuQEAJVVRWOXj0Do7oJstBgJCxawFmeR2shhKDq+h2sXJnGyXyNdQ1gTAz8gnw5mc9isSD/1H2sWbaEk/koFEfQkhB50HDXN6XTFRuXAnh5ITQ01Kq+BoMBBoOh9bVabX0i0sa6ehy5egra2npIAwOwIHYm5P6+torLGafzj0HRJxhCMTcmutzT+7CEw9XaldNbMWBUCKQybuu7UShsMnnwBBw5fxqDhjtbEsrjOF2xFRcXIzw8HBKJBDExMXjrrbfQt2/fDvu+9dZb7UyXXaFVq3H46mloKmsgVvpgTswUKIMDXT7uhGEYVN+6h9VrlnEyX0N1HfhCPhT+3IQT1FeroK7TIyWOps2iuDf+gT5Q17lHbTa6YuOIKVOm4LPPPkN0dDQePXqETZs2YebMmSgoKICPT/ub7Msvv4yNGze2vlar1YiMjGzTx6DT4dDV02h8WAGhRAJlv0gkLJgHPt99kqycvHwYfv3D4cVRcc3c0/uQlsCNez8hBBeObMPqtASXf8CgULqDx+OBL2hOiMzV77WnENgfh0bYEcXhOPWbWLRoUeu/R48ejSlTpiAqKgpbt27Fs88+266/WCyGuIO8jGajEZm3LqCx7CF4AgGUfSOwbNVSzrKCsInFbEZdyQOsXbeck/lu3j0GsVwCmULGyXxF+XsQ0lcJqdw1HHQoFHsJDPdB6e0DGDjM9ffZegsudef39fXFkCFDcPv2bZvO23twD/wG9kPq0mTOEhI7ihN5OQgY0peTmDlCCEov3cWKtESHzwU0p826e70Kz6xN5WQ+CoUL4mNi8dm3e9BviIXTShi20ptMkT2yz508eRJr165FTEwMysvLAQBffvklTp06ZZcwTU1NKCkpQVhYmE3npS1PxaLYGW6v1MwmExruV2LRVG7qkF0vPgJ5oA8kUm5WT1fPbsfgsaHw4rhoKYXiSERiIaKGBqLg/A5ni9IltGxNF+zYsQPx8fHw9vbG5cuXW70UGxoasHnzZpvGeumll3D8+HHcu3cPZ86cQWpqKgQCAVatWmWrWB7B8dxsBA3rx8l+ICEE96+UYslsjmrJNWpRV9lE02ZRPJIFU2Jh0JmRs/U/KLm5F4S4y26UZ2LzHfTNN9/Ehx9+iI8++gjCx7JyTJ8+HZcuXbJprAcPHmDVqlWIjo7G8uXLERAQgHPnziEoKMhWsdyeC6Xn0VRVh/hJUziZ79rNHPhG+EEk4SacIO/4NiTPn0cdRigeCY/Hw9JFC7F22RKo63TI/u4jXD23FQadofuTOaI3rdhs3mMrLCzErFmz2rUrlUqoVCqbxvruu+9snd4jOXPrJKryS7B8OTcVAxiGQXl+Gdau5mavS1XTAAKCwBD3yIJOofQUsUSI5LnzwTAMjl09g5MZX0LsLcTwCUsQEOrvVNl60x6bzYotNDQUt2/fRr9+/dq0nzp1CgMGDGBLrl5BU50KR07sh8RXjpUr0zgLxr6Sn42A/kEQirjJg3n51E6kxsdxMheF4grw+XzMHTcDGAeo6ppw8MwB5B3XITI6AINHJLl8aIC7Y/On+/zzz+PFF1/EJ598Ah6Ph4cPH+Ls2bN46aWX8Lvf/c4RMnoUFpMZZ2+dRP3dh+ALBEhNXAipgrt0XozFgke3HmLDWm5KbZTfz4JI4gWFLzfhBBTrIISgoV4DVW0TNFXHYTYzEIkEEIn4ILJpEIm8IBJ7Qfj9/0UiIYQigVvFg7oKvv5yLE9cDJPJjCN5p3B4x6fwDZRi+IQk+PhxkxQBAAjhgdi54rL3fK6wWbH9+te/BsMwmDdvHrRaLWbNmgWxWIyXXnoJP/3pTx0ho9vDMAxyi06jrqQcZoMRyj4hSE9KgJgjb8THybucidAhoRBw5Jl460I5li9Z1H1HCqec3v8lhEI+AgIlGDlgCkQiAQwGMwwGMx41nIVezUBtsMBoZJoPgwUmE4OOfCL4Ah5EIn6zYhTzWxWkSMwHkU7/r2IUe7UqzN6oIIVCL8RPnQ1MBSof1ePQ6Z0wGszoNzwI/aMTHf6Z0EKjXcDj8fCb3/wGv/zlL3H79m00NTVh+PDhkMtdK4mwsyGEQFVZjdz8E9CrmuATEYSkhfMh9XHeysVsMqOqpBJPrV/KyXz372RA7iuBzIcGY7sS9ff2wcuLj+VLOk5APQS2mY0tFgYGgxlGgxkGoxkGgwVGoxnlqmsw1p1Ao4GByfi9kjQwMBotYJi2GpLH44HHA8RiAYQiPkRiQRtl+V8F+fhKUgiBwD0VZEiYH9akL4FeZ0TO+RPI2fIfBPVRYNh4bkpUeTo2K7YvvvgCkyZNwrBhwzB8+H8zf+r1emzduhXr169nVUB3o7G2Hmfzj0NbrYIsyA/xM2ZAEeDrbLEAABcv7kf48AjOwgkKLz7C6nRuKn9TrIMQgtwzVVi3jL0sGQIBH1KpCFJp2z3iQZhn0zgMw8BgsDQrSaO59f8PG67BWH8SWlOzUjTom1ePRiMDxkJa31cLfD4PQiEfQ4b5IjTatRWFxFuEJbFxILMITt04h3MHv4XRYHbIXNR5pAueeuopyGQyfPbZZ0hP/+8+TUNDA55++uleqdh06kacyT+Oxoc1kPjKMW/yFPiFulayZZPBiLr7tXhqAzeJle8V7Yd/qBzeUvcOmvc07l3Zif4DFe2UkCvA5/Ph7c2Ht3dbp6aBPVCQer0Z3+7aj9BoNiV0HDweDzNHxGDmCKCivA5/B/uVuekeWzds2rQJ69atQ35+Pl577TWWRXIPDFodzhacQENZJYTeYvgNCEfSvLkuu3dw/vx+9BnTlxNlSwhB0eUKbFhJc+e5EkaDCbduqPD8Om5q/DkLPp/fqrjNZovbZbqRK2jRUnvpkWJbu3Ytpk2bhtTUVBQUFODLL79kWy6XxGw04syNk1DdewQenwe//uFYuTLN5V13DTo91JUNSJ3Pjcv97et7ERqlhEjMTTgBxToKTm3D+EmBbrsvZSuhYd6oeqRCeGSAs0VxCagpsgtanvinTp2K3NxcJCUlYdq0afjwww9ZF84VsJjNOFd4GvV3ysGYLVD2DcXy9CTOYs7YIPfsXvQdF8VZ8HdJfiWeXpPi8Lko1tNQr4FKZUTqwt6z5zlmSAwu3TqI8MjemaLvSagpsgse36Tt27cvzpw5gzVr1mD+/PmsCuZMGIbB+dtnUVfyAEaNHso+wUhNXASJzP1MBPomLXQqLeYmTOJkvsKruxE5OABCF1/F9jYuH9uO5AW9q7BrWJgClUfdowgohV1svvu8+uqrbVz7pVIpdu3ahVdffRUnTpxgVTguIYRAXV2Lc9dOQFevhjw0AAnz5kDuq3C2aHZx9vQeRE3oz8lcFrMFpbdq8KyH7+G4G9W390Iu94K/f+8KkhcI+BAIeDCZzPRBC82rLXtNiR67Ynv11Vc7bN+0aZPdwjiDpnoVzuafgKayDt4BSsyPmQpFoJ9LeTT2FE1DI0x6E2KHjudkvht5O9F/eFCv2cNxBxiGQV5uNTasdG23d0cRGi5FZXk9+vTrfYnVn4QAHQbY2zqGO2CVYtu7dy8WLVoEoVCIvXv3dtqPx+NhSSdBn66EvkmDM/nHoS6vhthHinmTJ8M/PtgjlNnjnDu9F0vi5nIyl8lowsM79Xh2PV2tuRK383Zg8FAlJJLe6cgzLjoGuddy0KffameLQuEQqxRbSkoKKioqEBwcjJSUlE778Xg8WCwWtmRjFaPegLMFx9FwvxICsRB+A8KxZHYsJ5WqnUFDdR1AAN9AbjLqF1zYiYFjQl023KE3otcZcadY7fHu/V0REuKD6iq9s8VwCRjwwKMptf4LwzAd/tvVsZjMOHPjBFT3HgEAfPuFYsXyFHhxlNXeWdy8dwx3c0uwchk3q2ej3oiqMjWS5tAM/q7EtRPbMGlqcK9+2ODz+fAS8mE0mHp9+Elv8opk5Yq3tQ6bI2EsFpy5eQIZGd9h/75vwJjMSE9JwOpV6VgcM92jlZpBp8fZM7tReuke1q5KhTdHXpxXz+1A9IQwjzPlujN1NY3Qac0YH92+dmJvIzxCirp7B5wtRq/lH//4B/r16weJRIIpU6bg/PnzXfZXqVT4yU9+grCwMIjFYgwZMgQHDtj2/dnsPPLHP/4R/fr1w4oVKwAAy5Ytw44dOxAWFoYDBw5gzJgxtg5pN4QQ1D+qxLlrJ2BQa6DoE4zkhfPh7cSEw1xBCEF9RQ2uXMmBSWdE2PAIJM2Zw9lTul6rh6pag7Re5kruyhBCcPnodqQtplUVAGBc9DScyjvhNum1HAVDeOBxHKC9ZcsWbNy4ER9++CGmTJmC999/H/Hx8SgsLERwcHC7/kajEfPnz0dwcDC2b9+OiIgIlJaWwtfX16Z5bVZsH374Ib7++msAQE5ODg4dOoSsrCxs3boVv/zlL3HwIPs5zrojY883UEaGYFHsLPj4944qzY21KlwtOAR1RQN8QpRImD0bCn/uaju1cPn0dgybFEFXay5EReEeBARJ4OvrfnGXjiAoSI7aGrrPRggLXpE2nv/uu+/i+eefx9NPPw2gWX9kZGTgk08+wa9//et2/T/55BPU1dXhzJkzEAqbrWtPFrW2BpsVW0VFBSIjIwEA+/fvx/Lly7FgwQL069cPU6ZMsVkANlixMo3TYp3OQtuowdX8HNQ/qIPUV4q5E6cgMD7AaUpFo9ZA22jAtGjnfO+U9lgsDK7k1eKZ1SnOFsVl4PF48PLi03g2FlGr1W1ei8ViiMVtE54bjUbk5eXh5Zdfbm3j8/mIi4vD2bNnOxx37969iImJwU9+8hPs2bMHQUFBWL16NX71q19BYIOjn83fsp+fH8rKyhAZGYmsrCy8+eabAJrNH87yiPTk1YJBp8e1ghzUlNZA5C1CyOBQTk2NXXH51A4smctNOAHFOgpzt2PYSD+IRPQG/jjBIRJUVzT06ryRbDqPtCxuWnj11VfbJcSvqamBxWJBSEhIm/aQkBDcunWrw/Hv3LmDI0eOYM2aNThw4ABu376NH//4xzCZTJ3GUHeEzVd/WloaVq9ejcGDB6O2thaLFjXb8S9fvoxBgwbZOhylA8xGE67dPITqO1Xg8XkIHhSCtStTXCrZsrquERYzg8CQ3mH6dQe0GgPKSpt6tXt/Z4waNBX5t3MQHrnS2aI4DTYVW1lZGRSK/2ZlenK11lMYhkFwcDD+/e9/QyAQYMKECSgvL8fbb7/tWMX23nvvoV+/figrK8Of/vSn1vRajx49wo9//GNbh6N8D2OxoKDoCKpuV8JsMiOofxBWpiVCJHHNZMuXT+9A4tw5zhaD8hhXjm3F1Omel2iADcLCFDh8mu6zsYVCoWij2DoiMDAQAoEAlZWVbdorKysRGhra4TlhYWEQCoVtzI7Dhg1DRUUFjEYjRCLr7oc2KzahUIiXXnqpXfvPf/5zW4fq9RBCcOPOUVQWV8DQqId/3wCkLl4Aqdy1N/3rq1Xg83nwC+DeWYXSMdUVKjAMweiBM50tiksiFApgNjMghPRaxc+1V6RIJMKECRNw+PDh1sQeDMPg8OHDeOGFFzo8Z/r06fjmm2/AMEzrdktRURHCwsKsVmpAD+uxUXoOIQQNVXW4VnAYTTWNUIb7IXH2bPj4uY+SuHxyJ9IWU/d+V4EQgsvHdmJlSu8pSdMT/PzFqK9tgn+g+/zW2MQZXpEbN27Ehg0bMHHiREyePBnvv/8+NBpNq5fk+vXrERERgbfeegsA8KMf/Qh///vf8eKLL+KnP/0piouLsXnzZvzsZz+zaV6q2DiiqV6Nq/k5aHikgjzIB3GTp8I3yNftnh7LSzPhLRdCoZQ6WxTK9zy4vhvhfWTw8ZE4WxSXJixcivrSbPgHLnW2KL2GFStWoLq6Gq+88goqKiowduxYZGVltTqU3L9/v40jXGRkJLKzs/Hzn/8co0ePRkREBF588UX86le/smleqtgciL5JiysFOagvq4XExxtzJ01B0IJAt1Nmj3PzQjlWJi92thiU7zGZzCi4Wofn1qY6WxSXZ8zg6diTnYWBE5wtiXNoXrHZ6zxi+zkvvPBCp6bHY8eOtWuLiYnBuXPnbJ/oMahiYxmj3oBrNw6h5l41vIReCB4cgsRZsTbFYLgqpbczoPCXQiqnKwNX4eaZ7Rg91h9eXu5/fTkauVwMrdbsbDGcRm/KFdljxWY0GlFVVdUuKXLfvn3tFsrdMJvMKCg8hKqSKhCGIHhgMFYvS4LQg/JSEkJQmPcQazlKrEzpnka1FlWVOiTOW+hsUdwGb28vaDUGSGXsuKdTXBObFVtxcTGeeeYZnDlzpk17i7eRq5atYRvGYsH1kqOoLKqA2WBCQFQQliUvhsTbM38wd27tQ2C4DyTerhl+0Bu5cnQ7lsyf79amba4JDZeivjQT0uEpzhaFcwjsLxTqUYVGH+epp56Cl5cX9u/fj7Cw3pXRnRCCukfVuJZ/GLoGHfz6+CMlPg4yhWcnWy6/n4Wiy4/wDN3HcRnq7+2DUMRHcHDv9PDrKWMGx+DEhWOIGO5sSbiHmiK74MqVK8jLy8PQoUMdIY9L0lBTj2v5h9BYpYYiVIlFM2dCGeD5GTcIIbhyZisaarTYsDKZ5tlzEQghyD1ThXXLkpwtitsRGChDdZW+V8ez9QZsvlMNHz4cNTU1jpDFpdA0NOJqwSGoyush9ZMibtJU+If694ofg0atQXFBBipLVYiMDsS6ZUm94n27C/eu7ET/gQpIpdQsbCs8Hg9R/X1QenUn+o1Nd7Y43NKLbJFWKbbHMzn/8Y9/xP/7f/8PmzdvxqhRo1pLC7TQXZoVV8ag1ePq9RzUltZAJG1OOJw8d65LJBx2NHqdASXX9+Ph3XqIJF7oGx2IhFlzIRB4/nt3J4wGE27dUNF8kHawYMZ8fPTlToQP62VVtVkwRcKTTJG+vm0DiQkhmDdvXps+7uo8YjIYkf99wmG+Fx/BA0OwblUqBL3AfdpkNOHOrQyU364Djwf0GRyA9SuSqMnRhSk4tQ3jJwXSBw47EAj4mBQThKM7v8TEuKUICHLfh3FKx1h1Bzt69Kij5eAUi9mCgqLDqCqpBGOyIHBAMFYtTYKwFzy9WSwWlBYfQFlRLUxGM8IH+GNlymLq7egGNNRroFIZkbqQps6ylwnRsRgcpse+nN0wmRmMGOWHoEGebXJ3RkotZ2GVYouNjXW0HA6HYRjcKDmKqtuVMGgMCIgKRHpCPLxlrp1wmA0IIagur0FxfiY0agNCopRIW7gAMpqCya24dHQbkhfQHJ1soVBIsCY9GU1NBhzLPYK8858gqr8PBoxL8cgHPeoV2QWffvop5HI5li1b1qZ927Zt0Gq12LBhA2vC2QshBKrKWlwrOAxNnQa+EX5YMncO5L6eX22bEIL6KhWKCw5AVaVBYIQCi2bNhq+/5793T6T69l74+Ajh7+/ZoSXOQC4XI3HeIjAMg9yC4zi9/2uIJQIMnrgEIWF+zhaP0gNsVmxvvfUW/vWvf7VrDw4Oxg9+8AOXUGyNdQ24WnAI6u8TDs+fOg1+Qb7OFosTGusbUZSfgZpyNZSBUsyeMA1BoUqPNrF4OgzDIC+3GhtWJjtbFI+Gz+cjZvQcxIwG6uu0OHLuAK4cM2BwtBKRozwg3IXw7Hf+8NQV2/3799G/f/927VFRUbh//z4rQvUEXaMGVwtyUFdWB2+lZyQcthZtkw63r+9HxT0VpD5i9B0agJQ4mpHCU7idtwODhyohkXj+HrCr4OcvRfriRJhMFpy5chRHd3wBXz8xhkxKdlurB91j64Lg4GBcu3YN/fr1a9N+9epVBAQEsCWXTRza+zW8lVKEDA5FYuxsj0g43B1GvRElN/ejvKQOQpEX+gz2x9NrUqm3nIeh1xlxp1hN3fudhFAoQOykOMROAioq1Dh6dhe0GjOGjfBF2LDkXhEK5I7YrNhWrVqFn/3sZ/Dx8cGsWbMAAMePH8eLL76IlStXsi6gNQybF4HhESPhJ/J3yvxcYTaZcbcoAw+KasEQgj4D/bFuWRKEItc2kRCYYTTdgsFYAIY0gc/zgVg0EiJhNHguXmCCYRqhM12FwXQbgAVegjB4i8ZCKAjnZP5rJ7Zh0tRgegO1EkLMYMyFYEzXAdIE8HzAF44A32sIeDz7rrXQUAVWpSRBrzfh+IUjyP/2U4T3kWHg+BRWHLFarjVVU6HdY3UIDdDunDfeeAP37t3DvHnz4OXVfDrDMFi/fj1+//vfsy6gNVSbK3CmthZD5MMw2MezUn0xDIP7JQdQVlgLvc6EsH6+WJ60CN5S90i2TIgeau12WCyVAHgACBioYdY9gN54GQrpMvB4rvleTOYyNGh3gcCCll+0hWmEwXQLMnEMpOIYh85fW62GTmvG+OhZDp3HUyBED7N2BwhThZZrDVDDYnkARnAFXt7prFxrEokQ8TPjQWYQ5N06gQuHtoAHYOQYf/j3T+zRFsDj15qZcUxpHeoV2QUikQhbtmzBm2++iStXrsDb2xujRo1CVFSUI+SzipaHiKKmm1AIfREiCXWaLGxACEFdZT2K8g9AXatDcKQCS+LmuWXVao3+ECyW6u9fkTb/t1iqodEfgtzb9eKyCNGjQbunjVJrprlMk8ZwFl6CYIi8BjpofoJLR7Zj2RJa1NVaLPrDIExLur+21xqxVMOiPwIv70Wszcfj8TBxWCwmDgMaGnQ4mnsUF859gkFDlIganWK1JaXza43SU2xWbK+//jpeeuklDB48GIMHD25t1+l0ePvtt/HKK6+wKqAt8MDDHU2x2yo2dV0jigv2o6a8EX4hcsRNnoGAYPfNisAwjTCaitD5j5WB0VQERhILPs+1NuT1phsgMHbRgwetIc9hiu3B9d0IC5dCqfT8OEs2IEwjGHMxurrWGHMhCDMTPD7715pS6Y2UBYthNltw+soxHN1pvbNJ99cai/QSvWmzYtu0aRN++MMfQiptu3rQarXYtGmTUxUbAUG9sdZp8/cEs8mMG5d2oeKeCjKFGLETYhAW5xnJls2Wh+j+l8TAbHkEkdfgbvpxi8n8oJseBCZLOZrfH7vflUFvQsHVOjxHywRZDbE8QvfXGgGxPAKP77hrzctLgNiJ8xA7sdnZ5MiZXdDrzBg9LgBBgzquxtD9tcYO1BTZBZ2Ve7h69Sr8/T3beYNtCCE4k/0VgvooPNSjsZc8HrIEIQQPb+zGtSt1mDYzBF69IF8pe7jetRYaqsDq1CQczT2E+/eaEDTI2RL1HqxWbH5+fuDxeODxeBgyZEgb5WaxWNDU1IQf/vCHDhHSWnjgwU/knJCDnpB/fjsU/lLET5ntbFEcgpcgAv/dxO8MPrwEYRxJZD1Crz4wmG930YMHYev7s59GtRYXcrYiIFCM59amUqVmIzxBOLq/1njgcXytqVQ6FN1SYf6Kpzvt0/21xhLUK7I977//PggheOaZZ7Bp0yYolf8ttCkSidCvXz/ExDjWS6w7CAgGyNzjsai0JAP1lRqsXbrE2aI4DD7fByLhYBhNt9HidPFED4iEQ1xufw0AJMLh0OhPg8CMjn/NBFLxBLvnYRgGt85tR3lZE1IXLURAAE2Z1RN4fB/wvQaDMXd+rfG9Bjtkf60zLBYGW/cewLTFK7u0xnR/rbEFD/Y/iHmYKbIlVVb//v0xbdq0dnXYnEnLRz1YPhQhEtd7+n+SpgYNbp0vx1OrUzxiL60rZJL5sDAqWCyPu2A3/18gCIJMEudcATuBx5NAKU1p5+7fIrtUPNVux5GG+/tx9mQloof74tk1aR5/LTgagWQeiFb1hLt/8/95/EAIJPO6HoBl9hzMxIhRflD4dv2w0v5ao9iLzXtsj2f61+v1MBrbevM4o9BosCQcQwOGwd8NzJBmkxmnD3yNFSmLXD6wmg14PAkUslUwmm52EKA91KUDtIVekfCXPwWd8WqzqYh8H6AtHvu9GbJnGA0mXD66BSYTg3XLk2glbJbg8STwkq4AY771WIC2HHzhSPC9ou0O0LaF3IJjMJkY9BlpnQPQ49eann/LMUJRU2TnaLVa/L//9/+wdetW1Na290B0RqHRsb7jIRW5foxXi7NI9MTwbp/iPAkevCAWjoJYOMrZotgMn6+ATDITMsy0eyxCCMqv70b+1TpMnBqEiUPdvxyUq8HjeUEgHAmBcKTTZFCr9bhysQZxK56y6byWa43IJwK4wL5gvUix2eyG98tf/hJHjhzBP//5T4jFYvznP//Bpk2bEB4eji+++MIRMnoMLc4is0ZOc7YoFI5RN2hxdOfnqK3V47m1qVSpeSgMw2DLngxMXbSCOgA5EZsV2759+/DBBx8gPT0dXl5emDlzJn77299i8+bN+Prrr3ssyB/+8AfweDz87//+b4/HcGVanEWWzObWzk9xLgzD4MaZrcjN+g5J8xcgKW4xveF5MHsPZWHIMF/XrADQUrbG3sMNsFmx1dXVYcCAAQCa99Pq6uoAADNmzMCJEyd6JMSFCxfwr3/9C6NHj+7R+a5Oi7PIypTF1EGgF9Fwfz8OfvspvL0FeHZNGvV49HAu3jwOrcaMfmNcsxJDS9kaew93wGbFNmDAANy9excAMHToUGzduhVA80rO19fXZgGampqwZs0afPTRR/Dz87xqtWaTGaczv2l2FnH3QoUUqzAaTMjN+gr5V+uwbnkSZk+Oow80Hk5TkwEXc6sxecEqZ4tCQQ+cR55++mlcvXoVsbGx+PWvf40lS5bg73//O0wmE959912bBfjJT36ChIQExMXF4c033+yyr8FggMFgaH2tVqttno9LWpxFhvYyZxFb0DTqUX3nAFT1Bqjqmz1s/fxF8A+QQBoyD0o/mduY7h7PHEKdQ3oPLftqkxcsc21P517kPGLzt/Dzn/+89d9xcXG4efMmLl26hEGDBtlsSvzuu+9w6dIlXLhgnQfQW2+9hU2bNtk0hzO5lrsNygApZo5wbuC6q2LQm3Bi79cYPsoPU0bNgJ9fs2drba0GRQ8u4N7V/WhQGWGxMBAI+PD1E8E/QAxpyDz4Bchd6iaibtDi4iGaOaQ3cuBoNvoP9EFAkIsnLGdjj8xN9tjsvjP069evXTVtaygrK8OLL76InJwcSCTWFel7+eWXsXHjxtbXarUakZGRNs/NBaUlGVBVa7E23XMzi9hL3uHvMDkmuF29sfBwJcLD2wZum80W1NVpUfjgPB4VZeJGnREmowU8Hg8KpQh+/mLIQufAL0DOaa06mjmkd3Op8ARU9UaMnLnC2aJQHqNHiu3w4cN47733cPPmTQDAsGHD8L//+7+Ii7M+i0ReXh6qqqowfvz41jaLxYITJ07g73//OwwGAwSCtk+9YrEYYrFrFqV8nNbMIms8P7NIT6ks2gMvL77VRTS9vAQIDvZBcHBbr1KGYaBS6VD44DzqSg+h5JIBOp0ZPB4g9xE2mzSDY+EX6AOZXMLq90Ezh/RutFojzp+twryl693iu+eR5sPeMdwBmxXbBx98gBdffBFLly7Fiy++CAA4d+4cFi9ejPfeew8/+clPrBpn3rx5yM/Pb9P29NNPY+jQofjVr37VTqm5C20yi1BnkQ4x6E24dKEGz66xvywLn8+Hv78MMf5z2rQTQqBW61FXq0FR+TGU3TBA02QCAHh7e8HXXwx5SCx8A+RQ+ErB51vvR2XQm3DlGM0c0pshhGDL3gxMjw2FSOw66QW7hO6xdc7mzZvx3nvv4YUXXmht+9nPfobp06dj8+bNVis2Hx8fjBzZNjuATCZDQEBAu3Z3obdmFrGVy0e3YMq0YAiFjnt44fF4UCq9oVR6o/+A+DZ/02qNqKnRoOjBKRTdMUDdYATDEIjEAvj5f2/WDImD0v+/jiuEEDSqdagqPoDiwgZMignChGjqHNJbyT55EH0iZVD0cb3q75QeKDaVSoWFCxe2a1+wYAF+9atfsSKUu5J/fjuUATSzSFc01Gtg0Fswboh1JkhHIJWK0LevCH37zm/TbjCYWx1XSvP3Q1Xf7LgCAAwDKJRChEXIqHNIL+dayUlUVugQm7Le2aLYBnUe6ZykpCTs2rULv/zlL9u079mzB4mJiXYJc+zYMbvOdyalJRmor9JQZ5FuuHZiBxLmze++oxMQi706dFzprLgupfeh15tw5mQl5qa7x75aG6gpsi1//etfW/89fPhw/P73v8exY8da66+dO3cOp0+fxi9+8QvHSOniUGcR66itUoMv4Lmd5yD9TinAf/fVYmaEQCxxk321XopViu29995r89rPzw83btzAjRs3Wtt8fX3xySef4Le//S27Ero41FnEeq6d2omU+PZmbArFHTh0JgfBId7wjbLPMuU06IqtLS0ptChtoc4i1qMq3Q+p1Au+vt7OFoVCsZn8u6fw4L4Gc9I3OFuUntOLFJvNuSIp/6Ulswh1FumevPPVWDxngbPFoFBsxmAw4/TxCsQsXkXN0m4CVWw9pLQkA6oqLRJjaRma7qiuUEHuI4Rc7vrB9RTK4xBCsG1fBibHBHOa0cYh0LI1lK6gZWhs41buXiyYQR8AKO7H0dxD8PUTIWCA+3s7t2QesfdwB6hisxHqLGIb6gYtGIbA9/sExxSKu1Bd3YS7JY0YMWO5s0Wh2Ai9M9sAIQSns77C0EkR1FnESgpzdyFuxpzuO1IoLoTRaMaOjCzEJq+xKd2aS9OLnEesUmzXrl3DyJEjwefzce3atS77emoVbKDZWcQ3kJahsRaD3gRVvQHh4Upni0Kh2MSurExMnBIEqdy6yiMU18IqxTZ27FhUVFQgODgYY8eOBY/HA3msRnjLax6PB4vF4jBhnUmLs8jape5va+eK4os7MXKMv7PFoFBs4tqdUyCEIGhQkrNFofQQq+PYgoKCWv/d26CZRWzHbLbgQWkTFs+O774zheJC5OVWY0r8SmeLwTo8sFC2hhVJHI9Vii0qKqrDf/cGzCYzTmd+gxWpi6mziA3cv7YbQ4b50gcBiltxuegEfBRCyHw80ARJkyB3TXFxMY4ePYqqqiowDNPmb6+88gorgrkCrc4iE8OhUFKvPmshhKDwpgrPrbW/3hqFwiWXLtRgWsJqZ4tBsRObFdtHH32EH/3oRwgMDERoaGibJ3Iej+dRio06i/SMisI9iOwro6VdKG5FRYUaCqUIUpmbB2J3BvWK7Jw333wTv//97z2+9lppSQZU1VpahqYHFFytw5p0uvFOcS9OXDiOQRM8+LrtRYrN5gCN+vp6LFu2zBGyuAytmUWSaWYRW6l8VA+lrxje3rSsB8V9sFgYqOqNCAhSOFsUCgvYrNiWLVuGgwcPOkIWl4BmFrGPW+f2Yj5Nn0VxM3ILjqPfAB9ni+FQelNKLZvv3IMGDcLvfvc7nDt3DqNGjYJQ2PbJ/Gc/+xlrwnENzSxiH2qVBjweaGkaittRdEuFKfGrnC2GY+lFpkibFdu///1vyOVyHD9+HMePH2/zNx6P59aKjTqL2MfNc7swf+ZcZ4tBodiEVmsEIfBcp5FeiM2KzVMDtEtvU2cRe9BpDWhUmxAaSvcoKO7F6SvHMCS6F6R960UrNg/J7mkfTQ0a3LpAnUXsofjCLowaS9NnUdyPeyWNCB3qwd6Q30P32J5g48aNeOONNyCTybBx48Yu+7777rusCMYV1FnEfkwmMx4+0CBx3kJni0Kh2ERtrQY+CiGNufQwrLqTX758GSaTqfXfneFuqx3qLMIOpVd3Y+gImj6L4n6czDuO/mMSnC0GN9CUWm05evRoh/92d6iziP0QQnC7sAHPrUtztigUik0QQlD5UIuxs/2cLQo30D02z6f0dnMZmsRYGnNlDw9v7kFkPzkEgl57KVHclEtFJxDeR0YtDR6IzZtKer0ef/vb3zpNgnzp0iXWhHMULc4itAyN/Vy/Vod1yzx/453iedy6rsLomenOFoMz2HD+8Cjnkcd59tlncfDgQSxduhSTJ092O8XQ6ixCy9DYTf29ffAPEEMioemzKO6FyWSBTmvuXXvrvcgUafOdff/+/Thw4ACmT5/uCHkcShtnEVqGxm6uXq5D6kLqCUlxP85eO4YBg2jMpadi88ZIREQEfHzcM6cadRZhD1VdE7wEPCgUHliQkeLx3C5sQJ8Ryc4Wg1vYiGFzkxWbzYrtnXfewa9+9SuUlpY6Qh6H0ZJZhDqLsANNn0VxVxob9fDy4kPc20zohKXDDbBZsU2cOBF6vR4DBgyAj48P/P392xyuCM0swi5ajQE6rQXBwe65cqf0bk5dOo7o4b7OFqPX8I9//AP9+vWDRCLBlClTcP78+U77fvbZZ+DxeG0OicR2q5DNe2yrVq1CeXk5Nm/ejJCQEJdXFNRZhH2KLuzEqHGu+RBDoXTH/XuNGDp1qbPF4B4nOI9s2bIFGzduxIcffogpU6bg/fffR3x8PAoLCxEcHNzhOQqFAoWFha2ve6JjbL7TnzlzBmfPnsWYMWNsnoxrqLMI+5iMZlQ81CIpbpGzRaFQbKayUg3/AAn4/N4Xd+kMd/93330Xzz//PJ5++mkAwIcffoiMjAx88skn+PWvf93xHDweQkND7ZLT5m936NCh0Ol0dk3KFdRZhH3uXtmFYSP9XH6lTqF0xMmLJzBgbKKzxXB71Gp1m8NgMLTrYzQakZeXh7i4uNY2Pp+PuLg4nD17ttOxm5qaEBUVhcjISCQnJ+P69es2y2ezYvvDH/6AX/ziFzh27Bhqa2vbvUFXgTqLsA/DMCgpVmPGuDnOFoVCsRmGYVBbrUdAMHXzt5fIyEgolcrW46233mrXp6amBhaLBSEhIW3aQ0JCUFFR0eG40dHR+OSTT7Bnzx589dVXYBgG06ZNw4MHD2ySz2ZT5MLv45bmzWurMAgh4PF4sFgstg7JOjSziGMov7EH/Qf69EozDsX9uXDjBPr29+m99wQW99jKysqgUPz3AUEsZqdIa0xMDGJi/mthmzZtGoYNG4Z//etfeOONN6wex2bF5upJkKmziGMghOBGfj2eWtnLYn8oHkPhDRUmxq1wthgegUKhaKPYOiIwMBACgQCVlZVt2isrK63eQxMKhRg3bhxu375tk3w23/ljY2NtPYUzqLOI46i7ux/BIRKIRPRhgeJ+6PUmmM0MZD69N6EA184jIpEIEyZMwOHDh5GSkgKg2Rx8+PBhvPDCC1aNYbFYkJ+fj8WLF9skp0fdpa7lboNvEHUWcQRXL9diaQL1hKS4J2euHMOgaKWzxXA+HAdYb9y4ERs2bMDEiRMxefJkvP/++9BoNK1ekuvXr0dERETrHt3rr7+OqVOnYtCgQVCpVHj77bdRWlqK5557zqZ5PUaxtTiLrE1f4mxRPI66mkaIxQL49OKnXYp7U1Ksxpz09c4Wo9exYsUKVFdX45VXXkFFRQXGjh2LrKysVoeS+/fvt9mzr6+vx/PPP4+Kigr4+flhwoQJOHPmDIYPH27TvB6h2JrUWuos4kBuntuNBTR9FsVNqa/TQirzonvuTsru/8ILL3Rqejx27Fib1++99x7ee++9HgjWFo/4pnMPbsW6VUn0wnUAmkY9DAYLAgPlzhaFQukRxy8cxcBxCc4Ww+n0pnpsHuG3PXh8GHUWcRCF53dizLgAZ4tBofQIhmFQ+UiH0AiaAq43YdUSZ9y4cVab+JxRQXvasMmcz9kbMBpMqK7SIyXeNo8kCsVVOH/9eO+OXXscWmi0LS2umgCg1+vxwQcfYPjw4a2BdOfOncP169fx4x//2CFCUpzDncu7MHwUTZ9FcV9u3VBhyoKVzhbDJehNpkirFNurr77a+u/nnnsOP/vZz9pFgb/66qsoKytjVzqK07BYGNwtacQP1qc5WxQKpUc0NTXnL5TKqTdvb8PmPbZt27Zh/fr2brNr167Fjh07WBGK4nweXN+NgUMUNH0WxW05cfEohtK6a/+FFhrtHG9vb5w+fbpd++nTp3tUEI7iehBCcLOgHrMn0QTSFPeEEIKye00IGZLkbFFch16k2Gz2j//f//1f/OhHP8KlS5cweXKz00Zubi4++eQT/O53v2NdQAr31JTsQ2i4FEKhwNmiUCg94uSlI4iIlFGLQy/FZsX261//GgMGDMBf/vIXfPXVVwCAYcOG4dNPP8Xy5ctZF5DCPflX6rA8icb9UNyT66WnUXRThXnLnnK2KC4FdR7phuXLl1Ml5qHUVqnhLRVAJhM5WxQKxWZ0OhNOHn2E2JS1dLX2JL3I3b9H37xKpcJ//vMf/N///R/q6uoANMevlZeXsyochXua02fRvTWK+0EIwXe792PazBBIZezUB6O4Jzav2K5du4a4uDgolUrcu3cPzz33HPz9/bFz507cv38fX3zxhSPkpHBAo1oLk5mBv7/M2aJQKDaz91AmovrLoeyb6GxRXBO6YuucjRs34qmnnkJxcXEbL8jFixfjxIkTNo31z3/+E6NHj24tWhcTE4PMzExbRaKwRGHuLowdT9NnUdyPs9eOQq+zYOCEpc4WxWVp2WOz93AHbFZsFy5cwP/8z/+0a4+IiEBFRYVNY/Xp0wd/+MMfkJeXh4sXL2Lu3LlITk7G9evXbRWLYicGvQl1tQaMHTzL2aJQKDZRW6tB/pU6TJy/ytmiUFwEm02RYrEYarW6XXtRURGCgoJsGmvJkra1037/+9/jn//8J86dO4cRI0bYKhrFDm7n7cSI0TRRLMW9MBjM2LYvE7OS1sDLi4andAk1RXZOUlISXn/9dZhMJgAAj8fD/fv38atf/Qrp6ek9FsRiseC7776DRqNpzUH5JAaDAWq1us1BsR+LhcH9e02IGT3b2aJQKFZDCMGWPfsxOSYYMloEt1uoKbIL3nnnHTQ1NSE4OBg6nQ6xsbEYNGgQfHx88Pvf/95mAfLz8yGXyyEWi/HDH/4Qu3bt6rRa6ltvvQWlUtl6REZG2jwfpT1l+bswOFpJkx1T3IoDx7IRFiFFwIAl3Xem9CpsNkUqlUrk5OTg1KlTuHbtGpqamjB+/HjExcX1SIDo6GhcuXIFDQ0N2L59OzZs2IDjx493qNxefvllbNy4sfW1Wq2mys1OCCG4dV2FZ9emOlsUCsVqLtw4BlW9AdMT1zlbFPehF5kie1xyesaMGZgxY4bdAohEIgwaNAgAMGHCBFy4cAF/+ctf8K9//atdX7FYDLGYxqewSVXxXoT3kdH9CYrboFLpcOlCDeYt20CtDLZAFVvn/PWvf+2wncfjQSKRYNCgQZg1axYEgp7dKBmGgcFg6NG5FNvJv1KHVak07ofiHphMFmzZnYFpCSshFPb4uZzi4dh8Zbz33nuorq6GVquFn58fAKC+vh5SqRRyuRxVVVUYMGAAjh492q2Z8OWXX8aiRYvQt29fNDY24ptvvsGxY8eQnZ3ds3dDsYnqChV8FEJIpTR9FsX1IYRg6779GD85EApfmkTAVnjfH/aO4Q7Y7DyyefNmTJo0CcXFxaitrUVtbS2KioowZcoU/OUvf8H9+/cRGhqKn//8592OVVVVhfXr1yM6Ohrz5s3DhQsXkJ2djfnz5/fozVBs41buXiyYQdNnUdyDQ2dy4OsnRvDgZGeL4p7QsjWd89vf/hY7duzAwIEDW9sGDRqEP//5z0hPT8edO3fwpz/9ySrX/48//tjW6SksoW7QgmEIfP2kzhaFQumWy0Un8LBci9iU9kWOKZQnsVmxPXr0CGazuV272WxuzTwSHh6OxsZG+6WjOIxb53YhbsYcZ4tBoXRLY6MeuWeqMG/peuosYge9qWyNzabIOXPm4H/+539w+fLl1rbLly/jRz/6EebOnQugOTatf//+7ElJYRW9zogGlQHh4Upni0KhdInFwuDbXRmYunA5RGKhs8Vxb3qRKdJmxfbxxx/D398fEyZMaHW/nzhxIvz9/VtNi3K5HO+88w7rwlLY4fbFnRg5hqbPorg+2zMyMHKMP/wCfJwtCsWNsNkUGRoaipycHNy6dQtFRUUAmoOso6OjW/vMmUNNXK6K2WzBg/saLJ6z0NmiUChdcjT3EMQSASKGpzhbFM/BTVZc9tLjQJChQ4di6NChbMpC4YDSq7swZJgv3auguDTX7pzCvTuNmJ1GnUXYojftsdms2B5PafU4jwdoJycnw9+fmrpcDUIIim810PRZFJdGozHizIkKzElbBz7f5t0SCsV2xXb58mVcunQJFoul1fxYVFQEgUCAoUOH4oMPPsAvfvELnDp1qtNkxhTn8OjWHvSJktP0WRSXhWEYfLd7P2bOCYPEmyYOYJVelFLL5seh5ORkxMXF4eHDh8jLy0NeXh4ePHiA+fPnY9WqVSgvL8esWbOsCtCmcMv1a3WYF0MDsimuy+7sTAweqoQ8fLGzRfE4aNmaLnj77bfxxhtvQKFQtLYplUq89tpr+NOf/gSpVIpXXnkFeXl5rApKsY/KR/VQ+oohkVCXaYprcvLSYTAMQdToNGeLQnFzbFZsDQ0NqKqqatdeXV3dWvjT19cXRqPRfukorHHr3F7Mp+mzKC7KjfunUXhDhQlxq5wtiudC49g6Jzk5Gc888wx27dqFBw8e4MGDB9i1axeeffZZpKSkAADOnz+PIUOGsC1rF7jJp+0kGuo14PN58PX1dqochDAgxABCGKfK0RMIMYMQIwih1xrb6PUmnDjyCNMT17DoLNJ8rQHuea05gt5kirTZeeRf//oXfv7zn2PlypWtqbW8vLywYcMGvPfeewCaQwH+85//sCtpF5Spv0OYaAKU4pHggTpGPMmtXOemzyKMGmbjeVhMNwCYAXhBIBwOL9Fk8PiK7k53KsRcChjzAKa8uYHnAyIcCwhHgcej15q9EELw7e79mDYzBFKZ/bUWLYwaWsN56B671ryFwyEVT4bAxa+1JlMZqvVXUaN64GxR3B6bFZtcLsdHH32E9957D3fu3AEADBgwAHK5vLXP2LFjWRPQGsyMBrW609CZHiBUvgg82xeiHotOa0Cj2oTQUOf8qBmmDkbNdwCM+O/TsxkWUwEspmKIZCvB5/s5RbbuIKZ8wHAMbYp1kEbAeBKwlIFIEsDj0WvNHvYdzkRUPzmUfe2vCWhh6lCn+Q6EtL3WdKYC6M3F8JethMBFr7U6ww080p6GQwvDUK/I7pHL5fD394e/v38bpeYcmr8xrfkeGg03nCyLa1F8YRdGj3NeTKFJl422Sq0FBoABJv1B7oWyAsI0AobjLa/ad7DcA8zXuRTJ4ziXfxRajRkDJyxlZbwGXfYTSq2FZrOkWuea15qJacIj7ZnvXzlQc9A9ts5hGAavv/46lEoloqKiEBUVBV9fX7zxxhtgGGfbs3lQGa45WQbXwWQy42G5BhOHxTplfsZSDcI8Quf7HAyIpRyMpZZLsazDZIXSMtJrrafU1mpw7XIdJi1Yzcp4Zks1zJaurzWTpRxmxvWutXrDTWeL4HHYbIr8zW9+g48//hh/+MMfMH36dADAqVOn8Nprr0Gv1+P3v/8960JaD4GJUaH5sYKmjCo8tx0jRvs7LX0WYWqs7FcLCAIcLI2NMDXo9vGU1IEQQtOTdYLFwkCl0qGuToPbDy+jQWVAU6MJACAUCTA9cRVryQLMVl5rFkstvPiuda3pzXXgYilEU2p1weeff47//Oc/SEpKam0bPXo0IiIi8OMf/9jJig3f76/RG42qrglVlXonJzu28vLi9ThlqePgeaH5Ourqlyzo9UqNEIKGBj1U9VoUP8qDqs4IdUOz9yifz4NCKYKvnxiKiLnoO0oGmVzikM+M58bXGs+qa40FetEem83fcl1dXYfJj4cOHYq6ujpWhOo5fMiEtA4cIQQXcrZiaeJip954+V590XyJdeW+LARf0IcjiWxAMAAwF3fRgQd4DeBMHGdCCIFWa/p+5ZUHVb0BKpURFjMDHo8HuY8Qvn4ieAfFInqQHD5Kb85zPIqsvNZELnitKURRUJvuOFsMj8JmxTZmzBj8/e9/x1//+tc27X//+98xZswY1gSzneYbuK9knBNlcA1K8nagbz8fp8et8XhiCETjYTFeQGePegLRePB4LpgT0GsgYFQCRI1OH1OF4zkVyZEQQqDXm6FSaVH88GKz8qozwmi0AAC8pV7w9RPDz0+EqNGJGOUrhVDoOqsfHk8MqWgctMaL6Oz7kopd81pTiPpDpL0II2kCQGDUWxwyD48Q8OyMw7T3fK6w+cr805/+hISEBBw6dAgxMTEAgLNnz6KsrAwHDhxgXUDr4IEHAUJk8yEWBDtJBtegUa1FSbEaz7lIBn8v0TQQRgvGXIC2vkoMBMJR8BLFOEu0LuHxBCDeKYBuD0BU+K95mwAQAJKF4LnZtWY2W5rNhiot7lRchrrBCLXaBLOJAY8HiMUCKHybTYehQxZiqJ8cYjdKwSaXTAdDdNCb2l9rEuEoyMUueq1BgH6KBNxrPIDC+03IP6ZxzETUFNk5sbGxKCoqwj/+8Q/cunULAJCWloYf//jHCA8PZ11AawjwnopQ5WjwefYHeLozhBBcOLgV6QkLXabcB4/Hh8h7ARjLeFhMN0CIBjy+HAKvYeALAp0tXpfw+AoQ6ZrvXfvvAbAA/CBAOAw8F7zWGIZBY6MBKpUOdysvoaHBCLXKCIOheQUg8OJDoRBC4SuCOGAWBg6UQq7wdqmVl33wofBeAKloPPSmG2CIBnyeDBLRcHjxXfta8+LJUZwfiMr7FkxYOAffbbrtbJHcmh5d0eHh4e2cRB48eIAf/OAH+Pe//82KYLagEI/s9UoNAO5c2oHQcCkCAmTOFqUdfEEg+IJZzhbDZng8fvNemgvspxFCoNOZ0NCgQ0lFHhpUzY4aWo251TtT7iOEj0IIpVKEiKGLMFQp7XXlX7wEgZC7wbVmsTCoKK/D2esXUV+lQUhfJeLSfgJdkw7AR6zPR70ie0BtbS0+/vhjpyg2SrMJ8naR65ggKT3DZLKgoUH3/arrMhpURjSqTbBYmuOzJBIvKHybFZd/VBz6+Uod5mlIYR+1SoPT18+j8n4DLBYGgWE+GDRiEfzmcFDVnpoiKe4EIQTns7e4lAmS0jEMw0CtNqChQYc7Fc3mwsaGjs2FksBYBA30ho9SSovDuikmkxlnbuaiolQFdZ0eMoUYof18MTNhHYRi99m/dDeoYvMASvJ2ILyPzCVNkL0RhmFQUdGIkoqLUKuaHTQ0Tc2ByS3mQoVSBKVSiD7DFkHhK3MrJw1K5xBCUF/bhNPXc1FT3ggACOqjwPCJyVD4+Th1ZU1NkRS3Qd2gxZ3bajy7hpogXYHGRj2+252BoBBv+PmJENB/PvorZZDKxdRc6KEY9CacvpmLinsqaBsN8PH3RmiUL0ZMSIOXKznmUFNke9LSuq5qq1Kp7JWFYiPUBOlaXLtzCmdPVGBy/HL4B/o4WxyKgyCEoLqiAWeun0dtRRO8vPgI7qvE2OnpkCup1cQVsFqxKZXKbv++fv16uwWiWM/tizvQp68M/v70x+QK3Lpej5jFK6H0o9+Hp6HVGHD6+jlU3G+AQWuCX7AMfQfFYcy0AAgE7rH/SU2RHfDpp586Ug6KjagbtLhbosZza7teSVO4o1Ftgo/SudleKOzAMAwqH9bjzPWLqK9sgthbiJC+SkyeuwLeMjf9jqkpkuLKPG6CpPs2rkNz4l9qEnZXGtXaZlf8UhXMJgb+oXIMiF4Av1l+9Ht1M6hic0OoCdL1MJstEAjozc+dMJsteFRWi3M38tBQq4W3XITQfr6YtnANxN6emfDBXUyJ9kIVm5tBTZCuiVZrgrfUPfZaeiuEEDTUa3C6IBdV5WoQhiAwXIEhYxLgG6j0fOsHIc2HvWO4AVSxuREtJsilCYs8/0foZuj1JkgkVLG5Gga9CWdu5aKitAFNKj18/CQIjfLFrHEpEIpo7KCnQhWbG1F8cTsio+Tw85c6WxTKE+h0Jogl9OfkDAgh0OuMUDdokV+eD43aAE2DAbomI7yEfARHKjF6Sgp8/NwjBONg7mmHjEu9Iikuh1qlwb2SRmqCdFHois2xmIxmqBu0aFRpcf3RdTSpDdA2GsBYmu+0Ym8vyBQSyBRiRPSbC7lSDm+Z++XQzDx3CupKtWMGp16RFFeCEILc7C1YlkhNkK7KQ1U+eD7TnC2G28IwDJrUOqgbdCh4WPD9qksP0/eFTr28+JAqxJArJQgMmYmowTLIFFIIPCiHZvaF06h/UIcZcenYhm+dLY5bQxWbG1B8YTui+vvA14+aIF0Vvd4C36DeVR7GFggh0GmNaGzQIv9hPjQNBjQ16KHXNufQ5PN58JaLIFOK4R8wDWF9ZJApZBBJesdnejDvLKrvVmNewhoYNDqHzMFjmg97x3AHqGJzcdQqDUrvNuLZNdQE6coY9GaIe3m29sfNhQWPrkPzhLlQ4i38ftUlRp/+8yBTytzSXMg2h67korK4AnGJaxwbL0dNkRRXoMUESb0gXR+93gKxt2crNouFgaZRB3WL4mrQo6nBALPpe3OhUACZQgyZUoygkJnoP0QGqULqNimnnMGR/At4eP0B4pLWgU8/J9agis2FKTq/HVEDqAnSHdDrLW5feoYQAp3GgEa1DtfK86Fp0EPTYIBe919zodRHBKlCDP/A6QiLlEGukNG6Yj3k6PWLKLtairikdZzsFVKvSIrTaajXoKy0Cc+spuVo3AGziXGLYqBGgwmNDTqoGzS4/ugGNA16aBuNYJj/mgtlSjFkSgkiB8RB7iuDRErNhWxz7GYeSvPuYn7yOu5K29AAbYozoV6Q7okrfFcWS7N3YbOTRgE0DQZo1G3NhXKlGFKFGMGhsyCPlsHbx5uaCznkRNFl3D1/B/OT18KLBok7BKrYXJCi89vRbyA1QVLaQwiBtsmARnVzMHJTgwFa9WPmQgEPUrkIMqUE/gHTEN5XBrlSRrNsuAgni6+g5Ewx4pLXQijm1uOTmiIpToOaICktMV31tU3ILy9Ak0oPXdNj5kKpEHKlBFKFGFGD5kPuK4PYm1bodmUYhsHeo0fRUKHCvKQ1EEmckGSZekVSnEGrCXLJYnqTciMYhgGfz873ZTKZ8fm3e+DjJ4Hc1xtBITMxIFoOqUJKS6e4IYQQHL95CXfPlyA0OgzxqRt63W/7H//4B95++21UVFRgzJgx+Nvf/obJkyd3e953332HVatWITk5Gbt377ZpTqrYXIjC3G3oP1ABX183LWTYS9HrzRCL7d+jIoRgy94DGDwuDP2HJLIgGcUZGHQGHCu4iNr7tTBqDJAFyDFvyRqIpRKnyuUMU+SWLVuwceNGfPjhh5gyZQref/99xMfHo7CwEMHBwZ2ed+/ePbz00kuYOXNmj+Skis1FaKjX4MF9DTVBuiEGvRkiFhTbowd1EHsLqVJzMxiGQX1lPY7nX4K6sgFeIgH8+gRg2swUePu4UM1EFr0i1eq2+SzFYjHE4vbm1XfffRfPP/88nn76aQDAhx9+iIyMDHzyySf49a9/3eEUFosFa9aswaZNm3Dy5EmoVCqbxaSKzQVgGIaaIN0YHUsJkG9UXodvIHUYcgd0Gh2OXruI+rI6mAwm+AQrMGzQTPhND7TbZKx3UEotNomMjGzz+tVXX8Vrr73Wps1oNCIvLw8vv/xyaxufz0dcXBzOnj3b6divv/46goOD8eyzz+LkyZM9ko8qNhegMHc7BgyiJkh3Ra8zQeJtv2IzGSzw9YthQSIK21gsFtQ8rMXJ/EtoqmmE0FuEgL4BmDlvKasmRr1Gh117Mlgb73HYNEWWlZVBoVC0tne0WqupqYHFYkFISEib9pCQENy6davD8U+dOoWPP/4YV65csUtOqticjKquCQ8faPD0KmqCdFceqK5CzMKKzag395qkv+5AU4MGx65dRH15HRizBYpQX4waMRfKIH+HWFYMWj22btuNOXOW4Mzb37A+PptekQqFoo1iY4PGxkasW7cOH330EQIDA+0aiyo2J8IwDM4f3EpNkG6OQW+BOGCW3eMY9WaIvKlicxZmkxnHbuSh7n4tNHUaSBQSBEQGYM7ClQ6POTPqDdi6bTcip46E3Ffp0Lm4IjAwEAKBAJWVlW3aKysrERoa2q5/SUkJ7t27hyVLlrS2MUxzOQEvLy8UFhZi4MCBVs1NFZsToSZIz0Cv+//t3XlYVFeaP/AvS+1VICAILlHUiBoXUJSgRlFxwRX3dKcTdZzMZBLT6TDpJJ1Oa9KTxMw43UnmedJJd9Ldmc6YX0ABFXBHwX0XNS7ELUFFBAFro+5+fn8QKhJBq6hTVFGcz/PU80hV3VsvV6reOu8997wywvWef/AJnAQNG7G1G0IILHUWlJw5gbuV9QgC0KVHBEYkTYMxMrzdvmyKvIDs7Hz0GDUIyY+MAmeze+V12ntWpFqtxsiRI1FcXIzMzEwAjYmquLgYK1euvO/5AwcOxNmzZ5vd9+abb8JqteKjjz6677zeg7DE5iOsBBk4eF6m0rJGECS2oLCXCZzQOBX/ei04Cwd9hB5RvbsieeTM9luz8R6SICI7ZyO6Jw/EqD4p3n0xhTTePN2HG7KysrB06VIkJydj9OjR+PDDD2G3252zJJ955hn06NEDa9asgVarxZAhQ5pt36VLFwC47/6H8WliW7NmDfLy8nDx4kXodDqMGTMG//mf/4mEhARfhuV1TSXIxXNYCTIQ8JRW9icKYWs2UqYoCuqr72LvNydhqbqL4NAQRPSIxONj5kAfZvRpbJIoITtnI2KH98fo+Md9Gou3LFmyBDU1NVi1ahWqqqqQmJiIbdu2OSeUVFRUeGXhAZ8mttLSUrzwwgsYNWoUJEnCG2+8galTp+L8+fMwGPzo+g/KLh7egH6PhiE8nJUgAwHPd/yWNR1dY8sdDjazDScqLsJh5WCvs0EWZRi7mjCo/zhEPh7tNz3PZElGdk4+Yob0RUr/Me3zoj5aUmvlypUtlh4BoKSk5IHbfvHFF+6/IHyc2LZt29bs5y+++AIxMTE4ceIExo+//2Q8z/Pged75808vEuwI6mutqKpswLInM30dCkMJIWDLXbUDgRNgM9tx/PoFOCwOOCwO8HbeedGw2qCB1qSDLkyHwY+OhzEirN0XGnaFIsvIXr8RXQf1weMDxvo6nIDkV+fYzGYzACAyMrLFx9esWYO33367PUOiqrEEuR5PZs5kJUiG+QlZkmG3NMBmtuHkjW/hsDSAs3JQpB9a7qhV0IZpoQvToV/Px2EIN0Jr7FhraCqKguz1mxDZrwfGDGzbclFtFQQKk0eoROJ9fpPYFEXBr371K4wdO7bVE4W/+c1vkJWV5fzZYrG4NVPG1y4e3oBHE8IRFubbNeMYugiF5ouSJHeoD+i2IITAYXPAZrbjxPWLzlGXxDe23AkKDoY2TAutSYfe0SNgiDdCF2b0yaQOb1AUBTm5m9GlTxzGDklr/wBYo9H298ILL+Cbb77B/v37W31Oa+uRdQR1d1gJkmmdwIlQUVhv0teayoXHrl+Aw+wAZ72nXBgUBI1e4xx1DR4wAfpwI9TawG+5QwjB+vwCmHpEY9ywib4OJ+D5RWJbuXIlCgsLsXfvXvTs2dPX4VCnKAqO7WQlyEAkijJCVZ6PtDhOhEbn/xNQZEmGzWKH3WzHyevlcFgak5ci/3AhrVoFbbgOOpMWjz7yOPThJmgNuoAfjT4IIQTrNxbCEBOB8YmTfRYHazTaTgghePHFF5Gfn4+SkhLEx8f7MhyvuXBoPStBBiiHg84CyDwn+MWI7d5y4fEfyoXcPeXC4JBgaExa6ML06B09Avp+RuhMhoApF9JGCEFuwVboIsIwYeRUHwcD1mi0Pbzwwgv46quvsGnTJphMJlRVVQEAwsPDodMFxlT4ujtW3L7lYCXIAMXzdHqx8Q4Raq33346EkJ/MLuTAWRzgG35aLtRBF6bFkIQ06MONUGnUrNrgJkII8rZsg8qgRdroab4Op1PxaWL75JNPAABpaWnN7v/73/+OZcuWtX9AlLESZOBzOERodZ6/jcrrLsJkenhXYXcInICdJw7DXm8Db+V+LBdqVD8kLh0G9E6FLswInVHP/kYp27hjJ0JUKkxKneHyNoQQFG3b6ZV4gghBkIeTPzzdvr34vBQZyM4fXI8BA1kJMpBxnAiNxvPzRwInISKSzjVX5joLtu7dC97GodujsRiRNB36MCNCQn1f6uwsNu4qBlEI0ie41zS2YOsOBId66WNZ+eHm6T46AFYY95K6O1ZU33Zg2ZJMX4fCeNHN+jMIMnl+ka3Iy1QWQLZb7MjdvA3jJs9HeNcIj/fHuG/z7j2QOAFTJ2a6tV3B9l0gBMgYMwV7sdY7wXUSnXeqkhc1rQW5cGYGK+8EOI7SOpECJ1FZJaNwTwnGTZrHkpqPFJSWgrfaMXViplvv/cJdeyDzAuZMcL1s6a6mUqSnt46Ajdi84PyBHAwc3AUmEytBBjqek6ClMNKi1bKGs3EIj2555R7Gu4r274ejzoLpUxe6ldS27C6FaLMjM32ud78Is1mRTFvV1lhQXc1hxsTpvg6FaQc8r1C5/kwSZYSq2duxI7LW3kXhrt1Q6bVuJ7WtpfvA1Zsxb9o8Vt2hiL2TKGqaBfnz+bPYH2knwXF0erEBYH8zHYgsyairrEbxkSMAgInjZ8EQHubWPrbtO4iG6lrMz1jQPv/3bEktpi3OH8jBwMciWAmyE5FEBaEq/5htGOizjH3NdteC3WUnYa28AygEhthIpI3NgKFLuNv72n7wMGyVVZg/w70RnifYyiOM22qrLaipYSXIzoYQQuWDiUZOkgQJIX6SZAOBJIgoPnMKlhvV4Mw2aMIMCOsZgxkzFiNU3fbzoTsOH4Gl4iYWzFjYqZca8yaW2CiQZQXHdrESJNM2jcnR8/0IvAAVpbJoZ0QIgbXOjD1lJ2G7VQsEB8EUF4UnRk+BPjyMynt717HjuHulAgtnL27/pqesFMm4g5UgGU8IvAQVhYkjAicgVMPe0u4QOB7FZSdhuVkNwc5BF2FCWM8YTBg1FSGUL5QuPnESteVXsHD2Ep908g5SGm+e7qMjYO8CD9VWW3DnDoeZk1gJsrNRFIXKt3haCyDznIBQNmJ7IEII7t6uRcnpk7BX30WwKgRhPaIxcdxM6ExGr73u7lNluHP+EhbOWUI9YTL3Y0fYA00lyKcWzGYlyE6I52UqCyBzDhEaCutNCpwAFYWLxQMNZ2tA8emTsNysgcyL0EeFIznhcYSP6douI6fdZadRffYCFs72cVJjpUjGFef252DQkAgYjR2z+SnjGc4hQkOhZY3Ai1BRKCGerb6KnhHDPd5PR6UoCjhbA+xmG458dwmOOjO4uzao9FqYekRjyqRMaPTt2zVkz5mzqD59HgtmezbhhAp2gTbzMLbKLair4zFrMitBdlYOjk4vNo4ToaaQ2ERegkobuF+yGlvu8Ggw23Do2rcQrA3gbQ0QGzgAjdcBqvRaaMIMUJv0GJecDkOXcJ9VU6y19ag6dRYLZi2GSuP6/8v+M+e8GFXnwBJbG8iygv0lt1gJspPjOTojtku15egSkerxfiRepLLepC9JooQGiw0NZiuOfn8ZvLUBgs0BojS13FFDE6aH2qjHiH6joDMZoTH4X8sd+10zCgu2YP6sxVBrXZ9UZq2rx+1vvJPYWNsa5oHO7c/B4KGsBNnZ3bh7GlodhVIkJ0FNYZ1IkReh9vPE1rxc+G1j4rI2QBYlAEBwaAjURj00Jj2Gdh8GnckIncnok1mEbdVgsWLzxkLMm7EQGjcaJtvNZhQVFCFz2hwc/9vn9ANj59iY1lhvFrESJAPgh+W0Isd7vB+Bk6DWeZ6QJE70eSmSEALBwcNutuLwd99CsDrAW+0QHTyAxnKh2qCD2qTHY7GPQdfbCH2YyffnnyhxWG3YlLcZmRkLoDUYXN6uwWJBwcYCLJwxv6PkDr/GEpsbZFnBgZIqPLWQlSAZgHfICKeQkARegprCNH1FIe3STFQSRNgtNjgsNhz97jJ4q72xXPjDJ7JKq4HapIPaZMCI/qOhDzNCrdMF/HuGszdgY+4mzJ02Dzqj65cOOGw2bM7fjAXT50GrN8Bht3snQALPG4V2kKTLEpsbvtmfjcHDWAmSaUStFxtPpxRJmyRK2Hb4YGO50NIAWfqxXKgx6aExGTC05/DGcqHR0KHKhbTxDQ7kr8/HnKmZ0Ie5vhgyZ7djU+5GzJ+e6VYybAt2jo25j/VmEe7WCZg9OcPXoTB+gqeU2BSZIMTPkoIiy8hevxHhvbohdeh46EzGgCkX0iY4OOStz8fs9DkwhLu+IDLf0ICNG/Ixb8oc6I0mL0bY+bDE5oKmEuQvFs0J+HIK4zqep5PY/I2iKMjJK0BU/54YOyTN1+H4NZHnkZeTj9ikoTBGuN61XOA45K/Pw9z0WW4lQ48QUJg8QiUSr2OJzQVn92XjseGRMBjYN1bmR4TAb1Znl2UZNL5yEUKwYVMRTN27sqT2EJIgIDc7D90SH8PEfkkubyfyPPJzchE3fDhMXVxPhh7rRLMi/eNd6ccsN4pgrhcwLmmSr0NhAhSNIoDIiwilMHo019QhKCgI45PSPQ8qgEmiiA3ZeYgZOggT+49wfTtBQF5OLroNGYLJjw7zYoSdGxuxPYAsKzhY2liCZBhvkGUFQcG0FlL2PLHxDRw0Xbw7iaGjk0UJudl5iB48AJMGJLu8nSSKyMvORcygQUhPSPRegK1RAI+H9Wx1/47vzN5sDGElSMaLeIdAZzktjs6I7cSt71iHgAeQJQm5OfmISuiHyQNHu7VdXk4uohMSMGWQ6yM8mjrTrEhWimyF+XoRrGYBY1kJkmmBKMoICfV8pMVxItRaSiv7U+jpJvEiBkYkeLyfQCTyPDZ8nYuI/n2QPvhxl7drSmpd+/XHlMdGejFCpgkbsbVAkmQc2stKkEzrOE6k0rKG5+iM2E5XX6EyYpN5ESo2rf8+Is8jNzsPMcMGYdKjrpcfFVlG/vp8RPaJx9Sho7wYoQs60eQRlthacHZfDoYmshIk0zqOk6is7M9zEtQUerGJvIj4bq5/4LZG5n2/LJe/ETgeeTl5iBk2GJMedX3EpSgK8jfkI7xXL0wbnuLydk0LPlPHElvn1VSCzJw6w9ehMH7MQakX27e1F2E0un6upjUSJ0JNISFJvOBWi5VAxjc0YNvuUjjq7qLb8Mfcmv2oKAo2btgIU1x3ZCS53rlBURQU5G9uS7jMPVhiu0dTCfLpxawEyTwYz9PpxSbwErpEUFgAWZCgorAslyyICPXzDgHeJDg47D5xErbKKiiijKiB/TAnbZZbCzMQQrApbzMMMTGYMXKsy9s1JcOwmNi2hO5KYGzE1hmd3ZuNoYmR0Os77xubcc3N+jOAcYzH+6HWsoaj04uNEOI3F523B0VRYK6+g70nTsFRV48QlQrGuBjMSpvp1ur8TQgh2JRfAF1EBGaOesKt7TbnbYYpKhoTh43AFrdf2QVsun/nY64ohNUiInPaTF+HwnQAHCcjLIrCyv6UEpskSFQSWxCV9Uv8G2dvwJ7jJ2C7VQ1ZFKGPisCEwaMQ1rWrR0mdEILNm4ugNhkx6/E097bLL4AuPAIzHn8CjgYvre7fibDEhsYS5MF9t/EMK0EyLuI4GdEUrvcSeRkaSiv7s3VMWyZLEu5W1WDfyVPg7poRqtXC2L0b5k6Z61Z364cpKNqGUK0Wc8ZMdnkbQggKNhVBozdi1pgJ1GJpSWe6jo0lNgBnSrMxLCmKlSAZl/GcDI2OQmITJIRSuP6so5z78DZFluGw2uCw2nDo/EU47tSCEAJ9dBQmJY6FKTLSK18ACrfsQHBwMOaOm+LWdkUF26DSaDH7iXa4XpadY+s8zBWFsNskjBk+0dehMB0Ix8nQUhhpEeI/Iy1JlBAU6t/n1wgh4BsccFisOHzpEkR7AwSrHTIvAACCgoOhMuigNhqQGj8EEY93Q0iodz/mirbvgiJLmDfRvZnURYXbERQcjDnj2bqctHXqxMZKkExbSaKCUJXnsyJp5DRC6Vu0yPF+MSNS5Hk0WGw4cukSBJsdgs0OscHR2DIlCAjVaaE2GqAy6DF+4Cjow0xQaTQ++YKwdeceSA4O89Pdmzm5desuKLKMee3Z31EhQJCHfysKG7H5PVaCZDzhTyOtEApJVhREhLTDOpGyJDnLhUcvX4Zoa4Bob4AiyQCAYFUo1EYD1CYDUuOHQm8yQWMw+N1szW2794K3WrFgqnt9Grdt3wOR5zA/fWb7/g2xUmTgu/s9K0EybUdjlERrpCVwApWFi0WOR4iaXmITOB4lp8rA3TVDsNog8yKAH8qFRj3URgNGdR8AvckEncnk9ZIhTdtL98NRV4eF0zPdSk7bd5aCt1mxYNpsv/liFIg6zl8SRZIk49D+21i6ZK6vQ2E6MVGQqCxcLHACVBTWiRQoliIJIchfvxGmHrEYPzAZ+rAwn5ULadu57yDst6uxMGOeW7/PzuJ9cJjrsXD6XB8dBwojtg7SQrtTJrbTJdkYPiIKOgqz2pjOhxBC5YOJ40SoKC2kTGPEdqLyewyMeNTj/QDA9v0HoY/pihkprk997wh27T8MS2UlFs1Y4FZpdNeeA7DW1mBRhnsjPKo6USnSv4rW7eDu94VwNEhIHcZKkEzbcJxEZ2V/h0ClZY3Ii1BR6BAgCyKVdSIFjkf91e8xMzWwZvsVHzyKu9crsChjvltJrbj0MMy3b2FRRqbfnScMVJ1qxCaKEitBMh7jORFqjecfUDylEduZ6qvoET7U4/3IPJ11IrfsKEbMkEEIDvH8d/MXuw8fR921a1g8e6Fbv9eefUdRf7MCS2a5N8LzCoXA41JiB5kV2am+PpwuyUbiSFaCZDzj4ERodZ5/aHOcCA2Fc2MixZX9aazEwZutmJTgeQsdf7Hn6EncuXIZi2ctREiI62OBkgPHUXv9GhbPmu9WMty/70Rbwnw4otC5dQCdJrHVf1cAjpPx+FBWgmQ8wzlEaCmUEC/VldNpWUOphxqtERvgP5dCeKrkeBlqysuxeOZCt2Ztlh48iZrvLmPxzAVuJcPS0mO4c+taW0Jl7tEpEpsoSjh8oBoLZrAea4znbtw9TaUXm8BJUOsorOzPi1BTSEiKJHeoKffeVnryDG5fOI9FsxYiVOX6yHrv4TLcvnKxMam5cTz37j2B6uuXMX+alxaMaJo84umtA+gUf8VNJUgthbIPw3CcDHXEeI/3I3ASlQWQJV5iIy3KSsvOoursWSyavQgqtevHdt/RM6i6dB6LZ7uXDPftP4Wq78vx5OwFEAWhLSE/HDvHFjjqrrESJEMX75Cho7BaDa2WNYokI1TlH99RCSGe9/zyMVt9PW6dPo1FsxZC7cYs0f3HzuLWxbNYNHMBVCrX/1/3HyhD5bXzWDJrPkJD2ZdvGgI6sYmihCMHWQmSoYvnZagpTK8XeDqJzZ9IgoAQN0Yq/sZutqBwcxEWzVzg1kQa69163LxwGotmLXArGR44dAY3r3yDJ2fOdysZtgkrRQaGsj3ZSEruykqQDFUcR6eHGlEIQvxkSjy1hZR5ASFulO78icNqRcHGzViQMR8and7l7ewWC7ZsKsLCmfOh1riRDM31uHHpDBbPnA+V2vPJPw9FQOECbSqReF3AJra6awUQBAUpQ9J8HQoTYAReoTJN35+IvEBlAWSRFxBMcb3J9mKtq0dRQRHmT8+EzmBwebsGmxWF+ZuxYMY8aN1IhjaLGUUbC7F45jxo3EiGjGsCMrE1lSCXPckuxGbok2UFISH+UcVXFIXKhA+B4yklNh4hftD6xh2lJ880ThSZuRAanc7l7Rx2OwpyN2H+9LnQ6V1PhnabBYX5m7EoIxNarevJ0GOdaEmtgExsZXuyMWIUK0EygU/gRUor+/tnhwBvKzle1jilf/Yit86NcQ12bN6Qj3nT5kBvNLm8ncNuQ0HuJizMcC8ZUqEoADy8wFrpGBdoB1xiq71aAFFUMPqxNF+HwjCtkmUFQcEURloOAaFU1psUqIy0TlVUIDmOzkLK3iKJIooPHIHl5k2EqNVYPMu9Kf28w4FN6/OROXUWDKYwl7fjGuzYtCEfC6bPhl5vbEvojIt8mtj27t2LtWvX4sSJE7h16xby8/ORmZnZ5v2JgoSjh1gJkvF/PCdCTatlDYWR1vHK76iMtGRBcCtJtAdCCBosFpQePQF7TQ1AgLDu3bFwxny3YxV4HhvX56LHY4kwhnVxeTuec2Dj+jzMnzoLBoPryZAqVopsH3a7HcOHD8c//dM/Yf78+R7v7+Tur1kJkvEqSZIREkpjAWQBap3/JDaZF/FYt8c8348gQkVhvUmPYpAkOKxWHDxzHrbqaoicAxqDEcbYbpgxarxbF07fSxR4bMzegO4Dh2HioCEubyfwPDbm5CIzfQaMpvA2vTYVLLG1j4yMDGRkZFDZV+3VAsgyYSVIxqscDhFaCstpNXYI8Pztd7r6CkIpfJGTeAEqCqXI9hixKYoC3m5Hg9WKY+WXIdjtEO12yGJjh+7gkFCoDHpoTWGYPWGaW7McWyOJIvKzcxGbMASTHhvm8naiwCM/ez169h+GsPAIj+NgXNOhzrHxPA+e550/WywWAD+WIJf/LNNHkTGdBcdJVBIb5xCp9GKTBAm9o0d4vB+Z4kLKNHq6AY1T8A99cwGC3QbR3gCR5xpHDEFBUOv0UBn0UBuMSB8+BDqj0WvXgsmShPzsDejWfxAmDxnu8naiKCAvewN69BuCicNcH+GJEltSy1MdKrGtWbMGb7/99n33ny7NxcjRXaGh8A2YYR6E40SoKfRQ+7b2Iowmz1f2p9myJpTCSIsQhUofNt7hQOGmAkT27YvxCcOhN5mg0enbfS1LWZaQl70B0fEDkD4syfXtfkiGcX0GYdJwN0Z4ooCCDfltCfWhCFFAPGw74+n27cU/LsZx0W9+8xuYzWbn7fr16wAAhRCMGpzm2+CYToHj6JQiBZ7WAsgiVBT203hurB1Wv3BRyZETiIzvi5nJTyCyWyy0ekO7JzVFlpGfnYeuj/TDlMSRLm/XlAy79RqA9KREl7eTJAl5X+cg1s9nlXYEHSqxaTQahIWFNbsBwOz0qT6OjOksbtafQZBpjMf7ESmtE0lrxAYC33d4voftdhXSh/iuWamiKMjPyUNkz96YOmKU69vJMvKzcxHdoy+mjHS9RCzLEvL+Xw66xw3A+CTPJ/G0iJDGUqIntzZMHvn444/Rp08faLVapKSk4OjRo60+Ny8vD8nJyejSpQsMBgMSExPx5Zdfuv2a/vOX7AEa06YZxhW01okUOAlqGrMZBQmh/nRBNIVTMIqiQBZEt1YBoUlRFGxcn4/w2B6YNjLFre3yc3IRFdsbU5NdT8qKIiPv6w3oFtsXE0e5fg7PbT5YBDk7OxtZWVlYvXo1Tp48ieHDh2PatGmorq5u8fmRkZH47W9/i0OHDuHMmTNYvnw5li9fju3bt7v1uj5NbDabDWVlZSgrKwMAXLt2DWVlZaioqPBlWAzTKo6TqZzLFTiZyoiNwH9GWoosI4hCLA6rFRqT66t50EQIwabcTTBFd0PGaNdH5o3JMA8RMT0xbbTr506bklp09COYPNr1c3i+ZrFYmt3undR3rz/+8Y949tlnsXz5cgwePBiffvop9Ho9/va3v7X4/LS0NMybNw+DBg1Cv3798NJLL2HYsGHYv3+/W/H59B1x/PhxJCUlISmp8T80KysLSUlJWLVqlS/DYphW8ZwMLYVebKIgUbn+zJ80rhPZcdebJIRgU95mGCKiMCNlnHvbbdiIsMhYTE953OXtFEVBfnYuIiN7ID3F9XN4baYodG4AevXqhfDwcOdtzZo1972cIAg4ceIE0tPTnfcFBwcjPT0dhw4demi4hBAUFxejvLwc48e719jXpzW8tLQ0au0yGKY9NDRI0OoCq1u1JEoIonDRucjRaVkj8jxCvN2b7CcIIdicXwidKQwzU13/EG0a4RnDozAj1fURHiEEG3Py0KVLLKamun4OzyOEwnT/Hz6vr1+/7pzjADTOf/ipO3fuQJZldOvWrdn93bp1w8WLF1t9CbPZjB49eoDneYSEhOBPf/oTpkyZ4laY7OQUw7hBlhSo/KlbNYUvhhIvUFlOSxTorDd58ur37drTjRCCws1boNbpMWvsRLe225xXAJ0hHDPHPuHWdhtz8mEyRWHaGNfP4fmTeyfv0WYymVBWVgabzYbi4mJkZWWhb9++SEtLc3kf/vEOZZgOwN+qC5IoITiUxqUHFFf2p9A9WxYEpPZJ8Hg/rioq3I6QUBXmjJ/s8jaEEBRu3AK1Vo/ZT0xwa7vN6zdBrw9HxjjPZ9e6gygKSFD7XcfWtWtXhISE4Pbt283uv337NmJjY1vdLjg4GP379wcAJCYm4sKFC1izZo1bic0/zjozTAdgNnMwhdG4iJlWt2oRKgrLaYkcnXNaJyq+x4iYvh7vRxYEqNujozSALUU7ARDMTXPvkqEtm7chJFSFuRMmubwNIQQFuQXQaA2YOd71c3jUtPOsSLVajZEjR6K4uNh5n6IoKC4uRmpqqsv7URSl1ckprWEjNoZxUV2tHRGRnn/gioKEUBWN9SbpjLQEjqeyH1kQqaxeIov0luV6kK3biiGLAualz3Bruy0FOwAAmRPTH/LM5orytyA0VI1ZE9ybCNGRZWVlYenSpUhOTsbo0aPx4Ycfwm63Y/ny5QCAZ555Bj169HBOPlmzZg2Sk5PRr18/8DyPLVu24Msvv8Qnn3zi1uuyxMYwLrp86yR00a6XnVrDcXTWiWxc2d/z/Zy8VYGELgM83o/MC1QSkiwICPXyiG37jhIIDXYsmDrbrUk827YUQ5ZEzE+f7tbrbdm4DUEIwpyJrp/Do04hQFD7ru6/ZMkS1NTUYNWqVaiqqkJiYiK2bdvmnFBSUVHR7HIVu92O559/Hjdu3IBOp8PAgQPxf//3f1iyZIlbr8sSG8O46G49j7gEz1eK5x0CvcRGbWV/OgnJnS7Ure5HFL3aIWDHrn1wWO5i4fS5biW17Vv3gHfYsHDqLPeS4aYdkGURmZPdm9lHHSHwuIN2G8roK1euxMqVK1t8rKSkpNnP77zzDt555522RNYMO8fGMC6yWkQYwzxfDYPnJSqJ7Uz1VXQPG+rxfmRK600qAr0Sorcuhdi1+wDsdTVuJ7Wd20vhsJvdTmrbC4rBCw5kTp7iN5d3dAYBMWLrKCtOd3aECCDEgaAgHYKC/KvL8oMQQkBIAxRFBI1FPnhOgIpChwCJp7eyP5URmyhSmRVJgyjJ4AQRWrUKqh9mjhaXHIKl5hYWzZjvVpLZtXM/bOZaLM5wMxkW7YHDYcGCqRnubbd5p8vPdQdRCIiHpUh/mxncmoBIbDb7X6HRjoBGnYKgoID4lQKKItdCEg5BkS6jsRQSjODQ/gjVjEFwcKSvw3sgQSwHxx+GINRAgQyz9RNo1InQaFIQ1Ma3z7e15QgPd32FitaIvIRQGs1BeZFKk1HA9xed11sbcPzSDVyrqmtq3Yb42EhI9XfQUH0Ti2fOd2sJst3FB2Gpq8LijEy3frfirXths9Zh4fSZLm/3/bnr2FVYjHpLy+soeowo8LwU2TEGEQGSBTgIwmFI0nUY9AtZcvMjilwNoSEHgIQf31QKFOkyBOk7qPVLEBwS7cMIW8fxR8Hx+wAADgeBTh8EQjhw/BFI0nUYDQvRlreQwElQx1JoWcOJUNNIbJLkNyMtT0YEtWY7Nh0+B0lWnKeCCAEunisHV3MTzy75uVu94vbsPoz66htYMnOee8lw2z7cvXsbi6a7Xrb85sBF7Nu5Dw7ZisiGcJdfi2lZQJ1jU5SbEMTTvg6DuYfI7UDzpNZEASBB5LxTdvGUrNQ7kxoAcByBVtP0IUUgyTfBC237WxM4Or3YREpdr4MQ5PORVhNZktrcqLTkzJVmSQ0A+NpqOGpuIqrHUOz75nvX91VyFLVV3/+Q1FyPp2T7QdTVVWLR9FkuJ0NrnQ37dx1Ag2xGV3sXeOu/giiEyq0jCKjEBgCCUObrEJgfKPJtEKUarZc/FBClCopc055huUQQzgL48ROG4wg02uafOHwb/9ZEXqZS+lNkBaH+tLwXBSLPt2k5rTtmG+5YGn6S1G6Du1OJqO7DgKAQ1JjtqLXYH7qvvXuPo+bmVbeTWunOw6i5U4HFGbPdGuFtW78DNrEe0fZI737BIAqdWwfgH++KNmp6M9ls9x7sOiiyw2++gXZmslQFiXv4GyFUrEJIqG/alLTG7qiGJMnOn/kfEpvdKt/zrFoEkwbcmwBdERIaDFmU0GBt8ChGtUEDh/XhH9QPE6rXgLN5th9ZkqA2GsDZPdsPZ7NBpdXB4eZ+btfUQeY558+KLMBRfRMRMQOhSMI9z6uF/gGferIs4db35chMnwGB5wG4tuKFJEu4desyMidPA39PHA8jSgJu1V9HpN0IOUgECCAREQD9iRoSRI/XQJYg0gnGy4JIR5nm0oIbN26gV69evg6DYRiGuuvXr6Nnz54e74fjOMTHx6OqqopCVEBsbCyuXbsGrVZLZX/e0KETm6IoqKyshMlk6jQjNIvFgl69et3XNqKzYsfjR+xY/KgjHwtCCKxWK7p3706tiSzHcRAE4eFPdIFarfbrpAZ08FJkcHAwlW80HZE320Z0ROx4/Igdix911GMRHk53ZqRWq/X7ZERTwE0eYRiGYTo3ltgYhmGYgMISWwej0WiwevXqFluxd0bsePyIHYsfsWPRuXXoySMMwzAM81NsxMYwDMMEFJbYGIZhmIDCEhvDMAwTUFhiYxiGYQIKS2wdXFFREVJSUqDT6RAREYHMzExfh+Qzffr0QVBQULPb+++/7+uwfIrneSQmJiIoKAhlZWW+Dscn5syZg0ceeQRarRZxcXF4+umnUVlZ6euwGC9iia0Dy83NxdNPP43ly5fj9OnTOHDgAH7+85/7Oiyf+v3vf49bt245by+++KKvQ/KpV199Fd27d/d1GD41ceJE5OTkoLy8HLm5ubhy5QoWLlzo67AYL+rQS2p1ZpIk4aWXXsLatWuxYsUK5/2DBw/2YVS+ZzKZEBsb6+sw/MLWrVuxY8cO5ObmYuvWrb4Ox2defvll57979+6N119/HZmZmRBFESo/abDK0MVGbB3UyZMncfPmTQQHByMpKQlxcXHIyMjAN9984+vQfOr9999HVFQUkpKSsHbtWkiS5OuQfOL27dt49tln8eWXX0Kv1/s6HL9RV1eHdevWYcyYMSypBTCW2Dqoq1evAgDeeustvPnmmygsLERERATS0tJQV1fn4+h845e//CW+/vpr7NmzB//6r/+K9957D6+++qqvw2p3hBAsW7YMzz33HJKTk30djl947bXXYDAYEBUVhYqKCmzatMnXITHeRBi/8tprrxE0tgNs9XbhwgWybt06AoD8+c9/dm7LcRzp2rUr+fTTT334G9Dl6vFoyV//+lcSGhpKOI5r56i9w9Vj8dFHH5GxY8cSSZIIIYRcu3aNACCnTp3y7S9Akbt/FzU1NaS8vJzs2LGDjB07lsyYMYMoiuLD34DxJraklp+pqalBbW3tA5/Tt29fHDhwAJMmTcK+ffswbtw452MpKSlIT0/Hu+++6+1Q24Wrx0OtVt93/7lz5zBkyBBcvHgRCQkJ3gqx3bh6LBYvXoyCgoJmPQplWUZISAieeuop/O///q+3Q/U6T/4umhoUHzx4EKmpqd4KkfEhNnnEz0RHRyM6Ovqhzxs5ciQ0Gg3Ky8udiU0URXz33Xfo3bu3t8NsN64ej5aUlZUhODgYMTExlKPyDVePxf/8z//gnXfecf5cWVmJadOmITs7GykpKd4Msd148nehKAqAxkshmMDEElsHFRYWhueeew6rV69Gr1690Lt3b6xduxYAsGjRIh9H1/4OHTqEI0eOYOLEiTCZTDh06BBefvll/OIXv0BERISvw2tXjzzySLOfjUYjAKBfv36drjHvkSNHcOzYMYwbNw4RERG4cuUKfve736Ffv35stBbAWGLrwNauXYvQ0FA8/fTTcDgcSElJwe7duzvdBznQ2Kbk66+/xltvvQWe5xEfH4+XX34ZWVlZvg6N8SG9Xo+8vDysXr0adrsdcXFxmD59Ot58803W0iaAsXNsDMMwTEBh0/0ZhmGYgMISG8MwDBNQWGJjGIZhAgpLbAzDMExAYYmNYRiGCSgssTEMwzABhSU2hmEYJqCwxMYwDMMEFJbYmA7vrbfeQmJioq/DaJMvvvgCXbp08XUYDBNQWGJjAADLli1DZmamr8Pwiu+++w5BQUEoKyvzdSj3WbJkCb799ltfh9Eqfz52DNMatlYkw3iBIAgttkz5KZ1OB51O1w4RNedqfAzTEbERG+OS0tJSjB49GhqNBnFxcXj99dchSZLzcavViqeeegoGgwFxcXH44IMPkJaWhl/96lfO59y6dQszZ86ETqdDfHw8vvrqK/Tp0wcffvih8zl3797FP//zPyM6OhphYWGYNGkSTp8+3SyW999/H926dYPJZMKKFSvAcZxHv5uiKFizZg3i4+Oh0+kwfPhwbNiwwfm4LMtYsWKF8/GEhAR89NFHzfbRNOJ999130b17dyQkJDhHO3l5eZg4cSL0ej2GDx+OQ4cOObf7aSmyqaz65Zdfok+fPggPD8eTTz4Jq9Xq1rH+qab9fv7554iPj4dWqwUAbNu2DePGjUOXLl0QFRWFWbNm4cqVK87t4uPjAQBJSUkICgpCWlqa87HPP/8cgwYNglarxcCBA/GnP/3JrePOMN7CEhvzUDdv3sSMGTMwatQonD59Gp988gn++te/Nuv5lZWVhQMHDmDz5s3YuXMn9u3bh5MnTzbbzzPPPIPKykqUlJQgNzcXf/nLX1BdXd3sOYsWLUJ1dTW2bt2KEydOYMSIEZg8eTLq6uoAADk5OXjrrbfw3nvv4fjx44iLi/P4A3XNmjX4xz/+gU8//RTnzp1ztrspLS0F0Jj4evbsifXr1+P8+fNYtWoV3njjDeTk5DTbT3FxMcrLy7Fz504UFhY67//tb3+LV155BWVlZRgwYAB+9rOfNftS8FNXrlzBxo0bUVhYiMLCQpSWluL99993Pu7KsW7J5cuXkZubi7y8PGdp0W63IysrC8ePH0dxcTGCg4Mxb948Z8+yo0ePAgB27dqFW7duIS8vDwCwbt06rFq1Cu+++y4uXLiA9957D7/73e8CookpEwB828Cb8RdLly4lc+fObfGxN954gyQkJBBFUZz3ffzxx8RoNBJZlonFYiEqlYqsX7/e+fjdu3eJXq8nL730EiGEkAsXLhAA5NixY87nXLp0iQAgH3zwASGEkH379pGwsDDCcVyz1+/Xrx/585//TAghJDU1lTz//PPNHk9JSSHDhw9v9Xe7du0aAUBOnTp132McxxG9Xk8OHjzY7P4VK1aQn/3sZ63u84UXXiALFixw/rx06VLSrVs3wvP8fa/7+eefO+87d+4cAUAuXLhACCHk73//OwkPD3c+vnr1aqLX64nFYnHe9+tf/5qkpKQQQohLx7olq1evJiqVilRXV7f6HEIIqampIQDI2bNnm/0OPz12/fr1I1999VWz+/7jP/6DpKamPnD/DNMe2Dk25qEuXLiA1NRUBAUFOe8bO3YsbDYbbty4gfr6eoiiiNGjRzsfDw8PR0JCgvPn8vJyhIaGYsSIEc77+vfv36x33OnTp2Gz2RAVFdXs9R0Oh7M8duHCBTz33HPNHk9NTcWePXva9LtdvnwZDQ0NmDJlSrP7BUFAUlKS8+ePP/4Yf/vb31BRUQGHwwFBEO6biTl06NAWz1sNGzbM+e+4uDgAQHV1NQYOHNhiTH369IHJZGq2TdPI9urVqw891q3p3bv3fV2nL126hFWrVuHIkSO4c+eOc6RWUVGBIUOGtLgfu92OK1euYMWKFXj22Wed90uShPDw8IfGwTDexhIb4zdsNhvi4uJQUlJy32PemhJvs9kAAEVFRejRo0ezx5oaUX799dd45ZVX8Ic//AGpqakwmUxYu3Ytjhw50uz5BoOhxddQqVTOfzd9OWhKIA97ftM2D3q+q1qKb/bs2ejduzc+++wzdO/eHYqiYMiQIRAEodX9NB2zzz77DCkpKc0eCwkJ8ThOhvEUS2zMQw0aNAi5ubkghDg/mA8cOACTyYSePXsiIiICKpUKx44dwyOPPAIAMJvN+PbbbzF+/HgAQEJCAiRJwqlTpzBy5EgAjaOl+vp65+uMGDECVVVVCA0NRZ8+fVqN5ciRI3jmmWec9x0+fLjNv9vgwYOh0WhQUVGBCRMmtPicAwcOYMyYMXj++eed9907waI99e3b96HH2lW1tbUoLy/HZ599hieeeAIAsH///mbPaRqByrLsvK9bt27o3r07rl69iqeeesqTX4dhvIIlNsbJbDbfd71SVFQUnn/+eXz44Yd48cUXsXLlSpSXl2P16tXIyspCcHAwTCYTli5dil//+teIjIxETEwMVq9ejeDgYGciHDhwINLT0/Ev//Iv+OSTT6BSqfDv//7v0Ol0zuekp6cjNTUVmZmZ+K//+i8MGDAAlZWVKCoqwrx585CcnIyXXnoJy5YtQ3JyMsaOHYt169bh3Llz6Nu370N/v/Ly8vvue+yxx/DKK6/g5ZdfhqIoGDduHMxmMw4cOICwsDAsXboUjz76KP7xj39g+/btiI+Px5dffoljx445Zwy2J1eOtasiIiIQFRWFv/zlL4iLi0NFRQVef/31Zs+JiYmBTqfDtm3b0LNnT2i1WoSHh+Ptt9/GL3/5S4SHh2P69OngeR7Hjx9HfX09srKyaP7KDOM+X5/kY/zD0qVLCYD7bitWrCCEEFJSUkJGjRpF1Go1iY2NJa+99hoRRdG5vcViIT//+c+JXq8nsbGx5I9//CMZPXo0ef31153PqaysJBkZGUSj0ZDevXuTr776isTExJBPP/202X5efPFF0r17d6JSqUivXr3IU089RSoqKpzPeffdd0nXrl2J0WgkS5cuJa+++qpLk0daul2/fp0oikI+/PBDkpCQQFQqFYmOjibTpk0jpaWlhJDGCSbLli0j4eHhpEuXLuTf/u3fyOuvv97sNVuafNPSxIv6+noCgOzZs4cQ0vLkkZ/+Lh988AHp3bu3W8f6p1raLyGE7Ny5kwwaNIhoNBoybNgwUlJSQgCQ/Px853M+++wz0qtXLxIcHEwmTJjgvH/dunUkMTGRqNVqEhERQcaPH0/y8vJajYFh2ksQIYT4IqEygc1ut6NHjx74wx/+gBUrVrT4nBs3bqBXr17YtWsXJk+e3M4RBg5XjjXDdCasFMlQcerUKVy8eBGjR4+G2WzG73//ewDA3Llznc/ZvXs3bDYbhg4dilu3buHVV19Fnz593D431Nm5cqwZpjNjiY2h5r//+79RXl4OtVqNkSNHYt++fejatavzcVEU8cYbb+Dq1aswmUwYM2YM1q1bd98sQObhHnasGaYzY6VIhmEYJqCwJbUYhmGYgMISG8MwDBNQWGJjGIZhAgpLbAzDMExAYYmNYRiGCSgssTEMwzABhSU2hmEYJqCwxMYwDMMElP8PpNbv7FUcb8sAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 500x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAbYAAAHWCAYAAAAb/awqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADQ9UlEQVR4nOydd1wc17n3f7O9sbv0JiSEUEO9d4F6oYOQULGKHeemOPG149zEbxL3yM51XJJcJ3bibsnqDZBAvXcJhIQqEiqoIOqyvc3M+wcGC9F2tu8yX3/mY+3sKc8us/PMOed3noegaZoGCwsLCwuLn8DxtAEsLCwsLCzOhHVsLCwsLCx+BevYWFhYWFj8CtaxsbCwsLD4FaxjY2FhYWHxK1jHxsLCwsLiV7COjYWFhYXFr2AdGwsLCwuLX8E6NhYWFhYWv4J1bCwsXgxBEHjjjTdaXn/99dcgCAJ37tzpsm5sbCxWrlzpMttYWLwV1rGxMEav1+ONN97AoUOHPG1Ku6hUKvz0pz9FaGgopFIppk2bhuLiYpvqrly5EgRBtDkGDBjgYqtZWFicBc/TBrD4Hnq9Hm+++SYAICkpybPGPAVFUUhOTkZpaSl++9vfIiQkBP/85z+RlJSE8+fPo2/fvl22IRQK8fnnn7c6p1AoXGUyI5555hnk5uZCKBR62hQWFq+FdWwsfsXmzZtx4sQJbNq0CQsWLAAALFy4EP369cPrr7+O77//vss2eDweli1b5mpT7YLL5YLL5XraDI9hNBohEAjA4bCTTSwdw14ddvLGG2+AIAjcuHEDy5Ytg0KhQGhoKP70pz+BpmlUVlYiPT0dcrkcERER+OCDD9q0UV1djeeeew7h4eEQiUQYNmwYvvnmm1Zl7ty5A4Ig8Ne//hWffPIJ4uLiIJFIMHv2bFRWVoKmabz99tvo0aMHxGIx0tPTUV9f36avwsJCTJkyBVKpFAEBAUhOTsbly5dblVm5ciVkMhkePHiAjIwMyGQyhIaG4pVXXgFJki32hIaGAgDefPPNlqm65nWgpKSkdkdxK1euRGxsrNM/19Ns3rwZ4eHhyMrKajkXGhqKhQsXYseOHTCZTF22AQAkSUKtVttUFgAsFguCgoKwatWqNu+p1WqIRCK88sorAACz2YzXXnsNo0aNgkKhgFQqxZQpU3Dw4MEu+2lvjY2mabzzzjvo0aMHJBIJpk2b1uZv2xl//etfMXHiRAQHB0MsFmPUqFHYvHlzu2XXrFmDsWPHQiKRIDAwEFOnTsWePXtalSksLERiYiICAgIgl8sxZsyYVg8UHa39PX3tHDp0CARBYP369fjjH/+I6OhoSCQSqNVq1NfX45VXXsGQIUMgk8kgl8sxb948lJaWtmnXaDTijTfeQL9+/SASiRAZGYmsrCzcunULNE0jNjYW6enp7dZTKBT4r//6Lxu/SRZvgXVsDrJo0SJQFIX33nsP48aNwzvvvIOPP/4Ys2bNQnR0NP7yl78gPj4er7zyCo4cOdJSz2AwICkpCd999x2WLl2K999/HwqFAitXrsTf/va3Nv2sXbsW//znP/GrX/0Kv/nNb3D48GEsXLgQf/zjH1FUVITf/e53+OlPf4r8/PyWG2gz3333HZKTkyGTyfCXv/wFf/rTn3DlyhVMnjy5jQiBJEnMmTMHwcHB+Otf/4rExER88MEH+Pe//w2gyUn861//AgBkZmbiu+++w3fffdfKkTDBkc/VHiUlJRg5cmSbJ/qxY8dCr9fjxo0bXbah1+shl8uhUCgQFBSEX/7yl9BqtZ3W4fP5yMzMxPbt22E2m1u9t337dphMJuTm5gJocnSff/45kpKS8Je//AVvvPEGampqMGfOHFy4cKFL+57mtddew5/+9CcMGzYM77//PuLi4jB79mzodDqb6v/tb3/DiBEj8NZbb2H16tXg8XjIycnBzp07W5V788038cwzz4DP5+Ott97Cm2++iZiYGBw4cKClzNdff43k5GTU19fj1VdfxXvvvYfhw4ejqKiI8edq5u2338bOnTvxyiuvYPXq1RAIBKioqMD27duRkpKCDz/8EL/97W9x6dIlJCYm4uHDhy11SZJESkoK3nzzTYwaNQoffPABXnzxRTQ2NqKsrAwEQWDZsmUoLCxs8+CUn58PtVrttaN3lk6gWezi9ddfpwHQP/3pT1vOWa1WukePHjRBEPR7773Xcr6hoYEWi8X0ihUrWs59/PHHNAB6zZo1LefMZjM9YcIEWiaT0Wq1mqZpmr59+zYNgA4NDaVVKlVL2VdffZUGQA8bNoy2WCwt5xcvXkwLBALaaDTSNE3TGo2GViqV9PPPP9/K/qqqKlqhULQ6v2LFChoA/dZbb7UqO2LECHrUqFEtr2tqamgA9Ouvv97me0lMTKQTExPbnF+xYgXdq1evlteOfq6OkEql9LPPPtvm/M6dO2kAdFFRUaf1f//739O/+93v6A0bNtDr1q1r+U4mTZrUyp722L17Nw2Azs/Pb3V+/vz5dFxcXMtrq9VKm0ymVmUaGhro8PDwNrY//T1/9dVXNAD69u3bNE3TdHV1NS0QCOjk5GSaoqiWcv/v//0/GkCra64j9Hp9q9dms5kePHgwPX369JZz5eXlNIfDoTMzM2mSJFuVb+5XpVLRAQEB9Lhx42iDwdBuGZqm6V69erVr19PXzsGDB2kAdFxcXBsbjUZjGztu375NC4XCVtfvl19+SQOgP/zwwzb9Ndt0/fp1GgD9r3/9q9X7aWlpdGxsbCvbWXwDdsTmID/5yU9a/s3lcjF69GjQNI3nnnuu5bxSqUT//v1RUVHRcm7Xrl2IiIjA4sWLW87x+Xz8+te/hlarxeHDh1v1k5OT00rAMG7cOADAsmXLwOPxWp03m8148OABAGDv3r1QqVRYvHgxamtrWw4ul4tx48a1O/31s5/9rNXrKVOmtLLdmdj7uTrCYDC0K6wQiUQt73fGu+++i/feew8LFy5Ebm4uvv76a/z5z3/G8ePHO5yea2b69OkICQnBhg0bWs41NDRg7969WLRoUcs5LpcLgUAAoEnsUl9fD6vVitGjR9us3mxm3759MJvN+NWvfgWCIFrO//d//7fNbYjF4lb2NjY2YsqUKa1s2b59OyiKwmuvvdZmNNzc7969e6HRaPD73/++5ft+uow9rFixopWNQJPAp9kOkiRRV1cHmUyG/v37t7J7y5YtCAkJwa9+9as27Tbb1K9fP4wbNw5r165tea++vh6FhYVYunSpQ7azeAbWsTlIz549W71WKBQQiUQICQlpc76hoaHl9d27d9G3b982N4mBAwe2vN9VPwAQExPT7vnmvsrLywE03XRDQ0NbHXv27EF1dXWr+iKRqGUNrZnAwMBWtjsTez9XR4jF4nbX0YxGY8v7THnppZfA4XCwb9++TsvxeDxkZ2e3WsvbunUrLBZLK8cGAN988w2GDh0KkUiE4OBghIaGYufOnWhsbGRkW/N18rTaMzQ0FIGBgTa1UVBQgPHjx0MkEiEoKKhluvlJW27dugUOh4OEhIQO27l16xYAYPDgwYw+Q1f07t27zTmKovDRRx+hb9++EAqFCAkJQWhoKC5evNjG7v79+7d6SGqP5cuX4/jx4y3f56ZNm2CxWPDMM8849bOwuAfWsTlIewq1jlRrNE07tR9b+qIoCkDTOtvevXvbHDt27LCpPVvp6Om2WXzyNPZ+ro6IjIzEo0eP2pxvPhcVFdVp/fYQi8UIDg62SbySm5sLjUaDwsJCAMDGjRsxYMAADBs2rKXMmjVrsHLlSvTp0wdffPEFioqKsHfvXkyfPr3l7+Uujh49irS0NIhEIvzzn//Erl27sHfvXixZssSh67UzmF4j7T2MrF69Gi+//DKmTp2KNWvWYPfu3di7dy8GDRpk13eYm5sLPp/fMmpbs2YNRo8ejf79+zNui8XzsHJ/D9GrVy9cvHgRFEW1GrVdu3at5X1n0KdPHwBAWFgYZs6c6ZQ2O5uaCQwMbHfa8ukRqKsYPnw4jh492uZ7PX36NCQSCfr168e4TY1Gg9ra2jYj2faYOnUqIiMjsWHDBkyePBkHDhzAH/7wh1ZlNm/ejLi4OGzdurXVd/n6668ztq35OikvL0dcXFzL+ZqaGptG2Vu2bIFIJMLu3btbTeF+9dVXrcr16dMHFEXhypUrGD58eLttNV9rZWVliI+P77DPwMBAqFSqNufv3r3b6jN0xubNmzFt2jR88cUXrc6rVKpWsyV9+vTB6dOnYbFYwOfzO2wvKCgIycnJWLt2LZYuXYrjx4/j448/tskWFu+DHbF5iPnz56OqqqrVeozVasU//vEPyGQyJCYmOqWfOXPmQC6XY/Xq1bBYLG3er6mpYdymRCIBgHZvTn369MG1a9datVtaWorjx48z7sceFixYgMePH2Pr1q0t52pra7Fp0yakpqa2unnfunWrZfoMaJqu1Gg0bdp8++23QdM05s6d22X/HA4HCxYsQH5+Pr777jtYrdY205DNo9EnR0SnT5/GyZMnbf+gPzBz5kzw+Xz84x//aNWerTdlLpcLgiBajZbu3LmD7du3tyqXkZEBDoeDt956q82IqLnf2bNnIyAgAO+++27L1O/TZYCma+TUqVOt1KMFBQWorKy0yeZmu58eUW7atKnNGmx2djZqa2vxf//3f23aeLr+M888gytXruC3v/0tuFxui4qVxfdgR2we4qc//Sk+++wzrFy5EufPn0dsbCw2b97c8qQYEBDglH7kcjn+9a9/4ZlnnsHIkSORm5uL0NBQ3Lt3Dzt37sSkSZPa/dF3hlgsRkJCAjZs2IB+/fohKCgIgwcPxuDBg/Hss8/iww8/xJw5c/Dcc8+huroan376KQYNGsRoX5i9LFiwAOPHj8eqVatw5cqVlsgjJEm2REtpZsaMGQDQsuWhqqoKI0aMwOLFi1tCaO3evRu7du3C3Llz293r1B6LFi3CP/7xD7z++usYMmRIy7ppMykpKdi6dSsyMzORnJyM27dv49NPP0VCQkKX2wqepnmf4bvvvouUlBTMnz8fJSUlKCwsbLPO2x7Jycn48MMPMXfuXCxZsgTV1dX45JNPEB8fj4sXL7aUi4+Pxx/+8Ae8/fbbmDJlCrKysiAUCnH27FlERUXh3XffhVwux0cffYSf/OQnGDNmDJYsWYLAwECUlpZCr9e37NH8yU9+gs2bN2Pu3LlYuHAhbt26hTVr1rSM+GwhJSUFb731FlatWoWJEyfi0qVLWLt2bZsR3/Lly/Htt9/i5ZdfxpkzZzBlyhTodDrs27cPv/jFL1r9TZOTkxEcHIxNmzZh3rx5CAsLs9keFi/DM2JM36dZ7l9TU9Pq/IoVK2ipVNqmfGJiIj1o0KBW5x4/fkyvWrWKDgkJoQUCAT1kyBD6q6++alWmWRb//vvvtzrfLIXetGlTq/PNcvCzZ8+2KT9nzhxaoVDQIpGI7tOnD71y5Ur63LlzXdre/Fmf5MSJE/SoUaNogUDQRpK+Zs0aOi4ujhYIBPTw4cPp3bt3dyj3d/RztUd9fT393HPP0cHBwbREIqETExPbrderV69WNjU0NNDLli2j4+PjaYlEQguFQnrQoEH06tWrabPZ3GW/zVAURcfExNAA6Hfeeafd91evXk336tWLFgqF9IgRI+iCgoI23xFNdy33p2maJkmSfvPNN+nIyEhaLBbTSUlJdFlZWYey+qf54osv6L59+9JCoZAeMGAA/dVXX7X7N6fpJvn8iBEjaKFQSAcGBtKJiYn03r17W5XJy8ujJ06cSIvFYloul9Njx46l161b16rMBx98QEdHR9NCoZCeNGkSfe7cuQ7l/k9fCzTdJPf/zW9+0/KZJ02aRJ88ebLd7SZ6vZ7+wx/+QPfu3Zvm8/l0REQEvWDBAvrWrVtt2v3FL35BA6C///77Lr83Fu+FoGkXrRCzsLCw+BgvvfQSvvjiC1RVVbVMubP4HuwaGwsLCwua1ljXrFmD7Oxs1qn5OOwaGwsLS7emuroa+/btw+bNm1FXV4cXX3zR0yaxOAjr2FhYWLo1V65cwdKlSxEWFoa///3vHW5nYPEd2DU2FhYWFha/gl1jY2FhYWHxK1jHxsLCwsLiV/j0GhtFUXj48CECAgLYCNwsLCx+AU3T0Gg0iIqKclqmcKPR2CZPoL0IBII22Ru8DZ92bA8fPmwTBZ6FhYXFH6isrESPHj0cbsdoNKJ3LxmqqtsPMs2UiIgI3L5926udm087tuawU1OEmeARfBjkgFWsw/Kfr4SQ3zYnV2ccOn8R1Y8rkJyZBqGQWWqTgxcu4HFlOZLTUyCUSJn1e+kCHldcx/y0ZIikMmb9Xr+AmmvXMT91HsQMQ3AdqbiA6tIrmJc6D1I5s7rFlefx4NxVpM6bDVmgvMNyVprCrkcHQdId/6C4HB6SI5LAJTjYl7cWSxbZFrbKlZAkiUP5/8GY2W3T3zyJUtAHUdJJ7b73/ZadGDN9AcQS7/3x+xKb8wsxasxcSBXtX6tWmkLho4MgaWuHbXA5PMyPmAYu0fEoyKgzYNeBQ5g9M9NuWwsK9yJx6AQEBCptKn+7rgF7rpe3vKaMRtxb/Y7TwuqZzWZUVZO4fb4X5AGOjQDVGgq9R92F2WxmHZuraJ5+5IIPXQAJC2XEipWroJTblocKaBr27zpyFDqdCrkrloPLZfaVFBw7DI2qtqluFzmfnmbnyaPQ1DzCohXPgNdJ5PH22HXuGBof3MeiFUvB+yFppa3sLj0GVcVdLFyxBAIRsweA45cPo/b6XSxdvghCcdcX9hAkoKzxRsfvK/pDJg+AyWCEWCGBJMDzG2NVtY0IiwxDoMIAE6UC0J5wmIOe8lEQcdt/CBowOgr3yvdixORF7b7PwozkaUk4UHwEU6cv7LDMEAzs4lobAFkXD3FmowliZQBEMmYPqE9CAJAHB0FoY+6//hIJSmrq0GAwgHpCpO7s5RV5AMdhx+Yr+MWnrJOoQHA5yF25FEHhtjs1iiKxZU8hSNKKzNwFjJwaRVHYvGcnzEYDshYtYOTUaJrG1n07YdKqkZWbw8ip0TSNbQcLoW+oR3ZuDiOnRtM08o4UQldVjZzFCxg5NZqmceDkLjTeq8KSxdk2OTUAGCjvg/4BTYkiCTT9WJt/rgPkcRgobwp8q6lTQRrEbMTqKmqqDkEeIkHvgHkQcYN/OEv8cAAcCBArmwsRt+NrbcqgCaiubHRZTrPuRlBEEHR1WpDWjkf/A+Tx6B8QB4Bo+o/ggPjh79Zf3gcD5F0HWTbqDOBJmD3sPY3VZIKAwWiGQxDIGDIQoVJpy2tXQNKUUw5fwKdHbM307tMHmcszweXZniTTbDFjc1E+QkJiMH3uFEb9WSxmbCrcAWVoFGbOYlbXarFgc+F2BISGY/bMqYzqklYrNhdthyQ4GKkzu06h8nTdbbu3QRykROrcVEZPgxRJomjvFgjlUizMSmNUlwCBYcqB6BsQi7u6BzCSJoi4IsRKoyHm/vjjv/XwDMbGdZyd2Z2o6/WYOHgseBwJ4uXp0FmroDFXggYJMTcECkFvEETnPx2CIBDWU4E75TvRu1+Kmyz3XwiCQFjfCJRcLMLokcntlwGBocqBiA+IxT3dAxhIE8RcEXo9da11xrkHt8FnOIvRkb1MkAgEWDhiMB42anCx7DLaZjR0HAo0qHZnH5i14Qv4hWNLXjyPkVPT6tTYtrcQPXsOwqRpoxj1pddpsGV3PiJ7J2DqlJGM6hr0Omwt3I6w+AFImsisX5NBj82F2xDSty9mjB/DsK4B2wq3ILhfH8wax6yu2WhC4a4NCOnXE3PHjmdU90kkXDEGyjtOPqmr00I5Sml3+85EXWdAUHDzlBUBKS8SUl4k43ZmjZ2CTQVF6M08tylLO8wZMxHfrtkCegTdqeOQcMUY0Mm11hkWgwkjejH7XbfB7ns/gSiFHNZABXY7ZkG3xy8cGxMOnruIB/evIT0nCxIJs6mv/RdK8eBWGVKz0yGVdSyaaI8DZaV4eO0SUjJSIVUomPV74yIeXSxFSnoKZEolo7rahgbk78tD5KhhSBoymFFdnaoRe/ZsRY+xCZieMIxRXaaY9SaIpd6xGG21UOALHP9pSGQiEBwCeq0BEhkzQRJLW7g8LpTRgbhcfgCD+81wSR9WgwkCif1/K2dMPZfevudwG+1BgYKjE4mOt+AeupVjKzp2EipVFRYszQWPx1CscfIEGmruI3vJIvD5zMQaRWdPov7BXWTm5kAgZDbNUXThFOorKpC1aAGjeXsA2Hv5JOqu3UTWwiwIGf5YT904jqrScixckA6RzLWCDqNWDw6X4xV7EUmSBIfrPDt6DwrD1eIdGDWVzcbsDOZNnop1G/OQ0IcEh2v7LI2tWI1mCGwUfbSHxWQGV8Ds3tLGBlPnalx7IWkapIOO19H67sIvxCNdQdM0tu3bA71BjazFCxk5NZqmsW3/bujUdcjOXcjIqdE0jR2H9kBTV41shk6NpmnsOLYX6ocPkb04h7FT23lqHxrvVCJnSQ5jp3b43B7UXr+LxUsWuNyp0TSNI/s3I3WWa57AmaJp0EKmdN7IcXLCeNQ+UIOifONJ19sRiYWIHhSNQ3s2uESYQ5os4AuZPbg+idlgAM9GYVVHuMqxdSf83rFZrRZs2LUDIpEMaQvSGO3kt1qtWL9zG3gCEdKz0xnVJUkrNu7aBoLLRXpWGqOnS4oksbloO0ADmQsyGCkuKYrC1j3bQJrNyM7JZFx3976tMGsNyF2YCR7ftQN6g0aH40e2QBokgzKE2fSsq6ipOgR5sPOmDQmCQHgvJe7c2Om0Nrs7s0dPREBIAI4d3uL0tml0vn7XFWaDEVyGszJPQ7rIsTWLRxw9fAG/dmwGgw7rd25DWFgsZiVPY1TXaNRjXf4mBEf0xJx5zOqajAas37ERyohozJs7g9EPxWwyYX3eBsgiIpA8dyajuhaTCZvz1kMSGoy0ebMZ1bWazdiZvw7iYDmy5s9x6bTghbIiFG35CscPb4M8XIGMmd4xWgOAxjo9hvd07nrizLFTcOdKjVPb7O6kTE0CwSFw+kyep01pxdnbt8ETO+bYXDW6p0CDdPDwFcfmt2tsh4sv4969MqRmpUMWwGw0cPBSGSpvlCI5IwUBCtv3xQGAprEBO/buRHTCMEweM4RRXV1jI7btzUPkkKFIHDmUUV29Wo0du7chfPggTGeYT8qg0WJ30WZEjuiHmUMdVIR1Ak3TOHZ4C2iKwtJFGS4fEdqDpv5JRaRzkEiF4PI40Kl1kMrt3/jL0pqs2bOwYftOlFwqwoghzLa/tAdN0/hxl6V9WI0mjI0e4LAtLI7hfXcWJ7D31FlUV99F9uJFEAiYPT3tPnsGNfcrkJWbA4GQ2Vz5nuKzqLlTjoyFWRCKma1N7Sk7h5rr15CxIBMiKbOb3/7rZ1F96SoystMhDmCm9DxTcQoPzl1FdmZKh+GKnIHVYsWhovVQRimRPDnRZf04irMUkU/Te3Aorl3Iw6ipi53edneFIAgsTJ+PtRt3oEy0H4P7OjbyNxtM4AodFH4YjIzXtN1Fd9rH5ldTkTRNI+/gQahU1chZmsvIqdE0jR2HD0BV8xDZSxYydmoFxw+i4eE9ZC9ZyNipFZw+jPrbFViwZBFjp1Z4/hDqrt1EzuIFjJ3a0dIDqCotx+LF2S51aqSVxL687xDRP9KrnZqzFZFPMmnAeNQ+0LAiEifD4XCwODsVlaX3cO3eEYfaMhmM4Ls56sjTkFar0yL6t2n7B1Wko4cv4DeOjSRJbCoqAIfgIGNhJjgcBmINisSmojzQFIWMnEzmobV258FiMiFzYRbjulv25cOs0yLbjrBcOw7mw6RSY0FuNuPQWnuP5EFXXY/Fi7MdUoHZ0tehPesRNagHZgwb67J+nIGzFZFPQhAEInorcft6gUva787w+DwsXpCKWyfLoVWp7W7HpDeC52DUEdJocmi7gNlgAI/hQzVLW/zCsZksJqzfuRVBgVGYm85MNGE2m7AubzPkQRGYn8qsrsVswob8TZAGBiMldS4zsYbFgo0FmyBSKJGWOp9x3c0FG8GXSpGRNp+ZWtNqxa5dG8ATCZCTnuKyp8NmTp/aAWmgFLNG2B+1xF04WxH5NDPHTMGdq6yIxBUIxULkZqfg8O5NMOoMdrVx9v4th4UfNEU79JsyGRx3rh1BOenwBfzCsW3bsxMxMYORNGcio3paTSPW529GZO+BmD5jAqO6Oq0aG/I2ISyuP2ZOaz91SUcYtFps2LEBwfF9MSdpMqO6Rp0Om3esR2B8LOZPYxZr0qTXI3/7WgT2iUZaUhKjuvZw8dpe6FV6pE2b7vK+nEFjnR4jeg53WftiiRA8Phc6tc5lfXRnJAESZKfNxYGC72ExMU+qaTWYkRAy0AWW2Y7ZoAeXYbYOW3FUEdl8+AJ+IR5JyUpHYGAoozr7iovx6E5TaC0xwxxq+y6WoKr8MtKyMyCWMVvX2nftAqrKLiEtMw0SObOwXAdvFaOq+BLSMlIgVTJTep69dxb3T5UhM3UeAoKVjOrag7pOhQdl9/HM4kyviChiC5p6AwKDXZthIG5QGK6W5GF0IisicQWKIDl6j+uD/Tu/x6y0ZxjFkLUYTTZnrXAVxbfuYmRkLxzwqBW+j1+M2ERChmKN40dR86AC2YsXMXZqu04dRc3tcmTlLmTs1AqLj6Pm2jVk5+Ywdmp7Lh5HdelVZOcuYOzUTlw5godnr2LRwky3ODWT3oijezcjNzuF0Y3F07hKEfkkEweMQ91DVkTiSpIGjkJE/0icOrmDUT2r3rH1MavFAo6DW1isJiMEDBMd2wpJO+fwBfzCsdlKcw41k15rXx60/YUwqFXIyl0APkOxxvbDRdDV1CJ7cQ74DENr5R8rguZhFXKWMM+hdvBUIRpuP8TixdkQuiGbM0WSOLBrHfpO7g+RD2WPdqUi8kkIgkBkXCArInEx04eMgV7FbMqXIkmHHsTMBiN4DkYdsRqNLhs1smtsfojVasH6nVshlimQmpnMaHqMtFqxoWAL+GIJ0jJT7QittQVcvgAZWcxCelEkia1FW0BwOMiyIyxX0Z7NoKwkFi1Id8vIiaZpHNq7AdGDemBK3+Eu78+ZuFIR+TSsiMT18IV8kGYrozocHheklVmdJzHpDQ6LT6wmk8tGbN0Jv1hj6wq9XostRXmIjB2IqVOZ5UEz6nXYUrgdYX0GIGkS0xxqBmwu3IqQ+L6YMYFpHjQjtu3agsC+sZg9fhzDuiYU7dqIoL49MG8cM1GMI5w+nQexXIxZI71fAfk01Y8OQhHs2oDPzYjEAvAFXGgbdZAp2EgkLoPh2i6Hz4PVYoW9rslsMIDroKKRIklwGcwkMWobBEgHI6tQDtZ3F37v2A6UXsT9m5eQmpUOaQDDHGqXL+Lh1YtIzkiBTKFkVrf8Eh6WXkByajICgpiF5dKqVMjfuwMRI4di2lCmYbnU2LN7C6LHJGDGINfmUHuSSzf2QVenxeLsVLf16UzU9QZMHsLsAcIRZoybhBPFOzBm2hK39dkdoWnbgxpzeTxQDozYzt++g9GRfe2u72oouulwtA1fwK8dW+Gpk6h/XInsxQvBZxhaq+jcKdRX3rYrh9ru0tOou3ULmQuzIWS4GL3vyinUXilH1sJMCCXMRhCnyo+j6kI5crLTIA5w30hAU6fC/dJ7eGZJls8oIJ/GHYrIJ4mIDkL9Pi1IkgTXBXnFWAC+iA+zwWTz2jJX2FTeXpqijjg4jegjkT28Hb9cY6NpGtsO7IVWVcvYqTWF1toLTU0VshcvZJxDLe/4fjTev4/sxTmMndrO0/vQcOvuDznUmDm1w+f3oubqHSxenO1Wp2YyGHFk3xYs8jEF5NNYra5XRD4JQRCIigtExTVWROIqhDIRjDq9zeV5YiGu1F21uz+rwTHhB0WSIAjX3ZLJH6YiHT18Ab9zbCRpxYZd28Hl8ZC+gFkONYoksalwOwiCaMq/xjSH2p4doEgrMu3Ig7Zt73ZYDSYsWJQFLgPJMEVR2H1gG0xqLRYvygLPwey9TKBIEgd3rUP8xL4QS313wZu0ukcR+TQzxkzBvWu1bu+3uyCSCmHQ2u7YxvaIg9WREZuj4bSMjqsqO4N1bD6KyWjAurzNCAqPwdz5zCJ9m01GrM/bCEV4FObNY5gHzWzC+vyNkIWGIcWOPGib8zZAHByI9GRmedCsFgt2FqyDWBmA7OR5bp0GpGkah/dtROSAKEztN8Jt/boCjUqLAKX7HbNILIBAyIOmQeP2vrsDI6L6obK2xObyQqkYZr3R7v5okmL0QPs0JieIT1ia8Js1NnVjA7bv24X56cmQK4MY1dWqVdi+pwBRA4dhyliGYg21Gtv27EDE4CFIGsVMrGHQaLC9aCvChw3C9BHDGdZtyqEWMbwfZg1zXQ61jjhzNh9CqRCzRzMLY+aNVD86CHmQZ0acM8ZPwrGSfIydzopInI04QAyT3vYRmEgqdmjE5uhgxmwwgu/CAMgUTYCiHVRFOljfXfiFYztQXIz6mvvIXLQAQoaLt3svnEN1xQ37cqhdPoeaq/blUDtw4xweX7yCjKw0iOXMUsacuX0KD85eRVZGMmRKZkpPZ1B2Yz801WosWZDm9r5dgbsVkU8SHhWIhr2siMQVSGRimLS2Oyq+UADSZHGhRZ1TfPM2RkfFuqx9Z0wl+spUpF84tobaB1iwZBGjlDEAUHDiMHT1NchevJDxFMLOM0egqapC9pKFjCKYAEBR8RGo7z1AzuIFjNLNAMCxSwdRX37f5elmOkJT34h7F+7imSW+EwOyK9R1BgSGuE8R+SQEQSCqTxAqrhag7+B0j9jgrwhEAlgYOCqCIEDbGeSXtFpBOJgpw2oyMRacsbSPXzi2lMw0xnnQtu3bCQ6Ph8yF2Yxu0E2Ky12gQSM7dwHjunmHd4GyWLBgcTYjYQtN09h/rAAWvRGLF2cxErY4C7PRhCN7NyN3QSp4DsbE8yZIKwW+Bz/PzDFTsHZLPvoO9pgJfglBEG6Tz5udkG7GajI6vl2gE0hwQDooqyCdZIur8Yu7EyOhh8WMzbu2QRERjVnTmaWMsVos2Fy4DbKIcMxlmDKGtFqxrWgrJKHBmJ88h3Hdot2bIQlWICMjxSMjpeYYkH0m9IVE5j9PlZ5SRD6JUMSHUMyHul4DeZDrMpl3SwiC0SZtDrcprBbTGRyT3uC4YzM2jdisFvs3iXcG7YQ1NtpH1tj8ShXZFXqtBhvyNiIsrh9jp2bQ6bBhxwYE9Ylj7NSMOh027VgHZVwvzJ+eyKiuSW9AwY7vERgXhbTp0zw2/XfkwCZE9ItAYn/fVkA+jbpBg4BAzzvqmRMm42pxnqfN8Dt4Ah6sZtunI/liIcx65olKm0Zsjgk/SIsZPL77lxf8Eb8YsdnC/ksX8OhGGVKz0iGRMXsq3nf9AqouXUJqRhqkCqY51EpQVXwRqenJkAUqGdXV1DVg3/7tiBk/GNMGMFNrOpOzZ/PBFwkwZwyzhKq+QE3VIY8pIp8kLEIJVa0epNWxCPMsrRHKRDBo9TavR/MlIhj1BsaCrnN3bmNUeB97TGyFKx9cWfGIn1F45jhUj+4jK3cho3QzAFBYfAIN9+4ia1EOo5QxALDn0nHUl99G9qJsCBhGJDhx7SiqyyqwaGGmW9LNdERZ+X40VjViSY5/KCCfprHOgClDPaOIfBKCINAjPgg3r+Sj/9AMT5vjN4ikQhg0OshtzEPIl4hgYhCtpBnSwc3Z7oCkOSBpB9fYfCTil19PRTYJPQqha6hHVm4O8xxqR3ZDW1ONBbnMnBpN0yg4sQea+4+wcEkOY6d28EwRGm49wJIlCzzq1LQNatwruYtFDNP8+BKaes8pIp9mxujJuHedjUTiTIZH9UVl/QWby4+JicPVWuZhtaxGx+JE0jTNOBsBS8f4rWMjrVZs3LkFfKEI6VnMc6htKtwGDpeHjEzmedC27d4GmqKQxTQsF0WhaM9mkCaz23KodYTFZMbhPZuwKCvZrxSQT0OSnlVEPolAyIdYKkBjvdrTpvgNkgAJTFrbo4mIZBJY7Ig+YjWaIJQ4GE6LYaB2plAgQIHj4OEbztcvHZvRoMf6HRsQGN0Lc2ZPY1TXZDBgw46NkEdHYf7s6YxGKmajCZt2rIcsMgypcxiG5TKZULBjLWQRwcicwywsl7OhKAoHdn6PPuPjIQlwT44yT+ANisinmTl+Mq6eZ0UkzkIsE8GkYxZ9xMIgWkkzlIW5kvJJnJF9uyu6U6xI73hUdSIHr1zCgyulmJ+ejAAlszxoGlUDduwrQOSwYUgczjQPWiPy9mxHxMghmDZ0KMO6zTnUBmLGoOGM6rqCowc2IaxvBBIHuD9UlztRN2g8EiOyM8IilVDXG1gRiZMQSUQwG8w2l+cLBbCabC//JI48jJoMeodVlSw/4leObff506i9ewuZixZAwPAi2X3xDOpu3rQvh9rV06i9fAOZOZkQSZnmUDuBqgs3sCA7DRI3ppvpiHPnC8AV8DB3rP8pIJ+m+tEhKIK9y7EBQHR8EG5ezkP/YZmeNsXnYbpJ21MzJcU377h+xOYU8YhvqEf8YiqSpmnkHdmPxqoHyF6ykLFTyz9xAKrKe3blUNt19gAabt5BzpIcxk7tSPE+1Fy5jcWLs73CqV2+dQAND+qRNXuWp01xC+p6A4b3dF+WcVuZOXoK7t2o87QZLDbSJPxwrA2ryYSxUb2dY1AHNK2xOX74An7h2Hbs2wmappCRk8k4tNbm3TtAWszIyslinENt+/48WLQ6xjnUaJrGnkPbYWhQI3dRpltzqHWEVqXG3XO3sSjTM5FNPIGm3gClG7Nm2wpfwINEJkBjXaOnTfELuAIeLAymF5ujj9iKxWQG18HfsNVoZONEOhG/cGyykDDMnz+LcQ61DXkbIQkJQcp8hnnQzGZszt8AoVKO9BRmedBIixU789dBGCDBgtT5jNSarsJiMuPw7k1YmJUMvhc4WXfhTYrIp5k5fjKuFOd72gy/QCgVwsgg4SjT6CMWkwlchvtjn8Zqcmy7gC1QP8SKdOSgfMRleNzKBw8eYNmyZQgODoZYLMaQIUNw7tw5Rm0kThrLqLxeo8aGvI0I7d8fs6cyyydm0GqxKW89ggfEY95UZmG5jDo98revQciAXkiZwiwsl6ugKAoHdq1D3Lg+kMo9Px3qLrxREfkkoRFKaOoNLosb2J0QykQw6mx3VM3RR2yFpijHI/ubTYyXUJjSvMbm6OELePRxtaGhAZMmTcK0adNQWFiI0NBQlJeXIzCQmZqRCXuvFKP6yhWkZ2dALGM2DXWg/BweX7iM9Kw0SBiG3Dl75zTun7mCrPRkyALdn0OtI44d3IzQuDAkDRzlaVPcijcqIp+mR99g3LycjwHDWRGJI4yI6otLNcUI7ZlsU3l7o484BINAzSxd41HH9pe//AUxMTH46quvWs717u26BdSdZ49C8+ghshfnMM6DVlRyBOq797Fg8QLwGaqXjpUdQv2NSuTmZjEOy+VKzhXvBMHlYN54ZiNPf8BbFZFPMmPUZHy7IQ8DhnvaEt9GIhPDeNv2vWmje/TG6TvXENEn1nVGeQDKCVOJlJ356tyNR8eVeXl5GD16NHJychAWFoYRI0bgP//5T4flTSYT1Gp1q8MWaJrG1gM7YWxUIWsRs+SeTYrLXdDX1Nnl1A6eLoS68jEWL/Yup3al4iDqK+uQPXe2p03xCN6qiHwSvoAHqUKIhhqVp03xacQBEph0DKOPMJi6JH5IjWMv7gqnRdKEUw5fwKOOraKiAv/617/Qt29f7N69Gz//+c/x61//Gt9880275d99910oFIqWIyYmpss+mkJrbYZAIkV6egqz0FpWK7bs2gSuQICsTGZhuSiSROHuTSDNVizMYhaWy9XoGjW4c7YCuVndRwH5NN6qiHyaWeOn4CorInEIkUQIi952VSTT6CN8oRCknZu6gSYxGpfXfURb7sCjU5EURWH06NFYvXo1AGDEiBEoKyvDp59+ihUrVrQp/+qrr+Lll19uea1Wqzt1bka9DlsKtyG0/wBMH8dsDcmk12Nb4RYED4jHrLFjGNU1G4woLNyI4H49MW/seEZ1XY3FZMahoo1YmNm9FJBP4+ms2bYSHCaHVmWE1WL165idroTD4TAaUQlEQpAm23O48YQCUBbbyz+NyeB4klJbcE4Gbd+YivToLyUyMhIJCQmtzg0cOBBbtmxpt7xQKITQxqnA/ddL8ejSRaRmpEKqUDCy69DtC3h0rhSpacmQBSkZ1dU2qLB37zb0GDcI0wcyC63laiiKwsHCdYgb2wcyRfdRQD4NaSXB4fnOSDWmfzDKy/IwcESWp03pFhAEAZrBDZyp43yapjiRrg+nRdEcUA6qGikfiTziUcc2adIkXL9+vdW5GzduoFevXg61W1RyEvV3btuVQ21v2UnU3biFrIVZjKN1n7x2FI8v3cLCnAyIpN4nTDh2aDOCY0ORlNC9FJBPo65XQ+4FWbNtZfrIyfhm3Q4M9K/k5W6FIAhQFOW6faMO3O/P36xg40Q6GY86tpdeegkTJ07E6tWrsXDhQpw5cwb//ve/8e9//9uu9miaRt6xfTBrtViweCGjdS2aprHz1D6YGhqRs3gB40jdh87shra6HouXLPDKKaPzF3YBAOZPmOJhSzxPddVhr8iabSt8Pg8BgSI0VDcgMMx1W2H8Gb5EALPeCJHMtrB3BIcD0upYxH5bsRpNGN+rn8v76U5TkR4Vj4wZMwbbtm3DunXrMHjwYLz99tv4+OOPsXTpUsZtUSSJTUXbQBAEMpjmQSNJbNuzDbTViqwF6YxDaxXt3QyLwYjcnAyvdGpXbh9E3Z0aZM+b42lTvAJfUEQ+zczxU3CluMDTZvgsQomQ0SZtgUTEKPoIh8+D1c51NovJPeG0KDiujKRcbqVz8Pg28pSUFFy6dAlGoxFXr17F888/z7gNi8mI9XkbII+Mwvw5M5jnUMtbD2lEGFLnMgvLZTWbUZD3PaRhgciaxywsl7vQq7W4c6YCuQyTrfozvqKIfJLgUDn0ahMsZvtFCt0ZoVQII4NN10yjj/BEQpj09m3qJo2ujzriST755BPExsZCJBJh3LhxOHPmTIdlk5KSQBBEmyM52bbN9c34xZ1ua9F2hA8ajJmTxjGqp2tUY0v+eoQNGYg5E5mpF60WC3YVbED44DjMn+CdKV6sZgsOFW5ATsZ88IXdVwH5JBaTxWcUkU8TNyQMxUc2etoMn2RYRDwq60ttLs80+ghPLLbbsVnNJgjcIR5xOHs28w3eGzZswMsvv4zXX38dxcXFGDZsGObMmYPq6up2y2/duhWPHj1qOcrKysDlcpGTk8OoX79wbCnpKUgcwSwx6P5rZ5C3dzsyF2Rg2jBm6kVtgwr529YgbEgfzBzqnck4aZrGgcJ1iB0TB5nSt0YnroCmady6mof9W7/CgDFRnjbHLqYNnwyaplFetsPTpvgcYpkYZgZ700b36I2rdddsLs+XiHCmqtwe00DTtFv2uXoiVuSHH36I559/HqtWrUJCQgI+/fRTSCQSfPnll+2WDwoKQkRERMuxd+9eSCQSxo7N9x5b20EkZSZdLzx3ENqHj5GzJAc8PrORzLFLB1F3oxILF6TbvBDtCY4d3oLgnsGYNmi0p03xKBRFofJ2IW4UP0JQuAyrlmb45Gitmex5c/H1uu0IjWiEMoTZNpbujFgmhomBYxPJJLDobY9WMqZ3HE5evWqPaT7J01Gf2tuKZTabcf78ebz66qst5zgcDmbOnImTJ0/a1M8XX3yB3NxcSBne4333F24HFEUh72ABQBBYkJvNaE2MpmnsO5IH0mLFkiXZXhVJ5GmKSwtBkSTmT/SODALuhqZp1Dysxa3LRVDXGxEaHYDc9PmQBvj+OgaXy8HizGSs2bQB0zNXQiByLF1Kd8Gu6CMMwnAJpWJYDbaX9wTOSBTaXP/pwBivv/463njjjVbnamtrQZIkwsPDW50PDw/HtWtdj4bPnDmDsrIyfPHFF4zt7DaOzWqxYFvhFsiiwjEvkZnknaZp7Nm/DQKZGFleriy8eucQaiqqsSw3w9OmuBWaplH/uAE3ywqhqtEhOCoAM8dPQXCo92RScBYSqRBDJ/fE4fxvMT1zFbg8733I8hZcHX1EKBHDwkBs0ozVYnHbQ7Iz0s4016+srIRc/uNvy9bAGUz44osvMGTIEIwdyywtGdBNHJtRp8O2wi0IGzwAM0YxWxOjaRp7Dm4HXypC2vRpLrLQOeg1OlScvoVluRndRgGpqm1Eedku1D/SQBkmRdKoCQgJV3ilQtWZjI8fC5PBiiMF3yIxbUW3+Xu7C6bRR3gCASg7cueZ9AbwXOAUXI1cLm/l2NojJCQEXC4Xjx8/bnX+8ePHiIiI6LSuTqfD+vXr8dZbb9lln987toM3i1FVcglpmamQKpg9vVstFuzeswWSEAXSpnm3U7OaLTi0az1y0uf5/fSUul6D8rKdqH2ogTxYjKSRExA2W+n3zuxpEodMhNlwGCf3rMXEOcu63edniiujj9j73ZuNBrdFHXHOBm3b6wsEAowaNQr79+9HRkYGgKbloP379+OFF17otO6mTZtgMpmwbNkyu+z0a8e2u/QYGm/fsyvdjE7ViD17tiJyRD/MGubdIahomsbBonXoNbo3AgKZJUD1FbSNOty8vBOP7zVCphBi6sjxiJwR1O1HKrPGJiL/0D4UH12PUVMXe9ocr8Ybo4+4K04kAFA0AcrBtDNM67/88stYsWIFRo8ejbFjx+Ljjz+GTqfDqlWrAADLly9HdHQ03n333Vb1vvjiC2RkZCA4ONguO/3SsdE0jfyjRbAaDFiQy1zoYTYYsWfPVuRkp0Ec4P3Bgo8f3YrA6CBMH8wsC4G3o9focfPKTjy+2wiRhI+Y/sFISZze7Z3Z06QmzcSmXYW4fH4LBo3K9rQ5Xktz9BFbHVtz9BGx3LaHxeboI0yU1sW3bmNsdJzN5X2NRYsWoaamBq+99hqqqqowfPhwFBUVtQhK7t271+b3fP36dRw7dgx79uyxu1+/c2yk1Yptu7dBFKRE5txUxlMEJ68dRdXFm+gxfrBPOLWSS0UgzVYkz/GPhKFGvRE3Lxfg0R0VBCIeYvoGY96SaeByWWfWGQvmzcXarfm4eSUP8QlpnjbHKxFIhMyiiYiFMDFwbE3RRwzgKWx3bKTJBKHYPduGKCdMRdqTgfuFF17ocOrx0KFDbc7179/foWwJgJ85NpPB0JRDrV8fzBrHbPRCWqzYe2g7QANLluZ4ZczHp7l29zCqy6uwbHGmp01xCJPBhIprO/GwogEcLgc9+gZh+aI0n95v5m4IgsDijBR8u3EHhKJdiImb72mTvI7hkfEorbqAiN49bCrPl4gYRRNpjj7CZC3f6sZwWs5JW+MbD5h+c+fQ1DegYH8eIkcPQ9LgwYzqmg1G7CpYj7DBcZgzirm01BMYNDrcOnXTZxWQFpMFFdcK8OBWAwAgOj4IS7NTIGBDf9kNl8vBsuxUfLN+B/jC3YiI9u6tKe5GLBPDpLN9k/aYmDicvnMN4XGxNpVvij5yA3MjO1f8PYnVZIJQ5DuZJnwFv3BsB66egfrufWQtzIRQwmxYT5Ekigo3IXpsgtclBu0Iq8WKg4UbsCDN9xSQpJXE6f3fw6A1IyouEIszkyEUsc7MWfAFPCxdkILvNuZj8nxdt04o+zTeGH2Eoki3pMYBABIESAc3aDta3134hWNT37uPnCU5dl0gew5sQ1B8D59xai0KyJGxkAf5lgLSaDDhaP536DM0HEnDvDNwtD8glgiRmzkf67etRVLGCojEvrdPyhXYE33EysARCiXeHX2kO01F+oaVXZCekcrYqdE0jf0ndoLL52Pe+Akussz5nDi6FcoIJaYP8S0FpKZBg0Pbv8HgiTGsU3MDcoUEw6f2wpG8b9lUNz9gT/QRq9F2R+gLYbW6C37h2JgqH61mM/K2fQcOl4PMeb6jJrxQVgSL0YKUqUmeNoUReo0ex4vWYUl2Msb18S2H7MuMjRuDgWOicST/W5Ak6WlzfA57oo+QTB8iHFT/MYHEj9OR9h++gV84NiZQFIXCwk2IGNYXadOm+Uy0hmv3jqDqRhUWpMz1tCmMsFqsOLpzLRalz4MsgF0kdzeTBo5Hr4GhOF74ncMSan+gOfqIq9r2ZpqnIh09fAHfsNJJ0DSNPQe2QRETjplDRnjaHJsxavW4dbIcuVkp4HpxVoGnoWkax3Z9hwFjoqAIZEUMnmL6iMkIjgjAmf3fe9oUj9McfcRWmqOPsPgW3caxWUwm5O9YC3FgAJInT/a0OTbTpIBcj+y0uRD6mAig+Oh6hEbLMSXBd9Yw/ZV5k6aBJ+Cg9GT3zsDdHH3EVpqjj9gKh8eF1WL7dCTB4YBy0zSxJxKNegrfsNJBTHo9CnZ8j4hh8UiZ4js5ymiaxqHd6xEzrBcUQb6VfqW8bAdMBivmTfLu4NHdiYyZs6FtNOF66TZPm+IxBBIhjDomm66ZRisRwcSgPFcggMVsu/LSEegf8rE5ctA+Ivf3C8emtXR8YZBWKwp3bUJm6jzMGDTcfUY5gZPHtyEgTI4Zw3xj03gzDyuLcPdaDXKS5z1xlobBWg2N5S4M1hqAwaK8p6FpCwzWezBYboOktJ42x24IgsCi1Hl4dEeF2zcKPG2OS1Fb6lFregiNpb7V+eGR8bjfUGpzO3yJCGY7oo/YXF4ohMn449SohSTxoKHR5vos7eMX+9jW3zmDPvpoJIb3h4T344ZlmqZRtHszwgb1RkCw0nMG2kHp5d0waU1YlDHT06YwQq814OKxe1i+KK0lvqPWcg9V+hMwUz+mkxdwFIiQTISMH9NRU14ABZXxDNSmC6Dp5uklAmJ+LILF08Dl+N66IYfDwZKsFHyzfgcEoiJE9/QtMVJX1JkfoVxTAgOpaTkn4Qagb8BIBAkivC76CE8kgsmgB6UIxNnb91Fa+YiRY2SCMxONeju+YaUN3NXWY+vdYhjJH+e3D5zYCXGQ3GfCZDVz/f5RPLr2EDlp87xeafUkVosVRwvWICd1DkTipgcMjeUu7mmLWjk1ADBTjbinLYLWUukJU22iVr8fjcZzTzg1AKBhsNxFlXYTKJp5xmRvgMfjYtmCVJQdv4fGenXXFXyEOtNDXFQdhYFsParWk1qUqo6g3vyIefQRqZhR9JHRvXvDarS9fb5IhDMPbuPg1Vs4f+cBrKRrFJvAj2lrHD18Ab9xbDRoaK0mXGy4DwA4deM4TI06r896/TQWkxk3j9/AouxUn1JAAsCpvd+j/6hIBAY3R0ShUaU/3kkNGo/0x+CN05Im8jF05mto3zYKVkoLtcn2KS1vQyjiY0l2Ck7uXu8Xe9xo0LihOd/y6ul3AeC65jzj6CNCCcPoI2Jmm7RHxfeGRqPB9apam+uwdI3fODag6eK+onoI0mLFows3kJXqWyMeADh+ZCtiR/X2uTBId2/tBIdLYOrgiS3n9NZHsHSxJmWhNNBbH3daxhPozFfR+c+DhsZU5i5zXII0QIReA0Jw7cJ2T5viMI3mGhgpPTp+SKJhJHXQkPWMHqP4QgFIi+1yf75QAIrBJm2eQACVWgN33KaaM2g7evgCvmElAwykBfuP5iN8cB/whb4VIPjq7UOgrJTPhcuyWqy4euYBsp7KCWehdLbVt7GcO7FSGgCdTws1TUV632iTCTPHTEXljTqQVt8etZko26aFTaSeUbQPLo8LmsH0IE/AB8lA7s/j82E2m90SgISdivRhRIZ6mPVGzBntW+tqFEni9plbyPKhEF/NFB/diH4jItuknOERtkUa4XLck4+KCVxCgq5+HhxCBPiI/LkjuFwOeg0MwdUS394CwOfYNsPBd/G1xuXzQTHY0M0TCMEhKbeM2LoTfuXYaIMZ1KVHyEz2PaXXueJdiOgf6XObsLWNOugaje0GNpbwo8AlOr+R8AgJpLxIV5lnN1LBAHQ+YuNAJhjoLnNcyqwxU/GwosHTZjhEoCC8S6cl4IihFIS61A6CIBgN4nl8HqQ8rntGbOA45fAFfMPKLqBpGrz6KlhKLmFJVhpEUt+KSUjTNGoqqjF77MSuC3sZV87vQN8R7TsmAhxESDqPOhIuGQ9vvAxFvCiI+bFof0TGAYcQQi4c7l6jXASHwwHB8e0hAwEC8bJhnZaJlw0HAQIuHx4xaZ4gIOLz0CtY6fLBP0kTTjl8Ae+7o9iB+cwFcBqN+NkzSxEW6tonMldQVr4fgdGBPqeCtFqsaKjWYUK/jqd9FYK+iJImgUu0HolyCSGipdOgEMS72kw7IRAqmffDqKz1z0TADUVEwAJwOTLPmMbSLhGiWAyUjwOfaL22zieEGCgfh3BRTw9Z1jHNGQTmDumHgRGh7JSkk/CLDdqrlixCr4goT5thN4+uPEBO+nxPm8GY8rI89Owf3KXyVCnoB4WgD7SW+7BSevA5Ekj5PUDAux05QfAQLJkBpWg8jNZK0CAh4IZBwPW9h6eu4HCaot5zOL79rBshikWYsCcazFUwUQYIOWIECSNAeOkzfPNvh8vlYFpCH4zrE4NbDx7hhgv6cob4w1fEI37h2MKkCk+bYDe6Rg24fB5EEu8TUHQGTdO4d70OK5ek21SeABcB/F4utso1cDnSH9bc/BeegAuzyeJz20zag0NwECzs5EHX1QtaTJt/wh6JUID48BDn2tPSjeNpZ2g28giLLZw/V4g5k3wvo/SDu0UIDJOCz/eLZ6Nuj0DIhdXUTTJte9MaG4tLYO9KHsRqtkBXr0VwZLCnTWHMrYuPkT7bt+JYsnQMX8iDubs4tm5KcxZsR9vwBVjH5kEuXNqN8L62BUv1JvRaAyiSglwh8bQpLE6CL+TCbLI91BSL8yAIjlvWNyna8TUyykfiEbBTkR6CpmlU33yM2WN8T+J/tXg74oaEe9oMFiciEPJgYUds7UIzXTRjWJwnFsGo8910SN4I69g8xNXbhyCPUIDL825l4NOQJInaBxpMThjvaVNYnEjfoP7Q6s542gyvhGA6/cawuEiugLZRxaySHVA/iEccPXwB37DSD3lQVol5k6Z42gzG3LqSj+j4IJ8LLs3SOQIhHxaTb8eL9FXGDRqAkxXXXN6Po9mzmw9fgHVsHsCgaQr6KwnwvTWqu1drMWvsVE+bweJkhEIezEbbYxyyOA9ZoBJGjf/kxfMGWPGIBzhfXIioQT08bQZj6h83QKYUgi9gLxt/Qyjiw2LuJiM2hvvYXL3GJhCJQLpBuOOMkFhsSC2WdiGtJNRVjZg2aLSnTWHM5XN5mDMp0dNmsLiApqnIbjJiIwjQDJybq9fYAIDgckAyyApgD+waG4vLKC3bjbD4cJ9bozIaTDAbrVAGsfER/ZEmVWT3GLF54y9PrFRCXV/naTP8BtaxuZnH5VU+GcX/avF29B4U5mkzWFwEh8MB5SublByFIEBTticPZTwVaQfjhiTg6E3XZmSn4IREo175WNAW1rG5kYaqWkiDZOAL+F0X9iIoisLje42YOqTzFDQsvo2PTSK4DcZTkXYgDwmBsUHl0j5oJygiadaxsTxN8fndmDtpsqfNYMzt6wWI7K30+cjvLCxAkwN3R2JPJgjFYlhNJk+b4Tewdyo3YdIbQVqsCAgM8LQpjLl9uZqV+LP4DwzFI+6Cw+PCanFd9BeHpyGdkPbGXbC6bTdxvngXIhOiPW0GYxrrGiGSCCASC7ouzOLz0DTtc8ImphAEXDtks7NpkaJJQCKWuebh1xmqRlYVydICRZJoeNCAGUM7zjTtrZSdzcOcSexorTvAF/BgNXcDyb+rR2x2PheMG5KAYzcvO9eWbgo7YnMDF6/tQ0jvUJ97EjYbzdBrTAgOk3vaFBY30Bzhny/0LXETU9whBrEHeUgwDKoGl7XfnTJosyM2N1B17SHmjfc90ci10h2ITQj1tBksbqLb5GTz0nuzUCx2aQQSNlYki9NorG2AKEDsc0/BNE3jYUUDpg33vezeLPYhEHJhNvp/TjaC4VSkq0NqPQmHxwPpQgFJd4GdinQx588VYv5U31ujulO+E+ExClbi343gd6OcbN4WUqsZkVIBdUO9/Q10AjsVyeIUTAYjLHozFMEKT5vCmIqyx5g13vccMov9xAf2g1bbDXKyEWA8qmIkNnFgxDZ+SAJOVVy1v4FO6E5yf486tjfeeAMEQbQ6BgwY4EmTnMr54kJEDfa9KP6aBg34Ai4kUqGnTWFxI0Ihr1sEQmY6FQmC4QiPQ4BiELLrSeQhITCoVHbVZfkRj09FDho0CPv27Wt5zeN53CSnoFWpobpfj4wZMzxtCmMun9uBWRN9Lwkqi2MIRHyYu0MgZKb72BiGKmleJ+MImT8YCkQil62xdaepSI97ER6Ph4iICJvKmkwmmJ4IO6NWe19yPpqmUVa+H5Uld7EoO8XnJP4WswXqegPCIwM9bQqLmxF2k9Q1TNfMmP6G+VIJDFot+HY4NqApAgmLY3h8ja28vBxRUVGIi4vD0qVLce/evQ7Lvvvuu1AoFC1HTEyMGy3tHJPBiFOndqBw45dQPVRh2ZJMn8yQfeNSHnoNCPG0GSweoCknW/cYsblyKlIgl+Fk5RU7DGtCrHDNmnx3WmPz6Iht3Lhx+Prrr9G/f388evQIb775JqZMmYKysjIEBLQNK/Pqq6/i5ZdfbnmtVqs96txomsaVWwfx6OpDUCSJiP5RSF2+wGeVhDRN4/6NOqxalulpU1g8gFDEh7kbRB4hCIKRvoMAwUgQMr5fPxwtKWVsVzPjhg7CIbtrdwwNOLwPzfsibLaPRx3bvHnzWv49dOhQjBs3Dr169cLGjRvx3HPPtSkvFAohtHN470yMOgNKSovQUFkPRVQgMufN8snR2dNU3t6FoMgA8NipkG4Jl8sBRfrKrctBGIbUYrKXTapUwKzWMLWoBWV4uN11WZrw+BrbkyiVSvTr1w83b970tCltoCgKl8sP4NG1hyAIIGJAFNKmTffZ0Vl73LpYjez5sz1tBguLa7FjKpKJIxSIhLCavW+jOyse6YKjR4/is88+w61bt7B582ZER0fju+++Q+/evTF5sv2ho7RaLW7duoVnnnnG7jacjV6jQ0lJERofqRAYE4wFqXMhloo9bZbT0al1IAhAFuB/n42F5UmYy/2ZB03mcJtS0PD43hNxqDs5NsbDjS1btmDOnDkQi8UoKSlpUSk2NjZi9erVjNp65ZVXcPjwYdy5cwcnTpxAZmYmuFwuFi9ezNQsp0KRJEov78bubd/gxOFtUEYHYuWKHGTMmOGXTg0ArpzfgT5D2CkQlm4Aww3aTY6QWReiQCU09a6JIMLSNYxHbO+88w4+/fRTLF++HOvXr285P2nSJLzzzjuM2rp//z4WL16Muro6hIaGYvLkyTh16hRCQz0TeFerUqOkZDc01WoEx4ZgUWYyhGLPr+m5GtJKor5Ki6w5czxtCouHIQj/z8lGwI60NQzLTxg0EMdvXERK+Cxm/biQ7jRiY+zYrl+/jqntxD5UKBRQMdwx/6Rj9BSklcTFK3vw+OZjCMQCzBo/EcGRQX79w36a8rI8xPQP6VafmaV9eHwurBYr+ALvmUJzOgzXzOz5XShCQ2A85V3hyVjH1gkRERG4efMmYmNjW50/duwY4uLinGWXy1HXqVBSshu6eh1C48KwZEGaz0XgdwY0TePutVqsXJLuaVNYvIDmQMj+7NgYOyqmYhMAArEIVhemoGHpHMaO7fnnn8eLL76IL7/8EgRB4OHDhzh58iReeeUV/OlPf3KFjU7Darag9MpeVN98DFGACLMnTEJQePeOsFH3qB7KEAn4fK8SyLJ4CIGQC7PJAknbbaT+A8N9bCDsiJoMgMvjeZWAhKYJ0A6OuByt7y4Y381+//vfg6IozJgxA3q9HlOnToVQKMQrr7yCX/3qV66w0WFU1XUoKd4Do9aIsPhwLF2U7tdPpEy4fD4f6TN9L54li2vgCZqyaPszBAHQDIIU2yMeAQBRoALq2joERdoWMtDVOCNRqK8kGmXs2AiCwB/+8Af89re/xc2bN6HVapGQkACZTOYK++zGYjLjwqU9qKmohjRYinlTp/hk+hhXYtAZQFooyJVST5vC4iUIhDxYjH6ek82etWQ7PNuEQQk4cf0SUrzEsXUnGDu2b7/9FmPGjMHAgQORkJDQct5oNGLjxo1Yvny5Uw1kAk3TaHhUg5ILe2ExWhDeNwLLl2aBy0bSaJcr53cgbkiYp81g8SL4Qi602tMA/DusGtM1M8YqSgDykGAYTzQwrucqWPFIJ6xcuRJSqRRff/01srOzW843NjZi1apVHnFsJqMJF6/sQ92dWgSEyZE6fRoCAv15kcBxSJJEzQM1MmZ6jxyZxfP0CxqASw/KPG2GSyEAxvvY7EEgFnlVBBJ2ja0L3nzzTTzzzDO4dOkS3njjDSebxJxj+7YiZmgMlj+TDS6XHZ3ZQsXVAkTHBbISf5ZWBIbIUHfO/jiHPoGLE40+CZfHg9VsBk8gsKs+i33YFehw2bJlOHDgAD777DMsWLAABoPB2XYxYnFOKmaPnsg6NQbcuVqDWePa7kdk6d4EyCXgcAk01ntfrkNnwfhZzoGHP1GQEuq6OrvrO5PulLaGsWNrfsIfP348Tp8+jZs3b2LixIm4c+eOs21jcREN1Q2QyoUQdMN9eyxdk5w0DRdPbPO0Ga6D4YjNrkglPzBhUAJO3L5kV11n0zwV6ejhCzB2bE/+gXv27IkTJ04gNjYWs2axazW+wuVz+Zg9kR2tsbRPYHAASJKCVqX1tCmuw8UhtZqRhwTDUOc9ApLuAmPH9vrrr7eS9kskEmzbtg0vvfRSu6G2WLwLk8EEk8GCoBBWXMPSMfMTk1B6cqunzXAJBLO8oeDwmsKM2YNAJARp8Y7tE7QTpiF9ZcTGWDzy+uuvt3v+zTffdNgYFtdz7cIOxCZ4Jsg0i+8QEq6AyWCFXqP3iyS6rSEYjcB4YgEsRqPdvXH5fFhMJvA9nCSZht0Dz1Zt+AI2Oba8vDzMmzcPfD4feXl5HZYjCAKpqalOM47FuVAUhUd3VPjJ8ixPm8LiA/QfHYXSk1swYbb35Ed0BgRDlSNPJMSV2quYGhNtV3+iwCYBSXBUlF31WZhjk2PLyMhAVVUVwsLCkJGR0WE5giBAkqSzbGNxMrevFyCil9Kvsn6zuI4Jfcfi2tltMOgM/pWHkGGIrHG94nG07KLd3U0clIATly8h1cOOjQIBwgMhtT755BO8//77qKqqwrBhw/CPf/wDY8eO7bC8SqXCH/7wB2zduhX19fXo1asXPv74Y8yfP9/mPm26w1EUhbCwsJZ/d3SwTs27uXOlBrPHs+ugLLbTb2QkLvrZWhvBMG2NTCmHsdF+IY08NAjGBpXd9Z2FJ1SRGzZswMsvv4zXX38dxcXFGDZsGObMmYPq6up2y5vNZsyaNQt37tzB5s2bcf36dfznP/9BdDSz0bJTHt2Z5mFjcT8N1Q0QSfgQidmNoiy2M2nAeKgbDDAaTJ42xXkw3JcmlIhgNdofQYQv9B4Bibv58MMP8fzzz2PVqlVISEjAp59+ColEgi+//LLd8l9++SXq6+uxfft2TJo0CbGxsUhMTMSwYcMY9cvYsf3lL3/Bhg0bWl7n5OQgKCgI0dHRKC0tZdoci5soObYNKdOne9oMFh+k38hIXDrtP6M2gmnkETQrI+13Tlw+H2ajZx8OnLlBW61WtzpMprafzWw24/z585g5c2bLOQ6Hg5kzZ+LkyZPt2piXl4cJEybgl7/8JcLDwzF48GCsXr2a8WwgY8f26aefIiYmBgCwd+9e7Nu3D0VFRZg3bx5++9vfMm2OxQ3cvp4PsYyPALm/qdtY3MHkgeOhqtbB7MCoxZtomolk5tgkwQqoa+yPICIODoS6rtbu+s6App1zAEBMTAwUCkXL8e6777bpr7a2FiRJIjw8vNX58PBwVFVVtWtjRUUFNm/eDJIksWvXLvzpT3/CBx98gHfeeYfRZ2Us96+qqmpxbAUFBVi4cCFmz56N2NhYjBs3jmlzLC7EarGi5NhGGPUWLEyZ52lzWHwUgiAQPywcl85sxaipuZ42x3HsCJE1sX8CTt0qwbQo+35HExMG4njZJaQyXCvyViorKyGXy1teC520laFZz/Hvf/8bXC4Xo0aNwoMHD/D+++93uNWsPRg7tsDAQFRWViImJgZFRUUtnpSmaVY84iU01KhwtTgfWpURcUPCMX3EZE+bxOLjTB0yEZ+XbIXFZAHfD0KxMR2xKcKCoDutsrs/eWgwjPX213cGzozuL5fLWzm29ggJCQGXy8Xjx49bnX/8+DEiItrPURcZGQk+n98q7u/AgQNRVVUFs9kMgY3BpBk7tqysLCxZsgR9+/ZFXV0d5s1reoIpKSlBfHw80+ZYnITFbEF5WT7ul9chIFCEWeOnIDis8wuPhcVWmkdtl89vw/CJCz1tjkMwVUUCgFAsAmmyf42NJxCAtNoXvcRZuDttjUAgwKhRo7B///6WbWIURWH//v144YUX2q0zadIkfP/996AoqmVb0o0bNxAZGWmzUwPsWGP76KOP8MILLyAhIQF79+5tCa/16NEj/OIXv2DaHIsD0DSNukd1OLbrWxza8Q24XAIrFqdjUWoy69RYnE7SsEl4fFdld3gpr8EO8QgAcPk8h/Kr8QQCmB2IYOKLvPzyy/jPf/6Db775BlevXsXPf/5z6HQ6rFq1CgCwfPlyvPrqqy3lf/7zn6O+vh4vvvgibty4gZ07d2L16tX45S9/yahfxiM2Pp+PV155pc35l156iWlTLHZiMphw41I+HlY0QBkiwbypiQgMZmM/srgWgiDQe3AYrhRvw9BxOZ42x24IZhG1WhAHy6GurUdQVPvTaF0hClJCXVuLkB497KrvKBRNgHBzBu1FixahpqYGr732GqqqqjB8+HAUFRW1CEru3bvXKmBETEwMdu/ejZdeeglDhw5FdHQ0XnzxRfzud79j1K9diUZZ3A9N07h/uxC3r1TDYiLRc0AInl2WCS6XjSLC4j6mj5yMz7/dikGjSHB5Ppr/0M78apP6D8KJ8mJMj7I9AsaTTByUgOMXLyHVQ47tSVWjI20w5YUXXuhw6vHQoUNtzk2YMAGnTp1i3tETsI7NyzHqjbhemoeqOyoERQYgbeZMyBWsbJ/FM3A4HMQODMXVkm0YPGaBp82xCwKw6w6tCAuC/qTK7n7locEwNjTaXZ/FdljH5oXQNI27N3fizpUaUCSNXgND8NzyLDbGI4tXMHPMFHz+7VYMHEn6ZtZ6O9fYBCIhSLP964s8Pt+jApKmEZuj4hEnGeNiWMfmRei1Blwr2YGa+2qE9pAja95syAL8KPgsi1/A4XAQ0y8YNy7uwMARvpcpYqAiBnUm++7QXD7PoRQ0PGGTgEQgEtlV3xHcrYr0JHY7NrPZjOrqalAU1ep8z549HTaqO0FRFO7c2Im7V2tAcAjEJoQifcYsEHauA7CwuIPZ4xLxxXdb0X8Y5XMzCQRBoNp4DT3Qm3FdcYgC6pp6BPeItKtvUVAgGmtqERrjmXW27gJjx1ZeXo5nn30WJ06caHWepmk2bQ0DtI06XLuQh7qHGkTEKpGTOg8SqWcTEbKw2AqXy0F0nyCUX9qB/sMyPW0OIwiOfVORQJOA5Pj1YszokWxf/UEJOFZ6EakecGw0HE8U6iMzkcwd28qVK8Hj8VBQUIDIyEh2ZMEAkiRRca0A967VgifgIm5QGDJnzWa/QxafZM6ERHy5Zhv6DaV96homOBzQlH23aGVYEAzH7ReABIQEweChCCTsVGQnXLhwAefPn8eAAQNcYY9foq7X4GpJHlTVOkTFBWJxZjKbPobF5+HxuIjsrcTNK3noOyjd0+bYDI/HBWm1b2aJLxSAdGCDOo/PB8XOarkcxo4tISEBtbWejVLtC5BWEjcv5+HejTqIpQLMGD8JYRFKn3qyZWHpirkTkvD1uh2IT/CdURuXzwVlp2MDAK6AB7PRBIHIXgGJECaDAUKxm4Vh3Wgu0ibHplarW/79l7/8Bf/zP/+D1atXY8iQIeDzWwdE7Sowpr/TUKPCtZJ8aBqMiI4PwjM5qRD4QdDY7kzz+jFLW/gCHsJi5Ki4lo8+A9M8bY5N8Pk8kBb7HZskRAl1bR1CekTZVV/8QwSS0B+ypLgNJ0xFwp+mIpXK1iMNmqYxY8aMVmW6s3ikOQDxg5v1kCqEmDluMkLCFZ42i8UBVPVaPLq+C/fvaaHXWTFsZDBih2d72iyvZN6kJHyzPg9xA3zjAYAvFMBitD+g8aT+CTh2tRgz7HRsEwcPwtGSC0hzt2PrRtjk2A4ePOhqO3wOmqZR/7gB10oKoNeYEdMvGMtz08Dns1sDfRGSpFD1oB6Pru9GbY0RykAhYuMCMHPiTHA4BLbs2gXNkfUYPGWRT9y83YlAyEdIlAx3yneid78UT5vTJZIAMUxa+4MRK0KDYDim7rpgB8iDg2Csd38EEk+F1PIENt2FExMTXW2Hz2A2mnHjUh4e3GoKQDx3ChuA2FcxGsyoulGAuxUamEwkIqMkmDI6EaGhsjbOKyclBUVHduPkrjWYMH8Z69yeYt7kaVi7uQCxfb1/1MbhcBy6QTsqIOHyeaAo989ssarITvjqq68gk8mQk9M6uvemTZug1+uxYsUKpxnnLdA0jZqHtbhWshNmoxW9BoRi1dIM8Hw1CGw3haZpNNQ1TTE+vK8DX8BFr1gZspPnQyrtWqU6d+oc7DxQiAeXt6PHYN/au+VqRGIBlKES3KvYhV597Nvj5U74Qr5DAhCug/X5IhGMOh1EUqld9Vk6h7Fje/fdd/HZZ5+1OR8WFoaf/vSnfuXYjAYTrpfuQNVtFYIiZEibMQNyJXsh+hIkSaH+dgEqbqrRUG9CYJAQcfFyzJky267MCLMmz8JX67YjepD3j0zczbwp07B++0706uNpS7pGGiyFurYBIT3sS0EjCVZAXVOLkJhou+qLgpRQ19W517HRhOPiD38dsd27dw+9e7cNRdOrVy/cu3fPKUZ5Epqmce/WLty+XM0GIPZR9DoTHt8owN07WljMJKJ6SDF9wjQEB0sddkYCAQ89YqSour4DkQMynGOwnyCRCiFTiHD/TiF6xM7ztDmdMj5+CE5XnEZID/v2300eMAhHr5Rghp2ObdKgBBwpLkGaG0MQsmtsnRAWFoaLFy8iNja21fnS0lIEBwc7yy63o9cacP1CHqorGxESzQYg9iVomkZ9jQYPr+3Co4d6iERc9OwdgIWpyRCLnb/VYsbEmfh2Yx4i+rOjtqdJTpyOjQWF6BHraUs6JzBMCc1p+wUgitAg6OsciEASHARjg/39s3QOY8e2ePFi/PrXv0ZAQACmTp0KADh8+DBefPFF5ObmOt1AW7ijPY6e4mGQ8cIY1aMoCnfLm9LDEBwCvQaGIm36TPZm5XSsMFuuwWwuA0VrwSFkEAiGQMDvD3vjcFutJGpvFeBOhQaqBhNCQkUYPWgi5iUpnZp8laI0sFhKYbXcBECCy40Enz8c4ZFi1NzMQ1hf34m44Q6kASKIpQLUVdUjOCLI7f1TNIVq0108MlTAROkh4kgQIY5DmLAXOMSP14VQLITV5EAEEQEflAN74doTkGjNJlysfozyhw/sbrdT2A3aHfP222/jzp07mDFjBni8puoURWH58uX485//7HQDbaHBfA+GxgeIEg9HpGR4l+V16qYAxLUPNAjvxQYgdiU0bYRWvwkkWY2mFI80KKhhNTyAyVwCmSQHBGHbd6/XmVB1vQB372hAWmlEx0gxa/J0BAW5Zp2CtFbCYNgKgETzL9pqVcNqvYqkMeOwqeAxZvV1Sdc+TXLSNGzdtR3TMp91a79W2ozShoPQWBtAgAANGiZSD5WlBg/45RimnAYe8eMInifgwmIygy+0L7wdTySA2WCEQGxfChq++EcByX1NI3ZcvwqSpkEa7d+K0BmsKrITBAIBNmzYgHfeeQcXLlyAWCzGkCFD0KtXL1fYZyMUAC4eGi5AwguGQtB24yNFUbh9vQB3r9aCy+Og9+BQZMxkAxC7Gr1xL0iy5odXdKv/k2Q1DMZ9kIjbV9HRNI36Wg0eXS/Ew/s6iERc9IoLwKK0FJdMMbbu2wiDYTuedGpNNKVp4nJPQxkYjfrb+QjqnepSW3yNALkEPAEXqtpGKEPcF6jghvostFYVAID+4W/W/H+tpQHlmnMYKJ/QUl4WEoDGmnrHBCS1dQ4JSI5WlGJqwljk3bgGkqZ9Zg3L22Hs2N566y288sor6Nu3L/r2/fFx1WAw4P3338drr73mVAOZQaDKcLmVY9M26nC1JA/1jzSI6K3EovR5EEvY0Zk7aJrGK0fH8xc0zJbrEIkSwSFkAJpUjI/u1+Phtd2orzMiKFiEMYMnYu5U504xdoXFcgWAuZMSBBJH0yg4UIfpzNN6+T3JSdOQf2AbElNXuqU/E6VHjel+iyN7Gho0qo330Ec2HAJO09r5uD6Dcea2/QKSSf0THBOQJCTgSMkFXK2tgZWk3DPL100cJ2PH9uabb+JnP/sZJBJJq/N6vR5vvvmmhx0bDa31MQDg9vV8VJRVgy/kondCGLJms6Mzd0OSD9H1L4kGST7Eo+uXcatcDaOxScWYNC4JISGOqxjthbTe76IEDbHkESTSvqipUiE0QukOs3wGZZAMoAGtSguZUuby/hottR06tWZo0Gi01CFU2JQLLTA8ENozGrv7lIcEOi4gqW/EA7V7RCTsVGQndBQQtrS0FEFB7l8sbo/L57ZAVaNj08N4HNsfD8tvqBHTU4rp42e50B4m2GZ7ZLQEuscHEBqR5WJ7fI+gCBnU9Rq3ODZ74BAEaJqyuz7B4Tg2AiKAJnfbTYZRbsTmuZ3AwEAEBQWBIAj069cPQUFBLYdCocCsWbOwcOFCV9pqAwSsFY1Q1eiQm846NU/D5Ubjh19vJxDgcqMwJe0Z3L2txbmrh91hWpdweV0FqCXA4URDrTJDHDrNLTb5GrpGI6RuCmig4IeA6OJaI0BAwf9xS1JDjQqyEPvD4alrGyAOsr++tqERQoUcPeRuWoeknXT4ADaP2D7++GPQNI1nn30Wb775JhSKH/8YAoEAsbGxmDBhQictuB7T7SoYHsmxIns+O+3oBXA4AeDz+3ayzkaAz+/XtL7GBaakL8Phbd+Byz2CEf2mutvcVvD5CTCbjgGwon3baQgEo9Couow+Ckk777PoNCbIFO5xbEKOBCHCHqjtYJ2NAIFQUUzL+hoAnLpZhj7R4+zu8/j1KxgaM8L++pcvQxykxMCQUJy4fw9WinKxeIRA1w+atrTh/djs2JpDZfXu3RsTJ05sk4fNs3BgvV+NxrsCPJ+bw0YJ8SIkolnQUg0/KCOb5P7N/+dyQyER/Tj1yOfzkJjxDA5s+RZc3jEMjZvsIasBghBBJM6E8Sm5f7PtfMEE8PjxMBhKIZawMwPtQZE0uFz3xVPtLx8DQ4MWWmsDmv9OzbJ/GU+JfgFjWpXX1migGGb/8om+VgX5IPuDUhjrVZg7YSaEXB7S+g7AjhtXQfrKkMjLYbzG9mSkf6PRCLO5tXLME4lGBTUm1N+R4Se5C1mn5mUQhAgScS6K938OoUiNoN4KKAOVEAiGgM8fAOKpS5Av4CEp8xkc3PItuNzjGNRrkocsB3i8GEikq2Axl8Jqbd6gHQE+fwS4vB+VcOzsQFtoD+jWeYQAIwNn4rHpLqoMFTBRBgg5YkS2bNBu7WQtRjOEdu5BAwCLwQSR1P7RulmnhzigaSqzh1yB5UNH4FJ1Fa4/fACXBCdkN2h3jF6vx//8z/9g48aNqKura/O+JxKNPr7KwfMrstwqB2exnXN7NiI0LBwSaTRuX1SjrEGPSalxEHSQu04o4mNqxjIc3r4GkWk6l23AtgUORw6haAqEmNLmPbPZCh6fvebaQ6c1QmxDxgRnwyG4iBTFIVIU12k5i9kCLt/+0SRpJUFw7H+goSgKBEG0eigKEAgxsUcvjAwMwUW7W+6EbuTYGP8qf/vb3+LAgQP417/+BaFQiM8//xxvvvkmoqKi8O2337rCxi5ZnDmPTfDppdw4swkiMRfTxs3EuMFJyE1PQ8a82bh0dEun9SRSIaamLcWGHbugUhncZC0zVCoDFAp2GrI9Ght0kCntHw25GlVNI6QO5FHU1KsgDrR/dkrX0AihnM3j6CoYO7b8/Hz885//RHZ2Nng8HqZMmYI//vGPWL16NdauXWu3Ie+99x4IgsB///d/M67LF7BOzRupur4Djx8ZkDqjdaT38HA5rBYKqnptp/WlASJMTl2CddsKoNG4JsyQIzQ06KFQso6tPcoelnm1Yzt1qwx9eoy1u/6x65chdiCqyrHLlyEKUtpd3y6a09Y4evgAjB1bfX094uKahvlyuRz19fUAgMmTJ+PIkSN2GXH27Fl89tlnGDp0qF31WbwP7cNduFhSh9yMlHbXoJLGJ+Lupfwu25ErJJg4PxdrtxRAp+ssEoj7qai6AGFIkqfN8Eq0KiOCQ9pO33oLmho1lGH2Cz/0tY0Y1XOU3fWN9SpMiRtmd317aE5b4+jhCzB2bHFxcbh9+zYAYMCAAdi4cSOAppGcUqlkbIBWq8XSpUvxn//8B4GBgYzrs3gfeq0RRw8+wpKs1A6zjPfoocSjB3qb2lMGyTB1eiTWbM6D0WhxpqkO0agyQRHISv3bQ6syeu3GbAAw680QSe1PS2XWGSAKsP/zmTU6SDwgtOsuMHZsq1atQmlpKQDg97//PT755BOIRCK89NJL+O1vf8vYgF/+8pdITk7GzJkzuyxrMpmgVqtbHSzehcVixZG8tchJnQdpJ+IBgiCgDBR2OR3ZjDRyPiZMicC3G/NgNtufbsSZaDUWNmdfB1itFPgCb9oS9COklQTHUeEHCLvVsM2KUberadkN2h3z0ksvtfx75syZuHr1KoqLixEfH894KnH9+vUoLi7G2bNnbSr/7rvv4s0332TUB4v7oGkaxwvWYtTYUAQHd61k7NNXjsqyAiin2pbHTxGTjDHj8/Htxh1YsSgDfAdUbc6Aplmpf3t4QurPhMY6NaTB9o+2tA1qiALtr69TNUIQ4AGlrzPWyPx1je1pYmNjkZWVxdipVVZW4sUXX8TatWshEtm2yPzqq6+isbGx5aisrLTHZBYXUXJgHXr2kmH0wMSuCwMY2X8K7lfqGN0Ig3qnYvioEKzZnAeStD/On6OQJAUu1zd+5O7GaDBDKPZeQZfFbAHPAcHZ0atlEAc5IBwpu+J+4Ug3wy7Htn//fqSkpKBPnz7o06cPUlJSsG/fPkZtnD9/HtXV1Rg5ciR4PB54PB4OHz6Mv//97+DxeO3uhxMKhZDL5a0OFu/g1vnNAIBp47qeUm6Gw+EguocUtbe6FpE8SWh8GgYMUmLNljxQlGecW2OjAQFyVhHZHmqVHlK59yoiaYp2aA+avk6FkbGj7a5vbFBhcm/3CkcAgKCdc/gCjB3bP//5T8ydOxcBAQF48cUX8eKLL0Iul2P+/Pn45JNPbG5nxowZuHTpEi5cuNByjB49GkuXLsWFCxfcGoqHxTFqbubh/j0dMubMZ1w3adw0XL7UwLhe1MAMxMUHYN22fI9MfakaDFAGso6tPS7ev+jVUn+6aQ7Z7vomjR4SB/agmdQaSJXuS8DaArvG1jGrV6/GRx99hBdeeKHl3K9//WtMmjQJq1evxi9/+Uub2gkICMDgwYNbnZNKpQgODm5znsV7aajT4PyZGjy7JNOu9aaAgKYboE5jhDSA2c2w55AskNYt2JhfgIWp7W8rcBW3qoohDPZsoGZvRdtoQmxfb0k/1BaapsHxkPCDpumm/tnQfy6F8berUqkwd+7cNudnz56Nxkb7k+6x+B56nQmnijZiaXaqQ0KOgYOUuF26w666vUdkIyhYiK2FO906clM1mKEI9FyoL29G2+jdUn8OhwPKzmtF26CGSG7/ZzNotBDIPHTdsBu0OyYtLQ3btm1rc37Hjh1ISUlxyJhDhw7h448/dqgNFvdgtZI4lr8WU6ZFQiYTOtTW6IFTUXlXa7dj6jc2B2IJD3n7Ch2ygwkatRkBbLqadjEbrRCKHbsmXAmHywFtp/Do6PUyiIPtX9s/WtaUqsYjsFORrfn73//e8u+EhAT8+c9/xqFDh1ryr506dQrHjx/Hb37zG9dYyeJV0DSNkzvXYuiIYKdE3+dwOIjqIUFtRT5C+6TZ1cagSYtw4dA67DpUhPlJbWcUnA1F0WzQbR+FIAhQlH13aH1tIyaNmG5338b6BkwbOtHu+iy2YZNj++ijj1q9DgwMxJUrV3DlypWWc0qlEl9++SX++Mc/OtdCFq/j4pH1CI8UY9zgJKe1mThmGvL27EZoH/vbGJaYi3N7v8feE3swa+Jsp9n2NDRNs/vXOsBitoLn4f2FXcHlcUHZOWIzNmohUdo/YjM1aiCzI0KTU+hG0f1tcmzNIbRYWO6UboXJSCFtpnMdh0IhhtVKw6A3QSyxbxqLIAiMnrUEp4vW4tCZfUgaa/vWAyao1UbIArwzqoan8fao/gDA4/NAWphHr6FpGqBht/CDpmlQJAmOpxTf3cixsXMpLDZTfzsfFTfVyJ7PXNZvC/0TlLhjp4ikGYIgMG7uUjyo1OFYyQEnWdaahgYD5Gy6mnYpfXARMoX3rq8BAF/IA2lmnjdSr9ZCGGD/uqpJpwdfwoZgcwesY2OxicYGHc6cqMaSzFSXSZXHD0nE3QqNw+pGgiAwMWUZbpWrcerSQSdZ9yMVVechDvXeyPWeRNdoQrCXfzd8AR9WO+KNHrlWBnGw/fvPjpSVeTbiCKuKZGH5EaPBjBO71iM3MxlCoetCJXE4HIRHSVB/u8ApbU1JewZXy1Q4d/WwE6z7kUaVGXIlK/VvD63KCJnCu78be9fY9HWNGNFrpN39GutVmNTbc6m52MgjLCw/QJIUjuWvxcSpEVAoXD+NkjR2Gq6WMY9E0h5cLgdT0pfhwvlaXCi3L1dgezQ2miFXslL/9jDozBDLvHu6zV7hj7FBA1mg0u5+jQ1qBAQF2V2fxXZYx8bSITRN43TRWgwcHIihcZPd0qdSKYbJRMJocE5SUT6fh8SMZ3DmZA0uVhxzSptWCwU+33uD/Hoaf1SM0jQNmqIdEn5QFAkuz4PXDbuPrTUXL17E4MGDweFwcPHixU7Lslmw/YcrJzZCGSjExGHT3NrvgAQl7l7cgf7jcpzSnkDIR2LGMhza+h14vONI6Gn/3jtvT8niSaxWEhw/zXhg1OrBl9qv9jTpDeAJvVtU40/Y5NiGDx+OqqoqhIWFYfjw4SAIotUPvPk1QRDtRuVn8T0eXN4GdaMZi9JS3d73uCFJ+Py7reg31nn7xURiAaZmLMPh7WsQkaZDUJB960B6vQViL07J4kk0jXpIA/zz5n34WhkkDghH1LV1bKoaN2LzPrbQ0NCWf7P4N433CnD1sgorczM8Mq3E5XIQHinG44cNiIh23pqERCrE1LSl2Ji3FrkZyVAqma8FNTTooVCyUv/2aGzQe/0etidhstFeX9eIMf0n2N3XqStXMbnvCLvrOwMCjos/fGU8bpNj69WrV7v/ZvE/NGo9Thx9jJW56R4NGZU0dhp2HixARPRyp7YrDRBhUspirN++DkuzU1qyC9jKrarzULDpatrl8sMyhIR7t9S/GS6PA9JKgmfjWqmhXo2A4EC7+zM2NCIgONju+k6hG2XQtmtOpby8HAcPHkR1dXWbRI+vvfaaUwxjcT9mkwXH89chN30+RCLPRtZQBkpgNJAwGS0QOtkWuUKC8XMXYu2WjVi+MA0Sie2OqlFlQmS/eU61x1/QNhrRu7/3RvV/Eq6AB6vZYrNjo0nKIeEHZSXB47PRatwF47/Uf/7zH/z85z9HSEgIIiIiWg3lCYJgHZuPQlFNsv5xk8KgDPQOKXv/BCXuXtyOfmOdIyJ5ksDgAEyZFonvNuVhxaJ0mx15fZ0JA9h0Ne1CEAQsZounzbAJLp8Li8kMkbTr6WijzgCeyP5RutloAscbVLRsSK2Oeeedd/DnP/8ZVVVVuHDhAkpKSlqO4uJiV9jI4mJomsbZPd8jvr8cw/t6T/LMCUOTUHFT7TIloixqPiZMicB3m/JgtiEShdVKwmqhnD6C9BcSR01AeZn7Ugc5ApN4kY019ZCE2C8c0dTWey5VzZN0I7k/Y8fW0NCAnBznP0GzeI7rpzdBIuFhysgZnjalFVwuB6FhYlRXqVzWhyImGaPHheK7TXmwWDpX9J69cgQ9YwNcZouvExahRMNj+/PquROugGfz6PLkzWsY1mO43X2dvHIFE3oPsbs+C3MYO7acnBzs2bPHFbaweIBH17ajttqI5Omuz2FmD0njknDzvOMhtjojqHcqho4IwprNeSA7CbVUUa5GdIJjyXT9GYIgEBUXiCvFWz1tSpfwBDxYzbYFATA1aiENtH/EZqhXISDIw8IRdK+QWownfuPj4/GnP/0Jp06dwpAhQ8B/akH017/+tdOMY3Etmgc7celCPVYt9oys3xaCgqQw6K0wmywQCF03BRjWNx0DrNuxdkseli1IaxPomSQp6PVWyAK8O1yUp5k3eRq++n47YnprIA/y3tHt4JDeuFJfhkj07LKs1WCGQGz/3520WCAQecH+vm60xsbYsf373/+GTCbD4cOHcfhw6+CyBEGwjs1H0GmMOHaoCssXpoHH8+7EkP0GKnDn4nb0G+PaKfCogRmwWrdi3fZ8LMlMa+Xsz187gugYVjTSFRwOBwvT5mL9tvWYmfMsuJ7KPdYFfAEP1i6mnp/E3gc/q9ns2TBa3RTGU5G3b9/u8KioqHCFjSxOxmK24mj+WixMm8dI6u4pJgxNQkW560QkT9JzSBaioqXYmF/Qqr9b5WrEDGKnIW0hQC5B3JAwnD+8wdOmdIi9qWuYoqlrgMiBaUynwopHWPwViqJwrGANRo8PtTuslLvh8bgICRWhpqrRLf3FjcxGULAQWwt3NmU9piioG9lUNUyYMXIKzEYr7t7a6WlT2oUv5IO0wbGRVhKEA4EKTly+gvGx3iEcYdfYnuLll1/G22+/DalUipdffrnTsh9++KFTDGNxDcX71yG2dwBG9U/0tCmMSBo3DXuO5iMs+Rm39NdvbA7Kjm1A/v5CDOs7HtE9WKfGlJzkufjq++0IjzJBJPaCNaYn4At4No3YmITdag9DvQry4Z4XjnQ3bHJsJSUlsFgsLf/uCG8VILA0cfPcZnB5HCSNnelpUxgTHCyFTmtxuYjkSQZPXoSSg+uwKW83ZixY6pY+/Qm+gIehk3vi5O7vkZS+0qvuD3wBH6QNa2xcHheU1f7A7laTCUIHhCdOhQ2p1ZqDBw+2+28W36HmZh4eVOrwTE66p02xm34Dlbh3aQfiRy9wW5/Dk3IRFrYdQSHeq/DzZsbHj0V15T5cKd6KQaOyPW1OCzwBz6apSEecMWmxgsPxIvFMN1JFsmts3YD6Wg2Kz9ZicWaqVz01M2XisCTcKle7tU+CIBA9KNOtffobqUkz8Oh2Axrr3LNGagscDsdmMRJt591cU98AUaDcrrosjsFYh2o0GvGPf/yjwyDIbFgt70KvM+H07o1YtiAVfL4XPT3aAY/HRWCQEDVVKoRGKD1tDouNEASBRWnz8f2WDZiZ8xy43rK9xMUPeScuX/GqHGzOEH/4lXjkSZ577jns2bMHCxYswNixY316BODvWK0kjuatRXbyXMhk3rV4by/Txidh3/F8hM53j4iExTlIA0SIHx6Bc4fWY9zM7rFeaWhQIXmwF0X06UZTkYwdW0FBAXbt2oVJkya5wh4WJ0HTNE4UrMHwUcEIDfWNVCK2EBIig0ZtgcVsBV/Abnz1JaYNn4x1d3fiTnkBYvv61p5Ae9SRFr0BQol3ZMrobjBeY4uOjkZAALuQ7u2UHl6PyGgpxg5K8rQpTqffAAUqy3Z42gwWO1gwfw6unXsIo97oaVNshsPjgrQy28xNkSQIgvCuGS1n7GGzY8T2ySefIDY2FiKRCOPGjcOZM2c6LPv111+3fG/Nh0jEPCs7Y8f2wQcf4He/+x3u3r3LuDMW93DnwhZYzBRmTpzlaVNcwsTh03DzhvcIEVhsh8/nYdjUXjhR9L3HswAQBNFGI9AeXD4PpIVZnjlNvQoipZcJRzwQeWTDhg14+eWX8frrr6O4uBjDhg3DnDlzUF1d3WEduVyOR48etRz2+BrGjm306NEwGo2Ii4tDQEAAgoKCWh0snqWuIh+3KzTImjff06a4DD6fC4VSgLpq9yokWZzDuLgxCIkOwOVzWzxqB5fPhdWG1DVcPt+mck9y/PJliIIC7TXNb/jwww/x/PPPY9WqVUhISMCnn34KiUSCL7/8ssM6BEEgIiKi5QgPD2fcL+NFisWLF+PBgwdYvXo1wsPDvWuo3c1R1Wtx9mQ1Vi3JaBOd3t9IGpeEQ6fzEDx3madNYbGD5CnT8fX67ejRuxFKB5J4OkJT6pquI+9zfijHBGNDI+aO9678hs4Uj6jVrR8qhUIhhMLW36PZbMb58+fx6quvtpzjcDiYOXMmTp482WEXWq0WvXr1AkVRGDlyJFavXo1BgwYxMpOxYztx4gROnjyJYcOGMa3K4kKMBjNOFm7AkqwUCLqBqCIsLACNKjMsFiv4fP//vP4GQRBYlDoPazd7bguArclGuXzmjs2s1UHsZVoEZ8r9Y2JiWp1//fXX8cYbb7Q6V1tbC5Ik24y4wsPDce3atXbb79+/P7788ksMHToUjY2N+Otf/4qJEyfi8uXL6NGjh812Mr4jDBgwAAaDgWk1FhdCkhSO5q3BpMQIyOXMF1p9lfh+Cjy4vAOxw70nogWL7UhkIvQdEYkzB77HhNnu377BE9g4FSngwWqxLSkp0BRo3OuEI06msrIScvmPa4hPj9bsZcKECZgwYULL64kTJ2LgwIH47LPP8Pbbb9vcDuP5qvfeew+/+c1vcOjQIdTV1UGtVrc6WNwLTdM4uWsNBg0NwpDekz1tjluZNCIJN66xIhJfJmlY07ahimv5bu+bZ+NIbER4T1xvvGlzu7qGRgjl9o/WbM3s7Unkcnmroz3HFhISAi6Xi8ePH7c6//jxY0RERNjUD5/Px4gRI3Dzpu3fP2CHY5s7dy5OnjyJGTNmICwsDIGBgQgMDIRSqURgILtY6m4uH9uA4BARJgyd5mlT3I5AwINcIUBdDftA5ctkz5uL8pJHMOjcOxPEtXHtjCfgg2KQu+3Y5csORRw5fLbjQPMO4WZVpEAgwKhRo7B///6WcxRFYf/+/a1GZZ1BkiQuXbqEyMhI2zuGHVORbBBk76GybBu0WisWpvrWZldnkjQuEYfPsCISX4bH4yIreTbydn+P6ZnPum0Kb0hIb5RWlSEasZ2W4wv4IBmssRnrVZg1Jsluu4yNKrvrehsvv/wyVqxYgdGjR2Ps2LH4+OOPodPpsGrVKgDA8uXLER0djXfffRcA8NZbb2H8+PGIj4+HSqXC+++/j7t37+InP/kJo34ZO7bERN/K4+WvqO4W4MZVFVYsyvDrufyuCA+XQ9XAikh8neBQOcJ6KHDpzGYMHZfjlj75QtuyaPOEAkYbtM0aHaQK+5WeJq3W7rqd4YlYkYsWLUJNTQ1ee+01VFVVYfjw4SgqKmoRlNy7d6+VgruhoQHPP/88qqqqEBgYiFGjRuHEiRNISEhg1C97J/BB1I16nDr2GCty08F1ILuvvxDfT44HV/IQOyzL06awOMD8ydPwzfodePRgNyKj57i8P1tzsjGZimzedG7vwyZN0wDlwo3rHtgT/8ILL+CFF15o971Dhw61ev3RRx/ho48+crhP9q7oY5iMFhwvWIdFGckQidyTcNPbmTxyGm5cVXnaDBYHIQgCC9PmofTIXVgtzEJY2QNfwLOpHx6fB9JGe/SNaggC7M+2btRqwZd4SWJSH4Z1bD4ERVE4lr8GEyaHQ6lkL/5mBAIeZAF81NdqPG0Ki4NIpEL0HxWF0/vXubwvvpAP0mzbiM3WNTZtgwpChf2htI6VXoZY7qIN6x4IqeUpWMfmI9A0jTO7v0e/gUoMi5/iaXO8jqRxibhVnOdpM1icQOKQieByCdy66tq/J19g2xobk6SkxZWVGBna226bDKoGTOjDbD3JVhwNgOyMNTp3wTo2H+HaqU2QyXiYPGK6p03xSiIjFairNcJq7foJnMX7yZo7BzcvVEGvdd0WAA6XA4rsOggyEyiLFVye/UsEpkY1ZA4IT1iasEk8MmLECJsXQ9kM2s7n4dXtqKs1YklmmqdN8Wr69FXgwZUd6DWUFZH4OjweF9kpc7C9aC1mZD/nEuUvkzYJ2FaWslrBc0CdS1MUOFwXafq6UaJRm0ZsGRkZSE9PR3p6OubMmYNbt25BKBQiKSkJSUlJEIlEuHXrFubMcb2Sqbuhvr8Tly/WIzc9tVvL+m1hyihWROJPBIUEIDI2EKUnN3naFJuhSRIcrn1xL406HXh25B6zle40FWnTo8Hrr7/e8u+f/OQn+PWvf90mbtfrr7+OyspK51rXzdFqDDh+uAorFrGyflsQCnmQyvhQ1WuhDPKfrOHdmbkTk/Dthh14WFmEqJi5njanS2gagJ0PoMdKyyBmozc5BcZ3y02bNmH58uVtzi9btgxbtng2v5I/YTFbcSzveyxKmw+xmJX120riWFZE4k80bwG4eOyeTZH4XWcIbEpKCpq2e2bFqFJhcjyz9CyMYFWRHSMWi3H8+PE2548fP25XCm+WtlAUhWMFazBmQhgCgySeNseniIyUo6bawIpI/AixRIiBY6Jxep9rtgDYonjkCpgnG2WKsbER8kAXJmvuRo6N8Srlf//3f+PnP/85iouLMXbsWADA6dOn8eWXX+JPf/qT0w3sjpzftw694wIwsv9UT5vicxAEgbi+cjy6loeYwZmeNofFSUwZNAGb7xWh/PIO9B2U7rR2uTwOSIsVPEHnsyJcPg+k2Qx0kZSU4BCgbRnZtQNlJcHl8QCTya76LD/C2LH9/ve/R1xcHP72t79hzZo1AICBAwfiq6++wsKFC51uYHej/Oxm8AUcJI6Z6WlTfJYpI6dh7ZZ8xAz2tCUsziRz9mx8uWYbomJ0kMrtj+7xJNwfoo905dg4NkYp4fD5jOJKNmMyGMAVChjXY4InYkV6Crt0pQsXLmSdmAt4fGMHHj3QYdkC5z2RdkdEIj5EYi4aG3RQBDrnBsjiebhcDnJS52DLrnWYkf1sq+C59tKSk03aeSQfLp8Hq6XrqUgOn2dXPjVNXR3ECiXjeoxg5f6do1Kp8Pnnn+P//b//h/r6egBN+9cePHjgVOO6E7pHu3DhfB0WZ7KyfmfQFIlkh6fNYHEyyiAZesQHofSEc7YAcPm2ZdG21WGNiO6B4ro7jO04fekqJvd1oXCkm8HYsV28eBH9+vXDX/7yF7z//vtQqVQAgK1bt+LVV191tn3dAr3WiCMHHmFpdip4PPv2wLC0JipKgerHBpBOjizB4nlmj0tEY50eD+4VOdwWV8CDxdS1w+LyebDaUI4nEDDK3daMQaVCQGAw43qM6EbiEcaO7eWXX8bKlStRXl7eSgU5f/58HDlyhFFb//rXvzB06NCW9OITJkxAYWEhU5N8GovFiqP532NBylxIpa6dY+9OEASB3n3keHSVHbX5GwRBYGHqPFw6fg8Wk2NKRZ7AtinGkRE9cUN904b2+KDsWGOjrFbwBe5ZY+sOG7QZO7azZ8/iv/7rv9qcj46ORlVVFaO2evTogffeew/nz5/HuXPnMH36dKSnp+Py5ctMzfJJaJrGiYK1GDkmBCEh7IZiZzNl1DRcZyOR+CUisQAJ46Jxau/3DrUzOKQ3HmnKuizXNBKzIcWNgA/KBkf5JBaTCdwuxCsszGDs2IRCIdRqdZvzN27cQGhoKKO2UlNTMX/+fPTt2xf9+vXDn//8Z8hkMpw6dYqpWT7JhYPrEB0jxeiBiZ42xS8Ri/kQCrlQq3SeNoXFBUweOAEimQA3Lm23uw2+gAeLDQ6Lb2PqGh7f9hQ3zWjq6yFytXAEYKciOyMtLQ1vvfUWLD88lRAEgXv37uF3v/sdsrOz7TaEJEmsX78eOp0OEyZMaLeMyWSCWq1udfgqt0u2gCRpzJgwy9Om+DUJQwJxq4SNROKvZMychTtXaqBttO/hhVEWbRvKcQUCxlORpy5ewSQXpap5EnYqshM++OADaLVahIWFwWAwIDExEfHx8QgICMCf//xnxgZcunQJMpkMQqEQP/vZz7Bt2zYkJLT/R3733XehUChajpiYGMb9eQO1FXm4e0eLrHnJnjbF7xnedwoeP9SzIhI/pWkLwFyc3L3OtpBXT9GUbNS2KUbShinGJgfIzLEZVCrIg0MY1WHpHMb72BQKBfbu3Ytjx47h4sWL0Gq1GDlyJGbOtG9Dcf/+/XHhwgU0NjZi8+bNWLFiBQ4fPtyuc3v11Vfx8ssvt7xWq9U+59wa6jQ4d6oGqxZnsLJ+N0AQBGL7BKDq2g5ED2IjkfgjikApYvoFo+TYRoyamsuoLl/AsynZaJNjc25S0mZIsxkCYecRTZxCN9rHZnfin8mTJ2Py5MkOGyAQCBAfHw8AGDVqFM6ePYu//e1v+Oyzz9qUFQqFELrjAnARBr0Jp4o2Yml2CgQCF+VcYmnDlFHTsGHHTkSz24T8llljp2LNlnzcv1OIHrHzbK7XtHZmwxQjjwvKBfFHrRYLOO7a4sM6to75+9//3u55giAgEokQHx+PqVOngmtnTiKKomDyw1hpViuJo3lrMTkpAgEBbLBodyKRCMDjEVA36iFXsEGl/RGCILAwZR6+Wb8DYRFmCES2Sed5NobKctXsituEI90Mxo7to48+Qk1NDfR6PQJ/yB3U0NAAiUQCmUyG6upqxMXF4eDBg11OE7766quYN28eevbsCY1Gg++//x6HDh3C7t277fs0XgpN0zi1ay2GDA/C4FjHR7kszEkYGoiKkh0YnrTY06awuAihiI9B43vg1L7vMTVlpU11OBzOD0nUPMOpi1cw0Q3CEQAgfjgcbcMXYCweWb16NcaMGYPy8nLU1dWhrq4ON27cwLhx4/C3v/0N9+7dQ0REBF566aUu26qursby5cvRv39/zJgxA2fPnsXu3bsxa5Z/KQXLjm5AaLgY44dM87Qp3ZaR/aai6oHeLoEBi+8wacB4SOVCXC/d5vS2CRfc1g0qFRTBLo440kw3kvszHrH98Y9/xJYtW9CnT5+Wc/Hx8fjrX/+K7OxsVFRU4H//939tkv5/8cUXTLv3Oe5d2gq93ork6d6f/defIQgCPXsHoOp6HqIGZnjaHBYXkj5jFr5aux3RvbSQKd0f+IAgCFAUZVOQZqvRCKGYnR53NoxHbI8ePYK1nX0aVqu1JfJIVFQUNBqN49b5OA138nHzuhoLkpNZBaQXMHX0NFy7ovK0GSwuhsPhIG3WdFw+7/xwarYoHjl8nk1bA2iaduvcHruPrROmTZuG//qv/0JJSUnLuZKSEvz85z/H9OnTATTtTevdu7fzrPRB1CodTh+vxpKsVKek12BxHKlUAC6HgFZj8LQpLC5GKhPBbLRxP5mND50cG5WRHD7fpviTZqMRPKEbhWTdaCqS8R33iy++QFBQEEaNGtUivx89ejSCgoJaphZlMhk++OADpxvrK5iMFhzfuR65mckQCllZvzeRMDQQFWw6G7+HL+TBaoOMH/hx6rArmpKN2pgJwIawWgaNBgIpOw3pChjfdSMiIrB3715cu3YNN27cANC0ybp///4tZaZN674iCZKkcDRvDSZOCYdC0XnyQhb3M6r/VPz71BYMtnENhMU34fG4sFptEwrxBE2OSCDqfI9ss8MSduGLmkZsXTtAo04HvrvX13xkxOUodg8nBgwYgAEDBjjTFp+Hpmmc2b0WAwcpMbTPFE+bw9IOBEEgJlaG6vJ8RPRP97Q5LC6CyZo2V8C1zbEJbBuJcWwcsREE8ygljuCMNTJfWWNj7NieDGn1JE9u0E5PT0dQUJDDxvkaV09uglwhwMTh0z1tCksnJI6Zjk0FOxHRv+uyLL6Lrb6Ny+fBYovD4tno2Hi2TVnak+KGxTYYO7aSkhIUFxeDJMmW6ccbN26Ay+ViwIAB+Oc//4nf/OY3OHbsWIfBjP2RB5e3QdVgQm56qqdNYekCqVQAgiCg0xghZaPAdHt4P4zYuoJr4xrbyJgYnL97B5FxcZ33y+eDtLrRsXWjkFqMFxnS09Mxc+ZMPHz4EOfPn8f58+dx//59zJo1C4sXL8aDBw8wdepUmzZo+wuNlTtxpawBC1NTWFm/j5AwWImKku2eNoPFC+DZOHU4IrwnrqvKbWhPYFOEf57AtnLOgpX7d8L777+Pt99+G3K5vOWcQqHAG2+8gf/93/+FRCLBa6+9hvPnzzvVUG9Fo9bjxJEqLM1OA5fLihF8hdEDE3G/UufWNQ4W90JwCJCkLTnUbHNstkb4t3WKkcvjMc7dxmIbjO/EjY2NqK6ubnO+pqamJfGnUqmE2dz1kN3XMZssOJ6/DovS5kMsZlO7+xIEQSCmpxQ1N9kkpP6KQMCDxdS1gxkS0huPNGVdluML+KCcmOKGx+eDssHxOg12H1vHpKen49lnn8W2bdtw//593L9/H9u2bcNzzz2HjIwMAMCZM2fQr18/Z9vaCe7/timKwrH8tRg7MQyBQexeFFugaQo0bQJNe0e8xsSx03GlTGVTWRpW0LQZPvPL7ubQoMATEjCbun7A5gv5sNqSRVsoAGnDCIsn4Ns0EuN0MGKjXJQUtztNRTIWj3z22Wd46aWXkJub2xJai8fjYcWKFfjoo48ANG0F+Pzzz51raSc0aL4DVzgaYsFwAO7JbXRu7zrE9ZVjRL+pbunPl6EpNWA+D1ivAiAB8EDzBgCC0SA4AR6zSyZrknfrtUZIZO2LSCzWOzCYzsBKVgIAOBwFRIIRELnxWmOxHTOlQbWhFCpzOXSEHpcef49YwRCEiYeBz2k/biRfwLc92agNI0AeXwDKFvUkh9PqIe9erQrFdx6g8nFNl3VZOoexY5PJZPjPf/6Djz76CBUVFQCAuLg4yGQ/XjTDhw93moG2QNJqaI2HYbbeg0KSDjsGooy4cWYThCIOEkfPcGk//gBNNQD6zQBM+HG0YwWslwHrTdCSHBAcpcfsGzhIiYoLOzB48qI27xnNpdAb9+HJ64mi1NAbD8NivYcAN1xrLLZjIlW4qc4HRZtBgwZfwIHFZEGd6TpU5tuIl6dCyFW0qccX8GyaOuQL+LaF1OJxbZ9i/EFsdvl+FQ5fu+Pa0JGsKrJrZDIZgoKCEBQU1MqpeRKz9TYM5ksu7aPq+g48fmRA6gzbs/R2a4z70NqpNUM3nTfud79NTzAmIRH372rbiEiaHFizbU9ODTXdHSzW2zC6+FpjYUal7kiLUwMAnoCA1UIBoEHSZtzXHW23Hl9oYxZtPg+kTRuvmbknjcGEI9fuAHCx32DX2DqGoii89dZbUCgU6NWrF3r16gWlUom3337bK3JdGcwlXReyE+3DXSgtrkNuBivrtwWarAWoKnT8a6AB6iFoqt6dZrWCIAhEx0hReyu/1XmT5RK6Cr1ucuG1xsIMI1kPvbW6xakBgFJsgdiq++EVDZ31MUykqk1dW6cim5KS2mgQAwdw5UFbMR6LYzCeivzDH/6AL774Au+99x4mTZoEADh27BjeeOMNGI1G/PnPf3a6kUwgqXo0XVXOdTw0TePYoUdYtiANPB67tmITVJ3t5Tiei1QzYsAEnL96AqHxP56zkjVoPVJ7Gtpl1xoLc4zWtg9HNSouJIrWv1Uj2QAhV9nqnFatA8+GYOVGrR4cG377VhsV4aTVCtpKok6rc8tAiA2p1QnffPMNPv/8c6SlpbWcGzp0KKKjo/GLX/zC446NABeuuNFUl+chKloKqVTg9Lb9FsLWy8uzGRBuPjoPZWDrOIEEwUPTddTZL9k11xoLc4gfrjXSSkOntqKqlouae0b0mx/Rulw7gp+dBw5h7ISULvsoOHAIoYO6TsdVeOAwAvvGdllu7+HjUPSMAY/D6fJKcwrdaI2N8R2lvr6+3eDHAwYMQH2956aUmiAg4MV3XcwOLpbUYUkWGy6LEdweaLr5d7Z+wQO40W4yqH0a6oyIGZTc6pyA1wdmy/VOanEg4Pfp5H0WV0HTNAw6E1QNOpRWXoSm3gCt2gCVUQMuF5AoeJAqCfSc0qPVkgEBHmT8yFZtaRo0oCkaAUFtRSVPYtIbYVLrMK7PhE7LWS0W6B7XImXy3E7LUSQJ1f1KLMlcgls1DbhZ7el7p3/B2LENGzYM//d//4e///3vrc7/3//9H4YNG+Y0w+xFIhzt9DYfP2qAXCGARMKO1phAEELQ/OGApZMoNPwRIAjPfq8N9WYMDpK2Oifg9wPHdAIUpUbbKcmmm6VIMMY9BnZTLGYr1I16lN5vcl7qBgPMhqa1MJGED1mgCPIgMXr0ngWZQopqUzFqjBc7bC9UPBgconUghYKDhzB2YtejtfwDBxE2pOsHmcIDRxDUt3eXa/B7jhyHskcMOFwu4sKCIBcLoTGa4MpAOARNg3CwA0fruwvGju1///d/kZycjH379mHChKanl5MnT6KyshK7du1yuoG2QoAHuWQ+eNxwp7d940w+UmbMcnq73QLBeIA2ANYraD1tRwO8QYBgrKcsa7KCpmGxUODzn/4pcCGXLIBavwUU1YAfdVY0AC5kkmSXXGvdCYqioNUYoWnUo+xhGbSNJugajbD8oFDk8TiQyIWQB4kR3Xs6Bo6SQyTuOLVMhGQUSNqIetMNPH2tBQn7I1w8slX5xrpGUFYK8mBlp3bqNTqYGrUYPz2z03Jmowm6qmqkTFrWaTnSaoXq3j0syVwCAOByOEgfORD5xVehMphszkrAGHYqsmMSExNx48YNfPLJJ7h27RoAICsrC7/4xS8QFRXldANtQSaaguCA4SAI50dqN+hNMJtJKAPZ6CL2QBAcQDQDNDkcsF4DaB1ASAHeABDcYE+bB1WDAQpl+yNGDkcBpWwlzNYKWKwVoGkSPG44hPwEl1xr/ojRYIZapcelR5eg+8Fx6bVmgAYIDiCWCSFTCCFViBCfMA1SuRQCkX0jeAIc9JBOQYhoMBpM5bBQevA5EgQK+0LEDWxVlqZp7CjahymzcrpsN69oL6ZNTe6y3M7CvQgdPKDL0Vrhnv0I6RMPDvfH9b4AsQi5E4bjbm0DblY+RGeT4CxdY9eqfVRUVBuRyP379/HTn/4U//73v51iGBNEgmEuu9HcKd2BAYMCuy7I0ikENxjgTvK0GW0ouXEcPWKknZTgQMCLd9nara9jtZLQqg1Qq5pGXbpGE3RqE8gfwkIJRDxI5UJIFUJE9ZwGmUIKsUzs0u0yIm4gIiWdzwTsu3Aa0pAASAI6+9sD+y6VgMPjIiC4c9Wutl4Fq8mEGQM6n5426nTQNzQgfeqcNu9xOAR6hwUhQiqEKyKYsqpIO6irq8MXX3zhEcfmKmiaxt0KDZ5fnuVpU1hcxINKHUbPyvW0GV4LTdPQa03QqPW49OBS03Sh2gjTD2tdHC4BaUDTiCsoeCJi4qSQyqXgtZna9R5IkkRl6T3MyVzeaTmapvGo5AbmJ7eNSvN0uV2Fe5A6o2tx2a6du5GSOMcz+2DZqUgWAKi7nY/IHpKmjZksfgdN0zAYSEikHa/bdAcsZivUKj3UjTqUPbwMvdoEvcYMiqJBEIBQzIdMIYJUIURs31mQKmUQ/v/2zjs8quvM/98ZTW+qSEgUIcAIMBgBomMQVfTmQrDXxn5Y72Zd4pif42AnMXY2Ds56Ezu7j2MndhwnXjsUS4giIQkEooNpwhQhuoUQIAHS9HLL+f0x0oBAzEh3yp1yPs8zz6O5c+4571zNzHvf97xFpYjYIgWbd+1Eev8MyBTeO3KU7NuL+O6pUKi9e4O2HTwEZbwBar33uqeVh6sgkcXBkChezmasQBWbF05/34T5+d7DdimRS1OTDQmJ0R/p2hqkccdd6IDF6PRUtJfJpNC2KK609InQ9ddCY4jOGzqHzYGmK7cw4/HnvY5jXQxunbuC+Y95t+p4jsPNM+fwxIKnvI4jhOBG9Wk8PlM87w91RVJgszrBcgQGAw0SiFaO1exDt+7e91giAUKIO0jDE13ogNXohN16J0hDo3fvcyWljEN6Dy10Bi3kytjrIVhUtg29RvT2aW1u3LYdaYP7tAnwaI+SHbuQ0DsTMrn3a1m+cy/0qWlQqtWdljlgUFfk/Sxa5P1Oo7m52V9ZwopLVUUYOIgGjUQz9XVWjJgeGftrLMvBbLS1WF1ud+G9QRq6eCW0BhW6ZU6GLkEHtVYVse7CYNDU2Aye4zGgV57XcTaTBfZmM6blzfc6zmV3wFJ/HYsXeQ/vZxkGTT9c9oT3U4JPhxVbfLz3zPz4+Hg8+6x3sz1SIITgymULZkyYLrYolCDRur+m1oTH/lprkIbJaMWJqydhNbndhS6HO0gjLk4KrUEJjUGJ5JRx6NnXbXXF0bqlHYIQgo1l2zBx+pM+x27YUo7JEzpQYmtLOVIHD/B581BStg0pDz3k0/oLNtQV2Q5/+9vfgilHWNF4fiO69dBG5R4DxY0Y+2suJ9MSpGHDqfpTsJqcsJnd1SYkEkClUUAbr4QuXoVeD02HLkEHRQQHaYQTW4/shz41Hmof4f1bjx+FTK2ELinB6zjzrdvgWRaT+3mvdGQ3m+E0mrAwLwzaXFFXZGxz+mQzFs2kQSPRzLGafT7y1wLD3uoDOHO4HpAAMnmcJxk5rdtE6AbqoNGr6Q1UkOFYDnUn65C/aKnXcTzP43rVWcyau8TrOHd4/1bMm+bdVQkAJSXlmJMnUnh/DEMV2z3YLA4AgF5Pg0aimVDsr+0+tR/nv7+OvAVLIfcRWk4JHkXbtqH74B4+c+tK9u5BfGZXKFTe3dNbD3wHdVIC1D4aLO84dAxxCjn0CR3fqyeEoHhjcYfHd5ZIcSX6C71VvIeLx4owcFCC2GJQgkio9tdqa25izPSnqFITkeabRtiabRgy0Pt+OeN0oeliPSbmeh/HsSxu1ZzH7HH3Vw65G0IIGqpPY147FUa8nbOhYAPUhoQOn9MpCAnMIwKgiu0ueJ5HXa0VuQMmii0KJYiEan/NYWOg1lLLXywIISgqKcejkx/zOXbD1gqkPdLXp1u4pGInEvtmIU7m3forq9wNQ3oGFKqO/f95nkfRuvXQJiYjf2T4lZ6LNKhiu4uGc5vQPVNH/eFRztEzwd9fIy13tvSzJB7Fu3cipVcXnwEjlmYTXBYbxmSP9zrOabPB2tCI/JxHvY5jXS4Ya69g9ui8DsnJ8zyKvi2CLiUVs0Z7n9sfWqMi/X1EAnSP7S6qTzXhiTm+q3hTIpv6OitG5gd3f81mcUKloS7IUEEIgcvhgsVoxeEr1bAZ7TDWN/msMAK4q/d3LLx/K9IeGeg7vL90G1Ky+3UoKMhtqRXCkJqOmcG21GhUZOxhMdshlUig1UZ/iaVYhhAChyP4+2sOh4sqtgDDsRwsJiuszVYcrauB3WSHw2wH35KkLlPKoTaooTaokZ01DobcBN8NP48dhkKrhjbBe56usfEWwBNM6jvM6zir0QSX1YJFg33fIPMch/Xr1iOhazfMGOG9Mzelc1DF1sKFo0UY+AitNBLt3L4dmv01luEQJ6Oe/s5ACIHd6oDFaMGR2jOwm+ywm+xgnQwAQCKVQmVQQW3QILPLMGj66KAx6AQnqfM8jxvfn8fseb7D+7eUbsWCfO+NRgFgy5YyzJ3YsVShTUXFIVVqEt798HeOSIAqNrg/4NfqbJg7JQySKClB5VjNPnTv6T1MOxAwDAeZglYFuRfGycBitMBitOJo3Vk4THY4LQ73nqREAoVGAbVBDZVejYH9JkITr4NCpQzKXmXxrt1IzMqAXOndei/fdwDaLslQab3v1W0/eARylRpaH1WaAGDnvqMghA+tpUZdkbHF9ZqN6Jmlpxv9MUB9nRWjZni/Qw8ErIuNSYuN4zjYzXZYjFYcuXIGdrMDDpMNXEsngTh5HFQGDdR6Ffp0GwXtQB1UutB3EnA5nGj+4Rrm+ajezzEsbp+7iCcXPu11HM/zaDxzBk/O892R2+Vw4NrZU/jRfN/lvSjCoIoNwJlTzVg8nwaNRDut+2sqdfBdkeeaz0Imjz6LjRACp90Jq9GKQ1fc7kKHyQ6XzQnAHQWq1KugNqjRM2UoNJnuLtVyZXjtXW8o34auOQ/5VKjF23YgqV8f3+H9O3Yhvnt3yBXerT/G5ULR2gJ0fzjH59hAQ2tFxhAmow1yuRQaTXh98SiB59YtKxKTQvNjwjIc4uNHh2StQMMyLKwmK6xGG47U1cBussFhcoDneEgkgFylgKolSKN/1jhoDDooteqI8XiYbxvB2pwY/ZD3KESH1Qb7zduY+6j3PTPG6YSp7iqWLPJdvX/T+o3o2u9hTBo4uFMyB4RAJFhHSIJ2zCu2C0c3YOBgGjQSCxw7uw/dQlAfEgA4lodMEZ5fL0II7BZ7S2h8i9VltIN1uYM0pHFSqPRuxZXZZRi0ffVQ66Onk8Cmsm2YMmmez3HFJeWYOXGG7/D+LVvRZUB/n9bfrgNViJMpMGVwTmfEpQggPL95IYLjeNyot2H+NBo0EgvU19kwOgT7awDAujjIfLivgsndOV2t0YVOqxOEJ5BIAKVW1RJhqMag7DxPkEa0U3b0EJTxWmgMeq/jtlcdh0QqhSE52es4q9EIxmHH9Ie9V/nneR7Xz53GYzMXdFbkgCGWK/Ljjz/GBx98gOvXr2PIkCH43//9X4wcOdLneatXr8aSJUswf/58FBUVdWrNmFZs189sQFZfQ8S4UCjCIYTAGaL9NQBgmeBabBzHwWaytQRp1MBhdisvnm0J0lDIPNGFfXuMhiZeD5U2tjsJ8ByHhhMXMGeB90AQQggavj+NhbMe9znnlpIyzJvk+8a4rGwH4rt2g0qt6bC8AUeEqMg1a9Zg+fLl+PTTTzFq1Ch89NFHyM/PR01NDVJTUx943uXLl/H666/j0UeFVWKJacV25nQzliycK7YYlBBw65YVScmhs0hYhvNZTd4XjIuB6ZYJh2qrW5KRHe0GaWR2GQZNljtIQ0YLLj+QzTt3IalPd8jk3q9R2Z590HVNhVKt9jqu4sAhKLQ6aPQGr+MsxmZYbjdiyfzFnZY50vnDH/6AF154Ac8/764A8+mnn6K4uBhffPEFVqxY0e45HMfh6aefxrvvvovdu3ejubm50+vGrGIzNVuhVMVBraY/BLFAKPfXAIDzw2IrKCuHucGEOHkcNIlaaBM06N97PDTxeig1KuphEIDT7oDxyg3Mf9x7TzaWYdB04TIWL/oXr+N4jkNjTQ0Wz/OurAghKNlYgkX580T/vwXSFWkymdocVyqVUN6TD+hyuXDkyBG8+eabnmNSqRRTp07F/v37H7jGr3/9a6SmpmLZsmXYvXu3IDljVrGdP7IBE0fSKv6xQn2dDWNm+o5aCxQsw0EmINiiqbEZjM2FmR2ocUjpOBvLtiF9WLZP5VJcvh3J/ftCGuf9f1e6fScSevaEXOHdtV1RuQ+65C5Qa4NfFMAnAYyK7NGjR5vDK1euxDvvvNPm2M2bN8FxHNLS0tocT0tLw5kzZ9qdfs+ePfjrX/+Kqqoqv8SMScXGcTwartvRLd93hQBK5EMIgcvJQakKnXXOcbygKEKXwwV1vHcXGKVzbD99HBzDYlQf71U+7GYLnM1GzJs4y+s4l8MB87VreGqR9706jmNxq/YSliwMbsFtMbhy5QoMhjsu2HutNSGYzWY888wz+Oyzz5CSkuLXXDGp2OqrN6B3Pxo0EivcvBna/bVWhHy+WBeLOD/35ih34HkeVw9VY+Zs31U+ireUY+aEmR0I7y9H6gDfVf7LSncgJbMP4uLC4/8ZSFekwWBoo9jaIyUlBXFxcbhx40ab4zdu3EDXrl3vG3/hwgVcvnwZc+feiXvg+ZYC1zIZampq0KdPnw7JGZMhUjWnm/HosElii0EJEVVn9yGje+j21/yBZVjERWHFErHYXLkTib0zoNR4j0asOHoMUrkc+iTvOa2WpiZwLgbTBnqv8u+022C53Yj83DBK0icBenQQhUKB4cOHo6KiwnOM53lUVFRgzJj7ref+/fvjxIkTqKqq8jzmzZuHSZMmoaqq6j73pzfC41YihDTftkCtkUEVQrcURVyu1lkxdpZ3t1G4cOr2ZaTrRahKEYXYzFaYrjZi3qJnvI4jhKDxxBksmuO9ziMhBFtKyjF/qu/yeyWbStG138Mx7xVavnw5li5ditzcXIwcORIfffQRrFarJ0ry2WefRbdu3bBq1SqoVCoMGjSozfkJCQkAcN9xX8ScYjt/ZAMmjaZBI7GCe3+ND+n+mj8EIk2A4v6/F20uxZTJvqMRS3fthb5bVyhUKq/jKvZ/B1V8PDQ678nduw4cgyQuDlMGDem03MFEjATtxYsXo7GxEW+//TauX7+OnJwclJaWegJKamtrg5JbGVPfIJblcLPRgfR0GjQSK9y8aUVySuRU1OCoYuswPMfBbrHBZrTg4OVzcJqtcJptniT1hJ5doUtM8DoH63Kh+dIPHQrvv3nuHH4033sgCCEE18+exhNzHuvUewkJPHE//J2jk7z88st4+eWX232tsrLS67lffvllp9cDRFZsq1atQmFhIc6cOQO1Wo2xY8fid7/7HbKzs4OyXt2pDejbjyq1WKIqxPlrrQiNquZZjgaPtEAIgcvuhNVoxoHLZ+Ey2+E0W8HY7ySpK3RqKPVaPJz2MNRZeqgNOp8J2HdTXF6BlIH9fIf3b6tEYq9ePufeWrEH+tSuUCi9W3+U4CLqN2jnzp146aWXMGLECLAsi7feegvTp0/H6dOnofXR1E8I584045kn5gd8Xkr4Isb+GsfxkEqF7a1wTGwpNpZhYTdZYDVZ8N3lc3CabXBZ7CCt0XBKBZQGDRR6LYb1HQmNQQeFOjCdBGwmM5xGC+ZP8l59yGm3w9xwA08t9J4HyTIMmq7+gKcWhqYeaaehjUZDQ2lpaZvnX375JVJTU3HkyBFMmDDhvvFOpxNOp9Pz/N7sd2/cajRBp5dDqYydH41YR6z9NdaP7tluV2Rk7Ad2BJ7n4bDaYTdZcODSHXch19pJQBYHhU4DpV6DwRmPQK3XQaXT+ux/FgiKS8oxK893nceSkjKkdSC8f0vJVqT29m39UYJPWP3KG41GAEBSUlK7r69atQrvvvuuoLnPH9mISaPzhIpGiUAaGy2i7K8xDAuZwO7ZHBt5e2yM0wWr0Yz9l87CZbHDabKCsTpAQCCBBHKtCgq9W3mNHDgear34nQQqjhyFTKWEriXq7kGYbt0C4XhMHTDU6zib2QSn1YxFU70nd4uJBAEIHgmIJMEnbL5BPM/jpz/9KcaNG/fA0M4333wTy5cv9zw3mUwdym1gGBbNTS6kpXlPKKREF1Vn94uyv8a4WMHds/kwdEXyHAeb2XpXkIYNLovtrk4Ccij1Gih0GuT0HAq1QQ+lVhO2nQR4nkfDyTN4bI7vOo+lW8qxcLrv7YstxeWYOyk/UCIGB9poNPS89NJLOHnyJPbs2fPAMe0V2uwIdSc34KFsGjQSa9RftaLXkNDnr7ldkcJ+1AmEVSzxB0IInDYHbEYzDvxwDk6TDS6zDYyjJUhDKm0J0tDg4bRB0PTRQ63XhZ0C7iilO/fA0CPDp9W4be9BaJKSoPax31+57whkCiV0hoQASknxh7D4ZL788svYvHkzdu3ahe7duwd8/rNnjHh+yYKAz0sJXwghYFzi5K8xDBd23aZZF9NidZnx3eXzcJqt7iCNljtwuUrpdhcaNMh9aBTUBj0U6ujrJMA4nTDW1vkM7+dYFrcunMeSBd4DQXiex43z1XjSR3J3OCBWo1ExEFWxEULwyiuvYP369aisrERWVlbA17jVYEJCogJyWqYopnDvr4kTcu12RYrjhuNYDqXfHYCz2QKn2QqOYQG4gzSUeg2Uei0Gdx8CtV4HtU4bc4EOxWUV6PJwtk83aenWHUjK6u0ziGVbxW4kdO0GRQCKAAcdGhUZGl566SV888032LBhA/R6Pa5fvw4AiI+Ph9pHk7+Ocu7IRkweQ+tCxhpi7a8BLRabUMXmxx5G2eHvcOPkBST16Y5Rg9xBGvJI+MENEVajCYzVhqkDRnkd57TZYL15E0seneZ1HONyoenaFZ9pAJTQI6pi++STTwAAeXl5bY7/7W9/w3PPPef3/IyLhcnoQpcuYdALiRJS6q9akZWzQJS1LxjPQqsZEfJ1G05fwvzHno05K6yjlJSUY5aPljQAUFxShtSHfYf3l5ZsRVqf/gENkiGEYMumUt8DBSAhBBI/gz/8PT9UiO6KDCa1J4rQrz8NGok1WvfXFEpx8sFYFw9ZfGi/Wk67AzKlnCq1B7Dt0GHItRpo471HRlcePQ4AmJqd43Wc1WSCy27FtJzcQIkIQgg2Fm6CPFhVS/iWh79zRADhGY8bIM6fNWFsDnVDxhpi7q8BrVGRnVdsPM8LDtbYcfI4dGnJgs6NdniOQ+OpGsx5dIbXcYQQNJw6jfl53scBQGlxKebkBS68nxCCjQUbodLoMGvs/cUpKJ0jahVb4/VmJCYpadBIDHKsRpz6kK1wLA+ZgMoZHMNBKvDzarlxG8P7hN79GQkUb6tEQu9MyBQKr+O27dkPbUoKlGrvvdsq9x6GXK2BzhAYbxAhBBsKNkCtM2Duo3kBmbM9Wl2R/j4igahVbOeObKJBIzFK/VUbknqJVwGCdQmrHsL40WSUsTmg0kVGM9VQYjOZYWu8iRnDvLeq4lgWty5exJxxk72O43keNy6cwbyJ3gNLOgohBEXfFkGjT8Sc8UFupxXiRqNiEhZ5bIHG5WRgtTBITqZf9FiDEAKWEW9/DQBYhhfkiuQYVnD+G8+wiIuiGpOBgBCCzZu2YM7kub7rPJZXILlPX8TFef+/bd22EwnpPSBX+B9tyvM8NnxbBF1CCmaPHe/3fJQ7RKXF9sP3G9BvQILYYlBEoKHBjJQu4rYM4VgecgEWG+uHxQaCsC1hJRZle/ZBnZLkM2DEYbXC1tSEGTmjvY5zOZ1ovn4Vs0Y/6rdsPM+jaN166BO6hE6ptZbU8vcRAUTdN4EQggvnjBg7JE9sUSgiIGb+WisswwlSUP64IiluZWE3W3D76jWUVO5C04XLmD3Gt8uwpLgMcybmdyC8vxxpfQf4fQPhVmqFMCSlYdbYcX7N1RlaK4/4+4gEos4V2XCtGV1S1ZCFWUkjSmiov2pDn2GLRJWBECLoxy/WerEJweVwwm4y48D583CZrWAsVjB2e0uRTUCuVkOh10Kh02LR7Cd8pj9UHq6CJE4KQ2L7HUVasRibwTgcmDZkuF/y8xyH9esKkZCSgZmjx/g1F+XBRN236NyRTZiVF5iNXUpk0bq/JhewvxUOsAyLOIHtbqIFnuNgN1tgM5lx6PwFuCxWuCxWEM6dQBWnkEOucyuucX3cpcFUWq2gNAlCCG5Un8bjM33fCJUWl2HeFN+927zBcxzWry1AYmp3zBjl3e0ZFGh1/8jE6WDgsHNITPIerkuJTm7cEH9/DRD+3T958xK6ah8WtmaEhKsRQuCy22EzWXDw3Dm34jJbwTldANydBOQ6DRRaDUZ0y4ZGr4darw9K49HyXXuhT02D0kf5vh27v4NSq4dWJ7ztFcexWL+2EElpPTBjpPeSXsFCwrsf/s4RCUSVYrt8vAj9ByaILQZFJKrO7kdK1lSxxRBMtLgiWYaB3WR2W10XLoIxW8HYbCC8W/nK1ErItVoo9FpM6J8LtV4PhSq0nQRYhkHT5cs+6zzyHIeGi2exeP6TgtfiOBbr1xQgOT0T+SNGCp6H0nEi/1vUAiEEl86b8K/PiLu/QhGP69dsGDcsUWwxIPT3WWj3bELcnapDBc/zcFqsbqvr/DkwFqu78WhrJwG5DHKtBgqdFqN7DoRGr4dKG16dBLaUVSDloYd8ylS+dScSu2VCLvee3P0gOJZF4Zpv0aVbb0zPDVz5LUFQV2Tkcf3qbaSlqxEXF9t7FLGMmPUh70bod59jOMgE5KJxLAdJAPfmCCFgHE7YzRYcaHUXWqxg7Y47QRoaNRR6HUZk9IO6tx4avd5nZY9wwW42w2E0YoGP0lkuhwOmhmt4apGw6v1hpdQA2rYmEjl/pBhzpk4XWwyKSDAMJ1oPtLshhAi32AS6It2J3cK/yjuOfw/jD3VtgzSUcih0Wsh1WozvmwO1Xg+lRhMVjUdLSsoxJ893eP+W4nJ07ee7yn97sAyD9Wu+RWqPhzBt+DCholIEEhWKzWFzgmF4JCQEpocbJfK4fduKxETxLQbWj+7ZHCtMsbEMI7jGpMvuwPVjJzB36rygBWmEEzsOHUOcQg59gneXtbnpNjiWwZTBQzu9BsswKFyzDl179sPUYeGj1GKpbY34t7gB4IeTJcimQSMxjd3GQK0R/0fZH8vR7YoUYLGxHKQCg06MjTdh6J4BXWJi1Cs1Qggaqk9j3kTfVf5LS8oxb1Lnq/czjAuFq9eha2b/sFJqAGjlkUjjymUzRg8OcgFRSlhjdzBQqcQPTmAZNuSKjXUxggMz9p+qxtiswYLOjTTKKnfDkJ4BhY+u4jt2fwe1IQFqbecaFLcqtfRe/TF1aI4fklL8JSoUW1q6htbJi3Hqm08A2tCVJ3oQjIuDTKBbkBAiSEFxDCs4TcDR1Ax9cvT3cWNdLhhrr2D26Dyv4ziOReOlc5g3oXNpI4zLicLV65CRNRBTwlWpEdxpNir0ERkGW3TssY0f7n9RUkpk43BwSO4qfkQkywpXbELhWFbwHhvheEGRmJFGSek2pGT383kDXF5eieQeWZ1yy7qcTqxfsw7d+gzC5CGP+Ctq0KB7bBGGwUCDRmIdl5MLi1B/xiXcFSmUozdqIRW6Pxb5QY4+sRqNcFktyB/sPTnaabfDfLMBM0aO7fDcLqfDrdT6Dg5rpRZrRIXFRqE4HBxUKvGjIsWo0M8zHAYk9w/pmpECIQTFm0qwYNpcn2O3FJeha7+HOxze73TYUbS2AN37PoJJjwzyV9TgQxCABO2ASBJ0qGKjRAVOJweFSvyP8/mms9BqQpuMywlsMkoixK3kD2WVu6HrkgqNTu91nOn2LRCex5RBQzo0b6tS6/HQEOQNFlbfM+TQyiMUSmTBsURQc89Aw7I84rRCm4UK+9HgWWG5czzHQRLFQVdOux3GK1ewxEc9SEIIykrKsSh/XofmddhtKFpbgAXTZsFgEL+EG+V+xP8loFACQLhYHyzDQSagbY4/8vOsMIuNY1jhe3MRwOZNJeg6aLDPgJHtOw9Ak5AElcZ3g9pWpbZw+mzo9QkBkjRE8PB/T5VW96dQYg/WxQuyHHmOh1RgnVNecGI3C2mEN+RlGQZ2s7uTwJGa83BZrXDZbQAh0CanYEq2d9cix7G4+cMFLFnwI59rEUKwqWADFkydFXlKDbEVFUkVG4USQDiWF5RTxviRi8aznCDLKxIsNp7n4bBYYDObcbjmAlxWC1xWK3i2pZOATAaFVguFVoexvQe0dBLQdTivtax0O5J79u5QeH9p8TbEp6TDEE/dj+FOeH+qKZQO4C48HB5x66zg6iEspAIr9HMsKygXjWUY0S02QggYpxM2kxnfnTkHl9UCxmoD47ADACQSKeRqNRRaLUb27AuN3gC1Vgd5ADoJOGxWWG7fxFMTp/kcW7FtLxw2M56cOd/vdUWDBo9QKJGD08lCoQiPIAihe2wcywo6DwAIywtSUDzLQhqC5GyOZWG3WGA3m3H4TIu70GYF4Vs6CSgUUOp0kGu1mJA9BBq9Hkp18DsJbNlchjl5032us2vXYTQ3XsXi2YvC5gZKEFSxUSiRg8POQBkGdSIBgGOE7bG5LTbh70FYaxU2IM0/CSFw2mzujtk15z3uQs7pAiSANC4Oco0GCq0OozP7Qa3TQa3TIS5OvJ+fXQePQyKVIj4pxes4QgiuXT6DH819nJbtiyCoYqNEPA4nGz6KTWAQiBiJ3RzDCO4KsG3fQVgaGuAyW9yNR1Vud6FCp8XkQblQ6w2QKxRhaeEQQnD97Ck8NnOBz7E7tu+HISlNcAftsIJabBRK5OCwh0dl/1aE/Ji7K/uH9j1U1V/FsJTegs5tPHMGC2csgNYQH5bKyxsVO/ZBl9wFKrXG6ziX04GGugt4av7iEEkWZGIo3J/a1pSIx+FkoVSGj2ITAsuEPvSeZ1jBTVHjlEro4hMiTqlxLItbVy5hzvhJXscRQrCxcCO6P/QIZCGOHC3fvDWk60Uj1GKjRDxXm76HLH682GL4xclbl9EtPrR90YQmdvMcF3EKrZUtW7YhpVdfn/t7W8t3QWtIxORHQvc/IYSgeH1J0OaPpTw2arFRIh53nUjxK/sDwrcgOEZYyD4AEIGVaXmBaQIcy0IqYuCHUOxWK+ymZuQPH+V1nMvpRNONK5j7qHerLpAQQrC5sBhSaRxmTZgQrEVoB20KJVJwOjgow0SxCYVj+ZDXe3TXmIydiiVbNpd2KLx/y+YypPcaELIoSHdFk02QyeSYNyl0yjSaibzbLgrlHpzOKFBsDIc4hZAka38qlrCCFJs7sTuyfjp2HTgGqUwGQ0KS13EWkxGsy4Gpw4aGRC5CCDZ9uxEKpQZzJgbJUmuFJ4DET4uLjwyLLbI+nRRKOzjCxGJzh/oL23tyuyKFlsUSZj3xLCeseDIb/qW47oYQguvnqvHE7EU+x5YWl2HepOkhkKolQGXdBqjUOsye8GgoFoyZcH/qiqREPBxLIAsD15i7e7ZQJcMLtJ78UWzCLDaOiaw9tvKtO2FITYdCqfI6bufOw1Ao1dDpDEGXiRCCDeuKoFLrQ6PUYgyq2ChRQThE6TGMcMXml8XmRx86QTl3bOS4Ih02K4w36jF77ESv43iOw7XL1Zg/yXfdSH8hhKBobSE0mnjMnhDKaN5ABI5EhsUWGZ9OCiUCYBkOMsGFjIV1BRAjkCOSXJHFG7dg7uQZPgNByssqkZLeK+gVRniex4a166HTJ2Hm+LFBXes+qCuSQokcwqXJKOPiIPOjGLPQeo9C3In+cPxyHYaldg/pmkLYvusgFGqNz4ARl9MB463rmDkmuIqG53kUrSmA3pAceqUWY0TGbReF8gDCqWWNP65IobAuBtIQr8mzLGQy8YN12oNjWdgsZtjMJjRcPIunFi7xeU7JplJk9BoQ1M8Rz/NYv6YACQlpyB/rPY8ueEIEwJVIoyIplODjcnHh1bIm1PUeG+qQndA3pGvynLD8t0BACIHDaoXdasbhE+fhslvgslnBMQwAQCKNg1KjhUKjxaIZ833KaWq+DZ5jMWVoTtBkdiu1b5GYmI7pY0YGbR2fEN798HeOCIAqNkpEYw+jljUMwyFO4B6bUMTY7xIaTdlRGJfT3TH75Dm4bFY4bVZ341FCAIkEcqUKCo0WSo0Ok4bkQqMzQKFUdnodQgjKNpdh4fTZQXgXbnieQ+HqAiQlZWD6mBFBW4fSFqrYKBGNwxE+iu1C81nodALvyAXuE/ICS3HxPC/Y9eavK5IQApvZDJvFhKMnz8Nls8Jlt4LnOABAnFwOhdptdY3NfhhanbvxaKArgezYcQAafQI0Gl1A522F5zkU/nMdklN6YNro3KCs0SliKHiEKjZKRONwhE9lf9bFCa6WLxSe4QRZbDzLQiKwySjvp5VYuHodZAoVFFotRmb1hUanh0arF1wrUwgcx6LhyvmgtaThOBaFq79Fl5SemDp6eFDW6DR0j41CiQwcjvDpxcayPGQKAUrGL+uJE5T/xvqR/8ZzwtYEAOOtm5Ap1Xg8f66g8wNF+ZYdSMnICkpLGo5jUfjPdeiS2gtTRw0L+PwU34THrjuFIpD65u8BXXiETrMMD7mgJGtOcGQjJ7D1jD97c+49NmHWVeXOfZg+apygcwOFw26DuakRM0ePCfjcLMui4J9rkZqWFX5KLYaq+1OLjRLROBwcErqER+i5Oyqy818phmERJ7QUl+CKJcKrhxAQQftdHMfCabX4zCsLNls2lyGj98CAh/ezLIvCf65F1/Q+mDwiJ6BzBwSCAOyxBUSSoEMVGyWicTk5qFTBrRbRUThGWPUQ1uWHYmOF7bH5UzxZKLeuXYO+S1pI17wX4+2bACGYPOSRgM7LsgwK/rkWGekPYdKIIQGdm9J5qGKjRDQOBweFKjw+xizDCXNFssJbz4BAmPUkQprA8bM/IDczK6Rr3g0hBGUl5Xgsf15A52UYFwpXr0VGRjYm5QZWYQYUGhVJoUQGTicfPhYbywuyvBiGDX3+mwg91XiWRZyIXQG2V+yDLj4ZarUmYHO2KrVu3fojb/jggM0bFHgegJ8J1nxkJGjT4BFKRMO4Ql/t40EQImzvye2KDO0P/tG6OuQk9QzpmjwnPOjEXziWRePVi5g7IXAdqhmXE4X/XItu3QaEv1KLMURVbLt27cLcuXORkZEBiUSCoqIiMcWhRCjhUitSKBzLCd5jEwphOeF5YwLdURzLBiW8viOUllQgtXufgFmMLpcTBavXonuPAcgbPiggcwadGIqKFFWxWa1WDBkyBB9//LGYYlAimEhXagBw8uYlpGsfDumaQstikZayVoLW5IRVSfEXu9UCq+kW8kcGpviw0+lA4eq16NlzECYOixClBsSUYhN1j23mzJmYOXOmmCJQKKLDMVzIXZGCu2ezLKRCK5ZwXMj32AghKN5QjHmT8wNyE+R0OrB+9Tr0zByECUMHBkBCSjCIqOARp9MJp9PpeW4ymUSUhiI24dKHzV+E5r/58/55lhOe2C1QOfmT2C2UHdv3Q601wGBI9Hsup8OO9Wu+Rc/MwZgwdEAApAsxMVRSK6KCR1atWoX4+HjPo0ePHmKLRBERl4uDXB4+H2GheoZnhbWB8ScXTbDFxjDC1+TYkNbSZFxONNRdwLy8KX7P5XDYULhmHeZNmR6ZSg0AIXxAHp3l448/Rq9evaBSqTBq1Ch89913DxxbWFiI3NxcJCQkQKvVIicnB1999VWn1wyfX4UO8Oabb8JoNHoeV65cEVskiojY7QxU6vCJiBTq6RLqinTXe/RHsYW2FBchJKSuyOKNW5CRNdDvNe12G9av+RYLps6AQZ8QGOFihDVr1mD58uVYuXIljh49iiFDhiA/Px8NDQ3tjk9KSsIvfvEL7N+/H99//z2ef/55PP/88ygrK+vUuhHlilQqlVAK6LtEiU6cTgaKcKnszwiv7M8JdEVyrB+FjP1ZU6TIxvYghMDpsMNmMeNo1Vk47VY47VawjBNqrQFThw31a367zYqidQVYMHUG9Lr4AEktEoT470rspFviD3/4A1544QU8//zzAIBPP/0UxcXF+OKLL7BixYr7xufl5bV5/uqrr+Lvf/879uzZg/z8/A6vGz6fUAqlk9jtbNhU9mdcLGQC3aIcy0Gm6Lz1xPrhiiSEFxQEwjKM4D02f7BbLTA23ULV9+fhtFvgctg9bjG5QgWlWguFSouJQ3Kg1eqhUKr8Dhax2SzYsK4QC6fNhE5rCMTbEBcSgD22FsV2b3xDe0aHy+XCkSNH8Oabb3qOSaVSTJ06Ffv37+/AUgTbt29HTU0Nfve733VKTFEVm8Viwfnz5z3PL126hKqqKiQlJaFnz9Amj1IiD6eTCZtebAzDCVdsAq09zsUEtZN1u2sy4lhsGwuKkJjaHaP794NGo4dGo4VUGrz/vc1qxoZv12PR9FnQavRBWydSuTe+YeXKlXjnnXfaHLt58yY4jkNaWtv6oGlpaThz5swD5zYajejWrRucTifi4uLwpz/9CdOmTeuUfKIqtsOHD2PSpDuVAJYvXw4AWLp0Kb788kuRpKJEClebvofUIG4LlFZYhhPUiw1oqVgiwHriWOHtboRy/Ie6kCs2jnNHYs4ZPyEk61mtJmz8tgiLps+GNkjdtUWB5wGJnyWxWqzkK1euwGC4Y8UGcotIr9ejqqoKFosFFRUVWL58OXr37n2fm9Iboiq2vLy8qAnZpoQep5NHvDI8WtYwDAtZiOs9sn5EKAqFZ1mM6BbaQsbG27egCVHQhsViwqaCIjyWPxsatThKraJ4W3AmDqAr0mAwtFFs7ZGSkoK4uDjcuHGjzfEbN26ga9euDzxPKpWib9++AICcnBxUV1dj1apVnVJsERUVSaHcjdPBhk0BZH/22IRy9MYV9DP0DemaQqMp/bmBPfjdCYx7OPiVWSxmIzYVFOHx/DmiKbUt60vgZJy+B0YACoUCw4cPR0VFhecYz/OoqKjAmDEdb/LK83yb/OWOQINHKBGL08mHT8saloNMEfp6j0KSrN0nCztNaFksnucgkQhT/C67FVpdcPe5zOZmbC7ciMdnzIVaFbjq/52hpLAYHM9i5qSJ2LD7zwGfn/A8iJ+uyM7msS1fvhxLly5Fbm4uRo4ciY8++ghWq9UTJfnss8+iW7duWLVqFQB3rnJubi769OkDp9OJkpISfPXVV/jkk086tW54/CpQKAJwOMKnyej5prPQqHNDuibH+FHvUSA8yyFOyH6gH0EnPM9BFhc8l7PJ2ITiok14YsY8qFTqoK3jjeKCTSAgmDN1MhxOe3AWCaArsqMsXrwYjY2NePvtt3H9+nXk5OSgtLTUE1BSW1vbpiOG1WrFiy++iLq6OqjVavTv3x//93//h8WLF3dqXarYKBELy/Bh07KGZXjIdCLUexSQi+buuu1HYrcAi41lGcGJ0lwQ293sq6xC7Q8n8OTMeVAqQ6/UCCEoLtwECSSYM3VyyNcPBS+//DJefvnldl+rrKxs8/w3v/kNfvOb3/i9JlVslIgmXKr7C42K9Md6cid2C6seIhFayJhlIRNasUTgmoQTZiX6Yl/lMdT+cBJPzJoHpUIV8Pl9QQjB5oKNiJPKMGvKxOAvyBNAQjtoUyiUDuK2HoVU8uAgjRO29+TeYxNY71FoxRJO4Jp+ViwJ9A3MvspjqK0VX6nJ4uSYOTk0aQxupeRvuD9VbBRKzOCu0C+kkgcruMmo0D021s/9LiGJ0WJVLGmPvTuO4sqVU3hy5nwoFKEv0UcIwcZ1RVDKVZgx+dGQrx8LhMcnzU+EVJymhB5CXABxABIVJBL/gj5Cm/9IwPE2EPCQSbVoL0tGqMXGMsK7Z/NCLTYRrCeeE+6KFALjYlsq08ghv8tFvGf7EVytq8aTsxZAIQ994JFbqa2HSqFB/qTx7Y2Aw+YIzto8AfHTFRkpecdRodgc1i+gVg2DXDESEklUvKWognC3wbn2g7AX4HaFSCGR9UWccjQk0iRBc4aqZY2VOQej4xAY7hYAQCpRQa8cjHhlbpvPGscKKyrMMsJbuRBOWL1Hf9rdCMWdTB7876axyYrjRy6j9tJNd0UXqQQ9eqVgSG4WThw9jat1Z/DkrPmQi6TUNqwthFqlQ37e/RVzfjh1BSd2V6PxRmOQBODhvysyMoyIqNACBHYwrgPguStQqh+jyi2MIFwjWPtagHC486XiQdjzYLnLkKmfgCSuS6fndTgYKINcANnoPIJm+z4AdywUnjhgdByGg72KNN0CSOCWgXXxgoJHWJdwVyQgzHriQqRk7ubk+ToM75kZ1DVu3zSjfFMVWI73WBY8T1B7+SbOVp+DSmPE0/MXiabUitYWQKuOx/SJ9ycnn9x7BscqTghufURpSxRVHiHguKtgme/FFoRyF5xj6z1KrRUeICw4Z0V7p/kk2IqN5ZvRbG+tQH6v+4XAyV6D2XnCc4TneUGReyzrn2ITwtGroa/3yHNc0Ltn799ZA5blQe5pzWK3NaG56TJSpFniKbU130KnTmhXqZlvm3Gs4kTL2CDKwZOAPCKBKFJsbhhXldgiUFogXAMI34AHuz94EO46CNd514vDwQa1sr/ZeQp3W2rtj/H/Jop1hbarNOAO2R+aFFzr6b41OVZQHhvPcYDUtxlz66YZt29Z7tsDcjFWNDdfRIbyITTftKPptqXTMvgDz/NYv2Yd9NpETJs4ut0x545eCk3aCuED84gAItpn1/ohtljuvti3wXD2sMlvimV49jp4h+8vgpS5AamscyWT3BabFBZzcKo0NFsb4GAYH6OaEC+xAZBArVXAZrZ1eh2O5SCJk8Jutnb6XJlGCYel8+cRngASwGHt/LlylRp2AecRSEB4HnZb587lWBYKpcbneY3Xb4Jl7w+6aLp9AV3ieoInHHiOQ8ONm1CpQ/fbsGPLTqgVOowb+QjsjvY/H403GsHwd2ohssT9uQt0oAYLxu/CIyx8fSfCAwmJlDCXdqirq7uvLxCFQqFEA1euXEH37t39nsfhcCArKwvXr18PgFRA165dcenSJahUoc//6ygRrdh4nkd9fT30en3MWGgmkwk9evS4rx9SrEKvxx3otbhDJF8LQgjMZjMyMjLa1FH0B4fDAZfLFZC5FApFWCs1IMJdkVKpNCB3NJFIR/ohxRL0etyBXos7ROq1iI+PD+h8KpUq7JVRIIm64BEKhUKhxDZUsVEoFAolqqCKLcJQKpVYuXIllMrQ17gLR+j1uAO9Fneg1yK2iejgEQqFQqFQ7oVabBQKhUKJKqhio1AoFEpUQRUbhUKhUKIKqtgoFAqFElVQxRbhFBcXY9SoUVCr1UhMTMSCBQvEFkk0evXqBYlE0ubx/vvviy2WqDidTuTk5EAikaCqqkpscURh3rx56NmzJ1QqFdLT0/HMM8+gvr5ebLEoQYQqtgimoKAAzzzzDJ5//nkcP34ce/fuxVNPPSW2WKLy61//GteuXfM8XnnlFbFFEpU33ngDGRkZYoshKpMmTcLatWtRU1ODgoICXLhwAY8//rjYYlGCSESX1IplWJbFq6++ig8++ADLli3zHB84cKCIUomPXq9H165dxRYjLNiyZQvKy8tRUFCALVu2iC2OaLz22muevzMzM7FixQosWLAADMNALg9ujziKOFCLLUI5evQorl69CqlUiqFDhyI9PR0zZ87EyZMnxRZNVN5//30kJydj6NCh+OCDD8CyrNgiicKNGzfwwgsv4KuvvoJGoxFbnLDh9u3b+PrrrzF27Fiq1KIYqtgilIsXLwIA3nnnHfzyl7/E5s2bkZiYiLy8PNy+fVtk6cThJz/5CVavXo0dO3bg3//93/Hb3/4Wb7zxhthihRxCCJ577jn8+Mc/Rm5urtjihAU///nPodVqkZycjNraWmzYsEFskSjBhFDCip///OcE7naAD3xUV1eTr7/+mgAgf/7znz3nOhwOkpKSQj799FMR30Fg6ej1aI+//vWvRCaTEYfDEWKpg0NHr8Uf//hHMm7cOMKyLCGEkEuXLhEA5NixY+K+gQDS2c9FY2MjqampIeXl5WTcuHFk1qxZhOd5Ed8BJZjQklphRmNjI27duuV1TO/evbF3715MnjwZu3fvxvjx4z2vjRo1ClOnTsV7770XbFFDQkevh0KhuO/4qVOnMGjQIJw5cwbZ2dnBEjFkdPRaPPnkk9i0aVObHoUcxyEuLg5PP/00/v73vwdb1KDjz+eitUHxvn37MGbMmGCJSBERGjwSZnTp0gVdunTxOW748OFQKpWoqanxKDaGYXD58mVkZmYGW8yQ0dHr0R5VVVWQSqVITU0NsFTi0NFr8T//8z/4zW9+43leX1+P/Px8rFmzBqNGjQqmiCHDn88Fz/MA3KkQlOiEKrYIxWAw4Mc//jFWrlyJHj16IDMzEx988AEA4IknnhBZutCzf/9+HDx4EJMmTYJer8f+/fvx2muv4V/+5V+QmJgotnghpWfPnm2e63Q6AECfPn1irjHvwYMHcejQIYwfPx6JiYm4cOECfvWrX6FPnz7UWotiqGKLYD744APIZDI888wzsNvtGDVqFLZv3x5zP+SAu03J6tWr8c4778DpdCIrKwuvvfYali9fLrZoFBHRaDQoLCzEypUrYbVakZ6ejhkzZuCXv/wlbWkTxdA9NgqFQqFEFTTcn0KhUChRBVVsFAqFQokqqGKjUCgUSlRBFRuFQqFQogqq2CgUCoUSVVDFRqFQKJSogio2CoVCoUQVVLFRKBQKJaqgio0S8bzzzjvIyckRWwxBfPnll0hISBBbDAolqqCKjQIAeO6557BgwQKxxQgKly9fhkQiQVVVldii3MfixYtx9uxZscV4IOF87SiUB0FrRVIoQcDlcrXbMuVe1Go11Gp1CCRqS0flo1AiEWqxUTrEzp07MXLkSCiVSqSnp2PFihVgWdbzutlsxtNPPw2tVov09HR8+OGHyMvLw09/+lPPmGvXrmH27NlQq9XIysrCN998g169euGjjz7yjGlubsa//uu/okuXLjAYDJg8eTKOHz/eRpb3338faWlp0Ov1WLZsGRwOh1/vjed5rFq1CllZWVCr1RgyZAi+/fZbz+scx2HZsmWe17Ozs/HHP/6xzRytFu97772HjIwMZGdne6ydwsJCTJo0CRqNBkOGDMH+/fs9593rimx1q3711Vfo1asX4uPj8aMf/Qhms7lT1/peWuf9/PPPkZWVBZVKBQAoLS3F+PHjkZCQgOTkZMyZMwcXLlzwnJeVlQUAGDp0KCQSCfLy8jyvff755xgwYABUKhX69++PP/3pT5267hRKsKCKjeKTq1evYtasWRgxYgSOHz+OTz75BH/961/b9Pxavnw59u7di40bN2Lr1q3YvXs3jh492maeZ599FvX19aisrERBQQH+8pe/oKGhoc2YJ554Ag0NDdiyZQuOHDmCYcOGYcqUKbh9+zYAYO3atXjnnXfw29/+FocPH0Z6errfP6irVq3CP/7xD3z66ac4deqUp93Nzp07AbgVX/fu3bFu3TqcPn0ab7/9Nt566y2sXbu2zTwVFRWoqanB1q1bsXnzZs/xX/ziF3j99ddRVVWFfv36YcmSJW1uCu7lwoULKCoqwubNm7F582bs3LkT77//vuf1jlzr9jh//jwKCgpQWFjocS1arVYsX74chw8fRkVFBaRSKRYuXOjpWfbdd98BALZt24Zr166hsLAQAPD111/j7bffxnvvvYfq6mr89re/xa9+9auoaGJKiQLEbeBNCReWLl1K5s+f3+5rb731FsnOziY8z3uOffzxx0Sn0xGO44jJZCJyuZysW7fO83pzczPRaDTk1VdfJYQQUl1dTQCQQ4cOecacO3eOACAffvghIYSQ3bt3E4PBQBwOR5v1+/TpQ/785z8TQggZM2YMefHFF9u8PmrUKDJkyJAHvrdLly4RAOTYsWP3veZwOIhGoyH79u1rc3zZsmVkyZIlD5zzpZdeIo899pjn+dKlS0laWhpxOp33rfv55597jp06dYoAINXV1YQQQv72t7+R+Ph4z+srV64kGo2GmEwmz7Gf/exnZNSoUYQQ0qFr3R4rV64kcrmcNDQ0PHAMIYQ0NjYSAOTEiRNt3sO9165Pnz7km2++aXPsP//zP8mYMWO8zk+hhAK6x0bxSXV1NcaMGQOJROI5Nm7cOFgsFtTV1aGpqQkMw2DkyJGe1+Pj45Gdne15XlNTA5lMhmHDhnmO9e3bt03vuOPHj8NisSA5ObnN+na73eMeq66uxo9//OM2r48ZMwY7duwQ9N7Onz8Pm82GadOmtTnucrkwdOhQz/OPP/4YX3zxBWpra2G32+Fyue6LxBw8eHC7+1aPPPKI5+/09HQAQENDA/r379+uTL169YJer29zTqtle/HiRZ/X+kFkZmbe13X63LlzePvtt3Hw4EHcvHnTY6nV1tZi0KBB7c5jtVpx4cIFLFu2DC+88ILnOMuyiI+P9ykHhRJsqGKjhA0WiwXp6emorKy877VghcRbLBYAQHFxMbp169bmtdZGlKtXr8brr7+O3//+9xgzZgz0ej0++OADHDx4sM14rVbb7hpyudzzd+vNQasC8TW+9Rxv4ztKe/LNnTsXmZmZ+Oyzz5CRkQGe5zFo0CC4XK4HztN6zT777DOMGjWqzWtxcXF+y0mh+AtVbBSfDBgwAAUFBSCEeH6Y9+7dC71ej+7duyMxMRFyuRyHDh1Cz549AQBGoxFnz57FhAkTAADZ2dlgWRbHjh3D8OHDAbitpaamJs86w4YNw/Xr1yGTydCrV68HynLw4EE8++yznmMHDhwQ/N4GDhwIpVKJ2tpaTJw4sd0xe/fuxdixY/Hiiy96jt0dYBFKevfu7fNad5Rbt26hpqYGn332GR599FEAwJ49e9qMabVAOY7zHEtLS0NGRgYuXryIp59+2p+3Q6EEBarYKB6MRuN9+UrJycl48cUX8dFHH+GVV17Byy+/jJqaGqxcuRLLly+HVCqFXq/H0qVL8bOf/QxJSUlITU3FypUrIZVKPYqwf//+mDp1Kv7t3/4Nn3zyCeRyOf7f//t/UKvVnjFTp07FmDFjsGDBAvzXf/0X+vXrh/r6ehQXF2PhwoXIzc3Fq6++iueeew65ubkYN24cvv76a5w6dQq9e/f2+f5qamruO/bwww/j9ddfx2uvvQae5zF+/HgYjUbs3bsXBoMBS5cuxUMPPYR//OMfKCsrQ1ZWFr766iscOnTIEzEYSjpyrTtKYmIikpOT8Ze//AXp6emora3FihUr2oxJTU2FWq1GaWkpunfvDpVKhfj4eLz77rv4yU9+gvj4eMyYMQNOpxOHDx9GU1MTli9fHsi3TKF0HrE3+SjhwdKlSwmA+x7Lli0jhBBSWVlJRowYQRQKBenatSv5+c9/ThiG8ZxvMpnIU089RTQaDenatSv5wx/+QEaOHElWrFjhGVNfX09mzpxJlEolyczMJN988w1JTU0ln376aZt5XnnlFZKRkUHkcjnp0aMHefrpp0ltba1nzHvvvUdSUlKITqcjS5cuJW+88UaHgkfae1y5coXwPE8++ugjkp2dTeRyOenSpQvJz88nO3fuJIS4A0yee+45Eh8fTxISEsh//Md/kBUrVrRZs73gm/YCL5qamggAsmPHDkJI+8Ej976XDz/8kGRmZnbqWt9Le/MSQsjWrVvJgAEDiFKpJI888giprKwkAMj69es9Yz777DPSo0cPIpVKycSJEz3Hv/76a5KTk0MUCgVJTEwkEyZMIIWFhQ+UgUIJFRJCCBFDoVKiG6vVim7duuH3v/89li1b1u6Yuro69OjRA9u2bcOUKVNCLGH00JFrTaHEEtQVSQkIx44dw5kzZzBy5EgYjUb8+te/BgDMnz/fM2b79u2wWCwYPHgwrl27hjfeeAO9evXq9N5QrNORa02hxDJUsVECxn//93+jpqYGCoUCw4cPx+7du5GSkuJ5nWEYvPXWW7h48SL0ej3Gjh2Lr7/++r4oQIpvfF1rCiWWoa5ICoVCoUQVtKQWhUKhUKIKqtgoFAqFElVQxUahUCiUqIIqNgqFQqFEFVSxUSgUCiWqoIqNQqFQKFEFVWwUCoVCiSqoYqNQKBRKVPH/AS41AUx9QYbcAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 500x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 500x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from typing import Callable\n",
"import matplotlib.tri as tri\n",
"\n",
"def plot_results(x_values: Union[List[float], np.ndarray],\n",
" y_values: Union[List[float], np.ndarray],\n",
" z_values: Union[List[float], np.ndarray],\n",
" xlabel: str, \n",
" ylabel: str,\n",
" title: str,\n",
" contour_levels: int = 14,\n",
" figsize: Tuple[int, int] = (10, 10)):\n",
" \"\"\"Plot experiment results\n",
" \n",
" Args:\n",
" results: list of experiment results\n",
" x_values: x list or array\n",
" y_values: y list or array\n",
" z_values: z list or array\n",
" title: plot title\n",
" xlabel: x axis label\n",
" ylabel: y axis label\n",
" contour_levels: number of contour levels\n",
" figsize: figure size\n",
" \"\"\"\n",
" \n",
" plt.figure(figsize=figsize)\n",
" plt.title(title)\n",
" plt.xlabel(xlabel)\n",
" plt.ylabel(ylabel)\n",
" plt.scatter(x_values, y_values, c=z_values, cmap='viridis')\n",
" plt.colorbar()\n",
"\n",
" # create triangulation\n",
" triang = tri.Triangulation(x_values, y_values)\n",
"\n",
" # interpolate data\n",
" interpolator = tri.LinearTriInterpolator(triang, z_values)\n",
" xi = np.linspace(min(x_values), max(x_values), 100)\n",
" yi = np.linspace(min(y_values), max(y_values), 100)\n",
" Xi, Yi = np.meshgrid(xi, yi)\n",
" zi = interpolator(Xi, Yi)\n",
"\n",
" # plot contour\n",
" plt.contour(xi, yi, zi, colors='k', levels=contour_levels, linewidths=0.5, alpha=0.5)\n",
" plt.contourf(xi, yi, zi, levels=contour_levels, cmap='viridis', alpha=0.5)\n",
" plt.show()\n",
"\n",
"for m in momentum_candidates:\n",
" x_values = np.log([r['lr'] for r in results if r['momentum'] == m])\n",
" y_values = np.log([r['mini_batch_size'] for r in results if r['momentum'] == m])\n",
" z_values = [r['valid_acc'] for r in results if r['momentum'] == m]\n",
"\n",
" plot_results(\n",
" x_values=x_values,\n",
" y_values=y_values,\n",
" z_values=z_values,\n",
" title=f'momentum {m} valid accuracy',\n",
" xlabel='Logged Learning rate',\n",
" ylabel='Logged mini batch size',\n",
" contour_levels=10,\n",
" figsize=(5, 5))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"위 셀을 실행하면 다음과 같은 결과가 나옵니다.\n",
"\n",
"![batch_lr_graph](./llr_lbs_m0_v_acc.png)\n",
"![batch_lr_graph](./llr_lbs_m5_v_acc.png)\n",
"![batch_lr_graph](./llr_lbs_m9_v_acc.png)\n",
"\n",
"이 그래프를 보면 알 수 있듯이 learning rate와 mini-batch size는 서로 비례 관계에 있습니다. learning rate가 커지면 mini-batch size도 커져야 좋은 결과를 얻을 수 있습니다. 그리고 momentum은 batch size를 크게 해도 성능이 떨어지지 않게 해주는 것을 알 수 있습니다. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"65, 0.01, 0.5의 조합이 가장 최적으로 보입니다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. 신경망 모델 구조 변경: Momentum 을 0.9로 고정시킨 상태에서 신경망의 hidden unit 들의 갯수를 2 에서 100 사이의 3 가지 다른 경우에 대해 성능을 비교한다. 필요한 경우 learning rate 와 학습 기간(epochs)은 신경망 구조에 따라 적당하게 변경할 수 있다. Hidden unit 의 갯수들이 학습에서의 수렴과 신경망의 일반화 성는에 미치는 영향에 대한 데이터(표나 그래프)를 제시하고 경향을 분석하시오."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 실험 코드"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"conf = Config(\n",
" num_inputs=2304,\n",
" num_hiddens=[16, 32],\n",
" num_outputs=7,\n",
" eps=0.01,\n",
" momentum=0.9,\n",
" num_epochs=1000,\n",
" batch_size=241,\n",
" early_stopping=True,\n",
" patience=50,\n",
")\n",
"\n",
"num_hidden_candidates = [2, 4, 8, 16, 32, 64, 100]\n",
"hidden_candidates = itertools.product(num_hidden_candidates, num_hidden_candidates)\n",
"\n",
"experiments_list = load_experiment_metafile('experiments_hidden.json',\n",
" init_task_if_not_exists=hidden_candidates)\n",
"\n",
"while len(experiments_list) > 0:\n",
" num_hiddens = experiments_list[\"remain_experiments\"].pop()\n",
"\n",
" print(f\"Running experiment with {num_hiddens} hidden units\")\n",
" conf.num_hiddens = num_hiddens\n",
"\n",
" save_dir = f\"results_hidden/{num_hiddens[0]}_{num_hiddens[1]}\"\n",
" _, stat, _ = ExperimentMLP(conf, title=f\"hidden {num_hiddens}\", show=False, \n",
" save_dir=save_dir)\n",
" \n",
" i, best_valid_acc = stat.best_valid_acc()\n",
" experiments_list[\"completed_experiment_results\"].append({\n",
" \"num_hiddens\": num_hiddens,\n",
" \"save_dir\": save_dir,\n",
" \"test_acc\": stat.test_acc,\n",
" \"test_ce\": stat.test_ce,\n",
" \"train_acc\": stat.train_acc[i][1],\n",
" \"train_ce\": stat.train_ce[i][1],\n",
" \"valid_acc\": best_valid_acc,\n",
" \"valid_ce\": stat.valid_ce[i][1],\n",
" \"time\": stat.time\n",
" })\n",
" save_experiment_metafile('experiments_hidden.json', experiments_list)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.10.2 ('hw3': venv)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.2"
},
"vscode": {
"interpreter": {
"hash": "82fd07bec16cb4479257adc108d4dc98de3f270fc95dcdba0cb0fb16f10a7c36"
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}