From 442f18a110022b80570bb81f0710e6e56b71fb7c Mon Sep 17 00:00:00 2001 From: Trevor James Date: Mon, 10 Aug 2020 16:08:37 -0700 Subject: [PATCH 1/9] initial commit --- module1-introduction-to-sql/.idea/.gitignore | 3 + .../inspectionProfiles/Project_Default.xml | 12 ++ .../inspectionProfiles/profiles_settings.xml | 6 + module1-introduction-to-sql/.idea/misc.xml | 4 + .../.idea/module1-introduction-to-sql.iml | 8 + module1-introduction-to-sql/.idea/modules.xml | 8 + module1-introduction-to-sql/.idea/vcs.xml | 6 + .../buddymove_holidayiq.py | 64 +++++++ module1-introduction-to-sql/rpg_queries.py | 167 ++++++++++++++++++ 9 files changed, 278 insertions(+) create mode 100644 module1-introduction-to-sql/.idea/.gitignore create mode 100644 module1-introduction-to-sql/.idea/inspectionProfiles/Project_Default.xml create mode 100644 module1-introduction-to-sql/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 module1-introduction-to-sql/.idea/misc.xml create mode 100644 module1-introduction-to-sql/.idea/module1-introduction-to-sql.iml create mode 100644 module1-introduction-to-sql/.idea/modules.xml create mode 100644 module1-introduction-to-sql/.idea/vcs.xml create mode 100644 module1-introduction-to-sql/buddymove_holidayiq.py create mode 100644 module1-introduction-to-sql/rpg_queries.py diff --git a/module1-introduction-to-sql/.idea/.gitignore b/module1-introduction-to-sql/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/module1-introduction-to-sql/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/module1-introduction-to-sql/.idea/inspectionProfiles/Project_Default.xml b/module1-introduction-to-sql/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..86b0eecb --- /dev/null +++ b/module1-introduction-to-sql/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/module1-introduction-to-sql/.idea/inspectionProfiles/profiles_settings.xml b/module1-introduction-to-sql/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/module1-introduction-to-sql/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/module1-introduction-to-sql/.idea/misc.xml b/module1-introduction-to-sql/.idea/misc.xml new file mode 100644 index 00000000..d1e22ecb --- /dev/null +++ b/module1-introduction-to-sql/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/module1-introduction-to-sql/.idea/module1-introduction-to-sql.iml b/module1-introduction-to-sql/.idea/module1-introduction-to-sql.iml new file mode 100644 index 00000000..d0876a78 --- /dev/null +++ b/module1-introduction-to-sql/.idea/module1-introduction-to-sql.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/module1-introduction-to-sql/.idea/modules.xml b/module1-introduction-to-sql/.idea/modules.xml new file mode 100644 index 00000000..d53bc76e --- /dev/null +++ b/module1-introduction-to-sql/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/module1-introduction-to-sql/.idea/vcs.xml b/module1-introduction-to-sql/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/module1-introduction-to-sql/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/module1-introduction-to-sql/buddymove_holidayiq.py b/module1-introduction-to-sql/buddymove_holidayiq.py new file mode 100644 index 00000000..dc8fe178 --- /dev/null +++ b/module1-introduction-to-sql/buddymove_holidayiq.py @@ -0,0 +1,64 @@ +import pandas as pd +import sqlite3 + +# read in data using pandas +df = pd.read_csv('buddymove_holidayiq.csv') + +# create database for csv file +conn = sqlite3.connect('buddymove_holidayiq.sqlite3') + +# convert df into DB for SQL use +# df.to_sql('reviews', con=conn) + +# function for running queries +def execute_query(cursor, query): + cursor.execute(query) + return cursor.fetchall() + +curs = conn.cursor() + +# count number of rows in DB +num_rows = """ + SELECT COUNT(*) + FROM reviews; + """ +# Answer: 249 +results1 = execute_query(curs, num_rows) + +# How many users who reviewed at least 100 `Nature` in the category also +# reviewed at least 100 in the `Shopping` category? +karens = """ + SELECT COUNT(*) +FROM reviews +WHERE Nature > 100 +AND Shopping > 100; +""" +# Answer: 78 +results2 = execute_query(curs, karens) + +# - (*Stretch*) What are the average number of reviews for each category? +avg_reviews = """ +SELECT AVG(Sports), +AVG(Religious), +AVG(Nature), +AVG(Shopping), +AVG(Picnic), +AVG(Theatre) +FROM reviews; +""" +results3 = execute_query(curs, avg_reviews) + + + + +if __name__ == '__main__': + print(f'Report from buddymove_holidayiq \n' + f'Number of Users: {results1[0][0]} \n' + f'Number of Users whom have over 100: {results2[0][0]} \n' + f'Average number of reviews Sports: Nature reviews and over 100 Shopping reviews{results3[0][0]} \n' + f'Average number of reviews Religious:{results3[0][1]} \n' + f'Average number of reviews Nature:{results3[0][2]} \n' + f'Average number of reviews Shopping:{results3[0][3]} \n' + f'Average number of reviews Picnic:{results3[0][4]} \n' + f'Average number of reviews Theatre:{results3[0][5]} \n' + ) diff --git a/module1-introduction-to-sql/rpg_queries.py b/module1-introduction-to-sql/rpg_queries.py new file mode 100644 index 00000000..3f9b7084 --- /dev/null +++ b/module1-introduction-to-sql/rpg_queries.py @@ -0,0 +1,167 @@ +""" +- How many total Characters are there? +- How many of each specific subclass? +- How many total Items? +- How many of the Items are weapons? How many are not? +- How many Items does each character have? (Return first 20 rows) +- How many Weapons does each character have? (Return first 20 rows) +- On average, how many Items does each Character have? +- On average, how many Weapons does each character have? +""" + +import sqlite3 + + +def connect_to_db(db_name='rpg_db.sqlite3'): + return sqlite3.connect(db_name) + + +def execute_query(cursor, query): + cursor.execute(query) + return cursor.fetchall() + + +conn = connect_to_db() +curs = conn.cursor() + +# Total Number of Characters +total_characters = """ + SELECT COUNT(*) + FROM charactercreator_character; + """ +results1 = execute_query(curs, total_characters) + +# How many of each specific subclass? +# cleric class +cleric_class = """ +SELECT COUNT(*) +FROM charactercreator_cleric; +""" +resultscleric = execute_query(curs, cleric_class) +# answer: 75 + +# Fighter Class +fighter_class = """ +SELECT COUNT(*) +FROM charactercreator_fighter; +""" +resultsfighter = execute_query(curs, fighter_class) +# answer: 68 + +# Mage Class +mage_class = """ +SELECT COUNT(*) +FROM charactercreator_mage; +""" +resultsmage = execute_query(curs, mage_class) +# answer: 108 + +# Necromancer +necromancer_class = """ +SELECT COUNT(*) +FROM charactercreator_necromancer; +""" +resultsnecromancer = execute_query(curs, necromancer_class) +# answer: 11 + +# Theif +thief_class = """ +SELECT COUNT(*) +FROM charactercreator_thief; +""" +resultstheif = execute_query(curs, thief_class) +# Answer: 51 + +# Total Items +total_items = """ +SELECT COUNT(*) +FROM armory_item; +""" +resultsitems = execute_query(curs, total_items) +# Answer: 174 + +# How Many Items are weapons (contain a power attr)? +total_weapons = """ +SELECT COUNT(*) +FROM armory_weapon +""" +results_weapons = execute_query(curs, total_weapons) +# Answer: 37 + +# How Many Items are not weapons +not_weapons = execute_query(curs, total_items)[0][0] - execute_query(curs, total_weapons)[0][0] +# answer: + +# How many Items does each character have? (Return first 20 rows) +character_items_20 = """ +SELECT name, COUNT(DISTINCT item_id) FROM +(SELECT cc.character_id, cc.name, ai.item_id, ai.name +FROM charactercreator_character AS cc, +armory_item AS ai, +charactercreator_character_inventory AS cci +WHERE cc.character_id = cci.character_id +AND ai.item_id = cci.item_id) +GROUP BY 1 ORDER BY 2 DESC +LIMIT 20;""" +resultscharitems20 = execute_query(curs, character_items_20) + +# How many weapons does each character have? (Return first 20 rows) +character_weapons_20 = """ +SELECT name, COUNT(DISTINCT item_ptr_id) FROM +(SELECT cc.character_id, cc.name, aw.item_ptr_id, aw.power +FROM charactercreator_character AS cc, +armory_weapon AS aw, +charactercreator_character_inventory AS cci +WHERE cc.character_id = cci.character_id +AND aw.item_ptr_id = cci.item_id) +GROUP BY 1 ORDER BY 2 DESC +LIMIT 20;""" +resultscharweapons20 = execute_query(curs, character_weapons_20) + +# Avg items per character +avg_items_character = """ +SELECT AVG(nc) FROM +(SELECT character_id, COUNT(DISTINCT item_id) AS nc FROM +(SELECT cc.character_id, cc.name, ai.item_id, ai.name +FROM charactercreator_character AS cc, +armory_item AS ai, +charactercreator_character_inventory AS cci +WHERE cc.character_id = cci.character_id +AND ai.item_id = cci.item_id) +GROUP BY 1 ORDER BY 2 DESC) """ +resultsavgitems = execute_query(curs, avg_items_character) +# answer : 2.97 + +# Avg weapons per character +avg_weapons_character = """ +SELECT AVG(nc) FROM +(SELECT character_id, COUNT(DISTINCT item_ptr_id) AS nc FROM +(SELECT cc.character_id, cc.name, aw.item_ptr_id, aw.power +FROM charactercreator_character AS cc, +armory_weapon AS aw, +charactercreator_character_inventory AS cci +WHERE cc.character_id = cci.character_id +AND aw.item_ptr_id = cci.item_id) +GROUP BY 1 ORDER BY 2 DESC) +""" +resultsavgweapons = execute_query(curs, avg_weapons_character) +# Answer = 1.31 + +if __name__ == '__main__': + print( + f'Report of rpg_queries \n' + f'Total Number Characters: {results1[0][0]} \n \n' + f'Number of Clerics: {resultscleric[0][0]} \n' + f'Number of Fighters: {resultsfighter[0][0]} \n' + f'Number of Mages: {resultsmage[0][0]} \n' + f'Number of Necromancers: {resultsnecromancer[0][0]} \n' + f'Number of Theifs: {resultstheif[0][0]} \n \n' + f'Total Items: {resultsitems[0][0]} \n' + f'Total Weapons {results_weapons[0][0]}\n' + f'Total Items that are not Weapons: {not_weapons}\n \n' + f'Top 20 Characters Number of Weapons: {resultscharitems20}\n \n' + f'Top 20 Characters Number of Weapons: {resultscharweapons20}\n \n' + f'Avg items per Character: {round(resultsavgitems[0][0], 2)}\n' + f'Avg items per Character: {round(resultsavgweapons[0][0], 2)}\n' + + ) From 14b2f3ef842172fa5fb5a419d754d12e366fb9d1 Mon Sep 17 00:00:00 2001 From: Trevor James Date: Mon, 10 Aug 2020 16:14:31 -0700 Subject: [PATCH 2/9] initial commit --- .../buddymove_holidayiq.sqlite3 | Bin 0 -> 20480 bytes module1-introduction-to-sql/test_db.sqlite3 | Bin 0 -> 8192 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 module1-introduction-to-sql/buddymove_holidayiq.sqlite3 create mode 100644 module1-introduction-to-sql/test_db.sqlite3 diff --git a/module1-introduction-to-sql/buddymove_holidayiq.sqlite3 b/module1-introduction-to-sql/buddymove_holidayiq.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..ce15641dade3ebba9285fae6799d513f7e9db3ec GIT binary patch literal 20480 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 xWF4>LunA2K_LJD literal 0 HcmV?d00001 diff --git a/module1-introduction-to-sql/test_db.sqlite3 b/module1-introduction-to-sql/test_db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..e2b8f8a49674df2a732a7fc82d3963bf9255b4e4 GIT binary patch literal 8192 zcmeI#u?oU45C-78D&it_u(;mf(1M8QE>`IxE^1#OO0)&rLd^sCXg*bEQ|&Hva`=y2 zE;$kc- Date: Mon, 10 Aug 2020 16:33:42 -0700 Subject: [PATCH 3/9] initial commit --- module1-introduction-to-sql/rpg_queries.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module1-introduction-to-sql/rpg_queries.py b/module1-introduction-to-sql/rpg_queries.py index 3f9b7084..8444438b 100644 --- a/module1-introduction-to-sql/rpg_queries.py +++ b/module1-introduction-to-sql/rpg_queries.py @@ -94,20 +94,20 @@ def execute_query(cursor, query): # How many Items does each character have? (Return first 20 rows) character_items_20 = """ -SELECT name, COUNT(DISTINCT item_id) FROM +SELECT character_id, name, COUNT(item_id) FROM (SELECT cc.character_id, cc.name, ai.item_id, ai.name FROM charactercreator_character AS cc, armory_item AS ai, charactercreator_character_inventory AS cci WHERE cc.character_id = cci.character_id AND ai.item_id = cci.item_id) -GROUP BY 1 ORDER BY 2 DESC +GROUP BY 1 ORDER BY 3 DESC LIMIT 20;""" resultscharitems20 = execute_query(curs, character_items_20) # How many weapons does each character have? (Return first 20 rows) character_weapons_20 = """ -SELECT name, COUNT(DISTINCT item_ptr_id) FROM +SELECT name, COUNT(item_ptr_id) FROM (SELECT cc.character_id, cc.name, aw.item_ptr_id, aw.power FROM charactercreator_character AS cc, armory_weapon AS aw, @@ -159,7 +159,7 @@ def execute_query(cursor, query): f'Total Items: {resultsitems[0][0]} \n' f'Total Weapons {results_weapons[0][0]}\n' f'Total Items that are not Weapons: {not_weapons}\n \n' - f'Top 20 Characters Number of Weapons: {resultscharitems20}\n \n' + f'Top 20 Characters Number of Items: {resultscharitems20}\n \n' f'Top 20 Characters Number of Weapons: {resultscharweapons20}\n \n' f'Avg items per Character: {round(resultsavgitems[0][0], 2)}\n' f'Avg items per Character: {round(resultsavgweapons[0][0], 2)}\n' From 6bf30340e9022a1a36769b2c6b449e53252cea48 Mon Sep 17 00:00:00 2001 From: Trevor James Date: Mon, 10 Aug 2020 16:40:21 -0700 Subject: [PATCH 4/9] initial commit --- module1-introduction-to-sql/rpg_queries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module1-introduction-to-sql/rpg_queries.py b/module1-introduction-to-sql/rpg_queries.py index 8444438b..c21e7cd8 100644 --- a/module1-introduction-to-sql/rpg_queries.py +++ b/module1-introduction-to-sql/rpg_queries.py @@ -107,7 +107,7 @@ def execute_query(cursor, query): # How many weapons does each character have? (Return first 20 rows) character_weapons_20 = """ -SELECT name, COUNT(item_ptr_id) FROM +SELECT character_id, name, COUNT(item_ptr_id) FROM (SELECT cc.character_id, cc.name, aw.item_ptr_id, aw.power FROM charactercreator_character AS cc, armory_weapon AS aw, From 938e4c5257ba2ba21d86fc302091de2d69a986dc Mon Sep 17 00:00:00 2001 From: Trevor James Date: Tue, 11 Aug 2020 16:49:31 -0700 Subject: [PATCH 5/9] module 2 assignment --- .idea/.gitignore | 3 + .../DS-Unit-3-Sprint-2-SQL-and-Databases.iml | 8 ++ .idea/inspectionProfiles/Project_Default.xml | 12 +++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ .../.idea/module2-sql-for-analysis.iml | 8 ++ module2-sql-for-analysis/insert_titanic.py | 81 ++++++++++++++++++ module2-sql-for-analysis/rpg_db.sqlite3 | Bin 0 -> 253952 bytes module2-sql-for-analysis/rpg_transfer.py | 62 ++++++++++++++ module2-sql-for-analysis/titanic-sqlite.py | 15 ++++ 12 files changed, 213 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 module2-sql-for-analysis/.idea/module2-sql-for-analysis.iml create mode 100644 module2-sql-for-analysis/insert_titanic.py create mode 100644 module2-sql-for-analysis/rpg_db.sqlite3 create mode 100644 module2-sql-for-analysis/rpg_transfer.py create mode 100644 module2-sql-for-analysis/titanic-sqlite.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml b/.idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml new file mode 100644 index 00000000..d0876a78 --- /dev/null +++ b/.idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..86b0eecb --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..d1e22ecb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..c2a4bb2f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/module2-sql-for-analysis/.idea/module2-sql-for-analysis.iml b/module2-sql-for-analysis/.idea/module2-sql-for-analysis.iml new file mode 100644 index 00000000..d0876a78 --- /dev/null +++ b/module2-sql-for-analysis/.idea/module2-sql-for-analysis.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py new file mode 100644 index 00000000..59df30fe --- /dev/null +++ b/module2-sql-for-analysis/insert_titanic.py @@ -0,0 +1,81 @@ +""" +transfering titanic dataset into elephantsql +""" + +import psycopg2 +import pandas as pd +from psycopg2.extras import execute_values + +df = pd.read_csv('titanic.csv') + +df['Siblings/Spouses Aboard'].rename('siblingsspouse', axis=1) +df['Parents/Children Aboard'].rename('parentschildren', axis=1) + +df['Name'] = df['Name'].str.replace("'", "") + +dbname = 'zgexitff' +user = 'zgexitff' +password = 'N-rZTbhw5RUyDylzQH6Cmai2wSD4SGtr' +host = 'isilo.db.elephantsql.com' + +pg_conn = psycopg2.connect(dbname=dbname, user=user, password=password, host=host) + +pg_curs = pg_conn.cursor() + + +create_titanic_table = """ +DROP TABLE IF EXISTS Titanic; +CREATE TABLE Titanic ( + index INT, + Survived INT, + Pclass INT, + Name TEXT, + Sex TEXT, + Age REAL, + siblingsspouse INT, + parentschildren INT, + Fare REAL +); +""" + +pg_curs.execute(create_titanic_table) +pg_conn.commit() + +# get_titanic = "SELECT * FROM titanic;" +# st_curs.execute(get_titanic) +# titanic_data = st_curs.fetchall() +# +# for titanic in titanic_data: +# insert_data = """ +# INSERT INTO titanic8 +# (Survived, Pclass, Name, Sex, Age, Siblings_Spouses_Aboard, Parents_Children_Aboard, Fare) +# VALUES """ + str(titanic[1:]) + ";" +# pg_curs.execute(insert_data) + +execute_values(pg_curs, """ +INSERT INTO Titanic +(Survived, Pclass, Name, Sex, Age, siblingsspouse, parentschildren, Fare) +VALUES %s; +""", [tuple(row) for row in df.values]) + + +pg_conn.commit() + +# pg_curs.execute('SELECT * FROM titanic7 LIMIT 5;') +# titanic_pg = pg_curs.fetchall() + +# show_table = """ +# SELECT * +# FROM pg_catalog.pg_tables +# """ +# +# pg_curs.execute(show_table) + +pg_curs.execute(""" +SELECT * +FROM Titanic +LIMIT 1; +""") + +print(pg_curs.fetchall()) + diff --git a/module2-sql-for-analysis/rpg_db.sqlite3 b/module2-sql-for-analysis/rpg_db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..837d7f16116f34e53935a4560c69acb17766b29d GIT binary patch literal 253952 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 Date: Tue, 11 Aug 2020 16:51:40 -0700 Subject: [PATCH 6/9] module 2 assignment --- module2-sql-for-analysis/insert_titanic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py index 59df30fe..8e0bdcbe 100644 --- a/module2-sql-for-analysis/insert_titanic.py +++ b/module2-sql-for-analysis/insert_titanic.py @@ -15,7 +15,7 @@ dbname = 'zgexitff' user = 'zgexitff' -password = 'N-rZTbhw5RUyDylzQH6Cmai2wSD4SGtr' +password = 'XXX' host = 'isilo.db.elephantsql.com' pg_conn = psycopg2.connect(dbname=dbname, user=user, password=password, host=host) From 61dfa5126bf41e9f3c05491130431ca19e7129f8 Mon Sep 17 00:00:00 2001 From: Trevor James Date: Tue, 11 Aug 2020 16:57:17 -0700 Subject: [PATCH 7/9] Adding commenting and taking out password --- module2-sql-for-analysis/insert_titanic.py | 20 +++++++++++++++++--- module2-sql-for-analysis/titanic.sqlite3 | Bin 0 -> 77824 bytes rpg_db.sqlite3 | 0 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 module2-sql-for-analysis/titanic.sqlite3 create mode 100644 rpg_db.sqlite3 diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py index 8e0bdcbe..3d5581d3 100644 --- a/module2-sql-for-analysis/insert_titanic.py +++ b/module2-sql-for-analysis/insert_titanic.py @@ -1,28 +1,37 @@ """ transfering titanic dataset into elephantsql +I worked with the example you showed us during standup as converting to sqlite then working to transfer it using the +for loop was much more difficult. I think if we could go back over how we used the list comprehension would make it +a little easier to understand on my own. """ - +# imports import psycopg2 import pandas as pd from psycopg2.extras import execute_values +# reading in titanic Data df = pd.read_csv('titanic.csv') +# renaming columns in order to have them read into elephant df['Siblings/Spouses Aboard'].rename('siblingsspouse', axis=1) df['Parents/Children Aboard'].rename('parentschildren', axis=1) +# getting rid of unecessary apostrophies df['Name'] = df['Name'].str.replace("'", "") +# creds for cloud DB, password is TOP SECRET dbname = 'zgexitff' user = 'zgexitff' password = 'XXX' host = 'isilo.db.elephantsql.com' +# connection to cloud pg_conn = psycopg2.connect(dbname=dbname, user=user, password=password, host=host) +# Cursor pg_curs = pg_conn.cursor() - +# creating Titanic Table create_titanic_table = """ DROP TABLE IF EXISTS Titanic; CREATE TABLE Titanic ( @@ -38,9 +47,11 @@ ); """ +# running table and committing table pg_curs.execute(create_titanic_table) pg_conn.commit() +# Old code from before, keeping here for now # get_titanic = "SELECT * FROM titanic;" # st_curs.execute(get_titanic) # titanic_data = st_curs.fetchall() @@ -52,13 +63,14 @@ # VALUES """ + str(titanic[1:]) + ";" # pg_curs.execute(insert_data) +# using the execute_values function - Would like to go over this again to enhance my understanding execute_values(pg_curs, """ INSERT INTO Titanic (Survived, Pclass, Name, Sex, Age, siblingsspouse, parentschildren, Fare) VALUES %s; """, [tuple(row) for row in df.values]) - +# commit pg_conn.commit() # pg_curs.execute('SELECT * FROM titanic7 LIMIT 5;') @@ -71,11 +83,13 @@ # # pg_curs.execute(show_table) +# running to make sure works pg_curs.execute(""" SELECT * FROM Titanic LIMIT 1; """) +# printing to validate print(pg_curs.fetchall()) diff --git a/module2-sql-for-analysis/titanic.sqlite3 b/module2-sql-for-analysis/titanic.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..091a1272ab5e5887da69a8bb07fdc82b75e367a6 GIT binary patch literal 77824 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

L|wss|!=jNj`3+G7UEy=|+Tc93Y;=rbbsE{IoI@ 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 literal 0 HcmV?d00001 diff --git a/rpg_db.sqlite3 b/rpg_db.sqlite3 new file mode 100644 index 00000000..e69de29b From d6636b5536088fd3297b8e6294db5b93b979f8b8 Mon Sep 17 00:00:00 2001 From: Trevor James Date: Wed, 12 Aug 2020 15:55:09 -0700 Subject: [PATCH 8/9] Todays module work --- .../DS-Unit-3-Sprint-2-SQL-and-Databases.iml | 6 ++-- .idea/misc.xml | 2 +- .../MongoDB.py | 30 ++++++++++++++++++ .../Questions | 9 ++++++ .../cred.py | 2 ++ .../rpg_db.sqlite3 | Bin 0 -> 253952 bytes 6 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 module3-nosql-and-document-oriented-databases/MongoDB.py create mode 100644 module3-nosql-and-document-oriented-databases/Questions create mode 100644 module3-nosql-and-document-oriented-databases/cred.py create mode 100644 module3-nosql-and-document-oriented-databases/rpg_db.sqlite3 diff --git a/.idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml b/.idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml index d0876a78..a22cceb0 100644 --- a/.idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml +++ b/.idea/DS-Unit-3-Sprint-2-SQL-and-Databases.iml @@ -1,8 +1,10 @@ - - + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index d1e22ecb..a5d07d10 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/module3-nosql-and-document-oriented-databases/MongoDB.py b/module3-nosql-and-document-oriented-databases/MongoDB.py new file mode 100644 index 00000000..23a1b834 --- /dev/null +++ b/module3-nosql-and-document-oriented-databases/MongoDB.py @@ -0,0 +1,30 @@ +""" +Connecting to Mongo DB in order to upload RPG sqlite DB +""" + +# imports for today +from pymongo import MongoClient +import sqlite3 as sql +import ssl + + +sl_conn = sql.connect('rpg_db.sqlite3') +sl_curs = sl_conn.cursor() +characters = sl_curs.execute("SELECT * FROM charactercreator_character").fetchall() + +keys = ( + 'character_id', + 'name', 'level', 'exp', 'hp', 'strength', 'intelligence', 'dexterity', 'wisdom' +) + +password = 'XXX' +dbname = 'test' + +db = MongoClient(f"mongodb+srv://twjames:{password}@cluster0.aplgy.gcp.mongodb." + f"net/{dbname}?retryWrites=true&w=majority", ssl=True, ssl_cert_reqs=ssl.CERT_NONE).rpg_db.characters + +# db.insert_many( +# {k: v for k, v in zip(keys, char)} for char in characters +# ) + +print(*db.find(), sep='\n') diff --git a/module3-nosql-and-document-oriented-databases/Questions b/module3-nosql-and-document-oriented-databases/Questions new file mode 100644 index 00000000..be96acaf --- /dev/null +++ b/module3-nosql-and-document-oriented-databases/Questions @@ -0,0 +1,9 @@ +"How was working with MongoDB different from working with +PostgreSQL? What was easier, and what was harder?" + +- The largest difference in working with MongoDb and PostgreSQL was the necessity for a schema when working with +PostrgeSQL. When you need a schema in order to work with a database it makes the data much more rigid. Certain situations +call for certain types of necessities for data to have parameters for loading. My ideas for this can help avoid +adding types or values to a DB that are either unnecessary or improper. I am a big fan of structure, although in a case +where you need to have a large variety of data placed in a DB that may not always align with what is previously placed +in the DB, a MongoDB would be the way to go. diff --git a/module3-nosql-and-document-oriented-databases/cred.py b/module3-nosql-and-document-oriented-databases/cred.py new file mode 100644 index 00000000..1544197e --- /dev/null +++ b/module3-nosql-and-document-oriented-databases/cred.py @@ -0,0 +1,2 @@ +class cred: + password = \ No newline at end of file diff --git a/module3-nosql-and-document-oriented-databases/rpg_db.sqlite3 b/module3-nosql-and-document-oriented-databases/rpg_db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..837d7f16116f34e53935a4560c69acb17766b29d GIT binary patch literal 253952 zcmeEv2YejG+5XJl?#^D>UCXj8H`yo2vMtN9RjlTQWm_(|_X^@9t>v??$ag0f`mRs( z(0etV&_hoMH6aj4A%P?W@&PF%kOBnwl90fc|2yR*xq<(D$;SuZ`1kX^&%HA{<(b*% z_T8P)tz5n+nsLILlc{(l6Rt%A5XNX`IE)Z#g8wt%f9_ug05$gkEbfO71)I=BZI%Y9 ziv1UwXRQ4X4i0sK^h*XL1CjyBfMh^2AQ_MhNCqSWk^#wpWI!_TFJz#w778mEZo)Ay zcptK#wlB6j>|*O}>jrCsRbakgo?|Ww{WJ7nC=sd-egs+MKgob(Kr$d1kPJu$Bm+5T3=UEymSltYb+yb>VwMJsl{MPO?9Ac4lrZo|X zJFW4^uGW~7=*(<6SSxB98yagT&o!Z-mAQf%`xit@JDhUrsvBzS7lxpmqjKdmh;nvB zV$lvtX}UGi(b4LpQpr?n9B7JkI_ZNps=BJauCX}?g)PVxR^OU(ws%KUPHTHIk#Q24 z%F8Z-+D3)wK;ZO||oN4VBGn?oT6|>nSIm+|f&KE9I9JdN6vcVRBd3R%;p>TGkv% z#gnPspElpCs_PqT8=6%O6#|wBz6yOfd;Md6~p3vApujB>{6v0*5Z>D{6_v$A$!fdIpHtj{o zuo1G~vR|}svLCZgw2>XNi$4chlT}IvBm)RDHF$V{0VQnan*+Vvjqle9c#ZSpj_yR>tQmzDh&nW)B@&;h9AN z_D#wa5s!AJA{qM3FE0QUTGqqJe%n6Ij@m!6AF*GzkF-9teqmQx58DOyUi-|0w@G>> z1CjyBfMh^2AQ_MhNCqSWk^#wpWI!_TKf*v*tt`d8k-As}lW^Ko$#^8u?xd^{YUS_) zGHi}^Zh=K7=5V!g=mClCF((ym4-Hc*3lB)kY>7IXgG1HIf&-G`ur4GpQmq_yKuT}( z{CVoop_m8%JDo^ZGGW;2&;sG1PXovxwP-lbEyfX6AEA~(C;PqD?}xQ~wV;?q|9!!~ zYN-W<%-5Mpc6a$qwE!xCCk%Ayhmxlj7WvsDf!rzvy8hp?zJcsN*{|8p+uyXWvCpuN zwYS&{>`C?@>u=U8kSPC21|$QL0m*=5Kr$d1kPJu$Bms;Hot2KRmOzv%;CA@#BNKcv9N zf?WKchgDQqv`_p`-~W#fJ%;Re?3eAQ><8={?DK8UPTHI7dGG|F(8kuA)(@>mtXr%L ztgMx?j8hp+ARSfEMR)#1dP4D9{xd-pq@CqVd>=-elvygDSY z+)*-6#br1sPGsR_F?Wgcm@90ncoYuO)7a-xtN{UW7L7bda*sHP#iEvqi*SIRLqCof ztl~=S&$Tf3XCsDlcdn5+_b}FWcuNfJ%=v~gpCL-%@2`h&pE#ZS3RxcwdMlH6aE~~RdIqu95_%GggBk6*I7P(61G!V2C7gMzD4m`tJOkLUYq_5Gy*9Ubf;hil z3~jObpt0WeWj6~|JPE6!oWAHf#Qma}K7WukPo<^wIRk7keWDN+j{CVwoX=da3;@R0 zM^9y+3G0+1&Z2Mab?y--QIEzLQ|LMLqdG|SS732Q?!~^3ImJmir!qkGm$9MEdFcCp z_@n>wpJYHXAQ_MhNCqSWk^#wpWI!??8ITM}1|$PtVg~5@e;NOOi3eDAO)?-EkPJu$ zBm;L5(kPJu$Bm^P1d&9Uq_ zh8@f3F*KSTOWCo69)rc~7-q*&^cWb)jz#P^f*$?D*>M;<4y8w92s;+C<6wFu1?)J8 z9rNi?AIOe*>^OiPHJcqRb~Ncx4Y6a89Ru{}^RuJDj)Wc+ogFoHR8^lJ`{+UO`TTwj z#zC<^prbL({yPW%%Z5faM=~H8kPJu$Bmf2MIh`3Wh|J?)R` z2Wpcq23cM~^S?+v`y#b=lS{(mN}?Sl;b>%$9M)`y!{ zuUfib2^6%rWyz`u;gV$AR;NAFO3%wUyE5#AK6lFLN|l6nL{jZrBB^mTRaND^r9!4i zdnTGpv~G??I!nUocqA5ss>9uhbhI&rzbj{*0_^SM>?HcRib@RQhO5GoXE6h zc6T|fExmo9?O)L{w`E1klG!aQdpq6#1kvyE@En?N1tVv{k_D?4G%s4TUN~FkKrP*A zC$(?sIfnYz5b4frX{A{YyIjFTCK`vXbwn}_MZMiGcaJP2g~?{@ZjUB9oL#-;vr1aK zoK!rTP6LtYei)kBTD`fgt!{Ho`=L)5CMLv!C39NV!Fc3aez+x{xqh9WI7Z`=EzZrWKhuijj zI^SA7Ia1$NUt81KorrEfba#e`?yO$2VEO8nFdv*lXXk?j z@&}Q^<(1g2+ppW5sbqIox|JC^;hGxi>YC~%Pws0g&oTH=<8!D2_8%6WkItrCUC^ol z`J`|uw5s~xt;!8`eWbd^>1gaXeRyeuKBZCnpMU5!<(MmXrw=5B+n`CwPi|7K6Rk~? zYwN1otJ?RQ5WIo;pF9nCrryCnc$xc+J3oi=m}@hPcJ54|bV?p6>}^UH7-v#^$we-!T1J2*)x;#)mymcW`*xZb>Q`t>QpE$5N*jHux&?%8>4=N^3S0|(a4kk zSCPkO+2QfV@*XZ_OAJ!j)P%DQeU$OK`q<~h9pLpJguVkZeI^olDgW}$9&j!GJLX_5 z(F^AlW5i@Ey*(DqIIVDj@~=ROwg`Qx?!$&VKqrO8#n|1p-zfCuA%|l7GclZq(0l7# zAkx?`4hi$ytny`wURY6q*RuwRex#l4-ASD~Qq24t_co(!Dnf7p1( z7^DA}K3?17`4XRD)f?EuoJ-Tlw-V$$(_wzsEpzjb7L?>Jy*LvR5Dc!7PQr zJ>}J;aMUP#N^#$FS(?Be%Tf^7_Yq~U|1&+B?24q*JCiARz?ge5TV2z*&-2MxB%Prv zS)z&l4l>DI2SD{kY^?jSQ zPY=r7(PQ9+XT?4*Jp0~ZwDw=&Lf;wIY@Xau?@Z?J!Ta)AVnF*Z0qILUWGVgLboS+@ zlVHDU;Z5iAGE%s^0(-%}7oB~l98f`fvcsXhZmp`0wAD7$Mf%=x_MN4RMjyCBqA$;3 zmfZJVv+vY{^#evE*R+yyuWU4-FAK7`?=tB-om~`tAHxT^WcpG+(}lA?$)EgQN4#g~ zf0C&6Q{FH3?{nWJy5AzMeW&O?uMo=JxuvjjsTR9C+1MYXA+7L^p*0q1b7HM=82MOh zLw#FEZAWbz8}@^opdM`K50dYb3udE!kh3T+y)7z%{{85FLd~)H0@C39J-17ol#OQ z-~S)pER(q;1CjyBfMh^2AQ_MhNCqSWk^#wpWI!_TMP@+8|6k^Pns%h_=pJC0??G3;2zj-%PJlpRahv6vmh>^O=YN3vrPJC0z- z;p{k!9fz{x5OyqN$HDAaz>b61F`pd=vSS`Q4q!){9W8b=*)hb9L3Rwlk;eby{ZAu^ z`tO10K4u>YF?_)Kt@WgJxfQc!So!9!%&(c}n4RVkW~qrouZ129T^34*7Ke(1{~7#w z@WJ3k!JWaC!AU_o@K)ekfolW11Iq(r{eOi*ilOte<LVjypz{K(6BQ5Us5*3$2WQDk+BavdW;SE3+l) zZ0=VT`&<&{c|=XUc|=9*^N3N9XVlmrt*18wt%iLFkA&3Hih!sk9_e)YRYE_8i+B!E zM=pn`f_@w}0&*0U1!xVqWLg2mdEC0wa|~l@*zi28KHILl4%VTj~NJQ z<<+_@%GSTY9$4NHisGh3j#x9x2IEhSV zcUS)@($2kM>Yilr6GYV_DR+XXzW)j3CY(@Fr_na-mz%buf7S^h$U3P(6^-d~Qt{~i z4D>lC1bJ@JlD>p~bE(fcCIGq1t5w>JK5uR|^?6GCkgu%LC)&`NN_Kbk8)Npl#Nc^E z&AoX<@7d=O1oDg;>!bDcW}qErAHq7MmR2aDmhSXEnnpi{HJ(G%k;@^fpdW{+kfW$f zp*7@^X$2II^J&OmQ74LzB|BkIQ@i{116*O|8>g_GqMH6WMOD2yOEBatn?$SYpN&@8 zn}^2#bF9(G{?LBU{)7D+`#<3A{}1hF>?iDR*!RM_{~PVA?Mv))?bG4S|8aK4j@z5< zR(S8f9G(=+wx`*3@Ya8<9kz$s1MQ%#S|3|~vEH%Xw0>#5Y`tK8&w9#w)Oygm+xn_? zopptEq4gE(6ze2wm$lv6YPDONtku>MYo0aJYO-pq3TTM@CmE0oNCqSWk^#wpWI!?? z8ITM}1|$QY8w1)L6&bigo6XHEZkoB7$;}bm%;07^H`BP8%FPsRnz(7?rh%J!ZtA$1 z%uOvfHQZElQ^n0BZYFY5$;||AD!3WXO*uE?xEagM7;ehA8O=>8HznK@a}(xf6gMNe zDdJ`XH^aFZ#?4S}hHz8J&0uZ{xEaJvJ~soo$>U}KH#RpGHzqeBZi3tdxbbsia6`D! zxzV^$x$$wMaD$nl@qewg1=)YI--XrxuiG!d+W%+l$6@9F-S#c8?*CGV{ZF$`ws*mr z|1I`05cw~&=fiscM!O1D3WV(;_5jE!1hFh z?THZE6EU_Yf^1Jj*`5fqJrQSnBGC3kr0t1N+Y_<2CxUHHMBAPSw>=SWdm`ZWM8xfh zklPb6wWz6n2NO-NI&sO$(b6c002){*Q%T`Mlo$Z?slg3$5AKRI3)= z{+C+At$ZtJ`OJTq@0))xe{H^EzF;h1bN)!h2$BUGdq? zeTLAM`60Ar7D8KQA+%){LR)4bv}G1TTV^4&WfnqPW+Aj?7D8KQA+%){LR)4bv}G1T zTV^4&WfnqPW+Aj?7D8KQA+%){LR)4bv}G1TTV^4&WfnqPW+Aj?7D8KQA+%){LR)4b zv}G1TTV^4&WfnqPW+Aj?7D8KQA+)6yB3o)8u%!m#T52Gyr3Ru}Y9Oek24Y%jAf%-R zB3f!7prr=lS!y7hr3Ru|Y9N@U24Y!iy0}Slli()KO^lmu+-&70%FPyTI=R`*jl)d` zH|^ZCaTDR@7;aj*IhvcJxY@+bMs7B6v!0uE+^pqh4L7T~S;fstZdP!!oSS9bEahei zH;cJh#LYr(j^t(mH}kof$IV=BT9~2n|K)f(vVUp+4Bq?SY@ctRU~h*N{)_Aydl+ z$cMif@P_|+|0DjJ{pa{k^hf+_{geHL#>d7>#&?YCj6FuTvC(KU29tl1-;k%t9pqxN zlWZdk$uv?#u>QLKBmG|eZ2dU>Xnm1BUe~n`v>$4BY3FMvXzR2Y+6XP6zN>yuy-&SC z-J@<**Q<-viE7CAJKxK`@Az)@UE{mZx7)YgH_un*^C^E(UQr%Zu2YUzj#j2A6ORDoeEh{d`Gy0GVItYIvUbS9$VOfmzx zw-0q;i&Guc(H-lGgxkC0+q)eoEg9b7#6m7?ZyIhGE1WJT7K@B)9q2{NS+Hjmda?? zL|L1=J53jMClwjSoG7#pw)u>5VJ}iMZ+jd%P0Nd9=rQHAcc&wXj^QqBK58_QN)%AujA7s%2eB0S(b`8q#5OfWv?bn}!Mv zV+o~mlnc9qpc`{p0bP+)G(yL5hm%SQI!3v$Hwbd@F^IIY&Sj!7#-h>=+lBo>#W^Y{ zwM8!M2byjei=u6`pmYSrDBSPVAuj9&g4QjCmL++A9oSMvNi?Gr8|YYHB?PI#U~gY#7H=iY>STC#mJo%g9#JOL}A{x=O&%A z%Sp9It(_VgWf-%ZNG9UIxD4K*p-C_e=^Sx#LjcT`bZclH)Ie+7)$Vk`C`Q9wF_`Ya zQ6vpp#uAYs8OAz{HB|1j)BSpxNQTa|0cj1D!eoqeMPZ*6WiXs#e6#>(sj$O%gbCJ_ z?vBG1yo+);WIHRZnazke%vRoDD6zDQ5f0rKmp$Ftm4NO+zawdA7QG_#lkCc4vk)51 zC;#vSyJY6%@~3;pG}+cZGOnQ`ppkTjvung*dXT%`BBe1t&Q5AGT;sqeTrz!x1AFwO z0ozzl;nL>UMWm}_D`Tz&3hi!>(vAqBiF9Yez+1X2+8&NFHrC{ZJRXkmiNZ`YnT`zD z!pdEoj5%qQ8V1HmnC(oXgvf0l)y5`QGrcOJ9pMPIKs9I)6r6HW-NPbGL7HI` zGZh0!>xi~zKxskKi;iKJ@a$wfp6rOiHfq?YN0|rZj>052TUk}?dV&6rJerLSzo4Vt zX}EBDsiA`#IErfys7tzN6Dzp|dPY?-SFo6*nSzZPs-%(!WJY#Mdo`Y2e-Dw+?&+m(cC zfet-nDPF_AxY!lOR5$`(STJe%On@PTcCBX90f>d~mwx?B=dK@T$ST%a_T>n>i>anM z>{3dGRuHU?T8M85=Z@eRacxhzJ3pl;_Q5SI}a{0}MLc1mw3cN#QP-q|m4x z$pLc&Jzd=$QBc{4Gi)~h-elj|2`A2OCt$8nNgO^)v{)!NNI-jcR}{24l5vJM_k9Vq z^(l5DnaPK|XEz8)el2aD_26j|0! zhoP@I_F2aYCbQD})RKO|MB;&3rV-Ml#lJh_5#H)VH{7LK<^8|SJCY^i7@d9J zp+HnW^=hNv`uSs7h5TLy^q1Yhm}A)Ff`+o}1!auS{*=RgL~7({{*B27J13d!29I^$ z36`>(mX++wW?%`MVJ*;SrV#L*kc(v&ZX%UJ=mB-od#6Yn{dR*(pq+;txtp=g-9sQ0fzx|$k#gUd+q(xsAOevKjdbXj zDrjpeH4vf^@No&|*ZU3&LJ+u>gK0)D(6;1Ah&|wbrvG5z8Wlfe?N`6V|XRi;HO@1VIPHOyas50>K4zsh?=& z?xhApXaRSbEmRBW9j*9ci3|y_GnVDzge~;eC=EA^@jM7BAY=l);AfJ`DF4$uOVm5H~PqvZL>&a})#%5P*RGi`z-oq~7}m zCt^a#07S719_~d9g}x`edS-SFc*SU`_iSh5|Ovi~qcWgX5g_+gu9X7@o;cSh44$@qau<@ySI=f7;)%Yy#R47h`iAcZT- zvD*}dHO{*_w!)8EC3C-@(+cw~nsQn@VD)Niq^`ZbroO&*-z=5lf?2R+PRlx&GoOBb zNqFg!{WH?5sb5_s*1W(_giF?g@e}5F6YB3>wvFJxYl~-gICZ*3R_z6p2~xNclY}N zz60v&mo`Rp^iX#?{j$>L&|h@>7u@O4V)pHwxO@8a8=VYnt4YKC3?sVJ+5cvzd{15@ zDO|l8_h<*_rI(Dp$=>Vwgb7jhDLnO-(N`?Hd_V1maR2+9e&rnO)PLLkV{Tp@a9^{} zEo&qd&q*iiT~3@n`S!FN6#B-0^Vjl!zj$xdd{WrdbjW~#{aRx0@Z_cn^Ok(d!P<`8j|H@bxsPM?nVY&SY|;70h1 zKZPEVZQpVJ-yCkHn7r>FA(bm|kt+5Z^irK_zt6#c|GJeWNCqSWk^#wpWI!??8ITM} z1|$QL0m*=5Kr--oFi`DR6|A7=iIRcps|*!mWy?Igh{ykL(I!o||I=pR^Jt%}Q!*eK zkPJu$Bm3U~C2|7Xbf|6jwi zEJZRP8ITM}1|$QL0m*=5Kr$d1kPJu$Bmy`{i1|$QL0m*=5Kr$d1kPJu$Bmcste93@hKr$d1kPJu$ zBm~VJ39%2u$4I5d1v);Adv|hJfvYxk|u^zV`vhKESvG!V*TIX7)Stnb&tS)Pd zb&R#nT4v3+W?GF_l{L-^TSKe?mSG|DZ|1w^o9650OXl>}+9Y3EM2}Oks}@c80Lig`FnsRAHwG+azqG zunof23tK1bWMONCtr50b*eYQs2|H2PN?|7mTOsUtVatUbC+t{Z$1qFd|3T(Q2qOP) z+4tGk+b7x^?S*!^oo9V){n7e~^_X>?5lr5dUU?$38)T+ zFC0yTV@2+8#_pPAth);a0E%Tp0_}q_&m>{}KVG1ogY5V1zuSMbe_{W|e!+eYo(0@% zKWyJ-Uk7jgFNgR4=ZW|K>tF@IQu_#dp50(ivd7w^>_Y2f+p;z51M3y**VZ4b7p&*3 zZ&?pp_gdFmw^0@tSQ!!R<*UlDz@@0zg2DxHUDgWXyN_d z{@-O@ZC-5NWS(uFXr5y3FyrPb(=ivCv&>EA6tmc@F^8DtrePv;KGfw*7@S>m>+#OsU>c@KE51z+HhG1E&YB44fR;88|S>S<6h%dW3O?sahBm3yNxbmv$4roX&h7Dvf`bzysy;*P6C+TJS z2t8j9=t%pk_O|wh_KNmn?Yr9J+JoAi+Kt*3+IiZk+6h`l+orW?>$PRtTy45GS*y@W zv>}?U>FUSo2kP(DU#c&uKUBY?KBC^I-lkrwUaFp>o}!+hrq!+LG3pw1u{uYcs#dGx z)KThSHKZ!O4}I_Ye&>7D_oDAv-{ZaqeRuk9^j+yY-*>w2WZzC-!q?&3=v(1i;G5~I z_f`5v`-b@j_;lsJl>hv~$@KrF2J_z~or&jjFb*&Dt5{Jw(bae^b9L^*vpLv~=Wvk3 z^Ejx)Eevd4g_}8;jAwB$49{c*Ip|hAjk%n0cq#{D@ev%1#M3z#jAyXi9q4@A$Xp%U za1#fs@e~f4a03V9a6QZ24vnm1uC}#!G6w-%%Rt1zH5|;x{Kr=#c^H0^75a7zG^s+M zv++cMPQ{Z1^6&(9<}r(LB?GNpxSWG_JcfhWcpL{)@K_EkJf59@G&&QHX0D?+ za0v%fa4E}l6xxGFGS^Yla4`oVJc<4$iVuIcmM}ua30IF4wy0pg1=(R z64%AB%|Qf*7+5Z7bOm~kB`$Z+2OJDRf960%@3TzH&_(DS=32HHy~}}t-ezFw zR`e&9X$krY`Xh5K8H#?-K>_*$OIwV3(3{M)82&ae2ZPaD94P3w3@jRg-e6#1JNgYf z?MQSc`ZaSMxfT72fd%>Kmn>~QIvKsr&^&ZAdW|K{TZvxfAc+2hrOidRqgMpF1pPvw zGttWowV?CS&)5kq8_>@=s6a2Vv^nSk^dfW3Nud`wI12rQgL?E+24=5EKW4dSq4UrW znQPW@=y?vdqaSdv68(q+ANoGa-Hfh6-xKIG^c+iU&Y)*G7>K^hfq|Z3nP#HB=qZ6t zK~J;9nX}M$nCl31J$gc*tI@Yu;t?8pQn)Tb-{!7-^f&`E(&#Y;rnjO;Imn<#7?`#e zeUqIw4TkbzfjsmLfn4-;mTl@<^bm7RMR%eH1-c16z!TS_`UOper~~(B&MIqsthmnuIRp;6!u@2bJhzR&*6Q9bLp+la59ga!`sc zU}=-kwdj0-PDAIh#EGlWxeQc>&^a6|LT7U@3w?!y0q86SCX7L6vhypTb7wHu_)X|^ z<{A&K)3~b{oytIY7dnNdm7`lw4@2W%`e#|U;b>~`iDRoTYv^a!{9V_1ff=!{n87#TmB+m@raO>JTsUkeyhF_8!T=V06O*mNK|vKDXubm@Vj@%WZ87w)iSNNIrRT$hFgq@(E9-TRqqcm>Qs;>GmUhQLM zkfOmS{}dYkk5kuTas#=XoClHN2_iCFN0ySgEHW%7VNwW@p$3uRpY`AAuj)V1zo&mo z|GIv+hz!r{7a6Y77eZv%pjYz9(Eh9aw*3Y?S9rmG)_wwZ72IXtXkTexV4q>T@Ju0T zJFwnhIXq98Zr8$of+9QL_FMmirwMOaufghr=U^wn1J>=Z2H_IxEAT8~x0SRyto7Cs zYYsd|sItabBdmdzVg8r-zWJ8|hf-DJTmL z59S3);G@8Mfj0xM23`n!H}F{C{=lt)y@87ZX9e8AjzBEX7FZWp9GD$w3QP=?28O~D z0@eSa{~iAu{#X3Z`@iG=rvD!QE&i+F>A)HOll|TPZT^UVjen89+20_Z4Oo8F_`C70 z@mu2+<44BR#v{f(#?8i6#s$Xd#)(G8*lHYOtTqYqiDNY^_O~q>a{w zYL@0xKUCjQ-%wvsf22MQG5fvhSJi9Oi_|k!SKX<`)QGxPEm4Q4ma0OW{*LdrzF+u$ z?0d%dsP8`Ct-ig!i+yMLJc!cczINYw-%?+TZ>q1_H`Z6=%l8?|$I5%ko64)o3(9wu z$CUe&ufF|%DFXg-^wqB_SV2FWr=$X^0zW$X19ZER$icIeE}s5_w2~AkqQnKNRJL>U z{fx3rpd*wRN8hVbwsQ1bSc!7<>~YE#j=sBGX&0zY*(}f)rBk4Q;t1qdIyib}q0+{i z^)$LuiR9p|N^1_@pd7>DchD`$27cCe+Let0wJJvoG+jALplQk`e#%oQtE|mIPg%p$ zpE^NVCs0yZFVIkBHP85MbhEN52TxO$^Ym}8QdSByP+7szw+1WAc*ZBujmpv-yi8e` zgL{<4JnNGs$`XN0Wf4z)0^Ok;$(>J3QRWNOsLX@!53KAQg?Dja<8Jr@@hdxVhTT=} zKzHJlKs^}73Z7x?KquoQ%f4eCPIKVLFv^hDjrQVg%+;O2F%Akaz1zb|w~Z4FWCmdv zSIC`4=VFJs(hiPtFbC5+KCGk%;!X|%7)BRzr_g0M!d$71xSfOPnBM-ukK5MZHVy*# z7?yiGJY;AU=xhw*1|@W%t1!LU!%Ejl_$UUF$Ks6)BsO4r+lQ6-CJf^QxnoemT7mZB z)hsc#5Yt;fti&eabqs9F;8iTsR(JxjoVm81i0R!QR*!3Sjyu1;RhcYMr_vx$jZ)7uK7_uiRCDJ;T}rJ$ZAy(mVWo;^d=NS| zF$d38Ch+tJH!76^=?XkGqrG{cT&dt0??*Q%<=lDyHf5|p?aDZTW-4O@BFcDv zadhuIWwbz=QpyXw2kljgx$~Y@rGz`bhE7vPap%{3N|-zEM%O7LxbyCv%1D7Klp>yd z7jzpQmeJ1K*JTd*`T_7E4ocFbMQO`9-PtU+0yQ@b3iLjNu6!t?$Yr{CkeBI2Qj}pbhvp0xiXF2xQ~ma&&nM{*^$(@h=Tk z@x${C{5r4gGEiT5oJLE&>{tvB+Zd|HuL(2=zsfUS3QwAzsHj=K-c5vxbyt2_*sD(@zVkg!`~HXAby6Qavq%W6nCDN!QT;R z82+|EL-DsbI=34?$xk^4U5X#)&T|^@6Wn<=Oq9oR@DBWF4qkyD;aShF#SaTqgTKj> z;V~G72XmD5vpVrZ0*%KH3PkYNdB!uL^n1AT%nZI)pg6uypn43?>u51&7UBo^DQBP_ z{59@8qXpkBP&2-ZqthJ>598=5r#Ij`1**e$@RLu2ud-XY^R%`2Hi7E!R|Oh~Z{g_F z`S=EbD)5a0jl=Lzjuw6DAbgWRCcc>$eG0k*Uz>yH;%jm+i}&)Zr<{bZYaA0z1Ci0&$VaR z_4Y)2j6KpGY@4=fePq3F{oeYO^|JM2>sjkb>l@ZR)~yh=Uv8amodNp?j)ffrTdg*0 zgSFgRU^QD!2ig7qJBZ(ZX8zE8+I-A>(7e;U(Y(sM$oz`gW1e7kn=!M)+-R;ek2IUj zCbQZcXNJu}(>6)ypP|2m-VXgX^lIoQq3?&D3Oy3KFLZn8`p^}j3qogvywI_s?V%_{ z^y@-PLvusZLv;|-j}DCp4GIMzs{cpuz2IBH*MmO|en0r_;5UMI2X78u9lVgm^}B+} z;O5{_!BxS9!RBB?a3YKB2L}B?6!>f4?Z6v>UqEdCY~b<0gMm8(Hw3N-oEJDPa1uoK z@jyplV_?$U44uhK8n&(vLgr=HLqeUrXIU!c!~r#ut& z(fTkwPdDHh!e6vMX}{K9)_$Zt15Xhi(C*N#*Dlk})lSil*V5WnEuyW{mTE29G_6)E z*TPyMJV{X1f2i-NZ>g`VKU068KBaz>JxkcDUZQ?Q&8o+#DRql_w7Obdq|Q>C)GBqX zTBHtA11k3YO*~h4!S`L?W4;G`xBIU5UG6*2cdGA1U$-v?PZl=#migxSX87uS6}}SR z5TE7K;Mu|l2hz(?nNm`JGuvZumH@_J=lZ= zV4&{7E-U~6;=wj7h;Y!kx(6GvFiuU^J=lo_V59EARxAKD#Dl$95ZIv0bPsl8feX%q z?O0fW$cA{ZA&a83bq}^=Vcc~R@nBCD1UBd@-Gg0O7$=X_J=m6oabkn+!M-evvY}Y;5v;|<7?!m4tj5kl# zJ=nGd0GbK=wg3#%J=nN~u`^cpVCNQq!MX=qw*ZVJ9_-!13aky#J=nbkE@%>L-@>?K zweG?GEdbky2OGGs0!spP54LcDt4a6j85l=A*u;euSOB1Vu#F4jwzawk`?vrEbPqOi zVH| z95qe%!VGA-H;RD}@kRnrU~K^LiYS5w0J=AVCT?ogz2OWj*1cg2Ox3-i3=AON5C94+ z0MNZc>e>ip4rZWM_X-#&C*B~Q>15*NQv?eDbZ;O{+@R`S9tG>i=-vPZ;1aMYSQjIn z1wdJcPA8tp5wH?si4olkQm__AFF?T>xIX<1Ow{39m3jsdj{s0$Z2&y8X09Q`)2Is; z0O+1dU8~_L_Hh?nX$o^S>mFtRMh(%lRp=buJ&C$j`G|WWcU`BuCooq;caNuFrK7vY zF_6~XV;S)4?rsWJjMUv-3>>AqI~fQOcLx9k)&>xlYLo&C0Cbm%6kZM`F_l`b5|^pe za&(36QkBBXhv;;BD8|b+6S_YXE3gtkcbP~nGjx}U)Y7fQr6Q%k0s!5mDutI6=q?kf zB|~+WiPYl3#HAvoz)Aq!Wh%9Jj_xv*TCC_URVlm(s$(Lxu${P6q!d^Hpu0?^j@+ud z5t?a1K5?l?Df7|E#APZ43jlPNsuZ5LQg@k1%?lEjiPT(l32~`NDX}q2WNJ>m?oye;bB-b|RVf9Q1n4f4sW~a#WimB;z3x((!n2@e zrc$$xBQ8}b1(pQpE|n=fYrF1JmBO=NM5#zAumFI#RHXo&rn^k0nlrjfWePVB)ZO_E z7{sM2rOZU9=q{BhJaZOtsY-!sFL9|%DM!#AQk?<>gUW>J2#vVS+;zR~&IE*y$k$z_ zR5Q}L%am$*tL`$TnhrHnrNYzJ5|;{<0t*0$OO*o+zVZ^0srN9CJ-DPq$8K?=J_eCpu1GAa7~f! zGPSCPVP$Gny+(JLT2;eLW@=SkuDevNaMdK;WnxuzqV6)Ws;VR|6)Oc60O&4ND?I6F z-KAoMCzTSHYLx;D0EkP)3J}Z>rdAVI=`K^N%8>3-wZfH)beD=1uAHU2Osgsf=q}T$ z31f&$wMu~n0J_V>YWyYwcmCjl1pvBB)e4VqhFdQR%Dafm#0nMw5SNOT0t*0im#P&W zH%xb#Sd9x4mx`4F3jlN%(X_Es2-Pa^+(MXE!TW!mN!6I+b*5Bf(u4|?G6pUzCRAgV z=}f1}>Is!81>XPbOs2{P=~Sg~*?7VE9D{Xd}+1>g#uN)#SlLa0E2<1(EI z)aW9@^ar9?XXXs3wN*%()sT3wC)233N&ZMbCBUG6bc>k|&p=FkAAXJyYu~%oh zR1CMIG@*E=&QvL!B<(Z=sohi_;E}aSx9$KR_`5Ahw&eUg!p;Pg}h0}E^J-D!#P~lPF{Xe0? zqrm%roe9t23Z3c>9$c<7)hX!Ksp#N>TAfM`E-2AwGh0lk+$iw=U#D_|^EI7`P5xw^ zX-)oiok`8W89Gy%fzxy*Gy^y2RA=zOJe{fx9ypUQjmd+1U?wqnb9AaOIB%v-^#$i; z2vrv)4=x9)E_lFNooS0*qBCi+SLxN%Zy%{MVXr_>+HAknKf~^vrDhjrm zb*d-WoS`!{F;CE$n3xlErX}VWok>aPM4c%~D6N;#{Gn!@>Ie?j>!r-b2on)_|4*of zDDeJYXBradCQL#CaHB&N1X5g`DTx0Boe79Pqci>RZ`GN6_`^C=4`Zj!#KWl2nRXae zgi413@Beiw9hj`vnQ)Nfbfz0*yiR2UlQDW8wXl$yNrpxURSX5*{}ZYh0M65yVra(@ zDj0BCpQ|zFR)qwk5j2#0Sg+z`YPacKeYy-N&$~{dvuLDl%sU26A)X#Yg^>U zt2HRhj|XX>5Pm#`#{Wx{+t6XWr{83+fWQ1V!=4O(9blwA$PU1J`u~I#|F2s=wZ3OP zVLfQw0c-v*wa&J(5bt+c4n+G)trlx4to9#k6NBsBtzv{one-W(VKiR*-AA|SwYyFG;v;2+z zN`I+;D6HY9G5nv6-xxp0LU>PqlF@B!gZK1nj73H>tlyttlo&${ z%TUSR$-CqY7QH`3zCrFHH+Sk_eW~7}Pt~jSv3ij{5MuU^wfD8RwAbLh|8v?C5V7B` zU8h~DeMQ@&?bZ@nhqeLY^*P!Uc<*1P4buj|YW@Auv2yH>pa-^Etx(hH_kT_ z-v9eyjsE+}Tgq$7i^{X`{{McMoctf@0WniBdUrYL0Xd^+sL=y@29y0=xMS`CNdxCQ z-9`_H8aUrUw~-#uHR@bPdO+C#y*<+C0d0fiw_#ac56ByXcaR=XIGR4t=mCvmPM7q6 z%7ODwV@VI_9H2iQLwZ2z0R5qk^nlh;G@A5)*ikfs^nlz^6eT?%cofYfJs^32ejg+~ zAbNn_Y9KuzdlZ$C9uPi?rjZ_yK8k!s4~QQ$;VpC-=>h!%=bN)g4=5l-Rip(pkH?yJ)nzl@~d@h^vfki56C2B{3W`9^ng-Q=P;uOq!OI3(=tIV0ltQ=Cp{pTkp9|6(gTtS z=+!!-2SgK+U!|vmZi4ea=8+yyPKtJr9*|Co=8zuHPKt_252z=gUqna`$R|Y=qz43) zB0uQ?38iQYfyb~Ey#nQdi~@RDHF`iup}LphmZ=A%6r4ZbX!L-Xg7fF-JkkStN}UUg z9*|UUzJyLOdO%hgynyr|mj2RlBzqD=KbvD@Ph`nIg^)jc0(1Uk49OnPQO3v~$C6(J z0~@BJP-$el0MXSMXOV1@JJUusA)L39Y@9nIBpYMs`$v%MHjXkRyOp8uRgr9z zq36ORyM>`=q0^lVeHZ$-nIq_c!%=`_J2>)_Y&%EGNw$rlXBHaS2p|Q)nhYa*jDR;7 z*;WB>CE24{*6*~E>`@#|C)rILO(WTj9JL$S4S*B`Yd1)CJ##*lB-wQwonU0wvSe7N zVPw|`=#lJdo<7vbu3}DDlR>g8ne*GLNOlEB1C8u*k$f7-E@RGb4K}h%nG@Dzkn9rX ze6qyIE*8!`B)f<^O(VNdI4?7@M=}U&GDvm-OMhYn$ob1=HCU z0dF<3a~OOK^^ojrmi4hRBTGe6L9iOY$a0m07yl&7Rr1l1BuiBiqeo4W*JLHS+77B+E7O>orD} zYNUc-F#ySOk^K5rlI0@#P#4K^k$kAl$WoD15G)2DS+0@~!F1v(`JirOsY)scmH?0} zm&pe=8d)xr52ABPmdoS=@@ zmdoU=&>Sk0)Ontfr8=n~c=2y!sZc7g==>rA@2P0zH^arumGb6=BukYNqnn^iDwGO> zB>*H#l@gpMk}Ma>o63zW7s?xHIaDbBUwiKvW<{~J4R=@Vy}NhsG~^6J1_^>h6-fe; zqeKxHhCv1C&;2E>dRkD{0m1By9dz>FF5cdxaoXQQv@JkR%i z?{%K*ya&-_jFfRudY?$zHRG@speSIZ5%8*Y|gm-9@sEZp?R*;wU$EbCTjHH{!R+QQFqE6P%>@$!qb0RbNiwf@lHw>gEOe6MD6dL5$sGQjt429V zag$*Ehagyt5I!SSo>&|hL zCFKJts<57~6q|9YblDwpCUDn%8l9N;xrU1A} z@sgLJFDp4*_Sbil;w3Tg?ZaL zDIRhKUI6issikgGJS3(7xJmMm%1YtmniLnAf}c)`i>z$uB*jHm)^L*KB5kYEb&}#C zmnYmLc}Qhp3V@R&7in9|Cp$^;kjpciqA_hF0geu?;VRR2wz#GDtPW*q%>`W{1D(2>IPF$3ji}C&L ziFo{j_(Sn)Fyp=iZ2c|c@z__fw_^9lHe){h)L4&Lwdi3)0;}OCdV{sPQI{93F8pQ-yGs*I__Y9AuWE$V!=NKI9JRRRI*7pO zH;*VQa5-6Ctwo;I)a)6MGc&goH<453wOr^Cw*~+7sfGFZg|l)qb8-Pcroy!1zDwDgEEhpG#S z2XO5G8w^NAOl1Nm3lXt^zr?GRoi4JGIVIV-V1~(D;5D6@{=XA)a6Nqg^g0xPm!&;w zj@LTNvj$e(U3Ly=Scp4jCLTrsSLd9C{13h6Gd!Y>kq1W9D0pZK_%~4p4fTsxZ+iNv zjwvgg1=5)UdVOb>dCjM#&zCnAwHN;-2TuqGq2lD`d5z9Ym-QH`EcEL0zsiO`@ajxW z*G)WM!<$n$+pBj*`v0Pa6X6TUXmV$j6?lm$>1qq^mn^U4ABjoJdv)xMOhHS(#ZyAf!R1Y&0=_!Ts1P6lGzDc&#k2&V=*@_bbkx zlUoX6nnKjn#^clP&Z%X2MOnVv0Lcw1kyq#R^oc_XKv$EWo0p5a=QSMXS;w2p8o}=j zczxgm@a`5DdacHK7HDwzA@!3>%v`{=DaUZ@6w^g|wa29E`k1oZS#WW1d-J`_(PNbvC4!w7!{6#UYjY*Ka7QNC{WFS>1=9Pkr0w~@)}|#rT+@_n}v#i+8|#QxKgkAiRq^^z^{UEBdBiTPf*#tCOti? zn|a!&QY9%XrTx^(U}i2aqsLzhszF^>ZG6J3^9zgxPx`L%|9=j<}CcGvVf1|}=t zcX+kCr1Pu3GbK4*%M;R1Vg$ap#4MGUdlr4;$qnLRXd%eqsa@% zt6b;!v-1BRrc6nh*Qiz6DRX0pABk{rWfpt2TBff^-Z*%OLa$+q zbhR3ni@QXj<1;u5&!KRp*P?m)di#~3Ea_ULfq}O4(z~pU)inB760lq^nuKQopUlpMS4y<8-5WbRn^*!NFwB z@*9#&s)py)9_@+7jnW?-d{nBwRDRR1cEfbd^gpj4ob&26NPk`X&8&LW@Fnr;*H2$r zx~Qo}<#An5!I|S$aX-agb)9a8OYF=;+@33Se1Vkxc@sRT#V`82i?9>u=E`t_b^_+JGL&iG&V8TC)Pez zA8Y4di0+K82e;n*=-6nlXg!R$KNh(vavr$ydSO&ud0%*Mcn@I=y%=$SdoLdTAbekV zQ+PFa?#5znd&98j9&z7y?{zWqfzj{rV6AKDMx0N)>aYS-v({5}c0J=$XNI;Df+Rf%^knz!jGh=pASth+tOuZoN(ygZZt8 zZh`sU@2lt4c6GH{s`Aw&)l*fs57|%H+wC=Wu06&+5x0KyU+Z#&<9_JjSH=>*r72%4 zv=mAaNtYu;uL`Aw@)1EP@)4%{`BVo`_V7+#t8xV8elwUqE`G?w501X~)F^~wD@Tm( zN1^a7RivD`Mfh<9>i&$<%rDvwu5*R?jPW`GC6v$bvXic|HcL`G;tKZmpKyU z;7#FAW3Jb{9AUd3RE@6sy!tPVY5g@SNBr(rKyE&v&j4*Lx(8HRuX;J+dA|okDrml! zC`TOchwHetVy{6t0(d_jr<^peCOkvD9MQbrNq|trYg~@--4E~4;3>?U!!bO0)qJ$v zyo_>$@O~)372m5{j?mrj4f)f*@LH53eD~uic9256X<8-5&*4WA!uvlul0q}w$=vjv zP*8*Ci%{Kvz9X`75t&dZj^?2W`Y0|TXWF71vAh3I{l>NVf|v$sNhZDz<%r?^j;E@R zak{x9Eq6Wv4;Qh#|8U3p?>6<`q&ZCaLx;+RklwFcM|(K5wrZ6lwD&8Qg!>dapa2ob z`vrJ3Eov6-1;M<3FC#gYpqSY2BlE-E#^ng;{l|9nf0Zz>z-v^FK;ExSe|kpJFsW9K z7~bz%lLoX`yBxv0-#0P_FB$tc)Twwm0(QUF;AKGZAVl|zX9AJ7qVbL<4|f!BjE@wZ zjmL_Z-LIgd>AP0D9HF}ZU+6zGhilG4ye0_Q{nzBEGUuR_JBLvGUbS*W?EZzzoqNs7 z5uf|LGXoc9=M*6_&qarZ2~D$R!hyFaN0jcD?0BY_~4?fKQ))g$k!$f%RKTM8Fnv^57_uV9Na{ffOOJ!8Q93j2m zpE*Gq$8?R{|Ix5~Xu35%(sVbG+aapt5>yq$@_toG2T^4xzoX*#esGWUk%osvAn$uf zbPIrz7#&09h~xchCWd5qNCfS^hortDYPWDN5&~Y77b11PyarM~MKQNVr3GX<%P2I? zL3try_seT^9-6j@X1K}8k!~s88wBnCdxN@)i$TEdUko+lQ7aLv`?d0@N}rCCsLJ4m z5y1Nu#;@ThAH?f^`EWZHj}pYoC<%n@eo3HdL|zm3jriQZZ`09;o)PJPC5!d7*$ic-RH1{v2s`e(z5t94&HU#}^xLd^Eehz)HP+|zU{SrH>rwspw zKgzgp#NYmfPe3S$stm_~_}h035|vRW!BG{yaQ1AxjEKbjm(lc@QOKK7j!4}9*5D^| zOK}4T!u=aCUBmNH0*JZ&5}@9Xs(+A~byUk0uMS>6MC1PJ2k&YES&De1Jh|hfeI^w; z0(8I75mli}B;8K->Xai&Z)ticw&s$MbE2~1s%XquxC5ybn2IG`+B0?2e{CHIfwa*s=2u3x1~dy|4P#S!} z^FrwEKQ9EER8U^ia)j%CAAY*MQz9Ky+{uYYfau+S1Op7qIUWImcK;EKV?UdI5&R&G z2190hHOmpmH!(#gl_D>9Cfp4oc;DTK4}))z4i>LvIRf{7<{ZE8iDOX^gHxA3@q?qv zv@J*2?iW6F(&Qr4_IseJzIN1UH6K+0vAkau`cY#IFPjN9*>}Rd(C0hX%PdEH-^2WO z>B8a90Ub=C9XeWSlq1adOT~YZUc+)k^nO>^IKNlak2vs}A)xo4${0k5C>woTTqweK|3axt5AP;ocK_WRNKXl`F=BK7HI}{}`Y(8Ph|c|I zho7d-e{Kw-km-$qLm;wzyiy3!{Z~r7yId@uDnfPtsiIV>!T@PA`L&#yy=b8!Zf|X# zmH!~ndxa)+>vF{I{sZT7Dx8^}m6MGY5RV!9&H4homk8ng_Yw`xyxeT`uj75J3Q`f> zWR@d%_iKgpWpk~-m(=fcXi|=NzMHuizad=W*Mppe*=U3!tZ(Zd;eS7Qm=4WoFWrnj zs!1+hgxdMJ1=PmCrwCDf`cp(s&3yFu6M+hvgRvw$2!!cbeJ1`dLi$tx zT7>96s46WyzFBZ}b;=Rr`%lc2HMcu(TZr)e+oESFJ<8-F@iYzvv3Tj-AjsX7?#_6HW| zo53IO6jl~I5W6dOYw&RF#@I&mT&xMzk6jpB4jzF8fpy>moD<6eBjC8$@YujuZ_H-s z6#N8Q0?oh-SThy_H{c(^I?*H1ucMzv4+iH2mPFqKv%p@xH@YYKX!QQT6n$UxPOL+? zA$m>p%3$N@>gf4;7y3fZjh00V0s{lRqjRt>;f&~b@C^)!o*L~H92{5!)`5=E*1=WL z%xJw(F!&=@y0_JTL~BH2(NN@%$dSm`P#`!Mc{8#fDg;kPc17-s+!47svN^a2Yy@i~ zmqsp#BqQerIz<*hksvpc4OW7Qko4mdHYi|#93hwvr#QKICf)l)Jy>(D3xX@efEeUqf`=MJ<6sQ?$>g9r& z@C@&Ca1##l`glEqZ+Iu552vNq7#s!}Uf5INUxJs1zYBkX6%g-)4`6A_xbTbMGk6>; zA?^v^7H9z0!t20laCvxDcm-BOED9H6O+-$3T6iMX6tsuF!LaZE^aAw=cLv8ni*Tdh zbK%-pBjE;jhL!uP`-A(HdkAU=Z@By2ywR4MiunZE%@>5-TYhxHZ9f7y=i<5$9|4FCBE=boM)Y z0~b1b0x`YUc@!%v?sRSmz8@&W`ig4;S!fpZq-octbmA<)dp z3WfuBJ5!u-&Tz0M^mckWouQl1+-VrN5!?wGj_2sWFQH#U-v`eOd=dI8bSU&*==IP` zV9VScd^xZ@^swF^x)-dO+d|iet_l_hGq676k`NXShRz9<=!2m=^m9!MO$?0&yF!1g zyy_9^28D$-A#JNu^&)~AdLcnVpH0w6FCb_F!h?gBgMKVZHPqzEi;ARi#?$)`1tQQc>MJ@CE-^a8y<1@j8=!C9azUeyPgruNwx#RjG)sj}z!3%paXl zUsoq+tP=z=9Vh6eBLrQvN8oCgz|jstGaU$?S@oMIXe(G;mFlH_qeB{~UxUl4GTW%1 zgBz++QS~Do(n9?}&|Q5We7S00C-oI&#?%)CA@vzSAN2`AHT4leKpiCLt=}`CAef@uVO1pZULJ6=m z32-TZeUnnq?ht6sU@Z%15Hynwnl%Bw%${m1rNGoFP=~>OQlOmvOV3V}=%IE9G+?kF z72vA^2S25{tLp`7GT843+%0f6gT?<0uc6{t-|beYK8fs_TdNCx{Cfd>Wne}d_g4m@ELG)>FydA*XF1+nPyPK+uDbaKoZ~14y+e>>u>d9bL(5_5=5x^Hn zd7z#pXsn(Scu0V&3p9E-WwBQPS0bgbPM?0HQ4u8?s=EY+Fxb}+G*Al!_-xQ$a>{;> zpuW0-!G2cYDS^iY_`gDff>W5ljT7pre+q09C=nRXU_ZuS@rBh@dng6f83v2p735PW z1sXpBkoYp#?Cl`7LMgCV3gk0bpV95r@+bkqMu9B?a|K*FqUPDWWj6?#R@wtrJqC+! z72+b4s;=%A7|USuMS}28Qd}t@ZbB)L=?QeEU#`YKnW4C{gNBcGLGXvcx`-g5)-%{2 z30x&mCQu;2_W?#vN;;&B6{3r4XX<%55&(5HdhsB@z8CB`Ealf(k@W)F(sf zeM_JfJ5|ula?1KcfL|JI-9SGn&3y>>&@Qlo2C=+a!Hk;Z>z;8QcOG&My0)9)4m5GyOpg1mad*29WA?xf z_ht7p_XGDAJr863I9-CnoEdh$9@eG6-ic>q7Cuk=Da-+k7-LAVax zDNat}Ly&b$(MJ+*CteLNb9#mz362OnoY;prvt{7k#8ZiXy2G8kz;)045E)4bvY)vc=cW^IpB6@RTiR*?ICC&~#5pY6h1Yb?e$0~|!#KO65ouC_dHZV*b zN}QRP;Er?Z>#wQLB+);(hx$yyb)BDrYjg@)ifzKJ+?CRM0wR{5psDCk?}^(uc%6O> z?24bqKa9T}=%BBTABevIU4-57N8&rtUu@BJS@^b9i@D=(+%nf-cc6Vra z@NKX;+yFJhuFj=_My%er3d)V=#TGcX2eS10=yy5GIX_rO{}G!Jn*=?E!Lh!vo`}j{ zi**Vw480Y!0&(tzsUNHEd=mOD7K!QTFVSzqwwvo*2Ud?o(a*rv5Q%8-7w|QF7M|>8 zc?W~7F#{wQvrS&|o(cDI7Y5gPk9iM-w}Z!UYw%0&E_VP(ICg~CRn65)={fouVO{ikU5Dj@5nOfY#0OkuEI zqyIBy4kf_N$pEexq|Vly%Gc-Un<+g&@nwSboKo{Oe*k}w5M|U!Z7E^MjZcmT}>Jz{s-G*SUZWZ9K>}hH> zrB72U3Cc9P-BMkfA2j6LD7R48G&aGzlcH->iIu`8BWe&wWIsn>I1R%sE$k9PQ ze27X?vPAQ5W-0c=XRDuNr|w2O7prfn2uE|R0cSSlfj6FDsODQ8s%OvOM-&Q1=q#syjo=^Fw^y;}n-N*v|QaQmVqy^b@CZC0eYOarO#z9-URH&gF*z)h}QKC_?Z>K`w$3S`qw@AU4Tq=s-wXH{djc9o+U(AtvZX^a~Tz?+i9SK`5Q^ zag}O-%NGO{CVDvF{Wtk1(b1slcL^aBM*wPmljPtEoc)vwMt%a&@w>OkzXbm`pJlVV z0vWNS_-GL8QwmJ`1mMS)UsUh%{{=}tWrGagy_$?k>S2P3`a}Yd+Y^A#o&db{eC{O8 zZ#z-aXUP8t^*tQ`Mra1>MS;5sKr_#0fx@4X;GcJY;@!F~gZhPlDCRTh5kcRI$^}&M zluhjLy)2h{EGP*!c**^W09@__AZq7Rh{Szz`dBcz)82FJg92}bi>wU#Az;-H60iCS zN%C)iGo6km!t`s>M}ZZc_YzO~_M?s_Ui633hk^avvUErKAOGc_rjFI4{?w00CD65Z z=ugS2gxXhS{yRfSADsI8J~(xuoU4-m?l=C`J`hp<&7bPQnc(L8)1S)xQ?e?d_zB=X zt8)H3hW(-(Mdke8__H_tyMye?zujvW{C)OB$+k!R?e4#3+HL-tV@~H9h`vX2|9?H| z>%V45`t`rhw*L7q@=f+%?*FpC9KGD6(Utsne>s1bna&#|=KtCUoj&AmEOY;|hhHj) zIWj_g)!;J*FAZr~2+xkvKAy87V$0bpnhHcY7vi3bpx-yR-r$7>=L=eg__WFpCzsnB zISC;{`X5O^bOCPPL1C3s)q%6qk z3Opik9qlSPm$$8W%Rc}iSV|OgD;GM^bTCw21vb#G`F$t>Egk`GX+T_)b`^0R*!^i2 zw52Jpa26#%+fRvt*_41X110kLs}B7D%7Yd$<>fV}1QeqwF>eYbAigW`KIP4AK-)Q7 z_z;DlJ<#hVfMkO}uD}Tl)~^EJ(P=r{=m7ISq69tJmiJ6J1i3x~jhb9Jq7qDmIghYF20%RuYV+KGx;U*Mx0e*-dhB5$+ z{~v%hz_alupy+o$#{aj+w?ZFaL;MQFs~3PV@Vxj!XawZNXJgcV3L?~z;2r26?}btS zPVwX7E#i&ib)obZjfW70{tOnuFJp&d?;{F*CAKg2bnNli!(bD<1G;}(Fyg;Hb{Vw) zR>mq~=f)O*S8y)01EwM79E%bEL5Mm}igk^3gn~dba17Rl8lZ%4A$Xn19cpe;tk3v=8&d4p18!(c8Wn^{ad@vC%j+937p)D{SY=mPX zL!lekE7A>P_^l(Ek$N2E2Ea=AgZCBm1K;yrM|AtFx7&LdIs-erZQk`z8n_JngehnZ zEcE7kbHPzK)f*3%!qdFI&=WktYv;A_8hN$BRp@#)*b2W5e-2&2x5KYOS@5awKf@1% z?+V|FSpC}Y+VG`NA4rDJg~DJ#_^j{@C=j3zfJf-NhmQ}p2{#Sb57!7s!D0Bj`yx+znuHSmmy8m${4FVyx+y<(>&n!%^;Fuo|A^b^)(p zOSdr;2s7NUtDIk)@4)o%k@JpozWRiJU8Hk1-W`gi?<{!)LW-v)ohUi}2r z67NB8+?K!jtR2fbRszRL;BQKRzHP<$o-uIONwJ+JsTl}v$@|PPkL@6U*ux|>RA7j}V1l#k(*y%jUL7mdzbhS#~GNoM9g? z&{3d+Kzjl1mzypFJkxD%V@?t^jw}OptNE@ph0h$J=o7 z1X@4|*aWBB7K04poNoOtsox03N%L=i*cr_@O6Gl5SDM##YA2#RPZ#l0OPWMFBy3}_CM z*5^>`ARRK)dY@p33_K2|Celju)npBGW%Q43+xqmj-a3QtiUq@PYXOHu!o?p^`rpDDt)cpltRZrVm(CA%X(1Y0fGAk?jtx^dfra9?v>O%0(TRfWZflj zr@$Qow-cNwgYYL>w@GR{K~L*ef*xR;XSiA5CV_1P-DTQGHz;u+)eS`D3^xdD7T844 z6=Y)!*AaA)zThs+pVoZxsF{y1JH z5*!cR0nWUXprdrhc7VtVQXQm!y8|>OICT+0d#Hl|+JVF$aGVU*90%TcPOTtl3q1~o zN`f{}5MW3OR1mZV**n8B3X)ncrERP8c)NtR99*_q%=S67ZMlfI3wg@}?k#yfN6RwG zX;I4C65jHph!*qNE~0JoLf-NuqUQN*=kazPZJY5haI;*t=kWF{+BTidTb{3!$J)O7XcsrK1 z^~dmbG;QmR;w?}4sLNyGb%s+;9iHD&hx-I-522jegL%u*b1e@4YYn8FT0BLh7Izrb z>`ys0`ti0eZ~M@;I!~{vehS;Yc*_G&)lVY38i&=@da~Vvx7!rK#g z%TpH;oyd+K&)bf??Z8`}CKhW)c8t3|Vr|)OLtD()rY(0ZL|c*_X~Em(ylqBXuPJXc zdE11yjcJQ{&9rUETMqcc^~rYY@s_6rVSE@lPHo=S;%!ad*5GY*+J<<55~J?0gWSJB z3hc0Bv<*ag%i|3JkL@sRwaZ(FwkpKiAa5bb9=0`YFjqGm_QJdD?s|r=|Mx-St;8#d z=Mnoq3I)JB6SpL8K;(ZVGyu;}R3sK7?$1xmh6>=M#27^VX5N3IHDdmHiRy_6lmLH2 z#Q#3byidFbI0jnB zo5btH6LAMK`hNu1;GeYsZ^JzPYhzc&E{UxG3&Ghmk{p{3HiA*m3h0CR`^Q5qph=Y) z;E&O-5XZk0eKou@yaRL5HzLMe9bSo<=nKO|;W>zKCqZLxaJVn{`8y%L%?#HKXN29b z1x|v)n0fxLd%)cXmi}FcZFjg^-Hq;AcQt05FN4-zkvj)m{gd3$h->@0Ju%a~jhhL+ z{tVZ3EzB`L>>P65MNGR7EQY(Boz4ztDnYLkB|pLVFO&?!?IT*3d?bUat>nz^I26JQ6${JcJ1L0Onxq3GNE+4DJYS4Q>Qu!s_74;IiOC%+r_? zoB79Cq-l{k1 zwR*K)sh45?MUkGPXJ8%0F7QX}K;O#7=vu6wSQ%XwU5K8QIjqt+IyyMo7yT-oqHVBR zqHZ)J>Y`WWNaS$j5Of+3ME0RiWmjY;lp41}*Sy3(YtV0>3e=kz=3GETpv{=xXR|KHT5oPJBKHh77_RR%9+d{bRy zQ2L|aRMMmTraGVV-%u+VUso#(N>B7_s*=;MspSTfj0b246@AMGRJlPJLw!{(<@77+ zJjVTMiNSLjUsj6^p2PT(TEzGwMp^0iUQ}lrT)_AOhFd9rpDHz2!uY%@X56c!UwyAC zGHL1S-m3~sI-l`5m1l4sNo z>A1(#XvTl4Q3gjE9AR*{!C{P#s-XsD$ly^m*rZQm+@%H?9LV^H8emYSZ#<&c)ybTGK%K;RzdF%iPsaOH4};web~D(Oai{8H@C1XM z4R&I@R~>J#qrnaaWvJvH)sEA5tK$r|HQ2^rYlE#A?@}^b=1$du(|4-ojCZJJ24!~5 z?JASgw<{T%*`Z|YWru3S`8!lY#@kc_gY^y8W8ALl8mz;3tEz3V7UM0drokGFH>>If zs~OBNm|(m~#SO*`Mh!+7w<(Wts|qvTs9b{%;}#V%7&I6#s2Oii%Ajq~614v?_&eif z`!~i-_OAwiG59m%_4ZE&k1$?m|7h?B#*Oy(2EQ}-t-)^$e$9BTec0ev2ESyy#{Pow zYWs7>4Q8xm(mr7DRfDfEUSaPy__D#57%#V9H28wSeTr@=cIFEG;(F0gl)^lgmi+uIG^ zYVa1umG;dBZ!);e;8w;J_KgO&7`(yYW`mm;Q}*=+uQRyO;I)jE_B95tHn@RtxqX$v z^#<1&T+5iWuQYgt!OIyd?8_L-?SB|tWAIXgs|{YlxXfN<@M449akSLtj-#bEcN{IX z&!-Nc^K9-oT4Hm@(Gr_Gj+V$;fOBO$eX%SQS}gN=7u(!%bdJn^JI7v1zp}_aPhg3_ zxdaPkw(mljGQ7}UM44yH8ke)}vn91apiH2YV1ZpCP%JQCph%#Qpv*21$QQ^Hm`6}* z&m}0aa|PxIoFy<@Acy$>9&yK5iSHAiV&s2+;+e!QjQQW3xDHYO#ffBM5k~s66O$98 zFvfpUqEn(J*7s*5g7IJCUn9zYEB+GJ^goR8{B4NvFULs!viO4dJj^zq5FZ}zhuFRY z*6Y{7T789;`d?z+`0E(2ee{pILABF8;fYLx7XD>4*CVPya-0qf5ce&`-lVgh95%@!}jpz@Otzw zREEz%??O)a4D>Aw44;g(?XAIcSS{?hzq#LH%={g!W`D+g6ss0)#c26D7os{?!CvIf zcBi8FkNq7hfnz0btOSmgz_AkeKf46n6^e9{?2ZrvUjZQ_W!oJaIxC=LL{=9k1t}x4 z<~k`z8Ie`XO+m{Dr(l`2lY*KNGCOp2Qjjx()&6WJ1wA8J?ed)z1dYf#)k#6oh^!h; z3X(>!j!QTxXd02#$Vrv4)wYR~B84|Br5@y@O2iuKq*&n1Zac|I&F8!}Q72U-))Y5I z0&faas<*i*Qg~B#Ysf#Q@_B#j`A&)@-t1PhofJ#F*{%A!DUx_ob}MUxn_`VOn46u{ z96qO2XE${g?{5jIwbX3RY+2-{NaIb}Evzft)GT8zb5gAGW;Y+@q-OGw&09LDEU`Q% zHAAeSZfZK8(#*QpO-(aq(n+1k`VthP>yWZp0mxxh({5o@ZO8VyU?O`vj@ zB9%8XH#jMhdBc&JPHF^OjbX9Ko81V7N+NFJk;ogF=R2vvvR^x? z)7Wa*!$}QdtHE41#VT)h14wSB21q9A0IR&&4Q4p0{+w5Tgq!LIOWF0Uq?_t%%{Wk(n+1jnRO?+sh*r!muf)|W1U9hSmw>HHr7eCk-SAtsx?~~c%H4q z!aK<_Z+2pUn`(hP1$u0h59_?ynBAIc#s|hwLz=P`9pI!g*@_(Rq?(8ocTff!WGsPYqFE7!&bP=N!1n$^`jOnWrwlCDa9gh zwp-|?YH+4YwUkBPY`4CXs>bKIs2>?-_oYsXMc!RFVxFPLFA3BE^Z1UZ}{gSDil{T@eCZcf{vRC@$Mj1ALzW{oM4WV3W(LrO+o1m zX9uxTE=5ifqqitN@sR<%v6keW;8co_1RGVQ_(-hGtRx?aab2iHi;Kikuu5@}da_d~ zE>gE~D#b-&WTjGEB>MI%#YL*9QzmJB(0x&JC*Dtt)C`3mE!)r`CHY8L!<|ZYk=9Sp&Sn>B9jWP7 zl8aQj!9*vy-&G$8K_x%KF}dR5p1@GNEuyZql~C$C2bEVJ&tl*-2X8K^~l)r1f26r*b&& z{myeM$w?~fJ8O+oNnX;nz74vS>?EykNhzG2r1foGx00Nsvc91s*-Khq4{$5lOIlyk zWssLtFt>Tp4R%6pvZ~_h+~{<~)k84?+dbMY+B8}x8jaeKA0uBx-pAPMbKv>EFLE2^ zvR?&Gx)qTnkrJ@cO@rd!kVx-H*T`{^CXrfLqitjE`eztzeFgK@|B12ITfI%*`lI6N zY2cR|ic!|?n5o_rymB#5hkt@P;D_Ni!Y_oM3_lpY9kbIngx7#UZb`TVqxOTtXR>xc z<8T*@*@xXf-0#CR5Kq4c27qVWSKR9nS>J+@`lNd?#_99jYvlR*N43(m)e-dtln@T6=hS0rQ{o48tJ;aR9`9j=$FrF4 zu^#I?wnP6hg?S$5CW^7LV_M>LuoU!3G)=Svvt#Xmf&)P7MV}Q8C>ti$n|qvz){D;Z zO{_YX{mrqU*jQkfGZqNujD@w%atc~6db)37jk@e_hGpu;nuo@)n61EFCr6@{rRVzQ zW}R#HgVatk|3|JJJMfGwSXl3aslGzk&dd32wp0Ti&*;rV3FQ=fDrN>KVCb;&D z1-d=4nqW!3vA|Ryr=XRkNBiamJ<99{DW6!4!OJIBBdpvv78dWzDQIQsp}u*(9%A-` z#80e-;PDfy0ao_QfoNsvfhH6De#V-iPZg^^mY2(cXl3bszImPQYxaW$P%_cV(!C|K z9@euP3$%d70yCh0Ab0{Kvo4kjOD0-bx~Fe$(>;9ieBIp~Iz)GqOti9eSIMjcW#m8DxqW*i)bV#UVjW@1GL=%!*tKxSwx@EOX92@VUfegIpg>_#g~?KhcY)XQRh5Bf^kjaHU=(Kk1#7tH=KYM-&ddm+|$Ah|Ra zsK$&1LMb^Jtt|D7WPS@mC&@%BOFd;W!R;lPXl1DzhD zUw{uztk1#8A=YQ0QfDl1jJW}@by**)Et2(7YqeRf;6v+LwMjBR z1ka4Iz+@=a2Ot+QRx7npPC00;S6BJwWomSBoa}zrTBR-*^BrrGx=i-J1L7dbd>f}2${JYn!ttus%uLsl$$$ZVaR4tdx*Fa@ttRV^l z=4jhl2dsana^D1FitIlCvJ|mi1u2p2egz~V=Sk*%kf#`{m0BXZUq%5emduwy#3I&9 z-P9u4{i1cDI$JVd1lNkOz|JSu3m{w(YhOJq_O>8-e(dj93H--PfGaC?VQYC4(1oqb zxniOVTgy9vE^NKj$rz*eqCa4r z{JogJofkbV+BKSpd>(l@aua4_m!dzQKl%b9;AwlxyU|+=PWiF_@rQWqA08`#V?_=SPA?`N}y&1R04fDw|=C@3DGVnTUJ0K(3evqT{f?61%v>7O{_7{ z>w-kBh|fXf6w;Kr(2Vz0;G0xH56~AC^A*l=XOgPCD1LgaE1(7F3!RC=p0DjLifJUj z)*jMfUabn~0{WV5qKQRvdS1hdHb)EBL1y(RNv&L*);fI}%X_g2Mc~F4 z%z_?0%c((%JeL&BvdfBcy^IRz{`oq1tnh~OAo}N@2i;bdL?sb-d8+wY3v=_mrWKI> z`+H$CQFw(SVv7oh0s69T&;n(-TL}KK0HiNg2VLC?hy(gXNII#RbG$YckOcIV|I&iA zSx~0SMHLhUITBi@(;*V*pWd&8j__(%Kn>7W6eLM!ItdjK#R(xmzc_vIM@aNGuYeq& zuTeR$xVW%bM*R>o6 z{qam+dojBZbp`T&eq9-r52axvjY!Xds#|g9EH7RG9Y9}<7WanIhTdOQX)i3wfz}=U zPl)oRUsF6-tkv}&EM6@fgDT~utCVOK7NQBEJgjVbB%vfFU_qj0(dVPnZhrr%<0ILP|{GY$R{QnGrB)&&Oh8C&T*gYyi|HJEE~4r5DwmciMKEp(2-S&Yqfw!xVO zvkcB)Y^J9hoM!M$gHsKj!Prz!F*w=aB!d$TPGHQ`;|-o}a2#V3k&LmM=rJZe+TbXI zBN-d(5sZ!WaD&4P4mCK$;9$mv`ZUG{dXT|^1_u~Cm9f6=Z?K=iz6Sd+*3-QWo?@_< z!IKT1#8_9KXt1Zj9tOJ`?8aC}cQx3Bv9>;ev6k-4SW|amtf7xL*paci?qIOJ!FG(* z^l=8;8f?Rup<5el#hB174Ypv6>*kCx-Hb7+n=(dproko#8yjrI=;?+A8yKu_u%5xX zjA32JU~Pl77+ulNv0Yumq^ldOW-x=%(FucbgE50q#*mH}^bCd#x{N{X7z`N<8VnfJ zi~+3-+6FB_^#`L?zZ?9`;I9UMG59m1Qa>3yV(>?UKQP+rdxPH@{Fc#D-x&Ow(E39i zHux3e@9Im&-_#cdKWF?^eP-}e#$VJY1`iqh*x*M7KVf zz~KD`?_>Nz?PUC1-OKoyy2s$%2JbR>r@=cIKUKFgexi05yv^WtgSQ&Ih4GNO+2BnE zw;9~Z__4at;1+{7Fn**qGk&Nx8NA-$b&MaVjRvn}JgBZQc(uU|6#qXTzCIoQzm|9b zx_6Hz?n~UB*ajAW^kZ4i`j{;O#Go%!_14rbfm`MnnciP62Cwhe*pv zBdmIeMMB>1SoiRy_mTIG_bM0#p7b68WB+ZK0kQF4^30v+b@tj~4MaV!nimGUz)#_C z!k>a);Pvo};itjWe}DLn@J;{Y&8uSYY79tJt=qlGS#RuT?uQ=Lt^9-qFgjFXrZZ*YnrmT6Oz zw$%bXJpRkprJTe>SwTa>dZYCYr?(iA)Gf9&(zn=h6I<+wvfr*DXo18ZKeq*BTm&34 z)0#Qni`6{_M+uTP1P;3a#9;(-hgj9fd$H`m;H3s<7;MXjZyv%)EORkH-dzWKx)mkCVIKnl4uI6O!+LVbP_Zyn%CHaOuCz(^}Rs|GT`T~ zX~xN`l_h9T6(qR_?7sR8feD<8C8P%BIbboNNp}^rZZil?1)RO1KPRyqPEfrsXiFq{ zl?8PT9ClR+XJfUApnX0gRt*`HfNz}|CTaUsgINZpMz15C1^nE)`JBDh-o=P@Q-XFQ zK}*W}N=qs}=ALstmgE|2ENJ=(uD}9ydR|z9W>B8v<%Zw&azm_lImv?H-(Nn455pQQ zgD)DC$BBhBlD5rpw!^1gCQltJD0w$lmKc;W{DWMBa^cF9sumqzQtXyEM+p)vCRqeXT($yGsmb?j^QV zC#<*P{a7+&@Nz-J&AQ5-X3`z`=T~KO66>1 Date: Thu, 13 Aug 2020 15:35:42 -0700 Subject: [PATCH 9/9] Todays module work --- ... Sprint 2 SQL and Databases Study Guide.md | 137 ++++++++++++++++++ Study Guide/study_part1.py | 57 ++++++++ Study Guide/study_part1.sqlite3 | Bin 0 -> 8192 bytes module1-introduction-to-sql/rpg_queries.py | 2 +- module2-sql-for-analysis/insert_titanic.py | 22 --- module2-sql-for-analysis/rpg_transfer.py | 1 + .../Titanic_queries.py | 88 +++++++++++ .../titanic.sqlite3 | Bin 0 -> 77824 bytes 8 files changed, 284 insertions(+), 23 deletions(-) create mode 100644 Study Guide/Unit 3 Sprint 2 SQL and Databases Study Guide.md create mode 100644 Study Guide/study_part1.py create mode 100644 Study Guide/study_part1.sqlite3 create mode 100644 module4-acid-and-database-scalability-tradeoffs/Titanic_queries.py create mode 100644 module4-acid-and-database-scalability-tradeoffs/titanic.sqlite3 diff --git a/Study Guide/Unit 3 Sprint 2 SQL and Databases Study Guide.md b/Study Guide/Unit 3 Sprint 2 SQL and Databases Study Guide.md new file mode 100644 index 00000000..bcef7599 --- /dev/null +++ b/Study Guide/Unit 3 Sprint 2 SQL and Databases Study Guide.md @@ -0,0 +1,137 @@ +# Unit 3 Sprint 2 SQL and Databases Study Guide + +This study guide should reinforce and provide practice for all of the concepts you have seen in the past week. +There are a mix of written questions and coding exercises, both are equally important to prepare you for the +sprint challenge as well as to be able to speak on these topics comfortably in interviews and on the job. + +If you get stuck or are unsure of something remember the 20 minute rule. If that doesn't help, +then research a solution with [google](https://www.google.com) or [StackOverflow](https://www.stackoverflow.com). +Only once you have exhausted these methods should you turn to your Team Lead - they won't be there on your SC or during an interview. +That being said, don't hesitate to ask for help if you truly are stuck. + +Have fun studying! + +## SQL + +**Concepts:** + +1. What is SQL? +- Selective Query Language: It is a simple way we can query databases in order to obtain the data we want from specific +tables or areas +2. What is a RDBMS? +- Relational Data Base Management System: These are systems that allow us to interact with a database: DB browser, Postgres +3. What is an ETL pipeline? +- Extract Transform Load: This is a way that DS takes data from one place and places it into another. +-- Extract = Data out +-- Transform = Taking it from one form to another form +-- Load = taking it in that new form and inserting, or entering it into the new database or structure. +4. What is a schema? +- Schema is a framework that ensures a structure for the database to accept certain formats of data - Deciding on +datatypes, lengths of strings, and Primary keys when necessary + +5. What does each letter in ACID stand for? Give an explanation for each and why they matter? + - **A** + - **C** + - **I** + - **D** +6. Explain each of the table relationships and give an example for each + - One-to-One: Country to Capital, for each instance there is one singular connection + - One-to-Many: Book to Pages, for on instance there are many of the connection + - Many-to-Many: Books to Authors, May Authors write many books and often interconnect on certain books. + +## Syntax +For the following section, give a brief explanation of each of the SQL commands. + +1. **SELECT** - Specify the columns that are wanted FROM a certain table in the DB +('SELECT character_id, name, level FROM charactercreator_character') +2. **WHERE** - A Joint logical condition. +('WHERE character_id >10 AND LEVEL >10) +3. **LIMIT** - The amount of results you receive during the .fetachll() period +4. **ORDER** - Choosing a column in which the order is specified - can use number based columns and add DESC +5. **JOIN** - INNER, LEFT, RIGHT, MIDDLE also ON Allows for merging of table by different aspects. Inner is often preffered, +because it allows for no missing values. Left can be useful for seeing the difference in certain tables. +6. **CREATE TABLE** - When loading data there needs to be a table with a proper schema to load the data. +7. **INSERT** -Using this allows to insert data into the table +8. **DISTINCT** -Parameter used during SELECT that allows to only include values that are not repeats of another +9. **GROUP BY** -Using this will aid in an implicit join +10. **ORDER BY** - +11. **AVG** - +12. **MAX** - +13. **AS** - Casting a specific section to a different ID in order to limit the amount of writing necessary for the query + +## Starting From Scratch +Create a file named `study_part1.py` and complete the exercise below. The only library you should need to import is `sqlite3`. + Don't forget to be PEP8 compliant! +1. Create a new database file call `study_part1.sqlite3` +2. Create a table with the following columns + ``` + student - string + studied - string + grade - int + age - int + sex - string + ``` + +3. Fill the table with the following data + + ``` + 'Lion-O', 'True', 85, 24, 'Male' + 'Cheetara', 'True', 95, 22, 'Female' + 'Mumm-Ra', 'False', 65, 153, 'Male' + 'Snarf', 'False', 70, 15, 'Male' + 'Panthro', 'True', 80, 30, 'Male' + ``` + +4. Save your data. You can check that everything is working so far if you can view the table and data in DBBrowser + +5. Write the following queries to check your work. Querie outputs should be formatted for readability, don't simply print a number to the screen with no explanation, add context. + + ``` + What is the average age? Expected Result - 48.8 + What are the name of the female students? Expected Result - 'Cheetara' + How many students studied? Expected Results - 3 + Return all students and all columns, sorted by student names in alphabetical order. + ``` + +## Query All the Tables! + +### Setup +Before we get started you'll need a few things. +1. Download the [Chinook Database here](https://github.com/bundickm/Study-Guides/blob/master/data/Chinook_Sqlite.sqlite) +2. The schema can be [found here](https://github.com/bundickm/Study-Guides/blob/master/data/Chinook%20Schema.png) +3. Create a file named `study_part2.py` and complete the exercise below. The only library you should need to import is `sqlite3`. Don't forget to be PEP8 compliant! +4. Add a connection to the chinook database so that you can answer the queries below. + +### Queries +**Single Table Queries** +1. Find the average invoice total for each customer, return the details for the first 5 ID's +2. Return all columns in Customer for the first 5 customers residing in the United States +3. Which employee does not report to anyone? +4. Find the number of unique composers +5. How many rows are in the Track table? + +**Joins** + +6. Get the name of all Black Sabbath tracks and the albums they came off of +7. What is the most popular genre by number of tracks? +8. Find all customers that have spent over $45 +9. Find the first and last name, title, and the number of customers each employee has helped. If the customer count is 0 for an employee, it doesn't need to be displayed. Order the employees from most to least customers. +10. Return the first and last name of each employee and who they report to + +## NoSQL + +### Questions of Understanding + +1. What is a document store? + +2. What is a `key:value` pair? What data type in Python uses `key:value` pairs? + +3. Give an example of when it would be best to use a SQL Database and when it would be best to use a NoSQL Database + +4. What are some of the trade-offs between SQL and NoSQL? + +5. What does each letter in BASE stand for? Give an explanation for each and why they matter? + - B + - A + - S + - E diff --git a/Study Guide/study_part1.py b/Study Guide/study_part1.py new file mode 100644 index 00000000..650f3524 --- /dev/null +++ b/Study Guide/study_part1.py @@ -0,0 +1,57 @@ +""" +Study guide practicing importing data to sqlite file +""" + +import sqlite3 + +# directions + +sl_conn = sqlite3.connect('study_part1.sqlite3') + +sl_curs = sl_conn.cursor() + +""" + student - string + studied - string + grade - int + age - int + sex - string + """ + +sl_curs.execute("DROP TABLE IF EXISTS students;") +sl_conn.commit() + +create_table = """ +CREATE TABLE students ( + student TEXT, + studied TEXT, + grade INT, + age INT, + sex TEXT +); +""" + +sl_curs.execute(create_table) + +sl_conn.commit() + +students = [ + ('Lion-O', 'True', 85, 24, 'Male'), + ('Cheetara', 'True', 95, 22, 'Female'), + ('Mumm-Ra', 'False', 65, 153, 'Male'), + ('Snarf', 'False', 70, 15, 'Male'), + ('Panthro', 'True', 80, 30, 'Male') +] + +for student in students: + insert = f""" + INSERT INTO students (student, studied, grade, age, sex) + VALUES {student};""" + sl_curs.execute(insert) + +sl_conn.commit() + +sl_curs.execute('SELECT * FROM students;') +results = sl_curs.fetchall() + +print(results) diff --git a/Study Guide/study_part1.sqlite3 b/Study Guide/study_part1.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..4c50a843ad7c07eea7155492231ef7371a378318 GIT binary patch literal 8192 zcmeI#K}y3w6b9g#w2e@Z5hNXJsmxNry72&7O9DcxwT+-F8R@hQGzlbAD6Z_*8}u07 z!wYx=kKs&dq#Jkc{2v+S&3i8s_;wlIbtA3BIL%_I#W~p{l#)v!2qD}o$E+guO;Ron zW~W>EZz(5d7oWR!n7t75ARqt%2tWV=5P$##AOHafKmY>&OWNO=FnIY#hj0t^#K3^^)7*)bV=rIBpH(y3-~r+d6dIrn#%$nJT4aChcWU YwLr!8I_lQ#ce+uUv~F$Z{=mNT4T8;8jQ{`u literal 0 HcmV?d00001 diff --git a/module1-introduction-to-sql/rpg_queries.py b/module1-introduction-to-sql/rpg_queries.py index c21e7cd8..25e7d601 100644 --- a/module1-introduction-to-sql/rpg_queries.py +++ b/module1-introduction-to-sql/rpg_queries.py @@ -121,7 +121,7 @@ def execute_query(cursor, query): # Avg items per character avg_items_character = """ SELECT AVG(nc) FROM -(SELECT character_id, COUNT(DISTINCT item_id) AS nc FROM +(SELECT character_id, COUNT (DISTINCT item_id) AS nc FROM (SELECT cc.character_id, cc.name, ai.item_id, ai.name FROM charactercreator_character AS cc, armory_item AS ai, diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py index 3d5581d3..19cdf384 100644 --- a/module2-sql-for-analysis/insert_titanic.py +++ b/module2-sql-for-analysis/insert_titanic.py @@ -51,18 +51,6 @@ pg_curs.execute(create_titanic_table) pg_conn.commit() -# Old code from before, keeping here for now -# get_titanic = "SELECT * FROM titanic;" -# st_curs.execute(get_titanic) -# titanic_data = st_curs.fetchall() -# -# for titanic in titanic_data: -# insert_data = """ -# INSERT INTO titanic8 -# (Survived, Pclass, Name, Sex, Age, Siblings_Spouses_Aboard, Parents_Children_Aboard, Fare) -# VALUES """ + str(titanic[1:]) + ";" -# pg_curs.execute(insert_data) - # using the execute_values function - Would like to go over this again to enhance my understanding execute_values(pg_curs, """ INSERT INTO Titanic @@ -73,17 +61,7 @@ # commit pg_conn.commit() -# pg_curs.execute('SELECT * FROM titanic7 LIMIT 5;') -# titanic_pg = pg_curs.fetchall() - -# show_table = """ -# SELECT * -# FROM pg_catalog.pg_tables -# """ -# -# pg_curs.execute(show_table) -# running to make sure works pg_curs.execute(""" SELECT * FROM Titanic diff --git a/module2-sql-for-analysis/rpg_transfer.py b/module2-sql-for-analysis/rpg_transfer.py index f06a925a..d1181c5e 100644 --- a/module2-sql-for-analysis/rpg_transfer.py +++ b/module2-sql-for-analysis/rpg_transfer.py @@ -31,6 +31,7 @@ characters = sl_curs.fetchall() create_character_table = """ +DROP TABLE IF EXISTS charactercreator_character; CREATE TABLE charactercreator_character ( character_id SERIAL PRIMARY KEY, name VARCHAR(30), diff --git a/module4-acid-and-database-scalability-tradeoffs/Titanic_queries.py b/module4-acid-and-database-scalability-tradeoffs/Titanic_queries.py new file mode 100644 index 00000000..d175d1e9 --- /dev/null +++ b/module4-acid-and-database-scalability-tradeoffs/Titanic_queries.py @@ -0,0 +1,88 @@ +""" +Practicing SQL on the titanic DB hosted locally +""" + +import sqlite3 + +conn = sqlite3.connect('titanic.sqlite3') +curs = conn.cursor() + + +def execute_query(cursor, query): + cursor.execute(query) + return cursor.fetchall() + + +# - How many passengers were in each class? +# - How many passengers survived/died within each class? +# - What was the average age of survivors vs nonsurvivors? +# - What was the average age of each passenger class? +# - What was the average fare by passenger class? By survival? +# - How many siblings/spouses aboard on average, by passenger class? By survival? +# - How many parents/children aboard on average, by passenger class? By survival? +# - Do any passengers have the same name? +# - (Bonus! Hard, may require pulling and processing with Python) How many married +# couples were aboard the Titanic? Assume that two people (one `Mr.` and one +# `Mrs.`) with the same last name and with at least 1 sibling/spouse aboard are +# a married couple. + +# - How many passengers survived, and how many died? +pass_survived = """ +SELECT COUNT(survived) +FROM titanic +WHERE survived = 1; +""" +results1 = execute_query(curs, pass_survived) +print(results1) + +# how many died +pass_dead = """ +SELECT COUNT(survived) +FROM titanic +WHERE survived = 0;""" + +results2 = execute_query(curs, pass_dead) +print(results2) + +# - How many passengers survived/died within each class? +pass_dead_class = """ +SELECT COUNT(survived) +FROM titanic +WHERE survived = 1 +GROUP BY pclass +ORDER BY pclass DESC; """ + +results3 = execute_query(curs, pass_dead_class) +print(results3) + +pass_survive_class = """ +SELECT COUNT(survived) +FROM titanic +WHERE survived = 0 +GROUP BY pclass +ORDER BY pclass DESC; """ + +results4 = execute_query(curs, pass_survive_class) +print(results4) + +# - What was the average age of survivors vs nonsurvivors? +avg_survivor = """ +SELECT AVG(age) +FROM +(SELECT age, survived +FROM titanic +WHERE survived = 1);""" + +results5 = execute_query(curs, avg_survivor) +print(results5) + +avg_dead = """ +SELECT AVG(age) +FROM +(SELECT age, survived +FROM titanic +WHERE survived = 0);""" + +print(execute_query(curs, avg_dead)) + + diff --git a/module4-acid-and-database-scalability-tradeoffs/titanic.sqlite3 b/module4-acid-and-database-scalability-tradeoffs/titanic.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..091a1272ab5e5887da69a8bb07fdc82b75e367a6 GIT binary patch literal 77824 zcmeEvd30RG@$T(=XJ2i3m$$LJXoy6;Hj<#*0|@0|Cad`|ka z!|mzr>gww1>ZGyS1PP#l)Wp3QSO7f&vp1n4rJ}1tuskL4gShOi*Bg0uvONpuqnD z1$OF=86~sDfoQxZaxi*u_i%JL9FKPI=6|by81)^Ewc8p)8#gyJ?hNJq=T~`KHiz=m zr+K0LJg%BokQx%s8M9}L%-Z2_S1h7FP@t=y+*VuH+Bm+pM^#5-+Zvl1JBmG_P+sRq za({Gxq$lqq|8IMDEIc&y(f@CAcp#D&+Sa&po2(c)IPPDyz4&h!N~`>D(XLoD-aAy* zIhYt3iVTHnyAt8#f3^`$M&iRmW%Yg0SP%aCUq9M_kK_+~3hbb{FZdmz{FLB(!MB3{ z489cnYw(Z3-vyrtJ{tUK@Q1SKIJYVuOduF)*=KiMp zQlzw2q&ZLUME7FWpms`FdUi=4|HCmlCB_BmEM{Pw5px7ow?V%xuL_u68%3`I3)eq_|`b_bx__{bxG>XaE)7tI-g%ygMJ;EibrU{qJ*`&86OGC8- zUCG2yB-D}&H76211L0U?n%S|3>sB|>*Xw5qA)FhGw&>7MX{a?Ci$%jA%D`x-2^GLa zdm~h9l3h2OhN|dKbN0PjSLNkTEIs`q55PbJj4TZjc`ct`%e!dnRayi%1&o@Wn z$XzgXCcHD6439#(gn727n{!^ixA)jP?lr6F^DW%Fo>cNF-wM2&{v#NU2#XyRy8R=AsE-x}D4E%f@(bB!+1i4%H{Xkg@2< zP-x50aMvhRt2H;jzdiQm`~{86sW*vPm_o5k@?vZB&>>96IF_u9$0H#S6Kf1Bpdhp% zJQ5%7OC$#^4$ZAyM*TdCe#TkF94%R)GZu*qf*Sd4qgYPO;e*2?s1LTl|0#!BVRn|@ zUVSKd<+3WGWjznIl4;oy?Itz~)rZ08An4G6L~^)~`#;T`&x;STfoiSC#Jimp*@30?$K z%`*9Ec?o?gB~dYdYAt}4L|;7Ak?4g8BTCFOL$j{MpX*i>Q;! z-KUrZ;-le_g*7K$d394E_4j<{y#mR5|IuLzEJS+13%oc6 z`$BDzQ7LrhnAT`MY(NG^<=d9be7t z78+wW%xrIX7%R3ZHX2v6kz?_HQwVk3a$e{2Qnh$Q5*Jb}UvgaINH11Kq#)Ee7=heY z@}=DDYQL@LfzvC?=F`~Z>X_G%h?ink;v0BCG6%TEW8d_s4h8+tl`vB-BnQW%D zfGXxtZ!j}L=(CA%)@;{Gl>;-h0n%#CZ7tXTT)E`U^`jgB3fzk**MAb-NxGRKB zgtvrTbIuFA)o#nBK3%|zbQUT=%+-UXF!k7JL;0PwKZPt7r7Z}{ofnH*8$*M!k+`)Z z+s*aeygXLUqHaKDK;q6+Bi)urb|sR%p$6>CP?p-mu`yN2WthvSaLuZjG?h}q&!90| zGr6rVF)#=w40Xm5*cgbgbF6)>WCjg_^#$j2Ygy59ZtHGJ90)6R37Vn68*Tfh&s#E` zK4*>;)0iV$!v~;rV;`@JM22D!-ahjDi>J{jSaB6o`8yK*VDgsG1~8%gY+-K2RQkCZ zp4KUngd4)cQP2(Q*ANjf9+fi-RYX#~WeWZBC`+{*S*2x!ci;R*Qgl8d4F(dJHeqJxO&Py9z*2pNzhtr+6sBfUb~99;VmD=8(rxD25N{Zj zljzr>_Cgg4;@3$J#Znp#HIR^67YDvlpA4cew0>>-$y2h-cT}Qi>wcoBXS6$9qdW}~R z1xmI@4Uo1(=yY@`+c7eXy*=JDZfrKQ{9fkowH~Uvl{XHzq$f6vKI|BfQMEmo=1?uR z!2#&@#5_tQ1k80g^I!klr!Q-DQ}qFmRybXfapX$f!MfOxJRWS1#`?f_MB%zfvbTT; zM_QSr^K9K*(y;#dhv!aP;Zh_6FF3Qj(3GI4)Q~3VAbZvS9xyo9n_HAjqE%(^5D~!fC@!FJ=+Yud{b*#=KOLyeJLfd z?Z3=oEy+u&vCx{oMjOpvH&awnq$S*a-Uv3u<_LC-P(DtNqgaZg*xVyHGi?|dPGU;c z=DN^qk#kyZ5M@^|)9PwYTf;=c=18<3T5Uv;FV{NMZPGn%xBEP9Sm}q*pz4z09!QW- z{)SjW$&_TYw|6MCtuG7_Uw~CL`H~pQNtY}_8NB!`l!1#Uqx2tXM(N93gwma3}BuXtO_-62A@cH1MgHH#46?`oCv*3?{-woauyeoKX z@W$X5gP#vx8T@4M;^0NW(cn;UAlMrW2hR$g5!@2o7_1Mj4Xy}Q1dD=;gY$#4f>VP2 zpfe}}?*-lp{4?-U;IDx{27VWKBJgP7r-2^^z7x1NaA)A=z*hoa2wWZbOyCoNOyGjR zfxvlz{y-$KJ8)*8Gtd@j3e*Nx2bKrQ0tJDEfw_Shfyn`H!0!Lh|Bn9+|3CaM`v2np zz5h4R|JeV1|F`|$@ZawLn*YoGYyF?~f6D)Hf69Npf5e~gNB!OYbNoB}Tm75- zjsEri8h@3)#J|+Pz(3nR%^&o;{krd6-|N1Yeb4!x@jdB##P@*je&0R5+k7|puJc{x zyUdsN9r7i8`+Qx#UA_)qi?7bN%2(+t^yT?-eK|glPxrp-eck)A_c`w~-Y30}cpvcI z@4d%+oA(Cqb>6GImwD6PL*Ar!pSR1q%iG~?@z!})c`Lnz-aK!vH^=Mo>YjH!uX|qh zJm-1F^Q7ky&jX(OJ@=udPTldY<8{Z&j^`ZDIG%Jo z;&{MuzvCXqZH^lp*Ez0oT;@nS4mpyrCUrS>IXWCIjylIGN2R0Ck>|*Df53jf{T^7IZm?fxzsi1@J#9Z^Pulm{yX?E{9rhM`oqd(P(q3rK zv*+4#>>j&rd)M~5?Pc3@wr6Zl+8(hzV7uRTkL@hw=>=f zxP|d1aWmuB#7&G}6<=e#QGAv025}?fSHumB$HZ3{zbuY1eo1_p@r&Y1jMs}VGJZi^ z&v>2q0^_yfI>w{oTE@?dqm0*x&of>vu3`L~xSH{^;&Y5wiO(`#DXwC?LR`uC8F2;U zr^RO&KP5iRc)9o#<0r-CjF*W|GJZl_#(1gt1mnlWrHq$|k278@E@3<(E@sS#BaCU0 zVN8iM<6)6vyht2oyii=kc!9W(@nhlw#`DF;7!Qf_8Art-#)D#%@qjqUxL+J#91;5& zhs6lvkQio6iXq1HM3Qk(oX40DgN$*JU>p!}#+Vpj>=!Y{eWIT+D)uqQ=wsX~ zdKn{PFJq60Fm{U`#xBv#7#3ZOdqkLVx7fpYuGr0ZjyRX`Y;g|bS>kNQUE(apGsP~( zo#IT!9bzZrcCmx;46&VYn>d59Q*2}G5S@%$MF(TM*vhy?v@>oNTNvBKX2w?0#<)qe zGPa0Kj2lG@W3$-E*d&@6H;5+2MzMjhK{PVfiw4FzQO{T_>KIK?%eY>cjO)aD#sxDjCZ~1!I{g zXDk(Ej3uI!u~?Ka7KviULQ%w6APO1tMFHbdk#s( z#~2a|80U)+<2*5+ajuxhI7iH7oGs=s=8D;jvqUcAOfidbhM37XUCdydCZ;n^71J1} zh^dS@VhZDAk;6DiOlAyT52<7w?3 z#<#W8jQ`T!W_(Ng7vr1STa0gLZ!*5Fy}|gJ_B!J!?KQ@KYNr@q)&9x&5A9XPzia~GoI95Vti3M$@qfyBIEPg3ygo$o@e~4_BY1ow7)X`MSG6%S?w>3 zf7YI5{FC-)#y@I*V*G>lN5+x7zO*f1~}D@z>gK z7=NYxn(;~PSBy_+PclBPJ;C@(?QzCmXuo89O#21n&$Y)GAJu-&_=xr>LpK>IP{kF*CEPiQ}4{GoP&@dw%u8NaXnfbo0U z_Zh#deUI^e?YoTM(e7tFu6>8`+uCu)Z)x9VyifZU<2SYY81L1-$#{=;FXK0~dl>K5 zzQK5xb~oeKwYwPa)V|Jmhju69?b;oTw`sRC-m2Zkc#C!`OnQ@p|oxj9<{MXS`1P0^_yXb&N-~ zYZ*VU9c8>m`#j^-+BJ-y)2?RxtoAv^tF+HDUa4Khc!hQ)<7c!h7(cCjhVfI{rx`ET zKE?P+?Q+J;v`;dALc5IdQtcCrAJ;BryhQsrl}Mu-y>i!i%W9;6f@tb^(>=e~ijQ=TkX)h{}VbR311;<^BUyj_jv$c!bKKVJeeD zRGycla_~GV6N6O76I2ewsf-O!*&m~FUq6-6eN^^EsqF2ea&Iq{k-b#*M5yfUp|Y!+ z%5WEzd%{%i-b3ZNyQw_qTq@5#hsv|grgGO=RGztu%AIFYxnn1l+jmfT#&#;Vok3;i zHYz(hsodH@W&2htx3p8ac?*?oo2hJVqjFO#l`Wg7+}J{8^F}J0nyK8-L}lX!DjOQ9 ztZ$&QuAa);Ix5XtD%YD-u3Jy#+I3W}Sxe>WHB_!zO=Zn0Dp%G}xnd=i)hno6UQOk) zingRQmi>dVN%Syi~e9RJz<$I$cycoK)H! zC~@%c636Qo>4))m5B*(0yYk~7&A4t4J|4^jx57jJsle9*7X}*rZ~Kq?FYvecb9{f8 zxc{HH|DU-3pSb^@xc?`c^2Gf=whV3J{(s{Bf8zds;{M;diJrLsr|Zj!`+xF_!Oiu= z{Xh8|Pu%}c-2b!R`TvLef4HN=F{5`#`eH0Gw?4VxnvUPq+{OQ+qB=Fjqr1rA6~+(kD&=_5k?11Ni?(oYFWf}o4AI7PtcMf(ibYb4Ldo&-7al9M1BOhyjSH07A& zv4KCusUX#o4uaaJxtA@GWMm*3?hDn8B>Sc7o;h27z9ki)K@G7_iS{Y!&e9&~?}xu! zG%^gQS$6Y@gEGSi6oKb$BG%nc&eHfK32wEVRA!oG(%+~m<)>ei?oHa|ioWoY4Tm}t zd*Nudc@!oB<=Qgca;U6H`Ka6E^ov>fr0j=se#`G1iNWbTTo9^DjKmU(k@Iyco}e)0 zMO}B9B-CZJy>5?o4=0kLrf4sGBZ)pU%}#Qpf^&2VJ`h>@e1hq-B^KTb5e!$qE%4^2 z&nKCAarWG+O1bH`Wi)|yDgE|Goqa6l9;&t2a_w1>a)AbJ3Z}qlJ}!N{n&D~%Iws+YIjMVUESJbhhZ7|4l;n3#?aVMsXAI5!cYAYr%0XYV z3!2a_=C2iNNOz~^@MsUkCnUP0@8B$dZOTs5!*1q6JAx|Me&BjF2!C>Nv>T>)AmwSE zh$3XB9Z?Deh%<-|9g-4cZtljEjhdD2uUbYWJM{B z+_Ml7fmM6acrI>_z*$?8LN}|=`p)GS<}a$ah(2D+9C#uB@&>rj5ARFtC0Bj&KJQVS zHPf7P<*Z*gcMld_NHzkwPA}jpaOfM3fHhwfMo}%4#tA}+XIr(Arr{&ttkR0-$6dW^|!u|vraRgxa=Nv@=JAV}^6yv+yT3rw#0Dj2LR$)B^Q;dzP* zZQ)qBAFiLn!}v>|oYl!@vGj?oIFBm8!5FhTs48rtZqXjuf>;uS9mpzE&4o8H-;@qg zl@+`K65OSR@cw8IJA#5z$zjRS(=8{;;xER0JM!^M+&u*_cHrymn|z9knBt&iK%Abp-O)J z>4usp`eQHo!V{M)&c+N@ z_EJTuZ|voY@=MGibd9VJK2=&^F4)ZbWBFdxag*S4J0mn7R(KRblZN2WpA|6EECEv- zp;n~S?%`J25i>}Gfnc>F7(h1}!BEjdUrSf_Zbdgs6`}7D1=MZLp{kPCO;tEHNpwj` z0k(~XHihHR38?pZxhuM8I>=$%EyDN)dmt~+ZR8S7EDp&EZ6l7I4+;-9BiTmYjOs8d zy0O49-aX8JDw>a&Dj6OKH6gSpzBd|)shxVuoqu?6{nVWDJrg1Nf*qKS7&PCL4C{Q+aR%`uLNu^$x1j=fauWr{)W-HwJPmX++N_j@ zhOngUDu!Mh?v^Ty?Dhh~QpQWR(QnE)l}@#rEAh8+EP!IN6$(|_i9RbY`wp66HAIlI zjiPjLDx^NoF`F)DWqM@?{d^NkwXK$Ph4Xn&Hc+pvy8)sYlOTIG-<&T6ZPiw)DY?6y zsnY@#qb@u+j5!W<_C+Ae5gE;a6LZaly!&a3+lizyJZ1}5LgWJ0A0ke|G?W?U z5wVO2eTFFekMOOsP4uY@dT8NKJEOfL6v&2nUOr36)5#~f_Z?$Cn2 z3|<@T4lWM79=Hql|IL9M_}3rzANIHU?Y>|7zUqtl3cas-kHL$5qj#F;Z=Tz6_HXdy zxSw)=1!w73OuWi z*xGFKjTen?z$am-e)jR8TTV1*;1mI+Ts^ z3Yncb9IITKI+K2%PYFVMN^N~T*dr`^0gkSTt|5fxP)migD^fdYC^7^^``y@5p*ETm z@qVzR6~bfbk`<{P)GetSYQMDvD8&(x7K2l5c5%%&&)&)kOmS*Ebqr@6XkprKm}Ko( zxY0p`bny|7`jfQ4MZ&q7O$N3GH#YO>+JL3b3VKuJ)pv2-zAyC%P!iIZQvFYgRtYRIf^HraoiuC8|Hh z)y8iq*-e9Lg{&Q8d8&TPs1dGn-Mq&i&Fh4!pLJXE|Sh3F|Iqu+Mx9l zBBytzzcRIfNG6qA?Wc;=*yds5!v+eQLA2KjCB<1zO1PR-Bek#zoQV1P3HOa>wKE#& zrQ{iwRu$S3QznN(GxQ5q){9dOiV#G;A9Gz8Wk`iNMRIe9YGI=RYcn=E10=HRYw)hks|9yQmw{98iI1oVXUOX$iZzRTM!hNWa5BY zWW`p5b8)Jc$U=PU7TSsIX55CTMUcJ?af__4y$j$=#$hm->MFxT{O|2&i$w*!82U0{U4Ie*=K1ZaH*1t5hj+$lF zN@(B5m(bVpI}$@MQ?|p*)vuBhg#5*+wd1J%J*Il+@V>|(c70d^x}|JdWSw{lQfugQ z2oN$Cf0sXJX$Iq`vfk!fxfPbBRujQF6xXTUPr}AJBs7CJ$p+T}qZxWlv?{TpNo!N9 zsP8)@$-aXo(02-VrjSrxLXiJWi5}>kFxzceigXYbrE;yNm!xXYO_{|-XvbO3Q5FzT zpgTd$$}BreE7zx1Qey}}C0ppX)%>)M5F23|#>o%j9Fe{KB?x<@&}B6zu)lRMA9ELDNe=ww5^zFR2_$WAe)`)(Y9ZYsM`X|DMeQ+GwGoPHhW8$?KGcV+1% zH%}Z>y0Cs*(fKZEk+U0S&4JOI?(+uAQe{*V`z~?n*SY(fD6E*Zlo0*Z68ma-m8D9l zi%KuMlbA;8SoNgr_k}tKqQfkMR+{VX;qc?iR0*{qEvwoc+(vC2XF3Yghd3BO?w$RJ zWhO#p?OoNWVq%#3S%{W(YPYL7X~gypgIWj&A8;Hksce9<6`ow0Dx%hK!XR4QmZe24 z3`QeKvTZP}ZP{S;ic}#DNOkX48qki>?tYkLXp0C@VvW8;gp)F?HBGshElCwnBT`G( zZjrN2`AC$SKF3nii&FXY`QDu zt4kc9B?lpn6k=WAMRlYqU$H*5n8=S6NGtxUSt^ox+%N4cR=?QzVNJRlmWE51Czq!d z(OBwf#XGedv%k<7jVH*AwGSt(aXECdDRlBv3#p#8-)T26X)U*xvXGZ-9URN0491k+`)MVI{4T>4y*@Ou87PA8+# z;*zXIXY=$_rRESZ)J@+P)G~vexDT2fq-7Jv51m4?)+BS@t9%_=m70wP)UAYe9dWg_ zXEluAz+v$$@3U3r=DR;}Y-z`~(o`;WOBzA7Yq?unFbHBs9JaH%&TMn8$s{&Yv#7#G zI?+3|qghkd;J82kEN?1G!y2z&nRSXNxqb|EqxLBI{~rtX1*;IT|5)Jjxc$%dKkvWU zzt3Op_xOJ8yVlq1Tju@H`x9gUJj+|;If>Zxq{s9G+z%qY{9K&=pKx8{is1C`aQ@8s z1?P~n-Z|aztm6(uY?nD4_TSn+W8ZBrwVkqk1JTrH+2$Ir8TT27jTU2${tx|r{W3kQ zmx&L>cf}{fPEm|-g-3Y?{%?xPG>ghIo>)qY1RiYT6lusk1i8w)iMir1|E86-s2~lA z=u%nF#A2$`h~$kpieh&>zzJODSt@Kn8WPY-KOq)z18n7K!@7`09^~9nIeOA8>!giN zEL5wgHim-&%ze$_uytNA7u?IHs)h@$ znJdKt=E??KmvQ1WWJSuCM^Cy+q4ZOAQJmTa<+7b(ZvW}z>z^HYyChALPo~Io3dlC; zwnQdV-0t8EA-~TxJEdAtmWGJ4au135W5NMvYr5Eq#gu}aJ@zk2L%^X1^RbvGITDu$ zU2tE4H3FM8FS$a0Ntz{^G!ToqOx;Ub8Kc*9ao zt(`8b+SKG$r6J4sfJ6PE97td#nW0K48pth%$zh`%@-s^LUzuisCRGiA97m`H(=ZfG z8bdpdHv{2_(t;;hNF%5-)}+V64UT4lnB7 z^=9V<+aA97RH8HurytAmE|B(!8;5WK#VJjU#r^P3U=nC0Y4Y~r^Au9rF zNt*qC_yp+^GWU_ivQnkkh9RGa(;6RpW-Up>yT>~A37=#_D|=ggIGU73_&M{-({Si< zyQOVWs5D2lGSw6W%+Q$mV4=C^&H4|{zVeBtH2iqnZn&mED-s?ak=2)MGOm2Njkb(X zZq=az93jKmGtDZqyOg)YiZq;jpqa4gOSqYJ8_~7l&>690w4cs#7Q4@~RJ*D)dHT>v zgP71|)q&Y33Lg%-${tJFI4P@f7N+6pW0~`XlX+2Ie0M}5`z0qXvP`-qY3bY}Intq+ zq9H<;jZADQL$kJ?#c4;D*e+owVq5f(24iXH$}dR6r-!#DT75S9j&IDih3TrE#mF+V z^Cdp7u1Ujp$4%M-)JS2Btu?-p>qzX|2d|r0^x*iTF_Q0EN8_?I+;un)Av{0*%jw3s86p2P}+ygGsrzVoE#y+9v;QT9<)So50oz1))LDT ztUh%S4F$U*X^0<4nbi)YzP?T4vvyU>Ux*Ap2b9eK-gg^LIX-p#yQ@i@yDw(7elxY7`gsQPtM-<)ZS=w|fY^wgAm#jG)zaP(?o%hHfh=U$zZ#Iluw`!k<9tg3;dVI0It0Xl{O-hAEdxMFI9JRPuz#X}C&>`7B&oYBo zr-l?Mv9oEf^Y@rF5>)Jj2MR_pjgk0Zn1+d)l{r${uS_MWBDpW1;%h9eIwH!FWNkO~ z37n27|0`9^rg^SRokv7f_dcf-S;h`~ZOD7tr&ec<&ovQ&bqD8_n~yZDi-JJKVlXA8{y%URg3OvT3y>K|NV%)D>SI}}7@9*(hM zJjD{oRjC0rDB_gAD|0>0l>0Ezq^P2TwPoT&y~<>nvoIB-2Bn9I_6j$MmByjJNL|Wo zU!1!l)lXl^gxcE679YV50c{ONp)R|(FG+fF`zO3o8 zDAki4r_lb&<77w87Tlu2?-Xk~>k^vdU!Llwua`?hz;jaAktL3d?4ef5sm+%W<}$g= zERk24>Y}+&)cgy#V$C3%^hqmIE`C{_T%HP3W6GxgEH}m%JUBomL!JBSz=afxlmu0- z?L4UvmZbI&MNyCB>z_$lj;(^W@Ih%;YKG$&Ra*j~vzyvcLg!E1j=V3yIf_nG@|>DI zMbY`cNyFQG4+gIZwge{!p5y!fjRBYc*Zv;=8o%&8==+p!t8c#dHSaf(#cr#2w&y|5 zQBTaX-2ICCKKEhwCih&N{*StPU6sxcoDU<@TdQ-X;}4G89m9@VhsXYV`}Oug`v&`T z+b?aOxAogs>6fuDD zk%HVtN0Jff;L?>GiZN~RYFA%qo%LJNBp2NM^1vM9s`BWA`kZT#?WvuK!9F?x49k-= znfj3WR^4B$F*_dT&aFtZxRAGrLV6Xp!6Q04d1owbtywrIop!9`DvCL(sU=_We66aWs4pTMF;3p3{Z)fG^7MJ0&H^782c1) zkkVY4?pTE-zoKLpy!_?rDX~O!W!e%F)U94->&{3Qy!em+KY`OIe6?U*=F|FI%Op~q zW+8zy9?a8XFLw@WL7MQbEdKdf`}49i$p?Wb4LZC<)UuX#3eXGbHIY>n`;_b&5+2J8 z;ALq@gRIq|Co2u80y6U=tF)ROu(hmFl9rNy8ba0-wFO{$N&e$%1#STFZ;LCR%q9NP zG-QF>jYQm}0C!0ZwGnrV5lA~Sk6U(e*|X^@mZc#CEJr>O=7B?f!5M`7Ryn~gdH>)} zf@Wy!COOSw0GkXEV2`9%_)sj$N@-N(c~;qdE7Mr}EVgMzcJs${<;vdY;}XSF3$v^= z@kMDC05l`u0qJ764QekI1YH@0`4kfg$T~ zGE~ya&bTaSiWZio&!NsKd)3+8x$%6z#p3%JX5J99XF>XGs=+=KPH~nR4%urPq65pO9wAWpGiN%e2SDgV;Tgm@jyjl3%2}7Zpim9 zP4A@d<+ZWcVX>P!7mwYB&-53hcMuWSYJ~(ma+SfNLgJ@+gfHzkBo5MyF7mHQZ>Mi} z%gH%|zqQo4u}xq{xCd81y=0Q+1 z+Q{bkm!-F140Ptg2~c#Z6CEoyWA=xS_)*RzKg#knJKaDI;$B~LWUq0RH$6WD@R7TH zJ$G4}+-}tUw%AHcXDM1_M<0eMAD&s3S6+#gox3!>m53}a3xsqp;)p%ms2bD+ylPi*q7ndQPY##vI*TVev${7-)Qy%A9W^8s;fwhU8wduZ6{?>f! z!m=p6fqn~GC`m_p4TzKt?C6jmq$JW-YF&^n@>ixCX$GWTC>oS}BZDl=4&>d25V`$o zLs)Che1nBzWx9dJDR0|Ey&NYv6B4Egc2YK0Sbpk@ER$MQx}I8sYEIUkI&MkL8;=q1 zAz4?3Q^&3ho6>bOn)8S<$i5{6h;TAW~bf?*^G>G}S+4F_(i5uf(OVVqo zF9(70kN6%3=pCYAQh>f1tA&a zAp18ncU5{7)l_n=W=xC1`5RFVq#@8>XgAJoZMf@}_Wz=EjUp`VtSfm}z_E_*-icA= zGfhR-p|~u)lD<~E{0g3ijlKA~n`BiF;*!**Nj6TUCcT1cz|cZmRxO8>m1t7I9*ynA zfu{fwgnbkwqX?gyTb-^ZinABLQ!G~ko7Za{AKg1}ZqE)WN7v24y(}$Ork7JiX)hGZ zva3kR_eggi1Qd^NG<)y1?GX-`UYTAtu4y=Ke6(7`uG8v$RWA{ z>ZAoS3h51t=e`8pFykl-&wVngVNf_k$CV~O**vR;jlmV^3K|lNEvG2|4{B_H`U~Ed zV<|MxI{xv0e`n#1>(cNS0tFHB2WBs`^sVNR9tW@pqoJ z=jmqGYuspMn%#z!^ebgfX~v@&@qf?60#nc8Q32i+^Tm?sMew2W> z9$Jnw$89`C^f{db@Oh!NQ;}tR%q+GEbXQvz;#-&nwTDOD$*_gEbHV2c8`(AF=_QDx@3!`%3a zbUw&JyCu!uQaR)DSk($*l37m8ooomzM@<`@|C_a=WTE8Gs(#p@Du09o!g!Hj`tl;IKGU$?ThgS;EncS`x?97_GjBCZQE>l#e zBe?y4Pdq9sMBI z$pHcVU_}N?KC9y1MdPxTQXQ`R@C;uR4>qxBwbI-q)s?CYuX5?jBBXQR=4d~x5mD@N z6dQq60x7{(g2|SFx+%lUoHP#z$~z@#tdmS_Ho`n#DrL1WHPDSeMPMDkCXv8{NlIGf zwq~&Y-Slt?Nm6ng#7>VZ4H^GD_ErX#Dz;||gT@7qjHv5I6ry5|1=cyQHbb((eU3bi z-!7+C+HjBx0X$L%lQAwB@wQ9}Hsif}<-Iyh`5f!+Wp#!H#uoV-@Gb-$Az%7K`CLMD z4s=D~I1JGZbwPzUge(bIkb%_5>O{A4Z7DT2&;wPnB_&}hG9(q`6KX=-qNF7cHTy^i z1z;coLvhxW-1Qkq2Dy$v`kOyW`t4Ggl^f3vJWeK85gj|MN5kgimSvVw50wgV6ZcTH zGDs>AJvhnzthNkX%Q8!-1};iy?S74GsJk=krbpeE(eQGt%d)MR#Z>KpT=HKo+UzeFj9X?a;iR5gEnNi1Kni8nOSf%9p-I2fxPGI%6NJMGISx&Fa zu)mH{5TpyD6vP~t3+n~jzL}MZt+=GJ414UbmDMG_z@$=eS z44ih@LxE(?b#hJ`!qFiz`m}*k5dCs^3wGsa;IdgJLD1EQiNxlv*YaFSd?Ku z9mPn}@sJ;93w8F4cB|7%p>=vG&9H+G9d|)}_!u&0Y{YK$k(&!6dvmcW!(KV^a!6bw zdjerYOis>?$S*=CNV-LVaFllha449?s@IClbed~6!8pa$Srd#U%`qvM8MWmQk;ZK| z(})1dk?3>WEE#$6elSX$&80bW2c$7AGOAl;={t)uQ>iW}LWGvChMj$3JYWmcTob;e zuk)r=W~R_*N*TRMk%HFlzHn$uGBU(R2stBDE%V=s47_wWRENa;mE5n7rmq>7sfOB_ zV+A@@WhPTioTsVg72}!<)zUKgNScFbR+@wS%p|I%Z0w)m_IM>i!H^H0TN1#CIp!1^w8BW=mJY1G*7NibfD z&mk|G_fg0!-U5_XALcOj)XMr~!zTf(&AY8^A6mJ3?yNlH!Y`8F5lyQ~y#pqaH@f4) z6K7cAiPae=^%*8)()%y5=9D(|C^Cy6jZik!nmH(&Frh5tpx&zu?_#bQ~N#$56TguWGQ6)vx z3wa#d!^k*-CrT5zZ@^`8KdYKq3($r%TyWI8Xh_P>JXD+273Gtn(wGmm5eJ-Yh&dw* zY4({>Io5^Ciqh>?vE

L|wss|!=jNj`3+G7UEy=|+Tc93Y;=rbbsE{IoI@ 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 literal 0 HcmV?d00001