Skip to content

Instantly share code, notes, and snippets.

@saccadic
Last active July 12, 2021 01:01
Show Gist options
  • Save saccadic/c7877a66ab65a53b7739b3cffdff7e0d to your computer and use it in GitHub Desktop.
Save saccadic/c7877a66ab65a53b7739b3cffdff7e0d to your computer and use it in GitHub Desktop.
Speaker Segmentation Tool
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Speaker Segmentation Tool",
"provenance": [],
"collapsed_sections": [],
"machine_shape": "hm",
"mount_file_id": "1t7EJNE-x52KHfdsJf0AGNoFFh3NXtQuo",
"authorship_tag": "ABX9TyOlda26xRaslZy99I9VKJWb",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"accelerator": "GPU",
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"e6bbda4eca844b03bf5bf10307310702": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_909fab40f85d4238a5b27cd6776cb819",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_8d61bda5f2d240488cd7ffc471a19b00",
"IPY_MODEL_071826ea131f4e1f89146026288799fe"
]
}
},
"909fab40f85d4238a5b27cd6776cb819": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"8d61bda5f2d240488cd7ffc471a19b00": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_e3d2da75015e4f0db0af3250de091a84",
"_dom_classes": [],
"description": "100%",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 29,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 29,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_8747016bc92d4fdcb29b174f975faa83"
}
},
"071826ea131f4e1f89146026288799fe": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_c027f4c35ebb46cd9048e4c118005455",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 29/29 [00:02<00:00, 12.07it/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_f21389f3049340c78a98507cfdf2a4f5"
}
},
"e3d2da75015e4f0db0af3250de091a84": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "initial",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"8747016bc92d4fdcb29b174f975faa83": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"c027f4c35ebb46cd9048e4c118005455": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"f21389f3049340c78a98507cfdf2a4f5": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
}
}
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/saccadic/c7877a66ab65a53b7739b3cffdff7e0d/speaker-segmentation-tool.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "D2PlazN5Q94l"
},
"source": [
"Usage example of MediaPipe Selfie Segmentation Solution API in Python (see also http://solutions.mediapipe.dev/selfie_segmentation)."
]
},
{
"cell_type": "code",
"metadata": {
"id": "AuQfLvpuJkb0",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "93638c52-879e-4d57-bb35-087c5e8991ae"
},
"source": [
"!pip install mediapipe"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting mediapipe\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/e4/ae/402fd0089c228ceafd3b364eff87a6caedfc2b84a833f7b78b31f4f60a51/mediapipe-0.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (32.2MB)\n",
"\u001b[K |████████████████████████████████| 32.2MB 162kB/s \n",
"\u001b[?25hRequirement already satisfied: absl-py in /usr/local/lib/python3.7/dist-packages (from mediapipe) (0.12.0)\n",
"Requirement already satisfied: protobuf>=3.11.4 in /usr/local/lib/python3.7/dist-packages (from mediapipe) (3.17.3)\n",
"Requirement already satisfied: attrs>=19.1.0 in /usr/local/lib/python3.7/dist-packages (from mediapipe) (21.2.0)\n",
"Requirement already satisfied: wheel in /usr/local/lib/python3.7/dist-packages (from mediapipe) (0.36.2)\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from mediapipe) (3.2.2)\n",
"Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from mediapipe) (1.15.0)\n",
"Requirement already satisfied: opencv-contrib-python in /usr/local/lib/python3.7/dist-packages (from mediapipe) (4.1.2.30)\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mediapipe) (1.19.5)\n",
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mediapipe) (2.4.7)\n",
"Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mediapipe) (2.8.1)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mediapipe) (0.10.0)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mediapipe) (1.3.1)\n",
"Installing collected packages: mediapipe\n",
"Successfully installed mediapipe-0.8.6\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Kg4d2gBxsPON"
},
"source": [
"# Imports"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "CgiZ2A_ZsGvZ",
"outputId": "a284b94d-0ca4-4494-db6c-8c764caaaf0f"
},
"source": [
"import cv2\n",
"from google.colab.patches import cv2_imshow\n",
"import math\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pathlib\n",
"from tqdm.notebook import tqdm\n",
"\n",
"import mediapipe as mp\n",
"mp_selfie_segmentation = mp.solutions.selfie_segmentation\n",
"\n",
"help(mp_selfie_segmentation.SelfieSegmentation)\n",
"\n",
"DESIRED_HEIGHT = 480\n",
"DESIRED_WIDTH = 480"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Help on class SelfieSegmentation in module mediapipe.python.solutions.selfie_segmentation:\n",
"\n",
"class SelfieSegmentation(mediapipe.python.solution_base.SolutionBase)\n",
" | SelfieSegmentation(model_selection=0)\n",
" | \n",
" | MediaPipe Selfie Segmentation.\n",
" | \n",
" | MediaPipe Selfie Segmentation processes an RGB image and returns a\n",
" | segmentation mask.\n",
" | \n",
" | Please refer to\n",
" | https://solutions.mediapipe.dev/selfie_segmentation#python-solution-api for\n",
" | usage examples.\n",
" | \n",
" | Method resolution order:\n",
" | SelfieSegmentation\n",
" | mediapipe.python.solution_base.SolutionBase\n",
" | builtins.object\n",
" | \n",
" | Methods defined here:\n",
" | \n",
" | __init__(self, model_selection=0)\n",
" | Initializes a MediaPipe Selfie Segmentation object.\n",
" | \n",
" | Args:\n",
" | model_selection: 0 or 1. 0 to select a general-purpose model, and 1 to\n",
" | select a model more optimized for landscape images. See details in\n",
" | https://solutions.mediapipe.dev/selfie_segmentation#model_selection.\n",
" | \n",
" | process(self, image: numpy.ndarray) -> <class 'NamedTuple'>\n",
" | Processes an RGB image and returns a segmentation mask.\n",
" | \n",
" | Args:\n",
" | image: An RGB image represented as a numpy ndarray.\n",
" | \n",
" | Raises:\n",
" | RuntimeError: If the underlying graph throws any error.\n",
" | ValueError: If the input image is not three channel RGB.\n",
" | \n",
" | Returns:\n",
" | A NamedTuple object with a \"segmentation_mask\" field that contains a float\n",
" | type 2d np array representing the mask.\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Methods inherited from mediapipe.python.solution_base.SolutionBase:\n",
" | \n",
" | __enter__(self)\n",
" | A \"with\" statement support.\n",
" | \n",
" | __exit__(self, exc_type, exc_val, exc_tb)\n",
" | Closes all the input sources and the graph.\n",
" | \n",
" | close(self) -> None\n",
" | Closes all the input sources and the graph.\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Data descriptors inherited from mediapipe.python.solution_base.SolutionBase:\n",
" | \n",
" | __dict__\n",
" | dictionary for instance variables (if defined)\n",
" | \n",
" | __weakref__\n",
" | list of weak references to the object (if defined)\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "w_hlUJPqsUum"
},
"source": [
"# Upload movie file\n",
"\n",
"Google Drive に処理したい動画をZIPにしてアップロードしておき\n",
"unzipコマンドでDriveから作業ディレクトリに解凍した方が早い"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZG8gewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwoKICAgICAgbGV0IHBlcmNlbnREb25lID0gZmlsZURhdGEuYnl0ZUxlbmd0aCA9PT0gMCA/CiAgICAgICAgICAxMDAgOgogICAgICAgICAgTWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCk7CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPSBgJHtwZXJjZW50RG9uZX0lIGRvbmVgOwoKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCk7CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 77
},
"id": "wVFfWn7UsOWc",
"outputId": "1af019f4-759c-4517-ecec-b54dc6f5e8ab"
},
"source": [
"from google.colab import files\n",
"uploaded = files.upload()\n",
"file_name = list(uploaded.keys())[0]"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-9895774e-a9b1-4b48-a394-f929b9580c40\" name=\"files[]\" multiple disabled\n",
" style=\"border:none\" />\n",
" <output id=\"result-9895774e-a9b1-4b48-a394-f929b9580c40\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving test2.mp4 to test2.mp4\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9vyu7EfY1aMz"
},
"source": [
"# Segmentation "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 307,
"referenced_widgets": [
"e6bbda4eca844b03bf5bf10307310702",
"909fab40f85d4238a5b27cd6776cb819",
"8d61bda5f2d240488cd7ffc471a19b00",
"071826ea131f4e1f89146026288799fe",
"e3d2da75015e4f0db0af3250de091a84",
"8747016bc92d4fdcb29b174f975faa83",
"c027f4c35ebb46cd9048e4c118005455",
"f21389f3049340c78a98507cfdf2a4f5"
]
},
"id": "K3Bj1TTov5Ko",
"outputId": "bf1f3cbd-4743-4093-c8a9-c4798f6ff58f"
},
"source": [
"# Load movie file\n",
"movie = cv2.VideoCapture(\"./\" + file_name)\n",
"\n",
"if movie.isOpened():\n",
" print(\"Succeeded to load the movie file.\")\n",
"else:\n",
" print(\"Failed to load the movie file.\")\n",
"\n",
"# Input video info\n",
"width = int(movie.get(cv2.CAP_PROP_FRAME_WIDTH))\n",
"height = int(movie.get(cv2.CAP_PROP_FRAME_HEIGHT))\n",
"frame_count = int(movie.get(cv2.CAP_PROP_FRAME_COUNT))\n",
"frame_rate = int(movie.get(cv2.CAP_PROP_FPS))\n",
"\n",
"# Output video\n",
"name = pathlib.Path(\"./\" + file_name).stem\n",
"output_file = './'+str(name)+\"_masked.mp4\"\n",
"recoder = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')\n",
"writer = cv2.VideoWriter(output_file, recoder, frame_rate, (width, height))\n",
"\n",
"BG_COLOR = (0, 255, 0) # Green\n",
"\n",
"with mp_selfie_segmentation.SelfieSegmentation(model_selection=0) as selfie_segmentation:\n",
" for i in tqdm(range(frame_count)):\n",
" ret, frame = movie.read()\n",
" if(ret):\n",
" #frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n",
" results = selfie_segmentation.process(frame)\n",
" bg_image = np.zeros(frame.shape, dtype=np.uint8)\n",
" bg_image[:] = BG_COLOR\n",
" condition = np.stack((results.segmentation_mask,) * 3, axis=-1) > 0.0001\n",
" output_image = np.where(condition, frame, bg_image)\n",
" writer.write(output_image)\n",
"\n",
" if i == 1:\n",
" plt.imshow(output_image)\n",
"\n",
"writer.release()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Succeeded to load the movie file.\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e6bbda4eca844b03bf5bf10307310702",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=29.0), HTML(value='')))"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAADfCAYAAAAa2gMAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdaZCl13nY9/9zznmXu3XfXmafng0DzGAGBEAQAEFCFDfJIrVQUkWyLceJLctmucpOnJLtWHEq+ZB8ccopO8mHuEplJeWkUrEVK2WxLFmRTIqWRIkkxAUECWBAYADM9Oy9377Lu5zz5MN7ezCkSC0EMI2ZOb+qW3237nvvC8zznvuc5zxHVJUoiqLo3mB2+w1EURRFt08M+lEURfeQGPSjKIruITHoR1EU3UNi0I+iKLqHxKAfRVF0D7ntQV9EPiYi50TkZRH5hdv9+lEURfcyuZ11+iJigZeAHwSWgWeAn1HV52/bm4iiKLqH3e6R/pPAy6p6XlVL4F8CP36b30MURdE9y93m1zsEXLzl9jLw3u/2ZFkU5djb/ZaiKIruMl9iRVX3fKeHbnfQ/xOJyCeBTwJwBPjDXX07URRFdx7h9e/20O1O71wClm65fXh6302q+ouq+riqPs53PE9FURRF36vbHfSfAe4XkeMikgJ/EfjUbX4PURRF96zbmt5R1VpE/jbw/wEW+N9U9Ru38z1EURTdy257Tl9Vfx349dv9ulEURVFckRtFUXRPiUE/iqLoHhKDfhRF0T0kBv0oiqJ7yDtucVYU3VbfpfVUPt5LWs4y6lymdqPv/kR5295ZFL0tYtCP7j0K/cEpetsnMOpoT/ZCBSIQjCAqzFw9SdhKmMxdZWRv4GYcpEqoA4JS2RGXjvwGZba5258miv5MYtCP7hm2buHqHLzlvnN/ic7kKM4KflTw+m/9IQsLfbpnjiFZAiGwfvkqxfOeAw88imxlWGMoBiNcK0ctSBq4tP8zBFNRua046o/uCLe1tfKflTwuGnvvRG/a9H/xw6//MEsXfgh8wBYZw+0heZIzeuUyxbkrTJYvM9tv49QRJhPqrTGTyZhhXdE9up/Wg8dpH95He2kfpJaQC1VSMGpf5NlT/xhviuaFYvCPdpvwJVV9/Ds+FIN+dDezPuPohR8nnfTplsdpj5cIgzErX3uZzAhb5y7SurJNyzrqzQFUFR2TMN4eYLMEZrtsbQ2ZrK6StTOSPCdkCZ3jB+HIHlpnjxPawvbiazBXcWnP77Da/9puf+zoXvfHBP2Y3onuTgo2ZMwMTrJ/+SNk0qKsa8rBOoNnXqJ6cZl6dYtZb/CDIaOyIvgKYw2d/izBe3ToMcMCW5UkQSg2RpQ6Is1yBivblF95idYrV2k9fprxbw049v7HGLz3CludV6ncII74o3ekGPSju49Cd3SM4xd/mtmNB6gngcn2OqMXLhJeuIC9uEmyvklqhclkTFVWOOeYm5tjY2ODtbUVBGF9dZ1Oq02n16M/26coSkajEYhQlxVaKnkVmFy+Tjap2d7aZGn5Y/SHp7lw4NdYnX0W5J37TTq6N8WgH92FhOOXfoLF9UeoNseMvvxNJp97Dntjm7RU8jyn8p6irplMxoxHI9I0ZWZmFlVo52267TadvM3W5hbOGIwGfDnBqGdmts9wNGI2TakuXMdtbpMd3U/eyVCfML91hs7kIF986B9SJrG6J3pniYuzoruLCq1iD2k1QzUYcuXffJatX/4so2+8zujGSlOWGQJZ4rBisBi09uAVX5UYCaxcv8rKynVEYHF+HnzgxtVroEqSJpRVRSfP6eY5M2KZU0N9+QbXP/csxdUVQghYn9GeHMD4dLePSBR9ixj0o7uHGhY2HuXRF/4bOtcPc+lTv8/2Z7/O5rXr+GpCt9OiqgpUA5PxCEIgTRLm5+Zw1jAeDel1OiTWEerAaDgCoN1u0+v1qKsKY4StzQ02NjZADM5lUEN5bYO0hq3r6xTrA2yR8ui5v8fi5qOg8l3XdkXR7RaDfnTXSKoep87/DVrFPCu/9wLV7zyLbA9wQcmcZTwckmcpVTlme3OTYjzGGMGHACIMBgNWV1bJ05wszcnSjKIoGY5GdDpdrHUMhyNEYGNzg0lZsjXYxqljxmbMWcfsbJ/NC1dYe/0yZuI4/drPcvzKJ3b70ETRTTGnH901sqqP8y1CFRi8tExWB9SAOAPWEgDvK9ZXVxkNt6mrCmcc28MJqoqqQY1BxdAyCSE0J4SgUIUJKhmTukDF0plZoKqVyWjMKB2SdzuML6xA/iqVDZRyjXoyYf74EWZnTuz2oYmim2LQj+4aSTWDqMPXHr85pC5rEEGMwVhHYi2bm5sUZYFYRx2Uolbm5g9i0hazcwdpdftYZxEN1HWFTH8/SRKyPMeHwPb2gMH6KsO16wQybqyv0y4KtJdQv3KB2QeOU1cVvlLWL1/FHFJgJ8WjsZQz2lUx6Ed3jbSaRVQor6zQWh0gNsGKUpUVGsCmDiOGXm+WSaGYtMPh4w9z4PBp5hcP0V3YR5LnuMRhxKMaEBGcFdIsJUkTVITJuGBtbZUbly7y+svf4OLrX2NzNKCdtGFliOciMw8sYftzDKSis3k/737576OqnD/4K2x1z+/2oYruYTHoR3c+he7oKL3hCeqy5MZnn6FV1qStLuVkjFghTXPm+vMMjEUwtHozHHngSY6feYr+nkO0Wm1c7jBOsMaQCDjncNbgBIwRMNM52aDsO3CAEycf4P53Pcq5r5/muWc+Qzlcg0lBUa7ROXOM7eUrhNQSWm0WeAQVZavzKkW6TpGu7/ZRi+5RMehHdzaFuc2HObH8F+htH2fl/HmK12+wkOaYULNdTvAhkCQZC3NzKLC1XbNv6RRHTj/BzJ4lXKtN0nJ0WykuMVhnsAhWBGcNENgpvxFpLhqglSRkWcpM7yN0u3N8+fc/jZSrVIwYPfsarZaFVsbolRuYpx7EnNjP8Ss/Sac4wLml/5PSbcRUT3TbxaAf3dFELccu/RQz2ycYXltl9OoNkvUJ6oWirJgUE4IqM70uw+1t2nmPWjP6B07RWzhMmufkeUKnndLJE5wVrLVYI0hQRBQxFgAjIEZAIHjF1IFAgG6bBx9+jBACz33hNzGTCdWVNdJuSq/bwV9a4eorF1n6659ADs6xb/0pEt/hK/f9j6jUu3wEo3tNLNmM7niigvrA8Noqw2e+jtvYZm1tg3FR4oMHDXTbLSZFgRVDu7PA/MJx0rRDmjjaWXPJEkPuhDwRcidkiZAnhszZ6U9D6qT5mVgSZ0lTR+os7VbKmXc9zOH7HkZMm8SlbGxssLE1oKpqiks3uP4bn0N8QFRoFXsxanf70EX3oBj0ozuaqMVqQgg1my++QvjmMoKAMdS+xllHmmasrq0xGA65emON7uIBenPzpIkjcwmJNVgjONOkc5yhuVhp0jloU8UjBoPBiMWJITGGxFoS21zP85yzjzzB3OIJEEOSpAQCNrX4UOPrCgkhrtOKdlUM+tEdzYaUpOpRb40Z/sHX6QYzDdAgIhjryLIW165e4/q1FaqQMLf3CHmnQ5panDNNSseAnQZ6J2AkYCRgjTbXCVhRrGF6vTkxJNaSJBbrDC6x7Nm7j9MPP0antwdnU4pJSTI7Q74wh0sS8B6JefxoF8WgH93hpOmI+eKrdEeeuf4cxhgS59Cg5K0OiiVok+Nvz+yjv2eJNMtxzt4M+AbF0MyrmulFaEb5N6+LIijNpG5ARJvA78x0AtiSpCmHTjzAniNncK6NE8tgZQOfpmi/B7WPLRmiXRWDfnRHU1XGm0PG55bpSgYIeasFCGVZMRqPURJUcpJsjuOnn6Y9O491FmshSUwzyqepyFFPU5d5y7cFEQPaPO6D4r1Sq6LT5zgrOGsRYxFnyNsdjj7wLmbmDpBlGUlRMWMTgnXN76Cx43K0a77noC8iSyLy2yLyvIh8Q0T+zvT+eRH5LRH55vTn3PR+EZH/RUReFpGvichjb9WHiO5dIkKeJFSXbjAajRiNx4hYOp0u/f48rVYHsc2Y/dTZD3D05KO4JMGYph6/GekLYgACQZu2Czt/W6a5GJnWaqo2JxpBECMYIxhjMMYgKKpgjGF+cS+d+X2IcVhjCGtbhOXrpKlrfjfmeKJd8mZG+jXwd1X1DPAU8LdE5AzwC8CnVfV+4NPT2wAfB+6fXj4J/LM38dpRdFM5HuNXN6hDzXC4zerKDdbX1xkOB0wmBeNaOfLg0zz01I9iO+2mzl59k7pRxYnQhGJAFQ1gsFixWGNuuUhTvz+t4beAUcWEgFFFQ0DVY60hb7Xozx/ASIoATgQpPXXdNHeLA/1ot3zPdfqqegW4Mr0+EJEXgEPAjwMfmj7tXwCfBf7B9P7/Q5tNeT8vIn0ROTD9O1H0PVKsMeTWUdQ1WnuEgHpPq9WjO7OPQ2ffy4kHnqbVXpgW24NowOKRAMY7RAzqPR4QC2oScIKxBrGCaiB4BR+AZqJXdnI0IeAAqwIBjLEkac7cnsOIaWHYJksstFtUqggQ4kA/2iVvyeIsETkGvBv4ArDvlkB+Fdg3vX4IuHjLry1P7/uWoC8in6T5JgBH3op3F93dBJtmJItzDM4vkxmLs4rB0OrMs//YIxy//33kvT5M0zhGA5QVtakpSpjUFcWkpA6eNEnpdrt0Ox1a3RzjmvQNQFXVTMYFZVlCXWG1ptVuk6SOsqopRyWFB5emJC5hz94DtHqLjMoN1ASyk4cJmSOO86Pd9KaDvoh0gV8B/gtV3bo1V6mqKvJnm7JS1V8EfhFAHo/TXdGfRKGd0HnkBOtffYFqUmEkwVjI2j36+46St+fBJIgBqSo2rt+gHm/iJyPCZEQ5HmLTlLzdJuv0WJjfx8LiPno1JKnBWsFaw2RScOPGCtsb61y9vMzm2nXyPKM702OmP4e6lElI6C/uod+fo9OdY2HfEqPV84SqIgkeUcUgmPh/drRL3lTQF5GEJuD/X6r6/07vvraTthGRA8D16f2XgKVbfv3w9L4o+p7VdkKZbZI/dB+tIwepXr+KaiDJc1q9Wdq9eapii3J7TD0asr1+jc3ry3SskKdpU6FjFCkttanAWgZb23jXZSKW2W5OnjkShNG4YmswZHtzi7oq6fa69Gd7JFlKp5XiVXHeUwzW2awrahFmZ+e4EMA4YGUDU1RIlsSWO9Gu+Z6DvjRD+l8CXlDVf3LLQ58C/grwj6Y/f/WW+/+2iPxL4L3AZsznR2+WSqBoXae/9BRzH36Slf/n3+OrknRxjtqMefHz/5rx+hqTcpvJeECn3aLVanOpVqxzGGtRwAeP8ULqcjr9Qywdf5ilE2dJDxwgkTbUFevXb3Dx/CtcevV5NtaXqesx1hoCQuU9VV0heESbOYXga6wIMGb28B6Gm9tkkwozG6t3ot3zZkb6TwP/CfCciHx1et8/pAn2vywiPwe8Dvz56WO/Dvww8DIwAn72Tbx2FE0pKjXBglvokJzYS9brkY9qyvEm2xs32D/fR80MVZnxIz/wUbY3x3zmC19lVNd4MSBgkgQfYFSOufb6l3n5hd+j2+6zuHiA2YX9VOWQK5cvsL65giSWXn8Ok7Yw6ppJXgKSCO1Wm4VuzsE9c1x49TyJM7RbC1yViuzUUWojmJ21AFG0C95M9c7v8d0bw370Ozxfgb/1vb5eFH03QTwCqAHOHGW8skk2KDAhobf3FC+++CwmbHPigVN89g+e4crFqwzGE8q6QtUTVLG2WXebJhnGGIKUbKy/yvWV85gkRUIzajdJi3arTzncoty8gfcB7z3e1xhjafV6hP4sWhf0+rN89UvPoARmPvAY2rLMOUfspxztpthaObrjuZBjVKgmBVQ1lbFsbY6YSfeRdI7RmdtgtPIcK9dXKMqCrY0NQvAUZT1dXKWgUNehaaaWOJxVUoF+/zgLB8+wtvoqw7WXUfWMBhsUxZigFdAs1goh4FUZl0MmowHFZEKnnVGUFSEorA3pYXHWTVM7MfBHuyO2YYjuaIKQVn0CkLY6TF65TPXaddZfW0YKg7E5vYVDaC1sD0cUk4KqLCgnI1RLlIqgnto3P6u6pKrKJiS7jENHH+Pwfe/lyMmnIemAwKTYpvbFzWBPaJqo+aAEr6gkjGoYVlB5Q6szR/HaCum2Yq3Azf49UXT7xZF+dEdTQKUJui5LKM4t0yGh0+pyaOk4B48/zGR7ievnPk/ezqnKCdYNp012whs7YdGslDU7rRWsIW/v55HHfoDHnn6KF194idde+iLV+JtNnb0IQYSgimnWZGGTlHZ3hvbCHtLuLEYMNuvx4Pv+HK8uP0813sYi+F0+ZtG9LQb96I4mgKjDiNCan2Nu/xJufchMt8v+Q8dZ2LefsLhI2l/EpR7jEtLxiMJXBFUEQ/ABVaGJ5YIzhsS1OHHsCR56+BH27plhtvcIr7745/jC71wicSXe1wQFFSVM+3JqU/+JcRkiCb6qmF84wMkzTzIxgfzUWeo0IaZ2ot0U0zvRHU4wND3059oHePqH/nOWzvwAaasPrk0Qg8u6LBw8SVXXeDUEFVQMgp3udG4wWIwxOGOY6XTpzxzjiQ98gpnFOawVep2MH/6x/4jFfQ+z2N+DTE8SRppuPEYsziZoUKwGHEI5GnD81EN0Z/cxP3c/B9OTGIm7ZUW7Kwb96I4nKKgwuZow2MhZOvE4rnMIFUcIEFQ4eurJZierugIfMOIQsYiYm900RQx79+6jle3jfR/8GfYfu4/ae1QDtXpmZ2b4sR//WXrdJY4sHcE513TXFIO1jsQ6fF1TFCVGgKrkwXc/jSYpqgkyyeIWidGui0E/uqMpgdJtIcHSmnTZOzfP7J59ZN09BEwzuvc1J44/yv6Dj6ClZ7bTpdtqkScpziUkSUqetZmb3YMkezj50Mc5fvo9eMD7Gg2AKokxnD5zltNP/ATBLNDtzJAmDpc6rDUkzpI7g61LJhvrPPbEhzl07AzGWNqdGTqhQ+5TYu1OtJtiTj+6owmCCTmmsrSrNnP9FmmmiEpTRhkCISjWpjzxkf+Uw8cf4fxzv89wc5myHFLVJUpCr7efhcX72H/kDEeOPUiFoyWCc4I1SmoMReKptOaJD3yA/p69fP1rn+fKxecYDlbAl7RaLXozsywdPc3pR9/P0ZNnGWhTDrp3/wEyl+HUxqAf7aoY9KM72s3qncrgQkKWpUyKMZPSo6FCvIJV1AScWI6dfIwTx8/ipAIPxghJnmFMzvbIU1Q1TTf9BIuhlRpaCTiUYAJJIqS14/ips5x993uwTNja2GQyLkgTx/xcB9fKKQKU3uPLkrquMeLpz1qQWLsT7a4Y9KM7nqhFXSBrKUE9a9cHjLdrQj3dCSsEkKbXTjtL6M/OsmdPm9SllFXNcLtk9fqE4dYmo6JgYaGHsdNJXgyjsaeVWFyS0M5zvJZsbI8YFSOWDsxz/6k9pLnHOYNWyvrmkGpUNOkhoCyaNsxZotQEVJsdtqJoN8SgH93RBAimIiQVSa74wlMWFc4lTCYTgio6TbGIEYyzgKUoPVU1YjIKbKyXrK5tM6k8SZKCGIqqoliZEMqSdiclTyzOgHEGYy2JNQwGJSsb2+Rp01NfQ6AKgSCCGEfA41UJGpDaY50Smv0WiYuzot0Sg350R1MCo+wqWE9ta4wqvZkOBw/vY1JtA6HZ1FyV2gcmZYURRdXirKUoPNvbBaNRRSt3iDWsb4y4tHyB68svc//JB+n25+h1czZWVyiKmgcfup/uTMZsD3yoGFUlaSGktVB7paoVP51TEFWyLKc305nm8bVJScWYH+2SGPSjO97lhc8SZExr9YfYO3o/M92Uat9BhuNNjBiCTpuiaSD4Cl87ap+QuYQQFE+g08np9XLKsuLaxQHL51fQWtncHFFUgoQ+V5bXGGyU7Fs4wvzcDHk3YTgp8D5QlDUkhjoIdVB88IBgRJjtdzm0t8/QTqYhP4p2Twz60Z1NYNB+jdqMWJp5GDFKkhqydocksyAG1SYIhwDqBe89dQjUmWKNJUkN3XZKO08pCsPSkQVmZh+j07UsLPRQVdqtlPuO72c8CMz0u7Q7CTYPmLRpw+CDp/SK90IVPJ7QtGwWwTmLD4GNMKEk7PYRi+5xMehHd4Vxfp1XD/0HHjv3o6Te0up0KEYeP92sXLUZY3sF1YBIjTWGLIE0ceS5xSVN3n9hn6M33yXPDPPzbUIIZKlDNKEum6Zp7Y5CAlYT6qpGCVTToN+kbhQRMAbMtIPndYb4PAb9aHfFoB/dNYqsYNwa0g59qropvhEETLNq10rTI8cYC8YQMNRBkeAp6grFoyEQqLE2kKSWPDeMxx4nFpeBczVWAlY8ATDsrAdQBCHQ/G0UCE2paOYSbGLZMmOCVWKVfrSbYtCP7hrBBDbaAxaKGbJWynCkiAaMOiQIQZu6fDHNEFyNoQ4eXzaboFTOYAxYYxBnMdYQFIK3lLWStITEGYQmneNrZTSp2BpPcKZZI4Bppmp3MvcaYFJ5al9SuKY9g6IM88sEqXfzcEX3qBj0o7uGCqx0xsyvDtFRzURLMjHTfjdNsFZVNATUGFBtOmX6Gl8H6lpIE0fmMrQyXLlacENqZvpdqmLA3ELK/EKKbQUqranKmnFRUdUemzjENHMIgr/5WoX3nG+tMJKKcTZuNnuxJa/t+3doXKgV7YIY9KO7xrC1zKS7xbkDChX0bijzqwbBgSgGgwYIQW9uiG6AynvGkxG+KNEJFGsgRQqVJdSBuZkJSGC17ej1LZ29jmQ2UFIiWVO3L86CEXzw1HVNCB4fAsOkZGPvBqN0gqhwaeF3WV78DOvdczHLE+2KGPSju8awfZHXD/5b9uVPkhd7MNqit1pjtERw07G+TOvkp7teCdRBGY0qJoOC8ZVt3CjDBYcvhKKoKDcqnDHMzrUotoSNVSiyMQtHu3T25HSyFOccIShlVVKHmtp7ylAyysZUdjqiF+XK/OdYm3l+Nw9TdI+LQT+6a6ipee3wL3Px4Kd417m/RzJzhiqpSGrXlG7STKKqBqq6RgFrLYij052l1+6jHWBb6GqLGdelqjxCQpYZ2jOWKowJ7Zp0zmFnwKc1WKH0gVDWVKFu1gUET6EV2+3JLZO3sUY/2n0x6Ed3FwFvCiq3TZ3VjGYLsrHDq202TpFmNayvAnXwOOMwxmGcwwRBc2FYFEwG2zjJmO33sCkELdnSESFXWvMO6Rk0UcRaitpTlgW+DogFxKPqGboxG60JIk1lj0pFkWzs9hGK7nEx6Ed3IcUn2xhjqfZCuVogpcUoGJQQwKtigiGgGEKzTWKwWCwuhVE65uW1l7ErCcYKWW6Y3ddhpt9BjeCnJZkmCHUVKCYV3ivWKYjHU7PZKyjTamdal8oNKZOt3T440T0ubqIS3X0E1me+QTAlxaxn2K/xVGioCL5CQ2gqd7wneN+s2PJNjt+LR6yQtBPSfoq2J5TpFr5VYtoGUsFbRUWbfz07G6vXgVAHvFfq4Bmakhu9EZXxNEWanmF2hdINdvvoRPe4ONKP7krX555heOYyM9v38a7tv0q2Cq0KRKW5iDQNEVSxos3etaaZ6DWppZVaWv0enSxFkoBxhjRNsKmAC5jEILY5UWho0jrS7NqI14CmSpnWIIooDLPrPHvsfyVIuctHJrrXxaAf3ZXU1Gx3XkdNjZ+DyWJJsmyxqhiayVkjhmadlsFM98o1YrEthzNCK02ZaSe02hZrBWMNXgO1BrDgtW5W8IaAMYJ1UGuNGINNLEGaFgxGlcJtUCRrsUwz2nVvOr0jIlZEviIi/3Z6+7iIfEFEXhaRfyUi6fT+bHr75enjx97sa0fRn0ZwUB6wBFdjmIAWqFaAJ2iN9xU+1KgGjFXyzNBuJSRJM4FbVyUaKpypaaVKlpjmH07wBG3+hogCHpFAlljEGUQCEAgSuDr/hbgCN3pHeCty+n8HeOGW2/8D8E9V9SSwDvzc9P6fA9an9//T6fOi6Laoeoa6ZRCjQAW+hLpEfE3wJRpqNFSor9DQBPmqLBmNJmxujVhb32Z9Y8BwOKEqS8piQl3X1L5qdudqdk/HWCFJHMYakKZIdLX3DZYX/30c5UfvCG8q6IvIYeBHgH8+vS3AR4B/PX3KvwB+Ynr9x6e3mT7+0enzo+jtJSCJIG2Hsc0iLase0QpCifqKUE3wVUFZjpmMthkPt5mMh4zGE4bDMVubQ9bXtllb22RjfYPRaEhZFNRlRfBNozYRwdlmcxZj3vinVdkR3sRcfvTO8GZz+v8T8F8CventBWBDVXe+xy4Dh6bXDwEXAVS1FpHN6fNXbv2DIvJJ4JMAHHmT7y6KaDptihVCWxCXYLwHDdPRfcDXFUEMIgYJUISAEcEYg7WOLEnRoFRWKCaCTSBvpxhnURQxYK0BY0mdJU8tpunoTIjbpkTvMN9z0BeRHwWuq+qXRORDb9UbUtVfBH4RQB6X+O8lelNUwvQCmhkSmxJsSfCKDwH1NYbpBuoe1AMhUFcF3tdYY2nlLYw0lT1p6uh0W1gyTOKwLsWmDiNgnSVNEqyxZGJIkGn75Sh653gzI/2ngU+IyA8DOTAD/M9AX0TcdLR/GLg0ff4lYAlYFhEHzAKrb+L1o+hPzSnsoanAwTiUgGAIvqIOFagn1IFQVfiqoq4mVFVJCJ6hsRgRrHP0ZvqkqSfNwLmm+gcUY4TUOdIkwRnDfkk4qJbXNKbyo3eW73kQoqr/laoeVtVjwF8EPqOq/zHw28BPTZ/2V4BfnV7/1PQ208c/oxq3h47eZmoIauipcF/V7Fkrdtp6QSyCwftAVVaEuiBUY3w1JPhJk+8PJd5PEKnJMoPLwFiadg+AiiLW4JwjcRZnwBpYdJbTtoUVoTM5QH/4QGy9E70jvB3fPP8B8PMi8jJNzv6Xpvf/ErAwvf/ngV94G147ir6FIFiEToBFB07AWItxDqwDYxEcIQi1D5TBU/ka75tsvIhgjSNNc7KsReJyRBwaDCIOMQnGJljncM6QWsGizCeGkzYnUWFmfJRTl36KOOaP3gneksVZqvpZ4LPT6+eBJ7/DcybAT78VrxdFfxaisOCF/V3LRRtY9Q6cw/pAsAlialQS6lDjg6UKSdOqwcs06Bt8AK8GsRkubZNkLWgtjgUAACAASURBVGySTi8JLklwzuKMITMVB/sJfWnTrxJuiKdV7sGGFG+L3T4c0T0ursiN7noJcLo0LDrHsdnA1g1QY0hcAqlS1wHqAMaDBZxpNkFBwQcwgrMJJmvj8jY2byFphkkdkiTY6R641hqMVhyZEfq50g4Z+yXhhgQMDolTutE7QAz60d1HIa369If3Mzc4w3ztOOYNiQmc2puyNak4v5mgxmESwaeK94FQe4IqVqcTtKYEVZI0pdWdJe/OkLRamCRF0gRJEpLEkiaG1AiGwGILji0kJKbEYThhMl7QElGhPdnPML+Ct5PdPkLRPSwG/eguJDx44a+xd/09OE04Vjn6anFWMFLxxJKjrEsub6UEY3FpgqtTgvdN/x1TEyqDSIqqkrYyXNbBpjkuzbBJinMpibMkxpJaISEwZz2n9+WkNmDEEVAeSbs8MxlCuZf3vfTf8fzS/87ywmdRCbt9kKJ7VAz60V0jLxY5fP2HMFjmhyfZ6xMemlgeKw25tTjrUKMkRvn+E22+8NqEVzccikPzFKOB2pqmxXLiCaHZ5jDLU9K8Q5q1SbOMJE1xrmnCZq3gjKefBR482KGdNr+jIogRTrgWfzPdy7l6yDdDydzFv8bLgzOMkq2by7ZWes9xY/aru3bcontLDPrRnU0NnckBRC2LWw9z6sonWFTHg6Xh4dKyt7bTbLprOmkaIeDpugkfONFi9krNuRuBsc0onKUsSkIIVL7Z+qSZoE1Isow0y0nTZj9clxiMA6jZ21LedbhDJ62wAsYIIk2tTuIsJ0yHI2XKh41ygT7ntvbwnC84ryVDCSS+zSRdA5RhdpVgql09pNHdTd7JpfLyuCh/uNvvInpHUQAhq/rs2XiMrO6zdO1jLNQdHvQZD5Ypx2vHTGg6YXpVjAiJcySmCfxbG+uMb1yl1ZuhPbePG77Lly4UXB8o40lJXddNpY4REpdg0oQkdWS5o5VbsiwltZCEgvsWWjx0OCNPaowExAAiqIAExU83bbEiBJq9c2vvGfiab/oJv1lvcl5HjCVQmYo/eOC/ZZBffOPDxirP6HshfElVH/9OD8WRfnTHEDUcWP0A+9aepFXsZ358mAPqeERTzoSMg8GBBFJnMGIJKEVVIwLWOQwGDYEv//7n6JWbpK2EwSTj4Q9+iB96+AhfPF/xzauBSWkIoRmqG2sRa0icIbEGawzg6ZqKR451OLyQklAjGpguzkVRVMEgiBgw3Cz9NGpRLZlReDyZ5SRdXii3eabY5lw95t0X/ialmeClYLP9Kq/u/TUqO2rqTqPoLRCDfvTOpZBXC6TVDAp0Jgc5+/pfZ85nHNWER0LGqZAwpwZjmpG50OxzC4D3ONvsiGWsRYDJ9ohL518nDLfInZC4jN+8dIWnPvxBnn7XYyzOzvK1V7fZmjS7KDZ/twn2VgQJnkNtw+Mn5ljoAuIxQZtAD4SqwliHtc2yXWmG/qgqofZ47yFA4lKCEeZJeH8r491Zn0t1wTeKeb5UD7msNZPNxziw9j7O7/sUW+3XCOLZbi3HSeDoTYnpneidR5v0zaGVD3Hkxg/QqmbJsBzWlPu1xSM+Za9aWsZgRFC0ydeHZgWuIoSdEXdoAqQxBgnKlVdf4zf+1S+TGUvbKWdP7uXK6jZrg5q5A4d56Ps/QLr/AT7//DbXtj2epttmkhjaac1DR+Y4e7xDJw2oegTF1BWDwSbLr7zM8kvnOPOeJ1g6/WDzPqQ5HQTv8VU5PSG4ZrtGDU0GZ2cCQKBSZaOqueQLnh1v8LVykytMqPCM3CafO/tfUyWD6RSwElNA0XcU0zvRHUHBhJTjV3+M/etP0R8v0cPykOS83/Y4phltMeCakbMRASN4XxO8xxiLEYNO2xr7EG7ugxu8R33g1dfOc+rYXlKBS5dXKKqCqi5YvrbOhSsrSLnFez9a8PEnnuDL5wd888qEKihdV/L06T2cPJSRSkExGrFy4wavvfhN5kxJsbnOF575OpiE/UdPckQE1GBpTj6IYFODGEtAUMAYCzqt4dFmi97cCPtMxh7anM16fKxe5GvjTX5/vM65UnjPSz9PTYUXqO2Iq3t+l+vzX4I4+o/+lGLQj94xnO/w6Et/l7nxCQ7Ubc6aNk9Km2OS0CbBWotFqFTQoNNgrhgEl2SgQgi+SaWo3jwxGGOofCB4TzEacWyhzXg0ZGN7zPPfrGm1lb2zORtbBcO1Gzz/u7/FvmuruIll8PxVCtdh/vAsx97/ffjNTZZfP89Lzz3PC197gXpS8uCpvaSZReoar8LC4gIgyHQjFVVFjDRzCgg6Hd2LNMFfaN4rqs2cgCoBxSHstzl7ehlPdhZ4uRzy1dEenp1sshwKCoG5jdOYExnD1mWCKRm2l+PIP/pjxaAf7Z5pJU5azTK38RC90VEOD+7nKfp8wHY5ZDIy07Q3sMaAQlBpBrWiaFCssyDTnD4GCQYJAa1rau8xPuCyDHFKFQL1aMI3XlmmrgKLc7OU5YR9i3NY4PLVTdY2BmxXJZ/7ynkeuu8I+doW1UQZbOZ8WS7z2oWrjDc2mOkYHj9zgO3hhOe+cYGxwqlj+1k6Ms/eQ4sEI2ACCvjaN4kYAdTeDPhNzr+J9WKk+WZys6l/c2wQIRHLvEt4wma8J+9zzU/4w9E6nx+uca5UTr30V/FGGbeX+cq7/hEqFSoaJ3+j7ygG/Wh3KLi6y8nX/xIzg/uYHe3nftPi42aGM9KiZRKc2GYiVIXgp7nxnTS2CCZxYAxos1WJ8sYI2rlmMrWaNA3OkjRFAFVhY6wELXnf6cMogS9+9WXSrIOWFUv75zi3vEKWt7l0bYWHzy6xuTHkldcv8YfPbHNhdZPFdpelg4exCdzYWMeLQdXTaWdkeY8ka7NTqK8h4EPAmQSm7++7DcVl+q1EZNqlp/lA06c3JwiD5YBt8cM25fvzOZ4db/Ibg6t8rR6g4/088o2/j6hy6cCnubb382/zf8ToThSDfnTbpWWfmcH9HL/wU/Qm+zmqOd9vezzuOizalNRYPDSTsyKEnXTNzh9oovfNiVojgmqY5sb1jY3Kp0Gzqio6nQ6okmWOYjjCOOH5ly+gDi4NtrHbE44vzOJVaaWG4WjIbH8BJhOuXV+lqgUtPcf397l/6SCvXbzBF5+/SJ4Kx5YWWNkc8Oy5CwxDzkMuvxnWBUPiMuSPybmINHMUzQnLsNN4f2eCd+fnTgooqGDEMpNkvM/t4Ux7li9tr/Hvhlc4v9XCo2x3LjDJV1ECg+7rqKm/6+tH95YY9KPbQ0HUMb/xMEuXP87C4AGOhpynbJcnXYc9NsclbloHL9ONxZtA+ca1nb/T5MBVmxSPhkCYbnkI3JI+gSRPUR8IoTkpjIqSsw/upVbli89eIIjh4GyPdiqsbg147rUB3U7KU2eP8aUXX+PKyjpZy3JxY4vKw8NH97C5sc6NzQ02a2FQeA5VkNqMzXFBu9tHzLRkNADhjffyx9kJ/DfLeGR6AQL+5gYsOn1cp+WpRgOzYvjgzH5Ot2b4za1r/M5kFbn2YQ5e/xCVHfPlh/97JtnKNOUTJ3zvdTHoR287CY6Zwf0ce/2nmR0d4kSY5cNuhkeTDgsmIbEWlaayRYxB1Ex715ibwf7mRKfQBPom+iOiNDkf3qhevKUMORBAoKwrjIIXQ6+dM57UlL7CWUcrd6xuD/jahWt02i3q8YhXLl5lbVyTLyS8fG2VwnvSLOM/vHCBfiul3cpoZU1f/hdfu0qep1hf0e3liLwxkRxUQN8I/N9+Angj2H/rYzL9/ApM60+b+1Ga3Uan54RgEKMYCRwyXX5mocXZyQy/vn2VF6shY2945Nx/hkrN9fmv8OrhX40Tvfe4GPSjt93+69/Hg6/9Ze7TPt/verwra7NgHAn2Zg5bsE1+XgQVacoZRbiZ6ti5thP49Y1KdQFEZZpCeSPg3xpMFaUum9W5F69usbUy4MlTR1Bbsnx5g1Bn3LdvD0kr5ZUr11heGVBMPOcvXWN1e5tDi3NYA8EY1sqC+w72ue/AIs9fWAWXM5lMeN+7jnH8vkPNOSdA8E0VjrH2jz0+Oymsnes3q35oJn9lWtq585m+9eSwM3JvjmNuDO9pL3Iy6/GV0Qa/NrjKheHRZi2DOrZ6L7M28yJqPNG9KQb96O2hIGrZf+NpTl77CH9eDvJ96QzzJsGJQZzBWjcdwUuzwch0IlNFpousuJniaK7KNKUT3siDT58jgFGDNlufTEf909+d/qh9RaeV8eyrlzmw2Ie65ujhBTQk/MFL18hnOqyPxpRq2FLFpJbgBZulXNzcYl+3w4nFLsY5KhVeubJKIoJUFbP9NorHpc2uW0G1KR81BlXzJ6Z4diahb524feODf2ve/+bjTe0n3DwRyLTJm2HBGj4kCQfyLr+ycZmvl5vMjI/y6Lmf59r8M7x09P+mTDff/H/n6I4Tg370tjA+44Fzf4MTg0f5yfQYH3IdZtOExDi8BkzabEzu65qdcNVM3BqatjfyXdMQaqajec/NoAfToKkW1cAbI/43vhF4PO1uB9dpsTkck6SO165W1PksJx5oU5RjRqNtup0cYw2JsbSMI+t2GI8mqAil94j3bA1LEOHhI/s5dnCe8xeu8cKrq5yeePaq4rVu9tiFJgX1Jx2vacAX80bt/rd85u9w/dsPj4jgxDWL01RIEsvZNGd/a4ZfufEqnx5exQfL3htPMnEbvLr0b/Aubuhyr4lBP3rLtUeH2Hv1/Ry4cpaf7B3jo9leuiipgFiLDx7BYIxDDYSgTWpnmt7ZOQnoTuAXMNPAHkLAiCFoaNokh3BztL8zuftH6tOnuX71ygMPnmXv4j4SA+1ui+F4wtr1q+yvJ6ytrOG3txhOCpxL6OQt+r0Z8iyjqpXaB1xiWVtbZ7C1Qu1LamouXd9gc1yxd2GR3swsQUJTm6/NwjEJAbH2j4z2p9WnzZeZW1I6iP6RIK/KzYlekW+tBbp1vmAnXea9QW0AMSxqwl9ePMl80uJXt5bZ1prj134EbGB536eZpKsxz38PiUE/eku1xgc48fpfYGntCX60v58PZgvk0mw4YghgbDMxGWj6DohBCYAQkKapGcC3D46/LY3RtFuYljlOqxxDCNOgf2tWSJpVriK4JCWfneXonj20soxhXTO5fJneeMji7CLzc11mZtusra6QYlmYm2e+36c30wWXMyo940lNXdVcvb7M1UuXeN/TT7M1qtj6ytdxmaM702t24JqWmbJzIrr5Md6Irvptt2+dw/j2IKw3S1b1O5Z/7lQs7ZwQjChhOj+CKm3j+JH+YUoCvza4woia45c/wez2fXz59D9GJZZ03iti0I/eOgqHLn+M+Y3HeH82xwfTeVJjEGuxRqY95ZsWw8GH6SYkbwR9ZCf3rc3ofyclL9PAzU4wv+UbgDFNCWfQm0HvZmZo5/dtc5Kw3Q65KlVZoUlG6MzjCmWPDczNpOw5ssRSUbB+5SrdVpfe3Bxpu02WZVRe2dzYYnNtk+CV4/cfY3l5mRtrazz1kR9k6UMfpd5cx/b7eO8RlTdSNt8ln3+zKnPajuHmrPS3X/+TD/u3PrWZ2Z6e70KzEhiljeXH+ocZ1BW/Nb6GV2gXezEhwcc6/ntGDPrRW8jQGR7iXTLLx+wibbEYBSduWpUzrRixUNc1lqYnDdO7m4BtCKp4PBICxpqbwVO1Kc8UUdQ0i7D0ZsmjYqE5seyMiiUg1iAIok2L5OZvw7CYUItldqZFL99Pu51iXEJelYRa2HfkBDbLwVhEAiYEZlod0k6HclKQuIQH9+3jxrXrXLl4mb2nTpEfO4qGCqFpp9CksMx0zcGtE7U76Zg35h2adNat2Xr9o992voOdqh9uGek390OQ5gvVzrEzQI+EH+0vsVwOeb4eYqsOR678IMv7f5vKDWKa5x4Qg3701lCwPmWRnI+7eeZNSirmZoVNM0HZtBM20+AUQsBaezMVs9OADHZy9zKtApqWLtJMdN4cwU4XaokxTIvwv3Vi1xiMs01lkAp+2owtSRNCWTLvAhWB1vz8tKxSqYuSJMtxrQ7YpEmP4BETSFttrBjSVknwgSTN2H/0KP8/e+8Wa9uWnWd9rfc+LvO2rvtyLlWnqohdviFHcYrYTggROEEQkJxIJCAkYkVGfkEgIV54ywsvSEgRvESysJCDkCJkgWKJCIECTyhYMolliMt2Xc91n7P3Xtd5G5fee+Oh9zHmXPtSVefsxKmzM/+tqTXXXGOOOeZca7fe+t/+9rdPPviAq2/9IW98+UvIbI4tXA7CBmMdInYv0A9Bf4/G2U/zVXhRmi8Dsf/8x353t8BerUBlt+ORZPSGwANb8ovHX+T9p98g+il/7P1fZL55i2+98z+zmXzySn8GB/zw4xD0D3hlSHQslj/CV7/97/MX+p/mHRxOBWcMISYljRk9clJQNiIp27dJq79LWHcF2T0mHNjNnUVMonYyxTMWNm3aCZic+cswPEXzQhAF9T4NPldPu11RTSbJkA2IGvE+YKwDSQ1j6RqSXbNxBVILxpXEEFPzWFTuv/kFuvUaMQWQegzSxCwDkvsPBnllxp3wvU/pvCi9Hxa+u6e481zd+6Hq/i5hUBClEY4aIwbhJyan/Ln6nL+3eYQXyxtPfpbV5CO+885v/mC/9AM+tzgE/QNeGbP1O/zkP/7P+PF4xJ8uz3B9QG3A2YpIHHl6cuYOiYvvuo6yLIEUu8YiLinTt849p8ePpLVDdVD37JqZIK0Hg04+GZelcYUgFMZircObjsXRKSJQlBUhCGLJOxFBs6pomIc1sDAqgjiHdQ5CGI3R7KRicnqcX98QcmYNmZrKzx2snscY/ywR/wJppwwH5fQ9OXIOLJFg9nYEA7WjMbLz6c8U2rhipsemCv/60Zv87uaad3WNEnFh8gP+xg/4PMN8/0NeDhE5EZHfEJHfF5Gvi8jPi8iZiPzvIvKN/PU0Hysi8t+IyDdF5HdF5Gf+ybyFA/5Zo2jOcN7xs27BPS1AUxY/BOs01GSgHzLNYRL1E2PK/gepIZALoTsv/H2ueoC+IO0d6aGXpcMiWGMpiopqOsXVM6JNAT5oRKOO7pz7heDUGZttIqwD4zCuwNh0E1sg1qWfSbZ4RjAqiCbm6aV4VqUjmqZtfT9t/x4ltv/ZxPEzZdB5jguNQRMdFhUVeFBO+LPze+Pv6IB/PvBKQR/4r4H/VVV/HPjjwNeB/xz4+6r6o8Dfz98D/JvAj+bbrwB/6xVf+4AfEjg/5UvU/IRM8zBwciEzDQdnoFv2AlQSlGgK8LKXpZImXt3J4Pdoi1GLz/AjufN1//HnVDODhFHSLsGYoUaQhpvEnCGLs5nLH56TryE3j+UfoEMvwUg/5Z9nWemor2dHxw8mcWnLstv5PAcdzru7dnnmc3j2faZXjDuLiqGHIX/W+89T0m7rZ4/u87aZ7HYUB7z2+MxBX0SOgX8F+DUAVe1U9Rr4ReDX82G/DvylfP8Xgb+tCf83cCIib37mKz/gny0UTCi599G/zP3HX+NPmWNOgsOgWJNNFGLEkBqrJNM8YnaBy4gQvB8D35D5+xASF58Nx4bbcAzsgt3Lgr0xO9UPe88ddgijomZ4XvbjV1XU5IKBSG4asym4516AEAIhJm//wettDMh7Cp3huocZABoHairTNMqLg+1ewB8prBcE/cGWYTSjI6IaiXkIS8gU1P7z4rCgZmrogZvwZycPsPpsD/ABryteJdP/CvAE+O9E5B+JyH8rIjPgoao+ysd8DDzM998G3t97/gf5sTsQkV8Rkd8Wkd/myStc3QH/dKGGL/3hX+PLf/hL/NTlv8RPMEeCwapgNBVTQ9fju26kFIi6RyungBVDIBV6c6YaAsSIe1GWv/fc5y7nBbsA9vjz3UPPc+DpBEk5k84BDJ2v1mJmc6hqYkxBf9gRPPf66U56LuaF13n3Sek1JWf8uzpuzsbH+y8+zxDE02vr+Bh7C9HYrAUQI4SQpK3keoQIf2J6yhkOiQUSD2W+1x2vEvQd8DPA31LVPwGs2VE5AOggoP4UUNVfVdWvqerXuP8KV3fAP1UIhvn6C9Q4ft4ds4iZM5aIaESjx4ee5eUlvmvYExLusnERNMSRvxeSrNIY8kzZjBxQnwvq3A32zwX+Owqgl7+TQU8/DDGxxqUsPCoqQnAWU5Vg0s+ccyP1dHfh0DuLwX6dItUF7v5n0L3jJUd9HXYEQZG4l++LjjRY6juQ/HIRIaZ9ikZi8BijqIaBYBo/Ex/CaHWxuwi4Z2u+bGe8/fjP8CPf+auf8n/sAZ83vErQ/wD4QFV/K3//G6RF4JOBtslfH+effwh8ce/5X8iPHfA5hA01pT/mLVPyx5lQxBTsZeAxUMrKEULHanmbGqnYD1x72vMclGKMBO/zIJVBOaOZIonfP3Pew8uOfdHjYzZsTBq+bmwe1BLTbmW5pt9skmrGGoy1dwrMz9UO9igoeK5WO3rtj7uKITNPDM2OE9rL2nX/fEoeHjMMVAfJjWvqPTF4mmaTm7903J2EELDWIGawukiLbSWGn6yPqf2U+xc/wx/77l+hbE9+4M/6gM8XPnPQV9WPgfdF5MfyQ78A/B7wm8Av5cd+Cfi7+f5vAn8tq3h+DrjZo4EO+JxB1FCo5Wt2xpmUGBWSznGnyjFWsBaWq1u6tn3BSe6GwxBCMlAbKZ00EUuJuwD3GfFC+ueZa7HW4soyq47SAlUIlDHgcr9BYDe68dmA/9KFhl3gj+gzQV/zGnmX6hnOF2NMvvxhWDSfrVHsbTCipmN9RBSsmPw+IiF0iAw7qrwTEMUaQANfrRbM1FJ353zx0V+g7I8+82d9wA83XpXA+4+B/0FESuDbwF8nLST/o4j8MvAu8FfzsX8P+IvAN4FNPvaAzzHux5KfliOcCG2MOJsoHo/S+z5LIC26XtM1W+q6Jg4j+0QRDYkmyYqYEHzu3UqqHmPMOIBkoD/SNy9WmuwXLF+E76X6GQq8USNNs0m1VJMDMXcXDIl5EZK0MxgS9Hyi3evtZfq7QeeMK0BK5vPxMTeficHc2dXcVdxIVkel9H5vQdG8N9K8WNnUnzAsCN7HsXgdoxJyH4Rqsq94WFTcl4Ir7XbV6QNeS7xS0FfV3wG+9oIf/cILjlXgP3qV1zvghwPV9gFvv/8X+XE9575USU8/yC5zD5DGSAwhUTUxsL69Yb5YYJLLWlaZRDTGHJg0WS6L5Ow2LQjlILPMEBj5/fGxlywCcJeefpHSh71zxRhp2ya74OjAiDP2FqSD87VGjJE717Gf0Y9FXZE7j+8fabKadbegSe5fkzuvPHwmoe8RkVRTEEn0Tf7sTL7+YZGwxqYFwAgxRGJUnHWpWL3XGxG8B5SpsTwUx++HQBQ4vvoq6+mHhwlbryFeVad/wD9nML7mne/+Zb706M/xVV1QisEORdmsZzc5mgXvMSK4suD24oK+HQq6CZq5ZtU4qlBGG4bM7492yWMIHriMvfMMNYFhIRmULDkFTvN096yH8+I0ZMa6x3uLCHVdP/Ou99X4uxrA83YRL8BezWJXuN2pigbeHZKeczjfbqHbSVBFhK7raNsmLYp7cs1hdzTslIbPBRQffHq+2VlcWJv+63d9j6rixHBuirwLEN7+7r9F2Z7+4H8YB3xucAj6B3wqqPG01SWCcqoGG1PAMKTA7wzpeyVRPAbmiyMmkymrm1WSbeaiIzFA9DnAR4wq6js09knfT5J07oLrLviPgXJ3ZXdvz3S07kSNPP+4prqBiGKqClyRf/jiou9+EVef1cGzq8UOO4MhKOczjK+7v3BFIOQdxHisyEgBKSQDOWvpthvazQrUp9fWgMYejWGsRaTrSwXf6EOyp9BIjD51+4qMC+vwXu65CTYaNCqmq5jffPkH+Is44POGQ9A/4FNB1FBu71FGmHpNWWdMfLGS6ARxyUO/a1qccVjjqOopy9slfdcnO+CYqZ3gIXii7wl9S/DdGChTg1deJNhl1kPmnfC98mzd49A1U0nZknm8BdJ4xRyorSXGl5xun2rK572zA2BXfP1edYVUlM4vOBRu9Zlj9t7ruAYYQ1mWyd+/adiu1kgMoJEQPKrp/uDkOewEYgxAAPWgASuJUgrBY0Vw2XbizJbYoTYAHLwZXk8cgv4BnwrRdKwX38WqMFHoV+uxAQuNqCjGOYqyoG07XFGigHUFwfesbm5yQAdCQEOgbxti1xL7LssR9xgczUF/1LM/L4F8NvDL3td9CmbM6nVH56QCro6B0mDw602SP+bX37/dDeb5Iof38+x5n73KOzTPbiPxsmXrRecwxuCmE8rplKZpaLYbYl40NVtH765FCaFPC8JeE1eS6qcF1xgZTeFOpWAyVE2UQ6PWa4pD0D/gU6OZfEwZDZUIoW/YrtcE32NQNCQf/CJLHwOas8/IpCpZXl1gQqIbfN+hvqfbrIntBrRHYkpIvU8NpANXrTE1ce0Sdx0XhNEFZ/yecaHYySIT1z9k+TsIgmVw5AzBs10vU7Ez6nNZeHrpoa9Ad/TLXj1iHy96bDjH/hXkUS93OpafeUJ6P9naopzUVLMpve/wvoOugRAJ+XJjjPi+p2saIGKsTcopk3YrGtPuQPKCF2NkZhwlkgzfvnel4oDPMQ5B/4BPB4HgGqxAgTApKzbLG/rtGvWetusAcNbinGOz2VKXJX67oa4rfNezXt6mQm/XodmqoQ89ISp96PGxRzPXP1Iyexm0Phfwn6FZ9gL/3V3C2OI6BlXZo0FUldj1qAZCMsbBjOfkBQvAjnoaP579cw1c/PdSFz23eyDXM4adCuOLxhDw3tP3HgXKssQ5h4aebrNJxd1stRD6Dg2B0PfUrkj1kjyYxgDe98MF5MU6UBvLXGzqRD7INl9bHIL+AZ8aKp4igARlUpf4rqPZNrTNlqunT9lu1lhrKIqC9WqFKwusMTTNlsViwc3VdWokioHo5lHLcgAAIABJREFUO7zviUHpvdL6gA+eqCHx7TnwM2bXe8GfgQHaU8YMj+uuCWr/8SFov8iqOXXgtlkBQ+56jbsdhD4X9Ydnj/+GXQcav2+ufNc6Ys+Nba8gLZnTH9639552s6ZZrzEKRVES+sDq8oL3fv/rxLZLGX/XJR+jvKCEfN8Yk7L8rhsXM1Ul+EAlljMK9tbGA15DHIL+AZ8J0wCS2/rLuqZpOow1hK7lk48+hBgpioKoytb3zE9PaLYbAGLb0603iDV0zZrQd/RtR996Qh8JfaKJYkh6/ehDyjxztjoG/v37e9ny/oJwBy+JwmPWr0kLP+jvdViYshQ07i1Aw/mGxSXGMBaHyVLQ/V3G98ZOnaTsy053t93OBKxGNpeXrC8uAOj7ntuLT5jXBYWz+L4j+J6+bTCDxt9nq2sRurbNfRQeMYY+RHofKMRwburvXRs/4HOPQ9A/4DNhpkIfA2KEaVmiocdhOT+7T7tquPrkKZOyonIly5sV5XTGfH7M6uqGSVVz/fQCQqBdrfFNT7vZQgzZjTMQvSf6QNgL/hoiGiIMt7gXVJ+hSe5m0Xs+N3t4zqo4n8c4lzJsE0Eiqj6rfAJozp7jTt8/nPhZ1Q2ZG3+2z2D/H/vh/Znrjc8sasPAGVtUFJOai08+5vLRR4R2i7YNdT0lRmVzfUnsW/p2gxOBEDCqOGsT5dO2adSkaqqthB5QjBHesNUhKLzmOPx+D/jUMMBJNMQuAIaqsJTWcntzzWw24/69Mx4/+pDNds18NmO73uB7z8nZCWhk27dJXdK2NOsVYbshtA1d27NerfGdJ/SJv/Y+pIHmz2bZcFdZw7NB9wfHLtMHYwTnimx+pmM3wNjyFRkpmLGTd1w0XqD1fKFC50X7kN33dwK9hryLSAuOagAjTOZzFudn3Dz+mM3lk6TRd8LyyUd0yxt832fbhYD3Pc4VOLE0my1IsmKw1qZZxX325THCeVFhOHjrv844BP0DPjUMwiwKrQ9EwBWGqixYLm9o2i3HpyfMphM+/NY3AaWuKjbrDcZZ5kcLrq8uqeqKvm3pNhu6zZrgPTc3N4QQ6fs+3bp+vB9CSNn+qO9P9wlxtyDAaMz2gwT+/eOGr87aNBidnacNw3eSvurYfrWHnDk/u9u4Q9E8F+z3sv0X7kx2Q1FUQ9p1xJ4QPSowOTlmtpjjmw1lXdG2G568/12sM7Rdi4iw3W6x1lGWJV3T4H2PcY4QkveO957Qe6xLDWfnrqTQXLyOh/DwOuLwWz3gU8MoTCL4EPGqGGuoK4f6wKNHjygmNSenp5gIH3zzD3HW4HPgNiYNWbm+vKQoCpbLNde312y2G4wYCufo+56u6+j6Hp9vwfs0sSqE8X4MO6pld4vZFvl7B399ZncwZO/JWtngjKHI9w17VtDwvJIIMr8vL3zdF1E3Lwvy++e9Q/Xk966qaO/ZLlf4pmV2cgIYnHM8fvdd6rKmDxFnLOvVGldOmM5mdNsN/XZDUTj6rqMoCgToum7080Hh2JXMSCZ3rp/CIfC/djh0XxzwqVHFgrkKIaSiq7NQ1hX1pGJ1fcPl4yfcu3+Ptm24fvqYR9/+Nve/+DZnZ0fMjo8pL69SQ1EU1l1DbBqknnF+9oC2bfHR41xBIYoRxQh443c0jDHJnTNGbHbDVCQNHpGd3n2/kWsIwYOefrgP6TU0NyQpoMaBFKSZuGAVeu3T3N9B5RM8Iha12Q457z5QTdO2IPH/YpIq5/tgUOnk1SMpgaLmgTSKxkDwqdHKGUOzXPLou9/m4dkZsWtZLm8obYm1hr7rUdtxfP8hi6Mj+m1D12wo6jq9RojYiSOq0vc9kAbGdz4wcyXHUvIYz5vv/nlCueHx2//XQc7zGuGwjB/w6aAw62ZMSUPAvc8WyM5STydYI3z43nu06w1n989ZnJzgRHny7rvcXl1RLeacvfGQZrvl8slTzu/dY3m7BBI3vl6tCN7jg99l997je585fk+fv4YYdl228Znsfl8580xWf7dAurvFEOi9H50xFcWLEGdHyPSYXtM1MjiKDuXYZyii8Se6c+JJvQPxzs3km2SzNdGADMXi4NHgUZ9sKtT3hK7l5uKCJ48+wpA0+d/5nX/I+vEn9Jst1lq6NlBXMx688RbzoyO2mw2r5S1FWWKtZb1aUZUlIkKfzdastZnnj0ys49wUWBHKMKU6mK69djgE/QM+JYQHy3eoo8EING1DVVYYY6gnk2SfrPDBd9+lqCpO7z9gfnxMifDBH36D7e0tJ+dnzE+OWS1XFIVjUk8oreP26ppuu0V94uh9v+P0ve/HoD9QHT4EupCpntGh8nlqBNg1Ue0vCM8sEumcMdkRqycETxcDV71nFYVo7N5OIhut7Z3nWYxNZCSp5bNNZLtPdO97ZedLlHcPvuvomya5lEZPt16yvrykqid89MFHNJtNOoMxnL/5Be69/Q5FVbNZLllfXzOd1Lii4PbmhqIoKHLQ79oWQxoegwIhUInhXjFJC7lxnFx/lUOYeL1w+G0e8KmwuP0KP/X+v0qllmhg2/aoKTBWqMuCaT2nmi1Yr9Z88N67TOczTu/fpz46InQ93/m932O7WXH2xkPq+Yxm23J+eozvOm6ePAGfMlj1Ht91idP3nuB7ou8IfYv2HrJ+v+97+ujx0RPVAzH5N0R9jh+/Y9w2BtU0RjAMKhljUDFpYek7pOug2YBvsGleImCy22bu5mWPNsqmbKrsagGwtzt4Hs9eo9GIiQGJKcs3GtLOQAOVQGmU7eqW0Kw4PT3Cq1LOZhw9eIg7mhMJbG6u8bc3HB3NcVXF8uoaE5VqOgVrklbfB1weERljJJJ0/A9sjcvvMb3fA14nHDj9A35wKBxd/xgPm5Ok/yZRAttty3RS0bc9RVVS65wYA7cXN1zNL7h//x7WGjR6lpeXvP97X+fNr3yJ6WzC+lopSkezXtKsG44WC2Lw9H1DVGU2n2NE6NUTe4MrCigUiQ7jLFYNRINaTbdMVwiahoA/+xaG7Htsz823TN2YwqGkhiZFsUTmsUe9R3Q3gNwoO8fN/SR/HISeJZ6Dn47yHC/+or6CZ3cikJQ7omGsE9STCldYvvW7/x/dZsX5yVvM5nPEWWLo2Nw0+K7n9MEDpKy4evIEE+Ho/AysxatmVY/FOptooa5Nhp9WOC9rbGeSb9IBrx0OQf+AT4X5+g3OgsFmCaOIYbVacXb2kOjX2ALKEND5gs3NDcvbW1xhcUXBwy+9AzFye3nBE1Emkyp3kDbcXl3jowHfsll2eMBYS6ir7GeTJlWVVZXn7zpcLMBZNBiMDfTG4KylrCqsE0ZmfmR24k43PwbcvcAmkhYVBMSk+bFGMIYsm4yjQijVESR50+/tKoy1o4/9WJcdov5zr333PrneQIyEGCH6xPXnSWJ9t6XvGkQjl0+e8P4f/AFfeHCP0trsEArd8hbUcP7mm3jg+sOPKF3B/PwMU1WoMWw3G1QEW7gkTxUh+N1s4vOyplChkxd7mh7w+cYh6B/wqVBG4X5w2IHGMLBqOvpgsGVJCUQtEYQ49TSbLeWDgpubW8QHHrz9Jr3vuHj0mNPzY0rr6GPENy2Xt0tmxwtsWWJtgboa9ZE+tkSfm41yw5J1RQqIlGAMGg1qTRpGkkctGtlTHOogzXk22O+GoBhjiUbH+8MsWtE04GVQ54/F3wBxj7YRETCapmENi4GB75Uwj0E/BjTkSWHBJ5vkEMAnaWrftrTbLaHvMGJ49xvf5diVzCclRSm4wtCtttRHR5y88Qab1Ybl1TXz4zMmp6dIVRLFoD4SmpaiLNJOyBqiKj6kecZihHuuZGIMaw6jEl9HHIL+AT8YVDChZB4c88z3pmlMSbp5c3vLvbNjQClz52w9nbBetixvlrz1xbe4/PARTz56xPm9e8TO88mjj1lMSvpmQ1koH3/ymKvO89M/8WMYC66okRjZNluIEeeK5P2eB34P07pMkSZdqSpBwRqTFiTc3QLpnYCvadAIsJ/NDsPDX5jjZvrDiCX2WdcvCmLQgUrae9K+rfJ+Rr/P7Q/1BWJAfcjBPhWrY543kNRLqVcBVT76+DG//4//gJ/7kbeYTpNU1rcti4dvMDk65fGjT6DvOXvwJtXiiOgc3hhEYbvZYIzB7t1CSJSVFbAIR65kKha0/4x/LAf8MOMQ9A/4vpBQ8PY3/jLHFz/Jjy7fYE5q308BzqLRc3Oz5N7ZKa5wBO+xIVKUJVVVc3N5xeLeKWdfeJvOdzz58CPqyYyjo3s8fvQelYXQbZnVNR9cXPBTXUdZF5RlSQw9fdOMvLiIgDWICkGHQqniXJGFLxG1FrURNRHNmbZqVvDsTVhJBda7M7iSC+WwKLDT7+/JMcmjCE1WzOhIJGVlxMDP35letZsBbMaBLToqdNL0sCHT70evoRgj0ffJlwhFjCNEpXYFx8cTyrqkD4HT0zOCKI8//ID5ySmLt95CyhovBSrpGvt2S9f3TOsKMTbtZhCC92hURFLpuXIFJ1Lyvm7HysQBrw8O6p0Dvi+KbsH5o59lun7IG/2cQixGSDcjyTZ527DdbCnLksIV2OynX01qcJYPvvsuXYicvvkmR/fPubx8ig8tp6dnNFuPE8dJVTIvk+d+WRRUkymbbUPftnmQSnK+VJ+y4hg8fdfSdS0DhxL35Y6qI6uTwncmaEYN5W6sIJCp/NSQxaDdj0keun/eEFNfAFlWGvp+tIFIzE5EdOcTZI2htDb1uWbbiOQemnT46tP76PsW37f0fUcMabQhMeRGtoBGT1EW3H94n7OjGVXpiCJMj864Xm5YL295+PZbnL75JlJUaQciqeAsIbJZrSmLAjGWKEKQ1DHQtYk6U5Fkq2EsDynzZ3CgeF43HIL+Ad8XrlsgIVErp+LyeL0078mIYJ0lauTi4jJZKZQFzlnK0lFNJkwXc/y25cmHH1FUFYsHD3n45S/Te0/XdZyenlKWBVVR8NHjJ2z6yOz0Puos69WSfrAKsEkn72PMNgwpS+6alq5tiUR8jPRZw4/qXmwXjLU7asPa0XJhN/iEsUkrDl/DIAHN/j57E7zatmV1e8tmvaRrthBinuDFTn2TZaEySjh1dAeN3tO3LX3XjRYLPgSCD/je07Ut2+2KrmuI0SfbhLbh4/c+QGJH1EhZ1lxdL6nrGfe+8CVkfkyHSRO0BNQqIoFms8KgaeiKWIZaxrALsTnrRwWHcM8U9HnncUj2Xy8c6J0Dvi9MqDBqqaLhXBzGJP+d5EcjgKGwjtVyzbbtKAuLKxzRRKyzFNYSuo7rp085OTvBFA4pLOdvPODDb32bzrccn53SNJE333iDN3/0q1QnR1w8/oR2u6EqC5xJNYRhhFXUiA8eo6mgvF6vmQioWLz3GGuxwWHVJcsGADHJ+8eYZI+Qm6ti9CiCiZHtZoWoUtfVrtFr/8MYdgYCYi0hRpqmpSh6nCsTtZRlnbHLzWQxUhRllpIOVQRBjSFqoG22OCNYIG639L5DYlLThODTIpN3IaH3xK5jVte4akIXlOM37jM/vYeYij6maV8my+tFIXQdzXrFdDbHWJveU14IY0iGboUtGGodRiwPyilmvVcGOeC1wSHTP+AHxjwa3sABKdNNikbFiuCsQ6NycXE5BqjUwGQo6or52SmmLPnogw9yMVbACvfeuMdyteZmtWZ6uuBP/8mf4fz8lOXNBevLp5gYKF1aRGTocsreN96nbl0BQvC02wbfdXRtS7PZ4LtEu4xZvisQ5xBrEWORHPhDSLSR71o2N9c0y+VI17wImpU8xjmmsxnOWvou8/AMNg8B33d0bUPXbmmbLTGm3UeyiE4SVGcNhIBvGja3t/TbLbFv0dBjJTVLJZWS4MqKyXTG8ckxi6MFtq6YnZxQTKZ4MWlmbxz0/oKqoCGyvLmhKgqKokwLoKTaxbioCIjJdQoBI4ZTV1OpGU3mDnh9cAj6B/xAMMAbOBYmUQNDMVNEEEvOoIWrqyu8T8NVVBQ1SdZYz2ec3juj2ay5ubigrEpijAiG09MzPv7kCcvbW2ZVSXN1xerpU2LfUdcFk/mUqqqyeicHohBHbj94n752Xc5q12zXa9ptCrRC4tWHQDd00KpqmonSJ/WM7xti1yB5vPjLhrLsJJ4mXVdVorLnvpkXDGPTLQ0qaUeeXmPy1embLeubW2LX4fsW71tiTDODQ98TvU8WFdWUYjKlmC+YnN9jfnqKFAXVfI4pK7xAeFHJVZWuaQjeU00mGGtGOmegdvrsuz/KU01aaKbOjQ14B7xeeCV6R0T+U+A/JO0L/1/grwNvAn8HOAf+H+A/UNVORCrgbwN/ErgA/l1V/e6rvP4BfzRIBmKGtyipxRLx6XGxGDFEjVhroHBsmjXXF1ecn52kQJi5Y2sNx6dn9NuW6ycXvPH2Q4rCsQ0drrAYKbh4fMXibA03Cr6jqmvqowWT+QLrSmLQVNT0gzomMTQBxRpLCBHpe2JUjLMU1jBdzCgnk9RdqjENHM9maSDjGEQnERdDmjJlbHLT5Hk6W7NHDwySTMb7+QAgBU7jHCKSsvzO45sNpqpBFO8jvu/YbJbEzSZZLuSaASRLBB8j9eKY6uSYKIJI6kiuj9d4K0nJg8FqrrHIbgemquAD65tbptNJ2uUYQ+z79M5FxoKytcXoJWSys+hgMfG9hrof8PnEZ870ReRt4D8Bvqaq/yJggX8P+C+Bv6mqPwJcAb+cn/LLwFV+/G/m4w74HEABp/C2lhQYnnVjEQQxyZO9cAVPnzxNgTdn15o7Vq1zHN+/T7SWm8srJnVNUThElLKuuLxd5UEpgbKsmB+fcHR6TjGdoiKEmKZA9V2iTLq2Sb77XZcGrWQ9u+871re3XF9ecnt5iXZ5J+D7O/N0B9sDzdLJ6Lvk0c8wIzcPZM+qocE8bSzE5qBJzv6HtURVCTEmR07IWvjkH9R3DdF7iAHnLMcnpxRVjZhE48TgCX1Ls92w3axoNyuMEYqyoqwqjLFsti0hxCT7NAbjHNbY3fWR5Kmb1QoUyqrGGIcPSgiKMTZ9nrl4bI25U6tQBQ254HzAa4dXpXccMBERB0yBR8C/BvxG/vmvA38p3//F/D35578ghzTihxea9PnV7ZuU63vUQbknJc4Y3BDghhCTOWLrHGVR0TY9N9e3o9pGRJJpWgjU9YQHb77FdrlGc8MVpOlbl5s1MQplMWFxfMrx6RlVPUXE0vc9m82KzXpJs1nTNRtC147SzGQNnLJwDRGJSrNa8/SjRzz56CPa1Rq8Hz3v73TiihCDp9luCcHnhSo1RiXlTerKJSqEmPT0XU+72bBZb9AYc1OXjJz9KMmMEZO62Ojaju1mQ9Ok11GEsqqZLo5xkwm2rhBns3tnxHct66sLtpdPiHmx6NstVxeXkEcz2mzBwPA5ZNO20HZs12tmiwWuKFAE7wOa6xvDjsWYvUExRrK+SOliIOjdgfMHvB74zPSOqn4oIv8V8B6wBf43Ep1zrao+H/YB8Ha+/zbwfn6uF5EbEgX0dP+8IvIrwK8A8M5nvboD/kng/tf/bU7e+3mMWo6icF4W1EXJ1udB2iQVTxzULEBZOvqy5PEnjzk9OcKgSO5iDTEiEpkdLdgs5qyvrikKh0pqCOoCmLKins2pplPEFXRdz3a5Yru9petagg+QA6mSpnClYmeSW4YYsk4+UUDb5YoP332X9XrF8ek5s5NjJvP5TqYpYIwSfINvmjSYPfP5PlMhrijGYK4x4LuWbr0hYiimC4zYRG8ZhRjA9xiJSWkTQrZjNoTQYTCI90QLJhiiGKRwiCkQG8H2xC7vMhB827K5eJxom6qmaxqWTz9h4ZJGX1RTaT2vOSICMbC+vWFWlZRViRpD7ztC6CnKInsDpUXMGpMGtqAYcnFblZu+SXWCQ9B/7fAq9M4pKXv/CvAWMAP+jVe9IFX9VVX9mqp+jfuverYDPjPUUl2+jXaG2CuToBRI1uAXY8DUTDFYMViTGrLquqZrWi4vLwEyp5+6eEMIGDGc3LufqJEQKcsCYwyTqqKaTjFVgTdC17Vsbq/Yrq7wmzX4DsFjDIg12SHS4MQkHjuG0b5gHJQSAs1yxZMPPuT9b32TD7/9bbrNdryuYXhJt1niuzYFQDHYosAWBYgks7WQCsXddkO3XdG32/RZlCXiLMYm0ssHn5q3MtWSbKE9k8mEuq7HYnJygM6uoM7lhW7GZLZgOptR1lUuvHr67YrN9VOWl49xRNarG8qySJm4pAx9bEhQZbNao8EzWSSJZoyRvmvzIQaJQvBhNLHT3LiW105Ulau2odND0H8d8SqF3D8PfEdVnwCIyP8E/BngRERczva/AHyYj/8Q+CLwQaaDjkkF3QN+KKHZYz4m9UsOZFVVoRrplykLViNYkxwenQgqUFcVXV3z+OPHzI8WWJecHBO3HQgx4iY1k5MTbp4+oSorrLVMqyqPQrSQTcb6zQbxETEGl6mIJDExiHUYY0e/HD9w7DEHs+TLgMZIFwK+64m95/r0jDdn86RVV6VZL+m2G/ABrEtdxs4hzlHEVHCNPpm+Re8hRIrJBDObJdMyn+kdkSSJ1KzFN4aiyN3JxqRFKHe4CkMxOdU+ynpKtAXeFXQGSgGzbXMPgRL6lslkiq0KtpsNdrJI7XHWjp8HIvi+o20a5os54gpUJO1YVHHW5R2S5t2SjNJaQUYaSlXpgj8E/NcUrxL03wN+TkSmJHrnF4DfBv5P4N8hKXh+Cfi7+fjfzN//g/zz/0MPf1U/xFCCdMQQsWJYdIJ2HusMs9mUvu9omm6nhJHBwMyCUcp6wvJyw9XFY+49fIjqTg3i+9RwVC+Oub28gr5HjFBYx3a1ZDqtKawD73HOEa3F2RrrDEYM1jiMK+h9IMSkEIoxpMKpau6K1dHjZtiNFEWijrq2xbcttjD4ds366iniu0xz5DqFGfyFFA1KlCRtLIsKKQrEFkSbbZgHXx4RMA4TI6jPDVwmW0ikz85FNzZsuTyxSgbDNrEY6ygl7Zy82eL7ZHpW1ROmJ2c0WelTFQVCGviCpjm9MUTa7RbnLG4yJZjcA9D3KeDbxMGFYVaATXTOIPY0YtKkxhDzTuCQ6b+OeBVO/7dE5DeAfwh44B8Bvwr8L8DfEZH/Ij/2a/kpvwb89yLyTeCSpPQ54IcZOgwMV2YqLNdrgvfUk5rpdErXdaiG3KykiDMYm2bnVlrQz2quHl9wenKGrSsArBVQi+89OEs9m7LcrHCuIGjg9uKSurDMJjNsVTE9WmCLArEu0yYRa13KcLsebRui3/nY7Adgay3iku1CVU+o5nOmiwVFWbK+vcYKrJ8+Jm5XAzOCyTLMoamrbTu8K+nqKVYDVgVroOvD+Fqg2YAtfWYxF35jTPYLitJ7n+0rEgb7Z+dMGjAjFpGspHEFpq7pJ1s0RBTBliUx6+7Jz93ZR6QGOd809E3D/PwcbBoc33dd8vkfjo9xHCA/ms1pas4iN5a12y1GFTUHncXriFfS6avq3wD+xjMPfxv4Uy84tgH+yqu83gF/hBAlunbkpo/U0Gy2rDYNs9mM2WxKs93SNG3uvAVbmKzGsVgrBD9jvd1w9clj7r/zBYYe19TIZTHOUs6myKXFOsfW99ze3HA0rbA+UMYZriopZjOkKCkGbXku2oqmwunA5RNjtiAwOOdwRYk4hy0KqsmMejHHlQXOGvx2zWp1iW43WGsIqmDTomWMIQaPMTZl6fM5q95TiXAcPUTP8uIaXENVTxJ1tTdW0OTC7Wjclg3a1KTr1pgWyr7T1BkcIjL4Atnc/IaDqoKYFl5RpdusWS5vubi4Jr7zFkhaYK11hL5jvVwxnS8oy7TAhhDo+p6qSoNoklyVcdfFnsWESO5ZUGW5Wibb6hc1KhzwucehI/eAl0JNEmEZhKka+hB4cnVNiAFXFBwdHzGZTCiKlHlHgUAEYyjqmtliwXQ+Z3V5Rb9c52AIMQQ67/EaMWU5drRuBG42S7zvAAhdy/ryguXTC5rNZix6ijWELF+UQU+fu0mtEQrnKMqKoqopJlOq+RHVbE5RVmAkcfPbFdqsETySo5sUFpxN8s88l9dYg289FQUSBVPXGFfiu5719Q3NepN87jMGMzZEiCQDNY276VcaUrfvUD71vsdnF82B/sr7JqwrsEWJLUqwlhgCv/973+DjTy7yayQ7CYywXa9wVcHkaDEWlfu+T4ufS7mdDLex6SrXHnK9JarSdG16nsjor3TA64WD4doBL4XaVHSsERbicEZ4enHFzRv3OT05oZrOCBGa1YoQQ7Z1FESyg+XUIaeBq6blyaNHvL34F1J2mscahi5lsOWkpixLqqrEd4GoBldPKKuaGCN+uyFoQH1HNZsTxNDn4uTAOVuTPCzFptGMRV1RVBNMVVFWE4qyxBjQ6AndltAkblycBeOSt40rMUWJiBJ8SwDKaoJrV6iBSZka09RayumUbXtF1zSINRRlOY46FMA5l6woVFOwV027iRzsU8jVbMlg8Zoz9hAIsUcwO849Jvrq8UeP+Ae/9TtEH3IpQRFj6LoORJjOU2E5xIj3iQory/q5rtpkS5GXHc2jhDW5g97e3ACKS34Mf2R/awf80eGQ6R/wUoRqBcACy8wkS+WmaXjy5ILQewwwmdY5oOY/JR3oFp+6QeczpudnNF3L7eVVco/UOHq8aAg4a5nMphSuYBUCs/mCYjLFVhX1fE49W6SpT6s1N5eXhK7FolhnRrNMMYKxjqIscXWNq9KtrCYUuekJVdR3hHZDjKkwW5Qpk7ZljStqbFESgdh7/HpDe31NFVsWFkpSoDYizOZznCuIIRD6npB7F1TSgPWoijEOyUVnyXWIxMVnxYwma+joA0YDse/omlS8TYZyHt93eN+xvrnmW1//Ot1qyWJagyRKDKDdbLKRmsWHkArFfY/LxWjNe4eYqZ1d+q4MTV6qynq9pm87yrKkLsvUsHXErBOYAAAgAElEQVTon3ztcMj0D3gp2vP3CJNbFtspFQYhFTefPLngwdkZp2cnGGuZzGeE22RzgGr6OrqNQT2fs7m55vbjT5jWNVQlhtRNqjHSbjYE36dzr9aYxYLp0SLRySbp8G1f0vQdihC7DmuFsnD0ZGfJqBjnKKoU9G1VY4sqae2NyeZqPaHdoKFJvvbOYYoadSVGHcaWqBFCVGJQnLikejEG7T0xJGdQYirc2sLRNS1912K2hul0QlFV+DaOuxARg1iLlRKL5mEoaeh51zSAAZu99bsuzfZ1jqCajORCBAIXn3xM7BrOjmaUtUPKgiBCt90ipqSs6ywXZXTzNOTCLWRd0lB3SLsOI4zFYBHldnlLVVUUZYXLn9Eh5r9+OAT9A14MSV75ooY5hko1qUwKx7Zp+fjxU+rplGpSYcuSejqj22zQmPj4seEHoawrjh/cY/3JJ9xeX7N4eH9UlNjSEfue5eUVEjxPV2tWXccX6io3FqUMFeeoqwpjDL5r8X3AWkPhijSzFrkT9F1Z4coK41xS1ASP+obYb5DYYW2BKSsoKoyrSP8VCjQGnC0oqglOhGgkS0JjGqjSa+r89T3OGVqNdG0KkH0zpZ5MoCjou+1oTwEOjEUkItHmwS+eEBPNQoj0nUeFlL3nEYwxhNRHcHuN63tOThbMjiYst1tUDD4ErEAxrRDnUvCOacKYywZrA8zgC7T3C5ahWc4Iy+USQZhOp2Atuom7P4QDXiscgv4BL4Wf3oDxPIgFNRZXJlfNrQ/cXF+zXp5SFBbjDHVd4gy0DUQNiSM3idsXI9jTU0LX0jcNoekQK8nxMQTE2WSk5lus73n329/iR7/yTlL2IHglqV8UvO+Jm2XOmA2uKDFFhRWDKQqKuqas6xTsjUnql+hR39O3DYQeh6QCcjnBFTXYEhGXnC27HhWDLdLAkzRiN9MgGtHUSosRxWXPmuA9XqBtNkx88rpJU6dCOsYYlIDLVhRN1+HbLlk+iBI0Ii43SNnsfpMtH6L3tKslk+mU0+NTrE1XZZ0Dr1CkhSIZxnnU5FkBLhV4NRfPcydassUYvZPIqifldrni6PgUUxZEhW1MPj0Heuf1wyHoH/BSxHqNzFY83NaU4rBiUYHge3zfs7xdMj+aU5gCA5RlibHQdWkEYNf3GO9Hu4RqMmXdNDTrFfOTY0IOKKrQtC0hBo6mJY8++pCLJ4/54nyOLeudc6X3dKst/XabApgrUJcmUtmiwpYVrqoQa1ESpSPZuTL6FnyXJJ3GYlyJLSqMK1EpsvyRNGzFJi5eZeejj8luogpRklPlYEMMWZHUtvRdjytKiqqiWS3RECkLS7Nt6INnu17h+zZ16IaIiMNag3XFqLoJ3tNnCWqzXFI4x2QyYbusKa1N7y/XDZy1Sb/f9VgTk9KzLsbf4RC0h0AvZhfIvfe4ouDq4pLpdEpVV0QxeB94slmzXK/ZTrYcdJuvFw5B/4CXwjYLpttz3qym1FrnRiEllhX9dsPV1RUnZ8c4t6DzHmsEVySJYO8Kttstsfeoh8I65otjUKXvG5pmm83NUmC97ju0tJwfzyiscPH4MSen5yzOUwCOvmd7c0t/dQWxS+MQSXWBsigxZZVuriAOyWnyCIbYY9oGiQGDxRiHdSngYwqCGqJKDuoGwSLWJYVMGOSgBiOKYNO0KQLWuaS4kR5ipNu2+L5D4wTnHJPZjM3NLX2zRX3H6uaa6LtUG7E2bUT6QK9K532SeXoPvU++OsGnruS6RqwhGqEuHD2REHQM/n3XI4UBJxTGjNx+yE6fg/5fTNbekwa+JKqsxxrL/OgIYwu8Kqo9T9stPiYbjgNeLxyC/gEvhVufUvQVJ66iMkVyuMydq7HraDZbrp48ZT6fYCSyXW3GYej1pKasqlGymLzbTZr21KYgblLaTOcDH50eE9Y3vFN6jC2xIqxvrymnNTbbM6yvrqDtMKXDlSXlbEExm+PKCnEFwRjiHXGKYujx3QrtVmAEKQrK6ZSinCCuIpLqBkE8FoOGHiEgNtsTiEGG4eAKqCVPwaWsJxR1S/AdoY+EpqVfrYj1BGNTIXlyfMp2uWSzWqUpVaR6AN5TlEXuAk6OnCH0aUxi9tohegpX4AqbZnmp4ozlpg90MXBiLCZLOxloHVHaJnH+xjps4bLLz0BW7Qq3RpWmaZjM56gR+q4lBGXdt7znNyCZIht9gg54HXAI+ge8GApadFhMsvU1FlumWbXOepwqzXbL7e2SzXrD6ekxGgKb5TWrmyvq6Qzn0ohDFSXElHEmf5ckVeyzB0/rPe++dcbRzRVvTMG4KWVZEwP025auXyaqxPeUk5pqMaecLyinc+w4ICQm1U0eaKIxYkNEQ0vcpiYusQ5XVbiqRoqCaAw+QNRI8B6xicEfRz2Sw904NsBkJ0qLUcEVUE8mhLYl9mlAy2a1YrI4QsoiUSnOMjk+YjqtadenbG+vada39NsV7aqlns6YzCqCWLoWQhcIXUuMyY3UuCJdrzWURcrEL5qGjfdp6EpM7p/OFJR5lGVROMQ6rCvG9zQMtNlN+Iqsbq7p2zTbd9t1NOsN89mcK6M88c04N/eA1wuHoH/ASzG9+AqFnxAkEGzE5SDgCoebT7FW6LuO2+trjhfz1J1rlNXFBctHj+i32yzjhHIyoT46YX48T1LLmDpyC5eaqXReINMZx0VJXR1jiilFWaIh4nuPtY7p0RH18THlZIata8S5lIkjBE1BMA0SIRWIYyS0bWqEKkvKyZRqMsFVE9QVRBV8DNmnv0cLl33jhn7ZvGuQXcAf3DFFyY1gJWVVEboOr8nhcrNe4+oK4/LIRGvB1NSupJjNqTYrtjdX9OtlmqbVdxT1NKmjjEkzAUg6/3q2oJrMwUAxmXDZdjS9p+16QvQQPKaodtLLwfZBIrHrsc7iXJ4rnLuFY9+xfPqI9dUVfZd+P2Ids/N7zE6O+eDph1yJ55Ddv544BP0DXoqyOUmdmSEk6wVTJN8cMUhhcIUQ+oLYBza3K2aLGbaacPLGW0zmR9C2NN2GZnnL9mbJk8dPeGyUYjHh7Pwc5xwqhuOzE8qigcWCeTFhPj0mUCRqwsBkOqGsz6gWx0idCrWR5EffdVtcWRIMoDbr8QMmBoSYnDmLKSKGspphygo1BYpJWXLoCdrTxx5an3YiyjhBKkkbzWhfAIxFYoPBVgW2qrB9j48BNLC6vaaaTqjnBTGfw5ik1y+qCjedUc6OaW8uaZc3GFKDlm+3hHaLzQ1T9WRCdXSMrWuCRnosj27XSBQ2mwYNYCuhrIrkGOo7YpdsqHElZVVTFQ6biR2jyub2ipuP3qVbLVERXFlRTOYcnd+nPruHNzXfaddsJRDlwOe/jjgE/QNeCgkVFQanieKw1lJWBUYc1qTmHg2B2DVsN0v6fks9m1BNJ5THC9AFToWFRqJv8Zst/XLFk48/5OOvf51iUlDNZlSLBc54mvmEiZ0wn89ovSFoxBrDbLHA1hO0LHK3bCoweu9pmi3z/7+9d43RLUvv+n7PWmvf3ltVnTrXPn05p2e6B7U92DPuYH/AXAwyY8thclEsW0gMBMmKAlJQEoVBRoAAIZMIpEQgkJOMsCOwTUQs5kMiGFCIRSLD4GHsnnH39P127qfqVNV72bd1yYe13vdUD93jOT3T51Sf3n/pVe1ateutZ69317PWfi7//yxW3AQB78KmLl9lmmw03ShK6TwHo3ESa+9DiE1SeAeJmjmIimWZqU8hzcS/V64eaZRjyCWUJd722K7F9Y6mrlkcHpIXo0gPodUxvptA3/egNeXWDirLsMsFq/kRvu/RgClGgDDZ3iWvJjilcdZybf+QvaMlQRRvHRzwtO3J2g7LnMILQeJTU16W5FWFNkXUE3AOAZYHtzi4fRXlLbNTu6iyIBtPKafbUJQEnbFYNFxbLQjrBU4NO/6HDYPTH/DeCIoxijKADpGCwPeW3nbYtqZrVvi+pV0c0q9qbNNGFkmBxz72JBc+/jHychwdqc6girv2c1XGXAu3336D+vZNRmdOoc5uczgqUT6jKEuwQl0v6esVjVbQdrHE0xgQvWHaXMsaahTBgyQKiOB6dGHIinIjIB6E5OzXlMSwDtjEqiKbxFdSR+3dn8bs9Tdz2KQ6/awoKJ2Noi94Qm9ZzeeMxlMqM0OJ2YSKbN+zd+M6I5Mxns7I85Lu6AhXr1ACOq8wozFlNaIYTwkmJwToupoXvv5CpGrWmjdXNW0TY/nlpKAcVahqhEEIfU+zdwvX9Yy3tygyw/7tW/h6QZnnFLvnyCdbmLxAFwVWRTnLtul568oV9vqGoMHlK9rp7aE/6yHD4PQHvCvEG/LVDuclRwdhtVxycOM6R3u3uXXjJoe3b0HXMCagVOD0mbNMZzOK8YhCaQ5ef429N1/h7KOXOXv5MjovEv3vIcH2lOfPMXUdt197kdXeHuVWycGkpF4KOsvIMqFtA31ds2pWBJJSVlHgTY6s69W1pq5XGBfQyhBcj3cdwXVYr6l0Urfibs19gEgMh6C1wftUQRN6rPV4f5cpc90jkN5g8z4+JNERori7VKO4cDQFbdPQti2L+QFmVJIJBC84YHl4QDffp+8amqMxKGju7KED6KoiH08oxlPK8QilcyxC8JYbb7/NtVdfZmIUC2243VpuHc3Z2tomq0pss+Lg2lWWt29jesvpc+c59ehFrG04uLmHIpCPJ2Q7u2TjLUKWxfJWADyddVy5cpV5XXOYJK7Fa1ZnXo0COQMeGgxOf8B7IguKSyGjOVyyd/0Kzd4NDg/ucLRYsjPd5nt+4D/g0hOP4myHybOob1uWiQYh6ugurl/jynO/iRQZOxcvUGpFvWy4c3iEsw7ROctVJPqab0046AKSGYxosizDa41OvPFOBOts5KgMPtL/aoOzDi89okNUrLI94h1N3VBWPSbPgbViFFHhS2JuIjZZ6fgefYd1diMZmEgxE3Uzm53+ZvFI6lxBKSTLMKMRaIMuSkobZQ5D3xOUhkRW1y4WqL5ndbDH6vZNlATyPEOPtxhNZpjpDFNVeJMRROED9G3LN557jtC2VIl5cw/P2yPNM0XOnatvsbh+E9fU7F64yPlnvhdflrTeIk4xPn0BM5pgyvi+XqtYoZToJZwPvP3WFZaLFTWeRVoKbj/1r5iff+H+33gDPlAMTn/Ae2IUhJ3Dhv3Xb9Af7RP6hrKquPDYE1y4+Bhbu7tk50+zXRSxAlyRQjkSd+VBMXnsScqz51lce5Prz/02RVly+sI5Tp0+xf6dO3RBuNV2vJZralFcC55P5zmZMlTTLXyICVBROoqmOIe30SkJEseVTmLjLtIlJy1a1zna1TKmZJXCYwjrRPS6hJGoh2utxfUdzscngeDCXaGWREG8JqiMO/+YzF0LkiulMFmWBFgitYEKjgC4vgOEvm3RWc5kZ5fgeuxyQXCWLK8Ybe1Qbe2gigpvYt19ALzr2bt+lf2rVyiMZgXkKFrn2dna5mh/j9XN27imYffyJS5+8pMEU9Ata/CB8WwHKSu0LmKPhURFLFEK5yLr5vXrN7izf0A5GnHUNCxUzGnY0SHB9A/k3hvwwWFw+gPeAd1MmFx/hnJ+nt3lDK7v0RwdMMoNszMXme3sMN3ZIS9iA9ZiPudgb49MhFFZoIocyTRaG9r5grIsMUXB+Mw5RpMd5jeu88pvf4Pd8+eYnTvNzdGI1/Zvcb3M6a3n9Ss3cBcuYYwhn0zxpojC3km2MQ+BYAPOWZA1fUG8jYPvEec3alXOOZZHRyit0EWByvLUxBR3+DpGb6KAeZ7TtxnORQ2BlDRIO3p3V1JwTWuQ5iuWSab4vyiUltTH5cFHVk3fO0BQAqaqUrJ1TDffx3YtRVWRTWdIWSE68vBLepppl3P2rr5NIYE8M5gQMC5gWsvocEl9tI9b1myfv8DFTzzNcjGnW16Ltf7O0t0Zk2+dIt85TVYUsX9AVApbefb391nMF1TViBBg33W0Eimih1j+w4nB6Q94B0Y3n+L8V/4zNIpZLVT9IdvnT7N1aptqNMIUeSyRdB13rt2kni9x9YquqQneUY3HbJ89y9Yj59iajDl661W88xRnz2AmW4wvXuSx7Rmrq1e5/errFGXJwXjCSgm663nrjTc4/MQznDlzFq2EQml0b+ht3MEHIBjAxk5TUbHz1DqbBMg9KjVogWCtpes6JtUoqW7p9EgSk7AhOTitFUWeg3NokbTDT6LrpsS3LdoFtJHExXNXVsqzdv7p6QOFJ+AQnEt0yiEkmcgYWspHU0yRY/suPiEYsyFJE6ICl+t7ljf3qDxMJmP2D/bRzpJ5yJyn29+jXR1x+twFyvGIw1vXqI/maOdRoiK/jw30zqLwZGfOE5lEPd46jg4PuXntKkYbTFkybxredg29Dnc70gY8dBic/oB3Iqgo6A0UuuDypUtUucGJwgXQOsc7T1g1nNreobrwSOTML0sUwuLOAVdfeYVXX36V3UfPc+6xi4RmxY3n/h3WwZknPwZ5gR5PeO6rXyUTh7+wG51i29MezHn+xVc4feZCJFITFytvkmP3PoCLPPUhhESXAAQfnbWKvPFFUSI6Q5ShHI/JyipKC0aXipeYWI0xDxBjorZupuOakEIzC69hNEabCjffp/AuSiCKYLIcRMVqnzX3fNKfjfK4Du9tzAmkRcg7F+v+gwAaZQqCMSijYplkiLH24ByL+RF9s2I0qqhGkc9HSUuu4EKumC72mU6n5JMSUQEdLLsXLmLGU1Q1inoGSSfJB+itwy+WmLzABk9T16yO5hhjmOZR6/c2fdQaCLJJXA94uDA4/QHvhAcnHcFnLMXDdEK7aui8jQ1OpWFra0x59gxKxZ30dGsrqTgFtk/vMrv8BP18Tnt4B10UVOcvsvXEx5nfuEJTr+gOVtg+6sB+4/Yt3n76kcgYWbfozvLCSy/x6e//NFuzGVprvAhZkshyzsWGp7XQt1L0XY/WitFoikniJlmRo/MiVvQoFev7Uw1/5JW/W4IZi1OS000SgcF7rHfMO0unG3ZHFToG9GPpqg9YZ9E6S2X8ksJBUabQWottapzryXQsM43lpVEsJYSAMZGNU8NavDYqWwFd1zE/uIPJNVCQlwXKaFSIOi4TCUhTk184z/j8o4x2zqDKDJ2PcUFwztPbRAWdhNqD+Ehp7Rx939PUNVs729R1w2I5pzWGO+JSz3HAK8uAhw+D0x/wDiwe/RrtzhXMYpfJl3+Clw5HXOgVJs/pupa8iKpUnbN0dUPTtOwdHlGUJdPJhDLtIvV0i8mpU/FNU5fr7PKYafDY1Yo7b7zB1oVzfO3xCS+e2aLzAbWqqYD9gwNefuklPvWpT0XaYa1Bs6m6cUnBC6DtO5aLFdPphNn2NkqrRH0QX4rY5BVCwLkeQmLNlNihCmxCQYRIkRx8SuB6j256QtsQuhF6TbMcIvumJy6EWsenDu8jh0/f9TTLFbZeEnCoqkIXBu8cvu/pktMvqzFlVSZOs7u7am8ty/076L4nr3K8DqhcgXiKTJPZqCtQzGbk4wmjc+fx+RQRRYsgOorTaJ0I0yTmGfBhc33zw0OUUowmE0xRcrRcMu9bjsRvWrGCcvflnhtwfzE4/QHvQMhauu3rdNPb7Os/wEt2zgWzS9M7+t7z5pUb3LhxE3zPajEnBM/u1owLj1xAh8DKHcbE7XRC0JG+oKsXdHUNOPKipK9XjHe2ufC7nqJvbtCSdGX7nixAYTRvvvY6H/vYx5md2k6qT4Ik3x/E4XtiorJZYdsVS9dTb0+pZlusg+2CbMIqpDi/8z4V3KwpFdZUAwFR0Hct3naEUGCU5uwsSjJKsCnkIwTvoo5tF58IVF7gkzata1e0iyXdqiYEh85NCv14XN/SrWqcc2RlEbubdRL5DamXwDna+SH94pAyz8nznCYEMpOjPeRKyBU8fm6Xs09dxjvN27/5G6gsp6xG6KzCSQZZjqoqzGhKPp6Qj0eE5PCbuibXhunulK63eF+TmZzbqwPmyuElJJppzYCHD4PTH/DuCLCyPc/R8Lv7ltX+EfUy0gt4WzMpc87s7nLhwiOcOX0Ka3uWiwWz2RY6j6Ikru1pupZcKYqyinKBInTe0qzmzJqW398EXiw9ToSytZTGMK4qXPBcu36N0WxKlmexrj6ZJiGA8pvdqwZs23DtrbeYnWmpJlOKqiTLJZKyHbsoH3xM4KaKG592/uFuXjY68FSvL8QSzzWZmydgrcN2HYiiDzVYi/eWtmnomxW2bhDvyYuScjIhqyqavmO1WuGtpSxLxrMpeVVEpax1DiCA7Vqag320DqjcgNYxNITCh3it5yclP/gD38/k7AWWt26jfHu3c1iEoizQZYXOc6SIbJ93bt3i4MYNDm/fom87Jrun2Dq1y2g6Yzyb0oviRr2HS08cQQK2WHzgt9mA+4/B6Q94DwRs8Lzmal46vMVob0nbtJRKsXvuPGdPn2JnexutFYdHR0xGI7a3t6NyldG4pNU6KmOJYix39HjnKGUHWxQEgY8vDzjfO65qjel6pkXJbDRmPJ5wdHjE4mjO1qkdtI519UiU9/YelIpi6pnJ6J1jdXhEU7dMZltMtreotrYZT6dpNx0d/LqpynsfK2ySw4472/gUEHVtN0GOmJB1fiMy7pzF9ZEq2lmLaxuc62mblmA7jAijyYRiNEaXFV6EtjnC9j1ZllFNJuRliTZxcYwc95GiYX5wQG87irKM86ZVpI1O/DnjPOeTn/wetvKcelmjZluMspy8HKGqEXlRkRcVknINQQTrA9PJhALPyGgO9vZoFwv26obldEkYjVn1PTd8S4glSHjdYcv5g7r5BnyAGJz+gPeED3CE4w1f8ymTcWp3wmw6ZjweMR6NcC7quE63dpjNJmitsT5Qak0InqIsY4JXAo5YJkgIqKwgUxqV5Xwiz/nM3g3+sZ0z6j2TsmJrOmMyHqOBg9u3GY9HmPE4araGgAqRgsdnGXleYNdJXuvoljUHbceqXjJuGoxRlKNRat7yrNtsvbP0fR/DOc6ijSHXClyM5wfn31G1GCQ2fMVYf6rKSRw+4hzO9jE8pTTj0ZhiOsHkJWIybNviuh6tFJPxhCKv0DoHZRLBWyz5bFcruqND8jzHmBxtMjwe26zo6poM4dyZXS48cgFMFIHJ8hLKAskyQNF7wHmCbeNCYbJN81g+mXF2a4etixdZzVcxES6Kt2/vc3XvNjdnNRaPF8fV7/si7fTmA7nvBnyw+B2dvoh8AfgJ4GYI4XvT2CngV4BLwOvAT4YQ7kgMlP6PwI8DK+BPhBC+kn7nc8BfSG/710IIv/DdvZQB31VIgLyjF3hReT41mXJqaweUsOodrmk4M5tSFAZlNE3bpvC5ZjwdIaLpvaVbdbjgUUaRZ1GXNop/eFCGU6fO8tOTU/i3XuR5FxiPRowmU4qiIDcZfd2wmi8wRaR2iGyVsVkqzwvMznZ03m1LXpbUi+WmZr9eLKgXc8qySDvq2GjlnCPYHu8SB793tHWH07GbNoSw2dVvpoN1YU8SSZeQxFdiF7BPi1w1GpONR6i8AKXxPmoOBOcpqyru8DODXitSJW6frqtZ3LmNCp4sz8myqJnb9z22aWnrOoaglFDtnCHbOovJK8QoLLFqCOvp+562W+ITm6cpK8bTGavlktb2qKRfMNreIoRA3XS0fYcelxywxPtAEEezfYWNtuKAhwrfzk7/7wN/G/jFY2OfB/5FCOHnROTz6fs/B/wY8FR6/SDwd4EfTIvEXwKeJf7X/IaIfDGEcOe7dSEDvstQHnv2CubmRW6OAy9ePdiIkwfnObd7ivO7OwQROtvjvGCMRvAc3NwjzzOyIo+c8CYuDILgAzgf6N26YzXGqX//9DT7QVFWFaNRRZ7lZCZDK8VqPierSkZmiyzLMEojyqEzQ/A5xjvyqqKaOCbb2/RdR297QAg+lkmaLEMRqZRt30UmziQbCLHD1zsQe7diZd1pu/k+lVRqUWTaYJ2L4i0S7S7KirwaI0WkYwhB8N5S1yuUEvIk/BIbxBJfvw8EZ2kPbuFWcybj2cbhBwJd09A1NW2zAiJtc1svcfmSTBRe5ZRFidEaCVAQ4/EigveOruvp+g5tDJOyoLMxDLXsV/S9pfeeXGdYHEfEclMf3rngDXi48Ds6/RDCr4nIpW8a/izwB9LxLwD/kuj0Pwv8YojkJL8uItsiciGd+6UQwj6AiHwJ+AzwS9/xFQz4wNB+/OsgcHj7LK/feYLZnX3EOsZlybJesX94hBKoRgVZZjDeMR2PGVcTyqJAZZqghCASmStTtlIrhR6N7yZHg+fxPOMT27tI00bHnhYKbQy+76mP5gStqcYjtMlROhKywTECNB+fIILztE2DtRYfoF6uKMqCtl7Qt208Z8O2GTbfe+cibw7R4ft1PX/CmoQtBCI7ZwClDVmWUVYVJi/RebEpkXQ+0DQ1XdtQZlHgnRTO8SFqc3nnaRdz6oNDyrwgr2IsH6WiwEvTYNuGdrUiBEdRZCxuXidvLXq8g5luke1ExtF1dVKb+Py75QLfO4qyZHZ6lzwfJQbTgmbZsFwdcHPvNsrkLBSsUg+E34TBBjyMeL8x/XMhhGvp+DpwLh1fBN46dt7baey9xv89iMjPAD8DwOPv07oB3zkE3OnrrHav019/nLdfu8T3tSXhcBGdcpbz9s1bjMuSWd9TVQWz2RRlDE48ne+RPlIaqESDfJyl0oeQGpEEEcOoHPPUk0/xwte+hlKycfySdF37pkGvajSQ5S6yY+q4qGgdj1Eq1t6bSK1glyt82zJfLZkjKIm8PFHzN7FMJqevlMKmGDdigCgyvmnkSnoCrJudRMhTSaXOY9jKmNQIlnICru+plwsgRMWsdD1rhBDo2obl/h1UUGSjCShDrC+KOr+ut9jO0tR16vINVLNtZo88SqhmqetYEyLXc+Qsmm1R5gV1XtDMjxgB70oAABN3SURBVOi7jvn+Hp5A5xyrVY23URRnPBpz52jBzdzSEzV3PT4mdAc8lPiOE7khhCDy3btDQgg/D/w8gDw73HkPHAJuPOdwZDmsci7JNpPJhN5aMqUxJgPRiDLY3tE0LXiPyzKyLDkkUn18YrZUIpuYdggxzCFoLj72GM//1lcJoSczQpZFfhx8IFhHv1oRVOSziXHwDuejfm5RxI5VkrCJ63sWR4f4tsO7qAObGUOe5wSVJA/TJSqlUUqRZRl910UbtYo7ce8juY6s9/wSK/uVQussNYNFfn8vKj1pOLy1dF1D33Ux92AMSuuNOHm0v6G+cwe3WjHbjlw8a26gEGJyODhL19bYrmdaFnz8ez9JdfZROpWD9WQ6ZRlSQ5n3HtEaVRRMz51leuYMEqJGwKqp6VY1AL2zLOuGtuvIcs1Ve4hXcafvTIMrh3LNhxXv1+nfEJELIYRrKXyzTvNfAR47dt6jaewKd8NB6/F/+T7/9oD7jFCuODp/hTePnuZpqeisxSDkRY5J4uTOejrVk3UKc0weUFRAvI96t9+sPLWhd4k7/q3tbabTCV3XoMRjVOSrJ+3IXdchfY6V2DTU1DVNvYzC6UBuTIyZi2Btj+0t3rYIgcxkKF8QMoNWWcwxhIB1HqV0vA4Cro8x+rVCogiJviZWwscwlcRzNk8wsePYOxd5+Z3D9R3WdpRlSZ6lv3dMzMVaS72c0yyPKMuMfFTFChyJu3bvYgOYd45mVeOd5/LHPs65T3wvjGaR/mHdfKYSVXQKKwXvcd7jUkOaiNBby3y5woWA1pqs0GjroOuRzHDNdRsm0266hzfd/bi1BjwAvF+n/0Xgc8DPpa//5Nj4nxGRXyYmcg/TwvBPgb8uIjvpvB8F/vz7N3vA/UQwHW77Fm/MzvHWkWOn12xPJtjgaTuLt57gA6IE21tc7jYdsCaPzsh7jzhHUCqKjqwXhbTrRYTc5DzyyEVuv/kqYdtiigKt4o7b+oALFr+qweQUVRUrbWxP37QxYelc3IUHH8szgRAs4Om1oRiNQAcqM0lPBHrDfhATrwHnQuLRSXX9hFjJFO6GuSWVQCp915H7lE/ouw5vLc72CJ6qrFL4STarnHMuqmstlijvGG1vRcpjEwnhJMQnI2d7vOtZrRZURcHlT/5uKCegNDbt7EVrVFCR9ycaFxPQa5bQNcX0cknXtpGzSAK99TTp+4UO3A42cqwphyuX76CFGPBw4dsp2fwl4i79tIi8TazC+TngH4nInwLeAH4ynf5/Ess1XyaWbP5JgBDCvoj8VeDL6by/sk7qDvgQQALzH/rnPP/9/x+nv/gj/MhvP4vz0HYWHUBlBusEbzXOaoL16CKWV/bO4gEVjouDR2ySqUQ6BJHAk5cv4e/coq+XMK5AIr+8QhO8xfUtfVsz255RVDtoE8nU6qNDrG1jMtdZvLVJ2SrF70PAty1tiBUz1WyKKSsgauNqreNiYXuUBByRVhmJ/k8SqVoM7Qg6yxFlIvlbCqtYa3G2w3U9wTmUBm97jE6hrHVzV9/RzQ/x9ZIiz8iK7NhTQJoN75Ngu6Wrax69/CTFztko8mJd6iSOZaTrbmWj1EbkZZOsTmGwvu83yWrnPa2LlMsmCNdswyJx7vi85egTXybogWztYcW3U73z0+/xoz/0LucG4E+/x/t8AfjCPVk34GQgErzjqiW3tgLOSOShUZrYC+Rx3mG9SwnIWCPugttQKMh6t3/M8YsIYUOuEN3/aLrF+ctPcnTjJrbt0SaPTl9UTHAGR1uv6Nqa0WzG9NQOohVGCbUW6sUK5T3KmJg7yDQCaFEE5+m7HkfMDawF1vuuRyGREiGEFNZJIRwJ68tPZgreSxQiIZF2eh939+sa/zXTZh87kEUpjGRx0XCOdrWgX83R3lOWJUEkkbzFyfaJ50cpiR2/1vH4078LyUvQGqOzGFZaM4KmD2kd2lljvRC1bRvr/fseay2I0HY25jmyjNfbA9p0gf34gHb3+l1OigEPHYaO3AH3hNul50bmmHiHQWGtxYjZdJU2TYNRilIV4GO1yfHqv+O70JjUVGs+NAKgTMbk1Bm0yVncuImxbtOUpYiLhO07VvMjsrJElwXT7RllkbOajqmPltjVCryNi4VJYZi0wPSJGM12PbbrUcYQnKNerciLbOPwlcg7HF8M60vU090490g14dbv2Xd424NzUdYxOJyD1WpJ7gq0GFzf0awWeNtTVCOyqopNXCEgfs3wn3IZomhWNdvTGacffRSnYv7AAzoALlEmpCcmt7aTu2Gdtm3pui4+OUBiBTX0fY0SaCTwhq1BgS9qVo+/gM+aD/YmGvBAMTj9AfeExWTB1yrHubkl85GD3kHkvmkaNCW2iKECdSzevZYhXIccTEq4xhJBNlKDojT5aALa0C1XMambKUQ8sadWkSH0iyV22qKyHKUz8pHGFBXVbAvbtNi2jXH5RMO8WWBC5M6xTRMpiLMMnTuWi+iIyyJnrXsL4NOzSIC06IAPgg+xvNE5t9mNe9vj+jZSNQQgEcwF77F9hw0drmuxbUOe54xnW6i8jKcmSgtC5MCX4Ajesjw64vylS6jRGK81HoWWu6yhkp5G1updLtXYrznz1w5f68SYKZreerwLZFnGDdtyVTqEwPzyb3Hne/7fYZf/kGNw+gPuCXbnNm8WnjdXlpFVlEVO2/eE4NFFjvMe69zG0a8djtaxQibP803StO97lKzLPu8Gz7UxFGbMeHeX6y89T5FnOIkqUEo0QTnarmUxnzOrKrJUvaKVQrQiMwab55vkKhDr/YkEZIVSMBlHCoWkgCUi1EdHOOfv8s8nigQXUuhFEXfgKW9gbU+fOpR9ImVbLxZKK4yJsXpFDNP0tsd3bayPn26RF2VqworvF1xP8JbgLDhHc3iIrZec+75nQecgOgrQE3sT1iyh66eskDrHQkoWO+femSwnNpUdHB1snmjesA0LlRrRlBuoFz4CGJz+gG8fEhN9ddHx9VI4f9hR6YxsQysQQw1d17JcBrI8I8tiDX2WZZvdpnMOrU2salF6s7FOtPnRcSvFdGeH68Hh2hayCvCgo+g6zrGcz8knkxi7T41PShSYSD4W1h2//u7XTT7BZGTaRD58oxm5Ebaucd7inI3CKIBzAWd7VAh4pdFo+kRt4ENk6lyXVwKYLNXiK4UxehPvt02D7TuUEqpRRV6UsTGs6+Lv9i3BdZHmwvbgLYtbNxiPK0azbew6cJPCOd7ZTeNazFlEFTOfnL219h05lHVIqu9jUlelTum3XIMbHP1HCoPTH3BPcKevE8YrrnUFL817Rm3D6clkkzRsvIMQ9WazLE/O3mB7j7Ox8SnPc4IRQvAoCWhtUDpJ9IV17FnIqxGT6ZR+uaTcyvABxAfEGDJjaHvL6s4dFMT4uMk3ISW0vsuCuZZWvFtzue6tTfw3HlRy2KKIrPkh9h8Yg/dCe3REbhT4QF0vY0jGZEkaMS4ARke7dJaBkrsOuGlwzQoVUmdulmFdR2gjL7+3Ha5tUDbWxouCrmlYHuxz/olL9CZSLGuRWFGUcHxBQ2Ivg8SVKlb+4AkhLrLeObxSHM6PCInr32lhjz4tuGEo0/yIYHD6A+4Jvlxx+CO/Sn39cZ7/Vz/MI1c1s1QRgrPoPCMQ+WhEhHrV0qiWPMuieLoym67UjXpV4rTxzuOcTxGSGK/ePn+Bw9dfRSdBk1idEjA6ctnbpmE1P4rvUXqMyVPSNmyERZToKJguKvYTCJEWOpAWBlDKRDF1fIr7e2wIcOosq9ZjFw0ZXeIP8sTss8N7BwjGFGR5hsmLuKA4h+tbmtUKW9fQtiiBPM9wXUu3XNB3HRJiWWZwFi0SG7mUMK9XKAvTU+dxPqB8pJbYdAknrOdwvbt3Xb+pHoqTGks/lQh97+iankxn5FnOTd9zS2JpZqxQkvioFTknBjykGJx+C+o1hZoq/FmPN3644d8LAarnn6V882mUM9wpcl6YBM7UDbtlBaIwWY7WGUeHc7JMM51OqfKSPMsx2qSwSUyPhiAxRKFkQ2wW4/8x6RoCqLyg3J7R1T0my4G4vmhRZEbTuZ52Pkd8wFtLlhdkebEJfWzi8ykMIhv5Ld6x81c6qmPZFLaxbcPKeuZmgSoqqjyLFUEhdhevE6aIYPKMIi/IshzRQtt22K6jr+d0yyWh7xHrCECzmNOuFrGOXyAzMT0cRMiKgrws6foO17aMpjNkvI3K8thpTEgLWuReEFk/Tfj4BJRYQ/0mrxJ/FkM7sJovEQmMxxV5kXFrtYiauIliYvLWMyifsfc9v4at5sP/wUOKj7zTN1/SbP+XWzzx9Mc5/IOBV/+br+DLQRD6vZDtnSe/dhmC4Ai8NoNnGs9WgNJkNG1P0zTMxhWjrEQrFamQQ+zW9d6jtMIbjzYjRKm4g00OVNJuViTggyAmMlh2zSLGxLMMkRg+UWhUojyoF0dYbymqEda6GEbRCp/Uo6LsIZukZmzYYpME7fqGo6MDsFFHtu1afGfpD99k+sg5xoVG2QycBR3fz/lYhaTLClVkBCX4rqfvGurlEr9age2RxNtPANt0KBUbqfI8RyWlKslyqtEEpTWruqFrWnbPPoJVBgOId3FufMC7mKgNPu7kQ6JWKIzBG4V1DuldDCHhcD5SRzddx2g0ohgXOODL7QErXApmBbLVNjuvPMv45pO8/of/F3xRP+C7bcAHAdnsdk4gRGQOfONB23EPOA3cftBG3AM+TPZ+mGyFD5e9HyZbYbD328ETIYQz7/aDk77T/0YI4dkHbcS3CxH5t4O9Hww+TLbCh8veD5OtMNj7nUL9zqcMGDBgwICHBYPTHzBgwICPEE660//5B23APWKw94PDh8lW+HDZ+2GyFQZ7vyOc6ETugAEDBgz47uKk7/QHDBgwYMB3ESfW6YvIZ0TkGyLysoh8/gTY85iI/N8i8tsi8nUR+a/S+F8WkSsi8tX0+vFjv/Pnk/3fEJE/8gBsfl1Enkt2/ds0dkpEviQiL6WvO2lcROR/Svb+loh8+j7b+oljc/hVETkSkT97UuZXRL4gIjdF5GvHxu55LkXkc+n8l0Tkc/fZ3v9BRF5INv2qiGyn8UsiUh+b47937Hd+IN1DL6dr+q63bL2Hrff8ud8vn/Ee9v7KMVtfF5GvpvEHOrfvijU730l6ARp4BXgSyIHfBJ55wDZdAD6djqfAi8AzwF8G/tt3Of+ZZHcBXE7Xo++zza8Dp79p7L8HPp+OPw/8jXT848D/RezD/CHgXz/gz/868MRJmV/g9wGfBr72fucSOAW8mr7upOOd+2jvjwImHf+NY/ZeOn7eN73Pv0nXIOmafuw+2XpPn/v99BnvZu83/fxvAn/xJMztu71O6k7/9wAvhxBeDSF0wC8Dn32QBoUQroUQvpKO58DzwMVv8SufBX45hNCGEF4jSkj+ng/e0t8RnwV+IR3/AvAfHRv/xRDx68C2RNH7B4E/BLwSQnjjW5xzX+c3hPBrwDdLfN7rXP4R4EshhP0Qwh3gS8Bn7pe9IYR/FqJoMMCvA49+q/dINs9CCL8eopf6Re5e4wdq67fAe33u981nfCt70279J4Ff+lbvcb/m9t1wUp3+ReCtY9+/zbd2sPcVInIJ+BTwr9PQn0mPzF+Qu+LvJ+EaAvDPROQ3RORn0ti5EMK1dHwdOJeOT4K9a/wU7/ynOanze69zeRJsXuM/J+4u17gsIv9ORP4fEfnhNHaRaOMa99vee/ncT8rc/jBwI4Tw0rGxEzW3J9Xpn1iIyAT4x8CfDSEcAX8X+Bjw/cA14qPdScHvDSF8Gvgx4E+LyO87/sO0wzhR5VsikgN/FPjf09BJnt8NTuJcvhdE5GcBC/yDNHQNeDyE8Cngvwb+oYjMHpR9CR+Kz/1d8NO8c8Ny4ub2pDr9K8Bjx75/NI09UIhIRnT4/yCE8H8AhBBuhBBcCMED/zN3QwwP/BpCCFfS15vArybbbqzDNunrzXT6A7c34ceAr4QQbsDJnl/ufS4fuM0i8ieAnwD+WFqoSKGSvXT8G8TY+NPJtuMhoPtm7/v43E/C3BrgPwF+ZT12Euf2pDr9LwNPicjltPP7KeCLD9KgFKv7X4HnQwh/69j48bj3fwysM/pfBH5KRAoRuQw8RUzc3C97xyIyXR8Tk3hfS3atq0Y+B/yTY/b+8VR58kPA4bHQxf3EO3ZKJ3V+j9lwL3P5T4EfFZGdFK740TR2XyAinwH+O+CPhhBWx8bPiIhOx08S5/LVZPORiPxQuv//+LFr/KBtvdfP/ST4jD8MvBBC2IRtTuLcfuCZ4vf7IlZAvEhcGX/2BNjze4mP778FfDW9fhz434Dn0vgXgQvHfudnk/3f4D5l5o/97SeJFQy/CXx9PYfALvAvgJeAfw6cSuMC/J1k73PAsw9gjsfAHrB1bOxEzC9xIboG9MT46596P3NJjKW/nF5/8j7b+zIx7r2+f/9eOvc/TffIV4GvAP/hsfd5luhwXwH+Nqmh8z7Yes+f+/3yGe9mbxr/+8B/8U3nPtC5fbfX0JE7YMCAAR8hnNTwzoABAwYM+AAwOP0BAwYM+AhhcPoDBgwY8BHC4PQHDBgw4COEwekPGDBgwEcIg9MfMGDAgI8QBqc/YMCAAR8hDE5/wIABAz5C+P8BKxLKRtac6Z4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WcDmpFSP7gbs"
},
"source": [
"# Download processed movie file"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"id": "0nuLiWQC0DDt",
"outputId": "f08900e8-85d9-467d-999c-aa459e69d1a4"
},
"source": [
"from google.colab import files\n",
"files.download(output_file)"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_bbd138d8-d551-441f-b882-bd4d9361dd49\", \"test2_masked.mp4\", 372375)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment