{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "First, we need to load the necessary libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:37.769341Z", "iopub.status.busy": "2026-02-23T20:14:37.769116Z", "iopub.status.idle": "2026-02-23T20:14:41.013344Z", "shell.execute_reply": "2026-02-23T20:14:41.011779Z" } }, "outputs": [], "source": [ "import pandas as pd # Used for data manipulation\n", "import numpy as np # Used for numerical operations\n", "import matplotlib.pyplot as plt # Used for plotting\n", "import spacy # Used for text preprocessing and NLP tasks\n", "from spacy import displacy # Used for visualizing NER results\n", "from wordcloud import WordCloud # Used for creating word clouds" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also need to download the spaCy English model for NER. This only needs to be done once" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:41.016923Z", "iopub.status.busy": "2026-02-23T20:14:41.016537Z", "iopub.status.idle": "2026-02-23T20:14:41.020604Z", "shell.execute_reply": "2026-02-23T20:14:41.019368Z" } }, "outputs": [], "source": [ "#!python -m spacy download en_core_web_sm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we download a dataset of central bank speeches. We are using the dataset from [cbspeeches.com](https://cbspeeches.com/) [@Campiglio2025], which contains a collection of speeches by central bankers from around the world." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:41.023126Z", "iopub.status.busy": "2026-02-23T20:14:41.022912Z", "iopub.status.idle": "2026-02-23T20:14:41.027679Z", "shell.execute_reply": "2026-02-23T20:14:41.026805Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset already downloaded!\n" ] } ], "source": [ "import urllib.request\n", "import os.path\n", "\n", "# Create the data folder if it doesn't exist\n", "os.makedirs(\"data\", exist_ok=True)\n", "\n", "# Check if the file exists\n", "if not os.path.isfile(\"data/CBS_dataset_v1.0.dta\"):\n", "\n", " print(\"Downloading dataset...\")\n", "\n", " # Define the dataset to be downloaded\n", " fileurl = \"https://www.dropbox.com/scl/fi/la5hpz39yht8mmoz0n98t/CBS_dataset_v1.0.dta?rlkey=jo0u8ktm1ixkwic4jw03re9c6&dl=1\"\n", "\n", " # Define the filename to save the dataset\n", " filename = \"data/CBS_dataset_v1.0.dta\"\n", "\n", " # Download the dataset in the data folder\n", " urllib.request.urlretrieve(fileurl, filename)\n", "\n", " print(\"DONE!\")\n", "\n", "else:\n", "\n", " print(\"Dataset already downloaded!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we load the dataset into a pandas DataFrame" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:41.060339Z", "iopub.status.busy": "2026-02-23T20:14:41.060151Z", "iopub.status.idle": "2026-02-23T20:14:42.343840Z", "shell.execute_reply": "2026-02-23T20:14:42.342410Z" } }, "outputs": [], "source": [ "speeches = pd.read_stata(\"data/CBS_dataset_v1.0.dta\")\n", "speeches = speeches.set_index(\"index\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We first filter the dataset to only include ECB speeches" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:42.346672Z", "iopub.status.busy": "2026-02-23T20:14:42.346504Z", "iopub.status.idle": "2026-02-23T20:14:42.366330Z", "shell.execute_reply": "2026-02-23T20:14:42.365471Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
URLPDFTitleSubtitleDateAuthornameRoleGenderCentralBankCountrytexttext_originalFilenameLanguageSource
index
2976https://www.ecb.europa.eu/press/key/date/2000/...One year with the euroSpeech delivered by Dr Sirkka Hmlinen, Mem...2000-01-08Sirkka HmlinenBoard memberFemaleEuropean Central BankECBOne year with the euro Speech delivered by Dr ...ecb_000108.enEnglishCB websites
2977https://www.ecb.europa.eu/press/key/date/2000/...Opening Remarks at a Hearing of the Committee ...Professor Otmar Issing, Member of the Board o...2000-01-10Otmar IssingBoard memberMaleEuropean Central BankECBOpening Remarks at a Hearing of the Committee ...ecb_000110.enEnglishCB websites
2978https://www.ecb.europa.eu/press/key/date/2000/...The international impact of the euroSpeech delivered by Christian Noyer, Vice...2000-01-13Christian NoyerDeputy GovernorMaleEuropean Central BankECBThe international impact of the euro Speech de...ecb_000113.enEnglishBIS
2979https://www.ecb.europa.eu/press/key/date/2000/...The role of the central bank in encouraging an...Speech given by Christian Noyer, Vice-Pres...2000-01-21Christian NoyerDeputy GovernorMaleEuropean Central BankECBThe role of the central bank in encouraging an...ecb_000121.enEnglishBIS
2980https://www.ecb.europa.eu/press/key/date/2000/...The euro area - first experience and perspectivesby Professor Otmar Issing, Member of the Boar...2000-01-26Otmar IssingBoard memberMaleEuropean Central BankECBThe euro area - first experience and perspecti...ecb_000126.enEnglishCB websites
\n", "
" ], "text/plain": [ " URL PDF \\\n", "index \n", "2976 https://www.ecb.europa.eu/press/key/date/2000/... \n", "2977 https://www.ecb.europa.eu/press/key/date/2000/... \n", "2978 https://www.ecb.europa.eu/press/key/date/2000/... \n", "2979 https://www.ecb.europa.eu/press/key/date/2000/... \n", "2980 https://www.ecb.europa.eu/press/key/date/2000/... \n", "\n", " Title \\\n", "index \n", "2976 One year with the euro \n", "2977 Opening Remarks at a Hearing of the Committee ... \n", "2978 The international impact of the euro \n", "2979 The role of the central bank in encouraging an... \n", "2980 The euro area - first experience and perspectives \n", "\n", " Subtitle Date \\\n", "index \n", "2976 Speech delivered by Dr Sirkka Hmlinen, Mem... 2000-01-08 \n", "2977 Professor Otmar Issing, Member of the Board o... 2000-01-10 \n", "2978 Speech delivered by Christian Noyer, Vice... 2000-01-13 \n", "2979 Speech given by Christian Noyer, Vice-Pres... 2000-01-21 \n", "2980 by Professor Otmar Issing, Member of the Boar... 2000-01-26 \n", "\n", " Authorname Role Gender CentralBank \\\n", "index \n", "2976 Sirkka Hmlinen Board member Female European Central Bank \n", "2977 Otmar Issing Board member Male European Central Bank \n", "2978 Christian Noyer Deputy Governor Male European Central Bank \n", "2979 Christian Noyer Deputy Governor Male European Central Bank \n", "2980 Otmar Issing Board member Male European Central Bank \n", "\n", " Country text \\\n", "index \n", "2976 ECB One year with the euro Speech delivered by Dr ... \n", "2977 ECB Opening Remarks at a Hearing of the Committee ... \n", "2978 ECB The international impact of the euro Speech de... \n", "2979 ECB The role of the central bank in encouraging an... \n", "2980 ECB The euro area - first experience and perspecti... \n", "\n", " text_original Filename Language Source \n", "index \n", "2976 ecb_000108.en English CB websites \n", "2977 ecb_000110.en English CB websites \n", "2978 ecb_000113.en English BIS \n", "2979 ecb_000121.en English BIS \n", "2980 ecb_000126.en English CB websites " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ecb_speeches = speeches.query(\"CentralBank == 'European Central Bank'\").copy()\n", "ecb_speeches.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have explored the dataset in the previous section, so we will skip that part here and go directly to using the dataset for NER. We will use the `en_core_web_sm` model from spaCy, which is a small English model that is suitable for NER tasks.\n", "\n", "\n", "### Named Entity Recognition (NER) with spaCy\n", "\n", "To perform NER, we first need to load the spaCy English model" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:42.368493Z", "iopub.status.busy": "2026-02-23T20:14:42.368298Z", "iopub.status.idle": "2026-02-23T20:14:42.757506Z", "shell.execute_reply": "2026-02-23T20:14:42.756039Z" } }, "outputs": [], "source": [ "# Load the spaCy English model\n", "nlp = spacy.load(\"en_core_web_sm\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we can take the text of a speech and process it using spaCy" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:42.760220Z", "iopub.status.busy": "2026-02-23T20:14:42.760058Z", "iopub.status.idle": "2026-02-23T20:14:43.424800Z", "shell.execute_reply": "2026-02-23T20:14:43.423951Z" } }, "outputs": [], "source": [ "# Get the text of the first speech\n", "text = ecb_speeches.iloc[0][\"text\"]\n", "\n", "# Process the text using spaCy\n", "doc = nlp(text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The named entities are stored in the `ents` attribute of the processed document. We can extract the text and the label of each entity and print them out" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:43.426872Z", "iopub.status.busy": "2026-02-23T20:14:43.426692Z", "iopub.status.idle": "2026-02-23T20:14:43.431244Z", "shell.execute_reply": "2026-02-23T20:14:43.430414Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('One year', 'DATE')\n", "('Speech', 'ORG')\n", "('Sirkka Hamalainen', 'PERSON')\n", "('the Executive Board', 'ORG')\n", "('the European Central Bank', 'ORG')\n", "('Europaisches Wochenende Berlin', 'PERSON')\n", "('2000', 'DATE')\n", "('Berlin', 'GPE')\n", "('8 January 2000', 'DATE')\n", "('First', 'ORDINAL')\n" ] } ], "source": [ "entities = [(ent.text, ent.label_) for ent in doc.ents]\n", "\n", "for entity in entities[:10]:\n", " print(entity)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or we can visualize the named entities using displaCy" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:43.433689Z", "iopub.status.busy": "2026-02-23T20:14:43.433532Z", "iopub.status.idle": "2026-02-23T20:14:43.440809Z", "shell.execute_reply": "2026-02-23T20:14:43.440004Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " One year\n", " DATE\n", "\n", " with the euro \n", "\n", " Speech\n", " ORG\n", "\n", " delivered by Dr \n", "\n", " Sirkka Hamalainen\n", " PERSON\n", "\n", ", Member of \n", "\n", " the Executive Board\n", " ORG\n", "\n", " of \n", "\n", " the European Central Bank\n", " ORG\n", "\n", ", \n", "\n", " Europaisches Wochenende Berlin\n", " PERSON\n", "\n", " \n", "\n", " 2000\n", " DATE\n", "\n", ", \n", "\n", " Berlin\n", " GPE\n", "\n", ", \n", "\n", " 8 January 2000\n", " DATE\n", "\n", " \n", "\n", " First\n", " ORDINAL\n", "\n", " of all, I should like to say how glad I am to have this opportunity of speaking in \n", "\n", " Berlin\n", " GPE\n", "\n", ", a dynamic and rapidly developing metropolis which, in many ways, symbolises the spirit of \n", "\n", " European\n", " NORP\n", "\n", " integration and our hopes for the new \n", "\n", " Millennium\n", " PRODUCT\n", "\n", ". \n", "\n", " Today\n", " DATE\n", "\n", " is \n", "\n", " the eighth day\n", " DATE\n", "\n", " of the new \n", "\n", " Millennium\n", " PRODUCT\n", "\n", " and I think it is natural to look ahead,
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "displacy.render(doc[:100], style=\"ent\", jupyter=True) # We only visualize the first 100 tokens to avoid rendering the entire speech" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The named entities are not perfect. Sometimes, the model may miss some entities or misclassify them. However, it can still give us a good sense of the key players and topics that are mentioned in the speech. There are also more advanced models that can provide better results, such as the `en_core_web_trf` model, which is based on transformer architectures. However, it is also much slower to run, so we will stick with the smaller model for now.\n", "\n", "Here is an overview of the different entity labels that spaCy can recognize:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:43.442857Z", "iopub.status.busy": "2026-02-23T20:14:43.442677Z", "iopub.status.idle": "2026-02-23T20:14:43.445657Z", "shell.execute_reply": "2026-02-23T20:14:43.444845Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available entity types: ('CARDINAL', 'DATE', 'EVENT', 'FAC', 'GPE', 'LANGUAGE', 'LAW', 'LOC', 'MONEY', 'NORP', 'ORDINAL', 'ORG', 'PERCENT', 'PERSON', 'PRODUCT', 'QUANTITY', 'TIME', 'WORK_OF_ART')\n" ] } ], "source": [ "print(\"Available entity types:\", nlp.get_pipe(\"ner\").labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's extract the named entities for all the speeches in the dataset and store them in a new column in the DataFrame" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:43.447628Z", "iopub.status.busy": "2026-02-23T20:14:43.447457Z", "iopub.status.idle": "2026-02-23T20:14:43.451307Z", "shell.execute_reply": "2026-02-23T20:14:43.450147Z" } }, "outputs": [], "source": [ "def extract_entities(texts):\n", "\n", " # Convert the numpy array of texts to a list of strings\n", " text_list = texts.tolist()\n", "\n", " # Process each text using spaCy\n", " docs = nlp.pipe(text_list, disable=[\"tok2vec\", \"tagger\", \"parser\", \"attribute_ruler\", \"lemmatizer\"]) # We disable the components that we don't need to speed up the processing\n", "\n", " entities_list = []\n", "\n", " for doc in docs:\n", " entities_list.append([(ent.text, ent.label_) for ent in doc.ents])\n", "\n", " return pd.Series(entities_list, index=texts.index)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will focus on the first 100 speeches to speed up the processing, as NER can be computationally intensive, especially for longer texts. We can always process more speeches later if needed." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:14:43.453595Z", "iopub.status.busy": "2026-02-23T20:14:43.453408Z", "iopub.status.idle": "2026-02-23T20:15:26.789075Z", "shell.execute_reply": "2026-02-23T20:15:26.788073Z" } }, "outputs": [], "source": [ "entities_lists = extract_entities(ecb_speeches[\"text\"].head(100)) # We only process the first 100 speeches to speed up the processing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Suppose we want to analyze which organizations are most frequently mentioned in the ECB speeches. We can extract all the entities that are labeled as \"ORG\" and count their frequencies" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:15:26.791377Z", "iopub.status.busy": "2026-02-23T20:15:26.791202Z", "iopub.status.idle": "2026-02-23T20:15:26.967177Z", "shell.execute_reply": "2026-02-23T20:15:26.966038Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAKDCAYAAADrbVuKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbAFJREFUeJzt3XlcjWnjP/DPOaUULUSqEUpZIiNbgxm7mrHEmGfse8YMBmVpeEy2IcvYxwyDiDGW4cvYhrJm0liiZClajEJphFLaz/37o5/zzFFRpPtc9Xm/Xr2+z7nvG5/zHepzrvu6r0shSZIEIiIiIsEo5Q5ARERE9CZYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQtKVO8C7olKp8ODBAxgZGUGhUMgdh4iIiIpBkiQ8e/YMVlZWUCpfPdZSbkvMgwcPYG1tLXcMIiIiegPx8fGoXbv2K68ptyXGyMgIQP7/E4yNjWVOQ0RERMWRmpoKa2tr9c/xVym3JebFLSRjY2OWGCIiIsEUZyoIJ/YSERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIZW4xJw9exa9e/eGlZUVFAoFfv/9d43zkiRh7ty5sLKygoGBATp16oQbN25oXJOVlYWJEyeiRo0aqFKlCtzc3HDv3j2Na548eYJhw4bBxMQEJiYmGDZsGJ4+fVriN0hERETlU4lLTHp6Ot5//32sXbu20PNLly7FihUrsHbtWly6dAkWFhbo3r07nj17pr7Gw8MD+/fvx65duxAUFIS0tDT06tULeXl56msGDx6MsLAwHDt2DMeOHUNYWBiGDRv2Bm+RiIiIyiXpLQCQ9u/fr36tUqkkCwsLafHixepjmZmZkomJibR+/XpJkiTp6dOnUqVKlaRdu3apr7l//76kVCqlY8eOSZIkSTdv3pQASOfPn1df89dff0kApMjIyGJlS0lJkQBIKSkpb/MWiYiIqAyV5Od3qc6JuXPnDhITE+Hi4qI+pq+vj44dOyI4OBgAcPnyZeTk5GhcY2VlhaZNm6qv+euvv2BiYgJnZ2f1NR988AFMTEzU17wsKysLqampGl9ERERUfpVqiUlMTAQA1KpVS+N4rVq11OcSExOhp6eHatWqvfIac3PzAr+/ubm5+pqXLVq0SD1/xsTEBNbW1m/9foiIiEh7vZOnk17eeVKSpNfuRvnyNYVd/6rfZ+bMmUhJSVF/xcfHv0FyIiIiEkWplhgLCwsAKDBakpSUpB6dsbCwQHZ2Np48efLKax4+fFjg9//nn38KjPK8oK+vD2NjY40vIiIiKr90S/M3s7GxgYWFBY4fPw4nJycAQHZ2NgIDA7FkyRIAQMuWLVGpUiUcP34c/fv3BwAkJCTg+vXrWLp0KQCgbdu2SElJwcWLF9GmTRsAwIULF5CSkoJ27dqVZuQC6s048k5//78X93ynvz8REVFFUeISk5aWhujoaPXrO3fuICwsDNWrV0edOnXg4eEBHx8f2Nvbw97eHj4+PjA0NMTgwYMBACYmJnB3d8fUqVNhZmaG6tWrY9q0aXB0dES3bt0AAI0bN8bHH3+ML774Aj///DMAYOzYsejVqxcaNmxYGu+biIiIBFfiEhMSEoLOnTurX0+ZMgUAMGLECPj5+cHLywsZGRkYP348njx5AmdnZwQEBMDIyEj9a1auXAldXV30798fGRkZ6Nq1K/z8/KCjo6O+5tdff8WkSZPUTzG5ubkVuTYNERERVTwKSZIkuUO8C6mpqTAxMUFKSkqJ5sfwdhIREZF8SvLzm3snERERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhJSqZeY3NxcfPvtt7CxsYGBgQFsbW0xf/58qFQq9TWSJGHu3LmwsrKCgYEBOnXqhBs3bmj8PllZWZg4cSJq1KiBKlWqwM3NDffu3SvtuERERCSoUi8xS5Yswfr167F27VpERERg6dKl+P777/HDDz+or1m6dClWrFiBtWvX4tKlS7CwsED37t3x7Nkz9TUeHh7Yv38/du3ahaCgIKSlpaFXr17Iy8sr7chEREQkIN3S/g3/+usv9OnTBz179gQA1KtXDzt37kRISAiA/FGYVatWYdasWejXrx8AYOvWrahVqxZ27NiBL7/8EikpKfD19cUvv/yCbt26AQC2b98Oa2trnDhxAq6urqUdm4iIiART6iMxH374IU6ePInbt28DAK5evYqgoCD06NEDAHDnzh0kJibCxcVF/Wv09fXRsWNHBAcHAwAuX76MnJwcjWusrKzQtGlT9TUvy8rKQmpqqsYXERERlV+lPhLzzTffICUlBY0aNYKOjg7y8vKwcOFCDBo0CACQmJgIAKhVq5bGr6tVqxbu3r2rvkZPTw/VqlUrcM2LX/+yRYsWYd68eaX9doiIiEhLlfpIzO7du7F9+3bs2LEDV65cwdatW7Fs2TJs3bpV4zqFQqHxWpKkAsde9qprZs6ciZSUFPVXfHz8270RIiIi0mqlPhIzffp0zJgxAwMHDgQAODo64u7du1i0aBFGjBgBCwsLAPmjLZaWlupfl5SUpB6dsbCwQHZ2Np48eaIxGpOUlIR27doV+ufq6+tDX1+/tN8OERERaalSH4l5/vw5lErN31ZHR0f9iLWNjQ0sLCxw/Phx9fns7GwEBgaqC0rLli1RqVIljWsSEhJw/fr1IksMERERVSylPhLTu3dvLFy4EHXq1EGTJk0QGhqKFStWYPTo0QDybyN5eHjAx8cH9vb2sLe3h4+PDwwNDTF48GAAgImJCdzd3TF16lSYmZmhevXqmDZtGhwdHdVPKxEREVHFVuol5ocffoC3tzfGjx+PpKQkWFlZ4csvv8Ts2bPV13h5eSEjIwPjx4/HkydP4OzsjICAABgZGamvWblyJXR1ddG/f39kZGSga9eu8PPzg46OTmlHJiIiIgEpJEmS5A7xLqSmpsLExAQpKSkwNjYu9q+rN+PIO0wF/L245zv9/YmIiERWkp/f3DuJiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZDeSYm5f/8+hg4dCjMzMxgaGqJ58+a4fPmy+rwkSZg7dy6srKxgYGCATp064caNGxq/R1ZWFiZOnIgaNWqgSpUqcHNzw717995FXCIiIhJQqZeYJ0+eoH379qhUqRKOHj2KmzdvYvny5TA1NVVfs3TpUqxYsQJr167FpUuXYGFhge7du+PZs2fqazw8PLB//37s2rULQUFBSEtLQ69evZCXl1fakYmIiEhACkmSpNL8DWfMmIFz587hzz//LPS8JEmwsrKCh4cHvvnmGwD5oy61atXCkiVL8OWXXyIlJQU1a9bEL7/8ggEDBgAAHjx4AGtra/zxxx9wdXV9bY7U1FSYmJggJSUFxsbGxc5fb8aRYl/7Jv5e3POd/v5EREQiK8nP71IfiTl48CBatWqFzz//HObm5nBycsLGjRvV5+/cuYPExES4uLioj+nr66Njx44IDg4GAFy+fBk5OTka11hZWaFp06bqa16WlZWF1NRUjS8iIiIqv0q9xMTGxmLdunWwt7eHv78/vvrqK0yaNAnbtm0DACQmJgIAatWqpfHratWqpT6XmJgIPT09VKtWrchrXrZo0SKYmJiov6ytrUv7rREREZEWKfUSo1Kp0KJFC/j4+MDJyQlffvklvvjiC6xbt07jOoVCofFakqQCx172qmtmzpyJlJQU9Vd8fPzbvREiIiLSaqVeYiwtLeHg4KBxrHHjxoiLiwMAWFhYAECBEZWkpCT16IyFhQWys7Px5MmTIq95mb6+PoyNjTW+iIiIqPwq9RLTvn173Lp1S+PY7du3UbduXQCAjY0NLCwscPz4cfX57OxsBAYGol27dgCAli1bolKlShrXJCQk4Pr16+priIiIqGLTLe3f0NPTE+3atYOPjw/69++PixcvYsOGDdiwYQOA/NtIHh4e8PHxgb29Pezt7eHj4wNDQ0MMHjwYAGBiYgJ3d3dMnToVZmZmqF69OqZNmwZHR0d069attCMTERGRgEq9xLRu3Rr79+/HzJkzMX/+fNjY2GDVqlUYMmSI+hovLy9kZGRg/PjxePLkCZydnREQEAAjIyP1NStXroSuri769++PjIwMdO3aFX5+ftDR0SntyERERCSgUl8nRltwnRgiIiLxyLpODBEREVFZYIkhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISO+8xCxatAgKhQIeHh7qY5IkYe7cubCysoKBgQE6deqEGzduaPy6rKwsTJw4ETVq1ECVKlXg5uaGe/fuveu4REREJIh3WmIuXbqEDRs2oFmzZhrHly5dihUrVmDt2rW4dOkSLCws0L17dzx79kx9jYeHB/bv349du3YhKCgIaWlp6NWrF/Ly8t5lZCIiIhLEOysxaWlpGDJkCDZu3Ihq1aqpj0uShFWrVmHWrFno168fmjZtiq1bt+L58+fYsWMHACAlJQW+vr5Yvnw5unXrBicnJ2zfvh3Xrl3DiRMn3lVkIiIiEsg7KzETJkxAz5490a1bN43jd+7cQWJiIlxcXNTH9PX10bFjRwQHBwMALl++jJycHI1rrKys0LRpU/U1L8vKykJqaqrGFxEREZVfuu/iN921axeuXLmCS5cuFTiXmJgIAKhVq5bG8Vq1auHu3bvqa/T09DRGcF5c8+LXv2zRokWYN29eacQnIiIiAZT6SEx8fDwmT56M7du3o3LlykVep1AoNF5LklTg2Mtedc3MmTORkpKi/oqPjy95eCIiIhJGqZeYy5cvIykpCS1btoSuri50dXURGBiINWvWQFdXVz0C8/KISlJSkvqchYUFsrOz8eTJkyKveZm+vj6MjY01voiIiKj8KvUS07VrV1y7dg1hYWHqr1atWmHIkCEICwuDra0tLCwscPz4cfWvyc7ORmBgINq1awcAaNmyJSpVqqRxTUJCAq5fv66+hoiIiCq2Up8TY2RkhKZNm2ocq1KlCszMzNTHPTw84OPjA3t7e9jb28PHxweGhoYYPHgwAMDExATu7u6YOnUqzMzMUL16dUybNg2Ojo4FJgoTERFRxfROJva+jpeXFzIyMjB+/Hg8efIEzs7OCAgIgJGRkfqalStXQldXF/3790dGRga6du0KPz8/6OjoyBGZiIiItIxCkiRJ7hDvQmpqKkxMTJCSklKi+TH1Zhx5h6mAvxf3fKe/PxERkchK8vObeycRERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIh6codgEpfvRlH3vmf8ffinu/8zyAiInoVjsQQERGRkDgSQ1qLI0pERPQqHIkhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGVeolZtGgRWrduDSMjI5ibm6Nv3764deuWxjWSJGHu3LmwsrKCgYEBOnXqhBs3bmhck5WVhYkTJ6JGjRqoUqUK3NzccO/evdKOS0RERIIq9RITGBiICRMm4Pz58zh+/Dhyc3Ph4uKC9PR09TVLly7FihUrsHbtWly6dAkWFhbo3r07nj17pr7Gw8MD+/fvx65duxAUFIS0tDT06tULeXl5pR2ZiIiIBFTqeycdO3ZM4/WWLVtgbm6Oy5cvo0OHDpAkCatWrcKsWbPQr18/AMDWrVtRq1Yt7NixA19++SVSUlLg6+uLX375Bd26dQMAbN++HdbW1jhx4gRcXV1LOzYREREJ5p3PiUlJSQEAVK9eHQBw584dJCYmwsXFRX2Nvr4+OnbsiODgYADA5cuXkZOTo3GNlZUVmjZtqr7mZVlZWUhNTdX4IiIiovLrnZYYSZIwZcoUfPjhh2jatCkAIDExEQBQq1YtjWtr1aqlPpeYmAg9PT1Uq1atyGtetmjRIpiYmKi/rK2tS/vtEBERkRZ5pyXm66+/Rnh4OHbu3FngnEKh0HgtSVKBYy971TUzZ85ESkqK+is+Pv7NgxMREZHWe2clZuLEiTh48CBOnz6N2rVrq49bWFgAQIERlaSkJPXojIWFBbKzs/HkyZMir3mZvr4+jI2NNb6IiIio/Cr1EiNJEr7++mvs27cPp06dgo2NjcZ5GxsbWFhY4Pjx4+pj2dnZCAwMRLt27QAALVu2RKVKlTSuSUhIwPXr19XXEBERUcVW6k8nTZgwATt27MCBAwdgZGSkHnExMTGBgYEBFAoFPDw84OPjA3t7e9jb28PHxweGhoYYPHiw+lp3d3dMnToVZmZmqF69OqZNmwZHR0f100pERERUsZV6iVm3bh0AoFOnThrHt2zZgpEjRwIAvLy8kJGRgfHjx+PJkydwdnZGQEAAjIyM1NevXLkSurq66N+/PzIyMtC1a1f4+flBR0entCMTvTP1Zhx553/G34t7vvM/g4hIG5V6iZEk6bXXKBQKzJ07F3Pnzi3ymsqVK+OHH37ADz/8UIrpiOhNsIwRkTbi3klEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhJSqW87QESkrd719gncOoGobHEkhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiFx7yQiIoG86/2fAO4BReLgSAwREREJiSMxRERU5jiiRKWBIzFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQuLTSURERG+AT1jJjyWGiIioAhO5jPF2EhEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISCwxREREJCSWGCIiIhISSwwREREJiSWGiIiIhMQSQ0REREJiiSEiIiIhscQQERGRkFhiiIiISEgsMURERCQklhgiIiISEksMERERCYklhoiIiITEEkNERERCYokhIiIiIbHEEBERkZBYYoiIiEhILDFEREQkJJYYIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiFpfYn56aefYGNjg8qVK6Nly5b4888/5Y5EREREWkCrS8zu3bvh4eGBWbNmITQ0FB999BE++eQTxMXFyR2NiIiIZKbVJWbFihVwd3fHmDFj0LhxY6xatQrW1tZYt26d3NGIiIhIZrpyByhKdnY2Ll++jBkzZmgcd3FxQXBwcIHrs7KykJWVpX6dkpICAEhNTS3Rn6vKev4GaYuvpHnexLt+DwDfR3GVh/cA8H0UV3l4DwDfR3GVh/cAaN/7eHGtJEmvv1jSUvfv35cASOfOndM4vnDhQqlBgwYFrp8zZ44EgF/84he/+MUvfpWDr/j4+Nd2Ba0diXlBoVBovJYkqcAxAJg5cyamTJmifq1SqfD48WOYmZkVen1pSE1NhbW1NeLj42FsbPxO/oyyUB7eR3l4D0D5eB/l4T0AfB/apDy8B6B8vI+yeA+SJOHZs2ewsrJ67bVaW2Jq1KgBHR0dJCYmahxPSkpCrVq1Clyvr68PfX19jWOmpqbvMqKasbGxsH8h/608vI/y8B6A8vE+ysN7APg+tEl5eA9A+Xgf7/o9mJiYFOs6rZ3Yq6enh5YtW+L48eMax48fP4527drJlIqIiIi0hdaOxADAlClTMGzYMLRq1Qpt27bFhg0bEBcXh6+++kruaERERCQzrS4xAwYMQHJyMubPn4+EhAQ0bdoUf/zxB+rWrSt3NAD5t7DmzJlT4DaWaMrD+ygP7wEoH++jPLwHgO9Dm5SH9wCUj/ehbe9BIUnFeYaJiIiISLto7ZwYIiIioldhiSEiIiIhscQQERGRkFhiiIiISEgsMSSkkydPFnlu7dq1ZZiEygs/Pz88f/7u95AhotLDp5NISKampjh+/Dhat26tcXzVqlWYPXt2mWya9qZKkk30VT1FYmlpifT0dHz++edwd3cXdlHNvLw8+Pn54eTJk0hKSoJKpdI4f+rUKZmSVUwqlQrR0dGF/rfo0KGDTKle7/Hjx3j+/Dlq166tPnbjxg0sW7YM6enp6Nu3LwYPHixjwnxavU6MCLKzs5GdnY2qVavKHaVCWblyJXr06IHAwEA4ODgAAJYtW4bvvvsOR44ckTndq5mamr52P68Xe4Tl5eWVUSq6d+8ejhw5Aj8/P3Tu3Bk2NjYYNWoURowYAQsLC7njFdvkyZPh5+eHnj17omnTpu9s77iykJWVhdzcXFSpUkXuKG/k/PnzGDx4MO7evVtgR2Zt//c9YcIEWFpaYsWKFQDyt/z56KOPYGVlhfr162PkyJHIy8vDsGHDZM3JkZgS2LJlC65cuYIPPvgAQ4YMwcyZM7FixQrk5uaiS5cu2LVrF8zMzOSO+UqdO3cu9JuaiYkJGjZsiAkTJsDa2lqGZCW3bNkyrFq1CkFBQdi9ezd8fHxw9OhRrf8EHRgYWOxrO3bs+A6TlL7MzEyEh4cX+qnTzc1NplQll5SUhO3bt8PPzw+RkZH4+OOP4e7ujt69e0Op1O678DVq1MC2bdvQo0cPuaO8sUePHmHEiBEICAiASqWCs7Mztm/fDltbW7mjlUjz5s3RoEEDzJs3D5aWlgW+9xZ3fyA52NjYYMuWLejUqROA/O+369evR2RkJHR1dbFs2TLs3bsX58+flzUnS0wxLVy4EAsXLkS7du0QGhqK/v374/fff4eHhweUSiXWrFmDXr16Yd26dXJHfSVPT89Cjz99+hSXL19GbGwsgoKC0Lx587IN9oZmzpyJjRs3Ii8vD8eOHYOzs7PckSqsY8eOYfjw4Xj06FGBc9r+qbMwFy5cwObNm7F161ZYWlri6dOnMDU11fjGro2srKxw5swZNGjQQO4ob+yLL77AoUOHMGnSJFSuXBnr169H3bp1C+ylp+2qVKmCq1evws7OTu4oJWZgYIDIyEj1Cvk9evRAkyZN8P333wMAbt++jbZt2yI5OVnOmCwxxWVvb4/58+dj0KBBCAkJgbOzM3bv3o3//Oc/AICjR4/iq6++wt27d2VO+nYmTJiAO3fu4I8//pA7SgFr1qwp9PiyZcvQoUMHtGnTRn1s0qRJZRWrxMLDw9G0aVMolUqEh4e/8tpmzZqVUaq3Z2dnB1dXV8yePbvQneZF8PDhQ/zyyy/YsmULYmNj0bdvX7i7u6Nbt27IyMjAt99+i71792r1v/Ply5cjNjYWa9euFfZWUp06dbB+/Xr1aFJkZCSaNm2KjIwMVKpUSeZ0xdelSxd4eXnh448/ljtKidWqVQsBAQF4//33AeSP8P3888/47LPPAABRUVFwcnJCWlqanDFZYopLX18f0dHR6lst+vr6CA8PR8OGDQEA9+/fh42NDbKzs+WM+dbCw8Ph6uqKhIQEuaMUYGNjU6zrFAoFYmNj33GaN6dUKpGYmAhzc3MolUooFIoC98sB8UYvjI2NERoaivr168sd5Y307t0b/v7+aNCgAcaMGYPhw4ejevXqGtc8ePAAtWvXLnCrTJt8+umnOH36NKpXr44mTZoU+KG/b98+mZIVn66uLuLj42Fpaak+ZmhoiIiICK3ZO6849u/fj2+//RbTp0+Ho6Njgf8W2vwhpXfv3jA3N8fGjRuxb98+DBkyBImJiahWrRoA4MiRI5g2bRoiIiJkzcmJvcWUk5OjseGVnp6exl9IXV1doX7gFMXAwACZmZlyxyjUnTt35I5QKu7cuYOaNWuq/3d58Z///AdnzpwRtsSYm5sjMDAQbdu2LfIaS0tLrf9vZmpqik8//VTuGG9FkiTo6mr+eNLV1dXq8liYF6MWo0ePVh978aFF2z+kfPfdd+jWrRu2b9+O3Nxc/Pe//1UXGADYtWuXVszZY4kpgZs3byIxMRFA/j+yyMhI9VBaYfMARBQQECD0vXQR/PuTpEifKl9n7dq1+Pzzz/Hnn38W+qlTm2/xAfmTqFu0aFHgeHZ2Nnbt2oXhw4dDoVBo/X+zLVu2yB3hrUmShK5du2oUmefPn6N3797Q09NTH7ty5Yoc8YpN2wvvqzRv3hwREREIDg6GhYVFgfmGAwcOVD8ZKifeTiqm1w37i9CsAeDgwYOFHk9JScGlS5fg6+sLPz8/fP7552WcrGTKy1oYixYtQq1atTQ+qQHA5s2b8c8//+Cbb76RKVnJbdq0CV999RUMDAxgZmamMR9D22/xAYCOjg4SEhJgbm6ucTw5ORnm5uZa/2/7Zf/88w9u3boFhUKBBg0aqEf/RDBv3rxiXTdnzpx3nIS0HUtMMRV3Ip+2f0or6vFQIyMjNGrUCNOmTdP6AgMAX3/9tXotjMIeXVy5cqVMyUqmXr162LFjR4HHwi9cuICBAwcK9UnOwsICkyZNwowZM7T+MeTCKJVKPHz4sMAP+6tXr6Jz5854/PixTMlKJj09HRMnTsS2bdvU5V5HRwfDhw/HDz/8AENDQ5kTViwxMTFYtWoVIiIioFAo0LhxY0yePFnY267ahreTiknby0lxiXZPuSi7du3Cb7/9JvRaGACQmJioMXnxhZo1a2rl5OpXyc7OxoABA4QrME5OTlAoFFAoFAVuYeTl5eHOnTtCPV0yZcoUBAYG4tChQ2jfvj0AICgoCJMmTcLUqVO1fhkIIH+9oYCAAHTu3BlGRkYa51JTU3HmzBm4urpqzFPURv7+/nBzc0Pz5s3Rvn17SJKE4OBgNGnSBIcOHUL37t3ljig8sb7byCgqKgqDBg0qdMn4lJQUDB48WOuHy4H8Z/1TUlLUrxcuXIinT5+qXycnJ2vFfc7X0dPTE3LthZdZW1vj3LlzBY6fO3cOVlZWMiR6cyNGjMDu3bvljlFiffv2RZ8+fSBJElxdXdGnTx/118CBA/Hzzz9j+/btcscstv/7v/+Dr68vPvnkExgbG8PY2Bg9evTAxo0bsXfvXrnjFcvPP/+M1atXFygwQP5TcGvWrMHGjRtlSFYyM2bMgKenJy5cuIAVK1Zg5cqVuHDhAjw8PIS6VazNOBJTTN9//z2sra0L3cvGxMQE1tbW+P7777X+U86xY8eQlZWlfr1kyRIMGjQIpqamAIDc3FzcunVLpnTFN3XqVKxevVrotTAAYMyYMfDw8EBOTg66dOkCIH9zSy8vL0ydOlXmdCWTl5eHpUuXwt/fH82aNSswsffF8uXa5sW8inr16mHAgAGoXLmyzInezvPnzwtdp8fc3FyYDS5//fVXeHt7F3new8MD8+fPx9dff12GqUouIiICv/32W4Hjo0ePxqpVq8o+UCnLyMiAgYGBrBlYYorp7Nmz+OWXX4o8379/f63YDKukRJ0SFRQUhNOnT+Po0aPCroUBAF5eXnj8+DHGjx+vXmOocuXK+OabbzBz5kyZ05XMtWvX4OTkBAC4fv26xjkRiuaIESPkjlAq2rZtizlz5mDbtm3qQpaRkYF58+a98vFxbRIVFaVeZK0wzZo1Q1RUVBkmejM1a9ZEWFgY7O3tNY6HhYUVmECurSZMmIAff/yxwPH09HT07NkTZ86cKftQ/8ISU0x379595V+6GjVqID4+vgwTVWzlYS0MIP+H+5IlS+Dt7Y2IiAgYGBjA3t5e6+/1F+b06dNyR3greXl5WLlyJX777TfExcUVWLhSlIm9q1evxscff4zatWvj/fffh0KhQFhYGCpXrgx/f3+54xVLbm4u/vnnH9SpU6fQ8//88w9yc3PLOFXJffHFFxg7dixiY2PRrl07KBQKBAUFYcmSJcKMtAYEBODbb7/FggUL1MfS09O1Zp4YS0wxmZiYICYmpsgJvtHR0YXeatI2LyYwvnxMNOVhLYx/q1q1Klq3bi13jFIRHR2NmJgYdOjQAQYGBurlB7TdvHnzsGnTJkyZMgXe3t6YNWsW/v77b/z++++YPXu23PGKrWnTpoiKisL27dsRGRkJSZIwcOBADBkyRPah/+Jq0qQJTpw4gZYtWxZ6/vjx42jSpEkZpyo5b29vGBkZYfny5eqRVSsrK8ydO1fr1016ISAgAB9++CHMzMzg6emJZ8+ewdXVFbq6ujh69Kjc8fiIdXH1798fOTk52L9/f6Hn+/TpAz09PezZs6eMk5WMUqnEJ598ov6kf+jQIXTp0kW91X1WVhaOHTsm3JoYokpPT8fixYuLXO9GhMniLyQnJ6N///44ffo0FAoFoqKiYGtrC3d3d5iammL58uVyR3yl+vXrY82aNejZsyeMjIwQFhamPnb+/Hns2LFD7ogVxoYNGzBlyhTs2rULvXr10jh36NAhDBo0CCtWrMDYsWNlSlhyz549A4BCJytru+vXr6NTp07w9vbGrl27oK+vjyNHjqh/bsiJJaaYQkND0bZtW/Tq1QteXl7qPZMiIyOxdOlSHDlyBMHBwYWu+KlNRo0aVazrRBjp2Lt3b5FD/9q+kucLgwYNQmBgIIYNG1boejeTJ0+WKVnJDR8+HElJSdi0aRMaN26Mq1evwtbWFgEBAfD09MSNGzfkjvhKVapUQUREBOrUqQNLS0scOXIELVq0QGxsLJycnDSe6tM2Bw8exCeffIJKlSoVuaDlC25ubmWU6u0MHToUO3bsQKNGjdCwYUMoFApERETg9u3b6N+/P3bu3Cl3xArl/Pnz6NatG5ydnXH48GGtGdXj7aRicnJywt69ezF69OgCozFmZmb47bfftL7AAGKUk+JYs2YNZs2ahREjRuDAgQMYNWoUYmJicOnSJUyYMEHueMV29OhRHDlyRL2eh8gCAgLg7++P2rVraxy3t7fX6l2fX6hduzYSEhJQp04d2NnZISAgAC1atMClS5e0fo5S37591ZuK9u3bt8jrRFhV/IXt27fDzc0NO3bswO3btyFJEho2bIh58+ahf//+cscrUosWLXDy5ElUq1ZNvQZRUbT1w1ZRufX19fHgwQON71dyvweWmBLo1asX7t69i2PHjiE6OhqSJKFBgwZwcXHhKphl7KeffsKGDRswaNAgbN26FV5eXrC1tcXs2bOFmYAJANWqVSuwU7Ko0tPTC/138OjRI60vAUD+7s8nT56Es7MzJk+ejEGDBsHX1xdxcXHw9PSUO94r/fs2ZHlZ0BLIv42vzYWlMH369FH/fX9VodRmIuXm7aRi6tGjB3bu3AkTExMA+YvETZgwQb2+SnJyMj766CPcvHlTxpQVh6GhISIiIlC3bl2Ym5vj+PHjeP/99xEVFYUPPvgAycnJckcslu3bt+PAgQPYunWr8EW4Z8+eaNGiBb777jsYGRkhPDwcdevWxcCBA6FSqYRZaO2F8+fPIzg4GHZ2dsLcgikvCltUtDAiPExB7xZLTDG9vDmcsbExwsLCYGtrCwB4+PAhrKyshBmqFZ2trS327t2LFi1aoHXr1hgzZgy+/PJLBAQEYODAgcKMxjg5OSEmJgaSJKFevXoF1ruRe6i2JG7evIlOnTqhZcuWOHXqFNzc3HDjxg08fvwY586d414xZejkyZNFThbfvHmzTKmK78WGu0URZcPdF7Kzswv9b1HUI+TaSFvfA28nFdPLXY/dT15dunTBoUOH0KJFC7i7u8PT0xN79+5FSEgI+vXrJ3e8YhNp2PZ1HBwcEB4ejnXr1kFHRwfp6eno168fJkyYUOj+UNrol19+wfr163Hnzh389ddfqFu3LlatWgUbGxv06dNH7njFMm/ePMyfPx+tWrUqdLK4CE6dOiVk7pfdvn0b7u7uCA4O1jguUgnT9vfAkZhiUiqV6olzQP5jci+evgA4ElPWVCoVVCqVerO+3377DUFBQbCzs8NXX30FPT09mRNWPHFxcbC2ti70h09cXJzsn9heZ926dZg9ezY8PDywcOFCXL9+Hba2tvDz88PWrVuFWczP0tISS5cuxbBhw+SO8sbKy+2k9u3bQ1dXFzNmzCi0UL5qVWJtoe3vgSWmmHR0dJCYmIiaNWsCgPqev42NDQCWGKKXb7m+kJycDHNzc63/t+Hg4AAfHx/07dtX40PKizUyHj16JHfEYjEzM8PFixeFvn33uttJL2j736kqVarg8uXLaNSokdxR3pi2vwfeTiomSZIwcuRI9azzzMxMfPXVVxqLxJE80tPTsXv3bmRkZMDFxaXAPiXa7HXfrLX9m/S/FbUyb1pamhCbKt65c0e999O/6evrIz09XYZEb2bMmDHYsWPHKzdQ1Hb/HvWSJAk9evTApk2b8N5778mYquQcHByEKb9F0fb3wBJTTC9vDjd06NAC1wwfPrys4lRYcXFxGDZsGK5cuYIPPvgAvr6+6N69u3ozOAMDAxw9ehQdOnSQOWnxvLzmUE5ODkJDQ7F161bMmzdPplQlM2XKFAD5a5B4e3trPGWVl5eHCxcuoHnz5jKlKz4bGxuEhYUV2Frk6NGjcHBwkClVyWVmZmLDhg04ceKEULuJ/1vHjh01Xuvo6OCDDz5Q374XxZIlS+Dl5QUfHx84OjoW+G+h7bfDAO1/D7ydRELp378/4uPjMWHCBOzZswe3b99G/fr14evrC6VSifHjxyM5ORmnTp2SO+pb2bFjB3bv3o0DBw7IHeW1OnfuDAAIDAxE27ZtNeYj6enpoV69epg2bZrWj5Bt2bIF3t7eWL58Odzd3bFp0ybExMRg0aJF2LRpEwYOHCh3xGJ58d+jMAqFQsh/Gy/PQRSFUqkEUHB/Om2ZFFsc2v4eWGJIKBYWFjh48CDatGmDx48fo0aNGjh37hzatm0LALh69Sq6du2q1cOfxRETE4NmzZoJdRtj1KhRWL16teyfzN7Gxo0bsWDBAvWO9O+99x7mzp0Ld3d3mZNVbKKWmMDAwFeef3nESRtp+3tgiSGh6Ojo4MGDB6hVqxaA/N2fw8PDy9VTYhkZGZg5cyaOHj2KW7duyR3njaWmpuLUqVNo1KiR1k4KfCE3Nxe//vorXF1dYWFhgUePHkGlUhWYpEzyePlBCqIXOCeGhPLy5FHR15KoVq2axnuQJAnPnj2DoaEhtm/fLmOykuvfvz86dOiAr7/+GhkZGWjVqhX+/vtvSJKEXbt24bPPPpM7YpF0dXUxbtw4REREAABq1Kghc6KS69y5c6H/HkxMTNCwYUNMmDAB1tbWMiQruZfXenr5QYoX9u3bV5axiu3s2bOFHjcxMYGdnZ1W7P5cUs+fPy90s91mzZrJlCgfSwwJZ/bs2erJo9nZ2Vi4cKF6O4jnz5/LGa3EVq1apfFaqVSiZs2acHZ2RrVq1eQJ9YbOnj2LWbNmAcifsCxJEp4+fYqtW7diwYIFWl1iAMDZ2RmhoaEFJvaKoqjJ00+fPsUff/yBtWvXIigoSIhJ1i/+Pb9Q2IMU2qxTp05FntPR0cG4ceOwfPnyApNktdE///yDUaNG4ejRo4Wel3vUm7eTSCidOnUq1uiLKAuTlScGBga4ffs2rK2tMXz4cFhZWWHx4sWIi4uDg4MD0tLS5I74Snv27MGMGTPg6emJli1bFvi0LPcnzrc1YcIE3LlzB3/88YfcUcq9lJSUQo8/ffoUFy9exPTp0zF27Fj897//LeNkJTdkyBD8/fffWLVqFTp37oz9+/fj4cOHWLBgAZYvX46ePXvKmo8lhkhmT58+ha+vLyIiIqBQKODg4IDRo0cX+DSq7Ro0aIAFCxagZ8+esLGxwa5du9ClSxetn2w9evRorFq1Sr2Z678pFAqteQrjbYWHh8PV1RUJCQlyR6nwDhw4gP/+97+4ceOG3FFey9LSEgcOHECbNm1gbGyMkJAQNGjQAAcPHsTSpUsRFBQkaz6lrH86UQUXEhKC+vXrY+XKlXj8+DEePXqEFStWoH79+kJt/ggAHh4eGDJkCGrXrg0rKyv1kPrZs2fh6Ogob7hX2Lp1KzIzM3Hnzp0CX7Gxser/KzoDAwNkZmbKHYOQv1T/3bt35Y5RLOnp6eoJ7tWrV8c///wDAHB0dNSK71GcE0MkI09PT7i5uWHjxo3qfaByc3MxZswYeHh4FDlBUBuNHz8ebdq0QXx8PLp3765eX8LW1hYLFiyQOV3RXgxGizoXprgCAgLQoEEDuWMQgAcPHgjz5FvDhg1x69Yt1KtXD82bN8fPP/+MevXqYf369VqxsStvJxHJyMDAAKGhoQUeQb558yZatWol1ETlM2fOvHJCo7ZSKpV4+PChel80UR08eLDQ4ykpKbh06RJ8fX3h5+eHzz//vIyT0b8lJSVh4MCBsLW1xaZNm+SO81q//vorcnJyMHLkSISGhsLV1RXJycnQ09ODn58fBgwYIGs+lhgiGdWqVQu//PILXFxcNI77+/tj+PDhePjwoUzJSq5y5cp47733MGrUKIwYMUKYx3mVSiVMTExeO2H88ePHZZTozbwY+XqZkZERGjVqhGnTprHAlBEnJ6dC/z6lpKTg3r17aNy4MQICAoQZjfm358+fIzIyEnXq1NGKpQh4O4lIRgMGDIC7uzuWLVuGdu3aQaFQICgoCNOnT8egQYPkjlciDx48wPbt2+Hn54e5c+eia9eucHd3R9++fTW2ItBG8+bNE24i9ctUKpXcEej/69u3b6HHjY2N0ahRI7i4uEBHR6dsQ5USQ0NDtGjRQu4YahyJIWGEh4cX+1pRHofNzs7G9OnTsX79euTm5gIAKlWqhHHjxmHx4sXqXdNFExYWhs2bN2Pnzp1QqVQYMmQI3N3d8f7778sdrQClUonExEQhPxUTvUtRUVEIDw9HixYtYGNjgyNHjmDJkiXIyMhA37598d///lf2BUdZYkgYSqVS/chrYUR+HPb58+eIiYmBJEmws7PT2AlaVA8ePMCGDRuwePFi6OrqIjMzE23btsX69evRpEkTueOp6ejoICEhgSWG6F/279+P/v37q7/vbtiwAWPHjkXnzp2ho6MDf39/LFiwAN98842sOVliSBgleSRR2580ycvLw40bN2Bvbw8DAwONcxkZGYiKikLTpk2LnOegrXJycnDgwAFs3rwZx48fR6tWreDu7o5Bgwbh8ePH+OabbxAWFoabN2/KHVWNIzFEBbVq1Qqurq5YsGAB/Pz8MGHCBPj4+MDDwwMAsGHDBqxcuVK9VYdcWGKIZODn54e1a9fiwoULBe6N5+XlwdnZGR4eHkIttz5x4kTs3LkTQP4y8WPGjEHTpk01romLi0O9evU4f4NIyxkZGSEsLAz169eHSqWCnp4ewsLC1P+m//77bzg4OMj+BCUn9pLQbt68WeimZG5ubjIlKh5fX19Mmzat0Ml9Ojo68PLywtq1a4UqMTdv3sQPP/yAzz77rMiJvFZWVtwSgkgA6enpMDIyApA/WmlgYKBxm9vAwABZWVlyxVNjiSEhxcbG4tNPP8W1a9c05sm8mGSm7XNibt26hQ8++KDI861bt5Z9mLakTp48+dprdHV10bFjxzJIU7GpVCpER0cjKSmpwKhXhw4dZEpV8Yi6dhKQ/73035N2X36tLcS64U70/02ePBk2NjZ4+PAhDA0NcePGDZw9exatWrXCmTNn5I73Wunp6UhNTS3y/LNnz2Qfpi2prVu34siRI+rXXl5eMDU1Rbt27YRZYr08OH/+POzs7NC4cWN06NABnTp1Un917txZ7ngVyscff4z69etjwYIFiI+PlztOiUiShAYNGqB69eqoXr060tLS4OTkpH798gKdcuFIDAnpr7/+wqlTp1CzZk0olUoolUp8+OGHWLRoESZNmoTQ0FC5I76Svb09goODi3wUPCgoCPb29mWc6u34+Phg3bp1APL/+6xduxarVq3C4cOH4enpiX379smcsGL46quv0KpVKxw5cgSWlpZa+em5ohB57aQtW7bIHaF4JCIBmZqaSjExMZIkSZKtra106tQpSZIkKTo6WjIwMJAzWrEsWbJEMjMzk65evVrgXFhYmGRmZiYtWbJEhmRvzsDAQLp7964kSZLk5eUlDRs2TJIkSbp+/bpUo0YNOaNVKIaGhlJUVJTcMegloaGh0sSJE6UaNWpI1atXlyZOnCiFhYXJHUt4vJ1EQmratKl68TtnZ2csXboU586dw/z582Fraytzutfz9PSEo6MjWrZsiU8++QSenp6YMmUKPvnkE7Rq1QpNmzaFp6en3DFLpGrVqkhOTgaQv9lgt27dAORvR5CRkSFntArF2dkZ0dHRcseglzRv3hwzZszAhAkTkJ6ejs2bN6Nly5b46KOPcOPGDbnjCYu3k0hI3377LdLT0wEACxYsQK9evfDRRx/BzMwMu3fvljnd61WqVAkBAQFYuXIlduzYgbNnz6rvQS9cuBAeHh6oVKmS3DFLpHv37hgzZgycnJxw+/Zt9OzZEwBw48YN1KtXT95wFcjEiRMxdepUJCYmwtHRscDfI1FWsy4vCls7ae3atRprJ33++edatXaSSLhODJUbjx8/RrVq1TgHQCZPnz7Ft99+i/j4eIwbNw4ff/wxAGDOnDnQ09PDrFmzZE5YMRS2QKLIq1mLjGsnvXssMSSc3NxcVK5cWWPhJSLK97onwbR9NevypGvXrhgzZswr107Kzc3FuXPnuPTAG+LtJBKOrq4u6taty0+UWujp06fw9fVFREQEFAoFGjduDHd3d+F3iBYJS4p2yMnJQZ06deDs7PzKJ5G4dtLb4UgMCWnLli3Ys2cPtm/fjurVq8sdhwCEhITA1dUVBgYGaNOmDSRJQkhICDIyMhAQEIAWLVrIHbFCEXU16/LE1NQUV65cEeJhg3+bMmVKsa9dsWLFO0zyeiwxJCQnJydER0cjJycHdevWRZUqVTTOX7lyRaZkFddHH30EOzs7bNy4Ebq6+YO8ubm5GDNmDGJjY3H27FmZE1YMoq9mXZ6MGjUKjo6OJSoF2qC4iyIqFAqcOnXqHad5Nd5OIiH16dOHE3i1TEhIiEaBAfKHyr28vNCqVSsZk1UsL1azPnHiBGxtbXHx4kUkJydj6tSpWLZsmdzxKhQ7Ozt89913CA4ORsuWLQt82Jo0aZJMyV5NpP3NOBJDJKOiPqEpFApUrlwZdnZ26NOnjxC3zGrVqoVffvkFLi4uGsf9/f0xfPhwPHz4UKZkFUuNGjVw6tQpNGvWDCYmJrh48SIaNmyIU6dOYerUqVq/mnV5YmNjU+Q5hUKB2NjYMkxTPnEkhoRka2uLS5cuwczMTOP406dP0aJFC2G+OYSGhuLKlSvIy8tDw4YNIUkSoqKioKOjg0aNGuGnn37C1KlTERQUBAcHB7njvtKAAQPg7u6OZcuWoV27dlAoFAgKCsL06dMxaNAgueNVGHl5eahatSqA/ELz4MEDNGzYEHXr1sWtW7dkTlex3LlzR+4IpeLSpUvYs2dPoXOs5N5OhCWGhPT3338Xem8/KysL9+7dkyHRm3kxyrJlyxYYGxsDAFJTU+Hu7o4PP/wQX3zxBQYPHgxPT0/4+/vLnPbVli1bBoVCgeHDhyM3NxdA/qJ+48aNw+LFi2VOV3G8WM3a1tZWvZq1np4eNmzYINwEU5Lfrl27MHz4cLi4uOD48eNwcXFBVFQUEhMT8emnn8odj7eTSCwHDx4EAPTt2xdbt27VeHQ3Ly8PJ0+exPHjx4X5xPnee+/h+PHjBUZZbty4ARcXF9y/fx9XrlyBi4sLHj16JFPK18vLy0NQUBAcHR1RuXJlxMTEQJIk2NnZwdDQUO54FYq/vz/S09PRr18/xMbGolevXoiMjFSvZt2lSxe5I1Yo9+7dw8GDBwsdxZD7yZ7iaNasGb788ktMmDABRkZGuHr1KmxsbPDll1/C0tIS8+bNkzUfSwwJ5cVqpP9+6uKFSpUqoV69eli+fDl69eolR7wSq1q1Kg4fPoxOnTppHD9z5gx69+6NZ8+eITY2Fs2bN0dqaqo8IYupcuXKiIiIeOU8AJIHV7OWx8mTJ+Hm5gYbGxvcunULTZs2xd9//w1JktCiRQvZn+wpjipVqqi3DqlRowZOnz4NR0dHREREoEuXLkhISJA1HzeAJKGoVCqoVCrUqVMHSUlJ6tcqlQpZWVm4deuWMAUGyL+dNHr0aOzfvx/37t3D/fv3sX//fri7u6Nv374AgIsXL6JBgwbyBi0GR0dHYeYiVQTR0dHw9/dHRkaGEBPDy6OZM2di6tSpuH79OipXroz/+7//Q3x8PDp27IjPP/9c7njFUr16dTx79gxA/sjx9evXAeTPP3z+/Lmc0fKV5ZbZRKTp2bNn0pgxYyQ9PT1JqVRKSqVS0tPTk7744gspLS1NkiRJCg0NlUJDQ+UNWgz+/v5S8+bNpUOHDkkPHjyQUlJSNL6obDx69Ejq0qWLpFAoJKVSKcXExEiSJEmjR4+WpkyZInO6iqVq1apSdHS0JEmSZGpqKl2/fl2SJEkKCwuT6tatK2Oy4hs0aJC0fPlySZIkacGCBVLNmjWlMWPGSHXr1pU+/fRTmdNJEm8nkbBOnjyJkydPqkdk/m3z5s0ypXozaWlpiI2NhSRJqF+/vvrpEpH8e+PBf9+2kLjxYJkaPnw4kpKSsGnTJjRu3BhXr16Fra0tAgIC4OnpiRs3bsgdscKwsLDAqVOn4ODggCZNmmDRokVwc3PD1atX0b59e6Slpckd8bUeP36MzMxMWFlZQaVSYdmyZQgKCoKdnR28vb1RrVo1WfPx6SQS0rx58zB//ny0atUKlpaWwt/rr1q1Kpo1ayZ3jLci0gJZ5VlAQAD8/f1Ru3ZtjeP29vav3RySStcHH3yAc+fOwcHBAT179sTUqVNx7do17Nu3Dx988IHc8V4rNzcXhw4dgqurK4D8DypeXl7w8vKSOdn/sMSQkNavXw8/Pz8MGzZM7ihvJT09HYsXLy5yREmkOSbcxE47pKenF/pE2KNHj6Cvry9DooprxYoV6tGWuXPnIi0tDbt374adnR1Wrlwpc7rX09XVxbhx4xARESF3lCKxxJCQsrOz0a5dO7ljvLUxY8YgMDAQw4YNE35E6XV7I3Xo0KGMklRsHTp0wLZt2/Ddd98ByL+1p1Kp8P333xd7TxwqHf9el8fQ0BA//fSTjGnejLOzM0JDQ7V2d3TOiSEhffPNN6hatSq8vb3ljvJWTE1NceTIEbRv317uKG/t33NiXvh3KeOcmLJx8+ZNdOrUCS1btsSpU6fg5uaGGzdu4PHjxzh37hzq168vd8QKozysLL5nzx7MmDEDnp6ehe7/JPdtcI7EkJAyMzOxYcMGnDhxAs2aNUOlSpU0zouwiBQAVKtWrdw8/vrkyRON1zk5OQgNDYW3tzcWLlwoU6qKx8HBAeHh4Vi3bh10dHTUC99NmDABlpaWcserUF61svj9+/dlSFRyAwYMAKC5WeWLdbq0YcI+R2JISK8aFteG7eGLa/v27Thw4AC2bt1able2PXv2LDw9PXH58mW5oxCVifK0svjrJoPLfZuJJYZIRk5OTuol+uvVq1dgROnKlSsyJSs9ERERaN26tRCPk5YXT548ga+vLyIiIqBQKNC4cWOMGjWq3Iz6abvytLL42bNn0a5dO+jqat64yc3NRXBwsOxz3VhiSGjR0dGIiYlBhw4dYGBgoB7iFMXr9h2ZM2dOGSV5e+Hh4RqvJUlCQkICFi9ejJycHJw7d06mZBVLYGAg+vTpA2NjY7Rq1QoAcPnyZTx9+hQHDx7kU2RlyMbGBpcuXUKNGjXkjvLGdHR0kJCQAHNzc43jycnJMDc35+0kojeRnJyM/v374/Tp01AoFIiKioKtrS3c3d1hamqK5cuXyx2xwlEqlYV+8vzggw+wefNmNGrUSKZkFUvTpk3Rrl079ZwYIP8Wxvjx43Hu3Dn1svFUtjIzM1G5cmW5Y5SYUqnEw4cPUbNmTY3jt2/fRqtWrWTf040Te0lInp6eqFSpEuLi4tC4cWP18QEDBsDT05MlRgZ37tzReK1UKlGzZk0hv3GLLCYmBv/3f/+nLjBA/qfpKVOmYNu2bTImq3hUKhUWLlyI9evX4+HDh7h9+zZsbW3h7e2NevXqwd3dXe6IRerXrx+A/FtiI0eO1FhjKC8vD+Hh4VqxzAU3gCQhBQQEYMmSJUKuSlq9enU8evQIwP+eTirqSwQ9evRASkoK6tati7p162L79u0wMTGBtbU1KleujOTkZDg4OMgds8Jo0aJFoYuTRUREoHnz5mUfqAJbsGAB/Pz8sHTpUujp6amPOzo6YtOmTTImez0TExOYmJhAkiQYGRmpX5uYmMDCwgJjx47F9u3b5Y7JkRgSk8irkq5cuRJGRkYAgFWrVskbphT4+/sjKytL/XrJkiUYNGgQTE1NAeRPABThKYzyYtKkSZg8eTKio6PVS9ufP38eP/74IxYvXqwxd0nuNT7Ku23btmHDhg3o2rUrvvrqK/XxZs2aITIyUsZkr7dlyxYAQL169TBt2rQC68NoC86JISH17NkTLVq0wHfffQcjIyOEh4ejbt26GDhwIFQqFfbu3St3xApDqVQiMTFRPfHPyMhIvekgADx8+BBWVlayTwCsKApbdPDftGmNj/LOwMAAkZGRqFu3rsa/i5s3b6JNmzZ8Yq8UcCSGhPT999+jU6dOCAkJQXZ2Nry8vDRWJRWJSqVCdHR0oXsnyf34Ionn5blJJJ8mTZrgzz//LLCWyp49e+Dk5CRTqpJ5+PAhpk2bpt7f7eVxD7mLMEsMCam8rEp6/vx5DB48GHfv3i3wzUGUT8oKhaLAY+0iPeZe3si9+Bj9z5w5czBs2DDcv38fKpUK+/btw61bt7Bt2zYcPnxY7njFMnLkSMTFxcHb21sr93fj7SQiGTVv3hwNGjTAvHnzCv0G8e+VPrWVUqnEJ598op6LdOjQIXTp0kV9Dz0rKwvHjh0TopCVFzExMVi1apXGYneTJ0/mvkky8Pf3h4+PDy5fvgyVSoUWLVpg9uzZcHFxkTtasRgZGeHPP//U2knhLDEklKioKMyePRs///wzjI2NNc6lpKRg3LhxWLBggcbusdqsSpUquHr1Kuzs7OSO8sZGjRpVrOteTBSkd8vf3x9ubm5o3rw52rdvD0mSEBwcjKtXr+LQoUPo3r273BFJIA4ODvj111+19vYXSwwJZezYsTA1NcXSpUsLPf/NN98gNTUV69atK+Nkb6ZLly7w8vLCxx9/LHcUKiecnJzg6uqKxYsXaxyfMWMGAgICysVWFqLJzs4udM5bnTp1ZEpUfAEBAVi+fDl+/vln1KtXT+44BbDEkFAaNWqEX375Ba1bty70/OXLlzF48GBhHundv38/vv32W0yfPh2Ojo4F9k7iI7BUUpUrV8a1a9dgb2+vcfz27dto1qwZMjMzZUpW8URFRWH06NEIDg7WOC7S02HVqlXD8+fPkZubC0NDwwLfox4/fixTsnyc2EtCuXv3boE9PP6tRo0aiI+PL8NEb+ezzz4DAIwePVp9jI/A0tuoWbMmwsLCCpSYsLCwV/7bodI3cuRI6Orq4vDhw1o5KbY4tH0tK5YYEoqJiQliYmKKfAIjOjq6wFwZbcbHYam0ffHFFxg7dixiY2PRrl07KBQKBAUFYcmSJZg6darc8SqUsLAwXL58Weh9w0aMGCF3hFfi7SQSSv/+/ZGTk4P9+/cXer5Pnz7Q09PDnj17yjhZyeXk5KBhw4Y4fPgwl+WnUiNJElatWoXly5fjwYMHAAArKytMnz4dkyZNEnI0QFStW7fGypUr8eGHH8od5a3ExMRgy5YtiImJwerVq2Fubo5jx47B2toaTZo0kTUb904iocycORNHjx7Ff/7zH1y8eBEpKSlISUnBhQsX8Nlnn8Hf3x8zZ86UO2axVKpUCVlZWfyhQqUmNzcX27Ztw6BBg3Dv3j31v4979+5h8uTJ/LtWxpYsWQIvLy+cOXMGycnJSE1N1fgSQWBgIBwdHXHhwgXs27dPvcpweHg45syZI3M6jsSQgA4fPozRo0cjOTlZ47iZmRk2bdoENzc3mZKV3OLFixEZGYlNmzZBV5d3d+ntGRoaIiIigoveaYEXW0C8XB5FmvPWtm1bfP7555gyZYrG1gmXLl1C3759cf/+fVnz8bsmCadXr164e/cujh07hujoaEiShAYNGsDFxaXQTSG12YULF3Dy5EkEBATA0dGxwCZr+/btkykZicrZ2RmhoaEsMVrg9OnTckd4a9euXcOOHTsKHK9Zs2aBD5JyYIkhIRkYGODTTz+VO8ZbMzU1VT+hRFQaxo8fj6lTp+LevXto2bJlgWLMx/bLTseOHeWO8NZMTU2RkJAAGxsbjeOhoaF47733ZEr1P7ydRERUjhS2izUf25fP06dP4evrq94CwsHBAaNHjxZiSxEA8PLywl9//YU9e/agQYMGuHLlCh4+fIjhw4dj+PDhss+LYYkhkllubi7OnDmDmJgYDB48GEZGRnjw4AGMjY1RtWpVueORYO7evfvK87zNVHZCQkLg6uoKAwMDtGnTBpIkISQkBBkZGQgICECLFi3kjvhaOTk5GDlyJHbt2gVJkqCrq4u8vDwMHjwYfn5+0NHRkTUfSwyRjO7evYuPP/4YcXFxyMrKwu3bt2FrawsPDw9kZmZi/fr1ckckojf00Ucfwc7ODhs3blRP3M/NzcWYMWMQGxuLs2fPypyw+GJjY3HlyhWoVCo4OTkVWExRLiwxRDLq27cvjIyM4OvrCzMzM/XM/8DAQIwZMwZRUVFyRyTBbNu27ZXnhw8fXkZJyMDAAKGhoQUWu7t58yZatWqF58+fy5SseFJTU1G1atUCtyhVKhXS0tK0YmFRTuwlYalUKkRHRxe6sVqHDh1kSlUyQUFBOHfuHPT09DSO161bV/ZHF0lMkydP1nidk5OD58+fQ09PD4aGhiwxZcjY2BhxcXEFSkx8fDyMjIxkSlU8+/fvxzfffIOwsLACT31mZmaidevWWLZsGXr37i1TwnwsMSSk8+fPY/Dgwbh79y5eHkwUafKiSqUqNOu9e/e0/pscaacnT54UOBYVFYVx48Zh+vTpMiSquAYMGAB3d3csW7ZMYwuI6dOnY9CgQXLHe6V169bBy8ur0GUrDA0N8c0332Dt2rWylxjeTiIhNW/eHA0aNMC8efMK3VhNlJn/AwYMgImJCTZs2AAjIyOEh4ejZs2a6NOnD+rUqYMtW7bIHZHKiZCQEAwdOhSRkZFyR6kwsrOzMX36dKxfvx65ubkA8lfqHjduHBYvXgx9fX2ZExbNysoKZ8+ehZ2dXaHno6Oj0aFDB/XWFnJhiSEhValSBVevXi3yH5goHjx4gM6dO0NHRwdRUVFo1aoVoqKiUKNGDZw9e5a7DlOpCQ0NRceOHYVZ7r48ef78OWJiYiBJEuzs7IRYlLOo+TwvREREoEWLFsjIyCjjZJp4O4mE5OzsjOjoaOFLjJWVFcLCwrBz5071zH93d3cMGTIEBgYGcscjAR08eFDjtSRJSEhIwNq1a9G+fXuZUlVshoaGcHR0lDtGidSrVw8hISFFlpiQkBCteFyfIzEkpP379+Pbb7/F9OnT4ejoiEqVKmmcF2VV0ufPnwvxqYzE8fKTJAqFAjVr1kSXLl2wfPlyWFpaypSs4hg9enSxrtu8efM7TvLmZs2ahe3bt+PixYuoVauWxrnExEQ4Oztj6NChWLhwoUwJ87HEkJDKy6qkVatWRd++fTFs2DB079690PdFRGJRKpWoW7cunJycCjx48G/79+8vw1Ql8+zZM7Rt2xZxcXEYOnQoGjZsCIVCgYiICPz666+wtrbG+fPnZX8AgSWGhFReViXdt28fdu7ciSNHjsDY2BgDBgzA0KFD0bp1a7mjEdEbGj9+PHbt2oU6depg9OjRGDp0KKpXry53rBJLSUnBzJkzsXv3bvVTb9WqVcOAAQPg4+MDU1NTeQOCJYZIKzx79gx79+7Fzp07cfr0adjY2GDo0KGYPXu23NFIEA4ODggKClL/sBw7diwWLlyImjVrAgCSkpJQr149rV9grbzIysrCvn37sHnzZgQHB6Nnz55wd3eHi4tLgacptZ0kSXj06BEkSULNmjW1Kj9LDAnt5s2biIuLQ3Z2tsZxNzc3mRK9vZs3b2LIkCEIDw8X5rYYyU+pVCIxMVH9RJuxsTHCwsJga2sLAHj48CEsLS0LLAxJ797du3fh5+eHbdu2IScnBzdv3uS+aKWETyeRkGJjY/Hpp5/i2rVr6rkwANSfEET74Z+ZmYmDBw9ix44dOHbsGMzNzTFt2jS5Y5HACvt8qk2foCsShUKh/j7FElm6OIuQhDR58mTY2Njg4cOHMDQ0xI0bN3D27Fm0atUKZ86ckTtesQUEBGDEiBGoVasWvvrqK5ibm8Pf3x9xcXFYsmSJ3PGI6A1lZWVh586d6N69Oxo2bIhr165h7dq1iIuL4yhMKeJIDAnpr7/+wqlTp1CzZk0olUoolUp8+OGHWLRoESZNmoTQ0FC5IxZL37590bNnT2zduhU9e/Ys8Kg4UXG9+LT/8jEqe/+e2Dtq1Cjs2rULZmZmcscql1hiSEh5eXnqTzM1atTAgwcP0LBhQ9StWxe3bt2SOV3xJSYmasVOsCQ+SZLQtWtX6Ormf1vPyMhA79691ZuLvlj2nt699evXo06dOrCxsUFgYCACAwMLvW7fvn1lnKz8YYkhITVt2hTh4eGwtbWFs7Mzli5dCj09PWzYsEE9kVEExsbGyMvLw++//46IiAgoFAo0btwYffr0gY6OjtzxSCBz5szReN2nT58C13z22WdlFadCGz58eLkaBTt58iROnjyJpKSkAnN65F6wj08nkZD8/f2Rnp6Ofv36ITY2Fr169UJkZCTMzMywe/dudOnSRe6IxRIdHY0ePXrg/v37aNiwISRJwu3bt2FtbY0jR46gfv36ckckogps3rx5mD9/Plq1alXoZrtyL9jHEkPlxuPHj1GtWjWhPgH16NEDkiTh119/Va/vkZycjKFDh0KpVOLIkSMyJySiiszS0hJLly7FsGHD5I5SKJYYElp0dDRiYmLQoUMHGBgYqLcdEEWVKlVw/vz5ApvDXb16Fe3bt0daWppMyYiIADMzM1y8eFFrR4X5iDUJKTk5GV27dkWDBg3Qo0cPJCQkAADGjBmDqVOnypyu+PT19fHs2bMCx9PS0tQTMomI5DJmzBjs2LFD7hhF4sReEpKnpycqVaqEuLg4NG7cWH18wIAB8PT0xPLly2VMV3y9evXC2LFj4evrizZt2gAALly4gK+++kroVYeJqHzIzMzEhg0bcOLECTRr1qzAMhArVqyQKVk+lhgSUkBAAPz9/VG7dm2N4/b29q/dHFKbrFmzBiNGjEDbtm3V3xxyc3Ph5uaG1atXy5yORJeZmYnKlSvLHYMEFh4ejubNmwMArl+/rnFOG27ds8SQkNLT02FoaFjg+KNHj6Cvry9DojdjamqKAwcOICoqCpGRkZAkCQ4ODrCzs5M7GglKpVJh4cKFWL9+PR4+fIjbt2/D1tYW3t7eqFevHtzd3eWOSAI5ffq03BFeiXNiSEgdOnTAtm3b1K8VCgVUKhW+//57dO7cWcZkb8be3h69e/eGm5sbCwy9lQULFsDPz0+9dtILjo6O2LRpk4zJiEofn04iId28eROdOnVCy5YtcerUKbi5ueHGjRt4/Pgxzp07p7Uz6V94+vQpdu7ciXHjxgEAhgwZgoyMDPV5HR0dbNy4EaampjIlJFHZ2dnh559/RteuXWFkZISrV6/C1tYWkZGRaNu2LZ48eSJ3RBLMpUuXsGfPHsTFxSE7O1vjnNyrDnMkhoTk4OCA8PBwtGnTBt27d1cvfBcaGqr1BQYANm7ciHPnzqlfHzx4EEqlEiYmJjAxMcG1a9ewatUq+QKSsO7fv1/oaJ5KpUJOTo4MiUhku3btQvv27XHz5k3s378fOTk5uHnzJk6dOgUTExO543FODInLwsIC8+bNkzvGG9m7d2+BZeKXLl2q3jJh//79mD9/PubOnStDOhJZkyZN8Oeff6Ju3boax/fs2QMnJyeZUpGofHx8sHLlSkyYMAFGRkZYvXo1bGxs8OWXX8LS0lLueCwxJK4nT57A19dXY8+hUaNGqVe+1WYxMTEan5YbNmyoMX/h/fffR1RUlBzRSHBz5szBsGHDcP/+fahUKuzbtw+3bt3Ctm3bcPjwYbnjkWBiYmLQs2dPAPnrWqWnp0OhUMDT0xNdunSR/YMkbyeRkAIDA2FjY4M1a9bgyZMnePz4MdasWaPeNVbbPX/+XOPeckhIiMbj4unp6QU2WiMqjt69e2P37t34448/oFAoMHv2bERERODQoUPo3r273PFIMNWrV1cvyPnee++pH7N++vQpnj9/Lmc0AByJIUFNmDAB/fv3x7p169S7Pefl5WH8+PGYMGFCgfUMtI2trS2uXLmCpk2bFno+JCQENjY2ZZyKygtXV1e4urrKHYPKgY8++gjHjx+Ho6Mj+vfvj8mTJ+PUqVM4fvw4unbtKnc8Pp1EYjIwMEBYWBgaNmyocfzWrVto3ry5xpM+2sjb2xtbt27FxYsXYWFhoXEuISEBzs7OGD58OBYsWCBTQhJddnY2kpKSCozo1alTR6ZEJKLHjx8jMzMTVlZWUKlUWLZsGYKCgmBnZwdvb29Uq1ZN1nwsMSSk9u3bY/r06ejbt6/G8d9//x1LlizBX3/9JU+wYnr27BmcnZ1x7949DBs2DA0aNIBCoUBkZCS2b9+O9957DxcvXoSRkZHcUUkwUVFRGD16NIKDgzWOv9gcNS8vT6ZkRKWPt5NISJMmTcLkyZMRHR2NDz74AABw/vx5/Pjjj1i8eDHCw8PV1zZr1kyumEUyMjLCuXPnMHPmTOzcuRNPnz4FkL+C7+DBg+Hj48MCQ29k5MiR0NXVxeHDh2FpaakVS8OT2GJiYrBlyxbExMRg9erVMDc3x7Fjx2BtbY0mTZrImo0jMSQkpfLVc9IVCoUwnzwlScI///wDAKhZsyZ/6NBbqVKlCi5fvoxGjRrJHYXKgcDAQHzyySdo3749zp49i4iICNja2mLp0qW4ePEi9u7dK2s+jsSQkO7cuSN3hFKjUChgbm4udwwqJxwcHPDo0SO5Y1A5MWPGDCxYsABTpkzRGB3u3LmzVmxSy5EYIiLBpaamqv93SEgIvv32W/j4+MDR0VG9O/oLxsbGZR2PBFa1alVcu3YNNjY2GttY/P3332jUqBEyMzNlzceRGBJWTEwMVq1apbHY3eTJk4XYdoCoNJmammrchpQkqcDjr6LcXiXtYmpqioSEhAJLPoSGhuK9996TKdX/sMSQkPz9/eHm5obmzZujffv2kCQJwcHBaNKkCRf1ogrn9OnTckegcmrw4MH45ptvsGfPHigUCqhUKpw7dw7Tpk3D8OHD5Y7H20kkJicnJ7i6umLx4sUax2fMmIGAgABcuXJFpmRvLjMzE5UrV5Y7BgkuLi4O1tbWBSaIS5KE+Ph4rhNDJZKTk4ORI0di165dkCQJurq6yMvLw+DBg+Hn56debFQuLDEkpMqVK+PatWuwt7fXOH779m00a9ZM9vu0xaVSqbBw4UKsX78eDx8+xO3bt2Frawtvb2/Uq1cP7u7uckckwejo6CAhIaHAZPHk5GSYm5vzdhK9kZiYGISGhkKlUsHJyanA9165cO8kElLNmjURFhZW4HhYWJhQT/osWLAAfn5+WLp0qcYGkI6Ojti0aZOMyUhUL+a+vCwtLY0jffTG6tevj88++wyff/651hQYgHNiSFBffPEFxo4di9jYWLRr1w4KhQJBQUFYsmQJpk6dKne8Ytu2bRs2bNiArl274quvvlIfb9asGSIjI2VMRqKZMmUKgPxH9r29vWFoaKg+l5eXhwsXLqB58+YypSOR+fr6YuXKlYiKigIA2Nvbw8PDA2PGjJE5GUsMCcrb2xtGRkZYvnw5Zs6cCQCwsrLC3LlzMWnSJJnTFd/9+/dhZ2dX4LhKpUJOTo4MiUhUoaGhAPJHYq5du6Yxsqenp4f3338f06ZNkyseCcrb2xsrV67ExIkT0bZtWwDAX3/9BU9PT/z999+y7+/GOTEknNzcXPz6669wdXWFhYWFept4EZfpb9WqFTw8PDB06FCNNRjmzZuHEydO4M8//5Q7Iglm1KhRWL16NdeDoVJRo0YN/PDDDxg0aJDG8Z07d2LixImyL6zIkRgSjq6uLsaNG4eIiAgAYpaXF+bMmYNhw4bh/v37UKlU2LdvH27duoVt27bh8OHDcscjAW3ZskXuCFSO5OXloVWrVgWOt2zZErm5uTIk0sSJvSQkZ2dn9fC5yHr37o3du3fjjz/+gEKhwOzZsxEREcG1bohIKwwdOhTr1q0rcHzDhg0YMmSIDIk08XYSCWnPnj2YMWMGPD090bJlS1SpUkXjvDbuXE1EJJqJEydi27ZtsLa2xgcffAAAOH/+POLj4zF8+HCNbS1WrFhR5vlYYkhIhe1iLdLO1S/Lzs5GUlISVCqVxnEuTEZEcurcuXOxrlMoFDh16tQ7TlPIn8sSQyK6e/fuK8/XrVu3jJK8naioKIwePRrBwcEax0UtY0REZYkTe0lIopSU1xk5ciR0dXVx+PBhWFpaFrpIGRGRNrh37x4UCoVWbPz4AkdiSEjbtm175Xlt2JisOKpUqYLLly+jUaNGckchIipApVJhwYIFWL58OdLS0gDkPxE6depUzJo1q9Bb+2WJIzEkpMmTJ2u8zsnJwfPnz6GnpwdDQ0NhSoyDg4Ps6ywQERVl1qxZ8PX1xeLFi9G+fXtIkoRz585h7ty5yMzMxMKFC2XNx5EYKjeioqIwbtw4TJ8+Ha6urnLHKVJqaqr6f4eEhODbb7+Fj48PHB0dNWb6A+CCZUQkKysrK6xfvx5ubm4axw8cOIDx48fj/v37MiXLxxJD5UpISAiGDh2q1fsOKZVKjbkvhW3Yx4m9RKQNKleujPDwcDRo0EDj+K1bt9C8eXNkZGTIlCwfbydRuaKjo4MHDx7IHeOVTp8+LXcEIqJief/997F27VqsWbNG4/jatWvx/vvvy5TqfzgSQ0I6ePCgxmtJkpCQkIC1a9fC2toaR48elSlZycTFxcHa2rrQkZj4+HiuE0NEsgoMDETPnj1Rp04dtG3bFgqFAsHBwYiPj8cff/yBjz76SNZ8LDEkpJdnxCsUCtSsWRNdunTB8uXLYWlpKVOyktHR0UFCQgLMzc01jicnJ8Pc3Jy3k4hIdg8ePMCPP/6IyMhISJIEBwcHjB8/HlZWVnJH4+0kEtPLK9uKqrD5MACQlpaGypUry5CIiChfTk4OXFxc8PPPP8v+FFJRWGKIZDBlyhQA+SNI3t7eMDQ0VJ/Ly8vDhQsX0Lx5c5nSEREBlSpVwvXr17V6EU7uYk1CcXBwwOPHj9Wvx44di3/++Uf9OikpSaMQaKvQ0FCEhoZCkiRcu3ZN/To0NBSRkZF4//334efnJ3dMIqrghg8fDl9fX7ljFIlzYkgoSqUSiYmJ6jkkxsbGCAsLg62tLQDg4cOHsLS0FOZ206hRo7B69WquB0NEWunFLtZ2dnZo1aoVqlSponFejp2r/423k0hohXVwbR76fNmWLVvkjkBEVKTr16+jRYsWAIDbt29rnNOG77UsMURERFQobV/XinNiSCgKhaJA+9eGTwNERFT2OBJDQpEkCV27doWubv5f3YyMDPTu3Rt6enoAgNzcXDnjERGVK507d37lB8VTp06VYZqCWGJIKHPmzNF43adPnwLXfPbZZ2UVh4ioXHt5qYecnByEhYXh+vXrGDFihDyh/oVPJxEREVGJzJ07F2lpaVi2bJmsOVhiiIiIqESio6PRpk0bjXW75MCJvURERFQif/31l1ZsjcI5MURERFSofv36abyWJAkJCQkICQmBt7e3TKn+hyWGiIiICmViYqLxWqlUomHDhpg/fz5cXFxkSvU/nBNDwsvMzNSKYU0iIipbnBNDQlKpVPjuu+/w3nvvoWrVqoiNjQUAeHt7a/VmZUREIrh48SLy8vLUr18e78jKysJvv/1W1rEKYIkhIS1YsAB+fn5YunSpeqE7AHB0dMSmTZtkTEZEJL62bdsiOTlZ/drExET9YREAnj59ikGDBskRTQNLDAlp27Zt2LBhA4YMGQIdHR318WbNmiEyMlLGZERE4nt55KWwmSfaMBuFJYaEdP/+fdjZ2RU4rlKpkJOTI0MiIqKKRRv2rWOJISE1adIEf/75Z4Hje/bsgZOTkwyJiIiorPERaxLSnDlzMGzYMNy/fx8qlQr79u3DrVu3sG3bNhw+fFjueEREwrt58yYSExMB5N86ioyMRFpaGgDg0aNHckZT4yPWJCx/f3/4+Pjg8uXLUKlUaNGiBWbPnq0VaxcQEYlMqVRCoVAUOu/lxXGFQqHxBJMcWGKIiIhIw927d4t1Xd26dd9xkldjiSGhZWdnIykpCSqVSuN4nTp1ZEpERERlhXNiSEhRUVEYPXo0goODNY5ryxAnERG9eywxJKSRI0dCV1cXhw8fhqWlpVY86kdERGWLt5NISFWqVMHly5fRqFEjuaMQEZFMuE4MCcnBwUFrHvEjIipv4uLitGJF3tfhSAwJIzU1Vf2/Q0JC8O2338LHxweOjo6oVKmSxrXGxsZlHY+IqNzQ0dFBQkICzM3N5Y7ySiwxJIwX6xa88GIS779xYi8R0dtTKpVITEzU+hLDib0kjNOnT8sdgYiItAhHYkhIcXFxsLa2LnQkJj4+nuvEEBG9BaVSiQULFqBq1aqvvG7SpElllKhwLDEkpKLu1yYnJ8Pc3Jy3k4iI3oJSqUTt2rWho6NT5DUKhQKxsbFlmKog3k4iIRU2HwYA0tLSULlyZRkSERGVLyEhIZwTQ1SapkyZAiD/E4C3tzcMDQ3V5/Ly8nDhwgU0b95cpnREROWDKAuIssSQUEJDQwHkj8Rcu3YNenp66nN6enp4//33MW3aNLniERGVC6LMNGGJIaG8eEJp1KhRWL16NdeDISJ6B+bMmfPaSb3agCv2kpC2bNnCAkNE9I4MHjwY7u7uGouMvpCSkoLBgwfLPqkXYIkhIiKilyxbtgzW1taFflg0MTGBtbU1vv/+exmSaWKJISIiIg1nzpzB559/XuT5/v3749SpU2WYqHAsMURERKQhLi7ulY9X16hRA/Hx8WWYqHAsMURERKTBxMQEMTExRZ6Pjo7WinmJLDFERESkoUOHDvjhhx+KPL9mzRp89NFHZZiocNx2gIiIiDSEhoaibdu26NWrF7y8vNCwYUMAQGRkJJYuXYojR44gODgYLVq0kDUnSwwREREVcPjwYYwePRrJyckax83MzLBp0ya4ubnJlOx/WGKIiIioUBkZGTh27Biio6MhSRIaNGgAFxcXjS1f5MQSQ0RERMWmUqlw5MgR+Pr64vfff5c1Cyf2EhER0WtFRUVh5syZqF27Nvr37y93HADcO4mIiIiKkJGRgd9++w2+vr44f/488vLysHLlSowePVor9lbiSAwRERFpuHjxIsaOHQsLCwusXbsWn332GeLj46FUKtGtWzetKDAAR2KIiIjoJe3atcPEiRNx8eJF9ePV2oglhoiIiDR06dIFvr6+SEpKwrBhw+Dq6gqFQiF3rAJ4O4mIiIg0BAQE4MaNG2jYsCHGjRsHS0tLTJ48GQC0qszwEWsiIiJ6pePHj2Pz5s34/fffYW1tjf/85z/4z3/+wxV7iYiISLuMHj0aq1evhpGRkcbxJ0+eYPv27di8eTPCw8ORl5cnU8J8LDFERESkQUdHBwkJCTA3Ny/ymitXrnAkhoiIiLSLUqlEYmLiK0uMNuDEXiIiIipAmybwFoUjMURERKRBqVTCxMTktUXm8ePHZZSocFwnhoiIiAqYN28eTExM5I7xShyJISIiIg2cE0NERERCEmE+DMASQ0RERC8R5SYNbycRERGRkDixl4iIiDSMHj36tdcoFAr4+vqWQZpXZOBIDBEREf3bp59+WuS5vLw8nDhxAllZWbJvO8CRGCIiItKwf//+Qo8fOHAA//3vf6Gvr4/Zs2eXcaqCOLGXiIiIXuncuXP48MMPMXjwYPTq1QuxsbGYMWOG3LFYYoiIiKhwN27cQO/evdGpUyc0bNgQt27dwpIlS1CtWjW5owFgiSEiIqKXxMfHY9SoUWjevDl0dXURHh4OX19f1K5dW+5oGjixl4iIiDQYGhpCoVBg4sSJaNeuXZHXubm5lWGqglhiiIiISINS+fobNQqFQvank1hiiIiISEicE0NERERCYokhIiKiQu3Zswf9+vVD06ZN4ejoiH79+mHv3r1yx1JjiSEiIiINKpUKAwYMwIABA3Dz5k3Y2dnB1tYWN27cwIABAzBw4ECt2CSSK/YSERGRhlWrVuHEiRM4ePAgevXqpXHu4MGDGDVqFFavXg0PDw95Av5/nNhLREREGpo1awYPD48iN4L09fXFqlWrcO3atTJOpoklhoiIiDQYGBjg1q1bqFOnTqHn7969i0aNGiEjI6OMk2ninBgiIiLSYGBggKdPnxZ5PjU1FQYGBmUXqAgsMURERKShbdu2WLduXZHnf/zxR7Rt27YMExWOE3uJiIhIw6xZs9CpUyckJydj2rRpaNSoESRJQkREBJYvX44DBw7g9OnTcsfknBgiIiIqaP/+/Rg7diweP36scbxatWr4+eef8dlnn8mU7H9YYoiIiKhQz58/h7+/P6KiogAADRo0gIuLCwwNDWVOlo8lhoiIiITEib1ERESk4dSpU3BwcEBqamqBcykpKWjSpAn+/PNPGZJpYokhIiIiDatWrcIXX3wBY2PjAudMTEzw5ZdfYsWKFTIk08QSQ0RERBquXr2Kjz/+uMjzLi4uuHz5chkmKhxLDBEREWl4+PAhKlWqVOR5XV1d/PPPP2WYqHAsMURERKThvffee+W+SOHh4bC0tCzDRIVjiSEiIiINPXr0wOzZs5GZmVngXEZGBubMmVNgd2s58BFrIiIi0vDw4UO0aNECOjo6+Prrr9GwYUMoFApERETgxx9/RF5eHq5cuYJatWrJmpMlhoiIiAq4e/cuxo0bB39/f7yoCgqFAq6urvjpp59Qr149eQOCJYaIiIhe4cmTJ4iOjoYkSbC3t0e1atXkjqTGEkNERERC4sReIiIiEhJLDBEREQmJJYaIiIiExBJDREREQmKJISIiIiGxxBAREZGQWGKIiIhISP8PHWdOo1B8X+wAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "all_orgs = []\n", "for entities in entities_lists:\n", " all_orgs.extend([ent[0] for ent in entities if ent[1] == \"ORG\"])\n", "pd.Series(all_orgs).value_counts().head(10).plot(kind=\"bar\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unsurprisingly, the most frequently mentioned organization is the \"European Central Bank\" itself, followed by other institutions.\n", "\n", "\n", "### Combining NER with Dependency Parsing\n", "\n", "A powerful feature of spaCy is that it allows us to combine NER with dependency parsing. This means that we can not only identify the named entities in a text, but also understand how they are related to each other. \n", "\n", "Suppose we want to extract the affiliation of the speaker in the speech. We can do this by looking for the named entity that is labeled as \"PERSON\" and then checking its dependency relations to find the organization it is affiliated with." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:15:26.969971Z", "iopub.status.busy": "2026-02-23T20:15:26.969748Z", "iopub.status.idle": "2026-02-23T20:15:26.973804Z", "shell.execute_reply": "2026-02-23T20:15:26.972681Z" } }, "outputs": [], "source": [ "person_entities = [ent for ent in doc.ents if ent.label_ == \"PERSON\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The speaker is usually the first person entity mentioned in the speech, so we can take the first one from the list" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:15:26.976204Z", "iopub.status.busy": "2026-02-23T20:15:26.976006Z", "iopub.status.idle": "2026-02-23T20:15:26.979047Z", "shell.execute_reply": "2026-02-23T20:15:26.977909Z" } }, "outputs": [], "source": [ "speaker = person_entities[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also get all the organization entities in the speech" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:15:26.981352Z", "iopub.status.busy": "2026-02-23T20:15:26.981127Z", "iopub.status.idle": "2026-02-23T20:15:26.984631Z", "shell.execute_reply": "2026-02-23T20:15:26.983645Z" } }, "outputs": [], "source": [ "organization_entities = [ent for ent in doc.ents if ent.label_ == \"ORG\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we can look at the dependency relations of the speaker entity to find the organization it is affiliated with.\n", "\n", "Let's first visualize the dependencies of the first 20 tokens in the speech to get a sense of how the entities are related to each other" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:15:26.986989Z", "iopub.status.busy": "2026-02-23T20:15:26.986787Z", "iopub.status.idle": "2026-02-23T20:15:26.997313Z", "shell.execute_reply": "2026-02-23T20:15:26.996198Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", " One\n", " NUM\n", "\n", "\n", "\n", " year\n", " NOUN\n", "\n", "\n", "\n", " with\n", " ADP\n", "\n", "\n", "\n", " the\n", " DET\n", "\n", "\n", "\n", " euro\n", " NOUN\n", "\n", "\n", "\n", " Speech\n", " PROPN\n", "\n", "\n", "\n", " delivered\n", " VERB\n", "\n", "\n", "\n", " by\n", " ADP\n", "\n", "\n", "\n", " Dr\n", " PROPN\n", "\n", "\n", "\n", " Sirkka\n", " PROPN\n", "\n", "\n", "\n", " Hamalainen,\n", " PROPN\n", "\n", "\n", "\n", " Member\n", " PROPN\n", "\n", "\n", "\n", " of\n", " ADP\n", "\n", "\n", "\n", " the\n", " DET\n", "\n", "\n", "\n", " Executive\n", " PROPN\n", "\n", "\n", "\n", " Board\n", " PROPN\n", "\n", "\n", "\n", " of\n", " ADP\n", "\n", "\n", "\n", " the\n", " DET\n", "\n", "\n", "\n", " European\n", " PROPN\n", "\n", "\n", "\n", " Central\n", " PROPN\n", "\n", "\n", "\n", " Bank,\n", " PROPN\n", "\n", "\n", "\n", " \n", " \n", " nummod\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " prep\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " det\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " pobj\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " nsubj\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " relcl\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " agent\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " compound\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " compound\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " pobj\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " appos\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " prep\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " det\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " compound\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " pobj\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " prep\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " det\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " compound\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " compound\n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " pobj\n", " \n", " \n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "displacy.render(doc[:23], style=\"dep\", options={'compact': True}, jupyter=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the speaker entity is related to an organization entity through the \"appos\" relation. We can extract this information programmatically as follows" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2026-02-23T20:15:26.999999Z", "iopub.status.busy": "2026-02-23T20:15:26.999778Z", "iopub.status.idle": "2026-02-23T20:15:27.004821Z", "shell.execute_reply": "2026-02-23T20:15:27.003827Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Subtree: Member of the Executive Board of the European Central Bank\n", "Affiliation: the European Central Bank\n" ] } ], "source": [ "for child in speaker.root.children:\n", "\n", " if child.dep_ == \"appos\":\n", "\n", " # Get the subtree of the appositive relation, which should contain the affiliation information\n", " subtree_start = child.left_edge.i\n", " subtree_end = child.right_edge.i + 1\n", "\n", " # Print the text of the subtree, which should contain the affiliation information\n", " print(\"Subtree: \", doc[subtree_start:subtree_end].text)\n", "\n", " # Select the last organization entity that is mentioned in the subtree\n", " for org in reversed(organization_entities):\n", " if org.start >= subtree_start and org.end <= subtree_end:\n", " print(\"Affiliation: \", org.text)\n", " break\n", "\n", " # We only consider the first appositive relation for simplicity, but there could be multiple ones in a speech\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To make this operational and more robust can be a bit tricky, as the structure of the sentences can vary a lot across different speeches. However, dependency parsing can be a powerful tool to extract more complex relationships between entities in a text, and it can be combined with NER to get a richer understanding of the content of the speeches." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3", "path": "/usr/local/share/jupyter/kernels/python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.14" } }, "nbformat": 4, "nbformat_minor": 4 }