{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [ "remove_cell" ] }, "source": [ "# Deutsch-Jozsa Algorithm\n", "\n", "* Understand the Deutsch-Jozsa problem, and classical and quantum algorithms to solve it. \n", "* Implement the quantum algorithm using Qiskit\n", "* Run it on a simulator and device.\n", "\n", "The Deutsch-Jozsa algorithm, first introduced in Reference [1], was the first example of a quantum algorithm that performs better than the best classical algorithm. It showed that there can be advantages to using a quantum computer for a specific, albeit contrived, problem.\n", "\n", "## Deutsch-Jozsa Problem \n", "\n", "Suppose a genie gives you an unknown Boolean function $f$ as in a function that takes in a set of bits, and returns either $0$ or $1$. In math, we would say\n", "\n", "$$\n", "f(\\{x_0,x_1,x_2,...\\}) \\rightarrow 0 \\textrm{ or } 1 \\textrm{ , where } x_n \\textrm{ is } 0 \\textrm{ or } 1$$\n", "\n", "The property we are interested in about the Boolean function is whether it is \"balanced\" or \"constant\". A constant function returns all $0$'s or all $1$'s for any input, while a balanced function returns $0$'s for exactly half of all inputs and $1$'s for the other half. \n", "\n", "The Deutsch-Jozsa problem is, if the genie give you a black box that performs use a function, how can you determine if it is a balanced or constant function? Further, what is the most efficient algorithm to do so?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Classical Solution\n", "\n", "While in the best case, a classical algorithm can efficiently determine whether a given function is balanced or constant....but as we learned in computational complexity lab, the best cases can be contrived.\n", "\n", "In the worst case, if you ran the optimal classical algorithm and continue to see the same output for each input bit string we try, we must check exactly half of all possible inputs plus one in order to be certain that $f(x)$ is constant. Since the total number of possible inputs is $2^n$ (Each bit in the string can be a 0 or a 1), this implies that we must check $2^{n-1}+1$ inputs to know if $f(x)$ is constant. \n", "\n", "For example, for a $4$-bit string, if we checked $8$ out of the $16$ possible combinations, and for them we find\n", "\n", " $0000\\rightarrow 0$\n", " \n", " $0001\\rightarrow 0$\n", " \n", " $0010\\rightarrow 0$\n", " \n", " $0011\\rightarrow 0$\n", " \n", " $0100\\rightarrow 0$\n", " \n", " $0101\\rightarrow 0$\n", " \n", " $0110\\rightarrow 0$\n", " \n", " $0111\\rightarrow 0$\n", "\n", "\n", " it is still possible that the $9^\\textrm{th}$ and every remaining input would have returned a $1$. In this case $f(x)$ would still be balanced.\n", "\n", "Probabilistically, this is a very unlikely event. In fact, if we get the same result continually in succession, we can express the probability that the function is constant as a function of $k$ inputs as:\n", "\n", "\n", "\n", "$$ P_\\textrm{constant}(k) = 1 - \\frac{1}{2^{k-1}} \\qquad \\textrm{for } 1 < k \\leq 2^{n-1}$$\n", "\n", "\n", "\n", "For a stochastic algorithm, we could opt to truncate our algorithm early if we wanted to accept not being absolutely certain, but x% confident. If we want to be 100% confident and use a deterministic algorithm, we must check $2^{n-1}+1$ inputs." ] }, { "attachments": { "deutsch_steps.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABE0AAAFWCAYAAACctmPeAAABfGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGAqSSwoyGFhYGDIzSspCnJ3UoiIjFJgv8PAzcDDIMRgxSCemFxc4BgQ4MOAE3y7xsAIoi/rgsxK8/x506a1fP4WNq+ZclYlOrj1gQF3SmpxMgMDIweQnZxSnJwLZOcA2TrJBUUlQPYMIFu3vKQAxD4BZIsUAR0IZN8BsdMh7A8gdhKYzcQCVhMS5AxkSwDZAkkQtgaInQ5hW4DYyRmJKUC2B8guiBvAgNPDRcHcwFLXkYC7SQa5OaUwO0ChxZOaFxoMcgcQyzB4MLgwKDCYMxgwWDLoMjiWpFaUgBQ65xdUFmWmZ5QoOAJDNlXBOT+3oLQktUhHwTMvWU9HwcjA0ACkDhRnEKM/B4FNZxQ7jxDLX8jAYKnMwMDcgxBLmsbAsH0PA4PEKYSYyjwGBn5rBoZt5woSixLhDmf8xkKIX5xmbARh8zgxMLDe+///sxoDA/skBoa/E////73o//+/i4H2A+PsQA4AJHdp4IxrEg8AAAGeaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjExMDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MzQyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Crr3+6cAAEAASURBVHgB7N0HnBRF2sfxhyA5qAiCElTAAKIEFcSAiAHMipxiBCOHgVPRM3vqnYI5IyoninoYwPAq5qyoKMkAmAOCqIAkybBv/wt7dnZ3difshO6ZX30+y870dKj69uzQ83TVU1WKvGIUBBBAAAEEEEAAAQQQQAABBBBAAIESAlVLPOMJAggggAACCCCAAAIIIIAAAggggIATIGjCGwEBBBBAAAEEEEAAAQQQQAABBBCIIUDQJAYKixBAAAEEEEAAAQQQQAABBBBAAAGCJrwHEEAAAQQQQAABBBBAAAEEEEAAgRgCBE1ioLAIAQQQQAABBBBAAAEEEEAAAQQQIGjCewABBBBAAAEEEEAAAQQQQAABBBCIIUDQJAYKixBAAAEEEEAAAQQQQAABBBBAAAGCJrwHEEAAAQQQQAABBBBAAAEEEEAAgRgCBE1ioLAIAQQQQAABBBBAAAEEEEAAAQQQIGjCewABBBBAAAEEEEAAAQQQQAABBBCIIUDQJAYKixBAAAEEEEAAAQQQQAABBBBAAAGCJrwHEEAAAQQQQAABBBBAAAEEEEAAgRgCBE1ioLAIAQQQQAABBBBAAAEEEEAAAQQQIGjCewABBBBAAAEEEEAAAQQQQAABBBCIIUDQJAYKixBAAAEEEEAAAQQQQAABBBBAAAGCJrwHEEAAAQQQQAABBBBAAAEEEEAAgRgCBE1ioLAIAQQQQAABBBBAAAEEEEAAAQQQIGjCewABBBBAAAEEEEAAAQQQQAABBBCIIUDQJAYKixBAAAEEEEAAAQQQQAABBBBAAAGCJrwHEEAAAQQQQAABBBBAAAEEEEAAgRgCBE1ioLAIAQQQQAABBBBAAAEEEEAAAQQQIGjCewABBBBAAAEEEEAAAQQQQAABBBCIIUDQJAYKixBAAAEEEEAAAQQQQAABBBBAAAGCJrwHEEAAAQQQQAABBBBAAAEEEEAAgRgCBE1ioLAIAQQQQAABBBBAAAEEEEAAAQQQIGjCewABBBBAIGsCc+fOtTVr1mTteBwIAQQQQCAxgV9//dV++uknKyoqSmwD1kIgJAKLFy+2mTNn2p9//hmSGlPNoAkQNAnaGaE+CCCAQB4KrF+/3q677jpr2bKljR49Og9bSJMQQACB8AmMHz/e+vbt6z6bmzZtaq1atbKGDRtat27d7KyzzrKff/45fI2ixgh4Aq+99podeOCBpvd169atbd9997X69evblltuaUcddZR9+OGHOCGQsABBk4SpWBEBBBBAIFmB1atXmy7Ke/bsaZdddpmtW7fOli5dmuxuWB8BBBBAII0CS5YssZNOOskGDhxoO+ywg40aNcq++OILe/TRR+2EE05wj++55x7bfvvt7frrrzd9llMQCIPAb7/95q45hgwZYscff7xNnz7d5s+fb7/88ovptX79+tnTTz9tu+++u+2///62YMGCMDSLOuZYoIrXBY8+eDk+CRweAQQQyBeB2bNn2/333+8uQr766iubPHmyrVixwmrXrm1//PGHa+bNN99s559/fr40mXYggAACoRJYvny5denSxTbbbDN75plnrFGjRmXqP2XKFDv44INt3rx57rVevXrZK6+8YlWrcr+1DBYLAiOg6w3dpOnevbvddNNN5b5fBw0aZCNHjnT13nXXXe311193vVAC0xAqEjgBPvkCd0qoEAIIIBBeAd2xef75500BkzZt2tgtt9zi7u706NEjvI2i5ggggEAeCVxxxRVWq1YtmzBhQsyAiZrauXNne/PNN61atWqu5fpSecMNN+SRAk3JR4Grr77avv32Wzccp6IeJMOHD7cqVao4go8//tiGDh2ajxy0KY0C9DRJIya7QgABBBCILXDkkUe6O5p6lZ4msY1YigACCGRaYOrUqbbLLru4fA+6Ix+vaHjDY4895larXr266Qtmx44d423G6wjkRKBTp042bdo0d+ytttrKvvnmm0jgr3SFtt56a/vhhx/cYuU5IX9PaSGeRwvQ0yRag8cIIIAAAggggAACCOSpwAsvvGB16tSx5557zvUkidfMc845J7LK2rVr7dlnn4085wECQRLQzHyff/55pEoKiKjXa3ll2223jbw0Z84c10MlsoAHCJQSIGhSCoSnCCCAAAIIIIAAAgjko8Ann3xiy5Yts9tuu82Up+TLL7+ssJk77rhjide1PQWBIApstNFG7j3t16158+a23Xbb+U/L/I5ObqyhOo0bNy6zDgsQ8AUImvgS/EYAAQQQQAABBBBAII8FlO/BL5oLYty4cf7TmL/r1atnTZo0ibxG0CRCwYMACowYMcLlJ1GiV/Wqqihx8ddffx1pgYbyNGjQIPKcBwiUFqheegHPEUAAAQQQQAABBBBAIP8ElM8keghDRXfiY7U++u58rNdZhkAuBZSn5MYbb4xbBeXm0ZAcvyh3DwWBigQImlSkw2sIIIAAAggggAACCOSJgGY0W79+vX3//fd27LHHWt++fSts2eLFi+23336LrFN6uE7kBR4gECKB//3vf5HabrHFFnbxxRdHnvMAgVgCBE1iqbAMAQQQQAABBBBAAIE8E9hkk03soYceSrhV0b1StFGHDh0S3pYVEQiiwMKFC80Pmmj42SOPPGJ169YNYlWpU4AECJoE6GRQFQQQQAABBBBAAAEEgiIwZsyYSFWqVatmZ555ZuQ5DxAIm8CSJUusX79+Nm/ePJf4dcKECW4K7rC1g/pmX4CgSfbNOSICCCCAAAIIIIAAAoEW0Cw7jz32WKSOZ599Nj1NIho8CIPAzJkz7bvvvrOff/7Zpk6dav/3f/9nK1assKuvvtrOPfdc23jjjcPQDOoYAAGCJgE4CVQBAQQQQAABBBBAAIEgCQwfPtyWLl3qqtSyZUv3RTNI9aMuCMQTuOeee2zWrFlutR9++MHmzp3rpiGuXbu2LV++nKBJPEBejwgw5XCEggcIIIAAAggggAACCCDw5Zdf2g033OAgNt98c3vttdesYcOGwCAQKoE777zTXn31VfejKYZ//fVXO+KII+yiiy6yFi1auOFmq1atClWbqGxuBAia5MadoyKAAAIIIIAAAgggEDiBNWvW2CmnnGKaXnjTTTd1Xzjbtm0buHpSIQSSFWjSpIkNGzbM/WgWqfvuu8969OhRYvrhZPfJ+oUhQNCkMM4zrUQAAQQQQAABBBBAIK7AkCFDbOLEiaaZdl566SXymMQVY4WwCQwdOtQ05Ezlo48+siOPPNJNxR22dlDf7AkQNMmeNUdCAAEEEEAAAQQQQCCwAvfee6+NGDHCmjdvbu+++67tuuuuga0rFUMgVQHNBHXGGWdENv/4449N730KAuUJEDQpT4blCCCAAAIIIIAAAggUiMAzzzxjmiGnXbt2rqdJ+/btC6TlNLMQBfbcc88Szb7mmmtKPOcJAtECBE2iNXiMAAIIIIAAAggggECBCbz//vt23HHHWdeuXe29995zSTILjIDm5oGA8vEsXrw4oZZsueWWJdZTktg5c+aUWMYTBHwBgia+BL8RQAABBBBAAAEEECgwgRkzZtihhx5qPXv2dLPkKJdJrKJZRh555JFYL7EMgZwL3HTTTaaZnvRz/PHHu0TGFVWqWbNmZV7+9NNPyyxjAQISIGjC+wABBBBAAAEEEEAAgQIU0J313r17uxlEnn76aatdu3a5Cp999pldccUV5b7OCwjkSmDhwoVuGuE//vjDFNx77LHH3E9F9Vm7dm2Zl7fYYosyy1iAgAQImvA+QAABBBBAAAEEEECgwAQWLVrkAia77767Pfnkk1ajRo0KBaZPn+7ynVS4Ei8ikAOBBQsWWFFRUYkjK5BSUdE20aVu3bq24447Ri/iMQIRAYImEQoeIIAAAggggAACCCCQ/wK6G3/44Ydbx44d3R356tWrx23022+/bTvssEPc9VgBgWwLtG3b1po2bRo5bP369e2www6LPI/1QEHA6KJ8PppVh4JALIH4n5CxtmIZAggggAACSQhE3wFav359EluyKgIIIIBAOgX0GaycD0uWLLGTTjrJFAyJVfS5rSEMy5Yts++//97Gjx9vt99+e6xVWYZAzgWUk+e5555zw3T69+9vbdq0qbBOGo7mFwUN//Of//hP+Y1AGQGCJmVIWIAAAgggkG6B2bNnR3ZJdvoIBQ8QQACBrAuce+65Nm7cOHfcAw44IKnj09MkKS5WzqLAv//9b3v99ddt3rx5pp4nFZUpU6bYo48+Glnl6quvtm7dukWe8wCB0gIETUqL8BwBBBBAoFICutOju5N//vmnKSnbq6++arpA8cuIESNsxYoV1rlzZ6tXr57VqVPHGjdubHvssYe/Cr8RQAABBDIgcMstt9jdd9+d8p4JmqRMx4YZFthmm23s+eefd7NA6ebMzTffHLO3yc8//2ynn366+b1eBwwYYBdffHGGa8fuwy5Qxet6VzJrTthbRP0RQAABBHIqoECIEgrqZ6ONNrKqVatalSpV3I8qpv929LNu3Tpbs2aNy3S/22672SuvvJLTenNwBBBAIN8Ftt12W/v6669TaqamctVdfAoCQRb48ssvTT1HNJxszz33tAMPPNBat27trkV0A+eOO+6wxYsXu2W6ibP//vsHuTnULSACBE0CciKoBgIIIIAAAggggAACCCCAQOUFZsyYYU888YQpiKIfzZbTvn17l/xYCZAPPfTQCqfYrnwN2EM+CRA0yaezSVsQQAABBBBAAAEEEEAAAQQQQCBtAkw5nDZKdoQAAggggAACCCCAAAIIIIAAAvkkQNAkn84mbUEAAQQQQAABBBBAAAEEEEAAgbQJEDRJGyU7QgABBBBAAAEEEEAAAQQQQACBfBIgaJJPZ5O2IIAAAggggAACCCCAAAIIIIBA2gQImqSNkh0hgAACCCCAAAIIIIAAAggggEA+CRA0yaezSVsQQAABBBBAAAEEEEAAAQQQQCBtAgRN0kbJjhBAAAEEEEAAAQQQQAABBBBAIJ8ECJrk09mkLQgggAACCCCAAAIIIIAAAgggkDYBgiZpo2RHCCCAAAIIIIAAAggggAACCCCQTwIETfLpbNIWBBBAAAEEEEAAAQQQQAABBBBImwBBk7RRsiMEEEAAAQQQQAABBBBAAAEEEMgnAYIm+XQ2aQsCCCCAAAIIIIAAAggggAACCKRNgKBJ2ijZEQIIIIAAAggggAACCCCAAAII5JMAQZN8Opu0BQEEEEAAAQQQQAABBBBAAAEE0iZA0CRtlOwIAQQQQAABBBBAAAEEEEAAAQTySaB6PjWGtiCAAAIIBFRg2TKzadOKK9epk1ndusXPeYQAAgggkFuB6dPNli7dUIfNNzdr2za39eHoCKRLYNYss/nzN+xtk03M2rdP157ZT4EIVCnySoG0lWYigAACCORKYMoUsy67FB99qve8Y8fi5zxCAAEEEMitQPfuZh98uKEOp55i9sADua0PR0cgXQL9+pk9NW7D3nofaPbii+naM/spEAGG5xTIiaaZCCCAAAIIIIAAAggggAACCCCQnABBk+S8WBsBBBBAAAEEEEAAAQQQQAABBApEgKBJgZxomokAAggggAACCCCAAAIIIIAAAskJEDRJzou1EUAAAQQQQAABBBBAAAEEEECgQAQImhTIiaaZCCCAAAIIIIAAAggggAACCCCQnABBk+S8WBsBBBBAAAEEEEAAAQQQQAABBApEgKBJgZxomokAAggggAACCCCAAAIIIIAAAskJEDRJzou1EUAAAQQQQAABBBBAAAEEEECgQAQImhTIiaaZCCCAAAIIIIAAAggggAACCCCQnABBk+S8WBsBBBBAAAEEEEAAAQQQQAABBApEgKBJgZxomokAAggggAACCCCAAAIIIIAAAskJVE9uddZGAAEEEEAAgSALdOzY0b788ssgV5G6IYBAggJXXHGFXXrppQmuzWoIIIAAApkQIGiSCVX2iQACCCCAQI4EVq1aZStXrszR0TksAgikU2Dt2rXp3B37QgABBBBIQYDhOSmgsQkCCCCAAAIIIIAAAggggAACCOS/AD1N8v8c00IEEhKYO3euTZ48OaF1WSl/BA488ECrUaNG/jSIlpQQ2G+//ezII48ssYwnCCAQbIHLLrvMFi1aFOxKprF2uvbQNQilcAQaNWpk3bt3L5wG09LQCxA0Cf0ppAEIpEfgvffes2OOOSY9O2MvoRFYsGCBbbrppqGpLxVNTkD5TQYPHpzcRqyNAAI5FbjuuusKKmhy44032uOPP55Tcw6eXYEePXrYW2+9ld2DcjQEKiFA0KQSeGyKAAIIIIAAAggggAACCCCAQCyBadOmmW5QUTIj0L59e2vatGlmdh61V4ImURg8RAABBBBAAAEEEEAAAQQQQCAdAhpuN2HChHTsin3EEBgzZoydcMIJMV5J7yKCJun1ZG8I5I3Ad999Z/Xq1cub9tCQDQL6j3vAgAHZ56hWzWyTjYuPq+cUBBBAAIHgCNSvX/w5XadOTuqlYRtPPvlkTo7NQTMrcNZZZ+Xu3NatW/ze5to2syc6T/dO0CRPTyzNQqCyAptttpnV1wUUJa8EGjRokJv27Lyz2cKFuTk2R0UAAQQQiC/w8svx18nwGkpM3rhx4wwfhd3nQqBWrVq5OOyGY44enbtjc+S8ECBokhenkUYggAACCCCAAAIIIIAAAggEVaB37942YsSIoFYvFPVas2aNbbvttlmvK0GTrJNzwGwLrFu3zqpVMBRg7dq1tn79eqZdzfaJ4XgIIIAAAggggAACCBSIQB1v2NtWW21VIK3NTDNXr16dmR3H2WvVOK/zMgKhFVAg5LzzzrOuXbta27ZtbejQobZq1SrXnhUrVtjNN99snTp1st12281atmxp7dq1s4ceeii07aXiCCCAAAIIIIAAAggggAAC6RUgaJJeT/YWIIHhw4e72nzyySc2cOBAFyRR4GTx4sV28MEHuwDK+++/b1OmTLG5c+e66aqUIHPcuHEBagVVQQABBBBAAAEEEEAAAQQQyJUAQZNcyXPcjAqsXLnSbr/9drv44ovdcVq1auV+jx071nr16mWnnXaaXXrppaZucipVq1a1gw46yD0ma7tj4B8EEEAAAQQQQAABBBBAoOAFCJoU/FsgPwHGjx/vht5svvnmroFffvml+z1//nw77rjj3E/plvtj5DTVLgUBBBBAAAEEEEAAAQQQQAABgia8B/JS4LfffrNBgwZF2vbee++5x7vuuqv94x//iCyPfjBr1iz3VPlNKAgggAACCCCAAAIIIIAAAggwew7vgbwUiA6MKPnrhx9+6Nr597//3Q3FidXoN954wy3ec889Y73MMgQQQAABBBBAAAEEEEAAgQITIGjy1wnXnM9fffWVSwj6559/WrNmzWybbbaxxo0bF9hbIv+a+/HHH5tmy1FRAthYZerUqTZnzhz3kuZQpyCAAAIIIIAAAggggAACCCBQ8EGTadOm2Q033GAvv/yyNWrUyFq0aGF169Z1X6C///57N1XtiSeeaIMHDy63hwJvo2ALvPPOO66C7du3tyZNmsSs7OOPP+6Wd+jQwbbffvuY67AQAQQQQAABBBBAAAEEEECgsARyktNk2LBh9txzz+VUeu3atXbNNdfYMcccY3vssYfNmDHD9TR5/fXXXd0mT55syovx73//2/SlW0M2/GSiuay43IYMGZLLKoTu2G+//barc48ePWLWff369fbYY4+510444YTIOm+++abph4IAAggggAACCCCAAAIIIJA9AX1f90cLZO+osY+Uk6CJenbcf//9sWuUhaUzZ850gZJ169bZp59+ameddZb5s6xEH7569eq2//772xNPPGG33HKL9e3b12699dboVbL+WAGAO+64w956662sHzuMB9Swq/fff99Vfe+9947ZBOUymT17tlWrVs3Uq8gvmpJY+VAoCCCQBoGFC80eeaT4R88pCCCAAALBEXjppeLP6A8+CE69qAkClRVQr3P/GuSvHIaV3SXbZ1Zg+vTpdsopp1iNGjUye6AE956ToMnKlStNP7koS5YsMeWs+OOPP9wsKjVr1kyoGt26dbP+/fvb+eefb6NHj05om0ysdPLJJ7vdjho1KhO7z7t9fvLJJ6YcNSrl9TR57bXX3OsKqiiXjcpHH33ktjvwwAPdc/5BAIFKCvzwg9mJJxX//PRTJXfI5ggggAACaRXwemBHPqe5zkwrLTvLscCddxa/t2+8MceV4fAVCShGcNlll5lmPD3yyCPdTe2K1s/Wa6HLabLQuzv5yy+/2CabbGJNmzZNOs/IeeedZxqCoeDJfvvtZ/rCrH3FK7fffruNHDnSra/eCL169XL5TyraTj1Z1HuhvKIuRxoakkwEbaeddrIuXbrYuHHj7O6777YGDRqUt3uWewL+jDjKU6L3S6zSqlUrt9ifaljDsjTLzr333mtVqlSJtQnL8lyAxNB5foJpHgIIIIAAAgEU4PojgCeFKmVN4L333rPTTjvNpcTYbbfd7IgjjsjaseMdKBRBk59//tlGjBhhDz74oGnIjL7cajiFhk4oJ4mml916663jtdUmTJhgOhnq7lOrVi0799xzEwqcKGBy8803uyExmlFHgZdTTz3VXnnllZjHVCDkggsusHfffdcWL15shx9+uP3nP/8x9WrRuKx77rnH6yH2iPtCPnfuXNt0003tn//8p/m9SGLuNGqhuippSNHYsWPtjDPOiHqlsB/++OOP5gdAfIlff/3VPTzuuOP8RWV+y1PDnZQMWOd11qxZdu2111r37t3LrMuC/BYgMXR+n19ahwACCCCAQBAFuP4I4lmhTtkSmD9/vp1zzjkuJYa+R6tcd911gbp5nZPhOcmcAPUU2Hnnne3RRx+1Bx54wPTFWIEP/dYyJW7t2LGj+bOflLfvoqKiSO8BBUxUlBtECV7V40TDdWKV0gETraOgiXojqLdHrDJ8+HC3WENDBg4c6AIuQ4cOdQEUTXmrYI/ybEyZMsVNcaweEAMGDCh3f6WPoWFCaoOCSJQNAgogyUW9bxSl98v1119vkyZNsssvv9xfVOa3gll6/ygZsP5gdW7Km5q4zMYsyAuBsCaGzgt8GoEAAggggECBCnD9UaAnnmY7gUWLFtm//vUva9y4sesM4AdM9N1cozqCVAIdNHn++efNzynxkpec6qCDDioRcRKmhtdoquBjjz3WHn744XJtlaNCgZOePXuWWEdBkb322itm4CRWwEQbq7eLeic8+eSTJfalJxqHpe0uvvhi95rf80Ff6lVfdTlSgtE6deq416tWrerapSex9udWKvWPhhOpu9KHH35oSmpb6OXrr7+2++67zz7wkpadffbZzl5/hCqaPlpj4hIZZiNXBeAohSUQ5sTQhXWmaC0CCCCAAAL5I8D1R/6cS1qSnIC+u2k2WH1Pvvrqq8tsrNlrg1YCGzRZunSpDRo0yBSBVe8B5aSIVdRLQz1QVNRL4KdykgtqKE2nTp1i7cJuu+02UxLQ6B4n5QVM/B3oy/Wrr77qP438Hj9+vDuOPxuPP02xuh1piEisYSKrV69223/33XeR/cR7oKCNCr1NzAVMoqcGbtiwoW288cbxCHkdAZfbKMyJoTmFCCCAAAIIIBA+gbBPTBE+cWpcnoB66C9YsMD0PXTq1KnuJvTnn3/uUmHofer3/ihv+0SXK2WF0lOoE4G+12vEh/ZfuigNR9euXUsvzvnzwOY00XCKOXPmuKmAjz766Aqh1HukRYsW7uQqx4d6pZQuCqZ07ty59OLIc00lrJlxNMXwUUcd5ZKAKs+FcpjEKgqaaEiPZmZRbwa/aNiOgj1+0VAiFfV2UO6VWEU5NFT8RKSx1im9TG84rT9mzBg35ku9XwqxqAePepn45bDDDiPPi4/B77gCYU8MHbeBrIAAAggggAACgRPg+iNwpyTvK6QcoRMnTnRJVr/99lvTzzfffGPK/6jRGOWVjTbayPUIadOmjbVu3dr9dOjQwTSzbL169crbLLJcHQjUseHtt982v6NA5MUYD+7UTEcBLIH8pq2o0/333++4NE1svICAhl5oeM6N3hRSSuapN4BObHT5/fff7YADDoheVObxLbfcYvvuu6/LfzF58uRyAybaULPWqJeLgiTRSWijAyPKXaIhNCqajUVDcWIVf4YX5VdJtGhfShyrhKUKEh1yyCGJbpo36/nDcvwo5ZZbbukCJuXNkpM3Dc+DhigXkWax0t+ucsroR3l69LeuD259qOrvR8Pd9FhBQuUwii7qGaZIuGaf8vehx/rbUA81be//aCYr/Z21a9cusot8SQwdaRAPEEAAAQQQQKBcgSBce6hyXH+Ue4p4IY0CurGvDgD6bqyfr776KqW9qyeKvlvrJ7oomKJJM5RKQz/qUBDru+52223n1os1QiN6f3qsThBBzSsZyKCJEqxqlhkVJYFNpEQP31Fuk2s013xU0Qw1P/zwQ9SSsg81JEdviJNOOskFOfQG01CPWEVvREXmKpqu+OOPP460o7w3gLpBqUeNioYJJFOUPFZjvv773/8WZNBEPUyih+Wol1F5zsm4sm7mBdq3b29K0qu/o3nz5tno0aNd5Ns/snpRKRDarFkz9zeoabZLF81QpVm01N1PwUkNjfOLgjH9+vVz03PXr1/fNttsM9t22239l11gRoFMHTc6MbTGVyoYU95U5LGG7elukQI6+tzq27dv5Bj+g+jE0MoErrnnFczR367mn9fxlHxYeY7UBVLP9bet6H2s/fn75TcCCCCAAAIIJC6Q62sP1dSfmILrj8TPG2smLqCbhgpO6Lvws88+G/kemvgeEl9TwRT1HtGP8nUq4KEbovoeHf29XHv81782JHvVzLUVDfc58cQTrVq1aolXIptren+8WS+1a9cu8r4YlHtcb3iM+gi5H++LcbnrRb/gJY2NbOMNhYl+yT32vqgUebOrlFnuL/DymhR5J7vI66rkFnlT+hZ580MXeQlF/VVK/Pa6NxV5w3JKLCv9xJtm2NXJ+5Au/VLkuTfVsFvH6+YUWZbMg3322afIi/QVeT1ektks9Ov+73//K/J6+0TOuTcsp+iXX34Jfbty2QBvBqGIp/7+vB48WavO4MGDI8f2Ah5FXvAyqWN7w+8i26vuZ555ZoXbe0mD3d97rJW8wEmRN5SvaOHChSVeLv0ZEf2iF0wp8qY/j17kHnvB3yIvv1GRFxhyz72xnK6eXhCnyAsEFXnBljLbeD3m3Dqx9ldm5RQWeMGlElbeONYU9pLCJpMne32IqhT/TJ2awk7YJBEB72Ilco69mdsS2YR1EEAgQAJez9nI37CXJDF7Ndt99+LP6FNPzdpx9f+df93vDZPP2nGzfe2hhhXy9Yf3hThynr2RBFk7z+5ARx9d/N7u3Turx/YmMom0W99xM1G8m3FF9957b5GXWDVyLP9vqvRv74Z/kb6b6m/NC3AUeZOXFOk61puQpMhLK1H06aefFnmBlyIv8FI0bNiwIl0Xezcii7wREUVe2ooi72Zj3GNo394NwTJN9W4eFnm9UcrdXseOV9TW6DZ5qSribZKW1wPZ00RT9fpFd4gTKdFDMqZPn+669Kurvl+84EK5U/rGunt81113uZlYlONESWRLJxZVDxHts6KiyJuKhhjFKoq0PfbYY+4lReb84veeKD3Tj/969G8lhFXXKyXW0R3vQigMy8m/s6yeFn5R7iGNmUymaIxmdImXByleYmj9LUX3OIn1GRF9PHVJjJX9u6LE0JdccknaEkNH14XHCCCAAAIIIBBfINvXHqoR1x/xzwtrJC6g75LeTU+XWqK8CUU0na++UyoFhX7atm0b9wDKWVJeUQ8TzUqrYe/6UW9v9aCOLurtoh+lj1DP8h133NHN+KpRGOX1NNG1f0XHjd5/Lh7HTrKRi5r8dUx1tY+eASfRoIk/W412oxwI/qw1flMUuNAMNtOmTfMXud8VfRlS4MTrbeKSw/pT2PobP/30065rvf+89G+9ofwPY83ME6vojabhBeqGpO5IflEXp9JvPv+10r/VfV/5VQppFh2G5ZR+F4T7udejw7zIcqQRiQQLIyv/9cAPUOqpP8ay9DrRzxNJDK3PDAVNNaTm5ptvdsHJRBJDRx8nW4mho4/JYwQQQAABBBCoWCAX1x6qEdcfFZ8XXk1cQDcMlYxVM7OWDpjo+7PX69pdu2oYvAIrep5IwCReDXSdrTycV155pdu/rnUfeugh69OnT5k8pN5IEJfr5Pjjj3fr6/uzX6I7N2hZsmkq/P1k63fggib6EIsuGuefSPHzEvjrlt6PTrA3XMYlCvUjXBUFTPz9KHCiaY/05ckPnKh3iAIwGrNVXlFvGeVrUCmvp4nyJqgoqKLcDSqK3Gk7JdRJpMjH69Zon332mSl5bb4XZsvJvzP8zjvvlMjaHa8HVyyB6KCJAp3xPjeUGHqHHXaItavIMiWGVkBSM3lpXGh5ARNtEJ0YOrID74ESQx9++OFukQKhmUoMHX1MHiOAAAIIIIBAxQK5uPZQjbj+qPi88Gp8AU0PrJEGClyo50Z00bXqqFGjXL5Mb7iO+w4aKzlr9DaVfaxrYH0nVoJj5Q/VbLReKo7IbjUZg747P/XUU5FlCrB4qRZcHhR/YXnfl/3Xc/07cEETfyYUHybRZDCl11OPldJFiUIbNWpkd999tyUSMPG39wMn6q6v6Zm8PCQuwY4CMeUV9SJRUSKc6KFD0et7487cU3+qYUXqlJxSb3Ilsky06A9HRQlh87kwLCc/z66Gl/lFf8d77bWX/zSh37oAmTlzZmTdRIIuqSSGjvWZ4h80CImh/brwGwEEEEAAAQQqFsjFtYdqxPVHxeeFVysW0KQDmglSIwy8RB2RlfVdU99vZ82a5QIqpXtxRFbM8APNZKre2ZpYRd+7Y82Aq0lWBngTHnj5XczLoRJJGqtOCkEugQ+aJBodSyRoohPxwAMPuO72N910k+tSVNHd4+gT5wdONCZLgY14Y640s46KukyVVxTs+Nvf/uamgTr11FPdcB9NIazpm5Ip6pqlu+aK2CU6rCeZ/QdlXYblBOVMpLce0b1ElM9EEetkSip3i/ShXnqoXvQxo4OqynC/yy67uCnLywucaHiRouqlcx9F71P1VFH2/iZNmkS/FHms7pMq+nwpnXk8shIPEMixgLLzl1cqeq28bViOQBgEKnpvV/RaGNpWiHXMxbWHnLn+KMR3W+XbrJtz+t6onH26ye6XmjVrmnLk6cayl9jYDVH3X8vl7y222MJGjhxpp512Wplq6Fpay70ErqaOA++++655E3q4x2VWDtCCwAdNSgdDyrMrvV55X270YaWTpOE8Xgbr8nZXZvnPP//shsDoDaueJvGKkt5MmjTJde0vb1290fUlacaMGXbOOee4HCipTpk7cOBA++OPP+yZZ54p73ChXs6wnFCfvnIrr/dsdD6TRHqJlN5Z9IVPIvlMtL2Oo2TOsUp0wMQPqipo6s3KVWKYXvS2mU4M7SeHjj4mjxHIpoDGROuCTD3BFNTT35Dfu1FfGDW2WQnmNNxUP14W/mxWj2MhkBEB3vcZYc35TnN17aGGc/2R89MfugpolINukJfOX6n/c3UNrdx79erVC1y7hg8fbvfff3+kXtG9TpYuXeqG9AwaNMjdLA3D99fAzZ6zfPnyCK4eJDNMJXrD0vuJfk3DbJQ7RIEK9TzxpiN2WYVLB160zY8//ujW0TisO++8082oEb2v8h570xG7L1nlvR693Jv6yfRTmaJEskogq4tY5TjJVFEwSt2uslmUn+aFF14wf+hW/fr1Xc6Ke+65JyvVUHArn3vw+IgK3mW7qPeFn2NIx9bFRLIlOmiSSD4T7T86MbRmvvFLrICJ/5oCJ2effbYLnCgjeHSvEiW2OvbYY/1Vy/yubGLoq666qsw+07VAAd7osafp2m/p/TTzvnT/PWqh/n7ned1Js1V0vvy8VNk6Zq6Oo5xb6SxTpkxxXWn1f4z/uetNjW3qIan3tpLR6a6S/i50N0w9KPX/0B577OGWp7Mu7AuBbAkE5X2v4d7Z6slyujc5QYu/gCd7f/fPesHQbJTPP/88G4eJHCNX1x6qANcfG06Dcl8o2J6tcswXX1j7vw6mXhljsnjsr776KuVmKhfeoYce6nJp+jvRd0yNmFBi11S/J/v7ytRvXTMrmKN8JiotWrRw31PVq8SfOVbL1RtFQ3k022SyPc21fVZLWiYuTnIn3gV6kRe4iLmVl0RGA7QiP94Hacz1Si/0vsxHttH23skqvUrM595JKvKGBBR53eWLvGmRiryIV9EFF1xQ5H0Bcsu97MNF3helIu0/6MX7o3JzX3uZuTNWVS+IVMI5+lzl62Pvy0DBtVnn0gtSZex95O/YS5QasfWClkkf0wuoFXn/YUT24QVA/V3H/e19UBd5vUeKvA90t+5tt91W5H2oF3kR/Qq3Peuss4q84TpF3p0qt96jjz5a5AVeirxZu8rdzvtSGanjL7/8EnM9rwebW8ebPSjyuvefZZF3V7/ICyxFllX2gT7zcvG32tl7TxVZlciPF6rKaj28hGlZPV4ujGMdc+jQoZV6y+h97vW4KvLGHZfYj9c9OOLp9T6JvOYFU9xy/T3r/wsKAmEUyPX73usVHfn7ivV3nallE6M+px/I8me03yZv4oWMv2Vyee2hxhXq9Yd3gzcn72u9t7y+j5Hrjxdz9N5WPbw8Hgm/v72bgkVeD5ISZl6aiCIvj1/C+8jFit4N/CJvgpNIvb08PkUjRoyIVMWbaafIC/xEXpeLd9OzyLuxFVmnogfejewS23ojSCpaPW2vBW54jpLDRBc/QhW9LNbj0lH40vuJtY2WHXnkkW7WGc12oyEufr6Bgw46yO644w5T10z1MAl89Mtri4YO6a69pn2iIBAGgehEbF26dDH1IkqmKGLtfRpGNkmmp0q+JoaOYPAAgTQIXH311W4aQfUaiS7Rve+U58svyuav3ET//ve/Az8+2a8zvxEoLcD7vrRIfj3P5bWHJLn+yK/3UyZao2E36mGybNmyyO41G6N6ngQ5590TTzzheph4NwhdvdVbX71UNQzHL5ppRwlgmzdv7i9yKS3Uvuhri8iLAXkQuOE5pYMd3t3bhKhKB1eSDXKo25B+wlz8qZref//9jDVD49H8WX8ydpC/dqxu3xqas3LlSrdEw6c0+1E2hhJEt61x48aBSawUXa90P9aQNs1Ek62SyzHFfhs1PE9JXvW+1jAfP4eJ/3p5v9Xt0OtxYkoMfcUVV6QtMbQu5F5++WU37EEZ0FNJDF1enctbrs+9RBNul7ePRJY302f5L/Miq2qa9T9q1Ig8z/QDzViQrc+uTLcl3v7nzp3rhs3EWy+R15XUfNiwYWVW9RMp672jqQP9onHXkydP9p/yG4FQCgTpfa+hhaWvjTOFWtO7UWirNlx3K0dCK++aKxtFQwo1tC8bJQjXHmpnoV9/KLfk5ptvno1T7o5RR9e3y1e4x/oe0aqchPyZqJASt65YseHYiexfqRCOOOKISFoCbaPEqRrKko3rtUTqGGsdpVLQkBwNt/GLAibeCA7/aeS3hsZraK9SZvjDl3QdrumKNQtQEEvggibReQIElmjEqXRwJdmgSRBPTrJ18pPoKDKZqaJx6xqHmI1y4YUXujF7/rE09jGb4x/94xbKb0WHM5kPp7Rj6THFL730kiU7rjl6fvpE85lE18NPDK075UoMnWjQJJXE0Mo7pABNecVPDK0LOuVSis61Ut426ViuL78KKGS8aFro44+PHGaCN9uXbbdd5DkP0ieg2dQUdEtHiR57HL0/fzaoTp06lcjvE70OjxEIq0CQ3vfnnXde9q59vGlAvcyS7rQd431pOyZLeR+UE8yfPS7T75kgXHuojYV+/aHpZaN7/GT6vNtFF5m99po7TA9vltIfvJtf2Sqa5MNLP5Hw4ZSzRCMe/OCBrh81g2hQ85eoYTqXCphMnz490s6LPHMFTcorummnnE3qyarrXvU27927d3mr53x54IImSoiqN4Xf5d5P/hlPKnr6Ja2r3gGFVpQEVpHb/v37h77pzJYT+lMYtwHR/1lq1ptk52fXZ0N0z5hkhuZEVy4fE0NHty8wj70v8uYlFqTkh4CfgDnVv7v8UKAVhSaQ9+/70aPz/pQG5dpD0Fx/ZPHtdsMNWTxY5Q6l3s/q0awbIAomqldSkAMmuoGpgIl6jvhFvbEVMImeMcd/Lfq3gofPPvusm0xBbd1pp52iXw7U48AFTerUqePeJP5MHonOduCPnZKuul1tV2B3MNW1SePDFK2v7Ew8uX6Hqi3qguYHzPQHpfGfTbM400auDQrh+P7Fp9qqHhiKoidT1LMq+s5UZb68qaeFl9DVNAuOphRXTxL1XNF4S0X858yZ47oPekmW3d+YZt8qxN5syZwf1s1fAU0VqJlFVPxhofnbWlqGwAYB3vf58U4I0rWHRLn+yI/3VSZaocCDcoHEmt01E8dLZZ/6vq6AiWbP88sAr8eaAiaJDivceeedXU/zILdTbQtc0ESV0phoP2iiLyuJFCVs9Yu6tceLbPnr5stvf+5uJYMNe9Gc3tF3AhQwUdc2Sv4IaAhKdBe+VL54Rb9H1FOlu9fdsrJFiaH1M9ubdlGRc+WGUK4XfaBrumF9NgX9Q72yBmyPQDwB5c1S8nXd+VLi19JFidX1f7eSulEQyBcB3vfhP5NBvfaQLNcf4X9/ZaIFQb7m1JCa66+/3vz0EGp/v379XMBE6RySKUFup9+OQAZNNI5LQ01Uvv/+e7+uFf7WnWG/6IOnkIqS4GrGnJYtW1qvXr1C3fT/eXkO1MvEL4cddpjrZeI/53d+CGjWG8305JdUeolEB01SyWfiHzvW73xIDB2rXSxDIBkB/d+iz2MFEZWU2L8Z4f/ttW3bNmbPRt1hOvnkk5M5FOsiEBgB3veBORVpr0jQrz3UYK4/0n7a2WEGBJS8WT1MHnnkkcjelRT+kksuMV0b5GMJZNBEd6c0s4KG3ChBTCLlzTffdKspq/Bxxx2XyCZ5s86LL77orJQkNchZleOBa1iOhmioC6wKw3LiiYX3df9Ll1qgL2KlpzON17IFCxZ4ueo2JKvTuqkEXeIdg9cRKHQBjTNW92AVZfJX3iFl9R81apRbFutOkpLdadazbCaVdpXhHwTSJMD7Pk2QAdwN1x4BPClUKXQCmtVUPUyih9XvvfferoeJksPna6kaxIbpS9TgwYNd1TQDQHQ3/lj1VXc75fNQOf30092X7Vjr5esy9cpRN2mNIQtz0R9f9H9oDMsJ89msuO7R57lLly6mqQ2TKcp+7yeL1nYETZLRY10EEhPwpw3cd999TRdC+ptTNnx1v911111NuX38ILf2qOkGNeuZ7jz5vVISOxJrIRAcAd73wTkX6a4J1x7pFmV/hSigHia33HJLpOm6jlcP01jDdSMr5cGDQPY0kasuzBTt19joO++802UOLs9bGYY1vlpd2m688cbyVsvL5Zo95Pnnn3dfGrfeeuvQtlHDcqIjlgzLCe2pjFtxJXeODoQGJZ9J3IqzAgIFJnDaaafZ66+/bqtWrXLBkKlTp1rnzp3t1ltvNf0dH3LIIa4brn5rKnolYdf6JO0usDdKnjWX932endC/msO1R36eV1qVXYHhw4e7YTn+UbfffnsXMDnwwAP9RXn7O7BBkxo1ariZMZSrQF2B1X1/4MCBZU6EhuVcffXVbm7nhx9+2P0us1IeLxgzZoytWbPGwpwAlmE5efwGjdE09RIJcj6TGFVmEQIFKaBZHV5++WXXm+Szzz6zYcOGucCIMDRLmxJj/vbbb6Y78wqmaMp7CgJhF+B9H/YzGLv+XHvEdmEpAokKqJOCepko75OKOiuoh8lRRx2V6C5CvV5ggyZS3WabbWzatGl20kknmSL/GoIzZMgQa926tburpeSnt912m7vTpalCFe0qtKKhOZrSqW/fvqFtOsNyQnvqUqp4dPdYZctOtjuf8iXoC5xfGJrjS/AbgcwI1K9fv9zZqZo0aWL6oSCQbwK87/PrjHLtkV/nk9ZkV0CztCpgsmTJEndgBZcVMDnxxBOzW5EcHi2QOU2iPZo3b26vvfaavfTSS+7utE5OmzZt7Nhjj3Uz6zzxxBMuIWQhBkwmTZpkX3zxhbNQt+gwFoblhPGsVa7Ob7/9dmQHujutC9NkCvlMktFiXQQQQAABBBDg2oP3AAKpCei7tgImmqBFpWbNmi5gMmjQoNR2GNKtAt3TxDfVjDD777+/+/GX8dsi0zKHdWiOEvj6Xb91PpktJ//f1RpTrN5jfkkln0n0hc9GG21U7h1w/xj8RgABBBBAAIHCFeDao3DPPS2vnIASvCtg4ifI1t7Uw+SCCy6o3I5DuHXge5qE0DQrVV6xYoWNHTvW2rdvb8r7EsaiMfGnnnqqnXDCCa76zJYTxrOYXJ0ZU5ycF2sjgAACCCCAQOUEuPaonB9bF6aAhrQpYBI9eYMmalHQpBBLKHqaFOKJidfmcePG2eLFi+2KK66It2qgX99rr71MU1VpCsvu3bsHuq5UrvICyj0UXXbffffop3Eff/vtt244nr8i7xlfIgS/1a3zgQeKK+pND+9Ns1L8nEcIIIAAArkV8PIW2M8/b6iDN824N0VWbuuTpqNz7ZEmyDDv5qmnzGbO3NACL82D9e8f5tZkvO4ff/yxC5hMnDgxcqyzzjrLBUyqVy/M8EFhtjpy+sP7QAlgNTQhHxLw1KlTxzTFMCW/BDSrk2a30jCsZcuWmT54lbw5ulx77bXWsWNHq1evnmnKbOU4iS4zvf/gZs2a5WaI+tm7kBs5cmSJmXdefPFFlzBayZAbNGhge++9d9I5UqKPx+MMCihocuVVxQc49FCCJsUaPEIAAQRyL3D//WYffLihHqeeEsqgCdceuX8bBbIGjz9u9tS4DVXr7U2PS9Ck3NM0Y8YMFzB59dVXI+sMGDDABUx0vV2ohaBJCM/8d999Z+oydfjhhzNrQQjPX6FUefLkydanTx/TDDmailSJo7bYYgtThFrTlennkUce8TofPGArV65004pHZ7eX0+DBg+3dd981TUGu7bUfTXFWpUoVW7t2rZvu9JJLLnHbaxpjJY1W7yUKAggggAACCBSeANcehXfOaXH6BH788UcXMHnmmWciO9VoAA3J0TV8IReCJiE7+/piqClWN998c3vyySdDVnuqW0gC3bp1i8zlnmq71VOFggACCCCAAAIIJCLAtUciSqyDQGwBTdbw9ddfuxc1WcN//vMfd1Mz9tqFtZSgScjOt+6kz5492y688EJ3xz5k1ae6CCCAAAIIIIAAAggggAACARPQKIa6devaU14OmKOOOoqASdT5yUnQRPkLdEIoyQvoTayhCWGdZjj5FrMFAggggAACCCCAAAIIIIBApgX2228/l2Nw0003zfShQrX/nARN7r33Xpf0MVRSAamspuXt2rWrbb/99gGpEdVAAAEEEEAAAQQQQAABBBDIBwECJmXPYk6CJuruQ0lNYJdddjH9UBBAAAEEEEAAAQQQQAABBBBAILMCVTO7e/aOAAIIIIAAAggggAACCCCAAAIIhFOAoEk4zxu1RgABBBBAAAEEEEAAAQQQQACBDAsQNMkwMLtHAAEEEEAAAQQQQAABBBBAAIFwChA0Ced5o9YIIIAAAggggAACCCCAAAIIIJBhAYImGQZm9wgggAACCCCAAAIIIIAAAgggEE4BgibhPG/UGgEEEEAAAQQQQAABBBBAAAEEMiyQkymHM9wmdo8AAggggAACCCCAAAIIIIBAYATeeecd69mzZ2DqE8aKrF+/PifVJmiSE3YOigACCCCAAAIIIIAAAgggUCgC8+fPt7feeqtQmptX7SRoklenk8YgkD6Bvn37WrVq1dK3Q/YUCIHffvstEPWgEggggAACCJQWmDp1qvXp06f0Yp7ngcCnn36aB62gCYUqQNCkUM887UYgjsCrr74aZw1eRgABBBBAAAEE0iegO/EvvfRS+nbInhDIscC+++5rjRo1ynEt8vfwW2+9dVYaR9AkK8wcBAEEEEAAAQQQQAABBBBAoJAELrjggkJqbt62laBJ3p5aGoZAcgLNmze3o48+OrmNWDv0AjVq1Ah9G2gAAggggEB4Bbp162br1q0LbwOoedIC7dq1S3obNkAglwIETXKpz7ERCJBA9+7dTT8UBDIisPHGZkceUbzrhg2LH/MIAQQQQCD3Aj16mDVtuqEenTtnrT7/+Mc/TD8UBDIm0LWreZG5Dbvv1Cljh2HH+StA0CR/zy0tQwABBIIjsM02ZuPHB6c+1AQBBBBAoKTA9deXfM4zBPJFYOjQfGkJ7ciRQNUcHZfDIoAAAggggAACCCCAAAIIIIAAAoEWIGgS6NND5RBAAAEEEEAAAQQQQAABBBBAIFcCBE1yJc9xEUAAAQQQQAABBBBAAAEEEEAg0AIETQJ9eqgcAggggAACCCCAAAIIIIAAAgjkSoCgSa7kOS4CCCCAAAIIIIAAAggggAACCARagKBJoE8PlUMAAQQQQAABBBBAAAEEEEAAgVwJEDTJlTzHRQABBBBAAAEEEEAAAQQQQACBQAsQNAn06aFyCCCAAAIIIIAAAggggAACCCCQKwGCJrmS57gIIIAAAggggAACCCCAAAIIIBBoAYImgT49VA4BBBBAAAEEEEAAAQQQQAABBHIlUD1XB+a4CCCAAAIIIIBAPgs8/PDDdtFFF1m1atWsZs2akZ/q1avb+vXrbfXq1bZq1SpbuXKlrVmzxgYMGGDDhg2LSTJw4EB7+eWXI/uoVauWaT/+9vpdpUoVmzx5sm222WYx98FCBBBAAAEEEEhegKBJ8mZsgQACCCCQrMCPP5pdc03xVlddZdayZfFzHiGQhwJ77LGHXX/99bZs2TKbM2eOjRw50hYtWhRpabt27ax///4uyLHxxhub1i+vnHjiibb99tvb1KlTbdy4cbZ27Vq3qgIyffr0sfbt21uHDh0ImJQHyPL4AtddZ/bttxvW22sv86J48bdhDQTCIDBihNknn2yo6Y47mp13XhhqTR0DJEDQJEAng6oggAACeSuwYIHZfx8sbt455xA0KdbgUZ4KtG7d2vTjl88++8wmTJjgnjZo0MAmTpxoDRs29F+u8Pe+++5r+lG54447bMiQIdaqVSt75ZVXbNttt61wW15EICGB5583++DDDat6vZYImiSkxkphEHjjDbOnxm2oae8DCZqE4ZwFrI7kNAnYCaE6CCCAAAIIIJB/AkVFRTZp0qRIw/bff/+EAyaRjf56sNNOO7lHo0aNImBSGofnCCCAAAIIpFmAoEmaQdkdAggggAACCCBQWkC9TObPnx9ZvM8++0QeJ/vg008/tWbNmkV6niS7PesjgAACCCCAQOICBE0St2JNBBBAAAEEEEAgJYE31D08qlQmaPLmm2+6gIkSv1IQQAABBBBAILMCBE0y68veEUAAAQQQQAABe/vttyMKmt1GiVtTKZp155133rHKBF1SOS7bIIAAAgggUKgCBE0K9czTbgQQQAABBBDIioAf6PAP1qNHDzc9sP88md8amrNw4ULr2bNnMpuxLgIIIIAAAgikKEDQJEU4NkMAAQQQQAABBBIRUD4TBTr8oqBJquWtt96y5s2bl5iVJ9V9sR0CCCCAAAIIxBcgaBLfiDUQQAABBBBAAIGUBaKH5mgnlRlao3wmldk+5UawIQIIIIAAAgUqQNCkQE88zUYAAQQQQACB7AgoB4lflM9kxx139J8m9dsf5kPQJCk2VkYAAQQQQKBSAgRNKsXHxggggAACCCCAQPkCRUVFJZLA7r333innM5k2bZotWrSIniblc/NaAUXoAAAq30lEQVQKAggggAACaRcgaJJ2UnaIAAIIIIAAAghsEPjiiy9s/vz5EY7K9BJRPpMWLVqQzySiyQMEEEAAAQQyL0DQJPPGHAEBBBBAAAEEClRAgY7oUpmgifKZVCaJbHQ9eIwAAggggAACiQkQNEnMibUQQAABBBBAAIGkBaKTwDZq1CjlfCbr1q2zd999Ny1Dc5YsWWI33nij7bfffnbQQQfZTTfdZMuWLUu6bWyAAAIIIIBAIQhUL4RG0kYEEEAAAQQQQCDbAunMZzJ16lRbvHix9ezZs1LNWL58uR1yyCE2b948e+GFF+yXX36xgw8+2D755BMbO3ZspfbNxggggAACCOSjAEGTfDyrtAkBBBBAAAEEci4wY8YM+/333yP1qMzQHD+fyTbbbBPZXyoPTj/9dNdjZfTo0da2bVs77LDDXC+Tn376KZXdsQ0CCCCAAAJ5L0DQJO9PMQ1EAAEEEEAAgVwIpDufSWWCLmq/AjiPP/64o9hjjz3c75122snNyHPZZZe55/yDAAIIIIAAAiUFCJqU9OAZAggggAACCCCQFoHofCabbrqpdejQIaX9Kp/Je++9Z7feemtK2/sbvf7666Z9NWjQIDIDj4IoGkZUpUoVfzV+I4AAAggggECUAIlgozB4iAACCCCAAAIIpEtg4sSJkV3tvffeKQcmFHxZunSp9erVK7K/VB589NFHbjP1LokOkkQ/TmW/bIMAAggggEA+CxA0yeezS9sQQAABBBBAICcCCxcutDlz5kSOvcsuu0QeJ/vgzjvvtN69e1urVq2S3bTE+lOmTHHPFTShIIAAAggggEBiAgzPScyJtRBAAAEEEEAAgYQFFixYUGLdHXfcscTzRJ/88MMP9txzz7mZbhLdprz1Pv30U/fSzjvvXN4qLEcAAQQQQACBUgIETUqB8BQBBBBAIAMCTZqYnfeP4h03blz8mEcI5KHAlltuadWqVXM5RNS81q1bp9TKu+++281yc+CBBya9/bRp02zIkCG2Zs0aV49Fixa5fSg3imbPUdluu+3swQcfdI/5p8AFjj3WrFu3DQhduxY4Bs3PKwFvmnVr0WJDk7bfPq+aRmOyI0DQJDvOHAUBBBAobIHmzc1uuaWwDWh9QQnUqVPHBSQ07bDKypUrk27/1KlTbcSIEXbXXXeVyEGS6I4UqLnkkkts/fr19s4779ikSZNcIOeGG25wv7Wf5vrbpCAggXPPxQGB/BQ4+eT8bBetypoAQZOsUXMgBBBAAAEEECgkgc6dO5sfNPniiy8smbwms2fPtkO8u6MnnXSSDRgwICW2+vXru1wo2njy5MluH23atLFDDz00pf2xEQIIIIAAAoUoQCLYQjzrtBkBBBBAAAEEMi5wzDHHRI7xwQcfRB7He7BkyRI76KCDTHlQ7rjjjnirJ/Q6+UwSYmIlBBBAAAEEyggQNClDwgIEEEAAAQQQQKDyAuopctppp7kdjRo1ypRjJF7R9MLd/sor8cQTT1j16unpFPzZZ5+5QzNzTrwzwOsIIIAAAgiUFCBoUtKDZwgggAACCCCAQNoEbrvtNmvXrp2tXbvWjj76aHv//fdj7vvXX391Q3H2228/O/jgg+2jjz6yhg0bxlw32YUrVqywb775xm3GzDnJ6rE+AggggEChC6Tn9kWhK9J+BBBAAAEEEEAghkDdunXtk08+seuvv96UgHWvvfayPn36WMeOHa2xN4uUep98/PHHNmvWLLdMwRLlQklnUT6VdevWuV3S0ySdsuwLAQQQQKAQBAiaFMJZpo0IIIAAAgggkDOB2rVr2zXXXGMnezM4PP744/b555/b//3f/9kff/xhmppYgRRNA9yrV6/IrDbprOz06dPd7jbeeGNr2bJlOnfNvhBAAAEEEMh7AYImeX+KaSACCCCAAAIIBEFAUwBfeumlWa+KHzShl0nW6TkgAggggEAeCJDTJA9OIk1AAAEEEEAAAQTKEyBoUp4MyxFAAAEEEIgvQNAkvhFrIIAAAggggAACoRXwgyYkgQ3tKaTiCCCAAAI5FCBokkN8Do0AAggggAACCGRS4IcffrDFixe7Q+yyyy6ZPBT7RgABBBBAIC8FCJrk5WmlUQgggAACCCCAgNnUqVMdQ4MGDYycJrwjEEAAAQQQSF6AoEnyZmyBAAIIIJCswJQpZlW8/3L8H2+aVQoCCGRe4L777nMHuf32261qVS77Mi8e4iN07178GX3aaSFuCFVHoJRAv37F721vyncKAskK8L9nsmKsjwACCCCAAAIIBFBg5syZdvDBB9vQoUNd7davX2+TJk0y9TI5+uijA1hjqoQAAggggEDwBQiaBP8cUUMEEEAAAQQQQCCuwDXXXGMTJkyw+++/34qKiuydd96xhQsX2t///nerV69e3O1ZAQEEEEAAAQTKChA0KWvCEgQQQAABBBBAIHQCq1evtlq1atmIESNs5cqVdvHFF1vXrl3tqquuCl1bqDACCCCAAAJBESBoEpQzQT0QQAABBBBAAIFKCNx9993Wv39/u+uuu6xDhw7WqVMne+2116x27dqV2CubIoAAAgggUNgC1Qu7+bQeAQQQQAABBBDID4GmTZvaf//7X9cYDc+pUqVKfjSMViCAAAIIIJBDAXqa5BCfQyOAAAIIIIAAApkQIGCSCVX2iQACCCBQiAIETQrxrNNmBBBAAAEEEEAAAQQQQAABBBCIK0DQJC4RKyCAAAIIIIAAAggggAACCCCAQCEKEDQpxLNOmxFAAAEEEEAAAQQQQAABBBBAIK4AQZO4RKyAAAIIIIAAAggggAACCCCAAAKFKEDQpBDPOm1GAAEEEEAAAQQQQAABBBBAAIG4AgRN4hKxAgIIIIAAAggggAACCCCAAAIIFKIAQZNCPOu0GQEEEEAAAQQQQAABBBBAAAEE4goQNIlLxAoIIIAAAggggAACCCCAAAIIIFCIAgRNCvGs02YEEEAAAQQQQAABBBBAAAEEEIgrQNAkLhErIIAAAggggAACCCCAAAIIIIBAIQpUL8RG02YEEMiNwKJFi2zZsmW5OXgIj9qoUSOrXbt2CGtOlRFAAAEEEEAAAQQQyA8Bgib5cR5pBQKhELj88svt7rvvDkVdg1DJ8ePH25FHHhmEqlAHBBBAAAEEEEAAAQQKUoDhOQV52mk0AggggAACCCCAAAIIIIAAAgjEE6CnSTwhXkcAAQQQqLxA8+Zmd9xevJ8ttyx+zCMEEEAAgdwLnHeeWf95G+rRrl3u60MNEEiXwCmnmO2994a9tWqVrr2ynwISIGhSQCebpiIQJIE2bdrYXXfdFaQq5bwuS5cutX79+uW8HhmpQJMmZueck5Fds1MEEEAAgTQI5Ov/P2mgYRchF+jTJ+QNoPq5FiBokuszwPERKFCBBg0a2IEHHligrY/d7IULF8Z+gaUIIIAAAggggAACCCCQEwFymuSEnYMigAACCCCAAAIIIIAAAggggEDQBQiaBP0MUT8EEEAAAQQQQAABBBBAAAEEEMiJAEGTnLBzUAQQQAABBBBAAAEEEEAAAQQQCLoAQZOgnyHqhwACCCCAAAIIIIAAAggggAACOREgaJITdg6KAAIIIIAAAggggAACCCCAAAJBFyBoEvQzRP0QQAABBBBAAAEEEEAAAQQQQCAnAgRNcsLOQRFAAAEEEEAAAQQQQAABBBBAIOgCBE1SPEPDhg2z5557LsWtU99MxxwyZEjqO2BLBBBAAAEEEEAAAQQQQAABBBBISICgSUJMZVe64YYb7P777y/7QoaXvP3223bHHXfYW2+9leEjsXsEEEAAAQQQQAABBBBAAAEECluAoEmK53/lypWmn2yXk08+2R1y1KhR2T40x0MAAQQQQAABBBBAAAEEEECgoAQImuT4dM+dO9fWrFmTcC122mkn69Kli40bN86WLFmS8HasiAACCORU4PPPzbbZpvhnxoycVoeDI4AAAgiUEjj66OLP6IsvLvUiTxEIscDZZxe/twcODHFDqHquBAia5Eh+/fr1dt1111nLli1t9OjRSdXilFNOsRUrVtjYsWOT2o6VEUAAgZwJrF5t9v0PxT96TkEAAQQQCI6AdyMv8jk9f35w6kVNEKiswK+/Fr+3582r7N7YvgAFCJpk+aSv9r4ojB8/3nr27GmXXXaZrVu3zpYuXZpULfr372+1atWyBx98MKntWBkBBBBAAAEEEEAAAQQQQAABBBIXqJ74qqyZisDs2bNdwtgFCxbYV199ZZMnT3a9RGrXrp3K7tw2m2yyiR1xxBGup8nMmTNthx12SHlfbIgAAggggAACCCCAAAIIIIAAArEFCJrEdknbUgVLnn/+eWvUqJG1adPGjj/+eBfwGOiNp3vmmWdSPo6G6Gh4jnqbaCYfCgIIlBR4/fXX7YQTTrAqVapYzZo13Y96aFWvXt2KiopMvb5WrVrlEjrrca9evezRRx8tsZP99tvPPvdycdSoUSOyDz2uWrWqrV271m2vfehHvcbeeOMNa9euXYl98AQBBBBAAAEEEEAAAQTCK0DQJMPnrmPHjjZlypS0H0Vf8JQPZcyYMS43ir4IUhBAoFigffv2dv3119uff/5p87zxq8od9OWXX0ZW0N/Psccea82aNbOGDRu6BMuRF/96cMEFF5h6iy1evNg+/PBDN7TOX0fBmH79+rnt6tevb5tttpltu+22/sv8RgABBBDIssBPP/3kro0yddhM7z9T9Wa/CCCAAAKVE+CbduX8cra17nRr+uFrr73WXnrpJTvkkENyVhcOjEAQBZo2bWoDBgyIVG3hwoV2zz33uOcKeKhXSOvWrSOvx3rQp0+fyGIFT5SPyC9nnHGG3Xvvvf5TfiOAAAII5FDglVdesauuusreeecd22ijjTJSkyuuuML0f4sC8roOoyCAAAIIFIYAn/ghPs/6Qqgvf//9739D3AqqjkB2BN5///3IgTp37hw3YBJZ+a8HEydOLLHoaE3NSEEAAQQQqLTAkiVL7MYbbzQNiTzooIPspptusmXLliW83+eee87OP/98e/rppzMWMFFl7rvvPps0aZLrZaghmRQEEEAAgcIQoKdJiM/zNttsYz169HA5U37//Xdr3LhxiFtD1RHInIB6mXz66aeRA2j2qmTL22+/HdlEdzG7d+8eec4DBBBAAIHUBJYvX+56y2oY5QsvvGC//PKLHXzwwfbJJ5+43G3x9vrEE0/YOeec44IZ6gWSyaL8WM8++6ztsccedtZZZ9HbMJPY7BsBBBAIkABBkwCdjFSqooSwb731lj3yyCN23nnnpbILtkEg7wXUXVvJX/2yzz77+A8T/h0dNNltt92sTp06CW/LiggggECQBNasWeNm9Js7d67L+6TcTroRk4ubL6effrq9++67Lu9U27Zt7bDDDnO9TJQ/JF6ZOnWqHXfccW7oZatWreKtnpbXGzRo4GZFVOBc/xfoOoyCAAIIIJDfAgzPCfn57du3r+k/cM2iQ0EAgdgCCiz6pVq1arbXXnv5TxP6rZ5cmt7bL6kEXfxt+Y0AAgjkSmDatGkuyKDgSLdu3UzJrpWfSTP7bb755ta1a1e76667bP369Vmpoj5bH3/8cXcs9d5Q2WmnnVzekMsuu8w9r+gfDclR4EKBl2wW2WmI9OWXX+6CTtk8NsdCAAEEEMi+AEGT7Jun9Yi6233MMcfYZ599ZpMnT07rvtkZAvkiEN1LRPlMFGhMpqSjp0oyx2NdBBBAIJ0CmiL9mmuuMd1o0cxiL774ov3xxx92ww03WKdOneybb76xH3/80QYPHmxKqKoARvRsY+msS/S+NDW8coPoM9lPzK0ginrAaIhORUX5SxQQv/nmm11+t4rWzcRrw4YNczOrKRcLBQEEEEAgvwUImuTB+fW7hpIQNg9OJk1Iu4C+GETnM0mll0h00IV8Jmk/RewQAQQyKKBecuoZMX36dJcnRD04dt99d6teveQI7RYtWrhZ+ZRUddCgQa5H3q233prBmpl99NFHbv/qXaLE9n6Jfuwvi/69evVqu/DCC22rrbZybYl+LVuPmzRpYr1793ZJa5WHhYIAAgggkL8CBE3y4NzqYmiHHXaw//3vf7Zq1ao8aBFNQCB9AuolEt3VvLJBE/KZpO/csCcEEMisgGalUY8NDV8ZN26cbbLJJgkd8OSTTzbNOKahv6NHj05om1RWmjJlittMQZNkyssvv2zffvutm8Umme3Sve5RRx3lhueMGDEi3btmfwgggAACARIgaBKgk1GZqgwcONB1tX3mmWcqsxu2RSDvBCqbz0Q9VTT8zS+pBF38bfmNQJgFlDyUkj6BbHgqQbyG8J555plJV1xJWcePH2+XXnqpzZ49O+ntE9nA7wW48847J7J6ZB0NL1Lp169fZFkyDzRcqbxS0WultznkkEOsRo0apiAOBQEEEEAgfwUImuTJuT3xxBNdV1uG6OTJCaUZaROIDpp06dLF6tevn9S+NatDZWfeSeqArIxAwASUPLR///5umu3NNtvMDUcor4qaJvbQQw91vRTKW6fQl2fLc8KECfbBBx/Yv/71r5TJ27RpY//85z/t1FNPTXkf0Ruq7T169HDvJSWdXbRokXtZw4A0G41+dBMoXlHQRL1mdt1113irRl7XlMbK2aJE4B06dDAFwP1rJgVKrrzyStt3331t7733dj9PPvlkZNvyHjRs2NDlf9H7XlPbUxBAAAEE8lOg5IDW/GxjQbSqadOm1qdPH3vhhRfcHSGNTc5E+fPPP+3ZZ5/NxK4Du0/NtqJEdZTKC3z11VeV30kSewh7PhMFbFasWJFEi4O76qY//GC9o6rnElHOmBG1JLMPa9WqZStXrszsQQKydw3JSFeZ4Z0jBeXHjBljHTt2NN1ZVy4JDac44IADyhxGPRvee+89a9eunfsyWWaFAl+QLU8Fev/+97+7Ybs1a9aslPo555xjjz32mBveo0SylSlK9nrJJZe4IZMaOjlp0iTT/7FKSKvfKs2bN6/wELNmzbIfvM8TBT4SLRoGNMCb7Ua9Zu655x63mRK4KhikHj8TJ060LbbYwl599VU33OZvf/ub66GjhLhaXlHRVMcaAqqktqn2fKlo/+qNI/9slAPmz7fN/jqQhj99lKXjZqNtQT1G1apVSwwhDmo9w16vPb0pzFv+1QjlIHqT93a5p3TPPfe0li19rXJXK7gXCJrk0SlXQtj/+7//s4ceeshNg5eJpi1YsMBNTZiJfQd1n7pgUiZ/SvgESuczeemll+zzzz9PqiEff/xxZP1s5zPJdBLGSMOy8KCzd4zeVpzoUV9epmXhuP4hdBGgL/OUxAX0xVtT0Wp2EgVMVJYvX+5+K4Fn6aDJsmXL7MMPP3Svq8cApaRANj11ftR7Ih3nQV/qFCxRz4vKBk3U00/JU1X8Gf/Um0W9kxItX3zxhVu1WbNmCW2i3iwKZjz88MMlAnkKolx00UWRpLe6dlK577773HAbBXESGarj12Pq1KkZCZooF41+slEmegfZ7K/PafXSPM37oWRWoF69eqbPTkpmBdRvrOVf720lxdb/bZTYAvqsJ2hS1oagSVmT0C5Rl1cVJW+jIICAWfTQHM16o+7gyRTdsf/9998jm6g7NwWBQhFQEF69FPzgiHpu+f+/+EGUaAsFpfQlU1+yNcSBUlIgm56aNlgz5KSrKPgyfPjwdO3O7SfVfCa//fab294PVsSr1NVXX+164qrXSHSJTpyvXjl+UYBVU9Mr0JLIFwf19FXx6+Xvh98IIIAAAvkjQNAkf86l+Ulgk7ljk0fNpykIlBGInip4l112cXcQy6xUwQL9TT3++OORNQiaRCh4UAACGgIxdOjQSEs1Q5umem3UqFGkt0DkRe/Bm2++6Z4qqWeis7REb5/vj7Pp+ZPXFT0dvUz8c6LPT90N1xDdunXr+osr9dtPsJ3szDl+cCLRoMmvv/5qw4YNK1NX5VdRUZBPw5v9ohkJ/V4w/rKKfvtBk+gAe0Xr8xoCCCCAQPgECJqE75yVW2MlNNO4fSXsy1RRrhS/e3amjsF+81dA+Q5GjhyZlQbqrri6YPrF74nlP0/kd+meKun8EpLI8ceOHWuHHXZYIqsGfp2q+oLSvfhOr4ZxrE9ymtHANzIgFezUqZN9+eWXla7NueeeW2IfftJM5XtQz63Sxf97IbhYWmbD82x66gv85ZdfbuplUVFRzyAFwpTQNF5R7g8FLLbeeut4q8Z9XbmavvnmG7desjPn+AlXGzduHPc4WqG8fCAavqmiv5eNN97YPU7lHyVHVvGT2qayj4q20XnUcMZslJo9e5p9NMkd6mRv+NJxf+V/ycaxOQYCmRSooeE4Tz/jDrG/l49rObONlsutGcEoZQUImpQ1CeUSJdhU1+hjjz02o3f4qlSpYrVr1w6lEZXOvUD16tn7yFESVSXn80sqX+T8L4HaR7bzmeiY+o8rb/7evMSg9lxxEuma229vXuPUTEqaBfQ5ne6iL7j+3fdYY8GXLl1qSrap0lNfvCgVCmTac9NNN7XrrrvOJT+tqCKvvfaajRgxIm7ODCVDV8LTdPUgUl4SP8F6sj1NGjRo4JqkXi+VKX5PxFT+b4g+rt77Kk2aNIlenLbHClBm7f+Bm24y8244qFT3EkFW5zM6beeRHeVYQIHHv2bmqub9rWbtbyrHzebw6RPI3jeY9NWZPcUQePDBB91SJYOlIIBAyXwmCtaUHs8ez0hJj/0x91q3shfW8Y6X96/rTnYSyR7z3iNkDfRnTdNQhFh/S8p14ucz0ZSulIoFMu255ZZbmhKT/uMf/6iwIkpCqc/HeD0ttC+VeOtVeLCoF/1egNpfInlDojY1v4eJPqNTLdFBvlR6IUYf1x+Wk2w7ovcRmMdePhcKAnkp4A0xpCBQGYGqldmYbYMhoLs1yvqu/7B79eoVjEpRCwRyLBDdS6RLly6mLwfJFHXd1mwXfiFo4kvwuxAFNBuLSnlDKfy79koQm64v1vnsnGlPfV6pt126ivaVzs9AP2iSbC8TtccPmvjDdFJpox/kU68sJX4tXT755BPzA1ulXyv9fL43Ta+KeuJQEEAAAQTyU4CgSR6c1xdffNE057imz1NCMwoChS6gseX+RbksUrmTGB10UffobOczKfRzSPuDJeDf1d9xxx1jVsxPAsvQnJg8ZRZm2lOfefoc1NDddBRN137kkUemY1duH/7ncypBk3Ya6ueVefPmud8V/aObSvd4eTkuueSSEtMH+5/vbdu2jTnkSDlEEp0G1u9pQtCkojPBawgggEC4BfiGnaPzF30HOzrvQirVUXI+3S1R0ISCAAJm6iUS/XeVyh1S/6JanrnIZ8J5RCBIAv5MJbF6bOmOvN9zIpW/tSC1M1t1ybSnAr2aMeb0008v0WMulfaNGzfO3Zg56aSTUtk85jZ+0KS8nksxN/proQItm2++uU2aNKnE53ysbfTePOuss5yFn5Nn8eLFNmrUKLf6FltsUWazCRMmmHqxHHPMMWVei7XAH7qkAAwFAQQQQCA/BQia5Oi8zp49O3LkOXPmRB4n+0B3OJ5//nnThWo6Mtone3zWRyCIAtEBj2rVqsXsfl1RvXXB7E+HqfX4IliRFq8VgoCf/FX/32gWFb88/fTTdsIJJ7in+lsjn4kvU/HvbHieccYZVqdOHbvtttsqrkwFr2q2nCFDhtjDDz8cc8akCjYt9yVNvazAhYqmMk626CbR/vvv7/bhByzK24c/Q8++++7rZsnRDauLLrrI+vXrZ7vuuqsL9vmJXLWPF154wS688EJ75JFHXK6X8vbrL9dsghMnTjT1wPJ7wPiv8RsBBBBAIH8ESASbhXP53HPPuW6hyvSuaVBfffXVyCwDOrwy12v6vc6dO7u8C7rI0ZjdWMn2Sld3zJgx7gKWBLClZXheyAJ+fgUZ6O+qfv36SXGQzyQpLlYuAIE+ffqYejVeccUV7otut27d3Gw622yzjR100EH2xBNPmPKZJDJ1bQFwxW1itjwfeOABFxzQtLrJBn+XLFliJ554og0ePNg6dOgQt02JruAHOjQLTirDc3QcBU0U2NBnvXJWlVdOO+00e/31123VqlUuGKJj6/+EW2+91Q1fOuSQQ0w9RPRbwRzNqKH1lfA4kaJcL9o3PX0T0WIdBBBAILwCBE2ycO6OO+44N3Wopg9Vl1nlHdHYV39aSN35UF4S/w6e/gPWcIBXXnklbu10EauL1L59+8ZdlxUQKAQBjeOfNm1apKmp5DOJDrqQzyRCyYMCFxjoTdeoHhKaLlZfqK+//nrT1LZt2rRxMvq/jpK4QDY8NYuOeomoN5ACINdcc01CPUaUKFXrK7jzz3/+M/FGJbCmPzX1fvvtl3IeNl3zqF7q6XT++eeXe1S9P19++WVTbxL1HtSQJX+qUU2frHaqN416pCiYUqtWrXL3FesF5XrR7EN+b6tY67AMAQQQQCD8AgRNsnAOE00mlmxVNJ5XF69nnnlm5CIg2X2wPgL5JkA+k3w7o7Qn1wIKQuqO+qBBg9wNAPVa8Msbb7xh3377rZsxR/kzKPEFsu2p4ISmTz/nnHNs9913NyU5VTC5UaNGJSqrpKkKaDz++OM2fvx4u++++0zbprtoZhqVQysxBXndunVdAEhDkBTkjhccV2/D8pJ5N2nSxPSTbNEwTt24Ovjgg12OlWS3Z30EEEAAgfAIEDQJz7kqUVMN5znggAOsffv2du+995Z4jScIFIqAcito1g4Ne1NwUmPLH3zwwRLNf+2110xTQiqBpfL+6G5idJk5c6bNmjXLDXP7+eefbeTIkSVmnNDYe/2NqUeXupPvvffeSQ/3iT4ejxEIk8DYsWOtf//+7r2v/3O22247V30lWlaCTf1tnHvuuXb77beHqVk5q2uuPNXj4tFHH420W3nVFGyYO3eu9erVyzTUV0OtNOxKuT5uuummyLqVeaD3jtqsz071AtQx1TtDvUQqO6RFQbrmzZu7YUcaUqO8Jdkqv/76q7Vu3douv/xyu/jii7N1WI6DAAIIIJAjAYImOYKv7GGVzV5f5jS+nIJAoQpoNgR1H1cCSnWrrlmzpmk2BHWX1l1T/Wjcu8b1r1y50uUJik4SKzeN19dddA2f0/baT4sWLdzwubVr17qu25quUtvri6KCMCS7LNR3XOG1W1+i9YX3jjvucAETDSdVbwQN89AX1WuvvdZ9cSw8mdRaHBRPfcbpJ9Nl9erV7jNVudv0GaoAQ9euXe2qq65Ky6H1+a/ErQrOaAanrbbaKi37rWgnatPf/vY3l2B86NChFa3KawgggAACeSJA0CSkJ1JdQpVrQWOOKQgUqoC+gCgwUpminioUBBCILaAvocq5pSEd6k2iYL16LajHlXplJZowM/beC29poXnefffd7r1z11132ZVXXukSuN54441pHVI8fPhw0yyEGiaj3oaZTkas5LJK7K+ZdhSgpyCAAAII5L8An/YhPMffffed6W754YcfntI43BA2mSojgEDYBbzeCd60K8Wt0HNvthVK8AWUC0L/56iXiX6UzJySukAheSqopps8Knrv+AnwU9cru6X2qeFFl112mesBouE/mTiOjqzAjxLHqpeVhnzmXdljD7MPPtjQrFNPNbv//rxrIg0qUAGvd5g99dSGxvfubTZhQoFC0OxUBQiapCqXw+1Gjx7tLj6YZjiHJ4FDI4BA8gJFyW/CFsER0BfRTH0ZDU4rs1eTQvPM5HtHgTzN5qScKRpGqSGbmSi6WfWvf/0rfwOHXmDL/M9pPaYgkC8CvLfz5UzmrB0ETXJGn9qBdTGgoInu3mgsLwUBBBBAAAEEEEDA4s6iU1mjLl26VHYXbI8AAgggEEIB+tiG7KQpCaWy3iuXCWNpQ3byqC4CCCCAAAIIIIAAAggggECoBAiapHi6NJa1bt26KW6d+mZPeePx1MWVoTmpG7IlAggggAACCCCAAAIIIIAAAokIMDwnEaUY69x777229dZbx3gls4vOOOMMN13f9ttvn9kDsXcEEEAAAQQQQAABBBBAAAEEClyAoEmKb4CjjjoqxS0rt9ku3uwT+qEggAACCCCAAAIIIIAAAggggEBmBRiek1lf9o4AAggggAACCCCAAAIIIIAAAiEVIGgS0hNHtRFAAAEEEEAAAQQQQAABBBBAILMCBE0y68veEUAAAQQQQAABBBBAAAEEEEAgpAIETUJ64qg2AggggAACCCCAAAIIIIAAAghkVoCgSWZ92TsCCCCAAAIIIIAAAggggAACCIRUgKBJSE8c1UYAAQQQQAABBBBAAAEEEEAAgcwKEDTJrC97RwABBBBAAAEEEEAAAQQQQACBkApUD2m9qTYCCIRc4KeffrJBgwaFvBXprf6qVavSu0P2hgACCCCAAAIIIIAAApUSIGhSKT42RgCBVAXmz59vI0eOTHVztkMAAQQQQAABBBBAAAEEMi7A8JyME3MABBBAAAEEEEAAAQQQQAABBBAIowA9TcJ41qgzAiEVaNWqle26664hrX32q73JJptk/6AcEQEEEEAAAQQQQAABBCICBE0iFDxAAIFMC1x44YWmHwoCCCCAAAIIIIAAAgggEAYBhueE4SxRRwQQQAABBBBAAAEEEEAAAQQQyLoAPU2yTs4BEUAAAQQQyI6Aki2PHTs2OwfjKAggkBaBefPmpWU/7AQBBBBAID0CBE3S48heEEAAAQQqEthhB7NPpxev0bZt8WMeZUxg6dKlph8KAgggEFdgzBiz5cs3rLbppnFXZwUEQiNw881mV165obr164em2lQ0OAIETYJzLqgJAgggkL8CtWubdeiQv+2jZQgggEDYBVq3DnsLqD8CsQVatoy9nKUIJChA0CRBKFZDAAEEEEAgDAJnn322zZ8/PwxVpY4IIBBHYJ999omzBi8jgAACCGRaoEqRVzJ9EPaPAAIIIIAAAggggAACCCCAAAIIhE2A2XPCdsaoLwIIIIAAAggggAACCCCAAAIIZEWAoElWmDkIAggggAACCCCAAAIIIIAAAgiETYCgSdjOGPVFAAEEEEAAAQQQQAABBBBAAIGsCBA0yQozB0EAAQQQQAABBBBAAAEEEEAAgbAJEDQJ2xmjvggggAACCCCAAAIIIIAAAgggkBUBgiZZYeYgCCCAAAIIIIAAAggggAACCCAQNgGCJmE7Y9QXAQQQQAABBBBAAAEEEEAAAQSyIkDQJCvMHAQBBBBAAAEEEEAAAQQQQAABBMImUD1sFaa+CCCAAAIhFFi92uyXX4or3qyZWY0axc95hAACCCCQW4F588xWrdpQh3r1zBo1ym19ODoC6RL4/Xez5cs37K12bbMmTdK1Z/ZTIAL0NCmQE00zEUAAgZwKfP652VZbF//MmJHT6nBwBBBAAIFSAkcdVfwZ/c9/lnqRpwiEWGDw4OL39sknh7ghVD1XAgRNciXPcRFAAAEEEEAAAQQQQAABBBBAINACBE0CfXqoHAIIIIAAAggggAACCCCAAAII5EqAoEmu5DkuAggggAACCCCAAAIIIIAAAggEWoCgSaBPD5VDAAEEEEAAAQQQQAABBBBAAIFcCRA0yZU8x0UAAQQQQAABBBBAAAEEEEAAgUALEDQJ9OmhcggggAACCCCAAAIIIIAAAgggkCsBgia5kue4CCCAAAIIIIAAAggggAACCCAQaAGCJoE+PVQOAQQQQAABBBBAAAEEEEAAAQRyJUDQJFfyHBcBBBBAAAEEEEAAAQQQQAABBAItQNAk0KeHyiGAAAIIIIAAAggggAACCCCAQK4ECJrkSp7jIoAAAggggAACCCCAAAIIIIBAoAUImgT69FA5BBBAAAEEEEAAAQQQQAABBBDIlQBBk1zJc1wEEEAAAQQQQAABBBBAAAEEEAi0AEGTQJ8eKocAAggggAACCCCAAAIIIIAAArkSqJ6rA3NcBBBAAIECEthyS7Phw4ob3KxZ8WMeIYAAAgjkXmDwYLMjjthQj512yn19qAEC6RI44QSzXXfdsLett07XXtlPAQlUKfJKAbWXpiKAAAIIIIAAAggggAACCCCAAAIJCTA8JyEmVkIAAQQQQAABBBBAAAEEEEAAgUIT+P927JAAAAAAYVj/1lS4Zx7DcDhN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CThN3hbXlwABAgQIECBAgAABAgQIEEgCTpPEJESAAAECBAgQIECAAAECBAi8CQxrlC++6zCBFAAAAABJRU5ErkJggg==" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## Quantum Solution\n", "\n", "Using a quantum computer, we can solve this problem with 100% confidence after only one call to the function $f(x)$ by mapping the state $\\vert x\\rangle \\vert y\\rangle $ to $ \\vert x\\rangle \\vert y \\oplus f(x)\\rangle$. Below is the generic circuit for the Deutsch-Jozsa algorithm.\n", "\n", "![deutsch_steps.png](attachment:deutsch_steps.png)\n", "\n", "The way to read the big $U$ black box is that it takes in $x$ and $y$ and returns $x$ and $y\\bigoplus f(x)$ in the given qubits that these expressions are aligned with.\n", "\n", "Now, let's go through the steps of the algorithm:\n", "\n", "