{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"## Explainability in Graph Neural Networks\n",
"\n",
"Author: [Filippo Maria Bianchi](https://sites.google.com/view/filippombianchi/home).\n",
"\n",
"Adapted from the original tutorial of [Simone Scardapane](https://www.sscardapane.it/).\n",
"\n",
"Colab notebook [here](https://colab.research.google.com/drive/1nV44NrNqcXC2thU6-zzxnJPnIalo870m)."
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"source": [
"Libraries:\n",
"\n",
""
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "skip"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torch: 1.13.0\n",
"pyg: 2.4.0\n",
"networkx: 2.8.4\n",
"captum: 0.6.0\n"
]
}
],
"source": [
"import os, torch\n",
"os.environ['TORCH'] = torch.__version__\n",
"print(\"torch: \",torch.__version__)\n",
"\n",
"# PyTorch imports\n",
"from torch.nn import functional as F\n",
"\n",
"# PyTorch-related imports\n",
"import torch_geometric as pyg\n",
"import torch_scatter, torch_sparse\n",
"print(\"pyg: \",pyg.__version__)\n",
"\n",
"# PyG explainability\n",
"from torch_geometric.explain import Explainer, GNNExplainer\n",
"\n",
"import pytorch_lightning as ptlight\n",
"from torchmetrics.functional import accuracy\n",
"\n",
"# Other imports\n",
"import numpy as np\n",
"import networkx as nx\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.colors as mcolors\n",
"from sklearn.model_selection import train_test_split\n",
"print(\"networkx: \",nx.__version__)\n",
"\n",
"# Finally, Captum\n",
"import captum\n",
"from captum.attr import IntegratedGradients\n",
"from captum.influence import TracInCP, TracInCPFast\n",
"print(\"captum: \",captum.__version__)"
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"## 1. Dataset exploration\n",
"\n",
"We consider the [MUTAG](https://paperswithcode.com/dataset/mutag) dataset, a collection of nitroaromatic compounds. \n",
"\n",
"The goal is to predict their mutagenicity on Salmonella.\n",
"\n",
"This is a toy version of the dataset, so we do not care too much about the final performance. "
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"source": [
"Download the data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"mutag = pyg.datasets.TUDataset(root='.', name='MUTAG')"
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"source": [
"Print some statistics about the dataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"graph samples: 188\n",
"classes: 2\n",
"node features: 7\n",
"edge features: 4\n"
]
}
],
"source": [
"print(f\"graph samples: {len(mutag)}\")\n",
"print(f\"classes: {mutag.num_classes}\") # Binary (graph-level) classification\n",
"print(f\"node features: {mutag.num_features}\") # One-hot encoding for each node type (atom)\n",
"print(f\"edge features: {mutag.num_edge_features}\") # One-hot encoding for the bond type (we will ignore this)"
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"source": [
"Each graph in the dataset is represented as an instance of the generic [Data](https://pytorch-geometric.readthedocs.io/en/latest/modules/data.html#torch_geometric.data.Data) object"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"mutag_0 = mutag[0]\n",
"print(type(mutag_0))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([17, 7])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# x contains the node features\n",
"mutag_0.x.shape"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"tensor([1])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# y contains the corresponding class\n",
"mutag_0.y"
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"source": [
"The Edges are stored in a COO format, with a 2xE list (``edge_index[:, i]`` are the source and target nodes of the $i$-th edge)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([2, 38])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mutag_0.edge_index.shape"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[0, 0, 1, 1],\n",
" [1, 5, 0, 2]])"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# We print the first four edges in the list\n",
"mutag_0.edge_index[:, 0:4]"
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"source": [
"Inside ``pyg.utils`` there are a number of useful tools.\n",
"\n",
"E.g., we can check that the graph is undirected (the adjacency matrix is symmetric)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pyg.utils.is_undirected(mutag_0.edge_index)"
]
},
{
"cell_type": "markdown",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"source": [
"We define a simple function for plotting the graph using the tools from networkx"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"colors = list(mcolors.TABLEAU_COLORS)\n",
"def draw_graph(g: pyg.data.Data, ax=None):\n",
" # Get a different color for each atom type\n",
" node_color = [colors[i.item()] for i in g.x.argmax(dim=1)]\n",
" # Convert to networkx\n",
" g = pyg.utils.to_networkx(g, to_undirected=True)\n",
" # Draw on screen\n",
" pos = nx.planar_layout(g)\n",
" pos = nx.spring_layout(g, pos=pos)\n",
" nx.draw_networkx(g, node_color=node_color, with_labels=False,\n",
" node_size=150, ax=ax)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgQAAAGFCAYAAACCBut2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLaUlEQVR4nO3dd1wU1+IF8DO7S+/SFEEQsCQW7L1FiRAbxBiN3byY+nvWp0lMNcWWXkxMMfZu7A1bjEkQe48aC0V6lS6w7M7vD4TEgAK7w87ucr7vw9PA7nAWlTncufeOIIqiCCIiIqrXFHIHICIiIvmxEBARERELAREREbEQEBEREVgIiIiICCwEREREBBYCIiIiAqCqyYO0Wi2SkpLg4OAAQRDqOhMRERFJQBRF5OXlwcvLCwrFw8cAalQIkpKS4OPjI0k4IiIiMqz4+Hh4e3s/9DE1KgQODg4VB3R0dNQ/GREREdW53Nxc+Pj4VJzHH6ZGhaD8MoGjoyMLARERkYmpyeV+TiokIiIiFgIiIiJiISAiIiKwEBARERFYCIiIiAgsBERERAQWAiIiIgILAREREYGFgIiIiMBCQERERGAhICIiIrAQEBEREVgIiIiICCwEREREBBYCIiIiAgsBERERgYWAiIiIwEJAREREYCEgIiIisBAQERERAJXcAeqz+KxCbDodj+j0AuQVqWFvrYKvqx1GdvJBUzc7ueMREVE9wkIgg2O3MvDDb9E4+lc6FAKgBSCKgCAACkHAkl9voUeAK17o449+LTzkjktERPUAC4EBiaKIH3+Pxvy916BUCBABaMR/fhzQiGXvOBGdhWO3MjFtQDNMD24GQRDkCU1ERPUC5xAY0NLfYzB/7zUAgEYrPvSx5cXgy8M38MWhG3WejYiI6jcWAgM5FZuFeXuv6vTcLw/fwK9/pUmciIiI6G8sBAay9PdoKBW6DfsrFQJ+/D1a4kRERER/YyEwgJScIhy8klrtZYIH0WhFRN7MRExGgcTJiIiIyrAQGMCWswl6H0OpELDpdLwEaYiIiCpjITCAuMwCKPRcJSCKIm5nFkqUiIiI6H4sBAZQUKKBVtTtckE5rQjkFZdKlIiIiOh+ZrEPgUYr4pdraTh8NRV3CkugFQEXWwv0ae6OgY82hKVKvt6Tn5+P3Mw0iKIW+vQvhQA4WJvFHxcRERkhkz7D5BeXYuWxWKw6FovUvGKoFAI0WhEiyq+5J6CBrSXGdWuCZ3s2hYudZZ3m0Wq1uHHjBqKionD8+HFERUXh8uXLsO8UDue+kyDo0UsECPDndsZERFRHBFGsfiw7NzcXTk5OyMnJgaOjoyFyVSslpwgTlp3AzbR8VDd5XyEAXs42WPNcV/hJeFLNzs7GyZMnK07+J06cwJ07dwAAjz76KLp164bu3bujRVBnTNqWqPMqAwAQAPz26mPwaWArUXoiIjJ3tTl/m+QIwZ2CEoz8PgqJ2XerLQNA2fX35JwiPPXdMez6by94OdvU+nNqNBpcvXq14qf/48eP4+rVqxBFES4uLujWrRumT5+Obt26oUuXLnB2dr7v+YNuaLD3copOpUCpENCnmRvLABER1RmTLATTN55HYvbdWp1cNVoR2YVqvLj6DHb+t2e19wbIzMysOPFHRUXh5MmTyMvLg0KhQJs2bdC7d2/Mnj0b3bt3R7NmzaBQPPx6wOTe/thzKbnGef+d/fk+/jo9l4iIqCZMrhDcTMvH0evpOj1XoxVxKTEHZ2/fQUffBhXvLy0txaVLlypO/sePH8eNG2X3D3B3d0e3bt0wZ84cdOvWDZ06dYKDg0OtP3eQjzM+CG+NN7ddrvVz/9urMXoEuNX6eURERDVlcoVg7Yk4KO9NHtSFUiHghyN/YZBLWsXJ/9SpUygsLIRKpUJQUBBCQkLw7rvvolu3bvD395fsToNju/pCgIC3tl+CIDz8NZS/Rs3pTVgdcQHP9z4KJycnSXIQERH9m0lNKlRrtAh67wAKSzR6HUfUlCL+67Fo2MAR3bt3r5j816FDB9ja1v11+gvx2fjpjxjsuZQMURShEARo//ErAAxs1RCTezWFdX4SevfujaCgIERERMDa2rrO8xERkXmozfnbpApBWm4Rusw/LMmxlo9qhn7tmkn2078uMvKLseVMAmIyCpBXXAp7SxWauNpiREdveDr+feKPjIxEcHAwQkNDsXnzZqhUJjewQ0REMjDbVQYFeo4M/JNjAzdZywAAuNlb4cW+AdU+rmfPnti8eTPCw8Px8ssv44cffpA9OxERmReT2rrYzkop4bFMqgthyJAh+Omnn7B06VK8/fbbcschIiIzY1JnxQa2lrC3UiFfzz39VQpBp70I5DZx4kSkpaXh1VdfhYeHB6ZOnSp3JCIiMhMmVQhUSgWe6eyD5cdi9VplMCzIC47WFhKnM4zZs2cjNTUV06ZNg7u7O0aPHi13JCIiMgMmdckAAMZ289VrC2CNVsT47r4SJjK8jz76CBMmTMDEiRNx4MABueMQEZEZMLlC0NTNDgNaekCpw6Q6pUJAOx9ntPNxlj6YASkUCixduhQDBw7E8OHDcfLkSbkjERGRiTO5QgAAn41shyYNbKBU1LwUKBUCXO0s8f34jmYxQ9/CwgKbNm1C27ZtMWjQIFy7dk3uSEREZMJMshA42Vpg40vd0cLTHjU5tysEwMfFBlte7nHf+n5TZ2tri927d8PT0xMhISFISEiQOxIREZkokywEAODhYI2fX+6BOU+0RON7KwZUCgECRIhaLVT3Rg88HKww8/Hm2PHfXmZ5t8AGDRpg//79EEURoaGhyMrKkjsSERGZIJPaqfBBtFoRv9/MwOGrqfjj1HncuHEDE54Zgb7N3dG/pQdUSpPtPTV27do19OrVCy1atMDBgwcNsgUzEREZt9qcv83iTKlQCOjb3B3vh7VGiEMiCg8txrwn22Bgq4b1ogwAQMuWLbF3715cuHABI0eOhFqtljsSERGZELM7W6pUKpSW6rdxkanq0qULtm7div3792Py5MnQarVyRyIiIhNhdoXAwsKiXv90PHDgQKxcuRKrVq3Ca6+9JnccIiIyESa1U2FN1PdCAABjxoxBRkYGpk2bBk9PT8yaNUvuSEREZOTMshCUlpZCFEWz2G9AV1OnTkVqaipmz54Nd3d3TJw4Ue5IRERkxMyyEABAaWlpxe/rqw8//BBpaWl47rnn4OrqiiFDhsgdiYiIjJRZziEAUO8vGwCAIAhYsmQJhg4dipEjR+LYsWNyRyIiIiNldoVApSob9KivKw3+TaVSYf369ejcuTMGDx6My5cvyx2JiIiMkNkVAo4QVGZtbY0dO3agSZMmCAkJQVxcnNyRiIjIyLAQ1BPOzs6IiIiAlZUVQkJCkJGRUeXj1BotsgpKkF9cNjGTiIjqB7OdVMhCUFmjRo1w4MAB9OzZE4MGDcIvv/wCe3t7FBSXYvv5RKw8FovrqfkVj7e2UGB4B2+M7+aLRxoZ35bVREQkHRaCeiYwMBD79u1Dv3798OTw4Rg86yt8/0cs7pZo8O9FmkVqLTaeise6E7fRoYkzPh/VDr6udrLkJiKiusVLBvVQhw4dsHXbNlywbocvfrmFuyUaAEBVFwg02rL3XkjIwbDFkbicmGPApEREZCgsBPXUHwUNYftonxo/XqMVkVekxvifTiA+q7AOkxERkRzMrhBw2WH1LiZkY8WxWKDSRYKH04pAblEp5u29Wie5iIhIPmZXCDhCUL3VUXFQKnTb1lmjFXHgzxSk5hZJnIqIiOTEQlDPZBeWYPv5xIq5Abpaf/K2RImIiMgYsBDUM0evp0Ot0a8MaEVg98VkiRIREZExYCGoZ7IKSqDj1YJKxyEiIvPBQlDP6HupoJxWouMQEZFxMLtCwFUGD+dkYwEpzuWONvX71tJERObG7AoBRwgerpu/ay0XG1amVAjo29xdkjxERGQcWAjqGZ8GtujXwl3nZYdA2WWH8d19JUxFRERyYyGohyZ099N5LoFCADr7uaC5p4PEqYiISE4sBPVQ3+bu6BHgWuvVBgIAhSDg9Sda1kkuIiKSj9kVAqVSCUEQWAgeQqEQ8P34jmjZ0KHGpUAQyt6+fKY9Ovo2qNuARERkcGZXCICyUQIWgodzsLbA5pd64LEWHgDw4DkFohYAYG+lwvJnu2Bw20aGikhERAakkjtAXVCpVFx2WAN2Vir8NKkzLifmYM3xOGw7l4jiUu19jylJi8UH4/tjTK+WsLFUypSUiIjqmlkVglKNFtEZBbD2aY3bhSrcSs+Hv5sdBEGCrfnMWOvGTlj4VFu8MfgR3EjNR26RGtYqJVTqfHR9dCiE3kth07+V3DGJiKgOCaIoVjvdPDc3F05OTsjJyYGjo6MhctVKWl4RNp2Kx6qoOKTlFd/3Md8GtpjU0w/DO3jDiZvp1Frv3r3h4uKCnTt3yh2FiIhqqTbnb5OeQyCKIr44dB3dF/yCzw5er1QGAOB2ViHe33UFXeYd4h36dBAeHo6DBw+ioKBA7ihERFSHTLYQiKKIOVsv4YtDN6DRig/cjle891ZcqsWcrZfw9eEbhoxp8sLCwlBUVIQDBw7IHYWIiOqQyRaCLw/fwIZT8bV+3qcHr2Pz6do/r74KDAxEq1atsH37drmjEBFRHTLJQpCeV4yvf7mp8/M/3HMVxaUaCROZt/DwcOzevZsrN4iIzJhJFoJNp+NRg7mQD5RzV419l1IkTGTewsLCkJWVhT/++EPuKEREVEdMrhBotCJWHovV6xa+CgFYHhkjXSgz17FjRzRu3JiXDYiIzJjJFYLo9PwqVxPUhlYELiTkoKCYQ+A1oVAoEBYWhh07dug1MkNERMbL5ApB9l3ptiTOkfBY5i4sLAyxsbG4ePGi3FGIiKgOmFwhqO0d+h7mgfv3UyX9+vWDo6MjLxsQEZkpkysELraWkh2LOxfWnKWlJQYPHowdO3bIHYWIiOqAyRWCpm528HW1hT4/2ysVAnoFusHagjfrqY2wsDCcO3cOcXFxckchIiKJmVwhEAQBz/bw0+sYGq2IiXoeoz564oknYGFhwVECIiIzZHKFAACGd/SGpUq36AIATwcr9G/pIW2oesDR0REDBgxgISAiMkMmWQgcrS0wd5hut+MVBGDhiLacUKijsLAwHD16FFlZWXJHISIiCZlkIQCA0V2aYNbA5jV/gihC1Goxs6cHHmvB0QFdDRs2DBqNBnv27JE7ChERSchkCwEA/Ld/M3zydFDFaoGqfuhXCmXvdHewgtWJZfhm9gTk5uYaMqZZ8fLyQteuXXnZgIjIzJh0IQCAER29cfLNAfjymXZo6+1c6eM9Al2xdEInHH8jGLt+WIikpCRMmDABWq3W8GHNRFhYGCIiInD37l25oxARkUQEsQZ70ebm5sLJyQk5OTlwdHQ0RC6dFZaUIueuGgpBgJONRaWlhbt378awYcMwd+5cvPPOOzKlNG1Xr17Fo48+il27dmHIkCFyxyEiogeozfnb5EcI/s3WUoVGTjbwdLSucp+BIUOG4L333sO7776LXbt2yZDQ9LVs2RLNmzfnZQMiIjNidoWgJt588008+eSTGDduHK5duyZ3HJMjCALCwsKwc+dOaDQaueMQEZEE6mUhUCgUWLlyJby9vREeHo6cnBy5I5mc8PBwpKWl4fjx43JHISIiCdTLQgAADg4O2L59O1JSUjB+/HhOMqylrl27wtPTk5cNiIjMRL0tBADQrFkzrFu3Drt378b7778vdxyTolQqMXToUGzbtg01mJdKRERGrl4XAgAYNGgQPvjgA7z33nv8abeWwsPDcfPmTVy9elXuKEREpKd6XwgA4I033sBTTz2F8ePH8+RWCwMGDICdnR22b98udxQiItITCwHKZs2vWLECTZo04STDWrC2tkZoaChHVoiIzAALwT329vbYvn070tLSMG7cOE4yrKHw8HCcPHkSiYmJckchIiI9sBD8Q2BgINavX489e/Zg7ty5cscxCYMHD4ZSqcTOnTvljkJERHpgIfiX0NBQzJs3Dx988AG2bdsmdxyj5+Ligr59+/KyARGRiWMhqMLrr7+OESNGYMKECbhy5YrccYxeeHg4fvnlF869ICIyYSwEVRAEAcuXL0fTpk0RHh6O7OxsuSMZtbCwMKjVauzbt0/uKEREpCMWggewt7fHtm3bkJGRgbFjx3LP/odo0qQJ2rdvz8sGREQmjIXgIQICArB+/XpERETg3XfflTuOUQsPD8eePXtQXFwsdxQiItIBC0E1QkJCMH/+fMybNw9bt26VO47RCgsLQ15eHn799Ve5oxARkQ5YCGrg1VdfxciRIzFhwgRcvnxZ7jhGqW3btvDz8+NlAyIiE8VCUAOCIGDZsmUICAhAeHg47ty5I3ckoyMIAsLDw7Fjxw5u6kREZIJYCGrIzs4O27ZtQ1ZWFsaMGcNJhlUICwtDUlISTp8+LXcUIiKqJZXcAUyJv78/Nm7ciNDQULz99tuYP3++3JGMSq9evdCgoTc+2nYCzRJskF9cClsLJRq72GB4h8bwdrGVOyIRET2AINbgZva5ublwcnJCTk4OHB0dDZHLqH388cd49dVXsXnzZowYMULuOEbhr5Q8/PRHNDafioMIBVRKBbSiCIUgQCuKEAH0a+GOyb380TPQTe64RET1Qm3O3ywEOhBFEWPGjMGuXbtw/PhxtG7dWu5IstpzMRnTNp6DKAIa7YP/OikVAjRaEVMHNMOM4GYQBMGAKYmI6p/anL85h0AHgiDgp59+QmBgIMLCwpCVlSV3JNnsu5SM/647C41GfGgZAP4uC18dvoGP9/9liHhERFRDLAQ6srW1xbZt25CdnY3Ro0fXy0mGMRkFmLrhHACg2mGmf/n211uIuJwsfSgiItIJC4EemjZtio0bN+LQoUN488035Y5jcCuPxUIr1r4MAIBCAJb8ekvyTEREpBsWAj0FBwfjo48+wqJFi7Bp0ya54xhMYUkpNp2Or/YywYNoReBCQg4uJ/IOiURExoCFQAIzZ87EmDFj8Oyzz+LixYtVPkarFaHV8eRpjHZfTEZhiX6XSZQKARtO3ZYoERER6YP7EEhAEAT8+OOPuHLlCsLDw3H69Gm4uLjg7O1srI6KxaGraSgoLgUA2FmpEPyIB8Z390OHJs4mO9M+Or0AKoWAUj1KjkYr4mZavoSpiIhIVywEEimfZNipUycMmzwTtr2fxfXU/IqlduXyi0ux62Iytp9PQgtPe7wf1hpd/V1lTK6b3MJiiDrNHrhfzt1SCdIQEZG+WAgk5Ofnh1lfrcOS80UQUvIAQajyGnv5+26k5WPs0hP48pn2GNy2kaHjPlRJSQni4+MRGxuLmJgYxMbGVrzFxMTgbvOBcOgUBkFpodfncbTmX0EiImPA78YS+uNGBn64pIagUACo/lKAVizb5GjK+rNwtu1q0B381Go1EhISqjzZx8bGIjExEeV7VgmCAG9vb/j5+cHf3x8DBgxApnNL7E7VrwwoFQKautlJ8XKIiEhPLAQSUWu0mL7x3L1B9JrPCxDvPXr6xvOIer0/VEpp5nmWlpYiMTHxgSf8hISEirsSCoIALy8v+Pn5wc/PD/369av4vZ+fH3x8fGBpaXnf8XOL1Dj44SEUl+p+Z0ONVsSozj56vU4iIpIGC4FEDl1JRUZ+iU7P1YpAel4xDl1NQ2jrhjV6jkajQVJS0gNP+PHx8fdtltSoUaOKE3yvXr3uO+E3adIEVlZWtcrsaG2Bpzp6Y+Mp3ZYeKgSghacD2vk41/q5REQkPRYCiaw4FgulAGh0nGenFMo2+ikvBFqtFklJSVWe7GNjY3H79m2Ulv49Ic/T07PiBN+1a1c0bdq04r99fX1hbW0txcu8z8TufthwUrdlg1oReKGvv8musiAiMjcsBBK4U1CCEzH63c9AIwJR0ZnoHzoU8beuIS4uDmq1uuLj7u7uFSf4jh07Vjrh29oa/tbCLRo6YOFTbfHqz1XvvfBAooiSK4fRsKgBAO86yUZERLXDQiCBzIJiyY5l6+KOsLAWlU749vb2kn0OKY3s5AONVsSb2y5BeMCqinIKoWxkYFTHRog8dgbBwT9gy5YtCA0NNWBiIiKqCguBBNS6Xieowieff4GWDU3rFtOjuzRBc08HfP/bLRy6kgqgbLKkKJZNmFTc24uhnY8zJvf2xxOtG6Jo6H6MGjUKQ4cOxapVqzB69GhZXwMRUX3HQiABJxv9lt/V1bEMqaOvC34Y3wnJOXex8VQ8bqTmI7dIDTtLFRq72GBER2880ujvomNjY4OtW7di8uTJGDNmDDIyMjBlyhQZXwERUf3GQiCBho7WaOhkjZScIr2O08jJGp4O0k/+M6RGTjaYHty8Ro9VqVRYtmwZ3NzcMHXqVKSnp+O9997jREMiIhmwEEhAoRAwsbsfPt5/Dbpu7a8QgEk9/KBQ1K+ToUKhwCeffAJPT0+8+uqrSE9Px+LFi6FUKuWORkRUr/BuhxIZ2ckbCj1+slUIAp7uVH836Zk9ezaWLVuGH374Ac888wyKi6WbqElERNVjIZCIq70VXuzrr/PzX+obgAZ2ltU/0Iw9++yz2Lp1K3bt2oXBgwcjLy9P7khERPUGC4GE/vd4CwwLqv1NioYFeWHm4zW77m7uwsLCcODAAZw6dQqPPfYY0tPT5Y5ERFQvsBBISKEQ8Pmo9niuV1MAZTfveZDyj03u1RRfjGpX7+YOPEyfPn1w9OhRJCQkoFevXoiLi5M7EhGR2RPE8lvaPURubi6cnJyQk5MDR0fTWiMvl5tp+Vh7Ig4bT8WjsERz38dsLZV4pnMTjO3WBAHuxrnhkDG4desWBg4ciOLiYuzfvx+tWrWSOxIRkUmpzfmbhaCOFZaU4kzcHWQXqnHgwAEs/34xki7+AUdb015eaCjJyckIDQ1FfHw89uzZg+7du8sdiYjIZNTm/M1LBnXM1lKF3s3cMTTIC0ODvFBw6wwyUpLkjmUyGjVqhKNHj6J169YIDg7Gvn375I5ERGSWWAgMKCAgAEDZUDjVnLOzM/bv34/g4GAMGzYMa9eulTsSEZHZYSEwIF9fX6hUKty8eVPuKCbHxsYGW7Zswbhx4zBu3Dh89dVXckciIjIr3KnQgFQqFXx9fTlCoKPyrY7d3d0xbdo0pKen4/333+dWx0REEmAhMLDAwECOEOhBEAR89NFHcHd3r9jq+JtvvuFWx0REemIhMLCAgAD89ttvcscwebNnz4abmxuef/55ZGRkYO3atbCyspI7FhGRyeIcAgMLDAzErVu3UIPVnlSN8q2O9+zZg0GDBnGrYyIiPbAQGFhAQADu3r2L5ORkuaOYhWHDhmH//v04c+YMHnvsMaSlpckdiYjIJLEQGFhgYCAAcB6BhMq3Ok5MTETv3r0RGxsrdyQiIpPDQmBgTZuW3eeAKw2kFRQUhMjISJSWlqJnz564fPmy3JGIiEwKC4GB2djYwNvbmyMEdcDf3x+RkZFwd3dHnz59cOzYMbkjERGZDBYCGQQEBHCEoI40bNgQR48eRZs2bRAcHIy9e/fKHYmIyCSwEMiAexHULScnJ0RERGDgwIEICwvjVsdERDXAQiCDgIAA3Lx5k0sP65CNjQ1+/vlnTJgwAePGjcOXX34pdyQiIqPGjYlkEBgYiJycHGRlZcHV1VXuOGZLpVJh6dKlcHNzw/Tp05GWloYPP/yQWx0TEVWBhUAG/7zrIQtB3RIEAYsWLYK7uztmz56N9PR0LFmyhFsdExH9Cy8ZyKC8EHAegeHMmjULK1aswLJlyzBy5EgUFRXJHYmIyKiwEMjAyckJbm5uXGlgYBMnTsS2bduwd+9eDBo0CLm5uXJHIiIyGiwEMuFKA3kMHToUBw8exNmzZ7nVMRHRP7AQyIR7EcinV69e+O2335CUlISePXtyq2MiIrAQyIYjBPJq27YtIiMjIYoievTogUuXLskdiYhIViwEMgkICEBqairy8/PljlJvlW917OnpiT59+iAyMlLuSEREsmEhkEn5XQ952UBenp6e+PXXXxEUFITHH38ce/bskTsSEZEsWAhk8s+9CEhe5Vsdh4SEICwsDKtXr5Y7EhGRwXFjIpm4u7vDwcGB8wiMhLW1NTZv3oyXXnoJEyZMQEZGBmbMmFHpcdHp+dh5IQmpuUUoVmvhYK1CG29nDGnbCNYW3OyIiEwXC4FMBEHgSgMjo1Kp8OOPP8Ld3R0zZ85Eeno65s2bBwA4dDUNyyNjcOxWJpQKAQIAURQhCAJKo+Iwd+efGN3FBxN7+MHbxVbeF0JEpAMWAhkFBgayEBgZQRCwYMECuLu743//+x9S0zPgEfp/WH8qAcp7t0DQaP9xU6p7N6jKLy7FsshYrDt5G8smdkZXf25JTUSmhXMIZFR+10MyPjNnzsSKFSuxM9ke60/GAwA01dycUqMVcbdEg3E/ncDp2CwDpCQikg4LgYwCAwMRHx+P4uJiuaNQVZr1gV3rAUAt7o6oFcuKwX9WnEJ2YUkdhiMikhYLgYwCAgKg1Wq5U54R0mhFLDmq2+UcrQjkFZdi8+kEiVMREdUdFgIZcS8C4/XrX2lIydH9joiiCKw4FguttprrDERERoKFQEaNGzeGlZUV5xEYoTUn4qBU1PxSQVUSs+8iKjpTokRERHWLhUBGCoUC/v7+HCEwQjdS8+9fTaADAcCtdG5NTUSmgYVAZrzJkXEqLNbofQyFQkBeUakEaYiI6h4Lgcy4OZFxsrHUf9dBrVaEvRW3+iAi08BCILMm/s1wO7sEZ2Iz8VdKHnIK1XJHIgB+rrbQcwoBRAC7N6zArl27eFdLIjJ6giiK1V4ozc3NhZOTE3JycuDo6GiIXGbvWkou1hyPw8aTt6HW/v1+hQAMbNUQE7r7oru/K4RarIEn6ey+mIT/rjun1zEstcVQb3kVsdG3YGlpid69eyM0NBShoaFo1aoV/2yJqM7V5vzNQmBgOXfVmLr+HI5eT4dSIVQ5ca38/c087PHDhE5o6mYnQ9L6raRUi27zDyNLx82FFAIwPbg5pvQvmyMSERGBiIgIHDlyBHfv3kXjxo0rykFwcDCcnZ2lfQFERGAhMFqZ+cV4+vsoxGUUQlP9lx1KhQA7SyXWv9ANrbycDJCQ/umbIzfxyf6/UNu1BgIAS5UCv7/6GDwcre/72N27d/H7779XFISrV69CqVSiW7duFQWhQ4cOUCh4NY+I9MdCYISK1BqM/D4Kfybl1mo5m1IQ4Gxrgd1Te6GRk00dJqR/K9Vo8fzq0zj6Vzpq+kcm3Pu/nyZ2Qv+WntU+Pi4uDvv370dERAQOHTqEvLw8uLu7Y+DAgQgNDUVISAjc3d31eh1EVH+xEBih9SdvY87WSzo9V6kQMLqLDz4MbyNxKqpOkVqDKevP4eCV1LJbHj/ksUqFAIUAfPVMezzRplGtP5darUZUVFTF6MG5c+cgCAI6duxYMXrQtWtXqFRcuUBENcNCYGREUUToF7/jeloeanCloErWFgqcejMYDtYW0oajamm0IjaeisdPf0TjVnoBVAoBpVotAAGCUDYqoBAEDG7bCC/2CcCjXtL8G0lJScGBAwcQERGB/fv3IysrC05OTnj88ccrRg+8vb0l+VxEZJ5YCIzMmbg7eGrJMb2OIQB4P6wVxnf3kyQT1Z4oijgddwdbzybi9J83cPHPq3hycAjaeDtjVGcfuNlb1dnn1mg0OHPmDPbt24eIiAicPHkSWq0WrVu3rhg96NWrF6yspM8giiIuJORgdVQsDl9LQ15RKQQAjjYWCGnVEOO7+UpWgohIWiwERuazg9fxzZGbem2FKwB4rKUHlk3qLF0w0tnKlSsxadIklJSUwMLC8KM2mZmZOHToUMXlhZSUFNja2qJ///544oknEBoaCn9/f70/z4noTMzd9SeuJudVuSqm/H3tfZzxXlgrtPV21vtzEpF0anP+5lRmA8guLIG+K85FlK1SIONQvodADfp0nXB1dcWoUaOwfPlyJCUl4fz583jnnXeQn5+PadOmISAgAM2bN8fUqVOxd+9eFBYW1vpz7LqQhDFLT+CvlDwAqLLQlr/vQkI2nv4uCkeupen3wohINiwEBiDV9jPcyMZ4yF0I/kkQBAQFBeG1117DkSNHkJmZie3bt2PAgAHYuXMnBg8ejAYNGmDgwIH47LPPcOXKlWpz/3Y9HdM2nINGK9ZohYVWLNu74YXVp3H29h2JXhkRGRILgQG42FnWei37vwkC4GZvKUke0p8xFYJ/c3R0RFhYGJYsWYKYmBhcu3YNixYtglKpxJtvvolWrVrBz88PL774IrZt24bc3Nz7nl9cqsG0Dedq/XdWRNmIwdT156DV806RRGR4LAQGMKClp9630hVFIPiR6te1k2EYcyH4J0EQ0KJFC0ybNg379u1DVlYW9u3bhyeffBJHjx7F8OHD4erqir59+2LBggU4d+4c9l1Kxp1CtU4rYrQikHDnLv64mSH9iyGiOsVCYABtvJ3Q2stRr5vl2FoqMaydl3ShSC+mUgj+zcbGBqGhofjiiy9w7do1REdH4+uvv4aLiwvmz5+PDh06YOrXWwBRW/3BHkCpELAyKla60ERkECwEBjKpZ9Ma73b3bwoBGNnJB7aW3JDGWJhqIfi3pk2b4qWXXsL27duRmZmJrfsOQ+ERCAi6f2vQaEX8ci0NhSWlEiYlorrGQmAgYe280LVpAyhrOzFQq0FpfhZ6OOdW/1gyGHMpBP9kaWmJZm06SnIsUQSyCnS7MRQRyYOFwEAslAr8MKETWjRyqPGlA6VCgIu9FRpe3YywkP74+eef6zYk1Zg5FgIAUGt0v1RQ+Vjm9bUhMncsBAbkZGOBn1/qjkFtGkEAoHxAMVDeawxtvZ2wZ2of/LZ7E8LDw/H0009j0aJFZncSMkXmWggcbaTbZMlJwmMRUd3jRWkDs7VUYfGYDngttBBrT9zGuhNxyC36+1qrpVKB8PZeGN/ND228/77l8dq1axEYGIjXX38dN27cwJIlS2TZIY/KmOueEE0a2MLF1gJ3CtU6H0MA4HPvOERkOlgIZOLTwBavP9ESswY2R2ZBCfKK1LC1VKGBnSWsLZSVHq9QKPDBBx8gMDAQzz//PGJjY/Hzzz/D2dnZ8OGpgrmNEFgoFRjXzRffHLmp8yRYAJjYw89sSxORueIlA5mplAp4Oloj0MMBXs42VZaBf5o4cSIOHDiAs2fPokePHoiJiTFQUvonc71kAACjuzTRayMtBUQ81aGxZHmIyDBYCExQv379EBUVhZKSEnTt2hXHjx+XO1K9Y86FwMvZBhO6+eq85XbmH+sx6smhSEpKkjQXEdUtFgIT1aJFCxw/fhzNmzfHY489xhUIBmbOhQAA3h7yKPq1dEdtR/3D23lh3ZvjcOnSJbRu3RqbNm2qm4BEJDkWAhPm5uaGQ4cOYfjw4Xj66aexcOFCsz1BGRtzLwQqpQI/jO+Epzt6A/h75UtVyj82uVdTfDayHQY98QQuXbqE4OBgjBo1CuPGjUN2drYhYhORHlgITJy1tTXWrFmDd955B3PmzMHzzz8PtVr3GeJUM+ZeCICyCYYfjQjC7im9MLKTN6xUlb9d2FgqMb6bLw7N7IO3hjwKxb1y4Orqio0bN2LNmjXYvXs32rRpg19++cXQL4GIakEQa/AdLTc3F05OTsjJyYGjo6MhcpEOVq1ahcmTJ6N3797YsmULVyDUoR07diA8PBxpaWlwd3eXO45B5NxV43RsFrIL1RCEsrt4dvFrADurhy9Wun37NiZNmoQjR45g+vTpmD9/PmxsbAyUmqh+q835myMEZmTChAk4ePAgzp07xxUIdaw+jBD8m5ONBQY84omnOnpjeAdvPNbCo9oyAABNmjTBoUOH8Nlnn2HJkiXo1KkTzp07Z4DERFQbLARmpm/fvjh+/DjUajW6du2KqKgouSOZpfpYCPShUCgwY8YMnDlzBpaWlujatSsWLFgAjUYjdzQiuoeFwAw1b94cUVFRaNGiBR577DHO9K4DLAS6adWqFU6cOIFZs2bhrbfeQp8+fRAdHS13LCICC4HZKl+BMGLECIwaNQrz58/nyUtCLAS6s7S0xPz583H06FEkJyejbdu2WLp0Kb+WRDJjITBjVlZWWL16NebOnYs333wTzz33HEpKeEtaKbAQ6K9Xr164cOECnnnmGTz//PMICwtDamqq3LGI6i0WAjMnCALeffddrF69GmvXrkVoaCju3LkjdyyTx0IgDQcHByxduhQ7duzA8ePH0aZNG+zYsUPuWET1EgtBPTFu3DgcPHgQFy5cQI8ePXjdVk8sBNIaNmwYLl++jO7duyM8PBzPPfcc8vLy5I5FVK+wENQjffr0wfHjx1FaWoquXbvi2LFjckcyWSwE0vPw8MD27duxdOlSbNq0CUFBQfjjjz/kjkVUb7AQ1DPNmjXD8ePH8cgjj6B///7YsGGD3JFMEgtB3RAEAc899xwuXLgALy8v9OnTB3PmzOHcFyIDYCGoh1xdXXHw4EE8/fTTGD16NObNm8cTWy2xENQtf39/HD16FPPnz8enn36KLl264PLly3LHIjJrLAT1lJWVFVatWoW5c+firbfewn/+8x/+FFYLLAR1T6lU4vXXX8eJEyegVqvRqVMnfPbZZ9BqtXJHIzJLLAT1WPkKhDVr1mDdunVcgVALLASG0759e5w5cwavvPIK/ve//yE4OBi3b9+WOxaR2WEhIIwdOxaHDh3CxYsX0b17d9y6davKx4miiFOxWVgVFYtvjtzE0t+jsfdSMorU9W/7WRYCw7K2tsZnn32Gw4cP4+bNm2jTpg3WrFnDrz+RhKq/MwnVC71798bx48cxaNAgdOvWDdu3b0fPnj0BAPnFpdh2LhErImNwK70AAgClQoBWFKEVAXsrFUZ38cG4br7wdbWT94UYCAuBPPr374+LFy9iypQpGD9+PHbs2IHvvvsOrq6uckcjMnkcIaAKgYGBiIqKwqOPPooBAwZg/fr1uJ6ahwGf/oq3t19GdHoBAEAEUKotKwNAWWFYFhmLxz75FRtP1Y+hXBYC+Tg7O2P16tXYuHEjDh8+jDZt2iAiIqLa52m0Io5HZ2LbuQSsO3Ebuy4k4VZ6vgESE5kGjhDQfVxdXXHgwAE8//zzmDh1Dnyfs4NWUfbX5GGnPs29dvDalku4W6LBpJ5NDZBWPiwE8hs5ciR69eqFZ599Fk888QReeeUVfPTRR7Czu3+UKjO/GBtPx2PVsTik5BZVOk6Xpg0wqYcfHn/UExZK/oxE9Rf/9lMlVlZW+Pq7pQiY/DlKtH+f7GvqvV1X8Nv19DpKZxxYCIyDl5cXIiIisHjxYixfvhwdOnTAyZMnKz4ecTkF3Rf+go/3/1VlGQCAM7FZeGXtWYR+8RsSs+8aKjqR0WEhoCr9fDYRRaIlBIWy1s8VBOCLQ9frIJXxYCEwHoIg4P/+7/9w7tw5ODk5oUePHpg7dy42n4rDy2vOQF2qxcP+mDT3PhabWYhhi/9AfFahYYITGRkWAqpEqxWxIjJG9+eLwNnb2biWkithKuPCQmB8WrRogcjISLz11lv4aPkWzP75IkQ8/FLXP2m0IrIL1Rj/0wkUlpTWZVQio8RCQJVERWci/s7dGn8jrYpSIWDN8TjJMhmT6PR8nE8rhW3L3jgRX8CJaUbEwsICc+fOxWNTPsVDhwUeQKMVEZtZiB3nk+ogHZFx46RCquRSYg6UggCNHj/9arQizsdnSxdKZiWlWuz/MwUrjsXiTFzZ5k3uYa/h3cMpwOEUdPR1waQefghp1RCWKvZsOd1Kz8efGWpAh8tdACAAWB4Zg2c6+1SMBBHVBywEVElekRoK4e9rq7rKLlRLE0hm11PzMHHZSSTnFEHxgPPDudt3cCbuDho5WWPFs13QoqGDYUNShbXHb0OpEGo9GbacCOB6aj7O3r6Djr4NpA1HZMRYCKgSK5VSr8sF5aKvX0PDhmPg7e1d6c3Hxwfe3t5o3LgxrK2tJfhsdeNyYg5Gfh+F4tKy/fMfdI4pf39aXjGe/DYSG1/ojjbeTgZKSf90MjZT5zJQTiEAZ+OyWQioXmEhoEoaOlqjVM9vqAKAR3wbot///R8SEhKQkJCA33//HfHx8ZXul+Dm5lapKPz7zdbWVq88ukjNLcKEn06iSK15YBH4N41WRJFagwnLTmDftD5o6GS8ZcdcSTEypRAE5BaZxwgXUU2xEFAlIa0a4q3tl1Gi0f2uciKAqcO6Iqzd8EofKygoQGJiYkVRiI+Pr/h9VFQUEhISkJGRcd9zGjRo8MBRhvI3e3t7nfNWZdkfMcgpUte4DJTTikBuUSmWRcbgjUGPSJqJqifVHA5uUkT1DQsBVeJka4Hw9l7YcjZR56FXZxsLhLZuWOXH7Ozs0Lx5czRv3vyBz7979+59peGf5eH06dPYvn070tLS7s/t5PTAUYby9zk6OtYof5Fag3Unbuv8+jVaEetP3MbMx5vD2kK3yW2km4aO1ojJKNBlkUEFjVaEm72VdKGITAALAVVpQnc/bDqdoNNzFQIwvrsvrFS6nwhtbGwQGBiIwMDABz6muLgYSUlJlUYZEhIScOHCBezZswcpKSn37RXg4ODw0FEGb29vODs7Y8/FZOQV67cWPa+4FLsuJOHpTj56HYdqJ7xdYxy7lanXMZQKASGtPCVKRGQaWAioSq0bO2F2SAt8vP+vWj1PqRDQ1tsJ//fYg0/kUrGyskLTpk3RtOmD75tQUlKC5OTkSqMMCQkJuHLlCg4cOIDk5GRotX9fHrGzs4PnkJmAbydA0L3UqBQCTsVmsRAY2NAgL7y3+08UFOt2W26lQsCQto3gyhECqmdYCOiBXukXgLslGiw+chMCqt/xTSEAbRo7YfmkzkYzTG5paQlfX1/4+vo+8DGlpaVISUm5b5Rhc7IzkvTct0ujFZFzlxPTDM3GUonRnZtgWWRMred/AGV/buO7+0mei8jYsRDQAwmCgFkhLdC8oQO+PHQdt9ILKq3vVghlk+gcrFQY060JZgSb3jVzlUpVcbmg3K11Z5FyKVmnE0o5QQBUnJgmi2nBzXD0ejqiMwpqPQ/kxb7+6OjrUkfJiIwXCwFVa1iQF4a2bYRTsXewOioWlxJzkFdUCmsLJRq72GBkJx8MadvI5IrAw7jZW0EhCNDqMTNNIQhws7OUMBXVlIO1BVY/1xVjlx5HbEZBjTfZGtu1CV4LaVm34YiMFAsB1YggCOjStAG6NK0fG7UMatMIK47F6nWMUq2IQW0aSROIaq2hkzW2vtITH+y+gu3nEqERxUorD8pHuDT5dzA6yAUfhrfmdsVUb3E8k6gKnf1cEOBuB11PDaKohTY7CYc3/IC8vDxJs1HNOdlY4JOng3DyzWC8HtoSAe52sLNUQqUQ4GijQjd/V3w3rgP8L/+EiK/n3De5lKi+EcQa3L81NzcXTk5OyMnJqfE6biJTt/p4HN7ZflmnbZwFAI/evYRD370Le3t7zJgxA1OnTuW/HyN14sQJdOvWDStXrsSECRPkjkMkmdqcvzlCQPQAz3T2QTd/VyhrOYSsFAR083fFtk9fxa1btzB69Gh88MEH8PX1xfvvv4/s7Oy6CUw669q1K5566im8/fbbKCoqkjsOkSxYCIgewEKpwPcTOqKtj9MD73L4bwoBaOvjhO8ndISlSgFvb28sXrwY0dHRGD9+PObPnw8/Pz/MnTuXxcDIzJ8/H4mJifjmm2/kjkIkC14yIKpGkVqDD/dcwcZT8Si9N139n/9oyruCSilgVGcfvDX40QeuuEhKSsLHH3+M7777DpaWlpg2bRqmT5+OBg3qx2RNY/fyyy9j48aNiI6OhrOzs9xxiPRWm/M3CwFRDWUXluDnMwlYe+I2bmcVQqMVoVQI8HGxwbhuvhjR0RvOtjVbZpiSkoKPP/4YS5YsgUqlwtSpUzFjxgy4urrW8augh0lOTkZgYCCmTJmChQsXyh2HSG8sBER1TBRFFJdqYaVS6LVMLTU1FZ988gm+/fZbKBQKTJkyBTNnzoSbm5uEaak23nnnHXz88ce4cePGfZtVEZkiTiokqmOCIMDaQqn3mnVPT098/PHHiImJwSuvvIKvvvoKfn5+eO2115Ceni5RWqqNWbNmwd7eHnPnzpU7CpFBsRAQGQEPDw8sWrQIsbGxmDJlCr799lv4+flh9uzZlW7zTHXL0dERb7/9NpYvX44rV67IHYfIYHjJgMgIZWZm4vPPP8dXX32F0tJSvPzyy5g9ezYaNmwod7R6oaSkBC1btkSbNm2wY8cOueMQ6YyXDIhMnKurKz788EPExsZi1qxZWLp0KZo2bYoZM2YgOTlZ7nhmz9LSEvPmzcPOnTvxxx9/yB2HyCA4QkBkAu7cuYMvv/wSX3zxBYqLi/HCCy/gtddeg5eXl9zRzJZWq0Xnzp1hZWWFyMhI3uOATBJHCIjMjIuLC+bOnYvY2FjMmTMHq1atgr+/P6ZMmYKEhAS545klhUKBRYsWISoqipcNqF7gCAGRCcrJycHXX3+Nzz77DAUFBXjuuecwZ84c+Pj4yB3N7AwcOBDx8fG4dOkSVCreIJZMC0cIiMyck5MT3nrrLcTGxuLdd9/Fxo0bERAQgJdeeglxcXFyxzMrixYtwrVr17B8+XK5oxDVKY4QEJmBvLw8fPvtt/jkk0+Qk5ODSZMm4Y033oCfn5/c0czC2LFjceTIEdy8eRO2trZyxyGqMY4QENUzDg4OeO211xATE4N58+Zh+/btaNasGSZPnozo6Gi545m8Dz/8EBkZGfjyyy/ljkJUZ1gIiMyIvb09Zs+ejZiYGCxcuBC7du1C8+bN8eyzz+LmzZtyxzNZTZs2xSuvvIKFCxciIyND7jhEdYKFgMgM2dnZ4X//+x9iYmLw8ccfIyIiAi1btsTEiRNx48YNueOZpDfffBOiKGL+/PlyRyGqEywERGbM1tYWM2bMQHR0ND799FMcPHgQLVu2xPjx4/HXX3/pdWytVkR+cSlKNVqJ0ho3d3d3vPrqq/jmm28QGxsrdxwiyXFSIVE9UlRUhKVLl2LhwoVITk7GM888g7feeguPPPJIjZ6fX1yKbecSsepYLG6m56P8u0cDO0s809kHY7o2gbeL+U66KygoQGBgIIKDg7F69Wq54xBVi7c/JqKHKioqwrJly7BgwQIkJiZi1KhRePvtt/Hoo49W+XiNVsTnB6/jpz9icFetgQDg3984FELZ+4If8cTC4W3gam9V1y9DFt9//z1efvllnD17Fu3atZM7DtFDsRAQUY0UFxdj+fLlWLBgAeLj4zFixAi88847aN26dcVjSkq1eGXtWRy6mlqjYyoVAho6WmPDC93g08D8RgvUajVat24Nf39/7Nu3T+44RA/FZYdEVCNWVlZ46aWXcOPGDXz33Xc4efIk2rRpgxEjRuDixYsQRRGvbrmIw9dqVgaAstGElNwijFt6AtmFJXWYXh4WFhZYsGABIiIi8Msvv8gdh0gyHCEgogolJSVYtWoV5s2bh9jYWPQfOwW3vEN0OpZSEDCxhx/eGVr1ZQhTJooiunfvjtLSUpw8eRIKBX+2IuPEEQIi0omlpSUmT56M69evY9myZbil9IaoKdXpWBpRxIZTt1FYotvzjZkgCPjoo49w5swZ/Pzzz3LHIZIECwERVWJhYYHgsFEQGrWCoNT9hj6FJRrsPJ8kYTLj0adPHwwZMgRvvPEGSkrM79II1T8sBERUpQNXUiEI+h1DEIA9l5KlCWSEFixYgOjoaPz4448AgMuJOdh8Oh7LI2Ow4eRt/HY9vd7s00Cmj/fyJKIqZeYXQykI0FY/zeiBRBFIzyuWMJVxad26NcZNfBbz1h3GrpJWuJZaAKBsCab23pfN3d4KE7r7YlQXH3g4WMuYlujhWAiIqEoarQjoOUIAAPGJSXj//ffh7e1935s5TFC+lZ6PvwJGwdJTjWup+Sj/gmn/0aHS84vx+aHr+PqXm/hqdDuEtm4kT1iiarAQEFGVnGwt7jux6ao4Nwvfrv4Wqan3L110cHBA48aNKxWFf741aNAAgr7XLerIjdQ8DF9yDIUlmnvveXBOrQioNVq8vOYsPhsVhCfbexsmJFEtsBAQUZW6NnUtGyXQg0IAXhkRjJnfv4KSkhIkJycjISGh0tu1a9dw+PBhJCUlQaPRVDzf2tr6oaWhcePG8PT0NPiyv5y7aoz/6SQKSzQ1/hqVP2rW5oto0sAWHX0b1F1AIh2wEBBRlTo0cUYLT3tcT82vtE1xbYzp0gRA2ZJGX19f+Pr6PvCxGo0GqampVZaG+Ph4REVFISEh4b5Z/SqVCl5eXg8sDN7e3mjUqBEsLCz0eBX323QqHqm5Rbp9XUQRXx66gVXPdZUsD5EUWAiIqEqCIGBSz6aYs/WSTs9XKgQEP+KBhk41n0inVCrh5eUFLy8vdOnSpcrHiKKIjIyMSoUhMTERCQkJuHDhAuLj41FYWHjfa2nYsOEDC0P5762tq8+q1YpYcSxW55KkEYHfb2QgLrMAvq52Oh6FSHosBET0QOHtGmPZHzGIziio1eUDAYBKIWDG480lzyQIAtzd3eHu7o727dtX+RhRFJGTk1NlYUhISMCRI0eQkJCA7Ozs+57n5ub20NLg7e2Ns0l3kZh9V6/XoFAIWHfiNuYMqtldJokMgVsXE9FDpeQU4clvI5GWV1yjUqAQAIUgYOnETujXwsMACXWXn59fURT+WRj++Zaenn7fczwemwibTsMBhVKvz93JzwU/v9RDr2MQVac252+OEBDRQzV0ssaO//bEcytO41JiDpQKocpiIAhl+w44Wlvghwmd0KWp8U+as7e3R4sWLdCiRYsHPqaoqAhJSUkVhWHDX2pcvCvoNa8CALIL1HoegUhaLAREVC0PB2vs/G9PHLuViVVRsTh4JbXSksRWjRwxsYcfhgZ5wdpCv5+ejYm1tTX8/f3h7+8PAIiPuIY/f4tGqZ4rMKwsuFEsGRcWAiKqEUEQ0DPQDT0D3ZCWW4SbafnILSqFjaUSXk7WaObpIHdEg/BwsIJGj90bgbLLKo1qMdmSyBBYCIio1jwcreHhWD9PaIPaNML7u6/odclAKwIxRzZhj1saQkJCoFLxWzHJj2NWRES14OFojdDWjaBU6L6DorVQirRzhzBkyBD4+Phg9uzZ+PPPPyVMSVR7LARERLU0sbuvzrs4KgTghf6P4OL5szh79ixGjhyJ5cuXo3Xr1ujcuTO++eYbZGZmSpyYqHosBEREtdTV3xUv9PGv9fOUCgFtvZ3xSr8ACIKA9u3b48svv0RSUhK2bduGxo0bY/r06fDy8sLTTz+NPXv2oLS0tA5eAVFlLARERDp4PbQlxnZtUuPHKwTgkUYOWD6pc6VVGJaWlggPD8f27duRmJiIRYsW4fr16xgyZAi8vb0xa9YsXL58WeqXQHQfbkxERKQjURSx9sRtLP7lBlJyiyvt0SCg7KZGNhZKjOrsg9dCW8LGsuZLMs+fP48VK1Zg7dq1yMjIQMeOHTFp0iSMHj0arq6u0r8gMju1OX+zEBAR6UmjFfHrX2lYFRWHK8m5KCguhbVKicYuNhjV2Qfh7RvD3kr3lQQlJSXYu3cvVqxYgT179kAQBAwbNgwTJ05EaGiopDduIvPCQkBEZKbS09Oxbt06rFixAufPn4eHhwfGjRuHSZMmoU2bNnLHM1uiKOJUyilEJkUipzgHgiDAxcoFfX36oq1bWwiC7qtO6hILARFRPXD+/HmsXLkSa9asQUZGBjp06FBxScHNzU3ueGahUF2IbTe3Yd3Vdbiddxsq4e+RHhEiNKIGzZybYewjYzE0YCgslZYypq2MhYCIqB4pKSnBvn37sGLFCuzevRuCIGDo0KGYNGkSLynoIa0wDS8dfAk3s28CKCsAVREgQISI9h7t8XX/r+Fk5WTImA9Vm/M3VxkQEZk4S0tLhIWFYdu2bUhKSsInn3yCmJgYDBs2DN7e3pg5cyYuXrwod0yTcqfoDibsm4DonGiI9/73IOUfu5h+Ef/Z/x8UqgsNFVNSLARERGbE3d0dU6dOxdmzZ3H+/HmMHTsWa9asQVBQEDp06ICvvvoKGRkZcsc0ejN/nYmUghRoRE2Nn6MRNbiZfRPvRL5Th8nqDgsBEZGZCgoKwmeffYbExETs2LEDfn5+mDVrFry8vDB8+HDs3LkTajVvw/xvf2b+idOpp2tVBsppRS0OxB1AYn5iHSSrWywERERmzsLCAsOGDcPWrVuRlJSETz/9FHFxcQgLC0Pjxo0xY8YMXLhwQe6YRmPjtY1QCrrfwlsQBPx8/WcJExkGJxUSEdVTFy9erFilkJaWhnbt2mHSpEkYM2YM3N3dpfkkiWeB21FAUQ6gUAF2bkDLIYC9hzTHl1iBugC9N/SGWqvfyImjpSN+G/UblArdi4UUuMqAiIhqTK1WIyIiAitWrMCuXbsgiiKGDBmCiRMnYtCgQbC0rOVSOnURcHkLcOI7IOUiICgAQQlABLQaQKEAHgkDurwA+Havk9ekq+t3ruOpnU9JcqxfR/4KVxt5d5TkKgMiIqoxCwsLDB06FFu2bEFycjI+//xzxMfH48knn6y44dL58+drdrDcZODHx4AdrwCp9+6/IGoBrRrQlqKiFFzdCSwPBfbOLvtvIyHlCoF8db5kxzIEjhAQEVGVLl26VHFJITU1FUFBQRWXFDw8qhjyz0sFfuwH5KfW4iQvAEHPAOFLAAPu9qfRaBAfH4+bN2/i1q1bFb/eyLkBTJDmc/zy9C9wt5Xo0ouOeMmAiIgko1arsX//fqxYsQI7d+6EKIoYPHgwJk2a9PclBa22rAykXAZ0mJ2P4PeAXtMlzV1cXIzY2NhKJ/2bN28iJiamYoWFQqGAn58fAgIC4NvSFyc6nIAoVHtqfChrpTWOjT4GC6W8m0KxEBARUZ3IzMzEhg0bsGLFCpw+fRpubm4YM2YMpjzxCAKPv6b7ga2dgP9dByysa/W0goKCSif78l/j4+Oh1WoBAFZWVvD390dAQAACAwMRGBhY8XtfX9/7dnOcfmQ6fo3/VadlhwCgFJQY0XwE3ur2lk7PlxILARER1bnLly9j5cqVWL16NZb2z0VooAVU+sxMe/L7sssH/5KVlfXAk35KSkrF4xwcHCpO8v/+tXHjxlAoahbuRPIJTD4wWY8XAmwZtgXNXZrrdQwpsBAQEZHBlGbGQfl1EISHbO9bHVFQIM8hEFsb/F/Fyb78xH/nzp2Kx7m5uVU62Zf/3t3dXZK7DoqiiCd3PInY3NhajxIoBSXae7TH8tDleueQAgsBEREZzvUDwLqn9T7MXbUI2/l5aNy4cZU/5QcEBMDJyTA3Drqdexuj94xGgbqgxqVAKSjhauOKDYM3yD6ZsFxtzt+qh36UiIioOkU5khzGxkJAYV4ObOzl/8GziWMTLAtZhhcPvojs4uxqS4FCUKChXUP8+PiPRlMGaov7EBARkX4sbKQ5jqCEjZ2DNMeSQIsGLbBp6CaMbjkatipbAGW3Oi6nuHcKdbB0wKRWk7Bh8Ab4OPrIklUKHCEgIiL9OHpJcxwHT4PuRVATHrYeeK3La5jSfgr2xexDZFIksoqyIEBAA+sG6OfTDyF+IbBU1nI3RyPEQkBERPrxag80CACyogFdJxYKSqD9eEljScnWwhZPNX8KTzWXZltjY8RLBkREpB9BALq+pOdBRKDDREnikG5YCIiISH9BowALW+h0WhGUZXdAdGoseSyqORYCIiLSn7UTMHIlyubc1XweQKkWUNt6AkM+r7NoVDMsBEREJI1mjwMjlgEK5b3bHT+cKCiRWKBE8Jq7SMkrNUBAehgWAiIikk6rJ4H/7Aea9in770rFQCh7s7CB0Ok/EJ7/BTfSSzBo0CDk5uYaOi39A3cqJCKiupF5Czi9DIj9HSi8AygtypYWth4BtB0JWJXtOXDx4kX06dMHHTt2xN69e2FlZSVzcPPBrYuJiMikHD16FCEhIRg2bBjWr18PpbL6Sw5Uvdqcv3nJgIiIZNe3b1+sW7cOW7ZswfTp01GDn1VJYiwERERkFIYPH45vv/0WixcvxoIFC+SOU+9wp0IiIjIaL774IlJSUvDmm2/Cw8MDkydPljtSvcFCQERERuWdd95BSkoKXnzxRXh4eGDYsGFyR6oXeMmAiIiMiiAIWLx4McLDwzFq1ChERkbKHaleYCEgIiKjo1QqsXbtWnTt2hVDhgzBn3/+KXcks8dCQERERsna2ho7duxAkyZNEBISgtu3b8sdyayxEBARkdFycnLCvn37YGFhgZCQEGRmZsodyWyxEBARkVHz8vLC/v37kZGRgSFDhqCgoEDuSGaJhYCIiIxe8+bNsXfvXly6dAmjRo2CWq2WO5LZYSEgIiKT0LlzZ2zZsgX79+/H888/z90MJcZCQEREJiMkJAQrVqzAypUrMWfOHLnjmBVuTERERCZl7NixSEtLw8yZM9GwYUNMnz5d7khmgYWAiIhMzowZM5CcnIwZM2bA09MTo0ePljuSyWMhICIik7Rw4UKkpqZi4sSJcHNzw+OPPy53JJPGOQRERGSSFAoFli5diuDgYAwfPhynT5+WO5JJYyEgIiKTZWFhgc2bN6NVq1YYNGgQbty4UekxeSV5+DPzT5xIPoEL6ReQUpAiQ1LjJ4g1WLeRm5sLJycn5OTkwNHR0RC5iIiIaiwjIwO9evVCSUkJIiMj0ahRI1zJvIIN1zZgd/RuqLX371vQybMTxj4yFv18+kGlMN+r57U5f7MQEBGRWYiLi0OPHj3g5u2Gju92xKn0U1AKSmhETaXHKgQFtKIW7jbu+Lr/12jl1kqGxHWvNudvXjIgIiKz4Ovri817NqP4qWKcSj0FAFWWAQDQiloAQGZRJiZETMCplFMGy2msWAiIiMgsqDVqLE5cDCtPqxqf3bSiFqWaUvz38H8RnRNdtwGNHAsBERGZhYjYCFzKuAQttLV6nhZaFGuK8e25b+somWlgISAiIrOw7to6KATdTmsaUYODtw8i426GxKlMBwsBERGZvGtZ13A543LF3ACdiMDP13+WLpSJYSEgIiKTdzzpuM6jA+W00CIyMVKiRKaHhYCIiExeTkmO3oUAALKLs/UPY6JYCIiIyOQJECQ5jhSlwlTV31dORERmw8XaBVqtHvMHUFYqGlg3kCiR6WEhICIik9fPux9EVLvxbrWCfYMlSGOaWAiIiMjk+Tj6oLtXdygFpc7HsFBYYFjAMAlTmRYWAiIiMgtjWo554FbF1VEKSgwLHAYHSweJU5kOFgIiIjILvb17Y0CTAVDU8tSmFJRoYN0ArwS9UkfJTAMLARERmQWFoMDC3gvRuWHnGq86UApKOFk54ceBP8Ld1r2OExo3FgIiIjIb1iprLHl8CZ5p+QxUguqBxaB8rkGQexA2DtmIAOcAQ8Y0SoIoitVOy6zN/ZSJiIiMQVZRFrbf3I71V9cjpTCl4v3WSmuEBYZhZIuRaO7SXMaEda82528WAiIiMmuiKKKwtBB5JXmwUdnA3sIeSoXuqxFMSW3O3yoDZSIiIpKFIAiws7CDnYWd3FGMGucQEBEREQsBERERsRAQERERWAiIiIgILAREREQEFgIiIiICCwERERGBhYCIiIjAQkBERERgISAiIiKwEBARERFYCIiIiAgsBERERAQWAiIiIgILAREREYGFgIiIiMBCQERERGAhICIiIrAQEBEREVgIiIiICICqJg8SRREAkJubW6dhiIiISDrl5+3y8/jD1KgQ5OXlAQB8fHz0iEVERERyyMvLg5OT00MfI4g1qA1arRZJSUlwcHCAIAiSBSQiIqK6I4oi8vLy4OXlBYXi4bMEalQIiIiIyLxxUiERERGxEBARERELAREREYGFgIiIiMBCQERERGAhICIiIrAQEBEREYD/B+e9aT4h9MtFAAAAAElFTkSuQmCC\n",
"text/plain": [
"