From 9f5d3f04ac2814ad46e9c241043ca356214c1721 Mon Sep 17 00:00:00 2001 From: Jen Looper Date: Fri, 7 May 2021 16:31:21 -0400 Subject: [PATCH] ufo corrections --- API/1-API/solution/notebook.ipynb | 313 +++++++++--------------------- API/1-API/solution/ufo-model.pkl | Bin 18320 -> 988 bytes 2 files changed, 87 insertions(+), 226 deletions(-) diff --git a/API/1-API/solution/notebook.ipynb b/API/1-API/solution/notebook.ipynb index ec388331..7e68127b 100644 --- a/API/1-API/solution/notebook.ipynb +++ b/API/1-API/solution/notebook.ipynb @@ -38,9 +38,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, - "outputs": [], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " datetime city state country shape \\\n", + "0 10/10/1949 20:30 san marcos tx us cylinder \n", + "1 10/10/1949 21:00 lackland afb tx NaN light \n", + "2 10/10/1955 17:00 chester (uk/england) NaN gb circle \n", + "3 10/10/1956 21:00 edna tx us circle \n", + "4 10/10/1960 20:00 kaneohe hi us light \n", + "\n", + " duration (seconds) duration (hours/min) \\\n", + "0 2700.0 45 minutes \n", + "1 7200.0 1-2 hrs \n", + "2 20.0 20 seconds \n", + "3 20.0 1/2 hour \n", + "4 900.0 15 minutes \n", + "\n", + " comments date posted latitude \\\n", + "0 This event took place in early fall around 194... 4/27/2004 29.883056 \n", + "1 1949 Lackland AFB, TX. Lights racing acros... 12/16/2005 29.384210 \n", + "2 Green/Orange circular disc over Chester, En... 1/21/2008 53.200000 \n", + "3 My older brother and twin sister were leaving ... 1/17/2004 28.978333 \n", + "4 AS a Marine 1st Lt. flying an FJ4B fighter/att... 1/22/2004 21.418056 \n", + "\n", + " longitude \n", + "0 -97.941111 \n", + "1 -98.581082 \n", + "2 -2.916667 \n", + "3 -96.645833 \n", + "4 -157.803611 " + ], + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
datetimecitystatecountryshapeduration (seconds)duration (hours/min)commentsdate postedlatitudelongitude
010/10/1949 20:30san marcostxuscylinder2700.045 minutesThis event took place in early fall around 194...4/27/200429.883056-97.941111
110/10/1949 21:00lackland afbtxNaNlight7200.01-2 hrs1949 Lackland AFB&#44 TX. Lights racing acros...12/16/200529.384210-98.581082
210/10/1955 17:00chester (uk/england)NaNgbcircle20.020 secondsGreen/Orange circular disc over Chester&#44 En...1/21/200853.200000-2.916667
310/10/1956 21:00ednatxuscircle20.01/2 hourMy older brother and twin sister were leaving ...1/17/200428.978333-96.645833
410/10/1960 20:00kaneohehiuslight900.015 minutesAS a Marine 1st Lt. flying an FJ4B fighter/att...1/22/200421.418056-157.803611
\n
" + }, + "metadata": {}, + "execution_count": 77 + } + ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", @@ -52,14 +90,14 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 78, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "\nInt64Index: 70662 entries, 0 to 80331\nData columns (total 4 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 Seconds 70662 non-null float64\n 1 Country 70662 non-null int64 \n 2 Latitude 70662 non-null float64\n 3 Longitude 70662 non-null float64\ndtypes: float64(3), int64(1)\nmemory usage: 2.7 MB\n" + "\nInt64Index: 25863 entries, 2 to 80330\nData columns (total 4 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 Seconds 25863 non-null float64\n 1 Country 25863 non-null int64 \n 2 Latitude 25863 non-null float64\n 3 Longitude 25863 non-null float64\ndtypes: float64(3), int64(1)\nmemory usage: 1010.3 KB\n" ] } ], @@ -83,33 +121,52 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 79, "metadata": {}, - "outputs": [], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " Seconds Country Latitude Longitude\n", + "2 20.0 3 53.200000 -2.916667\n", + "3 20.0 4 28.978333 -96.645833\n", + "14 30.0 4 35.823889 -80.253611\n", + "23 60.0 4 45.582778 -122.352222\n", + "24 3.0 3 51.783333 -0.783333" + ], + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
SecondsCountryLatitudeLongitude
220.0353.200000-2.916667
320.0428.978333-96.645833
1430.0435.823889-80.253611
2360.0445.582778-122.352222
243.0351.783333-0.783333
\n
" + }, + "metadata": {}, + "execution_count": 79 + } + ], "source": [ "from sklearn.preprocessing import LabelEncoder\n", "\n", - "new_columns = ['Seconds','Latitude','Longitude','Country']\n", + "new_columns = ['Seconds','Country','Latitude','Longitude']\n", "\n", "new_ufos = ufos.drop([c for c in ufos.columns if c not in new_columns], axis=1)\n", "\n", "new_ufos.dropna(inplace=True)\n", "\n", - "new_ufos = new_ufos.apply(LabelEncoder().fit_transform)" + "new_ufos['Country'] = LabelEncoder().fit_transform(new_ufos['Country'])\n", + "\n", + "new_ufos.head()" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 88, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", - "Selected_features = ['Latitude','Longitude','Country']\n", + "Selected_features = ['Seconds','Latitude','Longitude']\n", "\n", "X = new_ufos[Selected_features]\n", - "y = new_ufos['Seconds']\n", + "y = new_ufos['Country']\n", "\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)" @@ -117,227 +174,31 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 89, "metadata": {}, "outputs": [ { "output_type": "stream", - "name": "stderr", + "name": "stdout", "text": [ - "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n", - " FutureWarning)\n", - "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n", - " \"this warning.\", FutureWarning)\n", " precision recall f1-score support\n", "\n", - " 4 0.00 0.00 0.00 1\n", - " 10 0.00 0.00 0.00 11\n", - " 12 0.00 0.00 0.00 1\n", - " 13 0.00 0.00 0.00 1\n", - " 15 0.00 0.00 0.00 131\n", - " 17 0.00 0.00 0.00 1\n", - " 18 0.00 0.00 0.00 19\n", - " 21 0.00 0.00 0.00 410\n", - " 22 0.00 0.00 0.00 3\n", - " 23 0.00 0.00 0.00 284\n", - " 25 0.00 0.00 0.00 1\n", - " 26 0.00 0.00 0.00 1\n", - " 27 0.00 0.00 0.00 146\n", - " 29 0.00 0.00 0.00 555\n", - " 31 0.00 0.00 0.00 84\n", - " 33 0.00 0.00 0.00 86\n", - " 34 0.00 0.00 0.00 85\n", - " 35 0.00 0.00 0.00 8\n", - " 36 0.00 0.00 0.00 569\n", - " 37 0.00 0.00 0.00 3\n", - " 38 0.00 0.00 0.00 39\n", - " 39 0.00 0.00 0.00 5\n", - " 40 0.00 0.00 0.00 4\n", - " 41 0.00 0.00 0.00 352\n", - " 42 0.00 0.00 0.00 1\n", - " 43 0.00 0.00 0.00 4\n", - " 44 0.00 0.00 0.00 2\n", - " 45 0.00 0.00 0.00 1\n", - " 46 0.00 0.00 0.00 360\n", - " 49 0.00 0.00 0.00 2\n", - " 50 0.00 0.00 0.00 2\n", - " 52 0.00 0.00 0.00 60\n", - " 53 0.00 0.00 0.00 1\n", - " 55 0.00 0.00 0.00 1\n", - " 56 0.00 0.00 0.00 1\n", - " 57 0.00 0.00 0.00 634\n", - " 60 0.00 0.00 0.00 1\n", - " 61 0.00 0.00 0.00 2\n", - " 62 0.00 0.00 0.00 20\n", - " 65 0.00 0.00 0.00 3\n", - " 67 0.00 0.00 0.00 83\n", - " 71 0.00 0.00 0.00 171\n", - " 75 0.00 0.00 0.00 19\n", - " 79 0.00 0.00 0.00 5\n", - " 83 0.00 0.00 0.00 1005\n", - " 86 0.00 0.00 0.00 1\n", - " 88 0.00 0.00 0.00 1\n", - " 94 0.00 0.00 0.00 1\n", - " 95 0.00 0.00 0.00 1\n", - " 97 0.00 0.00 0.00 7\n", - " 99 0.00 0.00 0.00 2\n", - " 102 0.00 0.00 0.00 2\n", - " 104 0.00 0.00 0.00 1\n", - " 105 0.00 0.00 0.00 5\n", - " 107 0.00 0.00 0.00 1\n", - " 109 0.00 0.00 0.00 1\n", - " 110 0.00 0.00 0.00 137\n", - " 111 0.00 0.00 0.00 1\n", - " 113 0.00 0.00 0.00 1\n", - " 114 0.00 0.00 0.00 1\n", - " 117 0.00 0.00 0.00 4\n", - " 122 0.00 0.00 0.00 1270\n", - " 123 0.00 0.00 0.00 1\n", - " 124 0.00 0.00 0.00 1\n", - " 129 0.00 0.00 0.00 1\n", - " 130 0.00 0.00 0.00 1\n", - " 133 0.00 0.00 0.00 9\n", - " 135 0.00 0.00 0.00 1\n", - " 137 0.00 0.00 0.00 2\n", - " 140 0.00 0.00 0.00 862\n", - " 145 0.00 0.00 0.00 2\n", - " 150 0.00 0.00 0.00 2\n", - " 154 0.00 0.00 0.00 375\n", - " 155 0.00 0.00 0.00 1\n", - " 161 0.00 0.00 0.00 1\n", - " 163 0.00 0.00 0.00 1\n", - " 168 0.11 1.00 0.19 1523\n", - " 169 0.00 0.00 0.00 1\n", - " 172 0.00 0.00 0.00 1\n", - " 174 0.00 0.00 0.00 1\n", - " 178 0.00 0.00 0.00 2\n", - " 180 0.00 0.00 0.00 108\n", - " 181 0.00 0.00 0.00 1\n", - " 184 0.00 0.00 0.00 1\n", - " 188 0.00 0.00 0.00 149\n", - " 193 0.00 0.00 0.00 1\n", - " 196 0.00 0.00 0.00 136\n", - " 197 0.00 0.00 0.00 1\n", - " 200 0.00 0.00 0.00 16\n", - " 202 0.00 0.00 0.00 1\n", - " 207 0.00 0.00 0.00 1130\n", - " 215 0.00 0.00 0.00 1\n", - " 220 0.00 0.00 0.00 5\n", - " 223 0.00 0.00 0.00 1\n", - " 226 0.00 0.00 0.00 44\n", - " 228 0.00 0.00 0.00 1\n", - " 233 0.00 0.00 0.00 10\n", - " 237 0.00 0.00 0.00 5\n", - " 239 0.00 0.00 0.00 736\n", - " 241 0.00 0.00 0.00 4\n", - " 245 0.00 0.00 0.00 1\n", - " 248 0.00 0.00 0.00 1\n", - " 251 0.00 0.00 0.00 8\n", - " 258 0.00 0.00 0.00 11\n", - " 265 0.00 0.00 0.00 1\n", - " 267 0.00 0.00 0.00 5\n", - " 268 0.00 0.00 0.00 1\n", - " 273 0.00 0.00 0.00 1\n", - " 275 0.00 0.00 0.00 542\n", - " 277 0.00 0.00 0.00 1\n", - " 279 0.00 0.00 0.00 1\n", - " 281 0.00 0.00 0.00 1\n", - " 284 0.00 0.00 0.00 1\n", - " 287 0.00 0.00 0.00 1\n", - " 288 0.00 0.00 0.00 4\n", - " 290 0.00 0.00 0.00 1\n", - " 293 0.00 0.00 0.00 1\n", - " 298 0.00 0.00 0.00 1\n", - " 300 0.00 0.00 0.00 1\n", - " 301 0.00 0.00 0.00 1\n", - " 302 0.00 0.00 0.00 2\n", - " 305 0.00 0.00 0.00 3\n", - " 306 0.00 0.00 0.00 3\n", - " 308 0.00 0.00 0.00 1\n", - " 309 0.00 0.00 0.00 1\n", - " 313 0.00 0.00 0.00 2\n", - " 314 0.00 0.00 0.00 1\n", - " 316 0.00 0.00 0.00 1\n", - " 317 0.00 0.00 0.00 8\n", - " 324 0.00 0.00 0.00 1\n", - " 330 0.00 0.00 0.00 2\n", - " 331 0.00 0.00 0.00 85\n", - " 332 0.00 0.00 0.00 2\n", - " 333 0.00 0.00 0.00 3\n", - " 334 0.00 0.00 0.00 2\n", - " 336 0.00 0.00 0.00 1\n", - " 337 0.00 0.00 0.00 1\n", - " 338 0.00 0.00 0.00 468\n", - " 339 0.00 0.00 0.00 1\n", - " 343 0.00 0.00 0.00 2\n", - " 345 0.00 0.00 0.00 1\n", - " 346 0.00 0.00 0.00 2\n", - " 347 0.00 0.00 0.00 42\n", - " 348 0.00 0.00 0.00 1\n", - " 350 0.00 0.00 0.00 2\n", - " 353 0.00 0.00 0.00 62\n", - " 355 0.00 0.00 0.00 1\n", - " 359 0.00 0.00 0.00 165\n", - " 364 0.00 0.00 0.00 14\n", - " 365 0.00 0.00 0.00 1\n", - " 366 0.00 0.00 0.00 1\n", - " 368 0.00 0.00 0.00 1\n", - " 372 0.00 0.00 0.00 1\n", - " 373 0.00 0.00 0.00 1\n", - " 375 0.00 0.00 0.00 366\n", - " 377 0.00 0.00 0.00 1\n", - " 381 0.00 0.00 0.00 3\n", - " 383 0.00 0.00 0.00 3\n", - " 384 0.00 0.00 0.00 1\n", - " 387 0.00 0.00 0.00 12\n", - " 390 0.00 0.00 0.00 5\n", - " 392 0.00 0.00 0.00 1\n", - " 394 0.00 0.00 0.00 48\n", - " 395 0.00 0.00 0.00 1\n", - " 397 0.00 0.00 0.00 2\n", - " 398 0.00 0.00 0.00 5\n", - " 400 0.00 0.00 0.00 1\n", - " 404 0.00 0.00 0.00 202\n", - " 405 0.00 0.00 0.00 1\n", - " 409 0.00 0.00 0.00 1\n", - " 410 0.00 0.00 0.00 1\n", - " 416 0.00 0.00 0.00 10\n", - " 417 0.00 0.00 0.00 1\n", - " 418 0.00 0.00 0.00 1\n", - " 419 0.00 0.00 0.00 1\n", - " 420 0.00 0.00 0.00 92\n", - " 423 0.00 0.00 0.00 2\n", - " 424 0.00 0.00 0.00 44\n", - " 427 0.00 0.00 0.00 4\n", - " 428 0.00 0.00 0.00 28\n", - " 431 0.00 0.00 0.00 11\n", - " 433 0.00 0.00 0.00 3\n", - " 434 0.00 0.00 0.00 6\n", - " 436 0.00 0.00 0.00 1\n", - " 438 0.00 0.00 0.00 14\n", - " 441 0.00 0.00 0.00 3\n", - " 443 0.00 0.00 0.00 1\n", - " 444 0.00 0.00 0.00 2\n", - " 450 0.00 0.00 0.00 5\n", - " 451 0.00 0.00 0.00 4\n", - " 453 0.00 0.00 0.00 1\n", - " 456 0.00 0.00 0.00 6\n", - " 459 0.00 0.00 0.00 4\n", - " 460 0.00 0.00 0.00 2\n", - " 462 0.00 0.00 0.00 2\n", - " 463 0.00 0.00 0.00 2\n", - " 465 0.00 0.00 0.00 1\n", - " 466 0.00 0.00 0.00 1\n", - " 469 0.00 0.00 0.00 1\n", - " 470 0.00 0.00 0.00 1\n", - " 474 0.00 0.00 0.00 1\n", + " 0 1.00 1.00 1.00 41\n", + " 1 1.00 0.02 0.05 250\n", + " 2 0.00 0.00 0.00 8\n", + " 3 0.94 1.00 0.97 131\n", + " 4 0.95 1.00 0.97 4743\n", "\n", - " accuracy 0.11 14133\n", - " macro avg 0.00 0.00 0.00 14133\n", - "weighted avg 0.01 0.11 0.02 14133\n", + " accuracy 0.95 5173\n", + " macro avg 0.78 0.60 0.60 5173\n", + "weighted avg 0.95 0.95 0.93 5173\n", "\n", - "Predicted labels: [168 168 168 ... 168 168 168]\n", - "Accuracy: 0.10776197551829053\n", + "Predicted labels: [4 4 4 ... 3 4 4]\n", + "Accuracy: 0.9512855209742895\n", + "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n", + " FutureWarning)\n", + "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n", + " \"this warning.\", FutureWarning)\n", "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/metrics/classification.py:1437: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.\n", " 'precision', 'predicted', average, warn_for)\n" ] @@ -358,14 +219,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 97, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "[59]\n" + "[3]\n" ] } ], @@ -377,7 +238,7 @@ "pickle.dump(model, open(model_filename,'wb'))\n", "\n", "model = pickle.load(open('ufo-model.pkl','rb'))\n", - "print(model.predict([[1,2,3]]))\n" + "print(model.predict([[2,44,-12]]))\n" ] }, { diff --git a/API/1-API/solution/ufo-model.pkl b/API/1-API/solution/ufo-model.pkl index 8e18367b2561822b4ea46952616a88cf35582dc7..523962f2d5d53f1cf3c6b000d00a487cb7013557 100644 GIT binary patch delta 226 zcmV<803H93j{)2Vu(AOHO9hj)0YU;pD3kmFD3h!YCIU+ZlhqF~e?xd|lE-1caIU{q z4qJEz4_&|F9^hPaJCwh*y1h0mc5lD`S>YSaQD&7@Ky$D5*cA$(Uk>i1dQarb|}D%{pbffPaVL} cA;LSbry{^u>bj^?n-V~i1V>u|7n5K|Fz+R1djJ3c literal 18320 zcmZwPcOaE-{5NniD%q=SGAeuTEh{6dP$DxV9JA7(L4%~CL`q9bDca*L6k3X`H0+)1 zU4A#;>-Ri=JkR}y*Ez>I=U&(6bA7JsoO8!B_(pCI@%N4hRSXFVrS#en=I0-x7!tNE zC^9O@m&KOcaPr?4;U5_p6c)-tqg#_equ)zgwAyVk9UWb`f2emz)Giu>+al^-h$@ZI zjgh+H7wsKFV>;@_K;4cC3!yPv8VPE)_6eIQxY1J&nb8(o8Vyo6sKt$q`V$ZoR{`dhq`|;1%iXO>N*d+EN>OH&*IDz9HU`kzTR>LE8eOXe{;%k41Qg z`i1TAij4A(@~17ccVniW7a0~3;~zm|UD&2rYCmagZcC`gcX;pg3Zm9VW4G~hTQ>hd zbVyW?*TUPcS;@NWK*UNm0c(C8iEyA*xHBK#E>*5n-#;k}E+E5hG5EHpAIBHA~K zg~s>avsgm?{`)VD--hlmZMhk}4{b#fO~8pJxY~x^?h*ZAnh<%WU(~K}e-@hX!l4h+ zrimOql0*}AqKU1xVOTiK`ZRHSd;4{B)Uxo$hAxUG;d9iqVE&MkW&U)`FY~8wewjaG z^UM5MoL`v!gKqwC&M)&PeSVogjPuLV|Dc;cLi5Y~(VSn{|AUT$$Vr?(vGWV}f6(y| zd5L^Pe&TZC3Zei}h$u`HA&L^kh~h*E;!2_@2cjdhlz>A zBgCV`W5nacWMT^O1TmF(l6Z=Ens|noPRt;lC7vT@63-K}i5G}D#EZmB#9ZQK;#J}` z;&oyk@doi0@iy@eF`sysc#l{>yiY7777-s29}}MvpAnxEUl3msUlBnpCcY+?5KD<= z#5csZ#ByQ>>6N`-uI--^2mpAL1Z!h&W6fA&wHqi4(+0;uLY3I76Hz{w4k+ z&JpS8|GPm?Tts9bG7_1H%*4gSB}5kDG9oLHjmS>qAaWA9h}=XTA}^7T$WL5B6eJ1} zMTnwAaiRoKk|;%#Cdv?35myt}5M_ySLOW1A?gtg zh=xQXqA}5gXi79AniDOEmP9L}HE|u$hGJ-);zpt?aiPGYnwUGe zzlpe+=t0~<^dx!_w-UXHK15%lAJLx}K-@+QBnA*Jk+w35Ch6nGM1{O>n16s5O)8Kt zaAAlj9Y~E2Wt?cM{u>|KFeK7e2mUuG4A7>nnI9C&I??2)L1EzkI~#L`)tws3U%zzpKjw1vG|#xn`5341tZTqT6n`z`2uY*MXH{ zXuY5}_N7D>i>#MsbniFCkuP;70fKVK!M9IZdlF%BN=f4NAsu8~m9DG0%#Z7J2Ae7a zMX@XP)J`wD<;cof+IMA81!rFGpHmFfz@`)C*_YP|L*TV}+2v*p@H1^qW7p?_hJ&1q z55G35FQ+LV*(ikK)b~3ACG^m8FJE4xSps>^8cq5=5^zb@-#+Zjhjl&*IvO=RNZ3p> zU!<*q>=GZdMYG~im-=+yqEQQ@Eqe}TE?bT}n@3*1i{pp*gzq(ZJ~6y{(H(f-Q3EmC zc~zH8OJO8Hl6my7DtxyHd9ILLfx_E10bARZ5gRDaYs2gq)6)){K^E+&-UvhJ@seeOY7B$D-(aa>e_1byjK5pMMfTcoGnc9 zcXbfGuCo6}h7#l+FI)BOnjuEYtq*D?h#@elFfi1>0Ssnq=$&2VQBwQ$VMU=fBn+&+ z*zFKOYfM0>dAL2=+fB@@wKOrE)n`;;y9kz9FX$D3abW+_UwPP0W-Pj z9XCca(csqN&l4(x3wc?Vhg}`uaDAop);V>Emfh%2zp0DAy}~=LTC>AIm;H8X)q3P~ zZQ&l1u|t*+Y=i_=Fz%flx1Yn#u*&8jf{E$4Z}S|6e_jK8kFRKSX$QqA%@H89v7{4;db7^gSf7b(in z0!PBzpY?ZC@Xguq!ut18So5M`$iGt+X@BqPYYb|FcPXFs%}spJiDW#@k)i{038Uhh zzofvPrz>hcqlf3lUW*#HiDBKPyx@JpD)27hVYai>ghc&Q;h$ncpf9}l>Bw7kNcJtB z%1G6Mp_kUE$TbzbU6k2&^RF3nXDhbr>L|k{%w7H6hTRah!?eUX8^~toMv7fr0*`&J z`TP?aIQStx%e_JmPVSD#u@AxS+%$gGPBmoT4=-@~y9T%JmAck7ZNTK8gybXgT8Lz> zMxdWMTHhM(koaJVH*bZmISWwjVDjGY^ifTmWL)&ue~}t~hn6JF@7L0sN3R5N8=_iE zZp~n$Iet{DOCD@lgoc;*vg>)xP^$aTM&+tDzS}PDs(b8*kJ*x~9x*g{RaXyG$?Kq^ zreQh)Ymr&k;*h;X4cZCpG}GMmnCW*l&^)3HTlt&4X}UW2W6o6L@Wd38f;>J4#?`Qq z<)d4P&2ljM8-{+T(|{v=(rO`9E&Rw4kY6dNh26|O#;O8(F!(m+aqp@LmR2eZ9Ojn8 zWz)l=oL@AtQ-5u&jl4OoMDsdn>FB^Y?G=-?rV|Wa6)nU|yG#1c?fER2?C`CFhd$0| zbL|XBHo*=b_Tz&uHDHs!{)H^HUB64)Lv%9KaL@An!t1UCCgmBZYGccjxZLDOUGRC? z@U*sAW7C~ER?kU(@ZLIl>e7~t@K|I2sU=e%?-(B$ou=B;$s)Cy=vp1zzC!Ci>8cBV z--lcRY9jCr|CE`|Z-}C7&79fqCJ3+`)J?FogRJL}v?Hr0&PN|*8d5gIuS0_O4YJko zFiV6bZM7!!{0!c(ii?2TlQH`in-+S{-dV!-!WW+_PW%d0pISTS`Yj0{Fb@) z-3TSV=FBHp^zb+-@Y29bHK>%_7op3rf=2FF#>YQZusZsE=9s4o3@hJ!Yfdmg;&l~) zY<(SkFl$k%WYmoz^7x|TfTCJgY~@BLY}Vs zsdD7gAp=AQ9xzPg*2Nw5u=x2n;nvpNX#Ut6;r3nQ3OW4HOOrl&i#m>0$L`usoYRKW zxq1(4Q8UPt9N!iBLj#KH%*WfxoX{Y3EMYa5GNks^%)K&R4)I;GfAkx@;kfZD{h0Sg zRJsKz6fryFqt4w`4IL_YyzKF)w1Np5s(5wJ9&*CEGhLx1f^@o{ZHHBl4{>OrMXj(=IB38zf>Cxo7Qnoy)?z@e=e6RVn{hqYzPgt z)m;5)(7P*rht(k%8c|V8)l0Q9*<$armBDTHnvL&<1Xg6NuEqsT zG)Wj&a3si~L+{(+q3@EQZ=P!#m~W51b0L-)+IZMg_KGKY1rCH>iAo$dfy>OgzWYh0 zP+atI`;CWM*#5v#Eb^Ngq>qMlEI;XuI?JuOlyTDH!@p8i;MsM%d70 zUZ^O;xnHw`=adHYq-s2c1N6b<%yxfxs{#Z>&k0QJ6N9FMl#k+61Xitp<`HpKu;$5H zalKGRzKz$-0S+x(3mLFaTq}>AoY~KxoYum4$n769!j`c5tYPT-z!{Rik_)z;5Qgh6 z-@_5IIuO&CPMgoGVMZ+bB?AQ^wL;dmj*4q$mF*u^TWesAmE#{Z0c|Lr*SXg_ss|1O z-;}ssZQQIpu`z{{iqB^|s!=Tt_V3HP7i(%jl`Y)9#zGTuJcAS0#N?p(anUpJ7sk-3 zFL0+nnF3CQ<%5BmG6*>>u#it~`YJACPI1Q6=fR|iv9)+WTP+`VN*dmA-6aQdT(F*b zZC0$SCTx4OGoo%R$5p!fjI%DLXy`uG!jPqphK&NZf`+L6bh&?Tk)HvaT$(TB`-@`2 z`t|c;R9*5eQjm$iG}L6L7#?ehKq^HXC;T?! z8Aqn91v?*-*udsWe%rTgBW>UVZ?v^=t~Q%B$q&$PLNtHEI8)P!Yz zQ10PUkLuQf)z-xDAB8g5@@?5paVJd-J0upRWh%kIsbE)BstPWe`i#AC=CJDci4Niy?s_;ynHUYa*ZT9;aP29eHJM5{UEw&hk z4Sm_7j$P@}uHsaYcwJWE{Utr>dGv>EuY0V-?MfTNygma=tc?u2{ZRt~1E-l%yX5hF ztX^hURuZ;4HrQpRVzWAJp2JDO%o#p&y|sE+$KmSqx* z2C!IHrO1+^1(P|0CQea3Y#A#JmYX#Id#%b5L z(x?IV92rNoXc`oG4qFjRi(hM@6=+;>ES0o4XImXh34s^vYxWk{Bw`dX%AL z4AZkwsdKN=g80qRig+wo|K%99P=bubINUK^2UHhqxE-&k?uR2%aHPiiNEbmnDq9|v7 z(>Om~%eg&E{-6dcd3w$rRJ$+vs&YqYSPNxW%~p<3@%PYsNGt<@I5VDpcL9e6b@#0eMfWcQC)w#}oOM0}1u2;1Cq3m-chO zSq)c?LqSrIkCBxRb+tl$!sT3_)5_TEzB%ZXzA@y#UY=ljD1!9eG4YKl2G~|+_A*mW z2XW5aDVp}$kThHsa^#K(>^&R~Y^rd;`+NW1n<|;1Gf2?iuge5C>-|awzX)Q?tlB7l z)Ep)9h|ZMO!N}E8yWlikb_6q$4H9{&*%oVv3BXP`loEV_%$0_u+vEeM>_M2 zG7a@0tt-8*PF@ASZFp9OFSCVYk`Mc{O`E|k`!I%KsXn6QM|2Gp)N#IcpOo~J0)Fen z?>?!o4Yj!@3+pj0G7xQG=y~_ZYLOit4b4W4e8$df^?v^e&Ec3LlRK= zW@Eb1T?fX@(S{NpdJzAow)eoF)j;8&UtA&D;K}5x@bY#>%EXO>I=9tfV6XNo;@w)@ zl`~;7_@az}5oYlt?z*_b&uqbBqKo|!o1Y!oP6zqzm4CwdjB(*}*3WlTUHsGb+J$Wv z^L4M5?+&ZA_!6G`(ceZ50YA6-OtKhZz+&ptjbIEHwZ@D(q4Y@VAC6kr zYlV{h-r$Di)OdrrXG@Zl8J=IL>(z-ez(d!;lZ^Jp*wyf=?OdA~@|QT~F@}ZX@AaCJ z{AwdS+2P#ykzEV_)af(#$?D?R&B`gmMaGC+8=@O)qwv0M=Xj4Ugv`0h%D;(2#4D0JvCa@m zYtHE!{x$~7#Zhi_7+GrNe_POvK3)> zzDDf6Zh!_J<-liEhVWEpiQSyF7#3=KjQZ$I;r5z$--Lx30zb4{TZ9^+c!ST&yBS$G`(pJ4zse^q;@q_OjvCSzi)=U4(!>-=Dd-?ugBk&q>tE7T{}zsj1Y6E(IFyA z8coGsw~JR;L(pKEjV@O>jOovxlJzq~!M|PlCaH!vqo2!Lo9uy#s-%n0_0@2&&s=Ou z!UD?nEaGtDbxx~K&>zkKMW-00;C~hUg z##D8fR`)vxjvK&MyWv8t_Bv#_deqWx7@%x=j$=MgKaP5Fg;z@t=fY|2=f3zrea$no z`8avmzjv}`1r-NJc$R+pB?#MFk5{Z?GsfdbN+~Dy8R70u+XpW%8$iO{&CTVJ25R+Y zZ?iVrLARUJ&xsUR~f9AbgVz_`61o|<9v4v`HaPqm?$ z&wV+~Rv)_~NwQX651`ei@to2KSrUS*z7^wvjn@ZwP=V-vi8pf;CE)hElc zbKLD+{lJ=@yfe$g7_qsFviQ`M@w=(~Ox>&xTu(1!{rW}hTU-BxmKI(;u~xO0RD`ykv#R(e1`JP#2^;1cV`7Pne|NAxR9YfoYZd55#rcTr*M(c`eg>UL6MQ~>KQS@T6jt?<^7{TVkg}kA9YHgKf<(?j9&=2X z82WgL4`-TXm};rG?)v4bB1Yvurc_ViMZG#;+f8?K`?wy$UPbvz)~KO#tT=&njTRE` zy!Sb@NE+2USEn6~_k=>eqktB_9?CX$--DZ4YbYLw*=4F`iW3RjOI=fB;d^sj(0|Yj2B^5QcONz1%oQwpP*MVt z)!$0!C5&M;+`!1{ZvxvATAck~>i9LiJiBj?58lyS(-<;^!2Z(k*pq#MIKB8Ociu}K zG|p5{(D@sn`s9nlJmu7UkgjFG1F-<;ADnC#+op*Ntxr&BZGs@Ig8ZU=E1!5I3 zhHLObD1s~VryC|cPH{ZXGs05$(a=eKJtS;Q+*%<+jl&*mIez?M4C8KRIOS+T!$7^z ztVtQH*Q?_ORIRAESo9{mK@~p~l1IA!YT__$`!U8mW9VPIbf=3~6EIf(Dq8nl_=py zJ$ob7anpgx~C@a%TeLppDabY*E=NTl-nuSPSkIt5g0TPIb!BnVQHFMdxw z+XxGhW7e)iiqLVO?{SaU$JZ^I$(HSg*x9XOX&YvMLqbc^Z=aBZ`kxvlgKkUebAncv z#ngNV|G64(BkJ>$#-9?lCT99Lo!kE?fzuq}ehR$$Lh88C(r9V8%oiMS)1A4;4PZRM z7(QI53!_5W8p$j}3`}W7-a24}tADIqtUl<#bfDX2b-F%&$(ES(+G->9&AUXSFk^I8 z4!`FzHN~rws{}{w^|04Ax^uo>TVXcymh1T_Jj-u7ukM+J^gE@bgImY3u`?*EHF6Mw z+OOMQ8joY~ORue6x5rT>xs?`VIffYFo|>H%)A+{0d+9#MB;>DJJyGZw#etBwYtMcg zK^CuqcuvGHa*mHxoT?tfW}kx@%$&WT-=4Db-oP-HG|oB5otr?t-D!qGZYzPEEbAmln2FMV_bQ+K3{yQ0StnYGmhS%_Cs6p`mnU9uh1@F8avBl&Mb-O$Jg}2 z>wPo*;5bwyBq`km*~GPStZ!RD<368~U^tBIgf0&Iy?wAQ7!m1-8H0j@W;k<0FTPrq zdA|~B2YZpcRKbdVY!cmkOmfROoYu7eyP*CXM}sF4Qt2lk?pkOkzN!P9JDJ6yBeOZ2$c@(}nnX2*3lenCja6UwG0!mg*hFvzj2sjm|_PuBnj|X?8uj(4d z5xTKGO4*|rrspm1eKCg5oWcTaKU-id{4DKO*$C|JIPYUBwLuwolgqozNqpK+%F=pz z96L0Y8>D9r!9U-B>Eh~P6d(9;hI!W%9{Gs$TWL%n)Q#=X35 z*Ksg4bvFvH9D{hX+nwI;)A+hOYQ4BaH#oM7+)nVFfaCd)eQy<}k$CoS*4*70n03c7 z?+NMwN6U>h`Igjrt%L=y`;Wn^iDB1u?pd_DUyAoTGk_>##&I*vH#1`+)owoD z`>}s+3O#@F?|skuiPJ9KZ(oRyVR!6B|BQoUQ1?vhQolV6R^6P%46jG2dShy5eg7Er zI>b)oJRQc)-^v5RRJ+rd{Y)PvFaaY=l@h_&8T@J9a4k?_1ldg%n~D}sV}i%ag*Rpp zwJh&%K56`iS9{JoMx~EI$bR_)%b;n5?6se5@S4C}2J7>b`XOX&xW#ZNZwCAx8ctVw zCy|-Bb;$#l0j!-=dO5IU8m&4fcv`*2P<41~?YJj(URlQae#ZC0mg|<->dYxryd7Ak zMw^D62XC}q>mb%xyIWk)n#LQcuDFicNr*hs(mP%}iWQsR?)~R9h1hhX(R8y3Y(Jm8 z%bTqirK%bZOB}`#dZJuj<@t9Ee3=sL8=c0Wd7HWA=oGXU$Ek>L4q;jO=EV-4)6iRW zEF|vK2o$O~BLcUMfn7H_gl&e3tFVi{T?`YL-SLS{(0&T07w+gLwhm+TX!M44Tc%+W zVc9owat0h$wt+=+s^E0{DBPCb^myJ+ z{a+}A&yzY&-LqfI_nAzC?bPYiPYKg_S(g6I+Mx%ho^$^8yf6*ATSDyaKc;YY18;(H z`~*H~YTAxhj$oqe2KOy0k9;1h_z%7I*JmyZMK4P4nZz_T+2#wum^6BFv2b>J^4DT>B6Rb=_%d|M$f^ z?wP@?&CU^ez8}ctHsRPx#dmY3;GbTBNgOvlHgICm1TGguTNvbw;Z8!pBbwYa-gC=5 zj6OV#O}~CMl<-bs^3J7$9iPWhwA;^BZ0|H=3%Y&=ubD#1jiIW$*jl_5<5olXz7Zk71@1gFPt{EqT=7+M9~JNz8|=}-b_Aq?F4wGqSGdR z8gs`+PVf6NhR`Y(`MZ^ai1Tq?$kWf_8$Py5Pvb?o*(WrqIh3{WY=XH$=YG+3-0{fYo7tu5!>ITrE2W=y*mjnAjzAXaCwg2CHwX{zd}R5Ri0N{#elo;hHUN)q5v!JF}79 zdfz8lNN6ivqK>P3t42?a$rQ#qG@N~1C-Gb-_4@UVBWP@h8qFyhhsu4UV2j={)a`%j z$4MQ3LyZmDoqE$)62#bXdgm0nR63J&Z;nINzo7Vb_b7664y!e7AI9#mt8?4l4WWK> zXzQQ0DQquq&Eq^Yi}QUi+xq`bps_rf=}X5jn03}ACG}53Y;Yv+l*TCPcJDQ79GFJK z>r$;DfnoF=4{=?SN9Bou^tc*ib-c4jo>bf&!GVCsfZoG4*Uv4@H9g!7u<`!d!itGB#TQ>oL z8&y9JYyQTA`~1omcxIrNdrx&K701mI(^-@Er*Y6g<3_>33B+}tPOh>Y!P?4%-CG*F zu;GPb;nnyqFzAn_US%DF3cZfW)`?L#E^Qq+dSnJGkKI~SST~IKddD;5mri2;$#IjK z%j3B3lTuzYOr3Y_3j)grx{&fjaAd8-I4T|*-Jj2^gDjdFE9=^@sO`A-F)FTY>CCuu zsC-4ov%1@8C6#ACnudD_O+)6%9E)%FFzC6L9Ca6+M0&1(x+8U**Rxwa=gk;_#=fds zmcG*v{PR8Sx!o{Km8QOVZJ$Q2`|9^6sQJ#vDh<5)?jvCJ;91Bgu_2+EDO4Te!TQGT z=duZ~ul(8ZvGX_LB$GbIHjaUzAZe;+Xat;o9~73#cfs|nsR~`n6n0B}>X1mH`u{g4 zXP>c5gENVZCn{hRysOp~p8wtj+vxQrKPyH+$2Tjq*K`_zbn@R;7f<6?17C}Z990LJ zSWKT^I*NR*AxR6qQM|ps&U(IIV^v({7<7WlW7-On?uAqy)~)+FrZSG^wqX9_h+u~dG%Vvu;VS8W=OU5z#@veSr>%i7jL^$)3>=lPS1_Tsd3%$+svZlIQcKqSZlBca$B_fR$dy%p}E)sY2Q9{a4c*Hese1b4Dj^ARyJGF?{_Yh=f88Q;zU#Z-{0h^1C$&~Z)B!yw)H}W2LG7dBrm5apG$~A0 z)m`mHxj=&fHEhSq_@46zWV#`=TJPfH!VWmu%M2;KF2xckve3RT6dU~8683cI8*Cl_ z=HPd!2if!+1ulQDL*|zQ*>``H!}s4|G0pxy%xDT4CLb-KCjQH(u2hUepYHQA-3`q+ ztFvYWGu05)Cua_0uH@B&5-1i!v+hUC3&rTuhvwp>) zrxR%1ee^a5wf&cJ(l@@l$5AX?bjUD2xfGX{c<)J1<}7Zgt)HslszZ-&|69+^EXCXI z?lYp>O;;Qhx2)4VvJCX~v(RajI`4C*81F0vsu|1XU}eGkGhlls99A58@1EHS z1*6o&y2r!VKCRTtsrnDw>3r7w^&fx*<80vAKc-?-d`dj}z7{d-C68}E_Zll(r&=$F z|H6R{n>X`3lg0j(YDv3hdhsIZu;xvRMa6R+a>emRUobef#`hdQLvi$Ue8BPRofs;k ztIXI+U%X;S{I1l?I=BQfnzXlnz`qwy4V3rRLCn0I_3I!*vCw*PjjlI+D05HiIZ;#& z74QA;@_%>WsN{;FG|6$SrM+}4jj<#Mb=Df=*mokL* zltmAtf`;(1BK_&@KKkOddrs=^{V@o8Wxa}h$7j*}b4#TTzQNSy5!XaxEh;iMj(1WM z48z0H&dQ;45J~Z9xt{bFUk_X?IAc12Ls@moc|Ozt_Su7zCz6*HH&t(qt2;45eKE%8 zjI0uUaXW8jZ|tcK@SfPyn0oLXQh2uCIcYM2(tk`#_`621C348)nmS8ynXqq7$}6hF zv|>~#b8W(x6*8+lWowa_F6y3ryAfA%E(*N6B~7bRh6zdcPeI$1WyOFj#mHR z{yPehgU2!&!zW?Cq_SnNcrQ5PUq1`FRgIHsRQ{Ndrj>+mu?46Obz;9UtfzeWyf=(RYuTpEcEgsmhbQy z3)h;F>_f`(H~C@)Ww3a}z1U599Pw+sFMIzP0o&laY^$Onl_@Gni$Dup!iXb?E&LsSZJZyZ+N@3eSB6G{$-n0}`XgVSYl z=<>QLJiaIKW`}t`QDb6C~3)N2u?HYb!aj+gKVI@cY+^?ZJ_CV+2dv!28 zl@*{8Qw!Dh*COW)hv0s#>ri>hHzehiw_j%MMW40F;H!W-yvbOzdG<*+>dmf+73O}$ zxuRWRho5%AsLFbY&aPS%O6NC^$J8M7k+`AlsamYNw_MzKybpSgHpk)o72%)WMxOo3 zR(xi8Qnvh-9vsv^7v`ARir+>~TwWu8;I&()wQ1j1*q;|nd3=5lo$|(eDt=P&IP21r zI{6)?X}k-0I&k^bYIfg2>We73X_hL@$VBR~`8ZKnc47PI+Ez4+YE9B2IEx=4+W55J z0E%qhoY(u>i-_74pPsk1V>xfXrbOj5goZx;iZ1<%BMzV6mQitay;)+Q?E`1=r`?a& zFjM(p@t?c$x2$V%p5usLq=}KjTPa1C2!gxchch6+=(XaN#AREpIV>q?uY3n7WBoN)P&z1 z_%{Lp6KAX5o!_uFU&3#BJvFiM_(N7`MiUNJ@&CE(*?@yfc3K19a&%T-Ouf4oW=lt?BqVpL-nVJ zXB1=?Y1Sf^y;MA=nZ0=V(L;^yradU~KcTIYMolbFPy^SNQJC(&_59n%HaI@LP=4;m zA6PFHaGtL}mY`KtDy|2mi4(s&Jr)(mUvzhorsB7^x`da58bIebKi%-GqZ3LN&q4=m z=!>n+EI0jN_W{|@g0!A(tOr|8|DFdwsfj5uP345=i;M58TQ9W7BzX^;Amx6H2@Xt+ zT2kl9!ZWV-cpJ`@3}?E&??M@?^eL^T5$K7u>s`6ffRBQ!YmZj`!jXqdk}b?8QTecr zWr~5Rc(<6Fw4D@pv6IrGYdcFj(6^;nK4^0n%->6`*g#EmM}#fiX}h%^9@pF1JgI@; z@57_N=!!nz^M^{=ogBRwpI9K4Ce=4&Yg+Y=PYs5xz?ugOJ z)*~%2^vm;)qVgQqofzM&ZEVH1F2~h(@%Lk(`rkqxldLeS(m7I!j0b|FWmH^mS%c6U6FhUzZweZ(UpyXD8N>HW{l8LsmKMLw+I&-$%CBZV zb1?~Pr~#DR{>0?BLwFmIe6FRm6M|9iOmeNHkS@Tr#J7A72A(Sx^2sa9Z(HZoYQg@c zg^BZJGX&mzxy&N>3G!)5x2CB2sMh(^edlMBaJNz(v=v}4j%)BQ`uMIBdnflw6)paT zr#rRZ+KV(HZzx&VJHCnfVg;>8O0OIb(w8^qhxXv5{Zyh~Db>!oLc99VflrQh%(EZH zK*yUnvDd8!w-0%;+%TR&`su`X^Zi;)5ogPmyMr(ZFqKVxK7^}l(J(yT2B(?_qI(Le zkuCfxB+G-bn0uLEIODTn6l|?-b!w@_joihrU2m}zkFC>qFv<0qs<1yE+IF`Go9CXr zIdiK6JpqkgKYTk;c=Awd+nz7j$;WX|e&81r#ZNrRp(dWa`9i84|9(MMjco7f^}V=h zF6=36Gz=ccRaXBFbz<8MkGF*n+h9UV?+H$3Dn4-b;i>dx_1O4vv~pnYAYO#|A8=@^ z#hd+gh8I56Lgc3UxyuRTIDUMvxP6@JF9pwgi?@Bl&-QV%g9j$4FSz6nt5N+!-Z|a= zzboqSWbY~8l^(U=YK@kSOBw`Mu;AlmmUR$(a^tX6cpbLr28+loVJ-d|-`b@2rw*EY z>|TAw%Zk^O?VSV2`+~B)wmSOu3 z|JKr5hK1Ha#&+AQvp+gedTuUOi@5;;n|j|AbTSt|HQ-(~+*^lJDUJ%gx^%_kjyYl- zBaFo=^!78Z75x}|ownU-eFO5Xdb%UC|3cGlaLvxwP0)HPgp=K+M(vuzIC}Mc zV25lYWO5dB$q96zd-z}4KJ8H?ddE&_n)czGn