From f21b991458ece1ef9d3364aac32dad5b832f37eb Mon Sep 17 00:00:00 2001 From: i-a-morozov Date: Thu, 24 Oct 2024 12:48:39 +0700 Subject: [PATCH] 10_24_2024: added miltistart optimization example --- docs/source/examples/model-46.ipynb | 582 ++++++++++++++++++++++++++++ docs/source/index.rst | 1 + 2 files changed, 583 insertions(+) create mode 100644 docs/source/examples/model-46.ipynb diff --git a/docs/source/examples/model-46.ipynb b/docs/source/examples/model-46.ipynb new file mode 100644 index 0000000..0744422 --- /dev/null +++ b/docs/source/examples/model-46.ipynb @@ -0,0 +1,582 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "262a5ec8-2553-4237-ab62-319b6ca22089", + "metadata": {}, + "source": [ + "# Example-47: Optimize (Multistart)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "47c46731-4450-4bcf-8708-369a71baa0e7", + "metadata": {}, + "outputs": [], + "source": [ + "# In this example optics correction is performed using different initial conditions for quadrupole settings" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e6dfc013-e69e-427e-99d6-602c9eecbcba", + "metadata": {}, + "outputs": [], + "source": [ + "# Import\n", + "\n", + "import torch\n", + "from torch import Tensor\n", + "from torch.utils.data import TensorDataset\n", + "from torch.utils.data import DataLoader\n", + "\n", + "from pathlib import Path\n", + "\n", + "import matplotlib\n", + "from matplotlib import pyplot as plt\n", + "matplotlib.rcParams['text.usetex'] = True\n", + "\n", + "from model.library.line import Line\n", + "\n", + "from model.command.util import select\n", + "\n", + "from model.command.external import load_sdds\n", + "from model.command.external import load_lattice\n", + "\n", + "from model.command.build import build\n", + "\n", + "from model.command.wrapper import group\n", + "from model.command.wrapper import forward\n", + "from model.command.wrapper import inverse\n", + "from model.command.wrapper import normalize\n", + "from model.command.wrapper import Wrapper\n", + "\n", + "from model.command.tune import tune\n", + "from model.command.twiss import twiss\n", + "\n", + "from model.command.optimize import adam\n", + "from model.command.optimize import newton" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "fb0fe584-f17e-40a0-8ea1-266c2d563394", + "metadata": {}, + "outputs": [], + "source": [ + "# Load ELEGANT twiss\n", + "\n", + "path = Path('ic.twiss')\n", + "parameters, columns = load_sdds(path)\n", + "\n", + "nu_qx:Tensor = torch.tensor(parameters['nux'] % 1, dtype=torch.float64)\n", + "nu_qy:Tensor = torch.tensor(parameters['nuy'] % 1, dtype=torch.float64)\n", + "\n", + "# Set twiss parameters at BPMs\n", + "\n", + "kinds = select(columns, 'ElementType', keep=False)\n", + "\n", + "a_qx = select(columns, 'alphax', keep=False)\n", + "b_qx = select(columns, 'betax' , keep=False)\n", + "a_qy = select(columns, 'alphay', keep=False)\n", + "b_qy = select(columns, 'betay' , keep=False)\n", + "\n", + "a_qx:Tensor = torch.tensor([value for (key, value), kind in zip(a_qx.items(), kinds.values()) if kind == 'MONI'], dtype=torch.float64)\n", + "b_qx:Tensor = torch.tensor([value for (key, value), kind in zip(b_qx.items(), kinds.values()) if kind == 'MONI'], dtype=torch.float64)\n", + "a_qy:Tensor = torch.tensor([value for (key, value), kind in zip(a_qy.items(), kinds.values()) if kind == 'MONI'], dtype=torch.float64)\n", + "b_qy:Tensor = torch.tensor([value for (key, value), kind in zip(b_qy.items(), kinds.values()) if kind == 'MONI'], dtype=torch.float64)\n", + "\n", + "positions = select(columns, 's', keep=False).items()\n", + "positions = [value for (key, value), kind in zip(positions, kinds.values()) if kind == 'MONI']" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d323c9d0-b35d-4a5d-8e45-5d7b731ad093", + "metadata": {}, + "outputs": [], + "source": [ + "# Build and setup lattice\n", + "\n", + "# Load ELEGANT table\n", + "\n", + "path = Path('ic.lte')\n", + "data = load_lattice(path)\n", + "\n", + "# Build ELEGANT table\n", + "\n", + "ring:Line = build('RING', 'ELEGANT', data)\n", + "ring.flatten()\n", + "\n", + "# Merge drifts\n", + "\n", + "ring.merge()\n", + "\n", + "# Split BPMs\n", + "\n", + "ring.split((None, ['BPM'], None, None))\n", + "\n", + "# Roll lattice start\n", + "\n", + "ring.roll(1)\n", + "\n", + "# Set linear dipoles\n", + "\n", + "for element in ring:\n", + " if element.__class__.__name__ == 'Dipole':\n", + " element.linear = True\n", + "\n", + "# Split lattice into lines by BPMs\n", + "\n", + "ring.splice()\n", + "\n", + "# Set number of elements of different kinds\n", + "\n", + "nb = ring.describe['BPM']\n", + "nq = ring.describe['Quadrupole']\n", + "ns = ring.describe['Sextupole']" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f49b3093-d2dc-4991-96ec-bb9527720dc9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" + ] + } + ], + "source": [ + "# Compare tunes\n", + "\n", + "nuqx, nuqy = tune(ring, [], alignment=False, matched=True)\n", + "\n", + "print(torch.allclose(nu_qx, nuqx))\n", + "print(torch.allclose(nu_qy, nuqy))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "de96df0c-9210-403b-bfe1-79e9fd7e07e0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "# Compare twiss\n", + "\n", + "aqx, bqx, aqy, bqy = twiss(ring, [], alignment=False, matched=True, advance=True, full=False, convert=True).T\n", + "\n", + "print(torch.allclose(a_qx, aqx))\n", + "print(torch.allclose(b_qx, bqx))\n", + "print(torch.allclose(a_qy, aqy))\n", + "print(torch.allclose(b_qy, bqy))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "33914481-a4bd-4374-9592-8da58ac820ac", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Set lattice with focusing errors (no coupling)\n", + "\n", + "error:Line = ring.clone()\n", + "\n", + "nq = error.describe['Quadrupole']\n", + "\n", + "error_kn = 0.1*torch.randn(nq, dtype=torch.float64)\n", + "\n", + "index = 0\n", + "label = ''\n", + "\n", + "for line in error.sequence:\n", + " for element in line:\n", + " if element.__class__.__name__ == 'Quadrupole':\n", + " if label != element.name:\n", + " index +=1\n", + " label = element.name\n", + " element.kn = (element.kn + error_kn[index - 1]).item()\n", + "\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(16, 4))\n", + "ax.hist(error_kn.cpu().numpy(), bins=8, range=(-0.5, 0.5), color='blue', alpha=0.7)\n", + "plt.tight_layout() \n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "248934d7-ef50-46eb-a9ff-05366f2f3c32", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(1.5845, dtype=torch.float64)\n", + "tensor(0.9961, dtype=torch.float64)\n", + "tensor(0.6124, dtype=torch.float64)\n", + "tensor(0.3541, dtype=torch.float64)\n", + "\n" + ] + }, + { + "data": { + "image/png": "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8ceB++8HEhN7/vfNmwecdx5/1/PP9/zPFxEREZGzpqCGiIiIiIiIOJNhAG+/zeyMt98GYmKAL34RWLoUmDAheL83Pp4BEwAoLgYOHgze7xIRERGRblFQQ0RERERERJynqgr40Y+YoVFbC2RnA088ASxYACQkBP/3z5gBTJ8OtLTw94qIiIiIIyioISIiIiIiIs5hGOyZcffdbNgdGwvcdRf7W4wZE7rtcLmAb3yDv//994F//St0v1tEREREOqWghoiIiIiIiDjDsWPAww8Djz4K1NcDo0YxmHH33UBcXOi3Z9gw4NZb+fVvf8usDRERERGxlYIaIiIiIiIiYi/DAFauZPDigw8YwLjvPpZ9ysmxd9vuugtITwf27wdeftnebRERERERBTVERERERETERkeOAN/9LvDLXwINDcC4ccCTTwJf+pI92Rnt9erFPh4A8MwzQHW1rZsjIiIiEu0U1BAREREREZHQMwzglVeAe+4BysrY/Pvf/51lnoYPt3vr/F17LTB6NIMuTz5p99aIiIiIRDUFNURERERERCS0Dh4EvvUt4H//F2hsBCZNAp56CrjtNiDGgZepLhfwzW/y6zfeAD75xN7tEREREYliDhwtioiIiIiISETyeoHiYuDee4HNm4GkJAYLfv1rYOhQu7fu9CZMAGbPZobJb37Df0VEREQk5BxQoFREREREREQi3r59wOLFwNatvD9lCntpDB5s73Z1R0EB8N57/BvWrGGQQ0RERKQ7vF4u7qisBDIzmbHqxExVB1NQQ0RERERERIKntRVYtoxNtpubgZQU9s64/nqWdQon/foBX/4y+2r8/vfApZcCycl2b5WIiIiEi9JS4LHHgO3bAY8HSEwExo4FHnwQyMuze+vChkJAIiIiIiIiEhxuN3D//cDSpQxoXHQR8PTTwA03hF9AwzR/PrNLKiuBF16we2tEREQkXJSWAg88AGzcCPTpA2Rl8d9Nm/h4aandWxg2ghbUKC8vx9SpUzs87na7sXjxYixfvhyLFy9GTU1NsDZBRERERERE7NDSAvzxjyzX9MknQO/ewH/+J/DznwMDBti9decmIQH4+tf59bJlwKFD9m6PiIiIOJ/XywyNmhpgxAhmaNTUAL16AcOHA7W1wK9+xe+TMwpK+anly5cjOzsb5eXlHZ6bP38+ysrKADDAsWDBAhQXFwdjM0RE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Compute twiss and plot beta beating\n", + "\n", + "ax_model, bx_model, ay_model, by_model = twiss(ring, [], alignment=False, matched=True, advance=True, full=False, convert=True).T\n", + "ax_error, bx_error, ay_error, by_error = twiss(error, [], alignment=False, matched=True, advance=True, full=False, convert=True).T\n", + "\n", + "# Compare twiss\n", + "\n", + "print((ax_model - ax_error).norm())\n", + "print((bx_model - bx_error).norm())\n", + "print((ay_model - ay_error).norm())\n", + "print((by_model - by_error).norm())\n", + "print()\n", + "\n", + "# Plot beta beating\n", + "\n", + "plt.figure(figsize=(16, 2))\n", + "plt.plot(ring.locations().cpu().numpy(), 100*((bx_model - bx_error)/bx_model).cpu().numpy(), color='red', alpha=0.75, marker='o')\n", + "plt.plot(ring.locations().cpu().numpy(), 100*((by_model - by_error)/by_model).cpu().numpy(), color='blue', alpha=0.75, marker='o')\n", + "plt.xticks(ticks=positions, labels=['BPM05', 'BPM07', 'BPM08', 'BPM09', 'BPM10', 'BPM11', 'BPM12', 'BPM13', 'BPM14', 'BPM15', 'BPM16', 'BPM17', 'BPM01', 'BPM02', 'BPM03', 'BPM04'])\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b8350fa1-a7c8-47c6-a6d4-eca335e0c3ed", + "metadata": {}, + "outputs": [], + "source": [ + "# Batch objective\n", + "\n", + "# Set target twiss parameters\n", + "\n", + "twiss_error = twiss(error, [], alignment=False, matched=True, advance=True, full=False, convert=True)\n", + "\n", + "# Define rings (Twiss parameters will be computed at each ring start)\n", + "\n", + "rings:list[Line] = []\n", + "\n", + "for i, _ in enumerate(ring):\n", + " line = ring.clone()\n", + " line.roll(i)\n", + " rings.append(line)\n", + "\n", + "# Set batched function\n", + "\n", + "_, ((_, names, _), *_), _ = group(ring, 0, len(ring) - 1, ('kn', ['Quadrupole'], None, None))\n", + "\n", + "def evaluate(X, knobs):\n", + " kn = knobs\n", + " result = []\n", + " for x in X:\n", + " result.append(twiss(rings[x], [kn], ('kn', None, names, None), alignment=False, matched=True, convert=True))\n", + " return torch.stack(result)\n", + "\n", + "# Normalize objective\n", + "\n", + "evaluate = normalize(evaluate, [(None, None), (-0.25, 0.25)])\n", + "\n", + "# Set loss funtion\n", + "\n", + "lf = torch.nn.MSELoss()\n", + "\n", + "# Set features and labels \n", + "\n", + "X = torch.arange(len(ring))\n", + "y = twiss_error.clone()\n", + "\n", + "# Set dataset\n", + "\n", + "batch_size = 8\n", + "dataset = TensorDataset(X.clone(), y.clone())\n", + "dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=False)\n", + "\n", + "# Set batch objective\n", + "\n", + "def objective(knobs, X, y):\n", + " return lf(evaluate(X, knobs), y)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e2a4967e-0f18-4b9d-b857-a38aeeac5424", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(2.0008, dtype=torch.float64)\n", + "tensor(0.0355, dtype=torch.float64)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjUAAAC+CAYAAAB9JI0oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACNVElEQVR4nO3deXxU9bk/8M+ZmWSyryxhiUDYQZFVRYlWFsW9WlCrLUoV6LW1i7Zy7e69v5Yrt/a2tbUFtCBqK4a6gqIEF4JSi4RFEBAIOwmB7CSZ9ZzfH09OzpnMJCSQyZzJfN6v1zAzZxZO5syc8z3f5/t9HkXTNA1EREREREREREREREQWZ4v0ChAREREREREREREREbUHgxpERERERERERERERBQVGNQgIiIiIiIiIiIiIqKowKAGERERERERERERERFFBQY1iIiIiIiIiIiIiIgoKjCoQUREREREREREREREUYFBDSIiIiIiIiIiIiIiigoMahARERERERERERERUVRgUIOIiIiIiIiIiIiIiKKCI1xvXFxcjMLCQgDAli1bsGzZMmRkZAAASkpKsHr1auTl5aGkpATz589vfqwtqqri5MmTSE1NhaIo4Vp1IiIiIiIiIiIiIiLqQpqmoa6uDn379oXN1vp8jLAFNQoLC/HYY48BABYvXoxp06Zh69atAIDZs2c33y4pKcG8efNQUFBwzvc8efIkcnNzw7XKREREREREREREREQUQceOHUP//v1bfVzRNE3r7P+0uLgY06ZNQ1VVFQAJXAwePBgHDx4EEBjUAIDMzMzm57alpqYGGRkZOHbsGNLS0jp7tYmIiIiIiIiIiIiIKAJqa2uRm5uL6upqpKent/q8sMzUGD9+PJYtW9Z8v7q6GgCQlZWFV155BVlZWQHPz8rKQnFxMcaPH9/m++opp9LS0hjUICIiIiIiovOnqsDOnUBFBZCdDYwZA7SR5oCIiIiIusa5Sk+ELf3UrFmzmm+vWrUK06dPR0ZGRnOAo6XKysqgZW63G263u/l+bW1tp68nERERERERxZiiIuCpp4C9ewG3G3A6gREjgEcfBfLzI712RERERNSGsA9Dqa6uxurVq89ZMyNUsGPRokVIT09vvrCeBhEREREREV2QoiLg4YeB7duBtDQgN1eud+yQ5UVFkV5DIiIiImpD2IMaCxcuxPr165GRkQEAyMjICJqVUVlZ2fy42eOPP46amprmy7Fjx8K9ukRERERERNRdqarM0KiuBgYMALxewOcDkpPlfk0N8LvfyfOIiIiIyJLCGtRYvHgxFi5ciLy8PFRXV6O6uhrTp08P+dyJEycGLXM6nc31M1hHg4iIiIiIiC7Izp2SciotDdi/Hzh8WK5VFVAUoGdPYM8eeR4RERERWVLYghqrV6/G+PHjmwMar7zyCjIyMpCXlxfwvJKSEkycODHkTA0iIiIiIiKiTlNeLoXBjx4FGhtlmc8HlJXJ7YQEwOOR5xARERGRJYWlUHhJSQlmz54dsCwjIwPz588HABQUFGDhwoWYNGkStmzZcs56G0REREREREQX5MsvgWeeAerrAYcDyMoC0tMlwHH6NJCdLQGO+Hi5TURERESWpGiapkV6JdqrtrYW6enpqKmpYSoqIiIiIiIiOjePB3j+eeDllwG/H9i3D9A0YMQISTlVUgLU1gKpqYDdDowdC/zzn4At7CUoiYiIiMikvf3/bKURERERERFR97R7NzBvHvD3v0vdjKlTgeeeA3JygCNHZNZGTo48Vl4OxMUBjzzCgAYRERGRhYUl/RQRERERERFRxLjdErxYvVpmZWRmAj/8IZCfL4+npgJPPSVFwz0eIDFRAhqDBgGTJ0d23YmIiIioTQxqEBERERERUfexYweweDFw8qTcv+464LvflUCGLj8fuOoqYOdOKQqelCSvqa6W1FN33RWRVSciIiKic2NQg4iIiIiIiKJfYyOwdCnw+utyv0cP4Ec/Ai6/PPTzbTapn6GbP18CGytXAjNmSCFxIiIiIrIcJgolIiIiIiKi6LZ1KzB3rhHQuPlmYMWK1gMaocycKcXDGxqAZ58Nx1oSERERUSdgUIOIiIiIiIiiU3098NvfyoyMU6eA3r3l/qOPAsnJHXsvRQEeflhuv/OO1NsgIiIiIsthUIOIiIiIiIiiz6efAvffD6xdK/e/+lVg+XJgwoTzf89Ro6QGBwD88Y9SZJyIiIiILIU1NYiIiIiIiCh61NUBf/oT8N57cr9vX2DhQmDMmM55//nzgaIiYM8eYP16I8hBRERERJbAmRpEREREREQUHTZtktkZ770n6aJmzwb+9rfOC2gAQHY28M1vyu0lS6TGBhERERFZBoMaREREREREZG3V1cB//Rfw858DlZXARRcBTz8NPPQQ4HR2/v83axbQr5/8Xy++2PnvT0RERETnjUENIiIiIiIisiZNAz74QGZnfPABYLMB99wDLFsGjB4dvv83Lk4CJgBQUACcOBG+/4uIiIiIOoRBDSIiIiIiIrKeykrgl7+UGRo1NUBeHvDMM8C8eUB8fPj//8mTgUmTAJ9P/l8iIiIisgQGNYiIiIiIiMg6NE1qZtx/vxTsttuB++6T+hbDh3fdeigK8N3vyv//ySfAv//ddf83EREREbWKQQ0iIiIiIiKyhtOngccfBxYtAurqgKFDJZhx//2Aw9H163PRRcAdd8jtP/1JZm0QERERUUQxqEFERERERESRpWnA2rUSvPj0UwlgPPigpH0aPDiy63bffUBGBnDsGPDaa5FdFyIiIiJiUIOIiIiIiIgiqKwM+PGPgd/+FmhoAEaOBJ59Frj33sjMzmgpOVnqeADAihVAVVVEV4eIiIgo1jGoQURERERERF1P04DXXwfmzgW2bpXi3//xH5LmacCASK9doBtuAIYNk6DLs89Gem2IiIiIYhqDGkRERERERNS1TpwAfvAD4A9/AFwuYMwY4LnngDvvBGwWPE1VFOB735Pb77wDfPllZNeHiIiIKIZZsLVIRERERERE3ZKqAgUFwAMPADt3AgkJEiz4/e+B/v0jvXZtGz0amD5dZpj88Y9yTURERERdzgIJSomIiIiIiKjbO3oUWLwY2L1b7o8bJ7U0+vSJ7Hp1xIIFwKZN8jds2CBBDiIiIqKOUFUZ3FFRAWRny4xVK85UtTAGNYiIiIiIiCh8/H5g1Sopsu31AklJUjvjppskrVM06dED+MY3pK7GX/8KXHUVkJgY6bUiIiKiaFFUBDz1FLB3L+B2A04nMGIE8OijQH5+pNcuajAEREREREREROFRUgI89BCwbJkENC67DFi+HLj55ugLaOhmz5bZJRUVwEsvRXptiIiIKFoUFQEPPwxs3w6kpQG5uXK9Y4csLyqK9BpGjbAFNYqLizFhwoSg5SUlJVi8eDFWr16NxYsXo7q6OlyrQERERERERJHg8wErV0q6pi+/BFJSgP/8T+B//gfo1SvSa3dh4uOB73xHbq9aBZw8Gdn1ISIiIutTVZmhUV0NDBwoMzSqq4HkZGDAAKCmBvjd7+R5dE5hST+1evVq5OXlobi4OOix2bNnY+vWrQAkwDFv3jwUFBSEYzWIiIiIiIioq+3fL8GLkhK5f+WVwCOPSM7o7uLKK4GJE4HPPgOeeQb4f/8v0mtEREREVrZzp6Sc6tEDOHUKKC+XAEZCggQ2evYE9uyR540dG+m1tbywBDVmzZoVcnmJ3qhtkpeXh8LCwnCsAhEREREREXUlrxd4/nngH/+Qk/S0NOB73wOmTo3eVFOtURTgu98FvvUt4OOPJbgxcWKk14qIiIisqqwMqKwEzpyRemNAYF2uhAR5rKIiMusXZbq0pkZhYSGysrIClmVlZYWc0UFERERERERRYs8eYN48qTGhqsBXviIBjmnTul9AQzdgAHD77XL7T3+SlFtEREREZn4/8Pbbklrq7FnA45HUUwMHAsOHyywNAHC5JMVld5rZGkZhmanRmtbqZ1RWVoZc7na74Xa7m+/X1taGY7WIiIiIiLovVZVp7BUVcpI0Zgxg69KxTdSdud3A3/4GFBQAmgZkZAA//CFw9dWRXrOucf/9QGEhcOQI8MYbwNe+Fuk1IiIiIivQNOCjj6SddOyY3M/MlEEQw4cHtsc1DTh9WtJOjRkTsVWOJl0a1GhNa8GORYsW4YknnujalSEiIiIi6i6KiqQg4d690vnsdAIjRgCPPgrk50d67Sja7dwJ/O//AsePy/3p04GHH5a0U7EiJQV48EH5nS1fLjNTMjIivVZEREQUKZomaSmXLZM6Y4C0jb7xDRlg9MgjwNGjUkMjIUFmaJw+DaSny2McfNQuXRrUyMjICJqVUVlZiYxWGn2PP/44Hnnkkeb7tbW1yM3NDecqRh+OvCMiIiKiUIqKpIO5uhro1cs4adqxQ5Y//TQDG3R+GhuBZ58FXntNTtz1E/Qrr4z0mkXGjTcCb74pHRfPPSdBQyIiIoo9u3dLMGPHDrmfmAjceadckpJk2dNPG4OOzpyRlFNjx0pbim3zdlM0TdPC9uaKAvPbl5SUYPbs2di6dWvzsszMTBw6dKjVwIZZbW0t0tPTUVNTg7RYGv3TGo68IyIiIqJQVBW44w5g+3bJ1+v1Skd0SooMgDlyRE6e/vlPDoihjtm2TWZnlJbK/RtuAB56SL5bsWznTuD735f6IUuWAEOHRnqNiIiIqKuUlMjAhk8+kfsOh9Tduuee0DM4OUi9Ve3t/w/7TI3q6urmgEVeXl7AYyUlJZg4cWK7AhrUAkfeEREREVFrdu6UgS/Z2cCJEzIKDJAO14wMGSn2xRfyvLFjI7mmFC0aGoC//AVYs0bu9+oF/PjHwMSJkV0vqxgzRlJPbdgA/PGPcumuBdKJiIhIlJZKzYwNG2T2qqLIgI/77pO2UmtsNrbBL1BYghqFhYVYv349AKmLMWnSJMyaNQsAUFBQgIULF2LSpEnYsmULCgoKwrEK3ZuqygyN6moZeefxyI8mOVlOUI8cAX73O+CqqxjlIyIiIopFJ0/KyK/ycjnBAoC4OJmxUVUFVFbK7RdeAHr0APr3j+z6krX9+9/Ab38r+Z4B4LbbgPnzjTQKJBYsADZtAnbtAt5/X4IcRERE1P1UVEg7es0awO+XZV/5CvCtbwEsndAlwpp+qrMx/VST7duBu++WIjPJyTIKz+MBUlNl5J3dDtTXAy+/zKgfERERUSzx+YC1a4Hf/x749FOZ+p6SAvTtK23FhgYJaJw+Le3HUaNk+cUXAzNnAtdey45qMtTVAc88A6xbJ/f79JHZGePGRXa9rOyFF2TEZo8ecjshIdJrRERERJ2lrk76W//5TykFAMis1XnzgGHDIrtu3YRl0k9RGFRUyA8nIUGigX6/zN6oqZGLpsnlzTclOpidHek1JiIiIqJw0jTgo4+kePOJE0bxZq9XTrD0NDhJSVKw0OuVduKVVwJbtsjI8l27JIXp1VdLgGPcOKbPiWWffCKzvysq5Htwxx3Agw+yk/5c7rwTePttoKwM+PvfZcQmERERRTeXSwIZL78MnD0ry0aNkmAGB5RHBGdqRKOWMzUAGXWnBzXq62WUnj7ybtQoYMoUqbHB1AJERERE3cu2bVKYeN8+uZ+RAdx/P5CeDvzgB9I+7NnTqMF2+rQ8ptdgq6gA1q+X0fhHjhjv26sXcP31cunXLwJ/GEVETY18NzZskPv9+wMLF8psHmqfoiLgF7+QlG/PPy8zXIiIiCj6+HySYmrlSknhCgCDBslAj8mTOQAoDNrb/8+gRjRSVRkptWMH1IsGYmf9YFT40pHtqMGY5IOwlRwAcnKAyy6TApBmAwYYAQ7zqD0iIrIWVZUCvhUVMtp6zBjWSSKiQAcPAkuXSr0DQGZg3HWXjBRPTJRlRUVSi01PVxofD4wcCTzyiLQHzTRNAiPr1kmHtj4KDQAuuUSKHl5zDdNTdWcffgj84Q9Su09R5Pt0//2A0xnhFYsymgY8+qgEHPPzgf/6r0ivEREREXWEqgKFhcCKFVIMHJBBCnPnSs0snpuHDYMa3V1REYrm/g1Pnbwbe7XhcGvxcCoejFD24dG+LyN/+beMkXcffywntNu2GcVrABmxpwc4xoyRWhxERBR55k5It1s6k0aMkA6Slp2QRBR7ysokZ39hoXSe2u3ArbcC3/wmkJkZ/PzzCZJ6PNKGXLdO0lPppwxOpwQ2Zs6UqfYcINM9VFVJHZaNG+X+wIEyO2PEiEiuVXQ7dEhGcaqqHNPHj4/0GhEREdG5aJqk4HzuOTmWA0BWFjBnDnDTTVKvjsKKQY1urqgIeHjuWVSfrEcv9RQS0AgXEnHa3hvpfZLx9PKU4H6vs2elYGRRkVy7XMZjqamSU3nKFGDSJI7GIiKKlKIi4OGHZZRsr16tp4shothTUwO8+CLw+usyFR4Apk6VnP3hTA915gzw3nsS4Dh2zFjeu7ekppo5k+l1opWmSXDs6ael8KXNBtx7rwTI4uIivXbR749/BF57TYJEzz7LQWRERERWtm2bHK/1rDcpKcDXvy7ZclhTrMswqNGN6dmntm8HBg7UUHuqEXGaF0mpNmjJKThyRMHYsVK/ptVBeG43UFwsnWeffCInyTqnU1JXTZki+eFSU7vgryIiohY7+MAR0Jomue7PuYMnom5HL0z4979LHTVARn0vWCDpRLuKpgF79khw4/33pY6bbswYCW4wPVX0OHNGCoFv3iz3hwwBHnsMGDo0suvVndTVAd/4BlBbKwMW7rgj0mtERERELe3bJ8GMzz6T+04nMGuWpOFkn2iXY1CjG2tZJ3z3bsDrld9cVpYEDxsagJdflr6vc/L7gV27JMCxaRNw6pTxmM0mb5KfL0GOHj3C80cREZF0LN19t+x7fT7ZmcfFyY5dHxni8QCrVsmsOooYljyhLuH3A++8I7l8Kypk2ZAhEsyYMCGyqZ/cbklP9c47wNatRnqqhAQjPdWllzI9lRVpmgSm/vxnCUw5HJJS4etfZ0qFcHjzTeD//k9Ge774osy6JCIiosg7elTSTOnpNx0O4OabZcZqVlZk1y2GMajRjW3YIOlZc3Pl/vHjkqVE35L69U9/Cnzvex3MJKVpwIEDEtzYtAkoKQl8fMQIow7HRRdd6J9CRBTbysuBzz+Xy65dMjJk3z7ZcYfqCNQ06UgcPlyK9g4cCAwYAAwaJLdzc6UIMIUVS55Q2GmatMOWLTPSPeXkSANw6lTrBQpOnzbSUx0/bizPyZH0VNdfz/RUVnHqFPDb3xojEUeMkNkZgwZFdr26M1UF5s8HDh6U2jc//GGk14iIiCi2lZfLoKF166TdrSjAjBnA/fezzWoBDGp0Yy1nagDSVq6qAiorZXazzweMGiXnktdeK4PlRo06j3PgEyfkpLqoSHLKmb8uubnSe5OfLx1sVjvBJiKyEk2TQmN6EOPzz6UxZVZXB3z5pezgs7IkhYvfDzQ2SvqZujoZVTtiROhpsIoiefUHDjQugwbJ/pq50TsFS55Q2O3cCSxZYuTyTU+XUfS33GL937GmyXrr6an0VFmAzPydORO4+mogMTFiqxizNE1mDCxZIseUuDipxTJ7Nus8dIWdO4Hvf1+O08uWAYMHR3qNiIiIYk91NfDSS4H16a66CnjgAQ7wsBAGNboxPeX6jh0yQLdlyvWDB4GePSU7wenTxmP9+8u55IwZ0hHTYZWVUn+jqEjqceg7AEDSUl11lfTkXHopp64TEbndMuvCPBPDnH8ekHxFQ4bIrItLLpHo87x5re/g9ZoaS5fK6O3DhyVQcviwXM6eDb0uNltwsEOf2WH1TlILMZc8GTDA2JypqSx5Qp3g0CHp7NTrGzidksf3rruis0aF2y0DY9atC05P9ZWvADfcIPs9DooJv5Mngf/9X9l5AcDo0cDChca0b+oaTzwBfPih5Cv8/e/53Sci6mRMD0utamiQFM4FBTK4A5ATt3nz5BycLIVBjW5OHylaUyMBjFAjRadMkXOXdeuAjz6Sc0tA2s/jx0uAIz+/g+mpdA0NwL/+JSvy6afGTgGQ3p3Jk2UFJk0y8sATEXVnNTUSuNADGPv2BQZ/Adkfjh5tBDFGjgwesdyeHXyoqQCaJsFnPcBhDni0DKbobDaJeJtTWOnBDgang/zrX8Cdd8oJU2OjXAMSF8rOlk3V2NiBmlZEgMzYWr4cePdd+R3bbJLLd84c+WJ1B+XlRnqqEyeM5X36SIP0uutkejF1LlUFXntNgmV6rrx584Dbb2cvTySUl8vv2u0GfvlLCe4REVGnYHpYCsntBt54Q2Zn1NbKsmHDpD0U6fp01CoGNWKAeaft8Uga9ZEjgUceCd5pNzRI3Zt162QAsC4pSdJTXX89cPHF5/l79nhk5samTVIwsrraeMzpBCZOlBWaPFlSqhARRTtNA0pLA1NJHT0a/LysLBkidPHFEsQYPLh9aT46soNvz7pWVAQGO/SAhzk1jJke7DCnsBo4UJbFWLCjrk4GzuvH0N27jZIncXHSZ+j3y3P1FtWvfgV897sx91FRR9XVyQnWq68CXq8su+YaqZvRv39k1y1cNE1+ROvWAR98ELgPGjfOSE/FATEX7tgx4Mkn5fMGJNL64x8DfftGdLVi3vPPSw7vXr2AlSvPc3QZERGZMT0sBfH7gXfekePumTOyLDdX0kxdfTWDGRbHoEaMOJ/pdaWlMhjw3XeBsjJjeb9+Ety47jqgd+8LWKFdu4xC46WlxmM2m6SmmjJFLueVA4uIKAL8fuDAgcAgRlVV8PMGDDBmYVxyiYw8Pt8GU7jnT2uaNPCOHAlMYXX4cOvBDrs9MNihBzz69etWPfgVFcZhbNs2I2ihlzzJypJDWHKyfIzV1fKamhqjptVFF0n/7E03ycdD1MztltHzL71kpIy79FJgwQIJXsYKt9uIFm7bZkQFExNlBPvMmUxPdT78fkmtsHy5BMUTE4Fvf1tqsvCzjDy3W2Zr6LM25s6N9BoREUU1c3rYgQNbz97L9LAxQtMk1ePf/gYcPy7LevWSAuDXXcc6YlGCQQ06J02T/rJ16+Q373IZj3XKYDlNA0pKJGy+aZMU+zAbNswoNH7RRTzRigVMcknRoqEB2LPHCGB88UXgThKQTvzhw40AxsUXd4/ZaHqwo2UKqyNHzh3sMKewGjgwqoIdpaVyuNq4UTa3uXWUlyeHqilTgB/9qO2aVj16yJ9unrQ4bpwEN/LzZdINxSi/X1Iw/e1vxoixvDxg/nzgsstiux106pSRnurkSWN5377SIL3+eg6GaY/Dh2V2xt69cn/iRNlpnfdoJQqLjz6SKX3x8TJbg9uHiOi8bd8O3H23xPB9Phlk5PXKqUlKimThra1lethuT9OAf/8beO45YP9+WZaeDnzjG8Ctt/IkLMowqEEd0tgonTn6YDldpw6WKy2V4EZRkczmMH/1+veX3qL8fBmlGMsn9t0Vk1ySlVVUBM7COHAgcB8FSKvYXA9j+PDYShuhaTKHu2UKqyNHAusqmTkcxswOPeAxYIAlgh36yK2NG2X3dOBA4OMjR0pgf8qUwExA7Sl5MnmypKxau1ba1vpXKTVV+mZvvlk+BooRmiZfiKVL5UsHSAf9Aw8A06czuG+mabIP1kfc6PsWRQkccRNL+9728PmAf/xDOsh9PplG9p3vyOfFNrX1aJqkk9y+XVLO/epXkV4jigIcG0YUyO+XDIvLlwPPPitjrFoe8nJzgYwMGbC/bBkwbVpEVpXCbdcu2cA7d8r9pCTgrruAWbPkNkUdBjXovJWVGYPlzNmjOrWWY3W11N8oKgK2bg0sppudDVx1lXR0jx0b8Y4v6gRMcklWomlS/8IcxDDv7HS9ewemkmo5n5mEHuxomcLq8OHg2S06h0POMswprPRgRxinBGua1G/XZ2ToM5IB2bRjxxozMnr2bP19OlLypLwcePttuZw+bSwfPVqCG9dey/7Zbm3XLmDJErkGJLL1zW8Ct93GEWPn4nIFpqfS6QXhZs6UH1Ks75cPHJDZGXpkdvJk2Rn16BHZ9aK2lZRI/RxNA373OwnaEbWCY8OIRF2dDBjavFmu6+rk8sUXcnqRni4T5xsajFnTqakyWHfVKs7U6HYOHpSI1r/+Jffj4oDbbwfuuUe+DBS1GNSgC9baYDlADgb6YLnExAv8jxoa5IhUVCQ7I3N6k+RkOTmbMkVSM1zwf0ZdjkkuKdK8XimEYA5i1NUFPkdRpIi3OZVUW73adG6aJj365hRW+sXtDv0ah0PSEZpTWA0cKClozjPYoaqyyTdulMmC5eWB/92kSdIhcOWVHWv7dnTEpKrKoW7NGjkRU1VZnpQEzJgh6amGDj2vP5Gs6MgRGTH28cdyPz5eRot9/esy64s6prURN/36GSNuYi09ldcLvPii1Gbx+6XX5nvfk2GosR7oiRa//z3wxhuShm7pUub5ppA4NoximT4WbfNmuXz+eeBk+tRU6SZ65x0ZrDRokHEIPHVKMlq6XDKW6rPP2M/dbZw4IVN03n9fvhA2G3DjjVKriufw3QKDGtSpXK7A9FT6tyYhQWZNz5wpNS4v+BzK65X/oKhIOgLMhXjj4qT3acqUjvc+UeRs2yYdOQ6HzMipr5cOzbg46eTRNDkZf+wx4PLLpbXeq5cMseBJeZfrFlPb6+pkLrIewNi7V/YtZk6nDK3XgxijRkkQlcJP0+QsI1TNjtaCHXFxcjZiTmE1aJAEO0J8Qb1eoLjYOJSY61skJABXXCFB+csvj8yM5IoKOZ6uXRvYPztsmNTynTqVM6Wj1pkzwIoVMjVH0+Q4duONUpyQI+cvnD7i5p13AgvCKQowYYI0SKdM6f7Tn/buldkZhw/L/fx84Ac/ALKyIrlW1FG1tZLru65Ott9tt0V6jchiODaMYpHHI/Xr9EBGWVng43l50pafPFlO4Wy21tPDHjsm3Q+DB8uYtV//WsZPUZSqqJBUm2vXSh8SILN3v/WtwHzBFPUY1KCwKS83BsudOGEsz8mRgXIzZ0qqqgumqjKPUK/DYS4cqSjS26rX4WCBPetwuyW/y65d0rH8wQcS2HA6QwcpNE1eM3w4kJlpLHc6pUXSu7cR6OjdO3BZd++06GJRObVdnw1gnoVx6FDw8zIyAmdhDB3K1HZWo2ly1tKyZsfRo20HO5pmdjT2G4J/nx2FoqMDsHl3Ghoajf1NaqqR1XDCBOvsOjRNgi9r1sihTs/EmJAggY2bb5bfIOO7UeDsWalpsHq1nI0D0kZ58EEWUAmXxkYjPdX27cbypCT5Ac2cKb0d3ekH5HZL0GzVKtmBZGQA3/++FMCj6PT668Af/iAHqhdflEE9RE22bQPuvFPaBTabHF78ftnNpabKLoEFkKk7qKiQpB2bN0t2cnMG27g4YPx4CWJccUXrXT+tpYe96y7gtdfklDE5GfjlL2WsLEWRujrg73+XDamfF15+udSn41T3bolBDQo7TZM+63fflVlf5qxRY8bIueQ113TSaFNNk86tTZvksn9/4ONDh0rnwZQpgXMOKfwqK41R8bt2ybYx10ipqwP27JF0GxkZ0pJITJSh1F6vtMTPnpXRaYoirQ3zsOq2pKUZAY9QQY/sbE7lb6eomdquqpKH2hzEOHMm+Hn9+wfWw+jXj/uFaKUHO1qmsDpyBHUNdmyuHY2N1WOwpW4EPFpToEqxITvdhymjKnD1ZB/G5KfDMWSgRNwtOpSxuloGDKxZI6PKdHl5kppqxgzpwCCL8XikU/LFF420dhdfDHz721LvgbpGaakx4sY8pLN/fyM9VbSnI9i9W2Zn6DuIadPkwM2Zy9HN7wfmz5e2zW23yYwNiik+n+y2Tp6UXdmJE8Ztvanb2tgwp1NOp37+c+nbYzuBooVe504PZHz5ZeDj2dkSxJg8WQIaCQnte9/Wsg5UV8vvZNcu+S099BDwta/x9NDyGhtlKto//mF0OF58MTBvnmxc6rYY1KAu5XZLrGHdOoms698qp9NITzV2bCceNMrKjADHzp2BiRX79jUqvUa4gOSKFXIQnTMn+LGVK+Wge//9Xb1WF0APLumzMForsJyZKQebSy6R4RE//alspwED2jdv2uOR3vTycrmcOiX3T50ylpmLvLRGUSTdR2tBD6a5AhA4tb1/fzm5UhRpPEZ8arvbLTO2du2S79vu3YERVEACV0OHBs7EMM/6oW6lokJSShVt1LDtUw/89S7A1Qi4XOhjO4Vr4v+FKSnbMSrpcPBPOz5e9kPmFFYDB0qwo6P7gTDlatOz66xdK9l19EH/8fFyPL35Zvmax/huK/JUFSgsBJ57zijUMmCAdE5Onmy5DdQtUgu2h6ZJzgq9IJw+mi+a01O5XFIE89VX5e/LzgZ++EOZfkbdw7ZtUtxdUWRb5+VFeo2ok509Gxyw0G+XlweeyprpBZATEmRcWHy87Lvr6+VUyO+XdvuoUXJKM3SodACPGydtBZajJCtpaJC+os2bJZhhzjSuKDI7WQ9kDB7c+U0prxf4v/+TDJaADBr6wQ84ed+SvF7grbeAF14wBrzm5Ukw4/LLLdfOps7HoAZFTHk5sH69nE8eP24s79ULuP56ufTr14n/YXW1HBmLiqT6kzl3fmamkXNk/PguP2KtXCn1i+bODQxstLbcclwumWWhdybv3i2taDNFkY7B0aONQEZOTuCBprUkl+c7DUDTZD3aCnqcPm3kWWyLnuaqtaCHPm0hyjU0SGfWmTOBl4oK2cRvvinPM/+pdrvMtGpslI/8rbekkRlW1dWBszD27w/ejklJ8n3TAxgjR3aLbUStKy2VGPbGjbIbMrdc8vJk93H11U0T9TRVXmBOYXXkiFxa1lbROZ2SxmrQICPoMWhQ8L5M10W52urqpN98zRoZxKvLzZUTseuvlwlw1IU0TSq+L11qbJQePSSX73XXWXJ2YFSmFuwMDQ3ARx9Jg3TnTmN5crKRnmrkSGufGG/fDixebAwgmTlThpdyOHb386tfyfd17Fjgd7+z9veSgmianHqEmm1x4oQxka81TqeMr+jbV86T9dt9+sgpVKixYT4fcOCAHILGjQuc5QnI4WjkSCPIMWqUBEWIutLJk8ZsjO3bAxM6JCVJGqgrrpB+6q4Yk6Zpkin0L3+R22PGAE88wfa0ZaiqdCYuXy59O4DsDL/1LWm78dgYMywd1CgpKcHq1auRl5eHkpISzJ8/Hxnt2IswqGESBVMANE06S9etk/RU5r7wSy6Rzphrr+3kYqiNjdLZUFQkR07ziO6kJDli5ucDl10W9iqsev3r5ctlk9x5p2ySV1+VzWfJgEZ5ufQY6qPiDx6U75JZQoJRYHn0aGkhp6S0/b4rVkjn9O7dwUkuR42SYUWd/X1VVRn+0VrQo7w8cHhIW1JT2w56ZGdHbIiHz2cEK0IFLfTlLSc3mFVVySgwVZWTqqQk+e5qmmwqt1t2N6NGARMnShxBj2G11ufbLpomZ3rmIIY5Eqrr0SMwlVReXjcdYiyiYPcedvoMoY0bZXd+4EDg4yNHShBjypQO1IRTVTmzMqewOnxYana0FezQgxz65dQp6Xzqwlxt+hT9NWuADRuMPMMOh3wGN90kg9C7up0fc9/VPXuAJUtkJgAgx7577wVuv92yI/+jJrVguJ08KflS333XOEkGJJg5c6bkd7NSIfeGBgmcvfGG3O/ZE/jRj6T9St3TqVOyM/V45BhzzTVd+t/H3P78PLjdEqQ4eTJ08MLcWRtKRkZgwMJ8Oyur9WN4e8eGVVTIpJ/iYrmYd3WAnHpdfLER5Bg+3JJxeIpyPp+c8utFvo8eDXy8Xz9jNsaYMZGbJfHpp8B//Zccbnv3Bn7zm+4zSS4q9+eaJiPYnntOTgIB6WO57z7ghhs4nSYGWTqoMWHCBGzduhWABDgWLlyIgoKCc76OQQ2TKJsC4HZLupB33wW2bAlMT5WfLwGO8eM7uZ/S55PhAEVF0Io2wVdRA7caB7cWD48tAe7R4+EZdznco8fD7UyDx2N04OqXlsv02y2vW1umlZYCUFCGHJSVSWNV04AhQ4BLk/YjM8mNjCkXIzNTGrqZmdI4Nd8P2wB0v9+oTaAHMvQUGmY9e0oLWJ+FkZfX8Raw/r287z4Zgabnv9i+HXj++ch9X71eI9gRKuhRXt52NECnKPL3hAp66MvS0zvU46hpcvISKkBx+rQRwGhv+RFAghU9esiq9uwp19nZ8mcuWiRfibo6Y3lZmZRMcTik8TNokAxw1f8MRZHv6ciRchk9Ghg2TKa62+3ye7bb5XmKAvlN7t9vBM0+/zz0HzBoUGAQo1evmBqVEWW7906jd9wXFUkwwxzfUhTZdeiZBTs1Nb7fL70RLWt2HD0a3EOhaTIj0OORH1NCgnRsZ2bKSu7eLdMoPvssbIG3hgYZKLB2rcSIdX36ADfeKO3+7Oyw/NdBVs4rwvJNQzH38Zzg7+qiMsydsh9zlnWDHvPjxyUlzEcfyf24OEnEfM89lh4xr6rANwdtQkUl4JowJSj7Y+LWTcjKAl44NKU7x4kDaZq0Pdatk+1pTk81aZIEOK666oKHM694cJN0KCydEvTYyvmbpEPh2eDHAMj+43//12iT3XKL1GgJ82CcmGPFXh99JFTv3tI+7sJgaczsz9ugt731oEXLS0VF26+322WwT58+0nGrz7TQgxfnnQpqxQrs22/Dwt1zgsaG/c+olRg+NPR3tbTUCHJs2yZterOkJOlU1oMc4Uj3091c0L69G6upkXGlmzfLtXkwq90u3zM9kNHuwUgddD7b5sgRyZJ94oT8Pn/60+6R2THq9ufFxcCyZcaJTWqqtLEtPGjoQnFfcm7t7f/v8nBXiTl/AoC8vDwUFhZ29WpEvRXqHNiG5mHO8p/Lgjlzmnu8Vg79b6jqFNwf0TUM5HTKbLGpU6VD9p135HzyyBHpmHnrLekcveIKGQmemdl6YKG9yzweB9zuifB4JsLj+QG0xgagplqOum438DmAlwHgIJCcAmSkS8dzfGfuOBWgrBQ5OUC5LQeqKo3FlLNlOHjgLJDTB3Cd+7MzBznauk5PbyOIXV8fWJtgzx5juG/z6ioScdGDGBdfLB3KF0o/mi5fbpxArlwZ2YAGIB1TffvKpTX19W0HPU6flo5PPerQmvj45kBHQ0ZfnEnMRUV8H5y29UaFmokzvnScqYlvfpvKysD+VE2Ti6rKxe83biuK9KvqNdgTEuR7Ex8vDUk9BuXzyWSmsjLps21sNL4CzqpSuNwKfI4cHD9udCjHxQHprjIkODWkp/dBfT2aL3paqs2bjfVUFFmH5GQgOdGPZKUBca6zUOrPwt5YB7vqg13JhU3pBxuuh92uwZaaAntmGuyZabBlpsPuj4NtJ2DfDdheMf4Gm80IlOjX5tutPXY+r2n52q58zRx1BTB0CJYvl4aMafeOuUM3YY56ALDUHv78qarsjjZulME55riqwyF9jPn5wJVXhrEWrt0uZ1j9+wcOWff7jZkdegqrrVuxwnU3bKoPc2oK5EdQVSXPi4/HyrrboR5MxP07d0oUJgySkqSuxs03y2S6NWtklnZpqQxuWr5cjqU33yxT+S+ks9rnk32E223sL8y3+2U1YlzdRiz+yQx88kkmrr5aBjB89EYVpmETMlOy8M47xndbvzgc577dnueGvfOlokJ+fGvWGDvb66+X41ZnHBvDwDxJ8ZNPgNNngIrGZPTaugmfp0+BzyffiUtqNuFUYzI83nr8+MdGQDopybiEup+cLMeFqKUo0ns3bhzw/e8Hpqf697/lkpIiDdYbbpChzOfxRbPZgOUFyQA2BZywrpy/CcsLkjF3dn3wi86eBZ55xkj2nZMD/PjH0uNInc9mkx0m0PoIgq52zz3yfTx1Cli1qtPbx5om43lcLrno+3KXCxjetw6TGzbgqZ/dgOLiLFx7rQwyKHylEjcp6zGibxa2bzfal/q1+RINA2l9Ptk/hgpalJaeeyxTUlJwwEK/3atXmGY+2GwY/slyvHofsHPsHKM20vaVsD2/HBge+rvap48x4EHTZKyGHuTYvl0GMv3rX3IBpCbH2LGyyxk/XppFDHIEOq99ezekl9nUZ2N88UVgatj0dGmDTp4sbfnk5PCv0/lsmwEDJA3Vr34lv4uf/xx44AHZFUfLd1/PDqLX1/H5gJvGnUTth8X4639/HRUVvfDVrwKvvQas/ks57sYruH5MDk6fPve5adg/g717JZhRXCz3ExKAWbOAu+46dyaQKMd9Sefp8pkaS5cuRUFBAdavX9+8bPDgwSgoKMD4czTaOVPDENDBtfYuOYvVNKxM+y6W183C3OGfYM6wfxl7JUUJeVuFDR7EywwGNQ4eTS5uv0NmNDTdbl5muu3x2+U1fjvcfjvcfrndfN/ngNtnb1pmg9trh9tnh1fVe1gUuD0KauuAurMKVD8ARYEGICFBQVo6kJqqwGaX50LpnGtFAeJVF5z1FXDWlCO+vgpOmxfxik+us1LgHNgHziH9Ed87C/FOBU4nmi96w91833wdtKzgRfxj8TGsUObC3i8HrqOncKv/NVz7zVxUXXkTqqulA6LldVVVqIwoTT9XTWu6qRm93ZosT01WkZnmR4bjLDLdZcioO4bMmkPIqDmKTFsNMux1yLTXIsNWi5QkFcqggUbR3P79jWH5+tFR7z1v637LS2vP375dOg4URZaNGQNcemng0bPl0dTq9xUFqK0FqqrgKzuDyqN1KD/qxsljPpSVAaWnHSivS8RpbyZOe9NR6UtDo+qEqilQYYNfs0GFAlWzQVXs8NvioCoOqDY7VMUOu0OBPc4Gm8MOR7wNcfEK4uIQcOmMk8iGkjI4ThxGub0PDqu50NswefbDuMh3GLaheUgeNTBgc3q90gdTVyeX+joVPrcfUE3bHUCc4kOy3YVkmwvJ8R4kpsVBSUmWYGJSIqDEyhDh9lFOlcJWehJlyXkobcxs7pQelHoag+t3wjFkIBzDBiMuTr6K+neg5SVSj5+rE93rlbZrURHw8SYNtdVy/LLDj0Snissmaci/0o+J41UkJahG9O5cFz1nWqjbTcfIkLc7ctm5EyufrsFy99cxV1uOOcn/lOUuF1b67sFy3I+5cS9hzreTJHVIe6NaLR9rZ0TMp9rg8tpRc9aOjzbZsf59G77YZ4dfs8GvKkhNVZqLherpKtoKUrS8fa5UGgCAsjKUHXWjDDlQnE5objdyUIaci5zSKRtGenOms4Mldr8H9p3b5OJzw6H4Yc8bAPuUyXD0zobdpsFu0+Cwq7DbIPcV1bRMg13R4LCbliv+gOfZFRUOm2o8btOX++Gwye/BbrpWNBWqX0NdjYqqSg3VlSqqq4zr2moVNdUa6mo1aH4VCjTU16k4cVxDmlqNvf4hGGnfD29CCuJcZ7HHPxQj7AdQa8tAv/4KklMUaIoNGhRokOl1Kmwhb9vsCuITbHAmKHJJtElbKdGGhAQgIUkeS0iyISFRMW43PZaQKPcTkxQkJCqwOWzGlD5FMY6tLW+39pi+0zHfNz9H/7K05cQJIz2VObo6YICRnqqDU6D0E9Nbptbj0oemYMczm/DW+3KiGjQyb/NmKXyiDwW/4w7gwQdjt8qvpgVfm09Zzffb+9wWy1a8FAfbp5sx5+AvJY3c3XcDL78MvPQSVg5+AuplV+D+ezzB63Sudb7A56gfFcH1v0/D5UiB69dPwZWcjUaXIvtlj2IEItwKXO6m+023XS6g0QW4XE333YG3G12KrEJrq3G6HGXHfChTcqDEx0PzeJCjlSEnNw7obQ7k6udVgfdtStO5T4L5XEiRc6em283nRwlKq8GRUOdXbT2nZZC7oaH12RanTgVn1m2pZ8/Qsy369pUBxBFJ9fjJJszZ/3NjMJh5MOOVUzo8qUhVZWCEHuTYuVOO/2bZ2cYsjvHjZQJRrNM0YPm8j/H86hTcc3sD7vnjZPz9e5vx0mtJuPf2Btz79OSAGe1mzTPXWzzWcllHH+sqbjewfZsmRb43azhdLvtVpanlMDhPwxWXa7j8Mg3Dh2mwKVrg/jecFwBQVaz8+X4sX9cHc68/iTlPDMbKX5XI/ZmlmPPr4QHtCQ0K/JoNPr8Cl8eGF15UsH6DnJtPvEzBvd9QYHfI4z7VJkEDtem+v+m1PsCnKvD5lObn+XyAX1Wan+fzK/JavwKvNzD44PO1fr8jzw2pE9rn5i7ECxlAGHSKU1cD287tsB87DJvS1JYeNRy2CWNhT0lqc5BgqNOlzhxw2OG/xdRF1NHfpBHAOIs5S6Zg5YJNWF6QErqdGIMsm35q8eLFWL9+fVBQY8mSJZg+fXrAc91uN9z6tHDIH5Wbm8ugRhM9sDFi83KMs+1Ake8KbLbnY1zKfoxOPizBB1OwQq4dTcvi4dEc8GnhGE7SfjZocNo8iFe8UPw+aB4vFJ8XcfAiXvEiHl6kJPiQnuxBWoIXTltT4EHxBlzrt+ObHncqHllm8wU8x6l4YFfUwB2OxyOzN2pqpIcWMPZICQmS5DQ7W4YctNxzteOy8ssrsHzbpZiL5ZiT8hpW1t0uHV+XbsOcwR+3GhjQfH40+uJQ7UpAlTsJ1e5EVHmSUe1LQZUvNfDam4IaTyI0v96B5w994qTYIEcNO2Czw24HMhxnJQASVyfX+n1HXeB13Fk4ba3knT+HFaXXw6ZomJPznuQi1zT5jC+9FCvLroOqKbi/z7vn9d4XQtMAtxqHRtXZfHGp8Wj0xwcsa/DHo97nxFmvE2e9crvB50S9zynP9cej0S/PdSMevpaT4DTjhmwWBYAmbSqosOkNQkWTbiNFGoI281mn/p212RBvV5EY50NCnB+J8X4kJmhySQQSEzUkxKtIjPMjMd4n105VnhffdFu/xPuR4JTXOuM1nHr+Hbz87zw8qz2Is0hBMs5invIc7pp8BH3m3xp4pNY0mVJy7JhM6zh2DGpNLSp96Tjq7oVj7p447u6JU1ovqPGJ0OKdch0XD5tDQa9eCnrnKOiVo6BnTwXxTgWqBvhVmwR8NAV+temi2aRPuWmZClvzY6oqDceWr2l+bovrls8NXN70XmpHXmO8Vn+d+f2aH2/+W+S2eq4jb1N0c4fvYmgOBxSfD5fad8mUrIx0U+dN0z8BnTn6snBfh+5QUjTpwI1TfLArfsTBBzt8UL1+qB4fVI8PNk1f7keczYckpx8pCX4kOf2Is/nl9TYf7FCb77e8yPuriFN8nfJ40LEhlLNngd27sVL7JpZ77sFcrMAc24tY6b8Xy7X7MVdZgTnKCzKUMysLvp594ErMhEuND8vFj+AIkqrKiZDPC6hNOw4NChwOBXHxQFycfkKHwLNkRUFzR5X5NhTYbBoSHH4kxvngdPib9j0+OB2q3K44huf3TYYKG2xQcd/wzfD36tt8EuhXFfiafgM+vy3gd6L/LszLfarc9mn6MpvpkGb6Dpp/AwHfxXY+bn5P/XGvV9oF+nNtdsAZH6bht4E0FVA1Ix5nnqGnaBoUzQ8bVAl0QJUTQf22aZkDfgmSwA+vW26Xqr1xUMuDDSpU2DBc2Y9c+wloqnTS2exN/5/p/9W0pvVRtaA+YQBQWu0ZBRSl/acXCkzxCEWaKrbmfgcteFnTbZuiQTHHL8xf25DrhOBeJUVpWldT4MTlkumIDQ1QNNVYyaQk+bCSUwLPXk2/J8X0vrV1wGclWfjSMwg2+KHChpHxBzF5aAUy0iVMZPN7YSs9AVtNJWyaCpszDrb+fWFLSYJNaXpO03Y1bjdd67cV1bjf8jmKKu/b/FwNNvgDl6HFbc1vPLfpO9fqc8zLm56raKZ9aUeDD11oZdl1WF42E3MTV2FO4xLoOWJXJi7A8sa7MDdnnbRbW9A0wKfZpb3Y1G4MdWn5WKM/+HG3Ghf0XI/mABoapS3vcIQtD22c4kOCzYNEmwcJ5ktjFQqqpkNTFEAD7sh4H+7EDBn4pjqCzim9WmdMzwgRJDFdBd+X9pV5zIFd88OueWFT/bBpPsTBB0fT8T0eXgkYN7U54hQfEp1+JMX7keL0ISXRj+QEP1KTfEhJ8iPJ4UO8w494u4p4ux9Ohx/xdn/AbWecPNa8XzEHUM91AYL3IW28fuW2S7C8eAzmZr+FORX/J89VVazs8QiWn7kFcyd+jjkTdgd/rKF+U638zvx+DWdOBwZ//P7A56SmAv36aujTF+jbx5QRrwP/j6Y1dQybL3pn8PksC3Vp5/O8fpu0P1QbvH57G7dt8KkKvH5781GvrCIOZfVpUBQNmqYgJ6kGOdlN58lBbZDmvz74fsvnB9wM0U4J+fym9rfpeUrTaxXz/ZaPKebnBL9OgQZVA3xeTTrQfdIW0B9TFNNAp6ZBTfr5rFnTUAnTepgeU9p4zPReSovlAdem/08BcLCmBw66+8n6w4aBzlL0T6mBT7MHXNTAnQ4AaQLq3Y82G5CYgDCMvTPv78z7thD7vdZun+N5CgCHTYWjsQ5bqoc2dT1ouDxzP9SkFDkf1eT7r2nmz+Ecx+FQ38eOPE9VJfLu8TQ9pgDxcUBComlUXJjX4Zwv19q829YDCpoGLzW30Y32m73pXNMGGbBkU2TZwZoeOODqDxtU9E+qwkP3VDOg0cSy6adaUx0ir/qiRYvwxBNPdP3KRIk5cwBs2oRHNt2OVb6vQQOQk+7GmQET8BHGd7iDymFTEW9X4YwzGm1Oh4p4uw/xtqb7dh+cDp808mxeuW/3GwGEptv6/TYDEIoXDviCRsI2Nqg4fkTFsSMq6utU6fRVVST4VfTvraJfjorkxA6OrtUvocTHy5Ccnj0l1F1bKx2KdXUyZOXECbk4HBLYSE9v9zAdOWEag7k572DOqReAOk06vHrnYPmOmcCpUyFPmICm8+emS18nAHNWLL9fTrjPnpVrdwNUG1BnT0W1mo4qZKIaGahK6INqZ29UxfdGdVxPVKnpqPYlo8qThHq/E34oqFBSUaEAUBXAqwA+mDq0jE4tKAoS4vxSByTJjcxkDzKSvMhM8SIjyYPMVB8yUnxynepHeqoKe5wEdmwbB2L5BwMA5wDMyX1SOof8fqxMmIflcddh7tSjwDXDQ+dWUlVoPj98Xg2Nbhsa3TYZiea2odFjb17WfL/lxeuAy2tDo8eBRq8DjT5H0zIHXH6H/Bd+DaofUFW51lRNbqtNnTlq028FemNPb4C1aFQ1N67kYrdpSLK5kWh3I8nhQbLdjSSHG8lxbiTZ5UQy0eaWi+JColaPRH89EtV6JPrPysVXhwSfXCeiEQlwwa40fZe9TRfz7ERFke90XJwxnE2/rV+HGkpfU4P3dk/AG7gNjypP4RvK3/Gidg9WYg6yPnsJc+r/T15vzj/V4mzHBqBHYg16JFdgfI9jQHIy/PY4NDSYXlbV9LIyADubvs4AVGdTyqqmS0JC6x1TlmVrurSDxB6agiJoGlmvNXUPaQr8aTa87JkIT4UGm1+FT3PghrSPcEu/XfBqDvg1G7xNgemWl3M+rtrhhw1etelxdPD1mh3+pmufZjedqjT9bZCvpUezwe+zweuLCzoxbj4RahrlAgWAu+kSxLwf6sB18z7avC/Tl7fojGx6jT5i3mHXENc04j7OLqPvHXYNDpsGR8JeOBpq4HQq+Jnrv/Bz/6/g1xwYnHAc7/luwJu2r8HlT4arPB7+U01TWZKTmlIbtjj26kNmA26bn9Oi86/l8btpn2OD1tQ55YbT5kVCkgcJNjfg9UJzeaB43YiDF06vB4mqG1kpXvRI8yAtvun55teGuH2ugM9K/3Xoj/5wwAcfHLjIfxhztKVNZ1Wtv64jNA3yO2n6vvo1W/N1823Tb6nDzz3bCF9lLfyaBl+cA36HE/6MbPgSUkK8r/5+Te8Pm9yGQ56LpmUw/VZUmcXq9UsniVu1w+u3w+e3wavKrBtf0zqbT1g103dVP++02WQWq35ttwE2e9PtpuX6y06fVuDxAPZ4BbXuNGhQoEDD8fg8HPENQrwT6JkeomMlVKeKZgQ3NE0zBUD026bgRyu3zfeb/zrT/2t8zYI7aYKf07qg2EXTC1vG8YJ2HebbDq1puKRPOpjdAKqaHoxzAI44+fBD8PmAxgb5e2tgfO7lviy8uScLiUmQNrDbDWiD5EVx8YASDxxqxx9ocQpkYEZzMKbVayMIY1f8EuCCzGBSmh4P5/KLnOX4dfV38IH/Eky0b8cm3xX41DUZFycdwuf1g/DdL78XMlARqjPsfD+pkBKcUBrqkeA7iwTFhYR4LSDwkGh3N9029tMJNg8S7E337R44mx5vfqz5tTLwq7kt2cLKk9Px79pjcMAPH+y4NOcU5uS80GYntbcpwBEU+FCbZv63WKY/T3+s5QA8jxoHt+pAoy8Ojb44uHxxaPTHwe1zwKXGSXYAOAI+Pxms7Gi6OAMma9la3rY1vcAHoAFNv+vz41D8TbP9PYhXfE3nvx4jA4BiDLJr7dxYHncFDMYzPzZV2YZa2xQs23ct3L79uD/u73je+3WsrJiCr/dajRuOb0TpseD22oVcPLCjwWdHvcuOBrecU/lL7fDtszcf52C3wx5nhxJnh+KwQ8W537fzfjvh5D/nM3IcwCmkQNMUKFCRE1cB1HbBqrVBa+V265QW18LvB/w+wOcP7j5RlKa2e1Mb3q/Ip+XW0J6PLfT/31Znfcv7AavadF8LfH58GuA57Ww+7ialOVCpZQOKuX0THBSCBjgTpC/M3eCHXfPD4fYhPUX6xBwwBknZQwyWan4MauB9RW39uUoHnovQr9UHaZkf09s6K8uuQ2Odt7l9fmevTUF9T5oG4/yz6VzUfF4acH6q2ZrbxIFZJ0K8xvS436dBrayGv7YeKhT44+0SXMnsAX9cQsfeq6kdrjZlu/Br9qbzaVvAbfPj/hDPVc/5Xk3PUcyP24LOewM+SwA+zQZfezsEANidgMuVIN9XpZIBjfMQkfRTS5YsaS4UDgCZmZkoKCjgTI2OapqqMerL1+BLzoCjvhr/mfYXxF97FZwzrm41XVJrKZTOlTKkq2ka8OWXklp2wwaJMehGjpRsANde28EanfqQx/ZcGhpkPu6//gVs3So9svrPxek0KqtdconcD/EeK97Khg2q5Mh/9VV5vc0GzJ6Nlbb7ocKG+2+vaT3tiH67vFwq6O7bJ7UwTpyQ9TCftaelBdbCGD68zcJKXq/EblpLf9XyOjgV1rmlpRn1Po4UHcHnX9gxaXQDht00DAfe3ofPdifisnFejPnqYDQ2Iuii5/ttbAweLXQu+oDbc130xlrLSTahMk6lpBiF3PVi2j17Sg7dnBy59OqpIckpMyIcNhmxGJTm5nzu+/2yMSoqjEtlpWycigp5rLbW1GuE1q+dTvnhpKTIRkpMxMq12VheeSvmZr6BOfV/aX6flXEPYHn9nZgb9yLm9H8/MJjncMhcdD1pb69egcVVQxxeNFVDdTVQdgo4VQacKtNC1grXS5Dk5AC9e2lBbx303ueb9sGi77Nyx6VYvn0c5tb/CXNSXsXK+q9hecp3MXdC02g885e0lfSCHbrY7cYZf8vb5/g/1KYOXp9qw5lqOz4rtqF4ux179tng8TeNK9dsyMi24+JLFIwYZUP/AfaAkXRevw1+FU2dvKYp3H4lYAq21xs47Vq/nM/jHd2nNKupBr7cD3jc2OEdDU1RoGgaLo3bLYGLYUMlKld+Wn6jmnTeJSQCiRf1gnNADhJSHEhMlJ9iQgIu7HaCjPhRVH/g/sN0XXrcjw8K/fjwfRV11f7mkdajR6r4Sr4fE8bKDJmgfVCoNIItrle+3x/LX8vAXO1vmJO9Fisrb8ZyzMXc26sx59pjxneprev2PKe91x15P0CKurzwgiSHVhSZnXnPPVI7Q89p0sZ7aBpQWaXg9GkpsaSXWjJfV1S07/umKHJc6dXLmCSanS3HnKwsudbbPHrKAfN1y9t+v6QW+cMfgMyTu1HjSWgeuZgW70JVzigsWACMHt2+3dq5tPb81t7b5zNqorndcszXb7e8NtdPc7u0ptsaPC4NHrcGn1c/zkmXmQI5uCvQoDQFDJtHizY/x1iud3LY9GChJrcdDg3xDg1x8MBZX4n42grE+Ruk81LxIj45DnF9eyK+fy/EJccjzqEhzqFh/XtAZYWKdH8ljjX2aP7cc5MqUGvPRC9HJe5IfhcabFDTM6BdPhn+zB4ymALGbD+tebafebmkEPI3zWCU58BY7m96DvTbaOU5puVqy+fD+H+bnqNp+nq0pIS8GXJBy86qkK8xPRDysZYdXe1dl9CvLdtXg7LT9ua+sZyefuQMz2htpQLoEyn0i17XrK375v14W8+N//P/QXnrTanevHRpl5yo6UVk73Ytx6ys97G6cipeTpgbWGzW3KbUG9EdSA+j39ZUDWdrVZSWSluwrFQzrk9pqKqQ4KcNxmskWGb8tntka8juYewj09OBtFQgJVXijR6vYtRc9CjB117A41Hg8Spwe5pu+xS43U3LvHKtX+Q10l4JGgUc8MPQgu8HPKe1ztWgGwHPKTupoqw2GQo0aFCQk1aPnD6m70VY4gXypqoGuPX0Zo1NA61biI+XAdeJCZKCrL1fWYddg90GxOkDSOyqDCKxa63cb22ZMTDF4dDO8R6m+w4Yr2vtYlObBuPI/ZeX1OCFzYPhUPzwaXbcP+UgvvHdjOb2gaZB2gjNoXmj3aHfbj4qmWbpaIrxHP22ub2hP0e/bX5P82vN7SFzWslQjzW4FOzerWD7TgWff65IWvDmI6aCwUMUjLkUuHSsgv79A1/b8j0D/t62HkNg26C1U9aWy1o73TI/9tYTxXh9fRIcigq/puBrMxswa9GEoDS6espR8339NPfkSeAnP5FyevHxwH/+p/Q7Bf2n+j6w5fRaCyxb+VYmli/XZFZ5r3VYWT5TsoXcD8y5qcL4EM2jPczXnfF4Q4OR2lPv1x01CrjzTiAvr2vWoZMfN7ePmk+JYMxMb84ioWeZ0E+jmm4HXKsK3ly8F29+mAa7TUWC4sGDd9UxsNHEsumnSkpKMHv27KCgxqFDh5CRkdHma1lTw8SUR3P5/ilwOOTkcO7QFvk2uwmvV9INr1sHfPqpsc+OiwOuukoCHBMnhjE7hM8naZOKiqSabYXpQOBwSHAjP19WJjMz8LU//amcjOhnPi6XvN/8+cCvfx38f3k8ErzYvVs6W3bvltRYLeXmBgYxcnODd8CdRNOMerjtCYTU1LRodJSVwXe8FF96B+GMN6N5cY+4agyLOwRH/z7tzu2o5+/X/1Q5OTc6LvWOEbc7dHAi1LLUVAlO9OhhBCqys+W+fsnMjIICiD6f0YtmvpgLndeHKDpVV4cVO8fDZlcwx/Zi4JlKfDxWqt+A6tdwf/5B+Z5fcolcBg/ulB9dXZ1Rw3737tZr2A8aJF/10aPl0rdv2L7yERVQM2n/z6Hv4PX9vdV276WlslvcuFG2n/m3n5cnX5mrr5btZ6Xt1XLf0aGgyF+W4e3VDXjHNx12mwaoGm6NextfuzcRCY99z+iYclUj4b034XjzVSi1Tfvx5GTg1lslZ36PHl36N/t8cixdu1bqIevbKjVV+vBvvllKCLSX3gE2F8sx5/F+zXm+Vy46IYENc0eY1Xz5JbBkiVGcMClJghlf+1pzuhdNk7iUHrAIFbQ4c6b9AYsePYxAuD5B1Hw/Kys87Zgnb92Ef65LRs+keuzJmoKRlZtwuiEZX5tZj4Vvdo8TJ72d0tBgXFreb+uxlvdbryejyUGrshKorgH09FRQpDc1Kxt19jR88YUNl3s2osafggxU4wvbxZikbUGp1hu59lLsib8UL1/8/zB2/mXAffdFVfV1c/9JW6WMouL2x5uhfbwZfzj7ANTUdMTVV+GX6X9AwnVXI+HGqW0GH/RaDmFTUwN84xsyK/uHP5TjRhitXAn8+edluLVyOWpT+uGVhDm407USaWdP4M2sufjOf3d8f+73y36ytfoWoZqkZomJ0tYLdenVK3Ltcr8fRrDEbdwOFZTtrOe4D5+E78Qp7PCMghbvhOJx49L4L4CcPrD3ywlZ+6y1i14T7UJuezxSePzAAaCkRE4xgMCxL0OGyOnCmDHSbk9KCqzFpo/fs1LbsD3MhXznLJ0SdD8aHD9uFPneuTOwHZOUBFx2mRT5vuwyGZwYLTpz2zQ0AP/1X9L3BEgT9/77o+P7GvH2udstlcn//ndjZPKIEcC8edJvRgC6x74knCwb1ACACRMmNAc1SkpKsGDBgoAaG61hUMNkxQqs/GRIQAdXQEfYlQfQ4YphUaKyUmZuvPOODKzUZWdLHceZMzvWKdNhmgbs3Su9eEVFUlNApygSfc7Pl8uf/yxDJBMSpHdPD2ocOiRn0N//PvCjH0lvrt6ju29f8Nl0XJwcCPQAxujRMhzJolTVyOJVVQXs/O06vPVuAj7EV5rLlgDSt3eF9gmuneLDoPuuhs1mjNTUOxb0QtQ1Ncb7tXeEtcMRHKAIFbQIU7pia2poCA56fPwxsHq10SukT+XSNGmUZGfLWcrf/ga0mFEXDn6/nCDt3i0/iy++kI7zljIyjADH6NHnnJwUNcJRELIzaZqcyG7cKLvA/fsDHx85UoIYU6YA/ftHZh3Dqvmk4H7MvceDOVcekOPx3+NlNJR+8mDmdgPvvQe88oqcSQKyg5o6FbjrrsDRSl2kvBx4+225nD5tLB89WoIb11577t/Tinkfw7ZpY/Df3PQZqVOuxv3LrgrPH3C+Tp4Enn0W2vsfoNKXhtNqNk5fcQtOj7sO5fXJURewOBf9BOm+WfUY+50pqKiQXfr2P2/C86t54tQar7cdAZAqNxq27UPDjv1oOFmFBn8CGlUnvvQMwNnTjajVUpGJKhTbJwFQAFXFOO0z1CAD2bYqPPa3EZh+X3fcSUaJaBgg9uqrwNNPy6zaF1/s4PT0jll0y8dwv7cRtan9sClvTvMpS/6hlUitPQHndVfj8beC9+eNjdJGCxW0KCs79z40O7v1wEV6enR0IIZd03f1+aH/jb/tm6Jn8cX9Qz/G/Qd+BuVbkf+uVlQA27fLOIHiYtn2ZvHxcgqrFx4fPjwyx8QL1Vqno9U7I30+GSupBzL0pqguN1eCGJMny3ay/EC+EMKxbVRVxqauWiX38/NlBofV+w4i1j73+aST7vnnjUHAAwYADzwgJ4bcoTeL1n1JV7J0UKOkpARLlizBpEmTsGXLFjz++OPnnKUBMKhh1hzAmBu0nwq5vDvSNBkdsm4dUFgonei6ESMkuDF1aljb/+LIEQlwbNokwQ7zCn7+ufTQjxplVFNzuaSnvqTESGPVcgefkSFDW/QgxtChUTWKz0xVZUDy9u3SoC0tNUbIJSdLX196unSkmbLNtUlRZOaEOVBhnlWhX9pZ+oS2bwduuEGGzPXrJx+ePsyqrEzSnSUnSyNl7NiIrGJFReBsjlCxP7tdfiqjRxuxv549I7K6F8aCO3hNk8+8qEiCGeaTIUWRr0V+vrRXo/Iz74CV84qwfNPQoFFOzaOipuzHnGX5oV+saXI2uWqVDI3TTZwowY0JE7p8p6WqMmtjzRpZNX0mZFKSDBS46Sb5XYW0YoUEPEN9H1eulDeLQARO0yQArgcnTp8GTh9pQHnhDpzeWYZydzrO+NLhz+gB9MlpqncSmjklVGtBi0gFLNpjxYObZBOFODFaOX+TbKJnY/ukqVMcO9acYmH7oXT8dOvtiIcH1XG9oDriUeVJxhk1E41aIsaiGBpsSL7hGnxzjoKZM6NrJGy3EQ0DxPx+4MEHgcOHpTH98MNh+W9UFfjTxBU4fNSG4ovnBByGNA0Y9/lK9OmtYszv7kdZWWDgoqqq7fd2OCRDaaigRZ8+3WMwSthFw3e1hdJSSX9YXCzXlZWBjyclGZmcx42Tyd/RcM4WTcfU6mpp323eLNcNDcZjDgdw6aUSxLjiCjn9i3bh3Dbvvgv89rdy7jl4sCTb6N37Qtc4jLq6fa5pwPvvy05JT5Peu7ecs86YYb089xYQTfuSSLF0UON8MahhsGg/QsToKTX09FT6qCCHw0hPNWlSF3Q66KPe9Vkcu3YZ82vj4ox574CR92T06MAAxsUXSys/Glp2bWhslBHc774LLF4ssRyXy5gEoE+v1lNJjRolQYjk5NABCvMMCyt3IEUlVZVO1WPH5PvY8mx2924ZwvPZZ5ZplHi9kj1m925jRkfLEyZAOhzNszmGDImC0UcW2cGrqsRlN26UXVp5ufGYwyH71Px84MorLT1xrNN12ubZu1eCGx99ZOSBysuT4MbUqRH5olZUyHF07drA2VHDhsnsjWnTjPi8mapKjEafBTBmTPh2FXrAwjyjomVqqDNnTEFP1W/MStMjNqlpQN8+UJKSAmojhQpaZGfzeEMdoKpQX/oH7ngwEzu8ozHAdtQ4pNpsqHek44A7F3HwYuRYJ5TUVDgcEhC+5Rbp3Ivy5l/UsOD4gdCKi4FHH5Wd6rPPSi7HTrZ9O3D33c1l1nD6tHSA6rVs9FSMelu9pdTU1mdb9OhhmaZj1Iqa72or9Bm+epBj+/bAWpmAfIfGjTOCHGHMqtxtaZqMmdRnY+zZE5gSNiNDAhiTJ8tpX6j2HLVu927gZz+TYFFGBvD//p+cW8Y0TZPOt2efBQ4elGUZGcA3vymNmigdlEvWwKAGxazqapm5sW6dsW8FZGS/np4qDOcDwd56S/IGxsfLzAz9p6Yo0nOfmCgj45cskd6iKObxyKwZvZb53r3SeNU7n774QvqSnE6pTZ2YKB9Lfb2klYqPB/7yF+C226w/nbPbKiqSEYA1NdKTp+cdOH1aeqyfflp6sC1K0ySfrznIcfCg0Yepczplyrs+m2PUKI6QNfN65YSzqEjis+Yi7gkJcjJ09dXA5ZfzZKjTlJZK+re33zaKyWRnS22HW26RnWYX0zTpfHjrLQlo6QGChARJS3XzzZJmTFHku/LUU7Lfd7vlNzZihPTBdXSX0eGARRsUqMhyl6JX2U70VMvRK74aPQckodedX0HPK4cyYEHhs2EDir6xBA/X/ho13iT0RDkSHH647Mk47c1AuuMsfpvyBNwP/whrjo8NmOTbp4/8vmbOlAEcFD4WGT/QPr/4hexsx42THW4n9/Zu2CATQpKTpS3Vch+rabJs5kxpB7ScbRH2WfExLqq+q+2gZ1vQgxw7d8pgOLPsbCPIMX68xUfFR5DbLZ/h5s3Av/4VmE4UkJm2elqp4cMZKLpQ5eWSfurgQRl79Oijsl+MSTt3SjDj88/lflIS8PWvy/lLYmJk1426BQY1iCANpnffBdavD6y1PWyYFEWdNi2MI4xbDnuqr5fek8REaVHU10vOrJdfjlhKn/Ph80lJEHMA49Ch0Dlze/aUz7egQE6UQtWVPnJEGrIRzGxEOnPvpMcj0aaRI4FHHrF0QKM1jY3yp+iBjt27g0eGAVL3YdQoI2XVwIGxNarQ5ZJp6Rs3ykmReXp6aqrMdsvPl8xITBMRRnV1EkV49VUjD21iouR/+trXgJyciKxWdbWUA1mzJrCE1KBBMrFk1SpZ9V692o6Fapq8V8tC2+agRbsDFop0+IaaXdGrp4aeX36MrIIlcJQ15Unr21cGGVxzDc/oKfya2n9FytV46vQc7G24CB7NgXjFh5FJR/BIzxeQr21sbv8dOCC/r/Xrjf2v3S773ltuiUhWOrKa0lIpKO/1SuXaTm6T/eMfwLe/Lftpu12afz17yjHf6ZT/tq4u6k5ZKEr4fHJOqQc5du2S75xZnz7GLI5x42I76FtebszG2LZNTtl0TqccM/S0Uj16RG49uyuXC/jNb+S0GQDuvBNYsCCGzh0PHJBghl5BPT5e0iN+/evS70XUSRjUIDLx+WS/u26dNADM6akmT5YI+2WXdXK2D72YxI4dUiCpZUqfI0fkzOCf/7TsUVBVZTXNAYyDB4MbmoCMdh8+XEboDh8ul6ysbvExxJauzCPTxTRNOmXNszmOHAl+XlKSBDn02RwjR0pQrjupq5N94caNwJYtgSdE2dmSCuXqq2XzWz5dV3fj9cqw2VWrJI86IL/Ba66R1FTDh0dktfQyUWvXAh9+KKMDd+2S+HxOjpFixOuVx06dkmDD9OkSrDh9umMBi1ApocxFt0N+L7dtk9mP+/bJ/YwMGb560038IlPXMTV81IsGYmf9YFT40pHtqMGY5IOwHT0csuHjcgEffCABji++MN4uJ8eYvZGd3eV/DVnFc89JsfCcHBm63wmjDI4eBf76V+CTT2R/3tAgAeuePY32Otvq1NU8Hmmn60GOPXuCZ14PGGAEOcaO7d6zhVRVPgM9kFFSEvh4797GbIyxY6WPmcJL02Q3vHKl3L/8cuDnP+9+54sBjh8H/vY3aagAEgG/8UaZQsboGYUBgxpEraiuljpG69ZJzQddRoaRniovr5P+syhK6aNpUtdJD17s2yc1C0IV705JCQ5gmE+AWoqij4FiTF2ddB7pRcj37AmeAq8oMnvDXIC8X7/oGzlbWWmU+9m2LXB2VZ8+0mc+ZYoEdKLtb+uWNE0iTq+8Amzdaiy/9FIJblxxRcQ2VF0dsGwZ8MQTxsjelvSyUeYc7OaARWtBi1YDFm05cABYulQ+L0BmuNx9NzB7NqfAU2RcYMOnpEQCiO++K4FDQDqTr7xSAhyTJrFzOea4XJKn/MwZ4FvfktvnqaYGeP554I03pMPUbpf2zYYNkjGXbXWykoYGGVShFx0/cCCwVoSiSM08PcgxZkz0H/rPnpVShnpaqdpa4zFFkd+rPhtj4EC22yPlgw+A//kfCcQNGCAFxLtD0fUAp09L9Obtt43o4rRpUsyn2/2xZCUMahC1Q0mJBDfWrw/MHT9kiAQ3pk3rhHz7Fkzpo9cfaBnA0E+czRITJR+nOYDRt2/HG08W/BiIgvj9kk7NPJvDXDBZl55uFB+/+GL5XVgxNVNpqQQyNm6Uv8d8xM/Lk9/e1VfLyEyeEFnYgQMS3Hj/fSMaddFF0ml/3XURGZan52Dv0UPqYFRXSydrXJxc7HYJfjz2mBxP9RoWnTphoqxMRi8XFsp9ux249VYZNcZiORRpndDwcbuBjz6SzHS7dhnLe/WSCUg33sgBkjFlwwapTut0Ai+8IDvWDvB6gddek/4pvc1/5ZWSeio3l211ig61tZIBQA9ytJx1bbfLease5Bg92vqzFzRNBsLrszF27gycnZKSIlklJk+Wa3aFWceXXwI//anEm1NTZcDPuHGRXqtOUFsLvPSSHDT0NB1XXCGN/8GDI7tuFBMY1CDqAJ9Pcsq/+65MwdZTZNjt0ni4/nrZh593Z0yEU/pUVAQGMPbtC6wxoouPl4COOYCRm9t5q9qNMxtRN1ZVFRjk2LcvOAWb3S6/HfNsjl69un5dNU3SSWzcKJ0T5tlogHROXH21zMjo37/r148u0OnTUnPjzTeN5PsZGcDttwO33RbGIlHBzGWjQk23D2vZqJoaScPy+uvGAXvqVOCBByTqTmQVndjwOXxYUlO9955RH0pRpJ16882S/oJtqm5O04Dvf1+GrU+bBvzsZ+1+WVGRpJrSB2oMGQI89FBw5xvb6hRtKiqkTaIHOVoORoqLk7a5HuQYMSL0DNOu5vNJcEYPZJw8Gfj4gAFGWqnRo62xzhRaRYXsjvfule308MPSLI9KDQ3A6tWSBlc/1xgzRoIZl1wS2XXrhnjMbR2DGkTnqbZWBkK9+66RlhuQvqLp02XE6ZAhkVu/c6mpCQ5g6DVnzex2GamtBzBGjJDGE9OOE7XN65WB87t2GYGOUL+xHj2MAMfFF8t+oyO/r/Y2cjRNfudFRRLMOH7ceExRpEM5P18CGR0c1ElW1dAguWlWr5aKkYCM3J05E5g1q0siVhGpl+Ryyd/8j38YJ1rjx0uFxmHDOuk/IbI2j0f29W+9JccIXc+eMnPjxhsjE1SnLrJ/v+zzNA344x/P2cm0dy/wzDMSBwGkPfHAAzJgix0n1B2VlgYGOVq20ZOSpE2tBzkGD+662cpVVZJOavNmySyqN2UAOUcYO9YIZPTp0zXrRJ3D7QZ++1tj8vBttwHf/W4U9a14vTJo6sUXjRQmQ4ZIMOOyyzilPwzMsyPdbjmVGzECePRRzo4EGNQg6hSHDklw4733pBGiy8uTvqMZMyKb4eLsWTm30QMYe/dKWqmWFEXSy+izL4YPl7/B6lNxiaKBpkm/snk2x4EDwUUN4+Plt2eezdHa/uNcjRxVlQ6KjRslvZTerw1I43niRJmRceWVXTp4n7qazye5aVatMqblKIpEsO66S75kYdRl9ZL8fsnlu2KFFIcBJC/i/PnyZSeKUUePyuyNd981cq4rivQ/3HKLzDLm6N5u6KmnZMMPHSrTL0JEJ8rLgWeflRS7gLQj7rpLZthFe70BovbSNODYMaPo+LZtxkw3XWqqBDf0IEdu7rn7bzsy8OjAAWM2xt69gY9nZcl+evJkYMIE/jajnabJuJtnn5Xb48ZJOipLF7L3+6Wza8UK44Syf3+p3fSVrzCYESb6OVR1tQxEYR2rYAxqEHUiv1+Kda1bJx2I5vRUl18uAY7Jk1uPxHfGtDKXKzCAsW9f4Ihss/79A2dgDBkiO0oi6houl/xG9dkcu3cHFvnT9e0bOJtj4EDg449DN3LKyyUwMn26jEIz1wFKSJCTovx8uU5K6qI/lKxB02RY4qpVwKefGstHjZJerClTwjYkN6w52DVNDrpLlxoHvD59ZJjx1Kk80SJq4vXKb3HNGum002VnG7M3cnIit37UyaqrgW98Q/L8Pfqo5B9r0tgonWqrVsk+GZDSSw8+yNmaRJoGHDxoBDl27JDfjFl2dmCQo+W+81wDj1wueW89kNFypsjw4UaR72HD2JTpjj75RMofNTbKud5vfiOzmrtcW51Qel7C556TERKApBm47z7p3IqaKSbRR5/tvn27nPt3yWz3KMSgBlGY1NVJrdZ16wJHW6SlSWfj9dfLwCl953Q+08o8Hmlw6cGLvXtl5xbq15qTE1gDY9iw0PnNiShyNA04cSIwZVWo33RiohScq66WOtBJSdJnUVMjyxoapFjgxRfLPueqq2Q/MmGCNQuVUwQcOSJFxd97z4jA9+kD3HmnnKSEIcIdlnywO3fKCOQ9e+R+eroUAL/lFkmQTUQhHT8u2eneeceon6YowKRJ0vfd1iAciiKrVwN//rPsG194AWpyKtatk/4pfULbmDFSN2P48MiuKpFV+Xxyrq0HOXbtCq6b16ePEeRobJTaCS0HHpWVGbU4z5wJfI+EBJlUOnmyDIbMzu7SP5EipKRECoiXlcn53C9+Idu/y7TWCfXII7JCzz5r5FpPSwPuvVdyZvGEMuz0uoR6n93Zs3IZPFj2I2GtSxhFGNQg6gJHjkhwY/36wFEYgwZJ31FyshzM2ppWNnmypLnSAxj79slB0O8P/v969DCCFyNGSACDqWWIotPZs9Jfqwc69uyR9HFffCEdTqFShiiK9Of+/vfA7NnsmKI2VFZKIe3XXzdyLaSmygnL7bdLzgMrKikBli2TpNOAkTPlrrs4BYmoA3w+mei0Zo3kbtdlZsrMjZtuYs72qObzyfSLI0ewddK38UzFXSgpkYf69gW+/W2ZpMdR4ETt5/FIm1wPcuzda5yTa5q02V0uGVSYkiJBjtpauXa5jIFHffsatTEuvZRjMWJVdTXwy1/KOB1FAf7jP6T0Xdj3y63lNjpxQr7k/ftLDuTERDmhZBu7SzQ0SProl1+WAQg2W+B3YdAg6dvz+2WAyrJlwLRpkVvfSGNQg6gL+f1ywqinp/J6peGze7ccNwYNkuOGosjxpL5ejilpaZIaSh9Ma5aeHjgDY/hwjuwg6s5UFXjpJeBHP5I2psslA2vi42X/kZ4ubVI2cqhDXC45OL3yiuQtAyQadt11MnsjIvPhQygvB/72N5lhomnS0r/lFpmdYdUADFGUOHlSZm+8/XZg6sKJE2X2xlVXMUgejY6u2Ym/fudzbK4dDYwYgZQeCZgzR+LW3J5EF07vhNy2TQYxvvNO6wOP4uNl+bPPAjfcwIAiCZ9PBqOtXSv3Z86UyRJhC3SFym3kchm5i10u6YT62c+kjR3JArHdnL7/2L5dLl9+KZunrs4YxJiUJMHQlBQZe+ZwcKaGjkENogipqwM+/BB48UXgrbeMho+eikMvHuz3y0Fu1CgZ7WGegTF8uATV2Rgiii36dNS0NJnppaqBaXzYyKHzpqpSsOXll6Ulrbv8chmhNXZsZA46dXUSzXv1VSNfwzXXyAjk/v27fn2IujGfT3J9r1kjteL0s8CMDOlouekm/uyiQU0N8PzzwBtvAOrBEthrqnDb+GO479XbkJbOkweicNiwQUp6ZWRIe7yhQSaTpqXJBeDAIwpN06SZ++c/y+3Ro6XmxgXHE1wumZldUSHXlZUSgfvrX43Its8XmA8tJUW+uKtX82SykzU2BgYx9u0z+v50fftKasg33wSOHQPy8lhTozXt7f/nGA6iTpaaKoNLk5LkxDEhQU4+9GOJzSajsBMSpEH0ox9JfxIDGEQ0ZowENnfskH2IuSGjaZK6buxYeR5Rh9hsUoAlP1+mEa5aJVMLP/1ULkOHysHommu6Zoiv2y1neC+9JAdDQHI0LFgglcaJqNM5HMDVV8ultFRmbrzzjvSHvPyyXMaNk3bslClMmWI1Xi/w2mvAypXGbvPKW3vi29t+hly1FNjVU6bdEFGny86W8/f4eEnj11J9vTzGzArUkqIAX/ua1Et84glphi9YIAXEBw9u8WRNkxkVepBCD1iYAxf6paEh+D+rqpIBQ05nYAdTerrknIyLk+hbywr21GGNjUa6uu3bJV1dyyBGnz5y7q5fevWS5VdeKRnCjhwBevYMTlP/yCOxHdDoCM7UIAqTliOu6+tlxoZeo5UjrokoFD0Nak1N6EbO009LvzTRBTt+XEZqrVsnQQZAWtuzZsmQ7XDk1/X7gXffBZYvl2qagAxTmj8fuOwyRviJupjPJyVs1qwB/v1vY/ZGejpw/fWSnio3N7LrGOs0TdoGf/2rkUVwyBApAj5uHCTfzUsvSe/JihXSs0pEnUrP6rNjh2Tu5Ohqi1JVKWJRUSERpjFjrLFB3G6gogLHvqjDTxZn4HipDU7NjZ/mb0R++k4jUFFVFdwz3hanU/7O7GxJ19rYCLzwgoy0TUmRIEZcnDFgiZ1Q583lkro6+kwMc80dXWtBjFDMtdw9Hjl0jxwpAQ2e6zP9FFHEseFDROeLjRzqUjU1Mg/61VeNhPtJSTJc+4472m6Rt5emAZs3A0uXygEQkPd94AFg+nQeCIks4NQpmb3x9ttGzBGQSVS33CLHH/aXd629e4FnnpGUFoD0Wz3wgAScmnebjY3AN78pnXgPPgjce2/E1peoO+PAI4szn0C53dLhP2IE8Oij4dkwmiZfhlAzKlrOrDDNqqjzJeKJw/dh69lhAIAHct7Gvb0Ljf4iRZHcVFlZRrCi5W39fmJi4DqxE6rTuN0SxDDPxGgZxOjdWwYX6EGM3r079n9YNQZnBQxqEFkAGz5EdL7YyKEu5/FIJcxXXgGOHpVldjswdaoUFR8y5Pzed9cuYMkSuQZk9Ng3vwncdht7SIksyO+XrHRr1sgsDv1sMTXVmL0xYEBk17G7Ky+XCRjr18t9p1MyBN59d3AfFgB54m9+IycbL7wA9OjRpetLFCs48Mii9I6X6moZNHMhHS9ud9vpn/Tb5zOroikY4c/IxjN7voJXvxgBxMVh6hUNeOx7bjhzMiWgEaoafXuxE+q8uN2STmr7dglk7N0rs1nNevUKDGLk5ERgRWMEgxpEFsGGDxERRRVNk57MV16Rlr1u/HjpVZs0KXDkV2sRuCNHpGLmxx/L85xOSW11990yJZ6ILO/0aam7sXatdLTrLrlEghvXXCM/beocDQ3AP/4hu1+PR5Zdd51MwOjZs40Xapp0Yu3eLbPffvrTLllfoljEgUcWo89O2L4dGDiw9dkJzz1n1KsIFaTQr0PVqmiNokigwDyTorXZFYmJQWlW16wBfv97GUwwfLgUEO+UmDQ7oc7J7Qa++MIIYuzZEzqIYU4nlZPDTLldhUENIgthw4eIiKLSvn3Su/bhh8ZotEGDZObGtGkS/Gg51T8vT04q9+6Vk0lFkRod993H0cNEUUpVgS1bgLfekkxy+u4gJUU63W++WXYNdH5UVYJHzz0ng38BOV946CHp6GqXffuA//gP2e/+6U/A6NFhW1+imMaT+/DTNOlhdrmkU97lknam2x28bM8eYPFimZEQFyfbx++X13u9xvNGjpQph+2hz6poLUihX6enG/UqztOOHcAvfiGlLrKzJbAxYsQFvaXg9zSAOYixfbvcbhnE6NFDZmLoszEYxIgcBjWIiIiIqHOUlUn+3bVrJX87ICdLhw/L7d695UTyxAlJzG+3A0OHSk/ngw8yVw1RN1JRIR3wa9bIz103erT85K+9lrM3OmLrVqmbUVIi9/v2Bb79bWDKlPPoTPnf/5WiKMOGSWVx9sYQda6urttgNaravkCDvky/3dqytp7T3q7KqioJ6jqdofd5mibvN3y4RN9b1qUIFbgIMasinEpLgZ/8RJrV8fHAY4/J2CE6fx5PcBDD6w18TnZ2YBCjTx8eNq2CQQ0iIiIi6lxnz0pPZkEB8NFHcj8pSfL/1tbKyDhNk5PeSZMkz3sMjwoj6s5UVTrk33oL+OQTo4BmcjIwY4YEOAYPjuw6WtnRoxJ32LxZ7qekAHPmALfffgEDf6urpVB4QwPw4x8DN97YWatLRJ1Zt6EzaZr04J4rgNDRoEKoYEXLoe1dwWaTz9rpNC7m+1VVwOuvSyDC6ZTn2+2yI42Lk/VvbARefhmYOLHr17+dGhpkloZ+TLj3XuCBB9jJ3l5er0za0Qt7794dOoihp5IaN04GEfDztSYGNYiIiIgoPD77THreXK7AE9yEBBnm5HBIkOPll+XMgYi6tcpKYN06iXmWlhrLR4wAbrlFZm+ELHAdg2pqgOefB954QwJDdjtw222Soa9TTnELCmTqR0YG8OKLEmUiogvT3roN//ynMZjD57uwAEJHlkWCOcjQMtCQkCBTDs53mfl9zxXl1bfNjh0yM7g928aiVBV49lmprQQAV10lJZJ4/AymBzH0mRi7dxu1qHRZWYGFvfv1YxAjWkQ8qFFcXIx58+Zh69atActLSkqwevVq5OXloaSkBPPnz0dGRka73pNBDSIiIiIL2LBB0krl5srQspoambGRlSWP+/3A8eNSKJzz54lihqYBxcUS3CgqMmZvJCVJ/eqbb5bMdLHI6wVeew1YuRKor5dlV14pqaZyczvxP/L5gG99Czh2DJg9WwpzENGF2b4duPtuiTz6/TI7wOeTXmg9vZHHIzMBEhPlvr4D7EoOR+cHFUIti4+3Vu+wPoumpgbo2dM6s2jO03vvSTZBn09K1f3611LfIZb5fMEzMVoGMTIzA4MY/ftb62tK7RfRoIYetJgwYQJavv2ECROaAx0lJSVYuHAhCgoK2vW+DGoQERERWYD55D7UKOD6es7UIIpxVVXAu+9KgOPECWP5sGEye2PqVAl2dHeaBmzcCCxZYsxiGTJEYg3jxoXpP/33v4GFC2UayHPPsa4R0YV6800ZzAEE57QBAus2ZGYGPqYonR9UCPUcp1N+87HKXO/E45HPdeRI4JFHoiqgofviC+BnP5NjaXo68N//DVxySaTXquv4fLIpt2+XQMbu3cGTkjIzjQDG2LEyQIBBjO4h4jM1AEBRlICgRklJCWbPnh0weyMzMxNVVVXtej8GNYiIiIgsoBtN9Sei8NI06ZRYs0Y69/WMdQkJxuyNYcO6Z0fE3r3An/8M7Nol97OzJUf69dd3wa7xJz+R5OyTJgFPPtk9P2CicNu3T+o1vP66tHkcDuksz8qSGRk2m1zcbhnQ8fTTEq00Bx8cDv7+uoqqAjt3AhUVssMdMyaq26Hl5RLY2L9fvkY//GH3LZXk88nPTQ9i7NoVHMTIyAgMYlx0EX9a3VV7+//PtwTZeSksLESWnpagSVZWFoqLizF+/PiuXBUiIiIiOl82G/DoozLV/8iR0FP9H3kkqk8kiahzKIr08Y0bJ/V133tPiosfPy6BjjVrZObCzTdLkKM7lIAoL5fse4WFct/pBO66Sya4dVlu9IceArZskcvmzZLriojOze0GPvxQAhl798oyp1OKgzc2ymwM84wITZPCQmPHSo8z2z6RY7N1qxnCvXoBf/wj8D//A3z0kaSkOnwYWLAg+iflmIMY27cDn38eHMRITzeKejOIQaF0aVCjuro65PLKysqQy91uN9ymb3VtbW04VouIiIiIOio/X0Yk6lP9z5yR0Ytjx0btVH8iCq+MDODOO6XUw+efS3Djo4+AAweA3/8e+MtfJC3VLbdIkfFo67xoaJACr6+8YuT6vu46yVrTs2cXr0z//sCsWZIG8M9/lhkbcXFdvBJEUaS0VNJMrV0L1NXJMocDuPZa4KtflXbO974n9Wo4mIO6SEIC8MtfSj2mFSuAggIJbPziF0BKSqTXrv18PuDLLwODGC5X4HPS0gKDGC0ngxO11KVBjda0FuxYtGgRnnjiia5dGSIiIiJqn/x84KqrutVUfyIKP0WRXcWYMTLh6733ZMbGkSPAO+/IJS9PZm/MmGH9jhtVlXV+7jnJfw7I3/bQQzKoO2K++U35cE+eBFavBr7+9QiuDJEFaZrUoHntNbnW06f36gXcdpvMvMjIMJ7PwRwUAYoC3HcfMHAgsGiRTMB76CHgN7+R+LUV+f3BQYzGxsDnpKUBl15qBDIGDmQQgzqm3TU1li5dioMHD7b6+IwZMzB9+vTAN29RU2Pp0qVYsmRJUE2NgoKCoNcCoWdq5ObmsqYGERERERFRN6JpkkN7zRrJ/KLPdHA6ga98RWZvjBplvQ6PrVuBZ54BSkrkft++wLe/DUyZYpF1fe896QVLTAReeEGCz0SxrrYWePttmZlRWmosnzRJZmVccUXrAzS6Wd0Gii779wM//alMEEpNlVkcEyZEeq0kiLF/vxHE2LkzOIiRmhpYE2PQIIscJ8lyoqpQ+KFDh5Bhjn63goXCiYiIiIiIure6OmD9eglwHDpkLB84UIIbM2ZI50gkHT0K/PWvUq4CkNkkc+YAt98uGWssQ9OA73wH2LNHcmE9/nik14gocvbulVoZ778PeL2yLCUFuOEG4NZbrTvsncikshL4+c+BL76QeNrDD8vEoq4MEPj9kjpy2zZjJkZDQ+BzUlONmRhjx8oMTAYxqD0sE9SoqqoKCFhMmDChOahRUlKCBQsWYP369e16PwY1iIiIiIiIYoOmSafNmjXABx8YRUTj4mT2xs03A5dc0rWdJDU1ktf8zTdlwLbdLp1J990nqTQsae9e4D/+Q27/+c8y5YUoVrjdsgN5/XWpTKwbOlSikFOnypQwoiji8UgmtPfek/u33irBjXAF1VVVghjbt0sgY+fO4CBGSkpgEGPwYAYx6PxENKhRWFiI9evXY/HixXjssccwadIkzJo1C4AEMpYsWYJJkyZhy5YtePzxx9s1SwNgUIOIiIiIiCgWnT0LbNggwQQ91RMAXHSRBDeuu05q9YaL1wu8+qpkcKqvl2VXXimppnJzw/f/dponnwTWrZMK7M88w54m6v5KS4E33pA0U+bC31OnSiRy5Ej+DiiqaRqwahWwdKncHjsWeOKJzgmwqypw8GBgEEM/9umSk4ODGMzERp3BEjM1OhuDGkRERERERLFL02Sw9VtvSZBDn73hcADXXCMBjksv7by+Sk0DNm4EliwxUu8PGSJFWseN65z/o0tUVkrh8IYG4LHHJN0OUXejqlLw+/XXAwt/9+4tQ9lbFv4m6gY2bwb++7+lhkWfPlJA/KKLOlb6xRzE2L4d2LEjOIiRlCTH13HjGMSg8GJQg4iIiIiIiLqthgYJbLz1lhQo1fXvL8GN66+/sP7LvXslW9OuXXI/Oxt44AF536jsyHn5ZYnOZGYCL74oPVRE3UFNDfDOO8GFvy+7TGZltFX4m6gbOHwY+MlP5OvvcgHx8cCpUxL4dzplkt6jjwL5+fJ8TQsMYuzcaUxo0iUlSTBED2IMGcKfEXUNBjWIiIiIiIgoJnz5pTF7o7FRljkcwJQpUlx83Ljg2RuqGnoka3k5sGwZUFgoz3M6gbvuAu6+G0hM7Nq/q1P5fMDcucDx4/IHffvbkV4joguzdy/w2mtSM0Mv/J2aahT+7tcvsutH1IVqaoAHH5T4ns8nAf6+fSXIcfo0kJAA3HOP1OPYsSN0EOOSSySAMW6cBDHs9oj8KRTjGNQgIiIiIiKimNLQALz/PrB2rfR36vr2ldkbM2fKRIWiIimyunevMZJ16FCpob19u3T6AFKr48EHgZ49I/LndL5PPwX+8z8l4rN8ufR6EUUTt1t+5G+8wcLfRCaqKj+BoiK5rShGram6OkknlZICXHyxPJaYKMF8vSbG0KEMYpA1MKhBREREREREMWv/fglurF8vwQ5AOmz69wc++UQCF716yejVsjLgxAnp6Bk6FLj6auA73wGGDYvs3xAW//mfEty4/HLgf/4n0mtD1D4nT0p6qVCFv7/6Vcmvw8LfFMO2b5cZhWlpMmPx+PHAx1VVjoE//rH8ZIYNYxCDrKm9/f+OLlwnIiIiIiIioi4xdCjwgx9IlqUPPgDWrAF275brs2el46e2Fjh2TNJzxMVJyo7UVOB3v+vGnT3f/S6wdasENvTgBpEVqap8R994I7jw9223SZopFv4mAiCpFN1uCdQnJ8v1mTMyIyMlRSYwnTghpWZGjoz02hJdOAY1iIiIiIiIqNtKSJC+zxtukIDGAw/IMq9XCqkCEsDIyZHOn/Jy4PPPJR1Ht9S/P/C1rwGrVgF/+hMwYYKMeCeyCr3w9xtvyDQq3WWXyRDzyy9nxWKiFrKzJXDhcklQIyVFLrr6eikgnp0duXUk6kxsuRAREREREVFMSEyUYqhDh0oGm+pq6QTKyZHAht8vo10rKiK9pmE2Zw7w3nuSn2T1aslZQhRJmiY1Mlor/H3bbVIch4hCGjNGsrDt2CHHOXM2Nk2TYuFjx8rziLoDBjWIiIiIiIgoJugjWT0eICtLLmYuV4yMZE1KAubNAxYvBl54QSqit/wwiLqCXvj79deBL780lg8bJrMyWPibqF1sNuDRR4GHHwaOHAF69pRZiS6XBDTS04FHHuEkJ+o+GNQgIiIiIiKimMCRrCYzZ0rh5b17gWXLgIULI71GFEtOnJDv3zvvGIW/4+KAa68Fbr8dGD6chb+JOig/H3j6aeCpp2TXfuaMBOrHjpWARn5+pNeQqPMomqZXWrK+9lY/JyIiIiIiIgqlqEhGstbUhB7J+vTTMdTx88UXwHe+I7f/8heJ+BCFi174+/XXpfC3LifHKPydnh6x1SPqLlQV2LlTUilmZ0ugnjM0KFq0t/+fQQ0iIiIiIiKKKUVFxkhWj0dGso4cGaMjWRctkvoaI0YA8+cDlZXsBaPOVVMDvP22zMzQC38rilH4+7LL+F0jIiIADGoQERERERERtYojWZtUVAA33QQcOCCV1B0OqWEwYoQkaI+5KA91Ck2TqOHrrwcX/r7xRuDWW1n4m4iIgrS3/581NYiIiIiIiCjm2GySZzzmffEFUFoKnD0L+P3A6NEyfWXHDsnTFVP5uOiC6YW/X3sN2L/fWD58uMzKuPZaFv4mIqILxqAGERERERERUSxSVcnDpShSy8DjAU6eBLKyZBT9yZPA734HXHVVjE5joXY7cQJ44w1g3brAwt9Tp0owg/VaiIioEzGoQURERERERBSLdu6UFEG9egE+H3DoEFBVJRdAgh4ffijFRiZPBgYMkEtOjgRCKLapKvCvf0mKqS1bjOV9+kh6KRb+JiKiMGFQg4iIiIiIiCgWVVRIuqCEBMBuBy66SIo6u1yyXFHk9ocfSjoqndMJ5OYaQY6BA+W1/fpJTQ7q3qqrjcLfp07JMhb+JiKiLsTWBhEREREREVEsys6WAIXLBSQnS9qprCx5TNOMWRt33CHLjhwBjh6VgMeBA3Ixs9uB/v2NYId+yc1lHYVop2nAnj1G4W+fT5anpkqh+VtuYeFvIiLqMgxqEBEREREREcWiMWOk1sGOHUBSUnBKqdpaYMIE4Gc/M0be+/1SWPzoUQlyHD5s3G5slOsjRwLfR1EkZdXAgRLkuOgi43ZSUhf8oXTe3G5gwwYJZpgLf48YAdx2Gwt/ExFRRCiapmmRXon2qq2tRXp6OmpqapCWlhbp1SEiIiIiIiKKbkVFwMMPS9qpnj0lFZXLBZw+LfUQnn4ayM8/9/tomrxGD2rol8OHjcLRofToETirQ09llZHRSX8gnZfjxyW9VMvC39OmSTCDhb+JiCgM2tv/z6AGERERERERUSwrKgKeekqKhns8QHw8MHKkFAhvT0CjLZomAZPDh430VfrtiorWX5eeHpzGasAACYKwSHl4nKvw9403AuyLISKiMGJQg4iIiIiIiIjaR1WBnTsl0JCdLampwl3s+exZI3WVOZVVWZkEQ0JJSpKZHOZZHQMHSnorFqc+P9XVwNq1MjOjvFyWKQpw+eVG4W8GkoiIqAswqEFERERERERE0cftDgx26JcTJ6SmRyjx8VKQvGUqq379AAfLiQbRNOCLL4A33ghd+PvWW2WGBhERURdqb/8/j+xEREREREREZB1OJzB0qFzMfD4JbJhndRw+DBw7JmmzDh6Ui5nNBvTvH5zG6qKLYrPAdVuFv7/6VeArX4nNz4WIiKJKWGZqFBcXo7CwEACwZcsWLFu2DBlNRb5KSkqwevVq5OXloaSkBPPnz29+7Fw4U4OIiIiIiIiIAqiqpKxqWaD86FGgoSH0axQF6N07uED5gAFASkpXrn3X0At/v/OOpP0CZHbL1KkSzBg+PKKrR0REBER4pkZhYSEee+wxAMDixYsxbdo0bN26FQAwe/bs5tslJSWYN28eCgoKwrEaRERERERERNTd2WxA375ymTzZWK5pUiPEPKtDD3rU1EggpKwM+PTTwPfLzg6e2TFwoBQvj6baEnrh79deAz77zFjepw9w223ADTew8DcREUWlTp+pUVxcjGnTpqGqqgqABC4GDx6Mg01TQM1BDQDIzMxsfu65cKYGEREREREREV2w6mqjboc56HHmTOuvSU0NLlA+YADQs6e1gh0s/E1ERFEqYjM1xo8fj2XLljXfr66uBgBkZWXhlVdeQVZWVsDzs7KyUFxcjPHjx3f2qhARERERERERBcvIkMuYMYHLGxqCC5QfOQKUlgJ1dcCuXXIxS0w0UleZgx59+8oskgulqsDOnTLrJDtb1rnl++qFv19/HfjwQ6Pwd1oacOONLPxNRETdSljST82aNav59qpVqzB9+nRkZGQ0BzhaqqysDLnc7XbD7XY336+tre3U9SQiIiIiIiIiapaUBIwcKRczt1vqUrRMZXX8ONDYCOzbJxezuDggNzc4lVX//vJYexQVAU89BezdK+vgdEpR70cfBfLzAZfLKPx94IDxuhEjgNtvl8Lf8fHn/3kQERFZUFiCGrrq6mqsXr06IN1Ua88LZdGiRXjiiSfCsGZERERERERERO3kdAKDB8vFzOcDTp4Mntlx9KgEIUpK5GKm1wBpmcrqoouAhATjeUVFwMMPSzqpXr3kMZcL2LEDWLAAuP56YP9+oL5enh8fD0ybJvUyWPibiIi6sXYHNZYuXdpcFyOUGTNmYPr06QHLFi5ciPXr1yMjIwMAkJGRETQro7Kysvnxlh5//HE88sgjzfdra2uRm5vb3lUmIiIiIiIiIgofh0OCERddJDMndJomRchbFig/ckSCEMePy+XjjwPfr3dvCXbk5gIvvQScPg3k5cn/A0gQxeeTQMkLLwAXXwz06yeBjJkzWfibiIhiQqcXCtctXrwYs2bNQl5eXvNMjMrKypCFwg8dOtRqYMOMhcKJiIiIiIiIKGppGlBZGVigXL9tzmJRVyc1MhwOwG6Xa0UBvF553O+XFFZ/+ANw770s/E1ERN1CxAqFA8Dq1asxfvz45oDGK6+8gvnz5wcFLkpKSjBx4sR2BTSIiIiIiIiIiKKaokix7+xsYPz4wMdqa43ZHO+9J6ml4uON2RmABDiys4HMTKC8XIp/M6BBREQxptODGiUlJZg9e3bAsoyMDMyfPx8AUFBQgIULF2LSpEnYsmULCgoKOnsViIiIiIiIiIiiS1oacMklcunfXwIbaWlAYqLU0vD7gZQUCWLU10vAIzs70mtNRETU5cKWfiocmH6KiIiIiIiIiLo9VQXuuEOKgg8YEDgbQ9NkNsfYscA//ymFx4mIiLqB9vb/88hHRERERERERGQlNhvw6KNAerpRXNzvl+sjR2T5I48woEFERDGJRz8iIiIiIiIiIqvJzweefhq49FKpt3H8uFyPHSvL8/MjvYZEREQREZZC4UREREREREREdIHy84GrrgJ27gQqKqSGxpgxnKFBREQxLaqCGnr5j9ra2givCRERERERERFRF8nLkwsAnD0b2XUhIiIKE73f/1xlwKMqqFFXVwcAyM3NjfCaEBERERERERERERFRZ6urq0N6enqrjyvaucIeFqKqKk6ePInU1FQoihLp1bGM2tpa5Obm4tixY21WhafI4nYS/Bysj9vIOrgtrI3bx8DPwvq4jSKDn7v1cRsF4udhXdw21sFtYV3cNgZ+FtbHbRSapmmoq6tD3759YWsj1WJUzdSw2Wzo379/pFfDstLS0vgjiALcToKfg/VxG1kHt4W1cfsY+FlYH7dRZPBztz5uo0D8PKyL28Y6uC2si9vGwM/C+riNgrU1Q0PHylJERERERERERERERBQVGNQgIiIiIiIiIiIiIqKowKBGN+B0OvHLX/4STqcz0qtCbeB2EvwcrI/byDq4LayN28fAz8L6uI0ig5+79XEbBeLnYV3cNtbBbWFd3DYGfhbWx210YaKqUDgREREREREREREREcUuztQgIiIiIiIiIiIiIqKowKAGERERERERERERERFFBQY1utjs2bORmZmJCRMmYPDgwRg8eDAWLlzY6nP057V8zoIFC6AoCkpKSoL+j+rqaiiKgtmzZ4f1b+nOuJ0EPwfr4zayDm4La+P2MfCzsD5uo8jg52593EaB+HlYF7eNdXBbWBe3jYGfhfVxG1kPgxoR8Pjjj2Pr1q04ePAgtm7diurqasyYMSPgOfPnz8fWrVubn1dSUoIFCxYEPCcvLw+rV68Oev+lS5ciLy8vYFlJSQlmzJiBwYMHB/04MjMzAy788QgrbaelS5dCUZSgS2FhYSf+xaFZ6XMAgOLi4uaDw4wZM0IeCGKN1baR+bEZM2agurq6c/7QKBCJbQHI7yLUZ93WdopFVts+53osnKz2WRQWFmLw4MHIzMyMuf1Ga6y2jfTl3f34a7XP3fy61k6AY43VtlGkz6Ws9nkAwOLFi1vtzIklVto2kTyftAKrnS8BkWsDWo3Vtk0k26RW+yxipe3XEVbbRubXxWI7kUGNCMvIyMCTTz55zsbEk08+iVdeeSVg2axZs7BkyZKg565atQqzZs0KWDZjxgwsXLgQBw8exIwZM4J+dIcOHUJVVRWqqqpQUFBwnn9N9xXp7TR//nxomtZ8qaqqwvTp0zF9+vQL/Ms6JtKfAwBMmzYNy5Ytw8GDB7Fw4cKg73Ksi/Q2qq6uxoQJE/Dkk0/i4MGDmD17NubNm3eBf1V06qptsWDBAixatCjk/3OufX8ss8L2aeuxrhTpz6K6urp5n1FVVYXx48dj2rRp5/nXdE9W2Ebz5s1DQUFB8/4kFgKlkf7cddXV1ViyZAkyMjI69gfEAKtsI6ucS1nh81iwYAEqKiqaO3OefPLJ8/hLup9IbxurnE9aQaTPlwDrtAGtJtLbxkptUit8FrHY9uuISG8jXSy3ExnUiDB9R/HYY4+d83ktZWdnIy8vD8XFxc3L9Kjc4MGDm5fpj+sNlvnz5+Ozzz6L+REBHWG17TRt2rSQO8Bwi/TnUFJSgqysLIwfP775OZWVlRf0N3U3kd5GhYWFyMvLa95G8+fPx+rVq2Nyf9MV2wIAlixZErIDhfv+tkV6+5zrsa4U6c+ipKQkYCTvk08+ieLi4pgbadSWSG+jjIwMbNiwoflkKS8vLyb2JZH+3HULFy7EggULkJWV1YG1jw1W2UZWEenPo6SkBK+88gqys7ObZ2qY3y+WRXrbtBSp80kriPT5EhA9+5SuFultY6U2aaQ/i1ht+3VEpLeRLpbbiQxqRMCiRYuap7PpU9raGsFSXFyM2bNn4/HHHw96bPbs2QGNkSVLlgRNayopKQmavpSXlxewY549e3ZMpoppixW3EyDTyiZOnBhyqnE4WOlzyMvLQ0ZGBpYuXYrq6mosXrw4JkcXtWSlbQQg5ME0Vjonu3pbtKW9+5RYYqXtE2lW+izGjx8fsC/Xv6NddZyzKittIwDNJ7UlJSVYtGhRt00pY7XPvaSkBIWFhZg/f36HXtedWW0b6e8TqXMpK30excXFqK6uRl5eHrZu3YqFCxfG9MheK20bs64+n7QCq50vkcFK2ybSbVIrfRZA7LT9OsJq2yjW24kMakTA448/3jydbevWrSgoKAj64i5durS5sMzChQvx5JNPhoz+zZ8/P2Aa09KlS3HnnXcGPKeysjLkNCR9hHteXh4WLFjQnCqGKR+E1baTbuHChV16MLHa57BhwwYsXLgQgwYNwpIlS7Bs2bJO+Cujm5W20fTp01FYWNh8kF26dGnzY7Ggq7dFW9q7T4klVto+kWblz6K1/yfWWHEbLViwAIMHD0ZWVla3PXmy2ue+YMECpu9pwWrbKNLnUlb6PPS2h546Y/78+aisrIzZjlwrbRuzrj6ftAIrnS9RICtvm65uk1rxs4iFtl9HWG0bxXo70RHpFYh148ePx/r165GZmYkFCxYEpGxp7xdT70TUb7f8wmdlZQWNGNLT+ADA1q1bm5ffeeedWLBgQfN0MxJW2E6AFK3KysqK2KiaSH8Oer2GrVu3Ii8vD4WFhZgwYQIOHjx4wX9bdxHpbZSRkYElS5ZgwoQJmDhxYvPovIkTJ17YHxaFumJbtKU9+5RYFuntYyVW+iwWL17cnJ+WDFbZRkuWLMGSJUuaT9bMbcjuKNKfu15AsmVuZTJEehsB1jqXivTnEeo8JSsrK+RI01gT6W2ji/T5pBVE+nyJWmelbRPpNqlVPotYa/t1RKS3EduJnKlhGRcyFXHBggXNORnvuuuudr23Pi24JY4caFukt1NBQYEldliR+hz0eg36Z6JPDWWBtWCR/K7Onz8fVVVVWL9+ffPU9mjt7O0M4dwWHf1/W9v3x7JIbR8rivRnsWDBAgY0ziHS20g3f/58FBcXx8zxN1Kf+5YtW1BSUoLBgwdj8ODBKCkpwYwZM5pnQZLBKr8Nq5xLRerzGD9+fND/W1lZybaHSaS/q1Y5n7SCSJ/bU+sivW2s1CaN9Gehi7W2X0dEahuxncighiUsXboUJSUl510bYPr06c07l1ANFD1aqEfxli5d2hwBLCwsDJh6umTJkqgebRpOkdxOus8++yyoGFxXi+TnMH78eHz22WfNO/Xi4mJUVlbG5CyAtkT6u6pvH71wlhUag5ES7m3RlvbsU2JdJLeP1UT6s1iwYAFmzJjBae1tiOQ2KiwsDDhBWrp0KTIyMmLi+BvJz/3JJ5/EwYMHmy8AsH79ev5OWoj0b8Nq51KR/Dzy8vIwceLE5v3F0qVLAwYkxbpIH2sBa5xPWkGkz5eodZHeNlZqk0a6rzBW234dEcltxHYi009FxKJFi7Bq1SoA0uk3fvx4bN269YIOcAsXLmyzKN369euxYMECLFy4EOPHj0dBQQEA4wc0YcKE5nXRH4t1VtpOukiM7rDS55CXl4eCggLMnj27eVr/hg0bYr5xaKVtBEgnTGFhITIyMvD4449HfWdvR0RiWyxcuLB5xMyECRMCtse59imxxmrbp63Hws1Kn4V+0tRyVNHWrVubG/KxyErbaPr06Vi6dGlzR1h3Pv5a6XOn0Ky0jaxwLmWlzwNAc1v9ySefRF5eHjZs2HDe6xHtrLZt9PWIxSCT1c6XuN83WGnbRLpNaqXPIpbafh1hpW1EgKJpmhbplSAiIiIiIiIiIiIiIjoXpp8iIiIiIiIiIiIiIqKowKAGERERERERERERERFFBQY1iIiIiIiIiIiIiIgoKjCoQUREREREREREREREUYFBDSIiIiIiIiIiIiIiigoMahARERERERERERERUVRgUIOIiIiIiIiIiIiIiKICgxpERERERERERERERBQVGNQgIiIiIiIiIiIiIqKowKAGERERERERERERERFFBQY1iIiIiIiIiIiIiIgoKjCoQUREREREREREREREUeH/A0JV0pkLVeFSAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Optimization with adam optimizer (single initial)\n", + "\n", + "# Set initial knob valurs\n", + "\n", + "kn = torch.zeros_like(error_kn)\n", + "\n", + "# Normalize\n", + "\n", + "kn, *_ = forward([kn], [(-0.25, 0.25)])\n", + "\n", + "# Perform optimization\n", + "\n", + "kn = adam(objective, kn, dataloader, count=64, lr=0.005)\n", + "\n", + "# Transform normalized result\n", + "\n", + "kn_out, *_ = inverse([kn], [(-0.25, 0.25)])\n", + "\n", + "# Plot quadrupole settings\n", + "\n", + "plt.figure(figsize=(16, 2))\n", + "plt.bar(range(len(error_kn)), error_kn.cpu().numpy(), color='red', alpha=0.75, width=1)\n", + "plt.bar(range(len(kn_out)), +kn_out.cpu().numpy(), color='blue', alpha=0.75, width=0.75)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "# Compare twiss\n", + "\n", + "print((twiss_error - twiss(ring, [0.0*kn_out], ('kn', ['Quadrupole'], None, None), alignment=False, matched=True, advance=True, full=False, convert=True)).norm())\n", + "print((twiss_error - twiss(ring, [1.0*kn_out], ('kn', ['Quadrupole'], None, None), alignment=False, matched=True, advance=True, full=False, convert=True)).norm())\n", + "\n", + "# Plot beta beating\n", + "\n", + "plt.figure(figsize=(16, 2))\n", + "\n", + "_, bx_model, _, by_model = twiss(ring, [0.0*kn_out], ('kn', ['Quadrupole'], None, None), alignment=False, matched=True, advance=True, full=False, convert=True).T\n", + "plt.plot(ring.locations().cpu().numpy(), 100*((bx_model - bx_error)/bx_model).cpu().numpy(), color='red', alpha=0.75, marker='o')\n", + "plt.plot(ring.locations().cpu().numpy(), 100*((by_model - by_error)/by_model).cpu().numpy(), color='blue', alpha=0.75, marker='o')\n", + "\n", + "_, bx_model, _, by_model = twiss(ring, [1.0*kn_out], ('kn', ['Quadrupole'], None, None), alignment=False, matched=True, advance=True, full=False, convert=True).T\n", + "plt.plot(ring.locations().cpu().numpy(), 100*((bx_model - bx_error)/bx_model).cpu().numpy(), color='red', alpha=0.75, marker='x')\n", + "plt.plot(ring.locations().cpu().numpy(), 100*((by_model - by_error)/by_model).cpu().numpy(), color='blue', alpha=0.75, marker='x')\n", + "\n", + "plt.xticks(ticks=positions, labels=['BPM05', 'BPM07', 'BPM08', 'BPM09', 'BPM10', 'BPM11', 'BPM12', 'BPM13', 'BPM14', 'BPM15', 'BPM16', 'BPM17', 'BPM01', 'BPM02', 'BPM03', 'BPM04'])\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "21397cad-2366-4cc4-b36f-e0d703652d01", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(0.0355, dtype=torch.float64)\n", + "tensor(6.5866e-09, dtype=torch.float64)\n" + ] + } + ], + "source": [ + "# To improve accuracy of a selected soolution, several Newton optimization steps can be performed\n", + "\n", + "kn = newton(objective, kn, dataloader, count=4, lr=1.0)\n", + "kn, *_ = inverse([kn], [(-0.25, 0.25)])\n", + "\n", + "# Plot quadrupole settings\n", + "\n", + "plt.figure(figsize=(16, 2))\n", + "plt.bar(range(len(error_kn)), error_kn.cpu().numpy(), color='red', alpha=0.75, width=1)\n", + "plt.bar(range(len(kn)), +kn.cpu().numpy(), color='blue', alpha=0.75, width=0.75)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "# Compare twiss\n", + "\n", + "print((twiss_error - twiss(ring, [kn_out], ('kn', ['Quadrupole'], None, None), alignment=False, matched=True, advance=True, full=False, convert=True)).norm())\n", + "print((twiss_error - twiss(ring, [kn], ('kn', ['Quadrupole'], None, None), alignment=False, matched=True, advance=True, full=False, convert=True)).norm())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c45da173-2e24-48b2-9208-68b8febf71c8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1024, 28])\n" + ] + } + ], + "source": [ + "# Optimization (multiple initials)\n", + "# Note, newton optimizer is also vmappable over initials\n", + "\n", + "kns = torch.rand((1024, nq), dtype=torch.float64)\n", + "kns = torch.vmap(lambda kn: adam(objective, kn, dataloader, count=64, lr=0.005), randomness='same', chunk_size=1024)(kns)\n", + "print(kns.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "15a84163-fe40-42b5-8566-65c3299a97ab", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjUAAAGGCAYAAAAzegNcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAen0lEQVR4nO3dz04jx/o/4HeORmIV6PjsosOmcwdgriCeJTuTXAFmfxZYrI6yQuM7YOYKBnvHkr4DRN9BaoOUXRzjrNBXCr/FaPwLA8zA0NgUPI/UCl1dUO8cneKPP66qV5eXl5cBAAAAAADwxP1r0QUAAAAAAADchVADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIwutFF/Alf//9d/z+++/x3XffxatXrxZdDgAAAAAA8AguLy/jr7/+ih9++CH+9a/b12M86VDj999/j9XV1UWXAQAAAAAAzMHZ2Vn85z//ufX5kw41vvvuu4j4+I9YXl5ecDUAAAAAAMBjmE6nsbq6OssFbvOkQ41PW04tLy8LNQAAAAAA4Jn72lEUDgoHAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACyINQAAAAAAACy8HrRBcBTsLk53/GOjuY7HgAAAADAc2ClBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkIXXiy4AXqLNzfmOd3Q03/EAAAAAAB6DlRoAAAAAAEAW7hVq1HUd6+vrX+zT7/djMpnM7lNKMRgMYjQaxWAwuPIMAAAAAADgru4caoxGo4j4GGzcpq7rGAwGV9q2trZid3c3ut1udLvd2N7e/sZSAQAAAACAl+zOZ2p0u92v9kkpRVmWV+7/qSzLqKrqHuUBAAAAAAB81NiZGqPR6FrwUVVVtFqtK22tVuuLqz0AAAAAAABucueVGl8ymUyiKIob228yHo9vbL+4uIiLi4vZ/XQ6baI8AAAAAADgGWhkpcbh4WF0Op07978t7Njf34+VlZXZtbq62kR5AAAAAADAM/DgUKOqqvj5559vfFYUxbVVGePx+MZVHRERe3t7cX5+PrvOzs4eWh4AAAAAAPBMNLL91OHh4ezjlFLs7+/HL7/8Ep1OJw4ODq71b7fbN36dpaWlWFpaaqIkAAAAAADgmfmmUOOfZ2h8vu3Uzs5O7OzsRFmW1z4vpRTtdvvWlRoAAAAAAAC3ufP2U1VVRb/fj4iPZ1+MRqMrzyeTSQwGg4iIePv2bdR1HRERw+Ew+v1+jEajODg4iOFw2FTtAAAAAADAC/Lq8vLyctFF3GY6ncbKykqcn5/H8vLyosvhGdvcXHQFj+voaNEVAAAAAADc7q55wIMPCgcAAAAAAJgHoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJAFoQYAAAAAAJCF14suAG6yubnoCgAAAAAAeGqs1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALIg1AAAAAAAALLw+j6d67qO7e3tOD09vdZeVVVERJycnMT79++jKIqIiEgpxWg0irIsI6UUvV5v9gwAAAAAAOCu7hxqfAom6rq+9qyqqtjd3Y2IiMFgED/99NMs+Nja2pp9nFKK7e3tGA6HTdQOAAAAAAC8IHfefqrb7cba2tq19rquY39//0q/uq4jpRQppSt9y7KcregAAAAAAAC4jwefqbG2thbv37+f3U8mk4iIaLVaUVVVtFqtK/1brdaNqz0AAAAAAAC+5F5natym2+3OPv7w4UN0Op0oimIWcHxuPB7f2H5xcREXFxez++l02kR5AAAAAADAM/DglRr/NJlMYjQaffXMjNvCjv39/VhZWZldq6urTZYHAAAAAABkrNFQo9/vx/HxcRRFERERRVFcW5UxHo9nzz+3t7cX5+fns+vs7KzJ8gAAAAAAgIw1FmoMBoPo9/tRlmVMJpOYTCbR6XRu7Ntut29sX1paiuXl5SsXAAAAAABAxDeGGp9vHzUajWJtbW0WaBweHkZRFFGW5ZV+KaVot9u3rtQAAAAAAAC4zZ0PCq+qKo6PjyPi49kXGxsb0e12I6UUW1tbV/oWRRG9Xi8iIobDYfT7/djY2IiTk5OvnrcBAAAAAABwk1eXl5eXiy7iNtPpNFZWVuL8/NxWVC/M5uaiK3hejo4WXQEAAAAAwO3umgc0elA4AAAAAADAYxFqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWXh9n851Xcf29nacnp5eaU8pxWg0irIsI6UUvV4viqL46jMAAAAAAIC7unOo8SmYqOv62rOtra1Z0JFSiu3t7RgOh199BgAAAAAAcFd3DjW63e6N7SmlK/dlWUZVVV99BgAAAAAAcB8PPlOjqqpotVpX2lqtVtR1/cVnAAAAAAAA93GvMzVuMplMbmwfj8dffHaTi4uLuLi4mN1Pp9OHlgcAAAAAADwTD16pcZvbAo0vPdvf34+VlZXZtbq6+jjFAQAAAAAA2XlwqFEUxbWVF+PxOIqi+OKzm+zt7cX5+fnsOjs7e2h5AAAAAADAM/HgUKPT6dzY3m63v/jsJktLS7G8vHzlAgAAAAAAiPjGMzUmk8lstUVZlleepZSi3W7PVmrc9gwAAAAAAOA+7hxqVFUVx8fHEfHx7IuNjY3odrsRETEcDqPf78fGxkacnJzEcDicfd6XngEAAAAAANzVq8vLy8tFF3Gb6XQaKysrcX5+biuqF2Zzc9EVPC9HR4uuAAAAAADgdnfNAx58pgYAAAAAAMA8CDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsCDUAAAAAAIAsvF50AcDj29yc73hHR/MdDwAAAAB4GazUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsvC6qS+UUoqqqqLVakVKKbrdbpRlOXs2Go2iLMtIKUWv14uiKJoaGgAAAAAAeAEaCzVGo1Hs7u7O7nd2duLg4CAiIra2tuL09DQiPgYc29vbMRwOmxoaAAAAAAB4ARrbfurDhw83tqeUrtyXZRlVVTU1LAAAAAAA8EI0Fmq0Wq1YX1+fbUP15s2biIjZllSf963ruqmhAQAAAACAF6CxUOPTdlI//vhjDIfD6Ha7ERExmUxu7D8ej5saGgAAAAAAeAEaO1Ojqqp4+/ZtpJRiZ2cnImJ2psZNbgo7Li4u4uLiYnY/nU6bKg8AAAAAAMhcIys1UkpxcnISnU4ner1e/Pbbb3F4eBgppSiK4tqqjPF4HEVRXPs6+/v7sbKyMrtWV1ebKA8AAAAAAHgGGgk16rqOjY2N2X1ZlrG3txeTySQ6nc6Nn9Nut6+17e3txfn5+ew6OztrojwAAAAAAOAZaCTUWFtbi5OTkyttf/zxR6ytrUVZllfaU0rRbrdvXKmxtLQUy8vLVy4AAAAAAICIhs7UKMsy3rx5E4PBYBZWfDpXI+LjIeL9fj82Njbi5ORkdqg4AAAAAADAXb26vLy8XHQRt5lOp7GyshLn5+dWbbwwm5uLroCHODpadAUAAAAAQE7umgc0sv0UAAAAAADAYxNqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWRBqAAAAAAAAWXi96ALIw+bmoisAAAAAAOCls1IDAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIwutFFwDwUJub8x3v6Gi+4wEAAAAAHzUaalRVFSmlKMsyIiI6nU5ERKSUYjQaRVmWkVKKXq8XRVE0OTQAAAAAAPDMNRZqVFUVw+EwDg4OIqUUb968id9++y0iIra2tuL09DQiPgYc29vbMRwOmxoaAAAAAAB4ARoLNXZ2dmbBRVmWcXx8HBEfQ4x/KssyqqpqalgAAAAAAOCFaOSg8JRSjMfjKIoi6rqOyWQy24KqqqpotVpX+rdarajruomhAQAAAACAF6KRUKOu62i1WrNzM969exej0SgiIiaTyY2fMx6Pr7VdXFzEdDq9cgEAAAAAAEQ0tP3UeDyOlFJ0Op0oiiJ6vV58//33cXl5eevn3BR27O/vx6+//tpESQAAAAAAwDPTyEqNsiyjKIooiiIiYvbfuq6jKIprqzI+bVX1ub29vTg/P59dZ2dnTZQHAAAAAAA8A42FGrfpdDo3trfb7WttS0tLsby8fOUCAAAAAACIaGj7qbIso91ux2QyiaIoIqUUZVnG2tratb4ppWi32zeu1AAAAAAAALhNI6FGRMRwOIx+vx/r6+txenoax8fH155tbGzEyclJDIfDpoYFAAAAAABeiFeXXzrNe8Gm02msrKzE+fm5ragWbHNz0RWQk6Oj+Y437/9/zvvfBwAAAADP3V3zgEbO1AAAAAAAAHhsjW0/BfCJlT0AAAAAwGOwUgMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMiCUAMAAAAAAMjC60UXAJCbzc35jnd0NN/xAAAAAOCpslIDAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIglADAAAAAADIwutFFwDA07K5Od/xjo7mOx4AAAAA+bJSAwAAAAAAyMKjhBr9fj8mk8nsPqUUg8EgRqNRDAaDK88AAAAAAADuovFQo67rGAwGV9q2trZid3c3ut1udLvd2N7ebnpYAAAAAADgmWs81EgpRVmWV+7/qSzLqKqq6WEBAAAAAIBnrtFQYzQaRbfbvdJWVVW0Wq0rba1WK+q6bnJoAAAAAADgmXvd1BeaTCZRFMWN7TcZj8fX2i4uLuLi4mJ2P51OmyoPAAAAAADIXGMrNQ4PD6PT6dy5/01hx/7+fqysrMyu1dXVpsoDAAAAAAAy10ioUVVV/Pzzzzc+K4ri2qqM8Xh846qOvb29OD8/n11nZ2dNlAcAAAAAADwDjW0/dXh4OPs4pRT7+/vxyy+/RKfTiYODg2v92+32tbalpaVYWlpqqiQAAAAAAOAZaSTU+HzbqZ2dndjZ2YmyLK/1TSlFu92+caUGAAAAAADAbRo7UyPi4zkZg8EgIiLevn0bdV1HRMRwOIx+vx+j0SgODg5iOBw2OSwAAAAAAPACvLq8vLxcdBG3mU6nsbKyEufn57G8vLzocl60zc1FVwAv19HRfMeb93yf978PAAAAgKfnrnlAoys1AAAAAAAAHotQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyIJQAwAAAAAAyMLrRRcAwJdtbi66AgAAAAB4GqzUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsiDUAAAAAAAAsvC6qS9U13VUVRUREScnJ/H+/fsoiiIiIlJKMRqNoizLSClFr9ebPQMAAAAAALiLxkKNqqpid3c3IiIGg0H89NNPcXp6GhERW1tbs49TSrG9vR3D4bCpoQEAAAAAgBegke2n6rqO/f392X232426riOlFCmlK33Lspyt6AAAAAAAALirRkKNtbW1eP/+/ex+MplERESr1YqqqqLVal3p32q1oq7rJoYGAAAAAABeiMa2n+p2u7OPP3z4EJ1OJ4qimAUcnxuPx9faLi4u4uLiYnY/nU6bKg8AAAAAAMhcY6HGJ5PJJEaj0ewMjS/1+9z+/n78+uuvTZf0LG1uLroCgGY89+9nR0eLrgAAAADg+Whk+6l/6vf7cXx8HEVRREREURTXVmWMx+PZ83/a29uL8/Pz2XV2dtZ0eQAAAAAAQKYaDTUGg0H0+/0oyzImk0lMJpPodDo39m2329falpaWYnl5+coFAAAAAAAQ0eD2U6PRKNbW1maBxuHhYfR6vWsrMlJK0W63b1ypAQAAPE3z3i7Q9n0AAMBNGgk1UkqxtbV1pa0oiuj1ehERMRwOo9/vx8bGRpycnMRwOGxiWAAAAAAA4AVpJNQoyzIuLy+/+Pzt27cREdHtdpsYEgAAAAAAeGEaPygcAAAAAADgMQg1AAAAAACALAg1AAAAAACALDRypgYAADBfm5uLrgAAAGD+rNQAAAAAAACyINQAAAAAAACyINQAAAAAAACy4EwNAHhE897z/uhovuMBAAAAzJOVGgAAAAAAQBaEGgAAAAAAQBaEGgAAAAAAQBaEGgAAAAAAQBaEGgAAAAAAQBaEGgAAAAAAQBaEGgAAAAAAQBaEGgAAAAAAQBZeL7oAACBfm5vzHe/oaL7jwX3Mez4AAAC8RFZqAAAAAAAAWbBSAwCeEe8Ub5aVKAAAAPC0WKkBAAAAAABkQagBAAAAAABkwfZTAADMhe3RAAAAeCgrNQAAAAAAgCxYqQEA8EQ4mBz+v+e+ssf8AwCAb2OlBgAAAAAAkAWhBgAAAAAAkAWhBgAAAAAAkAVnagAA2Xjue+wDAAAAX2alBgAAAAAAkAUrNQAAXigrXwAAAMiNlRoAAAAAAEAWhBoAAAAAAEAWhBoAAAAAAEAW5nKmRkopRqNRlGUZKaXo9XpRFMU8hgYAAAAAAJ6JuYQaW1tbcXp6GhEfA47t7e0YDofzGBoAAAAAAHgmHn37qZTSlfuyLKOqqsceFgAAAAAAeGYefaVGVVXRarWutLVarajrOtbW1h57eAAAgCdnc3PRFTwvR0eLrgAAyN28fz/z+8u3e/RQYzKZ3Ng+Ho+vtV1cXMTFxcXs/vz8PCIiptPpo9SWs//7v0VXAAAA8DT4kxEAeKh5v97q95frPuUAl5eXX+w3lzM1bnJT2LG/vx+//vrrtfbV1dU5VAQAAECOVlYWXQEAwP34/eV2f/31V6x84X+gRw81iqK4tipjPB5HURTX+u7t7cV///vf2f3ff/8d4/E4/v3vf8erV68eu9TGTafTWF1djbOzs1heXl50OcAjMt/h5TDf4eUw3+HlMN/h5TDf4em6vLyMv/76K3744Ycv9nv0UKPT6cTBwcG19na7fa1taWkplpaWrrTdFH7kZnl52TdJeCHMd3g5zHd4Ocx3eDnMd3g5zHd4mr60QuOTfz12EWVZXrlPKUW73X4WYQUAAAAAADA/czlTYzgcRr/fj42NjTg5OYnhcDiPYQEAAAAAgGdkLqFGWZbx9u3biIjodrvzGPJJWFpaiv/973/XttQCnh/zHV4O8x1eDvMdXg7zHV4O8x3y9+ry8vJy0UUAAAAAAAB8zaOfqQEAAAAAANAEoQYAAAAAAJCFuZyp8dyllGI0GkVZlpFSil6vF0VRPLgv8PTcZw7XdR1VVUVExMnJSbx//958h4x868/sfr8fe3t75jtk4r5zvaqqSClFWZYREdHpdOZUKfBQ9/3bvaqqaLVakVKKbrc7m/fA01fXdWxvb8fp6ekX+3mdDvLkTI0GrK+vz75JppSi3+/HcDh8cF/g6bnPHB4MBrG7uzv7+MOHD1/9hQp4Or7lZ3Zd17G+vh5//vmnP4YgE/eZ61VVxXA4jIODg0gpxZs3b+K3336bZ7nAA3zr7/IRETs7O3FwcDCXOoGH+RRSrK+vx9de9vQ6HeTJ9lMPlFK6cl+W5eyd2Q/pCzw995nDdV3H/v7+7L7b7UZd19e+BvA0fevP7H++ext4+u4713d2duLt27ezvsfHx49aH9Cc+873Dx8+PHZJwCPpdruxtrb21X5ep4N8CTUe6NNy1H9qtVpR1/WD+gJPz33m8NraWrx//352P5lMZv2Bp+9bfmaPRqPodruPXRrQoPvM9ZRSjMfjKIoi6rqOyWQixISM3Pdne6vVivX19dk2VG/evJlHmcAceZ0O8iXUeKBPL1R+bjweP6gv8PTcdw7/88XNDx8+RKfTsR0NZOK+830ymZjfkKH7zPW6rqPVas22tHj37l2MRqNHrhBoyn1/tn/afubHH3+M4XDojQvwDHmdDvLloPBHcts3xof2BZ6er83hyWQSo9HIeRrwDNw23w8PD6PX6823GODR3DTXx+NxpJRmb1Lo9Xrx/ffff3WvbuBpu+1ne1VV8fbt20gpxc7OTkSEMzXghfA6HTx9Vmo8UFEU1xLcT8vSH9IXeHq+dQ73+/04Pj421yEj95nvVVXFzz//PKfKgCbdZ66XZRlFUcyeffqvLSogD/eZ7ymlODk5iU6nE71eL3777bc4PDx0Ph48M16ng3wJNR6o0+nc2N5utx/UF3h6vmUODwaD6Pf7UZZlTCYT7/iATNx3vh8eHsa7d+/i3bt3kVKK/f19L3RCBu4z152fAXm7z3yv6zo2NjZm92VZxt7ent/l4ZnxOh3kS6jxQJ//cZNSina7feWdW5/ezfG1vsDTdp/5HvHx0OC1tbVZoHF4eGi+QybuM98/vYvz0xURsbOzE2tra3OtGbi/+/4u3263Zy9qppSiLEtzHTJxn/m+trYWJycnV/r/8ccf5jtk6PMw0ut08Dy8urQJ7IOllOLg4CA2Njbi5OQk9vb2Zt8At7a2YmNjI3Z3d7/aF3j67jrfU0rx448/Xvncoijizz//XEDVwLe4z8/3iI9/ML179y76/X70ej3BBmTiPnN9MplEv9+P9fX1OD09na3GBPJwn/leVVXUdT173ul0zHfIRFVVcXx8HIPBIHZ3d2NjYyO63W5EeJ0OnguhBgAAAAAAkAXbTwEAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFkQagAAAAAAAFn4fzWYc7lAnk9LAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot final errors within selected range\n", + "\n", + "def error(kn):\n", + " return (twiss_error - twiss(ring, [*inverse([kn], [(-0.25, 0.25)])], ('kn', ['Quadrupole'], None, None), alignment=False, matched=True, advance=True, full=False, convert=True)).norm()\n", + "\n", + "values = torch.vmap(error)(kns)\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(16, 4))\n", + "ax.hist(values.cpu().numpy(), bins=50, color='blue', alpha=0.7)\n", + "plt.tight_layout() \n", + "plt.show()" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "myt0_gMIOq7b", + "5d97819c" + ], + "name": "03_frequency.ipynb", + "provenance": [] + }, + "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.1" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/index.rst b/docs/source/index.rst index d18d25c..8f52468 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -54,6 +54,7 @@ Simple accelerator lattice model: linear optics errors, closed orbit and Twiss p examples/model-43.ipynb examples/model-44.ipynb examples/model-45.ipynb + examples/model-46.ipynb .. toctree:: :caption: API: