diff --git a/README.md b/README.md index d63a6a1..af92527 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,85 @@ -**University of Pennsylvania, CIS 565: GPU Programming and Architecture, -Project 1 - Flocking** +

+ Logo +

Author: (Charles) Zixin Zhang

+

+ A flocking simulation based on the Reynolds Boids algorithm +

+

-* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +--- +## About The Project +

+Outside Cube Pic +

-### (TODO: Your README) -Include screenshots, analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +A flocking simulation based on the Reynolds Boids algorithm, along with two levels of optimization: a uniform grid, and a uniform grid with semi-coherent memory access. + +--- +## Highlights + +

+ + Outside Cube Pic + Inside Cube Pic +

+ + +Stats: +- Coherent uniform grid approach +- CPU: i7-10700F @ 2.90GHz +- GPU: SM 8.6 NVIDIA GeForce RTX 3080 +- Number of Boids: 12 million +- Average FPS: ~40 + +Note: For the first picture, I use a larger timestep to speed up the simulation to observe the overall trend better, whereas the second picture uses a smaller time step to better observe the movement of the particles (it also looks cool :sunglasses:). + +--- + +## Performance Analysis + +In this project, I investigate 3 approaches to implement the Reynolds Boids algorithm: + +1. Naive approach has each boid check every other boid in the simulation. +2. Uniform grid approach culls unnecessary neighbor checks using a data structure called a uniform spatial grid. +3. Coherent uniform gird approach improves upon the second approach by cutting one level of indirection when accessing the boids' data. + +--- +To validate our optimization, I use ```Matplotlib``` to plot the framerate change with an increasing number of boids for these 3 approaches. Average framerate is observed visually. Note that the below experiment has ```scene_scale=100.0f``` because it will affect FPS based on the number of particles in the scene. Additionally, I consider 30~60 FPS to be an acceptable framerate. + + + + + + + +Based on the above 3 plots, I conclude that there is approximately **x10** efficiency improvement (in terms of the number boids the method can handle) per step going from the naive approach to the coherent uniform grid approach. For example, the naive approach can handle tens of thousands of particles, whereas the coherent grid approach can handle millions of particles with ease. Our optimization works as expected because of two factors: + +1. We have culled tons of neighbor checks by only checking particles in at most 8 cells. +2. We have eliminated the need for another indirection happened when accessing the position/velocity arrays. This is done by reshuffling them so that all the velocities and positions of boids in one cell are contiguous in memory. + +Furthermore, the program runs more efficiently without visualization. Drawing all the boids in OpenGL takes time and resources. + +--- +I also plot framerate change with increasing block size to investigate the effect of block size on the efficiency of the algorithm. Note that the following parameters are used when running this experiment: + +- Visualization: off +- Approach: coherent grid +- Number of boids: 50000 +- scene_scale: 100.0f + + + +At ```blocksize=1024```, the program achieves the highest framerate. + +--- +In this implementation, the cell width of the uniform grid is hardcoded to be twice the neighborhood distance. Therefore, the program can get away with at most 8 neighbor cell checks. However, if I change the cell width to be the neighborhood distance, 27 neighboring cells will need to be checked. To investigate this further, two setups are used to compare the performance: + +1. Uniform grid approach with 50000 boids +2. Uniform grid approach with 500000 boids + +Using the first setup, checking 27 cells with ```gridCellWidth = std::max(std::max(rule1Distance, rule2Distance), rule3Distance);``` didn't noticeably impact the performance with 50000 boids sparsely populating the space. Using the second setup with densely populated boids in the space, checking 27 cells provides better performance than checking only 8 cell. + +### TODO + +Substitute gif with Youtube Link https://stackoverflow.com/questions/11804820/how-can-i-embed-a-youtube-video-on-github-wiki-pages \ No newline at end of file diff --git a/images/blocksize.png b/images/blocksize.png new file mode 100644 index 0000000..0b4e6ea Binary files /dev/null and b/images/blocksize.png differ diff --git a/images/coherent.png b/images/coherent.png new file mode 100644 index 0000000..7c0bd15 Binary files /dev/null and b/images/coherent.png differ diff --git a/images/insideCube.gif b/images/insideCube.gif new file mode 100644 index 0000000..a721e5c Binary files /dev/null and b/images/insideCube.gif differ diff --git a/images/logo.gif b/images/logo.gif new file mode 100644 index 0000000..821bde1 Binary files /dev/null and b/images/logo.gif differ diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000..9c2762c Binary files /dev/null and b/images/logo.png differ diff --git a/images/naive.png b/images/naive.png new file mode 100644 index 0000000..6a8d690 Binary files /dev/null and b/images/naive.png differ diff --git a/images/outSideCube.gif b/images/outSideCube.gif new file mode 100644 index 0000000..2e67cf9 Binary files /dev/null and b/images/outSideCube.gif differ diff --git a/images/plotting/.ipynb_checkpoints/CUDA Flocking-checkpoint.ipynb b/images/plotting/.ipynb_checkpoints/CUDA Flocking-checkpoint.ipynb new file mode 100644 index 0000000..fca51ef --- /dev/null +++ b/images/plotting/.ipynb_checkpoints/CUDA Flocking-checkpoint.ipynb @@ -0,0 +1,189 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 39, + "id": "1f1923e1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import numpy as np\n", + "# with visualization\n", + "naiveBoids = np.linspace(10000, 100000, 8)\n", + "naiveFPS = [180, 92, 64, 46, 27, 20, 15, 12]\n", + "# without visualization\n", + "naiveBoidsV = np.linspace(10000, 100000, 8)\n", + "naiveFPSV = [207, 102, 68, 49, 29, 20, 15, 12]\n", + "\n", + "naiveFig, naiveAxes = plt.subplots()\n", + "\n", + "naiveAxes.plot(naiveBoids, naiveFPS, label=\"With Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "naiveAxes.plot(naiveBoidsV, naiveFPSV, label=\"Without Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "naiveAxes.get_xaxis().set_major_formatter(\n", + " matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))\n", + "naiveAxes.yaxis.set_ticks(np.arange(0, 220, 10))\n", + "naiveAxes.xaxis.set_ticks(np.arange(10000, 110000, 15000))\n", + "naiveAxes.set_xlabel('Number of Boids') # Notice the use of set_ to begin methods\n", + "naiveAxes.set_ylabel('FPS')\n", + "naiveAxes.set_title('Naive Approach')\n", + "naiveAxes.axhline(y=30, color='r', linestyle='--',alpha=0.5)\n", + "naiveAxes.axhline(y=60, color='g', linestyle='--',alpha=0.5)\n", + "naiveAxes.legend()\n", + "\n", + "# with visualization\n", + "uniformBoids = np.linspace(100000, 700000, 7)\n", + "uniformFPS = [440, 200, 137, 60, 45, 27, 17]\n", + "# without visualization\n", + "uniformBoidsV = np.linspace(100000, 700000, 7)\n", + "uniformFPSV = [600, 300, 145, 80, 48, 28, 17]\n", + "\n", + "uniformFig, uniformAxes = plt.subplots()\n", + "\n", + "uniformAxes.plot(uniformBoids, uniformFPS, label=\"With Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "uniformAxes.plot(uniformBoidsV, uniformFPSV, label=\"Without Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "uniformAxes.get_xaxis().set_major_formatter(\n", + " matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))\n", + "uniformAxes.yaxis.set_ticks(np.arange(0, 650, 50))\n", + "#uniformAxes.xaxis.set_ticks(np.arange(10000, 110000, 15000))\n", + "uniformAxes.set_xlabel('Number of Boids') # Notice the use of set_ to begin methods\n", + "uniformAxes.set_ylabel('FPS')\n", + "uniformAxes.set_title('uniform Approach')\n", + "uniformAxes.axhline(y=30, color='r', linestyle='--',alpha=0.5)\n", + "uniformAxes.axhline(y=60, color='g', linestyle='--',alpha=0.5)\n", + "uniformAxes.legend()\n", + "\n", + "\n", + "# with visualization\n", + "coherentBoids = np.linspace(1000000, 2500000, 4)\n", + "coherentFPS = [95, 50, 30, 19]\n", + "# without visualization\n", + "coherentBoidsV = np.linspace(1000000, 2500000, 4)\n", + "coherentFPSV = [108, 53, 31, 20]\n", + "\n", + "coherentFig, coherentAxes = plt.subplots()\n", + "\n", + "coherentAxes.plot(coherentBoids, coherentFPS, label=\"With Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "coherentAxes.plot(coherentBoidsV, coherentFPSV, label=\"Without Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "coherentAxes.yaxis.set_ticks(np.arange(0, 110, 10))\n", + "coherentAxes.set_xlabel('Number of Boids') # Notice the use of set_ to begin methods\n", + "coherentAxes.set_ylabel('FPS')\n", + "coherentAxes.set_title('coherent Approach')\n", + "coherentAxes.axhline(y=30, color='r', linestyle='--',alpha=0.5)\n", + "coherentAxes.axhline(y=60, color='g', linestyle='--',alpha=0.5)\n", + "coherentAxes.legend()\n", + "\n", + "# with visualization\n", + "blockSize = [128, 256, 512, 1024]\n", + "blockFPS = [850, 859, 860, 900]\n", + "\n", + "blockFig, blockAxes = plt.subplots()\n", + "\n", + "blockAxes.plot(blockSize, blockFPS, marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "blockAxes.xaxis.set_ticks(np.arange(0, 1088, 128))\n", + "blockAxes.set_xlabel('Block Size') \n", + "blockAxes.set_ylabel('FPS')\n", + "blockAxes.set_title('Block Size vs FPS')\n", + "\n", + "\n", + "\n", + "naiveFig.savefig(\"naive.png\")\n", + "uniformFig.savefig(\"uniform.png\")\n", + "coherentFig.savefig(\"coherent.png\")\n", + "blockFig.savefig(\"blocksize.png\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8015ef9a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1000000., 1500000., 2000000., 2500000.])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/images/plotting/CUDA Flocking.ipynb b/images/plotting/CUDA Flocking.ipynb new file mode 100644 index 0000000..e283b04 --- /dev/null +++ b/images/plotting/CUDA Flocking.ipynb @@ -0,0 +1,189 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "1f1923e1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEWCAYAAAB42tAoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABOdElEQVR4nO3dd3xUVfr48c+TngChJPQQEnoLBAhNkGZnsWFFLCjIquha1l3d5fdV1112XV13FXtHBQELKmtblY50MPRO6DWUUBNSnt8f9wYmySQhkMwk5Hm/XvPKzL3n3nvuTDJP7j3nOUdUFWOMMaYwAf6ugDHGmPLNAoUxxpgiWaAwxhhTJAsUxhhjimSBwhhjTJEsUBhjjCmSBQpzQRORP4vIu/6uR3kkIn1FZIe/62HKPwsUplwTkS0isldEqngsGy4iM85me1X9u6oOL8P6jRWRLBFpUFbHMMbfLFCYiiAIeNjflcjPDV43AGnAkDI8TlBZ7duYs2GBwlQELwCPi0gNbytF5GUR2S4iR0RkiYhc7LHuGREZ5z7/QUQezLftMhEZ5D5vJSI/ichBEVknIjcXU68bgMPAs8Bd+fb7jIh8LiKTROSoiCwVkQ4e67eIyJ9EZLWIHBKRD0QkzF3XV0R2iMgTIrIH+EBEQkXkJRHZ5T5eEpFQt3xNEflGRPa7+/pGRGI8jlXL3f8ud/1X+er6exHZJyK7ReTuYs7ZVEIWKExFsBiYATxeyPpFQCJQC/gE+Cz3SzefT4DBuS9EpA3QGPjWvTr4yS1Txy33uoi0LaJedwETgIlAKxHplG/9tcBnHvX6SkSCPdYPAa4AmgItgP/nsa6eu11jYAQwCujunmcHoKtH+QDgA7dsLHASeNVjXx8DEUBb99z+k+841YGGwDDgNRGpWcQ5m8pIVe1hj3L7ALYAlwLtcG7x1AaGAzOK2OYQ0MF9/gwwzn1eDTgONHZfjwbed5/fAszOt5+3gKcLOUYskAMkuq//B7zssf4ZYL7H6wBgN3Cxx3nd57F+ALDJfd4XOAWEeazfBAzweH0FsKWQuiUCh9zn9d161vRSri9OUAnyWLYP6O7vz90e5ethVxSmQlDVlcA3wJP517m3TtaISJqIHMb5Dznayz6OAt8Ct7qLbgXGu88bA91E5HDuA+c//nqFVOkOYI2qJruvxwO35bti2O5x7BxgB9DA23pga751+1U13eN1A7dMgfIiEiEib4nIVhE5AswCaohIINAIOKiqhwo5jwOqmuXx+gRQtZCyppKyQGEqkqeBe3FukwDgtkc8AdyM819zDZwrDylkHxOAwSLSAwgHprvLtwMzVbWGx6Oqqt5fyH7uBJqIyB63HeHfOMHpKo8yjTzqGQDEALu8rce5QvFcl39Y5104wcxb+d8DLYFuqhoJ9M49rHtetQpr3zHmbFigMBWGqm4EJgG/81hcDcgC9gNBIvIUEFnEbr7D+cJ9Fpjk/qcPztVKCxG5Q0SC3UcXEWmdfwdukGmK006Q6D7a4bRDeDZqdxaRQW6vpUeADGC+x/qRIhIjIrWAP7vnVpgJwP8TkdoiEg08BYzzeA9OAofdfT2du5Gq7ga+x2lvqemeV2+MKQELFKaieRao4vH6fzhfhOtxbsekk/eWTh6qmgFMxmn3+MRj+VHgcpzbUbuAPcA/gVAvu7kL+FpVV6jqntwH8DIw0P2yBvgap+3jEM6tqkGqmumxn0+AH4HN7uNvRZz333Aa9ZcDK4ClHuVfwrk6SsUJRD/k2/YOIBNYi9MG8UgRxzGmAFG1iYuMKW0i8gzQTFVvL2T9FmC4qv7sy3oZcy7sisIYY0yRLFAYY4wpkt16MsYYUyS7ojDGGFOkCj3YWHR0tMbFxfm7GsYYU6EsWbIkVVVrn235Ch0o4uLiWLx4sb+rYYwxFYqIbC2+1Bl268kYY0yRLFAYY4wpUpkFChFpJCLT3cHaVonIw+7ym9zXOSKSlG+bP4nIRncugCvKqm7GGGPOXlm2UWQBv1fVpSJSDVgiIj8BK4FBOEM4n+bODXArzpj5DYCfRaSFqmaXYR2NqVAyMzPZsWMH6enpxRc2lV5YWBgxMTEEBwcXX7gIZRYo3MHIdrvPj4rIGqChqv4EIFJgcM9rgYnuWDwpIrIRZ9C1eWVVR2Mqmh07dlCtWjXi4uK8/Q0Zc5qqcuDAAXbs2EF8fPx57csnbRQiEgd0BBYUUawheQdz24HHcNIe+xohIotFZPH+/ftLXJcJK8bT7vU4Ap8NoN3rcUxYMb74jYwpJ9LT04mKirIgYYolIkRFRZXK1WeZd48VkarAF8AjqnqkqKJelhVIG1fVt4G3AZKSkkqUVj5hxXhGTRvBe9ecoFcszNm2lWFTRgAwOGFISXZljN9YkDBnq7R+V8r0isKd7esLYLyqTi6m+A7yTuSSf5KX8zZ69ijeu+YE/eIhOBD6xcN715xg9OxRpXkYY4y5oJRlrycB3sOZLvLfZ7HJFOBWEQkVkXigObCwNOu0JnUbvWLzLusV6yw3xhTv0Ucf5aWXXjr9+oorrmD48OGnX//+97/n3//+N1OmTOG5554D4KuvvmL16tWny/Tt27fYRNn4+HjWrVuXZ9kjjzzC888/z5tvvslHH31UCmdzRlxcHKmpqQBcdNFF57SPv//973len+t+yqOyvKLoiTNhSn8RSXYfA0TkehHZAfQAvhWR/wGo6irgU2A1zsQrI0u7x1Pr6Fjm5IsJc7Y5y425EJV2m9xFF13E3LlzAcjJySE1NZVVq1adXj937lx69uzJNddcw5NPOtOb5w8UZ+PWW29l4sSJp1/n5OTw+eefc8stt3Dfffdx5513ntd5FCX3/Eoqf6A41/2US6paYR+dO3fWkvhk+TiNfylCp21GT2Wh0zaj8f8J00+WjyvRfozxl9WrV591Wa+/7y9FnNfv+86dO7Vhw4aqqrp8+XK988479bLLLtODBw9qenq6Vq9eXTMyMvSDDz7QkSNH6i+//KI1a9bUuLg47dChg27cuFH79Omjf/zjH7VLly7avHlznTVrVoHjLFu2TFu1anX69fTp07Vnz56qqvr000/rCy+8oKqqL7/8srZu3VoTEhL0lltuKbBeVbVt27aakpKiqqrXXnutdurUSdu0aaNvvfXW6TKNGzfW/fv3q6pqlSpVVFX1//7v/7RDhw7aoUMHbdCggQ4dOrTQfTzxxBMaEBCgHTp00Ntuuy3PfnJycvTxxx/Xtm3bart27XTixImnz6lPnz56ww03aMuWLfW2227TnJycc/5sCuPtdwZYrCX4rq3QYz2VVG6D9UPfj2JN6jZaBwuj6/eyhmxTIf3lv6tYvavw/iEz0n7PxJucNjk40yZ362e/56u5Tbxu06ZBJE9f3bbQfTZo0ICgoCC2bdvG3Llz6dGjBzt37mTevHlUr16d9u3bExIScrr8RRddxDXXXMPAgQO58cYbTy/Pyspi4cKFfPfdd/zlL3/h55/zTvTXvn17AgICWLZsGR06dGDixIkMHjy4QH2ee+45UlJSCA0N5fDhw4XWO9f7779PrVq1OHnyJF26dOGGG24gKirKa9lnn32WZ599lrS0NC6++GIefPDBQvfx3HPP8eqrr5KcnFxgP5MnTyY5OZlly5aRmppKly5d6N3bmbb8119/ZdWqVTRo0ICePXvyyy+/0KtXr2LPw9f8kZldS0R+EpEN7s+a7nIRkTFuZvZyEelUFvUanDCElQ9sIfupHFa2e5DBO5bDyUNlcShj/Gr/yX1e2+T2n9x3Xvvt2bMnc+fOPR0oevTocfr12d6XHzRoEACdO3dmy5YtXssMHjyYiRMnkpWVxddff81NN91UoEz79u0ZMmQI48aNIyio+P97x4wZQ4cOHejevTvbt29nw4YNRZZXVYYMGcKjjz5K586dz2kfc+bMYfDgwQQGBlK3bl369OnDokWLAOjatSsxMTEEBASQmJhY6Hvhb/7IzB4KTFXV50TkSeBJ4AngKpwG7OZAN+AN92fZSRoGS8ZC8ifQY2SZHsqY0lbUf/4Aq16PZc62raevKMBpk2tTO5ZJv+1xzsfNbadYsWIF7dq1o1GjRrz44otERkZyzz33nNU+QkNDAQgMDCQrK8trmcGDB3P55ZfTp08f2rdvT506dQqU+fbbb5k1axZTpkzhr3/9K6tWrSIoKIicnJzTZXLzCGbMmMHPP//MvHnziIiIoG/fvsXmGDzzzDPExMRw9913n/M+tIjJ4XLfByj6vfC3MruiUNXdqrrUfX4UWIOTQHct8KFb7EPgOvf5tcBH7i20+UANEalfVvUDoH57iOkKi94Dj18sYy4Eoy4ezbApEUxPgcxsmJ4Cw6ZEMOri0ee13549e/LNN99Qq1YtAgMDqVWrFocPH2bevHn06FEwAFWrVo2jR4+W+DhNmzYlKiqKJ5980uttp5ycHLZv306/fv14/vnnOXz4MMeOHSMuLo6lS5cCsHTpUlJSUgBIS0ujZs2aREREsHbtWubPn1/k8b/55ht++uknxowZc3pZUfsIDg4mMzOzwH569+7NpEmTyM7OZv/+/cyaNYuuXbuW+P3wJ39kZtdVZ3iP3GE+cv9N8ElmdgFdhsPBTZAy8/z3ZUw5MjhhCKP7v81D3zcmbLTw0PeNGd3/7fNuk0tISCA1NZXu3bvnWVa9enWio6MLlL/11lt54YUX6NixI5s2bSrZOQwezNq1a7n++usLrMvOzub2228nISGBjh078uijj1KjRg1uuOEGDh48SGJiIm+88QYtWrQA4MorryQrK4v27dvzf//3f3nq782LL77Irl276Nq1K4mJiTz11FNF7mPEiBGnb4V5uv7662nfvj0dOnSgf//+PP/889SrV69E74O/lfmc2W5m9kxgtKpOFpHDqlrDY/0hVa0pIt8C/1DVOe7yqcAfVXVJYftOSkrS8564KDMd/tMGYnvArTachynf1qxZQ+vWrf1dDVOBePudEZElqppUyCYF+CMze2/uLSX3Z27LWplnZnsVHAYdb4d130PazjI/nDHGVDT+yMyeAtzlPr8L+Npj+Z1u76fuQFruLaoy1/lu0BxY+mHxZY0xppLxeWY28BxwmYhsAC5zXwN8B2wGNgLvAA+UYd3yqhUPzS+DJR9CdsHGKGOMqczKcj6KOXgfERbgEi/lFfBfH9WkYTDhFlj7LbS9zm/VMMaY8sbmzM7V/DKoHguL3vV3TYwxplwpyzaK90Vkn4is9FjWQUTmicgKEfmviER6rPPvfNkBgZB0N2yZDfvXFV/eGGMqibK8ohgLXJlv2bvAk6qaAHwJ/AEKzJd9JfC6iASWYd2863gHBATD4vd9fmhjKgJfDTN+tvKP2Jpr6NChvPXWW3mWffXVVwwYMIDFixfzu9/9rlSO73m8zz//HIDhw4eXeLRcgLFjx7Jr15mOnue6n7JQlpnZs4CD+Ra3BGa5z38CbnCfn54vW1VTcBq0fZ+6WLW20z6R/AmcOu7zwxtT2irqMONnq7BAkTtOlKfcgQWTkpLyZFuXtnfffZc2bdqUeLv8geJc91MWfN1GsRK4xn1+E2fyJs4qKxvKIDM7vy7DIeMIrPis9PdtjA/lTv37ylVbSR+lvHLVVkZNG3FewSJ3QECAVatW0a5dO6pVq8ahQ4fIyMhgzZo1dOzYkbFjx/Lggw8yd+5cpkyZwh/+8AcSExNPZ2Z/9tlndO3alRYtWjB79mzAGZPp7rvvPp1pPX36dIDT+8o1cOBAZsyYwZNPPsnJkydJTEwskA196aWXsnbtWnbvdnrYnzhxgp9//pnrrruOGTNmMHDgQABmzpxJYmIiiYmJdOzYkaNHj+ZZD/Dggw8yduxYwBlRtkuXLrRr144RI0Z4Hccp94ppypQpp/fdsmVL4uPjC93H559/zuLFixkyZAiJiYmcPHkyz5XXhAkTSEhIoF27djzxxBOnj1W1alVGjRp1epDCvXv3nuMnWzRfB4p7gJEisgSoBpxyl5/VfNngzJmtqkmqmlS7du3Sr2GjblCnrdOoXcZZ68acl++fhA9+U+hj9PfDvU/9+/3wwrf7/skiD+ltmPFu3boxb948Fi9eXOgw4y+88ALJyck0bdoUODPM+EsvvcRf/vIXAF577TUAVqxYwYQJE7jrrruKHHDvueeeIzw8nOTkZMaPzxv8AgMDGTRoEJ9++ikAU6ZMoV+/flSrVi1PuX/961+89tprJCcnM3v2bMLDw4s8/wcffJBFixaxcuVKTp48yTfffFNo2WuuuYbk5GSSk5Pp0KEDjz/+eKH7uPHGG0lKSmL8+PEkJyfnqceuXbt44oknmDZtGsnJySxatIivvvoKgOPHj9O9e3eWLVtG7969eeedd4qs/7nyaaBQ1bWqermqdgYmALkDv/gnK9sbEegyDPasgB2lcx/VGH9YczLd+9S/J4se7bQ4ZTXM+Jw5c7jjjjsAaNWqFY0bN2b9+vXnXE/P20+FzWfRs2dPHnvsMcaMGcPhw4eLHap8+vTpdOvWjYSEBKZNm5bntlthnn/+ecLDwxk5cuQ57WPRokX07duX2rVrExQUxJAhQ5g1y7mDHxIScvrqp6gh28+XTycuEpE6qrpPRAKA/we86a6aAnwiIv8GGlAG82WXSPub4aennauKRl38Vg1jinTVc0Wubv16nNdhxlvXbgx3f3vOhy2rYcYLG3eusGHDi9OzZ092797NsmXLmDt3boE2C4Ann3yS3/zmN3z33Xd0796dn3/+udDjpaen88ADD7B48WIaNWrEM888U2xdpk6dymeffXb6i/1c9lHUeHzBwcE4g2CU7TDlZdk9dgIwD2gpIjtEZBgwWETWA2txrhg+AN/Ml10iodWgw62w6ks4fsBv1TDmfFS0YcZ79+59+hbS+vXr2bZtGy1btiQuLo7k5OTTw4ovXHjmf8jChvYGEBFuvvlm7rrrLgYMGEBYWFiBMps2bSIhIYEnnniCpKQk1q5dS+PGjVm9ejUZGRmkpaUxdepU4EzAiI6O5tixY6d7ORVm69atPPDAA3z66aenbyUVtY/C3qdu3boxc+ZMUlNTyc7OZsKECfTp06fIY5e2sszMLnid53i5kPKjgfP7DS5NXYbBoncgeRz0fNjftTGmxApM/Rsdy+j+o0ttmPHbbrstz7Jjx44VOsz4vffey5gxY4r8cn3ggQe47777SEhIICgoiLFjxxIaGkrPnj2Jj48/3ZjbqdOZyS9zh/bu1KlTgXYKcG4/vfDCC6e76ub30ksvMX36dAIDA2nTpg1XXXUVoaGh3HzzzbRv357mzZvTsWNHAGrUqMG9995LQkICcXFxdOlS9N2GsWPHcuDAgdNDpDdo0IDvvvuu0H0MHTqU++67j/DwcObNm3d6ef369fnHP/5Bv379UFUGDBjAtddeW+SxS1uZDzNelkplmPGifDAAjuyEh36FAEtiN/5nw4ybkirXw4wXkpmdKCLz3QECF4tIV3e5T+bLhhL2K+8yDA5tgU3Tyqo6xhhT7vk6M/t54C+qmgg85b6GvPNlj8CZL7vUlbhfeauroUodG//JGFOp+TozW4Hc8Z2qc6YLrE/myx49e5T3fuWzR3nfICgEOt0J63+Aw9tKuzrGnJOKfLvY+FZp/a74+sb7I8ALIrId+BfwJ3e5TzKz16Ru896vPLWIINB5qJNbsWRsiY5lTFkICwvjwIEDFixMsVSVAwcOeO3tVVI+zaMA7gceVdUvRORmnBnwLqWEmdnA2+A0Zpfk4K2jY733K4+OLXyjGo2gxZWw9CPo8wQEhZbkkMaUqpiYGHbs2EGZDF9jLjhhYWHExMSc9358HSjuAnL7mn6GM5os+Cgz2+lXPoL3rjlBr1gnSAz9KpznLi2mV26XYbDuO1jzX0i4sbSrZcxZCw4OPj1mkDG+4utAsQvoA8wA+gMb3OVTgAdFZCLQjTKaLzt/v/Ko0DrU1uHc1KawlA9Xk/5QMx4WvWeBwhhT6fg6M/te4EURWQb8HaeHE/hwvuzBCUNY+cAWsp/K4aPfJHP8cA++WV5MTAoIgKR7YNtc2Fv82C7GGHMhqdQJdzk5yoAxs8nMzuHHR/sQGFDYFN/AiYPwYivoeDsM/Pc5H9MYY/yt3CTcVQQBAcJD/Zuzaf9xvltRzFVFRC1odwMsnwQZxY9bY4wxFwpfZ2ZPcrOyk0Vki4gke6zzy5zZV7WrR/M6VXll2gZycoq5uuoyDE4dc4KFMcZUEj7NzFbVW1Q10c3M/gKYDP6dMzsgQHiwfzPW7z3G/1btKbpww85Qv4PTqF2Bb9kZY0xJ+DozG3DGdgJuxpm8CPw8Z/bA9g1oUrsKL08t5qpCxJkqdd9q2DbfV9Uzxhi/8lcbxcXAXlXN7R7r1zmzAwOEh/o3Y+2eo/y0ppg5Z9vdAKHVbfwnY0yl4a9AMZgzVxNQDubMvrp9A+KiIhgzdUPRwyOEVIHE22D113BsX6kd3xhjyiufBwoRCQIGAZ4twn6fMzsoMICR/ZqxatcRpq0tJgB0GQY5mfDrx76pnDHG+JE/riguBdaq6g6PZVOAW0UkVETi8dOc2dd1bEijWuHFX1VEN4f43rD4A8jx34ytxhjjC77OzAand5PnbadyM2d2cGAAI/s2Y9mONGauL6b9o8twSNsOG370TeWMMcZPKnVmtjensnLo968Z1IkMZfL9F+F00PIiOxNeSoC67eD2oidZN8aY8sQys89TSFAA9/dtyq/bDvPLxgOFFwwMduaq2PgzHNzss/oZY4yv+TQz213+kJt9vUpEnvdY7pfMbG9uSoqhXmQYL09dX3RbRac7QQKctgpjjLlA+TQzW0T64STXtVfVtjiz3Pk1M9ub0KBA7u/blEVbDjF/s9ecQUdkA2j1G/h1HGSm+66CxhjjQ77OzL4feE5VM9wyuf1Q/ZqZ7c0tXRpRp1ooY6ZuKLpgl+Fw8iCs/son9TLGGF/zdRtFC+BiEVkgIjNFpIu73K+Z2d6EBQdyX5+mzNt8gIUpRVxVxPeGqOaWqW2MuWD5OlAEATWB7sAfgE/dcZ/8npntzeCusURXLeaqQsRJwNuxCHYvK9P6GGOMP/g6UOwAJqtjIZADRFMOMrO9CQ8J5Le9mzBnYypLthZxVdFhMASFO6PKGmPMBcbXgeIrnLmyEZEWQAiQSjnJzPZmSPdYalUJYczUjYUXCq/hzKW94jNIT/NZ3Ywxxhd8nZn9PtDE7TI7EbjLvbooF5nZ3kSEBHHvxU2YuX4/ydsPF16wy3DIPAHLJvqsbsYY4wuWmX0WjmVk0euf0+gcW5P3hnYpvOA7l0DGERi50Gm7MMaYcsgys8tA1dAghveKZ+rafazcWcStpS7DIHU9bJntu8oZY0wZ8/Wc2c+IyE6PebMHeKwrN5nZ3tx5URyRYUFF94Bqez2E17RGbWPMBcWnmdmu/+TOm62q30H5y8z2JjIsmHt6xfPj6r2s3nXEe6HgcOh4O6z9Bo7s9m0FjTGmjPhlzmwvyl1mtjd3XxRPtdAgXp1exFVF57shJwuWfuS7ihljTBnyRxvFgyKy3L01VdNdVu4ys72pHhHM0J5xfLdiD+v2HPVeKKopNL0EloyF7Cyf1s8YY8qCrwPFG0BTIBHYDbzoLi+XmdneDOsVT5WQQF6ZVsRVRZfhcHQXrP/edxUzxpgy4tNAoap7VTVbVXOAdzhze6lcZmZ7UyMihLsuiuPbFbvZuK+Qq4oWV0BkjI3/ZIy5IPg0UIhIfY+X1wO5PaLKbWa2N8MvbkJ4cCCvTiskWzsgEJKGwuYZkFpERrcxxlQAvs7Mfl5EVojIcqAf8CiUnzmzz1atKiHc0b0xU5btYvP+Y94LdbwTAoJh8fu+rZwxxpQyy8w+R/uPZnDx89P4TUIDXry5g/dCn90Nm6bCY2shJMK3FTTGmEJYZraP1K4WypBujfkqeSdbDxz3XqjLcGeQwJVf+LZyxhhTinw+Z7a77nERURGJdl+LiIxxM7OXi0insqpXafpt7yYEBgivT9/kvUDji6B2a1hsmdrGmIrL55nZItIIuAzY5rH4KpwG7ObACJxutOVencgwbusayxdLd7D94ImCBXInNdr1K+xc4vsKGmNMKfBHZvZ/gD+SN0/iWuAjd8jx+UCNfD2kyq3f9mlCgAhvzCzkqqL9LRBcxcZ/MsZUWL7uHnsNsFNV888ZWiEys72pXz2cm7vE8Nni7ew6fLJggbBI6HCL005x4mxHNDHGmPLDZ4FCRCKAUcBT3lZ7WVYuM7O9ub9vMwDemFHIVUXSMMhKh+RPfFgrY4wpHb68omgKxAPLRGQLTvb1UhGpRwXKzPamYY1wbuzciEmLtrMnLb1ggXrtoFF3p1E7J8f3FTTGmPPgs0ChqitUtY6qxqlqHE5w6KSqe3Ays+90ez91B9JUtUKN0/1A36bkqPJmYW0VXYbDwc2QMsOn9TLGmPPl68zswnwHbMYZXvwd4IGyqldZaVQrgkGdGjJh4Tb2HfFyVdHmGoiItkZtY0yFU5a9ngaran1VDVbVGFV9L9/6OFVNdZ+rqo5U1aaqmqCq/km3Pk8j+zUjK0d5e9bmgiuDQqHTHbDuO0jb4fvKGWPMObLM7FLUOKoK1yY2YNyCraQeyyhYoPPdoApLPvR95Ywx5hz5es7sv7qZ18ki8qOINHCXV8jMbG9G9mvGqawc3pnt5aqiZmNnCPKlH0LWKd9XzhhjzoGvM7NfUNX2qpoIfMOZrrIVMjPbm6a1q3J1hwZ8PG8rB497CQZJw+DYXmdebWOMqQB8mpmtqkc8XlbhTK5Ehc3M9ubBfs04mZnNe3O8XFU0uwRqNLbhx40xFYbP2yhEZLSIbAeGcOaKosJmZnvTvG41BiTU58O5Wzl8It9VRUAgJN0DW2bDvrX+qaAxxpSAzwOFqo5S1UbAeOBBd3GFzsz25qH+zTiWkcX7c1IKrux4OwSG2KiyxpgKwZ+9nj4BbnCfV+jMbG9a1Yvkyrb1+OCXLaSdzMy7sko0tL0elk2EjEJmyDPGmHLC14MCNvd4eQ2Qe++lwmdme/PQJc04mpHF2F+2FFzZZThkHIEVn/m8XsYYUxK+zsx+TkRWunNmXw487Bav8JnZ3rRtUJ3L2tTlvTmbOZqe76oipgvUTXAytSvwdLTGmAufTzOzVfUGVW3ndpG9WlV3umUviMxsb37XvzlH0rP4aN7WvCtyJzXauwJ2LPJP5Ywx5ixYZnYZS4ipTv9WdXhn9maOZWTlW3kThEbConf9UzljjDkLvs7MfkFE1rrZ11+KSA2PdX9yM7PXicgVZVUvf3iofzMOn8hk3Px8VxWhVaHDrbDqSzie6p/KGWNMMXydmf0T0E5V2wPrgT8BiEgb4FagrbvN6yISWIZ186mOsTXp3aI278zazIlT+a4qkoZB9in4dZx/KmeMMcXwdWb2j6qa+005H6cbLDiZ2RNVNUNVU3AatbuWVd384eFLmnHg+Ck+WbAt74o6rSDuYidTOyfbP5Uzxpgi+LON4h7ge/f5BZWZ7U3nxrXo2SyKN2duJj0zX0BIugcOb4WNU/1TOWOMKYJfAoWIjAKycLKz4QLMzPbmd/2bk3osgwkL811VtBoIVetaprYxplzyx1hPdwEDgSGqpxMILrjMbG+6NYmiW3wt3py5Ke9VRVAIdLoL1v8PDm0tfAfGGOMHvs7MvhJ4ArhGVU94rJoC3CoioSISjzPc+EJf1s1XHr6kOXuPZPDp4u15V3S+y8mtWPKBfypmjDGF8HVm9qtANeAnd/KiNwFUdRXwKbAa+AEYqaoXZMtuj6ZRJDWuyRszNpGR5XGK1WOg5QBY+jFkeZkdzxhj/MTXmdnNVLWRqia6j/s8yo92M7Nbqur3Re27IhMRHr60ObvT0vl8Sb65s7sMgxOpsHqKfypnjDFeFBkoRCRCRII9XrcUkUdFZFDZV+3C1atZNB1ja/D69E2cyso5syK+L9Rqapnaxphypbgrih+AOAARaYZzK6kJMFJE/lHUhoVkZt8kIqtEJEdEkvKVv2Azs/MTEX53SXN2Hj7Jl796XFUEBDhdZbfPhz0rC9+BMcb4UHGBoqaqbnCf3wVMUNWHcOa4HljMtmMpmJm9EhgEzPJceKFnZnvTt0Vt2sdU59XpG8nM9riqSLwNgsKsq6wxptwoLlB45jL0xxmCA1U9BeR43SJ3Q++Z2WtUdZ2X4hd8ZnZ+IsLv+jdn+8GTfJ3s0RM4oha0uxGWTYL0I4XvwBhjfKS4QLFcRP4lIo8BzYAfATwH8yslF3xmtjeXtK5Dm/qRvDZ9I1meVxVd7oHM47B8kv8qZ4wxruICxb1AKhALXO6R+9AG+Fcp1qNSZGbnl9tWkZJ6nG+We0zo17AzNOhokxoZY8qFIgOFqp4E/gfMAU55LJ+rqh+XYj0qRWa2N5e3qUuretUYM20D2TkeQaHLcNi/BrbO9V/ljDGG4rvHPgVMAm4AvhWRe8uoHpUmMzu/gADhof7N2bz/ON+u8LiqaDsIwqpbo7Yxxu+Ku/V0C5CoqoOBLsCIs92xt8xsEbleRHYAPXACz/+gcmVme3NVu3o0r1OVV6ZuICf3qiIkAhJvd5Lvju71bwWNMZVacYEiPbddQlUPnEX50wrJzP7SfR6qqnVV9QqP8pUiM9ubgADhwf7N2LDvGD+s2nNmRdI9TNDjtHu3FYHPBtDu9TgmrBhf+I6MMaYMBBWzvqmI5I4nIfleo6rXlFnNKpmB7Rvw8tQNjJm6gSvb1iMgQJiwewGjqmby3nXp9IqFOdu2MmyKc1E3OGGIn2tsjKksirtCuBZ40X38K9/rF4vasJDM7Foi8pOIbHB/1nSXi4iMcTOzl4tIp/M5qYooMEB4qH8z1u45yk9rnFtNo2eP4r1B2fSLh+BA6BcP711zgtGzR/m5tsaYyqS4QJGiqjMLexSz7VgKZmY/CUxV1ebAVPc1OJnezd3HCOCNEp3FBeLq9g2Ii4pgzNQNqCprUrfRKzZvmV6xsCZ1m/cdGGNMGSguUHyV+0REvijJjr1lZuNckXzoPv8QuM5j+UfqmA/UEJH6JTnehSAoMICR/ZqxatcRpq3dR+voWObkiwlztkHr6Ebed2CMMWWguEDhmQjXpBSOV1dVdwO4P+u4yytlZrY313VsSKNa4YyZuoE/XzyaYVMimJ4CmdkwPQWGfQGjQuPg1HF/V9UYU0mUZKynskwRrpSZ2d4EBwYwsm8zlu1Io0HIZYzu/zYPfd+YsNHCQ9/HMrrxbQzesRzevRQObPJ3dY0xlUBxvZ46iMgRnC/ycPc57mtV1cgSHm+viNRX1d3uraV97vJKm5ntzaBOMbwybSMvT93A5PtvK9jDadN0+PweeLsvXP8WtBrgl3oaYyqH4obwCFTVSFWtpqpB7vPc1yUNEuBkYN/lPr8L+Npj+Z1u76fuQFruLarKKCQogPv7NuXXbYeZszG1YIGm/eC3MyGqKUwcDFP/CjmVJj/RGONjvp4z+zngMhHZAFzmvgb4DtiMM7z4O8ADZVWviuKmpBjqRYbx8s9OD6gCasTC3T9Apzth9r9g/E1wIn/fAWOMOX/i9UuogkhKStLFixf7uxpl5sO5W3h6yio+ubcbFzWNLrzgkrHw3R+gWj24+WNokOirKhpjKiARWaKqScWXdJTZFYU5f7d0aURQlTkM+qJd0UN4dB4K9/wAOTnw3uXw6zif19UYc+HyS6AQkYdFZKU7f/Yj7jKvWduV2ZdrJ3Kq6stMuGkv6aOUV67ayqhpI7wHi4adnXaL2O7w9Uj47yOQleHzOhtjLjw+DxQi0g5nQqSuQAdgoIg0p/Cs7Upr9OxRfHjdybMfwqNKNNw+GXo9Cks+gA+ugrQdvq20MeaC448ritbAfFU9oapZwEzgegrP2q60zmkIj8AguPQZuGUc7F8Pb/WBlFllWk9jzIXNH4FiJdBbRKJEJAIYgJNDUVjWdqVV2BAe1YNq89G8LWfmrvC68dVw7zSIiIKProVfXrZpVY0x58TngUJV1wD/BH7CmaRoGZB1tttf6EN4eBrlZQiPe6aE07baAzz19SpueXseG/cdK3wHtVvAvVOh9TXw01Pw2V2QcdR3J2CMuSD4vXusiPwdJzP7YaCvR9b2DFVtWdS2F3r3WIAJK8YzevYo1qRuo3V0LKMuHs2t7W7ji6U7+es3qzl5KpuHL23OiN5NCA4sJO6rwrxX4aenIaqZc1uqdgvfnogxptwoafdYvwQKEamjqvtEJBb4EWdq1D8DB1T1ORF5Eqilqn8saj+VIVAUZd/RdP4yZTXfrthN6/qR/POGBNrH1Ch8g5RZ8NndTm+o616HNjbvlDGVUUUJFLOBKCATeExVp4pIFM682bHANuAmVS0y1biyB4pc/1u1h//7aiWpxzK49+ImPHJpC8JDAr0XTtsJn94JOxdDz4eh/1NOA7gxptKoEIGitFigOCPtZCbPfb+GCQu30zgqgn8MSig8mzsrA354Eha/D/G94cYPnK61xphKwTKzK6nq4cH8Y1B7Prm3GwC3vbOAP01eTtrJzIKFg0Jh4H/g2tdh2wKnC+2OJT6usTGmovBXZvajblb2ShGZICJhIhIvIgvczOxJIhLij7pVdBc1jeaHh3szoncTJi3azmX/nsn/Vu3xXrjjEBj2IwQEwAdXOmNGGWNMPv7IzG4I/A5IUtV2QCBwK06X2f+4mdmHgGG+rtuFIjwkkD8PaM1XI3tSq0oIv/14CSPHL2X/US9DejRIhBEzIe5i+O/D8PWDkJnu8zobY8ovf916CsKZCCkIiAB2A/2Bz931lpldCtrH1OC/D/Xi8ctb8NPqvVz675l8vmRHwWHLI2rBkM+g9x/h14/h/SvgcBHZ38aYSsUfCXc7gX/h9GzaDaQBS4DD7pAeUMSc2aZkggMDeLB/c757+GKa16nK458t4873F7L94Im8BQMCof8oGDwRDqY47Rabpvmn0saYcsUft55q4ozrFA80AKoAV3kp6rU7VmXKzC5NzepU5dPf9uDZa9uydOshrnhpFu/PSSE7/zAgLa+CEdOduS3G3QCzX3SGLzfGVFr+uPV0KZCiqvtVNROYDFwE1HBvRUERc2ar6tuqmqSqSbVr1/ZNjS8QAQHCnT3i+PGxPnSNr8Wz36zmhjfmsn5vvmE9oprC8J+h7SCY+ixMuh3S0/xTaWOM3/kjUGwDuotIhIgIcAmwGpgO3OiW8ZxP25SyhjXC+WBoF166JZGtB47zmzGzeenn9ZzK8rhyCKkCN7wLVz4HG/4H7/SHfWv8V2ljjN/4o41iAU6j9VJghVuHt4EngMdEZCNO1vZ7vq5bZSIiXNexIT8/1oer2tXnpZ83MPCV2fy67ZBnIeh+P9z1X0g/Au9cAiu/8F+ljTF+YZnZBoBpa/cy6suV7DmSzt0XxfP4FS2ICPEY2uPIbvhsKGyfD91HwmV/gcBgv9XXGHPuLDPbnJP+rery46O9GdItlvd/SeHy/8xizobUMwUi6ztXFl1/C/Nfg4+ug2P7/FZfY4zv+KPXU0sRSfZ4HBGRR2zObP+rFhbM365LYNKI7oQEBnD7ewv4w2fLSDvhDgMSFAIDnofr34adS+Ct3rB9oX8rbYwpc/5oo1inqomqmgh0Bk4AX2JzZpcb3ZpE8d3DF/NA36ZM/nUnl/x7Jt+t2H0mUa/DLU6vqKAw+GAALHzHZs8z5gLm71tPlwCbVHUrNmd2uRIWHMgfr2zFlAd7Uq96KA+MX8pvP17C3iPu8B712jn5Fk37w3ePw1f3Q+ZJ/1baGFMm/B0obgUmuM9tzuxyqG2D6nz1QE+evKoVM9fv59J/z2Tiwm3O1UV4TSeTu++fYdlEJrzagXavNiTw2QDavR7HhBXj/V19Y0wp8FuvJ3d02F1AW1XdKyKHVbWGx/pDqlqgnUJERgAjAGJjYztv3brVV1Wu9FJSj/PkF8tZkHKQi5pG8Y9BCTSOqgLAhJ+eZNSy53nvBqVXLMzZBsOmRDC6/9sMThji55obYzxVpF5PVwFLVXWv+3qvO1c27k+vXWosM9t/4qOrMOHe7vz9+gRW7Ejjipdm8fasTWRl5zB6w0Teu0HpFw/BgdAvHt675gSjZ//Z39U2xpwnfwaKwZy57QQwBScjGywzu9wKCBBu6xbLT4/1oVez2vz9u7UMemMua1K30Ss2b9lesbBm/zaY/yZkHPW+Q2NMueeviYsigMtwxnnK9RxwmYhscNc954+6mbNTr3oY79zZmVdv68jOQyeJDIpmTr6Ryedsg9bhYfDDE/DvNvDDn+HQFr/U1xhz7vwSKFT1hKpGqWqax7IDqnqJqjZ3fx70R93M2RMRBrZvwM+P9SGuSl9umwzTUyAz2/l522To1+5uGD4NWlwBC9+CMR2dQQa3zrUutcZUEEHFFzGmaDWrhJAZvJBhCfDQ97AmFVpHw7CO8OXab2HA6xDzLlz6F1j0Liz5ANb8F+p3gO4POKPUBtnMt8aUV37p9SQiNYB3gXY4807cA6wDJgFxwBbgZlU95H0PDhvrqfwIfDaA9FFKcOCZZZnZEPo34V891jC4Wyz1q4c7K06dgOWTYP4bkLoOqtaFLvdC0t1QJdo/J2BMJVJRej29DPygqq2ADsAaLDO7QmsdHeu1jaJueF1emb6RXv+czn0fL+GXjalocLgTFEYugNu/gHoJMP1vTjvG1w/C3lX+OQljjFc+v6IQkUhgGdBEPQ4uIuuAvqq62+0eO0NVWxa1L7uiKD8mrBjPqGkjeO+aEwXyKHo2uJ7xC7fy6aLtHDqRSZPaVbije2MGdYqherg7Au3+dbDgTUieAFknoUlf57ZUs8sgwN95ocZcWEp6ReGPQJGIM//EapyriSXAw8DOs0m48xTfJl6f/uTpPMva1m5Ll4ZdyMzOZLyXzODEeokk1kvkROYJPl31aYH1SQ2SaFenHWnpaXy59ssC63vE9KBldEtST6TyzfpvCqzv3bg3TWo2Yc+xPfyw8YcC6y+Jv4RG1RuxPW07U1OmFlh/ZbMrqVe1HpsPbWbW1lkF1g9sMZDoiGjWpa5j3o55BdZf3+p6qodVZ+W+lSzeVTCI3tz2ZiKCI0jek0zynuQC64ckDCE4MJhFOxexan/B/+yHJg4FYO72uaw/sD7PukU7FzBz6/esSd1GbGQdrmh2Ld1jepxeHyihRGRdzMfztzJv5wwCgg7SqXFNLmoaRcMa4USGRjKocV9YMpYf5v6HPSdToUodZ5iQRt2IimzI1S2vBuC/6/7LgZMH8hy/XtV6XNnsSgAmr5nMkYwjedbHRMZwaZNLAZi0chIns/IOORJfI54+cX0AGLd8HFk5WXnWt4hqwUWNLgJgbPLYAu+N/e7573cvKCCI29vfDsDMLTNJOZySZ314UDi3tLsFgJ83/8yOIzvyrI8MjWRQ60EA/LDxB/Yc25NnfVR41AX1u3d3x7tLFCj80ZgdBHQCHlLVBSLyMiW4zeSZmR0VE1U2NTTnpEejnrz2mzcA73+sIYEB3NAhhhs6x/DOglS+XL6cpVsPsmDzAeKiIri0VRy/aV6d0Isfg7otYP33sGkaLJ8Ia6ZA00uhbiLUaOSHszOm8vLHFUU9YL6qxrmvL8YJFM2wW0+VTtqJTD5bsp1x87ey5cAJoqqEcEuXRgzp3piGNdzG7+0LYf7rsHqK87r11c5tqUZdnVn4jDElUu5vPQGIyGxguKquE5FngCruqgOq+pyIPAnUUtU/FrUfCxQXjpwcZc7GVD6ev5Wpa5xRXfq3qssdPRpzcbNoAgIEDm+HhW/D0g8hPQ0adnYCRptrbbY9Y0qgogSKRJzusSHAZuBunB5YnwKxwDbgpuKS7ixQXJh2Hj7JJwu2MnHhdg4cP0VcVAS3d2/MjZ1jqBERAhnHYNkEp/H7wEao1gC6DofOd0NELX9X35hyr0IEitJigeLClpGVzQ8r9/DxvK0s3nqI0KAArk1swB3d40iIqQ45ObDxJ+e21OYZEBQOHW6F7vdD7SLvWhpTqVmgMBek1buOMG7BVr76dScnTmXToVEN7uzemN+0r09YcCDsXQ0L3oBlkyA7A5pe4navvcTaMYzJp0IEChHZAhwFsoEsVU0SkVpYZrYpxpH0TCYv2cHH87eyaf9xakYEc3NSI4Z0a0xsVAQcT4XFH8Cid+DYXohuCd3vg/a3QkiEv6tvTLlQkQJFkqqmeix7Hjjo0ZhdU1WfKGo/FigqL1Vl3qYDfDx/Kz+u3kuOKn1b1OaOHo3p06IOgTmZsOpLmP8a7F7mzMbX+W7oei9ENvB39Y3xq4ocKCwz25yTPWnpfLJwGxMWbmP/0Qwa1QpnSLfG3JzUiFoRwbBtntOOsfZbkABocx10f4AJh9YyevYo1qRuo3V0LKMuHm2z8ZlKoaIEihTgEM6AgG+p6ttnOxWqJwsUxlNmdg4/rtrLx/O3MH/zQUKCAhiYUJ87ejQmsVEN5PBWWPgOLP2ICadSGVX1FO8NyrGpW02lU1ECRQNV3SUidYCfgIeAKTZntikt6/ceZdz8rUxeupNjGVm0axjJnd3juLpDA8L1BO1ej+OV6w7SL/7MNtNT4KHvG7PygS1+q7cxvlAhAkWeCjgJd8eAe7FbT6aUHcvI4stfdzJu3lbW7T1KZFgQNyU14pml7bwOix42GrJ/v9+GOzcXtHI/zLiIVBGRarnPgcuBldic2aYMVA0N4o7ujfnhkYv59Lc96N2iNh/O3UK1oKrep24NFvhPW/j293AwxftOjalk/DHWUxMgd2jMIOATVR0tIlFYZrbxgX1H02n7en0iQg8z9lpOt1EM/Rqis2qypPltsGwiaLbT8N3zd9Cgo7+rbUypqXC3ns6HBQpzrgKfDWDstco/fzkzdesTPWHo18KmB44SF3LESeBb/AFkHIH4PtDzYWfIc0vgMxVcSQOFzZltKqXW0bHERG5l5QNnlk1PgcigaPq9OINLWtXlnl6/o0evx5ClH8K812HcIKib4ASMttdDoP35mMrBpg4zldKoi0czbEoE01OcRuzpKU732H9c9jwP9W/Or9sOcds7C7jqreV8GjqI9JG/wrWvOcODTB4OYzrCgrfg1HF/n4oxZc5vt55EJBBYjDOz3UARiQcmArWApcAdqnqqqH3YrSdzPiasGF9owl16ZjZTknfx/i8prN1zlOiqIQzp1pjbuzWi9u4ZMOcl2D7fyfjuOsJ5WE8pU0FUmDYKEXkMSAIi3UDxKTBZVSeKyJvAMlV9o6h9WKAwZS13qJD35qQwde0+QgIDuLpDA+7pFUfbrDXwyxhY9y0EhUHH26HHg1ArvvgdG+NHFSJQiEgM8CEwGngMuBrYD9RT1SwR6QE8o6pXFLUfCxTGlzbvP8aHc7fw2ZIdnDiVTfcmtbinZzyX1E4jcN4r1lPKVBgVJVB8DvwDqAY8DgzFmR61mbu+EfC9qrbzsq1lZhu/SjuRyaTF2/hw7lZ2Hj5JbK0Ihl4Ux80tA6ma/K71lDLlXrkPFCIyEBigqg+ISF+cQHE3MC9foPhOVROK2pddURh/ysrO4cfVe3l/TgqLtx6iamgQNyc14p6kWsRsngTz34Cju62nlCl3KkKg+AdwB5AFhAGROAl4V2C3nkwFlbz9MB/8ksK3y3eTo8plbeoyrHsDuhydisx9BVLXQfVY6DESOt0BIVWK36kxZaTcB4o8B3evKNzG7M+ALzwas5er6utFbW+BwpQ3e9LS+Xj+FsYv2MbhE5m0bRDJPRc15pqIFQTPG2M9pUy5UJEDRRPOdI/9FbhdVTOK2t4ChSmvTp7K5stfd/L+Lyls3HeM2tVCuaN7Y+6M2U2NpW/m6yk1Emo18XeVTSVSoQLF+bJAYco7VWX2hlTe/yWFGev2ExIUwHWJDbivbTZN1r8PyydBTha0udZpx7CeUsYHLFAYU05t3HeUD37ZwhdLd5CemUPPZlHc1ymCXqlfIEved3tK9Yaej1hPKVOmyn2gEJEwYBYQijPW1Oeq+rRlZpvK4vCJU0xYuJ0P525hz5F04qOrcG/XaG7UnwhZ/Jb1lDJlriIECgGqqOoxEQkG5gAP4yTeWWa2qTQys3P4fuUe3puTwrLth6kWFsTtSfW4t8YSaiW/maen1ITQEEbPe9bm9zalotwHijwHF4nACRT3A99S0u6x8fG6+Omn8y5s2xa6dIHMTBg/vuBGiYnO48QJ+PRTLztNgnbtIC0Nvvyy4PoePaBlS0hNhW++Kbi+d29o0gT27IEffii4/pJLoFEj2L4dpk4tuP7KK6FePdi8GWbNKrh+4ECIjoZ162DevILrr78eqleHlSvBWxC9+WaIiIDkZOeR35AhEBwMixbBqlUF1w8d6vycOxfWr8+7LigIbr/deT5zJqTkm/gnPBxuucV5/vPPsGNH3vWRkTBokPP8hx+c99BTVBRcfbXz/L//hQMH8q6vV895/wAmT4YjR/Kuj4mBSy91nk+aBCdP5l0fHw99+jjPx42DrKy861u0gIsucp6PHUsB5/G7t+XAccZn1eb9tKpUPXmMx4+v4vLo/dTZM5sFB9fyRWgWN4yAzn1hQTJ8/WIIN7QZSveYHmd2Yr97znP73Su4Pt/vntx9d/kfZtwdEHAJ0Ax4DdgEHFbV3HdnB9CwkG1PZ2a3iIoq+8oa4wNxUVUYldSGoTFNmfTzCtaNW8CynaE0qnk1O8O2ck/no7SOAQKhV2OI6niKcb+Op3uVhlC9IQQEFnsMY86Vv68oauAk2z0FfGCZ2cY4TpzK4oulO/lgTgozjvcj4/9RcH7vv0G2RkJgKNRLgIadoEEn52dUcwiwWQSMdxVq4iJVPSwiM4DuQA0RCXKvKmKAXf6smzH+FBHizPU9pGssUS8EMmdbNv08BqWdsw1qhgYwt82/aHpqPVFpKwj6dTwsfNspEBoJ9TvkDR7VG1lPKnNOfB4oRKQ2kOkGiXDgUuCfwHTgRpyeT3cBX/u6bsaUNwEBQlp6NsOmwHvXnJnfe9gUOJiRw21zGwANgL7UrxZE77qH6RG2lda6kYZH11Bl3utITqazs4hoJ2A07HwmeFhmuDkL/riiqA986LZTBACfquo3IrIamCgif8PJzH7PD3UzptxpU7sx17XaykPfn5nf+7YE+GptLP+9uS8b9x1jw76jbNx3jLX7qvBNSnWOn2oLXEsImXQJ30XfajvoGLiZprvWU2PDTwjuLefqsdCwoxs4OkODRAit5s/TNeWQJdwZU85NWDGeUdNG8N41JzyuKCIY3f9tr11kVZXdaeluADnGxn3H2OgGkkMnMokgnXaSQpfgFLqHbaWNbiQqc7ezLQLRLRDPW1Z120FwmK9P25ShCtU99nxZoDCVRVHTtpbEgWMZHsHjzCPjyD7aB6TQXjaRGJhCx8BN1NLDAORIMBlRrQiOTSIoprMTPGq3sp5WFVi5DxRuj6aPgHpADvC2qr4sIrWASUAcsAW4WVUPFbUvCxTGlI4j6Zlsyg0c+4+xcc9R0vZtIfrIKtrLZtrLJtoHpBApJwA4FRBGWo22aIOORDbtRljjJKgZf7qx/KHvHmD8irc5nJ5NjbBAhiSM4JUBRQ4GbXyoIgSK+kB9VV0qItVw8imuw5nl7qCqPiciTwI1VfWJovZlgcKYspWemc3m/cfd4JHGkV1rCd+3jHrH1tBONtFWthAmTmP50YBq7K3amndIZXxOMh/fcKbx/bbJcGPr+y1YlBPlPlAUqIDI18Cr7qOvqu52g8kMVW1Z1LYWKIzxj8zsHLYdPMGmPYc4tGU57FxKjUMriE1fy01hK3nlVs3TnXd6CtwzMYBP6v+BoBqNiKgdR436cUQ3iCc0LMJ/J1JJVahAISJxOAMEtgO2qWoNj3WHVLWml21szmxjyqmcHCXorwFFJwjmk0oNDgbV4VhoPU5VqQ/VYwip1YgqdeKIqt+EWnVjCAi09pDSVGES7kSkKvAF8IiqHpGzTARS1beBt8G5oii7GhpjSiogQKgR5j1BsHpYIOkP7WTfzs0c2ZPCidRtZB/aTuDRnYSd3E3Uyc3UPraAiH155ys7pYGkBkRzKLgOJ8PqkVm1IQE1YgiLbkxk3cZENWxGZA0bzqcs+Wusp2CcIDFeVSe7i/eKSH2PW0/7/FE3Y8z5GZIwgtsmv8Eng/K2UQxJGEFYRFVim7eH5u29bqs5OaQdTiV152aO7k0h48A2cg7vIPj4Lqqc3E3DI8nUTptK0K6cPNsd03BSA2tzJKQuJyPqk1OtAUE1YwmvHUvN+k2KvMVlDe/F80dmtuAk061R1X97rJqCk5H9HJaZbUyFlfsle8OnJf/ylYAAqteqQ/VadSChu9cy2VlZ7N27jUO7NnNs31ayDm1D0nYQcnw31TL2EHNwHbUOHoF8d6VTqcGhoNocDa3HqSoNoHpDPjoyi69PTOOLm3ODWja3TX4jz3kY//R66gXMBlbgdI8F+DOwAPgUiAW2ATep6sGi9mWN2cYYb9JPHGP/rhTSdm8ucIur+qm91M7eT4Rk0C70qNeG999OFD6T/mSGVCc7pDo54TWR8JoERtQkuFoUYdWiCI+MokqN2kTWrE1IaMVKSCz3bRSqOgcorEHiEl/WxRhzYQqLqEqjZgk0auZ9AGrNySHt0H5Wv1qPXrF51/WKhU2nlIjAw0RkbKOaHqOqniBACv+n+riGcVSqcjywGumBkWQEVycrJJLssBoQXovAiJoEValJSLUowiOjqVKjNlVrRFOlanWkhKP8+uNWmc2xaIypdCQggOpRdYtseG/+xJm7FdlZWaSlHeDoof2cOJJK+pEDnDp2gOzjB8k5cQhJP0xg+mGCM9MIzTxCrZMpVD1+lEg9RohkeamBI1MDOSJVOR5QlRMBkWQER3LKvYpR9yomqEotgqvWIjQyipfWv82U3Z/6/FaZvxqz3wcGAvtUtZ27rMSZ2cYYcz6Kanj3FBgURPWoulSPqlui/WtODidPHufIoX0cP5zKySMHyDh6gKxjB8g5cRA9eZiAjMMEZxwmOPMIVU6lUjs9hWo5R6kmJwvsb07oUcbfyunA1i8ePhnktAddcIECGIuTYPeRx7IngakemdlPAkVmZhtjzPk4n4b3syEBAYRXqUZ4lWoQ07RE22ZlnuLo4QMcO7yPE2kHSD96gNWzbvZ6q+xwenap1LcwfgkUqjrLTbbzdC3Q133+ITADCxTGmDL2yoDXy2UPp6DgEGrWrk/N2vVPL6ux0PutshphZZuQWJ7mSqyrqrsB3J91vBUSkREislhEFu/fv9+nFTTGGH9ybpU5PbMys52f3m6VlbYK15htmdnGmMqqrG+VFaY8BQrLzDbGmGL441ZZebr1lJuZDZaZbYwx5YZfAoWITADmAS1FZIeIDMMZuuMyEdkAXOa+NsYY42f+6vU0uJBVlpltjDHlTHm69WSMMaYcKneBQkSuFJF1IrLRTbwzxhjjR+UqUIhIIPAacBXQBhgsIm38WytjjKncylWgALoCG1V1s6qeAibiZGwbY4zxk/KURwHQENju8XoH0M2zgOec2cAxEVl3jseKBlLPcdvyxs6lfLpQzuVCOQ+wc8nVuCSFy1ug8DZPRZ7sa8/M7PM6kMjikkzcUZ7ZuZRPF8q5XCjnAXYu56q83XraATTyeB0D7PJTXYwxxlD+AsUioLmIxItICHArTsa2McYYPylXt55UNUtEHgT+BwQC76vqqjI63HnfvipH7FzKpwvlXC6U8wA7l3MiqjYAqzHGmMKVt1tPxhhjyhkLFMYYY4pUYQOFiLwvIvtEZKXHsloi8pOIbHB/1ixk2z+5Q4SsE5ErPJZ7HT7EbVxf4O53ktvQXprn0khEpovIGhFZJSIPu8ufEZGdIpLsPgYUsv1dbt02iMhdHss7i8gK93zGiIi4y8/qfTqP8wkUkV9F5Bv3dbHvnzjGuHVdLiKdzvX8SvE8trj7TxaRxe6yCveZiEhLj/omi8gREXmkIv69iMij7t/IShGZICJhIjJWRFI8zi+xvJ6HlOB7q6i/iXz7LFH9RSTUfb3RXR9XbMVVtUI+gN5AJ2Clx7LngSfd508C//SyXRtgGRAKxAObcBrOA93nTYAQt0wbd5tPgVvd528C95fyudQHOrnPqwHr3Xo+AzxezLa1gM3uz5ru85ruuoVAD5z8lO+Bq872fTrP83kM+AT45mzfP2CAW0cBugMLzvX8SvE8tgDR+ZZVyM/Eo26BwB6chKsK9feCk5CbAoR7HGcoMBa4sZhty8V5UILvrcL+Jrx8niWqP/AA8Kb7/FZgUnH1rrBXFKo6CziYb/G1wIfu8w+B67xsei0wUVUzVDUF2IgzdIjX4UPc//j6A58Xs99zpqq7VXWp+/wosAbnj+JsXAH8pKoHVfUQ8BNwpTizBEaq6jx1fiM+8qj32bxP50REYoDfAO+6r8/2/bsW+Egd84Ea7jmcy/n5W7n6TPK5BNikqlvP8pjl7e8lCAgXkSAggrPPsyoX51HC763C/iY8nUv9PY/3OXBJcVfjFTZQFKKuqu4G58sXqOOljLdhQhoWsTwKOKyqWfmWlwn3MrAjsMBd9KB72fl+IbcGijqfHV6Ww9m9T+fqJeCPQI77+mzfv5J+LkWdX2lR4EcRWSLO0DG5Ktpn4ulWYEIJjllu/l5UdSfwL2AbsBtIU9Uf3dWj3c/kPyISWp7Pw4vCPofC6ubpXOp/eht3fZpbvlAXWqA4G4UNE1LS5aVORKoCXwCPqOoR4A2gKZCI84fxorfNCqmfz+p9uiIiA4F9qrrEc/FZ1qM8fi49VbUTzmjGI0WkNxXsM/Hk3qO+BvisJJt5WeaXz8UNytfi3DpqAFQRkduBPwGtgC44t/ue8LZ5Cevr18/KdTZ1OJf6l/jcLrRAsTf30sz9uc9LmcKGCSlseSrOJV9QvuWlSkSCcYLEeFWdDKCqe1U1W1VzgHdwLjPzK+p8Yrwsh7N7n85FT+AaEdmCcwncH+cK42zev5J+LkWdX6lQ1V3uz33Al0DXCviZeLoKWKqqe0twzPL093IpkKKq+1U1E5gMXOTeulVVzQA+oOSfid/+7l2FfQ5nM6TRudT/9Dbu+uoUvB2Wx4UWKKYAuT1M7gK+BhCRriLykUeZW92W/3igOU4Do9fhQ9x7ydOBG/Pvt7S49wffA9ao6r89lnvej7weWOkubygiU93l/wMuF5Ga7n9clwP/cy9hj4pId3f/d3rU2+v7dL5U9U+qGqOqcTjv3zRVHUIh75+IXC8i//Co051uT4/uOLcVdp/j+Z03EakiItVyn7vHXVnRPpN8BnPmtlOhxyzHfy/bgO4iEuG+f5cAazy+ZAXnPnzuZ1JezyO/wj77wv4mEJG1bplzqb/n8W7E+Tst+mqpuNbu8vrA+YXfDWTiRMhhOPfZpgIb3J+13LI3Am95bDsKp6fAOjx6yuD0MljvrhvlsbwJzi/VRpzL9tBSPpdeOJd+y4Fk9zEA+BhY4S6fAtR3yyfhfPHkbn+PW7eNwN0ey5Nw/mg2Aa9yJhPf6/tUyufUlzO9nry+f8DjwJ/c54IzadUm95yTzvX8Sqn+TXB6kCwDVuX+PlTUzwSn4fcAUN1jWYX7ewH+Aqx138OPcXoxTXM/k5XAOKBqeT0PSva95fVvAmd48XXnWn8gzH290V3fpLh6V4ohPETkBeBjVV3u77qUBnHGw9qmqhV6wEQRGQc8qqr7/V2X83WhfCZw4fy9XCjnkZ/bFthEVcf47JiVIVAYY4w5dxdaG4UxxphSZoHCGGNMkSxQGGOMKZIFCmOMMUWyQGEqJBFREXnR4/XjIvJMKe17rIjcWHzJ8z7OTeKMGDw93/I4ETkpzkioy0Rkroi0LGZfSSLitReMOKPgRpdm3U3lYoHCVFQZwKDy9gUoIoElKD4MeEBV+3lZt0lVE1W1A84Abn8uakequlhVf1eCYxtz1ixQmIoqC2fO4Efzr8h/RSAix9yffUVkpoh8KiLrReQ5ERkiIgvFmSOiqcduLhWR2W65ge72gSLygogsEmcAut967He6iHyCkxiVvz6D3f2vFJF/usuewkm0fNPt71+USOCQu12YiHzg7u9XEennUYfc+T+iRORHd/1buGP7uNnm37pXKStF5JazeJ+NIaj4IsaUW68By0Xk+RJs0wFojTO2zWbgXVXtKs5kUQ8Bj7jl4oA+OAMATheRZjhDbqSpahdxRij9RURyRy/tCrRTZwjr00SkAfBPoDPOl/2PInKdqj4rIv1x5rZY7KWeTUUkGWd+kgigm7t8JICqJohIK3d/LfJt+zQwxz3Gb4DckW+vBHap6m/culU/u7fMVHZ2RWEqLHVG2P0IKMktl0XqDCKXgTPkQe4X/Qqc4JDrU1XNUdUNOAGlFc6YTXe6X+ALcIZeaO6WX5g/SLi6ADPUGcguCxiPM3lNcXJvPTXFCV5vu8t74QxdgaquBbYC+QNFb5yhLFDVb3GvRtxzvFRE/ikiF6tq2lnUwxgLFKbCewnnXn8Vj2VZuL/b7kBxnlNYZng8z/F4nUPeK+z8QxbkDt38kPsFnqiq8XpmPoTjhdSvNKZnncKZ4HK2+ysw5IKqrse5slkB/MO9/WVMsSxQmApNVQ/iTPk4zGPxFpwvRHDmLwg+h13fJCIBbrtFE5yB5P4H3C/OkPCISAtxRpYtygKgj4hEuw3dg4GZJaxLL5yrH4BZwJDc4wOxbt08eZa5Cmc61tzbYCdUdRzOBEBe52A2Jj9rozAXgheBBz1evwN8LSILcUbjLOy//aKsw/lCrwvcp6rpIvIuzu2ppe6Vyn6KmR5TVXeLyJ9whnwW4DtVPZvhqnPbKAQ4BQx3l7+O0wC+AufKaaiqZkjemSz/AkwQkaXuOWxzlycAL4hIDs7opfefRT2MsUEBjTHGFM1uPRljjCmSBQpjjDFFskBhjDGmSBYojDHGFMkChTHGmCJZoDDGGFMkCxTGGGOK9P8Bv0jyL5786f0AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABD3klEQVR4nO3dd3hUZfbA8e9JIYUWIPQEgkhPIEDoVXQVEGlSRYqiWNnV3fWnu+y66i4rlnVd14oNEaSKiCi4ShEREAImBAhFakIPkFBCSXl/f9ybYdITUmaSnM/zzJOZW89MZubMve97zyvGGJRSSikAD1cHoJRSyn1oUlBKKeWgSUEppZSDJgWllFIOmhSUUko5aFJQSinloElBlRkiEiIiRkS8XB1LRSEifUUk3tVxqNKjSUGpGyAik0RkfQGXnSUiqSLSoKTjUqqoNCmoCqm0jjZEpDJwN5AEjCvB/ejRkyoWmhSUS4hIsIgsEZHTInJGRN60p3uIyF9E5LCInBKR2SJSPcvq40TkiIgkiMg0p216iMgzIrLf3uZCEalpz8s49TRZRI4Aq+3p94tIrIicE5FvRaSx0/aMiDwsIvvs+W+JpRXwLtBNRC6KSGIeT/VuIBF4AZiY5TV4TkQWi8gCEbkgIttEpJ3T/EMi8icR2WXv/2MR8bXn9RWReBF5WkROAB+LiI+IvC4ix+zb6yLiYy9fQ0SW26/3Oft+kNO+atrbP2bPX5ol1j/Y/4/jInJfXv9bVbZpUlClTkQ8geXAYSAEaAjMt2dPsm+3ADcBVYA3s2yiJ9ACuBV41v6SBvgtMBToAzQAzgFvZVm3D9AKuENEhgJ/BoYDtYEfgXlZlh8EdALaAaOAO4wxscDDwEZjTBVjTEAeT3eivc35QEsR6ZBl/hBgEVAT+AxYKiLeTvPHAXcATYHmwF+c5tWz12sMTAGmAV2BcDvezk7LewAf28s2Ai6T+XX9FPAH2gB1gH9n2U91rP/TZOAtEamRx3NWZZkxRm96K9Ub0A04DXjlMG8V8KjT4xZACuCFlUAMEOQ0fzMwxr4fC9zqNK9+Duve5DR/BTDZ6bEHkAw0th8boKfT/IXAM/b9ScD6fJ5nIyAdCLcffwv8x2n+c8CmLPs/DvSyHx8CHnaaPxDYb9/vC1wDfJ3m7wcGOj2+AziUS2zhwDmn1ykdqJHDcn2xEoiX07RTQFdXv4/0VjI3PVJQrhAMHDbGpOYwrwHWEUSGw1hf6nWdpp1wup+MdTQB1q/gL0Qk0T6lEwukZVk3zul+Y+A/TsufBQTrF3F++yqI8UCsMSbKfjwXuCfLkYAjHmNMOhCP9RrkFO/hLPNOG2OuOD3O6bVrACAi/iLynn1a7jywDgiwj9qCgbPGmHO5PI8zWf5XhX0dVBmiSUG5QhzQKJfG0WNYX9YZGgGpwMkCbneAMSbA6eZrjDnqtIzJsvxDWZb3M8ZsKMC+ClJeeAJwk4icsM/7vwYEAgOclgnOuCMiHkAQ1muQbT7Wa+E8L2sMOb12Gcv/Aeuoq4sxphrQO2O3WK9DTREJKMBzUuWcJgXlCpuxTpPMEJHKIuIrIj3sefOAJ0WkiYhUAf4JLMjlqCKrd4HpGY3FIlJbRIbks/yfRKSNvXx1ERlZwOdwEggSkUo5zRSRbljtAJ2xTtWEA6FY7QbODc4dRWS4nSCfAK4Cm5zmPyYiQXaD+Z+BBXnENA/4i/28A4FngTn2vKpYp4ES7W39LWMlY8xxrFNpb9sN0t4i0htVIWlSUKXOGJMG3AXcDBzBOmUy2p79EVaj5zrgIHAFmFrATf8HWAb8T0QuYH25dskjji+Al4D59imVHWT+FZ+X1cBO4ISIJOQwfyLwpTEmxhhzIuNmxzgoo1cU8CXWcz+HdbppuDEmxWk7nwH/Aw7Yt3/kEdM/gEhgOxADbHNa/nXAD0jAel1WZll3PFb7y26sNoMn8nryqvwSY3SQHaVcQUSeA242xtyby/xDwAPGmO9LMy5VsemRglJKKQdNCkoppRz09JFSSikHPVJQSinlUKaLaAUGBpqQkBBXh6GUUmXK1q1bE4wxtXOaV6aTQkhICJGRka4OQymlyhQROZzbPD19pJRSykGTglJKKQdNCkoppRzKdJuCUhVJSkoK8fHxXLlyJf+FlQJ8fX0JCgrC29s7/4VtFS4pzIuZy/QfpxGbcIRWgY2Y1ms6Y8NKbJREpYpNfHw8VatWJSQkBBFxdTjKzRljOHPmDPHx8TRp0qTA61WopDAvZi7TVk/hw8HJ9GwE648cZvKyKQCaGJTbu3LliiYEVWAiQq1atTh9+nSh1qtQbQrTf5zGh4OTuaUJeHvCLU3gw8HJTP9xWv4rK+UGNCGowriR90uFSgqxCUfo2SjztJ6NrOlKKaUqWFJoFdiI9Vm+/9cfgVa1glwTkFJlyJNPPsnrr7/ueHzHHXfwwAMPOB7/4Q9/4LXXXmPZsmXMmDEDgKVLl7Jr1y7HMn379s33gtMmTZqwZ8+eTNOeeOIJXn75Zd59911mz55dDM/mupCQEBISrCExunfvfkPb+Oc//5np8Y1uxx1UqKQwrdd0Ji/zZ81BSEmDNQdh8ucwzaMupF51dXhKFat5MXMJfTsEzxc8CH07hHkxc4u0ve7du7NhgzVSaXp6OgkJCezcudMxf8OGDfTo0YPBgwfzzDPPANmTQkGMGTOG+fPnOx6np6ezePFiRo8ezcMPP8yECROK9DzykvH8CitrUrjR7biDCpUUxoaNY3q/mUxd0Rjf6cLUFY2Z3uJhxp7cC4vvh7SU/DeiVBmQ0anivwMOc2Wa4b8DDjNt9ZQiJYYePXo4vux27txJaGgoVatW5dy5c1y9epXY2Fjat2/PrFmzePzxx9mwYQPLli3jqaeeIjw8nP379wOwaNEiOnfuTPPmzfnxxx+z7Wfs2LGZksK6desICQmhcePGPPfcc7z66qsAvPHGG7Ru3Zq2bdsyZswYgEzzAUJDQzl06BAAQ4cOpWPHjrRp04aZM2fm+ByrVKkCwLPPPkt4eDjh4eE0bNiQ++67L9dtPPPMM1y+fJnw8HDGjRuXaTvGGJ566ilCQ0MJCwtjwQJrNNW1a9fSt29fRowYQcuWLRk3bhzuUrG6QvU+AisxZOtpVKc9rHgKlj4Cw94DD0/XBKdUAT3/1U52HTuf6/y1SX9g/kirUwVc71QxZtEfWLrhphzXad2gGn+7q02u22zQoAFeXl4cOXKEDRs20K1bN44ePcrGjRupXr06bdu2pVKl60NWd+/encGDBzNo0CBGjBjhmJ6amsrmzZv55ptveP755/n++8wDy7Vt2xYPDw+io6Np164d8+fPZ+zYsdnimTFjBgcPHsTHx4fExMRc487w0UcfUbNmTS5fvkynTp24++67qVWrVo7LvvDCC7zwwgskJSXRq1cvHn/88Vy3MWPGDN58802ioqKybWfJkiVERUURHR1NQkICnTp1ondva/jrX375hZ07d9KgQQN69OjBTz/9RM+ePfN9HiWtQh0p5KrLFLjtOYhZBMufADfJ2ErdqNOXT+XYqeL05VNF2m7G0UJGUujWrZvjcUHPow8fPhyAjh07On7FZ5VxtJCamsqXX37JyJEjsy3Ttm1bxo0bx5w5c/Dyyv/37RtvvEG7du3o2rUrcXFx7Nu3L8/ljTGMGzeOJ598ko4dO97QNtavX8/YsWPx9PSkbt269OnThy1btgDQuXNngoKC8PDwIDw8PNfXorRVuCOFXPV8Eq5dgnWvgHdl6P8iaPc/5aby+kUPsPPtRqw/cthxpABWp4rWtRux4KFuN7zfjHaFmJgYQkNDCQ4O5l//+hfVqlXj/vvvL9A2fHx8APD09CQ1NTXHZcaOHcvtt99Onz59aNu2LXXq1Mm2zNdff826detYtmwZf//739m5cydeXl6kp6c7lsm4+nvt2rV8//33bNy4EX9/f/r27ZvvleHPPfccQUFBjlNHN7KNvE4JZbwOkPdrUdr0SMHZLdOg66Pw8zuwZrqro1HqhuXYqWKZP9N6Fe193aNHD5YvX07NmjXx9PSkZs2aJCYmsnHjRrp1y55sqlatyoULFwq9n6ZNm1KrVi2eeeaZHE8dpaenExcXxy233MLLL79MYmIiFy9eJCQkhG3btgGwbds2Dh48CEBSUhI1atTA39+f3bt3s2nTpjz3v3z5cr777jveeOMNx7S8tuHt7U1KSvY2yd69e7NgwQLS0tI4ffo069ato3PnzoV+PUqTJgVnInDHP6HjJOuI4cfXXB2RUjckx04V/WYW+cr9sLAwEhIS6Nq1a6Zp1atXJzAwMNvyY8aM4ZVXXqF9+/aOhuYCP4exY9m9ezfDhg3LNi8tLY17772XsLAw2rdvz5NPPklAQAB33303Z8+eJTw8nHfeeYfmzZsD0L9/f1JTU2nbti1//etfM8Wfk3/9618cO3aMzp07Ex4ezrPPPpvnNqZMmeI4neVs2LBhtG3blnbt2tGvXz9efvll6tWrV6jXobSV6TGaIyIiTIkMspOeBl88DDELYcDL0OWh4t+HUoUUGxtLq1atXB2GKmNyet+IyFZjTEROy2ubQk48PGHoO5CSDCv+D7z9ocN4V0ellFIlTk8f5cbTC0Z8BE1vhWVTIWaxqyNSSqkSV2JJQUQ+EpFTIrLDaVpNEflORPbZf2vY00VE3hCRX0Vku4h0KKm4CsXLB0bPgcbd4YuHYPc3ro5IKaVKVEkeKcwC+meZ9gywyhjTDFhlPwYYADSzb1OAd0owrsKp5A/3LID64bBoIuxf7eqIlFKqxJRYUjDGrAPOZpk8BPjEvv8JMNRp+mxj2QQEiEj9koqt0Hyqwr2LIbAFzLsHDpfduiZKKZWX0m5TqGuMOQ5g/824IqUhEOe0XLw9LRsRmSIikSISWdjBI4rErwaM/wKqB8HcUXB0W+ntWymlSom7NDTndOlwjn1ljTEzjTERxpiI2rVrl3BYWVSpDROXgX9NmDMcTu7Mfx2lyonSKp1dUFkrk2aYNGkS7733XqZpS5cuZeDAgURGRvLb3/62WPbvvL/Fi62OKA888EChq8ICzJo1i2PHjjke3+h2ikNpJ4WTGaeF7L8ZhVjigWCn5YKAY7ijag2sxODlB7OHQsKvro5IqRyV1dLZBZVbUshaZRVwFNWLiIjIdJVycfvggw9o3bp1odfLmhRudDvFobSTwjJgon1/IvCl0/QJdi+krkBSxmkmt1QjxEoMGJg9GM4ddnVESmVS1kpnX7lyhfvuu89xhfKaNWsAHNvKMGjQINauXZtjueoMt912G7t37+b4cesrJDk5me+//56hQ4eydu1aBg0aBMAPP/zgKI/dvn17Lly4kGk+wOOPP86sWbMAq3Jqp06dCA0NZcqUKTnWNco4Elq2bJlj2y1atKBJkya5bmPx4sVERkYybtw4wsPDuXz5cqYjqnnz5hEWFkZoaChPP/20Y19VqlRh2rRpjgJ9J0+evMH/bGYl2SV1HrARaCEi8SIyGZgB/EZE9gG/sR8DfAMcAH4F3gceLam4ik1gMxi/1CqiN3swnHffHKbKoRXPwMd35nqbvuKBnMcjX/FA7uuteCbPXeZUOrtLly5s3LiRyMjIXEtnv/LKK0RFRdG0aVPgeuns119/neeffx6At956C4CYmBjmzZvHxIkT8yw2N2PGDPz8/IiKimLu3MyJztPTk+HDh7Nw4UIAli1bxi233ELVqlUzLffqq6/y1ltvERUVxY8//oifn1+ez//xxx9ny5Yt7Nixg8uXL7N8+fJclx08eDBRUVFERUXRrl07/vjHP+a6jREjRhAREcHcuXOJiorKFMexY8d4+umnWb16NVFRUWzZsoWlS5cCcOnSJbp27Up0dDS9e/fm/fffzzP+girJ3kdjjTH1jTHexpggY8yHxpgzxphbjTHN7L9n7WWNMeYxY0xTY0yYMaYEaleUgHqhcO8SuJQAs4dYf5VyA7GXr+Q8HvnlvKt65qekSmevX7+e8eOtqgEtW7akcePG7N2794bjdD6FlNt4DD169OD3v/89b7zxBomJifmW316zZg1dunQhLCyM1atXZzp1lpuXX34ZPz8/HnvssRvaxpYtW+jbty+1a9fGy8uLcePGsW7dOgAqVarkOKrJqwx5YWmZi6IK6gj3LIQ5d8OnQ2HiV1ZPJaVK0oAZec5u9XZIjqWzW9VuDPd9fcO7LanS2bnVYMutFHZ+evTowfHjx4mOjmbDhg3Z2hjAGjHtzjvv5JtvvqFr1658//33ue7vypUrPProo0RGRhIcHMxzzz2XbyyrVq1i0aJFji/xG9lGXrXpvL29Ebu8f3GW3naX3kelprgb3wAI6QFj5sDpPTB3JFwtfKlgpYpTWSud3bt3b8dpoL1793LkyBFatGhBSEgIUVFRjlLZmzdvdqyTW7lqABFh1KhRTJw4kYEDB+Lr65ttmf379xMWFsbTTz9NREQEu3fvpnHjxuzatYurV6+SlJTEqlWrgOvJITAwkIsXLzp6G+Xm8OHDPProoyxcuNBxOiivbeT2OnXp0oUffviBhIQE0tLSmDdvHn369Mlz30VVoY4UMhrfPhycTM9GsP7IYSYvmwJQ5JLC3HwbjPgYFk6AeWNh3CLwzvscpVIlJeP9PHXFNGITjtAqsBHT+00vttLZ99xzT6ZpFy9ezLV09oMPPsgbb7yR5xfpo48+ysMPP0xYWBheXl7MmjULHx8fevToQZMmTRwNrR06XK+Ak1GuukOHDtnaFcA6hfTKK684usdm9frrr7NmzRo8PT1p3bo1AwYMwMfHh1GjRtG2bVuaNWtG+/btAQgICODBBx8kLCyMkJAQOnXqlOfrNGvWLM6cOeMo+92gQQO++eabXLcxadIkHn74Yfz8/Ni4caNjev369XnxxRe55ZZbMMYwcOBAhgwZkue+i6pClc4OfTuE/w7IfEi95iBMXdGYHY8eKp6gti+CJQ9aSWLMZ+BVKf91lCoALZ2tbkRhS2dXqNNHsQlHcm58SzhSfDtpOxLu+g/8+h18PhnS3GOIPaWUKogKlRRaBTZifZbv//VH4OYaQcW7o44Tof8MiF0GXz4KTg1XSinlzipUUsip8W3c5z5cShjD6t3Fc+GHQ9dHoN9fYfsC+Pr3UIZP0yn3UZZP96rSdyPvlwrV0JxT49uzvZ9j+c9NeeCTSP52Vxsmdg8pvh32/qN1cdv616BSZbj9H9Y40ErdAF9fX86cOUOtWrUcXRGVyo0xhjNnzuTY8yovFaqhOTfJ11L57bwovo89yaTuIfx1UGs8PYrpQ2cMrHgaNr8HfZ6BW/5UPNtVFU5KSgrx8fEF7quvlK+vL0FBQXh7e2earmM058O/khfvje/I9K9j+eing8SfS+Y/Y9pT2acYXh4Rq30h5RL8MMMatKfH74q+XVXheHt7O2roKFVSKlSbQl48PYRn72rNC0PasHr3KUa9t5ETScX0i8zDA+56A0Lvhu+ehc3FU6NEKaWKm0uSgoj8TkR2iMhOEXnCnpbj+M2lbUK3ED6c2IlDCZcY+tZP7Dp2vng27OEJw96DFgPhmz9C1GfFs12llCpGpZ4URCQUeBDoDLQDBolIM3Ifv7nU3dKyDosetop7jXx3A2t2n8pnjQLy9Lauer7pFvjyMdj5RfFsVymliokrjhRaAZuMMcnGmFTgB2AYuY/f7BKtG1Rj6WM9CAmszORPtjB746Hi2bC3L4yZC8Fd4PMHYM/K4tmuUkoVA1ckhR1AbxGpJSL+wECsUddyG785k9Ico7ledV8WPtSNfi3r8OyXO3n+q52kpRdDb61KleGeBVAvzKqVdGBt0beplFLFoNSTgjEmFngJ+A5YCUQDBa4FUdpjNFf28eK98RHc1yOEj386xEOfRnLpajGUrvCtbo3FUKupVUDvyKaib1MppYrIJQ3N9oA7HYwxvYGzwD5yH7/Z5Tw9hL/d1YbnB1s9k0bP3MjJ88XQM8m/Jkz40hr3ee5IOBZV9G0qpVQRuKr3UR37byNgODCP3MdvdhsTu4fwwcQIDpwuxp5JVepYicE3AD4dBidLZpBzpZQqCFddp/C5iOwCvgIeM8acI/fxm91Kv5Z1WfRwN4yxeybtKYYDmupBMPFL8Kxkjd52Zn/Rt6mUUjdAy1zcoBNJV7h/1hZ2nzjP84PbML5bSNE3emo3zBoIXn5w/woIaJT/OkopVUg6nkIJqFfdl0UPd+OWFnX465c7+fvyXUXvmVSnJYxfCtcuwOwhcOFEscSqlFIFpUmhCCr7eDFzQgSTuofw4fqDPPTpVpKvFbFnUv22MO5zuHASZg+FS2eKJVallCoITQpF5OkhPDe4Dc/d1ZrVu08y6r1i6JkU3Mm6juHcQZgzDC4nFkusSimVH00KxWRSjya8P+F6z6TY40XsmdSkF4z61OqN9NkouHqxeAJVSqk8aFIoRre2qsvCh7qRbgwj3tnA2qL2TGp+O4z4EOK3wPyxkKJ19JVSJUuTQjELbVidpY/1oHGtytw/awufbjpctA22HgJD34WDP1olMVKvFU+gSimVA00KJaB+dT8WPdyNvi3q8NelO/hHUXsmtRsNg16Dfd/CkgchrRjKbCilVA40KZSQyj5evG/3TPpg/UEenlPEnkkR98Pt02HXUlg2FdLTiy1WpZTKoEmhBGX0TPrbXa1ZFXuS0e9t4lRReiZ1fxz6/hmiP4MVT1njPyulVDHSpFAK7rN7Ju0/fbHoPZP6/B90/y1s+cAa2lMTg1KqGLmqIN6T9lCcO0Rknoj4ikgTEfnZHo5zgYhUckVsJSWjZ1KaMYx8d+ON90wSgd+8AJ0egA1vwLpXijdQpVSF5orhOBsCvwUijDGhgCcwBmuMhX/bw3GeAyaXdmwlLaNnUnBNfyZ/EnnjPZNEYMAr0O4eWDMdNrxZvIEqpSosV50+8gL8RMQL8AeOA/2AxfZ8lw/HWVIyeib1aV67aD2TPDxg8H+h9VD43zTY8mGxx6qUqnhcMfLaUeBV4AhWMkgCtgKJ9pjNAPFAw5zWL83hOEtKFR8vZo7vyMRujflg/UEeudGeSZ5eMPx9aHYHfP0HiJ5f/MEqpSoUV5w+qgEMAZoADYDKwIAcFs3x53NpD8dZUrw8PXh+SCh/u6s13xWlZ5JXJRg12yqLsfQR2OV2YxMppcoQV5w+ug04aIw5bYxJAZYA3YEA+3QSQBBwzAWxlbr7ejTh/fER/HrK6pm0+8QN9Ezy9oUx8yCoEyyeDHv/V/yBKqUqBFckhSNAVxHxFxEBbgV2AWuAEfYybjkcZ0m5rbU1mltqumHEOxv5Ye8NnBbzqQL3LIS6rWHheDi4rvgDVUqVe65oU/gZq0F5GxBjxzATeBr4vYj8CtQCKlTLaUbPpKAaftw/awtzbqRnkl8A3PsF1AiBz8ZA3ObiDlMpVc7pcJxu5uLVVKZ+to01e07zYK8m/GlAKzw8pHAbuXACPh5gDdAz6Suo365kglVKlUk6HGcZUsWumTShW2Pe//Egj8zdyuVraYXbSNV6MGEZ+FaDT4dZYz8rpVQBaFJwQ16eHjw/uA3PDmrN/3adZPTMjZy6UMieSQHBMOFL8PCyxns+e6BkglVKlSuaFNyUiHB/zybMHB/BvpMXGfbWBvacuFC4jdRqCuOXQto1+GQIJMWXSKxKqfJDk4Kb+01rq2ZSSlo6d7+zofA9k+q2hvFL4EoifDIYLpwskTiVUuWDJoUyICwoc8+kuT8XsmdSg/YwbhFcOA6fDoXksyUSp1Kq7NOkUEY0CPBj8SPd6dUskGlf7OCf38SSXpiaSY26wth5cGY/zBkOV5JKLlilVJmlSaEMqeLjxQcTIhjftTEz1x0ofM+km/paJTFOxMBno+HapRKLVSlVNmlSKGO8PD14YUgb/mr3TBpT2J5JLfpbRfTifob54yClCCPBKaXKHU0KZZCIMLlnE967tyN7b6RnUuhwGPwmHFgDi++DtJSSC1YpVaZoUijDbm9Tj4UPdeNaWjoj3tnAusL0TGo/Dga+Cnu+gSVTIL2QF8gppcolV5TObiEiUU638yLyhIjUFJHv7OE4v7NLbKt8ZPRMaljDj/tmbWHe5iMFX7nzg9bQnjuXwLLfQnp6yQWqlCoTXFEQb48xJtwYEw50BJKBL4BngFX2cJyr7MeqABoGWKO59bw5kD8tieHFwvRM6vE76PM0RM2Blc9AGa6FpZQqOlefProV2G+MOYw18M4n9vRyOxxnSanq682HEyO4t2sj3lt3gMc+21bwnkl9/wTdHofN78GqF0o2UKWUW3N1UhgDzLPv1zXGHAew/9bJaYXyMBxnSfHy9ODvQ0L5y52tWLnzBGPe31SwnkkicPs/oON9sP41WPdqyQerlHJLLksKIlIJGAwsKsx65WU4zpIiIjzQ6ybevbcje09cYNhbG9h7sgA9k0Tgzteg7RhY/XfY+HbJB6uUcjuuPFIYAGwzxmQU4zkpIvUB7L+nXBZZOXBHm3oseKgr19LSufvtDfy4rwBHVR4eMOQtaHUXfPsn2DqrxONUSrkXVyaFsVw/dQSwDGsYTqhgw3GWlLZBAY6eSZM+LmDPJE8vuPsjuPk38NUTsL1QB3JKqTLOJUlBRPyB3wBLnCbPAH4jIvvseTNcEVt5k9EzqUdGz6QVBeiZ5FUJRn8KIT3hi4cgdnnpBKuUcjmXJAVjTLIxppYxJslp2hljzK3GmGb2Xy3lWUyq+nrz0cQIxnVpxHs/WD2TrqTk0zPJ288qoNewg3XV86/fl06wSimXcnXvI1VKvDw9+MfQ6z2TRs/cxOkLV/NeyaeqVXK7dgurTtKh9aUTrFLKZTQpVCAZPZPeGdeRPSfOM/Stn9iXX88kvxrW6G0Bja3KqvFbSyVWpZRraFKogPqH1mPBFKtm0vC3N7B+X0LeK1QOhAlLrb9zhlmlt5VS5ZImhQqqXXAAXzzanQYBfkz6eDPz8+uZVK0BTFgGlarA7KFwem+pxKmUKl2aFCqwoBr+LHqkG92a1uKZJTHMWLE7755JNRrDhC+tC91mD4azB0svWKVUqdCkUMFV8/Xmo0mduKdLI979YT+Pz8unZ1JgMysxpFyG2UMg6WjpBauUKnGaFBTenh5MHxrKtIGtWLHjBGPy65lUtw2MXwLJZ63EcFFrUClVXmhSUIDVM+nB3lbPpN0nzjPs7Xx6JjXsCOMWQlI8fDrUShBKqTJPk4LKJKNn0pWUdIa/k0/PpMbdYcxcSNgLc0fAlfOlF6hSqkRoUlDZtAsOYOlj3alf3ZdJH29mwZY8eibdfCuMnAXHomDeGLiWXFphKqVKgCYFlaOgGv4sfqQ73ZrW4unPY3hpZR49k1reCcNnwuENsOBeSM3nSmmllNtyVUG8ABFZLCK7RSRWRLrpGM3uJ6Nn0tjOjXhn7X6mzvsl955JYSNg8H9h/ypYfD+kpZRusEqpYuGqI4X/ACuNMS2BdkAsOkazW/L29OCfw0L588CWfLPjOGPf30TCxVyOBDqMh/4vwe7lsPQRSC/gcKBKKbfhVdo7FJFqQG9gEoAx5hpwTUSGAH3txT4B1gJP57WtM8lnmBU1K9O0NrXb0KlhJ1LSUpgbMzfbOuH1wgmvF05ySjILdy7MNj+iQQShdUJJupLEF7u/yDa/W1A3WgS2ICE5geV7s5eU7t24NzfVuIkTF0+w8teV2ebf2uRWgqsHE5cUx6qDq7LN739zf+pVqceBcwdYd3hdtvmDmg8i0D+QPQl72Bi/Mdv8YS2HUd23OjtO7SDyWGS2+aPajMLf25+oE1FEnYjKNn9c2Di8Pb3ZcnQLO0/vdEyvVA2G90jk659bMPStn5jaP53LJj7Tul4eXtzb9WFIucQPq57l4PlDED7OutgN8PPyY3ToaAC+P/A98eczr1/NpxrDWw0HYOWvKzlx8USm+bX8anFXi7sA+GrPV5y5fCbT/HpV6tH/5v4ALIldwvmrmRu+g6oFcdtNtwGwYMcCLqdezjS/SUAT+oT0AWDO9jmkpqdmmt+8VnO6B3cHyPa+A33vldR7L8Ok8EkAbIjbwN4zma+o9/Lw4t629wLww6EfOJiY+cJKfe/l/d5z5oojhZuA08DHIvKLiHwgIpW5gTGaL1wowDCTqtiEBQUw3+6Z9OcvYnLvstrrD9B2NBz+CWIWg8ln/AallNsQk8cH1h4MJ8UYk2I/bgEMBA4bY5bkumJeOxSJADYBPYwxP4vIf4DzwFRjTIDTcueMMXm2K0RERJjIyOy/SFTJij+XzP2ztnDg9CX+OSyMUZ2Csy9kDKz8E/z8DvR+Cvr9pfQDVUrlSES2GmMicpqX35HCSiDE3sjNwEasX/qPiciLNxhPPBBvjPnZfrwY6ICO0VxmOPdM+r/Pt/NyTj2TRKD/i9BhAqx7BX58zTXBKqUKJb+kUMMYs8++PxGYZ4yZCgwABt3IDo0xJ4A4+6gD4FZgFzpGc5lyvWdSMG/n1jNJBAa9DqEjYNXz8PN7LolVKVVw+TU0O//86we8AlbjsIikF2G/U4G5IlIJOADch5WgForIZOAIMLII21elwOqZFEZIrcq8uGI3x5Iu8/6ECAKr+FxfyMMThr1rFdBb8X/g7W/1UlJKuaX82hTmACeAY1g9gZoYY5JFJAD4wRjTrlSizIW2KbiPFTHHeWJBFHWq+fDxpE7cXKdq5gVSr1pXPO9fA3d/YF3XoJRyiaK0KTwIJACNgNuNMRk1DFoDrxZfiKqsGxBWn/lTunL5WhrD3t7Ahl+z1Ezy8oHRc6FRN/jiIdj9jWsCVUrlKc+kYIy5DHwLrAeuOU3fYIz5tIRjU2VM+0Y1+OLRHtSr5suEjzazcEtc5gUq+cM9C6BeW1g0Efavdk2gSqlc5ZkURORZYAFwN/C1iDxYKlGpMiu4ptUzqetNufRM8q0G934OtZrBvHuseklKKbeR3+mj0UC4MWYs0AmYUvIhqbKuup83H9/XiTGd7J5J87P0TPKvCROWQvUgmDsKjm5zWaxKqczySwpXMtoRjDFnCrC8UoDVM+nF4WE8M6AlX28/zj3vb+KMc82kKnWsYT39a8Cc4cxb/xKhb4fg+YIHoW+HMC+HS/WVUiUvv95HiUBGERQBejk9xhgzuCSDy4/2Piobvok5zpO59Uw6e5B5M7szzeskH95t6NkI1h+Bycv8md5vJmPDxrkucKXKqbx6H+WXFPrktWFjzA9FjK1INCmUHb8cOceDsyO5lprOu+M70r1poGNe6JsN+e+dx7ilyfXl1xyEqSsas+PRQ6UfrFLlXFG6pB40xvyQ260EYlXlVEbPpDrVfJnw4WYWRV7vmRR79jg9G2VevmcjiE3IY8Q3pVSJyC8pLM24IyKfl2woqrwLrunP5490p8tNNXlq8XZe/XYP6emGVoGNWJ/l+3/9EWhVyRNWT4fzx1wTsFIVUH5JQZzu31SSgaiKobqfN7Pu68zoiGDeXPMrv53/C091/zuTl/mz5iCkpFmnjiZ/6cO0gA5WMb1/h8KC8XDwRy3DrVQJK0zto2L7NIrIIeACkAakGmMiRKQm1jURIcAhYJQx5lxx7VO5D29PD2bcHUZIYGVeWrmb40lN6RdyL3cv/JDEK2kE+HoyLux+xg58G84ehMgPYdunELsMareCTpOh3RjwqZr/zpRShZJfQ3MacAnriMEPyChzIYAxxlS7oZ1aSSHCGJPgNO1l4KwxZoaIPINVoTXPkde0obns+3r7cR5c/G+o9gZz776ae++jlMuw43PYPBOOR0OlqhA+Fjo9CLWbu/ZJKFXG3HDvo5KSS1LYA/Q1xhy3x1NYa4xpkds2QJNCedH8jWDeuyu+YL2PjIH4SNjyPuz8AtKuQZM+0PlBaD4APEt9hFmlypyi9D4qKQb4n4hsFZGMq6QLPRzn6dOnSylcVZL2Jx7NtfdRjoP3BHeC4TPhyV3Q769wZj8suBf+0w7WvQoX9X2h1I1yVVLoYYzpgDVYz2Mi0rugKxpjZhpjIowxEbVr1y65CFWpya33UTWvQHq/sobXv99L3Nnk7CtWqQ29/wi/i4bRc6BWU1j9d/h3a1gyBeK2aMO0UoXkktNHmQIQeQ64iFWmW08fVUDzYuYybfUUPhycnKlNYVjTlzh5ohM/7U/AGOhxcy1GRQRzR5t6+Hp75ryx03tgywcQNQ+uXYD67aDzFAi9G7z9SveJKeWm3KpNQUQqAx7GmAv2/e+AF7CG5Tzj1NBc0xjzf3ltS5NC+TEvZi7Tf5xGbMIRWgU2Ylqv6Y5G5vhzyXy+9SiLtsYRf+4yVX29GNyuASMjgmkXVB0Ryb7Bqxdg+wLY/D6c3g1+NaD9vRAxGWo2yb68UhWIuyWFm4Av7IdewGfGmOkiUgtYiDWgzxFgpDHmbF7b0qRQsaSnGzYdPMOiyHhW7DjOlZR0mtetwqiIYIa2b5h5GNAMxsCh9VbDdOxyMOnQ7HarYbrpreChNR5VxeNWSaE4aVKouM5fSWF59HEWRsYRFZeIl4fQr2UdRkYE07dFbbw9c/iyTzoKW2dZt0unoOZN1pFD+3HWkYRSFYQmBVWu7Tt5gUVb41my7SgJF68SWMWH4R0aMrJjEM3q5nCBW+o160K4ze9D3Cbw8oO2I61rHuq3Lf0noFQp06SgKoSUtHTW7jnNosg4Vu8+RWq6oX2jAEZ2DGZQu/pU8/XOvtLx7dappe2LIPUyBHexGqZbDQavSqX/JJQqBZoUVIVz+sJVlv5ylIWRcew7dRFfbw8GhNZnZEQQXZvUwsMjS+P05XMQ9Zl19HDuIFSuAx0nQcR9UK2BS56DUiVFk4KqsIwxRMcnsSgyjmVRx7hwNZXgmn6M6BDM3R0bElTDP/MK6emwf7V19LD3WxAPaHmn1TAd0su6eE6pMk6TglLAlZQ0vt15goWRcfz06xlEoEfTQEZGBOV87cPZgxD5EfzyqXUkUbsldHpAi/GpMk+TglJZxJ1N5vNt8SyKjOdoonXtw5DwBozsGEzbrNc+5FqM7wGonef1lUq5JU0KSuUiPd2w6cAZFkbGsWLHCa6mptOiblVGRgQxrH1Dajlf+6DF+FQ5oUlBqQJIupzC8u3HWBgZT7R97cOtreowsqN17YOX87UPF0/DL7Nhy0dwPh6qBVmN0h0mWjWZlHJjmhSUKqS9Jy+wKDKOJduOcubSNWpXzbj2IZib61S5vmBaKuxdaR09HFgLnpWg9VCrW2tQhDZMK7ekSUGpG5SSls6a3adYGBnPmj2nSEs3dGgUwMiIYAa1rU9V52sfTu+1i/F9dr0YX6cHIWyEFuNTbsUtk4KIeAKRwFFjzCARaQLMB2oC24DxxphreW1Dk4IqTacuXLGvfYjnV/vah4Fh9RnZMZguTWpev/bBUYzvAzgdq8X4lNtx16TweyACqGYnhYXAEmPMfBF5F4g2xryT1zY0KShXMMYQFZfIwsh4lkdb1z40qunPiI5B3N0xiIYBfhkLajE+5ZbcLimISBDwCTAd+D1wF3AaqGeMSRWRbsBzxpg78tqOJgXlapevpbFy53EWboln4wHr2oeeNwcyMiKY21vXvX7tw/ljViG+yI+tYnw1mlhdWrUYn3IBd0wKi4EXgarAH4FJwCZjzM32/GBghTEmNId1pwBTABo1atTx8OHDpRW2UnmKO5vMoq3xfL7Vuvahmq8XQ8IbMioimNCG1axrH7QYn3IDbpUURGQQMNAY86iI9MVKCvcBG7MkhW+MMWF5bUuPFJQ7Sk83bNhvXfuwcucJrqWm07JeVUZGBDM0vMH1ax9OxFjJIWYRpCRrMT5VatwtKbwIjAdSAV+gGtagO3egp49UOZOUnMKy7cdYHBlHdHwS3p7CrS3rMqpTEL2b2dc+ZBTj2/IBnD1gF+ObCB3vg+oNXf0UVDnkVkkh087tIwW7oXkR8LlTQ/N2Y8zbea2vSUGVJbtPnGdRZDxLf7GufahT1YfhHYIYGRFE09pVtBifKjVlJSncxPUuqb8A9xpjrua1viYFVRZdS01n9e5TLN4ax5o9p0lLN3RsXINREUHc2bYBVXy84NwhqxjfttlajE8VO7dNCkWlSUGVdafOX+ELe9yH/acv4eftycCw+oyKCKJzk5pI6hXYscQuxhelxfhUsdCkoJSbM8aw7Ugii7fG8VX0cS5eTaVxLX9GdgxieIcgGlT3haNbrYbpnUvsYny9rYZpLcanCkmTglJlSPK1VFbusMZ92HTgLCLQq1ltRnYM4jet6+J79axVjC/yY0iK02J8qtA0KShVRh05k8zirXEs3hrPsaQrVPfzZmh4A0ZGBNOmnj+y99scivE9CEGdtGFa5UqTglJlXFq6YcP+BBZGxvOtfe1Dq/rVGNkxiKHtG1Iz+ZDVpTV6Hlw9r8X4VJ40KShVjiQlp7As2irMF3PUuvbhtlZ1GRURTK/GvnjtWGQliFO7tBifypEmBaXKqdjj9rUPUUc5e+kadavZ1z50aMhNydFWw3TsV1qMT2WiSUGpcs669uEkCyPjWbvnFOkGIhrXYFREMHc2MVSOmWMV5Lt4UovxKU0KSlUkJ89fYcm2oyyKjONAwiX8K1nXPoxuX5eIyz8hW96HIxutYnxhI6yjh/rtXB22KkWaFJSqgKxrH86xcEs8y7cf49K1NEJq+TMyIphRwYnU3jU7czG+Tg9C6yFajK8C0KSgVAWXfC2Vb2Ksax82HzyLh33twz1tq3Pr1e/w2vphtmJ8846sZfqP04hNOEKrwEZM6zWdsWHjXP1UVDHQpKCUcjiUcInFW+P5fFs8x5OuEODvzbB29ZlY9yAhBz6DvSuZJylMq3qVD4el0bMRrD8Ck5f5M73fTE0M5YBbJQUR8QXWAT6AF7DYGPM3HaNZqdKVlm5Y/2sCCyPj+G7nSa6lpdO6fjXubyP8LfpO3hx+nlucerGuOQhTl9djx8MH9NqHMs7dkoIAlY0xF0XEG1gP/A5rWE4do1kpF0hMvsaXUcdYtDWOHUfPc8RvEFf/AhmjiQKkpIHvPyBNakLdNtCgAzTsaN1qtwAPz9x3oNxKXkmh1KtoGSsLXbQfets3A/QD7rGnfwI8B+SZFDhzBmbNyjytTRvo1AlSUmDu3OzrhIdbt+RkWLgw+/yICAgNhaQk+OKL7PO7dYMWLSAhAZYvzz6/d2+46SY4cQJWrsw+/9ZbITgY4uJg1ars8/v3h3r14MABWLcu+/xBgyAwEPbsgY0bs88fNgyqV4cdOyCnhDlqFPj7Q1SUdctq3Djw9oYtW2DnzuzzJ02y/m7YAHv3Zp7n5QX33mvd/+EHOHgw83w/Pxg92rr//fcQH595frVqMHy4dX/lSus1dFarFtx1l3X/q6+s/7+zevWs1w9gyRI4fz7z/KAguO026/6CBXD5cub5TZpAnz7W/TlzIDU18/zmzaF7d+t+1vcdlOn3XgAwsX9/Jnbvxd6N0bz+mvDra4ZWTqWUfg6Duj4eXK41Gr+fN0Lip5D6njXT0wf6dYJmXeBSIBxLBf9amUtt6HvPuu+O7z0nLimtKCKewFbgZuAtYD+QaIzJeCXigRyHnHIeo7l5rVolH6xSFUzzulW5nGL46Be4vz00qwX7zsDvVsKJ1HTu3NyO285XIbiWHy0qXybE8zQ1U47jlXoZfn4Pjl+GY2lWme8ajaFGiHW7dMZKCsqtuXqQnQCsoTifBT7WMZqVcg+hb4cwtOVhlu6G2ARoFQhDW8KCHUH8sd1aouMTiY5L4mii9YvXQ6xk0qFBZXoFnKKd7KfexZ14HPsFTu/GOhkABDS2TznZp57qt4NKlV33RCsotzp95MwYkygia4GuQICIeNlHC0HAMVfGplRFNq3XdKatnsKHg5Oz9D6awdiwpo7lTl+4yvb4RKLjk4iOS+Sb3Wf4LDkdaIKPV1PaNLiXTuHe9Kp8lNbmV2okxiDxW6wxIcAacrROa2jQ/nr7RJ1W4OntmieuXNLQXBtIsROCH/A/4CVgIjpGs1JuY17M3EJfp2CMIe7sZaLiE4mOS2R7fCIxR5O4kpIOQHU/b9oGVadbnTS6+R2hecoeKp/Zbg0gdPmctREvX+sIomFHuzG7A9S8SUuBFyN3633UFqsh2RPwABYaY17QMZqVKp9S09LZe/KifUSRSFRcEntPXiAt3fruqV/dl3YNq9Or9kUivA/S5OpuKp2IguPRkGo3yPoGXD/llJEsqtZ12XMq69wqKRQnTQpKlU2Xr6Wx81gSUXGJbI9PIjo+kcNnkgHrgKBp7SqEN6xMn4AzhHscoEHyLjyP/WKVAzdp1kaqBdmJIqN9Ihx8q7nuSZUhmhSUUm7v3KVrbD9qtU1Ex1lHFQkXretXK3l60Kp+VSIa+tKzyjFC+ZXAxB3IsW1wLqP7qUBgc6eG7A5QNxS8fFz3pNyUJgWlVJljjOFY0hVHgoiOSyQmPolL16wjhao+XoQ2rE6XekJP/8M0T9tH1TPRyNFtcOm0tRHPSlAvLPOFdrVurvDjSWhSUEqVC2nphgOnLxJlJ4rt8UnEHj9PSpr1PVa7qg/tGlanR+0rdPE5SNNre/A5GQXHo+Cafc2sTzVoEO7UkN0RqjWoUA3ZmhSUUuXWlZQ0Yo+ft9om4hKJik/kwOlLjvkhtfwJD6pK7xrn6OB1gKDk3Xgd3wYnd0C6fb1slXqZ2ycatC/XAxBpUlBKVShJl1PYcdRqyI62G7NPnL8CgJeH0KJeVTo29KNX1RO0lf3UPr/DutDuzL7rG6nZNPOFdvXCyk0hQE0KSqkK70TSFfuUk3U1dnR8IheuWEcK/pU8CW1Qnc71PehZOY6Wab9S/dx2q33iwnFrAx5e1oV2GW0TZbgQoCYFpZTKIj3dcOjMJUfJjuj4RHYeO8+1VOtCu5qVK9EuqDrdal+jm+9hmqbswf90NBz9Ba4mWRvxrmy3T3S43j4R0Mjt2yc0KSilVAFcS01nz4kLjt5O0fGJ7Dt1kYyvyeCafrRrWI3eNc/T0fsgja7E4n38FzgRA2n2tbb+gdkvtKvsXsU7NSkopdQNung1lR329RPb4612irwLAe7C49g2ty4EqElBKaWKUcJFqxBgVFySo8bTueQUAHy8PGjToBqdGnjTq8oxWqfvswoBHv0Fko5YGxAPqN3K6Yiig9VeUUqFAN0qKdhlsWcD9YB0YKYx5j8iUhNYAIQAh4BRxphzeW1Lk4JSyh04FwLcbp92yrMQYOpeKidE51wIsIFTosihEOCNFCrMyt2SQn2gvjFmm4hUxRpsZygwCThrjJkhIs8ANYwxT+e1LU0KSil3lZqWzr5TF52uyE5iTw6FAHvWvkQn7wNWIcCT0XAsKudCgA06MO/CIaZteCqHkuYzC5UY3CopZAtA5EvgTfvW1xhz3E4ca40xLfJaV5OCUqosySgEmDH+RGELAYb6XOC/Ywy3NLm+zTUHYeqKxux49FCB43DbpCAiIcA6IBQ4YowJcJp3zhiT7ZJC5+E4GzVq1PHw4cOlE6xSSpWAwhQCvG3DEK78BbydLo1ISQPf6ZD2bMG/y91y5DURqQJ8DjxhjDkvBezXa4yZCcwE60ih5CJUSqmSV6NyJfo0r02f5rWBnAsBzv8lgQ+veVKlugfrj6RnOlJYfwSq+xTfBXQuSQoi4o2VEOYaY+xx+TgpIvWdTh+dckVsSinlSiJCwwA/Ggb4MTCsPnC9EGCLd9OZvAw+HIxTmwIkXkkrtv2Xev1YsQ4JPgRijTGvOc1ahjUkJ/bfL0s7NqWUckeeHkKzulVpXbsx94TB1BXWKaOpK+CeMGhdu3Gx7csVRcV7AOOBfiISZd8GAjOA34jIPuA39mOllFK2ab2m81mMP/8dAFemwX8HwGcx/kzrNb3Y9lHqp4+MMeuB3BoQbi3NWJRSqizJ6HY6dcX16xSm9yv8dQp5cXmX1KLQLqlKKVV4efU+qthj0imllMpEk4JSSikHTQpKKaUcNCkopZRy0KSglFLKQZOCUkopB00KSimlHDQpKKWUctCkoJRSysElSUFEPhKRUyKyw2laTRH5TkT22X+zjaWglFKqZLnqSGEW0D/LtGeAVcaYZsAq+7FSSqlS5JKkYIxZB5zNMnkI8Il9/xOscZuVUkqVIndqU6hrjDkOYP+tk9NCIjJFRCJFJPL06dOlGqBSSpV37pQUCsQYM9MYE2GMiahdu7arw1FKqXLFnZLCSXsYTnQ4TqWUcg13Sgo6HKdSSrmYq7qkzgM2Ai1EJF5EJqPDcSqllMuV+nCcAMaYsbnM0uE4lVLKhdzp9JFSSikX06SglFLKQZOCUkopB00KSimlHDQpKKWUctCkoJRSykGTglJKKQdNCkoppRw0KSillHLQpKCUUspBk4JSSikHt0oKItJfRPaIyK8iosNxKqVUKXObpCAinsBbwACgNTBWRFq7NiqllKpY3CYpAJ2BX40xB4wx14D5WOM2K6WUKiUuKZ2di4ZAnNPjeKBL1oVEZAowxX54UUT23OD+AoGEG1y3tLh7jO4eH2iMxcHd4wP3j9Hd4muc2wx3SgqSwzSTbYIxM4GZRd6ZSKQxJqKo2ylJ7h6ju8cHGmNxcPf4wP1jdPf4nLnT6aN4INjpcRBwzEWxKKVUheROSWEL0ExEmohIJWAM1rjNSimlSonbnD4yxqSKyOPAt4An8JExZmcJ7rLIp6BKgbvH6O7xgcZYHNw9PnD/GN09PgcxJttpe6WUUhWUO50+Ukop5WKaFJRSSjmU66QgIh+JyCkR2ZHLfBGRN+yyGttFpIMbxjjOjm27iGwQkXbuFqPTcp1EJE1ERpRWbPZ+841PRPqKSJSI7BSRH0ozPnv/+f2fq4vIVyISbcd4XynHFywia0Qk1t7/73JYxqWflwLG6LLPS0Hic1rWJZ+VAjHGlNsb0BvoAOzIZf5AYAXWNRJdgZ/dMMbuQA37/gB3jNFexhNYDXwDjHCn+IAAYBfQyH5cx91eQ+DPwEv2/drAWaBSKcZXH+hg368K7AVaZ1nGpZ+XAsboss9LQeKz57nss1KQW7k+UjDGrMP6cOVmCDDbWDYBASJSv3Sis+QXozFmgzHmnP1wE9b1G6WqAK8jwFTgc+BUyUeUWQHiuwdYYow5Yi/vjjEaoKqICFDFXja1NGIDMMYcN8Zss+9fAGKxqgw4c+nnpSAxuvLzUsDXEFz4WSmIcp0UCiCn0ho5/RPdxWSsX2puRUQaAsOAd10dSy6aAzVEZK2IbBWRCa4OKAdvAq2wLtiMAX5njEl3RSAiEgK0B37OMsttPi95xOjMZZ+X3OIrA58V97lOwUUKVFrDHYjILVhv8p6ujiUHrwNPG2PSrB+6bscL6AjcCvgBG0VkkzFmr2vDyuQOIAroBzQFvhORH40x50szCBGpgvUr9okc9u0Wn5d8YsxYxmWfl3ziex33/qxU+KRQJkpriEhb4ANggDHmjKvjyUEEMN9+kwcCA0Uk1Riz1KVRXRcPJBhjLgGXRGQd0A7rnK+7uA+YYayTzr+KyEGgJbC5tAIQEW+sL7O5xpglOSzi8s9LAWJ06eelAPG5+2elwp8+WgZMsHtVdAWSjDHHXR2UMxFpBCwBxrvZL1sHY0wTY0yIMSYEWAw86k5vcuBLoJeIeImIP1b13VgXx5TVEawjGUSkLtACOFBaO7fbMj4EYo0xr+WymEs/LwWJ0ZWfl4LEVwY+K+X7SEFE5gF9gUARiQf+BngDGGPexWr9Hwj8CiRj/VpztxifBWoBb9u/LlJNKVdbLECMLpVffMaYWBFZCWwH0oEPjDF5dq8t7RiBvwOzRCQG6zTN08aY0iy13AMYD8SISJQ97c9AI6cYXf15KUiMrvy8FCQ+t6dlLpRSSjlU9NNHSimlnGhSUEop5aBJQSmllIMmBaWUUg6aFJRSqowoaHFKp+VHicguu0DfZwVZR5OCKpNExIjIv5we/1FEniumbc8qjeqVIjLSrqi5Jsv0EBG5LFZV12i72meLfLYVISJv5DLvkIgEFmfsymVmAf0LsqCINAP+BPQwxrQBnijIepoUVFl1FRjubl92IuJZiMUnY128dEsO8/YbY8KNMe2AT7D6u+fKGBNpjPltIfatyqCcCiuKSFMRWWnX9fpRRFrasx4E3sooEFjQQpCaFFRZlYo17u2TWWdk/aUvIhftv31F5AcRWSgie0Vkhl1/f7OIxIhIU6fN3GZ/wPaKyCB7fU8ReUVEtohVr/8hp+2usQ/PY3KIZ6y9/R0i8pI97Vmsujzvisgr+TzXasA5ez1fEfnY3t4vdo2fjBiW2/dricj/7PnvYdcsEpHKIvK1ffSxQ0RGF+B1Vu5vJjDVGNMR+CPwtj29OdBcRH4SkU0iUqAjjHJ9RbMq994CtovIy4VYpx1WNdKzWGUkPjDGdBZrQJSpXD/EDgH6YBWnWyMiNwMTsEo7dBIRH+AnEfmfvXxnINQYc9B5ZyLSAHgJqyDfOeB/IjLUGPOCiPQD/miMicwhzqb2VbFVgYzSHACPARhjwuxfhP8TkeZZ1v0bsN7ex53AFHt6f+CYMeZOO7bqBXvJlLsSq/hed2CRXC+w52P/9QKaYV1JHwT8KCKhxpjEvLapRwqqzLIrUM4GCnPaZItd9/4qsB/I+FKPwUoEGRYaY9KNMfuwkkdL4Has2j9RWCWRa2F96AA2Z00Itk7AWmPMaWNMKjAXa8Cd/GScPmqKlahm2tN7Ap8CGGN2A4exfhE66w3MsZf5Gvsow36Ot4nISyLSyxiTVIA4lHvzABLt90rGrZU9Lx740hiTYr8393D9/ZrnBpUqy17HOjdf2WlaKvZ72y5SVslp3lWn++lOj9PJfOSctf6LwToNM9Xpw9fEGJORVC7lEl9x1EdexvVEUtDtZatfYxeI64iVHF60T2GpMsz+YXRQREaCY8jUjCFIlwIZpxcDsX485FtkUZOCKtOMMWeBhViJIcMhrC8/sEYL876BTY8UEQ+7neEmrF9Z3wKPiFUeGRFpLiKV89oI1hFFHxEJtBuhxwKFHSO6J9ZRDcA6YFzG/rGKre3JsrzzMgOAGvb9BkCyMWYO8CrW8KCqDBGrsOJGoIWIxIvIZKz/9WQRiQZ2Yr3nwXq/nhGRXcAa4KmClBLXNgVVHvwLeNzp8fvAlyKyGVhF7r/i87IH68u7LvCwMeaKiHyAdYppm30EchoYmtdGjDHHReRPWB9KAb4xxnxZgP1ntCkIcA14wJ7+NlbjdAzWEdEkY8xVyTxgy/PAPBHZZj+HI/b0MOAVEUkHUoBHChCHciPGmLG5zMrWiGyPzfF7+1ZgWiVVKaWUg54+Ukop5aBJQSmllIMmBaWUUg6aFJRSSjloUlBKKeWgSUEppZSDJgWllFIO/w++f3MRbCfb6wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import numpy as np\n", + "# with visualization\n", + "naiveBoids = np.linspace(10000, 100000, 8)\n", + "naiveFPS = [180, 92, 64, 46, 27, 20, 15, 12]\n", + "# without visualization\n", + "naiveBoidsV = np.linspace(10000, 100000, 8)\n", + "naiveFPSV = [207, 102, 68, 49, 29, 20, 15, 12]\n", + "\n", + "naiveFig, naiveAxes = plt.subplots()\n", + "\n", + "naiveAxes.plot(naiveBoids, naiveFPS, label=\"With Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "naiveAxes.plot(naiveBoidsV, naiveFPSV, label=\"Without Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "naiveAxes.get_xaxis().set_major_formatter(\n", + " matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))\n", + "naiveAxes.yaxis.set_ticks(np.arange(0, 220, 10))\n", + "naiveAxes.xaxis.set_ticks(np.arange(10000, 110000, 15000))\n", + "naiveAxes.set_xlabel('Number of Boids') # Notice the use of set_ to begin methods\n", + "naiveAxes.set_ylabel('FPS')\n", + "naiveAxes.set_title('Naive Approach')\n", + "naiveAxes.axhline(y=30, color='r', linestyle='--',alpha=0.5)\n", + "naiveAxes.axhline(y=60, color='g', linestyle='--',alpha=0.5)\n", + "naiveAxes.legend()\n", + "\n", + "# with visualization\n", + "uniformBoids = np.linspace(100000, 700000, 7)\n", + "uniformFPS = [440, 200, 137, 60, 45, 27, 17]\n", + "# without visualization\n", + "uniformBoidsV = np.linspace(100000, 700000, 7)\n", + "uniformFPSV = [600, 300, 145, 80, 48, 28, 17]\n", + "\n", + "uniformFig, uniformAxes = plt.subplots()\n", + "\n", + "uniformAxes.plot(uniformBoids, uniformFPS, label=\"With Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "uniformAxes.plot(uniformBoidsV, uniformFPSV, label=\"Without Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "uniformAxes.get_xaxis().set_major_formatter(\n", + " matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))\n", + "uniformAxes.yaxis.set_ticks(np.arange(0, 650, 50))\n", + "#uniformAxes.xaxis.set_ticks(np.arange(10000, 110000, 15000))\n", + "uniformAxes.set_xlabel('Number of Boids') # Notice the use of set_ to begin methods\n", + "uniformAxes.set_ylabel('FPS')\n", + "uniformAxes.set_title('uniform Approach')\n", + "uniformAxes.axhline(y=30, color='r', linestyle='--',alpha=0.5)\n", + "uniformAxes.axhline(y=60, color='g', linestyle='--',alpha=0.5)\n", + "uniformAxes.legend()\n", + "\n", + "\n", + "# with visualization\n", + "coherentBoids = np.linspace(1000000, 2500000, 4)\n", + "coherentFPS = [95, 50, 30, 19]\n", + "# without visualization\n", + "coherentBoidsV = np.linspace(1000000, 2500000, 4)\n", + "coherentFPSV = [108, 53, 31, 20]\n", + "\n", + "coherentFig, coherentAxes = plt.subplots()\n", + "\n", + "coherentAxes.plot(coherentBoids, coherentFPS, label=\"With Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "coherentAxes.plot(coherentBoidsV, coherentFPSV, label=\"Without Visualization\", marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "coherentAxes.yaxis.set_ticks(np.arange(0, 110, 10))\n", + "coherentAxes.set_xlabel('Number of Boids') # Notice the use of set_ to begin methods\n", + "coherentAxes.set_ylabel('FPS')\n", + "coherentAxes.set_title('coherent Approach')\n", + "coherentAxes.axhline(y=30, color='r', linestyle='--',alpha=0.5)\n", + "coherentAxes.axhline(y=60, color='g', linestyle='--',alpha=0.5)\n", + "coherentAxes.legend()\n", + "\n", + "# with visualization\n", + "blockSize = [128, 256, 512, 1024]\n", + "blockFPS = [850, 859, 860, 900]\n", + "\n", + "blockFig, blockAxes = plt.subplots()\n", + "\n", + "blockAxes.plot(blockSize, blockFPS, marker='o', markerfacecolor=\"yellow\", markeredgecolor=\"green\")\n", + "blockAxes.xaxis.set_ticks(np.arange(0, 1088, 128))\n", + "blockAxes.set_xlabel('Block Size') \n", + "blockAxes.set_ylabel('FPS')\n", + "blockAxes.set_title('Block Size vs FPS')\n", + "\n", + "\n", + "\n", + "naiveFig.savefig(\"../naive.png\")\n", + "uniformFig.savefig(\"../uniform.png\")\n", + "coherentFig.savefig(\"../coherent.png\")\n", + "blockFig.savefig(\"../blocksize.png\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8015ef9a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1000000., 1500000., 2000000., 2500000.])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/images/uniform.png b/images/uniform.png new file mode 100644 index 0000000..3171394 Binary files /dev/null and b/images/uniform.png differ diff --git a/src/kernel.cu b/src/kernel.cu index 74dffcb..93bef39 100644 --- a/src/kernel.cu +++ b/src/kernel.cu @@ -3,6 +3,7 @@ #include #include #include +#include #include "utilityCore.hpp" #include "kernel.h" @@ -31,13 +32,21 @@ void checkCUDAError(const char *msg, int line = -1) { } } +/** +* Return the distance between two boids +*/ +__host__ __device__ float distanceBoid(const glm::vec3& firstBoid, const glm::vec3& secondBoid) +{ + return glm::length(firstBoid - secondBoid); +} + /***************** * Configuration * *****************/ /*! Block size used for CUDA kernel launch. */ -#define blockSize 128 +#define blockSize 1024 // LOOK-1.2 Parameters for the boids algorithm. // These worked well in our reference implementation. @@ -85,6 +94,8 @@ int *dev_gridCellEndIndices; // to this cell? // TODO-2.3 - consider what additional buffers you might need to reshuffle // the position and velocity data to be coherent within cells. +glm::vec3* dev_pos_new; +glm::vec3* dev_vel1_new; // LOOK-2.1 - Grid parameters based on simulation parameters. // These are automatically computed for you in Boids::initSimulation @@ -169,6 +180,29 @@ void Boids::initSimulation(int N) { gridMinimum.z -= halfGridWidth; // TODO-2.1 TODO-2.3 - Allocate additional buffers here. + cudaMalloc((void**)&dev_particleArrayIndices, N * sizeof(int)); + checkCUDAErrorWithLine("cudaMalloc dev_particleArrayIndices failed!"); + + cudaMalloc((void**)&dev_particleGridIndices, N * sizeof(int)); + checkCUDAErrorWithLine("cudaMalloc dev_particleGridIndices failed!"); + + cudaMalloc((void**)&dev_gridCellStartIndices, gridCellCount * sizeof(int)); + checkCUDAErrorWithLine("cudaMalloc dev_gridCellStartIndices failed!"); + + cudaMalloc((void**)&dev_gridCellEndIndices, gridCellCount * sizeof(int)); + checkCUDAErrorWithLine("cudaMalloc dev_gridCellEndIndices failed!"); + + cudaMalloc((void**)&dev_pos_new, N * sizeof(glm::vec3)); + checkCUDAErrorWithLine("cudaMalloc dev_pos failed!"); + + cudaMalloc((void**)&dev_vel1_new, N * sizeof(glm::vec3)); + checkCUDAErrorWithLine("cudaMalloc dev_pos failed!"); + + dev_thrust_particleArrayIndices = + thrust::device_pointer_cast(dev_particleArrayIndices); + dev_thrust_particleGridIndices = + thrust::device_pointer_cast(dev_particleGridIndices); + cudaDeviceSynchronize(); } @@ -222,6 +256,75 @@ void Boids::copyBoidsToVBO(float *vbodptr_positions, float *vbodptr_velocities) /****************** * stepSimulation * ******************/ +/** +* Rule 1: boids fly towards their local perceived center of mass, which +* excludes themselves +*/ +__device__ glm::vec3 computeCohesion(int N, int iSelf, const glm::vec3* pos, + const glm::vec3* vel) +{ + glm::vec3 perceived_center{0.0f, 0.0f, 0.0f}; + int number_of_neighbors{ 0 }; + + for (int i = 0; i < N; i++) + { + if ((i != iSelf) && (distanceBoid(pos[iSelf], pos[i]) < rule1Distance)) + { + number_of_neighbors++; + perceived_center += pos[i]; + } + } + if (number_of_neighbors == 0) + { + // doesn't affect this boid if there are no neighbors + return glm::vec3(0, 0, 0); + } + perceived_center /= number_of_neighbors; + return (perceived_center - pos[iSelf]) * rule1Scale; +} + +/** +* Rule 2: boids try to stay a distance d away from each other +*/ +__device__ glm::vec3 computeSeparation(int N, int iSelf, const glm::vec3* pos, + const glm::vec3* vel) +{ + glm::vec3 c{ 0.0f, 0.0f, 0.0f }; + for (int i = 0; i < N; i++) + { + if ((i != iSelf) && (distanceBoid(pos[iSelf], pos[i]) < rule2Distance)) + { + c -= (pos[i] - pos[iSelf]); + } + } + return c * rule2Scale; +} + +/** +* Rule 3: boids try to match the speed of surrounding boids +*/ +__device__ glm::vec3 computeAlignment(int N, int iSelf, const glm::vec3* pos, + const glm::vec3* vel) +{ + glm::vec3 perceived_velocity{ 0.0f, 0.0f, 0.0f }; + int number_of_neighbors{ 0 }; + + for (int i = 0; i < N; i++) + { + if ((i != iSelf) && (distanceBoid(pos[iSelf], pos[i]) < rule3Distance)) + { + number_of_neighbors++; + perceived_velocity += vel[i]; + } + } + if (number_of_neighbors == 0) + { + // doesn't affect this boid if there are no neighbors + return glm::vec3(0.0f, 0.0f, 0.0f); + } + perceived_velocity /= number_of_neighbors; + return perceived_velocity * rule3Scale; +} /** * LOOK-1.2 You can use this as a helper for kernUpdateVelocityBruteForce. @@ -229,22 +332,40 @@ void Boids::copyBoidsToVBO(float *vbodptr_positions, float *vbodptr_velocities) * Compute the new velocity on the body with index `iSelf` due to the `N` boids * in the `pos` and `vel` arrays. */ -__device__ glm::vec3 computeVelocityChange(int N, int iSelf, const glm::vec3 *pos, const glm::vec3 *vel) { - // Rule 1: boids fly towards their local perceived center of mass, which excludes themselves - // Rule 2: boids try to stay a distance d away from each other - // Rule 3: boids try to match the speed of surrounding boids - return glm::vec3(0.0f, 0.0f, 0.0f); +__device__ glm::vec3 computeVelocityChange(int N, int iSelf, const glm::vec3 *pos, + const glm::vec3 *vel) +{ + return vel[iSelf] + computeAlignment(N, iSelf, pos, vel) + + computeSeparation(N, iSelf, pos, vel) + + computeCohesion(N, iSelf, pos, vel); } /** * TODO-1.2 implement basic flocking * For each of the `N` bodies, update its position based on its current velocity. +* Note: GLM 0.9. 2 introduces CUDA compiler support allowing programmer to +* use GLM inside a CUDA Kernel. */ __global__ void kernUpdateVelocityBruteForce(int N, glm::vec3 *pos, - glm::vec3 *vel1, glm::vec3 *vel2) { - // Compute a new velocity based on pos and vel1 - // Clamp the speed - // Record the new velocity into vel2. Question: why NOT vel1? + glm::vec3 *vel1, glm::vec3 *vel2) +{ + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) { + return; + } + // Compute a new velocity based on pos and vel1 + glm::vec3 newVelocity = computeVelocityChange(N, index, pos, vel1); + + glm::vec3 newDir = glm::normalize(newVelocity); + float newSpeed = glm::length(newVelocity); + + // Clamp the speed + if (newSpeed >= maxSpeed) + { + newVelocity = newDir * maxSpeed; + } + // Record the new velocity into vel2. Question: why NOT vel1? + vel2[index] = newVelocity; } /** @@ -282,13 +403,30 @@ __device__ int gridIndex3Dto1D(int x, int y, int z, int gridResolution) { return x + y * gridResolution + z * gridResolution * gridResolution; } +__device__ int get1DCellIndex(int index, int gridResolution, + glm::vec3 gridMin, float inverseCellWidth, glm::vec3* pos) +{ + int iX = glm::floor((pos[index].x - gridMin.x) * inverseCellWidth); + int iY = glm::floor((pos[index].y - gridMin.y) * inverseCellWidth); + int iZ = glm::floor((pos[index].z - gridMin.z) * inverseCellWidth); + return gridIndex3Dto1D(iX, iY, iZ, gridResolution); +} + __global__ void kernComputeIndices(int N, int gridResolution, glm::vec3 gridMin, float inverseCellWidth, - glm::vec3 *pos, int *indices, int *gridIndices) { + glm::vec3 *pos, int *indices, int *gridIndices) +{ + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) { + return; + } // TODO-2.1 // - Label each boid with the index of its grid cell. + gridIndices[index] = get1DCellIndex(index, gridResolution, gridMin, + inverseCellWidth, pos); // - Set up a parallel array of integer indices as pointers to the actual // boid data in pos and vel1/vel2 + indices[index] = index; } // LOOK-2.1 Consider how this could be useful for indicating that a cell @@ -306,22 +444,515 @@ __global__ void kernIdentifyCellStartEnd(int N, int *particleGridIndices, // Identify the start point of each cell in the gridIndices array. // This is basically a parallel unrolling of a loop that goes // "this index doesn't match the one before it, must be a new cell!" + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) { + return; + } + int cellNumIndex = particleGridIndices[index]; + // Last element in particleGridIndices + if (index == N - 1) + { + gridCellEndIndices[cellNumIndex] = index; + } + // first element in particleGridIndices + if (index == 0) + { + gridCellStartIndices[cellNumIndex] = index; + } + + int indexBefore = index - 1; + if (indexBefore >= 0) + { + int cellNumIndexBefore = particleGridIndices[indexBefore]; + if (cellNumIndexBefore != cellNumIndex) + { + gridCellEndIndices[cellNumIndexBefore] = indexBefore; + gridCellStartIndices[cellNumIndex] = index; + } + } +} + +__device__ void computeContributionFromThisCellCoherentApproach(int x, int y, int z, int index, + glm::vec3& perceived_velocity, glm::vec3& perceived_center, int gridResolution, + glm::vec3& c, int& number_of_neighbors_velocity, int& number_of_neighbors_center, + int* gridCellStartIndices, int* gridCellEndIndices, glm::vec3* pos, glm::vec3* vel1) +{ + // don't need to check cells that are nonexistent + if (x < 0 || x >= gridResolution || y < 0 || y >= gridResolution || z < 0 || z >= gridResolution) + { + return; + } + + int cellIndex = gridIndex3Dto1D(x, y, z, gridResolution); + int startIndex = gridCellStartIndices[cellIndex]; + int endIndex = gridCellEndIndices[cellIndex]; + + // - For each cell, read the start/end indices in the boid pointer array. + if ((startIndex != -1) && (endIndex != -1)) + { + for (int i = startIndex; i <= endIndex; i++) + { + if (i != index) + { + float distanceThisBoidAndNeig = distanceBoid(pos[index], pos[i]); + if (distanceThisBoidAndNeig < rule3Distance) + { + number_of_neighbors_velocity++; + perceived_velocity += vel1[i]; + } + + if (distanceThisBoidAndNeig < rule2Distance) + { + c -= (pos[i] - pos[index]); + } + + if (distanceThisBoidAndNeig < rule1Distance) + { + number_of_neighbors_center++; + perceived_center += pos[i]; + } + } + } + } +} + +__device__ void computeContributionFromThisCell(int x, int y, int z, int index, + glm::vec3& perceived_velocity, glm::vec3& perceived_center, int gridResolution, + glm::vec3& c, int& number_of_neighbors_velocity, int& number_of_neighbors_center, + int* gridCellStartIndices, int* gridCellEndIndices, + int* particleArrayIndices, glm::vec3* pos, glm::vec3* vel1) +{ + // don't need to check cells that are nonexistent + if (x < 0 || x >= gridResolution || y < 0 || y >= gridResolution || z < 0 || z >= gridResolution) + { + return; + } + + int cellIndex = gridIndex3Dto1D(x, y, z, gridResolution); + int startIndex = gridCellStartIndices[cellIndex]; + int endIndex = gridCellEndIndices[cellIndex]; + + // - For each cell, read the start/end indices in the boid pointer array. + if ((startIndex != -1) && (endIndex != -1)) + { + for (int i = startIndex; i <= endIndex; i++) + { + int particleIndex = particleArrayIndices[i]; + if (particleIndex != index) + { + float distanceThisBoidAndNeig = distanceBoid(pos[index], pos[particleIndex]); + if (distanceThisBoidAndNeig < rule3Distance) + { + number_of_neighbors_velocity++; + perceived_velocity += vel1[particleIndex]; + } + + if (distanceThisBoidAndNeig < rule2Distance) + { + c -= (pos[particleIndex] - pos[index]); + } + + if (distanceThisBoidAndNeig < rule1Distance) + { + number_of_neighbors_center++; + perceived_center += pos[particleIndex]; + } + } + } + } +} + +__global__ void kernUpdateVelNeighborSearchScattered27Cells( + int N, int gridResolution, glm::vec3 gridMin, + float inverseCellWidth, float cellWidth, + int* gridCellStartIndices, int* gridCellEndIndices, + int* particleArrayIndices, glm::vec3* pos, glm::vec3* vel1, glm::vec3* vel2) +{ + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) { + return; + } + + // TODO-2.1 - Update a boid's velocity using the uniform grid to reduce + // the number of boids that need to be checked. + // - Identify the grid cell that this particle is in + + // - Identify which cells may contain neighbors. This isn't always 8. + + // Probelm: you have only examined one cell, you may also to need to examine neighboring cells + // return gridIndex3Dto1D(iX, iY, iZ, gridResolution); + + int iX = glm::floor((pos[index].x - gridMin.x) * inverseCellWidth); + int iY = glm::floor((pos[index].y - gridMin.y) * inverseCellWidth); + int iZ = glm::floor((pos[index].z - gridMin.z) * inverseCellWidth); + + glm::vec3 perceived_velocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 perceived_center{ 0.0f, 0.0f, 0.0f }; + glm::vec3 c{ 0.0f, 0.0f, 0.0f }; + int number_of_neighbors_velocity{ 0 }; + int number_of_neighbors_center{ 0 }; + + for (int i = iZ - 1; i <= iZ + 1; i++) + { + for (int j = iY - 1; j <= iY + 1; j++) + { + for (int k = iX - 1; k <= iX + 1; k++) + { + // going through 27 cells is not necessary (NEED CHANGE!) + int cellIndex = gridIndex3Dto1D(k, j, i, gridResolution); + int startIndex = gridCellStartIndices[cellIndex]; + int endIndex = gridCellEndIndices[cellIndex]; + + // - For each cell, read the start/end indices in the boid pointer array. + if ((startIndex != -1) && (endIndex != -1)) + { + for (int i = startIndex; i <= endIndex; i++) + { + int particleIndex = particleArrayIndices[i]; + if (particleIndex != index) + { + float distanceThisBoidAndNeig = distanceBoid(pos[index], pos[particleIndex]); + if (distanceThisBoidAndNeig < rule3Distance) + { + number_of_neighbors_velocity++; + perceived_velocity += vel1[particleIndex]; + } + + if (distanceThisBoidAndNeig < rule2Distance) + { + c -= (pos[particleIndex] - pos[index]); + } + + if (distanceThisBoidAndNeig < rule1Distance) + { + number_of_neighbors_center++; + perceived_center += pos[particleIndex]; + } + } + } + + } + } + } + } + + glm::vec3 alignmentVelocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 separationVelocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 cohesionVelocity{ 0.0f, 0.0f, 0.0f }; + + if (number_of_neighbors_center != 0) + { + perceived_center /= number_of_neighbors_center; + cohesionVelocity = (perceived_center - pos[index]) * rule1Scale; + } + + if (number_of_neighbors_velocity != 0) + { + perceived_velocity /= number_of_neighbors_velocity; + alignmentVelocity = perceived_velocity * rule3Scale; + } + + separationVelocity = c * rule2Scale; + + // - Access each boid in the cell and compute velocity change from + // the boids rules, if this boid is within the neighborhood distance. + glm::vec3 newVelocity = vel1[index] + alignmentVelocity + + separationVelocity + cohesionVelocity; + + glm::vec3 newDir = glm::normalize(newVelocity); + float newSpeed = glm::length(newVelocity); + + // Clamp the speed + if (newSpeed >= maxSpeed) + { + newVelocity = newDir * maxSpeed; + } + // - Clamp the speed change before putting the new speed in vel2 + vel2[index] = newVelocity; } __global__ void kernUpdateVelNeighborSearchScattered( int N, int gridResolution, glm::vec3 gridMin, float inverseCellWidth, float cellWidth, int *gridCellStartIndices, int *gridCellEndIndices, - int *particleArrayIndices, - glm::vec3 *pos, glm::vec3 *vel1, glm::vec3 *vel2) { + int *particleArrayIndices, glm::vec3 *pos, glm::vec3 *vel1, glm::vec3 *vel2) +{ + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) { + return; + } + // TODO-2.1 - Update a boid's velocity using the uniform grid to reduce // the number of boids that need to be checked. // - Identify the grid cell that this particle is in + // - Identify which cells may contain neighbors. This isn't always 8. - // - For each cell, read the start/end indices in the boid pointer array. - // - Access each boid in the cell and compute velocity change from - // the boids rules, if this boid is within the neighborhood distance. - // - Clamp the speed change before putting the new speed in vel2 + + // Probelm: you have only examined one cell, you may also to need to examine neighboring cells + int iX = glm::floor((pos[index].x - gridMin.x) * inverseCellWidth); + int iY = glm::floor((pos[index].y - gridMin.y) * inverseCellWidth); + int iZ = glm::floor((pos[index].z - gridMin.z) * inverseCellWidth); + + int cubeCornerX = iX * cellWidth + gridMin.x; + int cubeCornerY = iY * cellWidth + gridMin.y; + int cubeCornerZ = iZ * cellWidth + gridMin.z; + + float cellMiddleLineX = cubeCornerX + cellWidth / 2.0f; + float cellMiddleLineY = cubeCornerY + cellWidth / 2.0f; + float cellMiddleLineZ = cubeCornerZ + cellWidth / 2.0f; + + glm::vec3 perceived_velocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 perceived_center{ 0.0f, 0.0f, 0.0f }; + glm::vec3 c{ 0.0f, 0.0f, 0.0f }; + int number_of_neighbors_velocity{ 0 }; + int number_of_neighbors_center{ 0 }; + + + bool cellInLeftSideX = pos[index].x < cellMiddleLineX; + bool cellInUpperPartY = pos[index].y < cellMiddleLineY; + bool cellInLowerPartZ = pos[index].z < cellMiddleLineX; + + // Always check the cell the particle is in + computeContributionFromThisCell(iX, iY, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX, iY, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX, iY, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + + + if (cellInLeftSideX) + { + computeContributionFromThisCell(iX - 1, iY, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX - 1, iY, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX - 1, iY, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + else { + computeContributionFromThisCell(iX + 1, iY, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX + 1, iY, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX + 1, iY, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + + if (cellInUpperPartY) + { + computeContributionFromThisCell(iX, iY - 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX, iY - 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX, iY - 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + else { + computeContributionFromThisCell(iX, iY + 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX, iY + 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX, iY + 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + + if (cellInLeftSideX && cellInUpperPartY) + { + computeContributionFromThisCell(iX - 1, iY - 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX - 1, iY - 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX - 1, iY - 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + else if (cellInLeftSideX && !cellInUpperPartY) + { + computeContributionFromThisCell(iX - 1, iY + 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX - 1, iY + 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX - 1, iY + 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + else if (!cellInLeftSideX && cellInUpperPartY) + { + computeContributionFromThisCell(iX + 1, iY - 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX + 1, iY - 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX + 1, iY - 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + else { + computeContributionFromThisCell(iX + 1, iY + 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCell(iX + 1, iY + 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + else { + computeContributionFromThisCell(iX + 1, iY + 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, particleArrayIndices, + pos, vel1); + } + } + + + glm::vec3 alignmentVelocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 separationVelocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 cohesionVelocity{ 0.0f, 0.0f, 0.0f }; + + if (number_of_neighbors_center != 0) + { + perceived_center /= number_of_neighbors_center; + cohesionVelocity = (perceived_center - pos[index]) * rule1Scale; + } + + if (number_of_neighbors_velocity != 0) + { + perceived_velocity /= number_of_neighbors_velocity; + alignmentVelocity = perceived_velocity * rule3Scale; + } + + separationVelocity = c * rule2Scale; + + // - Access each boid in the cell and compute velocity change from + // the boids rules, if this boid is within the neighborhood distance. + glm::vec3 newVelocity = vel1[index] + alignmentVelocity + + separationVelocity + cohesionVelocity; + + glm::vec3 newDir = glm::normalize(newVelocity); + float newSpeed = glm::length(newVelocity); + + // Clamp the speed + if (newSpeed >= maxSpeed) + { + newVelocity = newDir * maxSpeed; + } + // - Clamp the speed change before putting the new speed in vel2 + vel2[index] = newVelocity; } __global__ void kernUpdateVelNeighborSearchCoherent( @@ -341,29 +972,362 @@ __global__ void kernUpdateVelNeighborSearchCoherent( // - Access each boid in the cell and compute velocity change from // the boids rules, if this boid is within the neighborhood distance. // - Clamp the speed change before putting the new speed in vel2 + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) { + return; + } + + int iX = glm::floor((pos[index].x - gridMin.x) * inverseCellWidth); + int iY = glm::floor((pos[index].y - gridMin.y) * inverseCellWidth); + int iZ = glm::floor((pos[index].z - gridMin.z) * inverseCellWidth); + + int cubeCornerX = iX * cellWidth + gridMin.x; + int cubeCornerY = iY * cellWidth + gridMin.y; + int cubeCornerZ = iZ * cellWidth + gridMin.z; + + float cellMiddleLineX = cubeCornerX + cellWidth / 2.0f; + float cellMiddleLineY = cubeCornerY + cellWidth / 2.0f; + float cellMiddleLineZ = cubeCornerZ + cellWidth / 2.0f; + + glm::vec3 perceived_velocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 perceived_center{ 0.0f, 0.0f, 0.0f }; + glm::vec3 c{ 0.0f, 0.0f, 0.0f }; + int number_of_neighbors_velocity{ 0 }; + int number_of_neighbors_center{ 0 }; + + + bool cellInLeftSideX = pos[index].x < cellMiddleLineX; + bool cellInUpperPartY = pos[index].y < cellMiddleLineY; + bool cellInLowerPartZ = pos[index].z < cellMiddleLineX; + + // Always check the cell the particle is in + computeContributionFromThisCellCoherentApproach(iX, iY, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX, iY, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX, iY, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + + + if (cellInLeftSideX) + { + computeContributionFromThisCellCoherentApproach(iX - 1, iY, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX - 1, iY, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX - 1, iY, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + else { + computeContributionFromThisCellCoherentApproach(iX + 1, iY, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX + 1, iY, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX + 1, iY, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + + if (cellInUpperPartY) + { + computeContributionFromThisCellCoherentApproach(iX, iY - 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX, iY - 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX, iY - 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + else { + computeContributionFromThisCellCoherentApproach(iX, iY + 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX, iY + 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX, iY + 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + + if (cellInLeftSideX && cellInUpperPartY) + { + computeContributionFromThisCellCoherentApproach(iX - 1, iY - 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX - 1, iY - 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX - 1, iY - 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + else if (cellInLeftSideX && !cellInUpperPartY) + { + computeContributionFromThisCellCoherentApproach(iX - 1, iY + 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX - 1, iY + 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX - 1, iY + 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + else if (!cellInLeftSideX && cellInUpperPartY) + { + computeContributionFromThisCellCoherentApproach(iX + 1, iY - 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX + 1, iY - 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX + 1, iY - 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + else { + computeContributionFromThisCellCoherentApproach(iX + 1, iY + 1, iZ, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + if (cellInLowerPartZ) + { + computeContributionFromThisCellCoherentApproach(iX + 1, iY + 1, iZ - 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + else { + computeContributionFromThisCellCoherentApproach(iX + 1, iY + 1, iZ + 1, index, + perceived_velocity, perceived_center, gridResolution, + c, number_of_neighbors_velocity, number_of_neighbors_center, + gridCellStartIndices, gridCellEndIndices, + pos, vel1); + } + } + + + glm::vec3 alignmentVelocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 separationVelocity{ 0.0f, 0.0f, 0.0f }; + glm::vec3 cohesionVelocity{ 0.0f, 0.0f, 0.0f }; + + if (number_of_neighbors_center != 0) + { + perceived_center /= number_of_neighbors_center; + cohesionVelocity = (perceived_center - pos[index]) * rule1Scale; + } + + if (number_of_neighbors_velocity != 0) + { + perceived_velocity /= number_of_neighbors_velocity; + alignmentVelocity = perceived_velocity * rule3Scale; + } + + separationVelocity = c * rule2Scale; + + // - Access each boid in the cell and compute velocity change from + // the boids rules, if this boid is within the neighborhood distance. + glm::vec3 newVelocity = vel1[index] + alignmentVelocity + + separationVelocity + cohesionVelocity; + + glm::vec3 newDir = glm::normalize(newVelocity); + float newSpeed = glm::length(newVelocity); + + // Clamp the speed + if (newSpeed >= maxSpeed) + { + newVelocity = newDir * maxSpeed; + } + // - Clamp the speed change before putting the new speed in vel2 + vel2[index] = newVelocity; } /** * Step the entire N-body simulation by `dt` seconds. */ void Boids::stepSimulationNaive(float dt) { - // TODO-1.2 - use the kernels you wrote to step the simulation forward in time. - // TODO-1.2 ping-pong the velocity buffers + assert(numObjects >= 0); + + // TODO-1.2 - use the kernels you wrote to step the simulation forward in time. + dim3 fullBlocksPerGrid((numObjects + blockSize - 1) / blockSize); + // Boids examine neighboring boids to determine new celocity + kernUpdateVelocityBruteForce <<>> (numObjects, + dev_pos, + dev_vel1, + dev_vel2); + // Boids update position based on velocity and change in time + kernUpdatePos <<>> (numObjects, dt, + dev_pos, dev_vel1); + // TODO-1.2 ping-pong the velocity buffers + glm::vec3* temp = dev_vel2; + dev_vel2 = dev_vel1; + dev_vel1 = temp; } void Boids::stepSimulationScatteredGrid(float dt) { + assert(numObjects >= 0); + dim3 fullBlocksPerGrid((numObjects + blockSize - 1) / blockSize); // TODO-2.1 // Uniform Grid Neighbor search using Thrust sort. // In Parallel: // - label each particle with its array index as well as its grid index. // Use 2x width grids. + kernComputeIndices <<>> (numObjects, + gridSideCount, + gridMinimum, + gridInverseCellWidth, + dev_pos, + dev_particleArrayIndices, + dev_particleGridIndices); + + + // - Unstable key sort using Thrust. A stable sort isn't necessary, but you // are welcome to do a performance comparison. + thrust::sort_by_key(dev_thrust_particleGridIndices, + dev_thrust_particleGridIndices + numObjects, dev_thrust_particleArrayIndices); + + // - Naively unroll the loop for finding the start and end indices of each // cell's data pointers in the array of boid indices + + // -1 indicating that a cell does not enclose any boids + dim3 fullBlocksPerGridCellArrays((gridCellCount + blockSize - 1) / blockSize); + kernResetIntBuffer <<>> (gridCellCount, + dev_gridCellStartIndices, -1); + kernResetIntBuffer << > > (gridCellCount, + dev_gridCellEndIndices, -1); + kernIdentifyCellStartEnd <<>> (numObjects, + dev_particleGridIndices, dev_gridCellStartIndices, dev_gridCellEndIndices); + + // - Perform velocity updates using neighbor search + kernUpdateVelNeighborSearchScattered <<>> (numObjects, + gridSideCount, gridMinimum, gridInverseCellWidth, gridCellWidth, + dev_gridCellStartIndices, dev_gridCellEndIndices, + dev_particleArrayIndices, dev_pos, dev_vel1, dev_vel2); + // - Update positions + kernUpdatePos << > > (numObjects, dt, + dev_pos, dev_vel1); + // - Ping-pong buffers as needed + glm::vec3* temp = dev_vel2; + dev_vel2 = dev_vel1; + dev_vel1 = temp; +} + +__global__ void kernReshuffle( + int N, int* particleArrayIndices, glm::vec3* pos, glm::vec3* pos_new, glm::vec3* vel, glm::vec3* vel_new) +{ + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) { + return; + } + int particleIndex = particleArrayIndices[index]; + pos_new[index] = pos[particleIndex]; + vel_new[index] = vel[particleIndex]; } void Boids::stepSimulationCoherentGrid(float dt) { @@ -381,7 +1345,47 @@ void Boids::stepSimulationCoherentGrid(float dt) { // CONSIDER WHAT ADDITIONAL BUFFERS YOU NEED // - Perform velocity updates using neighbor search // - Update positions - // - Ping-pong buffers as needed. THIS MAY BE DIFFERENT FROM BEFORE. + // - Ping-pong buffers as needed. THIS MAY BE DIFFERENT FROM BEFORE + dim3 fullBlocksPerGrid((numObjects + blockSize - 1) / blockSize); + kernComputeIndices << > > (numObjects, + gridSideCount, + gridMinimum, + gridInverseCellWidth, + dev_pos, + dev_particleArrayIndices, + dev_particleGridIndices); + thrust::sort_by_key(dev_thrust_particleGridIndices, + dev_thrust_particleGridIndices + numObjects, dev_thrust_particleArrayIndices); + dim3 fullBlocksPerGridCellArrays((gridCellCount + blockSize - 1) / blockSize); + kernResetIntBuffer << > > (gridCellCount, + dev_gridCellStartIndices, -1); + kernResetIntBuffer << > > (gridCellCount, + dev_gridCellEndIndices, -1); + kernIdentifyCellStartEnd << > > (numObjects, + dev_particleGridIndices, dev_gridCellStartIndices, dev_gridCellEndIndices); + kernReshuffle <<>> (numObjects, + dev_particleArrayIndices, dev_pos, dev_pos_new, dev_vel1, dev_vel1_new); + kernUpdateVelNeighborSearchCoherent << > > (numObjects, + gridSideCount, gridMinimum, gridInverseCellWidth, gridCellWidth, + dev_gridCellStartIndices, dev_gridCellEndIndices, + dev_pos_new, dev_vel1_new, dev_vel2); + + // - Update positions + kernUpdatePos << > > (numObjects, dt, + dev_pos_new, dev_vel1_new); + + // - Ping-pong buffers as needed + glm::vec3* temp = dev_pos; + dev_pos = dev_pos_new; + dev_pos_new = temp; + + temp = dev_vel1; + dev_vel1 = dev_vel1_new; + dev_vel1_new = temp; + + temp = dev_vel2; + dev_vel2 = dev_vel1; + dev_vel1 = temp; } void Boids::endSimulation() { @@ -390,11 +1394,112 @@ void Boids::endSimulation() { cudaFree(dev_pos); // TODO-2.1 TODO-2.3 - Free any additional buffers here. + cudaFree(dev_particleArrayIndices); + cudaFree(dev_particleGridIndices); + cudaFree(dev_gridCellStartIndices); + cudaFree(dev_gridCellEndIndices); + cudaFree(dev_pos_new); + cudaFree(dev_vel1_new); +} + +void Boids::LabelingBoidWithGridCellIndexUnitTest() +{ + static bool runOnce = false; + if (!runOnce) { + runOnce = true; + std::unique_ptrtestArray{ new int[numObjects] }; + // How to copy data back to the CPU side from the GPU + cudaMemcpy(testArray.get(), dev_particleGridIndices, sizeof(int) * numObjects, + cudaMemcpyDeviceToHost); + + std::cout << "dev_particleGridIndices: " << std::endl; + for (int i = 0; i < numObjects; i++) { + std::cout << "[" << i << "]: " << testArray[i] << '\n'; + } + } +} + +void Boids::LabelingBoidWithIndexUnitTest() +{ + static bool runOnce = false; + if (!runOnce) { + runOnce = true; + std::unique_ptrtestArray{ new int[numObjects] }; + // How to copy data back to the CPU side from the GPU + cudaMemcpy(testArray.get(), dev_particleArrayIndices, sizeof(int) * numObjects, + cudaMemcpyDeviceToHost); + + std::cout << "dev_particleArrayIndices: " << std::endl; + for (int i = 0; i < numObjects; i++) { + std::cout << "[" << i << "]: " << testArray[i] << '\n'; + } + } +} + +void Boids::SortingUnitTest() +{ + static bool runOnce = false; + if (!runOnce) { + runOnce = true; + + std::unique_ptrintKeys{ new int[numObjects] }; + std::unique_ptrintValues{ new int[numObjects] }; + + cudaMemcpy(intKeys.get(), dev_particleGridIndices, sizeof(int) * numObjects, + cudaMemcpyDeviceToHost); + cudaMemcpy(intValues.get(), dev_particleArrayIndices, sizeof(int) * numObjects, + cudaMemcpyDeviceToHost); + checkCUDAErrorWithLine("memcpy back failed!"); + + std::cout << "after unstable sort: " << std::endl; + for (int i = 0; i < numObjects; i++) { + std::cout << " dev_particleGridIndices: " << intKeys[i]; + std::cout << " dev_particleArrayIndices: " << intValues[i] << std::endl; + } + } +} + +void Boids::StartEndUnitTest() +{ + static bool runOnce = false; + if (!runOnce) { + runOnce = true; + + std::unique_ptrintKeys{ new int[gridCellCount] }; + std::unique_ptrintValues{ new int[gridCellCount] }; + + cudaMemcpy(intKeys.get(), dev_gridCellStartIndices, sizeof(int) * gridCellCount, + cudaMemcpyDeviceToHost); + cudaMemcpy(intValues.get(), dev_gridCellEndIndices, sizeof(int) * gridCellCount, + cudaMemcpyDeviceToHost); + checkCUDAErrorWithLine("memcpy back failed!"); + + std::cout << "Start and end arrays: " << std::endl; + for (int i = 0; i < gridCellCount; i++) { + std::cout << "Cell: " << i << '\n'; + std::cout << " dev_gridCellStartIndices: " << intKeys[i]; + std::cout << " dev_gridCellEndIndices: " << intValues[i] << std::endl; + } + } +} + +void Boids::PrintCellStats() +{ + static bool runOnce = false; + if (!runOnce) { + runOnce = true; + std::cout << "gridCellCount: " << gridCellCount << '\n'; + std::cout << "gridSideCount: " << gridSideCount << '\n'; + std::cout << "gridCellWidth: " << gridCellWidth << '\n'; + std::cout << "gridInverseCellWidth: " << gridInverseCellWidth << '\n'; + std::cout << "gridMinimum: " << gridMinimum.x << ", " + << gridMinimum.y << ", " << gridMinimum.z << '\n'; + } } void Boids::unitTest() { // LOOK-1.2 Feel free to write additional tests here. - +#if 0 // test unstable sort int *dev_intKeys; int *dev_intValues; @@ -454,4 +1559,5 @@ void Boids::unitTest() { cudaFree(dev_intValues); checkCUDAErrorWithLine("cudaFree failed!"); return; +#endif } diff --git a/src/kernel.h b/src/kernel.h index 3d3da72..cd6e013 100644 --- a/src/kernel.h +++ b/src/kernel.h @@ -18,4 +18,9 @@ namespace Boids { void endSimulation(); void unitTest(); + void LabelingBoidWithGridCellIndexUnitTest(); + void LabelingBoidWithIndexUnitTest(); + void SortingUnitTest(); + void StartEndUnitTest(); + void PrintCellStats(); } diff --git a/src/main.cpp b/src/main.cpp index b82c8c6..c249279 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,18 +14,18 @@ // LOOK-2.1 LOOK-2.3 - toggles for UNIFORM_GRID and COHERENT_GRID #define VISUALIZE 1 -#define UNIFORM_GRID 0 -#define COHERENT_GRID 0 +#define UNIFORM_GRID 1 +#define COHERENT_GRID 1 // LOOK-1.2 - change this to adjust particle count in the simulation -const int N_FOR_VIS = 5000; -const float DT = 0.2f; +const int N_FOR_VIS = 50000; +const float DT = 0.005f; /** * C main function. */ int main(int argc, char* argv[]) { - projectName = "565 CUDA Intro: Boids"; + projectName = "565 CUDA Intro: Boids "; if (init(argc, argv)) { mainLoop(); @@ -64,7 +64,8 @@ bool init(int argc, char **argv) { int minor = deviceProp.minor; std::ostringstream ss; - ss << projectName << " [SM " << major << "." << minor << " " << deviceProp.name << "]"; + ss << projectName << " [SM " << major << "." << minor << " " << deviceProp.name << "]" + << " Number of Boids: " << 12000000 << " Author: (Charles) Zixin Zhang"; deviceName = ss.str(); // Window setup stuff @@ -77,17 +78,18 @@ bool init(int argc, char **argv) { << std::endl; return false; } - + // same as in LearnOpenGL glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - + // width and height defined in main.hpp window = glfwCreateWindow(width, height, deviceName.c_str(), NULL, NULL); if (!window) { glfwTerminate(); return false; } + // https://computergraphics.stackexchange.com/questions/4562/what-does-makecontextcurrent-do-exactly/4563 glfwMakeContextCurrent(window); glfwSetKeyCallback(window, keyCallback); glfwSetCursorPosCallback(window, mousePositionCallback); diff --git a/src/main.hpp b/src/main.hpp index 88e9df7..9ebda49 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -38,7 +38,7 @@ const float zFar = 10.0f; // LOOK-1.2: for high DPI displays, you may want to double these settings. int width = 1280; int height = 720; -int pointSize = 2; +int pointSize = 0.5; // For camera controls bool leftMousePressed = false;