{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5885189d",
   "metadata": {},
   "source": [
    "# Optimization of an S-bend with CMA-ES"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23b42cf2",
   "metadata": {},
   "source": [
    "Note: the cost of running the entire notebook is larger than 1 FlexCredit.\n",
    "\n",
    "[Covariance Matrix Adaptation Evolution Strategy (CMA-ES)](https://en.wikipedia.org/wiki/CMA-ES) is a robust evolutionary algorithm used for solving optimization problems in continuous domains. It stands out for its ability to adaptively adjust the covariance matrix, which guides the generation of new solution candidates, enabling it to efficiently navigate complex, multimodal landscapes. Its self-adaptive mechanism and population-based approach make it a powerful tool for a wide range of applications.\n",
    "\n",
    "The steps in a CMA-ES are typically as follows:\n",
    "\n",
    "1. **Initialization**: Generate an initial population of candidate solutions randomly within the search space.\n",
    "\n",
    "2. **Initialize the parameters**: mean of the search distribution, covariance matrix, step size, etc.\n",
    "\n",
    "3. **Evaluation**: Assess each candidate in the current population using the objective function to determine its fitness.\n",
    "\n",
    "4. **Selection**: Select a subset of the best-performing candidates based on their fitness scores.\n",
    "\n",
    "5. **Update Mean**: Calculate the new mean of the selected candidates, which will be used to sample the next generation.\n",
    "\n",
    "6. **Adapt Covariance Matrix**: Update the covariance matrix based on the distribution of the selected candidates. This step is crucial as it adapts the sampling strategy to the shape of the objective function's landscape.\n",
    "\n",
    "7. **Adapt Step Size**: Adjust the step size, which controls the global scale of the search. This is typically done using a mechanism like path length control, which helps in maintaining an appropriate exploration-exploitation balance.\n",
    "\n",
    "8. **Generate New Population**: Sample a new population of candidates based on the updated mean, covariance matrix, and step size.\n",
    "\n",
    "9. **Termination Check**: Check for termination criteria (e.g., maximum number of iterations, satisfactory solution quality, or stagnation in improvement).\n",
    "\n",
    "10. **Repeat**: If termination criteria are not met, return to step 2 with the new population and continue the process.\n",
    "\n",
    "11. **Output**: Once termination criteria are met, output the best solution found or the final population depending on the specific requirements of the problem.\n",
    "\n",
    "CMA-ES can be effectively applied to the design optimization of photonic components.\n",
    "`Yuto Miyatake, Kasidit Toprasertpong, Shinichi Takagi, and Mitsuru Takenaka, \"Design of compact and low-loss S-bends by CMA-ES,\" Opt. Express 31, 43850-43863 (2023)` [DOI:10.1364/OE.504866](https://doi.org/10.1364/OE.504866) demonstrates the optimization of a compact, low-loss waveguide S-bend using CMA-ES. In this notebook, we follow this work and optimize a silicon waveguide S-bend. We use the CMA-ES optimizer from the open-source package [pycma](https://github.com/CMA-ES/pycma) so we can set up the optimization very quickly.\n",
    "\n",
    "<img src=\"img/optimized_sbend.png\" width=\"450\" alt=\"Schematic of the S-bend\">\n",
    "\n",
    "`Tidy3D` is a powerful tool for photonic design optimization due to its fast speed and high throughput. Besides CMA-ES, we have demonstrated particle swarm optimizations of a [polarization beam splitter](https://www.flexcompute.com/tidy3d/examples/notebooks/ParticleSwarmOptimizedPBS/) and a [bullseye cavity](https://www.flexcompute.com/tidy3d/examples/notebooks/BullseyeCavityPSO/), genetic algorithm optimization of an [on-chip reflector](https://www.flexcompute.com/tidy3d/examples/notebooks/GeneticAlgorithmReflector/), and direct binary search optimization of an [optical switch](https://www.flexcompute.com/tidy3d/examples/notebooks/OpticalSwitchDBS/). Furthermore, we also have a growing list of gradient-based adjoint optimization examples including\n",
    "\n",
    "1. [Mode converter](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd3InverseDesign/),\n",
    "\n",
    "2. [Waveguide taper](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd5BoundaryGradients/),\n",
    "\n",
    "3. [Metalens](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd7Metalens/),\n",
    "\n",
    "4. [Waveguide bend](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd8WaveguideBend/), \n",
    "\n",
    "5. [Multiplexer](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd9WDM/),\n",
    "\n",
    "6. [Y-branch](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd10YBranchLevelSet/),\n",
    "\n",
    "7. [Light extractor](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd12LightExtractor/)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a01f5f4e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:24.573252Z",
     "iopub.status.busy": "2025-05-15T10:48:24.573018Z",
     "iopub.status.idle": "2025-05-15T10:48:26.492501Z",
     "shell.execute_reply": "2025-05-15T10:48:26.492151Z"
    }
   },
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "# uncomment the following line to install cma if it's not installed in your environment already\n",
    "# pip install cma\n",
    "import cma\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tidy3d as td\n",
    "import tidy3d.web as web"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1c94ab62",
   "metadata": {},
   "source": [
    "## Simulation Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5af4a78",
   "metadata": {},
   "source": [
    "The simulation wavelength range is 1500 nm to 1600 nm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9e53db36",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.494658Z",
     "iopub.status.busy": "2025-05-15T10:48:26.494297Z",
     "iopub.status.idle": "2025-05-15T10:48:26.497914Z",
     "shell.execute_reply": "2025-05-15T10:48:26.497498Z"
    }
   },
   "outputs": [],
   "source": [
    "lda0 = 1.55  # central wavelength\n",
    "freq0 = td.C_0 / lda0  # central frequency\n",
    "\n",
    "n_freqs = 11\n",
    "ldas = np.linspace(1.5, 1.6, n_freqs)  # wavelength range\n",
    "freqs = td.C_0 / ldas  # frequency range\n",
    "fwidth = 0.5 * (np.max(freqs) - np.min(freqs))  # width of the source frequency range"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8b75861",
   "metadata": {},
   "source": [
    "For simplicity, we will use the silicon and oxide media directly from the [material library](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/material_library.html#)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9a19a01b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.499398Z",
     "iopub.status.busy": "2025-05-15T10:48:26.499247Z",
     "iopub.status.idle": "2025-05-15T10:48:26.501883Z",
     "shell.execute_reply": "2025-05-15T10:48:26.501475Z"
    }
   },
   "outputs": [],
   "source": [
    "si = td.material_library[\"cSi\"][\"Palik_Lossless\"]\n",
    "\n",
    "sio2 = td.material_library[\"SiO2\"][\"Palik_Lossless\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f43ad711",
   "metadata": {},
   "source": [
    "The input and output straight waveguides have a 430 nm width and 220 nm thickness. The S-bend has a size of 3.5 µm and its boundaries are characterized by a Bezier curve with 7 control points. Therefore, the 14 parameters corresponding to the $xy$ coordinates of the control points tune the shape and width of the bend. The first and last points are fixed to ensure a smooth connection to the straight waveguides. The y coordinate of the middle control point is also fixed. Therefore, we have a total of 9 tunable parameters that can be optimized."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9b2421cc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.503107Z",
     "iopub.status.busy": "2025-05-15T10:48:26.502962Z",
     "iopub.status.idle": "2025-05-15T10:48:26.506412Z",
     "shell.execute_reply": "2025-05-15T10:48:26.505650Z"
    }
   },
   "outputs": [],
   "source": [
    "s = 3.5  # s-bend size\n",
    "w = 0.43  # straight waveguide width\n",
    "t = 0.22  # waveguide thickness\n",
    "buffer = 1.5  # buffer spacing\n",
    "inf_eff = 1e2  # effective infinity\n",
    "\n",
    "# initial values of the tunable parameters corresponding to the coordinates of the control points\n",
    "x1 = 0.7675\n",
    "x2 = 0.215\n",
    "x3 = 0.215\n",
    "x4 = 0.215\n",
    "x5 = -0.9825\n",
    "y1 = 1.535\n",
    "y2 = 0.7675\n",
    "y4 = -0.9825\n",
    "y5 = -1.965\n",
    "\n",
    "# initial parameter vector\n",
    "x0 = [x1, x2, x3, x4, x5, y1, y2, y4, y5]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c668159",
   "metadata": {},
   "source": [
    "We define a function `bezier_curve` that takes the coordinates of the control points and returns the Bezier curve. To test it, we generate the Bezier curve that describes the bottom curve of the S-bend with the initial control points defined earlier and plot them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5ef29d64",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.507699Z",
     "iopub.status.busy": "2025-05-15T10:48:26.507362Z",
     "iopub.status.idle": "2025-05-15T10:48:26.606264Z",
     "shell.execute_reply": "2025-05-15T10:48:26.605551Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def bezier_curve(control_points, num_points=100):\n",
    "    t = np.linspace(0, 1, num_points)\n",
    "    curve = np.zeros((num_points, 2))\n",
    "    n = len(control_points) - 1  # degree of the Bézier curve\n",
    "\n",
    "    for i in range(n + 1):\n",
    "        binomial_coeff = math.factorial(n) / (math.factorial(i) * math.factorial(n - i))\n",
    "        term = binomial_coeff * (1 - t) ** (n - i) * t**i\n",
    "        curve += np.outer(term, control_points[i])\n",
    "\n",
    "    return curve\n",
    "\n",
    "\n",
    "# define 7 control points\n",
    "control_points = np.array(\n",
    "    [\n",
    "        [-s / 2, -s / 2 - w / 2],\n",
    "        [x5, y5],\n",
    "        [x4, y4],\n",
    "        [x3, 0],\n",
    "        [x2, y2],\n",
    "        [x1, y1],\n",
    "        [s / 2, s / 2 - w / 2],\n",
    "    ]\n",
    ")\n",
    "\n",
    "# generate Bézier curve\n",
    "curve_bottom = bezier_curve(control_points)\n",
    "\n",
    "plt.plot(curve_bottom[:, 0], curve_bottom[:, 1], label=\"Bezier Curve\")\n",
    "plt.scatter(control_points[:, 0], control_points[:, 1], color=\"red\", label=\"Control Points\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d52a06b4",
   "metadata": {},
   "source": [
    "The top curve of the S-bend is simply a 180 degree rotation of the bottom curve. With both curves, the bend can be simply defined as a [PolySlab](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.PolySlab.html). The input and output straight waveguides can be defined using Box."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "28b13951",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.608186Z",
     "iopub.status.busy": "2025-05-15T10:48:26.608018Z",
     "iopub.status.idle": "2025-05-15T10:48:26.672912Z",
     "shell.execute_reply": "2025-05-15T10:48:26.672634Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "vertices = np.vstack((curve_bottom, -curve_bottom))\n",
    "\n",
    "sbend = td.Structure(\n",
    "    geometry=td.PolySlab(vertices=vertices, axis=2, slab_bounds=(-t / 2, t / 2)), medium=si\n",
    ")\n",
    "\n",
    "waveguide_in = td.Structure(\n",
    "    geometry=td.Box.from_bounds(\n",
    "        rmin=(-inf_eff, -s / 2 - w / 2, -t / 2), rmax=(-s / 2, -s / 2 + w / 2, t / 2)\n",
    "    ),\n",
    "    medium=si,\n",
    ")\n",
    "\n",
    "waveguide_out = td.Structure(\n",
    "    geometry=td.Box.from_bounds(\n",
    "        rmin=(s / 2, s / 2 - w / 2, -t / 2), rmax=(inf_eff, s / 2 + w / 2, t / 2)\n",
    "    ),\n",
    "    medium=si,\n",
    ")\n",
    "\n",
    "sbend.plot(z=0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2d22705",
   "metadata": {},
   "source": [
    "We will add a [ModeSource](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeSource.html) to launch the TE0 mode at the input waveguide and add a [ModeMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeMonitor.html) at the output waveguide to measure transmission efficiency."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9e7ba506",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.674254Z",
     "iopub.status.busy": "2025-05-15T10:48:26.674113Z",
     "iopub.status.idle": "2025-05-15T10:48:26.676997Z",
     "shell.execute_reply": "2025-05-15T10:48:26.676719Z"
    }
   },
   "outputs": [],
   "source": [
    "# add a mode source as excitation\n",
    "mode_spec = td.ModeSpec(num_modes=1, target_neff=3.5)\n",
    "mode_source = td.ModeSource(\n",
    "    center=(-s / 2 - buffer / 2, -s / 2, 0),\n",
    "    size=(0, 4 * w, 6 * t),\n",
    "    source_time=td.GaussianPulse(freq0=freq0, fwidth=fwidth),\n",
    "    direction=\"+\",\n",
    "    mode_spec=mode_spec,\n",
    "    mode_index=0,\n",
    ")\n",
    "\n",
    "# add a mode monitor to measure transmission at the output waveguide\n",
    "mode_monitor = td.ModeMonitor(\n",
    "    center=(s / 2 + buffer / 2, s / 2, 0),\n",
    "    size=mode_source.size,\n",
    "    freqs=freqs,\n",
    "    mode_spec=mode_spec,\n",
    "    name=\"mode\",\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4cccd431",
   "metadata": {},
   "source": [
    "To facilitate the optimization, we define a function `make_sim` that takes the design parameter vector and returns a [Simulation](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.Simulation.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7953ef34",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.678459Z",
     "iopub.status.busy": "2025-05-15T10:48:26.678343Z",
     "iopub.status.idle": "2025-05-15T10:48:26.682460Z",
     "shell.execute_reply": "2025-05-15T10:48:26.682202Z"
    }
   },
   "outputs": [],
   "source": [
    "def make_sim(x):\n",
    "    control_points = np.array(\n",
    "        [\n",
    "            [-s / 2, -s / 2 - w / 2],\n",
    "            [x[4], x[8]],\n",
    "            [x[3], x[7]],\n",
    "            [x[2], 0],\n",
    "            [x[1], x[6]],\n",
    "            [x[0], x[5]],\n",
    "            [s / 2, s / 2 - w / 2],\n",
    "        ]\n",
    "    )\n",
    "\n",
    "    curve_bottom = bezier_curve(control_points)\n",
    "\n",
    "    vertices = np.vstack((curve_bottom, -curve_bottom))\n",
    "\n",
    "    sbend = td.Structure(\n",
    "        geometry=td.PolySlab(vertices=vertices, axis=2, slab_bounds=(-t / 2, t / 2)), medium=si\n",
    "    )\n",
    "\n",
    "    run_time = 5e-13  # simulation run time\n",
    "\n",
    "    return td.Simulation(\n",
    "        size=(s + 2 * buffer, s + 2 * buffer, 10 * t),\n",
    "        grid_spec=td.GridSpec.auto(min_steps_per_wvl=15, wavelength=lda0),\n",
    "        structures=[waveguide_in, waveguide_out, sbend],\n",
    "        sources=[mode_source],\n",
    "        monitors=[mode_monitor],\n",
    "        run_time=run_time,\n",
    "        boundary_spec=td.BoundarySpec.all_sides(boundary=td.PML()),\n",
    "        medium=sio2,\n",
    "        symmetry=(0, 0, 1),\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a36c8a6e",
   "metadata": {},
   "source": [
    "## Optimization Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25d3d9de",
   "metadata": {},
   "source": [
    "The objective of the optimization is to reduce the loss at the S-bend. Therefore, the objective function is simply the transmission to the output waveguide. By default, the objective evaluation is sequential, i.e. in each generation the objective function is calculated for each population one at a time. To leverage the parallel run of Tidy3D, we want to evaluate the objective functions for all populations in the generation at once. To achieve this, we need to do some customization for the optimizer, which we will demonstrate later. For now, let's assume that the objective function takes a 2D array of parameter vectors instead of a single parameter vector and returns a 1D array of objective function values. Each row of the 2D array corresponds to one parameter vector in the generation and the number of rows equals the number of populations. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "97353b32",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.684012Z",
     "iopub.status.busy": "2025-05-15T10:48:26.683828Z",
     "iopub.status.idle": "2025-05-15T10:48:26.686271Z",
     "shell.execute_reply": "2025-05-15T10:48:26.686014Z"
    }
   },
   "outputs": [],
   "source": [
    "def compute_transmission(sim_data):\n",
    "    amps = sim_data[\"mode\"].amps.sel(mode_index=0, direction=\"+\").values\n",
    "    return np.abs(amps) ** 2\n",
    "\n",
    "\n",
    "def objective_function(xs):\n",
    "    sims = {}\n",
    "    for i, x in enumerate(xs):\n",
    "        sim = make_sim(x)\n",
    "        sims[f\"population_{i}\"] = sim\n",
    "\n",
    "    batch = web.Batch(simulations=sims, verbose=False)\n",
    "    batch_results = batch.run(path_dir=\"data\")\n",
    "\n",
    "    T = []\n",
    "    for i, _ in enumerate(xs):\n",
    "        sim_data = batch_results[f\"population_{i}\"]\n",
    "        T.append(-10 * np.log10(np.mean(compute_transmission(sim_data))))\n",
    "    return T"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fe00357",
   "metadata": {},
   "source": [
    "Define the hyperparameters for the optimization. We use a population size of 10 and run the optimization for a total of 12 generations. The initial standard deviation is set to 0.05, which is empirically determined. This parameter determines the size of the explored parameter space initially. Too large of an initial standard deviation could lead to a self-intersecting [PolySlab](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.PolySlab.html). For reproducibility, we also use a fixed random seed.\n",
    "\n",
    "With the hyperparameters, we define the CMA-ES optimizer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "86757557",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.687460Z",
     "iopub.status.busy": "2025-05-15T10:48:26.687364Z",
     "iopub.status.idle": "2025-05-15T10:48:26.691850Z",
     "shell.execute_reply": "2025-05-15T10:48:26.691527Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5_w,10)-aCMA-ES (mu_w=3.2,w_1=45%) in dimension 9 (seed=12345, Thu May 15 12:48:26 2025)\n"
     ]
    }
   ],
   "source": [
    "dim = len(x0)\n",
    "population_size = 10\n",
    "max_generations = 12\n",
    "sigma0 = 0.05\n",
    "random_seed = 12345\n",
    "\n",
    "es = cma.CMAEvolutionStrategy(\n",
    "    x0, sigma0, {\"popsize\": population_size, \"maxiter\": max_generations, \"seed\": random_seed}\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7db1c05",
   "metadata": {},
   "source": [
    "## Run Optimization"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75ddda2e",
   "metadata": {},
   "source": [
    "With the objective function and optimizer set up, we can start the optimization. As we mentioned previously, we need to customize the optimization loop slightly such that the objective functions for the entire population can be evaluated in parallel. \n",
    "\n",
    "We also keep track of the best objective function value and display it at the end of each generation. We can see that the transmission improved from 0.271 dB in the first generation to 0.045 dB in the last generation, which is a significant improvement. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "91a893aa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:48:26.693053Z",
     "iopub.status.busy": "2025-05-15T10:48:26.692921Z",
     "iopub.status.idle": "2025-05-15T10:53:10.811425Z",
     "shell.execute_reply": "2025-05-15T10:53:10.811092Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 0: Best function value = 0.271\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 1: Best function value = 0.265\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 2: Best function value = 0.229\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 3: Best function value = 0.216\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 4: Best function value = 0.173\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 5: Best function value = 0.119\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 6: Best function value = 0.082\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 7: Best function value = 0.064\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 8: Best function value = 0.064\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 9: Best function value = 0.061\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 10: Best function value = 0.044\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation 11: Best function value = 0.040\n"
     ]
    }
   ],
   "source": [
    "best_values = []\n",
    "\n",
    "generation = 0\n",
    "while not es.stop():\n",
    "    solutions = es.ask()\n",
    "    function_values = objective_function(solutions)\n",
    "    es.tell(solutions, function_values)\n",
    "\n",
    "    best_values.append(es.result[1])\n",
    "\n",
    "    # Print message for each generation\n",
    "    print(f\"Generation {generation}: Best function value = {es.result[1]:.3f}\")\n",
    "\n",
    "    generation += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8fa8a727",
   "metadata": {},
   "source": [
    "Plot the best objective value as a function of generation. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "5366acc5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:53:10.812276Z",
     "iopub.status.busy": "2025-05-15T10:53:10.812198Z",
     "iopub.status.idle": "2025-05-15T10:53:10.845878Z",
     "shell.execute_reply": "2025-05-15T10:53:10.845672Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(best_values)\n",
    "plt.xlabel(\"Generation\")\n",
    "plt.ylabel(\"Best objective function\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f6f81ea",
   "metadata": {},
   "source": [
    "## Final Design"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca517cd8",
   "metadata": {},
   "source": [
    "After the optimization, we can inspect the optimized design more closely. First, extract the optimal parameter vector from the optimizer. Then define a [Simulation](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.Simulation.html) and visualize it. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6a1b6ce9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:53:10.847248Z",
     "iopub.status.busy": "2025-05-15T10:53:10.847139Z",
     "iopub.status.idle": "2025-05-15T10:53:10.857917Z",
     "shell.execute_reply": "2025-05-15T10:53:10.857719Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <div class=\"simulation-viewer\" data-width=\"800\" data-height=\"800\" data-simulation=\"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\" ></div>\n",
       "    <script>\n",
       "        \n",
       "        /**\n",
       "        * Simulation Viewer Injector\n",
       "        *\n",
       "        * Monitors the document for elements being added in the form:\n",
       "        *\n",
       "        *    <div class=\"simulation-viewer\" data-width=\"800\" data-height=\"800\" data-simulation=\"{...}\" />\n",
       "        *\n",
       "        * This script will then inject an iframe to the viewer application, and pass it the simulation data\n",
       "        * via the postMessage API on request. The script may be safely included multiple times, with only the\n",
       "        * configuration of the first started script (e.g. viewer URL) applying.\n",
       "        *\n",
       "        */\n",
       "        (function() {\n",
       "            const TARGET_CLASS = \"simulation-viewer\";\n",
       "            const ACTIVE_CLASS = \"simulation-viewer-active\";\n",
       "            const VIEWER_URL = \"https://tidy3d.simulation.cloud/simulation-viewer\";\n",
       "\n",
       "            class SimulationViewerInjector {\n",
       "                constructor() {\n",
       "                    for (var node of document.getElementsByClassName(TARGET_CLASS)) {\n",
       "                        this.injectViewer(node);\n",
       "                    }\n",
       "\n",
       "                    // Monitor for newly added nodes to the DOM\n",
       "                    this.observer = new MutationObserver(this.onMutations.bind(this));\n",
       "                    this.observer.observe(document.body, {childList: true, subtree: true});\n",
       "                }\n",
       "\n",
       "                onMutations(mutations) {\n",
       "                    for (var mutation of mutations) {\n",
       "                        if (mutation.type === 'childList') {\n",
       "                            /**\n",
       "                            * Have found that adding the element does not reliably trigger the mutation observer.\n",
       "                            * It may be the case that setting content with innerHTML does not trigger.\n",
       "                            *\n",
       "                            * It seems to be sufficient to re-scan the document for un-activated viewers\n",
       "                            * whenever an event occurs, as Jupyter triggers multiple events on cell evaluation.\n",
       "                            */\n",
       "                            var viewers = document.getElementsByClassName(TARGET_CLASS);\n",
       "                            for (var node of viewers) {\n",
       "                                this.injectViewer(node);\n",
       "                            }\n",
       "                        }\n",
       "                    }\n",
       "                }\n",
       "\n",
       "                injectViewer(node) {\n",
       "                    // (re-)check that this is a valid simulation container and has not already been injected\n",
       "                    if (node.classList.contains(TARGET_CLASS) && !node.classList.contains(ACTIVE_CLASS)) {\n",
       "                        // Mark node as injected, to prevent re-runs\n",
       "                        node.classList.add(ACTIVE_CLASS);\n",
       "\n",
       "                        var uuid;\n",
       "                        if (window.crypto && window.crypto.randomUUID) {\n",
       "                            uuid = window.crypto.randomUUID();\n",
       "                        } else {\n",
       "                            uuid = \"\" + Math.random();\n",
       "                        }\n",
       "\n",
       "                        var frame = document.createElement(\"iframe\");\n",
       "                        frame.width = node.dataset.width || 800;\n",
       "                        frame.height = node.dataset.height || 800;\n",
       "                        frame.style.cssText = `width:${frame.width}px;height:${frame.height}px;max-width:none;border:0;display:block`\n",
       "                        frame.src = VIEWER_URL + \"?uuid=\" + uuid;\n",
       "\n",
       "                        var postMessageToViewer;\n",
       "                        postMessageToViewer = event => {\n",
       "                            if(event.data.type === 'viewer' && event.data.uuid===uuid){\n",
       "                                frame.contentWindow.postMessage({ type: 'jupyter', uuid, value: node.dataset.simulation, fileType: 'hdf5'}, '*');\n",
       "\n",
       "                                // Run once only\n",
       "                                window.removeEventListener('message', postMessageToViewer);\n",
       "                            }\n",
       "                        };\n",
       "                        window.addEventListener(\n",
       "                            'message',\n",
       "                            postMessageToViewer,\n",
       "                            false\n",
       "                        );\n",
       "\n",
       "                        node.appendChild(frame);\n",
       "                    }\n",
       "                }\n",
       "            }\n",
       "\n",
       "            if (!window.simulationViewerInjector) {\n",
       "                window.simulationViewerInjector = new SimulationViewerInjector();\n",
       "            }\n",
       "        })();\n",
       "    \n",
       "    </script>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_opt = es.result[0]\n",
    "sim_opt = make_sim(x_opt)\n",
    "sim_opt.plot_3d()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "140b1b02",
   "metadata": {},
   "source": [
    "To help visualize the field propagation, we add a [FieldMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.FieldMonitor.html) to the simulation and run it again."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "3eeceebe",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:53:10.858785Z",
     "iopub.status.busy": "2025-05-15T10:53:10.858699Z",
     "iopub.status.idle": "2025-05-15T10:53:31.820713Z",
     "shell.execute_reply": "2025-05-15T10:53:31.820232Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:11 CEST </span>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'final_design'</span> with task_id                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span><span style=\"color: #008000; text-decoration-color: #008000\">'fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3'</span> and task_type <span style=\"color: #008000; text-decoration-color: #008000\">'FDTD'</span>. \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:11 CEST\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'final_design'\u001b[0m with task_id                          \n",
       "\u001b[2;36m              \u001b[0m\u001b[32m'fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3'\u001b[0m and task_type \u001b[32m'FDTD'\u001b[0m. \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>View task using web UI at                                         \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">04-4bc4-8fcf-87ff77fe79d3'</span></a>.                                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m             \u001b[0m\u001b[2;36m \u001b[0mView task using web UI at                                         \n",
       "\u001b[2;36m              \u001b[0m\u001b]8;id=388450;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=113245;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=388450;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=854339;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[32mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=388450;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[32m-74fd126b-0f\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m              \u001b[0m\u001b]8;id=388450;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[32m04-4bc4-8fcf-87ff77fe79d3'\u001b[0m\u001b]8;;\u001b\\.                                       \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>Task folder: <a href=\"https://tidy3d.simulation.cloud/folders/folder-bfe11006-2cae-4abd-bc02-04b6047e01be\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'default'</span></a>.                                           \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m             \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=792700;https://tidy3d.simulation.cloud/folders/folder-bfe11006-2cae-4abd-bc02-04b6047e01be\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\.                                           \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9c12944cc2854e3896ca28c884f97e4b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:13 CEST </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.025</span>. Minimum cost depends on task      \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>execution details. Use <span style=\"color: #008000; text-decoration-color: #008000\">'web.real_cost(task_id)'</span> to get the billed \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>FlexCredit cost after a simulation run.                           \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:13 CEST\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.025\u001b[0m. Minimum cost depends on task      \n",
       "\u001b[2;36m              \u001b[0mexecution details. Use \u001b[32m'web.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed \n",
       "\u001b[2;36m              \u001b[0mFlexCredit cost after a simulation run.                           \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:14 CEST </span>status = queued                                                   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:14 CEST\u001b[0m\u001b[2;36m \u001b[0mstatus = queued                                                   \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>To cancel the simulation, use <span style=\"color: #008000; text-decoration-color: #008000\">'web.abort(task_id)'</span> or             \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span><span style=\"color: #008000; text-decoration-color: #008000\">'web.delete(task_id)'</span> or abort/delete the task in the web UI.     \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>Terminating the Python script will not stop the job running on the\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>cloud.                                                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m             \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or             \n",
       "\u001b[2;36m              \u001b[0m\u001b[32m'web.delete\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or abort/delete the task in the web UI.     \n",
       "\u001b[2;36m              \u001b[0mTerminating the Python script will not stop the job running on the\n",
       "\u001b[2;36m              \u001b[0mcloud.                                                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b80ed44ee6a1402cab4c080a51c92246",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:21 CEST </span>starting up solver                                                \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:21 CEST\u001b[0m\u001b[2;36m \u001b[0mstarting up solver                                                \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>running solver                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m             \u001b[0m\u001b[2;36m \u001b[0mrunning solver                                                    \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c3648b98acbd4c3c8418d03ae0c2316b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:26 CEST </span>early shutoff detected at <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">64</span>%, exiting.                           \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:26 CEST\u001b[0m\u001b[2;36m \u001b[0mearly shutoff detected at \u001b[1;36m64\u001b[0m%, exiting.                           \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span>status = postprocess                                              \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m             \u001b[0m\u001b[2;36m \u001b[0mstatus = postprocess                                              \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d94e77a839da4ab5a8753951841c7897",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:27 CEST </span>status = success                                                  \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:27 CEST\u001b[0m\u001b[2;36m \u001b[0mstatus = success                                                  \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:29 CEST </span>View simulation result at                                         \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">'https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">              </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">04-4bc4-8fcf-87ff77fe79d3'</span></a><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">.</span>                                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:29 CEST\u001b[0m\u001b[2;36m \u001b[0mView simulation result at                                         \n",
       "\u001b[2;36m              \u001b[0m\u001b]8;id=118760;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=293278;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=118760;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=908586;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[4;34mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=118760;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[4;34m-74fd126b-0f\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m              \u001b[0m\u001b]8;id=118760;https://tidy3d.simulation.cloud/workbench?taskId=fdve-74fd126b-0f04-4bc4-8fcf-87ff77fe79d3\u001b\\\u001b[4;34m04-4bc4-8fcf-87ff77fe79d3'\u001b[0m\u001b]8;;\u001b\\\u001b[4;34m.\u001b[0m                                       \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c7a4463561314bd499a40b55153f20ea",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:53:31 CEST </span>loading simulation from simulation_data.hdf5                      \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:53:31 CEST\u001b[0m\u001b[2;36m \u001b[0mloading simulation from simulation_data.hdf5                      \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# add a field monitor to visualize field distribution at z=0\n",
    "field_monitor = td.FieldMonitor(\n",
    "    center=(0, 0, 0), size=(td.inf, td.inf, 0), freqs=[freq0], name=\"field\"\n",
    ")\n",
    "\n",
    "sim_opt = sim_opt.copy(update={\"monitors\": [mode_monitor, field_monitor]})\n",
    "sim_data_opt = web.run(simulation=sim_opt, task_name=\"final_design\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3dd89f13",
   "metadata": {},
   "source": [
    "After the simulation is complete, plot the transmission spectrum, which shows a very low loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f6358a39",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:53:31.939366Z",
     "iopub.status.busy": "2025-05-15T10:53:31.939301Z",
     "iopub.status.idle": "2025-05-15T10:53:31.973603Z",
     "shell.execute_reply": "2025-05-15T10:53:31.973162Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAG2CAYAAACTTOmSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOCNJREFUeJzt3Xl0FfX9//HXDQlZIBuQEMCwLwFBQBCMRRahEELZ5ChLWoEiiy3iD9EKrqBStF+LtlQF5PsFtWAtFRApYNlBSQEjQUBARZA1RAzZCIQsn98fOblyIevl3hsu83ycMyf3znxm5n0/xtwXM5+ZsRljjAAAACzIp6oLAAAAqCoEIQAAYFkEIQAAYFkEIQAAYFkEIQAAYFkEIQAAYFkEIQAAYFkEIQAAYFkEIQAAYFkEIQAAYFleF4TefPNNNW7cWAEBAeratat2795dZvvly5crJiZGAQEBateundauXeuhSgEAwM3Oq4LQhx9+qMcff1wvvPCCvvzyS7Vv3179+vVTampqie137typkSNHaty4cdq7d6+GDBmiIUOG6MCBAx6uHAAA3Ixs3vTQ1a5du+quu+7S3/72N0lSYWGhoqOj9eijj2r69OnXtR8+fLguXryoNWvW2Ofdfffd6tChg+bPn++xugEAwM3Jt6oLqKgrV64oKSlJM2bMsM/z8fFRnz59lJiYWOI6iYmJevzxxx3m9evXT6tWrSp1P7m5ucrNzbW/LywsVFpammrXri2bzXZjHwIAAHiEMUZZWVmqX7++fHxKPwHmNUHo/PnzKigoUN26dR3m161bV4cPHy5xnZSUlBLbp6SklLqfOXPmaNasWTdeMAAAqHInT57UbbfdVupyrwlCnjJjxgyHo0gZGRlq2LChTp48qZCQkCqsDAAAVFRmZqaio6MVHBxcZjuvCUJ16tRRtWrVdO7cOYf5586dU1RUVInrREVFVaq9JPn7+8vf3/+6+SEhIQQhAAC8THnDWrzmqrHq1aurU6dO2rRpk31eYWGhNm3apNjY2BLXiY2NdWgvSRs2bCi1PQAAsBavOSIkSY8//rhGjx6tzp07q0uXLnrjjTd08eJFjR07VpL00EMPqUGDBpozZ44k6bHHHlOPHj305z//WQMGDNA//vEPffHFF1q4cGFVfgwAAHCT8KogNHz4cP344496/vnnlZKSog4dOmj9+vX2AdEnTpxwGBl+zz33aNmyZXr22Wf19NNPq0WLFlq1apXatm1bVR8BAADcRLzqPkJVITMzU6GhocrIyGCMEAAAXqKi399eM0YIAADA1QhCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsnyrugAAJTBGKiws+ln8viJTVbYt5uNTNNlsZb8ub3lZ69lsnvtvAeCWRhDCrcMY6fJlKSdHunTp55+XLklXrkj5+VJeXtHPq1+X9tPTy65uU1BQ1b1583MmQJW0vFo1yde3aPLz+/m1q9+7clvVq0v+/lJAQNHP6tUJh4CTCEJwL2OKQsi14SQnp+R5pf2saFtYR2Fh0U9CYxF/f8dwVNrPirSpTNtrX1erVtU9AVQKQQg/M6YoUKSnlz5lZEgXL1YuuFx92sSqio86FP+r/tqfJc279jRQ8euSpvKWe6pN8WmywsKfT+1d+7qi8250eUXWKSgoen310bjio3PeJje3aMrMrNo6fH1LDktBQVLNmkVTjRo/vy5vurptjRoELbgcQehWYkxR+CgryFw7Xbjg+D4/vyoqr7zq1Yv+sAYFSYGBJf8sfh0YWNS+skGkMm3KW8ZpC+9SHJauPZ3piveu2NaVK0Wh5/Llkn9eO6/46Jkn5OdL2dlFkzsEBpYfmCoarIonf3/+H7UwgtDNpHiMS0UCS2lTVf5L1te37EDiqmWBgfyrEO5lsxX9jlWrVvQl6e3y8ysemioTsCrTNifHNYGseNzfjz/e+LaKVatWcmAKCZHCw6VatYqm0l6HhRX9/YNX4r9cVSgslEaOLDnIXLni2VpsNik0tOh/5OIpPNzx/dVTaGjRH4iSjrr4+Xm2dgAV4+v78xd8VTGmKBQVHy3Kzi46zX71+2uniizPybnx2goKik77Z2Q4v42QkPIDU0mvg4I4GlXFCEJVwcdHWrPGNf8DlxRkKjMFBxfVAwDuZLMVjRkKCJDq1HHddgsKiv6WOhukSltW2WECmZlF0/HjlVuvenXHgFTRIBUWxpFxFyEIVZWwsJ+DUFlBpqyjMwQZAFZXrVrR38HgYNdts/hq14yMomEJFy5IaWlFU0VeVyZEXbkinTtXNFVWaOj1Aal2bSkqqmiqV+/nn5GRRaEL1yEIVZXdu4tOMQUHk+oB4GZisxWNDYuMLJoqw5iiI0qVDU8XLkhZWZXbV/HpvGPHKta+Tp3rA1JJoSkkxFKn6whCVaVBg6quAADgajbbz0eoGjas3Lp5eT+Ho8oGqYrcT+v8+aLpwIGy2wUGlhyQSjrKdAsMEvf+TwAAwK3Az+/GjkKlpRVdTZeSUjSdPXv9z7Nniwatl+XSpaKjTOUdabLZpIiIih1lqlnzpj3KRBACAMCbXX0UqlGjstsaU3Q6rbSgdPXPn34qf1upqUXTV1+V3TYoqOyjS9HRUtu2lfvcLkIQAgDAKmy2ny+2iYkpu23xQO7yAlNKSvm3fsnJkY4eLZpK0qGDtHevEx/oxhGEAADA9apXLzpSEx1ddjtjisYrlReYzp4tul9eSaKiXF5+RRGEAACA82y2ny/fv/32sttevlzyGKamTT1TawkIQgAAwDMCAqTGjYummwR34gMAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJZFEAIAAJblNUEoLS1NCQkJCgkJUVhYmMaNG6fs7Owy11m4cKF69uypkJAQ2Ww2paene6ZYAADgFbwmCCUkJOjgwYPasGGD1qxZo+3bt2vChAllrpOTk6O4uDg9/fTTHqoSAAB4E5sxxlR1EeU5dOiQ2rRpoz179qhz586SpPXr1ys+Pl6nTp1S/fr1y1x/69at6tWrly5cuKCwsLBK7TszM1OhoaHKyMhQSEiIsx8BAAB4UEW/v73iiFBiYqLCwsLsIUiS+vTpIx8fH+3atcul+8rNzVVmZqbDBAAAbk1eEYRSUlIUGRnpMM/X11e1atVSSkqKS/c1Z84chYaG2qfo6GiXbh8AANw8qjQITZ8+XTabrczp8OHDHq1pxowZysjIsE8nT5706P4BAIDn+FblzqdNm6YxY8aU2aZp06aKiopSamqqw/z8/HylpaUpKirKpTX5+/vL39/fpdsEAAA3pyoNQhEREYqIiCi3XWxsrNLT05WUlKROnTpJkjZv3qzCwkJ17drV3WUCAIBblFeMEWrdurXi4uI0fvx47d69W59//rkmT56sESNG2K8YO336tGJiYrR79277eikpKUpOTtZ3330nSdq/f7+Sk5OVlpZWJZ8DAADcXLwiCEnS0qVLFRMTo969eys+Pl7dunXTwoUL7cvz8vJ05MgR5eTk2OfNnz9fHTt21Pjx4yVJ3bt3V8eOHbV69WqP1w8AAG4+XnEfoarEfYQAAPA+t9R9hAAAANyBIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACzrhoNQbm6uK+oAAADwuEoHoXXr1mn06NFq2rSp/Pz8FBQUpJCQEPXo0UOzZ8/WmTNn3FEnAACAy1U4CK1cuVItW7bUb3/7W/n6+uqpp57SihUr9Omnn2rRokXq0aOHNm7cqKZNm2rSpEn68ccf3Vk3AADADbMZY0xFGsbGxurZZ59V//795eNTen46ffq05s2bp7p162rq1KkuK7SqZGZmKjQ0VBkZGQoJCanqcgAAQAVU9Pu7wkHIqghCAAB4n4p+f3PVGAAAsKxKB6Fvv/1WH330kY4dOyZJ+ve//63u3bvrrrvu0uzZs8UBJgAA4C18K9N45cqVevDBB+Xj4yObzaaFCxdq4sSJ6tmzp0JCQjRz5kz7QGoAAICbXaWOCM2ePVt/+MMfdPnyZb399tuaNGmS5syZo3Xr1mnNmjV68803tWTJEjeVCgAA4FqVGiwdHBys5ORkNWvWTIWFhapevbqSk5PVtm1bSdLx48fVpk0b5eTkuK1gT2OwNAAA3sctg6UvXryo4ODgohV9fBQYGKigoCD78sDAQO40DQAAvEalgpDNZpPNZiv1PQAAgDep1GBpY4xatmxpDz/Z2dnq2LGj/QaLXDEGAAC8SaWC0OLFi91VBwAAgMdVKgiNHj3aXXUAAAB4HHeWBgAAllXhI0Lh4eEVHhidlpbmdEEAAACeUuEg9MYbb9hf//TTT3r55ZfVr18/xcbGSpISExP16aef6rnnnnN5kQAAAO7g1NPnhw0bpl69emny5MkO8//2t79p48aNWrVqlavqq3LcUBEAAO/j1qfPf/rpp4qLi7tuflxcnDZu3OjMJsuVlpamhIQEhYSEKCwsTOPGjVN2dnaZ7R999FG1atVKgYGBatiwoaZMmaKMjAy31AcAALyPU0Godu3a+vjjj6+b//HHH6t27do3XFRJEhISdPDgQW3YsEFr1qzR9u3bNWHChFLbnzlzRmfOnNFrr72mAwcOaMmSJVq/fr3GjRvnlvoAAID3cerU2JIlS/Twww+rf//+6tq1qyRp165dWr9+vd555x2NGTPGpUUeOnRIbdq00Z49e9S5c2dJ0vr16xUfH69Tp06pfv36FdrO8uXL9etf/1oXL16Ur2/FhkdxagwAAO/j1lNjY8aM0eeff66QkBCtWLFCK1asUEhIiD777DOXhyCpaCB2WFiYPQRJUp8+feTj46Ndu3ZVeDvFnVFWCMrNzVVmZqbDBAAAbk2VuqHi1bp27aqlS5e6spZSpaSkKDIy0mGer6+vatWqpZSUlApt4/z583rppZfKPJ0mSXPmzNGsWbOcrhUAAHiPCh8RunjxYqU2XJH206dPtz+4tbTp8OHDldpvSTIzMzVgwAC1adNGM2fOLLPtjBkzlJGRYZ9Onjx5w/sHAAA3pwofEWrevLkee+wxjR49WvXq1SuxjTFGGzdu1Ny5c9W9e3fNmDGjzG1Omzat3FNpTZs2VVRUlFJTUx3m5+fnKy0tTVFRUWWun5WVpbi4OAUHB2vlypXy8/Mrs72/v7/8/f3LbAMAAG4NFQ5CW7du1dNPP62ZM2eqffv26ty5s+rXr6+AgABduHBBX3/9tRITE+Xr66sZM2Zo4sSJ5W4zIiJCERER5baLjY1Venq6kpKS1KlTJ0nS5s2bVVhYaB+sXZLMzEz169dP/v7+Wr16tQICAir6cQEAgAVU+qqxEydOaPny5dqxY4d++OEHXbp0SXXq1FHHjh3Vr18/9e/fX9WqVXN5of3799e5c+c0f/585eXlaezYsercubOWLVsmSTp9+rR69+6t9957T126dFFmZqb69u2rnJwcrVy5UjVq1LBvKyIiosI1ctUYAADep6Lf305dPl8V0tLSNHnyZH3yySfy8fHRsGHD9Ne//lU1a9aUJB0/flxNmjTRli1b1LNnT23dulW9evUqcVvHjh1T48aNK7RfghAAAN7nlgtCVYUgBACA93HrfYQAAABuBQQhAABgWQQhAABgWQQhAABgWU4/YiM9PV27d+9WamqqCgsLHZY99NBDN1wYAACAuzkVhD755BMlJCQoOztbISEhstls9mU2m40gBAAAvIJTp8amTZum3/72t8rOzlZ6erouXLhgn9LS0lxdIwAAgFs4FYROnz6tKVOmKCgoyNX1AAAAeIxTQahfv3764osvXF0LAACARzk1RmjAgAF68skn9fXXX6tdu3bXPdF90KBBLikOAADAnZx6xIaPT+kHkmw2mwoKCm6oqJsJj9gAAMD7VPT726kjQtdeLg8AAOCNuKEiAACwLKeD0LZt2zRw4EA1b95czZs316BBg7Rjxw5X1gYAAOBWTgWhv//97+rTp4+CgoI0ZcoUTZkyRYGBgerdu7eWLVvm6hoBAADcwqnB0q1bt9aECRM0depUh/lz587VO++8o0OHDrmswKrGYGkAALxPRb+/nToi9P3332vgwIHXzR80aJCOHTvmzCYBAAA8zqkgFB0drU2bNl03f+PGjYqOjr7hogAAADzBqcvnp02bpilTpig5OVn33HOPJOnzzz/XkiVL9Je//MWlBQIAALiLU0HokUceUVRUlP785z/rn//8p6SicUMffvihBg8e7NICAQAA3MWpwdJWwmBpAAC8j1sHSwMAANwKKnxqrFatWvrmm29Up04dhYeHy2azldo2LS3NJcUBAAC4U4WD0Ouvv67g4GD767KCEAAAgDdgjFA5GCMEAID3cesYoS+//FL79++3v//44481ZMgQPf3007py5YozmwQAAPA4p4LQxIkT9c0330gqusv08OHDFRQUpOXLl+sPf/iDSwsEAABwF6eC0DfffKMOHTpIkpYvX64ePXpo2bJlWrJkiT766CNX1gcAAOA2TgUhY4wKCwslFT1WIz4+XlLRozfOnz/vuuoAAADcyKkg1LlzZ7388st6//33tW3bNg0YMECSdOzYMdWtW9elBQIAALiLU0HojTfe0JdffqnJkyfrmWeeUfPmzSVJ//rX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0BNPPKH9+/crICBAH330kU6ePKkePXp49P5CAAAAN8KpIHTo0CE99NBDkopubHjp0iXVrFlTL774ol599VWXFggAAOAuTgWhGjVq2McF1atXT0ePHrUvO3/+vGsqAwAAcDOnxgjdfffd+uyzz9S6dWvFx8dr2rRp2r9/v1asWKG7777b1TUCAAC4hVNBaO7cucrOzpYkzZo1S9nZ2frwww/VokWLW+qKMQAAcGurdBAqKCjQqVOndMcdd0gqOk02f/58lxcGAADgbpUeI1StWjX17dtXFy5ccEc9AAAAHuPUYOm2bdvq+++/d3UtAAAAHuVUEHr55Zf1xBNPaM2aNTp79qwyMzMdJgAAAG9QqUdsvPjii5o2bZqCg4N/3oDNZn9tjJHNZlNBQYFrq6xCPGIDAADvU9Hv70oFoWrVquns2bM6dOhQme169OhR8UpvcgQhAAC8j1ueNVacmW6loAMAAKyr0mOErj4VBgAA4M0qfR+hli1blhuG0tLSnC4IAADAUyodhGbNmqXQ0FB31AIAAOBRlQ5CI0aMUGRkpDtqAQAA8KhKjRFifBAAALiVVCoIVeJKewAAgJtepU6NFRYWuqsOAAAAj3PqERsAAAC3AoIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLIIQAACwLK8JQmlpaUpISFBISIjCwsI0btw4ZWdnV2hdY4z69+8vm82mVatWubdQAADgNbwmCCUkJOjgwYPasGGD1qxZo+3bt2vChAkVWveNN96QzWZzc4UAAMDb+FZ1ARVx6NAhrV+/Xnv27FHnzp0lSfPmzVN8fLxee+011a9fv9R1k5OT9ec//1lffPGF6tWr56mSAQCAF/CKI0KJiYkKCwuzhyBJ6tOnj3x8fLRr165S18vJydGoUaP05ptvKioqqkL7ys3NVWZmpsMEAABuTV4RhFJSUhQZGekwz9fXV7Vq1VJKSkqp602dOlX33HOPBg8eXOF9zZkzR6GhofYpOjra6boBAMDNrUqD0PTp02Wz2cqcDh8+7NS2V69erc2bN+uNN96o1HozZsxQRkaGfTp58qRT+wcAADe/Kh0jNG3aNI0ZM6bMNk2bNlVUVJRSU1Md5ufn5ystLa3UU16bN2/W0aNHFRYW5jB/2LBhuvfee7V169YS1/P395e/v39FPwIAAPBiVRqEIiIiFBERUW672NhYpaenKykpSZ06dZJUFHQKCwvVtWvXEteZPn26Hn74YYd57dq10+uvv66BAwfeePEAAMDrecVVY61bt1ZcXJzGjx+v+fPnKy8vT5MnT9aIESPsV4ydPn1avXv31nvvvacuXbooKiqqxKNFDRs2VJMmTTz9EQAAwE3IKwZLS9LSpUsVExOj3r17Kz4+Xt26ddPChQvty/Py8nTkyBHl5ORUYZUAAMCb2IwxpqqLuJllZmYqNDRUGRkZCgkJqepyAABABVT0+9trjggBAAC4GkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYFkEIAABYltcEobS0NCUkJCgkJERhYWEaN26csrOzy1ynZ8+estlsDtOkSZM8VDEAALjZ+VZ1ARWVkJCgs2fPasOGDcrLy9PYsWM1YcIELVu2rMz1xo8frxdffNH+PigoyN2lAgAAL+EVQejQoUNav3699uzZo86dO0uS5s2bp/j4eL322muqX79+qesGBQUpKirKU6UCAAAv4hVBKDExUWFhYfYQJEl9+vSRj4+Pdu3apaFDh5a67tKlS/X3v/9dUVFRGjhwoJ577rkyjwrl5uYqNzfX/j4jI0OSlJmZ6YJPAgAAPKH4e9sYU2Y7rwhCKSkpioyMdJjn6+urWrVqKSUlpdT1Ro0apUaNGql+/fr66quv9NRTT+nIkSNasWJFqevMmTNHs2bNum5+dHS08x8AAABUiaysLIWGhpa6vEqD0PTp0/Xqq6+W2ebQoUNOb3/ChAn21+3atVO9evXUu3dvHT16VM2aNStxnRkzZujxxx+3vy8sLFRaWppq164tm83mdC3XyszMVHR0tE6ePKmQkBCXbRfXo689g372DPrZM+hnz3BnPxtjlJWVVebwGamKg9C0adM0ZsyYMts0bdpUUVFRSk1NdZifn5+vtLS0So3/6dq1qyTpu+++KzUI+fv7y9/f32FeWFhYhfdRWSEhIfxP5iH0tWfQz55BP3sG/ewZ7urnso4EFavSIBQREaGIiIhy28XGxio9PV1JSUnq1KmTJGnz5s0qLCy0h5uKSE5OliTVq1fPqXoBAMCtxSvuI9S6dWvFxcVp/Pjx2r17tz7//HNNnjxZI0aMsB/yOn36tGJiYrR7925J0tGjR/XSSy8pKSlJx48f1+rVq/XQQw+pe/fuuuOOO6ry4wAAgJuEVwQhqejqr5iYGPXu3Vvx8fHq1q2bFi5caF+el5enI0eOKCcnR5JUvXp1bdy4UX379lVMTIymTZumYcOG6ZNPPqmqj+DA399fL7zwwnWn4eB69LVn0M+eQT97Bv3sGTdDP9tMedeVAQAA3KK85ogQAACAqxGEAACAZRGEAACAZRGEAACAZRGEbsD27ds1cOBA1a9fXzabTatWrXJYPmbMGNlsNocpLi7OoU1aWpoSEhIUEhKisLAwjRs3TtnZ2Q5tvvrqK917770KCAhQdHS0/vSnP7n7o910brSvjx8/rnHjxqlJkyYKDAxUs2bN9MILL+jKlSsO27F6X7vid7pYbm6uOnToIJvNZr+HVzH62TX9/O9//1tdu3ZVYGCgwsPDNWTIEIflJ06c0IABAxQUFKTIyEg9+eSTys/Pd+Mnu7m4op+/+eYbDR48WHXq1FFISIi6deumLVu2OLShn8vuZ6noKRGDBg1SaGioatSoobvuuksnTpywL798+bJ+//vfq3bt2qpZs6aGDRumc+fOOWzDXf1MELoBFy9eVPv27fXmm2+W2iYuLk5nz561Tx988IHD8oSEBB08eFAbNmzQmjVrtH37dodHg2RmZqpv375q1KiRkpKS9D//8z+aOXOmw60DrOBG+/rw4cMqLCzUggULdPDgQb3++uuaP3++nn76aXsb+to1v9PF/vCHP5R4a3v62TX9/NFHH+k3v/mNxo4dq3379unzzz/XqFGj7MsLCgo0YMAAXblyRTt37tS7776rJUuW6Pnnn3fb57rZuKKff/WrXyk/P1+bN29WUlKS2rdvr1/96lf251zSz+X389GjR9WtWzfFxMRo69at+uqrr/Tcc88pICDA3mbq1Kn65JNPtHz5cm3btk1nzpzR/fffb1/u1n42cAlJZuXKlQ7zRo8ebQYPHlzqOl9//bWRZPbs2WOft27dOmOz2czp06eNMca89dZbJjw83OTm5trbPPXUU6ZVq1Yurd+bONPXJfnTn/5kmjRpYn9PXzu6kX5eu3atiYmJMQcPHjSSzN69e+3L6GdHzvRzXl6eadCggVm0aFGpbdauXWt8fHxMSkqKfd7bb79tQkJCHPreKpzp5x9//NFIMtu3b7fPy8zMNJLMhg0bjDH087VK6ufhw4ebX//616Wuk56ebvz8/Mzy5cvt8w4dOmQkmcTERGOMe/uZI0JutnXrVkVGRqpVq1Z65JFH9NNPP9mXJSYmKiwsTJ07d7bP69Onj3x8fLRr1y57m+7du6t69er2Nv369dORI0d04cIFz30QL1BWX5ckIyNDtWrVsr+nryumvH4+d+6cxo8fr/fff19BQUHXrU8/V0xZ/fzll1/q9OnT8vHxUceOHVWvXj31799fBw4csLdJTExUu3btVLduXfu8fv36KTMzUwcPHvToZ7mZldXPtWvXVqtWrfTee+/p4sWLys/P14IFCxQZGWl/3BP9XLbCwkL9+9//VsuWLdWvXz9FRkaqa9euDqfPkpKSlJeXpz59+tjnxcTEqGHDhkpMTJTk3n4mCLlRXFyc3nvvPW3atEmvvvqqtm3bpv79+6ugoECSlJKSosjISId1fH19VatWLfth15SUFIf/8JLs74vboPy+vtZ3332nefPmaeLEifZ59HX5yutnY4zGjBmjSZMm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8fn5z3bdunXVrl07+/tq1aqpdu3a160XGBionJycCn8mwEp8q7oAADef5s2b67bbbtOWLVt04cIFe6ipX7++oqOjtXPnTm3ZskX33XefpKJQ0q9fP/Xr109Lly5VRESETpw4oX79+unKlSv27SYkJGjZsmWaPn26li1bpri4ONWuXVtS0ZVp145NKlY8Xudq2dnZkorG93Tt2tVhWbVq1Rze+/n52V/bbDZJReOWXOHqbRdvv6xt16lTRxcuXKjQdowx5bapyP7T0tIUERFR+ocALIwgBKBEvXr10tatW3XhwgU9+eST9vndu3fXunXrtHv3bj3yyCOSpMOHD+unn37SK6+8oujoaElyuOqs2KhRo/Tss88qKSlJ//rXvzR//nz7sjvvvFMpKSny9fVV48aNy62vbt26ql+/vr7//nslJCQ4/TlbtWqlPXv2OMy79n316tVVUFDg9D6u1rFjR3399dcu2VZFHThw4LpbHwAowqkxACXq1auXPvvsMyUnJ9uPCElSjx49tGDBAl25csU+ULphw4aqXr265s2bp++//16rV6/WSy+9dN02GzdurHvuuUfjxo1TQUGBBg0aZF/Wp08fxcbGasiQIfrPf/6j48ePa+fOnXrmmWdKDFVS0UDlOXPm6K9//au++eYb7d+/X4sXL9bcuXMr/DkfffRRrV27VnPnztW3336rBQsWaN26dfYjR8V1Hzt2TMnJyTp//rxyc3MrvP1r9evXT4mJiS4LVuXJyclRUlKS+vbt65H9Ad6GIASgRL169dKlS5fUvHlz1a1b1z6/R48eysrKsl9mL0kRERFasmSJli9frjZt2uiVV17Ra6+9VuJ2ExIStG/fPg0dOlSBgYH2+TabTWvXrlX37t01duxYtWzZUiNGjNAPP/zgsP+rPfzww1q0aJEWL16sdu3aqUePHlqyZImaNGlS4c/5i1/8QvPnz9fcuXPVvn17rV+/XlOnTnUYxzNs2DDFxcWpV69eioiI0AcffFDh7V+rf//+8vX11caNG53eRmV8/PHHatiwoe69916P7A/wNjZz7UloALC48ePH6/Dhw2675PzNN9/U6tWr9emnn7pl+1e7++67NWXKFI0aNcrt+wK8EWOEAFjea6+9pl/+8peqUaOG1q1bp3fffdfhxoyuNnHiRKWnpysrK8utj9k4f/687r//fo0cOdJt+wC8HUeEAFjegw8+qK1btyorK0tNmzbVo48+qkmTJlV1WQA8gCAEAAAsi8HSAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsghCAADAsv4/WUtBANDtO8cAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "T_opt = 10 * np.log10(compute_transmission(sim_data_opt))\n",
    "plt.plot(ldas * 1e3, T_opt, \"red\", linewidth=2)\n",
    "plt.ylim(-0.5, 0)\n",
    "plt.ylabel(\"Transmission (dB)\")\n",
    "plt.xlabel(\"Wavelength (nm)\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46d6767a",
   "metadata": {},
   "source": [
    "Lastly, plot the field intensity distribution to visualize the energy flow. The optimized design allows a smooth mode transition at the two bends such that the loss is minimal. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f4d042b4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:53:31.975004Z",
     "iopub.status.busy": "2025-05-15T10:53:31.974886Z",
     "iopub.status.idle": "2025-05-15T10:53:32.212110Z",
     "shell.execute_reply": "2025-05-15T10:53:32.211738Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhkAAAHWCAYAAADaTJt3AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAtKtJREFUeJzsnXmcHGWd/9919N3TPfdMJgkQDuUGOYQgCkiWgFGJIgssSpBL2IAGVlE0XAGNgMixHPmxrKIryOFKXEGDMRgQiQEiKJeIEAg5ZpLMPT19VdXz++Op7pmeI5lJJpnJzPfNq0h31VNPP9VJd336expKKYUgCIIgCMIIY472AgRBEARBGJ+IyBAEQRAEYYcgIkMQBEEQhB2CiAxBEARBEHYIIjIEQRAEQdghiMgQBEEQBGGHICJDEARBEIQdgogMQRAEQRB2CCIyBEEQBEHYIYjIEITtYPny5RiGwfLly0d7KcII8+ijj1JZWUlXV9dOf+033ngD27Z57bXXdvprC8JIIiJDEIbAPffcwwMPPDDay9gmHnroIW6//fbRXgYAnudx8803M23aNMLhMAcffDA///nPh3x+W1sbF110ETU1NcRiMU444QT+8pe/DDj2//7v/zjssMMIh8PstttuXHvttTiOM6TXcV2Xa6+9lssuu4x4PD7k9Y0U+++/P7NmzeKaa67Z6a8tCCOKEgRhqxxwwAHquOOO67ffdV2VTqeV67o7f1FDZNasWWr33Xcf7WUopZT61re+pQB14YUXqvvuu0/NmjVLAernP//5Vs91XVcdc8wxKhaLqeuuu07dddddav/991dlZWXqH//4R8nY3/zmN8owDHXCCSeo++67T1122WXKNE118cUXD2mdjz/+uDIMQ61du3abrnMk+M1vfqMA9c9//nPU1iAI24uIDGHIdHV1jfYSRo3BRMauwFgRGWvXrlWBQEDNnTu3uM/zPPXxj39cTZkyRTmOs8XzH3nkEQWoxx57rLhv48aNqry8XJ111lklY/fff391yCGHqHw+X9z3ne98RxmGod58882trvWzn/2sOvbYY4d6aTuEXC6nKioq1NVXXz2q6xCE7UFExgRl7dq16rzzzlOTJk1SwWBQ7bHHHuriiy9W2WxWKaXUj3/8YwWo5cuXq0suuUTV1NSo8vLy4vl333232n///VUwGFSTJk1S//7v/65aW1tLXuMf//iH+vznP6/q6upUKBRSkydPVmeccYZqa2srjvnd736nPvaxj6lkMqlisZj60Ic+pK666qqtrn8o52UyGXXNNdeovfbaSwWDQTVlyhT1jW98Q2UymX7z/c///I868sgjVSQSUeXl5erjH/+4euqpp5RSSu2+++4KKNkKguMPf/iDAtQf/vCHkvkeffRRddhhh6lwOKyqqqrU2Wef3e9X8Zw5c1QsFlNr165Vp556qorFYqq6ulr9x3/8x1ZvuEoptXjxYvWpT32q+He45557qgULFpSce9xxx/Vb+5YEx5w5c/qNL2zXXnvtVte0Je6++24FqNdff71k/0MPPaQA9cc//nGL559++umqrq6un9XooosuUtFotPj3+vrrrytA3X333SXj1q1bpwB1ww03bPF10um0CgaD6rrrrivZv3r1agWoH//4x/3O6fv+XHvttQpQb731ljr77LNVIpFQ1dXVav78+crzPLVmzRr12c9+VpWVlam6ujr1gx/8YMC1fO5zn1MHH3zwFtcrCGMZeyd5ZYQxxPr16/noRz9a9G/vu+++rFu3jl/84hd0d3cTDAaLY//93/+dmpoarrnmGlKpFADXXXcd119/PTNmzOCSSy7hrbfe4t577+XFF1/kT3/6E4FAgFwux8yZM8lms1x22WXU19ezbt06nnjiCdra2kgmk7z++ut8+tOf5uCDD2bBggWEQiH++c9/8qc//WmL6x/KeZ7n8dnPfpbnnnuOiy66iP32249XX32V2267jX/84x8sXry4OPb666/nuuuu45hjjmHBggUEg0FWrlzJ008/zUknncTtt99e9M1/5zvfAaCurm7Q9T3wwAN8+ctf5sgjj2ThwoU0NTVxxx138Kc//YmXX36Z8vLy4ljXdZk5cyZHHXUUP/jBD/j973/Prbfeyl577cUll1yyxffhgQceIB6Pc8UVVxCPx3n66ae55ppr6Ojo4JZbbgHgO9/5Du3t7axdu5bbbrsNYIsxBl/5yleYMWNGyb4lS5bw4IMPUltbW9y3efPmLa6tQFlZGaFQCICXX36ZWCzGfvvtVzLmox/9aPH4scceO+hcL7/8MocddhimWRpK9tGPfpT77ruPf/zjHxx00EG8/PLLABxxxBEl4xoaGpgyZUrx+GCsWrWKXC7HYYcdNqRr3BJnnHEG++23H9///vd58sknufHGG6msrOT//b//xyc/+UluuukmHnzwQb7+9a9z5JFH8olPfKLk/MMPP5xf/epXdHR0kEgktns9grDTGW2VI+x8zjnnHGWapnrxxRf7HfM8TynVY8k49thjS34Zb9y4UQWDQXXSSSeV/KK86667FKB+9KMfKaWUevnll/uZtvty2223KUBt2rRpWOsfynn/8z//o0zT7PfreNGiRQpQf/rTn5RSSr399tvKNE31uc99rt8v5MJ7odTg7pK+loxcLqdqa2vVgQceqNLpdHHcE088oQB1zTXXFPcVrAYLFiwomfMjH/mIOvzww7f8Jiiluru7++37yle+UvKrXqntc5e8/fbbKplMqn/5l38p+XfAINaOvlvvX/2zZs1Se+65Z7/XSKVSClDf+ta3triWWCymzjvvvH77n3zySQWoJUuWKKWUuuWWWxSg1qxZ02/skUceqY4++ugtvs7999+vAPXqq6+W7N8WS8ZFF11U3Oc4jpoyZYoyDEN9//vfL+5vbW1VkUhEzZkzp9+8BSvPypUrt7hmQRirSHbJBMPzPBYvXsxnPvOZfr/0AAzDKHl+4YUXYllW8fnvf/97crkc8+bNK/lFeeGFF5JIJHjyyScBSCaTADz11FN0d3cPuJbCL/pf/epXeJ435GsYynmPPfYY++23H/vuuy+bN28ubp/85CcB+MMf/gDA4sWL8TyPa665pt8v5L7vxVB46aWX2LhxI//+7/9OOBwu7p81axb77rtv8f3pzcUXX1zy/OMf/zjvvvvuVl8rEokUH3d2drJ582Y+/vGP093dzd///vdhr70vqVSKz33uc1RUVPDzn/+85N/B0qVLh7TNnDmzeE46nS5aNXpTeJ/S6fQW1zPU8wt/DjZ2a6/T3NwMQEVFxRbHDYULLrig+NiyLI444giUUpx//vnF/eXl5Xz4wx8e8O+8sIahWo4EYawh7pIJxqZNm+jo6ODAAw8c0vhp06aVPH///fcB+PCHP1yyPxgMsueeexaPT5s2jSuuuIIf/vCHPPjgg3z84x/ns5/9LF/84heLAuSMM87g/vvv54ILLuBb3/oWJ554Ip///Of5whe+0O+G35uhnPf222/z5ptvUlNTM+AcGzduBOCdd97BNE3233//Ib0fW2Ow9wdg33335bnnnivZFw6H+62xoqKC1tbWrb7W66+/zvz583n66afp6OgoOdbe3j7cpffjwgsv5J133uH555+nqqqq5Fhfl8pQiEQiZLPZfvszmUzx+EicX/hzsLFbe50CSqkhjdsSu+22W8nzZDJJOBymurq63/6CuBloDdsieAVhLCAiQ9giQ/1CHohbb72Vc889l1/96lf87ne/46tf/SoLFy7kz3/+M1OmTCESifDss8/yhz/8gSeffJIlS5bwyCOP8MlPfpLf/e53Jb+c+65pa+d5nsdBBx3ED3/4wwHnmDp16jZf10gy2DVujba2No477jgSiQQLFixgr732IhwO85e//IVvfvObw7IMDcQdd9zBz3/+c372s59x6KGH9jve2Ng4pHmSyWTx39CkSZP4wx/+gFKq5Ka5YcMGQMdMbIlJkyYVx/am7/mTJk0q7u/797xhw4ZiDMhgFARVa2srU6ZM2eJY2LIYGejvd7C/84HmKYjNvqJEEHYVxF0ywaipqSGRSGxzJcHdd98dgLfeeqtkfy6XY/Xq1cXjBQ466CDmz5/Ps88+yx//+EfWrVvHokWLisdN0+TEE0/khz/8IW+88Qbf/e53efrpp4vujMHY2nl77bUXLS0tnHjiicyYMaPfVrA07LXXXniexxtvvLHF1xvqL8nB3p/Cvr7vz7ayfPlympubeeCBB/ja177Gpz/9aWbMmDGgiX+4v4L/+Mc/8vWvf5158+Zx9tlnDzhm0qRJQ9oeeeSR4jmHHnoo3d3dvPnmmyVzrVy5snh8Sxx66KH85S9/6SegVq5cSTQa5UMf+lDJPC+99FLJuPXr17N27dqtvs6+++4LwOrVqwc83tnZWfK8qalpi/NtD6tXr8Y0zeK1CcKuhoiMCYZpmsyePZtf//rX/b6EYesm4hkzZhAMBrnzzjtLxv73f/837e3tzJo1C4COjo5+1RUPOuggTNMsmrFbWlr6zV+4AQxk6i4wlPP+9V//lXXr1vFf//Vf/cam0+lipszs2bMxTZMFCxb0u3n1vr5YLEZbW9ugaypwxBFHUFtby6JFi0qu4be//S1vvvlm8f3ZXgq/hnuvMZfLcc899/QbG4vFhuw+2bBhA//6r//KscceW8xQGYhtick49dRTCQQCJWtUSrFo0SImT57MMcccU7KOv//97+Tz+eK+L3zhCzQ1NfHLX/6yuG/z5s089thjfOYznynGYBxwwAHsu+++3HfffbiuWxx77733YhgGX/jCF7b4Hhx++OEEg8EBPx9APwH8+OOPF69lpFm1ahUHHHBA0cUoCLsa4i6ZgHzve9/jd7/7Hccdd1wxvXPDhg089thjPPfccyUpln2pqanhqquu4vrrr+fkk0/ms5/9LG+99Rb33HMPRx55JF/84hcBePrpp7n00ks5/fTT+dCHPoTjOPzP//wPlmVx2mmnAbBgwQKeffZZZs2axe67787GjRu55557mDJlyhZTGYdy3pe+9CUeffRRLr74Yv7whz/wsY99DNd1+fvf/86jjz7KU089xRFHHMHee+/Nd77zHW644QY+/vGP8/nPf55QKMSLL75IQ0MDCxcuBPSN59577+XGG29k7733pra2thhE2ptAIMBNN93El7/8ZY477jjOOuusYgrrHnvsweWXX76tf20lHHPMMVRUVDBnzhy++tWvYhgG//M//zPgje7www/nkUce4YorruDII48kHo/zmc98ZsB5v/rVr7Jp0yauvPJKHn744ZJjBx98MAcffDCwbTEZU6ZMYd68edxyyy3k83mOPPJIFi9ezB//+EcefPDBEjfCVVddxU9+8hNWr17NHnvsAWiRcfTRR/PlL3+ZN954g+rqau655x5c1+X6668vea1bbrmFz372s5x00kmceeaZvPbaa9x1111ccMEF/VJo+xIOhznppJP4/e9/z4IFC/odX7JkCWeffTaf+MQn+Mc//sF9991HNBrld7/7HUceeSSf/vSnh/3eDEQ+n+eZZ57h3//930dkPkEYFUYlp0UYdd5//311zjnnqJqaGhUKhdSee+6p5s6d268Y10BprkrplNV9991XBQIBVVdXpy655JKSYlzvvvuuOu+889Ree+2lwuGwqqysVCeccIL6/e9/XxyzbNkydeqpp6qGhgYVDAZVQ0ODOuuss/qViO7LUM/L5XLqpptuUgcccIAKhUKqoqJCHX744er6669X7e3tJWN/9KMfqY985CPFcccdd5xaunRp8XhjY6OaNWuWKisrG1IxrkceeaQ4X2Vl5RaLcfWlkP64Nf70pz+po48+WkUiEdXQ0KCuvPJK9dRTT/VbT1dXl/q3f/s3VV5evtViXAMV7yps21uMSyldGvx73/ue2n333VUwGFQHHHCA+tnPftZvXCG9d/Xq1SX7W1pa1Pnnn6+qqqpUNBpVxx133KD/Rh9//HF16KGHqlAopKZMmaLmz5+vcrnckNb5y1/+UhmGUZIGW0hh/d73vqdmzJihQqGQmjZtmvrFL36hvv3tb6toNKquv/56pVTP32HfNOvB/s6PO+44dcABB5Ts++1vf6sA9fbbbw9pzYIwFjGU2gE2PkEQhF0Y13XZf//9+dd//VduuOEGAN577z2mTZvGj3/8Y84999wdvobZs2djGEbRHSMIuyISkyEIgtAHy7JYsGABd99996i0en/zzTd54oknigJHEHZVRGQIgiAMwBlnnEFLS8uotHrfb7/9cBxnyPVsBGGsIiJDEARBEIQdgsRkCIIgCIKwQxBLhiAIgiAIOwQRGYIgCIIg7BCkGNcQ8TyP9evXU1ZWJs2KBEEQtgGlFJ2dnTQ0NGyxCaIwjhjVKh1bYeHChQpQX/va17Y47tFHH1Uf/vCHVSgUUgceeKB68sknS457nqeuvvpqVV9fr8LhsDrxxBO3WvCpLx988MGgRYpkk0022WQb+vbBBx8M93aww+no6FB77dWgrl9w3mgvZVwxZqXkiy++yP/7f/+vWMZ4MJ5//nnOOusszj//fF5++WVmz57N7NmzSxqA3Xzzzdx5550sWrSIlStXEovFmDlzZrFF9FAoKyvzH5mAJZtssskm27A3fcvp+T4dO9x8y6X6z5seGrDbr7BtjMnskq6uLg477DDuuecebrzxRg499FBuv/32AceeccYZpFIpnnjiieK+o48+mkMPPZRFixahlKKhoYH/+I//4Otf/zoA7e3t1NXV8cADD3DmmWcOaU0dHR1+kyILEHeJIAjC8FGAS3t7O4lEYrQXU2T9+vV86EN7seSpH3D7bY9RURHnv/7ria2fKGyVMWnJmDt3LrNmzRpSE6YVK1b0Gzdz5kxWrFgB6FbJjY2NJWOSySRHHXVUcYwgCIIwcbn22os4+eSjmD79AL77vQv52c+W8sYbb4z2ssYFYy7w8+GHH+Yvf/kLL7744pDGNzY2UldXV7Kvrq6OxsbG4vHCvsHGDEQ2my1p1d3R0TGk9QiCIAi7Dq+//jo/+9lSXvnrjwDYe+/JXHjhp7nyygt44onnR3l1uz5jypLxwQcf8LWvfY0HH3yQcDg8qmtZuHAhyWSyuE2dOnVU1yMIgiCMPFdeeQEXXDCLvfeeXNz3nfnn8Mc//o3ly5eP3sLGCWNKZKxatYqNGzdy2GGHYds2tm3zzDPPcOedd2LbNq7r9junvr6epqamkn1NTU3U19cXjxf2DTZmIK666ira29uL2wcffLC9lycIgiCMIf7whz/w3HOvMv/qOSX7q6uTfPNb/8bXv/4VPM8bpdWND8aUyDjxxBN59dVXeeWVV4rbEUccwdlnn80rr7yCZVn9zpk+fTrLli0r2bd06VKmT58OwLRp06ivry8Z09HRwcqVK4tjBiIUCpFIJEo2QRAEYXzgeR5f//pX+Oa3/o3q6mS/41/96mk0NbXy8MMPj8Lqxg9jKiajrKysX9fBWCxGVVVVcf8555zD5MmTWbhwIQBf+9rXOO6447j11luZNWsWDz/8MC+99BL33XcfAIZhMG/ePG688Ub22Wcfpk2bxtVXX01DQwOzZ8/eqdcnCIIgjA0efvhhNm1q56tfPW3A45FIiAULzuPb376C0047jVAotJNXOD4YU5aMobBmzZqSHOZjjjmGhx56iPvuu49DDjmEX/ziFyxevLhErFx55ZVcdtllXHTRRRx55JF0dXWxZMmSUY/7EARBEHY+mUyGb3/7ChYsOI9IZHDxcPYX/4Xy8jh3/uflO3F144sxWSdjLCJ1MgRBELaXsVEn4+ZbLuGhB5fywov/b0A3fG+WLn2Js868nnfeeZ/KysqdtMLxwy5nyRAEQRCEbaWlpYWF3/sZ37/p4q0KDIB/+Zcj+OhH9+OGGy/eCasbf4jIEARBECYMC274Ch/96H78y78cMeRzvn/TV1h0769YvXr1DlzZ+ETcJUNE3CWCIAjby+i6S959910OOGA/nl9xDwcfvNewzj3/vJvIZHI8/PCyrQ8WiojIGCIiMgRBELaX0RUZZ555IpFIkPv/+5vDPnft2k3sv985LF/+LEceeeQOWN34RNwlgiAIwrjnxRdf5Ne/fp7rrj9vm86fMqWGy776eb7+jQuR3+ZDR0SGIAiCMK5RSvEfX7+Ar37tNKZMqdnmea688izeeP29kq7fwpYRkSEIgiCMa5YuXcqbb7zPlVeetV3zJJNxrr5mDt/5zryRWdgEQESGIAiCMK5Zs2YNH/nIPiQSse2e67jjDuX99zePwKomBmOqrLggCIIg7DBGotmZNEwbFmLJEARBEARhhyCWDEEQBGH8o9TIWCGUWDKGg4gMQRAEYWIwIu4SSV8dDiIyBEEQhAmA0taM7Z5GRMZwkJgMQRAEQRB2CGLJEARBEMY/CskuGQVEZAiCIAjjHwn8HBVEZAiCIAgTAwn83OlITIYgCIIgCDsEsWQIgiAI45+RcpdITMawEJEhCIIgTAwkJmOnIyJDEARBGP8ohTECAsGQOhnDQmIyBEEQBEHYIYglQxAEQZgYSEzGTkdEhiAIgjD+UWpk0k/FXTIsxF0iCIIgCMIOQSwZgiAIwsRAinHtdERkCIIgCOMfqZMxKojIEARBECYGI1LjQkTGcJCYDEEQBEEQdghiyRAEQRDGPyPmLpGYjOEgIkMQBEGYGIyEQBCRMSxEZAiCIAjjn5GyZEjvkmEhMRmCIAiCIOwQxJIhCIIgTAwkJmOnIyJDEARBGPcYSmGMgMgYiTkmEiIyBEEQhInBSPQdkd4lw2LMxWTce++9HHzwwSQSCRKJBNOnT+e3v/3tFs957LHH2HfffQmHwxx00EH85je/KTmulOKaa65h0qRJRCIRZsyYwdtvv70jL0MQBEEQJjxjTmRMmTKF73//+6xatYqXXnqJT37yk5x66qm8/vrrA45//vnnOeusszj//PN5+eWXmT17NrNnz+a1114rjrn55pu58847WbRoEStXriQWizFz5kwymczOuixBEARhNClkl2zvJtklw8JQauzbfiorK7nllls4//zz+x0744wzSKVSPPHEE8V9Rx99NIceeiiLFi1CKUVDQwP/8R//wde//nUA2tvbqaur44EHHuDMM88c0ho6OjpIJpOABRgjcVmCIAgTDAW4tLe3k0gkdtqr3n///Tz24x+y5P9dut1zvfb2eo499z9pb28fgZWNf8acJaM3ruvy8MMPk0qlmD59+oBjVqxYwYwZM0r2zZw5kxUrVgCwevVqGhsbS8Ykk0mOOuqo4hhBEARBEEaeMRn4+eqrrzJ9+nQymQzxeJzHH3+c/ffff8CxjY2N1NXVleyrq6ujsbGxeLywb7AxA5HNZslms8XnHR0d23QtgiAIwhhAKan4OQqMSUvGhz/8YV555RVWrlzJJZdcwpw5c3jjjTd26hoWLlxIMpksblOnTt2pry8IgiCMMBKTsdMZkyIjGAyy9957c/jhh7Nw4UIOOeQQ7rjjjgHH1tfX09TUVLKvqamJ+vr64vHCvsHGDMRVV11Fe3t7cfvggw+255IEQRCE0WSkAj/FkjEsxqTI6IvneSWui95Mnz6dZcuWlexbunRpMYZj2rRp1NfXl4zp6Ohg5cqVg8Z5AIRCoWIabWETBEEQBGHojLmYjKuuuopTTjmF3Xbbjc7OTh566CGWL1/OU089BcA555zD5MmTWbhwIQBf+9rXOO6447j11luZNWsWDz/8MC+99BL33XcfAIZhMG/ePG688Ub22Wcfpk2bxtVXX01DQwOzZ88ercsUBEEQdjZSjGunM+ZExsaNGznnnHPYsGEDyWSSgw8+mKeeeop/+Zd/AWDNmjWYZo8B5phjjuGhhx5i/vz5fPvb32afffZh8eLFHHjggcUxV155JalUiosuuoi2tjaOPfZYlixZQjgc3unXJwiCIIwC0oV1VNgl6mSMBaROhiAIwvYyinUy7r+FJXdctN1zvfbOBo695L+kTsYQ2SViMgRBEARB2PUYc+4SQRAEQRhxFNLqfRQQkSEIgiBMACQmYzQQd4kgCIIw/lFoK8RIbMNga53FM5kMc+fOpaqqing8zmmnndavrtOaNWuYNWsW0WiU2tpavvGNb+A4TsmY5cuXc9hhhxEKhdh777154IEHtvWdGlFEZAiCIAjCDmJrncUvv/xyfv3rX/PYY4/xzDPPsH79ej7/+c8Xz3ddl1mzZpHL5Xj++ef5yU9+wgMPPMA111xTHLN69WpmzZrFCSecwCuvvMK8efO44IILiqUfRhPJLhkikl0iCIKwvYxidsl9N7HkB1/e7rlee7eJY7/2wHZllxQ6i3/hC1+gpqaGhx56iC984QsA/P3vf2e//fZjxYoVHH300fz2t7/l05/+NOvXry/24Fq0aBHf/OY32bRpE8FgkG9+85s8+eSTvPbaa8XXOPPMM2lra2PJkiXbd8HbiVgyBEEQhPHPSLlL/N/lHR0dJdtgVal707ez+KpVq8jn8yVdwvfdd1922223YpfwFStWcNBBB5U0+Zw5cyYdHR1Fa8jWupGPJiIyBEEQBGEYZLPZkgaayWSyWIV6IF599VXi8TihUIiLL7642Fm8sbGRYDBIeXl5yfi+ncQH6iJeOLalMR0dHaTT6e293O1CsksEQRCECcAIZZd4HqFQiI0bN5bsDoVCg55S6Cze3t7OL37xC+bMmcMzzzyz/WvZBRCRIQiCIIx/Cu6S7cWfYzgxJYXO4gCHH344L774InfccQdnnHEGuVyOtra2EmtG307iL7zwQsl8heyT3mMG6jSeSCSIRCLDu74RRtwlgiAIwsRgJFq9j0CuRKGz+OGHH04gECjpEv7WW2+xZs2aYpfw6dOn8+qrr5ZYTpYuXUoikWD//fcvjtlSN/LRRCwZgiAIgrCD2FJn8WQyyfnnn88VV1xBZWUliUSCyy67jOnTp3P00UcDcNJJJ7H//vvzpS99iZtvvpnGxkbmz5/P3Llziy6aiy++mLvuuosrr7yS8847j6effppHH32UJ598cjQvHRCRIQiCIEwE1PALaQ3IMOfYWmfx2267DdM0Oe2008hms8ycOZN77rmneL5lWTzxxBNccsklTJ8+nVgsxpw5c1iwYEFxzLRp03jyySe5/PLLueOOO5gyZQr3338/M2fO3P7r3U6kTsYQkToZgiAI28so1sm4dyFLbvy37Z7rtfc2cuy3HpYurENELBmCIAjC+GeEAz+FoSGBn4IgCIIg7BDEkiEIgiBMAEYoJkMiDIaFiAxBEARh/KMYoWJcIjKGg7hLBEEQBEHYIYglQxAEQZgAjE4K60RHRIYgCIIw/hmp7BKJyRgWIjIEQRCEicEINUgTho7EZAiCIAiCsEMQS4YgCIIw/lFqZFwd4i0ZFiIyBEEQhImBxGTsdERkCIIgCOMfKSs+KkhMhiAIgiAIOwSxZAiCMOYxRrrzsbGDOylvh0ld7SCn/4i/hz47ar0jj5LsklFARIYgCIIw/hmxOhnbP8VEQkSGIAiCMP6RmIxRQUSGIAijxhZN+Ft1aWw9pKzf/Ebfc3ZEWJrHoJelBja193Y57GBHTq/X2YZX6v3+KQ+FwlCufio/8YUBEJEhCIIgTACkd8loICJDEARBGPcoBWoEBIKSOhnDQkSGIAg7jEFN8iWukB4TfMn4EteG6Z/We5/VazoTo2RMz+O+x3rPYWBiGKXzDBXVx/WhfLcBgMIbcFzhce/jA821tf3DYaBrGuw6jQHcR4ONVcrD9XI4bqfe4WXEZSL0Q0SGIAiCMDEYkbLiIqSGg4gMQRAEYWIgMRk7nTEnMhYuXMgvf/lL/v73vxOJRDjmmGO46aab+PCHP7zF8x577DGuvvpq3nvvPfbZZx9uuukmPvWpTxWPK6W49tpr+a//+i/a2tr42Mc+xr333ss+++yzoy9JEMY1w8sQMQdwifR2c1iYht3ruT5mmjYGJqapj5lGoGjGtwwb0wgUz7OMALYRAiBgRLGNELYKAGATwsbGVP652Jj+egxlov8ziivti9fLHVD62EMZXnG/5/+/eLx4zCs55lHIzPBKxvU+VqCvi2VL9HV7mL1cS4Vr7z2m9/HS/WbJn71xcGinkc3ptwBIZ9eDcoa8xp2OGqHAT9EYw2LMlRV/5plnmDt3Ln/+859ZunQp+Xyek046iVQqNeg5zz//PGeddRbnn38+L7/8MrNnz2b27Nm89tprxTE333wzd955J4sWLWLlypXEYjFmzpxJJpPZGZclCIIgCBOOMWfJWLJkScnzBx54gNraWlatWsUnPvGJAc+54447OPnkk/nGN74BwA033MDSpUu56667WLRoEUopbr/9dubPn8+pp54KwE9/+lPq6upYvHgxZ5555o69KEEQBGF0kWJco8KYExl9aW9vB6CysnLQMStWrOCKK64o2Tdz5kwWL14MwOrVq2lsbGTGjBnF48lkkqOOOooVK1aIyBCEYTKgi2RLGSO9MzoMm0JmiGnYRbeHYdhYZrDo9rDNEJap3R6WGcI2QgSNCKDdIAGlj4WIEFBBQioIQNQIEbP0HGUBi4htEvW9AUELbMMgYOobRcDUG4BlFDbV5wr64+Fb3/33QT/WuL5V3vXvRb0fKwwcr8fi7ildxMorHu+5h/WeE4Z2bzN7/RX0Xn/vvxrT0AW/CmN7/132PdYzRvWbP+MarO6cyvP+K32Qb8Z1x7C7BERkjAJjWmR4nse8efP42Mc+xoEHHjjouMbGRurq6kr21dXV0djYWDxe2DfYmL5ks1my2WzxeUdHxzZdgyCMF7aejjpAKqofV9EjJAJ+bIUWBKYvLECLCtuKEDC1kAgZcUJGGQBhFSOiIsS9KAAxK0BZQH99BS2DoGUQ87/NKoJQH9a358mRHBWhHLFAHoBIIE8o6BAI6HgHO+Bhh/RYK+hhhcAM91yOYQ58zcrTCqAQgqCcnqQD5YDngnL0uZ5r4Ln6seuYKM/A8/znroHnmXiq11hVEC76sVI9a9haVEapsCgIA4VhKEz/uWGAYfZ+ropjLUv5z/05zP7PC3R3Bfnzujpa3zkIgA3WX/Hcbr32sRi4oJTUyRgFxlxMRm/mzp3La6+9xsMPP7zTX3vhwoUkk8niNnXq1J2+BkEQBEHYlRmzloxLL72UJ554gmeffZYpU6ZscWx9fT1NTU0l+5qamqivry8eL+ybNGlSyZhDDz10wDmvuuqqEhdMR0eHCA1hwtK/B0h/10hf64UeZmL0yvwouERsy3d7mBGCVgzQlosoFUSVtl4kvDjltnaJJII2sYBBRVC/xtSox6Swtk4ETQ/TUEVTvm14hENgBCxM28KyohAwMCwTFfIg6EHIA8PADLoYQf+XacDFjIJhK92TwzR6fvkWTAiFP5VuQ1Kov6VU6RjDM4rPLWVgFh9rC4XyetwsShnQy1rR+4dybytGgd6dxs1BfiYWLBM9z3s/Uf3G9LVUDHRMH+9pv2J3BYgaVdR52pyzZ2YP8rm4XvcglgzPc1m9+p8DL3pnIO6Snc6YExlKKS677DIef/xxli9fzrRp07Z6zvTp01m2bBnz5s0r7lu6dCnTp08HYNq0adTX17Ns2bKiqOjo6GDlypVccsklA84ZCoUIhULbfT2CsKsy1LiLnpiLXi4R3z1iGjamGSy6RAJmhIAVI2wlAQgbCRKejrdKegmqA2GSQR1AURU22Cuu72j14Ry2oQj6d2vLUGQ8GytkQyiCGQxghmzMgIVn23T7a3eVUXK7s4CA4xFw9Tx2GgKG7zoxFbYvWPqilI6nKMRg6DYYfdwYfU7zBhAIxfkGcT0Zw3AzDLTOnUHhulKOzXozhJPYDEAiECXvJLZ4ruu6Wzy+Q5HAz1FhzImMuXPn8tBDD/GrX/2KsrKyYsxEMpkkEtG/fs455xwmT57MwoULAfja177Gcccdx6233sqsWbN4+OGHeemll7jvvvsAMAyDefPmceONN7LPPvswbdo0rr76ahoaGpg9e/aoXKcgjFW2LC76Cgu9r2CxgB5hAWCbYQJWhIClf+FGzXKiVFDhVQNQZcaojujz6iIm+5S5VAe1hSJqu8UgzPa8TdYO0R4MYUeCEA5iBfXXl+vf9ExDgYKwp4hZWkSUBRwilkPI1r+2Q5aLbXvYlr7ZWbbCsvVj0wbT9nr9qu//NhR+xRetDb0tEH0CJgayQgxGX8vDgGN2onN7S9XMC9eV7rJJudUkW/TfrWFYxX85Y/Y2LHUydjpjTmTce++9ABx//PEl+3/84x9z7rnnArBmzRrMXnbCY445hoceeoj58+fz7W9/m3322YfFixeXBIteeeWVpFIpLrroItra2jj22GNZsmQJ4XAYQRDGHoZlEigLYcXCqGAUx7DI+m4Gx9tZDdEFQdgexpzIGErk7vLly/vtO/300zn99NMHPccwDBYsWMCCBQu2Z3mCMK7ZWuxF77gLoxhnERjQegEQshJEzAriVAFQ5VVRG4hQE9fn7lMGU6PacpEMOOStIKlwkkBZmI5gsGilMBxw6GmJFrU94r4FImx62P4GELEdokFtuYhEcgSjLlbEz54IGxA0MIK+RcY2MQpuUcvAsC2dxwpg9VTBpG+WSd9fxCPQyEwvaAvmikEyXbabrf2673tt/vhoS5q9/txFRUC7SMys1ffMsYUOgBmZeYQhM+ZEhiAIO5chB3X2ibsoBHOaZhDbChdTT4N2gqhZDkCSeqq8SupD+tjkmMV+CY/qYK74Ci1eiFAyQlM8ghEKYhuKLPq7POq7PZIBl5DpFWMyonaeWEiLk1DIIRB0sEO+kIgorIQfE5IIYMajEPWFRCQIwQDY/g0xYIPtfw1aFtg2qiAubLPnpl94TwaLtNxetigudsxLDqlK+UDiyY88NTc3M2ntWyTeLwfAMMe4yGBktOBI6cmJgogMQZjADNdy0RN30SuY044RssqIWBUAJKil2qsBoCEUZUrM4qCktjpUBrO05y3+mQoSSoQJJKNEy0K46B/qMcuj3K9hEbFc4n59i3gwRziUJxjWFopg3MMu860cMQszFsLwYzuIh/UGEI+hYlGI6gwWFQppkREIbP+bN8FRNTWEXn2f5Iv6uSm3E2EA5F+FIAg7DcMyCSfjVMcSmLaFI78KhZ3FSGWXiLtkWIjIEIQJyNAzSAaOuwhYUYK2tg6ErQqSRj2VXi0AkwNlTEno8w4u96gKZWn2wkSq4jRGYriGQcjU3/dhS1HhWy7itktZIE+Z7waJhbOE477lIuFhJU3MuH59IxGCMl39k3gEohFUxLdeRGOouM54ICgWix2J0VBerLRqGmPfXSIprDsfERmCMMEY3EVi9ktNNf3eIbr8d5hAQVjY5cRMP5hTTaaBSqYmtAA4IKmYEtExF5u8EKtjFQTKoqQNiJgQs3uERTLgkPTjM8rCOaKxLOFyP700aWJV6Nc3khFIRCHhuz3K4hD3H8fi4v4YLRIxAqb++zN2Zo7ttqAkJmM0EJEhCBOIgQVGaXBnadZIIe4iSsguI+zHXZQbDdR6upLuHpE4H0oaHJLUvX4252xeTYWJ18SxkjESNkRs/euv3HYpDzqUB/XYZCxDLKFvUsFKhVURxKzQ4oGKOCT8CpLJMigr67FQWLvAr2ZBEMZ27xJBEHYxDINIdZyafWqJVsYGa6kmCKOA3x53e7dhxmQsXLiQI488krKyMmpra5k9ezZvvfVWyZjjjz8ewzBKtosvvrhkzJo1a5g1axbRaJTa2lq+8Y1v4DilXW+XL1/OYYcdRigUYu+99+aBBx7YpndqJBFLhiBMALbqIoGiFcM0fBeJGSRg6biHcKCcuFVDldJ9hCZTzZ7l2spxeIVLwFT8w0uQmJQgZ9qEfENDRRAqgg7lAf1lWBnKkoxliJf71otqsKp1LIVREYWqBCR07xJVFkcl/DLVUuJ/bNLZTd7Trio11v0IvfvLbA/DnOOZZ55h7ty5HHnkkTiOw7e//W1OOukk3njjDWKxWHHchRdeWFLHKRqNFh+7rsusWbOor6/n+eefZ8OGDZxzzjkEAgG+973vAbB69WpmzZrFxRdfzIMPPsiyZcu44IILmDRpEjNnzty+a94ORGQIwjhnKC4SvTukYy8sfdMP2mWE7XIAElY9de5UpoV0z5EPl5scUZEB4INchI3JCsJlITJA1IKqoP4mLg86VIeylEf12LLyDKFasGp03QyjJg6Vek5VUY4qKyuKDGHsoza00e3odOUx2d69FwpGpNX7cAM/lyxZUvL8gQceoLa2llWrVvGJT3yiuD8ajRabefbld7/7HW+88Qa///3vqaur49BDD+WGG27gm9/8Jtdddx3BYJBFixYxbdo0br31VgD2228/nnvuOW677TYRGYIgjDyDZ5D0tl701L6wzCCWGSZk65t8JFBJuTEZgMnuFPYui/GRCv0Fmww4vNwWJlIewWpIUhEySNiFYy7VIW2pqAhnKC/vJlLjNySrD2PUJaC6HABVWY4q14/xexONGq4LrtcT2ee4eh9geI7+BVs45m3h52zfgl29AyLNAfYBarCgyZGq8rmVG6MxmBViwGJc/jmbNpN5J01HvvASTv+x45iOjo6S50Ntqtne3g5AZWVlyf4HH3yQn/3sZ9TX1/OZz3yGq6++umjNWLFiBQcddBB1dXXF8TNnzuSSSy7h9ddf5yMf+QgrVqxgxowZJXPOnDmzpHHoaCAiQxCEYWNYJuVTKwgnwqQm1r1F2FUZKXeJgmw2SzKZLNl97bXXct11123xVM/zmDdvHh/72MdKemv927/9G7vvvjsNDQ387W9/45vf/CZvvfUWv/zlLwFobGwsERhA8XmhiehgYzo6Okin08UGozsbERmCMA7ZeppqTwZJoXJnwYoRDWjzd6UxlalqEgD7lUc4tiZHc84mEA2yoaISw7bI56EsANVBr9g9tSqcoTKRBiBWnSNQa2PV+1/IdeWo6kpUhf8rLtbjdx4x8nnI6uwVI5uFXA4j5//cdhy95X1l5Lr6OUDe9a0XvSwZBQuA6z8ezCBQUih1gDauvS0SJUYLo/T0vlaQkbBkDGTFGNQSM8gF9h7uz+e1pGhcW0Zb1vOnzG/7GncWI+HRUdpqsXHjxpLdQ7FizJ07l9dee43nnnuuZP9FF11UfHzQQQcxadIkTjzxRN555x322muvEVj06CEiQxDGO/1iMEpdJLYf3Bmyy4jZNVQZuwOwO/XsW6EFyAm1Gf7ZFaKjrIyy2jIiJiQD+hu7IuBSG85RFe0GoLwyQ7jO7yMyKYZRm4RqnfqqqqpQlRUjc11pLWSM7m6MVDekUnp/dxpSGX9MHpXJo7JaSKicq7fC/dBReI5/08yBype2cfccfZNXXv+kgt4V2Eu8HUZp63bDBHo/H+i8wbTE9uT/DUNH9G9Tv4V5C63eOwO8015Ga167xjzlDn+NOxM1MjEZhfcqUQhKHiKXXnopTzzxBM8++yxTpkzZ4tijjjoKgH/+85/stdde1NfX88ILL5SMaWpqAijGcdTX1xf39R6TSCRGzYoBIjIEYdzRE28xWAZJj/XCtqLFGIx4oJ5atQe7m9qSsX95kKOq9M369a4Iqq6CuqT+tVYZ9KgO6Rt3dThLdTxFWZ2+2QQmBTHr/eDNmnJUTdX2x13k8xipLujSQsJIdUOHLyo6UqiuDKpDWy+8The3W99MnG6DfNbEyel0l7wTIOeEybv67q0UuP6dPOtYKHru9wpwPLP4GEq1gGGA4R8xe4sI9P7e+wonFsucDXCsgDnIz21jCz/D1RaShb2BjvWZylOlY7boVfDP7cwHeK/bpo1Wf478GA/9HB2UUlx22WU8/vjjLF++nGnTpm31nFdeeQWASZO0JXH69Ol897vfZePGjdTW6sq6S5cuJZFIsP/++xfH/OY3vymZZ+nSpUyfPn0Er2b4SJ0MQRC2iBm0qdqzmlBc0kiFXRxvhLZhMHfuXH72s5/x0EMPUVZWRmNjI42NjaR9S9w777zDDTfcwKpVq3jvvff4v//7P8455xw+8YlPcPDBBwNw0kknsf/++/OlL32Jv/71rzz11FPMnz+fuXPnFt00F198Me+++y5XXnklf//737nnnnt49NFHufzyy7fnHdtuxJIhCOOEkjiMXjb50jRVu5hFAtpFEg9oc2ud2pO9AjUcUql/9X+4LMcb+TIq6ivocE0qQzr2AqAmlKMupr8kK8tTRCcprMk659+oK4daXXJcZ48M0z1SyOjo6sJo9yP4O7ugowvatfXCa03jtWufh9OuyHZaZNLaBdSdjZLO66+2tGuTdk3yvkXC8SDjmWQ9/f7YhiLit5OPWopqO0VVoAWV13PnfAuIq0p/jxkoLFNhmMp/XxVm8TFYplf8KzCsXo9NPa6ng7z/uNe5fRrhDvx4MAa6Afr7Ci4QpQCv50W0K6jHLVQ61kD1Hqsouks6usOs7agivUFbtBrTm8nnm/W4QWwa3paycnY0I1VWfJjmmnvvvRfQBbd68+Mf/5hzzz2XYDDI73//e26//XZSqRRTp07ltNNOY/78+cWxlmXxxBNPcMkllzB9+nRisRhz5swpqasxbdo0nnzySS6//HLuuOMOpkyZwv333z+q6asgIkMQxgUDpqsW7kq9SoWbRgjLDBMO6EDMeKCeOrUnAPsEaji82qIupG/yf/cSxCYn6VYGVSGoDbnUhvXNty7WRWWNFhmhKSbW5HKY5AuLmkpUhX48rAZl6TRGRztGmy8sWjugpRMArzWD25oj39YTD9DVrUuMd+YCdOUCdLlaEHQ5JhlfVORcSLuQ928MAQMsA4L+WxMxPALpDE5XlqjXRZuTpdPsuYsoP87A63N3Mg2FZfS4RCxDiw7QAsM2PSzT858rLF/ImL74KD63lBYoVo9YMXr+2vrHdkBRkJTglf79916uFgq9BYQWDgMJCaXAdc3SY8ooulOUZ+D6Y9szBps2p2hqagOgsbuRXH5z/7WVrmwrx8cfaiuqZOrUqTzzzDNbnWf33Xfv5w7py/HHH8/LL788rPXtaERkCILQj1BFjIqycnLj8J7gZB3y3RlynVm6c1lU0BcSYUccyOOZUar4OdERkSEI441CwS2/9XbvUuGWFS5mkQDUqj3Yx09ZPbLGojzg8UGonLIybSWo9sMwqoIO9eEcdWXaXVFelya4mw4eNSeXw6QaVK1f+bFP/YAB8aP8jc6OHpdIaxu0dKKauwBwN2fIt+hx3e1BOrvLaM/oBXXkA7TnfcuFa9KV1xYL0H9mnUJApt6ncg7dbWm8VIaYcovtyVMYZDL6yRsdAVqzioyrz1U9y+yHaeh4Tct/AZMeN4dl6OOW0TO28NjAKJ5bOGaWBJAOnA1beI2tMUCmafFaeu/vHShaaMnRe2zhuUINeiztwHtdGd5hFQCOmxrCCkeX0XCXTHREZAjCLs7g2SSFOIxASanwaKAnTXUvq5bDqvXNOmF7bIgkSNRqgVEVgpqg9rfXRTLUJbpI1Ps9R3aPYEzxa11MqsWrrh5yzQujvR2jTVc9pLkVmrXI8DZ24WzOkdms193REaEto9fdlgvSnreKwqIzT7EIWLejSOVdnF43RgMDJ+uQac/gdmWxHK1AXAVNnqLVT2nt9vLk0Y+zRo6skSWPn5LJ4CmZJhYGJqb/HpuYmKqQJmz6//k1MFTPOD3W6DlWPN8o+bP4Xhmlz4dDXzO910tq9H6sekmTwv7SsT3HldHzOGtkaTXW05FZ57/eGK+TIZaMUUFEhiDsovQP9BysFkaYgKWDMqN2JZXGVPYwdLDnwZU2NX4w5/pIkkRtnCrfelEXcpgU0XEXNckUZQ05ArtpIWFMqUZN8i0XNTVbb2BWqGnR0oqxuRk2twHgNXaRb9Q39XSzTVtnGS1pLSxacgFafVHRnjPoykOnH1zR7bh0uVoceErh4GJg6MdtedJtGTKpHDnPJa0c2k0tajKkyBtZcuiaHo6RxfNvjq6Xx1MOyhcXAzX8MnoVxDCwSvYbvYSEYVglwqJwXuEcs8/YktcYxGZhbsGW4Q105+v1z0P1Oa761LToe77qI7CK70Uv3eJ6eTJOOznHt0SN9ToZwqggIkMQBMKVsaKLZFckn3No39xNe3OKsLIJ9K2cKUx4FCPj6hB3yfAQkSEI441iwS1tEbCtMGFbx0kkrclM9Saxn1/Jc1rM5V2zjPKyJAqoDmoLBsCkaJq6ch0fEZ+cx54ax5haDYCqq9EWDNhqBonR0orRrFMbaWpGNbbjrNeWjVSTRVuHLty1uTtCc86mNae/llpz4Gep0pVz6XIcUkpbPfJGHheXdHeW5qYOnPYeV0OH0UUbuuRzhnZypHEcbbnwPAdXOUXrhVJesbFX4df6UFqWFy0TJZYNc8AxWx9XaskYbI7hsLVr6GvJKO4fxBcw0HxKebheBs9LD3+Bo8SIxGSIu2RYiMgQhF2QgVwlpYGeNrYfhxG2yymztHtksjuVfZIRDqvQN9a3nDhlU5K4CiqDUNPLRVJX3kXZFD3O3q0MplajJulqg6qyCgJbEBeF3iGbm7V7ZIMWGe76TrLrFW2btdtlUyrKxowWPM05m+YctGX1T8XOvEuno8VAp5EiZ+TwDL2erq5u2psydHdl8fBIma10eZsAcNxuclkdhOh6Oe0CKQoIp+RGqvcP4hoY6H3vd9MfWCD0HbclATI4O6KmeH+2Kki2IDyUyhcFy1hv9T6SDdKEoSMiQxB2IQYuuDVwoGehXHjMrmGStwcAHyqL8/GaPG91BghEAgQbykn4WqEm5FAXzlCT1Dfo+OS8FhcAu9WgJtWhqvz6F9YWfn23t2thAdC4GbWhjfw6LVy6NgTY3B6jKa3LizdlbZqz+jpac9CWdWh3tLWiy0iRNfV5ObpRKHJpj6YNLXR1dZPydE2GjNNGzk3hen7Api8sAP8mWJJzof8Y6Jf5EO4eBVP5gHVJegmH/ib1LQuGbbVYDJWhWGcGZggWEYnFELaAiAxBmICYAZOK3Spoc0egy+dOIJdz2LB+E90d0lde2EZGqOKnZJcMDxEZgjAe8OMwoCebJGJrq0ON2o09wzom4+gqj/fSAQINlXRjUdGrVHhdOEdtQmeRANhT41CIwShYMQazYOTzGK26UZaxcTM0+e6RtR1k1zq0bdLukcauGE2ZIBuzep5NGWjL6V/C7fk8nXTTZfmZIKoDx3PYtLGFlo0plFJ0u3reTL4Nx9PN2zwvh+vleqVQ9pS37G+dGMIdYqDIvj6ppAPaPIq/6AeySpT+2u9rCRnNYMLtc3PsOndcCfwcHURkCMIuwqApq4ZV7EkCPYGeST9NdTejhoMr9di2PGQrktTGtSCpDnrUh7WoqIt3k6jLEphSSFOtRNX5aapbEhi5PEbzZowNOtiSdc04H+iA0dR6k00tSRp990hjJsCmjEGzH3fRmnVo9bR7psvsIEMHeU/Hc6RSKdZ9sIlsNk/W7SCdb8FxfWGhcnj+uIKo6LlZltTUHtJ7u1WGNY8vKLZQ42KXvU8N8D6M+ViM3ngjYLnbhS53LCAiQxAmEJGKKF7F0IpmjRZKQeOGzWzatLmkFoUgCLseIjIEYVeib3dVQGeWBDB9S0bQihG3apnkTQZg78oAZbbCDtu0JxOETSgP6p9jtaE8tVGd3lle001wShBjsu6aqupqUFXaXTKgFSOn3RPGpk0Y65tQa3UgZv69bjrW67U0dsRpTIdp9Et3b87A5qxLa05bT9rNDjrNFgCyqovudBdr399IJpPTWSM5XU0y73Tjepkel4hySi0Xg1gaduav7H7BoBPArr5LWTFGqgvrruMhGhOIyBCEXYD+2Qxmr/btAUwjWKzqGbGrqFKT2SOqnx+YdHmrK0Dt5CqUYVAWgGq/XHhNJENllRYZwcm27kNS78dhVFUNXgMjr10kgBYYazaTW63naV0fYX2HLuy1Ph2iKWuySXs5aM44tLrdtPvCIk07GU93Wm1taWPdB5vIOdrVks634hbjLrK+sOgV29DrJj4WbnbDWcPAXXN3HmPh/RoNCi3tR3uOiYSIDEEYw2ypdHhP+3ZdE6OQspo06tnNrOIjfmuRdWmLYG0ZOdMiGYCqoEt1WMczVJenCE/S46wpCairRlVoSwaRSP8Fufomb7Q0F2Mw1FotMFrWaTfMuo44a9O+JSNtsimjaM5qy0ULnXRaraS9NgDyfjzG+nVNNG/uJJ1vIe+LDNdLo/y0VIU75kTF9rCrr18QhoqIDEEY54QTYezysRmH4Xke77+/jo72Lkxjy5VDBWG7EHfJqCAiQxB2RXqlrJpm0I/D0JkgdV4De5UH8ADTNnGqksT9T3pVUFEdylMd00WuonUOdoNfcKuuClVdOXirdtctlgc3NmxEfaArbObf66Z1fYR1vovkg+4Q6zPaArMx7dGcy9FitAHQxWbSbjuOm8Z1PVa/+wHptF98K9uI43YXy1TrSpKF4llKfv0L24VCWr2PBiIyBGGMMmDp8EKLcL90OBRSVstJolNWp4Ri7BVXvNNlULlbkpBtktDeC6pCDtWRDIkqfSMPTApDvR/oWVWBSiQGXowvMIwNTfr5B5tx3teujrZ1Idb3cpGszxhsTOtv883ZLM1mK11oQZJx28m7aRzH45133ieTyZLJ6foarpdCebkeMdGrkqQIDGG7UcbIxFNITMawEJEhCOOUSCJMJBHGG2P3Z8d1+ec/3yfrx2kIgjB+GXP9kJ999lk+85nP0NDQgGEYLF68eKvnLF++nMMOO4xQKMTee+/NAw880G/M3XffzR577EE4HOaoo47ihRdeGPnFC8IOxMAAwwbDLqasmmaQkF1G3KqlQdXQoGrYt9xkY84kUpsg50LEgmTAJRlwqQplqUimCE0yCU0yMeoSUFMBNRWo8vL+Tc88BZ7CaGvTlTzX6c1Z00XHuiAd64JsaC9jXTpEY9qkMW2yMe2xOZv1rRjNdKom0m6r3nIdvP2Pd0inU3henkyuGcftxHE7fSuG3wujV9MtsWIII4XyjBHZhKEz5kRGKpXikEMO4e677x7S+NWrVzNr1ixOOOEEXnnlFebNm8cFF1zAU089VRzzyCOPcMUVV3Dttdfyl7/8hUMOOYSZM2eycePGHXUZgjAyGEaf6p4mhmHqjBIzjG2GCVsVVHr17B6PsHs8QtQGp7yMRMQiZkNlSFEVcPQWzRCtdrHq4lh1caguR5UnUeXJAbNJjI42vfmdVJ0PunA+6KJzrc2Gtjgb2uKsT4dozJg0ZRRNGUVzLkez2ewLjE2k3VZybopMvot33nmPdCZNNt9GNt+G46b8Jmb5YgZJ7/8EYaQolBUfiU0YOmPOXXLKKadwyimnDHn8okWLmDZtGrfeeisA++23H8899xy33XYbM2fOBOCHP/whF154IV/+8peL5zz55JP86Ec/4lvf+tbIX4QgbAeD1lDwLRig+5OEbB0/UWbWMoly9vXDKZqxiVXFiPqf7oqAS1VY15soK89g1wahWg9WleWoskHiMFLdGC1t+nFjM+66drrX6qdNbXE2dOtW8hsyFhvTiha/vXuL0UYXOkBUC4xuUB7vrV5DV1cXOaejNLhTYi+EnYEaoToZo1zjZFdjzFkyhsuKFSuYMWNGyb6ZM2eyYsUKAHK5HKtWrSoZY5omM2bMKI4RhPFEecMg2SGjyIYNTbS1dYz2MgRB2MmMOUvGcGlsbKSurq5kX11dHR0dHaTTaVpbW3Fdd8Axf//73wedN5vNks1mi887OuQLUtjJ9Cu+ZWIahSZoEUKWtkBUurVMKw+ScSGcDOMGg0RtSNjaKlARdCiPa8tBuFph1sah3LdklJX1LxleKLjV0Q7NbQB4je1k17k0t+rzGrvDNGX118emDLRkHVrQlTu72EzG1Z1U816a1tZmNjTqrJS804XnpXuVBx8/BbaEsc7IxFNITMbw2OVFxo5i4cKFXH/99aO9DGGCMbirpNCfRH9kg1aMMrMWgFrKmBKFdWmoL09gGZCwoTyoxUJ5KEOsXGdyWDVhqIyjyv3aGH7p8ZKX6tSC2mhpg41tADjrs7RvjtKU8rupZgNsLJQKzzq0qC46De0i6fbayLk6vbW7u4v33vsAx9Ulx4sCwxcXIiyEncYIxVNITMbw2OVFRn19PU1NTSX7mpqaSCQSRCIRLMvCsqwBx9TX1w8671VXXcUVV1xRfN7R0cHUqVNHdvGCsBX61sWwTR0HEbISVLpaZEwrD9LlGIQqoniWRcSCRMCjIqiFRXk8Q7DKn6cqCokyVEwXzsLsI2rSaYx2bZGguQ23SZf47t5ks6krQlNWx4Q0Z6Elq0VMu5Oh3Wqm220DIOd04npZlILVq9/HcTJ9YjAkqFPY+ejAT2n1vrPZ5WMypk+fzrJly0r2LV26lOnTpwMQDAY5/PDDS8Z4nseyZcuKYwYiFAqRSCRKNkEYqxiWQaImPtrLKGHDhibS6cxoL0MQhFFkzFkyurq6+Oc//1l8vnr1al555RUqKyvZbbfduOqqq1i3bh0//elPAbj44ou56667uPLKKznvvPN4+umnefTRR3nyySeLc1xxxRXMmTOHI444go9+9KPcfvvtpFKpYraJIIwpiu3cezqtgqXLh9vavREzq6hR2uVRG4aueIxYQI9N2FAecCn3m6BFkzmsaj89tTyOSsQhFOr/uq6L0dkJzboCp9rURa5RV+5s7YizKRuiOadfozWraMvruIp2s420107eLTQ2y9LV1cmGDRsATzc6K2SQKFesGMKo4Y1APIUnFT+HxZgTGS+99BInnHBC8XnBZTFnzhweeOABNmzYwJo1a4rHp02bxpNPPsnll1/OHXfcwZQpU7j//vuL6asAZ5xxBps2beKaa66hsbGRQw89lCVLlvQLBhWE0aRvPIZ+rm/qpmFjmUGCprZWVHi17F6mg0BTyiJcEcX29UiZrSgP5knEtBUhUGViVPgN0hJlqEisf9EtwOjqwmhth2Ydk+E2pelq1a+xOR2mOWfR4sdCt+Uc2ouBnq3kvE7yflt2183z/vsf0CMw8iXFtQRhVJCYjFFhzImM448/HrWFv8WBqnkef/zxvPzyy1uc99JLL+XSSy/d3uUJwpijrCZOvm9sxSjS1LSRTEbcJIIgjEGRIQgTml5pq307rQbMCBFTNzOrUmVUhAxM2yQXDRO0DBK+cSIRcEmGckQS2p1hVUehQrtWVCIO4XDpa6Z05ofR3gEtbXgbtdsjs9GguUu7Z5pzAVpzBh057T5pdzN0WW0AZN0Ocm4K182Sy+fZsKER19OvrbwcxU6qgjCKjFTg54gEj04gRGQIwhjGMHrcJQErRgLdzn1KNEzaVSRrouQNg6ABMb8uRnnQoSySIVDl19goj0DSFxmRGNi9Pvb5PEZKiwra2mFzJ85GnZXS0RalNaPdJS05i7YcdPhxGJ1mJxlPu1Xybjeep8uCr/3gAzzlogrZJEg2iTBWkC6so4GIDEEYZQaOxejbzj1C2EpS7ulqnuUhg9Y8xOJRgibEA5CwddxDIpAlmsxjVfjBneUxVNQP/AyHddpqoTVrOoPRpWta0NqJuylFulkX52pJh2nOafNIaw46cy4dSouHtNFO3tPnOW4az3Po6uqkta0Vz8v2atcuAkMYGyhGJmhTAj+Hxy6fwioIE5WyqhiGMXa+8Nau3TDaSxAEYYwhlgxBGCsU4jH6pK0CBKwwUaOChqDOLsl5UFYVxUURMk2/jLi2ZJRFcgTKFUbSt17EYxD1s0sKrhLH0S+ZTkGHzhJRLV3kmz06O3QcRms2RFter6Ujp+h08nSb2rWSVV3kXW3VcL08rW0tpHy3i2STCGMSNTIlwSUmY3iIyBCEMUdPHEbBXRI04yS9KpJR7cpwYmECtn4csyFmeZQFdLxEJJrDLLMh7gd4RiKoYNCf2neV+NkfRioN7drt4bVmyLTatGW0m6UlZ9HmtxjpzHt0qgxpQwuSvJfC9Qq9fRTr1zeiVOG5BHoKYxNJYd35iMgQhF2QRHX/niOjRXt7u6SsCmMepYwRiacQkTE8RGQIwigyUNBnIaPEMGxsS7s8wmaCaqWbn4XjQaygXWw7ErEgbnvEgtoFEoq7mPEoxLQlQ4UCYPX6qDsORka7OujsQrXpFFanxaOrK0JbXls9Oh2TLt+SkXLydJvdZJV2iThuFs93iaxbvx6lvF5VPSXYUxAEjYgMQRgzFOIxtBvENG0CphYZcaqpCQdJ5RXRRBQPRcQv8Rm1IW47REN+p9U4GLEAhHwXid2rumc+D5kMRrcWFnSlUR3aCpFtN+nIhmjP69fvzENXXguHlMqRMTpw/NRUV+VRyqWrq4tMOuu3bhc3iTC2kToZOx/JLhGE0cYwSvqVFGIxLDNI0Irptu5ekrBlkDMNrHgQE4OIpa0YMcsjZjuEwnlC4Txm3IJICIJBvVkmKE9vjoORzUAqrbfObtx2B7fdId0dpDNv0+lYdDoWKQfSjkfa8ciYafIqjevlcL0cSjkoPDZsaEThgXKKlyNWDGGs4vkuk+3dhsPChQs58sgjKSsro7a2ltmzZ/PWW2+VjMlkMsydO5eqqiri8TinnXZav87ha9asYdasWUSjUWpra/nGN76B4zglY5YvX85hhx1GKBRi7733HrBC9s5GRIYg7EIkKqOjvYQi2UyWzs6u0V6GIAyJQsXP7d4Ynsh45plnmDt3Ln/+859ZunQp+Xyek046iVQqVRxz+eWX8+tf/5rHHnuMZ555hvXr1/P5z3++eNx1XWbNmkUul+P555/nJz/5CQ888ADXXHNNcczq1auZNWsWJ5xwAq+88grz5s3jggsu4Kmnntru9257EHeJIIwRCvEYhp9RYpkhwoYuvlVvJsi4iqqKCJ5SBG2TkPZqELV0PEYwql0bZjQM4WBPuqphgqOPGU4eozsNXdpdojqy5Nv1sK5MkC7HJuX/OEo5im6/PHjG6ibndeP4GSSe57JpUwuGYeJ5jrZeSEScIPRjyZIlJc8feOABamtrWbVqFZ/4xCdob2/nv//7v3nooYf45Cc/CcCPf/xj9ttvP/785z9z9NFH87vf/Y433niD3//+99TV1XHooYdyww038M1vfpPrrruOYDDIokWLmDZtGrfeeisA++23H8899xy33XZbScPQnY1YMgRhFDD8//pjYZp2MR4jQoIICcKWiRMOEAiYGEDYMojaPfEYkWCeQBkEysCIBSEcRNk2qiA0XFdv2axOX+1KQ1catzNHLmWTS9mkcgG6HJNuB7odyDguGSNLxsiSUyk8lUd5LspzcT2P5uYWAD91VeIxhLGPNwLb9krp9nat6isrKwFYtWoV+XyeGTNmFMfsu+++7LbbbqxYsQKAFStWcNBBB5V0Dp85cyYdHR28/vrrxTG95yiMKcwxWoglQxB2ERJVY8dV0trSusVuyYIw1ii4O0ZiHoCOjo6S/aFQiFAotMVzPc9j3rx5fOxjH+PAAw8EoLGxkWAwSHl5ecnYuro6Ghsbi2N6C4zC8cKxLY3p6OggnU4TiUSGcZUjh4gMQRhN+nVdNXsKcFkxKrxqAOyASbAsWCwjHvYLcAHEbIdwJIcZ9+eJhiAcgkDPx9soVPjMZCGVRnX5bo8Oj3Rap7qmHJu0a5L2M1HTrkva0NkkeZXF9fI6yBPYtGkzXiHYU4kVQ5hYZLNZkslkyb5rr72W6667bovnzZ07l9dee43nnntuB65ubCEiQxDGDKafVaJ/DYWMOFWGLrplJ7QQiFim/ydEfJERCeh4DCPm/4qKBCEQAMsP2lAeOH7Bi2wWujOoLp3umu80SGV1imvKtUi5kHa0hSKrXBxTixHHy+CqHEopUt3dZDI5P22VYjyGZJUIY52RapAWCoXYuHFjyf6tWTEuvfRSnnjiCZ599lmmTJlS3F9fX08ul6Otra3EmtHU1ER9fX1xzAsvvFAyXyH7pPeYvhkpTU1NJBKJUbNigMRkCMKoU4jP0EW4TGwziG0GCRllWIaBZRgEy3XNi6BlELQMQibELJeY5RINOthxMKNBzKgfjxEM6IBPw9SO5Lyjt2wOUlm8LgevyyGXtunO661gxci6nt7IkVcZ8ipTjMcAaGluBTy/AJdYMYRdhxHJLvG1dCKRKNkGExlKKS699FIef/xxnn76aaZNm1Zy/PDDDycQCLBs2bLivrfeeos1a9Ywffp0AKZPn86rr75aImyWLl1KIpFg//33L47pPUdhTGGO0UIsGYIwxglGAgRDY+OjqpSipaVttJchCMNGKd22ZyTmGQ5z587loYce4le/+hVlZWXFGIpkMkkkEiGZTHL++edzxRVXUFlZSSKR4LLLLmP69OkcffTRAJx00knsv//+fOlLX+Lmm2+msbGR+fPnM3fu3KK4ufjii7nrrru48sorOe+883j66ad59NFHefLJJ7f/oreDsfHNJQgChcwS26/ymfSqcA1FrCKCoxRR0yRUCLuwFBG/62oolMeMmhD1K3v2dpUAKA8jr90jZLOoTA6v2/Ofhki7emzKNck42pIBkDOzOEpXA3X9VNb2jk6UwrdgFKwYYs0QhMG49957ATj++ONL9v/4xz/m3HPPBeC2227DNE1OO+00stksM2fO5J577imOtSyLJ554gksuuYTp06cTi8WYM2cOCxYsKI6ZNm0aTz75JJdffjl33HEHU6ZM4f777x/V9FXYBpGxevVq/vjHP/L+++/T3d1NTU0NH/nIR5g+fTrhcHhHrFEQxhWlqas9rd0Nw8QygwRMnUUSVRG6VR4rYWMYBiHLKNbGCFkeYUuLjEDQxQybPYGetk2xsQnoeIysH5ORzqG68jjdhaeBosjIupB1FVm/B0nOyOIqLU48v8JnS3Nb8bkEfAq7GqNRVnwoWVjhcJi7776bu+++e9Axu+++O7/5zW+2OM/xxx/Pyy+/PKz17WiGLDIefPBB7rjjDl566SXq6upoaGggEonQ0tLCO++8Qzgc5uyzz+ab3/wmu++++45csyDs+hh9hAZgYGIaAYKGtmTYyiRQZoGtv6gCpknQFxlhUxHyLRl22INgoJfI8Ae5fvZH3tE9SwCyObyMQz6tx6T9WAyAjAs5T5H3s0YcM4dLT9li11HFHH9wewI9JehT2AVQGHjDrNY5ECMxx0RiSCLjIx/5CMFgkHPPPZf//d//ZerUqSXHs9ksK1as4OGHH+aII47gnnvu4fTTT98hCxaEiURZ+dipjdHW3rH1QYIwhhmJ0i4ip4fHkETG97///S36dUKhEMcffzzHH3883/3ud3nvvfdGan2CMO4pae1uBomja2M4eETKQ7h4hA2boEkxJiNkeQQsbWUwg2AELTAL9Tb8X1peoZS4o1NXAbrzqLRHPquzVTKuRca3ZGQ9yLkeOUNbPRw/qwRA4dHW2lHMJpGsEkEQhsKQRMZwAkeqqqqoqqra5gUJwkRCx2f0tHa3zBAhpWOb7ISJbepjQdMmYBoETf07KmR6BGx9ozeDYNgW2L0y0r1eofTZPOS0IFFZBzcNubz+6Odck6zvY865kFcKx3eReLh4nu86cVxSqTSq2G21d+CnIIx9FCNTJ0NavQ+Pbc4u2bhxIxs3bsTzSr9oDj744O1elCAIY8xV0tq+9UGCMMaRmIydz7BFxqpVq5gzZw5vvvlmMWrWMAyUUhiGgeu6I75IQRi3+KXEAUxDN0Wz/I9lJBnAxQ/uNCBkUbRkBE2PQMB3hwQNsIxilgoArovhp6LiOD2WjIyDlzXIFTJKlEnO/8jmPUXec8n77hJX9QR9trd1oZQnpcQFQRgWwxYZ5513Hh/60If47//+b+rq6oq9FARB2Do96atmr336sWWGiBgVeMojlgiD7RHw9Ec0YJp+TIbvLrFc7N4iI2CD1WtOT+muq6AzSwoiI+fi5gxyjhYZOdcg73tVch7klIdr6LTVgmvEdVy6u3N+HIaes3drd8ksEXYJ1AgFfso/92ExbJHx7rvv8r//+7/svffeO2I9gjD+6ZO+WrBkWIZNiChZI0NlUvcsCRabpekaGWHLFxm2ix3yLYlBG4J2TwGuQo2Mgshw3V4iQ+HkbXLFYM/elgwPBxenEPiJX4CrvRMTE9fLScCnsMuiMEYoJmMEFjOBGHbvkhNPPJG//vWvO2ItgiD4lCXHTjxGe3vnaC9BEEYEhTEimzB0hm3JuP/++5kzZw6vvfYaBx54IIFAoOT4Zz/72RFbnCCMVwpuE8MwMXxrhWWGMDAJxS0M28NDYfnjdGYJhE2/lLjtYBYsGWFbF+AquEsM02/U4Fsd8i7K8d0cOYXjGOQ8bfXIez3uEtdTOIbTE3eBnqarK42rHN99IqXEBUEYOsMWGStWrOBPf/oTv/3tb/sdk8BPQRguFmbRJaJdJGXJMAoPS1kE/BTWkKmDPoO+uyQQcLAKTR8DlhYZ/lgMo1RkOK6uGQ54OXAcm7ynxUte0eMu8dNXe1f57OzsBgyUclF4EvAp7LLoFNbtn2ck5phIDNtdctlll/HFL36RDRs24HleySYCQxC2n7JEbLSXUERcJcJ4wlPGiGzC0Bm2yGhububyyy+nrq5uR6xHECYGhllMXzVNG9O0CRlxzIiHHTJRhiKkQgRMQ2+W36/EcghZDoGAhxEy/c3S2SW21dO3RHng+lveReU9VN7DzULOsch5hc3AUejN88gbeVyVw1U5lOfS1ZHBwPKDPvOj+54JwnagGJmYDMZpTMZf/vIXrrrqKlpbWwGYP3/+iMw7bJHx+c9/nj/84Q8j8uKCMDEpTV81jQCmoWObYolQ8ZiFWRQZQRMCpkfQ3+yghxEyMEKGdpdYpnaTFDJXXE/Xx3AccFxUXm9e3iTvmuQ8w98g7yq9KQ8PHXuhlEMqlcFxcyjcYmaJ8v8rNEWT9FVBGB9cdNFFxONxPve5z9He3s7TTz89IvMOOybjQx/6EFdddRXPPfccBx10UL/Az69+9asjsjBBGN/09CsJWLqMuIFFWTKC4ZtjbSwCZiHwU9fICFh+KXFb6VLioGMxeqfFFuIxinUyHFRWiwEnrwtx5QoxGR44fk6eTl/NFYt6dXV090pZ9ZBS4sIujRqhmIztn2JMEg6H+c53vsNJJ53E+eefP6QW9UNhm7JL4vE4zzzzDM8880zJMcMwRGQIwjZi2xaRSGjrA3cS7e1do70EQRgxRir9dLymsEYiEQCOPPJITjnlFC655JIRmXfY7pLVq1cPur377rsjsqi7776bPfbYg3A4zFFHHcULL7ywxfGPPfYY++67L+FwmIMOOojf/OY3JceVUlxzzTVMmjSJSCTCjBkzePvtt0dkrYIwFAz/v+JzPx7DMExsM4ptRokldWfUAGG9GT3uEtuAgKkImC4B08UMKG3eCJi6pLjZ66OsPG3JyLt+PIaLynqorIeTs8h5Pe6SvCqUE1fkcXD9uItsNoebB8fL4Xg5ndYqmSXCLk6hb+D2buORG2+8EcfRmWXnn38+jz766IjMO2yRMRgbNmzg5ptv3u55HnnkEa644gquvfZa/vKXv3DIIYcwc+ZMNm7cOOD4559/nrPOOovzzz+fl19+mdmzZzN79mxee+214pibb76ZO++8k0WLFrFy5UpisRgzZ84kk8ls93oFYVgYBbFhUUhfNf3/4mUhFC6WsrCUhW2aWH5bkqCpsA0P29abYYNhmRiWqQVGb3eJ60Fex2IU0le9nJ++6lrkPZOcMsgpA8ftERmO0ZO+2tmRwsPDcdM4bloqfQrCOOeoo47CtnucG7Nnzx6Rebepd8lAvP/++7zwwgtceeWV27WgH/7wh1x44YV8+ctfBmDRokU8+eST/OhHP+Jb3/pWv/F33HEHJ598Mt/4xjcAuOGGG1i6dCl33XUXixYtQinF7bffzvz58zn11FMB+OlPf0pdXR2LFy/mzDPP3K71CsK2UGyKZtq+RcMgWqbNlbb/sbQNg6AfdhHwLRmWpeMszABafUBPEa6CD9XrZckAnVnil75wHJOcZxbrZOQUOL6A8AwXEwMLm672DEq5vQpzudKvRNilkVbvg/Pss89u03l77LEHu+222xbHDFtkFNJbCriuy7vvvsubb77JPffcM9zpSsjlcqxatYqrrrqquM80TWbMmMGKFSsGPGfFihVcccUVJftmzpzJ4sWLAe3eaWxsZMaMGcXjyWSSo446ihUrVojIEMYEZWUxxkqvQdf16E6JlU8Yf4yENB6P8nrOnDnDPscwDObNm7fVOMxhi4zHH398wP3f/e53Wbx4MV/5yleGO2WRzZs347puvxocdXV1/P3vfx/wnMbGxgHHNzY2Fo8X9g02ZiCy2SzZbLb4vKOjY+gXIghbwjCLnVcDprZelPkN0SwjhO13XrVNg4AvPAKmImi62LZfStw2emWXmLo+Rm+V4nng+ZYMx8PNFbJJLF1KvFhxXBUtGYXGaKnOLKYRwFNO0U0i7hJBGL+sXr16h809YjEZZ511FsuXLx+p6UadhQsXkkwmi9vUqVNHe0nCuMCk0Hm1UIjLVQ7xMp3GaqsANpafvmoStCBoQcj0CFoelu1i2S6EjJ7AT9ukX4Egr1BhS6EcD88x8ByDvGsWRUbe06XE88olr3q6r3a2d2NikvfSxZoZkr4q7PKokar4OdoXsmsxYiLjr3/9Kx/5yEe2a47q6mosy6Kpqalkf1NTE/X19QOeU19fv8XxhT+HMyfAVVddRXt7e3H74IMPhn09gjAUotFwScDVaKIUdHWmR3sZgjDiKEqrvWzrNl41xqOPPkoulys+X7t2LZ7X88Oiu7t7m5I7hv3N1jf+AfQN+1e/+hWzZs0qOf7DH/5wWHMHg0EOP/xwli1bVoxs9TyPZcuWcemllw54zvTp01m2bBnz5s0r7lu6dCnTp08HYNq0adTX17Ns2TIOPfRQQLs+Vq5cucU84FAoRCg0dmoWCOOH3p1XDSziZREULgoLC5ugHxQaNCm6S4KWImi72H7nVTPolxIHsP2S4n7hLvLKLyvuF+NywHX0nDk/s6TgLnE8hdvLQpFOOeQ9/UXjelndFA0kfVUYBxgjErQ5HgM/QXsjNmzYQG1tLQD7778/r7zyCnvuuScAnZ2dXHXVVcNO7hi2yHj55ZcH3H/kkUeycePGYqqpsY1RbFdccQVz5szhiCOO4KMf/Si33347qVSqmG1yzjnnMHnyZBYuXAjA1772NY477jhuvfVWZs2axcMPP8xLL73EfffdV1zHvHnzuPHGG9lnn32YNm0aV199NQ0NDSOWoiMIW8Kgp9x3IX3VMoPF42WJKAqFhY1NANvQsRYBsye7JGR4BC232N6doKXLiYMWGZZZrNQJgOOB62eC5D2cvO3vNsm5ZrG9u+OnrhZIdWRRyu/Y6jkSiyEIE4S+FT5HreLnju5bcsYZZ7Bp0yauueYaGhsbOfTQQ1myZEkxcHPNmjWYvQoPHXPMMTz00EPMnz+fb3/72+yzzz4sXryYAw88sDjmyiuvJJVKcdFFF9HW1saxxx7LkiVLCIfDO/RaBGEgDMPEMrWVzA4YRKN+6qoRJqCCBPzU1KAFIUP5j72S9u5G2IagX9LftkoFBrqsuHIKKay6PgZA1jXJKqOnvbunyBs9JtJUR5aspyt96vRVf45xayQWJgoFd8n2IrJ7eIwNR3AfLr300kHdIwMFl55++umcfvrpg85nGAYLFixgwYIFI7VEQRgREon4aC+hSCaTI59ztj5QEHZRpHfJzmdIIuPkk0/muuuu4+ijj97iuM7OTu655x7i8Thz584dkQUKwrjCMDENu1iMK5HsERmmYWN7NkHfUhc0tAUDIGi5ur170He72L3cJYWKn72LcbkeyjdXeFnI5fXYnGfheNqCAZBTLo6hx6XaM3i45N0UgJ9Z0usrdYTMp4IwGhRavW8/4zMmA+Cpp54imUwCPfGQherZbW1t2zTnkETG6aefzmmnnUYymeQzn/kMRxxxBA0NDYTDYVpbW3njjTd47rnn+M1vfsOsWbO45ZZbtmkxgjB+MYt/GoVS4qZJPB7FQAuAQvpqsfOqBcGCu8T0sOwekUHQBssXGYU/C4Ig70A2j8po8eBkTXIFd4lnkHEh64sMR3mYvuDpbs+h8HD9Kp9aYJT+bhO3iSCMX/oW5epb92pbYi2HJDLOP/98vvjFL/LYY4/xyCOPcN9999He3l580f3335+ZM2fy4osvst9++w17EYIwESlLxLY5QHqkcfIu6e7ceP6RJggj4y4Zpzq7d7rqSDLkmIxQKMQXv/hFvvjFLwLQ3t5OOp2mqqqKQCCwQxYnCOMNHfSpM0uSyYR+bujPj0WQoGEWAz9Dpk5dBQjaLlZQYRRdJL06rxZSV91CXqoLeQeV8St55gwyviUj45pkPcj5mSdZcnh4tLd3ESBIu+rC8zuxqhIrhniihV0fafW+89nmwM9CJUxBEAam2Nrd6GnzbhgBDMPEw6MsEQXAMvwW7ypAwLSw/dNsE4KG5z/227sXO6ZZPW4S0PESTiFlxEFldXt3gHwuSNbVH/WMZ5B3wfHjKzzDw8Yi3aHFRsZtx/XrZCjlSX0MYdygRqhN+3gMTZo2bdo2WVV3SO8SQRC2gULXVcPGNALEYmFM08DAxCp0XcUm0KvzatBQPZaMgIsZBKMoMvwCXL3mLtYidFzIu7h+651szibjFopxGWQ9yPumUQMDHJNMh4NneLgqi+f16bwqCMK45oEHHtim8/bYY4+tjhGRIQijQHn52LECdnVIGXFh/KNbvW//POMxJuO4447bYXOLyBCEHY5JIbvEMGyUcikvT/rlxa1iTEbQC+imaIUEElMRMrVVIRDwMEMGRtD/yAbtnpiMQvpqwV3iuKisi5f1O6+6PZaMjKvjMXJ+h1YMyLY5hFSITrMVx8tRiL+Qap/CeENiMnY+IjIEYSdQqIthGCaRaIiA33fEMoLYyo/JMGyCVo+7JGx5hCwtBuyAixE2tLgAXUrcn0NZFobj9DiLHReVd3F8kZF1LHKefpxzdY0Mx6/kiQfpjhwmBt2qVfcrKYoLqZEhCML2MewurHPmzOHZZ5/dEWsRhHFDsV+JH/SpAz4DmIZNeUUSf6/frySITZCAYRK0DMIW/uYRsl1Ctksg6mFEbIgE9RYOoWwbZdu9sktcvTkeKqtw8hZO3iLrWmRck4xrklM6HqPw+tn2PHnl4OCS97rxPAdPOX5Jcejd4l3iM4RdHU+NzCYMnWGLjPb2dmbMmME+++zD9773PdatW7cj1iUI45aK8sRoL6FIZ5vEYwgTA2n1PjoMW2QsXryYdevWcckll/DII4+wxx57cMopp/CLX/yCfD6/I9YoCLs2holpBDGNINFohEAwgGnamKaNZQQIqiBBFSRkmgRNCJuKsKmIWB7hUJ5wKI8ZASMagFBQb4GAdpcE7NI6Ga4HOQeV9cjnLfJ5y6+NYRSrfWY8D4XCVR5up0fOyJIzsjgq26spmivpq8L4QulW7yOxCUNn2CIDoKamhiuuuIK//vWvrFy5kr333psvfelLNDQ0cPnll/P222+P9DoFYRfELG46yNOkvCKBgYlpBDCNAJYRIqSChFSQoGkSNiFkeYQsj4jlEAzpzYyaGOEghAIQCqCCATAtvRmmdpPkHV0jI6fTV7M5W6evehYZDzJ+Ea688jAxSbdnMRW0m5tpNzfjuGkJ9hQEYUTZJpFRYMOGDSxdupSlS5diWRaf+tSnePXVV9l///257bbbRmqNgjBuqBhDqaudreIqESYOI+Uu2RYZ/uyzz/KZz3yGhoYGDMNg8eLFJcfPPfdcDMMo2U4++eSSMS0tLZx99tkkEgnKy8s5//zz6erqKhnzt7/9jY9//OOEw2GmTp3KzTffvA2rHVmGLTLy+Tz/+7//y6c//Wl23313HnvsMebNm8f69ev5yU9+wu9//3seffRRaasuTFgKQZ/F//yAz2SinEDALhbgsrAJqBABwyZg2IQsg4gNUUsRtRSRgEMw4hGMeJhRGyIBCIX0FvBTWE1TuzV6WzLSeZxuk4xjk3Fs0q5JxoGMozNLDMD0DHKdeVwUWdVFVnXheNli51WlPAn0FMYdIxH0uS2filQqxSGHHMLdd9896JiTTz6ZDRs2FLef//znJcfPPvtsXn/9dZYuXcoTTzzBs88+y0UXXVQ83tHRwUknncTuu+/OqlWruOWWW7juuuu47777tmHFI8ewU1gnTZqE53mcddZZvPDCCxx66KH9xpxwwgmUl5ePwPIEYRfGT1u1zCAKj/JKHfBpGha2GQYgpCKETZ2zGrIMQhZETJ1eGg44WBH9lWZEbYiEtbsEetwkoL/5cnnI6nLgXtoln7HodvTHO+2Y+A1Z6XY8FOB25IhZNk1OF3nV7U/j+P1KxGUijD8UIxO0uS1znHLKKZxyyilbHBMKhaivrx/w2JtvvsmSJUt48cUXOeKIIwD4z//8Tz71qU/xgx/8gIaGBh588EFyuRw/+tGPCAaDHHDAAbzyyiv88Ic/LBEjO5thWzJuu+021q9fz9133z2gwAAoLy9n9erV27s2QdiFMftsivJkGfgN0iz0FlABgqap4zFsiJgeUdshajuEw3msmIEVMzCiIR2LUUhbtWxtwVAeRt6BbA7VpTevyyOTCZB2LNKORcrVpcSznm7tbmOQbs9gGwat5mbyXpq8l9Yio9CvpNDmXSmpkSEIA9DR0VGyZbPZ7Zpv+fLl1NbW8uEPf5hLLrmE5ubm4rEVK1ZQXl5eFBgAM2bMwDRNVq5cWRzziU98gmAwWBwzc+ZM3nrrLVpbW7drbdvDsEXGl770JcLh8I5YiyCMWyoqkpjmdoVAjRj5nEs2lRvtZQjCTsdTxghskM1mi01CC9vChQu3eV0nn3wyP/3pT1m2bBk33XQTzzzzDKeccgquq02QjY2N1NbWlpxj2zaVlZU0NjYWx9TV1ZWMKTwvjBkNpOKnIIwQfbuuGn65cMMwqaqqwjAMTMPCNIIEiQAQIUTE0uIjYkHM9ogGdCGsYMTBjPsf0UI8RuFXignkfbdGXrtKVLcWDk7KIJUN0OUU2rtDxu2xRmTbM+T9ikIZush7OgBUN0ZzR/x9EYSxwki5S0KhEBs3bizZHwqFtnnOM888s/j4oIMO4uCDD2avvfZi+fLlnHjiids871hARIYg7AgME9PQH69gMEBZWQwAywgQMEKEfJERNC1Cfm/3mAUxyyUa1PVm7JjCKPNFRSwM4RDYgZ7XKPQfyeWgO4vXrcVJrtuiO2+T8vuVpF3IulqQmBiozhwtro7DyBgduJ428xaDPgf4KpYgUGFXZ6QapBW8h4nEjiuqt+eee1JdXc0///lPTjzxROrr6/uJGsdxaGlpKcZx1NfX09TUVDKm8HywWI+dwdiw3wrCOKa6unK0l1Ak3ZXFyYm1QhDGMmvXrqW5uZlJkyYBMH36dNra2li1alVxzNNPP43neRx11FHFMc8++2xJUcylS5fy4Q9/mIqKip17Ab0QkSEII06hAJeNaQaorKrAMGwMw8Yyg9hGmKAXIuiFiFgWURuiNkQsj5jtEI3miEZzWAkTIx7CiIcgGkGFgz2Bn4YJjqe3XB66dcCn1+WRTgdJOXaxX0nWBaUUSim6W9O4StFsNtNsNpPzunC9HK6X86t9SmaJMD4ZzToZXV1dvPLKK7zyyisArF69mldeeYU1a9bQ1dXFN77xDf785z/z3nvvsWzZMk499VT23ntvZs6cCcB+++3HySefzIUXXsgLL7zAn/70Jy699FLOPPNMGhoaAPi3f/s3gsEg559/Pq+//jqPPPIId9xxB1dcccU2vV8jhbhLBGGkMLTbw8DANLV/tqKinIAdwDR0fIRthAgRI2ro4OmobVIIu0gEPMpCeYIx7fYwEyGIabcK0aiOybD8Fq2Oh+EHhZHJ6doYfl2e7pxNyrVI+YdTjtKFwh0PqztPl+vRTbuexk37sRjQU0rc/xqVrBJhPDFCiVLbMsdLL73ECSecUHxeuPHPmTOHe++9l7/97W/85Cc/oa2tjYaGBk466SRuuOGGkjiPBx98kEsvvZQTTzwR0zQ57bTTuPPOO4vHk8kkv/vd75g7dy6HH3441dXVXHPNNaOavgoiMgRhRCgGfUKveAyP2tpKDMPA9kWHbUYJqygRU3/04rZB3NbfWmW2QzySIViu5zKTYYhHAVCRMCoU1sW3APJZcHxxkM3hdefJdWsBks7bpByTtC8y8p6HbRik2jKELIMmp4uM0eEfS6P8jqsDxWNILIYgbD/HH388agvq5KmnntrqHJWVlTz00ENbHHPwwQfzxz/+cdjr25GIyBCEHUQsFiUSiYz2Mop0tnQTH+1FCMIo4rH9zc1GYo6JhIgMQRgxtJXB8LNKdES3gWkGsHxLRtCIEPUixAJ6bDwAZbY2OSSDWSJxB7PczyBJxnosGeEI2HZPDp7rQaH4TzqP1+WSzWgXTFc+UCwlrk8G1Z3HdjwyQIfZTs7t8qcpxGKAxGMI4xnFCHkAxbg3LERkCMJ20rtXCYBphAiHw8XS+rYRImhosRBVZcTMIHFbi4xEQFHu18VIRLOEKjzMCr/YXVkMFdOpr4TDuspn3i+i5eQh7aeedmVxu6A7q9Ndu/x4jLTT822oOropCxis7srSRTOOO0BtjN5VPgVhHDISMlqk+PAQkSEII4KJYeqbvGGY1NfXFS0alhUmZJYBEHNjxEMWSb/8RTLgUhHSwiGWyGFVBrQFA6Asjiq4W2z/o+qnpxnpDHRnAPA6s2Q6LTqz2gLS5cdjuP5PLs/x6GrXgmSjaidDe7EAV6E2Bkj8hSAII4+IDEEYYUKhEBUV5aO9jCIdm1OjvQRBGHVGqhjXSMwxkRCRIQjbSEkZccPCNHTcxaRJtZimRaDQadWIEVXaklFmhSgLmCQD+puqMuiQjGqLRKjKw6yMQ7keq6IRnbYKYBqQz2MU4jBSaejQVTvddpfuVJROp8eS0ZUHzwPPVQRSGTZmtUuk02gl56RwPb9j6xZqY4hlQxhvyL/onY+IDEHYbky/2JZJOBymsrIa0wxgW35/ErOcuKvzOuJhi/IgVAT0Tb88mCWe1MLBqgpCZRmU6bEqGoNArzLiuTxGSgsLOlN4rVqc5FpNOrIhOvI6hTXlgOMpTBM6N6cIGooNOX1el9lMzk3heYUGaYXaGCDxGMJ4ZsQsGds/xYRCKn4KwggyZcqk0V5CD0qLDEEQhNFCLBmCsA0UMkoADMPCMiOUlSUoK0tgmgGCVoyQqRsoRb0yyizt9igPmJQHFZUhnVFSEU8TqtZzmtVxqEigEn41i941NlxXu0pSvmho68Jt1daIVGeY9myATkf/ZujMg6MUgVSaChtas4pWsxWAjNuO62WLaatSgEuYMIxixc+JjIgMQRgGpe3ctXvCNCOAyW67TcU0Ld1p1YwRRzclShAnGdRjy0NQFXSpiujsjlhFDqvWFxNVCVR5AhX1RYbZq+hPLgfdKWjX9S285jTZZi0qOrpDdORtOh093lXaROm0pIhYBq91p+kwNgGQd3U8hurtIhGECYKksO58RGQIwhApsV5gFVNWTSNIfX0dsai2XATtuB+HoZ+XBwKUh/R5FQGPqmCW8jItMgJ1JkaNDvSkPIGKJyAYoC9GNoPR2QVtfhGt1hzdndo60pYL0e5YdPrNF3OuIpjKsKZLx31sppW0py0ZeS+N5+VQyh8svUqECcJIt3oXhobEZAjCdhIMBqmvrx3tZRRRKDo3dY72MgRBEMaWyPjlL3/JSSedRFVVFYZhFNvibo3HHnuMfffdl3A4zEEHHcRvfvObkuNKKa655homTZpEJBJhxowZvP322zvgCoTxSk8DNN3GHcPGtsqwrTJ232Mqth0iYEUIWBEiZpIyr4JyK6K3kEV1EKqDUBvKUx1LE6lyiFQ52LUxqEpCVRJVXg6xaOkL5/N6S6WhI4XXmsZr1a6S9lRYb3mbLscodn5Pt3QTUor3u9K835Wm1Wgi63aQdTtw3EyvtFWJxxAmFmqENmHojCmRkUqlOPbYY7npppuGfM7zzz/PWWedxfnnn8/LL7/M7NmzmT17Nq+99lpxzM0338ydd97JokWLWLlyJbFYjJkzZ5LJZHbEZQjjCAOjVxyGhWEEMIwAtlWGYZjU1taQTFQQMMMEzTKCZhlRKkkSpyJoUxG0qQxBdcjRWzhDoiJDoD5IoD4INX4cRnkCFR+gfVk6A+kMRlcK2lK4zTnc5hzdnQHaciG95S068pD3FDnHw+7opjGt2EQ7m2in29Npq4XUVaXy2k3Su4y42ICFcU7BXTISmzB0xlRMxpe+9CUA3nvvvSGfc8cdd3DyySfzjW98A4AbbriBpUuXctddd7Fo0SKUUtx+++3Mnz+fU089FYCf/vSn1NXVsXjxYs4888wRvw5hYhAKhWhoqB/tZZTQ2ZzCdCQ0TRCEscGYsmRsCytWrGDGjBkl+2bOnMmKFSsAWL16NY2NjSVjkskkRx11VHHMQGSzWTo6Oko2YWJh9G7p7FsxLDOCZUawrRB77TkNywpgmyFCVhlxo4q4UUW5l6QyGKQqZFAVMqgNedSHM9SHM1SXdxOuB7M+jlkfh6pyVCKJSiT7B3y6LkaqCyPVBW0deC0pss1m0VXSlrNpy2lXSc4FXEXXphRRW7tKWowNtBgbim6S3q4S5f/XG3GVCOMdhTEimzB0xpQlY1tobGykrq6uZF9dXR2NjY3F44V9g40ZiIULF3L99deP8GqFXYHeaao97du1wAgGdMbI1KmTiEV1VkjQKiNiVZJ0KwGoDISpCpvUhvVNuz6co6ZMV9yM1eexG8qgRqe3qvIkDOQmAUh1Y3T4AZytnbibcqQ6dKnytlyINsfyH+u0Vbu9k5oQrE0pNtJKt9cMUFLhs+gqkYwSYYKhRsjVIR+Z4TFqlowHH3yQeDxe3P74xz+O1lIG5KqrrqK9vb24ffDBB6O9JGEnUExT9QVGIQbDMiOEAuUA1NRUUlNdS8COEbBjRMwkSa+KCitKhRWlMmRRG4K6cJ66cJ76WIpkbYZkbYbA5AjUV6CqKvWWSOh6GL1rYmSzkM1idLRDi968TSkym01auyO0dkdoydl05g068wYZF8jlybd1YxuK91IZWowNZJw2Mk5b0YLR24rRm4GsGoIwHpGYjJ3PqFkyPvvZz3LUUUcVn0+ePHmb5qmvr6epqalkX1NTE/X19cXjhX2TJk0qGXPooYcOOm8oFCJUaE4lCD5lZXEaJo+tOAyA1vXtJEZ7EYIgCH0YNZFRVlZGWVnZds8zffp0li1bxrx584r7li5dyvTp0wGYNm0a9fX1LFu2rCgqOjo6WLlyJZdccsl2v76w61Mae9FTyVOnqcYACAUqCIdD7LXnnlimhW1FiJrlACRUNRVGnKqw/jjVhqEu7FAf1S6SiupugpN1vIUxqRxqKnS6KvR0WS3guhh+/I/R3Ira2A5AvsmhvT1Kc0aPb83bpHRlcLpaUsScPG93ahdIo7GJlJ9RAgxcfEtsvsIEZCT+1csnZ3iMqZiMlpYW1qxZw/r16wF46623AG2NKFgkzjnnHCZPnszChQsB+NrXvsZxxx3HrbfeyqxZs3j44Yd56aWXuO+++wAwDIN58+Zx4403ss8++zBt2jSuvvpqGhoamD179s6/SGFMMZDAKFTytMwY4aCOnQgGA+y99zRCQR0/ETXLSSod51NFgupQgBodLkFd2GFSJE11hb7Jh6cYmJPL9cHaSrzKqv71MApL6OzAaNHVOdnYhrtBC5XU5gDN3VFacvoj25rV3VZdx4OWTtIuvJ/Wr9dqri+6SaC0nbsEewoTlRGr+Ln9U0woxpTI+L//+z++/OUvF58X0kuvvfZarrvuOgDWrFmDafaEkhxzzDE89NBDzJ8/n29/+9vss88+LF68mAMPPLA45sorrySVSnHRRRfR1tbGsccey5IlSwiHwzvnwoQxR9/MkcI+wwxiW9rCFglU4OERCNjsvc8eRMMJImYSgKSqoxI9rjocpDZiUB/WZbwnhbPUlncRm6Jv7NbkcqjXQaGqpgoSg1jwUt0Ybe2wSYsMr7GDTKNeZ3N7lM3ZIO15/W8/5YBtQEdTBxWW4s/NeZpMLc673WbyTgpP9Q32BLFiCBOZkRDVIsyHx5gSGeeeey7nnnvuFscsX768377TTz+d008/fdBzDMNgwYIFLFiwYDtXKEw0gsEAe++zB8FA/34io02mM0uqNU1FbLRXIgiCMDBjSmQIws6gd6MznUHiWzKMEAE7TjRYBUAwaLHXXrthB2w/BqOShNJ92atIUB3WbpW6iMGksMfkSBaASeWdlDXksaf6oZiTKlHVek6VKO+/oJyOlzDa2mBTK6pRx2Hk1ju0tWgFsTkTpiVv0e6HVjiuwm5poy4C73fBBq+NdnRKdtbp9DutFuIwHHGTCBOekXKXSHbJ8BCRIUwIthTcaZm61XrAjhMJVOKpPPF4lD2mTSUS0K6NsJmkXNVSZRRcJDY1YT1nfdhjSjRDQ1LXtEg25LB3j8Ek30VSV42q1I9LUlUBPIXR3qaXsrkZGltx1usOrZ2bg2xO67VtzAbYnDHoKuiG5g68vHaBvNOVZqOxlnRe18XIu9pVopSODNWCQupiCIIEfu58RGQIQh8qq8qZMqUewxiblf3SHRnc1jRha7RXIgi7DlKMa3QQkSGMW/paLzTaPWIYOhXUMsPFDJKAGWHS5Cpqanx3iVlGzNQWiIRbQZUVp9pPU62LUAz0bAhnmFTeSbJBB1oGdotiNFShan0XSUUVWAMrAqOjrSSbxFmfItWoX2NTR5xNGe2SacubdDpgei5dG9rYLax4fqO2VKwzNtDpNhZTVl030yfYk5JvRnGVCIKwsxCRMYExxmgN/u29CZaWBQcwi/sMM4jpx14ARIM6xiIYDLDb7nXEYmWETH0sThVJtxyASjtMVdimXnsvqA87NER0imh9RSEGQ6elGlOqoa4aVaVFRr+eJABdXXpsSxs0ajeHu66d9DrY3KbjMDZlQzTn9Ue0w3eT2BtbqQ0o3mxXrHG0OGljHRmnnbyj01095aBK4jCkYZogwMhYIcSSMTxEZExkxoo7oM+ndpvFT8n19A7otDELlgsrTNhOErQT/ku7VFYmaZhSR9CKEDYTxL1yAMopozKkLQnVYZO6sGJSWFsPJkW7qanUQiE2xdNBnoUYjNoqLTAikYHXmU5jNrfox02b8da2AZBd59LSWkaTH4exKWvTqmNJyboQaOtkc7sDGLzTlaLJXANAKr+pGIehr2nw/iRixRAmKr0ik7YLkezDQ0SGMGEJBGwmT5lEWWLs54CmOzKwqQvGqPVJEARhIERkTGhGrT9eKSX3zeH8TuhZv05LNYv7dVOzQuXOMCG7UGBLWxsqqqLUTaohYAYImlpkRKkk6SZI2rpIW0XQotrPIKkJeUwK55gU0y6JqpoU4d3061lTK6CuClXjWzIqqgZ2kQCk0xjNzdC4SY9d10purbZAtG2K0piKsDGjz92cMUg54GQdvI3tlNnwl2Zt2lhnrqXT7ZWyWojDgAFTVgVBkMDP0UBExgTGMIZbYGprAmA4omWwuazSgMXeGH3nNzGMnlbshv/6phnEtnqERdSqwvSvNRy3mDqlgVhIx12EiRP3tOukzAyTDNtUhvQ8lUGoC2n3SF04S10iRbJex2EEpwQxp/ppqXVVqJqqnhoYfdNUAdI6LdVobsbYsAm1XrtLcu+nad+oRU1jV4yN2SCbc/r8tjzETcXGda1MCbk82+SxRm0EoNX7gEy+DaDYZbVfyqq4SQShBInJ2PmIyBAmBOFIiPpJVUTiNpaxa/yzV0rRvKYVN+fC2Cs4Kgi7FBKTMTrsGt+2wg6hUIRqOKgBPmLGNrhdBppHFSwYJZmnvV0iZq/n+nGPSyREwNIWgZCVIGJUYBkBwpEgVbVlJMu1VcPCxlYhyjz9PG6GSIT0x6AiaFIRgsqgXkdNME9NVFsgqspTxBs8rCnatWI0VEGdzkzxqgZveAZAqhtz82b9uFFbMfLvabdLR2OQpg49Z1MmSHPOpF17T0hvaKNBZSAKf94E/8w1s4nVAHQ7LeTdQjZJbov9ScSKIQjCaCEiYwJSyN4IBhL+8/4iYSARMJKoXi4R1cc9UiIsCu4QTEwzULRCWGYI2wgR7JVuGqJHNAXiJtU15cQTEWwsbE+bAmIqQtQKEPcrWSWDBhVap1AZ9KgMOtSEtUukMt5NvFrf8YMNNmaDjr0AULXVqIoK/8UGMTP4aarm5s3QqEWGWttC/oM07ev1iza1x9ngt2/flLVoy+rGZ22NHdS7aV5v139X76Tb2Gi+RyqvYznyTgrP02vzvKzEYQjC1lAj5C7Z/ikmFCIyJiJ+qmcytNuQT1G4W5+WrZegLMzTW1h4vqAxKcRX+AGVBIqxFDYhbZlQWlQkvCQBbAJKv6arPHKGQ6IiSnl1jFgkjI0FHkQsm7Ct54wHLMoCkPR1QUXQpSqgYxmqwhkq4mniVX5RrVoTq87vP1JbDlXlqCo/uDOZ3PKFdnVhbtSCgA2b8NbqGIz8B1naG0M0tuvr2JAJsSmrP4YtWW2KLe/uwsqkWNNt8I9Oba3YYK2hM99E1tGly10vg6eyxXdwoNLhIjoEoYeRcpfIp2p4iMgQdnmCYZt4ZYRwZRDLHCMZM9tIV3OKQGfnaC9DEMYlagRMGSMxx0RCRMYEpJBVspc6BHOQugteH73e9/lADDZX33m8Xr8nlNHz2FAmNhYB5btEDJOI/080EbCxe2VtKNPAKAsSq4gQDAfwUFi+hcY0DKK2ScTSgiMWgLj/Lz1uK8oDLhVBbb2oDGcoL9NxF5HKPIFaG6vGt15UJaBau0RUeRKVSAzuGumF0d6OsXETbNCWDO+DNnIfaOtIa1OUpq4ojb6LZHPWYrNvkOhoTlHR2UGrn13yRluGtcYHALQ768g4bTiuduXoLqt+NolykTgMQRDGIiIyJiCFvh3H+TfQweh9myrklw908yrEeAyUuWkMMI9C9ZqvZ27LgPIglNl6R8YzisdSjkGHZ2DFQsTKI1gRHdNQkChhyyDi/2sOmRCzIWbpk8sCLmW2viEng3kS4SxlCX2zDlV52NV6LrO2UguLSu0KUeVJVJkvOAbpPVJyrX4PEmPTJli7EW+9btmeWePQslEHhjal4jRmAmzO6vla/SDPruYU1V3ttOUN/tqsd77HOlo9LTIyTjuOm8H19Lr7BXoKgrBFpNX76CAiYwJSKKl96aHv9ass3tsSqJSB5xkDHuuLYYBpql7Pe/2qVj1zuK6BUkZxn6cM8nl9w03lAnTlg6xP6yyRzVmLbitAqCxMJBqmLhzA8acNGBCxtaAACFseMUvfbKO2R9x2iAV0cap4OEckqm/coaSLXWliVerXMKriPaKiohxVXr7lTJGByOUxmjdjbNI9SFi/GWddJ5m1+mnz5jIaU4WW7UE2ZnsySAImVKXaKUt10ZQz+UtznnfVBn2eeo9ux6+n4XTielsouCVWDEHYKqPV6v3ZZ5/llltuYdWqVWzYsIHHH3+c2bNn98ypFNdeey3/9V//RVtbGx/72Me499572WeffYpjWlpauOyyy/j1r3+NaZqcdtpp3HHHHcTj8eKYv/3tb8ydO5cXX3yRmpoaLrvsMq688srtuNrtZ9d2YAvjDsMyCSQiRCeVU/mhWqr2qiFeW0YgMj4LRbStbye9uWu0lyEIwg4klUpxyCGHcPfddw94/Oabb+bOO+9k0aJFrFy5klgsxsyZM8lkMsUxZ599Nq+//jpLly7liSee4Nlnn+Wiiy4qHu/o6OCkk05i9913Z9WqVdxyyy1cd9113HfffTv8+raEWDKGSVVVNeYuHlxYmzgIgGhDeIvjelsglDe4JaNgDSlknva2YhTmUb0SHzy35/2zbA/PMzACAZyuWtqdBEHHr9zpmoT8qRK2ImJ72P7cIVMRtV1ClnaDxAIOkaD+lR+O5AjFXHyDDWaZjVnuWy7iYSiPQblvvUiUoZLleuBgpcAHo0MHaJotzdDUjGrU7hJ3bTdd602a/W6qG7sjNGX9UuFZk7acjhFp+6CVvUnxVrf+GL7akuNdtYFNStfCSOdbyPnZJJ7n18LwXSOSTSIIw0SNXlnxU045hVNOOWWQ+RS333478+fP59RTTwXgpz/9KXV1dSxevJgzzzyTN998kyVLlvDiiy9yxBFHAPCf//mffOpTn+IHP/gBDQ0NPPjgg+RyOX70ox8RDAY54IADeOWVV/jhD39YIkZ2NiIyhsmUKVOwhuCfH8tUxmsAWJvdCwBzgJuTVwji7HXIUwMHdpoFUeEf7jufh1Gcx1GG/2H34zhcpR/nwMEkZjtUhFx/nh4XTMB0CdkOwYA+Fgy62CGPQEzfaK2ogVnmd11NhDHiIYj5dTPiUb0BKhpFxeLDd4kUyGshY7S29rhHNrbirW8nv0H7QDqbgmzujNGU0cKmOWvT4gdzdrtQZblUNzdRb+V5oSXIm2068vM91cgmtZpuvxZGoScJgKeyun27KqQSSxyGIAyHsRqTsXr1ahobG5kxY0ZxXzKZ5KijjmLFihWceeaZrFixgvLy8qLAAJgxYwamabJy5Uo+97nPsWLFCj7xiU8QDAaLY2bOnMlNN91Ea2srFRVbjsHbUYjIEISdSC6Vo7mplYpIfrSXIggTjpGw9hVm6OjoKNkfCoX+f3v3Ht9UmecP/HOSNum9hQINVQo4CAiDdKZC6ao7o3QtKyMjVmFYBYZhVRjKrnZHgXUEnBll15mX4AWciwizvuqA7E9HB5QVCiJCASl0BIGqVQoC6QWapGlzPef5/XGStKHXtAlJm8/bV14m5zznnCeHtvnm+9yg1+sDPp/RqC50mJGR4bc9IyPDt89oNGLIkCF++2NiYjBw4EC/MiNHjmxzDu8+Bhl0zShC/cY9YkRDx71yvF+UW/ct7GzdstZJjqvP2fo40UnTi5AgaQS867ZpYgDJkzSSdBKkOA0kvSdbkaCHFKcDEj2/1PE6IMmzZHt8PERiAkRcvO91u0NfAmVpVJtGAKCuAfA0j7iNTXBcEjBfUbMjtU0JqLPrcNml/nqZnYBDUUeQJJstuCHRgY9q1XqfNtlxXlL/SFwW1Wh21fkm3HLLzb4Jt4Rwt/0HYGdPorBwOBxIvWpCvlWrVmH16tXhqVAEY5ARhVyyOi9EXJ5/ZNzmc6p1XlBpJ8K4um9Kdz7I28s1tj5OAhAb03J+7/MYLaDX+eapEHo9RJwewvvNQa/v1hwWAXOoH/LSlSuQLjcANepoD8XYCJdRDdaa62NxxRKPes+omDqHDvVODSyeZIWkKBhgakCi1Y70eDdKa/SoNKv/BtXSt2gQ6jBVm+uK2kSieJtIWlZWhWh/Vk8i6p6gNZdAzVrU1tb6be9JFgMADAYDAKCmpgZDhw71ba+pqUF2dravzNXXc7vduHLliu94g8GAmpoavzLe194y4cAgIwr5FtaalK1uUDpJV1z9WxmMjMDVS7a3PqdG0xK8aGOCc71AOT39Lswm39wXqGuAqLNAvqQGB/Y6CZYGNXNxpTkO9Q49Gpzqr5PFLaHJrU5d7mxyYLC5Hlea1fhpt1GHLxqbcEGjjm9tUM77hqm63E2e7IV3ki2H79+jveXbvZjFIOqeoMTm3s7oKSlBOBkwcuRIGAwGlJaW+oIKi8WCw4cPY/HixQCAvLw8mEwmlJeXIycnBwCwZ88eKIqC3NxcX5mnnnoKLpcLsZ4vXLt27cKYMWPC1lQCcAgrUUgIBWg0WtBw9gqEu+t1X4gotASEZ8bh3j8CZbVaUVFRgYqKCgBqZ8+KigqcO3cOkiThsccew29+8xu89957OHHiBObNm4fMzEzfXBo33XQTpk2bhocffhhHjhzBgQMHUFRUhJ/85CfIzMwEAPzLv/wLdDodFi5ciM8//xxbt27Fiy++iOLi4mDdwh5hJiMKyUqT+iQ+8KXe+zWbDZLFDMnk6dB1xQxRqz6X65vhqlFgbVB7bpus8bjsGT3S4IrBZacWVk/ziKvZieSGKxipbwLSgcOXE3DarGYkztrMuKg9D7N8EQBgd5t8w1Rl2e4bRQKgVRMJ0F4WgxkMor7h6NGjuOOOO3yvvR/88+fPx+bNm/Hkk0+iqakJjzzyCEwmE2677Tbs3LkTcXEt0wyUlJSgqKgIU6dO9U3G9dJLL/n2p6am4sMPP8SSJUuQk5ODQYMGYeXKlWEdvgoAkuBqL91isViQmpqKiRNz+vwQVskzscXhI6+EuSYRwNIIyaJO/y2ZLICpEeKy50O/3gZ3vRocNDfEwmyNxxVPYGFyxuCKZ6ZSm1uCSwDxQkZjjQXXy2a4FAmHLqsByVcWF76V1WaXOuk8rHIt7G71mi65qc0w1TZNJAADDOonBAAZZrM5aM0N3fHaa6/h6Z+vwR1pD/X6XCZ3LQ7Ib8JsNgehZv0fMxlRKKrjSocDksUCyTORFkxmwKTOuCkabJAvO+C67AkszDo0NquduUx2PUzOWJg8gUWzrEGzJ+Gg1whc5zAh1VoPaAWOWZLwuVnCN1a1/8ZFqQYmSc1cNLsvw+G2tPSLUZxtRpD4ZS+uwuCCqOeCMbsMZ6gJDIMMol6wWWyw1jciWWdDahwDAKJIJRCkL1jR/CWtBxhkUP+kCMCmZhKk5iZIjZ71QRqtgNkKeIaQKiYb5AY1JeFo0MBmjYHVMxS1wa5Ho1v9FWlwamGXNWj29OEUTXYMtDZAcbiRmWLHuaY4vHshGQBQbZXxrdOCeq06/4VFuQS726Rew90It2z3zVUihIvDVImo32KQEYUkqW/3KfHjHW7abAVsat8GyWZXnzd7Fhey2iAsalAhGh1QzG64zOoHuMMag+ZmdSiqxa6H1RULq9u7DHsMXJ7PeaciQacRuF5uhOOyFUM0jahzxQEaYHdNMs42KrhgV5tAaqV6mDVGNLnVibscciNcbrWzrazYoQg3FMXheQNKt4aptuwnop6KxGnF+zsGGVFIo+kjK5oqApA93/LdbsDlhuTyrJFus0FqsgFN6gc7mu1Ak6dvg90J0eyC4uk0oVgUuBrVzq4uuxY2WzysdvUeNLljYfMEFSZXDJrklpVXZCEhTqNAKAJDHCYk267gsjUGegB7TSmotqolLzTbUSvMuKJRMxdNSr06akRWAwu3bIeiOD1vye2/0JloPbyVI0iIQkUN4Xv/+xSMc0QTBhlEHXDbnLBamuAw25AQ50CSXgZ/ZYiIuo9/MaOQVuNZ48M7wqIVqfWMnx0tVuIr3DKXm2g9i6ffNOEa//MoApLiBmTPNrcLcKkZB8npUlc5dbXKXsieb/ouGXDLgMMzGYXdBdHkhGL1ZAisCjyzpUN2SHA5NHB6lldvdujQ7FSf22UtHLIGZk9fi2a3xrfsigAQK7uhbWqC02zDDVortJICpAD1Dj0+NKbiW0/i5GKTE3WKev+uaGvRJOphc5kAAE65CW7ZBtmXvfAu0w4IoQDC3f4IEmYxiEJHBHfGT+oeBhlRKFar9kHQfPr3Tkp5fpNaxxmdTDGuxhjetd41Lftaf4J7ueWWc8ky4PI0HThlCKcbcHteuxQI72KlbgHFLeD53IbikOCya+DwNHvYHbFweJo9XIoWbkWCQ1Ffm10xaHJrPG9BalmaHkBCjIJY2QVXox0pDhPiZRsanbGABFRZ4/FFo/orUmNTYLQ5UC/UybnM0hVYNWqfC7vbDIfcCLcnypEVp2doqnd68JbmkTadO9UCfreVwQVR8LG5JDwYZEShWK0606ft8OVOy/l99gmpi1VYBSSp1etWfUulVokN4f189cYwMiBktYDskqDIGrhdakAgKzGQZU9woEhwCw3cntduRQOHrEWz2ztvhRZOxXMeof4/RtPyBpJi1MrrtQpiISPBZYXc7IDcZIfNJqAHUO/U4YwlDRc9GZF6u4w6p9qvogEWNGoa0Ax1Ui27bIbL0+fCpdh8gQXQ0u9CeG+Yd/QIwACDKIyCMoK196eIKhGzdonL5cKyZcswYcIEJCYmIjMzE/PmzcPFixe7PHb9+vUYMWIE4uLikJubiyNHjvjtt9vtWLJkCdLT05GUlITCwsI2q9VR/yXcClyNNthqzbBW16Pxi0twXLgMd4NVzZwQEVFIREwmo7m5GceOHcPTTz+NiRMnoqGhAf/+7/+OGTNm4OjRox0et3XrVhQXF+P3v/89cnNzsW7dOhQUFKCyshJDhqhLmT/++OPYsWMHtm3bhtTUVBQVFeG+++7DgQMHrtXbiygaSZ3u+pvqgVdtF1CE/6qnvu/c3syDaLsqqkYSgNQSsXpfA4AGAhKu/rbecg4FEhRPBsLtyVZ4MxHe1wDgFhLkVqeRoGYqYjxNH0kxbsQIGYpT7dOhOF2QHE4oDhd0cPnq7VI0kLUSvraq/VK+ssag3jOatMGh4LLDAbOipjIsGgsaJU+TiLDA6bb6RozIiqOlz4WnacSv30V7Q1N9N4BDVImuvZ4tbnY1NpcEJqLXLvn0008xefJkVFdXIysrq90yubm5mDRpEl55RV2HQ1EUDBs2DEuXLsXy5cthNpsxePBgvPnmm7j//vsBAGfOnMFNN92EsrIyTJkypVt18a5d8p3vjOnza5cMTs4GAHyQf32n5cRVn4tCSBBK2yBD0ghIrZpLNNqWIAMadXvrfqFXN7t4fwIVtxYuRwzcbi0gBGRFC7dbAhQFbrcGLrcE2S0gZAWyrP5fIzvVTIVTgeLpI6p4Lu70NK182xyHs83eSbWAJhdgcqqFTU4XGoU6n4ZVY4VVMsEh1Im7nIoVTkV97pLtfoGFEG6/Phe+wMLzBv0Dhs4DDAYXFD3Ct3bJisXPYXLST3p9rka5Dn+X3uLaJd0UMZmM9pjNZkiShLS0tHb3O51OlJeXY8WKFb5tGo0G+fn5KCsrAwCUl5fD5XIhPz/fV2bs2LHIysrqNMhwOBxwOBy+1xaL2uGvquorAG0/aPsSS2o6AED5buf//FcPNOkyyPAGEtpWzzWegKM7QYZDA9kW4+uT4Za1cLtbnjtlLWTP9b2BBCTPyRQN+vq/CxGFVjACen4pCEzEBhl2ux3Lli3DnDlzOox46+vrIcsyMjIy/LZnZGTgzJkzAACj0QidTtcmUMnIyIDRaOzw+mvWrMEzzzzTuzcRocz28wAAl/07ANrpmOl73hJUeDMZSjtBhqZNJkNRsxmAL/iQrur9I1q+9EPxZBxktwYulwZuWc0UKXKr0SuSQIxWhuQ5kcOtRaNLh0s2tenH6IiByamWb3ILOGXA7mlfsboUmF1qtqJJOGCTHGiW1AyFXWP1ZS5cSrOnE6caXLpbZS5kxQkh3BC+SbRadez0NI0we0FE5C9sQUZJSQkeffRR3+sPPvgAt99+OwC1E+isWbMghMCrr74alvqtWLECxcXFvtcWiwXDhg0LS12CzelWszLrj93gt12C8O8v0epzUBH+vapb77t6tGqMBr5+GBrJk8i4KjZpfby3r4WApE7yKVrKeD+Mvdf3jHaFSwEcskCzZ7hrk9uJZkVtvnAKFxySEy6ofSRsUhOcGptnXzNcohlu2eG5tgNuX98KlzpKxNcM4vYFEuo2uU1goda76zkvWmOAQXTtXdUzqse4CmtgwhZkzJgxA7m5ub7X1113HYCWAKO6uhp79uzptN1u0KBB0Gq1bUaK1NTUwGAwAAAMBgOcTidMJpNfNqN1mfbo9Xro9fqevDUiIoo4wen4yS8JgQlbkJGcnIzk5GS/bd4A48svv8TevXuRnp7e6Tl0Oh1ycnJQWlqKe++9F4Da8bO0tBRFRUUAgJycHMTGxqK0tBSFhYUAgMrKSpw7dw55eXnBf2N9gPCMnvh/9d9A08koZqVVzC6uit8VyH6vNa0mxpCg8TuvBhpoRCfXkVrO3fqa7V3fe11ZckOGC25Pp023cED2ZC5kuKEoLiie0R6K4obsyU4owgVFaWn2UBQ3vN9NFF/mQr2GX2dOoPMmEfWAdt8f/ygRhV+wlnoXQrD7VwAipk+Gy+XC/fffj2PHjmH79u2QZdnXZ2LgwIHQ6dS296lTp2LmzJm+IKK4uBjz58/HLbfcgsmTJ2PdunVoamrCggULAACpqalYuHAhiouLMXDgQKSkpGDp0qXIy8vr9sgSIiIiClzEBBkXLlzAe++9BwDIzs7227d371788Ic/BABUVVWhvr7et2/27Nmoq6vDypUrYTQakZ2djZ07d/p1Bl27di00Gg0KCwvhcDhQUFCADRs2hPw9RSrh+Vb/VfPewI7rZmukdFV2RLq612cvCOGf3fC+Fn5DVtTtLZ00W++T25RtOeHVfSyu2q+erOO6MWNBFNE4T8a1F9HzZEQS7zwZ6nzZfTtXJnnqH6e/LqDjGGSAQQZRr4RvnownFz+LiYn39/pcVrkOX2je4TwZ3RQx04oTERFR/xIxzSV07Xi/cTucwVm/xXs+qbsZniBmNjpata3jrEIn2ZhuJPWYrSDqq0S3s7FdnYe6j0EGERH1e1zqPTwYZBARURTgAmnhwCAjinlHmQTtfEEvGHps/iAiCh0GGURE1O+pzSW975PBLyaBYZBBRERRQEBIQQgygnCOaMIgI4oxIieiaMGOn+HBeTKIiIgoJJjJICKiqBCcPhlsLgkEgwwiIooCwZmMi83MgWGQQURE/Z6AgBKETpvBOEc0YZ8MIiIiCglmMoiIqN8L1jwZwThHNGGQQUREUUBwMq4wYHMJERERhQQzGUREFBWCM7qEzSWBYJBBRET9njqAVe71edgnIzAMMoiIKAoEa54MBhmBYJ8MIiKiEFm9ejUkSfJ7jB071rffbrdjyZIlSE9PR1JSEgoLC1FTU+N3jnPnzmH69OlISEjAkCFD8MQTT8Dtdl/rt9IjzGQQEVG/JxCcibR6kskYP348du/e7XsdE9Py0fv4449jx44d2LZtG1JTU1FUVIT77rsPBw4cAADIsozp06fDYDDg4MGDuHTpEubNm4fY2Fg899xzvX4/ocYgg4iIokD4+mTExMTAYDC02W42m7Fx40a8+eabuPPOOwEAmzZtwk033YRDhw5hypQp+PDDD3Hq1Cns3r0bGRkZyM7Oxq9//WssW7YMq1evhk6n6/V7CiU2lxARUb8nPH0ygvEI1JdffonMzEzccMMNePDBB3Hu3DkAQHl5OVwuF/Lz831lx44di6ysLJSVlQEAysrKMGHCBGRkZPjKFBQUwGKx4PPPP+/lXQk9ZjKIiIgCZLFY/F7r9Xro9fo25XJzc7F582aMGTMGly5dwjPPPIPbb78dJ0+ehNFohE6nQ1pamt8xGRkZMBqNAACj0egXYHj3e/dFOgYZREQUFRTR++YSAQUOhwOpqal+21etWoXVq1e3Kf/P//zPvuc333wzcnNzMXz4cLz11luIj4/vdX0iHYMMIiKKAsEbwqrX61FbW+u3vb0sRnvS0tIwevRofPXVV/inf/onOJ1OmEwmv2xGTU2Nrw+HwWDAkSNH/M7hHX3SXj+PSMM+GURE1O+pfTLkIDzUQCUlJcXv0d0gw2q1oqqqCkOHDkVOTg5iY2NRWlrq219ZWYlz584hLy8PAJCXl4cTJ074BTW7du1CSkoKxo0bF8Q7FBrMZBAREYXIL37xC9xzzz0YPnw4Ll68iFWrVkGr1WLOnDlITU3FwoULUVxcjIEDByIlJQVLly5FXl4epkyZAgC46667MG7cOMydOxfPP/88jEYjfvnLX2LJkiXdDmzCiUEGERFFhXAs9f7tt99izpw5uHz5MgYPHozbbrsNhw4dwuDBgwEAa9euhUajQWFhIRwOBwoKCrBhwwbf8VqtFtu3b8fixYuRl5eHxMREzJ8/H7/61a96/V6uBUkIwXVru8FisXg6+mgBSOGuDhFRHyQAyDCbzUhJSblmV33ttdewdPFyDE6+pdfncsqNsOEkzGZzEGrW/7FPBhEREYUEm0uIiKjfExAQQRjCCqEwmR0ABhlERBQVwtEnI9oxyCAion7PO4S19+dhkBEI9skgIiKikGAmg4iIooCAEEGY8ZN9MgISUZmM1atXY+zYsUhMTMSAAQOQn5+Pw4cPd3nc+vXrMWLECMTFxSE3N7fNFKx2ux1LlixBeno6kpKSUFhY6JuWlYiIooMShP/YXBKYiAoyRo8ejVdeeQUnTpzAJ598ghEjRuCuu+5CXV1dh8ds3boVxcXFWLVqFY4dO4aJEyeioKDAbwrWxx9/HH/729+wbds27Nu3DxcvXsR99913Ld4SERFFACHU0SW9fzDICERET8blnQBr9+7dmDp1artlcnNzMWnSJLzyyisAAEVRMGzYMCxduhTLly+H2WzG4MGD8eabb+L+++8HAJw5cwY33XQTysrKfFO3drcunIyLiKinwjcZ188X/QJpiTf1+lxuuRmy9iwn4+qmiMpktOZ0OvHHP/4RqampmDhxYodlysvLkZ+f79um0WiQn5+PsrIyAEB5eTlcLpdfmbFjxyIrK8tXpj0OhwMWi8XvQUREfZW6CmswHtR9ERdkbN++HUlJSYiLi8PatWuxa9cuDBo0qN2y9fX1kGUZGRkZftszMjJgNBoBAEajETqdzm8Z3avLtGfNmjVITU31PYYNG9a7N0ZERGElhBKER8Qm/yNS2IKMkpISJCUl+R779+8HANxxxx2oqKjAwYMHMW3aNMyaNcuvf8W1smLFCpjNZt/j/Pnz17wOREQUHMFb6j0Is4ZGkbANYZ0xYwZyc3N9r6+77joAQGJiIkaNGoVRo0ZhypQpuPHGG7Fx40asWLGizTkGDRoErVbbZqRITU0NDAYDAMBgMMDpdMJkMvllM1qXaY9er+8Ty+gSERFFqrBlMpKTk33BxKhRoxAfH99uOUVR4HA42t2n0+mQk5OD0tJSv/KlpaXIy8sDAOTk5CA2NtavTGVlJc6dO+crQ0RE/Z0ISnMJOLokIBEzGVdTUxOeffZZzJgxA0OHDkV9fT3Wr1+PCxcu4IEHHvCVmzp1KmbOnImioiIAQHFxMebPn49bbrkFkydPxrp169DU1IQFCxYAAFJTU7Fw4UIUFxdj4MCBSElJwdKlS5GXl9ftkSVERNT3BWUyLgiOLwxAxAQZWq0WZ86cwZ///GfU19cjPT0dkyZNwv79+zF+/HhfuaqqKtTX1/tez549G3V1dVi5ciWMRiOys7Oxc+dOv86ga9euhUajQWFhIRwOBwoKCrBhw4Zr+v6IiIiiTUTPkxFJOE8GEVFvhW+ejEWLHkNi3Ihen0tW7NDG1nGejG6KmEwGERFRyIggNZewT0ZAGGQQEVEUUKcV7/VZGGQEJOIm4yIiIqL+gZkMIiKKAiJIU4IzkxEIBhlERNTvCQSrTwbHSgSCQQYREfV/QrDjZxiwTwYRERGFBDMZREQUFYLRJ4NLvQeGQQYREfV7AsFqLmGfjECwuYSIiIhCgpkMIiKKCsFZII3NJYFgkEFERFFAIDhzXDDICASDDCIiigpBGX7KPhkBYZ8MIiIiCglmMoiIKAoEZ1px9skIDIMMIiLq9wRn/AwLBhlERBQler/Uu9rxkz0Nuot3ioiIiEKCmQwiIooCwWwu4ffz7mKQQUREUSIY/Sk4hDUQDDKIiCgKCCAo82Sw42cgmPMhIiKikGAmg4iIooIIQlNHMM4RTZjJICKiKOBduyQYj8CtX78eI0aMQFxcHHJzc3HkyJFevZu+gkEGERFRCG3duhXFxcVYtWoVjh07hokTJ6KgoAC1tbXhrlrIMcggIqLoIETvHz3wwgsv4OGHH8aCBQswbtw4/P73v0dCQgJef/31IL/ByMMgg4iIooIIwn/eIawWi8Xv4XA42r2m0+lEeXk58vPzfds0Gg3y8/NRVlZ2Ld52WDHIICKifm3o0KFAqwChdwQsFgtSU1P9HmvWrGm3dH19PWRZRkZGht/2jIwMGI3GINQnsnF0CRER9Wt3332355kAIPXiTGrn0ZKSEvzoRz/y26PX63tx3v6LQQYREfVrkiTh448/xj/+4z9CDTJ6GmiomZA5c+ZAkrp3jkGDBkGr1aKmpsZve01NDQwGQw/r0XewuYSIiPq922+/HWpw0dMZO9Usxv79+7sdYACATqdDTk4OSktLfdsURUFpaSny8vJ6WJe+g0EGERFFhTNnTqPnfTMUABJuu+22gI8sLi7Gn/70J/z5z3/G6dOnsXjxYjQ1NWHBggU9qEffwuYSIiKKCmPGjEFLNkMbwJFqYHLmzJkeXXf27Nmoq6vDypUrYTQakZ2djZ07d7bpDNofSUL0cOBvlPH2JlZ/MHvTcYiIKFoJADLMZjNSUlLCUoOWvhCB/C2XASAoS8VHGzaXEBFR1FCzBxqogUN3vmOrWYyamv4/3DQUGGQQEVFUaWpq9DzrKshQMy+ABkOGDAltpfqpiA0yFi1aBEmSsG7dui7LdrXwjN1ux5IlS5Ceno6kpCQUFha2GU5ERETRISEhARs3boTaN6OzQEPd1xKUUKAiMsh45513cOjQIWRmZnZZtjsLzzz++OP429/+hm3btmHfvn24ePEi7rvvvlC+BSIiimDz58/3POsoyFCHrG7cuBEJCQnXqFb9T8QFGRcuXMDSpUtRUlKC2NjYLst3tfCM2WzGxo0b8cILL+DOO+9ETk4ONm3ahIMHD+LQoUOhfjtERBSBtFot3n//fXSczVC3tQQj1BMRFWQoioK5c+fiiSeewPjx47ss352FZ8rLy+FyufzKjB07FllZWZ0uTuNwONosgENERP3HtGnT0P4EXWoW44MPPoBWG8hQV7paRAUZ//3f/42YmBj827/9W7fKd2fhGaPRCJ1Oh7S0tA7LtGfNmjV+i98MGzYssDdDREQRTZIkHDtWjrYTdKkTbxUUFISnYv1I2IKMkpISJCUl+R779u3Diy++iM2bNwc0ZWuorFixAmaz2fc4f/58uKtERERB9r3vfQ/+2Qw14Dh+/FhEfBb1dWELMmbMmIGKigrf4+DBg6itrUVWVhZiYmIQExOD6upq/Md//AdGjBjR7jm6s/CMwWCA0+mEyWTqsEx79Ho9UlJS/B5ERNT/VFefRUs2Q81iZGdnh7NK/UbYgozk5GSMGjXK93jkkUfw2Wef+QUemZmZeOKJJ/B///d/7Z6jOwvP5OTkIDY21q9MZWUlzp07FxWL0xARUeeysrKgZjPUCbrUoIOCIWLWLklPT0d6errfttjYWBgMBs9886qpU6di5syZKCoqAqAuPDN//nzccsstmDx5MtatW+e38ExqaioWLlyI4uJiDBw4ECkpKVi6dCny8vIwZcqUbtevZfZ1zsJORNQz6t/PSFzNoqHhCgYMGABA8gQdFAwRE2R0V1VVFerr632vu7PwzNq1a6HRaFBYWAiHw4GCggJs2LAhoOs2NnonY+Hc9UREvdHY2OhZCypypKWlRWTw09dxgbRuUhQFFy9eRHJy8jXpDGSxWDBs2DCcP3++z/UHYd3Dg3UPD9a9+4QQaGxsRGZmJjSaiBrcSCHS5zIZ4aLRaHD99ddf8+v25U6nrHt4sO7hwbp3T6RlMCi0GEoSERFRSDDIICIiopBgkBGh9Ho9Vq1aBb1eH+6qBIx1Dw/WPTxYd6KOseMnERERhQQzGURERBQSDDKIiIgoJBhkEBERUUgwyLiGVq9ejbFjxyIxMREDBgxAfn4+Dh8+3OVx69evx4gRIxAXF4fc3FwcOXLEb7/dbseSJUuQnp6OpKQkFBYWtlk0rjdcLheWLVuGCRMmIDExEZmZmZg3bx4uXrwY8XUHgLfffht33XUX0tPTIUkSKioqunXctm3bMHbsWMTFxWHChAl4//33/fYLIbBy5UoMHToU8fHxyM/Px5dffhnUund1/yKxzh9//DHuueceZGZmQpIk/PWvf+3ymI8++gjf//73odfrMWrUKGzevLlNmUDvRU+sWbMGkyZNQnJyMoYMGYJ7770XlZWVXR4XCff91Vdfxc033+yb8yIvLw8ffPBBxNeb+jlB10xJSYnYtWuXqKqqEidPnhQLFy4UKSkpora2tsNjtmzZInQ6nXj99dfF559/Lh5++GGRlpYmampqfGUWLVokhg0bJkpLS8XRo0fFlClTxD/8wz8Erd4mk0nk5+eLrVu3ijNnzoiysjIxefJkkZOT0+lxkVB3IYT4n//5H/HMM8+IP/3pTwKAOH78eJfHHDhwQGi1WvH888+LU6dOiV/+8pciNjZWnDhxwlfmv/7rv0Rqaqr461//Kv7+97+LGTNmiJEjRwqbzRaUenfn/kVanYUQ4v333xdPPfWUePvttwUA8c4773Ra/uuvvxYJCQmiuLhYnDp1Srz88stCq9WKnTt3+soEei96qqCgQGzatEmcPHlSVFRUiLvvvltkZWUJq9Xa4TGRct/fe+89sWPHDvHFF1+IyspK8Z//+Z8iNjZWnDx5MqLrTf0bg4wwMpvNAoDYvXt3h2UmT54slixZ4nsty7LIzMwUa9asEUKoAUBsbKzYtm2br8zp06cFAFFWVhayuh85ckQAENXV1X2m7t988023g4xZs2aJ6dOn+23Lzc0Vjz76qBBCCEVRhMFgEL/97W99+00mk9Dr9eIvf/lLUOrb1f2LxDpfrTtBxpNPPinGjx/vt2327NmioKDA9zrQexEstbW1AoDYt29fh2Ui8b57DRgwQLz22mvt7ovkelP/weaSMHE6nfjjH/+I1NRUTJw4scMy5eXlyM/P923TaDTIz89HWVkZAKC8vBwul8uvzNixY5GVleUrEwpmsxmSJCEtLa3P1b07ysrK/OoFAAUFBb56ffPNNzAajX5lUlNTkZubG5S6d+f+RVqde6qrevfkXgSL2WwGAAwcOLDDMpF432VZxpYtW9DU1IS8vLw+U2/qfxhkXGPbt29HUlIS4uLisHbtWuzatQuDBg1qt2x9fT1kWfZbURYAMjIyYDQaAQBGoxE6na7Nh33rMsFmt9uxbNkyzJkzp8P1DiK17t1lNBq7rLt3W0dleqM79y/S6txTHdXbYrHAZrP16F4Eg6IoeOyxx3Drrbfiu9/9boflIum+nzhxAklJSdDr9Vi0aBHeeecdjBs3LuLrTf0Xg4wQKSkpQVJSku+xf/9+AMAdd9yBiooKHDx4ENOmTcOsWbNQW1sb5tr666jugNoJdNasWRBC4NVXXw1jLdvXWd2JArFkyRKcPHkSW7ZsCXdVum3MmDGoqKjA4cOHsXjxYsyfPx+nTp0Kd7UoinEV1hCZMWMGcnNzfa+vu+46AEBiYiJGjRqFUaNGYcqUKbjxxhuxceNGrFixos05Bg0aBK1W22a0RU1NDQwGAwDAYDDA6XTCZDL5ZQRalwlW3b0BRnV1Nfbs2dPpqo2RVvdAGQyGLuvu3TZ06FC/MtnZ2T26ZmvduX+RVuee6qjeKSkpiI+Ph1arDfhe9FZRURG2b9+Ojz/+uMvVlyPpvut0OowaNQoAkJOTg08//RQvvvgi/vCHP0R0van/YiYjRJKTk33BxKhRoxAfH99uOUVR4HA42t2n0+mQk5OD0tJSv/KlpaW+dtacnBzExsb6lamsrMS5c+c6bIvtSd29AcaXX36J3bt3Iz09vdNzRFLdeyIvL8+vXgCwa9cuX71GjhwJg8HgV8ZiseDw4cM9rntr3bl/kVbnnuqq3j25Fz0lhEBRURHeeecd7NmzByNHjux1/cN53zv7+xLJ9aZ+JNw9T6OF1WoVK1asEGVlZeLs2bPi6NGjYsGCBUKv1/sNMbvzzjvFyy+/7Hu9ZcsWodfrxebNm8WpU6fEI488ItLS0oTRaPSVWbRokcjKyhJ79uwRR48eFXl5eSIvLy9odXc6nWLGjBni+uuvFxUVFeLSpUu+h8PhiOi6CyHE5cuXxfHjx8WOHTsEALFlyxZx/PhxcenSJV+ZuXPniuXLl/teHzhwQMTExIjf/e534vTp02LVqlXtDu9LS0sT7777rvjss8/Ej3/846APYe3s/kVinYUQorGxURw/flwcP35cABAvvPCCOH78uG8k0vLly8XcuXN95b1DWJ944glx+vRpsX79+naHsHb1sxQMixcvFqmpqeKjjz7y+zlvbm72lYnU+758+XKxb98+8c0334jPPvtMLF++XEiSJD788MOIrjf1bwwyrhGbzSZmzpwpMjMzhU6nE0OHDhUzZswQR44c8Ss3fPhwsWrVKr9tL7/8ssjKyhI6nU5MnjxZHDp0qM25f/7zn4sBAwaIhIQEMXPmTL8P0N7yDv1s77F3796IrrsQQmzatKndureu6w9+8AMxf/58v+PeeustMXr0aKHT6cT48ePFjh07/PYriiKefvppkZGRIfR6vZg6daqorKwMat07u3+RWue9e/e2e7+9dZ0/f774wQ9+0OaY7OxsodPpxA033CA2bdrU5rxd/SwFQ0c/563rE6n3/Wc/+5kYPny40Ol0YvDgwWLq1Km+ACOS6039G1dhJSIiopBgnwwiIiIKCQYZREREFBIMMoiIiCgkGGQQERFRSDDIICIiopBgkEFEREQhwSCDiIiIQoJBBhEREYUEgwyiPmTjxo246667Qn6dnTt3Ijs7G4qihPxaRNR/Mcgg6iPsdjuefvpprFq1KuTXmjZtGmJjY1FSUhLyaxFR/8Ugg6iP+N///V+kpKTg1ltvvSbX++lPf4qXXnrpmlyLiPonBhlE11hdXR0MBgOee+4537aDBw9Cp9O1WXq7tS1btuCee+7x2/bDH/4Qjz32mN+2e++9Fz/96U99r0eMGIHf/OY3mDdvHpKSkjB8+HC89957qKurw49//GMkJSXh5ptvxtGjR/3Oc8899+Do0aOoqqrq+ZsloqjGIIPoGhs8eDBef/11rF69GkePHkVjYyPmzp2LoqIiTJ06tcPjPvnkE9xyyy09uubatWtx66234vjx45g+fTrmzp2LefPm4aGHHsKxY8fwne98B/PmzUPr9RKzsrKQkZGB/fv39+iaREQMMojC4O6778bDDz+MBx98EIsWLUJiYiLWrFnTYXmTyQSz2YzMzMweX+/RRx/FjTfeiJUrV8JisWDSpEl44IEHMHr0aCxbtgynT59GTU2N33GZmZmorq7u0TWJiBhkEIXJ7373O7jdbmzbtg0lJSXQ6/UdlrXZbACAuLi4Hl3r5ptv9j3PyMgAAEyYMKHNttraWr/j4uPj0dzc3KNrEhExyCAKk6qqKly8eBGKouDs2bOdlk1PT4ckSWhoaOjyvLIst9kWGxvrey5JUofbrh6yeuXKFQwePLjLaxIRtYdBBlEYOJ1OPPTQQ5g9ezZ+/etf41//9V/bZBFa0+l0GDduHE6dOtVm39VNHF9//XVQ6mi321FVVYXvfe97QTkfEUUfBhlEYfDUU0/BbDbjpZdewrJlyzB69Gj87Gc/6/SYgoICfPLJJ222v/vuu3j77bdRVVWFZ599FqdOnUJ1dTUuXLjQqzoeOnQIer0eeXl5vToPEUUvBhlE19hHH32EdevW4Y033kBKSgo0Gg3eeOMN7N+/H6+++mqHxy1cuBDvv/8+zGaz3/bp06fj+eefx7hx4/Dxxx9jw4YNOHLkCN54441e1fMvf/kLHnzwQSQkJPTqPEQUvSTReswaEUW0Bx54AN///vexYsUKAOo8GdnZ2Vi3bl1Qr1NfX48xY8bg6NGjGDlyZFDPTUTRg5kMoj7kt7/9LZKSkkJ+nbNnz2LDhg0MMIioV5jJIOrDQpXJICIKBgYZREREFBJsLiEiIqKQYJBBREREIcEgg4iIiEKCQQYRERGFBIMMIiIiCgkGGURERBQSDDKIiIgoJBhkEBERUUgwyCAiIqKQ+P98ckJNlGnCQgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sim_data_opt.plot_field(field_monitor_name=\"field\", field_name=\"E\", val=\"abs^2\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f71f1d0",
   "metadata": {},
   "source": [
    "With the optimized design, we can directly export a GDS file of the S-bend for fabrication. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "63efec65",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-15T10:53:32.213269Z",
     "iopub.status.busy": "2025-05-15T10:53:32.213189Z",
     "iopub.status.idle": "2025-05-15T10:53:32.216301Z",
     "shell.execute_reply": "2025-05-15T10:53:32.216056Z"
    }
   },
   "outputs": [],
   "source": [
    "# make the misc/ directory to store the GDS file if it doesn't exist already\n",
    "import os\n",
    "\n",
    "if not os.path.exists(\"./misc/\"):\n",
    "    os.mkdir(\"./misc/\")\n",
    "\n",
    "sim_opt.to_gds_file(fname=\"misc/optimized_sbend.gds\", z=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7f981cf2",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "applications": [
   "Passive photonic integrated circuit components"
  ],
  "description": "This notebook demonstrates how to optimize a waveguide s-bend using the CMA-ES algorithm in Tidy3D FDTD.",
  "feature_image": "./img/optimized_sbend.png",
  "features": [
   "Global optimization"
  ],
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "keywords": "CMA-ES, optimization, S-bend, Tidy3D, FDTD",
  "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.3"
  },
  "title": "Optimizing a Waveguide S-bend Using CMA-ES | Flexcompute",
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "2c13632a0a904925806bd068bdc093eb": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "689cfcd6a070420cb2dcfb01ecc18a52": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "89c08eb384324a02b74c72157ffb8153": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "9c12944cc2854e3896ca28c884f97e4b": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_b711318d723c4663915b1e878b764040",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">↑</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">simulation.hdf5.gz</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">4.7/4.7 kB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">?</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.hdf5.gz\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m4.7/4.7 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "b711318d723c4663915b1e878b764040": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "b80ed44ee6a1402cab4c080a51c92246": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_89c08eb384324a02b74c72157ffb8153",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000\">🚶 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Waiting for 'final_design'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🚶 \u001b[0m \u001b[1;32mWaiting for 'final_design'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "c3648b98acbd4c3c8418d03ae0c2316b": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_2c13632a0a904925806bd068bdc093eb",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">solver progress (field decay = 4.54e-06) <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "solver progress (field decay = 4.54e-06) \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "c7a4463561314bd499a40b55153f20ea": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_689cfcd6a070420cb2dcfb01ecc18a52",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">↓</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">simulation_data.hdf5.gz</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">1.9/1.9 MB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">2.9 MB/s</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;32m↓\u001b[0m \u001b[1;34msimulation_data.hdf5.gz\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m1.9/1.9 MB\u001b[0m • \u001b[31m2.9 MB/s\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "d540152622d0422db8acaf4560a80392": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "d94e77a839da4ab5a8753951841c7897": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_d540152622d0422db8acaf4560a80392",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000\">🏃 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Finishing 'final_design'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'final_design'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
