{ "cells": [ { "cell_type": "markdown", "id": "be8cb81f", "metadata": {}, "source": [ "(lecture07:estimating-probabilities-from-data)=\n", "# Estimating probabilities from data - Bootstrapping\n", "\n", "You can use the same idea we used in simulations to estimate probabilities from experiments.\n", "So, if $I$ is the background information and $A$ is a logical proposition that is experimentally testable, then\n", "\n", "$$\n", "p(A|I) \\approx \\frac{\\text{Number of times}\\;A\\;\\text{is True under}\\;I\\;\\text{in}\\;N\\;\\text{experiments}}{N}.\n", "$$\n", "\n", "There is a catch here.\n", "The experiments must be *independently* done.\n", "This means that you should prepare any apparatous you are using in exactly the same way for all experiments and that no experiment should affect any other in any way.\n", "Most of the experiments we run in a lab are independent.\n", "However, this assumption may be wrong for data collected in the wild." ] }, { "cell_type": "markdown", "id": "4629d289", "metadata": {}, "source": [ "(lecture07:example-high-performance buildings)=\n", "## Example - Estimating the probability of excessive energy use\n", "\n", "Let's try this in practice using the high-performance building dataset.\n", "I'm importing the libraries and loading the data below." ] }, { "cell_type": "code", "execution_count": 6, "id": "32ca28be", "metadata": { "tags": [ "hide-input", "hide-output" ] }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import seaborn as sns\n", "sns.set(rc={\"figure.dpi\":100, 'savefig.dpi':300})\n", "sns.set_context('notebook')\n", "sns.set_style(\"ticks\")\n", "from IPython.display import set_matplotlib_formats\n", "set_matplotlib_formats('retina', 'svg')\n", "import requests\n", "import os\n", "def download(url, local_filename=None):\n", " \"\"\"\n", " Downloads the file in the ``url`` and saves it in the current working directory.\n", " \"\"\"\n", " data = requests.get(url)\n", " if local_filename is None:\n", " local_filename = os.path.basename(url)\n", " with open(local_filename, 'wb') as fd:\n", " fd.write(data.content)\n", " \n", "# The url of the file we want to download\n", "url = 'https://raw.githubusercontent.com/PurdueMechanicalEngineering/me-297-intro-to-data-science/master/data/temperature_raw.xlsx'\n", "download(url)\n", "import numpy as np\n", "import pandas as pd\n", "df = pd.read_excel('temperature_raw.xlsx')\n", "df = df.dropna(axis=0)\n", "df.date = pd.to_datetime(df['date'], format='%Y-%m-%d')" ] }, { "cell_type": "markdown", "id": "b13a1133", "metadata": {}, "source": [ "The background information $I$ is as follows:\n", "\n", "> A random household is picked on a random week during the heating season.\n", "> The heating season is defined to be the time of the year during which the \n", "> weekly average of the external temperature is less than 55 degrees F.\n", "\n", "The logical proposition $A$ is:\n", "\n", "> The weekly HVAC energy consumption of the household exceeds 400 kWh.\n", "\n", "First, we start by selecting the subset of the data that pertains to the heating season." ] }, { "cell_type": "code", "execution_count": 3, "id": "6ffb31fa", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
householddatescoret_outt_unithvac
0a12018-01-07100.04.28337366.693229246.473231
1a102018-01-07100.04.28337366.3561345.492116
2a112018-01-0758.04.28337371.549132402.094327
3a122018-01-0764.04.28337373.429514211.692244
4a132018-01-07100.04.28337363.9239370.850536
.....................
5643c442020-02-2559.043.64238876.49463719.135139
5644c452020-02-2587.043.64238871.16505230.794281
5646c472020-02-2597.043.64238868.6032875.339391
5647c482020-02-2592.043.64238873.42923918.040078
5649c502020-02-2559.043.64238877.71695514.405155
\n", "

2741 rows × 6 columns

\n", "
" ], "text/plain": [ " household date score t_out t_unit hvac\n", "0 a1 2018-01-07 100.0 4.283373 66.693229 246.473231\n", "1 a10 2018-01-07 100.0 4.283373 66.356134 5.492116\n", "2 a11 2018-01-07 58.0 4.283373 71.549132 402.094327\n", "3 a12 2018-01-07 64.0 4.283373 73.429514 211.692244\n", "4 a13 2018-01-07 100.0 4.283373 63.923937 0.850536\n", "... ... ... ... ... ... ...\n", "5643 c44 2020-02-25 59.0 43.642388 76.494637 19.135139\n", "5644 c45 2020-02-25 87.0 43.642388 71.165052 30.794281\n", "5646 c47 2020-02-25 97.0 43.642388 68.603287 5.339391\n", "5647 c48 2020-02-25 92.0 43.642388 73.429239 18.040078\n", "5649 c50 2020-02-25 59.0 43.642388 77.716955 14.405155\n", "\n", "[2741 rows x 6 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_heating = df[df['t_out'] < 55]\n", "df_heating" ] }, { "cell_type": "markdown", "id": "d7fd5ea3", "metadata": {}, "source": [ "We have 2741 such measurements.\n", "Now we want to pick a random household on a random week.\n", "Unfortunately, in this dataset this is not exactly equivalent to picking a row at random because there are some missing data.\n", "So, if we wanted to be very picky we would have to find the number of weeks during which we have data from all households.\n", "However, we won't be so picky.\n", "The result would not be far off what we estimate by randomly picking rows.\n", "\n", "Okay, so here is what we are going to do.\n", "We will pick $N$ rows at random.\n", "For each one of the rows we are going to test if the logical proposition $A$ is True.\n", "Finally, we are going to divide the number of times $A$ is True with $N$.\n", "Alright, let's do it." ] }, { "cell_type": "code", "execution_count": 26, "id": "960c53ac", "metadata": {}, "outputs": [], "source": [ "# The number of rows to pick\n", "N = 500\n", "# Each row corresponds to an integer from 0 to 2740. Pick\n", "# N such integers at random\n", "rows = np.random.randint(0, df_heating.shape[0], size=N)" ] }, { "cell_type": "code", "execution_count": 27, "id": "9edfb782", "metadata": { "tags": [ "hide-output" ] }, "outputs": [ { "data": { "text/plain": [ "array([2587, 1052, 2286, 1129, 583, 1962, 179, 1660, 1036, 22, 798,\n", " 1486, 2555, 605, 960, 907, 105, 2275, 2717, 2293, 760, 2014,\n", " 1960, 2534, 672, 2244, 875, 2373, 1688, 1456, 25, 647, 1955,\n", " 887, 1784, 1329, 26, 2019, 333, 1063, 713, 2602, 1694, 2697,\n", " 345, 369, 1864, 1355, 2330, 105, 1351, 2659, 264, 777, 1863,\n", " 1328, 1713, 199, 1993, 1598, 1357, 2070, 424, 515, 2024, 1923,\n", " 757, 1269, 2137, 1877, 2619, 1754, 2233, 2516, 931, 1339, 304,\n", " 547, 597, 736, 1059, 1079, 1541, 496, 318, 483, 1882, 2155,\n", " 1092, 210, 1111, 2350, 341, 1010, 134, 1007, 1998, 1071, 1298,\n", " 1406, 225, 2002, 1960, 1712, 315, 2054, 807, 2399, 2475, 1145,\n", " 2593, 1293, 2307, 768, 1102, 2394, 502, 1701, 2720, 1451, 284,\n", " 1079, 223, 2314, 1349, 1930, 2145, 1038, 1246, 306, 2087, 66,\n", " 1671, 2360, 885, 1816, 1837, 671, 2528, 1795, 2023, 184, 612,\n", " 1867, 1180, 409, 1434, 2330, 2267, 1870, 1812, 520, 1173, 968,\n", " 201, 766, 323, 458, 1432, 70, 1311, 2008, 1693, 1905, 2307,\n", " 1354, 805, 2534, 964, 625, 1546, 168, 469, 797, 28, 1329,\n", " 215, 648, 2137, 1204, 2198, 1904, 294, 1253, 1798, 1763, 2130,\n", " 1195, 2073, 2412, 1217, 743, 771, 2338, 1411, 1097, 2344, 1398,\n", " 1131, 1614, 1277, 1341, 259, 1855, 522, 1920, 714, 437, 38,\n", " 83, 664, 902, 433, 1413, 1027, 1935, 1766, 2514, 2064, 2376,\n", " 1765, 1394, 113, 749, 822, 1531, 916, 46, 179, 2181, 2411,\n", " 681, 1236, 215, 1563, 2117, 478, 892, 1913, 167, 853, 1243,\n", " 1621, 1125, 442, 960, 2244, 2404, 922, 1696, 1005, 93, 1945,\n", " 2196, 1634, 369, 1246, 2478, 831, 1369, 1039, 1795, 664, 706,\n", " 2608, 1507, 2341, 2519, 1573, 2229, 471, 1521, 2478, 453, 2010,\n", " 1205, 853, 2107, 1774, 2346, 1776, 75, 252, 1397, 1306, 2326,\n", " 2365, 271, 146, 2157, 2425, 2601, 2667, 846, 107, 2272, 1683,\n", " 1147, 2087, 1331, 978, 370, 665, 315, 1044, 13, 1415, 803,\n", " 1959, 2145, 2073, 628, 860, 512, 657, 1286, 214, 2287, 2450,\n", " 405, 1160, 764, 800, 1771, 1449, 1912, 2732, 980, 78, 2398,\n", " 1649, 2410, 555, 526, 132, 2188, 54, 839, 622, 2200, 914,\n", " 1157, 1922, 1307, 2543, 2480, 1452, 1047, 148, 1562, 2337, 2716,\n", " 2686, 2307, 1739, 949, 353, 940, 2593, 874, 296, 1520, 1136,\n", " 1006, 2041, 2078, 758, 1157, 2180, 1622, 1582, 2159, 1610, 179,\n", " 1149, 176, 18, 1655, 2004, 42, 1495, 2673, 2603, 2455, 607,\n", " 2334, 1533, 525, 2369, 2713, 371, 2502, 2711, 598, 966, 784,\n", " 2127, 327, 85, 1084, 782, 157, 469, 1052, 1985, 723, 2277,\n", " 1844, 572, 2364, 305, 1704, 312, 1868, 1079, 1117, 104, 173,\n", " 1919, 133, 2174, 2489, 1480, 715, 495, 1236, 1904, 1793, 1795,\n", " 788, 2179, 2430, 2050, 2604, 1480, 2350, 178, 1094, 101, 491,\n", " 746, 2193, 775, 98, 2608, 197, 2131, 666, 2560, 2398, 1492,\n", " 2318, 2320, 2001, 1789, 1245, 79, 223, 1982, 1092, 492, 1187,\n", " 829, 2647, 1479, 935, 346, 1317, 861, 2406, 2314, 384, 1119,\n", " 917, 1680, 1030, 75, 798, 1950, 1803, 2295, 1499, 2700, 399,\n", " 1738, 2056, 231, 454, 2431, 2525, 2372, 81, 2660, 321, 2635,\n", " 2419, 2252, 1395, 1495, 2243])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rows" ] }, { "cell_type": "markdown", "id": "d7208fd7", "metadata": {}, "source": [ "Now we need to pick the rows of `df_heating` that have those indices.\n", "We can use [pandas.Dataframe.iloc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html) to do this:" ] }, { "cell_type": "code", "execution_count": 28, "id": "f054c57e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
householddatescoret_outt_unithvac
5456a152020-02-0980.038.12398375.235615103.460516
2384c352018-12-0298.036.91944470.374578103.333777
5075b262019-12-1578.036.13075473.94591475.234305
2470b212018-12-1622.035.10062076.7821920.000000
645c462018-04-0177.045.60739172.82252046.597443
.....................
5243c442020-01-0553.042.49531377.833209117.672719
5033c342019-12-0894.037.53539269.029183173.136284
2763a72019-01-2745.021.50411777.148845260.506823
2877b282019-02-1049.038.19280873.96834712.313202
5022b232019-12-0866.037.53539277.67931573.887601
\n", "

500 rows × 6 columns

\n", "
" ], "text/plain": [ " household date score t_out t_unit hvac\n", "5456 a15 2020-02-09 80.0 38.123983 75.235615 103.460516\n", "2384 c35 2018-12-02 98.0 36.919444 70.374578 103.333777\n", "5075 b26 2019-12-15 78.0 36.130754 73.945914 75.234305\n", "2470 b21 2018-12-16 22.0 35.100620 76.782192 0.000000\n", "645 c46 2018-04-01 77.0 45.607391 72.822520 46.597443\n", "... ... ... ... ... ... ...\n", "5243 c44 2020-01-05 53.0 42.495313 77.833209 117.672719\n", "5033 c34 2019-12-08 94.0 37.535392 69.029183 173.136284\n", "2763 a7 2019-01-27 45.0 21.504117 77.148845 260.506823\n", "2877 b28 2019-02-10 49.0 38.192808 73.968347 12.313202\n", "5022 b23 2019-12-08 66.0 37.535392 77.679315 73.887601\n", "\n", "[500 rows x 6 columns]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_heating_exp = df_heating.iloc[rows]\n", "df_heating_exp" ] }, { "cell_type": "markdown", "id": "fab5ae34", "metadata": {}, "source": [ "Now let's evaluate the value of the logical proposition $A$ for each one of these rows." ] }, { "cell_type": "code", "execution_count": 29, "id": "86f96dc8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5456 False\n", "2384 False\n", "5075 False\n", "2470 False\n", "645 False\n", " ... \n", "5243 False\n", "5033 False\n", "2763 False\n", "2877 False\n", "5022 False\n", "Name: hvac, Length: 500, dtype: bool" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_heating_exp_A = df_heating_exp['hvac'] > 300\n", "df_heating_exp_A" ] }, { "cell_type": "markdown", "id": "59792288", "metadata": {}, "source": [ "Now, we need to count the number of times the logical proposition was `True`.\n", "We can do this either with the function [pandas.Dataframe.value_counts()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.value_counts.html):" ] }, { "cell_type": "code", "execution_count": 40, "id": "a4456b0a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False 466\n", "True 34\n", "Name: hvac, dtype: int64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_heating_exp_A_counts = df_heating_exp_A.value_counts()\n", "df_heating_exp_A_counts" ] }, { "cell_type": "markdown", "id": "9edc7c20", "metadata": {}, "source": [ "This returned both the `True` and the `False` counts.\n", "To get just the `True` counts:" ] }, { "cell_type": "code", "execution_count": 42, "id": "90b1351e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "34" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "number_of_A_true = df_heating_exp_A_counts[True]\n", "number_of_A_true" ] }, { "cell_type": "markdown", "id": "0409978f", "metadata": {}, "source": [ "And now we can estimate the probability by dividing the number of times $A$ was `True` with the number of randomly selected rows $N$.\n", "We get this:" ] }, { "cell_type": "code", "execution_count": 43, "id": "c8c01c05", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p(A|I) ~= 0.07\n" ] } ], "source": [ "p_A_g_I = number_of_A_true / N\n", "print('p(A|I) ~= {0:1.2f}'.format(p_A_g_I))" ] }, { "cell_type": "markdown", "id": "9143aaa0", "metadata": {}, "source": [ "Nice!\n", "This was easy.\n", "Now, you may say why didn't you pick all rows?\n", "I could have, and if I had a really really big number of rows I would be getting something very good estimate of the probability.\n", "But you never know if you have enough data...\n", "It is not like the simulated experiment where we could do as many runs as we liked.\n", "Most of the times, we have a finite amount of data that is not good enough for an accurate estimate.\n", "In other words, there is a bit of epistemic uncertainty in our estimate of the probability.\n", "There is something we can do to estimate this epistemic uncertainty.\n", "Let me show you.\n", "\n", "First, put everything we did above in a nice function:" ] }, { "cell_type": "code", "execution_count": 84, "id": "d573f7ef", "metadata": {}, "outputs": [], "source": [ "def estimate_p_A_g_I(N, df_heating):\n", " \"\"\"\n", " Estimates the probability of A given I by randomly picking N rows\n", " from the data frame df_heating.\n", " \n", " Arguments:\n", " N - The number of rows to pick at random.\n", " df_heating - The data frame containing the heating data.\n", " \n", " Returns: The number of rows with A True divided by N.\n", " \"\"\"\n", " rows = np.random.randint(0, df_heating.shape[0], size=N)\n", " df_heating_exp = df_heating.iloc[rows]\n", " df_heating_exp_A = df_heating_exp['hvac'] > 300\n", " df_heating_exp_A_counts = df_heating_exp_A.value_counts()\n", " number_of_A_true = df_heating_exp_A_counts[True] if True in df_heating_exp_A_counts.keys() else 0\n", " p_A_g_I = number_of_A_true / N\n", " return p_A_g_I" ] }, { "cell_type": "markdown", "id": "2d6c1a67", "metadata": {}, "source": [ "Now we can call this function as many times as we want.\n", "Each time we get an estimate of the probability of A given I.\n", "It is going to be a different estimate every time because the rows are selected at random.\n", "Here it is 10 times:" ] }, { "cell_type": "code", "execution_count": 68, "id": "043777ff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 estimate of p(A|I): 0.064\n", "2 estimate of p(A|I): 0.076\n", "3 estimate of p(A|I): 0.058\n", "4 estimate of p(A|I): 0.058\n", "5 estimate of p(A|I): 0.058\n", "6 estimate of p(A|I): 0.062\n", "7 estimate of p(A|I): 0.086\n", "8 estimate of p(A|I): 0.096\n", "9 estimate of p(A|I): 0.070\n", "10 estimate of p(A|I): 0.068\n" ] } ], "source": [ "for i in range(10):\n", " p_A_g_I = estimate_p_A_g_I(500, df_heating)\n", " print('{0:d} estimate of p(A|I): {1:1.3f}'.format(i+1, p_A_g_I))" ] }, { "cell_type": "markdown", "id": "fda2fbe7", "metadata": {}, "source": [ "Alright, every time a different number.\n", "To get a sense of the epistemic uncertainty, we can do it many many times, say 1000 times, and plot a histogram of our estimates.\n", "Like this:" ] }, { "cell_type": "code", "execution_count": 100, "id": "b73224b8", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABEEAAAMXCAYAAADVEUuwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAB7CAAAewgFu0HU+AACDg0lEQVR4nOzdeVyVVeLH8e8VcUFUMExRwX3NBR3Xsk1LS80Mc8tlbGrMLM3KUn9NkdXkTJs5WZOpWWS5NCqpmbhkFm2Ao7agpI4KsrghCrEK9/cHwzMXgcsFLsvl+bxfL1+v5957znkOHEXu957FYrVarQIAAAAAAKjhalV1BwAAAAAAACoDIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCnUruoOAADgKq5cuaLatSv+v87Kug9Kx8zjUh2/9uXLl+uNN94o8NyGDRvUq1evEut+++23+tOf/iRJatCggfbv3y+LxVIh/awomzZt0sKFC0tV57HHHtOsWbMcKpuVlaXt27fr888/17Fjx3T+/Hk1btxYrVq10u2336577rlHTZo0KdX9K6JNACit6vW/GQDAJbz11ltatmyZ3TIWi0X16tWTj4+POnXqpFtuuUVjxoxRnTp1KqmXzpOTk6OPPvpIsbGxevbZZ13+PiidksZl6tSpCg8PlyTt2bNHrVq1quwuVpjq/Hfy8OHDhZ7btWuXQyGIbd0uXbq4XABS0Y4fP6558+YpKiqqwPPnzp3TuXPndODAAa1atUqLFy/WzTffXGVtAkBZEIIAACqE1WpVenq6YmNjFRsbqz179mjVqlV65ZVXHHqTUl2cOXNGDz30kA4fPqx77rnH5e+D0jHzuFT3r72oEGT37t2aN29eqep269bNqf2qCu3atdOgQYNKLNejR48SyyQmJmr69Ok6e/aspLxAu1+/fvL399eFCxf0/fffKyMjQxcuXNAjjzyiFStWlHjvimgTAMqKEAQAUC7du3fXiBEjCj2fnZ2ty5cv6+TJk/ruu++Unp6ukydPasaMGVq7dq3atWtXBb0tvZMnTxb5ZstV74PSMfO4VOevPS0tTTExMcZjb29vXbx4USdOnNDx48fVvn17u/Wvngni6nr16qXnnnvOKW3NmzfPCCtatmypd955p8D3KCkpSU888YS+//57ZWdna+7cudq1a5caNWpUqW0CQFkRggAAyqVjx4564IEH7JY5d+6cZsyYoaioKCUnJ2vx4sVasWJFJfUQqFgfffRRVXfBdI4cOaLc3FxJUv369TVp0iS98847kvKWJNkLQTIyMnTy5EnjcU2YCeIs+/btU0REhCTJ3d1d//znP9W5c+cCZZo0aaJ33nlHo0ePVmxsrJKTk7Vy5Uo98cQTldYmAJQHp8MAACpc06ZN9eqrrxqPv/76a50+fboKewTAldnO5OjUqZOGDRtmPN69e7fdutHR0crJyZGU96a8Q4cOFdNJF/Txxx8b1/fcc0+hsCKfh4eH5syZYzxev369rly5UmltAkB5EIIAACpFhw4d1KZNG+Px0aNHq64zAFza1ctZunbtqpYtW0qSfvrpJ2PpRVFsN+Zs3769S27WXBF+//13ff/998bjwMBAu+XvuOMONWjQQJKUnJxszPao6DYBoLxYDgMAqDS267utVqvdsseOHdO6desUHh6u+Ph4ZWZmytvbW926ddPQoUM1ZswYubu7l3jPsrZT1PGTmzdv1ubNmyXlfaL5t7/9zXgtNzdXoaGh+uKLL/Tzzz/r/Pnzql27tpo0aaKePXtq6NChuvPOO+Xm5lbm+wwZMkRxcXEaPHiwVq1apdDQUL399ts6efKkvL291atXL82aNavAWnur1ao9e/boq6++0sGDB3Xu3DmlpqbKw8NDTZo0Ua9evTRixAjdcsstxX4P808/admypb788kulpqbqgw8+UGhoqE6fPi2r1arWrVvrlltu0dSpU+Xj41PiuDgiISFB69atU1hYmE6fPq3ff//dGLvbb79dY8aMKfHY1soYF3unw+S/1rFjR23btk3p6elav369tm3bplOnTiknJ0ctWrTQsGHDNHXqVHl7ext1Q0NDtWHDBkVHRys5OVlNmzbVgAED9Oc//7nEPS/KM+6l/bufzxnj5SjbICN/OcuQIUP00UcfGV/7pEmTiqxrG6B07drVKf2pCQ4cOKCsrCxJebMyStpEtU6dOgoICNC3334rSfrhhx8KbWZaEW0CQHkRggAAKkV2draxkaHFYil2SnRGRob+9re/ad26dYWCkjNnzujMmTPau3evli9friVLlhT7S7Wz2nFEUlKSHn74YR08eLDA81lZWUpLS9Pp06e1fft2vfPOO1q+fLn8/PzKfK98oaGheuyxx4yvLTExUYmJiXr00UeNMsePH9djjz1W5Kyby5cvGxvXfvbZZ7rxxhu1dOlS41PY4sTExOjBBx/UqVOnCjx/5MgRHTlyRGvWrNFbb72l66+/vlxf3/vvv68333xTmZmZBZ4/e/aszp49q6+++korVqzQsmXL1LFjxyLbqIpxsef48eN65JFHdOLEiQLPHz16VEePHtW2bdv04YcfysvLS0899ZR27dpVoFx8fLw2b96sHTt26J///Gexbw4rYtxL4ozxctSVK1d07Ngx43F+kDF06FBjf5bdu3ebKgS5fPmytm/fruPHjyslJUUNGzZUs2bN9Ic//KHEwCzf8ePHjetOnTo5FFh169bNCCz+85//VEqbAFBehCAAgErx8ccfKzk5WVLem5X8qeu2rly5okcffVTffPON8VzPnj01YMAAeXh46NSpU9qzZ49SUlIUGxurKVOmaOXKlerXr5/T2+nRo4eefvppxcTEaN26dZIKnoRj+0buiSeeMN5oe3t7a8iQIfLz81N2drZOnjypnTt3Kjs7W8ePH9eDDz6obdu2GbNPSnOffJcuXdJzzz1XKNxp166dOnXqJCkv6LnvvvuM73nTpk11yy23qEWLFqpVq5YSEhL0zTffKC4uTpL0zTff6PXXX7d7wkRGRoZmzpypU6dOqU6dOrr99tvVoUMHXbhwQTt37tTZs2eVmpqqGTNm6N1339XgwYOLbcueV199VStXrjQe9+7dW/369VODBg0UHx+vL7/8UufOndPJkyc1ceJEffLJJ0WGapU9LvZcvnxZf/7znxUXF6cmTZpo2LBhat68uWJiYrRt2zZlZWXp1KlTevnll2W1WrVr1y41bNhQw4YNk7+/vxISEvT5558rJSVF6enpevrpp7Vnz55CSzmcMe6l/dqdNV6OOn78uBG21KpVy/g7369fPzVu3FiXLl3Sjz/+qNTUVHl6ehaom5OTUyAcKm0Ism/fPu3bt6/MfS/K3XffXe5jw/fs2aM9e/YU+VqnTp308MMPF3mKly3bcK5FixYO3dfX19e4LiqwqIg2AaC8CEEAABUiNzdXKSkpOnnypP71r3/p008/lZR3POKiRYuKrPP2228bwYWHh4deffVV3XbbbQXKJCUlaf78+fr666+VkZGhxx9/XFu3bi2wjMAZ7XTs2FEdO3bUjz/+aLwRLOoknH//+9/Gmvf27dvrk08+kZeXV4EyMTExuu+++4w3gjt27NBdd91VqvvY+vnnnyVJt9xyi55++mn5+vrq119/1cWLF40yb7zxhvFG+NZbb9XSpUtVt27dAu1cuXJFf/vb34xPzzdv3qz58+cXKpfvwoULunDhgvz8/LR8+fICnzA/+eSTWrBggUJDQ5Wdna3nn39e27dvL/V+C3v27DHeUHt5eWnJkiWFZpU888wzeuWVV7RmzRqlpqZqzpw52rp1a4F7VcW42HPmzBlJ0m233abXXntN9evXN14bPXq0pk+fLknauXOnpLwg4Z133lGTJk2McjNmzND48eN1/vx5nT17Vl9//XWhv9fOGPfSfO3OGq/SsJ3J0aZNG+N7Wbt2bd18883asmWLsrOztW/fPo0cObJA3RMnTig9Pd14XNoQ5Keffiqw0aczdO/evdwhiD2//fabHn/8cX3zzTd68cUXi52Nkf/3RpKuueYah9pu2rSpcX3p0qVKaRMAyouNUQEA5bJ582Z17ty50J+uXbuqf//+Gj9+vDZs2CCr1arbbrtN69atK3LPiKSkJH3wwQfG49dee63QGzwp7yjFt99+W9ddd52kvON3bes5qx1HHTp0yLgeP358oTfakuTv76+5c+dKylsK9Msvv5T6Plfr1KmTli1bpvbt28vDw0P9+vUzTshIT0/Xjh07JEl169bVX//61yKDjdq1a+vpp5829mpJS0srtFTjavXr19eqVasKTbH38PDQG2+8YezPEBsbawRfjrJarVqyZImkvO/T22+/XeSymrp16+rZZ581ZpqcPHlSW7duLVCmqsbFHl9fX73xxhsFAhBJGjRokHr27Gk8rl+/vt56660CAYiUFyBOnjzZeHx1fyty3IvizPEqDXvLWYYOHWpcF3VKjG3dVq1aqWHDhmXuR3XQqlUrzZgxQx988IG++eYb/fzzzzpw4IA+//xzLVy4sMDsi02bNunFF18stq20tDTjul69eg7d3/bv1++//14pbQJAeTETBABQaWJjY/Xdd99pzJgxhV7bu3ev8Qtz//79C7yZuVqdOnX01FNPGZ+eb9y4UY8//rhT23GU7YaaV+89YWvEiBEKCAiQn59fsTMtSmPcuHHFbgybnZ2tZ555RrGxsWrYsKHdT2Dr1Kmjdu3aGX1PSUmxe9/77rtPrVu3LvK12rVr65FHHtEjjzwiKW9Wg+2b9pIcOHDAWKrQv39/9e3b1275WbNmKSwsTJL02WefaezYscZrVTUu9kycOLHYe3Tp0kU//fSTpLw38rafhtvKX/oh5QV+tipy3IvizPEqDXshyI033qg6deooKytLX3/9tbKysgrMOClqQ9XSmD17tmbPnl2GXjvfbbfdpjFjxqhWrYKfadapU0cdOnRQhw4ddO+992revHnau3evJGndunW66667ihwr2/1cHNl0Ov9eRdWvyDYBoLwIQQAA5WK7V4Ct3NxcpaWlKSEhQRERETp9+rSio6M1f/587du3T6+99lqBN6o//PCDcZ0/o8GeQYMGycvLS8nJycZyhjZt2jitHUf179/fuP7iiy90+fJljRs3TjfccEOB03A8PDzUoUMHh9stSUBAQLGvNWrUSOPHj3eondOnTxf4tPbKlSt2y1+9vOBqN910k9zd3ZWdna3IyEhlZGQ4/Amw7XGY+TN07OnRo4dxr0OHDunKlSvGVP+qGpeS+lsc28DC3ptz2w1M80/dyFeR414UZ45XaRw5csS4vjoEadCggQYNGqR9+/YpNTVVP/zwg2666aYi69qeouSKbP8eF8fT01Nvvvmm7r77bp08eVKStGLFiiJDENuALjs726E+2P4dLCrgq4g2AaC8CEEAAOXiyD4Jubm52rhxo55//nlduXJF27dvl7+/f4FZF6dPnzauHV2n36VLFyP0iI2NVZs2bZzWjqO6dOmiu+++W5999pkk6dtvv9W3334rNzc39ejRQzfeeKNuuukm9ejRQxaLxeF2S2J7DKsjzpw5o5MnTyomJkYxMTE6duyYDh8+rISEhALl7B1d7O7uXuKGlnXq1JGfn5/+85//6MqVKzp79qz8/f0d6qPtiR/vv/++3n//fYfqSXmbtiYlJenaa6+VVHXjYk9+34piGwjae3N79af+JXHGuBfHmePlqLi4uAL7RBT1b3zo0KHG5qW7d+8uEILYziIpy0wQV1SvXj39+c9/1jPPPCNJ+vHHHwvNkJHyAsF8GRkZDrVtO1OjqBOGKqJNACgvQhAAQIWrVauWxo0bp8uXL+uVV16RJK1evVr333+/sVeD7QZ6jRs3dqhd230e8t8YOaud0njppZd0zTXXKDg42PhEPScnRwcPHtTBgwf11ltvqXnz5ho9erQeeOCBIvenKC1HPgW+cOGCVq5cqa1bt+rcuXPFlnNzc1NOTo5D93Tkk3vb7/v58+cdDkHKuwni5cuXC7ypropxscfRGTG2gUhZOHvci+Ps8XKEbYjRtGnTIpf8DBkyREFBQbJarfryyy+1aNEiWSwWJSYmFtg8uKYcj+sI2+OU09PTFRcXp7Zt2xYoY/v3/8KFCw61a/v3q6iftxXRJgCUFyEIAKDSTJo0ScuWLVNaWpoyMzP13XffGUtpbD+JdvST+dzcXOM6/xNyZ7VTGnXq1NH8+fM1ffp0ffHFF9qzZ48OHDhQYPp3YmKi3nvvPW3YsEEffPBBud+AlRRG7N+/X7NmzSoQCuX3tU2bNurUqZMCAgJ0ww03KCgoSOHh4eW+Zz7bN9aO7gNwdb3AwMBSL1O5eiPRqhgXeypjxklFjHtxnD1ejnBkJkfTpk3Vq1cvHTx4UOfOndOhQ4cUEBBQYD8Qb29vNW/evNT3r65H5Jbk6j1mrv77IalAKBIfH+9Qu7Yzitq1a1cpbQJAeRGCAAAqjYeHh/z9/Y11+bZLV2w/MbT9tNYe23L5pzw4q52yaNasmaZPn67p06crLS1NkZGR+v777/Xll18a6/GTk5P12GOPaceOHWUKXBxx8eJFzZ4923ij061bN02ZMkW9e/dW69atC800sD0y1B5HN8+0nSFQmk/6bWe3BAQEaMKECQ7Xtae6jEtFq6hxL05FjZc9tkGGvcBq6NChxqavu3fvVkBAgN0NVR3likfkSoXH+uoTiiQVOPHpt99+c2jPFtvxKCqwqIg2AaC8XPN/eQCAy7J9g2m76Z3tkgnbzQuLY7VaFR0dbTz28/Nzajvl5eHhoZtuuknz589XaGio3nzzTWNWxKlTp+yeWFJen376qTH1/LrrrtP69es1duxYtWvXrsilFranjNjbGyItLU2JiYl2752enq7Y2FhJed8DeyeUXM32e59/UkpJHA268lXluFS0ihr34lTGeF3N0Y1Nizoq1xkhiKuyDRakosPJ3r17G/uEpKWllXhkdFZWVoF/LwMHDqyUNgGgvAhBAACVJjMz0/jkXZJatmxpXNueVhAaGlpiW999950uX74sKW9aff6xrc5qJ19JSxgWL16sCRMmqF+/fjpz5kyx5e68804NGDDAeHx1mODMpRKHDh0yrseMGVNoA0Rbp0+fVlxcnPHYdmlQUb7++mu7r+/du9do4+abby7V6R+2Y7d79+4SZyocPnxYAwcOVO/evTV27NgCJ5xUx3GpaM4e95K+dmeOlyMuXbpUYEmFvSCjffv2xlKMEydO6Pjx404JQWbPnq3o6Gin/gkMDCxTX0pj06ZNxnX79u2LXIqUf7JOUXWKsnPnTv3++++S8vbu6NevX6W0CQDlRQgCAKg0GzduNI7lrF+/vq6//nrjteHDhxsnCURERGjPnj3FtpOdna3XX3/deDxy5EjjDZuz2slnO3OlqE0kY2NjdfDgQV2+fFlbt24t9l5SwY0BmzVrVqr7lIbtEZMlffL+t7/9rcDjkt6Yrlq1qthTHrKysvTPf/7TeFzU0cn2DBo0yNinITk5WW+//bbd8vljl5aWplatWhUIXKrjuFQ0Z497SV+7M8fLEbazGRo0aFAosLya7WyQkJCQAsvvXP1kmPygwBG7du0q8G9g9OjRxZa97777jOtNmzbp6NGjRZZLT0/XP/7xD+PxhAkTih3PimgTAMqDEAQAUCm+/PJLvfrqq8bj8ePHFzg+sXHjxpo2bZrxeN68ecY0dlvJycmaPXu2fv31V0mSj4+PHn74Yae3k8/T09O4tv3kPN/YsWON66VLlxa7aeIHH3xgfBLt6+urnj17luo+pWG7TGDt2rU6depUoTIXL17U3LlztWvXrgLPl/Rp/smTJzVnzhxj9ky+lJQUzZkzR7/99pskqX///rr99ttL1W93d3fNmjXLeLxixQotW7as0Bv0zMxMvfTSS/rmm28k5W3YevXYVcdxqWjOHveSvnZnjpcjbGdydO7cucSZKrYhyJo1a4zrevXqleoY7OooNDRU48aN02effabU1NQiy6Smpurtt9/W3LlzjeVOvr6+BX4+Xu2WW24xZvhkZ2froYceKrBcUMr7O/TII48Yf7+8vLz05z//uVLbBIDyIF4FAJTL0aNHtWrVqiJfu3LlipKSkhQeHl7gU9z27dtrzpw5hcrPnj1bBw4c0I8//qi0tDQ98sgj6tWrlwYMGCAPDw+dOnVKe/bsMd6A16lTR6+++mqhfSec1Y6Ut2THYrHIarVq//79euqpp9SxY0dde+21GjNmjIYOHaobb7xR33zzjbKysjRjxgz17t1b3bt3V9OmTXXp0iVFREQYeyZYLBYtWLCg0KkpJd2nNMaPH68PP/xQmZmZunjxokaNGqVhw4apbdu2ysrK0n/+8x/t27fPmDng7u5unJhS1KkRttzd3bVv3z4NGzZMw4cPl6+vrxISEhQaGmrMPrjmmmv0wgsvlGkpyYQJExQZGaktW7ZIkt566y2FhITolltu0TXXXKOEhATt3btXZ8+eNeo8+eSThfaHqI7jUtGcPe6OfO3OGi9HlHY5S0BAgHx8fHT+/HljBpqUF6CU9xji6uCnn37S008/LXd3d7Vr105t27ZVo0aNdOXKFSUkJOjgwYMFwq3GjRvrvffeKxA+F+X111/Xvffeq3PnzikuLk5jxoxRv3795Ofnp6SkJH3//fdGu7Vr19abb75Z4pHdFdEmAJQVIQgAoFx++eWXEje7s3XjjTdq8eLFBT5lzle7dm2tXLlSixYt0saNG2W1WnXo0KECex3ka9Omjd58880i3ww5qx0p77SYkSNHatu2bZJkvNnr3Lmz8UbwzTff1GOPPaawsDBJ0oEDB3TgwIFCbXl6euqZZ57RHXfcUab7OMrPz0+vv/665s2bp4yMDGVlZRnt2rJYLBo/fryuu+46Pffcc5JkzIwpzuLFi/XSSy/p4sWLWrduXaHXO3XqpH/+859q1apVqfps6+9//7tatGihVatWKTs7W7Gxsfroo48KlatXr57mzZunqVOnFtlOdRuXiubscXf0a3fWeJWktCFIrVq1dOutt+rTTz8t8HxZApjqLDs729hfpDgDBw7Uyy+/XGAfpuI0b95cH374oZ588kkdPnxYubm5+vHHH/Xjjz8WKNekSRMtXry4wJ4fldkmAJQVIQgAoEJYLBbVq1dPnp6eatOmjbp3764777yzxKMg69Spo7/+9a+aMmWKNm7cqB9//FEJCQlKT0+Xl5eXrrvuOg0fPlx33XWX3Y0fndWOlPfG38/PT9u3b1diYqLq1aun2rVry2q1ymKxyNPTU6tWrdK+ffu0detW/fzzzzp79qyysrLk7e0tf39/3XLLLQoMDJSPj0+Z71Mat99+u7Zs2aIPP/xQ33//veLj45WTk6MGDRrI399fvXr10tixY9W1a1edOXNGtWrVUm5urnbv3q2//OUvRR6hKeWd9vD5559r1apV2rNnjxISElSvXj117dpVd911l8aMGVNoNkVp1apVS48//rjuvfdebdiwQd99951Onz6t1NRUeXh4qE2bNrr++us1YcIEtWjRoth2quO4VDRnj7sjX7uzxsuezMxMnThxwnjsaJAxdOjQQiFITTgZZtSoUWrdurUOHjyogwcPKiYmRsnJyUpOTlZubq4aNWokPz8/9e7dWyNGjFCPHj1K1X779u21YcMGbd++Xdu2bdOxY8d0/vx5o93bbrtNY8eOLXKD1cpsEwDKwmIty5loAADANKZOnarw8HBJ0p49e8o1ywMAAKAqsTEqAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApsARuQAAAAAAwBSYCQIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTqF3VHYBrSEhI0Jdffmk89vf3V/369auwRwAAAACAmiw9PV0xMTHG4yFDhsjX17dcbRKCwCFffvmlXnjhharuBgAAAADAxCZPnlyu+iyHAQAAAAAApkAIAgAAAAAATIHlMHCIn59fgcfPPfecOnfuXEW9AQAAAADUdNHR0QW2Zbj6fWlZEILAIR4eHgUed+7cWX379q2i3gAAAAAAzObq96VlwXIYAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAU2BjVBvnz5/X2rVrFRYWphMnTigtLU2enp7q2LGjhg4dqvHjxxe7Ecu+ffs0Y8YMh+4zePBgrVq1qsjXcnNztXnzZoWEhCg6OlppaWlq2rSp+vTpo4kTJ6pfv35l/voAAAAAADAzQpD/2r17txYsWKCUlJQCz1+8eFHh4eEKDw9XcHCw3n77bXXt2rVQ/SNHjpS7DykpKZo1a5bCw8MLPB8fH6/4+Hh9/vnnmj59uhYsWFDuewEAAAAAYDaEIJLCw8M1d+5cZWdny93dXePHj9ctt9wiLy8vJSQkaPPmzdq7d6/i4uL0pz/9SZs2bZKvr2+BNqKioiRJPj4+Wrlypd37eXp6FnrOarVq7ty5RgAyePBgTZo0ST4+Pjp8+LBWrFihuLg4rV69Wk2aNHF41gkAAAAAAMhj+hDEarVq0aJFRgCyatUqDRgwwHi9Z8+eGj58uN5++2394x//UFJSkl577TW9/vrrBdo5fPiwJKlbt25FzhQpydatWxUWFiZJCgwM1OLFi43XAgICdOedd2ry5Mk6duyYli1bptGjR6t58+Zl+ZIBAAAAADAl02+MevDgQR07dkySNHHixAIBiK1Zs2apU6dOkqSdO3cqLS3NeC01NVUxMTGS8kKQsli9erWkvFki8+fPL/S6l5eXFi1aJEnKzMxUcHBwme4DAAAAAIBZmT4EiYiIMK6HDh1abDmLxaIbbrhBkpSVlaX//Oc/xmtHjhyR1WqVpDLNAomNjTWW09x6663y8vIqslzfvn3Vtm1bSdKOHTtKfR8AAAAAAMzM9CFIz549NXPmTN1zzz1GwFCc/KBDypuNkS8/wJCk6667rtR92L9/v3E9cOBAu2X79+8vSYqLizNmnwAAAAAAgJKZfk+QgQMHlhg85Pvxxx+N65YtWxrX+fuBNGzYUDk5OVq8eLHCwsIUGxur2rVrq3Xr1ho6dKimTZumRo0aFWo3fzmOJLVp08ZuH/z8/Izro0ePyt/f36G+AwAAAABgdqYPQRy1b98+I+zo1KlTgU1J82eCZGdna9SoUcrOzjZey8zMVFRUlKKiorRmzRq99dZb6tevX4G2ExMTjesWLVrY7YftqTS29QAAAAAAgH2EIA5ISkpSUFCQ8fiBBx4wrrOysnT8+HFJUkZGhho2bKjp06drwIABatSokU6cOKGNGzcqPDxcFy9e1AMPPKBPPvlE3bt3N9q4dOmScd2gQQO7ffHw8DCuU1JSSvV1xMfHKz4+vlR18kVHR5epHgAAAAAA1QUhSAl+//13Pfzww0pISJCUtyfH6NGjjdePHj1qzPxo06aNVq1apVatWhmv9+rVS2PGjNHrr7+u9957T5mZmXr66ae1bds21aqVtyVLVlaWUb5evXp2+2P7um09R2zcuFHLli0rVR0AAAAAAGoKQhA7UlJSNGPGDB08eFCS1Lx5c73xxhtGeCFJXbp00a5du3T69Gn5+/sXCEBsPfHEE4qIiNCBAwd0/PhxffXVVxoyZIgkyc3NzShnsVjs9sl2c1bbfgAAAAAAAPt4F12Ms2fPaurUqfr3v/8tSfLx8dH777+vpk2bFijn5uYmf39/XX/99cUGIFJeuDFhwgTj8XfffWdc2y5xycjIsNsv21Np6tSp49gXAwAAAAAAmAlSlCNHjuihhx4yNh5t3ry53n//fbVv375c7Xbt2tW4jouLM65t9wFJT08v8gSZfGlpacZ148aNS3X/sWPHatCgQaWqky86OlovvPBCmeoCAAAAAFAdEIJcZd++fZo7d64RNrRr104rV64scCRuWRW3n4dt2wkJCWrWrFmxbeTvTSLJbrmitGjRosTTZwAAAAAAqKlYDmNj8+bNmjVrlhGA9OnTR2vXrrUbgERFRWnnzp1au3at0tPT7bZ/4cIF49rHx8e47tixo3EdExNjt43Y2FjjukOHDnbLAgAAAACA/2EmyH9t2rRJ//d//2dsPHrnnXfqlVdeKXHfjRUrVmj79u2S8k6HsbfcZP/+/cZ1z549jeuAgABZLBZZrVZFRkYWOH3mauHh4ZIkX19fu3uQAAAAAACAgpgJIikiIkJ/+ctfjABkypQpWrJkiUMbjw4cONC4DgkJKbZcenq61q1bJ0lyd3fXsGHDjNd8fX0VEBAgSQoNDVVqamqRbURGRurEiROSpOHDh5fYNwAAAAAA8D+mD0FSU1P11FNPKScnR1Le5qHPPvtsiUfV5hsxYoS8vLwkSVu2bNHu3bsLlcnOztb8+fONzVDvu+++QqfMTJ06VZKUnJysoKAg5ebmFnj90qVLCgoKkpQXokyZMsXxLxIAAAAAALAcZs2aNcZmo02bNtX48eN1+PDhEuv5+vrKy8tLDRs2VFBQkJ544gnl5uZqzpw5GjdunIYNGyZPT0/99ttvCg4O1m+//SYpbxnM448/Xqi9kSNHatOmTQoLC9O2bduUmJioadOmqVmzZoqOjtby5cuNEGX27Nny8/Nz4ncBAAAAAICaz/QhSP4SFUk6d+6cJkyY4FC9xYsXKzAwUFLebJCsrCw9//zzxrIX23bzDR48WEuWLFH9+vWLbHPp0qWaOXOmIiIiFBkZqcjIyEJlpk+frhkzZjjURwAAAAAA8D+mDkGSkpIKHDlbHmPGjNGAAQP08ccfKywsTDExMcrKypKPj4969uypu+++W0OHDrXbhqenp4KDgxUSEqItW7boyJEjSklJkbe3t3r37q3JkycX2IMEAAC4lpxcqy5ezqjqbrg870b15FbLsaXLAADYMnUI0qRJE0VHRzutPV9fX82bN0/z5s0rcxu1atVSYGCgMcsEAADUHBcvZ+j+F3dWdTdc3upnh8nHq+iZtQAA2GP6jVEBAAAAAIA5EIIAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCkQggAAAAAAAFMgBAEAAAAAAKZACAIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCkQggAAAAAAAFMgBAEAAAAAAKZACAIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCkQggAAAAAAAFMgBAEAAAAAAKZACAIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCkQggAAAAAAAFMgBAEAAAAAAKZACAIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADCF2lXdgerk/PnzWrt2rcLCwnTixAmlpaXJ09NTHTt21NChQzV+/Hh5eHgUWz83N1ebN29WSEiIoqOjlZaWpqZNm6pPnz6aOHGi+vXrV2IfnNEGAAAAAAAojBDkv3bv3q0FCxYoJSWlwPMXL15UeHi4wsPDFRwcrLfffltdu3YtVD8lJUWzZs1SeHh4gefj4+MVHx+vzz//XNOnT9eCBQuK7YMz2gAAAAAAAEUjBJEUHh6uuXPnKjs7W+7u7ho/frxuueUWeXl5KSEhQZs3b9bevXsVFxenP/3pT9q0aZN8fX2N+larVXPnzjXCi8GDB2vSpEny8fHR4cOHtWLFCsXFxWn16tVq0qSJZsyYUagPzmgDAAAAAAAUz/R7glitVi1atMgIQFatWqXnnntON910k3r27Knhw4fr3Xff1Zw5cyRJSUlJeu211wq0sXXrVoWFhUmSAgMDtWrVKt12220KCAjQpEmTtGnTJnXo0EGStGzZMiUmJhbqhzPaAAAAAAAAxTN9CHLw4EEdO3ZMkjRx4kQNGDCgyHKzZs1Sp06dJEk7d+5UWlqa8drq1aslSZ6enpo/f36hul5eXlq0aJEkKTMzU8HBwYXKOKMNAAAAAABQPNOHIBEREcb10KFDiy1nsVh0ww03SJKysrL0n//8R5IUGxurqKgoSdKtt94qLy+vIuv37dtXbdu2lSTt2LGjwGvOaAMAAAAAANhn+hCkZ8+emjlzpu655x4jYCiO1Wo1rjMzMyVJ+/fvN54bOHCg3fr9+/eXJMXFxSkmJsZ43hltAAAAAAAA+0y/MerAgQNLDB7y/fjjj8Z1y5YtJclYSiNJbdq0sVvfz8/PuD569Kj8/f2d1gYAAAAAALDP9DNBHLVv3z4dPnxYktSpUyc1b95ckgpsUNqiRQu7bdieKGNbzxltAAAAAAAA+0w/E8QRSUlJCgoKMh4/8MADxvWlS5eM6wYNGthtx8PDw7hOSUlxahuOiI+PV3x8fKnq5IuOji5TPQAAAAAAqgtCkBL8/vvvevjhh5WQkCApb0+O0aNHG69nZWUZ1/Xq1bPblu3rtvWc0YYjNm7cqGXLlpWqDgAAAAAANQXLYexISUnRgw8+qIMHD0qSmjdvrjfeeEO1av3v2+bm5mZcWywWu+3Zbqzq7DYAAAAAAIB9vIsuxtmzZzV16lT9+9//liT5+Pjo/fffV9OmTQuUs12ekpGRYbfN/BNlJKlOnTpObQMAAAAAANjHcpgiHDlyRA899JCx8Wjz5s31/vvvq3379oXK2u7hkZ6erkaNGhXbblpamnHduHFjp7bhiLFjx2rQoEGlqpMvOjpaL7zwQpnqAgAAAABQHRCCXGXfvn2aO3euETa0a9dOK1euNI7EvZrt8wkJCWrWrFmxbefvKyKpQDlntOGIFi1alHj6DAAAAAAANRXLYWxs3rxZs2bNMgKQPn36aO3atcUGIJLUsWNH4zomJsZu+7GxscZ1hw4dnNoGAAAAAACwjxDkvzZt2qSFCxfqypUrkqQ777xTH374oby8vOzWCwgIMDYzjYyMtFs2PDxckuTr66tWrVo5tQ0AAAAAAGAfIYikiIgI/eUvfzFOXpkyZYqWLFni0Majvr6+CggIkCSFhoYqNTW1yHKRkZE6ceKEJGn48OFObwMAAAAAANhn+hAkNTVVTz31lHJyciTlbR767LPPlnhUra2pU6dKkpKTkxUUFKTc3NwCr1+6dElBQUGSJHd3d02ZMqVC2gAAAAAAAMUz/caoa9asMTYbbdq0qcaPH6/Dhw+XWM/X19dYKjNy5Eht2rRJYWFh2rZtmxITEzVt2jQ1a9ZM0dHRWr58ueLi4iRJs2fPlp+fX6H2nNEGAAAAAAAonulDkHXr1hnX586d04QJExyqt3jxYgUGBhqPly5dqpkzZyoiIkKRkZFF7u0xffp0zZgxo9g2ndEGAAAAAAAomqlDkKSkpAJHzpaHp6engoODFRISoi1btujIkSNKSUmRt7e3evfurcmTJ2vgwIEV3gYAAAAAACiaqUOQJk2aKDo62mnt1apVS4GBgQVmiFRFGwAAAAAAoDDTb4wKAAAAAADMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFEx9OgwAACheTq5VFy9nVHU3aoRrGteTxWKp6m4AAGB6hCAAAKBIFy9n6P4Xd1Z1N2qEkFdHy40MBACAKsdyGAAAAAAAYAqEIAAAAHApjT3rVnUXAAAuihAEAAAALqVWLdYWAQDKhj1BAAAA4JLYvNd5vBvVkxvhEgATIAQBAACAS2LzXudZ/eww+XjVr+puAECFYzkMAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCkQggAAAAAAAFMgBAEAAAAAAKZACAIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCkQggAAAAAAAFMgBAEAAAAAAKZACAIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAAplC7qjsAAIAz5ORadfFyRlV3o0a4pnE9WSyWqu4GAACA0xGCAABqhIuXM3T/izuruhs1Qsiro+VGBgIAAGoglsMAAAAAAABTIAQBAAAAAACmQAgCAAAAAABMgRAEAAAAAACYAiEIAAAAAAAwBUIQAAAAAABgCoQgAAAAAADAFAhBAAAAAACAKRCCAAAAAAAAUyAEAQAAAAAApkAIAgAAAAAATIEQBAAAAAAAmAIhCAAAAAAAMAVCEAAAAAAAYAqEIAAAAAAAwBQIQQAAAAAAgCkQggAAAAAAAFMgBAEAAAAAAKZACAIAAAAAAEyBEAQAAAAAAJgCIQgAAAAAADAFQhAAAAAAAGAKhCAAAAAAAMAUCEEAAAAAAIApEIIAAAAAAABTIAQBAAAAAACmULuqO1CdPfvss9qwYYNmzpypxx9/vNhy+/bt04wZMxxqc/DgwVq1alWRr+Xm5mrz5s0KCQlRdHS00tLS1LRpU/Xp00cTJ05Uv379yvR1AAAAAAAAQpBi7dq1Sxs2bHCo7JEjR8p9v5SUFM2aNUvh4eEFno+Pj1d8fLw+//xzTZ8+XQsWLCj3vQAAAAAAMCNCkCLs27fP7syPq0VFRUmSfHx8tHLlSrtlPT09Cz1ntVo1d+5cIwAZPHiwJk2aJB8fHx0+fFgrVqxQXFycVq9erSZNmjg86wQAAAAAAPwPIchVPvjgA7322mvKzs52uM7hw4clSd26dVPXrl1Lfc+tW7cqLCxMkhQYGKjFixcbrwUEBOjOO+/U5MmTdezYMS1btkyjR49W8+bNS30fAAAAAADMjI1R/+vkyZOaOXOmFi9erOzsbLm5uTlULzU1VTExMZLyQpCyWL16taS8WSLz588v9LqXl5cWLVokScrMzFRwcHCZ7gMAAAAAgJkRgkj6+OOPNWrUKO3du1eS1KFDByN0KMmRI0dktVolqUyzQGJjY43lNLfeequ8vLyKLNe3b1+1bdtWkrRjx45S3wcAAAAAALMjBJH0888/Kzs7W3Xq1NFDDz2kTZs2yd/f36G6+QGGJF133XWlvvf+/fuN64EDB9ot279/f0lSXFycMfsEAAAAAAA4hj1BJNWtW1fjxo3Tww8/rJYtW5aqbv5+IA0bNlROTo4WL16ssLAwxcbGqnbt2mrdurWGDh2qadOmqVGjRoXqHzt2zLhu06aN3Xv5+fkZ10ePHnU4qAEAAAAAAIQgkqSgoCDVqlW2STH5M0Gys7M1atSoAhuqZmZmKioqSlFRUVqzZo3eeust9evXr0D9xMRE47pFixZ27+Xr61tkPQAAAAAAUDJCEKnMAUhWVpaOHz8uScrIyFDDhg01ffp0DRgwQI0aNdKJEye0ceNGhYeH6+LFi3rggQf0ySefqHv37kYbly5dMq4bNGhg934eHh7GdUpKSqn7Gx8fr/j4+FLXk6To6Ogy1QMAAAAAoLogBCmHo0ePGjM/2rRpo1WrVqlVq1bG67169dKYMWP0+uuv67333lNmZqaefvppbdu2zQhesrKyjPL16tWzez/b123rOWrjxo1atmxZqesBAAAAAFATEIKUQ5cuXbRr1y6dPn1a/v7+BQIQW0888YQiIiJ04MABHT9+XF999ZWGDBkiSQWO4rVYLHbvl38KjVT22SsAAAAAAJgV76TLwc3NTf7+/rr++uuLDUCkvHBjwoQJxuPvvvvOuLZd4pKRkWH3fpmZmcZ1nTp1ytJlAAAAAABMi5kglaRr167GdVxcnHFtuw9Ienp6kSfI5EtLSzOuGzduXOo+jB07VoMGDSp1PSlvT5AXXnihTHUBAAAAAKgOCEEqSXH7edgeyZuQkKBmzZoV20ZCQoJxba9ccVq0aFHiCTQAAAAAANRULIcph6ioKO3cuVNr165Venq63bIXLlwwrn18fIzrjh07GtcxMTF224iNjTWuO3ToUNruAgAAAABgaswEKYcVK1Zo+/btkvJOh7G31GT//v3Gdc+ePY3rgIAAWSwWWa1WRUZGavTo0cW2ER4eLkny9fW1uwcJAAAAAAAojJkg5TBw4EDjOiQkpNhy6enpWrdunSTJ3d1dw4YNM17z9fVVQECAJCk0NFSpqalFthEZGakTJ05IkoYPH17OngMAAAAAYD6VGoJEREQoIiJCZ86cKXXd48eP68MPP9S7775bAT0rmxEjRsjLy0uStGXLFu3evbtQmezsbM2fP9/YDPW+++5T06ZNC5SZOnWqJCk5OVlBQUHKzc0t8PqlS5cUFBQkKS9EmTJlirO/FAAAAAAAarxKDUGmTp2qadOmGUtISiM0NFSLFy82ZlRUBw0bNlRQUJAsFotyc3M1Z84cBQUF6dtvv9WhQ4f06aefKjAwUKGhoZLylsE8/vjjhdoZOXKkBg8eLEnatm2bpk6dqtDQUB08eFDr16/XPffco2PHjkmSZs+eLT8/v8r7IgEAAAAAqCFcZk+Q7OxsSVJSUlIV96SgESNGKCsrS88//7yx7KWooGbw4MFasmSJ6tevX2Q7S5cu1cyZMxUREaHIyEhFRkYWKjN9+nTNmDHD6V8DAAAAAABm4PQQJCcnRwcOHJDVai22TExMjCIiIhxuLy4uTp988omkvNkX1c2YMWM0YMAAffzxxwoLC1NMTIyysrLk4+Ojnj176u6779bQoUPttuHp6ang4GCFhIRoy5YtOnLkiFJSUuTt7a3evXtr8uTJBfYgAQAAAAAApeP0EMTNzU3BwcHatWtXka9brdZiZ0uUxGKx6A9/+EN5u+iQAQMGKDo62uHyvr6+mjdvnubNm1fme9aqVUuBgYEKDAwscxsAAAAAAKBoFbInyDPPPKP69evLarUW+JPv6ucd/dOoUSPNnTu3IroMAAAAAABquArZE6RZs2Z66aWX9M033xR4fvPmzbJYLLruuuvUsWNHh9pyc3OTp6enWrVqpTvuuEM+Pj4V0WUAAAAAAFDDVdjGqCNGjNCIESMKPLd582ZJeaeh3H///RV1awAAAAAAgEIq9XSYfv36SZKaN29embcFAAAAAACo3BDko48+qszbAQAAAAAAGCpkY1QAAAAAAIDqplJngtjKzs7WTz/9pPPnzyszM1O5ubkO1x0zZkzFdQwAAAAAANRIlR6CXLlyRW+99ZbWrFmjtLS0Ute3WCyEIAAAAAAAoNQqPQSZM2eO9u7dK6vVWtm3BgAAAAAAJlapIcju3bv15ZdfymKxSJL8/PzUt29fNWnSRPXr16/MrgAAAAAAAJOp1BAkJCTEuH7ooYc0d+5cIxABAAAAAACoSJUaghw6dEgWi0Vdu3bV448/Xpm3BgAAAAAAJlepR+QmJydLkm688cbKvC0AAAAAAEDlhiDe3t6SpHr16lXmbQEAAAAAACo3BOnUqZMk6dixY5V5WwAAAAAAgMoNQUaNGiWr1aovv/xS586dq8xbAwAAAAAAk6vUEOTuu+9W3759lZ6errlz5+ry5cuVeXsAAAAAAGBilXo6jMVi0bJlyzRr1izt379ft99+u+644w716tVLPj4+ql+/vkPt9OvXr4J7CgAAAAAAappKDUF69eolScrNzZXFYtGlS5e0YcMGbdiwweE2LBaLoqKiKqqLAAAAAACghqrUECQzM7PQc1artTK7AAAAAAAATKpSQ5B77rmnMm8HAAAAAABgqNQQZPHixZV5OwAAAAAAAEOlng4DAAAAAABQVQhBAAAAAACAKRCCAAAAAAAAU6jUPUGmTZtW7jYsFos+/PBDJ/QGAAAAAACYSaWGIOHh4bJYLGWqm3+UblnrAwAAAAAAc6vUEET6X5hRGhaLRX5+fqpXr14F9AgAAAAAAJhBpYYge/bsKbGM1WpVZmamzp07p59//lkff/yxEhMT1bhxY7333ntq0qRJJfQUAAAAAADUNJUagrRs2dLhsu3bt9fAgQM1efJkPfTQQ4qMjNTs2bO1Zs0alsQAAAAAAIBSq/anw3h4eOjNN99U3bp19e9//1ufffZZVXcJAAAAAAC4oGofgkjSNddco6FDh8pqtSokJKSquwMAAAAAAFyQS4QgktSuXTtJ0rFjx6q4JwAAAAAAwBW5TAiSmpoqSUpJSaningAAAAAAAFfkEiFIbm6uvvzyS0l5S2MAAAAAAABKq9qHIL///rsWLlyoU6dOyWKxaMCAAVXdJQAAAAAA4IIq9YjchQsXOlw2KytLSUlJOnTokNLT043nJ06cWBFdAwAAAAAANVylhiCbN2+WxWIpdT2r1SpJmj59unr16uXsbgEAAAAAABOo1BBE+l+gURrt27fX9OnTNW7cuAroEQAAAAAAMINKDUGCg4MdLlurVi3Vq1dP1157ra699toK7BUAAAAAADCDSg1B+vfvX5m3AwAAAAAAMFT702EAAAAAAACcodL3BClKTEyMYmNjdenSJVksFjVq1Eh+fn7y9/ev6q4BAAAAAIAaospCkEuXLumDDz7Qxo0bde7cuSLLNGnSRKNGjdJDDz2kJk2aVHIPAQAAAABATVIly2EiIyM1atQovfvuuzp37pysVmuRfy5cuKDg4GCNHj1aP/zwQ1V0FQAAAAAA1BCVPhPkl19+0YMPPqjMzEzjuFwvLy916dJFXl5eys3N1cWLFxUdHa3Lly/LarXq/Pnzeuihh7RhwwZ17ty5srsMAAAAAABqgEoNQa5cuaLHH39cGRkZkqRu3brpqaee0qBBg4os/+233+qNN97Qr7/+qszMTM2dO1dbt25V7drVYisTAAAAAADgQip1OUxISIhiY2NlsVh08803a/369cUGIJJ0ww03aP369brlllskSSdPntS2bdsqqbcAAAAAAKAmqdQQZPfu3ZKkhg0b6u9//7vc3d1LrFO7dm39/e9/V6NGjSRJO3bsqNA+AgAAAACAmqlSQ5DDhw/LYrFo6NCh8vLycrhe48aNNXToUFmtVv3yyy8V10EAAAAAAFBjVWoIcvHiRUlS69atS103v05ycrIzuwQAAAAAAEyiUkOQunXrSpLS0tJKXTe/joeHh1P7BAAAAAAAzKFSQ5AWLVrIarXqxx9/LHXd/DrNmzd3drcAAAAAAIAJVGoI0r9/f0nSTz/9pC+//NLhenv27NGhQ4dksVg0YMCAiuoeAAAAAACowSo1BJk4caIsFosk6amnntJXX31VYp29e/fq6aefliRZLBaNHTu2IrsIAAAAAABqqNqVebP27dtrwoQJWrdundLS0vTwww+rX79+Gj58uLp06WKcGHPx4kVFR0drx44dioyMlNVqNQKQLl26VGaXAQAAAABADVGpIYgkLVy4UKdPn1ZYWJgsFosiIiIUERFRbHmr1SpJGjBggJ577rnK6iYAAAAAAKhhKnU5jJR3Qszy5cv18MMPq379+rJarXb/1K9fXzNnztSq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KW/aZ/4bLntr1ms6VxjToly+fNn4JXvSpEmmnqJbFFca1/x+duvWrVT3NxtXGdPPPvtMklSvXj3Nnj272HsNHz5cY8aM0fTp09WyZctS9bMmcZVxtcdqterZZ59Vdna2JGnRokXy8PAoVR9rElcZ0wsXLhjXbdq0KfZe+X3Mzs423oiZjSuM6eHDh5WcnCxJGjJkiPz8/Iq919ixYyXl/c6cf18zqoxxlaRTp07pjjvu0Ouvv67MzEzVrVtXL7/8snx9fR2qX9E/w1E8QhBIytvFON/AgQPtlu3fv78kKS4uzkg8S3LlyhUdOnRIktSrVy+7v0TZ7tL83XffGde1a9fW4sWLtXHjRv3zn/8stn5qaqouX74sSabeGNUVxrQoL774os6ePauWLVsaayTxP64yrikpKcanUIQg9rnCmObm5hrrqq+//no1adKk2DZatmypv//971q4cKGpN1x0hXEtyb/+9S/jHnfccYduuOEGh+vWRK4ypra/+/znP/8pto3812rXrm3a2XquMKa2e6OVtLdWhw4djOsDBw441MeaqKLHNV9iYqIxPv3799dnn31mBFElqYyf4SgeIQgkSceOHTOu7X1qIKlAAn306FGH2j916pTxSVJJ7fv7+xfZL0e9+eabxr1GjBhR6vo1hSuO6e7du7VlyxZZLBb99a9/VYMGDRzqi5m4yrgePnzYONWnXbt2+uSTTzR16lT1799f3bt316233qr58+fr559/dqhfNZkrjOnJkyeVnp4uqfAv4ZcuXdLx48eNDVGRxxXG1Z709HT94x//kCTVqVOHUFquM6aDBw82Nk/84IMPijym/LPPPjOOOR42bJjc3d0d6mNN4wpjmpWVZVyXNBPLdhxPnjzpUB9roooe13wWi0W9e/fWu+++q48++siYVeKIynxvhMLMuQ0/CklMTDSuW7RoYbes7RQv23r2nDlzpsj6RbnmmmtUp04dZWVlOdR+Tk6Ozp07p59//lkffPCBMU1s8ODBuvfeex3qX03kamOalJSkoKAgSdLEiRM1aNAgh/phNq4yrvnTUCXp+eefV2pqaoHX4+PjFRISos8++0wPPPCAnnzySYfX0NY0rjCmtr90tWjRQrm5uVq3bp3Wrl2r3377zXjNz89PkydP1pQpU0z7piqfK4yrPevXr9fZs2clSffcc4/dKfhm4Spj2rRp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\n", "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2021-07-02T15:51:15.597494\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.3.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 395, "width": 544 } }, "output_type": "display_data" } ], "source": [ "# A place to store the estimates\n", "p_A_g_Is = []\n", "# The number of rows we sample every time\n", "N = 500\n", "# Put 1000 estimates in there\n", "for i in range(1000):\n", " p_A_g_I = estimate_p_A_g_I(N, df_heating)\n", " p_A_g_Is.append(p_A_g_I)\n", "# And now do the histogram\n", "fig, ax = plt.subplots()\n", "ax.hist(p_A_g_Is)\n", "ax.set_xlabel('$p(A|I)$')\n", "ax.set_ylabel('Count')\n", "ax.set_title('Bootstrap estimate $N = {0:d}$'.format(N));" ] }, { "cell_type": "markdown", "id": "3fbb0238", "metadata": {}, "source": [ "So looking at this, we can say that the $p(A|I)$ is around 7%, but it could be as low as 5% or as high as 9%. \n", "This way of estimating the uncertainty of statistics by resampling the data is called [bootstrapping](https://en.wikipedia.org/wiki/Bootstrapping_(statistics))." ] }, { "cell_type": "markdown", "id": "536ae1c6", "metadata": {}, "source": [ "### Questions\n", "\n", "+ Rerun the bootstrapping estimate of $p(A|I)$ using $N=100$ (very small). What happens to the range of possibilities?\n", "+ Rerun the bootstrapping estimate of $p(A|I)$ using $N=1000$ (reasonable). Did the range of possibilities change compared to $N=500$?\n", "+ Rerun the bootstrapping estimate of $p(A|I)$ using $N=2741$ (the maximum, and reasonable). What about now? How does the range look-like now? Why, didn't the uncertainty collapse completly? Hint: Think about how we sample the rows of the data frame. Is there a chance that we miss some?\n", "+ What if you go to $N=5000$?" ] }, { "cell_type": "markdown", "id": "36fb78e7", "metadata": {}, "source": [] } ], "metadata": { "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }