{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyOsdXEJWDJ9Hxdk7/a3voru"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":12,"metadata":{"id":"62826a3f-034b-4c98-968b-7a012021d1df","executionInfo":{"status":"ok","timestamp":1766863210478,"user_tz":0,"elapsed":12,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}}},"outputs":[],"source":["#Section 1\n","\n","import pandas as pd\n","from sklearn.model_selection import train_test_split\n","from sklearn.tree import DecisionTreeRegressor\n","from sklearn.metrics import mean_absolute_error\n","from sklearn.metrics import mean_squared_error\n","import matplotlib.pyplot as plt\n","import numpy as np\n"]},{"cell_type":"code","source":["data = pd.read_csv(\"f1_pitstops_2018_2024.csv\")\n","data.head()  # we do this to read the data\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":637},"id":"7fvYaR60oMfk","executionInfo":{"status":"ok","timestamp":1766863210885,"user_tz":0,"elapsed":408,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"outputId":"66a2bef4-0690-4821-8fc1-72853ea6c746"},"execution_count":13,"outputs":[{"output_type":"execute_result","data":{"text/plain":["   Season  Round                         Circuit                Driver  \\\n","0    2018      1  Albert Park Grand Prix Circuit      Sebastian Vettel   \n","1    2018      1  Albert Park Grand Prix Circuit      Sebastian Vettel   \n","2    2018      1  Albert Park Grand Prix Circuit        Lewis Hamilton   \n","3    2018      1  Albert Park Grand Prix Circuit        Lewis Hamilton   \n","4    2018      1  Albert Park Grand Prix Circuit  Kimi RÃƒÂ¤ikkÃƒÂ¶nen   \n","\n","  Constructor  Laps  Position  TotalPitStops  AvgPitStopTime  \\\n","0     Ferrari    58         1              1          21.787   \n","1     Ferrari    58         1              1          21.787   \n","2    Mercedes    58         2              1          21.821   \n","3    Mercedes    58         2              1          21.821   \n","4     Ferrari    58         3              1          21.421   \n","\n","               Race Name  ... Tire Usage Aggression Fast Lap Attempts  \\\n","0  Australian Grand Prix  ...              0.017241          44.76882   \n","1  Australian Grand Prix  ...              0.017241          44.76882   \n","2  Australian Grand Prix  ...              0.017241          44.73482   \n","3  Australian Grand Prix  ...              0.017241          44.73482   \n","4  Australian Grand Prix  ...              0.017241          45.13482   \n","\n","  Position Changes Driver Aggression Score  Abbreviation  Stint  \\\n","0         0.000000                6.755003           VET    1.0   \n","1         0.000000                6.755003           VET    2.0   \n","2         0.043478                6.754254           HAM    1.0   \n","3         0.043478                6.754254           HAM    2.0   \n","4         0.086957                6.818562           RAI    1.0   \n","\n","   Tire Compound  Stint Length  Pit_Lap     Pit_Time  \n","0      ULTRASOFT          25.0     26.0       21.787  \n","1           SOFT          32.0      NaN  Final Stint  \n","2      ULTRASOFT          17.0     19.0       21.821  \n","3           SOFT          39.0      NaN  Final Stint  \n","4      ULTRASOFT          17.0     18.0       21.421  \n","\n","[5 rows x 30 columns]"],"text/html":["\n","  <div id=\"df-34fe1cc1-b968-4f8c-af73-830f88d176ea\" 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>Season</th>\n","      <th>Round</th>\n","      <th>Circuit</th>\n","      <th>Driver</th>\n","      <th>Constructor</th>\n","      <th>Laps</th>\n","      <th>Position</th>\n","      <th>TotalPitStops</th>\n","      <th>AvgPitStopTime</th>\n","      <th>Race Name</th>\n","      <th>...</th>\n","      <th>Tire Usage Aggression</th>\n","      <th>Fast Lap Attempts</th>\n","      <th>Position Changes</th>\n","      <th>Driver Aggression Score</th>\n","      <th>Abbreviation</th>\n","      <th>Stint</th>\n","      <th>Tire Compound</th>\n","      <th>Stint Length</th>\n","      <th>Pit_Lap</th>\n","      <th>Pit_Time</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>2018</td>\n","      <td>1</td>\n","      <td>Albert Park Grand Prix Circuit</td>\n","      <td>Sebastian Vettel</td>\n","      <td>Ferrari</td>\n","      <td>58</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>21.787</td>\n","      <td>Australian Grand Prix</td>\n","      <td>...</td>\n","      <td>0.017241</td>\n","      <td>44.76882</td>\n","      <td>0.000000</td>\n","      <td>6.755003</td>\n","      <td>VET</td>\n","      <td>1.0</td>\n","      <td>ULTRASOFT</td>\n","      <td>25.0</td>\n","      <td>26.0</td>\n","      <td>21.787</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2018</td>\n","      <td>1</td>\n","      <td>Albert Park Grand Prix Circuit</td>\n","      <td>Sebastian Vettel</td>\n","      <td>Ferrari</td>\n","      <td>58</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>21.787</td>\n","      <td>Australian Grand Prix</td>\n","      <td>...</td>\n","      <td>0.017241</td>\n","      <td>44.76882</td>\n","      <td>0.000000</td>\n","      <td>6.755003</td>\n","      <td>VET</td>\n","      <td>2.0</td>\n","      <td>SOFT</td>\n","      <td>32.0</td>\n","      <td>NaN</td>\n","      <td>Final Stint</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>2018</td>\n","      <td>1</td>\n","      <td>Albert Park Grand Prix Circuit</td>\n","      <td>Lewis Hamilton</td>\n","      <td>Mercedes</td>\n","      <td>58</td>\n","      <td>2</td>\n","      <td>1</td>\n","      <td>21.821</td>\n","      <td>Australian Grand Prix</td>\n","      <td>...</td>\n","      <td>0.017241</td>\n","      <td>44.73482</td>\n","      <td>0.043478</td>\n","      <td>6.754254</td>\n","      <td>HAM</td>\n","      <td>1.0</td>\n","      <td>ULTRASOFT</td>\n","      <td>17.0</td>\n","      <td>19.0</td>\n","      <td>21.821</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>2018</td>\n","      <td>1</td>\n","      <td>Albert Park Grand Prix Circuit</td>\n","      <td>Lewis Hamilton</td>\n","      <td>Mercedes</td>\n","      <td>58</td>\n","      <td>2</td>\n","      <td>1</td>\n","      <td>21.821</td>\n","      <td>Australian Grand Prix</td>\n","      <td>...</td>\n","      <td>0.017241</td>\n","      <td>44.73482</td>\n","      <td>0.043478</td>\n","      <td>6.754254</td>\n","      <td>HAM</td>\n","      <td>2.0</td>\n","      <td>SOFT</td>\n","      <td>39.0</td>\n","      <td>NaN</td>\n","      <td>Final Stint</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>2018</td>\n","      <td>1</td>\n","      <td>Albert Park Grand Prix Circuit</td>\n","      <td>Kimi RÃƒÂ¤ikkÃƒÂ¶nen</td>\n","      <td>Ferrari</td>\n","      <td>58</td>\n","      <td>3</td>\n","      <td>1</td>\n","      <td>21.421</td>\n","      <td>Australian Grand Prix</td>\n","      <td>...</td>\n","      <td>0.017241</td>\n","      <td>45.13482</td>\n","      <td>0.086957</td>\n","      <td>6.818562</td>\n","      <td>RAI</td>\n","      <td>1.0</td>\n","      <td>ULTRASOFT</td>\n","      <td>17.0</td>\n","      <td>18.0</td>\n","      <td>21.421</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>5 rows × 30 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-34fe1cc1-b968-4f8c-af73-830f88d176ea')\"\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-34fe1cc1-b968-4f8c-af73-830f88d176ea 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-34fe1cc1-b968-4f8c-af73-830f88d176ea');\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-158f1fee-ea18-4795-a62f-583f5456f5ef\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-158f1fee-ea18-4795-a62f-583f5456f5ef')\"\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-158f1fee-ea18-4795-a62f-583f5456f5ef 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","variable_name":"data"}},"metadata":{},"execution_count":13}]},{"cell_type":"code","execution_count":14,"metadata":{"id":"47d0afea-3090-4c1e-a295-54cebff972d5","executionInfo":{"status":"ok","timestamp":1766863210890,"user_tz":0,"elapsed":8,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"4a5ec710-d3bb-462a-b232-f2986f23dd89"},"outputs":[{"output_type":"stream","name":"stdout","text":["<class 'pandas.core.frame.DataFrame'>\n","RangeIndex: 7374 entries, 0 to 7373\n","Data columns (total 30 columns):\n"," #   Column                   Non-Null Count  Dtype  \n","---  ------                   --------------  -----  \n"," 0   Season                   7374 non-null   int64  \n"," 1   Round                    7374 non-null   int64  \n"," 2   Circuit                  7374 non-null   object \n"," 3   Driver                   7374 non-null   object \n"," 4   Constructor              7374 non-null   object \n"," 5   Laps                     7374 non-null   int64  \n"," 6   Position                 7374 non-null   int64  \n"," 7   TotalPitStops            7374 non-null   int64  \n"," 8   AvgPitStopTime           7189 non-null   float64\n"," 9   Race Name                7001 non-null   object \n"," 10  Date                     7001 non-null   object \n"," 11  Time_of_race             7001 non-null   object \n"," 12  Location                 7001 non-null   object \n"," 13  Country                  7001 non-null   object \n"," 14  Air_Temp_C               7001 non-null   float64\n"," 15  Track_Temp_C             7001 non-null   float64\n"," 16  Humidity_%               7001 non-null   float64\n"," 17  Wind_Speed_KMH           7001 non-null   float64\n"," 18  Lap Time Variation       7189 non-null   float64\n"," 19  Total Pit Stops          7374 non-null   float64\n"," 20  Tire Usage Aggression    7308 non-null   float64\n"," 21  Fast Lap Attempts        7189 non-null   float64\n"," 22  Position Changes         7374 non-null   float64\n"," 23  Driver Aggression Score  7189 non-null   float64\n"," 24  Abbreviation             7374 non-null   object \n"," 25  Stint                    7265 non-null   float64\n"," 26  Tire Compound            7265 non-null   object \n"," 27  Stint Length             7265 non-null   float64\n"," 28  Pit_Lap                  4564 non-null   float64\n"," 29  Pit_Time                 7093 non-null   object \n","dtypes: float64(14), int64(5), object(11)\n","memory usage: 1.7+ MB\n"]}],"source":["data.info() #we do this to see if we have any null values\n","data.dropna(inplace=True) #returns data with only non-null values, (drops rows with missing stuff)"]},{"cell_type":"code","execution_count":15,"metadata":{"id":"0064d506-6b52-4e15-9014-ee2e77a84853","executionInfo":{"status":"ok","timestamp":1766863210895,"user_tz":0,"elapsed":6,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"5fc3555c-9f71-41f5-c865-297e6de47898"},"outputs":[{"output_type":"stream","name":"stdout","text":["<class 'pandas.core.frame.DataFrame'>\n","Index: 4334 entries, 0 to 7371\n","Data columns (total 30 columns):\n"," #   Column                   Non-Null Count  Dtype  \n","---  ------                   --------------  -----  \n"," 0   Season                   4334 non-null   int64  \n"," 1   Round                    4334 non-null   int64  \n"," 2   Circuit                  4334 non-null   object \n"," 3   Driver                   4334 non-null   object \n"," 4   Constructor              4334 non-null   object \n"," 5   Laps                     4334 non-null   int64  \n"," 6   Position                 4334 non-null   int64  \n"," 7   TotalPitStops            4334 non-null   int64  \n"," 8   AvgPitStopTime           4334 non-null   float64\n"," 9   Race Name                4334 non-null   object \n"," 10  Date                     4334 non-null   object \n"," 11  Time_of_race             4334 non-null   object \n"," 12  Location                 4334 non-null   object \n"," 13  Country                  4334 non-null   object \n"," 14  Air_Temp_C               4334 non-null   float64\n"," 15  Track_Temp_C             4334 non-null   float64\n"," 16  Humidity_%               4334 non-null   float64\n"," 17  Wind_Speed_KMH           4334 non-null   float64\n"," 18  Lap Time Variation       4334 non-null   float64\n"," 19  Total Pit Stops          4334 non-null   float64\n"," 20  Tire Usage Aggression    4334 non-null   float64\n"," 21  Fast Lap Attempts        4334 non-null   float64\n"," 22  Position Changes         4334 non-null   float64\n"," 23  Driver Aggression Score  4334 non-null   float64\n"," 24  Abbreviation             4334 non-null   object \n"," 25  Stint                    4334 non-null   float64\n"," 26  Tire Compound            4334 non-null   object \n"," 27  Stint Length             4334 non-null   float64\n"," 28  Pit_Lap                  4334 non-null   float64\n"," 29  Pit_Time                 4334 non-null   object \n","dtypes: float64(14), int64(5), object(11)\n","memory usage: 1.0+ MB\n"]}],"source":["data.info() #reload the new data"]},{"cell_type":"code","execution_count":16,"metadata":{"id":"4adbc4c6-eaad-4077-b102-056315859576","executionInfo":{"status":"ok","timestamp":1766863210927,"user_tz":0,"elapsed":31,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}}},"outputs":[],"source":["TARGET_COLUMN = 'Lap Time Variation'   # the thing we want to predict (change name if needed)\n","CONSTRUCTOR_COL = 'Constructor'        # column that holds the team name\n","DATA_PATH = \"f1_pitstops_2018_2024.csv\"\n","   # path to the CSV file"]},{"cell_type":"code","execution_count":17,"metadata":{"id":"4ef19360-6855-4e3f-85e9-f41ed85df19d","executionInfo":{"status":"ok","timestamp":1766863210928,"user_tz":0,"elapsed":2,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}}},"outputs":[],"source":["TOP_TEAMS = [\"Mercedes\" , \"Ferrari\", \"Red Bull\"]\n","\n","\n","OTHER_TEAMS = [\"Sauber\", \"Toro Rosso\", \"Haas F1 Team\", \"Williams\", \"Force India\", \"Renault\", \"AlphaTauri\", \"Aston Martin\", \"McLaren\", \"Alpine\", \"Alpine\", \"Racing Point\", \"Visa Cash App R8 F1 Team\", \"Stake F1 Team Kick Sauber\"]\n","\n","def get_team_tier(team):\n","    if team in TOP_TEAMS:\n","        return \"Top_Tier\"\n","    return \"Other_Tier\""]},{"cell_type":"code","source":["\n","#Section 2-Loading and cleaning the data\n","\n","print(\"Loading data\")\n","\n","LAPS_BEFORE_df = pd.read_csv(DATA_PATH)\n","print(f\"Data loaded: {LAPS_BEFORE_df.shape[0]:,} rows and {LAPS_BEFORE_df.shape[1]} columns.\")\n","\n","print(\"\\nData set columns:\")\n","print(LAPS_BEFORE_df.columns.tolist())\n","\n","# get rid of missing target values\n","before_rows = len(LAPS_BEFORE_df)\n","raw_laps_df = LAPS_BEFORE_df.dropna(subset=[TARGET_COLUMN]).copy()\n","after_rows = len(raw_laps_df)\n","dropped_target = before_rows - after_rows\n","\n","print(f\"\\nRemoved {dropped_target} laps where '{TARGET_COLUMN}' was missing.\")\n","print(f\"Remaining laps: {after_rows:,}\")\n","\n","# pick my features\n","feature_columns = [\"Stint Length\", \"Air_Temp_C\", \"Tire Compound\", \"Constructor\"]\n","\n","print(\"\\nFeatures:\")\n","print(feature_columns)\n","\n","# grab just the columns i need\n","clean_laps_df = raw_laps_df[feature_columns + [TARGET_COLUMN]].copy()\n","\n","# remove rows with missing data\n","clean_laps_df = clean_laps_df.dropna(subset=[\"Stint Length\", \"Air_Temp_C\"])\n","\n","print(\"\\nFirst few rows:\")\n","print(clean_laps_df.head())\n","\n","# add team category\n","team_cats = []\n","for team in clean_laps_df[\"Constructor\"]:\n","    team_cats.append(get_team_tier(team))\n","clean_laps_df[\"Team_Category\"] = team_cats\n","\n","clean_laps_df = clean_laps_df.drop(columns=[\"Constructor\"])\n","\n","# turn categories into numbers\n","laps_encoded = pd.get_dummies(clean_laps_df, columns=[\"Tire Compound\", \"Team_Category\"], drop_first=False)\n","\n","print(\"\\nColumns after encoding:\")\n","print(laps_encoded.columns.tolist())\n","\n","# split into inputs and target\n","feature_columns = []\n","for col in laps_encoded.columns:\n","    if col != TARGET_COLUMN:\n","        feature_columns.append(col)\n","\n","X = laps_encoded[feature_columns]\n","y = laps_encoded[TARGET_COLUMN]\n","\n","print(f\"\\nX has {X.shape[0]:,} rows and {X.shape[1]} features.\")\n","print(f\"y has {len(y):,} values.\")\n","\n","# split into training and test\n","X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=10)\n","\n","print(f\"\\nTraining set: {X_train.shape[0]:,} laps\")\n","print(f\"Test set: {X_test.shape[0]:,} laps\")\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"G8Qp5KSu5Km_","executionInfo":{"status":"ok","timestamp":1766863211482,"user_tz":0,"elapsed":551,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"outputId":"39372a12-96df-43ba-d614-a2c7210f3cd3"},"execution_count":18,"outputs":[{"output_type":"stream","name":"stdout","text":["Loading data\n","Data loaded: 7,374 rows and 30 columns.\n","\n","Data set columns:\n","['Season', 'Round', 'Circuit', 'Driver', 'Constructor', 'Laps', 'Position', 'TotalPitStops', 'AvgPitStopTime', 'Race Name', 'Date', 'Time_of_race', 'Location', 'Country', 'Air_Temp_C', 'Track_Temp_C', 'Humidity_%', 'Wind_Speed_KMH', 'Lap Time Variation', 'Total Pit Stops', 'Tire Usage Aggression', 'Fast Lap Attempts', 'Position Changes', 'Driver Aggression Score', 'Abbreviation', 'Stint', 'Tire Compound', 'Stint Length', 'Pit_Lap', 'Pit_Time']\n","\n","Removed 185 laps where 'Lap Time Variation' was missing.\n","Remaining laps: 7,189\n","\n","Features:\n","['Stint Length', 'Air_Temp_C', 'Tire Compound', 'Constructor']\n","\n","First few rows:\n","   Stint Length  Air_Temp_C Tire Compound Constructor  Lap Time Variation\n","0          25.0   15.783333     ULTRASOFT     Ferrari            0.001723\n","1          32.0   15.783333          SOFT     Ferrari            0.001723\n","2          17.0   15.783333     ULTRASOFT    Mercedes            0.001735\n","3          39.0   15.783333          SOFT    Mercedes            0.001735\n","4          17.0   15.783333     ULTRASOFT     Ferrari            0.001603\n","\n","Columns after encoding:\n","['Stint Length', 'Air_Temp_C', 'Lap Time Variation', 'Tire Compound_HARD', 'Tire Compound_HYPERSOFT', 'Tire Compound_INTERMEDIATE', 'Tire Compound_MEDIUM', 'Tire Compound_SOFT', 'Tire Compound_SUPERSOFT', 'Tire Compound_ULTRASOFT', 'Tire Compound_WET', 'Team_Category_Other_Tier', 'Team_Category_Top_Tier']\n","\n","X has 6,732 rows and 12 features.\n","y has 6,732 values.\n","\n","Training set: 4,712 laps\n","Test set: 2,020 laps\n"]}]},{"cell_type":"code","execution_count":19,"metadata":{"id":"9efd839b-5405-4268-82ad-144177741723","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1766863212465,"user_tz":0,"elapsed":981,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"outputId":"dc35d88a-4406-49a4-f222-cf5c5bb7bacf"},"outputs":[{"output_type":"stream","name":"stdout","text":["Completed training\n","Added teams\n","\n","First rows:\n","        Actual  Predicted   Team_tier\n","6556  0.002354   0.005305  Other_Tier\n","1099  0.002361   0.043686    Top_Tier\n","5403  0.004247   0.005305    Top_Tier\n","820   0.001671   0.005305  Other_Tier\n","6791  0.004027   0.020729  Other_Tier\n","\n","Summary\n","Top tier MAE: 0.031907994174537706\n","Other tier MAE: 0.03495958840016313\n","Average MAE: 0.0339882145946794\n","Bias: 0.003051594225625426\n","Bias percent: 9.127275454339479\n","Moderate bias\n","Worse for other teams\n"]}],"source":["#SECTION 3: Bias proof (unified model)\n","\n","# make model\n","unified_model = DecisionTreeRegressor(random_state=42, max_depth=6, min_samples_leaf=20)\n","unified_model.fit(X_train, y_train)\n","\n","print(\"Completed training\")\n","\n","# predictions\n","preds = unified_model.predict(X_test)\n","\n","# results table\n","results = X_test.copy()\n","results[\"Actual\"] = y_test.values\n","results[\"Predicted\"] = preds\n","\n","# team tier column\n","results[\"Team_tier\"] = np.where(\n","    results[\"Team_Category_Top_Tier\"] == 1,\n","    \"Top_Tier\",\n","    \"Other_Tier\")\n","\n","print(\"Added teams\")\n","\n","print(\"\\nFirst rows:\")\n","print(results[[\"Actual\", \"Predicted\", \"Team_tier\"]].head())\n","\n","# top tier mae\n","top_actual = []\n","top_pred = []\n","for i in results.index:\n","    if results.loc[i, \"Team_tier\"] == \"Top_Tier\":\n","        top_actual.append(results.loc[i, \"Actual\"])\n","        top_pred.append(results.loc[i, \"Predicted\"])\n","\n","top_mae = mean_absolute_error(top_actual, top_pred)\n","\n","# other tier mae\n","other_actual = []\n","other_pred = []\n","for i in results.index:\n","    if results.loc[i, \"Team_tier\"] == \"Other_Tier\":\n","        other_actual.append(results.loc[i, \"Actual\"])\n","        other_pred.append(results.loc[i, \"Predicted\"])\n","\n","other_mae = mean_absolute_error(other_actual, other_pred)\n","\n","# bias\n","diff = top_mae - other_mae\n","if diff < 0:\n","    diff = diff * -1\n","\n","avg = (top_mae + other_mae) / 2\n","pct = (diff / avg) * 100\n","\n","total = mean_absolute_error(results[\"Actual\"], results[\"Predicted\"])\n","\n","print(\"\\nSummary\")\n","print(\"Top tier MAE:\", top_mae)\n","print(\"Other tier MAE:\", other_mae)\n","print(\"Average MAE:\", total)\n","print(\"Bias:\", diff)\n","print(\"Bias percent:\", pct)\n","\n","if pct < 5:\n","    print(\"Very small bias\")\n","if pct >= 5 and pct < 20:\n","    print(\"Moderate bias\")\n","if pct >= 20:\n","    print(\"High bias\")\n","\n","if other_mae > top_mae:\n","    print(\"Worse for other teams\")\n","if top_mae > other_mae:\n","    print(\"Worse for top teams\")\n","if top_mae == other_mae:\n","    print(\"Same for both\")\n","\n","test_results = results.copy()\n","\n","\n","# Unified model MAE calculations (needed for Section 6)\n","top_tier_mae = top_mae     # from the unified model results\n","other_tier_mae = other_mae # from the unified model results\n","\n","# Unified model bias\n","bias_amount = abs(top_tier_mae - other_tier_mae)\n","\n"]},{"cell_type":"code","execution_count":20,"metadata":{"id":"018ade54-132e-478d-b866-0d6c52af9cb3","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1766863212561,"user_tz":0,"elapsed":95,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"outputId":"d74b0f00-6594-48cf-9bec-62a93ed99fb1"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Top-team training rows: 1441\n","Other-team training rows: 3271\n","(643, 13)\n","(1377, 13)\n","----- Specialised Models (Two Models) -----\n","Top Tier MAE (specialised):   0.0362\n","Other Tier MAE (specialised): 0.0360\n"]}],"source":["\n","#Section 4\n","\n","\n","TEAM_COLUMN = \"Team_Category_Top_Tier\"  # ← ADD THIS LINE (only new line you need)\n","\n"," #We combine X_train + y_train so we can filter by top teams\n","\n","train_data = pd.concat([X_train, y_train], axis=1) #combines X_train and y_train columns into 1 table side by side (axis=1=side by side column wise, axis=0= row wise)\n","\n","#we are splitting only the training data into top tier and other tier groups using yes for teop teams and no for other teams\n","df_top_train = train_data[train_data[TEAM_COLUMN] == 1 ] #we are filtering the train_data and creating a new daa_table for just top teams and just other teams\n","df_other_train = train_data[train_data[TEAM_COLUMN] == 0]\n","\n","print(\"\\nTop-team training rows:\", df_top_train.shape[0])\n","print(\"Other-team training rows:\", df_other_train.shape[0])\n","\n","#Split each group into new X (inputs) and y (target)\n","\n","#TOP TEAMS\n","X_top_train = df_top_train.drop(columns=[TARGET_COLUMN]) #we drop the lap time variation as this is not an input it is something we want the AI to predict\n","y_top_train = df_top_train[TARGET_COLUMN] #this is the target value we want the AI to predict for our teams\n","\n","\n","\n","X_top_train.head() #shows the data set with the columns selected dropped\n","\n","X_top_train.shape\n","y_top_train.shape\n","\n","\n","#OTHER TEAMS\n","\n","X_other_train= df_other_train.drop(columns=[TARGET_COLUMN]) #we drop the lap time variation as this is not an input it is something we want the AI to predict\n","y_other_train = df_other_train[TARGET_COLUMN] #this is the target value we want the AI to predict for our teams\n","\n","\n","X_other_train.head() #shows the data set with the columns selected dropped\n","X_other_train.shape\n","y_other_train.shape\n","\n","\n","#Train 2 separate models\n","\n","rg1 = DecisionTreeRegressor(max_depth=6, min_samples_leaf=20, random_state=42)\n"," #Model trained ONLY on top teams\n","rg1.fit(X_top_train, y_top_train)\n","\n","rg2 = DecisionTreeRegressor(max_depth=6, min_samples_leaf=20, random_state=42)\n","rg2.fit(X_other_train, y_other_train)   #Model trained ONLY on other teams\n","\n","\n","\n","#Prepare test data (combine X_test and y_test)\n","\n","test_data = pd.concat([X_test, y_test], axis=1)\n","\n","\n","\n","\n","#split test data into top and other\n","\n","df_top_test = test_data[test_data[TEAM_COLUMN] == 1]\n","print(df_top_test.shape)\n","df_top_test.head()\n","\n","df_other_test = test_data[test_data[TEAM_COLUMN] == 0]\n","print(df_other_test.shape)\n","df_other_test.head()\n","\n","\n","#prepare x and y for top team test set\n","\n","X_top_test = df_top_test.drop(columns=[TARGET_COLUMN])\n","y_top_test = df_top_test[TARGET_COLUMN]\n","\n","X_top_test.head()\n","X_top_test.shape\n","y_top_test.shape\n","\n","#prepare x and y for other teams test set\n","\n","X_other_test = df_other_test.drop(columns=[TARGET_COLUMN])\n","y_other_test = df_other_test[TARGET_COLUMN]\n","\n","X_other_test.head()\n","X_other_test.shape\n","y_other_test.shape\n","\n","\n","#Predict using the trained models\n","\n","y_predict_top = rg1.predict(X_top_test)\n","\n","y_predict_other = rg2.predict(X_other_test)\n","\n","\n","# SPECIALISED model errors (two-model setup)\n","top_tier_mae_specialised = mean_absolute_error(y_top_test, y_predict_top)\n","other_tier_mae_specialised = mean_absolute_error(y_other_test, y_predict_other)\n","\n","print(\"----- Specialised Models (Two Models) -----\")\n","print(f\"Top Tier MAE (specialised):   {top_tier_mae_specialised:.4f}\")\n","print(f\"Other Tier MAE (specialised): {other_tier_mae_specialised:.4f}\")"]},{"cell_type":"code","execution_count":21,"metadata":{"id":"b0173ae6-1dde-47a8-9c0e-29090b8ef31d","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1766863212566,"user_tz":0,"elapsed":3,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"outputId":"bc46e18b-ac1b-412e-8b4a-2a86327b8197"},"outputs":[{"output_type":"stream","name":"stdout","text":["New Bias: 0.00023884712935314661\n","New Bias (two models): 0.0002\n","Specialised model predicts better for OTHER teams.\n"]}],"source":["# SECTION 5 — Mitigation evaluation (specialised model bias)\n","\n","new_bias = abs(top_tier_mae_specialised - other_tier_mae_specialised)\n","\n","print(\"New Bias:\", new_bias)\n","print(f\"New Bias (two models): {new_bias:.4f}\")\n","\n","if top_tier_mae_specialised < other_tier_mae_specialised:\n","    print(\"Specialised model predicts better for TOP teams.\")\n","elif top_tier_mae_specialised > other_tier_mae_specialised:\n","    print(\"Specialised model predicts better for OTHER teams.\")\n","else:\n","    print(\"Both groups have equal error — perfectly fair model.\")\n","\n","\n"]},{"cell_type":"code","source":["#Section 6\n","\n","print(\"\\n\")\n","\n","print(\"Section 6: compare one model vs two models\")\n","\n","print(\"\\n\")\n","\n","\n","# 1. show a simple comparison table\n","\n","groups = [\"Top_Tier\", \"Other_Tier\"]\n","\n","unified_mae_list = [top_tier_mae, other_tier_mae]\n","\n","special_mae_list = [top_tier_mae_specialised, other_tier_mae_specialised]\n","\n","\n","print(\"Group        Unified_MAE    Specialised_MAE\")\n","\n","print(groups[0], \"   \", round(unified_mae_list[0], 4), \"        \", round(special_mae_list[0], 4))\n","\n","print(groups[1], \"   \", round(unified_mae_list[1], 4), \"        \", round(special_mae_list[1], 4))\n","\n","\n","# 2. work out bias before and after\n","\n","old_bias = bias_amount\n","\n","new_bias = top_tier_mae_specialised - other_tier_mae_specialised\n","\n","if new_bias < 0:\n","\n","    new_bias = new_bias * -1\n","\n","\n","# 3. percentage change in bias\n","\n","bias_change_pct = 0\n","\n","if old_bias != 0:\n","\n","    bias_change_pct = (old_bias - new_bias) / old_bias\n","\n","    bias_change_pct = bias_change_pct * 100\n","\n","\n","print(\"\\nOld bias (unified model):\", old_bias)\n","\n","print(\"New bias (specialised models):\", new_bias)\n","\n","print(\"Bias change:\", round(bias_change_pct, 2), \"%\")\n","\n","\n","# 4. say if it got better or worse\n","\n","if new_bias < old_bias:\n","\n","    print(\"Specialised models reduced the bias\")\n","\n","elif new_bias > old_bias:\n","\n","    print(\"Specialised models increased the bias\")\n","\n","else:\n","\n","    print(\"Bias stayed the same\")\n","\n","\n","# positions for the two groups on x-axis\n","\n","pos_top = 0\n","\n","pos_other = 1\n","\n","width = 0.35\n","\n","\n","# positions for unified and specialised bars\n","\n","pos_top_unified = pos_top - width/2\n","\n","pos_top_special = pos_top + width/2\n","\n","pos_other_unified = pos_other - width/2\n","\n","pos_other_special = pos_other + width/2\n","\n","\n","plt.figure()\n","\n","\n","# draw each bar\n","\n","plt.bar(pos_top_unified, unified_mae_list[0], width, label=\"Unified\",color=\"tab:blue\")\n","\n","plt.bar(pos_top_special, special_mae_list[0], width, label=\"Specialised\", color=\"tab:orange\")\n","\n","plt.bar(pos_other_unified, unified_mae_list[1], width,color=\"tab:blue\")\n","\n","plt.bar(pos_other_special, special_mae_list[1], width,color=\"tab:orange\")\n","\n","\n","plt.xticks([pos_top, pos_other], groups)\n","\n","plt.xlabel(\"Group\")\n","\n","plt.ylabel(\"MAE\")\n","\n","plt.title(\"Unified vs Specialised models\")\n","\n","\n","# add MAE numbers on top of bars\n","\n","plt.text(pos_top_unified, unified_mae_list[0], str(round(unified_mae_list[0], 3)), ha='center')\n","\n","plt.text(pos_top_special, special_mae_list[0], str(round(special_mae_list[0], 3)), ha='center')\n","\n","plt.text(pos_other_unified, unified_mae_list[1], str(round(unified_mae_list[1], 3)), ha='center')\n","\n","plt.text(pos_other_special, special_mae_list[1], str(round(special_mae_list[1], 3)), ha='center')\n","\n","\n","plt.legend()\n","\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":704},"id":"1mt1U1SxBuCJ","executionInfo":{"status":"ok","timestamp":1766863213503,"user_tz":0,"elapsed":937,"user":{"displayName":"Salma Ahmed","userId":"10865891360196912478"}},"outputId":"cc17f8ee-033c-48df-acb6-f2e1f43cb7b7"},"execution_count":22,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","\n","Section 6: compare one model vs two models\n","\n","\n","Group        Unified_MAE    Specialised_MAE\n","Top_Tier     0.0319          0.0362\n","Other_Tier     0.035          0.036\n","\n","Old bias (unified model): 0.003051594225625426\n","New bias (specialised models): 0.00023884712935314661\n","Bias change: 92.17 %\n","Specialised models reduced the bias\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAkgAAAHHCAYAAABEEKc/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWlNJREFUeJzt3XtcjvfjP/DXXXTfKpXOB6kQOUSUDuyzmIgZGpPTZxFjM+fMyFBmlo0sm7a+Ydg+iAyfOXxMC3MokXKaw5yjo1hF0fH6/eHXNffVHUV1F6/n43E/uN/X+3pf7+u+uXr1vt7XdckEQRBARERERCINdXeAiIiIqL5hQCIiIiKSYEAiIiIikmBAIiIiIpJgQCIiIiKSYEAiIiIikmBAIiIiIpJgQCIiIiKSYEAiIiIikmBAIqonxo4dC1tbW6Wyhw8f4oMPPoC5uTlkMhlmzJiBmzdvQiaTYf369TW27fXr10Mmk+HmzZs11uar6NChQ5DJZDh06FC11w0ODoZMJlMqs7W1xdixY2umc1XUUL7rl/msG8o+Uv3GgERUDeU/5LKzs1Uu79ixI3r27Flj2/vyyy+xfv16TJo0CT///DPef//9Gmu7vtq1axc8PT1hamoKbW1ttGzZEr6+vti3b5+6u0ZEr5FG6u4AET2xevVqlJWVKZUdOHAA7u7uCAoKEssEQcCjR4/QuHHjuu5irVu+fDlmz54NT09PBAYGQltbG1evXsXvv/+OqKgo9OvXT639e/PNN/Ho0SNoaWnVSHuXL1+GhgZ/TyWqjxiQiOoJVYEnKysL7du3VyqTyWRQKBR11a06U1JSgsWLF6NPnz7Yv39/heVZWVlq6JUyDQ2NGv3s5XJ5jbVFRDWLv7oQ1aLyeRRbt27FkiVL0Lx5cygUCvTu3RtXr15Vqvv0HKTy9W7cuIE9e/ZAJpOJcyoqm4N06dIlvPfeezA0NIRCoYCLiwt+/fXXCn36888/8dZbb6FJkyZo3rw5vvjiiwojV6osX74cMpkMt27dqrAsMDAQWlpa+PvvvwEAV65cwdChQ2Fubg6FQoHmzZtjxIgRyM3NrbT97Oxs5OXloUePHiqXm5qain8v/3y2bNmCefPmwdzcHDo6Ohg0aBBu375dYd2EhAT069cP+vr60NbWhqenJ44dO1ahXmpqKsaPHw9LS0vI5XLY2dlh0qRJKCoqUtru0/Nijhw5gmHDhqFFixaQy+WwtrbGzJkz8ejRo0r3tZx0DlJxcTEWLVoEe3t7KBQKGBkZ4Y033kBMTIzSerX9XQNP/j3q6uoiJSUF77zzDnR1dWFlZYXw8HAAwLlz5/DWW29BR0cHNjY22LRpU4U2rl+/jmHDhsHQ0BDa2tpwd3fHnj17KtS7c+cOfHx8oKOjA1NTU8ycOROFhYUq+1XV71IqMTER3t7eMDY2RpMmTWBnZ4dx48ZV6bOg1xNHkIjqwNKlS6GhoYFPPvkEubm5+PrrrzF69GgkJCSorN+uXTv8/PPPmDlzJpo3b45Zs2YBAExMTHD37t0K9f/880/06NEDVlZWmDt3LnR0dLB161b4+Pjgl19+wbvvvgsAyMjIQK9evVBSUiLWi4yMRJMmTZ67D76+vvj000+xdetWzJ49W2nZ1q1b0bdvXzRr1gxFRUXw9vZGYWEhpk6dCnNzc6SmpmL37t3IycmBvr6+yvZNTU3RpEkT7Nq1C1OnToWhoeFz+7RkyRLIZDLMmTMHWVlZCAsLg5eXF06fPi3u04EDB9C/f384OzsjKCgIGhoaWLduHd566y0cOXIErq6uAIC0tDS4uroiJycHEydOhIODA1JTU7Ft2zYUFBRUelotOjoaBQUFmDRpEoyMjHDixAl89913uHPnDqKjo5+7D08LDg5GSEgIPvjgA7i6uiIvLw+JiYlISkpCnz59ANTNd12utLQU/fv3x5tvvomvv/4aGzduxJQpU6Cjo4PPPvsMo0ePxpAhQxAREQE/Pz94eHjAzs4OAJCZmYnu3bujoKAA06ZNg5GRETZs2IBBgwZh27ZtYj8fPXqE3r17IyUlBdOmTYOlpSV+/vlnHDhwoEJ/qvpdSmVlZaFv374wMTHB3LlzYWBggJs3b2L79u3V+n7oNSMQUZUFBQUJAIS7d++qXN6hQwfB09NTfH/w4EEBgNCuXTuhsLBQLF+5cqUAQDh37pxYNmbMGMHGxkapPRsbG2HAgAFKZTdu3BAACOvWrRPLevfuLTg6OgqPHz8Wy8rKyoTu3bsL9vb2YtmMGTMEAEJCQoJYlpWVJejr6wsAhBs3bjxz/z08PARnZ2elshMnTggAhJ9++kkQBEFITk4WAAjR0dHPbEuVhQsXCgAEHR0doX///sKSJUuEU6dOVahX/rlaWVkJeXl5YvnWrVsFAMLKlSvFz8De3l7w9vYWysrKxHoFBQWCnZ2d0KdPH7HMz89P0NDQEE6ePFlhe+Xrlm/34MGDSm1JhYSECDKZTLh165ZYVv5v52k2NjbCmDFjxPedO3eu8H1L1dV3PWbMGAGA8OWXX4plf//9t9CkSRNBJpMJUVFRYvmlS5cEAEJQUFCF7R85ckQse/DggWBnZyfY2toKpaWlgiAIQlhYmABA2Lp1q1gvPz9faN26tdJnXZ3vct26dUr7uGPHDgGAyu+WqDI8xUZUB/z9/ZVGIP71r38BeHIK4mXdv38fBw4cgK+vLx48eIDs7GxkZ2fj3r178Pb2xpUrV5CamgoA2Lt3L9zd3ZV+0zYxMcHo0aOrtK3hw4fj1KlTuHbtmli2ZcsWyOVyDB48GADEEaLffvsNBQUF1dqXRYsWYdOmTejSpQt+++03fPbZZ3B2dkbXrl1x8eLFCvX9/PzQtGlT8f17770HCwsL7N27FwBw+vRpXLlyBaNGjcK9e/fEzyY/Px+9e/fG4cOHUVZWhrKyMuzcuRMDBw6Ei4tLhe1IL89/2tMjMvn5+cjOzkb37t0hCAKSk5Ortf8GBgb4888/ceXKFZXL6/K7LvfBBx8o9a9t27bQ0dGBr6+vWN62bVsYGBgo/Xveu3cvXF1d8cYbb4hlurq6mDhxIm7evIkLFy6I9SwsLPDee++J9bS1tTFx4kSlflT1u1TFwMAAALB7924UFxdXa//p9cWARFTDVP0wbdGihdL7Zs2aAYA4Z+dlXL16FYIgYMGCBTAxMVF6lV/9Vj7B+datW7C3t6/QRtu2bau0rWHDhkFDQwNbtmwB8OSKuujoaPTv3x96enoAADs7OwQEBGDNmjUwNjaGt7c3wsPDnzn/6GkjR47EkSNH8Pfff2P//v0YNWoUkpOTMXDgQDx+/FiprnRfZDIZWrduLd7/pjxojBkzpsJns2bNGhQWFiI3Nxd3795FXl4eOnbsWKU+Pi0lJQVjx46FoaEhdHV1YWJiAk9PTwCo8j6X+/zzz5GTk4M2bdrA0dERs2fPxtmzZ8XldfldA4BCoYCJiYlSmb6+Ppo3b17h37m+vr7Sv+dbt26p3Fa7du3E5eV/tm7dukJ70nWr+l2q4unpiaFDh2LRokUwNjbG4MGDsW7dukrnOREBnINEVC3lVzBVNgG3oKBA5VVOmpqaKusLgvDSfSr/rfmTTz6Bt7e3yjqtW7d+6e0AgKWlJf71r39h69atmDdvHo4fP46UlBR89dVXSvVCQ0MxduxY/Pe//8X+/fsxbdo0hISE4Pjx42jevHmVtqWnp4c+ffqgT58+aNy4MTZs2ICEhAQxfFRF+WezbNkyODk5qayjq6uL+/fvV7nNp5WWlqJPnz64f/8+5syZAwcHB+jo6CA1NRVjx46t8oTocm+++SauXbsmfm5r1qzBN998g4iICHzwwQd1+l0Dlf+7rc1/z5Wp6nepikwmw7Zt23D8+HHs2rULv/32G8aNG4fQ0FAcP3680vXo9caARFQNNjY2AJ7cv8ba2lppWUFBAW7fvo2+ffvWaZ9atmwJ4MltAry8vJ5Z18bGRuXpm8uXL1d5e8OHD8fHH3+My5cvY8uWLdDW1sbAgQMr1HN0dISjoyPmz5+PuLg49OjRAxEREfjiiy+qvK1yLi4u2LBhA9LT05XKpfsiCAKuXr2KTp06AQBatWoF4EnYetZnY2JiAj09PZw/f75a/Tp37hz++usvbNiwAX5+fmK59Kqz6jA0NIS/vz/8/f3x8OFDvPnmmwgODsYHH3xQ59/1y7CxsVG5rUuXLonLy/88f/48BEFQGkWSrlvV7/JZ3N3d4e7ujiVLlmDTpk0YPXo0oqKilE4jEpXjKTaiaujduze0tLTwww8/VBgdiIyMRElJCfr371+nfTI1NUXPnj3xf//3fxUCBAClq97efvttHD9+HCdOnFBavnHjxipvb+jQodDU1MTmzZsRHR2Nd955Bzo6OuLyvLw8lJSUKK3j6OgIDQ2NZ57SKCgoQHx8vMpl//vf/wBUPO3y008/4cGDB+L7bdu2IT09XfwOnJ2d0apVKyxfvhwPHz6s0G75Z6OhoQEfHx/s2rULiYmJFepVNjJSPpLy9HJBELBy5cpK9/NZ7t27p/ReV1cXrVu3Fj+3uv6uX8bbb7+NEydOKH2n+fn5iIyMhK2trXh/r7fffhtpaWnYtm2bWK+goACRkZFK7VX1u1Tl77//rvAdlo9C8TQbVYYjSETVYGpqioULF2L+/Pl48803MWjQIGhrayMuLg6bN29G3759VY6m1Lbw8HC88cYbcHR0xIQJE9CyZUtkZmYiPj4ed+7cwZkzZwAAn376KX7++Wf069cP06dPFy/9trGxUZrr8iympqbo1asXVqxYgQcPHmD48OFKyw8cOIApU6Zg2LBhaNOmDUpKSvDzzz9DU1MTQ4cOrbTdgoICdO/eHe7u7ujXrx+sra2Rk5ODnTt34siRI/Dx8UGXLl2U1jE0NMQbb7wBf39/ZGZmIiwsDK1bt8aECRMAPAk+a9asQf/+/dGhQwf4+/vDysoKqampOHjwIPT09LBr1y4ATx7rsn//fnh6emLixIlo164d0tPTER0djaNHj4oTfZ/m4OCAVq1a4ZNPPkFqair09PTwyy+/vPDcsvbt26Nnz55wdnaGoaEhEhMTsW3bNkyZMkWsU5ff9cuYO3cuNm/ejP79+2PatGkwNDTEhg0bcOPGDfzyyy/iHcQnTJiAVatWwc/PD6dOnYKFhQV+/vlnaGtrK7VXne9SasOGDfj+++/x7rvvolWrVnjw4AFWr14NPT09vP3227X+WVADpZ6L54gatv/85z+Cu7u7oKOjI8jlcsHBwUFYtGiR0qXXgvDPZeHSS95VXar/Mpf5C4IgXLt2TfDz8xPMzc2Fxo0bC1ZWVsI777wjbNu2Tane2bNnBU9PT0GhUAhWVlbC4sWLhbVr11bp0u9yq1evFgAITZs2FR49eqS07Pr168K4ceOEVq1aCQqFQjA0NBR69eol/P77789ss7i4WFi9erXg4+Mj2NjYCHK5XNDW1ha6dOkiLFu2TOk2CeWf6+bNm4XAwEDB1NRUaNKkiTBgwAClS+vLJScnC0OGDBGMjIwEuVwu2NjYCL6+vkJsbKxSvVu3bgl+fn6CiYmJIJfLhZYtWwqTJ08Wt63qMv8LFy4IXl5egq6urmBsbCxMmDBBOHPmTIXvqCqX+X/xxReCq6urYGBgIDRp0kRwcHAQlixZIhQVFSmtVxff9ZgxYwQdHZ0K5Z6enkKHDh0qlKv6t3rt2jXhvffeEwwMDASFQiG4uroKu3fvrrDurVu3hEGDBgna2tqCsbGxMH36dGHfvn0VPmtBqNp3Kb3MPykpSRg5cqTQokULQS6XC6ampsI777wjJCYmPvMzoNebTBBqcVYdEVEtOHToEHr16oXo6Gily8OJiGoK5yARERERSTAgEREREUkwIBERERFJcA4SERERkQRHkIiIiIgkGJCIiIiIJHijyBdUVlaGtLQ0NG3a9JlP+iYiIqL6QxAEPHjwAJaWluINS1VhQHpBaWlpFZ7FRURERA3D7du3n/nwbAakF9S0aVMATz5gPT09NfeGiIiIqiIvLw/W1tbiz/HKMCC9oPLTanp6egxIREREDczzpsdwkjYRERGRBAMSERERkQQDEhEREZEE5yDVstLSUhQXF6u7G1RHGjduDE1NTXV3g4iIXhIDUi0RBAEZGRnIyclRd1eojhkYGMDc3Jz3xyIiasAYkGpJeTgyNTWFtrY2f1i+BgRBQEFBAbKysgAAFhYWz10nPDwcy5YtQ0ZGBjp37ozvvvsOrq6uldaPjo7GggULcPPmTdjb2+Orr77C22+/LS4PDg5GVFQUbt++DS0tLTg7O2PJkiVwc3NTamfPnj34/PPPcfbsWSgUCnh6emLnzp0vtuNERK8gBqRaUFpaKoYjIyMjdXeH6lCTJk0AAFlZWTA1NX3m6bYtW7YgICAAERERcHNzQ1hYGLy9vXH58mWYmppWqB8XF4eRI0ciJCQE77zzDjZt2gQfHx8kJSWhY8eOAIA2bdpg1apVaNmyJR49eoRvvvkGffv2xdWrV2FiYgIA+OWXXzBhwgR8+eWXeOutt1BSUoLz58/XwqdBRNSACfRCcnNzBQBCbm5uhWWPHj0SLly4IBQUFKihZ6RuBQUFwoULF4RHjx49s56rq6swefJk8X1paalgaWkphISEqKzv6+srDBgwQKnMzc1N+PDDDyvdRvm/099//10QBEEoLi4WrKyshDVr1lR1d4hIjVatWiXY2NgIcrlccHV1FRISEp5Zf+vWrULbtm0FuVwudOzYUdizZ4/S8qCgIKFt27aCtra2YGBgIPTu3Vs4fvx4hXZ2794tuLq6CgqFQjAwMBAGDx5ck7ulVs/6+f00XsVWi3ha7fVUle+9qKgIp06dgpeXl1imoaEBLy8vxMfHq1wnPj5eqT4AeHt7V1q/qKgIkZGR0NfXR+fOnQEASUlJSE1NhYaGBrp06QILCwv079+fI0hE9VD5KHNQUBCSkpLQuXNneHt7i6fxpcpHmcePH4/k5GT4+PjAx8dH6f93+SjzuXPncPToUdja2qJv3764e/euWOeXX37B+++/D39/f5w5cwbHjh3DqFGjan1/6506CmyvnKqMID1vBIFeTVX5/lNTUwUAQlxcnFL57NmzBVdXV5XrNG7cWNi0aZNSWXh4uGBqaqpUtmvXLkFHR0eQyWSCpaWlcOLECXHZ5s2bBQBCixYthG3btgmJiYnCyJEjBSMjI+HevXvV3VUiqkUcZa4dHEEitbG1tUVYWJj4PiMjA3369IGOjg4MDAwAPBlledlJwWPHjoWPj89LtfEq6tWrF06fPo24uDj069cPvr6+4m+cZWVlAIDPPvsMQ4cOhbOzM9atWweZTIbo6Gh1dpuInsJRZvXjJO06ZDt3T51u7+bSAdWq37NnTzg5OSmFGwBYv349ZsyYUeVbFpw8eRI6Ojri+2+++Qbp6ek4ffo09PX1AQDp6elo1qxZtfr3KjE2NoampiYyMzOVyjMzM2Fubq5yHXNz8yrV19HRQevWrdG6dWu4u7vD3t4ea9euRWBgoHhlXfv27cX6crkcLVu2REpKSk3sGhHVgOzsbJSWlsLMzEyp3MzMDJcuXVK5TkZGhsr6GRkZSmW7d+/GiBEjUFBQAAsLC8TExMDY2BgAcP36dQBProhdsWIFbG1tERoaip49e+Kvv/6CoaFhTe1ivccRJKpxJiYm0NbWFt9fu3YNzs7OsLe3F6/OMjc3h1wuV1cX1a78EvzY2FixrKysDLGxsfDw8FC5joeHh1J9AIiJiam0/tPtFhYWAgCcnZ0hl8tx+fJlcXlxcTFu3rwJGxubF90dImpAOMpcNQxIVC3lp7WWL18OCwsLGBkZYfLkyUp3C3/6FJutrS1++eUX/PTTT5DJZBg7diyAiqfYbt++DV9fXxgYGMDQ0BCDBw/GzZs3xeWlpaUICAiAgYEBjIyM8Omnn0IQhDrY49oTEBCA1atXY8OGDbh48SImTZqE/Px8+Pv7AwD8/PwQGBgo1p8+fTr27duH0NBQXLp0CcHBwUhMTMSUKVMAAPn5+Zg3bx6OHz+OW7du4dSpUxg3bhxSU1MxbNgwAICenh4++ugjBAUFYf/+/bh8+TImTZoEAGIdIlK/uhhldnd3x9q1a9GoUSOsXbsWADjK/BQGJKq2gwcP4tq1azh48CA2bNiA9evXY/369Srrnjx5UvwNJT09HStXrqxQp7i4GN7e3mjatCmOHDmCY8eOQVdXF/369UNRUREAIDQ0FOvXr8ePP/6Io0eP4v79+9ixY0dt7matGz58OJYvX46FCxfCyckJp0+fxr59+8Qh8pSUFKSnp4v1u3fvjk2bNiEyMhKdO3fGtm3bsHPnTvEeSJqamrh06RKGDh2KNm3aYODAgbh37x6OHDmCDh06iO0sW7YMI0aMwPvvv49u3brh1q1bOHDgwGt9ypOovuEos/pxDhJVW7NmzbBq1SpoamrCwcEBAwYMQGxsLCZMmFChromJCeRyOZo0aVLpbz1btmxBWVkZ1qxZI14iv27dOhgYGODQoUPo27cvwsLCEBgYiCFDhgAAIiIi8Ntvv9XcTqUl11xbJQKQcxdYNQx4ePuZVacAmOIPAAoAl4D/9QX+92TZoZ4AkAwE/xMEhwEYNrK8/m3gxEjgxJNlCgDbOwHoVP4uH8AhYM8h4Knpb40BLNcFlk8CABmAE0B0d6CuR8+Dc+t4g0QNS0BAAMaMGQMXFxe4uroiLCyswiizlZUVQkJCADwZZfb09ERoaCgGDBiAqKgoJCYmIjIyEsCTUeYlS5Zg0KBBsLCwQHZ2NsLDwysdZba2toaNjQ2WLVsG4PUbZWZAomrr0KGD0h2iLSwscO7cuRdu78yZM7h69SqaNm2qVP748WNcu3YNubm5SE9PV3pcRqNGjeDi4tLgT7MREVVm+PDhuHv3LhYuXIiMjAw4OTlVGGXW0PjnRFD5KPP8+fMxb9482Nvbqxxl3rBhA7Kzs2FkZIRu3bqpHGVu1KgR3n//fTx69Ahubm6v5SgzAxKJ9PT0kJtb8bf6nJwc8eoz4MkT658mk8nEiX0v4uHDh3B2dsbGjRsrLCt/PAYRqZ86nh1oa2uLW7duKbUbEhKCuXPn1vwOPkuw/vPr1AKOMqsP5yCRqG3btkhKSqpQnpSUhDZt2tTadrt27YorV67A1NRUvDy9/KWvrw99fX1YWFggISFBXKekpASnTp2qtT4RkTJ13dUZAD7//HOkp6eLr6lTp9bqvhIBDEj0lEmTJuGvv/7CtGnTcPbsWVy+fBkrVqzA5s2bMWvWrFrb7ujRo2FsbIzBgwfjyJEjuHHjBg4dOoRp06bhzp07AJ6cW1+6dCl27tyJS5cu4eOPP67yfZmI6OWtWLECEyZMgL+/P9q3b4+IiAhoa2vjxx9/VFl/5cqV6NevH2bPno127dph8eLF6Nq1K1atWiXWGTVqFLy8vNCyZUt06NABK1asQF5eHs6ePavUVtOmTWFubi6+nr7PGlFt4Sm2OlTdGzfWtZYtW+Lw4cP47LPP4OXlhaKiIjg4OCA6Ohr9+vWrte1qa2vj8OHDmDNnDoYMGYIHDx7AysoKvXv3hp6eHgBg1qxZSE9Px5gxY6ChoYFx48bh3XffVXlKkIhqVvldnZ++7URV7uocEBCgVObt7V3pHfRV3dW53NKlS7F48WK0aNECo0aNwsyZM9GoEX98Ue3ivzBS0q1bN+zfv7/S5aou55feefvp+xcBUHlAlE6uNjc3x4YNGyrdbqNGjRAWFlZhW0RU+9R1V2cAmDZtGrp27QpDQ0PExcUhMDAQ6enpWLFiRQ3tHZFq9eIUW3h4OGxtbaFQKODm5oYTJ048s350dDQcHBygUCjg6OiIvXv3Ki0PDg6Gg4MDdHR00KxZM3h5eSnNXwGeTPyTyWRKr6VLl9b4vhERUeWedVdn4Mml7j179kSnTp3w0UcfITQ0FN9995143x6i2qL2gMSJf0RE9Zu67uqsipubG0pKSiqMVBPVNLUHJE78IyKq39R1V2dVTp8+DQ0NDfG5jkS1Ra0BqXzin5eXl1hWlYl/T9cHnkz8q6z+8yb+GRkZoUuXLli2bBlKSkoq7WthYSHy8vKUXkRErwt1PDswPj4eYWFhOHPmDK5fv46NGzdi5syZ+Pe///3a3bSQ6p5aJ2k3pIl/ISEhWLRo0YvsJhFRg6eOuzrL5XJERUUhODgYhYWFsLOzw8yZMytcHUdUG2SCGp/VkJaWBisrK8TFxSkNu3766af4448/KkysBp4M9W7YsAEjR44Uy77//nssWrRI6Xx3fn4+0tPTkZ2djdWrV+PAgQNISEiodFj2xx9/xIcffoiHDx9CLpdXWF5YWKg07JuXlwdra2vk5uaKl6KXe/z4MW7cuAE7OzsoFIqqfyCkPjX4LLbHJQJupN6F3bFZUDznWWyvNT6L7aXYzt3z/EpUY24qRqm7C6+fWjpG5OXlQV9fX+XP76ep9RRbQ5r4J5fLoaenp/QiIiKiV5NaAxIn/hEREVF9pPYbRQYEBGDMmDFwcXGBq6srwsLCKkz8s7KyQkhICIAnE/88PT0RGhqKAQMGICoqComJiYiMjATw5NTakiVLMGjQIFhYWCA7Oxvh4eEVJv4lJCSgV69eaNq0KeLj4znxj4iIiERqv8x/+PDhWL58ORYuXAgnJyecPn26wsS/9PR0sX75xL/IyEh07twZ27ZtUznxb+jQoWjTpg0GDhyIe/fuqZz45+npiQ4dOmDJkiWYOXOmGLJIvWQyWaWPI1AlODgYTk5O4vuxY8fCx8enxvtV7ubtNMisuuL0+cu1tg0iIlIvtY8gAcCUKVPESz+lDh06VKFs2LBh4miQlEKhwPbt25+5va5du+L48ePV7udLC9av4+1Vf4Jb+VUqe/bsQWZmJpo1a4bOnTtj4cKF6NGjRy10sqL09PSXGslbuXJlhUeZEBERVUe9CEhUfwwdOhRFRUXYsGEDWrZsiczMTMTGxuLevXt11ofKJuhXlb5+HQdRIiJ65aj9FBvVHzk5OThy5Ai++uor9OrVCzY2NnB1dUVgYCAGDRoE4Mnprx9++AH9+/dHkyZN0LJlS2zbtk2pndu3b8PX1xcGBgYwNDTE4MGDK1wd+OOPP6JDhw6Qy+WwsLBQGkGUnmKbM2cO2rRpA21tbbRs2RILFixAcXFxpfshPcW2bds2ODo6okmTJjAyMoKXlxfy8/PF5WvWrEE7zyFQtHSHw5tD8P36rUrtnUg+jy59R0LR0h0u/Ucj+bzqe3QREdGrgwGJRLq6utDV1cXOnTufecXfggULMHToUJw5cwajR4/GiBEjcPHiRQBAcXExvL290bRpUxw5cgTHjh2Drq4u+vXrh6KiIgDADz/8gMmTJ2PixIk4d+4cfv31V7Ru3brS7TVt2hTr16/HhQsXsHLlSqxevRrffPNNlfYpPT0dI0eOxLhx43Dx4kUcOnQIQ4YMEU/Bbdy4EQsXLsSSOZNx8dAv+HLuZCxY9gM2bN0FAHiYX4B3xkxH+zYtcep/GxEc8CE+WRxWpW0TEVHDxVNsJGrUqBHWr1+PCRMmICIiAl27doWnpydGjBiBTp06ifWGDRuGDz74AACwePFixMTE4LvvvsP333+PLVu2oKysDGvWrIFMJgMArFu3DgYGBjh06BD69u2LL774ArNmzcL06dPFNrt161Zpv+bPny/+3dbWFp988gmioqLw6aefPnef0tPTUVJSgiFDhsDGxgYA4OjoKC4PCgpCaGgohng6AADsWljhwl838H//+QVjfAdi047/oaxMwNrlC6FQyNGhbSvcSc/CpMAvq/KREhFRA8WAREqGDh2KAQMG4MiRIzh+/Dj+97//4euvv8aaNWswduxYAKhwzykPDw+cPn0aAHDmzBlcvXoVTZs2Varz+PFjXLt2DVlZWUhLS0Pv3r2r3KctW7bg22+/xbVr1/Dw4UOUlJRU+UadnTt3Ru/eveHo6Ahvb2/07dsX7733Hpo1a4b8/Hxcu3YN48ePxwTZP+uUlJZCv6kuAODilRvo1K41FIp/7q7u4dxJuhkiInrFMCBRBQqFAn369EGfPn2wYMECfPDBBwgKChID0rM8fPgQzs7O2LhxY4VlJiYmSs9qqor4+HiMHj0aixYtgre3N/T19REVFYXQ0NAqra+pqYmYmBjExcVh//79+O677/DZZ58hISEB2traAIDVq1fDzVa3wnpERPT64hwkeq727dsrTWqW3iLh+PHjaNeuHYAnt1C4cuUKTE1N0bp1a6WXvr4+mjZtCltb2wp3Q69MXFwcbGxs8Nlnn8HFxQX29va4detWtfovk8nQo0cPLFq0CMnJydDS0sKOHTtgZmYGS0tLXL9+Ha3tWii97FpYAQDa2dvh7MWrePz4nzlZx5POVmv7RETU8DAgkejevXt466238J///Adnz57FjRs3EB0dja+//hqDBw8W60VHR+PHH3/EX3/9haCgIJw4cUK8Cm306NEwNjbG4MGDceTIEdy4cQOHDh3CtGnTcOfOHQBPbuwYGhqKb7/9FleuXEFSUhK+++47lX2yt7dHSkoKoqKicO3aNXz77bfYsWNHlfcpISEBX375JRITE5GSkoLt27fj7t27YqBbtGgRQkJC8O3azfjr2i2cu3gF67b8Fyv+7z8AgFHv9odMBkyYvRgX/rqOvbFHsTzi5xf6fImIqOHgKba6VM+fXq6rqws3Nzd88803uHbtGoqLi2FtbY0JEyZg3rx5Yr1FixYhKioKH3/8MSwsLLB582a0b98eAKCtrY3Dhw9jzpw5GDJkCB48eAArKyv07t1bnDc0ZswYPH78GN988w0++eQTGBsb47333lPZp0GDBmHmzJmYMmUKCgsLMWDAACxYsADBwcFV2ic9PT0cPnwYYWFhyMvLg42NDUJDQ9G/f38AwAcffABtbW0s+/JzzP4iDDraTeDo0BozPnjy5G5dHW3sWh+Gj+Z+iS7eI9HeviW++mwahk6Y/aIfMxERNQAygbccfiF5eXnQ19dHbm5uhQnDjx8/xo0bN2BnZweFQqGmHtYOmUyGHTt21OqjPNQiLbnGmnpcIuBG6l3YHZsFxcPbNdbuK6ee/8JQ39nO3aPuLrxWbipGqbsLr59aOkY86+f303iKjYiIiEiCAYmIiIhIgnOQqFp4RpaIiF4HHEEiIiIikuAIUi1qaKMtWVlZyMjIQHFxMbS1tdGiRQvo6OhUWv/+/ftIS0tDYWEhFAoFmjdvDn19fXF5Wloa7t+/j6KiIshkMmhra8PKygq6uk9uylhYWIj09HTk5eWhuLgYWlpaMDQ0hIWFRbVvKFmfiF97A/v+iYjoHw33p1A91rhxYwBAQUGBmntSdffv38ft27dhaWmJ9u3bo0mTJvjrr79QXFyssv7Dhw9x/fp1GBsbo3379jAwMMDVq1fx6NEjsY5cLkeLFi3QoUMHODg4QC6X48qVK2Kbjx8/hiAIsLGxQceOHWFtbY27d+8iNTW1Tva5thQUAygtQuPH99TdFSIiekEcQaoFmpqaMDAwQFZWFoAn9wYqf3BrfZWeno5mzZqJoztmZmbIyclBeno6TE1NK9RPS0uDrq4uDAwMAABGRkbIyclBWloarKye3IW6fPRJEATIZDKYmJggOzsbubm50NXVhVwuh4WFhVhHoVDAyMgIf//9N0xMTOpgr59S8vKjPYLwJBxl3c+Bwa3/QbP00fNXIiKieokBqZaYm5sDgBiS6jNBEHD79m2YmJigsPCfR2o8ePAAubm5So8ZKXfnzh3o6enhxo0bYlleXh4yMjJQVFSkchsPHjxATk4OFApFpc86y8nJwaNHj8RRuDqTc7dm2iktgsGt/8H8yqaaaY+IiNSCAamWyGQyWFhYwNTUtNLTVPVFVlYWPvroI2zevBkdOnQQy7dt24aTJ09i69atFdYZNGgQQkJC8M4774hlmzZtQnh4OI4dOyaWHTx4ELNmzcKjR49gYmKC8PBwtG7dWmU/bt26hQkTJuDTTz9F9+7da3APq2DVsJdvQxDQ+PE9jhwREb0CGJBqmaamZr1/MnyjRo3EB8A+fefvBw8eIDMzU+XdwG/duoXi4mKlZY8fP8adO3eUyt588038+uuvyM7OxurVq+Hr64uEhIQKp+1SU1MxYMAA9OzZE35+fjW9i8/HO14TEdFTOEmbYGxsDE1NTWRmZiqVZ2ZmiqcKpczNzatUX0dHB61bt4a7uzvWrl2LRo0aYe3atUp10tLS0KtXL3Tv3h2RkZE1sEdEREQvhwGJoKWlBWdnZ8TGxoplZWVliI2NhYeHh8p1PDw8lOoDQExMTKX1n2736XlOqamp6NmzJ5ydnbFu3boGfXk/ERG9OniKjQAAAQEBGDNmDFxcXODq6oqwsDDk5+fD398fAODn5wcrKyuEhIQAAKZPnw5PT0+EhoZiwIABiIqKQmJiojgClJ+fjyVLlmDQoEGwsLBAdnY2wsPDkZqaimHDnsz3KQ9HNjY2WL58Oe7e/WeidGUjV0RERHVBJjS0uxnWE1V9GvCLUNdTuvNO7ULeie0ozf8bWqYtYej1IeSWbQEAGZvmopG+GYwHzBTr5186ipwjP6MkNxONm1miWU9/NGnVDQAglBTh7q5lKEq7jNJHedBsogctc3vodx8OuUUbAMDDc7/j3t4wlX2xmbO7dndWgk/qVoNaelL360Jdx4nXFY8RalBLx4iq/vzmCBKJ9JwHQs95oMpl5qOWVijTcXgDOg5vqKwva6QF03c/e+b2dB29oOvoVf2OEhER1TJO+CAiIiKSYEAiIiIikmBAIiIiIpJgQCIiIiKSYEAiIiIikmBAIiIiIpJgQCIiIiKSYEAiIiIikmBAIiIiIpJgQCIiIiKSYEAiIiIikmBAIiIiIpJgQCIiIiKSqBcBKTw8HLa2tlAoFHBzc8OJEyeeWT86OhoODg5QKBRwdHTE3r17lZYHBwfDwcEBOjo6aNasGby8vJCQkKBU5/79+xg9ejT09PRgYGCA8ePH4+HDhzW+b0RERNTwqD0gbdmyBQEBAQgKCkJSUhI6d+4Mb29vZGVlqawfFxeHkSNHYvz48UhOToaPjw98fHxw/vx5sU6bNm2watUqnDt3DkePHoWtrS369u2Lu3fvinVGjx6NP//8EzExMdi9ezcOHz6MiRMn1vr+EhERUf0nEwRBUGcH3Nzc0K1bN6xatQoAUFZWBmtra0ydOhVz586tUH/48OHIz8/H7t27xTJ3d3c4OTkhIiJC5Tby8vKgr6+P33//Hb1798bFixfRvn17nDx5Ei4uLgCAffv24e2338adO3dgaWn53H6Xt5mbmws9Pb0X2fVK2c7dU6Pt0fPdVIxSdxdeP8G56u5Bg8bjRN3iMUINaukYUdWf32odQSoqKsKpU6fg5eUllmloaMDLywvx8fEq14mPj1eqDwDe3t6V1i8qKkJkZCT09fXRuXNnsQ0DAwMxHAGAl5cXNDQ0KpyKK1dYWIi8vDylFxEREb2a1BqQsrOzUVpaCjMzM6VyMzMzZGRkqFwnIyOjSvV3794NXV1dKBQKfPPNN4iJiYGxsbHYhqmpqVL9Ro0awdDQsNLthoSEQF9fX3xZW1tXa1+JiIio4VD7HKTa0qtXL5w+fRpxcXHo168ffH19K53XVBWBgYHIzc0VX7dv367B3hIREVF9otaAZGxsDE1NTWRmZiqVZ2ZmwtzcXOU65ubmVaqvo6OD1q1bw93dHWvXrkWjRo2wdu1asQ1pWCopKcH9+/cr3a5cLoeenp7Si4iIiF5Nag1IWlpacHZ2RmxsrFhWVlaG2NhYeHh4qFzHw8NDqT4AxMTEVFr/6XYLCwvFNnJycnDq1Clx+YEDB1BWVgY3N7cX3R0iIiJ6RTRSdwcCAgIwZswYuLi4wNXVFWFhYcjPz4e/vz8AwM/PD1ZWVggJCQEATJ8+HZ6enggNDcWAAQMQFRWFxMREREZGAgDy8/OxZMkSDBo0CBYWFsjOzkZ4eDhSU1MxbNgwAEC7du3Qr18/TJgwARERESguLsaUKVMwYsSIKl3BRkRERK82tQek4cOH4+7du1i4cCEyMjLg5OSEffv2iROxU1JSoKHxz0BX9+7dsWnTJsyfPx/z5s2Dvb09du7ciY4dOwIANDU1cenSJWzYsAHZ2dkwMjJCt27dcOTIEXTo0EFsZ+PGjZgyZQp69+4NDQ0NDB06FN9++23d7jwRERHVS2q/D1JDxfsgvVp4jxM14H2QXgqPE3WLxwg1eJ3vg0RERERUHzEgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSdSLgBQeHg5bW1soFAq4ubnhxIkTz6wfHR0NBwcHKBQKODo6Yu/eveKy4uJizJkzB46OjtDR0YGlpSX8/PyQlpam1IatrS1kMpnSa+nSpbWyf0RERNSwqD0gbdmyBQEBAQgKCkJSUhI6d+4Mb29vZGVlqawfFxeHkSNHYvz48UhOToaPjw98fHxw/vx5AEBBQQGSkpKwYMECJCUlYfv27bh8+TIGDRpUoa3PP/8c6enp4mvq1Km1uq9ERETUMMgEQRDU2QE3Nzd069YNq1atAgCUlZXB2toaU6dOxdy5cyvUHz58OPLz87F7926xzN3dHU5OToiIiFC5jZMnT8LV1RW3bt1CixYtADwZQZoxYwZmzJjxQv3Oy8uDvr4+cnNzoaen90JtVMZ27p4abY+e76ZilLq78PoJzlV3Dxo0HifqFo8RalBLx4iq/vxW6whSUVERTp06BS8vL7FMQ0MDXl5eiI+PV7lOfHy8Un0A8Pb2rrQ+AOTm5kImk8HAwECpfOnSpTAyMkKXLl2wbNkylJSUvPjOEBER0SujkTo3np2djdLSUpiZmSmVm5mZ4dKlSyrXycjIUFk/IyNDZf3Hjx9jzpw5GDlypFJSnDZtGrp27QpDQ0PExcUhMDAQ6enpWLFihcp2CgsLUVhYKL7Py8ur0j4SERFRw6PWgFTbiouL4evrC0EQ8MMPPygtCwgIEP/eqVMnaGlp4cMPP0RISAjkcnmFtkJCQrBo0aJa7zMRERGpn1pPsRkbG0NTUxOZmZlK5ZmZmTA3N1e5jrm5eZXql4ejW7duISYm5rnzhNzc3FBSUoKbN2+qXB4YGIjc3Fzxdfv27efsHRERETVUag1IWlpacHZ2RmxsrFhWVlaG2NhYeHh4qFzHw8NDqT4AxMTEKNUvD0dXrlzB77//DiMjo+f25fTp09DQ0ICpqanK5XK5HHp6ekovIiIiejWp/RRbQEAAxowZAxcXF7i6uiIsLAz5+fnw9/cHAPj5+cHKygohISEAgOnTp8PT0xOhoaEYMGAAoqKikJiYiMjISABPwtF7772HpKQk7N69G6WlpeL8JENDQ2hpaSE+Ph4JCQno1asXmjZtivj4eMycORP//ve/0axZM/V8EERERFRvqD0gDR8+HHfv3sXChQuRkZEBJycn7Nu3T5yInZKSAg2Nfwa6unfvjk2bNmH+/PmYN28e7O3tsXPnTnTs2BEAkJqail9//RUA4OTkpLStgwcPomfPnpDL5YiKikJwcDAKCwthZ2eHmTNnKs1LIiIioteX2u+D1FDxPkivFt7jRA14H6SXwuNE3eIxQg1e5/sgEREREdVHDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEvUiIIWHh8PW1hYKhQJubm44ceLEM+tHR0fDwcEBCoUCjo6O2Lt3r7isuLgYc+bMgaOjI3R0dGBpaQk/Pz+kpaUptXH//n2MHj0aenp6MDAwwPjx4/Hw4cNa2T8iIiJqWNQekLZs2YKAgAAEBQUhKSkJnTt3hre3N7KyslTWj4uLw8iRIzF+/HgkJyfDx8cHPj4+OH/+PACgoKAASUlJWLBgAZKSkrB9+3ZcvnwZgwYNUmpn9OjR+PPPPxETE4Pdu3fj8OHDmDhxYq3vLxEREdV/MkEQhKpWPnHiBJydnaGpqalyeWFhIf773//C19e3yh1wc3NDt27dsGrVKgBAWVkZrK2tMXXqVMydO7dC/eHDhyM/Px+7d+8Wy9zd3eHk5ISIiAiV2zh58iRcXV1x69YttGjRAhcvXkT79u1x8uRJuLi4AAD27duHt99+G3fu3IGlpeVz+52Xlwd9fX3k5uZCT0+vyvtbFbZz99Roe/R8NxWj1N2F109wrrp70KDxOFG3eIxQg1o6RlT153e1RpA8PDxw79498b2enh6uX78uvs/JycHIkSOr3F5RURFOnToFLy+vfzqkoQEvLy/Ex8erXCc+Pl6pPgB4e3tXWh8AcnNzIZPJYGBgILZhYGAghiMA8PLygoaGBhISElS2UVhYiLy8PKUXERERvZqqFZCkg02qBp+qMSCF7OxslJaWwszMTKnczMwMGRkZKtfJyMioVv3Hjx9jzpw5GDlypJgUMzIyYGpqqlSvUaNGMDQ0rLSdkJAQ6Ovriy9ra+sq7SMRERE1PDU+B0kmk9V0ky+suLgYvr6+EAQBP/zww0u1FRgYiNzcXPF1+/btGuolERER1TeN1LlxY2NjaGpqIjMzU6k8MzMT5ubmKtcxNzevUv3ycHTr1i0cOHBA6Tyjubl5hUngJSUluH//fqXblcvlkMvlVd43IiIiariqPYJ04cIFnD17FmfPnoUgCLh06ZL4/s8//6xWW1paWnB2dkZsbKxYVlZWhtjYWHh4eKhcx8PDQ6k+AMTExCjVLw9HV65cwe+//w4jI6MKbeTk5ODUqVNi2YEDB1BWVgY3N7dq7QMRERG9eqo9gtS7d2+leUbvvPMOgCen1gRBqPYptoCAAIwZMwYuLi5wdXVFWFgY8vPz4e/vDwDw8/ODlZUVQkJCAADTp0+Hp6cnQkNDMWDAAERFRSExMRGRkZEAnoSj9957D0lJSdi9ezdKS0vFeUWGhobQ0tJCu3bt0K9fP0yYMAEREREoLi7GlClTMGLEiCpdwUZERESvtmoFpBs3btR4B4YPH467d+9i4cKFyMjIgJOTE/bt2ydOxE5JSYGGxj8DXd27d8emTZswf/58zJs3D/b29ti5cyc6duwIAEhNTcWvv/4KAHByclLa1sGDB9GzZ08AwMaNGzFlyhT07t0bGhoaGDp0KL799tsa3z8iIiJqeKp1H6SqOH/+vBhWXmW8D9Krhfc4UQPeB+ml8DhRt3iMUIOGdB+kyjx48ACRkZFwdXVF586da6JJIiIiIrV5qYB0+PBhjBkzBhYWFli+fDneeustHD9+vKb6RkRERKQW1Z6knZGRgfXr12Pt2rXIy8uDr68vCgsLsXPnTrRv3742+khERERUp6o1gjRw4EC0bdsWZ8+eRVhYGNLS0vDdd9/VVt+IiIiI1KJaI0j/+9//MG3aNEyaNAn29va11SciIiIitarWCNLRo0fx4MEDODs7w83NDatWrUJ2dnZt9Y2IiIhILaoVkNzd3bF69Wqkp6fjww8/RFRUFCwtLVFWVoaYmBg8ePCgtvpJREREVGde6Co2HR0djBs3DkePHsW5c+cwa9YsLF26FKamphg0aFBN95GIiIioTr30fZDatm2Lr7/+Gnfu3EFUVFS1HzVCREREVN9Ua5L2uHHjnltH+mBYIiIiooamWgFp/fr1sLGxQZcuXVDZE0o4gkREREQNXbUC0qRJk7B582bcuHED/v7++Pe//w1DQ8Pa6hsRERGRWlRrDlJ4eDjS09Px6aefYteuXbC2toavry9+++23SkeUiIiIiBqaak/SlsvlGDlyJGJiYnDhwgV06NABH3/8MWxtbfHw4cPa6CMRERFRnXqpq9g0NDQgk8kgCAJKS0trqk9EREREalXtgFRYWIjNmzejT58+aNOmDc6dO4dVq1YhJSUFurq6tdFHIiIiojpVrUnaH3/8MaKiomBtbY1x48Zh8+bNMDY2rq2+EREREalFtQJSREQEWrRogZYtW+KPP/7AH3/8obLe9u3ba6RzREREROpQrYDk5+fH+xwRERHRK6/aN4okIiIietW99LPYiIiIiF41DEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBIMSEREREQSDEhEREREEgxIRERERBJqD0jh4eGwtbWFQqGAm5sbTpw48cz60dHRcHBwgEKhgKOjI/bu3au0fPv27ejbty+MjIwgk8lw+vTpCm307NkTMplM6fXRRx/V5G4RERFRA6bWgLRlyxYEBAQgKCgISUlJ6Ny5M7y9vZGVlaWyflxcHEaOHInx48cjOTkZPj4+8PHxwfnz58U6+fn5eOONN/DVV189c9sTJkxAenq6+Pr6669rdN+IiIio4VJrQFqxYgUmTJgAf39/tG/fHhEREdDW1saPP/6osv7KlSvRr18/zJ49G+3atcPixYvRtWtXrFq1Sqzz/vvvY+HChfDy8nrmtrW1tWFubi6+9PT0anTfiIiIqOFSW0AqKirCqVOnlIKMhoYGvLy8EB8fr3Kd+Pj4CsHH29u70vrPsnHjRhgbG6Njx44IDAxEQUHBM+sXFhYiLy9P6UVERESvpkbq2nB2djZKS0thZmamVG5mZoZLly6pXCcjI0Nl/YyMjGpte9SoUbCxsYGlpSXOnj2LOXPm4PLly9i+fXul64SEhGDRokXV2g4RERE1TGoLSOo0ceJE8e+Ojo6wsLBA7969ce3aNbRq1UrlOoGBgQgICBDf5+Xlwdrautb7SkRERHVPbQHJ2NgYmpqayMzMVCrPzMyEubm5ynXMzc2rVb+q3NzcAABXr16tNCDJ5XLI5fKX2g4RERE1DGqbg6SlpQVnZ2fExsaKZWVlZYiNjYWHh4fKdTw8PJTqA0BMTEyl9auq/FYAFhYWL9UOERERvRrUeootICAAY8aMgYuLC1xdXREWFob8/Hz4+/sDAPz8/GBlZYWQkBAAwPTp0+Hp6YnQ0FAMGDAAUVFRSExMRGRkpNjm/fv3kZKSgrS0NADA5cuXAUC8Wu3atWvYtGkT3n77bRgZGeHs2bOYOXMm3nzzTXTq1KmOPwEiIiKqj9QakIYPH467d+9i4cKFyMjIgJOTE/bt2ydOxE5JSYGGxj+DXN27d8emTZswf/58zJs3D/b29ti5cyc6duwo1vn111/FgAUAI0aMAAAEBQUhODgYWlpa+P3338UwZm1tjaFDh2L+/Pl1tNdERERU38kEQRDU3YmGKC8vD/r6+sjNza3xeyjZzt1To+3R891UjFJ3F14/wbnq7kGDxuNE3eIxQg1q6RhR1Z/fan/UCBEREVF9w4BEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkwYBEREREJMGARERERCTBgEREREQkofaAFB4eDltbWygUCri5ueHEiRPPrB8dHQ0HBwcoFAo4Ojpi7969Ssu3b9+Ovn37wsjICDKZDKdPn67QxuPHjzF58mQYGRlBV1cXQ4cORWZmZk3uFhERETVgag1IW7ZsQUBAAIKCgpCUlITOnTvD29sbWVlZKuvHxcVh5MiRGD9+PJKTk+Hj4wMfHx+cP39erJOfn4833ngDX331VaXbnTlzJnbt2oXo6Gj88ccfSEtLw5AhQ2p8/4iIiKhhkgmCIKhr425ubujWrRtWrVoFACgrK4O1tTWmTp2KuXPnVqg/fPhw5OfnY/fu3WKZu7s7nJycEBERoVT35s2bsLOzQ3JyMpycnMTy3NxcmJiYYNOmTXjvvfcAAJcuXUK7du0QHx8Pd3f3KvU9Ly8P+vr6yM3NhZ6eXnV3/Zls5+6p0fbo+W4qRqm7C6+f4Fx196BB43GibvEYoQa1dIyo6s9vtY0gFRUV4dSpU/Dy8vqnMxoa8PLyQnx8vMp14uPjleoDgLe3d6X1VTl16hSKi4uV2nFwcECLFi2e2U5hYSHy8vKUXkRERPRqUltAys7ORmlpKczMzJTKzczMkJGRoXKdjIyMatWvrA0tLS0YGBhUq52QkBDo6+uLL2tr6ypvk4iIiBoWtU/SbigCAwORm5srvm7fvq3uLhEREVEtaaSuDRsbG0NTU7PC1WOZmZkwNzdXuY65uXm16lfWRlFREXJycpRGkZ7Xjlwuh1wur/J2iIiIqOFS2wiSlpYWnJ2dERsbK5aVlZUhNjYWHh4eKtfx8PBQqg8AMTExldZXxdnZGY0bN1Zq5/Lly0hJSalWO0RERPTqUtsIEgAEBARgzJgxcHFxgaurK8LCwpCfnw9/f38AgJ+fH6ysrBASEgIAmD59Ojw9PREaGooBAwYgKioKiYmJiIyMFNu8f/8+UlJSkJaWBuBJ+AGejByZm5tDX18f48ePR0BAAAwNDaGnp4epU6fCw8OjylewERER0atNrQFp+PDhuHv3LhYuXIiMjAw4OTlh37594kTslJQUaGj8M8jVvXt3bNq0CfPnz8e8efNgb2+PnTt3omPHjmKdX3/9VQxYADBixAgAQFBQEIKDgwEA33zzDTQ0NDB06FAUFhbC29sb33//fR3sMRERETUEar0PUkPG+yC9WniPEzXgfZBeCo8TdYvHCDV4Xe+DRERERFRfMSARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSTAgEREREUkwIBERERFJMCARERERSdSLgBQeHg5bW1soFAq4ubnhxIkTz6wfHR0NBwcHKBQKODo6Yu/evUrLBUHAwoULYWFhgSZNmsDLywtXrlxRqmNrawuZTKb0Wrp0aY3vGxERETU8ag9IW7ZsQUBAAIKCgpCUlITOnTvD29sbWVlZKuvHxcVh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\n"},"metadata":{}}]}]}