Skip to content

Instantly share code, notes, and snippets.

@olivierverdier
Created December 11, 2015 11:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save olivierverdier/c4621effa1fca68aaa24 to your computer and use it in GitHub Desktop.
Save olivierverdier/c4621effa1fca68aaa24 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercise for the course [Python for MATLAB users](http://sese.nu/python-for-matlab-users-ht15/), by Olivier Verdier"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Consider the same code as in the lecture, to create a Mandelbrot fractal:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def get_grid(nh,nv):\n",
" x = np.linspace(-2,.8,nh)\n",
" y = np.linspace(-1.4,1.4,nv)\n",
" return np.meshgrid(x,y,indexing='ij')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def mandel_py(w,h,maxit=20):\n",
" # prepare initial points\n",
" x, y = get_grid(w,h)\n",
" c = x+y*1j\n",
" # where to store output\n",
" output = np.zeros(c.shape, dtype=int) + maxit\n",
" for i in range(h): # loop 1\n",
" for j in range(w): # loop 2\n",
" z = 0.\n",
" c0 = c[i,j]\n",
" for k in range(maxit): # loop 3!!\n",
" z = z**2 + c0\n",
" if z*z.conjugate() > 4.0:\n",
" output[i, j] = k\n",
" break\n",
" return output.T\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x106a1af28>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAP0AAAD/CAYAAAA6/dD3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWeQZNl15/e7z6T3WaarXbWf7ukxGMwMPDgACRoRJJdY\nrbi7IrUMxYY+rSIoKaQgtd8VweUXKRTSF4VWCprgLqllLAguCQIgCQ4wHHKA6TE90z3tTXmX3ucz\nVx/uu53Z1eW7bFf+I15XdWXmezdf5v/ec8/5n3OElJIBBhjg8MDY6wEMMMAAu4sB6QcY4JBhQPoB\nBjhkGJB+gAEOGQakH2CAQ4YB6QcY4JDhqUgvhPg5IcQNIcRtIcRvbtegBhhggJ2D2GqcXghhAjeB\nrwHTwI+Bfy6l/GT7hjfAAANsN55mpf8McEdK+UBK6QD/HvhH2zOsAQYYYKfwNKQ/Bkz2/X8q+NsA\nAwywj2E9xWvX3RcIIQYa3wEG2CNIKcVKf38a0k8DJ/r+fwK12i/DOHAq+P1U3+/7EQkgA3wb+BdA\naG+Hs2H8AfBrez2ITeKgjXm/j/dqcGj84arPfBrSvwucF0KcAmaAfwr88yefdgr4ylNcZjdgAAKI\nAVkgwsEh/AADALwUHBo7QHoppSuE+G+B7wAm8G8PpudeAHEgiVrp7b0dzgAD7DCeZqVHSvltlC28\nBk49zSV2CQlgBEV4g8dnzIOAgzZeOHhjPmjjXR1PRfqN4dTOX2JLMFHmfAy1ylv0ghkH7QN+2vFq\nayfGzok0HaABtIP/H7Z7vH+wC6TfrzCBFDDE44Q/jBCoiW8EdV92Ag3Ap0f6AfYKh5D0FhBGrWoJ\nlNPuWUAI9V62QloDRfqdXOkB0k/x2i5qwvC2aSyHF4eQ9CGUhz7Ns+Whj6KslugWXx9Grfg7BX3f\nE1t8fRkoAK1tG9FhxSEivRUc/Z76gwI99rVW8SRquxLblRFtHtqHslX4QIe1LREX5Tvwn+I6zz4O\nEekjKOHNQTTpI/T0A2s951myXJYjCgyjSL0aakAJNTkMsBoOAemN4NDCm/26Egp6Y12OOJDjYFkn\n240I60/WBsr8X77Sy+BvAwsADgXpD4rwxkaZ5/EVHovybK/i24UYK1sDPsoKqDIg/jNPeh1/HkGR\nZicdVU8L7egaWuExwf4e+35BlJWtAe3xr+3iWPYvnnHSQ89s3g+kMVCT0EqreYSdD5k961hrckwC\nozy50rsoDcHhiQocAtLvJxgoE36UJ7+cBjsnjDns0DqElcKZLWCBAekPPAzUyhlGfdB7tcrbwfX1\nbbZQX77IHo5pH8E0wNoGy8bz1bFm9QYd9lwOgZqI+y2ADs+yEOgZJb2JIlcetVfeqxU0EoxBm/MG\n+9+3sIuwTYhYYDwN8SW0XPAcNlDXZaVBoEK5/VGdErDEgPQHAibqQ4ygSJ/cxWuL4No2PVJrwcwh\nDLUZQh1ijQnONiFkqef1o/9WLoeHcs5rPkrAk8FKvwbpPR/8lR43UNZYv+nvolZ6PQAfJQN2Vz//\nAcIzRno9a6fYuhx1q9D79Sw90odQW4xDCE1ocw3Sm8bKRo821FaS6rdRitxm8H8RXGst40kCHVcd\nG6r+HA9OrGeWDmr1r27gtfsfzxjp9Z45uwvXMnhcTKO/qUMcGg+8YPWV3ApMd3MD9yK4jcKWGGEf\nYhKZM/Czfa/1UAttDcXB/lD8er4BKdUq73qPb92lXGVHsFwI1KSX8NM/IJ+tbSn2Fs8Y6XcTYR63\nKAyUGX+I9uumEazmKxDONp4021dDGEiCddwhdrmOfaJLs52g2e7bFhWAORTvMvRuuwTqqMlgVd2N\ngJAJItTjqOuB44G7EbGOjVpI+q22anAcPJN/QPotI4xy0mX6/naICA+K7BFLEf9pEAFyYF1ySPxi\nhegrDfy7Js37faS/C1RQIfUQPfLqnzpdfyXoLYDd59DtuMoXsCGFniZ9/2dtoCyAAen3CBHUPmyn\nkmlEcO44PdNdq78OCdEFymTvJ45lbN7zrtMgYvRuXRYYBTdu06il8OdNEuEqubOFRy+ruSnKhRwd\nL6K41p9TE0epbzV/uzz5nOXQE1b/tsAJVv9V0f9Za6WnJn2XgyLyeYZIn0cRcyfCc7qyzGjf+Q+b\nmCYwkaOh3ndfrOOdXwn9ro/lpI/Z1MppvGmLk0fvc/Lk/Ucvm2mfoD0Xo9OMqO20JrRWWvfP9XUU\nF9clvd1z7EkZLNzrRAEeQV90uakxIP0OQztc9N56uxNqTHrhHC2qOSROOkM8vpJrE3k1j/t66C9Y\nFOfx7XFIHVIKvIqFEwrhDlu4MZMwHUJ0CafaGHlPee59Vp5v+4vrpIIxd1iZ/I+ckMGbkVJNalIq\n4q9LfnPZICQq3NB/c9qsnPW3tzjgpI+jVvidIDyo25OmJ/I5JKY8KHKHbUUEDUNs/RboW7lWwSIH\nqIBvGDRbMYrkSFHFwlWTRBZlUcPKkdAKaoXXuUthoMjG0uuF6E1qbRd8J9jzbxR639+vDVlCzUQD\n0m8jbBTxtyvt1A7OpVdz7aHfTZHPHsMQanW3TUV4e5u2MCY918tqCIrjyJag64RoySipuVkisw9J\ntCWZeA7vpEk7FqVbscER4PbNQgmpPq4GylQvC7XQljc6RkONU4t9jD4rwJeriHv63+BybYiW87ZQ\n5N8fCr8DTvrtRhRVrEIvIyt9kM84LBPCVm/V20tISfTde2T/099gnTmLeEMQPd9lduQo3UoWyiZU\n+0h/TELEV5G0CQPuC7XYbha2AaJvv+9J6DjQ3SxpteO3ghL37I/9/gEkvU6VNdm+4ev9WYL9XV1n\nB7BcKmsbivTbkQgDPf3SJqqMSwS+b+C4NsZUleiVB8TokvpimkTGoJO0qQ/FYNGEQs8SiWQaxIdr\neCWTmpGhXY+rhmsh1CK7Uc6axuMTnhsk9LhBUs+GHH3Q8wcJ1Irv0hP17B0OIOm13DWJmkmf1vzU\nnnl9zv1cXWebYQgVY+834TcjqtkIAuHNZqKpvm/Q6MTxmz6FF19g6b8pcpYlXnl4jflOk/bpKPV8\nQo010xvr86FrvBb5MZVOhh9kv8qN4csq4FJAiXfWFPCsAUOoidAQarXvbjY2H0HFFCP0xAZ7hwNI\neh3zGdum8+kY/BEOFeEhIL0JsR0sxRUIbzaTc+RLg2Y3RqsRovDiZXKft3nlve/zub/6NqW5Ge4N\nnWLyzDHlFJQ8ci6+5v6IX3P+gOn2CSayZ7gxclk5/pboKfe2Ak162wTZBcfdpPpWr/hhevH8vcMB\nIr122mmRzFYRCs6h9+o6n/qQhOJAma62Aba1fY665ejvGLbRudQOXtMns20RoUSW2kiCzqsWabPI\np4euEK/XiH3SJnq3Q+FSluLFLNiSv7G+yoR/iunqMbWo2qjVXqPG1oV0giCaEe4JeTZs6sPjYQVQ\nM0cDNRvtnpPvgJE+g1o2noagK8lnl8dcn3GYQoXjwtbORSF1jcowG7+1ujaojsICbaKUyFIdSdCN\nWwyJeT4df48LpdsMvVsi890at79xmtunz3AzfIHvi6/ywD/LdPWoIn2Ix0lvsPUsWSF6EY1mNyje\nsVnS5+h99yQwj5qFBqRfAQI13K2a4LqKjm4IcQiry+psNNsMhDfbzHhBTy+VQN3itb5h+rk51AKo\nNVaB008i8DFwsSiFctwxz9Ba9Kh/3MJ/WCPaFoRejlAYyzFlHeNB8zT36ueYKx+jKeLKIOyguKXz\n87UloXtprlVGf8X3KHpCJZ25566Wq7/SDVp+QxKoWU5LeHdey3+ASP+00M0SDpmzrh9WID21zbXz\n3LcKXYoux/qEB0XAHOpjGWHNj2bJyHFNXGZ+XuL92U2smxWKP3OU5D89xgf5l7gS/jQPl04zO3WC\nWjGFZ9vq3MsjZXpSCaEcfJslvYa+hx0DpAP+VlfqBD0VkcuA9EDvE4qzteHqQhbaO39I4u4CJbLp\nJ7cW3Gx3/F1XAdPiG12DYrVxhVDkTtBz0Wh5ri0h6kMIBJIoLXIUSVElTAdZdWne7uB94iB/LkT3\nUpYSGcpkqMkkTS9KV4bVNaI8WfVal8rTXbIkivibJb8hwDDVebwgJLBqdZ61EGiQcei17eqwk+Q/\nAKTXLZ22mkGXQE35cQ7VCi8Cj3N/2qsptt+kB3Vb06h5db0+mFoOkeHJVAZbQsaDlA9hRZ4sJU5z\njxf8a7zivY/hPeSOX35McxOlRZYS5UiWQr4LwoOyAY01BqJ9aiHU3n+rK762nkxjiwIeDW2JRlAm\nyFZDDevjAJDeZvP17gQ98Y62Nw8J4XUiid67R3bwI9YaKV2ScCOdqAXq+50NXmuAFXaxYg4i4eFn\nJaR9LOkQosuR2iSnSjc56X7CmHMTZ3qRcBMMN0a40iUx2yCdqJKLF1kMDWMmHbXH7gpoSAiLnrGn\nI2YevT2+hSK8TtTZLGd12NOg59jz5Sa9+vQN0KTnbNBinu3FASD9VmDSy+7YDgHPAYJh9GLKOxWO\n09iC8OYxBMmLibEqwyfmsYc6NKNRvIhghAVG/AUu/PAdTrz1Dn5lgtt+g9YMlO+BXXc48u4CZ2Iu\n7VejFF7LMc0xlZwTCiwGQ4IwQBq9uHoFZfLrld1CWSgWvc5XW6mApe/7lgU8GiF6CV4VdqIu3z4m\nvVj2czOv0yld2yXgOUAwgy9feIc/WkEv8209I6z/I+wvLRiXiDwkxyqMj98jmm1QJIeDzXluc867\nzdgnP+bo712hOlvnrt8zerNhh+H3lji3UGIhnGfyxWMkQnVs4WCEPURYQtRAYiERAY+FInSLJ0kf\nR+3P6yyro7fB+/GYgKejLIotQe/xo/SKAm5mIOtj3W+GEOIE8Hso/6oE/i8p5f8uhMgBfwSMAw+A\nX5FSbjSfaQPQnp0kGw+vhegtPU8j4DmA0Ob8biTK6I9Gh+XWgnbu2X3/P+3DaZ9Irk002+J85iZf\ntn7IsDtP0cjRMqIMscSQWOLI8BJHLrnMWFBY5FEV3LYH96vQnYPFWpu4X+aIPcfp6D3y4SUitCEs\nKJl5SvE8bSdGaymOXG0R0cJM6JG+g4qkbZnATwML5fgwUMRfPhs93ZnXgwP891LKD4QQCeCKEOJ7\nwH8NfE9K+TtCiN8Efis4tgkx1DyzmcIV2juT38RrnhH0h+M2W81ms4jSE9Csd5u1NaAJFZVw1ofL\nHtFknUyyxDnjJl+SP+SMe5einadGAhMPC5eR4QKjz3s4Hbhf5xHpOx7cq8KUI4nW2iT8CmPWLDUz\niYNNhhJIwb3UGUTeo7Q0TNuIIlfb6um6pv25VtrBtyek11tUHQppsmukl1LOoeqQIqWsCyE+AY4B\nvwS8ETztd4G/ZVtJr1OzNrIv1SVZdBLOPt61bDcsQ6XDhnZIcKOhHXDaabee0i7S91z9exiMjCQ0\n1CKca/KC/JiXGh/xmZl3OH5/kkylhGU6RIwIRR8WfGhfq1O+6zNbhHYf+Xypts5OWyI/LMP/95Dc\ni21evzhPKG6S7NRp+Ala0RiT4RMYCV9NPtq0r/G4mQ+PVzQneL9per61jRTjADXxRu0NVuBZDdoZ\nrcUPLor4T1+Mc1PsEEKcAl4B3gFGpZTzwUPzPC523GVEUUXXDqHwRn/BzB0kPPRWws0Kb3RRo2Dv\nLIZ8Ypkm6USB14pX+Ebhzzjx7n2S3ysh7rnERA2XJg89uOuBVXexaz7tJjRWSEeXnqT9oxLOgybj\nvzDN+XSI3FFBuOQx645xZ/hcb8EcoscXE7VwrhWqC9Mrr1BgY6Q3hMppMA1oOxvosbcedBaoDuVp\nr/7WsWHSB6b9nwC/IaWsiT4TUkophRCrvLW/7fv9VHCsehV68ZWNmPXh4Pm6ddQzLrwRIoi1990X\n21Qr/U4RfrnwZqVu2rqbWP98q90qmvRatBMBaQo8aeIJE880kC0DMQvebZ9q12fRcSh6UNmINSvB\nm2/jzbdxR0Aeh8h5yIZAJAUn3ClOMolvhSlFh/CjZs8n0VWvp8vK5O9PyejwuHWtzf6VxmgKMM1e\nCM/11M8trfjQu7ldVhfwXA2O9bEh0gshbBThf19K+c3gz/NCiCNSyjkhxBiq3+8K+MqGBqLQr+OM\nsL5pr2vkHRItvU6U6a9bZxo7u4dfXttupUvp56T6/qb7hobprbQhnTYbx6kbfGxfJjbS4PWxK7w2\negU70+J+Ce63obIFfizdgI//EGovwaXPQuTFFqflfV7jXRwiTHAaV89M2tcQQpXTWmvF1++vf79f\nplekczXYwWTcCYQ77tN64Pv9XMsFPC8Fh8YfrnqWjXjvBfBvgetSyv+t76FvAb8O/Jvg5zdXePkm\noZsJZlhbx6m1lMnguc844UWgpNN7950Mx+nVrb9MYILe3tbkyY9mJXGOfm6UxxxkUgo6TphO22Qy\ncZxIokUqVeBE5BOiFkwDE1v0V9Wm1SEck+GLIfLhCLbVJUuRGC0VuDPpRcT0xKQVsLp11kr3ZHkx\npf4S26sVw9EVeHypxEJPDR3O02V+tybg2ci354vArwFXhRDvB3/7n4HfBv5YCPEvCUJ2m7rylmGi\nlpQMh0Z4YxlBSuc2lrFaDToRUZvqFr2KTwl6paUfGx9PinN01fAY67pZCm34uADRgvr9adEIxZjM\njTA3epL3Yy/zAS8zxTE8zF5WXwPlzOvSE+foTlUbWZB1sw4t6Nmok29boJ0N2kzZnIBnI977t1h9\nc/21TV1tW6C3AEd2/9J7AS2p1eG4HbsOPQ+93l31P6Y18+v15+w/jzaf+x8zQBgSIXxM4WHhUG17\n3ChJoqXteStNK8JUbJh24gwfWc/zIS9TFCN4htmLQJgoourknxhqwexvj7W8dVY/dDEcvb12guet\nOGGIXkrutmhs9IofQc1a20z6AfYQWmwT2kFHHTzetSvB498Kq++xtbLnoNeySj+3f46yJSR8jIRH\nNNsgmmhwJnSXV8UVItymQ33bVObuRJPGf5yhORen+7lL8DKqPPaICzUBdQEhoYxFGxUFa9DrP7pc\nnLPWKq4thxCrd7WyghZapthE08ydw4D0+xl2UL/OFDvrrNOtoUZQ34j+S2mZap7eKr4adFhPWwPL\nM+jSPkbeIZask00UOSPu8WnxHg73eEh9w+Xp14M70aSx0KF2M0QnXlVB5rgPw57S4ret3gofpteN\narmQU4tz1iJ9mF67BI+VSW8avbCqLwekV9AbRx0TWgnaBlvrOc8AtDmv9/HLS1RvB2x6jizorfQW\n6tZG6JnBMZSDbiOFLbXDq9/ZF5IQlZgph3C6SSTZJBJuYRoebSIskQcKOGyTbQ+Yw2FCl1PI1/Ok\nTkGaCk0jjrAkxCRkPQgZ0BLgiV7uQDs4tAkeCd77St10lkPXuhQo4veTXwT/WEFehBC9ijtP905R\ng/foCXfW3z/sE9Lr+nfZ4PeVvuS6bVCOfTPsnYAuvhgNBYUadmCFD6Fud3+ijF7htcQ2R6+KrQ6W\nbATLLYWIhJyHle2QSNZIxquYhjLky2R4wCnCVHGU6HNbYJ2MEf/GMcI/fYLckEWOImUyynsflWB7\najLyTeVV1wpD3QJL80aH9TbCzX7SF1h5xddJOZYRVMZ6WtJrfX4MFTHX+cHrv2ofQCtAVhLXaBtM\nJ9I8owIcIZ6sYbdd0BomTUZtMPUXBA58Q9aYg326i8wLnKSNF1YbcxuHcXeCcXeCxdAQM+Ex6iRw\nPBvPf9LBaJsOtuUgkh5kPKLJJploiZTVczrZOPgYREcNhl4T+A5UJ6CxiuJjPSRDkAlBaNRCnIvR\nPB8lRZecLFAw8yTCdRxbhRJMyyckPGTEpOnFaHWDEIUrFPG15Hc132mwPbCiLnasC47EGbNx5y24\nI1TLLX0ezW0trtK/PzU0b3T4uouaTdYOJewT0q8F3YZal2V5RmEGq0B4m7Pk9H49Q+8LrDvILn9O\nFsLnWqReLuNmDWpeCs9XbvywbPCF5lt8o/Gn/CjzGt/L/yQPxTi1VhLPeTKZPhxtkIpUMcMOhCVR\nu0XeLJDq8zTnKJKjxIlzDY7/E5fuMbj5ra2TfjgKl7Jg5GA2DG184jTIiyLFUIGCWcCRivTRSJtk\noo7fNphpH6PVOMKjqiAbEd4Eunx7pEPyaBkR8qhVUrhzcYgYUDdVfb7SOufZFmiprh1csLDmsw8A\n6XW67DPaRHK58Cb0lB/J8jwlTeg0T65aWuekzf0RSB6vcfTMFHa0S6sYw6nb4ELSqfFS6e95tfBd\najGfG+lT1MNR/CbIbm8faeJh4jLSnmGkOo3ltXCBcNQll2uSirfwCl28QpeR1CRj6RlOREqcOt2l\nvQCVtKpy1ZLKWN0MkhE4mQcv5FKcb8KdEpmcRzjVolWU1EsdnGQC8lFi1EnXZ6HsYTUL2K0yNTFM\ndWgYqdtxt1Er/0qkTUoYgtCxNqnxEtFEk0yzRGsoSmUxT+VBXj1P97B0eXLFt4wNNMbcCAS9rCaP\n9e7cASD9Mw7LUEQPbZNJr1MR+n2dWlzzxLWD56ZRnvsRGE4u8qJ1lfHmBLmZMvGZFtTBKHeI3r/O\ne/ccln66wuixB7TicYyoTyicBcDAJ0GDOHVOv/8eZ75/BQplKgCnwmR/JkP8Qpjmm/M0vzfPideq\nPPd6jdFOhcR0m9AHcK4IMRMe+FtQ5gXhM7fapP7nMzgfVDj2tTC518KE3/4E/ipF57Vx5M+cxi7V\niHznBvbHBcadFB1rlPde/2ne/8zXcNJhJQOpG1ANHH7LMSJhxCeUaZMOVThuTnI0MkMk1eEfcl/i\nH0a/hJTB60o8LuARqM/cECpHuOM+hS5/ObRUd3XsMel1DMjgyW+l/vtKjx1giEf/KOgY7maFN6vd\nFq11X6tenb7teoIYCo4cZBIlzpl3eb3yY16YvsnYrTncRWjOw3vX4cp1aA2VGfn8PfxMGD8MEauN\nj4FAkqdAngLP3fkRl/7Dd3DuLTIPuJ/OkDt6llg6T/GtuxT/n3uMFCTHEpBqATchdAOOFCBsKO39\nxObuCJ4NnRi0ym3qH7fphiGfhYsnofk21H4PnMYLGJ+qIadr+N++QuSvHjIKRNIZasNZbv7sZ2jG\nkvgYyIoJC6Yi/3IMeTDiEUvVGbIWOSvu8nL4Q7LxMvPZY7wz+sUe6aGX1CODD0BrMPyuKq21bYVx\ntGpodewx6ddy0CXomfXPiLZeiJ7YRmMrOfBaHbdScSCdpLgWdGevfmdegCopJjjBsfo0ZyYmaV6H\nyXmYWwLRhNdGYObBAhO/f5XR14uMfP4B7dNHKJKjTpwcJXIUibFICQcX9V2PzncY/cs58jeq+O+V\nKUnJ7C248i2IuMAi+IvglaDlwcIWSLBYgqu3Vau5cg3aTXjwfWjMw/SPwO3CSHGR4zc+orvQYbJW\noU7QUlK4ZMKTvBr/MUvxMQrk6VphNQOtpJuP+xD3ORe6w5d4i5PeBE0jxgPzNLOJMeTwCtsCm9UF\nPLuIPSa9ljOtJOiOo1L0Iys8dkChw3GxUN9bEpt/ezo8u5oVt9759B4+/eRza6SY4CTjjQmaEzGa\n1+DuHNwswqvD8NowfPxwgaX3CySn7jN+bAjr9Bh3OcMsY+QokaVEg0XKuI8Wt8x8m9Fvz3HMhmJL\ngoTZmzB/NxiC3zukv7UasIslKFbU9XwPpID7fwMPfwC+A54Do4VFXrlRpFaW1Go+JRTpES7Z0CSv\nJ97hfvwCdzlHPZ5QX8+VJqDAWjrr3+HL7ltk3DJ/bf0k7xuvMJsYU9Ws+5prPoLLYSc9PC7d6tdx\n6qyPZ6DslXbU2UYv3XIz0B25dOKKFsFs9tZo0Y2uXqtFOvrvAkb9OV51r/Bi/GOy50rIRXA70JqD\nmTpcM2G67tOp+Zi3GpS+BYkll7HLbUaPz9D4uEnjWoPO24u4VefRYtfyJNMtj2YbCro3hKuO7YLv\nq+MRJHgddWiUZn1u/1gV5agXg9eh/BE5USAp7uCLCFXSJESdMB2sQhVxdRFuFx+dJ3Q5RfilNBfM\n2wzVimT9EpcTn2AaksvmTRZjb/NR+EU+Ml+ibsZ7mYtPJCsFaj3HV4Kdp3bqrY99QPp+6N7zo/TK\nrTwD0KKMiLW1+Kw2iLRzTifAbOU8uvyA9vAneKwG/Ql/ii+7b/Fy6irpFxvUHGAW3OswWYOllvI9\ntV0Q9xxm/kONobstLv7aEkdSFtd/4DP7Bx7OQhe/0ktSb0q478Mk0JbbWdt1c1iYhVpF1bdo9XWM\nNvDJyQInuUeLNPOM0iFMmjKxhSnEX15FfOv2o+cnfvUkqZPjPJecJ1OukXMrvCI+5Hz0Np4ZwouG\n+V3717kvTlNfq0ir1mS03WDWOnSkF/SWn2fApDcCwY0drPJrxd91wYmV0lB1PvpWastDr4+C7urV\nL7+1g/OGJIQltViCKes4uUQR5/giTrFCN+0gpUPThWb/ylz3ces+TdPB+aHy8nvvQPcT8Jet4C5Q\n3yum96HdUscTcHyc23Wa350nc+4OL4ybtJoW3oMa8t05xLu3EDcePnp6/J0O0aMNuvEGM4UmDc/B\ny5Rw0w3auaO0hvLUS3H8/s9cy5xd+orgBPuEnc6v6MM+I/0zBjNIid1I/zjdGmolOcLyUlSbQZ/w\n5pFJv9JzEj5kPe5kTvNnkV9g2jzKZ+13yI3coh3r7w7xJJxFKH4PjCtQnWQXxCjbD68tKf5dk/ak\nw+jXb/CFb8xQmRbc/abL0t+1EBOPp692PijjFbs4lkux08KWIG3ojEaZ/qVXmb78U3w8/zINsy92\nqtXmYVQYb1dz8HvYI9LrltNhent6veQc4MKWj7TywYytPfUrheO0nl3PBbq9c+rJp24JehXXjSJT\nrL0lCEtI+ixGh/jIegGr3WB48RbujEmjvvYK5NSh9EmvyOw+WNA3DelKmvccmvcc8pkmqfE5mIDQ\nD0BcefL57lQLd6pFG8VfYjYMR2lGjvGJf5nrsS9TCQ3REX2hFF1JyKSn1d8D7BHp+1O3tE2bpVeI\n7ACa9kL0RDbaTDPF6it8jCcr1GzVfF8J2sOve75v8pY2HzrM/mUN8cMKtetrL0kOSrXaRDmmDyLp\n+7H4MXwvcjCRAAAgAElEQVT0+9CpQXVqgy8ajSN/7gzeG8/TOHuWYiNPuxPH9/efI3qPSK89U/pb\nrqVhQ3sznKeFltLqctSa9KvpjqBXInq7JAjLr6X38Pk1nqutDUtimD7C8DANF1N4OIsuhXc6hN5q\nY3oe0Ti4DjgrNH7ob770LKB4Rx2bgRyK4X15HOefvEizOk6lmkV2LNVHb6MQel+/s57OwZ7+aWEE\nK7xWWPU7Y3RRyZXEMttd3k+H4voth9XKDoSC66eVlFSM+KqaTbJBLlwkZxTIjbtk//MRRi+OMzJb\nIDVdYuIeTNwFb/sbqR54uFg0SFDysrRqMZg3oWaofP2NwApKeVmGUujtYKGNAemfFrpVcTT05Iq+\nVoPH9arQbBYrhfVWg3YaDgOjPmLEIZpokE0WyYkCeVEgd8oje3yY0Z8Y5+JVh6Pvl/B9mHowIP1K\ncDGpk6DsZ2nX4zBvqdJcG+WuFUR3TKHiic8u6cP0mlRu54Z2B6HbSGmBjTbrta6o3yURpeer3CnE\n6FWeDa1zLS3yyUoYkdjDHTLZIunwEvmPPiF/4xNyZ31yL1ukG4vIDx5QvjnNwlQdMQG1KaWWG6CH\n7FEYPQfV1yPMDR/hQfM05W5G6e5XK5Spy4rpMl26Td3yvIwdwj6Q4Q7Rq0F8AGAF+/b+jDhDPFkf\nDh6lZ+8YdDhuiI21mtLWwLCEUY/QUIuR5Bzjxh3y732fof/3+2R+Lkv2+AmYq9P6k9sU3pwl0nXo\ndKDcAjlY5R9D7ji88FOw9HqEN0fHuNc4g9ONrL0n107WKLCEyoTdxcl0F5mmc351s0nNiI1kiOwR\ndDUbs2/21SmwYUO9HX0HLRT5RumRXhdV3EapKQTn14KbePBzrU9SPzcnYVgSY4HcrTsMXb3P0egM\nY3KS4Xc+YvjWBEPDFfLHuzQLHaavFmk9aFFAaUkOajhuJ5A5BZnTkPpMhuJrIzw8+zxLoTGaXgzk\nspleh02hVy5bKyKXlxfbBewi6fVSmGf9b+k+gSFUJZuw/fjfDKHegu63AertjPI46RuoumvbTXq9\nUui68mtZEwI1x2ZQOeCjHukHD7n4/T9l/OrbRM0mcZqMTBUZ7TocuVblSN2h1PYpTbSoohJSmvRa\nvw0AIy/BxX8MpedHuTr2WT6If5aZ7tjKyTT9ZbJLrN1Caxewyyu9jiPp2PxG+tXtAgyhmkIun3FN\nQ3WVeSwVFrAhNVxl5PQcobzDfHeUgjvU6+emzyNQM/taM7nL6p2JdPrB8n26rkW/koNQ65z6K+dk\nJIyAOexg5TsML85xias8V3mbxgK0l/o6T8+18Rbbqt+ir6xOXSR2gB4MC+woGIaB27RxpYlheYRD\nbbxIGDduqBJAMdErZeezfmxToCxJb7uq6jyJPRTn5OjZpnsMO+gPtzz7TZej7kdQG+3k+Qf83Of/\nguyxEn9Z+Hl+WHxjWaEE1vbeazRQS+lKpNcapuWfksHqfk9dGCPa99xghQ9nWyRSVY5dqPLCN7pc\nHIe734GJN1UrRBeoSpj1FMmrg2V9VSxcBa8NyTPzvHTqHbJn2zQvxlk4NkLdS1I3dFqdAWWx8SY0\npqEsSyMI3XW220zcM9Lrnke7WNlWsHJCgwhCbhF7BdLzZNOGwFmXO13k5U99wNHTU9x/eJpbkxdp\nVaK0KhE810R6BtIUioTrOXV088TlSKLCapsR8GhjSk80Asj5kPOxUx3i8Tr5ZJuxMYvjx2KU5x2W\nPnFwmlBqQHHV1kwD9EMLeM6fLHLhUpFkzefqkYtkLzyPj6BtB7aTYSJNE18KZF087h9aCToErEN3\nO4ADsLHeJliBeGYlWaxtrmyC671zf2Zk4KybSJ3km+IfcbZ9h+ONaf5V+//k3dFXuPLcK1TLGZqF\nBF7VWr8tku5FuFIziRE2T3rdbWUNVI0Ut8wLWMM1Yl+b5NXUDJNvw+TfgTuw4zeFYgWu3YVG3qX9\nuTo5UeyVGxcGxA062QjNkRhOLKRKby3trcz88JBetxbaTC26ldTBw8AoPEyPM2Ec5YXWx/xG8//g\nG+0/5fdGf5Wpl0fxpg06d6N4wuqlUK4GXcR0pdVVk34zOUgb+D5VRJqb1nNYww6f+VqH51+dwfdg\n5scD0m8WhQoUq9DKubTLdfKigAjLILKiPoxqK0m3buCYJtyHvfZjPVuk10KZ1Vbz9SrW6DZOy9s0\n9wtvkurvUggkBr5lQALMIR8R98GQiJhUhRM9X20fomtcNywh5hOOtMnYZeJWgzYRdYTV4XctaArV\nQGGjMIGYr46EGleYDmkqDE1OM/L+dYbnrpE4uoidArPAgUyJ3Q+QElJ+haPuh9huk4KRo2DkaQv1\nObq2hR8zWEwf4cbQZSaHTvWaZu4Bni3Sm0GvsPAKb+tRMsMa0C2d+ju/6CQWLbzp94xDzxrQJawE\nimhDnlKySBMia1w3LWHIJ5JpMBabYji6QJkMJbKU2xm6bRO/JMAxN0l6CSkf8t6jqjhhOmSoMDQx\nxZFvXmPkw6skv9DFfAGMBbZWmG4AANKywgveh4w7dyjYivT6cwxbHVJGlXupczTzSUX6JQ4D6XXA\nWHvtt2jiCMBcpUa8bgm12Q4x2sReXlmmH1pHFAw7bxQ4GbrHq+YVjtZnEAuSSLZDUtaoh6o4SZuO\n7IBt4Dcsum4Ix3vSTrdSXUL5NhlvlqHbHzJWvU3i/Djp8yeZC49BGBp+kq4bwdOTmS+gLaAjVK+4\nsARj2f7ARk0+IUnI6hCyuox3JnitcoWT9z4kdn+K8t06EzGo1mDxoSomOcDW4JZc6j+uUbSb1M0W\njlkhRJIcScLHDaLnIWq1sELu+toK6FVOjlhKh+/52+Zg3WVxTgoYo1ekbQvo97YvX/h0iuumzoea\ng3Sm7waHNWbN8pPRv+ZLxlucXbyLuOUTHWqS84t07RAY0LXDkBJ0O2GqrRRO+0lvXSjeJpWqkHsw\nQf67P2Lk6rtk/9lLdM+1sW0X17QQUlI1BF47eG+ugIIBHVMRO+etHNazJUJIoqE2qWiF52Zu8pN3\nf0Dq7jXuVctMNmHhBoSmgrpx2x8dOjRozKvw5/QVH1c0cUWXFFXS2Miv5qn/syNU0mm6G/XK6u+5\naUDbgVZ/LPjpsAuk12qRBL0SLpu4rFbAadNchzRCT+kM0cPqH9qmTikRSDzTpBROI6KSWKPJCw+v\nczQzRzmVohZJUo8m6DQi+AUTd8mmlM9QGsrgCBsXi3S4wkh0niOdCTJ37xF/+zZy3EaeEjhHO4gx\nl3iswYIYoRWLYeEgHGjLOG0RV4RfifQBBJJUqEouVCRvFsmLAgmqpESXqgv1AjSXnu5WDgDdRpCD\nf0eixBoOyRhkYlB7Psdc+whT6ePUN9Tzm8CiNdT31HHV/w/OSq/b6eZRzNrkSqz36dqc13r4p4UO\nx6VRK/wmTznrHuVvWj/FRPoEL1y4xsWRmyTn6/zsD/6azjmL9vNhpjNHuW2eo1OJcPr9CbKfVLjy\nxU9x5eQrVMwUdRLkzCLj5kNGmSBJDRpd+MEEYq7Oka+XGPmFEguZcSaiJ2mFoySoYfo+s+GjzOWO\nKtM+4q86foEkZ6l0WS8nmHjuGGNzTY5kZkmbZe75MDGIy+8I0kNwYhxuncxxN3aZ6zxPkdxeD2tj\npBdCmMC7wJSU8heFEDngj4Bx4AHwK1LK8sqvNulVZtyEGEeIQJIYqOU22/Zp1fPSqzyr9evrPbe/\nIWSQJ1Qw8hScNBPGcSrHU3RO2Hyu8i7PTdwmkmpgnulyt3ESo12jdSfMq+9+wMn3piFXpvScoJgZ\npZIcJm+VGOcBQ/YsoVQDM+7Svb1A58MFsuk2qYt1MufKxJNVHDNCrlbA7HrcTD6HzIOP8dghg0k1\niC1g4pGlTIoqIuxTTSfIppIcCRdICraxK/wAAMIEK2liJQ3s5yKISxEqp8a5a1/ibuccFW+tfmO7\ng42u9L8BXKen8/ot4HtSyt8RQvxm8P/f2taR2UavIo2xjQnpugnuRlrda2sgSS8xUBewTKtzdQgx\nzyi37AtEznbxbcF4/gEnYhNwr4z4uxs03zO5c2OJxbkupe/cIvugS+aNE4g3TpDIe2QoM5SrMvr5\nLnEHHnwAD9+Hzntlqv/3fSJfanHhjRJxYZL9QREmJfZPOMgvCVS6TIxG8NMJ4o1G0KY5RpMIbQx8\n0rM1Tt+aIH1lmrmFBkUflgar/LbCjBvkfyJG/o0Y8yMXuTl0iWvJT3OnfoFqNUu3vvd1I9YlvRDi\nOPDzwP8C/A/Bn38JeCP4/XeBv2W7Sa/z1rezVzv0WjplNjIGlAtiuO9vUZTTLyB9V4aZZxRpCfwz\ngsaZCK4rGHIW4H4R8Sdlmm/CXf36B7fIfecWae8s2U+dx8opuV8+W+PS57rk09BtwsMPFOk775U5\nWi5y9vwcYwIyf1HAf1fgpwzaX4xQJE+BHAKfrgg9Ir2JR5wGWVWrFYD0bJXT70wg35vmxgLcGnjr\ntx1WwiD/5Rhn/rsc3zE+zbf5z7g/c47i3RFa0/E9rYL7aIwbeM7/CvxPPF6ceVRKOR/8Po9KKN06\ntKimPwxnb7EbzGqIoHYZ25Xj0xVQMlUc3hL4MYMWMUrkmDGOcs86S8uM0BS6TuzjyE2VOfPWfdrv\nhZhdgtliC79SI7YAMzd5zGnj3urQ/ncVlgQs3OjiNwTxGw/5wl/53F2Mc2cxRvjcCTKvncUZVbOZ\niUcssAEidIjQZpR5wnQGGXM7CB+DBjGK5GkQx9sPWaTLsCbphRC/ACxIKd8XQnxlpedIKaUQ4umM\nxEdtn/ri2KslyGwVOqc5zvaUr+oIcA3wTEipvXSLKMWA9AlRR1qSpuiwEumzkxXOvV1nsSqY+gTm\n5iVLnovhQrf1eLty73aX9oxLF1hq+HgheOnGBJdjs9ifGNQ+MYj+7EW84y3kqJ5/e3v6DBXSVBhl\ngTDdAel3ED4GTWIUyNEkhr8PezGut9J/AfglIcTPo2iTEkL8PjAvhDgipZwTQowBC6uf4q9R3rIM\n8BXgWO+hR40dzcfrzm0ntPAmxabi8I9BlwLQMl0TtRK7QuWj6oaMmKoq6t0uxRtlzB9WcRZWrphQ\nWXSZ+NilXIPGBHTLSqa/EjotSamlbPEKKsV6YbJDkg7VCRBTMFycItsOI7xFakaSllAOCwNJliI5\nSvi1Cg8mXcozUHtyHhpgG+C3fFof1ij90Rzpi7f41HMWMTpcI0prrZ52q0GL0cK2anDprdbv7ofA\nWxs65ZoUkFL+a+BfAwgh3gD+RynlfyWE+B3g14F/E/z85upn+TrwEvAcvfQjfXVDKY5CK+Sybxf6\nhTfb0RpqA2qq7tUK1T98gH11Bm9u5WybuSWoN1UItr4OAdtAIfjdAaQD92dUa+Z6CxwHxmSB5902\nprvAhHWSJXMoGLokR5E8ReqlBlO3XSr31r/mAFuDrLu03lzCuVlj9L9s8NzRaeJ4TDPOAke2dlKd\natsRa4h0vhwcGr+96uk2u+7pq/028MdCiH9JELJb/SU6PtYnSnjU2NF6ci+/HRAocur67nE29061\n5DaOGnacXsKNHqopIQRGzCNkd4L9c3CYLeKhNiHbwTf8R/0K+9f8RksdG4EurvMIHlTq6tCQCy38\nD1pETIehMZNYvo20AUsGyrAqzVadQsGjvEpwdYCnh3R83Mkm7mST3GmP1IkK8cx5rHZT5Ta0UM68\n1cy6lWAIMEwlx92GLe+GqSClfBN4M/i9CHxty1e1+2Lv2+2dh16oTTcL3OwltIc/x+M57f33Oywh\n42NmuyQitWA1LZCjwNhLHuPRJKE3G3S+VaNe9iizs6XRCrfg2h/D6O0Wx748w8mXi/hp8JMQEl1C\nskvR62LJgdZ2t1B5r41b9Zm7WKN92VXfwwq9Crh7hL3JsjODGPx2r/C6wK42LDYSllvp9XpLMBL8\n1Fl0pnxEfDPmYmfapFMljjLDudo90kaJjFnmZLrCiUsGTNpUkgYeO9/2qTatDm+xy5FwkXQYrGNg\njaF8Dh5Eq2AMOL+zMAVm2sZI25SdKLPXo0xbSVrHLGUp1lDE30M8W6m1Nj0xzVYqcUVRBO8nvG7+\nmPAh6T/KZovFaoyk5zln3OZLM2/zeuk9wok2kWSb+LUKifcrFN5rUp10WGLlIqk7geoi3Pgh1BZh\n/GU4+QKqAF4DjBsg9kGc+FmGkbCIvDFE7KsjzDjPc73zPFPmp6iFxva0PXU/dp/0YtnP7TxvCCWa\nWUtau9JYNGLAEIgRVR9epEBKocqYJzzEiKdWeyAernE0Mc2lxid8fvEdfvLWD5A5icyD8xZ0/gRK\nk1D1ek643UBtSR1LtyFag5MSRAFYAnETNQEMsGMw4iaxL+TI/qtTVBtf4aP6z1O4MwIfm6q176Ei\nvaDX5HGnhDcJNt4dS5vx/U0ej0s47RM90iCXLWJHHUrdHBUvRSTbIJpoIkwVn0taVWzTwYuY1E7E\nmRVZytdblN9s43ws8SpQ8KG2RzLXdgvu3wK3C/EGJJqwuADdQZB+R2FJlyF/iTMOvFsrYC1JqBib\nK4Cyw9jdIhq2BTH78VTZ7YAW3iTYuNNupfp34z5c8oiN1TianCBmNfEakmo7RjTZIJssYRgB6alh\niy5uxKR6IsFcPMuDN+HBf+zglSSyoxo97tUWutOCezdh6j6M+jDiQ9FTVZUH2DmYeAx7S5x3SgzX\nC1iLEsrmnje46MfOk14AlgW2reKNKzWV2Coi9Jo36o5Zq1W+WY4wivD9uvosEJeEykUyH31Irj1L\n90wDMe6TCNdJmHXCokMYFaJLUCfVrpKarZG410A8dGgWJe5ubeDXgO9DtwNORzXZ8VC6wH303Xum\nELNgKApDUYm44XLn37ksxTzcGOrm76PEpp0nvWGo1lARe3sJD08Kb/SePrXWiwKEUYTvJ31Q9NK+\nUyD1zXcZXbgBvyqJPh/GMlws4ZGkSpoKYdpYuOTrBYavFxj+hxLxex7C20efLuq7VqdXWn+w0O8M\n4jZcyMCxONz5AN79ECY+D93P7/XInsTurPRm0N55u86nhTdZlJddr+xRntynL4eJmiCCTjXKMpAQ\nklhZByvaJhZtE0l5pGstMtW7XHhg0M3aODmL1EKF3FSBcKiDOAbZToXhQoHodAe7CmIfVpR1GKzw\nOw0poetD3Q9xP3ycdyLHeSjO0m0F2V37KKPx4IXs+oU3R1D5faG+x9bLoLNRZNf93AUQ9yHrE063\nSKYrJJ8DO3qa+Fyds9UFTn7/LpVPJSmnkiSuVch+q0g428H4OkSHugz5A4nbYUfdgdtluG0l+PvX\nvsw/fOUXKXYu0Gknn5Rj7jF213tvBsdWTHyBGq3ei+eDI8Pamvrl14zSq4kXnNeMuZi5LpFEk3is\nQTQF5tERwnNHGP/Lh7xy5SrTZpqpaIbIj+ukvlchPNzFOArGGXDmoFWFZmdfbd0G2EU07BDlVIry\n2GmuXf4st77088ibNlw3lSDHQ5F/H1iCu0t6XRdzK6TXjRm18CYW/Fxv16AbVOjn6Ynj0bAkUbtF\nLF4lEmlh9kvWAimdPyMp/XWL+z+ScLtLeNHDbID4JogMGLPgz8JcYcfajw2wz9EezbPwtc8w8/nP\nURy6DAs21AxVrryDamBZZ1+0/90d0utVXjeMMPr+vtoEEDwmRCB9jUsYFsjMBmcMfW59zUfvVAbl\n91RVOdPwSITrZGJFzJCLQGJKF0s6WF0XWfXpzkgK820m5tp0+vdmExu/BQM8m5Cm6rXQPjHK7M98\ngfu/+HXKd4eR9yxFcg9F+jL7Rhi186TvLzkVZ1nSSvC3lUJsMfWYne4QzTYQYWg5cTrOBtQ3Jko2\nG/d7WXbBRGNbDtFQi5RV4RgzHBGztHMh2maIEF2itBjvPORT9Y84NXODxuwi78zDZA32mWN+gH2A\n7rlRWp87x9JnXqFw6gLlRpa2s4vdmLeA3SF9GuVlX76yaw/8Sv3bc8AQhE52SJ0uIUyJ98CkM7cB\n0ockDPsw7PXaUgXXtUJtEvESRyPTfJorvMhVHhineGCeIkKLLCUudW/xWuF9hmbu8P6sy0dz4MqB\n6T7Ak+ieG6XyK5+l8NnPUvTOU2pkkF17Xzt3dnelb6MyT1IosqeDww4ec4GsD1lJONchlOtwNn+H\nl1LvMyQK1EdSlO0cd42z3DXOoJls4xCmQ4oqwywStZospnIUUllONKc50ZyiHMowGTsOEclYZIaT\n9gTnuM1xpkj6NU66k0Q6HRLtOqkHs9TfW6RypcPifWjvo3DLAPsEl/LIy8N03rhI5dw45egoraUk\n/mJIdR8qotRQ+3Ch2D3Sj6AyT9qoVfwCvWY3DuomIeGIhPMe4XSDdLLM86GP+Lrx51zyP8HLWSyl\nhvhP1i9QtuLIwGZPUCdNhXEe8iIfMSwW+Mh6kWvW83yl+RZv1N/iTvIMb4a+RD0a47R5n3EecoQ5\nhljipD9J1G0RrjmEih6Fax1ufbfF9DvQHETjBlgB8lOjyH/xIp3nL1MZOk7FSdMtR2HeVMXjFnms\nlNp+wi4o8lBmfLTvamEU4XXd/xa9sFpUQtbHTDqEEx0yosQJZ5Lz8jaEYTEyzI/tV4nYrUdFB6M0\nSFIhzyLHmeAoMywwzJQ8xnGmueTewPcF18yLWFaKPAXyFEhSI0KbrCyS94uEHA+rDe0ytKehMLnj\nd2eAg4p8FHkhh38yi0MMpxzC61rQEj2Ldp9i/5XqHGCAAXYUO7/S635+es8OSqRQpSe40aIFiZop\nywLPt+nKMBU7w7RxjJSs4nUtlrwhFqwjdKwofrCnb+FRx6HAENOcoCvCLFijVM0U0xzlpnWBB8Y4\nBT9P3YtRNHIkRY0QXRLUKYssHSNM2HYJRTwa6S6Roy1yx7o0q9De6bI3Axw8FNuIOyUMu4ydb2IL\nBzPkKks1AkSCSsn70B+086R3UeWBFlAmj0Tt32/RS4555MgTMCega9HJxinnLK4PvYidd/kH8Tka\nxRSlco67xjmWjFG0I69GlyLDFBhlitPEzAaL6TxLyRxt4lxLXKZkZ5jsHAchKUcyFOw8F7mBiUfV\nSFOxUkSSXRJ2ndTlOUY79xnOL3DnR6rbzAAD9EN8MA+uT/gnBOmfyVA7lqeSTkPX41HIqMrO10nb\nAnaH9FUU6XX4rBwcaZRXvz9kN2/APHTyMTpDMW53nmMplMMwJcXFYWqzqxe+m9K/hCSMeOC53Ben\newq8FkS9FgWRp0QWC5cYTR6Yp7lvnSJqtcjGi1yybvH5ZI2hbJnKosfcRx6eVMVIBxgAgOtLiOtL\nhJsRUmePkx46QiSaxxh2kJ6FdA21yu/D8mS7R/pFetVtdKy+g6obtlIN9hqwAN2ZMNWbWURY0u2G\nN5YbagolgZy3ell3gQzXNSPUQllmLYP3MZkVJ2jnwrRyIUJmlxIZ/LCFnXMZPxojcXSKz4zOMVWH\nyfqA+AM8jtCdedJ/9A6d+12Kr5nUT2dohpK0xFabLOw8ds+8l6iwXb8qr8Pq9b8DQY1jhHGMECIG\nckhsrMKtAIShjmEek+E6wsQlTEOkmeMYluGRZolMegnLVDLcRjiBEzJpHg3zmbEul47MIeZhpjHI\nRx/gcYTuzGE/XMK7VyM/dIzKC+eRtkVrRcXZ/sDuOPIkii11eib+hl+u2C/DKF+ATrjRR38DipWg\n91Q64cYWyIjACwVtqAyJ2Ukimz4R2SZst3ENC0eEcG0bkTIIjwlyF8KcTIThtkPo4w5mzEM8DyLb\nS7iZL6rDH1gDhwbC9RFul+jEPEe++zay7iPzX6CUzyEbhqolEUYtVhbKr7XHxTF3L8tOl3DZapaR\nrkkfQaXU6vTa9ZpZNFHWRH9qbZ5Hen+JoNWN0m2YJI0Klun2zmcBSTCOCrKvRzn1mQzRv6iTXHAJ\nD3kYv6xSa80fg3sFPrgJS+UB6Q8jInMFxv7i74hen6H0yynu//LrUAratYWFEqSFUI0uDhXpn+jP\ntAXoCIAOhVg8WUSjfzvl8WTYRGc7hdTzvZaFVzRo+w4NXFoN8CYX6MzOM2GkEa++RPmlJOVLKRKL\nFdyZoIjGpyE63CU/XSZ9p0Yssv2VvQc4GIg7HY6VF2Hao339R9RGj1Bqn6cUOoubiKqFp8v6qeC7\ngINXOUe3i+n3BWjSR1Ca/rV8KA7Kx9BBmVwhoKFKFHfcGL4wqN0B588f0Ji+y9WfusjVr34BJ2fT\ntSxSlyvkUkG5rOOQbVV4wbjByf0Ymxlg15AIauQNJRqIj36IuPOAay/+FzRfHsGNRFW0ap9gd/b0\nnq/c3oZ4+u60EkXYDorcgl4L6gRqpd/IbKq3BSGUIAiBK2zcuKDZDNMuG1QaEeaTZ1g6/XlM08My\nXJJjVdJjFSK0MfEYW5xnNLfE8NFpnAcech/2jbJRt0cXxhzsPrYfhlDFnlNGhzPdu/jdu9T9V7gb\n7dCQ7IsVXmMXSO9DxwO/q5pWhqzts4F1FlMSFfPvombUjbRh1rH7/hTIKDAKzok81V9+Fbt9lImz\nrzLTOE88XCcRqVMTCQrkidEiQZ1Q3GXp+RyL4SyN2QbynTr7Ka9S1xFJo25Lmc01TB1gY9A18oo2\nJL8Ir30RbschpPvX7SPsPOl9wHfBdVSDC8vYvmYXLXp7/DC9jL2NnFqv9P38TAJNQXcsR/nkp3Ds\n80w1zjJVPUE2WSRrlzAM5SBIUGdYLJKKVqmcTFGLx/H/vks0I/CQyG6v2cVerKzCUK0GbAuyUjW8\nKHjQcKG7f+akZwZNFx7WoJAQfPqSyYVfNRieNrEmUbPtPnL27OKeXoLjQlOqb2LIfHpTX6ONCud1\nUcvaRgqXaNFQv5PPMsCEZinFTPYkoWiXajeH9CxabhwpwAgaWEpLkAmVMbseydk6Y9MlIiNtjvxj\nifMxeB9BoQLTPlT2gGSRKJw8AydO9dpaGQuwOAeNjVhCA2wJLiZL5hC37DyLyTzuiICWB8VNxqp3\nELA3NE8AACAASURBVLvrve964HiKlPY23gS9x++i3tFGSK8dgv11y1wBHZNWMcnMcAKSKqQnDWgR\np2WHH+3NrLCLY4aw2h6pyQZHbpcYHQb5DYkThc4k3KtBVe4d6U9fUGamKIBYgsYNCG10+zPAluAK\ni0VjCNc+x1Iy//+392ZBkmTXeeZ33T32LSNyz6ysrL2qu6qrUb0BDaIbBNgUWjARhAiJy4gymIzz\nJlEaPowRnHnh40hmspHMZDNmMyOT0ajFQFGcJkEjRwQBkgLEJtAbeqnu2rrWrKzcYsvYw5c7D9dv\nemRW5J5ZucVv5pYVUR4eN9z9+D33nP/8B0cIKHsQWksQ8sniyUfv5Yq/O3nMNioy7xGo5a73uc5x\n1IEFkJ5AekIdzycByarvmQj1gVoixbQ3RkLUGBgs4JomkVSLaLJJ4guLJOJlvPfqpN9rkptyqPNk\nhFBTAzByBsYuwPCzIPxW1bKqGjJwB1+wpIfdgFdzabxZhP/zLqn2X3GptcCU+SyzkStU+0b3RRT/\n4KXs1oJOxzVR9NvN6hM2/WPoALxEEXmiQE1AMwjB1tMpHooQrUwEb9RgdmKQPrNExiwxkXvA5JV7\nyD+bJ7Pg4kw5zPNkjD49COdfgTOvQGgcnDGWuArePMgfPIFBHGHImkPjr+ZpvV+iz3vIFflD4s/8\nHWqvjiqjX68ZyxPA3hi966n2qdJUNMWdWtt7BHX5FQKyznqsvaVx+VuV4MwI/7NhoY7jD9WtWbih\nOCWR4+HAOGbaIUeefgrImTLGpx6hezatqrfUR243kRqD7CkYuhLGeilJ5akobga8lCRMmzA2jUwb\nz9onHRcOKaQjcfNt3HybvtM2Y6fr1E4tcj1jB92Z0qjl6B5p4O+N0dsueFJpSkctMHY4iemhjL6F\noj+G2JxGkE79OQTLME3k0a/bAoomrhemlkiR7+tf+rj1oYX8doXI+xXcKQeH3U+T9Z+HC78Aiedj\nlEdHmesfQIZAhCRpyqRZpGpWcMTiExhNDwCZ56KM/f0UM9kkkZalllW6nLzA/jZ6IUQf8P8AF1Hz\n6D8CbgLfBiaBu8AvSim7rFg8lPXVUNYX8mdk12+C4afvdoK4s/IrWwTNLnVn243O+DoVGPc33RU3\njDprjlJG8UImLTtCnThRmkRpUrdj1BpR2s0Qrut2nVcTMUjGVEKj2oD2Gr3OLAKSoQ1IA5JxdYxq\nHWoNEEMxrCsJnOcGyVvjzJuqHa9A0k+MNmG8mEcuV8PMqM80e7a/4xAhA3M4gjkcxfvcKNVXx2i4\nE7ifxtXSUzdZ3UzjC0+qgg5Xu7Hbw0Zn+n8N/ImU8u8JISzUsP9X4LtSyn8hhPhN4Fv+tgI2atp8\nhOLIZgl8ZA+ajprxI34ab6dRYzmBZytrKukfxyVwz9Z4eIQvZ0iFJzH/SlL/0xnaVxcf22ekH84e\nh3IVbt5XhTqrIUpQUVwCvDCcGIPTx9Rnbz6AvOjnI+s0whqmYqRo+AENofIPAGSydS6eLVAqq8/M\nLGz6TPSwDkTSJPbqAPGvjjD71NN8kHqa66XLlDZUE74KbBdaTuAhbxPrGr0QIgO8IqX8JoCU0gHK\nQoivAV/0d/sd4C/pavQOytfOE9QY+nAluI56ipk+cWfpi9kZAk+TwI2KotZVBptz92XHcUyCrjym\nVGfQP5aBi4VD4kyY3OkcUMR+J0/76uOHzAyanLhkMb8omAbKEQ/LdTFcl3YD7A7XLxIV9CUMTMCr\nebhhGJ4IceJKiPmYAa7BQnac2ehFPHMYUMZuIDFw8TBwsMimFjl53KL8CGbzMLOJU9DDxmDETGJX\n0mR/ZZTrxgXe5SWmSpNUtlpfLwHHhaa9IwYPG5vpTwLzQoh/BzwLvAP8T8CwlHLW32cW1TR6a/Ck\nepJ1tpAJWxDaQQJPA/XcabFxAs9aiEjVOivrQtRDIInTIEuBMW+a0+6nNJxp6rLRVTGpONHHrc8P\n0IyHMV6B0UKdocU88bkS996H++/7KTbAPBcm+kqcNND33+t4s4La+Qn++rUJbj0bZ2Y+TunsBLXh\n09j+Q9XEJU6dOHVqJMiTo48K57i9zR/ew1ow8IhTJ0eBBDWMfRg03YjRW8BzwD+RUr4lhPhXrJjR\npZRSCLH1x5A2+s46Y4k/8+8ga6+JimGF2L7Rh6Uy+H4XYhKBR8y/2GPeNKed2xTdAtOy+2kpTvRx\n6wsnCJ1MYEoYrBZ5arpN/7USdgvuf8DS8s06Fyb6K2kGgMyCg1cVvHNhknd/9gWVL5A58qKfvOin\n6f+wMG1yFMhSWDqDE8zQ3g85o0MMbfT95IlTx9yHcrgbMfopYEpK+Zb/+veB3wJmhBAjUsoZIcQo\nSvqyC76LWggngS8DX9/YyBwXGraa7XdyxteReZf1CTx6ZQJBQK+J0vWLADkIizbDYo4zzk0u3/+Q\nyw8+YrL/LrHRBsUTGeQvDBOfNBm9Pkt6psKd85PcOX+CwqsTiL4JEoZLlhLtsgtvhUn8AGZuABIi\nV/qIXOmj9cowN8fHmMYi+9U8XJJc/cwlbhrnqBGnToIaCRxCvtIQOFjUSCARRGkSo0F5JMWdlyZI\nt12GZ0pYD2vMebDQ4+LvGNyaR+GHdQwLhgff5WsDTa4mr/BO8gXuj0/SrMd36cH7A+CHG9pzXaP3\njfqBEOKclPIG8Bpw1d++Cfxz/+8b3Y/ws8Cov41taFAA2B64/jrGEDuX1tNxxRZKfWcto3dR/Pw6\nKs0SRS0TNFOvDRFaDDHLOfs6n7n9IZ/74dtEL9WwMi04NYQcvUDsmQhn/shl4r0Wpa+c552f/2mK\n2WHK6UH6KXKCO7QLJfJvhjD/EFp15dpHnusj/T+epHj6JA/TJ3GIkvtqHrPtcj11npuc9RtuG7iY\nSx1/ADwMaiRoEiVLkQgtSqNpbmePM9mwGXmnzYhRw5M9o99JOFVJ/r/VKf+kyVMX3uWnL3zC+At5\nSp/NUEql8R6Zu2T0r/ibxv+26p4bjd7/OvAfhBBh4FNUys4Efk8I8Wv4KbvuH9U6wEVU5H6DkH4e\n33aV0ev1vhCK0GNtJhLXAU3gaaJmcQO/OQGPryS02o9HwK7xP9/v5Tkeus1p7ybPTH3EhfI1Qg2b\nm8dO0x6waETDPEyOcTNzlpaM4r0wwK1EiXefvsLt4c+waKap2ClqXgpheTTtEqlykkTFQp7Lwdks\npS+cpXD2HHN9k9x3Jml4UZKJKmbM5VFznNnpUYhKFV9Y5XQIVLDRsDxk2yC1WCNarVBr2zTkvu6+\ndCAhXYlddLGLLg421BfpG7jL6ec/ppTMcMu0qJLe0zFuyOillO8DL3b5r9fW/7SWw3VQcribnFZc\nT0UudSTfEBALbd3ol47LcgJPmE0JHYxaj/hy7Ht8Vv4Nx28+JHezxAdnL/Hmq5+l0JelnM6waKao\niiTNdJS3r7yIMxGiMJClWO/DFiEcLNqRMDImaFPgOCkSyTC8OoH85ad5NH6OR8mzzDpjzDWGadgx\nLByELWkUkjSLCci5arM6z2vw9BLCU11XTDCLkuM3HpK69ZBbpSZT7ubSxT1sDovz8KAO7vkCp2sf\n00hmyDPMQ47v6bieACNPT6taGbOC8o3DbChv5snlqQrDn+nNLp/dDMlHE3jabI3A4+e/w26b/kaR\nkdocf5N4iY9OXOSRNULe7afdioAN7VaExUSGqpVUH+3Iycu4gURgRI6TPnWS5Ofy2C8/hf3yZR7K\nk9zxTpGvDrC4mKHViqoP2UDRhIIJwlXbyispgJBEhD0WTRthQsHJUZRZXJmk7Dk0rTbJNGSTUClD\ndbEn6rlVhBKQHIFov8ARFo6wAIsSFsYQjEQfUWKK5EYfsxKfkON7vDu4BHuCNFwPtUB+hKpiyRKI\n220CUqoS3W45S8tQJJ/NrP87iTdpArrtOnjkjPH9xs9QjmWIDv4hwyzQGFB98vJ2P4VmP+1KBEom\nbt2i7YTBeXxc7XSURfqIpI+T/1svEflslsq5SSriODPtMRaag9TKSZyFCNT9z3sCWv6DrWaAG1T/\nLSEE9LnIkKDZjuF5Jtdi5/j+mS9yfCZJPP0TjsfvMnQBMqfhxkdq83osvS0hOQynvwKjLxtUzDhV\nM4lDCpskkQmT1GibTL1MZKNSuPo+bzkqqL2DVv9kRTSoE5B0triu0WQFp0sqREf5u830wqf7dnMC\ndDpP6+0tfYaAzOMSpPtMyHv95NsZ2m6Yz6XeRpqCZirCokhRaadZrGRoL0RVv/LK6q6D04zgSItS\n3yjz559FxEYpkqVU6aPYyFJqZnFKYTWz17scpynUthJhCSEJUUnLjdJyItyLT2IN2FROOVycnOd4\neYHjn2kxesmmVIFbn6w6zB7WgZW1SL8UZeAbCUQoh2PlKJKlSJaIbOHJRVqVKK5tKk9tvUye9ONZ\nzTX42Vsd644fcS/heo+TfDQsU9F8uy0LNDSBR58VX/eeFGplIlGZx05ylU7rFVGxAYkyzgVTGfyc\nWFsjrSygYNCKJpkJHaNiZWkQUyz+SBQvHIK2CfYmU5augEW/n1rKg5SkRYQyfcwfP8bM1y+S+5zH\n8Ph9htIP8d5jX4k3HjSURYb3zQt8HDpD3uinQG7pOjqOhdcymC+PcH9hUrV420Mhk8Nl9N1IPhrR\n0JIc1qropOzCcpXdGgGP30/zCQBHQgXkgoBjgATZEJA3Yc5Q7IU1l3HKnWiSYIbE8v8a9LctrIJU\noNKAqgHCgYQy+hIZFiaOMTtRZ8CDqt3AKT3EG2Rz1OQelqEsMnxqPkveeoU8/eQJqi4XnTSFRj+N\nckLdF3tc83C4jH4tuJ4i+7RXWRaEzMdd/246ev6/J4fu8Zz3Y85EbzEVP8a/if4T3p59jtkfj1Mr\npXHzpkparOed6QLEbmtp7bBsphdiGPVQWiMVnJaLnHdvcD7/AbW353jnLZj6Ebi99fymkcvA2CDU\nzlr8OJsiL/vJt/sp2P2qrVVd0CpHcUpRuGtCee+frEfH6B23u9svBMR9L2BlgY8m51RXvAdMHr/H\n1+UbjEen+HbiH/Cd6NdpzMao34jhOmbQqni9aLgW9VytpbFgczO97tC7htFnPGX05xY+4Or3bG78\nJ2jXwN3jdksHEbk0XDoFi2csPuhLkpf9FNr95Gs5mLdg3kQuGHjzBswItZzbY+yR0Wsuq42vkrn7\nXykJKlhW/oftgmE/bvRasrszDlAF5qF4N8fV95/hYf4Y1xcuMFMYCVoX6a+xCSS4VkNtjX00eWjl\nVeokFK1Ey/+c9k4EqpdayMCWEWoiSaEU4dENm7736uTfg9qMOlQSiAm1NYGiRDVq6OExZE9D/zlI\nn8wxfWKUqTPPMpU5QbGWo1ZKqpl9zoBZA0p+XKfJ+gE8T6rGMKtNUjuAPTL6Guoub6EWrXvcy7vt\nqlzoSpiGigV0Gn0DcODejUnecL9BKNdmtj2ilgJpf+tsxV1k9Vkc1E2w2kOhTncd/xAqaNjN6LU4\nqPZOBIABUtDyYriGwdTNNFffCGP/AGqzQUOMAWBAwKCpDP6a1zP61TB8GZ7+RVg4PcyH6c/yk9iL\nXA+dpVTJ4hTCMO8HceeFumc2GoR3PWjZfoOYA2/0uh+VbkTnd4/cD1VInlRKPt3eN1ekAB0BtmBx\nPsOim2Ep9mYSFBfrYGHV37YaqbXpfrN0qvjof+shatKRhkDNNELgEsI1DOYrw3zsPkM9sUjsbIP4\n2Tqph0W8hwWMoTDWRBSr5SHuNzAK9pJYUNsfTu85ANL1YyDCw0i6GHGJY1s061EloFoz1HWvEdRr\n+BPG2gcmmOl3CU+YnFNF/eo+2I6SyJOC5xMkVtb5RyxfI48gHdd5JrVjsFvieJpCbBOcytWyEpoe\n4QJSZQoW4ye49qWvkX/5GUaj04zKKcR33oM/fBf76TT1nx+lkW/TeOMRVqFEBuUJFFFkwp7Rw+yH\nKg7S99Isl1/5G1KnXabCE1zl0uM7N1EnTi/l9hhPeKbXfahCKD9YM150D999lijWBIlls61PA15K\n7wl/3S2C4Rsdf012PhXmoU5jE3UFowSNO7vFibReoE9Qqg0OUTvfT3HgEu30bRC3sOdsWlfnqD6f\nZfErx+FRldbtJrFii/6WTa7t4DSgrBnVRxylO2o7XSlxJlZCijgD44+I99WxRRS707RsAq8Pglbr\nenvC53OPo/dNVNJS941O7u1wNgLHVQanXX5TqNnfMNVF9QgML4Yi8nRbe+8ENIVYEpCI1or06/ip\nP+O3vRhz7ijtpEXhOUl/bJjcGUm23yITWSD9Dei/GGFsao7hBwUqN+DhDdZ3UY8QClPw0fegvNjE\nev0RJ8dvMx8eZU6sUbOtPbUKQRPWJ4g9NvpWxxbhYBi933ZbQ6f6LDMg8GhoIc7V0mc7kb2pE9w4\nEZbHRFceX59qW7VYsokybwyRD2UpXh6g8FNPkzMK9JNnou8+mTGX7Esuwx80GHu3wP0GiFs7MOZD\nhOK02hr1FqHnZjkRv4MdijEvRpGr0b71Srer7MzuT/tHJ0+/W9DrftlWNN9QxxJFR++7BfLiqCDg\nTq1odL5fu5BawDPeZV/dCQhAGEgZomEnKCLVgyMMiXsPKf54jtmP7+NNLzL1EKbudI939gAWDkkq\nZI0i0VQNhh1VILWwwbWd4/lLyd1L1QVj7WF70NRfxwXCy0k+LVZvna2VeHbS6DuDhrobTzejb+MH\nGZWbL6VBgwRNK4yHAAuSdy1KfzDHzPfvseC4GA7Y7V2/Hw8slNFXcc0isVRdhfcXhFr+bcSlc3zd\nCNtdhU+yk2PdE+jFZQK18NV8V32XdrtT9zGk9PPt7vKKN9N3+7tV/dVQZ7+zuEcH5LYCrQikIViu\nDBQjuPd0IEn37bMFnmuAZ+J6Fo60CA1YZJ+P0N8IU/24Te3T1ad43Sg4RBCqPcjInVEdg9oVWLiu\nuAzrQeTrmD+8R9hKEj81SubkeZrRBG0Rx9vQk10+rh2xS9gjo9esEx21t1EPgQZB58m9pytuClKq\n/nyOFww9ZCp6W7f6/pXEmxiKcLNT8mm6+q+Jki/Q0f0NIjYZYvQbKSZOZZj694vUPl099xhChS9S\nqLDsQQ/wD16ES78C5QcqLbcRo2emhviTTzFvNon/D6fIXXqOckTgGNENGv2Twx4ZveNvmpyjGSUe\nG6cu7UN0I/loNt/KRp36FCx9ltXFhCw2LeeFJGDTRAmUgVb7jpaAqsGAlefp6FUuR29werhE7phH\nMbW2CYeSkBuHgRy0piA/tese6o5DWILYhEVsIoT1UykqL6SpjArshzZSNBFTizATRGmt8RjWRIyY\n5RBvNQhJGxku00oIwlxlsDHKVfsyH0ulUgwEGWpN1tkj9Nb0uwmt7+d6qlFneI3TrYNr3YJ+KdYm\n4KwFrVJmo6bjPh73JiSKQeYIznCbn4v9MZf5gJHyHM5cmWh97QdxaBByfwvGPgOFP0aJIx2wtJ4Z\nFeR+Ks7I11MUz5zmrwfP04hbuL9YQZ6cgTduIDqMPnKlj8TPjzGSqDFRmCbt2rgZcPrqNPrfoTk9\nw38u/xL33NPUdFZKKzFrbcY9wj4zei0/qwk8FgfOze+Envml9HX9vEDHbyVc1qbrdubfBerUbPQh\noFN1BkGAzyI43U1UGq8pSCerHHfuM9m8T/pBncrdFuGyGnbMVM+ulqtaEBI3CGdN4s+YhF4JY/yU\nhTnvEr7hYs/beEUbaatAg4Wq+7GAltw7YlokBrGYorU36io4CUDIIHw+SeL1Ye4kzvIhz9FKR+gb\nLRHLPEBMScTDDvflxeOYXzlBODXL2GyJfqdBpT9BNRYnMStxZ+ZIVyuYbofn56CucWdrQ08Gys9P\nyD3aZ0avdfQ0VTfDnhfj7AR0hN/zAhrvZqDTcZ2U3zRsuj1ak6C1Vxp1aiuo0+33I5kyjvED6wu0\nFyM8+9FHRN6ehhlFOJxIwak0TNXgdhnMUyEGfiZB8vMZ5p4ZYiaVofpqnXSuTv37czT+fB53QU1p\ncQHHDcgKuO+pbS9WAEOjcOo8NBtw+xrM+w39PAzyMofNKR4wwTyD1IlTpI/QUA5eH0OcemnpOOFL\naSKZDFgfcrLvLsJz+Ch+kWvmeebdURaaI3xgX6Yi17lItqtiQbb3RIJ4sC+MXoedBUFj+QpBJF9z\nSw/4jN92VLGOECu6865C4OiEnqk19Po+0X33VU+Xpg47BPVOevbxj/fIGOFt60VitRbHb0wz+tE0\nZkEVG44l4ZkBIGTw0DEwz8Xp/3oO64tjfMopHjFK9uUiuZeLeC1o/7iI5xt9zBAciwqOWYJay+N+\nU2KYYFi+pqdEXX4J0ns8GbERGAIMP16hU4tGCIQJnqO2/lGD8y8ZVIqS+TmP+RnVE0hiUKCfOXmG\n+3KCOYaoyqQaVxbVqvWLHV/mn+O02+SFzNu4CD6ynua/OV/kunuR6/WLyLYIQla6y/RKu3Z8cZcn\nZPCw50avp7A2io3Xmaqrofpian7pIejBJvGVezqiOJahovxrafethKZxdrtPwqiHwVrUX93ay0ad\n9g4iZJpFjnOfscQ08ck68YtwZgASCyDr8NYcTJ8bov7VMeovjjM7cYwmIxTIUSVJjgI5CqQpkeX2\nEu28NRJh7uUczmSc0psFeLPA2HkYvwhRB5gHbwHceWiU4JEHM5u0g8EsHBsG24GpOWiYMPYSDD4N\n02/Bwx/DbG6Q9y6M0ZprU/rRQ0KUSAKWtLjWnuCT6kvMy1Hy9NNuRqHWoTzciYSEhMet8Bl+YH2B\n4+YD4kadK957LFZzXJ+7qBh3sx1bkT1dy2vsAxquVpowedzodV5rLS7rAYKU6o7sLJuMWP56fxPH\n0UbfTXsvSZDzXw1t1A2oT/syo68wwX3GktPEjteJN+D0EIzMwHufwDv3oPGzg9j/8DJzF57ibvQM\nCwzhYmAg6SdPjgLnucsEoaVCw9ZQlNnXR6l8vp9ySyL/psjoecnzPwfpJnAd3OvKISpW1E+c2ST7\nbzALz56DehNqDZAROPEluPB1EAbM/gRm+wdZOP8MMlnFS1V91UCISotie4J3ai9Slyk8DGTZVOo3\n3dSMB10YdPg0c4aQZXPRvMpl8QFX3Pe4Xr2ImJfIWbHc6HVtxh5jj41es0S079MJr+PvAcv/rIWV\nCj6Op6JinnxcpWctrHbztFiuzSdQHIAoQapOu5ltVAhFVwOaUBrKcNs9hRs3uTF2noRoQAWMyRaR\nwU84PfExd670cXP0FPdjZ5iyj1No5wAw8aiRoEAO9/QizV8wIF+mDMgTEYqX+kiMRqh/IUOjPs78\nC4s8uljBay2S7lvEibSYm4Ppu1DewiU3HYjUgf4oyS+lqY4nKT4f5vpIhFufz3Cnlqb14iRy6CRW\nqEr09RDh8TPM2Gna1jC3Jl+gVsxg5yPqgVg1lKZdN4lxTwAGNVLMh4f4NNSi0Y4RrbW4V5xcbvAl\nlqvmSBnUcNjuDt/eDdYTcNgHa/ojDscDz0/rxUKbc/O7QbvuOugnCMg5j303yug72DTz40N86Fzm\nWvwCzbEYdjoMDiTtRf7++f/A31u4yeKZPn6YOsFd5wRzjSGqdsr/KkmRLCYu5acTTJ84ieU2VQgh\n5tA/UCeVaOJ+8STepTYP0g+IZ+7Tdu4zOd6mSYtb78Etd4usPp/oaZ2Mk/zyOKHnRnmYS3MrnuHa\n5ye5duEEdjqJHIgRz1Tp+8YQ8mdcpuuTPGoeZ9EbwinEoGSoVWcTFYfp5nFIAdKkHYqymMlwOxzi\nWvMCzUqMUqF/udGvFM+QKJdGr+V3NGpfZ9UG0j4OgNHrVaFgqRrkMEGnawTQ9nn7pti68XssJ34I\n1Eqpk9yjyT4WQeOFMmBA9WGKhwMTuH0Gi16apohCCJJmlfO525yJznIj+iIPFk+zIIapNVK07MfX\nEjJqUs9msSI2hCXRUIOWmSdjlmEEGIFZLFK4WNOLePcf0b4DM2Ul1bUVVJrwIA9G26I9EoezWYoM\nMcMwD/rPMd13DtvPBkVFk0p6EC9i8rAxzmxtRGnaLZjqoaljHqthUQVg26bqUFQJp1ksp6nPJOC2\nEazhazzOWdDX3NkpX1+rUrVQT/G19NkOhNE3CMid/Rw6o9dwO9J6ep2/E9A19zaBex9DRaStjn18\nAk8zEsNzDLwBgZ0MQ1Q9KVoywV87X2DamWDeGWCqOkaVJLYbBu/xgETTTOKaEYyUA1lPVZ5FwTGD\nWy5LkSJZxK0khf9i4b0J5ftb/6nzDXh/ASIFoBW06y5ohdpmDkcqozdrkkJxCFkzqLsJaGlNOzYm\nYNlQ+9iNCIuzWXAk9kJYNTi5JWCGgGS665Ao1y7PRjS59onR6+lJS8F0DksLxbkEM32IfTP0nYKU\nKsDneSr3pAt1NtKMcz2sTPlpBrR+CAiWdEqd6RBOK6SeszmWAoO2GeEm57jJudW/R7cBs8Amgk0E\nWh5IF1taGEhc08Q0XEzD9WddSX3Wo/yWxHtrez+z0lZbdM4hdbuO+2mTxVyYQl8/ZTdDtZXCsUP+\nssZQjScqRiBrVkRNlNpQO9VtVsJffzhYOFjKq9bufJ6gdLkT0i+ocb0dcuklQQ1LBeWerB/93CeW\nozmomiua4fFEsy7K6RSGO4TQaT2vpWb8sLUzht8JfYNrL9AgUPLVrb1qqFkvzsaJQAZBhlUPuSmg\nYOI4EapeCgeTZKRGIlqljxInuYtkhnmaO9bpyblfp/b/TtN4EKH4lacovJKlTgyJgIZQwbm6oUqL\ndWGSLk7qtEWtLLwR+qDOMC+wekBCk7Taq/Ri3DQ0r1fztzfmVuwTo9cRJU2/zXTZRz8Y9D6H1ei1\nLp8bKPIIHtfk3w5Wquwa/hZH3TsNAqONAkOolZXB2kQiTQ2OdxyzLaAtcO0QdTNJ2wphCo9ouEFM\nNBgU87QpUcbeMaN351o0/vsC1UKS8llJ6ZU+ml4M6QqoC9UMtCGCDIbuRbgyUdRA3XJr9SLUDMDC\nGQAAFlRJREFUmRD9kCyutp+/hm85atsR6Nzt2oG7ldgnRt9DV9guNNpB262dWuevhL5p5wjIOvrO\n0M9jD0X6SbK64XsEmn0JlisD2WqG9bwwdTuBBG6HT/Nu+DmiGLRosF4AaqOwjseJvtyPePkEkcuZ\noKBozoSKGbjzmgrS7Bi7blQKjwuTdEOLQPRyNY9Ap+baqzRXfcLoGf1+hu2qGyYqN0/g2Qx0IE83\n6NSNOyEw+jpqxk+wttHr40iWKwM5AsomXsOgTpJGOMqnyVNYIZshamS5Q4yNFK6vD+t4nMTfHcP8\n25OEQxl/XALmLJUh0TO8nsX1bK116zo97/WW3p0yZavtq6m2T0AVZyM4gEav+fkzBCJw+0ukYEeh\n3cKtEHg29T0EGvkFgjonLYsTR93Y3Vx8vU90xXGK/uei/vF8Lpb0DKQ0cKWFTZh01OJ8VhDLwlwd\nitukqsbdJuPNeUL1u9QTfTihMNflJUreAF7TZMmpaBHUt9cJ2jJsxC61RJAuk11zAvdz8Ttm8NpN\n2VonlQNo9LqrpJ56NikJcxCx0wSetaBbMHWu6ftRRr2aCxvz9+lM1+vj2KjLs0axZC4Kl/oh3g/v\neds3+kSrzkR+mv65JnJIYPXZVOnjBk9hN1APNT/ltuTJFNm4wYO6/fIEBUxPFC3Ujyht6cvXNXoh\nxG8Av4Y6HR8C/wg1xX4bmATuAr8opSxt+tsfg0fQDkQLxq28wXWaQpN2dIVJhAP5DNsIVhJ4OmH6\nM/9OxflWpqi0tLbuhNvZQmtpfAR1+hq6is8icH3DIMKSUKhFONLgmDvFM4sfcb5yl5FmnZADx/yf\nWJawuMmJMTUGmRMw8YzLYLpBtNnAcSzK9NHU0ftO9ZoWQeuptSL0LkGZiEaV9XvUuZ7a7J1K0em0\ntm6lvDVVgjWtRAgxDvw68JSUsiWE+Dbwy8BF4LtSyn8hhPhN4Fv+tk1o172FShLnWLs9jJaE6UNN\nNYfU6DVcqZob2h1WGbVU3etORvc74aDWvi0UoSfL40av9+n0NPvwFTNQz/C2es9IeiTCdVLJAs+U\nr/KV0vc48eg2ydkSlOCEDQkTbribN/qBC3D+78L4WchEoESUO+Ikb/MCU4zjdnqEWp5ct1Zc7xws\nslz8os36KXHbVxtxVmmQumnUUTnBKtvR29qIlVhAXAjholZo08BvEVQX/w7wl+yI0UuCou8Y6+cd\nV0rC6L7Oh9T4pQRHF577MEWwzjfEzhu/dr5sAp29kL/pr3J5XAbXQl0SzbvSGoBJEK6HabhY0iHk\n2BgRFznsYZ02yAgTA5O8C3OuJFR1saouzbqk3lRFissgwByMYA5GsF6KYL4axh4XlAoOj5wRpqxj\n3OM4JSeL1zCCceo1/HodhR1/nwrLjX7NcyYVyUpH7LddK9/p2erU9taxpnVIKR8KIf4lcN//pv8q\npfyuEGJYSqlDrbME/Vr3CJqqq6ejA9ApZ6egq7TCpk/f3aUZv7P/aJr1RY3qBO220iiDXwQpDOoD\ncdwqvB16nvZQmJde/BGfzb3JUHmWupmgZsRIenDak6Q/rpG+WuPRXZdbD6C0ImcuTEH0pRzx14cp\nXR7mzdEhwnGTlFGl5iWZiQ8FKckFVHR+To1l3dp2TWXfjCetBVNavjLytid4TbHVHTC3Lxy7nnuf\nBb4GnEA5cP9ZCPGry4YkpRRCrPHT/rLj3yf8bSPwUHeYxfqskKV+TajpRdeR7mLAa7+gs82WpRV3\nN6DGs1noiHydoFxXn+K1VHp0TMBSr722oDkUo1kI82H6GaZS49gXTI6du09UtMiHclTMFCYuw57L\n8H+dZ6jdwKi6PJxVtz4ohyZkQCgiiH+mj/gvTfKg/xw35VnahMhGiiAFj7wR3JaFVzWUO18goKiv\nxEq5Hh1e6qZbsBZsV6XotgXt0WkCzjxrB+0+8Lf1sZ4f/BpwR0qZBxBC/AHwMjAjhBiRUs4IIUZZ\nkxL00xsayOOoo35oko0r57RRV9VmayJyBxi6sabj6/BZuxzhXyAg8qx1aXSgWRtOREDUAA+a2QTF\nrMGt7Hl+2PcqN2LnyYscDWIMsEA/C1TnPeofF5i/b9PqMNSoCcdTMJ4TzKSizBl9zDgj3G6douKl\nidIAR1CoDFBazNEoJJDeGudEezKbJefsGnSWSrsa6y11L/ubxn9cdc/1jP4e8DkhRAx1Cl4Dfozy\nM74J/HP/7xvrHGcL0NOKrg7ZjNHXCYjgRwSOHyl2fSLPbhu9LubSUfrVsNQm238dAqQBNYPmYJLm\nYJKbk+cxkg5xq0qefhwsznCL0/Im9fkCzU/uUJ6Gdoc/GTXhZBqujMCbySi3jQyP7FHuNE4xZw8B\nEpoGcs5CzoagCNJbw/3pJOd4He/tGZdGR0dndnwg663pfyyE+H3gXX8U7wL/F8qafk8I8Wv4Kbsd\nG1Hw7f7fzdIWdUpPt8nSfNAj4OpLlOG3/OBRyNwd4++cCXWqWJNzVtu383L6aUFZVcuQxVCGe9Yp\nQrUWtXgML2LgEKLg5Tj3FLj/wCNTvs8pb47mozqzH4BdDbFwJcPtV7JMPzNOPjJAVSaxZQi3ZSlu\n/aIBs4YqmdVrea3+q6EV13XH4a32i/f8KknbVSm6LaOTeLM7+lrrhrmllL8N/PaKtwuoWX+fQqtC\n1FAEnk6tqEMOz2+w0bnO3y1o170FDLC2Ll83+J1eqjJNy40iai7uAJDxKJDjNidxnhHELkDWCXPO\nqWG/VaddhUe3Q8y8OET7l05wL3WM+cgg1WZSlbm2/aKahQ6D12WvK1NtekLdLDlnJTyfNdnabrRe\ne6t6QDuPA5DbsgnKnDaqnNONwKP5oAfgJ28HWoPPccFe0UrLEMu76m4XOvCl6aha3Ggt49dZ2RJL\nqzanaeHULahIMFWr5lYkiogkeJQ+xt3kBfpoMOA2MaYjtBIlPEvSyoSpjCcpk1FqvO0UbiWkauQb\nvoqtptrqZYY2eN3kQ68it8oC9GRQUONsp820ZgxVCDjCu4MDYAGdHRq2opyjiQxZ1HR0AH7yTkDK\njhbaPiKWEoLf6bSernrWGdOV7LxO6GC03rcz7WerohxaAnIeRDyKZLnNSUKGjScMUlaMivEJnTWs\nDWIUyVJtpnDyYSiZ62e2NGloI+SctdDZYnpbFXSa17v7Pa8OgAXoTo8CFZHfLPQjXrNF4FAq76yE\nXt93urLC196TKMPfyRm/k8DTKXDUjbKrL0nI31fX8Zso19w1IOkhETSIU6CfMhmaREmmwsTPRDGd\nEFmvTfpakb7+MplcmbKoUjEbuIRx2hZew3zcQ3b8cWrCzVareXVbaa19YK9Hz1sNnco3uqZkd3HI\n7/xOaArjESTwaOgSz7Cf1gvtcKGSjoA7BAJIa91hWuylU54qjQoKrkC/l+eS+zFjI7eo/ZyDdznB\nQGGRvt+rY38+jPF5l0SqjjwmEIZHtZShWYg9PmlqYYwa25vhl9pRbXeGr6K8lu1RazeDA2T0fl3m\nUtnWZgNUenrRKUC9TBAEwu+HHLoARErV/0kX6uzkjK/XyAZqba9P71oEHkHgfIVQz2OpJLUNPCxc\ncu0CZ+qfMh57xPTLo1TP95N8o0TqrxYZnFzguPOAejpOIxZF1CUPpUWzFgtmdv23TqBDvxVIqW5F\nx+fVb8rg9T3c+ZkKajJ6ci3aD5DRaz2w7RJvOnP5ECwbMhyZCP+S8q5U9N2dnvEhcKw2QuDR0JlW\ngyU1tCgN+iiSnqsSvuFQNrO8e/45bqTPEX++QTTTJv90lkIkS59X5EvuX3DfuMv30l+hkBlQbbNn\nUelu3WVmq0FxKZW+Xdt35zcdpdfdRTrXFE++7c0BM3qt5rgd4s1Ktoju9pjk6Bi9P+M7LhiR3TN6\nTeDZKLdKBwRdYEy9FaNJliKpuSqRdxxK4RzvDjzPX4x/EV4EXmDpEn7V+VO+5PwF08anXEtf4sP0\ns6pqRBv8LNvLgmnR0np7i6WyesLJrzjok8UBMnoNHf7VxJutKud0nuwKyuCT/jEPQXvsjUCrs3be\nwJYRyG9vFzo9p3uU6qzpOjCERzRcJ5aokPvoKgMf/5CKnOdHE08zO3ySW4kzLJQHlchlI3hQvxN+\nERGRlOtZ7hUnlxfYbGdCXRmw27TBN/0BVFBPwr2VzDqARq9r7uvAIMuF2LYCXcXUIEgJHiGj18Eo\njail1vs7JbutwyhtgnX+OjAMj3ikTjaep//Dq/T/2z+n/Pwof/2rn+XhhSvc9E5TKPerbjT54Nq/\n3fcSnwxcwK1ZVIrZwOC17t12jL7tBJJlm4YuVlhJB9wbHECjlwRpvO1QqDqh5WJqqCWEruwwUXfp\nZqlmBwjeCl637YHhqK411g4Yv47O22zY6AQS03AJWTZyLEXrM8epnDjNdOhZHi1eoFAexC5FVE6/\nHMz0dr6PxYdptWy+bwR2ttmguOtXLuoZ3ZVbjNI3CJhI9S0MZHdwAI1+N6ELfPSNFCHwJo4IHN99\n9TwQITD2MKshBI0XTlIY+zLzrePcsZ9l4cY4zXxUGbwtlge9awKqZsCj17a2WejUpjZyiTofm4Yu\n4t8/Bg8H3ug1y8JDueTbvUFXdoFoowxeu/zdBOIOGTwJnu/urxTgNIyts/m0zlydQHlnJQz1vohJ\nQlabmGjAWJLm2Akq9yYoXhth8UGfcte7tY0qCxUjqxOk5zYjMuN6vivvbmFm1+nkzvtHE26eXDpu\nIzjgRq/LojKoHM9Oz0oOgcBbFqXZd8iNXsP16aVt/wEgCGi8WzkFnadSX66VCAFpMPo9EvE6OQqE\naWPgLbWhXiqe6SbD2iaIH2hN+43m43VnIa14s+m1u42KWHZK+2jJ3f2FA270mt0BgWTrVog7q8El\n0Ba3WJ4p0ISeQ5rm0zOevmmFCBprLmU7fSrvRh4COgTTJjiVGm3ABiEkRsYlNNgmFLYJNRwkBk1i\ntBcjeAuG0lXJs1yvTgfptJ02eFzIciV0YZJet+t0XNPZYHRenxu9bx31pCls4LN7iwNu9BqdRTlp\nlt9ROwEd4ZcEd3gMNWV14YweSvgPAdkOToFlKnLPZnT49XO003P2l7tWxibeVyE+Xqdip7n56VNL\nu1TuZ2g+igWlvB3DWuLRex3HW69mxfWWt5mSbDIdV0MZuY7G22xXsPJJ4RAZfRN1pXUZ7U5CG32n\n69aHWu8fEaPXRtGZ3tNCnJsxep1x7TyV2ugnbJJ9i8TGahQ+HaJweyjY5x5Kh3llg0ht9OtJyK2E\nFhvZcjNJ3fxvq3zevcMhMfq9QAsVme3s96w5p0dp3e90V4oJGYrptxFev0/gcT4JUTUytH4So9mI\nL7cn3QK6TdB0UmM94o3mymvlYAjkxTYErcvQmQrYHzn3raBn9FtGC7Wk0LOchVICX6vD4yGDDvZ1\nQzzsd9/ZwLnwhYydSojq7QwiIfGyhoqdLn0XQXBct2TXWKli+xj8pUmjvTxAt2FXXlPAO+mz22H7\n7C0OmdE7BBTd1UTbdgor7zRND9aS3aCWGjEOLcNPB8O6wXZV4G8tco8W8PQEeCAdgdswA4Jkt1r3\nJo+3k1qSAV9lLHpp4soNGrr+Erfj9XZrcfcPDpnR62lAq+w8SVKNhwoXd/qdaRS555Aa/VrQRrbW\nRB8Nde/Dp5+f3ZbLesbX0AbdtNdOs3mb6SengwQ6GqgphYcDh8zo3Y5N18zrbbddbomaCTpnAy0a\n53W8Xk8z+pCgk+SzGrT7b3QJBG5YMcrPr7e32vvd4/HulBXUGn53Zav2CofM6DV0owBNqtHdFJ80\n9LpfJ4xNFMHnCDD7NgKdItvOqdCyYFuuwegWJNiT/tNPDIfU6LWESwM1q2b2aBwrZ34tDRPn8Ttd\nk32OgIKPhruZCPp24dBd1F63fs4/9onDikNq9PsVet3v8rjR64fTEdTu23VockCZxyPuDk9CjHI/\n4YgYvXb/9tql7sZM0Uii3P7EKp/d67EfBKzm4uvzPsN+5MI/aRxyo9fyrFoOK8n+jaRrKaVuwaM4\nwUOhh9Whm0WsjLR30qh7OORGDyr90inWtl+NXhNAutWM6uBfz+jXhu503M1dX5fBc2RwBIxeX+w6\nyqhsFGFmvxmQlkfu5n7WUF7AWgUdumvEYb2kmjCzVlRd8yQOT059N3BY75AuaBI0uxhg/xn9WtBj\nX6uwJYu6nIf1kjZYfRbX0OL2PayFw3qHdIEu6DZQs6LBwXGZ9djXgm7btZWbvpM0tFsBQy2ds1Wj\n1ISZg1G+up9xhIxeo41y8zVx5yAY/UagZ8KtXFJBoAS8W0avz/tayhZrYTsPjB46cQSNXs+aNiqo\np9tXmxzstNhKItBmoL2eGLtHDtLKMisL4nt40jiCRq+hqbq622KaI8WGWwad0vLYvQffwVGWOew4\n4kav14kGihSzWqfFww7NZ6ju9UB6eAI4pKqOm0WVQGK1t27s4XDjCRj93d3/im1Bi6zNEggdfrCn\nI9o8Dtp44eCN+aCNd3X0jB5Qa1kXFWwqAG9xsFRSDuINedDGfNDGuzqO8Jq+Gzpbo2hl3R56OFzo\nGf0yuCu2Hno4fBBySxJDGzy4EL2yph562CNIKbumonbV6HvooYf9h17Krocejhh6Rt9DD0cMu2b0\nQojXhRDXhBA3hRC/uVvfsx0IISaEEH8hhLgqhPhICPFP/fdzQojvCiFuCCH+TAjRrbHynkEIYQoh\n3hNCfMd/vd/H2yeE+H0hxCdCiI+FEJ89AGP+Df+e+FAI8R+FEJH9PuaNYleMXghhAv8GeB14GvgV\nIcRTa39qT2ADvyGlvAh8DvjH/ji/BXxXSnkO+J7/ej/hnwEfE+g/7ffx/mvgT6SUTwGXgWvs4zEL\nIcaBXweel1I+gyrK+GX28Zg3BSnljm/Ay8D/1/H6W8C3duO7dnjcbwCvoW7KYf+9EeDaXo+tY4zH\ngD8HvgR8x39vP483A9zu8v5+HvM4cJ9AmeQ7wM/u5zFvZtst934ceNDxesp/b99CCHECuAL8CHVh\nZ/3/mkV1ptwv+N+B/5nlgm/7ebwngXkhxL8TQrwrhPi/hRAJ9vGYpZQPgX+JMvxpoCSl/C77eMyb\nwW4Z/YHKAwohksB/Af6ZlHKZPrVUj/V98XuEEH8HmJNSvscq5YD7abw+LOA54P+QUj6HKnRY5hbv\ntzELIbLA14ATwBiQFEL8auc++23Mm8FuGf1DYKLj9QRqtt93EEKEUAb/u1LKN/y3Z4UQI/7/jwJz\nezW+Ffg88DUhxB3gPwFfFkL8Lvt3vKCu+5SU8i3/9e+jHgIz+3jMrwF3pJR5KaUD/AFqybqfx7xh\n7JbRvw2cFUKcEEKEgV8C/miXvmvLEEII4N8CH0sp/1XHf/0R8E3/399ErfX3HFLK/0VKOSGlPIkK\nLH1fSvkP2afjBZBSzgAPhBDn/LdeA66i1sn7cszAPeBzQoiYf4+8hgqc7ucxbxy7GAz528B14Bbw\nW3sdvFhljF9ArY1/Arznb6+jhOb/HLgB/BnQt9dj7TL2LwJ/5P97X48XeBZVuvg+atbMHIAx/zbw\nCfAh8DsobbV9PeaNbj0abg89HDH0GHk99HDE0DP6Hno4YugZfQ89HDH0jL6HHo4YekbfQw9HDD2j\n76GHI4ae0ffQwxFDz+h76OGI4f8HzrgGscyB4qAAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10677d860>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(mandel_py(100,100))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10 loops, best of 3: 179 ms per loop\n"
]
}
],
"source": [
"%timeit mandel_py(100,100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Task**: optimize the code above using NumPy tricks only (vectorization).\n",
"\n",
"**Hint**: use smart indexing"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def mandel_np(w,h,maxit=20):\n",
" # prepare initial points\n",
" x, y = get_grid(w,h)\n",
" c = x+y*1j\n",
" # where to store output\n",
" output = np.zeros_like(c, dtype=int) + maxit\n",
" z = np.zeros_like(c)\n",
" for k in range(maxit):\n",
" z = z**2 + c\n",
" mask = z*z.conjugate() <= 4.0\n",
" output[mask] = k\n",
" return output.T"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 2.81 ms per loop\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/olivier/anaconda/envs/python3/lib/python3.4/site-packages/ipykernel/__main__.py:10: RuntimeWarning: overflow encountered in multiply\n",
"/Users/olivier/anaconda/envs/python3/lib/python3.4/site-packages/ipykernel/__main__.py:10: RuntimeWarning: invalid value encountered in multiply\n",
"/Users/olivier/anaconda/envs/python3/lib/python3.4/site-packages/ipykernel/__main__.py:9: RuntimeWarning: overflow encountered in square\n",
"/Users/olivier/anaconda/envs/python3/lib/python3.4/site-packages/ipykernel/__main__.py:9: RuntimeWarning: invalid value encountered in square\n"
]
}
],
"source": [
"%timeit mandel_np(100, 100) # make sure it is faster"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"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.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment