{ "metadata": { "name": "advanced" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Creating new coords from multiple experiments" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this tutorial, we are going to construct new coord objects and their axes from parameters that vary across a range of experiments. Numerical model runs often involve configuration (control) files that specify the value of parameters used in the runs. Here, we will look at two types of model runs, one where the Drake Passage is open, and one type where it is closed, equilibrated under a range of atmospheric CO2 values. The CO2 concentrations are specified in configuration files that we have saved alongside the Netcdf data in the experiment directories. First, import the modules:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import spacegrids as sg\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import os\n", "figsize(8,4)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Using netCDF4\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtain a dictionary of available projects for easy reference:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "D = sg.info()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Projects rooted in PROJECTS\n", "----------\n", "DP my_project tmp \n", "\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize a project:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "P = sg.project(D['DP'])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Creating exp object GM_C_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object GM_C_1250ppm_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object GM_C_1000ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object DPclsd_C_500ppm_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object DPclsd_C_1750ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object GM_C_390ppm_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object DPclsd_C_750ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object DPclsd_C_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object GM_C_2000ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object GM_C_1750ppm_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object GM_C_1500ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object DPclsd_C_1250ppm_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object DPclsd_C_1000ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object DPclsd_C_2000ppm_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object GM_C_750ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object GM_C_500ppm_flat from /home/wim/PROJECTS/DP4/\n", "Creating exp object DPclsd_C_390ppm_flat from /home/wim/PROJECTS/DP4/" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Creating exp object DPclsd_C_1500ppm_flat from /home/wim/PROJECTS/DP4/\n", "Trying to read mask using yt, xt for mask." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "...no masks read in project init.\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bring axes names X, Y, Z, T into namespace:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for c in P['GM_C_flat'].axes:\n", " exec c.name + ' = c'" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen from the names of created experiment objects, we have two types of experiments, the DP type and the GM type. The Drake Passage is closed in the DP type, whereas this ocean gateway is open in the GM type experiment. The experiment names also contain a CO2 concentration value (e.g. 750ppm), indicating the atmospheric CO2 concentration used in that run. In both experiment types, DP and GM, CO2 varies from 280ppm to 2000ppm. The Netcdf output data contains fields in equilibrium with each CO2 value. The CO2 values are not stored in the Netcdf files. Instead, they are specified in the original configuration files, named ```control.in```, used in the experiments:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ls /home/wim/PROJECTS/DP4/GM_C_flat/" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\u001b[0m\u001b[01;32mcontrol.in\u001b[0m* \u001b[01;32mmk.in\u001b[0m* time_mean.nc\r\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The control.in file looks like this:" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "$ tail control.in \n", " &hlmix /\n", " &isopyc slmx=0.01, ahisop=4.e6, athkdf=4.e6, del_dm=0.4e-02, s_dm=0.1e-2 /\n", " &ppmix /\n", " &smagnl /\n", " &adv_q diffactor=50. /\n", " &co2 co2ccn=280. /\n", " &paleo pyear=1850. /\n", " &ice dampice=5., ice_yr=1850. /\n", " &veg crops_yr=1850. /\n", " &mtlm TIMESTEP=3600., INT_VEG=.true., VEG_EQUIL=.false. /\n", "$ " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The input parameter co2ccn is what we are looking for. Let's examine temperature:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "P.load('temp')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "OK. Fetched field temp for DPclsd_C_1750ppm_flat. 1 file found.\n", "OK. Fetched field temp for DPclsd_C_1250ppm_flat. 1 file found.\n", "OK. Fetched field temp for GM_C_500ppm_flat. 1 file found." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "OK. Fetched field temp for DPclsd_C_2000ppm_flat. 1 file found.\n", "OK. Fetched field temp for GM_C_2000ppm_flat. 1 file found.\n", "OK. Fetched field temp for GM_C_1000ppm_flat. 1 file found." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "OK. Fetched field temp for GM_C_1500ppm_flat. 1 file found.\n", "OK. Fetched field temp for GM_C_1750ppm_flat. 1 file found.\n", "OK. Fetched field temp for GM_C_750ppm_flat. 1 file found." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "OK. Fetched field temp for DPclsd_C_750ppm_flat. 1 file found.\n", "OK. Fetched field temp for DPclsd_C_1000ppm_flat. 1 file found." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "OK. Fetched field temp for DPclsd_C_500ppm_flat. 1 file found.\n", "OK. Fetched field temp for DPclsd_C_390ppm_flat. 1 file found." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "OK. Fetched field temp for GM_C_flat. 1 file found.\n", "OK. Fetched field temp for DPclsd_C_1500ppm_flat. 1 file found.\n", "OK. Fetched field temp for DPclsd_C_flat. 1 file found." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "OK. Fetched field temp for GM_C_390ppm_flat. 1 file found.\n", "OK. Fetched field temp for GM_C_1250ppm_flat. 1 file found.\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The project ```insert``` method takes a function that takes an ```exper``` object as input and outputs a list of (name,value) tuple pairs. These pairs are subsequently inserted into the ```params``` dictionary attribute of each experiment object by the project ```insert``` method. In our case here, we use a function defined in ```sg``` that uses the ```path``` attribute to find the configuration file for that experiment, parse it, and insert the name/ value pairs into the ```params``` dictionary of that experiment. ```sg.read_control_func``` is actually a function that yields a function that reads the control file specified in the argument to ```sg.read_control_func```. ```sg.read_control_func('control.in')``` is then a function that is passed an ```exper``` object, and outputs a list of (name, value) pairs. Such functions can be passed to P.insert to be processed, where for each experiment in the project, the function is executed, and the resulting (name, value) pairs are inserted into the ```vars``` or ```params``` dictionaries of that experiment. We will encounter another such function, using regular expressions." ] }, { "cell_type": "code", "collapsed": false, "input": [ "P.insert(sg.read_control_func('control.in')) # read, parse and insert parameters from control.in " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The value that we saw in the control.in file now appears in the ```params``` attribute of ```P['GM_C_flat']```:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "P['GM_C_flat'].params['co2ccn'] # obtain the value of the 'co2ccn' param" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 8, "text": [ "280.0" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ```param2gr``` project method creates a new field defined on a grid containing a new ```coord``` object constructed from a specified parameter: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "bigfield_DP = P.param2gr('co2ccn' , lambda x:x['temp'], 'DP*') # do this for the DP type" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, the parameter is ```co2ccn``` and the second argument is a function acting on an ```exper``` object (experiment), simply yielding the temp field contained by that ```exper```: in general, this function must take an experiment argument and yield a ```field``` object. A simple wildcard filter is applied in the last argument to obtain only results for the DP type runs. Similar for the GM type runs:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "bigfield_GM = P.param2gr('co2ccn', lambda x:x['temp'], 'GM*') # do this for the GM type" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This new bigger field ```bigfield_DP```, constructed from temp fields across a range of experiments has a 4 dimensional grid that includes the newly constructed ```co2ccn_crd``` coordinate:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "bigfield_DP.gr" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 11, "text": [ "(co2ccn_crd, zt, yt, xt)" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This new ```coord``` contains the CO2 values that we saw in the experiments: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "bigfield_DP.gr[0][:]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 12, "text": [ "array([ 280., 390., 500., 750., 1000., 1250., 1500., 1750.,\n", " 2000.])" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Both bigfield fields contain temperature values over a range of CO2 concentrations. We can examine how the average bottom ocean temperatures (grid cells 17 to 19) depend on CO2 for the DP open and closed type experiments:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "h1, = sg.plot(bigfield_DP[Z,17:]/(X*Y*Z) + sg.zero_kelvin)\n", "h2, = sg.plot(bigfield_GM[Z,17:]/(X*Y*Z) + sg.zero_kelvin)\n", "lbl = plt.ylabel('C')\n", "lbl = plt.xlabel('co2 ccn')\n", "tle = plt.title('Bottom ocean temperature for DP open and closed')\n", "lgnd = plt.legend([h1,h2],[\"DP closed\",\"DP open\"],loc=2)\n", "plt.grid()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ " spacegrids/plotting.py:400: UserWarning:Label units not added: not a string. \n" ] }, { "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAfYAAAEVCAYAAAASO8eQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8j/X/x/HHZwzDjnayM0N2wGgikUVUIpVyHkPpqByS\nfMuXTihJ33SWY32jn/qWWpGKOeRUaeSUYjM7YGebmZ3evz+u9smHzWE++xyuve632252fY6v5+fa\n9nJd7+t6XwallEIIIYQQuuBg7QKEEEIIYT7S2IUQQggdkcYuhBBC6Ig0diGEEEJHpLELIYQQOiKN\nXQghhNARaexCCLP54osvCAwMxNnZmT179li7nDph2bJl9OjR46qfFxcXx4wZM2qhouo5ODhw9OhR\ni75nXSSN3c6EhITQuHFjnJ2d8fDwoH///qSmpl7Rc6v6A2CNX25bFhISwoYNG6xdhlnMmjWL2NhY\ni77nU089xTvvvENBQQEdOnS45teLiYnByckJFxcXXF1diY6O5pVXXqGkpMT4mFmzZuHo6IizszPu\n7u7cdNNN7Nix45rfW+8MBgMGg8HaZYhaII3dzhgMBuLj4ykoKCAjIwMfHx8mTJhg7bJ0w2AwYA9z\nNpWVldnceyilSElJITw8vEbvV1FRcdFtBoOBt99+m9OnT3PixAnmz5/PqlWr6Nevn8ljhg0bRkFB\nAZmZmXTv3p177723RjXUNfbwsy6unjR2O9awYUMGDRrEgQMHjLfl5+czatQovL29CQkJ4eWXX0Yp\nxcGDB3nkkUfYvn27cctm0aJFfPLJJ7z66qs4OzszcOBAAA4ePEhMTAzu7u5ERkby9ddfG18/Li6O\nRx99lH79+uHs7EyPHj04ceIETz75JO7u7oSFhZGYmFhtzdu2baNz5864ublxww03sH37duN9OTk5\njBkzBn9/fzw8PLjnnnuM98XHxxMVFWXcIvv999+N982dO5dWrVrh4uJCREQEX375pfG+ZcuW0b17\nd6ZOnYqHhwctW7Zk3bp1VdYWGxtLSkoKAwYMwNnZmddeew2AHTt20K1bN9zd3YmKimLTpk3G58TE\nxDBjxgxuuukmnJ2dueuuu8jKymLEiBG4urpyww03cOzYMePjHRwcWLhwIaGhoXh5efH000+b/HFd\nsmQJ4eHheHh4cPvtt5OSkmLy3HfeeYfWrVtz3XXXAfDkk08SFBRk3JrdunUrAOvWrWPOnDl8+umn\nODs707FjR0DbI/Hjjz8aX/P8rfrk5GQcHBxYsmQJwcHB3HrrrZetqdK5c+dwdnamvLycDh060Lp1\na+DyP0uPPPII/fr1o2nTpiQkJFS5Xio/HycnJ3r27MlXX33F9u3b+eabb4z3Vz6mfv36jBo1ihMn\nTpCTk1NlnRMnTsTf3x9/f38mTZpk3PpPSEggICCAOXPm4OXlRYsWLfjkk09MnvvUU08RHByMr68v\njzzyCMXFxSbPff311/Hx8cHPz49ly5ZVmQdg6dKlhIeH4+LiQmhoKB988IHxvsu9VnZ2NnfddReu\nrq506dKFI0eOVPs+AFu3bjX+/AYFBbFixYoqH7do0SJat25Ns2bNGDhwIBkZGcb7Jk2ahI+PD66u\nrrRv3579+/df9jMBmDdvHn5+fgQEBLBkyZJL1inMSAm7EhISon744QellFJnzpxRo0aNUqNHjzbe\nHxsbq+6++25VWFiokpOTVZs2bdTixYuVUkotW7ZMde/e3eT14uLi1IwZM4zLJSUlKjQ0VM2ZM0eV\nlpaqDRs2KGdnZ/XHH38opZQaPXq08vT0VLt371bFxcWqV69eKjg4WH300UeqoqJCPffcc+qWW26p\nsvbs7Gzl5uamPv74Y1VeXq5Wrlyp3N3dVU5OjlJKqX79+qmhQ4eqvLw8VVpaqjZv3qyUUmr37t3K\n29tb7dq1S1VUVKjly5erkJAQVVJSopRSavXq1SojI0MppdSnn36qmjRpok6cOKGUUmrp0qXK0dFR\nffjhh6qiokK9++67ys/P75Kf748//mhcTk1NVc2aNVNr165VSin1/fffq2bNmqmsrCyllFI9e/ZU\nrVu3VkePHlX5+fkqPDxctWrVSv3444+qrKxMjRo1So0ZM8b4egaDQfXq1Uvl5uaqlJQU1aZNG/Xh\nhx8qpZT68ssvVatWrdShQ4dUeXm5eumll1S3bt1Mntu3b1+Vm5uriouLlVJKffzxxyonJ0eVl5er\n+fPnK19fX3Xu3DmllFKzZs1SsbGxl8w3a9YsNXLkSKWUUklJScpgMKjRo0eroqIidfbs2cvWdCGD\nwaCOHDmilLqynyVXV1e1bds2pZQyZjpfTEyM8ef3fDfffLOaNm2aUkqpmTNnGjMUFxerp556SgUH\nB1dZ34wZM9SNN96oMjMzVWZmpurWrZvx53/jxo2qfv36asqUKaqkpERt2rRJNWnSxFjvxIkT1cCB\nA1Vubq4qKChQAwYMUNOnTzd57syZM1VZWZn69ttvVePGjVVeXl6VdXzzzTfq6NGjSimlNm3apBo3\nbqx27959Ra81ZMgQNWTIEFVUVKT27dun/P39VY8ePap8n+TkZOXs7KxWrVqlysrKVHZ2tkpMTFRK\nab/7zz33nFJKqR9//FF5enqq3377TZ07d05NmDBB3XzzzUoppdatW6euv/56lZ+fr5RS6tChQ8bf\nt0t9JmvXrlU+Pj5q//796syZM2rYsGEmPx+i9khjtzPBwcGqadOmys3NTTk6Oip/f3/1+++/K6WU\nKisrUw0aNFAHDx40Pv79999XMTExSimtyVXV2Ct/uZVSavPmzcrX19fkMcOGDVOzZs1SSml/jMeP\nH2+8b+HChSo8PNy4vHfvXuXm5lZl7StWrFBdunQxue3GG29Uy5YtU+np6crBwaHKP4QPP/ywyX8+\nlFLquuuuU5s2baryfaKiotSaNWuMmVu1amW878yZM8pgMKiTJ09W+dwLG9/cuXMvao633XabWr58\nuVJKazyzZ8823jdlyhTVr18/4/LXX3+toqKijMsGg0F99913xuV33nlH9e7dWyml1O23327SxMrL\ny1Xjxo1VSkqK8bkbN26ssu5K7u7uau/evUop04ZXXb7zH1PZ2JOSkoz3X66mC53/h/tKfpbO/09p\nVapr7EOHDjX+HM6cOVM1aNBAubm5KW9vb9W7d29jk7xQaGio8T9pSin13XffqZCQEKXUPw21qKjI\neP/gwYPViy++qCoqKlSTJk1MmtK2bdtUixYtjM91cnJS5eXlxvu9vb3Vzp07L5mv0t13363+85//\nXPa1ysrKlKOjo/E/G0op9a9//eui3+tKs2fPVvfee2+V953/n/qxY8ca/6OklFKFhYXK0dFRHTt2\nTG3YsEG1adNG7dixw6Smy30mY8aMMTZ5pZQ6fPiwNHYLkV3xdsZgMLBmzRpyc3M5d+4cCxcupGfP\nnpw6dYqsrCxKS0sJDg42Pj4oKIi0tLQrfv309HQCAwNNbgsODiY9Pd34/t7e3sb7GjVqZLLs5ORE\nYWFhta8dFBRU5Wunpqbi4eGBq6vrRc87duwY8+fPx93d3fiVmppq3FW4YsUKOnbsaLxv3759ZGdn\nG5/v6+tr/L5x48YA1dZY1XuvXr3a5L1/+uknTpw4YXyMj49PtZ9Ho0aNLnqv8z/foKAg42d77Ngx\n45CGu7s7zZo1AzBZfxeum9dee43w8HDc3Nxwd3cnPz+frKysK8pWnfPf40pqqs6V/CxdeP+Vqvx5\nqTRkyBByc3M5efIkP/zwg3HooaqaLvz9qKwHwN3dHScnJ5N6MzIyyMrKoqioiOuvv974Wdxxxx0m\nn3WzZs1wcPjnT2rjxo2r/Tlbu3YtXbt2pVmzZri7u/Ptt9+a/MxW91qZmZmUlZVd9DN0qc+pZcuW\n1d5fKSMjw+RzadKkCc2aNSMtLY1bbrmFxx9/nMceewwfHx8eeugh4/EMl/pMMjIyrrhOYV7S2O2Y\nwWDgnnvuoV69emzduhVPT08cHR1JTk42PiYlJYWAgADj46t6jfP5+flx/Phxk3HfY8eO4e/vf831\n+vv7m4w3n//agYGB5OTkkJ+ff9HzgoKCePbZZ8nNzTV+FRYWMmTIEI4dO8b48eN5++23ycnJITc3\nl8jIyBofFHTh5xEUFERsbKzJexcUFPD0009f0fOrcv4YdUpKivGzDQoK4oMPPjB5rzNnztC1a9cq\nX3/Lli3MmzeP1atXk5eXR25uLq6ursbsVdXSpEkTzpw5Y1w+/z8oVb3HldRUndr6WTp+/Di7d+82\nOcPjSte3n5/fRb8ffn5+xuXc3FyKiopM6vXz88PT0xMnJycOHDhg/Bzy8vI4ffr0Vdd/7tw5Bg0a\nxNNPP82pU6fIzc2lX79+V5TBy8uL+vXrX/QzVJ3AwMDLjsHDxZ/LmTNnyM7ONq6rCRMm8Msvv3Dg\nwAEOHz7MvHnz8PLyuuRn0rx58yuuU5iXNHY7VPkHQCll3HoPCwujXr16DB48mGeffZbCwkKOHTvG\nggULGDlyJKBtWaamplJaWmp8LR8fH5PzSrt27Urjxo159dVXKS0tJSEhgfj4eIYOHWry3jXRr18/\nDh8+zMqVKykrK+PTTz/l0KFD9O/fH19fX+644w4effRR8vLyKC0tZfPmzQA8+OCDvPfee+zatQul\nFGfOnOGbb76hsLCQM2fOYDAY8PT0pKKigqVLl7Jv374a1+jj42Pyh3DkyJF8/fXXrF+/nvLycoqL\ni0lISDDZYj3/M7mSz+e1114jLy+P48eP8+abbzJkyBAAHn74YWbPnm08GDI/P5/Vq1dX+zoFBQXU\nr18fT09PSkpKeOGFF0waja+vL8nJySY1RUVFsWrVKsrKyvjll1/4/PPPL/mfkaut6Xzm+lmqfFxR\nURGbNm1i4MCBdOnSxeTI+Cs1bNgwXnrpJbKyssjKyuKFF1646JTAmTNnUlpaypYtW/jmm2+4//77\nMRgMPPjgg0ycOJHMzExA22uxfv36q66hpKSEkpISPD09cXBwYO3atVf8OvXq1ePee+9l1qxZnD17\nlgMHDrB8+fJq1+GIESP44YcfWL16NWVlZWRnZxvnF1DnHXQ4bNgwli5dyp49ezh37hz/+te/6Nq1\nK0FBQfzyyy/s3LmT0tJSGjduTKNGjahXr95lP5PBgwezbNkyDh48SFFREc8///xVf1aiZqSx26HK\no7ZdXV2ZMWMGK1asICwsDICFCxfSpEkTWrZsSY8ePRgxYgRjxowBoHfv3kRERODr62vcXTxu3DgO\nHDiAu7s79957L46Ojnz99desXbsWLy8vHn/8cT766CPatGkDXHzua1Xnwlb3R8bDw4P4+Hjmz5+P\np6cnr732GvHx8cZdqh999BGOjo60bdsWHx8f3nzzTQCuv/56Fi1axOOPP46HhwetW7c2HtkbHh7O\nlClTuPHGG/H19WXfvn107969RvUBTJ8+nZdeegl3d3def/11AgICWLNmDbNnz8bb25ugoCDmz59v\n0pSu9vMYOHAg119/PR07dqR///6MHTsWgLvvvptp06YxdOhQXF1dadeuHd999121r3P77bdz++23\n06ZNG0JCQnBycjLZ3Xn//fcD2m7d6OhoAF588UWOHDmCu7s7s2bNYsSIEZes9XI1Xej851/tz1J1\nHn/8cVxcXPD19WXSpEncf//9Jmc2XM352M899xzR0dG0b9+e9u3bEx0dzXPPPWe839fXF3d3d/z8\n/IiNjeX999831vvKK6/QqlUrunbtiqurK3369OHw4cNVZr8UZ2dn3nzzTQYPHoyHhwcrV640npFy\nJa/11ltvUVhYiK+vL2PHjjX+/FQlMDCQb7/9lvnz59OsWTM6duzI3r17je9R+T69e/fmxRdfZNCg\nQfj5+ZGUlMSqVasAOH36NOPHj8fDw4OQkBA8PT2ZOnXqZT+T22+/nYkTJ9KrVy/atGlD79695bx5\nCzGoa9kEE0JcFQcHB/76668rGvcUlpWQkEBsbCzHjx+3dilCXJP61njTkJAQXFxcqFevHo6Ojuza\ntcsaZQghhBC6Y5XGbjAYSEhIMDmqVYi6QHZF2jZZP0IPrNLYQaYyFHVTeXm5tUsQ1YiJiZEjt4Uu\nWOXgOYPBwK233kp0dDSLFi2yRglCCCGELllli/2nn36iefPmZGZm0qdPH9q2bWtyTqrsDhNCCFHX\nmGtPtlW22Js3bw5oky3cc889VR48V3mOpT1/zZw50+o1SAb95NBDBslhW196yKCXHOZk8cZeVFRE\nQUEBoM1utH79etq1a2fpMizi/Jmc7JUeMoA+cughA0gOW6KHDKCfHOZi8V3xJ0+eNF6Os6ysjBEj\nRtC3b19LlyGEEELoksUbe4sWLS55vW49iYuLs3YJ10wPGUAfOfSQASSHLdFDBtBPDnOxyZnnDAaD\n2ccchBBCCFtlzr5nV3PFe3h4GOc3li/b+LKXSYYSEhKsXcI100MGkBy2RA8ZQD85zMVqE9TURG5u\nrmzJ2xg5NVEIIWyLXe2Kl130tkfWiRBCXLs6uyteCCGEEJcmjV3UCXoYg9NDBpActkQPGUA/OcxF\nGrudSU5OxsHBgYqKCou956xZs4iNjbXY+wkhhKg5aexmEhISQuPGjXFxccHd3Z2bbrqJ999/32TM\nJC4ujoYNG+Ls7EyzZs3o27cvf/zxhxWrvjJ6OEAuJibG2iVcMz1kAMlhS/SQAew7R3ExrFpl3teU\nxm4mBoOB+Ph4Tp8+TUpKCs888wyvvPIK48aNM3nMtGnTKCgoIDU1FW9vb5lYQQgh6qA9e+CJJyAg\nAJYsMe9rS2OvBc7OzgwYMIBPP/2U5cuXc+DAgYse4+TkxLBhw9i3b1+Vr3H27FmmTJlCSEgIbm5u\n9OjRg3Pnzl30uPT0dO666y6aNWtG69at+fDDD4337dq1i+joaFxdXfH19WXKlCnG+3bs2EG3bt1w\nd3cnKiqKTZs2Ge9LSkqiZ8+euLi40LdvX7Kysq7l47AJehiD00MGkBy2RA8ZwH5y5OXBu+9CdDQM\nGADu7vDLL7B+vXnfRxp7LercuTMBAQFs2bLFeFvlrvnCwkL++9//0qlTpyqf+9RTT/Hbb7+xfft2\ncnJymDdvXpW7xIcOHUpQUBAZGRl89tln/Otf/2Ljxo0APPnkk0yaNIn8/HyOHj3K4MGDAUhLS6N/\n//78+9//Jjc3l9dee41BgwaRnZ0NwPDhw+ncuTPZ2dnMmDGD5cuX62J3vBBCWJpSkJAAsbEQEgIb\nN8LLL0NSEjz/vHZbLbyp7amurMuVq32E1/5VEyEhIerHH3+86PauXbuq2bNnK6WUGj16tGrUqJFy\nc3NTvr6+auDAgero0aMXPae8vFw5OTmpvXv3XnRfUlKSMhgMqry8XKWkpKh69eqpwsJC4/3Tp09X\ncXFxSimlbr75ZjVz5kyVmZlp8hpz585VsbGxJrfddtttavny5erYsWOqfv36qqioyHjf8OHD1ciR\nI6vMbaM/QkIIYVVpaUq9/LJSoaFKRUYqtWCBUhf8KTZhzr+lutpiN1drN6fU1FTjtKsGg4GpU6eS\nm5tLRkYGX375JS1atLjoOVlZWRQXFxMaGnrJ105PT8fDw4MmTZoYbwsKCiItLQ2AxYsXc/jwYcLC\nwrjhhhv45ptvADh27BirV6/G3d3d+PXTTz9x4sQJ0tPTcXd3x8nJyfiawcHB1/w5CCGE3pWWwhdf\nQP/+EBkJx47BJ5/A3r0wcSJ4elqmDl01dlvz888/k56eTvfu3Y23qSv4n4OnpyeNGjXir7/+uuTj\n/Pz8yMnJobCw0HhbSkoKAQEBALRq1YpPPvmEzMxMpk2bxn333UdRURFBQUHExsaSm5tr/CooKODp\np5+mefPm5ObmUlRUZHzNY8eO2f2ueHsZg7sUPWQAyWFL9JABrJ/j0CF4+mkIDIQFC+D+++H4cXj/\nfbjhBrD0n09p7GZU2bRPnz5NfHw8w4YNIzY2loiICJP7L8fBwYGxY8cyefJkMjIyKC8vZ/v27ZSU\nlJg8LjAwkG7dujF9+nTOnTvH3r17WbJkCSNHjgTg448/JjMzEwBXV1cMBgP16tVj5MiRfP3116xf\nv57y8nKKi4tJSEggLS2N4OBgoqOjmTlzJqWlpWzdupX4+HhzfURCCKELhYWwdCl07w633KI1702b\nYPNmGD0aztuRanlm26lvRtWVZaPlKqW0MXYnJyfl7OysXF1dVbdu3dQ777yjKioqjI+Ji4tTM2bM\nuKLXO3v2rJo4caLy9/dXrq6uqmfPnqq4uFglJSUpBwcHVV5erpRSKjU1VfXv3195eHio0NBQ9f77\n7xtfY+TIkcrb21s1bdpURUZGqjVr1hjv27lzp+rZs6fy8PBQXl5eqn///iolJUUppdTRo0dVjx49\nVNOmTVWfPn3UhAkTLhqTr2TL60QIIcypokKp7duVeuABpdzclBowQKkvv1SqpOTaX9ucf0vlIjDi\nmsg6EULoXWYmfPQRLF4MJSUwbpy2Vd68ufneQy4CI8RVsvYYnDnoIQNIDluihwxQOznKy2HtWrjv\nPmjdWptQ5t134fBheOYZ8zZ1c7Or67ELIYQQtSkpSZsJbtkyrXmPG6dtqbu6WruyKye74sU1kXUi\nhLB3xcXaaWqLF2tb5sOHaw29fXvL1WDOv6WyxS6EEKJOSkzUmvnKldCpEzz4INx9NzRsaO3Kro2M\nsYs6QQ9jiXrIAJLDlughA1xdjrw8eOcduP56GDgQmjWDX3/V5msfMsT+mzrIFrsQQgidU0o7x/zD\nDyE+Hm67DebMgd69oV49a1dnflYbYy8vLyc6OpqAgAC+/vpr06JkjN1uyDoRQtiqtDRYvlw7GM7J\nCR54AEaMsNzUrldDF2Ps//nPfwgPD6egoMBaJQghhNCZ0lJtq3zxYti2TZve9ZNPoHNny0/tai1W\nGWNPTU3l22+/5YEHHpCtPWERehhL1EMGkBy2RA8ZQMtx6BBMnWo787Vbk1W22CdNmsS8efM4ffp0\ntY+Ji4sj5O8L1bq5uREVFWWh6momJCSEU6dOUb9+ferVq0d4eDijRo1i/PjxxguoxMXFsXLlSho0\naECDBg24/vrrWbhwIdddd52Vq782lX8cYmJibHY5MTHRpuqpyXIlW6mnpsuJiYk2VU9dXx/2vFxY\nCC+8kMDq1YkUF8cwejTMm5dAYKBt1Hep5crvk5OTMTeLj7HHx8ezdu1a3n77bRISEpg/f74uxthb\ntGjB4sWL6dWrFwUFBSQkJPDkk08SExPDkiVLABgzZgyBgYG88MILnD17lgcffJAjR46wfft2K1df\nc7a8ToQQ+qMU7Nih7Wr//HO4+WYYOxb69QNHR2tXV3N2PaXstm3b+Oqrr2jRogXDhg1jw4YNjBo1\nytJl1CpnZ2cGDBjAp59+yvLlyzlw4MBFj3FycmLYsGHs27evytfIz89n1KhReHt7ExISwssvv2xc\n6cuWLeOmm25iwoQJuLm5ERYWxoYNG0yeO27cOPz8/AgICGDGjBlUVFQYn9u9e3emTp2Kh4cHLVu2\nZN26dbXwKQghhPlkZsLrr2vXOR89Glq1ggMHYM0a7bQ1e27q5mbxxj579myOHz9OUlISq1atolev\nXqxYscLSZVhE586dCQgIYMuWLcbbKptzYWEh//3vf+nUqVOVz50wYQIFBQUkJSWxadMmVqxYwdKl\nS43379q1i1atWpGdnc3zzz/PvffeS15eHqDt8m/QoAFHjhzht99+Y/369Xz44Ycmz23bti3Z2dk8\n/fTTjBs3rjbi25QLd5/aIz1kAMlhS2w9Q3Xztf/xh+l87baew9Ksfh67wYxHNBieN89rqZnm27Xs\n5+dHTk6O9rpK8dprr/HWW2/RqFEjunTpwrJlyy56Tnl5OZ9++il79uyhSZMmNGnShClTpvDRRx8x\nduxYALy9vXnyyScBGDx4MPPnzyc+Pp4+ffqwdu1a8vLyaNSoEU5OTkycOJFFixYxfvx4AIKDg43N\nfNSoUTz66KOcOnUKb29vs+UWQoia0sN87dZk1cbes2dPevbsabbXM2dDNpfU1FQ8PDwA7T8xU6dO\n5YUXXrjkc7KysigtLSU4ONh4W1BQEGlpacZlf39/k+cEBweTnp5OSkoKpaWlND/v0kMVFRUEBQUZ\nl319fY3fN27cGND2IOi5sVceuGLP9JABJIctsaUMBQXafO3Ll8Pevdr55t9+C+3aXf65tpTDFlh9\ni13Pfv75Z9LT0+nevbvxtis5OMLT0xNHR0eSk5MJCwsDICUlhYCAAONjzm/yAMeOHWPgwIEEBgbS\nsGFDsrOzcXCQGYOFELartBS++w4+/hjWrdMOhHvoIW3MXA9Tu1qL/OU3o8qmffr0aeLj4xk2bBix\nsbFERESY3H859erVY/DgwTz77LMUFhZy7NgxFixYwMiRI42POXXqFG+++SalpaWsXr2aQ4cO0a9f\nP3x9fenbty+TJ0+moKCAiooKjhw5wubNm80f2I7oYQxODxlActgSa2RQSps45rHHwM8P5s6Fnj3h\nr7/gq69g8OCrb+p6WBfmJFvsZjRgwADq16+Pg4MDERERTJkyhYcffth4v8FguOJjChYuXMiECRNo\n2bIljRo1Yvz48YwZM8Z4f5cuXfjzzz/x8vLC19eXzz//HHd3dwBWrFjBM888Y5zZr2XLljzzzDPV\n1mDO4xyEEKIqhw7Bf/+rfTVsCCNHwq5d0KKFtSvTH7keux1atmwZixcvNjna3lpknQghqpORAatW\nac08PR2GDdPGzjt2rFszwV0JXcwVL4QQQn8qD4L7+GP4+WdtvHzuXLjlFn1eSc0WyRi7HbqaXfpC\no4cxOD1kAMlhS8yVofLCK0OHanO1f/aZdopaWpp2ytqtt9ZuU9fDujAn2WK3Q6NHj2b06NHWLkMI\nUYcpBdu3a7vZ/+//4LrrtN3sb71lm5dFrUtkjF1cE1knQtQtVR0EN3y4HAR3rWSMXQghhMVUdRDc\nZ5/JQXC2SsbYRZ2ghzE4PWQAyWFLLpWhoECbBa5vXwgP1+ZpnztXu8b5/PnQqZPtNHU9rAtzsqst\ndnd3dznDy0TzAAAgAElEQVRozMZUnjsvhLB/588Et3atNnHMuHHw5Zfw9+zTwg7Y1Ri7EEII86ru\nILj775eD4CxJxtiFEEJcE5kJTr9kjL0W6WHcRw8ZQB859JABJIc1ZWTAggUQHQ29esEffyTw2Wdw\n4AA8+6z9NnV7XBe1SRq7EELo2KUOgnv0Uds6CE6Yh4yxCyGEzlR1ENyIETBggBwEZ6vM2feksQsh\nhA7IQXD2zZx9T3bF1yI9jPvoIQPoI4ceMoDkMLdDh2DGDAgN1U5N8/PTDoLbuhUeeeTSTd1WMlwr\nveQwFzkqXggh7IzMBCcuRXbFCyGEHSgogP/9T2vmlZdDHTlSLoeqFzLGLoQQdYAcBFd3yBi7ndDD\nuI8eMoA+cughA0iOy1EKduyAxx7TxsvnztUa+pEj8NVXMGSI+Zq6rAt9kjF2IYSwASkp8NFHsGKF\n1txHjZKZ4ETNWHxXfHFxMT179uTcuXOUlJQwcOBA5syZY1qU7IoXQtQBhYXauPny5ZCYCIMHaw29\na1c5CK6usfsx9qKiIho3bkxZWRndu3fntddeo3v37v8UJY1dCKFTFRWQkKA18zVroHt3GD1aGzdv\n1Mja1Qlrsfsx9sZ/DxCVlJRQXl6Oh4eHNcqodXoY99FDBtBHDj1kgLqb4/BhbT72kBCYPBmiouCP\nPyA+XptExhpNva6uC72zyhh7RUUFnTp14siRIzzyyCOEh4df9Ji4uDhCQkIAcHNzIyoqipiYGOCf\nlWjry5VspZ66vJyYmGhT9dRkuZKt1FPT5cTERJuqpzbXR24uvPhiAt99B9nZMYwYATNnJhAaav36\n9bRsj7/fld8nJydjblY93S0/P5/bbruNuXPnGkOD7IoXQtivylPUli+H9evhttu0Xe233Qb15XBl\nUQ273xVfydXVlTvvvJNffvnFmmUIIcQ1S0yESZMgIABmz4Zbb4XkZG3e9jvvlKYuLMfijT0rK4u8\nvDwAzp49y/fff0/Hjh0tXYZFXLjLzh7pIQPoI4ceMoC+cpw4AfPnQ4cO2kxwTZtqc7Rv2wYPPQTu\n7tau8tL0tC7EPyz+f8iMjAxGjx5NRUUFFRUVxMbG0rt3b0uXIYQQNVJcrE0U8/rr2gVY7r4b3nhD\nm0TGQab8EjZAppQVQojLqLwk6vLl/1xsZfRouPdeaNLE2tUJPTBn35NRHyGEqEZy8j+zwdWrpzXz\nxEQIDLR2ZUJUT3Yc1SI9jPvoIQPoI4ceMoDt5ygogKVLtaumRUfDiRPaRVgOHoTp0/9p6rae40ro\nIQPoJ4e5yBa7EKLOKy+HjRu1Xe1ffw033wyPPw79+0PDhtauToirI2PsQog669AhrZl//DF4eWm7\n2ocNA29va1cm6hoZYxdCiBrKzoZVq7Rx85QUGDkSvv0W2rWzdmVCmIeMsdciPYz76CED6COHHjKA\ndXKUlmoXXBk0CFq2hC1bYNYsOH4c5s2rWVPXw/rQQwbQTw5zkS12IYQuKQW//abtal+5Etq00Xa1\nL14Mbm7Wrk6I2iNj7EIIXcnI0MbMV6zQrnc+ahTExkKrVtauTIjq2f312C9HGrsQ4mqcPQtffqk1\n8x07tIljRo2CHj1kNjhhH3RzERi908O4jx4ygD5y6CEDmC+HUtq87A8+CP7+2rnnI0dCWpq2u722\np3jVw/rQQwbQTw5zkTF2IYRdSUrStsxXrNDOMR89Gvbu1a6qJoSQXfFCCDtw+jSsXq0dCHfwIAwd\nqu1qj44Gg8Ha1Qlx7WSMXQhRJxw+DM8/D/Hx2hSvo0dr1zZv0MDalQlhXjLGbif0MO6jhwygjxx6\nyABXlqOsDF59Fbp1084x/+sv7eC4e+6xnaauh/WhhwygnxzmImPsQgibsncvjB2rnWu+a5c2oYwQ\n4srJrnghhE04dw5efhnefRfmztWau4yfi7pC5ooXQujKzp1aI2/VCvbsAT8/a1ckhP2SMfZapIdx\nHz1kAH3k0EMGMM1x5gxMngwDB8K//62No9tLU9fD+tBDBtBPDnORxi6EsIoNG6B9ezh5EvbtgyFD\nZNe7EOYgY+xCCIvKz4epU2HtWm08vX9/a1ckhPXJ6W5CCLsUHw+RkdpUr/v2SVMXojZIY69Fehj3\n0UMG0EcOe86QmQnDh8PEiTB5cgLvvQeurtau6trY8/qopIcMoJ8c5iKNXQhRa5SCVau0SWaaN9fO\nUe/Y0dpVCaFvFh9jP378OKNGjeLUqVMYDAbGjx/PE088YVqUjLELYffS0uDRR+HIEe1qa126WLsi\nIWyXXY+xOzo6smDBAvbv38+OHTt4++23OXjwoKXLEELUEqVg0SKIitK2zn/9VZq6EJZk8cbu6+tL\nVFQUAE2bNiUsLIz09HRLl2ERehj30UMG0EcOe8hw9Cjceit88IF2OtusWdqlVc9nDzmuhB5y6CED\n6CeHuVh15rnk5GR+++03ulTx3/m4uDhCQkIAcHNzIyoqipiYGOCflWjry5VspZ66vJyYmGhT9dRk\nuZKt1HP+ckUF7N0bw0svwf33J3DffdCuXdWPT0xMtHq95liuZCv11OVle/z9rvw+OTkZc7PaeeyF\nhYXExMTw3HPPcffdd5sWJWPsQtiNAwdg3DjtqmsffgitW1u7IiHsj12PsQOUlpYyaNAgRo4ceVFT\nF0LYh9JSeOkl6NkTRo2CjRulqQthCyze2JVSjBs3jvDwcCZOnGjpt7eoC3fZ2SM9ZAB95LClDL/+\nCtHRsG2b9v0jj2iTzlwJW8pxLfSQQw8ZQD85zMXijf2nn37i448/ZuPGjXTs2JGOHTuybt06S5ch\nhKiBs2fhmWegXz9tWthvvoGgIGtXJYQ4n8wVL4S4Ilu2wAMPQIcOsHAh+PhYuyIh9EOuxy6EsJiC\nApg+Hb74At56C+65x9oVCSEuRaaUrUV6GPfRQwbQRw5rZPjuO2062KIi7aIt5mjqelgXoI8cesgA\n+slhLrLFLoS4SE4OTJ4MmzZpk8307WvtioQQV0rG2IUQJj7/HCZMgPvug9mzoWlTa1ckhP7JGLsQ\nwuxOnIDHH9d2ua9eDTfdZO2KhBA1IWPstUgP4z56yAD6yFFbGZSC5cuhfXto0wYSE2u3qethXYA+\ncughA+gnh7nIFrsQdVhKCjz0kLa1vm4ddOpk7YqEENdKxtiFqIMqKuDdd2HmTO0gualTwdHR2lUJ\nUXdZZIz9zz//5OTJk3Tv3t3k9q1bt9K8eXNCQ0PNUoAQwrIOH9Yu2lJerk06ExZm7YqEEOZU7Rj7\nxIkTcXFxueh2FxcX3c/xbi56GPfRQwbQR45rzVBWBq+8At26wf33W6+p62FdgD5y6CED6CeHuVS7\nxX7y5Enat29/0e3t27cnKSmpVosSQpjXnj3aVrq7O/z8M7RoYe2KhBC1pdox9latWvHXX39V+aRL\n3WeWomSMXQizOHdOu7Tq++/D3LkwZgwYDNauSghxIYtcjz06OpoPPvjgotsXLVrE9ddfb5Y3F0LU\nnh07tKPcf/9dO4Vt7Fhp6kLUBdU29jfeeIOlS5fSs2dPJk+ezOTJk+nZsyeLFy/mjTfesGSNdksP\n4z56yAD6yHGlGc6c0Y50v+ce7aj3L74AP7/are1q6GFdgD5y6CED6CeHuVQ7xu7r68u2bdvYuHEj\n+/btw2Aw0L9/f3r16mXJ+oQQV2HDBnjwQe0Aud9/B09Pa1ckhLA0OY9dCB3Iz4enntKuxvbuu3Dn\nndauSAhxNSwyxi6EsA9ffw2RkVCvnjbPuzR1Ieo2aey1SA/jPnrIAPrIcWGGzEwYPhwmTYKPPoL3\n3oMqpp6wOXpYF6CPHHrIAPrJYS7S2IWwM0rBypXQrh34+8PevRATY+2qhBC2QsbYhbAjaWnw8MOQ\nnAyLF8MNN1i7IiGEOcgYuxB1TEUFLFoEUVFw/fXw66/S1IUQVZPGXov0MO6jhwxgvzmUgrVrIToa\nFixIYMMGmDULGjSwdmU1Z6/r4kJ6yKGHDKCfHOYi12MXwkZt3QrTp0N2tjYtrLu7Nq4uhBCXYpUx\n9rFjx/LNN9/g7e3N77//fnFRMsYu6rDERHj2Wdi/H55/HkaO1E5lE0Lol92PsY8ZM4Z169ZZ462F\nsFmHD8PQoXDHHXD77fDHHzB6tDR1IcTVsUpj79GjB+7u7tZ4a4vSw7iPHjKAbedITdWmgb3pJmjf\nHv76CyZMgIYNTR9nyxmuhuSwHXrIAPrJYS42O8YeFxdHSEgIAG5ubkRFRRHz98m6lSvR1pcr2Uo9\ndXk5MTHRpuoBiIiIYe5cWLQogQED4PDhGNzd9f/zlJiYaFP1yO+3/S/b4u/3lfz8JCQkkJycjLlZ\n7Tz25ORkBgwYIGPsos45fRpefx0WLtR2vT/3HDRvbu2qhBDWZPdj7ELURWfPag29dWs4ehR+/hne\nfluauhDCvKSx16ILd9nZIz1kAOvmKC3VJpdp0wa2bNEurbpiBbRseXWvI+vCtughhx4ygH5ymItV\nGvuwYcPo1q0bhw8fJjAwkKVLl1qjDCFqVUUFrFoFERHav599Bl98oS0LIURtkbnihTCzytninn0W\nHB1hzhzo3dvaVQkhbJk5+57NHhUvhD3asgX+9S/IydFmi7v7bjAYrF2VEKIukTH2WqSHcR89ZIDa\nz/Hbb9rEMqNGaeek790L99xj3qYu68K26CGHHjKAfnKYi2yxC3ENDh+GGTO0LfVnn4U1a+z7Ai1C\niNpRXFZMekE6aafTSD2dSlpBGmkFf39/Os2s7yVj7ELUwPHj2jzua9bA5MnwxBPQpIm1qxJCWJpS\nivxz+cYGXVXTTitI4/S50zRv2pwAlwD8Xfzxd/bXvnf2x9/Fnx7BPWSMXQhryMyE2bO109Ueekjb\nYq8DsyMLUSeVV5Rz8sxJkwZtbNznNfH6DvWNDbqyWUf5RNG/dX/jbZ6NPXEwWGb0Wxp7LUpISDBO\nI2iv9JABrj3H6dMwfz689RYMH65dec3X13z1XQlZF7ZFDzn0kAFqluNs6dmLGvSFW9knC0/i4eRx\n0VZ2mGeYSRN3buhcO8FqSBq7EJdw9qw2O9yrr2oHx/3yC7RoYe2qhBDVUUqRW5x72a3swpLCi7ay\nQ1xD6B7Y3djEmzs3p0E9+ztoRsbYhahCaSksXQovvgidO2v/ysQyQlhXWUUZJwpPVLuVnXo6lfSC\ndBrUa2DSsM8fy6783rOxJwYbOhdVzmMXopZUVMCnn8K//w0hIfD553DDDdauSgj9U0qRUZjB4ezD\npJ5ONTbu87e8T505hVdjr4sOPosMjTTe5u/iT9MGTa0dx6pki70W6WH8Sg8Z4PI5lIJvvtFOWWvU\nSJstrlcvy9V3JerKurAXeshhjQyVDXz/qf3sz9zPgcwDxn8dHRy5zvM6Al0Cta1r5wCTrWzfpr44\n1nO0iRzmJlvsQpjR5s3abHF5efDyy3DXXTJbnBDX6vwGXtm8z2/g4V7hRHhHEOUbxYh2Iwj3Cser\niZe1y9YF2WIXddbu3VpDP3xYOyd9+HCoV8/aVQlhX5RSnCg8oTXuC7bC6zvUJ8IrggjvCMI9tUYe\n4RUhDbwK5ux70thFnXPokDZb3E8/wXPPwQMPyGxxQlzOhQ38QNYB49Z4PYd6RHhFaFvhfzdyaeBX\nRxq7ndDDuI8eMoCWo2XLGJ5/Hr76Cp56Ch5/3L5mi9PTupActqGqDJUN/Pzd55UN3MHgYGzaxi1x\nr3C8m3hbJ8Df9LAuZIxdiKtw6pQ2sczGjfDww/Dnn+DmZu2qhLAupRQ5Z3P48eiPJuPf+0/tN2ng\n7bzbMTRiKBHeEVZv4OLKyBa70K38fHjtNXjnHRgxQjvi3cfH2lUJYVlKKU6eOXnRQWznN3DjLvS/\nt8K9GnvZ1DnedYFssQtxCWfPalvo8+bBnXfCr79q56QLoWeVDbxyq/v8g9gAY9OO9I5kSMQQ4y50\naeD6I429Fulh3MeeMpSWwuLF2ixxXbtCQgKEh2v32VOO6ughA0iOa6WU4tSZUxcdxHZhA4/wimBw\nxGAivCKqbeCyLvRJGruwexUVsGqVNltcy5bw5ZfaNLBC2LPzG7hxF/rfu9MVyuQo9PvD779kAxd1\ni4yxC7ulFMTHa2PnTZpol1O95RZrVyXE1SstL+VQ1iESTySSeDKRxBOJ7DmxhwpVUeVR6D5NfKSB\n64yc7ibqvIQEbXKZggJttrgBA2S2OGEf8ovz2XNyj9bE//46lHWIYLdgonyjiPKJIso3ivY+7fFt\n6isNvI6Qxm4n9DDuY2sZDh2CJ5+Ev/6CF16AoUOvbLY4W8tRE3rIAHUnh1KK46ePmzTwxBOJnDpz\ninY+7UyaeKR3JE0aWH5ShbqyLuyBHBUv6pzSUu3Utddf12aNe/hhmS1O2I7S8lIOZh28qIk3rN9Q\na+C+UQyJGMKc3nNo5dGKeg4yd7GoPVbZYl+3bh0TJ06kvLycBx54gGnTppkWpZMtdmEeiYkwdix4\necEHH0BwsLUrEnXZle5K7+DbAd+mvtYuV9gJu94VX15eznXXXccPP/yAv78/nTt3ZuXKlYSFhf1T\nlDR2AZw7p5269sEH8OqrMHq0jKMLy7GHXelCP8zZ9xzM8ipXYdeuXbRq1YqQkBAcHR0ZOnQoa9as\nsXQZFpGQkGDtEq6ZtTLs2AEdO8KBA7BnD8TFXVtTl3VhO2wxR0l5CXtO7GF54nImfTeJW5bfgser\nHnT9sCvv/fIexWXFDI0cyrqR68h/Jp/t47YzpMkQHop+iC4BXey2qdviuqgJveQwF4uPsaelpREY\nGGhcDggIYOfOnRc9Li4ujpC/pwtzc3MjKirKeHBE5Uq09eVKtlKPPSyfOQNxcQls2ADvvRfDfffB\npk0J/PHHtb1+YmKiTeS7luVKtlJPTZcTExOt+v7x6+M5knMEQiDxZCJbN28lJT+F0I6hRPlG4Zzh\nTD+Pfqx6bBU+TX3+eX6E6etVsvbnKcv2+ftd+X1ycjLmZvFd8Z9//jnr1q1j0aJFAHz88cfs3LmT\nhQsX/lOU7IqvkzZu1C6heuON8MYb4Olp7YqEPVNKkZKf8s9u9L/PD888k0l7n/bGg9oqd6U3dmxs\n7ZJFHWbXR8X7+/tz/Phx4/Lx48cJCAiwdBnChuTnw9NPw7ffwnvvafO7C3E1SspLOJh50KSBJ55I\nxKm+k7F5D4scxiu3vkKoe6gclS50zeKNPTo6mj///JPk5GT8/Pz49NNPWblypaXLsIgEHZxbWdsZ\nvvkGHnkE7rgD9u0DV9faeR9ZF7bjWnPkFeex58QekyZ+KOsQLdxaGJv4Hd3voINPB3ya1t7l/PSw\nPvSQAfSTw1ws3tjr16/PW2+9xW233UZ5eTnjxo0zOSJe1A3Z2dpEM9u3w/LlMhWsMKWUIrc4l9TT\nqRzNPao18ip2pd8YcCOPRD8iu9KFOI/MPCcsSin47DN44gkYNkw7na2JfR5QLGro/KZ9PP+49u9p\n7d/zv6/vUJ8AlwBC3ELo4NPBuDUuu9KFHtn1eexXQhq7PmVkwGOPadPCLl6sHSQn9KWyaVc27PMb\n9fnNu75DfQJdAglwCSDQNZAA54B/vnfRvndp6GLtOEJYjF0fPFeX6GHcxxwZlNJ2tz/9NIwfDytX\nQsOG5qnvSsm6uHZKKXLO5lyyYaeeTsXRwdHYnCub9s3BN2vLLoEcTTzKnX3s/whJa68Pc9BDBtBP\nDnORxi5qVUqK1sxPnYL16yEqytoViaqc37SratiVW+AN6jUw2bIOdAmkZ3BP4/cBLgE4N3S+5Hud\ndDxpoVRC1E2yK17UiooK7dS1mTNh8mR46ilwdLR2VXVTZdOuahz7/F3mDeo1MNkVbtxV7vLPbZdr\n2kKImpFd8cKm/fmnNtFMaSls3gxy0kPtUUqRfTbbdMu6wLRhX9i0Kxt1THCMsWFL0xZCP2SLvRbp\nYdznajKUlcGCBfDKK9qlVR9//MqulW4J9rouzpaeJTkvmaS8JL7/8Xsat2l80ZHkjeo3umjL+vwD\n0/yd/W2qadvruriQHnLoIQPoI4dssQub8/vv2qVVXVxg1y5o2dLaFdmH0vJSUvJTjM07KS+JpFzt\n3+S8ZHLO5hDkGkQLtxY0yGlAl3pduCXkFpNx7qYNmlo7hhDChsgWu7gmJSUweza8/TbMmQPjxsml\nVc9XXlFOekH6P437vKadlJdERkEGzZ2b08KtBS3cWxDiGkIL9xbG5eZNm8s520LUAXIeu7AJP/+s\nNfLgYHj3XaiLU/4rpcgsyjQ27KTcJJLzk43Lx/OP4+7k/k/jdgvRvv97OdAlEMd6clShEHWdNHY7\noYdxn6oynD2rHe2+YgW8/ro2g5ytb6Vfy7rIK86rtnEn5yXTqH6jaht3sGswTo5OVs9gSySH7dBD\nBtBHDhljF1azZYu2ld6pE+zdC97e1q7o2p0pOWPcNV7VLvOyijKTxh3qHsqtLW41LssMaUIIWyJb\n7OKKFBTA9Onw5ZfaePrAgdau6MqVlJdwLO9YtQeonT53mmDX4Cq3uEPcQmjm1AyDre+SEELYNdli\nFxa1fr02e1zv3trR7+7u1q7IVHlFOamnUy9q3JXLp86cwt/Z33hQWohbCAPaDDAu+zT1wcHgYO0Y\nQghhFrLFXovsfdwnNxeGD0/g4MEYPvgA+va1Xi3lFeUcyT3CvlP7OJR1yGSrO/V0Kl6NvUwad+UW\ndwu3Fvi7+LN181a7Xhdg/z9PlSSH7dBDBtBHDtliF7Xuiy+0CWa6dIF9+6CphU6VrlAVHMs7xv7M\n/ew7tY99p/axP3M/f2T9QXPn5kR4RRDmFUZ082juD7+fELcQgl2DaVjfwleVEUIIGyVb7MLEyZMw\nYQLs2aNdWrV799p5H6UU6QXpxsZd2cQPZh3ErZEbkd6RRHhFGP8N8wqTiViEELolp7sJs1MK/vtf\nmDIFxozRTmdzMs9ZWmSeyTTZ+q78t0G9BiYNPNI7knCvcNwauZnnjYUQwk5IY7cT9jLuk5oKDz+s\nXWJ1yRKIjv7nvqvJkFecx/5T+y/aCi+tKDU27vO3wr2aeNVOoCrYy7q4FD1kAMlhS/SQAfSRQ8bY\nhVkoBYsWwbPParvf//c/aNDg8s8rLCnkQOYBrYln7jM28/xz+YR7hWtN3CuS/m36E+kdSfOmzeV0\nMSGEsBDZYq+jjhyBBx+EwkJtKz0y8uLHFJcVcyjrkOku9FP7OVF4graebYnwjiDS6+8tce8IglyD\n5LQxIYSoAdkVL2qsvBzefBNefhmeeQYmTgRlKOXPnD8vGgdPyU8h1D3UdBe6dwSh7qFyYRIhhDAj\naex2wtbGffbtL2fkE0cpddtP35H7yCjXmvhfOX8R6BJobNyVW+Gtm7Vm25ZtNpWhpmxtXdSEHjKA\n5LAlesgA+sghY+zikpRSpOSnGLe+957Yx4Z9+8go/YNmMd50DY2goXMkd3rdybSbptHWs63ZLlQi\nhBDCuiy6xb569WpmzZrFoUOH+Pnnn+nUqVPVRelki722KaXIKMy46Ej0/Zn7cWnoQoRXBN5Esvmz\nSPwbRLB4bjjhoc7WLlsIIcQF7HaLvV27dnzxxRc89NBDlnxbu1deUU5SXhKHsg4Zvw5mHeRg5kEc\nDA6082lHhFcE0X7RxEXFEeEVgZPBnRdfhA8/hHnzIDbW9i+tKoQQ4tpZtLG3bdvWkm9ndVc77lNY\nUsjh7MMczDzIoex/mvhfOX/h08SHtp5tCfMKo7NfZ2Lbx9LWsy3eTbwvOpVs+3YYOxYiIrQZ5Hx9\nLZfBVukhhx4ygOSwJXrIAPrJYS42O8YeFxdHSEgIAG5ubkRFRRlXXEJCAoBNLRcXw4YNMezeDY0a\nJeDvD35+4OoK6ekJNGmiPV4pxf/W/o+U/BQatWrEwayDbNuyjZT8FAr9CmndrDUeJz0Icg1i0K2D\naOvZlhP7TtCofiOT91OFCp8QH5N6OneO4dln4aOPEnjiCZg503Y+H2svJyYm2lQ9NVmuZCv11HQ5\nMTHRpuqp6+tDD8v2+Ptd+X1ycjLmZvYx9j59+nDixImLbp89ezYDBgwA4JZbbmH+/Pm6GWPfvBnG\njYPOnbVd3snJcPhIKb+nHuHP3ENklB7CwfsQ9ZsfpMT5EI4ODQhoFMZ1zdrSKagtnVu0JcyrLcGu\nwTU+jezHH7Xz0rt3hwULoFkz82YUQghRe2x6jP37778390varMJCmD4dPv+inCnzfuNcwHo+SP+Z\nQxWHSHJLIiAogHaebbnfsy1+DXrgdOZBKk5dx6lkT47s0yaJeecInDkDLVtCaOg/X5XLISHg6Fh9\nDfn58NRT8N138N570K+fxeILIYSwQVbbFW9PW+RVWbX2OBMWfE/TDus5N+EHluT60Me9D8MjhxPm\nFUYrj1bs2LrDuPvlUk6fhqNHtUZ/5Ig2Lv6//2nfp6dru/TPb/qVX8nJ2lSw/ftrl1Z1cTF/zgSd\njF3pIYceMoDksCV6yAD6yWEuFm3sX3zxBU888QRZWVnceeeddOzYkbVr11qyhBo7U3KGTcc2EX9w\nPSt3red0+Sm6D+hDXPfb6BP6GgEuATV+bRcXiIrSvi5UUgLHjmlNvrL5b9um/WswwEcfgfw8CyGE\nqCQzz1WjQlWQeCKR9UfWs/7Ien5O/5mWjaI5tqEvMQF9WTqnI+5uDlatUQghhD7Y9Bi7PUs7ncb3\nR79n/ZH1/HD0B5o1bkbf0L481H4KAVt6sun7pvzfIujb19qVCiGEEFWr05ucRaVFrPtrHZO/m0zk\nO5G0f689a/9aS+8Wvfll/C8cfOwgfcv/w1N33UkTx6b8/vvVNfULT4uxR3rIAPrIoYcMIDlsiR4y\ngH5ymEud2mKvUBXsPbnXuHt9Z9pOOjXvRN+WfVk6cCmdmncynm6WkwOjRsHWrbB8OfTqZeXihRBC\niCug+zH2jIIM4+71749+j1sjN/qG9qVvy77EhMTg3PDiudO//BIeewwGDYLZs6FpU7OUIoQQQlRJ\nLtLszzEAAAxfSURBVNt6Fe77v/swGAz0bdmXPqF9CHELqfaxWVna6WO//AJLlkCPHmYpQQghhLgk\nc/Y93Y+xfzb4M1bfv5oHr3/wkk199Wpo1047Z3zPHvM0dT2M++ghA+gjhx4ygOSwJXrIAPrJYS51\naoy9KidParvd9+/XJoW58UZrVySEEELUnO53xVdHKVi5EiZNgjFjYNYsaNSoVt9SCCGEqJKcx36N\nMjLg4Ye12dvi47WLtwghhBB6oPsx9vMppZ261qEDtG8Pv/5au01dD+M+esgA+sihhwwgOWyJHjKA\nfnKYS53ZYk9NhfHjtYuqfPcddOxo7YqEEEII89P9GLtSsHixdnnVCRPgmWegQQOzvLQQQghhFjLG\nfhVGjoQ//oANG7TT2YQQQgg90/0Y+7PPwo4d1mnqehj30UMG0EcOPWQAyWFL9JAB9JPDXHS/xR4e\nbu0KhBBCCMvR/Ri7EEIIYetkSlkhhBBCVEkaey3Sw7iPHjKAPnLoIQNIDluihwygnxzmIo1dCCGE\n0BEZYxdCCCGsTMbYhRBCCFElaey1SA/jPnrIAPrIoYcMIDlsiR4ygH5ymItFG/vUqVMJCwujQ4cO\n3HvvveTn51vy7S0uMTHR2iVcMz1kAH3k0EMGkBy2RA8ZQD85zMWijb1v377s37+fPXv20KZNG+bM\nmWPJt7e4vLw8a5dwzfSQAfSRQw8ZQHLYEj1kAP3kMBeLNvY+ffrg4KC9ZZcuXUhNTbXk2wshhBC6\nZ7Ux9iVLltCvXz9rvb1FJCcnW7uEa6aHDKCPHHrIAJLDlughA+gnh7mY/XS3Pn36cOLEiYtunz17\nNgMGDADg5ZdfZvfu3Xz++edVF2UwmLMkIYQQwuaZqx1b/Dz2ZcuWsWjRIn788UcaNWpkybcWQggh\ndM+iV3dbt24d8+bNY9OmTdLUhRBCiFpg0S321q1bU1JSgoeHBwA33ngj77zzjqXeXgghhNA9ix48\n9+eff7J161bc3NwoKSlh8+bNvPnmmwDk5OTQp08f2rRpQ9++fU1OX5gzZw6tW7embdu2rF+/3pIl\nX1Z5eTkdO3Y0Hj9gbzny8vK47777CAsLIzw8nJ07d9pdBtDqioiIoF27dgwfPpxz587ZfI6xY8fi\n4+NDu3btjLfVpOZff/2Vdu3a0bp1a5588kmLZoCqc1xqzgp7ylFp/vz5ODg4kJOTY7zNFnNUl2Hh\nwoWEhYURGRnJtGnTjLfbYgaoOseuXbu44YYb6NixI507d+bnn3823meLOY4fP84tt9xCREQEkZGR\n19TrrjqHsrCMjAz122+/KaWUKigoUG3atFEHDhxQU6dOVa+88opSSqm5c+eqadOmKaWU2r9/v+rQ\noYMqKSlRSUlJKjQ0VJWXl1u67GrNnz9fDR8+XA0YMEAppewux6hRo9TixYuVUkqVlpaqvLw8u8uQ\nlJSkWrRooYqLi5VSSg0ePFgtW7bM5nNs3rxZ7d69W0VGRhpvu5qaKyoqlFJKde7cWe3cuVMppdQd\nd9yh1q5da/Uc69evN36m06ZNs9scSimVkpKibrvtNhUSEqKys7NtOkdVGTZs2KBuvfVWVVJSopRS\n6tSpUzadobocPXv2VOvWrVNKKfXtt9+qmJgYm85hjl5X0xwWP93N19eXqKgoAJo2bUpYWBhpaWl8\n9dVXjB49GoDRo0fz5ZdfArBmzRqGDRuGo6MjISEhtGrVil27dlm67Cqlpqby7bff8sADDxiPZrSn\nHPn5+WzZsoWxY8cCUL9+fVxdXe0qA4CLiwuOjo4UFRVRVlZGUVERfn5+Np+jR48euLu7m9x2NTXv\n3LmTjIwMCgoKuOGGGwAYNWqU8TnWzFHdnBX2lgNg8uTJvPrqqya32WqOqjK8++67TJ8+HUdHRwC8\nvLxsOkN1OZo3b27c85OXl4e/v79N5zBHr6tpDqvOFZ+cnMxvv/1Gly5dOHnyJD4+PgD4+Phw8uRJ\nANLT0wkICDA+JyAggLS0NKvUe6FJkyYxb9484x8wwK5yJCUl4eXlxZgxY+jUqRMPPvggZ86csasM\nAB4eHkyZMoWgoCD8/Pxwc3OjT58+dpcDrv7n58Lb/f39bSZLpfPnrLC3HGvWrCEgIID27dub3G5P\nOf788082b95M165diYmJ4ZdffgHsKwPA3Llzjb/nU6dONc5cag85rqXX1SSH1Rp7YWEhgwYN4j//\n+Q/Ozs4m9xkMhkuey24L57nHx8fj7e1Nx44dqz330NZzlJWVsXv3bh599FF2795NkyZNmDt3rslj\nbD0DwJEjR3jjjTdITk4mPT2dwsJCPv74Y5PH2EOOC12uZnvw8ssv06BBA4YPH27tUq5aUVERs2fP\n5vnnnzfeVt3vui0rKysjNzeXHTt2MG/ePAYPHmztkmpk3LhxvPnmm6SkpLBgwQLjnkZbdy29rqas\n0thLS0sZNGgQsbGx3H333YD2P5fKiW0yMjLw9vYGtP+dHD9+3Pjc1NRU4y4Ya9q2bRtfffUVLVq0\nYNiwYWzYsIHY2Fi7yhEQEEBAQACdO3cG4L777mP37t34+v5/e/cX0lQbxwH8q/nvSkS9eNUZLBNx\njp2jWxKKFWp0Y8FEVMjtMhJUBJkXCnWV1k0gCXZTRjQIvBAM2o20YYED/19EeGEO8WZYU0RLhfbr\nwreDvtqLmn921vdzNQ6eh+frOPvxsN+e5x/dZACA8fFxlJSUIC0tDXFxcaiursbo6KjucgCHew4M\nBgOysrJ2bc0cSVlevHiBt2/fwu12a9f0lGNubg6BQACKosBoNGJxcRFWqxXBYFBXOQwGA6qrqwEA\nly5dQmxsLL58+aKrDMB285zdbgew/Vn16+uzSM7xp7XuyDlOpGvgf4TDYXE4HNLa2rrrusvlkocP\nH4qISHd3956Ggs3NTfn8+bNcuHBBayiIFD6fT6qqqkREfznKyspkdnZWRETu378vLpdLdxmmp6el\noKBAvn37JuFwWJxOp/T29uoix/z8/J7mucPOubi4WPx+v4TD4TNpdNovh8fjEZPJJEtLS7v+Tm85\ndtqveS4Sc/w3w9OnT+XevXsiIjI7OyvZ2dkRn2G/HIWFheLz+UREZHh4WGw2W0TnOM5ad9gcp17Y\n379/LzExMaIoiqiqKqqqisfjka9fv0pFRYXk5ubK9evXZXl5WbvnwYMHkpOTI3l5eVpXZCTx+Xxa\nV7zeckxPT4vNZhOLxSJ2u11WVlZ0l0FE5NGjR2IymcRsNovT6ZStra2Iz1FfXy8ZGRkSHx8vBoNB\nnj9/fqQ5j4+Pi9lslpycHGlubj7zHM+ePZOLFy/K+fPntWe8sbFRNzkSEhK092Mno9GoFXaRyMyx\nX4atrS1paGgQs9ksRUVF4vV6IzrDzhw7n42xsTEpLi4WRVHk8uXLMjk5GdE5jrPWHTbHqW8pS0RE\nRCfnTLviiYiI6HixsBMREUURFnYiIqIowsJOREQURVjYif4yjx8/RkFBARRFQWVlJRYWFs56SkR0\njFjYif4yRUVFmJiYwMzMDGpqatDe3n7WUyKiY8TCThQFXr58CUVRoKoqnE4ngO39qcvLy7WV+a9d\nra5du4akpCQAuw9oOciYwWAQdrsdqqpCVVX4/X4EAgHk5+fjzp07MJvNuHHjBjY2Nk4hNRHth79j\nJ9K5jx8/atvopqamYmVlBSkpKbh58yZqa2vhcDjQ39+PoaEhDA4O7rq3qakJmZmZ6OjoONCYdXV1\nKC0tRUtLC8LhMNbW1hAKhZCbm4uJiQlYLBbU1dXh1q1buH379mn+G4joX1yxE+ncu3fvUFtbi9TU\nVABASkoKAMDv92uHrzQ0NODDhw+77nv16hUmJyfhcrkOPKbX60VjYyMAIDY2FsnJyQAAo9GonYBm\ntVoRCASOOSURHVTcWU+AiP5MTEzMb08d+9314eFhdHV1YWRkRDun+0/GTExM1F6fO3cO379/P8jU\niegEcMVOpHPl5eUYGBhAKBQCACwvLwMASkpK8Pr1awCA2+3GlStXAABTU1O4e/cu3rx5g/T09EON\nWVFRgb6+PgDAjx8/sLq6enLBiOhIWNiJdM5kMqGzsxNXr16Fqqpoa2sDADx58gT9/f1QFAVutxs9\nPT0AgPb2dqyvr6OmpgaFhYXacZIHGbOnpwderxcWiwU2mw2fPn0CsPc8e72fI0+kZ2yeIyIiiiJc\nsRMREUURFnYiIqIowsJOREQURVjYiYiIoggLOxERURRhYSciIooiPwHg19g50DsBZwAAAABJRU5E\nrkJggg==\n" } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Deep ocean temperature in the DP closed type is more sensitive!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The file names (and therefore experiment names) used contain sufficient information to reconstruct the co2 values used in those runs. In some situations, we may not have access the configuration files used, and file names is all we can go by. Spacegrids contains several regular expression based methods (of the project class) that allow us to do this. First, the following regular expression extracts the co2 value from the experiment (file) names: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "regexp = '[\\w_]+_(\\d+)ppm[\\w_]+'" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function ```sg.parse_fname_func``` takes this regular expression, and the intended parameter name, to use it to yield another function that extracts the parameter from the experiment (file) name using the regexp. This is similar to the file reading function discussed above. The resulting function is passed an ```exper``` object, and outputs a list of (name, value) pairs. Such functions can be passed to P.insert to be processed, where for each experiment in the project, the function is executed, and the resulting (name, value) pairs are inserted into the ```vars``` or ```params``` dictionaries of that experiment: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "P.insert(sg.parse_fname_func(regexp,parname='co2'))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This yields the following (unordered) list of co2 values, this time extracted from the experiment names (their filenames), without reading the configuration files:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "[E.params['co2'] for E in P.expers.values() if 'DP' in E.name ]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 16, "text": [ "[1750.0, 1250.0, 2000.0, 750.0, 1000.0, 500.0, 390.0, 1500.0, None]" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The 280ppm value is absent (in fact, it corresponds to the None entry). This is because this value is not encoded in the 280 ppm DP experiment name ```DPclsd_C_flat```. This can be fixed by specifying the nomatch_fill argument: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "P.insert(sg.parse_fname_func(regexp,parname='co2', nomatch_fill = '280ppm'))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "[E.params['co2'] for E in P.expers.values() if 'DP' in E.name ]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 18, "text": [ "[1750.0, 1250.0, 2000.0, 750.0, 1000.0, 500.0, 390.0, 1500.0, '280ppm']" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "These co2 parameters can again be used to construct ```big_field_DP```:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "big_field_DP = P.param2gr('co2' , lambda x:x['temp'], name_filter = 'DP*') " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have created the same big field again as before, but now we have constructed it by using the information contained in the file naming:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "h1, = sg.plot(bigfield_DP[Z,17:]/(X*Y*Z) + sg.zero_kelvin)\n", "lbl = plt.ylabel('C')\n", "lbl = plt.xlabel('co2 ccn')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n" } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A shorthand for this regexp-based procedure is contained in the ```pattern2gr``` method:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "bigfield_DP=P.pattern2gr(fld_name = 'temp',pattern = regexp,parname='co2', name_filter = 'DP*', nomatch_fill = 280.)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "bigfield_DP.gr[0][:]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 22, "text": [ "array([ 280., 390., 500., 750., 1000., 1250., 1500., 1750.,\n", " 2000.])" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }