diff --git a/resources/equalized_odds_improvement_tutorial.ipynb b/resources/equalized_odds_improvement_tutorial.ipynb
new file mode 100644
index 00000000..88b69149
--- /dev/null
+++ b/resources/equalized_odds_improvement_tutorial.ipynb
@@ -0,0 +1,820 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "# Tutorial: EqualizedOddsImprovement Metric\n",
+ "\n",
+ "This notebook demonstrates how to use the `EqualizedOddsImprovement` metric to evaluate fairness in synthetic data generation. We'll use the Adult dataset to show how synthetic data can potentially improve fairness in machine learning models.\n",
+ "\n",
+ "## What is Equalized Odds?\n",
+ "\n",
+ "Equalized odds is a fairness criterion that requires the True Positive Rate (TPR) and False Positive Rate (FPR) to be equal across different groups defined by a sensitive attribute (like gender, race, etc.). \n",
+ "\n",
+ "The `EqualizedOddsImprovement` metric compares how well a model trained on synthetic data maintains fairness compared to a model trained on real data, both evaluated on the same validation set.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Setup and Imports\n",
+ "\n",
+ "First, let's install and import all the necessary libraries:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!pip install sdv\n",
+ "!pip install xgboost\n",
+ "!pip install matplotlib"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "All libraries imported successfully!\n"
+ ]
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "import json\n",
+ "\n",
+ "from sdv.single_table import TVAESynthesizer\n",
+ "from sdv.datasets.demo import download_demo\n",
+ "from sdv.sampling import Condition\n",
+ "\n",
+ "from sdmetrics.single_table.equalized_odds import EqualizedOddsImprovement\n",
+ "\n",
+ "print(\"All libraries imported successfully!\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Step 1: Load the Adult Dataset\n",
+ "\n",
+ "We'll use the Adult dataset from the SDV demo datasets. This dataset contains information about individuals and whether they earn more than $50K per year.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dataset shape: (32561, 15)\n",
+ "\n",
+ "First few rows:\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " age | \n",
+ " workclass | \n",
+ " fnlwgt | \n",
+ " education | \n",
+ " education-num | \n",
+ " marital-status | \n",
+ " occupation | \n",
+ " relationship | \n",
+ " race | \n",
+ " sex | \n",
+ " capital-gain | \n",
+ " capital-loss | \n",
+ " hours-per-week | \n",
+ " native-country | \n",
+ " label | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 27 | \n",
+ " Private | \n",
+ " 177119 | \n",
+ " Some-college | \n",
+ " 10 | \n",
+ " Divorced | \n",
+ " Adm-clerical | \n",
+ " Unmarried | \n",
+ " White | \n",
+ " Female | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 44 | \n",
+ " United-States | \n",
+ " <=50K | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 27 | \n",
+ " Private | \n",
+ " 216481 | \n",
+ " Bachelors | \n",
+ " 13 | \n",
+ " Never-married | \n",
+ " Prof-specialty | \n",
+ " Not-in-family | \n",
+ " White | \n",
+ " Female | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 40 | \n",
+ " United-States | \n",
+ " <=50K | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 25 | \n",
+ " Private | \n",
+ " 256263 | \n",
+ " Assoc-acdm | \n",
+ " 12 | \n",
+ " Married-civ-spouse | \n",
+ " Sales | \n",
+ " Husband | \n",
+ " White | \n",
+ " Male | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 40 | \n",
+ " United-States | \n",
+ " <=50K | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 46 | \n",
+ " Private | \n",
+ " 147640 | \n",
+ " 5th-6th | \n",
+ " 3 | \n",
+ " Married-civ-spouse | \n",
+ " Transport-moving | \n",
+ " Husband | \n",
+ " Amer-Indian-Eskimo | \n",
+ " Male | \n",
+ " 0 | \n",
+ " 1902 | \n",
+ " 40 | \n",
+ " United-States | \n",
+ " <=50K | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 45 | \n",
+ " Private | \n",
+ " 172822 | \n",
+ " 11th | \n",
+ " 7 | \n",
+ " Divorced | \n",
+ " Transport-moving | \n",
+ " Not-in-family | \n",
+ " White | \n",
+ " Male | \n",
+ " 0 | \n",
+ " 2824 | \n",
+ " 76 | \n",
+ " United-States | \n",
+ " >50K | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " age workclass fnlwgt education education-num marital-status \\\n",
+ "0 27 Private 177119 Some-college 10 Divorced \n",
+ "1 27 Private 216481 Bachelors 13 Never-married \n",
+ "2 25 Private 256263 Assoc-acdm 12 Married-civ-spouse \n",
+ "3 46 Private 147640 5th-6th 3 Married-civ-spouse \n",
+ "4 45 Private 172822 11th 7 Divorced \n",
+ "\n",
+ " occupation relationship race sex capital-gain \\\n",
+ "0 Adm-clerical Unmarried White Female 0 \n",
+ "1 Prof-specialty Not-in-family White Female 0 \n",
+ "2 Sales Husband White Male 0 \n",
+ "3 Transport-moving Husband Amer-Indian-Eskimo Male 0 \n",
+ "4 Transport-moving Not-in-family White Male 0 \n",
+ "\n",
+ " capital-loss hours-per-week native-country label \n",
+ "0 0 44 United-States <=50K \n",
+ "1 0 40 United-States <=50K \n",
+ "2 0 40 United-States <=50K \n",
+ "3 1902 40 United-States <=50K \n",
+ "4 2824 76 United-States >50K "
+ ]
+ },
+ "execution_count": 69,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Load the adult dataset\n",
+ "real_data, metadata = download_demo('single_table', 'adult')\n",
+ "\n",
+ "print(f\"Dataset shape: {real_data.shape}\")\n",
+ "print(f\"\\nFirst few rows:\")\n",
+ "real_data.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 2: Introduce Data Bias\n",
+ "\n",
+ "We'll introduce bias to the data by setting the label of 95% of female rows as '<=50K', while the other 5% are '>50K'. The labels are randomly chosen, ie they have no correlation with the data besides the gender column.\n",
+ "\n",
+ "For male rows the opposite will be done, ie 5% of the data labels will be '<=50K' and 95% will be '>50K'."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "female_mask = real_data['sex'] == 'Female'\n",
+ "num_females = female_mask.sum()\n",
+ "\n",
+ "female_labels = np.random.choice(['<=50K', '>50K'], size=num_females, p=[0.95, 0.05])\n",
+ "real_data.loc[female_mask, 'label'] = female_labels\n",
+ "\n",
+ "male_mask = real_data['sex'] == 'Male'\n",
+ "num_males = male_mask.sum()\n",
+ "\n",
+ "male_labels = np.random.choice(['<=50K', '>50K'], size=num_males, p=[0.05, 0.95])\n",
+ "real_data.loc[male_mask, 'label'] = male_labels\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAHqCAYAAADVi/1VAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAcqRJREFUeJzt3Qm4TeX7//H7mIcMIVOZijLLUKKIiKLiS4pMlaH6kSlD+kqGQsqQEk1oINKgogwJKVTmISQRlakyRJn3//o832vt/97HOcdxnLP2Gd6v61r22WutvfazB3s/+173cz9RgUAgYAAAAAAAAICP0vl5ZwAAAAAAAIAQlAIAAAAAAIDvCEoBAAAAAADAdwSlAAAAAAAA4DuCUgAAAAAAAPAdQSkAAAAAAAD4jqAUAAAAAAAAfEdQCgAAAAAAAL4jKAUAAAAAAADfEZQCcF47d+60qKgomzJlSpLfl+5D96X79BQvXtzuuOMO88PixYvd/evSb34+zuTm//7v/+zWW29NtOM9/vjjVr169UQ7HgAAidGnuP/++933PZLOoEGD3PPuhzp16rgl+mv+/vvv+3L/vJ+QGhCUQprhBTtWrlxpaZ2eB2/JkCGD5cmTx6pWrWrdu3e3H374IdHu5+WXX/YlkJXa2pbUDhw44F7r0qVLW9asWS1//vx2/fXXW79+/ezo0aO+t2fHjh32+uuv2xNPPBFcd+LECXv00UftsssusyuuuMKefvrpc27366+/2iWXXGLffPPNOdt69Ohh69ats08++STJ2w8ASBqbNm2yNm3a2OWXX26ZM2e2woULW+vWrd361E6BjvLly1ta5/XfvSVLlizufdCwYUMbN26c/f3334lyP7///rsLZq1du9aSm+TcNiAxZEiUowBIcZSV0q5dOwsEAnb48GH3A/7NN990wZpnn33WevXqFdy3WLFi9u+//1rGjBkv6D50rHz58rmzOPHVtm1ba9mypet8JqXY2la7dm33WDNlymSp0V9//WXVqlWzI0eO2IMPPugCU3/++aetX7/eJkyYYI888ogL9PjphRdesBIlSljdunWD65577jl766237L///a/rcA4ZMsSuuuoqa9WqVXCfPn362F133WU33njjOccsWLCgNWnSxJ5//nm3DwAgZfnwww/dZ75OnHXo0MF9TyiL+o033nBZKNOnT7f//Oc/kW4mfKJ+gN4Dp06dsr1797qMJJ2AGj16tDsBVbFixeC+AwYMcBnTFxr4GTx4sMs6uvbaa+N9u/nz51tSi6ttr732mp09ezbJ2wAkJYJSQBp19dVXu7OPoUaMGGF33nmnPfbYYy5Y0ahRI7feOzOVlI4dO2bZs2e39OnTuyVS0qVLl+SPNZLUmd+1a5fLLqpZs2bYNgWq/A7GqXM5depUe/jhh8PWz549270P+/bt667v3r3bdTq9oNTXX39tn376qW3ZsiXWY99zzz3WokUL+/nnn+3KK69M4kcCAEgs27dvdyep9Nn91VdfuaxZjzJ9a9Wq5bbrhIqfn+9eXwX+u/32291JNU///v3tyy+/dGUPdPJp8+bNLvtbNApAS1L6559/LFu2bBE/iXmhJ4yB5Ijhe0jTlCWjrJDffvvNmjZt6v5Wx6d379525syZsH11FkIZHRUqVHBBC+132223hQ0HPH36tA0dOtRldCjTR2c0NCRJQ5Fiqh2kszz6gtWXqI7r1RzQ2UHvfjSsbs2aNee0XT/G7777bncGUfvpOBc7VClv3rzuzKO+yJ955pk4a0rpLNUDDzzghlbpsRYqVMhlpni1oPQYlV6/ZMmSYMq1N+beS8XWNtUS0vAxHSe2mlKhZ6N0hkiPt2zZsu55ik8NgejHjKttsdWUmjlzpnst9Fopw0oBPb1vEvp+iktcj1MBFrVvzJgx59xu2bJlbtu7774bZ0dfQb8bbrjhnG05c+Y8JyD37bffuvd5rly5XOfr5ptvDhsu53UClXUXSkEj3Y+GBMZF+/3xxx9Wv379sPXKVrv00kuD1/U+VwfQ+7+oHyUKWHnvm5h4x/z444/jbAMAIHlRtqw+81999dWwgJToO/iVV15xAaKRI0e6dcqc8voV0Wlfbdu4ceMF9aHi6qv88ssvbt0111zjvgPVf9JJkJj6LolJ7enatavNmjXLDe1T/6tcuXI2d+7cc/ZVX0QZZhrqpv2UZaRs6JMnT4b1KdRuPQ/6jlffYM6cOWHH8fpF7733nsvW0VDKHDlyuOdPmfbq4ypjSc+P+j3qG0bv98o777wT7Efp/pQVrxNOF+OWW26xJ5980r0eOn5c/cEFCxbYTTfdZLlz53bt1GvnlQ3QY7zuuuvc32q/1zf0+r3eUMpVq1a5jHo9V95to9eU8qjfp32Uua1ApgJn0R+v+qMxjSYIPeb52hZTTSn939CJvSJFirjXXo9VmeMaHZHQ9xOQlAhKIc3Tl4bGpatDoQ9s/egeNWqU6wiF0he7vnT1Aa/hbUoLVkdmxYoVwX06duxoAwcOtCpVqriggY41fPhw98Ub3U8//WT33Xefy0zSPgcPHnR/K2ukZ8+eLuihL38FEZTxEZqaq4CKOg4KCKgdaq++8BQI+eijjy7q+ShatKhrtx6XMmdi07x5c3df+oLUULhu3bq5YVbKwpGxY8e6zpsyrt5++223aChWKHXoVMNKz9n50qy3bdtm9957rztTpudLgTN1pNTJuFDxaVsoffHrNVCQRffdqVMnFyhS5+bQoUMJej8l9HHqjLCGq+l9Ep3WqaOo4GBsNBRTbdRjPh+dgVTnS++Dp556yoYNG+YerzqB3333ndunTJkyLhCr43kdenWG1EnS86t0+7h4gbTKlSuHrVcHTM/Zhg0bbPny5S7QprpXXraXAlkavhcXBdIUII6p5hQAIPlSJqx+aCsjKib6btJ2L4DSuHFjF2hQ4CS6GTNmuB/aXn2mC+1DxdRX+f777933l/p3qmukbN+FCxe6QIJ3AiWp6GSO2qT7VlDu+PHjrk+mofihw730nakTjepTqI3KLFOAzWvfvn37XMb0vHnz3PF0MlLHUvAkpudBfRLtq+dAw//VD9Lj1t8//vijCwQ1a9bM9ZnUTw6lY+vkValSpdxwO/Wn9XzpdYzej7pQelznG0an11wngxUsU79Er7kep9c/UF/G66907tw52DdU+zx6ftU300lD9SNDSw7ERI9Z70+dnFMfWf04nSzTSbcLEZ+2hVLgSY9Nv0N0UlHPt4JS6jOFlua4kPcTkOQCQBoxefJknR4IfP/998F17du3d+uGDBkStm/lypUDVatWDV7/8ssv3X7dunU757hnz551l2vXrnX7dOzYMWx779693Xodw1OsWDG3btmyZcF18+bNc+uyZs0a+OWXX4LrX3nlFbd+0aJFwXX16tULVKhQIXD8+PGwdtSsWTNQqlSp8z4XOl6XLl1i3d69e3e3z7p169z1HTt2uOt6DuXgwYPu+nPPPRfn/ZQrVy5w8803x/pa3HTTTYHTp0/HuE33Gf35+uCDD4LrDh8+HChUqJB7rTxPPfWU2y+2+ws9Zmxt0/Mc+nyfPHkykD9//kD58uUD//77b3C/2bNnu/0GDhx4we+n2MT3cXrvic2bNwfXqZ358uVzbYjL3r17A5dddpm7fenSpQMPP/xwYNq0aYFDhw6F7af3k95LDRs2DL7H5Z9//gmUKFEicOuttwbXnTlzxr2WBQoUCPzxxx/uvZUhQ4aw/2uxadOmTSBv3rznrN+9e7d7jdROLbVq1Qr8/fffrp1q//Tp0wPx0aBBg0CZMmXitS8AIPL0Oa/P/SZNmsS531133eX2O3LkiLveqlUr930d2q/Ys2dPIF26dGHfy/HtQ8XVV9F3YXTLly93+7/11lux9ilE39P6vj8f9VH0PRhKx8qUKVPgp59+Cq5TX03rX3zxxeC6du3auccd0/ew953eo0cPd7ulS5cGt+l7Vt/xxYsXd9/toY9B/SD1NTx6vqOiogK333572PFr1KgR9vh27twZSJ8+feCZZ54J22/Dhg2urxB9fXz679HlypUrzv7gmDFj3PUDBw7EegwdP7SvG/210LaJEyfGuC20P+k9X5dffnnwvSnvvfeeW//CCy8E1+l5iqnfFv2YcbUt+vtp1qxZbt+nn346bL+7777bvV6h7534vp+ApEamFGB2Tj0bnZlTSrPngw8+cNkcyhaJzksP/uyzz9xl9LMQSp+V6OnQGpZVo0aN4HVv+nploShbKfp6rz0qVK0MFmXuKDNJGSNadEZDGTrKtIk+rOxCeYWuY5vRRKnXGkOvlGJleCWUMo7iWz9K6eehBU011Exn3TS0UUMJk4qGZ+7fv9+dRQod2qazssoEiv66xuf9dLGPU6+92hKaLaWzl3ofRK8TFl2BAgVcUXu1Ua/dxIkTXcae0u6V8eSldmuGF72XtE3vLe99piyoevXquRofXvae6nDpzKhm7tNZRGXOqdZDaO2H2OjYocP0PMpk02PWojOceq/pfansQZ3x05lfnd3T/w9lL+osZOiQBI+OrXYDAFIGr++hzN+4eNu9rG59L+j7OnT4vYb16btK2xLah4qpr+LVLvJqI+r2JUuWdEPDVq9ebUlJ2TbKAvaowLf6Cl4/Q49Xw7GUfR/T93Bov1XZVMr69uh7Vtk4GoYYfTZm9UVC6xfp+1d9BmVKhdJ6DVNTSQtRRpXapOfce761aFibMqcWLVp00c+J2h3XLHx6Xbzh/AktCq6hbRodEF96vkLfwxruqFIX3u+FpKLj6/2qflH03yN6vT7//PMLej8BfiAohTTPqw8V/YdsaLBFQ+gULNAY+NhoPLt+nKtTEkpfuvoy1PZQoYEnb6iR6Ad2TOu99mjYn75UNIZe7Q5dvKCZOmUXQ8GFuDqE+mJWara+2BTkUAqxUn4vNDik+gbxpec1en0AFWuXpKzh4L1uCoREp6BU9Nc1Pu+ni32cej+pszlt2rTgPgpQqc6Dgprno06RZtrbs2ePbd261aX1q80amqChcaKOubRv3/6c99nrr7/uUuBVS8KjDo1S9zWkQcMk9P6Mr+g1Djzq/CpNXgFc/d9SDRAFvFTbTT8sFBjUcAvV+1JafGgdtNBjx1RnDACQPHl9j7iCDKHbvf29+ocarufR3/oe8b5HE9KHiqmvoiFY+s70avaozpWOoaFood+NSSF6/zF6P+PAgQMuUOcNV4yN+i8x9W00XMzbntB+qwI/3vOg/oSecwWgoj/nGkJ5sX1Wr98aVxBTQUmVPlCZDfVbNVRNQz0vJEClPtaFFDXX4w2lvoj6eEldd0yvm36zRH8+4vu6Xmi/FUgMzL6HNC+xZ3qL7w/g2O43tvXeD3fvC1TFs3VWLybRA2MXSsVA1Y64gkaqB6DAiM7GKUtHHTzVG9AZyOj1gWITeqYxKZ/7CykyfrH8mjlQZ+AUjFFNCxXFVz0nZXMpeHMhz5c66loU4FEHSsEtddq895mKzcY2NbKXUefx6jmoloXOGisgez6qvRXfjo9Xa00121RPQUFiZWSJip4rKKVMqlA6tn4sAABSBgU1dPJEM+vFRdsVKFBWhyg45NWF0gkM1UxSzSDVQ/QkpA8VU1/l0UcftcmTJ7u+kLLe1WZ9pyrYkdBMnPg6Xz/R7/uNT79Vz41OZMa0b/S+xIX69ddfXQAsrr6vXkNleCsrSxnuKuStgKVO5KnvEp++W2L3Wc/Xb/WrPxmp9xMQiqAUEA/KAlHgRdkZsWVLqYC0vnh1Rsg7GyHqFOnMmbYnBm/qY2WRRJ+xLDGoULkKYaqTdb7UeT0vSgfWoset4IWKR3ozoCRmhop3djP0mCqsKd6sI94wMD3fXqp2TGeFLqRt3uumjKLoWUhal1iv64U8Tu+MsM4yKoikVHkVLvWKfSb0faXnT9lT4qVyq7Mfn/eZhgF62UoKTj700EPxmvVO2WZ6DOpQemddYzJ79mwXgPMyuBT40o8Wj84KxjRsdceOHVapUqXztgMAkHyoKPVrr73mhmmHDi/zLF261GWc6LsmekbMm2++6YpoKwtH36fe0L3E7ENpWKAyidXn8ahA9MUW7U4M6hvouzt0tsGYqP+ifkx0ykr2ticG9Sf0OuhEp5exlpi8iVtiCzJ6dNJO5Qe0qPi3gpWa5EaBKr0XEjur2uuvePQcqI+n4XEe9bties+o3+q9V+VC2qbX7YsvvnCZhKH9+MR+XYHExPA9IB40C4W+TKJnYYSeSWjUqJG71IwcofTFJ8pESQyq/aPZXTTFsRdACKW07YRS0K1Vq1buDE1cs9EpAKLOV/ROh778QqcB1mw2idVBUxAidDYYpaa/9dZbLhDmZeR4gRSdDfOoBpI6qNHFt22qx6DnXEGX0MemM37q8CbW63ohj1M0K59eK6Wfq56TsqVCOzqx+fbbb91zEp1m01N2k5fKr2mb9XxqBkFvOGds7zMFfjSri/6faPpj3UaZW2r3+Sj4qf9DmmY5NqoVpVptAwYMcK+FKP1enTuvZoVei+iZWQp0aeitZhcCAKQc+k5RZoqCTtFnAVNfRXURs2XLds4srAou6OShsmC0qGZSaNZ3YvWhlF0SPZPkxRdf9DUzO67gizLGNIOh6mLG1W/Vd79muPWof6CZb3USTEPnE4Nm5NPzpT509OdM1y9mljdl56sepl7j1q1bx7qf3jPReVngXt9O/UJJrH6r+kChQ1AVyNR7TrU3Pepnabbr0JqYOgmnmlyhLqRtel31PnzppZfC1ms2PgW3Qu8fSC7IlALiQdO+KgtFtXd05kNZKsqK0pk6bevatavLxtBZM32Z60vj5ptvdl/2Coioc3C+qWMvxPjx492ZQwUiVIBTZ1OUkaWOhdKYVcj6fJR9o4wmdQgU+NBtNBxMAQgF0vQY47qtzjSpaKU6LQqQKJCiNih13aPAhmoXPf300y6tWp3B+NQ8ionOrnXo0MHVLFJAYtKkSe7+lD7vadCggRsbr/3UUVUnSPvprKEywELFt206m6r6WSpuqddUgSDdr+oaqdOmIWWJKT6PM3QIn96TOssXffrluM4oKjNJxdT1HKg+ggI6uh/Vw1JQyevUqnaUOi+qEaXHr2ESykbS/eksrDq8XpFT/XjQ8yn6EaHJAbp37+5+ICiLKTZ6H2sIn87qxfbe0HMtOl5op6tLly6uELuCTuqUathhKB1T7WvSpEm8nhsAQPKg4eTqPynQoL6OvhcVeFB2lGofqlD2u+++G1ag2fvOVhBk+vTpLsCikyRJ0YdSJpe+T5Xhq36QbqvvHH2fJQfKAtKwNPVbVLhcGfwKiKifp+wzZZM//vjj7jnU97yKYiuYp+dcJ5r0HX4h5QDiotdIfS0Nt9frpz6xTmLqftR3VPs0nPJ8dDJQ2T46GaXXSwEpZWgr80cnwkIno4luyJAh7oSlTiRqf9Wx0hBPTariZeKpnXpedBJS7VMgSJnoF1L/NJSeTx1b/Se1Vyet1d/Ue86jfouCVepzq0+tE2nqm0d/X19I21RaQ785dHJZz7d+n+i9oOx1DTeNfmwgWUjy+f2AZCKmKWU1jWr27NnP2Tf6VLKi6YCfe+65QOnSpd30qZqWXtPgrlq1KrjPqVOnAoMHD3bT6WbMmDFQpEiRQP/+/cOmHRZN3dq4ceNz7lf32aVLl7B1O3bscOt136G2b9/upvwtWLCguy9NPXvHHXcE3n///fM+Fzqet2jK4Ny5c7updLt37x7YtGnTOft7bfCmov3jjz9cO/Vc6PnTVLzVq1d3092G2rt3r3ucOXLkcLf3preNa3pfb5vuM/rzNW/evEDFihUDmTNndvc9c+bMc26v10Nt0WtUtGjRwOjRo2M8Zmxti2n6ZpkxY4Z7jnTfefLkCbRu3Trw66+/hu1zIe+nmFzI4/Roumi9htHbEpv169cH+vTpE6hSpYp7HJqOuVChQoEWLVoEVq9efc7+a9asCTRr1iyQN29e1x618Z577gksXLjQbdfUxnpsH3zwQdjtdu3aFciZM2egUaNG521Tt27dAiVLloxxm14nvUaffPLJOds+//xz9/zo/av/C8eOHQvbfu+997qpvAEAKZO+s1q1auW+p9TXUZ9H1zds2BDrbRYsWOC+l6KiogK7d++OcZ/49KHi6qscPHgw8MADDwTy5csXuOSSSwINGzYMbNmyxX1Hqi/gialPoe3a73zUL9F3/Pn6iRL9fuWXX35xj1H9VX1/X3nlle62J06cCHse7r77bvc9miVLlsD1118fmD17dthxvMcQvS8S2/Pj9XkOHDgQtl79BH0nq5+kRd/fas/WrVvjfB68+/EW9e/0ut16662uD3LkyJHz9rvUZ2nSpEmgcOHC7va61Pvoxx9/DLvdxx9/HChbtqzrG4X2e2N6LTza5vUhQ5+vd9991/0GyJ8/fyBr1qyuf6fXJLpRo0a5959eoxtvvDGwcuXKc44ZV9tiej/9/fffgZ49e7rHqfd3qVKl3O+Is2fPJvj9BCSlKP0T6cAYACBhVFReZ+NUPyOl0rTDqi2ls6DKwEsMmglSZxB1tpxMKQAAACB5oqYUAKRQqhWxdu1aN4wvJdPQCQ3NGDFiRKIdU2nyGppBQAoAAABIvsiUAoAURjPqqDC4Zv1RXQ1lGsVVSwEAAAAAkiMypQAghVFRTBXOPHXqlCtSSkAKAAAAQEpEphQAAAAAAAB8R6YUAAAAAAAAfEdQCgAAAAAAAL7LYKnc2bNn7ffff7ccOXJYVFRUpJsDAAAiRBUL/v77bytcuLClS8d5uaRAvwsAAFxIvyvVB6XUMSpSpEikmwEAAJKJ3bt32xVXXBHpZqRK9LsAAMCF9LtSfVBKZ+q8JyJnzpyRbg4AAIiQI0eOuICJ1zdA4qPfBQAALqTfleqDUl7quDpGdI4AAADDypIO/S4AAHAh/S4KKgAAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAAN8RlAIAAAAAAIDvCEoBAAAAAADAdwSlAAAAAAAA4DuCUgAAAAAAAPAdQSkAAAAAAAD4jqAUAAAAAAAAfEdQCgAAAAAAAL4jKAUAAAAAAADfEZQCAAAAAACA7whKAQAAAAAAwHcZ/L9LRELxx+dYWrZzRONINwFAcjAoV6RbEHmDDke6BUCqltb7XPgf+p4AED9kSgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAAN8RlAIAAAAAAIDvCEoBAAAAAADAdwSlAAAAAAAA4DuCUgAAAAAAAPAdQSkAAAAAAAD4jqAUAAAAAAAAfEdQCgAAAAAAAL4jKAUAAAAAAADfEZQCAAAAAACA7whKAQAARMjw4cPtuuuusxw5clj+/PmtadOmtnXr1rB9jh8/bl26dLG8efPaJZdcYs2bN7d9+/aF7bNr1y5r3LixZcuWzR2nT58+dvr06bB9Fi9ebFWqVLHMmTNbyZIlbcqUKee0Z/z48Va8eHHLkiWLVa9e3b777rskeuQAAAAEpQAAACJmyZIlLuC0YsUKW7BggZ06dcoaNGhgx44dC+7Ts2dP+/TTT23mzJlu/99//92aNWsW3H7mzBkXkDp58qQtW7bM3nzzTRdwGjhwYHCfHTt2uH3q1q1ra9eutR49eljHjh1t3rx5wX1mzJhhvXr1sqeeespWr15tlSpVsoYNG9r+/ft9fEYAAEBaEhUIBAKWih05csRy5cplhw8ftpw5c1paVfzxOZaW7RzRONJNAJAcDMoV6RZE3qDDllalhD7BgQMHXKaTgk+1a9d2bb3sssts2rRpdvfdd7t9tmzZYmXKlLHly5fbDTfcYJ9//rndcccdLlhVoEABt8/EiROtX79+7niZMmVyf8+ZM8c2btwYvK+WLVvaoUOHbO7cue66MqOUtfXSSy+562fPnrUiRYrYo48+ao8//niqeY6TWlrvc+F/6HsCSOuOxLNPQKYUAABAMqGOm+TJk8ddrlq1ymVP1a9fP7hP6dKlrWjRoi4oJbqsUKFCMCAlynBSZ3DTpk3BfUKP4e3jHUNZVrqv0H3SpUvnrnv7AAAAJLYMiX5EAAAAXDBlJmlY3Y033mjly5d36/bu3esynXLnzh22rwJQ2ubtExqQ8rZ72+LaR4Grf//91w4ePOiGAca0jzKzYnPixAm3eHQ8AACA+CJTCgAAIBlQbSkNr5s+fbqlpELtSs33Fg33AwAAiC+CUgAAABHWtWtXmz17ti1atMiuuOKK4PqCBQu6oXWq/RRKs+9pm7dP9Nn4vOvn20c1HrJmzWr58uWz9OnTx7iPd4yY9O/f3w059Jbdu3cn+DkAAABpD0EpAACACNF8MwpIffTRR/bll19aiRIlwrZXrVrVMmbMaAsXLgyu27p1q+3atctq1Kjhrutyw4YNYbPkaSY/BZzKli0b3Cf0GN4+3jE0RFD3FbqPhhPqurdPTDJnzuzuJ3QBAACIL2pKAQAARHDInmbW+/jjjy1HjhzBGlAaCqcMJl126NDBevXq5YqfK+ij2fAUKNLMe9KgQQMXfGrbtq2NHDnSHWPAgAHu2AoaycMPP+xm1evbt689+OCDLgD23nvvuRn5PLqP9u3bW7Vq1ez666+3sWPH2rFjx+yBBx6I0LMDAABSO4JSAAAAETJhwgR3WadOnbD1kydPtvvvv9/9PWbMGDcTXvPmzV1Rcc2a9/LLLwf31bA7Df175JFHXLAqe/bsLrg0ZMiQ4D7KwFIAqmfPnvbCCy+4IYKvv/66O5bn3nvvtQMHDtjAgQNdYOvaa6+1uXPnnlP8HAAAILFEBZQ3noppFhidZVSdg7ScUl788f9/JjQt2jmicaSbACA5GJQr0i2IvEGHLa2iT5D0eI7pc+F/6HsCSOuOxLNPQE0pAAAAAAAA+I6gFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAAN8RlAIAAAAAAIDvCEoBAAAAAADAdwSlAAAAAAAA4DuCUgAAAAAAAPAdQSkAAAAAAAD4jqAUAAAAAAAAfEdQCgAAAAAAAL4jKAUAAAAAAADfEZQCAAAAAACA7whKAQAAAAAAwHcEpQAAAAAAAOA7glIAAAAAAADwHUEpAAAAAAAA+I6gFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAQNoKSp05c8aefPJJK1GihGXNmtWuuuoqGzp0qAUCgeA++nvgwIFWqFAht0/9+vVt27ZtkWw2AAAAAAAAUnJQ6tlnn7UJEybYSy+9ZJs3b3bXR44caS+++GJwH10fN26cTZw40b799lvLnj27NWzY0I4fPx7JpgMAAAAAAOAiZLAIWrZsmTVp0sQaN27srhcvXtzeffdd++6774JZUmPHjrUBAwa4/eStt96yAgUK2KxZs6xly5aRbD4AAAAAAABSYqZUzZo1beHChfbjjz+66+vWrbOvv/7abr/9dnd9x44dtnfvXjdkz5MrVy6rXr26LV++PMZjnjhxwo4cORK2AAAAAAAAIHmJaKbU448/7oJGpUuXtvTp07saU88884y1bt3abVdASpQZFUrXvW3RDR8+3AYPHuxD6wEAAAAAAJAiM6Xee+89mzp1qk2bNs1Wr15tb775pj3//PPuMqH69+9vhw8fDi67d+9O1DYDAAAAAAAghQel+vTp47KlVBuqQoUK1rZtW+vZs6fLdpKCBQu6y3379oXdTte9bdFlzpzZcubMGbYAAAAkR1999ZXdeeedVrhwYYuKinI1M0NpXUzLc889F9xHNTmjbx8xYkTYcdavX2+1atWyLFmyWJEiRdxEMtHNnDnTZa9rH/XLPvvssyR85AAAABEOSv3zzz+WLl14EzSM7+zZs+7vEiVKuOCT6k55NNxPs/DVqFHD9/YCAAAkpmPHjlmlSpVs/PjxMW7fs2dP2DJp0iQXdGrevHnYfkOGDAnb79FHHw3rOzVo0MCKFStmq1atcgGtQYMG2auvvho2+UyrVq2sQ4cOtmbNGmvatKlbNm7cmISPHgAApHURrSmlM4OqIVW0aFErV66c6wSNHj3aHnzwQbddna4ePXrY008/baVKlXJBqieffNKdTVRHCQAAICXT5C7eBC8xiZ4Z/vHHH1vdunXtyiuvDFufI0eOWLPIVSrh5MmTLqCVKVMm1+dau3at63N17tzZ7fPCCy/Ybbfd5rLYZejQobZgwQJ76aWXbOLEiYnwSAEAAJJZptSLL75od999t/3f//2flSlTxnr37m0PPfSQ6wh5+vbt6872qdN03XXX2dGjR23u3LkutRwAACCtUPmCOXPmuGym6DRcL2/evFa5cmWXCXX69OngNs1YXLt2bReQ8jRs2NC2bt1qBw8eDO4TOtuxt09ssx17mPUYAACk2EwpndUbO3asW2KjbCmlpGsBAABIqzQRjPpOzZo1C1vfrVs3q1KliuXJk8cNw9OkLxrCp0wo0YzFyjYP5c1srG2XXnqpu7yQ2Y49zHoMAABSbFAKAAAA8aPhd61btz4nW7xXr17BvytWrOgyopR5roCRJoBJSgqAhd6/MqVUSB0AACA+CEoBAAAkc0uXLnXD7WbMmHHefatXr+6G7+3cudOuueYaV2sqppmMxatDFds+sdWp8ijoldSBLwAAkHpFtKYUAAAAzu+NN96wqlWrupn6zkdFzDW7cf78+d11zVj81Vdf2alTp4L7qIi5AlYauuftEzrbsbcPsx0DAICkRFAKAAAgQjSBi4JIWmTHjh3u7127doUNiZs5c6Z17NjxnNurELlqc65bt85+/vlnN9Nez549rU2bNsGA03333eeG9KlA+qZNm1y2lWbbCx121717dzeRzKhRo2zLli02aNAgW7lypXXt2tWX5wEAAKRNDN8DAACIEAV+6tatG7zuBYrat29vU6ZMcX9Pnz7dAoGAtWrV6pzba+ictiuIpJnwVNBcQanQgFOuXLls/vz51qVLF5dtlS9fPhs4cKCb2dhTs2ZNmzZtmg0YMMCeeOIJK1WqlM2aNcvKly+fxM8AAABIy6IC6uWkYjq7qM7Y4cOHLWfOnJZWFX98jqVlO0c0jnQTACQHg3JFugWRN+iwpVX0CZIezzF9LvwPfU8Aad2RePYJGL4HAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAAN8RlAIAAAAAAIDvCEoBAAAAAADAdwSlAAAAAAAA4DuCUgAAAAAAAPAdQSkAAAAAAAD4jqAUAAAAAAAAfEdQCgAAAAAAAL4jKAUAAAAAAADfEZQCAAAAAACA7whKAQAAAAAAwHcEpQAAAAAAAOA7glIAAAAAAADwHUEpAAAAAAAA+I6gFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAAN8RlAIAAAAAAIDvCEoBAABEyFdffWV33nmnFS5c2KKiomzWrFlh2++//363PnS57bbbwvb566+/rHXr1pYzZ07LnTu3dejQwY4ePRq2z/r1661WrVqWJUsWK1KkiI0cOfKctsycOdNKly7t9qlQoYJ99tlnSfSoAQAA/oegFAAAQIQcO3bMKlWqZOPHj491HwWh9uzZE1zefffdsO0KSG3atMkWLFhgs2fPdoGuzp07B7cfOXLEGjRoYMWKFbNVq1bZc889Z4MGDbJXX301uM+yZcusVatWLqC1Zs0aa9q0qVs2btyYRI8cAADALEOkGwAAAJBW3X777W6JS+bMma1gwYIxbtu8ebPNnTvXvv/+e6tWrZpb9+KLL1qjRo3s+eefdxlYU6dOtZMnT9qkSZMsU6ZMVq5cOVu7dq2NHj06GLx64YUXXPCrT58+7vrQoUNdkOull16yiRMnJvrjBgAAEDKlAAAAkrHFixdb/vz57ZprrrFHHnnE/vzzz+C25cuXuyF7XkBK6tevb+nSpbNvv/02uE/t2rVdQMrTsGFD27p1qx08eDC4j24XSvtoPQAAQFIhUwoAACCZUvZSs2bNrESJErZ9+3Z74oknXGaVgkXp06e3vXv3uoBVqAwZMliePHncNtGlbh+qQIECwW2XXnqpu/TWhe7jHSM2J06ccEvoUEEAAID4IigFAACQTLVs2TL4t4qPV6xY0a666iqXPVWvXj2LtOHDh9vgwYMj3QwAAJBCMXwPAAAghbjyyistX7589tNPP7nrqjW1f//+sH1Onz7tZuTz6lDpct++fWH7eNfPt09staw8/fv3t8OHDweX3bt3J8KjBAAAaQVBKQAAgBTi119/dTWlChUq5K7XqFHDDh065GbV83z55Zd29uxZq169enAfzch36tSp4D4qYq4aVRq65+2zcOHCsPvSPlp/viLsOXPmDFsAAADii6AUAABAhBw9etTNhKdFduzY4f7etWuX26bZ8FasWGE7d+50QaMmTZpYyZIlXRFyKVOmjKs71alTJ/vuu+/sm2++sa5du7phf5p5T+677z5X5LxDhw62adMmmzFjhpttr1evXsF2dO/e3c3iN2rUKNuyZYsNGjTIVq5c6Y4FAACQVAhKAQAARIgCP5UrV3aLKFCkvwcOHOgKma9fv97uuusuu/rqq11QqWrVqrZ06VKXoeSZOnWqlS5d2tWYatSokd1000326quvBrfnypXL5s+f7wJeuv1jjz3mjt+5c+fgPjVr1rRp06a521WqVMnef/99mzVrlpUvX97nZwQAAKQlFDoHAACIkDp16lggEIh1+7x58857DM20p4BSXFQgXcGsuLRo0cItAAAAfiFTCgAAAAAAAL4jKAUAAAAAAADfEZQCAAAAAACA7whKAQAAAAAAwHcEpQAAAAAAAOA7glIAAAAAAADwHUEpAAAAAAAA+I6gFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAgLQXlPrtt9+sTZs2ljdvXsuaNatVqFDBVq5cGdweCARs4MCBVqhQIbe9fv36tm3btoi2GQAAAAAAACk4KHXw4EG78cYbLWPGjPb555/bDz/8YKNGjbJLL700uM/IkSNt3LhxNnHiRPv2228te/bs1rBhQzt+/Hgkmw4AAAAAAICLkMEi6Nlnn7UiRYrY5MmTg+tKlCgRliU1duxYGzBggDVp0sSte+utt6xAgQI2a9Ysa9myZUTaDQAAAAAAgBScKfXJJ59YtWrVrEWLFpY/f36rXLmyvfbaa8HtO3bssL1797ohe55cuXJZ9erVbfny5RFqNQAAAAAAAFJ0UOrnn3+2CRMmWKlSpWzevHn2yCOPWLdu3ezNN9902xWQEmVGhdJ1b1t0J06csCNHjoQtAAAAAAAASF4iOnzv7NmzLlNq2LBh7roypTZu3OjqR7Vv3z5Bxxw+fLgNHjw4kVsKAAAAAACAVJMppRn1ypYtG7auTJkytmvXLvd3wYIF3eW+ffvC9tF1b1t0/fv3t8OHDweX3bt3J1n7AQAAAAAAkAKDUpp5b+vWrWHrfvzxRytWrFiw6LmCTwsXLgxu13A8zcJXo0aNGI+ZOXNmy5kzZ9gCAAAAAACA5CWiw/d69uxpNWvWdMP37rnnHvvuu+/s1VdfdYtERUVZjx497Omnn3Z1pxSkevLJJ61w4cLWtGnTSDYdAAAAAAAAKTUodd1119lHH33khtwNGTLEBZ3Gjh1rrVu3Du7Tt29fO3bsmHXu3NkOHTpkN910k82dO9eyZMkSyaYDAAAAAAAgEkEpBYjef/992759u/Xp08fy5Mljq1evdjPjXX755fE+zh133OGW2ChbSgErLQAAAAAAAEjDQan169db/fr1LVeuXLZz507r1KmTC0p9+OGHrkj5W2+9lfgtBQAAAAAAQNoudN6rVy+7//77bdu2bWHD6Bo1amRfffVVYrYPAAAAAAAAqVCCglLff/+9PfTQQ+es17C9vXv3Jka7AAAAAAAAkIolKCiVOXNmO3LkyDnrf/zxR7vssssSo10AAAAAAABIxRIUlLrrrrtc4fFTp04Fi5GrllS/fv2sefPmid1GAAAAAAAApDIJCkqNGjXKjh49avnz57d///3Xbr75ZitZsqTlyJHDnnnmmcRvJQAAAAAAAFKVBAWlNOveggUL7NNPP7Vx48ZZ165d7bPPPrMlS5ZY9uzZE7+VAAAAqZAmiLnzzjutcOHCLvN81qxZwW3KSFcWeoUKFVz/Svu0a9fOfv/997BjFC9e3N02dBkxYsQ5MyfXqlXLTVBTpEgRGzly5DltmTlzppUuXdrto/tU3w4AACApZbiYG990001uAQAAwIU7duyYVapUyR588EFr1qxZ2LZ//vnHVq9ebU8++aTb5+DBg9a9e3dXRmHlypVh+6qsQqdOnYLXlb3uUR3QBg0aWP369W3ixIm2YcMGd3+5c+e2zp07u32WLVtmrVq1suHDh9sdd9xh06ZNs6ZNm7r7L1++fJI/DwAAIG1KUFBK2VEx0Zk5nV3TUL7atWtb+vTpL7Z9AAAAqdbtt9/ulrgy00O99NJLdv3117tankWLFg0LQhUsWDDG40ydOtVOnjxpkyZNskyZMlm5cuVs7dq1Nnr06GBQ6oUXXrDbbrvN+vTp464PHTrU3bfuT4EsAACAZBOUGjNmjB04cMCdwbv00kvdOp29y5Ytm11yySW2f/9+u/LKK23RokUuRRwAAAAX7/Dhw+4koLKcQmm4ngJJClTdd9991rNnT8uQ4X/dvOXLl7uThQpIeRo2bGjPPvus67+pL6d9evXqFXZM7RM6nDAmJ06ccIsnptmZAQAAErWm1LBhw+y6666zbdu22Z9//umWH3/80apXr+7OtOnsnc7WqUMEAACAi3f8+HFXY0rD7HLmzBlc361bN5s+fbo7GfjQQw+5flrfvn2D2/fu3WsFChQIO5Z3Xdvi2sfbHhsN91NGl7dwMhIAACR5ptSAAQPsgw8+sKuuuiq4TkP2nn/+eWvevLn9/PPProCm/gYAAMDFUdHze+65xwKBgE2YMCFsW2iGU8WKFV1GlIJTChhlzpw5SdvVv3//sPtXphSBKQAAkKRBqT179tjp06fPWa913hk1zRDz999/J+TwAAAAiBaQ+uWXX+zLL78My5KKiTLX1SfbuXOnXXPNNS57fd++fWH7eNe9OlSx7RNbnSqPgl5JHfgCAACpV4KG79WtW9edgVuzZk1wnf5+5JFH7JZbbnHXNbNLiRIlEq+lAAAAaYwXkFLJhC+++MLy5s173tuoiHm6dOksf/787nqNGjXsq6++csfyqIi5AlZebVDts3DhwrDjaB+tBwAASFZBqTfeeMPy5MljVatWDZ4hq1atmlunbaKC56NGjUrs9gIAAKQaR48edUEkLbJjxw73t+pzKoh0991328qVK90MemfOnHEZ6Vo0m56oQPnYsWNt3bp1rnyC9lNNzzZt2gQDTip8riF9HTp0sE2bNtmMGTNcDdDQYXfdu3e3uXPnur7bli1bbNCgQe5+u3btGqFnBgAApAUJGr6nVG6dPVOnRQXORWfbtIRmUwEAACB2CvyE9pm8QFH79u1dYOiTTz5x16+99tqw26moeZ06ddyJQRU5176aBU9Z6gpKhQacVIB8/vz51qVLF3dCMV++fDZw4EDr3LlzcJ+aNWvatGnTXN3QJ554wkqVKuVm3itfvrwPzwIAAEirEhSU8pQuXdotAAAAacmVV15p33///TnD6Q4dOmRVqlRxWUvxocCSipfHJq5tovtasWLFee9HBdCXLl0a5z4tWrRwCwAAQLIPSv3666/u7J3Sy70Ucs/o0aMTo20AAADJkoqIazhddMpW+u233yLSJgAAgDQRlFIhzLvuusudJdQQPqV2q3Oms3k6YwcAAJAaecPpZN68eW5onEdBKvWRihcvHqHWAQAApIGgVP/+/a137942ePBgy5Ejh33wwQduhpfWrVvbbbfdlvitBAAASAaaNm3qLqOiolzdp1AZM2Z0ASkmegEAAEjCoNTmzZvt3Xff/d8BMmSwf//91822N2TIEGvSpIk98sgjCTksAABAsnb27Fl3qYLiqimlouEAAABImHQJuVH27NmDdaQKFSpk27dvD277448/EtgUAACAlGHHjh0EpAAAACKRKXXDDTfY119/bWXKlLFGjRrZY489Zhs2bLAPP/zQbQMAAEjtVD9Ky/79+4MZVJ5JkyZFrF0AAACpOiil2fWOHj3q/lZdKf09Y8YMK1WqFDPvAQCAVE/9H5UtqFatmssaV40pAAAA+BCU0qx7oUP5Jk6cmJDDAAAApEjq+0yZMsXatm0b6aYAAACkrZpSCkr9+eef56w/dOhQWMAKAAAgNVJtzZo1a0a6GQAAAGkvKLVz5047c+bMOetPnDhhv/32W2K0CwAAINnq2LGjTZs2LdLNAAAASDvD9z755JPg3/PmzbNcuXIFrytIpWKfxYsXT9wWAgAAJDPHjx+3V1991b744gurWLGiZcyYMWw7NTYBAAASOSjVtGlTd6linu3btw/bps6YAlKjRo26kEMCAACkOOvXr7drr73W/b1x48awbRQ9BwAASIKglDfdcYkSJez777+3fPnyXcjNAQAAUoVFixZFugkAAABpc/a9HTt2JH5LAAAAAAAAkGYkKCglqh+lZf/+/cEMKs+kSZMSo20AAADJUt26deMcpvfll1/62h4AQPJS/PE5kW4CImzniMaRbkLqDUoNHjzYhgwZYtWqVbNChQpROwEAAKQpXj0pz6lTp2zt2rWuvlT0upsAAABIxKDUxIkTbcqUKda2bduE3BwAACBFGzNmTIzrBw0aZEePHvW9PQAAAClRuoTc6OTJk1azZs3Ebw0AAEAK1qZNG8oYAAAAJGVQqmPHjjZt2rSE3BQAACDVWr58uWXJkiXSzQAAAEi9w/eOHz9ur776qn3xxRdWsWJFy5gxY9j20aNHJ1b7AAAAkp1mzZqFXQ8EArZnzx5buXKlPfnkkxFrFwAAQKoPSq1fvz5Y4FMFPUNR9BwAAKR2uXLlCrueLl06u+aaa9xEMA0aNIhYuwAAAFJ9UGrRokWJ3xIAAIAUYvLkyZFuAgAAQNoMSnl++ukn2759u9WuXduyZs3qUtfJlAIAAGnFqlWrbPPmze7vcuXKWeXKlSPdJAAAgNQdlPrzzz/tnnvucRlTCkJt27bNrrzySuvQoYNdeumlNmrUqMRvKQAAQDKxf/9+a9mypS1evNhy587t1h06dMjq1q1r06dPt8suuyzSTQQAAEids+/17NnTFTfftWuXZcuWLbj+3nvvtblz5yZm+wAAAJKdRx991P7++2/btGmT/fXXX25Rnc0jR45Yt27dIt08AACA1JspNX/+fJs3b55dccUVYetLlSplv/zyS2K1DQAAIFnSSTjNQlymTJngurJly9r48eMpdA4AAJCUmVLHjh0Ly5Dy6Cxh5syZE3JIAACAFOPs2bMuazw6rdM2AAAAJFFQqlatWvbWW28Fr6uulDpgI0eOdLUUAAAAUrNbbrnFunfvbr///ntw3W+//eZKHNSrVy+ibQMAAEjVw/cUfFKHa+XKlXby5Enr27dvsKbCN998k/itBAAASEZeeuklu+uuu6x48eJWpEgRt2737t1Wvnx5e+eddyLdPAAAgNQblFKH68cff3Qdshw5ctjRo0etWbNm1qVLFytUqFDitxIAACAZUSBq9erVrq7Uli1b3DrVl6pfv36kmwYAAJC6g1KSK1cu++9//5u4rQEAAEjGvvzyS+vatautWLHCcubMabfeeqtb5PDhw1auXDmbOHGiK3UAAACAJKgpNXnyZJs5c+Y567XuzTffTMghAQAAkr2xY8dap06dXEAqphN2Dz30kI0ePToibQMAAEgTQanhw4dbvnz5zlmfP39+GzZsWGK0CwAAINlZt26d3XbbbbFub9Cgga1atcrXNgEAAKSpoNSuXbusRIkS56wvVqyY2wYAAJAa7du3zzJmzBjr9gwZMtiBAwd8bRMAAECaCkopI2r9+vUxnj3MmzdvYrQLAAAg2bn88stt48aNsW5X/+hCJn356quv7M4777TChQtbVFSUzZo1K2x7IBCwgQMHumNmzZrVFVLftm1b2D6a/bh169ZuSGHu3LmtQ4cObhKa6O1SnassWbK4Iu2aSTmmMgylS5d2+1SoUME+++yzeD8OAAAA34JSrVq1sm7dutmiRYvszJkzblHhz+7du1vLli0T1BAAAIDkrlGjRvbkk0/a8ePHz9n277//2lNPPWV33HFHvI937Ngxq1Spko0fPz7G7QoejRs3zhVP//bbby179uzWsGHDsPtXQGrTpk22YMECmz17tgt0de7cObj9yJEjblihMto1tPC5556zQYMG2auvvhrcZ9myZa5/p4DWmjVrrGnTpm6JKwAHAABwsaICOgV3gU6ePGlt27Z1Z9SUpi5nz561du3auU5TpkyZLLlQR0yFRzUjTkxFSdOK4o/PsbRs54jGkW4CgORgUK5ItyDyBh22tCox+gQavlelShVLnz69m4Xvmmuuceu3bNniAks6Ubd69WorUKDABR9bmVIfffSRCwaJumjKoHrsscesd+/ebp3armNPmTLFnQjcvHmzlS1b1r7//nurVq2a22fu3LkuePbrr7+620+YMMHNmLx3795gH+3xxx93WVlqt9x7770uQKaglueGG26wa6+91vXt4ot+F30u/A99T/BZgLT+OXAknn2CC86UUgdJnRp1hrZu3WpTp061Dz/80LZv326TJk1KVgEpAACAxKSAkLKKypcvb/3797f//Oc/bnniiSfcuq+//jpBAamY7Nixw/W5NGTPo85d9erVbfny5e66LjVkzwtIifZPly6dy6zy9qldu3ZYH03ZVurHHTx4MLhP6P14+3j3E5sTJ064TmfoAgAAEF//S3O6wKBUyZIlXZp4qVKl3AIAAJBWaBic6i0poPPTTz+5vpH6Q5deemmi3o8CUhI9yKXr3jZdqtZnKGWx58mTJ2yf6BPUeMfUNrVbl3HdT1wzMg8ePDjBjxEAAKRtF5wppTNv6nj9+eefSdMiAACAFEDBnOuuu86uv/76RA9IpRTKFlNavrfs3r070k0CAACpvdD5iBEjrE+fPhS/BAAASCIFCxYM1rEKpeveNl3u378/bPvp06fdjHyh+8R0jND7iG0fb3tsMmfO7OpEhC4AAABJGpRSQfPvvvvOzRaj6YmVIh66AAAA4OJoyJ2CQgsXLgyuU80m1YqqUaOGu67LQ4cOuVn1PJoRWRPQqPaUt49m5Dt16lRwH83UpyLtXoaX9gm9H28f734AAACSRU0pGTt2bOK3BAAAII05evSoq0sVWtx87dq17iRf0aJFrUePHvb000+70gkKUj355JNuRj1vhr4yZcrYbbfdZp06dXKz5CnwpFkBNTOf9pP77rvP1X3q0KGD9evXz2W6v/DCCzZmzJjg/Xbv3t1uvvlmGzVqlDVu3NimT59uK1eutFdffTUCzwoAAEgrEhSUat++feK3BAAAII1R4Kdu3brB67169Qr2tTTTcd++fe3YsWPWuXNnlxF100032dy5cy1LlizB22gmZAWi6tWr52p/Nm/e3MaNGxc2Y9/8+fOtS5cuVrVqVcuXL58NHDjQHdNTs2ZNmzZtmg0YMMDNJKgg2KxZs9yMggAAAMkqKCXbt2+3yZMnu0udbdPML59//rk7q1euXLnEbSUAAEAqVKdOHTd7X2yioqJsyJAhbomNsqoUUIpLxYoVbenSpXHu06JFC7cAAAAk65pSS5YssQoVKriaBh9++KFLPZd169bZU089ldhtBAAAAAAAQCqToKDU448/7uobqABmpkyZgutvueUWW7FiRWK2DwAAAAAAAKlQgoJSGzZssP/85z/nrNcQvj/++CMx2gUAAAAAAIBULEFBqdy5c9uePXvOWb9mzRq7/PLLE6NdAAAAAAAASMUSFJTSNMOaUnjv3r2uAOfZs2ftm2++sd69e1u7du0Sv5UAAAAAAABIVRIUlBo2bJiVKVPGzbSnIudly5a12rVru+mENZUwAAAAAAAAEJcMdgGUEfXcc8/ZJ598YidPnrS2bdta8+bNXWCqcuXKVqpUqQs5HAAAAAAAANKoCwpKPfPMMzZo0CCrX7++Zc2a1aZNm2aBQMAmTZqUdC0EAAAAAABA2h6+99Zbb9nLL79s8+bNs1mzZtmnn35qU6dOdRlUF2vEiBGuPlWPHj2C644fP25dunSxvHnz2iWXXOKysvbt23fR9wUAAAAAAIAUFJTatWuXNWrUKHhdGVMKJP3+++8X1Yjvv//eXnnlFatYsWLY+p49e7rA18yZM23JkiXufpo1a3ZR9wUAAAAAAIAUFpQ6ffq0ZcmSJWxdxowZ7dSpUwlugOpRtW7d2l577TW79NJLg+sPHz5sb7zxho0ePdpuueUWq1q1qk2ePNmWLVtmK1asSPD9AQAAAAAAIIXVlFL9qPvvv98yZ84cNsTu4YcftuzZswfXffjhh/E+pobnNW7c2GVdPf3008H1q1atcsEurfeULl3azfi3fPlyu+GGGy6k6QAAAAAAAEipQan27dufs65NmzYJvvPp06fb6tWr3fC96Pbu3WuZMmWy3Llzh60vUKCA2xabEydOuMVz5MiRBLcPAAAAAAAAySAopeFziWX37t3WvXt3W7BgwTlDAi/G8OHDbfDgwYl2PAAAAAAAAES4plRi0vC8/fv3W5UqVSxDhgxuUTHzcePGub+VEXXy5Ek7dOhQ2O00+17BggVjPW7//v1dPSpvUfALAAAAAAAAKThTKjHVq1fPNmzYELbugQcecHWj+vXrZ0WKFHFF1BcuXGjNmzd327du3epmAKxRo0asx1W9q9CaVwAAAAAAAEh+IhaUypEjh5UvXz5snYql582bN7i+Q4cO1qtXL8uTJ4/lzJnTHn30UReQosg5AAAAAABAyhaxoFR8jBkzxtKlS+cypVS8vGHDhvbyyy9HulkAAAAAAABITUGpxYsXh11XAfTx48e7BQAAAAAAAKlHxAqdAwAAAAAAIO0iKAUAAAAAAADfEZQCAAAAAACA7whKAQAAAAAAwHcEpQAAAAAAAOA7glIAAAAAAADwHUEpAAAAAAAA+I6gFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAEAyVrx4cYuKijpn6dKli9tep06dc7Y9/PDDYcfYtWuXNW7c2LJly2b58+e3Pn362OnTp8P2Wbx4sVWpUsUyZ85sJUuWtClTpvj6OAEAQNqTIdINAAAAQOy+//57O3PmTPD6xo0b7dZbb7UWLVoE13Xq1MmGDBkSvK7gk0e3VUCqYMGCtmzZMtuzZ4+1a9fOMmbMaMOGDXP77Nixw+2jYNbUqVNt4cKF1rFjRytUqJA1bNjQt8cKAADSFoJSAAAAydhll10Wdn3EiBF21VVX2c033xwWhFLQKSbz58+3H374wb744gsrUKCAXXvttTZ06FDr16+fDRo0yDJlymQTJ060EiVK2KhRo9xtypQpY19//bWNGTOGoBQAAEgyDN8DAABIIU6ePGnvvPOOPfjgg26YnkfZTfny5bPy5ctb//797Z9//gluW758uVWoUMEFpDwKNB05csQ2bdoU3Kd+/fph96V9tB4AACCpkCkFAACQQsyaNcsOHTpk999/f3DdfffdZ8WKFbPChQvb+vXrXQbU1q1b7cMPP3Tb9+7dGxaQEu+6tsW1jwJX//77r2XNmjXG9pw4ccItHu0PAAAQXwSlAAAAUog33njDbr/9dheA8nTu3Dn4tzKiVAeqXr16tn37djfMLykNHz7cBg8enKT3AQAAUi+G7wEAAKQAv/zyi6sLpQLkcalevbq7/Omnn9ylak3t27cvbB/vuleHKrZ9cubMGWuWlGio4OHDh4PL7t27E/joAABAWkRQCgAAIAWYPHmy5c+f382SF5e1a9e6S2VMSY0aNWzDhg22f//+4D4LFixwAaeyZcsG99GMe6G0j9bHJXPmzO44oQsAAEB8EZQCAABI5s6ePeuCUu3bt7cMGf5/9QUN0dNMeqtWrbKdO3faJ598Yu3atbPatWtbxYoV3T4NGjRwwae2bdvaunXrbN68eTZgwADr0qWLCyrJww8/bD///LP17dvXtmzZYi+//LK999571rNnz4g9ZgAAkPoRlAIAAEjmNGxv165dbta9UJkyZXLbFHgqXbq0PfbYY9a8eXP79NNPg/ukT5/eZs+e7S6V+dSmTRsXuBoyZEhwnxIlSticOXNcdlSlSpVs1KhR9vrrr7sZ+AAAAJIKhc4BAACSOQWdAoHAOeuLFCliS5YsOe/tNTvfZ599Fuc+derUsTVr1lxUOwEAAC4EmVIAAAAAAADwHUEpAAAAAAAA+I6gFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAAN8RlAIAAAAAAIDvCEoBAAAAAADAdwSlAAAAAAAA4DuCUgAAAAAAAPAdQSkAAAAAAAD4jqAUAAAAAAAAfEdQCgAAAAAAAL4jKAUAAAAAAADfEZQCAAAAAACA7whKAQAAAAAAwHcEpQAAAAAAAOA7glIAAAAAAADwHUEpAAAAAAAA+I6gFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAgGRs0aJBFRUWFLaVLlw5uP378uHXp0sXy5s1rl1xyiTVv3tz27dsXdoxdu3ZZ48aNLVu2bJY/f37r06ePnT59OmyfxYsXW5UqVSxz5sxWsmRJmzJlim+PEQAApE0EpQAAAJK5cuXK2Z49e4LL119/HdzWs2dP+/TTT23mzJm2ZMkS+/33361Zs2bB7WfOnHEBqZMnT9qyZcvszTffdAGngQMHBvfZsWOH26du3bq2du1a69Gjh3Xs2NHmzZvn+2MFAABpR4ZINwAAAABxy5AhgxUsWPCc9YcPH7Y33njDpk2bZrfccotbN3nyZCtTpoytWLHCbrjhBps/f7798MMP9sUXX1iBAgXs2muvtaFDh1q/fv1cFlamTJls4sSJVqJECRs1apQ7hm6vwNeYMWOsYcOGvj9eAACQNpApBQAAkMxt27bNChcubFdeeaW1bt3aDceTVatW2alTp6x+/frBfTW0r2jRorZ8+XJ3XZcVKlRwASmPAk1HjhyxTZs2BfcJPYa3j3eM2Jw4ccIdJ3QBAACIL4JSAAAAyVj16tXdcLu5c+fahAkT3FC7WrVq2d9//2179+51mU65c+cOu40CUNomugwNSHnbvW1x7aMg07///htr24YPH265cuUKLkWKFEm0xw0AAFI/hu8BAAAkY7fffnvw74oVK7ogVbFixey9996zrFmzRrRt/fv3t169egWvK4hFYAoAAMQXmVIAAAApiLKirr76avvpp59cnSkVMD906FDYPpp9z6tBpcvos/F518+3T86cOeMMfGmmPu0TugAAAMQXQSkAAIAU5OjRo7Z9+3YrVKiQVa1a1TJmzGgLFy4Mbt+6daurOVWjRg13XZcbNmyw/fv3B/dZsGCBCyCVLVs2uE/oMbx9vGMAAAAkBYJSAAAAyVjv3r1tyZIltnPnTlu2bJn95z//sfTp01urVq1cHacOHTq4IXSLFi1yhc8feOABF0zSzHvSoEEDF3xq27atrVu3zubNm2cDBgywLl26uEwnefjhh+3nn3+2vn372pYtW+zll192wwN79uwZ4UcPAABSs4gGpVQc87rrrrMcOXJY/vz5rWnTpu7sXqjjx4+7TlPevHntkksusebNm5+TXg4AAJBa/frrry4Adc0119g999zj+kQrVqywyy67zG0fM2aM3XHHHa6PVLt2bTcU78MPPwzeXgGs2bNnu0sFq9q0aWPt2rWzIUOGBPcpUaKEzZkzx2VHVapUyUaNGmWvv/66m4EPAAAgVRY611k/BZwUmDp9+rQ98cQT7mzeDz/8YNmzZ3f76AydOkkzZ850ZwO7du1qzZo1s2+++SaSTQcAAPDF9OnT49yeJUsWGz9+vFtio8Lon332WZzHqVOnjq1ZsybB7QQAAEhRQSlNbRxK0x0rY0qp5zrTd/jwYXvjjTds2rRpdsstt7h9Jk+ebGXKlHFnCL20dAAAAAAAAKQsyaqmlIJQkidPHnep4NSpU6esfv36wX1Kly5tRYsWteXLl0esnQAAAAAAAEjBmVKhzp49az169LAbb7zRypcv79bt3bvXMmXK5KY+DlWgQAG3LSYnTpxwi+fIkSNJ3HIAAAAAAACk2Ewp1ZbauHHjeesmxKd4umpPeUuRIkUSrY0AAAAAAABIRUEpFS/XrDCayviKK64IrtfsMSdPnrRDhw6F7a/Z97QtJv3793fDAL1l9+7dSd5+AAAAAAAApKCgVCAQcAGpjz76yL788ks3HXGoqlWrWsaMGW3hwoXBdVu3brVdu3a5KY1jkjlzZsuZM2fYAgAAAAAAgOQlQ6SH7GlmvY8//thy5MgRrBOlYXdZs2Z1lx06dLBevXq54ucKMD366KMuIMXMewAAAAAAAClXRINSEyZMcJd16tQJWz958mS7//773d9jxoyxdOnSWfPmzV0B84YNG9rLL78ckfYCAAAAAAAgFQSlNHzvfLJkyWLjx493CwAAAAAAAFKHiAalAKQsZ86csVOnTkW6GWmWauylT58+0s0AAAAAgERBUApAvLIaVfMt+kyY8F/u3Lnd7KNRUVGRbgoAAAAAXBSCUgDOywtI5c+f37Jly0ZAJEKBwX/++cf279/vrhcqVCjSTQIAAACAi0JQCsB5h+x5Aam8efNGujlpmmYlFQWm9HowlA8AAABASpYu0g0AkLx5NaSUIYXI814HansBAAAASOkISgGIF4bsJQ+8DgAAAABSC4JSAAAAAAAA8B1BKQDJxv33329NmzaNdDMAAAAAAD4gKAUAAAAAAADfEZQCkCzVqVPHunXrZn379rU8efJYwYIFbdCgQWH7aFbAhx56yAoUKGBZsmSx8uXL2+zZs4PbP/jgAytXrpxlzpzZihcvbqNGjQq7vdY9/fTT1q5dO7vkkkusWLFi9sknn9iBAwesSZMmbl3FihVt5cqVYbf7+uuvrVatWm42vCJFirh2Hjt2LImfEQAAAABIXQhKAUi23nzzTcuePbt9++23NnLkSBsyZIgtWLDAbTt79qzdfvvt9s0339g777xjP/zwg40YMcLSp0/vtq9atcruuecea9mypW3YsMEFtJ588kmbMmVK2H2MGTPGbrzxRluzZo01btzY2rZt64JUbdq0sdWrV9tVV13lrgcCAbf/9u3b7bbbbrPmzZvb+vXrbcaMGS5I1bVr1wg8QwAAAACQcmWIdAMAIDbKUnrqqafc36VKlbKXXnrJFi5caLfeeqt98cUX9t1339nmzZvt6quvdvtceeWVwduOHj3a6tWr5wJRon0UuHruuedc7SpPo0aNXLaVDBw40CZMmGDXXXedtWjRwq3r16+f1ahRw/bt2+eytYYPH26tW7e2Hj16BNs1btw4u/nmm91tlbEFAAAAADg/MqUAJOugVKhChQrZ/v373d9r1661K664IhiQik7BKmVAhdL1bdu22ZkzZ2K8Dw0DlAoVKpyzzrvfdevWuWwrDe3zloYNG7rMrR07diTCowYAAACAtIFMKQDJVsaMGcOuR0VFueCPqJ5TYt+Hjh/bOu9+jx496jKrVEcquqJFiyZKmwAAAAAgLSAoBSBFUobTr7/+aj/++GOM2VJlypRx9aZC6br29epOJUSVKlXcMMCSJUsm+BgAAAAAAIbvAUihVMOpdu3aruC4ip9r6Nznn39uc+fOddsfe+wxV39q6NChLnCloumqSdW7d++Lul/VmFq2bJkrbK4hhBoO+PHHH1PoHAAAAAAuEEEpACnWBx984IqSt2rVysqWLWt9+/YN1otSRtN7771n06dPt/Lly7si5pq9L7TIeUIztJYsWeICXbVq1bLKlSu7YxcuXDiRHhUAAAAApA0M3wOQbKiAuGfx4sXnbJ81a1bY9Tx58tikSZNiPZ6yqLTEZufOneesCwQCYdeLFy9+zjoFwubPnx/rcQEAAAAA50emFAAAAAAAAHxHUAoAAAAAAAC+IygFAAAAAAAA3xGUAgAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAgGRs+PDhdt1111mOHDksf/781rRpU9u6dWvYPnXq1LGoqKiw5eGHHw7bZ9euXda4cWPLli2bO06fPn3s9OnTYfssXrzYqlSpYpkzZ7aSJUvalClTfHmMAAAgbSIoBQAAkIwtWbLEunTpYitWrLAFCxbYqVOnrEGDBnbs2LGw/Tp16mR79uwJLiNHjgxuO3PmjAtInTx50pYtW2ZvvvmmCzgNHDgwuM+OHTvcPnXr1rW1a9dajx49rGPHjjZv3jxfHy8AAEg7MkS6AQAAAIjd3Llzw64rmKRMp1WrVlnt2rWD65UBVbBgwRiPMX/+fPvhhx/siy++sAIFCti1115rQ4cOtX79+tmgQYMsU6ZMNnHiRCtRooSNGjXK3aZMmTL29ddf25gxY6xhw4ZJ/CgBAEBaRKYUAFwgDW+JPkxGy969e8P2Gz9+vBUvXtyyZMli1atXt++++y5su7aNHTs2eD0QCFjv3r0tZ86c7j4AICaHDx92l3ny5AlbP3XqVMuXL5+VL1/e+vfvb//8809w2/Lly61ChQouIOVRoOnIkSO2adOm4D7169cPO6b20frYnDhxwh0jdAEAAIgvMqUAJEjxx+f4en87RzRO9GMePHjQMmbMaJdcckmCbq+aLgogeZS54JkxY4b16tXLZR4oIKXgk37c6Tah+4UOrdHQm9mzZ9uiRYusatWqCXxUAFKzs2fPumF1N954ows+ee677z4rVqyYFS5c2NavX+8yoPR58+GHH7rtCpqHBqTEu+4F1GPbR4Gmf//917JmzRpjvavBgwcnyWMFAACpH5lSANIUFfWdM2eOtWjRwgoVKmTbt29P8LEUXNJQGW9Jl+7/f6SOHj3aBZkeeOABK1u2rAtOaWjNpEmTYsw0UHs0rGbp0qUEpADESrWlNm7caNOnTw9b37lzZxf4VjZU69at7a233rKPPvrooj7j4kMZWcrc8pbdu3cn6f0BAIDUhaAUgDRhw4YN9thjj9kVV1xh7dq1s8suu8xlJFWqVMltL1eunMuYim25/fbbzzmmarIosHXrrbfaN998E1yvQsKq9RI6DEYBK12PPgzm6NGjrrCwar3oGNdcc02SPg8AUq6uXbsGsyn1WRYXZWjKTz/95C4VON+3b1/YPt51rw5VbPsoIzSmLCnRLH3aHroAAADEF8P3AKRaf/75p73zzjtulinVTGnUqJG9/PLLdscdd7iivqE+++wzN6NVbEJ/kCkQpcynatWquSyn119/3U3H/u2337qp1P/44w83HC+mYTBbtmwJW6dCw5rmffPmzS5QBgDRqd7co48+6jKfVG9OxcjPR7PneZ9XUqNGDXvmmWds//79wSHEmslPQSRlc3r76LMwlPbRegAAgKRAUApAqvXiiy+6Wie1atVy2QJFihSJdV/VYokvZTOFZjTVrFnTDZHRDFVvv/32BbVR07pr2N6wYcPc7QEgpiF706ZNs48//tgFsb0aULly5XIBc33+aLsC73nz5nU1pXr27Olm5qtYsWLws0bBp7Zt29rIkSPdMQYMGOCOrWwnefjhh+2ll16yvn372oMPPmhffvmlvffee27IMwAAQFJg+B6AVEs1VpSJpB9fGp6n+k76kaVCwdElZPheqOuvvz44TEazX6VPnz7GYTDRp2uvV6+e+6GpzKvu3bsnyuMGkLpMmDDB1WtSRqYyn7xFEyqIMj8V3FbgqXTp0m6ocvPmze3TTz8NHkOfSRr6p0tlPrVp08YNZR4yZEhwH2VgKQCl7CgNbR41apTLBFWtKgAAgKRAphSAVEuzUCkTQMuyZcvcML5mzZq5TAMVAlbGgIJRFzp8L7ahMt4wGf1AVLHyhQsXWtOmTd06BcJ0XTVhotMPSf14vOuuu9wwnXHjxl3kIweQmuhzIS7KAl2yZMl5j6OM0OjD86JT4GvNmjUX3EYAAICEICgFIE3QEDstL7zwgs2aNcumTJlizz//vPvxpdmqLmT43tixY11GgQJax48fd5kEysCaP39+cJ9evXpZ+/btXd0pZVHpNseOHXPZWjFREXRlMdx5550ugKUhNAAAAACQmhGUApCmZMmSxVq2bOmW33//3Q3Nu1CaXU/DY3777TfLli2bq9mioTN169YN7nPvvffagQMHbODAgW74oGbqmzt37jnFz0PdcsstbuiMCrErM0KBqaioqAQ/VgAAAABIzghKAUiQnSMaW2oY3pcQKgKs5Xw0VC+m4XqenTt3xjh05ujRowlqFwAAAACkJBQ6BwAAAAAAgO8ISgEAAAAAAMB3BKUAAAAAAADgO4JSAAAAAAAA8B1BKQAAAAAAAPiOoBQAAAAAAAB8R1AKAAAAAAAAviMoBQAAAAAAAN8RlAIAAAAAAIDvCEoBAAAAAADAdwSlAMDMihcvblFRUWHLiBEjwvZZv3691apVy7JkyWJFihSxkSNHhm0fNGiQXXvttWHrli5darlz57YePXpYIBDw5bEAAAAAQEqQIdINAJBCDcrl8/0dvuCb/P7775Y/f37LkCF+H3VDhgyxTp06Ba/nyJEj+PeRI0esQYMGVr9+fZs4caJt2LDBHnzwQRdw6ty5c4zHmzNnjrVo0cIef/xxGzhw4AW3HwAAAABSMzKlAKRar732ml1xxRXWu3dvF0Q6HwWhChYsGFyyZ88e3DZ16lQ7efKkTZo0ycqVK2ctW7a0bt262ejRo2M81rRp06xZs2Yum4qAFAAAAACci6AUgFSrX79+9sILL9jmzZutSpUqbhk3bpwdOHAgxv01XC9v3rxWuXJle+655+z06dPBbcuXL7fatWtbpkyZgusaNmxoW7dutYMHD4YdZ/z48fbAAw+4AFbXrl2T8BECAAAAQMpFUApAqqXaT/fee68bRvfbb79Zu3btbMqUKXb55Zdb06ZN7aOPPgoGnpT1NH36dFu0aJE99NBDNmzYMOvbt2/wWHv37rUCBQqEHd+7rm0eBcAUiJowYYK1bt3at8cKAAAAACkNQSkAaYJqS6nY+OrVq+3jjz92mU8aXrdx40a3vVevXlanTh2rWLGiPfzwwzZq1Ch78cUX7cSJExd0PxouqIwsZVrt2bMniR4NAAAAAKR8FDpH2uB3Ue7kKAGFwlOTv//+295//317++237auvvrKbb77Z2rdvb2XLlo1x/+rVq7ssqp07d9o111zjakzt27cvbB/vuraF1qX64osv7NZbb7W6deu6zKtChQpZclD88TmW1u3MEukWAAAAAPCQKQUg1Tpz5ox9/vnndt9997mhdqoZVa9ePfv5559t4cKFbjhfaI2oUGvXrrV06dK5DCupUaOGC2adOnUquM+CBQtcwOrSSy8Nu62uKzCVM2dOl32lWQABAAAAAOEISgFItVQXqlWrVsHsJRUl/+9//2tFixYN209D+caOHWvr1q1zASvNtNezZ09r06ZNMOCkwJYCWB06dLBNmzbZjBkzXBF1DfuLSe7cuV3QSrcnMAUAAAAA52L4HoBUq23bttanTx9X8DwumTNndkXOBw0a5GpIlShRwgWlQgNOuXLlsvnz51uXLl2satWqli9fPhs4cKB17tw5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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Visualize the distributions\n",
+ "fig, axes = plt.subplots(1, 2, figsize=(12, 5))\n",
+ "\n",
+ "# income distribution by sex\n",
+ "crosstab_pct = pd.crosstab(real_data['sex'], real_data['label'], normalize='index') * 100\n",
+ "crosstab_pct.plot(kind='bar', ax=axes[0], rot=0)\n",
+ "axes[0].set_title('Income Distribution by Sex (%)')\n",
+ "axes[0].set_xlabel('Sex')\n",
+ "axes[0].set_ylabel('Percentage')\n",
+ "axes[0].legend(title='Income')\n",
+ "\n",
+ "# Overall income distribution\n",
+ "real_data['label'].value_counts().plot(kind='bar', ax=axes[1], rot=0)\n",
+ "axes[1].set_title('Overall Income Distribution')\n",
+ "axes[1].set_xlabel('Income')\n",
+ "axes[1].set_ylabel('Count')\n",
+ "\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Step 3: Split Data into Training and Validation Sets"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Training set shape: (22792, 15)\n",
+ "Validation set shape: (9769, 15)\n",
+ "\n",
+ "Training set combinations:\n",
+ "sex Female Male\n",
+ "label \n",
+ "<=50K 7164 738\n",
+ ">50K 354 14536\n",
+ "\n",
+ "Validation set combinations:\n",
+ "sex Female Male\n",
+ "label \n",
+ "<=50K 3089 336\n",
+ ">50K 164 6180\n"
+ ]
+ }
+ ],
+ "source": [
+ "training_data, validation_data = train_test_split(\n",
+ " real_data,\n",
+ " test_size=0.3,\n",
+ " random_state=42,\n",
+ ")\n",
+ "\n",
+ "print(f\"\\nTraining set shape: {training_data.shape}\")\n",
+ "print(f\"Validation set shape: {validation_data.shape}\")\n",
+ "\n",
+ "# Verify all combinations exist in both sets\n",
+ "print(\"\\nTraining set combinations:\")\n",
+ "print(pd.crosstab(training_data['label'], training_data['sex']))\n",
+ "print(\"\\nValidation set combinations:\")\n",
+ "print(pd.crosstab(validation_data['label'], validation_data['sex']))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Step 4: Generate Synthetic Data\n",
+ "\n",
+ "We'll use the TVAE (Tabular Variational AutoEncoder) synthesizer to generate synthetic data.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Training TVAE synthesizer...\n",
+ "Synthesizer training completed!\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Training TVAE synthesizer...\")\n",
+ "\n",
+ "synthesizer = TVAESynthesizer(metadata=metadata)\n",
+ "synthesizer.fit(training_data)\n",
+ "\n",
+ "print(\"Synthesizer training completed!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Synthetic data shape: (22792, 15)\n",
+ "\n",
+ "Target and sensitive attribute distribution:\n",
+ "sex Female Male\n",
+ "label \n",
+ "<=50K 6868 936\n",
+ ">50K 83 14905\n"
+ ]
+ }
+ ],
+ "source": [
+ "synthetic_data = synthesizer.sample(len(training_data))\n",
+ "\n",
+ "print(f\"Synthetic data shape: {synthetic_data.shape}\")\n",
+ "print(\"\\nTarget and sensitive attribute distribution:\")\n",
+ "print(pd.crosstab(synthetic_data['label'], synthetic_data['sex']))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Step 5: Evaluate Synthetic Data\n",
+ "\n",
+ "Let's evaluate the synthetic data generated with the EqualizedOddsImprovement metric."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Score: 0.5337\n",
+ "\n",
+ "Score Interpretation:\n",
+ "- Score > 0.5 means synthetic data improves fairness\n",
+ "- Score < 0.5 means synthetic data worsens fairness\n",
+ "- Score = 0.5 means no change in fairness\n"
+ ]
+ }
+ ],
+ "source": [
+ "result_standard = EqualizedOddsImprovement.compute_breakdown(\n",
+ " real_training_data=training_data,\n",
+ " synthetic_data=synthetic_data,\n",
+ " real_validation_data=validation_data,\n",
+ " metadata=metadata.to_dict()['tables']['adult'],\n",
+ " prediction_column_name='label',\n",
+ " positive_class_label='>50K',\n",
+ " sensitive_column_name='sex',\n",
+ " sensitive_column_value='Female'\n",
+ ")\n",
+ "\n",
+ "print(f\"Score: {result_standard['score']:.4f}\")\n",
+ "print(f\"\\nScore Interpretation:\")\n",
+ "print(f\"- Score > 0.5 means synthetic data improves fairness\")\n",
+ "print(f\"- Score < 0.5 means synthetic data worsens fairness\")\n",
+ "print(f\"- Score = 0.5 means no change in fairness\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Full breakdown of the Equalized Odds Improvement metric:\n",
+ "{\n",
+ " \"score\": 0.5337489169733715,\n",
+ " \"real_training_data\": {\n",
+ " \"equalized_odds\": 0.0008090614886731018,\n",
+ " \"prediction_counts_validation\": {\n",
+ " \"Female=True\": {\n",
+ " \"true_positive\": 0,\n",
+ " \"false_positive\": 15,\n",
+ " \"true_negative\": 3074,\n",
+ " \"false_negative\": 164\n",
+ " },\n",
+ " \"Female=False\": {\n",
+ " \"true_positive\": 6175,\n",
+ " \"false_positive\": 336,\n",
+ " \"true_negative\": 0,\n",
+ " \"false_negative\": 5\n",
+ " }\n",
+ " }\n",
+ " },\n",
+ " \"synthetic_data\": {\n",
+ " \"equalized_odds\": 0.06830689543541602,\n",
+ " \"prediction_counts_validation\": {\n",
+ " \"Female=True\": {\n",
+ " \"true_positive\": 14,\n",
+ " \"false_positive\": 211,\n",
+ " \"true_negative\": 2878,\n",
+ " \"false_negative\": 150\n",
+ " },\n",
+ " \"Female=False\": {\n",
+ " \"true_positive\": 6172,\n",
+ " \"false_positive\": 336,\n",
+ " \"true_negative\": 0,\n",
+ " \"false_negative\": 8\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Full breakdown of the Equalized Odds Improvement metric:')\n",
+ "print(json.dumps(result_standard, indent=2))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Step 6: Generate Conditionally Sampled Synthetic Data\n",
+ "\n",
+ "Now let's try to improve fairness by using conditional sampling to create a more balanced dataset where each combination of target and sensitive attributes has equal representation (25% each)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Generating conditionally sampled synthetic data...\n",
+ "Each condition will have 25% of the data (equal representation)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Sampling conditions: 100%|██████████| 22792/22792 [00:14<00:00, 1609.35it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Generated 22792 samples\n",
+ "\n",
+ "Target and sensitive attribute distribution:\n",
+ "sex Female Male\n",
+ "label \n",
+ "<=50K 5698 5698\n",
+ ">50K 5698 5698\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Generating conditionally sampled synthetic data...\")\n",
+ "print(\"Each condition will have 25% of the data (equal representation)\")\n",
+ "\n",
+ "total_samples = len(training_data)\n",
+ "samples_per_condition = total_samples // 4\n",
+ "conditions = [\n",
+ " Condition({'label': '>50K', 'sex': 'Female'}, num_rows=samples_per_condition),\n",
+ " Condition({'label': '<=50K', 'sex': 'Female'}, num_rows=samples_per_condition),\n",
+ " Condition({'label': '>50K', 'sex': 'Male'}, num_rows=samples_per_condition),\n",
+ " Condition({'label': '<=50K', 'sex': 'Male'}, num_rows=samples_per_condition)\n",
+ "]\n",
+ "balanced_synthetic_data = synthesizer.sample_from_conditions(conditions=conditions)\n",
+ "print(f\"Generated {len(balanced_synthetic_data)} samples\")\n",
+ "\n",
+ "print(\"\\nTarget and sensitive attribute distribution:\")\n",
+ "balanced_crosstab = pd.crosstab(balanced_synthetic_data['label'], balanced_synthetic_data['sex'])\n",
+ "print(balanced_crosstab)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Step 7: Evaluate Balanced Synthetic Data\n",
+ "\n",
+ "Now let's evaluate the balanced synthetic data to compare it with the standard synthetic data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Score: 0.7693\n"
+ ]
+ }
+ ],
+ "source": [
+ "result_balanced = EqualizedOddsImprovement.compute_breakdown(\n",
+ " real_training_data=training_data,\n",
+ " synthetic_data=balanced_synthetic_data,\n",
+ " real_validation_data=validation_data,\n",
+ " metadata=metadata.to_dict()['tables']['adult'],\n",
+ " prediction_column_name='label',\n",
+ " positive_class_label='>50K',\n",
+ " sensitive_column_name='sex',\n",
+ " sensitive_column_value='Female'\n",
+ ")\n",
+ "\n",
+ "print(f\"Score: {result_balanced['score']:.4f}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The full breakdown of the Equalized Odds Improvement metric is:\n",
+ "{\n",
+ " \"score\": 0.7692813165995738,\n",
+ " \"real_training_data\": {\n",
+ " \"equalized_odds\": 0.0008090614886731018,\n",
+ " \"prediction_counts_validation\": {\n",
+ " \"Female=True\": {\n",
+ " \"true_positive\": 0,\n",
+ " \"false_positive\": 15,\n",
+ " \"true_negative\": 3074,\n",
+ " \"false_negative\": 164\n",
+ " },\n",
+ " \"Female=False\": {\n",
+ " \"true_positive\": 6175,\n",
+ " \"false_positive\": 336,\n",
+ " \"true_negative\": 0,\n",
+ " \"false_negative\": 5\n",
+ " }\n",
+ " }\n",
+ " },\n",
+ " \"synthetic_data\": {\n",
+ " \"equalized_odds\": 0.5393716946878206,\n",
+ " \"prediction_counts_validation\": {\n",
+ " \"Female=True\": {\n",
+ " \"true_positive\": 81,\n",
+ " \"false_positive\": 1708,\n",
+ " \"true_negative\": 1381,\n",
+ " \"false_negative\": 83\n",
+ " },\n",
+ " \"Female=False\": {\n",
+ " \"true_positive\": 5899,\n",
+ " \"false_positive\": 317,\n",
+ " \"true_negative\": 19,\n",
+ " \"false_negative\": 281\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('The full breakdown of the Equalized Odds Improvement metric is:')\n",
+ "print(json.dumps(result_balanced, indent=2))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "## Step 8: Compare Results and Analysis\n",
+ "\n",
+ "Let's compare the results from both approaches to analyze the impact of balanced sampling on fairness."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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1yj2XWN/Jx5f7CsDtVQCaCC+/vrrUnwsbbnlllNcb4sttsjrjR07Nl/ecccdS/PPP39pwoQJFet8/PHHpaZNm5b++te/Viz7/e9/X1puueVKP/30U8WySZMmldZcc81S165dK5ZdccUVeftrr712lW2GH374YbLxPPnkk3n9q6++umLZww8/nJfF/2W77rpradFFF/3V56Fv3775tnPNNVdpq622Kp1++uml119/fbL1jjvuuLzerbfeOtl18bjC4MGD8zrXXnttxXXjx48v9ezZszTHHHNUPIejRo3K67Vr16702WefVdnW1D5vNYnxx3a/+uqr0tTo0aNHfi2/+OKLimUvvvhifi3jeSkbOHBg3u7ee+9dsSxeq4UXXrjUpEmT0imnnFKxPO57ttlmy89/9ddnoYUWqngOwo033piXn3322VN8zQcNGpTv57333qtYFtuP2x555JGTrV/9tT/44IPzc139/VXZIYcckrf32GOPVSz79ttvS126dCl17ty5NHHixCqPpVu3bqVx48ZVrBuPIZa//PLLhfcBADQ85Vi0plOrVq0q1rv99tvzstNOO61iWcQW66yzTl4e2ylbb7318qm6muLT6rFPxI7LLrts6f/+7/+qLI/b1RRfVY5/K/vxxx9LK6+8cqljx445Vg/vvvtuqVmzZqWTTjqpyroRvzRv3rxieYwhYsSIFSvHOxdffHG+z5oeW01x1YgRIwrXef755/M6/fv3z5dfeOGFfHm//farst5OO+2Ul0c8WtanT59S69atq8SGr732Wn5sldMuZ511Vr48ZsyYUm1E7B2PMW7boUOHvP9z/vnnV7m/soiZI3Z+5plnatzOtMSZiy22WJX3RWwn9gN69+5dsc0Q68Q2Nthggyk+nhVXXLHUvn37qXrs5dc+3oPxHiq7++6789hin6h6PH7yySdPti8QsfuQIUMqlr/xxhuTvY7lv714n8b9lsXfWCy/4447qjzW6vbZZ59SmzZtquw3lV+3iy66aLL1q/9dxn7wMsssM8XnI95rLVu2LI0cObJi2UcffVRq27Ztad11153ssfTq1avKa3TooYfm92XsewO1o50L0GB8++23+f+YKjkl5evL0wijGjmqiMtTR0NUUEQ/77gufPnll7k6ICpc4n6iqidOURUQlcNvv/32ZNMBoy95TI+srFydHOJgPnH7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iBejFUjlAxFGQjLWiyKIOFBhrBexYMRHv9ZysSgxHUUw5QOElkU/8GiZF3FWHCwzqmzjMUQCOOLTiHeiUCRi2YjDItaP9aLQJuKnqNKNdaJCfmp6ooezzjorP58x+y9aZZQrziPRHUnJKC6pPNs04rIdd9wxJ0bjOY3nPYpaYtZidfEjQGwzZl7G9stFK/H8Vn7eovVHtHOJ5zkqqOP5je1HPFjTLNyyiLfj9Yi4MO4j4sKITSM2jP7oEcOWE7tR2R4FKPF44vmL2DLi7ZtuuinP9o2DV/7WODOujyKZuH08xoilo91mjCle64iZI5FfJF7PeK9GIVRUcscBP+O9HMuj13gkhOOHgUiyx7JTTz0130c8pnhNIm6PopbYtzn00ENTXYuEeOyzxLii6jteo3h9otVRiPdCjC9mKMfzFz88xT7ib22REvtMsf8Xz0X8jcSPBOedd15+v5T32+LvIGbFxnjivRazJ2J/L35gOO200+rk8QMFSgAN0EsvvVTacccdSwsuuGCpRYsWpQUWWCBffvnllwtvM3To0IhaSk2aNCm9//77Na4zcuTIUt++ffP2YrsLLbRQabPNNivdfPPNFetcccUVeTvPPPPMZLf/6quvSv369SvNO++8pTnmmKPUu3fv0htvvFFadNFFS7vuumvFeg8//HDeRvxfFtfHelMyduzY0tlnn523u/DCC+cxtm3bttSzZ8/SJZdcUpo0aVKV9b/44ovSAQcckB9Hy5Yt823ifj7//POKdT799NOKMcc6yy23XH6MlY0aNSqP9+9///s0P29T8sMPP5ROP/300qqrrpqftxhH165dSwceeGDpv//9b5V1H3zwwdJaa61Vmm222Urt2rUrbb755qXXXnutyjoDBw7M4x0zZkyV5fHYZ5999snuf7311ists8wyk70+119/fWnAgAGl+eefP9/fpptuWnrvvfeq3Dbuu1evXnnc8RzutddepRdffDHfvvLzWHTfNb328bxtuOGG+X7juVhkkUVK++yzT+njjz+e7HnfdtttS3POOWepdevWpdVWW6109913V1mn/FhuuummGl/T6q81ANCwlWPRolPl7/aIBXfZZZccM7Vv3z6fHzFiRI0xwLXXXltabLHFcuzRo0eP0v33319jfHrZZZflOK1Vq1alpZdeOm+nHHtV9mvxb/k2NZ0iNqvslltuKa299to5lopT3O/+++9fevPNN6usd8EFF5S6dOmSx7bKKquUHn300byt6tsrMm7cuNJZZ51VWnnllfP9tGnTprTSSiuVBg8eXBo/fvxk6//444+lgw46qDTPPPPk9SMujf2MeAzx+Cr797//nbcbz288zxdddNFkz9uwYcNKW265Zaljx455vfg/9nHeeuutKY474vlTTjklP87YP2revHlprrnmKv3f//1fjfF4xLMRu88333z5uYrxxPMZj78u4syyeK9tvfXW+fmJ+4n3xHbbbZcf59SIfavjjjsu75/EaxHjWHbZZXN8Xj0uvuGGG0orrrhivp+55567tPPOO5c++OCDadoXKIvxRvxf/W8vXsu99947P8exDxD3FX9rlT3xxBOlNdZYI+9DxOv4l7/8Jf9NVd8HLLrv8nWV37v/+Mc/Suuuu27F87n44ouXDj/88NI333xT5XbPP/983l+MscXz9rvf/a40fPjwKusU7dPWtJ8KTJ0m8U9Rgh0AZkbRxzD6HEZFTkwnBQCYWURFd8zkjCrtmI0ITJ1oDxQV788880xuIwNQmbngAAAAAABQQBIdAAAAAAAKSKIDAAAAAEBDTKLHUanjiOIdO3bMRzO+/fbbp6qP7UorrZRatWqVjxAePasAoDbWX3/9OMKTfugAlYjNYebQuXPnHOfohw61E38z8bejHzrQ4JLo33//fVphhRXS+eefP1Xrjxo1Km266ab5YHAvvPBCOuSQQ9Kee+6Z7r///uk+VgAAmJmJzQEAoGZNSvEzWwMQ1S633XZb6tOnT+E6RxxxRLrnnnvSK6+8UrFshx12SF9//XW67777ZtBIAQBg5iY2BwCAXzRPjciTTz6ZevXqVWVZ7969c9VLkXHjxuVT2aRJk9KXX36Z5plnnrxzAAAAM1LUsHz77be5bUrTpo33EEVicwAAZpXYvFEl0T/55JPUoUOHKsvi8tixY9OPP/6YZptttsluM2jQoHTCCSfMwFECAMCve//999PCCy+cGiuxOQAAs0ps3qiS6NNiwIABqX///hWXv/nmm7TIIovkJ6Zdu3b1OjYAAGY9kWTu1KlTatu2bZrViM0BAGiMsXmjSqIvsMAC6dNPP62yLC5HwF1TpUto1apVPlUXtxGoAwBQXxp7+xKxOQAAs0ps3qiaMPbs2TMNGzasyrKhQ4fm5QAAwIwjNgcAYFZRr0n07777Lr3wwgv5FEaNGpXPjx49umK6Z9++fSvW33fffdM777yT/vKXv6Q33ngjXXDBBenGG29Mhx56aL09BgAAmBmIzQEAoAEm0Z999tm04oor5lOI/ohx/rjjjsuXP/7444qgPXTp0iXdc889ucJlhRVWSGeccUa69NJLU+/evevtMQAAwMxAbA4AADVrUiqVSmkWaxbfvn37fBAjfRcBmNlMmjQpjR8/vr6HAbO8Fi1apGbNmtV4nXj0F54LAAAaQzzaqA4sCgAUi+R5tF+IRDpQ/+acc8588M3GfgBRAACY1UmiA8BMICaWRauFqHzt1KlTatq0UR07HGa6v8cffvghffbZZ/nyggsuWN9DAgAAfgNJdACYCUyYMCEn7Tp27JjatGlT38OBWd5ss82W/49E+vzzz1/Y2gUAAGj4lKkBwExg4sSJ+f+WLVvW91CA/6/8g9bPP/9c30MBAAB+A0l0AJiJ6L0MDYe/RwAAmDlIogMAAAAAQAFJdAAAZnqdO3dOgwcPrlIlfvvtt9frmAAAgMZBEh0AqDe77bZbTmaecsopVZZHcvO3tsK48sor05xzzvkbR8iUXrs+ffpM1XrxWpZP88wzT9poo43SSy+9lOrTxx9/nDbeeON6HQMAANA4SKIDAPWqdevW6dRTT01fffVVmlk4kGRVkTSPpHWchg0blpo3b54222yzeh3TAgsskFq1alWvYwAAABoHSXQAoF716tUrJzQHDRo0xfVuueWWtMwyy+TEZ7TmOOOMM2p1P8cff3zq0aNHuvzyy9MiiyyS5phjjrTffvuliRMnptNOOy2PYf75508nnXRSldtF9fSFF16Yq5Znm222tNhii6Wbb7654vp33303r3PDDTek9dZbL/8o8M9//jNNmjQp/fWvf00LL7xwHnPc93333VdxuzXXXDMdccQRVe5rzJgxqUWLFunRRx/Nl8eNG5cOO+ywtNBCC6XZZ589rb766umRRx6ZrNr+7rvvTksttVRq06ZN2nbbbdMPP/yQrrrqqvw8zTXXXOmggw7Kj7Nsard7//33p27duuXnqpwILz+Xsf077rijosK88u2ri8cfz2+c4nk48sgj0/vvv58fb1k8F0suuWR+DPEcH3vssVV+jHjxxRfT7373u9S2bdvUrl27tPLKK6dnn3224vrHH388rbPOOvk16tSpU37M33//feGYKrdzKb+Gt956a76PGMMKK6yQnnzyySq3qe19AAAAMwdJdACYmf30U/Fp/Pi6X3caNGvWLJ188snp3HPPTR988EGN6zz33HNpu+22SzvssEN6+eWXcxI3kqyR7K2NkSNHpn/96185mX399denyy67LG266ab5fv/973/nivhjjjkm/ec//6lyu7ivbbbZJidyd9555zyO119/vco6kRg++OCD8/LevXuns88+Oyf6Tz/99Ny6JJZtscUW6e23387rx3aGDBmSSqVSxTYiEd+xY8ecqA0HHHBATuTGerGNP/zhDzmZXd5GiIT5Oeeck9eJxxXJ7K222irde++9+XTNNdekf/zjH1US/1O73Rh73D6S+qNHj86J9xD/x+tRucI8fhSYGt9991269tpr0xJLLJFbu5RFcjxez9deey0/d5dcckk666yzKq6P5yt+kHjmmWfy+yGe7/jBofy6xljiNYrHE89jJLzjcdbG0UcfnR/bCy+8kBP6O+64Y5owYUKd3gcAANAIlWYx33zzTeyp5v8BYGbx448/ll577bX8fxWbbVZ8Ov74qutus03xukceWXXdnXaqeb1a2nXXXUtbbrllPr/GGmuUdt9993z+tttuy9/Xv9zdTqUNNtigym0PP/zwUvfu3Qu3fcUVV5Tat29fcXngwIGlNm3alMaOHVuxrHfv3qXOnTuXJk6cWLFsqaWWKg0aNKjicoxj3333rbLt1VdfvfSnP/0pnx81alReZ/DgwVXW6dixY+mkk06qsmzVVVct7bfffvn8Z599VmrevHnp0Ucfrbi+Z8+epSOOOCKff++990rNmjUrffjhh1W28fvf/740YMCAiscY9/3f//634vp99tknP85vv/22yuOM5b9lu+eff36pQ4cONb52UxLrxf3NPvvs+RTbXXDBBUvPPffcFG/397//vbTyyitXXG7btm3pyiuvrHHdPfbYo7T33ntXWfbYY4+VmjZtWvE3seiii5bOOuusiutjHPE+q/waXnrppRXXv/rqq3nZ66+/PtX3MbV/l+LRX3guAABoDPGoSnQAoEGIKvBoEVK9wjvEsrXWWqvKsrgcldOV25T8mmhvEhXPZR06dEjdu3dPTZs2rbLss88+q3K7nj17Tna5+jhXWWWVivNjx45NH330UY1jLt9uvvnmSxtuuGFu/RJG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m2221KlTp3TooYemn376aYaNFwAAZlZicwAAaGBJ9BtuuCH1798/DRw4MD3//PNphRVWSL17906fffZZjetfd9116cgjj8zrv/766+myyy7L2zjqqKNm+NgBAGBmIjYHAIAGmEQ/88wz01577ZX69euXunfvni666KLUpk2bdPnll9e4/vDhw9Naa62Vdtppp1whs+GGG6Ydd9zxVytkAICGaciQIWmllVbKVaxzzz132nbbbdPIkSML13/kkUdSkyZNCk9XXnlllfVvv/32tO6666a2bdvm++jatWs65ZRTKq7/+eefcyXtcsstl2afffY077zzpp133jl98MEHVbaz++6759vOMccceb3FF188HXTQQenLL7+cDs8K1A+xOQAANLAk+vjx49Nzzz2XevXq9ctgmjbNl5988skab7Pmmmvm25QD83feeSfde++9aZNNNplh4wYA6kZUrUbCbcSIEWnBBRdMEydOTLfcckv+vv/kk09qvE27du1yi4nKp0jelcV2ys4444y01VZbpcceeywnv7t165Z+/PHHNGzYsIp1ImEY7SdeeeWV1KVLl4rq2rXXXjt98803FevdcccdeXxLL710TrRHDHLuuefm5CHMDMTmAABQrHmqJ59//nneGe3QoUOV5XH5jTfeqPE2saMat4sd21KplCZMmJD23XffKU4ZHTduXD6VjR07tg4fBQAwrQm7aAMRttlmm3TzzTenjz76KCepo3XEySefnM4555zJbhdV60899VSVZZtttll69913c1/mqIQN77//fsX2YzsHHHBArlQP3377bcX/11xzTT5/2GGHpb///e/p66+/TgsvvHB67733cm/ocozx4Ycf5h7RZeuss056/PHH0xNPPDGdniGYscTmAADQgA8sWhsxhTt2qi+44ILcp/HWW29N99xzTzrxxBMLbzNo0KDUvn37ilMc8AgAqF/PPPNMTr6Vk+ihY8eOaY011sjn77vvvqnaTvRhjsrX8Oc//7kiUR4xQiT0ovVKJN2jejyq1HfZZZf0/fff53Ui6RencsVtKN8+PPjggxXnI4F+7LHHVlS+RwI9RPIQZlVicwAAZhX1lkSPndlmzZqlTz/9tMryuLzAAgvUeJvYeY2d3z333DP3Lo0p2hG4RzA+adKkGm8zYMCAPB27fIrKNACgflX+Pp5//vkrzperYEePHj1V2zn99NNzIjy20bdv34rlb775Zv4/EuY33XRTTqB/8cUX6dprr82tJqIXerSG2WijjfJ6p512Wo4tllhiiYoke1SfV/b222/nthVRpR6izcWNN974G54FaDjE5gAA0ACT6C1btkwrr7xylb6kEWzH5Z49e9Z4mx9++KGiUqwsgv1QriSrrlWrVnknufIJAGiYir7PaxJ90//5z3/m8wceeGD+zi+LKvSyOChi9DyPHuwherCX27DE7ffbb7/cwiX6OcfBFFdZZZV8XYsWLSY7CGq0oYnbL7vssrlSff/99/+NjxgaBrE5AAA00HYu/fv3T5dcckm66qqr8nTsP/3pT7n6q1+/fvn6qCiLapWyzTffPF144YV5J3bUqFFp6NChuQImlpcDdgCg4avcwiF6oFc/v8gii/zqNuLAntFbOVq2RCK8soUWWqji/Kqrrpr/X2211SqWRQ/1MNdcc+Xe51ENGzFItKco90yPHuvVRWK9R48e+YCkIXqqv/XWW7V45NBwic0BAKCBHVg0bL/99mnMmDHpuOOOy9VksVMaPVArT+WuXN1yzDHH5F6l8X9MsZ5vvvlykH7SSSfV46MAAGorEtvzzDNPbrFyyy23pB133DEfWLR80NBym5U40GiIA4PGqSwSe5G8C5Hgm3vuuatsP1qtHH/88fn8s88+mxPi8X9Z165d8/+vvfZajifiFOLgouVWMDvssENF//a4v/XXXz9fjmr0yv3Sy+1foLETmwMAQM2alGozb3omMHbs2HwQo+jBaPooANSfiy++OO2zzz75fJcuXXJCPb6nozfziy++mA80Wj7Q58CBAyuS4uGcc85JBx98cK52jV7lcfvq+vTpk+64445cPR5J9EiORy/03//+9xVJ8OipftRRR+Ve6BEbRCI/RG/nSO7H/V955ZU5UR9V61EhH1XrX375ZV4vkozPPffcZC0tYErEo7/wXAAA0BjiUXt8AEC92HvvvfOBPiMRHcnrSFhvvfXWafjw4TmBXmTixIlp8ODB+XysX1MCPUSLiSOOOCIfFLGcaI9WE3fddVfFOtHbPE4ffPBB+vzzz9MyyyyTDzIaBwwtJ/Dj+qiMb926da5cjz7Q3bp1S4cddlh66KGHJNABAABmcirRAQBgBhKP/sJzAQBAfVKJDgAAAAAAv5EkOgAAAAAAFJBEBwAAAACAApLoAAAAAABQQBIdAAAAAAAKSKIDAAAAAECB5kVXAEBjMGbMmDR27Nj6HgbQSLVr1y7NN9989T0MAACgAZNEB6BRJ9B333f39N1P39X3UIBGao7Wc6TLL7pcIh0AACgkiQ5AoxUV6JFA73VArzTvQvPW93CARubzDz9PD573YP4skUQHAACKSKID0OhFAn3BxRas72EAAAAAMyEHFgUAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AABoxMaPH5/efPPNNGHChPoeCgAAzJQk0QEAoBH64Ycf0h577JHatGmTlllmmTR69Oi8/MADD0ynnHJKfQ8PAABmGpLoAADQCA0YMCC9+OKL6ZFHHkmtW7euWN6rV690ww031OvYAABgZtK8vgcAAADU3u23356T5WussUZq0qRJxfKoSh85cmS9jg0AAGYmKtEBAKARGjNmTJp//vknW/79999XSaoDAAC/jSQ6AAA0Qqusskq65557Ki6XE+eXXnpp6tmzZz2ODAAAZi7auQAAQCN08sknp4033ji99tpracKECenss8/O54cPH57+/e9/1/fwAABgpqESHQAAGqG11147H1g0EujLLbdceuCBB3J7lyeffDKtvPLK9T08AACYaUxTEv2aa65Ja621VurYsWN677338rLBgwenO+64o67HBwAAVPPzzz+n3XffPbdwueSSS9LTTz+dq9CvvfbanFAHAADqMYl+4YUXpv79+6dNNtkkff3112nixIl5+ZxzzpkT6QAAwPTVokWLdMstt9T3MAAAYJZQ6yT6ueeem6tdjj766NSsWbMqBzZ6+eWX63p8AABADfr06ZNuv/32+h4GAADM9Gp9YNFRo0alFVdccbLlrVq1St9//31djQsAAJiCrl27pr/+9a/piSeeyD3QZ5999irXH3TQQfU2NgAAmKWT6F26dEkvvPBCWnTRRassv++++1K3bt3qcmwAAECByy67LLdUfO655/KpsuiVLokOAAD1lESPfuj7779/+umnn1KpVMoHMbr++uvToEGD0qWXXlpHwwIAAH5thigAANAAk+h77rlnmm222dIxxxyTfvjhh7TTTjuljh07prPPPjvtsMMO02eUAABAoShuKVegAwAA9Xhg0QkTJqSrr7469erVK7399tvpu+++S5988kn64IMP0h577FHHQwMAAKYkYvPlllsuF7nEafnll0/XXHNNfQ8LAABm3Ur05s2bp3333Te9/vrr+XKbNm3yCQAAmLHOPPPMdOyxx6YDDjggrbXWWnnZ448/nuP1zz//PB166KH1PUQAAJg127msttpqacSIEZMdWBQAAJhxzj333HThhRemvn37VizbYost0jLLLJOOP/54SXQAAKivJPp+++2X/vznP+cWLiuvvHKaffbZq1wfU0gBAIDp6+OPP05rrrnmZMtjWVwHAADUQ0/0EAcPHTVqVDrooIPytNEePXqkFVdcseL/2jr//PNT586dU+vWrdPqq6+enn766Smu//XXX6f9998/LbjggqlVq1ZpySWXTPfee2+t7xcAABqzJZZYIt14442TLb/hhhtS165dp2mbYnMAAKiDSvRIoNeVCPD79++fLrroohykDx48OPXu3Tu9+eabaf75559s/fHjx6cNNtggX3fzzTenhRZaKL333ntpzjnnrLMxAQBAY3DCCSek7bffPj366KMVPdGfeOKJNGzYsBqT679GbA4AAHWURK/LXuhxMKS99tor9evXL1+OgP2ee+5Jl19+eTryyCMnWz+Wf/nll2n48OGpRYsWeVlUygAAwKxmm222Sf/5z3/SWWedlW6//fa8rFu3brl6fFpmiIrNAQCgjpLoYeTIkbky5fXXX8+Xu3fvng4++OC0+OKLT/U2onLlueeeSwMGDKhY1rRp09SrV6/05JNP1nibO++8M/Xs2TNPGb3jjjvSfPPNl3baaad0xBFHpGbNmtV4m3HjxuVT2dixY2vxSAEAoOGKYxRde+21v3k7YnMAAKjDnuj3339/TppHhUscRDROUQGzzDLLpKFDh071dj7//PM0ceLE1KFDhyrL4/Inn3xS423eeeedPFU0bhe9Fo899th0xhlnpL/97W+F9zNo0KDUvn37ilOnTp1q8WgBAKBhing4YvPqYtm//vWvWm1LbA4AAHWYRI+pnIceemhOnMeUzzjF+UMOOSRXnUxPkyZNyj0XL7744lx1Ez0gjz766DzVtEhU03zzzTcVp/fff3+6jhEAAGaEiMsjgV1dqVSqsf1KXRObAwAwq6h1O5do4VLTgYp233333OJlas0777x5muenn35aZXlcXmCBBWq8zYILLpj7LVaeHhp9H6M6JqagtmzZcrLbtGrVKp8AAGBm8vbbb+cZotUtvfTS6b///W+ttiU2BwCAOqxEj16HL7zwwmTLY1lUokytCKqjYmXYsGFVqlnicvRWrMlaa62VdwhivbK33norB/A1BekAADCzinYo0VKluoiXZ5999lptS2wOAAB1mETfa6+90t57751OPfXU9Nhjj+XTKaeckvbZZ598XW30798/XXLJJemqq67KFe5/+tOf0vfff5/69euXr+/bt2+VgxvF9V9++WU+iGkE6Pfcc086+eST88GMAABgVrLlllvmloojR46sWBZJ7T//+c9piy22qPX2xOYAAFBH7VzigEFt27bNBw0qB9EdO3ZMxx9/fDrooINqta3omzhmzJh03HHH5WmfPXr0SPfdd1/FAY1Gjx6dmjb9Jc8fBx6KAyVFT/Y4oOlCCy2Ug/bp3YsdAAAamtNOOy1ttNFGuX3LwgsvnJd98MEHaZ111kmnn356rbcnNgcAgJo1KcWRh6bRt99+m/+PpHpjMXbs2Dz1NQ5k1K5du/oeDgC/QVRf7nnQnmmHQTukBRdbsL6HAzQyH7/zcRoyYEi69JxL0+KLL94o49EI5YcOHZpefPHFNNtss+Vk9rrrrpsaC7E5AAD1aWrj0VpXoo8aNSpNmDAhde3atUryPA5sFAcW6ty587SPGgAAmGpNmjRJG264YT4BAAANpCf6brvtloYPHz7Z8v/85z/5OgAAYPp58skn0913311l2dVXX526dOmS5p9//nz8onHjxtXb+AAAIM3qSfQRI0aktdZaa7Lla6yxRnrhhRfqalwAAEAN/vrXv6ZXX3214vLLL7+c9thjj9SrV6905JFHprvuuisNGjSoXscIAACzdBI9poyWe6FXFn1jJk6cWFfjAgAAahCFK7///e8rLg8ZMiStvvrq6ZJLLkn9+/dP55xzTrrxxhvrdYwAADBLJ9HjQEVR2VI5YR7nY9naa69d1+MDAAAq+eqrr1KHDh0qLv/73/9OG2+8ccXlVVddNb3//vv1NDoAAJj51PrAoqeeempOpC+11FJpnXXWycsee+yxfCTThx56aHqMEQAA+P8igT5q1KjUqVOnNH78+PT888+nE044oeL6mDXaokWLeh0jAADM0pXo3bt3Ty+99FLabrvt0meffZaD9L59+6Y33ngjLbvsstNnlAAAQLbJJpvk3udRyDJgwIDUpk2biuKWELH64osvXq9jBAAal2gPt9JKK6XZZpstzT333GnbbbdNI0eOnOJtdtttt9z2ufpp4YUXrljnxx9/TFtvvXXq3Llz3na7du1St27d0tFHH51++umnivVKpVK68sor0yqrrJLXmXPOOdMWW2yRXnvttRrvO7pirLnmmhX3GbERNKhK9NCxY8d08skn1/1oAACAKTrxxBPzzuh6662X5phjjnTVVVelli1bVlx/+eWXpw033LBexwgANB6XXXZZ2nPPPfP5Ll26pC+++CLdcsst+Qf7F198MS2wwAJTvP1CCy1UJXE+//zzV5wfN25cuvvuu9Oiiy6alllmmfThhx/mQtzIK8b9XHTRRXm9mFVXnlm35JJL5qLdOFh6jGHEiBE5CV/9QOtPPvlknT4PUCeV6J9//nl67733qix79dVXU79+/XJV+nXXXTe1mwIAAKbRvPPOmx599NHcGz1OW221VZXrb7rppjRw4MB6Gx8A0HhEa7hyFfc222yT3nnnnfT666+ntm3b5g4UU1NEGwn4p556quJ05513VlzXvn379N1336W33347Pfvss/m4LZGoD0888UTFehdccEH+Pyrg33zzzfTuu+/mxPnXX3892RiGDx+eTjrppJyPhAaXRD/wwAPTOeecU3E5/pBi2ugzzzyTf1WKKRzXXHPN9BonNBj1PcXpwQcfzH978803X646i194119//XTHHXdUrPPII4/UeH/lU0yRAgAat9gpbdas2WTLIz6pXJkOAFAk8npROFtOopc7UKyxxhr5/H333fer2xg8eHBq1apVPl7LDjvsUCVHEjmIiEsi0b7aaqulRRZZJB/bJay99toV602aNCn/37Tp/1KV5fxFOQ9SFsdk/OMf/5jH+I9//KNOngOo03Yu8UtS5cTb1VdfnQP0F154ITVv3jydfvrp6fzzz0+77LLL1G4SGp2GMMXplVdeyafYTpxinX//+995DHGKnmCRgF999dWr3Penn36af8kNCy64YJ0+LwAAAEDjE5XhNeUo4kDmYfTo0VO8fSTII8cQFe1RxX7DDTekBx54IL388ss5B1IWeYxI2JftvPPOVYp1o6r8wgsvTDfeeGPOr0Q7l48++ihfF/mRsv333z93ynj44Ydz33SYUaa6Ev2TTz6p0n/ooYceylWzkUAP0ew/pmbAzKqhTHH605/+lKduxxdS9AWLxHv5V9tyP7ColK98P3GKxHxYaqml9EkFAAAACsWBPn/NYYcdlov+IjcS1efl4r/IWVxxxRVV1o28RMyyj+K/qCL/5z//mY/zUnbmmWemo446KudBInEfifn/+7//y9e1aNEi/3/bbbela6+9Nq+37rrr1vEjhjpKokdla/QhKnv66aerVLrGFIuopIWZVUOZ4hS3j19d435XXHHFtPnmm1dMeYoq9JrEF9q9996bz//5z3+umBIFAAAAzLoiP1EWBYLVz0duosiyyy6bD3Jeubq8rKYK9shnRH5j++23z5ejGPGHH37I51u3bp37nEfBYiyL4sJy4W4UA4aoUC8n3ON+K993LKs88x/qLYkeCbuYZhHVrjfffHOeVlH+RSi89dZbVf7wYGZTV1Oc4kP9gw8+yFOcVl111SrTkipPcfr4449rnOJU7p/+n//8J7dTivOzzz577tXes2fPGu872i3Fr8gx7r59+07DowcAAABmNpGXmGeeefL5aFcboo1KVI6HjTbaKP+/9NJL59N5551Xcds4kPmYMWMqLkdeoqzczWLYsGHp+eefr1geM/DjAOlh4sSJFceAiyLCKBgsK7eFCVGEWFkk2b///vt8Kvv555/ztqHek+gxxSJaT8QBD+MXo7/85S9prrnmqvKHst56602vcUKDNaOnOIX44or7jW2ecsop+Ytj7733rvLFVLkVU2yjfIDg+OUXAGj8rrrqqnTPPfdUXI74PHqDxsy0yjuhAABTKvgrt6eNJPpiiy2WunXrlotn55133oq2tm+++WY+lWfoh7/+9a/52HBdu3ZNSyyxRNprr73y8lhWPp5c5DZWXnnlXNTXo0ePnOd47rnn8nUxsz6OtxhiWdz3kksumVu6lBPn0QXjoIMOyuePP/74nAupfCo74ogjqnTQgHpLoi+//PI5ARgN/ocPHz5ZUi/e3PGGhZlVQ5niVFl82cTfXfygFV8WUXFe3bnnnptbLUW1+n777TeVjxYAaOgiPogClxDHRTn//PPTaaedlnd4Dz300PoeHgDQSERRXvQajyR3VKFHC9g4DmLk/yLpXSTar8SP92PHjs2z7CORvu++++ZWLOUZ/NHZYv3118/bfPXVV3OHixVWWCEn4CPHWBYJ9GhtGzmW2Nbiiy+ee59HJbtiQBqC/zUXmkoRkG+55ZY1XrfpppvW1ZigQU9xiurv+HV2xx13LJziFA444IB8Kk9xivPzzTffFKc4RTI8DgpaNMWpTZs26dJLL81fZuVfa+NLrfxra+WpTOXLcXTr0K9fv4rbAACNX7Sai53VcPvtt+djtsRO8FprrZV3VgEAplYU+1Uu+JuaWfiR5I7TlESupJwvmZLIhURRwPToDgAztBIdZnUNZYrT3/72t7xObKt79+65Yr38pVG93/lll12WW8Y0a9Ys9e/ff4Y8TwDAjBGz3OLH/RA9QzfYYIOKA3PFMVMAAIC6IYkOjWyKU7ROiuR9THGKA/pGdXzv3r3TvffemyvQyqJ6ffDgwfl8jDF6igEAM49ImseP8XGKmGCTTTbJyyOOKM90AwAAZnA7F6D+pzjFgUTj9Gui+vydd9751fUAgMYpeqAfc8wxua1LzJKLH9ZDzGSLtnMAAEDdkEQHAIBGaM4550znnXfeZMtPOOGEehkPAADMrGqdRI/q1o8//riiBUVZ9GOMZdFCAgAAqHsvvfTSVK+7/PLLT9exAADArKJ5XR31dty4cfnAiwAAwPQRx2WJ46dETB7/T4niFgAAmMFJ9HPOOSf/H8H6pZdemuaYY44qAfqjjz6all566ToaFgAAUN2oUaMqzo8YMSIddthh6fDDD089e/bMy5588sl0xhlnpNNOO60eRwnArGjMmDFp7Nix9T0MoJFq165dmm+++VKjT6KfddZZ+f+oernoootyW5eyqEDv3LlzXg4AAEwfiy66aMX5P/zhD7nQZZNNNqnSwqVTp07p2GOPTX369KmnUQIwKybQd9939/TdT9/V91CARmqO1nOkyy+6vMEm0pvXturld7/7Xbr11lvTXHPNNT3HBQAATMHLL7+cunTpMtnyWPbaa6/Vy5gAmDVFBXok0Hsd0CvNu9C89T0coJH5/MPP04PnPZg/Sxp9Er3s4Ycfnj4jmUWY3gTMzNObAJhxunXrlgYNGpRbLZaPTTR+/Pi8LK4DgBktEugLLrZgfQ8DoP6T6NH//Morr0zDhg1Ln332WZo0aVKV6x966KG6HN9Ml0Dft1+/9NO339b3UIBGqnXbtumiK66QSAcgt1LcfPPN08ILL5zbuISXXnopH8Porrvuqu/hAQDArJtEP/jgg3MSfdNNN03LLrtsDtKZOlGBHgn0A9ZdNy08zzz1PRygkfngiy/SeY8+2qCnNwEw46y22mrpnXfeSf/85z/TG2+8kZdtv/32aaeddkqzzz57fQ8PAABm3ST6kCFD0o033ljlAEbUTiTQF+vQob6HAQBAIxfJ8r333ru+hwEAADO1WifRo9/iEkssMX1GAwAAFLrzzjunet0ttthiuo4FAABmFbVOov/5z39OZ599djrvvPO0cgEAgBmoT58+VS5HPF4qlSZbVj6WEQAAUA9J9Mcffzw9/PDD6V//+ldaZpllUosWLapcf+utt9bBsAAAgOomTZpUcf7BBx9MRxxxRDr55JNTz54987Inn3wyHXPMMXkZAABQN2qdRJ9zzjnTVlttVUd3DwAATItDDjkkXXTRRWnttdeuWNa7d+/Upk2b3Cf99ddfr9fxAQDALJtEv+KKK6bPSAAAgKk2cuTIXOBSXfv27dO7775bL2MCAICZUdNpudGECRPy9NF//OMf6dtvv83LPvroo/Tdd9/V9fgAAIAarLrqqql///7p008/rVgW5w8//PC02mqr1evYAABglq5Ef++999JGG22URo8encaNG5c22GCD1LZt23TqqafmyzGlFAAAmL4uv/zy3GZxkUUWSZ06dcrL3n///dS1a9d0++231/fwAABg1k2iH3zwwWmVVVZJL774YppnnnkqlkcAv9dee9X1+AAAgBosscQS6aWXXkpDhw5Nb7zxRl7WrVu31KtXr9SkSZP6Hh4AAMy6SfTHHnssDR8+PLVs2bLK8s6dO6cPP/ywLscGAABMQSTLN9xww3wCAAAaSE/0SZMmpYkTJ062/IMPPshtXQAAgOkrjlH097//Pa200kppjjnmyKc4f/rpp6eff/65vocHAACzdhI9qlwGDx5cpfolDig6cODAtMkmm9T1+AAAgEp+/PHHtP7666cjjzwyzTfffGnPPffMpzh/xBFHpN///vfpp59+qu9hAgDArNvO5Ywzzki9e/dO3bt3z8H5TjvtlN5+++0077zzpuuvv376jBIAAMhOOeWUfADRESNGpOWXX77KdXHcoi222CKvc/zxx9fbGAEAYJZOoi+88MI5OB8yZEg+kFFUoe+xxx5p5513TrPNNltqNKI6p1pf96xp06rLp1TFU9t1K4tptqVSzevGgaBatJi2dSdMiJ47xeOoPN76WjfGWz7Y1fRaN1oO1dB2aJrWbd78l9evIawbz0E8F0WaNfvfqaGsG+/dKU0rr8268RzEczE91w3jx9f/ujX83Tf5+efUIp77ceOq3jYuT+kzolWrqmOY0t9R69b1v26Mt/z3Gc/DlP42Kj3uJj9PSE0mFm93Uqtf/u6bTJiYT3Wybstf/j7rdN0Wv/xt1GbdeL6a/ly8bql5s3yq9bqTJqWm4yfU/bqlUmo67ue6WbdZ01Rq0bzu123aJJVa/vJd2/Sn8fW/box3Cn/3+T08Des2Gf9zajKpYN14aVu3rP91K/991ubvvoZ1m437ObWYODE1KX+OVo45pvQ9V/lz6tfWjRip/B1eXvc3VolHHH7mmWdOlkAPK6ywQm7pcvTRR0uiAwBAfSXR842aN09//OMfU6PWt2/V5HPZKqukNHDgL5fjcVZPWJUtu2xKgwb9cnmPPVIaO7bmdbt2TWn//SsutrziitTkm29qXLU0zzxp/O67/7LuNdekJl98UfO67dun8Xvv/cu611+fmnzySc1jmG22NO6AAyoutrj55tT0/fdrXrdFizTukEN+uXjHHanpO+/UvG7k8A4//Jd17703NX3zzeJ1Dz64IunefOjQ1OyVV4rXjeesTZv/rfvww6nZCy8UrxvPQ/v2/1v3scdSs2eeKVx3fL9+qTTvvPl8s6eeSs2HDy9e949/TKUFF/zfus89l5r/+9/F626/fSotssj/1n3ppdT8wQcL1/15663TpMUXz+ebvv56avGvfxWvu/nmadLSS/9v3bfeSi3uuqt43Y03TpPivRnrjhqVWtx6a+G6E3r1ShNXXDGfb/LBB6nlDTcUr7veemniaqv9b91PP00tr722eN0110wT11rrf+t+8UV+vxeZuOqqacL66//vwtixqdXFFxev26NHmrDBBv+78OOPqdX55xevu+yyacLGG//vws8/p1Znn1247qSllko/b7FFxeUprrvYYunnbbb5Zd0LLihM0E/q1Cn9vMMOv6wbj+3HH2tct7TAAmn8LrtM8TNikXHj0oBPPknznnRSSv/85y9XHHpoSkV/y/PPn9Jll/1y+cgjU3r77ZrXbdeu6nbjs7Do7zMSSDff/Mvl+Cx89tlUqPJ79swzU3riieJ1b7rpl6R7vMbDhhWu2vTEEyvOL3rV0DT//c8VrvvCBQek8fPNmc8vfN3DacG7nipc9+Uz90k/dpovn+946+NpoZseK1z31UG7p++X6JjPL3DP06nTtcXjff34P6Zvl+mcz8/34IjU+bL7Ctd968jt09crd83n53n8lbTY+cV/9/89dOv05Zrd8/m5//NmWuKs4r/7d/bfPH2+/gr5/JwvvJOWPKX47/7dPTZKn220Sj7f9vXRqdvxxX/37//x9+njLXvm87O/80laZsDlhet++Id10ofbrZfPz/bB52m5/v8oXPfjzddI7/ftlc+3/Pyb1GO/8wrX/az3yundPf/3d9987A9ppT3PKlz38/WXT+/sv0VFknmVXU4rXPfLNZZO//3zthWXp7Tu1ystkd4a8Mvf/Up7npmajqs5wfpt90XS6yf0rbjcY/9zU/OxNX9GfL/4gunVU/aouLzcoRelVmNqjiN+XHje9PJZ+1ZcXubIy/LzXJNx87VPL15wYMXl7sddnWYf+XGN605oN1t6/rI/V1xe+qTrU9vXRte47qRWzdOz1x5ZcbnrGbekOZ//byry9E3HVJxf/Nw70txPvVG47rPX/KUi6d7l4nvTvI+8VLju85cemia0n73wM2LcDz+l7m98lDpEfDRkyP8+M8PVV6d0222F282fTf//+z7deGNKU5qNGZ95EQeGO+9MKb4Tf2PP8vfeey+t9v+/k2uyxhprpNGja35tAACA2pumJPpHH32UHn/88fTZZ5/lA41WdtBBB03LJgEAgKnQrl27HId36tSpxus/+eST1LZt2xk+LgAAmFk1KZWK5vfW7Morr0z77LNPatmyZZpnnnnygUUrNtakSXpnCtXKDcHYsWNT+/bt0zeffpp3QGZkO5eR77+fDtp993TKVlulxeaeWzuX6bmudi4NZ13tXKZt3Rr+7kd99lk65s470xn/+EdavPv/qo5n9XYuIz/4IO158F5ph0E7pI6d5tPOJWjnUvfraucy07Zz+WTUJ+nGY29MF515UVqsW7cZ1s4lx6MdOqRvvvmm5nj0V2y//fZpwoQJ6ZZbbqnx+m222SY1a9Ys3RhV8g1cRWw+jc8FAA3DyJEj054H7Znj8gUX+99MboCp9fE7H6chA4akS8+5NC3+/7s2NLR4tNaV6Mcee2w67rjj0oABA1LT6n2+G5NI6FRO6kxpvdpsc2rV1EqmLtatnISbldetnJid2dat/uNNQ183kgyNad3QENat4e++1KJF+jme+8pJ8VD9cl2NoaE8D1P6DKz0Q24kREtT+XFZJTE7k60bnyWTmk2HdZs2rZLorLN1I4nbmNatlvCtt3UrJb7rct1I1Jca07q1+buvYd2JrVqkn5s1S6XKSfFyzDG1cce0rDulH1WnwsCBA9Pqq6+e27b0798/Lb300inqYl5//fV01llnpddeey099VRxyyoAAKB2ap1E/+GHH9IOO+zQuBPoAADQSHXv3j0NHTo07bHHHjkuL88MjUR6JNQfeOCBtMwyy9T3MAEAYNZNokewftNNN6Uj4+B0AADADBdV6K+++mp64YUX0ltvvZWXLbnkkqlHjx71PTQAAJjp1DqJPmjQoLTZZpul++67Ly233HKpRbVp9meeeWZdjg8AACgQSXOJcwAAaIBJ9Pvvvz8ttdRS+XL1A4sCAAAAAMAsm0Q/44wz0uWXX55222236TMiAAAAAABoIGp9dNBWrVqltdZaa/qMBgAAAAAAGnMS/eCDD07nnnvu9BkNAAAAAAA05nYuTz/9dHrooYfS3XffnZZZZpnJDix666231uX4AACA/++ll16a6nWXX3756ToWAACYVdQ6iT7nnHOmrbfeevqMBgAAKNSjR4/UpEmTVCqV8v9TMnHixBk2LgAAmJnVOol+xRVXTJ+RAAAAUzRq1KiK8yNGjEiHHXZYOvzww1PPnj3zsieffDKdccYZ6bTTTqvHUQIAwCyeRA8TJkxIjzzySBo5cmTaaaedUtu2bdNHH32U2rVrl+aYY466HyUAAJAWXXTRivN/+MMf0jnnnJM22WSTKi1cOnXqlI499tjUp0+feholAADM4kn09957L2200UZp9OjRady4cWmDDTbISfRTTz01X77oooumz0gBAIAKL7/8curSpctky2PZa6+9Vi9jAgCAmVHT2t7g4IMPTqusskr66quv0myzzVaxfKuttkrDhg2r6/EBAAA16NatWxo0aFAaP358xbI4H8viOgAAoJ4q0R977LE0fPjw1LJlyyrLO3funD788MM6GhYAADAlMQN08803TwsvvHBu4xJeeumlfMDRu+66q76HBwAAs24SfdKkSWnixImTLf/ggw9yWxcAAGD6W2211dI777yT/vnPf6Y33ngjL9t+++3zMYtmn332+h4eAADMukn0DTfcMA0ePDhdfPHF+XJUunz33Xdp4MCBVQ5qBAAATF+RLN97773rexgAADBTq3VP9DPOOCM98cQTqXv37umnn37KlS7lVi5xcFEAAGDGuOaaa9Laa6+dOnbsmN5777287Kyzzkp33HFHfQ8NAABm3SR69Fx88cUX01FHHZUOPfTQtOKKK6ZTTjkljRgxIs0///zTZ5QAAEAVF154Yerfv3/aeOON01dffVXRcnGuuebKM0cBAIB6aucS1eetW7dOf/zjH+toCAAAQG2de+656ZJLLkl9+vTJRS1lq6yySjrssMPqdWwAADAzqXUlelSb77rrrmno0KH5IKMAAMCMN2rUqDwrtLpWrVql77//vl7GBAAAM6NaJ9Gvuuqq9MMPP6Qtt9wyLbTQQumQQw5Jzz777PQZHQAAUKMuXbqkF154YbLl9913X+rWrVu9jAkAAGZGtW7nstVWW+XTt99+m26++eZ0/fXXpzXWWCMttthiucXLcccdN31GCgAAVIh+6Pvvv39ut1gqldLTTz+dY/NBgwalSy+9tL6HBwAAs24lelnbtm1Tv3790gMPPJBeeumlNPvss6cTTjihbkcHAADUaM8990ynnnpqOuaYY/JM0Z122ikfbPTss89OO+ywQ30PDwAAZt1K9LKoeLnzzjvTddddl6eMdujQIR1++OF1OzoAAKDQzjvvnE+RRP/uu+/y8YsAAIB6rkS///7784FFI2n+pz/9Kf8f1ejvvfdeOuWUU+p4eAAAQE3++te/poceeiifb9OmTUUCPQ4qGtcBAAD1lESPfug//vhjuvrqq9Mnn3yS/vGPf6R11123joYDAABMjeOPPz5tvPHG6cwzz6yyPCrStVkEAIB6bOfy6aef5n7oAABA/YrClji46Msvv5yLW1q2bFnfQwIAgJlOrZPokUCfOHFiuv3229Prr7+el3Xv3j1tueWWqVmzZtNjjAAAQA1+97vfpf/85z9p8803T+uvv36O0QEAgHpu5/Lf//43devWLfXt2zfdeuut+bTLLrukZZZZJo0cObKOhwcAANSkSZMm+f/FF188PfXUU6ldu3Zp5ZVXTs8++2x9Dw0AAGbtJPpBBx2UA/X3338/Pf/88/k0evTo1KVLl3wdAAAw/ZVKpYrzkUC/99578/GL+vTpU6/jAgCAmU2t27n8+9//zpUuc889d8WyeeaZJ51yyilprbXWquvxAQAANbjiiitS+/btKy43bdo0nXPOOWnFFVdMjz76aL2ODQAAZukkeqtWrdK333472fLvvvvOgYwAAGAG2XXXXWtc3q9fv3wCAADqKYm+2Wabpb333jtddtllabXVVsvL4mBG++67b9piiy3qaFgAAEB1UWkesXjr1q3z+Sn1Sz/wwANn6NgAAGBmVeskegTrUfXSs2fP1KJFi7xswoQJOYF+9tlnT48xAgAAKaWzzjor7bzzzjmJHueLSKIDAEA9JdHj4EVjx45NQ4YMSR9++GF6/fXX8/Ju3bqlJZZYog6HBQAAVDdq1KgazwMAAA0oiR7J8ldffTV17dpV4hwAAAAAgJlarZLoTZs2zcnzL774Iv8PAADMOP3795/qdc8888zpOhYAAJhV1Lon+imnnJIOP/zwdOGFF6Zll112+owKAACYzIgRI6ZqveiJDgAA1FMSvW/fvumHH35IK6ywQmrZsmWabbbZqlz/5Zdf1tHQAACAyh5++OH6HgIAAMxyap1EHzx48PQZCQAAAAAANPYk+q677jp9RgIAANTKs88+m2688cY0evToNH78+CrX3XrrrfU2LgAAmKWT6GHixInptttuS6+//nq+3L1797Tlllum5s2naXMAAEAtDRkyJLda7N27d3rggQfShhtumN5666306aefpq222qq+hwcAADONWme9X3311bTFFlukTz75JC211FJ52amnnprmm2++dNdddznYKAAAzAAnn3xyOuuss9L++++f2rZtm84+++zUpUuXtM8++6QFF1ywvocHAAAzjaa1vcGee+6ZlllmmfTBBx+k559/Pp/ef//9tPzyy6e99957mgZx/vnnp86dO6fWrVun1VdfPT399NNTXX3TpEmT1KdPn2m6XwAAaKxGjhyZNt1003y+ZcuW6fvvv8+x8aGHHpouvvjiadqmuBwAAOogif7CCy+kQYMGpbnmmqtiWZw/6aST0ogRI2q7uXTDDTek/v37p4EDB+aE/AorrJCnpH722WdTvN27776bDjvssLTOOuvU+j4BAKCxixj822+/zecXWmih9Morr+TzX3/9dfrhhx9qvT1xOQAA1FESfckll8x9FquL4HqJJZao7ebSmWeemfbaa6/Ur1+/3Fv9oosuSm3atEmXX375FHuy77zzzumEE05Iiy22WK3vEwAAGrt11103DR06NJ//wx/+kA4++OAcV++4447p97//fa23Jy4HAIA6SqJHFfpBBx2Ubr755tzSJU5x/pBDDsm90ceOHVtx+jXjx49Pzz33XOrVq9cvA2raNF9+8sknC2/317/+Nc0///xpjz32qO3wAQBgpnDeeeelHXbYIZ8/+uijcxV5FLtss8026bLLLqvVtsTlAABQhwcW3WyzzfL/2223Xe57GEqlUv5/8803r7gc10VlypR8/vnneZ0OHTpUWR6X33jjjRpv8/jjj+edgmgrMzXGjRuXT2VTk9wHAICGbu65566S8D7yyCOneVszIi4PYnMAAGaJJPrDDz+c6kv0fNxll13SJZdckuadd96prpyP6aUAADAzGT169BSvX2SRRRpUXB7E5gAAzBJJ9PXWW6/O7jwC7mbNmk3WYz0uL7DAApOtP3LkyHzgonLFe5g0aVL+v3nz5unNN99Miy++eJXbDBgwIE9trVzt0qlTpzp7DAAAUB86d+5cMTO0Jr82K3RGx+VBbA4AwCyRRA8//fRTeumll/LBRMvBctkWW2wx1dtp2bJlWnnlldOwYcNSnz598rLYXlw+4IADJlt/6aWXTi+//HKVZcccc0yuhDn77LNrDMBbtWqVTwAAMDMZMWJElcs///xzXhYHCD3ppJNqta0ZEZcHsTkAALNEEv2+++5Lffv2zX0Tq5uaPujVRSXKrrvumlZZZZW02mqrpcGDB6fvv/8+9evXL18f97XQQgvlqZ+tW7dOyy67bJXbzznnnPn/6ssBAGBmtsIKK0y2LGLqjh07pr///e9p6623rtX2xOUAAFBHSfQDDzww/eEPf0jHHXfcZAcemhbbb799GjNmTN7eJ598knr06JET9eVtR6/HOFASAADw65Zaaqn0zDPP1Pp24nIAAKijJHr0RYwqlbpIoJfFFNGapomGRx55ZIq3vfLKK+tsHAAA0FhEP/HKSqVS+vjjj9Pxxx+funbtOk3bFJcDAEAdJNG33XbbHEDXdKAgAABgxoj2KdUPLBqJ9OhHPmTIkHobFwAApFk9iX7eeefldi6PPfZYWm655VKLFi2qXH/QQQfV5fgAAIAaPPzww1UuR6uV+eabLy2xxBKpefNah/kAAECBWkfX119/fXrggQfywYSiIr1y9Uucl0QHAIDpb7311qvvIQAAwCyh1kn0o48+Op1wwgnpyCOPdGAhAACoJ3feeedUr7vFFltM17EAAMDMrNZJ9PHjx6ftt99eAh0AAOpRnz598kzQ6INeWfVlcXnixIn1MEIAAJg51DoTvuuuu6Ybbrhh+owGAACYKtFisUePHulf//pX+vrrr/Mpzq+00krp/vvvT5MmTconCXQAAJjBlegRhJ922mk5MF9++eUnO7DomWee+RuHBAAA/JpDDjkkXXTRRWnttdeuWNa7d+/Upk2btPfee6fXX3+9XscHAACzbBL95ZdfTiuuuGI+/8orr1S5rvJBRgEAgOln5MiRac4555xsefv27dO7775bL2MCAICZUa2T6A8//PD0GQkAADDVVl111dS/f/90zTXXpA4dOuRln376aTr88MPTaqutVt/DAwCAmYajgwIAQCN0+eWXp48//jgtssgiaYkllsinOP/hhx+myy67rL6HBwAAs14l+tZbbz1V6916662/ZTwAAMBUiKT5Sy+9lIYOHZreeOONvKxbt26pV69e2iwCAEB9JNGjtyIAANBwRLJ8ww03zCcAAKCek+hXXHHFdBoCAAAwtTbZZJN0/fXXVxS5nHLKKWnfffetOMjoF198kdZZZ5302muv1fNIAQBg5qAnOgAANCL3339/GjduXMXlk08+OX355ZcVlydMmJDe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RAcAAKDRGTJkSFpppZXSbLPNluaee+607bbbppEjR/7q7c4999zUvXv31KpVqzT//POn3XffPX366aeTrXf77benddddN7Vt2zbfR9euXdMpp5xScf3EiRPTSSedlJZddtm8zhxzzJGWXnrpdNRRR6Vx48ZVrDdgwIDUrVu31K5du9S6deu06KKL5vt877336vDZAACmJ0l0AAAAGpXLLrss7bjjjmnEiBFpwQUXzAntW265Ja255prpk08+Kbzdsccemw466KD0+uuv52T2d999l6644oq0/vrrpx9++KFivTPOOCNttdVW6bHHHsvJ8UiC//jjj2nYsGEV65x44onpmGOOSa+++moewwILLJDefPPNNGjQoJxIL7v//vvT999/n5PwnTp1SqNHj8732bt37+n4DAEAdUkSHQAAgEZj/Pjx6cgjj8znt9lmm/TOO+/kpHhUg3/22Wfp5JNPrvF2UW1+6qmn5vN//vOf01tvvZWeeuqp1KRJk/TGG2+kiy66KF/3/vvvV2z/nHPOSR999FF6/vnn0wcffJBuvfXWiu09/vjj+f+oPo9tvf3226lz5855WeUq8+HDh+fE+XPPPZfX+eMf/5iXR8L9iy++mE7PEgBQlyTRAQAAaDSeeeaZ9Pnnn1ck0UPHjh3TGmuskc/fd999Nd7uwQcfTD///HOV2y2//PJpiSWWqHK7SJRPmDAhzT777DnJPu+88+ZK81122SVXlJets846+f9IwC+55JK50vzdd99Nyy23XK5SL4sWLhdccEFaffXV8zrXXnttXh4tZaINDQDQ8EmiAwAA0GhEpXhZ9DQv69ChQ/4/qr5/y+2iQjxEwvymm27KCfSoGI/k9yabbFKRiI/WMOWK9agwj37sUdUePdKjtUtlse2nn346/fe//82XV1xxxTR06NC8PgDQ8EmiAwAA0OiVSqU6uV1UoZddfvnl6ZVXXsk92EP0YH/iiSfy+euuuy73Ti9XoEcLlzh//fXXp379+lXZZhyQNLYbVeu/+93v8nZ23nnn3MsdAGj4JNEBAABoNOLgnGXRA736+UUWWeQ33W6hhRaquG7VVVfN/6+22moVyyJhHo444ohclb7xxhvng5TG7TfaaKOK1jHVNWvWLC211FLpkEMOyZcfeeSRKgcqBQAaLkl0AAAAGo1IbM8zzzz5/C233JL/j4N/Rv/yUE5kxwE/43Teeefly7///e9T8+bNq9zupZdeqmixUr5dr169Ku7r2WefrfJ/iGrz8M033+T/X3jhhVxRHqeoMA/RT73c5uXOO+9MkyZNypfj/8o92yv3WAcAGi5JdAAAABqNli1bppNPPrkiGb7YYoulbt26pW+//TYfBLTcpzx6m8epfBDS6FN++OGH5/PRhiWqwuNgpNHOJRLj++yzT75urbXWSltuuWU+H21Z4kCh5fYskYiP6ysfnPTRRx9NXbp0yeN47LHH8rJdd901///hhx/mbbVv3z6tsMIK+QCoF154Yb5u4YUXztsDABo+SXQAAAAalb333jsf6LNHjx65Cj0O0Ln11lun4cOH50R1kZNOOikNHjw4V6iPGjUqV4xHwjsS4eXq8TBkyJDcriUS71FNHknyOJDoXXfdVbHOP/7xj7y9ZZZZJn399df5FInyc845Jw0aNCivEy1e+vTpk+aaa66c0P/qq6/S4osvnhP2Tz75ZGrXrt10fqYAgLrwv7lsAAAA0IjEgTnjVJsDjUay/eCDD86nKWndunU+GGicprTOUUcdlU9Fojr9tttum+J9AQANn0p0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUKB50RUAAAAzszFjxqSxY8fW9zCARqpdu3Zpvvnmq+9hADADSKIDAACzZAJ933790k/fflvfQwEaqdZt26aLrrhCIh1gFiCJDgAAzHKiAj0S6Aesu25aeJ556ns4QCPzwRdfpPMefTR/lkiiA8z8JNEBAIBZViTQF+vQob6HAQBAA+bAogAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAABoyEn0888/P3Xu3Dm1bt06rb766unpp5+e4vo33XRTWnrppfP6yy23XLr33ntn2FgBAGBmJS4HAIAGmES/4YYbUv/+/dPAgQPT888/n1ZYYYXUu3fv9Nlnn9W4/vDhw9OOO+6Y9thjjzRixIjUp0+ffHrllVdm+NgBAGBmIS4HAIAGmkQ/88wz01577ZX69euXunfvni666KLUpk2bdPnll9e4/tlnn5022mijdPjhh6du3bqlE088Ma200krpvPPOm+FjBwCAmYW4HAAAatY81aPx48en5557Lg0YMKBiWdOmTVOvXr3Sk08+WeNtYnlUyFQWFTK33357jeuPGzcun8q++eab/P/YsWPTjPbtt9+mnydMSG999FH67qefZvj9A43bR19+mT9D4rOkPj7DGqJ4Lib8PCF98PYH6cfvfqzv4QCNzBcff5E/Q2b052r5vkqlUmooZkRcHsTmwMxCbF6VuBxojHF5bWLzek2if/7552nixImpQ4cOVZbH5TfeeKPG23zyySc1rh/LazJo0KB0wgknTLa8U6dOqb4MHT683u4baPxWXHHF+h5Cg/P40MfrewhAI1Zfn6uxk9C+ffvUEMyIuDyIzYGZjdi8KnE50Fg/U38tNq/XJPqMENU0lStkJk2alL788ss0zzzzpCZNmtTr2KCmX79iJ/L9999P7dq1q+/hADRqPlNpqKLKJYL0jh07plmN2JzGwncIQN3yuUpjj83rNYk+77zzpmbNmqVPP/20yvK4vMACC9R4m1hem/VbtWqVT5XNOeecv3nsMD3FF4ovFYC64TOVhqihVKDPyLg8iM1pbHyHANQtn6s01ti8Xg8s2rJly7TyyiunYcOGValGics9e/as8TaxvPL6YejQoYXrAwAAUyYuBwCA1HDbucR0zl133TWtssoqabXVVkuDBw9O33//ferXr1++vm/fvmmhhRbK/RPDwQcfnNZbb710xhlnpE033TQNGTIkPfvss+niiy+u50cCAACNl7gcAAAaaBJ9++23T2PGjEnHHXdcPghRjx490n333VdxkKLRo0enpk1/KZhfc80103XXXZeOOeaYdNRRR6WuXbum22+/PS277LL1+CigbsT05oEDB042zRmA2vOZCrUjLodf+A4BqFs+V2nsmpSiezoAAAAAANCweqIDAAAAAEBDJokOAAAAAAAFJNEBAAAAAKCAJDo0Au+++25q0qRJeuGFFxrVtgHqyvHHH58PctjQ+UwFmLmJywHE5syaJNGhwJgxY9Kf/vSntMgii+SjRy+wwAKpd+/e6YknnsjXxwfx7bffXt/DBGjwdtttt/yZWT7NM888aaONNkovvfRSfQ8NgEZAXA5Qd8TmMG0k0aHANttsk0aMGJGuuuqq9NZbb6U777wzrb/++umLL75IjdH48ePrewjALCwC848//jifhg0blpo3b54222yz+h4WAI2AuBygbonNofYk0aEGX3/9dXrsscfSqaeemn73u9+lRRddNK222mppwIABaYsttkidO3fO62211Vb5l9vy5ZEjR6Ytt9wydejQIc0xxxxp1VVXTQ8++GCVbce6J598ctp9991T27Ztc0XNxRdfXGWdp59+Oq244oqpdevWaZVVVsk7DZVNnDgx7bHHHqlLly5pttlmS0sttVQ6++yzJ/t1uU+fPumkk05KHTt2zOtMzbYBpody5WCcYurnkUcemd5///1cXRiOOOKItOSSS6Y2bdqkxRZbLB177LHp559/LtzeM888kzbYYIM077zzpvbt26f11lsvPf/881XWic/nSy+9NH9Wx3a7du2aEy+Vvfrqq3mHoV27dvkzeZ111smf5WVx+27duuXPzKWXXjpdcMEFVW7vMxVg+hKXA9Q9sTnUniQ61CAC7TjFtNBx48bV+AURrrjiivzLbfnyd999lzbZZJP8S258WMevu5tvvnkaPXp0ldufccYZFR/o++23X56e+uabb1ZsI740unfvnp577rnca+ywww6rcvtJkyalhRdeON10003ptddeS8cdd1w66qij0o033lhlvRhHbHfo0KHp7rvvnqptA0xv8Vl07bXXpiWWWCJPHw0RJF955ZX5My2SD5dcckk666yzCrfx7bffpl133TU9/vjj6amnnspBeHz+xvLKTjjhhLTddtvl6alx/c4775y+/PLLfN2HH36Y1l133bwT8dBDD+XPxUikTJgwIV//z3/+M3++RtLj9ddfz4mW2IGISsjy4/CZCjB9icsBpi+xOUylElCjm2++uTTXXHOVWrduXVpzzTVLAwYMKL344osV18efz2233far21lmmWVK5557bsXlRRddtPTHP/6x4vKkSZNK888/f+nCCy/Ml//xj3+U5plnntKPP/5YsU5cF/c3YsSIwvvZf//9S9tss03F5V133bXUoUOH0rhx4yqWTeu2AX6L+Dxq1qxZafbZZ8+n+MxZcMEFS88991zhbf7+97+XVl555YrLAwcOLK2wwgqF60+cOLHUtm3b0l133VWxLO7nmGOOqbj83Xff5WX/+te/8uX4XO/SpUtp/PjxNW5z8cUXL1133XVVlp144omlnj175vM+UwFmDHE5QN0Rm8O0UYkOU+i9+NFHH+XpRVG58sgjj6SVVlop/xpbJH75jF86Y3rRnHPOmatm4hfS6hUvyy+/fJUpTTGF6rPPPsuXY/24PqYflfXs2XOy+zr//PPTyiuvnOabb758PzH1tPr9LLfccqlly5YVl6d22wB1Labgv/DCC/kU0yzjgHAbb7xxeu+99/L1N9xwQ1prrbXy52F8ph1zzDGTfaZV9umnn6a99torV7nElNGY8hmfwVP6vJ199tnzeuXP2xhLTBFt0aLFZNv//vvv89TRmKJfroKM09/+9reKKaU+UwFmDHE5QN0Sm0PtNZ+G28AsIz58o69XnGKa0J577pkGDhyY+xrWJAL1mKJ5+umn56lQ0Rdx2223nezgQdW/FCJgj6mgU2vIkCH5vmL6aXwpxFSrv//97+k///lPlfXiSwmgIYjPo/hcrNzPMALsmBq66aab5qmcMb0zAvhYHp9z8RlXJKaLxgHlYnpp9MeNaZ/xeVibz9v4jC4SQX+I8a2++upVrmvWrFktHz0Av5W4HKDuiM2h9iTRoRait1b0Yyx/+MeBhCp74oknciAfB8oof9C/++67tbqPqJa55ppr0k8//VTxC2r0FKt+P2uuuWbu21hW+WAbv2XbADNCBMxNmzZNP/74Yxo+fHgOto8++uiK68tVMEXiczAOJBS9FEMcCOnzzz+v1RiiUiV6KMZBkqoH9HEgujj42zvvvJN3ImriMxWg/ojLAeqO2Bx+nXYuUIP4BfX//u//8sE14oAXo0aNygcLOu2009KWW26Z1+ncuXM+QNAnn3ySvvrqq7wspi7deuuteRrSiy++mHbaaadaVbKEuE18gcVUqDiIx7333psraCqL+3n22WfT/fffn956661cjVM+iNJv3TbA9BAHg4vPyzjFVMsDDzwwJzTiIG/xmRZTPaPCJRIP55xzTrrtttumuL24TQTJsa2o9otgekrVKzU54IAD0tixY9MOO+yQP1PffvvtvM3yAeWi+mbQoEF5PPFZ+/LLL+cD15155pn5ep+pANOfuByg7onNofYk0aEG0VsrpgjF0afj6NDLLrtsDojjw/i8887L68RUppgi2qlTp7TiiivmZfHhPddcc+VqlPjyialP0a+xtvd911135S+E2G78+nvqqadWWWefffZJW2+9ddp+++3zOGPnonL1y2/ZNsD0cN9996UFF1wwn+JzKxIMkQRZf/310xZbbJEOPfTQHDj36NEjV7/EZ+6UXHbZZTlREp+xu+yySzrooIPS/PPPX6sxzTPPPOmhhx7KOwzrrbde7mcbU0TLlS/RKiCmtkZwHr1sY53ov9ulS5d8vc9UgOlPXA5Q98TmUHtN4uii03A7AAAAAACY6alEBwAAAACAApLoAAAAAABQQBIdAAAAAAAKSKIDAAAAAEABSXRoQI4//vh89OvpIY6yfcghh0yXbQM0RD5TAZhWvkMA6pbPVRo7SXSowZgxY9Kf/vSntMgii6RWrVqlBRZYIPXu3Ts98cQTdXYfTZo0Sbfffnuqa4888kje9tdff11l+a233ppOPPHEOr8/gF/jMxWAaeU7BKBu+VyFadN8Gm8HM7VtttkmjR8/Pl111VVpscUWS59++mkaNmxY+uKLL1JjNffcc9f3EIBZlM9UAKaV7xCAuuVzFaZRCajiq6++KsWfxiOPPFLj9f369SttuummVZaNHz++NN9885UuvfTSfHm99dYrHXjggaXDDz+8NNdcc5U6dOhQGjhwYMX6iy66aL6P8ikuh1hnhRVWKF199dV5Wbt27Urbb799aezYsRW3nThxYunkk08ude7cudS6devS8ssvX7rpppvydaNGjaqy3TjtuuuuFWM6+OCDK7bz008/lf7yl7+UFl544VLLli1Liy++eMX4AeqKz1QAppXvEIC65XMVpp0kOlTz888/l+aYY47SIYcckj94q3viiSdKzZo1K3300UcVy2699dbS7LPPXvr2228rPsDjC+H4448vvfXWW6Wrrrqq1KRJk9IDDzyQr//ss8/yB/4VV1xR+vjjj/Pl8pdK3PfWW29devnll0uPPvpoaYEFFigdddRRFff1t7/9rbT00kuX7rvvvtLIkSPzNlq1apW/BCdMmFC65ZZb8rbffPPNvO2vv/66xi+V7bbbrtSpU6c89tjOgw8+WBoyZMh0fGaBWZHPVACmle8QgLrlcxWmnSQ61ODmm2/Ov6jGL59rrrlmacCAAaUXX3yx4vru3buXTj311IrLm2++eWm33XaruBwf4GuvvXaVba666qqlI444ouJyfPDfdtttVdaJL5U2bdpU+SU2ft1dffXV8/n4kovrhw8fXuV2e+yxR2nHHXfM5x9++OG87fiFubLKXyrxhRPrDB06dBqfIYCp5zMVgGnlOwSgbvlchWnjwKJQ0CPso48+SnfeeWfaaKON8sErVlpppXTllVfm6/fcc890xRVX5PPRP+xf//pX2n333atsY/nll69yecEFF0yfffbZr953586dU9u2bWu83X//+9/0ww8/pA022CDNMcccFaerr746jRw5cqof3wsvvJCaNWuW1ltvvam+DcC08pkKwLTyHQJQt3yuwrRxYFEo0Lp16/zhHadjjz02f5EMHDgw7bbbbqlv377pyCOPTE8++WQaPnx46tKlS1pnnXWq3L5FixZVLscRpCdNmvSr9zul23333Xf5/3vuuScttNBCVdaLo2pPrdlmm22q1wWoCz5TAZhWvkMA6pbPVag9SXSYSt27d0+33357Pj/PPPOkPn365F9n44ulX79+td5efHlMnDix1mOIL4/Ro0cX/qrasmXL/P+Utr3ccsvlL6p///vfqVevXrUcOcBv5zMVgGnlOwSgbvlchV8niQ7VfPHFF+kPf/hDnq4UU5RiqtGzzz6bTjvttLTllltWrBe/1G622Wb5w3vXXXet9f3ENKZhw4altdZaK39RzDXXXL96mxjLYYcdlg499ND8pbD22munb775Jj3xxBOpXbt2eRyLLrpo/jX37rvvTptsskn+FTamQFW/71g3HuM555yTVlhhhfTee+/laVTbbbddrR8LQBGfqT5TAaaV7xDfIUDd8rnqc5Vppyc6VBMfwKuvvno666yz0rrrrpuWXXbZPL1pr732Suedd17FevGLZvTv6t27d+rYsWOt7+eMM85IQ4cOTZ06dUorrrjiVN/uxBNPzOMZNGhQ6tatW+5hFtOdYopViGlPJ5xwQp5+1aFDh3TAAQfUuJ0LL7wwbbvttmm//fZLSy+9dH5833//fa0fB8CU+EwFYFr5DgGoWz5XYdo1iaOL/obbwywr+nXFB3hMcdp6663rezgAjZrPVACmle8QgLrlcxUmp50L1FJMK/r888/zL6tzzjln2mKLLep7SACNls9UAKaV7xCAuuVzFYpJokMtxUEuYirRwgsvnK688srUvLk/I4Bp5TMVgGnlOwSgbvlchWLauQAAAAAAQAEHFgUAAAAAgAKS6AAAAAAAUEASHQAAAAAACkiiAwAAAABAAUl0AAAAAAAoIIkOAAAAAAAFJNEBAAAAAKCAJDoAAAAAABSQRAcAAAAAgFSz/wclB9sH0uhWpAAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, axes = plt.subplots(1, 2, figsize=(15, 6))\n",
+ "\n",
+ "# Improvement scores comparison\n",
+ "scores = [result_standard['score'], result_balanced['score']]\n",
+ "labels = ['Standard\\nSynthetic', 'Balanced\\nSynthetic']\n",
+ "colors = ['lightcoral', 'lightgreen']\n",
+ "\n",
+ "bars1 = axes[0].bar(labels, scores, color=colors, alpha=0.7, edgecolor='black')\n",
+ "axes[0].axhline(y=0.5, color='red', linestyle='--', alpha=0.7, label='No Improvement Baseline')\n",
+ "axes[0].set_ylim(0, 1)\n",
+ "axes[0].set_ylabel('Improvement Score')\n",
+ "axes[0].set_title('Overall Score Comparison')\n",
+ "axes[0].legend()\n",
+ "\n",
+ "# Add score labels on bars\n",
+ "for bar, score in zip(bars1, scores):\n",
+ " axes[0].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, \n",
+ " f'{score:.4f}', ha='center', va='bottom', fontweight='bold')\n",
+ "\n",
+ "# Equalized odds scores comparison\n",
+ "eq_scores = [result_standard['synthetic_data']['equalized_odds'], result_balanced['synthetic_data']['equalized_odds']]\n",
+ "bars2 = axes[1].bar(labels, eq_scores, color=colors, alpha=0.7, edgecolor='black')\n",
+ "axes[1].set_ylim(0, 1)\n",
+ "axes[1].set_ylabel('Equalized Odds Score')\n",
+ "axes[1].set_title('Equalized Odds Score Comparison')\n",
+ "\n",
+ "# Add score labels on bars\n",
+ "for bar, score in zip(bars2, eq_scores):\n",
+ " axes[1].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, \n",
+ " f'{score:.4f}', ha='center', va='bottom', fontweight='bold')\n",
+ "\n",
+ "plt.tight_layout()\n",
+ "plt.show()\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "a",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.11"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/resources/visualize.png b/resources/visualize.png
deleted file mode 100644
index 1d9924cb..00000000
Binary files a/resources/visualize.png and /dev/null differ
diff --git a/sdmetrics/single_table/equalized_odds.py b/sdmetrics/single_table/equalized_odds.py
index d6b543d3..d343797f 100644
--- a/sdmetrics/single_table/equalized_odds.py
+++ b/sdmetrics/single_table/equalized_odds.py
@@ -272,6 +272,11 @@ def _validate_parameters(
required_columns = [prediction_column_name, sensitive_column_name]
_validate_required_columns(dataframes_dict, required_columns)
+ # Use base class validation for real_training_data and synthetic_data
+ real_training_data, synthetic_data, metadata = cls._validate_inputs(
+ real_training_data, synthetic_data, metadata
+ )
+
# Validate data and metadata consistency for prediction column
_validate_data_and_metadata(
real_training_data,
@@ -286,11 +291,6 @@ def _validate_parameters(
column_value_pairs = [(sensitive_column_name, sensitive_column_value)]
_validate_column_values_exist(dataframes_dict, column_value_pairs)
- # Use base class validation for real_training_data and synthetic_data
- real_training_data, synthetic_data, metadata = cls._validate_inputs(
- real_training_data, synthetic_data, metadata
- )
-
# Validate the validation data separately (not part of standard _validate_inputs)
real_validation_data = real_validation_data.copy()