{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "/* \n", "* @Author: paul\n", "* @Date: 2016-02-25 17:35:32\n", "* @Last Modified by: paul\n", "* @Last Modified time: 2016-02-25 17:45:54\n", "*/\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " sheet = '../css/custom.css'\n", " styles = open(sheet, \"r\").read() \n", " return HTML(styles)\n", "css_styling()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# OOP Predator Prey Agent Based Modelling in Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use what you have learned through this intermediate Python course to produce a *'predator-prey'* agent based modelling simulation. Your task is to program the classes which describe the eating and moving behaviour of a predator and its prey - we'll use rabbits and foxes in this example.\n", "\n", "This exercise will test your knowledge of inheritance, and is specifically designed to demonstrate polymorphism in action. The main iterative algorithm and many functions are provided; your tasks is to generate the underlying classes.\n", "\n", "|Class: Predator | Class: Prey |\n", "|-----------------------------|----------------------------|\n", "|![The_Predator](data/fox.png)|![The_prey](data/rabbit.png)|\n", "\n", "**Note: do not get confused between the current task and the \"predator prey problem\", which models the interactions between predator and prey through differential equations**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementation\n", "\n", "We'll assume the rabbits move only in a random direction, simulating a grazing behaviour, and that foxes move towards their nearest prey. Detailed breakdown of the algorithm is provided under [Task breakdown](#Task-Breakdown).\n", "\n", "## What you have been given\n", "\n", "Constants:\n", "\n", ">* $N_r$ - number of rabbits\n", ">* $N_f$ - number of foxes\n", ">* $age_f$ - maximum \"age\" at which foxes die\n", ">* $age_r$ - maximum \"age\" at which foxes die\n", ">* $speed_f$ - fox move speed\n", ">* $speed_r$ - rabbit move speed\n", "\n", "You have been given the `Agent` class from which your Predator and Prey classes will inherit. This contains:\n", "\n", "* `__init__(self, age, location, age_death, image)` initialiser. Stores the attributes:\n", " - age: the age to give this Agent on construction (int)\n", " - location : array of (x, y)\n", " - age_death : age (iteration) at which this agent will 'die'\n", " - isalive : bool\n", " - image : image file name to be used for plotting (images seen in the table above)\n", " \n", "* `update_ periodic_boundaries` - checks if self.location is within a box from 0,0 to 1,1, otherwise resets the location to appear on the other side of the box\n", "\n", "* `move`, method - does nothing: **MUST BE REDEFINED IN DERIVED CLASSES**\n", " - *Note that this class inherits from the metaclass ABCMeta using the Python2 - Python3 cross compatibility `six` package. This helps achieve polymorphism by enforcing us to redefine the move method in all derived classes (otherwise an error will be raised), ensuring the API remains complete and consistent*\n", "\n", "* **All other functions should be self explanatory**\n", "\n", "Some helper functions are also provided, which should be self explanatory and are already called for you in an iterative fashion. You do not need to know what these do." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Task Breakdown\n", "\n", "The classes you are required to implement are:\n", "\n", "* **`Prey`** class inherited from `Agent` with the following attributes and methods:\n", " - class attributes: **Prey.age_death** and **Prey.speed**\n", " - `__init__` : has the same arguments as `Agent.__init__`, and simply calls the parent class `__init__` with\n", " > super().__init__(age=age,\n", " > location=location,\n", " > age_death=Prey.age_death,\n", " > image='rabbit.png')\n", " \n", " - Try to understand this line : ask the demonstrators if you need help\n", " \n", " - A `move` method, to override the base `Agent` class\n", " - The algorithm should be (where each line can be calculated either simply or by a function in the base class):\n", " > if [I am] alive\n", " > vector = get random vector\n", " > get distance (vector)\n", " >\n", " > scale vector to unit length using distance\n", " >\n", " > update location by (unit vector * Prey.speed)\n", " >\n", " > update_periodic_boundaries \n", " >\n", " > increment_age\n", " > else\n", " > do nothing\n", "\n", "* **`Predator`** class inhertied from `Agent` class with the following attributes and methods:\n", " - class attributes: **Predator.age_death** and **Predator.speed**\n", "\n", " - `__init__` : same args as Agent, but also includes preylist (the list of prey)\n", " - pass all arguments to parent `__init__` with super as you did in the Prey class, but with `image=fox.png`\n", " - add preylist as an attribute with `self`\n", " \n", " - `find_prey(self)` : to save time we provide the code for this method\n", " > def find_prey(self):\n", " > \"\"\"Searches through the location of prey items in\n", " > preylist and updates self.nearest prey\"\"\"\n", " > max_distance = 10 # No prey this far away\n", " > for prey in self.preylist:\n", " > vec = self.get_vector(prey.location)\n", " > distance = self.get_distance(vec)\n", " > if distance < max_distance and prey.isalive:\n", " > max_distance = distance\n", " > self.nearest_prey = prey\n", " \n", " - A **`move`** method, to override the base `Agent` class abstract `move` method\n", " - The algorithm should be (where each line can be calculated either simply or by a function in the base class):\n", " \n", " if [I am] alive\n", " find nearest prey\n", "\n", " if nearest prey is alive:\n", " get vector to nearest preys location\n", " get distance (vector)\n", "\n", " if distance is less than Predator.speed\n", " kill the prey\n", "\n", " else move:\n", "\n", " scale vector to unit length\n", "\n", " update location by (unit vector * Predator.speed)\n", "\n", " else if prey is dead:\n", " remove prey from preylist\n", "\n", " increment_age\n", "\n", " else if [I am] dead\n", " do nothing\n", " " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pylab as plt\n", "from matplotlib import image\n", "import os\n", "plt.rcParams['figure.figsize'] = (18.0, 10.0)\n", "from abc import ABCMeta, abstractmethod\n", "import six\n", "%matplotlib inline\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Constants:\n", "Nr = 15\n", "Nf = 3\n", "age_r = 200\n", "age_f = 50\n", "speed_r = 0.02\n", "speed_f = 0.05" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Classes:\n", "class Agent(six.with_metaclass(ABCMeta)):\n", " def __init__(self, age, location, age_death, image):\n", " \"\"\"\n", " Parameters\n", " ----------\n", " age : int\n", " location : array length 2 of scalar\n", " (x, y) location\n", " age_death : age at which this instance dies\n", " image : string\n", " the name of the image\n", " \"\"\"\n", " self._age = age # We don't want anything else to overwrite age: \n", " # Could use encapsulation for self.age\n", " self.location = np.array(location)\n", " self.isalive = True\n", " self.age_death = age_death\n", " self.add_image(image)\n", " \n", " def increment_age(self):\n", " self._age += 1\n", " if self._age >= self.age_death:\n", " self.die()\n", " \n", " @abstractmethod\n", " def move(self):\n", " pass\n", " \n", " def die(self):\n", " self.isalive = False\n", " self.add_image('dead.png')\n", " \n", " def get_vector(self, loc):\n", " \"\"\"Returns a tuple of distance and unit vector from self.location to input loc\"\"\"\n", " assert(len(loc) == 2), \"Location should contain an x and y coordinate\"\n", " vec = loc - self.location\n", " return vec\n", " \n", " def get_distance(self, vec):\n", " return np.linalg.norm(vec)\n", "\n", " def get_random_vector(self):\n", " \"\"\"return a random vector\"\"\"\n", " return np.random.uniform(-1, 1, 2)\n", "\n", " def display(self, fig):\n", " \"\"\"Displays an image of this instance depending on life status\"\"\"\n", " aximg = fig.add_axes([self.location[0], self.location[1], 0.05, 0.05])\n", " aximg.axis('off')\n", " aximg.imshow(self.image)\n", " \n", " def add_image(self, img, path='data'):\n", " \"\"\"updates the image used by display method using imread\"\"\"\n", " self.image = image.imread(os.path.join(path, img))\n", " \n", " def update_periodic_boundaries(self):\n", " if self.location[0] > 1:\n", " self.location[0] -= 1\n", " elif self.location[0] < 0:\n", " self.location[0] += 1\n", "\n", " if self.location[1] > 1:\n", " self.location[1] -= 1\n", " elif self.location[1] < 0:\n", " self.location[1] += 1 \n", "\n", "\n", "# Your classes should be implemented here ...\n", "class Prey(Agent):\n", " age_death = age_r\n", " speed = speed_r # How far the prey can move in one step\n", " \n", " def __init__(self, age=0, location=(0.,0.)):\n", " super().__init__(age=age, location=location, age_death=Prey.age_death, image='rabbit.png')\n", "\n", " def move(self):\n", " \"\"\"Update the position of this instance if self.isalive is true using a prey\n", " type algorithm, i.e. random movement simulating grazing\"\"\"\n", " if self.isalive:\n", " move_vec = self.get_random_vector()\n", " distance = self.get_distance(move_vec)\n", " \n", " # scale by unit vector and scale by speed\n", " move_vec = move_vec / distance\n", " self.location += move_vec * Prey.speed\n", " \n", " # Set up periodic boundaries\n", " self.update_periodic_boundaries()\n", " \n", " # Finally increment the age\n", " self.increment_age()\n", " else:\n", " pass\n", " \n", "\n", "class Predator(Agent):\n", " age_death = age_f\n", " speed = speed_f\n", "\n", " def __init__(self, age=0., location=(0.,0.), preylist=[]):\n", " super().__init__(age=age, location=location, age_death=Predator.age_death, image='fox.png')\n", " \n", " self.preylist = preylist\n", "\n", " def move(self):\n", " \"\"\"Update the position of this instance if self.isalive is true using a predator\n", " type algorithm\"\"\"\n", " if self.isalive:\n", " self.find_prey()\n", " if self.nearest_prey.isalive:\n", " \n", " move_vec = self.get_vector(self.nearest_prey.location)\n", " distance = self.get_distance(move_vec)\n", " if distance < Predator.speed:\n", " # Eat the prey\n", " self.nearest_prey.die()\n", " else:\n", " # Scale movement to unit vector and multiply by speed\n", " self.location += move_vec / distance * Predator.speed\n", " else:\n", " try:\n", " self.preylist.remove(self.nearest_prey)\n", " except ValueError:\n", " print(\"Uh oh, no more prey left!\")\n", "\n", " self.increment_age()\n", " else:\n", " pass\n", " \n", " \n", " def find_prey(self):\n", " \"\"\"Searches through the location of prey items in preylist and\n", " updates this instance's nearest prey\"\"\"\n", " max_distance = 10 # No prey will be this far away\n", " for prey in self.preylist:\n", " vec = self.get_vector(prey.location)\n", " distance = self.get_distance(vec)\n", " if distance < max_distance and prey.isalive:\n", " max_distance = distance\n", " self.nearest_prey = prey\n", "\n", "# =================================================================\n", "# Misc helper functions\n", "# =================================================================\n", "def generate_predator_prey(Npredator, Nprey):\n", " \"\"\"Generate Npredator predators and Nprey prey objects with randomly\n", " distribute locations and ages\"\"\"\n", "\n", " prey_locs = np.random.rand(Nr, 2)\n", " prey_ages = np.random.randint(0, Prey.age_death, Nr)\n", " preys = [Prey(age=prey_ages[i], location=prey_locs[i]) for i in range(Nr)]\n", "\n", " predator_locs = np.random.rand(Nf, 2)\n", " predator_ages = np.random.randint(0, Predator.age_death, Nf)\n", " predators = [Predator(age=predator_ages[i], location=predator_locs[i],\n", " preylist=preys) for i in range(Nf)]\n", " return predators, preys\n", "\n", "\n", "def update_predator_prey(predators, preys, fig):\n", " \"\"\"Updates the locations of all predators and preys in the inputs and\n", " displays them in input fig using the Agent.display method\"\"\"\n", " # Clear the figure first\n", " fig.clf() \n", " for predator in predators:\n", " predator.move()\n", " predator.display(fig)\n", " \n", " for prey in preys:\n", " prey.move()\n", " prey.display(fig)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test case\n", "The code below should test if your classes work as expected" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/sAAAJPCAYAAAAjVMTtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4XdWVN/7v2vuc23Svrrold1tywzbG2LTQDR5aQkIK\nBBIIJTNxJoQ3E97ATBpvEhKSSftN5geDJzOBNFKYvLQkBlJMwtAxg+1Q3KvcZbVbzz1nr/cPScHY\nphhsy5a/n+fRY5B0t/bW8+jcs85ae21RVRARERERERHR0GEGewJEREREREREtH8x2CciIiIiIiIa\nYhjsExEREREREQ0xDPaJiIiIiIiIhhgG+0RERERERERDDIN9IiIiIiIioiGGwT4RERERERHREMNg\nn4iIiIiIiGiIYbBPRERERERENMQw2CciIiIiIiIaYhjsExEREREREQ0x3mBPgIiIiIjoSCYiAgC1\naTP2uDb/sgkjvDn1GTnG91DjnHEalU1V9Si3Q8f/8q4Fi2/a0L51larqYM+biA5twusEEREREdHg\nEBFRVR3fbM/+yJzUrYCODSrOiIgJnXXVsbyN10zd8uAS/exji1bcXSyVCwz0iejNYLBPRERERDRI\nYr6kzjo6dt2VZ1V9ae3WitddiGCMEYFoNiO9W8tTnvzlwjU3rNu4bYkxYpxTN9hzJqLDA8v4ieiI\nxbJJIiIaLAMZ/RMn+Zd+8NTkjdaoly+rGPFEtOIamsZvfXCxu3nhM4vvKJfLJQBgoE9E+4LBPhEd\nkV6rbDKKxJQr1lXHcjZeN1A2+SeWTRIR0X418J5y/qzEJ1MJqRaBCCAC544eF8oDK5pvffjxhfNV\n4fj+Q0RvBbvxE9ERyfeQPG9W/B9vuSL7m4SPtnLFeWKMFTFoqEG+085++Hv3bzn3d/+99M5SuVzk\njRYREe1vdRkzYUyjN1kV4nsGVUlPxzRVJMhevOmBhc/drk6dc47vP0T0ljCzT0RHFJZNEhHRoUBE\nZEyjGZaIIx6GogAwvFaQyY7UHz+15eudnZ0dgz1HIjq8MbNPREeUNyqbXLSp+daHH182PwiCErP5\nRER0IBgRo6paqEi+VFYtBQ5QIJtyrltHr77314/cPthzJKLDH4N9IjrisGySiIgGixGRljo79fI5\n6e9+7uKaX3hWUJUw4hw057L5ux/NfTtyLhpoIktE9FaxjJ+IjigsmyQiosEiIjKqwcz69HvSd45t\nLE4WgSisiHhwDvClELNRZxJ4pRKNiOitYmafiI4YLJskIqLBIiKSjEndp9+TuautRY+qHn6GNLSe\nY/xEE1QjGCMmZkJvemv98SKAtcYf7DkT0eGNwT4RHRFYNklERIPJCOxJk7xLJo6tG5mdeIXLDJ9u\nUtlmGOsDcAAUzolpTJdmnDC5+hJrjWeMmIH3JWPEGCNiRMQYMYbvV0T0BljGT0RDHssmiYhosMV8\nqZo90T87M2pO7LYH1ppzThiFGeN8BMUNAGL93yUysmrDpBvfa//zB4+MGPWbJzZ+17ko9KwkhtV4\nE4bXysSYj1S+JB0bduoLANYZEXF87yKivWCwT0RD2m5lk22ppjM0nkqbrvYlqJS2wxjPWOkrm7z/\nz6tgrfGjyFUGe95ERDS0JHxUjaj3xzo/rS9vfEk+fsnxKPasggsCGD8JIIJIX+Y+ikL/0pODG3sK\nDZ2nTbPm5suz81pb7NRMEr4o4GCwo8fLXXJGw23plP8dEdnOh9VEtDsG+0Q0pO1aNpkZc4FLpOLW\n0yJ6tryEvZVNLlqZv88YiVShqqrGiAGgUAACgUKZQSEion3lWROL26imsu1Z+clXLoUGXVj/0qMQ\nm4BqBAB9Z8FC4VnrW1uqvfYc/1bfZH1roaFzKJak//0nQjYZpj90qv3MlNEts+Yv6Px7EVnJgJ+I\ndsVgn4iGNJZNEhHRoUDVOQdT7t26RIs7VwEIEYYRjHgoVhQJHwB22YavRjwT+gogjCCAwJhX9uk7\nhao6zBq9/ax5F064/Rt3vfxuEckz4CeiAQz2iWhIY9kkEREdCiqRlLqLZntzrWlzkajCQiTSYlnF\nmr5gflcie37u1V8XEUAqUSKc0dJ+/HFHDbvov/9nw10AogO8FCI6TDDYJ6IhjWWTRER0KMiXXOfT\nK9zvRzfGj42Zcgo2Ge4oNbSnZdOopAf7Vsc1Rqy6UvLM6bUfXPRy/NcAOvfjtInoMMaj94hoSNu1\nbHL1n76KNU/8C8qFToh4KFUUwG5x+u5lk9p/xFH/h1NB5AbKJsfdnkzEqnhcHxERvZEpI725rU0y\nu6uQzAWRh4I2VNbvrFoXRVEFEAXe2oNjEQgkjrZmnVWTSTTt73kT0eGLwT4RDWkDZZMQHy4SjSKr\nInDFQNUKsLeyyd29+usiRsRUokQ0UDZphNdSIiJ6fefNTlw/9xj7ztG1HU3peIAaWZ48edRzp9VU\n+QmICl7jwfGbKR4TOJOJFZqOGt984n6fOBEdtniDSkRD2kDZZLHilythGaF64Zbi8PWhwsW819sN\n+fpeKZuMfzCZjFfv10kTEdGQUyxrb3detVC2LlKBQwqVKAv0H/eyh/4g39g4VIM3GF3gSdFNa6s9\ndX/Pm4gOXwz2iWhIY9kkEREdCn78SOETf1ha/pkYcUFFEYaRQrug6gD42D3gVzjEs+NQP+FCxDNj\nAX29vnsGURhJc0PDuAO4BCI6zDDYJ6IhjWWTRER0KOjJ66b5CwpXffXu3MVL14WP5MvSI6kZzk8N\nVxinqk5Vtf8RtAdj40g3TocXz6J6+Imw8Wroa9WjCaAKaanRiQdzTUR0aGOwT0RDGssmiYjoUOD6\nniKHS9ZU7v/OvbkPzH8o/8mXVm981sQb0TjhMq0bOxeJbBuMAVyUR7L2KMTTwyEisLEMUvUzgKgH\ne3vvEigUiupk2HjQF0ZEhywevUdEQ9qPHyl8ouI0d9bR8YuDihorkXq2VxQZiMQBhNi1I7/CIZFt\nQ6Z5FnraH0fQuwGQ1zoRySAKA5ZNEhHRm9J/VKsaI51PLgvuembFtruPa+287JjJm+dcM+8z768b\nj0SxexMqxS7E0/V9Jf5RGaKKZM0Y5LY1wYV5iOyRr+t/AuDxdBgi+itm9oloSGPZJBERHWqcU6cK\nrYRafmJ55c7b7lt2+c/ueejfE4kqF8+0uHTjBBgvAWM8SP+H8ZNI1kyGammP8VShAtVSELxRSRoR\nHUEY7BPRkMaySSIiOhT1Z/khgBgjZvW6dSshAvRn7cX4wECwL33/JmpGwpjkrgVprxCgXArCg7kG\nIjq0sYyfiIY8lk0SEdGhSgGFAtt3dnZGkYoxvioUogqjEZxGMNbBRQ5+ogbGzyAKeiC75uxEoM5q\n2TZvHryVENGhhpl9IjpisGySiIgONQMZ/s7uckcYOYgxIsZX2eW9CP1ZfusnYf0M9qg2U4X1PF25\nYftzg7AEIjpEMbNPREeU3com5T1zj3ulbFL7yiZVHUQjiHOAUSRqRqLQkdx7A3+WTRIR0dukqjqs\noXZZEARhPB73IIAxHpxGEHUQF0EgUPQ1kt3LAFCTNSs35Z886JMnotcl/cc816bN2OPa/MsmjPDm\n1GfkGN9DjXPGaVQ2VdWj3A4d/8u7Fiy+aUP71lX6Zs6AfhMY7BPREYllk0REdKiw1tgocqt/cftN\nS2YcNXlmJCIwXl+Qbxx2rFyASmEroAaV4kaI+K96vYqnRc3uXLR09R8GaQlEtBciIqqq45vt2R+Z\nk7oV0LFBxZkoElOuWFcdy9l43dQtDy7Rzz626E93F0vlwv4K9AEG+0R0hFJVFRHZtWwS8FXUCTSC\naARVBdT9tWwyCnp3H4Rlk0RE9JaJiFiDWGO1aR3ZELOnnTjzVxNbx06LxeK+wAqsD7gAQa4dYbEd\ngEBM4lVjqBqF5vSFzdULd3Qtbx+clRDR3vgekufNil93yxXZL63dWvG6Cw7GGBGINtQgv7U8+8lf\n3r/mhnUbty0xRsz+DPQBBvtEdARj2SQREQ2WgYzftDHe3KvPrvpWzLc+sMxuWfawaRo1U4yfhBer\nghfPIF41EmGxE2L2jAOcOme82uLjL+XuLxZK+UFYChHtZuDv+8RJ/qUfPDV5ozXq5csqRjwRrbiG\npvFbH1zsbl74zOI7yuVyCejrLbW/58Fgn4iOWCybJCKiwaKqWp+Rtpsuq/7+6AavPnLOiFgpbrhP\n1m+8G2J99ZOtqB5xClINU1DsXAynFtAIUAUEUHhqUTRrK3NffGbJggcUe3syTUQH20CG/vxZiU+m\nElIt0tchSuDc0eNCeWBF860PP75wvirc/s7m74rd+InoiCMi4lmJN1bLpJENsen3/frBXxXLpQpE\nVMRCbF9QH+TaUcmvQ6Wwds9A/1VlkzmWTRIR0T47/ejMdeOaU01GIuOZirFSFuv5MDYDg5hGhWXa\nueIOl2v/k/Nj1c7zfGe9hBovCWfS6iTmComTNs2/Z9G1PT09Pc65AxY0ENG+qcuYCWMavcmqEN8z\nqEp6OqapIkH24k0PLHzudnXqDvTfLDP7RHREYdkkEREdKhYuLX8j5+r/csKkhouOaU2crZKMKs4v\nFMqmN1fSjp6SbMnlc135Qm9P6GpKFWdLxUBz+aLr6i26bfl8b/fWjufXr924/aXBXgsRvUJEZEyj\nGZaIIx6GogAwvFaQyY7UHz+15eudnZ0dB2UeB7BqgIjokNRfNvnoK2WTRhAVRSSAWB8DZZPGGnSs\n+PleyyaNFmWtvvOZL9624G96e3uZTSEiIiIiGBHjVF1TrTfzX67JLAojRbbKQhC6Tu/YNVd/5c9T\nwig6KMc2M7NPREecgbJJjYoqJuzbzuT5AOIQOI0Ky9C5YoXGM23wY9WIogCqvqhCQrWq6lwpfszW\n+Xf1lU0eyL1WRERERHR4MCLSUmenXj4nffXnLq65wLMOcV/EObgisvm7H819O3IuGqg0PdDzYbBP\nREcclk0SERER0f4kIjKqwcz69HvSd45tLE4WgSisiHhwDvClELNRZxJ4pYHfAZ8TE1JERERERERE\nb42ISDImdV+7ovqJthZtSzWdqPFU2nS1L0GltB0iHkTC8JlNk/7rq3c8fZmIeFHkKgd6XuzGT0RE\nRERERPQWGYE9aZJ3ycSxdSOzE69wmeHTTSrbDGN99J2IqXBOTGO6NOOEydWXWGs8Y8SIiACAMWKM\nETEiYowY0//5tz2v/TEIERERERER0ZEo5kvV7In+2ZlRc2K3PbDWvLC2ABgPQXEDgIHjm0VGVm2Y\ndON77X+ee/yIa0WMUVX1rCSG1XhTZ47z33vCJP/D00bHzs1m/NFAXw+AtzMv7tknIiIiOkQMZHlq\n02bscW3+ZRNGeHPqM3KM76HGOeM0Kpuq6lFuh47/5V0LFt+0oX3rKjYJJSIaXAkfVSPq/bHOT+vL\nG1+Sj19yPIo9q+CCAMZPAogg0pe5j6LQv/Tk4MaeQkPnadOsufny7LzWFjs1k4QvCjgY7Ojxcpec\n0XBbOuV/R0S2v9XrPPfsExERER0CBrozj2+2Z39kTupWQMcGFWdExITOuupY3sZrpm55cIl+9rFF\nK+4ulsoFBvpERIOvMeuNvflDyT+2TpoxumX6B60GXVi/6A4E+R2A9OXXd83RK5wLIz/0TehbCw2d\nQt0r32CNCsTqc+uq/jh/Qeffb9nRu/KtXO8Z7BMREREdAmK+pM46OnbdlWdVfWnt1orXXYhgjBGB\naDYjvVvLU5785cI1N6zbuG2JMWKcUzfYcyYiIqCh2oz+yoczDzXXaJvnV3lAiDCMYCAoVhQJH9i1\nIl8VCrw6DpddvkH7Inv1pCTPbZ6w8Bt3vfzuYinI72vAzz37RERERINo4AbvxEn+pR88NXmjNerl\nyypGPCMaaUPj6K1/WDbis/969+KL1rdvXwoADPSJiA4dlUhK3UWzHeLDRaJRZFUErhioWgGAV2+9\nF4Hs7tVfFzEiphIlohkt7ccfd9Swi4zse+zOYJ+IiIhoEA1kas6flfhkKiHVIhABRODc0eNCWbSp\n+daHH182PwiCEsv2iYgOPfmS63x6hft9seKXK2EZoXrhluLw9aHCxbzdQ/03zxix6krJM6fHP5hM\nxqv39fVs0Ec0RLHJExHR4aMuYybc+rGayaoqvm9QlfS0rqooQfbiTQ8s/O3t6tQ5XqOJiA5JU0Z6\nc1ubZHZXIZmrSWoqNA2V9Tvj6ybVRM2AZ/pK9ve9s74IRBFHW7POqskkmgB07svrGewTDUGv1eQp\nisSUK9ZVx3I2XjfQ5OlPbPJERDSIRETGNJphiTjiYSgKAMNrBZnsSP3xU1u+3tnZ2THYcyQiotd2\n3uzE9WfPsGcGlQ44tYAuT548qnJa6LICOLxWbl9VIW/wDEDgTCZWaDpqfPOJAJbty7xYxk80BPke\nkufNiv/jLVdkf5Pw0VauOE+MsSIGDTXId9rZD3/v/i3n/u6/l95ZKpeLDPSJiAaHETGqqoWK5Etl\n1VLgAAWyKee6dfTqe3/9yO2DPUciInp9xbL2dudVC2XrIhU4pFCJsujP6O/5gv5bb2PjUA3eYHSB\nJ0U3ra321H2dFzP7REPIQEZ/L02eRLTi6hvHbb3/2co/d+54fudpE8wN//j+zPFf/lBV280frnZh\nFMGTyCRqpnc8u9775gN/fP7fCsVSjg8CiIgODCMiLXV26uVz0ld/7uKaCzzrEPdFnIMrIpu/+9Hc\ntyPnooFr+2DPl4iI9u7HjxQ+UXGaO+vo+MVBRY2VSD3bK4oMROIAQuzafV/hkMi2IdM8Cz3tjyPo\n3QCIfY3RDaIwkOaGhnH7Oi8G+0RDyGs1eYJG7ujxodzxZPznRzWu/ZsRk2Kn5UsuAUQolj1AQ22q\nTdsdOunxn/x+43Wr12x8IahUyoO9HiKioUpEZFSDmfXp96TvHNtYnNy3L9OKiAfnAF8KMRt1JoFX\nru1ERHRo6snrpvkLClc9uazyX++cHb9uQos/s6ZhRsaTkgnL26GRAwABBCIejPWQbpwOL55F9fAT\n0bm2G2FQgGAvl3sB1EFaanTivs6LZfxEQ0xdxkwY0+hNVoX4Xl+Tp7HDQvlL58kdZ45b/c4pI71z\nO3NRQgRG4Zm4F7rqmrp1v1/R+I/fuPOJs19evua5Shi+UT0RERG9RSIiyZjUffo9mbvaWvSo6uFn\nSEPrOcZPNEE1gjFiYib0prfWHy8CWGv8wZ4zERG9tv4GquGSNZX7v3Nv7gPzH8p/8qXVG5818UY0\nTrhM68bORSLbBmMAF+WRrD0K8fRwiAhsLINU/Qwg6sHeSv4FCoWiOhk27uu8mNknGkJeq8lTR6lR\nG8xi29Jsxq/YVNGYZ6wqtLkuja3RhId+9PCym9a2L1schmEFYBaJiOhAMgJ70iTvkolj60Zmxlzg\nEqm49bSIni0voa+Rk8I5MY3p0owTJldfsmhl/j5jJFKFqqoaIwaA9m8FFSiUnfqJiAZX//2zGiOd\nTy4L7npmxba7j2vtvOyYyZvnXDPvM++vG49EsXsTKsUuxNP1UHVAVIaoIlkzBrltTXBhHiJ75OP7\nnwB4+9zNn5l9oiHi9Zo8dfS44vBa1CggRkScQhurI0XN9Ge++aMn3rdq/dZFA4E+EREdWDFfqmZP\n9M/OjJoTu+2BteaFtQXAeAiKGwAMJPFFRlZtmHTje+1/nnv8iGtFjFFV9awkhtV4U2eO8997wiT/\nw9NGx87NZvzRQF8PgMFbFRERAYBz6lShlVDLTyyv3Hnbfcsu/9k9D/17IlHl4pkWl26cAOMlYIwH\n6f8wfhLJmslQLe0xnipUoFoKgn2uvGVmn2gIeK0mT1GkbnOuqjC8uqRBqEh4IlVJI5Ea19w8vDj/\nD5u+VS4HJWMMbxCJiA6ShI+qEfX+WOen9eWNL8nHLzkexZ5VcEEA4ycBRBARMSISRaF/6cnBjT2F\nhs7Tpllz8+XZea0tdmomCV8UcDDY0ePlLjmj4bZ0yv+OiGxndRYR0eAauA4LIMaIvGfucSv7OmkZ\nQAExPlQdRCOIc4BRJGpGotCR3HsDfwHKpSDc13kw2Cc6zL1ek6cwUoSVQqy+SlQgECOoy/ioqyrp\npnzDohdXL3/KGGOcc26w10FEdKTwrInFbVRT2fas/OQrl0KDLqx/6VGITUA1AoCB7qrwrPWtLdVe\ne45/q2+yvrXQ0DkUS9If0EfIJsP0h061n5kyumXW/AWdfy8iKxnwExENPu3fcrV9Z2dnFKkY46tC\nIaowGsFpBGMdXOTgJ2pg/AyioAeyawG+CNRZLdvmzfv68xnsEx3Gdmvy1JZqOkPjqbTpal+CcnEb\nPOublB/aYmA15imMAKkYwriH6L5F5oGt2zo28IaQiOjgUnXOwZR7ty7R4s5VAEKEYQQjHooVRcIH\nXpXWUSOeCX0FEEZ93ZyNeaVk3ylU1WHW6O1nzbtwwu3fuOvld4tIntd3IqLBpaoqItLZXe4IIwcx\nRgBfRZ1AI4hGUFVAHayfhPUziILe3QeB9TxduWH7c/v687lnn+gwtmuTp+zEK1xm+HSTyjZDjIed\nvRGeXx2gt+R56YT46YQRzwqcy9nnus56fOFTL981UFpkRMQYMdzvSUR04FUiKXUXzXaIDxeJRpFV\nEbhioGoF2L1+UwSyu1d/XcSImEqUiGa0tB9/3FHDLjLCezwiokOBqur2nb3LgiAIRQxE7C779X2I\nGEj/dV+xl2JbVaipNis35Z/c15/NNwKiw9jemjypWKxtX49cyceMMWWMayoj7oewVvqO9zBAldtQ\nUwlKyaYayyZPREQHWb7kOp9e4X5frPjlSlhGqF64pTh8fahwMW9vBy+9OcaIVVdKnjk9/sFkMl69\nXydNRERvibXGbt3RuXr56rVLjIhCBDAeRPoC/h0rF2Driz/HtpfvRyW/Ebvfhqt4WtRsx6Klq/+w\nrz+bZfxEh7HdmzzNu/g4bN/yEnJ5weRReSTq34Gq6nr0bl+NUs8KGJOQchBGYxvNpA+fmXzwHRNj\no2vTwiZPREQH0ZSR3tzWJpndVUjmapKaCk1DZf3O+LpJNVEz4Jn+7kz7HPP39WyJo61ZZ9VkEk0A\nOvf/7ImI6M0QEbEGscZq0zqyIWZPO3Hmrya2jp0Wi8V9gRVYH3ABglw7wmI7AIGYxKvGUDUKzekL\nm6sX7uha3r6vc2CwT3QY273JU6XYgScXLUTb6BpkJ7wL8VQV4raMQvdmqIYQAJ71bRjkUsNq4625\nYq/GrFEBIKKoTlTSl55iPzN5VPNAk6dV6Ks+YtBPRLSfnDc7cf3ZM+yZQaUDTi2gy5Mnj6qcFrqs\nAA6vldtX1T0yPrsTOJOJFZqOGt98IoBl+3/2RET0RkREVFWnjfHmXn121bdivvWBZXbLsodN06iZ\nYvwkvFgVvHgG8aqRCIudELPn7bZT54xXW3z8pdz9xUIpv6/zYLBPdBjbvclTsVxBWCmjfsx5+Lff\nbMDR4+tx/omNKPUug5gUAIW1SYjbhqnDIWt2ZCXrcoh5gIigpwDd1h0igW1nnXdc4z3/vTi4YVNn\n9AyA7UbEOFV27SciepuKZe3tzquqWvV9MYIUXNT30HWvgb4qIAJj43BRDiKx1xld4EnRTWsbcyqA\nHx6gJRAR0etQVa3PSNtNl1V/f3SDVx85Z0SsFDfcJ+s33g2xvvrJVlSPOAWphikodi7uf/gb9V/z\nAYWnFkWztjL3xWeWLHhAsbcN/a+PwT7RYWygyVNzrWlzkWixbFCdNAI/jT8vWYEPnTcNLiwjLOZg\nvFoAFfSVCAHOKSY29WD5jiZosA25ksPIeittLVZinsXM1sLU9x2f/fX67bJx7qy6b/q++YGIFJjl\nJyJ6e378SOETFae5s46OXxxU1FiJ1LO9oshAJA4gRF8pfx+FQyLbhkzzLPS0P46gdwMg9jVGN4jC\nQJobGsYdjLUQEdHenX505rpxzakmjYoqJuzrlef5AOIQOI0Ky9C5YoXGM23wY9WIogCqvqhCQrWq\n6lwpfszW+Xcturanp6fnrdyDC+/biQ5fnhX/wpOq/+n970jeEDOV1M5CLAyCMiZNHOe3zLgSRsvY\n/OK96N2yBGJiGPh7H6gCVXUQEVRCi5gXQQE4VUAFgEIV8AzUidXHV2buvePh7dfv6MyvY8BPRPTW\nGRFRwJsx3r/gnbPj101o8WfWNIzLeFIyYXk7NAoB9B2x19fACagbfz78VCPCUic61z6EMChAsOel\nWCEqLkBP4rT2y7/461EHfXFERAQAqK2Ojzhu6vALTpiUvuiY1sTZKsmo4vxCoWx6cyXt6CnJllw+\n15Uv9PaEzitVnC0VA83li66rt+i25fO93Vs7cuvXbtz+0ludA4N9osPY9DH++efOqpo3bnjt8TXJ\nQtOOckOpUtzqWhsrVdZLAkYRhQEMDMph39+6b+VVbZ/6zvbEqypHB/aEOqforyVS3xbl98vH3XX7\nfSs/Vi5XmOEnInob+g/Qk4SP2mPGx8678KSaa2ccNeX47LBjNCxtlkLnGgl6VyEKy0g3HYeaUe+A\naggXVVDoWIGejQ9BbDWwZ8Cv6gJI7cnBuz/zYGIvP5qIiI4QLOMnOozt3uRJo9WJreoJTAzOCfp2\n2BuUKoowAlJx2aO/s4i85jlPxvS17gMg5TBZOWFc59wn2hrmPvvi5gcARAd0cUREQ1j/A1M1Rjqf\nXBbc9cyKbXcf19p52TGTN8+5Zt5n3l83Holi9yZUil2Ip+uh6oCoDFFFsmYMctua4MI8RPY4Rbn/\niu7xCFUioiPcHu8QRHT4GGjyVChbF6kgEU8hV/K0p+ihEgYInUNn0IB8IKhKvPWzmwHAGvGSXqHh\njBnpSxPxWNV+WwQR0RHMOXWq0Eqo5SeWV+687b5ll//snof+PZGocvFMi0s3ToDxEjCm7zxmMR6M\nn0SyZjJUS3uMpwoVqJaCIBiE5RAR0SGEwT7RYezHjxQ+8Yel5Z+JERdUFCvaA/WkIrlSDOXIR8ml\nsbOQQaUSAhDovjfx/CsRCNTgqJH25Ew6Xr//VkFEdGQb2BYlgBgjZvW6dSshAvRn7cX4wECwL33/\nJmpGwph3+G7LAAAgAElEQVTkXqr4+wYql4LwYK6BiIgOPSzjJzqM9eR10/wFhaueXFb5r3fOjl9n\nRU49eWrMBEEPIjWA5pGt2QCHLAC3t3JPAH278gHsUeK/Jyc1icLwqa3DTwKwZj8uhYjoiKeAQoHt\nOzs7o0jFGF8VClGF0QhOIxjr4CIHP1ED42cQBT2QXXM3IlBntWybNw/eSoiI6FDAzD7RYcz1ZYPC\nJWsq93/n3twHNnaEz3f1KgplA+cMFDFEmu3vwv8akbwqxBiIRHjjnntGfenR6RPqTt/PSyEiOuIN\nZPg7u8sdYeQgxogYX2WXEn70Z/mtn4T1M9jj2q4K63m6csP25wZhCUREdAhhsE90mFNVdU5dqYLO\nux8rvvu3i0p3hBGCcugQVABoHkAAwAew+7nMBuq6UD3iDFSPnANjArz+zn5PwkoFLQ2N4w/QcoiI\njmiqqtt39i4LgiAUMRCxu+zX9yFiIP3X6b1uzVKFmmqzclP+yYM8dSIiOsSwjJ9oiHBOnYhs/uEf\ni3/31PLg5+86LvmpCSPiZ9TXj0/GYzFE5S1wYd/efYiDwIe6IuI1x6KqfjzUhQDORfeGBYAk9h7y\ni0IdZHgtJh/c1RERHRmsNTaK3Opf3H7TkhlHTZ4ZiQiMB3ERxDjsWLkAlcJWQA0qxY0Q8V/1ehVP\ni5rduWjp6j8M0hIOC0YkkfZxbkxkgjGotoAHaMkpdgYO6wOHzYHDxlCxDUCkqip959KaESncURs3\nH3YKl42J21rUe1b3ui+p6ouDvS4iol0x2CcaQvpvRqJlG6Pfr9iUe+LUmTXffP9ZjR8b6edQN+ZC\nWE+R71iBUs86ROUtsPEm1I4+HWJjUOeQrBmBcs8UlLqWASa2x/iCvg2l1cmw8eCvjoho6BIRsQax\nxmrTOrIhZk87ceavJraOnRaLxX2BFVgfcAGCXDvCYjsAgZjEq8ZQNQrN6Qubqxfu6FrePjgrOTwY\nQVV9TK6t8uU0I/DaKxBxoogQwNNco5VtFroqH+Kpnoo+LCLPqKpakUzcyDRVIFJIlYW9anzs/fdu\nqAwTkc+o6jODvTYiogEM9omGmP6AH5FDLtDYY6efe83f/c/zS3Tl0iVmzISZmHz0R1Apd6LUvRle\nLAnrJxBFJYj1AKdI1U1EuXc91IWQPTv29X1CeH4zEdH+IiKiqjptjDf36rOrvhXzrQ8ss1uWPWya\nRs0U4yfhxargxTOIV41EWOyEmD17rDh1zni1xcdfyt1fLJTyg7CUw0ak6MlHeDgnOPmq0Z49ocFH\nd9mhq2Jia8rx2ud35mue2RlMylo5q61aPt5Z1l/HrfyLCLYag7QC8ATyl27FjKzTf5qWOPmLi4u3\niMi1AJbpGzfBISI64BjsEw1BA+WG3b2VHSIGx86cIe7oqbr4hZelUgkBW4V0QyuisAQXlmGMD6cO\ncA5+sg5eogaVwo69jAsVAKVymec3ExHtJ6qq9Rlpu+my6u+PbvDqI+eMiJXihvtk/ca7IdZXP9mK\n6hGnINUwBcXOxXBqAY36jlMRQOGpRdGsrcx98ZklCx5QvI2zVo8MUU9F72uwuPD5neEJf9uWtE1J\nT5yGiHpL0jVasKI8TB/a1B37xdpys43J37Zl5JxtJTcfCtNX6Qa0JERuXVGROc2+fGxSYs6Xlpa+\n0Fl0nxSRblWNBnuRRHRkY4M+oiFq9yZPTgWJeBxBpdLX0RkCEfvXDs9GPMB4MH4SsdSw12zTJ6Io\nlYLKwVwLEdFQd/rRmevGNaeajETGMxVjpSzW82FsBgYxjQrLtHPFHS7X/ifnx6qd5/nOegk1XhLO\npNVJzBUSJ22af8+ia3t6enqcc8wsvw5VdeUIy0uh/seiLi18d3lJeyqq5ZYZ6D3zb5E6/gM4YVSD\n3DAla//vaSn5yChfk1ZG18bN/4lbGdVX+iZSdIqmlOD7awKc2eTrB0b7F6fjuE4AI6913i0R0UHC\nzD7RELV7kycRI54fQ6kcIJVKA0Df2c1QODjAur/+t59sAmQJ+jr473K/2Hd+M8q2hec3ExHtRwuX\nlr+Rc/V/OWFSw0XHtCbOVklGFecXCmXTmytpR09JtuTyua58obcndDWlirOlYqC5fNF19Rbdtny+\nt3trx/Pr127c/tJgr+Vw0lnGvWPSOPeeTZWLz24s6yneixJ1d+HZbCtqz5yHSb3rMeHpu+TvMxHO\naM7j7vUlf8GmEFkf8AwQt4KUBZ7rdnLLSyVkrRrnmU/VqFu2s6w/62/qB5b1E9FgYLBPNMS8VpMn\nz/P9eDwh5dBBrEAjD2IUqg5iIqhzEOMg6uAlagERQC2A8JXB1an1Ylixfuuzg7ZAIqIhqLOn3A7g\n3/s/6CDoD8C7YlY+PzYtZ/x4XdA4vdZqvW6X7S+vxGPVkzDpnDNhViyEt+x5mTEyibapWT22Ni9f\nX1aCiYDzWnyc0xxDPlLsCJx0FB3e1Wiq792GbxiRFgF+4lS3DfRlGOw1E9GRhcE+0RDyek2eGkce\nIykP6Ck6GDFwohDxoOoARDDGIYoCCKT/c3u5J9FQnB2GFe29jx/stREREe1vImJUdWVTSr63Oi9f\ner4zMmcMK+GM5oTYFx7Bz0VxxvmfxagT1yN64FZU9XTJJeNqMCHTjc8vKeOXGyoYn7Z4/+g4DAAF\n5NJIcV1vOPKBTZVv/Xht8HdZX74M4FciEgDM8hPRwSO83hANLf1Nnh59pcmTEURFcVqG8XxsqJwq\nF75vHnL5Ql9m30XQKEBux3LsXHkXjN+MsLwdrpLH7tsNVeGK/oTtn7l9xckbt3SsGqQlEhERvW39\nJfYCwKQsJlUn5IHzhvtjvjwtJXEjsqGnjG+/EGJ90xRcdvkHcfrkNjQ+91u4pQ/DBiFeyBfxzZeK\neGhHhH9qi+HK1jjSnukbUFTLkerLPZH88/KyPtcR/rSjqF9XxXIFIgb8RHQwsHEI0RCztyZPxnro\nKqaxucPXqONRt27dcljPAmL+2qAvLO5ApbgTQW4lXKV3L4G+VQjcc2v93+zsKWwdpOURERHtFwLE\nkxaz62K43op8dVKVqSmUnazPRzACqB9DQ20Kq5avxp/++Af8pTOP6AOfhn/pTdARk9GaVsxtjuHM\nOoMHt1Twn2sDFCMHFSBSEd+ITK/x9F+PScknJ8QvGZM237MGx0rfcwYeYUtEBxzL+ImGmN2bPDkk\nos2dUSnXuypVk1JFFK+se/4H8fjMD3uxRBp+IgPjxZHIjoHAg0gGQHmPcZ1GUUVqdz7+ws77y6VS\n4eCvjIiIaP8wIqmGBK6viZkPVfsY+a7hsdTcFh9WgLjtC8Qb00mcPKkRo2eNQXrkGAT5Huzs6kRL\nuQwZMRF+1yq8a3gPzmiqQnfokA8VA2cgiACqfZUD2ZjolePjXtaXU7/5cumWzXm9LHTKh+ZEdMCx\njJ9oCBMRySTQ/A8XpR86dnzsqChSpyLGAEbDbogFjK1Bsv5YVA+fhZ6NzyK/YyHE1gDqdjm/OabW\n9chzPX9z37d/9Mcr8vl8jsc6ERHR4Wp4ys5vTOKqcgQzPAX3lelV3pSsB1UVhfQF7cbA8+OwfhKo\na0M0fBIq46bBq2uA+69/BjY9D/WqIHAw6NsP4Po/0P//A5wCoVP3/ZVF/PPy4IfFsn4Ufdv3+V5K\nRAcMg32iIUxE5KQpyb+9/qLs93xTsepKtv8rADyIKNRFKiiojTcilhyJoLARCiNOAXUioRoncCgm\nZq+/6QfPv3vVmvV/4c0JEREdzhKezEgYHFMdk3fHrZygRpo/NMqTC0bE0Zww0ltR5EKHyDnETIQU\nQqTVIA4DtLTCVKWAbS8CiL3SzlYBEQUgUFhAQ0AEgleenXdXHP5hSRG/WxdcHijucnw/JaIDiME+\n0RCXTvn10yc2nzm7LX3+rAmp86urEnWhxsul0OYKJdfdXfS35cvl7b257p5yuZyPEC8HoRQL5b7z\nm3OlyrZ8PpfbvD2/auOWHWzKR0REh72BPfNGUF9l8Y6mpPkXCMaMrzJojBupjwHDU4LauEWNL6iJ\neahLeGhMWKRQBFQh1kffyTUCVcBBoSpwrgwbWfjxXXP+fQG/EdV1+Ug/9lR+6XM73cUKrOADdCI6\nUBjsExEREdERp79LXqwuJtc1peQLZUUaAC4dFZOzW3yMSlkkDGCNQKD9YT0gYiBQ/DXQBwAoVuUU\nv9tQRk+iFpdfcRXsSwtRs+UviFnbt4m/79tgjLoHNwXh9YsKt20v4YsK5BjwE9GBwG78RERERHQk\nMg0x+XRLlXwJQDpugG/PSMr1U5KYlvWQ9gSeEZi+9vkwIhCRv4b3Axl7AQAVjK3yMTcjGHXiuVg+\n5gTcojNwTzAC8Kqg2vewAAKog5xY7/vH1NrpCjQMysqJ6IjAbvxEREREdEQREZv2cF5dUuaJwnOA\nzhsfk5q40Re6QsnGBDUxg7gB+jvV9r+u718F+kr5RQBYAA6u7GN4pgqTXnwUDwYWHatW4sVJp+MP\nNo+jX74btVV18PwQxjhd0VuuPN+lSwFsH4TlE9ERgmX8RERERHREsUZqRqbkzuqYXKgKFQFSMYFT\nSFwgtVbwkdY4TmnyIRDY/iDf/XUEhYEgiEJsWmuxvt5DUHc0Iq8BvX4CazyL5tZxUAA/+slP8a7W\nOpzWmMaonS+gNsojb2PunvX57d96sfh/tpT0DgABS/mJaH9jZp+IiIiIjiiiiBcjLAnLbouBpEVQ\n3VnREUmLNiOSMTHI2CoLK32Bfk/gsK2saEkaxK3AQLAuF2LBliKyJ16Oaeeeh2GtU1CVycDzPcAp\nKkEZ3V2dqG8eAQuHUbOPQ7h6KSrPLkDmmf8r7xuVaMqF+oV/fqG4rhDhQRERBvxEtD8xs09ERERE\nR5yBjvzo33bvCZrGVMn3N5TlgjuPi+OcEXGpOMFzHQHuXBNg3oQEpmYtjBgs2ObhlpfLeN/ffhyf\n/vT/hhiLMAyx63219O/x9zwPzjlEUQTredCoAvf7n6r+8h+07Bpwy4s9nbctD04GsBwAGPAT0f7C\nzD4RERER7RcDAXRt2ow9rs2/bMIIb059Ro7xPdQ4Z5xGZVNVPcrt0PG/vGvB4ps2tG9dNYjBrezy\n3ybt4UwYOW5aFm52Q8xuLDj8dE0Zv2kPcetxKbRlfGzuMejVIjb0KEpeCl0dO9Hd3YN0JtM3oOzS\ntE8EqopKEAAiCghcGGJD+ybJHv9u8eJZST74b+5GrK/tqHT/5FdrSx8KFatExDHgJ6L9gcE+ERER\nEb1tA2Xo45vt2R+Zk7oV0LFBxZkoElOuWFcdy9l43dQtDy7Rzz626E93F0vlwmAGtarqBubtG4xq\nSMr/6gq18ZxmTzoDxVdeKmFNT4Qbpiawvexw9xaLqrrxqB47DI1nzsBN9cMQS6aQ6+1BMpWCiyIo\nFIlEEsVCATs7dqC7qxNhJXRV6Sqpb2jSqnQafl+mX/KTT0IlU2/Mb//N3djz5NFlZ7/+4MbC/FKk\nzwDYOVi/FyIaOhjsExEREdHb5ntInjcrft0tV2S/tHZrxesuOBhjRCDaUIP81vLsJ395/5ob1m3c\ntsQYMYdC9nrgAcWwpFyTtHJsySniVvC95SU83RHi2KzBgs0hFvdanP6uc1A3bjy6dmzHiqcXYdOW\nHQiMRbM1GDtjCoaNGIUTTzkdvb29uO8XP8GTS5ehVCxqFDmJx2O5Uc2N7vxzz6k+4dQzVUTUWmui\n0VOw6W8+YbZv7PGvKiw6vyc57NgwO+JZAO8f7N8NER3+uGefiIiIiN6ygYD5tGmxa645O/WtqoRU\nL1lbEeeMCCquoWn81gcXu5sXPrPmjnK5XDoUgvxdxYxMaK02i4wgLYD2OiAlYnyjyKlB2BNi5onH\nuIp6eOzZxRI6Jy1wiFf7gPXhghIKOUXdlMk4ceY0/OKBB1FTKCA7vFGNMchXoqc37uyZFwSBAfCJ\nSZ532U0/+I/4xKOmqrWecap4/E9/1F/d8iX9myuvRhF25xe++o3Gwf69ENHhj8E+EREREb1tX/9I\n9fOtLXa6EciSNRVxDu7ocWV5YMVpX/jpfQu/rgrnnDtkbjz7+wtIU1xuaUrJZyJFJEAIIG8EdU4B\nA0AErlRxUoxsUFdT5cNFxoVB/z20QIzAGB9l9dDVlUNLSwNcUNAoKGoQujXrcu7cwGGVqqoxRpKC\nCyUe/+IHLrxgyulnz01MmTod+Z5ufP//+2a0ecuW7U+9uOprxXL5/x/c3w4RDQUs4yciIiKit6Uu\nYybc+rGayaoqvm9QlfS0rqooQfbiTQ8s/O3t6tS5QzDDZICGTAznKuBChzU9Fb0/UnQPS8hNAMQB\ncA7bArF/icUkWynmjhYg/kojf4VGQBiG8MSgqTaO8s7t6LYJJGwcxoQ9gnIVACMiDgAKivvjUbT0\n5/c+8Kn29o2XV9c1pBqzGdezbVv7s0uXfbYUuXsG6/dBREOLGewJEBEREdHhS0SkOinDEnHEpb/B\n/fBaQWPjSL3nqS1f7+zs7BisQF9Ezvc8b8NVV12ljz76qG7cuFE3b96smzZt0vb2dvc/ixdv3RQm\njt4Ra7QTTjm3bWfonV8MdZgIDAAtRvrExry7prvsfh6DGyNAbNfxtY8DEAEalXPlaGTbJH3nRe/D\nqIlTJShEU0Zk4vOrDObsun0hqITr6uvqfvrOd1+05dEnn74rnc2uNI3Dv18GfoO+6gIioreNmX0i\nIiIiekuMiFFV11Tr5Utl1TBSxH2LbMq5Th295t5fP3L7YMxLROp933/8xhtvnHj11Vejo6MDURRh\n7dq1sNYiiiJs3rwZ119/PZYuXQrP83DKKafI/fffP+XPf/7zlH/51jdQ47k/7Cjj2sBhZcxoW6TS\nYwUNCihU0V/lryIQ6T91L5YQFAvdaB03Ri+/8ir5ty9/JbboqYXHj6lL/Kg6Jtep6t0iIs65aNqU\nSY1Llix5PpfL/8fDv/vDsy+uWvP9ShgFg/H7IqKhiXv2iYiIiGifGRFpqbPT5sxIXD17QuKC4TWu\nzRqIEXFFVOXuemrYjb/+47Pzgb4M+MGal4icO378+N8sXLjQLF++HJVKBdOnT8fDDz+ML3/5y/ja\n176GhoYGtLS0oL6+/lWvPe+88/CpT30Kc+fOxSmnnOLWrVt3MYB7AEjaw7uGpcwXYwajAMQESDlF\nZyHUJ3IV/MlBu2JGWtOeuXBrWSa/Z85ZZt4/3iDzPnGtus5t0GL3uvZceF1viAUANJtKHBspensL\nxWUH63dDREcWZvaJiIiIaJ+IiIxqMLM+/Z70nWMbi5NFIAorIh6cA3wpxGzUmQQOeqD/+S984Qtf\nmTdvHgCgvr4ew4YNw5///Gf84Ac/wMMPP4x0Ov2ar1+wYAE++clPYt26dXj88cfNDTfccPdPf/rT\nOwFckwtxf5BzLyYspiUsTkl5cmxHWb+Xq+C3CpQBQNVp3Mqdw+vrbn5s6fMXnfg//2O/+Ll/ksuv\nuBKTG9NjmqX0lUJ3Zas6XddbKK1XINc/bznUTikgosMfM/tERERE9KaJiCRjUve1K6qfaGvRtlTT\niRpPpU1X+xJUStsh4kEkDJ/ZNOm/vnrH05eJiBdFrnKg52WtvfwnP/nJj04//XQAgHMO1lrk83mc\nccYZeOyxx+D7/psa64tf/CLGjBmDa665BldeeSV+97vfTVXVFweC8rQv74wcNpYc/qKqYX9nf6iq\nioiJGTOmIRW/bfrkCed87db5+NpXv4qnHn0EIoIRo0Y/J9b7bceOHR3bOrsf6u7NLXd9+/6JiPYr\nNugjIiIiojfNCOxJk7xLJo6tG5mdeIXLDJ9uUtlmGOsDcAAUzolpTJdmnDC5+hJrjWeMmIGA2Bgx\nxogYETFGjHmltf3bkkwmy6eeeioA4Oabb8YPf/hDzJw5E5/73Ofwi1/8AqtWrXrTY9188824/fbb\nISKYMWMGADQDr1Qp5EM8XHJYrKrhwOcHvqaqLnBufc7pd55+aeW65xcvdld99KPS05XHsdNn6Je+\n+rVjT3nHSddceNF7zoMxZeyX1RMR7YnBPhERERG9aTFfqmZP9M/OjJoTu+2BteaFtQXAeAiKGwAM\nZM5FRlZtmHTje+1/nnv8iGtFjFFV9awkhtV4U2eO8997wiT/w9NGx87NZvzRQF8PgLc6JxEZns/n\nW9vb2xUAPv/5z6O2thaPPvoovvvd72LcuHG4+eabEYZvrtG9cw7nnXce1q5di49+9KNIJBI/ll3m\np6rBG5Tdu3yp/JiWy7/50e3/6lpbW92VH58ns88402zbujnqaN9Qv3zF6me7uns2OsesPhEdGNyz\nT0RERERvWsJH1Yh6f6zz0/ryxpfk45ccj2LPKrgggPGTACKI9GXuoyj0Lz05uLGn0NB52jRrbr48\nO6+1xU7NJOGLAg4GO3q83CVnNNyWTvnfEZHtb2Xv+gUXXPDcB/4fe3ceZkdZ5o3/ez9VdfbTfXrv\nTtLZQxYSOoR93zcxCIMwikZkZBz84fiqqKMzoxiXQQWHEQeXQQdHtvHlZWTTEGTRUVkDkmACSSD7\n2t3p9WxVp+q5f390N2ZDAyTppPP9XFdfne4+p+p5Klf3qe+5n+Wyy5pyuRyAgbDe0NCAdDr9xmNu\nv/12nHHGGfjud7+L2bNn/8VjXnfddbj44ovx5JNP4s477xz13ve+9yQAv9uT9gwO5y9Hce/OPyxZ\ndvEv7r2jed6H5umjD96He37wr+bl51ds2mjMPeA2e0S0DzHsExEREdEecx0TiztRrtK+SO786vuh\nQQ/WvfJbiJOAagQAA3vRQeE6juc45ZqPn+fd6plqz3GgobUolWUw0EeoToaZD5zifHb62Jajfrig\n+/8TkdfeauCfNGlS+Zxzznnj6yiKcMIJJ+zwGM/z8PWvfx1HHnkk9uTw1dXVqKmpQWdnJ4466iiI\nyHcBHPkWmqX5UvnFhmTsv/7r1u99wYunMXn6LH3+6af6e4CbAbzORfmIaF/iAn1EREREtMfqq8zY\nr34wu7A5p5NdL+0CIcIwgoGgVFEkvMFN5wcNbEm/4/3mTkPiVQF1pSwvbp7y5DfvfvU9pXJQ2NMg\nLCLe73//e3/8+PGy0/d3CfWqircyW6C9vR033XQTvvWtb+H444/H+vXrzVsN6I4x6bpk7LoEzKcK\n8cSGYiH/uXJQeQLAX5oKQET0jnDOPhERERHtsUok5d6S6YB4sJFoFDkqAlsKVB0BsNOKcyKQne34\ncxEjYipRImpr2XjsMTOaLjGy5/eoIjJu1KhRbxxz3rx5mD17NqZOnYrDDz8cl19+OQqFwtBjMX/+\nfARBABHBRz/6UZxwwgk46aSTcOqpp+L73//+DsfO5XJYu3YtAGDq1KkAkHor1woAImsL7YXyV9YV\nijXburpmlfxggar6DPpEtK8x7BMRERHRHiuUbfdzK+1jpYrnV0IfobrhltKodaHCxtydo/6eM0Yc\nteXkGbPi70sm41Vv4ak7nPK2227DwoULEUURbrjhBqxYsQKf+MQn3vh5Q0MDPvvZz0JV0dbWhiAI\nMHfuXJxwwgn41re+BWN2vD0OggAAUKlUgJ2HKBARHcAY9omIiIhoj00f454zqVGO7ikm80Hkoqj1\nlXVd6bVRFFUAUeDtVaxFIJA4JjfrUblsovEtPHWHhfwTiQQaGxvhOA6+9rWvoVAoIB6Pv/HzxsZG\nLF68GABw7bXXoqGhAVOnTkWpVMKoUaNg7Z8WxxeRoZDPsE9EBx2GfSIiIiLaYxccnbjunNnOu8fW\nbGvMxAPkZEXypNYXT82lvQRE5c0mxe/JqHWBNdlYsXHGxObj30KTdrmfFRE4joOenh4Ui0VcffXV\nb/zMWgvHcd74OpvN4vrrr0cul8OCBQt2Oc7QkP+h0E9EdLDgavxEREREtMdKvvb3FlRVHfU8MYIU\nbASIKHY7iF8VEIFx4rBRHiKxP3N0gSslO3PyuFMA/NceNmmXsK+qcBwHjz76KB588EFcccUVWLZs\nGYwxiKJoh7A/atQotLS04Ctf+cqurRFBGA7sjjf4mZV9IjposLJPRERERHvsjl8Xr338Zf8eMWKD\niiIMI4X2QNUC8LBz4FdYxKsnoG7KRYhnxwOD2/PtnkEURtJcXz9hT9ujqr3PP/98uP3IARHBZz7z\nGbS0tOBjH/sYjjvuOGzduhUAcOGFF+LHP/7xG49997vfjaampjc9/k5hn4jooMGt94iIiIhojxkR\nUcBtm+hd+O6j45+Y0uIdmaufkHWlbEK/AxqFACCAQMSFGKB24rvgpRoQlrvRvWYhwqAI2U2RXCEq\nNkBf4tSN8770cOuetEdEzpk2bdpXv/jFLx53+umn79W+Wmtxyimn4KmnnsJZZ52FV155JaGq/l49\nCRHRPsJh/ERERES0x6yqiki4ZHXlwRUbKr+dPTF2wUUnbPh424zpxzaMPUfD8mYpdq9G0P86orCA\nTN0xiGdGQTWEE8siVdeGvg0LAacKO4+KFygUiqpk2LCn7XFd94wnnnjiuH1RwFLVNyr6q1evVgDB\nXj8JEdE+wrBPRERERG/J4B7xaox0P7M8uPv5le33HjOp+4rZ0zaf+ZFrPvve2olIlHo3oVLqQTxT\nNzDEP/IhqkjmxiHf3ggbFiCy69p6A5/ct7KDX/fe6dWuFi1ahGuvvRarV69GuVz+kXJILBEdRDhn\nn4iIiIjeFmvVqkIrofpPr6j85HsPLJ93z88X/kcikbbxbIvNNEyBcRMwxoUMfhgviWRuGlTLuxxP\nFSpQLQ9tbr8HVLVrX2XwUqkE3/cxbtw4jB8//ioRSeyTExER7QMM+0RERET0tg1VuwUQY8SsWrv2\nNYgAg1V7MR4wFPZl4HMiNwbGJHe/tr0Afjl4K6vh7bPK/mmnnYZbbrkFjuNg5syZLoDUvjoXEdHe\nxrBPRERERO+YDkxx146u7u4oUjHGgxhvoJo/VNV3XIg48BI5GC8Lhd3xICJQddR3mjfv8XlVe6y1\nfzZk0bsAACAASURBVPmBb5MxA7fLXI2fiA42DPtERERE9I4NVfi7e/1tYWQhxogYT2W7IfwYrPI7\nXhKOl8XO2/RBFY7r6mvrO158C6fu25dhf0gU/bktA4mIDjwM+0RERES0V6iqdnT1Lw+CIBQxEHG2\nm6/vQcRABgP+LlX9gQNATZV5bVPhmbdwzvz+CPus7BPRwYZhn4iIiIj2CscxztbO7lUrVq1ZYkQU\nIgPz9Qfn6ne+tgBbl/032l99EJXCBojsWNlXcbWk1dteeHnV42/htMV9FfZF5I02srJPRAcbhn0i\nIiIiekdERFxH4g1VMnVMfWzWAw8/cl/JL1cgoiIOxPEAAEF+IyqFtagU10DE2+EYqkaheV26uerJ\nzp78xj09t6oW90cQZ9gnooONO9wNICIiIqKDl4iIqurMce45f3N2+qaY53jAcmfL8kdNY+uRYrwk\n3FgabjyLeHoMwlI3xOy6DL9Va41bU3rqlfyDpWK58Baa4O/LIfZDlX0O4yeigw3DPhERERG9baqq\ndVmZfP0VVbeNrXfrImuNiCOl9Q/Iug33QhxPveQkVI0+Gan66Sh1L4ZVB9AIUAUEULjqoGTWVM5Z\n9vySBQ8pdjeh/00FlUpln/VvyP5YF4CIaG9i2CciIiKid+S0I7KfmNCcatSopGLCgWmirgcgDoHV\nqLgc3StXajw7GV6sClEUQNUTVUiojqpaW47P3vrDu1/4eF9fX9/Qyv57yO6Pyj6H8RPRwYZhn4iI\niIjekSdf9r+Zt3V/PG5q/SWzJyXOVklGFesVi77pz5d1W19ZtuQL+Z5Csb8vtLlyxTrlUqD5Qsn2\n9Jdse6HQ37t120vr1mzoeOVtnF73R2V/MOzPEpGVqrppn5+QiOgdYtgnIiIioneku8/fCOA/Bj/2\nCxE5E0ARwPNBEOz2MdbaHVbUfzOFQgGZTAa7G1Aw9NzBYfyzAFwJ4G/eSduJiPYHrsZPRERERAcd\nVX0CwJMAfhwEgXZ0dOzymP7+fixdunSH7+1uOP4111yDIAh2G/Z3et6/ATjrHTWciGg/YdgnIiIi\nooOOiHwDwK0ArgyCQObNm4f58+fv8JhNmzbhn/7pn974ulKp4LnnntvhMYsWLcITTzyBdevW4Ywz\nzthhFEBHRwfa29shIujq6gIAB0DrPusUEdFexGH8RERERHQwuhHAHwFg6dKlePnll7F69Wp8+tOf\nhojAGIPFixdj0aJF8H0fxhjcf//9ePXVV3H88cdDRBAEAd73vvcBAM4//3wUi0UceeSRaGpqQmtr\nKxYsWABVxeWXX44tW7YMnfee4ekuEdFbI29tsVMiIiIiouEnIlMBPAWgdrtvlwHEAew8Sd8HENvu\n+88BOAIDW/ydBWA0BobojwHwKoCVAE4BkAPQCSAJIA2grKrJfdAdIqK9jsP4iYiIiOigo6rLMbBY\nXi+AzQCuGAzihwEoAYgA/AOA+wBMAzADQBeAL6jqcYOPzajqM6p6n6q2Aoip6nRVvUhVawAci4E3\nAI4G0APg3v3bSyKit4+VfSIiIiIiIqIRhpV9IiIiIiIiohGGYZ+IiIiIiIhohGHYJyIiIiIiIhph\nGPaJiIiIiIiIRhiGfSIiIiIiIqIRhmGfiIiIiIiIaIRh2CciIiIiIiIaYRj2iYiIiIiIiEYYhn0i\nIiIiIiKiEYZhn4iIiIiIiGiEYdgnIiIiIiIiGmEY9omIiIiIiIhGGIZ9IiIiIiIiohGGYZ+IiIiI\niIhohGHYJyIiIiIiIhphGPaJiIiIiIiIRhiGfSIiIiIiIqIRhmGfiIiIiIiIaIRh2CciIiIiIiIa\nYRj2iYiIiIiIiEYYhn0iIiIiIiKiEYZhn4iIiIiIiGiEYdgnIiIiIiIiGmEY9omIiIiIiIhGGIZ9\nIiIiIiIiohGGYZ+IiIiIiIhohGHYJyIiIiIiIhphGPaJiIiIiIiIRhiGfSIiIiIiIqIRhmGfiIiI\niIiIaIRh2CciIiIiIiIaYRj2iYiIiIiIiEYYhn0iIiIiIiKiEYZhn4iIiIiIiGiEYdgnIiIiIiIi\nGmEY9omIiIiIiIhGGIZ9IiIiIiIiohGGYZ+IiIiIiIhohGHYJyIiIiIiIhphGPaJiIiIiIiIRhiG\nfSIiIiIiIqIRhmGfiIiIiIiIaIRh2CciIiIiIiIaYRj2iYiIiIiIiEYYhn0iIiIiIiKiEYZhn4iI\niIiIiGiEYdgnIiIiIiIiGmEY9omIiIiIiIhGGIZ9IiIiIiIiohGGYZ+IiIiIiIhohGHYJyIiIiIi\nIhphGPaJiIiIiIiIRhiGfSIiIiIiIqIRhmGfiIiIiIiIaIRh2CciIiIiIiIaYRj2iYiIiIiIiEYY\nhn0iIiIiIiKiEYZhn4iIiIiIiGiEYdgnIiIiIiIiGmEY9omIiIiIiIhGGIZ9IiIiIiIiohGGYZ+I\niIiIiIhohGHYJyIiIiIiIhphGPaJiIiIiIiIRhiGfSIiIiIiIqIRhmGfiIiIiIiIaIRh2CciIiIi\nIiIaYRj2iYiIiIiIiEYYhn0iIiIiIiKiEYZhn4iIiIiIiGiEYdgnIiIiIiIiGmEY9omIiIiIiIhG\nGHe4G0BEBxYjksh4OD8mMsUYVDmAC2jZKroCi3WBxebAYkOoaAcQqaqKiAAwo1O4vSZuPmgVtjom\ndmtJf76q385X1WXD3S8iIiIiokMJwz4R7cAI0nUx+Xjak1ONwN1YgYgVRYQAruYbHGl3oK8XQjzb\nV9FHReR5VVVHJBs3MlMViBSSduBcNTH23vvXV5pE5LOq+vxw942IiIiI6FAhqjrcbSCiA4iIeA0J\n+ZS6Mv+qsW7suHpPen2LnorBaj+uL3UV9PmuQKod8Zvi6O729eH2sn4nUmydkJWnY0YmC4BtAfCB\nsa6e0OjZLy0u/WZZr/04gOXKPzpERERERPscwz4R7UBETNzBlPqE/HhGVo679dis05h0xWqIqL+C\nHlis9HO6cFOv/dkaX5wYpFqwrr1sf5iLyUfijkxUAHEj8kqvxX2npPS1omL+y+V7ukv27xXoVdVo\nuPtJRERERDSSMewT0S5EROriuFJFvvPX42OZL8xIi9c6U0qjj0S80IXEmj+g3NeJtYW8Pryxogs3\nh9IXaiVmAIjEVAELRTEC5tQ6+pVZKb11Zdnevcb/et7H13Vgrr8d7n4SEREREY1UDPtEtAsREQNU\nj8vID0pGLr+1LakntyRNX2oUllVPQs2RZ2Fq/zqY5+6GX4x0WU8B964rY8GmENWeiGOAuANEFuiM\ngJPqXK12VO/YGPbHKvZjXb7eM7ioHzisn4iIiIho7+MCfUS0i8EA3hNz5J/HZ+T0O9YGDbNqHK3T\nDul49TX8vmoqpp53BszKJ+Euf0naxiQx+fBqnVNTkG8sL8NEwAUtHs5rjqEQKToDK9tKFnMbTNX9\n7fimEWkR4E6r2i4iwsBPRERERLR3sbJPRLslIkZVbWNK/rEl5cz/5xkJc3pTTPpCkd+aw9A38zSc\nfuLxaO1ah+ihW2H7euBlXLzY2Yt/XuJjq2/x+ekJvHdsHAaAAihFirX9oT60qYI71gQr+nz9Sl+I\n+wAEAKv8RERERER7C8M+Ee1icIi9ADApB1OrEvLQBaO8cV+ZmZK4EVnf5+PbS0Osa5yOK+a9D6dN\nm4yGF38J+/KjcIIQSwsl3PhKCQs7I3xhcgwfnhRHxjUDBxRVP1J9tS+Sb63w9cVt4V3bSvoNVawY\nnMvPP0pERERERO+QGe4GENGBR4B40sHRtTFc54h8fWra5Iq+lXWFCEYA9WKor0nh9RWr8JsnHscf\nuwuILvs0vPdfDx09DZMyinOaYzij1uCRLRX8eE2AUmShAkQq4hmRWTlXvzs7JX8/Jf7X4zLmFsdg\njgy8zyDD3X8iIiIiooMdK/tEtAMjkqpP4LpczHygysOYuaNiqXNaPDgCxB2R1pSDgkngmbAB6zPj\nkBkzDulxh2FO22y0rFmMaNUSREsXoNDfh/5Q0BtaFELFtKyDtDdQ3d/uz4761urP1wfhja+Wf7e5\noFeEVrcOX++JiOhAJyLiOki1TYhdNKPVuXBUrXNsJqmTocaGUQRXIpPIzdq2aJ1740NPvPT9Yqmc\n56gxIjoUcYE+ItpBc9Lc3JDEVX4EUxWDPbvFw7RqF6oqCkGkQEIDnJ3ohCMFoBQg6jOobEjANo6G\n/u9dMIVOZGJpZGMWYzAQ8O3ghwLYrnYvMWPk0ta42+Xb07+1IrhBRK7GwPR93pgREdEbhhZ0rc3I\nlCtOT/7b6Frn1HwpSgARSr4LaKiNNRmnU6c+dedjGz6xavWGpUGl4g93u4mIhgsr+0S0g4QrbQmD\n2VUxeU/ckePUSPMHWl25cHQczQkj/RVFPrSIrEXMREghREYN4jBAyySYdApoXwYghjf+uiggogAE\nCgfQEBB5o8ovgPZWLD61pIRfrQ3mBYq7Lf84ERHRTma0uud95Jz0d5JxHLZma8XGPTFWHcTd0MbT\ntWt+91r1fyz83fJbgkpY5m4vRHSoY9gnoh0MzZk3grq0gxMbk+Y7EIybmDZoiBupiwGjUoKauIOc\nJ8jFXNQmXDQkHKRQAlQhjofBGj5UAQuFqsBaH07kwIsLLAwG1gAcCPxGVNcWIv27Zwsvv9hlL1dg\nJW/SiIhoyLgm59jPX5r5fw1VZtTKTRUplAc2e2mqrcLWaMqC/350+fVrNnYuDsOwMtxtJSI6EHAY\nPxHtQFV1oBqC/piRqTEHdb4Crxctjq1zcXaLh9aUg4QBHCMQKBQRBBEgHgSKN4I+AIhidV7xq/Vl\n9CVqMO9DV8F55UnktvwRMccZGNMvgFWRcRlHPzk9Mf26F4of6yjjSyLCeZZERAQAuPT45Bebcs6Y\nyKoaEbGq2lQdKXKzFt1485OXBkHF52sGEdGfcDV+ItodUx+TT7ekZT6ATNwA325LynXTk5hZ7SLj\nClwjMAPL58OIQESG4j2GKvYCACoYn/ZwTlbQevz5WDHuONygbfh5MBpw01DVwTcFALWQ4+s8b3aN\nM0uB+mHpORERHVBERLJJGTWj1Ts6CBWeEUknjWSSnjY3t5Z+/ptNN/l+UOZmLkREO2Jln4h2ICJO\nxsUFtUm5RhSuBfSaiTHJxY0u7QmlOibIxQziBhhI6EPPG/iswMBQfhEADgAL63sYlU1j6rLf4pHA\nwbbXX8OyqafhcaeAI169FzXpWrheCGOsruz3Ky/16MsAOoah+0REdIARgaTiksskkRIMjAarzXqo\nTZd1U6H+hWWrVjxrjDHWWjvcbSUiOpAw7BPRDowgWxuXqz2DVqtQT4B7NlT0rvUViQtQ4wiunBTH\nyY0eRAFnMOT/6Q5LYUQQRCE2rVGsq3MR1E5HVFWPfi+BuI1w3tlnQgF88867MHfSHJxal0Fr11LU\nRAUztTrpfW66ff9Ny0rLt5T1dhEJOCyTiOjQZESMVbW5jFMu+mo9FzAiSMUQxl1ED7xgHtravm09\nXyeIiHbFsE9EOxBFvBRhSejbLQaSEUFVd0VHJx1MNiJZE4OMTztwROAI0BdYtPuKlqRB3BEYCNbm\nQyzYUkL18fMw8/wL0DRpOtLZLFzPBayiEvjo7elGXfNoOLBoPfoYhKteRmXRAmSf/x+5tDXRmA/1\ni99aWlpbjPAIV1QmIjr0GBGpycrYvzox/eHPvzc3N53QrOcM7cBXcP7Qe95vn3z2d3dz8D4R0e4x\n7BPRDkLVrSJy/cBXKgDgChrHpeW2NT4u/PKMmE7MGqlYYFFngJ+sDnDNlATiBjAQLGh3ccOrFpf+\n7WfwwU9/BmIchGGI7bN6PJFAtjqH8ZOmwFqLKIrgtI6Dnnwe7GPHIP1/P6UfmVjf3F6O7vjeiuAk\nACsY+ImIDh1GRJprzMz/c1HV7VNbim1iykbhiIg3uIMLkIrW5dRWuP4UEdGbYNgnot3ZvlBiMi7O\ngJFjZlbDHl0fczYULe5a7eMXG0PcekwKk7MeNvcZ9GsJ6/sUZTeFnm1d6O3tQyabHTigbLdonwhU\nFZUgAEQUENgwxPqNm6T62PeIG6+W5CPft/+AdTXbKr133rem/IFQ8frg4ssM/EREI5iISNyT3NXn\npv99xpjCnET9SZrK1pr+jlUo962EmIQElUplcrM7fuyo2mldPfmtALjdHhHRThj2iWgXqmqBgRsu\nz6C1Pin/pyfUhvOaXekOFF99pYzVfRE+d3gCHb7FvVscpGsnomp8ExrOaMP1dU2IJVPI9/chmUrB\nRhEUikQiiVKxiK5tnejt6UZYCW06k5a6+kZNZzLwXBfWWilMOwGVbJ0xv/y+/Ye+Z47wrfONRzYU\nf1iO9HkAXcN8eYiIaB8yAueoSe672w7LzaqeMjeKJZNu3PFR7N0M1RACwHE8p1zuT7SNdy5ev8Fb\nZYysgULt4PaxMrQz7OD7zKpQvllMRIcahn0i2q2hYfNNSflI0pE5ZauIO4JbVpTx3LYQc6oNFmwO\nsbjfwWlzz0PthIno6ezAyudewKYtnQiMg2bHYHzbdDSNbsXxJ5+G/v5+PPCzO/HMy8tRLpU0iqzE\n47F8a3ODfdf551Udd8oZKiLqOI6Jxk7HpnOvNR0b+ryrii+8qy/ZNCesHr0IwHuH+9oQEdG+47mS\nnDPZO7t+3IlV33t4nTliYi3edXwDyv3LISYFQGFM0iBqT8w9Qj86oX704V+7e8OFQRCUACDuSe3o\nOnd6fRatIjC9Rdm8fpt9GUDH0IJ/w9tDIqL9Q/gmJxG9mZiRKZOqzAtGkBFA+y2QEjGeUeTVIOwL\nceTxs21FXfx+0WIJrZUWWMSrPMDxYIMyinlF7fRpOP7ImfjZQ48gVyyielSDGmNQqETPbejquyYI\nAgPg2qmue8X1//mj+GEzDlfHcY1VxVO/eULvu2G+nvvhv0EJTtcXv/7NhuG+LkREtO9Up03TP/91\n9v5jT7/smPff8ILzw384D6OzPtY+/z0YtwZDI/YVgLVq467FS5vGPHvHo6u+eOI0ufyEqbG5TTmn\nOeYOFPZDdbCuw2z4n2eCG//35d7/DCq2yCo/ER0KGPaJaBcyMMFeGuNyQ2NKPhspIgFCAAUjqLUK\nGAAisOWKlVLkBLW5tAcbGRsGg39XBGIExnjw1UVPTx4tLfWwQVGjoKRBaFevzdvzA4vXVVWNMZIU\nXCTx+Jcuu+jC6aedfU5i+uGzUOjrxW3/dmO0ecuWjmeXvf4vJd//9+G9OkREtC/VZZ0x869IPz5t\n2mGTmo+40jHqY/Oy+9G/ZQnExN5Y8HVwKRioWjVGEFTcStwLPQUQWdXBNWYBKFwjEsHoU69l77/9\n0Y7rOrsLaxn4iWik4zB+ItotA9RnYzhfARtarO6r6IORorcpIdcDEAvAWrQH4vwxFpPqSil/hADx\noYX4AIVGQBiGcMWgsSYOv6sDvU4CCScOY8I+gZ/GwKLLFgCKigfjUfTyf9//0Cc3btwwr6q2PtVQ\nnbV97e0bF728/B/Lkf35cF0PIiLaP6yqjVTKhc6VWP2brwNGEYXBwJvH4cAIfM/50zqyIkasVXVN\n6EWDA/QFImIGXpBUoZECqhanTtlySaATSj944LW/ExFW+IloRON2JUS0W0kXsz0jY3p8/cnGgr26\nvaTXq2pRBAaAliJ9ekPBfqTXt/8dgx0nQGz75+sACyACNPLzfjRm8lR99yWXovWwwyUoRtNHZ+M/\nTBucuf3NVlAJ19bV1t717vdcsuW3zzx3d6a6+jXTMOo2H/gFBkYXEBHRCBZG8LsLZouKq9YajUKj\ngLHlimolHAj6Ijs+R2Qg3G9vh5+JiDFi/DAZHjeh+5y2yfXnGOF9MBGNbPwjR0S7UFUVQXxj0X54\nU1GvLUb4nQLFmJEJAth8RR/ZWNCr8iEeKYb620jRJ4PTJ6EaDYZ3laGR/AITS4gpFXsxacI4/do3\nvoGTTz4l5oX+seNqEz+tisllQ4HfWhvlqqsalixZ8lI+X/jRo796/AePPP7EzZUwKrACQ0Q08hV9\n7X12RbSgr+QVKmGA0FrbFTRtLQQSpBM77g37VjlG3KRbrD+9LfP+RDyW3muNJiI6AHHOPhH9WSJi\nMFioH502P0k4Mmt93l5aUawbekjGxdymlPlSzKAVQEyAlFV0F0N9Ol/Bbyy0J2ZkUsY1F231ZdrF\nZ55lrvn85+Saaz+utrsdWupduzEffqI/xAIAWp1KzIkU/f3F0vLh6zkREQ2HmWO98847Kn3N+Obq\no2szwWh1UpW1vS1L652XJzXnvKyqxfaV+7dK1dresHnzP/znxlO2dPSt3pttJyI6kDDsE9GbGtp+\nb+jr2oS5phjqs+VQ/7D9YwBIzGBywsHMhIOTU67M2ebrLfkKfqmADwy8WxB3ZMqoutqvwfMuue4z\nn3Uamxpl3oc+jGkNGS355SWreisfVatrAUCBvFUt7twGIiIa2T5zSfZX582JneUHIawaQEMYU0ak\n1QJYvFltf+iV4i+9DaAaqrg53LIw+cHHn3n17r3beno7RERcB6m2CbGLZrQ6F46qdY7NJHUy1Ngw\niuBKZBK5WdsWrXNvfOiJl75fLJXzvDcg+su4QB8RvamdX0h7fb0zUs3v5jEqIiv9SFdkPAn6Av1p\n2eKPqhpuX30JLF7ftK3n8/WpeNXDd//0vH+59YeYe+G78Oxvfy0i8bZjZk35vjjuL7d1dm5r7+5d\naERWKPdDJiI6pJR829+TV1U16rkiIjGxNg5A9U0r+qoQ4wBagarBny/8G/WkD7OmjD4NAMP+MBp6\nQ782I1OuOD35b6NrnVPzpSgBRCj5LqChNtZknE6d+tSdj234xKrVG5YGlYo/3O0mOlhwzj4R7TEL\nFN7sZ0NvDBRCPFq2WKyq4dD3h36mqjawdl3e6r8+98pra19avNhedfXV0tdTwJxZbTr/6/8y5+QT\nT/jIRZdcfAGM8d/RxEwiIjoo3fmb0rULXvRvtypBEKkEFWuheQCBAB4AZ6dnGKjtQdXo01E15kwY\nE+DPz+x3JaxU0FLfMHGfdYL2iKrqjFb3vH+8LPvg9DHu+V39YUIERuGauBvaqlzt2sdWNnz+mz95\n+uxXV6x+sRKGwXC3mehgwrBPRHtsT4bMqWrwFx5nC2X/9+r7v/jpD75rJ02aZD/8sWvk6NPPMO1b\nN0fbNq6vW7Fy1aKe3r4N1rKqT0R0qOkv6pbbHyte85Wf9V/8wsrwkXwZ26w30XrpySqOqGqoqlCF\nBeBAbRnx3Byk6yYiVTMB2dHnQ7WEN30hEoUqZFQNpu3HbtFujGtyjv37uenbxjWayb2FSGOucVQF\nzbUZBOljFt72aPi+Bb9dfnNQCcvAnt2HENGfcBg/Ee1XAyv9SzmKe3f+Ycmyi39x7x3N8z40Tx99\n8D7c84N/NS8/v2LTRmPuAbfZIyI6JNmB14no1fXhr1Zuyj91+Fj39HOP2vq3J7WNe1ftuIuM46oU\ntq1EuW8tIn8LnHgjasaeBnFiUGuRzI2G3zcd5Z7lgIntcnwBoFBUJcOG/d872t6lxye/2JRzxkRW\n1YiIVdWm6kiRm7XoxpufvDQIKj4DPtHbx7BPRMNB86Xyiw3J2H/9163f+4IXT2Py9Fn6/NNP9fcA\nNwN4nS/uRESHrqHXABEpLFkTLvjj2q6Fv3g2f/axk9dcevbcD58wu+3D04NyF8q9m+HGknC8BKKo\nDHFcwCpStYfB718HteHu5u8PfENcThYbJiIimQRabv5I7uggVCRckXTSSKTGNjePKv3w8U03+X5Q\nNsbw/4joHWDYJ6L9bvAmLnCM+RcV8W/66jc+VYgnNhQL+c+VgSdgLefkERHR0OtFNPixwIg8srr0\n+HtunnH4j8TNVGfqJ7lRWIYNfRjjwaoFrIWXrIWbyKFS7NzNMaECoOz7fK0ZJiKQVFxymSRSAgEE\nqM16qE2XdVOh/oVlq1Y8a4wx1lpO5yN6Bxj2iWjYRNYWAHxl8IOIiOjPEiNOV1d3px8EfjKZALQC\nEQdiXAAWxkaIjIXxkoilmhDuJuwDgIiiXA4q+7f1BABGxFhVm8s45aKv1nMBI4JUDGHcRfTAC+ah\nre3b1nOEH9E7xwX6iIiIiOigoArNl0qlUtmPHOMJjAsxHozjQYwLcf70by/ZCEiEXVbmF4GqA99p\n2TwsnTiEGRGpycrYvzox/eXPvzd3bzphsum4iOsIVAvOH3rPfurJZ1+9m2P3ifYOVvaJiIiI6CCh\nWiqFhXIQReKIIPIURkXVQkwEtRZiLEQt3EQNIAKogx3WfFWrjhvDynVbFw1bNw5BRkSaa8zM/3NR\n1e1TW4ptYspG4YiIB1XACJCK1uXUVliMJNpL+MtERERERAcFVWi+WG4vFIp9RoyICIxxB6r6xoUx\nLqCAQKBqgd1twKehWKdOVm7sf2q/d+AQJSIS8yR39bnpf58xpjAn3XSiqZ94vklkJ4laHyIiQaUS\nTm52x48dVTtNjGFBkmgv4C8SERERER0UjIgplMo9ixYv/f3RbYfPyheKKsaBqCtQi0LvanS9djeM\n14zQ74BaA5GddnIVVwta27Fo8crHhqcXhx4jcI6a5L677bDcrOopc6NYMunGHR/F3s1QDSEAHMdz\nyuX+RNt45+L1G7xVxsgaKHRwK0YRgUChQ3spqEI5r5/oz2Nln4iIiIgOeCIi1Wm0jq5z2x7+5cL7\n1m1Y1+u4jkDMG5X9sNSJSqkLQf412Eo/RHa81VV1FAL74hrvF119xa3D1JVDjudKcs5k7+z6cSdW\nfe/hdc4TL3RATBzl/uUQkwKgMCZpnKg9MfeIro/+/cWjf+x5scRQko97UjuhyTvxmCne+46d4l0x\ndXTs9HTSrQcG3gAavp4RHdhY2SciIiKiA5qISHUK4z55UebnDdVOzg+iYO0Lt3qxI+chlsjAjWdg\n3DgS1eMgcCGSBeDvchyrUVSRmq6nlnY96JfLxf3fk0NT3ENqbIN7GLwM/nfJcvnABYfDhj7C2BXJ\nFQAAIABJREFUUh7GrQFQATDwvo21cOa0bjv1S/OmPHbHo6u++Dfnpi//7t9Vz23KOc0xd6CwH6qD\ndR1mwzlH1d7oeeY/RaTIKj/RroS/F0RERER0oBIRySbQ/KlLMgvnTIzNiCK1KmIMYDTshTiAcXJI\n1s1B1aij0LdhEQqdT0KcHKAWUAUEUMTUsX3yYt+5D3z7p098qFAo5K21h9yNsBFJZDycHxOZYgyq\nHMAFtGwVXYHFusBic2CxIVS0A4h0cBg9ADM6hdtr4uaDVmGrY2K3lvTnq/rtfFVd9ufOWZd1xsy/\nIv34tGmHTWo+4krHqI/Ny+5H/5YlEBPDUB6RwWX4Va0aIwgqbiXuhZ4CiKwqdGidfoVrRCIYfeq1\n7P23P9pxXWd3YS0DP9GOWNknIiIiogPazAnJuUdMyBwmUlHH+IP3rwJ4WYgo1Ppa7nhcK31LEEuO\nQSxeD4URq4BakVCNFVj0p89de+fPXvpSPp/PH6rB0AjSdTH5eNqTU43A3ViBiBVFhACu5hscaXeg\nrxdCPNtX0UdF5HlVVUckGzcyUxWIFJJ24Fw1Mfbe+9dXmkTks6r6/Jud06raSKVc6FyJ1b/5OmAU\nURjAGA9+aAEAnvOnDfdEjFir6prQi+zg9yAiZuDtAFVopICqxalTtlwS6ITSDx547e9Y4SfaESv7\nRERERHRAy6S8ulmHNZ9x9OTMu46aknpXVTpRG2rcL4dOvli2vb0lr73g+x39+d4+3/cLEeJ+EEqp\n6Gu+ULI9+XKlvVDI5zd3FF7fsKXz9eHuz3ASEa8hIZ9SV+ZfNdaNHVfvSa9v0VMxWO3H9aWugj7f\nFUi1I35THN3dvj7cXtbvRIqtE7LydMzIZAGwLQA+MNbVExo9+6XFpd8s67UfB7B8d2E7mzR11/1V\n9d2zJ5gzBXFHoQACDSoqYQRJxeWNqv5bFUZaCTTe/W8Py98tWrb5ochq9I4uENEIwrBPRERERHSI\nEBETdzClPiE/npGV4249Nus0Jl2xGiLqr6AHFiv9nC7c1Gt/tsYXJwapFqxrL9sf5mLykbgjExVA\n3Ii80mtx3ykpfa2omP9y+Z7ukv17BXpVdwzcjhH33KOyH3//qakvp7ywCsaxfWFdu1S21tamNQ4V\n4G2GfVUoJNSnVzf9v3//n7V/Wyj5fXvhMhGNCFy9koiIiIjoEKGq1o+wohzqj17o0eLNK8raV1H1\nW9rQf8bfInXsZTiutV4+N73a+Z9TU3Jlq6dJR8bWxM2X4460QkQAkZJVNKYEt60OcEajp5eN9S7P\nxPEJAYzstEL+9DHuWTPGmNN6i/F+P/JQtploc3/tlqAS+oBRxduvPg5syWcwY4xzUjYTr3vnV4ho\n5GBln4iIiIjoECIDabx6XEZ+UDJy+a1tST25JWn6UqOwrHoSao48C1P718E8dzf8YqTLegq4d10Z\nCzaFqPZEHAPEHSCyQGcEnFTnarWjesfGsD9WsR/r8vWewUX9oKr6mUuyvzpvTuwsPwhh1QAawpgy\nIq0WwOLNyvpDMeUvDfFXDVXcHG5ZmPzg48+8evfevFZEBzNW9omIiIiIDiGqqpFqz4ai/nMWaL9j\nbYDecqC1hQ50PLsQD7++ATjyDJiaFrjrO6WtGvKFw6vxT4cnJK+K/khxZqOLm2ancOvsJM5tcmRy\n2sjcBlNVcs03jcinBWgYWsm/5Nv+nrxq0Tc2sqIWMYS2GgPz+98kyatCjIFIhL9cnDTqSZ/OmlJ7\n2l6/WEQHMYZ9IiIiIqJDjIiYINLXeir2llUFa1/qjjTSsp7enMD0pb/Gfz/6a2x41z8i9smbYOLN\nSFdE/npCDj8+OommmMH/XV/BynyEExs8XDw6jr+ZnJRvz8nIEyelxnz+8PhNo9Pyv9WeXAEgdsev\ni9f+8oXy7VYlCCKVoGItNA8gEMAD4OzUOgO1PagafTqqxpwJYwL8+Un9roSVClrqGybuq+tFdDBy\nvvzlLw93G4iIiIiIaD8ZHGIv8+fPd6DoDIELIcid2uBJ2oEk+zfh3oVP4Z6nl0ImTkXDmZch7QjC\nravQ4rpoqxOs7I9wy+oKPKuYWu3AFYEjgvqEwVG1rp7S4NavC/SSvlDH95TwwkurwzuXrqs8k004\n9VUpk4unxyZjyUZRW4DaCgABxIrAhdoy4rlZqB59FLxENYzXgHLvK4C4u4/8AkBDiWUnxttOe//N\n+/ViEh3AGPaJiIiIiA4hX5k/P5F0cGSVhysUcuWsajM1LkhOq3bQkDDSYx2s9D387vUuAAHqJk/H\n2HMuRax5EmznZlT5m+Fbg0po8cfeCL0WaKs2cB2BqogjQFPC6JkNnqRdTF9TtIf3V3RpZ5/+7pkV\nwf2r28MlcS/MjmnKTa5tPVOyjTME4sGGvtiwC068AXUTL4DxElAbwU2kEfolhKV2iOw8CgAQCFQr\nSGTHJqad9IGv7f8rSnRg4gJ9RERERESHCCOSqk/gulzMfKDKw5i5o2Kpc1o8OALEHZHWlIOCSeCZ\nsAHrM+OQGTMO6XGHYU7bbLSsWYxo1RJESxeg0N+H/lDQG1oUQsW0rIO0ZwaK7H+KF+pbqz9fH4Q3\nvlr+3eaCXhEp2kVgjMBMHR07+9jJ6UvPnvvhE2a3tU0Pyl1S7t0MN5aE4yUQRWVoFEBtBX7fJnSv\nfQxqQ8guK/YJ1JYgtWcH7/nMA/H9ekGJDmDucDeAiIiIiIj2j+akubkhiav8CKYqBnt2i4dp1S5U\nVRSCSIGEBjg70QlHCkApQNRnUNmQgG0cDf3fu2AKncjE0sjGLMZgIODbwQ/FDqvnS8wYubQ17nb5\n9vRvrQhuKPl6tSpsaDUCsMCIPLK69Ph7bp5x+I/EzVRn6ie5UViGDX0Y48GqBayFl6yFm8ihUuzc\npU+qUAFQ9v1g/1xFooMDwz4RERER0SGiK7DfK4Z4qiom71lfkOOufK7Y/IFWVy4cHdfmhJH+iiIf\nhohsGTHThdSWtcgsfRJxGIQtk2DSKcB1ILBQABEAKCCiA8Pp4UA1BEQgGJhOHzMiH5yQwAv9+uFf\nrQ0eDxRvbI8nRpyuru5OPwj8ZDIBaAUiDsS4ACyMjRAZC+MlEUs1IdxN2AcGzl8uB5X9cAmJDhoM\n+0REREREhwg/whI/wpL+UH+RdvTExqT5zl1rK+Oe7ozQEDeoiwGjUoKauIOc5yAXi6M24aIh4SDV\nvw7apxAnBmAw3CtgoVArsNaHEznw4gILA0AgMrCLXi4m+uXpcd3cF372xS77vIisVFVVheZLpVKp\n7EeZdFZUFaIKA4WFBRz7xr+9ZCMgSzCwgv92U5FFoNaB77RsHp6rSnRgYtgnIiIiIjpEqKqKiKii\nP2ZkasxBna/A60WLY+tcnN3ioTXlIGEAxwzU6hURBBEgHgSKwcH6A3FbFKvzil+tL6MvUYN5H7oK\nzitPIrflj4g5zsCYfgGsiozLOPrJ6Ynp171Q/FhHGV8SkbwItFQKC+UgisQRQeQpjIqqhZgIai3E\nWIhauImageOpAyDcrlNWHTeGleu2LhqWi0p0gDLD3QAiIiIiItqvTH1MPt2SlvkAMnEDfLstKddN\nT2JmtYuMK3CNwAggIjAiEJGheI+hPe8FAFQwPu3hnKyg9fjzsWLccbhB2/DzYDTgpqGqg28KAGoh\nx9d53uwaZ5YC9cDAfPt8sdxeKBT7jBgRERjjQgY/jHEHpglAoDq0KsBONBTr1MnKjf1P7ftLR3Tw\nYGWfiIiIiOgQISJOxsUFtUm5RhSuBfSaiTHJxY0u7QmlOibIxQziBhhI6EPPG/iswMC4fBEADgAL\n63sYlU1j6rLf4pHAwbbXX8OyqafhcaeAI169FzXpWrheCGOsruz3Ky/16MsAOgDAiJhCqdyzaPHS\n3x/ddvisfKGoYhyIugK1KPSuRtdrd8N4zQj9Dqg1EAl36pSrBa3tWLR45WP75SISHSQY9omIiIiI\nDhFGkK2Ny9WeQatVqCfAPRsqetf6isQFqHEEV06K4+RGD6KAMxjy7RtHUBgRBFGITWsU6+pcBLXT\nEVXVo99LIG4jnHf2mVAA37zzLsydNAen1mXQ2rUUNVHBTK1Oep+bbt9/07LS8i1lvb0qpS2ZpFvz\n8C8X3veuM49/f0NDU7VVHVigTy3CUicqpS6InwdgILJjfFF1FBLZF9d4v+jqK27df1eS6MDHsE9E\nREREdIgQRbwUYUno2y0GkhFBVXdFRycdTDYiWRODjE87cETgCNAXWLT7ipakQdwRGAjW5kMs2FJC\n9fHzMPP8C9A0aTrS2SxczwWsohL46O3pRl3zaDiwaD36GISrXkZl0QJkn/8fubQ10dhfsV+86dVy\n6ZMXZT7ZUO3kgkoUrH3hVi925DzEEhm48QyMG0eiehwELkSyAPxd+mM1iipS0/XU0q4H/XK5uN8v\nKNEBTFR3M++FiIiIiIhGJJGhQfkD0+5dQeO4tNy23pcLf3JMHOeNjkvFCl7cFuAnqwNcMyWBw6sd\nGDFY0O7ihld9XPq3H8OnP/0ZiHEQhiG2zxQyOMffdV1YaxFFERzXhUYV2MfuUvuzT+mGUi3uS5T1\nmBlxRJFaFTGOiNGwF+IAxskhWTcHVaOOQt+GRSh0PglxcoBaQHVwhkFMHdsnL/ad+8C3f/rEhwqF\nQt5ay3BDNIiVfSIiIiKiQ4ts92+TcXEGjBwzsxr26PqYs6FocddqH7/YGOLWY1KYnPWwuc+gX0tY\n36couyn0bOtCb28fMtnswAFlu0X7RKCqqAQBIKKAwIYh1m/cJNXHvkecWJUs+8m/6FHT8gaoqGN8\nM9Qs42UholDra7njca30LUEsOQaxeD0URqwCakVCNVZg0Z8+d+2dP3vpS/l8Pq+sYhLtgJV9IiIi\nIqJDkIiIZzB+XEbu6QlxzOVjXLlyYlK++koZq/sifG56AikH+HV3Cunaiaga34SGqW2I1zUhlkxh\n1uw5aGhqho0iKBSJRBKlYhFd2zrR29ONsBLadCYtdfWNms5k0LltmyQSCalUKii+8gJW3Her3dq7\nEcnDaiq1uZQTabzsR26+WLa9vSWvveD7Hf353j7f9wsR4n4QSqnoa75Qsj35cqW9UMjnN3cUXt+w\npfP14b6WRAcihn0iIiIiokOMiIiqalNSvtaUNJ/rrqhzWasn7T7kV+0h5lQb5GIOFvc7OG3uX2H8\nhIno6ezA5rX/P3t3HmbXVd75/veuvfc5dWpWqTRYozXalizLSI4xhtgOeMJgAzEhjXPp0EAH+pKG\n3Avp5ul7gQ4Xku7H3CYTBJLcOAPXNzTwADZgYzzEARQcbIJFGGR5kGTNc1Wd+ey93vtHSfEkYSeR\ndOSj7+d56pFcp87WWqWS9/7td71rb9XO3fvVDonmJkFnrz1Pc+Yv1CWvuFxTU1P6yuc+q+/+cJOa\njYYXRVS5XKounDsrXnftNcMv/flf8MrgkJIkCSEE7Xl8k/b92e94su2h9u8dnrE7H5n/4P3fffCN\n3f7eAL2CsA8AAACcgUrBViwbDg8F06BJPhWlfrOQBVfVg/LJXC+55MLY8VTfefBhy2O0sxRVHs6k\nJFNsN1WvusbOO1eXvOR8fe72OzVar2tk3iwPIajWKf5++8HJd7Xb7SDp3eek6U0f/rM/La9ctdqT\nJA3RXRvuv9e/+Du/5Ve/9W1qKDn4wY/991nd/r4AvYKwDwAAAJxBjmzQZ7PL9juz++03C1dhUi6p\nFkxj0aUgyUyx2YnWKJL22OhApliEmLeP5AeTBVMImVqe6vDhqs46a1yxXfei3fB2Hp/YWo3XtqMe\nc3cPIVjFdIOVyx/6pRtec97lV17Vd97qNapNTuhPfvfmYtfu3fse+PFjv91otf6wu98doHewQR8A\nAABwhgnS+FBJ17oU86gnJjt+W+GamNNnH5ZkUVKM2tu25B9LJRvpNKoXmFR+aiN/lxdSnudKLWj2\njLJaB/dpIulTX1JWCPmkqTUgKZhZlKS667ZyUfzwr798+2/s2LH9LcNj4/2zRobi5N69Ox784ab/\n0izil7r1/QB6Uej2AAAAAACcWpVUF2bBFhxu+Z/vqMV37G34h929bqYgyRuF/932Wnz7RCv+dUlx\nsUmlp7/fp0VJheRFq9oqFiw/x1/7hhu1cOVqa9eL8+YPlT8zEPTKp++S3+7kW2eOjf2/r33dG3Z/\n67t/f+vgyMijYda8P2lJX9P06gIAJwhhHwAAADiDuLubqbyjHt+6s+7vrhf6tkv1UrAlJsVqx+/c\nUfN/V811Zz33bxWuSZNcUpR7cSS8ux1dyW8KpT4LjfqEli1Z7B/9b/9Nr3jFz5eyvHXx4rG+vxwu\n2S8dDfwxxmJ0ZHjWxo0bf1Ct1v70rm/e8+k777n3E528qPHoPODEomcfAAAAOEOZWdCRQv38gfDn\nfYmtebIab+y4th39ksFU18/pDx8qBS2UVDKpP7oO1XP/u2pH90f54VKwZYNpuGFPy859/StfFd71\ngf9k73r3r3s8tFfemNi6o5q/ZyrXHZJ8pL9vXeGamqo3NnVv5kDvI+wDAAAAZ6Cjj987+t9jfeFd\n9dwfaOb+D0//GklWClrel+j8vkSv6E9t3YGW/361o6+71JKm7xaUE1sxb+bYR5Vlb3jf+38zmT1n\ntr3l375V584a9EarufHxic6vefStkuRSNbrXnz0GACcOYR8AAACAErPBwr16rNeOhvLBzF5bRG1v\nRv2ju+dHbgYcaQ2wUAph8Xh/+VNrzl1xzW9/8jP67Y99TA98629kZpq/cNH3LUm/fmD//gN7D018\nY2Kq+kic7vsHcBLQsw8AAABAUaod77Wj1fdarruaUQ+7e37080dfc/fYjnFbNfr/+PufPLr1Bw8/\nHP/dO95hk4drWrdmrf/Wx3573Ssufdnbb3jD61+tEFqy4/1pAE4Ewj4AAAAAvZDl9O7efp6vi7Vm\n6zvean3tLz/9B3HZsmXxrf/hXXbRFb8Q9u7ZVRzY8eTMRzY//uDhicntMVLVB04mlvEDAAAAOGHM\nLAxV+i62TusLH/o/f3Pu5de+Ptx12xf1nW/e7j/83iPbd4RwXYzxx/TqAycXlX0AAAAAJ5JXG83v\n92XZX/zFJz8VNtz3TS0/b42XBmdOHZY+Iekxgj5w8lHZBwAAAHDCJSEMzKyU3ten8L/Vyn3b67Xq\nf2q2O/dKer5WAAAnAGEfAAAAAIAewzJ+AAAAAAB6DGEfAAAAAIAeQ9gHAAAAAKDHEPYBAAAAAOgx\nhH0AAAAAAHoMYR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGEfQAAAAAAegxhHwAAAACAHkPYBwAA\nAACgxxD2AQAAAADoMYR9AAAAAAB6DGEfAAAAAIAeQ9gHAAAAAKDHEPYBAAAAAOgxhH0AAAAAAHoM\nYR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGEfQAAAAAAegxhHwAAAACAHkPYBwAAAACgxxD2AQAA\nAADoMYR9AAAAAAB6DGEfAAAAAIAeQ9gHAAAAAKDHEPYBAAAAAOgxhH0AAAAAAHoMYR8AAAAAgB5D\n2AcAAAAAoMcQ9gEAAAAA6DGEfQAAAAAAegxhHwAAAACAHpN2ewAAAAAAcDxmZmmi/rVLSjesWpi8\nZt5YcvFgxZfLQ8yLQqkVoW90zYEHt6U3337vD/6o3mhW3d27PW6g24x/BwAAAABON2Zm7u4zh8LK\nm66o/O78seSyaqPok1yuNMjzYvaMwWS/n7Ph8/dvf8/jT2z/UbvTaXV73MDpgrAPAAAA4LS0amF6\nzduvGvi9Slkrt+zpxHJmIXqicprH8sDYlm8/OvLH3/j2pt9vd/Lm0ZsD3R4zcLog7AMAAAA47Sye\nk1z8gRsHvzBrOMzbvLNjtaaCJJ8zNqw9xYo7/vquTR/esmP/w3med7o9VuB0RM8+AAAAgNPOjZdU\nPjhnNFlQRPdgZtHd54wUrtE1D978iftubLc7LSr5wPGxGz8AAACA04aZ2VDF5q1amF3Uzl1ZMBuo\nBBusZD537sLGl+7f+fFWq900s24PFTitUdkHAAAAcNowk/WXbXSwon6TSSaNDWUaG2j6ztr4Qz9+\n/JEHQgghxhi7PVbgdEZlHwAAAMBpIZiFGD22cmvWWx7buauTS/0l5TMGlX93c7h9z94DTxL0gedH\nZR8AAABA1wUzmzFki37x0oG3fuCNo9cP9PlQlhx9Al8t+YeJa7513wPfvpXF+8ALQ9gHAAAA0FXB\nzObOCOe/94bhW845q77WQjO4EjPL5C4Fk/qLbaMeO6xMBl4g/rEAAAAA6Bozs1Jmo++4euAPVy2o\nrRuYc2kYX3pt6BtaZh5bMjNrdzr58rnp2YvmjZ1rIVCwBF4A/qEAAAAA6JpgStYvS1+7duXompEV\n1xelSiUtJy3VJ3bJPZdJSpIsaTan+taenbz+ye3Z4yHYFrk8uruZmZlMLtf0Gn9zl/NYPpzpCPsA\nAAAAuiZLrbJueXbl+OJLhz/11W3hgqVjuu6SWWpObZKFfkmuECpBxd6+6y/wX1syPn/1R2/d/pp2\nu92QpHJmY/NnpueND2mhmcJE3XY9eSD+UNK+YBaiO5v54YxE2AcAAADQNeVM/YtmpSuVDepvN26y\nX3n1asW8pbxRVUhnSOpIMlmQxahk3cIDl33oLSvu/qu7Hv/g264eeNMfvHPk+jmjydxSOl3Yzz3R\ntn1h+1Xrx27OsvBnZlanyo8zkfFzDwAAAKBbZg4lC37rpoF7zj135bK5F/xqErylXT/+sqZ2b5SF\nko7mFTuyDb979BBM7U7aKWd55pKK6C4/uk+/Kw1mhYJveHToy7fcte99+w/VthL4caahsg8AAACg\na6J7LNyatf2b9cT9H5OCq8jbCiFTK59egZ8lTz1wzyxYjO5pyLPiyAJ9k5mF6dsB7vLCJfeoy1bs\nfkPblzQ+/ZVH30mFH2caduMHAAAA0DV5odahWtjtlnqMwYs8uBRis+PeyaeDvtkz32M2He6f7hmv\nmVkIFlp5JX/pkkNXrV0+flUwsg/OLPzAAwAAAOiaessnHnikuGOykdU6eVt5jPFge86eWtvaA32S\nPf8hjisJllbS+vgVawff3FcuDZywQQMvAoR9AAAAAF1z3oL0VasWhMsn6uWpVpGpGQeLXVNju9ud\nvCUFd/3Ll95PP5IvaNWC5OVDg+WZJ3LcwOmOnn0AAAAAXXPt+r73X7MueVWrfVjRg+TVbO34tgsL\nHzEpyp69hv+Io7cAjvPy00Qb7avPW71s3sskPXEixw6czqjsAwAAAOiaRitOHa6611shFtE8qqQ8\njmh6M73jJHl3WQgyK/T8e+4Fz2zS16wYu/yEDx44jRH2AQAAAHTNZ+9vvPuO77duiW7tduHW7sQo\nr0pqm5RJSp71jiCPhzU8/woNL3ilQmjrZ3f2p5Z3OjprfNbSkzYJ4DRE2AcAAADQNVN1333L3fV3\nfeRzU69/aHN+Z7WpAzFbGrOB5W6JuXvu0437UVIij02VR9dpYOZS9c9YoqH518q9oePW983lLps3\nQ+eewmkBXUfPPgAAAICuie5uZsVPn8y/uXlndcPqRekVV6/f8+9fvnbxdWOLbwhJ6lY7sFnNya0q\nWruVlGdrxqLLZUlJHqMqo/PVmjxPzcObpFB6zvFNkss1XMlnnfrZAd1jz9/jAgAAAAAnn5mZmUIw\nhXPml668ePnAjVde/9aXXbh27Xnt5kFrTuxSWqooyfpUFE150ZbHjlqTO3Vo693ymB9jQz+Tx4Zs\n7Mr2697/lXJXJgZ0AZV9AAAAAKeF6U35VBz5uCOY3flE457XfWLV6j+1dHBkcHxZWuRNxbylEDJF\nj1KMyipjSvtG1anvP8Yx5Sap2Wq1T/F0gK6iZx8AAADAacmCJQcPHtrfardbFlJJJrNEFlJZSBUs\nlUKqkFVU6p9z3G36zFzNZrtzKscOdBthHwAAAMBpyV1ebTQajWarSEJmCqksZApJNh34k6d+n1Vm\nS1boOTvzm8k9USs5a1dXJgF0Ccv4AQAAAJym3BuNvNZsF4UlZioyV3Bzj7JQyGOUhSjzqLRvhmQm\neSIpf9ohoidpSZu37Xmwa9MAuoDKPgAAAIDTkru8Wm/urdXqk8HCkd370qeW8YdUcslkco/SsR7A\n57nFZKZt3jG14ZRPAOgiKvsAAAAATkvBLNQazcMPPvyj71y0dvWaaq3uFhKZpyaPqk08oYOP3qqQ\nzVXe2iePQWb5Mw9iqdd8bN+DD2++uzuzALqDyj4AAACA046Z2ciAFs6fma796te/8cVt27dNJGli\nsvBPlf28sV+dxkG1q48qdqZk9sx44564TPH7W7KvHZys7+nSVICuoLIPAAAA4LRiZjbSr8W/ccPg\nl2aNJKOtdtHe+tAns9JL3qJS36DS8qBCWlbfyGKZUpkNSWo95zjRi6JjMw5u+NHB21rNZv3UzwTo\nHsI+AAAAgNOGmdlQn+a+93WDt61dkq0qCo9uWQg6GHZ+7yOyRArJqFdmrtPwvPXqH79Utf33yZJR\nyaPkLpnkKnnqk8nGQ6/YsPGn997rsmM09AO9i7APAAAA4LRy/pLK9RcsGVxp1vEktI5kFpOyIZm5\nPLa8ue8e70xuVKmyQKXyuFzBoksezXIP0RQ1NXD11s9+7gcfqlarVXcn7OOMYvzMAwAAADidDPZn\nM9esnPsLFy0fvG79iv7rhgf6xnIvt5p5Uq0348REI9tba7X2TVUnJlutVq1QudXOrVFvebXWiIer\nzc7eWq1a3bWv9tj23fsf6/Z8gG4g7AMAAAAA0GPYjR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGE\nfQAAAAAAegxhHwAAAACAHkPYBwAAAACgxxD2AQAAAADoMYR9AAAAAAB6DGEfAAAAAIAeQ9gHAAAA\nAKDHEPYBAAAAAOgxhH0AAAAAAHoMYR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGEfQAI/hjrAAAg\nAElEQVQAAAAAegxhHwAAAACAHkPYBwAAAACgxxD2AQAAAADoMYR9AAAAAAB6DGEfAAAAAIAeQ9gH\nAAAAAKDHEPYBAAAAAOgxhH0AAAAAAHoMYR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGEfQAAAAAA\negxhHwAAAACAHkPYBwAAAACgxxD2AQAAAADoMYR9AAAAAAB6DGEfAAAAAIAeQ9gHAAAAAKDHEPYB\nAAAAAOgxhH0AAAAAAHoMYR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGEfQAAAAAAegxhHwAAAACA\nHkPYBwAAAACgxxD2AQAAAADoMYR9AAAAAAB6DGEfAAAAAIAeQ9gHAAAAAKDHEPYBAAAAAOgxhH0A\nAAAAAHoMYR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGEfQAAAAAAegxhHwAAAACAHkPYBwAAAACg\nxxD2AQAAAADoMYR9AAAAAAB6DGEfAAAAAIAeQ9gHAAAAAKDHEPYBAAAAAOgxhH0AAAAAAHoMYR8A\nAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DGEfQAAAAAAegxhHwAAAACAHkPYBwAAAACgxxD2AQAAAADo\nMYR9AAAAAAB6DGEfAAAAAIAeQ9gHAAAAAKDHEPYBAAAAAOgxhH0AAAAAAHoMYR8AAAAAgB5D2AcA\nAAAAoMcQ9gEAAAAA6DGEfQAAAAAAegxhHwAAAACAHkPYBwAAAACgxxD2AQAAAADoMYR9AAAAAAB6\nDGEfAAAAAIAeQ9gHAAAAAKDHEPYBAAAAAOgxhH0AAAAAAHoMYR8AAAAAgB5D2AcAAAAAoMcQ9gEA\nAAAA6DGEfQAAAAAAegxhHwAAAACAHkPYBwAAAACgxxD2AQAAAADoMYR9AAAAAAB6DGEfAAAAAIAe\nQ9gHAAAAAKDHEPYBAAAAAOgxhH0AAAAAAHoMYR8AAAAAgB5D2AcAAAAAoMcQ9gEAAAAA6DFptwcA\nAABOH2ZmaaL+tUtKN6xamLxm3lhy8WDFl8tDzItCqRWhb3TNgQe3pTfffu8P/qjeaFbd3bs9bgAA\n8EzG+RkAAJiZubvPHAorb7qi8rvzx5LLqo2iT3K50iDPi9kzBpP9fs6Gz9+//T2PP7H9R+1Op9Xt\ncQMAgGMj7AMAAEnSqoXpNW+/auD3KmWt3LKnE8uZheiJymkeywNjW7796Mgff+Pbm36/3cmbR28O\ndHvMAADg2Aj7AABAi+ckF3/gxsEvzBoO8zbv7FitqSDJ54wNa0+x4o6/vmvTh7fs2P9wnuedbo8V\nAAA8v6727JuZSdKMwXD2zy3PbloxP33lzCG7MEs1GmOIXrTCwPDCuN+X/s9b73j4w0/u2PMYVQQA\nAE68Gy+pfHDOaLKgiO7BzKK7zxkpXKNrHrz5E/fd2G53WpyDAQB48eha2D+6/G/p3OTKX31l/ycl\nP7vdiaEoLLQ6SRwuVZPy2Ordd270//Kdh+7/fKPZqnORAQDAiWVmNtinsz7x9tGL2rmrLzUbqAQr\nPMS5c+c1PnPPzo+3Wu1mCMG6PVYAAPDCdS3sZ6kqr15ffs/v/NuR39qyp5NO1KNCCGYyHx9VbU/r\nou/+z9ue+E9bt+/dGIIFgj4AACeemay/bKODFfWbTDJpbCjT2EDTd9bGH/rx4488EEIIMcbY7bEC\nAIAX7pSH/aMV/UvOyd78b36+8p+T4Gmt5RYsNfNOHJ+9dM+dD8eP3ve9h29ptVpNSYrRucAAAOAE\nC2YhusfRwaRZb3nMUimYqb+kvJyq+MpD4fY9ew88yQ13AABefMKp/gOPXjBct77vP/b32bCZzCQz\nxXjBktwe2jn3k3dt2PSZdrvd5OICAICTI5jZjCFb9IuXDvzXD7xx9PMDfWFooGyWJib3WvIPE1du\nuO+Bn97K2n0AAF6curKMf2worPjkO0fPdXfLsqCBSupjAw1rj7xp5+33ff3THj1Ggj4AACdFMLO5\nM8L5771h+JZzzqqvtdAMrsTMMrlLwaT+Ytuox84pLwoAAIAT45SfxM3Mhis2p6+ssmm6XjBvhmnW\nrAX+pQd2/7dDhw4dIOgDAHBymJmVMht9x9UDf7hqQW3dwJxLw/jSa0Pf0DLz2JKZWbvTyZfPTc9e\nNG/sXAuhq0/uAQAA/zKn9AQezIK7x9kz0lqz5Z4XrnKWaKQ/xkO+6Ikvf/VvPn0qxwMAwJkmmJL1\ny9LXrl05umZkxfVFqVJJy0lL9Yldcs9lkpIkS5rNqb61Zyevf3J79ngItkUuj+5uZmYmk8uP3LM3\ndzmtdwAAnF5OWdgPZnbWWLL6La8cfNv/8abR16RJVDkzi1GxoZHa579V/b+LGIujG/idqnEBAHAm\nyVKrrFueXTm++NLhT311W7hg6Ziuu2SWmlObZKFfkiuESlCxt+/6C/zXlozPX/3RW7e/pt1uNySp\nnNnY/JnpeeNDWmimMFG3XU8eiD+UtO/ohn/dnSEAAJBOUdg3M1s4Htb/768f/POzZzXONZNN9wam\nilHKrF5KikMV6akN/AAAwIlXztS/aFa6Utmg/nbjJvuVV69WzFvKG1WFdIakjiSTBVmMStYtPHDZ\nh96y4u6/uuvxD77t6oE3/cE7R66fM5rMLaXThf3cE23bF7ZftX7s5iwLf2Zmdc7lAAB0n53s87GZ\nWaVkY7/9b4f/bvlZvrx/9iVe7h8Mh3dsVKe5T2apzPL8ezvP+cLHbvn7m8wsLYrYOamDAgDgDDVz\nKFnwWzcN3HPuuSuXzb3gV5PgLe368Zc1tXujLJR09LrAjmzD7x49BFO7k3bKWZ65pCK6y4/u0+9K\ng1mh4BseHfryLXfte9/+Q7WtBH4AALrrpFf2gyl52TnpL688e2zB0OLXxL7+cpJ6Q5O7fyIpSnLF\naGHWYHPtS88d/uWHHq19JQQrjvb/hWBBksslHekRZAM/AAD+ZaJ7LNyatf2b9cT9H5OCq8jbCiFT\nK59egZ8lTz1wzyxYjO5pyLPiyAJ9k5mF6dsB7vLCJfeoy1bsfkPblzQ+/ZVH30mFHwCA7jrpu/GX\nMhu4aGV25dDCV5Y+dfuW8KMtdSmkajeelJQd+SqzBQNPnvOffzH5f669eP6vm4Xg7p4m1jdnNF39\nkiXZL770nOx/OX9R6dqRoWyRNL0HwMkeOwAAvSYv1DpUC7vdUo8xeJEHl0Jsdtw7+XTQf/YZ1mw6\n3D/dM14zsxAstPJK/tIlh65au3z8qmCn/ok/AADgKSe9st+XaWD+zOzsmA36T7f/xP7DL1+sxuRj\niu22QlaRVOjoNURR5NmbX97+z5P18UOXnZ+Ej75l5F3LzkpWD1WUmUtRQfsn0+ovXzH+qcH+7H+Y\n2T6qBgAAvHD1lk888Ehxx9K55Zf2Z+1hhSRO5nP2WmfP2NiAl/WvOKsmwdKK1cevWDvnzf/4WOle\nSZMnbOAAAOCf5aSH/TQJpXJSjHb2Pmif/b/eLG8f1raffEuW9Mm9kDTdF2hypUmSJUlzxq9fk30y\nCyNZksjzGNVo2pFLj0IjlXzwV34++c3zFp21/jN3HPpfzexRAj8AAC/MeQvSV61aEC6fqJenkkEb\ndvUXu6bGdo8nOwakrOSKem5t/4Uxk7kHX7UgefnQYHmmCPsAAHTNSQ/77jFGhdbUno3eOPiYpFx5\nXihYqkbH1ZdJ0tOuKTxYGqY3AMoLmWQK4amLjuhy96j1i/a96l03rPj0f7/1p68zsxqBHwCA53ft\n+r73X7MueVWrfVjRg+TVbO34tgsLHzEp6nhdckfPss9/GyDaaF993upl814m6YkTOXYAAPDCnfR+\nuk5hzYlG2CfLFAvzokjcTLHRdp/e/+eZVw1msmd75utmwSx0ir5i7Vk7Lv65VXPeQF8gAAAvTKMV\npw5X3eutEItoHlVSHkeOPPr2OEneXRaCzAo9/7314JlN+poVY5ef8MEDAIAX7KSH5FozHvr7zfHu\nRidrdfKWck/z3Y1523JXLKXHvax4XiFY4rFZ+YU15X9TqZSHT+igAQDoUZ+9v/HuO77fuiW6tduF\nW7sTo7wqqW3TG+cmz3pHkMfDGp5/hYYXvFIhtPWzz96p5Z2OzhqftfSkTQIAADyvkx72z1uQXrVs\ntl10uF6ptotUdR/vbDs4sLUoio5k/tTCwH8eM5msrOVzff3oUN/sEz1uAAB60VTdd99yd/1dH/nc\n1Osf2pzfWW3qQMyWxmxguVti7p67u9wVJSXy2FR5dJ0GZi5V/4wlGpp/rdwbx9/Hz1zusnkzdO4p\nnBYAAHiWk96z/+qL+t535drkF9qdA4qeSP5I5eULO5flcbo38HjVAXc/bt/gUaYYhkr12auWzr1E\n0qYTP3oAAHpLdHczK376ZP7NzTurG1YvSq+4ev2ef//ytYuvG1t8Q0hSt9qBzWpOblXR2q2kPFsz\nFl0uS0ryGFUZna/W5HlqHt4khdJzjm+SXK7hSj7r1M8OAAAcddLDfqPlUxM1d/fEs8yCqV+xkMxc\nxwz67pKZQlJWLKoye+6FxFNMqTXi+csX/7ykvzhJUwAAoKcc3dTWzGobt+R3/OPWg9/42gPVKy9e\nvuXGK69/68suXPvW89rNg2pO7FJaqijJ+lQUTVmSStHVP7ZSralt8pgf68b89Ccs/Zd26gEAgBPg\npIf9v/qb+rs70auvuqD8pnbHQ2KFp8mUuYZkVpaUS09bDOiK6htZrqG56zW5Y4PaU09K9uz+waOC\nirxtc8fHl5zseQAA0GuOhP7iyMcdwezOJxr3vO4Tq1b/qaWDI4Pjy9IibyrmLYWQKXqUYlRWGVPa\nN6pOff8xjik3Sc1Wq32KpwMAAJ7mpPfsT9Z852fuqP+7j32++qYfbs3/ptaySetfG7P+ea4Q3T36\nkeZASalCUtbgrDVKyyManneJkvKw/HgbAdn0BsFnjfrKkz0PAAB6nQVLDh48tL/VbrcspJJMZoks\npLKQKlgqhVQhq6jUP+e42/SZuZrNdudUjh0AADzTSQ/7cbpqkG98onPb//hy9Zc+843af/zJ49sf\nDOVZmrXiJh87+yr1jSxXCFIsaqrMWKXy4DyZmZLSkPpnrpWKSR1ryb/J6QsEAOAEcZdXG41Go9kq\nkpCZQioLmUKSTQf+5KnfZ5XZkhV6zvnZTO6JWslZu7oyCQAAIOkULOOX/mmZoIdgh767qX3r9zbv\n/fzPLTt004Xn7nrl29/1m28cW6q+xsROdRqHVR6cKfcoFS2Zuyqji1XdO1sxr8nsOfcmjlxh0BcI\nAMC/nnujkdea7aKwxExF5gpu7lEWCnmMshBlHpX2zZDMJE803ZJ39BDRk7Skzdv2PNi1aQAAgJNf\n2X+6GD26yzu5t/7ukc6ff+orm97y/33pG3/c1zcQy0NnxcFZKxTSPoUjywXtyFLByui5cm8+53jT\nfYHuzXabvkAAAP6V3OXVenNvrVafDBbMzJ55Tg6p5JLJpm/MH+sBfJ5bTGba5h1TG075BAAAwD85\npWFfetoOwJKFYOHxrVsflZl0pGpvIZOOXljY9K99owsUQuWY1xQyqdVs58d4BQAA/DMEs1BrNA8/\n+PCPvlMpl+UuV0h8+pycqT6xQ7s2flJ7N92mQ1vvksegZ1T1JclSr/nY3gcffvTurkwCAABI6kLY\nP8old5fvO3joUFG4hZDJQvZPlQMLqUKSyixR1jeqkA3JFZ95kOm+QG8lc+kLBADgX8HMbGRAC+fP\nTNd+9evf+OK27dsmkjQxWfinyn7e2K9O46Da1UcVO1PPaa9zT1ym+P0t2dcOTtb3dGkqAABAp6hn\n/1jc3c3MDk20DuRFlIVgUubm0eSFzAu5u+RRSVZRkg2paE89+yBK0tQffXLf97szCwAAXvzMzEb6\ntfg3bhj80qyRZLTVLtpbH/pkVnrJW1TqG1RaHlRIy+obWSxTKrMhSa3nHCd6UXRsxsENPzp4W6vZ\nrJ/6mQAAgKO6Fval6cA/Z3zGpna7nZfL5VQmhZAqeiHzKIvFdF+g9Nyq/vQB5GEkPLqz9t1TPngA\nAHqAmdlQn+a+93WDt61dkq0qCo9uWQg6GHZ+7yOyRArJqFdmrtPwvPXqH79Utf33yZJRyaPkPv0o\nXJU89clk46FXbNj403vvddmxmu8AAMAp0tWwnyQhKYr4+Oc+/eGNa1ed+5LCbPoxP7GQhaj9j96h\nTn2P5EGdxnaZZc94v1vqDR85+NAPH7+nS1MAAOBF7/wllesvWDK40qzjSWgduTYwKRuSmctjy5v7\n7vHO5EaVKgtUKo/LFSy65NEs9xBNUVMDV2/97Od+8KFqtVo9ukcPAADojq6EfTOzJKg0azgsWzBe\nSi675CVfXLns7PNLpXJmSkxJJsW22tUdyhs7JJks9D3jGO7B5VX/0a7h+/YffmRHN+YBAMCLnbv7\nYH/2xY9/LT140fLR69av6L9ueKBvLPdyq5kn1XozTkw0sr21VmvfVHVistVq1ArNa7Vza9RbXq01\n4uFqs7O3VqtWd+37zmPbd+9/rNtzAgAAXQj7Zmbu7ucvTq9625UDHy9lSSZtSnZvuivMXvgSC1lF\naWlAaXlI5YEFyhuHZOG5xYHoMYZ0RmPDT6q3NerN2qmeBwAAvaJa7xyQ9IUjHwAAoAdYN1bZzRyy\n5R++afhbi8bTmUWMwSyYioaZtWVJpqyyTMPzX6GQBB3Y/NeKnkhePK0vMPXgDdvir/3ehz51x9VT\nU1OTMUaWCwIAAAAAoC4t47/8gqH3LJnbP9uLhlvIp5/bk2aSyjJFL+qbdGjzZi8PLVdWGlZRtOWe\nmbss98TdY2yWL9zzmVsf+vXJyclJ+gIBAAAAAHhKVyr7M4bL839u9bzXvPScwTdcuKzvSrdK0YlZ\nvd4KU9WmH5hs2u5qrXq4Vp+azGPa7MSk2WhP9wVONeLeWm1qYs+B6rYt2/f95JQPHgAAAACA01xX\nwj4AAAAAADh5QrcHAAAAAAAATizCPgAAAAAAPYawDwAAAABAjyHsAwAAAADQYwj7AAAAAAD0GMI+\nAAAAAAA9Ju32AAAAAAAAx2ZmlibqX7ukdMOqhclr5o0lFw9WfLk8xLwolFoR+kbXHHhwW3rz7ff+\n4I/qjWbVeb46JBk/BwAAAABwejEzc3efORRW3nRF5XfnjyWXVRtFn+RypUGeF7NnDCb7/ZwNn79/\n+3sef2L7j9qdTqvb48bpg7APAAAAAKehVQvTa95+1cDvVcpauWVPJ5YzC9ETldM8lgfGtnz70ZE/\n/sa3N/1+u5M3j94c6PaYcfog7AMAAADAaWbxnOTiD9w4+IVZw2He5p0dqzUVJPmcsWHtKVbc8dd3\nbfrwlh37H87zvNPtseL0RM8+AAAAAJxmbryk8sE5o8mCIroHM4vuPmekcI2uefDmT9x3Y7vdaVHJ\nx8/CbvwAAAAAcJowMxuq2LxVC7OL2rkrC2YDlWCDlcznzl3Y+NL9Oz/earWbZtbtoeI0R2UfAAAA\nAE4TZrL+so0OVtRvMsmksaFMYwNN31kbf+jHjz/yQAghxBhjt8eK0xuVfQAAAAA4DQSzEKPHVm7N\nestjO3d1cqm/pHzGoPLvbg6379l74EmCPl4IKvsAAAAA0GXBzGYM2aJfvHTgrR944+j1A30+lCVH\nn8BXS/5h4ppv3ffAt29l8T5eKMI+AAAAAHRRMLO5M8L5771h+JZzzqqvtdAMrsTMMrlLwaT+Ytuo\nxw4rs/GC8cMCAAAAAF1iZlbKbPQdVw/84aoFtXUDcy4N40uvDX1Dy8xjS2Zm7U4nXz43PXvRvLFz\nLQQKtnhB+EEBAAAAgC4JpmT9svS1a1eOrhlZcX1RqlTSctJSfWKX3HOZpCTJkmZzqm/t2cnrn9ye\nPR6CbZHLo7ubmZnJ5HJNr/E3dzmP5QNhHwAAAAC6JEutsm55duX44kuHP/XVbeGCpWO67pJZak5t\nkoV+Sa4QKkHF3r7rL/BfWzI+f/VHb93+mna73ZCkcmZj82em540PaaGZwkTddj15IP5Q0r5gFqI7\nm/mdoQj7AAAAANAl5Uz9i2alK5UN6m83brJfefVqxbylvFFVSGdI6kgyWZDFqGTdwgOXfegtK+7+\nq7se/+Dbrh540x+8c+T6OaPJ3FI6XdjPPdG2fWH7VevHbs6y8GdmVqfKf2Yy/t4BAAAAoDtmDiUL\nfuumgXvOPXflsrkX/GoSvKVdP/6ypnZvlIWSjuY1O7INv3v0EEztTtopZ3nmkoroLj+6T78rDWaF\ngm94dOjLt9y17337D9W2EvjPPFT2AQAAAKBLonss3Jq1/Zv1xP0fk4KryNsKIVMrn16BnyVPPXDP\nLFiM7mnIs+LIAn2TmYXp2wHu8sIl96jLVux+Q9uXND79lUffSYX/zMNu/AAAAADQJXmh1qFa2O2W\neozBizy4FGKz497Jp4O+2TPfYzYd7p/uGa+ZWQgWWnklf+mSQ1etXT5+VTCy35mGv3AAAAAA6JJ6\nyyceeKS4Y7KR1Tp5W3mM8WB7zp5a29oDfZI9/yGOKwmWVtL6+BVrB9/cVy4NnLBB40WBZfwA8AKY\nmaWJ+tcuKd2wamHymnljycWDFV8uDzEvCqVWhL7RNQce3JbefPu9P/ijeqNZZakcAAB4PuctSF+1\nakG4fKJenkoGbdjVX+yaGts9nuwYkLKSK+q5tf0XxkzmHnzVguTlQ4PlmZImT/DwcRoj7APAz2Bm\n5u4+Nmgrbrqi8rvzx5LLqo2iTyrUaKWS5z57xmCy38/Z8Nm7t7/n8Se2/6jd6bS6PW4AAPDicO36\nvvdfsy55Vat9WNGD5NVs7fi2CwsfMSnKjpPzj5YUnv82QLTRvvq81cvmvUzSEydy7Di9EfYB4Gdw\nd1+1ML3mv/zS0O9Vylq5ZU8nljML0VOV0zyWB8a23r155I+/8e2/+/12J2/a8c7IAAAAx9BoxanD\nVXf34FlqZlayGMuS3I97XeEuC4nkHbmH494QmBY8s0mtWTH/ckm3now54PREzz4A/AyL5yQX/8fr\nB/5k8eywfKJWeCkNibtp7tig2gM/940/uSv/N3d8a9Mn2p28KU3fHOj2mAEAwIvHZ+9vvPuO77du\niW7tduHW7sQor0pqm5RJSp71jiCPhzU8/woNL3ilQmjrZ3f2p5Z3OjprfNbSkzYJnJYI+wDwM9x4\nSeWDc0aTBS5ZMLPo8lnDhWt0zfdu/su/u/GxbXseyvO80+1xAgCAF6epuu++5e76uz7yuanXP7Q5\nv7Pa1IGYLY3ZwHK3xNw9d3e5K0pK5LGp8ug6Dcxcqv4ZSzQ0/1q5N3TcaoO53GXzZujcUzgtnAYI\n+wBwDGZmQxWbt2phdlE7d2XBbKASbLCS+dy5Cxtfun/nx1utdpNV+wAA4F8jTq8KLH76ZP7NT9xW\nfdPvf7X69u/+eM/X8mjFjMU3+Oxz3qiB8QuUZDPksaqkPFMzFl0uS0qSgiqj89U3cp4U28c8vkly\nuYYr+axTOS90Hz37AHAMZrL+so0OVtRvMsmksaFMYwNN31kbf+jHjz/yQAghxBhjt8cKAABe3I62\nAZpZbeOW/I5/3HrwG197oHrlxcu33Hjl9W992YVr33peu3lQzYldSksVJVmfiqIpS1IpuvrHVqo1\ntU0e82P1709/wlIqFGcYwj4APEswC9E9jg4mzXrLY5ZKwUz9JeXlVMVXHgq379l74En68wEAwIl0\n5NqiOPJxRzC784nGPa/7xKrVf2rp4Mjg+LK0yJuKeUshZIoepRiVVcaU9o2qU99/jGPKTVKz1Tp2\n6R89i2X8APA0wcxmDNmiX7x04L9+4I2jnx/oC0MDZbM0MbnXkn+YuHLDfQ/89FZujQMAgJPNgiUH\nDx7a32q3WxZSSSazRBZSWUgVLJVCqpBVVOqfc9xt+sxczWabPYbOMFT2AeCIYGZzZ4Tz33vD8C3n\nnFVfa6EZXImZZXKXgkn9xbZRjx1ulAIAgJPOXV5tNBqNZqsYHBgyd5e5K8gVFaUk/tPvs8psyTZq\negf/py0+NJPHRK3krF3dmge6gwtWAND0hnylzEbfcfXAH65aUFs3MOfSML702tA3tMw8tmRm1u50\n8uVz07MXzRs710LgZikAADjJ3BuNvNZsF4UlZmaZW0glm67sH/3VQqa0b4Zkpuc8qs+jJ2nJN2/b\n82BXpoCu4WIVACQFU7J+WfratStH14ysuL4oVSppOWmpPrFL7rlMUpJkSbM51bf27OT1T27PHg/B\ntsjl0d3NzMxkcvnRbXDc5fT1AwCAfyl3ebXe3Fur1SeDBYvmspDKPUoqFEJUUbRlsiOfO8Zlh+cW\nkznavGNqw6keP7qLsA8AkrLUKuuWZ1eOL750+FNf3RYuWDqm6y6ZpebUJlnol+QKoRJU7O27/gL/\ntSXj81d/9Nbtr2m32w1JKmc2Nn9met74kBaaKUzUbdeTB+IPJe07uuFfd2cIAABebIJZqDWahx98\n+EffuWjt6jXVWt0tJDJPTR5Vm3hCBx+9VSGbq7y1Tx6DzPJnHsRSr/nYvgcf3nx3d2aBbiHsA4Ck\ncqb+RbPSlcoG9bcbN9mvvHq1Yt5S3qgqpDMkdSSZLMhiVLJu4YHLPvSWFXf/1V2Pf/BtVw+86Q/e\nOXL9nNFkbimdLuznnmjbvrD9qvVjN2dZ+DMzq1PlBwAAL5SZ2YxBWzjQl8746te/8cXrXnnJm2fN\nmjMSfbq6L4/KG/vVaRyUtaqSgsyeGe/cE5cV8ftbsq8dnKzv6c5M0C2EfQCQlAbLKpmPdQ78QHf9\n4dsUvKVdP/6yLJQl5Toa082kJFjoFOZrztp5yUdvGvx6Ocszl1TEwhuto/vgdrRghi1496vD775k\nxaIrbrlr3/vMbCuBHwAAPB8zs5F+Lf6NGwa/NGskGW21i/bWhz6ZlV7yFpX6BpWWBxXSsvpGFsuU\nymxIUus5x4leFB2bcXDDjw7e1mo266d+Jugmwj4ASIrusXBr1vZv1hP3f0wKrh+vQDUAAAeHSURB\nVCJvK4RMrXx6BX6WPPVAG7NgMbqnIc+KIwv0TWYWzKTpHrvCJfeoy1bsfkPblzQ+/ZVH30mFHwAA\n/CxmZkN9mvve1w3etnZJtqooPLplIehg2Pm9j8gSKSSjXpm5TsPz1qt//FLV9t8nS0Ylj5K7ZJKr\n5KlPJhsPvWLDxp/ee6/LuP44w7AbPwBIygu1DtXCbrfUYwxe5MGlEJsd904+HfTtWQ+vNZsO90/3\njNfMLAQLrbySv3TJoavWLh+/Khj/3wUAAD/b+Usq11+wZHClmXkS2mlqrRCsrSQbUpIMSrHlzX33\nxAM/vSVacSiWyuMxTUse0j63pF+FDUa31KcGrt7y2Tt+8KFqtVqNMRL2zzBU9gFAUr3lEw88Utyx\ndG75pf1Ze1ghiZP5nL3W2TM2NuDlY21u+0IlwdKK1cevWDvnzf/4WOleSZMnbOAAAKCnuLsP9mdf\n/PjX0oMXLR+9bv2K/uuGB/rGci+3mnlSrTfjxEQj21trtfZNVScmW61GrdC8Vju3Rr3l1VojHq42\nO3trtWp1177vPLZ99/7Huj0ndAdhHwAknbcgfdWqBeHyiXp5Khm0YVd/sWtqbPd4smNAykquqOfW\n9l8YM5l78FULkpcPDZZnirAPAAB+hmq9c0DSF458AP8ihH0AkHTt+r73X7MueVWrfVjRg+TVbO34\ntgsLHzEpyo6T85++cd/PFm20rz5v9bJ5L5P0xIkcOwAAAPBs9I4CgKRGK04drrrXWyEW0TyqpDyO\naHozveMkeXdZCDIr9Px77gXPbNLXrBi7/IQPHgAAAHgWwj4ASPrs/Y133/H91i3Rrd0u3NqdGOVV\nSW2TMknJs94R5PGwhudfoeEFr1QIbR33poAkKbW809FZ47OWnrRJAAAAAEcQ9gFA0lTdd99yd/1d\nH/nc1Osf2pzfWW3qQMyWxmxguVti7p67u9wVJSXy2FR5dJ0GZi5V/4wlGpp/rdwbx9/Hz1zusnkz\ndO4pnBYAAADOUPTsA4Ck6O5mVvz0yfybm3dWN6xelF5x9fo9//7laxdfN7b4hpCkbrUDm9Wc3Kqi\ntVtJebZmLLpclpTkMaoyOl+tyfPUPLxJCqXnHN8kuVzDlXzWqZ8dAAAAzjT2/H2mAHBmMTMzUwim\ncM780pUXLx+48crr3/qyC9euPa/dPGjNiV1KSxUlWZ+Koikv2vLYUWtypw5tvVse82Ns6Gfy2JCN\nXdl+3fu/Uu7KxAAAAHDGoLIPAM8yvSmfiiMfdwSzO59o3PO6T6xa/aeWDo4Mji9Li7ypmLcUQqbo\nUYpRWWVMad+oOv9/e/eyIkcVBnD8+6qq55aJicZLvCEBdeEteFmJGzcuBPUJfAZ9Ahe+g28gggsR\nggqCl5XZGEUDghBFDV4zw+hMuqe7errruFC84MTZaAaqf79Vrw79bYr6c6pO7W7us2aUjIhJ206v\n8jgAACwg7+wDHCCrrLe2ft5sp9M2qyYiMjLryKqJrJqosomomqgGq7G0dtMVj+nLLDGZTPeu5n8H\nAGAxiX2AA5QSZTgej8eTdl5Xg4yqiawGUdWD34K//vP3YPXGiJzHP07mz4xS6mjrm384lCEAAFgo\nHuMHOFAp4/FsNJnO51lnxnxQoipZShdZzaN0XWTVRZYumpVrIzIjSh0Rs78s0ZW6WYoLF386d2hj\nAACwMOzsAxyglCjD3cml0Wh3p8rq99P7mj8f46+aiBKRkVFKF7HfB/jKLLv6RF747vLZqz4AAAAL\nx84+wAGqzGo0nvxy7tPPPnjk9L33D0e7Jas6sjQZpYvR9lex9cUrUQ1OxqzdiNJVkTn7+yLZlFG5\nbuPcpxfeOZwpAABYJHb2Af5FZuaxI3H7rSea02+89fZrF7+9uF03dUZWf+zsz8absTfeiunwi+j2\nLkfm3y+tpdQlMrqPvx68ubWz+9MhjQIAwAKxsw9wBZmZx9bijuefXn/9hmP18XY6n37z0UuDpQef\njaWV9WiW16NqlmPl2B2R0UTm0Yho/7FOV+bzvbx26+xnW2fayWT36k8CAMCiEfsA+8jMPLoSJ597\nZv3M6VODe+bz0pUcVFVsVd9/+GJkHVHVx8vqiYfimlsejrXrH43R5vuR9fGI0kWUEpERJZZKU3bq\n8z8/dvb85++9VyL3eaEfAAD+W2If4AruO7X61AOn1u/O3Ct11f5+vcyIwdHILFG6tkw23i17O+dj\nafW2WFq+PkpU2ZWI0mXOStVldHH5yBPfvPzqJy8Mh8NhKUXsAwDwv0v3nQD7W18bnLj/7pOPP3Ln\n+pMP37X25DVHVq6bleV2MquHu5Nue3s8uDRq243Lw+2dtm1H81hup7Mc77ZlOBp3vwwne5dGo+Hw\nh43Rl9/+uPnlYc8DAMDiEPsAAADQM07jBwAAgJ4R+wAAANAzYh8AAAB6RuwDAABAz4h9AAAA6Bmx\nDwAAAD0j9gEAAKBnxD4AAAD0jNgHAACAnhH7AAAA0DNiHwAAAHpG7AMAAEDPiH0AAADoGbEPAAAA\nPSP2AQAAoGfEPgAAAPSM2AcAAICeEfsAAADQM2IfAAAAekbsAwAAQM/8CiyjAhHJ0h30AAAAAElF\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "foxes, rabbits = generate_predator_prey(Nr, Nf)\n", "\n", "fig = plt.figure(figsize=(16,10))\n", "ax = fig.add_subplot(111)\n", "ax.axis('off')\n", "\n", "Nit = 1 # Iterate 1 more than the death of all foxes\n", "outputpath = os.path.abspath('frames')\n", "\n", "for i in range(Nit):\n", " update_predator_prey(foxes, rabbits, fig)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting\n", "Here is the code to animate your simulation using the [JSAnimation package](https://github.com/jakevdp/JSAnimation)** (you will need to install this first)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Once \n", " Loop \n", " Reflect \n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from JSAnimation import IPython_display\n", "from matplotlib import animation\n", "\n", "fig = plt.figure(figsize=(12,8))\n", "ax = fig.add_subplot(111)\n", "ax.axis('off')\n", "\n", "Nit = 51 # Iterate 1 more than the death of all foxes\n", "\n", "foxes, rabbits = generate_predator_prey(Nr, Nf)\n", "\n", "\n", "def init():\n", " fig.clf()\n", "\n", "def update_predator_prey(i):\n", " \"\"\"Updates the locations of all predators and preys in the inputs and\n", " displays them in input fig using the Agent.display method\"\"\"\n", " # Clear the figure first\n", " fig.clf()\n", " for fox in foxes:\n", " fox.move()\n", " fox.display(fig)\n", " for rabbit in rabbits:\n", " rabbit.move()\n", " rabbit.display(fig)\n", "\n", "animation.FuncAnimation(fig, update_predator_prey, frames=Nit, interval=1, init_func=init)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Extension: Create a generator of predator and prey instances using generator comprehension**" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }