{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 3.1 Aggregation Tutorial\n", "\n", "## About\n", "\n", "This notebook contains a minimal example for running workflows on aggregates of jobs using **signac-flow**. \n", "\n", "## Author\n", "\n", "Hardik Ojha\n", "\n", "## Prerequisites\n", "\n", "This notebooks requires the following packages:\n", "\n", "1. **signac-flow** >= 0.15\n", "2. numpy\n", "3. matplotlib\n", "\n", "Execute the command below to install the required packages:\n", "```bash\n", "pip install signac-flow>=0.15 matplotlib numpy\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Definition\n", "\n", "Aggregation allows a **signac-flow** operation to act on multiple jobs, rather than one job at a time.\n", "\n", "An aggregate is defined as a subset of the jobs in a **signac** project. Aggregates are generated when a `flow.aggregator` object is provided to the `FlowProject.operation` decorator.\n", "\n", "Please refer to the [documentation](https://docs.signac.io/en/latest/aggregation.html) for detailed instructions on how to use aggregation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Objective\n", "\n", "The goal of this project is to plot the temperature values present in a **signac** data space along with the average value of all the temperatures present." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Project Setup\n", "\n", "Before we initialize a **signac** project inside the `projects/tutorial-aggregation` directory, we need to be sure that no such directory exists. Uncomment before executing the below cell to remove the directory if exists." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# !rm -rf projects/tutorial-aggregation" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import signac\n", "from flow import FlowProject, aggregator\n", "\n", "# Setting default figure size\n", "plt.rcParams[\"figure.figsize\"] = (10, 4)\n", "\n", "\n", "# Initializing a signac project\n", "project = signac.init_project(\"projects/tutorial-aggregation\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initializing the data space\n", "\n", "For the purpose of this notebook, we will be creating a random dataset using some mathematical calculations.\n", "\n", "All the **signac** jobs will have two state point parameters and one document value.\n", "\n", "- `job.statepoint[\"city\"]`: City for which data is being collected.\n", "- `job.statepoint[\"day\"]`: Day of the year.\n", "- `job.document[\"temperature\"]`: Average temperature for that day." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "days = np.arange(365)\n", "\n", "\n", "def generate_temperatures(days, seed=None):\n", " rng = np.random.default_rng(seed)\n", " avg_temperature = 10 + rng.random() * 10\n", " annual_variation = -10 * np.cos(days / 365 * 2 * np.pi)\n", " random_variation = 5 * rng.random(len(days))\n", " temperatures = avg_temperature + annual_variation + random_variation\n", " return temperatures\n", "\n", "\n", "temperatures = generate_temperatures(days, seed=123)\n", "\n", "for day, temperature in zip(days.tolist(), temperatures.tolist()):\n", " # Create a signac job having the state point parameters 'day' and 'temperature'\n", " statepoint = dict(city=\"Anytown\", day=day)\n", " job = project.open_job(statepoint)\n", " job.document[\"temperature\"] = temperature" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the project schema to see the jobs that were created." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "ProjectSchema(<len=2>)
{\n",
       " 'city': 'str([Anytown], 1)',\n",
       " 'day': 'int([0, 1, 2, ..., 363, 364], 365)',\n",
       "}
" ], "text/plain": [ "ProjectSchema()" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "project.detect_schema()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating a FlowProject with aggregate operations\n", "\n", "In order to achieve our goal using **signac-flow**, we need to create a `FlowProject` and add operations to it.\n", "There will be following operations in our workflow:\n", "\n", "1. `compute_average_temperature`: This operation computes the average temperature of the year and stores it in the project document. For this operation, all the jobs present in the **signac** project will be aggregated together. This will be the first operation to get executed in our workflow.\n", "2. `plot_deviation_from_average`: This operation plots the temperature (as a scatter plot) and the average temperature of the month. For this operation, all the jobs, when sorted by the state point parameter `day`, present in the **signac** project will be aggregated together. This will be executed after the operation `compute_average_temperature`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class AggregationProject(FlowProject):\n", " pass\n", "\n", "\n", "@AggregationProject.post(lambda *jobs: project.doc.get(\"average_temperature\", False))\n", "@AggregationProject.operation(aggregator=aggregator())\n", "def compute_average_temperature(*jobs):\n", " \"\"\"Compute the average temperature using the state point parameter,\n", " \"temperature\", of all jobs present in the signac project and\n", " store the computed value to the project document.\n", " \"\"\"\n", " average_temp = np.mean([job.document[\"temperature\"] for job in jobs])\n", " project.document[\"average_temperature\"] = float(average_temp)\n", "\n", "\n", "@AggregationProject.pre.after(compute_average_temperature)\n", "@AggregationProject.operation(aggregator=aggregator(sort_by=\"day\"))\n", "def plot_daily_temperature(*jobs):\n", " \"\"\"Graph of daily temperature for the year.\"\"\"\n", " print(\"Generating plot of daily temperature.\")\n", " average_temp = project.document[\"average_temperature\"]\n", " days = [job.sp[\"day\"] for job in jobs]\n", " fig, ax = plt.subplots()\n", " ax.plot(\n", " days,\n", " [job.document[\"temperature\"] for job in jobs],\n", " \"rx\",\n", " label=\"Daily Temperature (°C)\",\n", " )\n", " # Plot the average as a line\n", " ax.axhline(average_temp, c=\"green\", label=\"Average Annual Temperature (°C)\")\n", " ax.legend()\n", " ax.set_xlabel(\"Day\")\n", " ax.set_ylabel(\"Temperature (°C)\")\n", " plt.show()\n", "\n", "\n", "every_sunday = aggregator(sort_by=\"day\", select=lambda job: job.sp[\"day\"] % 7 == 0)\n", "\n", "\n", "@AggregationProject.operation(aggregator=every_sunday)\n", "def plot_weekly_temperature(*jobs):\n", " \"\"\"Graph the temperature for only one day of each week.\"\"\"\n", " print(\"Generating plot of weekly temperature.\")\n", " days = [job.sp.day for job in jobs]\n", " fig, ax = plt.subplots()\n", " ax.plot(\n", " days,\n", " [job.document[\"temperature\"] for job in jobs],\n", " \"rx\",\n", " label=\"Daily Temperature (°C)\",\n", " )\n", " ax.set_xlabel(\"Day\")\n", " ax.set_ylabel(\"Temperature (°C)\")\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Executing the workflow" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Initializing the FlowProject\n", "In order to register the operations, conditions, and the aggregators associated with the project we created, we need to initialize a `FlowProject`.\n", "Since the **signac** project does not belong in the current directory, we specify its path to `FlowProject.get_project`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "flow_project = AggregationProject.get_project(project.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running the workflow\n", "The `FlowProject.run` method allows the execution all eligible operations in the `FlowProject`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generating plot of weekly temperature.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0oAAAFzCAYAAAAAMPmhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2NElEQVR4nO3df3RU9Z3/8dckJcMPkwiV/IIY0wruQX74A0RoK4hLBIuKuK3WagEtqxU8slixqAORiURxl4pisasraleFYyWi9Sd7hABVW8FQEFwWayQUE/EHIQFhQib3+0e+M0kmM2HuZGbunZnn45ycOHMnkzdzc2Ne8/l83h+HYRiGAAAAAAB+aVYXAAAAAAB2Q1ACAAAAgAAEJQAAAAAIQFACAAAAgAAEJQAAAAAIQFACAAAAgAAEJQAAAAAIQFACAAAAgADfsbqAWGtpadHnn3+uzMxMORwOq8sBAAAAYBHDMNTY2KiCggKlpXU9ZpT0Qenzzz9XYWGh1WUAAAAAsIn9+/dr4MCBXT4m6YNSZmampNYXIysry+JqAAAAAFiloaFBhYWF/ozQlaQPSr7pdllZWQQlAAAAAGEtyaGZAwAAAAAEICgBAAAAQACCEgAAAAAEICgBAAAAQACCEgAAAAAEICgBAAAAQACCEgAAAAAEICgBQKorLZXc7uDH3O7W4wAApBiCEgCkuvR0aeHCzmHJ7W69Pz3dmrraI8wBAOLsO1YXAACwmMvV+nnhwrbbvpC0eHHbcSv5wpzUsZ72dQIAEEWWjiitXLlSw4cPV1ZWlrKysjRmzBi98cYb/uOGYai0tFQFBQXq1auXxo8fr127dllYMQAkKZerNWwsXCg5nfYKSVLH+nwjS3YLcwCApOIwDMOw6pu/+uqrSk9P15lnnilJeuaZZ/TQQw+pqqpKZ599th588EHdf//9evrppzV48GCVlZVp06ZN2rNnjzIzM8P6Hg0NDcrOztbhw4eVlZUVy38OACQ+p1NqapIyMiSPx+pqOvOFo4yM1joJSQAAE8xkA0uDUjD9+vXTQw89pBtvvFEFBQWaO3eu7rrrLkmSx+NRbm6uHnzwQd18881hPR9BCQDClCghxO5hDgBgW2aygW2aOXi9Xq1evVpHjx7VmDFjVF1drbq6OpWUlPgf43Q6NW7cOL377rshn8fj8aihoaHDBwDgJNpPY/N4Ok9zswu3uy0kNTXZrz4AQNKwPCjt3LlTp5xyipxOp2655RZVVFRoyJAhqqurkyTl5uZ2eHxubq7/WDDl5eXKzs72fxQWFsa0fgBIeMHW+gRbE2S1RAlzAICkYHnXu7POOkvbt29XfX29XnrpJU2fPl2VlZX+4w6Ho8PjDcPodF97CxYs0Lx58/y3GxoaCEsA0BWvN/g0O99trzf+NQUKFeak4N3wAADoJsuDUkZGhr+Zw8iRI/XBBx9o+fLl/nVJdXV1ys/P9z/+4MGDnUaZ2nM6nXI6nbEtGgCSSVd7ENklfCRCmAMAJBXLg1IgwzDk8XhUXFysvLw8rV+/Xueee64kqampSZWVlXrwwQctrhIAEFeJEOYAAEnF0qB09913a/LkySosLFRjY6NWr16tjRs36s0335TD4dDcuXO1ZMkSDRo0SIMGDdKSJUvUu3dvXXfddVaWDQAAACDJWRqUvvjiC91www2qra1Vdna2hg8frjfffFMTJ06UJM2fP1/Hjh3TrbfeqkOHDmn06NF6++23w95DCQAAAAAiYbt9lKKNfZQAAOiG0lIpPT34FEe3u3V9WFdTIwHARhJyHyUAAGBD6enB27D7OhGmp1tTFwDEmO2aOQAAABsJ1oY9WLt2AEgyBCUAANpjqlln7cNSWZnU1ERIApD0mHoHAEB7TDULzuWSMjJaQ1JGBiEJQNJjRAkAgPaYahac290WkpqaWm+n6msBICUQlAAACMRUs44Cg6LvtpS6rwmApEd7cABA/CTa+h+ns20UxeOxuhprhBpNY5QNQAKiPTgAwJ4Saf1PsKlmqcjrDR6GXK7W+71ea+oCgBhj6h0AIH4SZf0PU83adDXCl2qvBYCUQlACAMSX3df/BAtuwQIeACCpsUYJAGANu67/SbR1VACAsJnJBowoAUCs8Yd3Z3ZuNc1UMwCAaOYAALGXSA0M4qH91DaPp/VzsNcHAAALMaIEALGWKA0M4iHe638YzQMARIigBADxYPcGBvHSVatp3/Fo8o3mtf8eUsfABgBAEDRzAIB4smsDg2QWqtV3KgZVAEhxbDgLAHbEBqbW8G2MunBha1C1U0gqLQ39c+B2My0QACxEUAKAeKCBgbVcrraAmpFhj5Ak0egDAGyMNUoAEGvJuoFpIjVKsGs7chp9AIBtEZQAINbi3cAgXhKlUUKoNUqSPYIIjT4AwJZo5gAAiJzdGyWEqsdudUo0+gCAODCTDRhRAgBEzu6jIYkymmd2amAiTXsEgARFMwcAQPfYtVGC1BoWQtXjctkjTETS6COSJhB02AMAUxhRAgB0j10bJSSCSBt9RNIEIlHWlAGATRCUAACRs3ujBLvrztRAs9Me6bAHAKbQzAEAEJlEapSQzMw2gfCdH98IIOcJQAoxkw1YowQAiExXoyGLF9unUUK8WLEGKNi0x5Ox85oyALARghIAIDKJ0CghniJpsNAdkTSB8H2d2XAFACmINUoAAERDPNcARdoEgjVlABA2ghIAANESr32lImkCEWm4AoAURTMHAACizWyDhXhgk1oAMJUNGFECACCa7LqvVFchyA71AYDN0MwBAIBoibTBAlpZ0TkQAEJgRAkAgGhgDVD3+ToHSqH35gKAOCEoAQAQDZE0WEBH8ewcCAAnQTMHAKmJhe2AffnCkW+dFyEJQJSYyQasUQKQmuK9OSiQSrq71sjlagtJGRmEJACWICgBSE0uV+eF9kzxAaKju29EBOscCABxxholAKkrXpuDAqmmO2uNAh/nu93+eQEgDlijBAB23BwUSAZm1xqFClOM9gKIEtYoAUC4mOIDxI7ZtUZddQ5cvJjOgQDiiql3AFIXU3yA2Ar2RkRX11ZXTR64JgHEGUEJQGpic1AgtngjAkCCIygBSE1sDgrEDm9EAEgCBCUAqYkpPkDs8EYEgCRA1zsAAAAAKYGudwAAAADQDQQlAEgmpaWhW5y73V1POQQAAH4EJQBIJunprYvlA8OSb3F9ero1dQEAkGAsDUrl5eUaNWqUMjMzlZOTo6lTp2rPnj0dHjNjxgw5HI4OHxdeeKFFFQNIaYkwWuPbmLN9WArWgQwAAHTJ0qBUWVmp2bNn6/3339f69evV3NyskpISHT16tMPjJk2apNraWv/H66+/blHFAFJaoozWtA9LTichCQCACNiq692XX36pnJwcVVZW6qKLLpLUOqJUX1+vl19+OaLnpOsdgKgKtYmmHYOI0yk1NUkZGZLHY3U1AABYLmG73h0+fFiS1K9fvw73b9y4UTk5ORo8eLBmzZqlgwcPhnwOj8ejhoaGDh8AEDWJMlrjdreFpKam0FMGAQBAULYZUTIMQ1deeaUOHTqkzZs3++9fs2aNTjnlFBUVFam6uloul0vNzc3atm2bnE5np+cpLS3Vfffd1+l+RpQARJWdR2sSadQLAIA4MjOiZJugNHv2bL322mvasmWLBg4cGPJxtbW1Kioq0urVqzVt2rROxz0ejzzt/mhpaGhQYWEhQQlA9PiCh2+0JhYBpLS0dc1TsOd1uyWvN3jziFChiLAEdBTpNQYgoSXc1LvbbrtNr7zyijZs2NBlSJKk/Px8FRUVae/evUGPO51OZWVldfgAgKhpHzg8ns4d5qIl0sYRXm/wMOSbMuj1RrdOIFElSnMWAJb5jpXf3DAM3XbbbaqoqNDGjRtVXFx80q/5+uuvtX//fuXn58ehQgBoJ9iojO/zwoUdb3dXsOcNZ1Soq3fAGUkC2kR6jQFIGZYGpdmzZ+v555/XunXrlJmZqbq6OklSdna2evXqpSNHjqi0tFRXX3218vPz9dlnn+nuu+/WaaedpquuusrK0gGkoq5Ga3zHo6n9H3JlZbGb5gekKq4xAF2wdI2Sw+EIev+qVas0Y8YMHTt2TFOnTlVVVZXq6+uVn5+viy++WG63W4WFhWF9D9qDA0h4dm4cASQDrjEgZZjJBpZPvetKr1699NZbb8WpGgCwoWBtvnm3G4gerjEAIdiimQMAIIh4NY4AUlUk11hpaejjbjed8oAkYumIEgAghHg2jgBSUaTXmK9bXuDx9s8HICkQlADAjuLdOAJINZFeY3TLA1KGbTacjRWaOQAAgKiLx8bTAKLOTDYgKAGwh9LS1iktwf7QcLtb391l7j8AO6FbHpBwzGQDmjkAsAffvP/ARdK+d23T062pC4C9WdVcIVi3PABJhaAEwB5crs4dp5j3D+BkrHiThY6UQEqgmQMA+2i/SLqsjHn/AE4u3s0V6EgJpAzWKAGwH+b9AzArXs0VWE8JJDSaObRDUAISDJ2kAESKN1kAnATNHAAkJub9A4gUzRUARFm3gpKHd2sAREuoef+EJQAnw5ssAGLAVDOHt956Sy+88II2b96smpoatbS0qHfv3jrvvPNUUlKimTNnqqCgIFa1AkhmXm/waXa+215v/GsCYH80VwAQI2GtUXr55Zd111136fDhw7rssst0wQUXaMCAAerVq5e++eYbffTRR9q8ebPee+89zZgxQ263W/37949H/SfFGiUAAJIYzRUAmBD1Zg4XXHCBXC6XfvzjHystLfRsvQMHDmj58uXKzc3VHXfcYb7yGCAoAQAAAJDoetcBQQkAAACAFMOudw0NDWppael0v9frVUNDg7kqAQAAAMCmwg5KFRUVGjlypI4fP97pmMfj0ahRo/Tqq69GtTgAAAAAsELYQWnlypWaP3++evfu3elY7969ddddd2nFihVRLQ4AAAAArBB2UProo480fvz4kMcvuugi7dy5Mxo1AQAAAIClwg5Khw4dUnNzc8jjJ06c0KFDh6JSFAAAAABYKeygdMYZZ2jr1q0hj2/dulVFRUVRKQoAAAAArBR2UJo2bZruueceffHFF52O1dXV6d5779XVV18d1eIAAAAAwAph76PU2NioMWPGqKamRtdff73OOussORwOffzxx3ruuedUWFio999/X5mZmbGu2RT2UQIAAAAgmcsG3wn3STMzM/XnP/9ZCxYs0Jo1a/zrkfr27avrr79eS5YssV1IAgAAAIBIhD2i1J5hGPrqq69kGIb69+8vh8MRi9qighElAAAAAFKMRpTaczgc6t+/f0TFAQAAAIDdhd3M4eDBg/rXf/1XXXvttdq1a1csawIAAEgepaWS2x38mNvdehyA7YQdlGbOnKm8vDxdddVVmjx5siKYsQcAAJB60tOlhQs7hyW3u/X+9HRr6gLQpbCn3lVVVWnp0qUaMmSIbrjhBn355ZfKycmJZW0AAACJz+Vq/bxwYdttX0havLjtOABbCTsoTZ06VQsWLFBRUZGGDx9OSAIAAAhX+7BUViY1NRGSAJsLu+tdS0uLXnjhBdXX1+uGG25ImA5ydL0DAAC24XS2hqSMDMnjsboaIOXEpOtdWlqafv7zn3e7OACIqtLS1vn9wd6Vdbslr5eF0gDswe1uC0lNTa23GVECbCvsZg4AYEsskgaQCNqvSfJ4Wj8H+90FwDbCGlGaNGmSFi5cqLFjx3b5uMbGRv3ud7/TKaecotmzZ0elQADoEoukAdhdsN9JwX53AbCVsILST37yE/30pz9VZmamrrjiCo0cOVIFBQXq2bOnDh06pN27d2vLli16/fXXNWXKFD300EOxrhsA2rBIGoCdeb3Bfyf5bnu98a8JwEmF3cyhqalJf/zjH7VmzRpt3rxZ9fX1rU/gcGjIkCG69NJLNWvWLJ111lmxrNc0mjkAKYRF0gAAoAsxaeaQkZGh6667Ttddd50k6fDhwzp27Ji++93vqkePHt2rGAC6i0XSAAAgiiJu5pCdna28vDxCEgDrsUgaAABEWdgjSgBgSyySBgAAMUBQApDYWCQNAABiIOxmDomKZg4AAAAAJHPZgA1nAQAAACBAREGpvr5eTz75pBYsWKBvvvlGkvThhx/qwIEDUS0OAAAAAKxgeo3Sjh079M///M/Kzs7WZ599plmzZqlfv36qqKjQvn379Oyzz8aiTgAAAACIG9MjSvPmzdOMGTO0d+9e9ezZ03//5MmTtWnTpqgWBwAAAABWMB2UPvjgA918882d7h8wYIDq6uqiUhQAAAAAWMl0UOrZs6caGho63b9nzx71798/KkUBAAAAgJVMB6Urr7xSixcv1okTJyRJDodDNTU1+s1vfqOrr7466gUCAAAAQLyZDkr//u//ri+//FI5OTk6duyYxo0bpzPPPFOZmZm6//77Y1EjAKuUlkpud/BjbnfrcQAAgCRkOihlZWVpy5Yteumll/TAAw9ozpw5ev3111VZWak+ffqYeq7y8nKNGjVKmZmZysnJ0dSpU7Vnz54OjzEMQ6WlpSooKFCvXr00fvx47dq1y2zZACKRni4tXNg5LLndrfenp1tTFwAAQIyZag/e3Nysnj17avv27ZowYYImTJjQrW9eWVmp2bNna9SoUWpubtY999yjkpIS7d692x+6li5dqmXLlunpp5/W4MGDVVZWpokTJ2rPnj3KzMzs1vcHcBIuV+vnhQvbbvtC0uLFbccBAACSjMMwDMPMF3z/+9/X2rVrNWLEiKgX45vSV1lZqYsuukiGYaigoEBz587VXXfdJUnyeDzKzc3Vgw8+GLT7XqCGhgZlZ2fr8OHDysrKinrNQMIoLW0dAQoWbtxuyesNPZXOF44yMqSmJkISAABISGaygempd/fee68WLFigb775JuICQzl8+LAkqV+/fpKk6upq1dXVqaSkxP8Yp9OpcePG6d133w36HB6PRw0NDR0+AKh70+hcrraQlJFBSAIAAEnP1NQ7SXrkkUf0ySefqKCgQEVFRZ3WJX344YcRFWIYhubNm6cf/vCHGjp0qCT592XKzc3t8Njc3Fzt27cv6POUl5frvvvui6gGIKl1Zxqd290WkpqaWm8TlgAAQBIzHZSmTp0agzKkOXPmaMeOHdqyZUunYw6Ho8NtwzA63eezYMECzZs3z3+7oaFBhYWF0S0WSFTtw1JZWXjT6ALDlO92++cDAABIMqaD0qJFi6JexG233aZXXnlFmzZt0sCBA/335+XlSWodWcrPz/fff/DgwU6jTD5Op1NOpzPqNQJJw+VqC0knm0YXbMQp2MgUAABAkjG9RimaDMPQnDlztHbtWr3zzjsqLi7ucLy4uFh5eXlav369/76mpiZVVlZq7Nix8S4XSA7BptGF4vUGH3FyuVrv93pjWysAAIBFTI8opaWlhZz2JkleE384zZ49W88//7zWrVunzMxM/5qk7Oxs9erVSw6HQ3PnztWSJUs0aNAgDRo0SEuWLFHv3r113XXXmS0dgNlpdF1tKMtIEgAASGKmg1JFRUWH2ydOnFBVVZWeeeYZ000UVq5cKUkaP358h/tXrVqlGTNmSJLmz5+vY8eO6dZbb9WhQ4c0evRovf322+yhBJjFNDoAAICwmd5HKZTnn39ea9as0bp166LxdFHDPkrA/9edfZQAAACSgJlsELWg9Pe//13Dhw/X0aNHo/F0UUNQAgAAACDFeMPZYI4dO6ZHH320Q8c6AAAAJIjS0tDNfdxuZhwgJZleo9S3b98OzRwMw1BjY6N69+6t//7v/45qcQAAAIiD9PTg61Xbr28FUozpoPTb3/62Q1BKS0tT//79NXr0aPXt2zeqxQEAACAOgjX3CdYECEghpoPShAkTVFhYGLRFeE1NjU4//fSoFAYAAIA4ah+WfBuTE5KQwkw3c0hPT1dtba1ycnI63P/1118rJyfH1D5K8UAzBwAAABOczraNyT0eq6sBoiqmzRxC5aojR46oZ8+eZp8OAAAAduF2t4WkpqbQDR6AFBD21Lt58+ZJkhwOhxYuXKjevXv7j3m9Xv3lL3/ROeecE/UCAQAAEAeBa5J8tyWm3yElhR2UqqqqJLWOKO3cuVMZGRn+YxkZGRoxYoR+/etfR79CAAAAxFawxg3BGjwAKSTsoLRhwwZJ0syZM7V8+XLW+wAAACQLrzd44wbfbZutQQfiwXQzh0RDMwcAAJAySktb90QKNvrjdrcGHjaPRQozkw1MtweXpA8++EAvvviiampq1NTU1OHY2rVrI3lKAMmE/1EDgDXYOBaIGtNd71avXq0f/OAH2r17tyoqKnTixAnt3r1b77zzjrKzs2NRI4BE4/sfdWC3JN//qNPTrakLAJKdy9Uahtr/DmbjWCAipkeUlixZot/+9reaPXu2MjMztXz5chUXF+vmm29Wfn5+LGoEkGjY4R0ArMPGsUBUmF6j1KdPH+3atUtnnHGGTjvtNG3YsEHDhg3Txx9/rAkTJqi2tjZWtUaENUqAhXzhyLcfB/+jBoD4YeNYoJOYbjjbr18/NTY2SpIGDBigjz76SJJUX1+vb7/9NoJyASQtl6stJGVkEJIAIF7YOBboNtNB6Uc/+pHWr18vSfrpT3+q22+/XbNmzdLPfvYzXXLJJVEvEEAC43/UABB/7ac6ezyd1ywBCIvpNUorVqzQ8ePHJUkLFixQjx49tGXLFk2bNk0u3i0G4MMO7wAQf2wcC0SNqaDU3NysV199VZdeeqkkKS0tTfPnz9f8+fNjUhyABMX/qAHAGmwcC0SN6WYOvXv31scff6yioqJY1RRVNHMALMA+SgAAwIZiuuHs6NGjVVVVlTBBCYAFugpBjCQBAIAEYDoo3Xrrrbrjjjv0j3/8Q+eff7769OnT4fjw4cOjVhwAAAAAWMH01Lu0tM6N8hwOhwzDkMPhkNdmc1+ZegcAABIS05iBqIvp1Lvq6uqICwMAAECY0tODN8Bp3zAHQMyYDkqsTQIAAIiDYN1Cg3UVBRATpjeclaQ//OEP+sEPfqCCggLt27dPkvTwww9r3bp1US0OAAAgpblcbRvGOp2EJCCOTAellStXat68ebrssstUX1/vX5N06qmn6uGHH452fQAAAKnN5ZIyMqSmptbPhCQgLkwHpUcffVRPPPGE7rnnHqWnp/vvHzlypHbu3BnV4gAAAFKe290WkpqaWm8DiDnTQam6ulrnnntup/udTqeOHj0alaIAAACgjmuSPJ62aXiEJSDmTDdzKC4u1vbt2zs1dXjjjTc0ZMiQqBUGAACQ0oI1bgjW4AFATJgOSnfeeadmz56t48ePyzAM/fWvf9ULL7yg8vJyPfnkk7GoEQAAIPV4vcEbN/hu22zvSiDZmN5wVpKeeOIJlZWVaf/+/ZKkAQMGqLS0VDfddFPUC+wuNpxF0mEDQgAAgIiYyQYRtQefNWuW9u3bp4MHD6qurk779++3ZUgCkpJvA8LA+em+KRrtmqwAAAAgMqan3vkcPHhQe/bskcPhkMPhUP/+/aNZF4BQ2IAQAAAg5kwHpYaGBs2ePVsvvPCCWlpaJEnp6em65ppr9Nhjjyk7OzvqRQII0D4slZW1toslJAEAAESN6al3v/zlL/WXv/xFr732murr63X48GH96U9/0tatWzVr1qxY1AggGDYgBAAAiBnTQem1117TU089pUsvvVRZWVnKzMzUpZdeqieeeEKvvfZaLGoEEAwbEAIAAMSM6aD03e9+N+j0uuzsbPXt2zcqRQE4CTYgBAAAiCnTQenee+/VvHnzVFtb67+vrq5Od955p1xM/QFiL9QGhIQlAACAqDHdzGHlypX65JNPVFRUpNNPP12SVFNTI6fTqS+//FK///3v/Y/98MMPo1cpkIwi2ROJDQgBAABiznRQmjp1agzKAFKUb08kqWPwaT9qFKirzWQZ1QUAAIgK00Fp0aJFsagDSE3siQQAAGBLEW84K0lHjhzx76Xkk5WV1a2CgJTDnkgAgEQUyfRxIIGYbuZQXV2tH//4x+rTp4+/013fvn116qmn0vUOiBR7IgEAEo1v+nhgEyHfzIj0dGvqAqLE9IjSz3/+c0nSU089pdzcXDkcjqgXBaScYHsiEZYAAHbG9HEkOdNBaceOHdq2bZvOOuusWNQDpJ7A/6n4bkv8TwYAYG9MH0cSMz31btSoUdq/f38sagFSD3siAQASHdPHkaRMjyg9+eSTuuWWW3TgwAENHTpUPXr06HB8+PDhUSsOSHrsiQQASHR2nj5Owwl0g+mg9OWXX+rvf/+7Zs6c6b/P4XDIMAw5HA55+cMOCB97IgEAEpndp49Hsl8h8P+Znnp344036txzz9V7772nTz/9VNXV1R0+m7Fp0yZdfvnlKigokMPh0Msvv9zh+IwZM+RwODp8XHjhhWZLBgAAQLRFOn28tDT0Mbc7uiM8weqh4QTCZHpEad++fXrllVd05plndvubHz16VCNGjNDMmTN19dVXB33MpEmTtGrVKv/tjIyMbn9fAAAAdFOk08fjPcpDwwlEyHRQmjBhgv72t79FJShNnjxZkydP7vIxTqdTeXl53f5eAAAAiKJIp49H0la8u2uNXK62kETDCYTJdFC6/PLL9W//9m/auXOnhg0b1qmZwxVXXBG14iRp48aNysnJ0amnnqpx48bp/vvvV05OTsjHezweeTwe/+2Ghoao1gMAAIBuMjvK091RKDs3nIBtOQzDMMx8QVpa6GVN3Wnm4HA4VFFRoalTp/rvW7NmjU455RQVFRWpurpaLpdLzc3N2rZtm5xOZ9DnKS0t1X333dfp/sOHDysrKyui2gAAABADTmdbgGn3RndQoRpHnGwaXaRfh6TU0NCg7OzssLKB6aAUK8GCUqDa2loVFRVp9erVmjZtWtDHBBtRKiwsJCgBAADYiS+w+EZ5wgkuZr8mVCgiLKUsM0HJdNe79o4fP96dLzctPz9fRUVF2rt3b8jHOJ1OZWVldfgAAACAjbQPKh5P+Butm93ctquGE4sXs18humR6jZLX69WSJUv0+OOP64svvtD//d//6Xvf+55cLpfOOOMM3XTTTbGoU5L09ddfa//+/crPz4/Z9wAAAEAMhWorLp18Dyaza43YrxDdYHpE6f7779fTTz+tpUuXdmjVPWzYMD355JOmnuvIkSPavn27tm/fLkmqrq7W9u3bVVNToyNHjujXv/613nvvPX322WfauHGjLr/8cp122mm66qqrzJYNAAAAO4h0lCfSUSggQqbXKJ155pn6/e9/r0suuUSZmZn629/+pu9973v63//9X40ZM0aHDh0K+7k2btyoiy++uNP906dP18qVKzV16lRVVVWpvr5e+fn5uvjii+V2u1VYWBj29zAzDxEAAAA2xFojRImZbGB66t2BAweC7qHU0tKiEydOmHqu8ePHq6uc9tZbb5ktD+i+7u7VAAAAoivSzW2BbjAdlM4++2xt3rxZRUVFHe5/8cUXde6550atMMAykezVQLgCACB2WGsEC4QdlG688UYtX75cixYt0g033KADBw6opaVFa9eu1Z49e/Tss8/qT3/6UyxrBeIjkh3Du7sRHgAAAGwl7DVK6enpqq2tVU5Ojt566y0tWbJE27ZtU0tLi8477zwtXLhQJSUlsa7XNNYoIWLd3auBedMAAAC2EpMNZ9PS0lRXV6ecnJyoFBkvBCV0i5kdw6XINs8DAABAXMRsw1mHw9GtwoCEEmyvhpMxuxEeAAAAbMlUUBo8eLD69evX5QeQFCLdqyGScAUAAADbMdX17r777lN2dnasagHsIdIdw0OtUQr1eAAAANiWqaB07bXXJtwaJcC0SPZqiDRcAQAAwJbCDkqsT0LKiGSvBjbCAwAASCp0vQMAAACQEsxkg7BHlFpaWrpdGAAAAAAkAlNd7wAAAAAgFRCUkBhKS0O32na7u15XBAAAAJhEUEJiSE8Pvo+Rr9tcero1dQEAACApmWoPDlgmWKvtYC25AQAAgCggKCFxtA9LZWVSUxMhCQAARF9paetslVAbzHu9TPtPAUy9Q2JxuaSMjNaQlJFBSAIAANEXzyn/rMO2LYISEovb3RaSmppC/2IBAACIlMvVOmulfViK1ZR/1mHbFlPvkDgCf0H5bkuMLAEAgOiK15R/1mHblsMwDMPqImLJzO67iINI5/yG+oXBLxIAABBLTmfbbBaPJ3bfx/c3jW/WDH/bxISZbMDUO8RXpMPLXm/wXxi+oXGvNzb1AgCA1BXPKf+sw7Ydpt4hviIdXu5qISO/SAAAQLTFe8p/sFDG3ziWIigh/mjzDQAA7CzYm7jB3uyN1fdjHbYtEJRgDZerLSQxvAwAAOykqyn/vuPREu9QhrARlGANhpcBAIBdRTLlP9KGVfEMZTCFoIT4Y3gZAAAkG1/DKil0h95gWIdtWwQlxBfDywAAIBmxH1LSISghvhheBgAAyYqGVUmFDWcBAACAaIrXJrUwjQ1nAQAAACvEc5NaxBRBCQAAAIiG9muSPJ7WzwsXEpYSFGuUAAAAgO5K1oZVkbY9TwIEJQAAAKC7krVhVaRtz5MAQQkAAADormTdDymF254TlAAAAACElqJtz2kPDgAAAODkkqDtOe3BEXulpaE7uLjdSbuoDwAAICWlYNtzghIi41vYF3iR+OaspqdbUxcAAACiK0XbnrNGya7s3ooxhRf2AQAApIxkbXseBoKSXSVCK8YUXdgHAACQMpK17XkYaOZgZ4EJ3q4jNnZd2Gf3UTkAAADEFc0ckoXL1TYH1Om0Z0iy88I+1lEBAAAgQgQlu3O52kJIRob9QpKdF/a1D5q+muw6KgcAAABbYY2S3QUbsbHDH/iJsrCPdVQAAACIACNKdmbnEZuuFvYtXmyvhX12HpUDAACALTGiZFd2H7HpqgmC3YKIXUflAAAAYFsEJbuKpBUjXd46C9U5UCIsAQAAICSCkl1FMmKTCHsvxZPdR+UAAABgWwSlZBIsBKRyl7cU3iANAAAA3WPphrObNm3SQw89pG3btqm2tlYVFRWaOnWq/7hhGLrvvvv0n//5nzp06JBGjx6txx57TGeffXbY3yOhN5yNlC8c+dbkpGJIAgAAAAIkzIazR48e1YgRI7RixYqgx5cuXaply5ZpxYoV+uCDD5SXl6eJEyeqsbExzpUmGLNd3kpLQ3fSc7tTb10TAAAAUp6lQWny5MkqKyvTtGnTOh0zDEMPP/yw7rnnHk2bNk1Dhw7VM888o2+//VbPP/+8BdUmkGBd3rriW9sU+DjfyFR6euxqBQAAAGzItvsoVVdXq66uTiUlJf77nE6nxo0bp3fffdfCymwukr2XfHsftX9cKq9tAgAAQMqzbTOHuro6SVJubm6H+3Nzc7Vv376QX+fxeOTxePy3GxoaYlOgHXWny1v7x5WVsbYJAAAAKc22I0o+Doejw23DMDrd1155ebmys7P9H4WFhbEu0T666vK2ePHJu7yZXdsEAAAAJCnbBqW8vDxJbSNLPgcPHuw0ytTeggULdPjwYf/H/v37Y1qnrZSWdj1idLKmDGbXNgEAAABJyrZBqbi4WHl5eVq/fr3/vqamJlVWVmrs2LEhv87pdCorK6vDB8IQydomAAAAJA46HZti6RqlI0eO6JNPPvHfrq6u1vbt29WvXz+dfvrpmjt3rpYsWaJBgwZp0KBBWrJkiXr37q3rrrvOwqqTUHfWNgEAACAx+DodSx3/tmv/tyD8LA1KW7du1cUXX+y/PW/ePEnS9OnT9fTTT2v+/Pk6duyYbr31Vv+Gs2+//bYyMzOtKjk5dbW2yXccAAAAiS3YG+F0Og7JYRiGYXURsWRm910AAAAg6fnCkW9degqFJDPZgKAEAAAApBqns62JV7utdZKdmWxg22YOAAAAAGKATsdhISgBAAAAqYJOx2GztJkDAAAAgDih07EpBCUAAAAgFdDp2BSaOQAAAABICTRzAAAAAIBuICgBAAAAQACCEgAAAAAEICgBAAAAQACCEgAAAAAEICgBAAAAQACCEgAAAAAEICgBAAAAQACCEgAAAJBISksltzv4Mbe79Ti6jaAEAAAAJJL0dGnhws5hye1uvT893Zq6ksx3rC4AAAAAgAkuV+vnhQvbbvtC0uLFbcfRLQQlAAAAING0D0tlZVJTEyEpyhyGYRhWFxFLDQ0Nys7O1uHDh5WVlWV1OQAAAED0OJ2tISkjQ/J4rK7G9sxkA9YoAQAAAInI7W4LSU1NoRs8ICIEJQAAACDRtF+T5PG0fg7W4AERY40SAAAAkEiCNW4I1uAB3UJQAgAAABKJ1xu8cYPvttcb/5qSEM0cAAAAAERXaWnrfk7BRrbc7tYwZ8HGuDRzAAAAAGCdJNgUl6l3sWbTNA0AAADETBJsiktQijVfmpY6/kC0/0EBAAAAkk2Cb4rLGqV4CEzPCZamAQAAgIjZaFNcM9mAEaV4SPA0DQAAAEQk2Ka4CfI3MM0c4sXlavsBychImB8QAAAAICIJvikuI0rxksBpGgAAADAlCTbFJSjFQ6g1SpLtf0AAAAAA05JgU1yCUqwlQZoGAAAATOlq+5sE+duXoBRrSZCmAQAAgFRDe3AAAAAAKcFMNqDrHQAAAAAEICgBAAAAQACCEgAAAAAEICgBAAAAQACCEgAAAAAEICgBAAAAQACCEgAAAAAESPoNZ33bRDU0NFhcCQAAAAAr+TJBOFvJJn1QamxslCQVFhZaXAkAAAAAO2hsbFR2dnaXj3EY4cSpBNbS0qLPP/9cmZmZcjgcltbS0NCgwsJC7d+//6Q7ASM2OAfW4xxYj3NgLV5/63EOrMc5sF6qngPDMNTY2KiCggKlpXW9CinpR5TS0tI0cOBAq8voICsrK6V+IO2Ic2A9zoH1OAfW4vW3HufAepwD66XiOTjZSJIPzRwAAAAAIABBCQAAAAACEJTiyOl0atGiRXI6nVaXkrI4B9bjHFiPc2AtXn/rcQ6sxzmwHufg5JK+mQMAAAAAmMWIEgAAAAAEICgBAAAAQACCEgAAAAAEICgBAAAAQACCUhz97ne/U3FxsXr27Knzzz9fmzdvtrqkpFRaWiqHw9HhIy8vz3/cMAyVlpaqoKBAvXr10vjx47Vr1y4LK058mzZt0uWXX66CggI5HA69/PLLHY6H85p7PB7ddtttOu2009SnTx9dccUV+sc//hHHf0ViO9k5mDFjRqfr4sILL+zwGM5B5MrLyzVq1ChlZmYqJydHU6dO1Z49ezo8husgtsI5B1wHsbVy5UoNHz7cv4HpmDFj9MYbb/iPcw3E1slef37+zSMoxcmaNWs0d+5c3XPPPaqqqtKPfvQjTZ48WTU1NVaXlpTOPvts1dbW+j927tzpP7Z06VItW7ZMK1as0AcffKC8vDxNnDhRjY2NFlac2I4ePaoRI0ZoxYoVQY+H85rPnTtXFRUVWr16tbZs2aIjR45oypQp8nq98fpnJLSTnQNJmjRpUofr4vXXX+9wnHMQucrKSs2ePVvvv/++1q9fr+bmZpWUlOjo0aP+x3AdxFY450DiOoilgQMH6oEHHtDWrVu1detWTZgwQVdeeaU/DHENxNbJXn+Jn3/TDMTFBRdcYNxyyy0d7vunf/on4ze/+Y1FFSWvRYsWGSNGjAh6rKWlxcjLyzMeeOAB/33Hjx83srOzjccffzxOFSY3SUZFRYX/djiveX19vdGjRw9j9erV/sccOHDASEtLM95888241Z4sAs+BYRjG9OnTjSuvvDLk13AOouvgwYOGJKOystIwDK4DKwSeA8PgOrBC3759jSeffJJrwCK+198w+PmPBCNKcdDU1KRt27appKSkw/0lJSV69913Laoque3du1cFBQUqLi7Wtddeq08//VSSVF1drbq6ug7nwul0aty4cZyLGAnnNd+2bZtOnDjR4TEFBQUaOnQo5yWKNm7cqJycHA0ePFizZs3SwYMH/cc4B9F1+PBhSVK/fv0kcR1YIfAc+HAdxIfX69Xq1at19OhRjRkzhmsgzgJffx9+/s35jtUFpIKvvvpKXq9Xubm5He7Pzc1VXV2dRVUlr9GjR+vZZ5/V4MGD9cUXX6isrExjx47Vrl27/K93sHOxb98+K8pNeuG85nV1dcrIyFDfvn07PYZrJDomT56sn/zkJyoqKlJ1dbVcLpcmTJigbdu2yel0cg6iyDAMzZs3Tz/84Q81dOhQSVwH8RbsHEhcB/Gwc+dOjRkzRsePH9cpp5yiiooKDRkyxP+HNtdAbIV6/SV+/iNBUIojh8PR4bZhGJ3uQ/dNnjzZ/9/Dhg3TmDFj9P3vf1/PPPOMf9Ei5yL+InnNOS/Rc8011/j/e+jQoRo5cqSKior02muvadq0aSG/jnNg3pw5c7Rjxw5t2bKl0zGug/gIdQ64DmLvrLPO0vbt21VfX6+XXnpJ06dPV2Vlpf8410BshXr9hwwZws9/BJh6FwennXaa0tPTO6XxgwcPdnpnBdHXp08fDRs2THv37vV3v+NcxE84r3leXp6ampp06NChkI9BdOXn56uoqEh79+6VxDmIlttuu02vvPKKNmzYoIEDB/rv5zqIn1DnIBiug+jLyMjQmWeeqZEjR6q8vFwjRozQ8uXLuQbiJNTrHww//ydHUIqDjIwMnX/++Vq/fn2H+9evX6+xY8daVFXq8Hg8+vjjj5Wfn6/i4mLl5eV1OBdNTU2qrKzkXMRIOK/5+eefrx49enR4TG1trT766CPOS4x8/fXX2r9/v/Lz8yVxDrrLMAzNmTNHa9eu1TvvvKPi4uIOx7kOYu9k5yAYroPYMwxDHo+Ha8Aivtc/GH7+wxD39hEpavXq1UaPHj2M//qv/zJ2795tzJ071+jTp4/x2WefWV1a0rnjjjuMjRs3Gp9++qnx/vvvG1OmTDEyMzP9r/UDDzxgZGdnG2vXrjV27txp/OxnPzPy8/ONhoYGiytPXI2NjUZVVZVRVVVlSDKWLVtmVFVVGfv27TMMI7zX/JZbbjEGDhxo/M///I/x4YcfGhMmTDBGjBhhNDc3W/XPSihdnYPGxkbjjjvuMN59912jurra2LBhgzFmzBhjwIABnIMo+dWvfmVkZ2cbGzduNGpra/0f3377rf8xXAexdbJzwHUQewsWLDA2bdpkVFdXGzt27DDuvvtuIy0tzXj77bcNw+AaiLWuXn9+/iNDUIqjxx57zCgqKjIyMjKM8847r0PLUkTPNddcY+Tn5xs9evQwCgoKjGnTphm7du3yH29paTEWLVpk5OXlGU6n07jooouMnTt3Wlhx4tuwYYMhqdPH9OnTDcMI7zU/duyYMWfOHKNfv35Gr169jClTphg1NTUW/GsSU1fn4NtvvzVKSkqM/v37Gz169DBOP/10Y/r06Z1eX85B5IK99pKMVatW+R/DdRBbJzsHXAexd+ONN/r/zunfv79xySWX+EOSYXANxFpXrz8//5FxGIZhxG/8CgAAAADsjzVKAAAAABCAoAQAAAAAAQhKAAAAABCAoAQAAAAAAQhKAAAAABCAoAQAAAAAAQhKAAAAABCAoAQAAAAAAQhKAICENGPGDDkcDjkcDvXo0UO5ubmaOHGinnrqKbW0tFhdHgAgwRGUAAAJa9KkSaqtrdVnn32mN954QxdffLFuv/12TZkyRc3NzVaXBwBIYAQlAEDCcjqdysvL04ABA3Teeefp7rvv1rp16/TGG2/o6aefliQtW7ZMw4YNU58+fVRYWKhbb71VR44ckSQdPXpUWVlZ+uMf/9jheV999VX16dNHjY2N8f4nAQBsgqAEAEgqEyZM0IgRI7R27VpJUlpamh555BF99NFHeuaZZ/TOO+9o/vz5kqQ+ffro2muv1apVqzo8x6pVq/Qv//IvyszMjHv9AAB7cBiGYVhdBAAAZs2YMUP19fV6+eWXOx279tprtWPHDu3evbvTsRdffFG/+tWv9NVXX0mS/vrXv2rs2LGqqalRQUGBvvrqKxUUFGj9+vUaN25crP8ZAACbYkQJAJB0DMOQw+GQJG3YsEETJ07UgAEDlJmZqV/84hf6+uuvdfToUUnSBRdcoLPPPlvPPvusJOkPf/iDTj/9dF100UWW1Q8AsB5BCQCQdD7++GMVFxdr3759uuyyyzR06FC99NJL2rZtmx577DFJ0okTJ/yP/+Uvf+mffrdq1SrNnDnTH7QAAKmJoAQASCrvvPOOdu7cqauvvlpbt25Vc3Oz/uM//kMXXnihBg8erM8//7zT11x//fWqqanRI488ol27dmn69OkWVA4AsJPvWF0AAACR8ng8qqurk9fr1RdffKE333xT5eXlmjJlin7xi19o586dam5u1qOPPqrLL79cf/7zn/X44493ep6+fftq2rRpuvPOO1VSUqKBAwda8K8BANgJI0oAgIT15ptvKj8/X2eccYYmTZqkDRs26JFHHtG6deuUnp6uc845R8uWLdODDz6ooUOH6rnnnlN5eXnQ57rpppvU1NSkG2+8Mc7/CgCAHdH1DgAASc8995xuv/12ff7558rIyLC6HACAxZh6BwBIad9++62qq6tVXl6um2++mZAEAJDE1DsAQIpbunSpzjnnHOXm5mrBggVWlwMAsAmm3gEAAABAAEaUAAAAACAAQQkAAAAAAhCUAAAAACAAQQkAAAAAAhCUAAAAACAAQQkAAAAAAhCUAAAAACAAQQkAAAAAAhCUAAAAACDA/wNXPUB2yqHy1AAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Operation 'plot_weekly_temperature' has no postconditions!\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Generating plot of daily temperature.\n" ] }, { "data": { "image/png": "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D/Hoo4/i4YcfxjPPPBN8/oorrsD777+Pl156CevWrcNFF12EMWPGYPPmzcF1Dh48iBkzZuCZZ57BJ598go4dO2Lfvn2YNGkSli1bhg8++AB9+vTB+eefj3379gEAPv74YwDA7NmzsWvXruBjq1S533//ffzpT3/Crl27MGLECAwcOBArV67EwoULsWfPHlx88cWm+1i3bh327t2LU089NWT5Pffcg1tuuQU+nw9r1qzBxIkTAQBr167FJ598gjvvvNMwZbU+cB4yZAiWLVtm63WRiyTNVVVVCQCpqqpKdFGIiMhppaUiQOBfK8uNFBebr1daGng+KyuwP683/Hpk6tChQ7Jx40Y5dOhQ7DtTn0dWVuz7imDSpEkyfvx4w+cmTJggxx9/vOm2r7zyihx11FHBx7Nnz5a8vLzg4+LiYhkwYEDw8axZs0L29+qrr0rr1q1l//79tsq5f/9+admypaxYsSJknauuukouvfRSERFZsmSJAJB///vfwednzJghAGTLli3BZddee62cd955wccjRoyQ448/XhoaGoLL/t//+3/Bcn/xxRfi8Xjk66+/Djn2yJEj5d577w2+DwBk7dq1YV9TXV2d5ObmyhtvvBFcBkAWLFhg+tqVW2+9VUaMGBFS7oEDB4asU1RUJKNHjw5ZtnPnTgEgmzZtMizTggULxOv1hrx+5ciRI7Jr166QZS+//LIAkNWrV5u9zBC33367FBYWWlqXzIU739iJDdiiREREqau+3rhFQbU81NdH3kdJiXmLRFFRYOxLbW3g3/p6YOTI0HXcHCPDyXCbirWbpYNEJGQC3SVLlmDUqFHo0qULcnNzMXHiRHz//fc4cOCApf1NnjwZX3zxBT744AMAwHPPPYeLL74YOTk5tsq1ceNGHD58GKNGjULr1q2Df88//zy2bNkSsu7JJ58c/H+nTp3QqlUrHHPMMSHLKisrQ7Y544wzQl730KFDsXnzZtTX12P16tUQEfTt2zfk2EuXLg05dlZWVsixgUDmt+uuuw59+/ZFXl4e8vLysH//fuzYscPW6zejbwVatWoVlixZElLO4447DgCavE/KoUOH4PP5DCdObtGiBfLz80OWyf+6JFqdaDk7OzukqyMlFudRIiKi1BUuUHCiO5a+W97IkYHueCNHAosXuz9Gxol5otKJ/v1Wj4GEdL/79NNP0atXLwDA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0CBZs2ZNcN3BgwfLk08+aXrstE3m4Pf7ZdKkScFkDrNmzQo+V1NTw2QORETJLpqkCU4lO4g0v1IKd11zVLjuji51+0vlQGn//v2Sm5srn332mUyYMEGmTZsWfO6MM86Q//f//l/I+pWVldKiRQspLy8XkUD95a677pLOnTtLq1atZMiQIbJkyZLg+rNnz5a8vDx544035Pjjjxev1ytffvmlfPTRR3LuuefKUUcdJW3atJGzzz5bVq1aFXKsTz/9VM4880zx+Xxy/PHHy6JFiwSALFiwILjOV199JRdffLG0bdtW2rdvL+PGjZOtW7dGfN0lJSVyySWXyKeffiq5ubmyf//+kOdHjBghN998s9x1113Srl076dSpkxTrft8A5C9/+YtceOGFkp2dLb1795bXXnutyWvXWrBggWjv5X/xxRcybtw46dixo+Tk5Mipp54qixYtCtnGate7JUuWCAD58ccfg8vef/99GT58uLRs2VK6du0qN998c8hr7dGjh5SVlcnll18uOTk50r17d3n11VelsrJSxo0bJzk5OdK/f3/5+OOPm7yuBQsWSJ8+fcTn88m5554rO3bsCCnP66+/LoMHDxafzye9evWSkpISOXLkSMj799RTT8m4ceOkVatWMnXqVKmrq5Mrr7xSevbsKS1btpS+ffvKI488EtzGaBjKkiVLDF/7mjVrBEDw+2D2XYz0HTZy8803yy9/+cuQZW+88YaMGzdOamtr5YMPPpDTTjst+NysWbMkIyOjSSOJSCBA1H4mJSUlMnz4cNNjp0WgdO+998p7770nW7dulXXr1sl9990nGRkZ8u6774pIID14Xl6ezJ8/X9avXy+XXnop04MTEaWbaCdWtZKCPI0mbHVcuOA02s8kDH3FpaGhQfbX7E/IX0NDg62yP/vss3LqqaeKSKCi17Nnz+A+HnvsMenevXvIPh977DHp0qVL8E78ZZddJsOGDZP33ntPvvjiC/n9738vPp9PPv/8cxEJVE4zMzNl2LBh8v7778tnn30m+/fvl8WLF8sLL7wgGzdulI0bN8pVV10lnTp1CtaD6uvrpV+/fjJq1ChZu3atLFu2TIYMGRISKB04cED69OkjV155paxbt042btwol112mfTr109qampMX3NDQ4P06NFD/vWvf4mIyCmnnCLPPfdcyDojRoyQNm3aSElJiXz++ecyZ84c8Xg8wXqcSKCi37VrV/n73/8umzdvlltuuUVat24dbMWxEiitXbtWnn76aVm3bp18/vnncv/990vLli1DWvaiDZTWrVsnrVu3locfflg+//xzef/992XQoEEyefLkkH23b99enn76afn888/l+uuvl9zcXBkzZoy88sorsmnTJrnwwgvl+OOPD34P1Gd66qmnyooVK2TlypUyZMgQGTZsWHC/CxculDZt2shf//pX2bJli7z77rvSs2dPKSkpCXn/OnbsKM8++6xs2bJFtm3bJrW1tTJ16lT56KOP5Msvv5S//e1v0qpVK3n55ZdFRGTfvn1y8cUXy5gxY4KtZjU1NZYDJaPvYqTvsJEBAwaEZK8WCQQ8Y8aMkRYtWkjbtm3l3//+d/C5k08+OWweAq233npLfD6fHD582PD5tAiUrrzySunRo4dkZWVJhw4dZOTIkSE/LjXhbH5+vvh8Pjn77LNl/fr1to7BQImI0loiU147wa1kByoASKP02q4I193R4fdOX3HZX7NfUIKE/O2v2R+htKGGDRsWvGN/5MgROfroo4MtGqr16L333guuP3ToULnrrrtEJNAa4vF4miSnGjlypNx7770iEqicApC1a9eGLUddXZ3k5ubKG2+8ISIib7/9trRo0UJ27doVXEffovTss89Kv379QgK5mpoayc7Olnfeecf0WO+++6506NAh2Lrx8MMPy5lnnhmyzogRI+Sss84KWXbaaaeFtLABkClTpgQf79+/Xzwej7z99tvB1x4pUDJywgknyGOPPRZ8HG2gdPnll8tvfvObkHWWLVsmGRkZwe9qjx495Ne//nXw+V27dgkAKSoqCi77z3/+IwCCn4X6TD/44IPgOp9++qkAkA8//FBERIYPHy6//e1vQ479wgsvSEFBQfAxALntttsivq4bbrhBfvGLXwQfG3W9sxoo6b+LVr7DRvLy8uT55583fG7Pnj1NAvXs7Gy55ZZbwr3MoP/+978CQLZt22b4vFOBUgu3xj5Z8eyzz4Z93uPxoKSkBCUcWEpEZEyl1wbMkx8ks3BJC9TzdrZTvN5AGnEgNEW52frpoqQk8NqNXmdZWeB9U9dUlWpdm65du11RETB9emM6div7TEObNm3CRx99hPnz5wMAWrRogQkTJuC5557Dueeeiw4dOmDUqFGYO3cuhg8fjq1bt+I///kPnnrqKQDA6tWrISLo27dvyH5rampw1FFHBR9nZWXh5JNPDlmnsrISU6dORXl5Ofbs2YP6+nocPHgQO3bsCJatW7duyM/PD24zZMiQkH2sWrUKX3zxBXJzc0OWHz58GFu2bDF93c8++ywmTJiAFi0CVcVLL70Ud911FzZt2oR+/foF19OXuaCgAJWVlSHLtOvk5OQgNze3yTrhHDhwANOmTcO//vUvfPPNN6irq8OhQ4eC70Ms1Pszd+7c4DIRQUNDA7Zu3Yrjjz++yWvo1KkTAOCkk05qsqyysjL4ebRo0QKnnnpqcJ3jjjsObdu2xaeffoohQ4Zg1apV+Pjjj/HAAw8E16mvr8fhw4dx8OBBtGrVCgBC9qE8/fTTeOaZZ7B9+3YcOnQItbW1GDhwYKxvB4Cm30Wr32G9Q4cOoWXLlobPdezYsckyiZCwTSs7OxsAcPDgQUvrRyuhgRIREcVIVV61wZJRhrhkFa6CHa7sRtvpX7d6DJgHA+nGauAc7r1S2xnNWbV4sfk+bWqV2Qr7790f1baxapXZyvK6zz77LOrq6tClS5fgMhFBZmYmfvzxR7Rr1w6/+tWvcOutt+Kxxx7D3//+d5x44okYMGAAAKChoQFerxerVq2CVze/V+vWrYP/z87OblJJnDx5Mr799ls88sgj6NGjB3w+H4YOHYra/90EsFKxbGhowCmnnBISCCgdOnQw3OaHH37Aq6++iiNHjgQDPiBQiX/uuecwa9as4LLMzMyQbT0eDxoaGkKWhVsnIyMDIhLyvMpuptx1111455138Ic//AG9e/dGdnY2fvnLXwbfh1g0NDTg2muvxS233NLkue7duxu+BvWeGy3Tv3ajz0e77rRp0/Dzn/+8yTraACMnJyfkuVdeeQW33347HnzwQQwdOhS5ubn4/e9/jw8//ND8hQLBzHPa91v/XgNNv4tWv8N6Rx99NH788cewZdLq27cvPv30U0vr/vDDDwDMv8NOYaBERJTqtMGSagFIhSDJCqstJJGCQ5Wi3CiIsHvMxYsDQUMytbDoy6x9nSNHBlKo64Mi7Xul3079X62j9qGCJQeCcY/Hg5ysnMgrJlBdXR2ef/55PPjggxg9enTIc7/4xS8wd+5c3HTTTbjwwgtx7bXXYuHChfj73/+Oyy+/PLjeoEGDUF9fj8rKSgwfPtzW8ZctW4Ynn3wS559/PgBg586d+O6774LPH3fccdixYwf27NkTbNH4+OOPQ/YxePBgvPzyy+jYsSPatGlj6bhz585F165d8eqrr4YsX7x4MWbMmIEHHngg2NIUqw4dOmDfvn04cOBAMCBYu3ZtyDrLli3D5MmT8bOf/QwAsH//fmzbts2R4w8ePBiffPIJevfu7cj+tOrq6rBy5cpgK9+mTZuwd+9eHHfcccFjb9q0yfaxly1bhmHDhuGGG24ILtO3DmZlZaFe1yKvgopdu3ahXbt2AJq+10ai/Q4PGjQoZMqfSC677DLcd999WLNmDQYNGhTyXF1dHWpqaoLfkQ0bNqBr1644+uijLe8/KpY6AqYwjlEiomYj3HiTZGc21kqbstpouT4duNHz2rFaVpISRBr/pCa6TabJYM2SL6jU6WpSXpHI49oKC41fh3rdap82X2cqZr1bsGCBZGVlyd69e5s8d99998nAgQODjy+77DIZMGCAeDyeJunDf/WrX0nPnj1l3rx5wWx2M2fOlDfffFNEjMfpiIgMHDhQRo0aJRs3bpQPPvhAhg8fLtnZ2cGxOHV1ddKvXz8577zz5L///a8sX75cTj/9dAEgr776qog0JnMoLCyU9957T7788kupqKiQW265RXbu3Gn4ugcMGNAkk5+ISHV1tfh8vuC+R4wYIbfeemvIOuPHj5dJkyYFH0OXgU8kMHZl9uzZIiLy/fffS05Ojtxyyy2yefNmmTt3rnTu3DlkjNKFF14oAwcOlDVr1sjatWvlggsukNzc3JBjRztG6b///a9kZ2fLDTfcIGvWrJHPP/9cXnvtNbnpppvC7lv/urZu3SoAgimsVVKEIUOGyAcffCCrVq2SoUOHyhlnnBHcZuHChdKiRQspLi6WDRs2yMaNG+Wll16S+++/P+z798gjj0ibNm1k4cKFsmnTJpkyZYq0adNGBgwYEFzngQcekO7du8tnn30m3377rdTW1kptba1069ZNLrroItm0aZP861//kn79+hlmvdOL9B028uijj8opp5xi+rze4cOHZfjw4cH04GvXrpUtW7bIyy+/LIMHDw5JDz5p0iS58sorTfeVFskc4oGBEhE1C9EMvE+mRBBWkjPYycAWzWvTbqM/hj44ciErXMz0ZVABjddrbz9W5qyKIhhPxUBp7Nixcv755xs+t2rVKgEQTNf95ptvCgA5++yz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6NBBMjMzpXv37jJp0qQm7y8/g+gZvfcAZPbs2cF1+DtwV6TPgL8D91155ZXBek6HDh1k5MiRwSBJhL8Bt4V7//n9j45HRCR+7VdERERERETJj2OUiIiIiIiIdBgoERERERER6TBQIiIiIiIi0mGgREREREREpMNAiYiIiIiISIeBEhERERERkQ4DJSIiIiIiIh0GSkRERERERDoMlIiIKCVNnjwZHo8HHo8HmZmZ6NSpE0aNGoXnnnsODQ0NiS4eERGlOAZKRESUssaMGYNdu3Zh27ZtePvtt3HOOefg1ltvxdixY1FXV5fo4hERUQpjoERERCnL5/MhPz8fXbp0weDBg3Hffffhtddew9tvv42//vWvAICHHnoIJ510EnJyctCtWzfccMMN2L9/PwDgwIEDaNOmDf75z3+G7PeNN95ATk4O9u3bF++XRERESYKBEhERpRW/348BAwZg/vz5AICMjAw8+uij2LBhA+bMmYPy8nLcfffdAICcnBxccsklmD17dsg+Zs+ejV/+8pfIzc2Ne/mJiCg5eEREEl0IIiIiuyZPnoy9e/fi1VdfbfLcJZdcgnXr1mHjxo1NnvvHP/6B66+/Ht999x0A4KOPPsKwYcOwY8cOdO7cGd999x06d+6MRYsWYcSIEW6/DCIiSlJsUSIiorQjIvB4PACAJUuWYNSoUejSpQtyc3MxceJEfP/99zhw4AAAYMiQITjxxBPx/PPPAwBeeOEFdO/eHWeffXbCyk9ERInHQImIiNLOp59+il69emH79u04//zz0b9/f8ybNw+rVq3CE088AQA4cuRIcP2rr7462P1u9uzZuOKKK4KBFhERNU8MlIiIKK2Ul5dj/fr1+MUvfoGVK1eirq4ODz74IM444wz07dsX33zzTZNtfv3rX2PHjh149NFH8cknn2DSpEkJKDkRESWTFokuABERUbRqamqwe/du1NfXY8+ePVi4cCFmzJiBsWPHYuLEiVi/fj3q6urw2GOP4YILLsD777+Pp59+usl+2rVrh5///Oe46667MHr0aHTt2jUBr4aIiJIJW5SIiChlLVy4EAUFBejZsyfGjBmDJUuW4NFHH8Vrr70Gr9eLgQMH4qGHHsKsWbPQv39/zJ07FzNmzDDc11VXXYXa2lpceeWVcX4VRESUjJj1joiICMDcuXNx66234ptvvkFWVlaii0NERAnGrndERNSsHTx4EFu3bsWMGTNw7bXXMkgiIiIA7HpHRETN3O9+9zsMHDgQnTp1wr333pvo4hARUZJg1zsiIiIiIiIdtigRERERERHpMFAiIiIiIiLSYaBERERERESkw0CJiIiIiIhIh4ESERERERGRDgMlIiIiIiIiHQZKREREREREOgyUiIiIiIiIdBgoERERERER6fx//PwAAdDYwRsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Operation 'plot_daily_temperature' has no postconditions!\n", "Operation 'plot_weekly_temperature' has no postconditions!\n" ] } ], "source": [ "flow_project.run()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have successfully plotted the temperature values present in a **signac** data space along with the average value of all the temperatures present using the aggregation feature of **signac-flow**.\n", "\n", "To learn more about how to use aggregation, see the [documentation on aggregation](https://docs.signac.io/en/latest/aggregation.html)." ] } ], "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.12.0" } }, "nbformat": 4, "nbformat_minor": 4 }