[404218]: / Code / All Qiskit, PennyLane QML Nov 23 / 10a2 Eff. Dimension .965Local kkawchak.ipynb

Download this file

1044 lines (1043 with data), 168.3 kB

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Effective Dimension of Qiskit Neural Networks\n",
    "In this tutorial, we will take advantage of the `EffectiveDimension` and `LocalEffectiveDimension` classes to evaluate the power of Quantum Neural Network models. These are metrics based on information geometry that connect to notions such as trainability, expressibility or ability to generalize.\n",
    "\n",
    "Before diving into the code example, we will briefly explain what is the difference between these two metrics, and why are they relevant to the study of Quantum Neural Networks. More information about global effective dimension can be found in [this paper](https://arxiv.org/pdf/2011.00027.pdf), while the local effective dimension was introduced in a [later work](https://arxiv.org/abs/2112.04807)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 1. Global vs. Local Effective Dimension\n",
    "Both classical and quantum machine learning models share a common goal: being good at **generalizing**, i.e. learning insights from data and applying them on unseen data.\n",
    "\n",
    "Finding a good metric to assess this ability is a non-trivial matter. In [The Power of Quantum Neural Networks](https://arxiv.org/pdf/2011.00027.pdf), the authors introduce the **global** effective dimension as a useful indicator of how well a particular model will be able to perform on new data. In [Effective Dimension of Machine Learning Models](https://arxiv.org/pdf/2112.04807.pdf), the **local** effective dimension is proposed as a new capacity measure that bounds the generalization error of machine learning models.\n",
    "\n",
    "The key difference between global (`EffectiveDimension` class) and **local** effective dimension (`LocalEffectiveDimension` class) is actually not in the way they are computed, but in the nature of the parameter space that is analyzed. The global effective dimension incorporates the **full parameter space** of the model, and is calculated from a **large number of parameter (weight) sets**. On the other hand, the local effective dimension focuses on how well the **trained** model can generalize to new data, and how **expressive** it can be. Therefore, the local effective dimension is calculated from **a single** set of weight samples (training result). This difference is small in terms of practical implementation, but quite relevant at a conceptual level."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. The Effective Dimension Algorithm\n",
    "\n",
    "Both the global and local effective dimension algorithms use the Fisher Information matrix to provide a measure of complexity. The details on how this matrix is calculated are provided in the [reference paper](https://arxiv.org/pdf/2011.00027.pdf), but in general terms, this matrix captures how sensitive a neural network's output is to changes in the network's parameter space.\n",
    "\n",
    "In particular, this algorithm follows 4 main steps:\n",
    "\n",
    "1. **Monte Carlo simulation:** the forward and backward passes (gradients) of the neural network are computed for each pair of input and weight samples.\n",
    "2. **Fisher Matrix Computation:** these outputs and gradients are used to compute the Fisher Information Matrix.\n",
    "3. **Fisher Matrix Normalization:** averaging over all input samples and dividing by the matrix trace\n",
    "4. **Effective Dimension Calculation:** according to the formula from [*Abbas et al.*](https://arxiv.org/pdf/2011.00027.pdf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 3. Basic Example (SamplerQNN)\n",
    "\n",
    "This example shows how to set up a QNN model problem and run the global effective dimension algorithm. Both Qiskit `SamplerQNN` (shown in this example) and `EstimatorQNN` (shown in a later example) can be used with the `EffectiveDimension` class.\n",
    "\n",
    "We start off from the required imports and a fixed seed for the random number generator for reproducibility purposes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "# Necessary imports\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from IPython.display import clear_output\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.algorithms.optimizers import COBYLA\n",
    "from qiskit.circuit.library import ZFeatureMap, RealAmplitudes, ZZFeatureMap\n",
    "from qiskit.utils import algorithm_globals\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier\n",
    "from qiskit_machine_learning.neural_networks import EffectiveDimension, LocalEffectiveDimension\n",
    "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
    "\n",
    "# set random seed\n",
    "algorithm_globals.random_seed = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "### 3.1 Define QNN\n",
    "\n",
    "The first step to create a `SamplerQNN` is to define a parametrized feature map and ansatz. In this toy example, we will use 3 qubits, and we will define the circuit used in the `SamplerQNN` class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 621.941x284.278 with 1 Axes>"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_qubits = 3\n",
    "# create a feature map\n",
    "feature_map = ZZFeatureMap(feature_dimension=num_qubits, reps=1)\n",
    "# create a variational circuit\n",
    "ansatz = RealAmplitudes(num_qubits, reps=1)\n",
    "\n",
    "# combine feature map and ansatz into a single circuit\n",
    "qc = QuantumCircuit(num_qubits)\n",
    "qc.append(feature_map, range(num_qubits))\n",
    "qc.append(ansatz, range(num_qubits))\n",
    "qc.decompose().draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The parametrized circuit can then be sent together with an optional interpret map (parity in this case) to the `SamplerQNN` constructor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# parity maps bitstrings to 0 or 1\n",
    "def parity(x):\n",
    "    return \"{:b}\".format(x).count(\"1\") % 2\n",
    "\n",
    "\n",
    "output_shape = 2  # corresponds to the number of classes, possible outcomes of the (parity) mapping."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct QNN\n",
    "qnn = SamplerQNN(\n",
    "    circuit=qc,\n",
    "    input_params=feature_map.parameters,\n",
    "    weight_params=ansatz.parameters,\n",
    "    interpret=parity,\n",
    "    output_shape=output_shape,\n",
    "    sparse=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 Set up Effective Dimension calculation\n",
    "\n",
    "In order to compute the effective dimension of our QNN using the `EffectiveDimension` class, we need a series of sets of input samples and weights, as well as the total number of data samples available in a dataset. The `input_samples` and `weight_samples` are set in the class constructor, while the number of data samples is given during the call to the effective dimension computation, to be able to test and compare how this measure changes with different dataset sizes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define the number of input samples and weight samples and the class will randomly sample a corresponding array from a normal (for `input_samples`) or a uniform (for `weight_samples`) distribution. Instead of passing a number of samples we can pass an array, sampled manually."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can set the total number of input samples and weight samples for random selection\n",
    "num_input_samples = 10\n",
    "num_weight_samples = 10\n",
    "\n",
    "global_ed = EffectiveDimension(\n",
    "    qnn=qnn, weight_samples=num_weight_samples, input_samples=num_input_samples\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we want to test a specific set of input samples and weight samples, we can provide it directly to the `EffectiveDimension` class as shown in the following snippet:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can also provide user-defined samples and parameters\n",
    "input_samples = algorithm_globals.random.normal(0, 1, size=(10, qnn.num_inputs))\n",
    "weight_samples = algorithm_globals.random.uniform(0, 1, size=(10, qnn.num_weights))\n",
    "\n",
    "global_ed = EffectiveDimension(qnn=qnn, weight_samples=weight_samples, input_samples=input_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension algorithm also requires a dataset size. In this example, we will define an array of sizes to later see how this input affects the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# finally, we will define ranges to test different numbers of data, n\n",
    "n = [5000, 8000, 10000, 40000, 60000, 100000, 150000, 200000, 500000, 1000000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 Compute Global Effective Dimension\n",
    "Let's now calculate the effective dimension of our network for the previously defined set of input samples, weights, and a dataset size of 5000."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_0 = global_ed.get_effective_dimension(dataset_size=n[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension values will range between 0 and `d`, where `d` represents the dimension of the model, and it's practically obtained from the number of weights of the QNN. By dividing the result by `d`, we can obtain the normalized effective dimension, which correlates directly with the capacity of the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data size: 5000, global effective dimension: 5.2939\n",
      "Number of weights: 6, normalized effective dimension: 0.8823\n"
     ]
    }
   ],
   "source": [
    "d = qnn.num_weights\n",
    "\n",
    "print(\"Data size: {}, global effective dimension: {:.4f}\".format(n[0], global_eff_dim_0))\n",
    "print(\n",
    "    \"Number of weights: {}, normalized effective dimension: {:.4f}\".format(d, global_eff_dim_0 / d)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By calling the `EffectiveDimension` class with an array if input sizes `n`, we can monitor how the effective dimension changes with the dataset size."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_1 = global_ed.get_effective_dimension(dataset_size=n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Effective dimension: [5.29390229 5.33597126 5.35545289 5.46354885 5.49042841 5.52135717\n",
      " 5.54374079 5.55854944 5.60045031 5.62756494]\n",
      "Number of weights: 6\n"
     ]
    }
   ],
   "source": [
    "print(\"Effective dimension: {}\".format(global_eff_dim_1))\n",
    "print(\"Number of weights: {}\".format(d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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27dvX5n17/n5+ZoyZYp27dqlkJAQDR48WIsWLVJERIT9nJ9++kmXX365/fvExERJ0qhRo7RgwQKHa8QZjMgDAAAAgPtVeh95s9ksk8l03ucNw5DJZHJonXxNxT7y5eUXWdVh6nLZDGntY1coKizgj18EAAAAAKgUR3JopUfkv/rqq4suDJ5rW1q2bIZUL9iiyFB/d5cDAAAAALVWpYP8pZde+ofnZGRkXFQxqLnOXh9/oZkZAAAAAADXckrX+i+++EI33nijGjdu7IzLoQZifTwAAAAA1AxVDvJ79+7VtGnTFBsbq7/97W8ym83697//7czaUINsoWM9AAAAANQIDm0/V1hYqOTkZP3f//2fVq9erbi4OB04cEAbNmxQ586dXVUj3MxmM84EeUbkAQAAAMCtKj0if//99ys6OlovvfSSrr/+eh04cECffvqpTCaTfHx8XFkj3GxfRp5yC63y9zWref1gd5cDAAAAALVapUfkX3vtNT366KOaNGmSQkNDXVkTapjSRnftGobK18cpbRUAAAAAAFVU6VS2aNEirVu3To0aNdKIESP02WefecWe8fhj9kZ3rI8HAAAAALerdJC/6aab9OWXX2rz5s1q166dxo4dq4YNG8pms+m3335zZY1ws99YHw8AAAAANYbD86SbN2+uJ598Unv27NHbb7+t4cOH69Zbb1WTJk30wAMPuKJGuBkj8gAAAABQczjUtf5sJpNJ8fHxio+P1/Hjx7Vo0SLNnz/fmbWhBjieU6C0rHyZTFLbhgR5AAAAAHA3p3Quq1evniZMmKCff/7ZGZdDDbLlcLYkKbZesEL8q/x7HwAAAACAkzgU5Ldv364lS5Zo9+7dkqRly5Zp0KBB6tWrl5555hkZhuGSIuE+vx3OlMT6eAAAAACoKSo9xPrxxx/rxhtvlNlslslk0r/+9S/dfffduuyyyxQWFqbp06fL19dXjz76qCvrRTVjfTwAAAAA1CyVHpF/5plnNHHiROXn5+u1117TPffco6SkJP33v//VZ599prlz52rBggUuLBXuUNqxvn2jUDdXAgAAAACQHAjy27Zt0+233y6TyaRRo0apsLBQcXFx9uevuuoq7d271yVFwj3yi6zaeTRXktShUbibqwEAAAAASA4E+dzcXIWGlozKms1mBQYGKigoyP58YGCgCgoKnF8h3Ob39GxZbYbq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vho7dqyioqLUqVMnPfvss7JardVVNmqZqtyn/fr1U2pqqn36/a5du/T5559r8ODB1VIz8Ee8JUP5ursAlDh27JisVquioqLKHI+KitLWrVsrfE1aWlqF56elpbmsTtRuVblPz/Xoo48qOjq63H9AAWepyn26atUqvfnmm9q4cWM1VAhU7T7dtWuXVq5cqVtuuUWff/65duzYofvuu09FRUWaNm1adZSNWqYq9+nNN9+sY8eOacCAATIMQ8XFxbrnnnuYWo8a43wZKisrS6dOnVJgYKCbKnMMI/IAqs3MmTP1/vvv6+OPP1ZAQIC7ywEkSdnZ2brtttv0xhtvqH79+u4uBzgvm82myMhI/etf/1KPHj00YsQIPf7445o3b567SwPsvv76az377LN69dVXtX79eiUnJ2vZsmV66qmn3F0a4FUYka8h6tevLx8fH6Wnp5c5np6eroYNG1b4moYNGzp0PnCxqnKflnrhhRc0c+ZM/e9//1OXLl1cWSZqOUfv0507d2rPnj0aMmSI/ZjNZpMk+fr6atu2bWrZsqVri0atU5X/njZq1Eh+fn7y8fGxH2vfvr3S0tJUWFgoi8Xi0ppR+1TlPn3iiSd022236c4775Qkde7cWbm5ubrrrrv0+OOPy2xmHBHudb4MFRYW5jGj8RIj8jWGxWJRjx49lJKSYj9ms9mUkpKivn37Vviavn37ljlfkr788svzng9crKrcp5L03HPP6amnntLy5cvVs2fP6igVtZij92m7du20efNmbdy40f647rrr7N1sY2JiqrN81BJV+e9p//79tWPHDvsvmiTp999/V6NGjQjxcImq3Kd5eXnlwnrpL58Mw3BdsUAleU2Gcne3PZzx/vvvG/7+/saCBQuM3377zbjrrruMiIgIIy0tzTAMw7jtttuMSZMm2c9fvXq14evra7zwwgvGli1bjGnTphl+fn7G5s2b3fURUAs4ep/OnDnTsFgsxkcffWQcPnzY/sjOznbXR0At4Oh9ei661qM6OHqf7tu3zwgNDTXGjRtnbNu2zfjss8+MyMhI4+mnn3bXR0At4Oh9Om3aNCM0NNR47733jF27dhlffPGF0bJlS+PGG29010eAl8vOzjY2bNhgbNiwwZBkzJ4929iwYYOxd+9ewzAMY9KkScZtt91mP3/Xrl1GUFCQ8cgjjxhbtmwx5s6da/j4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\n",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(global_eff_dim_1) / d)\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized GLOBAL effective dimension\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 4. Local Effective Dimension Example\n",
    "As explained in the introduction, the local effective dimension algorithm only uses **one** set of weights, and it can be used to monitor how training affects the expressiveness of a neural network. The `LocalEffectiveDimension` class enforces this constraint to ensure that these calculations are conceptually separate, but the rest of the implementation is shared with `EffectiveDimension`.\n",
    "\n",
    "This example shows how to leverage the `LocalEffectiveDimension` class to analyze the effect of training on QNN expressiveness."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1 Define Dataset and QNN\n",
    "\n",
    "We start by creating a 3D binary classification dataset using `make_classification` function from scikit-learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "num_inputs = 3\n",
    "num_samples = 50\n",
    "\n",
    "X, y = make_classification(\n",
    "    n_samples=num_samples,\n",
    "    n_features=num_inputs,\n",
    "    n_informative=3,\n",
    "    n_redundant=0,\n",
    "    n_clusters_per_class=1,\n",
    "    class_sep=2.0,\n",
    ")\n",
    "X = MinMaxScaler().fit_transform(X)\n",
    "y = 2 * y - 1  # labels in {-1, 1}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next step is to create a QNN, an instance of `EstimatorQNN` in our case in the same fashion we created an instance of `SamplerQNN`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "estimator_qnn = EstimatorQNN(\n",
    "    circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2 Train QNN\n",
    "\n",
    "We can now proceed to train the QNN. The training step may take some time, be patient. You can pass a callback to the classifier to observe how the training process is going on. We fix `initial_point` for reproducibility purposes as usual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# callback function that draws a live plot when the .fit() method is called\n",
    "def callback_graph(weights, obj_func_eval):\n",
    "    clear_output(wait=True)\n",
    "    objective_func_vals.append(obj_func_eval)\n",
    "    plt.title(\"Objective function value against iteration\")\n",
    "    plt.xlabel(\"Iteration\")\n",
    "    plt.ylabel(\"Objective function value\")\n",
    "    plt.plot(range(len(objective_func_vals)), objective_func_vals)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct classifier\n",
    "initial_point = algorithm_globals.random.random(estimator_qnn.num_weights)\n",
    "\n",
    "estimator_classifier = NeuralNetworkClassifier(\n",
    "    neural_network=estimator_qnn,\n",
    "    optimizer=COBYLA(maxiter=80, rhobeg=1.1),\n",
    "    initial_point=initial_point,\n",
    "    callback=callback_graph,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAIjCAYAAAB/OVoZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACK5ElEQVR4nOzdeXhTZdrH8d9J2nRfaWlZCi1lFwUFQRTEBUVx11FGHUUUt4ERRR1l3HUUt8FtUNxhdEZwQX0dxxVBRFEEFFzY960tpXTfk/P+kSZt6UICaZO0389lLtqTk3Pu5CTIned+7scwTdMUAAAAAADwO4u/AwAAAAAAAE4k6QAAAAAABAiSdAAAAAAAAgRJOgAAAAAAAYIkHQAAAACAAEGSDgAAAABAgCBJBwAAAAAgQJCkAwAAAAAQIEjSAQAAAAAIECTpABCk7r//fhmGodzc3IPum56erquuuqrlgzrA7NmzZRiGtm7d2urn/vHHH3X88ccrKipKhmHo559/bvUYPOGva+Nr/rzW/mQYhu6//35/hyEpOK+B6+8xAEAtknQACCC//fab/vSnP6lLly4KCwtT586ddfnll+u3337zd2jNeuSRR/TBBx/4Owy3qqoqXXzxxcrLy9NTTz2lN954Q927d/dbPN99953uv/9+5efn+y0GBJ/du3fr/vvvP6wvmJ5//nnNnj3bZzEditLSUt1///1atGiRX+MAgGBhmKZp+jsIAIA0f/58XXrppUpMTNQ111yjjIwMbd26Va+++qr27dunuXPn6oILLnDvf//99+uBBx7Q3r17lZSU1OyxKyoqZLFYFBoa2iKxR0dH6w9/+EODZMBut6uqqkphYWGtOlq2du1a9evXTy+//LImTpzYaudtypNPPqnbb79dW7ZsUXp6er37WvratJbZs2drwoQJjT7Htqy8vFwhISEKCQnx+bGXL1+uY489Vq+//rpH1RaNfd4GDBigpKQkvybIubm5Sk5O1n333deg6qC6ulrV1dUKDw/3T3AAEIB8/38UAIDXNm3apCuuuEI9evTQ4sWLlZyc7L5vypQpGjlypK644gqtXr1aPXr08Pr4YWFhvgzXY1arVVartdXPm5OTI0mKj49v9XN7y1/XBr4RSMlla33eqqur5XA4ZLPZDvtYLfUFBwAEM8rdASAAPPHEEyotLdVLL71UL0GXpKSkJL344osqKSnR448/3uCxubm5uuSSSxQbG6sOHTpoypQpKi8vr7dPY/Oe8/PzdfPNNystLU1hYWHq2bOnHnvsMTkcjnr7ORwOPfPMMzryyCMVHh6u5ORknXHGGVq+fLkk55zckpISzZkzR4ZhyDAM97kOnCN79tlnN/klw/DhwzVkyJB62958800NHjxYERERSkxM1B//+Eft2LGj2dfyqquu0qhRoyRJF198sQzD0EknnSRJOumkk9w/H/iYuqO/W7dulWEYevLJJ/XSSy8pMzNTYWFhOvbYY/Xjjz82ePzatWt1ySWXKDk5WREREerTp4/uuusuSc6Kh9tvv12SlJGR4X6NXK9JY9dm8+bNuvjii5WYmKjIyEgdd9xx+vjjj+vts2jRIhmGobffflsPP/ywunbtqvDwcJ166qnauHFjs6/Ru+++K8Mw9PXXXze478UXX5RhGPr1118lSatXr9ZVV12lHj16KDw8XKmpqbr66qu1b9++Zs8hNT1f+3Dej4358MMPddZZZ6lz584KCwtTZmamHnroIdnt9gb7zpw5Uz169FBERISGDh2qb775psH7orKyUvfee68GDx6suLg4RUVFaeTIkVq4cOFBn6NrjvXGjRt11VVXKT4+XnFxcZowYYJKS0vrPfaLL77QiBEjFB8fr+joaPXp00d/+9vfJDmv77HHHitJmjBhgvt901zp+oGft/T0dP3222/6+uuv3Y+v+zw9ec3rfhaefvpp92fh999/9+h12rp1q/vvtAceeMAdh+s1a2xOenV1tR566CH3udLT0/W3v/1NFRUV9fZLT0/X2WefrSVLlmjo0KEKDw9Xjx499K9//avJ1wgAggFfXQJAAPjoo4+Unp6ukSNHNnr/iSeeqPT09AaJmiRdcsklSk9P1/Tp0/X999/r2Wef1f79+5v9h2ppaalGjRqlXbt26frrr1e3bt303Xffadq0adqzZ4+efvpp977XXHONZs+erTPPPFMTJ05UdXW1vvnmG33//fcaMmSI3njjDU2cOFFDhw7VddddJ0nKzMxs9Lzjxo3TlVdeqR9//NGdgEjStm3b9P333+uJJ55wb3v44Yd1zz336JJLLtHEiRO1d+9ePffcczrxxBP1008/NTlKfv3116tLly565JFHdNNNN+nYY49VSkpKk69Fc/7zn/+oqKhI119/vQzD0OOPP64LL7xQmzdvdpenr169WiNHjlRoaKiuu+46paena9OmTfroo4/08MMP68ILL9T69ev11ltv6amnnnJPTTjwyxiX7OxsHX/88SotLdVNN92kDh06aM6cOTr33HP17rvv1pvyIEmPPvqoLBaLbrvtNhUUFOjxxx/X5Zdfrh9++KHJ53XWWWcpOjpab7/9tvsLDZd58+bpiCOO0IABAyQ5E8nNmzdrwoQJSk1N1W+//aaXXnpJv/32m77//nufTGPw5v3YmNmzZys6OlpTp05VdHS0vvrqK917770qLCys95564YUXNHnyZI0cOVK33HKLtm7dqvPPP18JCQnq2rWre7/CwkK98soruvTSS3XttdeqqKhIr776qsaMGaNly5Zp0KBBB31Ol1xyiTIyMjR9+nStXLlSr7zyijp27KjHHntMkrP/xNlnn62jjjpKDz74oMLCwrRx40Z9++23kqR+/frpwQcf1L333qvrrrvO/XfD8ccf7/Hr+vTTT+svf/mLoqOj3V8auT4L3r7mr7/+usrLy3XdddcpLCxMiYmJHr1OycnJeuGFF3TjjTfqggsu0IUXXihJOuqoo5qMe+LEiZozZ47+8Ic/6NZbb9UPP/yg6dOna82aNXr//ffr7btx40b94Q9/0DXXXKPx48frtdde01VXXaXBgwfriCOO8Pi1AoCAYgIA/Co/P9+UZJ533nnN7nfuueeakszCwkLTNE3zvvvuMyWZ5557br39/vznP5uSzFWrVrm3de/e3Rw/frz794ceesiMiooy169fX++xd955p2m1Ws3t27ebpmmaX331lSnJvOmmmxrE43A43D9HRUXVO77L66+/bkoyt2zZYpqmaRYUFJhhYWHmrbfeWm+/xx9/3DQMw9y2bZtpmqa5detW02q1mg8//HC9/X755RczJCSkwfYDLVy40JRkvvPOO/W2jxo1yhw1alSD/cePH292797d/fuWLVtMSWaHDh3MvLw89/YPP/zQlGR+9NFH7m0nnniiGRMT447dpe7r88QTT9R7Heo68NrcfPPNpiTzm2++cW8rKioyMzIyzPT0dNNut9d7jv369TMrKirc+z7zzDOmJPOXX35p/MWpcemll5odO3Y0q6ur3dv27NljWiwW88EHH3RvKy0tbfDYt956y5RkLl682L3twGttmqYpybzvvvsO+pw9fT82pbEYr7/+ejMyMtIsLy83TdM0KyoqzA4dOpjHHnusWVVV5d5v9uzZpqR674vq6up6r6lpmub+/fvNlJQU8+qrr663/cDn6PpcHrjfBRdcYHbo0MH9+1NPPWVKMvfu3dvk8/rxxx9NSebrr7/e5D51NXYNjjjiiEbf856+5q7PQmxsrJmTk1NvX09fp7179zb5XnC9Xi4///yzKcmcOHFivf1uu+02U5L51Vdfubd17969wfswJyen0b9jACCYUO4OAH5WVFQkSYqJiWl2P9f9hYWF9bZPmjSp3u9/+ctfJEn/+9//mjzWO++8o5EjRyohIUG5ubnu2+jRo2W327V48WJJ0nvvvSfDMHTfffc1OMahjKDGxsbqzDPP1Ntvvy2zTt/SefPm6bjjjlO3bt0kOZvoORwOXXLJJfXiS01NVa9evRotO24J48aNU0JCgvt312jm5s2bJUl79+7V4sWLdfXVV7tjdznUEeb//e9/Gjp0qEaMGOHeFh0dreuuu05bt27V77//Xm//CRMm1JsbfGCMTRk3bpxycnLqNRR799135XA4NG7cOPe2iIgI98/l5eXKzc3VcccdJ0lauXKl90+wEZ6+H5tSN8aioiLl5uZq5MiRKi0t1dq1ayU5m7Dt27dP1157bb050Jdffnm9ayw553a7XlOHw6G8vDxVV1dryJAhHj/nG264od7vI0eO1L59+9yfX1clyIcffuhRSb+vefuaX3TRRQ2qP3zxOh3I9ffW1KlT622/9dZbJalBNVH//v3rVSAlJyerT58+B33/A0Ago9wdAPzMlXy7kvWmNJXM9+rVq97vmZmZslgsza6VvGHDBq1evbrJkmtX47VNmzapc+fOSkxMbDY2b4wbN04ffPCBli5dquOPP16bNm3SihUr6pXXbtiwQaZpNnhuLq3VCf3AxNuVzO3fv19SbSLsKg33hW3btmnYsGENtvfr1899f93zHSzGppxxxhmKi4vTvHnzdOqpp0pyflkyaNAg9e7d271fXl6eHnjgAc2dO9f9vnApKCjw4pk1zdP3Y1N+++033X333frqq68afInlinHbtm2SpJ49e9a7PyQkpNFu9HPmzNE//vEPrV27VlVVVe7tGRkZB30+UvPXJTY2VuPGjdMrr7yiiRMn6s4779Spp56qCy+8UH/4wx9ksbT8GIq3r3lTz/twX6cDbdu2TRaLpcF1Sk1NVXx8vPs6uhz4OkvO1/pg738ACGQk6QDgZ3FxcerUqZNWr17d7H6rV69Wly5dFBsb2+x+nozgOhwOnXbaafrrX//a6P11kzRfO+eccxQZGam3335bxx9/vN5++21ZLBZdfPHF9eIzDEOffPJJo92qo6OjD+nchmHUG8F3aazBmKQmO2U3dgx/OdQYw8LCdP755+v999/X888/r+zsbH377bd65JFH6u13ySWX6LvvvtPtt9+uQYMGKTo6Wg6HQ2ecccYhjwAf+HofzvsxPz9fo0aNUmxsrB588EFlZmYqPDxcK1eu1B133HFIMb755pu66qqrdP755+v2229Xx44dZbVaNX36dG3atMmjYxzsukRERGjx4sVauHChPv74Y3366aeaN2+eTjnlFH3++ect3qXd29e8brWCiy9ep6Z4WokSDJ9RAPAWSToABICzzz5bL7/8spYsWVKvzNnlm2++0datW3X99dc3uG/Dhg31Rq02btwoh8PR7FrVmZmZKi4u1ujRo5uNKzMzU5999pny8vKaHU33prQ7KipKZ599tt555x3NmDFD8+bN08iRI9W5c+d65zVNUxkZGT79wiAhIaHRMtgDR+c85epU7+qE3hRvXp/u3btr3bp1Dba7yra7d+/uRYTNGzdunObMmaMFCxZozZo1Mk2zXqn7/v37tWDBAj3wwAO699573ds3bNjg0fETEhKUn59fb1tlZaX27NlTb5un78fGLFq0SPv27dP8+fN14oknurdv2bKl3n6u123jxo06+eST3durq6u1devWeo3M3n33XfXo0UPz58+vd+0am/ZxOCwWi0499VSdeuqpmjFjhh555BHdddddWrhwoUaPHu2TpnxNHeNwXnMXT18nb9//DodDGzZscFePSM6Givn5+T59/wNAoGJOOgAEgNtvv10RERG6/vrrGyxtlZeXpxtuuEGRkZHupbzqmjlzZr3fn3vuOUnSmWee2eT5LrnkEi1dulSfffZZg/vy8/NVXV0tyTkP1TRNPfDAAw32qztSFRUV1SAZa864ceO0e/duvfLKK1q1alW9xFCSLrzwQlmtVj3wwAMNRsRM0/Ro+a/GZGZmau3atdq7d69726pVq9wdtb2VnJysE088Ua+99pq2b9/eIE6XqKgoSfLoNRo7dqyWLVumpUuXureVlJTopZdeUnp6uvr3739IsTZm9OjRSkxM1Lx58zRv3jwNHTq03hc+rlHKA6/Bwbqtu2RmZjaY2/zSSy81GEn39P3YmMZirKys1PPPP19vvyFDhqhDhw56+eWX6x3v3//+d4PS6MaO+cMPP9S7JocrLy+vwTZX13jXUmPevG+a0tRn83BecxdPX6fIyEj3cQ9m7Nixkhq+x2bMmCHJuTIBALR1jKQDQADo1auX5syZo8svv1xHHnmkrrnmGmVkZGjr1q169dVXlZubq7feeqvRpc22bNmic889V2eccYaWLl2qN998U5dddpkGDhzY5Pluv/12/d///Z/OPvts93JFJSUl+uWXX/Tuu+9q69atSkpK0sknn6wrrrhCzz77rDZs2OAucf7mm2908skna/LkyZKkwYMH68svv9SMGTPUuXNnZWRkNDqv2mXs2LGKiYnRbbfdJqvVqosuuqje/ZmZmfr73/+uadOmuZfJiomJ0ZYtW/T+++/ruuuu02233eb163z11VdrxowZGjNmjK655hrl5ORo1qxZOuKIIxrMZfbUs88+qxEjRuiYY47Rdddd575uH3/8sX7++WdJztdHku666y798Y9/VGhoqM455xx3ElbXnXfeqbfeektnnnmmbrrpJiUmJmrOnDnasmWL3nvvPZ/OVw4NDdWFF16ouXPnqqSkRE8++WS9+2NjY3XiiSfq8ccfV1VVlbp06aLPP/+8wSh1UyZOnKgbbrhBF110kU477TStWrVKn332mXsZOhdP34+NOf7445WQkKDx48frpptukmEYeuONNxp8sWCz2XT//ffrL3/5i0455RRdcskl2rp1q2bPnq3MzMx6o71nn3225s+frwsuuEBnnXWWtmzZolmzZql///4qLi726LkfzIMPPqjFixfrrLPOUvfu3ZWTk6Pnn39eXbt2dVfTZGZmKj4+XrNmzVJMTIyioqI0bNgwr+Z7Dx48WC+88IL+/ve/q2fPnurYsaNOOeWUw3rNXTx9nSIiItS/f3/NmzdPvXv3VmJiogYMGNBoL4eBAwdq/Pjxeumll9xTGZYtW6Y5c+bo/PPPr1cFAQBtVit3kwcANGP16tXmpZdeanbq1MkMDQ01U1NTzUsvvbTR5bRcSxf9/vvv5h/+8AczJibGTEhIMCdPnmyWlZXV2/fAJa9M07ms17Rp08yePXuaNpvNTEpKMo8//njzySefNCsrK937VVdXm0888YTZt29f02azmcnJyeaZZ55prlixwr3P2rVrzRNPPNGMiIgwJbnP1diSUC6XX365KckcPXp0k6/He++9Z44YMcKMiooyo6KizL59+5qTJk0y161b1+zr2NQSbKZpmm+++abZo0cP02azmYMGDTI/++yzJpdge+KJJxo8Xo0sJfXrr7+aF1xwgRkfH2+Gh4ebffr0Me+55556+zz00ENmly5dTIvFUu81aezabNq0yfzDH/7gPt7QoUPN//73vx49R1fsni7b9cUXX5iSTMMwzB07djS4f+fOne7nFhcXZ1588cXm7t27G7wOjV1ru91u3nHHHWZSUpIZGRlpjhkzxty4ceNhvR8b8+2335rHHXecGRERYXbu3Nn861//an722WemJHPhwoX19n322WfN7t27m2FhYebQoUPNb7/91hw8eLB5xhlnuPdxOBzmI4884t7v6KOPNv/73/82eJ+YZtNLsB24tNqBr8+CBQvM8847z+zcubNps9nMzp07m5deemmDJdE+/PBDs3///mZISMhBr2tj1yArK8s866yzzJiYmAZLzXnymjf3WfDmdfruu+/MwYMHmzabrd5rduASbKZpmlVVVeYDDzxgZmRkmKGhoWZaWpo5bdo093J6Lt27dzfPOuusBnE1tdQiAAQLwzTprAEAbV1aWprGjBmjV155xd+hAAHF4XAoOTlZF154oV5++WV/hwMAAHPSAaCtq6qq0r59+w5augq0deXl5Q3K4P/1r38pLy9PJ510kn+CAgDgAMxJB4A27LPPPtPcuXNVVlbmXgsbaK++//573XLLLbr44ovVoUMHrVy5Uq+++qoGDBhQbwlAAAD8iSQdANqwRx99VBs3btTDDz+s0047zd/hAH6Vnp6utLQ0Pfvss+5lBa+88ko9+uijstls/g4PAABJEnPSAQAAAAAIEMxJBwAAAAAgQJCkAwAAAAAQINrdnHSHw6Hdu3crJiZGhmH4OxwAAAAAQBtnmqaKiorUuXNnWSzNj5W3uyR99+7dSktL83cYAAAAAIB2ZseOHeratWuz+7S7JD0mJkaS88WJjY31czQAAAAAgLausLBQaWlp7ny0Oe0uSXeVuMfGxpKkAwAAAABajSdTrmkcBwAAAABAgCBJBwAAAAAgQJCkAwAAAAAQIEjSAQAAAAAIECTpAAAAAAAECJJ0AAAAAAACBEk6AAAAAAABgiQdAAAAAIAAQZIOAAAAAECAIEkHAAAAACBAkKQDAAAAABAgSNIBAAAAAAgQJOkAAAAAAAQIknQAAAAAAAIESToAAAAAAAGCJB0AAAAAgABBko6AtS6rSAWlVf4OAwAAAABaDUk6AtJvuwt0xjOLddPcn/wdCgAAAAC0GpJ0BKQft+TJNKUlG3NVUlHt73AAAAAAoFWQpCMgrc8pliTZHaaWb9vv52gAAAAAoHWQpCMgbcwudv/8/eZ9fowEAAAAAFoPSToCjmmaWp9T5P6dJB0AAABAe0GSjoCzt7hC+XW6uq/eWcC8dAAAAADtAkk6Ao6r1D29Q6S6JkQwLx0AAABAu0GSHqD+b9VuTZzzo978fpu/Q2l167Odpe69UmJ0XI8Okih5BwAAANA+kKQHqK25JfpyTY5+213o71Ba3Yaazu69U6JJ0gEAAAC0KyTpASrSZpUklVW2v7nYG2rK3Xt1jNGwjERJzEsHAAAA0D6QpAeoSFuIJKmk0u7nSFpX3c7uvVKilZbIvHQAAAAA7QdJeoCqHUlvX0l6bnGl8kurZDGkzORoSaLkHQAAAEC7QZIeoFxJemk7K3ffUNM0rltipMJDna8BSToAAACA9oIkPUC5yt1L29lIet3O7i7MSwcAAADQXpCkB6jIMNdIevtK0l2d3Xt1jHZvS0uMVJd45qUDAAAAaPtI0gNU+y13dy2/FlNvOyXvAAAAANoDkvQAFRna/srd63Z271lnJF2SjuvhLHknSQcAAADQlpGkByhXuXtZlV0Oh+nnaFpH3c7uDZN050g689IBAAAAtGUk6QHKVe5umlJ5dfsYTW+ss7sL89IBAAAAtAck6QEqPKQ2SW0vJe+upnE9O8Y0ej/z0gEAAAC0dSTpAcpiMWqbx1W0jyTdtfxa75ToRu9nXjoAAACAto4kPYC5k/Sq9jEH2738WpNJOvPSAQAAALRtJOkBLNLWfjq8m6bpnpPeq4lyd+alAwAAAGjrSNIDWHsqd88trtT+0ioZjXR2r4t56QAAAADaMpL0ABbhStIr235p94acpju718W8dAAAAABtGUl6AItqR+XuG7Jr5qM3Ueruwrx0AAAAAG0ZSXoAqx1JbwdJes1IelNN41yYlw4AAACgLSNJD2BR7ajcfX3NSHpTy6/Vxbx0AAAAAG0VSXoAi2gn5e6edHavi3npAAAAANoqkvQAFtlOyt33ldR2ds9M9nwknXnpAAAAANoavyfpM2fOVHp6usLDwzVs2DAtW7asyX2rqqr04IMPKjMzU+Hh4Ro4cKA+/fTTVoy2dbWXcvf12bWd3V3z8JtTd176CualAwAAAGhD/Jqkz5s3T1OnTtV9992nlStXauDAgRozZoxycnIa3f/uu+/Wiy++qOeee06///67brjhBl1wwQX66aefWjny1tFeyt035rg6ux98FN2FeekAAAAA2iK/JukzZszQtddeqwkTJqh///6aNWuWIiMj9dprrzW6/xtvvKG//e1vGjt2rHr06KEbb7xRY8eO1T/+8Y9Wjrx1RIU5R5XL2niS7hpJ75Vy8PnoLsxLBwAAANAW+S1Jr6ys1IoVKzR69OjaYCwWjR49WkuXLm30MRUVFQoPD6+3LSIiQkuWLGnyPBUVFSosLKx3CxYRoc4kvaTNl7t73tndhXnpAAAAANoivyXpubm5stvtSklJqbc9JSVFWVlZjT5mzJgxmjFjhjZs2CCHw6EvvvhC8+fP1549e5o8z/Tp0xUXF+e+paWl+fR5tKTIdlfu7vlIumteejXz0gEAAAC0IX5vHOeNZ555Rr169VLfvn1ls9k0efJkTZgwQRZL009j2rRpKigocN927NjRihEfnsiwtt84Lre4QnkllR53dq+LeekAAAAA2hq/JelJSUmyWq3Kzs6utz07O1upqamNPiY5OVkffPCBSkpKtG3bNq1du1bR0dHq0aNHk+cJCwtTbGxsvVuwiAxt+0uwbagpdU9L8Kyze13MSwcAAADQ1vgtSbfZbBo8eLAWLFjg3uZwOLRgwQINHz682ceGh4erS5cuqq6u1nvvvafzzjuvpcP1C1e5e1tuHLchx9k0zpv56C7MSwcAAADQ1vi13H3q1Kl6+eWXNWfOHK1Zs0Y33nijSkpKNGHCBEnSlVdeqWnTprn3/+GHHzR//nxt3rxZ33zzjc444ww5HA799a9/9ddTaFGucve2nIAeSmd3F+alAwAAAGhrQvx58nHjxmnv3r269957lZWVpUGDBunTTz91N5Pbvn17vfnm5eXluvvuu7V582ZFR0dr7NixeuONNxQfH++nZ9CyImvKv8uq2vBIerb3a6TXdVyPDnpv5U59v3mfTuyd7MvQAAAAAKDV+TVJl6TJkydr8uTJjd63aNGier+PGjVKv//+eytEFRhc5e5VdlOV1Q7ZQoKqz59HNuS4ll/zfiRdcs5LdyXpAAAAABDs2l7W14ZE1mmk1hbnpR9OZ3cX5qUDAAAAaEtI0gNYqNWiUKshSSqtansJ6OF0dndhXjoAAACAtoQkPcC5St5LKtreSPrhdHava1iGcym2n7bnH25IAAAAAOBXJOkBzt08rg2Wu7tG0nt2PLT56C6pceGSpP2llYcdEwAAAAD4E0l6gHMl6aWVba/c3bX82uGOpMdFhEqSCsuqDjsmAAAAAPAnkvQA5yp3L22LI+mH2dndxZWkF5CkAwAAAAhyJOkBLsI9kt62kvR9Pujs7hJLkg4AAACgjSBJD3BRNUl6SRsrd1/vg87uLu5y93KSdAAAAADBjSQ9wLnK3dta47iNNZ3de3U8vFF0SYoNZyQdAAAAQNtAkh7gIttoubtrJL3XYc5Hl5iTDgAAAKDtIEkPcG21u7uvOrtLtUl6eZVDFdVt68sMAAAAAO0LSXqAi2ij3d031nR273WYa6RLUnR4iPvnwrK29WUGAAAAgPaFJD3ARbXBkfR9xRXaV9PZvacP5qRbLYZiahJ1St4BAAAABDOS9ADXFpdgc62P3jUh4rA7u7vQ4R0AAABAW0CSHuAi22C5+wbXfHQflLq70OEdAAAAQFtAkh7gosLaXrm7Lzu7u7hH0knSAQAAAAQxkvQAFxHaFsvdfbdGugtJOgAAAIC2gCQ9wEWF1ZS7V7ShJL1mJL23D0fSYyNoHAcAAAAg+JGkBzh347iqtlHu7ursLkmZHaN8dlzXSDpJOgAAAIBgRpIe4CJrkvSyNlLu7ursnpYY4W6K5wu15e5t48sMAAAAAO0TSXqAi6pJZEvaSLl7S3R2l6RYRtIBAAAAtAEk6QHOVe5eVmWXw2H6OZrD5xpJ75niu6ZxEuXuAAAAANoGkvQAF1WnJLysKvhH09e38Eh6YTlJOgAAAIDgRZIe4MJDLTIM589tYRm2De410n07kh4bzkg6AAAAgOBHkh7gDMNwr5Ue7M3jcorKta+kUoYh9fThGukS66QDAAAAaBtI0oOAqwt6SWVwdy5fs8dZ6t4jKcqnnd2l2iS9qKK6TczdBwAAANA+kaQHAdcybMFe7v777kJJUv/OcT4/dmyEM+k3TamoPLi/zAAAAADQfpGkB4G2slb673tqkvROsT4/dliIVeGhzrczzeMAAAAABCuS9CDgStKDvdz9990FkqR+nXzb2d2FZdgAAAAABDuS9CDgmr8dzCPppZXV2pxbIknq39n3I+kSHd4BAAAABD+S9CDQFkbS12UVyTSlpOgwdYwJb5Fz0OEdAAAAQLAjSQ8CbWFOuns+eguNokuUuwMAAAAIfiTpQSCiptw9mLu7r2nBpnEusSTpAAAAAIIcSXoQiGoD5e61y6+1/Eg63d0BAAAABCuS9CAQ7OXudoeptVlFkhhJBwAAAIDmkKQHgcgwZ7l7SUVwJunb9pWotNKu8FCLMpKiWuw8seHO16mgLHgrDgAAAAC0byTpQcA9kl4VnMmnq2lc39RYWS1Gi52H7u4AAAAAgh1JehCICHUm6cHaOK415qNLdHcHAAAAEPxI0oNAVE25e2mQlru7RtL7teB8dKl2Tjoj6QAAAACCFUl6EIioKXcvDdZy990tv/yaRHd3AAAAAMGPJD0IRNmCdyR9b1GFcooqZBhS39SYFj1X3XJ30zRb9FwAAAAA0BJI0oOAq3FcMM5JX1NT6p7RIcpdtt9SXOXuVXZTZVXB91oBAAAAAEl6EHCXu1cGX7m7K0nv18JN4yQpymZ1d48vZBk2AAAAAEGIJD0IuMvdg3Ak3dU0rqXno0uSYRh0eAcAAAAQ1EjSg4BrJL3aYaqy2uHnaLzTWsuvucSGO7/QIEkHAAAAEIxI0oOAa066FFwl7+VVdm3aWyxJOqIVRtKlOh3eSdIBAAAABCGS9CAQarXIZnVeqmAqeV+XVSSHKSVF25QcE9Yq54yl3B0AAABAECNJDxIRQdjh3TUfvV+nWBmG0SrnJEkHAAAAEMxI0oNEVBB2eHfPR2+lUnepTrl7OUk6AAAAgOBDkh4kgnkkvbWaxklSbDgj6QAAAACCF0l6kIh0L8MWHCPpDofpXiPdHyPpJOkAAAAAghFJepCIDLKR9O15pSqttCssxKKMpKhWO29td/fg+DIDAAAAAOoiSQ8SwZaku0rd+6bGKMTaem+z2AhnxQFLsAEAAAAIRiTpQSIyrKbcvSI4RojdTeNacT66RLk7AAAAgOBGkh4kIkNrRtKrgmskvTXno0t0dwcAAAAQ3EjSg4Sr3L0sWMrd/TSSTnd3AAAAAMGMJD1IuMrdSyoCP0nfV1yhrMJyGYbUJ9U/I+mllXZV2R2tem4AAAAAOFwk6UHCVe5eVhX4c9LX7CmSJKV3iFJ0zZcLrSUmvPZ8NI8DAAAAEGxI0oNEMI2k/76nQJLUr1NMq587xGpxfzFAyTsAAACAYEOSHiSCaQk293z0Vm4a50KHdwAAAADBiiQ9SLgbxwVRuXtrN41ziXV3eA/81woAAAAA6iJJDxKRtuAody+vsmvj3mJJUv9OcX6JITaccncAAAAAwYkkPUgEyxJsG7KLZXeYSoyyKSU2zC8xUO4OAAAAIFiRpAeJiJokvaQysEu4XU3j+neKlWEYfonBlaTT3R0AAABAsCFJDxJRNeXugT6S7m4a56f56FKdOekk6QAAAACCDEl6kAiW7u6/7/FvZ3eJcncAAAAAwYskPUjUdne3y+Ew/RxN4xwO0++d3aU65e7lJOkAAAAAggtJepBwdXeXnIl6INqxv1TFFdWyhVjUIynKb3HERtDdHQAAAEBwIkkPEuGhFrn6sAVq8zjXfPQ+KTEKsfrvrUW5OwAAAIBgRZIeJAzDUGRoYC/DtiYA5qNLdbu7B+aXGQAAAADQFL8n6TNnzlR6errCw8M1bNgwLVu2rNn9n376afXp00cRERFKS0vTLbfcovLy8laK1r8iakreA7V5nLtpnB/no0tSbDgj6QAAAACCk1+T9Hnz5mnq1Km67777tHLlSg0cOFBjxoxRTk5Oo/v/5z//0Z133qn77rtPa9as0auvvqp58+bpb3/7WytH7h9RYa4O74E5QhwIy69J9RvHBWqTPQAAAABojF+T9BkzZujaa6/VhAkT1L9/f82aNUuRkZF67bXXGt3/u+++0wknnKDLLrtM6enpOv3003XppZcedPS9rYgIDdxl2PaXVGp3gbOioW9qjF9jca2TbppScYB+oQEAAAAAjfFbkl5ZWakVK1Zo9OjRtcFYLBo9erSWLl3a6GOOP/54rVixwp2Ub968Wf/73/80duzYJs9TUVGhwsLCerdg5VqGraQi8JJ013z07h0iFVNTbu4v4aFW2UKcb+2CUkreAQAAAASPkIPv0jJyc3Nlt9uVkpJSb3tKSorWrl3b6GMuu+wy5ebmasSIETJNU9XV1brhhhuaLXefPn26HnjgAZ/G7i9RYc7LVVYVeKPDvwdI0ziXuIhQ7S2qUEFZldL8HQwAAAAAeMjvjeO8sWjRIj3yyCN6/vnntXLlSs2fP18ff/yxHnrooSYfM23aNBUUFLhvO3bsaMWIfSuQy93d89EDKEmXnPPSAQAAACBY+G0kPSkpSVarVdnZ2fW2Z2dnKzU1tdHH3HPPPbriiis0ceJESdKRRx6pkpISXXfddbrrrrtksTT8ziEsLExhYWG+fwJ+4Cp3Lw3AcvdA6ezuEhvufGsX0uEdAAAAQBDx20i6zWbT4MGDtWDBAvc2h8OhBQsWaPjw4Y0+prS0tEEibrU6E1fTbPtdvCPDAnMJtvIquzbmFEsKnCSdtdIBAAAABCO/jaRL0tSpUzV+/HgNGTJEQ4cO1dNPP62SkhJNmDBBknTllVeqS5cumj59uiTpnHPO0YwZM3T00Udr2LBh2rhxo+655x6dc8457mS9LYsMDcwl2DbmFKvaYSo+MlSpseH+DkdSbZLOWukAAAAAgolfk/Rx48Zp7969uvfee5WVlaVBgwbp008/dTeT2759e72R87vvvluGYejuu+/Wrl27lJycrHPOOUcPP/ywv55CqwrUkfS6TeMMw/BzNE6xJOkAAAAAgpBfk3RJmjx5siZPntzofYsWLar3e0hIiO677z7dd999rRBZ4HHPSQ+0JD3AmsZJNI4DAAAAEJyCqrt7e1ebpAdWufuW3BJJUq+UaD9HUotydwAAAADBiCQ9iETaArPcfV9JhSSpY0xgzEeXpNhwknQAAAAAwYckPYi4RtLLAi1JL66UJCVG2fwcSa1Yd3d3knQAAAAAwYMkPYi4kvSSACp3N03TnaR3iA6cJJ1ydwAAAADBiCQ9iLjK3QNpJL24olqVdockqUNUmJ+jqRUb4XytClgnHQAAAEAQIUkPIoE4ku4aRY+yWRVhC5y16unuDgAAACAYHVKS/s033+hPf/qThg8frl27dkmS3njjDS1ZssSnwaG+QFyCzdU0rkN04IyiS7VJemW1Q+VVgfN6AQAAAEBzvE7S33vvPY0ZM0YRERH66aefVFHhTNIKCgr0yCOP+DxA1Kpb7m6app+jccoNwPnokhRlC5HFcP7MvHQAAAAAwcLrJP3vf/+7Zs2apZdfflmhoaHu7SeccIJWrlzp0+BQX2SYcyS92mG654H7m7tpXADNR5cki8WgwzsAAACAoON1kr5u3TqdeOKJDbbHxcUpPz/fFzGhCZGhtXO+A6V53L5iZyVFUoCNpEt0eAcAAAAQfLxO0lNTU7Vx48YG25csWaIePXr4JCg0LsRqkc3qvGQlgZKklwRmubskxYaTpAMAAAAILl4n6ddee62mTJmiH374QYZhaPfu3fr3v/+t2267TTfeeGNLxIg6XCXvZQHS4T23ZiQ90MrdJTq8AwAAAAg+Id4+4M4775TD4dCpp56q0tJSnXjiiQoLC9Ntt92mv/zlLy0RI+qIDLUqX1UB0+F9X4A2jpPqrJVeSpIOAAAAIDh4naQbhqG77rpLt99+uzZu3Kji4mL1799f0dHRLREfDuBai7ykIkCS9BLXnPTAHUkvKAuMqgMAAAAAOBivk3QXm82m/v37+zIWeCAqrGYZtqrASDwDeySdcncAAAAAwcXrJP3kk0+WYRhN3v/VV18dVkBoXkRo4Iyk2x2m8koDcwk2icZxAAAAAIKP10n6oEGD6v1eVVWln3/+Wb/++qvGjx/vq7jQBPdIegDMSd9fWinTlAxDSogM9Xc4DbAEGwAAAIBg43WS/tRTTzW6/f7771dxcfFhB4TmueaklwZAd3dXqXtCpE0hVq8XCmhx7u7uJOkAAAAAgoTPMqs//elPeu2113x1ODQh0lXuHgAj6fvcy68F3nx0qXZOOiPpAAAAAIKFz5L0pUuXKjw83FeHQxMCqdw9tyRwm8ZJjKQDAAAACD5el7tfeOGF9X43TVN79uzR8uXLdc899/gsMDTOvQRbQJS714ykB+Dya1KdJL3c/68VAAAAAHjC6yQ9Li6u3u8Wi0V9+vTRgw8+qNNPP91ngaFxUTVJeiCMpLvmpCcFarl7uPPtXVxRrWq7IyDnzQMAAABAXV4n6a+//npLxAEPRdicl6w0EJL0ksAeSXfNSZeco+mJAfplAgAAAAC4MLQYZCIDqLt7bnFgz0kPtVrclQfMSwcAAAAQDDwaSU9ISJBhGB4dMC8v77ACQvNqk/QAGEl3d3cPzJF0yTmaXlJpp8M7AAAAgKDgUZL+9NNPt3AY8FRkTbl7QCzBFuDd3SVn87g9BeUk6QAAAACCgkdJ+vjx41s6Dngo0t04zv/l7q7GcYG6TrpUOy+9sJwkHQAAAEDg87pxXF3l5eWqrKysty02NvawAkLzAqXcvbzKruIK5xcFgdo4TpJiw51JOiPpAAAAAIKB143jSkpKNHnyZHXs2FFRUVFKSEiod0PLigyQ7u55NaXuoVbDvdRZIHKtlU6SDgAAACAYeJ2k//Wvf9VXX32lF154QWFhYXrllVf0wAMPqHPnzvrXv/7VEjGijkDp7l5b6h7mcVNBf3Al6YVl/p8eAAAAAAAH4/UQ6EcffaR//etfOumkkzRhwgSNHDlSPXv2VPfu3fXvf/9bl19+eUvEiRquJL28yiG7w5TV4p8EOde9RnrgzkeXpNgI51uckXQAAAAAwcDrkfS8vDz16NFDknP+uWvJtREjRmjx4sW+jQ4NuMrdJamsyn8l7+6R9ACejy7VHUknSQcAAAAQ+LxO0nv06KEtW7ZIkvr27au3335bknOEPT4+3qfBoaHwUItc1eX+LHl3rZGeFMCd3aU6STrd3QEAAAAEAa+T9AkTJmjVqlWSpDvvvFMzZ85UeHi4brnlFt1+++0+DxD1GYahyNCaeekVfhxJD4I10iW6uwMAAAAILl7PSb/lllvcP48ePVpr167VihUr1LNnTx111FE+DQ6NiwwLUUml3a8d3nOLXXPSA7zcPZIkHQAAAEDw8DpJ37Fjh9LS0ty/d+/eXd27d/dpUGieq3lcWZU/y91d3d0DeySdOekAAAAAgonX5e7p6ekaNWqUXn75Ze3fv78lYsJBRNSUu5f4tdy9Zk56gI+ku8rdC8urZZqmn6MBAAAAgOZ5naQvX75cQ4cO1YMPPqhOnTrp/PPP17vvvquKioqWiA+NiApzFkD4s9y9trt7cIyk2x2miitYKx0AAABAYPM6ST/66KP1xBNPaPv27frkk0+UnJys6667TikpKbr66qtbIkYcwFXu7q/u7qZpBs0SbOGhFtmszrd5YTlJOgAAAIDA5nWS7mIYhk4++WS9/PLL+vLLL5WRkaE5c+b4MjY0oTZJ989IelFFtSrtDkmBPyfdMAzFRjgrDwpKmZcOAAAAILAdcpK+c+dOPf744xo0aJCGDh2q6OhozZw505exoQmRNmfSWeanJN01ih4dFqLwmvnxgSw2gg7vAAAAAIKD193dX3zxRf3nP//Rt99+q759++ryyy/Xhx9+SIf3VhRRM5Je4qdy933u5dcCexTdxd3hvZwkHQAAAEBg8zpJ//vf/65LL71Uzz77rAYOHNgSMeEgolxLsPlpJD03SJZfc3F1eGckHQAAAECg8zpJ3759uwzDaIlY4KGImnJ3v42kl7hG0gO7aZwLa6UDAAAACBZez0knQfc/fzeOc81JTwq2cneSdAAAAAAB7pAbx8F//F3u7p6THhUcI+nu7u4k6QAAAAACHEl6EKotd/fTnPQS1xrpwTWSTpIOAAAAINCRpAeh2pF0f3d3D46R9Nru7v55vQAAAADAUyTpQci9BFuFf+ek090dAAAAAHzL6yQ9OztbV1xxhTp37qyQkBBZrdZ6N7S8yJpy97IqPyXplLsDAAAAQIvwegm2q666Stu3b9c999yjTp060e3dD2q7u7d++bbdYWp/qWskPTjK3WPp7g4AAAAgSHidpC9ZskTffPONBg0a1ALhwBPuJN0P5e77SytlmpJhSAmRoa1+/kPBSDoAAACAYOF1uXtaWppM02yJWOChqDDndyulVfZWvxau+egJkTaFWIOjpYFrJL2i2qFyP00RAAAAAABPeJ1lPf3007rzzju1devWFggHnnA1jrM7TFVUO1r13LVrpAfHfHRJigkLkWtWRmE5o+kAAAAAApfX5e7jxo1TaWmpMjMzFRkZqdDQ+iXPeXl5PgsOjYsMrW3QV1ZpV3ho6zXsC7Y10iXJYjEUExaiwvJqFZZVqWNMuL9DAgAAAIBGeZ2kP/300y0QBrwRYrXIFmJRZbVDpVV2JbTiuYNtjXSXuMhQFZZXq6CMtdIBAAAABC6vk/Tx48e3RBzwUqTN6kzSK1o36XTNSU8KonJ3ybVWehkd3gEAAAAENK+TdEmy2+364IMPtGbNGknSEUccoXPPPZd10ltRlC1E+aVVKq1s3UZo+0qCdCSdDu8AAAAAgoDXSfrGjRs1duxY7dq1S3369JEkTZ8+XWlpafr444+VmZnp8yDRUIR7rfTWTdJzi4NvTrpUm6TTOA4AAABAIPO6u/tNN92kzMxM7dixQytXrtTKlSu1fft2ZWRk6KabbmqJGNEI91rpla1d7u7q7h5cI+nOcnepoJQkHQAAAEDg8nok/euvv9b333+vxMRE97YOHTro0Ucf1QknnODT4NC0SD+NpO+r6e6eFGwj6ZGUuwMAAAAIfF6PpIeFhamoqKjB9uLiYtlswZW4BbNIm/P7ldYfSXeVuwfXSDrl7gAAAACCgddJ+tlnn63rrrtOP/zwg0zTlGma+v7773XDDTfo3HPPbYkY0Qh/zEkvr7KruKabfLDNSY8Nd36pwUg6AAAAgEDmdZL+7LPPKjMzU8OHD1d4eLjCw8N1wgknqGfPnnrmmWdaIkY0IsoPSbqr1N1mtSgm7JAWBvCbWLq7AwAAAAgCXmda8fHx+vDDD7VhwwatXbtWktSvXz/17NnT58GhaYda7l5e5Uzqw0O9Xy7P3TQu2ibDMLx+vD+5y93LWnd6AAAAAAB445CHQ3v16qVevXr5MhZ44VAax5VX2TV6xteKDQ/VxzeN8DrR3heky69JjKQDAAAACA4eJelTp07VQw89pKioKE2dOrXZfWfMmOGTwNA8d5Je4XmSvmZPoXbuL5NUpp37y5SWGOnVOXODdPk1qe5IOkk6AAAAgMDlUZL+008/qaqqyv0z/C/CVe5e5XmSvi6rtiv/mj2FXifprjnpwTiS7krSiyqqZXeYslqCq1wfAAAAQPvgUZK+cOHCRn+G/7gax5V5MSd9bZ0kfW1WkU4/ItWrc7rmpCcF2fJrkhQbHur+uai8SvGRwfdFAwAAAIC2z+vu7ldffXWj66SXlJTo6quv9klQODjXEmwlXpS7r6uXpBd6fU73nPSo4EtwbSEWRdQ0y2NeOgAAAIBA5XWSPmfOHJWVlTXYXlZWpn/9618+CQoHF+VlubtpmlqXXbfcveEXLQeTW1PunhiESbpEh3cAAAAAgc/jJL2wsFAFBQUyTVNFRUUqLCx03/bv36///e9/6tix4yEFMXPmTKWnpys8PFzDhg3TsmXLmtz3pJNOkmEYDW5nnXXWIZ07WNU2jvMs4dxbXKG8miRbkrbuK/F6+bZgLneXpNgI5xcbjKQDAAAACFQeL8EWHx/vToh79+7d4H7DMPTAAw94HcC8efM0depUzZo1S8OGDdPTTz+tMWPGaN26dY0m/fPnz1dlZW2yuW/fPg0cOFAXX3yx1+cOZhFeLsHmKnXPSIpSUXm1cosrtC6rSEd3S/D4nMG8BJtUO5JOkg4AAAAgUHmcpC9cuFCmaeqUU07Re++9p8TERPd9NptN3bt3V+fOnb0OYMaMGbr22ms1YcIESdKsWbP08ccf67XXXtOdd97ZYP+655WkuXPnKjIyst0l6VFhzktX5mG5uytJ75MSo5LKan2zoUJrvUjSTdN0j8R3CNKRdHe5ezlJOgAAAIDA5HGSPmrUKEnSli1b1K1bNxnG4S9hVVlZqRUrVmjatGnubRaLRaNHj9bSpUs9Osarr76qP/7xj4qKimr0/oqKClVUVLh/Lyz0vmFaIHI1QSvxsNzdnaSnxqisyq5vNuRq7R7PX4uiimpV2h2SgrNxnFTb4Z2RdAAAAACByuvGcV999ZXefffdBtvfeecdzZkzx6tj5ebmym63KyUlpd72lJQUZWVlHfTxy5Yt06+//qqJEyc2uc/06dMVFxfnvqWlpXkVY6ByzUmvqHbI7jAPur+raVzf1Bj1TY2R5F3zOFepe3RYiMJrviAINrGUuwMAAAAIcF4n6dOnT1dSUlKD7R07dtQjjzzik6A89eqrr+rII4/U0KFDm9xn2rRpKigocN927NjRihG2HFe5u6SDNoCzO0ytz64dSe/XKVaStCarUKZ58ARfqm0aF6zz0aW63d1J0gEAAAAEJo/L3V22b9+ujIyMBtu7d++u7du3e3WspKQkWa1WZWdn19uenZ2t1NTUZh9bUlKiuXPn6sEHH2x2v7CwMIWFBecc6uaEhVhkGJJpSmWVdsXUlHI3ZnteqcqrHAoPtah7hyjZHaZCLIaKyqu1u6BcXeIjDnq+3CBeI92FkXQAAAAAgc7rkfSOHTtq9erVDbavWrVKHTp08OpYNptNgwcP1oIFC9zbHA6HFixYoOHDhzf72HfeeUcVFRX605/+5NU52wrDMGrXSj9Ih/d1Wc655706xshqMWQLsahnx2hJ0prdns1L31fiGkkP3i886O4OAAAAINB5naRfeumluummm7Rw4ULZ7XbZ7XZ99dVXmjJliv74xz96HcDUqVP18ssva86cOVqzZo1uvPFGlZSUuLu9X3nllfUay7m8+uqrOv/8873+YqAtcS3DVnKQcve1dZrGubhK3tdmeZik14ykJ7WFcvdy79aHBwAAAIDW4nW5+0MPPaStW7fq1FNPVUiI8+EOh0NXXnnlIc1JHzdunPbu3at7771XWVlZGjRokD799FN3M7nt27fLYqn/XcK6deu0ZMkSff75516fry1xNY8rO+hIeu3yay7u5nFZnjWPc89JjwrekfTYcOf7lTnpAAAAAAKV10m6zWbTvHnz9NBDD2nVqlWKiIjQkUceqe7dux9yEJMnT9bkyZMbvW/RokUNtvXp08fjhmdtWWRNuXuJp0l6IyPpazxchi3XvUZ6EI+kR1LuDgAAACCweZ2ku/Tu3Vu9e/f2ZSzwUu1IetPl2+VVdm3dVyKpdvRckvp2cv68NbdEZZV2d+l8U2q7uwfvSHrd7u6macowDD9HBAAAAAD1eZ2k2+12zZ49WwsWLFBOTo4cDke9+7/66iufBYfmuZL05hrHbcgulsOUEiJDlRxTm2AnR4epQ5RN+0oqtSGnSEd1jW/2XO456cHc3b2mA361w1Rppb3eMnYAAAAAEAi8zlKmTJmi2bNn66yzztKAAQMYjfSjSHfjuKaTdFdjuD6pMfWulWEY6tcpVks25mrNnsKDJ+nucvfgHUmPtFkVYjFU7TBVUFZFkg4AAAAg4HidpcydO1dvv/22xo4d2xLxwAuuOenNlbuvz3bOR++bGtvgvr6pMTVJevPN46rtDu0vDf456YZhKC4iVPtKKvXMlxt07YkZ6tkx5uAPBAAAAIBW4vUSbDabTT179myJWOAlT8rdG1t+zaWvh83j9pdWyTQlw5ASIoM3SZek43smSZLmLd+h0TMW69KXvtf/ftmjKrvjII8EAAAAgJbndZJ+66236plnnqG7egDwJElvrLO7S7+a5nFrs4qavZ77SpxN4xIjbbJagnt6wzPjBumNa4bqtP4pshjS0s379Od/r9QJj36lp75Yr6yCcn+HCAAAAKAd87rcfcmSJVq4cKE++eQTHXHEEQoNDa13//z5830WHJrnKncvbaLcfX9JpXKKnAl275SGSXrPjtGyWgwVlFUpq7BcneIiGj2Oq2lcMJe6u1gshkb2StbIXsnalV+mt37Yrrk/bldOUYWeWbBB/1y4Uaf3T9EVx3XX8MwO9FwAAAAA0Kq8TtLj4+N1wQUXtEQs8JJ7JL2i8ZF0V6l7WmKEohtpkhYWYlVmcpTWZxdrzZ7CJpP0XNfya1HB2zSuMV3iI3TbmD666dRe+vS3LL25dJuWbc3TJ79m6ZNfs5SZHKVpZ/bT6P4p/g4VAAAAQDvhdZL++uuvt0QcOAQHK3df5+rsntKwaZxLv06xNUl6kU7p23gy2pZG0htjC7Ho3IGdde7AzlqbVag3v9+m91fu0qa9JZr0n5X69s5TlBTEXe0BAAAABA+v56QjcLjL3auaSNLdnd2b7mDu6vruGnVvjGtOentIVPumxurv5x+p7/92qo7qGqeKaodeW7LF32EBAAAAaCe8HknPyMhodp7u5s2bDysgeK623L3xOemuxLt3c0l6TfO45jq8u0fSo9rmSHpjYsJDNenknrr+jRV6Y+k2XT8qU3ERoQd/IAAAAAAcBq+T9Jtvvrne71VVVfrpp5/06aef6vbbb/dVXPBARDPl7g6HqfVZBx9J71+zDNvmvcUqr7IrPNTaYJ/cmiQ9sY2WuzfltH4p6tUxWhtyivXm99s06WSWHgQAAADQsrxO0qdMmdLo9pkzZ2r58uWHHRA8FxXWdHf3XfllKqm0K9RqKCMpqsljdIwJU0JkqPaXVmljTrEGdIlrsI+r3L2tNY47GIvF0J9PztQt81bptSVbdPUJGe4vRgAAAACgJfhsTvqZZ56p9957z1eHgwciQpseSXetj56ZHK1Qa9OX2TAM97z035soec8rcY6kJ7WzkXRJOueozuqaEKF9JZWa9+N2f4cDAAAAoI3zWZL+7rvvKjEx0VeHgwdcI+lljSXpHjSNc+lXU/K+dk/jzeNqu7u3r5F0SQqxWnT9qExJ0kuLN6uy2uHniAAAAAC0ZV6Xux999NH1GseZpqmsrCzt3btXzz//vE+DQ/NcjeNKKqtlmma96+JqGtcntenl11xczePWZjUcSS+vsqu4pjFdW12C7WAuHtxVz3y5QbsLyvXhz7t08ZA0f4cEAAAAoI3yOkk///zz6/1usViUnJysk046SX379vVVXPCAa360w5Qqqh31mr651kj3ZCTd1TxuzZ7CBsn+vppSd5vVopgwr98ubUJ4qFXXjszQ9E/W6oWvN+nCY7rKaml6hQMAAAAAOFQeZV1Tp07VQw89pKioKJ188skaPny4QkNZjsrfIusk5aWVtZ3ZK6sd2ry3RJLUx4MkvWfHaFkMaX9plXKKKpQSG+6+b19xTdO4aFuzS++1dZcf110zF27U5r0l+uy3LI09spO/QwIAAADQBnk0J/25555TcXGxJOnkk0/W/v37WzQoeCbEapEtxHkJ63Z437S3WNUOUzHhIeoUF97Uw93CQ63qkRwtqWHzuNr56O2z1N0lOixEVx2fLkl6ftFGmabp34AAAAAAtEkejaSnp6fr2Wef1emnny7TNLV06VIlJCQ0uu+JJ57o0wDRvCibVZXVjnrN49bVWR/d09Hvfp1itTGnWGv3FOnkPh3d23OL2+fya4256oQMvfzNFv26q1CLN+RqVO9kf4cEAAAAoI3xKEl/4okndMMNN2j69OkyDEMXXHBBo/sZhiG7vWGncbScSFuI9pdWqaROkl7bNO7gpe4ufVNj9NGqhs3jXHPS2/tIuiQlRtl02bBuenXJFs1cuJEkHQAAAIDPeVTufv755ysrK0uFhc7GYuvWrdP+/fsb3PLy8lo6XhzA1Tyubrm7q2mcJ53dXfrVdHhf06Dc3TmSntQOl19rzMSRGQq1Glq2JU/Lt/J+BwAAAOBbXq2THh0drYULFyojI0NxcXGN3tC6olxJekXDcvc+KZ6PpLvWSt+0t0QV1bXHcs9Jj2IkXZI6xUXoomO6SpKeX7TJz9EAAAAAaGu8StIladSoUQoJaZ9LcQUi90h6lTOxLiyv0u6CckneJempseGKiwiV3WFqY06xe3uuu9ydkXSX60dlymJIX63N0e+7G64tDwAAAACHyuskHYElyub8wqSsptx9fc0oeqe4cMVFer5MnmEY7jXV1+wpcm+vuwQbnDKSotxLsL3wNaPpAAAAAHyHJD3IuUbSS2rK3Q+laZyLq+R9bZ156a5y9yS6u9fz55N6SpI+Xr1bW3JL/BwNAAAAgLaCJD3IRdYk6WU15e7rDitJdz7Gleibpql9JYykN6Z/51id0rejHKb0IqPpAAAAAHzkkJP0jRs36rPPPlNZWZkkZ0KH1hdZU+5eUuEsd6+7Rrq3+tZ0g1+zx9nFv7C8WlV253VNpHFcA5NOzpQkvbdyp/YUlPk5GgAAAABtgddJ+r59+zR69Gj17t1bY8eO1Z49eyRJ11xzjW699VafB4jmRbqXYLPLNE33Oud9Ujxffs2ld0qMLIZzbfS9xRXu+egxYSEKD7X6Lug2YnD3RA3NSFSV3dQr32zxdzgAAAAA2gCvk/RbbrlFISEh2r59uyIjI93bx40bp08//dSnweHg3OXulXZlFZarsLxaVouhzI5RXh8rwmZVepLzcWv2FGmfu7M7o+hNmXSyc276f37Yrrya1wsAAAAADpXXSfrnn3+uxx57TF27dq23vVevXtq2bZvPAoNn3OXuldXuueQ9kqIUFnJoI9/9Umubx9V2dqdpXFNO7JWkAV1iVVZl12tLGE0HAAAAcHi8TtJLSkrqjaC75OXlKSyMZK611R1JP5ymcS51m8fl1nR278B89CYZhqHJNaPpr3+7hdF0AAAAAIfF6yR95MiR+te//uX+3TAMORwOPf744zr55JN9GhwOLjLMOZJeWidJP5SmcS51m8e5ll9jJL15p/dP1RGdY1VSaafTOwAAAIDDEuLtAx5//HGdeuqpWr58uSorK/XXv/5Vv/32m/Ly8vTtt9+2RIxoRmSoq3FcdZ010r1vGufSr7PzsRtzipVV6OxYnsSc9GZZLIZuO72PJsz+UXOWbtU1IzLUMTbc32EBAAAACEJej6QPGDBA69ev14gRI3TeeeeppKREF154oX766SdlZma2RIxohqvcvai8WptyiiVJfVIOfSS9c1y4YsJDVO0w9cOWPEksv+aJk/ok65hu8Sqvcmjmwo2HfTzTNPX0l+v18uLNPogOAAAAQLDweiRdkuLi4nTXXXf5OhYcAle5+9Z9JXKYzqS9a0LEIR/PMAz1S43Vsq152ry3RBLl7p4wDOdo+mWv/KD/LNuua0/soa4JDXs3eOrt5Tv09JcbJEnDMztoQJc4X4UKAAAAIIB5PZLes2dP3X///dqwYUNLxAMvuUbSHabz994pMbJYjMM6pqt5nEsSI+keOb5nko7P7KAqu6l/fnXoo+lZBeX6+3/XuH9/la7xAAAAQLvhdZI+adIkffzxx+rTp4+OPfZYPfPMM8rKymqJ2OABV5LucjhN49zH6FR/Tjsj6Z679fTekqR3VuzUltwSrx9vmqbuev8XFVVUq1uicyT+o1W7lVVQ7tM4AQAAAAQmr5P0W265RT/++KPWrl2rsWPHaubMmUpLS9Ppp59er+s7WodrnXSXw1l+zeXARL8DjeM8Nrh7ok7ukyy7w9QzX673+vH/t2q3FqzNUajV0Cvjh2hoRqKqHabmLN3q+2ABAAAABByvk3SX3r1764EHHtD69ev1zTffaO/evZowYYIvY4MHDhxJ90WS3ic1RkZNxbxhSAmRJOneuPX0PpKkD1ft1vrsIo8fl1tcofv/7zdJ0l9O6aXeKTGaOCJDkvTv77eppKLa98ECAAAACCiHnKRL0rJly3TzzTfrggsu0Pr163XxxRf7Ki54KCzEorpT0PsexvJrLpG2EKV3iJIkJUbaZD3MOe7tzYAucTpzQKpMU3rqC89H0+/7v9+0v7RK/TrF6saTnCslnNovRekdIlVYXq33Vu5sqZABAAAABAivk/T169frvvvuU+/evXXCCSdozZo1euyxx5Sdna25c+e2RIxohmEY7pL35Jgwny2X5ip5p9T90NxyWm8ZhvTJr1n6dVfBQff/9Nc9+nj1Hlkthp74w1EKtTo/mlaLoatrRtNfW7JFdleHQAAAAABtktdJet++ffXpp59q0qRJ2rlzpz777DNdeeWVio6Obon44IGImpJ3XzSNc+lX0zyuQxRN4w5F75QYnTewsyTpH5+va3bf/NJK3f2Bs8z9+hN7NFhu7Q+DuyouIlRb95VqwZrslgkYAAAAQEDwOklft26dfvjhB02ZMkUpKSktERO8FFWTpPdJ8V2SfvoRKUqMsum0/lzjQ3Xz6N6yWgwtXLdXK7blNbnfQ/9do9ziCmUmR+mmU3s1uD/SFqLLhnWTJL3CcmwAAABAm+Z1kt6rV8MkAv7lKnf3RdM4l76psVpx92h3qTW8l54UpYsHd5Uk/ePzxuemL1yXo/dW7pRhSI//YaDCQ62N7jd+eLpCLIaWbcnT6p35LRUyAAAAAD/zKElPTExUbm6uJCkhIUGJiYlN3tD6Ljymi/p3itXJfTv69LiGQcO4w/WXU3vJZrXou0379N3G3Hr3FZVX6a75v0iSJhyfocHdE5o8TmpcuM6pKZ9/ldF0AAAAoM0KOfgu0lNPPaWYmBj3zyRvgWXiyB6aOLKHv8NAI7rER+jSoWmas3Sbnvx8nd7L7OD+/Dz6yVrtLihXt8RI3Tam90GPdc2IDL3/0y59vHqP7jijrzrHR7R0+AAAAABamWGaZrtqF11YWKi4uDgVFBQoNvbwlysDDiansFwnPrFQ5VUOvX7VsTq5b0ct3bRPl778vSTpP9cO0/GZSR4d648vLdX3m/N0/agemnZmv5YMGwAAAICPeJOHej0n3Wq1Kicnp8H2ffv2yWptfD4t0J51jA3X+OHpkqQnP1+nkopq3fHeaknSZcO6eZygS9K1NRUT//lhu4orqn0eKwAAAAD/8jpJb2rgvaKiQjYba2oDjbl+VKaibFb9trtQl73yg7bnlapTXLimndnXq+Oc3KejeiRFqai8Wu8s39FC0QIAAADwF4/mpEvSs88+K8nZTOyVV16pty663W7X4sWL1bevdwkH0F4kRtl0zYgMPfvVRq3akS9JeuTCIxUTHurVcSwWQ1ePyNDdH/yq177doiuHp8tqoUcEAAAA0FZ4nKQ/9dRTkpwj6bNmzapX2m6z2ZSenq5Zs2b5PkKgjbhmZA/NWbpNBWVVuvCYLjq5z6F147/omK568vN12pFXpi9+z9IZAzr5OFIAAAAA/uJxkr5li3PZp5NPPlnz589XQkLTy0UBaCguIlRPjRuoBWty9NczDr3qJMJm1Z+Gddc/F27UK99sIUkHAAAA2hC6uwNBKKewXCc89pWq7Kbe//PxOrobX5oBAAAAgapFu7tfdNFFeuyxxxpsf/zxx3XxxRd7ezgAh6BjbLjOHdhFkvTqki1+jgYAAACAr3idpC9evFhjx45tsP3MM8/U4sWLfRIUgIO7ZkSGJOmTX7O0c3+pn6MBAAAA4AteJ+nFxcWNLrUWGhqqwsJCnwQF4OD6d47VCT07yO4wNee7rf4OBwAAAIAPeJ2kH3nkkZo3b16D7XPnzlX//v19EhQAz0wc0UOSNHfZDhWVV/k5GgAAAACHy+Pu7i733HOPLrzwQm3atEmnnHKKJGnBggV666239M477/g8QABNG9U7WZnJUdq0t0SXvfyD4iNDZXeYqnaYsjdyq3Y4FBMeqqfHDVJ6UpS/wwcAAABwAK+T9HPOOUcffPCBHnnkEb377ruKiIjQUUcdpS+//FKjRo1qiRgBNMFiMXTdiT10x3u/6JddBR4/bv7KnZp6ep8WjAwAAADAofA6SZeks846S2eddZavYwFwCC4ZkqaESJsKy6sVYjFksRjOPw3nn9aaW4jF0Nfr9+rFxZv1807PE3oAAAAAreeQkvT8/Hy9++672rx5s2677TYlJiZq5cqVSklJUZcuXXwdI4BmGIah049I9Wjf6PAQvbh4s1bvzJdpmjIMo4WjAwAAAOANr5P01atXa/To0YqLi9PWrVs1ceJEJSYmav78+dq+fbv+9a9/tUScAHygb2qsbFaL8kurtD2vVN07MC8dAAAACCRed3efOnWqrrrqKm3YsEHh4eHu7WPHjmWddCDA2UIs6tc5VpL08458/wYDAAAAoAGvk/Qff/xR119/fYPtXbp0UVZWlk+CAtByBnWNkySt2sG8dAAAACDQeJ2kh4WFqbCwsMH29evXKzk52SdBAWg5A9PiJUmrd+b7NQ4AAAAADXmdpJ977rl68MEHVVVVJcnZtGr79u264447dNFFF/k8QAC+5UrSf91doCq7w7/BAAAAAKjH6yT9H//4h4qLi9WxY0eVlZVp1KhR6tmzp2JiYvTwww+3RIwAfCijQ5RiwkJUXuXQ+uwif4cDAAAAoA6vu7vHxcXpiy++0JIlS7R69WoVFxfrmGOO0ejRo1siPgA+ZrEYOiotTt9u3KdVOwp0ROc4f4cEAAAAoMYhrZMuSSNGjNCIESN8GQuAVjKwa3xNkp6vy4Z183c4AAAAAGp4lKQ/++yzuu666xQeHq5nn3222X2jo6N1xBFHaNiwYR4FMHPmTD3xxBPKysrSwIED9dxzz2no0KFN7p+fn6+77rpL8+fPV15enrp3766nn35aY8eO9eh8AGrnpa+ieRwAAAAQUDxK0p966ildfvnlCg8P11NPPdXsvhUVFcrJydEtt9yiJ554otl9582bp6lTp2rWrFkaNmyYnn76aY0ZM0br1q1Tx44dG+xfWVmp0047TR07dtS7776rLl26aNu2bYqPj/fkaQCoMagmSV+fXaTSympF2g65qAYAAACADxmmaZq+PugXX3yhyy67THv37m12v2HDhunYY4/VP//5T0mSw+FQWlqa/vKXv+jOO+9ssP+sWbP0xBNPaO3atQoNDT2k2AoLCxUXF6eCggLFxsYe0jGAtmDYI18qu7BCb18/XEMzEv0dDgAAANBmeZOHet3d3RMjRozQ3Xff3ew+lZWVWrFiRb2GcxaLRaNHj9bSpUsbfcz//d//afjw4Zo0aZJSUlI0YMAAPfLII7Lb7U2ep6KiQoWFhfVuAJzz0iVp1Y58v8YBAAAAoNYhJekLFizQ2WefrczMTGVmZurss8/Wl19+6b4/IiJCU6ZMafYYubm5stvtSklJqbc9JSVFWVlZjT5m8+bNevfdd2W32/W///1P99xzj/7xj3/o73//e5PnmT59uuLi4ty3tLQ0L54p0HYxLx0AAAAIPF4n6c8//7zOOOMMxcTEaMqUKZoyZYpiY2M1duxYzZw5syVidHM4HOrYsaNeeuklDR48WOPGjdNdd92lWbNmNfmYadOmqaCgwH3bsWNHi8YIBItBJOkAAABAwPG6W9Qjjzyip556SpMnT3Zvu+mmm3TCCSfokUce0aRJkzw6TlJSkqxWq7Kzs+ttz87OVmpqaqOP6dSpk0JDQ2W1Wt3b+vXrp6ysLFVWVspmszV4TFhYmMLCwjyKCWhPBnRxro++I69M+4or1CGazwkAAADgb16PpOfn5+uMM85osP30009XQUGBx8ex2WwaPHiwFixY4N7mcDi0YMECDR8+vNHHnHDCCdq4caMcDod72/r169WpU6dGE3QATYuLCFWP5ChJ0uqdnn92AQAAALQcr5P0c889V++//36D7R9++KHOPvtsr441depUvfzyy5ozZ47WrFmjG2+8USUlJZowYYIk6corr9S0adPc+994443Ky8vTlClTtH79en388cdejd4DqG9QTfO4n2keBwAAAAQEj8rdn332WffP/fv318MPP6xFixa5R7y///57ffvtt7r11lu9Ovm4ceO0d+9e3XvvvcrKytKgQYP06aefupvJbd++XRZL7fcIaWlp+uyzz3TLLbfoqKOOUpcuXTRlyhTdcccdXp0XgNPAtHjN/2mXVjMvHQAAAAgIHq2TnpGR4dnBDEObN28+7KBaEuukA7V+3pGv82d+q8Qom1bcPVqGYfg7JAAAAKDN8SYP9WgkfcuWLT4JDEBg6dcpRqFWQ3klldq5v0xpiZH+DgkAAABo1w5pnXTJuc55bm6uL2MB0MrCQqzq18n5TR7z0gEAAAD/8ypJz8/P16RJk5SUlKSUlBSlpKQoKSlJkydPVn5+fguFCKAlDaxpHse8dAAAAMD/PF4nPS8vT8OHD9euXbt0+eWXq1+/fpKk33//XbNnz9aCBQv03XffKSEhocWCBeB7A9Pi9cb327RqB8uwAQAAAP7mcZL+4IMPymazadOmTe7u63XvO/300/Xggw/qqaee8nmQAFrOwK5xkqRfdhWo2u5QiPWQZ8EAAAAAOEwe/2v8gw8+0JNPPtkgQZek1NRUPf74442unw4gsPVIjlZ0WIjKquzakFPs73AAAACAds3jJH3Pnj064ogjmrx/wIABysrK8klQAFqP1WLoyC7O0fRVNI8DAAAA/MrjJD0pKUlbt25t8v4tW7YoMTHRFzEBaGUD0+IlSat2Mi8dAAAA8CePk/QxY8borrvuUmVlZYP7KioqdM899+iMM87waXAAWsegNEbSAQAAgEDgVeO4IUOGqFevXpo0aZL69u0r0zS1Zs0aPf/886qoqNAbb7zRkrECaCFH1SzDti67SGWVdkXYrP4NCAAAAGinPE7Su3btqqVLl+rPf/6zpk2bJtM0JUmGYei0007TP//5T6WlpbVYoABaTqe4cCXHhGlvUYV+212gIelMXQEAAAD8weMkXZIyMjL0ySefaP/+/dqwYYMkqWfPnsxFB4KcYRga2DVeX67J1qqdJOkAAACAv3iVpLskJCRo6NChvo4FgB8NSotzJunMSwcAAAD8xuPGcQDaNte89FU78/0aBwAAANCe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Reedd55+++03SVynQPXjjz/qxRdf1FFHHVVvO9crcBxxxBHas2eP+7ZkyRL3fVynwLF//36dcMIJCg0N1SeffKLff/9d//jHP5SQkODeh39fBIYff/yx3mfqiy++kCRdfPHFkvhcBZLHHntML7zwgv75z39qzZo1euyxx/T444/rueeec+8T8J8rEwFn6NCh5qRJk9y/2+12s3Pnzub06dP9GBXqkmS+//777t8dDoeZmppqPvHEE+5t+fn5ZlhYmPnWW2/5IULUlZOTY0oyv/76a9M0ndcmNDTUfOedd9z7rFmzxpRkLl261F9hokZCQoL5yiuvcJ0CVFFRkdmrVy/ziy++MEeNGmVOmTLFNE0+V4HkvvvuMwcOHNjofVynwHLHHXeYI0aMaPJ+/n0RuKZMmWJmZmaaDoeDz1WAOeuss8yrr7663rYLL7zQvPzyy03TDI7PFSPpAaayslIrVqzQ6NGj3dssFotGjx6tpUuX+jEyNGfLli3Kysqqd93i4uI0bNgwrlsAKCgokCQlJiZKklasWKGqqqp616tv377q1q0b18uP7Ha75s6dq5KSEg0fPpzrFKAmTZqks846q951kfhcBZoNGzaoc+fO6tGjhy6//HJt375dEtcp0Pzf//2fhgwZoosvvlgdO3bU0UcfrZdfftl9P/++CEyVlZV68803dfXVV8swDD5XAeb444/XggULtH79eknSqlWrtGTJEp155pmSguNzFeLvAFBfbm6u7Ha7UlJS6m1PSUnR2rVr/RQVDiYrK0uSGr1urvvgHw6HQzfffLNOOOEEDRgwQJLzetlsNsXHx9fbl+vlH7/88ouGDx+u8vJyRUdH6/3331f//v31888/c50CzNy5c7Vy5Ur9+OOPDe7jcxU4hg0bptmzZ6tPnz7as2ePHnjgAY0cOVK//vor1ynAbN68WS+88IKmTp2qv/3tb/rxxx910003yWazafz48fz7IkB98MEHys/P11VXXSWJv/8CzZ133qnCwkL17dtXVqtVdrtdDz/8sC6//HJJwfHvdpJ0AG3apEmT9Ouvv9abj4nA0qdPH/38888qKCjQu+++q/Hjx+vrr7/2d1g4wI4dOzRlyhR98cUXCg8P93c4aIZrtEiSjjrqKA0bNkzdu3fX22+/rYiICD9GhgM5HA4NGTJEjzzyiCTp6KOP1q+//qpZs2Zp/Pjxfo4OTXn11Vd15plnqnPnzv4OBY14++239e9//1v/+c9/dMQRR+jnn3/WzTffrM6dOwfN54py9wCTlJQkq9XaoBtkdna2UlNT/RQVDsZ1bbhugWXy5Mn673//q4ULF6pr167u7ampqaqsrFR+fn69/ble/mGz2dSzZ08NHjxY06dP18CBA/XMM89wnQLMihUrlJOTo2OOOUYhISEKCQnR119/rWeffVYhISFKSUnhegWo+Ph49e7dWxs3buRzFWA6deqk/v3719vWr18/9/QE/n0ReLZt26Yvv/xSEydOdG/jcxVYbr/9dt1555364x//qCOPPFJXXHGFbrnlFk2fPl1ScHyuSNIDjM1m0+DBg7VgwQL3NofDoQULFmj48OF+jAzNycjIUGpqar3rVlhYqB9++IHr5gemaWry5Ml6//339dVXXykjI6Pe/YMHD1ZoaGi967Vu3Tpt376d6xUAHA6HKioquE4B5tRTT9Uvv/yin3/+2X0bMmSILr/8cvfPXK/AVFxcrE2bNqlTp058rgLMCSec0GCJ0PXr16t79+6S+PdFIHr99dfVsWNHnXXWWe5tfK4CS2lpqSyW+mmu1WqVw+GQFCSfK393rkNDc+fONcPCwszZs2ebv//+u3ndddeZ8fHxZlZWlr9Da9eKiorMn376yfzpp59MSeaMGTPMn376ydy2bZtpmqb56KOPmvHx8eaHH35orl692jzvvPPMjIwMs6yszM+Rtz833nijGRcXZy5atMjcs2eP+1ZaWure54YbbjC7detmfvXVV+by5cvN4cOHm8OHD/dj1O3TnXfeaX799dfmli1bzNWrV5t33nmnaRiG+fnnn5umyXUKdHW7u5sm1ytQ3HrrreaiRYvMLVu2mN9++605evRoMykpyczJyTFNk+sUSJYtW2aGhISYDz/8sLlhwwbz3//+txkZGWm++eab7n3490XgsNvtZrdu3cw77rijwX18rgLH+PHjzS5dupj//e9/zS1btpjz5883k5KSzL/+9a/ufQL9c0WSHqCee+45s1u3bqbNZjOHDh1qfv/99/4Oqd1buHChKanBbfz48aZpOpdzuOeee8yUlBQzLCzMPPXUU81169b5N+h2qrHrJMl8/fXX3fuUlZWZf/7zn82EhAQzMjLSvOCCC8w9e/b4L+h26uqrrza7d+9u2mw2Mzk52Tz1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\n",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create empty array for callback to store evaluations of the objective function (callback)\n",
    "objective_func_vals = []\n",
    "plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
    "\n",
    "# fit classifier to data\n",
    "estimator_classifier.fit(X, y)\n",
    "\n",
    "# return to default figsize\n",
    "plt.rcParams[\"figure.figsize\"] = (6, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The classifier can now differentiate between classes with an accuracy of:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# score classifier\n",
    "estimator_classifier.score(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3 Compute Local Effective Dimension of trained QNN\n",
    "\n",
    "Now that we have trained our network, let's evaluate the local effective dimension based on the trained weights. To do that we access the trained weights directly from the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for trained QNN:  [0.88607105 0.89359679 0.8970025  0.91521737 0.91960795 0.92460982\n",
      " 0.92820156 0.93056674 0.93722074 0.94150393]\n"
     ]
    }
   ],
   "source": [
    "trained_weights = estimator_classifier.weights\n",
    "\n",
    "# get Local Effective Dimension for set of trained weights\n",
    "local_ed_trained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=trained_weights, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_trained = local_ed_trained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for trained QNN: \",\n",
    "    local_eff_dim_trained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.4 Compute Local Effective Dimension of untrained QNN\n",
    "\n",
    "We can compare this result with the effective dimension of the untrained network, using the `initial_point` as our weight sample:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for untrained QNN:  [0.95127558 0.95416801 0.95552888 0.96312205 0.96500102 0.96715462\n",
      " 0.96870756 0.96973248 0.97262304 0.97448753]\n"
     ]
    }
   ],
   "source": [
    "# get Local Effective Dimension for set of untrained weights\n",
    "local_ed_untrained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=initial_point, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_untrained = local_ed_untrained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for untrained QNN: \",\n",
    "    local_eff_dim_untrained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 4.5 Plot and analyze results\n",
    "\n",
    "If we plot the effective dimension values before and after training, we can see the following result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(local_eff_dim_trained) / estimator_qnn.num_weights, label=\"trained weights\")\n",
    "plt.plot(\n",
    "    n, np.array(local_eff_dim_untrained) / estimator_qnn.num_weights, label=\"untrained weights\"\n",
    ")\n",
    "\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized LOCAL effective dimension\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In general, we should expect the value of the local effective dimension to decrease after training. This can be understood by looking back into the main goal of machine learning, which is to pick a model that is expressive enough to fit your data, but not too expressive that it overfits and performs badly on new data samples.  \n",
    "\n",
    "Certain optimizers help regularize the overfitting of a model by learning parameters, and this action of learning inherently reduces a model’s expressiveness, as measured by the local effective dimension. Following this logic, a randomly initialized parameter set will most likely produce a higher effective dimension that the final set of trained weights, because that model with that particular parameterization is “using more parameters” unnecessarily to fit the data. After training (with the implicit regularization), a trained model will not need to use so many parameters and thus have more “inactive parameters” and a lower effective dimension. \n",
    "\n",
    "We must keep in mind though that this is the general intuition, and there might be cases where a randomly selected set of weights happens to provide a lower effective dimension than the trained weights for a specific model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>0.44.1</td></tr><tr><td><code>qiskit-terra</code></td><td>0.25.1</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.6.1</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.10.8</td></tr><tr><td>Python compiler</td><td>GCC 10.4.0</td></tr><tr><td>Python build</td><td>main, Nov 22 2022 08:26:04</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>8</td></tr><tr><td>Memory (Gb)</td><td>31.142810821533203</td></tr><tr><td colspan='2'>Wed Nov 22 16:24:37 2023 UTC</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2023.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import qiskit.tools.jupyter\n",
    "\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "159ca993f1e44321a6ffe2a1f903d478": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_d1c2e67401274d1ba51a397dd453d50a",
       "style": "IPY_MODEL_c2d26b3097e54a5289fb343dd71f1d29",
       "value": "<h5>Backend</h5>"
      }
     },
     "1b1c5e503b1741d8b240a7927ba6e4b8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "primary",
       "description": "Clear",
       "layout": "IPY_MODEL_460ee332bb264b6cadb1a8d566040e0d",
       "style": "IPY_MODEL_2c318bb3218e46a1ad62991dc494bba3",
       "tooltip": null
      }
     },
     "1d19cae8780148a2bb42eb36aad48f66": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "2c318bb3218e46a1ad62991dc494bba3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "3676eac2ba70483281dda9f609b81569": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "190px"
      }
     },
     "3a9b35f41e83492598aee3de3b4dbe19": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_e7d72758712747cba401811295b395d5",
        "IPY_MODEL_159ca993f1e44321a6ffe2a1f903d478",
        "IPY_MODEL_6d5a2aa75c8a4a908f4c83c48170286b",
        "IPY_MODEL_972dfb825aef4d1c837481d37d98e876",
        "IPY_MODEL_847a80dd9876476685d0ea7e7c0e6c64"
       ],
       "layout": "IPY_MODEL_c0bdc0067b194444863aa19eddf87583"
      }
     },
     "3d08504864874aa4a19692228bd53dfb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "460ee332bb264b6cadb1a8d566040e0d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_area": "right",
       "padding": "0px 0px 0px 0px",
       "width": "70px"
      }
     },
     "48a384f425ca471b99505b62f89585a8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "70px"
      }
     },
     "5cd31b8569c34ddbbfc37a4ae330f507": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "95px"
      }
     },
     "68b84af374fd4353930915a686e5bb81": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "6a8a5d4afca94bd193d9394561d9e103": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "GridBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_1b1c5e503b1741d8b240a7927ba6e4b8"
       ],
       "layout": "IPY_MODEL_87a91947cee14960bba43fc8f09734ee"
      }
     },
     "6d5a2aa75c8a4a908f4c83c48170286b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_5cd31b8569c34ddbbfc37a4ae330f507",
       "style": "IPY_MODEL_92c2524d44e7409db6acc2bed449dae8",
       "value": "<h5>Status</h5>"
      }
     },
     "7ab2fdf3a7bf49338e88d2d119e82c40": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 10px 0px"
      }
     },
     "847a80dd9876476685d0ea7e7c0e6c64": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_df630174e7144f17a6a2896ae76112c3",
       "style": "IPY_MODEL_68b84af374fd4353930915a686e5bb81",
       "value": "<h5>Message</h5>"
      }
     },
     "87a91947cee14960bba43fc8f09734ee": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_template_areas": "\n                                       \". . . . right \"\n                                        ",
       "grid_template_columns": "20% 20% 20% 20% 20%",
       "width": "100%"
      }
     },
     "92c2524d44e7409db6acc2bed449dae8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "972dfb825aef4d1c837481d37d98e876": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_48a384f425ca471b99505b62f89585a8",
       "style": "IPY_MODEL_dd4be2bf681e4e0e915d2de84ff20af9",
       "value": "<h5>Queue</h5>"
      }
     },
     "a4e5fa8f87be4f64b0d044706f69e387": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_7ab2fdf3a7bf49338e88d2d119e82c40",
       "style": "IPY_MODEL_1d19cae8780148a2bb42eb36aad48f66",
       "value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
      }
     },
     "c0bdc0067b194444863aa19eddf87583": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 0px 37px",
       "width": "600px"
      }
     },
     "c2d26b3097e54a5289fb343dd71f1d29": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "d1c2e67401274d1ba51a397dd453d50a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "145px"
      }
     },
     "dd4be2bf681e4e0e915d2de84ff20af9": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "df630174e7144f17a6a2896ae76112c3": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e7d72758712747cba401811295b395d5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_3676eac2ba70483281dda9f609b81569",
       "style": "IPY_MODEL_3d08504864874aa4a19692228bd53dfb",
       "value": "<h5>Job ID</h5>"
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}