{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-16T02:59:09.541327Z",
"start_time": "2020-10-16T02:59:09.528362Z"
}
},
"source": [
"# \"Covid19 in Indonesia\"\n",
"> \"My attempt to visualise Covid19 in Indonesia\"\n",
"\n",
"- toc: True\n",
"- branch: master\n",
"- badges: true\n",
"- categories: [Data Viz]\n",
"- hide: false\n",
"- search_exclude: true\n",
"- metadata_key1: metadata_value1\n",
"- metadata_key2: metadata_value2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook is my practise to do EDA (exploratory data analysis)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I used to be interested on the daily covid data when covid hit Indonesia back in March and April. It had been a while, so let's have a look at them now"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Data will be scrapped from:\n",
"* https://github.com/CSSEGISandData/COVID-19\n",
"* Our World in Data (for Indonesia): https://github.com/owid/covid-19-data/tree/master/public/data\n",
"* Covid data for Indonesia from SINTA (via KawalCOVID): http://sinta.ristekbrin.go.id/covid/datasets\n",
"* GEOjson for Indonesia: https://bitbucket.org/rifani/geojson-political-indonesia/src/master/"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Summary of this notebook:\n",
"* Download Covid19 data for worldwide and Indonesia from several sources\n",
"* Download GEOjson map for Indonesia\n",
"* Worldwide: summary of latest data, worldwide map, death vs confirmed comparison\n",
"* Indonesia: summary of latest data, summary plots (total cases, daily cases, positive rate and mortality rate) and other random stats that I am interested in"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"New skills I picked up and applied on this notebook:\n",
"* First time using Git properly\n",
"* Using Plotly Express\n",
"* Extracting data from Google Sheet API\n",
"* Cleaning data. The spreadsheet is messy. Table are stacked on other tables in the same spreadsheet tab\n",
"* Extracted data is string. Not sure if there is a way to extract in a numeric format instead of converting it to float manually. For next time, maybe there is a way to just download from Google Sheet automatically and just pd.read_csv()\n",
"* Working with GEOjson data format and plotting an interactive map\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Covid19 in Indonesia"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import necessary python libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:41.658412Z",
"start_time": "2020-12-14T08:53:38.803586Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"data": {
"text/html": [
" \n",
" "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#collapse\n",
"# download python libraries\n",
"from datetime import datetime, timedelta\n",
"import os\n",
"import glob\n",
"import wget\n",
"from bs4 import BeautifulSoup\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import geopandas as gpd\n",
"import json\n",
"import plotly.express as px\n",
"import plotly.graph_objs as go\n",
"\n",
"# for offline ploting\n",
"from plotly.offline import plot, iplot, init_notebook_mode\n",
"init_notebook_mode(connected=True)\n",
"\n",
"from IPython.display import HTML"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Last updated:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:41.674410Z",
"start_time": "2020-12-14T08:53:41.659416Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"data": {
"text/plain": [
"datetime.date(2020, 12, 14)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# collapse\n",
"from datetime import date\n",
"date.today()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.139389Z",
"start_time": "2020-12-14T08:53:41.677410Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100% [............................................................................] 347677 / 347677"
]
}
],
"source": [
"#collapse\n",
"# Download data from Github (daily)\n",
"os.chdir(\"C:/Users/Riyan Aditya/Desktop/ML_learning/Project4_EDA_Covid_Indo/datasets\")\n",
"\n",
"os.remove('time_series_covid19_confirmed_global.csv')\n",
"os.remove('time_series_covid19_deaths_global.csv')\n",
"os.remove('time_series_covid19_recovered_global.csv')\n",
"\n",
"# urls of the files\n",
"urls = ['https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv', \n",
" 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv',\n",
" 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv']\n",
"\n",
"# download files\n",
"for url in urls:\n",
" filename = wget.download(url)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Clean & preprocess data"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.250210Z",
"start_time": "2020-12-14T08:53:43.140356Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# convert csv to df\n",
"confirmed_global = pd.read_csv('time_series_covid19_confirmed_global.csv')\n",
"deaths_global = pd.read_csv('time_series_covid19_deaths_global.csv')\n",
"recovered_global = pd.read_csv('time_series_covid19_recovered_global.csv')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.313175Z",
"start_time": "2020-12-14T08:53:43.251176Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(88617, 6)\n",
"(88617, 6)\n",
"(83712, 6)\n"
]
}
],
"source": [
"#collapse\n",
"# Melt DF => switch rows of dates into column for simpler DF\n",
"dates = confirmed_global.columns[4:]\n",
"\n",
"confirmed_globalv2 = confirmed_global.melt(id_vars = ['Province/State', 'Country/Region', 'Lat', 'Long'],\n",
" value_vars = dates, var_name ='Date', value_name = 'Confirmed')\n",
"deaths_globalv2 = deaths_global.melt(id_vars = ['Province/State', 'Country/Region', 'Lat', 'Long'],\n",
" value_vars = dates, var_name ='Date', value_name = 'Deaths')\n",
"recovered_globalv2 = recovered_global.melt(id_vars = ['Province/State', 'Country/Region', 'Lat', 'Long'],\n",
" value_vars = dates, var_name ='Date', value_name = 'Recovered')\n",
"print(confirmed_globalv2.shape)\n",
"print(deaths_globalv2.shape)\n",
"print(recovered_globalv2.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Why are there differences in number of rows between confirmed (or death) & recovered?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This seems to suggest some countries are missing their data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.533382Z",
"start_time": "2020-12-14T08:53:43.314176Z"
},
"code_folding": [
2
]
},
"outputs": [],
"source": [
"#collapse\n",
"# Combine df\n",
"covid_global = confirmed_globalv2.merge(deaths_globalv2, how='left', on = \n",
" ['Province/State', 'Country/Region', 'Lat', 'Long','Date']).merge(\n",
" recovered_globalv2, how='left', on =\n",
" ['Province/State', 'Country/Region', 'Lat', 'Long','Date'])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.595754Z",
"start_time": "2020-12-14T08:53:43.534176Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# preprocessing\n",
"covid_global['Date'] = pd.to_datetime(covid_global['Date'])\n",
"\n",
"#active cases\n",
"covid_global['Active'] = covid_global['Confirmed'] - covid_global['Deaths'] - covid_global['Recovered']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Grouby data by day"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.627373Z",
"start_time": "2020-12-14T08:53:43.597713Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# Data by day\n",
"covid_global_daily = covid_global.groupby('Date')['Confirmed','Deaths','Recovered','Active'].sum().reset_index()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Grouby data by country"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.801084Z",
"start_time": "2020-12-14T08:53:43.629046Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# Data by country\n",
"temp = covid_global[covid_global['Date'] ==max(covid_global['Date'])].reset_index(drop=True).drop('Date', axis = 1)\n",
"covid_global_percountry = temp.groupby('Country/Region')['Confirmed','Deaths','Recovered','Active'].sum().reset_index()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Worldwide Data Viz"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Latest data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Show latest data"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:43.833047Z",
"start_time": "2020-12-14T08:53:43.805053Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Date today 2020-12-13 00:00:00\n",
"Total cases 72,252,541\n",
"Active cases 23,312,234.0\n",
"Recovered cases 46,849,822.0\n",
"Deaths cases 1,612,362\n"
]
}
],
"source": [
"#collapse\n",
"# latest data\n",
"print('Date today',covid_global_daily['Date'].iloc[-1])\n",
"print('Total cases','{:,}'.format(covid_global_daily['Confirmed'].iloc[-1]))\n",
"print('Active cases','{:,}'.format(covid_global_daily['Active'].iloc[-1]))\n",
"print('Recovered cases','{:,}'.format(covid_global_daily['Recovered'].iloc[-1]))\n",
"print('Deaths cases','{:,}'.format(covid_global_daily['Deaths'].iloc[-1]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have reached 1M global death =("
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:44.611086Z",
"start_time": "2020-12-14T08:53:43.834048Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# plot\n",
"temp = covid_global_daily[['Date','Deaths','Recovered','Active']].tail(1)\n",
"temp = temp.melt(id_vars='Date',value_vars = ['Active','Deaths','Recovered'])\n",
"fig = px.treemap(temp, path=['variable'],values = 'value', height = 225)\n",
"fig.data[0].textinfo = 'label+text+value'"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:44.627087Z",
"start_time": "2020-12-14T08:53:44.612088Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
"\n",
" \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
"
\n",
"\n",
""
],
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#collapse\n",
"HTML(fig.to_html(include_plotlyjs='cdn'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Total confirmed cases world map"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"World map interactive plot"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:44.643087Z",
"start_time": "2020-12-14T08:53:44.629087Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"def plot_map(df, col, pal):\n",
" df = df[df[col]>0]\n",
" fig2 = px.choropleth(df, locations=\"Country/Region\", locationmode='country names', \n",
" color=col, hover_name=\"Country/Region\", \n",
" title=col, hover_data=[col], color_continuous_scale=pal)\n",
" fig2.update_layout(coloraxis_showscale=False)\n",
" return fig2\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:44.738086Z",
"start_time": "2020-12-14T08:53:44.644086Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
"
\n",
"\n",
""
],
"text/plain": [
""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#collapse\n",
"fig2 = plot_map(covid_global_percountry, 'Confirmed', 'matter')\n",
"HTML(fig2.to_html(include_plotlyjs='cdn'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Treemap total confirmed cases "
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:44.754086Z",
"start_time": "2020-12-14T08:53:44.739087Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"def plot_treemap(df,col):\n",
" fig3 = px.treemap(df, path=[\"Country/Region\"], values=col, height=700,\n",
" title=col, color_discrete_sequence = px.colors.qualitative.Dark2)\n",
" fig3.data[0].textinfo = 'label+text+value'\n",
" return fig3\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:44.818088Z",
"start_time": "2020-12-14T08:53:44.755087Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
"
\n",
"\n",
""
],
"text/plain": [
""
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#collapse\n",
"fig3 = plot_treemap(covid_global_percountry,'Confirmed')\n",
"HTML(fig3.to_html(include_plotlyjs='cdn'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Death vs confirmed"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For top 50 countries with the highest total cases"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:44.834090Z",
"start_time": "2020-12-14T08:53:44.819088Z"
},
"code_folding": [
0,
1
]
},
"outputs": [],
"source": [
"#collapse\n",
"def human_format(num):\n",
" magnitude = 0\n",
" while abs(num) >= 1000:\n",
" magnitude += 1\n",
" num /= 1000.0\n",
" # add more suffixes if you need them\n",
" return '%.2f%s' % (num, ['', 'K', 'M', 'G', 'T', 'P'][magnitude])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:45.086089Z",
"start_time": "2020-12-14T08:53:44.835087Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
"
\n",
"\n",
""
],
"text/plain": [
""
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#collapse\n",
"# plot\n",
"fig4 = px.scatter(covid_global_percountry.sort_values('Deaths', ascending=False).iloc[:50, :], \n",
" x='Confirmed', y='Deaths', color='Country/Region', size='Confirmed', \n",
" height=700, text='Country/Region', log_x=True, log_y=True, \n",
" title='Deaths vs Confirmed (Scale is in log10)',\n",
" hover_data={'Country/Region':True,'Confirmed':':,','Deaths':':,'})\n",
"fig4.update_traces(textposition='top center')\n",
"fig4.update_layout(showlegend=False)\n",
"HTML(fig4.to_html(include_plotlyjs='cdn'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Worldwide tests per thousand"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load data from Our World in Data"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:57.981883Z",
"start_time": "2020-12-14T08:53:45.088086Z"
}
},
"outputs": [],
"source": [
"# collapse\n",
"# load data\n",
"url = 'https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv'\n",
"df2 = pd.read_csv(url)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Parse to latest data"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:57.997849Z",
"start_time": "2020-12-14T08:53:57.982849Z"
}
},
"outputs": [],
"source": [
"# collapse\n",
"# parse to latest data\n",
"date_to_parse = (datetime.now() - timedelta(days=4)).strftime('%Y-%m-%d')\n",
"df2_latest = df2.loc[df2.date == date_to_parse].reset_index()\n",
"df2_latest = df2_latest[:-2]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-13T08:52:24.095714Z",
"start_time": "2020-10-13T08:52:24.082749Z"
}
},
"source": [
"Eliminate countries that don't report new tests per thousand, sort by new tests per thousand value.\n",
"\n",
"Note: not all countries report their new tests data regularly"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Number of countries that report their data: "
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:58.013882Z",
"start_time": "2020-12-14T08:53:57.998848Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"(43, 2)"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# collapse\n",
"# eliminate countries that dont report new tests per thousand, sort by new tests per thousand value\n",
"df3 = df2_latest[~df2_latest['new_tests_per_thousand'].isnull()]\n",
"df3 = df3.loc[:, ['location','new_tests_per_thousand']]\n",
"df3 = df3.sort_values(by=['new_tests_per_thousand'], ascending = False)\n",
"df3.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Top 10 countries best on tests per thousand:"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T09:03:15.008974Z",
"start_time": "2020-12-14T09:03:14.982975Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" level_0 | \n",
" index | \n",
" location | \n",
" new_tests_per_thousand | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 178 | \n",
" United Arab Emirates | \n",
" 15.816 | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 12 | \n",
" Bahrain | \n",
" 5.914 | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" 93 | \n",
" Latvia | \n",
" 5.112 | \n",
"
\n",
" \n",
" 3 | \n",
" 3 | \n",
" 99 | \n",
" Lithuania | \n",
" 4.430 | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" 43 | \n",
" Cyprus | \n",
" 4.265 | \n",
"
\n",
" \n",
" 5 | \n",
" 5 | \n",
" 139 | \n",
" Russia | \n",
" 3.721 | \n",
"
\n",
" \n",
" 6 | \n",
" 6 | \n",
" 149 | \n",
" Serbia | \n",
" 3.204 | \n",
"
\n",
" \n",
" 7 | \n",
" 7 | \n",
" 9 | \n",
" Austria | \n",
" 3.099 | \n",
"
\n",
" \n",
" 8 | \n",
" 8 | \n",
" 130 | \n",
" Panama | \n",
" 3.082 | \n",
"
\n",
" \n",
" 9 | \n",
" 9 | \n",
" 74 | \n",
" Hungary | \n",
" 3.036 | \n",
"
\n",
" \n",
" 10 | \n",
" 10 | \n",
" 41 | \n",
" Croatia | \n",
" 2.946 | \n",
"
\n",
" \n",
" 11 | \n",
" 11 | \n",
" 83 | \n",
" Italy | \n",
" 2.838 | \n",
"
\n",
" \n",
" 12 | \n",
" 12 | \n",
" 81 | \n",
" Ireland | \n",
" 2.565 | \n",
"
\n",
" \n",
" 13 | \n",
" 13 | \n",
" 175 | \n",
" Turkey | \n",
" 2.445 | \n",
"
\n",
" \n",
" 14 | \n",
" 14 | \n",
" 30 | \n",
" Canada | \n",
" 2.422 | \n",
"
\n",
" \n",
" 15 | \n",
" 15 | \n",
" 44 | \n",
" Czechia | \n",
" 2.193 | \n",
"
\n",
" \n",
" 16 | \n",
" 16 | \n",
" 87 | \n",
" Kazakhstan | \n",
" 2.156 | \n",
"
\n",
" \n",
" 17 | \n",
" 17 | \n",
" 181 | \n",
" Uruguay | \n",
" 1.838 | \n",
"
\n",
" \n",
" 18 | \n",
" 18 | \n",
" 34 | \n",
" Chile | \n",
" 1.701 | \n",
"
\n",
" \n",
" 19 | \n",
" 19 | \n",
" 66 | \n",
" Greece | \n",
" 1.662 | \n",
"
\n",
" \n",
" 20 | \n",
" 20 | \n",
" 138 | \n",
" Romania | \n",
" 1.634 | \n",
"
\n",
" \n",
" 21 | \n",
" 21 | \n",
" 8 | \n",
" Australia | \n",
" 1.461 | \n",
"
\n",
" \n",
" 22 | \n",
" 22 | \n",
" 25 | \n",
" Bulgaria | \n",
" 1.235 | \n",
"
\n",
" \n",
" 23 | \n",
" 23 | \n",
" 129 | \n",
" Palestine | \n",
" 1.221 | \n",
"
\n",
" \n",
" 24 | \n",
" 24 | \n",
" 104 | \n",
" Maldives | \n",
" 1.171 | \n",
"
\n",
" \n",
" 25 | \n",
" 25 | \n",
" 177 | \n",
" Ukraine | \n",
" 0.944 | \n",
"
\n",
" \n",
" 26 | \n",
" 26 | \n",
" 118 | \n",
" Namibia | \n",
" 0.792 | \n",
"
\n",
" \n",
" 27 | \n",
" 27 | \n",
" 157 | \n",
" South Africa | \n",
" 0.762 | \n",
"
\n",
" \n",
" 28 | \n",
" 28 | \n",
" 36 | \n",
" Colombia | \n",
" 0.725 | \n",
"
\n",
" \n",
" 29 | \n",
" 29 | \n",
" 76 | \n",
" India | \n",
" 0.669 | \n",
"
\n",
" \n",
" 30 | \n",
" 30 | \n",
" 161 | \n",
" Sri Lanka | \n",
" 0.647 | \n",
"
\n",
" \n",
" 31 | \n",
" 31 | \n",
" 79 | \n",
" Iran | \n",
" 0.540 | \n",
"
\n",
" \n",
" 32 | \n",
" 32 | \n",
" 158 | \n",
" South Korea | \n",
" 0.527 | \n",
"
\n",
" \n",
" 33 | \n",
" 33 | \n",
" 115 | \n",
" Morocco | \n",
" 0.520 | \n",
"
\n",
" \n",
" 34 | \n",
" 34 | \n",
" 140 | \n",
" Rwanda | \n",
" 0.282 | \n",
"
\n",
" \n",
" 35 | \n",
" 35 | \n",
" 128 | \n",
" Pakistan | \n",
" 0.182 | \n",
"
\n",
" \n",
" 36 | \n",
" 36 | \n",
" 172 | \n",
" Togo | \n",
" 0.111 | \n",
"
\n",
" \n",
" 37 | \n",
" 37 | \n",
" 13 | \n",
" Bangladesh | \n",
" 0.099 | \n",
"
\n",
" \n",
" 38 | \n",
" 38 | \n",
" 173 | \n",
" Trinidad and Tobago | \n",
" 0.096 | \n",
"
\n",
" \n",
" 39 | \n",
" 39 | \n",
" 116 | \n",
" Mozambique | \n",
" 0.067 | \n",
"
\n",
" \n",
" 40 | \n",
" 40 | \n",
" 57 | \n",
" Ethiopia | \n",
" 0.050 | \n",
"
\n",
" \n",
" 41 | \n",
" 41 | \n",
" 124 | \n",
" Nigeria | \n",
" 0.036 | \n",
"
\n",
" \n",
" 42 | \n",
" 42 | \n",
" 167 | \n",
" Taiwan | \n",
" 0.018 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" level_0 index location new_tests_per_thousand\n",
"0 0 178 United Arab Emirates 15.816\n",
"1 1 12 Bahrain 5.914\n",
"2 2 93 Latvia 5.112\n",
"3 3 99 Lithuania 4.430\n",
"4 4 43 Cyprus 4.265\n",
"5 5 139 Russia 3.721\n",
"6 6 149 Serbia 3.204\n",
"7 7 9 Austria 3.099\n",
"8 8 130 Panama 3.082\n",
"9 9 74 Hungary 3.036\n",
"10 10 41 Croatia 2.946\n",
"11 11 83 Italy 2.838\n",
"12 12 81 Ireland 2.565\n",
"13 13 175 Turkey 2.445\n",
"14 14 30 Canada 2.422\n",
"15 15 44 Czechia 2.193\n",
"16 16 87 Kazakhstan 2.156\n",
"17 17 181 Uruguay 1.838\n",
"18 18 34 Chile 1.701\n",
"19 19 66 Greece 1.662\n",
"20 20 138 Romania 1.634\n",
"21 21 8 Australia 1.461\n",
"22 22 25 Bulgaria 1.235\n",
"23 23 129 Palestine 1.221\n",
"24 24 104 Maldives 1.171\n",
"25 25 177 Ukraine 0.944\n",
"26 26 118 Namibia 0.792\n",
"27 27 157 South Africa 0.762\n",
"28 28 36 Colombia 0.725\n",
"29 29 76 India 0.669\n",
"30 30 161 Sri Lanka 0.647\n",
"31 31 79 Iran 0.540\n",
"32 32 158 South Korea 0.527\n",
"33 33 115 Morocco 0.520\n",
"34 34 140 Rwanda 0.282\n",
"35 35 128 Pakistan 0.182\n",
"36 36 172 Togo 0.111\n",
"37 37 13 Bangladesh 0.099\n",
"38 38 173 Trinidad and Tobago 0.096\n",
"39 39 116 Mozambique 0.067\n",
"40 40 57 Ethiopia 0.050\n",
"41 41 124 Nigeria 0.036\n",
"42 42 167 Taiwan 0.018"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# collapse\n",
"df3 = df3.reset_index()\n",
"df3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And Indonesia:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:58.044873Z",
"start_time": "2020-12-14T08:53:58.032853Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" index | \n",
" location | \n",
" new_tests_per_thousand | \n",
"
\n",
" \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [index, location, new_tests_per_thousand]\n",
"Index: []"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# collapse\n",
"df3[df3['location']=='Indonesia']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"we only tests 8% of our total population. Certainly much lower compared to other countries"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Indonesia"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Data starts 18 Mar"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Import data"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:53:58.060816Z",
"start_time": "2020-12-14T08:53:58.046850Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# find how many days in between 18 Mar to today (so we know how many rows to download)\n",
"from datetime import date\n",
"\n",
"d0_total = date(2020, 3, 18)\n",
"d0_harian = date(2020,3,15)\n",
"d0_aktif = date(2020,3,21)\n",
"d0_sembuh = date(2020,3,21)\n",
"d0_deaths = date(2020,3,18)\n",
"d1 = date.today()\n",
"\n",
"delta_total = d1 - d0_total\n",
"delta_harian = d1 - d0_harian\n",
"delta_aktif = d1 - d0_aktif\n",
"delta_sembuh = d1 - d0_sembuh\n",
"delta_deaths = d1 - d0_deaths"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-08T03:30:10.961202Z",
"start_time": "2020-10-08T03:30:10.954221Z"
}
},
"source": [
"All df imported are strings. need to convert to int. Also had to remove all the comma in the thousand separator."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note: you need \"Credentials.json\". You can get one by following this example: https://developers.google.com/sheets/api/quickstart/python"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Code to import data from KawalCOVID:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Update 16 Oct: Kawal covid changed their datetime format in their \"statistik harian\""
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:54:02.117548Z",
"start_time": "2020-12-14T08:53:58.061816Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Timeline!A1:AZ\n",
"Statistik Harian!A1:AL\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Riyan Aditya\\Anaconda3\\lib\\site-packages\\pandas\\core\\arrays\\datetimes.py:837: PerformanceWarning:\n",
"\n",
"Non-vectorized DateOffset being applied to Series or DatetimeIndex\n",
"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Copy of Data PCR - Kemenkes!J2:M36\n"
]
}
],
"source": [
"#collapse\n",
"# %load GoogleSheet from KawalCovid19\n",
"from __future__ import print_function\n",
"import pickle\n",
"import os.path\n",
"from googleapiclient.discovery import build\n",
"from google_auth_oauthlib.flow import InstalledAppFlow\n",
"from google.auth.transport.requests import Request\n",
"\n",
"# If modifying these scopes, delete the file token.pickle.\n",
"SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']\n",
"\n",
"# The ID and range of a sample spreadsheet.\n",
"SAMPLE_SPREADSHEET_ID = '1ma1T9hWbec1pXlwZ89WakRk-OfVUQZsOCFl4FwZxzVw'\n",
"\n",
"\n",
"def main():\n",
" \"\"\"Shows basic usage of the Sheets API.\n",
" Prints values from a sample spreadsheet.\n",
" \"\"\"\n",
" creds = None\n",
" # The file token.pickle stores the user's access and refresh tokens, and is\n",
" # created automatically when the authorization flow completes for the first\n",
" # time.\n",
" if os.path.exists('token.pickle'):\n",
" with open('token.pickle', 'rb') as token:\n",
" creds = pickle.load(token)\n",
" # If there are no (valid) credentials available, let the user log in.\n",
" if not creds or not creds.valid:\n",
" if creds and creds.expired and creds.refresh_token:\n",
" creds.refresh(Request())\n",
" else:\n",
" flow = InstalledAppFlow.from_client_secrets_file(\n",
" 'credentials.json', SCOPES)\n",
" creds = flow.run_local_server(port=0)\n",
" # Save the credentials for the next run\n",
" with open('token.pickle', 'wb') as token:\n",
" pickle.dump(creds, token)\n",
"\n",
" service = build('sheets', 'v4', credentials=creds)\n",
" \n",
"\n",
"\n",
" # Call the Sheets API for total kasus ----------------------------------------------------------------\n",
" sheet = service.spreadsheets()\n",
" \n",
" SAMPLE_RANGE_NAME = 'Timeline!A1:AZ'\n",
" print(SAMPLE_RANGE_NAME)\n",
" \n",
" result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,\n",
" range=SAMPLE_RANGE_NAME).execute()\n",
" values = result.get('values', [])\n",
" df1 = pd.DataFrame(values)\n",
" \n",
" # Call the Sheets API for Statistik harian ----------------------------------------------------------------\n",
" sheet = service.spreadsheets()\n",
" SAMPLE_RANGE_NAME = 'Statistik Harian!A1:AL'\n",
" print(SAMPLE_RANGE_NAME)\n",
" \n",
" result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,\n",
" range=SAMPLE_RANGE_NAME).execute()\n",
" values = result.get('values', [])\n",
" \n",
" df = pd.DataFrame(values)\n",
" headers = df.iloc[0]\n",
" covid_id = pd.DataFrame(df.values[1:], columns=headers)\n",
" covid_id.columns.values[0] = \"Dates\"\n",
" covid_id = covid_id.replace(',','', regex=True).replace('-',' ', regex=True)\n",
" covid_id = covid_id.replace('',0, regex=True)\n",
" covid_id = covid_id.replace('#DIV/0!',0, regex=True)\n",
" covid_id = covid_id.replace('#REF!',0, regex=True)\n",
" covid_id = covid_id.set_index('Dates')\n",
" covid_id = covid_id.replace('%','',regex=True).astype('float')/100\n",
" covid_id = covid_id.astype('float')*100\n",
" \n",
" covid_id.index = pd.to_datetime(covid_id.index, format='%d %b')\n",
" covid_id.index = covid_id.index + pd.DateOffset(year=2020)\n",
" \n",
" # Call the Sheets API for Population ----------------------------------------------------------------\n",
" sheet = service.spreadsheets()\n",
" \n",
" SAMPLE_RANGE_NAME = 'Copy of Data PCR - Kemenkes!J2:M36'\n",
" print(SAMPLE_RANGE_NAME)\n",
" \n",
" result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,\n",
" range=SAMPLE_RANGE_NAME).execute()\n",
" values = result.get('values', [])\n",
" df2 = pd.DataFrame(values)\n",
"\n",
" # return DF --------------------------------------------------------------------------------------------------\n",
" return df1, covid_id, df2\n",
" \n",
"\n",
"indo_covid, covid_id, pop_id = main()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Clean data"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:54:02.132986Z",
"start_time": "2020-12-14T08:54:02.123950Z"
}
},
"outputs": [],
"source": [
"#collapse\n",
"indo_covid2 = indo_covid.copy()\n",
"indo_covid2 = indo_covid2.iloc[:, :-1]"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:54:02.147956Z",
"start_time": "2020-12-14T08:54:02.134941Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# find index of relevant tables\n",
"index_tk = indo_covid2.loc[indo_covid2[indo_covid2.columns[0]] == 'Total Kasus'].index[0]\n",
"index_ka = indo_covid2.loc[indo_covid2[indo_covid2.columns[0]] == 'Kasus Aktif'].index[0]\n",
"index_ks = indo_covid2.loc[indo_covid2[indo_covid2.columns[0]] == 'Sembuh'].index[0]\n",
"index_km = indo_covid2.loc[indo_covid2[indo_covid2.columns[0]] == 'Meninggal Dunia'].index[0]\n",
"\n",
"#index_tk, index_ka, index_ks, index_km"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:54:02.195465Z",
"start_time": "2020-12-14T08:54:02.148939Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"#Split table into total cases, active cases, recovered cases and deaths\n",
"#Then set dates as the index\n",
"\n",
"total_cases = indo_covid2[index_tk:index_tk+delta_total.days+1:].rename(\n",
" columns=indo_covid2.iloc[0]).drop(indo_covid2.index[0]).replace('-',' ', regex=True).set_index('Total Kasus')\n",
"active_cases = indo_covid2[index_ka:index_ka+delta_aktif.days+1:].rename(\n",
" columns=indo_covid2.iloc[index_ka]).drop(indo_covid2.index[index_ka]).replace('-',' ', regex=True).set_index('Kasus Aktif')\n",
"recovered_cases = indo_covid2[index_ks:index_ks+delta_sembuh.days+1:].rename(\n",
" columns=indo_covid2.iloc[index_ks]).drop(indo_covid2.index[index_ks]).replace('-',' ', regex=True).set_index('Sembuh')\n",
"deaths_cases = indo_covid2[index_km:index_km+delta_deaths.days+1:].rename(\n",
" columns=indo_covid2.iloc[index_km]).drop(indo_covid2.index[index_km]).replace('-',' ', regex=True).set_index('Meninggal Dunia')"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:54:02.466283Z",
"start_time": "2020-12-14T08:54:02.196939Z"
},
"code_folding": [
0
]
},
"outputs": [],
"source": [
"#collapse\n",
"# clean df\n",
"def clean_df(df):\n",
" \n",
" mask = df.applymap(lambda x: x is None)\n",
" cols = df.columns[(mask).any()]\n",
" for col in df[cols]:\n",
" df.loc[mask[col], col] = 0\n",
" \n",
" df = df.replace(',','', regex=True).replace('',0, regex=True)\n",
" df = df.astype('float64')\n",
" df.index = pd.to_datetime(df.index, format='%d %b')\n",
" df.index = df.index + pd.DateOffset(year=2020)\n",
" \n",
" return df\n",
"\n",
"\n",
"total_cases = clean_df(total_cases) \n",
"active_cases = clean_df(active_cases)\n",
"recovered_cases = clean_df(recovered_cases)\n",
"deaths_cases = clean_df(deaths_cases)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:54:02.497941Z",
"start_time": "2020-12-14T08:54:02.471947Z"
},
"code_folding": []
},
"outputs": [],
"source": [
"#collapse\n",
"# generate new cases, new recovered, new deaths\n",
"new_cases = total_cases.diff()\n",
"new_recovered = recovered_cases.diff()\n",
"new_deaths = deaths_cases.diff()"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-07T04:39:00.646919Z",
"start_time": "2020-10-07T04:39:00.636906Z"
}
},
"source": [
"## Latest Indonesian data"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:54:02.513960Z",
"start_time": "2020-12-14T08:54:02.498945Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2020-12-14\n",
"Total cases: 623,309.0\n",
"New cases: 5,489.0\n",
"Active cases: 93,396.0\n",
"Total recovered: 510,957.0\n",
"Total deaths: 18,956.0\n"
]
}
],
"source": [
"#collapse\n",
"# display latest data\n",
"print(d1)\n",
"new_cases_temp = covid_id['Total kasus'][-1] - covid_id['Total kasus'][-2]\n",
"print('Total cases:','{:,}'.format(covid_id['Total kasus'][-1].round(0)))\n",
"print('New cases:','{:,}'.format(new_cases_temp.round(0)))\n",
"print('Active cases:','{:,}'.format(covid_id['Kasus aktif'][-1].round(0)))\n",
"print('Total recovered:','{:,}'.format(covid_id['Sembuh'][-1].round(0)))\n",
"print('Total deaths:','{:,}'.format(covid_id['Meninggal\\nDunia'][-1].round(0)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Total cases plot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Latest Indonesian Covid data:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"ExecuteTime": {
"end_time": "2020-12-14T08:56:45.128007Z",
"start_time": "2020-12-14T08:56:45.004983Z"
},
"code_folding": [
0
]
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7IAAAE6CAYAAAAr/G5oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABC10lEQVR4nO3deZicVZn38e/dSSTiRkBAQBGQTRCIQ3RQeWVRWRQBlcUZFdEZGR3HhVVZFFSWURBkRlHcUEQgCyTNKjs6KigJnQTCjmxpdtlkC53u+/3jeSpUqqu3pDrV1f39XFeu7j7nPFWnn3Sq86uzRWYiSZIkSVKraGt2ByRJkiRJGgqDrCRJkiSppRhkJUmSJEktxSArSZIkSWopBllJkiRJUksxyEqSJEmSWkpTg2xEvCciLo+IRyPiHxFxY0R8tqbNxIg4MSIeiogXIuK6iHhvncdqi4jDI+LeiHgxIuZFxMeG0Jc9I6KjvPa+iDgqIsbVabdtRPy57MvDEXFyRLyyTrvNy+/t2Yj4e0ScERGrDrY/kiRJkqT6mhZkI2JL4EpgAvA54KPADcAvIuILVU1/UdZ/E9gNeAi4LCIm1zzkd4BjgB8CuwLXA9Mj4oOD6MvOwHnl8+8KnAocBRxfp89XAI+WfTkK+Azwq5p2awPXAq8E9gK+CLwfuCgiHAWXJEmSpOUQmdmcJ444HjgEWDUzn60qvw4gM98VEVsBc4HPZuYZZf14YAFwe2buXpatATwA/HdmHl31WFcBq2fmlgP0pQN4JjO3qyr7JkVQXTczHy7LZgJvAzbLzK6ybD/g18DWmXljWXYKRcBdLzOfKsveC/we+Fhmnj/0OyZJkiRJguZOLX4F0AW8UFP+NC/3a/eyzdRKZWYuBs4Fdo6IlcrincvHO6vmsc4CtoiI9fvqRES8CZhc59rfUIwW71q2mwDsAkyrhNjSNOAlYI+qst2Biyshtuz3H4D7a9pJkiRJkoaomUH2V+XH/4mItSNilYj4HPA+4JSybnPgnsx8vubaBRTBdcOqdouAu+q0A9isn35sXn68ubowM+8Bnq+69i3AxDrtXgTurrQr18uuX9uuqj/99UWSJEmSNIDxzXrizLw5IrYHZgL/WRZ3AZ/PzHPLr1cFnqxz+RNV9ZWPT2XvedK17eqp1NV7nidrnqOvdk9U1U8Cop92m/TTF0mSJEnSAJoWZCNiI4oNlhYAn6eYYrwH8JOIeDEzf9usvjVLRBwAHADwqle9autNN920yT2SJEmSpOaYM2fO45m5er26pgVZih2Bu4DdqtacXhURqwGnRsQ5FKOab65zbWX0szLi+iSwSkREzahsbbt6KiOnk+rUTap5jr7arcrL05ifArKfdn32JTN/CvwUYMqUKTl79ux+ui1JkiRJo1dE3NdXXTPXyG4BzKvZOAngr8BqwBoU4XD9iFi5ps1mFBssVdbELgBWoljHWtsO4JZ++lEJoJtXF0bEesDKVdfeTbEOt7bdRGCDSrtyPe+9te2q+tNfXyRJkiRJA2hmkH0YmBwRr6gp/2fgRYqRywspdg7eu1JZHr+zL3B5Zi4qi39HMbr7iZrH+iRwc7lxU12ZeT8wr49ru4BLy3Yvlc+zT9mHir0oQvQFVWUXAB+KiNdV9XtbitHl6naSJEmSpCFq5tTiHwLTgQsj4jSKNbK7A/8CnFIGx46ImAr8oDz+5h7gCxS7Ai8Jnpn5aEScDBweEf8AbqQIuzuWj7lERPwK+HRmRlXxEcBFEXE6cA7wdoozZE+tnCFbOga4HpgWET8C1gNOBGZk5pyqdidSBOELIuIE4HXA94C/UGxuJUmSJElaRs3ctXhGRHwQ+Brwc4qjbe4GvgicXtX0M8BxwLHAKhSjp7tk5o01D3kk8CzwFeANwO3APpl5UU27VwGP1PTlkojYCzga2L+sP7583up2cyNiJ+C7wMUUZ96eSRGEq9t1RsQOwMkUG1q9BLQDB2dmzwC3RpIkSZLUj+h9Ys3oFhEPAj/IzO81uy/9cbMnSZIkSWNZRMzJzCn16pq5RnaFK4/8WQk4rdl9kSRJkiQtm2aukV3hMvNOih2RJUmSJEktakyNyEqSJEmSWp9BVpIkSZLUUgyykiRJkqSWYpCVJEmSJLUUg6wkSZIkqaUYZCVJkiRJLcUgK0mSJElqKQZZSZIkSVJLMchKkiRJklqKQVaSJEmS1FIMspIkSZKklmKQlSRJkiS1FIOsJEmSJKmlGGQlSZIkSS3FICtJkiRJaikGWUmSJElSSzHISpIkSZJaikFWkiRJktRSDLKSJEmSpJZikJUkSZIktRSDrCRJkiSppRhkJUmSJEktxSArSZIkSWopBllJkiRJUksxyEqSJEmSWopBVpIkSZLUUgyykiRJkqSWYpCVJEmSJLUUg6wkSZIkqaUYZCVJkiRJLcUgK0mSJElqKQZZSZIkSVJLMchKkiRJklqKQVaSJEmS1FIMspIkSZKklmKQlSRJkiS1FIOsJEmSJKmlGGQlSZIkSS3FICtJkiRJaikGWUmSJElSSzHISpIkSZJaikFWkiRJktRSDLKSJEmSpJZikJUkSZIktRSDrCRJkiSppRhkJUmSJEktxSArSZIkSWopBllJkiRJGqNmdSxkoyMvob2js9ldGZLxze6AJEmSJGnF+81193L0BQvoSfjaefMB2OPt6zS5V4PjiKwkSZIkjTHHtN/MN9qLEAvw4uIeDpkxv7mdGgJHZCVJkiRpjHixq5vPnPFXrvvbE0uVT5zQxnc/umWTejV0TR+RjYgPRsQfIuLZiHgmImZHxI5V9ZMi4ucR8XhEPBcRV0bEFnUeZ2JEnBgRD0XECxFxXUS8dwj9+FxE3BYRiyLi9oj4fB/t9oyIjoh4MSLui4ijImJcnXbbRsSfy748HBEnR8QrB9sfSZIkSWqkX/7xb7z1G7/rFWIBvvvRLVtmWjE0OchGxH8A7cAc4CPA3sB0YOWyPoALgV2ALwEfAyYA10TEG2se7hfA54BvArsBDwGXRcTkQfTjc8DpwHnlc00HTouIL9S027lscwOwK3AqcBRwfE27LYErgEfLvhwFfAb41UB9kSRJkqRGO+GSW/j2RbeSQFvAhHEBFCOxp+47uaVCLEBkZnOeOGI94Fbg8Mz8QR9t9gBmATtm5jVl2euAe4CzMvPLZdlWwFzgs5l5Rlk2HlgA3J6Zu/fTj/HAg8ClmfnpqvJfArsDa2VmV1nWATyTmdtVtfsmRVBdNzMfLstmAm8DNqu6dj/g18DWmXnjQPdnypQpOXv27IGaSZIkSVKfZt64kIOnz1uyFraiLWBcWxsn7TVyR2IjYk5mTqlX18wR2c8CPcBP+mmzO/BgJcQCZObTFKO0e9S06wKmVrVbDJwL7BwRK/XzHO8CVgfOqin/DbAasC1ARLwJmNxHuwkUI7RExASKUd1plRBbmga8VNNvSZIkSRoWv73+viUhNlh6FPaUfSZz53G7jtgQO5BmBtltgduAj0fE3RGxOCLuiogvVrXZHLi5zrULgHUj4tVV7e7JzOfrtHsFsGE//di8/Fj7PAvKj5v11y4z7wGer2r3FmBinXYvAndXtZMkSZKkYXHKFbdz5Kybl4zEJtDdk0wY19Zy62HraeauxWuXf04EjqAIeXsDP4yI8Zl5KrAqcG+dayurkycBz5btnuyn3ar99KNSV3t97bV9tauUDabdE/31JSIOAA4AWHfddfvusSRJkiTVkZl85dwOLpj30FLllV2JWz3AVjQzyLYBrwH2z8zzy7Kry7Wzh0fE/zStZ02SmT8FfgrFGtkmd0eSJElSCzn7L/dx5KybqbcN0mgKsdDcqcV/Lz9eUVN+ObAmsBbFqOakOtfWjnoO1K73/tIvqzxG7fW11/bVrlI2mHarDtAXSZIkSRqyU6+8gyNmFiG2dj1sK+5KPJBmBtkFA9T3lG02r1O3GXB/Zj5b9VjrR8TKddq9BNw1iH7UPk9lLest/bUrR5BXrmp3N7CoTruJwAZV7SRJkiRpuczqWMhbjriEU668c0nZaFsPW08zg+zM8uPONeW7AAvLo2wuANaJiOrjbl4LfLisq7iQYufgvavajQf2BS7PzEX99OM64HHgEzXln6QYPf0TQGbeD8zro10XcGnZ7iXgd8A+ZR8q9gJWqum3JEmSJA1Ze0cnGxx+MQdOnUd3uaPT+FG0K/FAmrlG9hLgGuD0iHg98DeKILoT8JmyzQUUQfOsiDiUYtru4RSj5d+rPFBmdkTEVOAH5fE39wBfANanJnhGxLXAepm5XnltV0R8AzgtIjqBK4EdKY4H+lIZTCuOAC6KiNOBc4C3U5whe2rlDNnSMcD1wLSI+BGwHsWmVjMyc86y3CxJkiRJgmIU9pAZ83udDdszykdhqzUtyGZmRsSewAnAtyjWlN4GfCIzzy7b9ETEbsBJwGkUx9pcB+yQmQ/UPORngOOAY4FVKEZPd8nMG2vavQqoDp1k5k8iIoGDgUOB+4H/yszTatpdEhF7AUcD+wOPAMeXz1vdbm5E7AR8F7gYeBo4kyIIS5IkSdKQtXd0csiMeSzuTmr3cxptuxIPJLLellajVES8CniKIixPa3J3+jVlypScPXt2s7shSZIkaQRo7+jk0Bnzeam7B4BxAd0J49sgCU7ee6tRF2IjYk5mTqlX18ypxc3wboqNn2Y0uyOSJEmSNJAlo7A9udSxOglMGNfGSXuNnVHYamMqyGbmFcBbm90PSZIkSRpIe0cnh503n67uIsFGQObYm0Zcz5gKspIkSZLUCto7OvnK1LlLlQUwfoxs5jQQg6wkSZIkjSAzZj/A186/aakyR2GXZpCVJEmSpBGgvaOTg6cX62FrGWKX1tbsDkiSJEnSWFe9qRPAuLYAipHYU/edbIit4YisJEmSJDXZQdPn0V01EpuZTHA9bJ8MspIkSZLUJO0dnUtCbFtAj7sSD4pTiyVJkiSpCWbeuJCDq0Lsvu94k6Owg+SIrCRJkiStYGf88W9866Jbl3zdkzBjTid3HrdrE3vVOgyykiRJkrQCVDZ0mvzG13HDfU8tVVeZTqzBcWqxJEmSJA2z9o5ODj1vPl3d2SvEgsfrDJUjspIkSZI0TJYcq9Od9D4d1o2dlpUjspIkSZI0DGZ1LOSQGfPoKkNseTQsEye08alt1nVjp+XgiKwkSZIkNdjZf7mPI2be3Ku8Orx+Z88tmtCz0aEhQTYiVsrMRY14LEmSJElqZd+/7Db+95q7lypzCnFjDXpqcUTsGhHH1JT9Z0Q8AzwXEWdHxIRGd1CSJEmSWsH5cx5gg8Mv7hViwc2cGm0oa2QPBTatfBERbwVOBR4ErgD2Bb7Y0N5JkiRJUgv45R//xsEz5tOTEMCEccWC2IkT2jh138mG2AYbytTitwKXVH29L/AC8M7MfCYizgY+Dfygcd2TJEmSpJGrvaOTg6bPo7vn5T2JE+juSTdzGkZDCbKTgMervn4/cHVmPlN+fS3wwQb1S5IkSZJGrPaOTg6cNpdMlhyrM74tWNyTroddAYYytfhx4M0AEfEa4B3A/1XVTwDGNa5rkiRJkjTynD/nAQ6ePo+eqhAL0JOOwq4oQxmRvQ74fEQsAHYtr720qn5D4KEG9k2SJEmSRoz2js4l58LWchR2xRpKkD0auAaYVn7968y8BSAiAvhIWS9JkiRJo0IRXuez19ZrM312J4vLtbDj2oLunmR8GyRhiF3BBh1kM/OWcqfi9wBPZ+YfqqpXAU6hWCcrSZIkSS2vvaOTr503n67uHs7568Kl6rKcRnzSXgbYZhjKiCyZ+QRwYZ3yJymO4pEkSZKkljfzxoUcOG1e3TqnETffkIIsQES8F9gJWBP4fmbeFhGvBv4JmJ+ZTzW2i5IkSZI0/CrTiHfc5PVcfsujS9VNnNDG3lu/kXNvWGiIHQEGHWQjYhxwNrAXxRm/CZwD3AYsBmYBJwHHN7yXkiRJkjSM2js6OaycRnxZTYgFloTX7+y5RRN6p1pDOX7na8DHgIOAt1KEWQAy80VgJp4jK0mSJKnFzJj9AF+ZOpdFi3t61U2c0Map+052BHaEGcrU4v2AMzPz1IhYrU79rRhkJUmSJLWAylE6795gNf5w5+NL1TmNeOQbSpBdD/h+P/VPAZOWpzOSJEmSNNxenkac/L4mxILTiFvBUILsP4BV+6nfEHhs+bojSZIkScOjMgq7uDvJOvXuRtw6hrJG9o/AJyMiaisiYhLwWeCaRnVMkiRJkhqhvaOTDQ6/mIOmzaWrDLFtZaqZOKGNT22zLhPGGWJbyVBGZI+jCLNXA78qy7aKiI2ArwOvAv67ob2TJEmSpOVw/pwH+Nr5N9FTZwi2Orw6jbi1DDrIZubsiPgY8HPgjLL4JIrdix8FPpKZtzS+i5IkSZI0NFNvuJ8jZt5Md50E6xTi1jeUEVky8+KIWA/4AC8fwXMncFlmPt/47kmSJEnS4FTWwG605qu55cF/LCkf1xZ09yTj2yAJQ+woMKQgC5CZi4CLyj+SJEmS1FTtHZ0cOG0uAD3JUiEWIDOZMK6Nk/YywI4Wgw6yETEOWKl65DUiVgH+jWI343Mz86aG91CSJEmS+nDOX+7jqPYFddfAgtOIR6uhjMieDmwDvA0gIiYAf6KYYgxwUES8KzPnNrSHkiRJklSjvaOTg6fPY3Efa2D33vqNnHvDQkPsKDWUILstcH7V13tRhNgvAh3AuRS7F3+8Yb2TJEmSpBpnX38fR7XfvGQUdnxbsLjOGlh3Ih69hhJk1wLuqfr6Q8CCzPwxQET8FPiPBvZNkiRJkpboaxS2xzWwY85QgmwA46q+3p6lR2gfAtZoQJ8kSZIkaYn2jk6+OnUuAJUIWxmFdQ3s2DSUIHsPsDPwk4h4D8UI7TVV9WsDTzewb5IkSZLGqOIonfm8b5PVufzWR6hdCVsZhTXEjk1DCbJnACdHxM3AOsCjwGVV9f8M3NbAvkmSJEkag2Z1LOTQGfPp6k5+d8sjveodhdVQguypwGuAPSk2dzqichRPRKxGsaPxSY3uoCRJkqTRrTL6uvfW6zB19kK6+zhLp3YzJ41dkdnHgUtqqilTpuTs2bOb3Q1JkiRpWM3qWMhhM27ipe6epcrHRdCdudRROm7mNLZExJzMnFKvbigjspIkSZLUELM6FnLI9Pl1z4EFSJZeA+tROqo25CAbEVMo1sNOAtpqqjMzv9OIjkmSJEkaXYopxPPYdsPVuPaOx6lMDh0X0F2VZ10Dq4EMOshGxCspjtvZieIoniw/UvV5AgZZSZIkSUu0d3Ry4LS5RATdPck1tz++VH0CE8a18fF3FFOIDbEayFBGZL9JEWKPA66iOHrn0xS7Fx8OvBLYr9EdlCRJktS6Zt64kMPOm09PAnX256kdfXUKsQajdmpwf/YCpmfmN4Gby7LOzLwMeD/wCmD/xnZPkiRJUiuaeeNC3nLEJRw4bR5d3UsH2IkT2vjUNut6DqyW2VBGZN8EnFx+3l1+fAVAZi6OiHOAL1CMzkqSJEkaYyprYDdZ89Xc/OA/lpSPayumFNcen+Poq5bVUILsP6ra/wPoAdauqn8aeEOD+iVJkiSpRZx1/b18Y9YCoFjvWh1iATKLHYg9PkeNMpSpxXcDGwNkZjewgGK6MRERwEeBB5anMxHxu4jIiDi2pnxSRPw8Ih6PiOci4sqI6PX2TURMjIgTI+KhiHghIq6LiPcO4fk/FxG3RcSiiLg9Ij7fR7s9I6IjIl6MiPsi4qiIGFen3bYR8eeyLw9HxMnlplmSJElSS5sx+wHecsQlvPuEKzlq1gKSIsTWmjihjVP2mcydx+1qiFXDDCXIXgl8rCqwnQ7sEhF3A3dSrJP9xbJ2JCL+BdiqTnkAFwK7AF8CPgZMAK6JiDfWNP8F8DmKjal2Ax4CLouIyYN4/s9RfE/nlc81HTgtIr5Q027nss0NwK7AqcBRwPE17bYErqDYDGu3ss1ngF8N1BdJkiRpJJp540I2POIS3nfSNRwyYz7dPcmDTy/q1c41sBpukXV2DqvbMOLVwDrA3Zm5uCw7CPgkxZrZGcD3crAPuPRjTwJuBQ4EzgaOy8yjyro9gFnAjpl5TVn2OuAe4KzM/HJZthUwF/hsZp5Rlo2nGDm+PTN37+f5xwMPApdm5qeryn8J7A6slZldZVkH8ExmblfV7psUQXXdzHy4LJsJvA3YrOra/YBfA1tn5o393ZMpU6bk7NmzB7hzkiRJ0vAo1rvO56S9tuThZ17ghEtvH/CayhrYk/feyvCq5RYRczJzSr26QY/IZuazmXl7JcSWZSdn5j9l5jsy87vLEmJL3wVuzsxz6tTtDjxYCbHl8z5NMUq7R027LmBqVbvFwLnAzhGxUj/P/y5gdeCsmvLfAKsB2wJExJuAyX20m0AxQktETKAY1Z1WCbGlacBLNf2WJEmSRpT2jk4OO28+Xd09fGXq3H5DbPXo6/f3nszdx3/QEKthN5SpxcMiIralOH/2i3002ZyXj/uptgBYtxwprrS7JzOfr9PuFcCG/XRj8/Jj7fMsKD9u1l+7zLwHeL6q3VuAiXXavUix1ngzJEmSpBHo9N/fxVemzmXR4p4+29ROHf7Onlu4BlYr1KB3LY6IbwEfy8y39VF/EzA1M4+tV9/HNa+gWJd6Umb29TbPqsC9dcqfKD9OAp4t2z3ZT7tV++lKpa72+tpr+2pXKRtMuycG6IskSZK0QrV3dHLw9Hms9dqVeOCpF5eqG98GEUFXt8fnaOQYyvE7H6HYvKgvl1PsYjzoIAscBrwSOG4I14xaEXEAcADAuuuu2+TeSJIkaTSrnPn63o1ezzW3P0ZP0ivEAnx/78kAS9bLOuqqkWAoQXZ94LZ+6m8H/n2wDxYR6wJHltesVLOGdaWIWIXivNonKUZda9WOej4JvLmfdk/UqauoPMYkip2O+7q2ul2tSYNstyovT1leSmb+FPgpFJs99dNfSZIkaZm0d3Ry4LS5APQkXHXbY3XbTZyw9I7DBliNJENdI7tKP3WTgF5nqfZjA4p1pGdRBL/KH4BDys+3oAh9m9e5fjPg/sx8tvx6AbB+RKxcp91LwF399KUSLGufp7KW9Zb+2kXEesDKVe3uBhbVaTeR4vu+BUmSJGkFae/oZKMjL+XLZ8/hoGnz6MkixNby2By1iqEE2QX0sdtuedbr7vQ/YltrLrBDnT9QhNsdKMLnBcA6EVF93M1rgQ+XdRUXUuwcvHdVu/HAvsDlmdn7gKuXXQc8DnyipvyTFKOsfwLIzPuBeX206wIuLdu9BPwO2KfsQ8VewEo1/ZYkSZKGTXtHJ4fOKHYgvmD+w3TXHDTixk1qRUOZWvwL4PSI+BVwaGY+BhARqwPfA7YB/muwD5aZTwHX1pYXmZj7MvPa8usLKILmWRFxKMVI7eFAlM9bebyOiJgK/KA8/uYe4AsUU6I/UfMc1wLrZeZ65bVdEfEN4LSI6ASuBHYEPgt8qQymFUcAF0XE6cA5wNspzpA9tXKGbOkY4HpgWkT8CFgPOBGYkZlzBnufJEmSpGVR2cCpuyept2bNjZvUygYdZDPzZ+Wo6H7ApyKispZ0LYpQOTUzf9zoDmZmT0TsBpwEnEYxHfk6YIfMfKCm+WcoNo46lmIa9Dxgl8y8sabdq4Dq0Elm/iQiEjgYOBS4H/ivzDytpt0lEbEXcDSwP/AIcDw1G1Zl5tyI2InijNyLgaeBMymCsCRJkjQsKmtgE6gMvrZFMZV44oQ29t76jZx7w0I3blJLi8yh7SkUEftQjHBWzmW9A/htZs5ocN+GRUS8CngK+ERmTmtyd/o0ZcqUnD17drO7IUmSpBZy5p/v4VsX3Up3zQLYtoBxbW2GV7WUiJiTmVPq1Q1lajEAZfgbsQFwEN5Nsfa2JYK3JEmSNJBz/nIfR866uc8NnNy4SaPNkINsq8vMK4C3NrsfkiRJ0vKonAO7+VqvYe7CZ5aUj28LFvdkrzWw0mgy5oKsJEmS1Mpqz4GtDrFFWTJhnNOINboZZCVJkqQRrhh9nc/Om63BpTc/UncKMTiNWGPHUM6RlSRJkrSCzepYyCEz5tHV3cNFNw18DqwhVmOBI7KSJEnSCDSrYyGHTJ/P4j6GXz0HVmOZQVaSJEkaQdo7Ovnq1LkAVCLsuAi6Mz0HVioZZCVJkqQmW7IGdvM1uOSmh6kdg01yqanDjr5qrOszyEbEL5fh8TIz/205+iNJkiSNKe0dnRx23vxiDez8h3vVu4GT1Ft/I7L7L8PjJWCQlSRJkgZQOQd2cXf2GoGF3mtgJb2szyCbme5oLEmSJDVY7TmwAG1RfO4aWGlwXCMrSZIkDbPKGtiPTF6b8zo6654D6xpYafAMspIkSdIwql4DO23Owl71roGVhm5IQTYixgN7Av8MTAJqpx+72ZMkSZLEy+fAdve4BlZqtEEH2YhYFbgGeBsQFBs7RVmdVWUGWUmSJI1Z9c6BdQ2s1FhDGZE9FtgU+HfgWuBuYGfgfuAbwEbl15IkSdKYUlkDu9sWb6B93oN1R2BdAys1zlCC7IeAMzPzjIhYrSzrzszbgU9GxLXACcAXGtxHSZIkacSqXgM7c+6DvepdAys13lCO2HkDcEP5+eLy48Sq+lnA7g3okyRJktQSZsx+gK9MncuixT296sa3wbg218BKw2EoI7JPAK8qP/8H0AW8qaq+i2IDKEmSJGnUKqYRz+Od603iT3c/sVSda2ClFWMoQfYOYDOAzOyJiA5g/4j4FTAO2A/4W8N7KEmSJI0Q7R2dHDpjPl3d2SvEAq6BlVaQoQTZy4FDIuK/MnMRcDJwLsVIbQKvBA5ofBclSZKk5mrv6OTg6fP6PErHdbDSijWUIHs8cFIZYsnMaRGxGPgk0A3MyMypw9BHSZIkqSnaOzo5cNpcEsgywdY7SscQK61YkVnvPSU125QpU3L27NnN7oYkSdKYUzlKZ+fN1+DSmx6mu+a/y20B49raXAMrDbOImJOZU+rVDXrX4oi4OiLe10/9DhFx9bJ0UJIkSRoJZnUsLNfA9nDR/N4hduKENk7ZZzJ3HrerIVZqoqFMLd4e+Hk/9WsA2y1XbyRJkqQmqKyBXdxTf7bi+DZIPEpHGimGEmQHsgqwqIGPJ0mSJA2r9o5Ovjp1LsCSTZzGBXSnR+lII1m/QTYitgQmVxX9v4iod82qwH8CtzSua5IkSVLjVdbAvm+T1bn81kd67UKcwIRxbR6lI41gA43IfgQ4uvw8gf8o/9TzD+DLDeqXJEmS1HAvnwPbw+9ueaRXvcfoSK1hoCD7K+BaIICrKY7guaKmTQLPArdk5osN7p8kSZK03AY6B9Y1sFJr6TfIZuZ9wH0AEfEZ4PeZee8K6JckSZK03Oqtga13DqxrYKXWMujNnjLz19VfR8Try/LHG90pSZIkaVlV1sDusPHrufK2R+uOwLoGVmptQ9q1OCLWBk4A9gBeU5Y9A7QDR2ZmZ8N7KEmSJA3SrI6FHDZjPl3dyeW3Ptqr3jWw0ugw6CAbEesC1wNvAOYCC8qqzYD9gA9ExDaZ+UCjOylJkiT1Z+aNCzl0xnzPgZXGiKGMyH4HmATslpmXVFdExK7A+WWb/RvWO0mSJKkfM29cyEHT5i01fdhzYKXRbyhBdifgtNoQC5CZl0bEj4F/bVjPJEmSpDqKNbDz2HbD1bj29sc9B1Yag4YSZCcBd/ZTfyewynL1RpIkSepHe0cnh55XrIG95vbee466BlYaG4YSZBcC2wM/6aP+vWUbSZIkqaEqo7CLuz0HVtIAQbbc4OmxzHwBmA4cFhH3AP+dmU+XbV4LfB3YB/jvYe6vJEmSxpD2jk4OnDaXoFj3Cp4DKwkis/7ObgAR0Q18KjPPjoiVgcuBdwPdwINls7WBccCfgJ3K0KvlNGXKlJw9e3azuyFJktQ0szqKnYi7upf+/2pbwLi2NsOrNMpFxJzMnFKvbqCpxVH5JDOfj4jtgc8AewLrl1WXAbOAX2Xm4uXsqyRJksa49o5ODp4+r+5ROq6BlQRDWyNLGVR/Vv6RJEmSGqJYAzufD7x1DX634GEqGbZylI5rYCVVG1KQlSRJkhqtvaOTw86bT1d3D5fc/PBSdZWjdJxGLKnaYILs/4uIQQfezDxzOfojSZKkMeSMP/6Nb110a906pxFL6stgAuoB5Z+BBMWbZgZZSZIk9alylM6bV12Zux57bqm66p2IDbGS+jKYIPtT4Prh7ogkSZJGr8oa2A9t8QYunPcQ3Zm9QiywJLx+Z88tmtBLSa1iMEH2/zLz7GHviSRJkkal6jWws+Y+WLeN04glDUVbszsgSZKk0etnf/gbX5k6l0WLe3rVTZzQxqe2WZcJ4wyxkobGXYslSZLUUJVzYNd+3UTuf/KFperqrYF1GrGkoTLISpIkqSFmdSzkwKnzgGIH0NoQC66BldQY/QbZzHTqsSRJkvpU2YH4netN4s93P0H20c41sJIayRFZSZIkDUllB+IPb/kGLpj3EIt7kj/d/USvdh6lI2m4GGQlSZI0KO0dnRw4bS4RQXdPcn5H/R2Ix7dBEk4jljRsmjZ1OCL2iojzIuK+iHghIm6PiBMi4jU17SZFxM8j4vGIeC4iroyIXq+GETExIk6MiIfKx7suIt47hP58LiJui4hFZV8+30e7PSOiIyJeLPt+VESMq9Nu24j4c9mXhyPi5Ih45WD7I0mSNJLMmP0AB8+YR09Cd0/vCcTVOxB/f+/J3H38Bx2BlTRsmjkiewhwP3AEsBB4O3AMsENEvDszeyIigAuB9YAvAU8ChwPXRMTkzFxY9Xi/AD4EHAr8DfgicFlEvCsz5/bXkYj4HHA6cAJwJfA+4LSIiMz8cVW7nYHzyuc6qOzz8cBrgK9VtdsSuAK4DNgNWB84EVgH2HcoN0mSJKmZzv3rfRw5cwHdWT+8ugOxpGaIrPOitEKeOGL1zHyspmw/4NfA+zLz6ojYA5gF7JiZ15RtXgfcA5yVmV8uy7YC5gKfzcwzyrLxwALg9szcvZ9+jAceBC7NzE9Xlf8S2B1YKzO7yrIO4JnM3K6q3TeBo4B1M/Phsmwm8DZgs6prK9/b1pl540D3Z8qUKTl79uyBmkmSJDVcZQOnjdZ8Nbc8+I8l5ePaiinFlanDJ++9laOukoZNRMzJzCn16po2tbg2xJZuKD9WXhF3Bx6shNjyuqcpRmn3qLpud6ALmFrVbjFwLrBzRKzUT1feBawOnFVT/htgNWBbgIh4EzC5j3YTgF3LdhOAXYBplRBbmga8VNNvSZKkEaO9o5MNDr+YA6fNpas7lwqxAJnp1GFJI8JI2+ypMtJ5a/lxc+DmOu0WAPtFxKsz89my3T2Z+Xyddq8ANiw/r2fz8mPt81TabwZc01e7zLwnIp4v2wG8BZhYp92LEXF3VTtJkqSmq4y+br/x6lx126PUWf4KeHyOpJFlxATZiFgH+DZwZWZW5tSuCtxbp3llf/dJwLNluyf7abdqP09dqau9vvbavtpVygbT7okB+iJJkjTsKsfn7LHVG5g1tzg+54pbH+3VzuNzJI1UIyLIRsSrgXZgMfCZJnenaSLiAOAAgHXXXbfJvZEkSaNN7fE5M270+BxJranpQbY8kuZCYANgu5qdiJ+kGHWtVTvq+STw5n7a9T6he+nnoHyeh/q5trpdrUmDbLcqfU9xJjN/CvwUis2e+umzJEnSoFRGXz/0tjdw4U0PFVOHB9iB+KS9HH2VNLI1NciWGyPNAKYAH8jMm2qaLAB2qnPpZsD95frYSruPRMTKNetkN6PYYOmufrpRCZabs3SQraxlvaVOu+uqvof1gJWr2t0NLOLlNbWVdhMpwvr0fvoiSZK03Crhde+t12H6nIV0dSez5vUeffX4HEmtqmm7FkdEG/BbYEdgz8y8vk6zC4B1IqL6uJvXAh8u6youpNg5eO+qduMpzmy9PDMX9dOV64DHgU/UlH+SYpT1TwCZeT8wr492XcClZbuXgN8B+5R9qNgLWKmm35IkSQ1T2XX44Onz6Oru4ey/PkBXd+/R1/FtxVE63/3olnxnzy2487hdHYGV1FKaOSL7I4rgeRzwXERsU1W3sJxifAFF0DwrIg6lmLZ7OBDA9yqNM7MjIqYCPyhHee8BvgCsT03wjIhrgfUyc73y2q6I+AZwWkR0AldShOvPAl8qg2nFEcBFEXE6cA7wdoozZE+tnCFbOga4HpgWET8C1gNOBGZk5pyh3ypJkqT+zbxxIYedN5+ehB6nDksa5SLrvNCtkCeOuJf661oBvpWZx5TtVgVOAvakONbmOuCgzJxX83ivpAjF/wqsQjF6+rXMvLam3Q1Ad2ZuU1P+H8DBZZ/uB07JzNPq9PujwNHApsAjwM+B4zKzu6bde4HvUoTdpymC7xF1jgiqa8qUKTl79uyBG0qSpDHtrOvv5ej2W+g2vEoaZSJiTmZOqVvXrCDbDBHxKuAp4BOZOa3J3emXQVaSJNWqrH3d65/WZtqcTtZ89St48JmXV1CNayt2I67sOnzy3lsZXiW1rP6CbNN3LV7B3k2x8dOMZndEkiRpMCrhdZ+t12FauXHTOTcUhzxUh1iAzGTCuDZHXyWNemMqyGbmFcBbm90PSZKk/lTC675T1mHa7E66unv47V8f6PeaiRPaluw8LEmj3ZgKspIkSSNZe0cnB06bS1sEi3uSs/4ycHitPT5HksYCg6wkSVIT1Z75Ophdhz/+Ds9+lTS2janNnlqJmz1JkjS6VUZfI4oNmupx12FJY5mbPUmSJI0AxejrPLbfeHWuvv0xehKoM6hQ2XXYEVdJqs8gK0mSNAwqU4Y//o51OOevC5n8xtdx4wNP0ZNwxa2P9mrv6KskDZ5Ti0copxZLktR6KuF1ty3ewEU3PURX98D/z/LMV0mqz6nFkiRJDfbyiOsbOfeGB9hm/VX5891P0J3JzLkP9nuto6+StHwckR2hHJGVJGnkqd5heMacTl7q7hn0tYZXSRoaR2QlSZKGqHbEdcdNVueq2x5jcU9y9l8Hf76rR+VIUuM5IjtCOSIrSdKKV9lVeLct1hr0GtcKR1wlqbEckZUkSapRO+K69bqr8Nd7n6QnGdIaV0dcJWnFc0R2hHJEVpKkxquE14++fW3O7+h0xFWSRjBHZCVJ0phTO+L6vk3X4MpbH2VxTzJ19sJ+r3XEVZJGNkdkRyhHZCVJGrpKeP3YP63N+Tc+6K7CktTCHJGVJEmjzssjrutw7g0LecebJ/GXe5+kuyc59wZHXCVpNHNEdoRyRFaSpN4quwrvtNmaXLbgERb3uMZVkkYrR2QlSVLLqV3j+p63rMb/3fl3ujO5+KaH+73WEVdJGt0ckR2hHJGVJI1FlfC65+S1mTXXXYUlaSxzRFaSJI04ldD6vY9twWPPLuKES24jAnoSps9xjaskqW+OyI5QjshKkkaTSmjdd8o6TJ29kHeuN4nr7yk2ZhosR1wlaWzpb0TWIDtCGWQlSa2oElhP2mtLAA6ZMY/tNlqda+94bJk3ZqqMuBpeJWlsMci2IIOsJKmVtHd0cuC0ubRFsLgnCWCw/8MY3wYRQVd3Mr4NkuDkvbcytErSGOcaWUmS1BDVI65JcuiM+bx7g9X4491/pyehp3yDfKAQWztNGFjyuAZYSdJAHJEdoRyRlSQ1W21oPWjaPCJiUOtaxwdEWzHK6jRhSdKycGpxCzLISpKaoRJe99p6bc6b8yAvdfcM6frqqcHgKKskadk5tViSJPVSCa0n7rUFTz73Et++6NYlx9+c89f+j7+pXtfa327CBlhJ0nBwRHaEckRWktRIldBaTO19gPdu9Hp+f8fjg9pJuK/NmMARV0nS8HFqcQsyyEqSlkW942/e/9Y1uOKWR5f5+Bs3Y5IkNYNBtgUZZCVJA6kNrbXH38DgjsDx+BtJ0kjkGllJklpcf6H1q1PnLgmsHn8jSRoLHJEdoRyRlaSxa+n1rAv5yNvXZlbH0HYQ7mszJo+/kSS1CqcWtyCDrCSNfvXWs+6+1VpcMO8huroH//vZzZgkSaORQbYFGWQlafRq7+hs+HpWMLRKkkYX18hKktQE9UZc37fpGlx566P0ZOPXsxpgJUljhSOyI5QjspLUWqpDa5IcNG0eEUH3YM5pDYg217NKklTNqcUtyCArSSPX0psxPcD7Nl2Dq257dEjrWgGnBkuS1A+DbAsyyEpS89WOsh46Yz7v3mA1/nT331k8iJHWir52EDa0SpLUN4NsCzLIStLw672GdT7f/ejbePL5Lo69+FYiYAh5FXAzJkmSGsUg24IMspLUWNWhtau7h8POm79kDetQdg2uZ7CbMUmSpMEzyLYgg6wkDU29HYJ32mxNLlvwCFus81rmL3yG7mX8ndfX1GA3Y5IkafgYZFuQQVaSllZvGvC3dt+Mx59dxClX3LlM04AraqcDOzVYkqTmM8i2IIOspLGmXlA9ca8teOaFLo6+4BbaIpaMqAbLPg14MEG1+nNDqyRJzWGQbUEGWUmjTb2getJeW9KTycHT5zVsvWp1UK1wDaskSa3HINuCDLKSWk1fQbWrp4fDZtRsrBSwrL9+hjIN2DWskiS1LoNsCzLIShpp+gqqSXLQtHm0RbC4EUE1INoGv161+nPDqiRJo4dBtgUZZCWtKJWAWj16CS+vUX2hq5sjZ9681Ijqcm2sZFCVJEmDYJBtQQZZScuiv1BaGT09dMZ8dttiLS6c/xDbbfx6/nDn40utJ4Xl20xpXECbQVWSJC0ng2wLMshKY9NAQbTyeVH/AN/40Ft57qVuvn/5HbznLavx57/9vaGhtB6DqiRJWhEMsi3IICuNTn0H1XnstsVaXHzTw7zU3bOk/fJO410WQz1Ttfpzg6okSWoUg2wLMshKI9NgR0z32Xodps1ZyGE7b8oLXYv5n6vuYpsNVuX6vz3B4hWYSvsKpRXVx9IM9D0ZVCVJ0opkkG1BBlmpcfrabbfyeb0AV5m6e/xHtuC5RYs59uJb2WGT1bn2jseWCoLLe+bpQAYKotVlQwmlHksjSZJGOoNsk0TEm4BTgA9Q/H/3SuCrmXn/QNcaZDWWLEvQ7Ct0LlrczbcuvIWDP7AxL3X3cMoVd9LWVu62G8U/xJ5szpTdehoRRKvrDaWSJGm0MMg2QUSsDMwDFgFHUQzYHAusDGyZmc/1d71BViNNf1NqBxs0T/joFnQt7uGbFyzg0J034aXFPXz/8juWBM22Mmh29xM0G71x0fJq9IipQVSSJKlgkG2CiPgKcDKwSWbeVZatD9wJHJaZJ/d3vUFWQzW03W77qp/HR9++Dud3dPL1XTZl0eIeTr7iDrbfeHV+f2fvKbWtEDSr9bXbbsVwTd2trjeoSpIkDY5Btgki4ipgYma+p6b89wCZuV1/1xtkG6/e9NXlC33LMzo5lPp5fPejW9CTcPjMm9hjq7Von/cQB39gY7q6ezj1qrvqngVaHTSjLBjp/9zHRREaF/ck4wOire9QOVDoHMpuu0P5ezSISpIkrRgG2SaIiIeB9sz8j5ry04C9M3P1/q4fiUH27Ovv4+gLF3DYzpsA8L3LbueQnYrPT7r8dnbdfE0uvfkRDtlpYxI46fI7OHinjQH4/uV3sMvma/K7BY9w4Ac2BpJTrriTnTZbk8tveYSvvn8jtt9kDTIhSX5/+6OcetVdfGCzNbjilkf58vs2JBP+9+q7+K8dN4SEH15zF+/fdHWuvO0xvrjDWwD40TV385/bF5+fdu3d7LjJ6lx9+2Nsv8nq/OGOx3ipu5y+GsVU1orqsurprRW1obB2JHIwo5MjeaRyWTQ7aA6l3gAqSZLUegyyTRARLwEnZ+bXa8qPBb6emeP7u36kBdn2jk4Onj5vhR4bouUzlGm0yzul1qApSZKkRjPINsGyBNmIOAA4AGDdddfd+r777lshfR2MjY68lK7unmF9jvFtwY8/uTVfOGvOsAbm6umr9cr6ql8SCgcYiaxXNtz1jVi7OVC9QVOSJEkrkkG2CSLiEWDWaJla3N7RydfOn8+LXT0NDWAVEye08d2PFmGp+rmW5TH7evxK0Gu9NbIGTUmSJI09BtkmiIirgVdk5rY15ddS3PeW2+ypMWd99h36qoNYY3bg7fvxJUmSJI1sBtkmiIivAicBG2fm38qy9SiO3/l6Zn6/v+tHYpCVJEmSpBWlvyDbtqI7M4b8DLgXaI+IPSJid6AdeAA4vZkdkyRJkqRWZpAdJpn5HLAjcAfwG+C3wD3Ajpn5bDP7JkmSJEmtrN8jYLR8MvN+4GPN7ockSZIkjSaOyEqSJEmSWopBVpIkSZLUUgyykiRJkqSW4vE7I1REPAbc1+x+VHk98HizOzEKeB+XnfeucbyXy8571xjex8bwPi4f719jeB+Xj/evf2/OzNXrVRhkNSgRMbuvM5w0eN7HZee9axzv5bLz3jWG97ExvI/Lx/vXGN7H5eP9W3ZOLZYkSZIktRSDrCRJkiSppRhkNVg/bXYHRgnv47Lz3jWO93LZee8aw/vYGN7H5eP9awzv4/Lx/i0j18hKkiRJklqKI7KSJEmSpJZikB1jImL/iMjyz8Z16rerqn9/M/rYiiLiZ+U9O6XZfRnJ/PkbHhFxTHnPxje7L61sWe9jRPwqIu4dpm61DF8Hl09E7BkRf4iIRyPihYi4LyJmRcQuze5bq4mInSLi0oj4e0S8GBF3RMR3I2LSEB9ncvm6sOpw9XUkqfod/VTtvYqI8WXdMU3q3ohX83+cjIjnIuLeiJgZEftERDS7j6ONQXbs+gfwqTrlny7rNEgR8Upgn/LLfzVMDIo/f9Io4uvg8omILwMzgTuBfwM+BBxbVu/YrH61oog4ArgMeBH4d2Bn4CfA/sANEfGmITzcZOBoYEwE2SqvA77W7E60sL2BdwEfBL4BLALOAa4oXyvVIAbZset84JPV7w6V/7j2As5r1JNExEqNeqwRbE/gtcAlwBpAw949H8X3b4X8/ElaYfZkmF4Hx4hDgFmZ+W+ZeWFmXp2ZP8vMPYGvN7lvLSMidqB4A+AHmfmRzJyZmb/PzJOBbSgC6ZlN7WRruBz4UkSs2eyOtKi5mXl9+bP3m8z8OMUbfTsC32ty30YVg+zY9RvgzcC2VWUfofiZWCpIRMQ7ImJGRCwspzvdHhHH176rFBHXRsQfI+LDEdEREYuA/xzub2QE+DTwJMW7vS+UXy9RNV1xi4i4JiKej4iHIuLbEdFW1W77st1Hyyl6jwGPrMhvZAVq6M9fRPxvRDwSERNqrn1NRPwjIv57GL+XEafe9K+IWK8s37+q7FflfX17RPxf+bN5Z0R8fkX3eSQa7H0UMPDrYN3p1+XvjWtryv6p/Hl8ISIeiIgjIuJbETGad6dcFXi4XkVm9lR/HRHrR8RvI+KxiFgUEXMj4iM1bQb1e2cUOgx4Aji8tiIz7wH+G9g+Iv4ZlkyX/VpE3BLFFOTHIuJ3EbFp+W/8jPLyO6umi663Yr6VpqrMBjiqv0YR8c6IuDIini2n0V4VEe+sqj80Il6KiNXqXHtLRLQ3uN8jVmaeB7QDn4uIlQEiYuUoprzfU96neyLiyNp/oxGxekScVr4eLio//mYUD3YM2mh+MVP/7gP+wNLTO/ejmNr0bE3bdYG5wOcp3mU/FfgsL7/AV9sY+B/gfymm81zVyE6PNBGxNvB+YGpmPgbMAj4c9dfhzAKupBi5OJtiusk367T7XyAo/m72b3SfR4hG//z9mGIU6CM11/4r8Crg9Ab1ezR6LcXP41nAHsANwI/LkQ1pQEN8HRzosV5P8XtjVYow/CWK3yX7N6q/I9RfgU+X//HvtX9ARRTTYv8CbAUcCOwO3AicFxG717lkFoP7vdPyopjOvh1wRWa+2EezC8qPlena5wLHUcwk2BP4HHALsBZwMS8HuspU0XcBDzW67yPQQ8APgQMi4s31GkTElsDvgUkU/z73o/h98vuI2KpsdjYwDti35tqtgbcy9kbHLwFWAqaUP6+XUUx/PxXYFfg5xb/REysXlK+jf6a4hydTTFc+DJgAvGJFdn5Eykz/jKE/FC82CWxIEQaeBCZSvGgvBj4AbF+2eX+d6wMYD3wS6AFWq6q7tiyb3OzvcwXez8PKe/Wu8uudy68/X9XmmLLs6zXX/oxiPegq5deV+z6z2d9XC//8XVXT/kbgd83+vlfAfa38jI0vv07gmJo265Xl+1eV/aos26GqbCXg78BPm/19tdh9vLfZ/W/ifRvM62Dde1T+u7226uvjKdaTvbGq7JUUs1Oy2d/rMN7DjYH55X1L4HGKNXU71bT7BfBY9WtfWX4FxXTGyteD+r0zmv4Aa5bf8wn9tJlYtjmNIswm8OV+2i/5ndXs728F3cMl3y/Fm0lPAb8s68ZXvyYCM8r6Vaqufy3FiPj5VWVXANfVPM8PKH7/r9Ts73m47l8f9ZXXxn0p3shP4L01bY4EXgLWKL/+NtANvL3Z399I/OOI7Ng2neI/rR8GPkExranXCGpEvLac+nA3xX8wuiimhgawUU3zezNz7nB2eoT5NHBnZl5Xfn0l8CA10+pK02q+Phd4NfC2mvKZDe3hyNXon7/TgB0iYqPyuncAb8fR2IE8n5nXVL7IzEXAHRQj4dJgDOV1cCDbANdn5sJKQWa+QDE6Nmpl5h0Ur1fbUYwQzqWYYXJZRFRP79yFYlTn6XJa7PiqkZ2tIuK1NQ892N87Y9FOFEHiZ83uyEiUmU8A3wf2i4hN6jR5L3BRZj5Vdc0zFKPe21W1OxPYJiI2hCUj5/8CTCt/34wllX1BkuLf8n3An2v+LV9OMdq6Tdl2J+CGzOxY4b1tAQbZMSwz/0Ex7ehTFFNCfps1a3FKZ1BM6/wfihGzdwBfLOsm1rQdC1NuAIiIKcBmwPkRsUpErAK8hmIjo23qTA+rXe9a+XqdmvIxcQ+H4edvJkUY/o/y689T/Gf6wkb3fZR5sk7ZInr/25Z6WYbXwYGsBTxap3y07hewRGZ2Z+YfMvOozHw/sAFwE3B01TTtNSheL7tq/lSmItauRRzs753R4O8UOxWv10+bSt0DFPfqifKNEtV3CsUI67fr1K1K/f+vPEwx3bjifOA5Xl5KtBPFz/FYm1YMUNkx+yGKe/Bmev9b/mvZZrWqjwtRXQZZnUmxzf8W1HlRiYiJFOvmTszMU7PYgW02xWYe9YzmzThqVUYbvkYRBip//qss36+mfe3uf5WvO2vKx9I9bNjPX2Z2Uawv2T8i1gA+DvwiMxcP5zcwQi2i99qZXpttaEDex4EN9nXwReqv56q9n5X/4NUac7unZuaDFK9p43l59snfKaZ0vqOPPw/WPMxgf++0vPK1/vfAB8rfHfVU1hFfTTF9e9XwOJQ+ZeazwAkUa4Qn11Q/AbyhzmVvoOoN0sx8juKN5k+URZ8E/paZf2p0f1vAhyheC+dQ/Fu+h77/LVfehH+c0fnGU0MYZHUFxdSjn2Tmgjr1K1Es1O+qKd9/mPs1okXEKyimxvwF2KHOn7nApyKWOvx6n5qH+TjFxkY3DXd/R7BG//ydDqzCy9OWx+qUsfvoPXXwQ83oSIvzPvZjiK+D9wFrRsTqVde/Baidsng98K6IeGNVu1cyyu97RKzVR9Wm5cfKjsa/A7YEFmTm7Dp/aqdqjrXfOydRvDlyfG1FRKxP8YbLHzLzLxRTOINis52+VO7nWA67p1G88XFsTfnvgQ9GxGsqBeXnH6ZY+17tTOAtEbEzxaZaZw1XZ0eqiPgYxRspP8nM5yn+Lb8JeLaPf8uPl5deDryzagMtVfHA8jEuM7sp/iPSV/3TEXE9cHBEPETxztBn8d2hD1H8sjw4M6+trYyI0yl20t2+qvhz5ZbqN1As+P93ik0Tnh723o5Qjf75y8zOiLiAYm3ZhZn5wDB0eySrjOafCxwVEUdSBIP/Rz/3Wb14HwdnKK+D04HvAGdFxMnA6ymOSHm85rKTgS9QrA39FkWQOKj8OJpnq9wcEVdSrH+9h2LTnA9SLJGYlpn3l+2+STH18A8R8UPgXoppnG8DNsjMz9Y87pj6vZOZV0bE0cC3ymNyzqQYHfwnivN4n6ac4pqZ10TEecDJ5W7QV1OsTXwvcHH5M31L+dBfjIhfU7ypOj8zX1px31VzZeaiiPg28NOaqu8AuwFXRcR3Kf59fg1Ymd5Tka+imC3wC4o3BX4zrJ1uvsnlDuyvoNhvYjeKUe0rePloqN8Cn6G4f98H5pXt30IRePcsA+8pFCcwXBkRx1K8CfV6itlqny+XaY1ZjshqMP6FYhrEjyh2nnwY+EozOzQCfJpi58fpfdSfQ++zFPegWON5AcXUmmMpfhGof0P9+av8nYylTZ5eCXSXbwxAMRXshxTTO2dRHHPwqfqXqor3cWgG/TqYmXcBe1G8CTWLYqfjgyg2FluiHIV4H0X4OJNiNOhKiqmJozJ8lY6k+Pn7NsUIzFSKo16+TtXPXBlop1D8p/d4iv8Y/5hic52r6zzumPu9k5nfpjjK5FUUeyxcTnGm/ZnAlKo3BaAYoT6GYpTwAuCXwOaUaz8zc15Z/2HgjxRvCKw9/N/FiHMGcGd1QWbOp3iT6hng1xTh9Flgu/K+VbftoTiKZx2KHYzvWgF9bqbpwHUUm7AdRzFD7OPALlkeDVUuh9qZYubYARRvYv2W4nX1zxQ7F1NupvUeitfAr1OM5H6f4qSHMfOGSl8iczS/wSk1X0QcAxwNTBij6zVXqIj4LcWL/gZ9bB416kTE+cCWmblhs/vSyryPI1NEjKM4SuvxzHxfs/vTCvy9I2kscGqxpFEhIrah2IxiX+CgsRBiyx1j/x/FFM+Tm9ydluV9HFki4jvAXRTralejmA67JcVUW0mSAIOspNHjOoppTb+mmI44FkyjWCJyKsXoi5aN93FkSYq1oGuXn8+nWC92aVN7JUkaUZxaLEmSJElqKW72JEmSJElqKQZZSZIkSVJLMchKkiRJklqKQVaSJEmS1FIMspIkSZKklmKQlSRJkiS1lP8P8QfCZVUkMdcAAAAASUVORK5CYII=\n",
"text/plain": [
"