[404218]: / Code / PennyLane / Quantum Parameters II / CZ 4Layers DiffAdjoint A100 Lightning.gpu Kernel 59.46s kkawchak.ipynb

Download this file

1278 lines (1278 with data), 138.9 kB

{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 178,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "U9bYOT8V3fHC",
        "outputId": "7356506b-5e5d-43a8-988b-80cbdd2aa51f"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since beginning of run: 1699853243.785997\n",
            "Mon Nov 13 05:27:23 2023\n"
          ]
        }
      ],
      "source": [
        "# This cell is added by sphinx-gallery\n",
        "# It can be customized to whatever you like\n",
        "%matplotlib inline\n",
        "# !pip install pennylane custatevec-cu11 pennylane-lightning-gpu\n",
        "import time\n",
        "seconds = time.time()\n",
        "print(\"Time in seconds since beginning of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1wO15tC53fHE"
      },
      "source": [
        "::: {#kernel_based_training}\n",
        ":::\n",
        "\n",
        "Kernel-based training of quantum models with scikit-learn\n",
        "=========================================================\n",
        "\n",
        "::: {.meta}\n",
        ":property=\\\"og:description\\\": Train a quantum machine learning model\n",
        "based on the idea of quantum kernels. :property=\\\"og:image\\\":\n",
        "<https://pennylane.ai/qml/_images/kernel_based_scaling.png>\n",
        ":::\n",
        "\n",
        "::: {.related}\n",
        "tutorial\\_variational\\_classifier Variational classifier\n",
        ":::\n",
        "\n",
        "*Author: Maria Schuld --- Posted: 03 February 2021. Last updated: 3\n",
        "February 2021.*\n",
        "\n",
        "Over the last few years, quantum machine learning research has provided\n",
        "a lot of insights on how we can understand and train quantum circuits as\n",
        "machine learning models. While many connections to neural networks have\n",
        "been made, it becomes increasingly clear that their mathematical\n",
        "foundation is intimately related to so-called *kernel methods*, the most\n",
        "famous of which is the [support vector machine\n",
        "(SVM)](https://en.wikipedia.org/wiki/Support-vector_machine) (see for\n",
        "example [Schuld and Killoran (2018)](https://arxiv.org/abs/1803.07128),\n",
        "[Havlicek et al. (2018)](https://arxiv.org/abs/1804.11326), [Liu et al.\n",
        "(2020)](https://arxiv.org/abs/2010.02174), [Huang et al.\n",
        "(2020)](https://arxiv.org/pdf/2011.01938), and, for a systematic summary\n",
        "which we will follow here, [Schuld\n",
        "(2021)](https://arxiv.org/abs/2101.11020)).\n",
        "\n",
        "The link between quantum models and kernel methods has important\n",
        "practical implications: we can replace the common [variational\n",
        "approach](https://pennylane.ai/qml/glossary/variational_circuit.html) to\n",
        "quantum machine learning with a classical kernel method where the\n",
        "kernel---a small building block of the overall algorithm---is computed\n",
        "by a quantum device. In many situations there are guarantees that we get\n",
        "better or at least equally good results.\n",
        "\n",
        "This demonstration explores how kernel-based training compares with\n",
        "[variational\n",
        "training](https://pennylane.ai/qml/demos/tutorial_variational_classifier.html)\n",
        "in terms of the number of quantum circuits that have to be evaluated.\n",
        "For this we train a quantum machine learning model with a kernel-based\n",
        "approach using a combination of PennyLane and the\n",
        "[scikit-learn](https://scikit-learn.org/) machine learning library. We\n",
        "compare this strategy with a variational quantum circuit trained via\n",
        "stochastic gradient descent using\n",
        "[PyTorch](https://pennylane.readthedocs.io/en/stable/introduction/interfaces/torch.html).\n",
        "\n",
        "We will see that in a typical small-scale example, kernel-based training\n",
        "requires only a fraction of the number of quantum circuit evaluations\n",
        "used by variational circuit training, while each evaluation runs a much\n",
        "shorter circuit. In general, the relative efficiency of kernel-based\n",
        "methods compared to variational circuits depends on the number of\n",
        "parameters used in the variational model.\n",
        "\n",
        "![](../demonstrations/kernel_based_training/scaling.png){.align-center}\n",
        "\n",
        "If the number of variational parameters remains small, e.g., there is a\n",
        "square-root-like scaling with the number of data samples (green line),\n",
        "variational circuits are almost as efficient as neural networks (blue\n",
        "line), and require much fewer circuit evaluations than the quadratic\n",
        "scaling of kernel methods (red line). However, with current\n",
        "hardware-compatible training strategies, kernel methods scale much\n",
        "better than variational circuits that require a number of parameters of\n",
        "the order of the training set size (orange line).\n",
        "\n",
        "In conclusion, **for quantum machine learning applications with many\n",
        "parameters, kernel-based training can be a great alternative to the\n",
        "variational approach to quantum machine learning**.\n",
        "\n",
        "After working through this demo, you will:\n",
        "\n",
        "-   be able to use a support vector machine with a quantum kernel\n",
        "    computed with PennyLane, and\n",
        "-   be able to compare the scaling of quantum circuit evaluations\n",
        "    required in kernel-based versus variational training.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "e-EHd-BN3fHG"
      },
      "source": [
        "Background\n",
        "==========\n",
        "\n",
        "Let us consider a *quantum model* of the form\n",
        "\n",
        "$$f(x) = \\langle \\phi(x) | \\mathcal{M} | \\phi(x)\\rangle,$$\n",
        "\n",
        "where $| \\phi(x)\\rangle$ is prepared by a fixed [embedding\n",
        "circuit](https://pennylane.ai/qml/glossary/quantum_embedding.html) that\n",
        "encodes data inputs $x$, and $\\mathcal{M}$ is an arbitrary observable.\n",
        "This model includes variational quantum machine learning models, since\n",
        "the observable can effectively be implemented by a simple measurement\n",
        "that is preceded by a variational circuit:\n",
        "\n",
        "![](../demonstrations/kernel_based_training/quantum_model.png){.align-center}\n",
        "\n",
        "|\n",
        "\n",
        "For example, applying a circuit $G(\\theta)$ and then measuring the\n",
        "Pauli-Z observable $\\sigma^0_z$ of the first qubit implements the\n",
        "trainable measurement\n",
        "$\\mathcal{M}(\\theta) = G^{\\dagger}(\\theta) \\sigma^0_z G(\\theta)$.\n",
        "\n",
        "The main practical consequence of approaching quantum machine learning\n",
        "with a kernel approach is that instead of training $f$ variationally, we\n",
        "can often train an equivalent classical kernel method with a kernel\n",
        "executed on a quantum device. This *quantum kernel* is given by the\n",
        "mutual overlap of two data-encoding quantum states,\n",
        "\n",
        "$$\\kappa(x, x') = | \\langle \\phi(x') | \\phi(x)\\rangle|^2.$$\n",
        "\n",
        "Kernel-based training therefore bypasses the processing and measurement\n",
        "parts of common variational circuits, and only depends on the data\n",
        "encoding.\n",
        "\n",
        "If the loss function $L$ is the [hinge\n",
        "loss](https://en.wikipedia.org/wiki/Hinge_loss), the kernel method\n",
        "corresponds to a standard [support vector\n",
        "machine](https://en.wikipedia.org/wiki/Support-vector_machine) (SVM) in\n",
        "the sense of a maximum-margin classifier. Other convex loss functions\n",
        "lead to more general variations of support vector machines.\n",
        "\n",
        "::: {.note}\n",
        "::: {.title}\n",
        "Note\n",
        ":::\n",
        "\n",
        "More precisely, we can replace variational with kernel-based training if\n",
        "the optimisation problem can be written as minimizing a cost of the form\n",
        "\n",
        "$$\\min_f  \\lambda\\;  \\mathrm{tr}\\{\\mathcal{M}^2\\} + \\frac{1}{M}\\sum_{m=1}^M L(f(x^m), y^m),$$\n",
        "\n",
        "which is a regularized empirical risk with training data samples\n",
        "$(x^m, y^m)_{m=1\\dots M}$, regularization strength\n",
        "$\\lambda \\in \\mathbb{R}$, and loss function $L$.\n",
        "\n",
        "Theory predicts that kernel-based training will always find better or\n",
        "equally good minima of this risk. However, to show this here we would\n",
        "have to either regularize the variational training by the trace of the\n",
        "squared observable, or switch off regularization in the classical SVM,\n",
        "which removes a lot of its strength. The kernel-based and the\n",
        "variational training in this demonstration therefore optimize slightly\n",
        "different cost functions, and it is out of our scope to establish\n",
        "whether one training method finds a better minimum than the other.\n",
        ":::\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a9S8DPih3fHG"
      },
      "source": [
        "Kernel-based training\n",
        "=====================\n",
        "\n",
        "First, we will turn to kernel-based training of quantum models. As\n",
        "stated above, an example implementation is a standard support vector\n",
        "machine with a kernel computed by a quantum circuit.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-EVcxqDw3fHH"
      },
      "source": [
        "We begin by importing all sorts of useful methods:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 179,
      "metadata": {
        "id": "NM4EoXYV3fHH"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import torch\n",
        "from torch.nn.functional import relu\n",
        "\n",
        "from sklearn.svm import SVC\n",
        "from sklearn.datasets import load_iris\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "import pennylane as qml\n",
        "from pennylane.templates import AngleEmbedding, StronglyEntanglingLayers\n",
        "from pennylane.operation import Tensor\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "np.random.seed(42)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uPSsNb3A3fHH"
      },
      "source": [
        "The second step is to define a data set. Since the performance of the\n",
        "models is not the focus of this demo, we can just use the first two\n",
        "classes of the famous [Iris data\n",
        "set](https://en.wikipedia.org/wiki/Iris_flower_data_set). Dating back to\n",
        "as far as 1936, this toy data set consists of 100 samples of four\n",
        "features each, and gives rise to a very simple classification problem.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 180,
      "metadata": {
        "id": "RxclQl753fHH"
      },
      "outputs": [],
      "source": [
        "X, y = load_iris(return_X_y=True)\n",
        "\n",
        "# pick inputs and labels from the first two classes only,\n",
        "# corresponding to the first 100 samples\n",
        "X = X[:100]\n",
        "y = y[:100]\n",
        "\n",
        "# scaling the inputs is important since the embedding we use is periodic\n",
        "scaler = StandardScaler().fit(X)\n",
        "X_scaled = scaler.transform(X)\n",
        "\n",
        "# scaling the labels to -1, 1 is important for the SVM and the\n",
        "# definition of a hinge loss\n",
        "y_scaled = 2 * (y - 0.5)\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4ir_h10o3fHI"
      },
      "source": [
        "We use the [angle-embedding\n",
        "template](https://pennylane.readthedocs.io/en/stable/code/api/pennylane.templates.embeddings.AngleEmbedding.html)\n",
        "which needs as many qubits as there are features:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 181,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "_PetxK4z3fHI",
        "outputId": "71454acc-47a8-456d-f09f-451a6e0c70ed"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "4"
            ]
          },
          "metadata": {},
          "execution_count": 181
        }
      ],
      "source": [
        "n_qubits = len(X_train[0])\n",
        "n_qubits"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lyB-seGk3fHI"
      },
      "source": [
        "To implement the kernel we could prepare the two states\n",
        "$| \\phi(x) \\rangle$, $| \\phi(x') \\rangle$ on different sets of qubits\n",
        "with angle-embedding routines $S(x), S(x')$, and measure their overlap\n",
        "with a small routine called a [SWAP\n",
        "test](https://en.wikipedia.org/wiki/Swap_test).\n",
        "\n",
        "However, we need only half the number of qubits if we prepare\n",
        "$| \\phi(x)\\rangle$ and then apply the inverse embedding with $x'$ on the\n",
        "same qubits. We then measure the projector onto the initial state\n",
        "$|0..0\\rangle \\langle 0..0|$.\n",
        "\n",
        "![](../demonstrations/kernel_based_training/kernel_circuit.png){.align-center}\n",
        "\n",
        "To verify that this gives us the kernel:\n",
        "\n",
        "$$\\begin{aligned}\n",
        "\\begin{align*}\n",
        "    \\langle 0..0 |S(x') S(x)^{\\dagger} \\mathcal{M} S(x')^{\\dagger} S(x)  | 0..0\\rangle &= \\langle 0..0 |S(x') S(x)^{\\dagger} |0..0\\rangle \\langle 0..0| S(x')^{\\dagger} S(x)  | 0..0\\rangle  \\\\\n",
        "    &= |\\langle 0..0| S(x')^{\\dagger} S(x)  | 0..0\\rangle |^2\\\\\n",
        "    &= | \\langle \\phi(x') | \\phi(x)\\rangle|^2 \\\\\n",
        "    &= \\kappa(x, x').\n",
        "\\end{align*}\n",
        "\\end{aligned}$$\n",
        "\n",
        "Note that a projector $|0..0 \\rangle \\langle 0..0|$ can be constructed\n",
        "using the `qml.Hermitian` observable in PennyLane.\n",
        "\n",
        "Altogether, we use the following quantum node as a *quantum kernel\n",
        "evaluator*:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 182,
      "metadata": {
        "id": "mIbEaOoy3fHI"
      },
      "outputs": [],
      "source": [
        "dev_kernel = qml.device(\"lightning.gpu\", wires=n_qubits)\n",
        "\n",
        "projector = np.zeros((2**n_qubits, 2**n_qubits))\n",
        "projector[0, 0] = 1\n",
        "\n",
        "@qml.qnode(dev_kernel, interface=\"autograd\", diff_method=\"adjoint\")\n",
        "def kernel(x1, x2):\n",
        "    \"\"\"The quantum kernel.\"\"\"\n",
        "    AngleEmbedding(x1, wires=range(n_qubits))\n",
        "    qml.adjoint(AngleEmbedding)(x2, wires=range(n_qubits))\n",
        "    return qml.expval(qml.Hermitian(projector, wires=range(n_qubits)))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "U6aPSXgH3fHI"
      },
      "source": [
        "A good sanity check is whether evaluating the kernel of a data point and\n",
        "itself returns 1:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 183,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "q9TzLmmP3fHI",
        "outputId": "f5cd1dac-9f2b-4a71-db67-0675836b51b4"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array(1.)"
            ]
          },
          "metadata": {},
          "execution_count": 183
        }
      ],
      "source": [
        "kernel(X_train[0], X_train[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XsItzCZ73fHI"
      },
      "source": [
        "The way an SVM with a custom kernel is implemented in scikit-learn\n",
        "requires us to pass a function that computes a matrix of kernel\n",
        "evaluations for samples in two different datasets A, B. If A=B, this is\n",
        "the [Gram matrix](https://en.wikipedia.org/wiki/Gramian_matrix).\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 184,
      "metadata": {
        "id": "ktqS-uFf3fHI"
      },
      "outputs": [],
      "source": [
        "def kernel_matrix(A, B):\n",
        "    \"\"\"Compute the matrix whose entries are the kernel\n",
        "       evaluated on pairwise data from sets A and B.\"\"\"\n",
        "    return np.array([[kernel(a, b) for b in B] for a in A])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "z2q2cVnO3fHJ"
      },
      "source": [
        "Training the SVM optimizes internal parameters that basically weigh\n",
        "kernel functions. It is a breeze in scikit-learn, which is designed as a\n",
        "high-level machine learning library:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 185,
      "metadata": {
        "id": "c-28Bjs33fHJ"
      },
      "outputs": [],
      "source": [
        "svm = SVC(kernel=kernel_matrix).fit(X_train, y_train)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LdqczWbW3fHJ"
      },
      "source": [
        "Let's compute the accuracy on the test set.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 186,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "TiO_t3bQ3fHJ",
        "outputId": "3e004608-494a-4f21-c154-a7680270ccd3"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "1.0"
            ]
          },
          "metadata": {},
          "execution_count": 186
        }
      ],
      "source": [
        "predictions = svm.predict(X_test)\n",
        "accuracy_score(predictions, y_test)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oKR_CF363fHJ"
      },
      "source": [
        "The SVM predicted all test points correctly. How many times was the\n",
        "quantum device evaluated?\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 187,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "4TWrXNDn3fHJ",
        "outputId": "5e603c11-bda6-47be-c5b6-676b3244119e"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "7501"
            ]
          },
          "metadata": {},
          "execution_count": 187
        }
      ],
      "source": [
        "dev_kernel.num_executions"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Pp30o1Sl3fHJ"
      },
      "source": [
        "This number can be derived as follows: For $M$ training samples, the SVM\n",
        "must construct the $M \\times M$ dimensional kernel gram matrix for\n",
        "training. To classify $M_{\\rm pred}$ new samples, the SVM needs to\n",
        "evaluate the kernel at most $M_{\\rm pred}M$ times to get the pairwise\n",
        "distances between training vectors and test samples.\n",
        "\n",
        "::: {.note}\n",
        "::: {.title}\n",
        "Note\n",
        ":::\n",
        "\n",
        "Depending on the implementation of the SVM, only $S \\leq M_{\\rm pred}$\n",
        "*support vectors* are needed.\n",
        ":::\n",
        "\n",
        "Let us formulate this as a function, which can be used at the end of the\n",
        "demo to construct the scaling plot shown in the introduction.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 188,
      "metadata": {
        "id": "zI2lIUTV3fHJ"
      },
      "outputs": [],
      "source": [
        "def circuit_evals_kernel(n_data, split):\n",
        "    \"\"\"Compute how many circuit evaluations one needs for kernel-based\n",
        "       training and prediction.\"\"\"\n",
        "\n",
        "    M = int(np.ceil(split * n_data))\n",
        "    Mpred = n_data - M\n",
        "\n",
        "    n_training = M * M\n",
        "    n_prediction = M * Mpred\n",
        "\n",
        "    return n_training + n_prediction"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "x0ayC5We3fHJ"
      },
      "source": [
        "With $M = 75$ and $M_{\\rm pred} = 25$, the number of kernel evaluations\n",
        "can therefore be estimated as:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 189,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "0aoJPwOj3fHJ",
        "outputId": "bdde56e6-acbe-4559-91c9-671cec655395"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "7500"
            ]
          },
          "metadata": {},
          "execution_count": 189
        }
      ],
      "source": [
        "circuit_evals_kernel(n_data=len(X), split=len(X_train) /(len(X_train) + len(X_test)))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dRDQOR7K3fHJ"
      },
      "source": [
        "The single additional evaluation can be attributed to evaluating the\n",
        "kernel once above as a sanity check.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "b8IBcump3fHJ"
      },
      "source": [
        "A similar example using variational training\n",
        "============================================\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rl4V3vyC3fHJ"
      },
      "source": [
        "Using the variational principle of training, we can propose an *ansatz*\n",
        "for the variational circuit and train it directly. By increasing the\n",
        "number of layers of the ansatz, its expressivity increases. Depending on\n",
        "the ansatz, we may only search through a subspace of all measurements\n",
        "for the best candidate.\n",
        "\n",
        "Remember from above, the variational training does not optimize\n",
        "*exactly* the same cost as the SVM, but we try to match them as closely\n",
        "as possible. For this we use a bias term in the quantum model, and train\n",
        "on the hinge loss.\n",
        "\n",
        "We also explicitly use the\n",
        "[parameter-shift](https://pennylane.ai/qml/glossary/parameter_shift.html)\n",
        "differentiation method in the quantum node, since this is a method which\n",
        "works on hardware as well. While `diff_method='backprop'` or\n",
        "`diff_method='adjoint'` would reduce the number of circuit evaluations\n",
        "significantly, they are based on tricks that are only suitable for\n",
        "simulators, and can therefore not scale to more than a few dozen qubits.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 190,
      "metadata": {
        "id": "3Givezqc3fHJ"
      },
      "outputs": [],
      "source": [
        "dev_var = qml.device(\"lightning.gpu\", wires=n_qubits)\n",
        "\n",
        "@qml.qnode(dev_var, interface=\"torch\", diff_method=\"adjoint\")\n",
        "def quantum_model(x, params):\n",
        "    \"\"\"A variational quantum model.\"\"\"\n",
        "\n",
        "    # embedding\n",
        "    AngleEmbedding(x, wires=range(n_qubits))\n",
        "\n",
        "    # trainable measurement\n",
        "    StronglyEntanglingLayers(params, wires=range(n_qubits), imprimitive=qml.ops.CZ)\n",
        "    return qml.expval(qml.PauliZ(0))\n",
        "\n",
        "def quantum_model_plus_bias(x, params, bias):\n",
        "    \"\"\"Adding a bias.\"\"\"\n",
        "    return quantum_model(x, params) + bias\n",
        "\n",
        "def hinge_loss(predictions, targets):\n",
        "    \"\"\"Implements the hinge loss.\"\"\"\n",
        "    all_ones = torch.ones_like(targets)\n",
        "    hinge_loss = all_ones - predictions * targets\n",
        "    # trick: since the max(0,x) function is not differentiable,\n",
        "    # use the mathematically equivalent relu instead\n",
        "    hinge_loss = relu(hinge_loss)\n",
        "    return hinge_loss"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mIsEpYgJ3fHJ"
      },
      "source": [
        "We now summarize the usual training and prediction steps into two\n",
        "functions similar to scikit-learn\\'s `fit()` and `predict()`. While it\n",
        "feels cumbersome compared to the one-liner used to train the kernel\n",
        "method, PennyLane---like other differentiable programming\n",
        "libraries---provides a lot more control over the particulars of\n",
        "training.\n",
        "\n",
        "In our case, most of the work is to convert between numpy and torch,\n",
        "which we need for the differentiable `relu` function used in the hinge\n",
        "loss.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 191,
      "metadata": {
        "id": "EFIiA8SW3fHK"
      },
      "outputs": [],
      "source": [
        "def quantum_model_train(n_layers, steps, batch_size):\n",
        "    \"\"\"Train the quantum model defined above.\"\"\"\n",
        "\n",
        "    params = np.random.random((n_layers, n_qubits, 3))\n",
        "    params_torch = torch.tensor(params, requires_grad=True)\n",
        "    bias_torch = torch.tensor(0.0)\n",
        "\n",
        "    opt = torch.optim.Adam([params_torch, bias_torch], lr=0.1)\n",
        "\n",
        "    loss_history = []\n",
        "    for i in range(steps):\n",
        "\n",
        "        batch_ids = np.random.choice(len(X_train), batch_size)\n",
        "\n",
        "        X_batch = X_train[batch_ids]\n",
        "        y_batch = y_train[batch_ids]\n",
        "\n",
        "        X_batch_torch = torch.tensor(X_batch, requires_grad=False)\n",
        "        y_batch_torch = torch.tensor(y_batch, requires_grad=False)\n",
        "\n",
        "        def closure():\n",
        "            opt.zero_grad()\n",
        "            preds = torch.stack(\n",
        "                [quantum_model_plus_bias(x, params_torch, bias_torch) for x in X_batch_torch]\n",
        "            )\n",
        "            loss = torch.mean(hinge_loss(preds, y_batch_torch))\n",
        "\n",
        "            # bookkeeping\n",
        "            current_loss = loss.detach().numpy().item()\n",
        "            loss_history.append(current_loss)\n",
        "            if i % 10 == 0:\n",
        "                print(\"step\", i, \", loss\", current_loss)\n",
        "\n",
        "            loss.backward()\n",
        "            return loss\n",
        "\n",
        "        opt.step(closure)\n",
        "\n",
        "    return params_torch, bias_torch, loss_history\n",
        "\n",
        "\n",
        "def quantum_model_predict(X_pred, trained_params, trained_bias):\n",
        "    \"\"\"Predict using the quantum model defined above.\"\"\"\n",
        "\n",
        "    p = []\n",
        "    for x in X_pred:\n",
        "\n",
        "        x_torch = torch.tensor(x)\n",
        "        pred_torch = quantum_model_plus_bias(x_torch, trained_params, trained_bias)\n",
        "        pred = pred_torch.detach().numpy().item()\n",
        "        if pred > 0:\n",
        "            pred = 1\n",
        "        else:\n",
        "            pred = -1\n",
        "\n",
        "        p.append(pred)\n",
        "    return p"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HZ4ANAAf3fHK"
      },
      "source": [
        "Let's train the variational model and see how well we are doing on the\n",
        "test set.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 192,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 657
        },
        "id": "4Orrciwd3fHK",
        "outputId": "220febfb-929d-4f7f-a518-873944dbb039"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "step 0 , loss 1.3614655100943747\n",
            "step 10 , loss 0.3888180789938513\n",
            "step 20 , loss 0.3928383662576261\n",
            "step 30 , loss 0.34405895915223705\n",
            "step 40 , loss 0.5920282513582316\n",
            "step 50 , loss 0.469484703984948\n",
            "step 60 , loss 0.24304615122059015\n",
            "step 70 , loss 0.2590769640788991\n",
            "step 80 , loss 0.4388514321459348\n",
            "step 90 , loss 0.22380643225019928\n",
            "accuracy on test set: 1.0\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAG2CAYAAACDLKdOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB7aUlEQVR4nO3dd3xb9bk/8M/RlveK7dhx4izIJAkJCWZTAoFyaSkdFGihKaUXCr1AeltIKaS0hdDFj95e2hRoaHsLBVpGB5QVCDMQyIDsQYadxNvxtjXP7w/pe3QkS7L2OZI/79crr1ciy/aJPPToeZ7v80iyLMsgIiIiyhEGrS+AiIiIKJUY3BAREVFOYXBDREREOYXBDREREeUUBjdERESUUxjcEBERUU5hcENEREQ5hcENERER5RQGN0RERJRTGNwQERFRTtE0uHnzzTdxySWXoKamBpIk4bnnnhv1fdavX4+TTz4ZVqsV06ZNwx/+8Ie0XycRERFlD02Dm4GBAcybNw8PPvhgTPc/ePAgLr74Ypx77rnYunUrbrnlFnzjG9/ASy+9lOYrJSIiomwh6WVxpiRJePbZZ3HppZdGvM9tt92G559/Htu3b1du+/KXv4zu7m68+OKLGbhKIiIi0juT1hcQjw0bNmDp0qVBty1btgy33HJLxPdxOBxwOBzKv71eL7q6ulBeXg5JktJ1qURERJRCsiyjr68PNTU1MBiiF56yKrhpaWlBVVVV0G1VVVXo7e3F0NAQ7Hb7iPdZvXo17r777kxdIhEREaVRU1MTJkyYEPU+WRXcJGLlypVYsWKF8u+enh5MnDgRTU1NKCoqyvj1nP2z19E54MRT/3kqZtUUZ/zzExERZaPe3l7U1dWhsLBw1PtmVXBTXV2N1tbWoNtaW1tRVFQUNmsDAFarFVardcTtRUVFmgQ3k8ZX4HhTN467TJp8fiIiomwWS0tJVs25aWhowLp164Jue+WVV9DQ0KDRFcWvriwPAHDk+JDGV0JERJSbNA1u+vv7sXXrVmzduhWA76j31q1b0djYCMBXUrr66quV+19//fU4cOAAvve972H37t34zW9+g6eeegq33nqrFpefkAmlvgxT0/FBja+EiIgoN2ka3Hz44YdYsGABFixYAABYsWIFFixYgLvuugsA0NzcrAQ6ADB58mQ8//zzeOWVVzBv3jz88pe/xCOPPIJly5Zpcv2JqCtl5oaIiCidNO25OeeccxBtzE646cPnnHMOtmzZksarSi8lc9PFzA0REVE6ZFXPTS5Q99zoZH4iERFRTmFwk2E1JTZIEjDk8qBzwKn15RAREeUcBjcZZjUZUVVoA8C+GyIionRgcKMB9t0QERGlD4MbDXDWDRERUfowuNEAZ90QERGlD4MbDXDWDRERUfowuNGAyNwcYc8NERFRyjG40YDSc9M9BK+Xs26IiIhSicGNBqqLbTBIgNPtRXu/Q+vLISIiyikMbjRgNhowvthfmmJTMRERUUoxuNFIYNYNm4qJiIhSicGNRgKzbpi5ISIiSiUGNxph5oaIiCg9GNxoRJl1083MDRERUSoxuNEIMzdERETpweBGI6Ln5lj3EDycdUNERJQyDG40UlVkg9kowe2V0dI7rPXlEBER5QwGNxoxGiTUlHANAxERUaoxuNFQYDs4+26IiIhShcGNhgLbwZm5ISIiShUGNxriiSkiIqLUY3CjIU4pJiIiSj0GNxoSmZsj7LkhIiJKGQY3GhI9N809Q3B5vBpfDRERUW5gcKOhigIrLCYDvDLQ3M1ZN0RERKnA4EZDBoOkKk2x74aIiCgVGNxobIK/NNXE4IaIiCglGNxorM6fuTnKpmIiIqKUYHCjsWK7GQDQ53BrfCVERES5gcGNxuxmIwBg2OXR+EqIiIhyA4MbjdktvuBmyMnghoiIKBUY3GhMBDeDDG6IiIhSgsGNxkRZaohlKSIiopRgcKMx9twQERGlFoMbjdlYliIiIkopBjcay2NZioiIKKUY3GhMNBQPM3NDRESUEgxuNMaGYiIiotRicKMxHgUnIiJKLQY3GhOZG4fbC69X1vhqiIiIsh+DG42JzA0ADLuZvSEiIkoWgxuN2UyB4IalKSIiouQxuNGYwSDBZvZ9GbhfioiIKHkMbnSAU4qJiIhSh8GNDvA4OBERUeowuNEBHgcnIiJKHQY3OiCCG2ZuiIiIksfgRgeUnhtmboiIiJLG4EYHbGaWpYiIiFKFwY0O5LEsRURElDIMbnSAR8GJiIhSh8GNDvC0FBERUeowuNEBu9kEgGUpIiKiVGBwowN2C9cvEBERpQqDGx1gzw0REVHqMLjRAbvFV5Zizw0REVHyGNzoAHdLERERpQ6DGx0QPTcsSxERESWPwY0O2DmhmIiIKGUY3OiA6LnhaSkiIqLkMbjRAZ6WIiIiSh0GNzrAhmIiIqLU0Ty4efDBB1FfXw+bzYYlS5Zg48aNUe//wAMP4MQTT4TdbkddXR1uvfVWDA8PZ+hq04PrF4iIiFJH0+DmySefxIoVK7Bq1Sps3rwZ8+bNw7Jly9DW1hb2/o8//jhuv/12rFq1Crt27cLvf/97PPnkk/j+97+f4StPLTu3ghMREaWMpsHN/fffj+uuuw7Lly/HrFmzsGbNGuTl5WHt2rVh7//uu+/i9NNPx5VXXon6+npccMEFuOKKK0bN9uidKEs53V54vLLGV0NERJTdNAtunE4nNm3ahKVLlwYuxmDA0qVLsWHDhrDvc9ppp2HTpk1KMHPgwAG88MIL+PSnPx3x8zgcDvT29gb90RsR3ADM3hARESXLpNUn7ujogMfjQVVVVdDtVVVV2L17d9j3ufLKK9HR0YEzzjgDsizD7Xbj+uuvj1qWWr16Ne6+++6UXnuq2cyBGHPI6UGBVbMvCxERUdbTvKE4HuvXr8e9996L3/zmN9i8eTOeeeYZPP/88/jxj38c8X1WrlyJnp4e5U9TU1MGrzg2kiTxODgREVGKaJYiqKiogNFoRGtra9Dtra2tqK6uDvs+d955J7761a/iG9/4BgBg7ty5GBgYwDe/+U3ccccdMBhGxmpWqxVWqzX1/4EUs1uMGHJ5eGKKiIgoSZplbiwWCxYuXIh169Ypt3m9Xqxbtw4NDQ1h32dwcHBEAGM0+jIespzdjbicdUNERJQamjZ3rFixAtdccw0WLVqExYsX44EHHsDAwACWL18OALj66qtRW1uL1atXAwAuueQS3H///ViwYAGWLFmC/fv3484778Qll1yiBDnZSjkOzswNERFRUjQNbi6//HK0t7fjrrvuQktLC+bPn48XX3xRaTJubGwMytT84Ac/gCRJ+MEPfoCjR49i3LhxuOSSS3DPPfdo9V9IGfbcEBERpYYkZ3s9J069vb0oLi5GT08PioqKtL4cxZfWbMDGQ1148MqTcfFJ47W+HCIiIl2J5/k7q05L5TJOKSYiIkoNBjc6wYZiIiKi1GBwoxOBhmK3xldCRESU3Rjc6EQguPFqfCVERETZjcGNTrAsRURElBoMbnSCR8GJiIhSg8GNToiy1CB7boiIiJLC4EYnAmUp9twQERElg8GNTnD9AhERUWowuNGJQOaGZSkiIqJkMLjRCWZuiIiIUoPBjU6w54aIiCg1GNzoBCcUExERpQaDG53gED8iIqLUYHCjE+y5ISIiSg0GNzoRmFDMnhsiIqJkMLjRCRHcOD1euD0McIiIiBLF4EYnRFkKYN8NERFRMhjc6ITVZIAk+f7O4IaIiChxDG50QpKkwIkpNhUTEREljMGNjuRZeByciIgoWQxudMTGzA0REVHSGNzoCAf5ERERJY/BjY5wkB8REVHyGNzoCDM3REREyWNwoyPM3BARESWPwY2OMHNDRESUPAY3OsLMDRERUfIY3OgIMzdERETJY3CjI5xQTERElDwGNzpi54RiIiKipDG40RH23BARESWPwY2OsOeGiIgoeQxudIQ9N0RERMljcKMj7LkhIiJKHoMbHWFZioiIKHkMbnSEDcVERETJY3CjI8zcEBERJY/BjY4wc0NERJQ8Bjc6wswNERFR8hjc6AgzN0RERMljcKMjeWYTAMDtleHyeDW+GiIiouzE4EZHbJbAl4OlKSIiosQwuNERi9EAg+T7O0tTREREiWFwoyOSJHEFAxERUZIY3OiM3eLru2FZioiIKDEMbnTG7u+7GWTmhoiIKCEMbnRGlKWGmbkhIiJKCIMbnVHKUszcEBERJYTBjc7Yzb4vCXtuiIiIEsPgRmd4WoqIiCg5DG50RlnBwMwNERFRQhjc6IzdzKPgREREyWBwozM8Ck5ERJQcBjc6w6PgREREyWFwozM8Ck5ERJQcBjc6o5yWYuaGiIgoIQxudEaZc8PMDRERUUIY3OhMHhdnEhERJYXBjc7YLBziR8H2tvbhzb3tWl8GEVHWYHCjM6LnZpCZG/L75p8+xDWPbsSx7iGtL4WIKCswuNEZ5Sg4MzcEQJZlHO0egiwDLb3DWl8OEVFWYHCjM1y/QGrDLi9cHhkAMOBwa3w1RETZQfPg5sEHH0R9fT1sNhuWLFmCjRs3Rr1/d3c3brzxRowfPx5WqxUnnHACXnjhhQxdbfopZSlmbghA77BL+Xv/MIMbIqJYmLT85E8++SRWrFiBNWvWYMmSJXjggQewbNky7NmzB5WVlSPu73Q6cf7556OyshJ/+9vfUFtbi8OHD6OkpCTzF58mInPDCcUEAD1DquCGmRsiophoGtzcf//9uO6667B8+XIAwJo1a/D8889j7dq1uP3220fcf+3atejq6sK7774Ls9kMAKivr8/kJaddnqosJcsyJEnS+IpIS70MboiI4qZZWcrpdGLTpk1YunRp4GIMBixduhQbNmwI+z7/+Mc/0NDQgBtvvBFVVVWYM2cO7r33Xng8kbMcDocDvb29QX/0zOYvS3m8stJrQWMXy1JERPHTLLjp6OiAx+NBVVVV0O1VVVVoaWkJ+z4HDhzA3/72N3g8Hrzwwgu488478ctf/hI/+clPIn6e1atXo7i4WPlTV1eX0v9HqomeG8A334TGtt6hQEDT72RwQ0QUC80biuPh9XpRWVmJhx56CAsXLsTll1+OO+64A2vWrIn4PitXrkRPT4/yp6mpKYNXHD+zUcLiyWUAgK/8/n181NSt7QXluNf3tOGRtw5AlvWZJdND5sbp9sLp9mryuYmIEqFZcFNRUQGj0YjW1tag21tbW1FdXR32fcaPH48TTjgBRmMguzFz5ky0tLTA6XSGfR+r1YqioqKgP3omSRIe+upCzK8rQfegC1c+/B7eO9Cp9WXlrO/+9WP85Pld+KR9QOtLCUvdc6PFUXCvV8an/+ctXPjAm/B49RkAEhGF0iy4sVgsWLhwIdatW6fc5vV6sW7dOjQ0NIR9n9NPPx379++H1xt4Fbl3716MHz8eFosl7decKSV5Fvz5G0vQMKUcA04Prlm7Ea/vbtP6snJO37ALHf0OAEBbnz4H5PWqsjVaNBT3O93Y39aPAx0D6BoI/wKCiEhvNC1LrVixAg8//DD++Mc/YteuXbjhhhswMDCgnJ66+uqrsXLlSuX+N9xwA7q6unDzzTdj7969eP7553Hvvffixhtv1Oq/kDYFVhMeXX4Kls6shMPtxXV/+hDr9zDASaUjxwPrDHoGXVHuqR31dfVpUJZST8pWl8iIiPRM06Pgl19+Odrb23HXXXehpaUF8+fPx4svvqg0GTc2NsJgCMRfdXV1eOmll3DrrbfipJNOQm1tLW6++WbcdtttWv0X0spmNuK3X1mIW57ciuc/bsaDr+/HOSeOnP+Tbl6vjGM9Q6gtsefU0fSmrkHl78d1GtyoA4oBDRqK1cMk1TN3iIj0TNPgBgBuuukm3HTTTWHftn79+hG3NTQ04L333kvzVemH2WjA9z89E89/3IxNh4+js9+B8gJrRq/hz+8fxl1/34F7PzcXVy6ZmNHPnU7qzE33kD5LLlo3FKvXgPQyuCGiLJFVp6XGqtoSO2bXFMErA+s06L1Zt8v3OR97/3DGP3c6NR0PZG70WpYKOgruyPzUanVww8wNEWULBjdZ4vxZvlLdKztbR7lnasmyjO1HewAAO4714lCHPk8VJUKduTk+mAWZG0fmg4ugnhsGN0SUJRjcZImlM33BzVv72jGUwaWarb0OdKpOyTy/rTljnzvd1D033brN3ASua9jlhduT2XkzQWUpTkgmoizB4CZLzK4pQm2JHcMuL97Z35Gxz7vjWE/Qv5//ODeCG1mWcVTdc6PD4EaW5REBxUCGS1NsKCaibMTgJktIkoSlM30npTJZmtp+1LeL69wTx8FokLCzuRcHc6A01TPkQp9qboweG4oHnB5lcJ44pNaX4dJUKhuKW3uH8W4GA3MiGrsY3GSR82f5Jjev292asWmx2/2ZmzOnj8NpU8sBAC/kQGlK3W8D6PMouAgmzEYJpXm+IZWZztwMp7Ch+OYntuDKR95XeriIiNKFwU0WWTKlDIU2Ezr6ndjadDwjn3PnMV/mZnZNES6eOx5AbpSmRL9NVZHvWH3PoEt3+6VEM3GRzYxCm29qQ6abiodSOMRvT4tvEeyBHMj8EZG+MbjJImajQRni93IGSlNdA04c7fZlOGbVFGHZ7OqcKU2JzM3c2mIAgNPjDSrB6IE4Bl5kNyPfIoKb7Oy5GXJ6lOxYl3/lBRFRujC4yTKZPBIumoknV+Sj0GZGab4Fp0+rAJD9pSkx42Z6VSEsRt+Pgd5KU6IsVWQzoUBkbjJ8YilVZanmnkAZkDuqiCjdGNxkmXNOHAezUcKB9gF80t6f1s8lmoln1QQ2qV8819f3868sL02JslRdaR6K88wAgG6dzbpRylJ2MwqsGpWlghqKEw+sjnUHFpN2MrghojRjcJNlimxmnDrF19j7apqzNyJzM6emWLntglnVMBkk7GruxYE0B1fpJMpSdWV2lCrBjV4zN+rgJrNlqdCeG2+CjezHmLkhogxicJOFMlWa2uFvJp5TG8jclOZbcFqWl6ZkWVaCmwmleSix+04i6S246VF6brQrS6kzN7IM9Ce4vLOZmRsiyiAGN1noPP+04k2NvkWa6dA37FKahmerMjcA8B/i1NS2lrR87nTrHHBiyOWBJAE1JTaU+DM3elvBEK4slenN4KHTsBPdwaXuuUnX9ywRkcDgJgvVltgxpSIfsgzsau5Ly+cQH7em2IayfEvQ2y6YXeW/Ty+OZ+GrcOUYeKENVpNRCW70NoE3XFmqT8PMDZD4cfBjPYHMDctSRJRuDG6y1KTyPADA4a70HMkWg9Zm1xaPeFtJnkWZu9Kls2xHLNT9NoDv/wPou6E4X2RuHNoGN4kGgMe6VasuhlwZG0JJRGMTg5ssNak8HwDQ2Dk4yj0TIyYTz1adlFIr0WkTbizEMfAJpb4AMVCW0tf/RZlzYzOhUGkoTjy4eWd/B256fDM64igLhZalElnBIMsymlXBjSzrrwRIRLmFwU2WEpmbQ53pydyIycRzakZmbgAoTbg9OtzJNBolc1Pqz9zotKE4XOYmmYbiNW98gn993Ix1u2JvRBeZmyJ/pi6R4+C9w24M+IOkPIsRAEtTRJReDG6ylFKWSkPmZtjlwb423zHvOWHKUkCWZ266gjM3pXqfc2MzB05LJZG5EdOm4+nbEZmb6mIbgMTKUqKZuDTPjPH+jxNP9oiIKF4JBTd/+tOf4HCM/OXkdDrxpz/9KemLotFNLPOXpboGU74TaXdLHzxeGeX5FmX3Uqgi++hNuL9/+yC+/ZctGe8TGc1RcQzc33OjDPHTWUOxOJlUHDTEL7HHUpZltPibekNLTdGIzE1VkS8oSaShWPTbjC+2ozzf9/3EzA0RpVNCwc3y5cvR0zNys29fXx+WL1+e9EXR6OrK7JAk3+6fjv7UPlGI4X2za4shSVLY+5TYR8/c/O9r+/DPj47hf17bl9LrS4bXK6vKUv6eG7v+Goq9Xhl9DtWcmyQbinuH3MqeqME4dmiJ9QvVRYlnbsR04pqSwMk7BjdElE4JBTeyLId90jty5AiKi8OXMSi1rCYjaop9mYfDKe67EWsX5kRoJgYw6vFpj1dWMiG/f+sg9ram58h6vNr7HXB6vDAaJKVEUpofCNT0shm83+mGuBR1WaovweCmuTfQ0Btr5sbl8cLl8V2EkrlJoiw1vtiOsgJfcNOZ4oCciEjNFM+dFyxYAEmSIEkSzjvvPJhMgXf3eDw4ePAgLrzwwpRfJIU3sSwPR7uHcLhzEIvqy1L2cZXMTYRmYmD0bEfPkEt5cnZ7Zfzgue148punRswEZYrotxlfbIPJvzBT/F/cXhkDTo+SJdGSCCIsJgNsZiMK/FvBnW4vnG4vLKb4Xpc0q+bMDMY4CFB9DLxqlJ6bl3e0oLFrENeeMXnE11hMJx5fYlMCK2ZuiCid4votfumllwIAtm7dimXLlqGgoEB5m8ViQX19PT7/+c+n9AIpsknledhwoBOHu1LXVOzyeLHbP8BPvXYh1Gh9KuLJy2oywCBJ2HiwC89uOYrLTp6QsmtNRGDtgl25zW4xwmoywOH24viAUyfBjTgG7nuc861G5W0DDjcsJkvY94tEvf5gMMbMzbD/fgYJGFcgTseF/3rf9vTHOD7oQsPU8hFBsdgrVVtiV4Y+ahHc3P/yHuxt7ceDV50Mo0HbIJuI0iuu3+KrVq0CANTX1+PLX/4yrNbwzaaUGRP9J6YaU1iWOnJ8CE6PF3azUelJCWe0nhsxx2R8sQ2XnzIRP31xN+59YRfOm1GlBEZaUG8DVyvJM6O114GeIRfqtLiwEIFj4L4fUZPRALvZiCGXB/0ON0rz4wtuWnriL0uJzI3dbFQayHvDnLQacLiVGUHbjvSMDG5E5qbYrmR1Mn1aqnfYhf99fT+8MrCvrQ8zqiMH7kSU/RLqufnUpz6F9vZ25d8bN27ELbfcgoceeihlF0ajq/cP8ktl5qat1/dEVFVkhSHKq1sx1TfSK3nxCr0034Jrz5iM6ZUF6Oh34ucv707ZtSZCvTBTTZSm9DJcrke1ekHIT+LE1LGe+DM3SnBjMaE4yum41t7AxxbDHwWvN3BKa3yxDeUaNRR/cLALYihyNo4vIKL4JBTcXHnllXj99dcBAC0tLVi6dCk2btyIO+64Az/60Y9SeoEU2cSy1M+6afe/oq4stEW9X8kos2FEkFCaZ4HFZMCPL50DAHjs/UZ81NSdoquNn5hOLFYvCHqb2yN6bkRQAUBZeZFIcNOiDm5iPC0lMjx2i0EJssI1FLf2BrIw2/zN6ELngBNOjxeS5JuVo9VpqQ2fdCp/19OpOCJKj4SCm+3bt2Px4sUAgKeeegpz587Fu+++i8ceewx/+MMfUnl9FIUY5Nc14ERfggsNQ7X5n6jGFUYvOZaoXsl7w+wJ6hrwXU+pP8Nz6pRyXLagFrIM/Pq1/Sm51kREzNzobNaNKP8U2dWZG1/fTSJTipuDylIxNhQ7A2UpUUp0uL3K8XBBnbnZ1dwLl8c74vNWFlphNhqUzM3xQWfY75t02XBAHdzo42tMROmTUHDjcrmUfptXX30Vn/nMZwAAM2bMQHNzc+qujqIqtJmVV8Kpyt6IzM1owY140vXK4Y8ni1fHZfmBJ+crlkwEAOxu6R1x/0zweGVloFxo5kYEYd06OcUT2AgeaItLdJCfLMshp6Xi77kpsJggDkGFDvJrUQU3TrcX+/3TrYHgAX4AlF4hr5y5QLJ70ImdzYHvOb3tEKOxweGOfb4UJS+h4Gb27NlYs2YN3nrrLbzyyivK8e9jx46hvLw8pRdI0YnsTWOK+m7a+2ILbmxmI+xmXyahJ8yThSg7iN4cAJhc4esROto9NOLVfya09A7D7ZVhNkojym56m1Ks3islFFh9f483uOkddgcFNHE3FFuMMBikiKUpdeYGCGyUB4IH+AGA2WhQSm1dA5lpKt54sAvq8UXdWbgPjbLbi9ubMWfVS3huy1GtL2XMSCi4+elPf4rf/e53OOecc3DFFVdg3rx5AIB//OMfSrmKMmNSWWoXaLb1iZ6b0U/CRRvkd1zJ3ASCm/J8CwptJshy6oKxeIiTUrUl9hFHgfXWUBx6FBwACvxlqXinFKtLUkAcmRtVWQoInNwK/XqL4EYsxdxxLJAlUQ/wE0RpKtWTtSMRJSnxJQ8XjBOl03sHuuDyyNh4qEvrSxkzEgpuzjnnHHR0dKCjowNr165Vbv/mN7+JNWvWpOziaHQT/SemGlNVlooxcwMEml3DvRIWqf9SVeZGkiRMGeebjXSgvX/E+6RbpH4bILA8Uy9PfKFHwQEEphTH2XMjSlLiazrk8sTU76LO3ACBr3foZnDRUHzGtAoAwDZ15qZHZG4CwU2mm4pFM/Hiyb5Bl3oJYGnsEGV6ve3Zy2UJbwU3Go1wu914++238fbbb6O9vR319fWorKxM5fXRKCal+MRUe1/wE2E0xVFm3ShHwUNm2kzxl6YOdKR2ZUQsREAl5gOpiSyUXp74esKclspPcL+UGOAnHnvA1xg8GpG5sYnMjS18pk6cxFo6qwoAsPNYLzz+4KnZ33NTUxwoA4rgpjMDwU3XgBO7W3xDKS+cXQ0g9xqKjw84ceEDb+K36z/R+lIoAvFiL5HDAJSYhIKbgYEBfP3rX8f48eNx1lln4ayzzkJNTQ2uvfZaDA5mvtwwltVXpK7nxu3xKk84ox0FB6KfMOoKU5YCAn03B9szH9yIcsnM8SMHuIneIN303ISZc1OYYEOxGOAnsmZAbCsY1A3FgCpzo2oolmUZbf6AuGFKOfIsvkGDIpBUBvipMjfl/mnHXRkoS73vL0mdUFWAaZWFAHIvuHn/YBd2t/Sxn0PHxIumRMY4UGISCm5WrFiBN954A//85z/R3d2N7u5u/P3vf8cbb7yB73znO6m+RopiYpkvWDjWM5R0N37ngBOy7OtNCA1KwhF9Kj0h2Q6PV1Ze3YdO0p2sYeZGnJiZHWYhaInOylJ9YY+CJ7Y8U5SlJpTaYfXvpIql70YEN3khZSn1Y9Q14AxarjnLHzhuP9YDt8erBD7qzE15vtX/vulvKH7PH9ycOqVcFYzrIzuXKqK8N8zTOLolgpuBGMcwUPISCm6efvpp/P73v8dFF12EoqIiFBUV4dOf/jQefvhh/O1vf0v1NVIUFQUW5FmMkGWgqWto9HeIQvTbVBRYY9q9E2nwnXppZok9pCw1zp+5yXBw09Y3jPY+ByQJmFFdOOLtyiLQIX1sBo92FDz+hmJfgFFdZFMClaEYTqsNj2goHpm5EcfAKwp8wxrn1PpWL2w/2ovWPge8MmA2SqgoCJQ5M1mWEs3EDVPKleDsuI62v6eCCBK1OIFIsekeYFkq0xIKbgYHB1FVVTXi9srKSpalMkySJGVScWNXcgFDPM3EQOTj0+KVZJHNpGzeFsTKiK4BZ0Ynxe70l6SmVOQjzzJypZoI1DxeOe7MSKqpr6Eo3ITiuBuK/SeWSmzK/z2WzI24jy00c6P6eouhj6KMKYKbbUd7lH6b6mJb0CoPUZbqTFFZSpZl3PrkVvzn/30YFPh19Duwt9VXHlsypVzJIjrdXgy7Ru85yhYiSIz1iD9llsvjVX6e+x38GmVKQsFNQ0MDVq1aheHhwHyLoaEh3H333WhoaEjZxVFsxKybZJuKRQkhlmPggCrbEZK56Y7QbwP4SivVRb4nwkxmb0S/TehSR8FmNsJm9v04iFdZWlEHL8nullIP8BtfbFdOPiXScyOySOrgRmRuqotFcOMrS+081ouj3SOPgQOpPy3VNeDEs1uO4qUdrbjx8c3KhGRRkppRXYiyfAvyLUaY/EFWLpWmlLJUDgVsuUT9+5GnpTInrq3gwgMPPIALL7wQEyZMUGbcfPTRR7BarXj55ZdTeoE0OmWBZkhwM+h0Y7t/149B8mV5TAYJM8YXwmoyjvg48WZuAnNugp8owg3wU5tckY+W3mEcaB/AgomlMX2uZInMzaww/TZCaZ4FzT3D6B5yYiIib0RPN1H2sZuNsJgCrz8SmVCsHuAXVJaK4VX+cGhwE+YoeKuyaNUX3EwbVwCryYB+h1s5gq3utwFSX5ZqV20YX7+nHbc/vQ2/+OJJQf02gO/7vyTPgo5+B44PuEYEXdlK/Lw5PV54vHJMJWXKHHWGesjlgdvjHZHRptRLKLiZO3cu9u3bh8ceewy7d/u2PF9xxRW46qqrYLfnxi+MbDJRydwEMiFer4xr1m7EB4eOj7j/mdMr8H/XLhlxe1u8wU2Eo+DhBvipTRmXjw0HOjOauYnWTCwU281o7hnWfDy/shHcHvzjmUhwI0pSpXlm2C2BqdLxNBSLbE9RmLJUq2qLPACYjAbMHF+ErU3deHVXK4Dgk1JAoKFY7JeKtn0+FqI0VmgzYdDpwdObj6CyyKoEVw1TA1PTS/LM6Oh35GTmBvAFpCLDR/oQmqEccHpQbGdwk24J/RSsXr0aVVVVuO6664JuX7t2Ldrb23Hbbbel5OIoNpP8J6YOq46D/+WDRnxw6DgsJgMmlNjhlWW4PDKOdg/hg0NdkGUZkhT8pNLeF9tGcCFSz024AX5qynHwDAU3/Q638rlmhTkGLoy26TxTwh0DBwJD/AYc7rBfv3CUZmJ/liKezM2gc/Sj4GKAnyg1AsDc2mJsbepWJhDXlIQvS3m8MnqHXREzfLES37fz60pwyUk1+N7THyszXyQJWOIf3gcE5i7l0nFw9ZPnEIMb3Ql9sTTgcAfNr6L0SCh8/N3vfocZM2aMuF3snKLMEj03R7qG4PHKaO9z4Kf/9mXUVl40A6/99zlY/91zsf6758BokDDs8ipZGrW4Mzf+J6WekBNGkQb4CeLEVKaOg+/2Z22qi2woL4j8fytV/X/iJctyyurp4fZKAYHMjcsjxzSEDwgM2BOloUBDcQw9N87gzE24hmLx8atUwY3ouxFCy1IWk0Fpjk7FCgb1stcvnVKH/77gBOVtM6uLgoKn4gh9YtlKluWg8h5PTOlP6Isl9t1kRkLBTUtLC8aPHz/i9nHjxnEruAbGF9tgNkpwerxo6R3GT57fid5hN+bWFuPqhnrlfmajARNKfa+iD4UJLNrj2CsFBMpSoadPxCvJ0Bk3wpQK3zC5gx39Ma0BSFagmThy1gZQTSlOoKH4vhd3Y/aql7ClcWQZMF6BvVLBr8DzVae8Yv0FqT6xBAQClcFYjoKPaCgOLO4UX7fQnhsgcGJKCNfbUp7CpuLQXrEbz52GaxomAQCW+acSC7k262bA6YFTFegyuNGf0MyN1qcxx4qEgpu6ujq88847I25/5513UFNTk/RFUXxMRoOyL+mx9w7j71uPwSAB935u7ojmwkn+5uPQRZuyLMfdUJxnMcJsHHn6RPwwR+q5mVBqh8mfQWoJ2SidDjuO+XYdRWsmBtRTiuN74uvsd+DRdw4B8G2gTlakzI3BICHfH5zE2nfTHLLbKZ6ylOi5sYUszpRl35BBpzsw0bpalZ2ZXlkIi6phUmwEVwucmEp+kJ+ScfRn5SRJwg8/Mxuvfeds3Hju1KD75lpZKnTK85CTJ6b0hpkbbSQU3Fx33XW45ZZb8Oijj+Lw4cM4fPgw1q5di1tvvXVEHw5lhph18xt/r8HVDfWYO2Hksef6crFFPPhkVb/DrTyZxRrcSJIUNs0vGoojlaVMRoPSBJ2JvptYmomByA3So/nLxkbl1XN7mHJfvCL13ADxHwdXD/ADVJmbWIIbZ/CEYqspcFy+Z8iljA6wGA1BX2uLyYAT/YMS8yzGsP0FZf6m4lScmAq3D00saQ09laIEsDrZIZaszpDgkFOK9Sd0Xx2Dm8xIqPPsu9/9Ljo7O/Gtb30LTqfvC2ez2XDbbbdh5cqVKb1Ais0k1TLIqiIrvqPqOwi+nzg2HhxUiCflAqsp7JC7SIrtJt/pE3Vwo/TcRG4UnVKRjwPtAzjQ3o/T/duk08Hl8WJvi2+Q26zx4WfcCIk0FLs8Xvzfe4eVf6uPJSeq1z/nJlxQUGAzoa3PEfMgP2WAn+i5Mcc+xC/0tJS4pmGXA73DLqXvp7LIOqK5eU5tMbYd7cH4YlvYxmelLJWKnps4GuEDC1JzJHMzEJq5YXCjN10hZe4+TinOiIQyN5Ik4ac//Sna29vx3nvv4aOPPkJXVxfuuuuuVF8fxUhkbgBg1SWzURjmVT8ATPYv2jzUEZy5ibeZWAg0FavLUtGPggOBJY7pbire39YPp8eLQpsJdWXRxxQksjzz39tblBNDQGoyN5GOggPxLc8MGuA3oiwV/f1dHq+yM0r03ADBm8HD9dsI8/xZQ/X3pZoypTgFmZt4vncD+9ByNLhhz43uiBdLooTPzE1mJHVmsKCgAKecckqqroWScOqUckgScNGcalw0pzri/dQ9N+rjxPH22wihpRyPV1aCg2hHfDN1HFw0E88aXzTq0elEylKPvnMQALB4chk2HuzSVVkqdIAfEHtZSt2YajMHZ27ENYrgpjpMcHPpglo09wzjwgjfi6ka5Dfs8iivhGP53i1VMje5UZYKDW7YUKw/4nutpsSOw52DGGB2LSM4SShHzKktxqYfnI//veLkqE/iE0rtMEi+Jzd1CSXRzE3orJugpZkRem6AzAU3sUwmFsTprljLUluburGlsRsWowG3LJ0OAGGP2McrUkMxEN8gP3FMWwzwAxDz4kzxdkmCskkcCD4OLprBK4tGfs/YzEbcev4JmBlhrpDI3CTbUCyCSYvJMOJ0WTiRZjNlKwY3+ideLImTqixLZQaDmxxSlm8Zddqr1WRUTs6o1zXEewxcCN0vJV6lFNlMMEcZMT7FH9w0dQ3CkcYmSHFSKtJOKbUS1RN3LEfURdbmP+aNV4YD9gy5kv7/BI6CRw5uYkltH+sRx8AD5bi8GDM3SjOx2RgULKs3g7f2RM7cjEZpKE6y50YE6JWFI/t+wlHKqDmyGTw085VrPTc7jvVgxVNb0RblVOXOY7340poN2JyCMQypJsuBTHad/0Qry1KZweBmDBK7qNSzbhIuS4Xslzo+yowbYVyhFQVWE7yyL8BJB1mWlZNS0SYTC+JVvVce/dVVa+8wnv/YN9Np+WmTUWw3KzX1ZAfTBTI3IzMRBXFsBg8d4AcA9hi3godrJgaCMzfKdOLi+IObVM25EasXYv2+FWUpp8cbU1O13onHT8R1wzEOd8wWa98+hGc2H8WDr++PeJ8H1+/HxkNd+NO7hzJ3YTHqHXbD43+hJDI3DG4yg8HNGFRfMXKLeGAjeHxPVCUhc0O6YjgpBfia0kVp6kB7ekpTR44PoW/YDYvRgOlVBaPe32oyKpkNdU/G0e4h/H3rUXx8pFuZ7PvYe4fh9spYNKkUcycUQ5IkZc5KPH037x/oxNv7OoJuEz034U5LiZ6bWAaBhQ7wA2JvKBYZAHW/DRC8GVz03MT7PQMEem6ODzqTyqAo04mjTJ5Ws5uNygyeXChNicyNyLjmWuZGlC1f2dka9vvE4fbgjT3tAID97f0ZvbZYiBd7eRaj8oKPQ/wyg0tIxiCRuTnYmXzmpjikCbd7lAF+apMr8rHtaE9KTkx90t6P3799EF9YOAEn+zeNi5LUCdUFUUtkaiV2MwadHuWJb9DpxhUPvYdGf3ZJknwngEQ5Zfnpk5X3HVdkw7Ge4ZiDm2GXB1979AMMuTx4+obTsHBSKdwer9JwmGxZSjkppc7cxLg4cyhkOrGg3gyuNBQnkLkR3x8uj4ze4cR37cT7fevbDG5GW58DxwecqC2JfoJO78STf22JHa29jpzruREnB4/1DGPHsd4R06/fO9Cl9J/tb+uPaxHr9qM92HmsF19cNCGmkmYiAjO/LHH97FLymLkZg8LNumnvi+8VsFASso+py//DHK2ZWFCailOQufn1un14/P1GfP637+KH/9iBfoc70EwcQ0lKCB3y9sCr+9DYNYhCmwkVBRbIsi/j1e9wo7bEjmWzq5T3jTdzc+T4kBJEfP+ZbXB5vMqMGwDK/iU1cVtMDcW9IrgZ2XMz2it88SSZZwkf3BzrHlKCsKowDcWjsZmNyi/7ziRmA7UnkHEMlFKzP3Mj5gTV+vs5cjW4AYCXd7aOePsrO1uUvw+7vDjqz1bG4qbHN+N7T3+MbUd7krvIKMSLvZI8M4ObDGPmZgwSU4oPdwxClmW4vbISlIQ7+RJNScgyRZGGLYth07NYoJnsiSlZlvH2/k7/34E/vHsIL+9oUUo4sTQTC+oy27YjPXjkrQMAgF99eT4+NaMKHf0O7G3tw4H2AZw6pSxoAq7IHogS32iOHA+UBfe09uGRtw4qx/jzLcYR03V9t4vgZvQnsWPdwQP8ANXiTJcn6mbxwQhlKZFh2dPaB8AXbMUz9FGtLN+CfocbXQNOTBmX0IdIKOMomuCz/Tj4sMujBJhixUWuzbnpGQoEAi/vaMGK8wPDSWVZxqs72wAARoMEj1fGvrY+1EWYraTW3DOkTGk/cnwIJ00oSe2F+6kzN/GUlCl5zNyMQXVleZAk3w9Z14ATnf1OyLLvF0QsQYla6FRf5Yc5hrKUWKCZbFlqb2s/OvodsJuN+P01izCh1I5jPcPY1+arwY+2dkFN9Ap19Dtw29MfwysDn5lXg0/N8GVoKgqsOG1qBb5y6iRMqywMel/xBBtP5gYIZGN+tW6vMpcn3DFwQN1QHD3rEG6AHxBoEPZ4ZTg9kZtPQzeCCyK4EQ3XiZyUElIx6yah4CZH9kuJnzWTQVIyV0Ou3Goo7lV9n+9u6Qs6fLDtaA9aeoeRZzHiUzMqAQD7WmPru/nwUOBkVUcKpopHIiZhl+azLJVpDG7GIJvZiBp/qeJQ56DyBFFRMPpR8lDiVbDYTixGjY/WUAwEGps7+h1Bv8Ti9fZ+X0Pu4sllOG9mFV6+9Sxcd+ZkGCRfBiTSrJVwxImpR946iJ3NvSjJM+OuS2bF9L7xBjdN/szN50+egFOnlGHY5cUP/7kDQPh+GyD2OTfhBvgBwWWmaKWp0I3gQuh1hZtOHKtUnJhKZIRBrpSlRN9Xab5F+TrlUllq2BXYeD7X32ujLk296v/72SeMwxx/dnZ/W6zBTWDBbbKnG6MJrKJRl6Vy52ukZwxuxiixi+pQxwDa+0cuHoxVoc2kHEPtGXKpVi+M3nNTaDMrnzOZE1Pv+IObM/w7qvIsJtxx8Sys+845+Me3z1DSwbEQZTbRr/KDi2ehIsY+JKXnJsZXgiJzM6HUjns+NxcWo0F5so7UYBvrL0hRklIP8AMAs9GgHFmP1lQcqaG4OC+FwU1BcsGNLMuB01JxfO+KwPt4ClY/aEk8buX5Ftgtvl/luRTciODTaJDw2fk1AIJ7bESgc/6sKuU05L4Yg5sPMpa5ET2IlqDp4rHM0aLkMLgZo9RNxWJWSCJHeg0GSbVvyBn0wxyLKcpx8MSOcbo8Xrx3wNdvE7qAc3JFPqaOG/0IuJo643TGtAp8/uTamN9X9CvFXJbyp9jryvIwdVwBvnXuVOVt4WbcAIGyVF+UTJfHK+O+f+8GAEyrHPn/j+XE1GCEslToFOBEmomFZAf5dQ+6lP1XIlCKRa5MKRbBTZkqc5NLR8GVHWs2E5bN9vWibTzYheMDTjR1DWJ3Sx+MBgnnnliJ6f7v8/1t/aOOFugbdmF3S6/y744UTBWPRJQ+1ZkbwNfzRunF4GaMUhZoqspS8Z6UEtQ9DMdVv3BjEe8rrlBbm7ox6PSgPN+CGdWFo7/DKESvkM1swL2fmxvXEVH1aalYZreoMzcAcMM5U5Vgb7Sy1IDTE/Fz/Oyl3XhjbztsZgNWXTJ7xNtFA3C0J8JImZsCqwnqymUix8CFcqXnJrEnF5G1Kckzw2oyjnLvgNKQE3HZqlP1s2YVZak0TvvOtB7VvKe6sjzMqC6EVwZe292GV/xZm0WTSlGab8Gk8nyYDBL6HW4l6xrJlsZuqBMnmcjclOZZYDMbYDRweWamMLgZo4IyN6JvIcFX4aKU0zngVF4Nx9JzAwDTxgVecSVCDMA7bVpF3P1C4Zw/swrnz6rC//vSfEwsH/3UhZoojTjc3lFPRAw63cqT0wT/MV6ryYj/d/l8LJxUis8vnBD2/URw4/HKGA7TPPr3rUfxuzd8J7x+/oV5I+aCAOoVDJGvcThC5kaSpKBm50SyfUJZkj03gYxjcstes5WYcVOeq5mbweBhlhf4szcv72xRgpvzZ/ka/S0mg1JqH62pWPTbiI31ae25UR0FlyQJ+f6fJ+6XSj8GN2OUsoJBnblJoOcGAIr9gUxT12BMSzPVplf5si2JBjeBfpvyhN4/VHGeGQ9fvQgXzR0f9/vazEbl5JN44o1EZG2KbKag/pp5dSV4+obTRpTYhDyLUelxCm0q3nakB9/728cAgG+dMxWXzKsJ+zGUzeBRUuMicxN6FBwI7gdKKnPjLyUlukk90V6x4hzZDB4oS1lVDcW5c1pKKUuJ4MYfyLyxtx0b/QGKCG4AYLr/9OJoWWDRbyPGLqQzc9M9GJzJ5ompzGFwM0aJVy09Qy7sbfPNLEm4LOX/5SOOdBeOsjRTTdTKD3cOxL1wsm/YhS1N3QBG9ttoJdYTU2LGjcjaxEqSJBRYRp6Yau9z4Jv/9yEcbi8+NaMS37ngxIgfI5ZBfuJIcWhZCggJbpJoKBblOF9QHH+DZaLl1NKQwZPZSgluCixKEJpLc256QtaQzK4pQk2xDcMuLzxeGSdUFSgZaCBQ4t7v/30WjsvjxVb/74wL/cHNoNMTNYuZjNB1NKJnjsFN+jG4GaPsFqMy3E2cVEq4LOV/JSwWccbabwP4goFCm2+BZrzD/DYe7ILHK6O+PC/uICFdYj0xJTI3dWXxj/8Ptzzzu3/7CM09w5gyLh8PfHm+UtsPJ5blmWL3VOiEYiDQD2SQfOMDElVXlgeD5OsfivWEmVq8SzMFdY9YNm8G71INzNTjUfBkH9vQ4EaSpKBMjfrvQKB5PlpZauexXgy5PCi2mzFvQglsZt9TYEdf6rN4Q04PHP6j7OJ7Lj/GUQ6UPF0ENw8++CDq6+ths9mwZMkSbNy4Mab3e+KJJyBJEi699NL0XmCOmhTSUzKuILFX4SJzI4KbWE9KAb5fWNNj+KUUjphvo5esDQBU+jMZo2VuxDCyRIKy0F+QWxqPY/2edpgMEh766qKIzchCntKfEfkXbKSt4EDgyaaiwBp2inKsrCYjavwDBg91xL8ZXgRE8fb9iFfRbq+c1U8y6oZim/8o+JArcqN5Jv3wHztw2n2vJVXyCQ1uAOD8WdVh/w4El6UiPQYf+MtZiyaVwmCQlDEPiQTXo1EPWRTlqFjnVFHyNA9unnzySaxYsQKrVq3C5s2bMW/ePCxbtgxtbW1R3+/QoUP47//+b5x55pkZutLcU69K6QLJ99wc80/ELYux30aYVplYU3HofBs9iHW/VOhJqXiE/oJ88PX9AIBLF9SGPfodKtBQHC1zE7nnRhxTT2bGjSD2ix1KYEp1or1iNrMRVpN/M3gWNxUrc25UZSlZhpIt0NJLO1rQ3DOMjQe7Rr9zBL1hgpslU8qweHIZzjphHE4KaZafMi4fBskXFEVqEhaTiRfVlwGAEtyko+9GPRZDnLpkz03maB7c3H///bjuuuuwfPlyzJo1C2vWrEFeXh7Wrl0b8X08Hg+uuuoq3H333ZgyZUoGrza3qOvVhVZT2FfpsSgJGTgXy+oFNfGKK57gpq13GHtb+yFJQMPU1DQTp0KsPTdiOnFdApkb9S/Incd68equNkiS7yh5LOyxBDdRem5Eg2cqgptwG+pjlUwjfCpXMMiyjF+9ug///OhY0h8rVm6PV7l29ZwbAHBo3FQsy7KSVUpmb1y4zI3ZaMBT/9mAP3198YjTkTazUekl3Bem70aWZXx42BfcnFJfCiC9wY16xo0QyLrqp3yYqzQNbpxOJzZt2oSlS5cqtxkMBixduhQbNmyI+H4/+tGPUFlZiWuvvXbUz+FwONDb2xv0h3zErBsAGJfEMLbQk1GxHgMXplXFn7l55xNf1mZOTXFcZbB0i3V5ppK5SaTnRrWA78H1vqzNp+eOj3lgocjcROvPECWrcAHvZH9AcmJ1fAMSw6lPInPTlkRwo8y6GUq+12Jvaz/+36t78f1ntmWsJCSOGEuS7/9iNhpg8j/Za91ULFaxAMlNHg8X3IxmWpQXSoc7B9HR74DFZMDcCb6sz7hC/y65NPTchNuzF8i6Zm/GMFtouhW8o6MDHo8HVVXBjWFVVVXYvXt32Pd5++238fvf/x5bt26N6XOsXr0ad999d7KXmpPUmZtET0oBI4ObeBqKgcCsmwMd/XB7vDH1cby9L/xUYq3FkrnpG3Ypr+qS6bnZdqQbL2xrBgDcdO60mN8/pobiCEP8AOALCyegviIf8+tKYv6ckYgAO95X+A63R3nyi3fODRB4wjyegsxNo79/qs/hRnufQ+m7SidRkiqxm5XmcZvZiH6HW/PgplOVBTnYkdiIByCx4GZ6VQFe3dUatn9P9NucVFusDH1Ma1lKtVdKyLf6Pm8q90vJsm/mVaKZ91yleVkqHn19ffjqV7+Khx9+GBUVsT2prVy5Ej09PcqfpqamNF9l9lA3FCfabwMAxfbgYCbezE1tiR12sxEuj4zDXaM3lsqyrMt+GyAQJEb7ZSmyNqEj2WMlZuk8vfkoZBlYOrMyruWg8fTchPuFaTIacOqU8rD9OPGqV4ZJxnccXPRUmI1SXE9+gnIcPAWzbsQeLyC5Mkw8xFRn9QsJ2ygnpp76oAk/e3E3fvfGJ3hiYyNe3N6MrU3dKc82qbe8H+qMv1FcCJ1zEwvlcEKYslRovw2Q7p6bkQNNC6y+/0sqG4rveX4X5v/oZXx8pDtlHzMXaJq5qaiogNFoRGtra9Dtra2tqK6uHnH/Tz75BIcOHcIll1yi3Ob1+tKfJpMJe/bswdSpwX0HVqsVVmviT9y5LM9iQmWhFW19jqQmzY4sS8X3ZGMwSJhamY/tR3uxv61/1PLKkeNDaOkdhsVowCJ/7VwvxHH6zgFnxCxUoJk4sePr6inFAHBjHFkbIJCNGXJFmVAcpecmlerK8mA0SBhyedDa64h5KGCbf8T+uAJrXCsyhFT23KiDm0OdA1gyJf09YMcHfNddnh/43WZXnZgKdbhzAN97+uOwH+unn5+Ly0+ZmLJr61I183YNONE96EyodJxQ5iZKWerDw77MzSmq3xlikGS6G4qFAn/mpj+FE4o3HuqCw+3FH949hPu/ND9lHzfbaZq5sVgsWLhwIdatW6fc5vV6sW7dOjQ0NIy4/4wZM7Bt2zZs3bpV+fOZz3wG5557LrZu3Yq6urpMXn5OEK+ck8vcJNdQDMTXVCyGBdZX5KUke5BKpXkWGA0SZDnyWgExwC+RGTcAgracnz6tHAsmxhfgjdZQ7PZ44fRkJrgxGw3KibF4sh5KM3GCJSDxhJOKstSRoMxN4pmKeIjVC6X5gZ89m7/UMhzm6yqevAttJly2oBafmlGJqeN8P/v//Kg5xdcW/H2fSDZr2BWYERO6iT6aqZW+/1NHvzPoOjr7HfjE3/+zcFLg5yWQuUl9z020huKBFA4NFEHUv7e18Ii5iuZlqRUrVuDhhx/GH//4R+zatQs33HADBgYGsHz5cgDA1VdfjZUrVwIAbDYb5syZE/SnpKQEhYWFmDNnDiwW/TSWZotlc6pRYDUldeLIbDQoO1OA+HtugPiOg4vm09Cj7HpgNEjKQsi2CH03TV1JZm5Um7njzdoAo5el1K/8M1HHD6wCiSO46U/RstcUNBQHZW4yVpYKrF4QxNcq3PJMsctoYlke7r98PtZ+7RQ8cs0pAID3D3aiN8qW+Xh1hCxCTSS4EcfADRKUidyxyLOYlGBZ/bvk1V2+6sD0yoKgTIoS3KRhM7h6aaaQjjk3Iogacnnw722pDVSzmebBzeWXX45f/OIXuOuuuzB//nxs3boVL774otJk3NjYiOZmfsHS5dozJuOjVRck3Ryq/oUR614ptWlRauWhxJOgOGmjN6M1FSuZmwRm3ADAJP9x18X1ZWhIoAQy2voFEdxIEpR5MOmUyKybZPehpXJ5ZmhZKhOUGTdhem6GnCOPgosnU3WP1+SKfEwZlw+XR8abe9tTd239yWdu1P028S7EDX2h9P6BTtz19x0AAvukBBEc9zncKZ/urPTchDstlaKylNvjDVrC+fTmIyn5uLlA054b4aabbsJNN90U9m3r16+P+r5/+MMfUn9BY0y0Uf2xKrabcbRbNMomUpYK/ELyeuWov9D0nLkBRg9umpLsuTlzegX+sPwULJhYmlC/id0sTkuF/wU77AyUpBL5+PGqL4//xFQyx8CBQDDenWRDsdPtDcrQHeocGPX7NxXU04mFaPulxJNpoS34V/7SmVV4qP0A1u1qw3+cFH7RarxE4FVRYEVHv0MpI8cjkX4bYXplAdbvace+tj7sPNaLb/zJt3Nt6cwq/Nd504PuW2Q3wWI0wOnxoqPfkdI1LuFPS6V2iJ96P5okAe8d6EJT1yDqyvSxjkZLmmduKDeIbE08SzPVJpblwWI0YNjlVYKkSMQJjPoKff4Aj7ZfKrA0M7HMjSRJOOfEyoR+8QOxZ27S3W8jKLNu4ilL9YnVC8mWpZLL3LT0DEOWAYvJN2dm2OVF6ygzjlJBZEfKVbu97P49SeEyEOEyN4AvuAGA13a3we1JzfA/EXgt8ve2HExg1k1ywY2vf2/DJ5245tGN6Bt2Y3F9Gf73ygUjGvwlSVI1Fae27yZsQ7EttWUpkR0qsplw+lTfydFnNh9NycfOdgxuKCXEk0UiWRvAd7xYlCei9d24PV5lL5NeMzfixFS4zE3PkEtJI2u17FPpuYmQhhcZnUw1a4uv++HOQXi9sR1LTrYspQzxS7IsdaTbH6iW2BNqjE5UV5jMTbTlmeJ7riAkc3PyxBKU5JnRM+TCJv/03lRdmzjJeLBjIO7j5skEN2Io6O6WPrT3OTBzfBEevmZRxO/ndPTdqMtF6syNuucmFUfwe4YCgwI/v7AWgK80pYf9YlpjcEMpIWbdJHJSSohlUvHR7iG4vTKsJgOqMzAsLRHR9kuJwKyiwKLZ0K3RTkuJzE24jeDpUFtih8kgweH2ork3tqxH0j03ylFwZ8wBVTjHun3XW1NiV01bTv+JqahlqTBf10DmJjhYMBkNOPfESgDAut3R9/nFfG3+jOW8upKgY/7xUHpuRlkCG456v9rEsjz88eunRA2SKtJwHFydEVR/blGW8sqBcQvJECMBSuxmLJtdjXyLEY1dg/jgUGoC1WzG4IZSQjxZxLs0U01MKo7WVHxQ1W+T7r6GRI0rjLwZXMy4qdUoawP4TpQAvn4RT5gn9uEoG8HTwWQ0KDuBYmkqlmU5ENwkeFpKPOF4ZV8zaaJEM3FtiT2hU1+JkGVZKXmo59woQ/zCnJaK1HMDBEpTr+5sHfG2RK5NBF7VRTbl63ogzknFiQzwE4psZnxqRiUmluXh/65dPOoMr3QM8hO9XEU2U1ApLM9shGhjS0VpSgRRJXkW5FlMuPik8QCApzexsZjBDaVElf8VdHVxYn0kgG90OgDsi5K5Oezvt1FPV9YbpaE4zC/LZE9KpYI6IxOuqVictsnkDCGR9YilpNM75Fbm8CSaubGZjUoZpyeJ0tRRf7BaU2JXymvpLkv1DrmVoFQ958Zuie+0lHDWCRUwGyUc6BjAgfbE1yUAvmygmE9Tlm9J+DFJpiwFAGu/dgrW//c5QStmIqkoTP2sm+OqpaZqBoOEfEvq+m66lb4e3+P0+ZMnAACe39YcsadurGBwQylx2cIJWHnRDNx4bmybqcNRD/KLVDMWvyQn6/QYOKBanhmmxJLsdOJUsJoMyqvHcL8AM91QDKhm3YR5EmzuGQo6FSKWkhbZTEkFYOIJ4XgSJ6aO9YjgxpbUEtB4iNULBVaTsiMJCAzxC3daqi9KcFNoM2PJZN9IgXW7kitNiX4bq8mAPIsxENzE2VScbHADIObMbjoyN8rurzA9iIH9UqkIboJXPJxSX4aJZXnod7jx0o6WpD9+NmNwQylRZDPjP8+emtSTdn1FHgySr/kx0gA8vc+4AQLBzYDTM+IXWLLTiVNBkiTkmSP33SgbwTMY3IgFmqElnaauQSz95Rs4477XlCWhyfbbCMpx8CgnpnoGXbjk12/jN/7t66GOKmVGu7It/XBX7I3RiQjXTAwE1i84wh4F9/0fQxuKhaUzfX03r+xKrjQlAoTyfAskSUo4c9ObguAmVmnpuRkceQxcSOUgPxGYi8fJYJBw2cmBxmIt9A27sLWpO+KE9kxhcEO6YTUZlVfw4bb6AoGylF5PSgFAviVQ8gj9hZnsdOJUibYZPNMNxUDkstRfNjZiwOlBn8ONbz22GT94bpuS/Uo6uLEHmooj+eBQF7Yd7cHatw+OyCbKsqyMLagtsaOmxAazUYLT7VUyOukQrpkYUO8Mi9xQXBhhUet5/r6bTYePJzX7Rwm8/AGDVmWpeIxLwwqGcEszhVQO8gv03AQep4vm+PputjSmfilqLLY0duPSB9/B5b/bkPHPrcbghnRlqjLMb2RTcdAxcJ3OuAF8mZFwx8FlWU56xk2qKLNuwizPVHpuMhnc+IPVpq4hpZ/E5fHiqQ99rz7POXEcAODP7zXizr9vB4Cklr0CgX6VaMfBu/xP9B39zhHZxK4Bp9JfUl1sg8loUIanhTsx9eL2FrySgqbdcNOJAcAawxC/SJmburI8zKguhMcrY/2exKcVdw4ENzqL4KaxaxCuOOboZDK4CfTcpC5zE27GjZDK/VLdYVY8iH7Efoc7JRO449Xk/x03UeNBggxuSFemV0ZuKj5y3HcM3GY2oCrJJ7Z0C3ccvHvQhQF/pqS2RB/BTbTMTSbLUjUldmVSrDiBtG5XKzr6HagosOLhqxfhj19fjPJ8ixJQJJu5EeMLoj0BqLMYO471BL1NZG0qC61K74soTR0MKa8d7R7CDY9twrce25R0OSJiWSranJsoPTfCef7S1HNbj+Ld/R14eUcLntl8BE9vOhLzNYcGXtVFNtjMBri9spJxi0VGgxv/z2r3oCuuACya7oGRSzOF/BSWpcT3rnq5qM1sVH424nnMU6WxS5TeGdwQKaKdmBJPGHo+Bi6EOzElXtFUFlo132YebdaNFj03RoOEiSFrGB7f2AQA+NKiCTAbDTj7hHF44eYzceqUMgDASROKk/qcsTQUq7eG7zjaG/Q2EYTVqALVSE3FL+9ogSwDLo+Mxs7k5uB09geXfoRAWSr4CVqW5cBpqQiZGyBQmlq/px1XPvI+vvl/m7DiqY/wnb9+hAde2Rvjtfm+30XgZTBISlbuYBzHwTMZ3JTYzcoKms4UlaZExi/c3K/CVJalIpS/xGlM8TsnFl6vjN0tvThyPLmesSadBDe62C1FJMwcXwQA2HakBw63J+g0yGH/E4aej4ELgRNTgeAmcFJK26wNEH0Fw1CG59wI9eX52N/Wj0OdA5jclY+39vnKI18+ZaJyn6oiG/5y3alo6R3G+CTGDgCBV9U9URqK1Zmb7SMyN75TW7Wlowc36pMrjV2DmFVTlOBVB4KxspAnNGXOTcjXdNDpgWi9KLRGDhbmTyjBhbOr8dGRbhRYTSiwmeD2yNh2tAdv7outVNU5MDLwmjIuH7tb+nCgfQCfmjH6x3C4PcqAu0wENwaDhPJ8C9r6HOjod6C6OPmscLhykZDK/VLKUfCQx6muLA+bG7uVQCMWf/mgEXc86yv5WkwGTCrLQ31FPs4+YRy+cuqkmD+OyNxoXZZicEO6cmJVIcYVWtHe58CHh47j9GkVytsCO6X020wshCtL6SVdC6iXZ4YLbgKLMzNJnJg62DGAtt4myDJwxrQKJaMjSJKUdGADACX+slS0Ux1iAiwA7DgWnLlRTkqpMjfhylJdA05sPNil/LuxK7mj4hEbiv2npUKH+ImsjdEgwWaOnKw3GCSs+erCoNu6Bpw4+cevYG9rv1IijEZZmqkaLhhvU3HvkO96JSn80MF0qCiwoq3PEXEfXLwCDcXRylLJzaFxur1KmTs0iBIvoOIpS21t7A762Pva+rGvrR+v7GzF0plVMQd94tCE1sENy1KkK5Ik4ewTfM2jb+wNfrWozLjR8UkpQV2W6ht24b5/78b9/tS+Hmb0BHpuwjUUa5S5Ue0We+pDX0nqisUTo71LUkRwEK0s1aV625HjQ0ED/5SylOqXvmh0b+oaVBZRrtvVCnWWvzGOV9Nhr8k/56a8IHzmJjQbp+yVspri3vJelm/BiVW++VPqAC3ytY0MvCZX+ErNsQY3IpNWaDVlrPysNBWnaL9Ud5SGYhGwJZu56fbvlTKECQLr/Kcx4ylLtfjncv3083Px1vfOxZ++vljVuxPbx+kZdClfPy3HXQAMbkiHxMmYN0JObRzuFGUp7YOD0YjTUh81dePcX6zHmjc+gdPtxenTyrH89MkaX130stSwBg3FQCBofXt/B9r6HCjPt+D8WVVp+3yidBKtzyL0WPSO5kBpSjkGrjrWX1Nsh8VkgMsjK3unXtrhOyElftkfTqLnRpZl5ZVxaPbKFuG0VLTpxLEQPU7vHegc9b7h+oHizdwo/TZJrHKJV0UKN4PLshzohckPk7nx/+wl21CsNBPbzSOCQDFqIp7MTXPPsPK+dWV5OOuEccrPZEuMO99EMFVRYFHWvGiFwQ3pzhnTKmCQgD2tfWj2zwtxebxo8v+g6iHzMZpxBb5X850DTnT0OzFlXD5+f80i/PnaJRnpIxiNPcpm8ExvBRdE5kb0h3xh0QRYTOn7FSVO9EQtS/mfQESKXd1UHGgoDmRuDAYJk8Rx8M4BDDrdSu/Qtf6gNp4+iFCdA070DLkgSSN/DkQw6ghpKI62VyoWp07xTS9+/8DomRsxPVl9TH2K/zqbe4ZjWgmQyQF+wrgUTinefrQXbrEeI0rPTaqCm3DZIRFIHzk+GPOsmxZ/cKMuP1X5/y7eNho9ld4Z3JDulORZML+uBEAge3PkuG/+ic1sQFVRckeAM2HyuHwU2UwoyTPjh5fMwku3nIXzZlbFXRZIl+gNxf6emwyXpaqLbLCqghl1I3E6iNLJkMsT9nHwvQL3BT6i90scBx92eZTelwklwb/IJ6kWaL65tx0OtxcTy/JwwexqAP6RBgkeOT7gX2NQW2IfEXyK4Mbp8QZ9/H6HfzpxgpmbxZN9mZs9rX3KaahwBp1upRFYXZYqzbcoJ9NiWSqayZNSQqpWMHQPOvGtxzcBAC6YVRX2BUKqylLHQ/ZKqY0vtkOSfJvHY8lG9Q27lGBrvCq4GR9ncNOkk2ZigMEN6dTZJ/hmboi+m0OqY+B6CRCiKbCa8NZtn8J7K8/D106fDLNRXz9qecqE4pG/YIc1mFAMBB8bPm1qedozdAVWEyz+r4vIOKgNOD1weXyves+cLoIbX+ZGlKTyLUYU2YODBnVjtChJLZtdheoiGyxG38yX5hifLEJ94l9sOWVcwYi3qZ9Ih92B4KZvlAF+oykvsOIE/4iGaH03oiRlMRlGBFLxlKY0CW4Kk1/B4PHKuPmJrWjqGsLEsjz8/Avzwt4vVZkb0f8VelIK8H0Nxhf5ApNY+m5E8FJsNweVk6r8H6M5xrKUXk5KAQxuSKfO9vfdvL2vAy6PVzlaq+e1C6GK7WbN59lEYo+6W0qbnhsAaJjqK4Fce0b6+5IkSVIyDOFKU8cHAk/WiyaVAvAFF0NOT9CMm9BgW90Yvc6/q+mC2dUwGCRM8JcLEm0qFlu7p44b+XOgznqpB/kl23MDBEpT0fpu1AP8Qh8T3Qc3InPTl3jPza9e3Ys39rbDZjZgzVcWRuwZSlVwczzKcXMgvr4bEWyPDzkRFW/mhmUpolHMrS1GaZ4ZfQ43tjZ1B4KbLOi3yQbRylJa9dwAwMpPz8Bb3ztXGSiXbiK46QwX3KjmyVQW2TCu0AqvDOxq6Q1amBlKNGG+s78DvcNuVBRYcPJEX3Ak+nESD258PwfhMjcG1VFv9dc12Z4bQB3cRMncDAQP8FMTfTcHYtgOLoKboiwqS726sxX/85pvuerqy+ZGnWNUmKI5N92jNF6LQDqWHq9w/TZAIHMTb1mqTuPdeQCDG9Ipo0HCmdMDp6aUGTdZMMAvG0SbUDysUc8N4FuemslXfeI4dVeYvoTjSsOm78ljtv8Ja8ex3rDTiQURgIvj3+fPqlIm4Ip0faInpj6JkrkBVIP8Upy5UffdRGrAVk5KhQluxHHwAzFMKdYyc9M16Iy7H+pQxwBufWorAOCahkn43IIJUe+f6obiTGRuWnuHR51a7PEGFsmGzqbSAoMb0i31vBul54aZm5RQem5CTku5PV44PdoM8dNCtLJU6JRZJbg52hOYThwmuAltjL5gVrXy94nKgtD4gxunO3BicGqYzA2g3i+l6rlRgpvEg4WKoL6b8KWpSAs9gcD8n9DJzeFoEdyU5pkhSb6TeurZRr94aQ8W/eSVqNf94Ov70TfsxsJJpbjj4lmjfi4R3Lg8MhzuxAf5dUdpKAYCKxhimVHT0uv7vqouCv5+HldohSQBbq8cNrsZ/DGG4fLIMBslVBdpv/uPwQ3p1ln+4Gbb0R7lySAbjoFng0BZKvjVo7oRNdMNxVqIWpYaEPuBRObGt8tqx7FeHO32fT+GC27UjdEFVhNOm1auvE3J3CQwpbixawAer4x8ixGVEZaG2sPMuklFWQoAlkyOXppSgpswU4zF43F80BU0CDEcLYIbk9GgrLMQfTcfHOrC/76+Hx39Try6K/I29+3+JvP/PGtKTKML1Bm0gSSmFKvn3IQTT+ZGzGQKzdyYjQblmPxopSmxM21CaZ6SqdQSgxvSrXGFVsyp9b1a9sq+X9yRfqlTfCKVpdS9GtY0zpjRi8Csm5G9FsdD5ojM8Qc3e1r6lF/k4cpSQCBTcc6J44L2o4m9aIc7Y58/Iuxv8wVEUysLIp4YtIYLbmJYmhmL0ZqKI62FAHzZCvGzG7oxPZQWc26A4L4bp9uL7z+zTXnbrua+sO/j8njxiX/J74zq2PaFGQ2SEoQmszxztIZiMevm6PGhUUtKkXpu1LeNNshPvADVw+48gMEN6ZwoTQG+J4ZsOAaeDSI1FKtPSo2Fx7rMvwMpelnK9yRbV2ZHoc0Ep8eLYz0jl2aqfWlRHaaOy8d1Z04Jul00WvYNu6Mu7AxH9KtMiZK9tEdrKE6i5wYAlvgnFe9uCd93I2bghCtLAeoTU9H7brTI3ADBx8EffusA9rUFrnN3S2/Y9znUMQCnx4s8izGuJ/VU9N2IxylSWaq6yAajQYLT40XbKGslxLDU0MyN+DgA0NITPQMkjpzr4Rg4wOCGdE7MuwFYkkqlvAiLM7XaCK6VaGWprpCGTUmSMGt84NW5QQKqImQSz5tZhXXfOQfz/MMoBbuqpBRvU/EnbZFPSqk/PoCgXo6+FGVuKgqsmF4Zed5NuL1SaoHgJvr/W7Pgxp+52XT4OP5n3T4AwK1LTwAA7GvrD9tovLvFl9E5oaowrj1YyiC/MHOmYjVa5sZkNCjTs6PNuhlwuNHrD4CTydzoacYNwOCGdG7BxBLlFWc27JTKFuJJcMjlCUpZD2m0V0orymmpGBqKAWBObbHy9+oiG0wJDGcUpal4j4OLzE2kZmIAsJlGZuSSnVCsFq001an03IR/shWHAaI157o8XiXg1iq4eez9RjjcXpwxrQLf/tQ05FmMcLq9Yacr7/EHNzOqC+P6XPnW5MpSwy6P0jQebQeXmJ4dralYBC0FVhMKbSM/lghuRhs8yeCGKA5mowHnz/bNPJkf8iqYEqduFnaomoi12giuFeW0VNij4MENxUDgxBQQuSQ1mroEZt3IsqyacRM5yLdZ0tdQDARKU+GCm8BpqfDZrHrVWopI1KW6cE+06VShaoS2mAz4yaVzYDBIONEfuITruxGZmxPjDW4ssZWlBhxutIXJmIhmYqNBilpurFNm3UQuKUXrtwFiH+TXpKMBfgCDG8oCP/rsHPzlulOxbHZmBruNBerMjHoFw5DLPeLtuUz0h/Q53COO5R4fGLmYUJyYAiI3E49mUpnvSb4xjrJUtIWZaqFHwWVZVs25ST5YECemQvtuhpweJeNSFiFzI4Kyg+0DEZupRXBTaDNl/MRNheq6v33uNCXTJBqFw/Xd7Gn13RZvcFMQ4yC/6/+8CWf9/PURmZfuIf8xcLs5am+c6PGKNnog0owbQRnkF6UsNeBwKzusGNwQxajAakLD1PIx0eCaKepptuq+myHn2JlxAwBFNrPyJCqCGSFcWWrquHzlFFmiwc3Ect/7xXMcPNrCTDVlQrE/c+Nwe5X9WMn23AC+E4wnVvmeyN/e36HcLqYTm42RMwkTy/IgSb5AMtLMFK36bYBAgHJCVQG+eXagEVyUnEQJSuh3uJWMSKwnpQTxtYiWuel3uPH2/g4Mu7zYdPh40NsCgXf0x2mCsh08WuYmcjOx73a7/37DEYNS8fGL7WZNvnbhMLghGqPEID91CUP83TZGylIGg6QEL+rR+w63BwP+oK9U9QRiMhoww99UHG7GTSwmlolBfqPPHxGiLcxUs4dMKBZPnpIE5KUoYBV739bvaVNuUzcTR3oRYjMbUeN/oozUd6NlcHPShBI8fcNp+Ot/nhZ0fH9GhLLU3lbfv8cVWiM2UUcSy2mpj5q6IWKJT0LWVvSIzE2EZmJBydxE6blpVspS4b+fxWmpQadHaU4Ppbd+G4DBDdGYFW55pghuUvVEmA3Kw0wpFj0NBsmX3VH79rnTsHRmJZbNrkYixBPAsZ6hmCfURluYqTYiuBEbwS2muE7zRHOOfzzDm3s7lGb0zlH6bYR61cb0cLSacSMsnFQ6okFXZGWOdg+hdziQ3Uu0mRiIrSy1pTGQrRHBrXBcOck3SubGH9w09wxHXCvRMkpZym4xKl+PSH03gYWZ+phxAzC4IRqz8pRBfoFfsMNjrKEYCL+C4fhg4JVxaFCwdFYVHrnmFIxLcKBkRYEFeRYjZBnKAs7RRFuYqaYM8XMGZ25SUZISFtWXIc9iREe/AzubfT0nYq9UpJNSwmjbwbXM3ERSnGdGjf+JX12aEn8XZbp4FMSQudnc2K38/ZO24OAmMJ04+uNdWWiFxWiAxytHPO3UPEpDMaCedRP+Y+itmRhgcEM0ZoUb5CeyOFpsBNeKaIBV94HE2tOQCEmSVGsYYmsqVhZmjjLrKXT9Qp/I3KTgGLhgMRlw2tQKAL69b0BgwvNo5ZnRTkz1jLJSQCuiFLlbFdyIBuN4m4kBdVkqfOZOluWgzM3BDt/qDSF0wGQkBoOknOqL1HcTbYCfUD3KiakmlqWISC/CrWAYa3NugPArGMI1E6eSeBKIZYFm0MLMylF6bizBp6XSkbkBfGslgEDfTbTVC2qjDfITmZsinQU3IoDZ7c9UybKsKkvF10wMAAX+OTeRylKHOgdxfNAFi8kAi9EAh9urbKIHApmbWIJvMTk5XN/NsMujlLjGF0UuKVWPcmKKPTdEpBtKQ3HQaSn/UXDL2PnVEL4sFVtPQ6KUzE0Mx8FjWZgpiNNSgYbi1A3wUxNrUTY3dqNnyKXMCYq0ekFQD/ILd/JGj2UpINBXIzI37X0OHB90wSAB06uiB5zhiGP5kcpSImszt7ZY6VNS992IsmlxDMF3tAWaIhNjNxtRZI/8PRJtkJ8sywxuiEg/7CE9N7IsY4N/OJuefkmlm3hC7uwf2XOTrsxNPFOKY1mYKYSWpVI5wE+triwPU8flw+OV8c7+jqgbwYPez78xesjlQWvvyH1Hes3czPSXpfa09EGWZSXIqS/PT6iEO9qE4s3+4GZBXYkykVp9Yqp7KPbgWzT5HgnzvaaecRPteytQlhoZILX3OeBwe2GQEh+PkA4MbojGKHEiatD/RLjjWC/2tvbDYjLgwtnjtby0jAq3PFMpS8V5xDdWE8tjH+QXy8JMwRZyWkrZK5XizA0AnHOib+/bG3va0RFjWcpiMihlknBNxXrN3EyuyIfFaEC/w40jx4cCzcQJ9NsAqtNSEXZLbfE3E588qVQV3AQyN+L7s2SUhmJglMxNr++2aM3E6re3hAlIRblrfLEd5gTWkaSLfq6EiDIqtKH4mc1HAQDnz6yKuq8m14QrS3WlsaEYCGTGGrsGIw5GE2JZmCnYImRuUjGdOJQoTb2xt33UjeBq0ZqK9RrcmI0Gpd9pd0tfwmsXBNEDFa7nZtDpVj7+yRNLMbXS93ipT0zF03NTF6XnJpaTUkD0zeB6LEkBDG6Ixiy7JbAZ3O3x4h8f+YKbzy2o1fKyMq48zGmpdDcU15bYYZB8QUh7/8hXw2qxLMwUlDk3aTwKLiyeXAab2YCW3mElKxDLMLvJURZoaj3nJpqZqqZisXYhkRk3QGC3VF+YstTHR3rg8coYX2xDdbFtRFlKluU4G4p9QUdL7zCc7uBZN6LnpibCAD9BnKQ6PuhSsoJCY6fva8/ghoh0IU91WuqtfR3o6HeiLN+iTKAdK8QTcs+QCy7/oLPjMR61TZTFZFDG2kcrTcW6MFNQTkv5n8SUnps0lKVsZiMa/FvChdGG+AGB4OZAFpWlAGDGeF8gs+NYL/a1+gLOExM4KQUEylIOt3fEcD3Rb3PyxFIAgYxdR78DPYMuDLk8cPrfJ5bgu6LAApvZAFlG0IkrIPbMTbHdrDSrt4acmNLjAD+AwQ3RmBUoS7nx9OYjAIDPzKvRVd08E0rzLBC9lCKoCbwyTk/mBoitqTjWhZmCzRRcauxLY+YGCPTdAIDJIEU9cSPUR8jcuDxeZeWFLoMbfyDz5r52ONxe2MyGhLMV+apgcyBk1s3mw90AgAUTSwD4AiFRFvqko185yWc2SsrPcDSSJEXsuxltOrH6Y0Qa5CfKXXoa4AcwuCEas8Sr/NZeB17e2QoA+PzJE7S8JE0YDRJK/E+mou9GBDnx7gyKh3hiPBQlcxPrwkzBZgkszpRlWdVzk67gJpDli7ZXSm2yv+fmcNegsr4BCJSkAKAoTcFYMkQJSsyFOqGqMOHN5RaTQTnBtn5vYEeXLMvY2uQ/KeXP3AAI6rvpVk3PjnWZsOi7ORjS5xRr5kZ9H/Wsm2GXB7uO+Up0sQTfmcTghmiMEq/63jvYCafbi+mVBZhTm1iaPdspTcX9Tni8slIeSVdDMQDMqvE91n/7sClo1pDayztaAADTRhneJ6iHLzrc3rT23ADApPJ81PszULEGgjUlNpiNEpxuL46pGlRFz1OB1QSTDrOHoQsyE1m7oPaNM3ybx+/+506lIbupawgd/U6YjRJm1wR+FtV9N0pWMY7slihxPb3piHKb0+1VlsWOH6XnBgi/guGVna3oc7hRW2LHnJrimK8nE/T3HUREGWE3+57wxGGdy06eEPMrwVwjekU6B5zoHXJBJBRiOWqbqC8urENtiR3Heobxm/X7R7x957FePPruIQDANQ31MX1MdXZn2OVRgpt09NwIojQ12l4pwWQMlHPUx8EfeesAAAQ9qeuJJElBDcSJnpQSbjhnKmZUF6JrwIkf/nMnAGCLP2szu6Y46GupPg7erQyYjP1788uLJ8JiNGBrUzc2HfZ9DtE7YzEZYuotE1vD1YP8nvGXsz+3oDZli1lThcEN0RilrtdLEnDpghoNr0Zb6uPgoiRVYDXBYkrfr0i7xYg7/2MWAOB3bxwI6kHxemXc8dw2eLwyLppTjXNnVEb6MEHMRgNM/ieZIZcnsFsqjWWeK5dMRG2JHf9xUuzfP6EnprYf7cFf/VmF7104I/UXmSLqVQuJrF1Qs5gM+PkX5sFokPDPj47hpR0t2HxYlKRKgu6rDm4C04ljz9yMK7QqP99r3z4IIPYBfkJ1ke8FgAiK2vqG8ea+DgDA507W3wlLBjdEY5Q6uDltanlMqelcpV6eeTyOY7bJWja7CmdOr4DT48WP/rVTuf3xjY3Y0tiNAqsJqy6ZHdfHVI6Du7xpW7+gdkJVId65/VO4YvHEmN9HzLo52OGb8/OT53dCloFL5tVg4aTSUd5bO+LEFJB85gYA5k4oxjfP8pWnfvDcdry93xcsnDwx+DEQPTeNnYNKKSnek3xfP2MyAODf25vR1DWoLMwU5abRhGZu/rH1GDxeGQsmlsQ0piDTGNwQjVF2VXBz2YKx10ispl6eme4ZN2qSJOGHn5kNs1HCa7vbsG5XK9r7HPjpi7sBAN+54ISYmj3VrP7gpm/YpSzQLEzDEL9kKCemOgfw8s5WvHegC1aTAbddeKLGVxbdSRN8fSU1xTaMG2XPV6xuPm86pozLR3ufQ5llE5q5qS6yIc9ihNsr4+MjPQDiP8k3o7oIZ0yrgFcG/vjuoZhPSinXELIZ/Gn/0M/LdHoIgcEN0RhVUWCFQQLyLUZcOKda68vRVHBZyt/TkMaTUmpTxxXgWlVz6Q//sQN9w27MqS3C1TH22qiJpacdquGAYpeRXoiy1L62Pqx+YRcA4BtnTlaOLOvVjOoi/Paqk/HbryxM2ce0mY34+RdOUsYRVBZaURuyo0mSJCU7InpmEjkuf60/e/PkB03Y7594XB1jxlYEQe39Dmw/2oNdzb2wGA245CR9rmrR33k7IsqIqiIbHvrqIpQXWILmboxFZarlmd1pHuAXzrc/NQ3PbjmCxq5BNHYNwiAB935ubkJHjUVZqqPPqfxbb6ePRHDT1OUrjYwrtOKGc6ZpeUkxu2hu6p/MF04qw9dOq8ej7xzCkinlYXtgpozLx7ajPcpJvkQyi2efMA5TxuXjQPsAntvqy7zEmrmpKLDCaJDg8cpY88YnAIDzZlamdRZUMvT1HU9EGbV0VlXQPI2xqly1PFPMuslEWUrIt5pwx8WzlH9f3VCPkyaUJPSxxCkbsdYhnc3EiaoussGqatb+7wtOSGtfUDb4/qdn4ldfno87/2Nm2LeH9rUk0hNmMEj4+um+7I3L4zsSGGtwYzRIqPSX4l7Y1gxAvyUpgMENEVHYslQmGorVLjlpPD5/8gQsnlyGFReckPDHUYKbPl9wk85j4IkyGCSlqXjW+CJ8YWGdxlekPbPRgM/Or0VlYfhgIxXBDeAb1Kl+33gOElT5m4+9su9n5hwdr2phcENEY56Y0XJ80ImuAXEaJbPpdkmS8MsvzcNT/9mAIlvigZU9CzI3gO+kWIHVhB99dnbCk37HEnFiSkh0BpPdYsRVSwIn2+JpWFdnefS+qkW/V0ZElCEikPHKwGH/OoRMZ25SRSw4FJkbvZZ7VlxwIj5adQEW1ZdpfSlZob48H+pWnNL8xL8/r26oR4HVhJpim3JSMBbqQOgLC/VbkgLYUExEpOz66Rt2K9uq07lXKp0CDcX6Dm4AMGMTB5vZiLrSPGXRajLTs6uKbHjxljNhNhrimiwsMjcnVBXodpK0oN/veiKiDCrPt6Bv2A2n2zcbJtNlqVQR84uUzI1Oy1IUv6nj8tHYNQiryRA0pyoRiRy7v3RBLT44dBxfP32y7le1sCxFRISRmZpsLUtZTf4hfhnYK0WZJZqKtfrerCy04eGrF6Fharkmnz8eDG6IiACUFwRPnM32zI3AzE3umOrfDp+t35uZxOCGiAgIaqy0GA1Bu7eyid0cEtzobPUCJe6MaRUozTPHvEh1LGNIT0SE4LJUab5Z9z0FkYjTUgIzN7mjriwPm35wflxNwGMVMzdERAgJbrI47R+auWHPTW5hYBMbBjdERAgM8gOyt5kYCEwoFvR8FJwoXRjcEBEBKMsPNBRnc+ZmRHDDshSNQboIbh588EHU19fDZrNhyZIl2LhxY8T7PvzwwzjzzDNRWlqK0tJSLF26NOr9iYhioW4o1uum41iMbChmcENjj+bBzZNPPokVK1Zg1apV2Lx5M+bNm4dly5ahra0t7P3Xr1+PK664Aq+//jo2bNiAuro6XHDBBTh69GiGr5yIcklwz032lqVCj4IXMnNDY5Dmwc3999+P6667DsuXL8esWbOwZs0a5OXlYe3atWHv/9hjj+Fb3/oW5s+fjxkzZuCRRx6B1+vFunXrMnzlRJRL1MFNtq5eAMKclmLmhsYgTYMbp9OJTZs2YenSpcptBoMBS5cuxYYNG2L6GIODg3C5XCgrC798zeFwoLe3N+gPEVEom9mIfH/WI5vLUuy5IdI4uOno6IDH40FVVVXQ7VVVVWhpaYnpY9x2222oqakJCpDUVq9ejeLiYuVPXV1d0tdNRLmpzH9iKqvLUqrgxmI0KOsYiMYSzctSybjvvvvwxBNP4Nlnn4XNZgt7n5UrV6Knp0f509TUlOGrJKJscclJNZhYlocFE0u1vpSEqTM3zNrQWKXpd35FRQWMRiNaW1uDbm9tbUV1dXXU9/3FL36B++67D6+++ipOOumkiPezWq2wWq0R305EJHzvwhn43oUztL6MpKgzN+y3obFK08yNxWLBwoULg5qBRXNwQ0NDxPf72c9+hh//+Md48cUXsWjRokxcKhFRVlCflmJwQ2OV5t/5K1aswDXXXINFixZh8eLFeOCBBzAwMIDly5cDAK6++mrU1tZi9erVAICf/vSnuOuuu/D444+jvr5e6c0pKChAQUGBZv8PIiI9sJoCr1lZlqKxSvPv/Msvvxzt7e2466670NLSgvnz5+PFF19UmowbGxthMAR+WH/729/C6XTiC1/4QtDHWbVqFX74wx9m8tKJiHRHkiTYzAYMu7zcK0Vjli6+82+66SbcdNNNYd+2fv36oH8fOnQo/RdERJTF7GYjhl1eZm5ozMrq01JERDSSODHFnhsaqxjcEBHlGHFiipkbGqsY3BAR5RiRuWHPDY1VDG6IiHKM2C/FshSNVQxuiIhyTIHNtz6iOIvXSBAlg2E9EVGOuf7sKagqtOJTM6pGvzNRDmJwQ0SUY06bWoHTplZofRlEmmFZioiIiHIKgxsiIiLKKQxuiIiIKKcwuCEiIqKcwuCGiIiIcgqDGyIiIsopDG6IiIgopzC4ISIiopzC4IaIiIhyCoMbIiIiyikMboiIiCinMLghIiKinMLghoiIiHIKgxsiIiLKKQxuiIiIKKcwuCEiIqKcwuCGiIiIcgqDGyIiIsopDG6IiIgopzC4ISIiopzC4IaIiIhyCoMbIiIiyikMboiIiCinMLghIiKinMLghoiIiHIKgxsiIiLKKQxuiIiIKKcwuCEiIqKcwuCGiIiIcgqDGyIiIsopDG6IiIgopzC4ISIiopzC4IaIiIhyCoMbIiIiyikMboiIiCinMLghIiKinMLghoiIiHIKgxsiIiLKKQxuiIiIKKcwuCEiIqKcwuCGiIiIcgqDGyIiIsopDG6IiIgopzC4ISIiopzC4IaIiIhyCoMbIiIiyikMboiIiCinMLghIiKinMLghoiIiHIKgxsiIiLKKQxuiIiIKKcwuCEiIqKcwuCGiIiIcgqDGyIiIsopDG6IiIgopzC4ISIiopyii+DmwQcfRH19PWw2G5YsWYKNGzdGvf9f//pXzJgxAzabDXPnzsULL7yQoSslIiIivdM8uHnyySexYsUKrFq1Cps3b8a8efOwbNkytLW1hb3/u+++iyuuuALXXnsttmzZgksvvRSXXnoptm/fnuErJyIiIj2SZFmWtbyAJUuW4JRTTsH//u//AgC8Xi/q6urw7W9/G7fffvuI+19++eUYGBjAv/71L+W2U089FfPnz8eaNWtG/Xy9vb0oLi5GT08PioqKUvcfISIiorSJ5/nblKFrCsvpdGLTpk1YuXKlcpvBYMDSpUuxYcOGsO+zYcMGrFixIui2ZcuW4bnnngt7f4fDAYfDofy7p6cHgO9BIiIiouwgnrdjycloGtx0dHTA4/Ggqqoq6Paqqirs3r077Pu0tLSEvX9LS0vY+69evRp33333iNvr6uoSvGoiIiLSSl9fH4qLi6PeR9PgJhNWrlwZlOnxer3o6upCeXk5JElK6efq7e1FXV0dmpqaWPJKMz7WmcPHOnP4WGcOH+vMSdVjLcsy+vr6UFNTM+p9NQ1uKioqYDQa0draGnR7a2srqqurw75PdXV1XPe3Wq2wWq1Bt5WUlCR+0TEoKiriD0uG8LHOHD7WmcPHOnP4WGdOKh7r0TI2gqanpSwWCxYuXIh169Ypt3m9Xqxbtw4NDQ1h36ehoSHo/gDwyiuvRLw/ERERjS2al6VWrFiBa665BosWLcLixYvxwAMPYGBgAMuXLwcAXH311aitrcXq1asBADfffDPOPvts/PKXv8TFF1+MJ554Ah9++CEeeughLf8bREREpBOaBzeXX3452tvbcdddd6GlpQXz58/Hiy++qDQNNzY2wmAIJJhOO+00PP744/jBD36A73//+5g+fTqee+45zJkzR6v/gsJqtWLVqlUjymCUenysM4ePdebwsc4cPtaZo8VjrfmcGyIiIqJU0nxCMREREVEqMbghIiKinMLghoiIiHIKgxsiIiLKKQxuUuTBBx9EfX09bDYblixZgo0bN2p9SVlv9erVOOWUU1BYWIjKykpceuml2LNnT9B9hoeHceONN6K8vBwFBQX4/Oc/P2LII8XvvvvugyRJuOWWW5Tb+FinztGjR/GVr3wF5eXlsNvtmDt3Lj788EPl7bIs46677sL48eNht9uxdOlS7Nu3T8Mrzk4ejwd33nknJk+eDLvdjqlTp+LHP/5x0G4iPtaJe/PNN3HJJZegpqYGkiSN2PEYy2Pb1dWFq666CkVFRSgpKcG1116L/v7+5C9OpqQ98cQTssVikdeuXSvv2LFDvu666+SSkhK5tbVV60vLasuWLZMfffRRefv27fLWrVvlT3/60/LEiRPl/v5+5T7XX3+9XFdXJ69bt07+8MMP5VNPPVU+7bTTNLzq7Ldx40a5vr5ePumkk+Sbb75ZuZ2PdWp0dXXJkyZNkr/2ta/J77//vnzgwAH5pZdekvfv36/c57777pOLi4vl5557Tv7oo4/kz3zmM/LkyZPloaEhDa88+9xzzz1yeXm5/K9//Us+ePCg/Ne//lUuKCiQf/WrXyn34WOduBdeeEG+44475GeeeUYGID/77LNBb4/lsb3wwgvlefPmye+995781ltvydOmTZOvuOKKpK+NwU0KLF68WL7xxhuVf3s8HrmmpkZevXq1hleVe9ra2mQA8htvvCHLsix3d3fLZrNZ/utf/6rcZ9euXTIAecOGDVpdZlbr6+uTp0+fLr/yyivy2WefrQQ3fKxT57bbbpPPOOOMiG/3er1ydXW1/POf/1y5rbu7W7ZarfJf/vKXTFxizrj44ovlr3/960G3XXbZZfJVV10lyzIf61QKDW5ieWx37twpA5A/+OAD5T7//ve/ZUmS5KNHjyZ1PSxLJcnpdGLTpk1YunSpcpvBYMDSpUuxYcMGDa8s9/T09AAAysrKAACbNm2Cy+UKeuxnzJiBiRMn8rFP0I033oiLL7446DEF+Fin0j/+8Q8sWrQIX/ziF1FZWYkFCxbg4YcfVt5+8OBBtLS0BD3WxcXFWLJkCR/rOJ122mlYt24d9u7dCwD46KOP8Pbbb+Oiiy4CwMc6nWJ5bDds2ICSkhIsWrRIuc/SpUthMBjw/vvvJ/X5NZ9QnO06Ojrg8XiUicpCVVUVdu/erdFV5R6v14tbbrkFp59+ujKNuqWlBRaLZcQi1KqqKrS0tGhwldntiSeewObNm/HBBx+MeBsf69Q5cOAAfvvb32LFihX4/ve/jw8++AD/9V//BYvFgmuuuUZ5PMP9TuFjHZ/bb78dvb29mDFjBoxGIzweD+655x5cddVVAMDHOo1ieWxbWlpQWVkZ9HaTyYSysrKkH38GN5QVbrzxRmzfvh1vv/221peSk5qamnDzzTfjlVdegc1m0/pycprX68WiRYtw7733AgAWLFiA7du3Y82aNbjmmms0vrrc8tRTT+Gxxx7D448/jtmzZ2Pr1q245ZZbUFNTw8c6x7EslaSKigoYjcYRp0ZaW1tRXV2t0VXllptuugn/+te/8Prrr2PChAnK7dXV1XA6neju7g66Px/7+G3atAltbW04+eSTYTKZYDKZ8MYbb+B//ud/YDKZUFVVxcc6RcaPH49Zs2YF3TZz5kw0NjYCgPJ48ndK8r773e/i9ttvx5e//GXMnTsXX/3qV3Hrrbcqi5j5WKdPLI9tdXU12tragt7udrvR1dWV9OPP4CZJFosFCxcuxLp165TbvF4v1q1bh4aGBg2vLPvJsoybbroJzz77LF577TVMnjw56O0LFy6E2WwOeuz37NmDxsZGPvZxOu+887Bt2zZs3bpV+bNo0SJcddVVyt/5WKfG6aefPmKkwd69ezFp0iQAwOTJk1FdXR30WPf29uL999/nYx2nwcHBoMXLAGA0GuH1egHwsU6nWB7bhoYGdHd3Y9OmTcp9XnvtNXi9XixZsiS5C0iqHZlkWfYdBbdarfIf/vAHeefOnfI3v/lNuaSkRG5padH60rLaDTfcIBcXF8vr16+Xm5ublT+Dg4PKfa6//np54sSJ8muvvSZ/+OGHckNDg9zQ0KDhVecO9WkpWeZjnSobN26UTSaTfM8998j79u2TH3vsMTkvL0/+85//rNznvvvuk0tKSuS///3v8scffyx/9rOf5fHkBFxzzTVybW2tchT8mWeekSsqKuTvfe97yn34WCeur69P3rJli7xlyxYZgHz//ffLW7ZskQ8fPizLcmyP7YUXXigvWLBAfv/99+W3335bnj59Oo+C68mvf/1reeLEibLFYpEXL14sv/fee1pfUtYDEPbPo48+qtxnaGhI/ta3viWXlpbKeXl58uc+9zm5ublZu4vOIaHBDR/r1PnnP/8pz5kzR7ZarfKMGTPkhx56KOjtXq9XvvPOO+WqqirZarXK5513nrxnzx6NrjZ79fb2yjfffLM8ceJE2WazyVOmTJHvuOMO2eFwKPfhY524119/Pezv6GuuuUaW5dge287OTvmKK66QCwoK5KKiInn58uVyX19f0tcmybJqVCMRERFRlmPPDREREeUUBjdERESUUxjcEBERUU5hcENEREQ5hcENERER5RQGN0RERJRTGNwQERFRTmFwQ0RERDmFwQ0R6d7XvvY1XHrppVpfBhFlCQY3RERElFMY3BCRbvztb3/D3LlzYbfbUV5ejqVLl+K73/0u/vjHP+Lvf/87JEmCJElYv349AKCpqQlf+tKXUFJSgrKyMnz2s5/FoUOHlI8nMj533303xo0bh6KiIlx//fVwOp1RP+fAwECG/+dElEomrS+AiAgAmpubccUVV+BnP/sZPve5z6Gvrw9vvfUWrr76ajQ2NqK3txePPvooAKCsrAwulwvLli1DQ0MD3nrrLZhMJvzkJz/BhRdeiI8//hgWiwUAsG7dOthsNqxfvx6HDh3C8uXLUV5ejnvuuSfi5+TKPaLsxuCGiHShubkZbrcbl112GSZNmgQAmDt3LgDAbrfD4XCgurpauf+f//xneL1ePPLII5AkCQDw6KOPoqSkBOvXr8cFF1wAALBYLFi7di3y8vIwe/Zs/OhHP8J3v/td/PjHP476OYkoe7EsRUS6MG/ePJx33nmYO3cuvvjFL+Lhhx/G8ePHI97/o48+wv79+1FYWIiCggIUFBSgrKwMw8PD+OSTT4I+bl5envLvhoYG9Pf3o6mpKe7PSUTZgcENEemC0WjEK6+8gn//+9+YNWsWfv3rX+PEE0/EwYMHw96/v78fCxcuxNatW4P+7N27F1deeWVaPicRZQcGN0SkG5Ik4fTTT8fdd9+NLVu2wGKx4Nlnn4XFYoHH4wm678knn4x9+/ahsrIS06ZNC/pTXFys3O+jjz7C0NCQ8u/33nsPBQUFqKuri/o5iSh7MbghIl14//33ce+99+LDDz9EY2MjnnnmGbS3t2PmzJmor6/Hxx9/jD179qCjowMulwtXXXUVKioq8NnPfhZvvfUWDh48iPXr1+O//uu/cOTIEeXjOp1OXHvttdi5cydeeOEFrFq1CjfddBMMBkPUz0lE2YsNxUSkC0VFRXjzzTfxwAMPoLe3F5MmTcIvf/lLXHTRRVi0aBHWr1+PRYsWob+/H6+//jrOOeccvPnmm7jttttw2WWXoa+vD7W1tTjvvPNQVFSkfNzzzjsP06dPx1lnnQWHw4ErrrgCP/zhD0f9nESUvSSZZx6JKEd97WtfQ3d3N5577jmtL4WIMohlKSIiIsopDG6IiIgop7AsRURERDmFmRsiIiLKKQxuiIiIKKcwuCEiIqKcwuCGiIiIcgqDGyIiIsopDG6IiIgopzC4ISIiopzC4IaIiIhyCoMbIiIiyin/H5vi7yHPpfpuAAAAAElFTkSuQmCC\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "n_layers = 4\n",
        "batch_size = 20\n",
        "steps = 100\n",
        "trained_params, trained_bias, loss_history = quantum_model_train(n_layers, steps, batch_size)\n",
        "\n",
        "pred_test = quantum_model_predict(X_test, trained_params, trained_bias)\n",
        "print(\"accuracy on test set:\", accuracy_score(pred_test, y_test))\n",
        "\n",
        "plt.plot(loss_history)\n",
        "plt.ylim((0, 1))\n",
        "plt.xlabel(\"steps\")\n",
        "plt.ylabel(\"cost\")\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0kRgFZwr3fHK"
      },
      "source": [
        "The variational circuit has a slightly lower accuracy than the SVM---but\n",
        "this depends very much on the training settings we used. Different\n",
        "random parameter initializations, more layers, or more steps may indeed\n",
        "get perfect test accuracy.\n",
        "\n",
        "How often was the device executed?\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 193,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "VGhHTCTP3fHK",
        "outputId": "9d2bf2bc-7628-4f60-ac3e-bcbb1b7b4ed8"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "2025"
            ]
          },
          "metadata": {},
          "execution_count": 193
        }
      ],
      "source": [
        "dev_var.num_executions"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mJyxRIhl3fHK"
      },
      "source": [
        "That is a lot more than the kernel method took!\n",
        "\n",
        "Let's try to understand this value. In each optimization step, the\n",
        "variational circuit needs to compute the partial derivative of all\n",
        "trainable parameters for each sample in a batch. Using parameter-shift\n",
        "rules, we require roughly two circuit evaluations per partial\n",
        "derivative. Prediction uses only one circuit evaluation per sample.\n",
        "\n",
        "We can formulate this as another function that will be used in the\n",
        "scaling plot below.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 194,
      "metadata": {
        "id": "FMFvt86o3fHK"
      },
      "outputs": [],
      "source": [
        "def circuit_evals_variational(n_data, n_params, n_steps, shift_terms, split, batch_size):\n",
        "    \"\"\"Compute how many circuit evaluations are needed for\n",
        "       variational training and prediction.\"\"\"\n",
        "\n",
        "    M = int(np.ceil(split * n_data))\n",
        "    Mpred = n_data - M\n",
        "\n",
        "    n_training = n_params * n_steps * batch_size * shift_terms\n",
        "    n_prediction = Mpred\n",
        "\n",
        "    return n_training + n_prediction"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "c8coagmG3fHK"
      },
      "source": [
        "This estimates the circuit evaluations in variational training as:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 195,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "esATEcjo3fHR",
        "outputId": "6f46590b-83d3-4a4f-be7d-52508cd19d08"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "192025"
            ]
          },
          "metadata": {},
          "execution_count": 195
        }
      ],
      "source": [
        "circuit_evals_variational(\n",
        "    n_data=len(X),\n",
        "    n_params=len(trained_params.flatten()),\n",
        "    n_steps=steps,\n",
        "    shift_terms=2,\n",
        "    split=len(X_train) /(len(X_train) + len(X_test)),\n",
        "    batch_size=batch_size,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "nfqqOSzb3fHR"
      },
      "source": [
        "The estimate is a bit higher because it does not account for some\n",
        "optimizations that PennyLane performs under the hood.\n",
        "\n",
        "It is important to note that while they are trained in a similar manner,\n",
        "the number of variational circuit evaluations differs from the number of\n",
        "neural network model evaluations in classical machine learning, which\n",
        "would be given by:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 196,
      "metadata": {
        "id": "uumnwm6l3fHR"
      },
      "outputs": [],
      "source": [
        "def model_evals_nn(n_data, n_params, n_steps, split, batch_size):\n",
        "    \"\"\"Compute how many model evaluations are needed for neural\n",
        "       network training and prediction.\"\"\"\n",
        "\n",
        "    M = int(np.ceil(split * n_data))\n",
        "    Mpred = n_data - M\n",
        "\n",
        "    n_training = n_steps * batch_size\n",
        "    n_prediction = Mpred\n",
        "\n",
        "    return n_training + n_prediction"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JnHDNbRt3fHR"
      },
      "source": [
        "In each step of neural network training, and due to the clever\n",
        "implementations of automatic differentiation, the backpropagation\n",
        "algorithm can compute a gradient for all parameters in (more-or-less) a\n",
        "single run. For all we know at this stage, the no-cloning principle\n",
        "prevents variational circuits from using these tricks, which leads to\n",
        "`n_training` in `circuit_evals_variational` depending on the number of\n",
        "parameters, but not in `model_evals_nn`.\n",
        "\n",
        "For the same example as used here, a neural network would therefore have\n",
        "far fewer model evaluations than both variational and kernel-based\n",
        "training:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 197,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "PhQiOZWj3fHR",
        "outputId": "c1983c41-9a62-4cd6-b284-71aad43f116f"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "2025"
            ]
          },
          "metadata": {},
          "execution_count": 197
        }
      ],
      "source": [
        "model_evals_nn(\n",
        "    n_data=len(X),\n",
        "    n_params=len(trained_params.flatten()),\n",
        "    n_steps=steps,\n",
        "    split=len(X_train) /(len(X_train) + len(X_test)),\n",
        "    batch_size=batch_size,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lW-D9kig3fHR"
      },
      "source": [
        "Which method scales best?\n",
        "=========================\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mICU026f3fHR"
      },
      "source": [
        "The answer to this question depends on how the variational model is set\n",
        "up, and we need to make a few assumptions:\n",
        "\n",
        "1.  Even if we use single-batch stochastic gradient descent, in which\n",
        "    every training step uses exactly one training sample, we would want\n",
        "    to see every training sample at least once on average. Therefore,\n",
        "    the number of steps should scale at least linearly with the number\n",
        "    of training data samples.\n",
        "\n",
        "2.  Modern neural networks often have many more parameters than training\n",
        "    samples. But we do not know yet whether variational circuits really\n",
        "    need that many parameters as well. We will therefore use two cases\n",
        "    for comparison:\n",
        "\n",
        "    2a) the number of parameters grows linearly with the training data,\n",
        "    or `n_params = M`,\n",
        "\n",
        "    2b) the number of parameters saturates at some point, which we model\n",
        "    by setting `n_params = sqrt(M)`.\n",
        "\n",
        "Note that compared to the example above with 75 training samples and 24\n",
        "parameters, a) overestimates the number of evaluations, while b)\n",
        "underestimates it.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9j20OPV03fHS"
      },
      "source": [
        "This is how the three methods compare:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 198,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 487
        },
        "id": "Neg50ctN3fHS",
        "outputId": "483ac16c-11f3-4dc9-cbf7-d51fe0cb2b64"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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5ZdffrHbT/v27Rk5ciSjR48mICCALl26OFTn0qVLqVGjBu7u7gwYMIDExER++OEHQkND8fPzY9SoUXb3eL7R/v376dChA15eXnh7e9O4cWN27dpl275161bat2+Pu7s7fn5+dOnShaioKABWrlzJXXfdha+vL6VKlaJnz56cPHkyx2PdeCo24z388ccf1KpVC09PT7p27UpERITtNenp6YwaNcp2jFdeeYVhw4bRp08fu3336tWLOXPm5HhsIUQxUEzG1WVWsoKdUpCacOcfSuW5xIEDB3L16lXWr19vWxcZGcnKlSsZMmQIAPHx8XTv3p21a9eyd+9eunbtSq9evbKEhcmTJ1O/fn327t3Lm2++edNjf/XVVzzzzDM8/vjjHDhwgCVLllC1atVcX/Pqq6/y3HPPceTIEbp06XJL+8hJq1atmDp1Kt7e3kRERBAREcGYMWOybbtlyxbc3d2pVauWw8d5/fXX+eijj9i1axdOTk52F/Js3ryZoUOH8txzz3H48GG++eYbZs6cyYQJE2xtjEYjn376KYcOHeKHH35g3bp1vPzyy3bHSExM5P333+fbb7/l0KFDBAUF5VjPSy+9xEcffcTOnTsJDAykV69ett7Q5ORkGjduzLJlyzh48CCPP/44Dz30EH/99ZfdPn744QfMZjNbt27l66+/dqjOTz/9lDlz5rBy5Uo2bNhA3759Wb58OcuXL+enn37im2++Yf78+TnWP2TIECpUqMDOnTvZvXs3r776Ks7OzgDs27ePTp06Ubt2bbZt28aWLVvo1auXLSgmJCTwwgsvsGvXLtauXYvRaKRv374O9XAmJiYyefJkfvrpJzZt2kR4eLjd983777/PrFmzmDFjBlu3biU2NjbbsaPNmjXjr7/+srvbjRCiGClG4+rsqCIsJiZGASomJibLtqSkJHX48GGVlJR0fWVKvFJjve/8IyXeoffVu3dv9cgjj9iWv/nmG1WuXDllsVhyfE1YWJj67LPPbMshISGqT58+Dh23XLly6vXXX89xO6AWLlyolFLq1KlTClBTp07N8z4yXrN3717buqioKAWo9evXK6WUWr9+vQJUVFSUUkqpGTNmKB8fn5vW/vHHH6vKlSvnqeaM42cca82aNbb2y5YtU4Dt+6ZTp07qvffes9vnTz/9pMqWLZtjLfPmzVOlSpWyLc+YMUMBat++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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "variational_training1 = []\n",
        "variational_training2 = []\n",
        "kernelbased_training = []\n",
        "nn_training = []\n",
        "x_axis = range(0, 2000, 100)\n",
        "\n",
        "for M in x_axis:\n",
        "\n",
        "    var1 = circuit_evals_variational(\n",
        "        n_data=M, n_params=M, n_steps=M,  shift_terms=2, split=0.75, batch_size=1\n",
        "    )\n",
        "    variational_training1.append(var1)\n",
        "\n",
        "    var2 = circuit_evals_variational(\n",
        "        n_data=M, n_params=round(np.sqrt(M)), n_steps=M,\n",
        "        shift_terms=2, split=0.75, batch_size=1\n",
        "    )\n",
        "    variational_training2.append(var2)\n",
        "\n",
        "    kernel = circuit_evals_kernel(n_data=M, split=0.75)\n",
        "    kernelbased_training.append(kernel)\n",
        "\n",
        "    nn = model_evals_nn(\n",
        "        n_data=M, n_params=M, n_steps=M, split=0.75, batch_size=1\n",
        "    )\n",
        "    nn_training.append(nn)\n",
        "\n",
        "\n",
        "plt.plot(x_axis, nn_training, linestyle='--', label=\"neural net\")\n",
        "plt.plot(x_axis, variational_training1, label=\"var. circuit (linear param scaling)\")\n",
        "plt.plot(x_axis, variational_training2, label=\"var. circuit (srqt param scaling)\")\n",
        "plt.plot(x_axis, kernelbased_training, label=\"(quantum) kernel\")\n",
        "plt.xlabel(\"size of data set\")\n",
        "plt.ylabel(\"number of evaluations\")\n",
        "plt.legend()\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "q5iOsnGW3fHS"
      },
      "source": [
        "This is the plot we saw at the beginning. With current\n",
        "hardware-compatible training methods, whether kernel-based training\n",
        "requires more or fewer quantum circuit evaluations than variational\n",
        "training depends on how many parameters the latter needs. If variational\n",
        "circuits turn out to be as parameter-hungry as neural networks,\n",
        "kernel-based training will outperform them for common machine learning\n",
        "tasks. However, if variational learning only turns out to require few\n",
        "parameters (or if more efficient training methods are found),\n",
        "variational circuits could in principle match the linear scaling of\n",
        "neural networks trained with backpropagation.\n",
        "\n",
        "The practical take-away from this demo is that unless your variational\n",
        "circuit has significantly fewer parameters than training data, kernel\n",
        "methods could be a much faster alternative!\n",
        "\n",
        "Finally, it is important to note that fault-tolerant quantum computers\n",
        "may change the picture for both quantum and classical machine learning.\n",
        "As mentioned in [Schuld (2021)](https://arxiv.org/abs/2101.11020), early\n",
        "results from the quantum machine learning literature show that larger\n",
        "quantum computers will most likely enable us to reduce the quadratic\n",
        "scaling of kernel methods to linear scaling, which may make classical as\n",
        "well as quantum kernel methods a strong alternative to neural networks\n",
        "for big data processing one day.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "obtp3eCY3fHS"
      },
      "source": [
        "About the author\n",
        "================\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since end of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "SOIzdbnn30P-",
        "outputId": "70fa25c6-cf18-4ba6-a10f-b43f8f880941"
      },
      "execution_count": 199,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since end of run: 1699853303.2473674\n",
            "Mon Nov 13 05:28:23 2023\n"
          ]
        }
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "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.9.18"
    },
    "colab": {
      "provenance": [],
      "machine_shape": "hm",
      "gpuType": "A100"
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}