diff --git a/notebooks/c05_Big_Data/Working_with_Big_Data.ipynb b/notebooks/c05_Big_Data/Working_with_Big_Data.ipynb index 24fccdf..00ea6c9 100644 --- a/notebooks/c05_Big_Data/Working_with_Big_Data.ipynb +++ b/notebooks/c05_Big_Data/Working_with_Big_Data.ipynb @@ -10,23 +10,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:00.534431Z", - "start_time": "2020-10-04T07:12:59.476700Z" + "end_time": "2020-10-14T02:29:11.178151Z", + "start_time": "2020-10-14T02:29:10.385397Z" } }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/wassname/.pyenv/versions/jup3.7.3/lib/python3.7/site-packages/dask/dataframe/utils.py:14: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n", - " import pandas.util.testing as tm\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", @@ -47,11 +38,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:00.541259Z", - "start_time": "2020-10-04T07:13:00.537506Z" + "end_time": "2020-10-14T02:29:11.181724Z", + "start_time": "2020-10-14T02:29:11.179663Z" } }, "outputs": [], @@ -68,11 +59,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:00.558769Z", - "start_time": "2020-10-04T07:13:00.550951Z" + "end_time": "2020-10-14T02:29:11.575247Z", + "start_time": "2020-10-14T02:29:11.571877Z" } }, "outputs": [], @@ -99,11 +90,11 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:00.572954Z", - "start_time": "2020-10-04T07:13:00.561729Z" + "end_time": "2020-10-14T02:29:12.597702Z", + "start_time": "2020-10-14T02:29:12.592553Z" } }, "outputs": [ @@ -111,16 +102,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "[Process 3303031 uses 116.1MB]\n" + "[Process 2285 uses 121.8MB]\n" ] }, { "data": { "text/plain": [ - "116.05078125" + "121.80078125" ] }, - "execution_count": 4, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -139,11 +130,11 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:04.327228Z", - "start_time": "2020-10-04T07:13:00.576215Z" + "end_time": "2020-10-14T02:29:46.295397Z", + "start_time": "2020-10-14T02:29:39.406596Z" } }, "outputs": [ @@ -151,8 +142,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3.41 s, sys: 315 ms, total: 3.73 s\n", - "Wall time: 3.74 s\n" + "CPU times: user 2.41 s, sys: 343 ms, total: 2.75 s\n", + "Wall time: 6.89 s\n" ] } ], @@ -163,11 +154,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:04.338688Z", - "start_time": "2020-10-04T07:13:04.330235Z" + "end_time": "2020-10-14T02:30:08.792445Z", + "start_time": "2020-10-14T02:30:08.788405Z" } }, "outputs": [ @@ -175,16 +166,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "[Process 3303031 uses 624.0MB]\n" + "[Process 2285 uses 628.9MB]\n" ] }, { "data": { "text/plain": [ - "624.02734375" + "628.921875" ] }, - "execution_count": 6, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -203,11 +194,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:04.622452Z", - "start_time": "2020-10-04T07:13:04.345357Z" + "end_time": "2020-10-14T02:30:29.733889Z", + "start_time": "2020-10-14T02:30:29.665680Z" } }, "outputs": [ @@ -215,8 +206,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 271 ms, sys: 235 µs, total: 271 ms\n", - "Wall time: 270 ms\n" + "CPU times: user 62.2 ms, sys: 4.01 ms, total: 66.2 ms\n", + "Wall time: 65.2 ms\n" ] } ], @@ -227,11 +218,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:04.632554Z", - "start_time": "2020-10-04T07:13:04.625654Z" + "end_time": "2020-10-14T02:30:38.969341Z", + "start_time": "2020-10-14T02:30:38.964629Z" } }, "outputs": [ @@ -239,16 +230,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "[Process 3303031 uses 624.0MB]\n" + "[Process 2285 uses 628.9MB]\n" ] }, { "data": { "text/plain": [ - "624.02734375" + "628.921875" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -275,11 +266,11 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:04.652509Z", - "start_time": "2020-10-04T07:13:04.635259Z" + "end_time": "2020-10-14T02:31:12.339688Z", + "start_time": "2020-10-14T02:31:12.327592Z" } }, "outputs": [ @@ -287,8 +278,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.35 ms, sys: 3.89 ms, total: 8.24 ms\n", - "Wall time: 7.08 ms\n" + "CPU times: user 6.89 ms, sys: 0 ns, total: 6.89 ms\n", + "Wall time: 6.24 ms\n" ] }, { @@ -308,7 +299,7 @@ "Length: 100, dtype: float64" ] }, - "execution_count": 9, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -328,11 +319,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:04.735404Z", - "start_time": "2020-10-04T07:13:04.654934Z" + "end_time": "2020-10-14T02:32:05.591164Z", + "start_time": "2020-10-14T02:32:05.550701Z" } }, "outputs": [ @@ -340,8 +331,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 76.8 ms, sys: 199 µs, total: 77 ms\n", - "Wall time: 75.2 ms\n" + "CPU times: user 38.3 ms, sys: 16 µs, total: 38.3 ms\n", + "Wall time: 37.3 ms\n" ] } ], @@ -359,11 +350,11 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:04.746367Z", - "start_time": "2020-10-04T07:13:04.738422Z" + "end_time": "2020-10-14T02:32:16.632186Z", + "start_time": "2020-10-14T02:32:16.627016Z" } }, "outputs": [ @@ -375,10 +366,10 @@ "pixel100 float64\n", "pixel99 ...\n", "dtype: float64\n", - "Dask Name: dataframe-mean, 15 tasks" + "Dask Name: dataframe-mean, 11 tasks" ] }, - "execution_count": 11, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -397,11 +388,11 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:08.971892Z", - "start_time": "2020-10-04T07:13:04.750170Z" + "end_time": "2020-10-14T02:33:00.902439Z", + "start_time": "2020-10-14T02:32:58.210666Z" } }, "outputs": [ @@ -409,8 +400,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.52 s, sys: 543 ms, total: 5.06 s\n", - "Wall time: 4.21 s\n" + "CPU times: user 2.76 s, sys: 470 ms, total: 3.23 s\n", + "Wall time: 2.69 s\n" ] }, { @@ -430,7 +421,7 @@ "Length: 100, dtype: float64" ] }, - "execution_count": 12, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -472,11 +463,11 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:08.978326Z", - "start_time": "2020-10-04T07:13:08.975521Z" + "end_time": "2020-10-14T02:38:10.718460Z", + "start_time": "2020-10-14T02:38:10.716474Z" } }, "outputs": [], @@ -494,11 +485,11 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:09.062783Z", - "start_time": "2020-10-04T07:13:08.981747Z" + "end_time": "2020-10-14T02:38:11.564096Z", + "start_time": "2020-10-14T02:38:11.523227Z" } }, "outputs": [], @@ -522,11 +513,11 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:13.684735Z", - "start_time": "2020-10-04T07:13:09.065291Z" + "end_time": "2020-10-14T02:38:16.671639Z", + "start_time": "2020-10-14T02:38:14.308997Z" } }, "outputs": [ @@ -534,7 +525,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[########################################] | 100% Completed | 4.6s\n" + "[########################################] | 100% Completed | 2.4s\n" ] } ], @@ -554,11 +545,11 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:14.051240Z", - "start_time": "2020-10-04T07:13:13.686819Z" + "end_time": "2020-10-14T02:39:07.219912Z", + "start_time": "2020-10-14T02:39:07.048911Z" } }, "outputs": [], @@ -568,11 +559,11 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:19.196451Z", - "start_time": "2020-10-04T07:13:14.053718Z" + "end_time": "2020-10-14T02:39:10.886195Z", + "start_time": "2020-10-14T02:39:07.601655Z" } }, "outputs": [ @@ -580,7 +571,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[########################################] | 100% Completed | 5.1s\n" + "[########################################] | 100% Completed | 3.3s\n" ] } ], @@ -591,11 +582,11 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:19.210681Z", - "start_time": "2020-10-04T07:13:19.200112Z" + "end_time": "2020-10-14T02:39:42.422134Z", + "start_time": "2020-10-14T02:39:42.417217Z" } }, "outputs": [ @@ -616,7 +607,7 @@ "Length: 785, dtype: float64" ] }, - "execution_count": 18, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -627,11 +618,11 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:19.257560Z", - "start_time": "2020-10-04T07:13:19.214249Z" + "end_time": "2020-10-14T02:39:45.447075Z", + "start_time": "2020-10-14T02:39:45.426516Z" } }, "outputs": [], @@ -641,11 +632,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:23.551522Z", - "start_time": "2020-10-04T07:13:19.260901Z" + "end_time": "2020-10-14T02:39:48.551108Z", + "start_time": "2020-10-14T02:39:45.975978Z" } }, "outputs": [ @@ -653,7 +644,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[########################################] | 100% Completed | 4.3s\n" + "[########################################] | 100% Completed | 2.6s\n" ] } ], @@ -664,11 +655,11 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:23.576434Z", - "start_time": "2020-10-04T07:13:23.555071Z" + "end_time": "2020-10-14T02:39:54.015896Z", + "start_time": "2020-10-14T02:39:54.007397Z" } }, "outputs": [ @@ -784,7 +775,7 @@ "9 0.000000 77.106256 0.142550" ] }, - "execution_count": 21, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -795,704 +786,8242 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "

Exercise

\n", - "\n", - "Use Dask dataframe of MNIST (df2) and follow these steps:\n", - " \n", - "1. Add a new column called `sum` to the dataframe which contains sum of all the pixels\n", - "2. Use groupby to find the mean value for `sum` for each label\n", - " \n", - "\n", - "
\n", - " → Hints\n", - "\n", - " * Columns 1 onwards are the pixels. You can access them with `pixels=df2.iloc[:, 1:]`\n", - " * Instead of `df['sum']=pixels.sum()` try `df['sum']=pixels.sum(axis=1)` because we want to sum along columns, not rows\n", - " * If the dask output is confusing, try with df1 first\n", - " * to groupby use `df2.groupby('label').?`, where you replace the `?` with the aggregation operation\n", - "\n", - "
\n", - "\n", - "
\n", - "
\n", - "
\n", - " \n", - " → Solution\n", - " \n", - "\n", - " ```python\n", - " # With pandas\n", - " pixels = df1.loc[:, ['pixel' in c for c in df1.columns]]\n", - " df1['sum']=pixels.sum(axis=1)\n", - " task = df1[['label','sum']].groupby('label').mean()\n", - " print(result)\n", - "\n", - " # With dask\n", - " pixels = df2.loc[:, ['pixel' in c for c in df2.columns]]\n", - " df2['sum']=pixels.sum(axis=1)\n", - " task = df2[['label','sum']].groupby('label').mean()\n", - " with ProgressBar():\n", - " result=task.compute() \n", - " print(result)\n", - " ```\n", - "\n", - "
\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## When to use Dask DataFrame?\n", - "\n", - "Lets visit [the dask page](https://docs.dask.org/en/latest/dataframe.html#common-uses-and-anti-uses) to look at when we should use it\n", - "\n", - "It is harder so only if you dataset is larger than memory.\n", - "\n", - "If fact also consider:\n", - "- a database (if you have lots of structured queries)\n", - "- https://downloadmoreram.com/ ;p\n", - "- dask array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Dask Array\n", - "Dask is not just used to replace pandas. There are also multiple numpy functions which can be replaced by Dask. Dask array is Dask equivalent of a numpy array. By doing so, we can perform the computations in parallel and get the results faster." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "ExecuteTime": { - "end_time": "2020-10-04T07:13:23.588550Z", - "start_time": "2020-10-04T07:13:23.584811Z" - } - }, - "outputs": [], - "source": [ - "from dask import array" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "ExecuteTime": { - "end_time": "2020-10-04T07:13:23.605397Z", - "start_time": "2020-10-04T07:13:23.593664Z" - } - }, - "outputs": [], - "source": [ - "big_array = array.random.normal(size=(10000000, 100), chunks=200000)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, + "execution_count": 29, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:23.616314Z", - "start_time": "2020-10-04T07:13:23.608703Z" + "end_time": "2020-10-14T02:46:19.562831Z", + "start_time": "2020-10-14T02:46:18.729080Z" } }, "outputs": [ { "data": { "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Array Chunk
Bytes 8.00 GB 160.00 MB
Shape (10000000, 100) (200000, 100)
Count 50 Tasks 50 Chunks
Type float64 numpy.ndarray
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - " \n", - " \n", + "
Dask DataFrame Structure:
\n", + "
\n", + "\n", + "\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Array Chunk
Bytes 800 B 800 B
Shape (100,) (100,)
Count 68 Tasks 1 Chunks
Type float64 numpy.ndarray
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - " \n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " 100\n", - " 1\n", - "\n", - "
" - ], - "text/plain": [ - "dask.array" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "ExecuteTime": { - "end_time": "2020-10-04T07:13:53.277483Z", - "start_time": "2020-10-04T07:13:53.268206Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-1.17109224e-04, -2.37748610e-05, 1.67655302e-04, 9.72602555e-05,\n", - " -1.21246755e-04, 1.86229870e-04, -2.90821428e-04, -2.79825330e-04,\n", - " 1.36715765e-04, -5.00321866e-06, -8.71579028e-05, -5.53870480e-05,\n", - " -2.99278608e-04, 8.90632815e-05, 2.23756405e-05, -8.12409603e-05,\n", - " 1.15169616e-04, -3.89092182e-04, -1.53707025e-06, 2.39661084e-04,\n", - " -1.80096422e-04, 2.74128387e-04, -2.44078965e-04, -1.83305381e-04,\n", - " -3.63807417e-05, -3.47435128e-04, -7.35919945e-05, 2.29875992e-04,\n", - " 2.71309995e-04, 2.23522462e-04, -3.06297908e-04, 1.31446736e-04,\n", - " 4.68200987e-04, -4.46962346e-04, -1.98344059e-04, -2.83531171e-04,\n", - " 1.67231803e-04, 2.33479578e-04, -1.16014913e-04, -8.46083969e-05,\n", - " 3.82956303e-05, -7.75966025e-05, -9.45842315e-05, -1.46859581e-04,\n", - " 2.66761928e-05, 5.43888756e-04, 1.30971229e-04, 3.03536632e-04,\n", - " -2.70213468e-04, -3.35363834e-04, -4.89288567e-04, -1.24321567e-04,\n", - " 9.31827182e-06, 3.91525970e-04, 1.39809241e-04, 5.34253751e-04,\n", - " 2.57985579e-05, -3.90105425e-04, 2.16084327e-04, -3.36460548e-04,\n", - " -3.10813633e-05, 2.96684317e-04, 3.42895144e-04, 2.19669624e-05,\n", - " -1.82899301e-05, -6.85668196e-06, -2.03926052e-05, -1.92327105e-04,\n", - " -5.36787318e-05, -1.75316594e-04, 5.00921038e-04, 1.45688893e-04,\n", - " -3.96319489e-05, 7.60191739e-05, 1.03714211e-04, 3.41146659e-04,\n", - " 3.12939637e-04, -1.25675053e-04, 3.47103013e-05, -4.55230167e-04,\n", - " 2.66342456e-04, 3.01029884e-04, -1.44831019e-04, -1.02233797e-04,\n", - " 3.72579009e-04, -1.29388430e-04, 1.84378422e-04, -1.72381630e-04,\n", - " 2.03004813e-04, 2.35664428e-04, 3.33605329e-04, -1.46503189e-04,\n", - " -4.94174663e-06, 4.60467235e-05, 1.21205920e-04, 1.01241642e-04,\n", - " -8.10986294e-06, 1.66141228e-05, -2.12343799e-04, -3.61209569e-04])" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } + " \n", + " \n", + " label\n", + " pixel0\n", + " pixel1\n", + " pixel2\n", + " pixel3\n", + " pixel4\n", + " pixel5\n", + " pixel6\n", + " pixel7\n", + " pixel8\n", + " pixel9\n", + " pixel10\n", + " pixel11\n", + " pixel12\n", + " pixel13\n", + " pixel14\n", + " pixel15\n", + " pixel16\n", + " pixel17\n", + " pixel18\n", + " pixel19\n", + " pixel20\n", + " pixel21\n", + " pixel22\n", + " pixel23\n", + " pixel24\n", + " pixel25\n", + " pixel26\n", + " pixel27\n", + " pixel28\n", + " pixel29\n", + " pixel30\n", + " pixel31\n", + " pixel32\n", + " pixel33\n", + " pixel34\n", + " pixel35\n", + " pixel36\n", + " pixel37\n", + " pixel38\n", + " pixel39\n", + " pixel40\n", + " pixel41\n", + " pixel42\n", + " pixel43\n", + " pixel44\n", + " pixel45\n", + " pixel46\n", + " pixel47\n", + " pixel48\n", + " pixel49\n", + " pixel50\n", + " pixel51\n", + " pixel52\n", + " pixel53\n", + " pixel54\n", + " pixel55\n", + " pixel56\n", + " pixel57\n", + " pixel58\n", + " pixel59\n", + " pixel60\n", + " pixel61\n", + " pixel62\n", + " pixel63\n", + " pixel64\n", + " pixel65\n", + " pixel66\n", + " pixel67\n", + " pixel68\n", + " pixel69\n", + " pixel70\n", + " pixel71\n", + " pixel72\n", + " pixel73\n", + " pixel74\n", + " pixel75\n", + " pixel76\n", + " pixel77\n", + " pixel78\n", + " pixel79\n", + " pixel80\n", + " pixel81\n", + " pixel82\n", + " pixel83\n", + " pixel84\n", + " pixel85\n", + " pixel86\n", + " pixel87\n", + " pixel88\n", + " pixel89\n", + " pixel90\n", + " pixel91\n", + " pixel92\n", + " pixel93\n", + " pixel94\n", + " pixel95\n", + " pixel96\n", + " pixel97\n", + " pixel98\n", + " pixel99\n", + " pixel100\n", + " pixel101\n", + " pixel102\n", + " pixel103\n", + " pixel104\n", + " pixel105\n", + " pixel106\n", + " pixel107\n", + " pixel108\n", + " pixel109\n", + " pixel110\n", + " pixel111\n", + " pixel112\n", + " pixel113\n", + " pixel114\n", + " pixel115\n", + " pixel116\n", + " pixel117\n", + " pixel118\n", + " pixel119\n", + " pixel120\n", + " pixel121\n", + " pixel122\n", + " pixel123\n", + " pixel124\n", + " pixel125\n", + " pixel126\n", + " pixel127\n", + " pixel128\n", + " pixel129\n", + " pixel130\n", + " pixel131\n", + " pixel132\n", + " pixel133\n", + " pixel134\n", + " pixel135\n", + " pixel136\n", + " pixel137\n", + " pixel138\n", + " pixel139\n", + " pixel140\n", + " pixel141\n", + " pixel142\n", + " pixel143\n", + " pixel144\n", + " pixel145\n", + " pixel146\n", + " pixel147\n", + " pixel148\n", + " pixel149\n", + " pixel150\n", + " pixel151\n", + " pixel152\n", + " pixel153\n", + " pixel154\n", + " pixel155\n", + " pixel156\n", + " pixel157\n", + " pixel158\n", + " pixel159\n", + " pixel160\n", + " pixel161\n", + " pixel162\n", + " pixel163\n", + " pixel164\n", + " pixel165\n", + " pixel166\n", + " pixel167\n", + " pixel168\n", + " pixel169\n", + " pixel170\n", + " pixel171\n", + " pixel172\n", + " pixel173\n", + " pixel174\n", + " pixel175\n", + " pixel176\n", + " pixel177\n", + " pixel178\n", + " pixel179\n", + " pixel180\n", + " pixel181\n", + " pixel182\n", + " pixel183\n", + " pixel184\n", + " pixel185\n", + " pixel186\n", + " pixel187\n", + " pixel188\n", + " pixel189\n", + " pixel190\n", + " pixel191\n", + " pixel192\n", + " pixel193\n", + " pixel194\n", + " pixel195\n", + " pixel196\n", + " pixel197\n", + " pixel198\n", + " pixel199\n", + " pixel200\n", + " pixel201\n", + " pixel202\n", + " pixel203\n", + " pixel204\n", + " pixel205\n", + " pixel206\n", + " pixel207\n", + " pixel208\n", + " pixel209\n", + " pixel210\n", + " pixel211\n", + " pixel212\n", + " pixel213\n", + " pixel214\n", + " pixel215\n", + " pixel216\n", + " pixel217\n", + " pixel218\n", + " pixel219\n", + " pixel220\n", + " pixel221\n", + " pixel222\n", + " pixel223\n", + " pixel224\n", + " pixel225\n", + " pixel226\n", + " pixel227\n", + " pixel228\n", + " pixel229\n", + " pixel230\n", + " pixel231\n", + " pixel232\n", + " pixel233\n", + " pixel234\n", + " pixel235\n", + " pixel236\n", + " pixel237\n", + " pixel238\n", + " pixel239\n", + " pixel240\n", + " pixel241\n", + " pixel242\n", + " pixel243\n", + " pixel244\n", + " pixel245\n", + " pixel246\n", + " pixel247\n", + " pixel248\n", + " pixel249\n", + " pixel250\n", + " pixel251\n", + " pixel252\n", + " pixel253\n", + " pixel254\n", + " pixel255\n", + " pixel256\n", + " pixel257\n", + " pixel258\n", + " pixel259\n", + " pixel260\n", + " pixel261\n", + " pixel262\n", + " pixel263\n", + " pixel264\n", + " pixel265\n", + " pixel266\n", + " pixel267\n", + " pixel268\n", + " pixel269\n", + " pixel270\n", + " pixel271\n", + " pixel272\n", + " pixel273\n", + " pixel274\n", + " pixel275\n", + " pixel276\n", + " pixel277\n", + " pixel278\n", + " pixel279\n", + " pixel280\n", + " pixel281\n", + " pixel282\n", + " pixel283\n", + " pixel284\n", + " pixel285\n", + " pixel286\n", + " pixel287\n", + " pixel288\n", + " pixel289\n", + " pixel290\n", + " pixel291\n", + " pixel292\n", + " pixel293\n", + " pixel294\n", + " pixel295\n", + " pixel296\n", + " pixel297\n", + " pixel298\n", + " pixel299\n", + " pixel300\n", + " pixel301\n", + " pixel302\n", + " pixel303\n", + " pixel304\n", + " pixel305\n", + " pixel306\n", + " pixel307\n", + " pixel308\n", + " pixel309\n", + " pixel310\n", + " pixel311\n", + " pixel312\n", + " pixel313\n", + " pixel314\n", + " pixel315\n", + " pixel316\n", + " pixel317\n", + " pixel318\n", + " pixel319\n", + " pixel320\n", + " pixel321\n", + " pixel322\n", + " pixel323\n", + " pixel324\n", + " pixel325\n", + " pixel326\n", + " pixel327\n", + " pixel328\n", + " pixel329\n", + " pixel330\n", + " pixel331\n", + " pixel332\n", + " pixel333\n", + " pixel334\n", + " pixel335\n", + " pixel336\n", + " pixel337\n", + " pixel338\n", + " pixel339\n", + " pixel340\n", + " pixel341\n", + " pixel342\n", + " pixel343\n", + " pixel344\n", + " pixel345\n", + " pixel346\n", + " pixel347\n", + " pixel348\n", + " pixel349\n", + " pixel350\n", + " pixel351\n", + " pixel352\n", + " pixel353\n", + " pixel354\n", + " pixel355\n", + " pixel356\n", + " pixel357\n", + " pixel358\n", + " pixel359\n", + " pixel360\n", + " pixel361\n", + " pixel362\n", + " pixel363\n", + " pixel364\n", + " pixel365\n", + " pixel366\n", + " pixel367\n", + " pixel368\n", + " pixel369\n", + " pixel370\n", + " pixel371\n", + " pixel372\n", + " pixel373\n", + " pixel374\n", + " pixel375\n", + " pixel376\n", + " pixel377\n", + " pixel378\n", + " pixel379\n", + " pixel380\n", + " pixel381\n", + " pixel382\n", + " pixel383\n", + " pixel384\n", + " pixel385\n", + " pixel386\n", + " pixel387\n", + " pixel388\n", + " pixel389\n", + " pixel390\n", + " pixel391\n", + " pixel392\n", + " pixel393\n", + " pixel394\n", + " pixel395\n", + " pixel396\n", + " pixel397\n", + " pixel398\n", + " pixel399\n", + " pixel400\n", + " pixel401\n", + " pixel402\n", + " pixel403\n", + " pixel404\n", + " pixel405\n", + " pixel406\n", + " pixel407\n", + " pixel408\n", + " pixel409\n", + " pixel410\n", + " pixel411\n", + " pixel412\n", + " pixel413\n", + " pixel414\n", + " pixel415\n", + " pixel416\n", + " pixel417\n", + " pixel418\n", + " pixel419\n", + " pixel420\n", + " pixel421\n", + " pixel422\n", + " pixel423\n", + " pixel424\n", + " pixel425\n", + " pixel426\n", + " pixel427\n", + " pixel428\n", + " pixel429\n", + " pixel430\n", + " pixel431\n", + " pixel432\n", + " pixel433\n", + " pixel434\n", + " pixel435\n", + " pixel436\n", + " pixel437\n", + " pixel438\n", + " pixel439\n", + " pixel440\n", + " pixel441\n", + " pixel442\n", + " pixel443\n", + " pixel444\n", + " pixel445\n", + " pixel446\n", + " pixel447\n", + " pixel448\n", + " pixel449\n", + " pixel450\n", + " pixel451\n", + " pixel452\n", + " pixel453\n", + " pixel454\n", + " pixel455\n", + " pixel456\n", + " pixel457\n", + " pixel458\n", + " pixel459\n", + " pixel460\n", + " pixel461\n", + " pixel462\n", + " pixel463\n", + " pixel464\n", + " pixel465\n", + " pixel466\n", + " pixel467\n", + " pixel468\n", + " pixel469\n", + " pixel470\n", + " pixel471\n", + " pixel472\n", + " pixel473\n", + " pixel474\n", + " pixel475\n", + " pixel476\n", + " pixel477\n", + " pixel478\n", + " pixel479\n", + " pixel480\n", + " pixel481\n", + " pixel482\n", + " pixel483\n", + " pixel484\n", + " pixel485\n", + " pixel486\n", + " pixel487\n", + " pixel488\n", + " pixel489\n", + " pixel490\n", + " pixel491\n", + " pixel492\n", + " pixel493\n", + " pixel494\n", + " pixel495\n", + " pixel496\n", + " pixel497\n", + " pixel498\n", + " pixel499\n", + " pixel500\n", + " pixel501\n", + " pixel502\n", + " pixel503\n", + " pixel504\n", + " pixel505\n", + " pixel506\n", + " pixel507\n", + " pixel508\n", + " pixel509\n", + " pixel510\n", + " pixel511\n", + " pixel512\n", + " pixel513\n", + " pixel514\n", + " pixel515\n", + " pixel516\n", + " pixel517\n", + " pixel518\n", + " pixel519\n", + " pixel520\n", + " pixel521\n", + " pixel522\n", + " pixel523\n", + " pixel524\n", + " pixel525\n", + " pixel526\n", + " pixel527\n", + " pixel528\n", + " pixel529\n", + " pixel530\n", + " pixel531\n", + " pixel532\n", + " pixel533\n", + " pixel534\n", + " pixel535\n", + " pixel536\n", + " pixel537\n", + " pixel538\n", + " pixel539\n", + " pixel540\n", + " pixel541\n", + " pixel542\n", + " pixel543\n", + " pixel544\n", + " pixel545\n", + " pixel546\n", + " pixel547\n", + " pixel548\n", + " pixel549\n", + " pixel550\n", + " pixel551\n", + " pixel552\n", + " pixel553\n", + " pixel554\n", + " pixel555\n", + " pixel556\n", + " pixel557\n", + " pixel558\n", + " pixel559\n", + " pixel560\n", + " pixel561\n", + " pixel562\n", + " pixel563\n", + " pixel564\n", + " pixel565\n", + " pixel566\n", + " pixel567\n", + " pixel568\n", + " pixel569\n", + " pixel570\n", + " pixel571\n", + " pixel572\n", + " pixel573\n", + " pixel574\n", + " pixel575\n", + " pixel576\n", + " pixel577\n", + " pixel578\n", + " pixel579\n", + " pixel580\n", + " pixel581\n", + " pixel582\n", + " pixel583\n", + " pixel584\n", + " pixel585\n", + " pixel586\n", + " pixel587\n", + " pixel588\n", + " pixel589\n", + " pixel590\n", + " pixel591\n", + " pixel592\n", + " pixel593\n", + " pixel594\n", + " pixel595\n", + " pixel596\n", + " pixel597\n", + " pixel598\n", + " pixel599\n", + " pixel600\n", + " pixel601\n", + " pixel602\n", + " pixel603\n", + " pixel604\n", + " pixel605\n", + " pixel606\n", + " pixel607\n", + " pixel608\n", + " pixel609\n", + " pixel610\n", + " pixel611\n", + " pixel612\n", + " pixel613\n", + " pixel614\n", + " pixel615\n", + " pixel616\n", + " pixel617\n", + " pixel618\n", + " pixel619\n", + " pixel620\n", + " pixel621\n", + " pixel622\n", + " pixel623\n", + " pixel624\n", + " pixel625\n", + " pixel626\n", + " pixel627\n", + " pixel628\n", + " pixel629\n", + " pixel630\n", + " pixel631\n", + " pixel632\n", + " pixel633\n", + " pixel634\n", + " pixel635\n", + " pixel636\n", + " pixel637\n", + " pixel638\n", + " pixel639\n", + " pixel640\n", + " pixel641\n", + " pixel642\n", + " pixel643\n", + " pixel644\n", + " pixel645\n", + " pixel646\n", + " pixel647\n", + " pixel648\n", + " pixel649\n", + " pixel650\n", + " pixel651\n", + " pixel652\n", + " pixel653\n", + " pixel654\n", + " pixel655\n", + " pixel656\n", + " pixel657\n", + " pixel658\n", + " pixel659\n", + " pixel660\n", + " pixel661\n", + " pixel662\n", + " pixel663\n", + " pixel664\n", + " pixel665\n", + " pixel666\n", + " pixel667\n", + " pixel668\n", + " pixel669\n", + " pixel670\n", + " pixel671\n", + " pixel672\n", + " pixel673\n", + " pixel674\n", + " pixel675\n", + " pixel676\n", + " pixel677\n", + " pixel678\n", + " pixel679\n", + " pixel680\n", + " pixel681\n", + " pixel682\n", + " pixel683\n", + " pixel684\n", + " pixel685\n", + " pixel686\n", + " pixel687\n", + " pixel688\n", + " pixel689\n", + " pixel690\n", + " pixel691\n", + " pixel692\n", + " pixel693\n", + " pixel694\n", + " pixel695\n", + " pixel696\n", + " pixel697\n", + " pixel698\n", + " pixel699\n", + " pixel700\n", + " pixel701\n", + " pixel702\n", + " pixel703\n", + " pixel704\n", + " pixel705\n", + " pixel706\n", + " pixel707\n", + " pixel708\n", + " pixel709\n", + " pixel710\n", + " pixel711\n", + " pixel712\n", + " pixel713\n", + " pixel714\n", + " pixel715\n", + " pixel716\n", + " pixel717\n", + " pixel718\n", + " pixel719\n", + " pixel720\n", + " pixel721\n", + " pixel722\n", + " pixel723\n", + " pixel724\n", + " pixel725\n", + " pixel726\n", + " pixel727\n", + " pixel728\n", + " pixel729\n", + " pixel730\n", + " pixel731\n", + " pixel732\n", + " pixel733\n", + " pixel734\n", + " pixel735\n", + " pixel736\n", + " pixel737\n", + " pixel738\n", + " pixel739\n", + " pixel740\n", + " pixel741\n", + " pixel742\n", + " pixel743\n", + " pixel744\n", + " pixel745\n", + " pixel746\n", + " pixel747\n", + " pixel748\n", + " pixel749\n", + " pixel750\n", + " pixel751\n", + " pixel752\n", + " pixel753\n", + " pixel754\n", + " pixel755\n", + " pixel756\n", + " pixel757\n", + " pixel758\n", + " pixel759\n", + " pixel760\n", + " pixel761\n", + " pixel762\n", + " pixel763\n", + " pixel764\n", + " pixel765\n", + " pixel766\n", + " pixel767\n", + " pixel768\n", + " pixel769\n", + " pixel770\n", + " pixel771\n", + " pixel772\n", + " pixel773\n", + " pixel774\n", + " pixel775\n", + " pixel776\n", + " pixel777\n", + " pixel778\n", + " pixel779\n", + " pixel780\n", + " pixel781\n", + " pixel782\n", + " pixel783\n", + " \n", + " \n", + " npartitions=2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " int64\n", + " \n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + "\n", + "\n", + "
Dask Name: read-csv, 2 tasks
" + ], + "text/plain": [ + "Dask DataFrame Structure:\n", + " label pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 pixel10 pixel11 pixel12 pixel13 pixel14 pixel15 pixel16 pixel17 pixel18 pixel19 pixel20 pixel21 pixel22 pixel23 pixel24 pixel25 pixel26 pixel27 pixel28 pixel29 pixel30 pixel31 pixel32 pixel33 pixel34 pixel35 pixel36 pixel37 pixel38 pixel39 pixel40 pixel41 pixel42 pixel43 pixel44 pixel45 pixel46 pixel47 pixel48 pixel49 pixel50 pixel51 pixel52 pixel53 pixel54 pixel55 pixel56 pixel57 pixel58 pixel59 pixel60 pixel61 pixel62 pixel63 pixel64 pixel65 pixel66 pixel67 pixel68 pixel69 pixel70 pixel71 pixel72 pixel73 pixel74 pixel75 pixel76 pixel77 pixel78 pixel79 pixel80 pixel81 pixel82 pixel83 pixel84 pixel85 pixel86 pixel87 pixel88 pixel89 pixel90 pixel91 pixel92 pixel93 pixel94 pixel95 pixel96 pixel97 pixel98 pixel99 pixel100 pixel101 pixel102 pixel103 pixel104 pixel105 pixel106 pixel107 pixel108 pixel109 pixel110 pixel111 pixel112 pixel113 pixel114 pixel115 pixel116 pixel117 pixel118 pixel119 pixel120 pixel121 pixel122 pixel123 pixel124 pixel125 pixel126 pixel127 pixel128 pixel129 pixel130 pixel131 pixel132 pixel133 pixel134 pixel135 pixel136 pixel137 pixel138 pixel139 pixel140 pixel141 pixel142 pixel143 pixel144 pixel145 pixel146 pixel147 pixel148 pixel149 pixel150 pixel151 pixel152 pixel153 pixel154 pixel155 pixel156 pixel157 pixel158 pixel159 pixel160 pixel161 pixel162 pixel163 pixel164 pixel165 pixel166 pixel167 pixel168 pixel169 pixel170 pixel171 pixel172 pixel173 pixel174 pixel175 pixel176 pixel177 pixel178 pixel179 pixel180 pixel181 pixel182 pixel183 pixel184 pixel185 pixel186 pixel187 pixel188 pixel189 pixel190 pixel191 pixel192 pixel193 pixel194 pixel195 pixel196 pixel197 pixel198 pixel199 pixel200 pixel201 pixel202 pixel203 pixel204 pixel205 pixel206 pixel207 pixel208 pixel209 pixel210 pixel211 pixel212 pixel213 pixel214 pixel215 pixel216 pixel217 pixel218 pixel219 pixel220 pixel221 pixel222 pixel223 pixel224 pixel225 pixel226 pixel227 pixel228 pixel229 pixel230 pixel231 pixel232 pixel233 pixel234 pixel235 pixel236 pixel237 pixel238 pixel239 pixel240 pixel241 pixel242 pixel243 pixel244 pixel245 pixel246 pixel247 pixel248 pixel249 pixel250 pixel251 pixel252 pixel253 pixel254 pixel255 pixel256 pixel257 pixel258 pixel259 pixel260 pixel261 pixel262 pixel263 pixel264 pixel265 pixel266 pixel267 pixel268 pixel269 pixel270 pixel271 pixel272 pixel273 pixel274 pixel275 pixel276 pixel277 pixel278 pixel279 pixel280 pixel281 pixel282 pixel283 pixel284 pixel285 pixel286 pixel287 pixel288 pixel289 pixel290 pixel291 pixel292 pixel293 pixel294 pixel295 pixel296 pixel297 pixel298 pixel299 pixel300 pixel301 pixel302 pixel303 pixel304 pixel305 pixel306 pixel307 pixel308 pixel309 pixel310 pixel311 pixel312 pixel313 pixel314 pixel315 pixel316 pixel317 pixel318 pixel319 pixel320 pixel321 pixel322 pixel323 pixel324 pixel325 pixel326 pixel327 pixel328 pixel329 pixel330 pixel331 pixel332 pixel333 pixel334 pixel335 pixel336 pixel337 pixel338 pixel339 pixel340 pixel341 pixel342 pixel343 pixel344 pixel345 pixel346 pixel347 pixel348 pixel349 pixel350 pixel351 pixel352 pixel353 pixel354 pixel355 pixel356 pixel357 pixel358 pixel359 pixel360 pixel361 pixel362 pixel363 pixel364 pixel365 pixel366 pixel367 pixel368 pixel369 pixel370 pixel371 pixel372 pixel373 pixel374 pixel375 pixel376 pixel377 pixel378 pixel379 pixel380 pixel381 pixel382 pixel383 pixel384 pixel385 pixel386 pixel387 pixel388 pixel389 pixel390 pixel391 pixel392 pixel393 pixel394 pixel395 pixel396 pixel397 pixel398 pixel399 pixel400 pixel401 pixel402 pixel403 pixel404 pixel405 pixel406 pixel407 pixel408 pixel409 pixel410 pixel411 pixel412 pixel413 pixel414 pixel415 pixel416 pixel417 pixel418 pixel419 pixel420 pixel421 pixel422 pixel423 pixel424 pixel425 pixel426 pixel427 pixel428 pixel429 pixel430 pixel431 pixel432 pixel433 pixel434 pixel435 pixel436 pixel437 pixel438 pixel439 pixel440 pixel441 pixel442 pixel443 pixel444 pixel445 pixel446 pixel447 pixel448 pixel449 pixel450 pixel451 pixel452 pixel453 pixel454 pixel455 pixel456 pixel457 pixel458 pixel459 pixel460 pixel461 pixel462 pixel463 pixel464 pixel465 pixel466 pixel467 pixel468 pixel469 pixel470 pixel471 pixel472 pixel473 pixel474 pixel475 pixel476 pixel477 pixel478 pixel479 pixel480 pixel481 pixel482 pixel483 pixel484 pixel485 pixel486 pixel487 pixel488 pixel489 pixel490 pixel491 pixel492 pixel493 pixel494 pixel495 pixel496 pixel497 pixel498 pixel499 pixel500 pixel501 pixel502 pixel503 pixel504 pixel505 pixel506 pixel507 pixel508 pixel509 pixel510 pixel511 pixel512 pixel513 pixel514 pixel515 pixel516 pixel517 pixel518 pixel519 pixel520 pixel521 pixel522 pixel523 pixel524 pixel525 pixel526 pixel527 pixel528 pixel529 pixel530 pixel531 pixel532 pixel533 pixel534 pixel535 pixel536 pixel537 pixel538 pixel539 pixel540 pixel541 pixel542 pixel543 pixel544 pixel545 pixel546 pixel547 pixel548 pixel549 pixel550 pixel551 pixel552 pixel553 pixel554 pixel555 pixel556 pixel557 pixel558 pixel559 pixel560 pixel561 pixel562 pixel563 pixel564 pixel565 pixel566 pixel567 pixel568 pixel569 pixel570 pixel571 pixel572 pixel573 pixel574 pixel575 pixel576 pixel577 pixel578 pixel579 pixel580 pixel581 pixel582 pixel583 pixel584 pixel585 pixel586 pixel587 pixel588 pixel589 pixel590 pixel591 pixel592 pixel593 pixel594 pixel595 pixel596 pixel597 pixel598 pixel599 pixel600 pixel601 pixel602 pixel603 pixel604 pixel605 pixel606 pixel607 pixel608 pixel609 pixel610 pixel611 pixel612 pixel613 pixel614 pixel615 pixel616 pixel617 pixel618 pixel619 pixel620 pixel621 pixel622 pixel623 pixel624 pixel625 pixel626 pixel627 pixel628 pixel629 pixel630 pixel631 pixel632 pixel633 pixel634 pixel635 pixel636 pixel637 pixel638 pixel639 pixel640 pixel641 pixel642 pixel643 pixel644 pixel645 pixel646 pixel647 pixel648 pixel649 pixel650 pixel651 pixel652 pixel653 pixel654 pixel655 pixel656 pixel657 pixel658 pixel659 pixel660 pixel661 pixel662 pixel663 pixel664 pixel665 pixel666 pixel667 pixel668 pixel669 pixel670 pixel671 pixel672 pixel673 pixel674 pixel675 pixel676 pixel677 pixel678 pixel679 pixel680 pixel681 pixel682 pixel683 pixel684 pixel685 pixel686 pixel687 pixel688 pixel689 pixel690 pixel691 pixel692 pixel693 pixel694 pixel695 pixel696 pixel697 pixel698 pixel699 pixel700 pixel701 pixel702 pixel703 pixel704 pixel705 pixel706 pixel707 pixel708 pixel709 pixel710 pixel711 pixel712 pixel713 pixel714 pixel715 pixel716 pixel717 pixel718 pixel719 pixel720 pixel721 pixel722 pixel723 pixel724 pixel725 pixel726 pixel727 pixel728 pixel729 pixel730 pixel731 pixel732 pixel733 pixel734 pixel735 pixel736 pixel737 pixel738 pixel739 pixel740 pixel741 pixel742 pixel743 pixel744 pixel745 pixel746 pixel747 pixel748 pixel749 pixel750 pixel751 pixel752 pixel753 pixel754 pixel755 pixel756 pixel757 pixel758 pixel759 pixel760 pixel761 pixel762 pixel763 pixel764 pixel765 pixel766 pixel767 pixel768 pixel769 pixel770 pixel771 pixel772 pixel773 pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783\n", + "npartitions=2 \n", + " int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64\n", + " ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", + " ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", + "Dask Name: read-csv, 2 tasks" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "

Exercise

\n", + "\n", + "Use Dask dataframe of MNIST (df2) and follow these steps:\n", + " \n", + "1. Add a new column called `sum` to the dataframe which contains sum of all the pixels\n", + "2. Use groupby to find the mean value for `sum` for each label\n", + " \n", + "\n", + "
\n", + " → Hints\n", + "\n", + " * Columns 1 onwards are the pixels. You can access them with `pixels=df2.iloc[:, 1:]`\n", + " * Instead of `df['sum']=pixels.sum()` try `df['sum']=pixels.sum(axis=1)` because we want to sum along columns, not rows\n", + " * If the dask output is confusing, try with df1 first\n", + " * to groupby use `df2.groupby('label').?`, where you replace the `?` with the aggregation operation\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + " \n", + " → Solution\n", + " \n", + "\n", + " ```python\n", + " # With pandas\n", + " pixels = df1.loc[:, ['pixel' in c for c in df1.columns]]\n", + " df1['sum']=pixels.sum(axis=1)\n", + " task = df1[['label','sum']].groupby('label').mean()\n", + " print(result)\n", + "\n", + " # With dask\n", + " pixels = df2.loc[:, ['pixel' in c for c in df2.columns]]\n", + " df2['sum']=pixels.sum(axis=1)\n", + " task = df2[['label','sum']].groupby('label').mean()\n", + " with ProgressBar():\n", + " result=task.compute() \n", + " print(result)\n", + " ```\n", + "\n", + "
\n", + "\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T02:59:56.210856Z", + "start_time": "2020-10-14T02:59:55.313285Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
Dask DataFrame Structure:
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pixel0pixel1pixel2pixel3pixel4pixel5pixel6pixel7pixel8pixel9pixel10pixel11pixel12pixel13pixel14pixel15pixel16pixel17pixel18pixel19pixel20pixel21pixel22pixel23pixel24pixel25pixel26pixel27pixel28pixel29pixel30pixel31pixel32pixel33pixel34pixel35pixel36pixel37pixel38pixel39pixel40pixel41pixel42pixel43pixel44pixel45pixel46pixel47pixel48pixel49pixel50pixel51pixel52pixel53pixel54pixel55pixel56pixel57pixel58pixel59pixel60pixel61pixel62pixel63pixel64pixel65pixel66pixel67pixel68pixel69pixel70pixel71pixel72pixel73pixel74pixel75pixel76pixel77pixel78pixel79pixel80pixel81pixel82pixel83pixel84pixel85pixel86pixel87pixel88pixel89pixel90pixel91pixel92pixel93pixel94pixel95pixel96pixel97pixel98pixel99pixel100pixel101pixel102pixel103pixel104pixel105pixel106pixel107pixel108pixel109pixel110pixel111pixel112pixel113pixel114pixel115pixel116pixel117pixel118pixel119pixel120pixel121pixel122pixel123pixel124pixel125pixel126pixel127pixel128pixel129pixel130pixel131pixel132pixel133pixel134pixel135pixel136pixel137pixel138pixel139pixel140pixel141pixel142pixel143pixel144pixel145pixel146pixel147pixel148pixel149pixel150pixel151pixel152pixel153pixel154pixel155pixel156pixel157pixel158pixel159pixel160pixel161pixel162pixel163pixel164pixel165pixel166pixel167pixel168pixel169pixel170pixel171pixel172pixel173pixel174pixel175pixel176pixel177pixel178pixel179pixel180pixel181pixel182pixel183pixel184pixel185pixel186pixel187pixel188pixel189pixel190pixel191pixel192pixel193pixel194pixel195pixel196pixel197pixel198pixel199pixel200pixel201pixel202pixel203pixel204pixel205pixel206pixel207pixel208pixel209pixel210pixel211pixel212pixel213pixel214pixel215pixel216pixel217pixel218pixel219pixel220pixel221pixel222pixel223pixel224pixel225pixel226pixel227pixel228pixel229pixel230pixel231pixel232pixel233pixel234pixel235pixel236pixel237pixel238pixel239pixel240pixel241pixel242pixel243pixel244pixel245pixel246pixel247pixel248pixel249pixel250pixel251pixel252pixel253pixel254pixel255pixel256pixel257pixel258pixel259pixel260pixel261pixel262pixel263pixel264pixel265pixel266pixel267pixel268pixel269pixel270pixel271pixel272pixel273pixel274pixel275pixel276pixel277pixel278pixel279pixel280pixel281pixel282pixel283pixel284pixel285pixel286pixel287pixel288pixel289pixel290pixel291pixel292pixel293pixel294pixel295pixel296pixel297pixel298pixel299pixel300pixel301pixel302pixel303pixel304pixel305pixel306pixel307pixel308pixel309pixel310pixel311pixel312pixel313pixel314pixel315pixel316pixel317pixel318pixel319pixel320pixel321pixel322pixel323pixel324pixel325pixel326pixel327pixel328pixel329pixel330pixel331pixel332pixel333pixel334pixel335pixel336pixel337pixel338pixel339pixel340pixel341pixel342pixel343pixel344pixel345pixel346pixel347pixel348pixel349pixel350pixel351pixel352pixel353pixel354pixel355pixel356pixel357pixel358pixel359pixel360pixel361pixel362pixel363pixel364pixel365pixel366pixel367pixel368pixel369pixel370pixel371pixel372pixel373pixel374pixel375pixel376pixel377pixel378pixel379pixel380pixel381pixel382pixel383pixel384pixel385pixel386pixel387pixel388pixel389pixel390pixel391pixel392pixel393pixel394pixel395pixel396pixel397pixel398pixel399pixel400pixel401pixel402pixel403pixel404pixel405pixel406pixel407pixel408pixel409pixel410pixel411pixel412pixel413pixel414pixel415pixel416pixel417pixel418pixel419pixel420pixel421pixel422pixel423pixel424pixel425pixel426pixel427pixel428pixel429pixel430pixel431pixel432pixel433pixel434pixel435pixel436pixel437pixel438pixel439pixel440pixel441pixel442pixel443pixel444pixel445pixel446pixel447pixel448pixel449pixel450pixel451pixel452pixel453pixel454pixel455pixel456pixel457pixel458pixel459pixel460pixel461pixel462pixel463pixel464pixel465pixel466pixel467pixel468pixel469pixel470pixel471pixel472pixel473pixel474pixel475pixel476pixel477pixel478pixel479pixel480pixel481pixel482pixel483pixel484pixel485pixel486pixel487pixel488pixel489pixel490pixel491pixel492pixel493pixel494pixel495pixel496pixel497pixel498pixel499pixel500pixel501pixel502pixel503pixel504pixel505pixel506pixel507pixel508pixel509pixel510pixel511pixel512pixel513pixel514pixel515pixel516pixel517pixel518pixel519pixel520pixel521pixel522pixel523pixel524pixel525pixel526pixel527pixel528pixel529pixel530pixel531pixel532pixel533pixel534pixel535pixel536pixel537pixel538pixel539pixel540pixel541pixel542pixel543pixel544pixel545pixel546pixel547pixel548pixel549pixel550pixel551pixel552pixel553pixel554pixel555pixel556pixel557pixel558pixel559pixel560pixel561pixel562pixel563pixel564pixel565pixel566pixel567pixel568pixel569pixel570pixel571pixel572pixel573pixel574pixel575pixel576pixel577pixel578pixel579pixel580pixel581pixel582pixel583pixel584pixel585pixel586pixel587pixel588pixel589pixel590pixel591pixel592pixel593pixel594pixel595pixel596pixel597pixel598pixel599pixel600pixel601pixel602pixel603pixel604pixel605pixel606pixel607pixel608pixel609pixel610pixel611pixel612pixel613pixel614pixel615pixel616pixel617pixel618pixel619pixel620pixel621pixel622pixel623pixel624pixel625pixel626pixel627pixel628pixel629pixel630pixel631pixel632pixel633pixel634pixel635pixel636pixel637pixel638pixel639pixel640pixel641pixel642pixel643pixel644pixel645pixel646pixel647pixel648pixel649pixel650pixel651pixel652pixel653pixel654pixel655pixel656pixel657pixel658pixel659pixel660pixel661pixel662pixel663pixel664pixel665pixel666pixel667pixel668pixel669pixel670pixel671pixel672pixel673pixel674pixel675pixel676pixel677pixel678pixel679pixel680pixel681pixel682pixel683pixel684pixel685pixel686pixel687pixel688pixel689pixel690pixel691pixel692pixel693pixel694pixel695pixel696pixel697pixel698pixel699pixel700pixel701pixel702pixel703pixel704pixel705pixel706pixel707pixel708pixel709pixel710pixel711pixel712pixel713pixel714pixel715pixel716pixel717pixel718pixel719pixel720pixel721pixel722pixel723pixel724pixel725pixel726pixel727pixel728pixel729pixel730pixel731pixel732pixel733pixel734pixel735pixel736pixel737pixel738pixel739pixel740pixel741pixel742pixel743pixel744pixel745pixel746pixel747pixel748pixel749pixel750pixel751pixel752pixel753pixel754pixel755pixel756pixel757pixel758pixel759pixel760pixel761pixel762pixel763pixel764pixel765pixel766pixel767pixel768pixel769pixel770pixel771pixel772pixel773pixel774pixel775pixel776pixel777pixel778pixel779pixel780pixel781pixel782pixel783
npartitions=2
int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64int64
................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
\n", + "
\n", + "
Dask Name: try_loc, 61 tasks
" + ], + "text/plain": [ + "Dask DataFrame Structure:\n", + " pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 pixel10 pixel11 pixel12 pixel13 pixel14 pixel15 pixel16 pixel17 pixel18 pixel19 pixel20 pixel21 pixel22 pixel23 pixel24 pixel25 pixel26 pixel27 pixel28 pixel29 pixel30 pixel31 pixel32 pixel33 pixel34 pixel35 pixel36 pixel37 pixel38 pixel39 pixel40 pixel41 pixel42 pixel43 pixel44 pixel45 pixel46 pixel47 pixel48 pixel49 pixel50 pixel51 pixel52 pixel53 pixel54 pixel55 pixel56 pixel57 pixel58 pixel59 pixel60 pixel61 pixel62 pixel63 pixel64 pixel65 pixel66 pixel67 pixel68 pixel69 pixel70 pixel71 pixel72 pixel73 pixel74 pixel75 pixel76 pixel77 pixel78 pixel79 pixel80 pixel81 pixel82 pixel83 pixel84 pixel85 pixel86 pixel87 pixel88 pixel89 pixel90 pixel91 pixel92 pixel93 pixel94 pixel95 pixel96 pixel97 pixel98 pixel99 pixel100 pixel101 pixel102 pixel103 pixel104 pixel105 pixel106 pixel107 pixel108 pixel109 pixel110 pixel111 pixel112 pixel113 pixel114 pixel115 pixel116 pixel117 pixel118 pixel119 pixel120 pixel121 pixel122 pixel123 pixel124 pixel125 pixel126 pixel127 pixel128 pixel129 pixel130 pixel131 pixel132 pixel133 pixel134 pixel135 pixel136 pixel137 pixel138 pixel139 pixel140 pixel141 pixel142 pixel143 pixel144 pixel145 pixel146 pixel147 pixel148 pixel149 pixel150 pixel151 pixel152 pixel153 pixel154 pixel155 pixel156 pixel157 pixel158 pixel159 pixel160 pixel161 pixel162 pixel163 pixel164 pixel165 pixel166 pixel167 pixel168 pixel169 pixel170 pixel171 pixel172 pixel173 pixel174 pixel175 pixel176 pixel177 pixel178 pixel179 pixel180 pixel181 pixel182 pixel183 pixel184 pixel185 pixel186 pixel187 pixel188 pixel189 pixel190 pixel191 pixel192 pixel193 pixel194 pixel195 pixel196 pixel197 pixel198 pixel199 pixel200 pixel201 pixel202 pixel203 pixel204 pixel205 pixel206 pixel207 pixel208 pixel209 pixel210 pixel211 pixel212 pixel213 pixel214 pixel215 pixel216 pixel217 pixel218 pixel219 pixel220 pixel221 pixel222 pixel223 pixel224 pixel225 pixel226 pixel227 pixel228 pixel229 pixel230 pixel231 pixel232 pixel233 pixel234 pixel235 pixel236 pixel237 pixel238 pixel239 pixel240 pixel241 pixel242 pixel243 pixel244 pixel245 pixel246 pixel247 pixel248 pixel249 pixel250 pixel251 pixel252 pixel253 pixel254 pixel255 pixel256 pixel257 pixel258 pixel259 pixel260 pixel261 pixel262 pixel263 pixel264 pixel265 pixel266 pixel267 pixel268 pixel269 pixel270 pixel271 pixel272 pixel273 pixel274 pixel275 pixel276 pixel277 pixel278 pixel279 pixel280 pixel281 pixel282 pixel283 pixel284 pixel285 pixel286 pixel287 pixel288 pixel289 pixel290 pixel291 pixel292 pixel293 pixel294 pixel295 pixel296 pixel297 pixel298 pixel299 pixel300 pixel301 pixel302 pixel303 pixel304 pixel305 pixel306 pixel307 pixel308 pixel309 pixel310 pixel311 pixel312 pixel313 pixel314 pixel315 pixel316 pixel317 pixel318 pixel319 pixel320 pixel321 pixel322 pixel323 pixel324 pixel325 pixel326 pixel327 pixel328 pixel329 pixel330 pixel331 pixel332 pixel333 pixel334 pixel335 pixel336 pixel337 pixel338 pixel339 pixel340 pixel341 pixel342 pixel343 pixel344 pixel345 pixel346 pixel347 pixel348 pixel349 pixel350 pixel351 pixel352 pixel353 pixel354 pixel355 pixel356 pixel357 pixel358 pixel359 pixel360 pixel361 pixel362 pixel363 pixel364 pixel365 pixel366 pixel367 pixel368 pixel369 pixel370 pixel371 pixel372 pixel373 pixel374 pixel375 pixel376 pixel377 pixel378 pixel379 pixel380 pixel381 pixel382 pixel383 pixel384 pixel385 pixel386 pixel387 pixel388 pixel389 pixel390 pixel391 pixel392 pixel393 pixel394 pixel395 pixel396 pixel397 pixel398 pixel399 pixel400 pixel401 pixel402 pixel403 pixel404 pixel405 pixel406 pixel407 pixel408 pixel409 pixel410 pixel411 pixel412 pixel413 pixel414 pixel415 pixel416 pixel417 pixel418 pixel419 pixel420 pixel421 pixel422 pixel423 pixel424 pixel425 pixel426 pixel427 pixel428 pixel429 pixel430 pixel431 pixel432 pixel433 pixel434 pixel435 pixel436 pixel437 pixel438 pixel439 pixel440 pixel441 pixel442 pixel443 pixel444 pixel445 pixel446 pixel447 pixel448 pixel449 pixel450 pixel451 pixel452 pixel453 pixel454 pixel455 pixel456 pixel457 pixel458 pixel459 pixel460 pixel461 pixel462 pixel463 pixel464 pixel465 pixel466 pixel467 pixel468 pixel469 pixel470 pixel471 pixel472 pixel473 pixel474 pixel475 pixel476 pixel477 pixel478 pixel479 pixel480 pixel481 pixel482 pixel483 pixel484 pixel485 pixel486 pixel487 pixel488 pixel489 pixel490 pixel491 pixel492 pixel493 pixel494 pixel495 pixel496 pixel497 pixel498 pixel499 pixel500 pixel501 pixel502 pixel503 pixel504 pixel505 pixel506 pixel507 pixel508 pixel509 pixel510 pixel511 pixel512 pixel513 pixel514 pixel515 pixel516 pixel517 pixel518 pixel519 pixel520 pixel521 pixel522 pixel523 pixel524 pixel525 pixel526 pixel527 pixel528 pixel529 pixel530 pixel531 pixel532 pixel533 pixel534 pixel535 pixel536 pixel537 pixel538 pixel539 pixel540 pixel541 pixel542 pixel543 pixel544 pixel545 pixel546 pixel547 pixel548 pixel549 pixel550 pixel551 pixel552 pixel553 pixel554 pixel555 pixel556 pixel557 pixel558 pixel559 pixel560 pixel561 pixel562 pixel563 pixel564 pixel565 pixel566 pixel567 pixel568 pixel569 pixel570 pixel571 pixel572 pixel573 pixel574 pixel575 pixel576 pixel577 pixel578 pixel579 pixel580 pixel581 pixel582 pixel583 pixel584 pixel585 pixel586 pixel587 pixel588 pixel589 pixel590 pixel591 pixel592 pixel593 pixel594 pixel595 pixel596 pixel597 pixel598 pixel599 pixel600 pixel601 pixel602 pixel603 pixel604 pixel605 pixel606 pixel607 pixel608 pixel609 pixel610 pixel611 pixel612 pixel613 pixel614 pixel615 pixel616 pixel617 pixel618 pixel619 pixel620 pixel621 pixel622 pixel623 pixel624 pixel625 pixel626 pixel627 pixel628 pixel629 pixel630 pixel631 pixel632 pixel633 pixel634 pixel635 pixel636 pixel637 pixel638 pixel639 pixel640 pixel641 pixel642 pixel643 pixel644 pixel645 pixel646 pixel647 pixel648 pixel649 pixel650 pixel651 pixel652 pixel653 pixel654 pixel655 pixel656 pixel657 pixel658 pixel659 pixel660 pixel661 pixel662 pixel663 pixel664 pixel665 pixel666 pixel667 pixel668 pixel669 pixel670 pixel671 pixel672 pixel673 pixel674 pixel675 pixel676 pixel677 pixel678 pixel679 pixel680 pixel681 pixel682 pixel683 pixel684 pixel685 pixel686 pixel687 pixel688 pixel689 pixel690 pixel691 pixel692 pixel693 pixel694 pixel695 pixel696 pixel697 pixel698 pixel699 pixel700 pixel701 pixel702 pixel703 pixel704 pixel705 pixel706 pixel707 pixel708 pixel709 pixel710 pixel711 pixel712 pixel713 pixel714 pixel715 pixel716 pixel717 pixel718 pixel719 pixel720 pixel721 pixel722 pixel723 pixel724 pixel725 pixel726 pixel727 pixel728 pixel729 pixel730 pixel731 pixel732 pixel733 pixel734 pixel735 pixel736 pixel737 pixel738 pixel739 pixel740 pixel741 pixel742 pixel743 pixel744 pixel745 pixel746 pixel747 pixel748 pixel749 pixel750 pixel751 pixel752 pixel753 pixel754 pixel755 pixel756 pixel757 pixel758 pixel759 pixel760 pixel761 pixel762 pixel763 pixel764 pixel765 pixel766 pixel767 pixel768 pixel769 pixel770 pixel771 pixel772 pixel773 pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783\n", + "npartitions=2 \n", + " int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64 int64\n", + " ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", + " ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", + "Dask Name: try_loc, 61 tasks" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } ], "source": [ - "res" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercise\n", + "# With pandas\n", + "# pixels = df1.loc[:, ['pixel' in c for c in df1.columns]]\n", + "pixels = df1.loc[:, 'pixel1':'pixel783']\n", + "pixels\n", + "df1['sum']=pixels.sum(axis=1)\n", + "df1['sum']\n", + "# task = df1[['label','sum']].groupby('label').mean()\n", + "df1[['label','sum']].groupby('label').mean()\n", "\n", - "- Create two Dask random arrays of size 10,000,000-by-100. \n", - "- Find the difference between the two `y = ..`\n", - "- and pass it to `array.linalg.norm` using argument `axis=1`. \n", - "- Calculate the result and create a histogram of it." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "ExecuteTime": { - "end_time": "2020-10-04T07:13:53.285755Z", - "start_time": "2020-10-04T07:13:53.281047Z" - } - }, - "outputs": [], - "source": [ - "from matplotlib.pyplot import hist" + "gg = df1[['label','sum']].groupby('label')\n", + "list(gg)[0]\n", + "# df1.loc[:, 'pixel1':'pixel783'].csum\n", + "# print(result)\n", + "\n", + "# # With dask\n", + "pixels = df2.loc[:, ['pixel' in c for c in df2.columns]]\n", + "pixels\n", + "# df2['sum']=pixels.sum(axis=1)\n", + "# task = df2[['label','sum']].groupby('label').mean()\n", + "# with ProgressBar():\n", + "# result=task.compute() \n", + "# print(result)" ] }, { "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2020-10-04T07:04:25.331001Z", - "start_time": "2020-10-04T07:04:25.308406Z" - } - }, + "metadata": {}, "source": [ - "
\n", - "

Exercise

\n", - "\n", - " Description:\n", - "\n", - "- Create two Dask random arrays of size 10,000,000-by-100. \n", - "- Find the difference between the two `y = ..`\n", - "- and pass it to `array.linalg.norm` using argument `axis=1`. \n", - "- Calculate the result and create a histogram of it.\n", - " \n", - "\n", - "
\n", - " → Hints\n", - " \n", - " Replace the question marks `?`\n", - "\n", - "```python\n", - "a = array.random.normal(size=(10000000, 100), chunks=200000)\n", - "b = array.random.normal(size=(10000000, 100), chunks=200000)\n", - "r = array.linalg.norm(?, axis=1)\n", - "r.?\n", - "```\n", - "\n", - "
\n", - "\n", - "
\n", - "
\n", - "
\n", - " \n", - " → Solution\n", - " \n", + "## When to use Dask DataFrame?\n", "\n", - " ```python\n", - " x1 = array.random.random(size=(10000000,100))\n", - " x2 = array.random.random(size=(10000000,100))\n", - " y = x2-x1\n", - " d = array.linalg.norm(y,axis=1)\n", - " with ProgressBar():\n", - " result = d.compute()\n", - " hist(result,bins=100);\n", - " ```\n", + "Lets visit [the dask page](https://docs.dask.org/en/latest/dataframe.html#common-uses-and-anti-uses) to look at when we should use it\n", "\n", - "
\n", + "It is harder so only if you dataset is larger than memory.\n", "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Delayed\n", - "Dask delayed is a method for parallelising code where you can't write your code directly as dataframe or array operation. `Dask.delayed` is an easy-to-use tool to quickly parallelise these tasks." + "If fact also consider:\n", + "- a database (if you have lots of structured queries)\n", + "- https://downloadmoreram.com/ ;p\n", + "- dask array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Consider the following functions. The first one takes an input, waits for one second and returns the value. The second function takes two inputs, waits for one second and returns the sum. We are using these functions to represent tasks that are time consuming." + "## Dask Array\n", + "Dask is not just used to replace pandas. There are also multiple numpy functions which can be replaced by Dask. Dask array is Dask equivalent of a numpy array. By doing so, we can perform the computations in parallel and get the results faster." ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 57, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:53.300877Z", - "start_time": "2020-10-04T07:13:53.289192Z" + "end_time": "2020-10-14T03:03:00.931400Z", + "start_time": "2020-10-14T03:03:00.929055Z" } }, "outputs": [], "source": [ - "from time import sleep\n", - "\n", - "\n", - "def task1(x):\n", - " sleep(1)\n", - " return x\n", - "\n", - "\n", - "def task2(x, y):\n", - " sleep(1)\n", - " return x + y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, if we pass two values separately into the first function and then pass the results into the second function, we will have the following code:" + "from dask import array" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 58, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:56.315870Z", - "start_time": "2020-10-04T07:13:53.304926Z" + "end_time": "2020-10-14T03:03:01.407137Z", + "start_time": "2020-10-14T03:03:01.400443Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.81 ms, sys: 74 µs, total: 4.89 ms\n", - "Wall time: 3 s\n" - ] - } - ], - "source": [ - "%%time\n", - "x1 = task1(1)\n", - "x2 = task1(2)\n", - "y = task2(x1,x2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, + "outputs": [], "source": [ - "Since each of these functions are taking one second; therefore, the entire block takes three seconds. But the calculation for `x1` is totally independent of the calculation for `x2`. If we were able to do these operation simultaneously we could save time. This is where `Dask.delayed` comes into play. We need to convert the functions into `delayed` functions so Dask can handle parallelisation." + "big_array = array.random.normal(size=(10000000, 100), chunks=200000)" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 59, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:56.325303Z", - "start_time": "2020-10-04T07:13:56.319479Z" + "end_time": "2020-10-14T03:03:01.852375Z", + "start_time": "2020-10-14T03:03:01.846761Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Array Chunk
Bytes 8.00 GB 160.00 MB
Shape (10000000, 100) (200000, 100)
Count 50 Tasks 50 Chunks
Type float64 numpy.ndarray
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " 100\n", + " 10000000\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "task1_delayed = dask.delayed(task1)\n", - "task2_delayed = dask.delayed(task2)" + "big_array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "And now instead of the original function we use the delayed functions:" + "This data takes 8 GB if we wanted to store it in RAM. But Dask only generates the numbers in chunks when it needs them. So at each steps it has to deal with a chunk which is ~160 MB in this case." ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 60, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:56.338070Z", - "start_time": "2020-10-04T07:13:56.329559Z" + "end_time": "2020-10-14T03:04:16.237275Z", + "start_time": "2020-10-14T03:04:06.749275Z" } }, "outputs": [ @@ -1500,96 +9029,113 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 524 µs, sys: 0 ns, total: 524 µs\n", - "Wall time: 465 µs\n" + "[########################################] | 100% Completed | 9.5s\n" ] } ], "source": [ - "%%time\n", - "x1 = task1_delayed(1)\n", - "x2 = task1_delayed(2)\n", - "y = task2_delayed(x1,x2)" + "task = (big_array * big_array).mean(axis=1)\n", + "with ProgressBar():\n", + " res = task.compute()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can set the chunk size:" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 61, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:13:58.355308Z", - "start_time": "2020-10-04T07:13:56.341660Z" + "end_time": "2020-10-14T03:04:50.034869Z", + "start_time": "2020-10-14T03:04:50.028940Z" } }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 5.72 ms, sys: 0 ns, total: 5.72 ms\n", - "Wall time: 2 s\n" - ] - }, { "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Array Chunk
Bytes 8.00 GB 419.43 MB
Shape (10000000, 100) (524288, 100)
Count 20 Tasks 20 Chunks
Type float64 numpy.ndarray
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " 100\n", + " 10000000\n", + "\n", + "
" + ], "text/plain": [ - "3" + "dask.array" ] }, - "execution_count": 36, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "%%time\n", - "y.compute()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we saved one second! `x1` and `x2` where calculated in parallel, and then `y` was calculated using `x1` and `x2`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can directly create delayed functions using `dask.delayed` decorator." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "ExecuteTime": { - "end_time": "2020-10-04T07:13:58.365973Z", - "start_time": "2020-10-04T07:13:58.358782Z" - } - }, - "outputs": [], - "source": [ - "@dask.delayed\n", - "def task1(x):\n", - " sleep(1)\n", - " return x\n", - "\n", - "\n", - "@dask.delayed\n", - "def task2(x, y):\n", - " sleep(1)\n", - " return x + y" + "big_array = array.random.normal(size=(10000000, 100), chunks=(2 ** 19, 100))\n", + "big_array" ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 62, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:00.383619Z", - "start_time": "2020-10-04T07:13:58.369716Z" + "end_time": "2020-10-14T03:05:01.836720Z", + "start_time": "2020-10-14T03:04:51.480886Z" } }, "outputs": [ @@ -1597,239 +9143,294 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.85 ms, sys: 3.8 ms, total: 5.65 ms\n", - "Wall time: 2 s\n" + "[########################################] | 100% Completed | 10.3s\n" ] - }, - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "%%time\n", - "x1 = task1(1)\n", - "x2 = task1(2)\n", - "y = task2(x1,x2)\n", - "y.compute()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Introduction to Numba" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## What is Numba?\n", - "\n", - "Numba is a **just-in-time**, **type-specializing**, **function compiler** for accelerating **numerically-focused** Python. That's a long list, so let's break down those terms:\n", - "\n", - " * **function compiler**: Numba compiles Python functions, not entire applications, and not parts of functions. Numba does not replace your Python interpreter, but is just another Python module that can turn a function into a (usually) faster function. \n", - " * **type-specializing**: Numba speeds up your function by generating a specialized implementation for the specific data types you are using. Python functions are designed to operate on generic data types, which makes them very flexible, but also very slow. In practice, you only will call a function with a small number of argument types, so Numba will generate a fast implementation for each set of types.\n", - " * **just-in-time**: Numba translates functions when they are first called. This ensures the compiler knows what argument types you will be using. This also allows Numba to be used interactively in a Jupyter notebook just as easily as a traditional application\n", - " * **numerically-focused**: Currently, Numba is focused on numerical data types, like `int`, `float`, and `complex`. There is very limited string processing support, and many string use cases are not going to work well on the GPU. To get best results with Numba, you will likely be using NumPy arrays.\n" + "task = (big_array * big_array).mean(axis=1)\n", + "with ProgressBar():\n", + " res = task.compute()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### First Steps\n", - "\n", - "Let's write our first Numba function and compile it for the **CPU**. The Numba compiler is typically enabled by applying a *decorator* to a Python function. Decorators are functions that transform Python functions. Here we will use the CPU compilation decorator:" + "We can also apply most of common numpy functions to the array." ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 63, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:01.058402Z", - "start_time": "2020-10-04T07:14:00.387277Z" + "end_time": "2020-10-14T03:05:16.433299Z", + "start_time": "2020-10-14T03:05:01.838300Z" } }, - "outputs": [], - "source": [ - "from numba import jit\n", - "import math\n", - "\n", - "\n", - "@jit\n", - "def hypot(x, y):\n", - " # Implementation from https://en.wikipedia.org/wiki/Hypot\n", - " x = abs(x)\n", - " y = abs(y)\n", - " t = min(x, y)\n", - " x = max(x, y)\n", - " t = t / x\n", - " return x * math.sqrt(1 + t * t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[########################################] | 100% Completed | 14.6s\n" + ] + } + ], "source": [ - "The above code is equivalent to writing:\n", - "``` python\n", - "def hypot(x, y):\n", - " x = abs(x);\n", - " y = abs(y);\n", - " t = min(x, y);\n", - " x = max(x, y);\n", - " t = t / x;\n", - " return x * math.sqrt(1+t*t)\n", - " \n", - "hypot = jit(hypot)\n", - "```\n", - "This means that the Numba compiler is just a function you can call whenever you want!\n", - "\n", - "Let's try out our hypotenuse calculation:" + "task = np.sin(big_array).mean(axis=0)\n", + "with ProgressBar():\n", + " res = task.compute()" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 64, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:01.282029Z", - "start_time": "2020-10-04T07:14:01.061236Z" + "end_time": "2020-10-14T03:05:16.439009Z", + "start_time": "2020-10-14T03:05:16.435073Z" } }, "outputs": [ { "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Array Chunk
Bytes 800 B 800 B
Shape (100,) (100,)
Count 68 Tasks 1 Chunks
Type float64 numpy.ndarray
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " 100\n", + " 1\n", + "\n", + "
" + ], "text/plain": [ - "5.0" + "dask.array" ] }, - "execution_count": 40, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" - } - ], - "source": [ - "hypot(3.0, 4.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, + } + ], "source": [ - "The first time we call `hypot`, the compiler is triggered and compiles a machine code implementation for float inputs. Numba also saves the original Python implementation of the function in the `.py_func` attribute, so we can call the original Python code to make sure we get the same answer:" + "task" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 65, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:01.289853Z", - "start_time": "2020-10-04T07:14:01.284540Z" + "end_time": "2020-10-14T03:05:16.506778Z", + "start_time": "2020-10-14T03:05:16.440443Z" } }, "outputs": [ { "data": { "text/plain": [ - "5.0" + "array([-4.96623569e-05, -9.21618151e-05, 1.77109021e-04, 2.67433735e-04,\n", + " -4.54797760e-05, 2.92740013e-04, 1.02261515e-04, -2.70215806e-04,\n", + " 5.37307664e-04, 2.86031036e-04, -6.97538808e-06, -3.66262279e-05,\n", + " 6.74122747e-05, 1.83273347e-04, 2.11252086e-04, 1.64897837e-04,\n", + " 3.59514362e-05, 1.71063759e-04, -9.70854531e-05, -1.43783037e-04,\n", + " -2.34059994e-04, 1.52175767e-04, -1.31447779e-04, 3.49086909e-04,\n", + " 4.92961515e-05, -6.34444433e-04, -5.88597059e-05, 2.33904797e-05,\n", + " 1.43739722e-04, 2.98193817e-04, -3.17477335e-05, -2.08925932e-04,\n", + " 2.05396399e-04, 6.85760116e-05, 1.15092378e-04, 1.36169168e-05,\n", + " -3.61674345e-04, 2.09824264e-04, -1.25670866e-04, 2.50631214e-04,\n", + " 4.12638901e-06, -3.03833410e-04, -6.33738351e-05, -1.26853903e-04,\n", + " 1.51523004e-04, -2.89482462e-04, -1.38021839e-04, -9.12122807e-05,\n", + " -1.00218247e-04, -4.24066366e-05, 2.81373079e-04, -1.40732558e-04,\n", + " 3.44148003e-04, 4.80461779e-04, 1.59566155e-04, -2.33837880e-04,\n", + " 1.94673201e-04, -1.12906923e-04, 1.65474798e-04, 3.24221883e-04,\n", + " -1.06062398e-04, 1.97985690e-04, -2.05774209e-04, 3.99499162e-05,\n", + " -6.56359293e-04, 1.74988815e-04, -1.26379504e-04, -1.44962937e-04,\n", + " -6.18747968e-05, 3.76777761e-04, -1.30070472e-05, 1.80178223e-04,\n", + " -1.27134975e-04, -6.65599327e-05, 7.29711967e-05, -1.86057964e-04,\n", + " -2.11766175e-04, 4.26616018e-05, 3.74094549e-04, -1.60232094e-05,\n", + " 7.24228099e-05, 2.65367915e-06, 8.58840574e-06, -1.23935576e-04,\n", + " -9.25305321e-05, -2.75633942e-04, 5.31312702e-05, 1.16043460e-04,\n", + " -4.12244514e-04, -1.11056734e-04, -7.11785755e-05, 1.73886249e-05,\n", + " -8.71786971e-05, 3.79871916e-04, 5.61180778e-05, -1.19167936e-04,\n", + " -3.42306665e-04, -1.49317602e-04, -3.93023952e-05, 6.51016327e-05])" ] }, - "execution_count": 41, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "hypot.py_func(3.0, 4.0)" + "res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Benchmarking\n", + "### Exercise\n", "\n", - "An important part of using Numba is measuring the performance of your new code. Let's see if we actually sped anything up. The easiest way to do this in the Jupyter notebook is to use the `%timeit` magic function. Let's first measure the speed of the original Python:" + "- Create two Dask random arrays of size 10,000,000-by-100. \n", + "- Find the difference between the two `y = ..`\n", + "- and pass it to `array.linalg.norm` using argument `axis=1`. \n", + "- Calculate the result and create a histogram of it." ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 31, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:10.897755Z", - "start_time": "2020-10-04T07:14:01.292519Z" + "end_time": "2020-10-04T07:13:53.285755Z", + "start_time": "2020-10-04T07:13:53.281047Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.18 µs ± 33.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" - ] + "outputs": [], + "source": [ + "from matplotlib.pyplot import hist" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-04T07:04:25.331001Z", + "start_time": "2020-10-04T07:04:25.308406Z" } - ], + }, "source": [ - "%timeit hypot.py_func(3.0, 4.0)" + "
\n", + "

Exercise

\n", + "\n", + " Description:\n", + "\n", + "- Create two Dask random arrays of size 10,000,000-by-100. \n", + "- Find the difference between the two `y = ..`\n", + "- and pass it to `array.linalg.norm` using argument `axis=1`. \n", + "- Calculate the result and create a histogram of it.\n", + " \n", + "\n", + "
\n", + " → Hints\n", + " \n", + " Replace the question marks `?`\n", + "\n", + "```python\n", + "a = array.random.normal(size=(10000000, 100), chunks=200000)\n", + "b = array.random.normal(size=(10000000, 100), chunks=200000)\n", + "r = array.linalg.norm(?, axis=1)\n", + "r.?\n", + "```\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + " \n", + " → Solution\n", + " \n", + "\n", + " ```python\n", + " x1 = array.random.random(size=(10000000,100))\n", + " x2 = array.random.random(size=(10000000,100))\n", + " y = x2-x1\n", + " d = array.linalg.norm(y,axis=1)\n", + " with ProgressBar():\n", + " result = d.compute()\n", + " plt.hist(result,bins=100);\n", + " ```\n", + "\n", + "
\n", + "\n", + "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The `%timeit` magic runs the statement many times to get an accurate estimate of the run time." + "## Delayed\n", + "Dask delayed is a method for parallelising code where you can't write your code directly as dataframe or array operation. `Dask.delayed` is an easy-to-use tool to quickly parallelise these tasks." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the following functions. The first one takes an input, waits for one second and returns the value. The second function takes two inputs, waits for one second and returns the sum. We are using these functions to represent tasks that are time consuming." ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 69, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:13.554235Z", - "start_time": "2020-10-04T07:14:10.900691Z" + "end_time": "2020-10-14T03:15:10.324957Z", + "start_time": "2020-10-14T03:15:10.321859Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "322 ns ± 8.11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" - ] - } - ], + "outputs": [], "source": [ - "%timeit hypot(3.0, 4.0)" + "from time import sleep\n", + "\n", + "\n", + "def task1(x):\n", + " sleep(1)\n", + " return x\n", + "\n", + "\n", + "def task2(x, y):\n", + " sleep(1)\n", + " return x + y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Numba did a pretty good job with this function. It's 3x faster than the pure Python version.\n", - "\n", - "Of course, the `hypot` function is already present in the Python module:" + "Now, if we pass two values separately into the first function and then pass the results into the second function, we will have the following code:" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 70, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:15.594561Z", - "start_time": "2020-10-04T07:14:13.556497Z" + "end_time": "2020-10-14T03:15:14.035901Z", + "start_time": "2020-10-14T03:15:11.029409Z" } }, "outputs": [ @@ -1837,43 +9438,54 @@ "name": "stdout", "output_type": "stream", "text": [ - "247 ns ± 1.24 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" + "CPU times: user 0 ns, sys: 2.15 ms, total: 2.15 ms\n", + "Wall time: 3 s\n" ] } ], "source": [ - "%timeit math.hypot(3.0, 4.0)" + "%%time\n", + "x1 = task1(1)\n", + "x2 = task1(2)\n", + "y = task2(x1,x2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Python's built-in is even faster than Numba! This is because Numba does introduce some overhead to each function call that is larger than the function call overhead of Python itself. Extremely fast functions (like the above one) will be hurt by this.\n", - "\n", - "(However, if you call one Numba function from another one, there is very little function overhead, sometimes even zero if the compiler inlines the function into the other one.)" + "Since each of these functions are taking one second; therefore, the entire block takes three seconds. But the calculation for `x1` is totally independent of the calculation for `x2`. If we were able to do these operation simultaneously we could save time. This is where `Dask.delayed` comes into play. We need to convert the functions into `delayed` functions so Dask can handle parallelisation." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:15:30.151401Z", + "start_time": "2020-10-14T03:15:30.148783Z" + } + }, + "outputs": [], + "source": [ + "task1_delayed = dask.delayed(task1)\n", + "task2_delayed = dask.delayed(task2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### How does Numba work?\n", - "\n", - "The first time we called our Numba-wrapped `hypot` function, the following process was initiated:\n", - "\n", - "![Numba Flowchart](img/numba_flowchart.png \"The compilation process\")\n", - "\n", - "We can see the result of type inference by using the `.inspect_types()` method, which prints an annotated version of the source code:" + "And now instead of the original function we use the delayed functions:" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 72, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:15.605026Z", - "start_time": "2020-10-04T07:14:15.598417Z" + "end_time": "2020-10-14T03:16:02.623513Z", + "start_time": "2020-10-14T03:16:02.619917Z" } }, "outputs": [ @@ -1881,407 +9493,739 @@ "name": "stdout", "output_type": "stream", "text": [ - "hypot (float64, float64)\n", - "--------------------------------------------------------------------------------\n", - "# File: \n", - "# --- LINE 5 --- \n", - "# label 0\n", - "\n", - "@jit\n", - "\n", - "# --- LINE 6 --- \n", - "\n", - "def hypot(x, y):\n", - "\n", - " # --- LINE 7 --- \n", - "\n", - " # Implementation from https://en.wikipedia.org/wiki/Hypot\n", - "\n", - " # --- LINE 8 --- \n", - " # x = arg(0, name=x) :: float64\n", - " # y = arg(1, name=y) :: float64\n", - " # $0.1 = global(abs: ) :: Function()\n", - " # $0.3 = call $0.1(x, func=$0.1, args=[Var(x, (8))], kws=(), vararg=None) :: (float64,) -> float64\n", - " # del x\n", - " # del $0.1\n", - " # x.1 = $0.3 :: float64\n", - " # del $0.3\n", - "\n", - " x = abs(x)\n", - "\n", - " # --- LINE 9 --- \n", - " # $0.4 = global(abs: ) :: Function()\n", - " # $0.6 = call $0.4(y, func=$0.4, args=[Var(y, (8))], kws=(), vararg=None) :: (float64,) -> float64\n", - " # del y\n", - " # del $0.4\n", - " # y.1 = $0.6 :: float64\n", - " # del $0.6\n", - "\n", - " y = abs(y)\n", - "\n", - " # --- LINE 10 --- \n", - " # $0.7 = global(min: ) :: Function()\n", - " # $0.10 = call $0.7(x.1, y.1, func=$0.7, args=[Var(x.1, (8)), Var(y.1, (9))], kws=(), vararg=None) :: (float64, float64) -> float64\n", - " # del $0.7\n", - " # t = $0.10 :: float64\n", - " # del $0.10\n", - "\n", - " t = min(x, y)\n", - "\n", - " # --- LINE 11 --- \n", - " # $0.11 = global(max: ) :: Function()\n", - " # $0.14 = call $0.11(x.1, y.1, func=$0.11, args=[Var(x.1, (8)), Var(y.1, (9))], kws=(), vararg=None) :: (float64, float64) -> float64\n", - " # del y.1\n", - " # del x.1\n", - " # del $0.11\n", - " # x.2 = $0.14 :: float64\n", - " # del $0.14\n", - "\n", - " x = max(x, y)\n", - "\n", - " # --- LINE 12 --- \n", - " # $0.17 = t / x.2 :: float64\n", - " # del t\n", - " # t.1 = $0.17 :: float64\n", - " # del $0.17\n", - "\n", - " t = t / x\n", - "\n", - " # --- LINE 13 --- \n", - " # $0.19 = global(math: ) :: Module()\n", - " # $0.20 = getattr(value=$0.19, attr=sqrt) :: Function()\n", - " # del $0.19\n", - " # $const0.21 = const(int, 1) :: Literal[int](1)\n", - " # $0.24 = t.1 * t.1 :: float64\n", - " # del t.1\n", - " # $0.25 = $const0.21 + $0.24 :: float64\n", - " # del $const0.21\n", - " # del $0.24\n", - " # $0.26 = call $0.20($0.25, func=$0.20, args=[Var($0.25, (13))], kws=(), vararg=None) :: (float64,) -> float64\n", - " # del $0.25\n", - " # del $0.20\n", - " # $0.27 = x.2 * $0.26 :: float64\n", - " # del x.2\n", - " # del $0.26\n", - " # $0.28 = cast(value=$0.27) :: float64\n", - " # del $0.27\n", - " # return $0.28\n", - "\n", - " return x * math.sqrt(1 + t * t)\n", - "\n", - "\n", - "================================================================================\n" + "CPU times: user 522 µs, sys: 75 µs, total: 597 µs\n", + "Wall time: 439 µs\n" ] } ], "source": [ - "hypot.inspect_types()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that Numba's type names tend to mirror the NumPy type names, so a Python `float` is a `float64` (also called \"double precision\" in other languages). Taking a look at the data types can sometimes be important in GPU code because the performance of `float32` and `float64` computations will be very different on CUDA devices. An accidental upcast can dramatically slow down a function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### When Things Go Wrong\n", - "\n", - "Numba cannot compile all Python code. Some functions don't have a Numba-translation, and some kinds of Python types can't be efficiently compiled at all (yet). For example, Numba does not support `FrozenSet` (as of this tutorial):" + "%%time\n", + "x1 = task1_delayed(1)\n", + "x2 = task1_delayed(2)\n", + "y = task2_delayed(x1,x2)" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 73, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:15.680101Z", - "start_time": "2020-10-04T07:14:15.607250Z" - }, - "scrolled": true + "end_time": "2020-10-14T03:16:05.539712Z", + "start_time": "2020-10-14T03:16:03.532253Z" + } }, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - ":1: NumbaWarning: \u001b[1m\n", - "Compilation is falling back to object mode WITH looplifting enabled because Function \"cannot_compile\" failed type inference due to: \u001b[1m\u001b[1mnon-precise type pyobject\u001b[0m\n", - "\u001b[0m\u001b[1m[1] During: typing of argument at (3)\u001b[0m\n", - "\u001b[1m\n", - "File \"\", line 3:\u001b[0m\n", - "\u001b[1mdef cannot_compile(x):\n", - "\u001b[1m return \"a\" in x\n", - "\u001b[0m \u001b[1m^\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - " @jit\n", - "/home/wassname/.pyenv/versions/jup3.7.3/lib/python3.7/site-packages/numba/object_mode_passes.py:178: NumbaWarning: \u001b[1mFunction \"cannot_compile\" was compiled in object mode without forceobj=True.\n", - "\u001b[1m\n", - "File \"\", line 2:\u001b[0m\n", - "\u001b[1m@jit\n", - "\u001b[1mdef cannot_compile(x):\n", - "\u001b[0m\u001b[1m^\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - " state.func_ir.loc))\n", - "/home/wassname/.pyenv/versions/jup3.7.3/lib/python3.7/site-packages/numba/object_mode_passes.py:187: NumbaDeprecationWarning: \u001b[1m\n", - "Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour.\n", - "\n", - "For more information visit http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit\n", - "\u001b[1m\n", - "File \"\", line 2:\u001b[0m\n", - "\u001b[1m@jit\n", - "\u001b[1mdef cannot_compile(x):\n", - "\u001b[0m\u001b[1m^\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - " warnings.warn(errors.NumbaDeprecationWarning(msg, state.func_ir.loc))\n" + "CPU times: user 2.72 ms, sys: 394 µs, total: 3.11 ms\n", + "Wall time: 2 s\n" ] }, { "data": { "text/plain": [ - "True" + "3" ] }, - "execution_count": 46, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "@jit\n", - "def cannot_compile(x):\n", - " return \"a\" in x\n", - "\n", - "\n", - "cannot_compile(frozenset((\"a\", \"b\", \"c\")))" + "%%time\n", + "y.compute()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Wait, what happened?? By default, Numba will fall back to a mode, called \"object mode,\" which does not do type-specialization. Object mode exists to enable other Numba functionality, but in many cases, you want Numba to tell you if type inference fails. You can force \"nopython mode\" (the other compilation mode) by passing arguments to the decorator:" + "And we saved one second! `x1` and `x2` where calculated in parallel, and then `y` was calculated using `x1` and `x2`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can directly create delayed functions using `dask.delayed` decorator." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:19:36.667741Z", + "start_time": "2020-10-14T03:19:36.664494Z" + } + }, + "outputs": [], + "source": [ + "@dask.delayed\n", + "def task1(x):\n", + " sleep(1)\n", + " return x\n", + "\n", + "\n", + "@dask.delayed\n", + "def task2(x, y):\n", + " sleep(1)\n", + " return x + y" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 75, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:15.702891Z", - "start_time": "2020-10-04T07:14:15.683207Z" - }, - "scrolled": true + "end_time": "2020-10-14T03:19:44.870446Z", + "start_time": "2020-10-14T03:19:42.862419Z" + } }, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "ERROR:root:Failed in nopython mode pipeline (step: nopython frontend)\n", - "\u001b[1m\u001b[1mnon-precise type pyobject\u001b[0m\n", - "\u001b[0m\u001b[1m[1] During: typing of argument at (3)\u001b[0m\n", - "\u001b[1m\n", - "File \"\", line 3:\u001b[0m\n", - "\u001b[1mdef cannot_compile(x):\n", - "\u001b[1m return \"a\" in x\n", - "\u001b[0m \u001b[1m^\u001b[0m\u001b[0m\n", - "\n", - "This error may have been caused by the following argument(s):\n", - "- argument 0: \u001b[1mcannot determine Numba type of \u001b[0m\n", - "\n", - "This is not usually a problem with Numba itself but instead often caused by\n", - "the use of unsupported features or an issue in resolving types.\n", - "\n", - "To see Python/NumPy features supported by the latest release of Numba visit:\n", - "http://numba.pydata.org/numba-doc/latest/reference/pysupported.html\n", - "and\n", - "http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html\n", - "\n", - "For more information about typing errors and how to debug them visit:\n", - "http://numba.pydata.org/numba-doc/latest/user/troubleshoot.html#my-code-doesn-t-compile\n", - "\n", - "If you think your code should work with Numba, please report the error message\n", - "and traceback, along with a minimal reproducer at:\n", - "https://github.com/numba/numba/issues/new\n", - "Traceback (most recent call last):\n", - " File \"\", line 6, in \n", - " cannot_compile(frozenset((\"a\", \"b\", \"c\")))\n", - " File \"/home/wassname/.pyenv/versions/jup3.7.3/lib/python3.7/site-packages/numba/dispatcher.py\", line 401, in _compile_for_args\n", - " error_rewrite(e, 'typing')\n", - " File \"/home/wassname/.pyenv/versions/jup3.7.3/lib/python3.7/site-packages/numba/dispatcher.py\", line 344, in error_rewrite\n", - " reraise(type(e), e, None)\n", - " File \"/home/wassname/.pyenv/versions/jup3.7.3/lib/python3.7/site-packages/numba/six.py\", line 668, in reraise\n", - " raise value.with_traceback(tb)\n", - "numba.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)\n", - "\u001b[1m\u001b[1mnon-precise type pyobject\u001b[0m\n", - "\u001b[0m\u001b[1m[1] During: typing of argument at (3)\u001b[0m\n", - "\u001b[1m\n", - "File \"\", line 3:\u001b[0m\n", - "\u001b[1mdef cannot_compile(x):\n", - "\u001b[1m return \"a\" in x\n", - "\u001b[0m \u001b[1m^\u001b[0m\u001b[0m\n", - "\n", - "This error may have been caused by the following argument(s):\n", - "- argument 0: \u001b[1mcannot determine Numba type of \u001b[0m\n", - "\n", - "This is not usually a problem with Numba itself but instead often caused by\n", - "the use of unsupported features or an issue in resolving types.\n", - "\n", - "To see Python/NumPy features supported by the latest release of Numba visit:\n", - "http://numba.pydata.org/numba-doc/latest/reference/pysupported.html\n", - "and\n", - "http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html\n", - "\n", - "For more information about typing errors and how to debug them visit:\n", - "http://numba.pydata.org/numba-doc/latest/user/troubleshoot.html#my-code-doesn-t-compile\n", - "\n", - "If you think your code should work with Numba, please report the error message\n", - "and traceback, along with a minimal reproducer at:\n", - "https://github.com/numba/numba/issues/new\n", - "\n" + "CPU times: user 3.28 ms, sys: 475 µs, total: 3.75 ms\n", + "Wall time: 2 s\n" ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "@jit(nopython=True)\n", - "def cannot_compile(x):\n", - " return \"a\" in x\n", - "\n", - "try:\n", - " cannot_compile(frozenset((\"a\", \"b\", \"c\")))\n", - "except Exception as e:\n", - " logging.exception(e)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we get an exception when Numba tries to compile the function, with an error that says:\n", - "```\n", - "- argument 0: cannot determine Numba type of \n", - "```\n", - "which is the underlying problem. Numba doesn't know about frozenset. There are classes that we use regularly in our code but they might not be defined in Numba. An example of a common class that you cannot use in Numba is pandas data frames.
Now the question is: what does Numba support? Some of the types/classes that are supported by Numba are listed below:\n", - "* Numbers (integers, floats, etc)\n", - "* Numpy arrays\n", - "* Strings\n", - "* Lists and tuples (note that a list/tuple of numbers or strings is supported but a list of lists is not)" + "%%time\n", + "x1 = task1(1)\n", + "x2 = task1(2)\n", + "y = task2(x1,x2)\n", + "y.compute()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "So, if we want the last example to be compiled successfully by Numba jit, we need to use a tuple or a list." + "# Xarray\n", + "\n", + "Xarray is pandas for N-dimensional data. It also has a [dask backend](http://xarray.pydata.org/en/stable/dask.html)" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 77, "metadata": { "ExecuteTime": { - "end_time": "2020-10-04T07:14:16.550823Z", - "start_time": "2020-10-04T07:14:15.708748Z" + "end_time": "2020-10-14T03:25:15.644058Z", + "start_time": "2020-10-14T03:25:15.588851Z" } }, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:  (time: 36, x: 275, y: 205)\n",
+       "Coordinates:\n",
+       "  * time     (time) object 1980-09-16 12:00:00 ... 1983-08-17 00:00:00\n",
+       "    xc       (y, x) float64 dask.array<chunksize=(205, 275), meta=np.ndarray>\n",
+       "    yc       (y, x) float64 dask.array<chunksize=(205, 275), meta=np.ndarray>\n",
+       "Dimensions without coordinates: x, y\n",
+       "Data variables:\n",
+       "    Tair     (time, y, x) float64 dask.array<chunksize=(10, 205, 275), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    title:                     /workspace/jhamman/processed/R1002RBRxaaa01a/l...\n",
+       "    institution:               U.W.\n",
+       "    source:                    RACM R1002RBRxaaa01a\n",
+       "    output_frequency:          daily\n",
+       "    output_mode:               averaged\n",
+       "    convention:                CF-1.4\n",
+       "    references:                Based on the initial model of Liang et al., 19...\n",
+       "    comment:                   Output from the Variable Infiltration Capacity...\n",
+       "    nco_openmp_thread_number:  1\n",
+       "    NCO:                       netCDF Operators version 4.7.9 (Homepage = htt...\n",
+       "    history:                   Fri Aug  7 17:57:38 2020: ncatted -a bounds,,d...
" + ], "text/plain": [ - "True" + "\n", + "Dimensions: (time: 36, x: 275, y: 205)\n", + "Coordinates:\n", + " * time (time) object 1980-09-16 12:00:00 ... 1983-08-17 00:00:00\n", + " xc (y, x) float64 dask.array\n", + " yc (y, x) float64 dask.array\n", + "Dimensions without coordinates: x, y\n", + "Data variables:\n", + " Tair (time, y, x) float64 dask.array\n", + "Attributes:\n", + " title: /workspace/jhamman/processed/R1002RBRxaaa01a/l...\n", + " institution: U.W.\n", + " source: RACM R1002RBRxaaa01a\n", + " output_frequency: daily\n", + " output_mode: averaged\n", + " convention: CF-1.4\n", + " references: Based on the initial model of Liang et al., 19...\n", + " comment: Output from the Variable Infiltration Capacity...\n", + " nco_openmp_thread_number: 1\n", + " NCO: netCDF Operators version 4.7.9 (Homepage = htt...\n", + " history: Fri Aug 7 17:57:38 2020: ncatted -a bounds,,d..." ] }, - "execution_count": 48, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "@jit(nopython=True)\n", - "def can_compile(x):\n", - " return \"a\" in x\n", - "\n", - "\n", - "can_compile((\"a\", \"b\", \"c\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercise\n", - "Gregory–Leibniz infinite series converges to $\\pi$:\n", - "$$\\pi = \\frac{4}{1} - \\frac{4}{3} + \\frac{4}{5} - \\frac{4}{7} + \\frac{4}{9} - \\frac{4}{11} + \\frac{4}{13} - \\cdots$$\n", - "\n", - "Write a Numba function which calculates the sum of first $n$ terms in this series. Then test its speed agains normal Python function for $ n = 1000000$." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "ExecuteTime": { - "end_time": "2020-10-04T07:14:16.556883Z", - "start_time": "2020-10-04T07:14:16.553515Z" - } - }, - "outputs": [], - "source": [ - "# Code Here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
Solution\n", - "\n", - "```Python\n", - " @jit\n", - " def gl_pi(n):\n", - " pi = 0\n", - " for i in range(n):\n", - " if i%2 ==0:\n", - " pi += 4/(2*i+1)\n", - " else:\n", - " pi -= 4/(2*i+1)\n", - " return pi \n", - "```\n", - "\n", - "Numba function speed test:\n", - "```Python\n", - " %timeit gl_pi(1000000) \n", - "```\n", - " \n", - "Normal Python function speed test:\n", - "```Python\n", - " %timeit gl_pi.py_func(1000000) \n", - "```\n", - " \n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Xarray\n", + "%matplotlib inline\n", + "import numpy as np\n", + "import pandas as pd\n", + "import xarray as xr\n", + "import matplotlib.pyplot as plt\n", "\n", - "Xarray is pandas for N-dimensional data. It also has a [dask backend](http://xarray.pydata.org/en/stable/dask.html)" + "ds = xr.tutorial.open_dataset('rasm').load().chunk(dict(time=10))\n", + "ds" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 79, "metadata": { "ExecuteTime": { - "end_time": "2020-10-13T11:22:29.816836Z", - "start_time": "2020-10-13T11:22:28.707555Z" + "end_time": "2020-10-14T03:26:30.730070Z", + "start_time": "2020-10-14T03:26:30.473977Z" } }, "outputs": [ @@ -2639,61 +10583,26 @@ " fill: currentColor;\n", "}\n", "
<xarray.Dataset>\n",
-       "Dimensions:  (time: 36, x: 275, y: 205)\n",
+       "Dimensions:  (x: 275, y: 205)\n",
        "Coordinates:\n",
-       "  * time     (time) object 1980-09-16 12:00:00 ... 1983-08-17 00:00:00\n",
-       "    xc       (y, x) float64 dask.array<chunksize=(205, 275), meta=np.ndarray>\n",
-       "    yc       (y, x) float64 dask.array<chunksize=(205, 275), meta=np.ndarray>\n",
-       "Dimensions without coordinates: x, y\n",
-       "Data variables:\n",
-       "    Tair     (time, y, x) float64 dask.array<chunksize=(10, 205, 275), meta=np.ndarray>\n",
-       "Attributes:\n",
-       "    title:                     /workspace/jhamman/processed/R1002RBRxaaa01a/l...\n",
-       "    institution:               U.W.\n",
-       "    source:                    RACM R1002RBRxaaa01a\n",
-       "    output_frequency:          daily\n",
-       "    output_mode:               averaged\n",
-       "    convention:                CF-1.4\n",
-       "    references:                Based on the initial model of Liang et al., 19...\n",
-       "    comment:                   Output from the Variable Infiltration Capacity...\n",
-       "    nco_openmp_thread_number:  1\n",
-       "    NCO:                       netCDF Operators version 4.7.9 (Homepage = htt...\n",
-       "    history:                   Fri Aug  7 17:57:38 2020: ncatted -a bounds,,d...
" ], "text/plain": [ - "\n", - "Dimensions: (x: 275, y: 205)\n", + "\n", + "dask.array\n", "Coordinates:\n", - " time object 1981-07-17 00:00:00\n", - " xc (y, x) float64 dask.array\n", - " yc (y, x) float64 dask.array\n", - "Dimensions without coordinates: x, y\n", - "Data variables:\n", - " Tair (y, x) float64 dask.array\n", - "Attributes:\n", - " title: /workspace/jhamman/processed/R1002RBRxaaa01a/l...\n", - " institution: U.W.\n", - " source: RACM R1002RBRxaaa01a\n", - " output_frequency: daily\n", - " output_mode: averaged\n", - " convention: CF-1.4\n", - " references: Based on the initial model of Liang et al., 19...\n", - " comment: Output from the Variable Infiltration Capacity...\n", - " nco_openmp_thread_number: 1\n", - " NCO: netCDF Operators version 4.7.9 (Homepage = htt...\n", - " history: Fri Aug 7 17:57:38 2020: ncatted -a bounds,,d..." + " * time (time) object 1980-12-31 00:00:00 ... 1983-12-31 00:00:00\n", + " xc float64 dask.array\n", + " yc float64 dask.array" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEWCAYAAACNJFuYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9e7Ak91Xn+Tm/X2ZlVd1Xv9R6WC9kW5aRbRmjwWE8eIyRLQtZao0HWJgNFiJm1svOTsxOwMbAsLNAzBOIXTaIHWDWscNrhudgI8k2srEBY8BgRpYxGiHJsvzUs6V+3L73VlVWZv5++8f5/X6ZVffe7lbrttqW60RU963MrMxfvs75nXO+53vEe89CFrKQhSxkIV0xF3oAC1nIQhaykK88WRiHhSxkIQtZyDZZGIeFLGQhC1nINlkYh4UsZCELWcg2WRiHhSxkIQtZyDZZGIeFLGQhC1nINlkYh68wEZErRWRTROyFHstCFrKQr11ZGIcLLCLyBRG5KX733n/Je7/svW8u5LhOJyLyj0XkXhEpReSXd1j/D0Xks8HIfVBELuusK0TkP4jI0yJyXETeJyIv6az/VyJyv4jUIvITZzGWq0Xkj0RkJCIPda+liPxoGEP8jEXEicihXfZ1qYjcLSJPiIgXkavn1j8wt79aRN53mrF9WxjTKIzxqs46EZGfEpFj4fPTIiLncp5h/d8XkS+KyJaI3CkiB06zr0JEflFETonIUyLyg3PrXysinwzH+qSIvHa3fS3kxSsL47CQc5EngH8N/OL8ChH5O8C/BY4AB4DPA7/R2eR/Bd4AvAa4DDgJ/D+d9Z8F/hnwgbMcy28AnwIOAv878DsichGA9/7fBkO77L1fBn4K+Kj3/tld9uWADwJ/b6eV3vvrO/taAb4E/Jedtg0G6L3A/4Feh3uB3+ps8i7gDuAG9Fq8A/ifzuU8ReR64P8Fvhe4GBgBP3+aff0E8HLgKuBbgX8mIm8P++oBdwH/GdgP/ApwV1i+kK8l8d4vPhfoA/wnVCGNgU1UKV4NeCAL23wUVcQfD9u8D1UQvwacAv4rcHVnn9cBHwaOAw8D33Uex/+vgV+eW/Z/Aj/X+X5ZOJ+Xhu+/APx0Z/2twMM77Ps/Az9xhuNfC5TASmfZnwA/sMO2AjwKfN9ZnFcWxnz1abb5O+F+LO2y/l3Axzvfl8J9vi58/zjwrs76fwD8xbmcJ2qMf72z7qXAtLv93P4eB97W+f6vgN8Mf78trJfO+i8Bb7/Q78vi88J+Fp7DBRTv/feiL95tXmekP73Lpt+Nzgpfgr74fw78EjojfRD4cQARWUINw68Dh4HvAX4+zCy3iYj8vIic3OXz1+d4WhI+3e8Arwr//0fgjSJymYgMgf8euOccj3U98Dnv/UZn2afD8nn5FnRW/Z5zPNa8fB/wO977rdOM7dPxS9ju0c7YZtYzN24Reb+I/Ehn29Od5/yxHkWNw7VhXz8iIu8Pf+9HDfZux74e+GvvfZdX56/Z+Zou5EUs2YUewELOSn4pvPCIyD3A13vvPxK+/xd05gcamviC9/6Xwvf7ROQ9wHcAD8zv1Hv/j4B/tMdj/T3gt0TkPwCPAD+GzsKHYf1nUIP4ONAA9wP/+ByPtQyszy1bR43ovERlvnmOx0oSjNp3ALefYWzP7DC2lc769bl1yyIiXuUdc/s63Xnutn4FwHv/k3P7gu3H3m1c8+sX8jUiC8/hq0Oe7vw93uF7fOGvAl7f9QDQmfklL8wwwXv/B6gn8x7gi8AXgA3gsbDJLwB9NDS2hMblz8pzmEsIfwsa1lmd22w1HK/7uwHwnWj8PC77ls6+thnOM8g70bDdH59mmzONbX79KrA5N2M/133Nr5/fV1z/fPe1kBexLIzDhZe9pMX9MvDH3vt9nc+y9/5/3mnjgBra3OXzXBVmEu/9z3nvX+69P4waiQz4b2H1DWie4rj3vkST0d+0G4Jobr8pIey9/xPUG7pGRLqz2hvY7iVFZf7Rzr7+pLOv5xoy+T7gV3dR5FEeCGMBUsjvpZ2xzazfZdzdfZ3uPOePdQ1QoF7ajHjvTwBPnubYDwCvmUNOveY0Y1vIi1QWxuHCy9PANXu0r/cD14rI94pIHj5/S0ReudPG3vsf6CjI+c+uClNEMhHpAxawItIXkSys64vIqwJU80rg3cDPBqUEmkD/H0RkTURyNKz1hA8IojDmPvpsZmF/O9Z8eO8/A/wV8ONhu7+LKrL5vMLZKPN4bn1UsQIU4Xt3/eUowudX5n87J78LvEpE/l7Yx4+hsfyHwvpfBX5QRF4iCvX9IeCXz/E8fw24LXhDS8C/BN47l6Poyq8C/0JE9ovIdcD/2Dn2R9Fw3z8JkNcY8vvDM5zvQl5scqEz4l/rHxTy+SUU0vm/sTNa6R92tp9BCAE3AZ/tfH8FCgN9BjiGvtSv3eMx/0QYY/fzE2HdPjSBuQU8Bfw7wHZ+G5FWR8M5/ynwTZ31v7zDvr//NGO5OlyjMYrOumlu/UuAGnjZWZ7b/LH93Pp/DvzJWe7rJuChMLaPMosqE+CnUY/mePi7ixC6B/jR53Cefz88R1soFPVAZ92PAvd0vhcoDPkUOjn5wbl9fQPwyXCs+4BvuNDvyeLzwn8kPAwLWchCFrKQhSRZhJUWspCFLGQh22RhHBaykIUsZCHbZGEcFrKQhSxkIdtkYRwWspCFLGQh2+SrukL60KFD/uqrr37BjnfiU59BREAgy4SIBG8aj2si8guMERqnf0PgkxAwVn/TxQCIkJaZQDyRZYLJwFiPCDS1EDlafdyX0fXGehBwjeAa0WXGzxJYhB86J7gGjAWTeaSXgQHJre7UOXztwXt82YSpg47ZTR3OCd7psZpazxsg74XzctB0roP30NS6jZs756Vlg7GerK8r66ngar22+LgfcM7jHKkapD8Uin0G6Wf4SUW14ahKwYWxxGsZDxevPdLer3nu0zhW4rh3uPc74TZ8xDOFA3X3n/YZrn33mmzbPvxjjGCkHe+24zkf4FPxGdBtbAbFsscs98B53OaU6djQv/ZlO5yJSvnIZ/XZs3rC3kkaWxyna9rn0zl95kRATBxPey4AdQV11T57+254+cwxRw9+Np3W4LqdxzZ+6LNp/67R58d5PVYEz4gIYmavX7wu8Z649C6CIHg8n2s2nvXeX7TrRTkH+Va53F/HPn7B/7ddGXW/WuWr2jhcffXV3HvvvS/Y8X579W1kuZDlwqGLMrJcle36yZqtTUddearKMxgatjYbfVHQlzjLhaVlQ1EYqrrVNNaQ9tMrBGOFAwczVg81DNcajPVsHs+YbOitcg6ynqdYahiu1gzXaiQXRsct41MZg9WawUqdXjCsQONxtTDZskw2LP2VhqVDjuzr9iF9i71sTS3TZIo7PsZXjurRk0hhwQqSW8ZfGDMdW6qJYfN4xqmTjhPHagAuv6og63kmW7BxqqGqPHXlmZaOkyfUqk1Ll845y4W/deMSywdqDrzM4UcVJ54o2Hg2x2Q61o1Tev22Nh1bm40aCODrb+hzzTsLsusupv6bJ3n6o2Oe/IJhY12Pk+dCVfm0vTG6zFghyyQd33QqJ6YTT117XONnfhvFOTX+zs1aiMaR7nGWC9YEBW9VscX7XIfrEa8LqIHOc0nPhzEwGBr6A5PGa0x3DFBOXBinHm8w1A32H8y45lumFG+4HD+eMvn44zx2/xDv4Lo/vGvHZ/nRW27D9jz9pQbnhOnYUE10f64R6qmwtdmE8xLGI8fSsiHLhd4g3NOxXkSbO7wXjj3d8NQTVRr3ygnLtz36e+mY973+dqxpdegNf759bPe/8Qi9gRqD0ZbnxLM1k7GjLP3MtS4KoVeYdI9duBdV3T57VeUZDAzG6uThO9c//MUdL8Y5ioi85mWs8XlOISKZ977ey/1faDlvxkFErkCLbS5BmUff7b3/2cAz/1sobvsLKGvoifCbf46yUzbAP/Hef+h8jS/K7+x7G72+PmSTkWqFLLy07zw2e3jnPNPSs7Ka41y7vWv0Ae0V+ru68mFW59Pv6qrdjzWqWFzwOBqny6YlZDmUpaOaGMYGXC2UW5Zp6WmcJ8+ELHdYq/veOplz6pmc6diQF456muMdFEsNWc/jSmgaffGrUj+256m2Gpq/OcF4w+L9SfLCUSzpS795POfZL/VxjWfjVMPWZkVdRW3qMHbK/oMZV720h7Eem6mCMUboFcKzR6tkOObl8qsKXvNGz9q1DrPSR/oZ9WMbPPUFy+c+M8K5WSUa5ZLLerzyGy3W1tRfKmmeHfHkfxUe/RuPczWDgaFxUM0p6/h3nGVHxWJs515Zj3HhPtpZw+Ga1ljE+9S4dp0x7d/tHFZm7rMx+rGWtA7aSUPcR+NgMnbUtcysj/uPhiE+U/FctzYbNr7kMMtHsRcPyV+6H//pEoCH3nJkRwPx0nvexyM3KzXUcLXGZrqvamJwtY5pZdViMvXqev1w/QqnXqeBzDmmY8P4FIAny4WVVct47Fha2h6xft0n7uaBN92x7d525dV/dhcP33QEY1Wxu/0ZRd8xHrlW4Q8NS8uWLJPkWc7fi6bR66f3Tq/dXss3ctGnb+ZKPsUzvI0rKrb761/Vcj49hxr4Ie/9faHs/5Mi8mHg+4E/8N7/ZGCd/BHgh0Xk61H20etR1siPiMi1/iuo6U0TRjItXVI+VeUpw6xYFU77vSvG6vo4+3SND4ppThk5nS2DYanMdDZbq1dSFIa8ULdeDEw2M576orCxXrP/UMZwTY87OqW3tQkvYVMLTaVhG5N5yi1DuVXgauHEM8JosyHLLYcuKegNHdORoa486ydqylINxGBgWFnTgWaZKgGbOwYrDVnPUU8N3lmeeKxm/cT2W7a2P+Oyy3tccrWnv1xy6hHP1kmPd1PGGz2efmKCc55eYcgyT2n0+mS5cPiSnJe9ynD4FTXPPpLx0B/3qCvPZOQwBpaWbVIC1rReQpzBZ7mkWXoxiGERn5RgnLnr77v3THBG/5+WDutmDUMMtRjbeg3xXqtIGlMrqric8+m48fcQ9l+16+YVaXx+4mw4D17nyad6wITh45tkhwcceEnF8ccLTicv/9DdfO7W23CNYHPPcLWGVX1+vNNw1WTTYIyQZ0JegM08NmgNm/l0H6JkuVC49nrvJHES9cCb7uD6j925bf0rPnIXn3nr7ZjMh/Bja2D7A93mbz/wfkC9kenE48L1i0Ygzzvvmmvf3b0SEXnNqzjAy2SNw37A/82nX3Tew3kzDt77J1EOF7z3GyLyIFqtegR4c9jsV9Cqzx8Oy3/TK9/O50Xks8A3ofTU51WKQjh4Uc5os+GJx6aMR/pQ/afiJr63/Mi27ZvOTHJ+RqJewvZZimtgOnEpXFBXOpvJUCtqi9ZITMIs6cSxOsyONOQwGETD4KkrYf2o5djRKf2hYXk1xI2dbrN1MmOwom9E9Bq8g7oyGt9v1AWPLvt47HAuvrjqlpel/j8YtBozKt1p6SmWPGJ0FukdVKVhbV/G5VepUtraVKOyfEBDZPVUx3P88YLHPwfrJ2rGI70mg4Hh4EU5daVjsbadsa+sWsR4nn0kY/2o5ckvlzRO79tgYNJ2Wa6hBmMhzzozdCtpZmxz386SMRgnyXOI3kScgRojmEKYlnq957MR84bBzJF8mOApOBcmAQ5MMGLzk8z4TEUjEUNSs15Mu61pSArRWChHwvHHC9aP9ti/VbK0v2Hj2ZyzkcmWZbDS0F9WvRZDkmI8NreM1jNs3j57JnitYmiNa3gmotdclp63fv73djvkttDdvFz7YfUyjIGi0MlK0TcpNBjFGiHLNd+R5dBzJniAOpboce21RK8BYFV6fL3f/6LzHl6QnINou8VvAD4BXBwMB977J0XkcNjsJcBfdH72GDtQL4vIu9BGKlx55ZXPe2zfcfL3Afj0G47wdV8PF18+5IFPTdja1DfxvQdvTuGlolBFvbRkwozNk2VCUZjk/ueZYEyTfh8legRZZ0YTZ8Y6S2wVcFVp+KqqPNYSXohM49GF4J1QTYTjx2rGY8f+gxlZTxV1PTV4L4jozNj2Qgz/uGE8cmhYSI8zLX1K5Bqj5zMtVam7Rv+PL9bKqv5oPHZp++lYDY7JvIbBQlz6sleMGF4zpFmvoWpoxp6mEYw1bDybc/xpYTyq6RWG4bJN8eNoGFQxGozRUIFeW88XHvRkeaNGpN6uqPtDM2PIopG2WavQQBWcd21YyTVtaDAquq6yn4zcTL4hXrMo8R6mWb0R3a/zM55GV6xtjVG6B1Zmti+DZ9CVGEpiTklWtacsdcbsXcGBy0tsT7f93K23cc0Hdu5mes0H3qdhHAN54YKx9+l7Xjj1EKaGutKJTZwQ2EZS/iYqYlCwwW5y/cfu5P43HknnfjrZyauYlypcZ32v2rChc3HysfeGoes1RLmZK/kZ/upF5T2cd+MgIssoQdg/9d6fkh1QGHHTHZZtu7Pe+3ejZG7ceOONe3bnn3piyqErhMuuHVFPl7j345spjBIlhoWmpSob25m5OaeGIv5m3jhAm7OYWRaU0rT06eF2LqJ0dIbZH2jycTBUZTwdG8qxPvwa3vBUpQ0vN7gKnDM0Fdhak4WN0/BQG4bxIU+iqKGu8jJGWD9RpxcvJnnXT9Q0wTjWlefkMY+xUBQ2nEPD+gmHcwP2P1szWPX0Bp4TTxZMNqx6NBu6z8OX5DPxdg2xKaKKVasKufD0B4YDF3v2XTKlmvQpho6saGimapwmW5atzQZjJIVvTPAMeuHpznJH3veIqJHyTkNtrlajYyxkoUeRsTobjePqGsP4OG5T6vG44XfdHEU3ZzHzLJnZxz2GxeaVZtejiH/H5zDmsRrnkkKclrBxCqDAhtzAmSSGcZzL6Q30IM1UEUF5X1FqYvRZrKcxXxNyO4XDNYRna/b8d5NX/9ld3P/GI2ce2FnIjffezV++7rY2bNuoBxG9rDiJsDtSN56bdL2GKKvS43p/gJu58kXjPZxX4xBYN98D/Jr3/r1h8dMicmnwGi5FCdhAPYUrOj+/HO1V/ILIxnrD01/sUyw1HLy85OWv7PPEl6cz23QVRpYLg1VLlvuErBkMDL1Cdsw57CYRtdJFpmS5MB6pwlxaNqysWg5drDH+0SlF8mysh2MONSa8teEpprajEGJuQ2hqYTJqUpxbzyUqmI5R6CB6oI1v62zVMRmrMVFD1qSwijHC8qr+7qknKr70eU2GDoYaKjLGUddNSiIeOCzsv6xkOjaM1rMQClPlXAfjODiYse+gYf9lU1avaiDvcYkdA1BXek69odHEaM8gohhGhXn6dB1M5slyT9bTeyJhBhxhmL1CAsR3LoeQqXdhyjbUlOUCneulRqS9d8ZqrL2cqHeWozmLiIDqGpNeIeHaS/KMuoahm4doj6dKL4axooHQ/9txOAdHn4DhsmG4pPvcLTEd5doP381n3no71cQkuHKULnRVjBpWm3mqUpPXWe5Y25fNINJOJx+77lYA3vTQ2bYJP73EZzol6zvIsrTO7c08cievIcpz8R4CU+/HUBLEDG1E9eOnA+y80HI+0UqCtoR80Hv/M51Vd6MUyj8Z/r+rs/zXReRn0IT0y4G/PF/jm5fvOPn7/M6+t2HNgKteM+blr/Nsberl+c3lt/Ldmx/mjmc+xJ0X3cw0xOKNtQyGVsMh6Iuh0MvTvyS9Qr2ArkJyDurapZc8znTKUnMBJ4+5ENd1bKw3bJxqUgJ3aVnj7mXpsJUqnuj6u7o1VhG9sbSscNrNddcmbwsNj407ycX5F6tp1GCVxtEfZqqkgkIrx4SkuQAmJQRjMnttv+XARVZrNwyMT2Xh3D3TUhPKMYzjGg+ZsHygZu2VPcQIo8+NOPlUkeCWvaGGPLKeGi6T+XQdYzLV5m4mpOR9OwOO8fMYXoqz4WgYjPU4WiBBTBJ3Z6UQYbEh2V2osahCfgHC/e0AEdK1Tdt0kts2oG5sa8CrALE1VuYMOR0PU4/VhdGOR44sU2+qGJz2cUxy7Yfv3nH5wzcdYRKaofYK9R7K0oVxtZ7XtITlNTuT77nv9bezud7QOJLhjKGyP73+HSmx/Hzkxnvv5r7XK/KqG7IFvT915fcsIb2T1xDlOXoPJfAW7/1mmET/aejy+E52AOzszeifm5xPz+GNaN/j+0Xkr8KyH0WNwm+LyD9AKYa/E8B7/4CI/DbwN2iO9n95oZFK33Hy9/nQVbdw4NKc3tAxGBoe+2I5s80dz3yI9x68mbLUHEJRGNb2a1q5caq89eFXJbbTbGowVG8gy4UTx+oE04Ptic268hx9qtIQUkgYR08juu9l6VPct0bj9b1CC9VivYUxGostyxYLXlWeHDBBqTUuGD0zO9MyRmZerryD/iknCjOMM+7LruixsmrpL3u8g/GmsLzP0Rs46qoJqCZoashyj+lDUztcaQIcMeQCas/WyQz5dEW5Zdk4Pgj1Dqr01vZnsFZjg7FppoIPXgJWZ7hRyXuvnoZ3bdIeSIl0aGf1cQyNa2GQ0BoPkHR9ItS0ayRjGE7vnYY4TJzR7oA+0t8w430kFJLznbBUayRiQrqb54jHjjopGua69lSV7vz+Nx7h1X+2u/ewm7ziIwov1doH1z5rIWc2GBjINJRZVwq3Pt1xqpBc3kuxIezn5kAiEeW0F57D6byGKGfrPXit6Itd+fLw8ewO2HnB5Xyilf6U3a3nt+3ym38D/JvzNaazkZu/eA9/8NJvp+hbNtabbbFhICnZycgxHjhW1ixr+7M0Q3euTonkPG81fcxDREU0Ld2MYdDfbo9RxxdR1xmWlnOqAIMtCoVZxmR3ngtZ7hmP/UxxV4QPAmyuN3OFYqpkJmOfkEvRGFjbJkHVEFqM0WR4LOAzRij6JiWFl/Y59l0yRYxnOrYsH6iQ3FCe0n3mhcOu9UJJuKc8OuHEEz2mY6v1EkHRbm14Nk5quKJXeJaWLWWAEcdiOe/UO2pqoa4M1URDSnnfa17BSdoOoOmGSySE4NzsPZ5X4MZEFFEn1p6rcouGevY5aQ2E66CKKkjeQndmC8xAWY2VdM0j3LkrtmOc4r2bf04TTDbstwj3//43HiEvtA4mek27Jau78oqP3MVDbzmy7fq4Ricn8Xy7gIAo8VmrK8/+g1kyLnspN/z5Xcl7MOFezeSJdniPz0Hu+NtcetoNVqXHZX6JL7H5YyLy7Z1V7w750iShidUngZcBP+e9/4SI7AbYecHlq7pC+nzJtz36e/zOvrcB7cvVlVuf+CB3X/J2IMxwA7qnrj2jzYamUe8gGpH5JN3GqYbx2J31C9Kd9fQHJiGHtjabBN10zjMZeVzRUknEBGachWp+oEXQwGySfTxyivAYuxkEVpbpDPHAwYyDh3OOHa049owee2XVqkFYtvSXGkW6ZKoMhvugWG2QlT5mpcfyKwskt8gwQ9aWoFYLVExKBg+foHp8k9F6xoGtaFCbACGFwUpFUwubx3PywtFfqalLw2jd4kPCtKljQtIADc6pwdJ8hIaVomQ9p0bDhzBSCLnF2Xm8htbESlwHlSfPzcwzMe/pmZA7mZYOa/T3VZhh6/6Yuf7RKGgux80W2bnWk9A4OqkYrXHQuBYUkYyFbcNeg6HhwEUKBJiOVYkXxbkryev+8C4efPMdKccWw1rx+FmuYbDXfaINT00nfqZqfWWfhOrncx7GrmJNqEsxbY6oqiXcN4HJ8z6E5GdBR5fpNu/13v/Y6bYLkZHXisg+4HdF5FXPe4R7KHvr2y1kIQv5qpPPvPX2Cz2ErxqxmSQKnd0+O00oTyfe+5No+OjtBMAOwBxg5wWXheewi8QEdfx7XqzRBDDrGkqZli652NNS8xVd6GFdzcaKztWtzgOuXJPQGmoaDC1Ly5bjx2qqWmeHsTK4+7BG/h7nYKt0M0ibCFWNMeWVVZtmo/2QI1FEks6sD16Uc/iSnOGqIoGWD0yU56mftQerGjaPGsrPew6+bIRZK3DHx8gow+YWloewPEREyA/tJ98c0T+uU0o/qWme2ARrkL5FcsPmpzdoKkNWOLLcUW6Z4C20s9cm0ik4S1YpfDXvu5ScB1LyGjzGebyANzpT8p0itUjJEJPsxsyGguL1iR6i3mtmtqmrNuQSk6Pde98P/Egx1+GSN9ChX2lm99n1PCKlR1ci1v+yawAarr7r/Txy8+04F8cpFEukPMxzEZP5UJSmoUlrYNp4lgOEu+s1pN9YwZWKvBusNIzWZ5PWeyF/+brbWiTetmLE7QWM5yoicsYQ1Wng+t1tLgIq7/1JERmgLWV/it0BOy+4LIzDaWQnoxAlvshV7THBMIzHbjavEJJ1ZenYOPX8c+tLy5b9BzPqSlFKBy/SBGDjvHLajJxWOkfmVRPj0ySIakpyNgBeDdtEDUNde4q+MFy2qd5CkUYZ/SVaMrZME89rhyuGazXFqiO7fAXJ2yC3Wy8ZfW7C5nHlepocq/EPPEs1UoVUrJ7AXrZMdukyHF6DYR/2rWCWh5qLMAZ75QgmCghojm7peSTDoCSAxpBCLk1EVTlPE6qaY24g6/kExQStoFU+KA8dlBOJ6VRpInxITOedYuO2MK2lv8jzGOYJ6/LZ56Sr+Lszy5jMdhGxVsXfaa6ice1LaqzSWMTq6VRn01GK0Vgtr1mmI13/0FuOYHMFMyjdi4fjdoZE72zkwTffQV2R6mPKskUhRQP26TccSXUnUaoAyV7bn1FNAkFisTsp4LnKfO4lPuvxGdkL6SIJdxM5uxK4S4FfCXkHA/y29/79IvLn7ADYuRCyMA7nKLc8dg93X/J2Tcpm+nLXp3xgV+3MBgthMn6O07NdZGXVpqTstNTK6FgJurY/45LLco4+VaVCuy67Z4xFxyrk8VirmYdLkpRrFlzmpSVD0Vf0UH9o6C+p4oyIqeGyYWl/TdZzOvusPM0zY/xIE8/SzyA39Pd5LiomifBv/LjWYdjcUx0F9+SYYmmT5ddX2GsvhWkFozFkGXLxIVga4tc3YFJiD8PwohP0R1MkKOeqNHjvyZCEyJo3EqaBptKcgdYuEGhEWqoRMR4TuJYU8SKYPCaEDeJmE5pxBh+rhROKqel6DLptVPrd2X8qdGzaXERVzfTU3osAACAASURBVO67RR75VE8BpPqJ+dlxtz6lLD3NiYbpRCHTXShrl2G2cIZi6czPXaSx0N+3yyMgoT80TEaOpeXtWnM81md1ZTVnuFYzWj9/KmdaenrFbL3DXkvLWLC7yPS0qwHw3v81yhoxv/wYuwB2XmhZGIfnIUUhKTGnygmKkDAcjx1uk5To3QtZP1nTD4luY4Tx2DHaVKZKm3n6S461MuPYM6ppGhf4ZoKxqis1CikEsoN7HGGqBy/KQgGZw2QN07EN4QrD8j5HliulwmRLUvVzsZSR9x09aoQM6WdYapxzoXBKK6CnpyxZ4UK1t6V+bAN7oI+vHL5ymFXw4zFSFEjRw2cWMkvvugP4ssFtTFnOx0DF1smM6dhiEuKohXPGWT0Q4KzBc6hbD0LMLJGciE+J66YG4zwuKOkYoos1JFFi7QZAljdafFcaGEtAKilMuMvM6xqgwypqDdBhYI2GIRYZdpVzls3CX2Piep40EDT0OR7F7ep03+M+q/L0AfIH33xH+jtWi8dJRhzbYKC0JVubjsk4PI/Gd0JmpAlSDKntRNf9fMQYIctIXnVMkEOgyN8jdJQxLZpuNzmbsNJXgyyMw/OQmGOoKp2ixBlhlzpjJxqNc5XxyPHEl6ccviTnksty8gKmk6jIBJsLK/uEyVhhuFHJxErorU01DHHGqnQcwsapOo0/8h31Bg3Fkirw8YbF1cK+g8JwrU7MrrEgzWae/krD8ECDWe5hhjn0DEwd9ajSPEHP0RsotLWZCnVp6A0alvZV2LUh9WMbuJMl2eUrMBzAZKpqfjCArRH+2Cn1SKzBFlaNyDMt/KQN1UgKqaUGNaZVDN5B4yTVQaTfW99R+p5mqqgjCGgnI6nqOkFggyjayQcDqfdbj2lTngOEOqC4GudT2Mk1YYJhCLThHcNg2p4N0dPoUpK3Y29/10UjdWHRXWMSf9MLHkWWz05eHnrLkQRzBTUw3RxBEWptIveWzRW63D+Z8czj0qES15qfupP36j0PtNTp5MZ77+bjr34HEAxEX9LkbS8lNto60zYvBlkYh+chtzx2D3dedDOREykWlp1PiWytl13RU8rsoUnVqllPZ/TDDZsa5NSVei6xMEhfmBYSu7XpEvV1HhKZg6GhqR2jdUtVaiOdLHes7BOqUsicFrDZzGFzrVQerDSYtYLs0mXMSg9yg99Q/1qKEpzHT2q8d1SloS61NqGpBelnmLUCv1VrB7p+T0+2bvDrp2A0wZcNfmOKb7yS+T07oi6zmSSz/kaSQtxNmcckbAwrOdd2OOsWyIFWcDsEnEdsZCLtGJUuhXWuPTFcHWsrHE2ADzsnmEyXR7oOgAofah+CAk3ehKTYfktzIlq02IHaEr93vQizvT5ihmk2hBgnW7C8rzUMj95y2zZPIjaxcjmJdyrSxveXLFsbnqYymMxz6IoS7/pMvyBsrDf0CuHQ5RmglfGDleq8hpXiePVc2xDXbvxW5yJau3R67f9c0UpfqbIwDs9TEqXGxM3gvs+nbG02fOGzE00Uh6KjrU1HMTS4WtEkK6s2FbSZgNUvCunEy5UCYWuzZRztD0wnFKCKO84Os1wVWz015EXDyqEp+apFCov0laJbcoNZ6SH7htDvIYMJ9CzmogF+Y0r95BaZ0+519VTZZZvKUH1+nd71h8hetg8pMiRkf/3mCL8xTuftRhXuZMn0mSlbJ7XBURONQ6TIcGBo6UOiYegqdGYMhc7SGySFk2JdBARjgJ/5TTckJaal6SiWGg23VUJVGjLvk9GKSUoRjzSxeA2sI2Hzu70aQIsOjYGqbhPbMTSVZWbuWet6DO0+dqrJaPm1AtEhGj6KnsTmqZZyJFLL17UPdO2exiktx/I+x4FLPNVEw4ODlYblAxX7N/pAyE3tq7E9n/I98+y0eymR8Vjpbdp8Tqzv2Qs5O7TSnhzqgsvCOOyB5B2vIZLh7VWeYTc5+lTFs0drDl+Sc/FLcob7hPGmJjaXljV5XT6jGmlp2bD/YJbCK2IILT3dNnqPGIv2YXZbFIai0HCAzR153ylC6Yoh2eUrmLUCjODLWmfXg1yRRzGu03jtUT3Msfv7mDXtYeEnNW69ZOtExrHPWlbWj7L8zYeRlQH+xDr0CxgOkGmFe3aELxvqxzYoTxnGGznllqWetobBhCI4Pb+dDUNXqc+LdxCvRNtBLHzPWg6m+XyDkvppaKU3cEiuSluVoSbfvWtn9slrMaREdxsCa4+rlNl6H5JXWrfjg9lE92xL0VnUTtcgdJc5pwy/Mbw2OtX2xuiS16WK/lAgGMNFxljWDjcM12ryQosKxRAaQFmKpQaTeXqDhsE+x+YzGcXQ78rh9Hzlm+57H3/5uts4dlQv1DTAtfdSxGyHym7faE8PecFkYRz2QG594oN84LK3MxhCdGfP1TjM8+WcTpzzPPXElItfkrO0r0ZMxtbTLlBoSOJ4OnCRpb9SMx0ZmspQjjXUFLH1Ecsfw1Btn2MlmrO58vxr3sAFavCQ6C1rRShFmhDnYXMEdYM7PsZtTlPNA1YQoFkvqU7WlFtZgrqKePyoon7wKG5jSu9Vh+DwAegX+GqT6ounWH8yp9wynTh+y6GU/t5lhhhRSW24qHsdZ5c5N/ubeW4e20lAm8xrxfY+j/R7+MoBTfqtji0aLlW+ymzKTKIb9DrPj9k7TZDnBow1M+fXODq5i65R6CKewjhDSGgGbgszsOYoeS4B8aXjS+i7DotvVcWOhZblAyR6b9D8Vz0VhquByqRwimgLxuN8yjfd9z7+4obbOHGsDvUgflsdyPOR7VQp22WRkF7IjNz6xAfT3x+47O1pthf/P53MNIqxsWju7H4LypW0/7BSJ8dwUa+wrO1TtlObK0yzKjU/EVkyIxQRWrRVrN2ICUibu9RIqDdw9JcaTAFuc4r7/EnEaM5A+hYZ5phhjq9KzS9UbRY0IpH8qMJtVkw2c6qJQmKHqzW9l67QHJ9QfnlEvi/DTxrk+Dp+c0rz7JjpiYZmqpow5gaiYYjsqt2/YXv+QK91GzaK++ni1tXjmPtufEJDRQNjOt5Jb9Bg1gZgDf74mKYyM8VlNo/GxCEd7ybmH3zwNGJznjj2SBLoHETmD5uRPKSMTgGgiQVx7eCb4FnEznjGSuhbsXscPlGmBHhwrzChZ4Mw2dJkeuTsmpYakuwvmwReyPuOrKd/D9Zq+p2+5BvP6kTg3htvT7Pv131C+zG09CKSoMhdwkjgrEkDB0ODsRknjmmb2y4x4vMVnTAtcg4LOUeJhuJDV93CeNRSeFvb9rLt8s3r8rZYKs+FwUC5ms7GsGS5UE20t0FPw72I8fSXfVKY07FSi0fSvehdUHkmM56C1j2YQhIlduyJMFhpAhpHqE9UKflpB4I9NERyixtVqtitYIaZGggrmqRu1EDw2Ab9esrSPo9d6yHDIX7S4KuGfF9G/nXKelk/eoJmvcSPlH21N3TIxKS6DOO64aL2bzUQkNBGSaGrMje7NMGJ4SfXMS5tWKo1Bmn7UGlthvoa+UmND8lk6CTEjccAeeGpjYEpeBPyInULp42IKQ3p6fPgnYafusammziPoai2YVHnfDqkf+05pr3QQmW7+27PL+vB2uGS5QMV07Fl60TG1smMPJPEBOAc1KVJYT3vhLzQ5PNgn0PyjMkxz6lnciZbbRvaKPfeuPfUHb1Q0d4rDK5xZ+2Jn40oX9bpt3mROA4L43A+ZWnZMhgYDhxsG5v80bW3KpvrWMM6vb4mj48dbSnge4HOeHzizKWWEX4qBkanFOveD4VNJpLgBfTMeNQk1s84k2pCEr1XKFY9eivGaFVx7C6X912IvUM11sQ0KIGdHYCvGtyogsbrZynTamMrmLWiDTvFcFS1jh9Vij4K/5thRnbVKrKU0xyf0Dw7xo0qxCgLa1TsJlOoqe+693MvrOrO2TBS/H03DAXb0Uymo0xkF8UZIbLGeiTPcZsVvmoQo0a12887/lYMWB8MUN3CIqNRiOPS0JNXL8OC96QajUh3LrbtT9E99RmPpVPhHT2MeA7W6Pp5mG83VzNYaTRcmQtF7iiWtPXoxrM5JmjIGIYcb1js2GqjpZ4nKxz1GEzZsHm8wDXaV6IqY3fBCHzwrB0wZLlLXlRETOXZuSn1GAqMtCeTkcM1O7hJ57Tvs6lz2JNDXXBZGIfzKDs1MvnWz+zc/SqyvE4nrkU+nUWJRKLybkyis44PZ6SsbiotmIszqO7MR+m8zUwVtTHSCSe1MNFyyzIV7VHtQ7gqywMKZb2EkfaMln6GOI9UTg1DkWkOYlRD4/GVQ6wwLQ22rsn250jfYi8aIsMcd3xM/cQW1cmabADkFioNbURMfpaT+jQ0U0l9s0GXG6MGohtGMmkmPxtaispkPlEd2V7j/12JaJ5sQDJ4ZpirkTM1NmsbOaVrHXIrEfrqakGYNVjdUJgNlB+uVqVkM6+5imB4un2xk9gQkkoMtJGyQ9J+t6GxAtTW0V5Dm3mW9lfY1Qy3qYy4+WrGvpdoqOjkUz3AKmhhqNe1ngq9gYbZ8sKRDWB80jDZ1Fa01374bh540x0UhUmQ76Vlw9rhknpq2Dqp0ORYN2MMlCNDHYzFZ956+1kls9Ugalg29i/ZKyhrZEQ4nSxyDgvZUykK0SSxa5um7+QOx7BPXFf0hWnptbevUYhhVGSx3WM5hsnIzZDAAYEzSFLzldjPOs8Fm7Vvkwlhmnpq2plnpglqk3lowFVqDGLSWXLTFsRlmSaqp40ahtxgDvTpDxtoHLKUK4Q1GoanR2w9qUVk+ZLDDDMNuVlPXZm2u5tTRetqoQmNddqQUjuD6yaHxcwq1e5yET8XYnFJ0exkPMSAFHlLNkiYWRZgncP4ltjOu1jH4DshoVlUVeR2MpFwz7UK3dJWbkdYaLd9Z9wu3XfX7s+72bF3azhSon6u9iPraY7JDIuQI8qoSsfwAAyuyLH5hFNHezSNYENDpSoQ+eWFo3dJocby+HhbzqdtbKR5CeeE8YbWQrziI5pXePSW27ADRzF0M+e4k8RGRJoj0YlNM9aJzrR0e1p/JPbMaKUXiW1YGIevFFHOJIVk2gAz7KJEDl2Uk4Wq1BPH2nDTeKR0Ba7xrOyTEAbyKaxRlZqgVoK+lnfIGt1/DQzm+HxM8BZiLDtRQ/RcmrVG8S7E3EOVuBnmyDBXI5Ero6pWCVpVoj0thjPLPWS/wXc7mR0fM310nfFGRlWqEVBjYrGHMvITW9SVSWyibWLaa8e1rIWQAgkd01XCphOq6IaGbDcPYYXY09o7j2l8WDYXu7ImILUMfqK/I4w3a2rAhzCQQFCgM/mDoGRiXih1q+sol8a1jY1wPoyr9YDiPZgVNTAO9Uy8kLy95EWZNvcSGWrbSYVQLDXYQwOkn4UmSobpyGCzil41oXewxypTNo9rvck0hJTaMJqGFIdrNZONVpu+8qN38sCb7mBpWeiv1AxWGqYjQ3+p4Yr3tl71S+95Hw/fdIRiqSHvu1SNPy8P33Rk2zKbeawxjMdNyo3sVaX0os5hD0REfhF4B3DUe/+qsOy3gFeETfYBJ733rxWRq4EHgYfDur/w3v/A+RrbV6JkmTJuukCWt7ZPu64dfUqrnsrScctjH+LDX/ftbG3O1ifEv4sldeebytDUaiCqMiJW2gQkkMJIxs1COdUdNzNQTZtr1WlTi3INNUJsNJ8Xmm8AdPZfBEUwDclnwJ0cY4bqGcT8gi9r/MhDrnTcflRRPz1iOrYzyq6eCrJeYtcKesse77Tyu4sIUtSSSx6BxPRG/N4JHZlO+CYaDJt5TDGXaTRtVXSEi9JRCmIFOkgt0+T4qtFEcxHOqXIwCaGxMA5XumC02n1luSpqLeojKeymJnlL0eB3w2XtWPW/6C3EPtmGNjkeKUBmjGUnSR9RWk2jE4z+co0sDfCTRu+B8RRLWoFfblncRkNdZkzHhsmGMgUXw9ZDcaMau5RjVnozBhk0FDpYVoCDsX6mO19XXvGRu3j0ltvS/dpNtjZ8CMV6tjbjpEqNwmTkKCc7e+HnIvG9OZ0sjMOZ5ZeBfw/8alzgvf/v4t8i8n8B653tH/Xev/Y8jue0EmP+tz/1wTNseX5kMDRsbUYsvLrH45Hjjmc+lLa57/W3J/Kz2Lu319dEsrHq3oO+7N4Z6srMIFkiQ2iWCb2+pDCSc7H6VatyozEQUeK9/lKD5EI9JjGseqfx6ao09HKvhqEfvIPGp7995dRg9PK23sFp0tqH7nQR5io2UkhbTNYk1E55rCHf3MQURo1fI9isoZoYXCPbEsxRurkEMbE+YYfQUG7USEWSvljFayQt6xoGwjIJhk1yC0vgN3wIqVn1XqpGzz3uo/EYKiRXj8gHr6CeCm4qKZwDAWIbYKuaa9D1vpmts+jmF6LhiMu1BWp7XaxxHS/Qt/mF3pzBTKE2NYA2i8SODdn+nOqphs3jCkVuqrZwr6lMCPEZ8qpRBNqkxtUt3/mDb76jExoVpDm94m/q2XzSvLhaGG02lBPdiXY2dKkOYy+5zQBsoE0/nex14d2FkvPZQ/pjwSPYJqIZm+8C3nK+jr+QhSzkK0seufl2tsHKzkEevumIUrl02q++UNJl+t1VXhy24YLlHL4FeNp7/0hn2deJyKeAU8C/8N7/yQs5oBhRuPuSt18Q76FXCEXfhDDCzrOk6URzCzbM8Nf2Z6ys2kQlHePKTeBF8q5b0Rl7IxMYK02nEjp2DzOptgFiQZPWIpi1Anl2jDuhM7S6EkxmQsggeAq5baGr/Ux7RReZeg2ZPmoyrXQ2bQQT4IyUjc7Wc4PdX9Afas2Dr3zyUurKILVvZ5FGyHqeekqit5hHHcWZeQwdiaGTT6D1FvJZhSU5CseNHoJpPYWYzxAjyjwL6mHkFjNUb0hiSCo3rdcwdRp+G+ZQNiHZ7RFjyNBEfgzDeSc4Aazuq54a9QYzSQVwUSKaKYoxEjxH/W47b/g89Yd0rpUxHsk0lBXH4CuH25wqB1atSeOsbJhs2UAsGI8JhKK50amM3tBRhEHpOSqzbxxDlqlX6mrlPIqw6J3kTOikjVPqNXSRYZHGZp4aZi9kwcp6/uV7gN/ofH8SuNJ7f0xEvhG4U0Su996fmv+hiLwLeBfAlVdeuWcDuvWJD6bQ0gstmlRTBW+NFi5FquauRKUOuj4S6RWFKkYl/otGweMtZLkJNNG6D1so3lxMh8StYxgiBYKxilYplhrM8iCgj3KyzUlSMM1U8IU2+6FyWiG9ViBG8JMaGQbDUDfayGc4gF6OrDQ6+wrr3OYUaTymZ6DxOFvBRKDRAYrxgUcpvnVtGCUaMsdsCEnEK3+R+LRNMgzWpHCPzIUAYj2Gr5o0Y0jb9IweeepawxD2qwn4HoROZ+IcFAaxovuKxmQSqyBNezZDScnsmI8xTdt8KO+7UE3t6c68lQ+qpaSISC0NtcVcUmsoo3Thvfq9vWZZrjmleF5+UjPZUoCANk1SAzKLkGrhst55RuvKq2Qbh93fpzheMR3rb1/+IYWzZoF4N4YGn4u84iN38cCb7mA8donLTM+jZRqoK58KTvdSjGVbDmVeFsbhHEVEMuCdwDfGZd77EijD358UkUeBa4F753/vvX838G6AG2+88bxQPH7gsrfP0GE8X4kNU1750Tt33SYSr2U5qR/v0ooEV1xfqv2HHaNNy1JjUkexohB6AwJ1hip17yBOJr339DoKxFgfZtySWDpt4FfqInZMQNCYlZ4qCedVqXaLprzWUHgXkrDDHCpHfXyi1c65QYpM+ZesQF2rkQjxdslcSJJqbN9DW0QHYIXesqcet5QRMalcTzXWHdt/GiS9tDG30NRhltcxCroT2bZsxgCE9XEM8waEvk0z/UgfAsC06XghimJK14omoY1kmOPKeva4VgGskqM5GaMJdhNyM95Kmh1r4llaVNM278AnRd56CtFD0GfAdCC1Ma+RKMljBXOk5gheQhOP2zEMXTRUPEY1MWydyOjtr7EH+mS9clteIS8c/ZWa8Xp22pzDbtJyQul7MxiaGW6suvJnbOd5TiJ+1/xHd5sXg1wIz+Em4CHv/WNxQWi2fdx734jINcDLgc+90AO7/Skl0AO45/JbuOWxe16wY8cQz9p+vSXXf+zOGZje5269jawXqQEkcc70BopSikVRxVKj/RIq6cA3W0RK3lfESZyB5iEEJWYe5tmynMbCNV81icMoUVNPgsGwhvqxDWVnhdabeGwDWcoVutqvcOuTVOuQeJdGldJxr5f4KiCHaBWnMW39QVRq8416fEy6dmoYWvoKk2CnUbYZBts1GILEGfpp4stiBHKbaEJ841u4aTied5qk1r7YDgqgajDRCKGhl5jEZ+o0qVw5Vc7OI41LkFpjNCHvnYbS6mk4f99SfsRiNms7xXDRu5DZpHy3wM97hb7GHhd+UiN97e7nGtW0zvlkLGK9RezBHaG5JvBGVScrpF/tGDYyWUArGZhs6Q8fesuRs+4rbayCKqIX2TiFaueZesbDyp6xWO1cJPb9ONM2LwY5n1DW3wDeDBwSkceAH/fe/0fgu5kNKQG8CfiXIlIDDfAD3vvj52tsZ5Lnizbo9tx95UfvTEp3twrPV3zkLh6+6Qi9AAONHkY9VZ6aGBYR8YlzhwBTdM4g6Wl1ZD2tGNZYsyp4V4FzikKytqWgsB0kS4R9RsZT50JjmlGFDPOA5a8TBbPWUNikENzxMVvPGryzKQfgTnqMrcj7JfmwMxu1gllWjyQZnlFFPRWaymIqn841C72cba4V0l0IapxFw6xRiJKQSNEwzCCOdjcMyXOJMh9kjgfNrSp0E2BBkPIuegxJkFd6Hia1Kn2bzRxDnAOj10XNdoajRmIuwghSNWGdhg/F6hGzXhs+6noTzrRV1PMz85bao9v9jlRjYTI1Nr7UcFheNKGwLjQxCvDTyF8lRtuCtlxUamjKLUu2XmJTbkq96Ih8kn6GnTZkPUe59dym+dd/7M6Z9wxIvdPFMNO7ZC8l1sScThbG4Qzivf+eXZZ//w7L3gO853yN5UJKnP2fyRWNlaFdMQY2T0ERjMY1H3gfj99w20yXL23Yo4R9a/szqokJjWdUI9jMhyppTw9D0ziYhqriYAhs3j7wMcSQFEpXUboQjgpQSpupJ9LUwmQrzkBVKXT7H1SlwW755L3YzNOrSsxyDs4HjyRAIV0bVW/7M8zRStiYX2EmlBBzDj60AfWOtlYBZkJEbThnDqJqjLIjhr/n4a1iBazFNx6xmoiml7eU5DN8T526CIB+BqZRb6JFd0Jj9Do0YXluUHOjdCMasLG6D+fJbIPTIKwmrRsN7bnQP1s8M2GjefhMt69Ht9dF2/8ieCCjCjPMKVaVpt05Uu4h0pZ0SfR8SIbHuoWqNNDUgfK9c5lzz9K+GkymNRO11la89J73sZvE96j7nlz/sTtnWpoOljWcVk+1Wv7AwWymYHQvRD2HRVjpa1aeb8FM7JPQFd+hUjgb+cKRd2Ay1WoRq/3pNxyh1xfqWikvum0kxyPt2GaMVltHJlUgoZacC0nkTL0S10inUKwNFyQW08wr6si0M/x4LtrcRmdSTaUVsnnRnmCXOhtCAZ0h9SOoSoNUDTYVQbUIqxo1PLHwbr6OoWla3Hu3gC8lo3MAweQhV9K4WURSzD10Z/hhvVhVtBjToo2CgtYDzSGY+larv6OHkI6x3UikbeLzNQ1J74Rc8uBCArtnkCrkYazoOVVhu9xiaKCMJH0Qk8JN3RrXONvv0ql0DUL3mppODUgqZCtBjFazZ4dzvPPk6yXliSZMQtpnup4GAxdcF1eLhtCs3r9DV0xY/vcfUW6lodKuTE80bJ3sUVe7x2keufn2AJLQd2HeSFz3h3fx4JvvYFp6ikDQ6EITqP0HM5aW7d7WOphFWOlrVqJSfz75hlf/2V08cvPtGgLq8PfDzqGlz9/2jvTAXX3XLFlfnin8dGnZMC09kw5dRlnqi15VsTWi9u3tD0MxkmkVQm+gse0ICY1VzlFib4HZa0GKm9NoniDr1UzHquiz0P2r24HNO6E3UE7/phbqUquto/Ix88es25xHVDSpL7QhwCh1eTQS0bXf1p0tzuTTCWi1uW/CrBwHhVXqcFqvoHvCvvEzHkMsBOvSfHSTyFKEV6iX6wy/itZK0UfkYV9hHBCMROPxvcifYZHGJyOh3prScMQchg+eRdc4mcwFQ9DSdKjH5JVuwgiZdQkNJBkp1DTvjc0XDEZItJQOOwRZ6WFXejR9S6/a0GOUHc8ohac8FnBWGKw0SG4Zn9TzPnrrbWQ9hWtvncgS++pOXvXDNx0JBZG6TW/QUE93RjbFsVclFEP1nqIsLZs9NQ5GzgxlfbHIwjjMybkYhU+/QWczN/z59tBQF3MfO309estt2/DmO0mEMhaFpMYls01aPFubDdPUKxqy3Cr6KNP8gs9A6qBUc4U5xpfSZj7NZB2zFNOpcU6jlb4EBauhE1KLzt7QhfxDu0+Tec0xNI6qF/DsIcyR6hFCErlbCdxVUpG2WtFIkmbIMbcQPZEZw2CE1MUoVjfnBlO0yj3VKVhmQ2bG66ww0mJEo2jVe4iThhkjkRsNKXXcl264KHlO3eTIXKgp1kWEO5TyDBQagorV5ALq/QTIq8b0wlhC1blFEVqeyMcUrlknHxBzErGHRFfmyfm0XkJSTsj3LSbAle241D7g6KSiG4fPQq2M5pk0bLR5PDRqCjUYdaX1K1mutSq7yXAttPwcm0QAOS/X/eFdqTDO+xbBVpaePWLqThKf3dNvs7fHvFCyMA5nIR9/9TsA+Ob7dVb/FzfclvhVvum+Nk56/xuPpG5VNvM0VZgBW49DFagml2cfrtioBwIbZcTuO1JXOOeUWTWGvLTwLXD1O5+gfXXlKUud0Wv4yMyGj0RnVnF7Y0Ux567NB3TjzzhFHcVGNr5qC86ynqe3DJOTwIHhsgAAIABJREFUSqVdDDphpVyJm3q51gy4Wqi7LKOheC6ynursuC1ay00bPjL5dsrlmdnbXGEbdJR8RCW5ZmeEEszQZyRuKGuQXmd9nLFDUtgYgcxqHYdzYRuTEiCSzw50Gz1HYLCN45mh7SAYUiv4mOxGPYn49CRDFA1GUycSvSYY5J1mud38TEteSOf5CM9BTOg6n3p+R8l6Htc46qmhlzmKVUVX1VMhX9WCyFizUVf5jJfSGzps7phsZNt4leLESUQNhxgNhdbTlktrN1DHg2++g0gl70VrEqYTlyDbnMYIna3EJP7z3o/IFSi10CUotuDd3vufFZEDwG8BVwNfAL7Le3/ieR/wHGRhHM4gH7vu1oR66BqFKPe9XusQ5vlWukm/rOdTaMTVQuU6xHYBhugqZmL205FJE85eIQmWp60f54xLp6LaOQ0xVaXF9hqFFZo2QesaSd5H4xSxpP0bfJr1mxBXdbUWQUGGC9WmsduXzTy9NVWa9VTDVabouO9RUQJiDaZqyGgLk7xTamsqjbNHTyKikCKNtDFgCgLen5kK4ThOyW1b5RcrkzszfSHUI8SQU6eALUFXu5XSwVtIBqTLsURr2iUmsF3V5hGi5u2c/3xjh5g6Ttepikgngw/n4bv3uItsCvBZAry1vdboWOuQE8pmcz5dhRZTLim533Fw4raSdwyrEdyoVkr2cI27XmBv0JBfuYYMc3oRYBB4lcbHGqZjg+35VPBWTwXvzDYv4MvvvDVdM5spVNp73d5mnms+sHvCGhTl99Bb1IvPep6iUPaAoi+s7cvg8dP+/KxkD6GsNfBD3vv7RGQF+KSIfBj4fuAPvPc/KSI/AvwI8MPPZ8znKgvjcBYSaxB6RfQEdHm3721EDz1805FQaDb7EEWseHypmjrMnq0qxLo2NLXVArVKl7WN7n3oLQ2uVKRS44BAwx2RO9DqyKgYTObJjWvx755kGFwTk+dg8/g7ncZoTiK48ZMW8WEMOKMd4szaAD+qQijIt4qLMNueS+wbGiQWwBmPr2avs4gayqYh9RdI63KDWINMas1TBEivOJTgrqPI5iVRWkSYagqPSZun6HoZcV3MFxijXd7mk8zGqOfQlfnvMxdA1MtgzouIOYhYaBi3d8GbsG6bgfAhBOWd33ado8KPYTv9zWxsfyYkV++gzRr1UBLSy3l82WjVO2AKg621Z4UpDH7SYC9eQg4s6XjqmuboFvnRMbFpTyqYDPmqempwpSr+GKZcu2RKXRpG6xneCeVIl7/8Q2du8gMaYooGwhhYWbV7ysFkLGeGsp6FZ+G9fxJlhsB7vyEiDwIvAY6gJQAAvwJ8lOdoHIL3cSZx3vuTp9tgYRzOIG966AP80bW3UhSSOIjyTFJTnmgo5mfz0GLMm5h0FY/NFd0TZ2mpmMh7pmON5Wc9HyCoPiUPYxgpzyWF1eeP65xPjU3qSltp2p4yq+oMTJW+MVB1FLNzodq5BmhZQG0+O1OPIbEsR3s/5waGOYOVrcCB5DGRqhqQwurfXT4i45G52HE3JD8T1kghD6PV184jeQ+pHDKqkxcjMcTTNQxRYXaT1N1wTijCix6DciXZ7d5C1glThcGKoaXEiCdAo9vGG1vXnfF0jFYMQ8V9RS8iGq25ILmE/IMvFdZKoBjRbJSBqk4FijSdPg8hX+WEbaymyUPIJfymzYvF/yWnzeFgFJDQz7BrhR4vN/RCIx5l321ojk/I+hYOH0CKAttfp2g8hw9vceqRKetHe0w2tef02uEprhbKrRjmAxue++lY6K80XPabv8e5SpzcrO3PUuh1b+QsKqRV3iki/1/n+7sDu8M2CQSl3wB8Arg4GA6890+KyOFzGOQT4XM6i2iBK0+3k4VxOAuJrT0//up3qJsa2iKOTklqnhPDPxE5EusNNAQdUTvKVyRhJm+z0G839+SNzm6q0rS9jsO+jVEXOXLITEs3E17SMFH797R0lKWnVxlM1iA55D2lwm5qTx6qrMvQz7cJxUxdSUgiYzr5VpeI9mJyVBrBrvWon62pRkKxJkhIYs4QzwXphiO6xVfd2LjJImlddxatce/IiyRVg3Hd/Xok8iFFyKgVTJElhRpFwqw/jm+bYYj7DIqz268i7cOKkgn2cpiUsx6DCevShQsPSNZ53VKewkDTBK9BQ1HxeORmJuTUGiMtRJOpGpbYuzqGqObDNd32qW171IDqsZK8A4HgwQCNhs+igYgoqpTQz21LG2IFsDTPjgDIjIFLL0IuPoRdXcY+cZS1/AQmG/PM5wftZck8a5dMOfRLSkv/pb/7DjbKHlf+7vb2us9VYihqadkAe1fv0G2ytOs2epve673/sTPuT2QZrfH6p977U3vUYvRB7/03nOG4nzrTThbG4TnKaNMxGGT0V2qGq+oqN4E+eFp6bvhoi1j63K23pZl3VjiN0w+0U5sL6ByF6+mLWyxprsH7yKOjsfwI3xsutx5H7OvQKm4JrUUVpTEZO4rCImLoDWqyQguRdHtDU0cGWHBhhm7ytjtYRJSIcTMIIhvDRY0PMXKtf8iHPhRmocprVOFCP+m4jKDzuonQ7ncInkJIEEOIw5cNblQlOgldHrD+qGehdBIBrtpR+t559SzmK59dmBFD64ZF6dYlBNHQk3ob1LUag34PyXOd+Sd+jxhu6rhDoMYgeQ9Zu8y50D0ueFzB4KaR5iGx3bQeGVWjLK/BoCSjFag6fOlSRXIMGXUTv1poKOm6dBP1noZ09MazbY7cqJHWEFOegABmpYefNK2ByCxyxaXaMGh1GXtxydKo4tiX9VmKRHygRgHYE6MAGlp64E13JIDDYGiYlnsDIdrLCmkRyVHD8Gve+/eGxU+LyKXBa7gUOHoOw3zDXmzzIgFdvTDyzfe///9n793jLEur+u7vevbtnFOnqnp6umeYCyPoB0QR9VViTOLHVwkIDgMjV4EXGQ0GyYvhoxhRQoJGQ0QNmigGQ9AAIaNi1JkRUBwufoyvoibmNXmJMYhcHBjm1j3VVXXq7LP3ftb7x3qevfepqu463V3dXd1Tqz/n01Wnztlnn9uznrXW74JzsHayYbqemuZPYu0f03aZ/9DEAVpc3NPcFDaj2mk28K3MwGxib8X46orx0Yqs8CR5aCvNtQRMU6nVkOvvuMMX1TdKOfVsbfnWgMVY0+YUF7WKstQkBmJrzNpXMYF1xzU/4abnaBZbL90uPTk2Ihkn6PrMrEKLlGYrLCSxtZQ4XOHMFW7Od5kecsgWKomtn/C/OMEt593w2Ulwnkvt9q5b/LWZ3+XSqCmpxr/vwlnY3k5qh8293frci52mMCi6n9OkkyZPkw7JFFtN0ewozilCgvCTeu45AvZ8MkP8iOvPRhzEYW+vVRetSiW47bki/D5Ibegfn2uQLo+Lm69l/nXaHjE5xpZXTEZLNqAyZnuo8sI50Ch+raT5/Dp634MwnSFXHyF50mMo/s5Npv01lWAUZC5yFyL6b1WSaqtZdr4RtanOdFmEIR08bX4B2+X/VO9PdwG3hZ9vAxYTm5qPJ4nIN+/ymM8Oqteo6nSvgxwmh32OqMB6GIdxGGcXn3zWLXzyWbdc6tM4c0jXWjrtZbHK4e8A3wY8RUT+33C5GXgT8DQR+TjwtPD72cZPYrbL2+N/hr8tFIdtpbOMv/0/3ssfPOkWTj5UB9ls26lnmbRopn5ElMXHn/5syknXv+9jy4EWgTMY12QrIK5m82QGeJqZsLWhzKaBAOY7pFTjCb33+d1KXVuby3TtbaeWj4ycFOW4wdAXEYYblVnTzLfGMmkexPpGadf6oLfjLlKS40OSYyP8KKW+Z916/cs5zakaX3ok0227YmtHucJ1JLCwA90Bz4ytlCxpTYK06qoKGjWCVuy1e0V6CB4ltHMivyG2UbYRANTrNjRSnPhrV0XE8xoUsDJGlpdgYxKqiqS7X6wOvG+RO+GPtPIZzpvsRqGtrhKJtLvz9rwq7dphXrtWUvw7rmVRQ0Q/dRWPZAmuifLgPe5ChD/PDew9HSGP9n3pXhNBNyuraALYQMJnXqdN1/YiKO3eu4YbFMi1V8NoCRkNyIpPU25mrN2fU4ysgi6WGiZrKU1tr/F+tJmieOXHvt6E/lpPj/MMERYdSJ8xVPX3Of3A+O+e5+GvVtVP7fKYfykiVy96kMPkcA6RBxe1uPgORo7BEqcvz9kbivfZF95sgnVqTmpZuWWcg0Zo6NamNBOyWsyJzYENh4Wa3oDag28IrSUh30xaZnE08ammDujMg9QbYS4rAuIlEKmaulNGbSMMKLWsjTF7bAQYaiW5dsn0hhIhGZoRkFYKWZdQIgO5PwcQCD1z31tApZPBjtpHgxTJenAt503QLvEGuW3ssXaLvthelLSYg67SRyX1E0XSXTcokOUxHFm236ezbvjcSyCSJJBlaFV1s4doQBBvm6ZI4AVEP4tWVjy0eyKZEDCV1F5ovG9/EQ+vG2AtqAhqSLvXMLqzbffOpvfYRMmUkCyiu52f1LgR1iIMqrQySINooA1/AXSzRrMKHjxpgnyrFTjHyrGKpnKUE7sMxjXDx48pTkzZuKdm69T+Lkltjt8Nrnsux1tk5rAPJLnzjOEZ/ra06EEOk8M5xtLYUdW2my8KR5o1O7SJzjbE2XzBTGSsV+pr82PICkhLmzfMyh0bX4CWa+EcVLXBbKcTT5oJIgnRz6FVRh3aohIH6mnoT8cZSX9gbHpEtIlBCDvLIK+h6zP8+gx3dBh6zxWynKNrJVozDzeNw+IseEG0iqSuXaDsuL5NJObcFvryWe9j6/q77G1D5z5zuvEBpN5PUMkcoqpdmN22/2OkqSWG8dCqgT4zusU0a3df55AkQXPmySjQSxg90ltkXm/XfMqTwMgOg2vi4FrnyXDhNRYXJC98Zy6kvepD8MjYrNiGP2pIvOkbb+1QT2FGpE46Dkl8DRvQUpACZLnAjXOrGBqdS2zRRa6+Zx33cIk7toZcdw1LNz+W4lMPU3/mFFo1pDcukz3pOnRtk9Hksy0QYr/iS37XpL1PZ717tnGZ+Dl8UETeiNktt09cRP4Z8OFFD3I4cziH8N5gp0vLZjhSV530RJJq6962PT73opv53Itu3vVvN7zn/YYmaqTdIS4dqeZsOyOUNS8cWW+QnLj5dcwHmKtJaQSxvtIx23It2SgbGJEtyazkLkZRf0db/Zs07+QX4i41LgRdq8MHeY2m29n6mOC6dlWEpgI7FvC2kogRKwdoZTBIXHj8nSJqLYmtSEM14ttFcsdt+y2lWD3Ex48toXib/mVQwHhk7aLpDE5twiTM9NK0u4TBszYdVFWSMIDuJ522FAyD5/7uvV2Me4t+HFqHhGYD5yRUUgmuSA0IMEhbAqJVbB3qq5UUCe5+MTEA1jbsVyDbWOH90MqjZYNu1viNWfs5aD8buSVcDZ+D+t5N6k+cxH/8HuRLvojs6f8Hwxd8FcPnPIn8658Ao4Ghn1yU/LDLZ1+4+3flbOOJv3fHDrDIOUcELpzpcumzw/cBXwj8pYj8Wrj8JfDFwGsWPchh5XAO8TV/+pv8j79zK0WmZKlQ1cGqMj2zWfoi0VpuFglaNuRlw2xikFII8hfeUEZpFdFJdAzqbWS8WWmVw+ZGQ1YIae5MGK3wiAguNS199daqUi/dYyS+Ne7RIA/dirUlZo/ZEt1yh1stoGrwE9+1RZzsaPO0kM3YJ9/thYiLU3/XWvmgqqq9YzU9zH0N1bYvZuI6Mb7+YhdbWv1z65Pa+oS2PEOWRjAamM3prJpb4HcsBXFx2M1wIkJhXdJxH7wHH/SUtifOuQThQvWQdAqvA+aqDUmkleAQZ71/AnJJCvOEGLxhpwxF/r2/xuynn4dfn7VVTDu/aA3Iu5+18jRrZfR66iTdG2+vR6xil3O0SM3M6dOnyK65x2Y1aYoMB9Z2O7WJrluS8bXNx/quhPc8/5lUZacivF25eJH4qj+6a18WbUndvPLvbrHLpuRihqpuAi8OrppPDFd/TFX/6myOc5gcziH+7G/dSjEMbZ85MTnw9el3KHsxPpNE2VpPyB6akV6V0Ww0NLUxchOUwdhTThwFAiRtqez7VUO7OZWW4FYHxnRVJuGcHfkwQGVD/znNDfcfZw/iOm1+l2pgQMdjY9VCXEQqjwutC12fdQqo0ybAUsPJ9fv6lbe2BXSLdp9XsFtRG6qP9vix3x4SBJlD+4tZ+8LOH2tuR9y2u3q7+pgY0sRmDEujeZJbhKV2DxBe/DCATre1mNoZAzvJcLMKG1Tbbp9p1amvbhtOzyWBcJXikKXUevxhNuOOFKaFNEiDl4Ulk2FICrOffh46bWw2hCWG/v/lj30Lvuw50W1/LUNlJ6E6kEDki7IeWjXoxHeziETQcN71/7oPd6RoqxQN7njNiSnlKZht2dzNhxm+VQ/zi+1fPfNZAHtqLV2QELnki/9eISKPUtXPh2Swa0KItznTcQ6TwzlGEhUjg0ZRVMGMpDcTEYNH//r7znSYuXj0r7+PzzznFh7+fM5yU1FNk6Dk6pltJXgPg+ARvXGqs0GsgnaMEdUsKUTFVhe6MHWlbE08SWpVSF2abWiad5acYGQ8vM051NtOTjNIM2tN2e3USGn3bqCNkhwd2HyhrK3tk7jwpQ8P3pPQjt4KgPWpe4mhbWvE/ns/eYQkM9fXjpyH/uIfyXbb2gjbW0w7htMxIUR2s5OuYlhZsvnCtAxchm2Lf0Qm9VnP0F2XpmHg7rt2UzzXeIwotxEVVpP5tljrqRHRRKGqsEGxoLk3xnTlg4NbOrfDLV53B/UvvoTm5HTHazF9Y+dVPni9wepdkeKbqn0fJJEOjeTVqpC2hRXOd5DAtMFX0RiqpomVSyTLrRam8DoNc6qNWUCgmdvcYLlunebiEFk9tpkJlfksXP+pW2/ZUUVEbbM4NN5at9fgib93B/sSjtO227rbXPLk8X7gq873NhfSQ/oXgVuA+1X1y8J1Pwz8feCBcLN/rKrvD397HfBy7Kv9alX9wIU6t/ONr/jDO9shV135gPjRYJtIOyc4l7jpN97L51/yzUzW7K2Ji7hLrErJBtbqKYoMcOQFTLfMAKgF8CQutJekVWxtvLWYqjJBnMlqJERSD/jQjok2j2JirCbS13on2PFNzjmlWZvZdceH+EmFf7gMO96mHYgCVjn0pKYjEgbMGqa/WPUXP1ekO0Tz2uQwEJg2LZKmZUgnYnYz24451xPeXrFEkhp0BDUnSFHAIDejZld3t93+5TdDivDceolqexKpwx5YhHZOGG8T/y+NNNiiqbZrdvXkxw0gEF7jOf8HH/SWbPceF/wYTZDeTgaJVXe9mP7Is9gecwiumLQTwQURvnYA7RVf1uikl+gCVNaNUmtF3beJDFLbXMRENs5Jb1xGEiGf1vj1Gc2DW0zWzBBo+XjF8DEjmrWS9XuMsR/9Qz75rFuIntjhJHecPxikdV/CyUFY/PeKrxCRU2f4uwBn+jtwYSuHdwBvwTTL+/HTqvov+1eIyJcCL8L6Y9dj0/bHq+o++vvtT/zZ37qVwRLUFWxNPC4xTaUk7fSSHvub5ycD8Kjbf4vPvehmk9iQDoroGmEajNizAsogV5EX0uuKhA9uKq3eUtRhKktwG9Y+SjMhSQTN7QsffaPjF60qhTw4uzWVwzvTgHKpkhwbIksZcmLaflH8+swWI1y7G28Xr1YEKe76Q2LYxkmYs+BMnFll9lRU3XI+76YGtgDNfLerjgioEDK3SIV+caxE4hc9TZDrjqMPPTzfVhrkvUFyCoXbbp82317Kd3kzo+7IrOpQTTW02uWRZT3ZsuF1ke6oeiKvoeUf9CXKe20m9V0lopXHLdsJlW9+Lm6c45Zz0uvG+NVqrv0ngwRm3lpJ/aF0IjvPJc6CGg2tq8DizmwW5IoU7VV0JgjojQkO+LUSPWmDfClS3Di3CiQxCDerRfv+LI1mlA/VFNflZE88hrt3g/yhE1gbz7cJYnvEqqHc3GM2cA7RMvfPdJtLP3PYlyd+wZKDqv5eUBtcJG4FfllVS+CTYbL+NcAfXqDTO+8YLAE427EHh7dmn7DU0H3Ao8dDNA6aTUzQL8nMIa6qlfGKoyoNvhrD5hHSDarD57muDcGUlY5sMP/Fj0PpaBmaD33wfzC/hTRrcKtFi5hJrhu3EFZ6u11XpKgL8txN3YnwtQtGjywVSGpCwPFHPgMemvkhshQJEmYKWgUkUIa1LZowGK+86QPFBBMTQ4tAkvmEEY6vJ0911UNEGI1H3eKepGHC661KiKVU7L/FodN2nGOUr1hf664bDZDpDKalDWRnVfu4QEsS3DFziLaiO+S7CTv6MCuKRMNJhTs6aG/rJ9s00qGdO2ifDFeG2/WRU32SYB8kMBM0t0TbSqJMGxhk7W2ifIpkibWV+q3DsNh2SLiAfJtU1qb0zioRr8hSRpop6w/aeZrUiyXZcjNhtuXICt9+bsvNnQCN8w7XQ92dLi49Wmlf4lLMHL5bRF4G/BfM7OIkpmP+0d5t7gnX7QgReQXwCoCbbrrpAp/qznDOYKXFyCPicBOrGuqZ7Opve65hraRO6z5KfkuYK6S5Z7RiKq5JpuRDm3f44J7WVDaw3tryLdGt8Rpc5ZSmNrZ2PYu9fqgraQ1ZIoKpmtpzSnPbqcUPjG7WuONDqEwhVZ1BcM06M2gjlQ06ZW6Bs5mEkeNasb2ybiGXraAfWMLZ3iZIpBPwy5x5QngbuhqG37UtjO0Q0I5816saevBVufqIJQnCMU9twg1fMF8tAPgakry7zkqu7vcA6RJJ0GoLtsIx54SwwmxD1eYSda9IjlLeu8EvG23ludsKiDDcj1VVgKu2SXjm8Sem7dyiff55L/l6QbDE3VZn9GYjvSTR95/QsobSHoPc2f+JGEBh2ntf43sPbbvQNhU16sSq0czRrE2tRTmpqCb2uW82GvyJLdzRIa4Irc6ZkOQwvtpTHEsZnpyx+XDayribSKRvuTu72YueS1jBuMf3/MrIDRed5/BW4IuAr8SMLt4crt/t5dw15avq21T1yar65OPHj1+YszxDPOn/uTMosdrvaWa77GYfiTtgg2ewxbvctMG0qiWFzjDIXrYkNc7CIEgRDMYmSzBa8SyNE/JCKIYwWhKWxgnOBU+HqaMqHXVp/8ffm9p8IMTZoLquzKaxqTsEjXrFn5jiJ3VnONNvC0VoY4weygjoZBzCULWVxd6G5++H9uxKI9bfjYL4nre2klvOzfsh9uyhW/wj16JfNcQv+nQGG1uICCLSVQwP3Qsn7kOWrkaKZSRfgnyEpEX7uyxdjYyP2+Xqb0fSIRIhWmmYWQSehDzxDR0nwsk8MW5WbUsSva9FrH56SKw5Oe1+hEV/8Po7SY6N2uqgf9929x6rlV41IL2Kqv/47TntQtTzpc0KfFl3ra5BkEtPTFlXJzaP8Buz4DAYPwtJmyx009BLZkdL6wjXPLhlD79aMFhqyAbasv5xQrKSMlhuSHOlKq36zQae4XLDIHwn9iVS2/yc8bLXwPoyiYuaHFT1PlVtVNUD/w5rHYFVCo/u3fRGzKziQMYTPnwn0/W07Xn6Rlqpa3Hwv5+2Owlu0Zi89hlIJsH4xMrlDrkR2ktbjq0NodyiPQ+X2hdGpNOSKUvP2smGUw97yi1rN2WZmPRH6ZgFGYPpesJ0Q1pnuLjJbepu15WkwUt4UrXmLs2DE+r7S5q1WdfvnjY2mIxopaZD2nSLUK+vDd1Ovp8Y2kTRoV3a9kWvtJelzBJCqA6iMY5bzo0Y1g6jXXe8zHVKqoO8N5BOuzlDkLggDQPn5RfA6AgyWLV2Ulz4AQbPsguAr1FtUG2QIy+FYtxdALJsW9Wy7WvYSxhzlqdxyB/VZcPQmfg/nYRL8X2mAN0S5QZJmLe47n1ows4/RuA12GvZaylt54ecbvEL1ZpuGjhBg5yJVk0PoeZbmfdWIsUHCHRZh89Nx9OIfAcf2kzJ0YHJ32fe2P6ibcVq1e78xsk3ndXovoTQvn6nvezPI+1LiMjXich3hJ+Pi8hjF73vRW0rRZ3y8OtzgP8v/HwXcLuI/BQ2kH4c8McX89zONupKqWqDsa5cBYOxp5rKvs0dtDJvhph0jOEc5wL2hUmz4COxBcWSJagkN9RUNRUmpxzTScPWxOM9FIVvHeUAqkpa4b24HkV4rPdA5ahnLriyBSjrCU+xVZoUdGO+FGXQ5h9Q4xpPE4bT0LXjW9RRfH7h+taOskhbUbyIOurbjrYnGBY3G3YThuBBcyneN7KCi2RuMbX7y3xiyDPjMiRRXrv3/sWK41jv+5Q+PXxrfrNrKQFMfgNGz7Gf8xHS62PI0ZehD7+7+/2m16Cf+HFIG5PXcHXXugkVS+QHAB2MNBAB279tb294b0Pd+OsdL+8kSRpjYUuU6I4L9LRpXx8fEsUcyauXlHX737bxSTRKn4Qk1k95LUAhCAV2J2nCiT5CknvvVawMvIBOaprPbQA2h/N1ZFOHx55UzLZcaCt1WmHVFMpJZ+N73uHOkBzbJ3sw0oOI/BDwZIwZ/e8xyue7MUXYPeNCQll/CfNCPSYi9wA/BHyDiHwl1jL6FPBdAKr6MRF5DyYpWwOvOohIpX6YImswWB81DMY1aeHYeMhe0k/dasqS58LmtF02FMP4JXD4TQkGP2qe1c7kLXxj5j7pWopfsrI6wk+rWuc0ZcrSSHFZ4HBNt5Q0FerEeBFZ9MTObAdWhy+aBNRSPQNwVA4yvHEqWh0mm3+4OpLnXOsfsPP5zVcNwFy7KorvKWGQ2UsStht1NpzNw4A6CazyI0PwHn+qRGY9z4N+OykuwDEx5JklhshfSJN59NRuIlZgVUL9AZhudLfZ+DUYP6+rIHohR146f0WWdaZBTUAoeYVcYVb1+v0uDGZDj7/nWeGi3lTmwrA5ITk6gDyjuf1lyCgzRFE7z7GZglQNGhBeQKt0hUuXAAAgAElEQVSZFVFQbcW3jWvhgqlQ8bo7KH/sW9A++izOPgJHA2jRT/G1NETVts9D1OwCyLSzPI2vmwtu2ZOaZq3EFWmQdWlIxgk0puE023JshWo+zt40gDg2N5p9swm9HBjSvXgOZj/6pwCq+jkRWV70zhcSrfTiXa7+hTPc/o3AGy/U+ex3uGCek2b2/3C5ZraVsPFQ2jKLzzkSZ4veRjPHTAaTykgcuESYbppfdPSOdqUjQvw217U1VneJtYuit3TWVg9KXSvOx0E7FCnkI9/anI5Wm7Z8hziQ03YOEQfgQFtl+NArxkX8eZxJ9FE28X+ZVwaN7mNB3C/c2xaWyhuxbpThBmnbgmI06PgJaYIbTGBjYu2Lsun4ERGR03IZeq2jyHoeL8Os54MyXEG3TiLXvGLn+5Q+HbL3QblhbaaziTQHt01BMYr45VlLoNtNSypCVNPbrBrxd30nsq0yAzrdI3o7/2hDmgiSpO1gOd7GVzp3H6Bt4RWv64hkxevuMKa1V1rbmJ6ta8tiD+fVwnCLpJPmaAUDez7acfbkMCQaAlWQcJk2aEA8OcCNMms3bcyslTQzQIWqoeua0IIdjhxrJ/fHJnQhhvSByQ3MVFUlfEFFZGFFVrj4A+krJtRbebt0VcXoaIMbZy3j2Nf2QW3Os88ZW0rx58RZG6jxSll6ytKbNWgTVVhtiJxmhlBaXklMTnzoyAtHMTCbUd9YUugL9Hlv6rJ5qFbi8yuWGnOBy+MC0iWCmLj6Kq6RMBdnI77lTkh73Db67Z523uBaBzTyIC4X2xX9fvQgQYa5JYbxyNRSw05frlqFo6vWqoqD6Mwhw66N1FYNWagYxiO7Lsm7WUI+gGq6e2Joz9vZbX1Nq/mwQMj1371LYggtl6jgGuU4ekKHneNbIEm++9vwp8rw+qstoJtlu+vvYLuu+7nlekRxPKuyitfdYRLs4XWzx7P3YjuRDkxuY14EMLH5T9/FLvw8Jww4yrpZSuJscxDtZ6F9z+L5j9/yQZb/zd1d4hjYsTo13aR1TpynoWj7subFPi11PRj06YX39ueh9iHeIyL/FjgiIn8f+CA2610oDuUzziH+4qm37n2jwziMCxz1O196xSBjLpdYDMp66d+TYEP6K8ATMDb0FwNvUNW7Fz3GYXLYI/74q6x//DV/aiJff/4N34JLCbv0SFITmlN10EFS0rw+L3SEZKZNJIOU4XKN+jTsxB2b690A2Ts68b0mSG2EofQorfG1kA9tmD3ZBKbAoNtBWVfFWkxLY0N71DOD5Q5Xa9OKqoSqNL/sphZS1Tlxwb7woBkD+W4TXJuSZlSKEFHwEgbc9DD2cVectIzbGJ30d8dbAMx0JlYBzqFb03b3rdBxB+IAOs4UBkXLgJasmzuQ5ja4zbcR3/Z8sxwMj8DmibN/owdDmy9My9BKi9pFvfKqx18Ae838WtmR/NrTOP2gtPWAwJn0RmJVmrm3dW2r8idsoB6rgCjEd6bIX/2fTvu3eLz+uQuEYbhAn5PXDuS7FuPwjfNClbHKaWVVMOKkXWcS97MtQ97Fzq5vrHqIcvfnHanryIiniwMwcwjtpDtU9auBhRNCPw6TwzmEenCZLX5bPYP0Pv9BvXkmfOY5t5y13WHfnCUfejQ4iKmHLLUPeZTMiCJ7WUAu5b5DczQuskg9WeHYeNhRlr5NKHnhcAkMh6bf1FSOWamkmR0jLvjqBXVdAohEwKQnNBjLeVVrHTVh7mBJLfSfkRbgM+eWte3L1Dev0cpbSwjXGfPEVsusxy6OP0euwLTsDITS3sA5zBbaIfRoAEVhCzwgaYGG5CBpwRlDP9LNGk43uD5DyA2vRut/aefcRCJc0x3LKVQ9PsAc76HjJ7S6UvG162tQRcZ5TBBVkAXvSZLs0G86j5j9zPPnWn/2PLq2oJ27seg9dDaw4Rzjee8mK77003ez9fqbYWQ8DL9mcNnY3nSJsnrNDPU55WZig2mvNF5bK9zzDZHdfULmb7MvD7Uf8VER+Ruq+ifncufD5LBHxIohxpf87h38r6fcinrYOJGy/mCGOOXIo2bkQ8/WetIOc881Bq+/k61/+sxWH6dgZgikypGVwfOh7ad20tzF0OB9aa7U2GKe5r6dWwwqBzjqyFQNiSEf2uC7rrRFQcXICt/KZ7jUuBFgcwZxptYaB/CJ0/ZvMUwKvJtB9GcODm2HzdAxaFtCXNTsoUsYc5pKYEqpUf10VqGb3TC5HT7HwXNMDEXeVRDLV8FgbOS2egbFGJOgrjsOwxmiEU8ym9qsonjmnrffHvIF/wh9+Ie6YTTMK7v2SWcNHeqKXrUQYcMwx4GQSBCEHrnOhtAMzNuh1WmKsiRlM0dQO5/QaWDMx6cyzvEbs3beIFGMsYdeU68Mf/j0m6notR0XaB/UW43pD8PlmvHROhA67T6+Yf9WussIygp8I/BdIvJpYJOA61DVL1/kzofJ4RxCvVDVZqAznXjywrFyjZAPG4qlJPgzn18Mf/R9bP3TZxpqZ5CSbNlwOEoHWAvHtaqrvoGqhGJpXuPJeyFxSj7yqDZMN5N2OJelwmC5Js1M5TLNhCTz5CNbbJxTsoFv5ZOtErBWk/cCfn7D7JIuqahKC4GNVUJc89Qbdl08SEQyRXQLPXROXAhbY5uk9W3oPUGrEsq6XSRl0EckSYdGSlOrGEYDGC1Z2yhJkWLZEkM+spNLBvGNhuybd3+D9CM01DS+Yo8mw94xGti3dn2jk/0OyUKyxBJo5dE82b191Iec9ghz9ntXhUjhkKGgReCBDPMOGQXgFX9i8/ySQ9OhptpPg/dtkpJem6yFKAf+4V6CdvEcAWQ5x00b/ENVOFZE0dkx0lzZ2rAqN8tkrlN3XpHuLbx3ENpKIU7z4V0sDpPDOUTEXqeZMAi9zHLTMR0mpGFxjbuZKJx3To8zMActyRz5uEFcg4hSbibUlYQdfkJZ+oBk6nZTVjEYeqPcTGznnyjDsZJX1kZKUk9WaOuy5RLfSm9EkloUHm00SGgECGuM2G6y16V37tIlBHw/WdmaH9tPrT91j2EKdOiaXsvDrQ6QQbJj4WsTQ4S2prsnB8myLjEUI0gH1jqqpjA+1nsi33hmHJ//EIij8RWpyyFVSJ521u/vXPSTGPSSRI9z0Ce+9eVKiqTzpIh6R5URx9rXpUjb6klWxrSmQ/HxpiWc2mjlSc4lqn/7ovlknrm5SgawZBDnHLnbAeyJzO7TxegnfpvyJ57TzqeM66PteMj3uDnR40Sc7p8o5nYl3l1vsz8PtQ9xXv3Cw+RwDvGED9/J/37as8kCySZLBfWe6XpKPmwYLjcmGBaG0vc8/5mkuW931tf8h99e6HFiewmvuNWC3M1Qb22cpBam6/HLYY+T5mFIPjDjFBdkuOPOPx95RkC5qaZNk/lQDTjENTgHoyMVgyWrMHwtzCZm2SiirYxHxJFHv18fZL5tHqHt84yWo1EwEDpCnUsseXVGPtt2xI03l7MWKpnilgP8dFZZe6HvzhYXwH5C6CUJyYJMxmhg7aIkR4ardt8oayHfuPeb4j8EQKUlThJcs5OHcNaRJl0y2CXmSFdpr4/fh7vG/6FTNY3tw3Fur83ICHIyHKJl2bXkvEcfOkVz38Q2I4Ozr4Xqd760O69A4JNeVaCN2nH7ukxxNhIGzYuGn1S4aW3Vw2pBkVX4smG2ZXMGcTarq6a9lmhyXutkF8ICPIcDkx3eR0cTGgCPBf6Czjr0jHHIczjHePzdd1GMlNWjymCs7UIcdY6ywioIt8vs4f5ve8bCjxMJT1FTKHIPssK3VUmsGOpAAgIYHFHyqxKKFRgfrchHpkdjrS8jtflamG0lZAPPyrGK5WMzBkuNDZ4rI7hVZTc/mW056m0ezTEx9A1Xop6Nb6TlQcQEtn3Ttb0d0iJw2v8FGWUmCxGQSbbA5e3BJEts8euxnlt2c0wMo0GXGCIvQT0MF4cle/2gvQ5a0misGnIjw51HyGNfO58c4nwgiPUxHlliG+T285Flc6eLfI3UqqnmwQnNfZv4tSn+4RK/bhpHzckputV5X2tZwv0n0M8/jN53Ev+pB2nuWUfXZ5116BlQSNujuf1l3XNJxPglRdrpMwUeBI2Sfdcv2/V9jauQ2Nv5yF4RJcAHKen1Y5Lrx7hRGjg1BoTIh57RatM6yJ3PDHAu+npYp7sckNygqk9S1S8P/z8O07L7/UXvf1g5nEc8/u672p8/destNI3YpYJ82JBkSlbYzr4JHglp8H5Ye+XTSFJt3bRGP7F7NVG89jfY+uFbjOnrBDfOyIF0o2qTka8TwNBKSR+V4RVfetKhsLzU0GwFL2g1BvTWunlKD1eM5Q325ZqspcwmjqaxsjwS3uqZ6w2Yaf/vhs2G1hJnw2n1HdTVocTmfOdPHd3bulOOvtCRBOdGWSesN8i7XXKM4Fi3o40U/p9LDNmgFXWS0VXhNbJKAPd3z/BOf4TKlySSsuU3aLQmd8PuPPZjizUa9BBLvYgWpEDrPT2ZhuF7mLg2SvPgxFo3s3mVVvUK04b606dwqyXJtcaa9hszmJmHgg/OcCRyVklhLmI1EFt7US12m7Bi/c6XIllCetu7qd/50rOqGNpwJpmBM9tZZjafKYbdsVzatZeq0p03IbWNxM1XrLvFdk+P3W6yu1PmUYyb8BhMXuiFwdJgX0JV/1RE/saitz+sHPYpHnPne3nMne+1dk6irS+CC7uY4XLTwkP7aKBFokVveCvN3SjFjVJrE63WDJZr2yRnHSKo2lTKk56t9RRfGjw2vaZgcERNByq3HVWx1JDmHStae/MBG3zbzGKyloZKoBvuxdvHCqGPRKpnNpuI128v6zs5jl4fPUZ0gSu2sWn7lUFEIfXnC32LzyxDlpfg6AqsHoHhig2c81GHTBptw+FvC9UP0/Q4Q1v1qTYx5Mkw7BTPlFQWD3niG5DhwKqBQR5aTbW1fjYmlhBObdhO//5TNJ9fp3lgyy4PTszuc+bbz8fg9Xd2kt2h9+9PTKk/+TDNfZumnLphHs6R11C89jfO+rybX7nNzt8JsmQVnoxS073Kos90WEy38QPS297dmzGJVRULxPBH39e1ziaVaThljvSqrAU/xFZmmivDZauW9yWinPv5Vw7vALa3EH4Q+FDY5X8o/H4epyqv6V3+kYjcTmfRvGccVg77HDe85/187kU3t4gilwhJ0YTBWOeLEHc20T5x8n3fBMDozb+z63Hd0YF5NLcqpgn52JNmhtZQL62Z+mwrQZy5xoHxL4qqolgBsoRsRUnSysT9lhqSMD8gEaoNQyXFpAZmGVqXrh1wq8fMfaJUgUS58jhr6JIGoedrP9vt55JjmDe04nh0ePcWFRKkpaUdwvaGgrNqvmrow1bHI0sKLji0xall1rmjLbLLq/0MVU/qCpwkZC7yHxaYUZxFyFf8s3Zd8X/w/fbDKVMibbWIAkdBnLQubzLOcc9++67HzL/7Pe3P1dtf3Ml79+DC51ot+F//DvshSquH2YlOgxNfEdBl3gcBQEfU12pufxnJS95F+vduP6fHhp4nRfx9Ws8NnpNUWyj3+QBD5mKhgfTe2eE0Tpm3YmKlAO8Efhf4gbM7wbnoi+zV2Axib2ZjiMPkcAHi+l82Zud9L/3mtoVSbhnzWD2kRej5+zmS6xkjoji2Xn+zLRJxSJspg6pp2zdV6ZhuOKqptbFcEMmrpo7Zlm9nFa4Qlo5USBb1dxLzaKhjIqCV/65n5hrnkM4ISCyBRBZ0n9QWE4Nhz20eVs/CYLuhHRqK07YnTeI6dnQSNXnc/JB6Ws5XCd7PD53jlzJNuzZSeJElX+qSg/o9qwYAxeO1QRAyFxZiecpib9h5hvvbPwl0SSL52z+J//CrYTJF+vOJvVocvci+85f2/TxtwQ8V3KxqNztunPdgtboDeXa+oVXTKfY2Qfa79K0c/fK/2YUU/Iv70FpaqK0kAM8VkX7Gfpuqvm2Po18bLQ1U9V4RueZ8ThX4n6r6q/OnJi8AfvU0t5+Lw+RwAePad/8WD9z2DGaTDuGTj7u+aNoTCot94slrn3Ha+QOAWy3MXrEJCQJPNlKWpCJJlc2Tabv4pmlAjQS4aYsoSgWpPG6c9dAiHl8aFDCyoqOfNIQN+TYhwBi+EaS3MWuaeYE9W8ekV3lEVq8N01uTlNCv1iYkjQhnjX3sqBniA1HCq3kxzJX60slkBPaypEU3b+hXDXBGhJKTp2JaZRcvKew4h5AkANxTfuaSnEMMf8fLu3Zey0BPWrRVJ3VCeI9CxdNjQScvedfcAPtcY/CG32Trh2+x9zsMp8dvfv/edzzfOJOMewxLDr+uqm+48Cd0xngdOxPBbtftGofJ4QLH8XeefqGfvPYZzE6aV3NSe7IV25Fsfu/TSK8zeOX2PnDx2t9g9tPPo1krOzx5kZI5cx6D+R5/ZDKLaAtxlUxwoxw3znFHB9aDbqzCaOcKTZcY4hA6/pz0yW4+usW5zrWrtkQQUVW+6aqY7V0crbzJOM8NNHvs3z53Icpqxy9nmiCry9abh+760cASg3qbM0S/Zxcc3Ypnzg+i9SP28y6JwhLEIyf877yqrUrcM966x421Sxa+mvvTvEXsfNWQvORd+3Kuwx9+ryWIixkXVrL7vmiIJiLXAfefy0FE5JuBm4EbRKS/o1jB2ksLxWFyuEQRP9TibHjrvYNTDelw/nazt7xwrm8MJpVcvvm5NoMgSEokKXniyUY19ZZBUSM/IS74aWboKBmlJEcHSJGSXLtkQ0mvpFlNibV7fCDZxcEx+PYYVoV0zOdYlVRT10IJR6sN46MVyVUFfq00SGxMWP32bxMNYnwLo3SjAI7vE7+i70KU5Y6ORVcdg821+RdtMDaIaVO3LOi2pZTsLYnxSA3/wX84//tv/wNDTzlnCdh7e11HQ0vMkScBHb+h3wbsE/YuUJxJauOCROI61NjpYoE51mniLuA24E3h/5066YvF54D/Ajwb+K+969eB7130IIfJ4VJG48nHkCQNTRPVSh1kCX59RnKteXOUb35uO5yNw8Pi+36d2VteiD+x1cJcZZQiTULalKYrUwtZoUEVNVYZCcmxEcnxoSFcjh0hiSqfwKCZMV1P8LWpuzqn1DMXPu82P3HOtwkh6irF2QLYrGKw3JDdMMYdHaBHByTrs9a1zHyo6zmWr70evQHjdomIiGrqS2CkiZ3EYGiJoKkDWiScXFth5N1QOsbcz/s7WL6sow+l3b5D7vfaI+dkWrb8CSnSDpras2vVqtnXecOlDEG62dbpb7T3cXZ3ynwT5sHwcuAzwAvO5RxV9c+APxOR21W12vMOp4nD5HCJQpzQlKGltJKSADrpttSSOfyJLdyR0yuDxopi9pYXBkasR+nM1k1Mr+MgQDBjH4Tk86hlZHlM8pVj/H/+c5JjIwZO4LNly4COEFfnaIHP6oUk9XiiC5y0JLg0V0YrNcWxFFnOIRGSa5dwq4W1kAapPbe10kzog9FMxMVLVBiNSKVYMUTOQoSyrqxANkDGx9Gtk0EbKSCSkkByE4ckhVl5jo5sewMOE8L2cE/92R3X+fe/0n7oc0hiGy+KZfXbfBEo0LNaNaZ00qmyXs7Rf76njYXQSrs5ZQLsDzba4jEi8mPAl2IM6fjYX7jInS+kh/RuJI+fBJ4FzIBPAN+hqg8HSNefY9RugI+q6isv1LldzjH7med3TNILWK4fxsULfdjsPnf4TF+BESGsl21E8MNetzkY8e+xiuSnMdz1d3AWE5ELSYJ7BztJHncDXxYkY/83NjmP8QlV/cpwueITw+ANv0l63VLXf6+C2N0gRRKxv3/BqpHAFoAButWC5NiQNOzSsyMpo6NKPlbSLOgoDaUTQ2sUd8vbDFv/Ff+M5PgQSQR3dEhxTcZwuWGw1JCPTK4jLUx+I1qRbh8wN0G1dbRaM75BSK4bQ9XQ3Ddp2btx5yjHlkm+4CrSL1wlOT4yW8rM5BWi14AkYhIZLVQ1aS1BWVlBrno0Mj7eIpBk9Tq7bvlaJMmQbGgs6GzQIZTUL0Ba+0jvcjZ/uzLD3fzzuJt/3n6J1YPveWnEKiIOpvvyJdC1Dntkx5YfcTlGhLKe6XJwVFmHqvohQFT106r6w8DCsLsLVjnsRvJQ1T7D66PA8y/U418OMXj9nTTf+zR0UlHPhPy4tZCGP/q++RtmprqpcdHMnC22sZfbE2bz6zPccm6QUK/mKFd4Eq/IKMUt57Zwb4vkW9+JvvvbYFrbPKJsbCYycmSjBl82bYsqqrP6np5SktqcYeW6hvTGI0gi1A+W1j5aN0Z3JHW45QyOXYWMBiTZmpkbTWt0EtqjiXR+CxC0lEJiyAfIynW20C+/AJq7kXLDZgppbgqrHd52p5tbRCZFv+dzVlPtJ4jza1FdFhWDky4RwHzVOgdfjVpZrlOUDQlCihSSfRAqvJRxYdFK+x1TEXHAx0Xku4HPAgtzJy7lzOHvYToiMR4rIv8N8zv9J6r6n3e7k4i8AngFwE033bQvJ/Knf/PZAHzVH921xy33P0yvvyFbEnRSzTGkZZRCaYJ7ANlL/0P7t+b2l+GD0YtWDVp6GzDH+w4SmDZGMPNm7pLeaITJ07Fp3TUr+HtOwiizx266IbYbQxogiX6tZPNkavIYYSBdLDWsHJuRXLtsLl3rs44pWzX4iZ2TbgrNA1sk0eLzUcdwRys4sUYTiP1SJN3uM8pKDwpYfZSR2QDGz7P/k6dB8j5b7MuNDlETE4NLuzbAbqqnO7SVdi70JqNR4SQxR7ptbYNG7yaRPZJMc3cvae1nW/nihHvGWzv00twfHO4W43b5976i+7tztrq0qrGxgrjMFXsWeg4HJjt8DzACXg38KPbhvm3RO1+S5CAir8fwtv8xXHUvcJOqPiQiXw3cISJPVNVT2+8bWIZvA3jyk5982TfdJRqv7GIgkrzgHae9X/KSd8HtL2sFyCK6x2ChAe6ZiPk/YUnIP7BF+oWrNL9yG8m3vnPHMd03/Rz6q98O6zOS1cIGxbOwoOadnIUMUpaSCXLCdJfSQhksNbhRamS6h8tW74bMWRVSNSgmu+HXSvBrpsNzpGqVRl0gTMnSoG1PSNIr1TdPoL5Gjv29+RMvngn1B2woHSnnPS5DozVeGxJJ8TrDa2PCec1sF9hhrAh2JolGa1IJUFgFRfFRE0R7lYR8oyWD9s3aljiau6PGiP1+OkOhAxbuGW/teBChcmhbTtAmCQiD7NZoiN7wev52l10swpA+AG0lEUkw4b7vBzawecNZxUVPDiJyGzao/ruqAWSpWgJl+Pm/isgngMdjWN0LHpeiYoiRXLtk7ZSzgPr533uNGdOPss4mslFkLJ3eTCKA9YGlasy3d3Ww57HlqmW0fBhZzs2dbNq0X+zoxCaZyVwsZVPyU6bymeYKLrMqJh4r6iUlEo5jaCkSh48tpElFcrSE8QhZDiSP0FJqE0OUzBiunP7E06fv+WnWnvdJpSVZWpzWQ2F7ONm2IBj4a/eI1cjc7QPKpTmYiB39k3+MNp0sR5+Z3Q/3TT93dgcOCWK/E0L0OQEYvvEiMKNj7JO20oUOVW1E5KtFROI6e7ZxUZODiDwDE5L6P1V10rv+OHAiPKEvBB4H/NXFPLdLFcm1I3RS409snf2dxyPkiHkBu2/4Vzv+7H/nVYZDr6M3s0eG2RkP6Z76s/D+V9J8zohlNt+g824GyBzu6ABZSkmmTTf/AFxEUkVWbCIGnW1Kg9uGNpM4QQuFpqF5YAtXeUsm49F8YogKrHmGLF19dq9PaN8kQCIf6WxPHFS+ZNZsdZpJ+pEAb91ZMYg8Bdk+hFbDvLftJP3IvCytOLwojsSqmiRHVRGXzieWKxRS268orqhYBK10cNpK/w24U0R+lbaHAKp6Zru9EBcSyrobyeN1QAHcHfq2EbL69cCPiEiNaXe+UlVPXKhzO2ghmcMdtV3z6Vo+/XBf/1MLHfesd3nxfjf/PP6dLw1ubNhC3fMGlkHaWlPq1AzpW2P6qIHUKGSWkKI8NI3asNyJ+TZ4b9VPo+hmBYMUuX5sUttRKiNNbIZQjG1+UDzznJ4TfOPcdzaVD+MlKJMu9GX+RuZaTtvvIuG63aoGrGpptELEYdYWB4tiJH/jX8Af/SAkCfI333SpT+fgxm4S89vjwOQGjgIPMY9QUuDSJofTkDx+4TS3/TXOQkr2SgoZ5lB49FTZ9vSbX/32M84bLsp5jVLzIPbBfKcvaZE5WBnDZAto2oG5VjZbIEvMzH6Q2mC68iaJ4cQqizwI6jnXHrs1hjmxBktDq3iuf4wR2bKhSWLs5/OTp5D4DwEKblF03wK7/Dhs9h+i9jOcJCRJRuWnKEpCanOLemq3O3Mhd1HjckoKOxB9FytcT/r9dHHu8hn7Gqp6Xpjhg7V9eQRG24t9/yvxJzbbAfWlDlNHnXXcgyR6gAqyZJBb3ZjRnJhaBVF1qpzuSIE7Yk5pbjlDj3eCUf7hspMcD8qrYIN5yaIsRlBTvfrbL+yTvJCoIV+Tp0O8NjRaUavNZsxBrg5oqnOF0R7GpQu39+J/AGYOACLyeOCtmBT4l4nIlwPPVtV/vsj9D0aKOwwjG4Xduk4OyNAyT8yicylrZwdupYBZRfOpB6nv3UDL2tpKYWaQ3LiMu/4q8zkej2A0QJYK5Pgq8uhrSB59BHd0YPafwR+7VfB0xm/QtXXkS/7JJXzi+xDp06Ga4uqKVPIW5eRpDFVVzy7xCR7GOUXfUOp0l4MT/w5r5VcAqvrfgRcteufDyuEAhXvuv4c7Xn6pT6ONVjY7zhqSqK3T4NdKdLPCLefWRgJTfF0a2AC8bsz85aGJ6TgdHyJXrwTkk9hgPE2hmnTJIUJX+1G+ryvj06dfvCe/H9GDqObcTZJkJOqMsX0Zch0OA5CE6BNy+tscmAQxUtU/3sbLOZTsvmxjZOgZ/9v/YKjJ2lYAACAASURBVG89/QscWnl00rQD6Oi+po3iRhlazDOfZZRaQnhgw9pM0zCDSIz45qZNx+dYCuS2zCEQPBvSM2PI6w/Y/5dbkgBQT+KjrPU+tpPqD3Tw2HMe1h/GwiFy2bSVgAdF5IsI2DgReT7GKVsoDpPDQYs8s2EslzhBeA9NQB3NAtO6bogewO7ooNXZ0aklABnm5he8NkUrT3LVAPLCZMUnFU1Z41YL3GrgF2wYmlkGPchqhN2eeBeShGnt6oth+puGWrpc44AlNP1rgz7Lo7/nEp/JZRaL8BwODlzpVRhh+Aki8lngk8D/teidD0z9cxgW7hv+1U6JgksQGqUzMoc7UrT8CJ1UbUsJMIhr5nBHl2zOUDdIlpA9dhX3hdcgRWJw10DUowrs2rrpJJxbwbLwxbvh+vmTqX4rPFbwbIgVxGEE8l9+VokzJgYA/bMfQv/shy7EmV2Z4UJb6UyXA1I5qOpfqepTgePAE1T161T104ve/7ByOIixMp4XObtEocGbl4Ht9P0kJAWvaGwHrQSpi9AOwzmSG5bhyApsTPAPGrnP2NXB47lRg71Grf/YTkoTyMMXbDZBkxQpTA+KamoL4HYP6MNYuE2ln/95mE1s95ukUE72vtNhbIvLp60kIldj/LKvA1REfh/4EVV9aJH7H1YOBzDc1/+ULciD0xv9XPAIxjxubK0i6sB3WDKUkVvOrY0Uz/HEGjz4cCerfWKN+q9O4CeVJYYitcug86KwAXcnjyGZCezJ6KqAJ8/nJTN0MamLw9gjfG2vZTGClSW7HMZiEWcOZ7ocnLbSLwMPAM/DFLAfYF7s9IxxmBwOePg/+P5LfQqH8QiIfqvpMM4Qchr4av9yYHIDR1X1R1X1k+Hyz4Eje94rxGFyOKDRFz672AnC/8H3m1DfKCCKAILUhTsyxI1zaxF5D6c20JMbNicZ5DZLeGCN5t4NJBGSqwZ2+9hWap+gdNpJ8TLIYWkZnLWTZPm43bacoE1p7aZ6duCGu5dNNDOogklPU8NgBXnUF7fzisONyN4hLkFcdubLwVlWPyIiLxIRFy4vBBamlh+YZ3EYO2MuQXz0By7NScQFfDSANEE3g4HPpEY3ZuYDvVnZAHtWoQ9P8CemZkwUiG6ynBvpbZAio7RVd+17NchwAKOhubv52hBK2TeHywBxmSWGwbMuzetwpcSsgskUtoLQo0tBPfrXnwUOE8SesVdLSdyBmTkA3wXcjtkyz7A202tEZF1EdtghbI/D5HDQo8e6vGgJYloasigiiKJk9qzCn5ji143da2qsHi0bmns3qD9xMliCNvMqrtAyrGWYd3OJQW7EtyJcN1xCNx6AlW/t7lf9lvXH0/ygsU8vu5AbXt15YzgH01Pog5+AqkKKSzjfuqzi8pk5qOqyqjpVTcPFheuWVfUM+vcWh2ilAx7ua3/cdnNhYdQ/+kHgAouknQrqvtEKMvgFa6Mt2igijrTyZuQTXOhkkJgya2whxWP0ZQfyrPUjlqKwxDBaOr0kdzXtWNLRVOdyk7ruO8HB4gzprTutBRShqudbOcVKsG5ga9Pel1ll11eHyXfPcMkCwnsHIzkABD2lx9Bb6y+5ZPdh7F/020sxOcQqwn3tj+/742lZ49dKHCC5mcjrlvEaWv/qaQ9qGw2AotRGIp30BvQgq8lcNSJJAuMhrFyFrF5ntx09Z+cJJSnkI0MvXSlR/VaXLPooLN9ziJtNdkJ3t+7sEsW5OMilOUxnBpUehONsTNAtU4ldVA7+ERuXEUNaRH4R+HLgY0D8kF16ye7DuDCx3dTJ//73AeC+7s379hiSOfz6zJRSe05psY0kiXQOdETHt5AAQkJoh8/bE0M07snCAPrYDXa73ZIC2AKY9DwSLreKIYavO3/rswhdu9e8sV0KS0eR4Wr3x607oZqi1ZZ5a2eDMLA/Q5WRDSAvLTmc2rSKsCwXdsR7xEfbOjrjjS7KqSwQX6uqX3qudz5MDpdZuK/98W72MKtaUTz/+9+3a4LwH361tRAm05aRLEUKK0vI0sh+396iShPccm4GPlszZJgjwwzJGtR1VqQa2kuA/T8Q40U4Qcs6VBKuayml6TzkL033LtGha8H0fZovlyjf10l0A+oSGq1Ik9yub+rOTzpqJKlHp2sd8a8Y28+bJ9D1+2H5GuOCnGuEz4xuTe0zBHv7Ih+GxUJ+Dnsnh+CK+a8xo8K3q+qF6BP/oYh8qar+z3O582FyuAwjtpL8B/+h7fh6Yn3UtqBTedSryWfvEf7Dr8Y95We6K8YjkhvMr0HD8FmWjAktaQVlHaqGFJLGHqtqOgZ0e6L9xNCrGkS6wejsLFi6l1PV0Nw9/7t6yEeIiFmHRixI3OXPJuBr1FedpHeaIyvX2W5/6xS6ddJut/EgevJeyAs7bll2dtaDoaG7Vq6FU78yP9yP5xFCRNAAVb4Q7ckrMhapHPZIDiKSAD8HPA24B/gTEbnrXBfxM8Q7sQTxeaAkGNSq6pcvcuc9k4OIfDfwH1X15NmcVeh33QLcr6pfFq47ijH0HgN8CnhhPK6IvA54OWYT+mpVPRTQ2SPcU3/WEkTdnBbJ4z93EmZhcOy19XqW0cRYzsetTeF/7zV2zK//qblE4e/6TnRjZjvMMEgW5yCprIWUCNpUVo3kiVUMmTGi5/TtY4JoK4iQNA6OvPGFC3GQ5qgIouCmm92QeTCm9jOSwTLiUkS93T4fgUSv63Xy0RJZmqMnPg1l2Q2Ri7Elh/setPfm+sKOexq/CLnu/0Y//S/tlzQ9OA2QyyYWmDns/ap+DfCXqvpXACLyy8CtwH4nh18Evg34H3Qzh4VjkcrhUVhm+9PwYB/Q7Y3v3eMdwFuAd/Wu+0HgQ6r6JhH5wfD7D4jIl2ImFE8Ergc+KCKPV9VLr0B3wMM99WetdbQxacXsWn+EIIqneYLkSRC+c7bTX5/RTBuSRpEjIxjbR8F/9AfmdpHu2W+366PPRNRQmlXItATXDabdKN09GUDnCRGrhkh8u1K1kuqZPff4/MoNpKlt0c8GUBvMvNGaRmsURVPBA2Wzzqy8H0dC6nIarfE0pMXVyMp16GAFmhkyWLVqo5oiN1xryDBxyOp16P0ft8fdeAty/XfPnZp8wT+6iC/EFRaLDKQtOTxXRN7eu/JtqhpsH7kB+Ove3+4B/ub+nWQbn1HVu871zntu21T1nwCPw/yfvx34uIj8i6ATfqb7/R5wYtvVt2KlDuH/b+ld/8uqWqrqJ4G/xLLrYSwQcaevk8oSQhS3m9b4cJ1VDw1ulJFcN25ls/1aif/8KXjwZMuG3pVPMQgaS7PKKpU0gfEIWV3CHRma+mqzDbYKO92xIpR1OIRijCxdfXoI6+UcvjZhu2pqQ+NyvWsL9aqGstmk9iWVn1L5KWWzSdlM2Kwq1mYl02aDstlkq15nrbqP2XAIV92IHP8iWD5ms4zlY8jVXwCjZUtKSR4qj0dAVXaRQ8ES+R7/gF9X1Sf3Lm/rHWa30mKRDffZxv8SkdtF5MUi8tx4WfTOC80cVFVD3+rzmJPQVcB/EpG7VfW1Z3Gy16rqveGY94rINeH6G4CP9m53T7huR4jIK4BXANx0001n8dBXdrhb3kbzq9+OXzMCm9l3NsggQV2DP7GFn9S45Zz0uiVkKcMlziS4N6wF4dKH4BpbqP3vvAr3TT9naKjJ1Bb0WWUEuR5PYeeJhMTgfZA3Fksmnm4gPRoYdDUf2WI2vPUivlIXKdSj5TrUW8hg1Xb52QB1CSLCVn2KavYAtc5wkiAqKErjbUDsBMpGODVTEnGkrqbyp/DakDkjrA2TFdJsgKS5JYn1++Cq6yl1SrHSqx4OY99C8ejZd2i2xz3Ao3u/3wh87nwPuksMsVnDN/Wu2z8oq4i8GrgNeBB4O/D9qlqJiAM+DpxNcjjtw+xy3a6ZNGTgtwE8+clPvhDZ9rKN5AXvIGJOqre/uCOrbYb+s1fqezdpHpyQ3rhMctXAJC6aBBKHbsyQ+n5jLxOQTlFbaTLtuA5eIW3agbNuzdCyMbe4qNIaPSlmJvHdDqC99dR17V7kptdcpFfmEoWvDdkyGLNVn6JsHoQGHAmVn1LrDFW15BCGmKqK1wavUHnBh6/GMPF4dWxUU5xsUSRKlZUM02W8NqQupbj2iyHJmcw+R1Fc3w679eM/hjzudZfsZbjSQvfc5O+5LP0J8DgReSzwWayl/pJ9OLX5s1D9jvO5/yKVwzHgudtNIlTVi8gtZ/l494nIdaFquA64P1x/sTLpIyay7/wlqrd+K82JKeIEd6TAHSloTkyh8vj1GTptcKsFybUjJJFuVjGZdjLOk6ldnBHcdGIzDSm6oXOU424rA+9DC6rpoZXyjtvwSIiIaqlnMN0gyTIaX9GozWgqX1E21vZxUgfuoC0qjQqVDxBlFbxCGTrAMy+UjaNIPLXfYsNNqL0wTD1FsgQNVH5qr38xhoc+ewme/JUbXj1+j1HoXslDVesA9PkABmX9RVX92L6dZAgReTzwVqxj82WBLf3soM66Z+yZHFT1DWf4258vfKYWd2FVyJvC/3f2rr9dRH4KG0g/Dvjjszz2YWwLd2yIOzZE12f4SY1kjvTGZRtIT2uaE1OaSWUIoyINHg1hUHxqs13ItWqsMnBiaKep9khuLnhP5FYheG+Nx0iqalVdtUMqNZfeyOiChzhr9fga3XyIfHycUbrKevUQk7qm8o7aC41KmxRSp4FbaAnBA04UEOqQJCofE4fjodLuW3khc0ruSjKnFImHAoOtHgBXwSspFI/u6Suyd0NDVd8PvH9fTur08e+A7wf+bXjM/y4itwP7kxzONUTkl4BvAI6JyD2YI9GbgPeIyMuBzwAvAFDVj4nIezAoVw286hCpdP6RvOAd7c/1O19K8+AEZj2ce1jg/cMlUKKTCp1UJs29nKFrPQ7CrKEJswmc68hv0EMlxTmDC+0k380m8kdQ1QDGNUgLoLBE4WuKfIlJvYaTmtoLlQq1F0BIndI0Mlc99KPydtuYOCa1kEUCpEIptIlhmHqYTZBs2PIY9C/eCIB88esv2ktwpcaelcFFOo8FYqSqfyzzvIuFd2YXLDmo6otP86ddFcdU9Y3AGy/U+TzSw109suEzVauPFGUwJMwm3NEBbpTRnJii03refwFjVsfWk3q12cM0SC+MR6aXlGVo03SVRJ6ZhMbSKCiBPoKkGvKRzR3EwXCFab0G2CKeOqWsu9fXq8FYff/3sMpUbVIQKk9IKJ2mYTxmEyqLshHKoSMrrsa5FD351wfCdvZKiMUG0gcmPTwYUKUKICLPB+5d9M6HWLfDuGShH/uRS30Kj7jQP1+oo3AYpwkNM4czXRajgV2UeBXWUnqCiHwW+B7glYve+VA+4xES7pa3ze0Emttfhl8rDWEEkDjccpBSWO5mDZKFvzc+uL/1tJS8N27D1gwJvIc2BoWprkaOQ561XtTUTUemu6LiI3htgjwGoZ3kwRnZbea38DQIzqoHUWbaVQERGRzbR07CGKd3G687gX1ONNzWKouHZymj6T0MkiGDYszoxi+HE5+B+++5KK/ClRyqui8zh4sUqqpPFZElwKnqekBILRSHyeERGslL3oW89xWAJY5+6K/cZm2nJrSdigS8GsIpzhomFT5aiYKtXLMKnVWGYBoOOt+AmAjqBm0aM/cJg1L9izdeAX3wj9iQvS/Ipt7UVMXB4AjTem0HyiURJXXdgu/CvCEAw9rocwtj+yjZdpt+lI1wskwpEpslXT2YcHTlWvTh++zUPvkTyGP3A4H+yIseye0Mtzkw8WvAV6nqZu+6/wR89SJ3PkwOj+DYnhRiJN9qJHZ/13fiT5VoGRa1UC3QKH7ikaqBmdmACphPgPeQZ2iagGqArxYwLdH1zQCxzG1gHeGyV0iUzYSZnxg5rYfI0jAQTCR83Ry4SHYDEMXRg7ICaaLUavODaIsRkUkxSTjRuUoiJheAWoXE26Bbo17TYAiz6YV6+o+I0H2Asl7oEJEnYFJEq9sY0SvAwiX7YXJ4hIX/3e9pZZrdN/3cHjdWqxqij0PmwCdoWPi08p0pUGvsE+QypjMjyhUBoTSd2TAa0PVNZHlpfqJ6OYf3NA7KapNaZwwSNQKaN38FKTcZFitMmw3Ub9FoNT9MFhtQF4m2CcBrB1mtel2M2EJK2lZSv9qwn70KLhxzNU8YZ1fbQLqpD6Gt5xmXyUD6izHR0yNA39RjHfj7ix7kMDkcxmnDfcsv4O94eZsYNBEkT5AiwU+CeY0z5JPBYUEGqc0fvAcXOA4R1ho5D07QcnblKIL6mi3dYKs5xTBZQRAqaciKMdQn0MlJXD1juHQVXhsqpniVFq5aJMoohSS8XplTFE/tG5xoS5aLS5ILt2kfXueTQ+RPjFJPnoxDxRL0nLa2LtarckVG1FY6yKGqdwJ3isjfUtU/PNfjHKKVHmkRF+oF4aTuW37BHOC8Ed/cSoF71Arpjcu4o0PcyOCtflKjZWNzia1ZT1pjCqc2wHtkdRm5atVaTVHEb1ahn/2ZvU/kIIc4Kj8lEfOqmDYbTJt1kwmZbcJsgpbrSFORuyGJZIHwpoxSz1ImFMmIzA1IJCORlMwNyJOccea5qqhZyRvGqWeYeMZZwzD17WUps+tGqadINFw8TkAQa4MUI/OGCJXdIVLs3EJZBK10MKDa55MY4LByeORF0D5a1CvY/86rkEGQ+45kttEQpiXOe/ws+EMEq1AAndRIsdVi6zXIc0uU6XaCTELv+8br7f/yfejGA6DeROoAxs/bpyd9AaP+AJpkKErmCgTHtNkgdeb0JkduQB/6ZKvO6ooBmSsYJDNyZyJ6mRuQuhyvDQ0V0ldTdSA4FE/j///23j1Ksqyq8//sc++NiIzMrFd30Q/sRkD0JzqjyMulDuMgIsgIisOgjoL44CcDIqP+fjxVRmgHVBjEB9oqiEIjzAIWKA5CAw4/daE8lGfLs8F+VHdVdVXlKzIi7r1n//7Y59x7IzMrK+qZGVn3u1asiLhxH+dGZJ599t7f/d2hk584ZMO6TsSMQKJKIqF9Ky5IgueUmpHM7YMDh+GoKdPoP/1SffyDXnKRv6i9AdVpKqT3BlrjcLnhHArQJHN1nLXXtYpob3kIEoc70DVpjdA+lETq2HbUW0rTWl4jTY3BNC7grqNw3eyr63Zdn9R18bpFsVnSAbFeDrkfILhaME86dJN5Utch9yNKzUkko9QcSpuMEpfhSChkjKrHSYKTpApvCKboGletCWWVNFX1pvzqU5ybQ3r70X2rsLp6Kb+ePYUzs5V2PuwUhFH/k6q+5VzP0RqHywzuO191dvs/+nfx73kmLK1ZzUMIBTEYVs2EKl7loAj1EGmQy+hW3sZEkx+ow1v3+Wp7330cMnozOlxCC4uL7/6chFFYZXCK+bQDxSosXMmAJTLpmrcQIL39jDHhPScJQkpJQS9dJFlfhXKZLEnJygJ0QDa3D3VdRITM9VD1iAqCI3UdHElQc3UUflxp/pRaUOi4kv6uPlfFa0Fn4QBJ/wC6cjccu82aRAH60RchD24L5M6EGUlIR2HUZwGtcWhx8RBZTf5tT0NPrlpYKBHrFWGaDcGLEFvteoW1EeK9GYhxjvacNSFKGwbGexOni5jbBz5H0rkdutNzgHPocMnuRT3SP8Bcuo+5ZB8UKwCmsdQ/AOQsuH0gjpXyBI6ERB06tP0Yjs2gqIfRCnOLV0HnkDUISnsUiYWfGA1gvGb9IlxKd/EwpNZWVFUpNTdmFL56Pw4sqbFfJ5GMbPEg3bmD6PEvmvcG6CdfbOP9Ny++9N/jjGAqKuvuqZB+r4j8Itaauap1UNWNTdi2RGscWkwN98TXmRcxGFbV05IKZGp9pkuFxGLhpsGUW7/p6C0UZdXOtGIv3XZrHe/OHosc2Jl7OycooT90D4bW9pP1Zfr9A5SU0OuTjIa2Tz6k4wt0eByZv4I06TCX7oPBKaS3CP0fsOMHb4dijA5OWq6iDBTU3gJJdwEdrcJwdaIjn64eNx2njlWoJ84xt/+qIBGe431ZhZdQUB0AS8yliyxeeX8068HJYxXFOSar5RtOK8h82ULR3TT5nwk/EZ6f2dimwP2mObg1Di3OCpUX8c6fssmp04VOhgPrQherpqNSa5rYA9C1QV0H4T2ysH8H7+T8oPp+pMyhLPAHryFZnbOQ2No9iC8Y9ruUWrAvO2g9o5PvRk/8aXX/c+k+WF8OonyNTnjBSMg+0FNvMEMQktmMB3Vvjbk5GI3gxBJ67AQyN2dFhZ0MXErSXSSZ20fhE8tFiIWcKkYNnmG5SpJm9K+8P+y7xggBx+6s8lL66V9tDcQGWH309mGl3ZBzAFDVqaUytkJrHFqcE9zj/wj/7mc0WoIKkjljNi30Kypr7OMgSYJG+irY5wcO7+xNXAgMl9HsEMX8PlJfoKvH0HwdJ31r7NNgHkk2V3kRlIUZjW0gB360eq13/b4Zk8D2otM3uY7VAZQlenIJ1tdN/bbXRd1XkIXDpPuuRlJH6ruM/YDCjysjoaoMy1UKPyZJUnpXXEfSmUfv+YoZIfaKvMmFQ+nrRkynw1b6V5cSIvJIVX3/6fpFq+qFaRPaosXp4B7zGmslGvWU+oGyesVBdDSqw0dhtSzzfbRYsf17CfrZW3Df8Yqdvo2zgtebK2qpJgku65GOhpYvSTo24buUuRx6vSvBx/j0B2DxSed8Xbm6FtPUO3/H8hLiYKGPLPTRI8dgOEaH1nNDllfRawrQ0rwIl5Jk+8hlWLGiYle6UnOcmIeRLFwJg5OW/zideNNlDM9MFPb/e+D9TFZHR1y4HtItZh/60RdVNQfy8Jdd2JP352zyL8pqMpEHvxQhNJjxii6t2PVjnUSks84QSn0vYLTRCXT66PLdSD5EfW4JdufQ1WMI4HvzOEk2n/A8INc+Cz3yexMd9WSuVwczvLcK9NEIlo+i6SlIO6TdRdKFK3FJSu6HOM0RHE4SFrJD6JFb0EFIjkcPpcUE9DTKuBv32Umo6q+E54veQ7pFi9NCsszCRSHp7L7tN+rPvu6FFpZoVkQHT0LmZ4iRtAEigsTQQjFG+gft2aXoeIDIHHTmQVyI79tskVzAuVau+a8T7/WLL0dWG4n/Kw9Y6OnE8VoBt9+DYkT3ivsEIzdn7CeAwSk4cRy955Qp6i70ayJBiwqxlGc77CbHQkQeh4nwVTFMVZ2qPL6Vz2jR4gzwevOFOdHwLy7MeVrsGMrQ2nW7x24JO4nI7wNPBn4WKxt6EnCfaY+/5J6DiHwdxruNuB/wy5iC4E8Dx8L2F4Qm3C0uBC5SGCeGkE6LyFgaG+e+SkjvW7go47nQUH0/AI6kZql4D2Xopx36Q5Ok1re5t9/yDnP7IB+S5iH0c5ElF+T+z0W/8ps1VTg1+Q5dWau/85VVE0XszNMJLUx1dCI0bQq5inmjw8rXv+iijndW0RRMPB1095Rvfpuq/lsR+YSq/ncReQVT5htgB4yDqn4W+GYAEUmAO4C3A08D/qeq/ualHtOeR6AmykN/bWeuHxPTjbASdx23z6Zex1x6RMOwUccIcfaIDX7U22Ss3raph2JsD/UW3onFfsVfQ/o9F2W8cp9frMf+T78UaiEKe0QZkxPL6KlP1I2YIqKsyp7s0HfhoDAD9dEVogTvQESuBe4BZqYT3HcBX1TVr4jsGmu757BjRiEiJqLLspLSiIVEu/dX/wBg+QXAJs9IS9VQ2e1S8xqioRBXd4MbD0Jjoz7LfomMLnPT91k5b8TCQiEUtUXvofnsnHXmyzLodaocgzzg+ZdsnLOGGFbaDjudkG7gL0XkAPAbwMcwu/WH0x6808bhh4A3Nd4/S0SeAnwE+AVVPbnxABF5OvB0gOuvn33BtssCaQJFOdFTeqt/L/3sDegxq+yXw4ds46kVO+baq237vZ99cceqH6jCRILUy0Bx9ZhFwqwbj/F2TJDQqLwIAJeSqSmvEkNM/PVkmCl77EW9pe0K2Xavcd6dsIT0GeocLtFYzgRVjVK7bxWRvwR6qro07fE7ZhxEpAM8HojLlNcAL8H+5V4CvIK6/LuCqt4I3AjwkIc8ZPfY6BZbI1ZEUxoDpihDZfW5/enpnb+DzF9hb/b/8IUb50YUIacQqKl28Q2fi7NJPnoLiau1kcCMRDFmrvSACdxFiYsJDN5u18mHptOUdIKxMW+kkjA/jzqJFhcGXqeoczjPWUlEngS8GPh64GGq+pHGZ88HfhLrJvtsVf3rac6pqtZQ/Cywk57DY4GPqerdAPEZQET+EPjLnRrYXoN+9EV1DcIl1O3XW3/dXixa8lmu/3n0tlfZ5LlVgrYS5FP0trssVh7ec+Qocp97w+GLXFVdDOsQURponootsUM/BZK0zi3EYrToPTg3eWzZqJKOeYe0g6oivpxQbj0T9NQbJqqmAVh+M1qMTNwPYN+Tz+m2W0yHUqeokD5/f+xTwBOBP2huFJEHYtGWbwCuBW4Wka9VPYMS4DliJ43DD9MIKYnINap6JLz9AewLarEXkOd1Uvy65xirBtA77kaPPNdi3hFBTM4SqNYXQkfjykCwPoRrA7OGN1147yF7LJR/YRN9ga304/+6S42lpJiBiN6Fr4vRcOmk4WvuFxlOg1NQjKwWIrCayIfWHGj+CjMm4wGqlsjX1WO2H6D3/Emd54g1Fi0uGVTlohfBqeot0Mh31XgC8OfBC7hVRL4APAw4r45vp8OO1DmISB/4biZpVb8uIp8UkU8A/wH4bzsxtj2JqHF0qQnYRVm1CJ3A8VM1W6kBXQtJ3NgUudeFfg/phjXMcAyDdVhaRvZfE7ZdhNqB3vfV3kD0JBSblKMAHtg+LjXqavPR6deMpmIMZWHy2sUYyrGFjlaO1tuS1B7dBZP2ntsHWQ/pLiLzV5gBKAtki0prHVhaTvN1e9zzJxf++2hRIcpnbPcI/2VPcajP4gAAIABJREFUFJGPNB5PvwCXvzdwW+P97WHblhDDj4rIL4f314vIw6a92I54DmqawVds2PZjOzGWywYhrKT/9EsXPLQUw0dy3/93Yrs84Pnoh18wSZmMx4yCds9whI6XzRAMhjXVtSjtrzO1xkFSlCYTPhiaHMfRLyPXfeMFvQ+W31xpI9HpmxGIYZ/oEUSvoCyg+zh7PXpXVVdAPqxzEFDTWcsCLcYQmvDQ6Ye+Dat1XiMeH5lQ8disZ/nvYmQ5iLmg9DpaRX2OdObNSMiOrPUuK0xVIW2fv01VT8sEEJGbgau3+OiFqvqO0x221eW2GcrvYfbskcCvAivAW4GHbnNMhZ1mK7W4VIir8UsN52r6ZEDlIeDqZO9wFOiVErwHD8OyPodzMMwhCV3oTq2gB0KaavlG5F7ntzDTE39ax+0j0g7QMTVU72sV1e7jjNWkH6j3Ha3a57EgLspe5+u1QRmtwtjVk/h4gEZjEvMRLkWSbPLYrIe4zAxDktm4khT6B5CyqEJSpG2NwsVG6TkjlXWanIOqPuocLn87cF3j/VcBd26z/8NV9VtE5J/CNU8GItBUaI3D5YIYWroo5z79inXL1pNBBLAKN6WpeRB5iSQyeb40rdqL6uoYcm/eAyB8qWozqsdfi1y5idx2VtDRChJrGMqxsYbSjoV6ku+ud/Tvm1ylR4ZSFu6pLOo8RNPbcCkMViDLagNSjOskdvA4NH4vkQlVjNFQia3iYH3Jzh+L8CrW1NT/9y3OEZ4pKqQvXvT2ncBNIvJKLCH9AOAft9k/D4XGCiAihzkLpm1rHC4DyINegn78V7hYDOxmZe5U8Fp7CQ1xN0nE2o4uDyFzyOKc5RySBPbvww1H+EEBZW5hFueQ2/4V7mONrfToeXgQQ2u8o4FpJBA8mDDJZ4ExWFVHj2sD4Y25pGv32Ap/XFQJZMZrk7RX7y1BH1lOsR9Gr19XVUeGFth3FJPz0QPzagbWqxWv9bp1ngOqvINc8ePn9l20OC30EqTuROQHgN8GDgPvEpF/VtXvUdVPi8hbgM9gdIlnnoGp9GpMfeJeInID8J+AqXVRWuNwGUL/6ZeAS0dr9X/zHAsbNf+rvK+ze9GTSBPEqfWgzn1dONfv2QR5aD+OJTT35mUsr6LjHCkKuG8wEF/5zbM2VvqvrwzX71QsJfXeQjh+i6Y80VMIxW5aNOjjiasNCCDdRbS4p2YYdUPoKhqGsqiPifTXooTU1QYhhty81iG36FENg+fBwAxLTIq3uCgopqGynj9b6e3YpL7VZzcAN0x5njeKyEcxJQoBvj8yoaZBaxwuE8g3/XegNgyXApVR6HW3+NAmf829sZF6YWIc5/Y+fr4+RNIUxgVyxQGY78NKo4dyJ7Mcxhc+j9z7KrvH216FXPecsxtsY0I3AzFGUwsrSY5NvHHyjmJ7ZSO0FENH0QgMV6vktvQPost31wYlnifmMVxq29aXQxjLwWroq9Cft+e7jhqtVc1ASPQm4nnAji2NEbVlsV2L88ZU/Rx2Sd25iHwr8GlV/d3wflFEHq6q/zDN8a1xuNwQ23dycZhL/kPP3czPXh2wic4aIN3UKqfTBAZDdFSY15AI4M07iD0gDu6HKw8g++YtKd3JQlMaB8dPokeOIfc2iqse+b1NPQ9Oizy3XtjVyj2whNSMlJIbjbR0E3mA6h7m9hst1VvcX0cr1hI0Ul6zHjJ/he0TjdB4YJP4aGwGZN9V0D+Irt1jE3tnaMavF9Rr03ugAPHeAsjNfM3cnB2TdpBszs6hHr3r9yc6yLU4f0wTVtpF2kqvAb6l8X5ti22nRct9u9wQCsu2opdOA73lpegtWySZt8JgWF8rksADNbWS8o45h+HIktKjEvWK5oHtMyrQe5bhxBK6slr1Nmahb+Gm3hzMzcNXXYsszsPR49Ukr3f9/lTDlPs/t1ZUjcnk0ryHKucQcwbq0eGKMYnyYR0+mjuIdMIqP+QgKsVWMAPRmUeu+HHk0FMmtlOM0fEaOl5DFg4j3UUzCvOLkA+Rwz9l31VEEMxjMDQPam0AKydhcAo9dUcYd/j+7ng1eserp/u9WpwRJUZl3e6xe2wDolqbKlX1nIVD0HoOlxnk37z44l6gKCxnUBR1fBxCnLwxwaUJkNQxdUBLRTKHZHWi1vILHpwg4xxdWZusqHZS5ySioTlxHK6419mNW31doxAF9KIkRgEqDRmMUOmsBUikoHZCMVz3cbD+R+h4Dcrcqp6jemsD0j9otQnRgEQv4/BP2ef7NoyvP2c9olUrVVstS2Q4qg39QqgR6c/bec9CmqPFdCi9ObbbYbc0+wG+JCLPxrwFgP8KfGnag1vjcBmjmX+YJrykn/7VbWmruxH62Rss7DJ/yCb1GA5qJIAlTMiXZDy3vcrqEzbWVMTP73j1xVeebXHO8MxUm9CfwRhLL8KG9T6CovU0aI1Di7OD99tLQHe7aF57AxXDpnE84zqkpXlpS7HMGZUVzAB1skB3VaSbWP3D0GieGumf0VtYWbOTdTKk27Hjj91lq+0poHe82uL1jUlZb/31OregYQWedDYZRy1HppoawkR66g32wXgAWK5F15erYrbNX5iz8+bD+tyrb4WFH6z3WXqTeVrOWU8M5xDvIQkaVP1e0KNKoBMS3FEYsDSPRT//P+p+DWdLPd7qO/v4r9i5AtHhcsFZVEjvOFT1KCbUd05ojcNlDHnQSyrvQT/+K2f8R9/OKFT7PPTXTMD03c+oN8aJviiB0moZoPa/g2HAOYRAU/XewkyJVF3L/F3LNlavSJYg/RSZ79WsneVVtJPVLUiXrBeEZGvQWarrKiIN1BcTrB697VV2D9c9x8Y2XA+TcjASLjCWNjCbtCwmPYGqhiGF8XJd5DYeBOXZETq/f1JXyVt4SfafVirHDHNM9ldS6NRU4JjbyTLLcQRjF++rGt7HfyXkfaQ+T1Tt3SCBAqAffgE6GtX7rg6qfhv+gz+Pe8QrTz/mPYZimrDSpRnKGSEiPUze+xug7jSlqlNVi7bGocXFCRXFHg6dzFbPTYPgxCb9ROoVcfQunNU6RAE+zb0t1bzVP+iwhLxEswTJS5xXZC6r214WJfS6yFwPHecwGKAx8Z2mSPi86uw2XK0n6VhE9sWX1xNuzG/EMcaCtkhndSlIAdE45EMYNYT5YuFamtaFayl1PiPmBcrCpLyXjyDXPmviq9QTtxnjK07OnUZ+pRngnu/XobIGU0uuew7+7/8fM5RJMlF4uBH60RfZ+Z0z9tj6EJnb7PHosRPVefzfPKd67b7tN0577r2AqcJKu8RzAP4M+BfgezBtpf8CtHUOLabDhPdwIYvjet26d7QPtQwTE2RSi+yFmoaKweRD2KlUdFjAEOgkJFf20UGOXxmb0QjJasnKhjcQjEwnMxZPrLNwLhgYHwxEZ5Kx1aMugoNa/C9KVEQUJbg4bgDzJqIoHvkwsIXUDEAnqxlWUId/hqthYo+y342w09IGKfL43cRqaALDqgE9/lrbHiRE9LZXwcDCbfJ1LzTjMhyhh/YjQe9K84bmlXPmlaSbpwRdWZ2syo5SLLHKvVHH4t//bNwjjR1Vvvmp6FoUGkyMbDCX4R7/R5uuMSuYJqy0WzwH4GtU9Uki8gRVfb2I3ARM1RwIWuPQgtoYNENMcO7xZP2H59mLNAEXVvWhVSiRXVMUYdLTipUEHkIOQsN/oea+psEemkc6GS4R/IlhHU6KE26T/dTtwOoAHRU2GTpnk/o4R9Mc8txYT/FYH+i16qzXQpwMl/MN1yCcK4Rv8tz+i2KYqbcP1tfqquaiaIRugvGrdJmKqpdzlOqQhS2aGS0ehKV7tvQWKlJB+I51/VWwugoLCxOncI/+XYrX/yiuKM1AzPUmPbZxbvUk8X30wqJnFz2prTS6xrkZn/50ldn+Pc+sxjRrKPXMYaVd5DlE639KRL4RuAv46mkPbo1Diwq1BpPhvIrk4mQSksSqCuNhZRh0ZKtQ6TpY6CNpYpNO3L8MhmR1gK7n+FOjoEHUReY9Ev5DJXNBWyib8FT05BK6NrL/5qy0CSx6FrEGwHvEZ2GyW7fxRgMQjVf0csZ1w6IKaV7vv3LUxnPoPjVbZRjj9DQovWF1rr4OvcWxlUUtxXHsj0yKWxuFcPkQxrVUh37yxaf//rfqtFd6yhNDXKmwfz54VI0q6/j9wYb7LavvvpL0aOYq4nGrFk4r3/xUoyAPraBRS4VBgevbdCPB0/B/+wu473jF6e9hF2LGPIcbReQgxlZ6J7AATC2R0BqHFhPYKLMRJ6CzqY+Qh78MvflnAzMpR4vCmEYxLAF1zuHAoiU34yq230OuuA/k67B8FAZDZDhG7rgrTFAd6HVwzqFrQ0tIL/Tts1g1naYwWLf8BMDAhPooiiBiR7Uy1rA6liKsytO0kTyPx4Q4fZwcvcKpldq7gGpVr8dvrWs8IBgjAYJhGvt65d1cqQOMRsAJCy+lGxRWkxTWRlUORD/8Auh16pxAlEYfn7KxD4bVSt7/7S/Y99hL0ZUxOiiANWSc1wWJcTzxd6i8GV8bjkbupkKzoDKGDSPCLCqZCxXvYdvqAO51aKq/pd0GrzuqyjoVROTnVPW3gFtU9STwQeB+Z3ue1ji02BpeLTEZcLb5CPeo38bf/LNBcM+j6+bhVgVuYbKVxQU4dKVNhnfdjt56u3WK2zdvY1jow8FDSK+DfvZWi43P9YyxBNDrIEliIZFmzsErlCE8BTDIjRW1sQ1p1HDyCqHArLrn+D6GVpoCePFY3GavInoccRyVwqqrDU+z451zVCEx56q2quruMWMQFF7l/s+1FqvLqza+tXXbbzS2+4IQogvRhPX1id+k+i5Kj45K8KP6+4heQMWCqs+HV2OORZG/6OVFwxGPi/cUSoUlaxAdOgniBOkltSc2g4hakdthF0SVngb8FqbsOpVUxlbYEeMgIl/GuhKVQKGqDxGRQ8CbsZjYl4H/HKxei51AFW6Y/FOfiHFzBnprmEB1VFSrSC1LJCZ/+z1YCLpAvkCPnaD8/FFk/iTu+sPIfN8m5APeKp57d9Z1Dk0WUHzudaucg+YlJIEaOyysVCERo8D2PDIXjvEhwey9eRux81zXjE6VmKZsTIImCGg02UAJHfvJCXLiWepzNI1IDEltFcpJU9u/04XhqvXeDrIlurI2GQIqynpCitubif4YIivVVvDJFuy0aOgqT6GRKykKJEsq5hlF45jofUSF2E5mRnuQo4lU1xQXPMWFfjXOWcw5FMH52w67oEL6ljDH3iu0XY4QQFX1305zkp30HP6DqjYbCT8PeJ+qvkxEnhfeP3frQ1tcbGz0EKpcxIa4u/9Q/RNJtzNxrHvkq/Hvfoa1+PR1WEFzj3gNnPl19OQtcGLJ6hi84hY6psDayYwyuT5EDpdwYNHCOVWBna9DUZGBMzJdIXEOWbT4uD85xC8NbaLqZzZJucJWzWHFXOdArKhMQx8FaYZZNmKch6ZDBGNa0lxRR1kb6w2htcGNq/TmeaOkecxxVEn88abLRkM2ua1RbLjBOGip5imU3iZpqJ4nzgn1xB89hGYyeuO+cRaMXouTet9E6u8lGglAl9ZInvQnm+9pRqC66V9gy312Eqr6wyJyNcZMevy5nmc3hZWeAHxneP164G9ojcOuQZWL+OiL6lXxaeD/5jmNBKcZAem6Kuyj67mtOE8to+Mcf3xgTXwi5XWhD/uCuJD3sLyGDobI/kXLX6RB4turxdbnx3ZMr4t0MmMqQVV85/qngJP4E+v1uHOPH4XJ28kEO8o1eiZoUH4VaXSo26gZFSZE1Q0TdIBunE0ibXSj+GBTeyqE4yYQmF7S7aLDcb1PwzDoxmxprBWJVenBa1AfCgyjZzMhAd4IiRWNxkPRu9jIWApenHvi6yj/14+He5SJ56Ze1ixjqgrpSzOUM+EY8ElV/cq5nmCnjIMC7xERBf5AVW8ErlLVIwCqekREtlROE5GnE/RBrr/++ks13hYB8uCXWjIUbDJPEgsVidiqfatVZq9TJzK9R/wKOsgt9JB7SBzJVX0LXaQJsn8R2XeVMXXcHXaOTmYMpjgRxvBJUaLHTpicRKRSNhOnvS7S6+L6PeSOY/gTQ2PRZPVErA05D0pQJ4gbW+2D9xamiiv5ZjI2JJjVbaFwuzHZ3PRAnKs9kzSpQy2ywTtZWp6YhOVBL6kZSnnPwmDrG2L3cYUeZ7GYCI6hpDKMKUnqMFk0DFsloWGS0QTgGoyukI+ISJ70JxRv+DHzTKIkSqmNwruGAZxBFFNQWXdBWAlVLUXkShHpqOoW7ueZsVPG4dtV9c5gAN4rIv8y7YHBkNwI8JCHPGQX/AyXH+Shv1a99h96rsXmCQFN78NfVUz6hrBEg0VEmiD7EvypdUgEd+WCSV5EJda1AXzpM3Dv65D5PjocIVddYZPqqWWLbUekiVFj1waWyA2re+l2Qz4js7BTJ7Nt/jbKu9dQVyK9pPYa4r1lia2qYzw9GDS7WV8XpG2kfsJk6KlpJJuzhZPJkE2awPLqlmywjbIXULPGBIyFdOSearbS5rK2aQQiEoGmSn/uobvB2DW9hvj9xvuKHkNkeoVckvQ3VFyPSzRxVUJaMqtxcd//x5vuZ9YwQ54DwFeAvxORd2K9HABQ1an0TnbEOKjqneH5qIi8HXgYcLeIXBO8hmuAozsxthZnB/etL6/yDpacdZWktpaNFfU4hJKieF7uq9UlXiuOPN6jJ9bQu08i60Pk8CHE77dJ/uC1yOoAveNu2zdW5sZzN+L6Ckj0WOIkvm8eueogcmpknkvmqr4R0g2TaFhp67CExCNdrbn9RTm5wq5W1g2+f7iHTeGTJjPJaT3hblGRHLFdNzv95IuR/Yv2Xd51arNhqDyFyalKelapHGXQbfyN/IMTo+TE5HNze3wuTP8qUoV1aUT61DfU15jP7DOvlYe2FwwDzJxxuDM8HLB4tgdfcuMgIvOAU9WV8PrRmO7HO4GnAi8Lz++41GNrcX6QB790okGigNFZYaJuoNJLgonkZPnmp1avNffIiSWY65lXsTqAfYW9PnYi5ATChD4c2YQWJ9qJ3IDWrBpnBXNusUOZeyRzVa4DJ7jFTnVtHZfQSawnQxQGhMmV9AR9teFVRDQTwzYwwE8em55nmCVNzaDFWEfZeE5cnQyOjCFn1FyJ193qO4tU1a0QPYfQxzt+Z8Vrf4T0J24CIHny6ylvesqZZ9EZxKyElQBU9bwkc3fCc7gKeHvgk6fATar6bhH5MPAWEflJ4F+BJ+3A2FqcA9y3vnz7HapYe4izd7f+70me/PqJ9+Wbnwp3H0f6odAtSZErrzf11ZW14BUUk2GPjQVacRIOYnsiAr0E6SVVUlbzEKeP4ZlhCAlV9QyJeThgM0NMskaDEYUCCRLkTeRFHft3IQmcUo9r/qwXdJOI6qrNmg4abKRoGDI3mXCu6ivC+2Zdb5P51FBstTqNETos8Suh4dGwrA1SA8mP/On53dcuxSxJdovIB9jCkVHVR05z/CU3Dqr6JeCbtth+D/Bdl3o8LS4O/Ad/fqeH0KLFBYeq4L1svw/bf34J0Wzc0QN+kJqsfEbsJipriz0I96jfxr//2XV4JQjYTVMAlTz59cF7uAe57/XIgXtT+DHJ1dfA6CtIllkCvLmyjQJ/RVmL8DkXGuKEpHgnA4aWdwDIkuA1BEpq7mtvJ3NIEvIESWPlXarVbjixBjxNtdIGKhppDPE4gUyRNLXczB13TiT4p8VEYnrwbCRbqxRrT1voFuG9MY6aIS9Po0paJhyJ6t6GI9O5WhlX96nDov5eAvI/sP4yOqoVbqOXlT3jzWd9r7sJ6sGXZzAOu4Stq6of3bDp70Tk/0x7fGscWlwUNBvARAnnc0Hy5Nfj3/Y0SzBf900oasqlye2hcjdDY8hormeU1/WhTWRpgozDBJUmsLBYM5iISWchzoQ6alx47KHjwIeEeTepJCCq5G/OxMQ48VmADoOeVKZIKaFoLvzb7Zs/5++lCVlcgMUF3EN/jQQo3vBjtUECG4+rjZd6rYv7tkJT7qPKm1iuoUpC56EjXQi3ZT/1pgtyL7sdZekoim0ML+Zd7AYE1YkIBzwYuHra41vj0GLXwz3xdWYgbv0w2dVfV0lv6Mklo6f2upZL6JsAnVVkb5CpiPH1Xtjf1YnaTXHzxIVO8qV5FR2PlIp4tQBuzEhmDiml2l9hk3GodInwVtuQ2AQt3qOf/wruP954wb+v9Ef/jOK1PxLupTFRNcYWu+1NaCrFfZrbo6RGNAxlZHfZ1FF5Xw3EbVUOJ88ndZZmGH6asNJ55hxE5DeA78OafXwReJqqngqfPR/r7lYCz1bV7fozfBSqIv4CuDUcOxVa49BiJuCe+Dr8X/2MhYsOXmVVy/P9SUXQuNLtZFYpPRxZwjpSWpeXQ5hJoJPY6terTZSuMcnnZWMS9UjuzJPINzCLypCozieTuVV70wbMQFCzhy5kpXCY2P1f/Qy6FhoLdSbHWgkVRuQ+hMW2SJI3Gy+F9351XDXu8auWjK70kjYibPMnxkgvNYOyR4zDVGGl809Ivxd4vqoWIvJy4PnAc0XkgVhP6G8ArgVuFpGvVdUtqjBBVe97PoPYG79Yi8sDwxF65BjcERQBrrwCDu236uw8NymNWIsQpKi1DPmH1QF693HTamoogvqVMToskSyxfgOJQ4clOgqP3BRM/aio9lU/mX/Q0JFOA70TzBho3uyXHfoalI2QzQVqzyoPfql1a9u4vVm/UIY2q43HVtBREe6/qIvd8tLCVA2FWdfPqlyN5p7hr35ffakTQ8q7rW6l6tqXnMaQzBhiWGm7h57BszgTVPU9qhoTxx8Cviq8fgLw56o6UtVbgS9gNWITEJGHBm2l+P4pIvIOEXn1hlDTtmiNQ4uZgXvi68wTWOhDN7T+7HQtnFQU6GhUr3rHub0Pqqq61BDsK0pTag1d5nRUUJ4cUhxZw59YD5W/odBrVOAHOToo8IOi9irC6r85+VfwISQVPYRmhXWQEq8K9y7Ud/Odr6oLAb1uLbA3LutHAxP9vRuGT0d1Uybr320G0vUzKxr03gxJ8CgGv/Bo1p79KDvVIDcPY7eQ/i8QtKEucrpHuOMnishHGo+nn+MlfwL43+H1vYHbGp/dHrZtxB8Q+s+KyCOw2rE/BZYI6hLToA0rtZgt9Lpw4CrwBfzrly3B7FyQxqi1iyjGVo2dhvxDJfFtBV4adJ1iZbQOC9TTWPUp4hTJYr2AN92l3GHh27SSDamwscZhC2iplbcB4N/9DNxjXnPeXwtgFeDhPnVpUHkLjMuQhJbquTIaeQj5NHSUKj2k2K51XIZ+3uZFaD8zY7mSV/UO0qu/i/L4EPVi31/XPAa3UWJjRuGnYisJwNtU9ZdPt4+I3MzWyeEXquo7wj4vxP7Y3hgP2+pyW2xLVPVEeP1k4EZVfSvwVhH5520H30BrHFrMFooSjt5unkBRIJF9FOUs0igoJ/XqPLbhrLqlmWFwix0rhhuWeCfWEAitDIR6gTyGgcLzIIdeWlFTpUlx3Q7NEFKYaN1VVgDnb/5Z5AH3AUDu84tbHT0VIivMv/sZYfxaG4jSkukxt6KNEJFsCDPF15VhGZX4QW7J+5EZVkLYzC6o+KURfgTeC86BOMV1a7ZUcecqcy951znf227BdHUO05xHH7Xd5yLyVOA/At+lWmUxbgeua+z2VZg8xkYkIpKG0NR3EYRKA6ae81vj0GKm4B7xypCYDuElr5Z83ZiYjt3mhiOb0NPEvI7hiPLIKox9QxjO4RY7aNAc0lERJjpwmAHwheA9JN7jKIyp5ATtBA5/qdWqHKgTz7E62nsToIPKc/F3r+AWM5MEOQ/4Dz236mAnD38ZUDOFzOOZnPgFXzV6g8nJLCaZY31G7AVdtVwN9xST+LLYqb0HpyRug7isn9J4zgjKQsjz7aPxZzIeZ4KIPAZrV/DvVXXQ+OidwE0i8kosIf0A4B+3OMWbgP8jIsex5uj/Xzjv12ChpanQGocWs4comRGSzHLdNWYoBsNaDdWJ9X9IE9semDe6OsYvhdxDnNSDCGBUF/WjBE4MoQieAXXaQL0EBpNJdQv15NoM20wYi0iZbbCYtFQYFnhAyhW49XY7yfEXofecnKCYylzPGh0B8nUvrL4G/6HnWsvQhnHRf3ge7jGvwcdah8Z91t34tN4OMCxqw+WkMgg09yt9lVjWvKy8C5c1wlCAZBay0hCSkgSS/d2z/ol3K6ahsl4A5b3fAbqYYjXAh1T1Z1T10yLyFuAzWLjpmVsxlVT1BhF5H3AN8J6G5+GAn512EK1xaDF7CEVvujJGTq3AFQfgwAEzAoOhfd7JYCG1eoI0Qebm0PX1SZZOXNUPPYqrJncdWNVv0qvzERuJRTGhLX1F8hCqgdqbiOqwTQNBuE6T6TQsQu3AKeSKfWe8df/uZ9SU3QNh/+VV1Hvk4P5qP7fQwS+NJrWeTlPFHSd/AB8S6RqECUkk1DSYkq30UisIzC0Z7ye8EkFKNSXWBr23OLJG/9fffcZ7mwVMFVY6zyI4Vf2abT67AbhhinN8aIttnzubcbTGocXsIU3AZdbwvtljYVNTGoGFviVpF/pIv4dbHeBPjSiPm7fuuoG+mk+203QLHZJDPTT3FEdWKUeT//DiPeBxpbfWo2EyVRxSak1bTaT2LGxwaCAJxtoHzT26NEJGJ5F7lm3fRKp70tWBKdFuVHBdXp0QF9STFjHQ9zzTztFP0RMbGvI0azCisYjjjQWBPngJ3plhiMYkdpGLoabcV/fWlIyQblLXjgSjM/6d/0znWW+Z9hfetSgLoThjWOkSDeYiozUOLWYO7pGvroX9AlWV4bp5D/1RHVryWtU7WD+HfchVI9zdK5Z3ADwhfBIZRFHddGTKo1bjwAYmk/Uzs2R0XVmsXnGZTMT4aUzKmghIMLKPAAAdIklEQVTkIJnWIS0fjECOrbbHiRmrRCZpqDApHb5VjURka3Uc9DpID2RlXMuSB6ivj6+4WaXCKKrSGtXXezXj2XFIliDdDVXkua9yMRNK5UujiTxDet8DW/2MM4lpPIetSUWzh9Y4tJhNFEWtFbSyahXRh7p1AVzagXHILfgchrmFm/o9pJ9a2CV2MsucTXbDAh1YArccleTLdUjGJQqJ4kuxyTUB13VV6CX2S9C8rOU3wF43uquJExQPvo7NVyp3LuQlQqJck7pWoaKiRgE/6uSxZK6iyOIE1sfmyfSSrZv+bKzezsvJfZLJ7nhufxdKte8rb3hliSBewQtlKYgoSeZwh+bqvE6UIdkj8P7iy2fsFrTGocVsIjKSfGn1DMMRnDpVq64WoZVoqEzS0RhZXrV+EotzuMMjZFjaxBVCOOqEMhTGiVccgaGUqlVPl57RsrFxXKqQpVvKQjTj/EJzxW6Tt5BU1NKJ4xKpW6027lOxMJMGYyiBZ6+JeRyab4hjxOrsE0O7/7KuqyBcoxIb9PV1wFwA8d48BqhbqTaMQtU9zwlFAWXuzIuKRixzJAd7lEsjcMnm8c0wynKasFLrObRosWNw3/mqis9vMfIcoWcr2sE6jAuL0Yfe1ZIkZkT6DvYt4BYHeMYWqgkTvAdcXtrzQli9j0qkm+D6GX5UkK7biliymsJaVRT7OoRkSqxu03YT7msqptYehjGfvIWYIpLJlXplLJqaTk1PoAqRlVXHveZkDrEQb0MFdVlOnqfjKsaVJba9JerDtbXhiTQpv8nBHjos6P3yX5zpJ5xJTJeQvkSDuchojUOL2UXs+jYOukqLCyaNcXLZxPecVEJ8ALo+rKPBTiZXxJ0Eyb1N0okgvdQ+z1wQj7PCNXHBi6BesVdd1mJoKV4jGoNoLAJi9fEEKiaR25xrICavnU3ibPAuYLI3Q9NTaPSV1hKE0AGvlMlkeYNRVSGcR0tfGQjppVX/afWKqqBe8CiJKKM7h+z//fee7hebeZh8xpmorK3n0KJFixaXFbyXS6HKuitwyY2DiFyHiUBdjS1TblTV3xKRFwM/DRwLu75AVf/qUo+vxYxinKNrg8BeKiZZSuM8qLMGFlNRGk8/cPXxikTVUairn71WXoMPXc2i1wBYSChxtRw3W9Q/5X4iBNPsQR1RFcZhOQotqYvSmmGrUIQ24fGMo+Kpnyh0s/1rTaWKhhqE/yyjEs7fcVXoqxpZw+Pwg4JyXa3yeViYVxW8jmJsCXpxkB3Y+2tNLU3Wa9t9WuNwziiAX1DVj4nIIvBREYl+6P9U1d/cgTG1mDH4v3x6SDwHSe4UGOfIfB/tz9lOUb47Jqf7c2YkwPIBobGNDmwCjxOnZIlNwhu6vFU5hCpkQ8gZuCoRW/dr0Em102BIqvdQGxffYCixgZ20QWV1YyI7fq6DsjYacdxxnN2kvlalh1RWRkqgzjE0qLeAHTPIyUeJhdQSJaVAsg4QmcThPL0NdRh7EKKKO4PSrLTG4dygqkeAI+H1iojcwtaysy1abI+m5HVsTuMacfncPo+6Q5WmshNjLMVirlGJz/NKenpCHwmqibKivCblZHJ5woMILKBGnmFiQi43zBwVvRUblxebzKlX+UBVwV1tj4iyFl4rNlN13aZx2uL68XP1iiMNRXCNZXEwDGAeAgidvtWBbGQgqQrLXyi56g3/m70M8VgV+HbYI67DjvqBIvLVwIOAfwC+HXiWiDwF+AjmXZzc4pinE1QGr7/++ks21ha7EN5E8qpqYq/o+nrFTtKRMYs0qrFCXUm90EecQ1YHlCeGVQ1B1d0sFqHFpG30KpyYPISLVNAwgTc8iKZERbOGIBbSVQXczhRRccE7yJLqWkLQJqrCSxZuarKcKiMRvZQYsoqeSHxubJ+ohwgQgkeRh/vZEAobrzt8aSwdN1aSoK8ERukVB7JXlstnQFJ60mJ7au6ZPItZwY41+xGRBeCtwHNUdRl4DXB/4Jsxz+IVWx2nqjeq6kNU9SGHDx++ZONtscsQVFilm1oTIAhtQUuk26krp4vStjcf49yYTvsWrCiuZ6tm6SX1o5vadqgF67bqoFZ5GQ1qaozr51Zd7Ue28i5yR5FbQrMMr4vc4YsojBcmnZAPqc63BSZos000C86iAF7jsaW+kq+72VW5mNDoJz9VUIwdZSH4QihGjrIUNLf8hi/s/vORIx85jj/te878280y1Az6do8LILy3K7AjnoOIZJhheKOqvg1AVe9ufP6HwF/uxNhazAi8rdQrjPPQL7pbNfSpJLujnHdRWv4hTUIx3Dx6YB8ufj6u1Uall9r7qCEUO8dFNMNGUQY75g/wlOtqk2hDzbVsqLyqF5LUqJEiinjQkam9kjnIElvRY0nq6EFMCOltNAxlrYTaDGvZ99XIe8QaiETMWwkeRtWIaFjgC6t6LsZCPnKIg85cSZlL5QEVuXlB8X1v0UJSJ3/60XTm7MbnX33zuf2+uxTOK+4MYaW94kTtBFtJgD8GblHVVza2XxPyEQA/AHzqUo+txYwhxGfKm55C8iN/in/b0wI7yQrgJMvQcW5/5S6bzFGMc/My9i+CCC5dshqJID2h3kT4os5QjOVraBVaMYBCv4S6w5tSFLaSjt3QklRt5V0KjroquSxiaMehqohoCDV5XPBEJprzQJ1UbuQTmoZgsm+03yzlEaAeBEXLIhiGmEvQauz5yFGMhSRVkkzpzZdhm0Ocb4TJ7N6Wj3ZYOJSTpHtkdtwC4qdJSO+N+98Jz+HbgR8DPtloWfcC4IdF5Jsxp+zLwP+9A2NrMSNwT3wd5ZufuoG66ZHVAdrJkLRvGyOltSjqTnFpGkIuOVIUcGAR6WToySWkKOu4e1ylJzV11CqPFUURF/obxElyDKqO8cBVXPi0awwfceYdNDnyPq8b45h4neCdkmaEsFTNOpJmtXUMc43q1p6bwk/NCaxpIAKaDXms90K41Mg1jJahGDs6c4UZusxTFklIUJuRcS7eI6ydSunOezoLF64/9m6CK5XkDDmH1nM4R6jq37K1bGFb09DirJA8+fUT7zX3sDZCFnKYi9XLGaTJ5oriTmafFaWFovYtwGhsldajog65dLz1awhd4iLiBKoqJIlp7uRDRxkmdO9txe0LIceRdpQCKEaT8gsOpfSCS0AdJGkgW60rzhfgE1vZb2QHjcrKeG1iMfkNnk0zHxJex1zBRHLc2QSfdpR8GI2RTNxv9ApGa0kVOqo/s/NlXc9o2Y6fP/3PN5NwU1FZ94Z12LGEdIsWFxrpj/5ZqGso65wDWAjJN4rPQkjJvIikSlRLt2NexHzoXOZM8TTWPWyESUdgieWxVIyeOPk3exz4kND1vk7sFiNHPrQwTT4yb6Os9rNEtrXoLNBBXieWQ88JoNI/iiGh6hETzxu9htLjR96M2chR5q5qTqPelFU1eDiWRI+eUZ10Vm9ie6O1xLSGirpqOEp3l4Vw6I//+sL8sLsIEnIO2z1az6FFi90K7y2M1O8BoEsrsDqoWTpFYQYi5iBis6CFOeTQfuh2kfU70dA+U5NYp1AnkyMiNbXMLRwTq4XVQ+kFceYtAKRdT4pnOEqrsIxUPZelEccH752pwXrrWw0E7ScJxsoUadWDFoTktxmXJFVSrziKet9IfS21Ch35QqrwUhx3Mbbto7Wkqn6mg7GqSqnuzSVmRKLXEO+nv7+gzIWrb9qb9Q5ThZX2CJW1NQ4t9gyqHMRwZK1BAXpdpNuxxPRwhK6PrS4iKLlSllUlteybh04f9o2Qwwdw+QnKE0MgVC3HimKnlaop1EykOMH6xut8uLUOTx3Xl0aoxpGkkGSeVG31n6TWilMcJIniUJRY5GfNgspSGA9coz2lNzaU96RlEcZISDInlIVU4S9K8wiSVCtPZ7yeVCwluw/PaM2RdZW04xEH3fmS0VrCeN1V9+NcHY7aq5gmrLRX0BqHFnsOup4jfs3aax7Yhxw+hOxbQJdWkFPLGzyG4Ek4Z97FOLd8xOFDMBhaJ7UYytkwKWgouG4mmePKvyyF1Fki2heCqlCMHS5V0tBRbbgaQkm5VIVk2lFEhAJqqquTavJ2E4tWqZhFcQzeC+odSaaAqwyLeQF2LdunPkuZO8px8IpUKAsrfFMvuFQpxlYQmHXLepwxqjWu2UrFyJH19vbEKZ4zU1n3iPFojUOLvYNSa/2jQR5kIZZhvg+H9iEsWn3S8mot8w02wy/0bfIfDK3vw8KcVVFny5VERVXUFiZD8xYmaxmiYYhx++Y6usgFV9aJYF8KeWiY5hLBOSFJS4pcyByERT+iIZSTUtFjXehKF+P9Mc/hnOK9kLo6WRz3MQqqToTFmoatyIXxemI5kdxYU+qNBexCfYZ5CPV34L0wXLXQ2uKhkmIs3O9de7OXA4ArPUlRbrvPXklIt8ahxZ6BDguEFOln1qTm+ADGJa530kJMThAJchhFWclrUKq1GQ2qrVqWyDAkqxNX95bOlbJ0VcK4uWJ3TtGQOyCmKHx4T5SXkCqOHyfzNLOJeDTyJE4Q58jw5ECSCr4I8hROyfB4ak+iDv3YCh9CO1NCqKsRJlIfvIJRnWeIcFXeg4ZhsHNmXY9Lrf5CfQiZuWauRcgLJUuFtVOONNsbvQxOh+nqHC7RYC4y9naAsMVlhfQnbsIPctNbCm0uy+Pr+KPL6MkldDQO0t1lxUQiqq16j64NzDCIoOtDcA53sFf1VFZvk/tGjyEmleMk7hoTbVlM0kWN3eRCpbF5AXFCzUMOochdkKwwLyQaoMhoAjtnPop007reAOpkcT4yRpEvpcpHxFBVZE9ZWIjASpqkt2ZdT3e+pDdfkmR+woD40pLW+QjGQ2U00j1vGKCukN6erbQ3rEPrObRo0aLFlBDVM+cU9oZtaD2HFnsL2U+9CX9qhA5y8x5KxR8boEeX4NSy5RusHNkSz/M9ZHHOqqZjf4eytH2HI1jo4/pZCClJxUQCUyR1iVUNu0QttBRqBZKUKhldhvDPaOAqob24So/eQ7frcAmMR1rnEcLqPskCldVRMY2GK2lVyBaVUV2iVXgpH7kQIpIqdwHB4xg6xuuuYhrlw1hvUdcqiFPSjrGlXKIVoyoeNxrY/uvrnqJQilxZOlmydHL7ePysw5VKWvhtH+48PQcReYmIfEJE/llE3iMi1zY+e76IfEFEPisiF1XlsPUcWuw5aO4p714z8br5FL+SU37uBMn+NdzhPm6hA72g3DoY2usI54zyurJuK8RONlEA51INonnBKDgLyeRDS86asJ6YvHZAWdRhHV8I45GFnlwi+FKrZ19CkXtKL/TnLTcQr9dkF8X38bPOXNmoV6hVX6MonhkRm7CKsav6PotTitxNJNSLfDJ3AZariAynGK5SL6wPPL60cJi7TJaZl0h47zdU9ZcAROTZwC8DPyMiDwR+CPgG4FrgZhH5WlW9KBb5MvlJW1xO6DzrLdVryawLmg5LyhNDE9HrdYyd5Bx+aYQ/voresxy8i1AwB+jKOgxHuIUOyf4OWV/pzvnA9Vejp+bGAoq5gJh3KItalA7qfgfeQ+ktRj8aefLCnr0HF1o3FLkJ9cXaiSK3WgZVe+Sj2tiknQ2yGt4MQDEO+YSi9lCi4SjGdU8JS2rDaN28lqxrSfIkNSFA7+uqbfNCbP+1VU+RK0URajRGinPGuPrYwx9/EX7V3QH1/oyS3erPb64OLQwi5qkDVU8A/lxVR6p6K/AF4GHndbFt0BqHFnsSnf/2ViBIVyeO5FAP189MijsNj3FOeXxAefca5Z2rlCeG+BNr+OWRCe8NSxjnuMUObn/XekeEMAvAeOBYX0kZr4ewTJDEKHNXJ69D/4YotQGQhGK65hxShji2eQ/BYAT6aZzkLRleM4XixF+dI/SHiJXLG0X04sq/yK2wLoa28kJZH/gqIR5lxcuylvmovAudvGaea3W+9XVPp7enk9IfvO2OfzTv4TSPcjzkxKmvAHyHiHyk8Xj62VxIRG4QkduA/4J5DmAdM29r7HY7F7GLZmscWuxdeFMzdfu7QXlUYRxm5NUBxReOUx5bx6+M8StjdJBT3r1mOYogVaHDEhLBHeohvZoSWowtfwA2SecjRz4URgOLx0cdorjSHq9DPgpegVdcYp5C4qQyFkWueK+mOj7UyrhE6ewqjxCMhRWsSXWtYuyqPgx2XB0SsvPXxsIlZgR8qYyHdl2X2BiiXPd4YPdUjO1aMXSVF3GcdrwPhi1xMFj1DFa3l5eYYfzNYHiKpZU7T7vD5778Pr7m+n+Hqv5ObEoWHjc29xORm0XkU1s8ngCgqi9U1euANwLPiodtccmLlv5ucw4t9iw097gFh8xnNvEfX0ev6oP3+CNL5F84RTEW0rnCVExXrXLa7e8ivdyUWLHQlOtnuMUO5fFhNVGXYyHreQp1FUU1ylRALULny5oemucb/5eVxIntU8biOFNwXVstmZtzuKQulotJZPMqlLRTr/Tj5D0ehNqHxJRaPcF7CXl456hyHDGhbLkTrQxVpOtaTsQS3VWC3MG41BAKE1JiuMzuZ69CVfV7vv35fOJz7+DfPfgZmz7PixFfvO3vOLV827zN6due61FTXvYm4F3Ar2CewnWNz74KOL2lOk+0nkOLvYtSKe8eUHxlmfL4eq2wGsJJo7WE9eWUwYmEwQlheI/iB7EQLrTBXDLmE4mQHOwhmSV7wRLCZVHH75t5BYnSGb42DGWDAhlX3tGTqLaVMbykjEcWqilyDbkJe7++7hmtW2I4hrQ0qL02e0n4Uqu8hSWSqSZ0lzS8lTDRRzS3qa/zG5EJVTa9hlLJMmGu7+h2pW6nvUfxnr9/mTud99DwGgbncw0ReUDj7eOBfwmv3wn8kIh0ReS+wAOAfzyfa22H1ji02NtIxJLQRI8gwd8zwJ8akY8c6ytmIIYhdzDR6KbRWIeQu3D9jM5cyfyBnIVDOVnXkyRaJ57dpGx1EZg8zkGWClmjUMwm4Tr3sLHlRJ4HAzHwdcgp7D8a+YpZZGEusfGH0JHtX4eJNsKXZmw2XtOkMSa3NbWUXGrV0PMLSfV56evzRXzgax932p9klqGq+k1f+wQ+8bl3TGyPXsNHPnXThWhh8bIQYvoE8Gjg58K1Pw28BfgM8G7gmReLqQRtWKnFXkZYHUsvRXopybULSObIv3CKtdsL1lcySyQ7a2LjUmMg6bCAxQySuo+DXxnbOZ3QWVDcQgfJHOnx9aCR5KqKZWMr1YYhVg77EHYxVlLUKAreReNfPM2M9ROZQHGfCOfqimqQav/KU2l4AuaVSBVmqjyTYDicq8cSzxuNW6xxiNTXNPOkmccXCWuNvIIvlSK3caZp7ZV88P8yA/GIf3nXOf+EuxHv+fuXuauu/Hq/tHIn+xetBCF6DR/+5BvPy2sAUNUf3OazG4Abzvca02DXGQcReQzwW0AC/JGqvmyHh9RiVhFCQ5qXuFAQVx5bpzw+YHCqGySnLczS31+EIjYYHc3p5J7k8BwAxe0rlr8IiW3Jkk1d4Wq6p9ZGIBiGmBNIwgTskmA4kiDOl4CP+YlwTLfrKL3lAJp5Cu9NpiJxUk3i0YMwQzAZ80+chb2S1GTGI5XWl1RGKs3q/fOieS2h1oYS0o6QdBTWbRyjkVbXjiiwHhTO1aysvYaNuYezyTXMEnZVWElEEuB3gccCD8T6Sj9wZ0fVYqbRceigoDw5pLh9heJfl8kHNkkO1ywhm6TK4pU5nTlPPnQMllLK5QLGoTK5m5Ac7EEZejmXHvISHeTkI8dwJTHKZ5gobSVfM4ImCtR8vXoHqlAR2GTdXPFnqU2uWSbVY6NhgA2J70CFjSGrMuQ1YoFbHkNZXqtrxvqEeI6I0mv1iFLdTcTrRuaVqyNNVokdrrcX0cw9XKhcw27DbvMcHgZ8QVW/BCAif44VfnxmR0fVYuYwvOEJ1nt5WIaObg4dFqzdWbK+lDEeOJyDxX0JB64e0Zu3WTEfWU4h2ZdaSKlUJEuQnoWY/Oo6q0dtVkw7WlUZp13POHR868xplQSGutFO9Criyj0mpM3LEKOTOkIFtZAHJlNZUUVr2uvGvEDcp7mS96Wt4guUKEDbNETVfpu0gmSLzwJ1dmz3MQ75ijpkplses1cRvYePfeZ/sTo4ysk95jXA7jMOWxV5PLy5QygmeTrA9ddff+lG1mLmoLmvcgXukIWIYvXq3GLJ3CLMHyzozpdIPwOvLDhjJkmSVFLdJA5yby02l0vSjqM7X+IWO5A50ts98wcLevOuUkI1Zs9kUZklgGvDECd4o4s2VuKBVtpJ6lxAU9l1I7wP4aOyVkaNRiI+N493gTobvYbmxO7cZsPQ7Tqc85X2UvR+Jr0X2WSw9jre8/cvc1df+fX+/hco17DbsNuMwxmLPEIxyY0AInJMRNaA45dgbBcTVzLb9zDr44f2Hi4eZGoP4mKP/z4X8mSqatn+PYrdZhzOqshDVQ+LyEdU9SEXfWQXEbN+D7M+fmjvYTdg1se/17CrEtLAh4EHiMh9RaSDKRC+c4fH1KJFixaXHXaV56CqhYg8C/hrjMr62lD40aJFixYtLiF2lXEAUNW/Av7qLA658cy77HrM+j3M+vihvYfdgFkf/56C6B7pd9qiRYsWLS4cdlvOoUWLFi1a7AK0xqFFixYtWmzCzBoHEXlMaLL9BRF53k6PZ1qIyJdF5JOhefhHwrZDIvJeEfl8eD640+NsQkReKyJHReRTjW2nHfOlbII+DU4z/heLyB3hd/hnEfnexme7avwAInKdiHxARG4RkU+LyM+F7TPxO2wz/pn6HS4rqOrMPTAm0xeB+wEd4OPAA3d6XFOO/cvAlRu2/TrwvPD6ecDLd3qcG8b3COBbgE+dacyYJtbHgS5w3/A7Jbtw/C8GfnGLfXfd+MO4rgG+JbxeBD4XxjoTv8M245+p3+Fyesyq51BpMKnqGIgaTLOKJwCvD69fD3z/Do5lE1T1g8CJDZtPN+ZL2gR9Gpxm/KfDrhs/gKoeUdWPhdcrwC2Y3MxM/A7bjP902FXjvxwxq8bhkjbavsBQ4D0i8tFG0/GrVPUI2D8RcK8dG930ON2YZ+m3eZaIfCKEnWI4ZtePX0S+GngQ8A/M4O+wYfwwo7/DXsesGodL2mj7AuPbVfVbMFnyZ4rII3Z6QBcYs/LbvAa4P/DNwBHgFWH7rh6/iCwAbwWeo6rL2+26xbYdv48txj+Tv8PlgFk1Dpe00faFhKreGZ6PAm/HXOW7ReQagPB8dOdGODVON+aZ+G1U9W5VLVXVA39IHbLYteMXkQybWN+oqm8Lm2fmd9hq/LP4O1wumFXjMJMaTCIyLyKL8TXWH/ZT2NifGnZ7KvCOrc+wq3C6MV/SJujnijihBvwA9jvALh2/iAjwx8AtqvrKxkcz8Tucbvyz9jtcVtjpjPi5PoDvxRgPXwReuNPjmXLM98MYGB8HPh3HDVwBvA/4fHg+tNNj3TDuN2Euf46t6H5yuzEDLwy/y2eBx+7S8f8Z8EngE9hEdM1uHX8Y03dgYZVPAP8cHt87K7/DNuOfqd/hcnq08hktWrRo0WITZjWs1KJFixYtLiJa49CiRYsWLTahNQ4tWrRo0WITWuPQokWLFi02oTUOLVq0aNFiE1rj0KJFixYtNqE1Di1atGjRYhNa49Biz0BEHhoE3HqhGv3TIvKNOz2uFi1mEW0RXIs9BRF5KdAD5oDbVfV/7PCQWrSYSbTGocWeQtDa+jAwBL5NVcsdHlKLFjOJNqzUYq/hELCAdRvr7fBYWrSYWbSeQ4s9BRF5J9YZ8L6YiNuzdnhILVrMJNKdHkCLFhcKIvIUoFDVm0QkAf5eRB6pqu/f6bG1aDFraD2HFi1atGixCW3OoUWLFi1abEJrHFq0aNGixSa0xqFFixYtWmxCaxxatGjRosUmtMahRYsWLVpsQmscWrRo0aLFJrTGoUWLFi1abML/DzbtTY9LjkSQAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } ], "source": [ - "# You can use isel instead of iloc. You always need to specify the dimension\n", - "ds.isel(time=10)['Tair'].plot.pcolormesh(\n", - " vmin=-30, vmax=30, cmap='Spectral_r',\n", - " add_colorbar=True, extend='both')\n", - "\n", - "ds.isel(time=10)" + "# You can also resample by date\n", + "res = ds.resample(time='A').mean().isel(x=200, y=200)['Tair']\n", + "# The result is a dask array\n", + "res" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2020-10-13T11:22:30.241311Z", - "start_time": "2020-10-13T11:22:30.199187Z" + "end_time": "2020-10-13T11:22:30.348149Z", + "start_time": "2020-10-13T11:22:30.246775Z" } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/py37_pytorch/lib/python3.7/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide\n", + " x = np.divide(x1, x2, out)\n" + ] + }, { "data": { "text/html": [ @@ -3779,130 +11605,136 @@ " fill: currentColor;\n", "}\n", "
<xarray.DataArray 'Tair' (time: 4)>\n",
-       "dask.array<getitem, shape=(4,), dtype=float64, chunksize=(1,), chunktype=numpy.ndarray>\n",
+       "array([ 6.75662201,  8.97479849, 10.49235584,  9.59892096])\n",
        "Coordinates:\n",
        "  * time     (time) object 1980-12-31 00:00:00 ... 1983-12-31 00:00:00\n",
-       "    xc       float64 dask.array<chunksize=(), meta=np.ndarray>\n",
-       "    yc       float64 dask.array<chunksize=(), meta=np.ndarray>
  • " ], "text/plain": [ "\n", - "dask.array\n", + "array([ 6.75662201, 8.97479849, 10.49235584, 9.59892096])\n", "Coordinates:\n", " * time (time) object 1980-12-31 00:00:00 ... 1983-12-31 00:00:00\n", - " xc float64 dask.array\n", - " yc float64 dask.array" + " xc float64 42.47\n", + " yc float64 44.82" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# You can also resample by date\n", - "res = ds.resample(time='A').mean().isel(x=200, y=200)['Tair']\n", - "# The result is a dask array\n", - "res" + "# But you can use .compute\n", + "res.compute()" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 111, "metadata": { "ExecuteTime": { - "end_time": "2020-10-13T11:22:30.348149Z", - "start_time": "2020-10-13T11:22:30.246775Z" + "end_time": "2020-10-15T23:30:03.058359Z", + "start_time": "2020-10-15T23:30:03.052799Z" } }, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "/anaconda/envs/py37_pytorch/lib/python3.7/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide\n", - " x = np.divide(x1, x2, out)\n" + "\n" ] }, + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " '_obj',\n", + " '_tslib_field_accessor',\n", + " '_tslib_round_accessor',\n", + " 'ceil',\n", + " 'day',\n", + " 'dayofweek',\n", + " 'dayofyear',\n", + " 'days_in_month',\n", + " 'daysinmonth',\n", + " 'floor',\n", + " 'hour',\n", + " 'is_leap_year',\n", + " 'is_month_end',\n", + " 'is_month_start',\n", + " 'is_quarter_end',\n", + " 'is_quarter_start',\n", + " 'is_year_end',\n", + " 'is_year_start',\n", + " 'microsecond',\n", + " 'minute',\n", + " 'month',\n", + " 'nanosecond',\n", + " 'quarter',\n", + " 'round',\n", + " 'season',\n", + " 'second',\n", + " 'strftime',\n", + " 'time',\n", + " 'week',\n", + " 'weekday',\n", + " 'weekday_name',\n", + " 'weekofyear',\n", + " 'year']" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can see all the datetime methods\n", + "print(ds.time.dt)\n", + "dir(ds.time.dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-15T23:30:49.426672Z", + "start_time": "2020-10-15T23:30:49.417263Z" + } + }, + "outputs": [ { "data": { "text/html": [ @@ -4256,87 +12088,770 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'Tair' (time: 4)>\n",
    -       "array([ 6.75662201,  8.97479849, 10.49235584,  9.59892096])\n",
    +       "
    <xarray.DataArray 'season' (time: 36)>\n",
    +       "array(['SON', 'SON', 'SON', 'DJF', 'DJF', 'DJF', 'MAM', 'MAM', 'MAM',\n",
    +       "       'JJA', 'JJA', 'JJA', 'SON', 'SON', 'SON', 'DJF', 'DJF', 'DJF',\n",
    +       "       'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA', 'SON', 'SON', 'SON',\n",
    +       "       'DJF', 'DJF', 'DJF', 'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA'],\n",
    +       "      dtype='<U3')\n",
            "Coordinates:\n",
    -       "  * time     (time) object 1980-12-31 00:00:00 ... 1983-12-31 00:00:00\n",
    -       "    xc       float64 42.47\n",
    -       "    yc       float64 44.82
    " + " * time (time) object 1980-09-16 12:00:00 ... 1983-08-17 00:00:00
    " ], "text/plain": [ - "\n", - "array([ 6.75662201, 8.97479849, 10.49235584, 9.59892096])\n", - "Coordinates:\n", - " * time (time) object 1980-12-31 00:00:00 ... 1983-12-31 00:00:00\n", - " xc float64 42.47\n", - " yc float64 44.82" + "\n", + "array(['SON', 'SON', 'SON', 'DJF', 'DJF', 'DJF', 'MAM', 'MAM', 'MAM',\n", + " 'JJA', 'JJA', 'JJA', 'SON', 'SON', 'SON', 'DJF', 'DJF', 'DJF',\n", + " 'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA', 'SON', 'SON', 'SON',\n", + " 'DJF', 'DJF', 'DJF', 'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA'],\n", + " dtype='\n", + "

    Exercise

    \n", + "\n", + " 1. Look at the output of `ds.time.dt.season`\n", + " 2. Try grouping by season and getting the mean\n", + " 3. Plot each season (use the plotting code from above)\n", + " \n", + "\n", + "
    \n", + " → Hints\n", + "\n", + " * You do a for loop over groups `for season, ds_season in ds.groupby(ds.time.dt.season):`\n", + " * You need to remove the time dimension, with `.mean('time')`\n", + " * Use `mean['Tair'].plot.pcolormesh()` to plot\n", + "\n", + "
    \n", + "\n", + "
    \n", + "
    \n", + "
    \n", + " \n", + " → Solution\n", + " \n", + "\n", + " ```python\n", + " for season, ds_season in ds.groupby(ds.time.dt.season): \n", + " mean = ds_season.mean('time')\n", + " mean['Tair'].plot.pcolormesh(\n", + " vmin=-30, vmax=30)\n", + " plt.title(season)\n", + " plt.show()\n", + " ```\n", + "\n", + "
    \n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction to Numba" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What is Numba?\n", + "\n", + "Numba is a **just-in-time**, **type-specializing**, **function compiler** for accelerating **numerically-focused** Python. That's a long list, so let's break down those terms:\n", + "\n", + " * **function compiler**: Numba compiles Python functions, not entire applications, and not parts of functions. Numba does not replace your Python interpreter, but is just another Python module that can turn a function into a (usually) faster function. \n", + " * **type-specializing**: Numba speeds up your function by generating a specialized implementation for the specific data types you are using. Python functions are designed to operate on generic data types, which makes them very flexible, but also very slow. In practice, you only will call a function with a small number of argument types, so Numba will generate a fast implementation for each set of types.\n", + " * **just-in-time**: Numba translates functions when they are first called. This ensures the compiler knows what argument types you will be using. This also allows Numba to be used interactively in a Jupyter notebook just as easily as a traditional application\n", + " * **numerically-focused**: Currently, Numba is focused on numerical data types, like `int`, `float`, and `complex`. There is very limited string processing support, and many string use cases are not going to work well on the GPU. To get best results with Numba, you will likely be using NumPy arrays.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### First Steps\n", + "\n", + "Let's write our first Numba function and compile it for the **CPU**. The Numba compiler is typically enabled by applying a *decorator* to a Python function. Decorators are functions that transform Python functions. Here we will use the CPU compilation decorator:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:46:54.654222Z", + "start_time": "2020-10-14T03:46:54.652118Z" + } + }, + "source": [ + "\n", + "The length of the hypotenuse of a triangle is\n", + " \n", + "$r = \\sqrt{x^2 + y^2}.$\n", + "\n", + "However, the squares of very large or small values of x and y may exceed the range of machine precision when calculated on a computer, leading to an inaccurate result caused by arithmetic underflow and/or arithmetic overflow.\n", + "\n", + "$ hypot = |x| \\sqrt{1 + \\left(\\tfrac{y}{x}\\right)^2}$\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-15T23:28:05.117434Z", + "start_time": "2020-10-15T23:28:05.113335Z" + } + }, + "outputs": [], + "source": [ + "from numba import jit\n", + "import math\n", + "\n", + "\n", + "@jit\n", + "def hypot(x, y):\n", + " # Implementation from https://en.wikipedia.org/wiki/Hypot\n", + " x = abs(x)\n", + " y = abs(y)\n", + " t = min(x, y)\n", + " x = max(x, y)\n", + " t = t / x\n", + " return x * math.sqrt(1 + t * t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code is equivalent to writing:\n", + "``` python\n", + "def hypot(x, y):\n", + " x = abs(x);\n", + " y = abs(y);\n", + " t = min(x, y);\n", + " x = max(x, y);\n", + " t = t / x;\n", + " return x * math.sqrt(1+t*t)\n", + " \n", + "hypot = jit(hypot)\n", + "```\n", + "This means that the Numba compiler is just a function you can call whenever you want!\n", + "\n", + "Let's try out our hypotenuse calculation:" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:47:40.979991Z", + "start_time": "2020-10-14T03:47:40.975581Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 6 µs, sys: 1 µs, total: 7 µs\n", + "Wall time: 10.3 µs\n" + ] + }, + { + "data": { + "text/plain": [ + "5.0" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "hypot(3.0, 4.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first time we call `hypot`, the compiler is triggered and compiles a machine code implementation for float inputs. Numba also saves the original Python implementation of the function in the `.py_func` attribute, so we can call the original Python code to make sure we get the same answer:" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:47:42.474371Z", + "start_time": "2020-10-14T03:47:42.469826Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 11 µs, sys: 2 µs, total: 13 µs\n", + "Wall time: 16.2 µs\n" + ] + }, + { + "data": { + "text/plain": [ + "5.0" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "hypot.py_func(3.0, 4.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmarking\n", + "\n", + "An important part of using Numba is measuring the performance of your new code. Let's see if we actually sped anything up. The easiest way to do this in the Jupyter notebook is to use the `%timeit` magic function. Let's first measure the speed of the original Python:" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:48:10.886616Z", + "start_time": "2020-10-14T03:48:05.339532Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "684 ns ± 7.08 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" + ] + } + ], + "source": [ + "%timeit hypot.py_func(3.0, 4.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `%timeit` magic runs the statement many times to get an accurate estimate of the run time." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:48:12.520692Z", + "start_time": "2020-10-14T03:48:10.888168Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "201 ns ± 0.613 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" + ] + } + ], + "source": [ + "%timeit hypot(3.0, 4.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Numba did a pretty good job with this function. It's 3x faster than the pure Python version.\n", + "\n", + "Of course, the `hypot` function is already present in the Python module:" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:49:28.961742Z", + "start_time": "2020-10-14T03:49:17.857136Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "137 ns ± 0.635 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)\n" + ] + } + ], + "source": [ + "%timeit math.hypot(3.0, 4.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Python's built-in is even faster than Numba! This is because Numba does introduce some overhead to each function call that is larger than the function call overhead of Python itself. Extremely fast functions (like the above one) will be hurt by this.\n", + "\n", + "(However, if you call one Numba function from another one, there is very little function overhead, sometimes even zero if the compiler inlines the function into the other one.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### How does Numba work?\n", + "\n", + "The first time we called our Numba-wrapped `hypot` function, the following process was initiated:\n", + "\n", + "![Numba Flowchart](img/numba_flowchart.png \"The compilation process\")\n", + "\n", + "We can see the result of type inference by using the `.inspect_types()` method, which prints an annotated version of the source code:" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:50:36.336290Z", + "start_time": "2020-10-14T03:50:36.332574Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hypot (float64, float64)\n", + "--------------------------------------------------------------------------------\n", + "# File: \n", + "# --- LINE 5 --- \n", + "\n", + "@jit\n", + "\n", + "# --- LINE 6 --- \n", + "\n", + "def hypot(x, y):\n", + "\n", + " # --- LINE 7 --- \n", + "\n", + " # Implementation from https://en.wikipedia.org/wiki/Hypot\n", + "\n", + " # --- LINE 8 --- \n", + " # label 0\n", + " # x = arg(0, name=x) :: float64\n", + " # y = arg(1, name=y) :: float64\n", + " # $2load_global.0 = global(abs: ) :: Function()\n", + " # $6call_function.2 = call $2load_global.0(x, func=$2load_global.0, args=[Var(x, :8)], kws=(), vararg=None) :: (float64,) -> float64\n", + " # del x\n", + " # del $2load_global.0\n", + " # x.1 = $6call_function.2 :: float64\n", + " # del $6call_function.2\n", + "\n", + " x = abs(x)\n", + "\n", + " # --- LINE 9 --- \n", + " # $10load_global.3 = global(abs: ) :: Function()\n", + " # $14call_function.5 = call $10load_global.3(y, func=$10load_global.3, args=[Var(y, :8)], kws=(), vararg=None) :: (float64,) -> float64\n", + " # del y\n", + " # del $10load_global.3\n", + " # y.1 = $14call_function.5 :: float64\n", + " # del $14call_function.5\n", + "\n", + " y = abs(y)\n", + "\n", + " # --- LINE 10 --- \n", + " # $18load_global.6 = global(min: ) :: Function()\n", + " # $24call_function.9 = call $18load_global.6(x.1, y.1, func=$18load_global.6, args=[Var(x.1, :8), Var(y.1, :9)], kws=(), vararg=None) :: (float64, float64) -> float64\n", + " # del $18load_global.6\n", + " # t = $24call_function.9 :: float64\n", + " # del $24call_function.9\n", + "\n", + " t = min(x, y)\n", + "\n", + " # --- LINE 11 --- \n", + " # $28load_global.10 = global(max: ) :: Function()\n", + " # $34call_function.13 = call $28load_global.10(x.1, y.1, func=$28load_global.10, args=[Var(x.1, :8), Var(y.1, :9)], kws=(), vararg=None) :: (float64, float64) -> float64\n", + " # del y.1\n", + " # del x.1\n", + " # del $28load_global.10\n", + " # x.2 = $34call_function.13 :: float64\n", + " # del $34call_function.13\n", + "\n", + " x = max(x, y)\n", + "\n", + " # --- LINE 12 --- \n", + " # $42binary_true_divide.16 = t / x.2 :: float64\n", + " # del t\n", + " # t.1 = $42binary_true_divide.16 :: float64\n", + " # del $42binary_true_divide.16\n", + "\n", + " t = t / x\n", + "\n", + " # --- LINE 13 --- \n", + " # $48load_global.18 = global(math: ) :: Module()\n", + " # $50load_method.19 = getattr(value=$48load_global.18, attr=sqrt) :: Function()\n", + " # del $48load_global.18\n", + " # $const52.20 = const(int, 1) :: Literal[int](1)\n", + " # $58binary_multiply.23 = t.1 * t.1 :: float64\n", + " # del t.1\n", + " # $60binary_add.24 = $const52.20 + $58binary_multiply.23 :: float64\n", + " # del $const52.20\n", + " # del $58binary_multiply.23\n", + " # $62call_method.25 = call $50load_method.19($60binary_add.24, func=$50load_method.19, args=[Var($60binary_add.24, :13)], kws=(), vararg=None) :: (float64,) -> float64\n", + " # del $60binary_add.24\n", + " # del $50load_method.19\n", + " # $64binary_multiply.26 = x.2 * $62call_method.25 :: float64\n", + " # del x.2\n", + " # del $62call_method.25\n", + " # $66return_value.27 = cast(value=$64binary_multiply.26) :: float64\n", + " # del $64binary_multiply.26\n", + " # return $66return_value.27\n", + "\n", + " return x * math.sqrt(1 + t * t)\n", + "\n", + "\n", + "================================================================================\n" + ] + } + ], + "source": [ + "hypot.inspect_types()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that Numba's type names tend to mirror the NumPy type names, so a Python `float` is a `float64` (also called \"double precision\" in other languages). Taking a look at the data types can sometimes be important in GPU code because the performance of `float32` and `float64` computations will be very different on CUDA devices. An accidental upcast can dramatically slow down a function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### When Things Go Wrong\n", + "\n", + "Numba cannot compile all Python code. Some functions don't have a Numba-translation, and some kinds of Python types can't be efficiently compiled at all (yet). For example, Numba does not support `FrozenSet` (as of this tutorial):" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:51:04.544166Z", + "start_time": "2020-10-14T03:51:04.459625Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":1: NumbaWarning: \n", + "Compilation is falling back to object mode WITH looplifting enabled because Function \"cannot_compile\" failed type inference due to: non-precise type pyobject\n", + "During: typing of argument at (3)\n", + "\n", + "File \"\", line 3:\n", + "def cannot_compile(x):\n", + " return \"a\" in x\n", + " ^\n", + "\n", + " @jit\n", + "/anaconda/envs/py37_pytorch/lib/python3.7/site-packages/numba/core/object_mode_passes.py:178: NumbaWarning: Function \"cannot_compile\" was compiled in object mode without forceobj=True.\n", + "\n", + "File \"\", line 2:\n", + "@jit\n", + "def cannot_compile(x):\n", + "^\n", + "\n", + " state.func_ir.loc))\n", + "/anaconda/envs/py37_pytorch/lib/python3.7/site-packages/numba/core/object_mode_passes.py:188: NumbaDeprecationWarning: \n", + "Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour.\n", + "\n", + "For more information visit https://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit\n", + "\n", + "File \"\", line 2:\n", + "@jit\n", + "def cannot_compile(x):\n", + "^\n", + "\n", + " state.func_ir.loc))\n" + ] + }, + { + "data": { + "text/plain": [ + "True" ] }, - "execution_count": 4, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# But you can use .compute\n", - "res.compute()" + "@jit\n", + "def cannot_compile(x):\n", + " return \"a\" in x\n", + "\n", + "\n", + "cannot_compile(frozenset((\"a\", \"b\", \"c\")))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wait, what happened?? By default, Numba will fall back to a mode, called \"object mode,\" which does not do type-specialization. Object mode exists to enable other Numba functionality, but in many cases, you want Numba to tell you if type inference fails. You can force \"nopython mode\" (the other compilation mode) by passing arguments to the decorator:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 101, "metadata": { "ExecuteTime": { - "end_time": "2020-10-13T11:31:32.414803Z", - "start_time": "2020-10-13T11:31:31.326331Z" - } + "end_time": "2020-10-14T03:55:40.035890Z", + "start_time": "2020-10-14T03:55:40.026166Z" + }, + "scrolled": true }, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:Failed in nopython mode pipeline (step: nopython frontend)\n", + "non-precise type pyobject\n", + "During: typing of argument at (3)\n", + "\n", + "File \"\", line 3:\n", + "def cannot_compile(x):\n", + " return \"a\" in x\n", + " ^\n", + "\n", + "This error may have been caused by the following argument(s):\n", + "- argument 0: cannot determine Numba type of \n", + "Traceback (most recent call last):\n", + " File \"\", line 6, in \n", + " cannot_compile(frozenset((\"a\", \"b\", \"c\")))\n", + " File \"/anaconda/envs/py37_pytorch/lib/python3.7/site-packages/numba/core/dispatcher.py\", line 415, in _compile_for_args\n", + " error_rewrite(e, 'typing')\n", + " File \"/anaconda/envs/py37_pytorch/lib/python3.7/site-packages/numba/core/dispatcher.py\", line 358, in error_rewrite\n", + " reraise(type(e), e, None)\n", + " File \"/anaconda/envs/py37_pytorch/lib/python3.7/site-packages/numba/core/utils.py\", line 80, in reraise\n", + " raise value.with_traceback(tb)\n", + "numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)\n", + "non-precise type pyobject\n", + "During: typing of argument at (3)\n", + "\n", + "File \"\", line 3:\n", + "def cannot_compile(x):\n", + " return \"a\" in x\n", + " ^\n", + "\n", + "This error may have been caused by the following argument(s):\n", + "- argument 0: cannot determine Numba type of \n", + "\n" + ] + } + ], + "source": [ + "@jit(nopython=True)\n", + "def cannot_compile(x):\n", + " return \"a\" in x\n", + "\n", + "try:\n", + " cannot_compile(frozenset((\"a\", \"b\", \"c\")))\n", + "except Exception as e:\n", + " logging.exception(e)" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "
    \n", - "

    Exercise

    \n", - "\n", - " 1. Look at the output of `ds.time.dt.season`\n", - " 2. Try grouping by season and getting the mean\n", - " 3. Plot each season (use the plotting code from above)\n", - " \n", - "\n", - "
    \n", - " → Hints\n", - "\n", - " * You do a for loop over groups `for season, ds_season in ds.groupby(ds.time.dt.season):`\n", - " * You need to remove the time dimension, with `.mean('time')`\n", - " * Use `mean['Tair'].plot.pcolormesh()` to plot\n", + "Now we get an exception when Numba tries to compile the function, with an error that says:\n", + "```\n", + "- argument 0: cannot determine Numba type of \n", + "```\n", + "which is the underlying problem. Numba doesn't know about frozenset. There are classes that we use regularly in our code but they might not be defined in Numba. An example of a common class that you cannot use in Numba is pandas data frames.
    Now the question is: what does Numba support? Some of the types/classes that are supported by Numba are listed below:\n", + "* Numbers (integers, floats, etc)\n", + "* Numpy arrays\n", + "* Strings\n", + "* Lists and tuples (note that a list/tuple of numbers or strings is supported but a list of lists is not)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So, if we want the last example to be compiled successfully by Numba jit, we need to use a tuple or a list." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-14T03:56:02.269146Z", + "start_time": "2020-10-14T03:56:01.765963Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@jit(nopython=True)\n", + "def can_compile(x):\n", + " return \"a\" in x\n", "\n", - "
    \n", "\n", - "
    \n", - "
    \n", - "
    \n", - " \n", - " → Solution\n", - " \n", + "can_compile((\"a\", \"b\", \"c\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercise\n", + "Gregory–Leibniz infinite series converges to $\\pi$:\n", + "$$\\pi = \\frac{4}{1} - \\frac{4}{3} + \\frac{4}{5} - \\frac{4}{7} + \\frac{4}{9} - \\frac{4}{11} + \\frac{4}{13} - \\cdots$$\n", "\n", - " ```python\n", - " for season, ds_season in ds.groupby(ds.time.dt.season): \n", - " mean = ds_season.mean('time')\n", - " mean['Tair'].plot.pcolormesh(\n", - " vmin=-30, vmax=30)\n", - " plt.title(season)\n", - " plt.show()\n", - " ```\n", + "Write a Numba function which calculates the sum of first $n$ terms in this series. Then test its speed agains normal Python function for $ n = 1000000$." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "ExecuteTime": { + "end_time": "2020-10-04T07:14:16.556883Z", + "start_time": "2020-10-04T07:14:16.553515Z" + } + }, + "outputs": [], + "source": [ + "# Code Here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
    Solution\n", "\n", - "
    \n", + "```Python\n", + " @jit\n", + " def gl_pi(n):\n", + " pi = 0\n", + " for i in range(n):\n", + " if i%2 ==0:\n", + " pi += 4/(2*i+1)\n", + " else:\n", + " pi -= 4/(2*i+1)\n", + " return pi \n", + "```\n", "\n", - "
    " + "Numba function speed test:\n", + "```Python\n", + " %timeit gl_pi(1000000) \n", + "```\n", + " \n", + "Normal Python function speed test:\n", + "```Python\n", + " %timeit gl_pi.py_func(1000000) \n", + "```\n", + " \n", + "" ] }, { diff --git a/notebooks/c05_Big_Data/Working_with_Big_Data.py b/notebooks/c05_Big_Data/Working_with_Big_Data.py index ea26a63..748c8ed 100644 --- a/notebooks/c05_Big_Data/Working_with_Big_Data.py +++ b/notebooks/c05_Big_Data/Working_with_Big_Data.py @@ -130,7 +130,7 @@ def memory_usage(): result - +df2 #
    #

    Exercise

    @@ -176,7 +176,33 @@ def memory_usage(): # # # -#
    +# +# + +# + +# With pandas +# pixels = df1.loc[:, ['pixel' in c for c in df1.columns]] +pixels = df1.loc[:, 'pixel1':'pixel783'] +pixels +df1['sum']=pixels.sum(axis=1) +df1['sum'] +# task = df1[['label','sum']].groupby('label').mean() +df1[['label','sum']].groupby('label').mean() + +gg = df1[['label','sum']].groupby('label') +list(gg)[0] +# df1.loc[:, 'pixel1':'pixel783'].csum +# print(result) + +# # With dask +pixels = df2.loc[:, ['pixel' in c for c in df2.columns]] +pixels +# df2['sum']=pixels.sum(axis=1) +# task = df2[['label','sum']].groupby('label').mean() +# with ProgressBar(): +# result=task.compute() +# print(result) +# - # ## When to use Dask DataFrame? # @@ -271,7 +297,7 @@ def memory_usage(): # d = array.linalg.norm(y,axis=1) # with ProgressBar(): # result = d.compute() -# hist(result,bins=100); +# plt.hist(result,bins=100); # ``` # # @@ -347,6 +373,83 @@ def task2(x, y): y = task2(x1,x2) y.compute() +# # Xarray +# +# Xarray is pandas for N-dimensional data. It also has a [dask backend](http://xarray.pydata.org/en/stable/dask.html) + +# + +# %matplotlib inline +import numpy as np +import pandas as pd +import xarray as xr +import matplotlib.pyplot as plt + +ds = xr.tutorial.open_dataset('rasm').load().chunk(dict(time=10)) +ds + +# + +# You can use isel instead of iloc. You always need to specify the dimension +ds.isel(time=10)['Tair'].plot.pcolormesh( + vmin=-30, vmax=30, cmap='Spectral_r', + add_colorbar=True, extend='both') + +ds.isel(time=10) +plt.title('Seasonal Surface Air Temperature') +# - + +# You can also resample by date +res = ds.resample(time='A').mean().isel(x=200, y=200)['Tair'] +# The result is a dask array +res + +# But you can use .compute +res.compute() + +# You can see all the datetime methods +print(ds.time.dt) +dir(ds.time.dt) + +# These are seasons specified by the months inside +# JJA = Jun, Jul, Aug. +ds.time.dt.season + +#
    +#

    Exercise

    +# +# 1. Look at the output of `ds.time.dt.season` +# 2. Try grouping by season and getting the mean +# 3. Plot each season (use the plotting code from above) +# +# +#
    +# → Hints +# +# * You do a for loop over groups `for season, ds_season in ds.groupby(ds.time.dt.season):` +# * You need to remove the time dimension, with `.mean('time')` +# * Use `mean['Tair'].plot.pcolormesh()` to plot +# +#
    +# +#
    +#
    +#
    +# +# → Solution +# +# +# ```python +# for season, ds_season in ds.groupby(ds.time.dt.season): +# mean = ds_season.mean('time') +# mean['Tair'].plot.pcolormesh( +# vmin=-30, vmax=30) +# plt.title(season) +# plt.show() +# ``` +# +#
    +# +#
    + # # Introduction to Numba # ## What is Numba? @@ -363,6 +466,17 @@ def task2(x, y): # # Let's write our first Numba function and compile it for the **CPU**. The Numba compiler is typically enabled by applying a *decorator* to a Python function. Decorators are functions that transform Python functions. Here we will use the CPU compilation decorator: +# +# The length of the hypotenuse of a triangle is +# +# $r = \sqrt{x^2 + y^2}.$ +# +# However, the squares of very large or small values of x and y may exceed the range of machine precision when calculated on a computer, leading to an inaccurate result caused by arithmetic underflow and/or arithmetic overflow. +# +# $ hypot = |x| \sqrt{1 + \left(\tfrac{y}{x}\right)^2}$ +# +# + # + from numba import jit import math @@ -397,10 +511,12 @@ def hypot(x, y): # # Let's try out our hypotenuse calculation: +# %%time hypot(3.0, 4.0) # The first time we call `hypot`, the compiler is triggered and compiles a machine code implementation for float inputs. Numba also saves the original Python implementation of the function in the `.py_func` attribute, so we can call the original Python code to make sure we get the same answer: +# %%time hypot.py_func(3.0, 4.0) # ### Benchmarking @@ -523,76 +639,6 @@ def can_compile(x): # # -# # Xarray -# -# Xarray is pandas for N-dimensional data. It also has a [dask backend](http://xarray.pydata.org/en/stable/dask.html) - -# + -# %matplotlib inline -import numpy as np -import pandas as pd -import xarray as xr -import matplotlib.pyplot as plt - -ds = xr.tutorial.open_dataset('rasm').load().chunk(dict(time=10)) -ds - -# + -# You can use isel instead of iloc. You always need to specify the dimension -ds.isel(time=10)['Tair'].plot.pcolormesh( - vmin=-30, vmax=30, cmap='Spectral_r', - add_colorbar=True, extend='both') - -ds.isel(time=10) -# - - -# You can also resample by date -res = ds.resample(time='A').mean().isel(x=200, y=200)['Tair'] -# The result is a dask array -res - -# But you can use .compute -res.compute() - - - -#
    -#

    Exercise

    -# -# 1. Look at the output of `ds.time.dt.season` -# 2. Try grouping by season and getting the mean -# 3. Plot each season (use the plotting code from above) -# -# -#
    -# → Hints -# -# * You do a for loop over groups `for season, ds_season in ds.groupby(ds.time.dt.season):` -# * You need to remove the time dimension, with `.mean('time')` -# * Use `mean['Tair'].plot.pcolormesh()` to plot -# -#
    -# -#
    -#
    -#
    -# -# → Solution -# -# -# ```python -# for season, ds_season in ds.groupby(ds.time.dt.season): -# mean = ds_season.mean('time') -# mean['Tair'].plot.pcolormesh( -# vmin=-30, vmax=30) -# plt.title(season) -# plt.show() -# ``` -# -#
    -# -#
    - # # References # The following sources where used for creation of this notebook: # - https://github.com/NCAR/ncar-python-tutorial