{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To kick off <a href=blogging-blitz-2019.html> the blitz </a> I'm going to begin with an idea I had back in April of this year which I think could be a lot of fun to play with but which I don't feel like I have had enough time to get a real feel for. The idea is in essence \"why not replace all the dense layers in a neural network with convolutional layers?\".\n",
    "\n",
    "<!-- TEASER_END -->\n",
    "\n",
    "I often find making adjustments to dense network layers to be more frustrating than dealing with convolutional layers in a network. If I want to adjust the execution memory footprint, the computational burden of the network, or increase or decrease the number of parameters in the network a little I will usually be able to find a way to get what close to exactly what I want somewhere in the huge design space of kernel sizes, number of channels, convolution strides, pooling types, pooling strides, mixed kernels, etc, etc. \n",
    "\n",
    "The comparative paucity of design choices to be made with a stack of dense layers sometimes leaves me in situations where my network is under performant or overly resource hungry (or both) and I find it is much more difficult to make adjustments to a dense network architecture to address these problems than when dealing with a convolutional network. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A little theoretical motivation\n",
    "\n",
    "The big reason that dense networks are relatively inflexible is that the transform complexity (in terms of number of parameters) is rigidly tied to the amount of computation and amount of memory required. A dense layer with M input activations and N output activations needs $M*N$ free parameters and also takes $M*N$ multiply-adds worth of computation. \n",
    "\n",
    "By contrast consider the transform represented by a 2D convolutional layer which takes an input activation space of $N_1 x N_2 x C_1$ and transforms it to an activation space with the same spatial footprint but a different number of channels $N_1 x N_2 x C_2$. The number of parameters involved depends on the kernel width $K$ which is typically very small $K\\approx3$ and for a 2D kernel with equal kernel widths in each dimension the number of parameters controlling the complexity of the convolutional transform is just $K^2 x C_1 x C_2$. Whereas the amount of computation is proportional to the product of the number of input activations and number of convolution parameters $N_1*N_2*K^2*C_1*C_2$.  \n",
    "\n",
    "In practice this means that the computational burden of a convolutional net is dominated by the spatial size of the activation maps (and in turn can be controlled by the aggressiveness of your pooling strategy) and the overal network complexity (in terms of numbers of parameters at least) is controlled by the kernel sizes. This makes computation cost and transform complexity much more loosely coupled in convolution nets than in dense nets and gives the practioner more freedom."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import tensorflow as tf\n",
    "import tensorflow.keras as keras\n",
    "import tensorflow.keras.layers as L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "plt.rcParams.update(\n",
    "    {\n",
    "        \"figure.figsize\":(12, 6),\n",
    "        \"font.size\":16,\n",
    "    }\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Toy Problem: Permuted CIFAR-100\n",
    "\n",
    "As a play ground for these ideas I want a problem with a large number of input features and for which you might normally use a dense network. I wanted a problem with a fair amount of data and thousands of features and no spatial structure.\n",
    "\n",
    "Instead of hunting down a data set with no intrinsic spatial structure, I just decided to grab an image dataset and destroy the spatial structure by applying a random permutation to the feature map."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "(xtrain, ytrain), (xtest, ytest) = keras.datasets.cifar100.load_data()\n",
    "\n",
    "xtrain = xtrain/255.0 - 0.5\n",
    "xtest = xtest/255.0 - 0.5\n",
    "\n",
    "n_categories = len(np.unique(ytrain))\n",
    "orig_shape = xtrain.shape[1:]\n",
    "\n",
    "#onehot encode the labels\n",
    "ytrain_oh = keras.utils.to_categorical(ytrain, n_categories)\n",
    "ytest_oh = keras.utils.to_categorical(ytest, n_categories)\n",
    "\n",
    "#flatten the features\n",
    "xtrain = xtrain.reshape((len(xtrain), -1))\n",
    "xtest = xtest.reshape((len(xtest), -1))\n",
    "\n",
    "n_features = xtrain.shape[-1]\n",
    "\n",
    "#apply a permutation to destroy the spatial structure\n",
    "data_perm = np.random.RandomState(seed=1234321).permutation(n_features)\n",
    "xtrain = xtrain[:, data_perm]\n",
    "xtest = xtest[:, data_perm]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, 2)\n",
    "\n",
    "example_idx = 3\n",
    "\n",
    "axes[0].imshow(xtrain[example_idx].reshape(orig_shape)+0.5)\n",
    "axes[0].set_title(\"What the network Sees\")\n",
    "\n",
    "inverse_perm = np.argsort(data_perm)\n",
    "\n",
    "axes[1].imshow(xtrain[example_idx][inverse_perm].reshape(orig_shape)+0.5)\n",
    "axes[1].set_title(\"un-scrambled\")\n",
    "\n",
    "for ax in axes:\n",
    "    ax.axis(\"off\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see after the permutation there is no longer really any clear concept of \"local features\" for a convolutional network to take advantage of. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A Dense Network Solution\n",
    "\n",
    "Treating these 3072 input values as undifferentiated features and feeding them through a dense feed forward network I can manage to get about 28% accuracy over the 100 different classes. CIFAR-100 is a pretty challenging data set and even with some data augmentation and heavily tuned 2D convolutional architectures it can be <a href=https://benchmarks.ai/cifar-100> hard to get above 80% accuracy </a>. After destroying the spatial structure of the images all together it seems reasonable that performance would plummet. My goal however is not to reach \"state of the art\" permuted cifar-100 performance, it is just to give me a baseline for what a little architecture tuning using a dense network tool-kit might look like for this problem, both in terms of performance and model complexity. \n",
    "\n",
    "Perhaps a dozen iterations on the network architecture left me with the design below, with around 4.5 million parameters. I can easily make a more parsimonious network (parameter wise) but I couldn't get as high of performance out of networks without at least a few million parameters. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def baseline_dense_model():\n",
    "    x_in = L.Input((n_features,))\n",
    "    x = x_in\n",
    "    x = L.Dense(1024, activation=\"relu\")(x)\n",
    "    x = L.Dropout(0.4)(x)\n",
    "    x = L.Dense(1024, activation=\"relu\")(x)\n",
    "    x = L.Dropout(0.4)(x)\n",
    "    x = L.Dense(256, activation=\"relu\")(x)\n",
    "    x = L.Dense(n_categories, activation='softmax')(x)\n",
    "    return keras.models.Model(x_in, x)\n",
    "\n",
    "baseline_model = baseline_dense_model()\n",
    "baseline_model.compile(\n",
    "    optimizer=\"adam\",\n",
    "    loss=\"categorical_crossentropy\",\n",
    "    metrics=[\"accuracy\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         [(None, 3072)]            0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 1024)              3146752   \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 1024)              0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1024)              1049600   \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 1024)              0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 256)               262400    \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 100)               25700     \n",
      "=================================================================\n",
      "Total params: 4,484,452\n",
      "Trainable params: 4,484,452\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "baseline_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "training_kwargs = dict(\n",
    "    batch_size=256,\n",
    "    epochs=50,\n",
    "    verbose=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "baseline_training = baseline_model.fit(\n",
    "    xtrain, ytrain_oh, \n",
    "    validation_data=(xtest, ytest_oh),\n",
    "    **training_kwargs\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_training_curves(\n",
    "    keras_history,\n",
    "    target=\"accuracy\",\n",
    "    plot_train=True,\n",
    "    plot_validation=True,\n",
    "    ax=None,\n",
    "):\n",
    "    if ax is None:\n",
    "        fig, ax = plt.subplots()\n",
    "\n",
    "    values = keras_history.history[target]\n",
    "    epochs = np.arange(1, len(values)+1)\n",
    "    \n",
    "    if plot_train:\n",
    "        ax.plot(epochs, values)\n",
    "    \n",
    "    if plot_validation:\n",
    "        validation_values = keras_history.history[\"val_\" + target]\n",
    "        ax.plot(epochs, validation_values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x7f594811b410>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, 2)\n",
    "axes[0].set_title(\"Loss\")\n",
    "axes[1].set_title(\"Accuracy\")\n",
    "plot_training_curves(baseline_training, target=\"loss\", ax=axes[0])\n",
    "plot_training_curves(baseline_training, target=\"accuracy\", ax=axes[1])\n",
    "axes[1].axhline(0.28, linestyle=\"--\", color=\"k\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Permutation-CNN\n",
    "\n",
    "So how can we bring the tool-kit of convolutional network stacks to bear on a set of activations with no spatial dimensions? \n",
    "\n",
    "The obvious answer is just reshape the features from shape (M,) to have a faux spatial dimension and look like a spatial feature map of shape (M//k, k). The fact that the features in each spatial position are no more closely related to each other than any other features is probablematic from a semantic perspective. Since the CNN is learning \"local\" features but any sense of locality is entirely arbitrary. But there is no reason that such a network can't learn to extract useful information and for the reasons noted at the start of this post the use of convolutions instead of dense transforms will help to decouple the parameter complexity of the network from the size of the feature maps.\n",
    "\n",
    "But there is a problem with just using a regular stack of convolutions to build out our feature maps. Convolutions tend to spread spatial information only fairly slowly (though there are tricks like dialated convolutions). But certain features might be valuable only if we have access to the values of other features which are \"far away\" in the particular feature map we have chosen. Since the adjacency in the faux spatial dimension is entirely arbitrary anyway we can randomly shuffle the spatial dimension before each convolution. This gives features which were distant in earlier feature maps the chance to interact with each other.\n",
    "\n",
    "Here is a helper function to apply random permutations to tensors with 1 batch, 1 spatial, and 1 channel dimension."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def permute_1D_with_channels(\n",
    "    tensor_in, \n",
    "    permutation=None, \n",
    "    permutation_seed=None,\n",
    "):\n",
    "    x_shape_in = tensor_in.shape.as_list()\n",
    "    assert len(x_shape_in) == 3\n",
    "    \n",
    "    n_batch, n_spatial, n_channels = x_shape_in\n",
    "    \n",
    "    if permutation is None:\n",
    "        permutation = np.random.RandomState(seed=permutation_seed).permutation(n_spatial)\n",
    "    \n",
    "    permuted = keras.layers.Lambda(lambda x: tf.gather(x, indices=permutation, axis=1))(tensor_in)\n",
    "    return permuted\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "and here is a simple architecture with 1D convolutions interspersed with random permutations. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_permutation_model():\n",
    "    x_in = keras.layers.Input((n_features,))\n",
    "    x = x_in\n",
    "    x = L.Reshape((n_features//64, 64))(x)\n",
    "    \n",
    "    x = L.Conv1D(64, 5, strides=2, activation=\"relu\", padding=\"same\")(x)\n",
    "    x = permute_1D_with_channels(x)\n",
    "    \n",
    "    x = L.Dropout(0.25)(x)\n",
    "    \n",
    "    x = L.Conv1D(64, 5, strides=2, activation=\"relu\", padding=\"same\")(x)\n",
    "    x = permute_1D_with_channels(x)\n",
    "    \n",
    "    x = L.Conv1D(64, 5, strides=3, activation=\"relu\", padding=\"same\")(x)\n",
    "    \n",
    "    x = L.Dropout(0.2)(x)\n",
    "    \n",
    "    x = L.Flatten()(x)\n",
    "    x = L.Dense(n_categories, activation=\"softmax\")(x)\n",
    "\n",
    "    return keras.models.Model(x_in, x)\n",
    "\n",
    "\n",
    "perm_model = build_permutation_model()\n",
    "\n",
    "perm_model.compile(\n",
    "    optimizer=\"adam\",\n",
    "    loss=\"categorical_crossentropy\",\n",
    "    metrics=[\"accuracy\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_2 (InputLayer)         [(None, 3072)]            0         \n",
      "_________________________________________________________________\n",
      "reshape (Reshape)            (None, 48, 64)            0         \n",
      "_________________________________________________________________\n",
      "conv1d (Conv1D)              (None, 24, 64)            20544     \n",
      "_________________________________________________________________\n",
      "lambda (Lambda)              (None, 24, 64)            0         \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 24, 64)            0         \n",
      "_________________________________________________________________\n",
      "conv1d_1 (Conv1D)            (None, 12, 64)            20544     \n",
      "_________________________________________________________________\n",
      "lambda_1 (Lambda)            (None, 12, 64)            0         \n",
      "_________________________________________________________________\n",
      "conv1d_2 (Conv1D)            (None, 4, 64)             20544     \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 4, 64)             0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 256)               0         \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 100)               25700     \n",
      "=================================================================\n",
      "Total params: 87,332\n",
      "Trainable params: 87,332\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "perm_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "perm_training = perm_model.fit(\n",
    "    xtrain, ytrain_oh, \n",
    "    validation_data=(xtest, ytest_oh),\n",
    "    **training_kwargs\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3.093251454925537, 0.27]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perm_model.evaluate(xtest, ytest_oh, verbose=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x7f58f458a390>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, 2)\n",
    "axes[0].set_title(\"Loss\")\n",
    "axes[1].set_title(\"Accuracy\")\n",
    "plot_training_curves(perm_training, target=\"loss\", ax=axes[0])\n",
    "plot_training_curves(perm_training, target=\"accuracy\", ax=axes[1])\n",
    "axes[1].axhline(0.28, linestyle=\"--\", color=\"k\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see the random permutation network trains up to about 26% accuracy. While that is still quite a bit shy of the 28% accuracy that we can squeeze out of a mildly tuned dense network it isn't completely off the mark.  But what is remarkable is how few parameters the network required to get there. Just 90,000 parameters! Fewer than 1/50th the number of parameters used by the dense network above. In fact many fewer parameters than the 300,000 parameters that a direct linear model (e.g. logistic regression) would have used!."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multiple Initial Permutations\n",
    "\n",
    "One problem with the above approach is that the choice of features are stuck together into pseudo-spatial features when we do the feature reshaping is entirely arbitrary and has a strong effect on the model. Some features belonging to the same or nearby pixels will happen to get randomly assigned to a pseudo-spatial block together and other pairs will be assigned far away and will therefore won't be able to combine their information into useful features until the later layers of the network.  \n",
    "\n",
    "To help alleviate this problem I generate several different input feature permutations inside of the network prior to the pseudo-spatial reshaping, giving many different input feature pairs the chance to be close in at least one of the reshaped feature maps. Then I just reuse the same network structure as above as sub networks, then aggregate the results of each sub network just before prediction.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_multi_permutation_model():\n",
    "    x_in = keras.layers.Input((n_features,))\n",
    "    x = x_in\n",
    "    \n",
    "    x = L.Reshape((n_features, 1))(x)\n",
    "    \n",
    "    x1 = permute_1D_with_channels(x)\n",
    "    x2 = permute_1D_with_channels(x)\n",
    "    x3 = permute_1D_with_channels(x)\n",
    " \n",
    "    x_out = []\n",
    "    for x in [x1, x2, x3]:\n",
    "        x = L.Reshape((n_features//64, 64))(x)\n",
    "        x = L.Conv1D(64, 5, strides=2, activation=\"relu\", padding=\"same\")(x)\n",
    "        x = permute_1D_with_channels(x)\n",
    "        \n",
    "        x = L.Dropout(0.25)(x)\n",
    "\n",
    "        x = L.Conv1D(64, 5, strides=2, activation=\"relu\", padding=\"same\")(x)\n",
    "        x = permute_1D_with_channels(x)\n",
    "\n",
    "        x = L.Dropout(0.25)(x)\n",
    "        \n",
    "        x = L.Conv1D(128, 5, strides=3, activation=\"relu\", padding=\"same\")(x)\n",
    "\n",
    "        x = L.GlobalMaxPooling1D()(x)\n",
    "        \n",
    "        x_out.append(x)\n",
    "    \n",
    "    x = L.concatenate(x_out)\n",
    "    x = L.Dropout(0.25)(x)\n",
    "    \n",
    "    x = L.Dense(n_categories, activation=\"softmax\")(x)\n",
    "\n",
    "    return keras.models.Model(x_in, x)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "mperm_model = build_multi_permutation_model()\n",
    "\n",
    "mperm_model.compile(\n",
    "    optimizer=\"adam\",\n",
    "    loss=\"categorical_crossentropy\",\n",
    "    metrics=[\"accuracy\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_2\"\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_3 (InputLayer)            [(None, 3072)]       0                                            \n",
      "__________________________________________________________________________________________________\n",
      "reshape_1 (Reshape)             (None, 3072, 1)      0           input_3[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "lambda_2 (Lambda)               (None, 3072, 1)      0           reshape_1[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_3 (Lambda)               (None, 3072, 1)      0           reshape_1[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_4 (Lambda)               (None, 3072, 1)      0           reshape_1[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "reshape_2 (Reshape)             (None, 48, 64)       0           lambda_2[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "reshape_3 (Reshape)             (None, 48, 64)       0           lambda_3[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "reshape_4 (Reshape)             (None, 48, 64)       0           lambda_4[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_3 (Conv1D)               (None, 24, 64)       20544       reshape_2[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_6 (Conv1D)               (None, 24, 64)       20544       reshape_3[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_9 (Conv1D)               (None, 24, 64)       20544       reshape_4[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_5 (Lambda)               (None, 24, 64)       0           conv1d_3[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "lambda_7 (Lambda)               (None, 24, 64)       0           conv1d_6[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "lambda_9 (Lambda)               (None, 24, 64)       0           conv1d_9[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "dropout_4 (Dropout)             (None, 24, 64)       0           lambda_5[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "dropout_6 (Dropout)             (None, 24, 64)       0           lambda_7[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "dropout_8 (Dropout)             (None, 24, 64)       0           lambda_9[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_4 (Conv1D)               (None, 12, 64)       20544       dropout_4[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_7 (Conv1D)               (None, 12, 64)       20544       dropout_6[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_10 (Conv1D)              (None, 12, 64)       20544       dropout_8[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_6 (Lambda)               (None, 12, 64)       0           conv1d_4[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "lambda_8 (Lambda)               (None, 12, 64)       0           conv1d_7[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "lambda_10 (Lambda)              (None, 12, 64)       0           conv1d_10[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "dropout_5 (Dropout)             (None, 12, 64)       0           lambda_6[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "dropout_7 (Dropout)             (None, 12, 64)       0           lambda_8[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "dropout_9 (Dropout)             (None, 12, 64)       0           lambda_10[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_5 (Conv1D)               (None, 4, 128)       41088       dropout_5[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_8 (Conv1D)               (None, 4, 128)       41088       dropout_7[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_11 (Conv1D)              (None, 4, 128)       41088       dropout_9[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "global_max_pooling1d (GlobalMax (None, 128)          0           conv1d_5[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "global_max_pooling1d_1 (GlobalM (None, 128)          0           conv1d_8[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "global_max_pooling1d_2 (GlobalM (None, 128)          0           conv1d_11[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate (Concatenate)       (None, 384)          0           global_max_pooling1d[0][0]       \n",
      "                                                                 global_max_pooling1d_1[0][0]     \n",
      "                                                                 global_max_pooling1d_2[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "dropout_10 (Dropout)            (None, 384)          0           concatenate[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "dense_5 (Dense)                 (None, 100)          38500       dropout_10[0][0]                 \n",
      "==================================================================================================\n",
      "Total params: 285,028\n",
      "Trainable params: 285,028\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "mperm_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "mperm_training = mperm_model.fit(\n",
    "    xtrain, ytrain_oh, \n",
    "    validation_data=(xtest, ytest_oh),\n",
    "    **training_kwargs\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2.9847203704833984, 0.2875]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mperm_model.evaluate(xtest, ytest_oh, verbose=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x7f580c5e84d0>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtYAAAF/CAYAAABt6459AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3zV1f3H8dcne0AWe29ZMgREVLSCA9xY9x5UrLZaq2jdbdXWhZafdVv3tioqqIgstSgiICB77xVGAoEQMs7vj3MD4ZKEXEi4Ge/n43EfNznf8/1+PzfGyyfnfs455pxDREREREQOTUS4AxARERERqQ6UWIuIiIiIlAMl1iIiIiIi5UCJtYiIiIhIOVBiLSIiIiJSDpRYi4iIiIiUAyXWIiIiIiLlQIm1VFtm1tLMnJl9Gu5YRESqGzP7IvAeOzvcsYhUFkqsRUREJCRm1ggYADigs5kdHeaQRCoFJdYiIiISqquBSOCpwPfXhTEWkUpDibUIe8pGXjezdWa228xWmNnTZla3mL5Hm9mnZrbazHIC53xrZtcdTD8RkSroGiATuA9YCFxiZnHFdTSz/mY20szSA++FK8zsHTPrEtQv2cweMrM5ZpZtZlvNbIqZDS3S56RA+cnfirlPsccCbRPNrLmZvRuIw5lZy8Dx88zsAzNbWuS+Y83slJJevJmdb2bjAn2zzWyxmb1kZs0Dx8cH/i2pX8L535lZrpk1KOkeUjUpsZYaz8zaAz8DVwE/Ak8C84GbgZ/MrF6RvkcB/wNOBL4J9P0CSAQuDbWfiEhVY2bHA+2Bj5xzu4C3gRTgt8X0vQ0Yh38v/AI/wv090A84uUi/Bvj34fuALOAZ4K3A13eXQ9h1gElAu8B1XwN2B449AnQAvgWGA58BvYCvzay41/R/wEfAkcB/gf8DpgEXAj0C3V4CooErizm/HXACMNI5t6EcXptUIlHhDkCkEngBqAtc5Zx7q7DRzB4A/g48xt6POa8EYoCjnXOzil7EzOoU+bas/UREqpprA8+F75dv498rrwXeLexkZt2BJ4DlwPHOubVFjkXhk91Cz+OT3nucc48UvZmZNS2HmI8EXgRudM65oGOnO+eWBd2zAT5Zfhz4pEj7OcAt+D8CTnHObStyLB6ID3w7AtgMDMYPrBRV+O/JK4fygqRy0oi11GiBj+1OAn4pmlQHPA5sAC41s5igY9nB13LObS7mFmXtJyJS6ZlZInARsBL4DiCQlP4A9C8shQi4AZ9n3F00qQ6ck1c4WmtmDYFBwFz8QAZBfVeXQ+g5+KQ9OKkmOKkOtG3AJ9RtCktGAm4MPN9SNKkOnJPtnNsS+DoHeBPoaGZ9CvuYWST+09G1wOhDeUFSOSmxlpque+B5YvCBwEeck4E4/Mee4D/2K8CXiDwbqLMrroaurP1ERKqSC4DawDtBSepb+JzimiJthSuFjDnANXsBBoxzzhWUU5zBlhUmvcHMrKGZ/Z+ZLQzUSzszc/hyQIBGRbofDWx3zk0uwz1fDjwPLtJ2OtAYeN05lx/ia5AqQIm11HRJgeeS6tzWF+3nnPsRXxc4DbgeX2e3PjCJ5cjCk8raT0SkiiksA3k7qP1DfM3yNWZmgbZkIKekhLaI5MDz2lJ7HZqNxTWaWRowBZ9Er8fXRj+EL235NtAttsgpyZQxTufcPHxd98WBkX7wSbYDXg0xfqkilFhLTVf4UV5JM7MbBPXDOTfROXcqkAqchn8j/g1+okutUPuJiFQFZtYGPwkRYE7hyG5gdHcLfl5JK3x5HUAGEBtIXkuTEXhuXIYwCke0I4s5llRMW6H9SkACBgPNgHudcyc65/7knHvAOfc3YF4JsZYlzkIv40f4Lwx8ankmMNE5tySEa0gVosmLUtPNCDyfGHzAzGKBY4BdwILg4865HfgVP74JTMQZDPRk7yhHSP1ERCq5a/AlGxOApcUcrwucix/VnoCf4NcLP7DwfinXnYZPfE82s4gDlIMUJuFNijl2VGnBl6BN4Hlk0cbAqPuxxfT/GTjdzPqUsRzkQ/xKI4PxP59oNGmxWtOItdRozrmV+AS3p5ldHHR4KL627n3n3G4AM+trZrWLuVRh/XR2KP1ERKoCM4vAbwqTD1zunPtd8AM/qXEzcL6ZJeE/pSsA/ml+p8ai14sqnHfinFuPX0WjE3BnMfcumkQvAHYAZ5tZSpE+rfGrdYRqZeD5+KD2W4FuxfR/PvD8dOA1Fo0zLnh03jmXDbwD9AVuw/9h8PFBxClVhBUzQVakWgjM5F4GrALGl9BtDPALfs3pFPyb+0L8WqQDAuf3cc5tDFzzU3zt9Hj8iE0+/g25D36G/EnOOVfWfuX6gkVEKoiZnQZ8DXzhnDurlH7/h09whzjnXjaz24Fh+HK6T4B1+FKKU4BhzrnhgfMa4N+H2+Jrnr/Fl5Z0Bno45+oUuccT+IGPZfg1p9OA8/CfDP4W+HuglKOwvwO+dc6dVEy8zYDZQAI+4V2NH2XvA4zFl270c85NLHLO0/ia7A2B+28BmgMDgcHOuU+D7tGNvZ+OPuuc+2NJPz+p+lQKIjVBM/xIS3EynHPvmtnRwN/wH1meg5/E8izwYGFSHfA8/h+IY/CJcz5+jda/4N8wXYj9RESqgsJJi68foN9r+MT6OuBl59yTZvYrfrR2EH6d5/X4UpFvCk9yzm0ws974EevzgT/hN4dZBDwcdI+78RMlrwZuwg+G3IRPivfb0KU0zrlVZnYSfnnVAfhP8ifjN3A5M/AIPucWM/shcM9L8bnUGvxqUNOK6T8z8DPogspAqj2NWIuIiIhUkEBZ4DpgoXOux4H6S9WmGmsRERGRijMESMTv8ivVnEasRURERMqZmd2FX7L1Bvw62h0CG49JNabEWkRERKScBSZN7gamAzc5534Jc0hyGCixFhEREREpB6qxFhEREREpB9Vmub26deu6li1bhjsMEZGQTZs2bZNzrl644zic9J4tIlVVae/Z1SaxbtmyJVOnTg13GCIiITOzFeGO4XDTe7aIVFWlvWerFEREREREpBwcVGJtZqPNzJlZ8G5Iwf16mdlLZjbfzHaa2Uoze8fMWhXTd3ngmsGPQQcTo4iIiIjI4RRyKYiZXQp0K2P3S4DOwNPAHKAJcD8w1cy6O+dWBfX/Gr+tdFELQo1RRERERORwCymxNrMU4F/An4F3y3DKY8659KBrTAKWAdcDDwT13+ScmxxKTCIiIiIilUGopSCPA3Occ++VpXNwUh1oWwGk40evRURERESqhTIn1mbWF7gKuOlQbmhmHYH6wLxiDp8dqMXOMbPJqq8WERERkaqiTIm1mUUDLwLDnHMHXfNsZlHAC/gR61eCDo8EbgYGAJcDu4ARZnZFKdcbYmZTzWxqevp+g+MiIiIiIodNWWus/wLEA/84xPs9AxwHnOmc21r0gHPu5qLfm9kIYDLwCPB2cRdzzr0EvATQq1cv7c0uIiIiImFzwBFrM2sO3ItfzSPWzFICkxgp8n1kGa7zCDAEuM45N+ZA/Z1z+cB/gaZm1uhA/UVEREREwqkspSCtgTj8qPHWIg+AoYGvu5R2ATO7F7gL+JNz7q0Q4rPAs0ajRURERKRSK0spyAygXzHtE/DJ9ivA4pJONrNbgIeBe51z/y5rYIF67AuBlc659WU9T0REREQkHA6YWDvnMoCJwe1mBrDCOTcx8H0LYAnwoHPuwUDbJcBwYDQw3sz6FLnENufc3EC/S4FzgS+BVUAD4A9AT+DSg3tppcvMzmX6yq10bZJMnVqxFXELEREREQmjnbvzmLduG9GRETRPSyAlIaZC7xfyzoulMCCSfctLBgbaBwYeRX0LnBT4ehl+Cb4ngDRgJ/AzMNA593U5xrjHkvQsrn3tZ1675mj6dahfEbcQERERkQqwIyeP7Nx8CpzDOShwjgIHm7NymLk6k1mrMpi1OpNFG7dTUKSgOCkuiuZ1EmielkCztASuOKYFzdISyi2ug06snXMW9P1y9tZEF7ZdA1xThmtNBvofbCwHIyU+GoCM7N2H87YiIiIicgj+t2gTg9/4mZy8ghL7pCXG0LVpMgOObEjXJsnkO8eqLTtZGXjMX7+dsXM3cm638t2vsDxHrKuU1MBHAVt35IY5EhEREREpi8zsXIb+dyZNU+O55riWmBkRZphBhEFSXDRHNkmmaWp8YdlyiQoKyn9tjBqbWCfFR2MGGTs1Yi0iIiJSFfx95BzSs3J46arj6No05cAnlCIiovTE+6CuWe5XrCIiI4zk+GgysjViLSIiIhJO6zKzmbx0c6l9vp6znk+mr+EP/doeclJdUWrsiDX4OuutO5VYi4iIiITDrtx8/vP9Up6dsITs3HyuPb4l957RkajIfcd+N2flcO+IX+ncOImb+7cNU7QHVrMT64QYlYKIiIiIhMH4+Rv4+8i5rNi8k4GdG1I/KZbXJi1n4YbtPHNpD1IT/Xw45xz3jpjNtuw83vldd6IjK2/BRY1OrFMToknPygl3GCIiIiI1xvJNO3hw1FzGz99Im3qJvDW4Nye0qwdAlybJ3DtiNuc+O4mXr+pF+4a1+XzmWkbPWc9dp3egfcPaYY6+dDU8sY5h0cascIchIiIiUi3sys1nxeadLNu0g2WbdrA+M5v0rBw2bd/Npqwc0rfnsD0nj8SYSO45owPXHNeKmKi9I9AX9mpGm/q1+P1b0zjvuUnce2ZHHvtqPj1bpHL9Ca3D+MrKpkYn1skJ0WSoxlpEqiEzawb8CzgVv8fAWOBW59zKA5zXAnga6I7fuGsHMBt4zDn3VVDfktaqOso5N+PQXoGIVBUT5m/k1UnLWJq+g7WZ2bigDVnq1o6lXq1YOjZO4sRasTRIiuO3PZrQICmu2Ov1aJ7KyJv7MuStadw7Yjbx0ZE8eWE3IitgFY/yVqMT69SEGLJy8tidV7DPX0siIlWZmSUA44Ec4GrAAQ8DE8ysq3NuRymn1wI2AfcBq4Ek4HrgSzM73zn3SVD/14EXg9oWHvKLEJFKb3deAcPGLOCl75bSPC2Bo1um0rJuU1rVTaR13Vq0rJtA7bjog7p2g6Q4PhjSh+FjF9G9WTIt6yaWc/QVo4Yn1v4/dmZ2LvVqx4Y5GhGRcnM90Bpo75xbDGBms4BFwA3AUyWd6JybAwwu2mZmXwDLgGuB4MR6TWD3XBGpQVZt2cnN7/3CjFUZXNmnBfee2ZG46MhyvUdcdCR3nd6hXK9Z0Wp0Yp0c2H0xY+duJdYiUp2cA0wuTKoBnHPLzGwScC6lJNbFcc7lmVkmoNo5EWH07HXc+dEsnIPnLu/BGV0ahTukSqNG1z8UjlhrLWsRqWY64+uig80BOpXlAmYWYWZRZtbQzO4HjgCeLabrjWaWY2Y7zWy8mZ1w8GGLSGWVlZPHD4s3cfcns/j929NpVTeRL245QUl1kBo9Yp0aGLHeqrWsRaR6SQO2FtO+BUgt4zUeB24PfJ0FXOKcGxfU521gFLAWaAHcAYw3s1OdcxODL2hmQ4AhAM2bNy9jGCJyuOUXOJZtyuKXlRn8siqD6Su2snDDdgocmMHgvq34y8AOmp9WjBqdWKcU1lhrxFpEqp/iVuwIZUr9cOB9oCFwFfCumV3gnBu15wbOXVmk//dm9hl+pPxhoO9+ATn3EvASQK9evUpaUUREDiPnHEvSs5i1OpNf12Qye00mc9ZuY+fufABqx0VxVPNUBnRuSI8WqXRvmkJywsFNSKwJanhirRFrEamWtuJHrYOlUvxI9n6cc6vxq4IAjDKzicAw/Ah1SedsD0x0HFxSHxGpPOaszeShUXOZvHQLAPHRkXRunMRFvZrRpUkyXZsm06ZeLSKqwDJ3lUWNTqwTYyKJjjTVWItIdTMHX2cdrBMw9yCvORW4tQz9jOJHy0WkkkjfnsNT3yzg/Z9XkRIfzf1ndeKEdnVpU69WlVgrujKr0Ym1mZGSEENmtkasRaRa+RwYZmatnXNLAcysJXA8cFeoFzOzCHxpx5ID9EsCzgR+CvUeIlLxcvLyeW3Scp4Zv5hdufkMPr4VN5/cjuR4lXaUlxqdWAOkxEezdYdGrEWkWnkZ+CPwmZndhx9BfghYRZHNXAK7LC4BHnTOPRho+xu+jGQSsB5fYz0Y6A1cVuTcoUB7YAJ7Jy8ODfS/vEJfnYiUyjnHxu05LEnPYkn6DpamZ7E0fQdz1m5jU1YOp3Sszz1ndKR1vVrhDrXaqfGJdWpCjGqsRaRacc7tMLP++C3N38KXZ4zDb2meVaSrAZHsu/TqdHzJxyVAMj65ngmc4JybVKTfAuC8wCMZ2IZPxgc756ZUxOsSkdJl787n4+mreW3SMpak791gNT46ktb1EjmuTR0u7NWUE9rVC2OU1VuNT6xTEqJZsXlnuMMQESlXzrmVwPkH6LOcoJVCnHOf40tJDnT9kcDIQwhRRMrJ+sxdvPnjct6dspKMnbl0aZLMA2d14ogGtWldL5GGSXGagHiY1PjEOjUhhpmrM8IdhoiIiEiZOOdYk5HN9JUZjJ+3gVGz1pHvHKd1asDgvq05umUqZkqkw6HGJ9YpCdFs3ZmLc06/hCIiIlIpLVi/ne8WpjN95Vamr9zKhm05ANSKjeLKY1tw7XGtaF4nIcxRihLrhBh25xWQnZtPQkyN/3GIiIhIJeKc4/UflvPQqLkUOGiaGk+f1nXo0TyVni1S6dCwNlGR2gGxsqjxmWRqYPegrTtzlViLiIhIpZGbX8DfPp/DOz+t5LRODXho0JE0SIoLd1hSihqfSRbuvpixczdNUuLDHI2IiIgIZO7M5aZ3pzFp8WZ+/5s23DmgvSYgVgFKrAMj1hnafVFEREQOk01ZOUxckE7DpDja1q9Fg6TYPXO9lm3aweA3fmbVlp08cUFXLuzVLMzRSlnV+MQ6NTBirbWsRUREpKIt37SDl79fykfTVpOTV7CnvXZsFG3q16JNvVqMm78BA975XR96t0oLX7ASMiXWGrEWERGRCjZrdQYvfruUr2avIyoigvN7NuGy3i3YnpPLko1ZLNqYxeKNWXy3KJ1mqQk8c9lRtKiTGO6wJUQ1PrFO3pNYa8RaREREDt6C9dv5duFGMnbmkpmdS0Z2Ltuyc0nfnsP89dupHRfFDb9pw7XHtaR+kUmIx7WpG8aopTwdVGJtZqOBAcA/nHP3HaBvHPAQcAWQAswA/uKc+y6oXwTwF+AGoCF+u9wHnXMfH0yMZRUbFUlCTCRbNWItIiIiB2Hrjt089c1C3vlpBQUOoiKM5PhokuOjSYqPpkFSHL/t0YRLezendlx0uMOVChRyYm1mlwLdQjjlFeBM4A5gKfAH4GszO9Y5N6NIv4eAocC9wDTgEuC/ZnaWc+7LUOMMRWpCjGqsRUREJCR5+QW8O2UlT32zkG3ZuVzRpwU3929H3Vox2nSuhgopsTazFOBfwJ+Bd8vQvxtwGXCdc+61QNu3wBzgQeCcQFt9fFL9qHNuWOD0CWbWFngUqNDEOiUhmkyNWIuIiEgZ/bBkEw+OnMv89ds5tnUd/npOJzo0TAp3WBJmoW7V8zgwxzn3Xhn7nwPkAh8UNjjn8oD3gQFmFhtoHgDEAG8Hnf820MXMWoUYZ0j8tuYasRYREZEDe3/KSi57+Se278rj+ct78O71xyipFiCEEWsz6wtcRWhlIJ2BZc65nUHtc/CJdNvA152BHGBxMf0AOgHLQrhvSFISYliXsa2iLi8iIiLVxDdzN3DPiF85qX09XriiJ3HRkeEOSSqRMo1Ym1k08CIwzDm3IITrpwFbi2nfUuR44XOGc84doF9wXEPMbKqZTU1PTw8hrH2lJkSTka1SEBERESnZ1OVb+OO70+nSJJnnLu+hpFr2U9ZSkL8A8cA/Qry+AcHJcmH7wfTbh3PuJedcL+dcr3r16oUY2l4p8TFk7NxNQUFxIYiIiEh1l5tfUOrSu4s2bGfwG1NpnBLPq9ccTUJMjV+xWIpxwN8KM2uOX6njd0BskbpoAt+nANudc/nFnL4FaF5Me2qR44XPqWZmQaPWwf0qREpCNAUOtu/K27OutYiIiFR/efkFfPLLGp4et4g1Gdmc2K4elx/TnP4d6hMV6ccf12Vmc9WrU4iJiuDN63pTp1bsAa4qNVVZ/txqDcSx/8RC8Ct5DAWOwq9PHWwOcJ6ZJQTVWXcCdrO3pnoOEAu0Yd86606B57lliPOgFd3WXIm1iIhI9Zdf4Bg5cy3/N24RyzbtoEuTZM7s2ohPf1nDkLem0TApjkt6N+P0Ixtx83vT2b4rjw9u6EOztIRwhy6VWFkS6xlAv2LaJ+CT7VfYf9Jhoc+BvwMXAm8AmFkUcDEwxjmXE+g3Gp9oXx7oX+gKYLZzrsImLgKkJgZ2X1SdtYiISLXmnOOr2ev51zcLWbQxiw4Na/PSlT05tVMDzIw7TmvPuPkbeeenlQwfu4jhYxcRHWm8cW1vOjdODnf4UskdMLF2zmUAE4PbAwufr3DOTQx83wJYgt8t8cHAuTPM7ANgeGAC5DLgRqAVPokuvMdGM/sXcLeZbQem45Pv/sC5h/D6yiQ5fu+ItYiIiFRPU5dv4eEv5jFjVQZt69fi2ct6cPqRDYmI2DulKyoyggGdGzKgc0NWbt7JR9NXc1SzFI5rq23H5cDKs/LegEj2nxB5LX7S48P4Lc1nAgOdc9OD+t0LZAF/Yu+W5hc550aWY4zFSg2Uf5Q2aUFERESqphWbd/DoV/P5avZ6GiTF8vgFXTm/R1MiI0rfHbF5nQRuO/WIwxSlVAcHnVg75yzo++UUs4qHcy4buC3wKO16+fjk++GDjelgFdZYZ2j3RRERkWojY+dunh63mLcmLyc6MoI/n3IE15/YSit6SIXRbxaQFB+NGWxVYi0iIlItzF6Tye/emMrG7bu4+Ohm/PmUI6ifFBfusKSaU2INREYYSXHRKgURERGpBsbO3cAt7/9CSnw0n/+xL0c20aRDOTyUWAekJkRrxFpERKSKe23SMh4aNZcjmyTzn6t6aZRaDisl1gEpCTEasRYREami8vILeGjUXN74cQUDOjfgXxd3Vy21HHb6jQtISYhmc5YSaxERkapm4/Zd3PnRLCYuSGfIia25a2CHfZbQEzlclFgHpCbEsHhjVrjDEBERkTLYsmM3X81ex6iZ6/hp2WbMjH+e14XLjmke7tCkBlNiHZCSEK3l9kRERCqxnLx8Rs5cx+cz1zJp8SbyCxyt6ybyx35tOad7E9rWrxXuEKWGU2IdkJoQQ1ZOHrn5BURHBu9xIyIiIuGSk5fPh1NX8/yExazN3EWztHiGnNias7o2olOjpMLdoEXCTol1QMqe3RdzqVc7NszRiIiISE5ePh/+vIrnJi5hXeYuejRP4ZHzu3Jiu7pKpqVSUmIdkLJn98XdSqxFRETCbNSstfzji3msy9xFrxapPH5BV/q2VUItlZsS64DUwhHrbNVZi4iIhNPo2eu55b1f6NIkmWEXduO4NnWUUEuVoMQ6ICXej1hv3aEl90RERMLlp6WbueX9X+jeLIV3fteH+JjIcIckUmaapRdQtMZaREREDr/567fxuzen0jwtgVeuPlpJtVQ5SqwDUhMDI9bafVFEROSwW711J1e/OoXEmCjeuK73nn+XRaoSJdYBiTGRREeaaqxFpFows2Zm9pGZZZrZNjP7xMwOuHOGmbUws8/MbIWZZZvZJjObaGanF9M3zsyeMLN1gb4/mtmJFfOKpDrbsmM3V706hezd+bxxXW+apMSHOySRg6LEOsDMSI6PIUMj1iJSxZlZAjAe6ABcDVwJtAMmmFniAU6vBWwC7gPOAAYDWcCXZvbboL6vANcDDwBnAeuAr82sezm9FKnmCgocizdu57rXf2bN1mxeueZo2jesHe6wRA6aJi8WkZoQzdYdGrEWkSrveqA10N45txjAzGYBi4AbgKdKOtE5NwefTO9hZl8Ay4BrgU8Cbd2Ay4DrnHOvBdq+BeYADwLnlO9LkupgU1YOU5dvZebqDGauyuDX1Zlsz8kjwuD5K3pydMu0cIcockiUWBeRmhBDRrZGrEWkyjsHmFyYVAM455aZ2STgXEpJrIvjnMszs0yg6MjDOYHvPwjq9z5wl5nFOudyDuVFSPUybcVWLv/PZHblFhAdaXRslMSgo5rQtWkyvVul0aLOgT5MEan8lFgXkZIQzcotO8MdhojIoeoMfFZM+xzgwrJcwMwi8OWCdfEj4EcAfwq6xzLnXPCb5hwgBmgb+FqE5Zt2cP2bU2mYFMeTF3Wnc+Mk4qK14odUP0qsi0hJiGbmao1Yi0iVlwZsLaZ9C5Baxms8Dtwe+DoLuMQ5N66M9yg8LsLWHbu59vWfcc7x2rW9aVVXI9NSfdXcyYubFsNnf4D0BXuaUhNi2LozF+dcGAMTESkXxb2RhbJ13XDgaOBs4CvgXTM7K+haId3DzIaY2VQzm5qenh5CKFJV7crNZ8hbU1mTkc3LV/VSUi3VXs1NrPNz4Je3Yf2ve5pSEmLYnVfArtyCMAYmInLItlL8iHEqxY8y78c5t9o5N9U5N8o5dxEwGRhWpMuWUu5ReDz4mi8553o553rVq1evLGFIFVZQ4Ljjo1n8vHwrT13UjV6amCg1QM1NrFNb+uety/Y0Fe6+qE1iRKSKm4OvgQ7WCZh7kNeciq+bLnqPVoGl/YLvsRtYjNRow8YsYOTMtdx1egfO6to43OGIHBY1t8Y6JhFqNYQtexPr1CKJdWMtTi8iVdfnwDAza+2cWwpgZi2B44G7Qr1YYCJjX2BJ0D3+jp8M+UagXxRwMTBGK4JUfxu37+K/U1czccFGzIzYqAhiIiOIiYogr8DxzdwNXNq7OTec2DrcoYocNjU3sQZIaw1blu75NiXBb5+auVNrWYtIlfYy8EfgMzO7D18L/RCwCnixsJOZtcAnyw865x4MtP0NX+IxCVgPNMSva90bv241AM65GWb2ATDczKLx61zfCLQCLq/g1ydhUlDgmLRkE+/+tJJv5m4gr8DRrWkycdGRZOXksTuvwD/yCzi/R1MeOrczZqGU9otUbUqsF4/d821qILHeqsRaRKow59wOM+sP/At4Cz+hcBxwq3Muq0hXAyLZtyxwOnArcAmQjE+uZy5CJQkAACAASURBVAInOOcmBd3qWuAfwMNASqDfQOfc9HJ/URJ2b09ewcvfL2XF5p2kJkRz7fEtubR3c1rXqxXu0EQqjRqeWLeErPWwewfEJKrGWkSqDefcSuD8A/RZTtAqHs65z/FlHmW5RzZwW+Ah1djo2eu579PZ9Giewm2nHsGAzg21DrWET34eLP8OWp4AkdHhjmYfNXfyIvgRa9hTZ12YWGcosRYREQFgy47d3Pfpr3RqlMQHNxzLud2bKKmW8MnPhY8Hw1vnwVd3Hrh/Xo5fXnnS/0FBfoWHV6bE2swGmNl4M1tvZjlmttrMPjSzTgc473UzcyU85gf1Lalf90N5gaXak1j7OuvYqEgSYiLJUCmIiIgIAH/9fA6Z2bk8eVE3oiNr9nhcuXEOfnkHnjsOfn7l0BK+gnzIyYIdmyBjld+nY/2vkL4QcrPLL+bKIG83/PcamPspNOsDU1+Faa+X3L+gAD69yS+v/M0D8Oa5kLmmQkMsaylIGjANeA5IB5rjZ5ZPNrMuzrkVJZz3EPBCUFtL4D2K/6jxdYpMrAlYWMYYQ5fayj8XXXIvPlo11iIiIsCXv65j5My1DD3tCDo2Sgp3ONVDdgaM+jPM+QQS68EXt8H0N+CMJ6HZ0WW/Ts52GPcQTH0FCvJK7pdYD5KbQUpzSG0BPa/ZO7BYmaz4ATYtgs7nQVwxv2t5OfDh1bDwKxj4KPQeAu9cCF8MhXodofkx+58z7u8w+yM4+a9Qqz58eSe8cDyc82/oeHaFvIwyJdbOuffwyfAeZjYFmA9cADxZwnlL2Hd5Jszs1MCXbxRzyhrn3OSyxFQu4lMgPm2/lUFUCiIiIjXdpqwc7vt0Nl2aJPP737QJdzhVQ0EB5O6A2NrFH1/xI3xyPWxbC/3vh75/hjkjYMx98Mop0P0KOOVvUOsAGyjN/wK+vMNf56jLoe4REBUP0XEQFXjkZkPmSj+KnbESNsyGBV/CtDfg4reh1Qml3yN3F2RtKP5YVKy/R3Q8RMbAwa784hws+w6+fRxW/M+3jbkfel8PfW6ExLp7Y/nwSlg0Bs4Y5o8DnP8feLm/PzbkW0hqtPfaP/8HJg2HXtf5n7OZH+X+eDB8cAX0vBYG/BNigpfiPzSHMnlxc+A51OHdq4Bpzrk5h3Dv8hO05F5qYrQmL4qISI3mnOP+T2eTtSuPYRd2I0olIAe2/lf49Eb/XKcdNDvGj6I2O8bnGt894R8pzWHwGGjay5/X5QI4YoA/9uOzMG8k9Pk9NO0Njbr6kdZC29b6hHr+KKjfGS56c+91ymLLMnj3YnhrEJz5FPS8ev8+zsGv//UJbtb6MlzUfIKd0hzOfrr4kePi7rFknE+oV/3k9xUZ+Cg07gE/PgPfP+l/Fj2u8kn0V3fCkvFw1nDode3e6ySkwSXvwn9O8cn1NV/4pH/+l/7ndMRAOP2JvYl/3bYw+BuY8LCvuV4xCS56C+p3KNOPryxCSqzNLBK/NFML4FH8Mkzvh3D+8fidu24pocuNZnYHkI/fPvevzrnvQ4kxZGmtYeXeQfKUhBjWZW6r0FuKiIhUZqNmreOr2eu5c2B72jcsYfS1upn7Ocz9DJr3gbanQFqrsp2Xn+sTwe+e8J+Cn3A7bJjrR4dnvO37RMZCfg50uxROf3z/UofY2nDqg37EevRd8O1je4/VbgQNu/odo2e8CwW5flT72D+GviJGWiv43Te+TnnkLbBpob9vRGAy6vrZPiFd+QM06Qn97oGI4FTR+bKMvF1+VLzwed5IeP2MvbGVNIq99FtforFmGiQ18SPQR13pR9vBJ+bpC33iO/UVmPIiYHDus3DUFftfr0EnOO95+PAq+OJ2PxL90XXQqBtc8CpEBsUfFeNfc+t+MPpuiC3f5SJDHbH+CegZ+Hox0N85tzGE86/Cj3C/V8yxt4FRwFp84n4HMN7MTnXOTQwxzrJLa+X/MsvLgahYUhOi2ZylEWsREamZ0rfn8MBns+nWLIUhJ1TCWtxQbN/gRzDjU0rvN/kFGP0XiKnla3LBD7y1PcU/mvTyo6PByeK6WfDZTX6UusuFPmlOSPPHnIPNi/2I7Jrp0LIvHPnb0uOodwRc+Ymvw17/K6ybCetn+efFY6H1b+DMJw+tRjouGS77L3x9tx8d3rzYX3PS0/DzyxCX4keej7oSIkL4pOLEO/zqG2Pug+WTYNBze38W4JP2sX/1ryOpqR997n6Z/+9T3M9h0LPQ726Y8jI0Pgo6Dyr53p3OhROGwvfDYPbHfpT/sg/9LtsladMPbvwhtNdYBuacK3tns45AEtAaGAo0APoG1kI90Lmx+BHuCc65A/xmgZnVBmYDq5xzfUvoMwQYAtC8efOeK1aUNIeyFDPfhxE3wB9+hnpH8Or/lvHgqLlMuedk6ifFhX49EZEQmdk051wIn+dWfb169XJTp04Ndxg1nnOO1VuzmbEqY89j9ppMHPDlLX1pW7+KjlZnbfSjvtNeh+hEGPCwTxSDE2PnYPzDPiHrcJav2d221id/i8fCsu8hL7CyRmyyH4xLa+0febvgpxf8KPVZ/4KOZ1XsayrI3zuyXF6mvAxf/QVcgf/Z9LoO+t27b0IcCuf8z2TM/X6k/cLXoFYDmPBPmPmeH6k/YaifeBhdzjlWQQF8cLn/Q+a6r6Fuu/K9fhGlvWeHNGLtnJsX+PInM/sKWI5fHeT3ZTj9XPzOXMVNWizuXtvN7Av8Vrol9XkJeAn8m3RZrrufwr/6ti6DekfQubH/eGbO2m1KrEVEpNqasmwLN783nQ3bcgCIjYqgS5NkruzTgtO7NKyaSXVOlq/N/eFpX57Q4yq/0sTnN/tPp89+em+JR0G+X51j+hs+6T5ruC8bqNPGP465wU+aWzXZl3ZsWeofa3/xJSMuH7pcBKc/dvCJaCjKO6kGX7+c1hpmvAPH/8mXTxwKMz/psGlvX27y6kCwwIjwcX+EvrdV3M8qIgIufsf/IVTaSHUFO+jJi865DDNbjK+ZLourgU3AlyHcxoCDS5jLqnDJvcAExk6BxHruum3061C/pLNERESqrMUbs7j+zamkJcbw0KB2HNUshfYNa1fddarzcnxyOOER2LEROp7jl1ir29aPZE5/HcY8AM8dCyff75ec+2SInwR4wlDof1/xNcHRcdD6JP8oKj8XdmXuXbWiKmt7sn+Up6Y94fff+dHwyGj4zV2Q0qx871GciIiwJtVwCIm1mTUAOgDvlLHvacBzzrkyrSJiZknAmfi67oqTWBdiau9JrGvHRdOiTgJz1mZW6G1FRETCYeP2XVzz2hSiI403r+tNs7TyXW6sXDgHC0fDtjV+4l6DzvsnTLu2+eXX5o+CRd/A7ixofixc8g406723X0SEL3FoN8CvGf31PTDxUcjZ5muij7kh9Pgio6tHUl2R4lPhty+FO4rDrkyJtZmNAKYDs4BtwBHAn4E8AmtYm9lvgHHAdc65N4MucXngXsWWgZjZUKA9MIG9kxeHAg0D51YcM/+x0Ja9m8R0apTEnLVaGUREpKIsWLCAk046aZ+2iy66iJtuuomdO3dyxhln7HfONddcwzXXXMOmTZu44IIL9jt+4403cvHFF7Nq1SquvPLK/Y7ffvvtnH322SxYsIAbbtg/mbrvvvs45ZRTmDFjBrfeeut+x//5z39y3HHH8cMPP3DPPffsd3z48OF0796dsWPH8vDDD+93/MUXX6R9+/aMHDmSJ5/cf/uHt956i2bNmvHBBx/w/PPP73f8o48+om7durz++uu8/vrr+x3/8ssvSUhI4LnnnuPDDz/c7/jEiRPZuTuPk668neW/fE/nxklcOdanAfHx8Xz11VcAPPTQQ4wbN26fc+vUqcPHH38MwN13382PP/64z/GmTZvy9tt+BYxbb72VGTNm7HP8iCOO4KWXfJI1ZMgQFi7cd++37t27M3z4cACuGDSA1fOm+A1QAo5tFsUjF3eFRt04/+nJbN64HnZl+AQ8MpqT+3Tn/gf/Ca1P4vQzziA7e98dB8866yyGDh0Kl77PSb2PhMzVkNwUJvptOvS7V/G/ewDDhg1j1KhR+xyrVL97V1zB6tWr9zl+7LHH8sgjjwBw/vnns3nzZkpT1hHrycBFwO1ADLAKmAg8UmTiouGX4ivuc6SrgdnOueklXH8BcF7gkYxP3icBg51zU8oY48FLa+VnqwZ0bpzEV7PXs21XLklxIS5lIyIiUgnl5Rdw87u/sGHbLto1qEVi7KFsZREiV+A3JpnyEixcA5lRfvWJ2ER8+gBsnAdj/wZLJ0BelJ98FpfiR6Kb1YG0hn7d4fRFkBsLSY0hoY5fqq7DKX6VhwMx8zsRJh5gAxaRgxTSqiCV2SHNMB/7N/jh33DvBoiMYsL8jVz7+s98eMOx9G51GCYkiEiNplVBpKI557j/s9m8PXklDw06kiv7tDg8N87Pg18/9Ct0bF3uJ8fl58HGwB5xccnQ8gRf5vHrf31pZt9b/QS46Pjir5mz3S+Ld7C7/YkconJbFaTaSmsNBXmQuQrSWhVZGSRTibWIiFR5L3y7lLcnr+T3v2lzeJLqgny/nvDER2HLEp9QX/YhtDvNJ8RZG/1W1ksn+A1DsjbAMTfCiUMPvGpESduFi1QCSqxh3yX30lpRr3YsdWvFqM5aRESqvP98v5THRs/n7G6NuXNA+4q5ye4dfhOUVZNh1RT/2JUBDY70W063P2PfEeZa9f1W3l0u8HXSBfn775AnUgXptxj2XXKvTX/MjE6Nk5VYi4hIlfbCt0t49Kv5nNGlIU9d1I2IiHIonygogM2L/JbUa6bB6ql+l0CX74/X6wCdzvGrcLQ/48A725kpqZZqQ7/J4HcHiorbZ2WQzo2TePm7peTk5RMbVQGLsouIiFSgZ8YvYtiYhZzdrTH/uqgbUYeyRvXGeTD7Ez8iveYX2B1YsSOmNjTuDn3/DM2OgWZH+2XWRGooJdbg/5pObbVfYp1X4Fi0IYsjmySHMTgREZHQDB+7kOFjF3HeUU144oKuB5dUb13h66R//chPNrRIaNQVul0MTXr6R512Bx6RFqlBlFgXSmu1Z5MYgM6NfTI9d+02JdYiIlIlOOd46puF/Hv8Yi7o2ZTHzu9KZCjlH1npMPdTv0LHqsD+bM2OgTOGQadBUEvL1ImURol1obTWsGS8rx2LiKBFWgKJMZGBHRgPwzacIiIih+jf4xfz7/GLubR3M/4xqEvZaqp3bYP5X/hkeulEXytdvxOc/AAceT6ktqzosEWqDSXWhdJaQd4uyFoPSY2JiDA6agdGERGpIkbPXsdT3yzktz2alC2p3rwExj8EC77y//6lNIfj/+RX6mjQ+fAELVLNKLEuVHRlkKTGgK+z/mjaagoKXPnMpBYREakA89dv47YPZ3JU8xQe+e0BkmrnYOZ78OUdvm66x1XQ5UJoerQ2XRE5RJpxUKhwLeugOusdu/NZsWVnmIISEREp3ZYdu7n+zanUjovixSt6lr6SVXYGfDwYPr3Rb9py0w9wxhPQrLeSapFyoBHrQsnNICJqn5VBOhXZgbFV3cRwRSYiIlKs3PwC/vDOdDZsy+HDG46lflJcyZ1X/gQf/w62rYH+90Hf2yBCy8mKlCeNWBeKjIKUFvuMWLdrUIuoCFOdtYiIVEr/+GIePy7dzCPndaF7s5TiO6UvhDH3w2sD/dJ4130NJ96hpFqkAmjEuqigJfdioyJp16C2EmsREal0Pvx5Fa//sJzBfVtxfs+m+x5MX+iXzZvzqV+DGqDbpXD64xCXdPiDFakhlFgXldbaf1Tm3J5as86Nk5i4YCPOOUz1ZyIiUglMnjaduiNvZ3Tybo7YlAZvRUFEtC9p3LoMNs4FDJr3gYGP+S3GAxPzRaTiKLEuKq2136Z152ZIrAtAp0Z+ZZD07Tml166JiIgcBmNmLKXp59fQNWIj0fV7EFGQC7k7oSDPPxLqKJkWCRMl1kUVXXIvkFh33jOBcZsSaxERCasR01fBiJvpELmS7AveIfrIM8MdkogUocmLRRWz5F7RlUFERETC5Z2fVjDrk8c5L/J/5J3wFxKVVItUOhqxLiq1BWD7LLlXOy6aFnUSNIFRRETC5j/fL2XMl5/wXuzb5Lc7nZh+fwl3SCJSDCXWRUXFQnLTfUaswZeDzF6jxFpERA4v5xzDxy7ig3GTGZP4DBHJrbHzX/TL5olIpaP/M4MFLbkHfgLjyi072bYrN0xBiYhITbMrN58/vT+D58fN5YPU56kdmYtd8g7EJYc7NBEpgRLrYGltYPMiKCjY09S5sX8Tm6dyEBEROQzWZ+7iwhd+ZOSsNYxoOYIW2XOxQc9B/Q7hDk1ESqHEOliL42BXJqybsaep6MogIiIiFemXlVs5+5n/sTQ9i9G9Z9N5/ad++/FO54Y7NBE5ACXWwVr3889Lxu1pqp8UR4OkWKat3BqmoEREpCYY8ctqLn5pMvHRkYw5YwftZz4KHc+B/veHOzQRKQMl1sFq1YNG3WHxuH2af3NEPb5fmE5efkEJJ4qIVA5m1szMPjKzTDPbZmafmFnzMpzXy8xeMrP5ZrbTzFaa2Ttm1qqYvsvNzBXzGFQxr6r6e/PH5fz5g5n0aJ7CqAtq0WTcH6HxUXCeJiuKVBX6P7U4bU+BVVN8SUhAv/b12bYrj19WZYQxMBGR0plZAjAe6ABcDVwJtAMmmFniAU6/BOgMPA2cDtwF9ACmmlmzYvp/DRwb9Pi2HF5GjbNow3Ye/mIe/TvU560Lm5E04kq/g+Kl70NMQrjDE5Ey0nJ7xWl7Mnw/DJZ+67eEBY5vV5eoCGPC/I0c3TItzAGKiJToeqA10N45txjAzGYBi4AbgKdKOfcx51x60QYzmwQsC1z3gaD+m5xzk8sr8JoqN7+A2z6cSa3YKB47uzXRHwyCnCwY/DXUbhDu8EQkBBqxLk7ToyE2CRaP3dOUFBdNr5apTFiQXsqJIiJhdw4wuTCpBnDOLQMmAaXOfgtOqgNtK4B0oEk5xykBz05YzK9rMvnnoI7UG/NH2DAbLnwNGnQOd2giEiIl1sWJjIZWJ/o6a+f2NPdrX59567axPnNXGIMTESlVZ2B2Me1zgE6hXszMOgL1gXnFHD47UIudY2aTVV8dulmrtjJhwje82HQ0A787HxZ8Cac/Du1ODXdoInIQlFiXpO0psG01bFq4p6lfh/oATFywMVxRiYgcSBpQ3BJGW4DUUC5kZlHAC/gR61eCDo8EbgYGAJcDu4ARZnZFKdcbYmZTzWxqenoN//Rv5WTyvriT+q/25rPoezht89u+pvrcZ6H39eGOTkQOUpkSazMbYGbjzWx9YGRitZl9aGaljn6YWcsSZo07M0sJ6htnZk+Y2TozyzazH83sxEN5cYek7cn+uUg5SLv6tWiSEs8EJdYiUrm5YtrsIK7zDHAccIVzbp9k3Tl3s3PuTefc9865j4CTganAIyUG5dxLzrlezrle9erVO4hwqoGCfPj6Xnh1AEx9jdl5TVhwzCPY0EVw7ZdwVIl/l4hIFVDWEes0YBrwR+A04G78x42TzaxFGc5/hP1njm8P6vMKeyfHnAWsA742s+5ljLF8pTSHukfsk1ibGSe1r8f/Fm1id56W3RORSmkr/j07WCrFj2QXy8weAYYA1znnxhyov3MuH/gv0NTMGpX1PjVKznZ4/zL48RnWdbiabrteYGLPf9P+9JsgsW64oxORclCmVUGcc+8B7xVtM7MpwHzgAuDJA1xiaWkzx82sG3AZ/g38tUDbt/iawAfxk3EOv7anwNRXITcbouMBX2f9zk8r+Xn5Fo5vqzdCEal05uAHPoJ1AuaW5QJmdi9+qb1bnHNvhXDvwlHx4kbMa7aMlfDuJZA+n+xTH+eiSe2om2bcc0bHcEcmIuXoUGqsNweec8shjnMC1/mgsME5lwe8Dwwws9hyuEfo2pwMebtg+aQ9Tce1rUNMZAQT5qscREQqpc+BPmbWurDBzFoCxweOlcrMbgEeBu51zv27rDcN1GNfCKx0zq0PMebqbdUUeLk/ZK5m96Ufcu2crqzP3MVTF3UnIUar3opUJyEl1mYWaWYxZtYOeBFYj09+D+QRM8sL7AL2uZl1CTreGVjmnNsZ1D4HiAHahhJnuWl5PETF7bO9eUJMFMe0TlOdtYhUVi8Dy4HPzOxcMzsH+AxYhX/fBsDMWgTelx8o0nYJMBwYDYw3sz5FHp2K9LvUzN43s6vMrF/gvAlAT+Avh+NFVhlzRsDrZ0FMLdzvvuGO6XWYvHQLT1zQjZ4tQppLKiJVQKgj1j8BOcBCoCvQ3zlXWoaZg38jvwHoBwwFugA/BJZwKlTaLPbC44dfdDy0OH6fOmvw5SBL0newcnPw3wEiIuHlnNsB9Me/T78FvIPf4KW/cy6rSFcDItn334GBgfaBwI9Bj+eK9FuGX4LvCWAM/n0+BxjonCvLYEvNkLESRtwIjbrB78YxbLrjsxlruWNAewYdpWXBRaqjUBPrK4E++HrobcA3gY8Yi+WcW+ec+71z7pPAzPGXgRPx9Xf3FulqHMQs9sOydFPbk/2Sexkr9zT1L1x2b6FGrUWk8nHOrXTOne+cS3LO1XbODXLOLQ/qs9w5Z865vxVpuybQVtzjpCL9Jjvn+jvnGjjnop1zyc65U5xzXx+2F1kVfH2Pf77gVd6dvYNnJyzh0t7NuemkNuGNS0QqTEiJtXNunnPup8BkxpOBWvgJLqFcYxXwP+DoIs1bKHkWe+Hx4q5V8Us3tT3FPy/eWw7Ssm4ireomqs5aRESKt2gszBsJJw5lwvpY7v9sNv3a1+OhcztjdjArH4pIVXDQkxedcxnAYg6u/jl4hHoO0MrMEoL6dQJ2B+4THnWPgKSm+5WDnNS+Hj8s2cyu3PwwBSYiIpVSXg58dQektWFOy6v4w7vT6dioNs9c1oOoSO3LJlKdHfT/4WbWAOgALAnxvOb42ek/FWn+HIjGzygv7BcFXAyMcc7lHGych8zMl4Ms/Rby9y6A0q99fXLyCvhx6eZSThYRkRrnh3/DlqXsOvVRhrw7m9SEGF69+mgSY7UCiEh1V6b/y81sBDAdmIWvrT4C+DOQR2ANazP7DTAOvxb1m4G2J/HJ+4/4LXHb4zeXKQD+WXh959wMM/sAGG5m0fiJMTcCrfBb5YZX21Ng+huw+mdocRwAvVulER8dycT5G+nXvn6YAxQRkUohYyV8Nww6nsMTS5qyJmMZH/3+WOonxYU7MhE5DMo6Yj0ZGAS8AXwB3AZ8C3R3zi0M9CluhvkcoC9+xvg3wN+AScAxzrkFQfe4FngNv37qF0Az/Azz6aG9pArQ+jdgkbBo7+ZjcdGRHN+2DhMWpOOc9kIQERFg9N1gxrxud/HapGVc0ac5vVqGZ2ErETn8yrrz4mPAYwfoM5GgVTycc68Cr5bxHtn4hP22svQ/rOKS/ZrW80bCyX/15SHASe3rM3beRpakZ9G2fu0wBykiImG1aCzMH0V+v/u5/est1K0Vy50DO4Q7KhE5jDSLoqw6DYLNi2HDnD1Np3ZqQITB5zPXhTEwERE5bJyDaa/DTy/CrA9h0Tew6mdIX+AnLNZpy6sFZzJ33TYePLczSXHR4Y5YRA4jzaQoq47nwJdDYe6n0PBIABokxXF827p8+ssa/nxKOy2hJCJS3c3+GEb+qcTDG899jyc/Wc5pnRow8MhGhzEwEakMlFiXVa16fhfGOZ9Cv3v3lIMM6t6E2/87k+krt9KzheroRESqrd074Zu/QsOucOUI2JUJ2Vv3PFxMIrdPqkNURAZ/P7dzuKMVkTBQKUgoOp0LmxfBxrl7mgYc2ZC46AhG/LImjIGJiEiF+/EZ2LYaBj4KiXWhThto2gvanQpdL+LT7G58v2gTdw5sT6Pk+HBHKyJhoMQ6FB3PAcyPWgfUio3itE4NGTVrHbvzCsIXm4iIVJxta+F///IDLC2P3+/wlh27eWjUPHo0T+GKY1qEIUARqQyUWIeidgNfDjL3s32az+vRhIyduUxcoC3ORUSqpXEPQkEenPpgsYcf/Woe27JzeeS3XYmI0HwbkZpKiXWoOg+CTQtg47w9TSe0rUudxBg+naFyEBGRamf1NJj5Hhz7B0htud/h6Su38uHU1Qzu24r2DbX0qkhNpsQ6VMWUg0RFRnB2t8aMnbeRzOzcks8VEZGqxTkYfRck1oe++2+zkF/geOCz2TRMiuPmk9uFIUARqUyUWIeqdgO/rfncT/dpPu+oJuzOK2D0bK1pLSJSbcz+GFZPgZPvh7ik/Q6/O2Uls9ds494zO1IrVgttidR0SqwPRqdBkD4fNs7f09S1aTKt6ybyyXSVg4iIVAu52YHl9bpA98v3O7w5K4cnRs/nuDZ1OKur1qwWESXWB6dToBykyKj1/7N35/FRVecfxz9PdhKSkEAgbGGRfUd2UURRpOKC+4oLFm2tW63+rL/a1lJbtbXWal3Afdef+y6oICKyIyj7TtghQAghkPX8/rgTCMkEJhAyk+H7fr3u65p7z537XBMmT8485xwz44KeTZmxegcbsvcGLzYREakePzxxYHq9iMgKp//x5VLyCooZc35nLRAmIoAS6yOTmA4ZAw6qswY4v0dTAD7SIEYRkdptx2qY8i9vXE3Lkyucnpu5k7dnr+OGk1vRpqEGLIqIR4n1keo8ArYthm1L9x/KqB9P7xYpfDB3A865IAYnIiJHzDn4/C6IiPJ6q8spHbDYKClWAxZF5CBKrI9Ux3O9fble6xE9m7J8ay4LN+YEISgRETlqiz6EFV/DaX+A5KYVTpcOWLxveCcNWBSRgyixPlJJTaB5/wqzgwzv2pjoSONDLXEuIlL77NsFX/we0rtB3xsrnM7OK+CR8Us1YFFE/FJifTQ6j4Cti2Dzz/sPpSTEcFr7hnw4bwP7CouDGJyIiFTZxL9B7hY49zGIrNgb/czkVeTsK+RPHq+BWQAAIABJREFU53bSgEURqUCJ9dHodhnEJcOEP3o1eT7XndSSrNwCDWIUEalNNsyFmeOg72ho2qvC6a05+3jph9WM6NGUDukV57QWEVFifTTiU2Hw/8KqSbD08/2HB5xQn85Nknh2ympKSjSIUUQk5BUXwad3QN1GcPp9fps8MXEFRcWOO87QgEUR8U+J9dHqcwOkdYDx/wtF+YA3p/WNg1qzYmsu3y7bGuQARUTksGY9B5vmw7AHvU8iy8ncnsebMzO5rE9zWtRPCEKAIlIbKLE+WpHR3hvxzjUw/an9h8/u2pgmyXGM+25V8GITEZHDy9kIEx+ANmdA5wv8Nnnsm2VERhi3aXo9ETkEJdbV4YTTof1w+O4R2L0ZgOjICEad3Irpq3bw0/rsIAcoIiKVmvIoFO2Dsx8BPwMSl23ZzQc/buC6k1rSKCkuCAGKSG2hxLq6nPUAFBfA13/Zf+iyPs1JjI3i2SmrgxiYiIhUak8W/PgadL8cUlv5bfKvCUtJiIniV6eeUMPBiUhto8S6uqS2hgG/gflvwPrZACTGRXNlvww+/3kT63bkBTlAERGpYMZYr7f6pNv8np6/LpvxC7cw+pTWpCTE1HBwIlLbKLGuTqf8Duqmwxf3QEkJANcNbIkBL05dE9TQRESknPxcb3q9DsMhrZ3fJo9MWEpqQgw3nOK/N1tEpCwl1tUpNhHOuB82zIaf3gagcXIdzuvehLdmZbIrrzCo4YmISBlzX4F92TDwDr+nf1iZxZTlWdw8+AQtXS4iAVFiXd26XeYtLPDVH73aPeCXp7Qmr6CYN2ZmBjk4EREBoLgQpj0JLQZC8z5+mzz21XLSk+K4un+LGg5ORGorJdbVLSICzn0c9u3yFhtwjk5NkjilbQNenLqagqKSYEcoIiIL3oOc9TDwdr+n563LZuaaHYwe1Jq46MgaDk5Eaisl1sdCehdv5a7Fn8D8twAYfUprtu7O50Mtcy4iElzOwdT/QMNO0Hao3ybPTVlFYmwUl/VpXsPBiUhtpsT6WBlwC2ScBF/8D2RnckrbBnRuksR/J66gsFi91iIiQbN8Amxd5PVW+5m3ev3OPL5YsJkr+mWotlpEqiSgxNrMzjKziWa22czyzWy9mf2fmXU6zHVDzOw1M1tpZnt9+6fNrKGftq6SrceRPlxQRUTCBU+DK4EPb8ac47dntCNzRx7vzVkf7OhERI5f3z8Gyc2hy0V+T7/km8XpupNa1lxMIhIWAu2xTgXmALcAQ4F7gc7AdDM71KiOXwH1gQeAYcCDwHm+6+r6af8SMKDctizAGENPSksY9hCsmQLTn2JIx4Z0b16PJyauIL+oONjRiUiYMrPmZvaume0ysxwze9/MMgK4rreZjTOzJWaWZ2aZZva6mVWYa87MIszsXjNbY2b7zGy+mfnPVEPJupmQ+YO37kBkdIXTu/cV8tasdQzv2pgm9eoEIUARqc0C+ozLOfcm8GbZY2Y2E1gCXAz8q5JLb3bObSvz9WQzWwZMBi4FXijXfoNzbnogMdUaPa+GpZ/DN2OwNkP43ZntuOaFmfzfrHWMHNAy2NGJSJgxs3hgIpAPXAs4vM6NSWbWzTm35xCXX47XafI4sBBoCvwRmG1mPZxz68q0/StwF/AHvI6Xy4F3zOwc59zn1fxY1WfqfyCuHvQc6ff027PWkZtfxC81b7WIHIGjqbHe7ttXOjlzuaS61CzfvulR3Lv2MPNmCYlNhPdHc0rrJPq0TOG/k1awr1C91iJS7UYDrYERzrkPnXMf4X1S2AK46TDXPuycG+ice8o5N9k59wbep40pvtcFwFfOdxfwkHPuEefcJOfcTcAk4KFj8EzVY+daWPIZ9B0NsRU/NC0qLuHFqWvo2yqVbs3qBSFAEantqpRYm1mkmcWYWVtgLLAZeKuK9zzVt1/s59yvfTXceb6a7lOq+NqhqW4anPc4bP4Z+/Yh7jyzPVty8nl9hua1FpFqdx4w3Tm3ovSAc241MBU4/1AX+usMcc6tBbZxcGfIWUAM8Fq55q8BXf2VjoQE3yxNnHit39NfLNjMhuy9jD6ldQ0GJSLhpKo91jPwPl5cBnQDTnfObQ30YjNLBB7DS6o/LHf6NeBm4AzgRrza7IlmNriKMYamDsO9spCpjzEgahknnVCfp79dQV5BUbAjE5Hw0hlY4Of4QuCQA879MbOOQEMO7gzpjPe7YEW55gt9+yrf55grKYF5r0OrQVCv4hR6zjmem7KKVg0SGNKhwvh6EZGAVDWxHgn0B64EcoCvzKxlIBeaWRRenXZT4HLn3EEZpXNupHPubefcFOfca8DJwEa82sDKXvNGM5ttZrO3bfNXdRJihj3kjUT/4CbuPq0JWbkFvDJtbbCjEpHwkgrs9HN8B15JR8B879vP4PVYP1/uHtnOOefnHqXnQ0vmNMheCz2u8nt69tqdzF+/i1EntyIiouIUfCIigahSYu2cW+ycm+EbzDgEqAv8/nDXmVkE8DJeb/QI59xPAdxrN/AZ4H+tWa/NOOdcb+dc77S0tEAfI3hiE+HCcbBrHT0XPsyp7dIYO3klufnqtRaRalU+4QU4kmzxv8BJwNXOubLJuh3JPYLaGTLvDYhJhI7n+D397HerqBcfzcUnNqvZuEQkrBzx4EXnXDbex4BtAmj+DHAZXk/1N1W4TWVv3rVXRn8YeAf8+Br3t13NzrxCXvx+dbCjEpHwsRP/PcYp+O/J9svMHsQryxvlnJtQ7vQOIMWswuoqKWXOVxC0zpD8XFj4AXQeATEJFU6vydrDV4u3cHW/FtSJ0fLlInLkjjixNrNGQAdg5WHa/Qv4JXC9c658XfWhrksChuPVdYeXwfdCejdaTbuXC9tGM27KKnbuKQh2VCISHhbi1UCX1wlYFMgLmNkf8D6NvN0592ol94gFTvBzDwK9T41Z/DEU7qm0DOT9uesxYOSAQy3LICJyeIGuvPiBmf3RzM43s9PM7Ca8uaiL8M1hbWanmlmRmV1T5rp7gDuBF4HlZta/zHZCmXZ3mdmzZnalmQ02s2vxRrCnA/dV29OGiqgYuPBZKNjDGHuGvQVFPPCZv0lSRESq7GOgv5ntn9rCNxZmoO/cIZnZbXhjW/7gnHuikmZfAgVA+Uz1amCBbxaS0DHvDUhp5X1i6MeERVvo3TKVRklxNRyYiISbQHuspwMj8OqkP8NLlicDPZxzpSsjGhBZ7jV/4duPAqaV2/5Ypt1SvJ6Ox4GvgEeB1cDJzrkpVXukWqJhBzjjL9TN/IYnO/zEe3PXM2V5LRiAKSKh7llgDfCRrzPkPOAjYB3eNKkAmFkLX2fIn8ocuxxv5qYv8WZlKtsZsn+mD99sUP8G7jWzO30dIk8DpwP/WwPPGLida7zVb3tc5a0rUE7m9jyWbN7N0E6Naj42EQk7ga68+DDw8GHafEu5gSvOucEBvv4nwCeBtA0rfW+EZV8wdN3jXJxyD/e+X4cJvx1EfExA3xYRkQqcc3vM7HS8xPdVvPflb4A7nHO5ZZr66wwZ5js+zLeVNRkYXObrPwC5wO14ny4uBS71vZ+HjvlvAQbdL/d7esKizQAM7ZReg0GJSLg6mpUX5WhFRMAFY7GUlvxz3xhOz/mQf41fGuyoRKSWc85lOucucs4lOecSnXMjnHNryrVZ45wz59z9ZY5d5zvmbxtc7vpi59wDzrkWzrlY51w359y7NfKAgSop8cpAWp/qd+5q8MpAOqQnklE/voaDE5FwpMQ62BLT4YYJWNuhjIl+mRNm3sf8NQGvuSMiIpXJ/OGQc1dvz81n9podKgMRkWqjxDoUxCbC5W+QP+AOroyciL16AQU5qrcWETkqpXNXd/A/d/U3S7ZS4mBoZ5WBiEj1UGIdKiIiiD3rLyzo9wjti5ay98lBsGXh4a8TEZGK8nNh4YfQ5QKI8V/mMWHhFpokx9G5SVINByci4UqJdYjp8ovRPJ7xH/bt20vxC2fDNtVci4hU2aKPDjl3dV5BEVOWb2No53QqrnMjInJklFiHoOsuvZhRNobdBeBeuxByNgY7JBGR2uXnd7y5q5v383t6yvIs8otKVF8tItVKiXUISkuM5cYRQ7hq390U5u6A1y6CvdnBDktEpHbIz4W1U6HDcL9zV4NXBpIUF0WfVv5WfxcROTJKrEPU+T2a0rb7QG7YdwclWcvhrSuhcF+wwxIRCX2rv4PiAmg71O/pouISvlmyhSEdGxEdqV+DIlJ99I4SwsaM6MKqxD6MibrN6315/5dQUhzssEREQtvyCRBTFzIG+D09a81OsvMKVQYiItVOiXUIS4qL5rHLe/DK7l58lH4LLP4EPr8bnAt2aCIiock5WP4VtB4MUTF+m0xYtJmYqAgGtUur0dBEJPwpsQ5xfVqm8pvT2nD7mpNY2e6XMPt5L7kuLgx2aCIioWfrIshZX2kZiHOOCQu3cEqbBiTERtVwcCIS7pRY1wK3DWlL9+b1uGDZmeSe+CuY9Sy8cj7kahEZEZGDLJ/g7StJrBdv2s2G7L0M7awyEBGpfkqsa4HoyAj+c1kPikpg9OYLKLlgHGyYA+MGw4a5wQ5PRCR0LP8K0rtCUmO/pycs2owZnN5BibWIVD8l1rVEywYJ3H9eZ6at2s7TO3rBDRPAIuCFYTDvzWCHJyISfHuzIXN6pb3V4E2z1ysjhbTE2BoMTESOF0qsa5FLejXjnG6NefSrZczY2wxu/Baa94UPfwUf3wYrvobdmzW4UUSOT6smgSuuNLHekL2XRZtyOFOzgYjIMaKRG7WImfHQRd1YtDGHW9/8kc9vP4UGIz+Er/4E05+CuS97DeMbQKPO3sehHYZDi5OCG7iISE1Y/hXE1YOmvf2enrhkKwBDOjasyahE5DiiHutapm5sFE9edSK79hZyx1vzKLZIGPZ3+J9VcN1nMOxhaP8LyM+BWc/Bi7/wEm/NIiIi4aykxEus2wyBSP99RpOWbKV5ah1OSKtbw8GJyPFCPda1UMfGSYw5vzP3vPcz/524gtvPaAvxqdDyZG8rVZAH4++Fqf+BNd/DRc9DaqvgBS4icqxsng97tlZaBrKvsJgfVmZxWe/mWCXLnIuIHC31WNdSl/ZuzoU9m/LYN8uYuiLLf6OYeDj3P3DJS5C1AsYOgp/frdE4RURqxPKvAIM2Z/g9PW3ldvYVlnBaB5WBiMixo8S6ljIzHrigC23S6nL7Wz+yJWdf5Y07XwC//h4adoT3boAPfwN7KknGRURqo2XjoWkvSGjg9/TEJVupEx1J/9b1azgwETmeKLGuxeJjonjqqhPZk1/MrW/+SGFxSeWN62XAdZ/DKXfBvNfhX+3hratgyWeqvxaR2m1Plje3/yFWW5y4ZCsD29QnLjqyhoMTkeOJEutarm2jRP5+YRdmrt7B3e/Mp6TkEFPtRUbBkD/CzdOh/69h3Ux460r4Vwf48l7vF5OSbBGpbVZ8Azhoe6bf08u35rIhe6/KQETkmNPgxTBwQc9mbMzexz/HLyUlIYY/ndPp0INzGnaAoQ/AkPth5TdeD/as57wp+yJjvKn6GneHxj28fXpXiIyusecREamS5RMgIc17z/KjdJq909orsRaRY0uJdZi4efAJbM8t4IWpq6mfEMMtp7c9/EWRUdDuLG/L2wErJ8Km+bBpHiz8AOa85LWr3xYuGAvNeh3TZxARqbKSYm9xrPZnQ4T/D2EnLtlKh/REmtSrU8PBicjxRol1mDAz7hvekZ15BTwyYRkpCTFc1a9F4C8QnwpdL/Y28FZvzF4LmTPgmzHw/Jlwyp0w6H8gKubYPISISFWtnw37sistA9mVV8ictTu5aVDrGg5MRI5HSqzDSESE8Y+Lu7FrbyH3fbiAlPgYzu7a+MhezAxSWnpb+2FeDfZ3/4RlX3q91406V2foIiJHZssCb9+8r9/T3y3fRnGJ43TVV4tIDdDgxTATHRnBk1eeSK+MFO54a17lc1xXRVwyjHgKLn8Ddm+GcYPh+3/D3uyjf20RkaORnQkRUZDovxNh0pKt1IuPpmdGSg0HJiLHIyXWYahOTCTPX9uH1mkJjH5lNnMzd1bPC3cY7s0o0u4s+Pp+eLgFPNkfPr4NfnzdW4SmpAT27vT+O3OGN53f3Fdhy6LqiUFEpKxd6yC5GURUnEavuMTx7bJtnNoujcgIrbYoIseeSkHCVHJ8NK+M6sslY6dx3QszefumAXRsnHT0L5zQAC59FTKnwZqpsG4GLPoQ5r7sa2CAnyn/LAJ6j4LT/uDVc4uIVIfsdZDc3O+p+euz2bGnQGUgIlJjAkqszews4B6gE5ACbAN+AO53zh2yK9LMUoB/AiOAOsA04LfOuZ/LtYsD/gpcDdQD5gH3OOe+q8oDyQENk+J47YZ+XDp2GiOfn8k7vxpAqwYJR//CZtDiJG8Dr5c6a5mXZO9aB3VSIb4+JNT39jGJMHMczHoWFrwPQ/4EJ17jt4dJRKRKsjOhzRC/pyYt2UqEwant0mo4KBE5XgVaCpIKzAFuAYYC9wKdgelmVunUE+ZNpvwxMAy4FbgIiAYmmVmzcs2fB0YDfwLOATYB483M/8SkEpDmqfG8ekM/nHNc/dwMNmTvrf6bRER4c2P3uhZOvw8G3AzdL4M2Z0CTntCgDZz9D7hpires+qd3wLOneaUiIiJHqigfcjd7K8v6MXHJVk7MSKFevGYyEpGaEVBi7Zx70zl3t3PuXefcZOfcq8CFQCJw8SEuPQ84GRjpe40vfccigP8pbWRm3YEr8Xqyn3XOfQNcCmQCY47kweSANg3r8vKovuTsK2TkczPYtjs/OIGkd4HrPoOLnofcrfDCUPh3F3h3FMwYCxvmauVHEQncrvXe3k8pyJacfSzcmKPVFkWkRh3N4MXtvv2hMqHzgI3OuUmlB5xzu4BPgPPLtSsE3i7Trgh4CzjLzGKPIk4BujRN5sXr+rBp1z5GPj+DXXlBSmDNvLmyb5kNv/gHNOsNmdPhi//xerEfbA4vnQOT/wnrZkFxUXDiFJHQl53p7f30WE/yrbao+moRqUlVSqzNLNLMYsysLTAW2IyX/FamM7DAz/GFQIaZ1S3TbrVzLs9PuxigTVXiFP96t0xl7MherNq2hyufm86OPQXBCya2LvS7CS55Ce5cBL9dCBe/CL2u8xZ7mPQAPH8G/KMVvHkFTH8Gtq8MXrwiEnp2rfP29Sr2WE9ZnkV6Uhwd0hNrOCgROZ5VdVaQGUDputYrgNOdc1sP0T4VWOPn+A7fPgXI9bXzNydcaTtNI1FNBrVLY+w1vbjp1Tlc+ex0XvtlPxrUDYEPBJKbeVuXC72v92TB6u9g9WRYNRmWfg5f3gMNO0GHc6DjOZDezesBL1W4F7av8AZS5ud689omNfG2OikH2u7L8X4hZ2d6W94OaNAWGnWB+m28pd5FJPRlr/NmHEpqWuHUgo276JlRDzNNsyciNaeqGcRIIAloDdwFfGVmJzvn1lTSvpK51yj/Thdou4NPmt0I3AiQkeF/8IpUdFr7hrx4XR9ueHkWl42dxhuj+9MoKS7YYR0soYGXZJcm2jtWw9IvYMmnMOUR+O4f3se/rQZ59dpZy2DnWvz/GAFRcVC3EeTnePNsVyYqzhtg2aiLF8PebK8HvXSfvxua9/cGajbrc3BiLyI1KzsTEptAZPRBh3Pzi1i7PY+LTyw/Rl5E5NiqUmLtnFvs+88ZZvYFXm/074FfVXLJDvz3NpcugbWzTDt/mXFKmfP+4hkHjAPo3bt3JRmV+DOwTQNevr4vo146kFw3qVcn2GFVLrWVN9vIgJu93uyln8PiT2HxJ5DUzJt9pNvlkNYOGrSHuCRvlcicDZCzCXZv9L6OTfIS8noZUK+Ft49L9hLzzT97yyNv/tl7/X05UKcexNXz9vENvF/iCz+Aea9BWkdv2sBul3lTC8rxKWcTbJwLG+Z4g+kuHBfsiI4fu9b5LQNZujkHoHrm7hcRqYIj/szbOZdtZis4dP3zQrzp+crrBGQ653LLtLvAzOLL1Vl3Agrwyk6kmvVrXZ9XbujHdS/M5LJx03jjl/1pnhof7LAOL6GBl9CeeM2h21UyBZdf6V28rSzn/PdI5+/25uOe+wqMvxe+/jO0GwYtBnqDMdO7QlS58priQtiy0EvANv8M+3ZB4T4o2ntgX1LsJf5xSQfvo+J8n92YLx7zeuia9vJ6zcv11gWssucLlrwdBxYeWvu9l6Q6x/5PIZxvH1PX+2OodKtTz5s7PaWl9wdYamtvlogoP1OslZRA4R7YvcX7o2v3pgN/fO3Z6pUTFe6FwrwD+4hor5QoPtXb10mFmHjYutibyWb3Ru+1LRIadfKuiw7hP1LDSXYmZAyocHjRpt0AdGyixFpEatYRJ9Zm1gjoALx+iGYfA9eb2anOucm+65KAc4E3yrX7C3AJ8LKvXRRwGTDBORek+eHCX68WKbw+uh8jn5/JpWOn8dy1vencJDnYYYWGypLO2ESvFKTXtV6yPPcVWPQRLP7YOx8R7SXXzXoD5vVkbv4Zin0/xnHJXu93dB0vaY6u430dEekl7dnrvMQ7f5f3tSupPMaYRK8cps3pcMIQL7H0p6QEdqyE9bNg3UxYPxu2LvJiSWwMiY18+3Qvptwt3rZ7izdPcO42r/680/neltbu4Nd3zuvtX/SRt2Ut82pfLdJ7LouAiCgvKS5NUONTvSTVIrzFhbYsBBxExkLzvt59LIIDf1D4FOzx/v/szfaS7y0LYc8274+T/d+7CK9mPzYJCnK9awryvKTan7hkSGgIMQkQHe/Fl9QEoupAcYFXPpSzwbtX3g7vdVJPgJYnQ9MTocmJ3vc8JjT+MDWz5sC/gTPx/iz7GrjDOZcZwLV/B3rjjadJBa53zr3kp923wKl+XuK3zrnHjjj4QBUXQc5Gv39AL96UQ1JcFE2SQ6zETUTCnjl3+AoKM/sAmAv8BOQA7YDfAulAX+fcMjM7FfgGGOWce8V3XQTwPdAcuBuv9ONeoBvQ3Tm3rsw93gLO8rVbDfwab6GYk5xzcw8XY+/evd3s2bMDfGwpb9HGHG54eRbZeYU8ckl3hndrHOyQap+cjV7CumE2rJ8DG3/0jjfp4ZWqlCZgKS0D7yl2DkqKDvTclu4L8mDtVFj5DayYCLt8+VJ8Ay8xjIw+sEVEeTXq+7K9NrFJXm93elcv4czd4vXc7t7sba7YK39JTPfq0hPTvRU0N8zxEmDwymA6nQ8Z/bxBpos+gh2rvIS25cnQvJ8Xqyv2/jAoKfa2/BwvMd2748C+qMD7f9PyZF+i2qtij38g/59yt3ox7Fzt7Xes9nqPYxIqbnUbeYlzYhNIauwdq4qS4mpdOdTM5jjnelfTa8UD84F84D68Lv8HgHigm3Oukr8u9l+/G2/l21XANRw6sU4Bbip3ao1zbvPh4jzq9+zsTHisK5z7H282oTIueGoqMZERvH1Txd5sEZGjdaj37EB7rKfjLdjyO7zp79YB3wIPlhm4aEAkZabwc86VmNk5wCPAU0Ac3pLmp5VNqn2uB/6G9wugHt4vhmGBJNVy9Do1SeKjWwby69fm8ps35rJ0cxvuOKMdEREhVCoQ6pKaQKfzvA285AuOLgEz81/qEV3nwL2c82ZDWTnR61EtLvR6WYsLDvx3p67QrK9XOtKgnbdapj8lxV4iX1lim7PRq2tf9DFMfhhwXq90q0Fw0m3Q8VyvVKemmfl63RtBixpIpqoxqT4GRuMNMG/vnFsBYGY/AcvxkuBHD3N9su+9uw1eYn0ou51z04824CNSOod1ucVhikscSzbt5rI+FWuvRUSOtYASa+fcw8DDh2nzLX5m8XDO7QBG+bZDXb8XuNO3SRA0TIzjjdH9+OOHC3h84gqWbN7No5f1oG6spp87IjWVfJl50wU2aHv0rxUReei4k5p484/3u8krE9n4o1e2Ea8ZMUPIecD00qQawDm32sym4i3MdcjE2rlD1R6FkOzSOaxbHHR47fY97C0sppMGLopIEBzNyosShmKjInn4om78+dxOfLNkKxc99QOZ28uv2yOC1zvcfpiS6tBzqIW5OlXzvXqa2S4zKzSzn8zshmp+/cqVLg6TfPCUeotLBy4qsRaRIFBiLRWYGdcPbMUro/qyOWcfFzw1lZ/WZwc7LBEJzKEW3Erxc/xIfQfcgddDfjFeqclzZnZfZReY2Y1mNtvMZm/btu3o7p691htwGn3wAMXFm3KIjDDaNqpbyYUiIseOEmup1MA2Dfjg5pOoExPJ5eOm8+3SQy2yKSIhpMoLblX5Bs79yTn3rHNusnPuI+fcRcCHwB/MzG9W65wb55zr7ZzrnZaWdnQBZK+rdEaQ1g0SiIsO6Tp4EQlTSqzlkFqn1eX9m0+iVYMEfvnybN6dsz7YIYnIoe2k8oW5DrHsaLV4E2+QetdjfJ9KF4dZvClHZSAiEjRKrOWwGibG8daN/enfuj53vTOfJyetIJBpGkUkKBbi1VmX1wlYdIzvXdorfmzfIEpKvDnMy80Ikp1XwMZd++ikhWFEJEiUWEtAEuOieeG6Pozo0YR/jl/Knz5aSHGJkmuREPQx0N/MWpceMLOWwEDfuWPpSmAv8PMxvUvuFm8ayXKlIBq4KCLBpnnUJGAxURE8emkPGiXFMfa7VeTsK+Rfl3QnKlJ/n4mEkGeBW4CPfAMJHfBXvPUHxpY2MrMWwEpgjHNuTJnjpwJpeAuAAfQ2s1wA59y7vjanAL8H3gfWAMnAtXgDGX9/uEVojlrpjCAVEuscADo2TjymtxcRqYwSa6mSiAjj3rM7khwfzT++XEpRieOxy3oQreRaJCQ45/aY2el4S5q/ilee8Q3ekua5ZZpWWNTL5y8cvFT5b3xb6TUAm3zXjQEaAIV4K/Ne6Zx7s/qephKVLA6zeFMODerG0DBRS5mLSHAosZYjcvPgNkRHRPC3zxdTVFzCE1ecSEyUkmuRUODC2vOsAAAgAElEQVScywQuOkybNfhf1GtwAK+/AvjFEYZ39EoT63KDFxdv1sBFEQkuZUJyxEYPas2fz+3E+IVbuPn1OeQXFQc7JBE5HuxaB3VSIPZAyUdRcQnLtuQqsRaRoFJiLUfl+oGt+OuILny9eCs3vjKHfYVKrkXkGMvOrFBfvSprDwVFJaqvFpGgUmItR21k/xY8eGFXvlu+jetenMmmXXuDHZKIhLPsdRXqqxdtLB24qB5rEQkeJdZSLa7om8G/LunOvHXZnPnod7z8wxpNxyci1c853+IwFWcEiYmM4IQ0LWUuIsGjxFqqzYUnNmPCHafSM6Mef/54IRc/8wNLN+8OdlgiEk7ytkNhXoXEetGmHNo0rKsZikQkqPQOJNUqo348r4zqy6OXdmdN1h6GPz6FR8YvVe21iFSPSqfa260yEBEJOiXWUu3MjAtPbMY3vxvMed2b8N9JKzjnie/5aX12sEMTkdrOz1R723bnk5Wbr6XMRSTolFjLMZOaEMOjl/Xg5VF9yd1XxAVP/cCjXy2jsLgk2KGJSG3lZ9VFrbgoIqFCibUcc6e2S2P8bwdxfo8mPP7NckY8OVW11yJyZLLXQUwixNXbf6g0se6kUhARCTIl1lIjkutE8+ilPRg7shdbcvZx7hPf88zklZo5RESqJjvTKwOxA4tGLt6UQ+PkOOrFxwQxMBERJdZSw87qnM74OwZxeoeGPPTFEq57cSY79hQEOywRqS38TrWngYsiEhqUWEuNq183lqevPpEHL+zKjNU7OPeJ75m/TgMbRSQA5RaHyS8qZuW2XNVXi0hIUGItQWFmXNE3g/d+dRJmcMkz03ht+lqcU2mIiFRibzbk7zpoRpDlW3IpKnHqsRaRkKDEWoKqa7NkPr31ZE5qU5/7PlzA7/5vPnsLNOe1iPjhZ0aQldtyAWjXSD3WIhJ8Sqwl6OrFx/DCtX2488x2fDBvA8OfmMIn8zdqYKOIHCzbl1gnH0iss3K9MRqNEuOCEZGIyEGUWEtIiIgwbhvSlldG9SXSjFvf/JGzHvuOj+ZtUIItIh4/i8Nk5eYTHWkk1YkKUlAiIgcosZaQckrbNMbfMYj/XtmTCIPb35rH0H9P5sMflWCLHPd2rYOoOEhI238oa3c+9RNisTLT74mIBIsSawk5ERHGOd2a8OXtg3jqqhOJjozgjrfncdHTP5C5PS/Y4YlIsGRnejOClEmis3LzaZCo+atFJDQosZaQFRFhnN21MZ/fdgqPXdaDldtyOfvxKXzw4/pghyYiwVC6OEwZ2/cU0KBubJACEhE5mBJrCXkREcaInk354vZT6Ng4kd++PZ873vqRnH2FwQ5NRGqSn8VhSktBRERCwWETazO72MzeM7O1ZrbXzJaa2YNmdsi5jczsfjNzlWz7yrVdU0m7EUf7gBI+mqXE8+bo/tx5Zjs++WkTwx+fwpy1O4MdlojUhOJCSG4GaR33H3LOkZVboFIQEQkZgQyjvgvIBP4XWA/0BO4HTjOzk5xzJZVc9xzwZbljCb5jH/tpP973umUtDSA+OY5ERUZw25C2DGxTn9vfmsclz/zA0E7pjDq5FX1apmgAk0i4ioyGm7476FDOviIKiktIUymIiISIQBLrc51z28p8PdnMdgAvA4OBif4ucs6tx0vE9zOzkb57vuznkizn3PRAghbp1SKVz28/hae/XckbMzL5cuFmOjdJ4vqBrTi3e2NioyKDHaKIHGPbc/MBVGMtIiHjsKUg5ZLqUrN8+6ZVvN+1wBa83mmRo5IUF809wzow/d4h/P2CrhQUlXDXO/MZ+NBEnv52JUXFlX2YIiLhoHRxmPp1VQoiIqHhSAcvnurbLw70AjNrBpwGvO6cK/LT5FwzyzOzfDObrvpqCVSdmEiu7JfBhN8O4tUb+tK5STIPf7mEi56ZxirfcsciEn6y1GMtIiGmyom1mTUFxgBfO+dmV+HSkb77+SsD+QS4FTgLuArYB3xgZlcfJpYbzWy2mc3ets1fx7ocT8yMU9qm8fKovjxxRU/WZO1h+OPf89r0tTinxWVEwo1KQUQk1FQpsTazusBHQBFwfRXvdQ3wo3Pup/InnHO3Oudecc5Ncc69CwwBZgMPHuoFnXPjnHO9nXO909LSDtVUjjPndm/C+DsG0btlCvd9uIBRL81i6+59h79QRGqNbbkFmEFKfHSwQxERAaqQWJtZHN5sHq2Bs3yDEwO9ti/QAf+91RU454qBd4BmZtY40PuIlJWeHMfL1/fl/nM78cPK7Zz17+94bsqq/b1cIlK7ZeXmkxofQ1SklmQQkdAQ0LuRmUUD7wF9gbOdcz9X8T7X4vVyv1GFa0rnTdNn+HLEIiKM6wa24rPbTuaEtLo88Nli+j/4Db96dQ4Tl2zRAEeRWixrd77KQEQkpBx2uj0ziwBexyvPGF7VKfHMLAa4HPi8khlG/F0TBVwCZDrnNlflfiL+tGmYyLu/Poklm3N4Z/Z6PvxxA18u3EzDxFguOLEpwzqn071ZPSIiNA+2SG2xfY8WhxGR0BLIPNZP4iW5fwP2mFn/MufWO+fWm1kLYCUwxjk3ptz15wCpVFIGYmZXAOcDnwPrgEbAb4BewBVVeBaRw+qQnsQfz+nEPcM6MHHJVt6ZvY7npqxm7ORVNKgby5AODRnSsSEnt21AfEwg/zxEJFiycvPp3qxesMMQEdkvkMzhF779H3xbWX/BWy3RgEj8l5ZcC+wAPq3k9VcDDYF/4iXgeXjzZA9zzmm+azkmYqIiGNYlnWFd0snOK+Dbpdv4evEWPv95E2/PXkdsVARDO6dz99D2ZNSPD3a4IuKHSkFEJNQcNrF2zrUMoM0aDtRElz93/mGunQ6cfrh7iBwr9eJjGNGzKSN6NqWgqIRZa3bw1aItvD1rHeMXbOb6gS25+bQ2JNfRzAMioWJvQTF7CopVCiIiIUVDqUXKiImKYGCbBtx/Xme+vXsw5/VowrgpqzjtkW95ddoaDXYUCRH7F4dJUI+1iIQOJdYilWiUFMcjl3Tnk1tOpl2juvzxo4UM+88UJi3dGuzQRI57+xNr9ViLSAhRYi1yGF2aJvPm6P6MG9mLouISrn9xFte8MJNlW3YHOzSR41ZWbgGgVRdFJLQosRYJgJkxtHM6E357KvcN78i8zJ0Me+w77vvwZy04IyHHzJqb2btmtsvMcszsfTPLCPDav5vZBDPbbmbOzK47RNvRZrbEzPLNbKmZ/araHuIwtJy5iIQiJdYiVRATFcEvT2nNt3efxsj+LXhz5joGP/ItYyevZG9BcbDDE8HM4oGJeKvdXguMBNoCk8wsIYCXuBWoQ+UzOZXeZzQwFm/xsGF4q+U+ZWa/PvLoA1daCpKaoFIQEQkdmqhX5AikJsTwl/O7MHJAC/722WIe/GIJY79bxQ0nt2LkgBYkxWkGEQma0UBroL1zbgWAmf0ELAduAh49zPXJzrkSM2sDXOOvgW8Rr78BrzrnSqdhnWRmTYC/mtlzzrnCaniWSmXlFpAYF0VcdOSxvI2ISJWox1rkKLRpmMiL1/fl3V8NoFuzZP45fikDH5rII+OXsmNPQbDDk+PTecD00qQawDm3GpiKtxjXITnnApn6ZgCQBrxW7virQH3g5ICjPULbcvNJUxmIiIQY9ViLVIPeLVN56fq+LNiwiycnreDJb1fw/PerObNTI9qnJ9K2YV3aNkokIzWeSC2bLsdWZ+AjP8cX4q2iW133AFjg5x4AnYBJ1XQvv7bn5lO/rspARCS0KLEWqUZdmibz9NW9WLF1N09/u4ppK7P4eP7G/edjoiJok1aXUSe34qITm2KmJFuqXSqw08/xHUBKNd4DP/fZUe78MZOVW0DbhnWP9W1ERKpEibXIMdCmYSL/urQ7ALv3FbJy2x6WbdnNiq25TFu5nbvemc9H8zbw9wu60jxVS6ZLtXN+jlXnX3Glr+XvPpVfZHYjcCNARkZAk5RUKis3nwGt6x/Va4iIVDcl1iLHWGJcND2a16NH83oAlJQ4Xp+xloe+WMLQf3/H74a24/qBrVQiItVlJ/57jFPw35N9JMr2TG8qczy13PmDOOfGAeMAevfuXaWkvKzC4hKy8wpVCiIiIUeDF0VqWESEMXJAS76681QGnFCfBz5bzIVPTWXxppxghybhYSEHaqDL6gQsqsZ74Oc+nXz76rqPX6UDgzWHtYiEGiXWIkHSpF4dnr+2N49f0ZP1O/dy9uNTGPXSLCYv20ZJyRF35ol8DPQ3s9alB8ysJTDQd646TAOygKvKHb8ar7d6ajXdx69tu7U4jIiEJpWCiASRmXFe9yac0qYBL/6whjdmZHLtCzNp1SCBkf1bcHHvZpoTW6rqWeAW4CMzuw+vDvqvwDq8BV0AMLMWwEpgjHNuTJnjp+JNpZfuO9TbzHIBnHPv+vaFZvZHvAVhNgBfA6cDo4BbnXPHdK7J0sVh0hJVCiIioUWJtUgISEmI4c4z23HLaW34YsEmXv5hDWM+XcQjE5ZyWvuGdGuWTNemyXRumkxyHSXaUjnn3B4zOx34N9680gZ8A9zhnMst09SASCp+cvkX4NQyX//Gt5VeU3qfZ8zMAb8D7gYygVucc09V4+P4tT3Xy9vrJ6jHWkRCixJrkRASExXB+T2acn6Ppvy8fhevTl/DtFXb+eznA+PDWjVIoGvTZIZ2bsQZHRtp5TmpwDmXCVx0mDZr8DNTiHNucBXuM5YyveA1pbTHukGiEmsRCS1KrEVCVNdmyfzjYm/Kvp17Cvh5wy5+3rCLn9Zn88PK7Xw8fyOJsVGc3bUxI3o2pV+rVCI0s4gcB7Jy84mLjiAhRn9UikhoUWItUgukJMQwqF0ag9qlAVBc4pi+ajvvz93Apz9t5O3Z62iSHMfZXRvTMyOFbs2SaZZSRwvQSFjKyi2gfkKsfr5FJOQosRaphSIjjIFtGjCwTQMeGNGFCYs288GPG3h52hqe+341APXio+naNJluzZI5q3M63ZrVC27QItUkKzdfZSAiEpKUWIvUcnViIvfXZecXFbNscy4/bcjm5/W7+Gn9Lp6ZvIonJ63kjI6N+O2ZbencJDnYIYsclazcAprWiwt2GCIiFSixFgkjsVGRdG2WTNdmydDPO7Z7XyEvTV3DuCmrGP74Fs7ums4dZ7SjXaPE4AYrcoSycvPp3kx/IIpI6FFiLRLmEuOiuXVIW64Z0JLnvl/FC9+v5osFmzm3WxOuG9iSns3rqVZVao2SEseOPQVazlxEQpISa5HjRHJ8NL8b2p7rB7Zi3HereGXaGj6ev5G2DetyWZ/mXNCzKfW1kp2EuOy9hRSXOK26KCIhSYm1yHEmNSGG3/+iA7857QQ+/WkTb89axwOfLebhL5dwRsdGnN+jKX1apijJlpC0fw5r/XyKSAhSYi1ynEqMi+aKvhlc0TeDZVt28/asdXzw4wa+WLAZgBb14zkxI4UTM+rRMyOFjo2TiNQ82RJkWbu9xFqlICISipRYiwjtGiXyx3M6cc+wDsxbl83czJ3MXbuTKcuz+ODHDYDXQ/iLLumc3bUxfVulKsmWoMja4y1nnqYeaxEJQUqsRWS/mKgI+rZKpW+rVACcc6zfuZc5a3cyYdFm3pmzjlenr6VB3ViGdWnE2V0a06tlCrFRWgFPakZpj7VKQUQkFCmxFpFKmRnNU+NpnhrPiJ5NySsoYtKSbXz+8ybem7OB16ZnEhMVQY/m9ejnS8hPzEghIVZvLXJsZOXmExVhJNeJDnYoIiIV6LefiAQsPiaK4d0aM7xbY/IKipi6YjszV29n5uodPPXtSp6YuILICKN3ixSu7JfBsC7p6s2WapWVm09qQgwRKkUSkRB02MTazC4GrgB6Aw2BTOB94O/Oud2HudZVcqqnc25emXYRwD3ATUA6sBQY45x7L5CHEJGaFx8TxZmdGnFmp0YA5OYXMXftTmas3s6nP23i9rfmUT8hhkv7NOfKvhk0T40PcsQSDrbnFqgMRERCViA91nfhJdP/C6wHegL3A6eZ2UnOuZLDXP8SMLbcsWXlvv6r7z5/AOYAlwPvmNk5zrnPA4hRRIKsbmwUg9qlMahdGr87sz3fr8ji1elrGTt5Jc9MXsngdmn0aZVKWt1Y0hJjaZgYR1piLKkJMRoIKQHLys2nQaISaxEJTYEk1uc657aV+Xqyme0AXgYGAxMPc/0G59z0yk6aWUO8pPoh59wjvsOTzKwN8BCgxFqklomIsP1J9sbsvbw1M5P/m72eSUu3VWgbFx3B2V0ac3nfDPq0TNEqkHJIWbkFnJBWN9hhiIj4ddjEulxSXWqWb9+0GmI4C4gBXit3/DXgBTNr5ZxbXQ33EZEgaFKvDncObc+dQ9uzt6CYbbvz2Za7j605+WzLzWfxphw+mb+J93/cwAlpCVzeJ4MLT9QqkFKRc45t6rEWkRB2pIMXT/XtFwfQ9tdmdjdQDEwH/uycm1LmfGcgH1hR7rqFvn0nQIm1SBioExNJRv14MuofXG993/BOfPbzJt6amcnfPl/MP8YvYViXxowa2JKeGSlBilZCTW5+EQVFJTTQ4jAiEqKqnFibWVNgDPC1c272YZq/BnwKbARaAHcDE83sTOfct742qUC2c678QMcdZc5XFsuNwI0AGRkZVXkMEQkhCbFRXNq7OZf2bs7Szbt5a1Ym785ezyfzN9Izox43nNyKYZ3TiYqMCHaoEkRZud7iMPUT1GMtIqGpSom1mdUFPgKKgOsP1945N7LMl1PM7CNgAfAAcHLpywL+Zg85bKGlc24cMA6gd+/elc1AIiK1SPv0RP58bmd+N7Q9785ex4s/rOGWN36kSXIc157Ukr6tUmmcXIcGdWOUaB9nsnJ9i8OoFEREQlTAibWZxQEfA62BU51z66t6M+fcbjP7DLihzOEdQIqZWble65Qy50XkOFM3NorrBrZi5ICWTFyylee/X8WDXyzZfz7CoGFiHI2S42iYGEtCTCR1YqKIj4mkTnQkdWIiqRcfTaPEOBolxdEwKZb6CUrGa7PtpYm1SkFEJEQFlFibWTTwHtAXOMM59/NR3LN8D/VCIBY4gYPrrDv59ouO4l4iUstFRtj++bJXbctlddYeNufsY/Mu35azj3U78sgrKCavoJi9BUXkFRZTobiMA8n4Od0aM3pQaxolxdX8A8kR2+YrBUnTwFYRCVGBLBATAbwODAGGH2rqvABeKwkYDswoc/hLoAC4CvhLmeNXAws0I4iIlGqdVpfWAUy15pwjv6iE7LxCtuTs87bd+WzL2cfyrbm8+MMaXpm2lot7N+NXg06oMJhSQlPWbq/HOiVBPdYiEpoC6bF+ErgE+Buwx8z6lzm33jm33sxaACvxVkscA2BmdwHtgUkcGLx4F97KileVvoBzbquZ/Ru418x2A3OBy4DTgfOP8vlE5DhkZsRFR5KeHEl6csVe6czteYz9biXvzF7P27PWcV73Jow+pTUdGydqHu0QlpWbT0p8NNEq5xGREBVIYv0L3/4Pvq2sv+CtwmhAJFD23W4pcIFvSwZygKnADc65meVe5w9ALnA7B5Y0v9Q590mgDyIiEqiM+vH87YKu3DakLc9NWcXrMzL54McNpCXG0q9VKv1a16d/q1TaNKyrRDuEaDlzEQl1gSwQ0zKANmsoN4uHLykOKDF2zhXjzRTyQCDtRUSqQ6OkOP4wvBO/HtyGLxdsZsbq7cxYtYNPf9oEQP2EGDo2TqJRUhzpybGkJ8WRnlyHxslxtGuUSEyUek5rUlZuPvU1cFFEQtiRLhAjIhI2UhNiuLJfBlf2y8A5R+aOPKav2s6M1TtYnbWHH1ZmsXV3PsUlB0ZE1omOpHfLFPq1SqV/6/p0a1ZPifYxlpWbT5emycEOQ0SkUkqsRUTKMDNa1E+gRf0ELutzYOGp4hLH9tx83ywke5m1ZgfTV23nkQnLAIiLjqB3i1TGXdOL+Bi9tR4LWSoFEZEQp3d/EZEAREYYDZPiaJgUR7dm9RjerTEAO/cUMNOXZK/J2qOk+hgpLnH0bZVK5yZJwQ5FRKRS+g0gInIUUhJiOKtzOmd1Tg92KGEtMsJ44bo+wQ5DROSQVBAoIiIiIlINlFiLiIiIiFQDJdYiIiIiItVAibWIiIiISDVQYi0iIiIiUg2UWIuIiIiIVAMl1iIiIiIi1UCJtYhImDGz5mb2rpntMrMcM3vfzDIOfyWYWZyZ/dPMNpnZXjObZmaD/LRbY2bOzzai+p9IRKR20AIxIiJhxMzigYlAPnAt4IAHgElm1s05t+cwL/E8MBy4G1gF/AYYb2YDnHPzyrUdD9xf7tjSo3sCEZHaS4m1iEh4GQ20Bto751YAmNlPwHLgJuDRyi40s+7AlcAo59yLvmOTgYXAGOC8cpdkOeemV/sTiIjUUioFEREJL+cB00uTagDn3GpgKnB+ANcWAm+XubYIeAs4y8xiqz9cEZHwocRaRCS8dAYW+Dm+EOgUwLWrnXN5fq6NAdqUO36umeWZWb6ZTVd9tYgc75RYi4iEl1Rgp5/jO4CUo7i29HypT4BbgbOAq4B9wAdmdnVlL25mN5rZbDObvW3btsOEIiJS+4RNjfWcOXOyzGztIZo0ALJqKp4gCPfng/B/xnB/Pgj/ZzzS52tRzXE4P8csgOss0Gudc7ce1MDsA2A68CDwmt+gnBsHjPO133acv2dD+D9juD8fhP8z6vn8q/Q9O2wSa+dc2qHOm9ls51zvmoqnpoX780H4P2O4Px+E/zOGyPPt5OCe5VIp+O+NLmsH4G9avpQy5/1yzhWb2TvAw2bW2Dm36VA3Ot7fsyH8nzHcnw/C/xn1fFWnUhARkfCyEK9WurxOwKIArm3lm7Kv/LUFwIqKlxyktGfbX6+3iEjYU2ItIhJePgb6m1nr0gNm1hIY6Dt3uGujgUvKXBsFXAZMcM7lV3ahr90lQKZzbvORBi8iUpuFTSlIAMYFO4BjLNyfD8L/GcP9+SD8nzEUnu9Z4BbgIzO7D6/3+K/AOmBsaSMzawGsBMY458YAOOfmmdnbwGNmFg2sBn4NtMIboFh67RV4U/d97nvdRngLyfQCrqim5wiF/5fHWrg/Y7g/H4T/M+r5qsic0yd2IiLhxLd8+b+BM/HKM74B7nDOrSnTpiVe4vwX59z9ZY7XAf6Gt1BMPWA+cI9z7tsybfoDf8crOUkF8oBZwD+dc+OP2YOJiIQ4JdYiIiIiItUgrGuszay5mb1rZrvMLMfM3vf15NQ6ZtbMzJ4ws2m+BRmcr8epfLs4M/unmW0ys72+9oNqPuKqMbOLzew9M1vri3upmT1oZonl2qWY2XNmlmVme8zsazPrGqy4A2VmZ5nZRDPb7FtMY72Z/Z+ZdSrXLpx+Zr/0/Zw+UO54bf0eDvY9T/ktu1y7Wvl8oSDMfv71nk3t/veg9+2DjtfK72Mw3rfDNrE2b1T7RKADcC0wEmgLTDKzhGDGdoTaAJfiTZc15RDtngdGA38CzgE2AePNrMcxj/Do3AUUA/8LDAOexqvt/MrMIgDMzPAGVw3DW5jiIryBVpPMrFkwgq6CVGAOXu3rUOBevI/Rp5tX6xpWP7Pm1eB293O8Nn8PS90GDCiznVF6IkyeLyjC6effR+/Ztf/fg963CYvvI9Tk+7ZzLiw34Ha8f/RtyhxrBRQBdwY7viN4nogy//1LvAFJLcu16e47fn2ZY1HAUuDjYD/DYZ4vzc+xa3zPc7rv6/N9X59Wpk0y3ty6jwf7GY7gmdv7nud3vq/D4mcWry53M94gNgc8UOZcrf0eAoN9sZ9xiDa19vmCvYXLz3+Z2PWeHYb/HvS+Xbu+j8F43w7bHmvgPGC6c27/vKvOudXAVLz/ibWKc64kgGbnAYXA22WuKwLeAs4ys9hjFN5Rc875W994lm/f1Lc/D9jonJtU5rpdeEsr17rvKbDdty/07cPlZ/YfwELn3Jt+zoXb97C8cH++Yylcfv4BvWf79uH470Hv24TF97Gsan2+cE6sOwML/BxfiLfYQTjqDKx2zuWVO74QiMH7aLI2OdW3X+zbH+p7mmFmdWskqqNgZpFmFmNmbfGmPtuM90sUwuBn1sxOxuu1urmSJrX+ewi8bmbFZrbd/r+9+wexo4riOP49ICQWBpPCPwRBt7AIuKJoEBViEkEQxUaxsrATOwuJYgoR06mtJIWVEZuQZBEE/4ARQSOy8Q8RsigGs5WR3Y2RaGyOxbmPTJ6zu/E5b947198HBrJ3ZmFOzp2zd97cd8fsnaG5lDXENynp+/8IVLMTUN2uIo+91e2aB9ZbaH997xKXXs9bm7ViHuxPwcy2Aq8AH7n7V6V5vfgy5PU4cBFYAGaJR6a/lH2p+6zFusf7gdfc/dQqh2XO4TngdeKx/i5ibegHgc/N7LpyTOb4Ji11/x+RanYOqtt589h73a79BTFtawlaS1stjApiLneHR4k5ak83d5E/vqeATcAM8eWfD83sfr+0vnDm+PYAgzWQV5M2h+5+AjjRaDpmZp8CXxJfjNlL4vimxP/t/66K/lJ5zQbV7bR5nETdrnlgvUz73f5m2u9MarAEtC3xs7mxf6qZ2Ubi27kzwA53X2zsXmL1nEKCvLr74BHpcTN7HzgNvAA8Q+I+Wx6rvUR8KrBhaG7oBjO7FjhPBTlscvd5M1sA7i5NVcXXs7T9/z9QzU5AdbuOPA6Mu27XPBXkJDFvZtg24Puez6UvJ4FbyvI/TduAv4Af/vkr06M8kjoEbAcedvfvhg5ZK6c/u/vvYz7FTrn7CpGTwTzKzH12BtgIvE0UocEG8QnPMnAbleWwaH7aUWN8fcnc/0elmp2M6vZl0uaRMdbtmgfWc8A9ZjYzaLBYnP++sq9Gc8Tai08MGszsKuBJ4AN3vzipE1tPWff0ILAbeMzdv2g5bA7YamY7Gr+3CXiUhDk1s+uJtU9/LE2Z++zXwM6WDaJo7yT+GNWWw7uAW4gS6isAAAGXSURBVIk5mFBZfD3L3P9HpZqdjOp2yJzHcdftal9pXhZm/wb4g5hD48Sk9WuA2Yx3WGb2ePnnbuIR1LPAWeCsux8rx7wLPAQ8D/xELNj/CHCvu8/3ftJXyMzeJGLaB7w3tHvR3RdLIf8MuImIb5lYsH8WuN3dz/R4yv+KmR0G5oFvgd+Ii/o54AZgu7svVNpnHdjn7nvLz5lzeJC4puaBFeAO4twvAHe6+6+Z45u0Svu/anbi60F1W3WbUeIbx4Lc07IRc9cOERfEeeAIQwv0Z9qIC7Zt+6RxzNXAG8RyQH8Sd2QPTPrcryC202vE93LjuC3AW8ScqAvAx6XjTzyGdeLbQ7zBa6Wc9ynim9g3Dx1XY599dagtaw5fJP7AniPWsD0DHABurCG+adgq7f+q2UmvB9Xty9pS5nESdbvaT6xFRERERPpU8xxrEREREZHeaGAtIiIiItIBDaxFRERERDqggbWIiIiISAc0sBYRERER6YAG1iIiIiIiHdDAWkRERESkAxpYi4iIiIh0QANrEREREZEO/A0/Rz3fsf0a8QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 864x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, 2)\n",
    "axes[0].set_title(\"Loss\")\n",
    "axes[1].set_title(\"Accuracy\")\n",
    "plot_training_curves(mperm_training, target=\"loss\", ax=axes[0])\n",
    "plot_training_curves(mperm_training, target=\"accuracy\", ax=axes[1])\n",
    "axes[1].axhline(0.28, linestyle=\"--\", color=\"k\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This network manages to outperform our baseline dense network, even though this model still has fewer parameters than a direct linear classifier would! "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Thoughts\n",
    "\n",
    "So should people all start replacing the dense layers in their networks with permutation-cnn stacks? I would have to say no, or at least not the way I have done it here. At the beginning of the post I talked about how much more rich the configuration space of a convolutional network stack is than for dense networks. In the case of data with real spatial or temporal structure it is possible to reason about what a particular pooling strategy is really doing what sort of features it enables etc. This ability to reason about the network structure and how it interacts with the data is entirely missing in the new faux spatial permutation-cnn. \n",
    "\n",
    "Without that intuition about the nature of the data the architecture choices become more or less blind hyper parameter tuning in a huge design space. The above permutation network works significantly better with kernel size 5 than 3, and works better when the input data is shaped to be initially 1D with 64 channels than it does with say 32 channels which in turn is better than starting with a single channel with every input feature getting its own pseudo-spatial position assignment. \n",
    "\n",
    "In general if you can squeeze only tiny bit of extra performance out of a class of models with a huge hyper-parameter search space then you are definitely better off going with something with either a small number of hyper-parameters or a model which performs well without having to do much tuning. Although the dense network isn't exactly the sort of model which doesn't need much tuning it is still significantly easier to tune than the permutation-cnn turned out to be.\n",
    "\n",
    "The one place where the permutation-cnn really did shine here is in terms of how few parameters are needed by the network. I could easily envision situations where you might be willing to take a hit in performance in order to get a 10x-50x reduction in the model size. But I am afraid somewhat that the small performance hit and huge parameter reduction that we saw in this case is due to the fact that most of our input features were the same type of feature. This allowed the parameter sharing induced by the use of convolutional transforms instead of full linear transforms to perform well, and in other contexts I would be afraid that they might perform more poorly. \n",
    "\n",
    "It definitely feels like there is something here, it feels like there should be some sort of middle ground between the large adaptable configuration space of convolutional networks with their low parameter counts and decoupled computation cost and parameter complexity, and the simpler configuration space of dense networks and their rapidly exploding parameter complexity. A good way to achieve that middle ground might not be permutation-cnn as I have played with them here. But, it does seem like there is something interesting here and I feel like there is lots of room to explore."
   ]
  }
 ],
 "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.7.4"
  },
  "nikola": {
   "author": "Tim Anderton",
   "category": "neural networks, network architecture, convolutions",
   "date": "2019-12-22 ",
   "description": "",
   "link": "",
   "slug": "permutation-cnn",
   "tags": "",
   "title": "Permutation CNN",
   "type": "text"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
