{
"cells": [
{
"cell_type": "markdown",
"id": "4f081f0b-f2b6-40ec-b358-719b36cbe61a",
"metadata": {},
"source": [
"# 2025-09-26 QR Stability\n",
"\n",
"* Stability and ill conditioning\n",
"\n",
"* Intro to performance modeling\n",
"\n",
"* Clasical vs Modified Gram-Schmidt\n",
"\n",
"* Right vs left-looking algorithms"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "7e89c4cf-838c-4349-916c-e3149087fc32",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"vander (generic function with 2 methods)"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using LinearAlgebra\n",
"using Plots\n",
"using Polynomials\n",
"default(lw=4, ms=5, legendfontsize=12, xtickfontsize=12, ytickfontsize=12)\n",
"\n",
"# Here's our Vandermonde matrix again\n",
"function vander(x, k=nothing)\n",
" if isnothing(k)\n",
" k = length(x)\n",
" end\n",
" m = length(x)\n",
" V = ones(m, k)\n",
" for j in 2:k\n",
" V[:, j] = V[:, j-1] .* x\n",
" end\n",
" V\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "01ea7bbd-c9e0-4ce7-9e42-2a455c198691",
"metadata": {},
"source": [
"## Gram-Schmidt orthogonalization\n",
"\n",
"Suppose we're given some vectors and want to find an orthogonal basis for their span.\n",
"\n",
"$$ A = \\begin{split} \\Bigg[ a_1 \\Bigg| a_2 \\Bigg] = \\Bigg[ q_1 \\Bigg| q_2 \\Bigg] \\begin{bmatrix} r_{11} & r_{12} \\\\ 0 & r_{22} \\end{bmatrix} \\end{split} = Q R$$"
]
},
{
"cell_type": "markdown",
"id": "fae8c913-b5f4-4ebb-932b-9d060b661203",
"metadata": {},
"source": [
"## A naive Gram-Schmidt algorithm"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "e9d80432-0d2a-4475-88c0-a1ba032023b9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"gram_schmidt_naive (generic function with 1 method)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's form Q and R by making each column orthonormal to all previous columns\n",
"function gram_schmidt_naive(A)\n",
" m, n = size(A)\n",
" Q = zeros(m, n) # Orthonormal basis\n",
" R = zeros(n, n) # Upper triangular\n",
" for j in 1:n\n",
" v = A[:, j] # current column to normalize\n",
" for k in 1:j-1\n",
" # We do a projection against the previous columns of Q. Why?\n",
" r = Q[:, k]' * v \n",
" v -= Q[:, k] * r\n",
" R[k, j] = r # What is this factor?\n",
" end\n",
" # Normalize and store our final v\n",
" R[j, j] = norm(v)\n",
" Q[:, j] = v / R[j, j]\n",
" end\n",
" Q, R\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "5eddefc9-2aa2-4a95-bf5a-f7cfb7f2cbb9",
"metadata": {},
"source": [
"## A variant with more parallelism\n",
"\n",
"$$ q_2 q_2^T \\left( q_1 q_1^T v \\right) = q_2 \\left( q_2^T q_1 \\right) q_1^T v = 0 $$"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "fd6550f3-5552-478b-981a-2210bf79568c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"gram_schmidt_classical (generic function with 1 method)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's form Q and R by making each column orthonormal to all previous columns\n",
"function gram_schmidt_classical(A)\n",
" m, n = size(A)\n",
" # Same setup as our naive version\n",
" Q = zeros(m, n)\n",
" R = zeros(n, n)\n",
" for j in 1:n\n",
" v = A[: ,j]\n",
" # Here we make the current column othogonal to all previous\n",
" R[1:j-1, j] = Q[:, 1:j-1]' * v\n",
" v -= Q[:, 1:j-1] * R[1:j-1, j]\n",
" # And normalize our result\n",
" R[j, j] = norm(v)\n",
" Q[:, j] = v / norm(v)\n",
" end\n",
" Q, R\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "c986c0d3-4ec4-4e2d-be47-331a77c7c4ea",
"metadata": {},
"source": [
"## Order of operations matters\n",
"\n",
"$$ \\begin{align}\n",
" \\left( I - q_2 q_2^T \\right) \\left( I - q_1 q_1^T \\right) v \n",
" &= \\left( I - q_1 q_1^T - q_2 q_2^T + q_2 q_2^T q_1 q_1^T \\right) v \\\\\n",
" &= \\left( I - \\Bigg[ q_1 \\Bigg| q_2 \\Bigg] \\begin{bmatrix} q_1^T \\\\ q_2^T \\end{bmatrix} \\right) v \\end{align} $$\n",
"\n",
"is not exact in finite arithmetic.\n",
"\n",
"We can project out the components of our vectors in the directions of each $q_i$."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "8c70c84f-30c7-4d56-aabe-907ada9eaaf6",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = LinRange(-1, 1, 23)\n",
"A = vander(x)\n",
"# First with classical Gram-Schmidt\n",
"Q, R = gram_schmidt_classical(A)\n",
"\n",
"scatter(diag(R), yscale=:log10, label=\"\\$R_{j, j}\\$\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "76548d72-7d2f-4607-8e89-579167e64d2b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = LinRange(-1, 1, 23)\n",
"A = vander(x)\n",
"# And also with 'naive'\n",
"Q, R = gram_schmidt_naive(A)\n",
"\n",
"scatter(diag(R), yscale=:log10, label=\"\\$R_{j, j}\\$\")"
]
},
{
"cell_type": "markdown",
"id": "8e2fcf1c-7001-4e58-bc91-4c863ba66e87",
"metadata": {},
"source": [
"The final vector is almost linearly dependent."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "2a411486-aae2-48c5-909a-630e4e5a435d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"norm(v) = 1.0\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dZ0BT58MF8CcEQthBZMkUcYuiiKigFUfdRVEQtWodr6OtWrXO+ne0VGtr6yrW1TqwVlRcFbeCiLUiIAgqIChDhmwIKwlJ3g+xiCEISMi9cM/vE3me680xEA43d7GkUikBAABgKjWqAwAAAFAJRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMFrLKMLCwsLIyMjMzEyqgwAAQGvTAopwy5YtZmZmgwYNsrS0nDNnjlgspjoRAAC0HnQvwitXrqxfv/7AgQOlpaV37twJCAj45Zdf6lo4JSVl9+7dDVyzWCym/+XlRCIR1RHqQf+EUqmU/n880f9lxPtFKeifkJnvF7oX4W+//TZgwIBZs2apqakNGjRo5syZv/32W10LP3/+/NKlSw1cs0gkov/3u7KykuoI9aB/QolEIhQKqU5RD/q/jEKhEO+XpqN/QrFYzMD3C92LMCYmxt3dvfqhu7v7y5cvS0pKKIwEAACtCa2LUCqVZmdnm5iYVI+YmpoSQnDUDAAAKAuti1AkEolEIk1NzeoR2ddlZWXUhQIAgFaF1kXI4XAMDQ0LCgqqR/Lz8wkh7dq1oy4UAAC0Kuoqe6aqqqrExMSKiooOHTrweLzaC1RUVNy8eTMrK8va2trd3V228WdjYxMfH1+9zLNnz7hcbs0PSwEAgIYehId/vemHl6npIrFEW1NjzAj3rRvW6uvrU51LAVUU4alTp3bu3BkTE1NeXk4IOXv27MSJE+WWCQ8PnzhxYmZmJovFkkql7du3//vvv7t37z5+/Phff/01NzfX2NhYKBSeOHFizJgxbDZbBbEBAODD+J8I+OoHv4LJvxLProQQIhEfDP/zitvwB7eCjI2NqU4nTxUfjUZHR5eWlnp7e3t4eChcgM/nT5gwQSqV/vvvvxKJJDg4uLi42MPDQyAQfPXVV4aGhu7u7hs2bBgxYsSLFy++//57FWQGAIAPk5ubu+LbHwsWXCDtur4ZUmOL+s9MdV83Z/HXlEZTTBVFuGXLlsePHx8+fHj48OEKF/jjjz+ysrJ8fX1dXFwIIUOGDFm/fn1ycnJAQIChoeGDBw+8vLwSEhKcnZ0jIyO7dOmigswAAPBhTp4OLO73GdHUlRuXOIwNj42XfTRIK6rbR/gely9fZrPZNbcXPT09ly9fHhQUNHPmTCMjo40bNzZkPXl5eU+fPp07d271yIwZM/r166dw4crKSnV1dXV1WrwCdamoqKD558D0Tyg7QZjmV0Wh/8tYUVGhoaGB90sT0T9hVVWVSCRq4vvl3+gnwnaTFE5JTTsmJCR07ty5Ketv1MvI5XLV1OrZ5KPFj/WTJ08sLCyMjIyqR2xsbHg83tOnTxu1Hl1dXQMDA2dnZ9lDFotlZ2dX8+yLmqRSKf2LUCgU1pWfJuifUCwWs1gsmoek/8sokUjoX4T0fxnpn5DNZqupqTUxpBZXk4gECqdYVUIdHZ0mrr9RLyOLxap3GVr8WOfl5XXr1k1u0MjIKDc3t1Hr4XK5FhYWCxcubMjC7P806ilUDAmVgv4hW0rCFhGS6hRvxMfHe3h4VFVV1RyUSqUN+b1MraaHrKys1BP4SznyH40SIq0oLxw9OvLDVstms3/77bdhw4Yp/RtNiyIUiURaWlpyg1paWjXPIAQAaEGysrLatGnz559/Uh2k9Vi7du3Lly+bY820KEJtbe3CwkK5wcLCQl3d2n9QAAC0DFpaWnZ2dlSnaD2a7xxEWlxZxsbGJicnp+aIWCzOz8+3tramKhIAADAELYrQ2dk5Pz8/Ojq6euTevXuVlZV1HfAJAACgLLQowunTpxNCDh06VD1y4MABFoslGwcAAGg+qthH+PDhw3Xr1hFC0tPTCSGbNm3au3cvIWT//v2yD9CHDx/u6enp5+fH5/MHDBhw+/bt06dPz50718nJSQXxAACAyVR6sIyVlZWVlZXCqT///NPX1/fYsWP+/v62tra+vr6rV69WZTYAAGAmVRShs7PzjRs33r8Ml8v19fX19fVVQR4AAIBqtNhHCAAAQBUUIQAAMBqKEAAAGI0WV5YBAIAWJyIi4ubNm5qampmZmV26dJkxYwaHw6E61IdAEQIAQOMkJSWtWLFi6NChS5culV0p+pdffnFxcbl27ZqJiQnV6RoNH40CAEAjhIaGDh069H//+191CxJCli9fbmtrO2fOHGqzfRhsEQIA0FF8fHxSUlJpaamZmZmDg0PNO7ZS6NmzZ+PHjz906FDfvn3lpry8vKZPn56UlGRvb09Jtg+GIgQAoBGBQODn57dzj196yovqQTZb/SN3980bN7i5uVGYTSKRzJgxo1+/fl5eXrVnZbdJiI6ObnFFiI9GAQDoIikpyaFX75Wr16RbDCJfBZGfUsnuPPL9U/H0PaHJBYMGDVq8eLHczX4b6MKFCwcPHvTx8REKhYSQqKio7t27Z2RkNGolZ8+ejYyMXLp0qcJZPp9PCBGJRB8Qj1rYIgQAoIWXL1+6DHAt4RhK/hdB2nV9O6GlT0zsq9zmkDsH9u5bkZObd/KvE426ifzz588rKipmz569fPny+Pj4nj17tmnTJiMjIzk52cLCouHrOXr0qL6+/siRIxXOPn78mBBia2vb8BXSBLYIAQCoJxaLP5ngWaKuX7XqzjstWI3FIkMWSOb/efr0qd27dzdq5deuXfP09Pznn3/U1NQ6d+5MCLG1tf30009r3zc4JCTk7t27da0nLCzMxcVFQ0ND4ezt27d5PF7tfYf0hyIEAKDe0aNH42Jjqub6E50271uut4d08Pz/bdxcWFjY8JV/+eWXHA4nICBg0qRJmpqaskEzMzNLS0u5JadMmfL5558rXEllZWVRUVGHDh0Uzqanp9+6dWvevHl11SSdoQgBAKi378AhtZ5jiG0D7j03bl1pKT8wMLBR65dKpWfOnPH09Kx+qPDk93PnztW8NWxNmpqaXC63rp7bvn27sbGx7I57LQ6KEACAYkVFRREPH0j6TGzQ0gZmavYDrl671qinyMjIyMnJGThwoOzh1atXR4wYUXuxgQMHuri4KFwDi8Vyd3ePj48nhEil0hMnTuzbty85OZkQcufOnUOHDp0+fdrQ0LBRqWgCB8sAAFAsPT1dKpEQ004NXF5s2jnpRXSjnoLD4aipqenq6hJCysrKYmNjR48e3dicmzdvHjJkyJMnT+Lj493c3KytrXfu3Dlw4MAFCxYEBQVRe2pHU6AIAQAoVllZSQghGtyG/gMNbnlFRaOewsTE5Kuvvlq3bt2IESOio6Pr2hH4fs7OzoGBgfPmzbO1tXVxcYmMjLxw4UJCQkJwcLC5uXlpaamsaFscfDQKAEAxc3NzQggpbOhZfazCdGuLdo19lp9//nnNmjV2dnarV6/W09Nr7D+XGTVqVEhIyPz58+/evVtZWclisbZs2WJubl5cXLx9+/YPW6ecCRMmpKenK2VVDYQtQgAAillYWLSzssl8dov0Glv/0mIROzHUbcWSD3iitm3btm3b9gP+YU2ampru7u6yr6VS6apVq4YPH759+/aDBw82cc0yhw4danrIRsEWIQAAxVgs1rQpXuoP/iRlBfUv/Y+/uLzY29u7+XPVz97e/tChQz4+PmPGjHF0dFS4jFQqbfgKU1JSeDyektI1FIoQAIB6q1at0mSJWSeX1bNcwSv1Cxt8pvh069ZNJbnqsX379n379gUHB2/evFnhAhEREbVP26+Lv79/Tk7OokWLlBewQfDRKAAA9YyNjf84dNDHx4fotCXePxI1toKF8lLU/SaY83R2796l8oCKGRgYLFiw4D0L9OrV69KlSw1ZVVRU1EcffVRWVpafn6+kdA2FLUIAAFrw9vbeu3cvO+Q39R8/Is9uEYn47Vx5Ebm+Q/17FytN0Y1rV1S8C60pNDQ0unfv3pAl+/TpY21tHRISMnjw4OZOJQdbhAAAdLFw4UIHB4fFXy179MtodX1jqXlXsZaBRkmWOC2GRcj8+f/n6+vbQk9ab6Dg4GDVX54GW4QAADTi6uoaGf7g/v37a5YsmOJkOaadeKZ7L789u9NSU/z8/FpcC8bExPTr109uMCwsrPYgIUQqlcbGxvbs2VMl0d7CFiEAAL2wWKz+/fv379+f6iBK0KlTpx9//FFusFevXpMnTy4rK9PR0ak5/vTp0y5duqipqXoLDVuEAADQXLS0tIYMGSI3qKen17Vr15oteOLEifz8/MDAQB8fH5XmI4RgixAAAFSsvLzcyMio5sjVq1eFQiGPx5syZYrq86AIAQBApbS1tavvgyFz7NgxqsIQfDQKAAAMhyIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEbDJdYAAJRPXV09IiKib9++NQelUimLxVLK+gUCgVAkkkoJIYTFYnE1ORoaGkpZsxJDKldqaqqrq2tzrBlFCACgfK6uriEhIVJZU/2nvLxcW1tbic8ikUiUe9MisVhcVVWlqampxHUqUQNvdt9YKEIAAOVTU1Pr06eP3CCfz9fT06MkTwNVVVWJRCItLS2qg6gU9hECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0daoDAAAA1E8gEPxx1P/CjdDkF8kd7Dp4jBg8Z9YMTU3Npq8ZRQgA8I7i4uKtv+y5fCuksKjYkGcweuhHa5cv5vF4VOditNzcXLdRHq/sRpb3XEmG2iTlpd69cXbnfvewqxeMjY2buHIUIQDAWykpKYPHTsp2WSDyPkG0DV+VF8VHnzsxcGhoUGD79u2pTsdcn0ybnTRkg6TrsDePzbuUm69Letbvk2mz79+41MSVYx8hAMBbn0yd/Wrir6KBs4m2ISGEaPNEA2e/8tz7ydTZVEdjrsTExORStbct+B9J1+HJpWrPnz9v4vpRhAAAb8TFxWWrG0tt+8pP2Dq91jSLjY2lIhSQR48e8W1cFU7xbQZGRUU1cf0oQgCAN2JjY0ssnRVOFVv0RRFSRSQSSdQU78iTqGlUVVU1cf0oQgCAmqQKR1kqTgE1dOnSRf/1Y4VT+tkxXbp0aeL6UYQAAG84ODjov3qocEr/1UMHBwcV5wEZJycng/wEkp0gP5GdwCt83qdPnyauH0UIAPBGjx49zMR5rJfyXchKiTAVvUYRUoXFYp0/fsjM/1NWbBCRiAkhRCJmxQaZ+X96zv8gi9XUzXWcPgEA8Nbffx0ZPMYzq9//iXpNILpGpKxAI+a82YMDfwcFUh2N0Xr06BEZfHnlxi33ft1aIarS5mi4ujj/GHy5Xbt2TV85ihAA4C0bG5vY+8Hbdv4adHZmQUFhmzaGY4cPWbXjtoGBAdXRmK5du3Z/HvyVEMLn8/X09JS4ZhQhAMA79PX1v9+w7vsN66gOAiqCfYQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKPhPEIAACCEkNevX0dHR5eVlfXu3ZtRdyFGEQIAMF1BQYHP3M9jUnME1s5itqb29mPGkqIzR/Y1/cYOLQKKEACA0UQikevIT54PWCEeO042UkpITkac+4SpEbcuWVhYUBtPBbCPEACA0Q4dOZZuM1zcc9w7oxY9ckZtXvE/X4pCqRSKEACA0Y6fDSrrO732uKT7yLv3H6g+j+qhCAEAGC3n9WvCU3QzI5ZaFTM6ghH/SQAAqIuRkREpzlYwIZWyiUTlcSiAIgQAYDQfj1FaUQG1x1nxwS5OvVWfR/VQhAAAjLZw3px2CRdYCcHvjOYkG19as8P3fxSFUimcPgEAwGhcLjfs6oWJM+Ylh/1aZtVPrM7Vfx2rn59wJuCwra0t1elUAUUIAMB0ZmZm929cSkpKioqKKi8v7917ec+ePVksFtW5VARFCAAAhBBib29va2srEom0tLSozqJS2EcIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARlOnOgAAMEtVVdXNmzf/jYwprajo79hj5MiRenp6VIcCRsMWIQCozpMnTzr2HuDjd33zK9ufSxxnnXzS0cntwqUgqnMBo2GLEABUpLi4+ONJn2Z+6k/MOstGynuOLR/8+dw1HjaWFo6OjtTGA8bCFiEAqMgOv/25/edXt+Ab2rz8SbuXrvelKBQAihAAVOXSzRCRwzgFE1a9EpNfqDwOwBsoQgBQkZLiEqLNUzglwe8ioA7df/iSkpJY79q+fTvVoQDgQ1hbW5FcRVt+YhGH7r+KoDVrGQfLnD59un379rKvLS0tqQ0DAB9m/vTJEb8fKJ60U25cI+LU+JHDKYkEQFpKEXbr1q1bt25UpwCAJvGa5On3u//DWzsq3JcQNbZskB0bZPGv35a7N6jNBkzWMorwxo0b9+/ft7GxcXV11dLSojoOAHwIFot148KplRu+O/mTM8u0k1SDS7IT+vXqfjj4Co+neN8hgAq0gCJks9n79+9ns9nPnz83MjK6ePGik5MT1aEA4ENwOJxdP3y3c+u3qampAoGgQ4cO6uot4LcQtG5U/gg+e/Zs5075vQUy9vb2K1euJIS0a9cuMzPTxMSEEPLq1asxY8b4+PgkJiayWCyVZgUA5WGxWLa2tlSnAHiD4kO1pHWTLaCtrS1rQUKIpaXlxo0bk5KS0tPTqYsMAACtitK2CKuqql69eiWRSGxsbNhsdu0FSkpKQkNDS0pKunfv3qtXL0JI165dDxw40Khnke1IKC0tVUpmAAAAJRTh9u3bz549Gx0dXVFRQQjJysoyMzOTW+bMmTNz5szh8/myh6NGjTp9+rSurm69KxcIBJqamrKvpVLpkSNH9PT0OnXq1PTYAAAARClFeOXKldLS0ilTpjx69CgmJqb2AnFxcdOnT+/Ro4e/v7+Njc2hQ4eWLVu2aNEif3//elf+9ddfJyQk9OrVS1NT8/bt2//++6+fnx/2rgMAgLIoYR/h9evXHz9+fPjwYQcHB4ULbNu2TSgUHj58uFu3bjo6OkuXLp0wYcKJEyeSk5PrXfnMmTMdHR2Tk5Pj4uIGDBhw7969RYsWNT0zAACAjBI2rRTuEawmlUqDgoI6duzYs2fP6sHJkyefO3cuKChoyZIl71+5s7Ozs7NzA5MUFBQ8ffp03rx51cFmz55d171dKisr1dXVab5xWVlZqaGhQXWK96F/QrFYLBQKaX6YMf1fxsrKSrFYjPdLE9E/YVVVlUgkak3vFw6Ho6ZWzyZfs/9YZ2RkFBYWjhgxouZg7969CSFxcXHKfS4ul6uvr9+3b9/qEWNj47peL9m7muZvbA0NDZq/beifUE1NTSqV0jwk/V/GqqoqDQ0NvF+aiP4JZRVI85CNehkbUurN/mOdm5tLCDEyMqo5KHsom1IibW1tS0vLhQsXNmRh9n+Um0G5kFAp6B+ypSRsESGpTvE+9E8olUolEgnNQyr9ZWz28wgFAgEhRO66aDo6OoSQysrK5n52AACA92v2IpR1XlFRUc3BwsJCQkhDTp8AAABoVs1ehFZWVqTWp6CvX78mhFhbWzf3swMAALxfsxchj8fr2LFjWFiYSCSqHgwJCSGENPxwUAAAgGaiimuNTp06tbCw8Ny5c7KHIpHo2LFjBgYGY8aMUcGzAwAAvIcSjho9derUmTNnCCHh4eGEkPnz53O5XE1NzeoLxyxbtuz48eNz5syJj4+3tbU9cuTI48ePf/31V319/aY/OwAAQFMooQgLCgpevHhBCGnbtm3btm0zMzPJu4eJ8ni8kJCQZcuWbd26tbKy0t7e/tChQ3Pnzm36UwMAADSREopw4cKF9Z66Z2VlJdtqrKiowC3mAQCAPlR9P0K0IAAA0ArFN+YFAACgFooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMJo61QEAAFo/sVgcGxsbHR1tbW3t6OjYpk0bqhPBWyhCAIDmdfnqtfnL1ggtHflGXbQq4tST1o0bMmDfjm0cDofqaEAIihAAoFkFh9yZser7gvlBRM+YEFJJCCHk5K0deTP/7+LJo9RmAxnsIwQAaEYLV64vmHFM1oLVKoYtu59eGhERQVUqqAlFCAAtW0FBwaYtPw4e5+U0ZPTEmfPPnjsvlUqpDvVGTk5OkVSLGFrUnsrv5XPm4hXVR4LaUIQA0IJFR0f3GDhsS5Lh3UFbn8+7fN523pzfrgz/xEskElEdjRBCcnJyCM9c4ZSUZ56WlaPiPKAQihCg9aioqFj/3dYu/T5q162vjUO/sVNmxcXFUR2qGVVUVIyfNidrVoBo4GfEyIZoaBHr3sXev97Xdf56/Waq0xFCSNu2bUlRluK5oiwrcxPVxgHFUIQArURRUVHvQcO3x2smzLqQtfx+2pKwyx3+b8iUeWcvXKQ6WnM5d/5CYddxxLi93HiF+9KT5y/RYaPQzMxMX1JKijJrTxk9Dpg0bqTqI0FtKEKAVmLB8jXJfT8XuC8mmjqEEMJiETuX/IWXFq3amJ+fT3W6ZhES/qisvZuCCTU2Me+akpKi6kCK/PaTbxv/WaT0nW8BN3i3Sztuv379qEoFNeH0CYDWoLKyMuR+RNWKPfITWgZFzrNOng78YuF8KnI1L6FQRHTq+CWmpk6HLUJCyPBhQw9vqVy4YpTIum9x2646FbkayWGjBvQ+uPt3qqPBGyhCgNYgNTWVmHVWOCW07P0g5twXKg6kEs4OXU7ejRZ0GqRgLjve1tZW1YHq8MnYMaNGDH/8+HF0dLSNTU9HxxXGxsb1/zNQFRQhQGvAZrOJuI4NIEmVhnrrfKf7eE3avGNYbv+ZRMug5jj70bmBvR20tbWpClYbh8Pp27dv586d9fT0qM4C8rCPEKA1sLGxIdkJRCKuPaX98t7gfo6qj6QCRkZGv23bbLRvPHn58M2QqJJzd7/d/R2/79lOaTRoSVCEAK2BhoaGz8TxWsG75CcK0nlx5yZ7TqQilCpMmuBx+6/9IxP2Wu4YYPpz/w4HR31lUxgddgtXtYaGa50fmAAw0E/fbXg80efR6SXF/ecR8y6En6ueGNI2dOe54wd1dHSoTteMevbsefXMcUIIn8/HB4/wAVCEAK0Eh8O5fSnwdOBZ/7N+8X/HG5uYDunfd1nYDRyXAfB+KEKA1oPFYnlPnuQ9eRLVQQBaEuwjBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEADqUVJS8vDhw+joaIFAQHUWAOVTpzoAANBXRkbG1HlfJmTmidv1YImFrLToEYP6H9j5o46ODtXRAJQGRQgAiuXl5Q34+JOMcT9JJg2qHjzz79H40RPCg6+y2WwKswEoET4aBQDF1n77Q9bgryUdB9UcFPaf9byNk/+ff1GVCkDpUIQAoNjVWyFVvSfUHuf3++yPgPOqzwPQTFCEAKCYUEKImqK9J0bWmZkZKo8D0FxQhACgmJpUrHiiNM+Ax1NtFoBmhCIEAMUcHbqTpH9qj3Oiz08cPVz1eQCaCYoQABTb8d36thdWkOKsd0bTok0ijyxdNJ+iUADKh9MnAECxLl26nNm/Y/oCjzL7IcWmjqyqSsOMcOPChEt/n9bT06M6HYDSoAgBoE4fDR70IuZBaGhoeFS0no5O3wXz+vfvz2KxqM4FoEwoQgB4Hw6HM3z4cFdXVw0NDXV1/MaAVgj7CAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo+H0WIBGyMjIiIqKev06p3PnTs7Ozlwul+pEANBUKEKABqmoqJi1aGlIzPMK+4/KtYx5589oJH6xw3fDVO/JVEcDgCZBEQI0yIRps+/ouwm+8JM9LCCEVJR8+cNUPV2dcWNGUxoNAJoE+wgB6hceHh6ZJxEMWvDOqJZ+wYzDS9ZupigUACgHihCgfmcvXct38FIwoWdSzjXKzMxUeSIAUBoUIUD9MnLzib6JwimJvklubq6K8wCAEqEIAepnY27CKsxQOMUqzDAzM1NxHgBQIhQhQP28J4wzij6hYKIgnUfKTU1NVZ4IAJQGRQhQv549ew7rbqlz5Tsilb4dLc42Ojbj4I4fqMsFAEqA0ycAGuT4gV+Xf7Pp5M8DpO37VeqaauclauYkHN6zffAgN6qjAUCToAgBGkRdXX33Nt8t/1vz5MmT7Ozsrl2n2dvbq6nhMxWAFg9FCNAIurq6Li4uVKcAAGXC37MAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQDF8vPzIyMj8/LyqA4CwFAoQgDKXLp8pX0vl+6jpk3+IaDHmE9tHfpdvBREdSgAxsFFtwGoEXDm7KLv/Qo/O0v0TN4M8XM/2zBrT2n5dB8vSqMBMAu2CAEoIBQKv/rm28I5p962ICFEz7hwTsCKjb6VlZXURQNgHBQhAB4iJJ0AABvrSURBVAXu3bsnsB9MtPTlJ7h6gk7DwsLCqAgFwFAoQgAKvHr1qpTXXuEUn9c+PT1dxXkAmAxFCEABfX19zcpChVPcygIej6fiPABMhiIEoICbmxv32VUilcpPSKVaT6+4urpSEQqAoVCEABQwMjKaPNJd56qv3Lj29a0eQ11NTEwU/isAaA44fQKAGr9u31L+xbLLe0cVd/tE1MZWozDN4MmFkU6d9+3YRXU0AGZBEQJQg81mH923Ozk5OeROaPSzB47uHT/auM/e3p7qXACMgyIEoFKHDh06dOjA5/P19PSozgLAUNhHCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgZpKioKDo6urBQ8f1gAQCYqWVcdFsoFGZmZpqammppaVGdRYHMzEy/Q0fuRcRUVJT3cei+YKaPo6Mj1aHecf3Gzc9XbyhlaUuMbNQK0rRF/D0/bBo7ehTVuQAAqEeLLcKLFy96eXnZ2dm1adPm/PnzcrMHDx40NTVt3759mzZt1qxZI619U29KXQy67Dh03LYMqzsDvgsf5bdP4jZ8ztdrN2+hOtdbgecvTv3aN3n6ydeLruR673u98PLLWWdmrNt+IuAM1dEAAKhHiyKMi4vT1taeN29eYWGhUCisORUaGrpgwYK1a9cWFxf7+/v/8ssv+/fvpypnbenp6XOXr8/9/JrY2YcYtycG5qTHyPxFQfuuRZ27cJHqdIQQIhKJFq/ZWDD3NDEwfzuqb1o499TyDd9VVlZSFw0AgBZoUYTr1q07evToggULak/t3r27T58+q1at0tfXnzx58vTp03fu3Kn6hHX56df9+cPWEG3eO6MstSLPXzZso0XO+/fvC+xc5RMSQrh6gs7D7969S0UoAAAaoUURvkdUVNSIESOqH3788ccJCQmlpaUURqrp7r8PpZ0GK5jgmecWFqs8jgLp6emlvPYKp0oM7FLT0lScBwCAbmhdhFKpNCsry9TUtHrEzMyMEJKZmUldqHeIhEKizlE4JSUsOuzO1NfX16xUfJgot7KAZ2Cg4jwAAHTT7EeN+vn5vXjxQuHU/PnzO3fu/J5/KxKJKisrax4pqq2tTQjh8/nKDfnBunbp/OTVY2LvKj8hLNfWYLNYLCpCvWPgwIGaq7/jj95AaoXRfnbFze3/KEkFAEAfzb5FmJ+fn10HueNiauNwODwer6ioqHqkoKCA/LddSAcrFnzW5taPpNaWn/btnXOme1MSSY6RkZHnx0N0rskfxap9c/uYQc70eSUBAKjSuC3C0tLSnJwcfX39tm3bKlwgMTHx2bNnenp6AwcO5HK5hJANGzY0JZ+VlVVSUlL1w+fPn2toaNT8sJRa/fv3nzm875FjM4s8fiQ8c0IIEZTpBO90KAxfvUz+PBCq7P15a9nCJdd+G1PUfUJVGxv1wnTe04vu3a0O7fajOhoAAPUaVIQvX77ctGlTREREQkKCWCyeP39+7XMYysvLZ8yYcfbsWdlDIyOjo0ePjh07ton5Ro0adezYMT6fr6enJ5FIAgIChg8frq5Oo+sA7Nj67aDzFzZtn52bXyRlsfS4mnOme61cepE+Idls9vGDfomJiSF3QuOe/9vN1WbI2h1dunShOhcAAC006Jd1SkpKYGBg7969p06devz4cYXLLF68+OzZs76+vvPmzUtPT589e7aXl9ejR4/evxdQJjQ09M8//5Sd03bw4MFbt245OTnNnz+fELJixYrjx4+PGTNm9uzZ169ff/ToUVhYWGP+g6rgOcHDc4IH1Snq0alTp06dOlGdAgCAdhpUhK6ursXFxWw2Ozk5WWERvnz58siRI2PHjv3mm28IIaampseOHevTp8+2bdv++OOPBkbhcrmy8qvJ1NT0/v3727ZtO378uIWFRVhYWJ8+fRq4QmhWubm5wcHBYRHRHW2s+vfr6+zsTHUiAIAP0aAi5HAUnyFQ7fLlyxKJxMvLq3qkd+/e9vb2Fy826OoqgwcPHjxY0dl4hBBCbGxs9u7d25D1FBUVPX/+fOXKldUj3t7ePXv2VLiwQCAQi8Visbgha6aKQCCo98WnxO7fDv742+FSx8mVpv3UInIMT++0Y+VfOHG4TZs2VEeTJxaLhUKhmhqtzxSi7Te6mkAgkEgkeL80Ef0TVlVViUSi1vR+4XA49R7Ar5z9WLGxsYQQuW01JyengICAzMzMdu3aKeVZ6qWurq6hoWFoaFg9oqurW9d3VO0/qsn2YeiZ8OTpwC0Bt4qW3SHqmoQQCSH5rrOL4i6P8fr0we0rdDhppCapVErPl7GmlpKwRYSkOsX7tJSELSKkEleonCLMyckhhMgdSmpkZCSbUlkR6urq2trarlu3riELi8VidXV1+hzSopCGhoaGhgbVKeSt3/Jz0fwgWQtWE/cYk/LsckhIyMcff0xVMIXU1NSkUikNX8aa6PmNrqmqqkpDQwPvlyaif0LZH7I0D6n0l1E5pSoQCMh/Z7tX09XVJYTgss6tTFZWlkDHhGgb1p4q6jr+wvUQlScCAGgS5RShrAKLi9+5uqbsRHgdHR2lPAUDicViuZeUDoqKiqQ6ClqQEEJ0jXILihRPAQDQlXKK0NLSkhCSm5tbc1D2ealsChrlyrXrPQa4W/Qc6PTJLPOufTymzc7KyqI61Bvt2rUj+akKp1i5Lzq3t1JxHgCAJlLOJ/5OTk6EkDt37si+IISIxeKwsDA7O7uah65AQ+zZd3DjobOFPkcI782+1b+fXItwH3Pv6jlbW1tKoxFCiIGBgXUb3ZxXscTS4Z0JqdTo4eGpS3dTlAsA4AMpZ4tw7Nixurq6x48frz66OigoKC8vz8fHRynrZ46srKzvdh8snHe6ugUJIdLuIzMn7Jy5aBmFwWo68ut2k5PzSMaTt0NVAr0zX03+yKlbt27U5QIA+BAN3SKU3TW3pKSEEHL37l3ZQ09Pz5EjRxJCDA0NN27cuHLlyvHjx8+ZMyctLe3bb7+1srJavnx5syVvnQICzxU5z5I7IJMQQuwHJlxZX1xcbECDGyd17979dqD/9AVLs/hCsWkn9fICVk7yss/nrVz6JdXRAAAaraFFePPmTdkXdnZ2AoFA9rDmiYNff/21hobGtm3bvLy82Gz2iBEj/Pz8ZGdQQMM9jk8WmY5ROCU17ZiSktKrVy8VR1Koe/fu0WE3+Xx+dHS0jY2NtbU11YkAAD5QQ4swOTm53mWWLl26dOnSwsJCbW1tTc1a2zTQALo6WqSyTOEUS1Aud4IK5fT09BwdHfX09KgOAgDw4ZR/+QBDQ0O04AcbOXiAwfObCiaqBKysp3Z2dipPpFISiSQ5OfnVq1dUBwEABqH1dXQYaNSoUabZEayXD+XG9S5t+GLuLDabTUkqFSgqKvKaNd+8q5Pr7LV9p3xp1qnn8nUb6711MwBA09H6gkkMxGazb5w/OewT7+z2Q0s7uBOeOcmKNwr/Y1zfjutXtdojj/h8vvOQUSkDl1Wt/O9ewRLxvuCdkR7eIZfP0e3ipQDQymCLkHasra2fPrx70MdxrvD60Mjv15kmXt/ve+S3Xa24DzZu3Z7WZ3ZVH8+3Q2rsimEroolVwOkz1OUCAEbAFiEdaWho+Ezx9pnizefzmXAoSuDfV4Rf3K49XuK6cP+f3/p4e9WeAgBQFmwRAvUEYomCUycJISZ2aalpKo8DAMyCIgTqsSRViifKi3X1dFWbBQAYB0UI1OvaqRNJjao9rh53ebT7YNXnAQBGQREC9X75dp3R2a9I+bu3cMp92fbu7pVLP6coFAAwBQ6WAeo5Ojoe3PrNwq+Hlzh6VVr0IVUCvfQHvOc3LgQcwVX6AKC5oQiBFiZ+Mm7YkMFBQUH3ou7p6HFdRwwcNepbDodDdS4AaP1QhEAX+vr6U6dOnTqV6hwAwDDYRwgAAIyGIgQAAEZDEQIAAKNhHyG0WmlpabsPHP4nIrqstLRv716LZvn07duX6lAAQDvYIoTW6cy5C31Heu7I73x/6C+PvY7/wRk+csE3K/+3mepcAEA7KEJohVJSUhat+y7382sSp0mkjSXRaUO6DitY+Peh4KeB585TnQ4A6AVFCK3QT3v25w9dS7T03xllsYom/rTxx10UhQIAmkIRQisUFh4h7eSmYMLAPK+oROVxAIDWUITQClWJRIStoXBKSlrt/Y0B4MOgCKEV6ta1C0mPUTAhKNXh4EhpAHgHihBaoa8Xzm5z+0cilciNa9/aMX8WruEGAO9AEUIr5OLiMmfUAN7h6aQg/c1QRYlu0Gan8pgVi3FfJwB4Bz4mgtbpp+82DHIJ2rx9UVZOnkTK4ulqz5/ps/TzzWw2m+poAEAvKEJotT4ZN/aTcWPFYrFQKNTS0qI6DgDQFD4aBQAARkMRAgAAozHxo9GsrKyTpwNDH8Zoa3E/6ufo4+2lr69f/z8DAIDWiHFbhL8f+7On+7iVURrnbeedMPJacqugc7+P7oTepToXAABQg1lbhP/++++qnw8WLA0mGm8OnRB0GJDtPNXr/8ZFB19u164dtfEAAED1mLVF+PXmbQWTdlW34Bv6pvlD1/yway9FoQAAgErMKsIXKamkXbfa45Juw2+H3lN9HgAAoByzilBS1wWXNXUqKipVmwUAAGiBWUWopaFOhOUKJrIS7OzaqzwOAABQj1lFOGOKJzfsQO1xXuiuLz/DtZgBAJiIWUW4bsXSji+DuHf3E4n4zZCwXPfiN4OMxR6fjKc0GgAAUINZp09wudwHt6+s2ugb+MsAsbYhS1ylKan8Yu6Mr5f8QHU0AACgBrO2CAkhWlpae378PjP+0ZyRLj+umJcaG77qq8VqanR8HVJTU6dNm0Z1inp89tlniYmJVKd4n6CgoO+++47qFPVwc3OTSqVUp3ifLVu2nD9/nuoU7/PixYtPP/2U6hT1mDlzZnJyMtUp3ufixYvff/891Snq4ebmptwV0rEAVKOoqKi4uJjqFO9TVFSUmppKdYp6pKWlFRYWUp3ifV6/fp2VlUV1inrExcXRvAizs7NzcnKoTvE+LeL9kpqaSvP3S05ODv3fL48fP1buCplbhAAAAARFCAAADNeqDpaRSCQlJSWRkZENWTg3Nzc9Pb2BC1MiMTGxoqKCzgkJIeXl5fHx8erq9P1BSktLy8vLo/nLSAiJjIyk575qmby8vLS0NDq/jPHx8fR/v1RUVDx79ozFquPKHjSQlpaWn59P85eRENLwhJaWlqampu9fhkXzPRONcv369c8++6yB187Ozc3V1NSk8w2YRCJRVlaWtbU11UHeJz093dTUlMPhUB2kTqWlpeXl5SYmJlQHeZ8XL17Y2dlRneJ9cnJytLS09PT0qA5SJ5FIlJ2dbWVlRXWQ96H/+4XP51dUVND8/ZKcnNyhQ4cGLjx58uQ1a9a8f5lWVYQAAACNRd+PYgAAAFQARQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGj0PQ+6mbx8+TIiIiIiIuLly5cGBgYHDx6kOpG8e/fu/fXXX48ePcrJyeFwOPb29j4+Pj4+PrQ6CXf27NllZWU1R7S0tI4ePUpVHjkVFRWzZs1SOPXNN9/06tVLxXnqUlhY+MMPP1y5cqW0tLR9+/bz5s2bOpXK+2IWFRVFRERERkY+fvxYJBJt2rSpW7duNRcQiUQxMTGRkZGRkZFFRUVjx46t63VuJkKhsDpAcXGxh4fH9OnTay6Ql5e3Z8+eBw8epKenC4VCCwuLQYMGrVixgsfjqSzkq1evZL9knj9/LpVKT506JbfAH3/8cfXqVbnBVatW9e3bVzUJy8rKoqKiIiMjo6Ojy8vLFy1a5O7uXnOBnTt3/vPPP7X/oYuLy4oVK1SQsKqq6smTJ7Kfxry8PDc3tyVLltRexs/P76+//srJyTEyMpo0adLy5cs/7BxNxhVh7969ZdfaZrPZbdu2pTqOAmfOnAkICOjXr1+XLl0qKipu3Lhx8eLF+/fv7969m+pob124cIEQUvMccG1tberiyJNIJC9evJAbjIuLE4lEP/30EyWRaisoKBg4cGBiYqKnp6ednd2dO3emTZuWkJCwadMmqiKtWrVK9qchm80Wi8VffPGF3ALXrl0bP3589QKWlpYqThgUFOTp6VkdoPZVCJKTk7du3ers7NynTx91dfXo6GhfX9+AgIAHDx4YGhqqJuSwYcNkt2SRhay9wKNHj06fPt27d++a1xKS+8uyWe3evXvdunXVCUeNGiVXhDk5OXLvoOzs7IyMjM6dO6sm4aNHj/r161edsHa9SSQSb2/vc+fOubq6enl5PXv2bO3atSEhIUFBQWw2u9HPJ2WYnTt33rhxo6CgwMHBwdTUlOo4CuTm5orF4uqHxcXF3bp1Y7FYKSkpFKaSY2hoOHnyZKpTNMKrV6/YbPaIESOoDvLWsmXLCCF+fn6yh1VVVR4eHmw2++nTp1RFunjx4qlTp5KTk7/99ltCSEhIiNwCz549O3DgQGRkZEREBCFk2bJlKk745MmTgwcPRkVF3b9/nxCyevVquQXKysr4fH7NkZUrVxJCfvjhB5WF3L9//5UrV3JycoYPH67wd+yXX35JCKmoqFBZJDmhoaH+/v5Pnz49duwYIeT333+v95+MGzeOxWIlJSWpIJ5UKk1PT9+7d++DBw9SUlIIIdOnT5db4PTp04SQTz/9VCKRyEa2bt1KCDl8+PAHPB3jirAabYuwNtnfbnfu3KE6yFstrghltyQ8efIk1UHesre35/F4VVVV1SNhYWGEkFWrVlGYSqauIqwWExNDSRFWkzVx7SKsTXbLnkWLFqkglRzaFmG148ePN6QIs7Ky1NXVhw4dqppUNWVnZyssQtln8jExMdUjAoGAw+G4urp+wLMw7qPRligqKorL5Xbt2pXqIO8QiUSRkZElJSU2NjY0v06mVCo9cuRImzZtPDw8qM7yVm5uroWFRc2PcWTXlZXVISjLo0ePCCG9e/emOoi8lJSUjIwMQ0NDBwcHDQ0NquO8z+HDh6uqqubMmUN1kLdkd8eseSlmDodjZmYWHh4uFAobu6cQRUhTYWFhmZmZ2dnZV65cuX379t69e42NjakO9Y4LFy7I9hQSQhwdHffv3y/7TJ+GQkJCkpOTFy9ezOVyqc7yVtu2bTMzMyUSSfWOovT0dEIIze9g3iKkpqaGh4fz+fzo6Ojff//dw8NDxQf1NET1n7aGhobr169ftmwZrQ6Iq+nYsWMGBgYTJ06kOshbsiM80tPTqw+DEgqF2dnZIpEoLS3N3t6+UWtDEdLU1q1bL1++TAhhsViLFy/28vKiOtE7xo4d6+7u3rFjx9LS0hs3bvj5+Q0bNuzhw4ddunShOpoCv//+OyGEVn/PEkJGjhy5d+/eQ4cOzZ8/nxAikUh+/vlnQgifz6c6WosXGho6c+ZM2dcuLi7ffvstrW740LFjxy1btjg6Ourq6j5+/Pinn35asWKFSCRavXo11dEUCA0NjY+P//zzz2l1QNzIkSP9/f1//vnnw4cPy/6A2L17t1AoJB/2DmrKp7ctGs33EfL5/Ly8vNjY2K1bt2ppaTk4ONBhj0JdZLvcZ82aRXUQBYqKirS1tfv06UN1EHmZmZmWlpZqamre3t5r167t378/j8czMTHh8XhUR2vx+wgFAkFBQcGLFy8CAwO7du2qpaUVGhqq4oTSuvcRysnOzjY2NtbV1VX9e7wh+whlG9MREREqS1VTXfsIRSLR0KFDCSGDBg1at27dhAkT1NTUZBuCcXFxjX0WnFBPU7q6ukZGRj169FizZs33338fGxsr+5Glp+nTp+vo6MgO5KObEydOlJeX021zkBBibm7+8OHDL7744unTp2fOnLG2tv7nn38qKysbeENNeA8Oh2NoaNi+fXtPT8/r16/LzomkOlSdTE1NPTw8SktL4+LiqM4ir7S0NDAw0MHBwcnJieos71BXVw8KCtqyZYtAIDh58mRpaWlQUJC9vT2LxfqAdxA+Gm0BBg4cSAiJj4+nOkid1NTUtLW1ZZ9L0M3vv//O5XKnTZtGdRAFzMzMap4empSUVFJSMmDAAAojtT6WlpbW1tZ0fvsQQnR0dAghAoGA6iDyTpw4UVpaOm/ePKqDKMDlcteuXbt27VrZQ4lEMmfOnM6dO3/ACaPYImwBoqOjCSHm5uZUB6lTeHh4bm4u3Y5rJYTExsZGRkZ6enqq7GTqpti1axch5LPPPqM6SKuSn5+fnp5O57ePUCi8ceOGmpqayk5Xb7g//viDw+HQ8+9IOadOncrKyvqwtw/jtgiTk5OLiooIIRUVFbITAAghurq69PkRXLJkiY+PT69evXR0dPh8/rlz51avXq2tre3t7U11tDcCAwOLiopGjx5tbm4uFApv3rwpOy+q9oVIKHfo0CFCv8NkZAoKCq5evTpmzBgej1dQULBr1y4/P7+pU6e6ublRGOnly5eEkMzMTEJIYmKirq4uIcTBwUF2sIlEIpGdjfD8+XNCyOvXr2XvICsrKxMTExUkFIvFsr8Lnz17RgjJzs6WBbC2tpYdVr1v3z4ej+fu7m5qaioSiaKiopYtWyYSiWbPnq2CeDKpqal5eXmEkJKSEkKILKGmpmaPHj1kmXft2jV9+vSOHTtyOJzExMQ1a9Y8ffp02rRpKrvWVVlZmWwTWfbtTk1NlYXs1KmTnp5e9WJPnjx58OCBt7c3JRfhevTokUQiKSgoIIQUFBTIEpqbm1d/8nn06NGhQ4daWVlVVlaePn36iy++6Ny5c+0rsTWIkvZothgKzyQbOHAg1bneqj4auPoYLTMzs+vXr1Od6y1fX19ZME1NTdmh/1wud9euXVTnkicQCNq2bWtra1vzSj30UX0Jq+pv9LRp06g9JKqu/dDp6emyBUpLSxUusGfPHtUkLCwsVBhg3759sgUWLVokG+FyubIfTnV19dWrV1dff0QFZIcBy+nQoYNsVtY91SFlX4wbN66kpERlCevanS93eJTs4kfXrl1TWbCaZB8Xy9mwYUP1ArJGrP5GOzs7p6WlfdhzsaRSqcJXpLWKiYnJzc2VGzQwMHB2dqYkT22lpaWhoaGJiYl5eXlmZmb29vZDhgyh1QlwIpEoIiIiKioqJyeHxWLZ2dmNHj2abqc5EkL4fP6DBw/Mzc27d+9OdRYFZFtX//zzT3Z2tpGR0bBhwyi/Gnh2drbC4zUGDRqkqalJCBGLxcHBwbUX6Ny5s5WVVbPnI6SqqiokJKT2eNeuXS0sLMh/r+rDhw+zsrJ0dHRsbGzc3NxkUyrz7NmzjIwMuUEtLS1XV1fZ18nJyffv309NTS0rKzM3N3dzc1Px+f7FxcUPHz6sPe7k5FRzJ0J4eHhJScnQoUNrXhNVZYKDg2tfqbV9+/YdOnSQff3ixYvbt2+np6dzOBwXF5em5GRcEQIAANSEg2UAAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGj/DzPErOTCUaTyAAAAAElFTkSuQmCC",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 20\n",
"x = LinRange(-1, 1, a)\n",
"A = vander(x)\n",
"Q, _ = gram_schmidt_classical(A)\n",
"\n",
"v = Q[:, end]\n",
"@show norm(v)\n",
"# Note, if v is actually orthogonal, these should be 0\n",
"scatter(abs.(Q[:, 1:end-1]' * v), yscale=:log10, xticks=range(1, a-1; step=2), label=\"\\$v \\\\cdot Q_{:, j}\\$\")"
]
},
{
"cell_type": "markdown",
"id": "5f989fa9-8cb8-4f7b-9c44-9aa408f63a2a",
"metadata": {},
"source": [
"Let's compare with our naive implemenation."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f5a5665d-3bc5-4dff-8fa3-4d7a31b9c72b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"norm(v) = 1.0\n"
]
},
{
"data": {
"image/png": "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",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 20\n",
"x = LinRange(-1, 1, a)\n",
"A = vander(x)\n",
"Q, _ = gram_schmidt_naive(A)\n",
"\n",
"v = Q[:, end]\n",
"@show norm(v)\n",
"# Note, if v is actually orthogonal, these should be 0\n",
"scatter(abs.(Q[:, 1:end-1]' * v), yscale=:log10, xticks=range(1, a-1; step=2), label=\"\\$v \\\\cdot Q_{:, j}\\$\")"
]
},
{
"cell_type": "markdown",
"id": "1acda727-eea0-4502-8564-4a5fd702957d",
"metadata": {},
"source": [
"Note that the original column started almost linearly dependent to the previous columns."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "36e5203c-3c71-48d5-941d-ffbd528bd974",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"norm(v) = 1.4245900685395503\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3deUCM+eMH8M80M9136ZASIlcSEqqlaB0hcuU+17FuWeK7LLvuY13LOorFkit3iEVi2dIhR4XSqdJ9H3P+/hi/ZBpENc8zPe/XX/X5PD3z3lnTu+dmicViAgAAwFRKVAcAAACgEooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoClOEAoGA6ggAANAIKUARXrx4sVWrVlwu19jYeNeuXVTHAQCARoXuRRgZGTl69GgPD4+4uLhVq1YtWbLk1KlTVIcCAIDGg0XzW6xNmDAhKirq+fPnLBaLEOLl5fXy5cuoqCiZCyclJV2+fHnBggW1WbNQKFRSUpKslrb4fD6Xy6U6xefQP6FYLBaJRGw2m+ogn0P/txGfl3pB/4TM/LzQfYvwv//+GzhwYNXHb9CgQU+ePCkvL5e58OvXr69evVrLNfP5fKFQWD8pG0xFRQXVEb6A/glFIhGPx6M6xRfQ/23k8Xj4vNQd/RMKhUIGfl7oXoQZGRlmZmZV30q+Tk9Ppy4RAAA0KrQuwsrKyrKyMg0NjaoRTU1NQkh+fj51oQAAoFGhdRGqqKhoa2sXFhZWjRQUFBBCjIyMqAsFAACNCofqAB9JSUnJzMw0MzOr2h1qZmaWlJRUtUBSUhKbzTYxMaEmHwAANDry2CJ88ODBnDlzunfvrqqqymKxLly4UHOZtLQ0FxeX5s2bOzg4mJubu7u7Z2dnE0JcXV2vXr1aWVkpWSwgIMDZ2VlZWVkOsb+WQCCg7ZHwlJSUkZNnmne0N27Xzbyj/fAJ0xMTE6kOBQBAC/IowitXrvj5+QkEAhsbG5kLCASCwYMHh4WFHThwIDo6eseOHf/884+np6dYLF66dGlRUdHIkSPPnz8/Z86cu3fvrlmzRg6Zv8qBw39ZdXFs1tmpefd+5h3tF69YTatGfPr0aXe3oecNhqctepjl/Sht0cNLJl49BniGR0RQHQ0AgHryKEJvb+/i4uLIyMjJkyfLXMDf3z86Onr16tUzZ87s1KnTwoULvb29Hzx4cO3aNUtLy3v37rHZbB8fn/j4+MDAwN69e8shc+1NmjV/2an/EqZeerfoftaCu2nz7+1/a9jdZcCnrvGQM7FYPGLyrHeTTorb9/sw2LZP1tQzo6bOEYlEFGYDAKADeRwj/OK5LZKdpV5eXlUjY8eO3bhxY0BAgLu7e6dOnS5evFibFyopKUlKStqwYYPkWyUlJU9PzxYtWshcmM/ni8XiOt5P4N69e1efZxRN9f8wxOZWfDfntVCwZuPWdatW1GXlkpB8Pr8ua4iKiirQsyLGraUnDC2LTWz//fffHj161GX9dU9YJTw8fN9f/k+ex6ioqHS3s1k4c2rLli3rvlqhUMjn8zkceh0Ol1KPb2MDkcSj+f03FOJtpHlCgUDQyD4vHA7nizeCoMV/bXR0dNOmTZs3b141YmNjo6mp+fTp069aj+TdycvLqxopKCj41FXAQqGQxWLV8U4Zuw+fyO+zpOZ4hfNM/z9c1q5cVpeVE0KEQmEdr2J++fJlsbHsPdIFRjaxcXH29vZ1WX/dE0r8/NumIzce5rn8RMasIoLKyMSwM8MnbV4+f/yYkXVcs/D/1T1kw1GIhPS/s4xCvI0KkVAhQtZyYTabrRhFmJGR0bq19CaLgYFBRkbGV61HT0+vdevW27Ztq+XyHA6njn/4xL9JJI7tZK1apVIoVlFRqeMvDj6fr6qqWpc1qKurswWVMqc4wkpNDcM6rr/uCQkhl65c9bv7vGD2VfL/b5fYdkhuW9flm/s79+zepk2buqxc8hu87iEbVL28jQ1KLBZzuVz6byjQ/G2kf0KBQMBms2kest7fRlr8s66oqJBcKV+dtrZ2amoqJXlqT1VVlfDKiIp0eEIIi4jp8Odz165dNTYeKCM+Nae0E0O6dq3tHw0N6pctuwqGHSRSb5eKRu73qzbu/PPIvh0U5QL4dnFxcR4eHlLPjxOLafFr4fNoG5LNZv/55599+/at9zXToghVVVWLioqkBgsKCtTV1SnJU3t9nXo+jb0t7D5WeiInqWkTAyoSSbO0tOxoqh0SfUVoO6T6ODsmqLU2sba2pipYde9y84l+MxkTrZ3+O7pV7nEA6kFGRoa+vv6JEyeoDtJ4rFixooGu+6JFETZt2jQ3N1dqMC8vr107WXsd6cR73qxjvQdkWbsQnWrX+Av5egELN2+o6wHC+nL+uO93A4clpYQWd/IkhpYkN1nz2SXztyGXrsm4oJMSnzwFg82h+bEKgM9QU1OrlxO+QEJbW7uB1kyLW6zZ2dllZGRUr/ro6OjS0tLOnTtTmKo2TExMzhzaY3JwiHLwXpIUQdJjWGGnDHf3/d+kIW5u/b7883Khq6sbef+fvWM6e6Yc7nx+0vBkvz3D20X/e8fQ0JDqaO9pq6uRsgIZE6nR7du1lXucz8nIyLh27dqRI0cePnxIq6tFAeCb0WKL0NPT89y5c/7+/itXrpSMSPYnjBxZ1zMG5aD3d86xocHHTviHPP6rrLzCwbb9RJ8TdPszkMPhTBw3duK4Grtw6WHe9In/u76lxGPDR6Nikd7NDUt3rqQolLSKioqpcxffjoipaPVdmVoT3XMnufE/7trwy+gRw6mOBgB1Io8ifPny5ZEjRwghkZGRhJDjx4+HhoYSQhYtWiS5a+jo0aO3b9/+66+/qqmp9ezZ886dOzt27HB1df3+++/lEK/udHV1F8ydU6vHAYMsc2fNuBI0NvSST3Hfn4imASGE5KboXvaZ4tbNydGR6nTvDR8/7a66Q+W83ZJvcwkh5YVz1nlpaqgPGtCf0mgAUCfyKMLU1NSDBw9KvtbT0wsODg4ODiaETJw4UVKEbDb76tWrM2bMWLp0qeThyMOHDz9w4AA9z1yCesdms29ePL3f9/Affl55hcVKSkpNjY1+WTl3sPsgqqO99/jx48fv+JVTfvxoVE0nb+Jf831GoQgBFJo8irBfv37VL3KXycTE5OrVqzk5OZIn8err68shGNAHi8Wa88P0OT9MpzqIbOevBuV1Gi1jQtu4REUvPT29adOmcg8FAPWDFscIqxgaGtLnDA6AKqnvssW6zjKnxNrG2dnZKEIAxUWLs0YBaM6yqTEr/63MKVZBOh6QCaDQUIQAXzbKw93gib+Mibw0XXGpsbGx3BMBQL1BEQJ8ma2tbZ+2Juo3NpDq1/4XvdM/PvHA9g2f/jkAUAD0OkYIQFv+fn8u9Fl1doejqEWPCo0mGjmvlTNf+O3a0qf3d1RHA6BGeHj4P//8o6Kikp6e3rZt24kTJyorK1Md6lugCAFqhcPh7N22cePqFc+ePcvOzm7TZqS1tTWbzaY610fKy8t/2/L7uSs3isvKuUqsju3bbV71k42N7OdwAXyz+Ph4b29vV1fXhQsXqqmpEUJ+//13BweHoKCgLz6AloZQhABfQVtb25E21/hLKSgo6NHXPan9qMppV4myOiEkNTEszGvm/nXLRw4fRnU6aDxCQkImTJhw/vz5bt26VQ0uWbLk/v3706ZNu3r1KoXZvg2KEKCR+GHRsvju84Rdq92YsEX33NlX5vq4uXznbGBAi8ehQO3FxcXFx8eXlJSYmJjY2NjQ5P9gbGzskCFDfH19q7egxKhRo8aPHx8fH29lZUVJtm+Gk2UAGoOKioqQ0MiPWlBCTaeg+xT/M+eoCAXforKy8vfff7do0apdu3ZDhgwZO3asi4uLsbFJX7fvHzx4QG02kUg0ceLE7t27jxo1quashYUFIeTJkydyz1VXKEKAxiA5OZmYyH66JM+sc9jTWDnngW8THx9vY2v303KfVDNnsiiQbE0mu3PI+hjh+D0hCXnOzs7z58+XethvLV26dOnQoUNeXl48Ho8QEhkZ2aFDh7dvZV8d+ynnz5+PiIhYuHChzNni4mJCCJ/P/4Z41MKuUYDGgMPhsISf+AUkEnA5+KQrgMTERIeejkXKeqJV4aRptaexqmkTIyuB0zRy7+C+/d5Z2Tmn/E9+1a2YX79+XV5ePnXq1CVLlsTFxXXq1ElfX//t27cJCQlmZma1X8/Ro0e1tbX795d9c92nT58SQiwtLWu/QprAFiFAY9C8eXNx5ksikvEcY/U3D3o72Mk/EnwVoVA4dJhnEUdbsOzeRy1YhcUifWaJZp44e/bM7t27v2rlQUFBnp6eDx8+VFJSsra2JoRYWlpOmDCh5gPjgoOD79+//6n1PHjwwMHBgcvlypy9c+eOrq5uzWOH9IciBGgMOBzOWM+hand3Sk/kpui9uDjSEw9NpLujR48+fxYtmH6caHz2kQN2HuLvZq76ZW1+fn7tVz5v3jxlZeXTp0+PGDFCRUVFMmhiYtKsWTOpJceMGfPjjz/WWAEhhFRUVBQUFLRq1UrmbGpq6u3bt2fMmPGpmqQzFCFAI7H1t9U9S8J1zswjKVFEUEnyUjn/HTc5MvLi377q6upUp4Mv2H/QV6nTIGLZ9cuLDl5ZUlIcEBDwVesXi8Xnzp3z9PSs+lbmxe8XLlzw9fWVuQYVFRVVVdVP9dy2bduaNGlS9XB1xYIjBwCNBJfL/efy2fMXLh47fzAmMNbY2KRPz26LNt3CE13or6CgIPxxqHjywVotrWOiZNXzRlDQjBkzav8Sb9++zcrK6tWrl+TbGzduuLm51VysaoGaWCyWi4tLXFwcIUQsFvv7+xcVFbm5ubVq1erevXu+vr5BQUF6enq1j0QfKEKAxoPFYo3wHD4CO0IVTWpqqlgkIsZtarm80Ng6/s3XXaWgrKyspKSkqalJCCktLX327NnAgQO/NufatWv79Onz4sWLuLg4JycnCwuLnTt39urVa9asWYGBgU5OTl+7QppAEQIAUKyiooIQQriqtf0BrmpZeflXvYSRkdGiRYtWrlzp5ub25MmTTx0I/Dx7e/uAgIAZM2ZYWlo6ODhERERcunTp5cuXd+/eNTU1LSkpkRStwsExQgCgQEpKyqtXr4RCGae5MpCpqSkhhHzimZc1sfJTLcy++lnQ27dv9/Hxadmy5fLly7W0tL72xyUGDBgQHBw8c+bM+/fvV1RUsFisDRs2mJqaFhYWbtu27dvWKWXYsGGpqan1sqpawhYhAMgPj8fzWbP+xLkLLCMrMUdFnPmyVxdbvz3baHL/MKqYmZk1NW+eHnub2Lp/eWkhn/0qxMl7wTe8kKGhYd2PGauoqLi4uEi+FovFy5Yt69ev37Zt2w4dOlTHNUv4+vrK+cA2tggBQE7EYvH3w8bsT1TLWhr2bsrprAnHspeGXjUcau8ysLCwkOp0VGKxWOPGjOKEniCleV9e+uFxYVnh6NGjGz7Xl1lZWfn6+np5eQ0aNKhz584ylxFXf4rnlyQlJenq6tZTutpCEQKAnARcuPhE3LS8rzdR+vD4KmGnwWkOc1b+uonCYHSwbNkyFZaQdWrxF5bLS+NcWu01xqt9+/ZyyfUF27Zt279//927d9euXStzgfDw8JqX7X/K8ePHs7Ky5syZU38BawVFCABysv/vs4U9Z9Yc53cbc/nGLfnnoZUmTZoc9j1EQk+RU94y7xBECCE5SZw9g011NXbv3iXfdJ+ko6Mza9asPn36fGoBW1vbWj6YKTIysnfv3lpaWrm5ufWWr3ZQhAAgJynJKaSJrI0DNpcnknsa+hk9evS+ffvYwX9ytvQmsbc/qsOyAnJzB2e9g7kK/1bQdQW6NpTL5Xbo0KE2S3bp0sXCwiI4OPi7775r6FRScLIMAMiJlrYWKSsgOiY1p5QImpAQQmbPnm1jYzN/0eKo3wdytJuITdsJ1XS4RRnClGgWITNn/rBu3ToFvWi9lu7evSv/29NgixAA5MS9b2/us0AZE6nRbVq2kHscmnJ0dIwIC3306JHPglljujYb1FQ4ycV2757dKclJe/fuVbgWjI6O7t69u9TggwcPag4SQsRi8bNnzzp16iSXaB9gixAA5GTJvNl+PVzSrZyJSbVbqJQXGgQs2HHsD+py0Q6LxerRo0ePHj2oDlIP2rRps2XLFqlBW1vbkSNHlpaWamhoVB+PiYlp27atkpK8t9BQhAAgJ7q6ukHnjg8eOyXf8rsicweirKb29olW9Lk/t67r0qUL1emgQaipqdU8lUZLS6tdu3bVW/DkyZP9+/cPCAjw8vKSaz5CCIoQAOSpY8eOryMf3rx587/Ip8Vl5b1GdRzgd19bW5vqXCBXZWVlUrdQuHHjBo/H09XVHTNmjPzzoAgBQK64XK67u7u7ey1uoQKNlLq6utRjLo4dO0ZVGIKTZQAAgOFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1njQIASAsNDb1x515MfHL7Vs37u37XOK5th09BEQIAfFBZWTnUa3JEjji3w3Bi4kRSUvYs22mnJ7py+piqqirV6aBBYNcoAMAHk2YvCNF2yp38N+k2grSwJ91G5E46/kCv98TZ3/JEeFAIKEIAgPcyMjLuRsRUOM+SGq9wmhkcFZeenk5JKmhoKEIAgPcePXpUau0mc6qsjdujR4/knAfkA8cIAQDeKykp4StryZyqVNEuKSmp/ao4HE54eHi3bt2qD4rFYhaLVaeIDY+2IZOTkx0dHRtizShCAID3LC0ttXIf5cma0sl91aLFV9wP2tHRMTg4WCwWVx8sKytTV1evW8aGJRQKBQKBiooK1UFkq+XD7r8WihAA4L1evXqpJi8kxdlEq8lHEyU5qokPe/bcWftVKSkp1Xy2VHFxsZaW7C1OmhAIBHw+X01NjeogcoVjhAAA73E4HL9dWwx8R5CshA+jWQn6hzwP7drM5XKpiwYNCFuEAAAfDPje7eph7Vnec98VlBIdU1KYYayrud9vR09cU994oQgBAD7Sw8Eh+sFtPp+fkZFhamqKDcFGD0UIACADl8u1sLCgOgXIA44RAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBABQSn8+PjY198+aN1MOe4GvhFmsAAAomOzt76jzvsKcxLNN2LEGlOPPlKA/37et+oe1zBGkORQgAoEgKCgq6uw5K7fuz0M3v/ZBY5Bf8x5MhI+8HXabnw+VpDrtGAQAUyf9+2/y2x1xhx0EfhlhKFS4LnnFanD57jrpcCgxFCACgSC7fuMXvNrrmeFHPHw6eCJB/nkYARQgAoEh4IkLYsh6R2KRlamqq3OM0BihCAABFoiQSyJ4oy9fS1pJvlkYCRQgAoEjaWbchyZE1x7lPrwzu10fucRoDFCEAgCLZ8dv/DM4vJKV5H41mvmzy38El82ZTFEqx4fIJAABFYmtr+9e2NTMWfV/ScVipqS0R8HTfhuol/3v1/AldXV2q0ykkFCEAgIIZPHBAvLNTUFBQWPQLdTWVnp4DXV23cjj4ff6N8MYBACgeTU3NESNGjBgxguogjQGOEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAKD+RUVF9RvmZd7B3qR9t1Z2vZasWF1SUkJ1KNk4VAcAAIDG5tTZgHlrf88dsYsMtiWEEAFv73/Hrjj1++92oIGBAdXppGGLEAAA6lNOTs7CVetzZ18h5rbvhzjKPKcZiU5Lpy/4idJosqEIAQCgPp06G1BgP5moakmNCzt7PHryvLy8nJJUn4EiBACA+vT4WRzPzFb2nLF1UlKSXNPUAooQAADqkzKXQwQ8mVMsIY/L5co5zxehCAEAoD659OiqkfhAxoRIIM6Is7S0lHegL0ERAgBAfRo+zEMv9irJfiM1rvbP9gkjh3E4tLtagXaBAABAoampqV31PzJwjFdujx94bVyJthHJiNP9z7e7dtmmtcepTicDihAAAOqZra3ti0d39h46fPvfNdlZ79q1bTt58YjBg92pziUbihAAAOqfnp7ez8u8f6Y6Rm3gGCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAABgNBQhAAAwGo2KUCgU5ufn83i8mlO5ublhYWFpaWnyTwUAAI0bLYrw+PHjzs7OOjo6+vr6Fy9elJpdt26dqampq6urhYXFlClThEIhJSEBAKBRokURFhUVOTo67tq1q+bUtWvXVq9e7efnV1xcfP/+/XPnzm3fvl3+CQEAoLGiRRHOnTt306ZNw4YNqzn1559/9urVa+LEiSwWy9HRceLEiX/++af8EwIAQGNFiyL8jKdPn/bp06fqW1dX16SkpKKiIuoSAQBAo0LrIhSLxZmZmUZGRlUjkq/T09OpCwUAAI0Kp6FfYO3atS9fvpQ55ePj06lTp8/8LJ/P5/P5KioqVSOSr8vKyuo3JAAAMFaDF6GhoeGn9mRWbziZlJWV9fX18/LyqkZyc3MJIaampvWYEAAAmOzrijAxMTEvL8/Q0LB58+Y1Z0Ui0cOHD+Pi4jQ0NPr27SvZjTl37ty65LOwsIiNja36NjY2VlVVtfrOUgAAgLqo1THCly9f9u/f39DQsGXLlt26dduwYUPNZfLz83v37u3s7Dxnzpxx48ZZWloeO3as7vmGDh0aGBiYlZVFCOHxeCdOnHB3d2ez2XVfMwAAAKllEaanp8fHx7u6unp7e39qmR9++OHhw4e+vr6VlZVpaWl2dnbTp0+PioqqzfoDAwPd3NxGjBhBCFm3bp2bm9u6deskU4sWLdLX13dxcfn555/79u2blJS0fv362qwTAACgNmq1a9TFxSUhIYEQkpCQIPN69ri4uPPnz48aNWr69OmEEDMzs8OHD7dt23bLli3+/v5fXL+ZmVm/fv0IIQMHDpSMtG3bVvKFrq5uaGjoH3/8ERMT07Nnz2PHjrVo0aJ2/2kAAABfVj8ny1y/fl0sFg8fPrxqxNraukOHDteuXROLxSwW6/M/3rlz586dO39qVl9ff/Xq1bWJkZOT8/TpU8mWJSFESUlp7ty53bt3l7lwRUUFh8PhcBr8dKG6KC8vp/l+YPonFAqFPB5PLBZTHeRz6P82lpeXc7lcfF7qiP4JBQIBn8+n5+clIyNj1cbtD8PCy3gCdWVOT/uu61Yu/eK5k6qqqkpKX9j3WT//rGNiYgghNjY21Qc7der04sWLtLQ0c3PzenmVL9LU1DQyMho9enTVSKtWrT51bqpYLKZ/EfJ4vC+eW0st+icUCoUsFovmIen/NopEIvoXIf3fRvonZLPZSkpKNAwZExPz/ciJ7/qvEc/7nSixiUiY8vxG8KARN88db9++/Wd+8ItbYqS+ijAnJ4cQYmhoWH3QwMBAMiW3IlRVVTUxMRkzZkxtFmb/v4ZOVRdIWC/oH1JREipESKpTfA79E4rFYpFIRLeQYrF4xORZmRP/JibW74eU2OJO7plNWo2YPOtlxL+1abvPqJ87y0ienaSqqlp9UE1NjRBSWVlZLy8BAADMFBkZma/X+kMLVjFtm69rVcuzMj+jfopQQ0ODEJKfn199UPKtpqZmvbwEAAAwU2xsbJGJrcypIhPb6teaf5v6KULJ9fXv3r2rPvju3TsWi2VhYVEvLwEAAMzE4XCUhHyZU0oiQd0PXddPEUrOzLxz507VCJ/PDwkJadu2rba2dr28BAAAMJOdnZ1W0gOZU1pJD+zs7Oq4/vopwoEDB+rr6x87dqyiokIycvr06cLCwvHjx9fL+gEAgLGsra1baoqUYm9LjSvF3m6lKWrTpk0d11/bLUo3NzdCSHl5Ofn/G8EQQmbMmCE5RVNTU3PLli0zZszo3bv3hAkTUlNT9+zZ065duwULFtQxHwAAwOWTR5wGeLxNCSvrNJwYWpLcZPXo883e3Lh0/WLdV/51u1bV1NQkt4Cpafr06Zqamps2bVq6dKmWlpaXl9fmzZu1tLTqHhEAABjOyMjo2aNg37+OXbq5OTExsWXLlkPdvpsx5W69XPLIoucdBL7NrVu3tm7devPmzdosrBB3likuLqb5HxP0Tyi5s4zkYh7aov/bqBB3lqH/20j/hJI7yzDt80LrJ9QDAAA0NBQhAAAwGooQAAAYDUUIAACMhiIEAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKOhCAEAgNFQhAAAwGgoQgAAYDQUIQAAMBqKEAAAGA1FCAAAjIYiBAAARkMRAgAAo6EIAQCA0VCEAADAaChCAAAgp88F2D+9ibAAABmWSURBVPRyNe/Uw7Lrd1ZdHDdu3ykQCKgOJSccqgMAAADFfvT28Y94WzDyGNE2JoRkVZauv7Pj6o1hwdcucLlcqtM1OGwRAgAw2v0HD079G1sw3k/SgoQQoqJROvDnaO2u2/fsozSanKAIAQAYbfv+v/L7LiMsltR4qeuiQ8dOURJJzlCEAACMFvfyFWlmI2NCRbOUx5d7HAqgCAEAGI3L5RB+pew5sVi+WaiBIgQAYDQnB3vWy3syJvJSTZroyz0OBVCEAACMtnzhHIPbG0l54UejYpHe+SXrli+mKJRcoQgBABjN0tLy0Na1Tfb2Z4f5k+w3JP8teXrNYO+A+UMdB7sPojqdPOA6QgAAphs2ZLB9F7s/Dx+7/3BVZWWlvW3Hmcd329jIOoOmMUIRAgAAMTMzW7dqhUAg4PP5ampqVMeRK+waBQAARkMRAgAAo6EIAQCA0VCEAADyIBaL09LSysrKqA4C0nCyDABAw0pOTp46b2lMQpJYtymrNF+dxf/NZ/F4r9FU54L3UIQAAA0oISHByX3ku2E7xB6O74fK8uftmReflPKLz1JKo8F72DUKANCAJs/1zhyxV2zl+GFIXa9g8rE/TlxMSkqiLBZUgyIEAGgoRUVFr9NzSAt76Qkldn73qf7nLlARCqShCAFA4YnF4jdv3oSFheXn51Od5SOpqamkSUuZU0KjNs9fJ8o5D8iEY4QAoMDEYvGm33fvOuBHTNryNZtwMjcYcgV/799pZ2dHdTRCCNHQ0CDlRbLnKop0tTTlGwdkQxECgAKb673i75ji4iWPCEdZMpL17nX/cZNu+vt27tyZ2myEkObNm7PzkkhlKVHRkJrSibsxaN4ASlKBFOwaBQBF9fLly7PB4cUjdlS1ICGEGLfOHv/XlPm0OCGTxWL5LPxR54I3EYuqjyvFP2ia+2TgwIFUBYPqsEUIAIrqVMClvK6TCIslPWFinVkqys3NNTAwoCLXRxbMmZnyNv3oHre8bpNExtakJFfnzZ2mWVH/XDqtpIRNEVrA/wYAUFSvU96KDC1lTon0LdLT0+Ub55O2rVvzMMBvW+eKkZknluk985838HnovaZNm1KdC97DFiEAKKomejqkJE/mlFJpnq6urpzzfEbr1q0Xt249o7hYS0uL6iwgDVuEAKCoPPq76sVclDFRlq9c9Nbc3FzuiUAhoQgBQFH16dOnDcniRH18WbqgUtd/9sZVyykKBYoHu0YBQIEFnfcf4jU5NvpMQUsXgZaxelasxrMLK+fPwi2tofZQhACgwHR0dEKuX4yOjg4Ne/w6+XkPV5s++3+kw8mioEBQhACg8GxtbW1tbYtxKgp8ExwjBIAvy87OLiwspDoFQIPAFiEAfFJJScmC5auu3w4WaZsQAY9bUTBz0tj//bSYzWZTHQ2g3qAIAUC20tJS+z7939hN53lvIiwlQggRVG4J2vTfmInXzp2kOh1AvcGuUQCQ7dfNvye29+I5THzfgoQQjkqp+y+PCtUvXb5CaTSA+oQiBADZTl24Utlras3xAqd5e4+ekn8egAaCIgQA2SqFIsJRkTFh3DoxMUneaQAaDIoQAGRjiYSyJyqK1TXU5ZsFoAGhCAFAtpaWzcnbFzXH2S+Cvu/tJP88AA0ERQgAsv2+doVBwEJSWfrRaF6a4b3ff1owh6JQAPUPl08AgGwODg6/+/y49FfX/G6TBc06E36FWkqY3rPz5/8+ZGRkRHU6gHqDIgSAT5o0bsyAfi7nL14KCT+rqa7eZ7jdsKP/qqvjACE0KihCAPgcIyOj2TN/mDyxnMvlcjj4jQGNEI4RAgAAo6EIAQCA0VCEAADAaChCAIrl5eVFRUXl5uZSHQSAoXDoG4AygddvzPP5pVxZR6DfgpOXpFqRv2fTmiHug6jOBcAsKEIAapw+d/7H9XvzJgcQbeP3Q8VZk1dN2VNcOt5rFKXRAJgFu0YBKMDj8Rb979e8aWc+tCAhRMsof9pp71/WVVZWUhcNgHFQhAAU+PfffyutviNq2tITqlqVbfrev3+filAADIUiBKBAWlpaiW4LmVPFui1SU1PlnAeAyVCEABTQ1tZWqciXOaVakaerqyvnPABMhiIEoICjo6Nq7A0iFktPiMVqMdcdHR2pCAXAUChCAAoYGhp6ft9H48Z6qXH1m5s8XB3xbAcAecLlEwDU2Ld9Y/mPi67vG1DYwYOvb8nJT9F9ccnNrvX+HbupjgbALChCAGqw2exjB/bEx8cH3wt5Evuoc+/WvVfta926NdW5ABgHRQhAJSsrKysrq+LiYi0tLaqzADAUjhECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAarctXA7v07m9u49Cii7N1N+dtu/4QCoVUhwIA2sHlE9A4Lf15rd/d5wUe+4l+M0LIu4riNXd2XLo2/M7VAC6XS3U6AKARbBFCIxQaGnrkxn8FU/6WtCAhhKhqlQ5aHaXZefuefZRGAwDaQRFCI7T9wF95/ZYTlvQ/71LXJQeP+lMSCQBoC0UIjdCLmFhibitjQkWjlCeQexwAoDUUITRCHC6XCHgyp1ikxpOPAIDZUITQCDl178Z6dV/GREGGoZ623OMAAK2hCKER+mn+LIPbG0l50UejYrHuhaVrf1pIUSgAoCkUITRClpaW+zf90mRff6XwsyQ3hZTkkph/9PcP/qFvxxHDh1GdDgDoBdcRQuM0YthQ+y6d9xw88ij4XHFJSfcutrMPbuzatSvVuQCAdlCE0GhZWFhsXfeLUCjk8XhqampUxwEAmsKuUQAAYDQUIQAAMBqKEAAAGA1FCHVSUFAgEOBeLQCgwFCE8C3evXs3YuIM03Zdug2b2szWsb1Dn0tXA6kOBQDwLXDWKHy1tLS0Ht8PzXD7ReT9p2TkXWHm1N/mLn/9Zvni+dRmAwD4WtgihK82dd7S9EGbRTaDPgzpmORPO7XN72RKSgp1uQAAvgWKEL5OaWnp0/gkcds+0hNsbr7DjBNnAijIBABQB0wswsDAa32HjbW2/87a3tlj/PSwsDCqEymStLQ00qSVzCmhSdvouAQ55wEAqCNmHSMUi8WTZy+4Epdf0G8lcW9DRMI3KVEPZq9cPmnYskXzqE6nGNTU1Fi8UtlzlaVaGriBCwAoGGZtER4/eepyQlnBxCPEtC1hKRE2l7Tonjfr8uYj56KioqhOpxjMzc2VcpIIv7zmlNarfwZ811P+kQAA6oJZRbjlj4OFg9ZKj7K5ef1Xb9pzkIpEiofFYi3+cYbWRR8i/vgJtylRRsn3hg4dQlEuAIBvxKxdo7mFxUTbWMZEC/snd36RexxFtXTB3DdJPmf3D861n0aatidF7zTfhDSJD7p16TSXy6U6HQDA12FWEUpvxFTHkmMMBcdisf7csXl2dPS5y9ceRV22bGbWd3S3EZ6rlJWVqY4GAPDVmFWE+jpamUXvZGwUJj7ubNORikQKzNbW1tbWtri4WEtLi+osAADfjlnHCJfPn6UduFp6VMjXD/rVZ/5MKhIBAADFmLVFOHGc1z8hD68cn1rQdxkxtSYiIUl5on999fKpI+3s7KhO94FAILh85cqtB2FJqW8dbDsMHzzA1taW6lAAAI0Ts4qQxWIdO7Dn6tXAHb4b4xMSOBx2x/btfz6w0d7enupoH6SlpbkOHZXZzLm4tSvpYHwjNe6P6cuG9ex4aPc2FgtHMgEA6hmzilBi8GD3wYPdKyoqOBwOh0Ovd0AkErkN84rvv0Xcqsf7IbOOud1Gnjm/tOX2XSuXLqI0HQBAI8SsY4T0FxQUlGFk96EF/1/x0PV7Dv0lEokoSQUA0IihCOnlxr2Hha3dZExwVMQm1gkJuJMnAEA9QxHSS3FJGVHRkDklUtEoKyuTcx4AgEYPRUgvHdu04L57KXOK9e518+bN5ZwHAKDRQxHSi9dIT93HfxEBT3oi4T8rE31dXV0qQgEANGYoQnpp2rTpih+n6R0eQwozqgZZsbdNLyz4e/9OCoMBADRW9Lp4AAghi+fNbtXCYtmaCflllURdT6kku4tN+4O3r5qZmVEdDQCgEWLuFuHmzZsDAgKoTiHbUPdBcY9DHl4+2VlfnBEbEXjmOG1bcMqUKa9evaI6xecEBgb+9ttvVKf4AicnJ/Fn7ghPAxs2bLh48SLVKT7nzZs3EyZMoDrFF0yaNInm535fvnx5/fr1VKf4Aicnp/pdIXOLMDMzMysri+oUn1NSUpKRkfHl5SiVkpKSn59PdYrPeffuHf3fxufPn9O8COn/eSkoKEhOTqY6xRckJyfT/POSlZVF/8/L06dP63eFzC1CAAAAgiIEAACGa1Qny4hEoqKiooiIiNosnJ2dnZqaWsuFKfHq1avy8nI6JySElJWVxcXF0e2WrdWlpKTk5OTQ/G0khERERCgp0fcP05ycnJSUFDq/jXFxcfT/vJSXl8fGxtL57vkpKSm5ubk0fxsJIbVP2KxZM2PjGs+g/RiL5kcmvsrNmzenTJnStGnT2iycnZ2toqKira3d0Km+GZ/Pz8jIsLCwoDrI56SmphobG9P52fQlJSVlZWVGRkZUB/mcN2/etGzZkuoUn5OVlaWmpkbnhzDz+fzMzExzc3Oqg3wO/T8vxcXF5eXlNP+8JCQktGrVqpYLjxw50sfH5/PLNKoiBAAA+Fr03RUDAAAgByhCAABgNBQhAAAwGooQAAAYDUUIAACMhiIEAABGo+910A0kMTExPDw8PDw8MTFRR0fn0KFDVCeS9u+///r7+0dFRWVlZSkrK1tZWXl5eXl5edHqItypU6eWlpZWH1FTUzt69ChVeaSUl5dPnjxZ5tT//vc/W1tbOef5lPz8/E2bNl2/fr2kpKRFixYzZswYO3YshXkKCgrCw8MjIiKePn3K5/PXrFnTvn376gvw+fzo6OiIiIiIiIiCggJ3d/dPvc8NhMfjVQUoLCz08PAYP3589QVycnL27NkTGhqamprK4/HMzMycnZ29vb3l+SzPtLQ0yS+Z169fi8XiM2fOSC1w+PDhGzduSA0uW7asW7du8klYWloaGRkZERHx5MmTsrKyOXPmuLi4VF9g586dDx8+rPmDDg4O3t7eckgoEAhevHgh+deYk5Pj5OS0YMGCmsvs3bvX398/KyvLwMBgxIgRS5Ys+bZrNBlXhHZ2doWFhYQQNpttaGhIdRwZzp07d/r06e7du7dt27a8vPzWrVuXL19+9OjR7t27qY72waVLlwgh1a8BV1dXpy6ONJFI9ObNG6nB58+f8/n8rVu3UhKppry8vF69er169crT07Nly5b37t0bN27cy5cv16xZQ1WkZcuWSf40ZLPZQqFw7ty5UgsEBQUNGTKkaoFmzZrJOWFgYKCnp2dVgJp3IUhISNi4caO9vX2XLl04HM6TJ0/WrVt3+vTp0NBQPT09+YTs27ev5JEskpA1F4iKijp79qydnV31ewlJ/WXZoHbv3r1y5cqqhAMGDJAqwqysLKlPUGZm5tu3b62treWTMCoqqnv37lUJa9abSCQaPXr0hQsXHB0dR40aFRsbu2LFiuDg4MDAQDab/dWvJ2aYnTt33rp1Ky8vz8bGxtjYmOo4MmRnZwuFwqpvCwsL27dvz2KxkpKSKEwlRU9Pb+TIkVSn+AppaWlsNtvNzY3qIB8sXryYELJ3717JtwKBwMPDg81mx8TEUBXp8uXLZ86cSUhI+PXXXwkhwcHBUgvExsYePHgwIiIiPDycELJ48WI5J3zx4sWhQ4ciIyMfPXpECFm+fLnUAqWlpcXFxdVHfvrpJ0LIpk2b5BbywIED169fz8rK6tevn8zfsfPmzSOElJeXyy2SlJCQkOPHj8fExBw7dowQ4ufn98UfGTx4MIvFio+Pl0M8sVicmpq6b9++0NDQpKQkQsj48eOlFjh79iwhZMKECSKRSDKyceNGQsiRI0e+4eUYV4RVaFuENUn+drt37x7VQT5QuCKUPJLw1KlTVAf5wMrKSldXVyAQVI08ePCAELJs2TIKU0l8qgirREdHU1KEVSRNXLMIa5I8smfOnDlySCWFtkVY5e+//65NEWZkZHA4HFdXV/mkqi4zM1NmEUr2yUdHR1eNVFZWKisrOzo6fsOrMG7XqCKKjIxUVVVt164d1UE+wufzIyIiioqKmjdvTvP7ZIrF4r/++ktfX9/Dw4PqLB9kZ2ebmZlV340jua+spA6hvkRFRRFC7OzsqA4iLSkp6e3bt3p6ejY2Nlwul+o4n3PkyBGBQDBt2jSqg3wgeTpm9VsxKysrm5iYhIWF8Xi8rz1SiCKkqQcPHqSnp2dmZl6/fv3OnTv79u1r0qQJ1aE+cunSJcmRQkJI586dDxw4INmnT0PBwcEJCQnz589XVVWlOssHhoaG6enpIpGo6kBRamoqIYTmTzBXCMnJyWFhYcXFxU+ePPHz8/Pw8JDzST21UfWnrZ6e3s8//7x48WJanRBX3bFjx3R0dIYPH051kA8kZ3ikpqZWnQbF4/EyMzP5fH5KSoqVldVXrQ1FSFMbN268du0aIYTFYs2fP3/UqFFUJ/qIu7u7i4tL69atS0pKbt26tXfv3r59+z5+/Lht27ZUR5PBz8+PEEKrv2cJIf3799+3b5+vr+/MmTMJISKRaPv27YSQ4uJiqqMpvJCQkEmTJkm+dnBw+PXXX2n1wIfWrVtv2LChc+fOmpqaT58+3bp1q7e3N5/PX758OdXRZAgJCYmLi/vxxx9pdUJc//79jx8/vn379iNHjkj+gNi9ezePxyPf9gmqy95bhUbzY4TFxcU5OTnPnj3buHGjmpqajY0NHY4ofIrkkPvkyZOpDiJDQUGBurp6ly5dqA4iLT09vVmzZkpKSqNHj16xYkWPHj10dXWNjIx0dXWpjqbwxwgrKyvz8vLevHkTEBDQrl07NTW1kJAQOScUf/oYoZTMzMwmTZpoamrK/zNem2OEko3p8PBwuaWq7lPHCPl8vqurKyHE2dl55cqVw4YNU1JSkmwIPn/+/GtfBRfU05SmpqaBgUHHjh19fHzWr1//7NkzyT9Zeho/fryGhobkRD66OXnyZFlZGd02Bwkhpqamjx8/njt3bkxMzLlz5ywsLB4+fFhRUVHLB2rCZygrK+vp6bVo0cLT0/PmzZuSayKpDvVJxsbGHh4eJSUlz58/pzqLtJKSkoCAABsbm65du1Kd5SMcDicwMHDDhg2VlZWnTp0qKSkJDAy0srJisVjf8AnCrlEF0KtXL0JIXFwc1UE+SUlJSV1dXbJfgm78/PxUVVXHjRtHdRAZTExMql8eGh8fX1RU1LNnTwojNT7NmjWzsLCg88eHEKKhoUEIqayspDqItJMnT5aUlMyYMYPqIDKoqqquWLFixYoVkm9FItG0adOsra2/4YJRbBEqgCdPnhBCTE1NqQ7ySWFhYdnZ2XQ7r5UQ8uzZs4iICE9PT7ldTF0Xu3btIoRMmTKF6iCNSm5ubmpqKp0/Pjwe79atW0pKSnK7XL32Dh8+rKysTM+/I6WcOXMmIyPj2z4+jNsiTEhIKCgoIISUl5dLLgAghGhqatLnn+CCBQu8vLxsbW01NDSKi4svXLiwfPlydXX10aNHUx3tvYCAgIKCgoEDB5qamvJ4vH/++UdyXVTNG5FQztfXl9DvNBmJvLy8GzduDBo0SFdXNy8vb9euXXv37h07dqyTkxOFkRITEwkh6enphJBXr15pamoSQmxsbCQnm4hEIsnVCK9fvyaEvHv3TvIJMjc3NzIykkNCoVAo+bswNjaWEJKZmSkJYGFhITmtev/+/bq6ui4uLsbGxnw+PzIycvHixXw+f+rUqXKIJ5GcnJyTk0MIKSoqIoRIEqqoqHTs2FGSedeuXePHj2/durWysvKrV698fHxiYmLGjRsnt3tdlZaWSjaRJf+7k5OTJSHbtGmjpaVVtdiLFy9CQ0NHjx5NyU24oqKiRCJRXl4eISQvL0+S0NTUtGrP59GjR11dXc3NzSsqKs6ePTt37lxra+uad2KrlXo6oqkwZF5J1qtXL6pzfVB1NnDVOVomJiY3b96kOtcH69atkwRTUVGRnPqvqqq6a9cuqnNJq6ysNDQ0tLS0rH6nHvqouoVV1f/ocePGUXtK1KeOQ6empkoWKCkpkbnAnj175JMwPz9fZoD9+/dLFpgzZ45kRFVVVfKPk8PhLF++vOr+I3IgOQ1YSqtWrSSzku6pCin5YvDgwUVFRXJL+KnD+VKnR0lufhQUFCS3YNVJdhdLWb16ddUCkkas+h9tb2+fkpLyba/FEovFMt+Rxio6Ojo7O1tqUEdHx97enpI8NZWUlISEhLx69SonJ8fExMTKyqpPnz60ugCOz+eHh4dHRkZmZWWxWKyWLVsOHDiQbpc5EkKKi4tDQ0NNTU07dOhAdRYZJFtXDx8+zMzMNDAw6Nu3L+V3A8/MzJR5voazs7OKigohRCgU3r17t+YC1tbW5ubmDZ6PEIFAEBwcXHO8Xbt2ZmZm5P/f1cePH2dkZGhoaDRv3tzJyUkyJTexsbFv376VGlRTU3N0dJR8nZCQ8OjRo+Tk5NLSUlNTUycnJzlf719YWPj48eOa4127dq1+ECEsLKyoqMjV1bX6PVHl5u7duzXv1NqiRYtWrVpJvn7z5s2dO3dSU1OVlZUdHBzqkpNxRQgAAFAdTpYBAABGQxECAACjoQgBAIDRUIQAAMBoKEIAAGA0FCEAADAaihAAABgNRQgAAIyGIgQAAEZDEQIAAKP9H9dWJIwffxtTAAAAAElFTkSuQmCC",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 20\n",
"x = LinRange(-1, 1, a)\n",
"A = vander(x)\n",
"Q, _ = gram_schmidt_naive(A)\n",
"\n",
"v = A[:, end]\n",
"@show norm(v)\n",
"# Note, if v is actually orthogonal, these should be 0\n",
"scatter(abs.(Q[:, 1:end-1]' * v), yscale=:log10, xticks=range(1, a-1; step=2), label=\"\\$v \\\\cdot Q_{:, j}\\$\")"
]
},
{
"cell_type": "markdown",
"id": "9cbf6425-ebab-4d98-992f-32d6b72058a0",
"metadata": {},
"source": [
"## Right-looking modified Gram-Schmidt\n",
"\n",
"There are inherent data dependencies in this process.\n",
"\n",
"$$\n",
"\\begin{split} \\Bigg[ q_1 \\Bigg| q_2 \\Bigg| q_3 \\Bigg| q_4 \\Bigg| q_5 \\Bigg]\n",
"\\begin{bmatrix} r_{11} & r_{12} & r_{13} & r_{14} & r_{15} \\\\\n",
" & r_{22} & r_{23} & r_{24} & r_{25} \\\\\n",
" & & r_{33} & r_{34} & r_{35} \\\\\n",
" & & & r_{44} & r_{45} \\\\\n",
" & & & & r_{55}\n",
"\\end{bmatrix}\n",
"\\end{split}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "523ada84-0108-4d13-b791-b9229e777eb6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"gram_schmidt_modified (generic function with 1 method)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function gram_schmidt_modified(A)\n",
" m, n = size(A)\n",
" Q = copy(A)\n",
" R = zeros(n, n)\n",
" for j in 1:n\n",
" # First we normalize our column\n",
" R[j, j] = norm(Q[:, j])\n",
" Q[:, j] /= R[j, j]\n",
" # Then we make all following columns orthogonal to the current\n",
" R[j, j+1:end] = Q[:, j]' * Q[:, j+1:end]\n",
" Q[:, j+1:end] -= Q[:, j] * R[j, j+1:end]'\n",
" end\n",
" Q, R\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "8a0abbde-2958-4150-a81d-c1fa92ecf6d6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"norm(Q' * Q - I) = 8.486718528276085e-9\n",
"norm(Q * R - A) = 7.366192855671664e-16\n"
]
},
{
"data": {
"text/plain": [
"7.366192855671664e-16"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = 20\n",
"x = LinRange(-1, 1, m)\n",
"A = vander(x, m)\n",
"Q, R = gram_schmidt_modified(A)\n",
"\n",
"# We've repaired our norms here to look like the naive variant\n",
"@show norm(Q' * Q - I)\n",
"@show norm(Q * R - A)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "c7cb716b-175c-412f-b139-f3abc4e0f725",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = LinRange(-1, 1, 23)\n",
"A = vander(x)\n",
"# Now with modified Gram-Schmidt\n",
"Q, R = gram_schmidt_modified(A)\n",
"\n",
"scatter(diag(R), yscale=:log10, label=\"\\$R_{j, j}\\$\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "6d733aa9-3f94-4c3d-8d73-79ebe6b6e536",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"norm(v) = 0.9999999999999999\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dZ0BT58MF8CcQCHtPlSHiQhBUEBVc4F4oKu69Zx2t4qp7tGpdf63bqq0bV8WFCiLiYooMkY0osgQSZkjyfogv0hCGEHID9/w+kee53hyD8SR3MgQCAQEAAKArOaoDAAAAUAlFCAAAtIYiBAAAWkMRAgAAraEIAQCA1lCEAABAayhCAACgNRQhAADQGooQAABoDUUIAAC01qSKMCkp6eDBg7VcmMfjyf7l5bhcLtURaiD7CQUCAY/HozpFDWT/ZcT7RSJkPyE93y9Nqgg/fPhw586dWi7M5XJl//ddXFxMdYQayH5CPp9fWlpKdYoayP7LWFpaivdL/cl+Qh6PR8P3S5MqQgAAgB+FIgQAAFpDEQIAAK2hCAEAgNZQhBKQmJi4ZNU6e5ch1t37Tpy7JDAwkOpEolJSUsZMm2ti7WDY3t7E2mHU5FmJiYlUhwIAkAlMqgM0epevXV/8665sl9WC4QsJUyny49sHy3dO7N3x0O/bqY72zdu3bweMnZoxdKdg2WHhSFqMX+Agd+8LJ+27dKE2GwAA5fCNsF4SExMXb9iZtfC+wG4EUTcgyhqktXPObK+/XyVfvHKV6nSEECIQCEZPm/dl6gWBVb/vg+36ZMy4MnbGAj6fT2E2AABZgCKsl92HjmW7riFK6v8ZZTBy3XZt3Xu4zqstKio6deasx8yFA8ZMWfjz2oCAgDqvKjQ0NFe7NTFsLTqhZ842tn316lWd1wwA0DSgCOslMChE0NpJzISGYQ6bU7d1xsfHt3foufRe6tVmU166/vEnz9nN88CYqbPrdjpzbGws29Ba7FSuvk3M+/d1CwkA0GSgCOuljMslcuL3swoEpA6XpCorKxvgPjF59LHCAauJuT3RMSEd+udMv3CfbfTrtt/qkFBBQUG+rETsFJNXwlJUrMM6AQCaEhwsUy82HawiU8NIm16iEyUcNZYCg8H40RV6372bZdaTmHQUGS8YtPbU3u6b161iMn/sV9alSxfVnccKiWflKY1E/y5d9vxoQgCojZiYGDc3t7KysoqDAoGgDv8tSJnMhpSXl//zzz9dXV0lvmYUYb2snD/j4dw1OZZORE6+4rjqoz1zp02owwofBbzOt+gjZkJeQdDMKiEhoU2bNj+0QnNzc2tjDf/wf3m2w/+zvqgHrTVI27Zt6xCyHJvNDg0NNTMzMzMzq896AJqez58/6+jo/PPPP1QHaTrWrFnTQOd9oQjrxd7efsEo1yOnx30d8RsxaEUIIQU56o/3duHFrVyyuQ4rLCwqJsrK4ucUlOp2qdnr50/2GjwyKeUVu6M70TMn2clqEbdM0vxv3b1Rh7UJRUZGTpq39DOnjGfYllmQTTLils2ftXr5Etn8IAlACWVlZQsLC6pTNB0aGhoNtGYUYX1t2+DZy9Hn1z2rPn78xCdER1N9/vSJC+fskpOry/5Xu/aWii/elVbe1koI+RJrbm5eh3VqaWmFPHt08crVmw9OJ/gntTQ3HzGq56QJmxQUFOqwNkJIZGSky+gpGRPPkGZW34bKSnbcXJ2c6vnnvrrsyAQAoBCKUAIGDOg/YEB/iazKY/SorQeHZHafThRVKo4zYnw7mDer8wciJpM5ZeKEKRPrsrW2sulLfsmYcOp7CxJCmCz26H3Xjg5dEhVlZWVV9R8FAJA5OGpUthgaGu5cs1zn+CiSmfBtSCCQD7vZ/K7n+T/3Uxrtm7y8vJRsDmle6ZQMBiPbYcZFr1tUhAIAqDs6fiO8f//BvhPn33+IZTKZttbWa3+a10WWrjQ2a9pky5ZmKzcuS0vP4MmzWAJubyfH/f4P9fT0qI5GCCGfPn0iuqZipwR6Ld8n1v3cfwAAStCuCGcsXHbr3ZevrqvJwHaEz4tPDn4665e1s8auWLKA6mjf9e7VM8j3HiEkKytLRvqvnKamJinIET/HydbX0ZJuHACA+qLXptF/Ll2+EZP3deo50rwDkZMnTEXSqnv2gjs7TlwKDw+nOp0YLBaL6giimjVrplSQIbYLtaJuuw3oI/VEAAD1Qq8i3HngaN7QLaKj8grZg37defAYFYkapV2/empdWkD+e8Ea+Qhvi+LE/v0lc9AQAIDU0GvTaHYem2gaiZlo2TX0ySZpp2m0JniM+ZKZvX1fL47t6GLDDnKcDJ3Ep5bMXO+bl3EeIQA0OvQqQlL1xT/rcF1QOlu2aN4kD3dfX9+AoDdtrEy6LVpub29PdSgAgLqgVxFqa6inszOIuoHoRFKQbUfxt2iAqujr63t4eAwePFhdXb3mpZuEDx8+rN/5R1BoeHEpV1dbc5zbkJ+XLpLB/bgA0hEUFPTo0SMWi/Xp06d27dpNmTJFsXFex59e+whXLZ6jcXeT6Ci/TOfBFs/FcygIBI3H/Yc+PUZMuKIzKmH+o0/LAyM8LmwPKunSq39+fj7V0QCkLS4uzs3N7fnz5z/99NPy5ct3796dl5fn6OiYkZFBdbS6oFcRTps8caiZgtY/s0n6eyIQEH4ZSQrWOea2cspImTqVEGRNXl7e9CW/ZM37l7TrS+QVCCFERbuo/8/v7WbPW7aa6nQAUuXv7+/i4rJhw4affvpJ+f+vjbxixQpzc/OZM2dSm61u6LVplMFgXDh55Oat2/tPbklITJRnylu1a7fh8JZu3bpRHQ1k2tXrN/I6TyBqoud0ljlMeLL3YFFRkXJVl0oHqKuYmJi4uDgOh2NkZGRjY6Orq0t1IkIIiY6OHj58+MmTJysfFjB27NhJkybFxcVZWlpSkq3O6FWEQiPdRox0G1FcXMxkMn/09n5ATy9DI4tbDBQ/Z9w+KSmpffv20k0ETVZJScnhw4f3HzqcmpRQPigvz+zdt+/mjb86OztTmI3P50+ZMqVr165jx46tPGtqakoICQsLa3RFSK9NowB1w5BjEAFf/JyAj5NGQFLi4uJsbDv9stoztXlPssyb7E4mB7PI9ijepEP+8Tk9e/ZcsmSJyM1+a+nWrVsnTpwYP358aWkpISQkJKRDhw5paWk/tJLr168HBwf/9NNPYmfZbDYhhMvl1iEetVCEADXraW+rkvRCzIRAQD5F4Z5zIBGJiYmO3Z0S2Xz+hiAy/QTp0J9oGRNlDWJgSXrOKlsTSCYdOnL0+KTJU370dK8PHz4UFRXNmDHD29s7JiaGEKKjo5OWlhYfH/9D6zl79qyGhsbAgeK3jrx9+5YQUre7xVELRQhQs9GjRmq+u0G+in58Zj07NmKASyM9ZBxkCo/HGzHSPZ+pUbbqKWkmbks7g0H6zOPP/efq1SsHDx78oZU/ePDA3d09MDBQTk6ubdu2hBBzc/PJkydX/gzn5+f37NmzqtYTEBDg6OhY1a1Mnzx5oqWl1RhPKUYRAtRMVVXV66+jhqdGyQddJZxsIuCTjDi1W2vs0u4d/H0b1emgKTh79uy7iPCyWeeJqk51y3VyE/Sau2Hj5q9fv9Z+5YsXL1ZUVLx8+fLo0aPLz3w1MjJq0aKFyJLjxo1buHCh2JUUFxfn5ua2atVK7Gxqaurjx49nz55d5zt+UwhFCFAr3bt1C/W9u1gr2vb6VPNDvfq82nxwjG2gzx0cLwoScfT4SbmOQ4h5Lc7jGraWw2F7eXn90PoFAsG1a9fc3d3LH4rdknHjxo2TJ0+KXQOLxVJSUqqq5/bs2aOvr7927dofSiUjcMwkQG0ZGxvv37WV6hTQBOXm5ga9eSWYdrxWS2sayVl2v//gwezZs2v/FGlpaRkZGT169BA+vH//vthL5JcvUBmDwejbt69wF6NAILh48WJ+fn7//v1btWr19OnTkydPPnjwQFtbu/aRZAeKEACAYqmpqQI+nxi2qeXyPMO2cQlhP/QUioqKcnJyampqhJCCgoKIiIjBgwf/aM7Nmzf36dMnMjIyJibG2dnZ1NR0//79PXr0mDdvnre3N7WndtQHihAAgGLFxcWEEKKgVNs/oKBUWFT0Q09hYGCwbNmytWvX9u/fPywsrKodgdVzcHDw8vKaPXu2ubm5o6NjcHDwrVu33r9/7+vra2xszOFwhEXb6GAfIciQlJSU+/fvP378ODMzk+osANJjbGxMCKl8WHJVGF9TTZs3+9Fn2bt3r6enp4WFxerVq+t8rfxBgwb5+fnNnTv32bNnxcXFDAZjx44dxsbGeXl5e/bsqds6RYwcOTI1NVUiq6olfCMEmRAXFzdm2rzPfJVi445yvFLF5K12FsYXTvxPRi4rBdCgmjdv3szE7FP0Y2I7tOaleVz5WH/nlUvr8ER6enp6eqJXCvxRLBarb9++wp8FAsGqVav69eu3Z8+eEydO1HPNQidPnqx/yB+Cb4RAvfT09F7Dxoa77sqYdT1/yKbc4TsyFvs8buHhPMhNeBUMgKaNwWBMHDeW+eofUpBT89KB53mFeR4eHg2fq2aWlpYnT54cP378kCFD7OzsxC7zQ6f/JyUlaWlpSShdbaEIgXqrNu3I6L+BmP7nXcTrOCzFfMDx039RFApAqlatWsVi8BiXltewXM5H5q1fx48bb2VlJZVcNdizZ8/Ro0d9fX03b94sdoGgoKDaX3rp/PnzGRkZCxYskFzAWkERAvWe+D/n2QypPF7oMPnv697SzwMgffr6+qdPniCvLpFLKwmfJ36hrCTmoWHGWqoHDx6QbroqaWpqzps3r0+fPlUtYGtre+fOndqsKiQkpHfv3urq6tnZ2RLLVzsoQqBeGWEQOXkxE1rNMjO+SD0OADU8PDyOHDki7/cn8/feJPrxf+qwMJc83Mfc7mjC4vo8uCflXWj1oaCg0KFDh9os2blzZ1NTUz8/v169ejV0KhE4WAaoJ8fnEYGAVL6HQ36Gtk61l5sCaFrmz59vY2OzZNny0D8GMzX0BcbtecqaCvmfeSnhDELmzp2zbdu2RnrSei35+vpK//I0+EYI1Ove1Z4R/bjyuFLoFY/hg6SfB4BCTk5Owa9fvXjxwnPpvHFdWgxpxpva1/bwoYMpyUmHDx9udC0YHh7etWtXkcGAgIDKg4QQgUAQERHRsWNHqUT7Dt8IgXp/bF0fMHBkhl5LYvD9er6MDwHGEVeWnHxKYTAASjAYjG7dunXr1o3qIBLQpk2b33//XWTQ1tZ2zJgxBQUFqqqqFcejoqLatWsnJyftb2goQqCemZnZg0tnRk+blq/XLt/ITp5XovbxjRmz4Oa9G7ikNUCjpqysXPlQGnV19fbt21dswQsXLgwcONDLy2v8+PFSzUcIQRGCjLCzs/sQ+iIsLOxdZKQSi2VrO0p41zQAaHoKCwtFrpVx//790tJSLS2tcePGST8PihBkhZycXOfOnTt37kx1EABoWCoqKiK3uTh37hxVYQgOlgEAAJpDEQIAAK2hCAEAgNZQhAAAQGsoQgAAoDUUIQAA0BqKEAAAaA1FCAAAtIYiBAAAWkMRAgAAreESawAAksdkMoOCguzt7SsOCgQCRuX7bsoYmQ2ZnJzs5OTUEGuWiSKMiIh48OBBcHBwVlbW+vXre/fuXXH25cuXa9eujY6ONjEx8fT0dHd3pyonAEAtOTk5+fn5CQSCioOFhYUqKipURaoNHo9XVlbGYrGoDiJeLW92/6Nkogj/97//+fv7W1lZPXr0aM6cORWn4uLi+vfvP2TIkDVr1jx8+HDs2LH37t0bMGAAVVEBAGpDeBF5kUE2m62urk5JnloqKyvjcrl0u/2ZTBThkSNH5OXls7Ozr1+/LjK1e/dufX39v//+W0FBoX///lFRUZs3b0YRAgCApMjEwTLy8vJVTT19+nTYsGEKCgrCh6NGjXr58mVJSYm0ogEAQBMnE0VYjbS0NFNT0/KHZmZmfD7/8+fPFEYCkDg2m011BAD6avBNo76+vpmZmWKnevfubWhoWM2fLSkp4XA4Ghoa5SPCn7OysszNzSUaE4ACkZGRC1b9+iExmcdSly9htzIzObp7q7W1NdW5AOilwYvw6NGjQUFBYqf++uuv6ouQxWKpqalV/LCcn59PCNHV1ZVsSADpC3geOGrWkiyPP8moTsKR9NTwvmOmXzu+r3evntRmA6AVCRchn8//8uWLhoaGqqqqcOTy5cv1WaGxsfHHjx/LH378+JHBYBgbG9crJQDV+Hz+pHlLs2ZfJ1rNvo+a2GbNvj5lwajEt6+r2XEOAJJVq32E2dnZhw8fnjlzZqdOnVq1arVu3brKywgEgt27dxsZGTVr1kxdXd3V1TU2Nrb++ZycnO7evcvn84UP79y5Y29vr6SkVP81A1Do9evXBc07/acFhbSMC00cXrx4Uc/1FxYW1nMNAPRRq2+Eb9++Xbx4sbKysqWlZUJCQlZWVuVlfv/9d09PzxEjRsyaNSslJWXjxo0uLi5hYWF6eno1rj86OvrZs2cFBQWEkMePH+fm5lpYWPTr148QsnLlykuXLs2fP3/u3Lk+Pj43btyofIoFQKMTFxfH1m0ndipPr318fLyzs3MdVpuVlbV09a/+L99wmcoMbqGRrvbujZ79+7nWLyxAE1erIrSxsQkPD7eyskpOTra0tKy8QHZ29tatW7t06XLjxg05OTlCiLm5+fDhw/fu3btz584a1x8dHX38+HFCSJcuXYKDg4ODg/v37y8sQmtr63///feXX345f/58ixYtTp06NXLkyB/7KwLIHmVlZSa3sFTclAK3UFm5Lhv/P3361K3/8E99PXnL9hMGgxDyJSd13OoFm+cmLpk3u355AZqyWhWhnp5e9V/s7t69W1BQMHnyZGELEkIGDx6sr69/+fLl2hShu7t7NRdO69evX2hoaG1ylpSUfPny5cqVK+UjPXv2rOp4HP7/q82aqYKE9Sebv2h7e3uVrf8rHOhZeUr1w2MHh/F1CDx90YqPg7YL2lf4/qdj8nWO15YDLiOHDGzevHl9AsvmyygCCeuv6f2iy1upGpI5WCY4OJgQ0qtXr/IReXl5Z2fnGzdu5OTk6OjoSORZapSXl/fly5eKh+doa2tramqKXbi4uJjJZDKZMnFtnaqUlJSUX0xANsl+Qh6PV1paKmsXEdbX17e3NH7y5kKpw8SK4wpBlzuZ6hoaGhYXF//QCgsKCsJiEwVDK20FZbJyHWedv3hl2eIF9QlcXFzM4/Hwfqkn2U8ovMSarL1fRPzQy6ikpFRjF0rmn7XwwE6Rb436+vqEkLS0NKkVoYGBQceOHb28vGqzsJycnOwXIY/Hk/1L9Mp+QiaTKYPXTrx29kQ/N4+YhIBc61FEz5xkJ2u9u9mmLOX67at1eEmTk5MZhq3FTpUZWUXG12WdFTEYDAUFBbxf6kn2EzaKa41K/GWUzD/roqIiQojIdy8tLS1CCIfDkchTADQxqqqqgT53Hjx8+K/P06jXZ9tZWoxYMWrQwIF1+zCupKTEKC0SP1daqKYi0/+vAVBLMkUovGdHQUFBxS4Unggv4x9/ACjEYDAGDRw4aODA+t+UwMzMjGTEkbISwhS9gY563JP+U7rWZ+UATZtkrjUqPCAlOzu74mBOTg4hxMDAQCJPAQDVkJOTWzRrqpr3RtGJjxF6CU/c3EZQEQqgcZBMEdrY2BBCRC6lFhQUpKenh6vAAEjH+lUrRjUr1TnhTt56k8wEkvBK5cFOs2tzH964KOMHaABQSzJFOHToUHl5+WvXrpWPBAcHx8fHu7m5SWT9AFAjBoNx7tihe4c2/KQa0uflxgmZlw8NM48JChB77i8AlKvtPkLhCe/C+0iUn//u6Ohoa2tLCDEzM5s5c+aJEyc2btw4d+7cpKSkOXPmqKiorF69usGSA4AYXbt27doVewQBfkBti3DevHnlPz979uzZs2eEkF27dgmLkBBy4MABNpu9devWLVu2EEIMDQ2vX7/eurX447kBAABkRG2LUHjki4iK55ooKytfvHjxt99+e/funZaWlr29vaKiomQyAgAANJjaFqG2tnZtFjM1Na14Q3kAAAAZJ5mDZQAAABopFCEAANAaihAAAGgNRQgAALSGIgQAAFpDEUKT9fLly8EeU1t17tHavmePQaMuXblKdSIAkEUyfXcxgDrbfeDwrrM3c4ZtJ/06Ejn5tKykqJO7L930vv736drcsRoA6AP/I0AT9Pbt299OX8mZd4uYdiJy8oQQomee53H4Sa7mnydPU50OAGQLihCaoD1HTmX3W0vkRW+5wB60/sCxv6hIBACyC0UITVDI2whibi9mQkUrr7BY6nEAQKahCKEJYjAYRMCvYkrKWQBA1qEIoQly6GRLEl6KmeBkaamqSD0OAMg0FCE0QasWz9X12UG4oltBNbx/XbV4DiWRAEBmoQihCWrXrt32lfN1/xxCYvxIaSHhl5GPEdrnprlZKM2YOpnqdAAgW3AeITRN82ZO6+HQeceBoyFntpSWlrZr2/antdMGDRpIdS4AkDkoQmiybGxsLp48zOPxSktLK95EGgCgImwaBQAAWkMRAgAAraEIAQCA1lCEAABAayhCAACgNRQhAADQGooQAABoDUUIAAC0hiIEAABaQxECAACtoQgBAIDWUIQAAEBrKEIAAKA1FCEAANAaihAAAGgN9yMEgBrk5eWFhYWpqKhYW1vjzo7Q9KAIAaBKHz9+HD970YfPX8uaWcvxuYyUUNfuDicO7lZTU6M6GoDEoAgBQLysrKzuA0akDd8rGONcPnj91fn3g0e+8XsgLy9PYTYACcI+QgAQz3Pzzs99VglaO1ccLHWc8kHX4dzfF6hKBSBxKEIAEO/+Yz+e3cjK45yu085cuSX9PAANBEUIAOJxBQwiJ277p57Zp09pUo9Tpbdv3w4eO8XE2qF11z6WnZ1WbdhSWFhIdShoTLCPEADEkxPwxE+wM7W0taWbpUpeN2/NW7cre+ReMtCBEPKFW3zg5dmbzq4vH3nr6OhQnQ4aB3wjBADxOtlYk7jnlccVw26MHOQq/TyV5eTkLFy9KXv+v6Slw7chBaXSnvMSeqyYvfQXSqNBY4IiBADx9m1br3/rZ5L7+T+jKaGGIeeWLZxHUaj/uHTVK89hKlHWFBnn2Y18HhqBDaRQS9g0CgDitW3b9trx/RPnjSyw6JlnaCtXVqKd9lovL87736sych7h67fRJc2GiZ8zbJuUlGRlZSXdRNAooQgBoEq9ejonhL0MCAgICg1XVVZ2sF/g4ODAYDCozvWNggKT8Lji5/hlCgoK0o0DjRWKEACqo6io6OLi0r17dwUFBSZTtv7H6OvY+eK15wXtXUQn+DzyKcrc3JyCTNAIYR8hADRWo0a6aUffIZmJIuPKvvvHjRyGb4RQSyhCAGislJWV/71w2vjsOIXAMyQriXCLSEqo5pXF3TlBe7dvojodNBqytaEDAOCH2NnZvQt8fODPE74Ba9M/f+7QwWrKgiGjRrrJzo5MkH0oQgBo3HR0dDavW72ZEDabra6uTnUcaHywaRQAAGgNRQgAALSGTaMAAKISEhKePQuI+JBo07qls7NTq1atqE4EDQhFCADwHY/Hm7V4hffLiPwOI0q1bRV8kjT3zxniaH368D7ci7ipQhECAHy3+Oe11zI0CxY9ED7kEpLVZ5HXvW1KK9cc2/87tdmggWAfIQDAN9nZ2V4P/QoGrRcZLxi07oaPf1ZWFiWpoKGhCAEAvgkICChqN5BUPgeRwShqPzAgIICKUNDgUIQAAN/k5eUVK4m/nW+Rkm5ubq6U84B0oAgBAL5p3ry5ep7olUuFNPISW7RoIeU8IB0oQgCAb5ydnRVj/UgxW3SimK34/rGzszMVoaDBoQgBAL5hsVh7t6zXPj2OsDO/j3KytE+P37N5vZKSEnXRoAHh9AkAgO8mjR+rrqayxHNEiYp+mZ4FMzuRVZB5YOfGkcOHUR0NGgqKEADgP0YMGzpi2NCMjIyEhAQLCwsDAwOqE0HDQhECAAUyMjIKCwvNzMxk9n5JBgYGqECaQBECgPSUlZVt3P776YtXBZrGRFFFkBHXx6nbsT92aWlpUR0N6AtFCADSM3j0xEDFDoXLnxN5BeHI9RCv4D4DQ/x9NDQ0qM0GtIWjRgFASm7euv2mSKtw4NryFiSElHUendpl9vrtuIwnUAZFCABS8ue5K3lOCyqPl3addNP7gfTzAAihCAFASpKSk4mBpZgJeYUSnkDqcQC+QRECgJSoqqmSojyxU3KEL+UwAOVQhAAgJUNcejHf3RMzkfaulbmZ1OMAfIMiBAApWbF4vt7zwyQz4T+jxWzda0v3bVlLUSgAnD4BANKio6Nz9/JfbpMmfm0zkGPiSBSVWWnhGiH/HNz2q4ODA9XpgL5QhAAgPZ3s7D6EBHp7ewcEhRQUFfcY1GHEEV9tbW2qcwGtoQgBQKpYLJa7u7u7uzvVQQC+wT5CAACgNRQhAADQGooQAABoDUUIAAC0hiIEAABaQxECAACtoQgBAIDWUIQAAEBrKEIAAKA1FCEAANAaihAAAGgNRQgAALSGIgQAAFpDEQIAAK2hCAEAgNZwP0IAgEYpNjY2IiJCRUXFxsamRYsWVMdpxFCEAACNTFRU1Ohp83KUjDjGtsyyYlbKvg5G6lfOHNXX16c6WqOEIgQAaExSU1NdRk38Mukcada+fND/3X3nQW4RL/wUFRUpzNZIYR8hAEBj8vOv2zOGbKvYgoQQvvWgjxaDj5/+i6JQjRuKEACgMXn28rXAakDl8UL7CRdu3JV+niYARQgA0JjwiBxhMMRMaDXLyMyQepymAEUIANCYyAt4RCAQM5H7WV/fQOpxmgIUIQBAY9K9qz0j+lHlcZWQS+PdBkk/TxOAIgQAaEz2bdtgcHcdSY+tOCgX5dP8w535s2ZQlapRw+kTAACNiampqc/Vc6OnzclVN+MYdZTnl6gkv26jq+h1/xaLxaI6XaOEIgQAaGRsbGzeBz+PioqKjIxUUlKytZ1hZmZGdahGDEUIAND4MBiMDh06dOjQgeogTQH2EQIAAK2hCAEAgNZQhAwJI2YAABnJSURBVAAAQGsoQgAAoDUUIQAA0BqKEAAAaA1FCAAAtIYiBAAAWkMRAgAAraEIAQCA1lCEAABAayhCAACgNRQhAADQGooQAABoDUUIAAC0hiIEAABaQxECAACtoQgBAIDWmFQHAABo+gIDA/+5fickIqpFM+MBzl0nTxyvrKxMdSj4BkUIANCA+Hz+xNkLfWIychxnEdfZJD/D++GTbX84+9y42KZNG6rTASEoQgCABrVl1x7vbE3OzEPfHuuYFJl3SbEaMnD0pPfBzxUVFSlNB4RgHyEAQMPh8/nHzl7gDP5VdKJ5hywL19u3/6UiFIhCEQIANJSkpCSBYWvCFPO1j2PZ1+f5a+lHgspQhAAADaW4uFjAVBI/p6BUUFQs3TggHooQAKChmJqaki+xYqcUPkd2tmot5TwgFooQAKChqKmp2bW1YET5iE5wizRfn54wdjQVoUAUihAAoAH9dfgPkwcb5EO8iEDwbSgrSee4+7afFxsbG1MaDb7B6RMAAA3I2Ng49JnPT2s2+u7fU8pQlOeXNjPQ27NvQ98+vamOBt+gCAEAGpaOjs75Y4cIIVlZWXp6elTHAVHYNAoAICUsFovqCCAGihAAAGgNRQgAALSGIgQAAFpDEQIAAK2hCAEAgNZQhAAAQGsoQgAAoDUUIQAA0BqKEAAAaA1FCAAAtIYiBAAAWkMRAgAAraEIAQCA1lCEAABAayhCAACgNRQhAADQGooQAABoDUUIAAC0hiIEAADy7t27SXOX2PRw7dC977AJM3wePaI6kfSgCAEA6O7oqb/6TFxwQWNEzLRbiQueeLdeOG7T8VmLV1CdS0pQhAAAtBYdHb1+3/HsBXdJuz6EpUrkFYip3dfp/3hF5Zy/cInqdNKAIgQAoLVdB49l919PFJRExvOGb9954CglkaQMRQgAQGtBYeGkVTcxE+oGOWyO1ONQAEUIAEBrfB6fMGjdBbT+ywMAgK1NB5IUJGai8KumirLU41AARQgAQGurF8/R8dlO+GUi4+r3ti6bN52KRNKGIgQAoLVOnTqtmOymc3wUSQ0nAj4hhGSnaF5e5KLNnjdrBtXppIFJdQAAAKDYup+X9enusGnvH7HXP/B4ApMWzZfOnjRhnAfVuaQERQgAAMTJycnHyamsrIzL5Sor02LXYDlsGgUAAFpDEQIAAK2hCAEAgNZQhAAAQGsoQgAAoDUUIQAA0BqKEAAAaA1FCAAAtIYiBAAAWkMRAgAAraEIAQCA1lCEAABAayhCAACgNRQhAADQGooQAABoDUUIAAC0hiIEAABaQxECAACtoQgBAIDWUIQAAEBrKEIAAKA1FCEAANAaihAAAGgNRQgAALTGpDoAIYSw2WxfX9+goKDY2FgnJ6clS5aUT6Wnpy9durTiwlOmTBk+fLjUMwIAQNMkE0Xo5+fn4eHRsWPHxMREBQWFilMcDufq1auzZs3S09MTjmhqalKREQAAmiaZKEJXV1c2m62goODs7Cx2gRUrVlhZWUk5FQAA0IFM7CNUUVER+SIogs/ns9lsqeUBAAD6kIkirJGDg4OGhoa+vv7ChQsLCgqojgMAAE1Hg28aTU1NjY+PFzvVvHnz1q1bV//HNTQ0/ve//zk7OysoKDx69Gjt2rWZmZlXr15tgKQAAEBHDV6EXl5eGzZsEDs1d+7cvXv3Vv/HDQwMFi1aJPzZysqqrKzs559/zsvLwyEzAAAgEQ1ShHw+X07u20bXZcuWLVu2TFJrtre3FwgEiYmJdnZ2klonAADQWW33ET558mTXrl1jxoyxt7cfNGiQ2GVCQ0NdXV1ZLBaLxerWrZufn5/EYv6/N2/eMBgMCwsLia8ZAADoqbbfCEeOHMlms3V1dQsLC7W0tCovEBMT06dPHzU1tR07digpKR08eHDgwIFPnjxxcnKqceXFxcX//vsvISQrK0tOTu7q1avy8vLu7u6EkGPHjikoKNjZ2SkqKj569Gjjxo2jR4/W0ND4kb8jAABAlWpbhH///XfHjh3Nzc2tra1zcnIqL+Dp6cnhcAIDAzt06EAIGT16dNu2bZctW/bmzZsaV56fn+/p6Sn8OS0tzdPTk8ViCYtQIBBs3Ljx48ePhJBmzZrNmjVrx44dtcwMAABQo9oW4YgRI6qZzc3NvXv3brdu3YQtSAgxMjIaNmzYhQsXYmNj27RpU/3KDQwMqjqydP78+fPnzy8pKeHz+crKytWvh8fj5eTkPHr0SPhQTk7O3t4eXx8BAKAakjlYJjw8nMvluri4VBx0cXG5cOHCmzdvaizCGrFYrNos9uXLl8TExIpfGZctW9a3b1+xCxcXFzOZTCZTJq6tUxUOh0N1hBrIfkIej1daWlpWVkZ1kOrI/stYVFSkoKCA90s9yX7CsrIyLpfblN4vKioq8vLy1S8jmX/WKSkphBADA4OKg8KHycnJEnmK2mjWrFmXLl0ePnxYm4WF72oZf2MTQtTV1amOUAMZTygswho3J1BOxl9GJpMp+0VIZP5lJDKfUFiEdHu/SObKMoWFhYQQkYNotLW1SWP4BAQAAHQmmSIUXilUWIflhNdCU1JSkshTAAAANATJFKG+vj4hRORoUuHD8tsnAQAAyCDJFKHwYNHw8PCKg8KH1tbWEnkKAACAhiCZIrSwsGjfvv39+/fLt47y+fybN2/q6up2795dIk8BAADQEGp7DNjz588/ffpECMnPzy8uLhbe/0FPT6/85IR169ZNnjx55syZBw8eZLFYGzZseP/+/W+//Vb9jQYBAACoVdsi/P3332/fvl3+0MPDgxDi5OQUEBAgHJk0adKHDx+2bt16+fJl4cj8+fN//vlniaYFAACQsNoW4bFjx/bt2ycyKHJE6KZNm2bNmhUQEMDj8RwdHWu81yAAAADlaluERkZGtVnMxMRkwoQJ9cgDAAAgVZI5WAYAAKCRQhECAACtoQgBAIDWUIQAAEBrKEIAAKA1FCEAANAaihAAAGgNRQgAALSGIgQAAFpDEQIAAK2hCAEAgNZQhAAAQGsoQgAAoDUUIQAA0BqKEAAAaA1FCAAAtIYiBAAAWkMRAgAAraEIAQCA1lCEAABAayhCAACgNRQhAADQGooQAABoDUUIAAC0hiIEAABaQxECAACtoQgBAIDWUIQAAEBrKEIAAKA1FCEAANAaihAAAGgNRQgAALSGIgQAAFpDEQIAAK2hCAEAQPJSU1PnL19t3cPF1Nqh59Axf544xePxqA4lHooQAAAk7Kn/M/t+I46XOUZOuJq6LDCg165V3nHdXIcUFRVRHU0MFCEAAEgSm80eP2dJxtxbAtvhRFmDEEJ0zTjDtkSYuy3+ZR3V6cRAEQIAgCRdu34jz86DaBqLjJc4zb7j41taWkpJqmqgCAEAQJKeBb0tMnMUM8FgkGbtk5KSpB2oJihCAACQKIGgqhkGYQiqnqUKihAAACSpe2drpZQ3YiYEAsHnaHNzc2kHqgmKEAAAJMljtLtm6EXCzhQZV3x1bmBvJxaLRUmqaqAIAQBAkjQ1Nf8+sk//2HDGu/uEW0wIIflfVO5vbx994cjenVSnEwNFCAAAEtbP1eXVvWuTSx61Pjm4xf4eXe7M3dbb4I3fAzU1NaqjicGkOgAAADRBLVu2PPfnAapT1Aq+EQIAAK2hCAEAgNZQhAAAQGsoQgAAoDUUIQAA0BqKEAAAaA1FCAAAtIYiBAAAWsMJ9QAA0Dj4+vp6P/aPiPlg0671UNdeffv2lchqUYQAACDrCgsLB7lPeMfV/tphJOk48mFW4umtf1n/tv/+9YsqKir1XDmKEAAAZN2EWQtftRhR2m3qt8fNrL52HPr65dmJsxfdvHCmnivHPkIAAJBpHz9+fBGT/L0F/19Jt2mB0UlpaWn1XD+KEAAAZNrLly85rV3FThW0dn358mU9148iBAAAmVZYWFimIP7+TVwF1YKCgnquH0UIAAAyrWXLlhrZMWKnNLLft2rVqp7rRxECAIBM6969u3LKa5KXLjqRl66c8trR0bGe60cRAgCATGMymWcP/6F7cjT5FPV99FOU7snRZw//wWTW9/QHnD4BAACyzqVvn0cXj89ZsSY1PUOgps/gZJkaGxy/eNzOzq7+K6fvN8LffvvNy8uL6hTVSU5OnjhxItUpajB9+vTY2FiqU1TH29t769atVKeogbOzs0AgoDpFdXbs2HHz5k2qU1QnISFh8uTJVKeowdSpU+Pj46lOUZ3bt29v376d6hTi2dnZvXly93PkG72ClM+Rr18/9pZICxI6F2F6enpGRgbVKaqTm5ubnJxMdYoapKSkfP36leoU1fny5cvnz5+pTlGDd+/eyXgR4v0iEcnJyTL+fsnIyJDx9wuDwYiKimIwGBJcJ32LEAAAgKAIAQCA5prUwTJ8Pj8/Pz84OLg2C2dmZqamptZyYUrExsYWFRXJckJCSGFhYUxMTP2P2mo4KSkpWVlZMv4yEkKCg4Pl5GT3g2lWVlZKSoosv4wxMTGy/34pKiqKjo6W7GY9yUpJScnOzpbxl5EQUvuELVq0MDQ0rH4ZhozvmfghDx8+nD59erNmzWqzcGZmJovF0tDQaOhUdcblcj9//mxqakp1kOqkpqYaGhoqKipSHaRKHA6nsLDQwMCA6iDVSUhIsLCwoDpFdTIyMpSVldXV1akOUiUul5uenm5iYkJ1kOrI/vuFzWYXFRXJ+PslPj6+9ifRjxkzxtPTs/plmlQRAgAA/CjZ3RQDAAAgBShCAACgNRQhAADQGooQAABoDUUIAAC0hiIEAABak93zoBtIYmJiUFBQUFBQYmKipqbmiRMnqE4k6vnz5xcvXgwNDc3IyFBUVLS0tBw/fvz48eNl6iTcGTNmiNwVWllZ+ezZs1TlEVFUVDRt2jSxU+vWrbO1tZVynqp8/fp1165d9+7d43A4LVu2nD179oQJEyjMk5ubGxQUFBwc/PbtWy6Xu2nTJisrq4oLcLnc8PDw4ODg4ODg3NzcoUOHVvU6N5DS0tLyAHl5eW5ubpMmTaq4QFZW1qFDh169epWamlpaWtq8efOePXuuXLlSS0tLaiE/fvwo/E/mw4cPAoHgypUrIgucPn36/v37IoOrVq2yt7eXTsKCgoKQkJDg4OCwsLDCwsIFCxb07du34gL79+8PDAys/AcdHR1XrlwphYRlZWWRkZHCf41ZWVnOzs5Lly6tvMzhw4cvXryYkZGhq6s7evToFStW1O0cTdoVYadOnfLy8ggh8vLyenp6VMcR49q1a5cvX+7atWu7du2Kiop8fHxu37794sWLgwcPUh3tu1u3bhFCKp4DrqKiQl0cUXw+PyEhQWTw3bt3XC539+7dlESqLCcnp0ePHrGxse7u7hYWFk+fPp04ceL79+83bdpEVaRVq1YJPxrKy8vzeLxFixaJLPDgwYPhw4eXL9CiRQspJ/T29nZ3dy8PUPkqBPHx8Tt37nRwcOjcuTOTyQwLC9u2bdvly5dfvXqlra0tnZCurq7CW7IIQ1ZeIDQ09OrVq506dap4LSGRT5YN6uDBg2vXri1POGjQIJEizMjIEHkHpaenp6WltW3bVjoJQ0NDu3btWp6wcr3x+XwPD48bN244OTmNHTs2Ojp6zZo1fn5+3t7e8vLyP/x8AprZv3+/j49PTk6OjY2NoaEh1XHEyMzM5PF45Q/z8vKsrKwYDEZSUhKFqURoa2uPGTOG6hQ/4OPHj/Ly8v3796c6yHfLly8nhBw+fFj4sKyszM3NTV5ePioqiqpIt2/fvnLlSnx8/JYtWwghfn5+IgtER0cfP348ODg4KCiIELJ8+XIpJ4yMjDxx4kRISMiLFy8IIatXrxZZoKCggM1mVxz55ZdfCCG7du2SWshjx47du3cvIyOjX79+Yv+PXbx4MSGkqKhIapFE+Pv7nz9/Pioq6ty5c4SQU6dO1fhHhg0bxmAw4uLipBBPIBCkpqYeOXLk1atXSUlJhJBJkyaJLHD16lVCyOTJk/l8vnBk586dhJAzZ87U4eloV4TlZLYIKxN+dnv69CnVQb5rdEUovCXhpUuXqA7ynaWlpZaWVllZWflIQEAAIWTVqlUUphKqqgjLhYeHU1KE5YRNXLkIK3v79i0hZMGCBVJIJUJmi7Dc33//XZsi/Pz5M5PJdHFxkU6qitLT08UWoXCbfHh4ePlISUmJoqKik5NTHZ6FdptGG6OQkBAlJaX27dtTHeQ/uFxucHBwfn6+mZmZjF8nUyAQ/PXXXzo6Om5ublRn+S4zM7N58+YVN+MIrysrrEOQlNDQUEJIp06dqA4iKikpKS0tTVtb28bGRkFBgeo41Tlz5kxZWdnMmTOpDvKd8O6YFS/FrKioaGRk9Pr169LS0h/dU4gilFEBAQGfPn1KT0+/d+/ekydPjhw5oq+vT3Wo/7h165ZwTyEhxM7O7tixY8Jt+jLIz88vPj5+yZIlSkpKVGf5Tk9P79OnT3w+v3xHUWpqKiFExu9g3igkJye/fv2azWaHhYWdOnXKzc1Nygf11Eb5R1ttbe3169cvX75cpg6Iq+jcuXOampqjRo2iOsh3wiM8UlNTyw+DKi0tTU9P53K5KSkplpaWP7Q2FKGM2rlz5927dwkhDAZjyZIlY8eOpTrRfwwdOrRv376tW7fmcDg+Pj6HDx92dXV98+ZNu3btqI4mxqlTpwghMvV5lhAycODAI0eOnDx5cu7cuYQQPp+/d+9eQgibzaY6WqPn7+8/depU4c+Ojo5btmyRqRs+tG7deseOHXZ2dmpqam/fvt29e/fKlSu5XO7q1aupjiaGv79/TEzMwoULZeqAuIEDB54/f37v3r1nzpwRfoA4ePBgaWkpqds7qD5bbxs1Gd9HyGazs7KyIiIidu7cqaysbGNjIwt7FKoi3OU+bdo0qoOIkZubq6Ki0rlzZ6qDiPr06VOLFi3k5OQ8PDzWrFnTrVs3LS0tAwMDLS0tqqM1+n2EJSUlOTk5CQkJXl5e7du3V1ZW9vf3l3JCQdX7CEWkp6fr6+urqalJ/z1em32Ewi/TQUFBUktVUVX7CLlcrouLCyGkZ8+ea9euHTlypJycnPCL4Lt37370WXBCvYxSU1PT1dW1trb29PTcvn17RESE8J+sbJo0aZKqqqrwQD5Zc+HChcLCQln7OkgIMTY2fvPmzaJFi6Kioq5du2ZqahoYGFhcXFzLG2pCNRQVFbW1tVu2bOnu7v7w4UPhOZFUh6qSoaGhm5sbh8N59+4d1VlEcTgcLy8vGxubLl26UJ3lP5hMpre3944dO0pKSi5dusThcLy9vS0tLRkMRh3eQdg02gj06NGDEBITE0N1kCrJycmpqKgIt0vImlOnTikpKU2cOJHqIGIYGRlVPD00Li4uPz+/e/fuFEZqelq0aGFqairLbx9CiKqqKiGkpKSE6iCiLly4wOFwZs+eTXUQMZSUlNasWbNmzRrhQz6fP3PmzLZt29bhhFF8I2wEwsLCCCHGxsZUB6nS69evMzMzZe24VkJIREREcHCwu7u71E6mro8DBw4QQqZPn051kCYlOzs7NTVVlt8+paWlPj4+cnJyUjtdvfZOnz6tqKgom58jRVy5cuXz5891e/vQ7hthfHx8bm4uIaSoqEh4AgAhRE1NTXb+CS5dunT8+PG2traqqqpsNvvGjRurV69WUVHx8PCgOto3Xl5eubm5gwcPNjY2Li0tffTokfC8qMoXIqHcyZMniewdJiOUk5Nz//79IUOGaGlp5eTkHDhw4PDhwxMmTHB2dqYwUmJiIiHk06dPhJDY2Fg1NTVCiI2NjfBgEz6fLzwb4cOHD4SQL1++CN9BJiYmBgYGUkjI4/GEnwujo6MJIenp6cIApqamwsOqjx49qqWl1bdvX0NDQy6XGxISsnz5ci6XO2PGDCnEE0pOTs7KyiKE5OfnE0KECVkslrW1tTDzgQMHJk2a1Lp1a0VFxdjYWE9Pz6ioqIkTJ0rtWlcFBQXCr8jCX3dycrIwZJs2bdTV1csXi4yMfPXqlYeHByUX4QoNDeXz+Tk5OYSQnJwcYUJjY+PyLZ9nz551cXExMTEpLi6+evXqokWL2rZtW/lKbLUioT2ajYbYM8l69OhBda7vyo8GLj9Gy8jI6OHDh1Tn+m7btm3CYCwWS3jov5KS0oEDB6jOJaqkpERPT8/c3LzilXpkR/klrMp/0RMnTqT2kKiq9kOnpqYKF+BwOGIXOHTokHQSfv36VWyAo0ePChdYsGCBcERJSUn4j5PJZK5evbr8+iNSIDwMWESrVq2Es8LuKQ8p/GHYsGH5+flSS1jV7nyRw6OEFz968OCB1IJVJNxcLOLXX38tX0DYiOW/aAcHh5SUlLo9F0MgEIh9RZqq8PDwzMxMkUFNTU0HBwdK8lTG4XD8/f1jY2OzsrKMjIwsLS379OkjUyfAcbncoKCgkJCQjIwMBoNhYWExePBgWTvNkRDCZrNfvXplbGzcoUMHqrOIIfx2FRgYmJ6erqur6+rqSvnVwNPT08Uer9GzZ08Wi0UI4fF4vr6+lRdo27atiYlJg+cjpKyszM/Pr/J4+/btmzdvTv7/VX3z5s3nz59VVVXNzMycnZ2FU1ITHR2dlpYmMqisrOzk5CT8OT4+/sWLF8nJyQUFBcbGxs7OzlI+3z8vL+/NmzeVx7t06VJxJ8Lr16/z8/NdXFwqXhNVanx9fStfqbVly5atWrUS/pyQkPDkyZPU1FRFRUVHR8f65KRdEQIAAFSEg2UAAIDWUIQAAEBrKEIAAKA1FCEAANAaihAAAGgNRQgAALSGIgQAAFpDEQIAAK2hCAEAgNZQhAAAQGv/ByiE7DBKWqG2AAAAAElFTkSuQmCC",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 20\n",
"x = LinRange(-1, 1, a)\n",
"A = vander(x)\n",
"Q, _ = gram_schmidt_modified(A)\n",
"\n",
"v = Q[:, end]\n",
"@show norm(v)\n",
"# Note, if v is actually orthogonal, these should be 0\n",
"scatter(abs.(Q[:, 1:end-1]' * v), yscale=:log10, xticks=range(1, a-1; step=2), label=\"\\$v \\\\cdot Q_{:, j}\\$\")"
]
},
{
"cell_type": "markdown",
"id": "dd83d7d5-a738-4655-9354-3cb19c006641",
"metadata": {},
"source": [
"## Classical vs modified\n",
"\n",
"Classical\n",
"\n",
"* Really unstable, orthogonality error size of $1 \\gg \\epsilon_\\text{machine}$\n",
"\n",
"* Don't need to know all the vectors in advance\n",
"\n",
"Modified\n",
"\n",
"* Needs to be right-looking for efficiency\n",
"\n",
"* Less unstable, but orthogonality error $10^{-9} \\gg \\epsilon_\\text{machine}$"
]
},
{
"cell_type": "markdown",
"id": "ebb090a7-377e-4ed0-b13b-2facc7325916",
"metadata": {},
"source": [
"## Native Julia implementation\n",
"\n",
"Note that Julia's implementation has further improvements."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "bc86542e-9b31-40cd-a77d-e75a0369cdef",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"norm(Q' * Q - I) = 1.739065259552395e-15\n",
"norm(Q * R - A) = 2.8660440008834812e-15\n"
]
}
],
"source": [
"m = 10\n",
"x = LinRange(-1, 1, m)\n",
"A = vander(x, m)\n",
"Q, R = qr(A)\n",
"\n",
"@show norm(Q' * Q - I)\n",
"@show norm(Q * R - A);"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "962f4801-8bc4-4627-84ce-786c70bf7140",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = LinRange(-1, 1, 23)\n",
"A = vander(x)\n",
"# Now with modified Gram-Schmidt\n",
"Q, R = qr(A)\n",
"\n",
"scatter(abs.(diag(R)), yscale=:log10, label=\"\\$R_{j, j}\\$\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "b2d46192-22f1-4463-bc41-da55cd11596c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"norm(v) = 0.9999999999999999\n"
]
},
{
"data": {
"image/png": "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",
"image/svg+xml": [
"\n",
"\n"
],
"text/html": [
"
"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 20\n",
"x = LinRange(-1, 1, a)\n",
"A = vander(x)\n",
"Q, _ = qr(A)\n",
"\n",
"v = Q[:, end]\n",
"@show norm(v)\n",
"# Note, if v is actually orthogonal, these should be 0\n",
"scatter(abs.(Q[:, 1:end-1]' * v), yscale=:log10, xticks=range(1, a-1; step=2), label=\"\\$v \\\\cdot Q_{:, j}\\$\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.11.6",
"language": "julia",
"name": "julia-1.11"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.11.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}