Created
February 21, 2025 16:59
-
-
Save brusangues/4e55c0bcb5e41275d4a0dbf02156c532 to your computer and use it in GitHub Desktop.
metricas-e-kfold.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"provenance": [], | |
"authorship_tag": "ABX9TyPD3oREgstlP7CkoUUlfYDY", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/brusangues/4e55c0bcb5e41275d4a0dbf02156c532/metricas-e-kfold.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Métricas de Algoritmos Supervisionados - Classificação" | |
], | |
"metadata": { | |
"id": "DfzDMN8IF7cP" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"- Métricas\n", | |
" - Curso rápido de ML da google: https://developers.google.com/machine-learning/crash-course/classification/accuracy-precision-recall?hl=pt-br\n", | |
" - Precision recall: https://mlu-explain.github.io/precision-recall/\n", | |
" - Métricas de classificação: https://www.analyticsvidhya.com/blog/2021/07/metrics-to-evaluate-your-classification-model-to-take-the-right-decisions/\n", | |
" - Métricas no sklearn: https://scikit-learn.org/stable/modules/model_evaluation.html\n", | |
" - Average Precision no sklearn: https://scikit-learn.org/stable/auto_examples/model_selection/plot_precision_recall.html\n", | |
"\n", | |
"- Divisão do Conjunto de Modelagem\n", | |
" - Divisão treino teste e validação: https://mlu-explain.github.io/train-test-validation/\n", | |
" - Validação Cruzada: https://mlu-explain.github.io/cross-validation/\n", | |
" - Validação cruzada no sklearn: https://scikit-learn.org/stable/modules/cross_validation.html\n", | |
"\n", | |
"\n" | |
], | |
"metadata": { | |
"id": "A3an03uBGH1r" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 59, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 81 | |
}, | |
"id": "T4_A-CiMFOIc", | |
"outputId": "74ca781e-a63e-4fe2-eacc-0f684535abeb" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"RandomForestClassifier(random_state=42)" | |
], | |
"text/html": [ | |
"<style>#sk-container-id-2 {\n", | |
" /* Definition of color scheme common for light and dark mode */\n", | |
" --sklearn-color-text: #000;\n", | |
" --sklearn-color-text-muted: #666;\n", | |
" --sklearn-color-line: gray;\n", | |
" /* Definition of color scheme for unfitted estimators */\n", | |
" --sklearn-color-unfitted-level-0: #fff5e6;\n", | |
" --sklearn-color-unfitted-level-1: #f6e4d2;\n", | |
" --sklearn-color-unfitted-level-2: #ffe0b3;\n", | |
" --sklearn-color-unfitted-level-3: chocolate;\n", | |
" /* Definition of color scheme for fitted estimators */\n", | |
" --sklearn-color-fitted-level-0: #f0f8ff;\n", | |
" --sklearn-color-fitted-level-1: #d4ebff;\n", | |
" --sklearn-color-fitted-level-2: #b3dbfd;\n", | |
" --sklearn-color-fitted-level-3: cornflowerblue;\n", | |
"\n", | |
" /* Specific color for light theme */\n", | |
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n", | |
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
" --sklearn-color-icon: #696969;\n", | |
"\n", | |
" @media (prefers-color-scheme: dark) {\n", | |
" /* Redefinition of color scheme for dark theme */\n", | |
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n", | |
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
" --sklearn-color-icon: #878787;\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 {\n", | |
" color: var(--sklearn-color-text);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 pre {\n", | |
" padding: 0;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 input.sk-hidden--visually {\n", | |
" border: 0;\n", | |
" clip: rect(1px 1px 1px 1px);\n", | |
" clip: rect(1px, 1px, 1px, 1px);\n", | |
" height: 1px;\n", | |
" margin: -1px;\n", | |
" overflow: hidden;\n", | |
" padding: 0;\n", | |
" position: absolute;\n", | |
" width: 1px;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-dashed-wrapped {\n", | |
" border: 1px dashed var(--sklearn-color-line);\n", | |
" margin: 0 0.4em 0.5em 0.4em;\n", | |
" box-sizing: border-box;\n", | |
" padding-bottom: 0.4em;\n", | |
" background-color: var(--sklearn-color-background);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-container {\n", | |
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", | |
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n", | |
" so we also need the `!important` here to be able to override the\n", | |
" default hidden behavior on the sphinx rendered scikit-learn.org.\n", | |
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", | |
" display: inline-block !important;\n", | |
" position: relative;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-text-repr-fallback {\n", | |
" display: none;\n", | |
"}\n", | |
"\n", | |
"div.sk-parallel-item,\n", | |
"div.sk-serial,\n", | |
"div.sk-item {\n", | |
" /* draw centered vertical line to link estimators */\n", | |
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", | |
" background-size: 2px 100%;\n", | |
" background-repeat: no-repeat;\n", | |
" background-position: center center;\n", | |
"}\n", | |
"\n", | |
"/* Parallel-specific style estimator block */\n", | |
"\n", | |
"#sk-container-id-2 div.sk-parallel-item::after {\n", | |
" content: \"\";\n", | |
" width: 100%;\n", | |
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", | |
" flex-grow: 1;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-parallel {\n", | |
" display: flex;\n", | |
" align-items: stretch;\n", | |
" justify-content: center;\n", | |
" background-color: var(--sklearn-color-background);\n", | |
" position: relative;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-parallel-item {\n", | |
" display: flex;\n", | |
" flex-direction: column;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-parallel-item:first-child::after {\n", | |
" align-self: flex-end;\n", | |
" width: 50%;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-parallel-item:last-child::after {\n", | |
" align-self: flex-start;\n", | |
" width: 50%;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-parallel-item:only-child::after {\n", | |
" width: 0;\n", | |
"}\n", | |
"\n", | |
"/* Serial-specific style estimator block */\n", | |
"\n", | |
"#sk-container-id-2 div.sk-serial {\n", | |
" display: flex;\n", | |
" flex-direction: column;\n", | |
" align-items: center;\n", | |
" background-color: var(--sklearn-color-background);\n", | |
" padding-right: 1em;\n", | |
" padding-left: 1em;\n", | |
"}\n", | |
"\n", | |
"\n", | |
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", | |
"clickable and can be expanded/collapsed.\n", | |
"- Pipeline and ColumnTransformer use this feature and define the default style\n", | |
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n", | |
"*/\n", | |
"\n", | |
"/* Pipeline and ColumnTransformer style (default) */\n", | |
"\n", | |
"#sk-container-id-2 div.sk-toggleable {\n", | |
" /* Default theme specific background. It is overwritten whether we have a\n", | |
" specific estimator or a Pipeline/ColumnTransformer */\n", | |
" background-color: var(--sklearn-color-background);\n", | |
"}\n", | |
"\n", | |
"/* Toggleable label */\n", | |
"#sk-container-id-2 label.sk-toggleable__label {\n", | |
" cursor: pointer;\n", | |
" display: flex;\n", | |
" width: 100%;\n", | |
" margin-bottom: 0;\n", | |
" padding: 0.5em;\n", | |
" box-sizing: border-box;\n", | |
" text-align: center;\n", | |
" align-items: start;\n", | |
" justify-content: space-between;\n", | |
" gap: 0.5em;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 label.sk-toggleable__label .caption {\n", | |
" font-size: 0.6rem;\n", | |
" font-weight: lighter;\n", | |
" color: var(--sklearn-color-text-muted);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n", | |
" /* Arrow on the left of the label */\n", | |
" content: \"▸\";\n", | |
" float: left;\n", | |
" margin-right: 0.25em;\n", | |
" color: var(--sklearn-color-icon);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n", | |
" color: var(--sklearn-color-text);\n", | |
"}\n", | |
"\n", | |
"/* Toggleable content - dropdown */\n", | |
"\n", | |
"#sk-container-id-2 div.sk-toggleable__content {\n", | |
" max-height: 0;\n", | |
" max-width: 0;\n", | |
" overflow: hidden;\n", | |
" text-align: left;\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-unfitted-level-0);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-toggleable__content.fitted {\n", | |
" /* fitted */\n", | |
" background-color: var(--sklearn-color-fitted-level-0);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-toggleable__content pre {\n", | |
" margin: 0.2em;\n", | |
" border-radius: 0.25em;\n", | |
" color: var(--sklearn-color-text);\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-unfitted-level-0);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-fitted-level-0);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", | |
" /* Expand drop-down */\n", | |
" max-height: 200px;\n", | |
" max-width: 100%;\n", | |
" overflow: auto;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", | |
" content: \"▾\";\n", | |
"}\n", | |
"\n", | |
"/* Pipeline/ColumnTransformer-specific style */\n", | |
"\n", | |
"#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
" color: var(--sklearn-color-text);\n", | |
" background-color: var(--sklearn-color-unfitted-level-2);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
" background-color: var(--sklearn-color-fitted-level-2);\n", | |
"}\n", | |
"\n", | |
"/* Estimator-specific style */\n", | |
"\n", | |
"/* Colorize estimator box */\n", | |
"#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-unfitted-level-2);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
" /* fitted */\n", | |
" background-color: var(--sklearn-color-fitted-level-2);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n", | |
"#sk-container-id-2 div.sk-label label {\n", | |
" /* The background is the default theme color */\n", | |
" color: var(--sklearn-color-text-on-default-background);\n", | |
"}\n", | |
"\n", | |
"/* On hover, darken the color of the background */\n", | |
"#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n", | |
" color: var(--sklearn-color-text);\n", | |
" background-color: var(--sklearn-color-unfitted-level-2);\n", | |
"}\n", | |
"\n", | |
"/* Label box, darken color on hover, fitted */\n", | |
"#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", | |
" color: var(--sklearn-color-text);\n", | |
" background-color: var(--sklearn-color-fitted-level-2);\n", | |
"}\n", | |
"\n", | |
"/* Estimator label */\n", | |
"\n", | |
"#sk-container-id-2 div.sk-label label {\n", | |
" font-family: monospace;\n", | |
" font-weight: bold;\n", | |
" display: inline-block;\n", | |
" line-height: 1.2em;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-label-container {\n", | |
" text-align: center;\n", | |
"}\n", | |
"\n", | |
"/* Estimator-specific */\n", | |
"#sk-container-id-2 div.sk-estimator {\n", | |
" font-family: monospace;\n", | |
" border: 1px dotted var(--sklearn-color-border-box);\n", | |
" border-radius: 0.25em;\n", | |
" box-sizing: border-box;\n", | |
" margin-bottom: 0.5em;\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-unfitted-level-0);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-estimator.fitted {\n", | |
" /* fitted */\n", | |
" background-color: var(--sklearn-color-fitted-level-0);\n", | |
"}\n", | |
"\n", | |
"/* on hover */\n", | |
"#sk-container-id-2 div.sk-estimator:hover {\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-unfitted-level-2);\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 div.sk-estimator.fitted:hover {\n", | |
" /* fitted */\n", | |
" background-color: var(--sklearn-color-fitted-level-2);\n", | |
"}\n", | |
"\n", | |
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", | |
"\n", | |
"/* Common style for \"i\" and \"?\" */\n", | |
"\n", | |
".sk-estimator-doc-link,\n", | |
"a:link.sk-estimator-doc-link,\n", | |
"a:visited.sk-estimator-doc-link {\n", | |
" float: right;\n", | |
" font-size: smaller;\n", | |
" line-height: 1em;\n", | |
" font-family: monospace;\n", | |
" background-color: var(--sklearn-color-background);\n", | |
" border-radius: 1em;\n", | |
" height: 1em;\n", | |
" width: 1em;\n", | |
" text-decoration: none !important;\n", | |
" margin-left: 0.5em;\n", | |
" text-align: center;\n", | |
" /* unfitted */\n", | |
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
" color: var(--sklearn-color-unfitted-level-1);\n", | |
"}\n", | |
"\n", | |
".sk-estimator-doc-link.fitted,\n", | |
"a:link.sk-estimator-doc-link.fitted,\n", | |
"a:visited.sk-estimator-doc-link.fitted {\n", | |
" /* fitted */\n", | |
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
" color: var(--sklearn-color-fitted-level-1);\n", | |
"}\n", | |
"\n", | |
"/* On hover */\n", | |
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", | |
".sk-estimator-doc-link:hover,\n", | |
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", | |
".sk-estimator-doc-link:hover {\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-unfitted-level-3);\n", | |
" color: var(--sklearn-color-background);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", | |
".sk-estimator-doc-link.fitted:hover,\n", | |
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", | |
".sk-estimator-doc-link.fitted:hover {\n", | |
" /* fitted */\n", | |
" background-color: var(--sklearn-color-fitted-level-3);\n", | |
" color: var(--sklearn-color-background);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"/* Span, style for the box shown on hovering the info icon */\n", | |
".sk-estimator-doc-link span {\n", | |
" display: none;\n", | |
" z-index: 9999;\n", | |
" position: relative;\n", | |
" font-weight: normal;\n", | |
" right: .2ex;\n", | |
" padding: .5ex;\n", | |
" margin: .5ex;\n", | |
" width: min-content;\n", | |
" min-width: 20ex;\n", | |
" max-width: 50ex;\n", | |
" color: var(--sklearn-color-text);\n", | |
" box-shadow: 2pt 2pt 4pt #999;\n", | |
" /* unfitted */\n", | |
" background: var(--sklearn-color-unfitted-level-0);\n", | |
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", | |
"}\n", | |
"\n", | |
".sk-estimator-doc-link.fitted span {\n", | |
" /* fitted */\n", | |
" background: var(--sklearn-color-fitted-level-0);\n", | |
" border: var(--sklearn-color-fitted-level-3);\n", | |
"}\n", | |
"\n", | |
".sk-estimator-doc-link:hover span {\n", | |
" display: block;\n", | |
"}\n", | |
"\n", | |
"/* \"?\"-specific style due to the `<a>` HTML tag */\n", | |
"\n", | |
"#sk-container-id-2 a.estimator_doc_link {\n", | |
" float: right;\n", | |
" font-size: 1rem;\n", | |
" line-height: 1em;\n", | |
" font-family: monospace;\n", | |
" background-color: var(--sklearn-color-background);\n", | |
" border-radius: 1rem;\n", | |
" height: 1rem;\n", | |
" width: 1rem;\n", | |
" text-decoration: none;\n", | |
" /* unfitted */\n", | |
" color: var(--sklearn-color-unfitted-level-1);\n", | |
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 a.estimator_doc_link.fitted {\n", | |
" /* fitted */\n", | |
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
" color: var(--sklearn-color-fitted-level-1);\n", | |
"}\n", | |
"\n", | |
"/* On hover */\n", | |
"#sk-container-id-2 a.estimator_doc_link:hover {\n", | |
" /* unfitted */\n", | |
" background-color: var(--sklearn-color-unfitted-level-3);\n", | |
" color: var(--sklearn-color-background);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n", | |
" /* fitted */\n", | |
" background-color: var(--sklearn-color-fitted-level-3);\n", | |
"}\n", | |
"</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>RandomForestClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(random_state=42)</pre></div> </div></div></div></div>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 59 | |
} | |
], | |
"source": [ | |
"# prompt: Usando o sklearn - crie um dataset de classificação; divida em conjunto de treino, validação e teste; treine um classificador random forest; e mostre o classification report, matriz de confusão, curva roc auc\n", | |
"\n", | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"from sklearn.datasets import make_classification\n", | |
"from sklearn.model_selection import train_test_split\n", | |
"from sklearn.ensemble import RandomForestClassifier\n", | |
"from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve\n", | |
"import matplotlib.pyplot as plt\n", | |
"import seaborn as sns\n", | |
"\n", | |
"# Criando um dataset de classificação\n", | |
"X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=5, random_state=42)\n", | |
"\n", | |
"# Dividindo o dataset em conjuntos de treino, validação e teste\n", | |
"X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", | |
"X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.2, random_state=42)\n", | |
"\n", | |
"\n", | |
"# Treinando um classificador Random Forest\n", | |
"rf_classifier = RandomForestClassifier(random_state=42)\n", | |
"rf_classifier.fit(X_train, y_train)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"pd.DataFrame(X).head()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 206 | |
}, | |
"id": "zJgVb-ZDUgVe", | |
"outputId": "874e41ce-d560-4c1c-ecf1-9fa141a0c6f8" | |
}, | |
"execution_count": 60, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" 0 1 2 3 4 5 6 \\\n", | |
"0 1.470848 -0.360450 -0.591602 -0.728228 0.941690 1.065964 0.017832 \n", | |
"1 4.513369 -2.227103 -1.140747 2.018263 -2.238358 -0.497370 0.714550 \n", | |
"2 -2.355643 2.218601 -1.603269 0.873394 0.401483 0.717264 -0.859399 \n", | |
"3 -1.596198 -0.857427 1.772434 -0.639361 1.419409 -0.438525 0.281949 \n", | |
"4 2.840049 -2.489600 -0.844902 -1.594362 -4.688517 0.459637 0.913607 \n", | |
"\n", | |
" 7 8 9 10 11 12 13 \\\n", | |
"0 -0.596184 1.840712 -1.497093 -1.202672 -0.603968 2.899256 0.037567 \n", | |
"1 0.938883 -2.395169 0.159837 0.133942 1.461499 3.954171 0.309054 \n", | |
"2 -1.042190 -2.175965 0.980231 1.498546 0.544434 -2.466258 -0.470256 \n", | |
"3 2.345145 1.006230 0.389135 0.238566 -1.025051 -2.422975 1.579807 \n", | |
"4 -1.143505 1.263937 -2.040928 0.675664 4.176424 1.341742 0.133565 \n", | |
"\n", | |
" 14 15 16 17 18 19 \n", | |
"0 -1.249523 0.257963 0.416628 1.408208 -1.838041 -0.833142 \n", | |
"1 0.538184 -7.157865 -4.532216 -0.081800 -9.325362 0.574386 \n", | |
"2 0.073018 -2.203531 -2.299263 -1.742761 -0.271579 -0.359285 \n", | |
"3 -0.300713 4.267120 2.893775 1.236697 6.034785 -0.045711 \n", | |
"4 1.743819 1.531188 2.269808 0.053489 -3.151109 1.603702 " | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-96c63d19-bf3f-4b0e-983e-0b9df27e91e2\" class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>0</th>\n", | |
" <th>1</th>\n", | |
" <th>2</th>\n", | |
" <th>3</th>\n", | |
" <th>4</th>\n", | |
" <th>5</th>\n", | |
" <th>6</th>\n", | |
" <th>7</th>\n", | |
" <th>8</th>\n", | |
" <th>9</th>\n", | |
" <th>10</th>\n", | |
" <th>11</th>\n", | |
" <th>12</th>\n", | |
" <th>13</th>\n", | |
" <th>14</th>\n", | |
" <th>15</th>\n", | |
" <th>16</th>\n", | |
" <th>17</th>\n", | |
" <th>18</th>\n", | |
" <th>19</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1.470848</td>\n", | |
" <td>-0.360450</td>\n", | |
" <td>-0.591602</td>\n", | |
" <td>-0.728228</td>\n", | |
" <td>0.941690</td>\n", | |
" <td>1.065964</td>\n", | |
" <td>0.017832</td>\n", | |
" <td>-0.596184</td>\n", | |
" <td>1.840712</td>\n", | |
" <td>-1.497093</td>\n", | |
" <td>-1.202672</td>\n", | |
" <td>-0.603968</td>\n", | |
" <td>2.899256</td>\n", | |
" <td>0.037567</td>\n", | |
" <td>-1.249523</td>\n", | |
" <td>0.257963</td>\n", | |
" <td>0.416628</td>\n", | |
" <td>1.408208</td>\n", | |
" <td>-1.838041</td>\n", | |
" <td>-0.833142</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>4.513369</td>\n", | |
" <td>-2.227103</td>\n", | |
" <td>-1.140747</td>\n", | |
" <td>2.018263</td>\n", | |
" <td>-2.238358</td>\n", | |
" <td>-0.497370</td>\n", | |
" <td>0.714550</td>\n", | |
" <td>0.938883</td>\n", | |
" <td>-2.395169</td>\n", | |
" <td>0.159837</td>\n", | |
" <td>0.133942</td>\n", | |
" <td>1.461499</td>\n", | |
" <td>3.954171</td>\n", | |
" <td>0.309054</td>\n", | |
" <td>0.538184</td>\n", | |
" <td>-7.157865</td>\n", | |
" <td>-4.532216</td>\n", | |
" <td>-0.081800</td>\n", | |
" <td>-9.325362</td>\n", | |
" <td>0.574386</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>-2.355643</td>\n", | |
" <td>2.218601</td>\n", | |
" <td>-1.603269</td>\n", | |
" <td>0.873394</td>\n", | |
" <td>0.401483</td>\n", | |
" <td>0.717264</td>\n", | |
" <td>-0.859399</td>\n", | |
" <td>-1.042190</td>\n", | |
" <td>-2.175965</td>\n", | |
" <td>0.980231</td>\n", | |
" <td>1.498546</td>\n", | |
" <td>0.544434</td>\n", | |
" <td>-2.466258</td>\n", | |
" <td>-0.470256</td>\n", | |
" <td>0.073018</td>\n", | |
" <td>-2.203531</td>\n", | |
" <td>-2.299263</td>\n", | |
" <td>-1.742761</td>\n", | |
" <td>-0.271579</td>\n", | |
" <td>-0.359285</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>-1.596198</td>\n", | |
" <td>-0.857427</td>\n", | |
" <td>1.772434</td>\n", | |
" <td>-0.639361</td>\n", | |
" <td>1.419409</td>\n", | |
" <td>-0.438525</td>\n", | |
" <td>0.281949</td>\n", | |
" <td>2.345145</td>\n", | |
" <td>1.006230</td>\n", | |
" <td>0.389135</td>\n", | |
" <td>0.238566</td>\n", | |
" <td>-1.025051</td>\n", | |
" <td>-2.422975</td>\n", | |
" <td>1.579807</td>\n", | |
" <td>-0.300713</td>\n", | |
" <td>4.267120</td>\n", | |
" <td>2.893775</td>\n", | |
" <td>1.236697</td>\n", | |
" <td>6.034785</td>\n", | |
" <td>-0.045711</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2.840049</td>\n", | |
" <td>-2.489600</td>\n", | |
" <td>-0.844902</td>\n", | |
" <td>-1.594362</td>\n", | |
" <td>-4.688517</td>\n", | |
" <td>0.459637</td>\n", | |
" <td>0.913607</td>\n", | |
" <td>-1.143505</td>\n", | |
" <td>1.263937</td>\n", | |
" <td>-2.040928</td>\n", | |
" <td>0.675664</td>\n", | |
" <td>4.176424</td>\n", | |
" <td>1.341742</td>\n", | |
" <td>0.133565</td>\n", | |
" <td>1.743819</td>\n", | |
" <td>1.531188</td>\n", | |
" <td>2.269808</td>\n", | |
" <td>0.053489</td>\n", | |
" <td>-3.151109</td>\n", | |
" <td>1.603702</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <div class=\"colab-df-buttons\">\n", | |
"\n", | |
" <div class=\"colab-df-container\">\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-96c63d19-bf3f-4b0e-983e-0b9df27e91e2')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n", | |
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
"\n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" .colab-df-buttons div {\n", | |
" margin-bottom: 4px;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-96c63d19-bf3f-4b0e-983e-0b9df27e91e2 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-96c63d19-bf3f-4b0e-983e-0b9df27e91e2');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
"\n", | |
"\n", | |
"<div id=\"df-6a14e96e-69e0-4ce8-9742-9d89745c156b\">\n", | |
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-6a14e96e-69e0-4ce8-9742-9d89745c156b')\"\n", | |
" title=\"Suggest charts\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <g>\n", | |
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n", | |
" </g>\n", | |
"</svg>\n", | |
" </button>\n", | |
"\n", | |
"<style>\n", | |
" .colab-df-quickchart {\n", | |
" --bg-color: #E8F0FE;\n", | |
" --fill-color: #1967D2;\n", | |
" --hover-bg-color: #E2EBFA;\n", | |
" --hover-fill-color: #174EA6;\n", | |
" --disabled-fill-color: #AAA;\n", | |
" --disabled-bg-color: #DDD;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-quickchart {\n", | |
" --bg-color: #3B4455;\n", | |
" --fill-color: #D2E3FC;\n", | |
" --hover-bg-color: #434B5C;\n", | |
" --hover-fill-color: #FFFFFF;\n", | |
" --disabled-bg-color: #3B4455;\n", | |
" --disabled-fill-color: #666;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart {\n", | |
" background-color: var(--bg-color);\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: var(--fill-color);\n", | |
" height: 32px;\n", | |
" padding: 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart:hover {\n", | |
" background-color: var(--hover-bg-color);\n", | |
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: var(--button-hover-fill-color);\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart-complete:disabled,\n", | |
" .colab-df-quickchart-complete:disabled:hover {\n", | |
" background-color: var(--disabled-bg-color);\n", | |
" fill: var(--disabled-fill-color);\n", | |
" box-shadow: none;\n", | |
" }\n", | |
"\n", | |
" .colab-df-spinner {\n", | |
" border: 2px solid var(--fill-color);\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" animation:\n", | |
" spin 1s steps(1) infinite;\n", | |
" }\n", | |
"\n", | |
" @keyframes spin {\n", | |
" 0% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" border-left-color: var(--fill-color);\n", | |
" }\n", | |
" 20% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 30% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 40% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 60% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 80% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" 90% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" }\n", | |
"</style>\n", | |
"\n", | |
" <script>\n", | |
" async function quickchart(key) {\n", | |
" const quickchartButtonEl =\n", | |
" document.querySelector('#' + key + ' button');\n", | |
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n", | |
" quickchartButtonEl.classList.add('colab-df-spinner');\n", | |
" try {\n", | |
" const charts = await google.colab.kernel.invokeFunction(\n", | |
" 'suggestCharts', [key], {});\n", | |
" } catch (error) {\n", | |
" console.error('Error during call to suggestCharts:', error);\n", | |
" }\n", | |
" quickchartButtonEl.classList.remove('colab-df-spinner');\n", | |
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n", | |
" }\n", | |
" (() => {\n", | |
" let quickchartButtonEl =\n", | |
" document.querySelector('#df-6a14e96e-69e0-4ce8-9742-9d89745c156b button');\n", | |
" quickchartButtonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
" })();\n", | |
" </script>\n", | |
"</div>\n", | |
"\n", | |
" </div>\n", | |
" </div>\n" | |
], | |
"application/vnd.google.colaboratory.intrinsic+json": { | |
"type": "dataframe", | |
"summary": "{\n \"name\": \"pd\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": 0,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2.9132702570648403,\n \"min\": -2.3556434235645876,\n \"max\": 4.513369096850683,\n \"num_unique_values\": 5,\n \"samples\": [\n 4.513369096850683,\n 2.8400489223571164,\n -2.3556434235645876\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 1,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.883062346936286,\n \"min\": -2.4896002093666216,\n \"max\": 2.218601462118448,\n \"num_unique_values\": 5,\n \"samples\": [\n -2.2271030357520765,\n -2.4896002093666216,\n 2.218601462118448\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 2,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.3150450317558813,\n \"min\": -1.6032692503126351,\n \"max\": 1.7724336563499823,\n \"num_unique_values\": 5,\n \"samples\": [\n -1.1407474161824607,\n -0.8449020821702086,\n -1.6032692503126351\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 3,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.4418998342692197,\n \"min\": -1.5943617944420723,\n \"max\": 2.018262584731395,\n \"num_unique_values\": 5,\n \"samples\": [\n 2.018262584731395,\n -1.5943617944420723,\n 0.8733937439215353\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 4,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2.5781223485831974,\n \"min\": -4.688516860013303,\n \"max\": 1.4194090709509923,\n \"num_unique_values\": 5,\n \"samples\": [\n -2.2383576851761915,\n -4.688516860013303,\n 0.40148310163780543\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 5,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.700010339518554,\n \"min\": -0.49736953314026283,\n \"max\": 1.065963719731826,\n \"num_unique_values\": 5,\n \"samples\": [\n -0.49736953314026283,\n 0.45963731807481595,\n 0.7172635437832151\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 6,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.6955725330990989,\n \"min\": -0.8593992108172007,\n \"max\": 0.9136072175680342,\n \"num_unique_values\": 5,\n \"samples\": [\n 0.7145497614635058,\n 0.9136072175680342,\n -0.8593992108172007\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 7,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.5066497442591764,\n \"min\": -1.143504812546336,\n \"max\": 2.3451447234710336,\n \"num_unique_values\": 5,\n \"samples\": [\n 0.9388833153720996,\n -1.143504812546336,\n -1.0421902149213798\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 8,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2.0265457591560647,\n \"min\": -2.3951693175130337,\n \"max\": 1.840712330849497,\n \"num_unique_values\": 5,\n \"samples\": [\n -2.3951693175130337,\n 1.2639372826816937,\n -2.1759651635015973\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 9,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.2978279855967352,\n \"min\": -2.0409277704847444,\n \"max\": 0.9802308398956829,\n \"num_unique_values\": 5,\n \"samples\": [\n 0.15983675761088956,\n -2.0409277704847444,\n 0.9802308398956829\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 10,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.9826169130826197,\n \"min\": -1.202671507771992,\n \"max\": 1.4985463606698537,\n \"num_unique_values\": 5,\n \"samples\": [\n 0.13394188295201317,\n 0.6756644532569765,\n 1.4985463606698537\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 11,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2.070255474834828,\n \"min\": -1.0250508969745709,\n \"max\": 4.176423682994823,\n \"num_unique_values\": 5,\n \"samples\": [\n 1.4614990827553758,\n 4.176423682994823,\n 0.5444338239034117\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 12,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2.9836562066409194,\n \"min\": -2.4662579537560165,\n \"max\": 3.954171247752467,\n \"num_unique_values\": 5,\n \"samples\": [\n 3.954171247752467,\n 1.3417423270599946,\n -2.4662579537560165\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 13,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.7626012627840374,\n \"min\": -0.47025571626635737,\n \"max\": 1.5798069574015499,\n \"num_unique_values\": 5,\n \"samples\": [\n 0.3090544381042879,\n 0.1335654155359782,\n -0.47025571626635737\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 14,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.1020525898816187,\n \"min\": -1.2495228835952368,\n \"max\": 1.7438193310994725,\n \"num_unique_values\": 5,\n \"samples\": [\n 0.5381840760606269,\n 1.7438193310994725,\n 0.07301843867875613\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 15,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4.316399047691518,\n \"min\": -7.157864698637344,\n \"max\": 4.26712005055261,\n \"num_unique_values\": 5,\n \"samples\": [\n -7.157864698637344,\n 1.5311883051385262,\n -2.2035313023963923\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 16,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3.131054008589725,\n \"min\": -4.53221590306436,\n \"max\": 2.8937751374064606,\n \"num_unique_values\": 5,\n \"samples\": [\n -4.53221590306436,\n 2.2698079978592083,\n -2.2992625816341477\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 17,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.2655553952873266,\n \"min\": -1.742760937584253,\n \"max\": 1.4082084326957716,\n \"num_unique_values\": 5,\n \"samples\": [\n -0.08179955347087065,\n 0.05348895364493855,\n -1.742760937584253\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 18,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 5.525795919463156,\n \"min\": -9.32536185307987,\n \"max\": 6.034785453185585,\n \"num_unique_values\": 5,\n \"samples\": [\n -9.32536185307987,\n -3.151109495759724,\n -0.27157945768521913\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 19,\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.9421223497031794,\n \"min\": -0.8331415233289663,\n \"max\": 1.6037018554669304,\n \"num_unique_values\": 5,\n \"samples\": [\n 0.574386351133876,\n 1.6037018554669304,\n -0.35928530430641653\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" | |
} | |
}, | |
"metadata": {}, | |
"execution_count": 60 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"pd.Series(y).value_counts()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 147 | |
}, | |
"id": "Iml3qm0DUU9F", | |
"outputId": "0fd233bb-d93c-4d6e-92d4-62f26b2059b6" | |
}, | |
"execution_count": 61, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"1 503\n", | |
"0 497\n", | |
"Name: count, dtype: int64" | |
], | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>count</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>503</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>497</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div><br><label><b>dtype:</b> int64</label>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 61 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Fazendo previsões nos conjuntos de validação e teste\n", | |
"thresh = 0.5\n", | |
"y_prob_train = rf_classifier.predict_proba(X_train)[:, 1]\n", | |
"y_prob_val = rf_classifier.predict_proba(X_val)[:, 1]\n", | |
"y_prob_test = rf_classifier.predict_proba(X_test)[:, 1]\n", | |
"\n", | |
"y_pred_train = np.where(y_prob_train >= thresh, 1, 0)\n", | |
"y_pred_val = np.where(y_prob_val >= thresh, 1, 0)\n", | |
"y_pred_test = np.where(y_prob_test >= thresh, 1, 0)" | |
], | |
"metadata": { | |
"id": "yZNGMAdHTAg3" | |
}, | |
"execution_count": 62, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Matriz de Confusão\n", | |
"cm = confusion_matrix(y_val, y_pred_val)\n", | |
"plt.figure(figsize=(8, 6))\n", | |
"sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\")\n", | |
"plt.title(\"Matriz de Confusão (Validation)\")\n", | |
"plt.xlabel(\"Previsões\")\n", | |
"plt.ylabel(\"Valores Reais\")\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 564 | |
}, | |
"id": "4qF4TkC7Sgd9", | |
"outputId": "db9a5ead-28c4-4b21-ce53-4ee48d6e321f" | |
}, | |
"execution_count": 63, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 800x600 with 2 Axes>" | |
], | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAIjCAYAAACTRapjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAR3lJREFUeJzt3XlcVHX////ngDAgCIiiqIGau+VSaIprKqZkpeWSSpdYVleJmpKVfrP0KhPLqzQzLcvQT2WWuVSWmksumftSau6puIErLqiDwvn90c+5mgBlbMYBzuN+3c7tknPOnPOaUS9f1/P9Pu+xGIZhCAAAAKbh5ekCAAAAcGvRAAIAAJgMDSAAAIDJ0AACAACYDA0gAACAydAAAgAAmAwNIAAAgMnQAAIAAJgMDSAAAIDJ0AACLjBixAhZLBa33sNisWjEiBFuvcetNmbMGN1+++3y9vZW/fr13XKPwYMHq0SJEoqPj9fp06dVu3ZtbdmyxeX3WbdunXx9fXXw4EGXX/ua3P6cVapUSb17977ha6dOnSqLxaIDBw64rJ4DBw7IYrFo6tSpLrvm3125ckURERGaOHGi2+4BmBENIAqVa/+IWSwW/fzzzzmOG4ahiIgIWSwWPfDAAzd1j1GjRmnu3Ln/sNLCISsrS8nJybr33nsVGhoqq9WqSpUq6fHHH9eGDRvceu8ff/xRL774opo2bark5GSNGjXK5fe4cOGCJk2apNdee03bt29X6dKlFRgYqLp167r8Xi+//LJ69OihihUr6vjx4ypWrJgee+yxPM8/f/68/P399cgjj7i8FlebPn26xo0b55F7+/j4KDExUW+88YYuX77skRqAIskACpHk5GRDkuHn52c8++yzOY7/9NNPhiTDarUaHTp0uKl7BAQEGPHx8U695sqVK8alS5du6n75JckYPny4y6538eJFo3379oYko0WLFsaYMWOMKVOmGK+88opRo0YNw2KxGIcOHXLZ/f7upZdeMry8vAybzea2e1y5csU4cOCA/ecjR44YWVlZLr/P5s2bDUnGL7/8Yt/Xvn17IzAw0MjIyMj1NVOnTjUkGbNmzcr3fYYPH278/X+2L1++bGRmZt7wtdf+7uzfvz/f97umQ4cORsWKFXPsz87ONi5dumRcvXrV6Ws648yZM4avr68xZcoUt94HMBMSQBRK999/v2bOnKmrV6867J8+fbqioqIUHh5+S+rIyMiQJBUrVkx+fn635J6u8sILL2jBggUaO3asli9frsGDB+uJJ56wp2VvvfWWW+9//Phx+fv7y9fX1233KFasmCpWrGj/uXz58vLycv3/7CUnJysyMlKNGze274uLi9OFCxf07bff5vqa6dOnKzg4WB06dPhH97ZarfLx8flH17hZFotFfn5+8vb2dut9QkJCdN9997l1qBkwGxpAFEo9evTQqVOntGjRIvu+zMxMff311+rZs2eur/nvf/+rJk2aqFSpUvL391dUVJS+/vprh3MsFosyMjI0bdo0+1DztflV1+Zf/f777+rZs6dKliypZs2aORy7pnfv3vbX/3270Tw+m82mQYMGKSwsTCVKlNBDDz2kw4cP53rukSNH9MQTT6hs2bKyWq2644479Mknn9zo49Phw4f14Ycfqm3btho4cGCO497e3ho8eLBuu+02+77NmzcrNjZWQUFBCgwMVJs2bbRmzRqH110bol+1apUSExMVFhamgIAAPfzwwzpx4oT9PIvFouTkZGVkZNg/l6lTp153TtnfP7vz589r4MCBqlSpkqxWq8qUKaO2bdtq06ZN9nOWLVumLl26KDIyUlarVRERERo0aJAuXbqU4/pLly5V8+bNFRAQoJCQEHXs2FE7duy44WcpSXPnzlXr1q0d/gw8/PDDCggI0PTp03Ocf/z4cS1ZskRdunSR1WrVypUr1bVr13zV+Xe5zQHcvn27WrduLX9/f912220aOXKksrOzc7z2m2++UYcOHVS+fHlZrVZVqVJFr7/+urKysuzn3Hvvvfr+++918OBB++9VpUqVJOU9BzA/n+W1vzN79+5V7969FRISouDgYD3++OO6ePFijlrbtm2rn3/+WadPn77hZwLgxop5ugDgZlSqVEnR0dH64osvFBsbK0maP3++zp49q+7du2v8+PE5XvPuu+/qoYceUlxcnDIzMzVjxgx17dpV8+bNs6cwn376qZ588kndc889evrppyVJVapUcbhO165dVa1aNY0aNUqGYeRa37///W/FxMQ47FuwYIE+//xzlSlT5rrv7cknn9Rnn32mnj17qkmTJlq6dGmuKVFaWpoaN24si8Wifv36KSwsTPPnz1efPn107ty5XBu7a+bPn6+rV6/qX//613VruWb79u1q3ry5goKC9OKLL8rH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ECQsLEzFixfPUYMk7dy5U15eXoqIiHC6htxcS3/S09Md9uc1dFyuXDn17dtXffv21fHjx3X33XfrjTfeUGxsrLZu3ardu3dr2rRp6tWrl/01f31yXJJ9mZi83l/p0qUVEBCQZ83Xmun9+/fnerxRo0aqUqWKpk+frrZt22r79u1644037MfzW2d+VaxYUXv27Mmx/+/vb9myZTp16pRmz56tFi1a2Pfn9j7y+3fin36W13Otrlq1at3U6wE4YggYhVpgYKAmTZqkESNG6MEHH8zzPG9vb1ksFock6cCBA7l+40dAQECOBsRZx44dU7du3dSsWTP705T5ce2J5r8/xfz3b2Hw9vZW586dNWvWLG3bti3Hdf665EpuIiIi9NRTT+nHH3/Ue++9l+N4dna23n77bR0+fFje3t6677779M033zh8jVhaWpqmT5+uZs2a2YeU/6mgoCCVLl1aK1ascNj/968By8rKyjFEWaZMGZUvX142m03S/5KlvyZJhmHo3XffdXhduXLlVL9+fU2bNs3h933btm368ccfdf/991+35goVKigiIuK635wSFxenzZs3a/jw4bJYLA5zVfNbZ37df//9WrNmjdatW2ffd+LECX3++ecO5+V238zMzFy/ci0gICBfQ8L/9LO8no0bN8pisSg6OvqmrwHgf0gAUejlNQT6Vx06dNA777yj9u3bq2fPnjp+/Ljef/99Va1aVb/99pvDuVFRUVq8eLHeeecdlS9fXpUrV86xzMmNDBgwQCdOnNCLL76oGTNmOByrW7dunsOz9evXV48ePTRx4kSdPXtWTZo00ZIlS7R3794c544ePVo//fSTGjVqpKeeekq1a9fW6dOntWnTJi1evPiG66W9/fbb2rdvnwYMGKDZs2frgQceUMmSJZWSkqKZM2dq586d6t69uyRp5MiRWrRokZo1a6a+ffuqWLFi+vDDD2Wz2Vy+YPSTTz6p0aNH68knn1SDBg20YsUK7d692+Gc8+fP67bbblOXLl1Ur149BQYGavHixVq/fr3efvttSX8mc1WqVNHgwYN15MgRBQUFadasWbkO1Y4ZM0axsbGKjo5Wnz597EuXBAcH5+v7lzt27Kg5c+bIMIxc07LHHntMr732mr755hs1bdrUYSkUZ+rMjxdffFGffvqp2rdvr+eee86+DEzFihUd/qw3adJEJUuW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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Classification Report\n", | |
"print(\"Classification Report (Training):\")\n", | |
"print(classification_report(y_train, y_pred_train, target_names=[\"zero 0\",\"um 1\"]))\n", | |
"\n", | |
"print(\"Classification Report (Validation):\")\n", | |
"print(classification_report(y_val, y_pred_val, target_names=[\"zero 0\",\"um 1\"]))\n", | |
"\n", | |
"print(\"Classification Report (Test):\")\n", | |
"print(classification_report(y_test, y_pred_test, target_names=[\"zero 0\",\"um 1\"]))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "L_gAtOVVSe_6", | |
"outputId": "5cda1718-2abf-4e75-e01e-92af135e0891" | |
}, | |
"execution_count": 75, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Classification Report (Training):\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 1.00 1.00 1.00 317\n", | |
" um 1 1.00 1.00 1.00 323\n", | |
"\n", | |
" accuracy 1.00 640\n", | |
" macro avg 1.00 1.00 1.00 640\n", | |
"weighted avg 1.00 1.00 1.00 640\n", | |
"\n", | |
"Classification Report (Validation):\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 0.94 0.94 0.94 78\n", | |
" um 1 0.94 0.94 0.94 82\n", | |
"\n", | |
" accuracy 0.94 160\n", | |
" macro avg 0.94 0.94 0.94 160\n", | |
"weighted avg 0.94 0.94 0.94 160\n", | |
"\n", | |
"Classification Report (Test):\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 0.95 0.88 0.91 102\n", | |
" um 1 0.89 0.95 0.92 98\n", | |
"\n", | |
" accuracy 0.92 200\n", | |
" macro avg 0.92 0.92 0.91 200\n", | |
"weighted avg 0.92 0.92 0.91 200\n", | |
"\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"for thresh in [0.1, 0.5, 0.9]:\n", | |
" y_pred_val_i = np.where(y_prob_val >= thresh, 1, 0)\n", | |
" print(f\"\\nClassification Report (Validation) - Threshold: {thresh:0.1f}\")\n", | |
" print(classification_report(y_val, y_pred_val_i, target_names=[\"zero 0\",\"um 1\"]))\n", | |
" print(confusion_matrix(y_val, y_pred_val_i))\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "guXya9FfTjbr", | |
"outputId": "0c89fc57-f0a1-42a8-a8cc-d9afcc98e1c8" | |
}, | |
"execution_count": 65, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"\n", | |
"Classification Report (Validation) - Threshold: 0.1\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 1.00 0.24 0.39 78\n", | |
" um 1 0.58 1.00 0.74 82\n", | |
"\n", | |
" accuracy 0.63 160\n", | |
" macro avg 0.79 0.62 0.56 160\n", | |
"weighted avg 0.79 0.63 0.57 160\n", | |
"\n", | |
"[[19 59]\n", | |
" [ 0 82]]\n", | |
"\n", | |
"Classification Report (Validation) - Threshold: 0.5\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 0.94 0.94 0.94 78\n", | |
" um 1 0.94 0.94 0.94 82\n", | |
"\n", | |
" accuracy 0.94 160\n", | |
" macro avg 0.94 0.94 0.94 160\n", | |
"weighted avg 0.94 0.94 0.94 160\n", | |
"\n", | |
"[[73 5]\n", | |
" [ 5 77]]\n", | |
"\n", | |
"Classification Report (Validation) - Threshold: 0.9\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 0.56 1.00 0.72 78\n", | |
" um 1 1.00 0.24 0.39 82\n", | |
"\n", | |
" accuracy 0.61 160\n", | |
" macro avg 0.78 0.62 0.55 160\n", | |
"weighted avg 0.78 0.61 0.55 160\n", | |
"\n", | |
"[[78 0]\n", | |
" [62 20]]\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Curva ROC e AUC\n", | |
"fpr, tpr, thresholds = roc_curve(y_val, y_prob_val)\n", | |
"roc_auc = roc_auc_score(y_val, y_prob_val)\n", | |
"\n", | |
"plt.figure(figsize=(8, 6))\n", | |
"plt.plot(fpr, tpr, color='darkorange', lw=2, label='Curva ROC (AUC = %0.2f)' % roc_auc)\n", | |
"plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')\n", | |
"plt.xlim([0.0, 1.0])\n", | |
"plt.ylim([0.0, 1.05])\n", | |
"plt.xlabel('Taxa de Falsos Positivos')\n", | |
"plt.ylabel('Taxa de Verdadeiros Positivos')\n", | |
"plt.title('Curva ROC (Validation)')\n", | |
"plt.legend(loc=\"lower right\")\n", | |
"plt.show()\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 564 | |
}, | |
"id": "RyrL1oKnSdig", | |
"outputId": "aa81a54b-3d36-4094-ca91-d436f0b67adf" | |
}, | |
"execution_count": 66, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 800x600 with 1 Axes>" | |
], | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAr4AAAIjCAYAAADlfxjoAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAi1pJREFUeJzs3XdUFNf7BvBn6aCAKFJUFLF3BQugxIZiTBBLFGPFqBGMMZbkK0ZjibFGjTWixh6JYmKLGjEau6gRLNgwigUVUJReZff+/uDnmA2oLC4M5fmcwznsOzM7z+4G83K5c0chhBAgIiIiIirldOQOQERERERUFNj4EhEREVGZwMaXiIiIiMoENr5EREREVCaw8SUiIiKiMoGNLxERERGVCWx8iYiIiKhMYONLRERERGUCG18iIiIiKhPY+BIRlTIpKSmwsrLC1q1bC+0cx44dg0KhwLFjx6Saj48P7O3t33rsvXv3oFAosHHjRq1msre3h4+Pj1af87/69++Pfv36Feo5iKjwsPElokJx584djBo1Cg4ODjAyMoKZmRnatm2LpUuXIj09Xe54GnvZ6L380tXVhZWVFT766CPcuHHjtcft27cP3bp1Q6VKlWBkZIS6deviyy+/xLNnz954rt69e8PGxgYGBgawsrKCp6cndu7cma+sS5cuhampKfr37w8AaNq0KapXr4433aG+bdu2sLa2RnZ2dr7OIZczZ85gxowZSEhIkOX8kyZNwm+//YbLly/Lcn4iejdsfIlI6/bv348mTZogKCgInp6eWL58OebOnYvq1avjq6++whdffCF3xAIbO3YstmzZgp9++gkDBw7E/v374ebmhpiYmFz7fvnll/D09ERMTAwmTZqEFStWwN3dHStWrECzZs0QERGR65jp06ejY8eOuHr1KkaNGoWAgAB89dVXSElJQZ8+fRAYGPjGfC9evMDSpUsxYsQI6OrqAgAGDhyIqKgonDx5Ms9j7t27h5CQEHh7e0NPT68A70qOtWvX5vmatOnMmTOYOXNmno1vREQE1q5dW6jnb9GiBVq2bIlFixYV6nmIqJAIIiItioyMFOXLlxf169cXjx8/zrX9n3/+EUuWLNHKuVJSUrTyPPlx9OhRAUDs2LFDrb5q1SoBQMyfP1+tHhgYKAAIb29vkZ2drbbt3LlzwsTERDRp0kS8ePFCqu/YsUMAEB999JHIysrKleHgwYPi999/f2POnTt3CgDi9u3bUu3BgwdCoVCIUaNG5XnMnDlzBABx9uzZNz73v718P44ePZrvY166e/euACA2bNig8bHff/+9ACDu3r2r8bHasnDhQlGuXDmRnJwsWwYiKhiO+BKRVi1YsAApKSlYt24dbG1tc22vXbu2NOL7prmeCoUCM2bMkB7PmDEDCoUC169fx4ABA2BhYYF27dph4cKFUCgUuH//fq7nmDx5MgwMDBAfHw8AOHnyJPr27Yvq1avD0NAQdnZ2GD9+/DtNvXBzcwOQM7Xj32bOnAkLCwusWbNGGnl9qXXr1pg0aRLCw8Px66+/SvVvvvkGFStWxPr166Gvr5/rXB4eHvjwww/fmGf37t2wt7dHrVq1pJqdnR3ee+89/Prrr3jx4kWuYwIDA1GrVi20adMG9+/fx+jRo1GvXj0YGxujUqVK6Nu3L+7du/fW9yKvOb4JCQnw8fGBubk5KlSogKFDh+Y5WnvlyhX4+PhIU2NsbGzwySefqE0JmTFjBr766isAQM2aNaVpJy+z5TXHNzIyEn379kXFihVhYmICZ2dn7N+/X22fl9NYgoKCMHv2bFSrVg1GRkbo3Lkzbt++nStrly5dkJqaij///POt7wkRFS9sfIlIq37//Xc4ODjA1dW1UJ6/b9++SEtLw5w5czBy5Ej069dPalr+KygoCF27doWFhQUAYMeOHUhLS4Ofnx+WL18ODw8PLF++HEOGDClwnpdN18tzAMA///yDiIgIeHl5wczMLM/jXp5z37590jE3b95Ez549YWpqWuA8Z86cgaOjY676wIED8ezZMwQHB6vVw8PDcfXqVQwcOBAA8Pfff+PMmTPo378/li1bBl9fXxw5cgQdOnRAWlqaRlmEEPDy8sKWLVswaNAgfPfdd3j48CGGDh2aa98///wTkZGRGDZsGJYvX47+/ftj27Zt6N69uzQ3uXfv3vj4448BAD/88AO2bNmCLVu2oHLlynmePzY2Fq6urggODsbo0aMxe/ZsZGRkoEePHti1a1eu/efNm4ddu3bhyy+/xOTJk3H27Fnpffm3hg0bwtjYGKdPn9bo/SCiYkDuIWciKj0SExMFAOHl5ZWv/d/0J28AYvr06dLj6dOnCwDi448/zrWvi4uLcHJyUqudP39eABCbN2+WamlpabmOnTt3rlAoFOL+/ftvzPryT/vr168XT58+FY8fPxYHDx4UtWvXFgqFQpw/f17ad/fu3QKA+OGHH974nGZmZsLR0VEIIcSePXvydcybvHjxQigUCjFx4sRc254/fy4MDQ1zvX/+/v4CgIiIiBBC5P0ehYSE5Hov85rqMHToUFGjRg3p8cv3YcGCBVItOztbuLm55frc8zrvL7/8IgCIEydOSLU3TXWoUaOGGDp0qPR43LhxAoA4efKkVEtOThY1a9YU9vb2QqlUqr2WBg0aiMzMTGnfpUuXCgAiPDw817nq1q0r3n///Vx1IireOOJLRFqTlJQEAO80Yvk2vr6+uWre3t4IDQ1Vm26wfft2GBoawsvLS6oZGxtL36empiIuLg6urq4QQuDixYv5Ov8nn3yCypUro0qVKujWrRsSExOxZcsWtGrVStonOTkZwNvfB1NTU+k908Z79/z5cwgh1EafX7KwsED37t2xd+9epKamAsgZkd22bRtatmyJunXrAlB/j168eIFnz56hdu3aqFChAsLCwjTKc+DAAejp6cHPz0+q6erq4vPPP8+177/Pm5GRgbi4ODg7OwOAxuf99/lbt26Ndu3aSbXy5cvj008/xb1793D9+nW1/YcNGwYDAwPp8ctpLJGRkbme28LCAnFxcQXKRUTyYeNLRFrz8s/6Lxu/wlCzZs1ctb59+0JHRwfbt28HkNPQ7dixA++//77aVIMHDx7Ax8cHFStWRPny5VG5cmW0b98eAJCYmJiv80+bNg1//vkndu3ahSFDhiAxMRE6Our/lL5sXt/2PiQnJ0v7avO9E69ZtmzgwIFITU3Fnj17AORMi7h3757an/PT09Mxbdo02NnZwdDQEJaWlqhcuTISEhLy/R69dP/+fdja2qJ8+fJq9Xr16uXa9/nz5/jiiy9gbW0NY2NjVK5cWfqsNT3vv8+f17kaNGggbf+36tWrqz1++QvEyzni/yaEgEKhKFAuIpJPwdetISL6DzMzM1SpUgVXr17N1/6vaxyUSuVrj/n3yOBLVapUgZubG4KCgvD111/j7NmzePDgAebPn6/2nF26dMHz588xadIk1K9fH+XKlcOjR4/g4+MDlUqVr8xNmjSBu7s7AKBnz55IS0vDyJEj0a5dO9jZ2QF41VhduXLltc9z//59JCUloWHDhgCA+vXrA8iZc1tQFStWhEKhyLNRA4APP/wQ5ubmCAwMxIABAxAYGAhdXV1pvV8A+Pzzz7FhwwaMGzcOLi4uMDc3h0KhQP/+/fP9HhVEv379cObMGXz11Vdo3rw5ypcvD5VKhW7duhXqef/tvxchvpTXLxLx8fGoU6dOYUciIi3jiC8RadWHH36IO3fuICQk5K37vhxR++9V/nmt0PA23t7euHz5MiIiIrB9+3aYmJjA09NT2h4eHo5bt25h0aJFmDRpEry8vODu7o4qVapofK5/mzdvHjIyMjB79mypVrduXdStWxe7d+9+7Qju5s2bAUBapaFu3bqoV68e9uzZg5SUlAJl0dPTQ61atXD37t08txsaGuKjjz7CoUOHEBsbix07dqBTp06wsbGR9vn1118xdOhQLFq0CB999BG6dOmCdu3aFeiGETVq1EB0dHSu1/PftX7j4+Nx5MgR+Pv7Y+bMmejVqxe6dOkCBweHXM+pyShrjRo18lxX+ObNm9L2gsjOzkZUVJT0Cw4RlRxsfIlIq/73v/+hXLlyGDFiBGJjY3Ntv3PnDpYuXQogZ4TY0tISJ06cUNvnxx9/1Pi8ffr0ga6uLn755Rfs2LEDH374IcqVKydtfzma9+/ROyGElKWgatWqhT59+mDjxo1qN7GYNm0a4uPj4evrm2sEOzQ0FPPnz0fjxo3Rp08fqT5z5kw8e/YMI0aMyPMOaocOHZJWgXgdFxcXXLhw4bXbBw4ciBcvXmDUqFF4+vRprlULdHV1c41wLl++/I2j8K/TvXt3ZGdnY9WqVVJNqVRi+fLluc4J5B5ZXbJkSa7nfPmZ5qcR7969O86fP6/2S1hqairWrFkDe3t7abRdU9evX0dGRkahrVxCRIWHUx2ISKtq1aqFwMBAeHt7o0GDBhgyZAgaN26MrKwsnDlzBjt27FBba3XEiBGYN28eRowYgZYtW+LEiRO4deuWxue1srJCx44dsXjxYiQnJ8Pb21tte/369VGrVi18+eWXePToEczMzPDbb7+9dlqAJr766isEBQVhyZIlmDdvHoCcBvPvv//G0qVLcf36dQwcOBAWFhYICwvD+vXrUalSJfz6669q6/V6e3sjPDwcs2fPxsWLF/Hxxx+jRo0aePbsGQ4ePIgjR4689c5tL5cPu3XrlnTB2r+1b98e1apVw549e2BsbIzevXurbf/www+xZcsWmJubo2HDhggJCcHhw4dRqVIljd8XT09PtG3bFv7+/rh37x4aNmyInTt35pqza2Zmhvfeew8LFizAixcvULVqVRw6dCjPkWsnJycAwJQpU9C/f3/o6+vD09NT7Zecl/z9/fHLL7/g/fffx9ixY1GxYkVs2rQJd+/exW+//ZZrbnZ+/fnnnzAxMUGXLl0KdDwRyUim1SSIqJS7deuWGDlypLC3txcGBgbC1NRUtG3bVixfvlxkZGRI+6WlpYnhw4cLc3NzYWpqKvr16yeePHny2uXMnj59+tpzrl27VgAQpqamIj09Pdf269evC3d3d1G+fHlhaWkpRo4cKS5fvpyvu4i97s5tL3Xo0EGYmZmJhIQEtfru3btFly5dhIWFhTA0NBS1a9cWEydOfOPrOHLkiPDy8hJWVlZCT09PVK5cWXh6eoo9e/a8MaMQQmRmZgpLS0sxa9as1+7z1VdfCQCiX79+ubbFx8eLYcOGCUtLS1G+fHnh4eEhbt68mWupsPwsZyaEEM+ePRODBw8WZmZmwtzcXAwePFhcvHgx13v+8OFD0atXL1GhQgVhbm4u+vbtKx4/fpzrvwMhhJg1a5aoWrWq0NHRUVva7L8ZhRDizp074qOPPhIVKlQQRkZGonXr1mLfvn1q+7zus33dcntt2rQRgwYNyvXeEVHxpxDiNZf/EhFRiTRr1ixs2LAB//zzz2sv2KKCuXTpEhwdHREWFobmzZvLHYeINMTGl4iolElJSYGDgwN++OGHPO88RgX3cnWLvO4USETFHxtfIiIiIioTuKoDEREREZUJbHyJiIiIqExg40tEREREZQIbXyIiIiIqE8rcDSxUKhUeP34MU1NTjW59SURERERFQwiB5ORkVKlSpcA3m8lLmWt8Hz9+DDs7O7ljEBEREdFbREVFoVq1alp7vjLX+JqamgLIeSPNzMxkTkNERERE/5WUlAQ7Ozupb9OWMtf4vpzeYGZmxsaXiIiIqBjT9rRUXtxGRERERGUCG18iIiIiKhPY+BIRERFRmcDGl4iIiIjKBDa+RERERFQmsPElIiIiojKBjS8RERERlQlsfImIiIioTGDjS0RERERlAhtfIiIiIioT2PgSERERUZnAxpeIiIiIygQ2vkRERERUJrDxJSIiIqIygY0vEREREZUJsja+J06cgKenJ6pUqQKFQoHdu3e/9Zhjx47B0dERhoaGqF27NjZu3FjoOYmIiIio5JO18U1NTUWzZs2wcuXKfO1/9+5dfPDBB+jYsSMuXbqEcePGYcSIEQgODi7kpERERERU0unJefL3338f77//fr73DwgIQM2aNbFo0SIAQIMGDXDq1Cn88MMP8PDwKKyYRESllzILuLwKeHQagJA7DRERVCrgWkThjM3K2vhqKiQkBO7u7mo1Dw8PjBs37rXHZGZmIjMzU3qclJRUWPGIiEqWp1eAP4YCTy/JnYSICAAQnVQew7b3xPE7NoXy/CXq4raYmBhYW1ur1aytrZGUlIT09PQ8j5k7dy7Mzc2lLzs7u6KISkRUfKmygbOzgZ9bsuklomJjz9V6aLrID8ERtZGRXThjsyVqxLcgJk+ejAkTJkiPk5KS2PwSUdn17AZwcCgQ8/erWqVGQJfVgFkN+XIRUZmVmvoCE6ecx+qNN6WaVWVjPHmq/XOVqMbXxsYGsbGxarXY2FiYmZnB2Ng4z2MMDQ1haGhYFPGIiIovlRII/QE4PRVQ/v/0L4UO0Op/gMsMQI//ThJR0QsNfYyBA/cjIuKZVOvZsz4WL24PB4fpWj9fiWp8XVxccODAAbXan3/+CRcXF5kSEZURQgXEhgKpMXInoYJQZQMXFgGPT7+qWdQDum0EqjjLFouIyi6lUoWFC89g6tSjyM5WAQBMTPSxZIkHRoxwRHJycqGcV9bGNyUlBbdv35Ye3717F5cuXULFihVRvXp1TJ48GY8ePcLmzZsBAL6+vlixYgX+97//4ZNPPsFff/2FoKAg7N+/X66XQFR6CQFEnwNuBQERO4CUh3InIq1QAE7jgbbfAfp5/6WMiKiwZWRk46efLkpNr5OTLQID+6Bu3UqFel5ZG98LFy6gY8eO0uOXc3GHDh2KjRs3Ijo6Gg8ePJC216xZE/v378f48eOxdOlSVKtWDT/99BOXMiPSFiFyRnYjtgMRQUDyg7cfQyVHhVqAxwagmpvcSYiojCtXzgCBgb3Rrt0GTJzoghkzOsDAQLfQz6sQQpSphRuTkpJgbm6OxMREmJmZyR2HSH5CAE8u/f/IbhCQGJl7Hx19wL4rYOucMy+USh4Ta6B+f0C/nNxJiKgMSk7ORFJSJqpWVe+9Hj1KylUDCq9fK1FzfIlIS4QA4sJzGt1bQUD8P7n30dEDqrsD9byB2l6AkUXR5yQiohIvJCQKgwbtgo1NeRw/7gM9vVcDKHk1vYWJjS9RWRJ37VWz+/xm7u0KXaB6J6BuP6BOL8C4cOdaERFR6ZWdrcLs2Scwa9YJKJUCkZHxmD//FKZMeU+2TGx8Kf+eXAYODgGSOO+zRBIqICuPOxcqdAC7Dv/f7PYGTCoXeTQiIipdIiPjMWjQToSEvLow2tXVDgMGNJExFRtf0sSV1Tm3OKVSQJFzgVM975xmt1zh3BqSiIjKFiEEtmy5gjFjDiA5OQsAoKurwPTp7TF5spvaNAc5sPGl/MtOe/W9mT2gywXvS5zytkDtXkDdj4DyVeROQ0REpUh8fDp8ffcjKOiaVHNwsMDWrb3h7FxNxmSvsPGlgulzEKhYT+4UREREVAwkJWWiefPVePAgUar5+DTHsmXdYGpafAbKuC4REREREb0TMzND9OpVHwBgYWGEoKCPsGGDV7FqegGO+FJ+CQG8SJU7BRERERVT8+a5IyMjG1OmuMHOzlzuOHli40uvJwQQewG4uR24teM/d/FSyBaLiIiI5COEwNq1YdDVVWD4cEepbmSkh4CAD2VM9nZsfEmdEMCTi69uWZt0L/c+FnWACg5FHo2IiIjk9fRpKkaO/B179kTA2FgPrq52aNCg5CyDycaXcprdp1de3bI24XbufXT0gBpdctZ6rdsn5zERERGVGYcO3cHQobsRE5MCAEhPz8a+fbfY+FIJEXc1p9GNCALiI3Jvf3kXr3reQO2evIsXERFRGZSRkY3Jkw9jyZJzUs3S0gTr1/eAp2fJWuGJjW9ZE/8PcCMwZ3T32fXc21/exaued856r7yLFxERUZkVHh6LgQN3Ijz8iVTr1q02Nmzwgo1NeRmTFQwb37LkwVHgt66AKvs/GxRAtfeAev2AOn2ActayxCMiIqLiQQiB5cvP43//+xOZmUoAgKGhLr7/vgvGjGkNhaJkXuTOxrcseXBEvemt2u7/5+x+lHNHLyIiIiIAKSlZWLQoRGp6mza1xtatvdG4sZXMyd4NG98yRbz61ms3UNtLtiRERERUfJmaGuLnn3uhY8dNGDu2DebM6Qwjo5LfNpb8V0AFY2AqdwIiIiIqJlJTs5Ca+gJWVuWkmptbDdy69TkcHCxkTKZdvGUxERERURkWGvoYTk5r8PHHv0GlEmrbSlPTC3DEt3jJTAQOjQDirhXO86c9efs+REREVCYolSosXHgGU6ceRXa2ChERz/DDDyGYONFV7miFho1vcSFETtN769eiOZ+eSdGch4iIiIqdqKhEDBmyG8eO3ZNqTk62JW5dXk2x8S0uLge8anoVuoB+uTfv/y5qvg/Yti685yciIqJiKyjoGkaN2oeEhAwAgEIB+Pu3w4wZHWBgoCtzusLFxrc4eHIJODb+1WPPX4E6PeVKQ0RERKVQUlImxo79A5s2XZZqdnZm2LKlF9q3t5cvWBFi4yu3rBRgnzegzMx53GIsm14iIiLSqsTEDDg6rkFkZLxU8/ZuhFWrPoCFhbGMyYoWV3WQkxDAYT8g/lbOYytH4L0F8mYiIiKiUsfc3AidOtkDAExNDbB5c0/88kufMtX0Ahzxlde1TcCNn3O+NzAFPtwO6BnKm4mIiIhKpR9+6Ib09Gx8+23HUrdMWX6x8ZXLsxvAkc9ePe6yBrCoLV8eIiIiKhWEENiy5Qr09XXw8cdNpHr58gb4+efeMiaTHxtfObxIB/b1A7LTch43GQnU7y9vJiIiIirx4uPT4eu7H0FB11C+vAFat66KWrUqyh2r2OAcXzkcGwfEXc35vlIjoOMSOdMQERFRKXDs2D00bRqAoKCcG2GlpGTh11+vy5yqeOGIb1G7uR24sibnez1jwDMI0OfNJIiIiKhgsrKUmDbtKBYsOA3x/3ccrlDBCGvWfIi+fRvJG66YYeNblNLigD9HvnrceSVQqaF8eYiIiKhEi4iIw4ABOxEWFi3VOnSwx+bNPWFnZy5jsuKJjW9RenwGyErO+b5uX6CRj6xxiIiIqGQSQmDNmlCMHx+M9PRsAIC+vg5mz+6EiRNdoaOjkDlh8cTGtygJ5avvrVvm3COQiIiISEOJiZmYMeO41PTWq1cJgYF94OhoK3Oy4o0XtxERERGVMBUqGGHjRi8AgK+vE8LCRrHpzQeO+BIREREVcxkZ2UhLe4GKFV/dac3DozauXvVDo0ZWMiYrWdj4aipsGXBnLwCh+bFpT7Qeh4iIiEq38PBYDBiwEzVqmOP33z+G4l9TJdn0aoaNryYSIoGjX2jnuXQNtPM8REREVCqpVALLl5/DpEmHkZmpxNWrTxAQcAF+fq3kjlZisfHVRPpT7TxPhdpAnbJ9y0AiIiJ6vejoZAwbtgfBwXekWtOm1nBzqyFjqpKPjW9BNRsNtP++YMfqGQEKXldIREREue3ZcxMjRvyOuLg0qTZ+vDPmzOkMIyO2bu+C715B6erzjmtERESkNampWZg48RBWrw6Vara25bFpU0906VJLxmSlBxtfIiIiIpnFx6fDxWUdIiKeSbWePetj7VpPWFpyoE1b+Pd2IiIiIplZWBjDyakKAMDERB9r13pi585+bHq1jCO+RERERMXAypXdkZ7+AvPmuaNu3UpyxymV2PgSERERFbGgoGswNNSFl1d9qVahghF27vSWMVXpx8aXiIiIqIgkJWVi7Ng/sGnTZVhYGOHKlSqoVs1M7lhlBuf4EhERERWBkJAoNG8egE2bLgMA4uMz8PPPV2ROVbZwxJeIiIioEGVnq/Dddyfw3XcnoFQKAICpqQFWruyOQYOaypyubGHjS0RERFRIIiPjMWjQToSEPJRqrq52+PnnXqhZ00LGZGUTG18iIiIiLRNCYPPmyxgz5g+kpGQBAHR1FZg2rT2+/toNenqcbSoHNr5EREREWhYfn4GJEw9JTa+DgwW2bu0NZ+dqMicr2/jrBhEREZGWVaxojJ9+6gEA8PFpjkuXRrHpLQY44ktERET0jrKylMjMzIapqaFU69mzPi5cGCndkY3kxxFfIiIioncQEREHF5d1GDHidwgh1Lax6S1e2PgSERERFYAQAqtXX0CLFqsRFhaNoKBr2LKF6/IWZ5zqQERERKShp09TMWLE79i7N0Kq1atXCY0bW8mYit6GjS8RERGRBoKDb8PHZw9iYlKkmq+vExYt8oCJib6Myeht2PgSERER5UNGRjYmTz6MJUvOSTVLSxOsX98Dnp71ZExG+cXGl4iIiOgtnj9PR4cOGxEe/kSqdetWGxs2eMHGpryMyUgTvLiNiIiI6C0sLIzg4JBzi2FDQ10sW9YNBw4MYNNbwnDEl4iIiOgtFAoFfvqpB9LTd2LRoq68iK2EYuNLRERE9B9790bA0FAXHh61pZqlpQmCgwfJmIreFac6EBEREf2/1NQs+Prug5fXNgwZshtPnqTKHYm0iI0vEREREYDQ0MdwdFyD1atDAQBPnqRi/fqLMqcibeJUB01c//nV9/rl5MtBREREWqNUqrBw4RlMnXoU2dkqAICJiT6WLPHAiBGOMqcjbWLjm1//7AIurcj5XtcQaDBQ3jxERET0zqKiEjF48C4cP35fqjk52SIwsA/q1q0kYzIqDGx88yPxHhD8yavHHZcAlRrKlYaIiIi0ICjoGkaN2oeEhAwAgEIB+Pu3w4wZHWBgoCtzOioMbHzfRvkC2P8xkJmQ87huX6DpKFkjERER0buJi0vDyJG/IykpEwBgZ2eGLVt6oX17e3mDUaHixW1vc3oqEH0253vzmkDXtTm/EhIREVGJZWlpglWrPgAAeHs3wuXLvmx6ywCO+L7J3T+AvxfkfK+jD3y4HTA0lzcTERERaSw7W4WsLCVMTPSl2oABTVCtmhnc3KpDwUGtMoEjvq+T8hj4Y8irx27zAJtW8uUhIiKiAomMjMd7723AmDEHcm17770abHrLEDa+eVEpgf0DgPS4nMcOHwJO4+XNRERERBoRQmDz5sto1iwAISEPsWHDJezYcU3uWCQjTnXIy9lZwMPjOd+XrwZ028h5vURERCVIfHw6fH33IyjoVaPr4GABOztOWSzL2Pj+14OjQMi3Od8rdIAPAgFjruNHRERUUhw7dg+DB+/Cw4dJUs3HpzmWLesGU1NDGZOR3Nj4/psq+//n9Yqcx67fAtXcZI1ERERE+ZOVpcS0aUexYMFpiP//X7mFhRFWr/4Qffs2kjccFQtsfP8t/h8g5WHO97bOQGt/efMQERFRvjx7loauXX9GWFi0VOvY0R6bN/dCtWpmMiaj4oQXt6kRr76t2ADQ4V1biIiISgILC2NYWpoAAPT1dbBggTsOHx7CppfUsPElIiKiEk9HR4GNG73Qrl11nD07Al991RY6OrwwndRxqgMRERGVOIcO3YGRkR7ee6+GVLO1NcXJk8NkTEXFnewjvitXroS9vT2MjIzQpk0bnD9//o37L1myBPXq1YOxsTHs7Owwfvx4ZGRkFFFaIiIiklNGRjbGjz8ID4+fMXDgTsTHp8sdiUoQWRvf7du3Y8KECZg+fTrCwsLQrFkzeHh44MmTJ3nuHxgYCH9/f0yfPh03btzAunXrsH37dnz99ddFnJyIiIiKWnh4LFq3XoslS84BAB4+TMKaNaEyp6KSRNbGd/HixRg5ciSGDRuGhg0bIiAgACYmJli/fn2e+585cwZt27bFgAEDYG9vj65du+Ljjz9+6ygxERERlVwqlcDSpWfRqtVahIfnDI4ZGupi2bJu+N//2sqcjkoS2RrfrKwshIaGwt3d/VUYHR24u7sjJCQkz2NcXV0RGhoqNbqRkZE4cOAAunfv/trzZGZmIikpSe2LiIiISobo6GR0774V48YFIzNTCQBo0sQKFy58is8/bwMF76xKGpDt4ra4uDgolUpYW1ur1a2trXHz5s08jxkwYADi4uLQrl07CCGQnZ0NX1/fN051mDt3LmbOnKnV7ERERFT49uy5iREjfkdcXJpUGz/eGXPmdIaREa/PJ83JfnGbJo4dO4Y5c+bgxx9/RFhYGHbu3In9+/dj1qxZrz1m8uTJSExMlL6ioqKKMDEREREVxNOnqRg4cKfU9Nralkdw8CAsXuzBppcKTLb/ciwtLaGrq4vY2Fi1emxsLGxsbPI85ptvvsHgwYMxYsQIAECTJk2QmpqKTz/9FFOmTIGOTu4+3tDQEIaGvC83ERFRSVK5cjksWdINI0f+Di+vevjppx7SDSqICkq2EV8DAwM4OTnhyJEjUk2lUuHIkSNwcXHJ85i0tLRcza2ubs7d1YQQeR1CREREJYBSqUJmZrZabfjwFvjjj4HYtcubTS9phaxTHSZMmIC1a9di06ZNuHHjBvz8/JCamophw3IWnx4yZAgmT54s7e/p6YlVq1Zh27ZtuHv3Lv78809888038PT0lBpgIiIiKlmiohLh7r4FX355SK2uUCjQrVttXsBGWiPrJBlvb288ffoU06ZNQ0xMDJo3b46DBw9KF7w9ePBAbYR36tSpUCgUmDp1Kh49eoTKlSvD09MTs2fPluslEBER0TsICrqGUaP2ISEhA8eO3cP779dB9+515I5FpZRClLE5AklJSTA3N0diYiLMzMzUNz67DmxslPN9o2FAt7zXEyYiIqJ3k5SUibFj/8CmTZelmp2dGbZu7Q03txpvOJLKgjf2a++Al0USERFRkQoJicKgQbsQGRkv1by9G2HVqg9gYWEsYzIq7dj4EhERUZHIzlZh9uwTmDXrBJTKnD84m5oaYOXK7hg0qCnn8lKhY+NLREREhe7ZszR4ev6CkJCHUs3V1Q4//9wLNWtayJiMypISdQMLIiIiKpkqVDCCnl5O26Grq8DMmR1w/LgPm14qUmx8iYiIqNDp6upgy5ZecHS0xalTn2DatPZSI0xUVDjVgYiIiLTu+PF7MDbWR+vWVaVajRoVcOHCSM7lJdnwVy0iIiLSmqwsJSZPPoyOHTfh449/Q3Jyptp2Nr0kJza+REREpBUREXFwcVmHefNOQwggMjIeq1ZdkDsWkYRTHYiIiOidCCGwdm0Yxo07iPT0bACAvr4OZs/uhIkTXWVOR/QKG18iIiIqsKdPUzFy5O/YsydCqtWrVwmBgX3g6GgrYzKi3Nj4EhERUYEEB9+Gj88exMSkSDVfXycsWuQBExN9GZMR5Y2NLxEREWksNjYFPXtuR0ZGztQGS0sTrF/fA56e9WRORvR6vLiNiIiINGZtXR7z5nUGAHh41EJ4uB+bXir2NB7xTU9PhxACJiYmAID79+9j165daNiwIbp27ar1gERERCQ/lUpAqVRBX19Xqn3+eRtUq2aGXr0aQEeHy5RR8afxiK+Xlxc2b94MAEhISECbNm2waNEieHl5YdWqVVoPSERERPKKjk7G++9vxdSpf6nVdXQU6NOnIZteKjE0bnzDwsLg5uYGAPj1119hbW2N+/fvY/PmzVi2bJnWAxIREZF89uy5iSZNVuHQoTv4/vsz+Ouvu3JHIiowjac6pKWlwdTUFABw6NAh9O7dGzo6OnB2dsb9+/e1HpCIiIiKXmpqFiZOPITVq0OlmrV1eRkTEb07jUd8a9eujd27dyMqKgrBwcHSvN4nT57AzMxM6wGJiIioaIWGPoaj4xq1ptfLqx7Cw/3QqVNNGZMRvRuNG99p06bhyy+/hL29PVq3bg0XFxcAOaO/LVq00HpAIiIiKhpKpQrz55+Cs/M63Lr1DABgYqKPNWs+xK5d3rC0NJE5IdG70Xiqw0cffYR27dohOjoazZo1k+qdO3dGr169tBqOiIiIikZcXBr69t2BY8fuSTUnJ1sEBvZB3bqV5AtGpEUFuoGFjY0NbGxs8PDhQwBAtWrV0Lp1a60GIyIioqJjbm6IlJQsAIBCAfj7t8OMGR1gYKD7liOJSg6NpzqoVCp8++23MDc3R40aNVCjRg1UqFABs2bNgkqlKoyMREREVMj09XWxdWtvNGhgiaNHh2LOnM5seqnU0XjEd8qUKVi3bh3mzZuHtm3bAgBOnTqFGTNmICMjA7Nnz9Z6SCIiItKukJAomJjoo1kzG6lWt24lXL06muvyUqmlceO7adMm/PTTT+jRo4dUa9q0KapWrYrRo0ez8SUiIirGsrNVmD37BGbNOoG6dSvhwoVPYWKiL21n00ulmcZTHZ4/f4769evnqtevXx/Pnz/XSigiIiLSvsjIeLz33gbMmHEcSqXAjRtx+PHHv+WORVRkNG58mzVrhhUrVuSqr1ixQm2VByIiIioehBDYvPkymjcPQEhIzoXpuroKfPttB4wb5yxzOqKio/FUhwULFuCDDz7A4cOHpTV8Q0JCEBUVhQMHDmg9IBERERVcfHw6fH33IyjomlSrVcsCP//cG87O1WRMRlT0NB7xbd++PSIiItCrVy8kJCQgISEBvXv3RkREBNzc3AojY9EQArj/p9wpiIiItObYsXto2jRArekdNqw5Ll4cxaaXyqQCreNbtWrV0nURW8pj4M9Pgcj9r2qmVeXLQ0RE9I6io5Ph4fEzsrKUAAALCyOsXv0h+vZtJHMyIvloPOJbu3ZtzJgxA//8809h5ClaQgA3tgKbGqs3vQ2HAK0ny5eLiIjoHdnammL69PYAgI4d7XHlih+bXirzNG58P/vsM+zfvx/16tVDq1atsHTpUsTExBRGtsKV9hTY2wc4MAjIiM+pmVgDXnuA9zcB+rwfORERlRxCCCiV6jeSmjSpLTZv7onDh4egWjUzmZIRFR8KIYQoyIG3bt3C1q1b8csvv+Du3bvo2LEjBg0ahCFDhmg7o1YlJSXB3NwciQsrwgz/Wn6tXn+g8wrAmPcjJyKikuXp01SMHPk7WrSwwfTpHeSOQ/TOpH4tMRFmZtr7pa3Aje+/nT17Fn5+frhy5QqUSqU2chUa6Y38DjAzAmBsCXT+EajXV+5oREREGgsOvg0fnz2IiUmBrq4CJ08Og4uLndyxiN5JYTW+Bbq47aXz588jMDAQ27dvR1JSEvr2LWHNY+1eQJcAwMRK7iREREQaycjIxuTJh7FkyTmpZmFhjOTkLBlTERVvGje+/53i0KlTJ8yfPx+9e/dG+fLlCyNj4ajhDvT4DVDw1oxERFSyhIfHYuDAnQgPfyLVPDxqYePGnrCxKUH/LyYqYho3vvXr10erVq3w2WefoX///rC2ti6MXIVPvxybXiIiKlFUKoHly89h0qTDyMzMmVpoaKiLBQu6YMyY1tDR4f/XiN5E48Y3IiICderUKYwsRERE9BrPnqVh4MCdCA6+I9WaNLFCYGAfNG7MKXtE+aHxcmZseomIiIpeuXIGePQoWXo8frwzzp8fyaaXSAP5GvGtWLEibt26BUtLS1hYWEDxhikCz58/f+02IiIiKhgjIz0EBvaGl9c2BAR8iK5da8kdiajEyVfj+8MPP8DU1FT6/k2NLxEREb270NDHKFfOAPXrW0q1Jk2scevW59DT0/gPtkSEfDa+Q4cOlb738fEprCxERERlnlKpwsKFZzB16lE0bmyFs2eHw9Dw1f+u2fQSFZzGPz26urp48uRJrvqzZ8+gq6urlVBERERlUVRUIjp33gx//yPIzlbh0qUY/Pjj33LHIio1NF7V4XU3esvMzISBgcE7ByIiIiqLgoKuYdSofUhIyACQs+Kmv387fPZZa5mTEZUe+W58ly1bBgBQKBT46aef1G5WoVQqceLECdSvX1/7CYmIiEqxpKRMjB37BzZtuizV7OzMsGVLL7Rvby9fMKJSKN+N7w8//AAgZ8Q3ICBAbVqDgYEB7O3tERAQoP2EREREpVRISBQGDdqFyMh4qebt3QirVn0ACwtjGZMRlU75bnzv3r0LAOjYsSN27twJCwuLQgtFRERU2j16lIQOHTYhKyvnDmympgZYubI7Bg1qytWTiAqJxhe3HT16lE0vERHRO6pa1QxffukCAHB1tcPly74YPLgZm16iQpSvEd8JEyZg1qxZKFeuHCZMmPDGfRcvXqyVYERERKXJy4vD/93YzpjRAdWrm2P4cEcuU0ZUBPLV+F68eBEvXryQvn8d/pZKRESUW3x8Onx996NVqyr48ktXqa6vr4tRo1rKmIyobMlX43v06NE8vyciIqI3O3bsHgYP3oWHD5Owa9cNdO5cEy1a2Modi6hMeue/qyQlJWH37t24efOmNvIQERGVCllZSvj7H0anTpvw8GESAKB8eQPExKTInIyo7NL4Bhb9+vXDe++9hzFjxiA9PR0tW7bEvXv3IITAtm3b0KdPn8LISUREVGJERMRhwICdCAuLlmodO9pj8+ZeqFbNTMZkRGWbxiO+J06cgJubGwBg165dEEIgISEBy5Ytw3fffaf1gERERCWFEAKrV19AixarpaZXX18HCxa44/DhIWx6iWSmceObmJiIihUrAgAOHjyIPn36wMTEBB988AH++ecfrQckIiIqCZ4/T0fPntvh67sf6enZAIB69Srh7NkR+OqrttDR4QXgRHLTuPG1s7NDSEgIUlNTcfDgQXTt2hUAEB8fDyMjI60HJCIiKgkMDXVx82ac9NjPryXCwkbB0ZEXshEVFxo3vuPGjcPAgQNRrVo1VKlSBR06dACQMwWiSZMm2s5HRERUIpQrZ4CtW3ujShVT7N3bHz/++AFMTPTljkVE/6LxxW2jR49G69atERUVhS5dukBHJ6d3dnBw4BxfIiIqM8LDY1GunAEcHF7dzbRlyyqIjBwLQ0ON//dKREWgQD+ZLVu2RMuWLSGEgBACCoUCH3zwgbazERERFTsqlcDy5ecwadJhtGhhi5Mnh6nddY1NL1HxVaB1fDdv3owmTZrA2NgYxsbGaNq0KbZs2aLtbERERMVKdHQy3n9/K8aNC0ZmphJnzz7EqlV/yx2LiPJJ419LFy9ejG+++QZjxoxB27ZtAQCnTp2Cr68v4uLiMH78eK2HJCIiktuePTcxfPhePHuWLtXGj3fGyJFOMqYiIk1o3PguX74cq1atwpAhQ6Rajx490KhRI8yYMYONLxERlSqpqVmYOPEQVq8OlWq2tuWxcWNPdO1aS8ZkRKQpjRvf6OhouLq65qq7uroiOjo6jyOIiIhKptDQxxgwYCdu3Xom1Xr2rI+1az1haWkiYzIiKgiN5/jWrl0bQUFBuerbt29HnTp1tBKKiIhIblFRiXB1XS81vSYm+li71hM7d/Zj00tUQmk84jtz5kx4e3vjxIkT0hzf06dP48iRI3k2xERERCWRnZ05Ro9uiSVLzsHJyRaBgX1Qt24luWMR0TvQuPHt06cPzp8/j8WLF2P37t0AgAYNGuD8+fNo0aKFtvMREREVmZdLdL40d647qlc3x2eftYaBga6MyYhIGzRqfJOSknDu3DlkZWXhhx9+QOXKlQsrFxERUZFJSsrE2LF/oHXrqhg9upVUNzLSw/jxLjImIyJtynfje+nSJXTv3h2xsbEQQsDU1BRBQUHw8PAozHxERESFKiQkCgMH7sTduwnYvv0aOna0R4MGHNghKo3yfXHbpEmTULNmTZw6dQqhoaHo3LkzxowZU5jZiIiICk12tgozZhyDm9sG3L2bAADQ19fBnTvx8gYjokKT7xHf0NBQHDp0CI6OjgCA9evXo2LFikhKSoKZmVmhBSQiItK2yMh4DBq0EyEhD6Waq6sdfv65F2rWtJAxGREVpnyP+D5//hzVqlWTHleoUAHlypXDs2fP3nAUERFR8SGEwKZNl9CsWYDU9OrqKjBzZgccP+7DppeolNPo4rbr168jJiZGeiyEwI0bN5CcnCzVmjZtqr10REREWpKQkIFRo/YhKOiaVHNwsMDWrb3h7FztDUcSUWmhUePbuXNnCCHUah9++CEUCoW0BIxSqdRqQCIiIm1QKIBz515NbfDxaY5ly7rB1NRQxlREVJTy3fjevXu3MHMQEREVKnNzI2zZ0gu9ewfhxx+7o2/fRnJHIqIilu/Gt0aNGoWZg4iISKsiIuJQrpwBqlV7dQG2m1sN3Lv3BcqVM5AxGRHJJd8XtxEREZUEQgisXn0BLVqsxpAhu6BSqU/RY9NLVHax8SUiolLj6dNU9Oy5Hb6++5Geno2jR+9hzZpQuWMRUTGh0cVtRERExVVw8G34+OxBTEyKVPP1dcKQIc1kTEVExYnsI74rV66Evb09jIyM0KZNG5w/f/6N+yckJOCzzz6Dra0tDA0NUbduXRw4cKCI0hIRUXGTkZGN8eMPolu3rVLTa2lpgr17+2PVqg9hYqIvc0IiKi40HvFNT0+HEAImJiYAgPv372PXrl1o2LAhunbtqtFzbd++HRMmTEBAQADatGmDJUuWwMPDAxEREbCyssq1f1ZWFrp06QIrKyv8+uuvqFq1Ku7fv48KFSpo+jKIiKgUCA+PxcCBOxEe/kSqeXjUwsaNPWFjU17GZERUHGnc+Hp5eaF3797w9fVFQkIC2rRpA319fcTFxWHx4sXw8/PL93MtXrwYI0eOxLBhwwAAAQEB2L9/P9avXw9/f/9c+69fvx7Pnz/HmTNnoK+f8xu8vb29pi+BiIhKgfv3E9Cq1VpkZuasH29oqIsFC7pgzJjW0NFRyJyOiIojjac6hIWFwc3NDQDw66+/wtraGvfv38fmzZuxbNmyfD9PVlYWQkND4e7u/iqMjg7c3d0REhKS5zF79+6Fi4sLPvvsM1hbW6Nx48aYM2fOG2+akZmZiaSkJLUvIiIq+WrUqCDN323SxAoXLnyKsWPbsOklotfSeMQ3LS0NpqamAIBDhw6hd+/e0NHRgbOzM+7fv5/v54mLi4NSqYS1tbVa3draGjdv3szzmMjISPz1118YOHAgDhw4gNu3b2P06NF48eIFpk+fnucxc+fOxcyZM/Odi4iISo4ffvBAjRrmmDjRFUZGvF6biN5M4xHf2rVrY/fu3YiKikJwcLA0r/fJkycwMzN7y9HvRqVSwcrKCmvWrIGTkxO8vb0xZcoUBAQEvPaYyZMnIzExUfqKiooq1IxERKR9qalZ8PXdh40bL6nVy5UzwJQp77HpJaJ80fhfimnTpmHAgAEYP348OnXqBBcXFwA5o78tWrTI9/NYWlpCV1cXsbGxavXY2FjY2NjkeYytrS309fWhq6sr1Ro0aICYmBhkZWXBwCD3ouSGhoYwNOR92ImISqrQ0McYOHAnIiKeYevWcLi5VUetWhXljkVEJZDGI74fffQRHjx4gAsXLiA4OFiqd+7cGT/88EO+n8fAwABOTk44cuSIVFOpVDhy5IjUTP9X27Ztcfv2bahUKql269Yt2Nra5tn0EhFRyaVUqjB//ik4O69DRMQzAIBKJXD16pO3HElElLcCreNrY2ODFi1a4PHjx3j48CEAoHXr1qhfv75GzzNhwgSsXbsWmzZtwo0bN+Dn54fU1FRplYchQ4Zg8uTJ0v5+fn54/vw5vvjiC9y6dQv79+/HnDlz8NlnnxXkZRARUTEVFZWIzp03w9//CLKzcwY7nJxscfHiKHh5afb/GiKilzSe6qBSqfDdd99h0aJFSEnJWSjc1NQUEydOxJQpU6Cjk/9e2tvbG0+fPsW0adMQExOD5s2b4+DBg9IFbw8ePFB7Pjs7OwQHB2P8+PFo2rQpqlatii+++AKTJk3S9GUQEVExFRR0DaNG7UNCQgYAQKEA/P3bYcaMDjAw0H3L0UREr6cQQghNDpg8eTLWrVuHmTNnom3btgCAU6dOYcaMGRg5ciRmz55dKEG1JSkpCebm5kjc5gUz791yxyEiov+XnJyJzz//A5s2XZZqdnZm2LKlF9q3t5cvGBEVOalfS0zU6uIJGo/4btq0CT/99BN69Ogh1V6Ovo4ePbrYN75ERFQ8ZWYqcejQHemxt3cjrFr1ASwsjGVMRUSlicZzfJ8/f57nXN769evj+fPnWglFRERlj6WlCTZt6gkzM0Ns3twTv/zSh00vEWmVxo1vs2bNsGLFilz1FStWoFmzZloJRUREpV9kZDxiY1PUal261ML9++MweHAzKBS8AxsRaZfGUx0WLFiADz74AIcPH5aWHQsJCUFUVBQOHDig9YBERFS6CCGwefNljBnzB957rwb27ftYrcmtUMFIxnREVJppPOLbvn173Lp1C7169UJCQgISEhLQu3dvREREwM3NrTAyEhFRKREfn47+/X+Dj88epKRk4cCBf7BhwyW5YxFRGaHRiO+LFy/QrVs3BAQE8CI2IiLSyLFj9zB48C48fJgk1Xx8mqNv34YypiKiskSjxldfXx9XrlwprCxERFQKZWUpMW3aUSxYcBovF9C0sDDC6tUfom/fRvKGI6IyReOpDoMGDcK6desKIwsREZUyN2/GwcVlHebPf9X0duxojytX/Nj0ElGR0/jituzsbKxfvx6HDx+Gk5MTypUrp7Z98eLFWgtHREQlV2RkPBwdVyM9PRsAoK+vg9mzO2HiRFfo6HDFBiIqeho3vlevXoWjoyMA4NatW2rbuPQMERG95OBggd69G2Dr1nDUq1cJgYF94OhoK3csIirDNG58jx49Whg5iIioFFq5sjtq1DDHlCnvwcREX+44RFTGaTzHl4iI6L8yMrIxfvxB7NhxTa1ubm6E2bM7s+klomIhXyO+vXv3xsaNG2FmZobevXu/cd+dO3dqJRgREZUM4eGxGDhwJ8LDn2Djxstwdq4GOztzuWMREeWSr8bX3Nxcmr9rbs5/zIiICFCpBJYvP4dJkw4jM1MJAEhPf4ELFx6z8SWiYilfje+GDRvy/J6IiMqm6OhkDBu2B8HBd6RakyZWCAzsg8aNrWRMRkT0egWa45udnY3Dhw9j9erVSE5OBgA8fvwYKSkpWg1HRETFz549N9G0aYBa0zt+vDPOnx/JppeIijWNV3W4f/8+unXrhgcPHiAzMxNdunSBqakp5s+fj8zMTAQEBBRGTiIikllqahYmTjyE1atDpZqtbXls3NgTXbvWkjEZEVH+aDzi+8UXX6Bly5aIj4+HsbGxVO/VqxeOHDmi1XBERFR8JCVl4rffbkiPe/asjytX/Nj0ElGJoXHje/LkSUydOhUGBgZqdXt7ezx69EhrwYiIqHixtTXFTz95wsREH2vXemLnzn6wtDSROxYRUb5pPNVBpVJBqVTmqj98+BCmpqZaCUVERPKLikpEuXIGqFjx1V/3vLzq4+7dL2BlVe4NRxIRFU8aj/h27doVS5YskR4rFAqkpKRg+vTp6N69uzazERGRTIKCrqFp0wCMGrUPQgi1bWx6iaik0rjxXbRoEU6fPo2GDRsiIyMDAwYMkKY5zJ8/vzAyEhFREUlKyoSPz254e/+KhIQM/PrrdQQGhssdi4hIKzSe6lCtWjVcvnwZ27Ztw5UrV5CSkoLhw4dj4MCBahe7ERFRyRISEoWBA3fi7t0Eqebt3Qjdu9eRLxQRkRZp3PgCgJ6eHgYNGqTtLEREJIPsbBVmzz6BWbNOQKnMmdZgamqAlSu7Y9CgptKdO4mISrp8Nb579+7N9xP26NGjwGGIiKhoRUbGY9CgnQgJeSjVXF3t8PPPvVCzpoWMyYiItC9fjW/Pnj3VHisUilwXO7wcEchrxQciIip+bt9+DkfH1UhOzgIA6OoqMG1ae3z9tRv09Ap0Y08iomItX/+yqVQq6evQoUNo3rw5/vjjDyQkJCAhIQF//PEHHB0dcfDgwcLOS0REWlKrlgU6d3YAADg4WODUqU8wbVp7Nr1EVGppPMd33LhxCAgIQLt27aSah4cHTExM8Omnn+LGjRtvOJqIiIoLhUKBtWs9UaOGOWbN6ghTU0O5IxERFSqNf62/c+cOKlSokKtubm6Oe/fuaSESERFpW1aWEv7+h7F//y21uqWlCZYs6caml4jKBI0b31atWmHChAmIjY2VarGxsfjqq6/QunVrrYYjIqJ3FxERBxeXdZg//zQ++WQvYmNT5I5ERCQLjRvf9evXIzo6GtWrV0ft2rVRu3ZtVK9eHY8ePcK6desKIyMRERWAEAKrV19AixarERYWDQCIj0/H6dNRMicjIpKHxnN8a9eujStXruDPP//EzZs3AQANGjSAu7s713okIiomnj5NxYgRv2Pv3gipVq9eJQQG9oGjo62MyYiI5FOgG1goFAp07doVXbt21XYeIiJ6R8HBt+HjswcxMa+mNPj5tcTChV1hYqIvYzIiInkVqPFNTU3F8ePH8eDBA2RlZaltGzt2rFaCERGRZjIysjF58mEsWXJOqllammD9+h7w9KwnYzIiouJB48b34sWL6N69O9LS0pCamoqKFSsiLi4OJiYmsLKyYuNLRCSTJ09SsWHDJelxt261sWGDF2xsyssXioioGNH44rbx48fD09MT8fHxMDY2xtmzZ3H//n04OTlh4cKFhZGRiIjyoXp1c6xa9QEMDXWxbFk3HDgwgE0vEdG/aDzie+nSJaxevRo6OjrQ1dVFZmYmHBwcsGDBAgwdOhS9e/cujJxERPQf0dHJKFfOAGZmr9bg/fjjJmjXrjrs7MxlTEZEVDxpPOKrr68PHZ2cw6ysrPDgwQMAOTewiIriEjlEREVhz56baNo0AGPH/pFrG5teIqK8adz4tmjRAn///TcAoH379pg2bRq2bt2KcePGoXHjxloPSEREr6SmZsHXdx969tyOuLg0bNp0Gb/9dl3uWEREJYLGje+cOXNga5uzBuTs2bNhYWEBPz8/PH36FGvWrNF6QCIiyhEa+hiOjmuwenWoVOvZsz7at7eXLxQRUQmi8Rzfli1bSt9bWVnh4MGDWg1ERETqlEoVFi48g6lTjyI7WwUAMDHRx9Kl3TB8eAvePIiIKJ8KtI4vEREVjaioRAwevAvHj9+Xak5OtggM7IO6dSvJmIyIqOTJV+PbokX+RxTCwsLeKRAREeW4desZ2rT5CQkJGQAAhQLw92+HGTM6wMBAV+Z0REQlT74a3549e0rfZ2Rk4Mcff0TDhg3h4uICADh79iyuXbuG0aNHF0pIIqKyqHbtimjTpiqCg+/Azs4MW7b04nxeIqJ3kK/Gd/r06dL3I0aMwNixYzFr1qxc+3A5MyIi7dHRUWDDBi/MmHEM8+a5w8LCWO5IREQlmkIIITQ5wNzcHBcuXECdOnXU6v/88w9atmyJxMRErQbUtqSkJJibmyNxmxfMvHfLHYeICACQna3C7Nkn4OZWA5061ZQ7DhGRrKR+LTERZmZmWntejS9uMzY2xunTp3M1vqdPn4aRkZHWghERlRWRkfEYNGgnQkIeompVU1y54oeKFTm6S0SkbRo3vuPGjYOfnx/CwsLQunVrAMC5c+ewfv16fPPNN1oPSERUWgkhsGXLFYwZcwDJyVkAgJiYFBw9ehd9+jSUOR0RUemjcePr7+8PBwcHLF26FD///DMAoEGDBtiwYQP69eun9YBERKVRfHw6fH33IyjomlRzcLDA1q294excTcZkRESll0aNb3Z2NubMmYNPPvmETS4RUQEdO3YPgwfvwsOHSVLNx6c5li3rBlNTQxmTERGVbhrdslhPTw8LFixAdnZ2YeUhIiq1srKUmDz5MDp12iQ1vRUqGCEo6CNs2ODFppeIqJBp1PgCQOfOnXH8+PHCyEJEVKo9fJiE5cvP4+VaOh062OPKFV/07dtI3mBERGWExnN833//ffj7+yM8PBxOTk4oV66c2vYePXpoLRwRUWni4GCBpUu7wc9vP2bP7oSJE12ho5O/u2ISEdG703gdXx2d1w8SKxQKKJXKdw5VmLiOLxEVlbi4NJiY6MPERF+qCSFw5048ateuKGMyIqLirbDW8dV4qoNKpXrtV3FveomIikpw8G00abIKX311SK2uUCjY9BIRyUTjxvffMjIytJWDiKhUyMjIxvjxB9Gt21bExKTgxx8vYP/+W3LHIiIiFKDxVSqVmDVrFqpWrYry5csjMjISAPDNN99g3bp1Wg9IRFRShIfHonXrtViy5JxU69atNpycqsiYioiIXtK48Z09ezY2btyIBQsWwMDAQKo3btwYP/30k1bDERGVBCqVwNKlZ9Gq1VqEhz8BABga6mLZsm44cGAAbGzKy5yQiIiAAjS+mzdvxpo1azBw4EDo6upK9WbNmuHmzZtaDUdEVNxFRyeje/etGDcuGJmZOdc5NGlihQsXPsXnn7eBQsFVG4iIiguNlzN79OgRateunauuUqnw4sULrYQiIioJIiLi0K7dBsTFpUm18eOdMWdOZxgZafzPKxERFTKNR3wbNmyIkydP5qr/+uuvaNGihVZCERGVBLVrV0TDhpUBALa25REcPAiLF3uw6SUiKqY0/td52rRpGDp0KB49egSVSoWdO3ciIiICmzdvxr59+wojIxFRsaSrq4MtW3ph6tS/sHixBywtTeSOREREb5DvEd/nz58DALy8vPD777/j8OHDKFeuHKZNm4YbN27g999/R5cuXQotKBGRnJRKFebPP4UzZ6LU6tWrm2Pz5l5seomISoB8j/hWqVIFPXv2xPDhw9GlSxf8+eefhZmLiKjYiIpKxODBu3D8+H3UrFkBly75wszMUO5YRESkoXyP+K5duxZPnz5Ft27dYG9vjxkzZuD+/fuFmY2ISHZBQdfQtGkAjh/P+ffu3r0EHDp0R+ZURERUEPlufAcPHowjR47g9u3bGDp0KDZt2oRatWqhS5cu2L59O7KysgozJxFRkUpKyoSPz254e/+KhIScu1Ta2Znh6NGh+OijhjKnIyKigtB4VYeaNWti5syZuHv3Lg4ePAgrKyt88sknsLW1xdixYwsjIxFRkQoJiUKLFquxadNlqebt3QiXL/uifXt7+YIREdE70bjx/Td3d3ds3boVmzdvBgCsXLlSK6GIiOSQna3CzJnH4Oa2AZGR8QAAU1MDbN7cE7/80gcWFsYyJyQiondR4MUm79+/jw0bNmDTpk2IiopCx44dMXz4cG1mIyIqUnfuPMfcuaegVAoAgKurHX7+uRdq1rSQORkREWmDRiO+mZmZCAwMhLu7O2rVqoUNGzZgyJAhuH37Nv7880/079+/sHISERW6evUssWBBF+jqKjBzZgccP+7DppeIqBTJ94jv6NGjsW3bNqSlpcHLywsHDhxAly5deB96Iiqx4uPTYWKiD0PDV/8Ufv55a3TqVBONG1vJmIyIiApDvkd8T506henTp+PRo0fYvn07unbtyqaXiEqsY8fuoWnTAEyd+pdaXaFQsOklIiql8j3ie+XKlcLMQURUJLKylJg+/Sjmzz8NIYCFC0PQrVttdO7sIHc0IiIqZAW+uI2IqKSJiIjDgAE7ERYWLdU6drRHvXqWMqYiIqKiwsaXiEo9IQTWrAnF+PHBSE/PBgDo6+tg9uxOmDjRFTo6nLZFRFQWsPElolLt6dNUjBjxO/bujZBq9epVQmBgHzg62sqYjIiIihobXyIqtSIi4tChwybExKRINT+/lli4sCtMTPRlTEZERHIo0J3bTp48iUGDBsHFxQWPHj0CAGzZsgWnTp0qUIiVK1fC3t4eRkZGaNOmDc6fP5+v47Zt2waFQoGePXsW6LxEVLo5OFjAzs4MAGBpaYK9e/vjxx8/YNNLRFRGadz4/vbbb/Dw8ICxsTEuXryIzMxMAEBiYiLmzJmjcYDt27djwoQJmD59OsLCwtCsWTN4eHjgyZMnbzzu3r17+PLLL+Hm5qbxOYmobNDX18XWrb3Ru3cDhIf7wdOzntyRiIhIRho3vt999x0CAgKwdu1a6Ou/GjVp27YtwsLCNA6wePFijBw5EsOGDUPDhg0REBAAExMTrF+//rXHKJVKDBw4EDNnzoSDA5cgIiJApRJYtuwcLl6MVqvXqVMJv/3WDzY25WVKRkRExYXGjW9ERATee++9XHVzc3MkJCRo9FxZWVkIDQ2Fu7v7q0A6OnB3d0dISMhrj/v2229hZWWF4cOHv/UcmZmZSEpKUvsiotIlOjoZ3btvxRdfHMSAATuRlvZC7khERFQMadz42tjY4Pbt27nqp06d0nj0NS4uDkqlEtbW1mp1a2trxMTE5HnMqVOnsG7dOqxduzZf55g7dy7Mzc2lLzs7O40yElHxtmfPTTRtGoDg4DsAgJs34/DHH//InIqIiIojjRvfkSNH4osvvsC5c+egUCjw+PFjbN26FV9++SX8/PwKI6MkOTkZgwcPxtq1a2Fpmb8F5ydPnozExETpKyoqqlAzElHRSE3Ngq/vPvTsuR1xcWkAAFvb8ggOHoQ+fRrKnI6IiIojjZcz8/f3h0qlQufOnZGWlob33nsPhoaG+PLLL/H5559r9FyWlpbQ1dVFbGysWj02NhY2Nja59r9z5w7u3bsHT09PqaZSqXJeiJ4eIiIiUKtWLbVjDA0NYWhoqFEuIireQkMfY8CAnbh165lU69mzPtau9YSlpYmMyYiIqDjTuPFVKBSYMmUKvvrqK9y+fRspKSlo2LAhypfX/MIRAwMDODk54ciRI9KSZCqVCkeOHMGYMWNy7V+/fn2Eh4er1aZOnYrk5GQsXbqU0xiISjmlUoXvvz+Db745iuzsnF96TUz0sWSJB0aMcIRCwTuwERHR6xX4BhYGBgZo2PDd/5w4YcIEDB06FC1btkTr1q2xZMkSpKamYtiwYQCAIUOGoGrVqpg7dy6MjIzQuHFjteMrVKgAALnqRFT63LwZp9b0OjnZIjCwD+rWrSRzMiIiKgny1fj27t0730+4c+dOjQJ4e3vj6dOnmDZtGmJiYtC8eXMcPHhQuuDtwYMH0NEp0H02iKiUadTICrNmdcTXXx+Bv387zJjRAQYGunLHIiKiEkIhhBBv2+nl6CsACCGwa9cumJubo2XLlgCA0NBQJCQkoHfv3tiwYUPhpdWCpKQkmJubI3GbF8y8d8sdh4jeIDk5E8bG+tDTe/XLr1KpwsWLMWjZsoqMyYiIqDBJ/VpiIszMzLT2vPka8f13Mztp0iT069cPAQEB0NXNGWlRKpUYPXq0VoMRUdkWEhKFQYN2YfDgppgxo4NU19XVYdNLREQFkq8R33+rXLkyTp06hXr11G/9GRERAVdXVzx79uw1RxYPHPElKt6ys1WYPfsEZs06AaVSQEdHgZMnh8HVlRevEhGVFbKO+P5bdnY2bt68mavxvXnzprS0GBFRQURGxmPQoJ0ICXko1Zydq8HWlrcbJiKid6dx4zts2DAMHz4cd+7cQevWrQEA586dw7x589TmAhMR5ZcQAlu2XMGYMQeQnJwFANDVVWDatPb4+ms3tTm+REREBaVx47tw4ULY2Nhg0aJFiI6OBgDY2triq6++wsSJE7UekIhKt/j4dPj57cf27dekmoODBbZu7Q1n52oyJiMiotJG4zm+/5aUlAQAJeqiNs7xJSo+IiLi0KXLFkRFJUk1H5/mWLasG0xNecdFIqKyqtjM8f23ktTwElHxU6NGBVSoYISoqCRYWBhh9eoP0bdvI7ljERFRKcWJc0QkGyMjPQQG9kH37nVw5Yofm14iIipUbHyJqEgIIbBmTSiuX3+qVm/c2Ar79w9AtWr8CxIRERUuNr5EVOiePk1Fz57bMWrUPgwY8BsyM7PljkRERGUQG18iKlTBwbfRtGkA9u6NAABcvhyLfftuyZyKiIjKogJd3Jaamorjx4/jwYMHyMrKUts2duxYrQQjopItIyMb/v6HsXTpOalmaWmC9et7wNOz3huOJCIiKhwaN74XL15E9+7dkZaWhtTUVFSsWBFxcXEwMTGBlZUVG18iQnh4LAYM2ImrV59INQ+PWti4sSdsbHgXNiIikofGUx3Gjx8PT09PxMfHw9jYGGfPnsX9+/fh5OSEhQsXFkZGIiohVCqBpUvPolWrtVLTa2ioi6VLu+HAgYFseomISFYaN76XLl3CxIkToaOjA11dXWRmZsLOzg4LFizA119/XRgZiaiECA+PxYQJh5CZqQQANGlihQsXPsXYsW2go6OQOR0REZV1Gje++vr60NHJOczKygoPHjwAAJibmyMqKkq76YioRGnWzAZff90OADB+vDPOnx+Jxo2tZE5FRESUQ+M5vi1atMDff/+NOnXqoH379pg2bRri4uKwZcsWNG7cuDAyElExlZb2AkZGemqjudOmtUfXrrXg5lZDxmRERES5aTziO2fOHNja2gIAZs+eDQsLC/j5+eHp06dYvXq11gMSUfEUGvoYLVqsxqJFZ9Tq+vq6bHqJiKhYUgghhNwhilJSUhLMzc2RuM0LZt675Y5DVOIolSosXHgGU6ceRXa2Cvr6Ojh7dgQcHW3ljkZERKWE1K8lJsLMTHt39tR4xPfmzZuv3RYcHPxOYYioeIuKSkTnzpvh738E2dkqAEDTptYoX95A5mRERERvp3Hj6+joiJUrV6rVMjMzMWbMGHh5eWktGBEVL0FB19C0aQCOH78PAFAogMmT2+HMmeGoW7eSzOmIiIjeTuOL2zZu3Ag/Pz/s378fGzZsQHR0NAYMGACVSoWTJ08WRkYiklFSUibGjv0DmzZdlmp2dmbYsqUX2re3ly8YERGRhjQe8e3Xrx8uX76MFy9eoFGjRnBxcUH79u0RFhaGVq1aFUZGIpJJREQcWrRYrdb0ens3wpUrfmx6iYioxNF4xPelrKwsKJVKKJVK2NrawsjISJu5iKgYqFbNDHp6Ob8fm5oaYOXK7hg0qCkUCt6MgoiISh6NR3y3bduGJk2awNzcHLdu3cL+/fuxZs0auLm5ITIysjAyEpFMypUzQGBgb3ToYI/Ll30xeHAzNr1ERFRiadz4Dh8+HHPmzMHevXtRuXJldOnSBeHh4ahatSqaN29eCBGJqCgIIbB582XcufNcre7kVAV//TUENWtayJSMiIhIOzSe6hAWFoZ69eqp1SwsLBAUFIQtW7ZoLRgRFZ34+HT4+u5HUNA1tGlTFSdPDoO+vq60naO8RERUGmg84vvfpvffBg8e/E5hiKjoHTt2D02bBiAo6BoA4Ny5R9i375bMqYiIiLSvQBe3PXz4EHv37sWDBw+QlZWltm3x4sVaCUZEhSsrS4lp045iwYLTeHn/RgsLI6xZ44levRrIG46IiKgQaNz4HjlyBD169ICDgwNu3ryJxo0b4969exBCwNHRsTAyEpGWRUTEYcCAnQgLi5ZqHTvaY/PmXqhWTXu3hiQiIipONJ7qMHnyZHz55ZcIDw+HkZERfvvtN0RFRaF9+/bo27dvYWQkIi0RQmD16gto0WK11PTq6+tgwQJ3HD48hE0vERGVaho3vjdu3MCQIUMAAHp6ekhPT0f58uXx7bffYv78+VoPSETac/FiDHx99yM9PRsAUK9eJZw9OwJffdUWOjq8gI2IiEo3jRvfcuXKSfN6bW1tcefOHWlbXFyc9pIRkdY5OtpiwgRnAICfX0uEhY2Co6OtzKmIiIiKRr7n+H777beYOHEinJ2dcerUKTRo0ADdu3fHxIkTER4ejp07d8LZ2bkwsxKRhjIzs2FgoKu2HNmcOZ3RrVttdOlSS8ZkRERERU8hxMvrud9MV1cX0dHRSElJQUpKCpo2bYrU1FRMnDgRZ86cQZ06dbB48WLUqFGjsDO/k6SkJJibmyNxmxfMvHfLHYeo0ISHx2LAgJ3w82uJ0aNbyR2HiIgo36R+LTERZmbau/4k3yO+L/tjBwcHqVauXDkEBARoLQwRvTuVSmD58nOYNOkwMjOVmDjxEDp0sEfDhpXljkZERCQrjZYz492biIq36OhkDBu2B8HBr+be16lTUcZERERExYdGjW/dunXf2vw+f/78nQIRUcHs2XMTI0b8jri4NKk2frwz5szpDCOjAt2rhoiIqFTR6P+GM2fOhLm5eWFlIaICSE3NwsSJh7B6dahUs7Utj40be6JrV17ARkRE9JJGjW///v1hZWVVWFmISEO3bj2Dp+cvuHXrmVTr2bM+1q71hKWliYzJiIiIip98N76c30tU/Fhbl0NWlhIAYGKij6VLu2H48Bb8eSUiIspDvm9gkc9Vz4ioCJmbG+Hnn3uhTZuquHhxFEaMcGTTS0RE9Br5HvFVqVSFmYOI8mHHjmtwdq4GO7tXc+3btq2OkJDhbHiJiIjeQuNbFhNR0UtKyoSPz2706/crhgzZDaVS/RdRNr1ERERvx8aXqJgLCYlCixarsWnTZQDAsWP3sG/fLZlTERERlTxsfImKqexsFWbOPAY3tw2IjIwHAJiaGmDz5p7o0aOezOmIiIhKHq5qT1QMRUbGY9CgnQgJeSjVXF3t8PPPvVCzpoWMyYiIiEouNr5ExYgQAlu2XMGYMQeQnJwFANDVVWDatPb4+ms36OnxjzREREQFxcaXqBi5cOExhg7dLT12cLDA1q294excTb5QREREpQSHj4iKkVatqmLUKCcAgI9Pc1y6NIpNLxERkZZwxJdIRi9eKKGnp6O2HNmiRV3RvXsdXsBGRESkZRzxJZJJREQcnJ3XScuUvVSunAGbXiIiokLAxpeoiAkhsHr1BbRosRphYdH4/PM/cPv2c7ljERERlXqc6kBUhJ4+TcWIEb9j794IqVa1qinS01/ImIqIiKhsYONLVESCg2/Dx2cPYmJSpJqvrxMWLfKAiYm+jMmIiIjKBja+RIUsIyMbkycfxpIl56SapaUJ1q/vAU9PzuUlIiIqKmx8iQrR7dvP0bv3doSHP5Fq3brVxoYNXrCxKS9jMiIiorKHjS9RIbKwMMKzZ+kAAENDXXz/fReMGdNabfkyIiIiKhpc1YGoEFWqZIKNG73QrJk1Llz4FJ9/3oZNLxERkUw44kukRb//HoFWraqqTWPo0qUWQkNrQleXv2cSERHJif8nJtKC1NQs+PruQ48e2/DJJ3sghFDbzqaXiIhIfvy/MdE7Cg19DEfHNVi9OhQA8Mcft7Fv3y2ZUxEREdF/sfElKiClUoX580/B2Xkdbt16BgAwMdHH2rWe+PDDujKnIyIiov/iHF+iAoiKSsTgwbtw/Ph9qebkZIvAwD6oW7eSjMmIiIjoddj4Emlo+/ar8PXdj4SEDACAQgH4+7fDjBkdYGCgK3M6IiIieh02vkQaOHv2Ifr3/016bGdnhi1beqF9e3v5QhEREVG+cI4vkQacnath8OCmAABv70a4fNmXTS8REVEJwRFfojdQqQR0dNRvOLFiRXd88EEd9OvXiDejICIiKkE44kv0GpGR8WjXbj2Cgq6p1c3MDOHt3ZhNLxERUQnDEV+i/xBCYMuWKxgz5gCSk7Nw48Y+uLhUg52dudzRiIiI6B1wxJfoX+Lj09G//28YOnQ3kpOzAAAVKxrj2bN0mZMRERHRu+KIL9H/O3bsHgYP3oWHD5Okmo9Pcyxb1g2mpoYyJiMiIiJtYONLZV5WlhLTph3FggWnIUROrUIFI6xZ8yH69m0kbzgiIiLSGja+VKZFRsajb98dCAuLlmodOthj8+aenNNLRERUynCOL5VpxsZ6ePAgEQCgr6+DBQvcceTIEDa9REREpRAbXyrTbG1NsW5dD9Svb4mzZ0fgq6/a5lq3l4iIiEoHTnWgMuXw4Ui0aGGDSpVMpFqPHvXw/vu1oa+vK2MyIiIiKmzFYsR35cqVsLe3h5GREdq0aYPz58+/dt+1a9fCzc0NFhYWsLCwgLu7+xv3JwKAjIxsjB9/EF26bMGoUfsgXl7F9v/Y9BIREZV+sje+27dvx4QJEzB9+nSEhYWhWbNm8PDwwJMnT/Lc/9ixY/j4449x9OhRhISEwM7ODl27dsWjR4+KODmVFOHhsWjdei2WLDkHAPjttxs4ePC2zKmIiIioqCnEf4e+ilibNm3QqlUrrFixAgCgUqlgZ2eHzz//HP7+/m89XqlUwsLCAitWrMCQIUPeun9SUhLMzc2RuM0LZt673zU+FWMqlcDy5ecwadJhZGYqAQCGhrr4/vsuGDOmNW85TEREVExJ/VpiIszMzLT2vLLO8c3KykJoaCgmT54s1XR0dODu7o6QkJB8PUdaWhpevHiBihUr5rk9MzMTmZmZ0uOkpKQ896PSJTo6GcOG7UFw8B2p1qSJFQID+6BxYysZkxEREZFcZJ3qEBcXB6VSCWtra7W6tbU1YmJi8vUckyZNQpUqVeDu7p7n9rlz58Lc3Fz6srOze+fcVLzt3RuBpk0D1Jre8eOdcf78SDa9REREZZjsc3zfxbx587Bt2zbs2rULRkZGee4zefJkJCYmSl9RUVFFnJKK0unTD+DltQ1xcWkAABub8ggOHoTFiz1gZMRFTIiIiMoyWRtfS0tL6OrqIjY2Vq0eGxsLGxubNx67cOFCzJs3D4cOHULTpk1fu5+hoSHMzMzUvqj0cnW1Q69e9QEAXl71EB7uh65da8mcioiIiIoDWRtfAwMDODk54ciRI1JNpVLhyJEjcHFxee1xCxYswKxZs3Dw4EG0bNmyKKJSMfXfazMVCgXWrvXEhg1e2LXLG5aWJq85koiIiMoa2ac6TJgwAWvXrsWmTZtw48YN+Pn5ITU1FcOGDQMADBkyRO3it/nz5+Obb77B+vXrYW9vj5iYGMTExCAlJUWul0AyiYpKRKdOm7Fv3y21eqVKJvDxac5VG4iIiEiN7JMevb298fTpU0ybNg0xMTFo3rw5Dh48KF3w9uDBA+jovOrPV61ahaysLHz00UdqzzN9+nTMmDGjKKOTjIKCrmHUqH1ISMjAtWtPcOWKH2xsyssdi4iIiIox2dfxLWpcx7dkS0rKxNixf2DTpstSzc7ODLt394ejo62MyYiIiEhbSuU6vkSaCAmJwsCBO3H3boJU8/ZuhFWrPoCFhbF8wYiIiKhEYONLxV52tgrffXcC3313Akplzh8oTE0NsHJldwwa1JRzeYmIiChf2PhSsXbvXgIGDPgNISEPpZqrqx1+/rkXata0kDEZERERlTSyr+pA9CY6Ogpcv/4UAKCrq8DMmR1w/LgPm14iIiLSGBtfKtaqVzdHQMCHcHCwwKlTn2DatPbQ0+N/tkRERKQ5dhBUrJw8eR9JSZlqtf79G+PatdFwdq4mUyoiIiIqDdj4UrGQlaWEv/9htG+/EZ9//keu7UZGnI5ORERE74aNL8kuIiIOLi7rMH/+aQgBbN58GYcO3ZE7FhEREZUyHEYj2QghsGZNKMaPD0Z6ejYAQF9fB7Nnd4K7u4PM6YiIiKi0YeNLsnj6NBUjRvyOvXsjpFq9epUQGNiHd2AjIiKiQsHGl4pccPBt+PjsQUxMilTz82uJhQu7wsREX8ZkREREVJqx8aUidfLkfXTrtlV6bGlpgvXre8DTs56MqYiIiKgs4MVtVKTatauObt1qAwC6dauN8HA/Nr1ERERUJDjiS0VKoVBgwwYv7Np1A76+LaFQKOSORERERGUER3yp0MTEpOCDDwJx5EikWt3Gpjz8/Fqx6SUiIqIixRFfKhR790Zg+PC9iItLw+XLMbh82ReVKpnIHYuIiIjKMI74klalpmbB13cfvLy2IS4uDQCgUgncu5cgbzAiIiIq8zjiS1oTGvoYAwfuRETEM6nWs2d9rF3rCUtLjvYSERGRvNj40jtTKlVYuPAMpk49iuxsFQDAxEQfS5d2w/DhLTiXl4iIiIoFNr70Th4+TMLgwbtw7Ng9qebkZIvAwD6oW7eSfMGIiIiI/oNzfOmdpKe/wN9/PwIAKBTA5MntcObMcDa9REREVOyw8aV3UqdOJSxb9j7s7Mxw9OhQzJnTGQYGunLHIiIiIsqFjS9p5Pz5R0hLe6FWGzasOa5f/wzt29vLE4qIiIgoH9j4Ur5kZ6swc+YxuLquw5dfHlLbplAoUL68gUzJiIiIiPKHjS+9VWRkPN57bwNmzDgOpVJg1aoLOHr0rtyxiIiIiDTCVR3otYQQ2LLlCsaMOYDk5CwAgK6uAtOmtYebWw2Z0xERERFpho0v5Sk+Ph1+fvuxffs1qebgYIGtW3vD2bmajMmIiIiICoaNL+Vy/Pg9DB68C1FRSVLNx6c5li3rBlNTQxmTERERERUcG19Sc/z4PXTsuAlC5Dy2sDDC6tUfom/fRvIGIyIiInpHvLiN1LRrVx3vvZczf7djR3tcueLHppeIiIhKBY74khpdXR1s2dILO3Zcx7hxztDRUcgdiYiIiEgrOOJbhj19moo+fYJw+vQDtbqdnTkmTHBh00tERESlCkd8y6jg4Nvw8dmDmJgUhIVF4/JlX5iZ8cI1IiIiKr044lvGZGRkY9y4g+jWbStiYlIAACkpWbh165nMyYiIiIgKF0d8y5Dw8FgMGLATV68+kWrdutXGhg1esLEpL2MyIiIiosLHxrcMUKkEli8/h0mTDiMzUwkAMDTUxfffd8GYMa2hUHAuLxEREZV+bHxLuejoZAwbtgfBwXekWpMmVggM7IPGja1kTEZERERUtDjHt5R7/jwdx47dkx6PH++M8+dHsuklIiKiMoeNbynXqJEVvv++C2xsyiM4eBAWL/aAkREH+omIiKjsYeNbyly+HIPMzGy12pgxrXH9+mh07VpLplRERERE8mPjW0oolSrMn38KLVuuxZQpf6ltUygUsLAwlikZERERUfHAxrcUiIpKROfOm+HvfwTZ2SosWhSCU6cevP1AIiIiojKEkz1LuKCgaxg1ah8SEjIAAAoF4O/fDq1bV5U5GREREVHxwsa3hEpKysTYsX9g06bLUs3OzgxbtvRC+/b28gUjIiIiKqbY+JZAISFRGDRoFyIj46Wat3cjrFr1AefyEhEREb0GG98S5tixe3B33wylUgAATE0NsHJldwwa1JR3YCMiIiJ6A17cVsK0bWsHJ6cqAABXVztcvuyLwYObseklIiIieguO+JYw+vq62Lq1N7Zvv4pJk9pBT4+/uxARERHlBxvfYiw+Ph1jxvyBCROcpVFeAKhduyKmTHlPxmRERKWXUqnEixcv5I5BVOrp6+tDV1e3SM/JxreYOnbsHgYP3oWHD5MQGvoYYWGjYGKiL3csIqJSLSUlBQ8fPoQQQu4oRKWeQqFAtWrVUL58+SI7JxvfYiYrS4lp045iwYLTePnv7pMnqbh27QlateLavEREhUWpVOLhw4cwMTFB5cqVee0EUSESQuDp06d4+PAh6tSpU2Qjv2x8i5GIiDgMGLATYWHRUq1jR3ts3twL1aqZyZiMiKj0e/HiBYQQqFy5MoyNuTQkUWGrXLky7t27hxcvXrDxLUuEEFizJhTjxwcjPT0bAKCvr4PZszth4kRX6Ohw1IGIqKhwpJeoaMjxs8bGV2ZPn6ZixIjfsXdvhFSrV68SAgP7wNHRVsZkRERERKULG1+ZRUUl4cCBf6THfn4tsXBhV17IRkRERKRlXARWZo6Otvjuu46wtDTB3r398eOPH7DpJSIiKkJZWVmoXbs2zpw5I3eUUiMgIACenp5yx8iFjW8Ru3kzDi9eKNVqX37pimvXRsPTs55MqYiIqCSLiYnB559/DgcHBxgaGsLOzg6enp44cuSI3NHydO/ePSgUCumrYsWKaN++PU6ePJlr3+fPn2PcuHGoUaMGDAwMUKVKFXzyySd48OBBrn0L+j4EBASgZs2acHV1zbVt1KhR0NXVxY4dO3Jt8/HxQc+ePXPVjx07BoVCgYSEBKmWlZWFBQsWoFmzZjAxMYGlpSXatm2LDRs2FOq60VeuXIGbmxuMjIxgZ2eHBQsWvPWYI0eOwNXVFaamprCxscGkSZOQnZ2ttk9wcDCcnZ1hamqKypUro0+fPrh37560/ZNPPkFYWFien6mc2PgWEZVKYOnSs2jePADffXdCbZuurg6srMrJlIyIiEqye/fuwcnJCX/99Re+//57hIeH4+DBg+jYsSM+++yzAj+vECJXs6Nthw8fRnR0NE6cOIEqVargww8/RGxsrLT9+fPncHZ2xuHDhxEQEIDbt29j27ZtuH37Nlq1aoXIyEhp34K+D0IIrFixAsOHD8+1LS0tDdu2bcP//vc/rF+/vsCvMysrCx4eHpg3bx4+/fRTnDlzBufPn8dnn32G5cuX49q1awV+7jdJSkpC165dUaNGDYSGhuL777/HjBkzsGbNmtcec/nyZXTv3h3dunXDxYsXsX37duzduxf+/v7SPnfv3oWXlxc6deqES5cuITg4GHFxcejdu7e0j4GBAQYMGIBly5YVymsrMFHGJCYmCgAicZtXkZ3z8eMk4eGxRQAzBDBD6OjMFOfOPSyy8xMR0dulp6eL69evi/T0dLmjaOT9998XVatWFSkpKbm2xcfHCyGEuHv3rgAgLl68qLYNgDh69KgQQoijR48KAOLAgQPC0dFR6Ovri9WrVwsA4saNG2rPu3jxYuHg4CCEECI7O1t88sknwt7eXhgZGYm6deuKJUuWvDFzXnmuXLkiAIg9e/ZINV9fX1GuXDkRHR2tdnxaWpqoWrWq6Natm0bvQ17+/vtvoaOjI5KSknJt27hxo3B2dhYJCQnCxMREPHjwQG370KFDhZeXV67jXr6XL887f/58oaOjI8LCwnLtm5WVlWdmbfjxxx+FhYWFyMzMlGqTJk0S9erVe+0xkydPFi1btlSr7d27VxgZGUnv0Y4dO4Senp5QKpVq+ygUCpGVlSXVjh8/LgwMDERaWlqe53rTz5zUryUm5u/F5hMvbitke/bcxIgRvyMuLk2qjR3bGk2bWsuYioiI8uXnlkBqTNGft5wNMOjCW3d7/vw5Dh48iNmzZ6Ncudx/OaxQoYLGp/b398fChQvh4OAACwsLrF27Flu3bsWsWbOkfbZu3YoBAwYAAFQqFapVq4YdO3agUqVKOHPmDD799FPY2tqiX79++Tpneno6Nm/eDCBnpPDl827btg0DBw6EjY2N2v7GxsYYPXo0pk6diufPnwNAgd+HkydPom7dujA1Nc21bd26dRg0aBDMzc3x/vvvY+PGjfjmm2/y9Zr+bevWrXB3d0eLFi1ybdPX14e+ft7X9jx48AANGzZ843N//fXX+Prrr/PcFhISgvfee096TwHAw8MD8+fPR3x8PCwsLHIdk5mZCSMjI7WasbExMjIyEBoaig4dOsDJyQk6OjrYsGEDfHx8kJKSgi1btsDd3V3ttbRs2RLZ2dk4d+4cOnTo8MbXUVTY+BaS1NQsTJx4CKtXh0o1G5vy2LSpJ7p2rSVjMiIiyrfUGCDlkdwpXuv27dsQQqB+/fpae85vv/0WXbp0kR4PHDgQK1askBrfW7duITQ0FD///DOAnMZt5syZ0v41a9ZESEgIgoKC3tr4urq6QkdHB2lpaRBCwMnJCZ07dwYAPH36FAkJCWjQoEGexzZo0ABCCNy+fRsACvw+3L9/H1WqVMlV/+eff3D27Fns3LkTADBo0CBMmDABU6dO1Xj92X/++adAjV+VKlVw6dKlN+5TsWLF126LiYlBzZo11WrW1tbStrwaXw8PDyxZsgS//PIL+vXrh5iYGHz77bcAgOjonBts1axZE4cOHUK/fv0watQoKJVKuLi44MCBA2rPZWJiAnNzc9y/f/+tr7WosPEtBKGhjzFgwE7cuvVMqnl51cNPP/WApaWJjMmIiEgj5Wzevo+M5xUv722vRS1btlR73L9/f3z55Zc4e/YsnJ2dsXXrVjg6Oqo1mStXrsT69evx4MEDpKenIysrC82bN3/rubZv34769evj6tWr+N///oeNGzfmGv3Mz2t8l/chPT091wgnAKxfvx4eHh6wtLQEAHTv3h3Dhw/HX3/9JTXn+VXQfHp6eqhdu3aBji2orl274vvvv4evry8GDx4MQ0NDfPPNNzh58iR0dHIuDYuJicHIkSMxdOhQfPzxx0hOTsa0adPw0Ucf4c8//1T7xcDY2BhpaWmvO12RY+OrZX/9dRceHj8jO1sFADAx0ceSJR4YMcKRdwMiIipp8jHdQE516tSBQqHAzZs337jfy4bl3w3Y61YS+O9UARsbG3Tq1AmBgYFwdnZGYGAg/Pz8pO3btm3Dl19+iUWLFsHFxQWmpqb4/vvvce7cubfmt7OzQ506dVCnTh1kZ2ejV69euHr1KgwNDVG5cmVUqFABN27cyPPYGzduQKFQSI1hft6HvFhaWiI8PFytplQqsWnTJsTExEBPT0+tvn79eqnxNTMzy3M0MyEhAbq6utJ7Wbdu3QJle9epDjY2NmoXCwKQHv93+si/TZgwAePHj0d0dDQsLCxw7949TJ48GQ4ODgByftExNzdXWyHi559/hp2dHc6dOwdnZ2ep/vz5c1SuXPnNL7QIcVUHLWvb1g4NG+Z8wE5Otrh4cRRGjnRi00tERFpXsWJFeHh4YOXKlUhNTc21/eVyWi8bj5d/qgbw1j+h/9vAgQOxfft2hISEIDIyEv3795e2nT59Gq6urhg9ejRatGiB2rVr486dOxq/lo8++gh6enr48ccfAeQ06/369UNgYCBiYtTnWaenp+PHH3+Eh4cHKlasmO/3IS8tWrTAzZs31X4pOHDgAJKTk3Hx4kVcunRJ+vrll1+wc+dO6fnq1auHa9euITMzU+05w8LCULNmTWn0esCAATh8+DAuXryY6/wvXrzIMzPwaqrDm758fX1f+9pcXFxw4sQJtV9y/vzzT9SrVy/PaQ7/plAoUKVKFRgbG+OXX36BnZ0dHB0dAeSsdvHyl6mXdHV1AeTMzX7pzp07yMjIyHNus2y0eqlcCVAUqzpcvRorpkw5IjIzswvtHEREpF0ldVWHO3fuCBsbG9GwYUPx66+/ilu3bonr16+LpUuXivr160v7OTs7Czc3N3H9+nVx7Ngx0bp16zxXdchrBYSkpCRhbGwsmjVrJjp37qy2benSpcLMzEwcPHhQREREiKlTpwozMzPRrFmz12bOa1UHIXJWIbCyshKpqalCCCHi4uJErVq1ROPGjcWBAwfEgwcPxPHjx4Wbm5uwsrISd+7c0fh9+K+4uDihr68vwsPDpZqXl5fw9vbOta9SqRQ2NjZixYoVQoic1SKsrKxEv379xIULF8Q///wj1q1bJ0xNTcWqVauk4zIyMoSbm5uwsLAQK1asEJcuXRJ37twR27dvF46OjrneB21JSEgQ1tbWYvDgweLq1ati27ZtwsTERKxevVraZ+fOnblWeViwYIG4cuWKuHr1qvj222+Fvr6+2LVrl7T9yJEjQqFQiJkzZ4pbt26J0NBQ4eHhIWrUqKG2gsOGDRuk1T/yIseqDmx83+m5MsSIEXvE1aux7x6MiIhkVVIbXyGEePz4sfjss89EjRo1hIGBgahataro0aOH1NQKIcT169eFi4uLMDY2Fs2bNxeHDh3Kd+MrhBD9+vUTAMT69evV6hkZGcLHx0eYm5uLChUqCD8/P+Hv71+gxjc1NVVYWFiI+fPnS7WnT5+Kzz//XNjZ2Ql9fX1hbW0tfHx8xP379wv0Przutfn7+wshhIiJiRF6enoiKCgoz339/PxEixYtpMcRERGiV69eokqVKqJcuXKiWbNmYu3atUKlUuV6n+bOnSuaNGkijIyMRMWKFUXbtm3Fxo0bxYsXL96Y711cvnxZtGvXThgaGoqqVauKefPmqW3fsGGD+O84aMeOHYW5ubkwMjISbdq0EQcOHMj1vL/88oto0aKFKFeunKhcubLo0aNHrmXvunbtKubOnfvabHI0vgohCmFmfDGWlJQEc3NzJG7zgpn37gI/T0hIFAYN2oXIyHg0bWqN8+dHwNCQU6aJiEqqjIwM3L17FzVr1szzYicqva5cuYIuXbrgzp07KF++vNxxSoVr166hU6dOuHXrFszNzfPc500/c1K/lpgIMzMzreXiHF8NZWerMHPmMbi5bUBkZDwA4O7deFy5EvuWI4mIiKg4atq0KebPn4+7d+/KHaXUiI6OxubNm1/b9MqFQ5QaiIyMx6BBOxES8lCqubra4eefe6FmzTdPEiciIqLiy8fHR+4IpYq7u7vcEfLExjcfhBDYsuUKxow5gOTkLACArq4C06a1x9dfu0FPjwPnRERERMUdG9+3iI9Ph5/ffmzffk2qOThYYOvW3nB2riZjMiIiIiLSBBvft7hxIw47dlyXHvv4NMeyZd1gamooYyoiIiosZeyabyLZyPGzxr/Rv4Wrqx2mTHFDhQpGCAr6CBs2eLHpJSIqhV4uwJ+VlSVzEqKy4eXP2sufvaLAEd//uHs3HtWrm0NX99XvBN988x5GjXJC1araW06DiIiKFz09PZiYmODp06fQ19fPdWcqItIelUqFp0+fwsTERO220IWNje//E0JgzZpQjB8fjOnT22PSpHbSNn19XTa9RESlnEKhgK2tLe7evYv79+/LHYeo1NPR0UH16tWhUCiK7JxsfAE8fZqKESN+x969EQCAqVOPomvXWmjRwlbmZEREVJQMDAxQp04dTncgKgIGBgZF/peVMt/4Bgffho/PHsTEpEi1ESNaoF49SxlTERGRXHR0dHjnNqJSqlhMYFq5ciXs7e1hZGSENm3a4Pz582/cf8eOHahfvz6MjIzQpEkTHDhwQONzZmQpMG7cQXTrtlVqei0tTbB3b3+sWvUhTEz0C/RaiIiIiKh4kr3x3b59OyZMmIDp06cjLCwMzZo1g4eHB548eZLn/mfOnMHHH3+M4cOH4+LFi+jZsyd69uyJq1evanTeDlNqYunSc9Ljbt1qIzzcD56e9d7p9RARERFR8aQQMi9Y2KZNG7Rq1QorVqwAkHOVn52dHT7//HP4+/vn2t/b2xupqanYt2+fVHN2dkbz5s0REBDw1vMlJSX9/32j/QEYwdBQF99/3wVjxrQu0snVRERERJS3l/1aYmIizMy0t8CArHN8s7KyEBoaismTJ0s1HR0duLu7IyQkJM9jQkJCMGHCBLWah4cHdu/enef+mZmZyMzMlB4nJia+3IKGDStj3TovNGxYGcnJye/0WoiIiIhIO5KSkgBo/yYXsja+cXFxUCqVsLa2VqtbW1vj5s2beR4TExOT5/4xMTF57j937lzMnDkzjy0/4Pp1wMVlYoGyExEREVHhevbs2f//pV47Sv2qDpMnT1YbIU5ISECNGjXw4MEDrb6RVDwlJSXBzs4OUVFRWv1TCRVP/LzLFn7eZQs/77IlMTER1atXR8WKFbX6vLI2vpaWltDV1UVsbKxaPTY2FjY2NnkeY2Njo9H+hoaGMDTMfYthc3Nz/uCUIWZmZvy8yxB+3mULP++yhZ932aLtdX5lXdXBwMAATk5OOHLkiFRTqVQ4cuQIXFxc8jzGxcVFbX8A+PPPP1+7PxERERERUAymOkyYMAFDhw5Fy5Yt0bp1ayxZsgSpqakYNmwYAGDIkCGoWrUq5s6dCwD44osv0L59eyxatAgffPABtm3bhgsXLmDNmjVyvgwiIiIiKuZkb3y9vb3x9OlTTJs2DTExMWjevDkOHjwoXcD24MEDtWFuV1dXBAYGYurUqfj6669Rp04d7N69G40bN87X+QwNDTF9+vQ8pz9Q6cPPu2zh51228PMuW/h5ly2F9XnLvo4vEREREVFRkP3ObURERERERYGNLxERERGVCWx8iYiIiKhMYONLRERERGVCqWx8V65cCXt7exgZGaFNmzY4f/78G/ffsWMH6tevDyMjIzRp0gQHDhwooqSkDZp83mvXroWbmxssLCxgYWEBd3f3t/73QcWLpj/fL23btg0KhQI9e/Ys3ICkVZp+3gkJCfjss89ga2sLQ0ND1K1bl/+mlyCaft5LlixBvXr1YGxsDDs7O4wfPx4ZGRlFlJbexYkTJ+Dp6YkqVapAoVBg9+7dbz3m2LFjcHR0hKGhIWrXro2NGzdqfmJRymzbtk0YGBiI9evXi2vXromRI0eKChUqiNjY2Dz3P336tNDV1RULFiwQ169fF1OnThX6+voiPDy8iJNTQWj6eQ8YMECsXLlSXLx4Udy4cUP4+PgIc3Nz8fDhwyJOTgWh6ef90t27d0XVqlWFm5ub8PLyKpqw9M40/bwzMzNFy5YtRffu3cWpU6fE3bt3xbFjx8SlS5eKODkVhKaf99atW4WhoaHYunWruHv3rggODha2trZi/PjxRZycCuLAgQNiypQpYufOnQKA2LVr1xv3j4yMFCYmJmLChAni+vXrYvny5UJXV1ccPHhQo/OWusa3devW4rPPPpMeK5VKUaVKFTF37tw89+/Xr5/44IMP1Gpt2rQRo0aNKtScpB2aft7/lZ2dLUxNTcWmTZsKKyJpUUE+7+zsbOHq6ip++uknMXToUDa+JYimn/eqVauEg4ODyMrKKqqIpEWaft6fffaZ6NSpk1ptwoQJom3btoWak7QvP43v//73P9GoUSO1mre3t/Dw8NDoXKVqqkNWVhZCQ0Ph7u4u1XR0dODu7o6QkJA8jwkJCVHbHwA8PDxeuz8VHwX5vP8rLS0NL168QMWKFQsrJmlJQT/vb7/9FlZWVhg+fHhRxCQtKcjnvXfvXri4uOCzzz6DtbU1GjdujDlz5kCpVBZVbCqggnzerq6uCA0NlaZDREZG4sCBA+jevXuRZKaipa1+TfY7t2lTXFwclEqldNe3l6ytrXHz5s08j4mJiclz/5iYmELLSdpRkM/7vyZNmoQqVark+mGi4qcgn/epU6ewbt06XLp0qQgSkjYV5POOjIzEX3/9hYEDB+LAgQO4ffs2Ro8ejRcvXmD69OlFEZsKqCCf94ABAxAXF4d27dpBCIHs7Gz4+vri66+/LorIVMRe168lJSUhPT0dxsbG+XqeUjXiS6SJefPmYdu2bdi1axeMjIzkjkNalpycjMGDB2Pt2rWwtLSUOw4VAZVKBSsrK6xZswZOTk7w9vbGlClTEBAQIHc0KgTHjh3DnDlz8OOPPyIsLAw7d+7E/v37MWvWLLmjUTFWqkZ8LS0toauri9jYWLV6bGwsbGxs8jzGxsZGo/2p+CjI5/3SwoULMW/ePBw+fBhNmzYtzJikJZp+3nfu3MG9e/fg6ekp1VQqFQBAT08PERERqFWrVuGGpgIryM+3ra0t9PX1oaurK9UaNGiAmJgYZGVlwcDAoFAzU8EV5PP+5ptvMHjwYIwYMQIA0KRJE6SmpuLTTz/FlClToKPDsb3S5HX9mpmZWb5He4FSNuJrYGAAJycnHDlyRKqpVCocOXIELi4ueR7j4uKitj8A/Pnnn6/dn4qPgnzeALBgwQLMmjULBw8eRMuWLYsiKmmBpp93/fr1ER4ejkuXLklfPXr0QMeOHXHp0iXY2dkVZXzSUEF+vtu2bYvbt29Lv+AAwK1bt2Bra8umt5gryOedlpaWq7l9+UtPzvVSVJporV/T7Lq74m/btm3C0NBQbNy4UVy/fl18+umnokKFCiImJkYIIcTgwYOFv7+/tP/p06eFnp6eWLhwobhx44aYPn06lzMrQTT9vOfNmycMDAzEr7/+KqKjo6Wv5ORkuV4CaUDTz/u/uKpDyaLp5/3gwQNhamoqxowZIyIiIsS+ffuElZWV+O677+R6CaQBTT/v6dOnC1NTU/HLL7+IyMhIcejQIVGrVi3Rr18/uV4CaSA5OVlcvHhRXLx4UQAQixcvFhcvXhT3798XQgjh7+8vBg8eLO3/cjmzr776Sty4cUOsXLmSy5m9tHz5clG9enVhYGAgWrduLc6ePStta9++vRg6dKja/kFBQaJu3brCwMBANGrUSOzfv7+IE9O70OTzrlGjhgCQ62v69OlFH5wKRNOf739j41vyaPp5nzlzRrRp00YYGhoKBwcHMXv2bJGdnV3EqamgNPm8X7x4IWbMmCFq1aoljIyMhJ2dnRg9erSIj48v+uCksaNHj+b5/+OXn/HQoUNF+/btcx3TvHlzYWBgIBwcHMSGDRs0Pq9CCP49gIiIiIhKv1I1x5eIiIiI6HXY+BIRERFRmcDGl4iIiIjKBDa+RERERFQmsPElIiIiojKBjS8RERERlQlsfImIiIioTGDjS0RERERlAhtfIqJ88PHxQc+ePWU7/4wZM9C8eXPZzl+YFAoFdu/e/cZ95H7/iah0YONLRLJSKBRv/JoxY4bcEbWmQ4cOeb7G7OxsuaO90caNG6WsOjo6qFatGoYNG4YnT55o5fmjo6Px/vvvAwDu3bsHhUKBS5cuqe2zdOlSbNy4USvnI6KyS0/uAERUtkVHR0vfb9++HdOmTUNERIRUK1++vByxCs3IkSPx7bffqtX09Ir/P8VmZmaIiIiASqXC5cuXMWzYMDx+/BjBwcHv/Nw2NjZv3cfc3Pydz0NExBFfIpKVjY2N9GVubg6FQiE9Tk1NxcCBA2FtbY3y5cujVatWOHz4sHTszZs3YWJigsDAQKkWFBQEY2NjXL9+HQDw999/o0uXLrC0tIS5uTnat2+PsLCwN2ZSKpWYMGECKlSogEqVKuF///sfhBBq+6hUKsydOxc1a9aEsbExmjVrhl9//fWtr9fExETtNb9s+iZNmoS6devCxMQEDg4O+Oabb/DixYvXPs+xY8fQunVrlCtXDhUqVEDbtm1x//59afuqVatQq1YtGBgYoF69etiyZYu0TQiBGTNmoHr16jA0NESVKlUwduzYN+Z++blUqVIF77//PsaOHYvDhw8jPT0dKpUK3377LapVqwZDQ0M0b94cBw8elI7NysrCmDFjYGtrCyMjI9SoUQNz585Ve+6XUx1q1qwJAGjRogUUCgU6dOgA4P/aufeQpv43DuBvRzOnc0pXtxqGuamVmLYwspKuxmpaUVlMdBmWCCmW/hF2g+juJbtRCmnWKAtdZFaE0VWtIF12ETUxLLKgJEszTfd8/wgPLZvVl1/fX+XzgvPHOedzec7n/PNw+DzHeqtDVlYWFAoFLBaLVYxhYWGIjo7+ZWvAGPvzceLLGPtttba2QqvV4sqVK6isrMTcuXOh0+nQ2NgIAPD29kZqairi4uLQ2NiI58+fIzY2Frt27cKYMWMAAO/fv0dUVBRu3bqF27dvQ6VSQavV4v379zbnTUtLQ25uLo4ePYpbt26hubkZJpPJqs2OHTuQl5eHw4cP49GjR0hMTERERASuX7/+r57V2dkZubm5ePz4MTIzM5GdnY2MjIxvtu3q6sKCBQsQHByMqqoqlJeXY9WqVbCzswMAmEwmJCQkYN26dXj48CFWr16NFStW4OrVqwCAgoICZGRk4MiRI6irq8PZs2fh6+v7U/FKJBJYLBZ0dXUhMzMTaWlpSE1NRVVVFUJCQhAaGoq6ujoAwL59+3Du3DmcPn0aNTU1MBqNGDVq1DfHvXv3LgCgpKQETU1NKCws7NVmyZIlePPmjfA8ANDc3IxLly5Br9f/Z2vAGPsDEWOM/SZycnLIxcWlzzZjx46l/fv3W12bN28eTZ06lWbOnElz5swhi8Vis393dzc5OztTUVGRzTZyuZx2794tnH/69IlGjhxJYWFhRET08eNHcnR0pLKyMqt+K1eupOXLl9scNzg4mMRiMTk5OQnH2rVrv9l2z549NGHCBOF88+bN5OfnR0REb968IQB07dq1b/adPHkyxcTEWF1bsmQJabVaIiJKS0sjtVpNnZ2dNmP90tfvpba2ltRqNWk0GiIiUigUtG3bNqs+EydOpLi4OCIiWrNmDc2YMcPmewFAJpOJiIgaGhoIAFVWVlq1iYqKEtafiCgsLIyio6OF8yNHjpBCoaDu7u5fsgaMsb8Df/FljP22WltbkZSUBB8fH7i6ukIqlaK6ulr44tvj6NGjqKqqQkVFhVCI1ePVq1eIiYmBSqWCi4sLZDIZWltbe43Ro6WlBU1NTQgMDBSuDRgwABqNRjh/8uQJPnz4gNmzZ0MqlQpHXl4e6uvr+3wmvV4Ps9ksHOvXrwfweX9zUFAQ3NzcIJVKsWHDBpsxDho0CAaDASEhIdDpdMjMzLTaK11dXY2goCCrPkFBQaiurgbw+Ytpe3s7PDw8EBMTA5PJ9N0Cu5aWFkilUjg6OsLLywvDhw+H0WjEu3fv8OLFiz7nMxgMMJvN8PLyQnx8PC5fvtznXD9Cr9ejoKAAHR0dAACj0Yhly5ZBJBL9sjVgjP35OPFljP22kpKSYDKZsH37dty8eRNmsxm+vr7o7Oy0anf//n20tbWhra3NKgEEgKioKJjNZmRmZqKsrAxmsxmDBw/uNcbPaG1tBQAUFxdbJbGPHz/+7j5fFxcXeHp6CseQIUNQXl4OvV4PrVaL8+fPo7KyEikpKX3GmJOTg/LyckyePBn5+flQq9W4ffv2D8WvVCpRU1ODQ4cOQSKRIC4uDtOmTetzT7GzszPMZjMePnyItrY23LhxA2q1+ofmCwgIQENDA7Zu3Yr29nYsXboUixcv/qG+tuh0OhARiouL8ezZM9y8eVPY5vAj/s0aMMb+fJz4MsZ+W6WlpTAYDFi4cCF8fX3h5uaGp0+fWrVpbm6GwWBASkoKDAYD9Ho92tvbrcaIj4+HVqvF2LFjMXDgQLx+/drmnC4uLpDL5bhz545wraurC/fu3RPOx4wZg4EDB6KxsdEqifX09IRSqfzp5ywrK4O7uztSUlKg0WigUqmsCtVs8ff3x/r161FWVoZx48YJRX4+Pj4oLS21altaWirsewY+79HV6XTYt28frl27hvLycjx48MDmXCKRCJ6envDw8IBEIhGuy2QyKBSK784nk8kQHh6O7Oxs5Ofno6CgAM3Nzb3msbe3B/C5wLAvDg4OWLRoEYxGI06ePAkvLy8EBAQI93/FGjDG/ny//z90GGP9lkqlQmFhIXQ6Hezs7LBx48ZelfyxsbFQKpXYsGEDOjo64O/vj6SkJBw8eFAY4/jx49BoNHj37h2Sk5OtErdvSUhIwM6dO6FSqeDt7Y309HS8fftWuO/s7IykpCQkJibCYrFgypQpaGlpQWlpKWQyGaKion76ORsbG3Hq1ClMnDgRxcXFvYrpvtTQ0ICsrCyEhoZCoVCgpqYGdXV1iIyMBAAkJydj6dKl8Pf3x6xZs1BUVITCwkLhjxi5ubno7u5GYGAgHB0dceLECUgkEri7u/9U3D2Sk5OxefNmjB49GuPHj0dOTg7MZjOMRiMAID09HXK5HP7+/hCJRDhz5gzc3Nzg6uraa6xhw4ZBIpHg0qVLGDlyJBwcHGz+ykyv12P+/Pl49OgRIiIiesX0X64BY+wP8f/eZMwYYz2+LqJqaGig6dOnk0QiIaVSSQcOHKDg4GBKSEggIqJjx46Rk5MT1dbWCn3u3LlDYrGYLly4QEREFRUVpNFoyMHBgVQqFZ05c4bc3d0pIyPDZhyfPn2ihIQEkslk5OrqSmvXrqXIyEir4iqLxUJ79+4lLy8vEovFNHToUAoJCaHr16/bHPfL2L+WnJxMgwcPJqlUSuHh4ZSRkWG1Fl8Wt718+ZIWLFhAcrmc7O3tyd3dnTZt2iQUdhERHTp0iDw8PEgsFpNaraa8vDzhnslkosDAQJLJZOTk5ESTJk2ikpISm3F/r+iwu7ubtmzZQiNGjCCxWEx+fn508eJF4X5WVhaNHz+enJycSCaT0cyZM6miokK4jy+K24iIsrOzSalUkkgkouDgYCLqXdzWM69cLicAVF9f3yuu/+UaMMb+DnZEX/2ckjHGGGOMsb8Q7/FljDHGGGP9Aie+jDHGGGOsX+DElzHGGGOM9Quc+DLGGGOMsX6BE1/GGGOMMdYvcOLLGGOMMcb6BU58GWOMMcZYv8CJL2OMMcYY6xc48WWMMcYYY/0CJ76MMcYYY6xf4MSXMcYYY4z1C/8ABmhXIz77o20AAAAASUVORK5CYII=\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from sklearn.metrics import average_precision_score, roc_auc_score, balanced_accuracy_score, accuracy_score\n", | |
"\n", | |
"# Classification Report\n", | |
"print(\"Classification Report (Test):\")\n", | |
"print(classification_report(y_test, y_pred_test, target_names=[\"zero 0\",\"um 1\"]))\n", | |
"\n", | |
"# Calcular acurácia e acurácia balanceada\n", | |
"accuracy_score = accuracy_score(y_test, y_pred_test)\n", | |
"balanced_accuracy_score = balanced_accuracy_score(y_test, y_pred_test)\n", | |
"print(f\"Accuracy: {accuracy_score:0.2f}\")\n", | |
"print(f\"Balanced Accuracy: {balanced_accuracy_score:0.2f}\")\n", | |
"\n", | |
"# Calcular a average precision\n", | |
"average_precision = average_precision_score(y_test, y_prob_test)\n", | |
"print(f\"Average Precision: {average_precision:0.2f}\")\n", | |
"\n", | |
"# Calcular o Gini\n", | |
"roc_auc = roc_auc_score(y_test, y_prob_test)\n", | |
"def gini_score(roc_auc):\n", | |
" return (2 * roc_auc) - 1\n", | |
"gini = gini_score(roc_auc)\n", | |
"print(f\"roc_auc: {roc_auc:0.2f}\")\n", | |
"print(f\"Gini: {gini:0.2f}\")\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "aVZA-AjVXq9J", | |
"outputId": "2b0bc734-5010-43b4-e01b-9589bceb5b0f" | |
}, | |
"execution_count": 67, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Classification Report (Test):\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 0.91 0.88 0.90 102\n", | |
" um 1 0.88 0.91 0.89 98\n", | |
"\n", | |
" accuracy 0.90 200\n", | |
" macro avg 0.90 0.90 0.89 200\n", | |
"weighted avg 0.90 0.90 0.90 200\n", | |
"\n", | |
"Accuracy: 0.90\n", | |
"Balanced Accuracy: 0.90\n", | |
"Average Precision: 0.97\n", | |
"roc_auc: 0.97\n", | |
"Gini: 0.94\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# K-Fold" | |
], | |
"metadata": { | |
"id": "42LlENcAXnnl" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# prompt: Usando o sklearn - crie um dataset de classificação;treine um classificador random forest utilizando validação k-fold com K=5\n", | |
"\n", | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"from sklearn.datasets import make_classification\n", | |
"from sklearn.model_selection import KFold, cross_val_score\n", | |
"from sklearn.ensemble import RandomForestClassifier\n", | |
"\n", | |
"# Inicializando o classificador Random Forest\n", | |
"rf_classifier_2 = RandomForestClassifier(random_state=42)\n", | |
"\n", | |
"# Definindo o KFold com k=5\n", | |
"kf = KFold(n_splits=5, shuffle=True, random_state=42)\n", | |
"\n", | |
"# Realizando a validação cruzada e calculando as pontuações de acurácia\n", | |
"scores = cross_val_score(rf_classifier_2, X_train_val, y_train_val, cv=kf, scoring='accuracy', verbose=1)\n", | |
"\n", | |
"# Imprimindo as pontuações de cada fold\n", | |
"print(\"Pontuações de cada fold:\", scores)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "XYuX9o3HSdU0", | |
"outputId": "3b4bac40-e01b-4a83-f33a-fc53fdd562b3" | |
}, | |
"execution_count": 71, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Pontuações de cada fold: [0.925 0.9375 0.89375 0.95 0.93125]\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Mais estatísticas dos resultados\n", | |
"pd.Series(scores).describe()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 335 | |
}, | |
"id": "BgNJU1wua9bJ", | |
"outputId": "7addbe34-ad31-4ae9-b7b4-952afed36258" | |
}, | |
"execution_count": 72, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"count 5.00000\n", | |
"mean 0.92750\n", | |
"std 0.02101\n", | |
"min 0.89375\n", | |
"25% 0.92500\n", | |
"50% 0.93125\n", | |
"75% 0.93750\n", | |
"max 0.95000\n", | |
"dtype: float64" | |
], | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>0</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>5.00000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>0.92750</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>0.02101</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>0.89375</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>0.92500</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>0.93125</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>0.93750</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>0.95000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div><br><label><b>dtype:</b> float64</label>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 72 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Depois de passar o k-fold, é bom treinar o modelo usando o conjunto inteiro, e avalia-lo no conjunto de teste\n", | |
"rf_classifier_2.fit(X_train_val, y_train_val)\n", | |
"\n", | |
"y_pred_test = rf_classifier_2.predict(X_test)\n", | |
"\n", | |
"print(\"Classification Report (Test):\")\n", | |
"print(classification_report(y_test, y_pred_test, target_names=[\"zero 0\",\"um 1\"]))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "vvgcFXXqaXda", | |
"outputId": "f446d6c4-5684-4524-e1b3-e92ef0cd7b5c" | |
}, | |
"execution_count": 74, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Classification Report (Test):\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" zero 0 0.95 0.88 0.91 102\n", | |
" um 1 0.89 0.95 0.92 98\n", | |
"\n", | |
" accuracy 0.92 200\n", | |
" macro avg 0.92 0.92 0.91 200\n", | |
"weighted avg 0.92 0.92 0.91 200\n", | |
"\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Métricas de Regressão" | |
], | |
"metadata": { | |
"id": "7fEXn_pnbfc-" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# prompt: Usando o sklearn - crie um dataset de regressão; divida em conjunto de treino, validação e teste; treine um regressor random forest; e mostre as métricas dos 3 conjuntos, mae, mse, rmse, mape, r2\n", | |
"\n", | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"from sklearn.datasets import make_regression\n", | |
"from sklearn.model_selection import train_test_split\n", | |
"from sklearn.ensemble import RandomForestRegressor\n", | |
"from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_percentage_error, r2_score\n", | |
"\n", | |
"# Criando um dataset de regressão\n", | |
"X, y = make_regression(n_samples=1000, n_features=20, n_informative=10, noise=0.5, random_state=42)\n", | |
"\n", | |
"# Dividindo o dataset em conjuntos de treino, validação e teste\n", | |
"X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", | |
"X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.2, random_state=42)\n", | |
"\n", | |
"# Treinando um regressor Random Forest\n", | |
"rf_regressor = RandomForestRegressor(random_state=42)\n", | |
"rf_regressor.fit(X_train, y_train)\n", | |
"\n", | |
"# Fazendo previsões\n", | |
"y_pred_train = rf_regressor.predict(X_train)\n", | |
"y_pred_val = rf_regressor.predict(X_val)\n", | |
"y_pred_test = rf_regressor.predict(X_test)\n", | |
"\n", | |
"# Calculando as métricas\n", | |
"def calculate_metrics(y_true, y_pred):\n", | |
" mae = mean_absolute_error(y_true, y_pred)\n", | |
" mse = mean_squared_error(y_true, y_pred)\n", | |
" rmse = np.sqrt(mse)\n", | |
" mape = mean_absolute_percentage_error(y_true, y_pred)\n", | |
" r2 = r2_score(y_true, y_pred)\n", | |
" return mae, mse, rmse, mape, r2\n", | |
"\n", | |
"# Imprimindo as métricas para cada conjunto\n", | |
"datasets = {\n", | |
" 'Treino': (y_train, y_pred_train),\n", | |
" 'Validação': (y_val, y_pred_val),\n", | |
" 'Teste': (y_test, y_pred_test)\n", | |
"}\n", | |
"\n", | |
"for name, (y_true, y_pred) in datasets.items():\n", | |
" mae, mse, rmse, mape, r2 = calculate_metrics(y_true, y_pred)\n", | |
" print(f'{name}:')\n", | |
" print(f' MAE: {mae}')\n", | |
" print(f' MSE: {mse}')\n", | |
" print(f' RMSE: {rmse}')\n", | |
" print(f' MAPE: {mape}')\n", | |
" print(f' R^2: {r2}')\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "xNcLMS1tbi17", | |
"outputId": "1bfb8e59-f8e6-46bf-dfac-7d276a476129" | |
}, | |
"execution_count": 76, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Treino:\n", | |
" MAE: 25.988577505900953\n", | |
" MSE: 1199.1655066446679\n", | |
" RMSE: 34.6289691825308\n", | |
" MAPE: 0.37755972657218173\n", | |
" R^2: 0.9665832017381965\n", | |
"Validação:\n", | |
" MAE: 72.86177237105339\n", | |
" MSE: 8705.164657856167\n", | |
" RMSE: 93.30147189544314\n", | |
" MAPE: 1.901305444235626\n", | |
" R^2: 0.8064287420757724\n", | |
"Teste:\n", | |
" MAE: 68.18928747434154\n", | |
" MSE: 7199.592310204615\n", | |
" RMSE: 84.85041137321973\n", | |
" MAPE: 9.459253431350854\n", | |
" R^2: 0.8140201477308833\n" | |
] | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment