{ "cells": [ { "cell_type": "markdown", "id": "a40f587a-5f27-4a0b-9265-f82891136053", "metadata": {}, "source": [ "Computations in single precision\n", "================================\n", "\n", "```{versionadded} 3.2.0\n", "\n", "```\n", "\n", "In previous tutorials we saw how heyoka.py, in addition to the standard [double precision](https://en.wikipedia.org/wiki/Double-precision_floating-point_format), also supports computations in [extended precision](./ext_precision.ipynb) and [arbitrary precision](./arbitrary_precision.ipynb). Starting with version 3.2.0, heyoka.py supports also computations in [single precision](https://en.wikipedia.org/wiki/Single-precision_floating-point_format).\n", "\n", "Single-precision computations can lead to substantial performance benefits when high accuracy is not required. In particular, single-precision [batch mode](<./Batch mode overview.ipynb>) can use a SIMD width twice larger than double precision, leading to an increase by a factor of 2 of the computational throughput. In scalar computations, the use of single precision reduces by half the memory usage with respect to double precision, which can help alleviating performance issues in large ODE systems. This can be particularly noticeable in applications such as [neural ODEs](./NeuralODEs_I.ipynb).\n", "\n", "In NumPy, single-precision values are represented via the {py:class}`numpy.single` data type. Correspondingly, and similarly to what explained in the [extended precision](./ext_precision.ipynb) and [arbitrary precision](./arbitrary_precision.ipynb) tutorials, single-precision computations are activated by passing the ``fp_type=numpy.single`` keyword argument to functions and classes in the heyoka.py API.\n", "\n", "The pendulum example\n", "--------------------\n", "\n", "Let us begin as usual with the definition of the dynamical equations:" ] }, { "cell_type": "code", "execution_count": 1, "id": "06c750ea-7b3d-4c2d-b466-a4f6f0d6872b", "metadata": {}, "outputs": [], "source": [ "import heyoka as hy\n", "\n", "# Pendulum dynamics.\n", "dyn = hy.model.pendulum()\n", "\n", "# Pendulum energy.\n", "en = hy.model.pendulum_energy()" ] }, { "cell_type": "markdown", "id": "a4f721f1-67fc-430c-adb9-0b46f2283c43", "metadata": {}, "source": [ "Next, we are going to create an integrator object in single precision:" ] }, { "cell_type": "code", "execution_count": 2, "id": "a25efc97-228a-4e90-8a82-c49cd901fecf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2024-02-12 08:04:03.202] [heyoka] [info] heyoka logger initialised\n" ] } ], "source": [ "import numpy as np\n", "\n", "ta = hy.taylor_adaptive(dyn,\n", " # Initial conditions in single precision.\n", " np.array([-1, 0], dtype=np.single),\n", " # Specify that the integrator must operate\n", " # in single precision.\n", " fp_type=np.single)" ] }, { "cell_type": "markdown", "id": "5429fb12-6166-4939-b628-b687ee40da1f", "metadata": {}, "source": [ "As usual, the default integration tolerance is the epsilon of the floating-point type in use. This can be confirmed by examining the screen output of the ``ta`` object:" ] }, { "cell_type": "code", "execution_count": 3, "id": "9ead626e-0fd7-4fbb-9caf-4a2792becd46", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "C++ datatype : float\n", "Tolerance : 1.1920929e-07\n", "High accuracy : false\n", "Compact mode : false\n", "Taylor order : 9\n", "Dimension : 2\n", "Time : 0\n", "State : [-1, 0]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ta" ] }, { "cell_type": "markdown", "id": "d2af4d02-5000-421b-b631-791d20cf0118", "metadata": {}, "source": [ "Next, we are going to create a [compiled function](./compiled_functions.ipynb) for the computation of the energy of the system:" ] }, { "cell_type": "code", "execution_count": 4, "id": "13aa5304-16f1-4000-9c16-23449852c175", "metadata": {}, "outputs": [], "source": [ "x, v = hy.make_vars(\"x\", \"v\")\n", "\n", "cf_en = hy.cfunc([en], fp_type=np.single,\n", " vars=[x, v])" ] }, { "cell_type": "markdown", "id": "3b545b87-48c3-4052-a491-14eca295936f", "metadata": {}, "source": [ "Note how we passed the ``fp_type=numpy.single`` argument to indicate that the compiled function should operate in single precision.\n", "\n", "Let us compute and store the energy of the system:" ] }, { "cell_type": "code", "execution_count": 5, "id": "3462b1c4-658b-43f7-a59a-9836db8ac79e", "metadata": {}, "outputs": [], "source": [ "orig_en = cf_en(ta.state)[0]" ] }, { "cell_type": "markdown", "id": "2663e5fc-6b17-45d1-8b44-6df273c3f81b", "metadata": {}, "source": [ "We proceed now with a numerical integration over a time grid, up to $t=300$:" ] }, { "cell_type": "code", "execution_count": 6, "id": "e2d3b4c0-e8a2-4706-a169-4680ee4b25e7", "metadata": {}, "outputs": [], "source": [ "# Create a time grid in single precision.\n", "t_grid = np.linspace(0, 300, 100, dtype=np.single)\n", "out = ta.propagate_grid(t_grid)[-1]" ] }, { "cell_type": "markdown", "id": "04b544f1-b171-4549-af23-fb8d6e8c74ac", "metadata": {}, "source": [ "Again, note how we created the time grid in single precision.\n", "\n", "We can now proceed with the computation and the visualisation of the energy error:" ] }, { "cell_type": "code", "execution_count": 7, "id": "1eb4b6ce-be94-4820-b167-1752a05e5450", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr4AAAINCAYAAADY2XyuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACHlElEQVR4nO3deZwjdZ0//lfl7O70fXfPxQwDzAwMwzGDAnLJyuEiuOyuuOuBsvpbdHS9/arsCuoqPtRlXdfxWGHx+PlVfq6AuosgrtyIDscIQzMXMzBHd0/fV9I5q35/JJ9KJakkVUlVUklez8djHjDd6aQmneTzrne9P++3pCiKAiIiIiKiOueq9gEQEREREVUCA18iIiIiaggMfImIiIioITDwJSIiIqKGwMCXiIiIiBoCA18iIiIiaggMfImIiIioITDwJSIiIqKG4Kn2ATidLMsYHR1FW1sbJEmq9uEQERERURZFUbC4uIjh4WG4XPnzugx8ixgdHcWqVauqfRhEREREVMSRI0ewcuXKvN9n4FtEW1sbgOQT2d7eXuWjISIiIqJsCwsLWLVqlRq35cPAtwhR3tDe3s7Al4iIiMjBipWlcnMbERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNgYEvERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNgYEvERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNgYEvERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNgYEvERE5Uiwh49nDs5BlpdqHQkR1goEvERE50q337cG133oS//XM0WofChHVCQa+RETkOKFoHP/f00cAAE++PFXloyGiesHAl4iIHOe+F8axFIkDAF4aW6zy0RBRvWDgS0REjvP/7Tyi/v/Lk0sIxxJVPBoiqhcMfImIyFFenlzCH1+ZgUsCWnxuxGUFByaWqn1YRFQHGPgSEZGjiNrei07uw5aVnQCAkbGFKh4REdULBr5EROQYsYSMnz9zDABw3bbV2DjUDgB4iYEvEVnAU+0DICIiEh7aM4GppQh6W324dGO/ZoMbA18iKh8zvkRE5BiizOHas1bC63Zh41AbAGBkdAGKwkEWRFQeBr5EROQIxxfCeGjvJADgLVtXAQDW97fC45KwEI5jdD5czcMjojrAwJeIiBzhv545ioSs4Ow1XVjf3woA8Hvc6v+/NMpyByIqDwNfIiKqOkVR8LNUmcN1qWyvsCm1wY2dHYioXAx8iYio6v5waAavTIcQ8Lnx56cPZXyPnR2IyCoMfImIqOrEpLY3bRlGwJ/ZcIiBLxFZhe3MiIjIciOjC/jRU68iIcuGbn/f7jEAwFu2rcr5nujs8OpMCEuROFr9XLqIqDT89CAiIsv9470v4NnDc6Z+5pSBNpy5qjPn6z2tfgy0+3F8IYK94ws4e023NQdJRA2HgS8REVnq8HQIzx6eg0sCPvJnJ8Ptlor+jEuScNmmAUiS/m03DrXj+MIkRsYWGfgSUckY+BIRkaV+sSs5cvj89b344KUnWXKfG4fa8fDeSdb5ElFZuLmNiIgsoygK7k0FvldvGbbsftWWZuzlS0RlYOBLRESWGRlbwMuTQfg8Llx+2qBl9ys6O+wdX0RC5uhiIioNA18iIrLML3aNAgD+bGM/2pu8lt3v2t4AmrwuLMcSeHU6aNn9ElFjYeBLRESWkGUFv0wFvldvWWHpfbtdEk4ZFP18Fy29byJqHAx8iYjIEn84NIPxhTDamjy4ZEOf5fe/KdXPd2Rs3vL7JqLGwMCXiIgs8cs/JTe1vfG0Ifg9bsvvPz3BjRlfIioNA18iIipbJJ7A/zyfnL52zZnWdXPQ4uhiIioXA18iIirbI3snsRCOY6Ddj9es7bHlMTYMJksdxubDmA1GbXkMIqpvDHyJiKhsv1A3tQ3D7So+qa0UbU1erO5uAcCsLxGVhoEvERGVZTEcw29fOg4AuOYMa7s5ZNuobnBj4EtE5jHwJSKisjzw4nFE4jLW9QVw6nC7rY+1aagDADe4EVFpGPgSEVFZfpEaUfzmM1ZAkuwpcxCY8SWicniqfQBEROQsr0wFsevIHK45Y7hoIDuxGMYTB6YAJOt77SY6OxyYWMRtD+7L+J4E4M82DmDzyg7bj4OIahMDXyIiynDTvS/giQPTcLmkosHs/bvHISvAllWdOKE3YPuxrexqRleLF7OhGL7xv/tzvn/XziN48lOvh8umDXZEVNsY+BIRUYYXR5NlBPc9P2Yo8AWAqzYP2X5cACBJEr7xN2fiwZHjOd/7+TNHMb4QxnNH5nD2mq6KHA8R1RYGvkREpJoJRjEXigEAHt43geVoAs0+/SlsM8Eo/nBoBgBw+amDFTvGC07qwwUn5Y5Enl+O4Re7RvHAi+MMfIlIFze3ERGR6tDUkvr/4ZiMR/ZN5r3tb186joSsYNNQO1b3tFTi8Aq6IhV83797HIqiVPloiMiJGPgSEZHq5clgxt8feHE8720fSJU5XHFa5bK9hVx0Sh/8HhcOz4TY7oyIdDHwJSIi1cFU4Cu6J/zvS8cRjcs5t1uKxPHY/mQ3h0qWORTS4vPgwpOTJRCFAnYialwMfImISCVKHf7q7JXobfVjIRzHUwenc2730J4JRBMy1vYGcPJAa6UPMy9R7sDAl4j0MPAlIiKVyPiu72/FZacOAADu1wkixdcuP3XQ9qEVZly6sR8el4Q944s4NBUs/gNE1FAY+BIREQAgISt4dToEAFjXG1Czp795MbmJTQjHEnh4zwQA59T3Cp0tPpx7Yg8AZn2JKBcDXyIiAgAcm11GNCHD53FhuLMZr13Xg7YmD6aWInj28Kx6uycOTCEYTWCoowmnr3DelLTLNd0diIi0GPgSEREA4OVUfe/angDcLgk+jwt/tjFZ7vCAJogUAeXlpw46ckLaZZsGIEnAriNzGJ8PV/twiMhBGPgSEREA4FCqvnetZvSwmj19MdkbN56Q8eBLxzO+5zT97U04a3VygMVvRpj1JaI0Br5ERAQAOJjK+K7rSwe+F53chyavC0dnl/Hi6AL+eGgGc6EYugM+bDvBudPRrmC5AxHpYOBLREQA0h0d1vWl25M1+9y4+OR+AMnNYqKbwxs2DsDjdu4SIrLRfzg0g5lgtMpHQ0RO4dxPLSIiqijR/ktb6gCkOzf8eve42inh8tMGKntwJq3uacGmoXYkZAW/TZVmEBEx8CUiIoSicYylNoKd2JcZ+F6yIdkb98DEEo4vRNDq9+C8E3urcZimiID9AZY7EFEKA18iIlLLHLoDPnS2+DK+19HsxXnr04HuJRv60eR1V/T4SiEC38cOTGEpEq/y0RCREzDwJSKqsJfGFvDpu1/A8QXntNrKV+YgXKHp4HCFQ7s5ZDupvxVrewOIxmU8vHei6O0VRcGOhw7gnueOlvW4dz5xCD966tWy7oOI7MHAl4iowu54/BB+8sfDuOe5Y9U+FJW6sS1P4PuGTQNo8rrQ1uTBxaf0VfLQSiZJkjp2+cGR4nW+zx6exVcf2ItP/Ox5LIZjJT3mwcklfO5XI/ine3djdG65pPsgIvsw8CUiqrCJxQgAYDbknG4Dh9RWZq263+9r8+Pe7efjnvefh4DfU8lDK8vrT0l2pHh032TG2GU9D++dBADEZQVPHJgu6fHEfQDAI/smC9ySiKqBgS8RUYXNBJOB71LYOXWnB4uUOgDAhsF2rO9vq9QhWeKsNV1oa/JgNhTD80fnCt72IU05hJHSiGL38dCe0u6DiOzDwJeIqMKml5KZ3kWHBL6KoqilDtkdHWqd1+3CBSclN+Zps7HZJhbD2H1sQf37w3snoSiFM8TZlqMJ/OHQjPr3Jw5MIRqXTR4xEdmJgS8RUQUpioLpoAh8S6sjtdrkUgRLkThcUrL/bb0RAzgeLlB68Oi+KQDAyQOt8HtcGF8IY+/xRVOP8/uDyUB3uKMJva0+BKMJPP3qTPEfJKKKYeBLRFRBwWhCzQI6pcWWyPau7GqB3+P8NmVmXZTajPf80TlML0V0byNKGy4/dRDnntiT+pq5Gl1x+4s39OPCk5OP+YjJ+yAiezHwJSKqIG3g5ZRSh/So4voqcxAG2puwcagdigI8uj83EI0nZDy2P5nxvfiUPlycClrN1PkqipIOfE/uw8WpTXUPlVgrTET2YOBLRFRBoswBcE7gKzo6FNrYVusuOUUEs7mB764jc5hfjqGj2YszVnWpQevTr8waLkc5OBXE4ZkQvG4J56/vxYUn9cIlAfuOL7GtGZGDMPAlIqqgmSVt4OuMGt90xle/lVk9uLhAWzMRDF94ch/cLgkn9AawtjeQams2Zej+xX2cs7YbAb8HnS0+nLm6K+N7RFR9DHyJiCpoRpPxXYrETXcOsINoZXZiHWd8z1rdqbY1+1NWW7OH9yXLEUSJAwBcdHL+DLEeURYhNtJp76/U1mhEZD0GvkREFTQVTNf4ykpys1s1xRIyDs+EAABr67TGFwA8edqaaduYXagJfC/WlEYUOznRtjHTTrUTWWa2NSNyDga+REQVpC11AKo/xOLwTAgJWUGLz43B9qaqHovdRDb2EU0GVrQx27yiA31tfvXrr13XY7itmWhjtqKzGev70+Uipw63p9uavcK2ZkROwMCXiKiCtKUOQPXrfEV979reACRJquqx2E1ta3ZsHlOp7hqi64I2UwsATV632tbsoT2Fyx3E9y8+pS/jOXS5JFxkoIcwEVUOA18iogqaygp8F6qc8W2Ejg7CQHsTNom2Zvsmk23M9omgtT/n9pekvlaoRldRlHSNsM59pEsmWOdL5AQMfImIKmgmmDlAodpDLBqho4OWtnZ315E5LITj6Gzx4oxVnXlv+8yr+duaHZwK4sjMMnxuF85LZYi1LtC0NTvGtmZEVcfAl4iogkSNb5M3+fFb9VKHVEeHdQ2Q8QU0bc32T+J3e5JZ2AtOSrYxy7amp3hbs+w2Ztky25ox60tUbQx8iYgqRFEUdYDFCT3JQLPaQyzqfWpbNtHWbC4Uw4+eehVAZhuzbMXamj2cp0ZY62KTrdGIyD4MfImIKiQYTSCSamu1pqcFQHW7OiyEY+omr0ao8QWSbc0uPCkZiIqTjosKBK2XbBB1vrltzULROP5wMLeNWb77eJJtzYiqjoEvEVGFaMsc+tuSrcOqWepwKJXt7Wvzo63JW7XjqDRtoHv6yg70tvrz3vY1a7vR5E22NdszntnW7PcvTyOakLGyqxknFqiR3jTUjt5WP9uaETlAbkESERHl9fDeCfz4D4fxxb84TQ1ejZpObWzrCfjR1pT8+K1EV4eErOBTP38e+7L60c4vJ4PuRqnvFbSlDYXKHIBUW7N1PXho7yT+/kfPoKslfYJwfCH5+8xuY5Yt2dasDz9/9ige2juB89b3lvkvqA9f/vUeuCTgk1dsqPahUANh4EtEZML3HjuIJw5M44KTevHOc08w9bPTqYxvd8CnZlgr0dXhj4dm8LNnjub9vth81Sj625vw2nXdePqVWVxx2lDR21+5eQgP7Z3E4ZkQDuskbN9o4D4uOiUZ+D5+YLqUQ64700sRfOeRlwEA771gHboCviofETWKhgh8Dx06hBtuuAHHjx+H2+3GU089hUCgsTIcRGSN0bkwAJTUmkoMr+hp9aE1lfGtRKnD7w8mg63Xre/Fu88/IeN7fo8b29Y2VuALAN99x1ZML0UMtXH7q7NW4oSegO7vqqfVr9sKLdu565Ktzl4aW8BsMNrwgZ54HwHA6Pxywz8fVDkNEfi+613vwj//8z/jggsuwMzMDPz+/PVcRET5KIqiBrzahdso0dGhO+BDuxr42p/xfSoV+L5x8xAu3Thg++PVgo5mLzqajdU1u1wSzlnbXdbj9bX5cVJ/K/ZPLOEPh2ZwxWmDZd1frdOeOI7OhXHqcEcVj4YaSd1vbnvxxRfh9XpxwQUXAAC6u7vh8TREvE9EFpsORtVd+aMlZXxFja9PrfG1u9QhHEtg1+E5AFBH8FJ1vDaV9RUnIo1sNCPw5WAPqpyqB76PPvoo3vSmN2F4eBiSJOHee+/Nuc23vvUtrF27Fk1NTTj77LPx2GOPGb7//fv3o7W1FVdffTXOOussfOlLX7Lw6ImokZS7WKdrfP1o9SezjXZnfJ99dRbRhIyBdj9OSLVQo+oQJx4MfBn4UvVUPfUZDAaxZcsWvPvd78Zf/uVf5nz/rrvuwoc//GF861vfwvnnn4/vfve7uPLKKzEyMoLVq1cDAM4++2xEIpGcn/3Nb36DWCyGxx57DLt27UJ/fz+uuOIKbNu2DW94wxt0jycSiWTc18LCgkX/UiKqddoF+vhCGLGEDK/beP5gWlPj21ahGl9R33vuup6CnQfIfq9JlUvsGV/E9FIEPQXaqNW70fn0e4mjnKmSqh74Xnnllbjyyivzfv+2227D3/3d3+E973kPAODrX/86HnjgAXz729/GrbfeCgB45pln8v78ypUrsW3bNqxatQoA8MY3vhG7du3KG/jeeuut+NznPlfqP4eI6tgxTV2vrCSD35VdxrOo6ua2gDbwtTfjK7KL4jI7VU9Pqx+nDLRh7/FF/PHQDK7cXLwbRL3SvpeY8aVKqnqpQyHRaBTPPPMMLrvssoyvX3bZZXjyyScN3ce2bdtw/PhxzM7OQpZlPProo9i4cWPe23/605/G/Py8+ufIkSNl/RuIqH5kL9BmN7jNaDa3taVKHSJx2bZpXsvRBHYdmQPA+l6nEL+H3zd4ucNo1uY2okpxdOA7NTWFRCKBgYHMXcgDAwMYHx83dB8ejwdf+tKXcOGFF+L000/HSSedhKuuuirv7f1+P9rb2zP+EBEBeoGv8UyVoijqeODeVr/azgywr9zhmVdnEUsoGO5owupu1vc6wWvXJcsdGrnONxJPYHIxXVJ4fDFZNkRUCVUvdTAiuy5NURRTtWrFyimIiIwQgW5HsxfzyzFTtYmhaAKRVGa3O+CD2yUh4HMjGE1gKRK3pd7z9wenACTLHFjf6wyvWZvM+O47voSppUjBccn1anw+meFt8rogK0A0LmN8PoxVPDmjCnB0xre3txdutzsnuzsxMZGTBSYispuoS9y6JjnwwUzGV5Q5+D0utPjcAKAZYmFPne/vX07V97LMwTG6Aj5sGGwD0LhZX3HCONzZjOGO5Nhv1vlSpTg68PX5fDj77LPx4IMPZnz9wQcfxHnnnVeloyKiRhSOJdRSha0nJC9Xm1msxc/2BHxq9lWMLV6wodQhGInj+aPzANJTw8gZGr2tmajpXdHZjOHO5uTX5hn4UmVUvdRhaWkJBw4cUP9+6NAh7Nq1C93d3Vi9ejU++tGP4h3veAe2bt2Kc889F//xH/+Bw4cP48Ybb6ziURNRoxGXZ5u9bmwaTtb+m9mUkx5XnL60rQ6xsCHj+/Srs4jLClZ0NvMSssO8dl0P7nziFTUj32jECeNwRzMSipL6Gje4UWVUPfB9+umncckll6h//+hHPwoAuP766/H9738f1113Haanp/H5z38eY2NjOO2003DfffdhzZo11TpkImpA6mLd2YQVIktlIuOrHVcstPrtK3VgGzPnes3abkgS8PJkEBOLYfS3NVX7kCpqVFPqIAJf9vKlSql64HvxxRdDSb3w83n/+9+P97///RU6IiKiXBl1iZ3JQGUxEsdCOIb2VMlCIdoevoL4OTu6OohsItuYOU9niw8bB9sxMraApw7O4Ootw9U+pIo6pjmJlNWMLwNfqgxH1/gSETmFti6xxedBV4s39XVjC/Z0qsZXm/FVSx0i1mZ8lyJxvHAsWd8r2meRszRyna94z2TU+DLwpQph4EtEZID28qz2v4YDX50aX7tKHXa+MoOErGBVd7OpyXJUOWLD4VMNVuerKIp6EjmsCXyPzS4XvfpLZAUGvkREBohd59mB7zGDm3L0Sh3SXR2sDXxFFpHdHJxr29puuCTg4FQQxxcaZ2PXXCiG5VgCADDY0YThjuT7KBhNWP4+INLDwJeIyABtXSIA0xvcppdyN7fZVeogsojc2OZcHc1enDrcAaCxyh3E+6i31Y8mrxvNPrf6nmC5A1UCA18ioiKSl2fTdYlAOgA2uliLjG93q6argzrAwrrNbQvhmFrfy41tzibqrxuprVn6fZTuZGH2vURUDga+RERFzIZiCMeS44YHU5OmzNf4Jje39QbSNb7tNkxue/qVGcgKcEJPC4ZSl5HJmRpxg1t2rTwAtdyBgS9VQtXbmRFR/UjIycxoJQcmTC5G0Or3oDk1BtgOYkHua/PD70k+TjrwLV6fGYrG1cBZm/EVNb5WDrD4PcscasbWE5J1vq9MhzA2v2zoROXITAiTqQ4hWm1+D9b3t6pTAc1SFAVj82EMdTSVfB9GjM6nN7YJZuvlicrBwJeILPP13+7Dv//uAL79trNw5eYh2x9vJhjFhV95CCcPtuEX28+37XGO6WSpRMnD+EIY8YQMjzv/BTRR3+vzuBDQBOjprg7WlTo8dXAGAMscakF7kxebV3TgT0fn8dTBafzFmSsL3v6lsQW88RuPIV/zg3+9bkvR+8jn7meP4WM/+xM+d/WpuP68E0q6DyMKvZeY8aVKYKkDEVnmd3smAECtMbXb/uOLWI4lsPvYPBKyfa2Q9OoS+1r98LolJGQFE4u5GTgt0cqsN+DLyKa1WVzqsBxNYGRsAUAym0jOty31e3r21bmit31k3yQUJXnCtKq7Wf0jSmaeP1r6++7+F8eT/909XvJ9GKFf48vAlyqHGd88duzYgR07diCRSFT7UIhqQigax57xRQAoGghaRTxOQlYwE4yir81f5CdKo9Ylai5Fu1wSBjuacGRmGaNzyxkZrGwzqfpebZkDoCl1iMYhywpcrvIuMb+QOgEYaPdjuKOxxuDWqjNXdwE4hOeOzBa97XOHk7f5h0vX4/+58ET163c+cQif+9VIye87RVHw3OE5AMCfjs4hIStwl/lazEe3xpeb26iCmPHNY/v27RgZGcHOnTurfShENeGFo+msa6X6kmofx87H1Dbc1xKB8LEiC/aU2sosMzAXGV9FAYLR8rO+IjA6c1WXrXWaZJ0zV3cCAF4aW8RyNH+iRVEUPJsKTpPBclp/WzJwnCjxPXB0dhlTqbrhUDSBfccXS7qfYqJxWQ3OC5UNEdmJgS8RWeK5I3Pq/08sVDbjm/x/+wJfvbpEQFubWPix9YZXAIDf44LXnQxQrSh3eE4NjDrLvi+qjKGOJgy0+5GQFewezV+qMDofxuRiBB6XhNNS/X+FgfbkCdXxEt932vcukH4dWe34QhiKkqx1174XelNlQ7ICHK/Q1SJqXAx8icgSItsI2BuEamkzXHYG29k9fAWjtYn5Al9JktLlDmUOsUhmBFMZ36yMIDmXJEk4c1Xy96V9D2UT39s41J7TwUTN+C6GSxr7uysV6Iryhl0Gyi5KcUzzPtJekXC5JLWjBcsdyG4MfImobNrLsECy720kbn99vDbDVWq2q5hIPKG5PJtZN2s08FWntmXV+ALWdXYYmw9jYjECt0vC5hUdxX+AHENk6AtlWncVyOb3pzK+4Zhc0thfUV/8xlQnFrsyvqNZ0w+1WOdLlcLAl4jKpr0MKy7dV6LcQZtZPm5Tlvn4fPLf4fe4MsYNA+nFuliNrxhekZ3xBdJ1vqUELFq7UperNw612drTmKwnMvSFAk5RjnDGqs6c7zV53ehoTl45MFvnG4kn8OKxZCeQd59/AgBg/8QS5peta7En6G0SFdK9fBn4kr0Y+BJR2bSXYQfaxWXXCgS+muDarkB7dF7/8qz4GmC81CF7cxuQDnzLHWKh3dhGtWXzig64XRLGF8IYm899LUXjstoiMF8ZS3+qo4nZ993I6AKiCRk9AR/OXNWJ1anhM88fnTN1P0boDa8QxHtpjEMsyGYMfImobNpNVWrga3Nnh1A0jkVNXaxddcV67ZeEodTXFsLxgqUKotShR7fUIZmpK3dzGze21a5mnxsbh9oA6Gd9XxpbQDQuo7PFixN69Kciived2e4m2teNJEmGyi5Kla9WHmAvX6ocBr5EVDZxmf3M1Z0lZ57Mys7w2pbxLVCX2Or3qJeYx+bzBxyFSh3am8qv8dVmBPUuhZPzFdrgls7md+ZtU1fq++459b3bpT5GvuMoV6GTSJY6UKUw8CWismRchl3VVXLmySxx/2IE8ORSxJbpbcfy9PAVii3YoWgc4ViyN2l2jTCgKXUoo6vDnvEFROIyOpq9WNsbKPl+qHoKZVqzg1M9/SVnfNNBtfYxnjsyV1KHiHwURcGx2fwnkSu4uY0qhIEvEZVFXIbtavFiTU+LusPcri4Lguj3uWGoHS4pOb1NZFatVChLBRRfsEWZg8/tUjs4aLVaMLY4+3I11R6RqX/h2Dyi8cwhDkbKWEQvXzNXPiYWwzg6uwxJAk5PPf7GoXb4PC7MhWJ4ZTpk+L6KWQjHEUwN6NAtG+owVjZEVC4GvkRUFpExOiN1GVbbU9ROooZ4qKMJPa3mF32jCtUlAsVrE9Uevq0+3aBU9PFdKGOx58a22re2N4COZi8icRl7xhfUr08tRXB4JgRJArYUKGMp5X0nWqSdMtCmnpT5PC61HZ6V5Q7i/dET8KHJm9t1JOD3oLOleNkQUbkY+BJRWbIvw5aSeSqFqGUcaG9KP6bFwbaiKEUzvsNFpreJLLRemQNgTVeH5zQ11lSb8m0sE8Hp+r5WtKdOkvSUMr0tX4u0dJ3vHKxS7H0EGB8BTlQOBr5EVJbsy7Ai82RXX11BZHwH2v3px7Q42F5YTl+eHerIrUsEitf4qsMr8gS+6QEWpQW+00sRvJq6JF0oI0jOp7fBTQyXKHZSo62tN1qbq14pyLrvM0QAbuEEt0KbRAV2dqBKYOBLRCXTuwwrMk9zNk9vE0Fuf1uTbVlmEcz2tupfngWK1/iKUofe1twevgDULN5ipLRSB9FRY31/q9phgmqTmvFN/U4B7Yll4TKWvlRXh0jc2PS2eELG80f1ewOLv780tojlqDXv4WKbRAFucKPKYOBLRCXTuwzb0eyFz5P8aLGz3EFklPu1GV+Ls8yGLs+mvjc+H9btKpEeXmFPqYMaGDHbW/PEyeOr0yFMp7qU/MlgGYvZ6W37ji8hFE2gze/B+r7WjO8NdzShv82PhKyoHVvKVaxWHiheNkRkBQa+RFQyvcuwyQ1u9vfyndRkfPttyviKqW16I1aF/rYmuF0S4rKCSZ1/71SxUocyuzqkfwfc2FbrOpq9WN+fDEJ3HZnD/olFBKMJBHxunNTfVvTnzbzvxOtmy6pOuFyZmy4z642tKXcwcxLJGl+yEwNfIipZvsuwdk9v005tG2j3Y8CmThLHDCzWbpeEwdS/V2/BnikwvAJId3UoJfBNZgTF5epO0z9PzqPdWCbeX6ev7ITbVbxNnZke2ruKtEgT7+ldmrKLcpgJfFnqQHZi4EtEJSl0GTa9w9yewFdkdlt8brT6PbYNzRhV6xLzb8gB0pdv9RbsdDsz/RpfUeoQTcima6IPTCxhKRJHi8+NkweKZwTJ+dIDJGbzbj7Lx0wP7WKdQKzs7BBPyBhfKP5eWlGkbIjICgx8iagkhS7DpnuK2lPqIALc/jZ/srQiteBPLUUtXTCN1CUC6cVcL/AtVuoQ8KWHWpjN+orAaIvBjCA5nwhE/3RkHs+8aq6MxWgv3/nlGA5MLAEAzsjT+3nzyg64XRLGF8IYmy8vA3t8MQJZSQ5x6Q3onwACyQ16ngJlQ0RWYOCbx44dO7Bp0yZs27at2odC5EgiE7RlVW7QZff0NjG1TYxp7Qn4bJneZuTyrPb7BTO+eQJft0squaWZkYleVFtOHmhDi8+NpUgcL08GAeT22c3HaHcTcaXmhJ6WvCdkLT4PNgwmT2jLzfqK98VQZ1NOPbGW2yVhsCN/2RCRFRj45rF9+3aMjIxg586d1T4UIkcqdBnW7ult6R6+ycfxuF2WT2+LJWQ1s2w48M2aOLUcTWA5lixf6G7VDzCAdLmD2VGt3NhWf9wuCVtWdqp/X9XdrLYqK8ZoyY/RFmlWbXBTTyALbBIVWOdLdmPgS0QlSbfRyl087Z7eJkoo+jUBgdXT244vhNXLs/mytUK+Gl+Rffa5XWjze3J+ThAZXzMtzRbCMexXL1d3Gv45cj7tyaSZMdRGuzoYHYqRHqgxZ/gY9BzTZHyLGe5gL1+yV/5PYqIadHwhjIXl3KxZZ4vPcNZkPhRDe7MHksSayXzmlzVBl87iqWaeigShy9EEvG4JHre5c/Djmqlt6mO2NWE3FgqWV8QTMqIJGS2+4h99YmNbscuzQDpLdXR2GfuPL6pf33c8+Rx1B3wFX08i42tk8IDw/JF5KIq5jCDVBm0m1kwZS/b0Nr3XnKIoBU9aM48j+dgvHJtHNC6r/bnNMlorD1Qn4xtPyAjFEgVHQmvNBqPoKnIyLCxF4hjT+bd43S6s6WnhOlMFDHypbjy2fxLvuOOPut9zScA97z+/6EjXF0fn8aZ/fxxvf+0afP6a02w4yvrw/NE5AMDq7hbdiWQi8zQXiiEcS+hOPTs2t4zL//VRXLKhH//+N2eaenyRSRYLPaCtK84fbH/2ly/iv545ivv+4QK1X2o+x+aSY4CNXZ5NHsf8cgxv+NdHc76fr45SSLc0M17qoJaamMgIUm3QZvDNlLFkTG9bjqOjJTeQOzQVxPxyDH6PCxuGCncCWdsbQEezF/PLMewZX8DpmhIMM47NGquV196mkjW+77pzJ549PItHP3lJ3gmLwq/+NIoP/uQ53PymTXj3+WsL3nYpEsdFX3kI06k6/2wffP16fOyyU0o+bioNSx2objyydxIA0OR1oavFq/7xuV2QlXSwVsjzR+chK7BsWlG9enF0AQCweUWH7ve109vy7c5+4sAUliJxPDgybroTg8gkazOdxTpJKIqCB3aPIxqX8ci+yaKPIbK1a/sCRW/b1uTFX561MuN1J/70tvpw3bZVBX9eDLFYihjP+Bb7HVDt6mvz4x2vXYM3bh7EacPthn8uY3pbnqst4nWzcagd3iJXWiRJwukrOzJ+rhTqe6m3+HtpXeo24mfsFo4l8OTLUwhFE9inuVqTj8iWP7y3+GfIC0fnMR2Mwu2SMj4TRNmTkc8hsh4zvlQ3RsaSH8yfv/o0vEUTaHz67hfwkz8eznvWrSV24AdNBCCN6KXUc70pz6IsSRIG2v04MrOMicUwVnW35NxmJLWQhmMyDk0Fi2ZgtSZ1Mr7FhmZMLEbU18CIgUVc/Bs3DhkLPP7lLVsM3U5PewnT214aL/w7oNr2hTeXdsVpoN2P+eUYji9EcJJOb+di791sG4fa8dj+KfXnzJpfjqnZ242DxR9TvN8Oz4SwGI6pV0Pssnd8EeK8e8bQGpH87Bkx8HyI27x+Qz++986t6tdfmQri4q89jD3ji4gnZNOlXlQePttUFxRFyRuo9KZ20xv5UJteEoGvuUECjWZEzRrlv1SqZmDz1NxqF1Izi2owop3apil1KLKxZ8Tk46kBgsHAtxxmSx0WwzG8Op0sxTAamFNjKNZRZcTkCZ14jxs5WdSzJ/V4KzqbdUsvsnUFfBhKbXDbO148A1su7WeBoTUidZvJxQimlgpvIsy3Jq3ubkHA50Y0njzpp8pi4Et14fhCBLOhGNwuCScNZGYORX2lCGoLEbvwQ1FmfPMJxxI4mPqw3jSU/zJ7oelt2hMVwFzgKwJbMbUt/XiFWzlpH+PAxBJiCTnvY0wvRXB8IQJJgtrL1E5qVweDVxpEQDDY3lS0fpgaS7Ee2mZP6MR7fM/4IuQShsOYDbS1tzWSVS2X9nNhysgaoblNsc+t9HOd+Rnickk4JfW5Uol/I2Vi4Et1YWQsWZO7rjeQs5FKDXwNDDZIlzow45vP/uNLSMgKulq8GV0VsonM03GdDOzofDijg4GpwDerh6/6eKljmVyM6NYMvzSWzh5FEzJensxfQyhuu6a7BYECbcisYrarQzqTxDHFlKnQCWApJ3Tr+gLwuV1YisRxdNb8hrN8wV8h4nVdanmFGSMZGV/jawRQ+PhiCRn7U3XKegmCSgb3lImBL9UFEajo1a31pEZkmil1iCZkROP5M4KNTHv5rlArnv4CvXzFZVNfqrbNzIf/cZ0evkB6epus6J/kjIzOZz5mgUu3Zusgy5UudTAW+JaSRaPGIN4XeptKSzmh87pd6lU0kWAwo9Bncz4iUBwZs7fUQVEU7NE8RrE1QlGUjNsU+gx5eXIJ0YSMVr8HK7tyu1mI5+Mlm/+NlIuBL9WFQoFAT6v5UgeA5Q75jBi8VDpQoNZQBJaXbOgDkLwsa+TEBEhnfPuzMr4et0ttRZQdbIdjCbWW7tKN/RnHoEcN7g1sxrFCeoCFsRpfERAw8KVshTK+ZjdsCpvU7KS5IC2ekLH3uPnXqsj47h1fMN3xxYyjs8vqfgGg+BqxGIkjqimRKhS0iud6w2Cbbh9w8XxUIqtNmRj4Ul0o9IEupm7NhqIFa9Syz+aDUZY76DGabSzUV1f8vrau6caanpaMrxUjanwHdIY25HtMsXO7O+DDRSf3pR4v/6JV6Yyqma4OCVnBXnZ0oDxExldveEypGzZLDdIOTgURjcsI+NxY1ZXb2SWfNT0BNHvdascXu4gWbeLCVbHOPzOpwFjc/uXJJYRj+uvES0VOTjcMtkGSkpn5fC0fyR4MfKnmhaJx9cNR7wNdTNiRFWBOZ6qbsBiJI5ZIB8ZsaZarUPeMbGp7MZ0P9RFNKYGaTTK4a/y4mvHNDXwH8vTy1S74IlgcGVuAouSeCEXiCRxITaVzYqnDK9NBhGMymrwunNBTvC8qNZZ0W79Izuu71BO6UgNf7WdFsemHWm6XpA7XsDMjKu77tOFkaUWxq04iMF7R2YyOZi/isqJ+VmQTn2f5PkNafB6sTb1/mfWtLAa+VPP2ji9CUYDeVr/u6Fav26U2dS+0eWEm6zIXA99cR2eXsRiOw+uWivbdFUGomN4mLEXiGa24zC6qelPbhP48l3nTC34bTh5og0tKLnJ6QfmBiSXEZQUdzV61rZLdzAywEAvqKYPtcJsIJqgxZE9vE7QndBtNntCJk9Ojs8uYL5A8yFbOlZNKlAKI+37dSb0AklcFC5VWiMC4p9WvKf/IPT6jCQKWO1QHA1+qeelLSvl3DYtyh0LtarI3RIVY6pBDfECv729TJ7Pl097s0Z3eJi7TD7T70R3wmd7dLC7hiq4RWupl3gX9jO/GoXY0ed1Y1yc26+Q+prZHcaHNe1Zq0wS+xWoaS9klT41DO71NW+4gTujamzwYNnlC19HixYrUKOE9JoK0kdHyA187ux6I+z7/xGTgqyjAXKjAGpHq29uj+dzSC1onU8NyXBJwis4QEaGS3SsojYEv1Tyx07jQZWnR0qzQpazsjQ1mxsc2CiMnGYKY3gZkbnBTLwGmFg7xe3t5cslQJw2R8dUtdUhlfCc1j6fduS0ea1OBRatYbZ4dROALFH/dVXKwBtWmAZ2OKtruCqWc0JUSpJn5vMi2yeagcCEcU9uzbV7RoZ4sFKrzFd9LnrDnPz4RUK/tDaDZ5875vqAtu6LKYeBLNU/9QC8QCKR7+eb/UMsOitnVIZfZoEvt5atZgLM7Egx3NKG9yYNYQsH+icK7xoORuBoY6pY66GR8xc5tn9uFE1OZ3o0F6oqrEVj6PW61zVqxwJetzKgYvc4O5WRftT9nNEibWAxjaikClwRsKKE7yimD7ZCk5Ht5usiEtFKIk+HhjiZ0tHjVq4KFOjuopQ4BXzpoHc3dK2D0PSq+//JkMO8mObIeA1+qabKsqJfeCn3I9KTaXGXX8WplB8VLHGKRw2grMyGdeUovwNm1b5IkaS4bFg58RU1uIGtqW/rxcluoiZ3b6/tb4U0Fl/myNYqiVC2wbFM7O+SvoZwJRtWgfgMDX8qjT2d8d6mtzIRNBt+j6cdL3u6EIlnPfFr9HqzpFh1frO91m92ru8fAaPt0ja8P6/tb4XFJWAjHMTqfuafA6FWjwfYmdLZ4kSiwSY6sx8CXatrhmRCC0QR8HhfW9ebf4d5jYHpb9pl+iKUOGRbDMRyeSW9KMyJ7eltCVrBnPHcBNrrJI18PX2FAZ3qb3jAKsYgfmgpiWVPLPTYfxvxyDB6d0dd2azPQ0kz8W9b0tOgG/kRAbsZXURS8NF7elQzxHt17fBHxAuO+hXIDbe3P2lHukJ0BT5fD5V8jplKZ5+6AH36PW93g+1LWlSOjA3AkSTLd1YbKx8CXapr4gDlloA0ed/6Xs7FSh8wPPHZ1yLR3PJnFGGxvUlvEFZPdV1fbimut5kRFe9mwkHxT24SeVn96eltqkdJbgPva/Oht9UFWoDbY1952fX8r/B7zWapyqJ0dDAS+lRqsQbWpvy2ztn5sPoy5UHkndKu7WxDwuRGNG+uta0XJUKFa/HK9NJ4d+Cafs0IboLWlDtqf1ZZ/hGMJHJwUo4qL/9s5urjyGPhSTUsHNYU3T6iXsQyUOojLhBxgkWnEYBZDS7Q0E10d1BOVrFZc6gI3rt9bVxAZX736XiDZ/1Od3iYeczz3NZJZXpFecMqtgyxHmz+5uWahQKlDNY+Paoe2ly+Qfo2f2Ff6CZ3LJanlNUaCtOxNrKWwKyiMJ2T1RF48Rq/JUgdAPzDXDsvJd4KuxZZmlcfAl2qa0ZrTntTZvJFSh9WpujJmfDMZPcnQyr7kmq8V1/r+VrhdEuZCMYzrTHoTJopkfLMfcyEcw5GZ5dRjZr5G9BYcvSC5UoyUOoyU8DugxiNKfkQ7s1Leu3rEzxcLRMOxBA6mssJllTqkTrIPTCwhErcuEXFoKohIXEaLz63WERfr/KMoirpGdGdlfDM+QzRrkpHuGdp+wIVO+sk6DHzz2LFjBzZt2oRt27ZV+1CoAKObCIy0MxPfUwNfZnwzZHdjMCJd6pAMWPNlgZq8bqxPdVwolPk4XiTjC2R2dtDu3O5sySzP0MvWVKOVmVBsiEU0LuPlycpOlKPapO2mot2wWe7rxugm1P3Hl5CQFXS1eNUgvBSi40uhCWmlEM/HhsE2daJcd5F9IEuROKKp2maRSBEnAq/OhNT3rdmTjOSmWwmL4TiOzS2X8s8hkxj45rF9+3aMjIxg586d1T4UymM+FFM/KIrtcBeXpmZDMcg6AwIURVED31VdyUbt3NyWlpAVdfCEmUuXotRhfjk5va1QYKlmkwrU+RYaVyz0azo7FNpgo13EZVlBMBLHK9PlZ6lK1a6OLdYvddg/sYhYIjmAQAwTINIjyrWiqeltVp3QGd2Ipe2tXs4QGEmSDNf/m6H3fKhXBfOUw4n1odnrVrtU9LT6MdDuh6KkB/OY7Qrj86TbLNrRvYJyMfClmiU+YFZ2NavNx/PpSmX7ErKiO3JTeza/KpXx5QCLtENTyU1pzV431vTk756RTTu9be/4olrGoHeiYiSblC51MJbxLbS7el1fAD63C0uROI7OLmNPavR1f5tfrROupGKlDuJ52WDwEio1Lu30toNTS5ad0J0y2AZJSnY3mNQZ9y2ogaUFmzCNZpnN0AtOi7Uzm86q780+vpGxRd1hOUbYEdxTfgx8qWaZaZfj87jQngos9C5libP8Fp9bDXo4sjgtvSmtLWNTWjHa6W2P7JsEkCwl0WvFZWSTh9isU+jyaXpjT7hg9sXrdqk73EfGFixpv1QO8Zzk6+rAiW1khniPPLZ/yrITuhafB2tTJ76F3qdW9sK2Y/OX3gmx6NQwG4rqXhUUa0RPQD/wfWlsQXdYjhF2dq+gXAx8qWaZDVTEEAu9S1naUZQtqctY3NyWVk5QKModHt47ASB/4Cbu+9B0UHdqnnZqW74+vkB6wR+dD+fs3M6mXXCM9t60S1uT6Oqg/7qzYpc8NQ5xAijed1ad0G0sMmZXURRL30tGO74YNbmYzFZLUrLGVxAtGmUFmNO5KijaXXYH8u8VEM+JdliOERs1/0ayHwNfqllmG7IX2uCm7c8YSGXeghxZrCpnc4yox911ZA5A/gW4r82PvrZkvdye8dzLmsWmtqmPlwq0944v5OzczqZtl1TtUcCFJrdpBxCwlRkZIep8i73vzCqWnTw6u4zFcBxet2Qq65nPSQPJCWlzoRjG5vN3fDFKHPcJPQG0+NKfI1635qqgzojkdHIkM2suntc9Y4t48Vi6ttkMcR+vTocKTm4kazDwpZoUS8jYN268STignd6mF/imz+bVwJcji1X52pAZIQJRcfWw0G7nQpc1jXR0SH7fn/F42p3b+R5vZHRBzQ6X8m+0QqGuDuMLyQEE7ipMlKPaJN4nRt53ZuQb9y2kh8C0qfX95fB73JrNX+VnRAt1XRClILprROpKYW9Wje/a3gCavC4sxxL49e7x1H2bC3y7Az4MtosTdm5wsxsDX6pJByeDiCZktPo9WNllbIe72JSgV+ogpvX0tPoR8KdKHaJx9lVEMvsh2pGdUsJmlexAtVA2pFA2SWR8+4o0hRfT24RCi5B4vGNzywhFE6mJctUJLNsLbG5LDyAIoMlb2YlyVJsGst4np1pUwiPeTy9PBhGO5SYHxCY0K0tyxGeGlYGv3vEVuiqoLYfTcrsk9XNxf6rlWiknGcVOKMg6DHypJmnP2vNl87IVmsWeUeqQuvylKEA4Vnwmfb0TC9kJPfqb0orRDpso1oqrUEuzYlPbBO30NqBwoN3R4s04nlMGzG3es1JbgXZmnNhGZmnr4P0eF04w0Y2lkMH2JnS1eJGQFew/nttbV7Qys3LIitHBGUYUKmlSe/kWLHXIHdeefZWolKBf7ezAlma2Y+BLNamUeszuQIHLWJoPtWavG6JbFFualbexDcgMVIu14hILxp7xxZyd1elSh+I707WPWey4tQt0NQNLtatDJPdKQzUHa1Bt0r5PThlsg8fEZqtC8o37FuzI+FrV0iwcS+Dlyfyt3dSrggXK4bLbmWXfl96wHCPsGs9MuRj4Uk0qJRjrLVjqID7U/HC5JLSkLifrdRdoNOUGvtphE8UWw7W9Afg8LoSiCRyeCWV8z0gPX/UxU1nm7J3berT/rmoGlmJzWyyhIBLPvNJQ7VZrVHu07xMr+ulq5QvSFsMx9X1r5WtV3Ncr08Gyuu0cmEhOlOts8WKoI/dzRAyx0C11UNuZ5Z54W/EZIn5u7/gCEjrt1Mg65q9bElWZoiglXfo12tUBAFr8HgSjiZrJ+M4Eozg0tYSz13Rbft8jBWrijBjQLMDF7sPjdmHDYBuePzqP//vHwxl1iaIxfKGpbYK4zLs2a+e2Hu0xVXMUcMDngSQlS2x+/uxRNQMsKwoOpQYQsJUZGaWthbf6dS1eh08dnMYvdh1Tv34kFfQOdTSp7cGs0NvqR3+bHxOLEXz/yVcM7+vI9syrswCSJwJ6V56682yAVhSlYKmD9uS61Of6hJ7kJrlwTMYr00FLOmKQPga+VHOmg1FMB6OQpGRNplH5PtSAzFIHIHnZeXIxUjNDLD5y1y48sm8Sv/zA+Th9Zadl9yvLCg6kNmxsKLFmr73Zg2avG8uxhKETlU1D7Xj+6Dz+49GDut8fLFLjC0DN5hh6vNRCZSQ7bCeXS0JHsxdzoRhuumd3zvd7W/1FN/YRCU1eN7oDPswEo5ZfKRDvmT3ji/jQT3flfN+OKxObhtsxsXcSX31gb9n3le/40hugM2t8g9EEoqmrMHqlDm1NXqzpacGr06GST07dLgkbBtux68gcXhpbYOBrIwa+VHPEJafOZq86M90IcYlKTOYRm+L0zubFEItayfj+6egcgORoYSsD32hCRjx12a2rhLo1IFkTeNOfb8QrU0GctqL4onDD69ZiaimK5Vjuc7+6O4Cz13QVvY9rz1qBg5NL+LvXrSt62zU9AXzyilPQ1uRVN5hVy6eu2IBfPT+a83UJEv5668oqHBHVsk9dsQEvjs4bes+YsWGwDf/Phevw4uh8zvd8bhe2X7Le0scDgA+k7jOWKG/DccDnwTvPXaP7vXxXBUUrsyavK+8VpJvftAmP7pvCn20aKPnYTupvxa4jc3h5IljyfVBxDHyp5synpuqIWfRGiQ+1hKxgfjmmXopbisRzzuZFL99QDfTynQlGMRdKPicLOhOHyhHVLDIed+ndDt7+Wv2FRs/JA224/fqtJT8WAKzsasHX33qm4du//2LrF+pSvPWc1XjrOaurfRhUJ96ybRWAVZbfryRJ+MwbN1p+v4VsPaEb33/3ObY+Rr4a3ymxsU2nvld4/YYBvH5D6UEvAKztS3beODSV2y2DrMPNbVRzFkoMfH0el7qBSFvuID7kmr1u9Ww+UENji7UfkvnG3ZYqnkhvsvC6+HFBRPVLJD5mgtGMrjIzap936+qW9axL9RA/OMWMr524klHNERnfdpOBL5DevKY9o9fbtFBLY4tFex4g/dxYJZ7K+LpdkuF+yUREtUiUc8kKMKf5LM3eA2KXE0XGdzLI4Uk2MhX4xmIxXHLJJdi3b59dx0NUVKmlDoD+EAu9s3kxxKIWNrcd1Aa+IXtKHTwMeomozvk8LnWConaNmA7mb2VmpdU9LXBJwGIkjkmdIRpkDVOBr9frxe7duws2oCeyWzmBb09qotfUkjbjK+q30oFvi792NrdpSx2sz/gmsw4+i5rfExE5mVgjtP3ep5fyD6+wkt/jxsquFgCZCQ2ylunV7J3vfCfuuOMOO46FyJCyAt+CpQ7ps/lWdXOb8wPfg3aWOsipjG8ZG9uIiGqFXmeHSpU6AMkhPkCyQw/Zw3RXh2g0ittvvx0PPvggtm7dikAgc/73bbfdZtnBEekpdXMbkOdDTafUQWxyW3J4V4eErODV6fSEM6sD32g8mfG1atwpEZGTiTViqsg+ELus6wvgkX2TODjJzg52MR347t69G2eddRYA5NT6sgSCKqGszW1qqUNu/Zb2Q63VXxsji4/NLme0HLMr48tSByJqBGK0/YxOOVyvzaUOALAuNbiCpQ72MR34PvTQQ3YcB5FhdpU6ZNT4qhlfZwe+L6fqe8VkNKv7+Ipm8Sx1IKJGUGgDdLfNm9sAYB1LHWxXVhrn6NGjOHbsWPEbElloIWxxqUMwd+OCOsDC4V0dRFZg88oOAMndwAnZujY4sdTmNi8zvkTUAERwKxIi2smePRUqdQCAwzOhsqfUkT7Tq5ksy/j85z+Pjo4OrFmzBqtXr0ZnZye+8IUvQJb5SyL7WdHObFqnxld7Nh/w18YAC9HR4cxVnerXFsPWZX1FVwe2MyOiRiCCW9HVIRRNIJKa7FmJGt/B9iY0e92IywqOzISK/wCZZrrU4aabbsIdd9yBL3/5yzj//POhKAqeeOIJ3HLLLQiHw/jiF79ox3ESqcoJfHtb0yMpZVmBJKU3MeiVOjh9gIXI+J400IYWnxuhaALzyzF0tljzAS0yDsz4ElEj0E5vA9IBcJPXhZbURE87SZKEtb0BjIwt4OBkUK35JeuYDnx/8IMf4Pbbb8fVV1+tfm3Lli1YsWIF3v/+99dN4Ltjxw7s2LEDiYSzL3U3mkg8gXAsGYyVsrmtK5D8mYSsYCEcg8ftQjR1Nq8tdUi3M3P2718Evuv6Auho9qqBr1XSgS8zvkRU/7KvCqb7vPsrtoF/XV8q8J1aAjBQkcdsJKbTODMzM9iwYUPO1zds2ICZmRlLDsoJtm/fjpGREezcubPah0IaIqiTJKDNb/q8DX6PW/256WBULXNIns2n70+c2Tt5c1swEsf4QhhAckOEyIBbGfjGZbYzI6LGIaazzYaSVwUr2cNXEFlebnCzh+nVbMuWLfjmN7+Z8/VvfvOb2LJliyUHRZSP6FrQ3uSFq8S6027NpSzt2byWyPhG4jLiDt1gID4UuwM+dLb41Aw4M75ERKXRXhWcX45VtIevIDo7vMyWZrYwnTL7yle+gj//8z/Hb3/7W5x77rmQJAlPPvkkjhw5gvvuu8+OYyRSpXv4ms/2Cj0BH16dDmF6KQKPK3nulz2KUowsBoBgNIGOZudlPA+mAl/xIWlHxpddHYiokfg9brQ1ebAYjmM6GFVrfO0eV6wlOjsw42sP06vZRRddhH379uEv/uIvMDc3h5mZGVx77bXYu3cvLrjgAjuOkUhVzsY2QduuJt9lLL/HrWY5nTrE4pCmvhdIZsEBi0sdRB9fFwNfImoM2n7varvLCmZ8xdjiycWIpV16KMlU2iwWi+Gyyy7Dd7/73brZxEa1ZWE5GYSWE/iqH2pLUbV2Ve8yVovPg/nlmGNbmh1MtTJb25usB7Mn48tSByJqLN0BH16ZDmEmGNGUOtg/vEJoa/Kir82PycUIDk4GsUXTrpLKZyqN4/V6sXv3bo4mpqqxJOPbmt61O72U/2w+4BO9fJ3Z2eFgVsZXPCfi5MAKLHUgokYjgtypJU2pQwUzvgAnuNnJ9Gr2zne+E3fccYcdx0JUlBWBb4+mXY0odehpzT2bF9PbnNjLV1EU9QPxRDXwTR6vlWOL4zJHFhNRY+lt1ZY6VL7GF0gnNA5OLlX0cRuB6R1C0WgUt99+Ox588EFs3boVgUAg4/u33XabZQdHlC29ua2MwLc1PYtd1K7qljqIwNeBGd/JxQiWInG4JGBVdwsAoKPFxs1trPElogbRHcgNfCvZ1QEA1qVK2F5mxtdypgPf3bt346yzzgIA7Nu3L+N7LIEgu1m6uW0pql7C17uM1Zrq7ODEzW2izc2q7hb4PcnjtLXG18P3NhE1BhHkTi1F8ra8tJva2YEtzSxnKvBNJBK45ZZbsHnzZnR3d9t1TER5WV3q4E31As63uQ1w5hCLQ1mtzAB7A192dSCiRiFG2x+dXVYnhVa61GGtpsZXlpWS+9ZTLlOrmdvtxuWXX475+Xm7joeooHnNAItSiQ+w2WBU3bHbq1Pj6+SxxaLuS3R0AOwJfOOpUgefh4EvETUGkQg5MJH8nPV7XOo0z0pZ1d0Cj0vCciyB44vhij52vTO9mm3evBkHDx6041iIilqwpNQh+aEWlxVE4nLG17ScPLZYHV7Rl874irrnhXAMcmrUcLlEja+H2QYiahBiPRCf/T0BX8VLOb1uF1b3JPdvHGS5g6VMB75f/OIX8fGPfxz//d//jbGxMSwsLGT8IbKTFYGv3+NWs7nJv+ufzYuuDk6s8dUrdRBZcEUBFi0K1tVSB7YzI6IGkV3W0F3hMgdBfL6zs4O1TG9uu+KKKwAAV199dcYZkKIokCQJiYTzLgtT/bCixhdIfrCJs/neVr/u2XxArfF11ms6GpdxeCYEAFjXly51aPK64fe4EInLWFiOlf0cAel2Zj62MyOiBpF9BbDSG9uEdX2twEsT6hU+sobpwPehhx6y4ziIioolZASjySC03KCuO+DDq9Mh9f/1BBza1eHwTAgJWUGLz42B9swP5I5mLyYWI5hfjmGVBY+lljow40tEDcLvcaPN71GvnFV6eIWQzvgy8LWS6cD3oosusuM4iIrSDmYop48vkPlBlj/wdWYfX1HmsLY3kJOpFoGvVUMs0l0dmPElosbR3epTA99K9/AVRGcHMZ6erFFSGuexxx7D29/+dpx33nk4duwYAOBHP/oRHn/8cUsPjkhLlDm0+T1wlxmIaT/I8p3Nt6gji52V8RX1XtoyB8Hqzg7s6kBEjUi7RlStxjf1GX90dhmRuLMSMLXM9Gr285//HJdffjmam5vx7LPPIhJJNndeXFzEl770JcsPkEiwYmqboB1RnK8/Y6tDN7eJy17ajW2C1YEv+/gSUSPS1vX2VqnGt7fVh7YmDxQFamkelc/0avbP//zP+M53voPvfe978HrTAch5552HZ5991tKDI9KyNPDNKHXQ/1Bz6gCLQzqtzATbAl9ubiOiBmKkHM5ukiSxztcGpgPfvXv34sILL8z5ent7O+bm5qw4JiJd6Y4OpkvTcxgpdUhnfJ11iUnUe63rzS11aLe61CHVD9jHzW1E1EC05Q3VKnUA0uUOrPO1junVbGhoCAcOHMj5+uOPP45169ZZclBEeqzo4St0Gzibb/E7b4DF/HIMU0vJaXNrK5DxjcaZ8SWixtNjIDlSCWuZ8bWc6cD37//+7/GhD30If/jDHyBJEkZHR/HjH/8YH//4x/H+97/fjmMkAgAshJMBqBWBb6+BGl/RxzcUTUBRrJmEVi5R5tDf5s8YwiHYlfFljS8RNRLtutCjM9K+UkRJ2yH28rWM6WvGn/zkJzE/P49LLrkE4XAYF154Ifx+Pz7+8Y/jAx/4gB3HSATAuuEVQHapg/6Hmujjm0iNNm7y2jOr/ZF9k/jFrmOAgdj62NwyAP36XiD93IiThHLFUzW+Pg8zvkTUOMTeD5/HhYDOZM9KESVtRqe37T++iP969ijed9GJ6GyxNlP98N4J7D42j+2XrK/4CGcrlVQs+cUvfhE33XQTRkZGIMsyNm3ahNbW3HpDIivNh6wLfHtafWjxuSErCvraCm9uA5ItzewKfG/+xW68YnLH7qahDt2vW17qkGDGl4gaz+ruFvW/1QzyRKnDbCiG+VAMHS2F179v/O4AfvWnUfS3NeHvXrfW0mO55Zcv4pXpEF53Uh/OWNVp6X1XUsm7hFpaWrB161Yrj4WoICszvn6PGz/6u3MgK0BznrN5t0tCs9eN5VgCoWgCPWU/qr7ZVED/9xeuy1t2odXkdePqLcO631Mzvpb18U1mfL3c3EZEDWRtbwB3XL8Vq1IBcLU0+9zoCfgwHYxidH65aOArxtkfmbG+/ZlYqw7PhBoz8CWqNCvbmQHA2Wu6i94m4E8GvnZucBN9gq8/7wQMdzaXdV+WD7BI1fh6ubmNiBrMpRsHqn0IAIDhzuZk4Du3jI1D7QVvO5oqhxNlcVYSa9WoDfddSUzjUM2wOvA1ImDzEItIPIFYqpwgoLNZzSxt4GvFhrx0Vwd+VBARVcNwZxOA4gFnJJ7A5GLE0G3N0q5VDHyJKsTKUgej0kMs7OnlG9LcrxUbKMRzk5AVBC3oPxyXRakDM75ERNUgrgQemwsXvN34fPr7Vgen2rWq4QLfYJAtNag6rOzja5QIRkM2lTqIEgq/x2VJVrXJ61KHTVhR7hBPiFIHniMTEVXDilTgWyzg1JY3zIZill6p1Jb7FQvAnc70ajYwMIAbbrgBjz/+uB3HQ6QrIStYjFjXx9coUX5gV42vmApnRZkDkBxxqfbyDZUf+EbFyGIXM75ERNUwbDDwHc0KSLP/Xg7tBNOGy/j+5Cc/wfz8PC699FKcfPLJ+PKXv4zR0VE7jq2qduzYgU2bNmHbtm3VPhQCsBhOB3GVDXxTGV+bxhaLgLrFwj6R7amRzgthZnyJiGqd8cB3ueDfy6FN/swvxxw10dQs06vZm970Jvz85z/H6Ogo3ve+9+EnP/kJ1qxZg6uuugp333034vHafTK0tm/fjpGREezcubPah0JIX7Zv8bkrGoSJ6W1Bmza3iUtRelPYSmVlZ4cY25kREVWV2Nw2vhBWW0zqsTPwzS6bGKvhrG/Jq1lPTw8+8pGP4E9/+hNuu+02/Pa3v8Vf/dVfYXh4GJ/97GcRClnfQ44aVzU2tgHpEoSgTWe3wdSGASszvlYFvoqipEcWc3MbEVFV9Ab88LldkBXgeKprg57R1Oa25tSwJSsD32DWBm872qVVSsmB7/j4OL7yla9g48aN+NSnPoW/+qu/wv/+7//iX//1X3HPPffgzW9+s4WHSY2ueoFv8gMk+01vFRFQW1XjC1g3xEIEvQAzvkRE1eJySRgy0NJMfO/M1Z0ArN2Elp38sbJ+uNJMr7Z333037rzzTjzwwAPYtGkTtm/fjre//e3o7OxUb3PGGWfgzDPPtPI4qcGpPXybKhv4inZmdmV8xeWjgM95pQ4xzSU1tjMjIqqe4Y5mvDodyhv4Koqifm/rCd148uVpW0sdanmDm+nV9t3vfjfe+ta34oknnsi78WvdunW46aabyj44IqEawysATTsz2za3WdvVAbAy8E1nfD0uZnyJiKol3ctXP+CcX46p69TZa7oAAKPzVm5uy1wDGyrwHRsbQ0tL4dnVzc3NuPnmm0s+KKJs1a7xta+dmSh1cF6Nb5wZXyIiR1hRpNRBBMS9rT6s6w0AAMbmwpBlBS4L2lGKtaqzxYu5UKyma3xNB77xeBwLCws5X5ckCX6/Hz6fz5IDI9JaWK58D1/A/pHFSzbU+LZbnPH1uCRIEgNfIqJqSbc006+tFV8f7mzGYEcTJCnZh30qGEF/W1PZjy/WqpP72/DHV2YwNl+7Nb6mr192dnaiq6sr509nZyeam5uxZs0a3HzzzZDl/C03iMyqfsbX3pHFVowrFqza3MZWZkREzlCsl6/4+nBHM7xuFwZSwe6YRZvQxFq1fqA1eb/zy5A1G6Briek00/e//33cdNNNeNe73oVzzjkHiqJg586d+MEPfoB//Md/xOTkJL72ta/B7/fjM5/5jB3HTA0oPa7YusyoEekaX5vamUXFAAsLM75NFpU6sJUZEZEjFKvxVQPf1O2GO5swvhDG6NwytqzqLPvxl1Jr1breAFxS8org1FIE/e3lZ5MrzfRq+4Mf/AD/8i//gre85S3q166++mps3rwZ3/3ud/G///u/WL16Nb74xS8y8CXLqBnflmr18bW3nZk9AyzKC9aZ8SUicgYxxGIxHMdCOJbT4eiYGvg2pf7bjGcPz1lWixtKrVXtzV4MtjdhdD6MY3PLNRn4ml7Rfv/73+u2KjvzzDPx+9//HgDwute9DocPHy7/6IhSqlbqYHM7s2BqF26LlZvbWtKlDopS+qWodODLjC8RUTW1+DzoSn2265UviIzvilTGd0WRmmCzxFoV8HmK1hs7nenAd+XKlbjjjjtyvn7HHXdg1apVAIDp6Wl0dXWVf3REKVXr45sKSJdjCSRsqGeyc4BFNCEjHCu91j69uY0ZXyKiaitU56vd3FbstqVIr1Vuy++70kyvtl/72tfw13/91/j1r3+Nbdu2QZIk7Ny5E3v27MF//dd/AQB27tyJ6667zvKDpcZVrYyvtgQhFI2jzeLAO6Q5i7ZKwOeG2yUhISuYX46hucSNc3FmfImIHGO4sxkvji7klC/EEjKOL+YJfC3q5auuVX5P0XpjpzO92l599dXYt28fvvOd72Dv3r1QFAVXXnkl7r33XpxwwgkAgPe9731WHyc1MFlWsBCuTuDr97jgkgBZSb7xrQ58lyLW9/GVJAkdzV7MBKOYX45hsKO0GiyR8WWNLxFR9a3Ik2kdnw9DUQCfx4WeQLKl7LCBEcdmqGuVz1O0p7DTmQp8Y7EYLrvsMnz3u9/FrbfeatcxEWVYisYhSlUrPblNkiQE/B4shuNYisQxYPH9hyLWjywGkBH4lkrU+HoY+BIRVV2+YDbdyqxJHVYhguSppSjCsQSavOUlV0J6pQ4WToarJFMrmtfrxe7du9nMnipqPpQM3vweV9lv3lKIoDRkcWcHWVbSGwYsrPEFrBliEZdZ6kBE5BRDHfqbykQAKgJSIJn8aEmVuZU7bEK7VrU04ua2d77znbqb24jsUq36XkGUIQQt7uW7HEsH0laWOgDWDLFgqQMRkXPkq63N3tgGJK9WWrUJTbtWtWpqfGeCUSxH7Wn1aSfTaaZoNIrbb78dDz74ILZu3YpAIJDx/dtuu82ygyMCtMMrqhX42tPSTATSkgQ0W5zJbm9KHrMlpQ4WzHknIqLyiPKF8YUwErICd+qz+dhcbsZX/P3AxFLZm9DE2ueSgCavC01eF1r9HixF4hidX8aJfa1l3X+lmQ58d+/ejbPOOgsAsG/fvozvsQSC7KC2MqtS4CsuFwUtPrMNRtIdHax+73RYUerAjC8RkWP0tfnhcUmIywomFsOa0gfRwzdzI7NVm9C0PXzFWjXc2YR9x5cwOtcAge9DDz1kx3EQ5VXtUodWuzK+ETGu2Pq6ZSsCXw6wICJyDrdLwmBHE47OLmN0bjkn8M3J+HZYU+qgrlWakrzhzmY18K01JadyDhw4gAceeADLy8l/dDkToogKqXbg22LT9DY7xhULVtb4sqsDEZEzpOt8k3W9iqLg2Gz+Ugeg/E1oeoOWso+jlphe0aanp3HppZfi5JNPxhvf+EaMjY0BAN7znvfgYx/7mOUHSFTtwDdd42ttqUPIhnHFgiWlDqmuDj4GvkREjpDdy3chHFdLEUSGV7Bqc5veoKV8PYVrgekV7SMf+Qi8Xi8OHz6MlpYW9evXXXcd7r//fksPjgiAOryiWjW+gVQpQsjirg5LNvXwBawqdRAZX5Y6EBE5QXYvX/Hf7oAvZ0rnCk0XiHKuyusNWrJ6QEYlmV5xf/Ob3+CBBx7AypUrM75+0kkn4dVXX7XswIiE+eXkm67aGd8li0sdRCBtdQ9fwNoaX4+LGV8iIifIzuKm63tzJ3QOdPghSUAkLmMmGEVPq7+kx1TXKk2Sxqr64WowvaIFg8GMTK8wNTUFv7+0J5WokOqXOoiMr7WlDksR0RDc+lIHkR0X2fJSxFOBr8/DjC8RkRNk19aOpoZTZJc5AIDf40ZfKtgtp85XXat0anxH58OQ5dra42U68L3wwgvxwx/+UP27JEmQZRlf/epXcckll1h6cESAEwJfeza3hSqwua2cjG9UlDow40tE5AjZtbX5OjoI+YZemJFeq9JJmsGOJkgSEI3LmA5GS77vajC94n71q1/FxRdfjKeffhrRaBSf/OQn8eKLL2JmZgZPPPGEHcdIDU50JhBDGSpNXN6xenKbdgSk1UTGNxyTEYkn4PeYzyqLjC9rfImInGGoI1nSML8cSw6QUHv46ge+KzqbsevIXFklCUtR0XozvVZ53S4MtDVhfCGM0bll9LXVzhV/06mcTZs24fnnn8c555yDN7zhDQgGg7j22mvx3HPP4cQTT7TjGKnBqRnflioPsLC4q0NQ5yzaKm1+D8RMjFKzvvHU5St2dSAicoa2Jq+aBBqbWzaQ8S1/E1pIDFvKujpZqxvcSko1DQ4O4nOf+5zVx0KUQ1GUqpc62DbAQpxF21Dq4HJJaG/yYn45hoXlGPrbcjc+FBONM+NLROQ0w53NWBhfxLG5ZbV2V29zm7gtAIzOlx6cBtXNbZlJmuHOZjx7eK7skciVVtKKOzc3hz/+8Y+YmJiAnOr1Kbzzne+05MCIgGQ5QCKVeazaAItUYGr15ja9puBW6mhOBr6lZ3zZ1YGIyGlWdDZjz/gijsyEML4QVr+mx4pBE/nWqhUWDcioNNMr7q9+9Su87W1vQzAYRFtbmzq3GUhudGPgS1YS9b1et4Rmr/UlAUaIUgTr25mJpuD2/LvK3eAWT21u83kY+BIROYUIZp87MoeErMDrltCbp1WZFYMm1LXKn5vxLfe+q8H0ivaxj30MN9xwAxYXFzE3N4fZ2Vn1z8zMjB3HSA1MW+agPcmqJFHQb9sACxszvkDpgW9U7ePLUgciIqcQAefTr8wCAIY6muHK8zktbju5GEEkXtpVy3zDlqwoo6gG04HvsWPH8A//8A+6vXyJrCaCtmpNbQPSgWksoZT8waFH3TBgQ1cHIB34LiyXFrDH1cltzPgSETmFqOc9PBPK+LuerhYvmrzJz/Dx+dJKEuptc5vpFe3yyy/H008/bcexEOWo9sY2IHPARMjCzg7pzW32lDq0l1vqkKrx9XFzGxGRY2TX8+br6AAkS1DL7eUrMr7Zw5bEcUwtRRGOWbsHxk6mU01//ud/jk984hMYGRnB5s2b4fVmBiRXX321ZQdHpGZ8m6oX+HrdLvg8LkTjMoLROLoCPkvuN2jjAAvAglKHODO+REROkx3o5tvYpv3+wclgyZvQRJlf9lrV0exFi8+NUDSBsfkw1vYGSrr/SjO94r73ve8FAHz+85/P+Z4kSUgkaifqJ+dbcEDGF0i+4WfiUUt7+aYHWNiV8U2+vcvN+HoZ+BIROUZ/mx9ul6R2PCqU8QXS44xLLUlQ16qswFdkkw9MLGF0brlmAl/TK5osy3n/1FPQu2PHDmzatAnbtm2r9qE0NCeUOgCaIRYWbXCLJWS1T65TM76xhAh8WepAROQUHrcLg+3put6igW8Z3Rcy1iqd/ShWjESutLJSOeFwbfVuM2P79u0YGRnBzp07q30oDc0pga/VQyy0tcJ2jCwGrAh8U6UO7ONLROQo2g1tKwpsbtPetpTgNGOt0tmPMtxRexvcTK9oiUQCX/jCF7BixQq0trbi4MGDAIB/+qd/wh133GH5AVJjc0qpg9Vji8Xsc1+qftgO6a4OpfbxZcaXiMiJtFneoY7iNb5AacGpulZ5XLplb7XYy9f0ivvFL34R3//+9/GVr3wFPl96k8/mzZtx++23W3pwVDsURbHltk7J+Io2LkuROGRZyfhj5t8jhCL2dnQAMjO+2ccsy8WPWWR8WeNLROQsIuDsbPEW7QU/rJmwljC5FoQi+uOK9e67Vpi+xvrDH/4Q//Ef/4FLL70UN954o/r1008/HXv27LH04Kg23L97DP947258461n4rz1vQVvG4rGcdW/P47XrO3GrdeeXvS+ndDHF0j32v34z/6Ej//sTxnf2zjUjnu3nwe/x3gQm68huJVE4Ds2H8a6z9yX8T2vW8Lnrj4Nf/ua1Xl/XtT4epjxJSJyFBFwDhfJ9gLAYKocYTmWwIlZawEA/P1F6/DpKzfq/my6lZn+WlVOGUW1lDTAYv369Tlfl2UZsVhpl1Sptj04MoGppSgePzBV9Lb7jy/h4GQQ//38mKH7ngslX1OdLdUNfM9b34N8g+NeGlvAoamgqfvLNwLSSsOdzVjXp7/LNpZQ8Ls9xwv+fFxmxpeIyInOXdeNFp8bl2zoK3rbJq8bF5yUPyl13wv512OxVuXbhC022U0uRooeh1OYTjedeuqpeOyxx7BmzZqMr//sZz/DmWeeadmBUe2YCSZf8GLnZyGR1G0Ww3FE43LR+tappeR997Za0zu3VO889wT8xZkr1Glmwl9+50kcnAxiZilq6v6CRc6ireB1u/DgRy7KqfH9nxeSGfpIkd8XuzoQETnT+v42PH/zZYb7rP/whnPURJJwZDaEq7/5RMH1a6lIWV5PwK/eLhxLoMlrXzLHKqZX3ZtvvhnveMc7cOzYMciyjLvvvht79+7FD3/4Q/z3f/+3HcdIDjcTTL5pigVSydukN4fNhqIYaM+/GzWWkLEQTr7pulNvrmpq0xmi0dvqx8HJIKaDJgPfPA3BreZ2STkDN7pTfy/2+4qzqwMRkWOZGS4kSblrgcuVTGoEo4m8QWu+4RVCe7MHHpeEuKxgJhgt2lrNCUyvaG9605tw11134b777oMkSfjsZz+Ll156Cb/61a/whje8wY5jJIebVgPf4h0PIrF0sDVdJEs6m7pflwR0VrnGNx+RiZ4xG/hG7B1eUYgv9WFpPOPLwJeIqN60N3nUK3r51rBia5UkSWoyxew6WC0lpZsuv/xyXH755VYfC9UoEcAay/hqAt9g4ZqgqdT9drX41DNTpxFv+Oklc/VNdo8rLsTvTQW+RWars9SBiKh+iaD1+EIE00v62VqxVhXqHNEd8GFiMWL6yme1MJVDZVmOJrCcCqC02dx8tFnhYmeH4vs9Va7vLUSUYJgvdRAjICuf8RXdJ4rVZKulDsz4EhHVpfQapp+8EWtVoQ5EPeqVz9rY4MYVjcqifbMYKnWIGy91EPfdHXBu4Ft6qUPxs2i7+D3GSh2izPgSEdW1YmuYsYxvKng2ucm7Whj4Ulm0bxYRKBWizTIazvg6YGNbPmqpg8nAV2wYsLOPbz5qqUOxjC/bmRER1bVi9bnptSr/1cmeEtfBauGKRmXRnuGZLXUoVuMr7tvZpQ6l1fguVXFzmyh1KJShl2UFCQa+RER1TaxhU3mytepaVSDjKwJfs209q4UrGpVFe4ZnaHObia4O4r6dXOogstFmSx1C1dzcZqDUISanv8fJbURE9UkNWvMkotJrVf4kTXdrg2Z8f/GLX+CHP/yhVXdHNWKmjBrf4qUOyfvucXLgm3rDzy3HEDdQ6iGIPr6FzqLtIoaGROMyFEV/Trt2UIeXfXyJiOpST2vh5E2xkcWAttShwTa3/Z//83/w7ne/26q7oxphOuNbQlcHJwyvyKerxQdJAhQFmA0ZH9kteiMWOou2i18zLS/f7ywj8GXGl4ioLhUrdSg2shgoHjw7jWWB7549e5BIFM/4UX0xX+Obvs1UkbrYWqjxdbskdbiGmTe9mvGtxuY2TzrYzhf4ajcquh3aQ5mIiMrTU2RzW3qtKlDqwBpfaiRmuzpog+OFcFwdkqBnWu3q4NzAF9B2djB+maeaAyy8bglSKpbN18s3Lsua2zLwJSKqR8W6OhhpZybW6MVI3FDJY7UZWnWff/55w3d4+umnl3wwVHsySh2KTAIDcoPj2WAU/e1NObeLJWTMLydLB5y8uQ1IXuZ5eTJoKuMbqmJXB0mS4Pe4EI7JeT+kRKkDOzoQEdUvUaawFIkjHEugyZu5Jom1qlDg297khcclIS4rmAlGMdSROwHOSQwFvmeccQYkScq7EUZ8T5Ikljs0GG0bL7M1vkAycNYLfGdTQaQkAZ0tDg981ZZmxgJfRVHUy0fVyPgCyXKHZOBbuNTBwzIHIqK61d7kgdctIZZIBq3ascXatSpQYD+KyyWhK+DD5GJy9HFdBL6HDh2y+zioRmmznHFZQTwhFxxxm10HnC9YVFuZtfgcX2NqdohFOCYj1SK3Kl0dgHRnh3x12cz4EhHVP0mS0NXiw8RiJCfw1a5VxYYt9aQC31rY4GZo1V2zZo3dx0E1KBxLqDs+hWixwDcrw5ivLnamBnr4CsX6IGYTZ9AA0OKtfKkDoO3lq3+FJqaOK2bgS0RUz7oDycA3O3kjWpkBQHORtaqUvS7VUtKq9qMf/Qjnn38+hoeH8eqrrwIAvv71r+MXv/iFpQdHzibeJNrL4cU6O4hAS/xMvrPDWhheIZht5RKMpHfJuqqUzS42xEIEvhxeQURU33rVNSwzaNWOKy62Vol10GjJXzWZDny//e1v46Mf/Sje+MY3Ym5uTq3p7ezsxNe//nWrj48cTNT39rb61XKEYp0dRKA1kKrrzRv4au7b6Yr1QcwWVDe2VafMAdCOLc7X1YGlDkREjaA7zz4VdXiFgZK8Ym3RnMT0qvbv//7v+N73voebbroJbnc69b1161a88MILlh4cOZs2K+svUjMqiPZZw53JwDdfsFibpQ4GA99o8RGQdvN709Pb9MTi6XZmRERUv/LtUzEyvCL7Puoy8D106BDOPPPMnK/7/X4Eg0FLDopqw4xmwESxmlFBZBjFrs98dbG1VOog5pSbL3WoZsa3SI1vKuPr4bhiIqK61pNnAIW2LK8Ys1c+q8n0qrZ27Vrs2rUr5+u//vWvsWnTJiuOiWrEjGbARLFL54Lo9St2juYLFmdqYGqb0JMaqTwbiiIh67f800qPK3ZAqUPerg6pjK+HgS8RUT1T63OD2YFv8R6+Qm+ruU3e1WR65f3EJz6B7du3IxwOQ1EU/PGPf8RPfvIT3Hrrrbj99tvtOEZyqKnUC7w74FcvnRvN+IpSh3wtwMTOUBFUOllXS3JksaIkg99idcnqCMgqljr4DG5u8zq8lRwREZUnX0eGoGZzW/H7MLfJu5pMB77vfve7EY/H8clPfhKhUAh/+7d/ixUrVuDf/u3f8Na3vtWOYySH0mZlfW5jNb7ZpQ5F+/jWQKmDx+1CZ4sXc6EYZoIGAl8xAtLJpQ6pPr7s6kBEVN968pTrBU1sbjPbz76aSlp53/ve9+K9730vpqamIMsy+vv7AQDHjh3DihUrLD1Aci7tBrR0xtdYO7OhjmTGd345hlhCzukeoJZR1ECpA5As95gLxZKB/EDh24oNA4Um4diteFcH9vElImoE+Wp81c1tBpI04j4Ww3FE4gl1jXGisla13t5e9Pf3Y3x8HB/84Aexfv16q46LasC0yRpfWVbUTGJ/ux/iKvpsKPPNFkvImAvFANRGxhdIl2QYuczjiM1tRbs6sJ0ZEVEjEOvXYiSecRUw3c6seBDb0exV25rOBmM2HKV1DK9qc3NzeNvb3oa+vj4MDw/jG9/4BmRZxmc/+1msW7cOTz31FP7zP//TzmMlh1HrcA12ddD2+G3xedDVon95RQTCkgT1Nk5nZmqNCHyru7mtWFeH1AAL1vgSEdW19maP7lCpkIm1yuWS1PXa6dPbDK+8n/nMZ/Doo4/i+uuvx/3334+PfOQjuP/++xEOh/HrX/8aF110kZ3HSQ4kLot0B/xFJ4EBmfW/fo8L3QEfpoPRnDpf8cbravGpZ5BOJ1qaGZlaE0xdPqrm5rbiXR1SGV92dSAiqmuSJKEr4MPkYgTTS1F1D86SyWFLPQEfppYijt/gZnhV+5//+R/ceeed+NrXvoZf/vKXUBQFJ598Mn73u98x6G1A4VhCDeC6DZY6iOyiS0pmEvMVw6cD6trI9gJAr4nm3U7I+LKrAxERCXqDmEImhy31mEgAVZPhwHd0dFTt07tu3To0NTXhPe95j20HRs4m3hxet4T2Jk96c1ssf6mDCLL8HjckSUrPB1/KvCwypakdrhWmSh2iThhZbLSrAzO+RET1Tg1aNWuY2bWqVjo7GF7VZFmG1+tV/+52uxEIBGw5KHK+aU1WVpKkdDszAxlfkW3MN+JQBMK10tEBALpFA3AjpQ4RB4wsNprxZeBLRFT3RB9e7Rqmtt40eHUynTWukxpfRVHwrne9C35/8skJh8O48cYbc4Lfu+++29ojJEea1gyvAIp3CQCAcExkfDMD36nswLeGevgKepeJ8nFGVweDk9vYx5eIqO7prWHpwNdYkkYveHYiwyvv9ddfn/H3t7/97ZYfDNUO8eYQYwqN1fimAt9UkKyOOMx6k6SHVzh/apuQrwG4Hmf08U2dqCTyZHxTo5c9LmZ8iYjqnW7gGzWXpEmXS9RJ4HvnnXfaeRxUY7KzsobamWlqfJM/q9/7Vpwt9tZSqYP40AhFkZCVgt0ozF4+skPRGt/U78rrYcaXiKjeic5EU5pEVCjV1cHoRmwzVz6riekcKsnUUnbga7yrQ3apQ/aGsFosdRD9CxUFmAsVftOn559XM/AtUuqQyvh6mfElIqp7evW56gALn9FSBwa+VMfEm0O8WdJdHQyUOqQC33yXRdL1w7UT+HrdLnQ0Jzd/FnrTxxOyWuvsjIwvN7cRETW67Cuw8YSsrg+GM75q1tjZm9u4qlFJxJujJ9XNIN3VoXg7M9HVQQTNc6GYupkK0I5Crp0aX8BYfVNI0+7N6Fm0HYq3M0tNbuPmNiKiupe9folWZoDxYUvq6ONwvOBG92pj4EslySl18BpoZxYTpQ7JN1Fniw9SKq6aDSVne8cTMuZS/19L7cyAdCBfaEerqO/1uCQ1+KyGYr8vdXIbA18ioron1q/FcByReEIdXuF1S+qaXUxHs1fd3zJbpOSvmhj4UklmsoZMiDdGobO87FIHt85sbxEAS1K6brZWdBvoYRhUR0Amh3hUS7Hfl+jqwFIHIqL6196kCVqDMc1aZbwkz+WS0NWSLPlzckszrmpUkrK6OnjTZ49qsJh6k4j77dScOdYKtYdhgVIHJ4wrBgzU+MZFqQM/IoiI6p0rKxFV6lplZopptXBVI9PCsYS621PU+BYLpLTf017i78kacTitTm2rrfpeQNOXuFDgK/oiVj3wFV0d9E9U4nJqc1uNnXwQEVFpxBo2vRTV9PA1txelJ0+bUidh4EumiRe01y2hvSkZwBWbBAbktjMDcgc/TNdgKzOh20CNr+iLGKjixjYgvcEw34lKNMFSByKiRqJtR6aWOpjN+LYWXwerrbppJ6pJIkjtavGpdapGSh0iWQMsAG2wGMm4755aDnwL1fhGqz+8Akj/vuKygnhCzilpiLOrAxFRQ+nWXIEVW1BaTU4YrYUhFkzn5LFjxw5s2rQJ27Ztq/ahOI5eVrZYBhFIZ4N9moxvdl2sCIBrMePb21r8Ek8pGwbsILo6APpji+PM+BIRNZT0GhbRDK9gjW/D2L59O0ZGRrBz585qH4rjiK4FvZo6XJFBLNzVIbfUIbsudjqrP3AtMVLqkN4wUOVSB01Aq/c7i3KABRFRQ9GuYWbHFQti7XZyqQNXNTJteik342tsZLHo6qDN+GZubqvlUgdxzLOhKORUO7BsTtnc5nG74EltXNP7nYnNbSx1ICJqDNr1uPTNbSx1oDqkV+pgqp1ZgRrfWt7c1pU6ZlkB5pZjurdxSjszQPM709mQKEodfMz4EhE1hJ6MzW3ltjNj4Et1RPTc7dVMVtNOAlMU/WynfqlDZl2s2s6sBgNfr9uFjuZk8+58QyzEGMhqjisW1E4cOicrotTBw3ZmREQNoUezHqfXKnOBb7olGmt8qY6ks7LaGt9kEKUoQCyRL/DN7eMrzg7nlmNIyEq61KEGa3yBdMA+lae+SZxFB6q8uQ1IZ3N1Sx1Sv0MOsCAiagzd6vqVHmARMLkfRcQFC+E4Yjobp52AqxqZJnZr6pU6APnLHcQlde3ktmRLtGTAPL0UUUsEarHUAcjsg6hHdHWodjszQJulz/19iXZmLHUgImoMInGzGI5jLpRci82uVZ3NXogLhbMOLXfgqkampbOymnZmRboEAOkAS3tbt0tCZ6o84MDEEkSVhJj3XWuK1TeFoqWdRduhUI1vVM34stSBiKgRdDR74U5FrUdnQwDMl+VpRx/nu/JZbQx8yTRR46utw3W5pIKXzrVf13Z1ANJlDfsnlgAkg95avcSu1kjVQKmD2olDr4+vGFnMwJeIqCFog9Yjs8sAStuInT2R1WlqM7qgqonEE1hMBW89gcw6XH+RIRZ6Nb5AOku6f2Ix4++1qKdI8251w4DDM76xOPv4EhE1GrGGiSu3pQxbcvoQC65qZIo4g/O4JLQ3Z74hCtWMAvrtzID0G23f8aXU32tzYxtQvNTBUe3MCvy+YjI3txERNZrsxFNJGd9A8Smm1cRVjUwRwyu6Aj5IUuZlcPXSuU4GEdBvZwZoMr7H6yDjKy7xFCl1qPbIYqBYV4dUxpftzIiIGkZ3a+b6W8rVSSNTTKuJgS+ZUmiymtFSh6Y8Nb6zqV2kPa01HPgWONNVFEUtdXBExjfPtL2ErEAMnmOpAxFR4+i1IuPbWvjKZ7VxVSNT9Do6CL4i09vUdmZ5Sh3y/b2WFKptisRlJFIRpSNqfEWpQyzz96XtvciuDkREjaM7q9SwlGFL6QlwrPGlOjC1JHr45tbhioyvXjszRVHS7czylDrk+3stEScEs6EYZDlzkEcomg4wW7wOCHzF7yurq0Ncc9zM+BIRNY6cUoeSNrcl4wOWOlBdKFzqoH/pHEgGUyKeyq7xzb6v7hqd2gZAbQWTkBXMp4ZxCKK+t8nrcsSmsXw12THN74+BLxFR49CWOjR73WpfXzOKDXKqNq5qZErBwLdAlwBtFjin1CEr0M2uMaolPo8L7U3JM+Tscodg1Dk9fIH8NdmxVA9fSUJJH3pERFSbtFdcSx201MsaX6onYhJL9uUQoHBfWG1wVbTUoYY3twHpQD77Mk969rlDAt88Jyrx1NQ2ZnuJiBqLdv9OqWuVWNPnl2MZe0acgisbmSKK1c2WOojgyuuWcrKI2eOJa7nGF8h/mScYSQ2vKGGzgB18bv3fV4ytzIiIGpJ2/06pbTc7W3wQ3U5nHZj1ZeBLpohgrtDmNr1Sh3wdHYDkkARt8NvdUtuBb0+eIRZOGl4BaLs6ZAe+HF5BRNSIOpu9EDmP1hJLHdya0cdOLHfgykamTBtoZ6bX1UFkFbPLHASRJe1s8dZ8wKX2MMwudVDHFTsk8M1zohKXOa6YiKgRuVySuh6XM2ipx8Eb3LiykWGReAKL4WTW0uwAi3xT2wQx+KHWyxwAbalD1uY2NePrjFIHkX3PPlGJxUWNL0sdiIgajVjDyrk62Z3nyqcTMPAlw2aDyfZcbpeE9iZvzvf93kI1vqLUoXDGt5aHVwhqD8PsUoeoc8YVA8W7OnB4BRFR40lnfEtP0qSvfDpviIUzVmCqCaI9V3fAB5fOxqd0V4f87cz0anyB9JukR6d2uNaIVi67j81jx0MH1K8/vn8KABBwyOa2fF0dRB9fljoQETUe0ZmonA5EYi13YqkDA18ybC6UzPhmd2EQDJU6ePWDqcH2puR/O5rKPs5qG0j9W16ZDuGrD+zN+X6XQ7LaPrf+70tMbvO6GPgSETUasR53lbHR3MmlDgx8ybBEKiBy5wmICrYzixUudfib16xGNCHjLVtXWXGoVXXOCd342BtOxtHZ5ZzvtTZ58LevWV2Fo8qllqbkdHVgqQMRUaO64XVr0eJz429eU/p6fMaqTvz12SuxdU2XhUdmDQa+ZBmRzS3U1SFfqUNvqx8fu+wU+w6uglwuCR+89KRqH0ZR+bo6xDjAgoioYa3obC57Pb5kQz8u2dBv0RFZiysbWSZ96Vynj2/qa/namVHlicA3mjVZJy4GWDDjS0REdYZRCFkmvVnKfFcHqjy1NCW71CFV0uJhjS8REdUZrmxkmXyBFKDt6sCXnFPkO1FRuzrwd0VERHWGKxtZpuDI4iI1vlR5RSe36bSsIyIiqmUMfMkyhbs6FG5nRpXn07SfUxRF/To3txERUb3iykaWYY1vbREnKoqSDnYBtjMjIqL6xSiELKN2CSihnRlVnvYkRFvuEGfGl4iI6hRXNrKMr2CNL9uZOY028NWerETZzoyIiOoUoxCyTKGuDsUmt1HlSZKUUecriIyvhxlfIiKqM1zZyDJ+nSBKiCQY+DqR3u+MXR2IiKheMQohy2gngcmykvE9NePrZY2vk+i1NEuXOvDjgYiI6gtXNrKMNqjNHoMrAitmfJ1FrzyFpQ5ERFSvuLKRZTK7BGQHvuzq4ES6pQ7c3EZERHWKgS9ZxuOSIKVipezODiKwYlcHZ/HptKCLsp0ZERHVKa5sZBlJktIZxKzODurkNga+jiLKUzL7+HKABRER1SdGIWSpfGOLo5zc5kj6XR1SGV8Xf1dERFRfuLKRpfS6BCT/zq4OTlS4qwMzvkREVF8Y+JKl/F79Xr4RZnwdSa80JV3qwN8VERHVF65sZKl809vYzsyZ9EpTYqnNbT4GvkREVGe4spGltEMstFjq4Ex+na4OMW5uIyKiOsXAlyzlUy+dp2tGFUVRAytmEZ0lXZqi7erAARZERFSfuLKRpfS6BGj/XwRa5Az6pQ7iJIUZXyIiqi+MQshSeoGUtuyBNb7OoneiEku1M/OwnRkREdUZrmxkKb32WNqNbix1cBa90hQOsCAionrFKIQspU4Ci2lLHdIdHSSJwZST6GZ8E6zHJiKi+sSVjSyl19WBPXydS680hZvbiIioXnFlI0vpDUQQ/89WZs4jNhtmtDOTWepARET1iYEvWcqnV+Ob+n9eOncevZrsWJwDLIiIqD5xZSNL6V06Tw+v4MvNaXRLHZjxJSKiOsVIhCyll0GMqjW+LHVwGr3SFDGymO3MiIio3nBlI0upk8Bi3NxWC/RKU9jVgYiI6hVXNrKUyOpmdnVItzMjZync1YGlDkREVF8YiZCl2NWhtmR3dVAURT1p8TLjS0REdYYrG1lKd3IbSx0cK3uARSI1rhgAvMz4EhFRnWEkQpby6UwCU9uZMfB1nHSpQ/J3FNcEvhxgQURE9YYrG1mqYDszBr6Ok12aoq3NZsaXiIjqDSMRspTa1YHtzGpCdoZebGwDAC/bmRERUZ3hykaW0t3cxq4OjiV+J9GEDFlWEE9lfF0S4HIx40tERPWFkQhZSredWYyT25xK22kjmpDZ0YGIiOoaVzeylH7Gl6UOTqXNwkfislrqwMCXiIjqEVc3spR+OzOWOjiVxyVBVDRE4gnE5eRJCodXEBFRPWIkkseOHTuwadMmbNu2rdqHUlPY1aG2SJKU/p3FZETjzPgSEVH94uqWx/bt2zEyMoKdO3dW+1BqSrqrQzrwjTLwdTTt70xkfL3c2EZERHWIkQhZSgS3CU2HANb4OpvPnS5PiSVEqQM/GoiIqP5wdSNLaYPbqBr4pmp82dXBkbQZ35i6uY0ZXyIiqj+MRMhS2rHEorOD2s6MpQ6OpLagY1cHIiKqc1zdyFJul6RmC0WJA0sdnM3v0WZ82ceXiIjqF1c3spy2ZlT7Xx8zvo6U7r2srfFlqQMREdUfRiJkOTENLDfjy5ebE2lb0MXlVKmDi78rIiKqP55qHwDVn+zpbVGWOjiaT1PqIMpUvB5mfImIqP4w8CXLicA3mhClDqnAl10dHClz2l7y5MTDjC8REdUhBr5kOe0ksOR/ObLYydTSlJgMt5TK+LLGl4iI6hADX7Jc9vQ2dnVwtnSGXoY3IQJfnqQQEVH94epGltNeOo8n0hummPF1Jm1NthhgwcltRERUj7i6keW0m6XE9Dbt18lZ0l0d0u3MvC6WOhARUf1hJEKW09b4ijrf5Nf5cnMibWmK2s6MGV8iIqpDXN3IctpSB5HxdbskXj53KO3AEQ6wICKiesZIhCynHYErMr7M9jqXmvGNcWQxERHVN65uZDntJDAxrpiBr3OJ31c0ISOeEKUOzPgSEVH9YTRCltPWjLKVmfOxqwMRETUKrm5kOW3NqMj4sqODc2lrslnqQERE9YyrG1lOWzPKGl/nUye3xWXEZbYzIyKi+sVohCyXUeObyiCKYJicJ52hZ6kDERHVN65uZDl1BG5GVwfW+DpVuiZbW+rAjC8REdUfBr5kOW3NKLs6OJ92c1u6qwN/X0REVH+4upHltDWj6a4OfKk5lbadWZQDLIiIqI4xGiHLZQywYDszx8vM+LKrAxER1S+ubmQ5nxpIJRCJsZ2Z0zVpanzjMgdYEBFR/WI0QpbLnNzGUgen0/6+oqnfl8fF3xcREdUfrm5kOW1XBxFIsZ2Zc/k0pSnpjC9/X0REVH+4upHlMrs6sMbX6cTvKyErCKdKU1jqQERE9YiBL1kus6sD25k5nfakJBiJA+AACyIiqk9c3chy7OpQW7QbD5cizPgSEVH9YuBLlvNndHVgja/TuV2SGuiKjC9rfImIqB5xdSPL+TIyvql2ZgykHE1k5JfVGl/+voiIqP5wdSPL6bYzY8bX0bL7LHtcLHUgIqL6w2iELKcNcsWlc9b4Olv25kNmfImIqB5xdSPLaYOohXAs52vkPLmBLzO+RERUfxiNkOW09bwLyyLjy5eak2Vn5JnxJSKiesTVjSwnSZIa6KoZXy9LHZwsuwbbw4wvERHVIQa+ZAuxWWoxnMz4squDs7HGl4iIGgFXN7KFuHSekJXk39nVwdFySh1c/H0REVH94epGtsjOILLG19ly2pmx1IGIiOoQoxGyRXaGl+3MnI2lDkRE1Ai4upEtsgNdZnydje3MiIioETAaIVvklDqwxtfRtCcqHpcESWLgS0RE9YfRCNkit8aXpQ5Opj0xYX0vERHVKwa+ZIvszVIsdXA27e+HHR2IiKhecYUjW2RneNnH19m0JypenqQQEVGd4gpHttBeOve5XXC5ePncybJrfImIiOoRA1+yhfbSOcscnC+j1IHZeSIiqlNc4cgW2gwiOzo4X2bgy4wvERHVJ0YkZIvMjC87Ojid36spdWDGl4iI6hRXOLKFNsvLUgfn0/6OWONLRET1ihEJ2cKvyRpmtzYj59Fm5fn7IiKiesUVjmyhvXTOjK/z+ZjxJSKiBsCIhGzBGt/aklHqwBpfIiKqU1zhyBYZgS+7Ojie9vfFYSNERFSvuMKRLTLambHUwfEyuzqw1IGIiOoTIxKyRWZXB5Y6OB0HWBARUSPgCke24OS22sIBFkRE1AgYkZAttF0C2B7L+TK7OvD3RURE9YkrHNmCNb61Rfv7YqkDERHVK65wZIvMrg6s8XU6bU02Sx2IiKheMfAlWzDjW1sy+/gy8CUiovrEiIRskdnVgS8zp9P27mWpAxER1SuucGQLTm6rLZIkqb8zBr5ERFSvuMKRLdjVofaIwNfjYqkDERHVJ0YkZAvW+NYeX+p3xowvERHVK65wZIvMrg58mdWCdKkDM75ERFSfGJGQLVjjW3vECYqHGV8iIqpTXOHIFh63C+5UrShLHWqDn6UORERU57jCkW1EwMuMb21gqQMREdU7T7UPgNJC0Tge3TcJlyThslMHi94+GInjyZenkZDlsh63s8WHc07ohsvi3fx+jwuhaII1vjWC7cyIiKjeMfB1kOmlKG78f59Fk9eFPV+4sujt/+ne3bj7uWOWPPZ33n4WrjhtyJL7Elp8HsyGYmjmyOKa0OJL/p5YmkJERPWKgW8NG18IAwDW9QbQHfCVdB8vTy5hNhTD+HzYykMDAHzo0pPw7OFZbBxqt/y+yXo3vG4tWpu8uPiU/mofChERkS0Y+NaBD/3ZSbjmjBUl/ewH/u+z+O/nxyw+oqS3bFuFt2xbZct9k/UuOKkPF5zUV+3DICIisg2vaRIRERFRQ2DgS0REREQNgYEvERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNgYEvERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNgYEvERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNgYEvERERETUEBr5ERERE1BAY+BIRERFRQ2DgS0REREQNwVPtA3A6RVEAAAsLC7Y/1uJCCHIkhITsMvR4seUg5EgIoaXFko8vGlqCHAlhOVj8PoJLi5AjIcTD7oo8H0RERERGiLhExG35SEqxWzS4o0ePYtWqVdU+DCIiIiIq4siRI1i5cmXe7zPwLUKWZYyOjqKtrQ2SJNn+eAsLC1i1ahWOHDmC9vZ22x+Pkvi8Vwef9+rg814dfN6rg897dVT6eVcUBYuLixgeHobLlb+Sl6UORbhcroJnDnZpb2/nG7QK+LxXB5/36uDzXh183quDz3t1VPJ57+joKHobbm4jIiIioobAwJeIiIiIGgIDX4fx+/24+eab4ff7q30oDYXPe3Xwea8OPu/Vwee9Ovi8V4dTn3dubiMiIiKihsCMLxERERE1BAa+RERERNQQGPgSERERUUNg4EtEREREDYGBr4N861vfwtq1a9HU1ISzzz4bjz32WLUPqa7ccsstkCQp48/g4KD6fUVRcMstt2B4eBjNzc24+OKL8eKLL1bxiGvTo48+ije96U0YHh6GJEm49957M75v5HmORCL44Ac/iN7eXgQCAVx99dU4evRoBf8VtafY8/6ud70r5/X/2te+NuM2fN7NufXWW7Ft2za0tbWhv78fb37zm7F3796M2/D1bj0jzztf79b79re/jdNPP10dSHHuuefi17/+tfr9WnmtM/B1iLvuugsf/vCHcdNNN+G5557DBRdcgCuvvBKHDx+u9qHVlVNPPRVjY2PqnxdeeEH93le+8hXcdttt+OY3v4mdO3dicHAQb3jDG7C4uFjFI649wWAQW7ZswTe/+U3d7xt5nj/84Q/jnnvuwU9/+lM8/vjjWFpawlVXXYVEIlGpf0bNKfa8A8AVV1yR8fq/7777Mr7P592cRx55BNu3b8dTTz2FBx98EPF4HJdddhmCwaB6G77erWfkeQf4erfaypUr8eUvfxlPP/00nn76abz+9a/HNddcowa3NfNaV8gRzjnnHOXGG2/M+NqGDRuUT33qU1U6ovpz8803K1u2bNH9nizLyuDgoPLlL39Z/Vo4HFY6OjqU73znOxU6wvoDQLnnnnvUvxt5nufm5hSv16v89Kc/VW9z7NgxxeVyKffff3/Fjr2WZT/viqIo119/vXLNNdfk/Rk+7+WbmJhQACiPPPKIoih8vVdK9vOuKHy9V0pXV5dy++2319RrnRlfB4hGo3jmmWdw2WWXZXz9sssuw5NPPlmlo6pP+/fvx/DwMNauXYu3vvWtOHjwIADg0KFDGB8fz/gd+P1+XHTRRfwdWMjI8/zMM88gFotl3GZ4eBinnXYafxdlevjhh9Hf34+TTz4Z733vezExMaF+j897+ebn5wEA3d3dAPh6r5Ts513g690+iUQCP/3pTxEMBnHuuefW1Gudga8DTE1NIZFIYGBgIOPrAwMDGB8fr9JR1Z/XvOY1+OEPf4gHHngA3/ve9zA+Po7zzjsP09PT6vPM34G9jDzP4+Pj8Pl86OrqynsbMu/KK6/Ej3/8Y/zud7/Dv/zLv2Dnzp14/etfj0gkAoDPe7kURcFHP/pRvO51r8Npp50GgK/3StB73gG+3u3ywgsvoLW1FX6/HzfeeCPuuecebNq0qaZe656KPRIVJUlSxt8VRcn5GpXuyiuvVP9/8+bNOPfcc3HiiSfiBz/4gbrpgb+DyijleebvojzXXXed+v+nnXYatm7dijVr1uB//ud/cO211+b9OT7vxnzgAx/A888/j8cffzzne3y92yff887Xuz1OOeUU7Nq1C3Nzc/j5z3+O66+/Ho888oj6/Vp4rTPj6wC9vb1wu905ZzwTExM5Z09knUAggM2bN2P//v1qdwf+Duxl5HkeHBxENBrF7Oxs3ttQ+YaGhrBmzRrs378fAJ/3cnzwgx/EL3/5Szz00ENYuXKl+nW+3u2V73nXw9e7NXw+H9avX4+tW7fi1ltvxZYtW/Bv//ZvNfVaZ+DrAD6fD2effTYefPDBjK8/+OCDOO+886p0VPUvEongpZdewtDQENauXYvBwcGM30E0GsUjjzzC34GFjDzPZ599Nrxeb8ZtxsbGsHv3bv4uLDQ9PY0jR45gaGgIAJ/3UiiKgg984AO4++678bvf/Q5r167N+D5f7/Yo9rzr4evdHoqiIBKJ1NZrvWLb6Kign/70p4rX61XuuOMOZWRkRPnwhz+sBAIB5ZVXXqn2odWNj33sY8rDDz+sHDx4UHnqqaeUq666Smlra1Of4y9/+ctKR0eHcvfddysvvPCC8jd/8zfK0NCQsrCwUOUjry2Li4vKc889pzz33HMKAOW2225TnnvuOeXVV19VFMXY83zjjTcqK1euVH77298qzz77rPL6179e2bJlixKPx6v1z3K8Qs/74uKi8rGPfUx58sknlUOHDikPPfSQcu655yorVqzg816G973vfUpHR4fy8MMPK2NjY+qfUCik3oavd+sVe975erfHpz/9aeXRRx9VDh06pDz//PPKZz7zGcXlcim/+c1vFEWpndc6A18H2bFjh7JmzRrF5/MpZ511VkZrFirfddddpwwNDSler1cZHh5Wrr32WuXFF19Uvy/LsnLzzTcrg4ODit/vVy688ELlhRdeqOIR16aHHnpIAZDz5/rrr1cUxdjzvLy8rHzgAx9Quru7lebmZuWqq65SDh8+XIV/Te0o9LyHQiHlsssuU/r6+hSv16usXr1auf7663OeUz7v5ug93wCUO++8U70NX+/WK/a88/VujxtuuEGNUfr6+pRLL71UDXoVpXZe65KiKErl8stERERERNXBGl8iIiIiaggMfImIiIioITDwJSIiIqKGwMCXiIiIiBoCA18iIiIiaggMfImIiIioITDwJSIiIqKGwMCXiKgO3XLLLTjjjDOqfRhERI7CARZERDVGkqSC37/++uvxzW9+E5FIBD09PRU6KiIi52PgS0RUY8bHx9X/v+uuu/DZz34We/fuVb/W3NyMjo6OahwaEZGjsdSBiKjGDA4Oqn86OjogSVLO17JLHd71rnfhzW9+M770pS9hYGAAnZ2d+NznPod4PI5PfOIT6O7uxsqVK/Gf//mfGY917NgxXHfddejq6kJPTw+uueYavPLKK5X9BxMRWYSBLxFRg/jd736H0dFRPProo7jttttwyy234KqrrkJXVxf+8Ic/4MYbb8SNN96II0eOAABCoRAuueQStLa24tFHH8Xjjz+O1tZWXHHFFYhGo1X+1xARmcfAl4ioQXR3d+Mb3/gGTjnlFNxwww045ZRTEAqF8JnPfAYnnXQSPv3pT8Pn8+GJJ54AAPz0pz+Fy+XC7bffjs2bN2Pjxo248847cfjwYTz88MPV/ccQEZXAU+0DICKiyjj11FPhcqXzHQMDAzjttNPUv7vdbvT09GBiYgIA8Mwzz+DAgQNoa2vLuJ9wOIyXX365MgdNRGQhBr5ERA3C6/Vm/F2SJN2vybIMAJBlGWeffTZ+/OMf59xXX1+ffQdKRGQTBr5ERKTrrLPOwl133YX+/n60t7dX+3CIiMrGGl8iItL1tre9Db29vbjmmmvw2GOP4dChQ3jkkUfwoQ99CEePHq324RERmcbAl4iIdLW0tODRRx/F6tWrce2112Ljxo244YYbsLy8zAwwEdUkDrAgIiIioobAjC8RERERNQQGvkRERETUEBj4EhEREVFDYOBLRERERA2BgS8RERERNQQGvkRERETUEBj4EhEREVFDYOBLRERERA2BgS8RERERNQQGvkRERETUEBj4EhEREVFDYOBLRERERA3h/wcq3pqsNI9okAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Compute the relative energy error over the time grid.\n", "en_hist = cf_en(np.ascontiguousarray(out.transpose()))\n", "E_err = abs((orig_en - en_hist[0]) / orig_en)\n", "\n", "# Plot the energy error.\n", "from matplotlib.pylab import plt\n", "fig = plt.figure(figsize=(8, 6))\n", "plt.semilogy(t_grid, E_err)\n", "plt.xlabel(\"Time\")\n", "plt.ylabel(\"Rel. energy error\");" ] }, { "cell_type": "markdown", "id": "a266b791-00ee-4f61-a51b-3e432342976f", "metadata": {}, "source": [ "We can see indeed how the energy error is kept at around the epsilon of single precision.\n", "\n", "Other classes and functions\n", "---------------------------\n", "\n", "Besides the adaptive integrator, several other classes and functions in heyoka.py can be used in single precision. The [event classes](<./Event detection.ipynb>), for instance, can be constructed in single precision:" ] }, { "cell_type": "code", "execution_count": 8, "id": "8854217a-ad5c-4f6c-be8f-ea9843f9aa7c", "metadata": {}, "outputs": [], "source": [ "# Construct a terminal event in single precision.\n", "ev = hy.t_event(x, fp_type=np.single, cooldown=np.single(1e-8))" ] }, { "cell_type": "markdown", "id": "266d9a1a-9c24-45b3-a10f-e031dace2418", "metadata": {}, "source": [ "As with the adaptive integrator, in order to enable single precision we must pass the ``fp_type`` keyword argument, and any numerical quantity passed to the constructor (such as the cooldown in this specific case) must also be created in single precision.\n", "\n", "Note that the precision of an event must match the precision of the integrator object in which the event is used, otherwise a runtime error will be raised during the construction of the integrator." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 5 }