{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pystencils as ps\n",
    "import pystencils.plot as psplot\n",
    "import numpy as np\n",
    "import sympy as sp\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import timeit\n",
    "%load_ext Cython"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Demo: Benchmark numpy, Cython, pystencils\n",
    "\n",
    "In this notebook we compare and benchmark different ways of implementing a simple stencil kernel in Python.\n",
    "Our simple example computes the average of the four neighbors in 2D and stores it in a second array. To prevent out-of-bounds accesses, we skip the cells at the border and compute values only in the range `[1:-1, 1:-1]`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Implementations\n",
    "\n",
    "The first implementation is a pure Python implementation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def avg_pure_python(src, dst):       \n",
    "    for x in range(1, src.shape[0] - 1):\n",
    "        for y in range(1, src.shape[1] - 1):\n",
    "            dst[x, y] = (src[x + 1, y] + src[x - 1, y] +\n",
    "                         src[x, y + 1] + src[x, y - 1]) / 4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Obviously, this will be a rather slow version, since the loops are written directly in Python. \n",
    "\n",
    "Next, we use *numpy* functions to delegate the looping to numpy. The first version uses the `roll` function to shift the array by one element in each direction. This version has to allocate a new array for each accessed neighbor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def avg_numpy_roll(src, dst):\n",
    "    neighbors = [np.roll(src, axis=a, shift=s) for a in (0, 1) for s in (-1, 1)]\n",
    "    np.divide(sum(neighbors), 4, out=dst)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using views, we can get rid of the additional copies:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def avg_numpy_slice(src, dst):\n",
    "    dst[1:-1, 1:-1] = src[2:, 1:-1] + src[:-2, 1:-1] + \\\n",
    "                      src[1:-1, 2:] + src[1:-1, :-2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To further optimize the kernel we switch to Cython, to get a compiled C version."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%cython\n",
    "import cython\n",
    "\n",
    "@cython.boundscheck(False)\n",
    "@cython.wraparound(False)\n",
    "def avg_cython(object[double, ndim=2] src, object[double, ndim=2] dst):\n",
    "    cdef int xs, ys, x, y\n",
    "    xs, ys = src.shape\n",
    "    for x in range(1, xs - 1):\n",
    "        for y in range(1, ys - 1):\n",
    "            dst[x, y] = (src[x + 1, y] + src[x - 1, y] +\n",
    "                         src[x, y + 1] + src[x, y - 1]) / 4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If available, we also try the numba just-in-time compiler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    from numba import jit\n",
    "\n",
    "    @jit(nopython=True)\n",
    "    def avg_numba(src, dst):\n",
    "        dst[1:-1, 1:-1] = src[2:, 1:-1] + src[:-2, 1:-1] + \\\n",
    "                          src[1:-1, 2:] + src[1:-1, :-2]\n",
    "except ImportError:\n",
    "    pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And finally we also create a *pystencils* version of the same stencil code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "src, dst = ps.fields(\"src, dst: [2D]\")\n",
    "\n",
    "update = ps.Assignment(dst[0,0], \n",
    "                       (src[1, 0] + src[-1, 0] + src[0, 1] + src[0, -1]) / 4)\n",
    "avg_pystencils = ps.create_kernel(update).compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "all_implementations = {\n",
    "    'pure Python': avg_pure_python,\n",
    "    'numpy roll': avg_numpy_roll,\n",
    "    'numpy slice': avg_numpy_slice,\n",
    "    'pystencils': avg_pystencils,\n",
    "}\n",
    "if 'avg_cython' in globals():\n",
    "    all_implementations['Cython'] = avg_cython\n",
    "if 'avg_numba' in globals():\n",
    "    all_implementations['numba'] = avg_numba"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Benchmark functions\n",
    "\n",
    "We implement a short function to get in- and output arrays of a given shape and to measure the runtime."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_arrays(shape):\n",
    "    in_arr = np.random.rand(*shape)\n",
    "    out_arr = np.empty_like(in_arr)\n",
    "    return in_arr, out_arr\n",
    "\n",
    "def do_benchmark(func, shape):\n",
    "    in_arr, out_arr = get_arrays(shape)\n",
    "    func(src=in_arr, dst=out_arr) # warmup\n",
    "    timer = timeit.Timer('f(src=src, dst=dst)', globals={'f': func, 'src': in_arr, 'dst': out_arr})\n",
    "    calls, time_taken = timer.autorange()\n",
    "    return time_taken / calls"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzgAAAKpCAYAAABwwYnQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAAyF9JREFUeJzs3QWYVHXUx/FDIw3SjZQSgoGIChIqICiKgYooZaCoGKBYCAYoNmLSNmInBgYGAoIoooSkIEh3s+/z+7/vnffu7MzsbLGzd7+f55lnmbpz793lzv/cc/7n5klKSkoyAAAAAAiAvNm9AgAAAACQWQhwAAAAAAQGAQ4AAACAwCDAAQAAABAYBDgAAAAAAoMABwAAAEBgEOAAAAAACIz82b0CQGY4dOiQrVmzxooXL2558uRhpwIAACQYXX5z+/btVrlyZcubN+vyLAQ4CAQFN9WqVcvu1QAAAEAqVq1aZVWrVrWsQoCDQFDmxvsPU6JEiexeHQAAAITZtm2bOyHtjduyCgEOAsErS1NwQ4ADAACQuLJ6OgFNBgAAAAAEBgEOAAAAgMAgwAEAAAAQGAQ4AAAAAAKDAAcAAABAYNBFDYHSaMhUy1uoSHavBgAAQI6wfEQnCxoyOAAAAAACgwAHAAAAQGAQ4AAAAAAIDAIcAAAAAIFBgAMAAAAgMAhwAAAAAAQGAQ4AAACAwCDASYf9+/fbAw88YKtXr7bs8u+//9pTTz1lQbRnzx4bPny47d27N7tXBQAAADlMrrjQ56OPPuoGzVKsWDGrW7eudejQwfLly5fqe5OSkuzBBx+0Hj16WI0aNdxjGnjfc889dsYZZ1iVKlUsOwwcONBq164d8bkvv/zSZsyYYeedd541atQo2XPz5s2zn376ye2PY445xs4880zLmzdlnPvtt9/anDlz3PZpOQULFoy5Ptu2bbM333zT1q1bZ7fffrsVKFAg3dtWuHBhmz17tvu93XXXXeleDgAAAHKfXJHBUbblu+++c4P6ZcuW2bXXXmvHH3+8bd++PdX3Hjx40AUzel+i+PPPP+3tt9+2m266KcVzixcvtp49e7p1/vXXX5M9d8cdd9gpp5xiM2fOtOXLl9tVV11lp512mu3evTv0mp07d1rHjh3tsssus6VLl9qnn37qXrNv376o63PffffZ0UcfbZMmTXKfmxmZl9tuu80eeeQR27FjR4aXBQAAgNwj0zM4r776qlWuXNkqVKhg33//vQsQunbt6u57xowZ4zILJ598cuixd99912UJOnXqlGI5ykiUKVPGLr/8cvecBuefffaZG3QrUNEAPDVnn322DRgwwP1bGYY6derYs88+a+XKlbNatWpZmzZtkr3+mWeeccvWNsjLL7/s/l22bNnQesg333xjv/32m5UvX95tZ3imQxmTr7/+2mVJlC1R1sRf6vbwww9br169XGASazl+zz//vAtCtE/8tD8uueQSt0z/OooChZEjR9oLL7xgffv2dY/dcsstLiulfXn++eeHAgsFUFqXI4880j22YMGCmPu2RYsW7n36PXn7Kxa95scff7Sbb745lOn5+++/7fXXX3frVrFiRbdM7Ws9pkAMAAAAyJYMzvjx4+3666+3c845xw2SNUBt0KCBGzT7g4fwgbDKmxTkhC9Hg31lEryswIQJE6xp06auzEqD4u7du7sAIS0UONWsWdMFFQqWNND2++uvv+yGG26wokWLhj5XwYMyQP7shDJBKl9TdkeZi7Zt27qSNo/mkSiIU5Aza9Yst97PPfdc6Hmv1E1BXazlhFNA0qpVqxSPDxo0yBo2bGjdunVL8Vz+/Pld6Zd++h+T4sWLh8rMxo0b54IVL7gR/f5iBVzt27d3pX/x0jqOGjXK7r333lCgd+mll7qMk4Ibz+mnn+4ySAAAAEC2zsFZtWqVCx40WNVAvXPnzi5r8sEHH6RpOZs3b7aFCxdaiRIl3P2VK1e6oGL69OnWrFkz95gCgnr16tnUqVPdQDse69evtxUrVrgshwIkBReab6KMjYwdO9ZOOOEEa9KkiRuMayDep08fa926tXveK5tS8KJsiigoqF69ugu8VAam4GvIkCEucPOyIxqwK4uk+/6BfKzlhFOgtWjRIrfNfh999JHbv+FlaR4FN8qKaZ00v0UByRdffBGaSyRz5851y2/ZsqVNmTLF7W/N81EA5g+MMqp06dIuI6aMln5n+t2tWbPGBW5+2kZl+yJRcOgPNhWcAQAAAFkS4Cig8QbwefLkcWVHKp06dOhQxAnt0Whg7QU38v7777uB+ldffeXKoUQBVMmSJd2k+lgBjgbzCkx0e+utt9zk+X79+rnBtgb4ylwowDlw4IAbfHvZhVguvPDC0L+1PJW7KQujwESfpxIyL7gRzY258cYb3QR+f5Yl1nLCbdmyxf307xd1c9M+1rwcPa5tiETv1U37QL+XrVu3uiBSr1cAo3/Ldddd59ZdwY1K2jTRXxm3UqVKWWZRsKhg7uKLL3afqyAnvOROv9dNmzZFfL+yY0OHDs209QEAAEAwZEmTgUqVKqUoCVNmQJmTtNAcDD+d5VeAowG6JsPrtmvXLpeF8TI60agMSiVmGjRrjsr8+fNdcCOa4/Haa6+5jMDHH3/sBv6aZJ+a8LIsBQn6HC/oCN8Pel5zisLbS8daTjitf3jGQhkolZRpro8aKjz00EOhgNDLgCxZssQFQU8++aQr81OJ2A8//GATJ050GStRSZ4o0Pvwww/da3/55RfbuHGj62iW2ZQV27Bhgx133HGuLC+cttH7HYUbPHiw+z15N2UNAQAAgCzJ4KxduzbFfU0m9wIWDeDDswwKWlKbx6HMhoKUYcOGpSkTFN5kIFyXLl1c1kJzgDRnSFkXL1uhTEd6KKgL3w/KYP3333/uufQqVKiQy6yoTE3bJMpAKfvhtcL25u8oSPLKuH7//XfX8EFlch4FW/Xr13fleaJOaKISNY9+JwpANC8pM2lfKMA59dRT3edrzlX4XCqVOYa3ufbvB90AAACALM/gKAuiM/MeDV7btWsXuu6MJvirAYFHr1VXrdSce+65LhAaPXp0isxORi66qeDriiuusMcee8w++eQT6927d+g5rbMyG2ltV6zt1Xb5J8lrDoyCD38AkR4qxVPba48aMShz49280i2VvqlRg+jaP6KsjUfr55/PU61aNWvevLmb/+NRhkxNEvzd35QVUoYnI0aMGOGCJpXVab+rdE/zlvy0jbpeEQAAAJCtGRy1Otb8EWVGNDjW/Bh/1zQNujVw1SR/lXEpIPLPKYlGrZ3VhUzv1xwcdfdShzVNrE9rA4NwKt/SQFvBl4KT8PkimpOjyfmaWxTegjkSBQ2au6Ig48orr3QZK10nRgP7jF4cVI0WTjrpJDd3JVoJVzhlQrTf1K1M66/9rUYCapF9zTXXhF6nZgfafgWMyhSpeYGyQ5ov4++Cp45w6pQnmj+jLnFepzxdv0Zd1zTvSr+zcNqPunbOO++84/5WtD1qMKD1UgMJZfi0vH///deVHwIAAADZmsG54IILbPLkyS4joEDmjz/+sGOPPTb0vK45o7kdKn3SIFoBjgbFak7g0WA30rwMzZdR6ZLXmviiiy5yAY5KraIZOHCgy0zEovIslY6pEUB4WZo6oalttB5XyZcG7wpeqlatmux1uvCmOq95NIifNm2a64qmgb4yI/4yuXiXE65x48Yum6V5NJGofE/L1ev8FJioQYOyMZqz88QTT7jfg780UIGLAhX9jtQ+Wtug7mre3B/vd6DPD5/fpGBJn6vyM91XSVwk+nvQNYj8v29lhVRqp6558vjjj9utt94aV+ALAAAAePIkxbrgSjpokHriiSe6TEVOonIoZS6UEVJgluj++ecfN19IwVvQKDjS349aix9xxBFxvUcNCRSEVRsw2fIWKpLl6wgAABAEy0d0Omyf5Y3X1CAqK09iZ0mJWk6iMii1QlZraGUmckJwI8r6BDG4EXXKU+YIAAAAyPYAR6VlGekSdrgpgaVSKpVWxTO3BgAAAEAuKlEDsgMlagAAAGkXxBK1LGkyAAAAAADZgQAHAAAAQGAQ4AAAAAAIDAIcAAAAAIGR69tEI1jmD23PxUEBAAByMTI4AAAAAAKDAAcAAABAYBDgAAAAAAgMAhwAAAAAgUGAAwAAACAwCHAAAAAABAZtohEojYZMtbyFimT3agBArrF8RKfsXgUASIYMDgAAAIDAIMABAAAAEBgEOAAAAAACgwAHAAAAQGAQ4AAAAAAIDAIcAAAAAIFBgJNDzJ8/33bu3Bn1fiQHDhywP/74w3Kaffv22YIFC7J7NQAAAJADEeDkEI0bN7affvop6v1InnjiCbvvvvtSPL5mzRpbt26dJSUlxXz/xo0bXSC1devWuNYx3uWmJn/+/HbxxRfbRx99lKHlAAAAIPchwAmoLVu22P33329DhgwJPTZu3Dg76qij7OSTT7YGDRq4f3/44YcR3797925r3bq1C6SivSY9y41H3rx57e6777bbbrstw8ESAAAAcpeEDXCWL1/usgGyYcOG0L/9/v77b5dl8Pvnn39cJiHSctavX2+rV68OPafBs57ftGlTzM//77//ki1T9NzSpUtTvE+vXbx4carbtHLlSnc/fF30eGYYO3asCzYaNWoUekzrO336dPcZ2hc9evSwCy+80DZv3pzi/TfddJOdfvrpcX1WWpYr2pcLFy5M9tjevXtdtmj79u3u/vnnn+/21eeff57GLQcAAEBulrABTt++fe2aa66x448/3k444QSXFWjXrl2yeScXXHCBjR8/Ptn7dNb/3nvvTbacXr162THHHGPNmjWz2rVrW4cOHezHH3+0o48+2mUpKlWqZNddd12Kz7/66qutYcOGbh1q1qxpnTp1sh07drjn9f5jjz02dN9z+eWX24gRI6Juk5aprEirVq1s6NCh7vHvv//e6tSp47ZTy9S6zpkzJ0P775133rH27dsne+yBBx6wKlWqhLIkXbp0cfNdFBT6vfXWWzZjxgx7+OGH4/qseJfr+ffff912vv/++6HHBgwYYF27dnXvl0KFCrl9pO0AAAAAcnyAI1988YU9//zztmLFCpfd0Fl/3U+rb7/91l599VW3jN9++82+/vpr69y5s02ZMsU9NmvWLHvxxRfdoN5PZVaPPPKIG6hrHRYtWmTDhg1zz51zzjlWrFgxe/PNN0OvVwbjq6++st69e0ddl88++8yee+4597kKzhSwab7Jueee6zJVykg1b97cPaYgIT0OHTrktqlJkyYpnlOGRZmSL7/80gWD2g/+LM+yZcvshhtucPtLQUa8UluunwI57UcFfAp2PvjgA5dxeu2116xo0aKh1ymwVCAZiTI+27ZtS3YDAAAAEjrAUYbmpJNOcv8uV66cnXnmmfbrr7+meTkql9JgWerVq+eyMhdddJHLpIiyCcoQhS9bGSNlbURZnkGDBtlLL70Umgjfs2dPN//EM2HCBKtbt66deuqpUddFgdFpp50Wuv/ee++5sqwHH3zQ8uTJY/ny5bNHH33UBUAKFtJDJXf79++3smXLpnju3XfftW7durntX7Vqld1zzz3uc72ua5deeqndcccdoX0Tr1jLjWTgwIHuM/SePn36uGzWiSeemOw1+p2vXbs24vuHDx9uJUuWDN2qVauWpvUFAABAMCV0gFO5cuVk93V235ujkRYKTvyKFCkS8bHwcjPNYfFTYKTJ+968H2Ug1MlMmSXNoVGAo3K4WGrVqpXs/pIlS9xj+nyPAhOtn55Lj4IFC7qfkTJAKpFT62hli7SummfjzSVSSZoySgrslI3xWkwrg6X5TrHEWm4kKkUbM2aMK8+rWrWq3X777RGzNNGySIMHD3bd3bybgioAAAAgoQOc1ETKECgLkVnUScxv165d7jO9YETzZjSQVxZHZW8qUbviiitiLlMZmvCgLfxzvM/yl2ulRYkSJaxMmTJR58B466EgQdvz6aefuse0HgrU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AEBgEOAAAAAACAyaDCBQ5g9tn6V91QEAAJDYyOAAAAAACAwCHAAAAACBQYADAAAAIDAIcAAAAAAEBgEOAAAAgMAgwAEAAAAQGLSJRqA0GjLV8hYqctg+b/mIToftswAAAJA6MjgAAAAAAoMABwAAAEBgEOAAAAAACAwCHAAAAACBQYADAAAAIDAIcAAAAAAEBgFODvP999/b1q1bo95Pq71799pPP/1kiUTr9OOPP2b3agAAACAHIsBJh4wGFRnRsmVLmzVrVtT7aTVixAh79tlnUzy+ePFit52HDh2Ke1kLFy60OXPm2L59+ywjChYsaDfeeKO99dZbGVoOAAAAch8CnDQ6cOCACyrmzp1r2eHUU0+1UqVKZcqyNmzYYI888ojdc889occ++OADa9WqlTVv3txt565du1JdzurVq+3444+3U045xS688EKrUqWKff755+lerzx58thdd91lt99+e5oCLAAAACBwAY4GxMo8bN++3Q3Of/31V/v333+TvUZZhn/++SfFexW0rFy5MnR/1apV7jH/IP/nn392P3///Xf3OVqWJykpyf766y/77bffbM+ePVHXS8/pNeHrFZ5B0WccPHgwRcalbt26MfdBpPWO5KWXXrITTjjB6tWrF3rsjz/+sPvvv9/GjRtn8erZs6cVK1bM1qxZY0uXLrVrrrnGLr74Ytu0aVPE1+s1M2fOTPbYzp073f7ZvHmzu9+5c2fbtm2bffzxx3GvBwAAABC4AEeDemUe+vfvb9WqVbMePXpYjRo1bPDgwaHXPPfcc3bVVVcle9/69etd1uLPP/90y2jfvr01adLEva569er28MMPu9dp8C8vvvii3XHHHfbYY4+5+wp0jj76aPc+fWbFihVt7NixKdZrwIABdtRRR9mVV15ptWrVsoEDByZbj19++cWOOeYYa9GihV122WUu+PAHA7FK0mKtdyTvvfeenXHGGcke0346/fTTLV4Kpr788kuXbSlUqJB7bNCgQS6Ie+eddyK+Z/fu3e4zXn/99dBj/fr1s+uuu86KFCni7hcoUMC9RusIAAAA5NoAx6OgQHNClAX55ptv7NFHH7Vp06a55zT4VwmVP4vz8ssvu6DkzDPPtFdffdWWLFninp89e7bLtJQoUcK97qOPPnI/R40a5TIOeq2yMp06dXLzRlasWGHz5s2zTz/91G644QaXqfH7+++/bdGiRS7D8sUXX7j1WrBggXtO83o6duzogpi1a9e6df/6669t3bp1cW1zrPUOp8yQgrJjjz3WMsIr1VMmyKPPrF+/ftQyvoYNG9rIkSNdUKP9pUBH821ee+21UJAkTZs2tRkzZkRtRKAMj/8GAAAABDbAUaakbNmy7t+aG6IAZMKECe7+SSedZI0aNbKJEyeGXj9+/HiXVcmbN6+bZyPeZHllEzQYj0aZCmUsNMhXRzLdVK5Wu3Ztmzp1arLX3nLLLa6cSxTIlC5d2ubPn+/uv/322y4L88QTT1j+/PndY8rCnHPOOXFtc1rWW+Vjev2RRx5pGeGVoYUvR/ejlaiJMmynnXaam7OjdVSmSb+T8GVEC+6GDx9uJUuWDN2UrQMAAAACG+AogxB+X3M/PH379nVBjQIRZXs096RXr17uOZWYqTSsatWqLjBSwBFrsK6MjIKF2267zZWc6aYyLQ28CxcunOy15cuXT3ZfJVneXBllX1S+VrRo0XRtc1rW+4gjjnA/w+cKpZWCqEjLURmauqHF8swzz7iSvDp16rhsVzgt01vPcCqlU8bLu6lUDgAAAAhsgLNjx45k91VG5i/Xuvzyy133r++++85NqG/durULLkQZFpWYqcTt0ksvtQ8//NAaN25sW7ZsifhZGoRr2SpZC79FGrhHo8AmI6VWaVlvvbZcuXIZDgw0v0m0L/10X9mnWNQwoUKFCq6kz2ve4Kd1UxYsEpWyaZ/7bwAAAEBgAxx/m2J1MNNE+BNPPDH0mErDunbtaqNHj7Y33njDevfunSI4UrtjBULvvvuu6xCmgXi+fPlc1mL//v2h1ys40vOaL+On7FA8bZY9mlSvLm7KavjFu4xY6x1JmzZt0nVBTXWmU5c3adasmctUqb20R3NvFJxoPlM0Cr6UQdOcpquvvtqtb3hQqlK/du3apXn9AAAAkHv970SPANJ8G83B0bwY/VulWjfddFOy16jZgAb5GqBfcMEFocdV2qUJ/l26dHElZZoAr5+akK9rtGiuiJapQEeZA80l0fwdzSe5++67rUGDBq4cTl3UVIZ18sknx7XOWs4ll1zi5tzce++9bl6J5vCo5Ewlb6mJtd6RqCRPZW260KdXTqb1VlCkbnJekKEMlRoDKCj02kKrAYD2gTIpw4YNcx3lVG6njIyuq3P22We76+lEogYKffr0saFDh7rfj/aXGkGoSYPXntoL9BR8AgAAAJbbAxx1FNOgWd3O1B1NmYrwifDKvFSqVMnOPffcZHM9NEDXhH81D9DFMNW2We/3BviTJk1yXcA0QK9cubL7LGUj1A1MbY0/+eQTN+dHAY5aNosyP7pIZ3gplRoeKCjwvPLKK26QrwyHMk8dOnRI1igg/EKf/vuprXc4tZRWidmbb77pAh15//333TK8ZWsbRRcEVbMGOe6445Jdi0eBibZB269sk5alZgrRjBkzxn22F7Rp36uDmhoPKNukffb8889bt27drGbNmlGXAwAAAITLk6Q6qgBRmVPx4sVd5iG1zIkm9XvXmfGXr+UmasOsDI6CtkSh5gIqH9SFSFVuFw/NXXLd1AZMtryF/vdaOofD8hGdDttnAQAA5GTb/m+8pgZRWTl/OrAZnNSCIF0nRq2J27Ztm2uDG1EQGG8J3eGiznPKggEAAACW25sMRCsFC+/wpXIudRHzXwsHAAAAQM4WuAyO5nOoPXMsmh8zffr0w7ZOAAAAAA6PwGVwAAAAAOReBDgAAAAAAoMABwAAAEBgEOAAAAAACIzANRlA7jZ/aPss7asOAACAxEYGBwAAAEBgEOAAAAAACAwCHAAAAACBQYADAAAAIDAIcAAAAAAEBgEOAAAAgMCgTTQCISkpyf3ctm1bdq8KAAAAIvDGad64LasQ4CAQtm/f7n5Wq1Ytu1cFAAAAqYzbSpYsaVklT1JWh1DAYXDo0CFbs2aNFS9e3PLkyWPNmjWzWbNmpWtZaX1vvK+P53U6s6EgbdWqVbnygqUZ+b3l9HXKis/J6DLT+/6s+j8U72v5f8T/o0T6f8n/o5yJ76NZWbIvFXYouKlcubLlzZt1M2XI4CAQ9J+katWqofv58uVLd4CQ1vfG+/q0LFevy40BTkZ+bzl9nbLiczK6zPS+P6v+D6X1tfw/Shw59f9RZiyP/0c5E99HJbJsX2Zl5sZDkwEE0vXXX3/Y3hvv6zOyTrlFIu6jw7VOWfE5GV1met+fVf+H0rPs3CgR91FO/X+UGcvj/1HOxP+jnL0vKVEDEohKa3RmY+vWrQmXyQByCv4fAfw/Qu5GBgdIIIUKFbIhQ4a4nwD4fwRkF76PkJORwQEAAAAQGGRwAAAAAAQGAQ4AAACAwCDAAQAAABAYBDhADvbVV19Zly5d7Nhjj7Wrrroqu1cHyHGuuOIKK1y4cOg2c+bM7F4lIEc6ePCgnXXWWda8efPsXhWAC30COdVPP/1k559/vj355JPuKsHFixfP7lUCcpx9+/bZBx98YK1atXL36WAIpM+wYcOsY8eONnHiRHYhsh0ZHCAL6Xo269evT/WaHRpkpdWoUaNswIAB1rt3b2vcuLHVrFkzA2sKJKYDBw7Yzz//bH/99VfU12zevNlmzZpla9asSddndO/e3WrVqmU33HCD7d69OwNrCySm7du32w8//GCrV6+O+ho9N3v2bPf/Ka2+/vpry58/v5155pkZXFMgcxDgAFng888/t/POO8/Kly/vsiuRaECmwESvUfalR48etmvXrtDzuh5Oo0aNUtwGDx7snl+yZIkVLVrUnXlWWYA+EwgK/V+47777rHbt2m7QdPfdd0d83UMPPWSVKlWynj17uteq5ExBkUflMv4SNO/2zDPPuOdffvllW7VqlcuIKkB6+OGHD9s2AllNf9v9+vWzevXqWZs2bez1119P8Zr9+/e7IL9OnTru/0/lypWT/T/Yu3dvxP9DXknnhg0bbPz48XbXXXfxC0XCyJ/dKwAE0fPPP+++KJo2bWoTJkyImNnp1KmTdevWzZ0xW7t2rfvyUUbmxRdfdK+55ppr7KKLLkrx3lKlSrmfCor05fLoo4/aihUr7NJLL3VBT+nSpQ/DFgJZa+PGje6nzjr3798/4mumTp1q9957r3355ZfWunVrW7p0qTuh8Pjjj9ugQYPca6ZPn26HDh1K8d4CBQqEfuqmDKg+Z/To0Vm6XcDhtHjxYnci7ZFHHrG6detGfI2e0/8hZUlr1KhhX3zxhbVv3979X2rbtq0r29yyZUvE9+o5fQe98cYbNnnyZEtKSnIBU5MmTWzevHlZvHVAdFzoE8hCDzzwgI0ZM8aWL1+e7PEXXnjBBTMqXytWrFjosZtuusk9Fs98GmV4dAZNGZ2dO3e6M3Tff/+9K7UBgkTZUJW/TJkyJdnjOkHw33//ufIYj8rMNECLVdIWiQZwV199tfv/QxYHQVSxYkW77bbb3M1Pmc+uXbvayJEjQ4+1aNHCPf7KK6/E1VxAQY0sWLDAevXq5SoUChYsmAVbAcSHEjUgGyjzouyOF9yISs1UChDvWS8FQ5ocfdRRR1nVqlVdtofgBrnJ3Llz7YQTTkj22EknnWSLFi1KVu4ZizKiOlFQrVo1y5MnD2U2yFU0B1SZz0j/j/T/Kx758uULlawpqNH/I4IbZDdK1IBsoCxN2bJlkz1Wrlw591NnpONRpkwZN2/gn3/+cXNxKE1DbrNp0yY78sgjkz2m+yqT0UTpIkWKpLqMdevWuZ90T0Nu/T8kkf4fec+lRcOGDWm1joRAgANkA53h8lL6Hm9itM6GpYWyN0BupLkze/bsSfaY1wUt3jPIBDbIzby5aJH+H6UnC0P2BomCEjUgG1SpUiV05tjj3VcHGwCp04To8La3uq/MTfgZaQCR5+UoyI/0/6h69ersMuRYBDhANtB8G8218ZejqSNUyZIl7dhjj+V3AsRB7aM/++yzZNnQ999/39q1a2d58/L1BqRGFQPq4Kn5nB7NBdX/K65pg5yMEjUgC6h2WRfv3LFjh+swozbQ3jwbfaGoY039+vXdtW/UolNtnnU9j4EDB1IyA/wfzTHT/x/9f9L/G3UJVEmNrm3jNdoYN26ca7DRp08fdy2oH3/80bWWBvC/15OaM2eO2xU6EaCOnvp/pDmcDRo0cI8PGzbMWrZsaTfffLNrC62OnsrqRGvPDuQEtIkGsoACGA20wql1pro1iS4qqGt1aDCmttC6bs6tt97qapgBmLuAbXg3NHU9++ijj0L3V65c6do6qy20Sj8V9IR3hAJyq2XLlrkTaeFOPfXUZO3Q9d309NNPu++lY445xu644w7mdyJHI8ABAAAAEBgUKQMAAAAIDAIcAAAAAIFBgAMAAAAgMAhwAAAAAAQGAQ4AAACAwCDAAQAAABAYBDgAAAAAAoMABwCQY6xbt85djDDRbdy40RYuXGg7d+5MiO3LjOUm6r5P1PUCkH240CcAIG5LliyxAwcOuH8XLVrUKleubPny5cuSPbh27Vo7dOiQ+wzPtddeaxs2bLApU6ZYItL6dunSxaZPn24VK1a0559/3lq3bh33+7Nq+zJjueHLiPT7yWo58W8CwOGXPxs+EwCQQ5122mlugFmmTBmXndDA8rrrrrNHH33U8uTJk6mfdffdd9uOHTvsjTfeCD2moKFQoUKWqL755hv76quv3EC8RIkSaX5/Im9f+LpF+v1ktZz4NwHg8CPAAQCkyS233GJ33HGH+/e0adPsrLPOsoYNG1rv3r3dY//8848bcJYrVy70nv/++8/27dtnVatWdff//fdf97NSpUq2fft22717t5UvXz70+vXr19vWrVtt165d9tdff7nHqlevbv369bODBw+GXudfzrZt29yyqlSpkux5rYsCskj27NnjghFlBAoWLBjX9utzVIKm9/gH1iqVmjVrlgtsVDKl5darVy/iMrQNWjetV5EiRUKPx9q+SPvJT59foEABt0ztv71794b2dzRp2X7/ukX7/XjbEmu5/m3SOmsZtWrVcsGyblKqVCkXuPjF+zeR2u8prfsVQM5DgINA0BllDSiKFy+e6WeRAST/v6bBqwaPcuKJJ9rRRx/tshYXXnihe6xnz552zDHH2IMPPhh635AhQ2zp0qX21ltvufsDBgxwQY/K3RYvXuyW16BBA/f8kUceaS+99JJ9/vnn7vPOOecc954XXnjBXnnlFTdoffnll0PL0f99ZZM0aN20aZMdf/zxNmLECPecBtl6rHPnzjZu3LjQ8UED4vvuu8/Gjh3rBtN6jdZ/5MiRdsQRR0T8lWtgfeONN9p7771npUuXdpmEQYMG2c033+yeHzVqlFtvrZ/WWSV83333XYrlvP3223bbbbe5gb/2ZatWreypp55ygcngwYNTbF+s/SQa9Guff/vtt+6xChUquMBG2+jtbwWX+/fvD/3e0rP9/nWL9vs57rjjUl2ut03a9r///tuaNGni9sn48ePtxRdfdK/ZvHmz5c+f3+2Xjh07usfi/ZtI7fcU734FkPmSkpLcSQWdeMibN+taATAHB4GgM8bVqlXL7tUAAABAKlatWpVqhjkjyOAgEJS58f7DpKfuHQAAAFlL2VKdkPbGbVmFAAeB4JWdKLghwAEAAEhcWT2dgOvgAAAAAAgMAhwAAAAAgUGAAwAAACAwCHAAAAAABAYBDgAAAIDAIMABAAAAEBi0iUagNBoy1fIWKpLdqwEAAJAjLB/RyYKGDA4AAACAwCDAAQAAABAYBDgAAAAAAoMABwAAAEBgEOAAAAAACAwCHAAAAACBQYATwYYNG+zAgQOWXZKSkmzjxo2WWx08eNA2bdqU3asBAACAHCjHBzgaCCsg0W337t1pfr/et3///tD9HTt2WLly5Wz27NmWXV588UXr3r17isf37Nnj1je14CC1/RBrOVu3bg3tT++mfRKPeD47HocOHbKTTjrJvvvuuwwvCwAAALlLjg9wjjrqKKtZs6YdffTRduSRR1q1atVs1KhRcb1XWRoFMz/88IMlip07d9rdd99tw4YNCz02b948u/rqq618+fJufSMFHLNmzbJTTjnFihYt6vZDrVq1bPz48cleE89y2rVrZzVq1HD707sNHjw45jrH89lpUaBAAfeZN998c7qXAQAAgNwpTQHOtm3bbNeuXaHgYN++fSles2XLlhRn8bdv355sMO1fzt69e919P2VUlGWI1wMPPBDKNNx7771244032ocffmibN2+OmFFQlkKf75VBeVkLrXu41NZDy4/2Gn+pW7zbM2nSJKtcubLLYHiee+45O+GEE+zZZ5+NmvE455xzrHbt2m6bFSTdcccd1qdPH/vll1/iXo7nnnvuSZbBiRUwxvvZfvo96bXhy9FneX9T3bp1s4ULF9r06dNjrisAAACQ7gCna9eu1rdvX3eWv0yZMlasWDE3kPUHOq1bt7bRo0cne99VV11lAwYMSLYcPXbGGWe4M/49evRwj69evdrOPfdct1w93qhRI5s2bVrc65c3b163XGV1pk6datdcc4316tUrxeC6SpUqLgBq0aKFe+yKK65wmYqOHTuGXvf555+HskKlSpWyF154Idlyfv/9d5e1KFGihBUvXtzatGljS5YsSfY5ypI89NBDMZcTbvLkydapU6dkjz3//PNuW7RfIlGwsG7dOhcUHHHEEZYnT57QditIiHc54UFpPOL9bD+V/ymL9O2334YeU9aqadOmoUBY69iqVSu3PwAAAIAsK1F7/fXX3fwQDWznzp3rAomHH344rYuxN954w/r16+eyN++//74Lks4880xX3qTMiga6gwYNsi5dutiKFSvSNEFf2ZKCBQu6YOy9995Lli148803rVChQnbeeeeFBuD6fGUPfvrpp2Sv+/jjj11G4umnn7b+/fuH1kPrqvWqU6eOy/qoIYACHQVuykT4xVpOpHWfMWOGHXfccWnalwqeLrroInvyySdt/vz5tnz5cpeF0b70B23xUhZMAUjJkiXd73rt2rWZ+tkKgm+99VYX2Op3o0Bn5MiRLnulwNlz4okn2vfffx9xGV7mz38DAAAA0hzgnHbaada7d2/Lly+fNWzY0G6//fa457z4KUtxwQUXuKyLKKPy77//2pAhQ1wAocChc+fOVrduXReAxKLgQQGKBtdaHw3IFWwoYKpUqZK9+uqrodeOGzfODdoV5MSiQbrKrrwMj7IT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e88FOpF8++23VrRo0dD9WrVqWfPmze3PP/+0Ro0aZcp7Pv74Y3vsscfstddes4oVKyZ7TPu0UqVKVqNGDTv++ONt0qRJdvfdd6d7PwAAACB3SdgMzu+//2633nqrzZo1ywUWLVu2tMsuu8xlJjxz5861f/75J9n7/vrrL1u8eHGy5QwcONAWLlxoV111lTVu3Ni6du3qlrdixQoX2CijoVKudevWJXvfbbfd5oIOBUQnnXSSXXjhhfbBBx+450899VT76KOPXCbEo+Dp0UcftYYNG0bdJi3z559/thtvvNGtjyhoGzt2rAvYunfv7gb62uaMUFB28sknJ3tMwU1q/IGK/Pjjj1aqVCmrVq1apr1H82tUQqf5Qfq5du1at+36HSi48ZxyyikuAAUAAAByfAZHTjjhBBszZkxoUKxBuzImZ511VpqWo+Dk+eefd//u0KGDvf766y5r42UxlDFR5kCDaQUYngoVKrhMTb58+axz5862adMmu+eee1wWRwPxs88+28aNG+eCHVFmRNkYf1lYuKOPPtplUjzKKilQWrBggXvOy4BomQrMFJCllcrFlEWqWrWqpYeyJi+++KILPOSbb75x+yuz3qMslfbBsccea0888YQLWo855pgUc24UIGn/R7J37153888DAgAAABI2g+MFJn7Vq1cPDaDTolmzZsnuV65cOdljefLkcaVS4ctu166dC248CoSUhfEG1n379nXzTXbu3OnuK9i56KKLrFixYlHXxQuGPDNnznQBjRfceJkLZUBS65IWjdc8QJP106NNmzY2fPhwGzZsmBUvXtxuuOEGl53KzPco+FJA5GW0FPAo8PHT+kdqhCD6LAVQ3i1WhgkAAAC5R0JncMLnoCgQUUlTZiwnnmWHByoauOs127dvt0KFCrkMjgbXCnJUXqW5QpqPEkt4OZcyD5ECIn1WejuRlSlTxvLnz28bNmxI1/sVLHgBwxlnnOGyVe+8806yuU6Z8R6vZK58+fJWrly5FM9v3LjRZdEiGTx4sN1yyy3J9iNBDgAAABI6g5OaIkWKpDjD759Hk1GatxN+X4FH2bJl3X1ld3r27OkyNxMmTHBNA9R+OS3UAGH58uXJyq0U2Pz7779Wu3btdK231uu4446zefPmWUZpWxXMqeQtM9+jcj/NwdEcKDWAUDleuF9//dU1K4hEyy9RokSyGwAA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hpYDIHt4Z9o//fTTFIPW9KhatarVqFEj4q1QoULuNQpi/HQMUTODV1991dV6a2K76r01N0PHllatWrlSp7T49ttv3c/mzZvb4aTshRxzzDHJHtd8JQVuanygssBw06ZNC61verNWOXn79DdRp04dF3AnctkjgMxHgJOgbr31VvflnZUUQL3xxhvubKZHaX51xzn33HPdxMzXX3/ddbnRF0w0M2bMcGfSXn75Zfv+++/dl83jjz+eoXVTgKcJp2lpPQogMVx55ZWuqYA6XGnOhubh6PigQWZ62hfruKLStfDb6NGj3fwMdee66aabQq/XvIyLLrrIzfvp1q2b6/yljI0CHc3JUOCjsqp77rkn7nXQiR5vsrpKqg4XTaBXsKZJuZdcckmy55TZULZbJX0qxVKnst9//91mz55tDz30kOv2psDukUcesUSV1dvXpEkT95N5OEDukpABjgbTKjdQn3wNnl988UXXScWfSdCXlV4TfnZQZ+a8s0HectasWePO/rzwwguuxEDLUbpaLST1Bamf0T5fX6zPP/+8S3F7XVzEG8yH0wE42oFUZwtVE6zMSKT3+lWsWDF0ZtKj/v/63Jdeesn+/vvvFO/RdqpbjfaXvgBSo+3q0KGDq0n33H777fbLL7+4LxF9jgIcrW+s9H6fPn1cQKT9+Nprr7nlajnR2pOqjv3pp59O9vvUJGTtc22jqGRB9fQKwADkLJo/o/a89evXdxkTHROuuOIKa9Soket6peBDrX8zQsdZDXqbNWtmb775ppv479GxS5/btm1bd0xSJsA/Z0THc3V007yMeDLUouXptfnz54861yezKbt+6aWXuuOvWjOrLXM4NTv46quvXPvkq666ygVf2ieaz6ISLX2H6n4iOhzb5y3T+24BkDskZICzd+9edwZfmQT91Bm3AQMG2FlnnRUaaGvCqJ7Tl46fWk0uWLAg2XLOOOMMu/vuu93Zt2uuucYNxtW5RV1bfvvtN/clqTNB4Z/fuXNnl93QgF+dXDSx1AtydP0G/xlDLyOiA7DOOoVbvXq1y3IooNJZTJ051JnFaMJL1FRmobKPV155xWbOnOm2wWvVKQpEVLeukhCtr57XWdNY9FpNAvbobKcGBupIozp1/4BAddKRaFu0v7VfPToLp7O3Xr16OJ3R1b6///773X3tU33JqSuOAjuP1i3WtRUAJC5N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wCDAAQAAABAYBDgAAAAAAoMAJ4dp1KiRzZgxI+r9tPr666/toosuskSyZ88ea9mypS1btiy7VwUAAAA5DAFOGh08eNAFFbNmzbLs8Mcff9iOHTui3k+LQ4cO2Y033mjdunULPbZv3z577bXXrF27dm47d+/eHdeyXnzxRWvTpo2ddNJJNmjQINu2bZulV+HChd3n33bbbeleBgAAAHKn/Nm9AjlNUlKSCyp27tyZLZ//+++/W61atTJlWR999JFt2rTJzj///NBj5557rpUuXdoFKiNGjHABXWoeeughe/jhh2306NFWvnx5u/32223mzJkuO5QnT550rdtVV11lNWvWtCVLllidOnXStQwAAADkPoHL4CjjoMzDxx9/bH379rWTTz7ZDeDnzZsXes3VV19tw4YNS/Y+DeRVFvXWW2+5+++884516tTJmjdv7pbjlUvpNdKrVy/3OQoIZP/+/fb4449b69at7ZRTTrH+/fvbunXrUqzXZ599Ztdee617zXnnnWezZ89Oth4HDhywJ5980mUwTj31VHvggQdcVsVzySWXuCAnmmjrHcnEiRPdOuTLly/02Lvvvmuvv/66e388tF3Dhw93+/Pyyy+3s846y1599VX79ttv7auvvooaWB1//PG2YsWK0GOTJ0+2Zs2a2b///uvuV6lSxQVZL7/8clzrAQAAAAQywFGgogyLAoHGjRvbY489ZmXKlLHTTz89FHAocBg1alSywEGBh7IObdu2tW+++cZ69OhhF154octKKKhRUCQvvfSS+3nvvffaG2+84ZYv+jwFF8pe6DHNI1Fw5WV6vPW68sor3UD+iSeesIoVK1r79u1ty5YtofXQZz711FMuOHnkkUfcOipwiqckLdZ6R3t9eCBzxBFHpGl/q1RP63P22WeHHmvQoIHLviiDE0nnzp2tUqVKLiDSflm5cqVdc801bt31uKdFixY2bdq0NK0PAAAAcrfAlqgpS3LTTTe5fytboon4yowo26BJ9Xruww8/tAsuuMC9Zvz48S4bc+SRR7qsSpMmTVyWRk488US77LLL3L+PPvpo91NlYsrIyHfffWeffvqpyz6ULFnSPabgpn79+i4I6tOnT2i97r777tD94447ziZMmGA//fSTdezY0Q3mP/jgA5dtUnDmBWPKDsUj1nqH0xwZladVrlzZMmLVqlXupz8w8e57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V9tNN92U3asExKRmBL169XJ/s2eddZY9/fTTlhYEOACynS74pbaRuvhX27Zts3t1gFS98MILduaZZ1rdunXZW0h4OrbOmTPHxo0bZ5988om9//772b1KQExnnHGG+5sdP368TZgwIc1/s5SoAYhq//799u6779rYsWNt3bp19tNPP9kRRxyR7DX79u2zxx57zH1p6grGXbp0sRtvvNH9W3T25cMPP0yx7GrVqrmziEcffbRddNFFtmfPHnv88cfda1977TV+K0iXvXv32ltvveW+FBU0z549O8Vr9Lf2yCOP2Oeff24FCxZ0JZH9+vULXVlbj+sWrnbt2u518+fPd6WV+nvV3z2QEUlJSTZt2jSbNGmS+7d+hjt48KA7DqvErGjRonbJJZdYu3btQs9///339uuvv6Z431FHHWVnn322HXvsse55HY+//vpru+666/ilId30dzp16lR79dVX3ZjgxRdfTPEajQ10IujHH390lRk9evSwU089NfS8/g7/+OOPFO+rX7++O3nUsmXL0GPTp093f8dpQYADIKpzzz3XihUr5uYXaECoL9lwffv2te+++86efPJJd0C74YYbXNmZl07Wl7FKz8IdeeSR7mfNmjXttttuc/++5ZZbrHLlyrZjxw73uUBaKQOov6mGDRvas88+G/E1mjOjL9ZHH33Utm/fbv3797fVq1e7+TSiv71If7NlypRxP3v27OnmiunvVmcYFUjVqVPHTjzxRH5hSDP9LWmQqL8vBSCRaHD4ww8/2O233+5ONnXo0MHGjBljV155pXtej0UqlfRfb2Tjxo32559/2oYNG9zfPZBejRs3dt/V+vtS8BHJeeedZ3///bf7XteY4PTTT7cpU6a4x+Xff/+N+DcbfgFQHac3b95sw4cPT9tKJgFAFDt27HA/33333SQdLrZv357s+T///NM9/sUXX4Qee/3115Py5s2btGbNmjTv182bNycVL148adeuXfxOkKG/2fHjxyfly5cvxfOzZ892f7M//fRT6LGXXnopqWDBgkmbNm2K6zNGjRqVNHLkSHc7/vjjk7p37540f/58fmNIlxUrVrifTzzxRNKRRx6Z4vkZM2a4v1n99Nx9991J5cuXT9q/f39cn/HPP/+E/n3gwIGkokWLhv6vAOn9m73//vuTatSokeL5zz77zP3Naozg6d+/f9JRRx0V92ccPHgwacCAAUkDBw5MSg/m4ACIStmXWFRWoTOPbdq0CT2miayHDh1ypRTxePvtt92ZcGV+dAZcZyTDy+CAzPqb/eqrr9yZ8ubNmyf7m1X2UWU+8VDGR3+zuh1zzDHu/coYAelRvXr1VBsEaA6N/29WZb3//fef/fLLL3F9hjLwV111lSsn7tatm/t7Te3/CpCRv1n9jakE3f83u3TpUlfeG49rrrnGvvzyS/dZzzzzjL3++uuWFpSoAUi3VatWWbly5ULzbbzynuLFi7vn4qHaXJUDFS5c2C6++OJkdbdAZtPfpf7e8uTJE3qsQoUK7m843r/Z8HI3zc0BsorKezRn0c+7r+f8gU80TzzxhJvb+Ntvv1n79u3t0ksvzbL1BZal8jereTapqVevniuB88rYVBKXFgQ4ADLUhMBf4+3RY3ou3k4pugHZ9TerYEfNBuL9m/VL68RXID2NM4oUKZLsMW+OohpmxEMNNC6//HJ2Pg7b32x4hjCtf7MDBw7M0DpQogYg3dQoQBNXw7uraEKg10QASPS/2V27dtnu3bv5m0VCUpZbx1Q/72+4dOnS2bRWQGL/zRLgAEi3E044wTZt2uQ6pXhmzpzpuq3pOSDR6O9SpWjq4ONR+3PvOSDR6CruixYtSnbm22sJrW5WQCL+zc6fPz9Z51X9zSqTeLjmKxLgAEg3NRdQe9x7773XNRY4cOCADRs2zLWVpmUuElHHjh3dhG1dJVvZRpVSPPDAA+76DGoYACQaXadJf6te23MNGjWnRn+zus4NkGguueQS27Jli02cONHdVxMXXTpCx9+yZcselnXIo1Zqh+WTAOQ4I0aMsDfeeMNd52P58uXubKHOwIwaNSrUDOD333933VHWr1/vvnhr1KjhOqMp8AEOt7vuuss+/vhjl1lUpkZnEkVXwlbgLbr4pzpJbdu2zQU4mvCqv9nUOgMBWeHBBx+0WbNmuUy4MjUaBIoGhN7f5OTJk61Pnz7WoEEDdx0b+eyzz6xu3br8UnDY3X333S5Do79XjQ3OOuss97gu+Fm+fHn373HjxrnuqDoG6zpjmpOjCyhXrVr1sKwjAQ6AqHRQUuASTmcN/Rfj0nkStX9U8FOrVi32KLLNypUrXXATTgNB/6RX/c0uWbLENRdQUA5klxkzZtjatWtTPN6uXTvXkdKjOQ0KhNRwQJ3TChQocJjXFPhfaqnvBdp+CnT8DTE0ftDFkDVeOOmkk5J1XM1qBDgAAAAAAoM5OAAAAAACgwAHAAAAQGAQ4AAAAAAIDAIcAAAAAIFBgAMAAAAgMAhwAAAAAAQGAQ4AAACAwCDAAQDkGI8//rgNGTLEEtkHH3xgF110kbVp08Z++umnhNi+zFhuou77RF0vANknfzZ+NgAgh+natatt2rTJ/bto0aJ21FFH2bXXXmsNGzbM9M8aOXKk7d692+69997QY4sWLYp4Be1EsXjxYrvgggvsmWeesfr161u9evXS9P6s2r7MWG74MiL9frJaTvybAHD4EeAAAOL2448/2rnnnmuXXXaZ7dy501599VU7/vjjbdasWXbsscdm6p5cuHCh7dixI9ljt9xyi+3fvz9hf2Nz5syxsmXL2jXXXJOu9yfy9oWvW6TfT1bLiX8TAA4/AhwAQJooa9O6dWv37w4dOti3335r48ePtyeeeMI9NmjQIKtVq5b169cv9B5lNFavXm3Dhw939x988EHLly+fe92HH35ou3btcoFTz5493fMvvviiffzxx3bw4MHQZz355JM2bdo027p1qw0dOjS0nLx581r58uXdc9u2bbNLLrnELr30Uhs7dqx99NFHVqhQIbv66qvtjDPOSLYdf/zxh40ePdqWLl1q1apVs759+1rz5s1jbru2dcyYMfbff/+57IwG19oGeeqpp+y5555zGS6t8xFHHGGffvppimXovdqW3377zcqVK+eCxTPPPNM9p/UN375Y+8nz7rvv2qRJk6xgwYLWtm1bt99WrVoV2t+RpHX7/esW7ffTtGnTVJfrbZOemzJlipUoUcImTpxoEyZMcDcpVaqUC5xvvvlmK168eJr+JlL7PaVlvwLImQhwEAiHDh2yNWvWuC/CPHnyZPfqAIH+v7Znzx4XSHjKlCnjghfvMWUxVEbkf40GvRrweo9pcK8Bs+apdO/e3f755x8XEOlMfLdu3dyAuHHjxu6zBg4cGPqc+fPn28aNG5Mt5/3333eBlgKbBQsW2OWXX26jRo1yA2gFD3PnznXPz5w50+rUqRPKRCkIUnmdBuB//vmnC4A00A4PhDyff/65e8+AAQPs7LPPtjfffNNOOOEEmzFjhlWsWNFatWply5cvd4GG1lkDaP8+8Jx11llWoUIF6927t3v+kUcesX379lnLli0jbl+s/eQFN9qG22+/3Ro0aOC2Yfr06W553nK0fL3Hu5+e7fevW7Tfz2effZbqcrVNCipOO+00F1Bo32mZ2pcK+ERBogIUzWf66quv3HE93r+J1H5P8e5XAJkvKSnJtm/fbpUrV3Ynp7JKniR9EpDD6ctJgxkAAAAkNmWYq1atmmXLJ4ODQPBKGPQfRuUOAAAASCzKtOqEtDduyyoEOAgEryxNwQ0BDgAAQOLK6ukEXAcHAAAAQGAQ4AAAAAAIDAIcAAAAAIFBgAMAAAAgMAhwAAAAAAQGXdQQKI2GTLW8hYpk92oAAADkCMtHdLKgIYMDAAAAIDAIcAAAAAAEBgEOAAAAgMAgwAEAAAAQGAQ4AAAAAAKDAAcAAABAYBDgAAAAAAgMApx02LNnj1144YW2ePFiyy6///673XjjjRbU/dujRw/buHFjdq8KAAAAcphccaHPK6+80nbu3On+XaxYMatbt6717dvXKlSokOp7Dx06ZBdffLENHTrUGjZs6B47cOCAvf3223bbbbe5ZWWHG264wS655BL37zVr1kQNdq655ho788wzQ/fnzJljY8eOtXXr1tkrr7xihQsXTvb6TZs22csvv2zz5s2zUqVK2TnnnGNt2rSJuS7peU8sWict55577rFnn3023csBAABA7pMrMjjvv/++FS9e3AUEp59+uk2dOtWOOeYYW7VqVVwBjoKZ9evXW6KYPn26/frrr9azZ09339s2/61s2bJuvStVqhR632WXXWZ9+vSx7du3u+cUqPn99ddfdvzxx9vy5cutZcuWbrkKVu6///6o65Ke98Sjf//+oUAMAAAAiFeepKSkJMtEw4YNs9q1a1vBggXt66+/toMHD7qBeIsWLUKvGThwoLVq1coNhD1PPvmkO3N/7bXXJltOoUKF7JNPPrHq1avbfffd557T/Q8++MD27dvnBtdXX321+7xolA3QewcMGODuK5tTpUoVlwXJkyeP1apVy3r16pXsPVdddZWdf/759sYbb7jshNa3XLly7n0PPvigG8hPmzbNZS1+++03K1++vMuiVK5cObQMbfurr77qXpc3b15r3769ywbpM71SrMsvv9zuvfde95poy4mUkdIyJkyYEPU1HTp0sG3bttmPP/4YemzZsmVuW9977z23bQp0lNHybN261fLly5fssVGjRrlMlV4baR+n5z0KMCdOnOiyM/rd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CQCQ6cjgAAAAAAgMAhwAAAAAgUGAAwAAACAwCHAAAAAABAYBDgAAAIDAIMABAAAAEBgEOAAAAAACgwAnh3jllVds7dq1Ue9HsnXrVnvrrbcsp9mzZ4+99tprdujQoexeFQAAAOQwBDg5RI8ePWz+/PlR70dyzz332PTp05M9pqDhiy++cAHSgQMHIr4vnteEW79+vX3yySc2depUW7dunWVE4cKFbezYsfbiiy9maDkAAADIfQhwAmrVqlUuQLj99ttDj73wwgtWp04d69+/vwuQlCkJF89rwt18883WrFkze/75523EiBFWq1Yte/jhhzO0/oMHD7YhQ4bYvn37MrQcAAAA5C4JG+B89dVX9uuvv9rmzZvtyy+/dJmB7du3J3uNMgZ//vlnsse+//57mzFjRorlbNy40WUlPv74Y9u9e7d77r///rP33nvPvv76a9u/f3/Ez9f7Pv/8c/v0009D75PffvvNLSvc3Llz3XrF2qYNGzbYBx984LbL462LHtdnZpSCjdatW1uVKlVCjxUqVMitQ6zgI57XhDv55JPt77//duuufanPvuOOO2z16tURX699MHnyZEtKSkqWAVLGSPtB2rZta/nz57e333477vUAAAAA8ifqLhg+fLjt2rXLDXwbNGhgixcvtp07d9rPP/9sFStWdK+588477fLLL7djjjkm9L5nnnnGihUr5gbd3nIUJCmoOO6442zevHmWJ08el9lQtqFJkyY2Z84cl3XQ4Dxv3ryh9+nz/vnnH/eav/76yz3+zTffWNWqVW3Lli123nnnuUyJtz7St29fNzg/++yzI26Tlqm5M1qmsh5nnHGGTZw40fr162fNmzd3JWGXXXaZTZo0ybp27Zru/ffRRx+55fj17NnT/dQ+iCae14Tr1q1bsvu1a9d2P/X7i6Rs2bJuH61Zs8YGDBjgAp0rrrjCvd5bZ/0eTj/9dLcdl156adzrAgAAgNwtYQMcWbp0qRtoV6hQwQ38mzZtas8++6wNGzYsTctRJuH333+3cuXKuYn31apVswcffNBlEsqUKeOyBtWrV3cZnvbt2yfLxuimAGrv3r1uUK7SqZdfftlatWplRx11lAtEBg0aFMrqKFhSJiIaZZw0d0ZBkijYuf766+3xxx+3a6+91j2mdbv66qvd55UqVSrN+037SturwPBw0TZpf2p7NH/mrrvu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HAAAAACBQYADAAAAIDDoooZAaTRkquUtVOSwfd7yEZ0O22cBAAAgdWRwAAAAAAQGAQ4AAACAwCDAAQAAABAYBDgAAAAAAoMABwAAAEBgEOAAAAAACAwCHAAAAACBQYCTwzz//PO2evXqqPfTauPGjTZx4kRLJHv27LGXXnrJDhw4kN2rAgAAgByGACeNkpKSXFCxZs0ayw79+vWzP//8M+r9tLrzzjtt/vz5yR7bv3+/vfvuu2474w0ytm7dam+//bZNmjTJli5dahlRuHBhe+edd2z06NEZWg4AAAByHwKcNDp48KALKhYtWmTZ4ZprrrGqVatmyrIUiCh7c9ttt4Uee+KJJ+yoo46y++67z22nsimpmTt3rtWpU8ceffRRmzJlijVq1MgFRxlx++232/333x/X5wMAAACBDXCUcdDg+r///rNff/3VXnnlFfvqq69c5sWjQfisWbNSvPf111+3OXPmuH/v3bvXPv30U3v55ZfdcjxeOdcHH3zgPufNN99MVu6lZb/22mspsir+9VLGRK/58ssv7dChQynWY/PmzS6DovUJLz9r2rSpFS9ePOr2R1vvSLQ+Z5xxhlWoUCH0WOXKld2+GTp0qMWrV69e1rZtW/vpp5/cfnnqqafspptuslWrVkV8vZY/bty4ZNuujJjWZ926de7+6aefbkWKFLHJkyfHvR4AAABA4AIcnfFX5uGCCy6w7t2728cff2yXXnqpdenSJTSg1gD7hhtuSJHN0OsViGiQfcwxx9i9997rgqOrrrrKevfu7V73+++/u59LlixxAYQXyLz33nsuizF+/Hj3ma1atbKBAwemWK+LL77YrrzySheEXHHFFXbuuecmWw+VZlWvXt1lQxQstGnTxj788MO4StJirXckn3zyibVu3TrZY926dbOKFSvGvb//+usvmzdvnl1//fWhx7R9XplZJNWqVbM77rjDHn74YXdfvxfte72+fPny7rE8efK4IEf7EgAAAIhXfgswBSAFChSwFStWWMOGDV22RcFO3759beTIkbZgwQJr0KCBe60CE/37pJNOslGjRlmxYsVs5syZbqAt06ZNcz8VeChDccstt4SCg7Vr17oBugKSdu3auceUvdBndu7c2Q3UPVWqVHFZJS1XQVK9evVcwNWsWTOXrdFyhg0bFgqOdu3alWKOTDTKdkRb73CaZ6PtV0CU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+thpS5cutRmMcuXKeeZZv369bZhWrVrVvl61apWJi4szpUqVsn9T5uPpp5+288mmTZvMnj17zLVr18yUKVPstBo1apiyZcua69eve5brLEfroOVcuHDBVKtWzWTKlMn+W12X0qZNa5555hmTLl26e7bF+ZwCBQrYzEuKFAn33L59+7b9zBMnTtjsjHf2at26dWbu3LkmderUZvr06fb5lVde8bucffv2mX///dfkypXLPPXUU/a9Emj7Au0nh7Jqf/75p0mTJo3dDi1fjX5nfwcSyvZ7r1ug45M7d+5El+tsU4kSJcyKFSvMnTt3TL169ez+0EOyZs1qSpcubfLly3fPuib2nUjsOIWyXwFEJwIcAEDYihQpYooVK2Y2btzomfbpp5/ahqN3gPPDDz+YXbt2eRrcCoi2bdtms0BaxuHDh21jVI10NUi3bNli9u/fb7sjzZw5085TpkyZe7ojaTmbN282586ds41YfYYCKa3DwIEDbSNan6OG68qVKz1BjoKfZs2ame3bt9v11HO2bNnM7NmzPY10X8rM1K1b136WlqvlqWE+adIk24DXPli7dq0NNrTO+ix/AY7Wa9iwYXZfaD20vr/++qvdD/62L6H9JApmqlevbtehaNGiNnukwCBHjhwBA5xwtt973QIdH21zYst1tknr8Nhjj9njpv2o9zrLOn36tA1+PvroI9O7d287LdjvRGLHKdj9CiB6EeAAAMKmK+eHDh0yL7zwQsjzqkGrq+dqUMbHx9tlfPHFF7YbkrJEGqivxr9ztT6Q3bt32+BCjWWtj57fffddO61QoUK2EavnadOmmTZt2th5evXqZRvjmlfZE13xVzDSt29fM378eL+fo79pHjWMM2TIYOdVI17v79Chg2nfvr3NCnzwwQcB11nrN2TIEDN//nwblMiOHTs845pC3U/Sr18/U7BgQbNgwQKbwVGmo2LFiqZ27doBlxnO9nsLdHw6duwY1HIVlCoYVJbGocBID+/iAQpaNE3HL9jvRGLHKdj9CiB6EeAAAEKiBrQamAocVCksVapUpnv37iHvxZo1a3qulisweP755+2YnnCWo6BG1B1NXaLUsFWj2CmGoIb0zp077esbN26YyZMn2yBIRRPUuNUjf/78NtPgj7pRqdvZ999/b5ct+swWLVrYfeHdcE6IMggKQtTAV1c6vX7yySfD3k9arxkzZpiffvrJLtfJatSpU8dukz/hbH8wQlmuggnv4MZx/vx5s2HDBptNUXCkrobq+uccy8SEcpwe1PcPQOQhwAEAhERdhdSQPHv2rB1vo+5g6uYTquzZs9/1WsGJxleESl2gfJfjb5qz7GPHjtl/6+q9und5U9Dhj+ZR9kWV0byp8axuTcFSVmPixIm229XgwYPt5ykz0bRp07D2k9br5s2bpnDhwne9R681PirQtoS6/cEIZbmPPPLIPfMrw/bmm2/abnYau6PtVNCkYCeUdQj2OD2o7x+AyEOAAwAIu8jA4sWLTa1atew4nPr169tpykooAPIWSQ3HzJkzeyrCJRRYeNN4Fm3XmTNn7pqu1zlz5gzp85s0aWIfyij9/vvvtmubuvn16NHDhEqBnLIPGm/iTcHng9z+YISyXK2zr27dupmhQ4eat99+2zNNxQYCZaKS+jgBiF7c6BMAEDZVsVK3H3VLUiZBNMBdg/0d6moUTtcfdU9KisBIQYEqZmmshW/jWYPN/dHVfZXDVjEAhzPY/bnnngv6s1WtywlG1D2qZ8+epmHDhraqVzhUmltd8tQlzKHxPBqP8yC3P5jjcz/L1XdHQYh3d72FCxfaLmsJfWZSHScA0Y0MDgDgvgwaNMg8/vjjZuzYsaZr166mdevWNvDRYG91N1LXI3UzCrUbmwbK//jjj2bUqFG28axlPiijR482L774on1oELsTFCgTNXz4cL/zqPKZ3q/sg9ZNYzo0nwb5B0sNdlU2a9Soka00d+DAAdv4njBhQtjb8sknn9ggSVSRTBXrFFT6y5Lcz/YHc3zCXa667ikDqLFcCpaPHz9uvvrqq3vurRTMd+JBHCcA0Y0ABwAQtMaNG9vSu97y5s1rG68qTywarK1qVxrsrfE6Gm+iAEfjIxy6UaPvPVfUOPe+n0nLli3ta2U3dE8XDZ73vamjv+XoSr3TXcp7ULvGdThUVUvrpspaq1evtvejUWWxhCqPabmq7KUAYtmyZXaQuoI377EcCuIUvASisSdr1qyxg+C1DM2rfVW5cmX792C2z3c/qaCAbjCqsT3aJjXkFTR5v8d3ueFsv+8y/B2fYJbrb5tEgcjXX39t712k+VRpTstR8JzQZ/quVzDHKZj9CiB6xcWH0rkVAABEFDXulelQNTtRI11dvZQNce4hAwCxhAwOAABRTDe2bNu2rWnevLktFa3ubgp2gi1dDQBuQwYHAIAop3vHqIuXBuqrC2GnTp3sgHwAiEUEOAAAAABcgzLRAAAAAFyDAAcAAACAaxDgAAAAAHANAhwAAAAArkGAAwAAAMA1CHAAAAAAuAYBDgAAAADXIMABAAAA4BoEOAAAAACMW/wfQFRs1VDFZogAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x800 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_order = ['pystencils', 'Cython', 'numba', 'numpy slice', 'numpy roll', 'pure Python']\n",
    "plot_order = [p for p in plot_order if p in all_implementations]\n",
    "\n",
    "def bar_plot(*shape):\n",
    "    names = plot_order\n",
    "    runtimes = tuple(do_benchmark(all_implementations[name], shape) for name in names)\n",
    "    speedups = tuple(runtime / min(runtimes) for runtime in runtimes)\n",
    "    y_pos = np.arange(len(names))\n",
    "    labels = tuple(f\"{name} ({round(speedup, 1)} x)\" for name, speedup in zip(names, speedups))\n",
    "    \n",
    "    plt.text(0.5, 0.5, f\"Size {shape}\", horizontalalignment='center', fontsize=16,\n",
    "             verticalalignment='center', transform=plt.gca().transAxes)\n",
    "    plt.barh(y_pos, runtimes, log=True)\n",
    "     \n",
    "    plt.yticks(y_pos, labels);\n",
    "    plt.xlabel('Runtime of single iteration')\n",
    "    \n",
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "plt.subplot(3, 1, 1)\n",
    "bar_plot(32, 32)\n",
    "\n",
    "plt.subplot(3, 1, 2)\n",
    "bar_plot(128, 128)\n",
    "\n",
    "plt.subplot(3, 1, 3)\n",
    "bar_plot(2048, 2048)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All runtimes are plotted logarithmically. Numbers next to the labels show how much slower the version is than the fastest one."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
