├── lih ├── README.md ├── pyscf │ └── sto-3g │ │ └── LiH.hdf5 ├── lih.xyz ├── structure.xyz ├── lih_4qubits.ipynb └── lih_6qubits.ipynb ├── h2 ├── pyscf │ └── sto-3g │ │ └── h2.hdf5 ├── h2.xyz ├── structure.xyz ├── H2_qchem_VQE.ipynb └── H2_yamamoto_VQE.ipynb ├── images ├── qng_example.pdf └── qng_example.png ├── k_runs ├── pyscf │ └── sto-3g │ │ └── h2.hdf5 ├── h2.xyz └── structure.xyz ├── single_qubit_vqe ├── opt_paths_bloch.png ├── param_landscape.npy └── single_qubit_vqe_landscape.pdf ├── README.md ├── .gitignore └── run_vqe.py /lih/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /h2/pyscf/sto-3g/h2.hdf5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/h2/pyscf/sto-3g/h2.hdf5 -------------------------------------------------------------------------------- /images/qng_example.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/images/qng_example.pdf -------------------------------------------------------------------------------- /images/qng_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/images/qng_example.png -------------------------------------------------------------------------------- /lih/pyscf/sto-3g/LiH.hdf5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/lih/pyscf/sto-3g/LiH.hdf5 -------------------------------------------------------------------------------- /k_runs/pyscf/sto-3g/h2.hdf5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/k_runs/pyscf/sto-3g/h2.hdf5 -------------------------------------------------------------------------------- /lih/lih.xyz: -------------------------------------------------------------------------------- 1 | 2 2 | 62714 3 | Li 3.00000 0.00000 0.00000 4 | H 2.00000 0.00000 0.00000 5 | -------------------------------------------------------------------------------- /h2/h2.xyz: -------------------------------------------------------------------------------- 1 | 2 2 | in Angstrom 3 | H 0.00000 0.00000 -0.35000 4 | H 0.00000 0.00000 0.35000 5 | -------------------------------------------------------------------------------- /k_runs/h2.xyz: -------------------------------------------------------------------------------- 1 | 2 2 | in Angstrom 3 | H 0.00000 0.00000 -0.35000 4 | H 0.00000 0.00000 0.35000 5 | -------------------------------------------------------------------------------- /lih/structure.xyz: -------------------------------------------------------------------------------- 1 | 2 2 | 62714 3 | Li 3.00000 0.00000 0.00000 4 | H 2.00000 0.00000 0.00000 5 | -------------------------------------------------------------------------------- /single_qubit_vqe/opt_paths_bloch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/single_qubit_vqe/opt_paths_bloch.png -------------------------------------------------------------------------------- /single_qubit_vqe/param_landscape.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/single_qubit_vqe/param_landscape.npy -------------------------------------------------------------------------------- /h2/structure.xyz: -------------------------------------------------------------------------------- 1 | 2 2 | in Angstrom 3 | H 0.00000 0.00000 -0.35000 4 | H 0.00000 0.00000 0.35000 5 | -------------------------------------------------------------------------------- /k_runs/structure.xyz: -------------------------------------------------------------------------------- 1 | 2 2 | in Angstrom 3 | H 0.00000 0.00000 -0.35000 4 | H 0.00000 0.00000 0.35000 5 | -------------------------------------------------------------------------------- /single_qubit_vqe/single_qubit_vqe_landscape.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hsim13372/quantum_natural_gradient/HEAD/single_qubit_vqe/single_qubit_vqe_landscape.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Accelerating VQEs with Quantum Natural Gradient 3 | 4 | drawing 5 | 6 | This project repo was created as part of the [Quantum Open Source Foundation (QOSF)](http://qosf.org) Mentorship Program. 7 | 8 | Recently, several works, namely [Stokes et al.](https://arxiv.org/abs/1909.02108), have proposed and investigated the use of "quantum natural gradients" (QNG) to accelerate the optimization step of variational quantum algorithms. 9 | 10 | To provide an in-depth and intuitive explanation of quantum natural gradients, we wrote the following blogposts: 11 | 12 | 1. [Rethinking Gradient Descent With Quantum Natural Gradient](https://medium.com/@ziyu.lili.maggie/rethinking-gradient-descent-with-quantum-natural-gradient-330da14f621) by Maggie Li 13 | 14 | 2. [Gradient Descent from the Ground Up](https://medium.com/@lana.bozanic/quantum-natural-gradient-from-the-ground-up-983db57cbf6) by Lana Bozanic 15 | 16 | In addition, we provide several tutorials in this repo for running and analyzing VQE calculations of small quantum systems using quantum natural gradient. We implemented the code in [PennyLane](https://pennylane.ai/) and used routines from [QuTiP](http://qutip.org/) for visualization. 17 | 18 | 19 | ### Tutorials 20 | 21 | We investigate the following systems: 22 | 23 | 1. [Single qubit rotations](https://github.com/hsim13372/quantum_natural_gradient/blob/master/single_qubit_vqe/single_qubit_rotations.ipynb) (where we can visualize the optimization paths on the Bloch sphere) 24 | 2. [H2 molecule](https://github.com/hsim13372/quantum_natural_gradient/blob/master/h2/H2_qchem_VQE.ipynb). In this example, we construct the Hamiltonian using PennyLane's `qchem` module. We additionally provide a notebook that runs [Yamamoto](https://arxiv.org/abs/1909.05074)'s simplified Hydrogen example. 25 | 3. [LiH molecule](https://github.com/hsim13372/quantum_natural_gradient/blob/master/lih/lih_4qubits.ipynb) 26 | 27 | and ran VQE calculations using "vanilla" gradient descent and gradient descent that uses quantum natural gradients for comparison. 28 | We provide several methods for visualizing the performance and optimization paths, and we empirically explore the robustness of QNG to parameter initialization [here](https://github.com/hsim13372/quantum_natural_gradient/tree/master/k_runs). 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | # mac 132 | .DS_Store 133 | -------------------------------------------------------------------------------- /run_vqe.py: -------------------------------------------------------------------------------- 1 | 2 | """Module for launching VQE calculations.""" 3 | 4 | import numpy as np 5 | import pennylane as qml 6 | 7 | 8 | def run_vqe(cost_fn, max_iter, initial_params, opt_name, step_size, 9 | conv_tol=1e-6, diag_approx=False, lam=0, print_freq=20): 10 | """Launches a VQE calculation. 11 | 12 | Args: 13 | ===== 14 | cost_fn : VQECost 15 | VQE cost function we are trying to optimize 16 | max_iter : int 17 | Maximum number of optimization iterations 18 | initial_params : numpy.ndarray 19 | Vector of initial parameter values 20 | opt_name : str 21 | Name of optimizer. Valid options are: QNGOptimizer or GradientDescentOptimizer. 22 | step_size : float 23 | Stepsize or learning rate of the optimizer 24 | conv_tol : float 25 | Convergence tolerance for optimizer (relative improvement in energy) 26 | diag_approx : bool 27 | If using QNGOptimizer, diag_approx is an option for using the block-diagonal 28 | approximation to the Fubini-Study metric. If false, the diagonal approximation 29 | is used. 30 | lam : float 31 | Regularizer term for QNGOptimizer 32 | print_freq : int 33 | Optimizer progress printing frequency 34 | 35 | Returns: 36 | ======== 37 | energy_history : list/numpy.ndarray 38 | History of energies 39 | n : int 40 | Number of steps taken to optimize (could be less than max_iter if converged) 41 | 42 | """ 43 | energy_history = [] 44 | 45 | if opt_name =='GradientDescentOptimizer': 46 | opt = qml.GradientDescentOptimizer(stepsize=step_size) 47 | 48 | elif opt_name =='QNGOptimizer': 49 | opt = qml.QNGOptimizer(stepsize=step_size, diag_approx=diag_approx, lam=lam) 50 | 51 | else: 52 | raise ValueError('Use either QNGOptimizer of GradientDescentOptimizer.') 53 | 54 | params = initial_params 55 | prev_energy = cost_fn(params) 56 | energy_history = [prev_energy] 57 | 58 | for n in range(max_iter): 59 | params = opt.step(cost_fn, params) 60 | energy = cost_fn(params) 61 | conv = np.abs(energy - prev_energy) 62 | 63 | if n % print_freq == 0: 64 | print('Iteration = {:}, Energy = {:.8f} Ha, Convergence parameter = {' 65 | ':.8f} Ha'.format(n, energy, conv)) 66 | 67 | if conv <= conv_tol: 68 | break 69 | 70 | energy_history.append(energy) 71 | 72 | # Update energy 73 | prev_energy = energy 74 | 75 | print() 76 | print("Final value of the energy = {:.8f}".format(energy)) 77 | print("Number of iterations = ", n) 78 | 79 | return energy_history, n 80 | 81 | def run_single_qubit_vqe(cost_fn, dev, max_iter, initial_params, opt_name, 82 | step_size, conv_tol=1e-6, diag_approx=False): 83 | """Launches a VQE calculation for single-qubit systems, where we may be interested 84 | in plotting the optimization path on the Bloch sphere, and thus, need to save the 85 | statevector and circuit parameter history. 86 | 87 | Args: 88 | ===== 89 | cost_fn : VQECost 90 | VQE cost function we are trying to optimize 91 | dev : qml.Device 92 | Quantum simulator/device 93 | max_iter : int 94 | Maximum number of optimization iterations 95 | initial_params : numpy.ndarray 96 | Vector of initial parameter values 97 | opt_name : str 98 | Name of optimizer. Valid options are: QNGOptimizer and GradientDescentOptimizer. 99 | step_size : float 100 | Stepsize or learning rate of the optimizer 101 | conv_tol : float 102 | Convergence tolerance for optimizer (relative improvement in energy) 103 | diag_approx : bool 104 | If using QNGOptimizer, diag_approx is an option for using the block-diagonal 105 | approximation to the Fubini-Study metric. If false, the diagonal approximation 106 | is used. 107 | 108 | Returns: 109 | ======== 110 | energy_history : list/numpy.ndarray 111 | History of energies 112 | n : int 113 | Number of steps taken to optimize (could be less than max_iter if converged) 114 | state_history : list 115 | History of state vectors/wavefunctions 116 | param_history : list 117 | History of parameters 118 | """ 119 | energy_history = [] 120 | 121 | if opt_name =='GradientDescentOptimizer': 122 | opt = qml.GradientDescentOptimizer(stepsize=step_size) 123 | 124 | elif opt_name =='QNGOptimizer': 125 | opt = qml.QNGOptimizer(stepsize=step_size, diag_approx=diag_approx) 126 | 127 | else: 128 | raise ValueError('Use either QNGOptimizer of GradientDescentOptimizer.') 129 | 130 | params = initial_params 131 | prev_energy = cost_fn(params) 132 | energy_history = [prev_energy] 133 | state_history = [dev.state] 134 | param_history = [params] 135 | 136 | for n in range(max_iter): 137 | params = opt.step(cost_fn, params) 138 | energy = cost_fn(params) 139 | conv = np.abs(energy - prev_energy) 140 | 141 | if n % 20 == 0: 142 | print('Iteration = {:}, Energy = {:.8f} Ha, Convergence parameter = {' 143 | ':.8f} Ha'.format(n, energy, conv)) 144 | 145 | if conv <= conv_tol: 146 | break 147 | 148 | energy_history.append(energy) 149 | state_history.append(dev.state) 150 | param_history.append(params) 151 | 152 | # Update energy 153 | prev_energy = energy 154 | 155 | print() 156 | print("Final value of the energy = {:.8f}".format(energy)) 157 | print("Number of iterations = ", n) 158 | 159 | return energy_history, n, state_history, param_history 160 | -------------------------------------------------------------------------------- /h2/H2_qchem_VQE.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Running a VQE Simulation for H2 using pennylane qchem tools." 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Import all necessary pennylane packages, as well as our user-defined run_vqe function, which serves to shorten the notebook & make the code cleaner." 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "%matplotlib inline\n", 24 | "from matplotlib import pyplot as plt\n", 25 | "\n", 26 | "import sys\n", 27 | "sys.path.append('../')\n", 28 | "from run_vqe import *\n", 29 | "\n", 30 | "import pennylane as qml\n", 31 | "import numpy as np" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "Use pennylane's qchem tools to generate our hamiltonian from the h2.xyz file. " 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 2, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "name": "stderr", 48 | "output_type": "stream", 49 | "text": [ 50 | "/anaconda2/envs/py37/lib/python3.7/site-packages/pyscf/scf/chkfile.py:31: H5pyDeprecationWarning: The default file mode will change to 'r' (read-only) in h5py 3.0. To suppress this warning, pass the mode you need to h5py.File(), or set the global default h5.get_config().default_file_mode, or set the environment variable H5PY_DEFAULT_READONLY=1. Available modes are: 'r', 'r+', 'w', 'w-'/'x', 'a'. See the docs for details.\n", 51 | " with h5py.File(chkfile) as fh5:\n", 52 | "/anaconda2/envs/py37/lib/python3.7/site-packages/pyscf/lib/misc.py:876: H5pyDeprecationWarning: The default file mode will change to 'r' (read-only) in h5py 3.0. To suppress this warning, pass the mode you need to h5py.File(), or set the global default h5.get_config().default_file_mode, or set the environment variable H5PY_DEFAULT_READONLY=1. Available modes are: 'r', 'r+', 'w', 'w-'/'x', 'a'. See the docs for details.\n", 53 | " h5py.File.__init__(self, filename, *args, **kwargs)\n" 54 | ] 55 | } 56 | ], 57 | "source": [ 58 | "name = 'h2'\n", 59 | "geometry = 'h2.xyz'\n", 60 | "charge = 0\n", 61 | "multiplicity = 1\n", 62 | "basis_set = 'sto-3g'\n", 63 | "\n", 64 | "hamiltonian, nr_qubits = qml.qchem.generate_hamiltonian(\n", 65 | " name,\n", 66 | " geometry,\n", 67 | " charge,\n", 68 | " multiplicity,\n", 69 | " basis_set,\n", 70 | " n_active_electrons=2,\n", 71 | " n_active_orbitals=2,\n", 72 | " mapping='jordan_wigner'\n", 73 | ")" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | "Define our device and ansatz" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 3, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "dev = qml.device(\"default.qubit\", wires=4)\n", 90 | "\n", 91 | "\n", 92 | "def ansatz(params, wires=[0, 1, 2, 3]):\n", 93 | " qml.BasisState(np.array([1, 1, 0, 0]), wires=wires)\n", 94 | " for i in wires:\n", 95 | " qml.RZ(params[3 * i], wires=i)\n", 96 | " qml.RY(params[3 * i + 1], wires=i)\n", 97 | " qml.RZ(params[3 * i + 2], wires=i)\n", 98 | " qml.CNOT(wires=[2, 3])\n", 99 | " qml.CNOT(wires=[2, 0])\n", 100 | " qml.CNOT(wires=[3, 1])" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "Create our cost function using pennylane's VQECost function, and initialize all our constants for the upcoming optimization." 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 4, 113 | "metadata": {}, 114 | "outputs": [], 115 | "source": [ 116 | "cost = qml.VQECost(ansatz, hamiltonian, dev)\n", 117 | "\n", 118 | "init_params = np.random.uniform(low=0, high=2*np.pi, size=12)\n", 119 | "max_iterations = 500\n", 120 | "step_size = 0.5\n", 121 | "conv_tol = 1e-06" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 5, 127 | "metadata": {}, 128 | "outputs": [ 129 | { 130 | "name": "stdout", 131 | "output_type": "stream", 132 | "text": [ 133 | "[6.16828138 3.32277067 5.51539484 0.64483205 0.08497558 5.05467899\n", 134 | " 0.23961822 0.8396981 1.52781316 1.73926654 0.97624871 4.81202693]\n" 135 | ] 136 | } 137 | ], 138 | "source": [ 139 | "print(init_params)" 140 | ] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "metadata": {}, 145 | "source": [ 146 | "Run both VQE runs using our user-defined run_vqe function, which takes the arguments cost_fn, max_iterations, inital_params, type of optimizer, and optimization step size. To understand more about how this condensation works check out run_vqe.py located in this folder." 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 11, 152 | "metadata": {}, 153 | "outputs": [ 154 | { 155 | "name": "stdout", 156 | "output_type": "stream", 157 | "text": [ 158 | "Iteration = 0, Energy = -0.29539266 Ha, Convergence parameter = 0.05328693 Ha\n", 159 | "Iteration = 20, Energy = -0.96063151 Ha, Convergence parameter = 0.03788994 Ha\n", 160 | "Iteration = 40, Energy = -1.11703202 Ha, Convergence parameter = 0.00013639 Ha\n", 161 | "Iteration = 60, Energy = -1.11742722 Ha, Convergence parameter = 0.00000300 Ha\n", 162 | "Iteration = 80, Energy = -1.11751073 Ha, Convergence parameter = 0.00000570 Ha\n", 163 | "Iteration = 100, Energy = -1.11767957 Ha, Convergence parameter = 0.00001156 Ha\n", 164 | "Iteration = 120, Energy = -1.11801862 Ha, Convergence parameter = 0.00002301 Ha\n", 165 | "Iteration = 140, Energy = -1.11868127 Ha, Convergence parameter = 0.00004422 Ha\n", 166 | "Iteration = 160, Energy = -1.11991028 Ha, Convergence parameter = 0.00007942 Ha\n", 167 | "Iteration = 180, Energy = -1.12198174 Ha, Convergence parameter = 0.00012638 Ha\n", 168 | "Iteration = 200, Energy = -1.12496343 Ha, Convergence parameter = 0.00016605 Ha\n", 169 | "Iteration = 220, Energy = -1.12839723 Ha, Convergence parameter = 0.00016955 Ha\n", 170 | "Iteration = 240, Energy = -1.13145442 Ha, Convergence parameter = 0.00013320 Ha\n", 171 | "Iteration = 260, Energy = -1.13360320 Ha, Convergence parameter = 0.00008460 Ha\n", 172 | "Iteration = 280, Energy = -1.13487153 Ha, Convergence parameter = 0.00004672 Ha\n", 173 | "Iteration = 300, Energy = -1.13554358 Ha, Convergence parameter = 0.00002385 Ha\n", 174 | "Iteration = 320, Energy = -1.13587924 Ha, Convergence parameter = 0.00001168 Ha\n", 175 | "Iteration = 340, Energy = -1.13604193 Ha, Convergence parameter = 0.00000561 Ha\n", 176 | "Iteration = 360, Energy = -1.13611964 Ha, Convergence parameter = 0.00000267 Ha\n", 177 | "Iteration = 380, Energy = -1.13615649 Ha, Convergence parameter = 0.00000126 Ha\n", 178 | "\n", 179 | "Final value of the energy = -1.13616411\n", 180 | "Number of iterations = 387\n" 181 | ] 182 | } 183 | ], 184 | "source": [ 185 | "vanilla_run, vanilla_n = run_vqe(cost_fn=cost, \n", 186 | " max_iter=max_iterations, \n", 187 | " initial_params=init_params, \n", 188 | " opt_name='GradientDescentOptimizer', \n", 189 | " step_size=step_size)" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": 9, 195 | "metadata": {}, 196 | "outputs": [ 197 | { 198 | "name": "stdout", 199 | "output_type": "stream", 200 | "text": [ 201 | "Iteration = 0, Energy = -0.44366386 Ha, Convergence parameter = 0.20155814 Ha\n", 202 | "\n", 203 | "Final value of the energy = -1.13618891\n", 204 | "Number of iterations = 19\n" 205 | ] 206 | } 207 | ], 208 | "source": [ 209 | "qng_run, qng_n = run_vqe(cost_fn=cost, \n", 210 | " max_iter=max_iterations, \n", 211 | " initial_params=init_params, \n", 212 | " opt_name='QNGOptimizer', \n", 213 | " step_size=step_size, \n", 214 | " diag_approx=False, lam=0.001)" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": {}, 220 | "source": [ 221 | "All that's left is to plot the results! As expected, the QNG out-perfomed the vanilla gradient descent optimization method. " 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 14, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [ 230 | "exact_value = -1.136189454088" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "execution_count": 17, 236 | "metadata": {}, 237 | "outputs": [ 238 | { 239 | "data": { 240 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAFJCAYAAABU5W56AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xd4VFXixvHvlEzLhJBAADWioCIKKgYsSFMkRERAWRUQowi6yFp2bUhRlCJFsayowGJBsQDWhV2RIosoRH+KBoxgVxALggRJn8zM/f0xJBAIEJKZTHs/z5OHTLlzz+FC3px7mskwDAMRERGJSOZwF0BEREQOTkEtIiISwRTUIiIiEUxBLSIiEsEU1CIiIhFMQS0iIhLBrOEuwL62by8I+mempLjIzy8O+ueGi+oT+WKtTrFWH4i9OsVafSD26nSo+qSlJR3y2JhvUVutlnAXIahUn8gXa3WKtfpA7NUp1uoDsVenutQn5oNaREQkmimoRUREIpiCWkREJIIpqEVERCJYSEd9f/rppyxYsACAsWPH0qBBg1CeTkREJOaEtEW9cOFCJkyYwOWXX87bb78dylOJiIjEpJAGtc/nw263k5aWxvbt20N5KhERkZgU0qB2Op14PB62b99O48aNQ3kqERGRmFTroF6/fj3Z2dkA+P1+xo0bx4ABA8jOzmbz5s0AXHnllYwbN4758+fTt2/f4JRYREQkjpgMwzCO9KA5c+awaNEinE4nCxcuZNmyZaxcuZKpU6eSm5vL7NmzmTlz5hEXxuv1xdxqNCIiInVRq1HfzZs3Z8aMGYwcORKAdevW0aVLFwDatWtHXl5erQoTzHVd8wtLmPh0Ho/c2RG83qB9brilpSWFZE30cIm1+kDs1SnW6gOxV6dYqw/EXp0OVZ+QrPWdlZWF1bo34wsLC3G73ZWPLRYL3jCH4/NLNvLi5O6c3/t3fL6wFkVERKTWgjKYzO12U1RUVPnY7/dXCfJwuOiCJDhxCRtzjmPiRHtYyyIiEmtKS0uZO/dpsrOvpEePzvTtm8WYMXeRl7eh8j2ffvoJnTt3YObMGQcc/+uvv9C5cwfWr8+t8vyPP/7AlCkT6N69Oxdc0JFLLslkzJi7+OKL2t2pjQVBCeqMjAxWr14NQG5uLq1atQrGx9ZJq0Yn4h40HFvT73nqKRvz50fUjp4iIlGroKCA4cOvY+nSt7nuur8yb95Cpk17hOTkZG666Qb++99FVd4/f/6LfPnlpsN+7kcf5XD99dkUFBQwZcoUXnnlTaZP/yepqancdNP1fPLJ/4WqShEtKOmVmZnJmjVrGDhwIIZhMHny5GB8bJ2YTWbaNW/BB1f0osG8Tdx5p4OWLYs5+2x/uIsmIhLVZsx4hMLCAp577iUaNEgG4KijjuaUU9qQmtqIhx+exumnt6t8f9OmzZgyZTzPPPPiQe+2FhYW8sAD99O5czfuv/+Byj7dZs2a0br1qXg8HmbNeoKnn36hXuoYSWrdok5PT2fhwoWBDzGbmTBhAvPnz2fBggWccMIJQStgXZyRdiY0/prbp36MzwdDhjjZssUU7mKJiEStgoICli9/h4EDr64M6X1de+0wEhKsLF78ZuVzd9wxii1bNvP8888c9HNXrlxOfv5O/va3W6t9/W9/+zuPPHLgLfR4ENP3gzOatgegqPm/mTTpDEaPdtC/v4vXXy/muOOOeFaaiEhI3L/2HhZ/91atjzebTfj9tfuZ1ueES7n/vEk1fv+XX35BeXk5p512RrWv22w22rQ5nc8/38C553YCoEWLllx77TDmzn2a88+/kBNOOPGA49av/4z09GNp0qRptZ/bsGHDGpcx1sT07lnnH9sdu8XOv799g6FDPdx1VxlbtpjJynKxdKnma4uIHKldu3YBkJR08ClFycnJ7NqVX+W5q68ewvHHt2TKlAn4qpmKk5+/84AwfvfdZWRmdqny9dtvvwWhFtElplvUSbYG9G7Vmzc2vcGmnRu56642NGliMGaMnexsF1lZXiZOLOX449W6FpHwuf+8SUfUqt1ffc45rgjT3bv/5Jhj0qt9T0HBbtzuqkFutVoZM2YcN9xwLS+/PI8ePXpWeb1Bg2S2basawh07dua5514G4KuvNnHffWMwjPgbZxTTLWqAgW0GAvDoJw9hGAbXXlvOihXFnHeel6VLrXTunMh999nZ80uiiIgcQuvWbbDZbGzYkFvt6x6Ph40bv6BNm7YHvNaqVWuuuuoanntuDlu2bK7y2mmnncFPP21h584/Kp9zuVykpx9LevqxNG7cJLgViSIxH9SXnXIZZzc7l39/9wZvfPMqAKec4ufNN0uYPbuEpk0NZs60cd55ibzzjm6Hi4gcSlJSEllZF7Ngwcv8+WeghVNQUMAVV/Rj4cKXefnlFygqKuTSSy+v9vjrrruBo48+hocfnlrl+czMLBo0SGbWrCeqPW779m3BrUgUifmgtpqtPNnjX5gw8fwXz1Y+bzLBZZd5WbOmiLFjyygoMHHNNS6mTrVx5Kufi4jEj5tv/gepqY248cahrFy5gsLCAv7ylyt48sl/8vTTsxg0KJvjj29R7bE2m43Ro8fx22+/Vnm+QYNk7rtvEu+9t5KRI//BBx98wG+//crGjXn8858PM2nSfZx0UisaNGhQH1WMKDHdR13huAbHc+7R5/HhL2v5tfAXjnIfXfmawwF//7uHnj29XHutk0cesVNcbGL8+DJMmsklInKAxEQ3Tz45h4ULX+a55/7FL7/8jNPp5JxzOnL00cfw+usLKCsro3PnrtUe36ZNW6688irmz3+xyvNnnXUOzz33MgsXvsz48eP57bffsNsdnHxya+6++x4yMy8K+6qX4VCr3bNCJRSDISoGWTybN4dRq+9gYqcpDD/jpmrf+/vvJv7yFydffWVh6tRShg4tD3p56iqeFqqPVrFWp1irD8RenSKtPlu2bOajj3K44oqBtf6MSKtTXdX7phzRqEfzwAjDdds+Puh7mjQxeOWVEho39nPPPXY+/zxu/npERIKmefPj6hTSUlXcJFF60rE4LA6+2/Xdod+XbvDEE6V4vSb+8Q9HLO2QKSIiUShugtpsMtMi+QS+//M7Dne3v3t3HwMGlPP55xbmz0+opxKKiIgcKG6CGuCEhidSVF7I78WHH+Y/dmwZTqfBgw/aKCmph8KJiIhUI+6CGuC7Xd8e9r3Nmhlcf72H334zs3ChWtUiIhIe8RnUfx4+qAH++tdybDaDWbNs+ONv1ToREYkAcRXULZMDQf39YQaUVWja1OAvf/Hy3XdmVq3SqmUiIlL/4iqoj2twHABbC36q8THXXOMB4JVXdPtbRETqX1wFdYojFYD8svzDvHOvjAw/J5/sY8kSKzt3hqpkIiIi1YuroLZZbCQmuMkvrXnimkwwYEA5Ho+J//xHrWoRiW+33DKcv/51yEFfv/XWGxk58ragnGvx4rfo3v08ALxeL507d2DFiqUATJhwL7fffkudz7Fs2Tvccstweve+kO7dz2PQoP7MmvUEBQV7VxHbuvUnOnfuUOWrR4/OXHfdVbz55muHnfJbV3EV1AAp9pQjCmqAfv0Cq54sWhR/a8yKiOzr4ov7sHFjHj//vPWA17Zt+43PPltH7959g3Kunj0v4rXXFgfls6ozefJ4HnpoMmef3ZEZM2bz8suv87e/3UpOzhpuvvmvlJWVVXn/Qw89xr///Q5vvbWEOXNe4MILe/L44w8fdMevYIm/oHaksvMIg/rYYw0yMnysWWPhjz+0U4eIxK8LLuiBy5XIu+8uO+C1ZcveoWHDFDp16hKUc9ntDlJTGwXls/a3dOnbvP32YqZMmU529hBatjyRZs2OokuX83n88Zls2/YbS5b8p8oxSUnJNGrUmMaN02jRoiVXXz2EG24YwSuvzGPLlh9DUk6I06Au9hZR5is7/Jv30adPOT6fiWXLNPpbROKXw+Gge/celbeg97V06dv07Nmrcoerr7/+kttvv4WsrG6cf/65XHXVX1i2bEnl+0eMGMa//vUU48ffQ2ZmV3r16s5jj03Hu2ft5n1vfR/Ou+8uZ9iwbLp378SFF3ZixIhhfPnlpoO+/7XXFnDOOefRocPZB7yWnNyQZ56ZR58+lx72vP369cdqtbJy5YoalbM24i+o7SkA7Cqt+YAygMxMHwD/+59uf4tIfLv44j58//13fP/93jUpvvrqS3788fvK297FxUXcfvvNNGvWjDlzXuD55+fTtu3pTJ06iV27dlUe98or82jZ8gTmzn2ZW265jddfX8CqVe8eUXny8jYwfvxY+vTpx0svvcqMGbPxer089NDkat/v8Xj48suNtG/f4aCfecwx6Vgsh2+YJSa6adq0Gd9/X7Npv7URd6mT4ggE9c7SnTRNbFbj4046yU96up9Vq6z4fFCD6yciUiP3329n8eLa/zg2m8HvT6zVsX36eLn//iO7w3j66e1IT2/O8uVLGT48sD7F0qX/5ZRT2tCy5QkAlJaWMnDg1VxxxSDsdjsA2dnX8fbbi9m6dQsNGzYEoHXrU8jOvg4IhOP8+S+Sl/c5cHmNy5OQYOPOO0fTt+9lABx11NH06XMpjz76YLXvz8/fiWEYJCc3rPL8HXfcyoYNn1U+PvPMDjz44KOHPX9SUgOKiopqXN4jFXdBnVoxResI+6lNJrjgAi/z5tn47DMzHTpoqTIRiV+9e/dh8eK3GD78Jnw+HytWLGPo0BsqX09NbcSll17O228v5ptvvmLr1p/4+uuvAPD59v78PPbY46p8bmKiG6+3/IjKcvLJrUlKSmLevOf48cfv2bJlC9999w3+gywpWRHQu3fvrvL8qFH3VA4gmznzcQoLaxa+xcVFHHXU0UdU5iMRd0HdcJ8W9ZHq3t3HvHmwcqWVDh08wS6aiMSp++8vO+JW7b7S0pLYvj10LbrqXHRRb+bMmckXX+Sxe/efFBUV0qPHRZWv//77Nm68cShNmzbjvPO60KlTV1JSUg6Y2pWQcOC01yOd7vTxxx8ycuRtdO16Aaeddjq9e/fjhx++5/HHH672/Q6Hg5NOasWGDZ8xaNDVlc+npTWp/N7lSqxRUBcXF/PTT1vo1euSIyrzkYi7oE6xB1rUu45g0ZMKXbp4sVoN/vc/KyNHKqhFJH6lpTXhrLPO5X//W8GuXfl069Ydt9td+fqyZUvweMp48sk5mM2B4VBr136w59XgzjueP/9lOnbszPjxe/ukc3LWHDLwr7hiENOmTWL9+s8444wzq7xmGAY7dmyv0bkXLXoDgO7dM2tR8pqJu6CuuPVdmxZ1gwZw1lk+PvzQws6dkJoa7NKJiESPiy/uw+zZgcVBJk2aVuW1Jk2aUVBQwOrV/6N161P5+uuveOyxh4DAYK5gatKkKZ988hFffJFHw4YNWbPmfV5/fQF+vx+v11s5Cn3/suflbeD222/m6quH0LlzV9zuJL7++qs9/eQbGDZseJVjCgr+5I8/dmAYUFCwm5ycD3j66Vlce+0w3foOppRa9lFX6N7dR06Olffes3LZZd5gFk1EJKp06dKNhx+eitvtJiOj6gjqHj168tVXG5k+fSplZaWkpx/LDTeM4Nln/8WXX27krLPOCVo5/vrXEeTn/8Ftt92ExWLhpJNaMWbMfdx//1i+/HIjbdueXu1xI0eOpWPHTvz732/wxhuvUlhYQOPGaWRkdOD220dy0kknV3n/XXf9o/L7hg0bctxxLRg1ahw9e160/0cHlckI9dpnR2D79oLDv+kIBfpu9n7ud7u+oePL7bmqdTaPdX/yiD/vs8/MZGUlcs01HqZPr32fUm3tX59oF2v1gdirU6zVB2KvTrFWH4i9Oh2qPmlpSYc8Nu7mUTe0H/nGHPs67TQ/iYkGOTmanyUiIqEXd0GdmBCYa1hcXrsRklYrnH22j2++sbB9u5YTFRGR0Iq7oLZb7JhNZkq8JbX+jI4dA6uUffihWtUiIhJacRfUJpMJp9VFsbe41p9x7rmBoNbtbxERCbW4C2oAl9VFSR2C+swzfTgcBmvXKqhFRCS06iWoc3JyGDt2bH2cqkacCS6Ky2sf1HY7tG/vY9MmM/m1G5MmIiJSIyEP6s2bN7Np06YDNuAOp8Q6tqgh0E9tGCY++kitahERCZ2gB/XcuXMZPnw4w4cPZ+bMmRx33HEMHTo02KepE6fVWacWNewdUJaTE3drxoiISD0KesoMGTKEIUOGBPtjg8qVkIjH78Hr92I11+6voH17HwkJmk8tIiKhdUQt6vXr15OdnQ2A3+9n3LhxDBgwgOzsbDZv3hySAoaCy+oCqNPtb5cL2rXzs2GDmcLCYJVMRESkqho3J+fMmcOiRYtwOp0ArFixAo/Hw4IFC8jNzWXq1KnMnDnzoMdPnz79sOdISXFhtQa/hbr/8mwN3Q0AcCVbSHMfeum2Q+nRAz7+GL76KomLQrvUaxWHW24u2sRafSD26hRr9YHYq1Os1Qdir061rU+Ng7p58+bMmDGDkSNHArBu3Tq6dOkCQLt27cjLy6tVAfaVn1+3fuPqVLe+qsVnA2DLb9uwJCfW+rPPOMMCuFiypIz27etn28t4Wv82WsVanWKtPhB7dYq1+kDs1ale1vrOysqqslVYYWFhlb1HLRYLXm907CbltAbuCtRldTIIbHlpsRisXasBZSIiEhq1HvXtdrspKtq7Xrbf7692z89I5Krjet8VkpLg9NP95OaaKarbR4mIiFSr1kGdkZHB6tWrAcjNzaVVq1ZBK1SoBatFDYFpWl6viU8+0ehvEREJvloHdWZmJjabjYEDBzJlyhRGjx4dzHKFlMu6p0Vdx0VPAM47L3C7X9O0REQkFI7oXnV6ejoLFy4EwGw2M2HChJAUKtRcCXumZ9Vx0ROAc87xYTJp3W8REQmNuNyUo+LWdzBa1MnJ0Latn08/tVBS9zvpIiIiVcRlUCfuGUxW1/W+K5x3ng+Px8Snn6pVLSIiwRWXQV3Roi4Kwq1v2Lvut25/i4hIsMVlUFcMJgtWi7pjRy8mk8Hq1QpqEREJrrgM6so+6iC1qFNSICPDzyefWNi9OygfKSIiAsRpULuC3EcNcMEFXnw+E6tXR8eiLyIiEh3iNKgD07OCMeq7QvfugfnU//ufbn+LiEjwxGVQOyu3uQzefKozz/TTsKHBypVWDCNoHysiInEuLoO6Yj/quq71vS+LBc4/38vPP5v5+uu4/GsVEZEQiMtEcVgdQHBb1LD39vfKlbr9LSIiwRGXQW02mbFb7JQGOagvuCAwn3rFCg0oExGR4IjLoAZwWJ2UeEuD+plNmxq0b+9jzRoLO3aYgvrZIiISn+I3qC0OSn3BX5y7b99y/H4T//2vWtUiIlJ38RvUVgelQW5RA/TpE+infustBbWIiNRd3Aa10+oMeh81QHq6QceOXtassfLDD7r9LSIidRO3QR249R38FjXA4MHlALzySkJIPl9EROJH/Aa11UmJtwQjBKuT9OnjJTnZ4MUXE7RHtYiI1EkcB3VgLnWZryzon+10wrXXetixw8z8+WpVi4hI7cVxUAd20ApFPzXAX/9ajsNh8MQTNkpDc4ddRETiQNwGtdMSaFGHqp+6SRODoUPL+eknMzNn2kJyDhERiX1xG9QVLepgLyO6r9tvL6NxYz+PPmrjyy/j9q9aRETqIG7To6KPOhRzqSs0aADTp5dRWmri+usd7NoVslOJiEiMit+gtoS2j7rCxRd7GT7cw9dfWxg40MX27ZpbLSIiNRe3Qe20hraPel/jx5cxYEA5n35qoUcPF//5j/asFhGRmonbdS7ro4+6gtkMjz9eykkn+Zk2zcbQoU5atfJxySVeunf3cuqpftzukBdDRESiUBwHdej7qPdlMsGtt3ro1cvLww/bWLzYyiOP2HnkETsARx3lJy3NICXFIDXVwOGAhAQDmw0SEsBmM7BYIDERiottmEwc9qvivCaTgckU+IVh39f3fWw27/0KPK56zL6vm/fch9n72Kjyvn3fv//3JpNR5XMaNYLdu81YrYH6Wixgte792ve5hIS95xYRiRfxG9QVfdQh2EHrUE46yc+sWaVMnw7vvWdlzRoLX39t5ocfzHz7rZni4pr0YdtDXs76lVjjd5pMRmVo7w11o0q4W60GdjvY7eBwVHwf+OWn6vfVv8/pBLfbIDEREhMNEhMN3O7A9y7X3l+CRETqQ/wGdT23qPfndkPv3l569/ZWeb6kBHbtMlFaCuXlJjwe8HqhrMyE3w/JyS7y84sxDA76BQd/ze83HeT5ql/7vr/i8b6v7f9c4CuQYAf/rH2PC3yu3W6joMCD1ws+X6DOe78P/On1mvb5PvCeiu/3fgWOKykJvF5WZqKsLPB9MJlMgQCvCHK328DtNkhODtwNadgQ0tMhISFhz+PAV8X3iYkKehE5MnEb1M567KM+Ek4nOJ0VI80OHHGWlgbbt/vqt1AhlJZmY/v24C/jWsHng7Kyiq/AL0AeTyDES0upDPTSUlPl+4qLTRQVmSgsZM+fJoqKoLCw6nN//gm//GKmpKS65HVUWx6Hw6BJE4O0NIOmTf00aWLQtKmx58+qjy2WkP21iEgUidug3ruEqNb3jGUWC7hcga+9v/gEd8i91wt//mli1y7IzzdhGIn8+GMJu3aZyM83Vflzxw4T27ebWL/ejNd78CROSDA4+miD5s39HHusn2OPNTj2WD/Nmxukp/s56igFuUi8iN+grlxCNLJa1BJ9rFZo1MigUSMAY89dD+8hj/H7A6G+bZuJ33+v+NNc+f1PP5n56ScT779f/X9Ru92gZUs/J5544FdSUvDrKCLhE7dBbQ9zH7XEt8CId4NGjQxOPfXg7yspgZ9/rgjuQHhv2RIYfPjNN2Y2bTqwWX3UUX7atPHTtq2P007z06aNj+OPNzRiXiRKxW1QV27KEWF91CL7cjrhxBMNTjzRB1Qdm2AYsG2biW++CcwYqPj66iszK1ZYWbFi73/vxESDNm18tG3r58wzfZx1lo8WLQwNbBOJAiEN6pycHP773/9SUlLCDTfcQOvWrUN5uiOyd8ETtaglOplM0KyZQbNmPrp0qRrif/xh4osvzOTlmcnLs/DFF2bWrbPwf/+39798o0Z+2rf306GDjw4dfJx5po/Ems+UE5F6EtKgLikpYeLEiWzatIkPPvggwoJafdQSuxo1Muja1UfXrj6gHAiMct+0KRDYn3wS+Fq2zMqyZYEfAwkJBhkZPjp3DgR/+/Y+7LE2ZV8kCgU1qOfOnUtOTg4A7dq1Y8SIERQXFzNv3jzuvPPOYJ6qzjTqW+KNwwFnnunnzDP9XH99ILy3bTNVhvbatRY+/tjCRx9ZefjhwFSys8/20asXdOxo5pRT/LpVLhIGQQ3qIUOGMGTIkMrHO3fu5KGHHuLWW2+lUWBIbMRQH7UING1qVFl4588/ISfHwgcfWHn/fQurV1tZvRogkWOO8ZOZ6SUz00vnzj6czrAWXSRu1Hgc6Pr168nOzgbA7/czbtw4BgwYQHZ2Nps3b672mKlTp7J9+3Yefvhh3nnnneCUOEgq+6jrYfcskWiRnAwXXeRj0qQy3nuvmC++KOTFF6F//3IKC03MnWtj8GAXJ5/sZvBgJy+/bCU/P9ylFoltNWpRz5kzh0WLFuHc8yv0ihUr8Hg8LFiwgNzcXKZOncrMmTMPOO7BBx8MbmmDKMGcgNlkVota5BDS0gwGD4aePUvxeuGTTywsX25h+XJr5deddwb6w/v1K6dXLy8NG4a71CKxxWQYh98ZeenSpZx88smMHDmShQsXMmXKFE4//XR69+4NQJcuXXj//ffrXBiv14fVWn/LLbknuzm58cms++u6ejunSKz47jt47TV49VVYt+e/kNUKmZkwaBD0749GkYsEQY1a1FlZWWzdurXycWFhIe59NlC2WCx4vV6s1rp1eefnF9fp+OqkpSWxfXtBta85LA4KS4sO+nokOlR9olGs1Qdir04Hq0+DBjB0aODrhx9MLF6cwKJFVpYssbBkCYwYYdC3r5eBA8s55xxfRC24Ei/XKJrFWp0OVZ+0tEMvJ1ir/zput5uioqLKx36/v84hHQ4Oq1OjvkWCoEULg1tv9bBiRTEffljIHXeUkZpq8MorCfTr5+LssxN56CEbW7Zo2LjIkapVUGdkZLA6MBSU3NxcWrVqFdRC1Re7xU6pBpOJBFXLlgZ33+3h44+LePPNYgYMKGfHDhMPPWTnrLMSueoqJ8uWWfDFziZwIiFVq2ZwZmYma9asYeDAgRiGweTJk4NdrnrhsDrZUbIj3MUQiUlmM3Tq5KNTJx9TpsB//mPlhRdslcubHnusn2uvLWfQoHLS0oK7o5lILKnRYLL6Eor+iEP1C/R6vTufb9/A1hujJ6zjqd8mWsVanYJdn88/NzN3bgKvv55AcbGJhASDPn28DB/u4cwz/UE7z6HoGkW+WKtTvfdRxwq7xYHH78Fv1M8PBxGB007z8/DDZWzYUMiUKaW0aOHnjTcSyMpKpF8/J++8Y8Gv/5IileI6qB3a6lIkbBo0gGHDynn//WJefbWY7t295ORYueYaF506JTJ3bgIlWuZAJM6D2rJnvW9tzCESNiYTdOvmY/78ElavLuKqqzz89JOJkSMdZGQk8vDDNv78M9ylFAmf+A5qa2BroDJvWZhLIiIArVv7eeyxMtatK+K228rw+01Mm2YnI8PNlCk2/vhD07sk/sR3UFsq1vtWi1okkjRtajB6tId16woZN64Uu93g0UfttG+fyH332dm2TYEt8SO+g1p91CIRze2Gm28u55NPinjggVKSkw1mzrTRoUMiY8YosCU+xHVQ2/dsdVmmoBaJaC4X3HBDOf/3f0U89FApTZoYPP20jXPOSWTSJJt28JKYFtdB7axoUWt1MpGoYLfDtdeWk5NTxLRppSQlGTz+uJ2zznLz6KM2CgvDXUKR4IvroK5oUZdoq0uRqGKzwXXXBVrY991XitVqMGWKnbPPTmT27ARK9bu3xJC4DmqHNTCYrMynUd8i0cjphJtuKufjj4sYObKM0lIT997r4NxzE1mwwKqFUyQmxHlQVwwmU4taJJolJcGdd3r45JNCbr6CYNwlAAAe5klEQVS5jJ07Tdxyi5PMTBcffFB/e9yLhEJ8B7VFo75FYklqKowb52Ht2iKuuKKczz+30L+/i6uvdvL113H9406iWFz/y3VoMJlITEpPN3jyyVKWLy/ivPO8LFtmpVs3FyNH2tm+XVO6JLrEeVDvWUJULWqRmHTGGX7efLOEF14opkULP3PnBqZ0TZsGZRqaIlEiroPabgksIao+apHYZTLBRRf5eO+9YqZMKcVmMxg1Crp1S+Tdd9V/LZEvroPaWTnqWy1qkViXkBDYrevDD4u45Rb48UcTgwYF+q+//163wyVyxXVQOyrnUSuoReJFw4bw+OOwcmVxZf91166JPPCAFkyRyBTXQW2vHEymW98i8ebUUwP913PmlNC4scE//2mnU6dE3njDimGEu3Qie8V1UFeM+tY2lyLxyWSCfv28rFlTxO23B+Zf33ijk0svdfLVV3H941EiSFz/S3Tu2eZSLWqR+JaYCKNGeXj//SKysrzk5Fi54AIXDzxgo7g43KWTeBfXQW23BkZ9q49aRACOP95g3rwSnn++hKZNA7fDu3bV6HAJr7gOaodFo75F5EC9enl5//0ibrrJw88/B0aHDxvm4NdfNTpc6l98B7VVS4iKSPXcbrjvvjJWrCjmrLN8LF6cQKdOicyZk4DPF+7SSTyJ66A2m8zYzDYteCIiB9WmjZ/Fi4t55JFSrFYYO9ZBVpaLzz6L6x+fUo/i/l+aw+pUH7WIHJLZDFdfXc6aNUVceWU5GzZYuOgiF2PH2jX3WkIu7oPaleCi2FsU7mKISBRISzN44olS3nyzmJYtDebMsdGtWyIrV2qwmYRO3Ae1O8FNUbl+JRaRmuvUycf//lfEP/5Rxi+/mBg40MVNNznYuTPcJZNYpKBOcFPoUVCLyJFxOGDMGA/Llxdzxhk+Xn01gc6dE3nzTa1sJsGloLYlUeorxev3hrsoIhKF2rb1s2RJMffdV0pRkYnhw51kZzv55RdN5ZLgUFAnuAF0+1tEas1qhZtuKmfVqiK6dAls9NG5cyLPPZeA3x/u0km0i/ugdiUkAuj2t4jUWYsWBq+9VsJjj5VgscDddzvo18/JN9/E/Y9aqYO4/9fjTkgCoFAtahEJApMJrrrKywcfFHHJJeV89JGV7t1dPPGEFkqR2lFQ23TrW0SCr2lTg2efLeXZZ0tISjKYMMHBJZe41LqWIxb3/2Iq+qjVohaRULjkkkDrun//ctats6h1LUcspEGdl5fHqFGjuPvuu9mxY0coT1VrFS1q9VGLSKikpsKsWaU895xa13LkQvqvpKysjDFjxtCtWzdyc3NDeapaS6xsUReEuSQiEut691brWo5cUIN67ty5DB8+nOHDhzNz5kzat2/Pd999x7PPPkvr1q2Deaqg2Ts9S8uIikjo7du6btBArWs5vKD+yxgyZAizZ89m9uzZjBgxgg0bNtCmTRvmzJnD3Llzg3mqoFEftYiEQ+/egT2v921dz5hhU+taDlDjoF6/fj3Z2dkA+P1+xo0bx4ABA8jOzmbz5s3VHlNUVMSYMWN48MEHueSSS4JT4iBz2wLTs4o8uvUtIvWronU9d26gdT1xop1LLnHx9ddqXcte1pq8ac6cOSxatAin0wnAihUr8Hg8LFiwgNzcXKZOncrMmTMPOK5jx4507NgxuCUOMrWoRSTcLr7Yy7nnehkzxsEbbyRw4YUuRo0q48Yby7FoY664V6Ogbt68OTNmzGDkyJEArFu3ji5dugDQrl078vLyglKYlBQXVmvw/1WmpSUd9LVjzU0B8JrLDvm+SBIt5aypWKsPxF6dYq0+EHl1SkuD11+Ht96C4cNNjB/vYOVKB3PnQsuWNTk+suoTDLFWp9rWp0ZBnZWVxdatWysfFxYW4na7Kx9bLBa8Xi9Wa40+7qDy84vrdHx10tKS2L794Le1y4oDC+f/UbDrkO+LFIerT7SJtfpA7NUp1uoDkV2nTp1g1SoTI0fa+c9/EjjtNIMJE8rIzi7HdJB9PiK5PrUVa3U6VH0OF+C16ghxu90UFe0dJe33++sc0uHi1vQsEYkwjRsbPPNMKU89VUJCAtx5p4OrrnLy22/akSse1SqoMzIyWL16NQC5ubm0atUqqIWqTy6rC7PJrD5qEYkoJhNcfrmX994r4vzzvbz7rpWuXQP7XUt8qVVQZ2ZmYrPZGDhwIFOmTGH06NHBLle9MZlMJCa4tTKZiESko482WLCghGnTSvF4YPhwJzfc4GDnznCXTOpLjX81S09PZ+HChQCYzWYmTJgQskLVt8SERN36FpGIZTLBddeV062bl1tucfLvfyeQk2Ph0UdLyczUxOtYp8l6QFJCknbPEpGI17KlwaJFxdx7bxm7dpkYPNjF7bfbKVA7I6YpqIEkWxIFWvBERKKAxQK33OJh2bJi2rTx8eKLNk4/Hdau1YTrWKWgBpJsDSjzlVHmKwt3UUREauTUU/0sXVrMbbeVsWULXHaZk3Hj7JSWhrtkEmwKagJBDdrqUkSii80Go0d7WLMGWrQwmDXLRo8eLnJz9aM9luhqErj1DVDg2R3mkoiIHLlzz4WVK4u4/noPX39toVcvFw8/bMPrDXfJJBgU1OwT1Br5LSJRyuWCyZPLeO21Ypo2NZg2zU7fvi5++EGLpEQ7BTV7d9Aq1IAyEYlyXbv6WLUqsH3mJ59YuOCCRF58MQHDCHfJpLYU1EBSQqCPWre+RSQWNGwY2D5z1qwSrFa4/XYH117rYPt2ta6jkYKaffuo1aIWkdjRv39gCdLOnb28804C3bq5WL5c07iijYKavUG9Wy1qEYkxxxxj8NprJYwfX8ru3YFFUu68084++ypJhFNQoxa1iMQ2sxlGjChn2bJiTj3Vxwsv2OjePZF16xQB0UBXCXBXzqNWUItI7KpYJOWmmzz8+KOJSy5x8eCDmsYV6RTUBNb6Bigo161vEYltdjvcd18Zb7xRQrNmBtOn27nkEhfff6+BZpFKQY1ufYtI/OnUKTCN6/LLy/n0Uwvduyfy/POaxhWJFNQoqEUkPiUnw1NPlTJnTgk2G9x1l4PsbCe//67WdSRRUAPuBC14IiLxq1+/wDSurl29LFtm5fzzXbzzjqZxRQoFNZBgScBldWnBExGJW0cdZbBwYQkPPFBKQYGJa65xcdttdgq1V1HYKaj3cNuStNa3iMQ1sxluuKGc5cuLadvWx0svBaZxffyxoiKc9Le/R5Itid1lalGLiLRu7eedd4q59dYyNm820aePi6lTbZSXh7tk8UlBvUeyLZndnj8xNORRRASbDe65x8O//13CMccYPPKInT59NI0rHBTUezR0pFDmK6PEWxLuooiIRIxzzw1M47ryyr3TuF56SdO46pOCeo+G9hQA8kt3hrkkIiKRJSkJnniilH/9K7Ab1223ObjuOgc79eOyXiio90h1pAKQX5Yf5pKIiESmSy/1smpVEeed5+XttxM4//xEVq3SNK5QU1DvUdGi3qWgFhE5qPR0g9dfL+Gee8rYscPElVe6uPdeO6Wl4S5Z7FJQ75Hi0K1vEZGasFjg1ls9LFlSzIkn+pg920ZWlotNmxQpoaC/1T329lGrRS0iUhNnnOFn+fJirr3Ww6ZNFnr2dDFnjgaaBZuCeo+KPmrd+hYRqbnERHjooTLmzSvG7TYYO9bBoEFOtm3TNK5gUVDv0dChFrWISG1lZflYtaqY7t29rFyp9cKDSUG9R4qmZ4mI1EnTpgavvFLClCmlFBYG1gu/8047RUXhLll0U1DvUdmi1q1vEZFaM5lg2LDAeuGnnurjhRds9OiRyPr1ipva0t/cHsm2hpgwqY9aRCQIWrf2s3RpMTfe6OG778z06uXin/+04fOFu2TRR0G9h8VsIdmerFvfIiJBYrfDhAllvPpqMY0bGzzwgJ3+/Z1s3aqBZkdCQb2PhvYUDSYTEQmybt0C64X37l1OTo6V889P5I03rOEuVtRQUO8j1ZFKfulO7aAlIhJkqanw7LOlPPZYCV4v3HijkxEjHOzW7sKHFfKg3rFjB/379w/1aYKioSMFj9+jHbRERELAZIKrrvKycmURGRk+Xn89gQsuSOTDDzWN61BCGtSGYfD0009zzDHHhPI0QaMdtEREQq9lS4PFi4u5/fYyfv7ZxKWXOpkyxUZ5ebhLFpmC2kkwd+5ccnJyAGjXrh3Jycn07duXZ599NpinCZmUfaZoHZOUHubSiIjEroQEGDXKwwUX+LjpJgePPmpn1SorM2eW0LKluh/3FdQW9ZAhQ5g9ezazZ89mxIgRrF27lvnz5/P555+zZMmSYJ4qJFLsWkZURKQ+nXOOj5Uri7jiinI++8xC9+6JvPSS1gvfV42Dev369WRnZwPg9/sZN24cAwYMIDs7m82bN1d7zBNPPMGECRM47bTT6NWrV3BKHEIpWkZURKTeNWgATz5ZyuzZJVitcNttDv7yF9ipXkighkE9Z84c7rnnHsrKygBYsWIFHo+HBQsWcMcddzB16tRDHj99+vS6l7QeqI9aRCR8LrvMy6pVRZx3npc334Ru3RJZtUoDzWrUR928eXNmzJjByJEjAVi3bh1dunQBAn3ReXl5QSlMSooLqzX4FyUtLalG72uxK9AvXW4trvEx4RDJZauNWKsPxF6dYq0+EHt1ipX6pKXB6tUwfTrcc4+ZK690cdttMHkyOBzhLl3d1PYa1Sios7Ky2Lp1a+XjwsJC3G535WOLxYLX68VqrdvYtPz84jodX520tCS2by+o0XtNZXYAtv7xW42PqW9HUp9oEGv1gdirU6zVB2KvTrFWH4C7706iffsiRoxw8OijFpYu9TFrVimtW/vDXbRaOdQ1OlyA12owmdvtpmif7VD8fn+dQzoSVOygpcFkIiLhd8YZfpYvL+aaazxs3GihZ08XzzwTfwPNahXUGRkZrF69GoDc3FxatWoV1EKFS4ojMOp7p/qoRUQiQmIiTJ9exvPPl+ByGYwe7WDwYCfbt8fPeuG1CurMzExsNhsDBw5kypQpjB49OtjlCosGtmTtoCUiEoF69fKyalUx3bp5WbHCSrduLt59Nz4GmtX4fnV6ejoLFy4EwGw2M2HChJAVKlwqdtDapelZIiIRp1kzgwULSpg9O4EHHrAzaJCL66/3MG5cWdQPNDsUbcqxnxRHqm59i4hEKLMZRowoZ8mSYlq18vH00zayslxs3Bi7cRa7NaulFHsKu8rytYOWiEgEO+00P8uWFTNkiIdNmyxkZbmYMyc2B5opqPfT0JFCma+MYm/wp4qJiEjwuFzw4INlzJtXjNttMHasg0GDnPz+e2wNNFNQ7yfV0QjQ6mQiItEiK8vHqlXFnH++l5UrrZx/vovly2NnoJmCej+plVO0/ghzSUREpKaaNjWYP7+EiRNL2b3bxODBLkaNslNSEu6S1Z2Cej8VLWoNKBMRiS5mMwwfXs7SpcW0bu3j2Wdt9OzpIi8vuqMuuksfAilqUYuIRLU2bfwsXVrMsGEevvrKwkUXuZg1KwF/dK4+qqDeXyP1UYuIRD2nE6ZMKePll4tp0MBg3DgHAwc62bYt+gaaKaj3U9Gi/qNELWoRkWjXo0dgoNmFF3pZtSow0Oydd6JroJmCej+Vo77L1KIWEYkFTZoYvPxyCZMnl1JYaOKaa1zcdZed4iiZhaug3k/lqG+1qEVEYobJBNdfX86yZcWccoqP558PDDT7/PPIj8HIL2E90w5aIiKx65RTAgPNbrjBw9dfBwaaPfVUZA80U1Dvx2F14LImKqhFRGKUwwEPPFDGK68U07Chwf33O7jySie//RaZA80U1NVIdaRq1LeISIy78MLAQLPMTC+rVwcGmr39do03law3CupqpDobaR61iEgcSEszePHFEqZMKaW42MSQIU7uuMNOUVG4S7aXgroaKfYUir3FlHhjYO05ERE5JJMJhg0LDDQ79VQf8+bZyMx0sWFDZERkZJQiwjRyatETEZF407q1n3feKWb4cA/ffmuhVy8XTzwR/oFmCupqaOS3iEh8cjhg4sQy5s8vJiXFYMIEB1dc4eTXX8M30ExBXY29G3Oon1pEJB517x4YaHbRReW8/76V889P5L//Dc9AMwV1NSoWPdGtbxGR+NW4scHzz5fy4IOllJbCddc5ufNOO4ZRv+VQUFdDW12KiAgEBpoNGVLO8uXFtG3rY968hHq/DR55E8YigLa6FBGRfbVqFVjRbNs2E0cfXb9NarWoq6GtLkVEZH8JCZCeXs/3vVFQV0tbXYqISKRQUFejIqi11aWIiISbgroaLqsLh8WhW98iIhJ2CupqmEwmUhyp/KGgFhGRMFNQH0Sqo5Fa1CIiEnYK6oNIdaRS4NmNx+cJd1FERCSOKagPomLRk/yy/DCXRERE4pmC+iBSHCmA5lKLiEh4KagPInXPVpc7NZdaRETCSEF9EBWrk/2hZURFRCSMFNQHofW+RUQkEoQ0qL/88ksGDx7MqFGj+PDDD0N5qqBL1XrfIiISAUIa1OvXr6dx48aYzWZOOumkUJ4q6HTrW0REIkFQt7mcO3cuOTk5ALRr147MzEwuvvhiduzYwTPPPMPIkSODebqQqrz1rcFkIiISRkEN6iFDhjBkyJDKx4sXLyYtLY3k5GR8Pl8wTxVylaO+1aIWEZEwqvGt7/Xr15OdnQ2A3+9n3LhxDBgwgOzsbDZv3lztMccccwwTJ07koYce4uqrrw5OietJojURu8WuPmoREQmrGrWo58yZw6JFi3A6nQCsWLECj8fDggULyM3NZerUqcycOfOA4zIyMsjIyAhuievJ3o051KIWEZHwqVFQN2/enBkzZlT2Ma9bt44uXboAgb7ovLy8oBQmJcWF1WoJymftKy0tqVbHNXGn8eOuH2t9fKhEWnnqKtbqA7FXp1irD8RenWKtPhB7daptfWoU1FlZWWzdurXycWFhIW63u/KxxWLB6/Vitdatyzs/v7hOx1cnLS2J7dsLanVssjWF3WUb+Pm3P7BZbEEuWe3UpT6RKNbqA7FXp1irD8RenWKtPhB7dTpUfQ4X4LWanuV2uykqKqp87Pf76xzSkUgbc4iISLjVKqgzMjJYvXo1ALm5ubRq1SqohYoUFRtz/FGyI8wlERGReFWrZnBmZiZr1qxh4MCBGIbB5MmTg12uiFAxRUsjv0VEJFxqHNTp6eksXLgQALPZzIQJE0JWqEhRsTqZ5lKLiEi4aFOOQ0itDGq1qEVEJDwU1IegZURFRCTcFNSHoFvfIiISbgrqQ9i73rdufYuISHgoqA8hVS1qEREJMwX1IbisLuwWu4JaRETCRkF9CCaTiVRHI936FhGRsFFQH4aCWkREwklBfRipzkYUeHbj8XnCXRQREYlDCurDSLUH5lJrYw4REQkHBfVhpDq16ImIiISPgvowKqZo/VGqHbRERKT+KagPo2J1Mu2gJSIi4aCgPozK9b4V1CIiEgYK6sOoXJ1MfdQiIhIGCurDaOTUMqIiIhI+CurD2DuYTEEtIiL1T0F9GHv7qBXUIiJS/xTUh+GyunBYHOqjFhGRsFBQH0blxhxamUxERMJAQV0Dqc5GalGLiEhYKKhrINXRiMLyAsp8ZeEuioiIxBkFdQ2kOlIArU4mIiL1T0FdA5VTtHT7W0RE6pmCugYqVyfTFC0REalnCuoaqFidTLe+RUSkvimoa6Bi0ROtTiYiIvVNQV0DuvUtIiLhoqCugUbaQUtERMJEQV0D2phDRETCRUFdAxV91BpMJiIi9U1BXQOuBBdOq5OdCmoREalnCuoaSnU00mAyERGpdwrqGkp1NNLKZCIiUu+sofzwb7/9lhdeeAGPx8PQoUNp1apVKE8XUqmOVD73FlHqLcVhdYS7OCIiEidC2qJ+9dVXadKkCTabjWOOOSaUpwq5VA0oExGRMAhqi3ru3Lnk5OQA0K5dOzZv3szUqVPZuHEjb731FoMHDw7m6epVqnPvFK2j3EeHuTQiIhIvghrUQ4YMYciQIZWPx44di8vlIjk5GcMwgnmqeqfVyUREJBxqfOt7/fr1ZGdnA+D3+xk3bhwDBgwgOzubzZs3V3vMwIEDueeee3juuefo3bt3cEocJmektcNpddLI0TjcRRERkThSoxb1nDlzWLRoEU6nE4AVK1bg8XhYsGABubm5TJ06lZkzZx5w3GmnncaDDz4Y3BKHSc/je/HtsK0kWBLCXRQREYkjNQrq5s2bM2PGDEaOHAnAunXr6NKlCxDoi87LywtKYVJSXFitlqB81r7S0pKC/pnhpPpEvlirU6zVB2KvTrFWH4i9OtW2PjUK6qysLLZu3Vr5uLCwELfbXfnYYrHg9XqxWuvW5Z2fX1yn46uTlpbE9u0FQf/ccFF9Il+s1SnW6gOxV6dYqw/EXp0OVZ/DBXitpme53W6KiooqH/v9/jqHtIiIiByoVkGdkZHB6tWrAcjNzY3qhUxEREQiWa2awZmZmaxZs4aBAwdiGAaTJ08OdrlERESEIwjq9PR0Fi5cCIDZbGbChAkhK5SIiIgEaFMOERGRCKagFhERiWAKahERkQimoBYREYlgCmoREZEIpqAWERGJYCYj2vefFBERiWFqUYuIiEQwBbWIiEgEU1CLiIhEMAW1iIhIBFNQi4iIRDAFtYiISASr1TaXkc7v93P//ffz1VdfYbPZmDRpEscdd1y4i1Url112GW63GwjsYDZgwAAeeOABLBYLnTt35uabbw5zCWtm/fr1TJ8+nXnz5rF582ZGjRqFyWTipJNO4r777sNsNvPEE0+watUqrFYrY8aM4fTTTw93sQ9p3zpt3LiR4cOHc/zxxwMwaNAgLr744qioU3l5OWPGjOHnn3/G4/EwYsQITjzxxKi+RtXV6aijjoraa+Tz+bjnnnv44YcfMJlMjB8/HrvdHtXXqLo6eb3eqL1GFf744w/69+/Ps88+i9VqDc41MmLQ0qVLjbvvvtswDMP47LPPjBtvvDHMJaqd0tJSo1+/flWe69u3r7F582bD7/cb119/vfHFF1+EqXQ1969//cu45JJLjCuuuMIwDMMYPny48eGHHxqGYRj33nuvsWzZMiMvL8/Izs42/H6/8fPPPxv9+/cPZ5EPa/86LVy40HjmmWeqvCda6vTaa68ZkyZNMgzDMPLz841u3bpF/TWqrk7RfI2WL19ujBo1yjAMw/jwww+NG2+8MeqvUXV1iuZrZBiG4fF4jL/97W9Gz549jW+//TZo1ygmb32vW7eOLl26ANCuXTvy8vLCXKLa+fLLLykpKWHo0KFcc801fPzxx3g8Hpo3b47JZKJz586sXbs23MU8rObNmzNjxozKx1988QVnn302AF27dmXt2rWsW7eOzp07YzKZOProo/H5fOzcuTNcRT6s/euUl5fHqlWrGDx4MGPGjKGwsDBq6nTRRRfx97//HQDDMLBYLFF/jaqrUzRfox49ejBx4kQAfvnlFxo0aBD116i6OkXzNQKYNm0aAwcOpEmTJkDwftbFZFAXFhZW3i4GsFgseL3eMJaodhwOB8OGDeOZZ55h/PjxjB49GqfTWfl6YmIiBQUFYSxhzWRlZWG17u1lMQwDk8kE7K3D/tcs0uu2f51OP/10Ro4cyUsvvcSxxx7Lk08+GTV1SkxMxO12U1hYyK233so//vGPqL9G1dUpmq8RgNVq5e6772bixIn06dMn6q8RHFinaL5Gb7zxBqmpqZWNRAjez7qYDGq3201RUVHlY7/fX+WHarRo0aIFffv2xWQy0aJFC5KSkti1a1fl60VFRTRo0CCMJawds3nvP7uKOux/zYqKikhKSgpH8WolMzOTtm3bVn6/cePGqKrTr7/+yjXXXEO/fv3o06dPTFyj/esU7dcIAi22pUuXcu+991JWVlb5fLReI6hap86dO0ftNXr99ddZu3Yt2dnZbNq0ibvvvrtKS7ku1ygmgzojI4PVq1cDkJubS6tWrcJcotp57bXXmDp1KgDbtm2jpKQEl8vFli1bMAyDDz74gA4dOoS5lEfu1FNP5aOPPgJg9erVdOjQgYyMDD744AP8fj+//PILfr+f1NTUMJe05oYNG8aGDRsAyMnJoU2bNlFTpx07djB06FDuuusuLr/8ciD6r1F1dYrma/TWW28xe/ZsAJxOJyaTibZt20b1NaquTjfffHPUXqOXXnqJF198kXnz5nHKKacwbdo0unbtGpRrFH3NzBrIzMxkzZo1DBw4EMMwmDx5criLVCuXX345o0ePZtCgQZhMJiZPnozZbObOO+/E5/PRuXNnzjjjjHAX84jdfffd3HvvvTzyyCO0bNmSrKwsLBYLHTp0YMCAAfj9fsaNGxfuYh6R+++/n4kTJ5KQkEDjxo2ZOHEibrc7Kuo0a9Ysdu/ezVNPPcVTTz0FwNixY5k0aVLUXqPq6jRq1CgmT54cldeoZ8+ejB49msGDB+P1ehkzZgwnnHBCVP8/qq5ORx11VNT+P6pOsH7WafcsERGRCBaTt75FRERihYJaREQkgimoRUREIpiCWkREJIIpqEVERCKYglpERCSCKahFREQimIJaREQkgv0/SGecg7msaL4AAAAASUVORK5CYII=\n", 241 | "text/plain": [ 242 | "
" 243 | ] 244 | }, 245 | "metadata": {}, 246 | "output_type": "display_data" 247 | } 248 | ], 249 | "source": [ 250 | "ax = plt.axes()\n", 251 | "\n", 252 | "plt.style.use(\"seaborn\")\n", 253 | "plt.plot(np.array(qng_run)-exact_value, color='g', label='QNG')\n", 254 | "plt.plot(np.array(vanilla_run)-exact_value, color='b', label='Vanilla GD')\n", 255 | "# ax.axhline(y = -1.136189454088, label='exact groundstate', color='red')\n", 256 | "\n", 257 | "plt.yscale('log')\n", 258 | "\n", 259 | "plt.legend(fontsize=15)\n", 260 | "plt.show()" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": null, 266 | "metadata": {}, 267 | "outputs": [], 268 | "source": [] 269 | } 270 | ], 271 | "metadata": { 272 | "kernelspec": { 273 | "display_name": "Python 3", 274 | "language": "python", 275 | "name": "python3" 276 | }, 277 | "language_info": { 278 | "codemirror_mode": { 279 | "name": "ipython", 280 | "version": 3 281 | }, 282 | "file_extension": ".py", 283 | "mimetype": "text/x-python", 284 | "name": "python", 285 | "nbconvert_exporter": "python", 286 | "pygments_lexer": "ipython3", 287 | "version": "3.7.5" 288 | } 289 | }, 290 | "nbformat": 4, 291 | "nbformat_minor": 2 292 | } 293 | -------------------------------------------------------------------------------- /h2/H2_yamamoto_VQE.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## H2 VQE using a user-defined Hamiltonion" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "This notebook feautures a VQE trial that uses a user-defined Hamiltonian, namely, the hamiltonian used in Yamamoto (2019) in the 2-qubit example. We examine the performance of the quantum natural gradient compared to the the vanilla gradient descent optimizer for this small VQE problem." 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "%matplotlib inline\n", 24 | "from matplotlib import pyplot as plt\n", 25 | "\n", 26 | "import numpy as np\n", 27 | "\n", 28 | "import pennylane as qml\n", 29 | "from pennylane import Hamiltonian, VQECost\n", 30 | "\n", 31 | "import sys\n", 32 | "sys.path.append('../')\n", 33 | "from run_vqe import *" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "dev = qml.device(\"default.qubit\", wires=2)\n", 43 | "\n", 44 | "#create ansatz \n", 45 | "def ansatz(params, wires):\n", 46 | " qml.BasisState(np.array([1, 0]), wires=wires)\n", 47 | " \n", 48 | " #parameterized layer 0\n", 49 | " qml.RY(params[0], wires=0)\n", 50 | " qml.RY(params[1], wires=1)\n", 51 | " \n", 52 | " #entanglement\n", 53 | " qml.CNOT(wires=[0,1])\n", 54 | " \n", 55 | " #param layer 1\n", 56 | " qml.RY(params[2], wires=0)\n", 57 | " qml.RY(params[3], wires=1)\n" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 3, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [ 66 | "alpha = 0.4\n", 67 | "beta = 0.2\n", 68 | "coeffs = [alpha, alpha, beta]\n", 69 | "\n", 70 | "#H2 hamiltonian from Yamamoto 2019\n", 71 | "obs_list = [\n", 72 | " qml.PauliZ(0) @ qml.Identity(1),\n", 73 | " qml.Identity(0) @ qml.PauliZ(1),\n", 74 | " qml.PauliX(0) @ qml.PauliX(1)\n", 75 | "]\n", 76 | "\n", 77 | "#create qnodes\n", 78 | "ham = qml.Hamiltonian(coeffs, obs_list)\n", 79 | "\n", 80 | "#create cost function\n", 81 | "cost = VQECost(ansatz, ham, dev)\n", 82 | "\n", 83 | "init_params = np.array([-0.2,-0.2,0,0])\n", 84 | "max_iter = 200\n", 85 | "step_size = 0.05" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 4, 91 | "metadata": { 92 | "scrolled": true 93 | }, 94 | "outputs": [ 95 | { 96 | "name": "stdout", 97 | "output_type": "stream", 98 | "text": [ 99 | "QNG RUN\n", 100 | "Iteration = 0, Energy = -0.76268501 Ha, Convergence parameter = 0.02618004 Ha\n", 101 | "Iteration = 20, Energy = -0.82444782 Ha, Convergence parameter = 0.00004115 Ha\n", 102 | "Iteration = 40, Energy = -0.82461577 Ha, Convergence parameter = 0.00000094 Ha\n", 103 | "\n", 104 | "Final value of the energy = -0.82461577\n", 105 | "Number of iterations = 40\n" 106 | ] 107 | } 108 | ], 109 | "source": [ 110 | "print(\"QNG RUN\")\n", 111 | "qng_run, qng_n_steps = run_vqe(cost_fn=cost, \n", 112 | " max_iter=max_iter, \n", 113 | " initial_params=init_params, \n", 114 | " opt_name='QNGOptimizer', \n", 115 | " step_size=step_size, \n", 116 | " diag_approx=False)" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 5, 122 | "metadata": {}, 123 | "outputs": [ 124 | { 125 | "name": "stdout", 126 | "output_type": "stream", 127 | "text": [ 128 | "VANILLA RUN\n", 129 | "Iteration = 0, Energy = -0.74338143 Ha, Convergence parameter = 0.00687646 Ha\n", 130 | "Iteration = 20, Energy = -0.80872512 Ha, Convergence parameter = 0.00133575 Ha\n", 131 | "Iteration = 40, Energy = -0.82127028 Ha, Convergence parameter = 0.00025922 Ha\n", 132 | "Iteration = 60, Energy = -0.82378251 Ha, Convergence parameter = 0.00005537 Ha\n", 133 | "Iteration = 80, Energy = -0.82435602 Ha, Convergence parameter = 0.00001416 Ha\n", 134 | "Iteration = 100, Energy = -0.82451772 Ha, Convergence parameter = 0.00000458 Ha\n", 135 | "Iteration = 120, Energy = -0.82457521 Ha, Convergence parameter = 0.00000181 Ha\n", 136 | "\n", 137 | "Final value of the energy = -0.82459505\n", 138 | "Number of iterations = 135\n" 139 | ] 140 | } 141 | ], 142 | "source": [ 143 | "print(\"VANILLA RUN\")\n", 144 | "vanilla_run, vanilla_n_steps = run_vqe(cost_fn=cost, \n", 145 | " max_iter=max_iter, \n", 146 | " initial_params=init_params, \n", 147 | " opt_name='GradientDescentOptimizer', \n", 148 | " step_size=step_size)" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 6, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "exact_energy = -np.sqrt(4*alpha**2 + beta**2)" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 7, 163 | "metadata": {}, 164 | "outputs": [ 165 | { 166 | "data": { 167 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAFgCAYAAAAvuNpEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzs3XdU1fX/wPHn5V649wIXGaLixpVaWWpm5syNIzUnmolm6jdRc89y75Wa5p65MzP3VvKXZZllau6NuBBkcxn398eVCzdAuHq5DF+PczpHPvP9/nDj87qv91IYDAYDQgghhBDP2GV3AYQQQgiRs0hwIIQQQggzEhwIIYQQwowEB0IIIYQwI8GBEEIIIcxIcCCEEEIIM6rsLkB2evQo3KrXc3NzJCQkyqrXzMmkvnmb1Ddve9XqC69endOqr6enLlPnSubAilQqZXYXwaakvnmb1Ddve9XqC69enV+mvhIcCCGEEMKMBAdCCCGEMCPBgRBCCCHMSHAghBBCCDMSHAghhBDCjAQHQgghhDAjwYEQQgghzEhwIIQQQggzEhwIIYQQwowEB0IIIYQwI8GBlVw4cYJr/5zP7mIIIYQQL02CAyswGAxU0TgR/qcEB0IIIXI/CQ6sQKFQ8Cg0hKLuHtldFCFsJiYmhtWrl9O1awcaNqzFhx82YdSooZw7d9bmZTEYDOzdu4uQkCc2v/fLiI+PZ/Pm9Vl+H3//XkybNjHL75ORAQM+Z/LkcQD8+ecf1Kr1Dg8fPrDa9c+dO8vZs39ZdE7dutXZs2en1cqQlWz5OZfgwEpuPAgiv0s+SEzM7qIIkeXCw8Pp3bs7+/fvoXv3Xqxbt4Xp0+eQL18++vb9jN27f7Jpef75528mTx5HTEyMTe/7so4cOciCBXOzuxjZ4s0332LHjn3kz+9ptWv27fsZd+/esdr1chpbfs5VWX6HV8TtZ9GvUq8nQaPJ5tIIkbUWLJhDREQ4q1atx8UlHwBeXoWpUOF13N09mD17OpUqvU2xYsVtUh6DwSa3sTpDbi24Fdjb2+PhkT+7i5Gr2PLjIpkDK7kb/BgApT4um0siRNYKDw/n4MF9dOr0sSkwSKlbt0+xt1exc+d2APbs2UndutXNjvnvtitXLjNkSH+aNq1HvXrv4ev7EXv37jLt9/fvxeLF3zBx4pc0blwXH5/6zJkznfj4eIKC7tG3b08A2rf/kBUrlqSZsv7vtnbtWrJhw1oGD+5P/fo1adCgASdOBHD8+BE6dWpDo0a1GTKkP6GhoWk+h6Cge9Sq9Q7Hjh2mR48ufPBBDXx9PyIg4JjpmLCwp0yZMp5WrZpQt251WrVqysKF80hMTOTPP/9g4sSvAKhV6x327NmZqWdVq9Y7LF++mDZtmtGmTTOCgx9n+Pwycv78Ofr06UH9+jXp0qUdu3b9SK1a7xAUdM/0rL755mt8fT+iRYuGXLp0kaCge4wZM5zmzRtQt2510/NMkpiYyIoVS2jVqgmNGtVhwYI5JCYmpPv70Ov1LFgwl1atmtC4cV38/Xtx7tw/puNXrFjCoEH9WL16Oa1aNaF+/ZoMHTqAx48fmcqYkJDAlCnj8ffvlWY9Q0NDGTduNE2a1KVVqyZpPqOAgGN06+ZL/frv07lzWzZsWEdiiozwd9+tpn37VnzwQQ06dfqIbdu2mJ2/b99uPvmkI/Xr10z1e3jw4D5jxgyjceO6tGzZmLFjR5rKD5Z/zrOSZA6s5F5IMGDMHAhhqXHjxrBz54/Zcu+WLVszbtykTB9/8eJ54uLiePPNt9Lc7+DgwOuvV+KffzLX9yA6OppBg/ypWbM2S5euxmCATZu+Y8aMyVSvXgP3Z315Nm9eT7dun7Jq1Xr++edvpkwZz+uvv0nDhk2YNm02I0YMZtmyNZQo4c3Fixcyde9Vq5YxaNBwBg0axtKlC5gw4UtKlvRm3LjJREVFMXr0MDZsWMvnn/dP9xoLF85n8ODhFC1ajKVLFzF58liqVduHVqtl0qSxhIaGMn36XFxc8vHrr78wd+4M3nzzLWrUqMnAgcOYO3cGO3bsw9nZmcOHD2aq3Dt3bmfWrPnExcXh6OiEn1/nDJ9feh49esjAgX1p0KARI0Z8yY0b15g1a2qq43788XtmzpyHg4OasmXL4efnS6FChZk/fwlqtZp9+3azaNF8qlWrTtmyr7F27Uq2bt3I8OFj8PYuzfr1azhz5jQ+Pi3SLMekSWO5dy+QCROm4ebmzqFD++nfvzerV2+kePESAJw58weOjlrmzl1EeHg4X301guXLFzNixJcsW7aW1q2b0rfvFzRt2izNewwYMICHDx8xe/YClEols2dPJyEhOWA5efIEEyaM4YsvhlK5clVu3LjGnDkziImJpkePXpw4EcCGDeuYMGEqRYsW4/fff2PGjMmULl2Gt9+uwuHDB5g6dQJ9+37B++/X4syZ00ybNhEPj/y8+eZb9OvXmzffrMTixStISEhg1arl9O/fhzVrNmFvbw9Y9jnPShIcWMnD8KeAZA5E3pf0TVqn06V7TL58+QgKCszU9WJiounYsTPt2nVC86xJrmvX7uzc+SN37tw2vdzKlCmHn5/xm1ORIkXZvHk95879Q5MmzdDpjBkMV1c3HB0dM12XWrXqml5WHTp04PDhw/Tp40/58hUBqFatOjduXHvuNTp37sp7771vKveRIwe5efM6FSq8TvXqNahc+R1KlSoNwEcftWf9+jVcv36VOnXq4ezsDGBxet3HpyVly74GQEjIk0w9v/T89NN28uVzZciQkSiVSkqW9ObJk2Dmzp1pdlzNmnWoXLkqALGxMfj4tKRhw8Z4ehYAwM+vJ2vXruTatauUKVOOH37YSqdOH/PBBw0BGDZsNH/8cSrNMty9e4cjRw6ydu1m07Pq0aMXZ8/+xaZN3zFs2GjAmI0YNWosjo5OADRo0IhTp34DwM3NDQBnZ+c0M1o3b97g119/ZeHCZbzxRiUARo8eR9euHUzHrF27ijZt2tOiRSvA+DmLiopi+vRJ+Pn1JDDwDvb2KgoV8qJQIS9atmxN4cJFKFGiJABbtmykcWMfOnTwBaBo0WJER0eRmJjIoUP7iYmJYdSocSiVSgDGjZtM8+YNOXbsMI0aNQWy5nP+IiQ4sJLgyEgSEhJQxsZmd1FELjRu3CSLvr1nJ1dXV8CYMi9SpGiax4SHh+HsnH7wkJKbmztt2rRj375dXL58ibt373DlymUAs291xYub919wcnImPv7lgvGiRYuZ/q3VagEoXDi5Tmq1mqdPnz73Gin7VSS97OPijOVq3bodJ04cZ9cu44v62rWrPHz4wKxeL6Jw4SKmf2f2+aXn0qWLVKhQ0fTCAqhU6e3n3lOt1tC2bQcOHz7Av/+eN90zMTGRxMREQkNDefIkmNdeK286x97ennLlXkuzDJcvXwKgd28/s+16vd70LMEYRCUFBmDZZ+D6dWOQ99prFUzbvL1LmV3vypVLXLx4gR9//N60LTExkdjYWIKC7tG4cTN27dpBp05tKF26DO++W4OGDZvg5ub+7B5XadLEPGvRoUNnAGbPnk5oaAhNm9Yz2x8TE8OtWzdNP2fF5/xF5LjgICYmhqFDhxIcHIyTkxPTp0/H3d3dtD8gIIBly5YBxs48p0+fZteuXZQubYw2d+7cyXfffcfmzZttWm6VgwO3H96nmEOxjA8WIhcrX/51HBwcOHv2LypUeD3Vfr1ez4UL52ncuGm610j50nr8+BG9e3fH07MANWvW5v33a5M/vyc9e3Y1O8fe3iHVdSzp0JfWizLlCzGJnZ0i09dMv1zGl8rQoQO4ffsWjRo1pUmTZlSo8DpffPG5RddPq9xqtdr078w+v/QolUqzNvX0pLxnVFQUffv2JCEhgXr1GlClyjtUrPgG7dq1BIzDuyF1B7qk1Pl/2dsbX0WLF68yu89/z0nr/Mx+Bp4VKdXxSfcGUKns6dz5Exo39kl1foECBbG3t2fNmk2cPfsXv/12kl9//T82blzHqFFjadasJUpl+q9Ue3sV3t6lmDx5Zqp9KQPpl/2cW0uOCw42btxIuXLl6NevH7t372bRokWMGTPGtL9OnTrUqVMHgOXLl1OlShVTYHDhwgW+//77bHmQWq0jVwPv4u1VxDic0U76eoq8SafT0aRJMzZv3kDTps3Jl8+V8PBwevT4mPbtOxIVFUVkZAStW7cDjH9wExISiImJMaW979y5bbrewYP7iYqKYuHCZaaX9W+/nbSoTIr/vM+TXiKRkZGmbbYe4nb58iVOnfqVFSu+M32DjoyMIPhZ52VIfokmyehZpeVln1+ZMmXZt2+PMfP57Pzz588995xTp05y5cpl9uw5bErh3759k8TERAwGA66urnh6FuCff/7m/fdrAcZg6fLlS7z1VuVU1/P2Nv4Nf/IkmGrVkjtfzp49nZIlS9K2bcdM1yf9epYD4Ny5v6lW7T3A2Kk0ZWbI27sUd+/eMcsoHT9+lMOHDzBmzHgOHz5AaGgobdt24O23q9C7d1+GDOnPkSMHadasJSVLpu7vMnHiV+h0OkqXLsvOnTtwccmHi4sLYPw8TJjwJR07dqFKlXcyrMN/P+dZKce9wU6fPk3t2rUBYyBw8mTaH/L79++zY8cO/P39AQgJCWHOnDmMGjXKZmVNSaPRcDXQ+MdH+h2IvM7f/wvc3T3o06cHR44cIiIinLZt27Nw4TyWL1+Mr29XSpY0dph6/fU3UCgUrFixhKCgexw+fMCsB3eBAgWJiork2LEj3L8fxIkTx5k5cwpgzEJkRlJq+PLlS0RERFC6dBm0WkfWrVtFYOBdfv31FzZt+s7KT+H58ufPj1Kp5MiRgwQF3ePcubOMHDkEvV5vqldSu/HFixeIiorK8Fml5WWfX5s27QgNfcLs2dO4desmJ04cZ/nyxUDq4CXlPQEOHNjL/ftB/PHHKb78ciQAcXHGe/r6fsz3329i377d3L59k7lzZ/Lgwf00r1e0aDEaNGjEjBlTOHny/wgMvMuSJQvZsWObRR3vHB2duHnzepqTBBUrVpwGDRowe/Z0zpw5zZUrl5g0aSx2Kb7Idev2KYcO7WfdutXcuXObX345wcyZU1Cr1Tg4OKDX61m4cJ5ZvS9fvkTFim8A0LnzJxw4sJcff/yewMC7/PTTdg4d2k/NmnVo3Lgprq6ufPXVCC5evMD161cZP34M58+fw9u7VKbrB8mf86yUrZmDrVu3smbNGrNtHh4epo5OTk5OhIeHp3nuqlWr8PPzw8HBgYSEBEaPHs3IkSNTpaSex83NEZUqdVrxRbi75+Nq4F3jvzVK8Mxce2tu5/mK1DOJ1Dd5+5Ytm1i9ejXr1q3gzp07aLVaateuTbFixdi2bQt2domMHDkST88KjB8/niVLlrBt22aqVq3KiBHDGTVqFJ6eOjp2bMOtW1eYP38WUVFRFC9enH79/Fm6dCm3b1+lZcsmODio0GjszcqTcpubWyWaNGnCuHGj8PX1ZfTo0cyaNZNZs2bx8cftKV++PKNGjaRv3754eDjj6alDqbTDyUltuub168brJu0H0GjscXBQpvkcYmONf6hdXbWm/Sm3VahQiqlTp7JgwQK2bt1IwYIF8fHxoWjRwly7dglPTx2NGtXjhx/e5X//+5TBgwfTvXv35z6rJDqdxvTziz6/pN+jp6eOZcuWMWXKFPz8fClRogQff9yFb775hoIFXdN8VnXr1mDYsGGsWbOGxYu/oXDhwrRt25aAgABu3LiCp6eOvn174+jowIoViwkJCaFJkyY0bNjQVA5XV0ez5z1z5nRmz57N9OkTCQ8Pp3Tp0ixYsICGDRsA4OSkRqm0M6vDf7f17t2LRYsWcebMH/z4Y+rRP7NmzWLq1KmMHj0UOzs7PvvsM+7fv2d6ni1bNgFmsHTpUlauXIK7uzsffdSGgQMH4uDgwCef+BIXF8Xq1csICgrCw8ODdu3aMmDAAFQqFW3btiQhIZoVK1Ywf/4cihcvzsyZM2nWzNgpc82a1UybNo0BA/6HQqHg7bffZt26tZQrVyLVZzqzn/OMvOjfLIUhh83C4e/vT69evahUqRLh4eH4+vqya5d55JyYmIiPjw87duxAo9Fw9uxZRo4cibu7O7GxsVy9epW2bdtm+OAePUo78HgRY8YMJ+jceX6aMpuIAvmJzp/3p1L29NRZ9RnmdFLfzLt9+xa//XaS9u07WblUWedV/f3euHGdyMgIUw9+gEOH9jNlyngOHAhApcpxrc8v7FX9Hf93W2bkuN96lSpVOH78OJUqVSIgIICqVaumOuby5ct4e3ub2uQqVarE7t27Abh79y6DBg3KVERlTcY+B9KsIARA8eIlTGPTRc728OEDRo4czOjR43j99UoEBQWyYsUS6tdvlKcCA2GZHPeb9/X1Zfjw4fj6+mJvb8/s2bMBmDFjBk2bNqVSpUrcuHGDYsVy1qgAjUbD9aBADAaDTIQkhMg1qlevQd++A1i+fDEPHtzHxSUf9es3pFevvtldNJGNclyzgi1ZM720aNECxo0bTfihX9BqtDwpV9pq186pJEWXt0l987ZXrb7w6tX5ZZoVctxohdwqqYnjqT4WZXy8rM4ohBAi15LgwEqShiQ9iY4CpN+BEEKI3EuCAytJyhw8fjb2VPodCCGEyK0kOLASrdaYOXgQJgswCSGEyN0kOLCSpMxBUKhxZi5lnGQOhBBC5E4SHFhJUuYg8EkwAMpYyRwIIYTInSQ4sBKt1pg5CI+MIMFeJX0ORJ7Vr19vevXyS3d///59GDZsoFXutXPnj9Sv/z4A8fHx1Kr1DocO7QdgwoQvGTSon1Xuk5X27NlJ3brJiwm1adOMdetWW+36oaGh7N79k0XnTJ48Dj8/P6uVIatdv36Vkyf/L7uL8UqR4MBKkjIH0dHRJDg4oIyPR5EgwxlF3tOsWUsuXDhH4LO1RFJ68OA+Z86cpnnzD61yr8aNm/L99zutcq2cYuXK9bRr9/KrDCZZtGgeBw7ss9r1cqLhwwdx6dK/2V2MV4oEB1aS1OcgKTgAGbEg8qYPPmiIo6MThw8fSLXvwIF9uLq6UbNmbavcS63W4O6et9YpcXNzQ6vVWu16r8I8dq9CHXOaHDd9cm6VMnMQr04ODuKfNTcIkVdoNBrq12/IoUP7+eSTHmb79u/fQ+PGPqY5+S9fvsjixQs5f/4ssbGxFC5cBD+/njRu7APA//73KZUrVyUo6B4nThgX+WnSpBn+/l+gUqnYufNH5s6dwZEjv2RYrsOHD7Jhw1pu3LiOQgHlypVnwIAhlC9fIc3jo6Ii+frrWQQEHMPOzo6OHTtw6tQfVKtWHT+/nixduojz58/h6OjI6dO/07FjZ/z8erJmzQr279/Dgwf30Wi0vPPOuwwdOpJ8+VwB+P333/j22/ncvHmT1157jXfeqW523zZtmvHRRx3o2tUPgOPHj7By5VLu3LlNoUJefPhhGzp06IydnR13796hU6c2TJ48g9Wrl3Pz5g28vArz+ecDqFWrDkuXLjIt6Vyr1jv88MNu03LKKW3duonNm9cTEvKEDz5omGop5/v3g5g/fw5//HEKtVpN1arV8PcfSP78+QH455+/WbhwHlevXkatVlOjRi369x+Mi4sLALdv32TBgrn8/fdfODg4ULt2Pfr3H4RWqyUxMZG1a1fy00/bCQt7ird3KXr2/B/Vq9cAjE1HW7Zs4KOPOvDdd6sJCXlCxYpvMGzYKIoXL8n//vcp9+8HsXz5Yvbu3cXmzalXWxTWJ5kDK0nKHMTEpMgcxErmQORNzZq15Pr1a1y/ftW07dKli9y8ed3UpBAVFcmgQf4UKlSIZcvWsmbNJt54oxLTpk0iNDTUdN7GjesoVao0q1dvoF+/gWzbtpljxw5bVJ5z584yfvxoWrZsxfr1W1mwYAnx8fHMnDkl3XMmTPiS8+f/Ydq02Xz99UL+/vtvzp79y+yY06dPUbKkNytXfkezZi3ZsGEd27d/z+DBI9i0aTtffTWRv/46bepDcPv2TYYN+4LKlauyevV6WrRozYYNa9Mtw4kTx5k0aSwdO3Zh3bot9OnTj02b1rNu3Sqz4xYtmk+fPv1Yu3YzpUqVZtKkscTGxvDxx37Ur9+It96qzI4d+8if3zPVPXbv/olvv52Pn9+nrFq1Hjc3d44cOWjaHxUVSb9+vXFycmLx4pXMnj2fmJhovvjic+Lj44mPj2f48EG8++57rFu3henTv+bcubN8++0CAMLCnuLv3xuVyp5Fi5Yzbdoc/v77T2bPngbAwoXz2L9/DyNGfMnq1Rtp1MiHESMG8fffyc/67t07HDlykClTZvHttysJCXnC118b19WZPn0OBQoUpEuXbixZsjrdZymsSzIHVpKUJoyOjiZBLc0KwjJODx6iDsueOd9jXXREFixg0TmVKr1N0aLFOXhwP717lwFg//7dVKjwOqVKGdcViYmJoVOnj2nf3he1Wg1A167d2bNnJ3fv3sbV1fhNu3z5CnTt2h2AIkWKsmnTd5w79w8NGzbJdHns7R0YMmQkH37YBgAvr8K0bNmauXNnpHn8nTu3OXEigG++Wcrbb1cBYM6cOdSvX9/sOKVSSY8evbC3twegZMmSjB49jnfffQ+AQoW8qFbtPVOQtGPHdry8CuPvPxCFQkHx4iW5fv0q33+/Oc1yrF27irZtO9KsWUtT/SMjI5gzZ4ZZVqZLl26mb9off9ydY8eOcOvWTcqVK49arUalssfDI3+a99i2bQtNmzanRYvWAPTtO4DTp0+Z9h84sJf4+HhGjvwKOzvj98Xx46fQrFkDAgKOUblyVcLCnuLhkZ9Chbzw8irM1KmzSUhIAODgwf3o9bF8+eUE00yxw4d/yZkzfxAZGcEPP2xh2rQ5pmfWoYMvV69e5rvvVvHWW/MAiIuLY9iw0RQrVhyAFi1as3r1MgBcXPJhZ2eHVqs1fWZE1pPgwErs7OxQq9VER0eRqFJhUChQSeZA5GHNm7dk584f6d27LwkJCRw6dIAePT4z7Xd396B163bs2bOTK1cucffuHS5fvgRAQorOusWKmS/t7OTkTHy8ZUOBX3utPDqdjnXrVnHz5nVu377NtWtXSExnjZPLly+iUCioWPEN0zZPT0+KFClqdlz+/J6mwACgdu16nD37F0uWLOTOnVvcvHmT27dvUrnyOwDcuHGNcuXKo1AoTOdUrPgmkHZwcOXKJa5evcy2bcn7ExMTiY2N5cGDB6ZtSS9NAGdnZwDi4uIzeiwA3Lx5nVatPjLbVrHimzx4EPjsWVwiOPgxTZrUNTtGr9dz69YN6tdvSIcOvsycOYVly76lWrXq1KpVh7p1jYHU9etXKVmylCkwAHjrrbd56623OXfuLHFxcYwePdTsmcTHx5M/f3JAqlQqzZ69s7NzpusnsoYEB1bk6OhITEwMKBTEqx2MwYHBACn+pxAiLZEFC1j87T27NW3anGXLvuX8+XOEhT0lMjKChg2bmvY/fPiAPn16ULBgId5/vzY1a9bBzc0t1TDIlC/fJJZ2QPv9918ZNmwgdep8wJtvVqJ581bcuHGd+fNnp3m8UqnEYDBkeJ+kjEeSFSuWsGnTepo3b8l779Xkk096sGnTeoKDg58doUh1zbTql7zPgc6du6aZJfHw8ODBg/um4/4r88/o+WWyt7endOkyTJw4PdWZOp1xBb/+/QfTrl0nTp48walTvzJp0lh27vyRr79eZOpfkhaVynifqVNn4eVVxGxfUpYCjL+PlD8bSSfE7CR9DqxIq9USFWVceCnBwQGFwYBdvES/Im/y9CxAtWrvcfToIQ4fPkDduvVN32rBmK7W62NZuHAZXbv6UbNm7RR9Daz7h3/Tpg3UqFGL8eOn0K5dJ6pUeYf794PSfYGWKmVsCvn33/OmbU+ePCEwMPC599mwYS29en3OF18MpUWLVpQrV547d26RVJ+yZcvx77/nTSl3gIsXL6R7vZIlvQkMvEvRosVM/125colly77NbNXNvpGnpUyZspw7d9ZsW8oyeXuX4t69QFxd3UxlyJfPlfnz53DjxnXu3LnNrFnT8PQsQNu2HZk+fS4jR47ljz9OERb2lBIlvLl584bxi9Ezv/xygrZtW1C8eHGUSiWPHj0yq+O+fbtNHSmtUUdhfRIcWJEpcwDSKVG8Epo1a0lAwFH+7/9+TjW3QYEChQgPDycg4Cj37wcREHCMWbOmAqTqLf+yChQoyJUrlzh/3jj/wpYtG9m2bTOJiYnEpxGgFy9egtq16zFr1jT+/vsvrl69wtChQ9HrY5/7IvL0LMhvv/3C7ds3uX79KrNmTeXffy+Y6tO6dVtCQp4wa9Y0bt26yaFD+/nhhy3pXq9bt085cGAv69ev4e7dO/zf//3MrFlT0Wq1z804pOTo6MijRw8ICrqXZl19fT/m4MF9bNu2mdu3b7Fy5VIuXDhn2t+0aQucnXV89dUILl78l2vXrjJu3GguXryAt3cp8uXLx6FD+5gzZzq3b9/kxo3rHD16kGLFiqPTudC0aTPUagemTBnP9etXOXv2L775Zi5Vq1bD0dGJ9u19WbRoPkeOHCIw8C6bN69n7dqVFC1aLFP1S6rjnTu3ePz4UabPES9HggMr0mq1REdHA0inRPFKqF27LhERETg7O1Olyjtm+xo2bEy7dh2ZNWsaXbt2YNWqpXz22f/w8ir83G/TL6JXr/9RunQZBg7sS8+en3DixHFGjRoLpP/NfeTIryhTpixDhvSnf/8+VKpUiQIFCj73pfzVVxMIDQ2le/cuDBzoT2RkJL179+XGjWvExsbi5VWYr7/+luvXr9K9exe++24NXbr4pXu9mjVrM2rUWPbt203Xrh2YPXsazZt/yODBIzJd9+bNW6HX6+nSpR3Xrl1Ntf+DDxoyYsSXbN26CT+/zly69K9ZIKfRaJg7dyH29vb069ebzz//FIB5874lXz5XXFzyMWvWfG7duknPnt3o3bs7iYmJzJw5D4VCgaOjE3PmLOTp06d89lk3xowZzrvvvsegQcMB6NPHn5YtW/PNN3Pp2rUDO3f+yPDhY2jSpFmm69ip08f83/+doHv3LjLngY0oDK/wk370yLq9w1t8kFkKAAAgAElEQVS2bMSZM2e4e/cxqugY3G7cItrNlQiv1OOO8wJPT53Vn2FOJvXNO2JjYzh16leqVXvPNAw5Xz411apVY/jwMTRq1DSDK+R+efn3m55Xrc5p1dfTU5epc6VDohU5Ojqi1+uN7Y2SORAix7K3d2DGjCnUqlWXzp27kpCQwA8/bESj0ZiGDArxKpNmBStKOdcBdnYkqFTS50CIHMjOzo6ZM78mMPAOPXt25bPPuvHw4UPmzVuMi0u+7C6eENlOMgdWlDTONzo6GmdnZxLUDjhERkFiIqQapiOEyE7ly1dk/vzFpp9ftZSzEM8jbywrSsocxMQ865T4bMSCTIYkhBAiN5HgwIpSZg4AswWYhBBCiNxCggMrSi9zIP0OhBBC5CYSHFhRUuYgKuo/wYFkDoQQQuQiEhxY0X8zB4n2sgCTEEKI3EeCAyv6b5+DpAWYlPpnCzAJIYQQuYAEB1b038wBQIJajcJgQKm3bAlaIYQQIrvIPAdWlCpzQMoRC7Gm9RaEyO3atWvJ/ftBae7z9i7FunXpLzZkLQ8e3Oeff/5Oc7ljIcTLkeDAisxmSHwm4dl68KoYPfrMTWktRK7QpUs3OnTwTbVdpbLNn5WpUyfg6VlAggMhsoAEB1aUUeZAiLxEq9Xi4ZE/2+4v3XiEyDrS58CK0upzkGhvj0GhkLkOxCtnw4a11K1bnatXrwAQGxtL164dGDbsC9PPCxbMoW3bFtSr9x4tWjRkypTxxMTEmK5x4cI5+vXrTcOGtWjVqimLFs0jPj6eyZPHcfr0Kfbu3UWtWu+keX+An37ajq/vR9SvX5NPPunI3r27TPv+/PMP6td/n4CAY3Tu3JY33niD7t078/fff5mO0ev1LFgwl1atmtC4cV38/Xtx7tw/pv0rViyhX7/ejBkzjMaN67JkyUIA9u7dRadOxvv279+HlSuX0q5dSwBGjhzM0KEDzMp5+vTv1Kv3HiEhIS/6uIWwKskcWFFamYOkEQuq2GcjFhSKbCqdyMmcxo1BvfPHbLl3bMvWRI6bZPXrdur0MSdOBDB9+kQWL17F0qULCQt7yvz5SwBYuPBrTp36la++mkSBAgW4cOEckyePp0yZsnTo0Jl79wLp378PjRo1ZdCg4Tx5EsyECWNQKlUMGDCEe/cC8fDIz4ABg9O8//bt37NixRIGDx5OuXLlOXfuLHPnzgDAx6cFAHFxcaxatZThw8fg7V2EUaPGMHXqeDZu/AGFQsGkSWO5dy+QCROm4ebmzqFD++nfvzerV2+kePESAJw5c5rOnT9h5cp+2NnZceLEcaZNm4i//0CqV69BQMBRli5dRIECxqXbmzZtwVdfjSAkJAQ3NzcA9u/fQ40aNU0/C5HdJDiwouQ+B1Fm2xPUauxjYrGLiyPRQTolirxhzZoVrF+/JtV2f/+BtGr1EXZ2dowePQ4/P1+mTBnPwYP7mDlznukF+Prrb9KwYRMqVXobAC+vwmzf/j3Xrl0FjN/63d09GDJkJEqlEm/vUgwbNob794NwdnZGpbJHrVan27Sxdu1Kunf/jA8+aAhAkSJFuX8/iLVrV5qCA4PBQK9efXnrrcp4euro2LEzI0cOITQ0lMjICI4cOcjatZspVao0AD169OLs2b/YtOk7hg0bDYBCoeDTT3uhVmsAmDJlPA0bNqF9+04AfPyxHxcvXuDixX8BqFmzNjqdjsOH99OuXSdiY2M4duwIY8aMf/lfihBWIsGBFSVlDlKmRSG534EqVo9eggORhshxk7Lk23tW+uij9rRp0z7VdlfX5G+/RYoUpU8ff+bOncmHH7ahevUapn1NmjTj1KlfWbRoHnfu3ObGjesEBt7Fy6swANevX+W11yqgVCpN59SsWTtTZQsJCeHRo4csXDiPxYsXmLYnJCSQkJBAXFzy0OKkDACAk5MzAPHxcVy+fAmA3r39zK6t1+vNzvfwyG8KDAAuXbpIgwaNzc6pVOltU3CgUqlo2LAp+/fvpV27TgQEHMPBwZ7336+VqboJYQsSHFhRUuYgKip15gBAGRsLOmebl0uIrKDTuVC0aLEMj7t06SJKpZKzZ/8iNjYW9bP/H6ZNm8iJE8dp2rQFdep8wGeffW5K+wMolS/+58ne3h6AgQOHUrly1VT7UwYcScemZDAYsLc33n/x4lWmMqd1zn/3KZVKEhMTn1u+Zs1a8P33m7h79w4HDuylYcOmNhvlIURmSIdEK8pM5kCIV8mJE8fZv38Ps2bNIzw8nKVLjR32nj4NZdeuHQwdOgp//y/w8WlB8eIlCAy8i+HZMISSJb25cuWS2Yt2x44f6NHjY+D53XecnZ3x9CxAUNA9ihYtZvrvjz9+Y+PGddjZZfynz9vb2JTw5Emw2TU2b97AiRPH0z2vTJmyXLhwzmzb+fPmP5crV57Spcuyf/8eTp/+3dTMIUROIcGBFaXX5yB5xIIMZxR5R3R0NMHBj9P8z2AwEBoayowZU2jXrhPVqr3HwIFD2bJlI2fOnMbJyRknJyd+/vk4gYF3uXz5IuPHj+HhwwfExRmD6I8+ak9w8GPmzp3JrVs3+f33X1m5cqkp/e7o6ERQ0L10J2Pq1q0HmzevZ8eOHwgMvMuBA/tYsGAu7u4emapf0aLFaNCgETNmTOHkyf8jMPAuS5YsZMeObZQo4Z3ueZ07f8KhQ/vZtm0Ld+7cZsuWDRw9egjFf6KZZs1asGHDWooVK85rr5XPVJmEsBXJY1mRRmNsd/xv5kBGLIi8aP36NWl2SATYtesQs2ZNQavV8tln/wOgXr0G1K5djylTxrNmzUYmTJjGN9/MpWvXjri6ulKjRk06dfqYn38+BoCnZwFmzVrAt9/Op3v3zri6utGiRSu6d/8MMAYPEyZ8SZcu7diyZUeqjomtW7dDr49j48Z1fP31TPLnL4CfX08+/tgv03UcPvxLFi9ewNSpE4iIiKBkyZJMnjyDd955N91z3n+/FgMHDuW779bwzTdzqVSpMj4+LTh79i+z4xo39mHhwnk0bSpZA5HzKAyGV3cqkUePwq16PU9PHVqtlvLlK3DggHnaURcYhOZpGMFlvPPMiAVPT53Vn2FOJvXN26xV37/++pP8+T3N+mPMnDmFu3fvMG/et6Zt169fpXv3LmzfvifT2QxretV+v/Dq1Tmt+np6Zm6qXskcWJlWq02dOUBGLAjxqvj11184duwwI0d+RcGChTh79m/279/DwIHDALh//z7//nuOLVs2Ur9+o2wJDITIiAQHVqbVOhIVFZ1qu4xYEOLV0L37Z0RFRfLVVyMJC3tK4cJF+PzzATRv/iEAoaFPmDJlAt7epejXb2A2l1aItElwYGUajYaIiIhU22XEghCvBrVazaBBwxk0aHia+8uXr8jBgwE2LpUQlpHRClam1TqaT5/8jIxYEEIIkVtIcGBlGo3GbOElE4WCeLU6ecSCEEIIkUNJcGBljo6OxMXFER8fn2pfvEaNwmBAqZemBSGEEDmXBAdWljzXQfqdElUx0rQghBAi55LgwMq0WuMUymmNWIjXSHAghBAi55PgwMqelzlIGrEgnRKFEELkZBIcWFlS5iCtEQsGlYoElUoyB0IIIXI0CQ6s7HmZAzA2LSjj41EkJNiyWEIIIUSmSXBgZY6OSSszph0cSKdEIYQQOZ0EB1am0Tw/OEjqlCj9DoQQQuRUEhxYmVabQXAgmQMhhBA5XI5bWyEmJoahQ4cSHByMk5MT06dPx93d3bQ/ICCAZcuWAWAwGDh9+jS7du3C1dWVMWPGEBYWRkJCAjNmzKB48eI2L39y5iAqzf0JagcMSHAghBAi58pxwcHGjRspV64c/fr1Y/fu3SxatIgxY8aY9tepU4c6deoAsHz5cqpUqULp0qUZMWIELVu2pFmzZvz6669cv349W4KDpMxBWss2A6BQkKBWo4qNNU6jrFDYsHRCCCFExnJcs8Lp06epXbs2YAwETp48meZx9+/fZ8eOHfj7+wPw559/8uDBA/z8/Ni5cyfvvvuuzcqcUnKzQtqZA0g5jXKcrYolhBBCZFq2Zg62bt3KmjVrzLZ5eHig0+kAcHJyIjw8PM1zV61ahZ+fHw4OxomFAgMDcXFxYfXq1XzzzTcsW7aMAQMGPPf+bm6OqFRKK9QkWaFCHgAolQY8PXVpHxQTCU/DcFfbQXrH5BLp1jGPkvrmbVLfvO9Vq/OL1jdbg4P27dvTvn17s23+/v5ERkYCEBkZiYuLS6rzEhMTOXbsGAMHDjRtc3V1pX79+gDUr1+fuXPnZnj/kJD0v92/CE9PHbGxxhUXHz0K4dGjtAMb+3hwBSIfhhKV81p2Ms3TU5duHfMiqW/eJvXN+161OqdV38wGCzmuWaFKlSocP34cMHY+rFq1aqpjLl++jLe3t2nCIYCqVauazvv9998pU6aMbQr8Hxn2OSDFGgsynFEIIUQOlOOCA19fX65cuYKvry+bN2829SmYMWMGZ8+eBeDGjRsUK1bM7Lzhw4ezY8cOOnXqxM8//0yfPn1sXnbIeLQCgEGpJFGpRPWcAEIIIYTILjkup63Vapk/f36q7cOGDTP928fHBx8fH7P9RYoUYdWqVVlevowkzZD4vMwBCgXxGg0OkZEoEhIwKK3b70EIIYR4GTkuc5DbZSZzABCnfda0EC3ZAyGEEDmLBAdWljyU8fkv/fhn/SVkMiQhhBA5jQQHVpbZzIGpU6L0OxBCCJHDSHBgZRqNBjs7O6Kinh8cJNrbk2hnJ8GBEEKIHEeCAytTKBQ4O+uIiIjI6EDiNRpU+jgUCQm2KZwQQgiRCRIcZAFnZ2ciIjKeaCNeKys0CiGEyHkkOMgCOp2O8PCwDI+TTolCCCFyIgkOskBSs4LBYHjuccnBgfQ7EEIIkXNIcJAFnJ2diYuLIzaD6ZETHOxJtFNIcCCEECJHkeAgC+h0xsWiMtMpMUGtQRmrh8REG5RMCCGEyJgEB1kgacnpzPQ7iNOqUSD9DoQQQuQcEhxkAWdnZ4DMjViQfgdCCCFyGAkOskBS5iDDZgVSzpQomQMhhBA5gwQHWcDJKfPNCglqNQaFdEoUQgiRc0hwkAUsyRwYZ0pUGzMH0ilRCCFEDiDBQRZI7pCYcZ8DgDitVjolCiGEyDEkOMgCzs6WBQfxWmOnRPvo6CwrkxBCCJFZEhxkgeRmhcxmDp6NWIiWfgdCCCGynwQHWcDS4CDR3p5EpR32EhwIIYTIASQ4yAJOTsZ5DjLbrGDslKhFGReHIj4+C0smhBBCZEyCgyyQ6emTU4gz9TuQ7IEQQojsJcFBFkiaITEz8xwkSeqUKPMdCCGEyG4SHGQBjUaDSqV6ocyBdEoUQgiR3SQ4yAIKhQKdTpfpDokABpWKBHt7Y7OCwZCFpRNCCCGeT4KDLOLsrMt8h8Rn4rQa7BISsIuLy6JSCSGEEBmT4CCLODvrLGpWgJSTIUnTghBCiOwjwUEW0el0hIeHYbCgiUD6HQghhMgJJDjIIs7OziQmJhJtwZTI8RoNBmQaZSGEENlLgoMskjTXgUX9DuzsZIVGIYQQ2c7i4CAyMjIrypHnJM11EBGR+bkOAOK1WhQGg6zQKIQQIttYHBzUqlWLIUOG8PPPP5Mo327TlbQyo6WdEuMctQDYR0nTghBCiOyhsvSEN998kz179rB79248PDxo0aIFH374IRUrVsyK8uVaSYsvWTycMSk4iI5GwgMhhBDZweLMwdq1azl69CiDBw/Gw8OD1atX07ZtW1q2bMny5ct58OBBVpQz10nKHFgaHCTa25OgUhkzBzIZkhBCiGzwQh0SCxYsSM+ePdmxYwc7d+7k008/JTo6mlmzZvHBBx/g5+fHjz/+SFRUlLXLm2tYumxzSnGOWuwSElDqZTIkIYQQtvfSoxXKli3LkCFDOHToEAsWLKBQoUL89ttvjBw5kpo1azJmzBhu375tjbLmKi/arADJTQsqGdIohBAiG1jc5+C/rl27xq5du9i7dy+3bt3CYDDw+uuv4+Pjw7///stPP/3Erl27+Prrr6lXr54Vipw7JI9WsKxDIhhHLICxU2Ksaz6rlksIIYTIyAsFB0FBQezevZtdu3Zx6dIlDAYDBQsW5NNPP6V169aUKVPGdOylS5fo2LEjU6dOfcWCA+M8By/SrBCvUWNQKGQyJCGEENnC4uCgS5cunDlzhsTERLRaLS1atKB169a8//77KBSKVMe/9tprlClThlu3blmlwLlFUuYgPNyyeQ4AUCiIc9TiEBmFIiEBg1Jp5dIJIYQQ6bM4ODh9+jTvvvsurVu3pkmTJjg5OWV4jo+PDwUKFHihAuZWyR0SLW9WAIjTGoMD+6ho9DpnaxZNCCGEeC6Lg4OjR4/i5eVl0TmffvqppbfJ9V6mQyKYd0qU4EAIIYQtWTxawdLA4FX1ojMkJonXPluESWZKFEIIYWMWZw7Kly+fZt+ClOzs7NBoNHh5efHee+/x+eef4+7u/sKFzI0cHBxQq9UWr62QxKBUEq9RYx8dY1yEyU7WyBJCCGEbFr9x2rZtS+HChTEYDLi4uFCtWjWaN29O3bp18fDwwGAw4OzsTOnSpYmKiuK7776jXbt2PHnyJCvKn6PpdLoXblYAiHN0RGEwGAMEIYQQwkYsDg4aNmzIvXv3+PTTTzl69Chr165l1qxZLF68mICAAPr3709kZCRffPEFR44cYc6cOTx48IBvv/02K8qfozk5Ob9wswJAnFPSfAev7kyTQgghbM/i4GDBggVUr16doUOH4ujoaH4xOzs+//xzqlatyty5cwFo1qwZ9erV4+jRo9YpcS6i07m8dObAANhHSr8DIYQQtmNxcHDt2jVef/315x5TsWJFLl26ZPq5dOnSPHr0yPLS5XLOzs5ERIS/8NLWBqWSBLXaOBmSLI8thBDCRiwODjw8PDhz5sxzjzl79iz58iVP+xsaGoqLi4vlpcvlkoYzRkVFvvA19E7S70AIIYRtWRwc+Pj4cObMGSZPnpyqPT0uLo65c+fy559/0rhxYwDu3LnDgQMHMsw25EUvO9cBJM93IP0OhBBC2IrFQxn79u3L77//zrp16/jhhx/w9vYmf/78REZGcvHiRcLDw6lYsSJffPEF0dHRNGnSBIAePXpYvfA5nZPTy811ABDnlKLfgaeVCiaEEEI8h8XBgaOjI+vXr2fdunVs376dc+fOmfaVKFGCzz77DD8/PxwcHAgMDKROnTp07NiRd99916oFzw2SMwcvNtcBpNHvQOY7EEIIkcUsDg7279/P22+/TY8ePejRowd6vZ6QkBCcnJxMiw0lKVKkCIsXL7ZaYXMbazQrAOidtDjGxmIfHUOck2PGJwghhBAvweKvoWPHjmXs2LGmnx0cHChYsGCqwEAkr8z4Ms0KYBzSCNLvQAghhG1YHBzExsZSqlSprChLnqPTGUdovEyzAqTolCjzHQghhLABi5sV2rZty08//USbNm0oW7as1QsUExPD0KFDCQ4OxsnJienTp5utyxAQEMCyZcsAMBgMnD59ml27dqHX6xk7dixKpZKSJUsyefJk7LK5fT4pcxAZ+XKZA4NKRbz0OxBCCGEjFgcHSfMVtGrViuLFi1O0aFE0Gk2q4xQKBQsWLLC4QBs3bqRcuXL069eP3bt3s2jRIsaMGWPaX6dOHerUqQPA8uXLqVKlCqVLl6Zv37707duXunXrMnjwYI4dO0b9+vUtvr81Ja3M+LJ9DgD0zo44BsdiHxVNnLPTS19PCCGESI/FwcGiRYtM/7558yY3b95M87iMVm5Mz+nTp+nZsydgDARS3i+l+/fvs2PHDrZt2wZAhQoVCA0NxWAwEBkZiUplcdWszlodEgH0Tk44BofgEBEpwYEQQogsZfEb9PDhw1a7+datW1mzZo3ZNg8PD9NL1cnJKd0X66pVq0xDJgFKlizJhAkT+Pbbb9HpdFSvXt1q5XxRSZmDiIiXDw7iHLUYFAocIqN48fkWhRBCiIxZHBwUKVLEajdv37497du3N9vm7+9PZKTx9RcZGZnmtMuJiYkcO3aMgQMHmrZNnjyZ9evXU7ZsWdavX8+0adPMRlWkxc3NEZVKaYWaJPP01Jn+HR3tBUBcXIzZ9hd23xlVaDie+TTgYP/y17MCq9QrF5H65m1S37zvVavzi9b3hXPvV69eZfv27Vy8eJGnT5/y/fffc/ToUZ4+fcqHH374wp0Bq1SpwvHjx6lUqRIBAQFUrVo11TGXL1/G29vbrK9Dvnz5TB0ACxQowJ9//pnhvUJCrDs00NNTx6NHyVkCvd7YtPL4cYjZ9heldVDjTDhhtx8Smy/716r4b33zOqlv3ib1zftetTqnVd/MBgsvFBwsXbqUefPmkZCQACT3Lzh16hSrV6/mwIEDzJs3D3t7y7/d+vr6Mnz4cHx9fbG3t2f27NkAzJgxg6ZNm1KpUiVu3LhBsWLFzM6bNGkSAwcORKVSYW9vz8SJE1+kalaV3CHx5YYyJtE7O8HDxzhEROaI4EAIIUTe9EIzJM6ZM4fKlSvTv39/AgICWL16NQCdOnXi8uXLHD16lA0bNtCtWzeLC6TVapk/f36q7cOGDTP928fHBx8fH7P977zzDps2bbL4fllJqVSi07kQEhJileslqNUkKpXYR0aCwQAv2OlTCCGEeB6Lc/+rVq2iePHirFmzhho1auDklNxzvkSJEixdupRSpUqxfft2qxY0t3J3dyck5Il1LqZQoHdyRBmfgDJWb51rCiGEEP9hcXBw6dIlGjRoYBol8F9KpZI6depw+/btly5cXuDu7s6TJ8EYDAarXE//bBijQ6SMWRBCCJE1LA4OlEqlaTRBep4+fYpSad1RALmVu7sHsbGxRFlpXYSkhZfsI2WdBSGEEFnD4uDgzTff5MiRI4SFpd3J7vHjxxw+fJg33njjpQuXF7i5Gad+fvIk2CrXS7S3J17tgENklHEqZSGEEMLKLA4OevXqRXBwMF26dOHAgQM8fvwYgMDAQPbt20eXLl0ICwuje/fuVi9sbpS0LoTV+h0AemdnFAaDMUAQQgghrMzi0Qo1atRgwoQJTJw4kQEDBgDGBZAaNmwIgJ2dHcOHDzetf/Cqc3f3ACA42DqZAzD2O3AMfoJDRCR6nSyVLYQQwrpeaJ6D9u3bU6dOHXbs2MH58+cJDw/H0dGR1157jQ8//JASJUpYu5y5VlKzgjUzB3GOWhLt7HCIiABDARnSKIQQwqpeeIbEggUL0qtXL2uWJU/y8DBmDqwZHKBQoHd2QhMWjjJWT4JGbb1rCyGEeOW9cHAQHR3N/fv30ev16Q7TK1++/AsXLK9IyhxYs1kBMAUHDhERREtwIIQQwoosDg5iYmL48ssv2bt3r2n65PT8+++/L1ywvCKpz4FVMwcYgwMD4BARSXR+D6teWwghxKvN4uBg3rx57Ny5E3d3dypXroxOpzOtrSBSSxqtYK2hjEkMKhXxWg32UdEoEhIwyLwSQgghrMTi4GDPnj2UKFGCbdu2mVZBFOlLnufAupkDMA5ptI+OkYWYhBBCWJXF8xyEhITQqFEjCQwySaPR4OjolEXBwbOplCNkKmUhhBDWY3FwUKJECYKCgrKiLHmWVRdfSiFeoyZBpXo2pNE6azcIIYQQFgcH3bp148CBA5w9ezYrypMnubt7WL3PAWAc0qhzxi4hUdZaEEIIYTUW9zlQqVSUK1eOzp07U61aNUqWLJnmCo0KhYIRI0ZYpZC5nZubG1FRUcTExKDRaKx67VgXZ7QhoajDI4hzdsr4BCGEECIDFgcHKV/4J0+e5OTJk2keJ8FBspQTIXl5FbbqteMcHUlU2uEQHgGFZLZEIYQQL8/i4GDt2rVZUY48LeVESNYODoyzJTqjeRqGKjqGeEetda8vhBDilWNxcPDuu+9meMyNGze4fv36CxUoL8qqiZCSxLro0DwNQx0eIcGBEEKIl5Zhh8QKFSqwcOHCVNv//vvvdLMIu3fvxt/f/+VLl0dk1URISfROjhgUChzCw2XUghBCiJeWYXBgMBjSXDvh559/ZurUqVlSqLwmKXOQFXMdAGBnR6zOGZU+DmWsPmvuIYQQ4pVh8VBGYbnkWRKzJnMAoNcZJ6VSh4dn2T2EEEK8GiQ4sIGkZoWs6nMAzxZiUihQh0Vk2T2EEEK8GiQ4sIGkZgVrL9uckkGpRO/khCo2FmVsbJbdRwghRN4nwYENJDUrZGXmACA2nw4A9VNpWhBCCPHiJDiwAUdHRzQaTdYHBzrnZ00LYTJqQQghxAuT4MAGFAoFbm7uBAdnbXCQctSCKkaaFoQQQryYTE2CdOrUKb755huzbb/99hsACxcuTDXUMWmfSObu7sHt27ey/D6x+XRowsJRh4URr7XuOg5CCCFeDZkODk6dOpXmvgULFqS5XSFz/Jtxd3fn/Pl/0Ov1aS5UZS16JycS7exQPw0nsoCnrLUghBDCYhkGBzLRkXUkd0oMoWDBgll3Izs740qNoWHYR0UT5+SYdfcSQgiRJ2UYHLRp08YW5cjzUk6hnKXBARDr4oI2NAx1WLgEB0IIISwmHRJtxBYTISWJc3IkUalEHSZrLQghhLCcBAc2YouJkEwUCmLyuWCXkIBDuMyYKIQQwjISHNiIrSZCShLj6gKAJjTMJvcTQgiRd0hwYCMeHsbMga2CgwSNhjiNGoeICBTx8Ta5pxBCiLxBggMbScoc2KRZ4ZkY13woAM1TyR4IIYTIPAkObCSpz4GtMgcAsS46DIAm9Kl0TBRCCJFpEhzYSMqhjLZiUKnQ65xRxeplOmUhhBCZJsGBjTg761Cr1Tx+/Mim941xzQc8yx4IIYQQmSDBgY0oFAoKFfIiKCjIpvfVOzsZ5zx4GgaJiTa9txBCiNxJggMbKly4CA8e3CcuLs52N1UoiHbLh11ionFSJCGEECIDEhzYkJeXFwaDgYcPH9j0vjGurhgAbRnxWiUAACAASURBVEioTe8rhBAid5LgwIa8vIoAcO9eoE3vm+hgj97ZCfvoGFTRMTa9txBCiNxHggMbKly4MAD379u23wFAjJsrABrJHgghhMiABAc2lF2ZAzB2TEywV6F5GoYiIcHm9xdCCJF7SHBgQ15eXgDcu3fP9jdXKIhxdUVhMBhHLgghhBDpkODAhgoXNmYOgoJsnzkAiHbLl9wxUWZMFEIIkQ4JDmyoQIGCKJVKm891kMSgUhHrokMVq8c+MipbyiCEECLnk+DAhpRKJQULFiIoKBuaFZ6J9jBO4+wYHJJtZRBCCJGzSXBgY15eXgQF3SMxm2YrjNdq0DtqcYiMRBkr6y0IIYRITYIDG/PyKkJcXByPHz/OtjJEu7sBoJXsgRBCiDRIcGBjyXMdZF/Tgl7nTIK9vXFYY3x8tpVDCCFEziTBgY0lz3WQfcEBCgXR7m4oDAa0IbJaoxBCCHMSHNhY8lwH2TOcMUmMaz4S7ezQPgmR1RqFEEKYUWV3Af4rJiaGoUOHEhwcjJOTE9OnT8fd3d3smKlTp3L69Gns7OwYPnw4VatW5cmTJwwZMoSYmBgKFCjA1KlT0Wq12VSL9CXPdZCNmQPAoLQj2t0Vp8dP0IQ+JeZZPwQhhBAix2UONm7cSLly5diwYQOtW7dm0aJFZvsvXrzImTNn2Lp1KzNmzGDy5MkALFq0iBYtWrBhwwYqVqzI5s2bs6P4GfLyMvY5yO7gAIwdEw0KBY6Pn8ikSEIIIUxyXHBw+vRpateuDUCdOnU4efKk2f4CBQqg0WjQ6/VERESgUqnSPO+XX36xbcEzqVAhY7NCTggODCoV0W6uKOPj0YRK3wMhhBBG2dqssHXrVtasWWO2zcPDA51OB4CTkxPh4eFm+1UqFXZ2dvj4+BAeHs7EiRMBiIiIeO55aXFzc0SlUlqjKiaenroMjtDh6enJgwdBmTjWBlzU8FsoupBQdGWLgkJh0ek5og42JPXN26S+ed+rVucXrW+2Bgft27enffv2Ztv8/f2JjIwEIDIyEhcXF7P9P/74I/nz52fFihVERkbSuXNn3n77bZydnYmMjESj0aR5XlpCQqw7hbCnp45HjzIOSgoVKsy1a1d4+DAMhYUv46zg7OqCNuQpYdfuEZsv4+eWJLP1zSukvnmb1Dfve9XqnFZ9Mxss5LhmhSpVqnD8+HEAAgICqFq1qtl+FxcXHB0dUSqVODk54eDgQFRUVIbn5SSFCxcmKiqKsLCckcqP8nDHADg+Cpa+B0IIIf6/vTsPj6q+3z7+PrNmmayQyI4JW7XooxKt8rCpUKRKL4sBQyBoay22Ki5I6U+LVREptHJVbbXwVFsLllZwaaso8sMqUEERKQgVEdCAAQJkIZkhySznPH+ERAaCRkg4k8n9uq4wmXPOnPl8MpPMzVm+J/bCwfjx4/nkk08YP348f/vb37jtttsAmDt3Lps3b2b06NEAFBQUUFBQwOjRo8nNzeXHP/4xr776KgUFBWzcuJGJEyfa2caXajgo0daxDo5hejzUpqfhCgZ1OWcREYm9UxkTExN5/PHHT5j+05/+tPH7hx566IT5Dbsa2oIvzlgo4ZxzzrW5mnpHsjqQcLiK5INl9bsWYmB3h4iI2CPmthy0B7G25QDAdLvrz1wIhUioqLS7HBERsZHCgQ1iZSCk4x3pmHl03IMyjZooItKOKRzYIJYGQjqW5XJxpEMGznCkflhlERFplxQObNBwfYWSks9truRENR0yMR0Okg6VY4QjdpcjIiI2UDiwgc+XQmZmJsXFn9ldygksp5MjWR1wmCbJBw/ZXY6IiNhA4cAmvXv3pbj4M4LBoN2lnKAmM4Owx01CRSXOujq7yxERkTNM4cAmvXv3IRKJ8Nlnn9pdyokMg8BZ2RhAculBu6sREZEzTOHAJr179wXgk0+221xJ04K+ZILJSXj9Adz+gN3liIjIGaRwYJPevfsAsHPnJzZXchKGgf+sLCzAt/+AhlUWEWlHFA5s0qdPfTiI1S0HAJGEBGoz0nEFgyQdKre7HBEROUMUDmzSo8fZuFwuduyI0S0HRwWyOxJxOUk6VIYjBg+eFBGRlqdwYBO3201OTi47dnyCFcOb7C2ns/7gRMsiZZ92L4iItAcKBzbq1asPhw9XcuhQbI8nUJeaQjA5CU8ggKfab3c5IiLSyhQObNSnT/0ZCzt2xO5xB0D9wYmdzsIyDHz7SzEiGjlRRCSeKRzYqOGMhVg/7gAg4vUQyOqAMxzBt7/U7nJERKQVKRzYqCEcxPIZC8eq6ZBJKCGBhMPVeKqq7S5HRERaicKBjWJ+rIPjGQbVXTthGQYp+0ohFLK7IhERaQUKBzbKyMikY8eObWbLAUDE6yWQ1RFHJAKf7NbZCyIicUjhwGa9evVh9+5i6trQBY5qOmQQSkyEgxUkVFbZXY6IiLQwhQOb9enTF9M0+fTTXXaX0nyGQVXXzuB04ttfqis3iojEGYUDm/Xq1XbOWDiW6XFDv54YlkXq5/vANO0uSUREWojCgc0arrEQ82MdNCUrk5r0NFx1dfh0aWcRkbihcGCztjTWQVP8nbIJez0kVlTirTxsdzkiItICFA5s1qPH2Xg8HrZt+8juUk6Nw0FVt66YDgcp+0px1tbaXZGIiJwmhQObuVwuzjvv//Df/27hyJEjdpdzSiJeD9VdO2NYFml79mp4ZRGRNk7hIAbk5V1MOBxm8+ZNdpdyyoIpPgIdO+AMhUj9fK/GPxARacMUDmLAgAEXA7Bhw3qbKzk9R7I6UOdLxhM4gm9fqQKCiEgbpXAQA+IlHGAYVHXrQijBS2LlYRLLKuyuSEREToHCQQzo1q072dln8f7772G19f9tOxxUde9KxOXCd+CgLtAkItIGKRzEAMMwyMu7hP3797F3b4nd5Zw20+3mcI+umA6D1JJ9uAMBu0sSEZGvQeEgRsTNroWjIgkJVHXrCkDa7hJcNTU2VyQiIs2lcBAj8vLqw8H778dHOAAI+ZLrr8FgWaTt/hxnra7BICLSFigcxIjzz78Ap9MZN1sOGgRTU6ju0glHxCS9eI8u0iQi0gYoHMSI5ORkzj23P5s3/4dgMGh3OS2qLj2N6k7ZOCIR0j/boy0IIiIxTuEghgwYkEddXR1btmy2u5QWV5uZQXXns+oDQvEeDbMsIhLDFA5iSF7eJUD8HJR4vNqMdKo7n4VxdAuCq40OFy0iEu8UDmLIFwclvmdzJa2nNiOd6i6dMEyT9OLP8VT77S5JRESOo3AQQ3JyepGVlc3q1auIxPHFi+rS06jqXn+aY+qeEhIqKm2uSEREjqVwEEMMw2DkyFEcOnQwrk5pbEowxUdlz+5YTicp+0pJLj2gazGIiMQIhYMYM2rU1QC89torNlfS+sJJiVSe3YOwx0NSWQWpe0p0uWcRkRigcBBjBg8eRlJSMq+99krbv85CM0S8HipzehBMTsLrD5D+2W6cdfF1KqeISFujcBBjEhISuOKK4Xz66S62b//Y7nLOCMvp5HCPbhzJzMBVFyT908/wHq6yuywRkXZL4SAGtaddC40Mg0CnbKq6dsawILVkH759pWCadlcmItLuKBzEoBEjRuJ0OttXODiqLi2VityehL0eEisqyfi0WAMmiYicYQoHMSg9PYOBAwexceMH7Nu31+5yzriI10tFTk9qMtJx1QXJ+HQ3iWXlOptBROQMUTiIUQ27Fl5/fZnNldjE4cDf+SwOd++K5XDgKz149GBFXZdBRKS1KRzEqKuuqg8Hr7zyd5srsVcwxUd5r7OpTU3BXVNLxq5ikg4e0rEIIiKtSOEgRnXr1p3LLvu/rF79Nh9/vM3ucmxluVxUd+vC4e5dMZ0Okg+WkbnzMw29LCLSShQOYtjkybcCsGDBkzZXEhuCKT4qeuVwJDMDRyhE2p4SUnd/rnERRERamMJBDBs5chQ9e57NkiV/payszO5yYoLldBLolE1F7tkEkxLx+gNk7PwU375SjHDY7vJEROKCwkEMczqd3HzzLdTW1vLss0/bXU5MiSR4OdyzO4e7dSHicZNYUUmHT3aRXHpAIUFE5DQpHMS4wsIiUlJSeeaZ/0cwqM3nUQyDYGoKFb1yqO6Ujel0klRWUR8S9pfiCIXsrlBEpE1SOIhxPl8KEyZM4sCBUl5++QW7y4lNhkFtZgblvXOo7nQWpstJUnklmTs+xbdvP46gQoKIyNehcNAG/PCHk3E4HDz++DxtPfgyDge1memU986lunMnTJeLxIrDZO7YReqeEtz+gAZSEhFphpgLB7W1tdx+++0UFhZy8803U15efsIys2fPJj8/n3HjxrFhwwYA9u7dy4033khRURETJ05k165dZ7r0VtOjR0+Kir7P9u0f89RTT9hdTuwzDGoz0ijvnUNVl06EExLwVvtJ3/05GTs/JbGsXJeGFhH5EjEXDhYvXkzfvn35y1/+wrXXXsuTT0afxrdt2zY2btzIkiVLmDt3LrNmzQLgscceY+LEiSxcuJDJkyczb948O8pvNT//+S/Iysrm0Ufn8Nlnn9pdTttgGNSlp1GZ25OKnB7UpqXiDIXxlR6kw/adpJTs09YEEZEmxFw42LBhA4MHDwZgyJAhrF27Nmp+dnY2CQkJBINB/H4/LpcLgOnTpzN06FAAIpEIXq/3zBbeytLS0pk5cza1tbX87GdTsfSB9rWEExOp7tqZsj698GdnYbpcJByuIn3352R+spPk/Qdw1dQqKIiIAC47n3zJkiU8++yzUdM6dOhASkoKAMnJyVRXV0fNd7lcOBwORo0aRXV1NTNnzgQgMzMTgF27djFnzhx+97vffeXzZ2Qk4XI5W6KVRllZKS26vmP96Eff54UX/sqKFSt4663XGTduXKs9V3O1Zr+tpnM6WD3gsB8OlOM8WE5SeQVJ5RWQ6IWsTOiQDilJYBhRD22T/Z4G9Rvf2lu/0P56PtV+bQ0HY8eOZezYsVHTbrvtNgKBAACBQIDU1NSo+S+//DIdO3bk6aefJhAIUFhYyAUXXECnTp1Yt24dDz74IHPnziU3N/crn7+i4kjLNUP9i3DwYPVXL3gaZs6cy6pVl/KjH02mS5cc+vX7Rqs+35c5E/22uoxMSM/A4w/gPVyFt9qPsXsf7N5HxOUk6PMRTPERTE4i66y0tt/v1xAXr+/XoH7jX3vrual+mxsWYm63wkUXXcTbb78NwKpVqxgwYEDU/NTUVJKSknA6nSQnJ+PxeDhy5Ajr1q1j1qxZ/OEPf+C8886zo/QzIje3F/PmPcHhw5UUFuZTWrrf7pLaPsMgmOKjulsXDvXrzeFuXahNS8WwILHyMGl7Suj48Q7YvJ3EQ+Xa/SAicc/WLQdNGT9+PNOnT2f8+PG43W4effRRAObOnctVV13F6NGj+eCDDygoKCASiTB69Ghyc3O58847CYVC/OxnPwMgJyeHhx56yM5WWs3YsQV8/vkeZs+eyYQJ43j55WX4fD67y4oPDgfB1BSCqSlgWbhqavFW+/H4/bgqqmj4KZsOB6GkJELJSQSTE4l4vSfsghARaasMqx0f2dbSm5fO5CYry7KYOnUKixY9y6BBQ3jmmYWkp2eckedu0O420aV6qdpzEHfgCJ7AEZzHjMBoGQahxATCiYmNt6Y75rL319LuXl/1G/faW8+ns1uhbf/1ascMw2DOnHmUlZXx2muvMHLk5Sxc+Df69u1nd2nxy+uhLi2VurT642AcwRDuI0dwH6nBXVOD+0gNniM1jYtHXC7CCV7CCQlHb72Ybre2MIhIzFM4aMPcbjfPPLOQ2bNn8vjj87jqqit4/PGnuPrq0Rj6AGp1psdNnSeNuvQ0AIxIBFdNLe6aWlw1Nbhqa/H6A3j9gS8e4zCIeL1EPB7CXg8Rj4fI0VuFBhGJFQoHbZzT6eTnP3+Ac8/9JnfeeSs/+MFErrxyBA8//Et69epjd3ntiuV0EvIlE/IlN04zwmFctXVHv2px1dU1BoioxwIRj7s+LDQEBrcb0+0i4naDI+aOHRaROKZwECfGjBlL//7nc++9P2XlyhWsWvUWkyZ9nx/+cLJCgo0sl4uQzxUVGLAsnMEQzmAQZ10QZzCIq+HWHwACJ6zHdDqJuF2YbndUaDBdLkyXE9PlUoAQkRajcBBH+vbtx5IlL7Ns2Sv84hf38vTTC3j66QVcccVwJkyYxOWXD9dZDbHAMOq3DHg9cNyxQUYk0hgYnKEwjlAIZyiEIxTGVRfEqK076WpNh+NoWPgiMJguJ5bTiek8euv64nvtxhCRk1E4iDOGYXD11aMZMWIky5b9kz/8YT5vvvm/vPnm/+L1ehkyZBhXXDGciy/+Fuee279x+GmJDZbTSTgpkXBSYhMzrfrwcDQsOEMhHOEwjnDk6G39965mXrnTdDiOBgdHdIBwOrAcDgjV4D0SwnI4Gr8a5lkOh7ZUiMQxfTLEKY/Hw7XXXse1117Hli0f8sorL/Paa8tYsWI5K1YsByApKZn+/c+jX79z6NevH71796F7955069adxMQmPpzEXoaB5XIRdrngy14ey4oKC0YkgiPyxW39NLNxmqsuiNHUGc0HIPXEqV88jWEcDQoGllF/y9Hb6OmO+todx8w7eh/DwDKM6FtHE9OO3mprh8iZoXEOWlBbOIe2uPgz1q79N+vXv8f777/L9u0fE2ni8sWZmZlkZ59FVtZZZGV1JD09g/T0DNLS0klJSSElJYUuXbIIhQySkpJISEgkISGBhIQEPB4PHo8Xr9eLy+WKmzMn2sLre8rML8KCYZo4IiZpPi/VlQGMiIlhNnxFcDTcb7i1TAzTwjDN+q0brVim1VSYMAww6udBwzSOBokvvrca3ofHPKZ+fv33SUleAjWh49ZF1OOOrePk0xr/Ock0Gtfd/GkNtTbxQ2ny9+url218P8fJ72dzxPXvcBNOZ5yDdh0OIj16tuj6nA6DiNm2fpyWZREOhQiFQoTDYcKRMOFwhEgkjBmJYLbQ26MhIJxwe8wfv2NDhBH1R/Hk046Z0/Bt089/8hnNlpiQQLKv/Vy05ZTfz029Z5oKDVbjPycwTjbPOumdqMnt5+OuZZzwk4ypH2DLFWMYpznyuQ0/F/M0jg9q6nfYubu4WY/VboV2zjAM3B4Pbo+nyfmWZWGaZn1QME1My8Q0LSzTBCwipollWliWhcXR22O+sGicfnSFWEfX27D+Y/NpVFZtWKY1Gj8F4XC4XYWDU9bUHzLD+FqvY4u95l/jk8BpGJimeQrP8ZUTTnl9RlMTW4jxVWs95ads6VpbcH2nu6rjH/811ncqH+8WYDisL7ZAnUHtestBe9yt0JLs6tc0zRNCyMm+wIoKIMcHkaanE7VMg969u1FZGT0+QTzT+zm+tbd+IcZ6bu5H72kEAw2fLO2Kw6aj5N1uN9B+woGItKIYP9ZD5yKJiIhIFIUDERERiaJwICIiIlEUDkRERCSKwoGIiIhEUTgQERGRKAoHIiIiEkXhQERERKIoHIiIiEgUhQMRERGJonAgIiIiUdr1hZdERETkRNpyICIiIlEUDkRERCSKwoGIiIhEUTgQERGRKAoHIiIiEkXhQERERKIoHJwm0zS5//77uf766ykqKqK4uNjuklpFKBRi2rRpFBYWkp+fz8qVKykuLmb8+PEUFhbyi1/8AtM07S6zxZWVlTF06FB27twZ9/3Onz+f66+/njFjxrBkyZK47jcUCjF16lQKCgooLCyM69d306ZNFBUVAZy0x9/+9rfk5+dTUFDA5s2b7Sz3tB3b70cffURhYSFFRUXcdNNNHDp0CIDnn3+eMWPGMG7cOP71r3/ZWe5pO7bfBv/85z+5/vrrG++fUr+WnJbly5db06dPtyzLsjZu3GjdcsstNlfUOpYuXWo9/PDDlmVZVkVFhTV06FBr8uTJ1rp16yzLsqwZM2ZYb7zxhp0ltrhgMGj95Cc/sb797W9bO3bsiOt+161bZ02ePNmKRCKW3++3Hn/88bjud8WKFdaUKVMsy7KsNWvWWLfddltc9rtgwQLrmmuuscaOHWtZltVkj1u2bLGKioos0zStkpISa8yYMXaWfFqO73fChAnWf//7X8uyLGvx4sXWI488Yh04cMC65pprrLq6Oquqqqrx+7bo+H4ty7K2bt1qTZo0qXHaqfarLQenacOGDQwePBiACy64gC1btthcUeu46qqruOOOOwCwLAun08nWrVu55JJLABgyZAjvvPOOnSW2uDlz5lBQUEB2djZAXPe7Zs0a+vbty6233sott9zCsGHD4rrfnJwcIpEIpmni9/txuVxx2W+PHj144oknGu831eOGDRsYNGgQhmHQpUsXIpEI5eXldpV8Wo7vd968eZxzzjkARCIRvF4vmzdv5sILL8Tj8ZCSkkKPHj3Ytm2bXSWfluP7raioYN68edx7772N0061X4WD0+T3+/H5fI33nU4n4XDYxopaR3JyMj6fD7/fz5QpU7jzzjuxLAvDMBrnV1dX21xly3nxxRfJzMxsDH5AXPdbUVHBli1beOyxx3jwwQe555574rrfpKQkSkpKGDVqFDNmzKCoqCgu+x05ciQul6vxflM9Hv83rC33fny/DcH+gw8+YNGiRdx44434/X5SUlIal0lOTsbv95/xWlvCsf1GIhHuu+8+/ud//ofk5OTGZU61X9dXLiFfyufzEQgEGu+bphn15own+/bt49Zbb6WwsJDRo0fzq1/9qnFeIBAgNTXVxupa1gsvvIBhGKxdu5aPPvqI6dOnR/1vKt76TU9PJzc3F4/HQ25uLl6vl/379zfOj7d+//SnPzFo0CCmTp3Kvn37uOGGGwiFQo3z463fBg7HF/8fbOjx+L9hgUAg6sOkrVu2bBlPPfUUCxYsIDMzM2773bp1K8XFxTzwwAPU1dWxY8cOZs2axaWXXnpK/WrLwWm66KKLWLVqFQD/+c9/6Nu3r80VtY5Dhw7xgx/8gGnTppGfnw/Aueeey7vvvgvAqlWryMvLs7PEFvXcc8+xaNEiFi5cyDnnnMOcOXMYMmRI3PY7YMAAVq9ejWVZlJaWUlNTw2WXXRa3/aampjb+gUxLSyMcDsf1+7lBUz1edNFFrFmzBtM02bt3L6ZpkpmZaXOlLePvf/974+9x9+7dATj//PPZsGEDdXV1VFdXs3Pnzrj4u33++efz6quvsnDhQubNm0fv3r257777Trnf+Pwv7hk0YsQI/v3vf1NQUIBlWTzyyCN2l9Qqfv/731NVVcWTTz7Jk08+CcB9993Hww8/zLx588jNzWXkyJE2V9m6pk+fzowZM+Ky38svv5z169eTn5+PZVncf//9dOvWLW77vfHGG7n33nspLCwkFApx11130b9//7jtt0FT72Gn00leXh7XX39949lX8SASiTBr1iw6d+7M7bffDsDFF1/MlClTKCoqorCwEMuyuOuuu/B6vTZX23qysrJOqV9dlVFERESiaLeCiIiIRFE4EBERkSgKByIiIhJF4UBERESiKByIiIhIFJ3KKCJfy8qVK3n++efZvHkz1dXVpKenc95555Gfn8+VV14ZteyBAwdYvXo11113nU3Visip0KmMItJsM2fOZNGiRXTt2pWBAweSkZFBaWkpb7/9NpWVlYwbN46ZM2cC9Ve0HDFiBJdeemnj2Bgi0jZoy4GINMu7777LokWLGDlyJPPmzYsaJry6uppJkybx/PPPM3ToUIYPH05NTU3UsK0i0nbomAMRaZa33noLgAkTJpxw/ZCUlBSmTp0KwIoVK850aSLSwhQORKRZGi5MtH379ibn5+Xl8Zvf/IYbb7yRF198sfH4g5UrV9KvXz9efPHFxmWLi4u55557GDhwIP3792fUqFHMnz8/6uJHAEVFRQwZMoSSkhJuueUWLrzwQgYOHMi0adPYu3dvK3UqIs4HHnjgAbuLEJHYF4lEeOWVV1i7di1lZWWkpqaSnZ3deKU/l8tFnz59yMrKAsDj8bBp0yZycnKYOHEi3/rWt8jKymLr1q2MHz+ebdu2MXToUAYPHkx5eTkvvfQSH374IVdffXXjOl966SVKS0tZtmwZVVVVjB49GrfbzRtvvMHrr7/Od77znajLDYtIy1A4EJFmycnJoaysjE2bNrF582aWLl3Ks88+y4YNGygrK6NTp06NH9RZWVnk5uby5z//mQEDBvDQQw+RlZWFZVncdNNNlJeXs3jxYoqKihg4cCD5+fn4/X7+8Y9/0KFDB84//3ygPhzs2rWLnj17smTJEoYNG8bo0aNJTk5m+fLlVFZWMnz4cDt/LCJxSbsVRKTZHnjgAebPn8/gwYNxu934/X7efvttZs+ezZVXXsmjjz6KaZonffymTZvYvn07+fn59O/fP2reHXfcgdvtjtr90ODuu+8mISGh8f4NN9xA165dWb58OcFgsOUaFBFAZyuIyNc0bNgwhg0bRiAQ4P3332ft2rW8+eabFBcXs2DBAkzTZNq0aU0+duvWrQDs3r2bJ5544oT5ycnJfPzxx1iWhWEYABiGQV5eXtRyTqeTb37zm7zxxhvs3r2b3r17t3CXIu2bwoGInJLk5GSGDh3K0KFDmT59OkuXLmXGjBksWrSI2267rcnHVFVVAbB69WpWr1590nUHAoHGXRQZGRl4PJ4TlunYsSNQfxqliLQshQMR+Up+v58xY8aQk5PD/PnzT5hvGAZjx47l9ddfZ82aNezfvx+3233CcklJSQDMmjWL/Pz8Zj13XV1dk9MbgkZGRkZz2xCRZtIxByLylXw+H9XV1bzzzjscOnToS5d1OBxkZWU17hY4Vr9+/QDYsmXLCfNCoRC//OUvWbhwYdT0QCDAzp07T1h+06ZNZGRk0L1796/Tiog0g8KBiDTLhAkTCAaDTJkyhQMHDpwwf+XKlbzzzjuMGDECn8/XOFDSsWMXXHzxxXTr1o2lS5eycePGqMcvWLCAfC3gBgAAAZZJREFUP/7xj43HJRzr17/+ddSBh8888wx79uzhe9/7Hk6ns6VaFJGjdG0FEWmWcDjM3XffzfLly0lMTGTQoEGcffbZhMNhNm3axAcffEBubi7PPfccmZmZBINBBgwYgGEYjB8/nhEjRpCXl8f777/PzTffTDAY5Morr6R79+5s2bKFdevW0a1bNxYvXkx2djZQPwjSe++9R0pKCp07d+ayyy5j586drFmzhj59+vDXv/5V4xyItAKNcyAizeJwOBg1ahTf+MY3qK2t5cMPP+Tdd99l27Zt+Hw+Jk2axOzZs0lJSQHqzyjIyspi06ZNrF+/nk6dOnHJJZfQpUsXhg8fTmVlJe+99x7r16/Hsiy++93vMmfOnMZBlKB+nIOSkhIWLlzI1q1bWbFiBYFAgOuuu465c+c2PpeItCxtORCRmNWw5WD9+vWkpqbaXY5Iu6FjDkRERCSKwoGIiIhEUTgQERGRKDrmQERERKJoy4GIiIhEUTgQERGRKAoHIiIiEkXhQERERKIoHIiIiEgUhQMRERGJ8v8BOYrw/20inB0AAAAASUVORK5CYII=\n", 168 | "text/plain": [ 169 | "
" 170 | ] 171 | }, 172 | "metadata": {}, 173 | "output_type": "display_data" 174 | } 175 | ], 176 | "source": [ 177 | "plt.style.use(\"seaborn\")\n", 178 | "ax = plt.axes()\n", 179 | "plt.plot(qng_run, \"black\", label=\"Quantum natural gradient descent\")\n", 180 | "plt.plot(vanilla_run, \"pink\", label=\"Vanilla gradient descent\")\n", 181 | "\n", 182 | "plt.ylabel(\"Energy\", fontsize=20)\n", 183 | "plt.xlabel(\"Step\", fontsize=20)\n", 184 | "\n", 185 | "ax.axhline(y=exact_energy, label='Exact energy', color='r')\n", 186 | "plt.legend(fontsize=15)\n", 187 | "plt.show()" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": null, 193 | "metadata": {}, 194 | "outputs": [], 195 | "source": [] 196 | } 197 | ], 198 | "metadata": { 199 | "kernelspec": { 200 | "display_name": "Python 3", 201 | "language": "python", 202 | "name": "python3" 203 | }, 204 | "language_info": { 205 | "codemirror_mode": { 206 | "name": "ipython", 207 | "version": 3 208 | }, 209 | "file_extension": ".py", 210 | "mimetype": "text/x-python", 211 | "name": "python", 212 | "nbconvert_exporter": "python", 213 | "pygments_lexer": "ipython3", 214 | "version": "3.8.2" 215 | } 216 | }, 217 | "nbformat": 4, 218 | "nbformat_minor": 2 219 | } 220 | -------------------------------------------------------------------------------- /lih/lih_4qubits.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## LiH VQE 4 Qubit Example" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "colab": {}, 15 | "colab_type": "code", 16 | "id": "JK_gVKFbS3mR" 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "#import packages\n", 21 | "import numpy as np\n", 22 | "import pennylane as qml\n", 23 | "from pennylane import expval, var, device, VQECost\n", 24 | "\n", 25 | "import sys\n", 26 | "sys.path.append('../')\n", 27 | "from run_vqe import *\n", 28 | "\n", 29 | "pi = np.pi" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": { 36 | "colab": { 37 | "base_uri": "https://localhost:8080/", 38 | "height": 1000 39 | }, 40 | "colab_type": "code", 41 | "id": "v3agYICYWLuq", 42 | "outputId": "0deef5fc-5fb9-4d07-a816-dba53d777223" 43 | }, 44 | "outputs": [ 45 | { 46 | "name": "stdout", 47 | "output_type": "stream", 48 | "text": [ 49 | "4\n" 50 | ] 51 | } 52 | ], 53 | "source": [ 54 | "name ='LiH';charge = 0;multiplicity=1;basis= 'sto-3g';geometry = 'lih.xyz';\n", 55 | "h, nr_qubits = qml.qchem.generate_hamiltonian(\n", 56 | " name,\n", 57 | " geometry,\n", 58 | " charge,\n", 59 | " multiplicity,\n", 60 | " basis,\n", 61 | " mapping='jordan_wigner',\n", 62 | " n_active_orbitals=2,\n", 63 | " n_active_electrons=2,\n", 64 | ")\n", 65 | "print(nr_qubits)" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 3, 71 | "metadata": { 72 | "colab": {}, 73 | "colab_type": "code", 74 | "id": "Uej1Hp1cS74d" 75 | }, 76 | "outputs": [], 77 | "source": [ 78 | "dev = qml.device(\"default.qubit\", wires=4)\n", 79 | "def ansatz(params, wires=[0,1,2,3]):\n", 80 | " qml.BasisState(np.array([1, 1, 0, 0]), wires=wires)\n", 81 | " for i in wires:\n", 82 | " qml.RY(params[i], wires=wires[i])\n", 83 | " qml.CNOT(wires=[wires[0], wires[1]])\n", 84 | " qml.CNOT(wires=[wires[2], wires[3]])\n", 85 | " qml.CNOT(wires=[wires[1], wires[2]])\n", 86 | " for i in wires:\n", 87 | " qml.RY(params[i+4], wires=wires[i])\n", 88 | " qml.CNOT(wires=[wires[0], wires[1]])\n", 89 | " qml.CNOT(wires=[wires[2], wires[3]])\n", 90 | " qml.CNOT(wires=[wires[1], wires[2]])" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 4, 96 | "metadata": { 97 | "colab": {}, 98 | "colab_type": "code", 99 | "id": "b7zx1-VGXo2e" 100 | }, 101 | "outputs": [], 102 | "source": [ 103 | "cost = VQECost(ansatz, h, dev)" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 5, 109 | "metadata": { 110 | "colab": { 111 | "base_uri": "https://localhost:8080/", 112 | "height": 1000 113 | }, 114 | "colab_type": "code", 115 | "id": "7Kz1HQIc44UQ", 116 | "outputId": "646dbb51-e5a1-472e-9af8-38174dddead1" 117 | }, 118 | "outputs": [ 119 | { 120 | "name": "stdout", 121 | "output_type": "stream", 122 | "text": [ 123 | "QNG\n", 124 | "Iteration = 0, Ground-state energy = -7.39682593 Ha, Convergence parameter = 0.01850782 Ha\n", 125 | "Iteration = 20, Ground-state energy = -7.62671713 Ha, Convergence parameter = 0.00443753 Ha\n", 126 | "Iteration = 40, Ground-state energy = -7.68067582 Ha, Convergence parameter = 0.00198604 Ha\n", 127 | "Iteration = 60, Ground-state energy = -7.71427018 Ha, Convergence parameter = 0.00144494 Ha\n", 128 | "Iteration = 80, Ground-state energy = -7.73813195 Ha, Convergence parameter = 0.00095651 Ha\n", 129 | "Iteration = 100, Ground-state energy = -7.75221093 Ha, Convergence parameter = 0.00049663 Ha\n", 130 | "Iteration = 120, Ground-state energy = -7.75891855 Ha, Convergence parameter = 0.00022084 Ha\n", 131 | "Iteration = 140, Ground-state energy = -7.76188753 Ha, Convergence parameter = 0.00010012 Ha\n", 132 | "Iteration = 160, Ground-state energy = -7.76331137 Ha, Convergence parameter = 0.00005180 Ha\n", 133 | "Iteration = 180, Ground-state energy = -7.76410354 Ha, Convergence parameter = 0.00003111 Ha\n", 134 | "Iteration = 200, Ground-state energy = -7.76460890 Ha, Convergence parameter = 0.00002100 Ha\n", 135 | "Iteration = 220, Ground-state energy = -7.76496493 Ha, Convergence parameter = 0.00001538 Ha\n", 136 | "Iteration = 240, Ground-state energy = -7.76523358 Ha, Convergence parameter = 0.00001192 Ha\n", 137 | "Iteration = 260, Ground-state energy = -7.76544644 Ha, Convergence parameter = 0.00000963 Ha\n", 138 | "Iteration = 280, Ground-state energy = -7.76562127 Ha, Convergence parameter = 0.00000802 Ha\n", 139 | "Iteration = 300, Ground-state energy = -7.76576873 Ha, Convergence parameter = 0.00000684 Ha\n", 140 | "Iteration = 320, Ground-state energy = -7.76589562 Ha, Convergence parameter = 0.00000593 Ha\n", 141 | "Iteration = 340, Ground-state energy = -7.76600642 Ha, Convergence parameter = 0.00000521 Ha\n", 142 | "Vanilla\n", 143 | "Iteration = 0, Ground-state energy = -7.38206126 Ha, Convergence parameter = 0.00374316 Ha\n", 144 | "Iteration = 20, Ground-state energy = -7.45617231 Ha, Convergence parameter = 0.00356984 Ha\n", 145 | "Iteration = 40, Ground-state energy = -7.52088172 Ha, Convergence parameter = 0.00287935 Ha\n", 146 | "Iteration = 60, Ground-state energy = -7.56982876 Ha, Convergence parameter = 0.00206842 Ha\n", 147 | "Iteration = 80, Ground-state energy = -7.60410466 Ha, Convergence parameter = 0.00142975 Ha\n", 148 | "Iteration = 100, Ground-state energy = -7.62800412 Ha, Convergence parameter = 0.00101432 Ha\n", 149 | "Iteration = 120, Ground-state energy = -7.64543800 Ha, Convergence parameter = 0.00076291 Ha\n", 150 | "Iteration = 140, Ground-state energy = -7.65897268 Ha, Convergence parameter = 0.00061032 Ha\n", 151 | "Iteration = 160, Ground-state energy = -7.67009322 Ha, Convergence parameter = 0.00051336 Ha\n", 152 | "Iteration = 180, Ground-state energy = -7.67963265 Ha, Convergence parameter = 0.00044776 Ha\n", 153 | "Iteration = 200, Ground-state energy = -7.68806865 Ha, Convergence parameter = 0.00040055 Ha\n", 154 | "Iteration = 220, Ground-state energy = -7.69568756 Ha, Convergence parameter = 0.00036461 Ha\n", 155 | "Iteration = 240, Ground-state energy = -7.70266761 Ha, Convergence parameter = 0.00033576 Ha\n", 156 | "Iteration = 260, Ground-state energy = -7.70912062 Ha, Convergence parameter = 0.00031132 Ha\n", 157 | "Iteration = 280, Ground-state energy = -7.71511440 Ha, Convergence parameter = 0.00028946 Ha\n", 158 | "Iteration = 300, Ground-state energy = -7.72068628 Ha, Convergence parameter = 0.00026890 Ha\n", 159 | "Iteration = 320, Ground-state energy = -7.72585298 Ha, Convergence parameter = 0.00024881 Ha\n", 160 | "Iteration = 340, Ground-state energy = -7.73061861 Ha, Convergence parameter = 0.00022874 Ha\n" 161 | ] 162 | } 163 | ], 164 | "source": [ 165 | "max_iterations = 350\n", 166 | "step_size = 0.05\n", 167 | "conv_tol = 1e-06\n", 168 | "initial_params = np.random.uniform(low=0, high=2*np.pi, size=8)\n", 169 | "\n", 170 | "print(\"QNG\")\n", 171 | "qng_run = run_vqe(cost, max_iterations, initial_params, 'QNGOptimizer', step_size, diag_approx=False)\n", 172 | "\n", 173 | "print(\"Vanilla\")\n", 174 | "vanilla_run = run_vqe(cost, max_iterations, initial_params, 'GradientDescentOptimizer', step_size)" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 10, 180 | "metadata": { 181 | "colab": { 182 | "base_uri": "https://localhost:8080/", 183 | "height": 279 184 | }, 185 | "colab_type": "code", 186 | "id": "4tDMZhD045nO", 187 | "outputId": "6c1281c3-7c9f-4a19-8089-09f091dbfebc" 188 | }, 189 | "outputs": [ 190 | { 191 | "data": { 192 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAFcCAYAAAC+3AbrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeViUVfvA8e8Mw464suSelgsquaBpCoJaqeG+pYmalkumkpq46y93e6VyB7eUXDNfjdLEXQPTzNTUrFTUIhdIRWSdGZ7fH7yQBBjLDDMM9+e6uC541vs4yNxzznnuo1IURUEIIYQQpYra1AEIIYQQovhJAiCEEEKUQpIACCGEEKWQJABCCCFEKSQJgBBCCFEKSQIghBBClEIaUwdQXGJjEwx+zfLlHXjwIMng1zU30k7LIu20LNJOy2Lodrq4lMlzn/QAFIFGY2XqEIqFtNOySDsti7TTshRnOyUBEEIIIUohSQCEEEKIUkgSACGEEKIUkgRACCGEKIUkARBCCCFKIUkAhBBCiFJIEgAhhBCiFJIEQAghhCiFJAEQQgghSiFJAIQQQohSSBKAQkhPVxg16jTffBNt6lCEEEKIQpEEoBBu3ozjiy/aM3iwztShCCGEEIUiCUAhuLs7AeHcu/c8P/wg/4RCCCFKHnn3KgR7e3vs7EIACAmxMXE0QghhXg4dOsC4caPw9+/Ayy/7MHToG2zfvpnU1NSsY/buDadNGy8+/XRtrtcYMmQA8+bNzrH9ypXLzJkzk969u9Cu3Uv4+7/MlCkTuHDhnLGaY7EkASikZ565gkZzkfBwDb//rjJ1OEIIYXKKojBnzkw++GA6lStXZerU2cyfv5hWrdqwbl0o7777Ng8fPsx2zqZN67l160a+rv/ll/9lxIg3uXv3DsOGjSA4eDnjxweRmprGmDEjOHr0kBFaZbkkASgkV1dX9Pr/oNerWLtWegGEEGLnzu3s37+XmTPnEBQ0jZdeakPz5i15++1RrFy5lhs3bvDhh/OynWNjY8OiRfNQFOWp175y5QrBwYvo0OFVli0LoVMnfxo3bkq7dh0IDl6Gj48fS5YsQqvVGrOJFkUSgEJycXFFUbZQqZKOzz6z5vFjU0ckhBCmk56ezubNG3nppTa0b/9Kjv3PPfc8r7/+BseOHeHmzRtZ20eOfJfz539kz55dT73+2rVrsbGxZdy4CahUOXtdhw0bwQsvNCE+/mEuZ4vcSAJQSC4uLoCWbt3+JCFBxZYt1qYOSQghTObXX68QFxdL69Y+eR7j69segMjIE09s60CbNj6sXr2MuLjYPM89evQozZo1x9m5bK77a9Z8lrlzF1GpkkshW1D6aEwdQEnl4uIKQKtWl9i8uRqhoTYMG6bFysrEgQkhSqzZs6cTHr67QOeo1SrS05/efV4QXbp0Z/bsuQU+786d2wC4uz+T5zGVK1cB4N69O5QrVy5r+/jxQQwc2Jfg4MXMn/9hjvMePXpEQkICVatWy7ZdURT0en22bVZWVrn2EIicpAegkDITgNTUP+jbV8utW2r27ZN8Sggh8qJWZ7wx6/Xp2ba7uroxYsRojh8/wrFjh3Ocl56ecfw/39cPHYrA17dltq+tWz8zTvAWSN6xCikzAYiNjWXECC2bNtmwerU1/v5SHEgIUTizZ88t8KdvF5cyxMYmGCmi/Mv85H/79p95HvPnnxn73Nzccuzr0aM3Bw58Q3DwYpo1a5FtX7ly5XBwcODOnTvZtrdo0Yq1azdl/fzWW4MKHX9pJD0AheTqmpkA3OP559Pp0EHH6dMazp6Vf1IhROlTp049XFxcOXHiWLbtt27dJCUlBYATJ44C0KJFyxznq9VqJk2aSnz8Q1au/CTH/rZt23L69HdZ1wJwdnamXj2PrC9RMPJuVUh/9wDcA2DkyDRACgMJIUontVrNwIFDOHUqigMHvsnavmbNKnr1eo3t2zezZcsmXnzxJerUqZfrNWrVeo433hhMePhu/vwzJtu+4cOHk5KSTHDwohzj/gDR0dcN26BSwORDAKGhoZw4kTEj9NGjR8TFxREZGZnjuOTkZF5//XUmTJiAj48P9+/fZ+LEiaSkpODq6sqCBQuwt7cvtrj/mQB4e+vx8NDz5ZcaZsxQUbWq4SblCCFESdCzZx9++eVn5s6dxY8//oC3ty9du/YgJuZ3li37CLVazciRo596jcGDh3HkyEFu3bqZbbuHhwdBQdP58MMFREdfw9+/O9WqVSchIYGoqBNEROzD1dWNxo2bGLOJFsXkPQDDhw8nLCyMsLAw3N3dWbhwYa7HffDBB9lmdq5cuRJ/f3+2bNmCh4cH27dvL66QAXBwcMDJyYl79zISAJUqoxdAr1exbp30AgghSh+VSsXUqbOYOXMOt27d5IMPZjB16vsoisLbb4+iaVMv3n13OJ9/vi3Pa9jY2DBp0rRcZ/J36uTP+vWfUbeuB1u2bGLixHEsXDiHmJg/GDNmPFu2fIGHR0NjNtGiqJR/K79UTCIiIjhw4AAffpjzEZB169ZRpkwZzp49S+fOnfHx8aFHjx6Ehobi4uLyvwpRwYSGhuZ5fWNMkmnVqgkJCY+5ePE3AFJToWlTR1JTVZw79xgnJ4Pf0iTMZZKRsUk7LYu00zwdPXqIlJQUOnZ8rUDnlbR2Fpah2+niUibPfcXaA/D555/j7++f7evChQsAhISE8O677+Y45+TJk9y8eZO+fftm2/748WPKlMlomKOjIwkJxf+L4ebmxl9/xWU9omJrC8OGaXn0SMXWrVIYSAgh/snXt32B3/yFcRTrHIA+ffrQp0+fHNuvXr2Ks7MzNWrUyLFv586dxMTEEBAQwPXr17l06RIuLi44OTmRmJiInZ0diYmJODs7P/Xe5cs7oNEYtkqPm5sber0etTrtf5UBYcIE+PhjWLfOjqAgO4spDPS0LNKSSDsti7TTskg7DcvkkwABoqKi8PHJvXzkkiVLsr6fPHkynTt3pn79+jRt2pRjx47Rs2dPjh8/TrNmzZ56jwcPkgwaM4C7uzsAP/98HbDL2t6njy1hYTaEhSXz2mslvy6AdL1ZFmmnZZF2WhaLHQLIS3R0NNWqZS/xuHjx4qzhgdyMGjWKr7/+mtdff50ff/yRgQMHGjvMHDKLWWQ+CZBpxIiM1ahWr5ZhACGEEObJLHoAZs2alWPbpEmTcmx78gmBSpUqsW7dOqPG9W/ySgDq1EmnfXsdhw5p+PFHNU2apOd2uhBCCGEyZtEDUFJlJgCZjwI+SQoDCSGEMGeSABRBXj0AAD4+eurXzygMFBMjK1MJIYQwL5IAFMHTEoDMwkA6nYp162QugBBCCPMiCUARPC0BAOjZU4eLSzqbNtnw+HFxRiaEEEI8nSQAReDk5ISDgyOxsbG57re1hTffzCgMtH279AIIIYQwH5IAFJGLi0uePQAAQ4ZosbVVCAmxIZcFrIQQosQbN24UvXr5k1dl+WvXrtKmjRcREfsMds/Q0JV07OgLgE6no00bL3bs2AJAePhu2rTxMliF2MOHDzJ+/Lt06/Yqfn6t6N27C//5zwLu3r2TI6Y2bbyyvry9m/PKK20ZPnwI4eG78/z3MRWzeAywJHNxceXcubOkp6ejVufMpypVUujbV0tYmA3792vo3LnkFwYSQogndez4GvPmzebixQs0avRCjv0REftwcHDEx8fPYPfs3r0XPj6+BrtebhRFYe7cmRw4sJ+OHV+je/feODs7c/PmDbZt+4xjx46wevV6qlSpmnWOvb0DH3204n/np/Po0SNOnDjKokVz+e23Xxg/PsioMReE9AAUkYuLKzqdjgcPHuR5zPDhGYWBQkJkGEAIYXl8fdtjb2/PoUMHcuxTFIWDB/fTrl0H7Ozscjm7cFxd3ahXz8Ng18vNzp3b2b9/H1OmzGTq1Fn4+PjSuHFTunXryZo1m7Czs2PVqmXZzrGyUtOwYSMaNmxEo0Yv0Lq1N5MnzyAg4E127fqcc+fOGjXmgpAEoIhcXFyBvCcCAtStm067djpOntRw/rz8kwshLIu9vT1t27bjyJGDWYujZTp//kfu3r1Dp05dsrZdvPgT48ePoWNHX/z8WjFgQC++/PK/WfvDw3fTteurnD79HYMHv067di/x2muvERX1bdYxTw4B/BtFUdi27TMCAvrSrt1LvPyyD+PHv8v169fyPCc9PZ3NmzfSuHFTOnXyz7HfycmJoUOHZ70H/JuBAwdjY2NLePjufB1fHOTdqIgyFwF6WgIAMGJERmGg1aulMJAQwvJ06uTPX3/Fcf78j9m2R0Tso0qVqrzwQmMAbt/+k7FjR1KmjBNz5ixi/vwPqVKlKosXzyM6+nrWeY8fJ7Bo0Vx6936dhQuDcXZ2ZubMyTwuxCNVn322kdDQVXTr1pMlS5YRGDiRa9eusmDBB3me88svPxMXF4ufX4entnncuAn5isHR0Yl69epz8WLeJe6Lm8wBKKL89AAA+PrqqVdPz549GmbMUFG5snlNBhFCmN7s2baEhxfsz7JaDenpjgaLoUsXHbNnpxb4vKZNvXBzc+fQoQiaNMlYnE2r1XL06GH69u2fddz169fw9HyBGTPmoNFktLVevQZ06fIy58+f5dlnawGQlpbG2LHjadu2HQA1a1amZ8+e/PjjGby9fQsUW1zcPd588216934dgCZNmhEf/5CVK5eSmpqKra1tjnNu374NQNWq2depSU9Pz9HLkdmOf1O+fHl+++3XAsVuTJIAFJGr69NrAWTKLAwUGGjPunXWzJiRVhzhCSFEsVCpVLzySifCw3fz3nuTsLKy4rvvIklIeETHjq9lHde6tTetW3uTmppKdPQ1fv/9dy5fvghAWpo22zUbNGiU9X3m6qvJySkFju299zLWlnnw4D43b97g5s0bWcMJWq021wQgPV2f1a4nLV48j6++2pNt24YNm3n++boFjsvUJAEoor97AHKvBfCknj11zJ2bURjovffScHIydnRCiJJk9uzUAn/6zlg+NtFIERVMp07+hIVt4OzZ72nevCUHDuynSZNmuLs/k3WMTqdj2bJgwsP3oNNpqVz57+EByN4zamv796TBzDdiRSn44mrR0ddZvHguP/10AXt7e2rXfh4HB4f/XS/33tjMmO/cuZ1t+5Ahb9G9ey8ALl++RHDwonzHERsbmzVsbA5kDkAR5XcOAICdXUZhoPh4KQwkhLA81avXwMOjIYcOHSApKZHIyOM5JtB9+ula9u4NZ+bMD4iIOM62bbsYO3a80WLS6/VMmvQeAJs2bWf//mOsXr2eVq3aPPW8+vUbUL58BU6cOJptu7v7M9Sr50G9eh5Uq1Y933EkJCRw9eqveHo2/veDi4kkAEXk6prRA3Dv3t18HZ9ZGCg01IZ0WSVYCGFhOnXy59tvjxMZeQK12gpf3/bZ9l+8eIH69Rvg69s+67HA7747CeT9abwo7t//i9u3Y+jatSe1atXOqtdy+vTT72llZUVAwBBOnoxk376vcj3mxo3ofMexbdtnpKWl4e/fvYAtMB4ZAigiR0cn7O3t8zUEAODiotC7t5bNm22IiLCiY0cpDyiEsBzt27/CsmXBrFsXip9fRn2AJ9Wv34Bt2z5j167PefbZWly+fJFPP12HSqUiJaXg4/v/plIlF1xcXNm+fQtly5ZDpVKxb99XfPddFACpqSmAc67n9unTn5s3bzBv3myior7F17c9FStW5PbtP4mI2Mf335/ihRea4ObmnnWOXp/OxYs/ARnDFfHxD4mMPMFXX+2hX78BNGzYKNd7mYIkAEWkUqlwcXHN1xBAphEjMhKA1att6Ngx2YjRCSFE8XJ2duall7w5evQQQUHTcuwfNGgo9+//xbp1q9FqdVStWo2JEyezd284ly79ZPB4VCoV8+d/yMcf/4cZM4JwcnLCw6MhwcHLee+90Vy8eCHPR/1UKhXvvz8VHx8/du/+guXLP+LBg/uULVuWhg09WbgwmNatvbNNFExOTmLkyDezzi9fvgI1atTk//5vAe3a5f1IoSmoFHMrTmwksbGGqQn9pIzJNwl06tSOCxfO88cfcTlmjOalXz97jhzRcPBgIp6e5j0WkNlOSyfttCzSTssi7Sz89fIicwAMwMXFDa1Wy8OHeZcD/icpDCSEEMKUJAEwgII8CpjJz09P3bp6du/WcPt2/noNhBBCCEORBMAACvIoYCaVKmMugE6nYv16eSRQCCFE8ZIEwAAyewDy+yhgpl69tFSqlM7GjTYkmkcdDyGEEKWEJAAGkFkLoCA9AAD29hl1AR4+lMJAQgghipckAAZQmDkAmYYM0WJjI4WBhBBCFC9JAAygMHMAMrm6ZhQGun5dzYEDVoYOTQghhMiVJAAGkN8lgfMyYkTGCljySKAQQojiIgmAAZQp44ydnV2hE4D69dNp21ZHZKSGn36Sl0QIIYTxybuNAfxdDrjgcwAyjRqVURhoxQrpBRBCiJKkMAV1zaEIr8kTgNDQUAICAggICKBbt260bt061+OSk5Pp1q0bx48fB+Dhw4e8+OKLWedu3LixOMPOwcXFhdjYe4V+Uf389NSvr2fPHg23bklhICFEyXXlymXmzJlJ795daNfuJfz9X2bKlAlcuHDO1KE91dmzZ2jTxosrVy7n6/h79+4yfvwY4uPjC3SfL7/8L2vWrCpMiAZl8gRg+PDhhIWFERYWhru7OwsXLsz1uA8++CBbnf3Lly/j7++fde7gwYOLK+Rcubi4kpaWRnz8w0Kdr1LBmDFp6PUqVq2SXgAhRMn05Zf/ZcSIN7l79w7Dho0gOHg548cHkZqaxpgxIzh69JCpQzSYM2dOZy0rXBCbNq3n8WPTr2tg8gQgU0REBM7Oznh7e+fYt27dOpo0aUK9evWytl28eJFLly4xcOBAxo4dy717hRt/N5SiPAqYqXt3HdWqpbNlizVxcdILIIQoWX777VeCgxfRocOrLFsWQqdO/jRu3JR27ToQHLwMHx8/lixZhFarNXWoAkApRjt27FBee+21bF/nz59XFEVRevbsqdy4cSPHOVFRUcqMGTMURVGUoKAg5dixY4qiKMqBAweUyMhIRVEUZc+ePcqYMWOeem+tVmfIpuQwbdo0BVCOHj1apOssXaoooCgzZxooMCGEKCYTJkxQmjRpojx48CDX/VevXlXGjBmj3LlzR1m6dKnSo0cPZd68eUqzZs2Ufv36KYqiKI8fP1YWLlyo+Pn5KY0aNVJ69eqlnDhxIusa3333nVKnTh3lwoUL2a7drFkzZenSpYqiKMoXX3yhtGjRQomKilK6du2qNGjQQOnUqZNy8ODBbOccPXpU6datm9KoUSOlX79+ys6dO7NdOzExUZk6darSunVrpVGjRkr37t2V/fv3Z92jTp06WV+Z9757964yefJkpXXr1oqHh4fSunVrZe7cuUpqaqqiKIri5+eX7bxMP/30kzJo0CDF09NTefHFF5UPPvhASUpKKvRrkR+a4kw2+vTpQ58+fXJsv3r1Ks7OztSoUSPHvp07dxITE0NAQADXr1/n0qVLuLi40LJlS+zt7QF4+eWXWbp06VPv/eBBkmEa8YQnl210dCwLwG+/3cDDo2mhr9mlC8ye7cjSpSqGDHmMk5NBQi0SWYbTskg7LYs5tfPIkSM0bdocrdYq15icnV2ZMWMeAImJqVy5cgW1WsOcOYtIS0vj7t14Ro9+m1u3bvD22+/g5ubO11/vYfjw4YSEhFCvXmMePsz4W/7wYVK2eyiKQmJiKrGxCSQkpJCYmEhQ0GQGDx7GM888w6efriMw8D12796Ls3NZLl78idGjR+Hr245hw0Zx8eIFZs+ene3a//nPAk6d+o4xYyZQtmxZvv76S8aNG8emTdtp2NCLwYOHsXHjOpYsWcazz9bi7t143nxzKCqVisDASTg5OXHq1Ek2bdpEhQqu9O79OnPmLOL998fRqFFjXn99ILGxCURHX+fttwfRoIEnH3/8MTduxLB69XKuX7/B4sUfF+k1edpywMWaAOQlKioKHx+fXPctWbIk6/vJkyfTuXNn6tevT2BgIK+88gqdO3fm5MmTNGjQoLjCzZWrqxtQ+FoAmRwdYdgwLR9+aMvmzdZZNQKEEJbPcfZ0bMN3F+wktYoK6YabUZ7apTuJs+cW+LxHjx7x+PFjqlatlm27oijo9fps26ysMoqe6fV6xo2bQL16HgB8++1xfvrpPEuWLOPFF1sB0KpVa0aMeJOPPvqIkJD8T/bWarW888442rd/GYDy5SsyZEh/zp49g69ve7Zs2US1atWZPXs+KpWKli1f4vHjBHbu3J51jXPnfqR58xa0a9cBAE/PxpQvXwG9Xk/58uWpUqUqAHXr1qdcuXLcvXuHMmXKEBj4Ps899zwAzZo159Spk5w7d5bevV+nTp16WFvbUKFCBRo2bATAp5+upXz5inz44cdUqVKR2NgEqlWrzujRb3Pu3FkaNy78h8qnMYs5ANHR0VSrlv2XZvHixVy4cCHPcyZMmMDWrVsJCAhg27ZtTJs2zdhhPlVRiwE9adiwNBwcFFavtkGGyoQQJUH6/2qZq/4xfenQoQh8fVtm+9q69bOs/TVqPJv1/fnzP+Lg4Jj15p+pfftXuHTpEklJBVs1rUGDRlnfZ67ZkpycDMBPP53nxRdbZZtc3rZtu2znN2rkSXj4boKC3mPPnl3Exz9kzJj3qF37uVzv5+bmzvLlodSqVZvff79FVNS3bNq0ngcP7pOWlvcf8x9//IEWLV5ErVaj0+nQ6XQ0aNAIR0dHfvjh+wK1uSDMogdg1qxZObZNmjQpx7YnnxCoVq0aYWFhRo2rIP5eEbDoCUCFCvDGG1rWrLFh1y4N/frpinxNIYT5S5w9t8Cfvl1cynDfDIYAypUrh729PXfu3Mm2vUWLVqxduynr57feGpT1vb29fdZQLkBCwiMqVKiQ49qZ25KSCjaUa2dnl/W9SpXxeVf536PaCQmPKFu2XLbjK1asmO3nwMCJVKrkwjff7CUy8gRLlqjx8fFlypSZODrmPj771Ve7CQ1dxf37f1GxYiU8PBpia2sL5N1LEx//kD17drFnz64c++Li4vLV1sIwiwTAEhRlPYDcjByZxvr11qxYYUOfPjrUZtFXI4QQeWvVqg2nT39HSkpK1puvs7Mzzs4e+Trf2dmZ+/fv59h+//5fQEbV1cxP7OlPrJ6mKErWJ/v8Klu2LA8ePMi27Z/P89va2jFs2AiGDRvBrVs3OHLkEBs3rmPVqmVMnDglxzV//PEHFi2ax5Ahb9GzZ1/Kly8PwNtvD8px7JOcnJxo06YtPXr0plw5h6x5DhlxlnvKmUUjbysG4uxcFhsbG4MlANWqKfTooePKFSsOHpRFgoQQ5m/gwMGkpCQTHLwox7g/QHT09aee7+nZmKSkRE6dyv5s/aFDB2jQoAG2trY4OjoC2T8ZX7r0U673e5omTbyIjDyOTvd3D+vJk5FZ3+v1egIC+rJjxxYAqlevyeDBw2jQoBF372b0cqj/8cns0qWfUKlUDB48LOvNPy4ulmvXrmUrEvfP8zw9G3Pr1g3q1q1Po0aNqFfPA1dXN1atWs7169cK1K6CkB4AAzFEOeB/evfdNHbutGbZMhteeaVg2a0QQhS3OnXqERQ0nQ8/XEB09DX8/btTrVp1EhISiIo6QUTEPlxd3WjcuEm2N9tMrVq1wcOjIXPmzMh6CmDv3nAuX77I6tWrAahd+3lcXFxZu3YVGo2GxMTHrFsXglMBH5kaNGgob701iKlTJ9KjRx+uXfuNXbt2ZO23srLCw6Mh69evwcbGhurVa3Lp0kUuXDjH++9nfPp3csqYYX/s2GFatGhJ/foNSE9P55NPluDn1567d++wadN6tNo0UlJSsq7t5FSGX365wrlzZ3nhhSYMHvwWo0YNZcaMyQwY0I/Y2Hg2blzLvXt3qVOnboFfh/ySHgADKmo54H/y8EinQwcdp05pOHVKegGEEOavUyd/1q//jLp1PdiyZRMTJ45j4cI5xMT8wZgx49my5Qs8PBrmeq6VlRVLlmQUDFqzZiXTpr3PvXt3+fDDT/D19c065oMPFmBjY8u0ae+zYcMaRo0aS5Uq1XK9Zl5q1arNRx+t4OHDh0ybNomDByMYPz4o2zGBge/TsWNnNm3awIQJY/j66y8ZPToQf//uAHh5taBFi1Z8/PGHbN0aRrNmzRkz5j2iok4wceI4Nm5ch69ve4YMeYvffvuFtLSMNV8GDXqTmJjfmTBhDLGx96hXrz6ffLKKhw8fMHbsWBYunEOlSq4sXRqSNb/MGFSKod6tzJwxnpP95/O3Awf2JSLiG65e/R1n57IGucfJk1Z06+bAq6/qCAszTS+AOT1nbEzSTssi7bQs0s7CXy8v0gNgQIZ8FDBTy5Z6mjXTs3+/hitX5OUSQghhGPKOYkCGfBQwk0oFY8dmdBstXSqLBAkhhDAMSQAMyNCPAmZ69VUd9evr2bVLQ3S0LBIkhBCi6CQBMKDMcsD37t016HXVaggMTCM9XSW9AEIIIQxCEgADcnNzB+DuXcMmAABdu+p47jk927db88cf0gsghBCiaCQBMKC/E4A7/3JkwVlZwbhxaeh0KpYtk14AIYQQRSMJgAFlJgB37tw2yvV79tRRvXo6W7ZYc+eO9AIIIYQoPEkADMjBwQFn57JG6QEAsLbO6AVITVWxYoX0AgghhCg8SQAMzN3d3WgJAEDfvloqV05n0yZr4uKkF0AIIUThSAJgYG5u7ty/f5/U1FSjXN/WFsaMSSM5WcXq1dZGuYcQQgjLJwmAgRlzImCmAQO0uLiks26dDf9YzVIIIYTIF0kADMzd/RnAuAmAvT2MHp1GYqKKtWtlLoAQQoiCkwTAwNzcMooB3bljvAQAYPBgLRUqpBMaakOC5a+PIYQQwsAkATCwzB6Ae/eMmwA4OsKoUVri41WsWSO9AEIIIQpGEgADc3PLSACM3QMAMGxYGhUqpLNqlQ3x8Ua/nRBCCAsiCYCB/T0EYJxiQE9ycoLRozN6AVavll4AIYQQ+ScJgIEVx1MATxo6NI1KldIJCbHh/v1iuaUQQggLIAmAgTk4OFC2bLliSwAcHWHs2DQeP+QW9h4AACAASURBVFaxapX0AgghhMgfSQCMwN3dvViGADINHqzF1TWdNWtspDqgEEKIfJEEwAhcXd158OCB0aoB/pO9PQQGppGUpGL5cukFEEII8e8kATACd/finQcAMHBgxhoBGzZYc/eu9AIIIYR4OkkAjCCzFkBxPAqYyc4uoxcgOVnFsmXSCyCEEOLpNKYOIDQ0lBMnTgDw6NEj4uLiiIyMzHbMyJEjefjwIdbW1tja2rJ27Vpu3rzJ5MmTUalUPP/888yaNQu12jzymcxHAYuzBwAy1ghYtsyGTz+1ZuTINKpWVYr1/kIIIUoOk79jDh8+nLCwMMLCwnB3d2fhwoU5jrl16xZbt24lLCyMtWvXArBgwQICAwPZsmULiqJw6NCh4g49T3+vB1B8EwEBbGzg/fdTSUtT8eGHtsV6byGEECWLyROATBERETg7O+Pt7Z1te1xcHI8ePWLkyJH079+fI0eOAHDp0iVatGgBgI+PD1FRUcUec16KsxrgP/Xpo6N+fT3bt2v45RezeXmFEEKYmWIdAvj888/ZuHFjtm3z58/H09OTkJAQgoODc5yj1WoZOnQogwYNIj4+nv79++Pp6YmiKKhUGZPdHB0dSfiXFXHKl3dAo7EyXGP+x8WlTI5tHh61AYiP/yvX/ca2aBF07Qr/+Y8ju3cb5pqmaIcpSDsti7TTskg7DatYE4A+ffrQp0+fHNuvXr2Ks7MzNWrUyLGvUqVKvP7662g0GipWrEj9+vWJjo7ONt6fmJiIs7PzU+/94EFS0RvwDy4uZYiNzZl4aDROAERH38p1v7G9+CK0aGHPnj0a9u5NpHnz9CJdL692Whppp2WRdloWaWfhr5cXs+gjjoqKwsfHJ899gYGBQMYb/W+//UatWrXw8PDg1KlTABw/fhwvL69ii/ff2NvbU6FCBW7fjjHJ/VUqmD49DYC5c21RZC6gEEKIfzCLBCA6Oppq1apl27Z48WIuXLhA27ZtqVGjBn379mXYsGGMHz+eChUqEBQUxLJly+jXrx9arZZXX33VRNHnrnLlqsTE/IFionffli31vPKKjpMnNRw6ZPihDyGEECWbSjHVO1QxM0bX0dO6agYNep1vvtnLL7/coHz5Cga/d35cvqzGz8+B+vXTOXw4icI+JSldb5ZF2mlZpJ2WpdQNAViiypWrABATY5phAAAPj3R699Zx+bIVX3xh8pIPQgghzIgkAEZSuXJVAP788w+TxhEUlIqNjcL8+bYkJ5s0FCGEEGZEEgAjqVLF9D0AANWrKwwfnkZMjJqQECkRLIQQIoMkAEZSpUrGpMaYGNP2AEDGGgEVK6bzySc2slCQEEIIQBIAo/m7B8D0CYCzM0yalEZioorFi6UXQAghhCQARuPu/gwqlYo//zTtEECmgAAtdevq2bzZmsuX5WUXQojSTt4JjMTa2ho3N3eTzwHIpNHA//1fKunpKmbNkuJAQghR2kkCYERVqlTh9u0Y0tOLVorXUNq10+Pnp+PYMQ2HD0txICGEKM0kATCiKlWqodVqiY29Z+pQssyenYparTBrli1aramjEUIIYSqSABjR38WATD8RMFP9+ukMHKjl11+t2LDB2tThCCGEMBFJAIzIXGoB/NOUKWmUK6ewaJGtPBYohBCllCQARmQu1QD/qWJFhSlTUklIUDFnjq2pwxFCCGECkgAYUWYPwB9/mFcCADBokJZGjfTs2GHNqVMyIVAIIUobSQCMKLMaoLnUAniSlRUsWJACwJQptuj1Jg5ICCFEsZIEwIhcXFywtrY2uyGATC1apNOvn5aLF63YuFEmBAohRGkiCYARqdVqnnmmitlNAnzSjBmplCmjsGCBLXFxMiFQCCFKC0kAjKxKlSrcvXuHtLQ0U4eSK1dXhaCgVOLjVcydK+sECCFEaSEJgJFVq1YdRVHMqhbAPw0dqsXDQ8+WLTZERcmEQCGEKA0kATCymjWfBeDGjWgTR5I3jQaWLElBpVKYONGWlBRTRySEEMLYJAEwsho1agJw8+YNk8bxb5o1S2fYMC1Xr1rxyScyFCCEEJZOEgAjKwk9AJmmTk2lcuV0li614Zdf5FdDCCEsmfyVN7IaNTISAHPvAQBwcoJFi1LQalWMH2+HmSxiKIQQwggkATAyFxcXHBwcS0QPAMCrr+rp0kXL999bsWmT1AYQQghLle8EYPPmzTx48MCYsVgklUpFjRo1uXnzBoqimDqcfJk/PxVnZ4U5c2y5c0dqAwghhCXKdwLw0Ucf4e3tzTvvvENERITZPtdujmrWfJbHjxP466+/TB1Kvri5KcycmbFY0MSJdpSQvEUIIUQB5DsBiIqK4sMPP0SlUjFhwgTatGnDzJkzOXPmjDHjswh/PwlQMoYBAAYO1OLtrSMiQsOnn5o6GiGEEIaW7wTAxsaGTp06sWLFCk6cOMH48eOJiYlh6NChtG/fnqVLl3Lr1i1jxlpilaQnATKp1fDJJyk4OSkEBkJMjAwFCCGEJdEU5qRy5crh5+eHTqfj8ePHnD9/ns2bN7Nq1Sp8fX2ZPXs2bm5u+bpWaGgoJ06cAODRo0fExcURGRmZ7ZiRI0fy8OFDrK2tsbW1Ze3atVy6dImRI0dSs2ZNAPr370/nzp0L0xyjy4yxJDwJ8KSqVRXmzk0hMNCewEA7duxIRiV5gBBCWIQCJQDx8fHs37+fr776ijNnzlCmTBk6derE1KlTeeGFF7hw4QITJkxgzJgx7NixI1/XHD58OMOHDwdgxIgRTJw4Mccxt27d4uuvv0b1xLvP5cuXefPNNxk6dGhBmmASJbEHIFP//joiImDvXg0bN1ozZIjW1CEJIYQwgHwnACNHjiQyMhJFUfD29ubjjz/Gz88Pa+u/HxXz9PSka9eufFqIQeOIiAicnZ3x9vbOtj0uLo5Hjx4xcuRIHj16xPDhw/Hz8+PixYtER0dz6NAhatSowdSpU3FycirwfYtD1arVUavVJa4HAEClgjVroEEDhdmzbfH11VGzpswKFEKIkk6l5PPZtJ49e9K9e3f8/f2pUKFCnsddvHiR5ORkmjdvnmPf559/zsaNG7Ntmz9/Pp6envTq1Yvg4GBq1KiRbf/t27fZt28fgwYNIj4+nv79+7N161aOHj1K3bp1adiwIatWreLRo0cEBQXlGZdOp0ejMd1CNzVr1kSn0/HHH+a7KNDTbN4MAweCtzccOQJWsmaQEEKUaPlOAIzp6tWrzJs3jw0bNuTYp9Vq0Wq1ODg4ADBu3DgCAgKoU6cOzs7OWefPmTMnR3LxpNjYBIPH7eJSJt/X7dnTn2+/Pc7Nm3ext7c3eCzG5OJShnv3Ehg61I6vv7Zm6tRUAgMt7zHQgryeJZm007JIOy2Lodvp4lImz335HgKYMmVKnvvUajUODg7UrFmTTp06PbWHIDdRUVH4+PjkuW/z5s2EhoaSmJjIb7/9Rq1atRg2bBgzZszA09OTkydP0qBBgwLds7jVrPks3357nN9/v0WdOnVNHU6BqVQZKwaePWvFokU2tGmjw8tLagULIURJle8E4M6dO5w9e5bU1FSqVq1KpUqVuH//Pr///jtqtRo3Nzfi4uJYsWIFmzdv5tlnn813ENHR0bRu3TrbtsWLF9OxY0fatm3Lt99+S9++fVGr1YwfP54KFSowe/Zs5syZg7W1NZUqVWLOnDn5b7UJZNYCuHHjeolMAAAqVICVK1Po2dOekSPtOXw4kf91wgghhChh8p0AeHt7Ex0dzYoVK7J92v7111959913GTRoEN27d2fUqFEsWbKE5cuX5zuIWbNm5dg2adKkrO+nTZuWY3+DBg3Ytm1bvu9harVq1Qbg2rVrJo6kaFq31vPee2kEB9vy/vt2rF6dIo8GCiFECZTvQkCffvopEydOzNHVXqdOHQIDAwkNDcXJyYkhQ4bw/fffGzzQkq5OnXoA/PrrFRNHUnQTJ6bh5aXnv/+1Zvv2QpWSEEIIYWL5TgASExOxs7PLdZ9GoyEhIWPSQpkyZWSdgFw8+2wtNBoNv/xS8hMAjQZWr06mTBmFyZPtuHZNugCEEKKkyXcC0KJFC4KDg/n999+zbY+JiWHp0qV4eXkBEBkZWaDx/9LCxsaGWrVq8+uvv5SYVQGfpnp1hSVLUkhKUvHWW/YkJZk6IiGEEAWR7wRg+vTppKWl0alTJ3r06MGwYcPo0aMHr776KmlpacycOZPDhw8TEhJSIqrzmUKdOvV49Ciee/fumjoUg+jeXcegQWlcumRFUJCsGiiEECVJvgdwq1Spwt69e9m9ezenT5/mwYMH1KtXj4CAALp27YpGoyE5OZnPPvssqzdAZFenTh0AfvnlCm5u7iaOxjDmzUvlp5+s2L7dGi8vPYMHS6lgIYQoCfKdAEyYMIF+/frRt29f+vbtm+sxmW9wIndPTgT08fE1bTAGYmsL69Yl06GDA9Om2eLpqadJE6kPIIQQ5i7fQwBHjx4lPV3+sBdFZgLwyy+/mDgSw6paVWHVqhS0Whg61J6//pJJgUIIYe7ynQD4+vqyZcsW4uPjjRmPRatd+znUarVFPAr4T35+eiZPTiMmRs3IkXbo9aaOSAghxNPkewggJSWFY8eOceDAASpUqJCj3K9KpeLLL780eICWxN7enho1alpkAgAwblwaZ89asX+/hjlzbJk9O9XUIQkhhMhDvhMAZ2dnunTpYsxYSoW6devxzTd7iYuLo1KlSqYOx6DUali+PJlOnRxYudKGunX19O+vM3VYQgghcpHvBGDBggXGjKPUqFMnIwH49dcrVKrUxtThGFzZsvDZZ8l07OjIxIl21KyZTKtWMh4ghBDmJt9zAAB0Oh179uxhypQpvPXWW9y4cYMvvviCK1css0vbGDIXArKEioB5qVVLYf36ZBQF3nzTjuhomRQohBDmJt8JwIMHD+jbty9Tp07l0qVLREZGkpiYyIEDB+jfvz/nz583ZpwWo25dy1kT4GnatNGzaFEq9++rCQiw59EjU0ckhBDiSflOABYsWMDjx4+JiIhg165dWeVsly5diqenJ8HBwUYL0pI891wdVCoVP/982dShGF1AgJYRI9L49Vcr3n7bHq3UCBJCCLOR7wTgyJEjBAYGUqVKFVRPrP9qY2PD0KFDuXTpklECtDSOjo7Urv0cFy/+ZBFrAvyb2bNT6dBBx5EjGsaPl3LBQghhLvKdAOj1emxtbXPdp9PpSsWbmaE0bNiIR4/iuXXrpqlDMTorKwgNTaZJEz3bt1szb56NqUMSQghBARKAli1bsmLFimyFgFQqFVqtlk2bNtG8eXOjBGiJGjZ8AYCffrpg4kiKh5MTbN6cTK1a6SxdasuaNdamDkkIIUq9fCcAkydP5u7du7z88suMGjUKlUrFJ598QufOnbly5Qrvv/++MeO0KI0aeQJw8WLpmThZqZLC9u1JuLqmM326LXv25PsJVCGEEEaQ7wSgevXqfPnll/Tr14/4+HiqV69OXFwcfn5+7N69m9q1axszTovSqFHp6gHIVKOGwtatyTg6wujRdhw/bmXqkIQQotQq0MewihUrMmHCBGPFUmpUqlSJypWrcO7cjyiKkm1SpaVr1CidjRuT6d/fnkGD7Nm2LZmWLaVQkBBCFLcCJQCPHj3i1KlTJCUl5Trpr3v37gYLzNI1a9ac8PDd3Lp1kxo1apo6nGLl7a1n7dpkhg61Z8AAez7/PIlmzWSlSSGEKE75TgAOHz7M+PHjSUlJyXW/SqWSBKAAvLxaEB6+mzNnTpe6BACgY0c9ISEpvP22Hf36ObBrVxKenpIECCFEccl3ArBkyRIaNmzIjBkzcHd3R60uUBVh8Q9eXhlPTZw5c5pevfqaOBrT6NJFx/LlKYwebUefPg78979JeHhIEiCEEMUh3wnArVu3mD59OnXr1jVmPKWGp2djbGxsOHPme1OHYlK9e+tIS0shMNCe3r3t+eKLZOrXlyRACCGMLd8f42vXrk1MTIwxYylVbG1tadToBS5d+omkpCRTh2NSAwboWLw4hbg4NT162HP+vPQuCSGEseX7L21QUBArV65k//793Llzh4cPH+b4EgXj5dUcnU7H+fM/mjoUkxsyRMvHHyfz4IGKnj0dOH1akgAhhDCmfA8BvPfeeyQmJhIYGJjnMT///LNBgiotvLxaEBKykjNnvqdVq9amDsfkBgzQYW+fwjvv2NG3rwNhYcl4e8sjgkIIYQz5TgCCgoKMEkBoaCgnTpwAMh4zjIuLIzIyMtsxu3btYuvWrej1etq3b8/o0aO5f/8+EydOJCUlBVdXVxYsWIC9vb1RYjQWL68WQMZEQJGhRw8ddnYZTwcMGGDP+vXJvPyyJAFCCGFoT+1nXbNmDbGxsQD06NGDHj168Nprr2V9n/nl6elJeHh4oQIYPnw4YWFhhIWF4e7uzsKFC7Ptv3XrFlu3biUsLIydO3ei1WrRarWsXLkSf39/tmzZgoeHB9u3by/U/U2pSpWqPPNMZc6cOS2LKT2hUycdmzYlo1bD4MH2bNsmZYOFEMLQnpoABAcHc/v27ayf9Xo9L7zwQo6lfx8/fszJkyeLFEhERATOzs54e3tn2x4VFUXDhg0JCgpi4MCBNG3aFGtra3744YesY318fIiKiirS/U3Fy6sFsbH3uHEj2tShmJV27fTs2JGMkxOMHWvPRx/ZyFLCQghhQE/9aJXbp9KifFL9/PPP2bhxY7Zt8+fPx9PTk5CQEIKDg3Oc8+DBA86cOcPWrVtJTU2lf//+7Ny5k8ePH1OmTBkAHB0dSUhIeOq9y5d3QKMxfO15F5cyRTr/1Vc7EB6+m3PnTtGixQsGisrwitrOwvD3h6go6NQJFiyw5f59W5YvB40ROwRM0U5TkHZaFmmnZSmudhZr32qfPn3o06dPju1Xr17F2dmZGjVq5NhXrlw5WrRogZOTE05OTtSuXZsbN27g5OREYmIidnZ2JCYm4uzs/NR7P3hg+EftXFzKEBv79MTj33h5vQRAePheevTob4iwDM4Q7SysSpXgq69U9O9vT0iIFTdu6AgJScbBwfD3MmU7i5O007JIOy2Lodv5tGTCLJ61ioqKwsfHJ9d9TZs25fTp06SmppKUlMS1a9eoXr06TZs25dixYwAcP36cZs2aFWfIBvPss7WpXr0GJ04cQ6+XyW65cXNT2LMnCR8fHfv3a+jWzYE//yw9CygJIYQxmEUCEB0dTbVq1bJtW7x4MRcuXKBu3br06tWL/v3788Ybb/DOO+9Qrlw5Ro0axddff83rr7/Ojz/+yMCBA00UfdGoVCratm1HfPxDzp07a+pwzFaZMrBlSzIDBqRx/rwVr7ziwA8/mMWvrxBClEiFGgIw9PK1s2bNyrFt0qRJWd8PGTKEIUOGZNtfqVIl1q1bZ9A4TMXX14+wsA0cPXqYZs2amzocs2VjAx99lEr9+unMmmVL9+4OBAen0KePztShCSFEifOvCcCiRYuyJttlmj9/Pk5OTlk//9sEPPF0bdr4oFarOXr0MBMmGKfegqVQqWDECC3PP5/O22/bM3q0PT//nMq0aWlYGX6OpxBCWKyn9qE2b94ctVpNYmJi1lfz5s1RqVTZtqnVary8vIorZotTvnwFmjRpyg8/fE9CwiNTh1MitGun55tvknj22XSWL7elXz974uJkXoAQQuTXU3sAwsLCiiuOUq9t23b88MMZIiO/pWPHzqYOp0R4/vl09u9P5N137YmI0NC+vQNr1iTTooWsJiiEEP9GZlGZCT+/DgBEROwzcSQlS7lysGlTMtOmpXL3roru3R0IDbWWokFCCPEvJAEwE15ezXF1dWPfvq/Q6WRSW0Go1TBuXBo7dyZTrpzC9Ol2vPWWHbJApRBC5E0SADNhZWXFa6914a+//uLkych/P0Hk0KaNnsOHk2jZUkd4uDV+fo6cPCkzA4UQIjeSAJiRLl26AxAevtvEkZRc7u4Ku3YlExSUyp07Knr0sGfhQhu0WlNHJoQQ5kUSADPSsuVLVKpUia+/DpeqgEWg0cCECWns2ZNE1aoKwcG2dO3qwPXr8pSAEEJkkgTAjGg0Gjp16kJs7D1On/7O1OGUeC1apHP4cCI9e2r54Qcr/PwcCQ21Jl0eEhBCCEkAzE2XLt0AGQYwFGdnWL06hdDQZOztMyYIdu9uL70BQohSTxIAM9O6tTcVKlRg9+5daGXg2mC6d9dx4kQS/v5avvtOg5+fIyEh0hsghCi9JAEwM9bW1vTq1Ze4uFgOHNhv6nAsiouLwvr1Kaxdm4yDg8KMGXZ07WrPL7/IfwMhROkjf/nM0IABgwDYvHmjiSOxTF276jh+PIkuXbScPq3Bz8+BuXNtSEoydWRCCFF8JAEwQw0aNKRx4yYcOnSA27f/NHU4FsnFRWHduhTCwpJ45hmFpUtt8fCA/fulboAQonSQBMBMDRgwiPT0dLZv32LqUCzaq6/qOX48kbFjU4mJgYAABwYNsuP332WSoBDCskkCYKZ69uyNvb09W7aEkS4z1YzK0RGmT0/j/Hlo1UrHN99Y06aNI4sW2ZCYaOrohBDCOCQBMFPOzmXp2rUHN25Ec/ToIVOHUyp4eMDu3cksW5ZMmTIKS5bY0qqVI9u3a+RpASGExZEEwIy9/fZIAFatWm7iSEoPlQr69dPx3XeJvPdeKg8fqhgzxp6OHR347juZHyCEsBySAJgxT8/GtG7tzbFjR7h06aKpwylVnJxgypQ0oqIyKgmeO2dF164ODB1qx2+/yX8bIUTJJ3/JzNyoUe8CEBKywsSRlE5VqyqsXp3C118n0qyZnq++ssbb24HAQFv++EMmCgohSi5JAMxchw6v8txzz/PFFzu4e/eOqcMptZo3T2fv3iQ2bEjm+efT2bLFhpYtHZkxw5a4OEkEhBAljyQAZk6tVjNixGi0Wi2rV0svgCmpVPDaazqOHk1i6dJk3NwUQkJsaN7ckQULbLh/39QRCiFE/kkCUAL06zeAZ56pzIYNa4iNjTV1OKWelRW8/rqOqKhE5s9Pwd5e4aOPbGna1IkPPrAhNlZ6BIQQ5k8SgBLAzs6OsWPHk5SUxPLlH5s6HPE/trbw1ltazpxJZM6cFMqUUVi+3BYvr4yhgTt3JBEQQpgvSQBKiIEDB1O5chU+/XQtd+/eNXU44gkODjBihJbvv09k4cIUKlT4e2hg8mRbqSoohDBLkgCUELa2tgQGTiQ5OZlly4JNHY7IhZ0dDB2q5dSpRJYsScHNTWH9ehtatHBk5Eg7zp+X/25CCPMhf5FKkAEDAqhevQYbNqwlOvq6qcMRebCxgYAALSdPJrJ8eTJ166aza5c1L7/sSM+e9hw8aCWVBYUQJmfyBCA0NJSAgAACAgLo1q0brVu3znHMrl276NOnDz179mTFioyZ8A8fPuTFF1/MOnfjRstfOtfGxoZp02ah1WqZO3e2iaMR/8baGvr21XHkSBI7diTh66vj2281DBjggI+PA5s3W5OSYuoohRCllckTgOHDhxMWFkZYWBju7u4sXLgw2/5bt26xdetWwsLC2LlzJ1qtFq1Wy+XLl/H39886d/DgwSZqQfHq3r0XzZo1Jzx8N6dOfWfqcEQ+qFTg66tnx45kjhxJpG9fLdevq3nvPTuaNHFkzhwbbt2SeQJCiOJl8gQgU0REBM7Oznh7e2fbHhUVRcOGDQkKCmLgwIE0bdoUa2trLl68yKVLlxg4cCBjx47l3r17Joq8eKlUKv7v/+YDMGvWFFkpsIRp0CCd5ctTOHMmYwliRYFly2xp0cKRQYPsOHJEhgeEEMVDpSiKUlw3+/zzz3N01c+fPx9PT0969epFcHAwNWrUyLZ/1apV7N27l61bt5Kamkr//v3ZuXMnp0+fxsHBgZdeeokvv/ySgwcPsnTp0jzvrdPp0WgsZzGXfv36sWPHDtatW8fQoUNNHY4opJQU2LEDli+H77/P2Pb88zB6NAweDOXKmTY+IYTlKtYEIC9Xr15l3rx5bNiwIce+rVu3cvXqVWbMmAHAqFGjGDVqFLVq1cLe3h4rKyuSk5Pp0qULBw8ezPMesbEJBo/bxaWMUa6bH3/+GcNLL3lhZ2dLVNQPVKhQ0Wj3MmU7i5Op23n2rJr1623Ys0dDaqoKBweFHj20vPGGlmbN0lEZaJTA1O0sLtJOyyLtLPz18mIWQwBRUVH4+Pjkuq9p06acPn2a1NRUkpKSuHbtGtWrV2f69Ons378fgJMnT9KgQYPiDNnkKleuwqRJU7l//75MCLQQTZtmDA+cO5fI9OmpVKyosHmzDZ07O+Lj48Dq1db89ZfMFRBCGIZZJADR0dFUq1Yt27bFixdz4cIF6tatS69evejfvz9vvPEG77zzDuXKlWPChAls3bqVgIAAtm3bxrRp00wUvem8/fZI6tdvwGefbZQJgRakYkWFsWPTOH06ke3bk+jWLWPS4MyZdnh6OjJsmB2HD1uh15s6UiFESWYWQwDFwdKGADKdPn2KLl1eoVat2hw+HIm9vb3B72EO7SwO5tzOv/5SsXOnhs2brblyJWMuS5Uq6fTrp6VPHy21a+f/v7E5t9OQpJ2WRdpZ+OvlxSx6AEThtWjxIsOHj+LatassXDjX1OEII6lYUWHECC3HjiWxb18iAQFpPHyoIjjYllatnOjY0YG1a61lISIhRL5JAmABpkyZSa1atVm9ejmnT58ydTjCiFQqaNYsnSVLUrl48TErVybTrp2Oc+fUTJ2aMUQwYIA9u3ZpSEoydbRCCHMmCYAFcHBw4OOPVwIwduxIkuQvf6ng6Ai9e+vYti2Z8+cTmTs3hUaN0jl4UMPIkfY0aODEmDF2HD1qhU5n6miFEOZGEgAL0bJlK4YPH8X169dYsGCOqcMRxczNTWH4cC0REUl8+20i772XSoUKCtu3W9O3rwONGjkycaItJ05IMiCEyCAJgAXJHAoICVnBkSOHTB2OMJE6w0atUQAAIABJREFUddKZMiWN779P5Msvkxg6NA21GjZtsqFXLwcqV4b337fl22/lSQIhSjNJACyIg4MDISHrsba25t13R5Sa8sgid2o1tGypZ+HCVC5cSOS//01iyJA0VCrYuNGGnj0d8PR0JCjIlshISQaEKG0kAbAwL7zQhGnTZhMbe48xY0bIWgECACsraN1az+LFqcTEwBdfJDFoUBqKAhs22NCjhwMNGzoybpwd33xjRXKyqSMWQhibJAAWaOTI0bRr14EjRw6xevUKU4cjzIxGA97eev7zn4yegZ07M5IBjQa2brVm0CAH6td3YsgQO7Zv1/DggakjFkIYgxQCKgJzLkwRGxuLr28rHj58QHj4fpo29Sr0tcy5nYZU2tuZnp6xHsG+fRr27rXm2rWMzwdWVgovvaSnUycdHTvqqFq1ZPzJKO2vp6WRdhb+enmRHgAL5eLiwsqVa9DpdAwbNoi4uDhThyTMnFoNXl7pzJiRxsmTiURGZqxJ0LhxOidOaJg61Y6mTZ3w83Ng/nwbTp9Wy7wBIUowSQAsWNu2fkyePJ2YmD8YMWIoevlrLQrg+efTGTs2jX37krhw4TGLF6fg66vjt9/UfPyxLf7+jjRo4MioUXbs2iVDBUKUNJIAWLhx4ybw6qudOHHiqNQHEIXm7q4wZIiWHTuSuXLlMRs3JhMQkIatLXzxhTUjR9pTv74T/v72fPKJDZcuqSkdg4tClFwyB6AISsqYVHz8Q155xZfo6Ots2LCZ117rUqDzS0o7i0raWXCKApcuqTl4UMOBAxp++EFNenrGegSVK6fTvr0OPz893t46ypY1yC3zTV5PyyLtLPz18iIJQBGUpF/Iy5cv0blze1QqNV99FUGDBg3zfW5JamdRSDuL7v59OHIkIxk4ckTDgwcZyYBardC0aTpt2+rw9dXTtKkea2ujhJBFXk/LIu0s/PXyIglAEZS0X8jw8N0MGzaIqlWr8c03R3B1dc3XeSWtnYUl7TQsvT7jqYKjRzUcO2bFDz9YoddnJARlyii0aaOjbVs9vr46nn1WQWXghQzl9bQs0s7CXy8vkgAUQUn8hfzoow9ZsGAOXl4t2LXrK+zs7P71nJLYzsKQdhrXo0fw7bcajh614uhRDTdu/D0FqXr1v3sHvL11lCtX9PvJ62lZpJ2Fv15eNAa7y/+3d+dxVdX5H8dfdwFkVUGSFmVRREWQCJfCpanMLXUc0ybNyi1p0lJbFCeXwrTMrMZt3KZMnVwnLVusTBZFHTO0AbcsxFxwxR+LynLP+f1x5MIVMEXkwrmf56P7uJez8f30VXj7/Z5F1ApjxrzCL78cZt261YwZ8wILFizBUNX/9BKiHF5e0KNHET16FAH5HD1qICFBCwRJSWaWL3dm+XIwGFTCwxWioy106FBE+/YWPDzs3Xoh9EcCgIMxGAzMnj2HjIyj/Oc/awkObsbLL4+3d7OEAwoIUAkIKOSZZwopKoKUFCMJCWYSE7Xpgn37TMyf74zJpBIRodChQxHR0RbatrXg5mbv1gtR+8kUwC2ozUNSZ8+epVu3P/H778dYuPBf9O37eIXb1uY6b4bUWXNcugS7d5vYts3Etm1m9u41Ws8fcHJSue8+y9URAgv33WehvJms2lBnVZA69UWmAMRt5+vry/Llq+nVqyujRo3Ex6cBnTo9aO9mCQGAmxt07myhc2cLUEBuLuzapYWBbdtM/Pe/JnbuNPPee1CnjkqbNhYeeMBC+/baFQaurvauQIiaT0YAboEeEum2bYn89a9/wdnZhY0bvyIsrHWZbfRQ542QOmuP//s/2LHDxPbtZpKSTOzfb7Kuc3JSad1a4eGHTYSHX6JtW0u134OgOumhP2+E1Fn541VEAsAt0MsfyM8//4wRI56lQQNfvvzyOwICAm3W66XOPyJ11l7nzxvYudPEzp0mdu0y8b//lUwZGAwqLVootG9vsb78/PTzY0+P/VkeqbPyx6uITAEIevfuy9mzZ4iNfZUnnujLpk3f4evra+9mCXHDfHxUevYsomfPIgByc+HIEU+++SafXbu0kwr37zfxr39p2/v7lw4ERQQFVf19CISo6SQACACGDRvJ6dOn+eCDWQwc+Dj/+c8XeHp62btZQlSKhwd06QIREQUA5OfDvn1Gdu40s2uXdg7B6tVOrF6t3Y6wQQOFNm0sREVp761by3kEQv8kAAir2NhJnD17hpUrP2HQoAF8+ul63N3d7d0sIW6Ziwu0bavQtq0WCBQFDhwwWqcMdu0y8fXXTnz9tba92awSFqYQFWW5Ggws3H23jBIIfZEAIKwMBgOzZn1IXl4uGzb8h2eeGciKFauBiueQhKiNjEYIDVUIDVUYNqwQgBMnDPz4o4ndu038+KN2HkFKionFi7V9/PwUaxiIirIQHq7g4mLHIoS4RRIAhA2TycS8eYu5ciWfb775kuHDn+aLLzbau1lC3HZ3361y991F9OmjnUdw+TLs22fixx+N1mDwxRdOfPGFNm3g7KzdsbB4lCAy0sJdd8kogag97H4VwKJFi0hKSgIgOzubc+fOsX37duv6xMREFl+N4KqqsmfPHjZt2oTZbGbChAkYDAaCg4OZMmUKRqOx3O8BchXAzcrPz2fw4CeIj/+B/v378+GHCzGb9Z0X9dyfpUmdlaOqcOyYNkpQHAjS0kquNgC44w6FyEgL996rcO+9FiIiLFXyXIPrkf7UF4e9DHDkyJE89dRTdOzYsdz1S5YsITs7m3HjxhETE8OQIUNo164dkydPpmPHjnTp0qXCY0sAuHmXLl3iySf7sWPHdvr1G8CcOf/UdQjQe38WkzqrTl5e8SiBiZQUbcrg5Enbf4g0aaKFAS0YWAgNVcq9c2FlSX/qi0NeBvjtt9/i5eVV4S//zMxMNm7cyPr16wFIS0ujbdu2AHTq1Int27dfNwCIm+fm5sbKlWsYNOhx1q9fg6JYmDdvsa5DgBA3w90dHnhAuwthscxMAykpWiD46ScTe/eaWLfOiXXrtKkDJyeVli1LhwKF4GCF6wxgCnFbVOtP8rVr17Js2TKbZdOnTyc8PJyFCxcye/bsCvf96KOPePbZZ3F2dga06YDip9i5u7uTk3P9xFS/vhtms+m621TG9dKVHvj6erJ582Z69OjBZ5+tx2iETz/9FCcnJ3s37bbQe38Wkzpv5/eEsDB4+mnta0WBX36B//5Xe+3erQWEfftMfPyxto2nJ0RFaa/77oPISGjShBsOBdKf+lJddVZrAOjfvz/9+/cvs/zIkSN4eXnh7+9f7n6KohAfH8/YsWOty0rP9+fl5eHldf1r1rOyLlWy1RVzpCGpTz5Zw+DBT7B+/Xp69+7L4sUf46KzU6AdqT+lzurl7Q3dumkvgIIC2L9fGyEoHi2IjzeydWvJ+QSenirh4RbCwhRat9buTRAUpJYJBTWpzttJ6qz88SpSI8Zyk5OT6dSpU4XrDx8+TGBgIHVKTZy1bNmSXbt20a5dOxITE2nfvn11NNVheXh4sHLlWgYP/ivffPMlQ4c+xdKly236RAhxY5ydISJCISJCAbTLELOzITXVxL59Rvbt0y5DTE7WnndQzN1dJSzMQuvWCuHh2qWI3t52KkLUejUiAKSnpxMdHW2zbObMmXTr1o3w8HDS09Np1KiRzfrx48czadIkZs+eTVBQEF27dq3OJjskNzc3VqxYzbPPDuS77zYzaFB/li37Nx4ejjEsJ8Tt5OVV+nwCLRTk5paEgp9/NvHzz0brkxCLubtDaKgr4eFaKGjdWjunQE7VEX+kRl0FcDvJVQCVd22dV65cISZmGF999QUREffy73+vp0GDBnZsYdVw1P7UK73WmZcHaWlaINi3z0RamhP796soSsn0gaur9gCk0FDtqoNWrSy0bKng4WHHht8ivfbntRxuCkDULnXq1GHJkmW8+uoYVq78hN69u7JmzQbuuafRH+8shLgl7u7FtzXWpg98fZ3IyMhl//6SqYPi959+sj3xOTBQCwPFoaBVK4U775SbFzkqCQCiUsxmM7Nnz6FevfrMm/chjz32KGvXbiQ4uJm9myaEw3Fzg6gohagoxbqsoAB++cVIaqqR1FQT+/dr79rdDEv2rV9ftYaC0FAtFDRrpqDTC31EKRIARKUZDAamTInD29uHuLjJ9Or1KMuWraJdOzkhUwh7c3Yued7BE09otzdWVTh50kBamhYGUlONpKWZSEoyc/WGrFf3VWnWTKFVq5JphBYtFHx8HGLG2GFIABC3bPToMfj4+PDyyy/y+OO9mDt3IX36/MXezRJCXMNgKH7mgYVHHy25eVFuLqSlabc2Lg4HBw5o71AyFHDHHVoQ0F4WWrTQRgvc3OxQjLhlEgBElRg4cDB+fncyfPgzjBjxLBkZGYwePcZ6syYhRM3l4QHt2llo164kFBQVwW+/aVMI+/cbOXBACwUJCWYSEkr2NRhUAgNVWrSw0Ly5QsuWWjgIDFQxVf2910QVkqsAboGclVpWWloqgwb15+TJEwwePIR33nmv1tw6WPpTX6TO2yM7Gw4eLAkExZ+zsmzDfp062jRCixYKzZtrowUtWyo0bFi5kw6lPyt/vIrUjp/MotYIDW3FN9/8wMCB/Vm+/CMyMo6yePFH1K8vdysRQg+8vEpfhaBRVTh92nB1pMDIwYNaODh8WLtcsfQ0Qv36KiEhFkJCFEJCtCmEkBCFO+6QqxGqmwQAUeX8/O7k88+/5vnnh7N589c8+uiDfPLJKlq0aGnvpgkhbgODAfz8VPz8LDz0UMmNjCwWSE83WEcLtJepzM2MAOrWVa+GAQvBwSXh4O67JRjcLjIFcAtkSOr6FEVh5sy3mD37Xdzc3Jk3bxE9e/a6DS2sGtKf+iJ11lxXrsCvv2ojBIcOae+HDxv57TcjRUW2v+3d3bVgEB5uonHjfEJCLDRrptC4cdnnIuiBTAEIXTAajUyYMImWLVvx4ovPM2TIIF55ZQKvvDLB5mFOQgjHUqdOySWKpRUUQHq6bTA4dEg7ETElBaDkAWSuripNm5ZMITRtqr0CAxV09pyy20YCgLjtevfuS1BQU559diCzZr3NTz/9yLx5i/Hx8bF304QQNYizM9ZzA3qVGiwsKoLsbE927LhsEw5++cXI//5ne6mB0ajSuLEWDpo00UJBcLD2Wc4zsCUBQFSLVq3C2Lw5nhdeGMEPP3zPQw9Fs3DhR7Rvf7+9myaEqOHMZggJAW/vInr2LFluscCxYwZrGPj1VyNHjmjv339v5vvvbY/j6VkSDIKDFevnoCAFR3ywqQQAUW18fHz497/XMXfuB8yYEUffvj2IjZ3MqFEvyZSAEOKmmUwQGKgSGGiha1eLzbqsLKxh4MiRkmCQlmYkJcV21MBgUGnUSLVOIxSPHAQFac9K0OuPJzkJ8BbUxpNvKuN21LlzZzLPPTeEzMxTPPxwFz74YD4NGzas0u9xs6Q/9UXq1JeqqrOoSBs1uDYYHDli5MyZsr/p69RRCQjQzi0IDFQJCtI+365wICcBCt1r3/4BtmzZxqhRz7Fly3d07tyOd9/9kF69+ti7aUIIHTObIShIJSjIQpcutqMG2dnYhIL0dO3KhN9+0+5tcC0Xl4rDwV131fyRAwkAwm58fX359NP1/Otfi3jzzckMGzaYAQOeZPr0mXh51bV384QQDsbLCyIjFSIjba9OUFU4d85AerqB9HSj9VUcDg4dKj8c+PtrYSAgoCQcBARo9zaoCTdIrQFNEI7MaDQyfHgMnTs/xAsvjGDNmk9JTt7G++/PpXPnP9m7eUIIgcEAvr4qvr6qzR0QQQsH589r4eC337RgcPRoSTg4fLhsODCZVO65Rxs98PdXrr6rBAcr+PpWV1USAEQNERzcjC+//J7Zs2fywQez6N+/DwMGPMkbb0yXywWFEDWWwQANGqg0aKDSpk3ZcHDhgm04yMjQAkJGhoGEhLK/gjdsgAceqJ62SwAQNYaTkxPjx/+d7t17Mm7ci6xZ8ynff7+ZN96YzoABT8qTBYUQtYrBAD4+Kj4+KlFRSpn1eXmQkWG8+jKQlWXg/vur7y5GNfwUBeGIwsMj+OabH3jzzelcuXKF0aNjePzxPhw6dNDeTRNCiCrj7g4tWyp0715ETEwhsbEF3HFH9X1/CQCiRjKbzcTEjCIxcRePPPIoSUnxPPjg/cTGvsKFC+ft3TwhhKj1JACIGq1xY39WrlzL8uWr8fcPYOnSRbRrdy+LFs2nsLDQ3s0TQohaSwKAqPEMBgNdu3YnMXEXb745HVVVef31CXTo0Ia1a1dhsVj++CBCCCFsSAAQtYazszMxMaPYtWsvQ4eO4Pjx33nhhefo1KkdGzasR1HKnmQjhBCifBIARK3j4+PD22+/x86dKTz11DP89tuvPPfcEP70pwdYt261TA0IIcQNkAAgaq1GjRoze/YckpP38Ne/DuLQoYP87W8jaNMmnPnz55Cd/X/2bqIQQtRYEgBErRcYGMQ//rGAnTtTGD58JBcvXmTq1L8TEdGSSZNiOXLkF3s3UQghahy7Pw1w0aJFJCUlAZCdnc25c+fYvn27dX1iYiKLFy8GQFVV9uzZw6ZNm7hy5QoxMTEEBAQA8OSTT9KjR48Kv488DbDyaludWVkX+OSTj1iyZCGnT2cCcP/90Tz11DM89lgfXF1dy92vttVZWVKnvkid+lKdTwO0ewAobeTIkTz11FN07Nix3PVLliwhOzubcePGsXbtWnJychg6dOgNHVsCQOXV1jrz8/P5+utNLF++jKSkeADq1q1H37796Nv3cdq1ux9jqcd11dY6b5bUqS9Sp75UZwCoMVMA3377LV5eXhX+8s/MzGTjxo2MGjUKgNTUVOLj4xk0aBATJ04kNze3OpsragEXFxf+/Od+rF//Obt27eWll17GxcWFjz9eSp8+3YmIaMGkSRP48cf/yhUEQgiHU60jAGvXrmXZsmU2y6ZPn054eDj9+vVj9uzZ+Pv7l7vvjBkzaNasGf369QNg/fr1hISE0KpVKxYsWEB2djbjx4+v8HsXFVkwm8s+lUk4lqKiIhISEli1ahXr168nKysLAD8/P3r06EHPnj3p0qULnp4Vp2YhhNCDGjEFcOTIEd566y0++uijctcrikL37t3ZuHEjderUAbTzBby8vKz7x8XFlQkXpckUQOXptc6CggISEn7g8883sGXLt5w7dw7QHkrUvv0DREd3JDq6E/feG4mzs7OdW1t19Nqf15I69UXqrPzxKlIjngaYnJxMp06dKlx/+PBhAgMDrb/8AYYNG8akSZMIDw9nx44dhIaGVkdThY44OzvTpUs3unTphqIoZGQcYvXq9Xz//bckJSWQlJQAgJubG23atKNt2/ZERt5HRMR98ohiIUStVyMCQHp6OtHR0TbLZs6cSbdu3QgPDyc9PZ1GjRrZrJ86dSpxcXE4OTnRoEED4uLiqrPJQmeMRiNt27YlMLAFEya8zvnz50lO3sb27YkkJ28jIWErCQlbrdv7+wcQGXkf9957H6GhYTRv3hJfX187ViCEEDenRkwBVAeZAqg8qRPOnj1LSsqPpKT8RErKHlJS9ljPHyjm4+ND8+Ytad68BSEhLQgMDCIgIJC7774Hs7lGZG1A+lNvpE59cbgpACFqOl9fXx59tDuPPtod0O5JcfRoOnv3/sTBg/s5cOAABw/uvzpqkGSzr9lsplGjxgQEBBIQEIi/fyB33XUXfn53ceedd9KwoZ/N9JYQQlQHCQBCVILBYCAwMIjAwCCb5Xl5efzyyyEOHTrI0aPp1ldGRjpbt26p8Hje3t7WQODndyc+Pg3w9vbB29sbHx+fq5998PHxwdPTC4PBcLtLFELonAQAIaqQu7s7ERGRREREllmXk5PN0aPpHDt2jMzMk5w6dYpTp06SmXmKzMxTHDuWwf79qX/4PcxmM/Xre1O3bl08PT3x9Cx+L355XX1pX3t5eeHu7ombmyuurm5cvuzLpUsKrq6u1KlTx+ZmSEIIxyEBQIhq4unpRVhYa8LCWle4TW5uDpmZmZw/f56srAtcuHCe8+fPc+FCyav464sXL3L8+O9cuXLlltpVHARcXd1wdXW95r0OTk7OODsXv1xwcXHGycnZ+u7s7IKzs9PVdS44OTldfbfdxsnJjNlsxmx2uvpuwmTSljk5OV39bMJsNmMyFS8zyWiHELeJBAAhahAPD0+aNvWkadPgG96noKCAnJwccnKyycnJITc3h+zsbOvXxcsuX77M5cuXUdVCsrKyuXz50tVl2vulS5fJzs7mzJkzXLqUh8ViuY2V3jiTyTYUlA4OpV8ly0wYjSZcXJxQFG1/o9GI0Wi0ftaChfauLTNgNJasK9nHhMlkrGAfIyaTscyykuMYrzmOFmaK22IwGKyv4q9t38tbhnV/0JbVr+9OdvYVm20NBqPN9tcep3jfsusM1v2vbWvpY5esK9v+4mOXru96L2E/EgCEqOWcnZ3x8fG54XsT3OhZxoWFhVy+fImCgkIKCvIpKCgo9cq/5rPtNvn5+RQWFtjsU1hYSFFRERZL0dV3yzXLLBQVFVFUVHj13WLdVltmsdm/sFD7nJ+fX2aZxWJBUZQaE2LE9d14WDBcZ/uyy+HGjlsSRMo/zvXaU/F6rMe90fa4ubkxf/5c6tXzq57/745yGaClcfm3GL4VJqMBi6L//31Sp744Yp2lf8zZ/MhTVUqtoWSVWvxf2e2u2adku+vsY3Psq9uW7FJmWcmbarNLmW3Rfrkoimq7rc32tse42prymlLB96vkca937HK3uc6fSRUwXNN3FR7rOkf6o/U3s5163apufju0eNOwYUOcnF1uYOsbYzqWUeE6GQEQQuhe6aFmvQ07O2Kg07PqrNNhAsCFPX98dvXN8vX15IKD3JhC6tQPqVNfpE59qeo6r3d/Urn+RwghhHBAEgCEEEIIByQBQAghhHBAEgCEEEIIByQBQAghhHBAEgCEEEIIByQBQAghhHBAEgCEEEIIByQBQAghhHBAEgCEEEIIByQBQAghhHBADvM0QCGEEEKUkBEAIYQQwgFJABBCCCEckAQAIYQQwgFJABBCCCEckAQAIYQQwgFJABBCCCEckNneDahtFEVh6tSpHDp0CGdnZ6ZNm4a/v7+9m1Wl/vznP+Pp6QnAPffcwxNPPMFbb72FyWSiQ4cOjBo1ys4tvDX79u1j1qxZLF++nIyMDCZMmIDBYCA4OJgpU6ZgNBqZO3cu8fHxmM1mJk6cSHh4uL2bfVNK15iWlkZMTAwBAQEAPPnkk/To0aPW11hYWMjEiRM5ceIEBQUFPP/88zRt2lR3/VlenX5+frrrU4vFwuuvv056ejomk4kZM2agqqru+rO8OnNycuzTn6q4KZs3b1bHjx+vqqqqpqSkqDExMXZuUdW6cuWK2qdPH5tlvXv3VjMyMlRFUdThw4erqampdmrdrVu0aJH62GOPqf3791dVVVVHjhyp7ty5U1VVVZ00aZL67bffqqmpqergwYNVRVHUEydOqH/5y1/s2eSbdm2Na9asUZcuXWqzTW2vUVVVdd26deq0adNUVVXVCxcuqJ07d9Zlf5ZXpx779LvvvlMnTJigqqqq7ty5U42JidFlf5ZXp736U6YAbtKePXvo2LEjABEREaSmptq5RVXr4MGDXL58maFDh/L000+ze/duCgoKaNy4MQaDgQ4dOrBjxw57N7PSGjduzJw5c6xfp6Wl0bZtWwA6depEcnIye/bsoUOHDhgMBu666y4sFgsXLlywV5Nv2rU1pqamEh8fz6BBg5g4cSK5ubm1vkaAbt268dJLL1m/NplMuuzP8urUY58+8sgjxMXFAXDy5EkaNGigy/4sr0579acEgJuUm5uLh4eH9WuTyURRUZEdW1S16tSpw7Bhw1i6dClvvPEGsbGxuLq6Wte7u7uTk5Njxxbemq5du2I2l8x8qaqKwWAASmq7to9rW83X1hgeHs5rr73GypUradSoEfPmzav1NYLWZg8PD3Jzc3nxxRcZM2aMLvuzvDr12qdms5nx48cTFxdH165dddmfULZOe/WnBICb5OHhQV5envVrRVFsftjWdoGBgfTu3RuDwUBgYCCenp5cvHjRuj4vLw8vLy87trBqGY0lfwWKa7u2j/Py8qznRNRGXbp0oVWrVtbP+/fv102Np06d4umnn6ZPnz706tVLt/15bZ167tN33nmHzZs3M2nSJPLz863L9dSfYFtnhw4d7NKfEgBuUmRkJImJiQDs3buXZs2a2blFVWvdunW8/fbbAJw+fZrLly/j5ubGsWPHUFWVbdu2ERUVZedWVp2WLVuya9cuABITE4mKiiIyMpJt27ahKAonT55EURS8vb3t3NLKGzZsGD///DMAO3bsIDQ0VBc1njt3jqFDh/Lqq6/y+OOPA/rsz/Lq1GOfbtiwgYULFwLg6uqKwWCgVatWuuvP8uocNWqUXfpTHgZ0k4qvAjh8+DCqqjJ9+nSaNGli72ZVmYKCAmJjYzl58iQGg4FXXnkFo9HI9OnTsVgsdOjQgbFjx9q7mbfk+PHjjBs3jjVr1pCens6kSZMoLCwkKCiIadOmYTKZmDNnDomJiSiKQmxsbK0LPaVrTEtLIy4uDicnJxo0aEBcXBweHh61vsZp06bx9ddfExQUZF3297//nWnTpumqP8urc8yYMbz77ru66tNLly4RGxvLuXPnKCoqYsSIETRp0kR3fz/Lq/POO++0y99RCQBCCCGEA5IpACGEEMIBSQAQQgghHJAEACGEEMIBSQAQQgghHJAEACFElZNzi4Wo+SQACCFu2I4dOxg2bBht2rQhLCyMbt268f7775Obmwtol5FOmzaNLVu22LmlQog/IgFACHFDEhISGDp0KH5+fsycOZNFixYxYMAAVq1axfDhw7FYLJw5c4bly5fr6vbYQuiVfu5hK4Q9dr0/AAADzElEQVS4rZYsWUJ0dDRvvfWWddn9999PUFAQI0eOZNu2bbq6KZYQeicjAEKIG3LhwoVy5/ajo6MZO3YsDRs25OGHHwbgpZdeYvDgwdZtNm3aRK9evQgLC+ORRx5h+fLlNscICQlh1apVPP/887Ru3ZqHHnqIFStW3N6ChHBwpqlTp061dyOEEDXf8ePH2bhxI2lpaRgMBurXr4+7uzsmk4moqCi8vLwIDQ3lq6++Yty4cQwZMgRvb28+++wzXnvtNbp168bo0aOpV68e77//Pi4uLkRGRgIwd+5c9uzZQ3BwMGPHjsXJyYl//OMfNGzYkNDQUDtXLoQ+yRSAEOKGjB07losXL7Jhwwa2bt0KQFBQEF27dmXIkCHUrVuXFi1aAODv70/Tpk1RFIXZs2fTq1cvJk+eDGB9xvn8+fMZOHAgbm5u1mO99957gPbs91OnTvHPf/6TAQMG2KFaIfRPpgCEEDfE2dmZGTNmsHXrVqZMmUKXLl04f/48CxYs4LHHHuP3338vs096ejpnzpzhwQcfpKioyPrq1KkTeXl51iegAfTo0cNm34cffpgTJ06QmZl522sTwhFJABBC3BQ/Pz8GDhzI3LlzSU5OZvr06WRlZTF37twy2168eBGAl19+mdDQUOur+LG2Z8+etW57xx132Oxb/OjT4mMIIaqWTAEIIf7Q3r17+dvf/saCBQto3bq1dbnZbKZfv3788MMP/Prrr2X28/T0BGDy5MmEh4eXWX/PPfdYP2dlZdmsO3/+PECteta7ELWJjAAIIf5QQEAAeXl5fPLJJ2XWWSwWfv/9d4KDgzGZTDbrgoKCqFevHqdPnyYsLMz6unjxIh9++KH1BkIA8fHxNvtu2bKFoKCgMiMDQoiqISMAQog/VK9ePcaOHcuMGTO4ePEiffv2xc/PjzNnzrBq1SpOnz7N3Llzrf/iT05OJiAggObNmzN69GjefvttQLtvwPHjx3nvvfcICAiwGQFISkrizTff5KGHHiI+Pp7vvvuODz74wC71CuEIDKrctFsIcYO2bt3KihUrSEtLIycnh/r16xMdHc2oUaNo1KgRALNmzWLFihU0atSIL774AoB169bx8ccfc/ToUerVq8cjjzzC2LFjqVu3LqDdB2DEiBEcOHCA3bt307hxY1544QW6d+9ut1qF0DsJAEIIuwsJCeG1115j2LBh9m6KEA5DzgEQQgghHJAEACGEEMIByRSAEEII4YBkBEAIIYRwQBIAhBBCCAckAUAIIYRwQBIAhBBCCAckAUAIIYRwQBIAhBBCCAf0//22WvpX1V/aAAAAAElFTkSuQmCC\n", 193 | "text/plain": [ 194 | "
" 195 | ] 196 | }, 197 | "metadata": {}, 198 | "output_type": "display_data" 199 | } 200 | ], 201 | "source": [ 202 | "from matplotlib import pyplot as plt\n", 203 | "plt.style.use(\"seaborn\")\n", 204 | "ax = plt.axes()\n", 205 | "plt.plot(qng_run[0], \"black\", label=\"QNG\")\n", 206 | "plt.plot(vanilla_run[0], \"b\", label=\"Vanilla GD\")\n", 207 | "\n", 208 | "plt.ylabel(\"Energy\", fontsize=16)\n", 209 | "plt.xlabel(\"Step\", fontsize=16)\n", 210 | "ax.axhline(y=-7.767496700950545, label='Groundstate', color='r')\n", 211 | "\n", 212 | "plt.legend(fontsize=16)\n", 213 | "plt.show()" 214 | ] 215 | } 216 | ], 217 | "metadata": { 218 | "colab": { 219 | "name": "lih_example.ipynb", 220 | "provenance": [] 221 | }, 222 | "kernelspec": { 223 | "display_name": "Python 3", 224 | "language": "python", 225 | "name": "python3" 226 | } 227 | }, 228 | "nbformat": 4, 229 | "nbformat_minor": 1 230 | } 231 | -------------------------------------------------------------------------------- /lih/lih_6qubits.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "colab": { 8 | "base_uri": "https://localhost:8080/", 9 | "height": 539 10 | }, 11 | "colab_type": "code", 12 | "id": "NdUE3U3ZxQTp", 13 | "outputId": "1cea783e-8528-4fb4-85fd-13b9241d5175" 14 | }, 15 | "outputs": [ 16 | { 17 | "name": "stdout", 18 | "output_type": "stream", 19 | "text": [ 20 | "Requirement already satisfied: pennylane-qchem in /usr/local/lib/python3.6/dist-packages (0.8.0)\n", 21 | "Requirement already satisfied: openfermionpyscf in /usr/local/lib/python3.6/dist-packages (from pennylane-qchem) (0.4)\n", 22 | "Requirement already satisfied: openfermionpsi4 in /usr/local/lib/python3.6/dist-packages (from pennylane-qchem) (0.4)\n", 23 | "Requirement already satisfied: openfermion in /usr/local/lib/python3.6/dist-packages (from pennylane-qchem) (0.11.0)\n", 24 | "Requirement already satisfied: pennylane in /usr/local/lib/python3.6/dist-packages (from pennylane-qchem) (0.8.1)\n", 25 | "Requirement already satisfied: pyscf in /usr/local/lib/python3.6/dist-packages (from openfermionpyscf->pennylane-qchem) (1.7.1)\n", 26 | "Requirement already satisfied: pytest in /usr/local/lib/python3.6/dist-packages (from openfermionpyscf->pennylane-qchem) (3.6.4)\n", 27 | "Requirement already satisfied: requests~=2.18 in /usr/local/lib/python3.6/dist-packages (from openfermion->pennylane-qchem) (2.21.0)\n", 28 | "Requirement already satisfied: pubchempy in /usr/local/lib/python3.6/dist-packages (from openfermion->pennylane-qchem) (1.0.4)\n", 29 | "Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from openfermion->pennylane-qchem) (1.4.1)\n", 30 | "Requirement already satisfied: networkx in /usr/local/lib/python3.6/dist-packages (from openfermion->pennylane-qchem) (2.4)\n", 31 | "Requirement already satisfied: h5py>=2.8 in /usr/local/lib/python3.6/dist-packages (from openfermion->pennylane-qchem) (2.10.0)\n", 32 | "Requirement already satisfied: numpy>=1.11.0 in /usr/local/lib/python3.6/dist-packages (from openfermion->pennylane-qchem) (1.18.2)\n", 33 | "Requirement already satisfied: semantic-version==2.6 in /usr/local/lib/python3.6/dist-packages (from pennylane->pennylane-qchem) (2.6.0)\n", 34 | "Requirement already satisfied: appdirs in /usr/local/lib/python3.6/dist-packages (from pennylane->pennylane-qchem) (1.4.3)\n", 35 | "Requirement already satisfied: toml in /usr/local/lib/python3.6/dist-packages (from pennylane->pennylane-qchem) (0.10.0)\n", 36 | "Requirement already satisfied: autograd in /usr/local/lib/python3.6/dist-packages (from pennylane->pennylane-qchem) (1.3)\n", 37 | "Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.6/dist-packages (from pytest->openfermionpyscf->pennylane-qchem) (19.3.0)\n", 38 | "Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.6/dist-packages (from pytest->openfermionpyscf->pennylane-qchem) (0.7.1)\n", 39 | "Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.6/dist-packages (from pytest->openfermionpyscf->pennylane-qchem) (1.3.0)\n", 40 | "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from pytest->openfermionpyscf->pennylane-qchem) (1.12.0)\n", 41 | "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from pytest->openfermionpyscf->pennylane-qchem) (46.1.3)\n", 42 | "Requirement already satisfied: py>=1.5.0 in /usr/local/lib/python3.6/dist-packages (from pytest->openfermionpyscf->pennylane-qchem) (1.8.1)\n", 43 | "Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.6/dist-packages (from pytest->openfermionpyscf->pennylane-qchem) (8.2.0)\n", 44 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests~=2.18->openfermion->pennylane-qchem) (2020.4.5.1)\n", 45 | "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests~=2.18->openfermion->pennylane-qchem) (2.8)\n", 46 | "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests~=2.18->openfermion->pennylane-qchem) (1.24.3)\n", 47 | "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests~=2.18->openfermion->pennylane-qchem) (3.0.4)\n", 48 | "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx->openfermion->pennylane-qchem) (4.4.2)\n", 49 | "Requirement already satisfied: future>=0.15.2 in /usr/local/lib/python3.6/dist-packages (from autograd->pennylane->pennylane-qchem) (0.16.0)\n" 50 | ] 51 | } 52 | ], 53 | "source": [ 54 | "!pip install pennylane-qchem" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 0, 60 | "metadata": { 61 | "colab": {}, 62 | "colab_type": "code", 63 | "id": "m2pg3BSdxjR7" 64 | }, 65 | "outputs": [], 66 | "source": [ 67 | "import numpy as np\n", 68 | "import pennylane as qml\n", 69 | "from pennylane import expval, var, device" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 21, 75 | "metadata": { 76 | "colab": { 77 | "base_uri": "https://localhost:8080/", 78 | "height": 1000 79 | }, 80 | "colab_type": "code", 81 | "id": "7wk5CgToxlwP", 82 | "outputId": "ae37f135-7b6a-4a82-f8cc-36bb318052a3" 83 | }, 84 | "outputs": [ 85 | { 86 | "name": "stdout", 87 | "output_type": "stream", 88 | "text": [ 89 | "(-7.189117345981003) [I0]\n", 90 | "+ (0.02498336736064769) [Z0]\n", 91 | "+ (0.0048735920105351035) [Y0 Z1 Y2]\n", 92 | "+ (0.0048735920105351035) [X0 Z1 X2]\n", 93 | "+ (0.024983367360647678) [Z1]\n", 94 | "+ (0.0048735920105351035) [Y1 Z2 Y3]\n", 95 | "+ (0.0048735920105351035) [X1 Z2 X3]\n", 96 | "+ (-0.13300290682418384) [Z2]\n", 97 | "+ (-0.1330029068241838) [Z3]\n", 98 | "+ (-0.1445363855022916) [Z4]\n", 99 | "+ (-0.1445363855022916) [Z5]\n", 100 | "+ (0.13106579035624258) [Z0 Z1]\n", 101 | "+ (0.009702948635503639) [Y0 Y2]\n", 102 | "+ (0.009702948635503639) [X0 X2]\n", 103 | "+ (0.009702948635503639) [Z0 Y1 Z2 Y3]\n", 104 | "+ (0.009702948635503639) [Z0 X1 Z2 X3]\n", 105 | "+ (0.002366478148280204) [Y0 X1 X2 Y3]\n", 106 | "+ (-0.002366478148280204) [Y0 Y1 X2 X3]\n", 107 | "+ (-0.002366478148280204) [X0 X1 Y2 Y3]\n", 108 | "+ (0.002366478148280204) [X0 Y1 Y2 X3]\n", 109 | "+ (0.006795526682425653) [Y0 X1 X4 Y5]\n", 110 | "+ (-0.006795526682425653) [Y0 Y1 X4 X5]\n", 111 | "+ (-0.006795526682425653) [X0 X1 Y4 Y5]\n", 112 | "+ (0.006795526682425653) [X0 Y1 Y4 X5]\n", 113 | "+ (0.05929524181655196) [Z0 Z2]\n", 114 | "+ (0.06166171996483217) [Z0 Z3]\n", 115 | "+ (0.00034735301058658473) [Y0 Z1 Y2 Z3]\n", 116 | "+ (0.00034735301058658473) [X0 Z1 X2 Z3]\n", 117 | "+ (0.004889538713704247) [Y0 Z1 Z2 X3 X4 Y5]\n", 118 | "+ (-0.004889538713704247) [Y0 Z1 Z2 Y3 X4 X5]\n", 119 | "+ (-0.004889538713704247) [X0 Z1 Z2 X3 Y4 Y5]\n", 120 | "+ (0.004889538713704247) [X0 Z1 Z2 Y3 Y4 X5]\n", 121 | "+ (0.06832924266505007) [Z0 Z4]\n", 122 | "+ (0.004685761056460468) [Y0 Z1 Y2 Z4]\n", 123 | "+ (0.004685761056460468) [X0 Z1 X2 Z4]\n", 124 | "+ (0.07512476934747572) [Z0 Z5]\n", 125 | "+ (-0.00020377765724377862) [Y0 Z1 Y2 Z5]\n", 126 | "+ (-0.00020377765724377862) [X0 Z1 X2 Z5]\n", 127 | "+ (0.06166171996483217) [Z1 Z2]\n", 128 | "+ (0.0003473530105865848) [Y1 Y3]\n", 129 | "+ (0.0003473530105865848) [X1 X3]\n", 130 | "+ (-0.004889538713704247) [Y1 X2 X4 Y5]\n", 131 | "+ (-0.004889538713704247) [Y1 Y2 Y4 Y5]\n", 132 | "+ (-0.004889538713704247) [X1 X2 X4 X5]\n", 133 | "+ (-0.004889538713704247) [X1 Y2 Y4 X5]\n", 134 | "+ (0.05929524181655196) [Z1 Z3]\n", 135 | "+ (0.07512476934747572) [Z1 Z4]\n", 136 | "+ (-0.00020377765724377862) [Y1 Z2 Y3 Z4]\n", 137 | "+ (-0.00020377765724377862) [X1 Z2 X3 Z4]\n", 138 | "+ (0.06832924266505007) [Z1 Z5]\n", 139 | "+ (0.004685761056460468) [Y1 Z2 Y3 Z5]\n", 140 | "+ (0.004685761056460468) [X1 Z2 X3 Z5]\n", 141 | "+ (0.08475100244618912) [Z2 Z3]\n", 142 | "+ (0.010590593747757934) [Y2 X3 X4 Y5]\n", 143 | "+ (-0.010590593747757934) [Y2 Y3 X4 X5]\n", 144 | "+ (-0.010590593747757934) [X2 X3 Y4 Y5]\n", 145 | "+ (0.010590593747757934) [X2 Y3 Y4 X5]\n", 146 | "+ (0.0600970297766772) [Z2 Z4]\n", 147 | "+ (0.07068762352443513) [Z2 Z5]\n", 148 | "+ (0.07068762352443513) [Z3 Z4]\n", 149 | "+ (0.0600970297766772) [Z3 Z5]\n", 150 | "+ (0.07823637778985212) [Z4 Z5] \n", 151 | " 6\n" 152 | ] 153 | } 154 | ], 155 | "source": [ 156 | "name ='LiH';charge = 0; multiplicity=1; basis= 'sto-3g'; geometry = 'lih.xyz';\n", 157 | "h, nr_qubits = qml.qchem.generate_hamiltonian(\n", 158 | " name,\n", 159 | " geometry,\n", 160 | " charge,\n", 161 | " multiplicity,\n", 162 | " basis,\n", 163 | " mapping='jordan_wigner',\n", 164 | " n_active_orbitals=3,\n", 165 | " n_active_electrons=2,\n", 166 | ")\n", 167 | "print(h, '\\n', nr_qubits)" 168 | ] 169 | }, 170 | { 171 | "cell_type": "code", 172 | "execution_count": 0, 173 | "metadata": { 174 | "colab": {}, 175 | "colab_type": "code", 176 | "id": "d97VPt5vyJ_T" 177 | }, 178 | "outputs": [], 179 | "source": [ 180 | "dev = qml.device(\"default.qubit\", wires=6)\n", 181 | "\n", 182 | "def circuit(params, wires=[0,1,2,3,4,5]):\n", 183 | " for i in wires:\n", 184 | " qml.RY(params[i], wires=wires[i])\n", 185 | " qml.CNOT(wires=[wires[0], wires[1]])\n", 186 | " qml.CNOT(wires=[wires[2], wires[3]])\n", 187 | " qml.CNOT(wires=[wires[4], wires[5]])\n", 188 | " qml.CNOT(wires=[wires[1], wires[2]])\n", 189 | " qml.CNOT(wires=[wires[3], wires[4]])\n", 190 | " for i in wires:\n", 191 | " qml.RY(params[i+6], wires=wires[i])\n", 192 | " qml.CNOT(wires=[wires[0], wires[1]])\n", 193 | " qml.CNOT(wires=[wires[2], wires[3]])\n", 194 | " qml.CNOT(wires=[wires[4], wires[5]])\n", 195 | " qml.CNOT(wires=[wires[1], wires[2]])\n", 196 | " qml.CNOT(wires=[wires[3], wires[4]])" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 0, 202 | "metadata": { 203 | "colab": {}, 204 | "colab_type": "code", 205 | "id": "2y1q6o-kyaeN" 206 | }, 207 | "outputs": [], 208 | "source": [ 209 | "qnodes = qml.map(circuit, h.ops, dev, measure='expval')\n", 210 | "expval = qml.dot([h.coeffs], qnodes)" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 0, 216 | "metadata": { 217 | "colab": {}, 218 | "colab_type": "code", 219 | "id": "npehlyaPyoWC" 220 | }, 221 | "outputs": [], 222 | "source": [ 223 | "step_size = 0.4\n", 224 | "max_iterations = 400\n", 225 | "conv_tol = 1e-06\n", 226 | "\n", 227 | "print_freq = 20\n", 228 | "\n", 229 | "initial_params = np.random.uniform(low=0, high=2*np.pi, size=12)" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": 15, 235 | "metadata": { 236 | "colab": { 237 | "base_uri": "https://localhost:8080/", 238 | "height": 504 239 | }, 240 | "colab_type": "code", 241 | "id": "nfkgL1Spytjg", 242 | "outputId": "73a51a3a-e0e9-4b2f-d6e0-beaf10ac3bf2" 243 | }, 244 | "outputs": [ 245 | { 246 | "name": "stdout", 247 | "output_type": "stream", 248 | "text": [ 249 | "Iteration = 0 Energy = [-7.2922539] Ha Convergence parameter = [0.18704582] Ha\n", 250 | "Iteration = 20 Energy = [-7.6064532] Ha Convergence parameter = [0.00074791] Ha\n", 251 | "Iteration = 40 Energy = [-7.61148202] Ha Convergence parameter = [6.34958078e-05] Ha\n", 252 | "Iteration = 60 Energy = [-7.61204198] Ha Convergence parameter = [1.51635766e-05] Ha\n", 253 | "Iteration = 80 Energy = [-7.61234379] Ha Convergence parameter = [1.67527172e-05] Ha\n", 254 | "Iteration = 100 Energy = [-7.6127408] Ha Convergence parameter = [2.27127923e-05] Ha\n", 255 | "Iteration = 120 Energy = [-7.61325065] Ha Convergence parameter = [2.77002327e-05] Ha\n", 256 | "Iteration = 140 Energy = [-7.6138386] Ha Convergence parameter = [3.06199046e-05] Ha\n", 257 | "Iteration = 160 Energy = [-7.61446618] Ha Convergence parameter = [3.18280649e-05] Ha\n", 258 | "Iteration = 180 Energy = [-7.61510236] Ha Convergence parameter = [3.15542854e-05] Ha\n", 259 | "Iteration = 200 Energy = [-7.61571735] Ha Convergence parameter = [2.979545e-05] Ha\n", 260 | "Iteration = 220 Energy = [-7.61628358] Ha Convergence parameter = [2.68126152e-05] Ha\n", 261 | "Iteration = 240 Energy = [-7.61678191] Ha Convergence parameter = [2.31385703e-05] Ha\n", 262 | "Iteration = 260 Energy = [-7.61720452] Ha Convergence parameter = [1.93300619e-05] Ha\n", 263 | "Iteration = 280 Energy = [-7.61755329] Ha Convergence parameter = [1.57922795e-05] Ha\n", 264 | "Iteration = 300 Energy = [-7.61783619] Ha Convergence parameter = [1.27410461e-05] Ha\n", 265 | "Iteration = 320 Energy = [-7.61806392] Ha Convergence parameter = [1.02507942e-05] Ha\n", 266 | "Iteration = 340 Energy = [-7.61824783] Ha Convergence parameter = [8.33174187e-06] Ha\n", 267 | "Iteration = 360 Energy = [-7.61839958] Ha Convergence parameter = [7.01760155e-06] Ha\n", 268 | "Iteration = 380 Energy = [-7.61853282] Ha Convergence parameter = [6.49652316e-06] Ha\n", 269 | "\n", 270 | "Final convergence parameter = [7.31885527e-06]\n", 271 | "Final value of the ground-state energy = [-7.6186616]\n", 272 | "\n", 273 | "Final circuit parameters = \n", 274 | " [ 1.11155858 4.68251229 6.28526559 3.1423582 2.3010177 -0.7386906\n", 275 | " 4.25308869 4.65150569 4.78617405 6.28512578 6.92963125 2.20688042]\n", 276 | "Number of iterations = 399\n" 277 | ] 278 | } 279 | ], 280 | "source": [ 281 | "params = initial_params\n", 282 | "prev_energy = expval(params)\n", 283 | "qng_energies_block = []\n", 284 | "\n", 285 | "for n in range(max_iterations):\n", 286 | " \n", 287 | " grad_cost = qml.grad(expval, argnum=[0])\n", 288 | " grad_at_point = [float(i) for i in grad_cost(params)[0]] \n", 289 | " \n", 290 | " params = params - step_size * np.dot(\n", 291 | " np.linalg.pinv(qnodes[0].metric_tensor([params])), \n", 292 | " grad_at_point)\n", 293 | "\n", 294 | " energy = expval(params)\n", 295 | " qng_energies_block.append(energy)\n", 296 | " \n", 297 | " conv = np.abs(energy - prev_energy)\n", 298 | "\n", 299 | " if n % print_freq == 0:\n", 300 | " print('Iteration = {:}'.format(n), 'Energy =', energy, 'Ha', 'Convergence parameter =', conv, 'Ha')\n", 301 | "\n", 302 | " if conv <= conv_tol:\n", 303 | " break\n", 304 | "\n", 305 | " prev_energy = energy\n", 306 | "\n", 307 | "print()\n", 308 | "print('Final convergence parameter =', conv)\n", 309 | "print('Final value of the ground-state energy = ', energy)\n", 310 | "print()\n", 311 | "print('Final circuit parameters = \\n', params)\n", 312 | "print('Number of iterations = ', n)" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 31, 318 | "metadata": { 319 | "colab": { 320 | "base_uri": "https://localhost:8080/", 321 | "height": 261 322 | }, 323 | "colab_type": "code", 324 | "id": "EivtRLTFB8bH", 325 | "outputId": "4fecd68e-ac75-45e9-effc-48f1c19e4454" 326 | }, 327 | "outputs": [ 328 | { 329 | "name": "stdout", 330 | "output_type": "stream", 331 | "text": [ 332 | "Iteration = 0 Energy = [-7.27765365] Ha Convergence parameter = [0.23015041] Ha\n", 333 | "Iteration = 20 Energy = [-7.74570958] Ha Convergence parameter = [0.00302031] Ha\n", 334 | "Iteration = 40 Energy = [-7.76535707] Ha Convergence parameter = [0.00024679] Ha\n", 335 | "Iteration = 60 Energy = [-7.7671507] Ha Convergence parameter = [2.41558792e-05] Ha\n", 336 | "Iteration = 80 Energy = [-7.76733481] Ha Convergence parameter = [2.78237134e-06] Ha\n", 337 | "\n", 338 | "Final convergence parameter = [9.32091385e-07]\n", 339 | "Final value of the ground-state energy = [-7.76735241]\n", 340 | "\n", 341 | "Final circuit parameters = \n", 342 | " [ 3.14164093e+00 2.57859762e+00 4.73071874e+00 1.57083381e+00\n", 343 | " 4.71238905e+00 1.58221914e+00 -1.89855968e-04 6.84629933e+00\n", 344 | " 4.69622231e+00 4.71238951e+00 1.57079630e+00 -1.57078076e+00]\n", 345 | "Number of iterations = 91\n" 346 | ] 347 | } 348 | ], 349 | "source": [ 350 | "params = initial_params\n", 351 | "prev_energy = expval(params)\n", 352 | "qng_energies_diag = []\n", 353 | "\n", 354 | "for n in range(max_iterations):\n", 355 | " \n", 356 | " grad_cost = qml.grad(expval, argnum=[0])\n", 357 | " grad_at_point = [float(i) for i in grad_cost(params)[0]] \n", 358 | " \n", 359 | " params = params - step_size * np.dot(np.linalg.pinv(qnodes[0].metric_tensor([params], diag_approx=True)),\n", 360 | " grad_at_point)\n", 361 | "\n", 362 | " energy = expval(params)\n", 363 | " qng_energies_diag.append(energy)\n", 364 | " \n", 365 | " conv = np.abs(energy - prev_energy)\n", 366 | "\n", 367 | " if n % print_freq == 0:\n", 368 | " print('Iteration = {:}'.format(n), 'Energy =', energy, 'Ha', 'Convergence parameter =', conv, 'Ha')\n", 369 | " \n", 370 | " if conv <= conv_tol:\n", 371 | " qng_diag_steps = n\n", 372 | " break\n", 373 | "\n", 374 | " prev_energy = energy\n", 375 | "\n", 376 | "print()\n", 377 | "print('Final convergence parameter =', conv)\n", 378 | "print('Final value of the ground-state energy = ', energy)\n", 379 | "print()\n", 380 | "print('Final circuit parameters = \\n', params)\n", 381 | "print('Number of iterations = ', n)" 382 | ] 383 | }, 384 | { 385 | "cell_type": "code", 386 | "execution_count": 32, 387 | "metadata": { 388 | "colab": { 389 | "base_uri": "https://localhost:8080/", 390 | "height": 522 391 | }, 392 | "colab_type": "code", 393 | "id": "yqIHkxpPBjZU", 394 | "outputId": "ee796acb-31f7-420c-8fee-0baa380d8126" 395 | }, 396 | "outputs": [ 397 | { 398 | "name": "stdout", 399 | "output_type": "stream", 400 | "text": [ 401 | "Iteration = 0 Energy = [-7.075] Ha Convergence parameter = [0.02749675] Ha\n", 402 | "Iteration = 20 Energy = [-7.39745616] Ha Convergence parameter = [0.00874451] Ha\n", 403 | "Iteration = 40 Energy = [-7.51891014] Ha Convergence parameter = [0.00446219] Ha\n", 404 | "Iteration = 60 Energy = [-7.58679999] Ha Convergence parameter = [0.00263348] Ha\n", 405 | "Iteration = 80 Energy = [-7.62992271] Ha Convergence parameter = [0.00184162] Ha\n", 406 | "Iteration = 100 Energy = [-7.66290429] Ha Convergence parameter = [0.00150765] Ha\n", 407 | "Iteration = 120 Energy = [-7.69023571] Ha Convergence parameter = [0.00123095] Ha\n", 408 | "Iteration = 140 Energy = [-7.71148148] Ha Convergence parameter = [0.00090742] Ha\n", 409 | "Iteration = 160 Energy = [-7.7265063] Ha Convergence parameter = [0.00062306] Ha\n", 410 | "Iteration = 180 Energy = [-7.73678492] Ha Convergence parameter = [0.00042904] Ha\n", 411 | "Iteration = 200 Energy = [-7.74398752] Ha Convergence parameter = [0.00030654] Ha\n", 412 | "Iteration = 220 Energy = [-7.74922667] Ha Convergence parameter = [0.00022665] Ha\n", 413 | "Iteration = 240 Energy = [-7.75315066] Ha Convergence parameter = [0.00017169] Ha\n", 414 | "Iteration = 260 Energy = [-7.75614983] Ha Convergence parameter = [0.00013226] Ha\n", 415 | "Iteration = 280 Energy = [-7.75847471] Ha Convergence parameter = [0.00010308] Ha\n", 416 | "Iteration = 300 Energy = [-7.76029444] Ha Convergence parameter = [8.0978468e-05] Ha\n", 417 | "Iteration = 320 Energy = [-7.76172794] Ha Convergence parameter = [6.39394006e-05] Ha\n", 418 | "Iteration = 340 Energy = [-7.76286178] Ha Convergence parameter = [5.06484777e-05] Ha\n", 419 | "Iteration = 360 Energy = [-7.76376095] Ha Convergence parameter = [4.02033562e-05] Ha\n", 420 | "Iteration = 380 Energy = [-7.76447522] Ha Convergence parameter = [3.19582798e-05] Ha\n", 421 | "\n", 422 | "Final convergence parameter = [2.57250733e-05]\n", 423 | "Final value of the ground-state energy = [-7.76501792]\n", 424 | "\n", 425 | "Final circuit parameters = \n", 426 | " [ 3.13815296e+00 2.61740862e+00 4.88736001e+00 1.56357703e+00\n", 427 | " 4.71597060e+00 1.87388542e+00 -1.55262120e-03 6.81502437e+00\n", 428 | " 4.55556200e+00 4.71050857e+00 1.57082174e+00 -1.54830806e+00]\n", 429 | "Number of iterations = 399\n" 430 | ] 431 | } 432 | ], 433 | "source": [ 434 | "params = initial_params\n", 435 | "prev_energy = expval(params)\n", 436 | "vanilla_energies = []\n", 437 | "\n", 438 | "for n in range(max_iterations):\n", 439 | " \n", 440 | " grad_cost = qml.grad(expval, argnum=[0])\n", 441 | " grad_at_point = [float(i) for i in grad_cost(params)[0]] \n", 442 | " \n", 443 | " params = params - step_size * np.dot(step_size, grad_at_point)\n", 444 | "\n", 445 | " energy = expval(params)\n", 446 | " vanilla_energies.append(energy)\n", 447 | " \n", 448 | " conv = np.abs(energy - prev_energy)\n", 449 | "\n", 450 | " if n % print_freq == 0:\n", 451 | " print('Iteration = {:}'.format(n), 'Energy =', energy, 'Ha', 'Convergence parameter =', conv, 'Ha')\n", 452 | "\n", 453 | " if conv <= conv_tol:\n", 454 | " break\n", 455 | "\n", 456 | " prev_energy = energy\n", 457 | "\n", 458 | "print()\n", 459 | "print('Final convergence parameter =', conv)\n", 460 | "print('Final value of the ground-state energy = ', energy)\n", 461 | "print()\n", 462 | "print('Final circuit parameters = \\n', params)\n", 463 | "print('Number of iterations = ', n)" 464 | ] 465 | }, 466 | { 467 | "cell_type": "code", 468 | "execution_count": 33, 469 | "metadata": { 470 | "colab": { 471 | "base_uri": "https://localhost:8080/", 472 | "height": 361 473 | }, 474 | "colab_type": "code", 475 | "id": "He3KgQRoB2dh", 476 | "outputId": "f6ffbb8f-c57f-4d10-918b-55005842ee65" 477 | }, 478 | "outputs": [ 479 | { 480 | "data": { 481 | "image/png": "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\n", 482 | "text/plain": [ 483 | "
" 484 | ] 485 | }, 486 | "metadata": { 487 | "tags": [] 488 | }, 489 | "output_type": "display_data" 490 | } 491 | ], 492 | "source": [ 493 | "from matplotlib import pyplot as plt\n", 494 | "\n", 495 | "plt.style.use(\"seaborn\")\n", 496 | "plt.plot(qng_energies_block, label=\"QNG Block Diagonal Approximation\")\n", 497 | "plt.plot(qng_energies_diag, label=\"QNG Diagonal Approximation\")\n", 498 | "plt.plot(vanilla_energies, label=\"Vanilla Gradient Descent\")\n", 499 | "\n", 500 | "plt.ylabel(\"Energy\")\n", 501 | "plt.xlabel(\"Optimization steps\")\n", 502 | "plt.legend()\n", 503 | "plt.show()" 504 | ] 505 | } 506 | ], 507 | "metadata": { 508 | "colab": { 509 | "name": "qng_attempt_lih_maggie", 510 | "provenance": [] 511 | }, 512 | "kernelspec": { 513 | "display_name": "Python 3", 514 | "language": "python", 515 | "name": "python3" 516 | }, 517 | "language_info": { 518 | "codemirror_mode": { 519 | "name": "ipython", 520 | "version": 3 521 | }, 522 | "file_extension": ".py", 523 | "mimetype": "text/x-python", 524 | "name": "python", 525 | "nbconvert_exporter": "python", 526 | "pygments_lexer": "ipython3", 527 | "version": "3.7.4" 528 | } 529 | }, 530 | "nbformat": 4, 531 | "nbformat_minor": 1 532 | } 533 | --------------------------------------------------------------------------------