{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 2D steady-state diffusion\n", "\n", "Diffusion problems study the *spreading of substances* (e.g., heat, particles, or pollutants) over time due to random motion, governed mathematically by the diffusion equation. At steady state, the solution depends on boundary conditions (e.g., fixed values or fluxes at edges), with applications spanning heat transfer, environmental pollutant dispersion, biological transport, and material science. The problems are analytically solvable in simple geometries but often require numerical methods for complex scenarios." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem setup\n", "\n", "As shown in the figure, there is a two-dimensional heated plate with a length of $L=0.3$ m, a height of $H=0.4$ m, and a thickness of 0.01 m. The plate has a thermal conductivity of $k=1000$ W/(m·K). The western boundary is subjected to a constant heat flux with a flux density of $q=500$ kW/m$^2$. The eastern boundary is adiabatic, while the southern boundary exchanges heat by convection with ambient air at a temperature of $T_{\\inf} = 200$ °C, with a convective heat transfer coefficient of $h = 253.165$ W/(m$^2 \\cdot$K). The northern boundary is maintained at a constant temperature of $T_N = 100$ °C. Determine the temperature distribution within the plate.\n", "\n", "\n", "\n", "![2D diffusion](images/diffusion2d.jpg)\n", "\n", "The mathematical model for two-dimensional steady-state diffusion problem is\n", "\n", "$$\\frac{\\partial}{\\partial x} \\left( k\\frac{\\partial T}{\\partial x} \\right) + \\frac{\\partial}{\\partial y} \\left( k\\frac{\\partial T}{\\partial y} \\right) = 0.$$\n", "\n", "The boundary conditions are\n", "\n", "$$-k\\frac{\\partial T}{\\partial x}|_{x=0} = 500000, \\quad k\\frac{\\partial T}{\\partial x}|_{x=L} = 0, \\quad k\\frac{\\partial T}{\\partial y}|_{y=0} = h\\left( T-T_{\\infty} \\right), \\quad T|_{y=H} = 100.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solve problem\n", "\n", "### Define 2D grid\n", "\n", "Take a uniform grid $\\delta x = \\delta x = 0.1$ m." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Discretize 2D diffusion equation\n", "\n", "There are **nine** different types of nodes we have to deal with separately. Make $k = k_w = k_e = k_s = k_n$ and $A = A_w = A_e = A_s = A_n$, derive the discrete equations for the internal and boundary nodes as following.\n", "\n", "**Internal Nodes 6 and 7**\n", "\n", "The discrete equation satisfied by the internal nodes in the plate is\n", "\n", "$$a_P T_P = a_W T_W + a_E T_E + a_S T_S + a_N T_N,$$\n", "\n", "where\n", "\n", "$$a_W = a_E = a_S = a_N = \\frac{kA}{\\delta x}, \\quad a_P = a_W + a_E + a_S + a_N = \\frac{4kA}{\\delta x}.$$\n", "\n", "**Corner Node 1**\n", "\n", "The western boundary is subject to a constant heat flux, we have\n", "\n", "$$a_W = 0, \\quad (S_P)_w = 0, \\quad (S_u)_w = qA.$$\n", "\n", "On the east side, we have\n", "\n", "$$a_E = \\frac{kA}{\\delta x}.$$\n", "\n", "The southen boundary exchanges heat with the ambient air by convection, we have\n", "\n", "$$a_S = 0, \\quad (S_P)_s = -\\frac{A}{1/h + \\delta x/(2k)},$$\n", "\n", "$$(S_u)_s = \\frac{A}{1/h + \\delta x/(2k)} T_{\\infty}.$$\n", "\n", "On the north side, we have\n", "\n", "$$a_N = \\frac{kA}{\\delta x}.$$\n", "\n", "The overall source term becomes\n", "\n", "$$S_P = (S_P)_w + (S_P)_s = -\\frac{A}{1/h + \\delta x/(2k)}, \\quad S_u = (S_u)_w + (S_u)_s = qA + \\frac{A}{1/h + \\delta x/(2k)} T_{\\infty}.$$\n", "\n", "Therefore, the discrete equation for Node 1 is\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = 0 + \\frac{kA}{\\delta x} + 0 + \\frac{kA}{\\delta x} - \\left[ -\\frac{A}{1/h + \\delta x/(2k)} \\right],$$\n", "\n", "$$\\left[ \\frac{2kA}{\\delta x} + \\frac{A}{1/h + \\delta x/(2k)} \\right] T_P = \\frac{kA}{\\delta x} T_E + \\frac{kA}{\\delta x} T_N + \\left[ qA + \\frac{A}{1/h + \\delta x/(2k)} T_{\\infty} \\right].$$\n", "\n", "**Edge Nodes 2 and 3**\n", "\n", "On the west side, we have the constant heat flux boundary\n", "\n", "$$a_W = 0, \\quad (S_P)_w = 0, \\quad (S_u)_w = qA.$$\n", "\n", "On the other sides, we have\n", "\n", "$$a_E = a_S = a_N = \\frac{kA}{\\delta x}.$$\n", "\n", "So the discrete equations for Nodes 2 and 3 can be written as\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = 0 + \\frac{kA}{\\delta x} + \\frac{kA}{\\delta x} + \\frac{kA}{\\delta x} - 0 = \\frac{3kA}{\\delta x},$$\n", "\n", "$$\\left( \\frac{3k}{\\delta x}A \\right) T_P = \\frac{kA}{\\delta x} T_E + \\frac{kA}{\\delta x} T_S + \\frac{kA}{\\delta x} T_N + qA.$$\n", "\n", "**Corner Node 4**\n", "\n", "On the west side, we still have the constant heat flux boundary, so we have\n", "\n", "$$a_W = 0, \\quad (S_P)_w = 0, \\quad (S_u)_w = qA.$$\n", "\n", "On the east and south sides, we have\n", "\n", "$$a_E = a_S = \\frac{kA}{\\delta x}.$$\n", "\n", "On the north side, the temperature is fixed at 100 °C, so we have\n", "\n", "$$a_N = 0, \\quad (S_P)_n = -\\frac{2kA}{\\delta x}, \\quad (S_u)_n = \\frac{2kA}{\\delta x} T_N.$$\n", "\n", "The overall source terms becomes\n", "\n", "$$S_u = (S_u)_w + (S_u)_n = qA + \\frac{2kA}{\\delta x} T_N,$$\n", "\n", "$$S_P = (S_P)_w + (S_P)_n = 0 + \\left( -\\frac{2kA}{\\delta x} \\right) = -\\frac{2kA}{\\delta x}.$$\n", "\n", "Therefore, the discrete equation for Node 4 is\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = 0 + \\frac{kA}{\\delta x} + \\frac{kA}{\\delta x} - \\left( -\\frac{2kA}{\\delta x} \\right) = \\frac{4kA}{\\delta x},$$\n", "\n", "$$\\left( \\frac{4kA}{\\delta x} \\right)T_P = \\frac{kA}{\\delta x}T_E + \\frac{kA}{\\delta x}T_S + \\left( qA + \\frac{2kA}{\\delta x} T_N \\right).$$\n", "\n", "**Edge Node 5**\n", "\n", "On the west, east and north sides, we have\n", "\n", "$$a_W = a_E = a_N = \\frac{kA}{\\delta x}.$$\n", "\n", "On the south side, we have the convective heat exchange boundary\n", "\n", "$$a_S = 0, \\quad (S_P)_s = -\\frac{A}{1/h + \\delta x/(2k)}, \\quad (S_u)_s = \\frac{A}{1/h + \\delta x/(2k)} T_{\\infty}.$$\n", "\n", "Therefore, the discrete equation for Node 5 becomes\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = \\frac{kA}{\\delta x} + \\frac{kA}{\\delta x} + 0 + \\frac{kA}{\\delta x} - \\left[ -\\frac{A}{1/h + \\delta x/(2k)} \\right] = \\frac{3kA}{\\delta x} + \\frac{A}{1/h + \\delta x/(2k)},$$\n", "\n", "$$\\left[ \\frac{3kA}{\\delta x} + \\frac{A}{1/h + \\delta x/(2k)} \\right]T_P = \\frac{kA}{\\delta x}T_W + \\frac{kA}{\\delta x}T_E + \\frac{kA}{\\delta x}T_N + \\left[ \\frac{A}{1/h + \\delta x/(2k)} T_{\\infty} \\right].$$\n", "\n", "**Edge Node 8**\n", "\n", "On the west, east and south sides, we have\n", "\n", "$$a_W = a_E = a_S = \\frac{kA}{\\delta x}.$$\n", "\n", "The northern side is the boundary with a fixed tempeture, so we have\n", "\n", "$$a_N = 0, \\quad (S_P)_n = -\\frac{2kA}{\\delta x}, \\quad (S_u)_n = \\frac{2kA}{\\delta x} T_N.$$\n", "\n", "Therefore, the discrete equation for Node 8 becomes\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = \\frac{kA}{\\delta x} + \\frac{kA}{\\delta x} + \\frac{kA}{\\delta x} + 0 - \\left( -\\frac{2kA}{\\delta x} \\right) = \\frac{5kA}{\\delta x},$$\n", "\n", "$$\\frac{5kA}{\\delta x}T_P = \\frac{kA}{\\delta x}T_W + \\frac{kA}{\\delta x}T_E + \\frac{kA}{\\delta x}T_S + \\frac{2kA}{\\delta x} T_N.$$\n", "\n", "**Corner Node 9**\n", "\n", "On the west and north sides, we have\n", "\n", "$$a_W = a_N = \\frac{kA}{\\delta x}.$$\n", "\n", "On the south side, we have convective heat exchange, so\n", "\n", "$$a_S = 0, \\quad (S_P)_s = -\\frac{A}{1/h + \\delta x/(2k)}, \\quad (S_u)_s = \\frac{A}{1/h + \\delta x/(2k)} T_{\\infty}.$$\n", "\n", "The eastern side is adiabatic, so we have\n", "\n", "$$a_E = 0, \\quad (S_P)_e = 0, \\quad (S_u)_e = 0.$$\n", "\n", "Therefore, the discrete equation for Node 9 is\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = \\frac{kA}{\\delta x} + 0 + 0 + \\frac{kA}{\\delta x} - \\left[ -\\frac{A}{1/h + \\delta x/(2k)} \\right] = \\frac{2kA}{\\delta x} + \\frac{A}{1/h + \\delta x/(2k)},$$\n", "\n", "$$\\left[ \\frac{2kA}{\\delta x} + \\frac{A}{1/h + \\delta x/(2k)} \\right] T_P = \\frac{kA}{\\delta x} T_W + \\frac{kA}{\\delta x} T_N + \\frac{A}{1/h + \\delta x/(2k)} T_{\\infty}.$$\n", "\n", "**Edge Nodes 10 and 11**\n", "\n", "On the west, south and north side, we have\n", "\n", "$$a_W = a_S = a_N = \\frac{kA}{\\delta x}.$$\n", "\n", "The eastern side is adiabatic, so we have\n", "\n", "$$a_E = 0, \\quad (S_P)_e = 0, \\quad (S_u)_e = 0.$$\n", "\n", "Therefore, the discrete equations for Nodes 10 and 11 are\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = \\frac{kA}{\\delta x} + 0 + \\frac{kA}{\\delta x} + \\frac{kA}{\\delta x} = \\frac{3kA}{\\delta x},$$\n", "\n", "$$\\frac{3kA}{\\delta x}T_P = \\frac{kA}{\\delta x}T_W + \\frac{kA}{\\delta x}T_S + \\frac{kA}{\\delta x}T_N,$$\n", "\n", "**Corner Node 12**\n", "\n", "On the west and south sides, we have\n", "\n", "$$a_W = a_S = \\frac{kA}{\\delta x}.$$\n", "\n", "The northern side is the boundary with a fixed tempeture, so we have\n", "\n", "$$a_N = 0, \\quad (S_P)_n = -\\frac{2kA}{\\delta x}, \\quad (S_u)_n = \\frac{2kA}{\\delta x} T_N.$$\n", "\n", "The eastern side is adiabatic, so we have\n", "\n", "$$a_E = 0, \\quad (S_P)_e = 0, \\quad (S_u)_e = 0.$$\n", "\n", "Therefore, the discrete equation for Node 12 is\n", "\n", "$$a_P = a_W + a_E + a_S + a_N - S_P = \\frac{kA}{\\delta x} + 0 + \\frac{kA}{\\delta x} + 0 - \\left( -\\frac{2kA}{\\delta x} \\right) = \\frac{4kA}{\\delta x},$$\n", "\n", "$$\\frac{4kA}{\\delta x} T_P = \\frac{kA}{\\delta x} T_W + \\frac{kA}{\\delta x}T_S + \\frac{2kA}{\\delta x} T_N.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solve algebraic equations" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Step 0: import the required libraries\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "import time" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Step 1: parameter declarations\n", "lx = 0.3 # length of the plate\n", "ly = 0.4 # height of the plate\n", "nx = 3 # number of grid points in x-direction\n", "ny = round(ly/lx*nx) # number of grid points in y-direction\n", "dx = lx/nx # grid spacing in x-direction\n", "dy = ly/ny # grid spacing in y-direction\n", "x = np.linspace(0.5*dx, lx-0.5*dx, nx) # x-coordinates of the grid points\n", "y = np.linspace(0.5*dy, ly-0.5*dy, ny) # y-coordinates of the grid points\n", "h = 0.01 # plate thickness\n", "area = h*dx # flux area\n", "\n", "k = 1000 # coefficient for heat conduction\n", "q = 500000 # heat flux at the west boundary\n", "Tinf = 200 # ambient temperature in the south\n", "h = 253.165 # convective heat transfer coefficient at the southern edge\n", "Tn = 100 # constant temperature at the northern edge" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAAHACAYAAAAx0GhOAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQflJREFUeJzt3XlUU2f+BvAnLAGXgogIbiBaK6JUEVSWol0UxGq1046oFZe6MdWRperIuIGtojNWUau4i9qKVHFrRys4tgUKRcWgVqm1isVBGEQHAi4gcH9/eMzPGFASEpL0Pp9zco55897vfe89bR7em7tIBEEQQEREJFIm+h4AERGRPjEIiYhI1BiEREQkagxCIiISNQYhERGJGoOQiIhEjUFIRESixiAkIiJRYxASEZGoMQiJiEjUGIRERDqWmpqKESNGoH379pBIJDh8+LBBrW/GjBmQSCSIjY3V6bgMFYOQiEjH7t27h969e+Pzzz83uPUdPnwYWVlZaN++fROMzDCZ6XsARER/dIGBgQgMDKz386qqKixcuBBffvklSktL0atXL6xcuRKvv/66Ttb3REFBAWbNmoUTJ07g7bff1mhdfwQMQiIiPZs8eTJu3LiBffv2oX379jh06BCGDh2Kixcvolu3bjpZZ21tLYKDgzF37lz07NlTJ+swFjw0SkSkR9euXUNCQgL2798PPz8/dO3aFXPmzMFrr72GnTt36my9K1euhJmZGWbPnq2zdRgLzgiJiPTo3LlzEAQBr7zyilJ7ZWUlbG1tAQA3btyAs7Pzc+vMnDmzwb9BZmdnY+3atTh37hwkEolmA/8DYRASEelRbW0tTE1NkZ2dDVNTU6XPWrZsCQDo0KEDcnNzn1vHxsamwetMS0tDcXExHB0dFW01NTX4+OOPERsbixs3bjR8A/4AGIRERHrk7u6OmpoaFBcXw8/Pr84+5ubmcHFx0do6g4ODMXjwYKW2gIAABAcHY/LkyVpbj7FgEBIR6VhFRQV+++03xfu8vDzk5OSgdevWeOWVV/DBBx9gwoQJ+Oyzz+Du7o6SkhKcOnUKbm5uGDZsmFbX5+joCFtbW8Vh1yfMzc3h4OCA7t27a76hRopBSESkY2fPnsUbb7yheB8REQEAmDhxIuLj47Fz5058+umn+Pjjj1FQUABbW1t4e3trFIINWR89Q9CzDRs2CJ07dxYsLCyEvn37CqmpqQ1aLj09XTA1NRV69+6t8tmBAweEHj16CFKpVOjRo4dw8OBBLY+aiIie+OGHH4Thw4cL7dq1EwAIhw4d0veQ1KLXyycSExMRFhaGBQsWQCaTwc/PD4GBgcjPz3/ucmVlZZgwYQLeeustlc8yMzMRFBSE4OBgnD9/HsHBwRg9ejSysrJ0tRlERKLW1HfO0TaJIAiCvlY+YMAA9O3bF3FxcYq2Hj16YNSoUYiJial3uTFjxqBbt24wNTXF4cOHkZOTo/gsKCgIcrkcx48fV7QNHToUNjY2SEhI0Ml2EBHRYxKJBIcOHcKoUaP0PZQG09tvhFVVVcjOzsb8+fOV2v39/ZGRkVHvcjt37sS1a9fwxRdf4NNPP1X5PDMzE+Hh4UptAQEBz72ZbGVlJSorKxXva2trcffuXdja2vIaGyJqNEEQUF5ejvbt28PERHcH4h4+fIiqqiqt1BIEQeX7z8LCAhYWFlqpb0j0FoQlJSWoqamBvb29Uru9vT2KiorqXObq1auYP38+0tLSYGZW99CLiorUqgkAMTExiI6OVnMLiIjUc/PmTXTs2FEntR8+fIjWHVvjwZ0HWqnXsmVLVFRUKLUtWbIEUVFRWqlvSPR+1uizf3HU9VcI8Phiz3HjxiE6OlrlDgya1nwiMjJScVYV8Pg3SEdHR9y8eRNWVlYN2QwionrJ5XJ06tQJL730ks7WUVVVhQd3HuC9o0Ewb2HeqFqP7j1C0juJKt+Bf8TZIKDHIGzTpg1MTU1VZmrFxcUqMzoAKC8vx9mzZyGTyTBr1iwAjw9hCoIAMzMzJCcn480334SDg0ODaz5R33TfysqKQUhEWtMUP7WYtzCHtKVUK7XE8h2ot7NGpVIpPDw8kJKSotSekpICHx8flf5WVla4ePEicnJyFK+QkBB0794dOTk5GDBgAADA29tbpWZycnKdNYmIiPR6aDQiIgLBwcHw9PSEt7c3tmzZgvz8fISEhAB4fMiyoKAAu3fvhomJCXr16qW0fNu2bWFpaanUHhoaioEDB2LlypUYOXIkjhw5gpMnTyI9Pb1Jt42ISCxedCcbQ6fXIAwKCsKdO3ewdOlSFBYWolevXjh27BicnJwAAIWFhS+8pvBZPj4+2LdvHxYuXIhFixaha9euSExMVMwYiYhIu4z9TjZ6vY7QUMnlclhbW6OsrEwUx8eJSLea4jvlyTrG/Ht8o38jrKqowr63vhDNdyAfzEtERKLGICQiIlFjEBIRkagxCImISNQYhEREJGoMQiIiEjUGIRERiRqDkIiIRI1BSEREosYgJCIiUWMQEhGRqDEIiYhI1BiEREQkagxCIiISNQYhERGJGoOQiIhEjUFIRESixiAkIiJRYxASEZGoMQiJiEjUGIRERCRqDEIiIhI1BiEREYkag5CIiESNQUhERKLGICQiIlFjEBIRkagxCImISNQYhEREJGoMQiIiEjUGIRERiRqDkIiIRI1BSEREosYgJCIiUWMQEhGRqOk9CDdu3AhnZ2dYWlrCw8MDaWlp9fZNT0+Hr68vbG1t0axZM7i4uGDNmjVKfeLj4yGRSFReDx8+1PWmEBGRETLT58oTExMRFhaGjRs3wtfXF5s3b0ZgYCAuX74MR0dHlf4tWrTArFmz8Oqrr6JFixZIT0/HjBkz0KJFC0yfPl3Rz8rKCleuXFFa1tLSUufbQ0RExkevQbh69WpMmTIFU6dOBQDExsbixIkTiIuLQ0xMjEp/d3d3uLu7K9537twZBw8eRFpamlIQSiQSODg46H4DiIjI6Ont0GhVVRWys7Ph7++v1O7v74+MjIwG1ZDJZMjIyMCgQYOU2isqKuDk5ISOHTti+PDhkMlkz61TWVkJuVyu9CIiInHQ24ywpKQENTU1sLe3V2q3t7dHUVHRc5ft2LEjbt++jerqakRFRSlmlADg4uKC+Ph4uLm5QS6XY+3atfD19cX58+fRrVu3OuvFxMQgOjq68RtlAF57b5W+h0CkU+lJc/Q9BPqD0euhUeDxYcynCYKg0vastLQ0VFRU4KeffsL8+fPx8ssvY+zYsQAALy8veHl5Kfr6+vqib9++WL9+PdatW1dnvcjISERERCjey+VydOrUSdNNIiIiI6K3IGzTpg1MTU1VZn/FxcUqs8RnOTs7AwDc3Nzw3//+F1FRUYogfJaJiQn69euHq1ev1lvPwsICFhYWam4BERH9EejtN0KpVAoPDw+kpKQotaekpMDHx6fBdQRBQGVl5XM/z8nJQbt27TQeKxER/XHp9dBoREQEgoOD4enpCW9vb2zZsgX5+fkICQkB8PiQZUFBAXbv3g0A2LBhAxwdHeHi4gLg8XWFq1atwl//+ldFzejoaHh5eaFbt26Qy+VYt24dcnJysGHDhqbfQCIiMnh6DcKgoCDcuXMHS5cuRWFhIXr16oVjx47ByckJAFBYWIj8/HxF/9raWkRGRiIvLw9mZmbo2rUrVqxYgRkzZij6lJaWYvr06SgqKoK1tTXc3d2RmpqK/v37N/n2ERGR4ZMIgiDoexCGRi6Xw9raGmVlZbCystL3cNTCs0bpj84Yzxptiu+UJ+sY8+/xkLaUNqpWVUUV9r31hVF+B2pC77dYIyIi0icGIRERiRqDkIiIRI1BSEREosYgJCIiUWMQEhGRqDEIiYhI1BiEREQkagxCIiISNQYhERGJGoOQiIhEjUFIRESixiAkIiJRYxASEZGoMQiJiEjUGIRERCRqDEIiIhI1BiEREYkag5CIiESNQUhERKLGICQiIlFjEBIRkagxCImISNQYhEREJGoMQiIiEjUGIRERiRqDkIiIRI1BSEREosYgJCIiUWMQEhGRqDEIiYhI1Mz0PQAiIqKGqqysxOnTp3Hjxg3cv38fdnZ2cHd3h7Ozs8Y1GYRERGTwMjIysH79ehw+fBhVVVVo1aoVmjVrhrt376KyshJdunTB9OnTERISgpdeekmt2jw0SkREBm3kyJF4//330aFDB5w4cQLl5eW4c+cO/vOf/+D+/fu4evUqFi5ciH//+9945ZVXkJKSolZ9zgiJiMig+fv7Y//+/ZBKpXV+3qVLF3Tp0gUTJ07EpUuXcOvWLbXq631GuHHjRjg7O8PS0hIeHh5IS0urt296ejp8fX1ha2uLZs2awcXFBWvWrFHpl5SUBFdXV1hYWMDV1RWHDh3S5SYQEZEOzZw5s94QfFbPnj0xZMgQterrNQgTExMRFhaGBQsWQCaTwc/PD4GBgcjPz6+zf4sWLTBr1iykpqYiNzcXCxcuxMKFC7FlyxZFn8zMTAQFBSE4OBjnz59HcHAwRo8ejaysrKbaLCIi0pGbN2/iP//5j+L96dOnERYWppQD6pIIgiBoY3CaGDBgAPr27Yu4uDhFW48ePTBq1CjExMQ0qMaf/vQntGjRAnv27AEABAUFQS6X4/jx44o+Q4cOhY2NDRISEhpUUy6Xw9raGmVlZbCyslJji/TvtfdW6XsIRDqVnjRH30NQW1N8pzxZx5h/j4e0ZcNmT/WpqqjCvre+MMjvQD8/P0yfPh3BwcEoKipC9+7d0bNnT/z666+YPXs2Fi9erHZNvc0Iq6qqkJ2dDX9/f6V2f39/ZGRkNKiGTCZDRkYGBg0apGjLzMxUqRkQENDgmkREZLh+/vln9O/fHwDw1VdfoVevXsjIyMDevXsRHx+vUU29nSxTUlKCmpoa2NvbK7Xb29ujqKjouct27NgRt2/fRnV1NaKiojB16lTFZ0VFRWrXrKysRGVlpeK9XC5XZ1OIiKiJPHr0CBYWFgCAkydP4p133gEAuLi4oLCwUKOaej9ZRiKRKL0XBEGl7VlpaWk4e/YsNm3ahNjYWJVDnurWjImJgbW1teLVqVMnNbeCiIiaQs+ePbFp0yakpaUhJSUFQ4cOBQDcunULtra2GtXUWxC2adMGpqamKjO14uJilRnds5ydneHm5oZp06YhPDwcUVFRis8cHBzUrhkZGYmysjLF6+bNm+pvEBER6dzKlSuxefNmvP766xg7dix69+4NADh69KjikKm69HZoVCqVwsPDAykpKXj33XcV7SkpKRg5cmSD6wiCoHRY09vbGykpKQgPD1e0JScnw8fHp94aFhYWiqk2EREZrtdffx0lJSWQy+WwsbFRtE+fPh3NmzfXqKZeL6iPiIhAcHAwPD094e3tjS1btiA/Px8hISEAHs/UCgoKsHv3bgDAhg0b4OjoCBcXFwCPrytctWoV/vrXvypqhoaGYuDAgVi5ciVGjhyJI0eO4OTJk0hPT2/6DSQiIq0zNTVVCkEA6Ny5s8b19BqEQUFBuHPnDpYuXYrCwkL06tULx44dg5OTEwCgsLBQ6ZrC2tpaREZGIi8vD2ZmZujatStWrFiBGTNmKPr4+Phg3759WLhwIRYtWoSuXbsiMTERAwYMaPLtIyIi7XJ2dn7uOR/Xr19Xu6ZeryM0VLyOkMhw8TrC56/jj34d4dq1a5XeP3r0CDKZDN9++y3mzp2L+fPnq12T9xolIiKjERoaWmf7hg0bcPbsWY1q6v3yCSIiosYKDAxEUlKSRssyCImIyOgdOHAArVu31mhZHholIiKj4e7urnSyjCAIKCoqwu3bt7Fx40aNajIIiYjIaIwaNUrpvYmJCezs7PD6668rLq1TF4OQiIiMxpIlS7Rek0FIREQGTS6XKy7jeNFDETS53INBSEREBs3GxgaFhYVo27YtWrVqVecF9U8erlBTU6N2fQYhEREZtFOnTinOCP3uu++0Xp9BSEREBu3ph68//W9t4XWERERkNL799lulhyhs2LABffr0wbhx4/C///1Po5oMQiIiMhpz585VnDBz8eJFREREYNiwYbh+/ToiIiI0qslDo0REZDTy8vLg6uoKAEhKSsKIESOwfPlynDt3DsOGDdOoJmeERERkNKRSKe7fvw8AOHnyJPz9/QEArVu3fuGlFfXhjJCIiIzGa6+9hoiICPj6+uL06dNITEwEAPz666/o2LGjRjU5IyQiIqPx+eefw8zMDAcOHEBcXBw6dOgAADh+/DiGDh2qUU3OCImIyGg4Ojrim2++UWlfs2aNxjUZhEREZNDU+e2Pt1gjIqI/nPpuq/Y03mKNiIj+sHRxW7WnMQiJiMig6eK2ak/jWaNERGRU0tLSMH78ePj4+KCgoAAAsGfPHqVbr6mDQUhEREYjKSkJAQEBaNasGc6dO4fKykoAQHl5OZYvX65RTQYhEREZjU8//RSbNm3C1q1bYW5urmj38fHBuXPnNKrJICQiIqNx5coVDBw4UKXdysoKpaWlGtVkEBIRkdFo164dfvvtN5X29PR0dOnSRaOaDEIiIjIaM2bMQGhoKLKysiCRSHDr1i18+eWXmDNnDj766CONavLyCSIiMhrz5s1DWVkZ3njjDTx8+BADBw6EhYUF5syZg1mzZmlUk0FIRERGZdmyZViwYAEuX76M2tpauLq6omXLlhrX46FRIiIyeDU1Nbhw4QIePHgAAGjevDk8PT3Rv39/mJqa4sKFC6itrdWoNoOQiIgM3p49e/Dhhx9CKpWqfCaVSvHhhx9i7969GtVmEBIRkcHbvn075syZA1NTU5XPTE1NMW/ePGzZskWj2gxCIiIyeFeuXIGXl1e9n/fr1w+5ubka1WYQEhGRwbt3795zn0tYXl6O+/fva1SbQUhERAavW7duyMjIqPfz9PR0dOvWTaPaeg/CjRs3wtnZGZaWlvDw8EBaWlq9fQ8ePIghQ4bAzs4OVlZW8Pb2xokTJ5T6xMfHQyKRqLwePnyo600hIiIdGTduHBYuXIgLFy6ofHb+/HksXrwY48aN06i2Xq8jTExMRFhYGDZu3AhfX19s3rwZgYGBuHz5MhwdHVX6p6amYsiQIVi+fDlatWqFnTt3YsSIEcjKyoK7u7uin5WVFa5cuaK0rKWlpc63h4iIdCM8PBzHjx+Hh4cHBg8eDBcXF0gkEuTm5uLkyZPw9fVFeHi4RrX1GoSrV6/GlClTMHXqVABAbGwsTpw4gbi4OMTExKj0j42NVXq/fPlyHDlyBF9//bVSEEokEjg4OOh07ERE1HTMzc2RnJyMNWvWYO/evUhNTYUgCHjllVewbNkyhIWFKT2NQh16C8KqqipkZ2dj/vz5Su3+/v7PPQ78tNraWpSXl6N169ZK7RUVFXByckJNTQ369OmDTz75RCkoiYjI+Jibm2PevHmYN2+eVuvq7TfCkpIS1NTUwN7eXqnd3t4eRUVFDarx2Wef4d69exg9erSizcXFBfHx8Th69CgSEhJgaWkJX19fXL16td46lZWVkMvlSi8iIhIHvd9rVCKRKL0XBEGlrS4JCQmIiorCkSNH0LZtW0W7l5eX0rUmvr6+6Nu3L9avX49169bVWSsmJgbR0dEabgERERkzvc0I27RpA1NTU5XZX3Fxscos8VmJiYmYMmUKvvrqKwwePPi5fU1MTNCvX7/nzggjIyNRVlameN28ebPhG0JEREZNb0EolUrh4eGBlJQUpfaUlBT4+PjUu1xCQgImTZqEvXv34u23337hegRBQE5ODtq1a1dvHwsLC1hZWSm9iIhIHPR6aDQiIgLBwcHw9PSEt7c3tmzZgvz8fISEhAB4PFMrKCjA7t27ATwOwQkTJmDt2rXw8vJSzCabNWsGa2trAEB0dDS8vLzQrVs3yOVyrFu3Djk5OdiwYYN+NpKIiLSuqqoKeXl56Nq1K8zMGhdler2gPigoCLGxsVi6dCn69OmD1NRUHDt2DE5OTgCAwsJC5OfnK/pv3rwZ1dXVmDlzJtq1a6d4hYaGKvqUlpZi+vTp6NGjB/z9/VFQUIDU1FT079+/ybePiIi06/79+5gyZQqaN2+Onj17KjJi9uzZWLFihUY1JYIgCNoc5B+BXC6HtbU1ysrKjO4w6WvvrdL3EIh0Kj1pjr6HoLam+E55so4x/x4PaUvVRxWpo6qiCvve+sIgvwNDQ0Px448/IjY2FkOHDsWFCxfQpUsXHD16FEuWLIFMJlO7pt7PGiUiImqow4cPIzExEV5eXkpXGLi6uuLatWsa1dT7vUaJiIga6vbt20qXzD1x7969Bl16VxcGIRERGY1+/frhX//6l+L9k/DbunUrvL29NarJQ6NERGQ0YmJiMHToUFy+fBnV1dVYu3YtLl26hMzMTPzwww8a1eSMkIiIjIaPjw9+/PFH3L9/H127dkVycjLs7e2RmZkJDw8PjWpyRkhEREbFzc0Nu3bt0lo9zgiJiMioXLt2DQsXLsS4ceNQXFwMAPj2229x6dIljeoxCImIyGj88MMPcHNzQ1ZWFpKSklBRUQEAuHDhApYsWaJRTQYhEREZjfnz5+PTTz9FSkoKpNL/v3HAG2+8gczMTI1qMgiJiMhoXLx4Ee+++65Ku52dHe7cuaNRTQYhEREZjVatWqGwsFClXSaToUOHDhrVZBASEZHRGDduHP72t7+hqKgIEokEtbW1+PHHHzFnzhxMmDBBo5oMQiIiMhrLli2Do6MjOnTogIqKCri6umLgwIHw8fHBwoULNarJ6wiJiMgoCIKAW7duYevWrfjkk09w7tw51NbWwt3dHd26ddO4LoOQiIiMgiAI6NatGy5duoRu3bqhS5cuWqnLQ6NERGQUTExM0K1bN43PDq23rlarERER6dA//vEPzJ07Fz///LPWavLQKBERGY3x48fj/v376N27N6RSKZo1a6b0+d27d9WuySAkIiKjERsbq/WaDEIiIjIaEydO1HpNBiERERkNuVxeZ7tEIoGFhYXS/UcbikFIRERGo1WrVpBIJPV+3rFjR0yaNAlLliyBiUnDzgdlEBIRkdGIj4/HggULMGnSJPTv3x+CIODMmTPYtWsXFi5ciNu3b2PVqlWwsLDA3//+9wbVVCsIy8rKcOjQIaSlpeHGjRu4f/8+7Ozs4O7ujoCAAPj4+Gi0YURERA2xa9cufPbZZxg9erSi7Z133oGbmxs2b96Mf//733B0dMSyZcsaHIQNmjcWFhZi2rRpaNeuHZYuXYp79+6hT58+eOutt9CxY0d89913GDJkCFxdXZGYmKjZ1hEREb1AZmYm3N3dVdrd3d0VzyN87bXXkJ+f3+CaDZoR9u7dGxMmTMDp06fRq1evOvs8ePAAhw8fxurVq3Hz5k3MmTOnwYMgIiJqiI4dO2L79u1YsWKFUvv27dvRqVMnAMCdO3dgY2PT4JoNCsJLly7Bzs7uuX2aNWuGsWPHYuzYsbh9+3aDB0BERNRQq1atwp///GccP34c/fr1g0QiwZkzZ/DLL7/gwIEDAIAzZ84gKCiowTUbFIQvCsHG9iciImqId955B1euXMGmTZvw66+/QhAEBAYG4vDhw+jcuTMA4C9/+YtaNTU6a7SgoAA//vgjiouLUVtbq/TZ7NmzNSlJRETUIJ07d1Y5NNoYagfhzp07ERISAqlUCltbW6XrOSQSCYOQiIh0Ki0tDZs3b8b169exf/9+dOjQAXv27IGzszNee+01teup/fSJxYsXY/HixSgrK8ONGzeQl5eneF2/fl3tARARETVUUlISAgIC0KxZM5w7dw6VlZUAgPLycixfvlyjmmoH4f379zFmzJgGX7FPRESkLZ9++ik2bdqErVu3wtzcXNHu4+ODc+fOaVRT7TSbMmUK9u/fr9HKiIiIGuPKlSsYOHCgSruVlRVKS0s1qqn2b4QxMTEYPnw4vv32W7i5uSklMgCsXr1ao4EQERG9SLt27fDbb78pzhB9Ij09HV26dNGoptpBuHz5cpw4cQLdu3cHAJWTZYiIiHRlxowZCA0NxY4dOyCRSHDr1i1kZmZizpw5WLx4sUY11T40unr1auzYsQO5ubn4/vvv8d133ylep06dUnsAGzduhLOzMywtLeHh4YG0tLR6+x48eBBDhgyBnZ0drKys4O3tjRMnTqj0S0pKgqurKywsLODq6opDhw6pPS4iImo4db7LG2PevHkYNWoU3njjDVRUVGDgwIGYOnUqZsyYgVmzZmlUU+0gtLCwgK+vr0Yre1ZiYiLCwsKwYMECyGQy+Pn5ITAwsN57xKWmpmLIkCE4duwYsrOz8cYbb2DEiBGQyWSKPpmZmQgKCkJwcDDOnz+P4OBgjB49GllZWVoZMxERKVP3u7yxli1bhpKSEpw+fRo//fQTbt++jU8++UTjehJBEAR1FoiJiUFhYSHWrVun8UqfGDBgAPr27Yu4uDhFW48ePTBq1CjExMQ0qEbPnj0RFBSkmBIHBQVBLpfj+PHjij5Dhw6FjY0NEhISGlRTLpfD2toaZWVlsLKyUmOL9O+191bpewhEOpWeZHz3MW6K75Qn6xjz7/GQtlT/4bRPq6qowr63vmjweLXxXa5Pav9GePr0aZw6dQrffPMNevbsqXKyzMGDBxtUp6qqCtnZ2Zg/f75Su7+/PzIyMhpUo7a2FuXl5WjdurWiLTMzE+Hh4Ur9AgICEBsb26CaRETUcNr4Ln+RP/3pTw3u29AMepraQdiqVSu1BlWfkpIS1NTUwN7eXqnd3t4eRUVFDarx2Wef4d69e0rPpSoqKlK7ZmVlpeKiTODxX1ZERGL37HehhYUFLCwslNq08V3+ItbW1op/C4KAQ4cOwdraGp6engCA7OxslJaWapxNGt1iTZuePdNUEIQGnX2akJCAqKgoHDlyBG3btm1UzZiYGERHR6sxaiIiw5QX2x1m5paNqlH96CEAKB5r9MSSJUsQFRVV5zKafpc3xNO587e//Q2jR4/Gpk2bYGpqCgCoqanBRx99pPFhZ41uuq0Nbdq0gampqcpfDMXFxSp/WTwrMTFRcWH/4MGDlT5zcHBQu2ZkZCQiIiIU7+Vyucp/AEREYnPz5k2lcHl2Ngg07rtcEzt27EB6eroiBAHA1NQUERER8PHxwT//+U+1azborNGhQ4c26FhveXk5Vq5ciQ0bNrywr1QqhYeHB1JSUpTaU1JS4OPjU+9yCQkJmDRpEvbu3Yu3335b5XNvb2+VmsnJyc+taWFhASsrK6UXEZHYPfu9WFcQavpdrqnq6mrk5uaqtOfm5qo8DamhGjQj/POf/4zRo0fjpZdewjvvvANPT0+0b98elpaW+N///ofLly8jPT0dx44dw/DhwxucyBEREQgODoanpye8vb2xZcsW5OfnIyQkBMDjmVpBQQF2794N4HEITpgwAWvXroWXl5fiL5BmzZopjiGHhoZi4MCBWLlyJUaOHIkjR47g5MmTSE9PV3vnEBHRi73ou1ybJk+ejA8//BC//fYbvLy8AAA//fQTVqxYgcmTJ2tUs0FBOGXKFAQHB+PAgQNITEzE1q1bFfd0k0gkcHV1RUBAALKzsxV3nGmIoKAg3LlzB0uXLkVhYSF69eqFY8eOwcnJCQBQWFiodB3K5s2bUV1djZkzZ2LmzJmK9okTJyI+Ph7A4xuv7tu3DwsXLsSiRYvQtWtXJCYmYsCAAQ0eFxERNdyLvsu1adWqVXBwcMCaNWtQWFgI4PFt1+bNm4ePP/5Yo5pqX0f4RFlZGR48eABbW1uVSyiMHa8jJDJcvI7w+esYMOITrZwsk/X1IoP/DnxyVmtjx6jxyTLW1tZKp7QSERE1JW2FNB8qSEREBk0XJ2w+TW+XTxARETWErk7YfIJBSEREBk1XJ2w+wSAkIiKDJ5VKMW7cOIwbNw6Adk/YVPs3wkmTJiE1NbVRKyUiImoMa2trODg4aOWqBbWDsLy8HP7+/ujWrRuWL1+OgoKCRg+CiIhIX9QOwqSkJBQUFGDWrFnYv38/OnfujMDAQBw4cACPHj3SxRiJiIh0RqPLJ2xtbREaGgqZTIbTp0/j5ZdfRnBwMNq3b4/w8HBcvXpV2+MkIiLSiUZdR1hYWIjk5GQkJyfD1NQUw4YNw6VLl+Dq6oo1a9Zoa4xEREQ6o3YQPnr0CElJSRg+fDicnJywf/9+hIeHo7CwELt27UJycjL27NmDpUuX6mK8REQkcqWlpdi2bRsiIyNx9+5dAMC5c+c0PmdF7csn2rVrh9raWowdOxanT59Gnz59VPoEBASgVatWGg2IiIioPhcuXMDgwYNhbW2NGzduYNq0aWjdujUOHTqE33//XfG0InWoPSNcs2YNbt26hQ0bNtQZggBgY2ODvLw8tQdDRET0PBEREZg0aRKuXr0KS8v/v7l4YGCgxpf2qT0jDA4O1mhFREREjXXmzBls3rxZpb1Dhw6KZ9SqizfdJiIio2Fpaal4/NLTrly5Ajs7O41qMgiJiMhojBw5EkuXLlVcty6RSJCfn4/58+fjvffe06gmg5CIiIzGqlWrcPv2bbRt2xYPHjzAoEGD8PLLL+Oll17CsmXLNKrJm24TEZHRsLKyQnp6Ok6dOoVz586htrYWffv2xeDBgzWuySAkIiKjUF1dDUtLS+Tk5ODNN9/Em2++qZW6PDRKRERGwczMDE5OTqipqdFqXQYhEREZjYULFyrdUUYbeGiUiIiMxrp16/Dbb7+hffv2cHJyQosWLZQ+P3funNo1GYRERGQ0Ro0apfWaDEIiIjIaS5Ys0XpN/kZIRESixhkhEREZDRMTE0gkkno/1+SMUgYhEREZjUOHDim9f/ToEWQyGXbt2oXo6GiNajIIiYjIaIwcOVKl7f3330fPnj2RmJiIKVOmqF2TvxESEZHRGzBgAE6ePKnRsgxCIiIyag8ePMD69evRsWNHjZbnoVEiIjIaNjY2SifLCIKA8vJyNG/eHF988YVGNRmERERkNNasWaMUhCYmJrCzs8OAAQNgY2OjUU0GIRERGY0333wTnTp1qvMSivz8fDg6Oqpdk78REhGR0XB2dsbt27dV2u/cuQNnZ2eNajIIiYjIaAiCUGd7RUUFLC0tNarJQ6NERGTwIiIiAAASiQSLFy9G8+bNFZ/V1NQgKysLffr00ai23meEGzduhLOzMywtLeHh4YG0tLR6+xYWFmLcuHHo3r07TExMEBYWptInPj4eEolE5fXw4UMdbgUREemSTCaDTCaDIAi4ePGi4r1MJsMvv/yC3r17Iz4+XqPaep0RJiYmIiwsDBs3boSvry82b96MwMBAXL58uc4fPCsrK2FnZ4cFCxZgzZo19da1srLClStXlNo0nTITEZH+fffddwCAyZMnY+3atbCystJabb3OCFevXo0pU6Zg6tSp6NGjB2JjY9GpUyfExcXV2b9z585Yu3YtJkyYAGtr63rrSiQSODg4KL2IiMj47dy5U6shCOhxRlhVVYXs7GzMnz9fqd3f3x8ZGRmNql1RUQEnJyfU1NSgT58++OSTT+Du7l5v/8rKSlRWVirey+XyRq2fiIh058yZM9i/fz/y8/NRVVWl9NnBgwfVrqe3GWFJSQlqampgb2+v1G5vb4+ioiKN67q4uCA+Ph5Hjx5FQkICLC0t4evri6tXr9a7TExMDKytrRWvTp06abx+IiLSnX379sHX1xeXL1/GoUOH8OjRI1y+fBmnTp167pHC59H7yTLPXhQpCMJznzX1Il5eXhg/fjx69+4NPz8/fPXVV3jllVewfv36epeJjIxEWVmZ4nXz5k2N109ERLqzfPlyrFmzBt988w2kUinWrl2L3NxcjB49WqOL6QE9BmGbNm1gamqqMvsrLi5WmSU2homJCfr16/fcGaGFhQWsrKyUXkREZHiuXbuGt99+G8Dj7+579+5BIpEgPDwcW7Zs0aim3oJQKpXCw8MDKSkpSu0pKSnw8fHR2noEQUBOTg7atWuntZpERKQfrVu3Rnl5OQCgQ4cO+PnnnwEApaWluH//vkY19Xr5REREBIKDg+Hp6Qlvb29s2bIF+fn5CAkJAfD4kGVBQQF2796tWCYnJwfA4xNibt++jZycHEilUri6ugIAoqOj4eXlhW7dukEul2PdunXIycnBhg0bmnz7iIhIu/z8/JCSkgI3NzeMHj0aoaGhOHXqFFJSUvDWW29pVFOvQRgUFIQ7d+5g6dKlKCwsRK9evXDs2DE4OTkBeHwBfX5+vtIyT5/9mZ2djb1798LJyQk3btwA8PivgunTp6OoqAjW1tZwd3dHamoq+vfv32TbRUREuvH5558rbpASGRkJc3NzpKen409/+hMWLVqkUU2JUN+N20RMLpfD2toaZWVlRvd74WvvrdL3EIh0Kj1pjr6HoLam+E55so4BIz6BmXnjbiBS/eghsr5eZHDfgdXV1fjyyy8REBCg1evD9X7WKBERUUOYmZnhL3/5i9J139rAICQiIqMxYMAAyGQyrdbk0yeIiMhofPTRR/j444/xn//8Bx4eHmjRooXS56+++qraNRmERERkNIKCggAAs2fPVrRJJBLFzVhqamrUrskgJCIio5GXl6f1mgxCIiIyGk8ur9MmnixDRERGZc+ePfD19UX79u3x+++/AwBiY2Nx5MgRjeoxCImIyGjExcUhIiICw4YNQ2lpqeI3wVatWiE2NlajmgxCIiIyGuvXr8fWrVuxYMECmJqaKto9PT1x8eJFjWoyCImIyGjk5eXV+aD1J0+i0ASDkIiIjIazs7Pi4QtPO378uOLhC+riWaNERGQ05s6di5kzZ+Lhw4cQBAGnT59GQkICYmJisG3bNo1qMgiJiMhoTJ48GdXV1Zg3bx7u37+PcePGoUOHDli7di3GjBmjUU0GIRERGZVp06Zh2rRpKCkpQW1tLdq2bduoegxCIiIyOsXFxbhy5QokEgkkEgns7Ow0rsWTZYiIyGjI5XIEBwejffv2GDRoEAYOHIj27dtj/PjxKCsr06gmg5CIiIzG1KlTkZWVhX/9618oLS1FWVkZvvnmG5w9exbTpk3TqCYPjRIRkdH417/+hRMnTuC1115TtAUEBGDr1q0YOnSoRjU5IyQiIqNha2sLa2trlXZra2vY2NhoVJNBSERERmPhwoWIiIhAYWGhoq2oqAhz587FokWLNKrJQ6NERGQ04uLi8Ntvv8HJyQmOjo4AgPz8fFhYWOD27dvYvHmzou+5c+caVJNBSERERmPUqFFar8kgJCIio7FkyRKt12QQEhGRUaqoqEBtba1Sm5WVldp1eLIMEREZjby8PLz99tto0aKF4kxRGxsbtGrVSuOzRjkjJCIio/HBBx8AAHbs2AF7e3tIJJJG12QQEhGR0bhw4QKys7PRvXt3rdXkoVEiIjIa/fr1w82bN7VakzNCIiIyGtu2bUNISAgKCgrQq1cvmJubK33+6quvql2TQUhEREbj9u3buHbtGiZPnqxok0gkEAQBEokENTU1atdkEBIRkdH48MMP4e7ujoSEBJ4sQ0RE4vP777/j6NGjePnll7VWkyfLEBGR0XjzzTdx/vx5rdbkjJCIiIzGiBEjEB4ejosXL8LNzU3lZJl33nlH7ZoMQiIiMhohISEAgKVLl6p8punJMno/NLpx40Y4OzvD0tISHh4eSEtLq7dvYWEhxo0bh+7du8PExARhYWF19ktKSoKrqyssLCzg6uqKQ4cO6Wj0RETUlGpra+t9aRKCgJ6DMDExEWFhYViwYAFkMhn8/PwQGBiI/Pz8OvtXVlbCzs4OCxYsQO/evevsk5mZiaCgIAQHB+P8+fMIDg7G6NGjkZWVpctNISKiJvbw4UOt1NFrEK5evRpTpkzB1KlT0aNHD8TGxqJTp06Ii4urs3/nzp2xdu1aTJgwAdbW1nX2iY2NxZAhQxAZGQkXFxdERkbirbfeQmxsrA63hIiImkJNTQ0++eQTdOjQAS1btsT169cBAIsWLcL27ds1qqm3IKyqqkJ2djb8/f2V2v39/ZGRkaFx3czMTJWaAQEBz61ZWVkJuVyu9CIiIsOzbNkyxMfH4x//+AekUqmi3c3NDdu2bdOopt6CsKSkBDU1NbC3t1dqt7e3R1FRkcZ1i4qK1K4ZExMDa2trxatTp04ar5+IiHRn9+7d2LJlCz744AOYmpoq2l999VX88ssvGtXU+8kyz94V4MltcpqyZmRkJMrKyhQvbd/QlYiItKOgoKDOi+lra2vx6NEjjWrq7fKJNm3awNTUVGWmVlxcrDKjU4eDg4PaNS0sLGBhYaHxOomIqGn07NkTaWlpcHJyUmrfv38/3N3dNaqptxmhVCqFh4cHUlJSlNpTUlLg4+OjcV1vb2+VmsnJyY2qSURE+vXhhx+ivLwcS5YswaxZs7By5UrU1tbi4MGDmDZtGpYvX47FixdrVFuvh0YjIiKwbds27NixA7m5uQgPD0d+fr7igsnIyEhMmDBBaZmcnBzk5OSgoqICt2/fRk5ODi5fvqz4PDQ0FMnJyVi5ciV++eUXrFy5EidPnqz3mkMiIjJ8u3btwoMHDzBixAgkJibi2LFjkEgkWLx4MXJzc/H1119jyJAhGtXW651lgoKCcOfOHSxduhSFhYXo1asXjh07ppjyFhYWqlxT+PTUNzs7G3v37oWTkxNu3LgBAPDx8cG+ffuwcOFCLFq0CF27dkViYiIGDBjQZNtFRETaJQiC4t8BAQEICAjQWm2932Lto48+wkcffVTnZ/Hx8SptT++M+rz//vt4//33Gzs0IiIyINp45FJd9B6EREREDfHKK6+8MAzv3r2rdl0GIRERGYXo6Oh67yrWGAxCIiIyCmPGjEHbtm21XlfvF9QTERG9iK5+HwQYhEREZAQacqKkpnholIiIDF5tba3OanNGSEREosYgJCIiUWMQEhGRqDEIiYhI1BiEREQkagxCIiISNQYhERGJGoOQiIhEjUFIRESixiAkIiJRYxASEZGoMQiJiEjUGIRERCRqDEIiIhI1BiEREYkag5CIiESNQUhERKLGICQiIlFjEBIRkagxCImISNQYhEREJGoMQiIiEjUGIRERiRqDkIiIRI1BSEREosYgJCIiUWMQEhGRqDEIiYhI1BiEREQkanoPwo0bN8LZ2RmWlpbw8PBAWlrac/v/8MMP8PDwgKWlJbp06YJNmzYpfR4fHw+JRKLyevjwoS43g4iIjJRegzAxMRFhYWFYsGABZDIZ/Pz8EBgYiPz8/Dr75+XlYdiwYfDz84NMJsPf//53zJ49G0lJSUr9rKysUFhYqPSytLRsik0iIiIjY6bPla9evRpTpkzB1KlTAQCxsbE4ceIE4uLiEBMTo9J/06ZNcHR0RGxsLACgR48eOHv2LFatWoX33ntP0U8ikcDBwaFJtoGIiIyb3maEVVVVyM7Ohr+/v1K7v78/MjIy6lwmMzNTpX9AQADOnj2LR48eKdoqKirg5OSEjh07Yvjw4ZDJZNrfACIi+kPQWxCWlJSgpqYG9vb2Su329vYoKiqqc5mioqI6+1dXV6OkpAQA4OLigvj4eBw9ehQJCQmwtLSEr68vrl69Wu9YKisrIZfLlV5ERCQOej00Cjw+jPk0QRBU2l7U/+l2Ly8veHl5KT739fVF3759sX79eqxbt67OmjExMYiOjtZo/IYmPWmOvodARGRU9DYjbNOmDUxNTVVmf8XFxSqzviccHBzq7G9mZgZbW9s6lzExMUG/fv2eOyOMjIxEWVmZ4nXz5k01t4aIiIyV3oJQKpXCw8MDKSkpSu0pKSnw8fGpcxlvb2+V/snJyfD09IS5uXmdywiCgJycHLRr167esVhYWMDKykrpRURE4qDXyyciIiKwbds27NixA7m5uQgPD0d+fj5CQkIAPJ6pTZgwQdE/JCQEv//+OyIiIpCbm4sdO3Zg+/btmDPn/w8HRkdH48SJE7h+/TpycnIwZcoU5OTkKGoSERE9Ta+/EQYFBeHOnTtYunQpCgsL0atXLxw7dgxOTk4AgMLCQqVrCp2dnXHs2DGEh4djw4YNaN++PdatW6d06URpaSmmT5+OoqIiWFtbw93dHampqejfv3+Tbx8RERk+ifDkbBNSkMvlsLa2RllZGQ+TElGjNcV3ypN1DBjxCczMG3cDkepHD5H19SLRfAfq/RZrRERE+sQgJCIiUWMQEhGRqDEIiYhI1BiEREQkagxCIiISNQYhERGJGoOQiIhEjUFIRESixiAkIiJRYxASEZGoMQiJiEjUGIRERCRqDEIiIhI1BiEREYkag5CIiESNQUhERKLGICQiIlFjEBIRkagxCImISNQYhEREJGoMQiIiEjUGIRERiRqDkIiIRI1BSEREosYgJCIiUWMQEhGRqDEIiYhI1BiEREQkagxCIiISNQYhERGJGoOQiIhEjUFIRESixiAkIiJRYxASEZGo6T0IN27cCGdnZ1haWsLDwwNpaWnP7f/DDz/Aw8MDlpaW6NKlCzZt2qTSJykpCa6urrCwsICrqysOHTqkq+ETEZEali1bBh8fHzRv3hytWrXS93AA6DkIExMTERYWhgULFkAmk8HPzw+BgYHIz8+vs39eXh6GDRsGPz8/yGQy/P3vf8fs2bORlJSk6JOZmYmgoCAEBwfj/PnzCA4OxujRo5GVldVUm0VERPWoqqrCn//8Z/zlL3/R91AUJIIgCPpa+YABA9C3b1/ExcUp2nr06IFRo0YhJiZGpf/f/vY3HD16FLm5uYq2kJAQnD9/HpmZmQCAoKAgyOVyHD9+XNFn6NChsLGxQUJCQoPGJZfLYW1tjbKyMlhZWWm6eUREAJrmO+XJOgaM+ARm5paNqlX96CGyvl6k0/HGx8cjLCwMpaWlOqmvDr3NCKuqqpCdnQ1/f3+ldn9/f2RkZNS5TGZmpkr/gIAAnD17Fo8ePXpun/pqEhGRuJnpa8UlJSWoqamBvb29Uru9vT2KiorqXKaoqKjO/tXV1SgpKUG7du3q7VNfTQCorKxEZWWl4n1ZWRmAx39hERE11pPvkqY4AFfz6KHWajz7HWhhYQELC4tG1zc0egvCJyQSidJ7QRBU2l7U/9l2dWvGxMQgOjpapb1Tp071D5yISE137tyBtbW1TmpLpVI4ODjg7LfLtFKvZcuWKt+BS5YsQVRUlErfqKioOr9Dn3bmzBl4enpqZWzaprcgbNOmDUxNTVVmasXFxSozuiccHBzq7G9mZgZbW9vn9qmvJgBERkYiIiJC8b60tBROTk7Iz8/X2X+0uiCXy9GpUyfcvHnT6H7bNNaxc9xNy1jHXVZWBkdHR7Ru3Vpn67C0tEReXh6qqqq0Uq+uCUR9s8FZs2ZhzJgxz63XuXNnrYxLF/QWhFKpFB4eHkhJScG7776raE9JScHIkSPrXMbb2xtff/21UltycjI8PT1hbm6u6JOSkoLw8HClPj4+PvWOpb7pvrW1tVH9z/aElZWVUY4bMN6xc9xNy1jHbWKi29MyLC0tYWnZuBNlNNGmTRu0adOmyderLXo9NBoREYHg4GB4enrC29sbW7ZsQX5+PkJCQgA8nqkVFBRg9+7dAB6fIfr5558jIiIC06ZNQ2ZmJrZv3650NmhoaCgGDhyIlStXYuTIkThy5AhOnjyJ9PR0vWwjERH9v/z8fNy9exf5+fmoqalBTk4OAODll19Gy5Yt9TMoQc82bNggODk5CVKpVOjbt6/www8/KD6bOHGiMGjQIKX+33//veDu7i5IpVKhc+fOQlxcnErN/fv3C927dxfMzc0FFxcXISkpSa0xlZWVCQCEsrIyjbZJX4x13IJgvGPnuJsWx238Jk6cKABQeX333Xd6G5Peg9AQPXz4UFiyZInw8OFDfQ9FLcY6bkEw3rFz3E2L4yZd0OsF9URERPqm93uNEhER6RODkIiIRI1BSEREoiaaIDTWxz1pe9zx8fGQSCQqr4cPG39bJk3HXVhYiHHjxqF79+4wMTFBWFhYnf0MbX83ZNyGuL8PHjyIIUOGwM7ODlZWVvD29saJEydU+jXV48y0PXZD3Ofp6enw9fWFra0tmjVrBhcXF6xZs0alHx8hpyf6PlunKezbt08wNzcXtm7dKly+fFkIDQ0VWrRoIfz+++919r9+/brQvHlzITQ0VLh8+bKwdetWwdzcXDhw4ICiT0ZGhmBqaiosX75cyM3NFZYvXy6YmZkJP/30k0GPe+fOnYKVlZVQWFio9NImdcedl5cnzJ49W9i1a5fQp08fITQ0VKWPIe7vhozbEPd3aGiosHLlSuH06dPCr7/+KkRGRgrm5ubCuXPnFH2aYn/rauyGuM/PnTsn7N27V/j555+FvLw8Yc+ePULz5s2FzZs3K/o01T4nVaIIwv79+wshISFKbS4uLsL8+fPr7D9v3jzBxcVFqW3GjBmCl5eX4v3o0aOFoUOHKvUJCAgQxowZo6VR62bcO3fuFKytrbU2xrqoO+6nDRo0qM5AMcT9/bT6xm3o+/sJV1dXITo6WvG+Kfa3IOhm7Mayz999911h/PjxivdNtc9J1R/+0KixPu5JV+MGgIqKCjg5OaFjx44YPnw4ZDKZVsas6bgbwhD3d0MZ+v6ura1FeXm50n0wm+JxZroaO2D4+1wmkyEjIwODBg1StPERcvrzhw9CXTzu6Xl9nve4J0MYt4uLC+Lj43H06FEkJCTA0tISvr6+uHr1qt7G3RCGuL8bwhj292effYZ79+5h9OjRijZd729Ad2M35H3esWNHWFhYwNPTEzNnzsTUqVMVnzXFPqe66f0xTE3FEB73pAltj9vLywteXl6Kz319fdG3b1+sX78e69at09awdbJvDHF/v4ih7++EhARERUXhyJEjaNu2rVZqqkvbYzfkfZ6WloaKigr89NNPmD9/Pl5++WWMHTu2UTWp8f7wQWhIj3syhHE/y8TEBP369dPaX8uajLshDHF/a8KQ9ndiYiKmTJmC/fv3Y/DgwUqf6Xp/A7ob+7MMaZ87OzsDANzc3PDf//4XUVFRiiBsin1OdfvDHxp9+nFPT0tJSan30UxPHuX0tPoe9/Rsn+c97skQxv0sQRCQk5ODdu3a6W3cDWGI+1sThrK/ExISMGnSJOzduxdvv/22yue63t+A7sb+LEPZ53WNq7KyUvG+KfY51aPJT8/RgyenOm/fvl24fPmyEBYWJrRo0UK4ceOGIAiCMH/+fCE4OFjR/8llCOHh4cLly5eF7du3q1yG8OOPPwqmpqbCihUrhNzcXGHFihU6O51fm+OOiooSvv32W+HatWuCTCYTJk+eLJiZmQlZWVl6G7cgCIJMJhNkMpng4eEhjBs3TpDJZMKlS5cUnxvi/m7IuA1xf+/du1cwMzMTNmzYoHR5QWlpqaJPU+xvXY3dEPf5559/Lhw9elT49ddfhV9//VXYsWOHYGVlJSxYsEDRp6n2OakSRRAKgmE+7kkf4w4LCxMcHR0FqVQq2NnZCf7+/kJGRobex406Hsvi5OSk1McQ9/eLxm2I+3vQoEF1jnvixIlKNZtif+ti7Ia4z9etWyf07NlTaN68uWBlZSW4u7sLGzduFGpqapRqNtU+J2V8+gQREYnaH/43QiIioudhEBIRkagxCImISNQYhEREJGoMQiIiEjUGIRERiRqDkIiIRI1BSEREosYgJCIiUWMQEqlp+/btKg9QVVdxcTHs7OxQUFCgpVERkaZ4izUiNVRWVqJLly7Yt28f/Pz8GlUrIiICcrkc27Zt09LoiEgTnBESqSEpKQktW7ZsdAgCwOTJk/Hll1/if//7nxZGRkSaYhCSKN2+fRsODg5Yvny5oi0rKwtSqRTJycn1Lrdv3z688847Sm2TJk3CqFGjsHz5ctjb26NVq1aIjo5GdXU15s6di9atW6Njx47YsWOH0nJubm5wcHDAoUOHtLtxRKQWBiGJkp2dHXbs2IGoqCicPXsWFRUVGD9+PD766KPn/v6XlpYGT09PlfZTp07h1q1bSE1NxerVqxEVFYXhw4fDxsYGWVlZCAkJQUhICG7evKm0XP/+/ZGWlqb17SOihuNvhCRqM2fOxMmTJ9GvXz+cP38eZ86cgaWlZZ19S0tLYWNjg9TUVKVDo5MmTcL333+P69evw8Tk8d+WLi4uaNu2LVJTUwEANTU1sLa2xrZt2zBmzBjFshEREZDJZPjuu+90uJVE9DycEZKorVq1CtXV1fjqq6/w5Zdf1huCAPDgwQMAqLNPz549FSEIAPb29nBzc1O8NzU1ha2tLYqLi5WWa9asGe7fv9/YzSCiRmAQkqhdv34dt27dQm1tLX7//ffn9rW1tYVEIqnz5BZzc3Ol9xKJpM622tpapba7d+/Czs5Ow9ETkTYwCEm0qqqq8MEHHyAoKAiffvoppkyZgv/+97/19pdKpXB1dcXly5e1Noaff/4Z7u7uWqtHROpjEJJoLViwAGVlZVi3bh3mzZuHHj16YMqUKc9dJiAgAOnp6VpZ//3795Gdnd3oi/OJqHEYhCRK33//PWJjY7Fnzx5YWVnBxMQEe/bsQXp6OuLi4updbtq0aTh27BjKysoaPYYjR47A0dFRK9ckEpHmeNYokZpGjx4Nd3d3REZGNqpO//79ERYWhnHjxmlpZESkCc4IidT0z3/+Ey1btmxUjeLiYrz//vsYO3aslkZFRJrijJCIiESNM0IiIhI1BiEREYkag5CIiESNQUhERKLGICQiIlFjEBIRkagxCImISNQYhEREJGoMQiIiErX/A0U4A2jJUUKvAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Step 2.1: set initial condition (Note the order of nx and ny)\n", "T = np.zeros((ny, nx)) # a numpy array with all elements equal to zero\n", "\n", "# Step 2.2: visualize initial temperature distribution\n", "plt.figure() # create a new figure\n", "cs = plt.contourf(x, y, T, levels=20)\n", "plt.xlabel('x (m)')\n", "plt.ylabel('y (m)')\n", "plt.axis('scaled')\n", "ax = plt.gca()\n", "ax.set_xlim(0, 0.3)\n", "ax.set_ylim(0, 0.4)\n", "cbar = plt.colorbar(cs) # add color bar to the figure\n", "cbar.ax.set_ylabel('Temperature (degree Celsius)')\n", "plt.show() # show the figure" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question**: How come the contour is shown only in the middle of the domain?" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration 10: Tdiff = 71.3782\n", "Iteration 20: Tdiff = 39.7494\n", "Iteration 30: Tdiff = 22.2378\n", "Iteration 40: Tdiff = 12.4416\n", "Iteration 50: Tdiff = 6.9609\n", "Iteration 60: Tdiff = 3.8945\n", "Iteration 70: Tdiff = 2.1789\n", "Iteration 80: Tdiff = 1.2190\n", "Iteration 90: Tdiff = 0.6820\n", "Iteration 100: Tdiff = 0.3816\n", "Iteration 110: Tdiff = 0.2135\n", "Iteration 120: Tdiff = 0.1194\n", "Iteration 130: Tdiff = 0.0668\n", "Iteration 140: Tdiff = 0.0374\n", "Iteration 150: Tdiff = 0.0209\n", "Iteration 160: Tdiff = 0.0117\n", "Iteration 170: Tdiff = 0.0065\n", "Iteration 180: Tdiff = 0.0037\n", "Iteration 190: Tdiff = 0.0020\n", "Iteration 200: Tdiff = 0.0011\n", "******************************************\n", "Final temperature difference: 0.0010\n", "Number of iterations: 203\n", "Elapsed time: 0.004 seconds\n" ] } ], "source": [ "# Step 3: finite volume calculations\n", "Told = np.zeros((ny, nx)) # placeholder array to advance the solution\n", "Tdiff = 1 # temperature difference for convergence\n", "cnt = 0 # counter for the number of iterations\n", "t_start = time.perf_counter() # start time for performance measurement\n", "\n", "while Tdiff > 1e-3: # loop until the difference is less than 1e-3\n", " cnt += 1 # increment the counter\n", " Told = T.copy() # copy the existing (old) values of T into Told\n", "\n", " for row in range(ny):\n", " for col in range(nx):\n", " # left-bottom corner\n", " if row == 0 and col == 0:\n", " T[row, col] = ((k*area/dx)*Told[row+1, col] + ((k*area/dx))*Told[row, col+1] + q*area + area*Tinf/(1/h + dx/(2*k))) / (2*k*area/dx + area/(1/h + dx/(2*k)))\n", " # right-bottom corner\n", " elif row == 0 and col == nx-1:\n", " T[row, col] = ((k*area/dx)*Told[row+1, col] + (k*area/dx)*Told[row, col-1] + area/(1/h + dx/(2*k))*Tinf) / (2*k*area/dx + area/(1/h + dx/(2*k)))\n", " # left-top corner\n", " elif row == ny-1 and col == 0:\n", " T[row, col] = ((k*area/dx)*Told[row-1, col] + (k*area/dx)*Told[row, col+1] + (q*area + 2*k*area/dx*Tn)) / (4*k*area/dx)\n", " # right-top corner\n", " elif row == ny-1 and col == nx-1:\n", " T[row, col] = ((k*area/dx)*Told[row-1, col] + (k*area/dx)*Told[row, col-1] + (2*k*area/dx*Tn)) / (4*k*area/dx)\n", " # left boundary\n", " elif col == 0:\n", " T[row, col] = ((k*area/dx)*Told[row-1, col] + (k*area/dx)*Told[row+1, col] + (k*area/dx)*Told[row, col+1] + q*area) / (3*k*area/dx)\n", " # right boundary\n", " elif col == nx-1:\n", " T[row, col] = ((k*area/dx)*Told[row-1, col] + (k*area/dx)*Told[row+1, col] + (k*area/dx)*Told[row, col-1]) / (3*k*area/dx)\n", " # bottom boundary\n", " elif row == 0:\n", " T[row, col] = ((k*area/dx)*Told[row, col-1] + (k*area/dx)*Told[row, col+1] + (k*area/dx)*Told[row+1, col] + (area*Tinf/(1/h + dx/(2*k)))) / (3*k*area/dx + area/(1/h + dx/(2*k)))\n", " # top boundary\n", " elif row == ny-1:\n", " T[row, col] = ((k*area/dx)*Told[row, col-1] + (k*area/dx)*Told[row, col+1] + (k*area/dx)*Told[row-1, col] + (2*k*area/dx*Tn)) / (5*k*area/dx)\n", " # internal nodes\n", " else:\n", " T[row, col] = 0.25 * (Told[row, col-1] + Told[row, col+1] + Told[row-1, col] + Told[row+1, col])\n", " \n", " # calculate the difference between the new and the old temperature distributions\n", " Tdiff = np.sum(np.abs(T - Told))\n", " if cnt % 10 == 0: # print every 100 iterations\n", " print('Iteration {}: Tdiff = {:.4f}'.format(cnt, Tdiff))\n", "\n", "\n", "# stop the timer and print the iteration results\n", "t_end = time.perf_counter()\n", "print('******************************************')\n", "print('Final temperature difference: {:.4f}'.format(Tdiff))\n", "print('Number of iterations: {}'.format(cnt))\n", "print('Elapsed time: {:.3f} seconds'.format(t_end - t_start))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcgAAAG2CAYAAAD7iRZbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZJBJREFUeJzt3XlcVPX+P/DXsCsCAgpICuKKiCEiiriXgZSabWImqWnKNzcg7UpaoKVk19TMLU1FLZUUUW6ZidcUCNwQXHIrxTCFi0uCgLKe3x/+mBxmgJlh9nk9H4953ObMZz7zOXNrXrw/53POEQmCIICIiIgkmGh7AERERLqIAUlERCQDA5KIiEgGBiQREZEMDEgiIiIZGJBEREQyMCCJiIhkYEASERHJwIAkIiKSgQFJREQkg9YDcu3atfDw8ICVlRX8/PyQlpYm1/t+/fVXmJmZoWfPnlKvJSYmwsvLC5aWlvDy8kJSUpKKR01ERAAQFxcHf39/2NjYwMnJCaNHj8aVK1ek2l26dAmjRo2CnZ0dbGxsEBAQgLy8PKl2giAgJCQEIpEI+/bt08Ae1E+rAZmQkICIiAjMnz8f2dnZGDhwIEJCQmR+aU8rKirC22+/jeeff17qtczMTISGhiIsLAxnz55FWFgYxowZgxMnTqhrN4iIjNaxY8cwffp0HD9+HCkpKaiqqkJQUBBKS0vFba5du4YBAwbA09MTR48exdmzZ/HRRx/ByspKqr+VK1dCJBJpchfqJdLmxcr79u2LXr16Yd26deJt3bp1w+jRoxEXF1fv+8aOHYvOnTvD1NQU+/btQ05Ojvi10NBQFBcX46effhJvGz58OOzt7bFz50617AcRET1x584dODk54dixYxg0aBCAJ7/Z5ubm2L59e4PvPXv2LEaMGIFTp06hTZs2SEpKwujRozUwatnMtPXBFRUVyMrKwrx58yS2BwUFISMjo973bdmyBdeuXcO3336LTz/9VOr1zMxMREZGSmwLDg7GypUr6+2zvLwc5eXl4uc1NTW4f/8+HB0ddeYvGSLSX4Ig4OHDh3B1dYWJifom7h4/foyKigqV9CUIgtTvn6WlJSwtLRt8X1FREQDAwcEBwJPf0x9//BEffPABgoODkZ2dDQ8PD0RHR0uEX1lZGd58802sXr0aLi4uKtmHJhO05NatWwIA4ddff5XYvnjxYqFLly4y33P16lXByclJuHLliiAIghATEyP4+PhItDE3Nxe+++47iW3fffedYGFhUe9YYmJiBAB88MEHH2p93Lx5U4lfS/k8evRIcHIyUdlYW7RoIbUtJiamwTHU1NQII0eOFAYMGCDelp+fLwAQmjdvLixfvlzIzs4W4uLiBJFIJBw9elTcburUqcLkyZPFzwEISUlJqv6aFKK1CrJW3b9QBBl/tQBAdXU1xo0bh4ULF6JLly4q6bNWdHQ0oqKixM+Liorg5uaGmzdvwtbWVp7dICKqV3FxMdq1awcbGxu1fUZFRQUKC2tw7pQLbGyaNvP18KGAZ/0LpH4DG6seZ8yYgXPnziE9PV28raamBgDw8ssvi2f3evbsiYyMDKxfvx6DBw9GcnIyjhw5guzs7CaNW9W0FpCtWrWCqakpCgoKJLYXFhbC2dlZqv3Dhw9x+vRpZGdnY8aMGQCefPGCIMDMzAyHDh3Cc889BxcXF7n7rFXftIGtrS0DkohURhOHbGxsRLCxaeo07pNQU+Q3cObMmUhOTkZqairatm0r3t6qVSuYmZnBy8tLon23bt3EQXrkyBFcu3YNLVu2lGjz2muvYeDAgTh69Kjyu9IEWlvFamFhAT8/P6SkpEhsT0lJQWBgoFR7W1tbnD9/Hjk5OeJHeHg4unbtipycHPTt2xcA0K9fP6k+Dx06JLNPIiJqGkEQMGPGDOzduxdHjhyBh4eHxOsWFhbw9/eXOvXj6tWrcHd3BwDMmzcP586dk/h9B4AVK1Zgy5YtGtkPWbQ6xRoVFYWwsDD07t0b/fr1w4YNG5CXl4fw8HAAT6Y+b926hW3btsHExATe3t4S73dycoKVlZXE9tmzZ2PQoEFYunQpXn75Zezfvx+HDx+WKPmJiEg1pk+fjh07dmD//v2wsbERz+DZ2dmhWbNmAIC5c+ciNDQUgwYNwtChQ3Hw4EH85z//EVeGLi4uMhfmuLm5SQWuJmk1IENDQ3Hv3j0sWrQI+fn58Pb2xoEDB8R/VeTn5zd6TmRdgYGB2LVrFxYsWICPPvoIHTt2REJCgrjCJCIi1ak9TW/IkCES27ds2YKJEycCAF555RWsX78ecXFxmDVrFrp27YrExEQMGDBAw6NVjFbPg9RVxcXFsLOzQ1FREY9BElGTaeI3pfYzci+3afIxyIcPa+DhmW/0v4Fav9QcERGRLmJAEhERycCAJCIikoEBSUREJAMDkoiISAYGJBERkQwMSCIiIhkYkERERDIwIImIiGRgQBIREcnAgCQiIpKBAUlERCQDA5KIiEgGBiQREZEMWr0fJBERqdb1SnNYVzat9imtrFHRaPQbK0giIiIZGJBEREQyMCCJiIhkYEASERHJwIAkIiKSgQFJREQkAwOSiIhIBgYkERGRDAxIIiIiGRiQREREMjAgiYiIZGBAEhERycCAJCIikoEBSUREJAMDkoiISAYGJBERKS0uLg7+/v6wsbGBk5MTRo8ejStXrtTbftq0aRCJRFi5cqXE9oKCAoSFhcHFxQXW1tbo1asX9uzZo+bRN4wBSURESjt27BimT5+O48ePIyUlBVVVVQgKCkJpaalU23379uHEiRNwdXWVei0sLAxXrlxBcnIyzp8/j1dffRWhoaHIzs7WxG7IxIAkIiKlHTx4EBMnTkT37t3h4+ODLVu2IC8vD1lZWRLtbt26hRkzZuC7776Dubm5VD+ZmZmYOXMm+vTpgw4dOmDBggVo2bIlzpw5o6ldkcKAJCIimYqLiyUe5eXljb6nqKgIAODg4CDeVlNTg7CwMMydOxfdu3eX+b4BAwYgISEB9+/fR01NDXbt2oXy8nIMGTJEJfuiDDOtfTIREancH5Wt0ayiaT/tjyqrAOShXbt2EttjYmIQGxtb7/sEQUBUVBQGDBgAb29v8falS5fCzMwMs2bNqve9CQkJCA0NhaOjI8zMzNC8eXMkJSWhY8eOTdqXptB6Bbl27Vp4eHjAysoKfn5+SEtLq7dteno6+vfvD0dHRzRr1gyenp5YsWKFRJv4+HiIRCKpx+PHj9W9K0REBuXmzZsoKioSP6KjoxtsP2PGDJw7dw47d+4Ub8vKysKXX34p/m2uz4IFC/D333/j8OHDOH36NKKiovDGG2/g/PnzKtsfRWm1gkxISEBERATWrl2L/v374+uvv0ZISAguXrwINzc3qfbW1taYMWMGnn32WVhbWyM9PR3Tpk2DtbU1pk6dKm5na2srtYrKyspK7ftDRGRIbG1tYWtrK1fbmTNnIjk5GampqWjbtq14e1paGgoLCyV+06urq/H+++9j5cqVuHHjBq5du4bVq1fjwoUL4ilYHx8fpKWlYc2aNVi/fr1qd0xOWg3I5cuXY/LkyZgyZQoAYOXKlfj555+xbt06xMXFSbX39fWFr6+v+Hn79u2xd+9epKWlSQSkSCSCi4uL+neAiMjICYKAmTNnIikpCUePHoWHh4fE62FhYRg2bJjEtuDgYISFhWHSpEkAgLKyMgCAiYnkpKapqSlqamrUOPqGaS0gKyoqkJWVhXnz5klsDwoKQkZGhlx9ZGdnIyMjA59++qnE9pKSEri7u6O6uho9e/bEJ598IhGsdZWXl0scfC4uLlZgT4iIjNf06dOxY8cO7N+/HzY2NigoKAAA2NnZoVmzZnB0dISjo6PEe8zNzeHi4oKuXbsCADw9PdGpUydMmzYNy5Ytg6OjI/bt24eUlBT88MMPGt+nWloLyLt376K6uhrOzs4S252dncVfcH3atm2LO3fuoKqqCrGxseIKFHjyRcfHx6NHjx4oLi7Gl19+if79++Ps2bPo3LmzzP7i4uKwcOHCpu+UDnj+OenKuzFmf+vf8VmTv43vj5iau/e1PQSd8HPJVm0PgZ6ybt06AJBabbplyxZMnDhRrj7Mzc1x4MABzJs3DyNHjkRJSQk6deqErVu34sUXX1TxiOWn9VWsdQ/aCoLQ4IFc4MmcdklJCY4fP4558+ahU6dOePPNNwEAAQEBCAgIELft378/evXqha+++gqrVq2S2V90dDSioqLEz4uLi6VWbxmyKvt/js/qS1jW2P9zXMRYwtKklUODrzNASRsEQVD4PTdu3JDa1rlzZyQmJqpgRKqjtYBs1aoVTE1NparFwsJCqaqyrto57h49euB///sfYmNjxQFZl4mJCfz9/fH777/X25+lpSUsLS0V3APDxLDUXw0FKMOTSHFaO83DwsICfn5+SElJkdiekpKCwMBAufsRBKHBk1cFQUBOTg7atGmj9FiNVZW9lfihL2rsbcUP+odJK4d6H0Qkm1anWKOiohAWFobevXujX79+2LBhA/Ly8hAeHg7gydTnrVu3sG3bNgDAmjVr4ObmBk9PTwBPzotctmwZZs6cKe5z4cKFCAgIQOfOnVFcXIxVq1YhJycHa9as0fwOGhB9riyNuaqUBytPItm0GpChoaG4d+8eFi1ahPz8fHh7e+PAgQNwd3cHAOTn5yMvL0/cvqamBtHR0cjNzYWZmRk6duyIzz77DNOmTRO3efDgAaZOnYqCggLY2dnB19cXqamp6NOnj8b3z1DpW1hyClZ5PO5JxkwkKHOE1cAVFxfDzs4ORUVFcp8kqyuUWcWqKvoQlk9jWKqXusJTH1exauI3pfYzvj7jh2YtmnipuZIqTOuVpZe/gaqk9VWsZDhYWdLTOHVL+o4BSWpRG5b6EJQAw1LTOHVL+oABaWDK7c1h+Xeltochpm9VJcCw1AVcXUu6QOt38yDVK7c3Fz90CU8bIVUIaR+p7SGQkWAFaeBqQ1KXqkqAlSUR6T4GpJF4uppkWDYdz7EkMnwMSCPEsFSd+qZeGZxE+o8BaeR0dQoW0L+wfBqDk0j/MSAJgG5XlYB+h+XTGJxE+oMBSVL0JSz1OSjramiVLMOTFJFb7gRL86atYC8v173/7rWBAUkN0uWwNJSqsjGsOom0gwFJcuPxSt3C4CRSLwYkKUyXq0rAOMPyaZyuJVINBiQ1CcNSv7DqJJIfA5JURpenYAGGZUMYnETSGJAGptzuyeV1LYtqtDcGHa8qAYalvDhdS8aMAWmgdCEoAYalIWPVSYaOAWngaoMS0J2w1NWgBAzzHEtNY3CSoWBAGhFWlfJjVal6nK4lfcOANEK6WFUCDEtjxqqTdBED0sjpSlUJ6NcULMCw1ATeqJq0iQFJAFhVKoNhSWTYGJAkRRerSkB/wvJpDE4i/cWApHrpUlUJ6E9YPk1WcDI0ifQDA5LkoktVJaAfxyvrw2qTSD+YNN6E6B/ldibihy4otzcXP/Rdlb2V1INI18XFxcHf3x82NjZwcnLC6NGjceXKFYk2sbGx8PT0hLW1Nezt7TFs2DCcOHFC/Pr9+/cxc+ZMdO3aFc2bN4ebmxtmzZqFoqIiTe+OBN34lSO9pEtBCRhWWNaSFZoMTtIlx44dw/Tp03H8+HGkpKSgqqoKQUFBKC0tFbfp0qULVq9ejfPnzyM9PR3t27dHUFAQ7ty5AwC4ffs2bt++jWXLluH8+fOIj4/HwYMHMXnyZG3tFgBAJAiCoNUR6KDi4mLY2dmhqKgItrb6tczc/53lWv18XZmCraWPU7DKMqYp2p+zF2p7CArRxG9K7WfMywyBZYum/ZFYXlKJz/r9pNR479y5AycnJxw7dgyDBg1qcKyHDx/G888/L7PN7t27MX78eJSWlsLMTDtHA3kM0sBU2IrE/2xRrPm/fXT1WCVg+GHJY5ukasXFkhdqsLS0hKWlZYPvqZ0WdXBwkPl6RUUFNmzYADs7O/j4+DTYj62trdbCEWBAGrTasNRmUAIMS23jSlrjcqPMERYmFk3qo6KsAgDQrl07ie0xMTGIjY2t932CICAqKgoDBgyAt7e3xGs//PADxo4di7KyMrRp0wYpKSlo1aqVzH7u3buHTz75BNOmTWvSfjQVA9IIaDMoAd2rKgH9XgWrCqw2SR43b96UmGJtrHqcMWMGzp07h/T0dKnXhg4dipycHNy9excbN27EmDFjcOLECTg5OUm0Ky4uxksvvQQvLy/ExMSoZkeUxIA0Iroy/QroTlgaa1VZH1ab9DRbW1u5j0HOnDkTycnJSE1NRdu2baVet7a2RqdOndCpUycEBASgc+fO2LRpE6Kjo8VtHj58iOHDh6NFixZISkqCubn8x1LLy8tx8uRJ3LhxA2VlZWjdujV8fX3h4eEhdx91MSCNFKtKaQxL2Ria1BBBEDBz5kwkJSXh6NGjcgeSIAgoLy8XPy8uLkZwcDAsLS2RnJwMKyv5VmtnZGTgq6++wr59+1BRUYGWLVuiWbNmuH//PsrLy9GhQwdMnToV4eHhsLGxUWjfdGeNPmlFha1IorLUNF07r7KWoZ0uomo8/YRqTZ8+Hd9++y127NgBGxsbFBQUoKCgAI8ePQIAlJaW4sMPP8Tx48fx559/4syZM5gyZQr++usvvPHGGwCeVI61p4Zs2rQJxcXF4n6qq6vr/eyXX34Zr7/+Op555hn8/PPPePjwIe7du4e//voLZWVl+P3337FgwQL897//RZcuXZCSkqLQvrGCJADan34FWFUaAlabxmfdunUAgCFDhkhs37JlCyZOnAhTU1NcvnwZW7duxd27d+Ho6Ah/f3+kpaWhe/fuAICsrCzxhQM6deok0U9ubi7at28v87ODgoKwe/duWFjIXpTUoUMHdOjQARMmTMBvv/2G27dvK7RvWv+zfe3atfDw8ICVlRX8/PyQlpZWb9v09HT0798fjo6OaNasGTw9PbFixQqpdomJifDy8oKlpSW8vLyQlJSkzl0wOKwqZTPECxFoAqtNwyYIgszHxIkTAQBWVlbYu3cvbt26hfLycty+fRv79++Hv7+/uI8hQ4bU20994Qg8qV7rC8e6unfvjhdeeEGhfdPqL1BCQgIiIiIwf/58ZGdnY+DAgQgJCUFeXp7M9tbW1pgxYwZSU1Nx6dIlLFiwAAsWLMCGDRvEbTIzMxEaGoqwsDCcPXsWYWFh4tVSpBhtByWge1frqcWwbDqGJqnSzZs38ddff4mfnzx5EhERERL5oCitXkmnb9++6NWrl7hEB4Bu3bph9OjRiIuLk6uPV199FdbW1ti+fTsAIDQ0FMXFxfjpp5/EbYYPHw57e3vs3LlTrj71+Uo6PhHSFbWqaGvqtS5dmoKVhVOxqld3mpZX0qn/M8b+dzwsWjTxPMiSCux6/lu9+g0cOHAgpk6dirCwMBQUFKBr167o3r07rl69ilmzZuHjjz9WuE+t/WleUVGBrKwsBAUFSWwPCgpCRkaGXH1kZ2cjIyMDgwcPFm/LzMyU6jM4OFjuPql+tRUlq8qGPV1dsspUDVaa1JgLFy6gT58+AIDvv/8e3t7eyMjIwI4dOxAfH69Un1pbpHP37l1UV1fD2dlZYruzszMKCgoafG/btm1x584dVFVVITY2FlOmTBG/VlBQoHCf5eXlUsuNqWHaPk0E0M3zKutTNyRZZRKpVmVlpfhCBocPH8aoUaMAAJ6ensjPz1eqT63/GS4SSVYjgiBIbasrLS0Np0+fxvr167Fy5UqpqVNF+4yLi4OdnZ34UffySvqkQrHTfJr+eTpQUQK6X1XWxSqTSLW6d++O9evXIy0tDSkpKRg+fDiAJ3cKcXR0VKpPrVWQrVq1gqmpqVRlV1hYKFUB1lV7ImqPHj3wv//9D7GxsXjzzTcBAC4uLgr3GR0djaioKPHz4uJigwhJi4ca/EwdOE0E0K+qsi5ZIclKk0g+S5cuxSuvvIJ///vfmDBhgvhC6MnJyeKpV0VpLSAtLCzg5+eHlJQUvPLKK+LtKSkpePnll+Xup+7VGPr164eUlBRERkaKtx06dAiBgYH19iHPFer1kTaCEtCN6VdAN8+rVBRDk0g+Q4YMwd27d1FcXAx7e3vx9qlTp6J58+ZK9anVCwVERUUhLCwMvXv3Rr9+/bBhwwbk5eUhPDwcwJPK7tatW9i2bRsAYM2aNXBzc4OnpyeAJ+dFLlu2DDNnzhT3OXv2bAwaNAhLly7Fyy+/jP379+Pw4cMyL55rLJ6edtVGVakrQQnod1jWYmgSyWZqaioRjgAaPI+yMVoNyNDQUNy7dw+LFi1Cfn4+vL29ceDAAbi7uwMA8vPzJc6JrKmpQXR0NHJzc2FmZoaOHTvis88+k7glSmBgIHbt2oUFCxbgo48+QseOHZGQkIC+fftqfP90kTFPvwKGUVXKwkVAZOw8PDwaXGty/fp1hfvU6nmQukqfz4Ps9pFi50FqevpV/Lk8p1LjDCk0/3skuvFGOoTnQarfl19+KfG8srIS2dnZOHjwIObOnYt58+Yp3CevxWrkeJzSsKZfG8KpWTJks2fPlrl9zZo1OH36tFJ96s+6eFKrChvNnyIC6M7FBwD9O1VEFXi6CRm6kJAQJCYmKvVeVpAkQVsVJcCqUlew0iRDsmfPHjg4OCj1XgYkyaStla+A7gQlYLiLehTFRUCk63x9fSUW6QiCgIKCAty5cwdr165Vqk8GJDXK2I9TAqwq62KVqbv+KrWDGZp2XndVaXnjjXTM6NGjJZ6bmJigdevWGDJkiPjUQEUxIElu2g5KQLfCkkEpiaFJ2hQTE6PyPhmQpDAep3yCVWXjGJqkTsXFxeLTUBq7yYQyp6swIA1M5f8PL3MNhBeD8h+yVr8yNGVjaJKq2NvbIz8/H05OTmjZsqXMCwXU3qyiurpa4f4ZkAbK2IIS0J2wrFU3NBmY9eMiIFLGkSNHxCtUf/nlF5X3z4A0cMYSlIDuVZV1MTDlxyqT5DF48GCZ/6wqxnVWtBGrtPknLNWt9qID2rjwAKA796hsTO2FCYzxAgXK4MUMqCEHDx6UuCnFmjVr0LNnT4wbNw5///23Un3yv0ojo8mgBHQjKPUhLAHpwGRoEslv7ty54oU658+fR1RUFF588UVcv35d4n6/iuAUq5F6OiQ5/aq7OC1LJJ/c3Fx4eXkBABITEzFy5EgsWbIEZ86cwYsvvqhUn/wTlbQy/aot+lRRysIKk0g2CwsLlJWVAQAOHz6MoKAgAICDg0Ojp4DUhxUkiRnjgh5A/6rKp/H0EqInBgwYgKioKPTv3x8nT55EQkICAODq1ato27atUn3yT1CSYkwVJaD/VWVdrDLJGK1evRpmZmbYs2cP1q1bh2eeeQYA8NNPP2H48OFK9ckKkuqljYoS0H5Vqc8VpSw8jknGwM3NDT/88IPU9hUrFLuJ/NMYkNQoTQYloDvTr4YWlLUYmGQoFDm2yEvNkVoZa1AChhuWAI9jkv6q7/JyT+Ol5kijjO0UEcDwq8q6WGWSPlDH5eWexoA0MFW2//yVZFZsqvbPM6aVr4DxBWUtBibVJy4uDnv37sXly5fRrFkzBAYGYunSpejatau4zd69e/H1118jKysL9+7dQ3Z2Nnr27CnVV2ZmJubPn48TJ07A3NwcPXv2xE8//YRmzZrJ/Gx1XF7uaVziZsCqbKslAlOdjHXlqyGtflUEr/pDtY4dO4bp06fj+PHjSElJQVVVFYKCglBaWipuU1paiv79++Ozzz6rt5/MzEwMHz4cQUFBOHnyJE6dOoUZM2bAxET+f7fS0tIwfvx4BAYG4tatWwCA7du3S1yCThGsII1AbUgaakUJ6EZVCRhfZfk0VpnG6eDBgxLPt2zZAicnJ2RlZWHQoEEAgLCwMADAjRs36u0nMjISs2bNwrx588TbOnfuLPc4EhMTERYWhrfeegtnzpxBeXk5AODhw4dYsmQJDhw4IHdftfhnnxEx1IoS0I2qEpCsLI21uqzFClP/FRcXSzxqQ6chRUVFACC+DZU8CgsLceLECTg5OSEwMBDOzs4YPHiwQpXfp59+ivXr12Pjxo0wN//ngvaBgYE4c+aM3P08jRWkETLUihLQjeOUT6sbkqww/8EKUz3ulbaAqWDZpD6qy54ETLt27SS2x8TEIDY2tt73CYKAqKgoDBgwAN7e3nJ/3vXr1wEAsbGxWLZsGXr27Ilt27bh+eefx4ULF+SqJK9cuSKuWJ9ma2uLBw8eyD2WpzEgjRiDUvMYmP/g6SW67+bNmxLnD1paNhy8M2bMwLlz5xQ+5ldT8+T/92nTpmHSpEkAAF9fX/z3v//F5s2bERcX12gfbdq0wR9//IH27dtLbE9PT0eHDh0UGk8tBiRpdOWrMZ4i0hAGpiRWmbrF1tZW7hPsZ86cieTkZKSmpip87dM2bdoAgPhuHLW6deuGvLw8ufqYNm0aZs+ejc2bN0MkEuH27dvIzMzEnDlz8PHHHys0nloMSJJgqFWlrgdlLQamJAam7hMEATNnzkRSUhKOHj0KDw8Phfto3749XF1dceXKFYntV69eRUhIiFx9fPDBBygqKsLQoUPx+PFjDBo0CJaWlpgzZw5mzJih8JgABiTVg0GpGxiYkrjYR/dMnz4dO3bswP79+2FjY4OCggIAgJ2dnfj8xfv37yMvLw+3b98GAHEQuri4wMXFBSKRCHPnzkVMTAx8fHzQs2dPbN26FZcvX8aePXvkHsvixYsxf/58XLx4ETU1NfDy8kKLFi2U3jcGJDXI0IMS0J+wBBiYpHvWrVsHABgyZIjE9i1btmDixIkAgOTkZPGxRQAYO3YsAMlFPxEREXj8+DEiIyNx//59+Pj4ICUlBR07dmzw86urq/Hbb7+hc+fOaNasGZo3b47evXsDAB49eoRz587B29tbofMpazEgSS6GGpSA/lWVT2NgkrYJQuP/zk2cOFEclg2ZN2+exHmQ8ti+fTtWr16NEydOSL1mYWGBd955BxERERg/frxC/QI8D5IUxHMpdRvPwyRjs2nTJsyZMwemptJ/vJuamuKDDz7Ahg0blOqbFaSBEdlUQnho3njDJmJFqR9YYZKhu3LlCgICAup93d/fH5cuXVKqbwakARLZVAIAg7KJDCkoazEwydCUlpY2eF/Ihw8foqysTKm+OcVqwEQ2leKHutVOvWpi+rV26tWYLo6uLpySJX3XuXNnZGRk1Pt6enq6Qtd0fRoD0khoKigBwz1OWRuUhhqWAAOT9M+4ceOwYMECnDt3Tuq1s2fP4uOPP8a4ceOU6lvrAbl27Vp4eHjAysoKfn5+SEtLq7ft3r178cILL6B169awtbVFv3798PPPP0u0iY+Ph0gkkno8fvxY3buiFxiUqmHoQVmLgUm6LjIyEj169ICfnx9CQkIQGRmJqKgohISEoHfv3vD29kZkZKRSfWs1IBMSEhAREYH58+cjOzsbAwcOREhISL2XFkpNTcULL7yAAwcOICsrC0OHDsXIkSORnZ0t0c7W1hb5+fkSDysrK03skt5gUKqGsQRlLQYm6Rpzc3McOnQIixcvRn5+PjZs2ID169cjPz8fixcvxqFDhyTu7qEIkSDPSSxq0rdvX/Tq1Ut8oinw5Np7o0ePluvitADQvXt3hIaGiq+1Fx8fj4iICKWv3g48ucWLnZ0dioqK5L4Ooa7w+E6+760uTSzoqaWJBT21NLWgpy5DWtijCE0t+jm1OUojn6MqmvhNqf2Mbjv/BdPmTb2bRzkuvblUL38DVUlrFWRFRQWysrIQFBQksT0oKKjBA65Pq6mpwcOHD6XuO1ZSUgJ3d3e0bdsWI0aMkKow6yovL5e675mxYUWpWk8fr2SFSaSftBaQd+/eRXV1NZydnSW2Ozs7i6/l15gvvvgCpaWlGDNmjHibp6cn4uPjkZycjJ07d8LKygr9+/fH77//Xm8/cXFxsLOzEz/q3gPNmGgqJAFoLCQB7YTk04wtKGsxLEmfaX2Rjkgk+R+OIAhS22TZuXMnYmNjkZCQACcnJ/H2gIAAjB8/Hj4+Phg4cCC+//57dOnSBV999VW9fUVHR6OoqEj8uHnzpvI7ZAAYkupjjFVlLQYl6RutXSigVatWMDU1laoWCwsLparKuhISEjB58mTs3r0bw4YNa7CtiYkJ/P39G6wgLS0tG70RqLHhxQbUzxAvRCCPp0OSFyogXaa1CtLCwgJ+fn5ISUmR2J6SkoLAwMB637dz505MnDgRO3bswEsvvdTo5wiCgJycHPENOUkxrCbVj1Ulq0pSnYqKCly5cgVVVVVN7kurU6xRUVH45ptvsHnzZly6dAmRkZHIy8tDeHg4gCdTn2+//ba4/c6dO/H222/jiy++QEBAAAoKClBQUICioiJxm4ULF+Lnn3/G9evXkZOTg8mTJyMnJ0fcJymOIak5DEoi5ZSVlWHy5Mlo3rw5unfvLj5dcNasWfjss8+U6lOr12INDQ3FvXv3sGjRIuTn58Pb2xsHDhyAu7s7ACA/P1/inMivv/4aVVVVmD59OqZPny7ePmHCBMTHxwMAHjx4gKlTp6KgoAB2dnbw9fVFamoq+vTpo9F9MzSaugg68CQkNXUqSKWNbky31qWv96tsKk6/Nl3pQ0uYVDftvO8a5S5dqlXR0dE4e/Ysjh49iuHDh4u3Dxs2DDExMQrfRgvQ8nmQusoYz4OUF8+X1B5jCsqnyQpKngdZ/2e4bfgYJs2bGpCPkTd1kV79Brq7uyMhIQEBAQGwsbHB2bNn0aFDB/zxxx/o1auXUqfvaX0VK+kXTrdqj7Eeq+SpIiSPO3fuSJzRUKu0tFSuMyNkYUCSwnhRAe0zxqAEeKyS6ufv748ff/xR/Lw2FDdu3Ih+/fop1SfvB2lgWtg8uSh7yUP1X3uWxyW1z1iPVRLVFRcXh+HDh+PixYuoqqrCl19+id9++w2ZmZk4duyYUn2ygjRQtUGpbpxy1R3GWlUSAUBgYCB+/fVXlJWVoWPHjjh06BCcnZ2RmZkJPz8/pfpkBWnAWtg8ZiXZBPpUST6NVSUZqx49emDr1q0q648VpIFjJdk0+lhJPo1VJRmTa9euYcGCBRg3bhwKCwsBAAcPHsRvv/2mVH8MSCPQwuaxRoKSi3d0l7GugCXjcezYMfTo0QMnTpxAYmIiSkpKAADnzp1DTEyMUn0yII0Iq8mm0feQrMWgJEM0b948fPrpp0hJSYGFhYV4+9ChQ5GZmalUnwxII8OQbBpDCUmAVSUZlvPnz+OVV16R2t66dWvcu3dPqT4ZkEaIIdk0hhSStRiUpO9atmyJ/Px8qe3Z2dl45plnlOqTAWmkGJJNY4ghCbCqJP01btw4/Otf/0JBQQFEIhFqamrw66+/Ys6cORI3vVAEA9KIMSSbxlBDshaDkvTJ4sWL4ebmhmeeeQYlJSXw8vLCoEGDEBgYiAULFijVJ8+DNHKauvIOb8Csv3heJek6QRBw+/ZtbNy4EZ988gnOnDmDmpoa+Pr6onPnzkr3y4AkALyoQFMZQ1AC/4Qlg5J0iSAI6Ny5M3777Td07twZHTp0UEm/nGIlMU65Nl3tOZPGMv3KKViKi4uDv78/bGxs4OTkhNGjR+PKlSsSbQRBQGxsLFxdXdGsWTMMGTJE6uT98vJyzJw5E61atYK1tTVGjRqFv/76S64xmJiYoHPnzkqvVq23X5X2RnqPIak6xhCUAIPS2B07dgzTp0/H8ePHkZKSgqqqKgQFBaG0tFTc5vPPP8fy5cuxevVqnDp1Ci4uLnjhhRfw8OE/UxERERFISkrCrl27kJ6ejpKSEowYMQLV1fL99/v5559j7ty5uHDhgsr2jVOsJIXTraplbNOvAKdgjcnBgwclnm/ZsgVOTk7IysrCoEGDIAgCVq5cifnz5+PVV18FAGzduhXOzs7YsWMHpk2bhqKiImzatAnbt2/HsGHDAADffvst2rVrh8OHDyM4OLjRcYwfPx5lZWXw8fGBhYUFmjVrJvH6/fv3Fd43BiTJpMmQBAxv8Y4sT1eTxhKWDEr9VlxcLPHc0tISlpaWDb6nqKgIAODg4AAAyM3NRUFBAYKCgiT6GTx4MDIyMjBt2jRkZWWhsrJSoo2rqyu8vb2RkZEhV0CuXLlS3t2SGwOS6sV7S6oPq0pSF6HEHEJ10/5bEh49+WOyXbt2EttjYmIQGxtb//sEAVFRURgwYAC8vb0BAAUFBQAAZ2dnibbOzs74888/xW0sLCxgb28v1ab2/Y2ZMGGCXO0UwYCkRnHKVX1YVZIuu3nzJmxtbcXPG6seZ8yYgXPnziE9PV3qNZFIJPFcEASpbXXJ06ZW3Wr36c+1tLSUuD6rvLhIh+TCxTvqZ2yLeriwR/fZ2tpKPBoKyJkzZyI5ORm//PIL2rZtK97u4uICAFKVYGFhobiqdHFxQUVFBf7+++962zSmZcuWsLe3l3q0bNkSzZo1g7u7O2JiYlBTUyNXfwADkhTAkNQMYwlKgEFpCARBwIwZM7B3714cOXIEHh4eEq97eHjAxcUFKSkp4m0VFRU4duwYAgMDAQB+fn4wNzeXaJOfn48LFy6I2zQmPj4erq6u+PDDD7Fv3z4kJSXhww8/xDPPPIN169Zh6tSpWLVqFT777DO5941TrAamVYsS3C1pobb+Od2qOcY4/QpwClbfTJ8+HTt27MD+/fthY2MjrhTt7OzQrFkziEQiREREYMmSJejcuTM6d+6MJUuWoHnz5hg3bpy47eTJk/H+++/D0dERDg4OmDNnDnr06CFe1dqYrVu34osvvsCYMWPE20aNGoUePXrg66+/xn//+1+4ublh8eLF+PDDD+XqU6GALCoqQlJSEtLS0nDjxg2UlZWhdevW8PX1RXBwsNxJT+plSCEJGMcK18YYy6IegMcq9c26desAAEOGDJHYvmXLFkycOBEA8MEHH+DRo0d477338Pfff6Nv3744dOgQbGz++ctoxYoVMDMzw5gxY/Do0SM8//zziI+Ph6mpfP9NZmZmYv369VLbfX19xfeDHDBgAPLy8uTeN7mmWPPz8/Huu++iTZs2WLRoEUpLS9GzZ088//zzaNu2LX755Re88MIL8PLyQkJCgtwfTurTqkUJWrUoUVv/LWwec8pVC4xx+pVTsLpNEASZj9pwBJ4slImNjUV+fj4eP36MY8eOiVe51rKyssJXX32Fe/fuoaysDP/5z3+kVtE2pG3btti0aZPU9k2bNon7uXfvntRK2YbIVUH6+Pjg7bffxsmTJ6V2qtajR4+wb98+LF++HDdv3sScOXPkHgSpjyFVk8Y+5fo0Y5p+BVhVUuOWLVuGN954Az/99BP8/f0hEolw6tQpXL58GXv27AEAnDp1CqGhoXL3KVdA/vbbb2jdunWDbZo1a4Y333wTb775Ju7cuSP3AEj9GJKK04eQrGWM069EdY0aNQpXrlzB+vXrcfXqVQiCgJCQEOzbtw/t27cHAPzf//2fQn3KFZCNhWNT25P6MSQVp08hCRhfVUlUV/v27RVapdoYpVax3rp1C7/++isKCwulzimZNWuWSgZGqseQVJy+hWQtY6oqiWqlpaXh66+/xvXr17F7924888wz2L59Ozw8PDBgwACF+1M4ILds2YLw8HBYWFjA0dFR4ioHIpGIAanjDCkkAa5wbQyDkoxFYmIiwsLC8NZbb+HMmTMoLy8HADx8+BBLlizBgQMHFO5T4QsFfPzxx/j4449RVFSEGzduIDc3V/y4fv26wgMgzeMKV+Xo+grXhhjLfSrJeH366adYv349Nm7cCHPzf/5wDgwMxJkzZ5TqU+GALCsrw9ixY2Fiwovw6Dt1hiTAK+/oKgYlGaIrV65g0KBBUtttbW3x4MEDpfpUOOUmT56M3bt3K/VhpHsYkoozhJAEGJRkWNq0aYM//vhDant6ejo6dOigVJ8KH4OMi4vDiBEjcPDgQfTo0UOilAWA5cuXKzUQ0h5DOi7JxTuK4+pXMgTTpk3D7NmzsXnzZohEIty+fRuZmZmYM2cOPv74Y6X6VDgglyxZgp9//hldu3YFAKlFOqSfDCkkAS7eURYX9ZC++uCDD1BUVIShQ4fi8ePHGDRoECwtLTFnzhzMmDFDqT4VnmJdvnw5Nm/ejEuXLuHo0aP45ZdfxI8jR44oPIC1a9fCw8MDVlZW8PPzQ1paWr1t9+7dixdeeAGtW7eGra0t+vXrh59//lmqXWJiIry8vGBpaQkvLy8kJSUpPC5jZCjTrQCnXJuKi3pIHy1evBh3797FyZMncfz4cdy5cweffPKJ0v0pHJCWlpbo37+/0h/4tISEBERERGD+/PnIzs7GwIEDERISUu/FZFNTU/HCCy/gwIEDyMrKwtChQzFy5EhkZ2eL22RmZiI0NBRhYWE4e/YswsLCMGbMGJw4cUIlYzZ0mghJQz0uaYhBCTAoSb80b94cvXv3Rp8+fdCiRdNmxUSCIAiKvCEuLg75+flYtWpVkz4YAPr27YtevXqJrwYPAN26dcPo0aMRFxcnVx/du3dHaGioeI45NDQUxcXF+Omnn8Rthg8fDnt7e+zcuVOuPouLi2FnZ4eioiKJu2nrg6FH3ldZX+qccgWgkSlXQDPTrbIY0tTr03Rh+vXSJ5HaHoJCNPGbUvsZ7ZZ/ApNmTftvq+bRY9yM+kjnfwNfffVVudvu3btX4f4VPgZ58uRJHDlyBD/88AO6d+8utUhH3kFUVFQgKysL8+bNk9geFBSEjIwMufqoqanBw4cP4eDgIN6WmZmJyEjJ/3iCg4OxcuXKevspLy8Xn1QKPPkXjQzruKQ2QtIQj1ECXNRDusPOzk78z4IgICkpCXZ2dujduzcAICsrCw8ePFAoSJ+mcEC2bNlS6Q972t27d1FdXQ1nZ2eJ7c7OzuIbbjbmiy++QGlpqcQNMgsKChTuMy4uDgsXLlRg9MaDIdl0hhqUABf16CKzh6YwqWzav2s1j/Xj39UtW7aI//lf//oXxowZg/Xr14vvIVldXY333ntP6SpYqUvNqVLdla+CIMi1Gnbnzp2IjY3F/v374eTk1KQ+o6OjERUVJX5eXFys0H3IDJ0hhSSgvSlXBiWR+mzevBnp6ekSN1g2NTVFVFQUAgMD8e9//1vhPrV2OZxWrVrB1NRUqrIrLCyUqgDrSkhIwOTJk/H9999j2LBhEq+5uLgo3KelpSVsbW0lHiSJK1xVp3ZBjyEu6uHqV9KWqqoqXLp0SWr7pUuXpG6qIS+5AnL48OFyHRd8+PAhli5dijVr1jTa1sLCAn5+fkhJSZHYnpKSgsDAwHrft3PnTkycOBE7duzASy+9JPV6v379pPo8dOhQg32SfLjCVfUMNSgBBiVp1qRJk/DOO+9g2bJlSE9PR3p6OpYtW4YpU6Zg0qRJSvUp1xTrG2+8gTFjxsDGxgajRo1C79694erqCisrK/z999+4ePEi0tPTceDAAYwYMULuUjYqKgphYWHo3bs3+vXrhw0bNiAvLw/h4eEAnkx93rp1C9u2bQPwJBzffvttfPnllwgICBBXis2aNRMfrJ09ezYGDRqEpUuX4uWXX8b+/ftx+PBhpKenK/zl6CO3Fg8AAHklLdXSf21IGsqUq7amW+syhulXgFOwpD7Lli2Di4sLVqxYgfz8fABPLj/3wQcf4P33lVvdL/dpHhUVFdizZw8SEhKQlpYmvvirSCSCl5cXgoOD8e6774qvsCOvtWvX4vPPP0d+fj68vb2xYsUK8QVnJ06ciBs3buDo0aMAgCFDhuDYsWNSfUyYMAHx8fHi53v27MGCBQtw/fp1dOzYEYsXL1ZoYZE+n+Yx4eRk8T+rKyRr8TQQ9THEoHxaU4OSp3nU/xkeC5fAxKqJp3k8fozcmA/18jcQ+OdMhKaOXeHzIGsVFRXh0aNHcHR0lDrVQ98ZSkACDElF6GJQAoYdlsoGJQOy/s9gQKqO0ot07Ozs4OLiYnDhaGhqp1zVhYt31M8YjlPyWCUpQx3rY56m8GkepH/cWjxQayVpKKeBALp1XLIuQz5OCfBUEVKcutbH1GJAGglDCElAM1OuuhySAIOSqNbkyZMRFhYmXh+zceNGmetjsrKyFF4fAzAgjQpXuMpP10MSkLyLiCGGJVe/kjwsLCwwbtw4jBs3DoBq18do7UIBpD08LikfXT0mKYshH6cEeJyS5KfK9TEKB+TEiRORmpra5A8m7WJIykdkU8mg1CEMStIkhQPy4cOHCAoKQufOnbFkyRLcunVLHeMiDWBIyk+fQhIw/KAk0gSFAzIxMRG3bt3CjBkzsHv3brRv3x4hISHYs2cPKiv160eEGJKK0LeQBAz7uq9E6qbUMUhHR0fMnj0b2dnZOHnyJDp16oSwsDC4uroiMjISv//+u6rHSWpkCCHJ45KNY1ASKaZJi3Ty8/Nx6NAhHDp0CKampnjxxRfx22+/wcvLCytWrFDVGEkD3Fo8UGtQqjskAS7ekReDklQtNTUVI0eOhKurK0QiEfbt2yfxeklJCWbMmIG2bduiWbNm6NatG9atWyezL0EQEBISIrOfxjx48ADffPMNoqOjcf/+fQDAmTNnlD4UqHBAVlZWIjExESNGjIC7uzt2796NyMhI5OfnY+vWrTh06BC2b9+ORYsWKTUg0i51h6ShTLnqe0gCnH4l1SktLYWPjw9Wr14t8/XIyEgcPHgQ3377LS5duoTIyEjMnDkT+/fvl2q7cuVKue4JXNe5c+fQpUsXLF26FMuWLROfD5mUlITo6GiF+wOUOA+yTZs2qKmpwZtvvomTJ0+iZ8+eUm2Cg4PRsmVLpQZE2mcIFxUwhhswq5KhX3yA1CskJAQhISH1vp6ZmYkJEyZgyJAhAICpU6fi66+/xunTp/Hyyy+L2509exbLly/HqVOn0KZNG4XGEBUVhYkTJ+Lzzz+Hjc0/S51DQkLE50gqSuEKcsWKFbh9+zbWrFkjMxwBwN7eHrm5uUoNiHSDIRyX1BRDqCZrsaKkpxUXF0s8ysvLlepnwIABSE5Oxq1btyAIAn755RdcvXoVwcHB4jZlZWV48803sXr1ari4uCj8GadOncK0adOktj/zzDPiWyMqSuGADAsLg1UTrxRP+oEhKb/a8yUNJSwZlPrLrOTJlYea8jD7//9ptmvXDnZ2duJHXFycUmNatWoVvLy80LZtW1hYWGD48OFYu3YtBgwYIG4TGRmJwMBAiYpSEVZWVuLbXD3typUraN26tVJ98lJz1CBOtyrOEKdeAU6/GqObN29K3O7K0tJSqX5WrVqF48ePIzk5Ge7u7khNTcV7772HNm3aYNiwYUhOTsaRI0eQnZ2t9FhffvllLFq0CN9//z2AJ9dizcvLw7x58/Daa68p1ScvNUeN0vcVrpo8DeRphlRRAqwqjZGtra3EQ5mAfPToET788EMsX74cI0eOxLPPPosZM2YgNDQUy5YtAwAcOXIE165dQ8uWLWFmZgYzsye122uvvSY+btmYZcuW4c6dO3BycsKjR48wePBgdOrUCTY2Nli8eLHC4wZYQZIC1FlNGtKFzusypIoS4IIeUkxlZSUqKythYiJZj5mamqKmpgYAMG/ePEyZMkXi9R49emDFihUYOXKkXJ9ja2uL9PR0HDlyBGfOnEFNTQ169eqFYcOGKT12BiQphFOuymNQkqEqKSnBH3/8IX6em5uLnJwcODg4wM3NDYMHD8bcuXPRrFkzuLu749ixY9i2bRuWL18OAHBxcZG5MMfNzQ0eHh6Nfn5VVRWsrKyQk5OD5557Ds8995xK9osBaWA8mt8FAOSWtVLbZzAkm+bpaVdDCEsep6TTp09j6NCh4udRUVEAgAkTJiA+Ph67du1CdHQ03nrrLdy/fx/u7u5YvHgxwsPDVfL5ZmZmcHd3R3W1ag8BMCANlEfzuwzJBmg7JGuxqiRDMGTIEAiCUO/rLi4u2LJli0J9NtSfLAsWLEB0dDS+/fZbODg4KPTe+jAgDRhDsmG6EpIAg5KoqVatWoU//vgDrq6ucHd3h7W1tcTrZ86cUbhPBqSBU/eUqyGEJAAGpZowKElTRo8erfI+GZBGQp3VZO0pIFzhqjqGGpQAw5LUIyYmRuV98jxII1JbTaoLr7yjeoZ2hR6A51OS/mBAGhmGZMN0MSRrMSiJ6mdiYgJTU9N6H8rgFKsR4uKdhunadGtdhjr9yqlXaoqkpCSJ55WVlcjOzsbWrVuxcOFCpfpkQBophmTDdD0kAcMNSoBhSYqTdZHz119/Hd27d0dCQgImT56scJ+cYjViHs3vqnXK1RCmW3V5yrUWj1MS1a9v3744fPiwUu9lQJLaQ1KfL3QO6PZxyboYlET/ePToEb766iu0bdtWqfdzipUA6PeUqzGeBtIYQ51+5dQr1cfe3h4ikUj8XBAEPHz4EM2bN8e3336rVJ8MSBLT55AEeFxSFkMNSqK6VqxYIRGQJiYmaN26Nfr27Qt7e3ul+mRAkgSGZMP0MSQBwwtKorqee+45tGvXTiIka+Xl5cHNzU3hPnkMkqTwXMmG6dMxyboMcUEPEQB4eHjgzp07Utvv3bsn1y2zZGFAkkwMyYbpywrXhjAoyZDUd/ePkpISWFkpN+vDKVaqlyYudA6o9xqu6pxuBfR3yvVpnH41LBYPAdOKpvVRXa6asWhC7b0nRSIRPv74YzRv3lz8WnV1NU6cOIGePXsq1bfWK8i1a9fCw8MDVlZW8PPzQ1paWr1t8/PzMW7cOHTt2hUmJiaIiIiQahMfHw+RSCT1ePxYv//a1yZ9riZbtSjhlKucWFGSPsrOzkZ2djYEQcD58+fFz7Ozs3H58mX4+PggPj5eqb61WkEmJCQgIiICa9euRf/+/fH1118jJCQEFy9elHlAtby8HK1bt8b8+fOxYsWKevu1tbXFlStXJLYpW2LTE1y807CnQ9JQKkqAVSXpvl9++QUAMGnSJHz55ZewtbVVWd9arSCXL1+OyZMnY8qUKejWrRtWrlyJdu3aYd26dTLbt2/fHl9++SXefvtt2NnZ1duvSCSCi4uLxIOaTp8rSUAzFxUADOP4ZC1WlaQvtmzZotJwBLRYQVZUVCArKwvz5s2T2B4UFISMjIwm9V1SUgJ3d3dUV1ejZ8+e+OSTT+Dr61tv+/LycpSX/zPpXlxc3KTP16aOlv/DtXJntfXPSlJ+unYz5qbgcUrSB6dOncLu3buRl5eHigrJA7F79+5VuD+tVZB3795FdXU1nJ0lf8ydnZ1RUFCgdL+enp6Ij49HcnIydu7cCSsrK/Tv3x+///57ve+Ji4uDnZ2d+NGuXTulP18XdLT8n1r7ZyWpGEOpJgGwmiSdtWvXLvTv3x8XL15EUlISKisrcfHiRRw5cqTBGceGaH2RTt2TOgVBkHmip7wCAgIwfvx4+Pj4YODAgfj+++/RpUsXfPXVV/W+Jzo6GkVFReLHzZs3lf58XaHukCTFMCSJ1GvJkiVYsWIFfvjhB1hYWODLL7/EpUuXMGbMGKUuEgBoMSBbtWoFU1NTqWqxsLBQqqpsChMTE/j7+zdYQVpaWsLW1lbiQQ1jFak4hiSR+ly7dg0vvfQSgCe/6aWlpRCJRIiMjMSGDRuU6lNrAWlhYQE/Pz+kpKRIbE9JSUFgYKDKPkcQBOTk5KBNmzYq61NfsIrUPQxJIvVwcHDAw4cPAQDPPPMMLly4AAB48OABysrKlOpTq6d5REVFISwsDL1790a/fv2wYcMG5OXlITw8HMCTqc9bt25h27Zt4vfk5OQAeLIQ586dO8jJyYGFhQW8vLwAAAsXLkRAQAA6d+6M4uJirFq1Cjk5OVizZo3G98/QccGOcgxt8Q4X7pAuGDhwIFJSUtCjRw+MGTMGs2fPxpEjR5CSkoLnn39eqT61GpChoaG4d+8eFi1ahPz8fHh7e+PAgQNwd3cH8OTCAHl5eRLveXo1alZWFnbs2AF3d3fcuHEDwJO/FqZOnYqCggLY2dnB19cXqamp6NOnj8b2S5fo+6pWQ2YIV+EBGJKkG1avXi2+IEx0dDTMzc2Rnp6OV199FR999JFSfYqE+i5gZ8SKi4thZ2eHoqIivTseuf33AKlt6gxIQH2XoqulzioSUO99JOVhCCEJaPYUkBvhczT2Waqgid+U2s/oHr4EppZN+3equvwxflv/od78BlZVVeG7775DcHCwSs971/oqVlI/fT/tw9AZynFJHpMkbTEzM8P//d//SZzPrgoMSNJ5hriitS5DCkkGJWlD3759kZ2drdI+eTcPI8FjkbrPUI5JAjwuSZr33nvv4f3338dff/0FPz8/WFtbS7z+7LPPKtwnA5L0gqGuaK2LIUmknNDQUADArFmzxNtEIpH44jPV1dUK98kpViPCY5H6wVCmWwEelzQWqampGDlyJFxdXSESibBv3z6pNpcuXcKoUaNgZ2cHGxsbBAQESJylUFBQgLCwMLi4uMDa2hq9evXCnj175B5Dbm6u1OP69evi/1UGK0jSG8ZSRQKsJEm/lJaWwsfHB5MmTcJrr70m9fq1a9cwYMAATJ48GQsXLoSdnR0uXbokcRvCsLAwFBUVITk5Ga1atcKOHTsQGhqK06dPN3iziVq1pweqEitII8MqUn+wkiR9ERISgk8//RSvvvqqzNfnz5+PF198EZ9//jl8fX3RoUMHvPTSS3BychK3yczMxMyZM9GnTx906NABCxYsQMuWLXHmzBm5x7F9+3b0798frq6u+PPPPwEAK1euxP79+5XaLwYk6RVjWNH6NIYk6buamhr8+OOP6NKlC4KDg+Hk5IS+fftKTcMOGDAACQkJuH//PmpqarBr1y6Ul5djyJAhcn3OunXrEBUVhRdffBEPHjwQH3Ns2bIlVq5cqdTYGZBGSN+rSHWHpK5hSJK2FBcXSzyUOc+wsLAQJSUl+OyzzzB8+HAcOnQIr7zyCl599VUcO3ZM3C4hIQFVVVVwdHSEpaUlpk2bhqSkJHTs2FGuz/nqq6+wceNGzJ8/H6ampuLtvXv3xvnz5xUeN8BjkERSdOlYZC0ekyR5WTwUYFretAukVVc8eX/de+PGxMQgNjZWob5qamoAAC+//DIiIyMBAD179kRGRgbWr1+PwYMHAwAWLFiAv//+G4cPH0arVq2wb98+vPHGG0hLS0OPHj0a/Zzc3FyZxypr7+yhDAakkdL38yLVvWBHFzEkSdNu3rwpcak5S0tLhfto1aoVzMzMxDeUqNWtWzekp6cDeLKIZ/Xq1bhw4QK6d+8OAPDx8UFaWhrWrFmD9evXN/o5Hh4eyMnJkVqs89NPP0l9trwYkEQy6GIVCTAkSbNUcX9cCwsL+Pv748qVKxLbr169Kg6z2ttRmZhIHvUzNTUVV6CNmTt3LqZPn47Hjx9DEAScPHkSO3fuRFxcHL755hulxs6ANGKsIvUTQ5J0TUlJCf744w/x89zcXOTk5MDBwQFubm6YO3cuQkNDMWjQIAwdOhQHDx7Ef/7zHxw9ehQA4OnpiU6dOmHatGlYtmwZHB0dsW/fPqSkpOCHH36QawyTJk1CVVUVPvjgA5SVlWHcuHF45pln8OWXX2Ls2LFK7RcD0sipOyT1ma5WkQBDknTL6dOnMXToUPHzqKgoAMCECRMQHx+PV155BevXr0dcXBxmzZqFrl27IjExEQMGDAAAmJub48CBA5g3bx5GjhyJkpISdOrUCVu3bsWLL74o9zjeffddvPvuu7h79y5qamokTiNRBgOS1IpVpPowJElXDBkyBI3dOfGdd97BO++8U+/rnTt3RmJiYpPHUlhYiCtXrkAkEkEkEqF169ZK98XTPEjtp33oM107L7IungJC9ERxcTHCwsLg6uqKwYMHY9CgQXB1dcX48eNRVFSkVJ8MSFI7fT8vkiGpOQxJUtaUKVNw4sQJ/Pjjj3jw4AGKiorwww8/4PTp03j33XeV6pNTrASAxyL1Hadbydj9+OOP+Pnnn8XHNQEgODgYGzduxPDhw5XqkxUkaQSrSPVjJUnGzNHREXZ2dlLb7ezsYG9vr1SfDEgS47FI/ceQJGO1YMECREVFIT8/X7ytoKAAc+fOxUcffaRUn5xiJY3R9xWtunzax9M43UrGaN26dfjjjz/g7u4ONzc3AEBeXh4sLS1x584dfP311+K28t4hhAFJEngs0jAwJMnYjB49WuV9MiBJo1hFag5DkoxJTEyMyvtkQJIUVpGGgyFJxqikpETqGq7KXFOWi3RI47iiVbNa2Dw2mMU7XLhD9cnNzcVLL70Ea2tr8cpVe3t7tGzZUulVrKwgSSZ9v5A5STOUapIhSbK89dZbAIDNmzfD2dkZIpGoyX0yIMkg8VikbIYSkkR1nTt3DllZWejatavK+uQUK9VL3edFqnuqlWQzlOlWoqf5+/vj5s2bKu2TFSQZLFaR9WMlSYbmm2++QXh4OG7dugVvb2+Ym0su6Hr22WcV7pMBSQ3isUjDxZA0TBbFNTAzr2m8YQOqKpv2fm24c+cOrl27hkmTJom3iUQiCIIAkUiE6upqhftkQJJBYxXZMIYkGYp33nkHvr6+2LlzJxfpkOawijRsDEkyBH/++SeSk5PRqVMnlfXJRTokF32+kDnPi2wcF+6Qvnvuuedw9uxZlfbJCpJ0gr5Xkfo+1QqwkiT9NnLkSERGRuL8+fPo0aOH1CKdUaNGKdwnA5Lkps+XoFP3sUiAIUmkTeHh4QCARYsWSb2m7CIdrU+xrl27Fh4eHrCysoKfnx/S0tLqbZufn49x48aha9euMDExQUREhMx2iYmJ8PLygqWlJby8vJCUlKSm0ZMqGcJ5kZxuJdKOmpqaeh/KhCOg5YBMSEhAREQE5s+fj+zsbAwcOBAhISHIy8uT2b68vBytW7fG/Pnz4ePjI7NNZmYmQkNDERYWhrNnzyIsLAxjxozBiRMn1LkrOqOLhXqPFfJYZOMYkkTa9fixav791WpALl++HJMnT8aUKVPQrVs3rFy5Eu3atcO6detktm/fvj2+/PJLvP3227Czs5PZZuXKlXjhhRcQHR0NT09PREdH4/nnn8fKlSvVuCe6Rd0hqU6GUEUCDEkiTauursYnn3yCZ555Bi1atMD169cBAB999BE2bdqkVJ9aC8iKigpkZWUhKChIYntQUBAyMjKU7jczM1Oqz+Dg4Ab7LC8vR3FxscSD6scqUj4MSSLNWbx4MeLj4/H555/DwsJCvL1Hjx745ptvlOpTawF59+5dVFdXw9lZctGHs7MzCgoKlO63oKBA4T7j4uJgZ2cnfrRr107pz9cVrCJ1A0OSSDO2bduGDRs24K233oKpqal4+7PPPovLly8r1afWF+nUvdpB7WWBNNlndHQ0ioqKxA9VX/BWW9QZkqwi5ceQJFK/W7duybxIQE1NDSorlbtFmtYCslWrVjA1NZWq7AoLC6UqQEW4uLgo3KelpSVsbW0lHqRdhlRFAgxJInXr3r27zLMgdu/eDV9fX6X61FpAWlhYwM/PDykpKRLbU1JSEBgYqHS//fr1k+rz0KFDTepTn7GKlE3TVSTAkCRSh3feeQcPHz5ETEwMZsyYgaVLl6KmpgZ79+7Fu+++iyVLluDjjz9Wqm+tTrFGRUXhm2++webNm3Hp0iVERkYiLy9PfMJndHQ03n77bYn35OTkICcnByUlJbhz5w5ycnJw8eJF8euzZ8/GoUOHsHTpUly+fBlLly7F4cOH6z1nknSXoVWRAEOSSNW2bt2KR48eYeTIkUhISMCBAwcgEonw8ccf49KlS/jPf/6DF154Qam+tXolndDQUNy7dw+LFi1Cfn4+vL29ceDAAbi7uwN4cmGAuudEPl0qZ2VlYceOHXB3d8eNGzcAAIGBgdi1axcWLFiAjz76CB07dkRCQgL69u2rsf3SNV0s/oerFeq5Ag6vrqO42pDU56vu8Io7pCsEQRD/c3BwMIKDg1XWt9YX6bz33nu4ceMGysvLkZWVhUGDBolfi4+Px9GjRyXaC4Ig9agNx1qvv/46Ll++jIqKCly6dAmvvvqqBvaE1MEQq8ha+l5NspKkWqmpqRg5ciRcXV0hEomwb98+idcnTpwIkUgk8QgICBC/fv/+fcycORNdu3ZF8+bN4ebmhlmzZqGoqEiuz1fFra1k4bVYjQSrSNm0VUXW0vfrt7KSJAAoLS2Fj48PJk2ahNdee01mm+HDh2PLli3i50+fq3j79m3cvn0by5Ytg5eXF/7880+Eh4fj9u3b2LNnT6Of36VLl0ZD8v79+3LuzT8YkKTz1H2nD4Zk0zAkKSQkBCEhIQ22sbS0hIuLi8zXvL29kZiYKH7esWNHLF68GOPHj0dVVRXMzBqOqoULF9Z7dbWmYEAaEVaRuoshSYbu6NGjcHJyQsuWLTF48GAsXrwYTk5O9bYvKiqCra1to+EIAGPHjm2wL2Vp/RgkkTzUfSxSG6d91MVjkqRr6l6Cs7y8XKl+QkJC8N133+HIkSP44osvcOrUKTz33HP19nfv3j188sknmDZtWqN9q+v4I8AK0ujocxWp7zdVlgcrSWoqyweVMDMzbbxhA0yrnlx5pu5lN2NiYhAbG6twf6GhoeJ/9vb2Ru/eveHu7o4ff/xRahFlcXExXnrpJXh5eSEmJqbRvp9exapqDEhSKX2eatX2schahhCSABiUBuDmzZsSVxaztLRUSb9t2rSBu7s7fv/9d4ntDx8+xPDhw9GiRQskJSXB3Ny80b5qampUMiZZOMVqhHghc92n79OtAKdcDUHdS3CqKiDv3buHmzdvok2bNuJtxcXFCAoKgoWFBZKTk2Flpf0/sBiQpHK8BJ1qMCRJX5SUlIivcgYAubm5yMnJQV5eHkpKSjBnzhxkZmbixo0bOHr0KEaOHIlWrVrhlVdeAfCkcgwKCkJpaSk2bdqE4uJiFBQUoKCgANXV1VrbL06xGil1HotUN2M4FllL36dbAR6XNAanT5/G0KFDxc+joqIAABMmTMC6detw/vx5bNu2DQ8ePECbNm0wdOhQJCQkwMbGBsCTq6KdOHECAKTuyJGbm4v27dtrZkfqYECSWvBYpOowJEnXDRkypMHFMj///HOT3q8tnGI1YjwWqT843UqkeQxIUhsei1QthiSRZjEgjRyrSP3CkCTSHAYk8abK9dDFKhJgSBJpCgOS9JoxVpEAQ5JIExiQBIBVZH10tYoEGJJE6saAJL1nrFUkwJAkUicGJImxipRNl6tIgCFJpC4MSDIIxlxFAgxJInVgQJIEVpGy6XoVCTAkiVSNAUkGw9irSIAhSaRKDEiSwipSNn2oIgGGJJGqMCDJoLCKfIIhSdR0DEiSiVWkbPpSRQIMSaKm4u2uSCvUeTssY7pfZGN4qyzjY/agHGamTeykulwlY9F3rCCpXvp8IXN10qcqEmAlSaQsBiRpjTqnWnksUhJDkkhxDEhqEKtI2fStigSehKS+ByVDkjSJAUlaxSpS8xiSRPJhQFKjWEXKpo9VZC19D0kiTWBAktaxitQOhiRRwxiQJBd9riLVGZL6XEUCDEmihjAgSW68eIBhYkgSycaAJKOg7iqSlSSR4WFAGphO5pVq7Z9VZP0YkkSGResBuXbtWnh4eMDKygp+fn5IS0trsP2xY8fg5+cHKysrdOjQAevXr5d4PT4+HiKRSOrx+DGXhhs7TSzYYUgSGQ6tBmRCQgIiIiIwf/58ZGdnY+DAgQgJCUFeXp7M9rm5uXjxxRcxcOBAZGdn48MPP8SsWbOQmJgo0c7W1hb5+fkSDysr47mWI6tI7WJIEhkGrQbk8uXLMXnyZEyZMgXdunXDypUr0a5dO6xbt05m+/Xr18PNzQ0rV65Et27dMGXKFLzzzjtYtmyZRDuRSAQXFxeJBxGgudM+GJJE+k9rAVlRUYGsrCwEBQVJbA8KCkJGRobM92RmZkq1Dw4OxunTp1FZ+U/VVFJSAnd3d7Rt2xYjRoxAdna26ndAx7GK1D6GJJF+01pA3r17F9XV1XB2lrzlkbOzMwoKCmS+p6CgQGb7qqoq3L37pDLw9PREfHw8kpOTsXPnTlhZWaF///74/fff6x1LeXk5iouLJR5ERGTctH4/SJFIJPFcEASpbY21f3p7QEAAAgICxK/3798fvXr1wldffYVVq1bJ7DMuLg4LFy5Uavy6xtH1r3/+Wc2f1VfN/RMRaZPWKshWrVrB1NRUqlosLCyUqhJrubi4yGxvZmYGR0fZcWBiYgJ/f/8GK8jo6GgUFRWJHzdv3lRwb4iIjFdqaipGjhwJV1dXiEQi7Nu3T+L12NhYeHp6wtraGvb29hg2bBhOnDgh1U9mZiaee+45WFtbo2XLlhgyZAgePXqkob2QprWAtLCwgJ+fH1JSUiS2p6SkIDAwUOZ7+vXrJ9X+0KFD6N27N8zNzWW+RxAE5OTkoE2bNvWOxdLSEra2thIPIiKST2lpKXx8fLB69WqZr3fp0gWrV6/G+fPnkZ6ejvbt2yMoKAh37twRt8nMzMTw4cMRFBSEkydP4tSpU5gxYwZMTLS3llSrU6xRUVEICwtD79690a9fP2zYsAF5eXkIDw8H8KSyu3XrFrZt2wYACA8Px+rVqxEVFYV3330XmZmZ2LRpE3bu3Cnuc+HChQgICEDnzp1RXFyMVatWIScnB2vWrNHKPhIRGbqQkBCEhITU+/q4ceMkni9fvhybNm3CuXPn8PzzzwMAIiMjMWvWLMybN0/crnPnzuoZsJy0GpChoaG4d+8eFi1ahPz8fHh7e+PAgQNwd3cHAOTn50ucE+nh4YEDBw4gMjISa9asgaurK1atWoXXXntN3ObBgweYOnUqCgoKYGdnB19fX6SmpqJPnz4a3z8iIn1Wd8GipaUlLC0tm9RnRUUFNmzYADs7O/j4+AB4cqjsxIkTeOuttxAYGIhr167B09MTixcvxoABA5r0eU0hEmpXuZBYcXEx7OzsUFRUxOlWImoyTfym1H7GsHb/BzOTpoVYVU05Dt+UPh89JiYGsbGxDb5XJBIhKSkJo0ePltj+ww8/YOzYsSgrK0ObNm2wb98++Pv7AwCOHz+Ofv36wcHBAcuWLUPPnj2xbds2rF27FhcuXNBaJan1VaxERKSbbt68KRHoTakehw4dipycHNy9excbN27EmDFjcOLECTg5OaGmpgYAMG3aNEyaNAkA4Ovri//+97/YvHkz4uLimrYjStL6tViJiEg31V282JSAtLa2RqdOnRAQEIBNmzbBzMwMmzZtAgDxIkovLy+J93Tr1q3eS49qAgOSiIg0ThAElJeXAwDat28PV1dXXLlyRaLN1atXxWtStIFTrERE1CQlJSX4448/xM9zc3ORk5MDBwcHODo6YvHixRg1ahTatGmDe/fuYe3atfjrr7/wxhtvAHhy3HLu3LmIiYmBj48Pevbsia1bt+Ly5cvYs2ePtnaLAUlERE1z+vRpDB06VPw8KioKADBhwgSsX78ely9fxtatW3H37l04OjrC398faWlp6N69u/g9ERERePz4MSIjI3H//n34+PggJSUFHTt21Pj+1OIqVhm4ipWIVElfV7Ea+28gj0ESERHJwIAkIiKSgQFJREQkAwOSiIhIBgYkERGRDAxIIiIiGRiQREREMjAgiYiIZGBAEhERycCAJCIikoEBSUREJAMDkoiISAYGJBERkQy83RURkQGpufc3akQWTetDqFDRaPQbK0giIiIZGJBEREQyMCCJiIhkYEASERHJwIAkIiKSgQFJREQkAwOSiIhIBgYkERGRDAxIIiIiGRiQREREMjAgiYiIZGBAEhERycCAJCIikoEBSUREJAMDkoiISAYGJBERkQxaD8i1a9fCw8MDVlZW8PPzQ1paWoPtjx07Bj8/P1hZWaFDhw5Yv369VJvExER4eXnB0tISXl5eSEpKUtfwiYiMXmpqKkaOHAlXV1eIRCLs27dP/FplZSX+9a9/oUePHrC2toarqyvefvtt3L59W6KP8vJyzJw5E61atYK1tTVGjRqFv/76S8N7IkmrAZmQkICIiAjMnz8f2dnZGDhwIEJCQpCXlyezfW5uLl588UUMHDgQ2dnZ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Step 4: visualize results after advancing in time\n", "fig = plt.figure()\n", "cs = plt.contourf(x, y, T, levels=20)\n", "plt.xlabel('x (m)')\n", "plt.ylabel('y (m)')\n", "plt.axis('scaled')\n", "ax = plt.gca()\n", "ax.set_xlim(0, 0.3)\n", "ax.set_ylim(0, 0.4)\n", "cbar = plt.colorbar(cs)\n", "cbar.ax.set_ylabel('Temperature (degree Celsius)')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can check the final temperature at the center of the plate." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The temperature at the plate center is 193.1574 degree Celsius.\n" ] } ], "source": [ "# Step 5: examine results of interest\n", "print('The temperature at the plate center is {:.4f} degree Celsius.'.format(0.5*(T[ny//2, nx//2] + T[ny//2-1, nx//2])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise\n", "\n", "1. Check the grid independence. Increase the resolution until the numerical result (e.g., the temperature at the plate center) does not change any more.\n", "\n", "2. Modify the code such that different spatial resolutions in the horizontal and vertical directions can be applied. (*optional*)" ] } ], "metadata": { "kernelspec": { "display_name": "cfd-python", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.14" } }, "nbformat": 4, "nbformat_minor": 2 }