From 66afb8746fee2155da58b6c8b6ecc1049d70166c Mon Sep 17 00:00:00 2001 From: hitesh1292 <60049443+hitesh1292@users.noreply.github.com> Date: Fri, 15 May 2020 18:54:31 -0400 Subject: [PATCH] Add files via upload --- Data_Cleaning_EDA.ipynb | 952 +++++++++ IST718_USAccidents_Project_Report.pdf | Bin 0 -> 1407234 bytes LR_Binary.ipynb | 725 +++++++ LR_Multiclass.ipynb | 583 ++++++ LR_Multiclass_Bal .ipynb | 1059 ++++++++++ RFDT_Multiclass.ipynb | 2168 +++++++++++++++++++ RFDT_Multiclass_Bal.ipynb | 2770 +++++++++++++++++++++++++ RF_DT_GBT_Binary.ipynb | 1596 ++++++++++++++ RF_DT_GBT_LR_Binary_Bal.ipynb | 2548 +++++++++++++++++++++++ StringIndexing_OHE_Conversion.ipynb | 504 +++++ Undersampling_Oversampling.ipynb | 461 ++++ 11 files changed, 13366 insertions(+) create mode 100644 Data_Cleaning_EDA.ipynb create mode 100644 IST718_USAccidents_Project_Report.pdf create mode 100644 LR_Binary.ipynb create mode 100644 LR_Multiclass.ipynb create mode 100644 LR_Multiclass_Bal .ipynb create mode 100644 RFDT_Multiclass.ipynb create mode 100644 RFDT_Multiclass_Bal.ipynb create mode 100644 RF_DT_GBT_Binary.ipynb create mode 100644 RF_DT_GBT_LR_Binary_Bal.ipynb create mode 100644 StringIndexing_OHE_Conversion.ipynb create mode 100644 Undersampling_Oversampling.ipynb diff --git a/Data_Cleaning_EDA.ipynb b/Data_Cleaning_EDA.ipynb new file mode 100644 index 0000000..4f8aa6f --- /dev/null +++ b/Data_Cleaning_EDA.ipynb @@ -0,0 +1,952 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql import SparkSession\n", + "spark = SparkSession.builder.getOrCreate()\n", + "sc = spark.sparkContext\n", + "from pyspark.sql import Row\n", + "import numpy as np\n", + "import pandas as pd\n", + "from pyspark.sql.types import *\n", + "from pyspark.sql.functions import *\n", + "import matplotlib.pyplot as plt\n", + "from pyspark.sql import functions as fn\n", + "from pyspark.ml import feature, regression, evaluation, Pipeline\n", + "import seaborn as sns\n", + "from pyspark.ml.feature import VectorAssembler\n", + "from pyspark.ml import Pipeline\n", + "from pyspark.ml.regression import LinearRegression\n", + "from pyspark.ml.stat import Correlation\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Do not delete or change this cell\n", + "\n", + "import os\n", + "\n", + "# Define a function to determine if we are running on data bricks\n", + "# Return true if running in the data bricks environment, false otherwise\n", + "def is_databricks():\n", + " # get the databricks runtime version\n", + " db_env = os.getenv(\"DATABRICKS_RUNTIME_VERSION\")\n", + " \n", + " # if running on data bricks\n", + " if db_env != None:\n", + " return True\n", + " else:\n", + " return False\n", + "\n", + "# Define a function to read the data file. The full path data file name is constructed\n", + "# by checking runtime environment variables to determine if the runtime environment is \n", + "# databricks, or a student's personal computer. The full path file name is then\n", + "# constructed based on the runtime env.\n", + "# \n", + "# Params\n", + "# data_file_name: The base name of the data file to load\n", + "# \n", + "# Returns the full path file name based on the runtime env\n", + "#\n", + "def get_training_filename(data_file_name): \n", + " # if running on data bricks\n", + " if is_databricks():\n", + " # build the full path file name assuming data brick env\n", + " full_path_name = \"/FileStore/tables/%s\" % data_file_name\n", + " # else the data is assumed to be in the same dir as this notebook\n", + " else:\n", + " # Assume the student is running on their own computer and load the data\n", + " # file from the same dir as this notebook\n", + " full_path_name = data_file_name\n", + " \n", + " # return the full path file name to the caller\n", + " return full_path_name" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Reading the csv file in us_acci dataframe\n", + "us_acci = spark.read.csv(get_training_filename('US_Accidents.csv'), header = True, inferSchema = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape is (981531, 49)\n" + ] + } + ], + "source": [ + "# Shape of the spark dataframe\n", + "\n", + "print('Shape is ',(us_acci.count(),len(us_acci.columns)))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Renaming the columns names which contain brackets for ease of usage\n", + "\n", + "us_acci = us_acci.select('*').withColumnRenamed('Distance(mi)','Distance')\\\n", + " .withColumnRenamed('Temperature(F)', 'Temperature').withColumnRenamed('Wind_Chill(F)', 'Wind_Chill')\\\n", + " .withColumnRenamed('Humidity(%)', 'Humidity').withColumnRenamed('Pressure(in)', 'Pressure')\\\n", + " .withColumnRenamed('Visibility(mi)', 'Visibility').withColumnRenamed('Wind_Speed(mph)', 'Wind_Speed')\\\n", + " .withColumnRenamed('Precipitation(in)', 'Precipitation')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "root\n", + " |-- ID: string (nullable = true)\n", + " |-- Source: string (nullable = true)\n", + " |-- TMC: double (nullable = true)\n", + " |-- Severity: integer (nullable = true)\n", + " |-- Start_Time: timestamp (nullable = true)\n", + " |-- End_Time: timestamp (nullable = true)\n", + " |-- Start_Lat: double (nullable = true)\n", + " |-- Start_Lng: double (nullable = true)\n", + " |-- End_Lat: double (nullable = true)\n", + " |-- End_Lng: double (nullable = true)\n", + " |-- Distance: double (nullable = true)\n", + " |-- Description: string (nullable = true)\n", + " |-- Number: double (nullable = true)\n", + " |-- Street: string (nullable = true)\n", + " |-- Side: string (nullable = true)\n", + " |-- City: string (nullable = true)\n", + " |-- County: string (nullable = true)\n", + " |-- State: string (nullable = true)\n", + " |-- Zipcode: string (nullable = true)\n", + " |-- Country: string (nullable = true)\n", + " |-- Timezone: string (nullable = true)\n", + " |-- Airport_Code: string (nullable = true)\n", + " |-- Weather_Timestamp: timestamp (nullable = true)\n", + " |-- Temperature: double (nullable = true)\n", + " |-- Wind_Chill: double (nullable = true)\n", + " |-- Humidity: double (nullable = true)\n", + " |-- Pressure: double (nullable = true)\n", + " |-- Visibility: double (nullable = true)\n", + " |-- Wind_Direction: string (nullable = true)\n", + " |-- Wind_Speed: double (nullable = true)\n", + " |-- Precipitation: double (nullable = true)\n", + " |-- Weather_Condition: string (nullable = true)\n", + " |-- Amenity: boolean (nullable = true)\n", + " |-- Bump: boolean (nullable = true)\n", + " |-- Crossing: boolean (nullable = true)\n", + " |-- Give_Way: boolean (nullable = true)\n", + " |-- Junction: boolean (nullable = true)\n", + " |-- No_Exit: boolean (nullable = true)\n", + " |-- Railway: boolean (nullable = true)\n", + " |-- Roundabout: boolean (nullable = true)\n", + " |-- Station: boolean (nullable = true)\n", + " |-- Stop: boolean (nullable = true)\n", + " |-- Traffic_Calming: boolean (nullable = true)\n", + " |-- Traffic_Signal: boolean (nullable = true)\n", + " |-- Turning_Loop: boolean (nullable = true)\n", + " |-- Sunrise_Sunset: string (nullable = true)\n", + " |-- Civil_Twilight: string (nullable = true)\n", + " |-- Nautical_Twilight: string (nullable = true)\n", + " |-- Astronomical_Twilight: string (nullable = true)\n", + "\n" + ] + } + ], + "source": [ + "# Schema of dataframe with datatypes of all columns\n", + "\n", + "us_acci.printSchema()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Summary of all numerical variables in the dataset to find the skewness, outliers, mean, median\n", + "\n", + "us_acci.describe().toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Columns to be dropped initially as a list\n", + "drop_col = ['ID','End_Lat','End_Lng','Description','Number','Street','Zipcode','Airport_Code','Country','Weather_Timestamp','Wind_Chill','Turning_Loop']" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping columns from the original dataset\n", + "\n", + "us_acci = us_acci.drop(*(drop_col))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------+------+--------+----------+--------+---------+---------+--------+----+----+------+-----+--------+-----------+--------+--------+----------+--------------+----------+-------------+-----------------+-------+----+--------+--------+--------+-------+-------+----------+-------+----+---------------+--------------+--------------+--------------+-----------------+---------------------+\n", + "|Source| TMC|Severity|Start_Time|End_Time|Start_Lat|Start_Lng|Distance|Side|City|County|State|Timezone|Temperature|Humidity|Pressure|Visibility|Wind_Direction|Wind_Speed|Precipitation|Weather_Condition|Amenity|Bump|Crossing|Give_Way|Junction|No_Exit|Railway|Roundabout|Station|Stop|Traffic_Calming|Traffic_Signal|Sunrise_Sunset|Civil_Twilight|Nautical_Twilight|Astronomical_Twilight|\n", + "+------+------+--------+----------+--------+---------+---------+--------+----+----+------+-----+--------+-----------+--------+--------+----------+--------------+----------+-------------+-----------------+-------+----+--------+--------+--------+-------+-------+----------+-------+----+---------------+--------------+--------------+--------------+-----------------+---------------------+\n", + "| 0|240595| 0| 0| 0| 0| 0| 0| 0| 30| 0| 0| 1069| 18494| 19485| 15870| 21643| 14882| 145268| 658958| 21750| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 37| 37| 37| 37|\n", + "+------+------+--------+----------+--------+---------+---------+--------+----+----+------+-----+--------+-----------+--------+--------+----------+--------------+----------+-------------+-----------------+-------+----+--------+--------+--------+-------+-------+----------+-------+----+---------------+--------------+--------------+--------------+-----------------+---------------------+\n", + "\n" + ] + } + ], + "source": [ + "# Checking null values in all the columns\n", + "\n", + "from pyspark.sql.functions import isnan, isnull, when, count, col\n", + "\n", + "us_acci.select([count(when(isnull(c), c)).alias(c) for c in us_acci.columns]).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Replacing same Wind_Direction named with different string N and North same\n", + "\n", + "us_acci = us_acci.withColumn('Wind_Direction', when(us_acci.Wind_Direction == 'E', 'East')\\\n", + " .when(us_acci.Wind_Direction == 'W', 'West')\\\n", + " .when(us_acci.Wind_Direction == 'N', 'North')\\\n", + " .when(us_acci.Wind_Direction == 'S', 'South')\\\n", + " .when(us_acci.Wind_Direction == 'VAR', 'Variable')\\\n", + " .when(us_acci.Wind_Direction == 'CALM', 'Calm')\\\n", + " .otherwise(us_acci.Wind_Direction))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Replacing same Weather_Condition named with different string Light Rain Shower and Light Rain Showers same\n", + "\n", + "us_acci = us_acci.withColumn('Weather_Condition', when(us_acci.Weather_Condition == 'Light Rain Shower', 'Light Rain Showers')\\\n", + " .when(us_acci.Weather_Condition == 'Light Snow Shower', 'Light Snow Showers')\\\n", + " .when(us_acci.Weather_Condition == 'Rain Shower', 'Rain Showers')\\\n", + " .otherwise(us_acci.Weather_Condition))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping Null rows from City Column as there are only 30 rows with City = Null\n", + "\n", + "us_acci = us_acci.where(col(\"city\").isNotNull())" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping Null rows from Timezone Column \n", + "\n", + "us_acci = us_acci.where(col(\"Timezone\").isNotNull())" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Clipping Temperature extreme values to suppress outliers\n", + "\n", + "lower = -30\n", + "upper = 115\n", + "us_acci = us_acci.withColumn('Temperature', when(us_acci.Temperature > upper, upper)\\\n", + " .when(us_acci.Temperature < lower, lower).otherwise(us_acci.Temperature).alias('Temperature'))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Distance > 100 rows dropped\n", + "us_acci = us_acci.where(us_acci.Distance <100)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Clipping Visibility extreme values to suppress outliers \n", + "\n", + "upper = 20\n", + "us_acci = us_acci.withColumn('Visibility', when(us_acci.Visibility > upper, upper)\\\n", + " .otherwise(us_acci.Visibility).alias('Visibility'))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Clipping Wind_Speed extreme values to suppress outliers \n", + "upper = 40\n", + "us_acci = us_acci.withColumn('Wind_Speed', when(us_acci.Wind_Speed > upper, upper)\\\n", + " .otherwise(us_acci.Wind_Speed).alias('Wind_Speed'))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Replacing Null values in Precipitation with 0\n", + "\n", + "us_acci = us_acci.withColumn('Precipitation', when(us_acci.Precipitation.isNull(), 0).otherwise(us_acci.Precipitation))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "#replacing missing values in categorical attributes with the mode of the corresponding variables\n", + "\n", + "for col_name in ['Wind_Direction', 'Weather_Condition']:\n", + " common = us_acci.dropna().groupBy(col_name).agg(fn.count('*')).orderBy('count(1)', ascending = False).first()[col_name]\n", + " us_acci = us_acci.withColumn(col_name, when(isnull(col_name), common).otherwise(us_acci[col_name]))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "#replacing missing values in numerical attributes with the median of the corresponding variables\n", + "\n", + "for col_name in ['Temperature', 'Humidity', 'Pressure', 'Visibility', 'Wind_Speed']:\n", + " median = us_acci.dropna().approxQuantile(col_name, [0.5], 0.00)[0]\n", + " us_acci = us_acci.withColumn(col_name, when(isnull(col_name), median).otherwise(us_acci[col_name]))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Removing Null values in last 4 columns \n", + "\n", + "us_acci = us_acci.filter(us_acci.Sunrise_Sunset.isNotNull())\n", + "\n", + "us_acci = us_acci.filter(us_acci.Civil_Twilight.isNotNull())\n", + "\n", + "us_acci = us_acci.filter(us_acci.Nautical_Twilight.isNotNull())\n", + "\n", + "us_acci = us_acci.filter(us_acci.Astronomical_Twilight.isNotNull())" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Adding Month of Year, Day of Week , Week of Year and Hour of the Day Column from Start Time\n", + "\n", + "us_acci = us_acci.withColumn(\"Start_Time\",to_timestamp(col(\"Start_Time\"))).withColumn(\"month_of_year\", date_format(col(\"Start_Time\"), \"MMMM\")).withColumn(\"day_of_week\", date_format(col(\"Start_Time\"), \"EEEE\")).withColumn(\"hour_day\", date_format(col(\"Start_Time\"), \"H\")).withColumn(\"week_of_year\", date_format(col(\"Start_Time\"), \"w\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------+------+--------+----------+--------+---------+---------+--------+----+----+------+-----+--------+-----------+--------+--------+----------+--------------+----------+-------------+-----------------+-------+----+--------+--------+--------+-------+-------+----------+-------+----+---------------+--------------+--------------+--------------+-----------------+---------------------+-------------+-----------+--------+------------+\n", + "|Source| TMC|Severity|Start_Time|End_Time|Start_Lat|Start_Lng|Distance|Side|City|County|State|Timezone|Temperature|Humidity|Pressure|Visibility|Wind_Direction|Wind_Speed|Precipitation|Weather_Condition|Amenity|Bump|Crossing|Give_Way|Junction|No_Exit|Railway|Roundabout|Station|Stop|Traffic_Calming|Traffic_Signal|Sunrise_Sunset|Civil_Twilight|Nautical_Twilight|Astronomical_Twilight|month_of_year|day_of_week|hour_day|week_of_year|\n", + "+------+------+--------+----------+--------+---------+---------+--------+----+----+------+-----+--------+-----------+--------+--------+----------+--------------+----------+-------------+-----------------+-------+----+--------+--------+--------+-------+-------+----------+-------+----+---------------+--------------+--------------+--------------+-----------------+---------------------+-------------+-----------+--------+------------+\n", + "| 0|240120| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0|\n", + "+------+------+--------+----------+--------+---------+---------+--------+----+----+------+-----+--------+-----------+--------+--------+----------+--------------+----------+-------------+-----------------+-------+----+--------+--------+--------+-------+-------+----------+-------+----+---------------+--------------+--------------+--------------+-----------------+---------------------+-------------+-----------+--------+------------+\n", + "\n" + ] + } + ], + "source": [ + "# Checking null values in all the columns\n", + "\n", + "from pyspark.sql.functions import isnan, isnull, when, count, col\n", + "\n", + "us_acci.select([count(when(isnull(c), c)).alias(c) for c in us_acci.columns]).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape is (980416, 41)\n" + ] + } + ], + "source": [ + "# Shape of the spark dataframe\n", + "\n", + "print('Shape is ',(us_acci.count(),len(us_acci.columns)))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "us_acci.toPandas().to_csv(\"Us_clean.csv\",header=True,index=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# EDA" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Converting spark dataframe to Pandas DF for EDA\n", + "\n", + "Us_acci_pd = us_acci.toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Monthly Accident count showing how distribution of accidents on 12 months of the year\n", + "\n", + "month_lst = ['January','February','March','April','May','June','July','August','September','October','November','December']\n", + "Us_acci_pd.groupby(['Severity', 'month_of_year']).size().reset_index().pivot(columns='Severity', index='month_of_year', values=0).reindex(month_lst).plot(kind='bar', stacked=True, title='Monthly Accident count for the year for each severity',)\n", + "display()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Daily Accident count showing how distribution of accidents on 7 days of the week\n", + "\n", + "weekday_lst = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']\n", + "Us_acci_pd.groupby(['Severity', 'day_of_week']).size().reset_index().pivot(columns='Severity', index='day_of_week',values=0).reindex(weekday_lst).plot(kind='bar', stacked=True,title='Daily Accident count for the week for each severity')\n", + "display()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Day light savings in USA bi-annually for the weeks 11 and 45 rise is seen as compared to previous weeks 10 & 44 for March & November respectively\n", + "\n", + "col = ['10','11','12','44','45','46']\n", + "newcol = Us_acci_pd[Us_acci_pd.week_of_year.isin(col)]" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# For Day light Savings checking\n", + "day_acci = newcol.groupby(['Severity', 'week_of_year']).size().reset_index().pivot(columns='Severity', index='week_of_year', values=0).plot(kind='bar', stacked=True,title='Day Light Savings Week Comparison of Accidents')\n", + "display(day_acci)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "subset=['Amenity', 'Bump', 'Crossing',\n", + " 'Give_Way', 'Junction', 'No_Exit', 'Railway', 'Roundabout', 'Station',\n", + " 'Stop', 'Traffic_Calming', 'Traffic_Signal', 'Turning_Loop',\n", + " 'Sunrise_Sunset', 'Civil_Twilight', 'Nautical_Twilight',\n", + " 'Astronomical_Twilight']" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "subset.remove(\"Turning_Loop\")" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# Severity as a percentage on y axis showing how severe the accidents can be considering the various variables \n", + "\n", + "fig,ax=plt.subplots(4,4,figsize=(20,30))\n", + "for i in range(len(subset)):\n", + " df_plot = Us_acci_pd.groupby([subset[i], \"Severity\"]).size().reset_index().pivot(columns=subset[i], index=\"Severity\", values=0)\n", + " df_plot.div(df_plot.sum(axis=1), axis=0).plot(kind='bar', stacked=True,ax=ax[int(i/4),i-int(i/4)*4])\n", + "display()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "# Sunrise Sunset for Day & Night comparison of Severity \n", + "\n", + "df_plot = Us_acci_pd.groupby([\"Sunrise_Sunset\",\"Civil_Twilight\"]).size().reset_index().pivot(columns=\"Sunrise_Sunset\", index= \"Civil_Twilight\", values=0)\n", + "display(df_plot.div(df_plot.sum(axis=1), axis=0).plot(kind='bar', stacked=True,title='Sunrise Sunset for Day & Night comparison of Severity'))" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "fig,ax=plt.subplots(1,figsize=(20,10))\n", + "sns.scatterplot(x='Start_Lng', y='Start_Lat', data=Us_acci_pd, hue='Severity',palette='RdYlGn_r',ax=ax)\n", + "ax.xlabel('Longitude')\n", + "ax.ylabel('Latitude)')\n", + "ax.set_title('US Map showing severity of accidents by their categories')\n", + "plt.show()\n", + "display()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "# Accident count showing how distribution of accidents on each hour days of the day for the whole 24 hours\n", + "\n", + "hour_lst = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']\n", + "\n", + "\n", + "display(Us_acci_pd.groupby(['Severity', 'hour_day']).size().reset_index().pivot(columns='Severity', index='hour_day', values=0).reindex(hour_lst).plot(kind='bar', stacked=True,figsize=(10,7),title='Hourly accident count for each severity throughout 24 hours of a day'))" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# Accidents count by each state and for each state count by severity of accidents\n", + "\n", + "display(pd.crosstab(columns=Us_acci_pd['Severity'],\n", + " index=Us_acci_pd['State']).plot(kind='bar',stacked=True,figsize=(16,8),color=['purple','orange','blue','red','green'],title='State Wise Accident count for each severity along with total count'))" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "# Percent of severity\n", + "f,ax=plt.subplots(1,2,figsize=(12,8))\n", + "Us_acci_pd['Severity'].value_counts().plot.pie(explode=[0,0,0,0.2],autopct='%1.1f%%',ax=ax[0],shadow=False)\n", + "ax[0].set_title('Percentage Severity Distribution')\n", + "ax[0].set_ylabel('Count')\n", + "display(sns.countplot('Severity',data=Us_acci_pd,ax=ax[1],order=Us_acci_pd['Severity'].value_counts().index))\n", + "ax[1].set_title('Count of Severity')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "# plot a bar plot to visualize to see which states have the highest number of accidents\n", + "top_ten_cities = Us_acci_pd['State'].value_counts().head(10)\n", + "display(top_ten_cities.plot.bar(width=0.5,edgecolor='k',align='center',linewidth=2,title='10 US States with the Highest Number of Accidents',figsize=(16,7)))\n", + "plt.xlabel('States',fontsize=20)\n", + "plt.ylabel('Number of Accidents',fontsize=20)\n", + "ax.tick_params(labelsize=20)\n", + "plt.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "# plot a bar plot to visualize to see which cities have the highest number of accidents\n", + "top_ten_cities = Us_acci_pd['City'].value_counts().head(10)\n", + "display(top_ten_cities.plot.bar(width=0.5,edgecolor='k',align='center',linewidth=2,title='10 US Cities with the Highest Number of Accidents',figsize=(16,7)))\n", + "plt.xlabel('Cities',fontsize=20)\n", + "plt.ylabel('Number of Accidents',fontsize=20)\n", + "ax.tick_params(labelsize=20)\n", + "plt.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "# Accidents based on the side of the driving Left & Right USA Right side driving \n", + "\n", + "Side_lst = ['R','L']\n", + "display(Us_acci_pd.groupby(['Severity', 'Side']).size().reset_index().pivot(columns='Severity', index='Side',values=0).reindex(Side_lst).plot(kind='bar', stacked=True,title='Accidents Severity based on Right or Left Side of Driving'))" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Us_acci_pd.boxplot(column=['Distance']))" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "display(Us_acci_pd.boxplot(column=['Temperature']))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "display(Us_acci_pd.boxplot(column=['Wind_Speed']))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "display(Us_acci_pd.boxplot(column=['Humidity']))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "display(Us_acci_pd.boxplot(column=['Pressure']))" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "display(Us_acci_pd.boxplot(column=['Visibility']))" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "# Univariate histogram of Temp \n", + "\n", + "var = 'Temperature'\n", + "x = Us_acci_pd[var]\n", + "\n", + "bins = np.arange(-30, 120,10.0)\n", + "\n", + "plt.hist(x, bins, alpha=0.8, histtype='bar', color='gold',\n", + " ec='black')\n", + "\n", + "plt.xlabel(var)\n", + "plt.ylabel('count')\n", + "plt.xticks(bins)\n", + "display(plt.show())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "# Univariate Analysis of Wind_Speed\n", + "\n", + "var = 'Wind_Speed'\n", + "x = Us_acci_pd[var]\n", + "\n", + "bins = np.arange(0, 100,5.0)\n", + "\n", + "plt.hist(x, bins, alpha=0.8, histtype='bar', color='gold',\n", + " ec='black')\n", + "\n", + "plt.xlabel(var)\n", + "plt.ylabel('count')\n", + "plt.xticks(bins)\n", + "display(plt.show())" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.4" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + }, + "name": "Data_Cleaning_Project_IST718 (5) (1)", + "notebookId": 1278832175434352 + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/IST718_USAccidents_Project_Report.pdf b/IST718_USAccidents_Project_Report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..236e1788e6943c223faca9d225554b8405351de9 GIT binary patch literal 1407234 zcmeFX1yo&2mo5q+xVuYmcMt9a3GTLWcX#(du;32CCAho02lqg539fIGbMl|_clYbR z?|b*Y(LG)^W3y^i)vB87o8O#OYweFrPDG53iJlFHY;$XT8is|Lh>^%f-yDXA2Zlk( z&DMyBLDbbzT+tEWXavI`Btyg?Yh!N(u!LbS01z?3@bSSISsT9eXJPrTUMMX1&lj@& zy9?Fc>zf-HIKnU}I_W$9v_aAeU;><9)y&Y*l!%Fyl?#SJ!pO|T)RBmplO2XZ*v8Vv zUeOj{05n&`$l1)mNZcOa2E!l&aC9^x(qshAz^Dy0-^|fL&d6Ta#>&>l+Q{0Gh!ciE z(%R9;-qywvcz;C3080npEMjJsz&auZv6o5_BLf>lV5PK?wFz);R%X_hn|5%tHv(9} zxTYO-GJ%4CfOKVDzPEzX%>ovGfBrimu+FAP2?F{;(m!4Hi>|EyCs?N-F7#h!nW7B9 z!Geh8h5ZWuIp>&|nK}Lq=|JIuAa`Y5zqdk!MEmcA_itN%Bk&u6-w6CG1bDD+UH`+p z%<;dTm)V&9u^V7wVf+7dJHW)n_HR=23==#E5gZ63XA;(frXV8a`r;QuGf_vle+9_z z_TLEnM&Q380`ErPC)P^G*eU1*eB{%u#<)Qq%l0i_HvPXpzY+M2!2ciwya`g6Muz@_ zhe7uLBb$!@2Ty}9yPtpYG|0xm#r025gNL1L3Av`n1xD#s$1qU+(# ze74iRQj0|5>W8L$isz&H=G8QiL?;r3g7i-n(oD$oYbbpoX-s(N-%hjxnch_`J0c#r)tceK1K8e-somM%OB?{-b!uWw!pH4KHTP zS&TU{2m@whfvo;E6(mlAXrGEJvT4wp#5Z6NNGvD5P-03X%BV?lqk3a4AAA}`==20@ z6%smA++Z!0j)-!(J3hIgrs;`0`GL*C%PJu%Gc?F~t&3jfwt<44W
iU`O0oPw7K9V|jPVmfwH|~yFR8qVqLnZA3>PD8E%H8#PXKD+ zSkOY@k1S9pzFF{zBsX*g+gIkOv&Kmgi?4n#`vj>ZMK40Y%3%t@I3cqdMG3y0Ma>3x zVyelZ_hX;QS9+@l*rB8i5G@?u=oz7@e051#8rW-^`C3X&RsJXtVI~fMy-!ui^Mg6< zofBKBfHoM7{MRn(nQ1v)f2WDCJ7iAmOUL4ajhPYMELfFXYhSiP6S);A3we&trjbkl zi|6aw)cs^z?tKikXm^bL2wQeb0ba;40bWe@9Ba`>)HKLcx$zL|83In0AFs50? ax6$(}LWYW}~~flKH#HZ0Q#X1IkQoa^0!YLfo-0vUCtI4WB?% UpgW5v_9aH~ zGqmm~4}5*sS2>#i?ZSG+M~p+UR EbVkbCC#py%v6VL5r9*ItGEVvq0-ub*%)1#kHFg>5nS-xoc>-LXV>j&Bgm zgaG*W8490Jjz=GG5W2hyqdO4ge88_w2!g~nKo;ABAt$^e_ifgF #WM=b$@r(0HUqbOj-qAiVJ0N)@Lds|6-tqAG-$CA> z?-OoJjxcP1->~gxt~1SGZg3R(h&_TofO|*Wq2LL5VP^<<1?|hbGXG%23n-9#hIyac z2Gc(LfcFG3p7rR$8F^))^b9(l^MvXheaGNR|AWOfeINIfXFv56a;APgy3nQ@HaWBF z?J30!TubQCqT}4>YId)?+C7d+_Vn7l={A{)v|y_{`IqYSN7+n&tGg|5%V|(et;#aS zMp2~KAFO-SMo-h}Q!GDq65%*<%lG81nlkE79KZ!{P;;lN6ik1=z?ra!bT2KLHNVgR zQy;uxu}^pRYGY1$17H;Eh;B1o6^^jevL$!P*8aInkRVPUSn>yFaz#RmN(uBLKs(1x zbXlWc VXu6)YK Q-tbPo_B@W3V4P4o(igELDLlT=SnlseZjp{eHLHj?_9|Oo|0{yuxgsu zO4}-1LeWZ|E?Dt(?^0s~Y3+SQQHOSh=N1*XchbuYr0q=OuHhL1!PF2>e4=)yJiU4- zA0To~8L@gcs2v|fg*70Aoq2-t$jy0-w%wvX6fpMnUiH87bG4*&tP~CS@dNArRi*t|5FitKZnK1}>*hdVl{yBfyUbofVWm zn&$-jJOje4IVaus0}J2x$c>QTn^jS)+`xJa^hNNWtM55u>)4egk5O?JZVM;8#vysO z5y%Hq_Gz8D4rOzB8<9AzYIdxV;0Ns#dHMCT_zm&YV7kUidM2#6(9(&s_+ &MX(c^|?5Q&3 z5rL9%mY<|!)mc*<`V~bU3eZLIL%Cs#EG7;_0$7>0s7NYELfsf>z6S?(VuAkT1D(dd zwLxgi6=shdU;^zZ77=t+6$ueASqPrnX~~K$O-lAo|A~IIkn+@Z=rmWR`%~^8x1QVc zt`EhbPi$Z fTRVP6Ffw^d`;-4 z2u~dMd5g)22Tq=M^%+`UGj=y!jHUVcS%6DC+An|Txt|ad63uV>DS~&e_nJ+_S)+u` zmoclC)g&6Bz#C$K$59%Y$Ro*!P5E#iTcI}$$Jy}oD*r*1gpYzHv%6P#wF|cj(uDyI z?Hb4tqMw+|?9_}REZL;;M6r4dnNuR& FHiT&H-2m>+)T@%DF-iz%$<=dQ z9#d&!wPT}v3@bVkKZfkAjC`55z{e&ecy&oXanQS*LDC2v QepbIWMJ8u<^J89ELx}yh+jvU-v{Z<~=dXcBk!Jun zepbt$u^%Yl^^Xi^pN)^DI`2B9)JYrDh& +-$}m^=YJP6r{?qevuTn z@nCI}Si52?|DP=s`al2-uU*5v>hWu}LAl%=nf#QKwU!l>r7f9(vlc>!^d zvgjiLm<64t38fexOZ6( zGEC&Haw0a)`Y4`<=e8UDx&E_s1#} BW>)B{+WW z2>b-6f-MrV_TEI^R*ep!01BaG={P>!IbzoO$HKWTF#$Sw8<~&k>L?zK%Fo~+ojM$6 z$ vK;>P EAYxt;nT&Fq778U5!aMfGG zl5VrtA%}0as1QmHU44LyNgEkIFrT&jOdk?wn@FKKRM+_`#MpTP13-WN;0DztTK^F! zgyPFU0OckGin#-)YS& AH8m2>oum Xyo{6|D5#G+@={aJegL2}_CdxRwNw3%4Y7sQ| z8&x-_35q{S_2lNf(C#I46EI)){V0--VjYH6+gEsl!o07Um6#X_6ws)tVeW{Lv5C}F z(9T37csg^^!h*F3Liz!AZX@e#;=Hoa{ckjv$A}9oh>x@JxO_JUm-h07sirNuocnGV zgT A@6KB%s+;T>4GMoaDVWGaBah?Px3N+-V z-CKbMVid$467Lc0^35wQFWHEGsXoO`o#^r18qL;>&?OdR;3@$r*Rtwq^u2}d(5XJs zg#~D30P1dU2!i%ylTdTV%Qi)f;MIxtHrQ*A#&1fUd(Ixq>wVS{hj!WD&V9M$v?8@J zqZ!tnA^cHZF9UogP%oO7y=_KP+of2j$@SZYm>6G-rBVNbh>b;Pq=TQ997qu_k>ntE zsl&v#&Lrf`iol2za2e>RKR}Y4r9p0a3c5_t-TPxeNqiI3W&CbG@88z&HSrpdc0D+7 z0M!Xh*X|bo@IUhOX^-1kws7LI(l1!MFWkS-{IvGl JtEd@1PTR}3h?uwEI|t?-+QVFH-=8!%KRuwI~{*>Y{n zHQIoRW}}u=CLVnpw-e$>`J4*=`d boFK1s>YWVTh z8)0;?@dMI#s9{sC$_bEJHE-n6E8bB8%_YmbL2qY4>-!{F4iAamdtw*(#Rv-jIo;x! zAIJk@x3{g#F?*M c!LwzJKD&>$zsSx*bVV30(8 mO;;=*3#9Q)!&YH$v|?b0!YjGE6y(1vp`%rqnM%zL>Ts zQBl*m2o))4D-cjIP$|6Ibo!!p*if&$?&94HEwD3 k@G`iBz6>*bEZv~)oyQXKB>P5B=`c#iK+g~z==rS| zKA#NrtVd)pRO#4?xqHG*^Vez_om5pc*pFy8s0wrR>gRhPw?gU~uq~LE)G8R(AHH?b zRMAeVf)b(z-9WuN21ZFkRT3#mU9uvFT_UA~sj4cn6;{ Sk`(@d;poDEVQ`lrp|1Vh*qZMmbe=H4SxRu(kOP#Ro$N=HbKU)Qafn=>4r_ zVM)3GxYy7Z=x@5`%>LNx&Ry0A^rMa)ak+yOLl*|vaGGVTE%Vrn )gv?!)7?bdL7 z9ks9~C>O#Bu+MKALv(tIYT9pVI(Ka-Z>lYJf62XWUpq#UZ-*wZs}>H_u}+NPs?j*4 z(=Z9SM-J{_e}SE(!$AC#&G9PAN~%K2=)MZt^4j3&v+EW7c1#_S``FdgLndsm^;CNO zlO2k8M`$b3xD4d2j-_D?@;Xi)5K!eD%0~Y%nw_@>&a+LzdVCV{BWV^w+eTh%erv0d zb$^wD@2Bad#8K_JRbQ@d 3>*PILWv3@z1cHp{12bW<3P_>8_knI ztG{TW(gwlXjx`SnlE=9nYd^CaTf2pL&^#vU5;UGM)Ia-O7&XefR& P<(NfS*$sjsmEh$QmDNW@n@pkS8 zrh+mnSj^hY2G>CawK~t p)_=DN
sP z_g&L0zTF<1@xT4ClQF?r0Jthmb{fR4Wt&w_Ko2{wnu^_YrNxo&63y1@IQikeOkdD# z9an}iXvrK70emb*c156G(uZx1ca&7sP(-n?sUY5)hZvdv7&n=q!f3HEz-*QufuSh& zNg6PC{H(~FK$na|Jvca|m87X$RMQ)O!JuLAj=$ddn|V!z)rT_qDF(&nfW@~(blLb} zdf@q^&H2ib4%+WD-8aZI-Itm)?40hU`#z}+8yhH-9kQfMux2M*^|)WzW!&PixxUxj z;v;}V;ZC^f*I1frQ=>T}qC=~ $xc|v^9w@M4+^;~me_Dy3dQ~IS`b@|ta^bh6_t!A8iQ=$9U1;=A}pgyTnOO4zZ zk_=EibC#y?#|}a#l8INh3gI@}vBg7PRdme;*XpHU!RkY7?1*%^7<96wWEAj6>QSy} zZ;=s0YpUc0->dYWvalg7EQ7S-;=a1z=*2;>$miJLuvgKr+}lsUmE `A(q#R*OE}+H!JfKuLgK{_4}IP$ zf8=96HNSi3?vy^9<;NJPTYvtwOn(-}m{lOy>}4I;py=oV9+nCkX=wqXZ`RfhfR zvDy3DOgype;?JAfX2OFLJ|&0FHCATQ4#zt`5$(vC3b_Xug)KEV?&CTph)ZAr~E< z2WK0BsVq)bX+WKVVGtsHSKy)i3Xe`6HoH^v8SDAryI^aPu1!a7?2heFSIzQl#w=T( zgkgNb9ZSCi9S*!It}V-o8WXcuSLg-Q^+@Y0?oz6aM91=@Bep2DIwZ}k)zu&-BY=(S zN$}H16pMa1-a)G-CHgxLkHsd4_Q|Ia-b} bzMLtEC#Bg}3iUgx+VU *HqjzM}sSn#n6OTg Rzf) FbcG%d3fZ|y9)mb_HNnP*91E4pFec=Ce0Y(c;fcVR0!o#A*e z+7-)E1ldWK7ffnMjc9$)(BR%OLRDfW QI$@&kx)F>#>p=A;=6Q{B`QsB`N!qgCQZshM8m$)0w}u=3pkbo0 zv!gBwB7q3rY>lcVHz7JH($vT 6dEg^bEez73wjP60kipG- RBt-GH!^GH`3E#?JvcUyg>(1@V|gY>VK`z)L|oCYZ%Q03 zd`@W0B!m>hY~g40*X;`ULgpMy2fJuYTm5yXX>Mj){B=iZzW36&PWYcP)4O30&p?d} zM4zG^_EbVz!Iz&apkJ@A%!DSAonY|MYx#Kytw!HRbuYia2*cQ1KrdbqjL;T*>cCv4 z;6WH>I{p6e<{Z=Q$$JC#BKPp{2ZTgWztUu6^YQtiiyt}z$y%pZ7s7_3<9pB8W4{YT z#<2eOQ!@>&X_Gp#`mOr4u)!bl72T&$!MRwhYNe?B!W5 ms8d#mQE+VcB9azKR*l)*#?36a2xD@UcwX>rmuP<0x0)%^R%?E%S6RFQ2J zN_MSzn^kSWeTGNg0PGda;Tc=n)G}_*8MVUjg{|WJaZ{3vnkj$u;!dGz8i*&-Ad$@J zIJhmlMG1Z@{3F8Az6u+5Z?@{Qle{Qz>_NVTDDh|VH qrT(r!j+%HHC#>FtP5U9OkXG$=saPu>^5G)8*`~ zS{$>4u+(_;;0$OsZgy^NSuvIvr7oBLJVve{lLu$yoH$Q%j1;87L{^RjuC64~#_u37 z%P|LtuR6dv$T+-l=*PwP_qvi@k>&NN92{9#X9NQNnsZ< pd1ZhjGyQEyXS^p z|3*|Uepjan0>8rr_J-c tC|=m@ku@lL9pqhibY=2grMSPFRoF@?{{UqmydPRzO!snn;=qxQ}486U)Wx zh3ggTRSRGbEG}R#sM2@T6k(syj%Qj6&ER+r1y&^KlIgj8@1SH(^7iOw2vTIT%d=GA zYCoxA={J;9d|5`ANyn1lijB&ii)9VQsylwKr-QgJ3&-;;LXB1Sp 0r_sRf zIOZmXGc$@X^ao@L&aLpwu<-Y9Z}z{vDRm3AzDFv@q=RF+xU$nYwxhk~q`T()M55Bx z0-Vr1UrtqyCRjs?_Q{ToeQ9xfqdm$(E4m4?8vyreCX2qqmQN-~68h<&kjmRd*NiOV z^mfG@x-JGwv|3)C9cHR Dk-fyMXftYpdNvK1ugN)VO$UmQ$*pZ@FJw} zqPfsfRjG-DTAMIoPBcG3-pnk%v=|QU;|-Ghv14&(ym-v2LY@iw-fsBCM`AC sui)w48eI}W)=>REM{(fBTw{0Zqj0)lIJmlShwJN|Kp0zXo$*`5d6cA}}!=tBHn zEb!SV^2k@_{gPO>vr({2_J#OgLsCUnhmN`lX#uNUM=T%bOUe1dB4ic@vdCroB}&M5 z0`D7LW<=m}IcATM#B2&zM6n))k21n0El8UZ?{OWs-mf!WtJdC&Y4Kj0P?D5<)A2=l zTEe<6!H2E9&|WBWSPQt-Vlp 0`SD>|8yw?LfUk`oXbYhGscZ*pRbRHC{iX{)Tz`Y?V z(}KNS>1T7e|E{56o`VrFs)|a6H9CCU*l6woE(ULoeQaP|r{PR;+<4~)A0KzJt3w}U z{Sm!)rl (c`V<)?^^4&IhckpRAPbS!6Yl!VLc49XS_>VUw91kWBEKgV0-63DTv;3HpPVRb7 zk%7oRix2-y>qn;GclsW6c7yPf7S1ul65;UyCCrI%|I~^};K|` fnM%&?TXiL=k#)4gQ7bbj0YI{+5_pSpu_j;H9;98s6b_Idw9ZkKyywjn`gd z%S1I5k54yGx5i1;d=8&Xd}PTD@l(MdH56-D8>qi9H$bTa0QYz6{y74+I-Nc1qu`dr zF19L@vz^HeF{!8Ndo0#4vQ+MjoQ)cqXFWOf{#(Vhypd_yN2ad1b4-?fvz^%uuMSQ1 z@f-XF2NKb5%*`$%;KaX|)f{@!xLO@aq0upwc9^tjP`A;pQpuuMAg505Y)9BJ(e8vH z4AKwAiZV+=NX9y%Fvvq2@a{_(jTOSYWp(^+_-W7e)47KFXWIM)7Eu_KUcC~E5L`*| zD2wAFWwFmaBeT3tLjwdwTft+zApFPvF}&ghF)@n5yqJBWih3QPnxX8%(O#t3ZZg%7 zejeX>v6^+Jll|d53_e8T8{iXz^jaMM_~Q9J<-VyY)WR;VU~tv6gmCc=Y;gOjrcAlf z(+%yLuDM@^xLDM|p&R|gtYRljvcT7Y3?b(kr_ix%j`~`HoND#CSvM%-DK0D3YUiYd z#UQ-^R>mm_6A~;l6KwxU=)4#|z 3TTqM<@Z}AIDf2k| zcI l(Hi6Wd)xN0+MO&dE96yy~Nr zG2Zn3i#be)l7OWgMUCdGC>`~$j|>iF&)(%t3H*%n@7UGwQ!N~?ffrRDPg<5+v#WBX zTGViBq*`pxjxtu|Iz)@4G;5F>{%D;s6);OagmqzS-gf(t@*NJw < zlXFu?K9Ddji}9Vu!?N(<^&95Qbq9>h@o5rf%%BC*lr}Dh;9 @Z44R8Sd9Q1>VjNl3e#wr8{vLk?_#Cph83cdQcz z16$v5qx$r`pc*qR14@{6KPGHzCy6?5EWH&ZyER0E8}^j$i;Wr))N3E-3$-NI?DU7Q zK*J(RxrGu}6PSzX-o7Rk?u(=AV#mu5(306PMu>&p#>YbBFnloNOqMz()f`aVHnPV! z_RDSgm@Hj9sKiVtGT`^hTG^PQ2$gT*WISykjhMNMKPdMpf%;)$WG(a^-|ib0RCUr2 zrA^*M9vOs>)9Zfb zrgkH6L+$YP%hpq|Z9eXR^SP9L+5@;aF3eZk`n*);+)3GYB5$lXr_HNAJ-lLafjdFf z3u1)pkMV&f?4(%MI>w87pxq xlqpJS6{jg}v!?0lBBp@Dr3r+n?>5g9wd286T4Xwi8H`qij~C zkI5|t1npxVVjhAn{4v*PyE#&`z>d4+ZeQ~bYLCmT6Kp6yA$w!`M7C4T2O8|TOqn1Z zSf<%eMY+U|5Y>~EE4mU=5Wa%s8|aRK=!U{GLmBaXtB1-1#~*}m3!)RCcnaQjoO;HS!_mvH|e9=XB;>AkhH`AW>wLYm|ZcV1RK&7*Kvx7L6n}!qtLVd7zgJ# z%z=n)r*rbnC(>ImuClVk6 vjKxP!@T@`lOg((JW560X`zuTAq$@K4!r zC0E-C(q~$1S#KV1u-o!3^Bub^dwBX2b|G$={HQoPSsx35?hcadV%^Z$pxP+tV%p&7 zQh$@{A$MIvpMS5#8p@^*+4T9KH#3YOyr4HSKKfxMs-*qABAO41 D $kl*dxF+M&R4Xz(QawD9D1XdhVN3$ z;>LtA4 |88bCOw$h-590~h2Qy&rg6czZrz zFi@Kr(@Gi8zF|Nqs2eA&g^oR*DVUOY`N+LOO}l*@4C@FLJ6&dW%p{GQi?Hh76uu`9 zyYL~+S3@N3d;7 O}@jVZ0PI?Z-d$g;|5jJi$89MP~+`k zFvDIW52Z=j^dno7JLMsK?sA<9=k1oz*}>4dMVJvaHx}BF&z6!KSYm`p+lDe{K-51& z7R)>r9q^(I@geG7*Qw(0BH;>m?gg_e6tLb$$AC=@+zs^VqUq9X0^MehU+n)F?nAme zX&$JDv$;9Gjk|qm9G{^dpZTUC9AMhLGeLiBH1$e{8PQ1(bpOb>r_(iW`xTxM`YrO% zG>fV5D!Hy-r2GlZHds6!$IvZnnr@e!Sgb|NKI{O(Oq5Hvj%8!ab_{XPbiJM*cN5aC zf%_HmOtrY3Ou-=63?8 xsjEj=6`JQp7_`OB z)GKL@fPAxs#}xWtN7NWA%PHHKs0TGk@}``GK(uXQ;wz&D-`d3LSAmpDTHPK)0k?UK zx?Uzw{`d634Y`=gexBk&5As*( fDz6A*uk?tF|J@#pFzte} z;j^KK&AH{2PDT7Bwf%`{qm}zXBdMAB$=k22S$M&92v+#3Fq0zQ-Z@RhpR2mQIfmv$ z88p)40IV1b)J7_(QyKN=^TN%2@{FePK7Eoz-I#bN;ODWky6=(f7Eiyk1>B`emT8O| z9toV_A2S}01Zr_eUdj(17v{t=$cc7zq|#aAg36oNsTY!g*OxRRgh16f)i-52D%O8B zQN!Hy8^6@ic{05fs%k|%qrP@t+CS(tuBb3Uq$f-tr*v`Kc-D|aNZM=gKAo5(P?Kj` znVxl>m0<9KREa9JX?Y6Xj}6;PsLZMM)Z6U=olK_HA D{}=Z^#^V&MX5D~nWS@Zy@%GAn9a8~mzCRsgwqLbEP0#toMe zDs%=HQZnf(wE~v@oQB8^MN<^LYp~h|uHlmTW{y&=8X2)f4m556r3;m8#Sn&6$fe4G zH4TMkXUf5s79r@E? y9AT!ucZ>T+mud+ Q*&X |7jy6^ovxgpr6kTm^x=?gqFfVRd>CF+}X3 znQ)qVB%%!k)gTQQkM2X%*Y~7Ax|v5+Q!~`xz@*WH{;-}Q+VzM#zva{PQZKKs_j652 zX=x27zD`dVUpyF&ZN0jqZOUqj(FvoAM~=yk3?zBH>;0gmCLh2k$KI}}&HW^ 4YG_>gpGOosO{TKDbdPOhT~t5$m&ly zkCZV7A~w=^eK5i{2C7HEXqMEED0xIAmW;Y}V9!nunY<)}xhOJ{)q)I8l=SQQ zrH{#E0A8{s|5}!$7AlS}Ec_$RkWPEK(njJiMX8Df1_zg%S&5_ABx#^Ucip?DyQ{ay z64#&86(>x_Y^&+5`I7m-zflz7a^=xEVC2TglfJ??FA{}x7cS5CMYC<`Uccaa)JnH* zIL_+81{Vn0+XZ9(3`)?#({JR0-Ki~hI0yAHG!lW+{G*q1q}DB(r&|ZXW|S=&D2a#P z=_;C~GW=Yc9>OS>74tNjmls0|Nem{{JsJy$Zi$Za{>M7WwCxXrCzg={fg41zxTBlv zEzIqYw9Jwfo+^CN{tKyxqOb#j@11O^!?6l-TI{5SxX4RVdh(muHnw9dko`|E-?iyV z)Zz)MKlyj(wdOcpk}pV^>jc8%00PA3vyj C0A%u^1+^tUHs#{28?FK{Z zn|e>Puv1G@yIyQvg^up&w}Z{m4A1sP26pLFc; nJdFvF#Y{UK#L}@y&B@J;V3=tc )2 zQn>8CDV*$K#nI_l<%hwS-I4KLg(=Vwv*;+V`@E*hv}p}iqD_`w-X108L1w-I?_dMh zPWpKLI&l-Ra G>`c>|mV8lIpEJZ5G zI=I(at_O$cND)jdd#tLQNJ#oxd0jjm=23#+70vopn2yG}?eORMoH-C_-@s%`v>@w0 zY;oEou%U>UaaqwZC|vFo6GH$N3L$y7T)nKxwp?%hncGzXcSvqeo|!piyv-M-npI;8 z#iiA> !@~JngE|X!VIVI=v(fer#m<6a# zwByW_ye(&QHs03<(=NOhGw_*@ck^#o`nQ0;q#@Ixnk2j)jgoUyT{y)xbDw(>U3$LQ z@6)WSr}udH>>*2_#dIrJv>An5vRGUIhx;UQ=hXhT$@!+IdEb~K+Q@5ie4W?@&Wn(v zh*QLVvT>w#S7|R8b&_@2y2ifyvR6E9edN;f $q(A3@zNu_r5|~+8C~+)R)x29K1Lf)ZzrJ3Tbm-`;@qiA_*I4; z`r*K(zjc(FxM{3P7z)?;@ZtPNOk;&)$iZWNTk3Q`$a~9x_YUh3*<>+&ZEkH$ZxW;K zY@SA`)M}g5i>?P1c&yW|u=r1#)A_03V9pw(#;SL}r#>T`e3p_Up_HJ3-Df8>4+OO> zbAQI*m@l};nC|^H?(U3EIQCZS;j?SgcBWDAtHJ;P {>}w z_8qxR<%>x7$WUU1Suf;|QJq&cv2pcA5qG8^P)f+^bC|&&R!`SuqjMsS->9F{DkjpU zLrN5By^~sMm$(4Eh!xmA?3C%Y`y6RCw>8jlT#84CFamevfp!cC)0_vlr~$kVR+67 zBo9wGzmrfsTijfW;FjUg+qAccB5%rE^Ej9VjNZ>cmxAMpq{=upP~TfD_vuDu)LS~- zNv|b^(ede8#9H5M&bJU=d!27Nb(d>Ag3Qc0mg3GeCS=gc+cZ2+;wJXxIyp4DIUJCj z*^QGH@R_S(MiI7Wf!-0kuUDO!(W$jw&KrdvQN>Ta6=@(aXvBJrfUIiVtJ9i2lsUB1 z^t2q=xEKT;r+QK{Xm(xhv~sZWUGpT-c*%Gvaq-jQ*QJcvBUb(`@6pHL@hpcJkqC=W zpCF459%VMQ&qUAq8QHW RW1%r0V>l};SOWv4f1z#;M|A?IMsLo$4pR`BG9jI29Qq+C^ z`h!xUb=L#h;X*u0v#CHx=)6zMJAENAFySI6W8V|HdKig u^g>-{?Jgp=h~9ICyrQ4Zr`+m1r}UHby B zm1ab_;JmTH%`GgMi@O6W4CUgKPt1!Lvg4kfCY~@Ucx(;3*PHu?x!Q(I-r6*~4@3ga zTnD%!nhlJVy<6NYxt;8{eE69LEjC%!yc}h^^wQhWH3VHBt~QC@NxXUUP%jY;%BXSV zbk^vOQw)^HsWukb7u ;7?Cz% zvQgYEo)kY8byjv7Ay!oGR*opNOleZaD3g?1mAjOU%9Dzu+%3E2xi+~tmshQXN@6t! z&D7i&4&_$#vxmkU{lb;(W)XDv{4y2{F@-AQ-P_P_?=ZI36sv-Q_g5nK^=Fr=oGkR4 zG^IO<7wHBYBWR^9T1unY(+gJRvUW`)G@~UWHIqFo(Nf>ag>oWcYM(JBr)uEXS3a$X z5B_dW$)K3mViXL%L~{v$Ya%dfa@|%w-S@%MKj|B|@S)1|s(BTmo_*=Dai=BXnZeyL z!5KxSOW*q7iahpJeJRp+2hz6~!fLz7>kY+R#5lqz=mebsg@H@(2}8n|Fpc4c8parB z7#17W8Z5ULZYtf+?>D^4ziK$gpEFz#E*K0J&AbId0cRwV7+YMNq6O;B`GJI00*Mh> zACNHQ6vtBfhAtrHg#xiiR1(DmHH|UTF_1VChq$+=6iNx0t(KsLS{egZ5=5QQn3osG zEpa%D3u3eY3eZ=MIV^#C)(|HJ@fdYVC8aL`MF(pzh^Q+S7CbQeG@Nf>R y;!awh9c7iLMO(TvI96-Q3BS4!q3a#iM!pFhSFjpqDp zcD@^hv2Re8R7^1W+X^iUZfSTL3H5Hxid*`w|K+mu6ef imhqzbx zl ?oyK3q-zXGESUfD)n&*MM*8`pj5q6-Y zI Ts> zSt1@6g0Y+t>2m`I&Du44!!D?R9kMjCu%3A==%4BwD6cKhq}p2|7zd!I7?2_n4?7?5 zFg#mo{Y}Ipd$xHvrd3n)zYaz!LV==4WFYI#LAZe`!dM3e2ksuoHHQKN5#~TdWFv^* zk08q8Hj#r+Kx89CZ6QYX!b>9*Y9kZ|3wIZCQPk21qfU%gh644GXe3 }wlMkz>Mt1sxIzDA>gQOz?n z+H}SM GK7u&V*rJ_-L4xht=?;@QQE`R&*NP5z&f
wS~C@vz_RGPe121OQ*1|! zyS(X9k?eL+N;zLNMo3(a&x@~!Z;K1@6dY3JP`H31E oQt$6Xp48 z{ aeoagAxr#A0&B@S|GL1Vft`Ur2fhuM=GC34qd|KxC+Lu4a$K<5tvOZ)hO}{g zjqXaODIFL{MEbE992kg4qGh2#bp-9nJ!%UH_(MQQf#2uw`+cOQhLDm#o+A**BTy6Y zb3yQunraF(5fAw7Hi?khI-l$XZ=>O)@na)3dh0a3@6W5!7F5Tqk>2U5s>=%&l$EkR z8|y1QQ%aAPp2Fxgx3(??*I; 2gcS=mI0fPK6f1+uWT<)v#y!#Z^~Gd+&D&|K`QE8{HL6@i+vl%8WN~ z<8P|Wk2CoWU^KcJX|7wmSF%YVFJu4kFL#8fZ){Z`o@2w2SnnY#BebsV7s17d`! zX4k0x6Cw1!!m{5D)!dlVb+MTpI60SLImsDVX7-7d+h2X ;S+d}E!yv~5q+$fB?c#vLoyE2f* J;P zXTLm!)cs1BP0S<@cBz#!<(WBK4DZ|D&;7vrf&cx$XLh~l5%b*CV{&`l{(Lz GV2-8{E`wa+_TN{fyih{@a8lrp3971DmY}JO={r`@WKl*I6vpgmYDkdb=?< zIQM@D`4aHBsk2=jX-1=&(Tp^jMYBpX(nzz&v)GoGu^n64o!t}?NWe|lLLfkF0|_Lh z4v?^yuoMC}^e0gE(k4wpa6((sQuu+(y|~aqX#bWxt#2=-O`*4GZd>r=o^v$LQu;g> zo;gR7kK|bAd%yF3@AsWK51RudYgUX%@X$mSSrnk+m2_X4Oml)PkOJgyh*b|G9%pf9 z3=mMN8~q3c(O6kUwCyZJ+j@Y+YbiaXyEUgCi$~)m&G`fkzNdr+!VEkTX?PT1{TlEk zN!Ws*C!!H?2W$+Z2mWt|%(eyvAj**fwU42Nnse;LG0Q8|$f!_b;fEYM@$sHO4HD%) z!On@!d^I;b`@XM6OvzZwPYPPlv_KZ}SQnW|=kx$iIHBhV@OHQ@wDB-P5@EFb;PyA_ z57h5}<3GR-(0TB}B^#GMa@p+jF1logb0u59y8dpx{?qywfBz})fiiet;g24z|5yE~ zr>||XKO-zvO_T+qoJ`U|fppOfp8=WQtcq-oJO;ztJ1aWS6E>|X`3RP0$pLm1 zOR_g=`WbN(a<^0b3h5n#c&WF8-6`^fr9w$oL-D8>6G>VPWhy|9!$t{bD Z*gx0eG!DA^ybq7Dyh-)jXsJn z*9Q-D3^&vegxl@$uwExi^B%zyna 6&|sti8(n~>N?6w5%TM}X$9m(O zsDW${HqZcIe8u;irW3<>dg_?4GoQSV57ff&!$Fh=;fJu1IOs%?RYw@fjX51c5k@?y z1*ZWK>0Z=(<)7T2FKyp&u>Pz0$LsHbhd~#pfrsipsb9VCqOWXPw*BFyn-;BNx8BN3 z)A#Q-!A3xXDtMrNW&LOMzt=Z9oiBf@{+s%f&t7-UQ(ys@b3fXqjd ZuK) zWq;5QxmFbOENCR@TvI3>)?#{IYYG)BAQy*?5h+zbA*xr1c;ZyX!1fPzDN7zYIxkx@ z7`B#-2E)C;UY1eW#lLYLjZzg?BN+s!KqFP4l4 sYhaF*D74p? z))y?V-F4@Z`yMB+sBbybpUiq`(?b{a%JsJ85t-7+E67JCzt_5T?T&9EW_HDiBaRI8 zEHzNFYSHSsg$)^s_5(NPGU#fQ6O9sQ@P$A{NgLUw_F}tnS>cYt9mVI&vEo59SUahe z%(KG83a(vlC)=NEhCF&jIwhxNAdf-onj@_s;(VNpKNl_-9HVnyj!SxzoMSz=zOaLP z%KM`CryOk*IIlx>wlz~~TiCq>Ol?tif^%*8dJOQEUx;@@{F~hzBg4=KUfL%&mt$RH zp!WU7Dn4-(xrF1me9lfAh_%6C40 r}mro-325RnT-$ zKk*h)zuU5ULpWtsp8xaNU#b7!x2=(7RXN@zXj;?f_YG}rU9;uD6X*W<#TmVo+Y)if z=UiLwdH$WN=9bh-Idjf+Yu4QQ{NLi)P`*GChkv*6tm=xhrk}t0KUO|5!L!rT)6lHW zhv;S@y3@o92M7iF+i2WWkn8N`1v9N!5ORkUM-?8B;MXqK7jO=v=@hRh?sSTS@zSs3 z@h_y5?26}!G|6)eF$B;g7cGUc<*eQq9|h^?K=j@y6;1OpNXrBAsC=*NkPm_)5hcI3 z7yEGjI7&qD@Poq7Mu0upGo>L dvaO%5W~(MY?(mg@Ga{-dLFugzSny%vXl(=;WyFxQr=>q-64L&ZFy^U-N2Ag~;W7 zDi7I8#+_p;1gF3Ty<)sVHJsA$2wb2>f+$d=8)0I@`Q&sv; #MHbu}Dvqz5;%ctSt=q`i{M~d(|yh#;s+}g<7WT+Q~Kh*Dt>Kdxy!w`HSHi zsg=v=vnMA%{rR4X^~Q7L!`IamfOlKMcwrBY22%$J6 }r}kQBpC zn$C+ccoYjWF51C5W02B?8K={g@v#Ktk!}^@;ib|%Qx(NHaS)UV5!`GEY1V?*R |t@cA)E`>V6unik g-}WH w!!(j1kYrES`E)6jm z=2GT5#z8XO%tB@(a|iPn^EC4Y^C9E*G6`mgp+W*fMSZ$#z-Jd$SGxPjmhHq~r9wun zf?;w|Il3~sF8Ww>SM-&r>!awOqF+Ei7q$Gn86_cDy 6)Y%DrDd~DeG@gQ`o#|Dv#1pUNu zwAl5ba&b5SI*DT_FEn{ E+9BCX9XW5%oJ$*Lo}p0DAPIz;4w^jv_pN42()^S*QYz!hVlO| $-P6p0!gztK7OcWRVW_aP zu)A=m;41k21Q(NIWULqvEFM&Oiyz<*@#BzX$MTDZF<-TdEP1$W$1+Itfy;Lq_j^Pc z6$dUyi)pRG!>Kp$(1Ja*&=^`cZRqhvq{~krDr8W8zNZHa+H)M&96qO()f4e#oTS}) zTGJd#4y4$aMELx&2Og`mo~8BoP@#%AGOCxRL_KXX=g4A@@*vH2V w4kH z2LoMbomqThf?5gvno9h|y6SH<$hyID_tVmA GCk3i7bZBl~=njlh?b~ zdq$+~!54xrgvQ8&q5aZ9^)=}oEkJ;9kf8j@apDNHk#TSYkPZ-nu|_5c*QV%a0TB3O zRQI|v{SGhZ2Yv(X^4QxF>%+S}67GP>0k9M7hIhnwX`e!0!6oG+nQU=2#-V )P>Aw(NQcvq1bZK#0aLfM~C?yTyZuyTpPx9X^rA{R4+TMVf;Ym z+0iIX#N0HePc0(obyJo+ -2mdR zzjEKM`&ZOvExx2L7HeJf*p|O^8)bx*B@ipKAyy<9L2k6vhkeib4)|V*I0T`CAtYWR zMY-f=qEE=uYpTs~Ab$3NCukWSoc|JIY+>O#j=rqJiitO5^pFcaim=PLizv%SMvM3b z`r#Ymz!E_2h9opzu~CM)y%1y-oWF(dYoIb-A%`kED`Z91fo>tZSYdSQ6w1bV2OleU z-V{CQM$tQk7&4CAXGd**3IhUE3&Z1G7=t!sPJ$+{6n(+0rfMWD=yny1UsHm5jwt$I zqXjZKkmHP8LnwkMDPojVhI~W8A!VqzyK<;P5BW!h_2Q^HRM=FyRlKwGuy1>0N7K`h z?=&53@^9wu2#{zN2bW`XS8Q}w8tASx(2btH9LJClJdp6T*_3U{kz#DAZ9zQaQ&ZkS zy-PEt&iZw8*Uj0x=A1Pzu9>-}+s#&I+%|u$7S$?dNz9+O*tziYx33Ci(vHlcZ!YWI zdGimqf4b3}4&rMgsbq2T)_X$oqmO_8c|CZiZ3WaI#8{X}gEs3tT38So46O^T311q$ zA>`6L&ycT^Zw7uw{){^8I~@Ki^>?3VG;EimFQZmd>y!=DsB#N+tN#<<$6 qzkr4(84#6hkHq|d%bF6t6`xzjl(D)mT4dm>-}~?;^1+^ zK*nMib{XxlNkqwy4Nd_5&0$+W3`i->77&wyED`ZgL;_MEAptQAn}&dhgdzh?@-WEQ zXtY;6G=Tz~KbJWL)-W|VdBVM7_Jutcbt((TZWv#?Z1VYge)eZo3#(?P8~p9ym1oa9 zH?rfVoj1Mm2?+n;iN~*(h1TUeRQM`p5Ck;?M)xIPSQl6oKnLY4$ oo;rWg22OAt(A0)GkO)TJ)R4pya=$2@Zklv8RGc)wzmX`KUrw zAbkcnJ70|@%&1gQEZ8ge7An8|s02#y6GWl$(u?dk2e|jgp@)3m=MxHSW7`1gtxBQA zOta%G2`L6!WjC|;vO8HC3A(HB;W+yl>tbW+O0`0kD{o~Ef=d96gx%rAIDHG iEJlk5^ za^@)~iahF6jkg$X4TFzD>1C52_O*p>za6}{Z_|eP)68iw;NZnnj=YnaJ-OklQH{!G zL87{lyyK$Tm3t3e&{>+%o^dAwT-d`^+jecZ2vzJas?VW*1(8%GrV$Ild)B!c@8$ZM zwA @v9#5;gjjqw%>BUY4!nWWp$enV(d^fYTxWoNS>6w{c zt3Nv<<10jYg6eW*L%juGh3z#3fn182d>op5uO-xaEj?%UT9OQ#aMY~!f?m8MDQfnP zQ4T8{3L&6|QXSh_HdP@htI}*zV^q>&p&d7GuefIGDXt#_PUu6u<$?d^bU*0tk9Lin z7{?CS*9E#-q9ZO6jL0rfL2DdETZN_>7Q6{ITwi4d;AY4($Qk_^9$n<|MILax3`6lT z%4vmkvkD(Ynt(H9lQgZ2ZZx6aC&Q~vR=!|1A>zz6t!vuWL=7~JH<3*n7D3vK`4mL& zL=T#E{^%gYa-*Fb9R31Y%29mTur~x8>zOogVbxJYr5nsRWXT!RSbo$Pw5hFq`2f+2 zglzc!kV8(%CUnP*y#y!s6rjqv8a66OgbkFQ#X=DVI^HAD+R-A~*#cB?gLf00wxz&j zk7>aMN7*ZP<4h;N1-kb(2czp=nNN?Drgijw_uVDKYnI;h?AOOv%>L@lS6p-J^+$FO z&hHvn(%v&rN?*4+Q(OP-yB^~bS5c2%-JEalzT| <`uSf1a$D=!^Jm5a67 x;@4iNN-&-Qq0 zIOSbg&}KU4kmLZ$c)OfVIzsETgYyvz(IoqLg>RyTUH(`6WC9Sutn42ne`N)fTvk?8 z#hsOXs+!EonKAO0*2QW*D>tbsNWfc(=xT>c$z=R~pNEm%z+DUlt<3bkpf!808MLOg z1+AIzQ|p2!)n?e_@~|;Vuu-zGfz} hgg>ZgkyqQqnsRZF5B9SAgo)cPZ zps{%pRe+$J@l@G>Lc0P}TNmtWkjB5dX!GpzZY<=d)%BK`AQ*}K!X_@*UDvx~fm| tV4DbVNGNWy zqydSPrB%{SX}9F4NPW^acyLHMBGIYEhoIwu6L);DkqtuA24nKZI@EWxQMUD^O*m)1 zXZTL_=_}5+tQ9NXF3+sHdZkc#hVx2%!LrV;cTXlR?r>zYq#|BSD)3N)=$r-7c`H^r z|76W1)8X0y@`wJz{xVi0vQ4h+fZ>2QVtzRIm8*KK_Y-Qu$(3vo_@?TJxtGS zxWyaN(AqKxq1s`~f_4?BE7;gfgqI7-75-Pl`tgS|GffuwcF&4iR{z&lNTTbhbgFou zC*NC7HSqeymS0ToN+hz3rcte%FRB0Nr%?r3ThuT10 bQTyS-qW7Z6_FOL{lS!cJkgKvjf3VViJBI3hR&G``t1QNO=bHUk)($hn?@ z&Z*Kr+y4#Y#QvFYZ0{)uF8qA`N#Id$T!erJ|N4alL0< +Ajp R>qZ z74dWAAavSuXwcpf%gUiK@`HU!DJ$pUffZ7wXXPGM;j(g2RjnLQvT|;WJp7Vsb%Tzq z+zpSdqBEgWIDNX`tIq6rc)Kzj8CVg$L98rk!SDCpasoXe5$At z6R@7iseZ7>MgwA8jXJkJRJ+cf^clFI)vj!9tZO*1%2t{aDX-5-SM{Xc>?})wcBQ;= z39!Bj-6DYmE7{@IRKf%A*_wCG4VECM8F!kIa!%Qu$r0%c;{rI5Lf8^kc2)n8ev)Rh ztjSva?|Yp~oJ*L+?j_zs{mxEu3B82 C zWh(}j-| xO27%ZqDE66lJ8T$h*M#@4YEk;eeh9&6gWTh zu7>RAGrX~jdxc{_A{olcoXs6|$QM<`1GyyTj%mal!zyHyhN@=LX^!)IVym5$!<85V zEBB70B<6`1t!2?Ra05XYv=HV1^L43?XhALfn!Mfe<2;oLt&nA}ggK2ph;IOAR)Od-#x2gH@IqEV9&Km!$@~ z#P5WItg@7BEIYZJev($|prRkr$8}0?&`P~QD|MSrW=%cTbc#-5Hp!nxCk>P@IAvQH zj*TxJfj108I@xnthVcwenYKA)dWutWh*PGgI3 7xtA`eJyHMWm6%d$v5UdZ zYkD%9>fXycU1yjfe3|o4Oi(XDJM pnoZMBU|PyeZ2ur8zn* z-7q-^aKu$xbHv?TyX(W<-r6)1^;R}-n1|GHl_XS4U8SN!r=>oolB!)kXpMV;x1l-V z9zGiN`&qx~jiIXK&HHj~ox{j;+LLFilMU{F9O=GC344Nij$(H>3uJhW)MP0wk#r~+ z4w5vjCzA1GEJ>j%!yL-5N+9AEBqHic y${)ht9A$ z4{Bf@n8)A1I)~^{c9b8AZKk)e+xX3~H^|pz&!}t2H^hxbx4Aa^Hgnse3@T+AUXBV1 z8^tSFcosyIVYZchl*Gp=W>DYw?p2p={NTNbKfKdAPxO2H%Oxr23+Y;%diCoc-}#@n zJ^}Ktz6p%Ei+=ak+QGT=W6HFZAoKiaDvV|@SD){I17Sc}0oPhFp~4_BiwGb&ix1Gj ziVC@Y775IMw!94;s}UVo3AMCEbOi($3DBA@duf-SFMxuThzrg3{5Cf< 8vQ8OAHl}7c^Cdaj*(b!PxYwA#L)YuxjTYV_BJ^G0Bh_WO5bm%$d`RxAC53<6n zFu-aws#?;fDwa+nG!t&`I4!M{({quj{p%3VV3$~(Gx }Hua|~H~+6K_xy2_5`S`I?VLaTpXJ^6 zBMVpzEnq&hfE0{xF1JF0Fo)qpA}Wh~)FBZmp^>K3)zs^9^fe``v#zEs4sTTSb0a(- zaB*BfmWdP($$c>(oJ=nWO9T?~R3ToqO`+N_h3d)lLUp`KqIwOoD(7KH!C E^Rpdy5`X{X(dh4MV;0(Z$3w;K3M{O z&TzuxoI9HXX@6D%1y|F*PstUBoI~CrZOGVNJyfM3h&`kFP;pcFj`G9c5$B`jXPvvs zW6oE~Z ~3yU*qx!&yg7g_P_w{HC2eJ5^f@3`vo*%yc!(6nTE zF8Cq1>G3ssaOP$8k3TrKy9F`p1q4A|4QIUoa+b%ddu!eh%iE3=F2i0_`<{?ZqrvoH zzj=?`hEG$HeVOBNZ{ 6zMSNXO z;Q&R=$^~RrDb>@$SyB&N=aL
3_qxViM_d&2LI*7` zQQ$;bB*mht*rugm4q)PXti6e}U6&OSBIY3l3{8FU&o7IMZSB&IP@vm@k>t^%{DiF^ z^q_s($R)V2OTfalajNnZAwS%Hdg8CKEhH@3$s)V@zma`?bMWrzoinGG+ZMY#zEr#r zP6HQP>8!h^8H`7-QqTPSzLm54X3n4Gpd(7(h1Y%1S>qEi3R1z^M$$PDNyeQT{>Fg` z^5<}lTFB?E3%u1Z-{;_cg%F=AIOtF$^t$%C{vrPf{}0|(;I(2W-(I}U`=I(@_Brpj z)iLir)$3%PKBf?6=Xw{gwB@x}QfQHh9i$8ZVjBP{!;j%QwAogW*dbKl1+(&3BPz#s zB; Sp918XfQwj=UaL2&AZOOSNI+wk6&5H`X2Xb;MfeeMvw6dhO|cZghS zZ!^J(B`;^%XA08CtS*Ri*$@12&IA>6iMi5TXO5b?OxhHfG J zKb4nilrAF|k&m^ag&w&G=piPK4#Ezt1}`#cNS?4K5#cS270UE6Jz*6#5e=TgzpcTi z5HUDDg1pPrt(ml~@g1?;@EMt}!u!!*vKKxA_wXsWhYv#io|DfqmQNVCN;w9sd=$Rq zWB@jN0ybzDiRFtlzQ&2@JBoghBuQMKG *d)biP!x5-Qn@;dRJnjJDghX3_W1SKl z=#=0nXJ~2&+Uh!JOjTjxFNEVNmM73xvD_SN?C*|3U-V(vqtI{ue~f(zoEycJcU5<* zb@rkA?v~V2OQWkLwKVt9V~+>p8PAN38GOkY+ZbaGUpQbK2aHX;1UB3bgk>RY7P9%A z1dK6`frKOz60#nL90amIV%T2@*JglZ9UzOP`Knr)u>tda>+y7VwYoJ`^?&cxd-Yzu zO5{-05UaoNc;k$kiWJU74ym4~^c&5LE)qGUjV6vv|K)KcxzPFbC-L|jLSpT-O|=Yc zX(W}Z;wkwv!Z@kfAq;VgM9xNVVz+rSf)l&xh`YF0&z}C4PFDoV)se4`&)qCoqn;=q z%iTX%=;_{YZ*I=r|2TY3(C+Z~$RE{z^wkY*@u0uuXE%?J>>o>8OK@!O-mY|E@SKh9 zi`QQMy#&WeSjNfI|4r VXA~W#VpWHa |MuG24;LxnwVr3!_QdwXze~#|cHp-5O}|bR$wxp8-tm19N40wx z*@5vF;)K~2w54t5+NciO*F*mnIufGZGrnsgVmRhEiVvItI7I{Rq+T_`X(Pl_NRrf; zHxaNSK{C(=i~nM?)nWy)80r8T(CMb$CeYZdqmi9QBh!w?rX7u~IvN{vG&bmHY~Rt? zs-ty}0S!4CM(AJC1fY4Eps|T(iDPRqj;y A1l>Bh(Co8wL64xcqY zQY)X0LoxnnoKWJM<3!vgx}iJGVL|ga`eL?e+p$gCj%|FIE{B}R#CxBG3i~Yk0!y-f zX=FB-K_4Y_-@%#wf=_u5&@eJ}dQCC1C3Lj`hcoLrId!JkIy>`4H+)hJEw72XzEnI} zA&;ec>U-vX`MlAc>0~e5M*`k=5dOUU1jgxfk8=5Zs1MuiEZ)oq{tk3QsoY z1DwbXdl#V}f_t@qg8&3{00*QB!ZPnN-(G?qFA)shJf+Pfw zr6mpuA^4z|3-TNb4Iwlz8jUm^0@mP%{Eh;rabq0GRoQnS&dH_^K@s>MBrq}k5|VHX z*X;4`(Xw8{pp+~N8pD-&-6QatK=A^66t#m0BVB@gJo+QVahV1hCvmKE&403b(l-TW zR~$Cy%h5-TtZ#TCc%PvWOgfP{TUM!=lMY@ZpPXC3l@)Mh3Em#+gZO}G=e2{b4*lfD zr;iR=xxSetE6WTJi#VjnHv;mU&NHTwA^flUPdg&s9Q=!7_hrAnvy$t8rEGh9{pTU# z#XVBMoJiO`LSlXW8&J8SRZJ3z1l_u~7Qc9_LWz8-P7%76rv z)noPYfG2s%sJIl5;_Y+wdHTGgu2IjZcd22iV_dkxu->xHy1{Xo=Q8g)VZHbT{#wT_ z&lkPhgdLG Rua$$kX>X8D`-1NP&rOj~Fx%~HI `o`J@K(`+j3&`XC1Em?5|a&25M>h0US|Z=%;^!mawH+j+L7rmJZ>k6$dT!7+NC1M zMl#v#pcrw9V#Eo|fEEd`N)%90phz=4wM==##UJ3EElG+=8x}q0Xk6Q0Fb|XRmaM{bcxa=B%VU6AX=g8M-3_ z$HeIBgE0LXjw!%PUYqBSkb= &D8%VM0~fln0WX;CBh f@6zWIG|A2BpAyz84C{HV-68;)@p!4ZYa%JZ&ogZ@K1>8RFfle|! z$aNwS+L>$4V4?HRwJ#$@`j0tyUhewbf!uF$R1P|r6k;I*bi)MP3im?8P0UZk4@Gi` zxJSHG{FX@l3-b!|0Ylyl?}bl6^7lxWU&V+nh7mh8ht$VGj^PxplM F-rbt*YA z%rVeJ&tCakD{+bT`;4^Z!R}|fiEdP-Cpmk$8!-d!qr*t$M8h_XU3m}+2bJ5x&p-j> zh^s*t=q3gqkNy=4;*(P!)R6Ymh~=-&(z;IR-i|F>GW%FW )+Pd7p6TU$q%`qPfC8 z3tQ&!fyD;_A3$@WRrjClQmVf0?h|;f;fqQ&<3pE7+uZ{6AtF%8%*zlP!KKzqgpK(} z-~sVK lC>53Ehux z!&bp}o$g*7p1S}nVCDyw1(pYw<~Ig51~=qy3LXjmJjkY;DOWpa4-A4q<`Vi6<0ZCx zly8A=1zz$q=vx_uu_-KVGm5m^?-AWR-gkl$k@4abU1@hR70 +0fb#rKP(KG(>& zQsp8dV9u?$2{%#~G_RqhC6X*B2a;s+`Dg|hUO+m%zfe4_N{r~aJgcuG)xAN*TW3{? zg**-q#^h#iCXsb?>@(#v4V8jz3TV&_RQiA9t2FTqxs1hf)c`+NvJ%E-{K9NTUZg0( zzt(>}(4U8YDW*yfUeQ(Tg&q0Mf%@MrF3#I<-X-UhOFa;pOq?&6YL$s6?w^mOEfMp{ zo9lPL;MckmS)@rAdLF9{)lYRVxo~dhur^n=TEpr67 &Wf4uMoG8` aCTx7=W%zsj=-T=irbP|SksM-lP9s6II}H5W((F9kmWe_E>0g;<-6b2GjpEK zp^Mbnt-2ItkhH`MgQX^tmgsyG5AS-JcQ?+Qe*d+DtaCOi^sWi~UHtR>^Fa3|VW|wa z>Q+zFK}Dh$&7AH*)yzoeC4A_BzUJM>aEcpb=x3HiqZNo(y%{BY)D0U+>E@pLH9_pZ zXh}IFk p!uxli?(7198Z=x6I>E0r)sjhNGFkE~sc)yAPW^j|+8F;u z{H-`?inqi& UbDE(@_`wL@1b4QOh$a_h%-Jo8ACC zj=&!hLW@=p^!d5^N33T~-7_!5ZQgv*i96QZId^zYpI=JZ1ASUFV`s>RYViyEsCe9% z^sFLw)b_3LN=!UXCf#d^9c%yT2b;>vGNp69Q90bkdaMp_q$qF4K7v-%^ZlsjWzYuR z);M6~1m1}Bbj38|8(JSr#6?lkJw%e^kBfpN@zCb=Ct6g_mr-RGl-VO(Dw*VYjur*M zh@+k__4)ki7A*l2Z{t8A9`)>2Tic9NNWp6cALxJ`sEgY>&eFxznLeKSL|QMsn_oZ8 zF1V)~4xU1*-BU?8 EUV~)N%R0jyE7Jn0)o!{d zfCKf6DfdOh)t5Z<=vI#Zc-NAGh{kU!8gwl}H=hg!y(y2~ZgUP4Zb5vY$MGRq&4YV2 z*Q@{QSfG#uc>2s(AiNzl(TMeFgaE}FAwX8Ar`!zw(fv6{Qz?s%)u*F?NP9CJFY`fF zH^Dy}?(^ATpM$f(KI9{3i?aI(Rf2CDmI5n?9HQ}-AxGfBgJ!?&DEub;Drl@kuQdh3 zCo*gIjF0!AU&B)UgnqGvIf^vq{RG}K%l8Z*$zP-IyA1vQ?lA*Y_>+yDOYnX)`|EM| z3VN1ryhFY5|9^*i<9~i@$ew-&nWvxg&fiY|9Z)|C2T#9a`d_?b0v{eVo$(I;x$o3w z-{HY~NBPD(JXjBwQ!A(uU<4fS0udyURn-Riz&T(PTmUWvmw-*+YH%I+xwdx0 luyyO2^@DT1 zbZu+t%8d@s;&FoR>>Woxu~o~3!18N1E?>U!T5^5N!lv_iIkp}sCnh_T$rmQE`lKid z|H33cY41Rn{3O0S^H+ZkDvdLLyz%^}9{$Yps0Un9tWs7>$>!PFJbRnxna_=%Du4R? z>CZo1PJHV7XZ{}f+d{cqxC 6hV_oG7rmFh34YVlQ6fL}uw mt! zp)|?=VFD`0kJpZ=#X?&%pSryv?~)1Kb*ZXv*5^b=Y-Xp`9#S2!C>d?@guRiFdk(y$ z&t`OqJ8D0f>kt5}{{`%YEc%NA=zh{mI0aNEC;GEb8VQ228A =R7p`03E{mPj1BS9++{^AH8O=88^IB6kj>Za-wb|XpnQHYt^N3d zfrXpecHh&>h;EvI%U*PRJ9_)Y<$=Y_FO Em7+nK#Ml4ohC2eO;j z+&D4f^0K{!OiSg&xGz69Kit`}{PB^_c^7>dUU%Js{-u3pLoV9Y@{MfJ?MkY-$|!p% zky&sa(ou=}pAilYa$MgnrcYxTgO!RK%SOUTL14zMG#e 4%J_VyH_lzzX-+q?%M*Nt9SnW@2GeG zjCz+R2az;dtObexLq0_kq##DP0vh@`9P&*FK4kPEonq}lpAdQqu0 )Mc5Q|J9Y4r!xEBuK`#32w$&PINXHt4UvxBWlv8Hu$8 zbG_vGHHGN5*eibmWc@vz&KBvCxdmKvFfL=tIvk1kEFPB$T^^EU!Dqug5JHB>S}o&S z>wyEFB_5*Sfk_W6Bi%*dQ`B K72pxIy@JIhrZax#qKbO##FV20 zQ5;_7sw$1mie@{jO>V4hZBSRTEX9yn+DhWw(nuXf(vMv=dd0f=%kI5-d`#WpLj5&O)lV^5O;6bt_6~DL1~ld*#WUV@v0y>;F=2Q$3|+Uui`2 zk|FYUAP732^fQf6F1%fdheqQ*U7&BHAEYT7_{AWOVrPy}PS97IK>wjqJ@Fhe&0l#A zNg%b<2+M4y)WqpE1Olfw8D6Ni2B_ir-NY~Y2F9pBt2$CE#3QN}CDzPojmIl UPe?JAFeZBq zYDpmUyzFk$*xF-@44gV~+cR78Vr72XQ&bD?h&dp)4X^7T*|8{H-t@g|-)>Xu-zk3S z(Hqv5GV{w}lP{lec)NPK@}cy(7qx1aZ`m_Wf$3=wu5Tp2Ouh$=z%zZSz7Lom1MCsX z1^OyjmzV1olHW(Iwg48KtJxXRte6S2(L#}@_gHhWHr^O9YDUs%1*{nwD5C}FU(q)) z`G*o>d)&^6T6J Ew|;&7kG1!SN4`eYx4=8esZ&q?Tm3@#jho3e z^`F%Kj%umYH qy{i1!AH zAPzhVW5BG_NA(z%q?0OM9HBTmuqJTEu0EH;_4PL&UOcm_PyKePySc3os>NJ=f2p;Q z2EmU3upT0i?Po=Gs8mo-PQQsd>?ei|NP}`suLihpn>)V|G@da*< P#JLwLJRN1m_U}-2v`el z(iW`X$Hzzcxt&^pH$t#5&08$KF`kcH?6Y&D;wUkiMy4)^L?T3FaZk_astDxwER;s+ zRX1b?Z>UrX85r;yEuz_nNOqz=F)`7n;sI!?Z(^c0F@ebzb!7GUB!YJ07%n2Hk$yQj zam>+iLMLWL7a9^~I6XX?)UDM UaQ?SkmoQqfyKU=&{Bg zX)NKUMt4%d&Pwfnk}WQ>{s!qx$#qUqz0|H
euyVLT4~`TiDSQ| K|X9Mc 9}T&Mz{9D_k>#5w8~DxK zH~f{f%TirQq?}~^Ey~#<*As~rCslt7ftje=3Kbu
MgX};9^z8`rZE%|o`Z=pstyq#5xIN2@E9fOR^j~p9TU-CYKzIM=qi+8!SAGh1 zenM4i$I d0m1v=7No)!#GP2*_|&SER)~e KQaK~5zj{D)p*g(1t=BNf!|1G=Tg|5q85+esCiC%UA z={@!If<8%ddCe~VUU+H!RYdD9MDQ<>FCm>Y3);ZArkL6cnk?HiRrPg5nyZ$4qO*}s z#B7Slt*zOD>=f;mtSpE?SJ ~G(2=knSw6Xht!M%z;GpA&__oZFe|Y3WYp zM#eW^5+z>>b*|_e-|itCyDsfob52UKgw!-~Q>Gj?OZDNfIv^)CB~TN)GAmcD-==4^ z`7=e4@1n7HPz$sGrxPKW<*cHWuxe=hWobE@PRmh*?336}!^&QyAt2+!(ScbNTWv@x zPgPL^Cs7e=A5xywSp_!$Nl$$Pq=qEL%%)G2Q&iH{KDw@b;Z+NhU%$IJJ~kwe9^Sh5 z_^k`ZZk^bE&guch6O5aZ#El)7juz%z{mnJUUUQ}UGRqeY&%fdDrp-UTb+Oaq3`8&$ z`w FAD& zAKNp0Ae! nN&e3EZrWaAs(xFEnj3JzyeDCXmep{eeIx!<19u zSaW}!G>+YUF!pGSiWTYpM$A}*CNp$~Eeg1gv)b3)JXtqT=bL7R6wMARea|a>v*`cm_@0#)Yf5tLCGa}61`p+aj zT8t96#}t8;>TecC+Jt7$>_R=01($1WMv6w(pp5s^BWanInS9I>bj|jOp8b`kos0~r z1cV8SbY|t47)M=j$m0~<7Tsi;>47GF;^rUYPdwKcKaf?(PfqGhZ)_|?He2pKqs?bD zx@GxB63LfvWuY3hMth32=UUogEN+OM+$6Ee;OgFeglXL+^<3Lf&QdgbdD9>pvi4FBW|mJrCPF#SS=6{ppbU?{Z^N&t;u#tUr+>oznzw|l}a&- zSnmm!T^3`A@zkl(EZZH&cA?IB`Y2dEhLHUv|21=jVj B75mX2G6=8#e#+jwKF{!xuwsMbead5uw@vHfVWCQdMI|A)ZNxA{~VeqNBss z sysH zVQihDTsQ6tyhF(ur8BXH2N|)PtbNo|wutRHB9W_vO>mDTthNwRp*?KkB1Nh8X0{wO z!58blN~uqIPwr95kbAp(H~EV~%Vgq6hUu z5VUH(Aji2yH{nhjSpuh+j36tM;dSA3hzN?%a)!l^hmKb!iiPMWSn+fdh@RSiq$&}X zi&YW?_MWr0NNbB^4waE4%9TSVNiv1Xx!TpZ)}V>V!>A@b;E*?jv zWw48Pb#?Jd*FX ?-07Ay1F@cn$ieSazmw8VN0NktK~rit@;bl)v_3d*0*x z&x9>ph}S-dC?aPLw-*QrOKjMZ6X&Ri(TC4pr(L!?6n7&4?H-5dgVE4m5z>gAtzk7q z+!QNCd4zf-7pgx7W4V$m !| ztmJB!6(ZT;^_@6RDzc{6quS-cI<1v~#x%(L{5eC=%SSu~58?473fWj95(o~01We=u zUJ^uNBC4_9$3-j|Ld-Q39Hhb_-F)KI1lG>ISjnlCjx`6D>Twm_s$r^yXJIx8N>JBq zKEa|+@>}o+Ev*rj6-)8j?{ggy8&$tgsvn?-N9zAHZ;mz6mW9u}O}->q0!qAgDQ3nd zAU{5J57|@OwosF#frZ4*L@B~bwL^Gj|NZGVsdcEeaU^{@Sd(o~G%7}dMHpxR76IfD zN(2BQIqu;GC11$x6Fng=23Uq+S&t=djL~M%*qnl!;E`d1Rn`ui?God4{8;UnJ|j@A zR*zMyx^Do^!bLZB#yBmDl6eyGC%K=Eb?4!Rfw_rVhK=_Y>UYhXBY6{1k%KqGd*JP& zns7 >OSF=_RNG z3vd6`-s^vP$JpY#CwFe0yl+MQH_3Sybre<&DgK^|hkDlx#Npc;p8m)4hHrXi>y{sW zW#QnBKiYHEceb|YH+=hxiypdRaqqT=P_40MJ&Di|KnoZ}1DwVoLXen@NH?mQW*jEK z@Jxgu8Bq?0O)aurbYh`sFp2c+n669zCaW~)ZR)haH#04IT8on^vnm`C^U?Nn?WJTz zWcwEq$&uSP&n<3v;L7dl@=INXv99E|5S!ajovcDRMch50O2NMM3wkbHm|bw`hWxoD zJ)h_N`m3n#aYC3juv*JA4A9~u2H0nSc>@xRk$54l#YtqWbrjst?dI|#&H^+RfPofS z#I}*yW?^_$b{q7e9C3Q72}nt)>djFxF4)b}fX0X yPBu)@v%~a%+4~m2D2r?1 z`F1y(P4<~5NnDbTB;>`CKoTG?LLQqJED24PXMws&He?}W wboMW_2Pc_%=u=YNk{?-NnmG^Ip@qb- *Gn@Nh z-NSp s~qMTSj}?EKn~ZfGjAKOpv@ zY%h+eJhHu_IDIBJGc_%BWAe<{ B&5woSakvYuH({c{wN7rl+J!(sR@?(6O9) zcE(I_NO`bVildWzG7tTlN;{Tr^7F;ME%=M)oV$O+F}kRspK;KQJ!}c-GdmlC`x-|Z z+fK#c>+NZei|1<4 DLB;9?@msggKQO1@ zsz?d*C*PlC(5uoiYTFjCbEUeU+A2-s9$lJVwmfTt6+9@6J?R=4dq#3s#VUP5I?RyT z^oj~n)>9_o%PPvgTlPTNugb#8%1CYDeAqKq5Waw;p9;aEx}vxuE;~=lX|&1o(;j`C zTpzEO=);OLvh(wEvz2ifVH! K2HLTKWicvTO!DgcL_PdzU;lDmpCWOAFTTHkEIz&5udcXJ$s1H*YFkxw6o_*>20y z&x#JqZ@qKllJ&; IMa{sKjW0}FU zWKQXv^z4F+qy>cqiPcW?yx4?Tp67PdIaU~!mCdW1H#=)yZ7cotCh!G^aF=~`#lo4Z z^_%qD_0lFiSFY#s^qfA9+`@4c95 o;mbaAwBpa2&Lr{SbS%Xj(y3Flp4HM@ zbO!AQyLkscT-1qxt%U>E_W1cjTGTA*p-h>+aCu>!k}t{q>QrV?T9kQSUH( GT2Ja1=LHf3 Hz1`rPl`+PDDPsOod7U1 zmpL;Qq-tM2vFU;C;_?-ewED%p*WYlRCar8Pca8LrZg%-xx8>A{yszJ~hC91>L0VdQ zjazf=H}~Jk{Um2`W^@|L{YO~=$gL;WRTL?eQ86(a!@^_3V&cNW>04j8@bIvtq_~)v zTA3tPCW(>B!t{EHWFC07C{=ibgv2GKT&1L~kx}<`%y+WGC4%D;Pjv7&2N!Soc%B0e z?G}X&e`Ad1(6+Kykh4a@CM71u^QIwLLE(lu?jw2bduEi+mqZj-$Q1*JHR|$GZk_Z{ zYsa~NO6|qjX=$m6>iAf90(Xcn(DAb*Y50p^f0jq$-ul*x>eSTv^JipdW=pcOa^#7M zr10>h{QR)moUELrgc&I*Njlw(h{(vKSS|hbjaIA7nUR!`tw@wb%u9*Vkkpj A5wtV$H>9?}ez=y>qM&+itt2yJpq~|5UMrB64DxG&%aX*-uADfbl-wRZM z7taPwl@NEuEpoXMrYSy^OHIwmE8q$Wa!YbJZIK~|OUO;qD-&|(CMM)26l=6aYQ0ih z#A~@|Ehp7-dAXc6HzBvSNE=(ET_7onE=nzu78P--tMp1enUlluIb5ESQz*F{rCzy_ z%ZcT3q>DK&4+b=+FPo8&FiT&wFegpV=N6 GmxoKG_of+hzWRJoW>oBLcf`e%R=Rg=>3z!m1+3y`MN5>i=~wC0 zn!BC)xWYnib8$InH998=*J_md`1kr| zFN(=Xgv~^Cf%_~St#~?1&qVf8i )>yv3diiPo9;mm&@xp&cG?v1~pf!RL3gS z3S}%iBZ((^9esshS~9O!$15W^c}jR{;Q0tD70gxC>xMJbbq?I(JB_6#tb4oPGj^l6 zVjR2yn(+HPWr36pXz|z~Mw%EEF?TVyCa1Odh&rt-@2g+TUp!0o*OVpmxG(vPm@tL< zpmer=b`;fx)V$jLJNKzM3zL JE>IXwEJ_T#Y; zXe51NVYcVQi^B;rW)`>OqvmgIC{fN%Iae;(_}JdQ8GM4Yd1;PmOO^X>>FwLMaf<{& z+}DRaEXh#c2m;E<8^2jj;$aI6USAOh6IkjmWO1 lTAj>IXIZL37HS8wHDfQ+&C}|6GLQWaWDTXp#VK+ifIm@X+KD!`i z3Cp<#WG$8a3TrnDJLzY$kkg7e#Vn^z_#4Y9VL260rbF^F*3NREOuOVctX<40fihbq z|B1DWIn~H#0BeUF@%LjCd&5kmg>+Yx%$ZZ2mz5RArRC(sCB>+7lJX!fTluw?W!2i! zlu}7)xp7%d)tva4td#1woX9kulZSuJRGI-RP_W$oC3Mm3@yXy4z;bnO4TuMOy06aY z`gM555QSr$i(;Sf#K(E8)$^0#L%ehnm)LZ iV9OksiSKfmnG~_DvkJ~GWj)8%GO&KuZho~udK`}PSff0 z%4QjV kc5pv-%}i#mu1v!>4b9jreKIj6MjalZl1u;RLtA1}=Iq%s zvl6Yc_>$)D(O;n WTh-%nxI~6BiZtTKtcOiV5k7%EZG-zr1RnzIEo$lRr$k zIpt>l*sSW*m(pX>&(8iw#;2LjWw&PkHs`fDFV3yV{hz!q=I2e5xODiKAD(|^w6UPr z8?O$ ZLcK2~tD;N4IR#ZU~zPz=RT48>3k#ZU~zP#jGx{7WcK z+4zr848`dj7vwIue!*u84GV99_{1W^I7G*ycNYDnXns)zL|4&G821(3Q`A@VP|>3h z4;3AOc&zxglABAN7|)e$D|>bEoW)O-&n^GSlFTJtOS&rb6 b_aGr|$N;{SbdtcYwxv zb0~&lD28GvUQQ8Tuf)OMee^fOxf_U_sECxL3wJ`gNO%*{Vn}02EaapUDW;2rPDqR0 zUqHGR@pYK4hcp|?9D+1TFhZIRIeB 4O%kW+y91z55GOD=#iPeEFY>3T>P zL76upje@I-$V^PrG0n$(Biy@))M8qXsR{F&5nqWVS0TOz({-3b W&tl|O41A2F0U{wQk=sga%Sw=k;`Nv=!>i4Rn=xID zIqNX}I;QI}-2mxY;BY5gqv?7~X=sstNa*+bY3RaKioKSMloa2;q2OW}E+x(6U53j@ z7CFoCFp|I(GF(m!oQdJ#WSf_dg3Ke2GdzOa%w5ZHwMNFdz3=2&sFN_9BU)V%!zDzf z+sAMz$<{d;E+etJoeU2nDqSDL R-e~{foG$e-Rh;FXE#9MO@Ush>Q9caZwF6v*z)tdN( z-yj}I+n%XpIJ7caF8c+8R8oHmXORJGF(RHWnPcC z4*6_hIOQXjkD)ru9AG%;F!TQ+9*gq)o#7x)=C2Wtqu)Zwn#FJ#Da;c4E}oXpTFG!I zpS1w-L@a+3!)bYZp_c3_+NW7RXE^j}*1sY?6Z`bX45xi6_FW2={{zEm`DYPNr+u2O zWH|I`mZ-NJs-Nsd3 =G<&*slh6A7MB@|cq>0jZee}!MW6n^be`IT4sl~?)o zi^|h4j}V^Zg9Xed3js5ePGSYPoY+Y>{JY2w(t|nGKsf-XsRi n=9IFYgfv_k1^khWt qYCgYsGWzAv>eK|0Y^KOrV_YdhFOK}a *c!~N)DFa?8S`Og6+Vq8#Kz3CaAXq<)ByTZ!WaJeUxt( cqC+@XQu5efwgcRUdhEew!nW6^0EQfT-4Ae`W;SoEsyd1 z26z#Fp4ljg#m`qby&CgK(}bM6{d}7Vt=G=9P20H%xr!}!p!cQP5#_hw%u)|`wxX?p zr{?uRJWL)Q{7kPkZ-zXvpFCD$#d(O<*Armf%~(edj>vknL)x!xIOBM%aw+y%H 5PP7wQBv;r%uYZKaXH|uu;wwYeFdOZ*I3>MVC*v}q27VWBs%{yWZ zcHl~90oqQFrC69<_Aoo_nApDXYRH0Zr+Tw7Pv6eQY8!Ch%EpLqR_1X&>tZ&O<&kmt zz9n?d6MgV@)Q}Z=JKIl3?KsDD1^Ai4Z9ES@^u9K{&r^D6?`8<{ZXVqS-`$0)0b5YJ zJ#sk$R!d?VeDjc}4-M$=?O02Pm$v#@2=!ZH4>^IGZ+;b}ZbezFY@X`%_NBis5&JNY z^|%v9Ntag!&$te>rO|8ESA(aO{xeOWP5U&l9rd{N0{hW38}tI*%`{{6lb{__TBlDh zo1sLT-`wFkk3SYYe>=9oGvk#6cySAGw4=xI^`)=JdA9QN%rZXxcxE!6j{JQ};9XAi z6=GktvUU$W=URs8QHQtnPPU$O;rQ)B3FvkI8T~>nz%#$qlN!9*L~4Or4YOr4<}^Sa z4_>qxuB-ye2)Rbc$%GOu?0P2l)M}iE>Y?09oa00u&5$+%y%v33E#Z--)G{dF2)yXM zHDnFeQ3Kpsuw*mxUJkh?fHkZfy`vg(RuUuPb?61f`WoRbGq$#Y&55F Z z0c-R~wj8Kt;9t+KRs!z^ QNe>{;C140Ldx;I=E`a z8KMd9G-69zP %LNA z`zl#ljhbshO6-klq|De?^s0gNWiz%TxYpHZi8WZN5?kEjwUAo0UQv3Fb&7Q~`AH(y zNBh=a7LQf)=NTg+7ti&TtfvR-g=)PLbwcH8@zy*XXBeB0@cHxRFXYXgR(`p?+wR)Y zW96&ujvl+i; sE_n3vcfjo}nkRB$!8)y{nziT5fA|*q!zcSN1Ba!wEO=3v-JXVp%APC0De} zrDd0!z5LBIF*+>UZQYyrrj8C ?xC_+F=#cXdMhXg2S%^KA~R#bq_{?KWpm z7Zk8`xAQ#?8(eII5|ppS$@f?tTWu~EaBJNGw_Eux5UHE8f(uRq4^kjTH3c;oD5S-F z;`BJ|?Y(U-15Z^>+XJ_FDzJ6)+dFM-oqmFChe~bTZC$ r{I;>8Y1Jni`;j4h&?&VdA8pyIiEiUU;+RY9d)Y@*}-rZ%lv tdP?&0tlhcWZCh+T)^?jE*Y4PqN2xq0`3;j; zGTXpg&?=l%Fv_N>$J&k7X0q%6$@wn(CR-a+?%=Czt-#;X#n)R~9bnWivl1p+;@4Eo zo9)mhsv7GyYnQ!8RClwbtEZE%w{*AJ+qR%8m)bkK`TE{=Cmnri^$OZKP8 n|VHd7sguAoQZcHZ9Vve>$*QY@g$o*f=D8+|LNKo+Od z-e$8<`)Ief^=^e8!J*7|*t$S7S(IZyYxx$i;O!QN_1D=bQM(lw+QfbsvK+tN=IW%` ze&%Li=0>IWT<)@gor-l+UJlVMK@B*DXbTPeR(rdxgF-7Rq^B1e DYDB zOlBp}!aQiW(+YkLIMBXkS{hPRyn$9J4jQIu6k>a)ed~GJNQXhMqZ@>=B7=52@3f;V zo2_jwkAeB@7>vK&h6AreG;vF-eVY|qi4Et$`OzVR^3Xxn }S*WpfSR(88~1Zd%n~tTFPLl`TML8u--> z=K7|UW*$m3S2mj0@=djTW#d|YSwo}Iz}Ku<(OlEg!Z$VZ4a--U8fqY~p|RSu(%8^g z$5+99jZJ3W)Bqz9n3|h-S|MZAP}4%0Ew5>=t_QNRs=?G?UTffM8_bQAXDu+T g^|nXszLl^}gH z%2(aAVr_FnUA>vFZ!#HcAhW6lB&)14)reI=qpD4n4a*I@v2uB3T@BvV1YDZ27?W;w zeGO(oeU