{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "4bcd49a4", "metadata": { "nbsphinx": "hidden" }, "outputs": [], "source": [ "# Install HermesPy and its dependencies in the current kernel\n", "# When running on Colabs, a restart of the runtime is required afterwards\n", "\n", "import sys\n", "!{sys.executable} -m pip install --quiet hermespy" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Implementing Precodings\n", "========================\n", "\n", "[Symbol Precoders](../api/modem.precoding.symbol_precoding.SymbolPrecoder.rst) are Hermes' abstraction for operations on time-domain series of complex numbers representing communication symbols.\n", "Within the signal processing chain for communication, modeled by the [Modem](../api/modem.rst) module, [Symbols](../api/modem.symbols.rst) are considered in between the mapping of bit streams to symbols and their modulation to base-band signals during transmission, and, inversely, in between the demodulation of base-band signals to symbols and their following unmapping to bit streams.\n", "\n", "At this stage, users may configure custom operations on the symbol series for any coherent modulation scheme.\n", "This tutorial will demonstrate the programming interface by implementing a symbol precoding which only reverses the modulated symbols in time-domain.\n", "We don't expect any performance gain or loss from this operation, the only purpose of this exercise is to get new users and developers accustomed to the specific interface.\n", "\n", "Let's jump right into it and implement the prosed precoding as a class titled *SymbolFlipper*, which inherits from the base [Symbol Precoders](../api/modem.precoding.symbol_precoding.SymbolPrecoder.rst), common to all symbol precoding routines." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from hermespy.modem import StatedSymbols, SymbolPrecoder\n", "\n", "\n", "class SymbolFlipper(SymbolPrecoder):\n", " \n", " def encode(self, symbols: StatedSymbols) -> StatedSymbols:\n", " \n", " encoded_symbols = symbols.copy()\n", " encoded_symbols.raw = np.flip(encoded_symbols.raw, axis=1)\n", " \n", " return encoded_symbols\n", " \n", " def decode(self, symbols: StatedSymbols) -> StatedSymbols:\n", " \n", " decoded_symbols = symbols.copy()\n", " decoded_symbols.raw = np.flip(decoded_symbols.raw, axis=1)\n", " decoded_symbols.states = np.flip(decoded_symbols.states, axis=2)\n", " \n", " return decoded_symbols\n", " \n", " @property\n", " def num_input_streams(self) -> int:\n", " \n", " return self.required_num_input_streams\n", " \n", " @property\n", " def num_output_streams(self) -> int:\n", " \n", " return self.required_num_output_streams" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "[Symbol Precoders](../api/modem.precoding.symbol_precoding.SymbolPrecoder.rst) expect their two abstract methods [encode](../api/modem.precoding.symbol_precoding.SymbolPrecoder.rst#hermespy.modem.precoding.symbol_precoding.SymbolPrecoder.encode) and [decode](../api/modem.precoding.symbol_precoding.SymbolPrecoder.rst#hermespy.modem.precoding.symbol_precoding.SymbolPrecoder.decode) to be defined.\n", "As their names already hint, the encode routine will be called during data transmission and perform an operation on an incoming stream of [StatedSymbols](../api/modem.symbols.rst#hermespy.modem.symbols.StatedSymbols), the decoding routine will be called during data reception and is expected to reverse the effects of its encoding counterpart.\n", "Additionally, some precodings might alter the number of antenna streams during their coding operations, so two additional properties [num_input_streams](../api/precoding.precoding.rst#hermespy.precoding.precoding.Precoder.num_input_streams) and [num_output_streams](../api/precoding.precoding.rst#hermespy.precoding.precoding.Precoder.num_output_streams) must be specified.\n", "\n", "[StatedSymbols](../api/modem.symbols.rst#hermespy.modem.symbols.StatedSymbols) are an extension of [Symbols](../api/modem.symbols.rst#hermespy.modem.symbols.StatedSymbols) and carry [ChannelStateInformation](../api/core.channel_state_information.rst) as additional information next to the raw symbol stream.\n", "This is required since some symbol precodings might rely on a channel estimate for effective precoding.\n", "Both the raw symbol stream and channel state information are essentially numpy arrays of specific dimensions.\n", "The raw symbol array has three dimensions, representing antenna streams, words and symbols, respectively, while the channel state information has four dimensions, representing output antennas, input antennas, words and symbols, respectively." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHgCAYAAABJmwJ4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABO70lEQVR4nO3deVxU9f7H8fewqji4obigZrngimlqpmalWf1arOuWVmq3TcHKbqst16zutdW6uVu51O1qZVq2qEmapomYKSquKS6googKIjvf3x/G5AQo6MAZmNfz8fg+dA5n+czENG8/8z3n2CQZAQAAeCAvqwsAAACwCkEIAAB4LIIQAADwWAQhAADgsQhCAADAYxGEAACAxyIIAQAAj0UQAgAAHosgBAAAPBZBCLCQMUZjx461ugy4ocaNG8sYo2HDhlly/GHDhskYo8aNG1tyfKCsEIQAF8r/8Dh3JCYmavny5br55psvuH3Xrl01duxYVatWrVjHmzVrVoHj5Y/09PRLfTqlJi4uzqnW06dPa926dbrvvvsuep+33HJLqYTKsWPHFvkaG2MUHBzs8mOWpTFjxqhv375WlwFYxsfqAoCK6KWXXlJcXJxsNpuCg4M1fPhwLV68WLfddpu+++47x3qVKlVSTk6O4/E111yjl19+WbNnz9apU6eKdayMjAw9+OCDBZbn5uZe+hMpRRs3btQ777wjSapXr54efPBBffzxx/L399eHH35Y4v393//9n0aNGqVx48a5ulRJ0ogRI3T69OkCy0+ePFkqxysrzz//vObPn6+vv/7aafknn3yiefPmKTMz06LKgLJBEAJKweLFi7VhwwbH448++kiJiYkaPHiwUxByxYdMTk6OPv300xJvV6VKFZ05c6bQn1WuXPmSOkre3t7y8vJSdnZ2keskJCQ41T179mzt3btXTzzxxEUFodI2f/58HT9+3OoyykxeXh4hCB6Br8aAMnDy5Emlp6c7dX8k5zlCY8eO1dtvvy1J2rdvn+OrF1fM0cj/yu7aa6/V5MmTlZiYqPj4eEnSihUrtGXLFnXo0EErV65UWlqa/v3vf0uSateurQ8//FBHjhxRenq6Nm3apKFDhzrtO38uy5NPPqnHH39cv//+uzIzM9WqVasS1ZiUlKQdO3boiiuucFrevXt3ff7559q/f78yMjJ04MABTZgwQZUqVXKs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Itf5a/fFSvv371e7du1ks9mc6goNDXX83JW+//57/fTTT3r++ec1ffp0nTlzRm3btlWLFi00dOhQffLJJ451e/fuXWD7ol67PXv2qHfv3lqzZo3T10Wl4auvvlJmZqYGDRokSWrRooXGjx/vtE7//v21fPnyAtd+ql69+gW/Wjxx4kShXy39tRvTr18/ZWRk6KabbnLqsN1///0Fti3u71z+f+8WLVo4df98fX3VpEkTRUZGFms/gLvh9HmgDPj4+KhPnz7KzMx0fLVUmPw5J646rftSfP/996pXr57jQ10623l49NFHlZqaqpUrV7r8mG+88YaCgoL00EMPSfqzq/DXLsLjjz9eYNv81+6vX5d9/vnn8vHx0UsvvVRgG29v72Jfxbs4Tp06paVLl2rgwIG6++67lZmZqa+++sppndzc3ALPp3///goJCbng/vfs2aPQ0FAFBQU5lrVr107dunUrcAxjjFOnqHHjxrrzzjsL7DMtLa1Yv2+RkZHKzMzUY4895rT8gQceUPXq1Z3miwHlCR0hoBTccsstjs5JnTp1NGTIEDVv3lzjx48vcEr7ufLnFf3rX//SvHnzlJ2drW+++abICx9KZ0NWUV93LFy48Lzbns+MGTP0yCOPaPbs2erYsaP27dun/v37q3v37nr88ccLvcrypVqyZIm2bNmif/zjH5o8ebJ27Nih33//XW+//bYaNGiglJQU9evXTzVq1Ciwbf5r9/7772vp0qXKzc3VZ599plWrVmnatGl6/vnn1b59e/3www/Kzs5Ws2bNNGDAAD3++OP68ssvL1hb//79C33Oy5Yt09GjRx2PP/vsM3366acKDw/X0qVLC1wh/Ntvv9XYsWM1c+ZM/fLLL2rbtq3uueee8562nm/mzJn6xz/+oaVLl+qjjz5SnTp1NGLECMXGxiowMNCx3nfffacnn3xSS5Ys0f/+9z/VqVNHERER+v333xUWFlbgdevdu7eeeOIJHTp0SHFxcYqOji5w7KSkJI0fP14vv/yylixZokWLFqlFixYKDw9XdHT0eS8NAbg7y09dYzAqyijs9PkzZ86Y3377zTzyyCMF1v/r6fOSzAsvvGAOHjxocnJyLngq/flOnz932/y6OnbsWGAfK1asMFu2bCl0/7Vr1zYfffSROXr0qMnIyDAxMTFOp3NLf57m/eSTTxb7dYqLizPf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36527do5nUVWkvekr68vl7WAx5s4caLuuusu3XDDDdq3b5/TzzZs2KCsrCyn92Hz5s3VuHFjp/dh586dnbYryfvQFZ+Lls8yr0hj4MCBJj093QwdOtSEhoaaadOmmeTkZFOnTh1js9nM1q1bzdKlS027du1M9+7dzfr16ws9a2zYsGEmODjY1KtXz1x77bVm8+bNZseOHcbb29vy58hguMsICAgwYWFhJiwszBhjzOjRo01YWJhp2LChkWSeeeYZk5ycbG6//XbTpk0bs3DhQrNnzx7j7+/v2P7o0aPm448/Ni1btjS33HKL2bVrV6Fnjd1www0mODjYNGjQwNx8883m4MGD5scff7T8NWAwrByTJ082J06cMNdee60JDg52jEqVKjnWmTJlitm3b5+57rrrTIcOHcyaNWvMmjVrHD9v2LChycjIMG+++aZp3ry5GTx4sDl06FChZ401a9bMBAcHm0aNGpn+/fubU6dOmY8++uhSn4f1L2RFGxEREWbfvn0mIyPDREVFmc6dOzt+1qxZM7Nq1SqTkZFhduzYYfr06VNoEMqXm5trEhISzNy5c02TJk0sf24MhjuN/P85/tWsWbMc64wbN84cPnzYpKenm2XLlplmzZo57aNLly5m48aNJiMjw/z222/mrrvuKjQI5cvOzjYHDhww06dPN0FBQZa/BgyGlaMow4YNc6zj7+9vJk2aZI4fP25Onz5tvvzySxMcHOy0n1tvvdXs2rXLpKenm5UrV5rhw4cXGoTyZWVlmT179pg333zTVKlS5ZKeg+2PvwAAAHgc5ggBAACPRRACAAAeiyAEAAA8FkEIAAB4LIIQAADwWAQhAADgsQhCAADAYxGEAACAxyIIAQAAj0UQAlBhBAUFacqUKdq/f78yMjJ0+PBhLVmyRNdcc42kszdiNcaoS5cuTtu9++67WrFihePx2LFjZYyRMUY5OTk6cOCApk+frho1apTp8wFQ+nysLgAAXOXLL7+Un5+fhg0bpr179yo4OFi9evVSrVq1HOukp6frjTfe0HXXXXfefW3dulW9e/eWt7e3WrZsqZkzZ6patWq6++67S/lZAChLBCEAFUK1atV07bXXqmfPnlq1apUk6cCBA1q/fr3TejNmzNCIESN0yy23aPHixUXuLycnR4mJiZKkQ4cO6YsvvtD9999fek8AgCX4agxAhXD69GmlpqbqzjvvlJ+fX5HrxcXFadq0aRo/frxsNlux9t24cWPddNNNysrKclW5ANwEQQhAhZCbm6vhw4dr2LBhOnnypFavXq1//etfatu2bYF1X3vtNTVp0kT33HNPkftr27atUlNTdebMGe3bt09t2rTRG2+8UZpPAYAFCEIAKowFCxaofv36uuOOO7RkyRJdd911+u233zRs2DCn9ZKSkvT222/rlVdeka+vb6H72rlzp9q3b69OnTrp9ddf15IlSzRx4sSyeBoAyhBBCECFkpmZqcjISL322mvq1q2bZs+erXHjxhVYb8KECapcubLCw8ML3U9WVpb27Nmj2NhYjRkzRrm5uRo7dmxplw+gjBGEAFRo27ZtU0BAQIHlaWlpevXVV/XCCy/IbrdfcD+vvfaannrqKdWrV680ygRgEYIQgAqhZs2a+vHHH3XPPfeobdu2uuyyy9S/f38988wz+vrrrwvdZsaMGTp16pSGDBlywf1HRUVp8+bNev75511dOgALEYQAVAinT5/WunXr9MQTT2jVqlXaunWrXn31VX3wwQcaNWpUodvk5OTopZdeUuXKlYt1jHfffVcPPvigQkJCXFk6AAvZJBmriwAAALACHSEAAOCxCEIAAMBjEYQAAIDHIggBAACPRRACAAAeiyAEAAA8FkEIAAB4LIIQAADwWAQhAADgsQhCAADAYxGEAACAx/p/Bc9gQcfuvrcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from hermespy.core import ConsoleMode, dB\n", "from hermespy.simulation import Simulation\n", "from hermespy.modem import BitErrorEvaluator, DuplexModem, ElementType, FrameElement, FrameResource, FrameSymbolSection, OFDMWaveform\n", "\n", "# Create a new Monte Carlo simulation\n", "simulation = Simulation(console_mode=ConsoleMode.SILENT)\n", "\n", "# Add a single device, operated by a communication modem\n", "operator = DuplexModem()\n", "operator.device = simulation.new_device()\n", "\n", "# Configure an OFDM waveform with a frame consisting of a single symbol section\n", "operator.waveform = OFDMWaveform(resources=[FrameResource(elements=[FrameElement(ElementType.DATA, 1024)])],\n", " structure=[FrameSymbolSection(pattern=[0])])\n", "\n", "# Configure our newly implemented symbol precoding\n", "operator.precoding[0] = SymbolFlipper()\n", "\n", "# Configure a parameter sweep over the receiver SNR, effectively simulating an AWGN channel\n", "simulation.new_dimension('snr', dB(0, 2, 4, 8, 12, 16, 20))\n", "\n", "# Evaluate the BER\n", "simulation.add_evaluator(BitErrorEvaluator(operator, operator))\n", "\n", "# Run the simulation and plot the results\n", "result = simulation.run()\n", "\n", "_ = result.plot()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "To highlight that the implemented precoder has no effect on the communication performance, we can deactivate it and re-run the simulation:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHgCAYAAABJmwJ4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUo0lEQVR4nO3deVxU5eIG8GfYFQdRWQUkckNRSU0UN0wsWwVT0dxNLQPLurbctH5mdfNaaTfXLBXXstytXFFcAzEXRMA1UEBAEQVkn+H9/YFMToCCzPAOzPP9fN5PzuHMOc+MjPN0VgUAASIiIiIjZCI7ABEREZEsLEJERERktFiEiIiIyGixCBEREZHRYhEiIiIio8UiREREREaLRYiIiIiMFosQERERGS0WISIiIjJaLEJEEgkhMGvWLNkxyAC5u7tDCIFx48ZJWf+4ceMghIC7u7uU9RPVFhYhIh0q+/K4f6Snp+PAgQN49tlnH/p8X19fzJo1C40bN67S+kJDQ8utr2zk5+fX9OXoTUJCglbWu3fv4vjx4xgzZswjL/O5557TS6mcNWtWpe+xEAKOjo46X2dt+vDDDxEQECA7BpE0ZrIDENVHH3/8MRISEqBQKODo6Ijx48dj165dePHFF/H7779r5rOysoJKpdI87tmzJz755BOsWrUKWVlZVVpXQUEBJk2aVG66Wq2u+QvRo9OnT2PevHkAAGdnZ0yaNAlr1qyBpaUlli9fXu3lPf/885g6dSpmz56t66gAgClTpuDu3bvlpt+5c0cv66stM2bMwKZNm7B9+3at6WvXrsWGDRtQWFgoKRlR7WARItKDXbt24eTJk5rHK1asQHp6Ol555RWtIqSLLxmVSoX169dX+3kNGzZEXl5ehT9r0KBBjbYomZqawsTEBMXFxZXOk5KSopV71apV+Ouvv/DOO+88UhHSt02bNuHWrVuyY9SakpISliAyCtw1RlQL7ty5g/z8fK2tP4D2MUKzZs3C119/DQBITEzU7HrRxTEaZbvs+vbti8WLFyM9PR3JyckAgPDwcMTExKBLly44dOgQcnNz8cUXXwAA7O3tsXz5cqSlpSE/Px9nzpzB2LFjtZZddizL9OnTMW3aNFy+fBmFhYVo3759tTJmZGTg/PnzaNmypdb03r1745dffsHVq1dRUFCAa9euYf78+bCystLMExoaiqlTpwKA1m6rMgqFAtOmTcO5c+eQn5+PtLQ0fPfdd7C1ta1Wxso4ODiguLgY//d//1fuZ23atIEQAiEhIQCAJk2a4KuvvsLZs2eRk5ODrKws7Ny5E506dXroesLDwxEeHl5uemhoKBISErSmTZ8+HceOHUNGRgby8vLw559/YsiQIVrzCCHQqFEjjB8/XvOehYaGAqj8GKE33ngD586dQ0FBAVJSUrBo0aJyu3LLfqfatWuHAwcOIDc3F8nJyXjvvfce+hqJahu3CBHpQePGjdGsWTMoFAo4ODjgzTffRKNGjbBu3bpKn7Nlyxa0adMGI0eOxNtvv42MjAwAwM2bNx+6vmbNmpWbVlRUhJycHK1pS5Yswc2bN/Hpp5/C2tpa6/m7du3Chg0bsG7dOqSnp8PKygoHDx5Eq1atsGjRIiQkJGDYsGFYvXo1bG1tsWDBAq1lT5gwAVZWVvj+++9RWFiIzMzMh+a+n6mpKVxdXXH79m2t6cOGDUPDhg2xdOlS3Lp1Cz4+PnjzzTfh6uqKoKAgAMCyZcvQvHlzPPPMMxg9enS5ZS9btgzjx49HaGgoFixYAA8PD0ydOhWdO3dGr169yhXUijRt2rTcNJVKhaysLNy4cQOHDh1CUFAQPv30U615hg8fDpVKhY0bNwIAHn/8cQQGBmLjxo1ISEiAo6MjXn/9dRw6dAjt27dHampqld+zB5k2bRp27NiB9evXw8LCAiNGjMCmTZvwwgsvYOfOnQCA0aNHY/ny5YiKisL3338PALhy5Uqly5w1axY++eQT7Nu3D0uXLkXbtm3xxhtvoFu3buXexyZNmmD37t3YsmULfvnlFwwdOhRffvklYmJisHv3bp28RiJdERwcHLoZ48aNExXJz88XY8eOLTe/EELMmjVL83j69OlCCCHc3d2rtL7Q0NAK1yeEELt27SqX6/Dhw8LExERrGeHh4UIIIV577TWt6W+99ZYQQoiRI0dqppmZmYljx46J7Oxs0ahRIwFAuLu7CyGEuHPnjrCzs6tS7oSEBLF7927RrFkz0axZM+Hl5SVWr14thBBi4cKFWvNaWVmVe/4HH3wg1Gq1cHNz00xbuHChEKWbgbRGr169hBBCvPLKK1rTn3nmmQqn/3PMmjWr0vc4Pj5eM9/kyZOFEEJ4eXlpPf/cuXMiLCxM89jCwkIoFAqtedzd3UV+fr746KOPtKYJIcS4ceO0/q7Cw8Mr/D1ISEh44PtmZmYmzp49q5UFgMjJyRGhoaGV/i6X/S7a2dmJgoICsXv3bq38wcHBQgghxo8fX+53avTo0Zpp5ubm4vr162Ljxo3SP6ccHPcPbhEi0oPg4GBcvHgRAODo6Kj5P++cnBxs3bpVp+vKz8/HSy+9VG562Ral+/3www8oKSkpN72goECzS6TM888/j9TUVPz000+aaSqVCgsWLMCGDRvg5+endbzT5s2bK1xnZQYOHFhu/pUrV5bbfVJQUKD5c8OGDdGgQQP88ccfMDExQefOnZGUlPTA9QwbNgx37tzBvn37tLacnTx5Ejk5OXjqqae0XmNlXn75ZWRnZ2tNy83N1fx5y5YtWLx4MYYPH67ZRebl5QUvLy98++23mvmKioo0fzYxMYGtrS3u3r2LCxcuoEuXLg/NUVX3v2+2trYwNTXFkSNH8MorrzzS8gYMGABLS0v873//09rt+MMPP+CLL77ACy+8gFWrVmmm5+TkaG0BLS4uRlRUFB5//PFHWj+RvrAIEelBVFSU1sHSP/30E06fPo1Fixbht99+e+BBxNWlVquxf//+Ks37z+NIyqSkpJTL5O7ujkuXLml96QFAfHy85udVWXZlIiMj8dFHH8HU1BQdOnTARx99hCZNmmgVBQBwc3PDp59+ikGDBpXbPVWVywy0bt0atra2le5idHBwqFLew4cPP/Bg6Vu3bmH//v0ICgrSFKHhw4ejuLgYW7Zs0cxXdrxScHAwPDw8YGZmprUMXXnhhRfw0Ucf4YknntA6nqqiIlwVZX/fFy5c0JpeXFyMv/76q9zvQ9kxaPe7fft2lY6FIqpNLEJEtUAIgfDwcLz99tto3bo14uLipOSo7EwwXVxzqLrLyMjI0BS4vXv34vz58/j9998xbdo0fPPNNwBKt5js27cPTZs2xdy5c3H+/Hnk5ubCxcUFq1evhonJw8/3MDExQXp6OkaNGlXhz6tyDFZVbdiwAatWrYK3tzeio6MRFBSE/fv3axWcGTNm4PPPP8eKFSvw8ccfIzMzEyUlJfjf//730NcjhIBCoSg33dTUVOtx7969sWPHDhw+fBjBwcFITU1FcXExJkyYUOn7oGuVXb6hovxEMrEIEdWSsv/zb9SoUaXz/HPri0xXr15Fp06doFAotHJ5enpqfq5LO3fuxMGDBzFjxgwsW7YMeXl56NixI9q2bYuxY8di7dq1mnkHDBhQ7vmVvXdXrlzBgAEDcOzYMa3dRfqwbds2FBYWYvjw4QCAtm3bYs6cOVrzDB06FAcOHCh37SdbW9uH7lq8fft2hbuW/rk1ZsiQISgoKMDAgQO1trBNmDCh3HOr+jtX9vfdtm1bra1/5ubm8PDwQFhYWJWWQ2RoePo8US0wMzPDM888g8LCQs2upYqUHXOiq9O6a2Lnzp1wdnbWfKkDpVse3nzzTeTk5ODQoUM6X+fcuXNhZ2eHyZMnA/h7q8I/tyJMmzat3HPL3rt/7i775ZdfYGZmho8//rjcc0xNTat8Fe+qyMrKwp49exAUFIQRI0agsLAQ27Zt05pHrVaXez1Dhw6Fq6vrQ5d/5coVeHp6ws7OTjOtU6dO6NWrV7l1CCG0thS5u7sjMDCw3DJzc3Or9PsWFhaGwsJCvPXWW1rTJ06cCFtbW63jxYjqEm4RItKD5557TrPlxMHBASNHjkSbNm0wZ86ccqe036/suKL//Oc/2LBhA4qLi/Hrr79WeuFDoLRkVba7Y+vWrQ987oN8//33eP3117Fq1Sp07doViYmJGDp0KHr37o1p06ZVeJXlmtq9ezdiYmLwr3/9C4sXL8b58+dx+fJlfP3113BxcUF2djaGDBmCJk2alHtu2Xu3YMEC7NmzB2q1Gj///DMOHz6M7777DjNmzMATTzyBvXv3ori4GK1bt8awYcMwbdo0bN68+aHZhg4dWuFr3rdvH27cuKF5/PPPP2P9+vUIDg7Gnj17yl0h/LfffsOsWbOwcuVK/PHHH+jYsSNGjRr1wNPWy6xcuRL/+te/sGfPHqxYsQIODg6YMmUKYmNjYWNjo5nv999/x/Tp07F79278+OOPcHBwQEhICC5fvgxvb+9y79uAAQPwzjvv4Pr160hISEBUVFS5dWdkZGDOnDn45JNPsHv3buzYsQNt27ZFcHAwoqKiHnhpCCJDJ/3UNQ6O+jIqOn0+Ly9PnDp1Srz++uvl5v/n6fMAxMyZM0VSUpJQqVQPPZX+QafP3//cslxdu3Ytt4zw8HARExNT4fLt7e3FihUrxI0bN0RBQYGIjo7WOp0b+Ps07+nTp1f5fUpISBC//vprhT8bO3as1mnjnp6eYu/evSI7O1vcuHFDLFu2THTs2LHcqeUmJibi22+/Fenp6UKtVpc7lX7SpEnixIkTIjc3V2RlZYno6Gjx3//+Vzg5OT0w64NOnxdCCD8/P635GzVqJHJzc4UQ2pceKBsWFhbiq6++EikpKSI3N1ccOXJEdO/evdyp8RWdPg9AjBw5Uly+fFkUFBSIU6dOiaeffrrC0+cnTJggLly4IPLz80VcXJwYN26c5rXcP1+bNm3EwYMHNZnLTqX/5+nzZSM4OFjExcWJwsJCkZqaKhYvXiwaN25cpd+pinJycMgeint/ICIiIjI6PEaIiIiIjBaLEBERERktFiEiIiIyWixCREREZLRYhIiIiMhosQgRERGR0WIRIiIiIqPFIkRERERGi0WIiIiIjBaLEBERERktFiEiIiIyWixCREREZLRYhIiIiMhosQgRERGR0WIRIiIiIqPFIkRERERGi0WIiIiIjBaLEBERERktFiEiIiIyWixCREREZLRYhIiIiMhosQgRERGR0WIRIiIiIqPFIkRERERGi0WIiIiIjBaLEBERERktFiEiIiIyWixCREREZLRYhIiIiMhosQgRERGR0WIRIiIiIqNlJjtAXdC8eXPk5OTIjkFERETVoFQqcf369QfOwyL0EM2bN0dKSorsGERERPQIXFxcHliGWIQqERwcjJCQEJiYlO49dHFx4VYhIiKiOkKpVCIlJeWh390KAKJ2ItVNSqUS2dnZsLGxYREiIiKqI6r6/c2DpYmIiMhosQgRERGR0WIRIiIiIqPFIkRERERGi0WoEsHBwYiNjUVUVJTsKERERKQnPGvsIXjWGBERUd3Ds8aIiIiIHoJFiIiIiIwWixAREREZLRYhIiIiMlosQkRERGS0WISIiIjIaLEISdKkuRMaO9pDYcK/AiIiIlnMZAcwVMHBwQgJCYGJnopKwPtvo6O/H9TFKtxJv4E7aem4nZqGO6npuJ2WjtvX03AnNQ23U9NRlJ+vlwxERETGjhdUfAh9XVDx1YVfwbN3D5iaPbyL5mVl43Zq2t9FKTW9tCSllf4552YGhOBfIxERUZmqfn+zCD2EPq8srTAxgY19MzRxcoKtsyOaNHdCE2cn2Do5oomzI2ydHdHQxuahy1EVFyMr/ca9gpSO22l/F6bb11NxJ+0GtyoREZFRYRHSEdm32LC0blhajpwd/y5M90pSE2cnNHawr9JWpdw7Wdol6XrZFqXSxzkZt7hViYiI6g0WIR2RXYQexsTUFDZ2zWDr7KRVkP4uT45oYKN86HJUxcW4k5b+9663+49ZSk3DnbR0FOUX1MIrIiIiqjkWIR0x9CJUFVaNrO/tbnO6ryg5wtaptDhVeavS7TvITE1DxtUk3LyahJuJV3EzMQk3Eq+iMDevFl4JERFR1bAI6Uh9KEIPY2JqCht7u3tblP4uSWXHLDVxdoJVI+sHLiM74xZuJl77e1y9hhuJ15CZfB1qlaqWXgkREVEpFiEdMYYiVBVWjaxh6+yEZi7OsHdvAbvH3ODwmDvs3d1gY29X6fPUKhUyk6/j5tXSLUelW5JKy1L2zYxafAVERGRMWIR0hEXo4awaWcOuhRscPFrA3r0F7B8r+68bLBs2rPR5Bbm5uHk1CRmJpVuPNLvbriZxVxsREdUIi5COsAjVjI2DPezd7209esxNU5Kaujg/8LikrBs3S4vR1Wu4mXBNs0UpM+U6SlTqWnwFRERUF7EI6QiLkH6YmpmhmZsL7N3dYH9vF5v9vS1KNnbNKn2euliFW8kpf+9iu3cs0s3Ea8jJuFWLr4CIiAwZi1AN3X+LDU9PTxahWmSlbAT7Fn8Xo7ItSnbubrBs2KDS5xXczS3dgnQ1CTcTrmq2ImVcTUZhHne1EREZExYhHeEWIcPS2NH+7+OQHmsBh/t2tZmYmlb6vJuJ15AUG49r5+KRHBuPlPMXeV0kIqJ6jEVIR1iE6gZTc3M0c22uVY7KypKyWdNy85eo1Ui7koDk2PO4di4OSefikXrpCtTFxRLSExGRrrEI6QiLUN1nbdsYru094dahHdy8POHm1R6NHe3LzacqKsL1i5eRdC6+tCDFxuPGX4koUfPgbCKiuoZFSEdYhOonG3u70lLUoT3cvNrBrUM7WNs2LjdfYV4+rp+/iGux8Ug6F4+k2HjcupbM+7IRERk4FiEdYREyHk1dnP8uRl6ecG3vWeEVtfOzc5AUdx7J9445SjoXjztp6RISExFRZViEdIRFyHgpFArYP9ZCs8XIrUM7uLRtA3Mry3Lz5tzKRJJmq9F5JMXG4e6t2xJSExERwCKkMyxCdD8TM1M4tXz83vFGpcO5dUuYmpe/OOTt1LTSUnRvl1py3HnkZ/N3iIioNrAI6QiLED2MmaUlmrdpqbVbzeHxx2BiYlJu3ptXk0q3HN3bepQSf4Gn8RMR6QGLkI6wCNGjsGzYEC7t28Kt7Gy1Du1g5+Zabr4StRrpfyVq7Va7fuEST+MnIqohFiEdYREiXWlgY3PvTLV2muOObB0dys2nKi5G6sXL9+1Wi0P6FZ7GT0RUHSxCOsIiRPqktGumdTB2C692sG5iW26+ovwCpJy/WFqM4kq3HmVcTeJp/ERElWAR0hEWIaptTZo7wa1De7TwagdXL0+4ebWr+DT+nLtIjjt/75ij80g6F4fb19MkJCYiMjwsQjrCIkSylZ3GX1aKWnRoDxfPik/jv5t5G0lx93ap3TtbLSfjloTURERysQjpCIsQGSITU1M4tvRAiw7t4Hpv11rz1q0qPI3/TvoNrWKUFHse+dnZElITEdUeFqH7bNmyBf369cP+/fsxbNiwaj2XRYjqCjMLCzi3aYUW9443cm3vCceWHhWexp9xLfnvM9XiziMl7gIK8/IkpCYi0g8Wofv4+flBqVRi3LhxLEJkVCwaNIBr+7Zw9fJEC692cOvQHnYtKjiNv6QEN/5KvHdV7HgknYvD9QuXoSoqkpCaiKjmqvr9XX47ej106NAh+Pn5yY5BVOuK8vPx18kz+OvkGc200tP428LNq/29U/k9YevkCKdWj8Op1ePoFvA8AEBdrELqpSuaYpQUex5pV/5CiYqn8RNR/SG9CPXp0wfvvfceunbtiubNmyMwMBDbt2/Xmic4OBjvvfcenJycEB0djTfffBMnTpyQlJiobsvPzsbFiBO4GPH3Z0jZrOm9K2P/fZ2jRk2blG5Nat8WvsMCAQDFBYWlp/HH/n3M0c3EazyNn4jqLOlFyNraGtHR0Vi5ciW2bt1a7udBQUGYP38+pkyZguPHj+Ptt9/Gnj170LZtW9y8eRMAcPr0aZiZlX8pzzzzDFJTU6uVx8LCApaWf5+No1Qqq/mKiOqenFuZiDt0FHGHjmqmNXF20mwxcvNqD1cvTzRQNsJjT3TEY0901MxXcDf33mn853HuwGEknjkr4yUQET0SgzpGSAhRbotQZGQkTpw4gTfffBNA6anESUlJWLhwIebOnVvlZfv5+WHq1KkPPUZo1qxZ+OSTT8pN5zFCZOwUCgXs3N00xcitQzu4eLaBRQMrrflSL11B5KZt+PPX3SjIuSspLREZu3pxjJC5uTm6du2KOXPmaKYJIRAWFgZfX1+9rHPOnDmYP3++5rFSqURKSope1kVUlwghcDPxGm4mXsOp3/cCKDuN/zG4ebVHyyc7o9PTT8G5dUsM/nA6Xng7BGf2hCHil624FhMnOT0RUcUMugjZ2dnBzMwM6enpWtPT09Ph6elZ5eXs27cP3t7esLa2RlJSEoYNG4bIyMgK5y0qKkIRz5QhqpIStRqpF68g9eIVRG39FVv/Ox9dX3wWvsMC4dy6JXwCX4RP4ItIOX8RERu34dTve1CYy9P0ichwGHQR0pWnn3662s8JDg5GSEhIhddgIaKKFeTcxbGfNuHYT5vwmHdH+AYNhvfA/nDxbIOhH7+Pl6ZPxamdexG5cRuS4y7IjktEZNjHCJmbmyMvLw9Dhw7VOm5o1apVsLW1RWBgoN4z8TpCRDXTwMYGTw56Dr7DAuH4+GOa6Umx8YjYuA2nd+5DUX6+vIBEVC9V9fvboDd3FBcX4+TJk/D399dMUygU8Pf3R0REhMRkRFRV+dnZOLLuZ3wZ8AoWj38Dp3buhaqoCG5e7RD0yYeYdeBXvDzzXTi3aSU7KhEZIem7xqytrdGq1d//AHp4eMDb2xuZmZlISkrC/PnzsXr1avz555+IiorC22+/DWtra4SGhkpMTUSPouzijttsG6NbwAvoMTQA9o+1QK8RQ9BrxBBcjT6HiE3bcGZ3GIoLCmXHJSIjIWQOPz8/UZHQ0FDNPCEhISIxMVEUFBSIyMhI4ePjo/dcwcHBIjY2VsTHxwshhFAqlVLfJw6O+jgUCoVo5dNVjPn6c/HlqSNiXkyEmBcTIT4/tlcE/vsd4djSQ3pGDg6OujmUSmWVvr8N6hghQ8RjhIhqR6NmTeAT+CJ6DA1AM1cXzfSEU9GI2LgN0fvCoSrkViIiqhredFVHWISIapdCoUDrHt3gGzQYXv16w/TeVePzsrJxYvvviNy0HTcSrkpOSUSGjkVIR1iEiOSxsbeDz+AX0X3IIDRt7qyZfvnEKURu3IazYQehLi6WmJCIDBWLUA3dfx0hT09PFiEiiRQmJmjbqzt8hwWifd9eMDE1BQDczbyNE9t+R8Sm7biVlCw5JREZEhYhHeEWISLDYuvoAJ+XX0L3IYNg6+igmX4x8gQiNm5D7IHDUKtUEhMSkSFgEdIRFiEiw2Riaop2fXzRY1ggPHv7aq4Cn51xC1Fbf8PxzduRmZIqOSURycIipCMsQkSGr0lzJ3QfMgjdB78EG3s7AEBJSQku/hGFiI3bEHf4KEpUaskpiag2sQjVEI8RIqp7TMxM4eXXG77DAtG2Vw/N9KwbNxG19TdEbtqOO2npD1gCEdUXLEI6wi1CRHVTM1cX9Bg6CN0CX4SyWVMApVuJzh+JQMTGbYg/8gdESYnklESkLyxCOsIiRFS3mZqZoYO/H3yHBqJ1jyc10++kpeP45h2I3PIrsm/clJiQiPSBRUhHWISI6g87dzf4Dg1Et4DnYd3EFgCgVqkQf/gYIjZuw4U/oriViKieYBHSERYhovrHzMICHQf0g++wQLR8srNmemZKKiI3b0fU1t+Qk3FLYkIiqikWoRriwdJExsHx8cfQY2ggngx4Dg1tbAAA6mIVzoUfRuSmbbgU+SeE4D+TRHUNi5COcIsQkXEws7SE9zP94TssEB6dO2mmZ1xLRuTm7Tix7XfczbwtMSERVQeLkI6wCBEZH6fWLeE7LBBdX3wWDZSNAACq4mLEhB1ExMZtuHLilOSERPQwLEI6wiJEZLwsGljhiYED0GNYINw7eWmm30i4ishN23Fi++/Iy8qWmJCIKsMipCMsQkQEAM3btobvsEB0eXEgrKytAQDFhYU4uy8cERu3IeFUtOSERHQ/FiEdYREiovtZNmyIzs8/jR7DAuHW3lMzPe3yX4jctB1//roL+dn8t4JINhYhHWERIqLKuLb3RM+gwXjiuadh2bABAKC4oBBn9oQhYuM2XI0+JzkhkfFiEaohnj5PRFVl1cgaXV4YCN9hgWjetrVm+vWLlxG5cRtO/rYbBXdzJSYkMj4sQjrCLUJEVB0tOnmVbiUaOADmVpYAgMK8fJzZtQ8RG7chKTZeckIi48AipCMsQkT0KBrYKNH1xWfhOywQTq0e10xPjruAiI1bcXrnPhTm5UlMSFS/sQjpCIsQEdWUR+dO8A0ajE5PPwVzy9KtRAW5uTj1+15EbtyGlPMXJSckqn9YhHSERYiIdKVhYxs8GfA8fIcGwsHDXTP9WkwcIn7ZijN7wlCUXyAxIVH9wSKkIyxCRKQPLZ/sDN+gweg4oB/MzM0BAPk5d3Hyt92I2LgNaZeuSE5IVLexCOkIixAR6VOjpk3QLeB59BgaCLsWrprpiWdi8McvWxG99wBUhYUSExLVTSxCOsIiRES1QaFQoFX3J+E7LBAdnuoLU3MzAEBeVjb+3LELERu34kbCVckpieoOFqEa4nWEiEgWZbOm8Bn8EroPGYRmrs0106+cPI3IjdsQvTcc6uJiiQmJDB+LkI5wixARyaIwMUEbXx/4DgtEe79eMDUr3UqUdiUBK6a+i8zk65ITEhkuFiEdYREiIkNg42CP7i+/hJ7DX4aNXTPk3MrEyrfex7WzsbKjERmkqn5/m9RiJiIiekTZN25i33cr8U3QeCTFnYeyWVMEr1iMTk8/JTsaUZ3GIkREVIdk38zAkvFvIDb8CMytLDFu/hfoN36U7FhEdRaLEBFRHVOUX4DQt/+Nw+t+BgC8NH0qhnz8PkxMTSUnI6p7WISIiOogUVKC7XP/h61z5qOkpAQ9gwbj1UVfwdK6oexoRHUKixARUR129MeNWDXtAxTm5aNdb19MXf0dbB0dZMciqjNYhIiI6rjYg0exZMIbyL6ZgeZtW+Ot9cvh4tlGdiyiOoFFiIioHkiOu4BvR05C6qUraOxoj5DVS9Guby/ZsYgMHosQEVE9cSctHYvGvo4LfxyHZcOGeHXBXPR6ZajsWEQGjUWIiKgeKbibi+Uh0xG5aTtMTE3x8ozpGPT+NChM+M89UUX4yahEcHAwYmNjERUVJTsKEVG1lKjU2Dj7v/j9f0sAAH5jRmD8N1/AooGV5GREhoe32HgI3mKDiOoy74H+eOU/H8Pc0hLXzsVh5dT3kHMrU3YsIr3jLTaIiAjRe/bju4lv4m7mbbTo0B5v/bgcji09ZMciMhgsQkRE9VxidAwWjJqMGwlX0bS5M95c+z1a9+gmOxaRQWARIiIyAreSU7Bg9Gu48udpNFA2wuQl8+ET+KLsWETSsQgRERmJ/OxsLHttGk7+thum5mYY/tlMPPfWFCgUCtnRiKRhESIiMiLq4mL8+OFs7F26AgAwYPI4jJo7G2YWFpKTEcnBIkREZIT2LFmOn2Z+BlVxMTo/9zSm/LAA1raNZcciqnUsQkRERurPHTvx/etvIy87Gx5dvPHmuh9g18JVdiyiWsUiRERkxK6cOIWFo1/DreQU2Lu74a31y+HRxVt2LKJawyJERGTkbiRcxYJRk3E1+hysbRtjyg8L0Pn5Z2THIqoVLEJERIS7mbexZOJURO89ADMLC4yeOxsDXhsvOxaR3rEIERERAEBVWIi1736E8JXrAADPvfk6hn82E6ZmZpKTEekPixAREWkIIfDbN4ux6dMvoVap4BP4IiYv/QZWykayoxHpRb0vQq6urggPD0dsbCyio6MxdOhQ2ZGIiAxexMatWDH1PRTk5qJ1jyfx5trv0dTFWXYsIp2r93efd3JygqOjI6Kjo+Ho6IiTJ0+iTZs2yMvLq9Lzefd5IjJmzm1aYdKSebB1dEDOrUysmPoeks7FyY5F9FC8+/w9aWlpiI6OBgCkp6cjIyMDTZs2lZyKiKhuSL14Gd+OnITkuAtQNmuK4JWL0aG/n+xYRDojvQj16dMHO3bsQEpKCoQQCAgIKDdPcHAwEhISkJ+fj8jISHTr9mh3Te7SpQtMTU2RnJxc09hEREYj+8ZNLB7/BuIOHYNFAyuM++YL+I19RXYsIp2QXoSsra0RHR2NkJCQCn8eFBSE+fPnY/bs2ejSpQuio6OxZ88e2Nvba+Y5ffo0YmJiyg1n57/3Zzdp0gRr1qzBa6+9pvfXRERU3xTl5yN02gc4+tMmmJiYYNB7b+Hlme/CxNRUdjSiGhOGMoQQIiAgQGtaZGSkWLhwoeaxQqEQycnJ4oMPPqjyci0sLMShQ4fE6NGjqzSvUqnUjObNmwshhFAqldLfHw4ODg5DGH3HjBBfRR8T82IixKQl84Rlw4bSM3Fw/HMolcoqfX9L3yL0IObm5ujatSvCwsI004QQCAsLg6+vb5WXs2rVKhw4cADr1q176LwffvghsrOzNSMlJeWRshMR1VeH127A6nc+RFF+Adr16YmQ1UvR2NH+4U8kMkAGXYTs7OxgZmaG9PR0renp6elwcnKq0jJ69eqF4cOHIzAwEKdPn8bp06fRoUOHSuefM2cObGxsNMPFxaVGr4GIqD46d+AwlkwIRnbGLbh4tsG09SvQvG1r2bGIqq3eXy702LFjMK3GPuyioiIUFRXpMRERUf2QFBuPBaMmYdLieXBq9ThCVi/F2vc+xvkjEbKjEVWZQW8RysjIgEqlgqOjo9Z0R0dHpKWl6XXdwcHBiI2NRVRUlF7XQ0RUl92+noaFY1/HxYgoWFlbY+LCr+AbNFh2LKIqM+giVFxcjJMnT8Lf318zTaFQwN/fHxER+v0/jiVLlsDLyws+Pj56XQ8RUV1XkHMXPwT/C8e3/AoTU1MM/fh9vDT9TSgUCtnRiB5K+q4xa2trtGrVSvPYw8MD3t7eyMzMRFJSEubPn4/Vq1fjzz//RFRUFN5++21YW1sjNDRUYmoiIrpfiUqNX2Z9gVtJKXh+2hT0Gz8STV2b48cPP0FxQaHseEQPJPX0Nj8/P1GR0NBQzTwhISEiMTFRFBQUiMjISOHj46P3XMHBwSI2NlbEx8fz9HkODg6OaozOzz0t5p48JObFRIi31i8XjZo1kZ6Jw/hGVU+fr/f3Gqsp3muMiKj6PDp3woRv58K6iS0yU1KxPPhfSP8rUXYsMiK81xgREUmTcPosFoyejJuJ19DUxRlvrv0erbs/KTsWUTksQkREpBcZ15KxYPRk/HXyDBrYKDF56TfoFviC7FhEWliEKsHT54mIai4vKxvLXpuGUzv3wtTcDCM++wjPTuU9H8lw8Bihh+AxQkREuvHs1Nfw9OsTAACnft+DDR//B+riYsmpqL7iMUJERGRQdi/6Hhs+/hzqYhW6vDAQU35YgIaNbWTHIiPHIkRERLXmxLbf8cMb7yA/OwePd30Cb637Ac3cXGXHIiPGIlQJHiNERKQfl47/iYVjXkNmSirsH2uBaet/gEfnTrJjkZHiMUIPwWOEiIj0o1GzJpi48Gu06NgeqqIi/DTzM5zZHSY7FtUTPEaIiIgM2t1bt7Hk1WCcDTsIMwsLjPnqM/hPGic7FhkZFiEiIpKmuKAQa6bPxMHVPwIAnp82BUGzZ8DEzFRyMjIWLEJERCSVKCnBr18vxObPv0KJWo3uL7+EyUu/gZWykexoZARYhCrBg6WJiGrXHz9vwco330dhXh7a9OiGN9csQxNnJ9mxqJ7jwdIPwYOliYhqV/O2rTFp8Tw0drRHdsYtrJz6HpJi42XHojqGB0sTEVGddP3CJXw7aiJSzl+EjV0zBIcuQYf+fWXHonqKRYiIiAxOVvpNLB73BuKP/AGLBlYY980c9B0zQnYsqodYhIiIyCAV5uVh5Zvv49iGzTAxMUHA+9MweMZ0mJjyjDLSHRYhIiIyWCVqNbb852vs+GoBSkpK0PuVoZjw7VxYNGggOxrVEyxCRERk8A6t+Qlrps9EcUEh2vv1QsiqpbCxt5Mdi+oBFqFK8PR5IiLDEhN2EEteDUbOrUy4tm+LaT8uh3ObVrJjUR3H0+cfgqfPExEZlqYuzpi4eB6cWnqgIDcXa6Z/hAvHImXHIgPD0+eJiKheykxJxaKxr+PS8T9hZW2NiYu+Qo9hgbJjUR3FIkRERHVOfnYOfpjyDqK2/QZTMzMM+78P8OK/pkKhUMiORnUMixAREdVJapUKP3/8H+xauAwA8NSEURjz9ecws7SUnIzqEhYhIiKq08K+X4X1/54FVVERvJ/pj+AVi9CoWRPZsaiOYBEiIqI679Tve7HstWnIvZMFd+8OeGvdcjh4uMuORXUAixAREdULf508gwWjJyPjWjKauTbHm+u+R8tuXWTHIgPHIlQJXkeIiKjuybiahAWjJiHh9Fk0tLHBa8v+hycHPS87FhkwXkfoIXgdISKiusfMwgIjPv8InZ97GgCwd+kK7FmyXHIqqk28jhARERktVVER1n8wC2HfrwIAPPPGRIycMwum5uZyg5HBYREiIqJ6SQiBXQuX4ef/+wJqlQpdX3wWr3//LRrY2MiORgaERYiIiOq1qK2/Ynnwv5Cfcxctn+yMt9Z9j2ZurrJjkYFgESIionrvYsQJLBr7OjKvp8LBwx1vrfsej3l3lB2LDACLEBERGYW0y39hwajJSIqNR6OmTTBlxUJ4D/SXHYskYxEiIiKjkZNxC0smBOPcgUMwt7TE2K8/R/+JY2THIolYhIiIyKgU5Rdg1TszcGjtBgDAC28HY9isf8PEzFRyMpKBRYiIiIyOKCnBji+/xZYv5qFErUaPoQGYtHgerBpZy45GtYxFiIiIjNaxnzYhdNq/UZiXj7Y9u2PqmmWwdXKUHYtqEYsQEREZtbhDR7F4/BRk3bgJ59YtMe3H5XBt31Z2LKolLEKV4L3GiIiMR0r8RSwYOQnXL16Gjb0dgkOXwqtfb9mxqBbwXmMPwXuNEREZD0vrhhj79X/g2bsHVMXF+O+LQbh9PU12LHoEvNcYERFRNRXm5mHFm+/i8olTMDM3R7/xo2RHIj1jESIiIrpPiUqNvUtXAAC6D34JjZo2kZyI9IlFiIiI6B+unDiFq2djYW5liT6jgmTHIT1iESIiIqrAgRVrAAC9RgyBpXVDyWlIX1iEiIiIKhAbfgRpl/9CAxsleg5/WXYc0hMWISIiogoIIXBg5ToAQN8xI2BmYSE5EekDixAREVElTu/ai8zrqbCxa4ZuAS/IjkN6wCJERERUiRKVGodW/wgAeOrVUTAx5Y1Z6xsWISIiogc4vuVX3M28jWauLvAe6C87DukYixAREdEDFBcU4sj6XwAA/SeOkZyGdI1FiIiI6CGObdiMgtxcNG/TCu369JQdh3SIRYiIiOgh8rNzEPHzVgCA/6SxktOQLtX7ItS4cWOcOHECp0+fRkxMDCZNmiQ7EhER1UGH1m6AqqgIHl284dG5k+w4pCM6L0JDhgzR9SJrJCcnB3379kXnzp3RvXt3zJgxA02bNpUdi4iI6picjFs4sX0nAKA/twrVG9UuQqampvDy8kLr1q21pg8aNAhnzpzB+vXrdRZOF0pKSpCfnw8AsLS0hEKhgEKhkJyKiIjqovCV61CiVqN9315wbtNKdhzSgWoVIS8vL1y+fBnR0dGIj4/H5s2b4eDggIMHD2LlypXYtWsXWrZsWa0Affr0wY4dO5CSkgIhBAICAsrNExwcjISEBOTn5yMyMhLdunWr1joaN26MM2fOIDk5GV999RVu3bpVrecTEREBwK3kFETv2Q8A8OcZZPWGqOr47bffxL59+8QLL7wg1q1bJ9RqtYiLixPTp08XVlZWVV7O/ePZZ58Vn332mQgMDBRCCBEQEKD186CgIFFQUCDGjx8v2rVrJ5YtWyYyMzOFvb29Zp7Tp0+LmJiYcsPZ2VlrWQ4ODuLo0aPCwcGhyvmUSqUQQgilUvlIr4+Dg4ODo34N5zatxLyYCPHVmaOimauL9DwcFY9qfH9XfaHp6enC29tbABA2NjZCrVaL0aNH6yx0RUUoMjJSLFy4UPNYoVCI5ORk8cEHHzzSOhYvXiyGDBlS6c8tLCyEUqnUjObNm7MIcXBwcHBojUlL5ol5MRFiyMfvS8/CUfGoahGq1q4xOzs7XL9+HQCQnZ2N3NxcREZGVmcR1WJubo6uXbsiLCxMM00IgbCwMPj6+lZpGQ4ODmjUqBEAwMbGBn379sWFCxcqnf/DDz9Edna2ZqSkpNTsRRARUb2zf/kaAIBP4AtQ2jWTnIZqolpFSAgBpVIJpVIJGxsbCCHQoEEDzbSyoSt2dnYwMzNDenq61vT09HQ4OTlVaRnu7u44cuQIzpw5gyNHjmDhwoU4d+5cpfPPmTMHNjY2muHi4lKj10BERPVPwqloJJyKhpmFBfzGjJAdh2rArDozKxQKXLx4Uevx6dOntR4LIWBmVq3F6tWJEyfQuXPnKs9fVFSEoqIiPSYiIqL6YP+KtZjUxRu+wwdj/4o1yM/OkR2JHkG1GstTTz2lrxwVysjIgEqlgqOjo9Z0R0dHpKWl6XXdwcHBCAkJgYlJvb/mJBERPYL4w8dw/eJlNG/TCj2Hv4z9P6yWHYkekfQDmspGZQdLL1iwQPNYoVCIpKSkRz5YurqDZ41xcHBwcFQ2Oj//jJgXEyFmH9opzK0spefh+Hvo5WDpYcOGwdzcXPPYxcVF6+KEDRo0wHvvvVedRcLa2hre3t7w9vYGAHh4eMDb2xtubm4AgPnz52Py5MkYO3YsPD09sXTpUlhbWyM0NLRa6yEiItK16D37cSs5BY2aNoHP4Jdkx6FHVOV2pVKptK7fk5WVJTw8PDSPHRwchEqlqlZj8/PzExUJDQ3VzBMSEiISExNFQUGBiIyMFD4+PnpvksHBwSI2NlbEx8dzixAHBwcHR6XDN2iwmBcTIWbu2SJMzEyl5+EoHXq5jpBardYqQtnZ2TUuQoY+uGuMg4ODg+NBw8zCQswK/03Mi4kQXV96TnoejtKhl11jREREpE1VVITDazcAAPpPHMP7WdYxLEJEREQ19MfPW5CfnQOnlh5o36+37DhUDdW+4M/AgQORlZUFADAxMYG/v7/mgoe2trY6DScTT58nIqKqKszNw7Gft2DA5HHwnzgWseFHZEeiKlKgdB9ZlajV6ofOY2gXVKwppVKJ7Oxs2NjYICeHF8siIqKKNWraBB/t2QpzK0sseTUEV06ckh3JqFX1+7tamztMTU0fOupTCSIiIqqqu5m3cXzrrwAA/0ljJaehqnqk/T5NmzbV/NnV1RWzZ8/G3Llz0bs394sSEZHxOrhqPdQqFdr27A7X9m1lx6EqqFYR6tChAxISEnDjxg3Ex8fD29sbJ06cwDvvvIPXX38d4eHhCAgI0FfWWhUcHIzY2FhERUXJjkJERHXE7etpOL1rHwCg/0RuFaorqnxO/s6dO8WOHTtEz549xdKlS0VSUpJYvny5UCgUQqFQiEWLFomIiAjp1w7Q5eB1hDg4ODg4qjMcW3qIeTER4qvoY8L+sRbS8xjr0MsFFW/evCk6duwoAAhra2uhVqtFly5dND9v27atuH37tvQXL+mN5ODg4ODgEADEhAVzxbyYCBH0yYfSsxjr0MsFFZs2baq563tubi5yc3Nx+/Ztzc9v374NpVJZnUUSERHVOwdWrAUAdB30HBo72ktOQw9S7YOlhRAPfExERGTsrkafw+UTp2Bmbg6/sa/IjkMPUO1z3VetWoXCwkIAgJWVFb777jvk5uYCACwtLXWbjoiIqI46sHwNWnXrgh5DAxD2/SrkZWXLjkQVqNYWodWrV+PGjRvIyspCVlYW1q1bh+vXr2se37hxA2vWrNFX1lrFs8aIiKgmLvxxHMlxF2DZsCF6vzJUdhyqRLWuLG2MeGVpIiJ6VN4D/TH268+ReycLnz8zGEX5+bIjGQ29XFmaiIiIqu7svnDcTLwGa9vG6DE0QHYcqgCLEBERkZ6IkhKEh64DAPiNewWm5uaSE9E/sQgRERHp0Z+/7kZW+k3YOjqg6wsDZcehf2ARIiIi0iN1cTEOrfkJAPDUq6OhMOFXryHh30YleNYYERHpSuSm7cjLyoaDhzs6+vvJjkP3YRGqxJIlS+Dl5QUfHx/ZUYiIqI4rzMvD0R83AgD6TxwjOQ3dj0WIiIioFhz9cSMK8/Lh5tUObXy7yY5D97AIERER1YLcO1k4vnkHAKD/xLGS01AZFiEiIqJacmj1j1AXq9C6+5No0bG97DgEFiEiIqJacyf9Bk7+vhsAtwoZChYhIiKiWhS+ch1KSkrQ0d8Pjo8/JjuO0WMRIiIiqkU3Eq7i3P5DAICnXuUZZLKxCFWC1xEiIiJ9ObBiLQCgy/PPoImzk+Q0xo1FqBK8jhAREelLUmw8LkaegKm5GfzGvSI7jlFjESIiIpLgwPI1AIDuLw+CdRNbuWGMGIsQERGRBJeO/4lrMXGwaGCFPqODZMcxWixCREREkuy/t1Wo14ghsLRuKDmNcWIRIiIikiQ2/DDS/0pEQxsb+A4bLDuOUWIRIiIikkQIgfCVpWeQ+Y0dATMLC8mJjA+LEBERkUSnft+L26lpsLG3w5MBz8uOY3RYhIiIiCRSq1Q4tPonAMBTE0bBxNRUciLjwiJEREQk2fEtO5B7+w7s3FzR6emnZMcxKixCREREkhXlF+Dw+l8AAP0n8rYbtYlFiIiIyAAc+2kTCnJz4eLZBp69e8iOYzRYhCrBe40REVFtys/OQeTG7QCA/pPGSk5jPBQAhOwQhkypVCI7Oxs2NjbIycmRHYeIiOoxG3s7zNy9GWYWFlg45nUknjkrO1KdVdXvb24RIiIiMhDZNzNwYsdOAIA/twrVChYhIiIiAxK+cj1K1Gq09+sF5zYtZcep91iEiIiIDMitpGSc3RcOAOj/Ks8g0zcWISIiIgNzYEXpbTeeeHYAmro2l5ymfmMRIiIiMjAp5y8i/mgETExN8dT4UbLj1GssQkRERAaobKtQt8AXoGzWVHKa+otFiIiIyAD99edpJJ6JgbmlJfqOGS47Tr3FIkRERGSg9i9fAwDoOXwIrJSNJKepn1iEiIiIDFT84WNIvXQFVo2s0TPoZdlx6iUWISIiIgMlhMCBlaXHCvUdMxxmlpaSE9U/LEJEREQG7MyuMNxKvg5ls6boPvhF2XHqHRYhIiIiA1aiVuPgqvUAgH7jR8HEzFRyovqFRYiIiMjARW37HTm3MtHUxRlPPDtAdpx6xWiKUIMGDZCYmIivvvpKdhQiIqJqURUW4vDanwGU3nZDoVBITlR/GE0RmjlzJiIjI2XHICIieiR//LwZ+Tl34dy6Jdr79ZIdp94wiiLUqlUreHp6YteuXbKjEBERPZKCu7n44+ctAID+k8ZKTlN/SC9Cffr0wY4dO5CSkgIhBAICAsrNExwcjISEBOTn5yMyMhLdunWr1jq+/vprfPjhh7qKTEREJMWRdT+juLAQj3l3xONPdpYdp16QXoSsra0RHR2NkJCQCn8eFBSE+fPnY/bs2ejSpQuio6OxZ88e2Nvba+Y5ffo0YmJiyg1nZ2cMGjQIFy9exKVLl6qUx8LCAkqlUmsQEREZgpxbmYja+hsAwH8itwrpijCUIYQQAQEBWtMiIyPFwoULNY8VCoVITk4WH3zwQZWW+cUXX4hr166JhIQEcfPmTXHnzh3x8ccfVzr/rFmzREWUSqX094eDg4ODg6Opi7P48vQRMS8mQri0ayM9j6EOpVJZpe9v6VuEHsTc3Bxdu3ZFWFiYZpoQAmFhYfD19a3SMmbMmIEWLVrAw8MD7777Ln744Qd89tlnlc4/Z84c2NjYaIaLi0uNXwcREZGuZKak4szu0u/F/q+OkZym7jPoImRnZwczMzOkp6drTU9PT4eTk5Ne1llUVIScnBytQUREZEgOrFwHAOj09FOwa+EqOU3dZtBFSNdWr16N9957r0rzBgcHIzY2FlFRUXpORUREVD1pl64g9uBRmJia4qkJo2XHqdMMughlZGRApVLB0dFRa7qjoyPS0tL0uu4lS5bAy8sLPj4+el0PERHRoziwfA0A4MmA52HjYP+QuakyBl2EiouLcfLkSfj7+2umKRQK+Pv7IyIiQmIyIiIiuRKjY3Dlz9MwMzeH35gRsuPUWdKLkLW1Nby9veHt7Q0A8PDwgLe3N9zc3AAA8+fPx+TJkzF27Fh4enpi6dKlsLa2RmhoqF5zcdcYEREZugMrSrcK+QYFooGNjeQ0dZfU09v8/PwqPF09NDRUM09ISIhITEwUBQUFIjIyUvj4+Bjc6XccHBwcHBwyxr9+WS3mxUSIp6e8Kj2LIY2qfn8r7v2BKqFUKpGdnQ0bGxueQUZERAbniYH+GPP158i9fQefDxyMovwC2ZEMQlW/v6XvGiMiIqJHdzbsIDKuJcO6iS26vzxIdpw6h0WoEjxGiIiI6oIStRrhoaXXFeo3fiRMzcwkJ6pbWIQqwdPniYiorjixfSeybtyErZMjurw4UHacOoVFiIiIqI5TFxfj8JoNAEpvu6FQKCQnqjtYhIiIiOqBiI3bkJedDQcPd3To31d2nDqDRYiIiKgeKMzLw7GfNgMA+k8aKzlN3cEiVAkeLE1ERHXNkfW/oCi/AC06tEfrHt1kx6kTWIQqwYOliYiorsm9fQfHt+wAAPSfOEZymrqBRYiIiKgeObjqR6iLVWjToxvcvNrJjmPwWISIiIjqkTtp6Ti1cw8AHitUFSxCRERE9cyBFWsBAJ0G9IODh7vkNIaNRagSPFiaiIjqqhsJVxGz/xAA4KlXR0tOY9h409WH4E1XiYioLnLr0B5v/7QC6mIVvnh+KO6kpcuOVKt401UiIiIjlnQuDpci/4SpuRn8xr0iO47BYhEiIiKqp/avWAMA6DEkANa2jSWnMUwsQkRERPXUpcgTSIqNh0UDK/QeFSQ7jkFiESIiIqrH9i8v3SrUe+RQWDZsKDmN4WERqgTPGiMiovrg3P5DuJFwFQ1tbOA7LFB2HIPDIlQJ3mKDiIjqAyEEwleuAwD0HTsCpubmkhMZFhYhIiKieu7kb7txJy0djR3s8eSg52THMSgsQkRERPWcWqXCwdU/AQCemjAaChN+/ZfhO0FERGQEjm/ejtw7WbB3d0Onp5+SHcdgsAgREREZgaL8Ahxd/wsAwH8ib8ZahkWIiIjISBz5cRMK8/Lg0q4N2vbqITuOQWARIiIiMhL52dmI2LgNAOA/iVuFABYhIiIio3JozQaoiovR8snOeMy7o+w40rEIVYIXVCQiovoo+8ZNnNyxCwDQf+IYyWnkUwAQskMYMqVSiezsbNjY2CAnJ0d2HCIiohqzc3fDBzs2wMTEBF8NHoW0y3/JjqRzVf3+5hYhIiIiI5NxNQln94UD4FYhFiEiIiIjdGBF6c1Yn3h2AJq6OEtOIw+LEBERkRFKib+IC8ciYWpmhn7jR8mOIw2LEBERkZHav7x0q5BP4Ito1KyJ5DRysAgREREZqSt/nkZidAzMrSzRZ9Rw2XGkYBEiIiIyYgdWrAUA9BoxBFaNrCWnqX0sQkREREYs7uBRpF3+Cw2UjdBz+Muy49Q6FiEiIiIjJoTQbBXqO2YEzCwtJSeqXSxCRERERu707n3ITEmFsllTdAt4XnacWsUiVAneYoOIiIxFiUqNg6t/BAA8NWEUTExNJSeqPSxClViyZAm8vLzg4+MjOwoREZHeRW39FTm3MtHM1QVPPOsvO06tYREiIiIiFBcU4si6XwAA/SeOhUKhkJyodrAIEREREQDg2M+bUXA3F86tW8KzT0/ZcWoFixAREREBAApy7uKPX7YAAPwnjZWcpnawCBEREZHG4TUbUFxYCI/OnfB41ydkx9E7FiEiIiLSyLmViRPbfgcA9J84RnIa/WMRIiIiIi0HV/2IErUa7fr0RPO2rWXH0SsWISIiItJyKzkFZ/bsB1D/twqxCBEREVE5B1asAQB4P9MfzdxcJafRHxYhIiIiKif14hXEHToGE1NTPDVhlOw4esMiRERERBUq2yrULeB52NjbSU6jHyxCREREVKGE02fx18kzMLOwQN8xI2TH0QsWISIiIqrU/ntbhXyDAtHARik5je6xCBEREVGlzh+JwPULl2BlbY1eI4bIjqNzRlGEEhISEB0djdOnT+PAgQOy4xAREdUpB1asBQD0GRUEcytLyWl0yyiKEAD07NkTnTt3Rv/+/WVHISIiqlOi9x5ARlIyGjVtgu4vD5IdR6eMpggRERHRoylRqxEeuh4A0G/8SJiYmUpOpDvSi1CfPn2wY8cOpKSkQAiBgICAcvMEBwcjISEB+fn5iIyMRLdu3aq1DiEEDh06hKioKIwcOVJX0YmIiIzGn9t3IvtmBpo4O6HL8wNlx9EZ6UXI2toa0dHRCAkJqfDnQUFBmD9/PmbPno0uXbogOjoae/bsgb29vWae06dPIyYmptxwdnYGAPTu3RtPPvkkBg0ahBkzZqBjx46V5rGwsIBSqdQaRERExk5VVITDazcAAJ56dTQUCoXkRLojDGUIIURAQIDWtMjISLFw4ULNY4VCIZKTk8UHH3zwSOv48ssvxbhx4yr9+axZs0RFlEql9PeHg4ODg4ND5rC0big+P7ZXzIuJEB36+0nP86ChVCqr9P0tfYvQg5ibm6Nr164ICwvTTBNCICwsDL6+vlVaRsOGDdGoUSMApVuf+vfvj9jY2ErnnzNnDmxsbDTDxcWlZi+CiIionijMzcOxDZsB1J+bsRp0EbKzs4OZmRnS09O1pqenp8PJyalKy3B0dMTRo0dx5swZREZGYs2aNfjzzz8rnb+oqAg5OTlag4iIiEodWf8LigsK4d7JC618usqOU2NmsgPoW0JCAp544olqPy84OBghISEwMTHorkhERFSr7mbexvEtO9B75DD4TxqLy1EnZUeqEYP+ls/IyIBKpYKjo6PWdEdHR6Slpel13UuWLIGXlxd8fHz0uh4iIqK65uCqH6FWqdDG1weu7T1lx6kRgy5CxcXFOHnyJPz9/TXTFAoF/P39ERERITEZERGR8bqdmobTO/cBqPvHCkkvQtbW1vD29oa3tzcAwMPDA97e3nBzcwMAzJ8/H5MnT8bYsWPh6emJpUuXwtraGqGhoTJjExERGbUDK0tvu9FxQD84eLhLTlMzUk9v8/Pzq/B09dDQUM08ISEhIjExURQUFIjIyEjh4+Oj91zBwcEiNjZWxMfH8/R5Dg4ODg6OCsaEb/8r5sVEiOGfzpSe5Z+jqqfPK+79gSqhVCqRnZ0NGxsbnkFGRER0nxadvDBt/XKoiosx57mhuJN+Q3Ykjap+f0vfNUZERER107WzsbgcdRJm5uboO+4V2XEeCYsQERERPbL9y9cAAHoMCYC1bWPJaaqPRagSwcHBiI2NRVRUlOwoREREButiRBSS4s7DsmED9B45THacamMRqgSvI0RERFQ1B1aUnkHWe+QwWDRoIDlN9bAIERERUY3EhB3EjYSraNjYBj2GBciOUy0sQkRERFQjoqQE4aHrAQD9xo6Eqbm55ERVxyJUCR4jREREVHUnf9uNO+k30NjRHl1ffFZ2nCpjEaoEjxEiIiKqOnVxMQ6t+QkA0P/V0VDUkZuW142UREREZPAiN25H7p0s2D/WAh0H9JMdp0pYhIiIiEgnivLzcfTHjQAA/4ljJaepGhYhIiIi0pmjP25EYV4+XNu3RRtfwz+8hEWoEjxYmoiIqPrysrIRuXk7AMB/kuFvFeJNVx+CN10lIiKqnsaO9pixazPMzM3x7ahJuHY2ttYz8KarREREJEVW+k2c/HU3AMPfKsQiRERERDoXHroOJSUl6PBUXzi29JAdp1IsQkRERKRzNxOvISbsIACg/6tj5IZ5ABYhIiIi0osDK9YAADo//zSaNHeSnKZiLEJERESkF8lxF3Dhj+MwNTNDv3EjZcepEItQJXj6PBERUc0dWLEWAND95UFo1LSJ5DTlsQhVgvcaIyIiqrnLUSdx9WwszK0s0WdUkOw45bAIERERkV6VHSvUa8QQWFo3lJxGG4sQERER6VVs+BGkXUlAAxslegYNlh1HC4sQERER6ZUQAuEr1wEA+o4ZATMLC8mJ/sYiRERERHp3auceZF5PhY29HboFvCA7jgaLEBEREeldiUqNQ6t/BAD0mzASJqamkhOVYhEiIiKiWnF8y6+4m3kbdm6u8H6mv+w4AFiEKsXrCBEREelWcUEhjqz/BQDQf6Jh3HaDRagSvI4QERGR7h3bsBkFublo3rY12vXpKTsOixARERHVnvzsHET8vBWAYWwVYhEiIiKiWnV43c9QFRXh8a5PwKNzJ6lZWISIiIioVmXfzMCJ7TsBAP0njZWahUWIiIiIal34ynUoUavRvm8vOLdpJS0HixARERHVulvJKYjesx85tzLRtLmTtBxm0tZMRERERm3bl/9Dwd08qAoLpWVgESIiIiIp7t66LTsCd40RERGR8WIRIiIiIqPFIkRERERGi0WoErzXGBERUf2nACBkhzBkSqUS2dnZsLGxQU5Ojuw4REREVAVV/f7mFiEiIiIyWixCREREZLRYhIiIiMhosQgRERGR0WIRIiIiIqPFIkRERERGi0WIiIiIjBaLEBERERkt3n2+ipRKpewIREREVEVV/d5mEXqIsjcyJSVFchIiIiKqLqVS+cArS/MWG1Vw4cIFPPnkk1WePyoqCj4+Pg+cR6lUIiUlBS4uLrx1xz1Ved9kqu18+lqfrpZbk+U8ynOr85yqzsvPYXmG/DmUkU0f6zSGz2BV59f3Z1CpVOL69esPnIdbhKpApVJV6y+opKSkyvPn5OTwH+B7qvO+yVDb+fS1Pl0ttybLeZTnVuc51V0+P4d/M+TPoYxs+linMXwGqzu/vj6DVVkmD5augsWLF+t1fipl6O9bbefT1/p0tdyaLOdRnlud5xj675IhM+T3TkY2fazTGD6Dj7oOGbhrTBLe1Z5IPn4OieQyhM8gtwhJUlhYiE8++QSFhYWyoxAZLX4OieQyhM8gtwgRERGR0eIWISIiIjJaLEJERERktFiEiIiIyGixCBkAIQQCAgJkxyAiAO7u7hBCwNvbW3YUIqPl5+cHIQQaN26s93WxCOlBcHAwEhISkJ+fj8jISHTr1q1azxdCaEZxcTGuXr2KefPmwcLCQk+JieqmPn36YMeOHUhJSan0fyhmz56N69evIy8vD/v27UOrVq2qtY6yYlQ2CgsLcenSJcycOVNXL4Oozvr3v/+NqKgoZGdnIz09HVu3bkWbNm205rG0tMSiRYuQkZGBnJwcbNq0CQ4ODtVaT1kxKht5eXk4d+4cJk+eXOPXwCKkY0FBQZg/fz5mz56NLl26IDo6Gnv27IG9vX21ljN+/Hg4OTnBw8MDwcHBGDNmDD766CM9pSaqm6ytrREdHY2QkJAKf/7+++/jrbfewpQpU9C9e3fk5uZiz549sLS0rPa6/P394eTkhNatW2PWrFmYOXMmXn311Zq+BKI6zc/PD4sXL0aPHj3w9NNPw9zcHHv37kXDhg0183zzzTd46aWXMGzYMPj5+aF58+bYsmXLI62vTZs2cHJyQvv27bFs2TIsXboU/fv3r/HrEBy6G5GRkWLhwoWaxwqFQiQnJ4sPPvhAABCtWrUShw4dEvn5+SI2NlYMGDBACCFEQECA5jn/fAxA/PDDD+K3336T/vo4OAx1VPS5uX79upg+fbrmsY2NjcjPzxfDhw/XTOvWrZs4deqUyM/PFydOnBCBgYFCCCG8vb0FAOHu7q71uGzs27dPLFq0SPrr5uAwpGFnZyeEEKJPnz4CKP3MFRYWiiFDhmjmadu2rRBCiO7du2umPffcc+LChQsiLy9PHDhwQIwbN04IIUTjxo0FAOHn56f1uGxcunRJvPvuuzXKzC1COmRubo6uXbsiLCxMM00IgbCwMPj6+kKhUGDLli0oKipC9+7dMWXKFMydO/ehy23dujX69++P48eP6zM+Ub3i4eEBZ2dnrc9jdnY2jh8/Dl9fXwClW5R+++03xMXFoWvXrvjkk0/w9ddfP3TZXbt2RdeuXfmZJPqHsmN6MjMzAZR+ViwsLLQ+hxcuXMDVq1c1n0NXV1ds2bIFv/76K5544gksX74c//3vfx+6roEDB6JFixY1/hzypqs6ZGdnBzMzM6Snp2tNT09Ph6enJwYMGABPT08MHDgQqampAIAZM2Zg9+7d5Zb1008/Qa1Ww8zMDFZWVvj1118xZ86cWnkdRPWBk5MTAFT4eSz72ciRI2FiYoKJEyeisLAQcXFxcHV1xXfffVdueX/88QdKSkpgYWEBCwsLLFu2DGvXrtX/CyGqIxQKBf73v//h6NGjiI2NBVD6OSwsLERWVpbWvPd/Dt944w1cuXIF7777LgDg4sWL6NixI/7973+XW0dycjKA0uOOTExM8H//9384cuRIjXKzCNWidu3aISkpSVOCACAiIqLCed955x2EhYXB1NQUrVq1wvz587F27Vq88sortRWXqN5r164dzp49q3V5/8o+k8OHD0d8fDzMzc3RoUMHLFy4ELdv38aHH35YW3GJDNrixYvRoUMH9O7du1rPa9euXbmtOpV9Dvv06YOcnBxYWlrCx8cHixYtQmZmZoX/81JVLEI6lJGRAZVKBUdHR63pjo6OSEtLq9ay0tLScOXKFQCl7VipVGLDhg346KOPNNOJqHJln7l/fv4cHR1x5syZai8vKSlJ89k7f/48WrZsic8++0z6fZKIDMHChQvx4osvom/fvkhJSdFMT0tLg6WlJRo3bqy1VehRvhcBICEhQbOcuLg4dO/eHTNnzqxREeIxQjpUXFyMkydPwt/fXzNNoVDA398fERERiI+Ph5ubm2ZzIAD06NGjSstWq9UAgAYNGug2NFE9lZCQgNTUVK3Po1KpRPfu3TX/txkfH49OnTppnUVWnc+kubk5L2tBRm/hwoUYPHgw+vfvj8TERK2fnTx5EkVFRVqfwzZt2sDd3V3rc+jj46P1vOp8DnXxvSj9KPP6NIKCgkR+fr4YO3as8PT0FN99953IzMwUDg4OQqFQiHPnzok9e/aITp06id69e4sTJ05UeNbYuHHjhKOjo3B2dhZ9+/YVZ8+eFefPnxempqbSXyMHh6EMa2tr4e3tLby9vYUQQrz99tvC29tbuLm5CQDi/fffF5mZmeKll14SHTp0EFu3bhVXrlwRlpaWmuffuHFDrFmzRrRr104899xz4uLFixWeNda/f3/h6OgoXFxcxLPPPiuSkpLE/v37pb8HHBwyx+LFi8Xt27dF3759haOjo2ZYWVlp5lmyZIlITEwU/fr1E126dBHHjh0Tx44d0/zczc1NFBQUiC+//FK0adNGvPLKK+L69esVnjXWunVr4ejoKFq0aCGGDh0qsrKyxIoVK2r6OuS/kfVthISEiMTERFFQUCAiIyOFj4+P5metW7cWhw8fFgUFBeL8+fPimWeeqbAIlVGr1SIlJUX89NNPwsPDQ/pr4+AwpFH2j+M/hYaGauaZPXu2SE1NFfn5+WLfvn2idevWWsvo3r27OH36tCgoKBCnTp0SgwcPrrAIlSkuLhbXrl0Ty5YtE3Z2dtLfAw4OmaMy48aN08xjaWkpFi1aJG7duiXu3r0rNm/eLBwdHbWW88ILL4iLFy+K/Px8cejQITF+/PgKi1CZoqIiceXKFfHll1+Khg0b1ug1KO79gYiIiMjo8BghIiIiMlosQkRERGS0WISIiIjIaLEIERERkdFiESIiIiKjxSJERERERotFiIiIiIwWixAREREZLRYhIiIiMlosQkRUb9jZ2WHJkiW4evUqCgoKkJqait27d6Nnz54ASm/EKoRA9+7dtZ73zTffIDw8XPN41qxZEEJACAGVSoVr165h2bJlaNKkSa2+HiLSPzPZAYiIdGXz5s2wsLDAuHHj8Ndff8HR0RH+/v5o1qyZZp78/HzMnTsX/fr1e+Cyzp07hwEDBsDU1BTt2rXDypUr0bhxY4wYMULPr4KIahOLEBHVC40bN0bfvn3h5+eHw4cPAwCuXbuGEydOaM33/fffY8qUKXjuueewa9euSpenUqmQnp4OALh+/To2btyICRMm6O8FEJEU3DVGRPXC3bt3kZOTg8DAQFhYWFQ6X0JCAr777jvMmTMHCoWiSst2d3fHwIEDUVRUpKu4RGQgWISIqF5Qq9UYP348xo0bhzt37uDo0aP4z3/+g44dO5ab9/PPP4eHhwdGjRpV6fI6duyInJwc5OXlITExER06dMDcuXP1+RKISAIWISKqN7Zs2YLmzZtj0KBB2L17N/r164dTp05h3LhxWvNlZGTg66+/xqeffgpzc/MKl3XhwgU88cQT6NatG/773/9i9+7dWLhwYW28DCKqRSxCRFSvFBYWIiwsDJ9//jl69eqFVatWYfbs2eXmmz9/Pho0aIDg4OAKl1NUVIQrV64gNjYWH374IdRqNWbNmqXv+ERUy1iEiKhei4uLg7W1dbnpubm5+OyzzzBz5kwolcqHLufzzz/Hu+++C2dnZ33EJCJJWISIqF5o2rQp9u/fj1GjRqFjx4547LHHMHToULz//vvYvn17hc/5/vvvkZWVhZEjRz50+ZGRkTh79ixmzJih6+hEJBGLEBHVC3fv3sXx48fxzjvv4PDhwzh37hw+++wz/PDDD5g6dWqFz1GpVPj444/RoEGDKq3jm2++waRJk+Dq6qrL6EQkkQKAkB2CiIiISAZuESIiIiKjxSJERERERotFiIiIiIwWixAREREZLRYhIiIiMlosQkRERGS0WISIiIjIaLEIERERkdFiESIiIiKjxSJERERERotFiIiIiIzW/wNut7fLSaIZnAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "operator.precoding.pop_precoder(0)\n", "\n", "result = simulation.run()\n", "\n", "_ = result.plot()\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.13 ('hermes')", "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.11.1" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "15324ae639e283979e39f32b76ef84dde816ef5cb4e81fc04e688fd3d2128060" } } }, "nbformat": 4, "nbformat_minor": 2 }