├── README.md
├── YT_01_feature_selection.ipynb
└── YT_02_anomaly_detection_time_series.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # youtube_tutorials
--------------------------------------------------------------------------------
/YT_02_anomaly_detection_time_series.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "7e8f11bd",
6 | "metadata": {},
7 | "source": [
8 | "# Anomaly detection in time series "
9 | ]
10 | },
11 | {
12 | "cell_type": "code",
13 | "execution_count": 1,
14 | "id": "37c34d86",
15 | "metadata": {},
16 | "outputs": [],
17 | "source": [
18 | "import pandas as pd\n",
19 | "import numpy as np\n",
20 | "import matplotlib.pyplot as plt\n",
21 | "\n",
22 | "import warnings\n",
23 | "warnings.filterwarnings('ignore')\n",
24 | "\n",
25 | "%matplotlib inline"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "execution_count": 2,
31 | "id": "679515aa",
32 | "metadata": {},
33 | "outputs": [],
34 | "source": [
35 | "plt.rcParams[\"figure.figsize\"] = (9,6)"
36 | ]
37 | },
38 | {
39 | "cell_type": "markdown",
40 | "id": "a30dcd5c",
41 | "metadata": {},
42 | "source": [
43 | "## Read the data "
44 | ]
45 | },
46 | {
47 | "cell_type": "markdown",
48 | "id": "ce008cda",
49 | "metadata": {},
50 | "source": [
51 | "The dataset can be downloaded from [GitHub](https://github.com/numenta/NAB/blob/master/data/realAWSCloudwatch/ec2_cpu_utilization_24ae8d.csv)\n",
52 | "\n",
53 | "The labels can be obtained from [GitHub](https://github.com/numenta/NAB/blob/master/labels/combined_labels.json)\n",
54 | "\n",
55 | "This is real-life data on CPU utilization of an EC2 instance in the AWS cloud. Data was recorded every 5 minutes, starting on February 14th at 14:30. The dataset contains 4032 data points. It is available through the Numenta Anomaly Benchmark (NAB) repository under the AGPL-3.0 license."
56 | ]
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": 3,
61 | "id": "df09e2d7",
62 | "metadata": {},
63 | "outputs": [
64 | {
65 | "data": {
66 | "text/html": [
67 | "
\n",
68 | "\n",
81 | "
\n",
82 | " \n",
83 | " \n",
84 | " \n",
85 | " timestamp \n",
86 | " value \n",
87 | " \n",
88 | " \n",
89 | " \n",
90 | " \n",
91 | " 0 \n",
92 | " 2/14/2014 14:30 \n",
93 | " 0.132 \n",
94 | " \n",
95 | " \n",
96 | " 1 \n",
97 | " 2/14/2014 14:35 \n",
98 | " 0.134 \n",
99 | " \n",
100 | " \n",
101 | " 2 \n",
102 | " 2/14/2014 14:40 \n",
103 | " 0.134 \n",
104 | " \n",
105 | " \n",
106 | " 3 \n",
107 | " 2/14/2014 14:45 \n",
108 | " 0.134 \n",
109 | " \n",
110 | " \n",
111 | " 4 \n",
112 | " 2/14/2014 14:50 \n",
113 | " 0.134 \n",
114 | " \n",
115 | " \n",
116 | "
\n",
117 | "
"
118 | ],
119 | "text/plain": [
120 | " timestamp value\n",
121 | "0 2/14/2014 14:30 0.132\n",
122 | "1 2/14/2014 14:35 0.134\n",
123 | "2 2/14/2014 14:40 0.134\n",
124 | "3 2/14/2014 14:45 0.134\n",
125 | "4 2/14/2014 14:50 0.134"
126 | ]
127 | },
128 | "execution_count": 3,
129 | "metadata": {},
130 | "output_type": "execute_result"
131 | }
132 | ],
133 | "source": [
134 | "df = pd.read_csv('data/ec2_cpu_utilization.csv') # Downloaded from the link above\n",
135 | "df.head()"
136 | ]
137 | },
138 | {
139 | "cell_type": "code",
140 | "execution_count": 4,
141 | "id": "426d786a",
142 | "metadata": {},
143 | "outputs": [],
144 | "source": [
145 | "# Labels taken from the link above. We are looking at the labels for ec2_cpu_utilization_24ae8d dataset\n",
146 | "\n",
147 | "anomalies_timestamp = [\n",
148 | " \"2014-02-26 22:05:00\",\n",
149 | " \"2014-02-27 17:15:00\"\n",
150 | " ]"
151 | ]
152 | },
153 | {
154 | "cell_type": "code",
155 | "execution_count": 5,
156 | "id": "00c2f576",
157 | "metadata": {},
158 | "outputs": [
159 | {
160 | "data": {
161 | "text/html": [
162 | "\n",
163 | "\n",
176 | "
\n",
177 | " \n",
178 | " \n",
179 | " \n",
180 | " timestamp \n",
181 | " value \n",
182 | " \n",
183 | " \n",
184 | " \n",
185 | " \n",
186 | " 0 \n",
187 | " 2014-02-14 14:30:00 \n",
188 | " 0.132 \n",
189 | " \n",
190 | " \n",
191 | " 1 \n",
192 | " 2014-02-14 14:35:00 \n",
193 | " 0.134 \n",
194 | " \n",
195 | " \n",
196 | " 2 \n",
197 | " 2014-02-14 14:40:00 \n",
198 | " 0.134 \n",
199 | " \n",
200 | " \n",
201 | " 3 \n",
202 | " 2014-02-14 14:45:00 \n",
203 | " 0.134 \n",
204 | " \n",
205 | " \n",
206 | " 4 \n",
207 | " 2014-02-14 14:50:00 \n",
208 | " 0.134 \n",
209 | " \n",
210 | " \n",
211 | "
\n",
212 | "
"
213 | ],
214 | "text/plain": [
215 | " timestamp value\n",
216 | "0 2014-02-14 14:30:00 0.132\n",
217 | "1 2014-02-14 14:35:00 0.134\n",
218 | "2 2014-02-14 14:40:00 0.134\n",
219 | "3 2014-02-14 14:45:00 0.134\n",
220 | "4 2014-02-14 14:50:00 0.134"
221 | ]
222 | },
223 | "execution_count": 5,
224 | "metadata": {},
225 | "output_type": "execute_result"
226 | }
227 | ],
228 | "source": [
229 | "df['timestamp'] = pd.to_datetime(df['timestamp'])\n",
230 | "\n",
231 | "df.head()"
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "execution_count": 6,
237 | "id": "8f8a7c80",
238 | "metadata": {},
239 | "outputs": [
240 | {
241 | "data": {
242 | "text/html": [
243 | "\n",
244 | "\n",
257 | "
\n",
258 | " \n",
259 | " \n",
260 | " \n",
261 | " timestamp \n",
262 | " value \n",
263 | " is_anomaly \n",
264 | " \n",
265 | " \n",
266 | " \n",
267 | " \n",
268 | " 0 \n",
269 | " 2014-02-14 14:30:00 \n",
270 | " 0.132 \n",
271 | " 1 \n",
272 | " \n",
273 | " \n",
274 | " 1 \n",
275 | " 2014-02-14 14:35:00 \n",
276 | " 0.134 \n",
277 | " 1 \n",
278 | " \n",
279 | " \n",
280 | " 2 \n",
281 | " 2014-02-14 14:40:00 \n",
282 | " 0.134 \n",
283 | " 1 \n",
284 | " \n",
285 | " \n",
286 | " 3 \n",
287 | " 2014-02-14 14:45:00 \n",
288 | " 0.134 \n",
289 | " 1 \n",
290 | " \n",
291 | " \n",
292 | " 4 \n",
293 | " 2014-02-14 14:50:00 \n",
294 | " 0.134 \n",
295 | " 1 \n",
296 | " \n",
297 | " \n",
298 | "
\n",
299 | "
"
300 | ],
301 | "text/plain": [
302 | " timestamp value is_anomaly\n",
303 | "0 2014-02-14 14:30:00 0.132 1\n",
304 | "1 2014-02-14 14:35:00 0.134 1\n",
305 | "2 2014-02-14 14:40:00 0.134 1\n",
306 | "3 2014-02-14 14:45:00 0.134 1\n",
307 | "4 2014-02-14 14:50:00 0.134 1"
308 | ]
309 | },
310 | "execution_count": 6,
311 | "metadata": {},
312 | "output_type": "execute_result"
313 | }
314 | ],
315 | "source": [
316 | "df['is_anomaly'] = 1\n",
317 | "\n",
318 | "for each in anomalies_timestamp:\n",
319 | " df.loc[df['timestamp'] == each, 'is_anomaly'] = -1\n",
320 | " \n",
321 | "df.head()"
322 | ]
323 | },
324 | {
325 | "cell_type": "code",
326 | "execution_count": 7,
327 | "id": "4da47af7",
328 | "metadata": {},
329 | "outputs": [],
330 | "source": [
331 | "anomaly_df = df.loc[df['is_anomaly'] == -1]\n",
332 | "inlier_df = df.loc[df['is_anomaly'] == 1]"
333 | ]
334 | },
335 | {
336 | "cell_type": "code",
337 | "execution_count": 8,
338 | "id": "be9bd160",
339 | "metadata": {},
340 | "outputs": [
341 | {
342 | "data": {
343 | "image/png": "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1GtYSUmJWrRoofnz59eghAAAAADnI8mrDcuXS+3bSwMGSNdea/1t394aXouWLl2qLl26qEuXLvrNb36jBQsWyBjjNc69996rv/zlL9q0aZMSEhJ04403uj/7+9//rttuu03/8z//o6+++ko333yzxo0bpzVr1njN4+GHH9b111+vLVu2qGvXrrr22mt18803a/r06dq0aZMkafLkye7xf/nlFw0ZMkTvv/++Nm/erEGDBmnYsGEBzzSOHz9e7777rnJzc93DVq5cqV9++UWjR4+ucTkBAAAAjmZOMnl5eUaSycvLq/DZiRMnzDfffGNOnDhR/QUsW2aMy2WM5P1yuazXsmU1iL5y/fr1M7NmzTLGGFNcXGyaNm1qVq9ebYwxZs2aNUaSef/9993jv/3220aSe3379etnbrrpJq95XnXVVWbIkCHu95LMfffd536/ceNGI8nMmzfPPeyVV14xKSkplcZ6+umnm7/+9a/u9+3atTNPPfWU1+ePP/64+/3w4cPN2LFjA84vLNsOAAAAqMMqy2U8cSYvnEpLpdtus9I6X/aw22+vlUs3t2/frn//+9/6v//3/0qSEhISdPXVV1e4vLFXr17u/1u2bClJ2r9/vyRp27ZtuuCCC7zGv+CCC7Rt27aA82jevLkkqWfPnl7DCgoKlJ+fL8m6jPR3v/udTj/9dDVs2FANGjTQt99+W2mfwfHjx2vBggXu+N5++22vs44AAAAA/EuIdgCOkp0t/fhj4M+NkXbvtsbr3z+si543b55KSkrUunVrj8UZJSYm6vDhw+5hiYmJ7v9dLpckqaysrMIwz3n4DvM3j8rme9ddd+m9997Tn//8Z3Xq1En16tXTqFGjVFRUFHB9rr/+ev3+97/Xxo0btXHjRrVv315ZWVlVlAIAAAAAkrxw8uhDFpbxglRSUqLFixfrL3/5iwYOHOj12ciRI7VkyRL16NGjyvl069ZNGzZs0PXXX+8e9vHHH6tbt241ii87O1tjx47Vr3/9a0lWH73vv/++0mmaNGmi4cOHa8GCBdq4caPGjRtXoxgAAACAkwVJXjj97+WPYRsvSP/85z91+PBh/fa3v1VGRobXZ6NGjdK8efP01FNPVTmfu+66S6NHj1afPn10ySWX6K233tLy5csrvRNmMDp16qTly5dr2LBhcrlcuv/++73OHgYyfvx4DR06VKWl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aZJ27typW265RSUlJbrppptqI2YAAAAAQAAhJ3kbNmzQI488ookTJ3oNnzNnjlatWqVly5apV69eeuaZZ0jyAAAAACDCQu6T99577+nSSy+tMPySSy7Re++9J0kaMmSIcnJyah4dAAAAACAkISd5jRs31ltvvVVh+FtvvaXGjRtLko4dO6a0tLSaRwcAAAAACEnIl2vef//9uuWWW7RmzRqde+65crlc+ve//62VK1fqhRdekCStXr1aF198cdiDBQAAAABUrlrPyfvoo4/07LPPavv27TLGqGvXrpoyZYr69etXGzGGFc/JAwAAABCLgs1leBg6AAAAAMSAYHOZkC/X9HTixAkVFxd7DSNxAgAAAIDoCfnGK8ePH9fkyZPVrFkzNWjQQI0aNfJ6AQAAAACiJ+Qk76677tKHH36o2bNnKzk5WS+++KJmzJihVq1aafHixbURIwAAAAAgSCFfrvnWW29p8eLF6t+/v2688UZlZWWpU6dOateunZYsWaIxY8bURpwAAAAAgCCEfCbv559/VocOHSRZ/e9+/vlnSdKFF16o9evXhzc6AAAAAEBIQk7yOnbsqO+//16SdPrpp+u1116TZJ3ha9iwYThjAwAAAACEKOQkb9y4cfriiy8kSdOnT3f3zbvjjjt01113hT1AAAAAAEDwavycvF27dmnTpk069dRTdcYZZ4QrrlrDc/IAAAAAxKKIPCdPktq2bav09HQu1QQAAACAOiDkyzUff/xxLV261P1+9OjRatKkiVq3bu2+jBMAAAAAEB0hJ3lz5sxRZmamJGn16tVavXq13nnnHQ0ePJg+eQAAAAAQZSFfrpmbm+tO8v75z39q9OjRGjhwoNq3b6/zzjsv7AECAAAAAIIX8pm8Ro0aaffu3ZKkd999V5deeqkkyRij0tLS8EYHAAAAAAhJyGfyRowYoWuvvVadO3fWoUOHNHjwYEnSli1b1KlTp7AHCAAAAAAIXshJ3lNPPaX27dtr9+7deuKJJ9SgQQNJ1mWct956a9gDBAAAAAAEr8bPyYs1PCcPAAAAQCyqtefkLV68uNLPr7/++lBnCQAAAAAIk5DP5DVq1MjrfXFxsY4fP66kpCSlpqbq559/DmuA4caZPAAAAACxKNhcJuS7ax4+fNjr9csvv2j79u268MIL9corr9QoaAAAAABAzYSc5PnTuXNn/fGPf9Rtt90WjtkBAAAAAKopLEmeJMXHx2vv3r3hmh0AAAAAoBpCvvHKm2++6fXeGKPc3Fw9++yzuuCCC8IWGAAAAAAgdCEnecOHD/d673K5dMopp+hXv/qV/vKXv4QrLgAAAABANYSc5JWVldVGHAAAAACAMAhbnzwAAAAAQPSR5AEAAACAg5DkAQAAAICDkOQBAAAAgIOQ5AEAAACAgwR9d83169f7HZ6RkaFOnTqpfv36YQsKAAAAAFA9QSd5/fv3D/hZfHy8brnlFv3lL39RYmJiOOICAAAAAFRD0Ene4cOH/Q4/cuSI/v3vf+uuu+5SixYtdM8994QtOAAAAABAaIJO8jIyMgIOb9eunZKSknTPPfeQ5AEAAABAFIXtxitnnHGGfvjhh3DNDgAAAABQDWFL8vbu3atmzZqFa3YAAAAAgGoIS5K3f/9+3XffffrVr34VjtkBAAAAAKop6D55Z555plwuV4XheXl5+vHHH9WtWze9+uqrYQ0OAAAAABCaoJO84cOH+x2enp6url27auDAgYqPjw9XXAAAAACAanAZY0y0g4ik/Px8ZWRkKC8vT+np6dEOBwAAAACCEmwuE/SZPEl6/fXXtWLFChUXF+vSSy/VhAkTahwoAAAAACB8gk7y5s6dq4kTJ6pz585KSUnRsmXLtHPnTs2cObM24wMAAAAAhCDou2v+9a9/1b333qvt27friy++0Lx58/Tss8/WZmwAAAAAgBAFneTl5ORo3Lhx7vfXXXedCgsLtW/fvloJDAAAAAAQuqCTvBMnTqhBgwbu9/Hx8UpOTtbx48drJTAAAAAAQOhCuvHKiy++6JXolZSUaOHChWratKl72NSpU8MXHQAAAAAgJEE/QqF9+/Z+H4buNTOXSzk5OWEJrLbwCAUAAAAAsSjsj1D4/vvvwxEXAAAAAKAWBd0nDwAAAABQ9wWd5H344Yc6/fTTlZ+fX+GzvLw8de/eXevXrw9rcAAAAACA0ASd5M2aNUs33XST32s/MzIydPPNN+upp54Ka3AAAAAAgNAEneR98cUXuvzyywN+PnDgQH322WdhCQoAAAAAUD1BJ3k//fSTEhMTA36ekJCgAwcOhCUoAAAAAED1BJ3ktW7dWlu3bg34+ZdffqmWLVuGJSgAAAAAQPUEneQNGTJEDzzwgAoKCip8duLECT344IMaOnRoWIMDAAAAAIQm6Ieh//TTT+rTp4/i4+M1efJkdenSRS6XS9u2bdNzzz2n0tJSff7552revHltx1wjPAwdAAAAQCwK+8PQmzdvro8//li33HKLpk+fLjs3dLlcGjRokGbPnl3nEzwAAAAAcLqQHoberl07rVy5UgcPHtQnn3yif/3rXzp48KBWrlyp9u3bh7zw9evXa9iwYWrVqpVcLpdWrFhR5TTr1q3TWWedpZSUFHXs2FEvvPBCyMsFAAAAAKcKKcmzNWrUSOecc47OPfdcNWrUqNoLP3bsmM444ww9++yzQY2/c+dODRkyRFlZWdq8ebPuueceTZ06VcuWLat2DAAAAADgJEFfrlkbBg8erMGDBwc9/gsvvKC2bdtq1qxZkqRu3bpp06ZN+vOf/6yRI0fWUpQAAAAAEDuqdSYvWjZu3KiBAwd6DRs0aJA2bdqk4uJiv9MUFhYqPz/f6wUAAAAAThVTSd6+ffsq3NylefPmKikp0cGDB/1OM3PmTGVkZLhfmZmZkQgVAAAAAKIippI8ybqbpyfPu3z6M336dOXl5blfu3fvrvUYAQAAACBaotonL1QtWrTQvn37vIbt379fCQkJatKkid9pkpOTlZycHInwAAAAACDqYupMXt++fbV69WqvYatWrdLZZ5+txMTEKEUFAAAAAHVHVJO8X375RVu2bNGWLVskWY9I2LJli3bt2iXJutTy+uuvd48/ceJE/fDDD5o2bZq2bdum+fPna968ebrzzjujET4AAAAA1DlRvVxz06ZNGjBggPv9tGnTJEk33HCDFi5cqNzcXHfCJ0kdOnTQypUrdccdd+i5555Tq1at9Mwzz/D4BAAAAAD4Xy5j37nkJJGfn6+MjAzl5eUpPT092uEAAAAAQFCCzWViqk8eAAAAAKByJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgIAnRDgAAAACAA5WWStnZUm6u1LKllJUlxcdHO6qTAkkeAAAAgPBavly67Tbpxx/Lh7VpIz39tDRiRPTiOklwuSYAAACA8Fm+XBo1yjvBk6Q9e6zhy5dHJ66TCEkeAAAAgPAoLbXO4BlT8TN72O23W+Oh1pDkAQAAAAiP7OyKZ/A8GSPt3m2Nh1pDkgcAAAAgPHJzwzseqoUkDwAAAEB4tGwZ3vFQLSR5AAAAAMIjK8u6i6bL5f9zl0vKzLTGQ60hyQMAAAAQHvHx1mMSpIqJnv1+1iyel1fLSPIAAAAAhM+IEdIbb0itW3sPb9PGGs5z8modD0MHAAAAEF4jRkhXXmndRTM31+qDl5XFGbwIIckDAAAAEH7x8VL//tGO4qTE5ZoAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAAAA4CBRT/Jmz56tDh06KCUlRWeddZays7MDjrt27Vq5XK4Kr2+//TaCEQMAAABA3RXVJG/p0qW6/fbbde+992rz5s3KysrS4MGDtWvXrkqn2759u3Jzc92vzp07RyhiAAAAAKjboprkPfnkk/rtb3+r8ePHq1u3bpo1a5YyMzP1/PPPVzpds2bN1KJFC/crPj4+QhEDAAAAQN0WtSSvqKhIn332mQYOHOg1fODAgfr4448rnfbMM89Uy5Ytdckll2jNmjWVjltYWKj8/HyvFwAAAAA4VdSSvIMHD6q0tFTNmzf3Gt68eXPt27fP7zQtW7bU3LlztWzZMi1fvlxdunTRJZdcovXr1wdczsyZM5WRkeF+ZWZmhnU9AAAAAKAuSYh2AC6Xy+u9MabCMFuXLl3UpUsX9/u+fftq9+7d+vOf/6yLLrrI7zTTp0/XtGnT3O/z8/NJ9AAAAAA4VtTO5DVt2lTx8fEVztrt37+/wtm9ypx//vn673//G/Dz5ORkpaene70AAAAAwKmiluQlJSXprLPO0urVq72Gr169Wv369Qt6Pps3b1bLli3DHR4AAAAAxKSoXq45bdo0XXfddTr77LPVt29fzZ07V7t27dLEiRMlWZda7tmzR4sXL5YkzZo1S+3bt1f37t1VVFSkl19+WcuWLdOyZcuiuRoAAAAAUGdENcm7+uqrdejQIT300EPKzc1Vjx49tHLlSrVr106SlJub6/XMvKKiIt15553as2eP6tWrp+7du+vtt9/WkCFDorUKAAAAAFCnuIwxJtpBRFJ+fr4yMjKUl5dH/zwAAAAAMSPYXCaqD0MHAAAAAIQXSR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAACAWpGTIy1aZP1F5CREOwAAAAAA1ZOTI2VnS1lZUseO0Y7GW06O1LOndPy4lJoqbd1a92J0KpI8AAAAIAbV9SQqO9uKTbL+ZmfXrficjMs1AQAAgBjkL4mqS7KyrORTsv5mZUU3npMJZ/IAAACAGGQnUfaZvLqWRHXsaJ1drKuXkzoZSR4AAAAQg2IhierYsW7G5XQkeQAAAECMIomCP/TJAwAAAAAHIckDAAAAAAchyQMAAAAAByHJAwAAAAAHIckDAAAAAAchyQMAAAAAByHJAwAAAAAHIckDEFNycqRFi6y/AICTB+2/tHatdNNN1l+gMjwMHUDMyMmRevaUjh+XUlOlrVt5ACwAnAxo/63EbsAA6/8XX5TWrJH6949mRKjLOJMHIGZkZ1sHeMn6m50d3XgAAJFB+y8tWVL5e8ATSR6AmJGVZf2CK1l/s7KiGw8AIDJo/6UxYyp/D3jick0AMaNjR+sSnexs6wB/sl2qAwAnK9p/69LMNWusM3hjxnCpJirnMsaYaAcRSfn5+crIyFBeXp7S09OjHQ4AAAAABCXYXIbLNQEAAADAQUjyAAAAAMBBSPIAAAAAwEFI8gAAAADAQUjyAAAAAMBBSPIAAAAAwEFI8hAROTnSokXWX8Q2tiUAAEDdxsPQ65icnIoP+vQdZr9v10764Qf/DwX1N5/qLr+m0+bkSD17SsePS6mp1sNMY+UhpjUpj2DmF+75B7NMT3/7mzRnjvTrX0uNGkmJidaDVj0fsuo5vVRxW0rSsmXW35EjK1+PUNe3uuWzdm3VD4v13I8+/TS4+IONybfMqvq/uvuoPQ/f7VbVugXTzlS2zsFul3Bs75ycyutXKHEH81lt7/PRVNNYamNdgjmehWP+WVnSrl3heYh0VXUylJhq4zgQzn2iOvu6VPP18VdGNSlz33kvWyYdOiQ1aVJ52+hvvTzb1XPOseqtv/pbWd32jcGeT20fG6sqE6m8PELZN8O9/SuLM1x1y3e96lJbHTbmJJOXl2ckmby8vGiHUsGOHcakphojWX937Kg4bM2a8vf2yx63svlUd/k1id22cKF3vAsXBj/fYJa7cGFosYYy7+qWRzDz89yWwc4/1PWtbB2WLPHeLr6vNWsqTv/EE97jPPGEMSkp5e+Tk61h/uILFIu9TmvWeK9bdct/zRrvGJcsqVhmnvP2fNWrVzEuz/dPPGGNU1lMnvNOSSkfP9D/1d1HPefhu76VrZu/eui5Xikpxtx9d/l2rG69DXX7BWr/POuX5/apahlr1hiTlBRaG+m5vJSU6u3znvXGd3v52zfC2YZVNq+atmfhbg9952m/kpKsbRfMtFWVm+f87brg2b5VN+bK6mQw09f0OBDK/APVe7ucPdvfyr5/VLZdfMdLTKzZ+viuw5Il5fMMpsx990Hfdtxz+wVqG5OSvNvSQO2t78tuP+++u+L4nsvxjSHQ9zl/KmvbqiqPQJ/71uklSyruM4GO257Hj3Bs/8rWo6b7ir82pzb2w9oWbC6jCMVTZ9TlJM9fMuQ7bPx4/w2DZ+JU3aSqJslYZdPWxpeD2pyvLdzJaVXbsqr5V2d9K1uHiy6q/GA1fnzF6Z94ovKkr7IDlb9YAjW49gGkOuXvW64JCRVj8p13ZXEF+nElUEyVzbuyZQYjmHlXtl39tSm+B3LPV716FbdxsPU21O0XTPsXbFu3Y0fF9QpmOn8/YoSiqh9FfOthONuwquZV0/asNn6sC1Sfk5KCT94qK7fK9pfx48MXc02OlaEeB0Kdf2X1PjHR+8t5MG2Fv7Kuqj2t6TrExwc/30A/hAU6rlS2vv6WW9PXE09U3Y5XVmZVtW2VlUegfcVfPIHWPdBxO5zbP5BwtEGByj7c+2FtCzaXoU9eHZKVZV0CJ1l/s7IqDhszpvy9zR63svlUd/k1id3WsaN1Wd/CheG9VDM727psULL+ZmeHZ762mpRHMPPz3JbBzL8661vZOtx8c+XTjhlTcfqRI7235ciRUkpKxWn9xecvFs918p22uuU/Zoz3+5KSijF5zttTvXoV4zp+3LrEyzfOQDF5zjslxZpnZf9Xdx/1nIenm2+ufN0855GUJBUVBV7eiRPlMdp/g623oW6/QO2fZ/2y16GqZWRne69XUlJ42siq+NYbe/6ePOthONuwquZV03WujTILtB8WFVVeFsGWm29d9+TbTgSrqjoZzPQ1OQ6EOn/feu9ZDsXF5ft4UVH5Z577n+f4gbZLoO3ou99VZx2SkqTSUu/PKytzz7pRUFC+fp7HFd9jlmfb6Lm+paXl7wO1t9XhLwZbVXWgqrbN3/hV7Su+8SQmVixzz9j8Hbf9qe72DyQcbZC/ulob+2Fd4TLGmGgHEUn5+fnKyMhQXl6e0tPTox1OBU7sk1dbItHXry71yavu+oazT56/5Xn2LXjmGeugGig+f+tvr5PNc9qa9skbMEC66Sb/ZVZZvzXfsn77bemKK6z3KSnSQw9V3i8kVvrktWvnvV633SbNmiUVFlrj1asnffVVxVjrep88z+2XlCS9917FPliBpuvRw6rD9rqHum0C9Vl98MGK+0Y427Bg5lWX++QlJkrjxllfYKsqi1DKjT553p+tXSsNGmSVc0qK5HKV18u33674ncJz/MrK2i4Tu54H2u9CXQfPNioxUZo2TZowIbi64bt+nvtdoD55vuvrWSZS5X3yPv1Uuv/+8vYzOVm6/fbyNjUlRfr6a/8xBNsnL5i2LdD4wWw/e53sMk9KkhYssH4QqOy4bR8/7O8ANd3+la0PffKCz2VI8hDTYmmnDIe6vr7ViS+SN16oyQ8edb3sq6s2b3AQTdH4oauy6SNxo5dYr6Oh/ugVy+saTaHeJCPa26UmPxZJ1T8mVffH7kA3MIlEEh+O8YOZxgmJUiwjyQuAJA8AAABALAo2l6FPHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4CEkeAAAAADgISR4AAAAAOEhCtANARVU9NyyUh6H7G6eq5zWF+ryycD1zx3e45wOtfR/EWdMHSldXKA+B9vesHH/PH4vEA+hr+pyjYJ8ZF2odCiYuux6E8oD2YJYnBZ6Hv/GC2d/C+Uy2YLZDTfjbVlLozwYM9nlKgR7MbG/btm1Dq2OVLS/Qc/6q8+zDqp57JXk/RLiyel9VvbKHBaoPwaxXoHlUVZ98p/N8SPk//iF16OD/IdT+9s/q8n0gs/2Q6araklDbrF27pOefD7xOocYcShsczuNrOJ4fV1W7VlndjsSzHz3nV926IAWup1XFunZt7daVUMvqb3+T5syRbr5Zuvbaqufv+7lnGyIF90xU33pgPwi+queo1uT7gBTe73mB2pZPP7UeSC9ZD6WvrWcbRgvPyasj7rtPevJJqbRUKiqq+Hm9etZnxlgJj6/ERCnhf1P2khL/4yQlWX8951+vnhQXJ5WVSSdO+F9u3P+e742Ls15FRdayioqs9/6ms5cXH2/FHR/vfzn16lnDSkqs8TzXx9861KsXeHnJyVKDBlYZnThhvS8tteYfF1c+z7Ky8vXxHVZWVh5vQoKUkmL9LSyUjh2z/nquX1mZFZOnEyes9fGUkFBxWFqaVYae86xfv7xs7Wk818Nmx+m5Le35SVYZ2GUuWbH7jhcXZ8Xerp30/ffWsuLipLw877gTE73LPDnZO+bERCvuwkL/28aud57x2HXJc1n163uvW3y89d5znnad8hxWv3557JL1v8slpaZa27akxKoXJSXey/OUlmatx7Fj1vL91T1PTZpY49jbxbdO2+VWWGh9npYm5eeX16uiIqsc8/KsbWXH4Llsz22bkFC+73kuJynJWs+jR62/R46U70cpKdb8UlOtZdh1wBirfDy3oT8tW0q5ueXvGzb03p/sfd8zpvr1rc896+6RI+WfJyaWtwPGVNwnbElJFeebnOx/H5TK64q/9jMtzX+saWlWuXkuo6TEKreOHaUdO6SCgorz840tELseeLYhP/9c9XSe09vLiovz3oclqzwka96+n9nsbVZS4l1HMzKsv4H2h8rWMTnZ+tze5zyXbcdcUGDF5VnX7bpjv+x52J9J3tvDH3s/LS21prfr2YED5eM0bmztQ77b9vjx8n3N3/omJ5eXteeroMAax95v7PrfvLk1z4MHy+fTsKG17OLi8n3dbgf8baOMDGse9r5aXGwtwy7L4uLA27Z+fe/PMjLKY/Wc3p6nXQ8qY3+PsGPxPOZ4so95vm2z3dZ41qu0tPL/Pb8/2NvePlbZ7Z49jj2vX37xXxft9fVs933bFHv+kvc84uOtY0JSknfdsY8vjRqVtxe+5R8fb73s44tdvp7fK+wy8myLS0u993+7ffCtp4WF5cdK3+9ORUXe35MaNrTWr6zMKgvP45Z9PJWs5aSmerfn/rRsaY3700/WOrVpY80/JyfwNI0bW8vKyyuvM5XVXft7qsvlfSwwxnvdAgn2O5JU/l0imOOd7zI8Y09Kkk4/XXrqqZr/kBUuPAw9gLqY5N13n/Too9GOAgAAAIA/a9bUjUSPh6HHkBdfjHYEAAAAAAJZsiTaEYSGJK8OGD8+2hEAAAAACGTMmGhHEBpuvFIHPPKI9ffJJ61riDMyrOvQk5Ks64iLi61rju3rrVNTva8/9u3DVFpqjd+woXVdeWKidPhw+bXp9rXivtcvx8VZ146npFjTHDzofY20vz55CQnlsdl9cZKSrOX5u67cH7s/Xv361njHjlnjJiVZfZ+OH7fWw/O6/ZQU66/dB8H3Ov7a6JN34oQ1f7ufhn19vG+fvIKC8r5CGRlWX6yiImueSUlSerq1fe1r7D3n6bkuVfXJs699t7eRb/8Ru8zt7SqV90uw+zL49slLTLQ+T062OiMbU97XorTU2jb29f2lpdZ62HXSLsdGjazleNY73z6CdtnbfWvsmOz18twGDRpYfw8cKL+OP1D/ULs++euTZ9cLe/ykJKtcjhyxxrXrnt03ICnJmq601JouLc0a59Aha98qKPAue8+6ZL+vrE9eamr5Pm7XV88+HnFx1nRHjlgxxcVVLEd7W4TaJ8+eh2e/g/r1K7YBhw+X9+ex9z/PPnm+fa/sOmv/9azb9n5u919xuaz1s/vdSFa5Jidb29qz3nj2DbX3Jcmahz2OVLFP3imneNd5u7zscRs2tLaLXa+Lirz75BUWlvfdsftVxcWV95E8ccKKoUmT8rrlWZft8rTL4/jxiv21PMvWcz/2V65paVY8Bw+Wbwu7b3CLFtb87P40vtvMri92++M7jl1n7Ppu92ey95P69a3l2mVVWZ+q6vTJi4uT2re3bsCzeXN5nbaPh4WF5dves0+evc/b+7Tdznn2By8ttebVrJn1eX5+eX/Ro0et6T37PwbbJ6+oqPzYZC/LPmZ7bmPf/m2e/QMTEsr7pvv2yfPcl+318reOSUnl7bPNt0+evc/Z7YE9jW/bEx9f3k/ebgPt7W3Xa5tnO1dSUt6Hv1kzK759+8qXY48fap+8Y8es9T/9dKtPm8tl1Yfjx8v3R7sO2OVpD/M8ltjb094/U1PL2wLPPpNxceV98uy6mpkp/fijNcxui0Ptk2dvd7uM7XbE8zuO3b87UJ88+7td69bW359+Kp+usLC8T6jLFXi/T0mxYjt40FoXu32yx5O8++QlJkp791rjeh6z7WNEfr41P98+eXYfUN91sPtO+vbJs8vO3u6+xxvP+zQE8x3Jd/vb3+fsfceuM02aVNyP7XHs734ul9StW93qkxcs+uQBwEnKKXcQ8+TEdYKzUEcB1AQ3XgmAJA8AAABALOLGKwAAAABwEiLJAwAAAAAHIckDAAAAAAchyQMAAAAAByHJAwAAAAAHIckDAAAAAAfhYeh1TKDn5wT7XB1/4+XkSMuWWf+PHBl4vpL1f7t20g8/lM9j7VppyRJpzBjrQZD2NPZ4vuPXZJ2CWU9/6+MZ06ef+v/Mcx0rW6bv/P1N4y+eQ4esB2uec07g8vAtOzsme3mtW0tr1kgDBlgP/gwUp+c0nsvzjNUe59Ah63/P2PyVU1Vlfc451jT2egaaLidHmjtX2rlTuuUW7zoTqIwD1dXKyt7fPCt7HyrP9bjyyvLt4RlToP+DWb7n57t2+d/HIvEcLd9t7K/uVla29nr71il7eKjbpzrrHmi/ys62HqK7Zk3gsg20X9nrEKjt9Bev7zoHijWU9iVYa9dKzz8vdeggTZhQefsfTBseSjlV1Zb6thmVHac8x7WX42/6YNoPe78aMEDasydwG+2vnfNXXsFuo2DqhO9x1Td+f+2tPS/fOl1VDOHavyprv6vbZgV7bAhmein0da5JWxuOY05VsdWknAPtD927S19/7f97hm9cgdqG2mjDqoo/UFtR2Xcuf/MM5lgW7PzqOp6TV4esXSsNHGjtdElJ0vDh1pdkSRo0SCoqKh9uf+m0v1gdOiQdOSLNn28NT0iQLrxQSkuT3n5bKiuz5hMfb81rzBjpyy+lJ5+0xo+Lk1wuqbS0PB6XS+rVS/rii/JhZ5xhNQ4lJRXjT0yURo2y5nHlldZBdceO8pgSE6Ubb5QaNrRinTfPmk9iovTEE9Lq1dbLM/6WLaW8PCkjQ8rNlU6ckDZtKo8zIUG6+27p8ccrxmTHb8frclnrWVpqlcPZZ1vjffaZ9Xl8vLVTf/SRFYMtLs4qP/tzO6aePaUWLaT/+Z/y8vWUlCRdeqmUmVm+znZZ2BISrGn9TW9/ftVV1rrbcSX8708z/tY3Pt4aHmgcf+w6cdllVll17y5t3Cg1aiQtXCgVFgaObdEi7y9PrVtL11/vXY+GDZPefbe8DowaJb3+enlsnuXqO9zlKl+f3/7WKkfJuyzj4qQrrihfRlKSVR/uvrt8n+nXz5quS5fyeUjlB4h33/VO5tq1K98Xfdc5Ls6ar2d5+5b9WWdJn3/uXZc9l71rl/Taa1Y52fXLX3nFx0t//rP1v+cBzd7nd+2y9rHLLpN++sk7kbEPgkeOSIcPl++TdtJvl6O9H3pyuaRzz5V697bee7YrgwdLK1dasVdWF+19za7Db7zh3Q4sWiQVFFjvFy60Ytu8ubxckpKkBQu8Y/b98i9ZdW7cOGub2Py1Z75lGxdnbefdu6344+Ks8ra3ue/7+Hhp/Hjr/927rf2/Vy9p7NiKbahdz+02y459zBirHhcUlM8zLs5/PTlyxFpORobV3mRmWtNs32797dKlPJaCAunDD8vX07N982wv4+OlHj2krVv9tzn2vpiWVr6N4+KsOrV2rTWNb5tll0t+fvm2s+uJ57HHHnf06PL93HPft6f1rEMul/f0Lpe13tu3S57fXM44Q2rbVvrnP72HV8Wum57tjid/bcuCBdax85NPrHF8j1GS1X4WFlrTS+XlZrdhu3ZJr7xSvpz+/a31qqy99dynPNnH8tRUa3/1PdbY+9upp3rvKwkJVhs3Zoy1j0neCa79v+8x/PLLK36n+P3vpT/9yZpvfLzUqZPUp4+Unl5eXz3Lyf6bk2Mtwz6++tZNu8zy861jU7t21vp7zsPedklJVvkUFEjJydLtt5eX0TPPWPuh5/cn3/bGLifJai/79i0/Hn79tXdCbf+g8uab1vJSU60yueIK6fhxKSVFuu02a1x7P87MtLaBb/vtufxp06zyffddqxzs70OeddVuR+1l2O17375WvYuPt8omPr7i/heIZ3tRr55VF+322ZaSIt1wg7U9N2zw3l9cLmu/81xvKfAPKr4/CtrjJCZK//iHFU9urvdy7LbDd7gne38tLS3/3uW5DeLjy9s1e308v4dK3sd8e5t4/mhWV/Aw9ADqapKXkyN17VrxS6VkVTR/wwHUjlje55Ys8U4knCY52fob6MswANSGNWusvwMGVPxs/HjpxRcjG08s8U2EY0m9etJXX9WtRI+HoceY7OzAXypj9csmEKtieZ+bM8e5CZ5kJXexnOC5XNGOAEB1LFlivXylplpn+lJTIx9TrDh+3Cq7WEvwJOsscHZ2tKOoHpK8OiIryzp97I893L40qrri2NoIUWKidYmDLT7e+31tiI+veV23VXc+KSnl+11cXPmlHLHg5psDtyWBxMfHzjomJ5efzYtFTz4ZvvrtD0lk7PDdVklJ0jXXRCeWWJeUFLhdSE622sWaGjPGenm6+27r0sr+/a2/TzxR++1TQoK1vpEUTJtV2TGkriXCoZRfvXrlffZiDZdr1iGenUztG3CMGWP1NfC9QYPdYdazT57k3cdo61brmvXSUqtvX9u23jeS8Ozr4tlv58svy6e1+555XiduX+ts98GybxRi98Hz7f/j24/Ilz2ff/zDummA57I8r723+zt49m3yF4NdfvavRp59Vzz7x3n2bbGH2bHb/Q/8zcOzXHr18o7b8yYG9vXljRpVjNeeplevirH7lpV9Pbm9HXyvY2/Xrry8KhvHXz2x+1z49kHYuLH8Bg5S4JtR+N4cwF+fjkB1wLeu2n0WfG+4EIhnWTZqVN7fwfdGErt2Wf1F7O0YTJ+8QDexsdfLs7x964DvtvDdbzy3qee+5FtevvW6Nvrk2WXge1MHz3rvWV527IH28UD13rfOedYPz/89249A7Zu/Ouhbx333Zd/5SFbZff21Ve8vuqjqdsxz/X33R3/lvGOH1cZ49sm7666K28fffhBqnzx/7bzdZ6xLl/J94913vYf727ae8/Pt52PXd9966a9OV1XvKpvGXq5nHbLb7BMnrC9d551n9YmeP9/64tixo3c5+dtG/pZp862flbUtnuXo2yfP/jJr1wF/y7KXZ98Mw/eGOXafL982xV43z/a6eXOrb5hnnzzf9fHdR+118PwuIAXXftv7hn2/AN/vI6++am277t2r7pPneUyXrHE9y8/eZva+6tsnz7P99GzDPPd3zxv2rF3rfSMef/u5Zx2srE+e701zPPm2v4H65PnuI3a5++sj7u8mPMuWeR+/PfdVex/2/E5n7w/+2kvffevyy61tuXmz1c/u/POtdsX3uHfihHXssccJdLO3UPvkeX739IzTc7/2933Lntbf8da3nfR38xb7pkae38mCuQFQpNEnL4C6nOQBAAAAQCD0yQMAAACAkxBJHgAAAAA4CEkeAAAAADgISR4AAAAAOAhJHgAAAAA4SNSTvNmzZ6tDhw5KSUnRWWedpewqnji4bt06nXXWWUpJSVHHjh31wgsvRChSAAAAAKj7oprkLV26VLfffrvuvfdebd68WVlZWRo8eLB27drld/ydO3dqyJAhysrK0ubNm3XPPfdo6tSpWmY/MAkAAAAATnJRfU7eeeedpz59+uj55593D+vWrZuGDx+umTNnVhj/7rvv1ptvvqlt27a5h02cOFFffPGFNm7cGNQyeU4eAAAAgFhU55+TV1RUpM8++0wDBw70Gj5w4EB9/PHHfqfZuHFjhfEHDRqkTZs2qbi42O80hYWFys/P93oBAAAAgFNFLck7ePCgSktL1bx5c6/hzZs31759+/xOs2/fPr/jl5SU6ODBg36nmTlzpjIyMtyvzMzM8KwAAAAAANRBUb/xisvl8npvjKkwrKrx/Q23TZ8+XXl5ee7X7t27axgxAAAAANRdCdFacNOmTRUfH1/hrN3+/fsrnK2ztWjRwu/4CQkJatKkid9pkpOTlZycHJ6gAQAAAKCOi9qZvKSkJJ111llavXq11/DVq1erX79+fqfp27dvhfFXrVqls88+W4mJibUWKwAAAADEiqherjlt2jS9+OKLmj9/vrZt26Y77rhDu3bt0sSJEyVZl1pef/317vEnTpyoH374QdOmTdO2bds0f/58zZs3T3feeWe0VgEAAAAA6pSoXa4pSVdffbUOHTqkhx56SLm5uerRo4dWrlypdu3aSZJyc3O9npnXoUMHrVy5UnfccYeee+45tWrVSs8884xGjhwZrVUAAAAAgDolqs/JiwaekwcAAAAgFtX55+QBAAAAAMKPJA8AAAAAHCSqffKiwb46NT8/P8qRAAAAAEDw7Bymqh53J12Sd/ToUUlSZmZmlCMBAAAAgNAdPXpUGRkZAT8/6W68UlZWpr179yotLU0ulyva4bjl5+crMzNTu3fv5oYwEUB5RxblHXmUeWRR3pFFeUcW5R15lHlkxVJ5G2N09OhRtWrVSnFxgXvenXRn8uLi4tSmTZtohxFQenp6na9cTkJ5RxblHXmUeWRR3pFFeUcW5R15lHlkxUp5V3YGz8aNVwAAAADAQUjyAAAAAMBBSPLqiOTkZD344INKTk6OdignBco7sijvyKPMI4vyjizKO7Io78ijzCPLieV90t14BQAAAACcjDN5AAAAAOAgJHkAAAAA4CAkeQAAAADgICR5AAAAAOAgJHkAAFSBe5RFFuUNIJxOxjaFJC8CNmzYoF27dkU7jJPC9u3bVVJSEu0wTmonY0MaTZR37du/f7+OHj3qfk+Z1y7KO3oo68ijzGvfydqm8AiFWvThhx9q/PjxKisrU1FRkS699FLdcccdOvPMM6MdmuPMnz9fDzzwgNLS0pScnKw77rhDY8aMUUJCgowxcrlc0Q7RkYqKivTUU0+pfv366tmzpy6++OJoh+RolHdklZSU6Oabb9YHH3ygZs2aqXPnznr66afVtGnTaIfmSJR3ZNGeRB5lHlkne5vCmbxa8uOPP+q+++7Ttddeq/Xr12vu3LnaunWrfve73+m7776LdniO8ve//10PP/ywHn30UT333HMaOHCgJk2apBdeeEFFRUUkeLXknXfeUatWrbRixQotWLBAv/71r3XfffepoKAg2qE5EuUdWSUlJRo7dqy++eYbLVq0SNdcc42+/PJLjRgxQtu2bYt2eI5DeUcW7UnkUeaRRZsiyaBWrFq1yqSkpJj//ve/7mHvvvuuGTBggLn66qujGJlzlJaWGmOMueOOO8yFF17o9dnkyZNN3759zeuvv26MMaasrCzi8TndVVddZW6++WZjjDE///yzef31101ycrJ56qmnzPHjx6McnfNQ3pG1a9cu07lzZ/PSSy+5h+Xm5prWrVubKVOmmH379kUxOuehvCPLtz157bXXTHJyspk1axbtSS2hzCOLNsUYzuTVkp9//lldu3b16h922WWXadSoUfrkk0/03nvvRTE6Z4iLs6rv119/rdNPP12SVFxcLEmaPn266tevrxUrVmj//v2czQuznTt36uOPP1ZWVpYkqVGjRho1apQmTJigl19+WRs2bIhyhM5CeUfeoUOH9OOPP+r888+XJBUWFqpFixaaPn26Vq1apfXr10c5QmehvCPHX3ty1VVXacKECXrppZf00UcfRTlC56HMI482hcs1a0337t21bds2ffvtt+5hcXFxuuSSS9S7d2+98sorUYwuNr322mu6/vrr9ac//UlffPGFe/hFF12kN998U5KUmJio0tJStWrVSiNGjNDXX3/tNS6qx/eGNu3atVNxcbHy8/MlSSdOnJAkPfjggzp27Jjeeecd/fLLL1GJ1Qko78h67LHH9OCDD+rVV191D+vWrZuaNWuml19+WVL5j0qTJk1SWlqa3nnnHRUWFkYl3lhHeUdWoPbEvhGF3Z488MADOnbsmFauXEl7UkOUeWTRpgQQ7VOJTjZ48GBz8cUXm/z8fK/hU6dONZdffjmn54NQVlZmfvnlF3PdddeZJk2amBtuuMH07t3bNG7c2MybN88YY8zXX39tGjZsaJ5++mljjDEFBQXGGGNKSkpM8+bNzXPPPWeMKb+8E8GbN2+ead26tenatas544wzzMKFC01RUZExxpgJEyaYXr16uce1h//xj380mZmZ5vDhw9EIOaZR3pH1ySefmLZt25o+ffqYwYMHm7S0NDNy5EizY8cOY4wxd955pznttNPMTz/9ZIwx5sSJE8YYYxYtWmQaNmzofo/gUN6RVZP25MiRI1GJOdZR5pFFm1I5krxatGXLFpOQkGCef/55d+JhjDEPP/ywadu2rSkuLo5idLFj06ZNpmPHjubzzz93Dxs7dqzp27evee2114wxVr+8hg0bmry8PGNMeUJ3/vnnmylTpkQ+aAdYvny5ad++vVm4cKH54IMPzF133WXq169v/vrXv5rS0lLzz3/+05x22mlm1qxZxpjy5PrAgQOmXr16Jjs7O5rhxxzKO/KmTZtmrrjiCmOM1WZs3brVtGvXzkycONEcOXLE/Otf/zJ9+vQxt956qzGmvG/vmjVrTLNmzcwXX3wRtdhjEeUdOf7ak9TUVHd78vbbb9OehBllHnm0KZUjyatl9957r2nZsqWZO3euOXr0qMnLyzPDhg0z06dPj3ZoddqKFSvc/y9atMh06NDBfP/99+5hOTk5ZvTo0eaSSy4xhw8fNrt37zY9evQwAwcOND/88IMxxpht27aZrl27mg8++CDi8ceyqm5oc95555m33nrLFBYWmilTppjMzEyzZ88e9zirVq0ybdu2NVu2bIlo3LHK/rGH8o6csrIyc+TIEXPhhReaO++80xhTXu9nz55tzjzzTPPCCy8YY4x56qmnTGpqqlm+fLkpLCw0xhjzyCOPmP79+3NDpyrYZVpcXEx5R0h12u8ff/zRPc6qVatMZmYm7UkIqtOGU+Y1QxseHPrk1bJHHnlEv/71r3X//ffrV7/6lXr16qXvvvtO1157bbRDq5P+8Y9/qHXr1rrzzjt16NAhSVJSUpLXterGGHXo0EHDhw/X0aNH9be//U1t2rTR66+/rm+//VZZWVkaPXq0srKydOqpp6p3795RWpvYVNUNbdLS0vTKK6+osLBQU6dOVWZmpq644gotWbJE3333nebPn6/TTjtNnTt3jto6xII1a9ZIkhISEiRJ33zzDeVdiz7//HPl5eVJklwulzIyMlRQUODuI2OX+fjx49WhQwetXLlSe/fu1aRJkzRp0iTdcMMNGjhwoEaPHq1HH31UV111lVwu10nzUN1QTZ8+XVOmTJFk1fGMjAwVFhZS3rWsOu330KFDvdqTLl260J4EoSZtOGUeOtrwaohujnlyKCgoMJ9//rmZP3++efnll6MdTp30ww8/mH79+pn09HTz6KOPen1WUFBgmjZtav74xz8aY6y+dsYYc+TIETN48GAzfvx4c/ToUWOMMd988415+eWXzR133OG+lBOVW7p0qbnuuuvM448/7vVL4iOPPGJatGjhfm+X++zZs02vXr3M+++/b4wxZt++febyyy833bp1M61btzYXXHCB2blzZ0TXIZa89NJLpkmTJuaKK64wx48fd5frY489RnnXgjfeeMO0adPGnHrqqaZt27bmgQcecP+K/vTTT5sGDRqYY8eOGWOM+1feZcuWmTZt2piPPvrIPZ/XX3/dPPjgg2bixIlm27ZtkV+RGPHSSy+Zxo0bm65du7rLz/6F/a9//SvlHWa035FHGx5ZtOHVR5KHqDt69KgZOHCgqVevnnsHLS4uNgcOHHB3TH7wwQdNRkaG2b9/vzGm/Lrq++67z/Ts2TM6gcewUG5o89RTTxljAt/Qxv4sNzfXbN26NeLrEiu++eYbc+aZZ5omTZq4y9TT5s2bTePGjSnvMPr0009N165dzaxZs8wXX3xhZs+ebU455RRz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\n",
344 | "text/plain": [
345 | ""
346 | ]
347 | },
348 | "metadata": {},
349 | "output_type": "display_data"
350 | }
351 | ],
352 | "source": [
353 | "fig, ax = plt.subplots()\n",
354 | "\n",
355 | "ax.scatter(inlier_df.index, inlier_df['value'], color='blue', s=3, label='Inlier')\n",
356 | "ax.scatter(anomaly_df.index, anomaly_df['value'], color='red', label='Anomaly')\n",
357 | "ax.set_xlabel('Time')\n",
358 | "ax.set_ylabel('CPU usage')\n",
359 | "ax.legend(loc=2)\n",
360 | "\n",
361 | "plt.grid(False)\n",
362 | "fig.autofmt_xdate()\n",
363 | "plt.tight_layout()"
364 | ]
365 | },
366 | {
367 | "cell_type": "markdown",
368 | "id": "95ac3348",
369 | "metadata": {},
370 | "source": [
371 | "## Baseline: median absolute deviation (MAD) "
372 | ]
373 | },
374 | {
375 | "cell_type": "code",
376 | "execution_count": 9,
377 | "id": "d045b558",
378 | "metadata": {},
379 | "outputs": [
380 | {
381 | "data": {
382 | "image/png": "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VyQSsW83NDQUrMNmZ8ceEdBt84/VO2eN0aMv7NXjf9+ndxqjaool1RRL2n85aIxKjUVZIQBgILREpXwO8ElJijdLzvivLACnu2rmMfrcjPcXexk2KyPk+g8mjg55ls7bLayknsmKFSt08803d3l89GjvdrDsq9ra4s7sAwAAAArpSyulLxV7ERkcPnxYNTU1fX6do0PekUceKb/f36Vqt3///i7VPcvy5cu1dOlS+34qldK7776roUOHFm1vfkNDg0aPHq26ujrHnAtE6eL9hkLi/YZC4b2GQuL9hkLp7r1mmqYOHz6cc/HF0SEvFArplFNO0fr163XBBRfYj69fv17z58/P+JpwOKxwONzhscGDBw/kMrNWXV3NBwUKhvcbCon3GwqF9xoKifcbCiXTey2XCp7F0SFPkpYuXaoFCxZoypQpOuOMM3TPPfdoz549+tznPlfspQEAAACA4zg+5H3yk5/UO++8o2984xt6++23NXHiRD3++OMaO3ZssZcGAAAAAI7j+JAnSYsXL9bixYuLvYychcNhff3rX++yjRQYCLzfUEi831AovNdQSLzfUCgD9V5z/DB0AAAAAED2fMVeAAAAAAAgfwh5AAAAAFBCCHkAAAAAUEIIeXly1113afz48SorK9Mpp5yip59+usfrN23apFNOOUVlZWU6+uijdffddxdopSgFfXm/bdy4UYZhdPn65z//WcAVw402b96sefPmqba2VoZhaN26db2+hs825Kqv7zc+25CrFStWaOrUqRo0aJCGDx+u888/Xzt27Oj1dXy+oa9yea/l67ONkJcHDz74oK655hp95Stf0fbt23XmmWdq9uzZ2rNnT8brd+7cqTlz5ujMM8/U9u3b9eUvf1lf+MIX9PDDDxd45XCjvr7fLDt27NDbb79tfx177LEFWjHcKhKJaNKkSbrzzjuzup7PNvRHX99vFj7b0FebNm3SkiVL9Ne//lXr169XIpHQrFmzFIlEun0Nn2/IRS7vNUu/P9tM9Nupp55qfu5zn+vw2IQJE8wbbrgh4/XXX3+9OWHChA6PXXnllebpp58+YGtE6ejr+23Dhg2mJPO9994rwOpQqiSZjzzySI/X8NmGfMnm/cZnG/Jl//79piRz06ZN3V7D5xvyIZv3Wr4+26jk9VMsFtPWrVs1a9asDo/PmjVLzzzzTMbX/OUvf+ly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\n",
383 | "text/plain": [
384 | ""
385 | ]
386 | },
387 | "metadata": {},
388 | "output_type": "display_data"
389 | }
390 | ],
391 | "source": [
392 | "import seaborn as sns\n",
393 | "\n",
394 | "sns.kdeplot(df['value']);\n",
395 | "plt.grid(False)\n",
396 | "plt.axvline(0.134, 0, 1, c='black', ls='--')\n",
397 | "plt.tight_layout()"
398 | ]
399 | },
400 | {
401 | "cell_type": "code",
402 | "execution_count": 10,
403 | "id": "faf2f582",
404 | "metadata": {},
405 | "outputs": [
406 | {
407 | "name": "stdout",
408 | "output_type": "stream",
409 | "text": [
410 | "0.134\n",
411 | "0.0020000000000000018\n"
412 | ]
413 | }
414 | ],
415 | "source": [
416 | "from scipy.stats import median_abs_deviation\n",
417 | "\n",
418 | "mad = median_abs_deviation(df['value'])\n",
419 | "median = np.median(df['value'])\n",
420 | "\n",
421 | "print(median)\n",
422 | "print(mad)\n",
423 | "\n",
424 | "def compute_robust_z_score(x):\n",
425 | " return .6745*(x-median)/mad"
426 | ]
427 | },
428 | {
429 | "cell_type": "code",
430 | "execution_count": 11,
431 | "id": "bce12ea8",
432 | "metadata": {},
433 | "outputs": [
434 | {
435 | "data": {
436 | "text/html": [
437 | "\n",
438 | "\n",
451 | "
\n",
452 | " \n",
453 | " \n",
454 | " \n",
455 | " timestamp \n",
456 | " value \n",
457 | " is_anomaly \n",
458 | " z-score \n",
459 | " \n",
460 | " \n",
461 | " \n",
462 | " \n",
463 | " 0 \n",
464 | " 2014-02-14 14:30:00 \n",
465 | " 0.132 \n",
466 | " 1 \n",
467 | " -0.6745 \n",
468 | " \n",
469 | " \n",
470 | " 1 \n",
471 | " 2014-02-14 14:35:00 \n",
472 | " 0.134 \n",
473 | " 1 \n",
474 | " 0.0000 \n",
475 | " \n",
476 | " \n",
477 | " 2 \n",
478 | " 2014-02-14 14:40:00 \n",
479 | " 0.134 \n",
480 | " 1 \n",
481 | " 0.0000 \n",
482 | " \n",
483 | " \n",
484 | " 3 \n",
485 | " 2014-02-14 14:45:00 \n",
486 | " 0.134 \n",
487 | " 1 \n",
488 | " 0.0000 \n",
489 | " \n",
490 | " \n",
491 | " 4 \n",
492 | " 2014-02-14 14:50:00 \n",
493 | " 0.134 \n",
494 | " 1 \n",
495 | " 0.0000 \n",
496 | " \n",
497 | " \n",
498 | "
\n",
499 | "
"
500 | ],
501 | "text/plain": [
502 | " timestamp value is_anomaly z-score\n",
503 | "0 2014-02-14 14:30:00 0.132 1 -0.6745\n",
504 | "1 2014-02-14 14:35:00 0.134 1 0.0000\n",
505 | "2 2014-02-14 14:40:00 0.134 1 0.0000\n",
506 | "3 2014-02-14 14:45:00 0.134 1 0.0000\n",
507 | "4 2014-02-14 14:50:00 0.134 1 0.0000"
508 | ]
509 | },
510 | "execution_count": 11,
511 | "metadata": {},
512 | "output_type": "execute_result"
513 | }
514 | ],
515 | "source": [
516 | "df['z-score'] = df['value'].apply(compute_robust_z_score)\n",
517 | "\n",
518 | "df.head()"
519 | ]
520 | },
521 | {
522 | "cell_type": "code",
523 | "execution_count": 12,
524 | "id": "92f79fd2",
525 | "metadata": {},
526 | "outputs": [],
527 | "source": [
528 | "df['baseline'] = 1\n",
529 | "\n",
530 | "df.loc[df['z-score'] >= 3.5, 'baseline'] = -1\n",
531 | "df.loc[df['z-score'] <=-3.5, 'baseline'] = -1"
532 | ]
533 | },
534 | {
535 | "cell_type": "markdown",
536 | "id": "27fbafd8",
537 | "metadata": {},
538 | "source": [
539 | "### Evaluation "
540 | ]
541 | },
542 | {
543 | "cell_type": "code",
544 | "execution_count": 13,
545 | "id": "2a5e9438",
546 | "metadata": {},
547 | "outputs": [
548 | {
549 | "data": {
550 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAJOCAYAAAC5lbFHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBAklEQVR4nO3de3hU5bn+8XtyDiEZCCEnCIgKiHIQQSF4AkEglZO4C25sNliEWhSaDVR/ylZxV4h6VaBKRYqWUISi2wpapalQFEUOQjQqh8YDAYIQEiQkECCnWb8/IqNjADNMViZr1vdzXesqs+addz2TKj7cvOtdDsMwDAEAAAA2EeTvAgAAAIDGRAMMAAAAW6EBBgAAgK3QAAMAAMBWaIABAABgKzTAAAAAsBUaYAAAANgKDTAAAABsJcTfBTQ0l8ulQ4cOKTo6Wg6Hw9/lAACAJs4wDJ04cULJyckKCmr62eCZM2dUWVnZKNcKCwtTREREo1yrMQVcA3zo0CGlpKT4uwwAAGAxBQUFatu2rb/LuKAzZ86oQ/vmKiyqaZTrJSYmKj8/P+Ca4IBrgKOjoyVJ+z++RDHNm/6f4gA0nuufucffJQBogmoqzyhv6f+6e4imrLKyUoVFNdqfc4lios3tc8pOuNS+1z5VVlbSADd1Z5c9xDQPMv0fDADWEhweWL+BA2hYVlo62TzaoebR5tbrknV+Ht6iQwQAAICtBFwCDAAAEOhqDJdqDPOvEahIgAEAAGArJMAAAAAW45Ihl8yNgM2e359IgAEAAGArJMAAAAAW45JLZq/QNf8K/kMCDAAAAFshAQYAALCYGsNQjWHuGl2z5/cnEmAAAADYCgkwAACAxbALhG9IgAEAAGArJMAAAAAW45KhGhLgi0YCDAAAAFshAQYAALAY1gD7hgQYAAAAtkIDDAAAAFthCQQAAIDF8CAM35AAAwAAwFZIgAEAACzG9d1h9jUCFQkwAAAAbIUEGAAAwGJqGuFBGGbP708kwAAAALAVEmAAAACLqTFqD7OvEahIgAEAAGArJMAAAAAWwy4QviEBBgAAgK2QAAMAAFiMSw7VyGH6NQIVCTAAAABshQQYAADAYlxG7WH2NQIVCTAAAABshQQYAADAYmoaYQ2w2fP7EwkwAAAAbIUEGAAAwGJIgH1DAgwAAABbIQEGAACwGJfhkMsweR9gk+f3JxJgAAAA2AoJMAAAgMWwBtg3JMAAAACwFRJgAAAAi6lRkGpMzjFrTJ3dv0iAAQAAYCskwAAAABZjNMIuEAa7QAAAAACBgQQYAADAYtgFwjckwAAAALAVEmAAAACLqTGCVGOYvAuEYer0fkUCDAAAAFshAQYAALAYlxxymZxjuhS4ETAJMAAAAGyFBBgAAMBi2AXCNyTAAAAAsBUSYAAAAItpnF0gWAMMAAAABAQaYAAAANgKSyAAAAAspnYbNHNvUjN7fn8iAQYAAICtkAADAABYjEtBquFBGBeNBBgAAAC2QgIMAABgMWyD5hsSYAAAANgKCTAAAIDFuBQkF2uALxoJMAAAAGyFBBgAAMBiagyHagxz9+k1e35/IgEGAACArZAAAwAAWExNI+wDXMMaYAAAACAwkAADAABYjMsIksvkfYBd7AMMAAAABAYSYAAAAIthDbBvSIABAABgKyTAAAAAFuOS+fv0ukyd3b9IgAEAAGArJMAAAAAW41KQXCbnmGbP70+B+80AAACAcyABBgAAsJgaI0g1Ju8DbPb8/hS43wwAAAA4BxpgAAAAi3HJ0ShHfWVmZuraa69VdHS04uPjNWrUKOXl5XmMmTBhghwOh8fRt29fjzEVFRWaOnWq4uLiFBUVpREjRujgwYMeY0pKSpSeni6n0ymn06n09HQdP37cq58fDTAAAAB8snHjRt13333aunWr1q1bp+rqag0ePFjl5eUe44YOHarDhw+7j7Vr13q8n5GRodWrV2vVqlXatGmTTp48qWHDhqmmpsY9Zty4ccrNzVV2drays7OVm5ur9PR0r+plDTAAAIDFNLU1wNnZ2R6vly5dqvj4eOXk5Oimm25ynw8PD1diYuI55ygtLdVLL72k5cuXa9CgQZKkl19+WSkpKVq/fr2GDBmiPXv2KDs7W1u3blWfPn0kSUuWLFFqaqry8vLUuXPnetVLAgwAAIDzKisr8zgqKip+8jOlpaWSpNjYWI/z7733nuLj49WpUydNmjRJRUVF7vdycnJUVVWlwYMHu88lJyera9eu2rx5syRpy5Ytcjqd7uZXkvr27Sun0+keUx80wAAAABZTo6BGOSQpJSXFvd7W6XQqMzPzgrUZhqHp06frhhtuUNeuXd3n09LStGLFCm3YsEHPPPOMtm/frltuucXdUBcWFiosLEwtW7b0mC8hIUGFhYXuMfHx8XWuGR8f7x5THyyBAAAAwHkVFBQoJibG/To8PPyC4++//3599tln2rRpk8f5sWPHun/dtWtX9e7dW+3bt9fbb7+t0aNHn3c+wzDkcHx/Q94Pf32+MT+FBhgAAMBiXIZDLqP+Dd/FXkOSYmJiPBrgC5k6darefPNNvf/++2rbtu0FxyYlJal9+/b68ssvJUmJiYmqrKxUSUmJRwpcVFSkfv36ucccOXKkzlzFxcVKSEioV40SSyAAAADgI8MwdP/99+v111/Xhg0b1KFDh5/8zLfffquCggIlJSVJknr16qXQ0FCtW7fOPebw4cPauXOnuwFOTU1VaWmpPvroI/eYbdu2qbS01D2mPkiAAQAALMb1gzW6Zl6jvu677z6tXLlSb7zxhqKjo93rcZ1OpyIjI3Xy5EnNnj1bd9xxh5KSkrRv3z49/PDDiouL0+233+4eO3HiRM2YMUOtWrVSbGysZs6cqW7durl3hejSpYuGDh2qSZMmafHixZKkyZMna9iwYfXeAUKiAQYAAICPFi1aJEnq37+/x/mlS5dqwoQJCg4O1ueff66//OUvOn78uJKSkjRgwAC98sorio6Odo+fP3++QkJCNGbMGJ0+fVoDBw5UVlaWgoOD3WNWrFihadOmuXeLGDFihBYuXOhVvTTAAAAAFuMyguQyeR9gb+Y3DOOC70dGRuqf//znT84TERGh5557Ts8999x5x8TGxurll1+ud23nwhpgAAAA2AoNMAAAAGyFJRAAAAAWUyOHamTuNmhmz+9PJMAAAACwFRJgAAAAi2lqN8FZTeB+MwAAAOAcSIABAAAspkbmr9GtMXV2/yIBBgAAgK2QAAMAAFgMa4B9E7jfDAAAADgHEmAAAACLqTGCVGNyQmv2/P4UuN8MAAAAOAcSYAAAAIsx5JDL5F0gDJ4EBwAAAAQGEmAAAACLYQ2wbwL3mwEAAADnQAIMAABgMS7DIZdh7hpds+f3JxJgAAAA2AoJMAAAgMXUKEg1JueYZs/vT4H7zQAAAIBzIAEGAACwGNYA+4YEGAAAALZCAgwAAGAxLgXJZXKOafb8/hS43wwAAAA4BxJgAAAAi6kxHKoxeY2u2fP7EwkwAAAAbIUEGAAAwGLYBcI3JMAAAACwFRJgAAAAizGMILkMc3NMw+T5/SlwvxkAAABwDiTAAAAAFlMjh2pk8i4QJs/vTyTAAAAAsBUSYAAAAItxGebv0uAyTJ3er0iAAQAAYCskwAAAABbjaoRdIMye358C95sBAAAA50ADDAAAAFthCQSatFXPxevDtS1U8FW4wiJcurL3KU2cdUgpl1e4x5QUh+ilOcnK2Rit8tJgde17Uvc9cVBtLq30mGv3jmbKeipJ//64mUJCpcuuOq0nXv5a4ZGeq/wrKxz6zW2dtHd3pJ5/J0+XdT3dKN8VgHeuSTmk8X1y1SWxWPHRp/Tfrw3Vu192+MEIQ/fesEOjr96tmIgK7TyUoMx3btTXR2M95uneplD337RN3ZKLVO0KUt6RON336m2qqP7+P5E3XrZfk2/YoY6tv9XpqlB9XJCkGa8PbaRvCtTlkkMuk7cpM3t+f2pyCfD777+v4cOHKzk5WQ6HQ2vWrPF3SfCjz7Y01/AJR7XgrS+Vuepr1dRID//nZTpzqvYfXcOQHv9lBx3eH6bZS/fqj+/kKaFtpf7f2MvdY6Ta5nfWXZep100n9OzaL/Xc2jyNuLtYjnP8G/DSE8lqlVjVWF8RwEWKDK3SF0Wt9OQ7N57z/Ql9c/WL6z7Vk+/cqLuy7tDR8mZadOff1Szs+z8cd29TqD+OeVtb8lP0i2V36K6sO7Qqp6vH3fUDO3+tJ4b/S298doXG/HmMJiwfpX/s6mj69wNgniaXAJeXl6tHjx66++67dccdd/i7HPjZ3JV7PV7PmH9AY7t105efRapb33J9szdce3KitPjdf+uSzmckSfdnHtTY7l317uoWSrvrmCRp8ew2GjWxWGOnFrnn+nFCLEnbN0QrZ2O0HnkxX9s3xJj4zQD46sO97fXh3vbnedfQXdd+phc399KGLy6VJD3y1i3aMC1LaVd+qb/lXiVJmjnwQ/01p5uWbr3G/ckDJS3cvw52uPTAoA81f0Oq1nzWxX1+/7GWDf59AG/UGA7VmLwNmtnz+1OTa4DT0tKUlpbm7zLQRJWXBUuSolvUSJKqKmv/5QwLd7nHBAdLoaGGdm1vrrS7jun40RD9++Mo3XJ7iTKGd9Th/WFKubxCEx48rK59yt2fKykO0YLfpuixP+fXWRYBwFratDih1s1PaUt+W/e5qppg7TiQrKvbFupvuVepZbNT6t6mSGt3ddKy9NfVtmWZ8r9toYUb+yj3YJIkqUtisRJiymUYDq26+//Uqvkp5R1ppfkb+tVZSgHAOprcEgjgfAxD+tPsNrrqupO65IratDfl8jNKaFupP2cm6cTxYFVVOvTKc/E6VhSqY0dq/3x3eH+YJGn5vESl3fWt5qzYq8u7ndL/G3uZvtkb5p779xntdFv6t+rUgzW/gNXFRZ2SJB0rb+Zx/lh5pFpF1f473rZFmSTp3hu36/XcKzXlldv078LW+tN/vql2LY9Lktp8N+ZXN27Xks3XaNr//UwnzoTrxbveUEzEmUb6NkBdZ7dBM/sIVJb/ZhUVFSorK/M4EJj++HAb5e+J1EPP73efCwmVHnkxX998HaH/uLKbRlzWXZ9uaa5rbylTUG1YLNd34fDPfvGthtx5TJd3O617Hz+ktpdV6J+rWkmS3ngpTqdOBGns1CON/bUAmMj40V/mOBzS2VNB3/3t7t8+uVJvfH6F8o601u//db32HWuhkd3//d2Y2tEvbe6lf+Vdpj2FrfXo27fIkHTrFV83zpcA0OCa3BIIb2VmZurxxx/3dxkw2R9ntdGWd5x6ZvVXap3seYNax+6ntWh9nsrLglRV5VCLVjWadltHdepemwC1SqiWJLXv5JnWpFx+RkXfhEqScj+M1r8/jtKwS3p4jLk/rZNuGV2i3/7hgFlfDYAJjn6X/LZqfkpHy6Pc51s2O61j5ZGSpOKTtWN+vJQh/2hLJTlPfjcm6rsx36/5raoJ1jfHY5QUc9K8LwD8BJcc5j8KmV0gmq6HHnpIpaWl7qOgoMDfJaEBGYa08OE2+vAfTj39f18psV3dG9fOiopxqUWrGn2zN0xfftpMqUNq/zYgIaVSrRIrdfDrcI/x3+wNV3zb2mZ6yu8OatH6PC1aV3s8sbz25ruHX9inCQ8eNunbATDLN8ejVXyymVIvOeg+FxJUo97tDin3YKIk6VBptIpOROmSVsc9Pts+tlSHS5tLkvYUtlZFdbAuiT3uMU+y84QOl0Wb/j0AmMPyCXB4eLjCw8N/eiAsaeHDbfXu6paavXSvIpu7dKyo9h/ZqOga941q7//dKWerGsW3qVT+ngi98GhbpQ4tVa/+JyTV/pXnf/y6WMt/n6hLrzytS686rfX/F6uCryP0P0v2SdJ3jfD3yXJEVO26ieT2lXUSZwBNQ2Roldq1LHW/btOiTJ3jj6r0TLgKy6K1Ynt3Tez3sfaXOHXgmFP39PtYp6tC9I/dZ7cwc2jZth6694Yd+uJIK+UVxWl4tzxd0qpEM1cPliSVV4bptU+u1K9v3K4jJ5rrUGlzje+TK0l659+XNfI3Br5nNMI+wEYAJ8BNrgE+efKkvvrqK/fr/Px85ebmKjY2Vu3atfNjZfCHt5bFSZJ+e4fnnpsz5h/Q4LG1W5wdOxKqxbPb6PjREMXGV2vQz49pXIbnWt7Rk4pVdcahFx5roxPHg3XplWeU+devlXzJ+RNlAE3bVUlFevGuN92vZw7aLEl687POevTtW5S19WpFhFTr4SEfKCaiQp8fitevVw3Tqcow92dWbO+hsOAazRz0oZwRFfqiqJXuXTVcB4873WPmb0hVtStITwz/l8JDqrXzUIImrxyhE2cIXwCrchjGj28R8K/33ntPAwYMqHN+/PjxysrK+snPl5WVyel0quSLSxUTbfkVHgAa0NWZU/xdAoAmqKbijHYvflilpaWKiWnae8Cf7XPuWD9eoVFhP/0BH1SVV+pvg5ZZ4ufirSaXAPfv319NrCcHAABAAGlyDTAAAAAurDH26WUfYAAAACBAkAADAABYjMtohH2ATZ7fn0iAAQAAYCskwAAAABbjaoR9gHkSHAAAABAgSIABAAAshjXAviEBBgAAgK2QAAMAAFgMCbBvSIABAABgKyTAAAAAFkMC7BsSYAAAANgKCTAAAIDFkAD7hgQYAAAAtkICDAAAYDGGzH9Sm2Hq7P5FAgwAAABbIQEGAACwGNYA+4YEGAAAALZCAgwAAGAxJMC+IQEGAACArZAAAwAAWAwJsG9IgAEAAGArJMAAAAAWQwLsGxJgAAAA2AoNMAAAAGyFJRAAAAAWYxgOGSYvUTB7fn8iAQYAAICtkAADAABYjEsOuWTyTXAmz+9PJMAAAACwFRpgAAAAizm7DZrZR31lZmbq2muvVXR0tOLj4zVq1Cjl5eV5jDEMQ7Nnz1ZycrIiIyPVv39/7dq1y2NMRUWFpk6dqri4OEVFRWnEiBE6ePCgx5iSkhKlp6fL6XTK6XQqPT1dx48f9+rnRwMMAAAAn2zcuFH33Xeftm7dqnXr1qm6ulqDBw9WeXm5e8zTTz+tefPmaeHChdq+fbsSExN166236sSJE+4xGRkZWr16tVatWqVNmzbp5MmTGjZsmGpqatxjxo0bp9zcXGVnZys7O1u5ublKT0/3ql7WAAMAAFhMU9sFIjs72+P10qVLFR8fr5ycHN10000yDEMLFizQrFmzNHr0aEnSsmXLlJCQoJUrV+pXv/qVSktL9dJLL2n58uUaNGiQJOnll19WSkqK1q9fryFDhmjPnj3Kzs7W1q1b1adPH0nSkiVLlJqaqry8PHXu3Lle9ZIAAwAA4LzKyso8joqKip/8TGlpqSQpNjZWkpSfn6/CwkINHjzYPSY8PFw333yzNm/eLEnKyclRVVWVx5jk5GR17drVPWbLli1yOp3u5leS+vbtK6fT6R5THzTAAAAAFtOYa4BTUlLc622dTqcyMzMvWJthGJo+fbpuuOEGde3aVZJUWFgoSUpISPAYm5CQ4H6vsLBQYWFhatmy5QXHxMfH17lmfHy8e0x9sAQCAAAA51VQUKCYmBj36/Dw8AuOv//++/XZZ59p06ZNdd5zODyXVRiGUefcj/14zLnG12eeHyIBBgAAsJiza4DNPiQpJibG47hQAzx16lS9+eabevfdd9W2bVv3+cTEREmqk9IWFRW5U+HExERVVlaqpKTkgmOOHDlS57rFxcV10uULoQEGAACATwzD0P3336/XX39dGzZsUIcOHTze79ChgxITE7Vu3Tr3ucrKSm3cuFH9+vWTJPXq1UuhoaEeYw4fPqydO3e6x6Smpqq0tFQfffSRe8y2bdtUWlrqHlMfLIEAAACwGMPLfXov9hr1dd9992nlypV64403FB0d7U56nU6nIiMj5XA4lJGRoblz56pjx47q2LGj5s6dq2bNmmncuHHusRMnTtSMGTPUqlUrxcbGaubMmerWrZt7V4guXbpo6NChmjRpkhYvXixJmjx5soYNG1bvHSAkGmAAAAD4aNGiRZKk/v37e5xfunSpJkyYIEl64IEHdPr0aU2ZMkUlJSXq06eP3nnnHUVHR7vHz58/XyEhIRozZoxOnz6tgQMHKisrS8HBwe4xK1as0LRp09y7RYwYMUILFy70ql6HYRjGRXzPJqusrExOp1MlX1yqmGhWeAD43tWZU/xdAoAmqKbijHYvflilpaUeN3s1RWf7nJ6vTVdwswvfjOarmlMV+uQ/5lni5+ItOkQAAADYCksgAAAALMYlhxwydw2wy+T5/YkEGAAAALZCAgwAAGAxP9yn18xrBCoSYAAAANgKCTAAAIDFuAyHHCYntGbvM+xPJMAAAACwFRJgAAAAizGM2sPsawQqEmAAAADYCgkwAACAxbALhG9IgAEAAGArJMAAAAAWQwLsGxJgAAAA2AoJMAAAgMWwD7BvSIABAABgKyTAAAAAFsM+wL4hAQYAAICtkAADAABYTG0CbPYuEKZO71ckwAAAALAVGmAAAADYCksgAAAALIYHYfiGBBgAAAC2QgIMAABgMcZ3h9nXCFQkwAAAALAVEmAAAACLYQ2wb0iAAQAAYCskwAAAAFbDImCfkAADAADAVkiAAQAArKYR1gCLNcAAAABAYCABBgAAsBjDqD3MvkagIgEGAACArZAAAwAAWAz7APuGBBgAAAC2QgIMAABgNYbD/F0aSIABAACAwEACDAAAYDHsAuEbEmAAAADYCgkwAACA1RjfHWZfI0CRAAMAAMBWSIABAAAshn2AfUMCDAAAAFshAQYAALCiAF6jazYSYAAAANgKCTAAAIDFsAbYNyTAAAAAsBUSYAAAAKthH2CfkAADAADAVkiAAQAALMfx3WH2NQITCTAAAABshQQYAADAalgD7BMSYAAAANgKCTAAAIDVkAD7pF4N8LPPPlvvCadNm3bRxQAAAABmq1cDPH/+/HpN5nA4aIABAADMZjhqD7OvEaDq1QDn5+ebXQcAAADQKC76JrjKykrl5eWpurq6IesBAAAATOV1A3zq1ClNnDhRzZo101VXXaUDBw5Iql37++STTzZ4gQAAAPBkGI1zBCqvG+CHHnpIn376qd577z1FRES4zw8aNEivvPJKgxYHAAAANDSvt0Fbs2aNXnnlFfXt21cOx/eLo6+88kp9/fXXDVocAAAAzoFt0HzidQJcXFys+Pj4OufLy8s9GmIAAACgKfK6Ab722mv19ttvu1+fbXqXLFmi1NTUhqsMAAAA53Z2GzSzjwDl9RKIzMxMDR06VLt371Z1dbX+8Ic/aNeuXdqyZYs2btxoRo0AAABAg/E6Ae7Xr58+/PBDnTp1SpdddpneeecdJSQkaMuWLerVq5cZNQIAAOAHHEbjHIHK6wRYkrp166Zly5Y1dC0AAACA6S6qAa6pqdHq1au1Z88eORwOdenSRSNHjlRIyEVNBwAAAG+wC4RPvO5Yd+7cqZEjR6qwsFCdO3eWJH3xxRdq3bq13nzzTXXr1q3BiwQAAAAaitdrgO+55x5dddVVOnjwoD7++GN9/PHHKigoUPfu3TV58mQzagQAAMAPsQuET7xOgD/99FPt2LFDLVu2dJ9r2bKl5syZo2uvvbZBiwMAAAAamtcJcOfOnXXkyJE654uKinT55Zc3SFEAAAC4AKORjgBVrwa4rKzMfcydO1fTpk3Ta6+9poMHD+rgwYN67bXXlJGRoaeeesrsegEAAACf1GsJRIsWLTwec2wYhsaMGeM+Zxi1f0QYPny4ampqTCgTAAAAbuwC4ZN6NcDvvvuu2XUAAAAAjaJeDfDNN99sdh0AAACoLxJgn1z0kytOnTqlAwcOqLKy0uN89+7dfS4KAAAAMIvXDXBxcbHuvvtu/eMf/zjn+6wBBgAAMFlj7NMbwPsAe70NWkZGhkpKSrR161ZFRkYqOztby5YtU8eOHfXmm2+aUSMAAADQYLxOgDds2KA33nhD1157rYKCgtS+fXvdeuutiomJUWZmpm677TYz6gQAAMB3HEbtYfY1ApXXCXB5ebni4+MlSbGxsSouLpYkdevWTR9//HHDVgcAAABLeP/99zV8+HAlJyfL4XBozZo1Hu9PmDBBDofD4+jbt6/HmIqKCk2dOlVxcXGKiorSiBEjdPDgQY8xJSUlSk9Pl9PplNPpVHp6uo4fP+5VrRf1JLi8vDxJ0tVXX63Fixfrm2++0QsvvKCkpCRvpwMAAIC3muCT4MrLy9WjRw8tXLjwvGOGDh2qw4cPu4+1a9d6vJ+RkaHVq1dr1apV2rRpk06ePKlhw4Z53GM2btw45ebmKjs7W9nZ2crNzVV6erpXtXq9BCIjI0OHDx+WJD322GMaMmSIVqxYobCwMGVlZXk7HQAAAAJAWlqa0tLSLjgmPDxciYmJ53yvtLRUL730kpYvX65BgwZJkl5++WWlpKRo/fr1GjJkiPbs2aPs7Gxt3bpVffr0kSQtWbJEqampysvLU+fOnetVq9cN8F133eX+dc+ePbVv3z79+9//Vrt27RQXF+ftdAAAAGjCysrKPF6Hh4crPDz8ouZ67733FB8frxYtWujmm2/WnDlz3Etrc3JyVFVVpcGDB7vHJycnq2vXrtq8ebOGDBmiLVu2yOl0uptfSerbt6+cTqc2b95c7wbY6yUQP9asWTNdc801NL8AAAABKCUlxb3e1ul0KjMz86LmSUtL04oVK7RhwwY988wz2r59u2655RZVVFRIkgoLCxUWFqaWLVt6fC4hIUGFhYXuMWcb5h+Kj493j6mPeiXA06dPr/eE8+bNq/dYAAAAeM+hRtgF4rv/LSgoUExMjPv8xaa/Y8eOdf+6a9eu6t27t9q3b6+3335bo0ePPu/nDMOQw/H9nsQ//PX5xvyUejXAn3zySb0m8+bCAAAAaPpiYmI8GuCGkpSUpPbt2+vLL7+UJCUmJqqyslIlJSUeKXBRUZH69evnHnPkyJE6cxUXFyshIaHe165XA/zuu+/We8Km4vZO3RTiCPV3GQCakARt9ncJAJqgaqNKu/1dhLcC4Elw3377rQoKCty7iPXq1UuhoaFat26dxowZI0k6fPiwdu7cqaefflqSlJqaqtLSUn300Ue67rrrJEnbtm1TaWmpu0muD69vggMAAAB+7OTJk/rqq6/cr/Pz85Wbm6vY2FjFxsZq9uzZuuOOO5SUlKR9+/bp4YcfVlxcnG6//XZJktPp1MSJEzVjxgy1atVKsbGxmjlzprp16+beFaJLly4aOnSoJk2apMWLF0uSJk+erGHDhtX7BjiJBhgAAMB6LmKf3ou6hhd27NihAQMGuF+fvYds/PjxWrRokT7//HP95S9/0fHjx5WUlKQBAwbolVdeUXR0tPsz8+fPV0hIiMaMGaPTp09r4MCBysrKUnBwsHvMihUrNG3aNPduESNGjLjg3sPn4jAMI6AedFdWVian06n+GskSCAAA8JOqjSq9pzdUWlpqylrXhnS2z2mfOUdBERGmXst15oz2PzTLEj8Xb5EAAwAAWE0TTICtxOd9gAEAAAAruagGePny5br++uuVnJys/fv3S5IWLFigN954o0GLAwAAABqa1w3wokWLNH36dP3sZz/T8ePHVVNTI0lq0aKFFixY0ND1AQAA4EccRuMcgcrrBvi5557TkiVLNGvWLI878nr37q3PP/+8QYsDAAAAGprXN8Hl5+erZ8+edc6Hh4ervLy8QYoCAADABXATnE+8ToA7dOig3NzcOuf/8Y9/6Morr2yImgAAAADTeJ0A//a3v9V9992nM2fOyDAMffTRR/rrX/+qzMxMvfjii2bUCAAAgB8iAfaJ1w3w3Xffrerqaj3wwAM6deqUxo0bpzZt2ugPf/iD7rzzTjNqBAAAABrMRT0IY9KkSZo0aZKOHj0ql8ul+Pj4hq4LAAAA59EYuzQE8i4QPj0JLi4urqHqAAAAABqF1w1whw4d5HA4zvv+3r17fSoIAAAAP8Fw1B5mXyNAed0AZ2RkeLyuqqrSJ598ouzsbP32t79tqLoAAAAAU3jdAP/mN7855/k//vGP2rFjh88FAQAA4CewC4RPvN4H+HzS0tL0t7/9raGmAwAAAEzh001wP/Taa68pNja2oaYDAADAebALhG+8boB79uzpcROcYRgqLCxUcXGxnn/++QYtDgAAAGhoXjfAo0aN8ngdFBSk1q1bq3///rriiisaqi4AAACcD2uAfeJVA1xdXa1LLrlEQ4YMUWJiolk1AQAAAKbx6ia4kJAQ/frXv1ZFRYVZ9QAAAOCnGN+vAzbrCOQE2OtdIPr06aNPPvnEjFoAAAAA03m9BnjKlCmaMWOGDh48qF69eikqKsrj/e7duzdYcQAAADgH1gD7pN4N8C9/+UstWLBAY8eOlSRNmzbN/Z7D4ZBhGHI4HKqpqWn4KgEAAIAGUu8GeNmyZXryySeVn59vZj0AAAD4KSTAPql3A2wYtT+F9u3bm1YMAAAAYDav1gD/8AEYAAAA8A+eBOcbrxrgTp06/WQTfOzYMZ8KAgAAAMzkVQP8+OOPy+l0mlULAAAAYDqvGuA777xT8fHxZtUCAAAAmK7eDTDrfwEAAJoIdoHwSb2fBHd2FwgAAADAyuqdALtcLjPrAAAAQD2xC4Rv6p0AAwAAAIHAq5vgAAAA0EQEcEJrNhJgAAAA2AoJMAAAgNWwC4RPSIABAABgKzTAAAAAsBWWQAAAAFgM26D5hgQYAAAAtkICDAAAYDXcBOcTEmAAAADYCgkwAACAxbAG2DckwAAAALAVEmAAAACrYQ2wT0iAAQAAYCskwAAAAFZDAuwTEmAAAADYCgkwAACAxbALhG9IgAEAAGArJMAAAABWwxpgn5AAAwAAwFZIgAEAAKyGBNgnJMAAAACwFRJgAAAAi2EXCN+QAAMAAMBWSIABAACshjXAPiEBBgAAgK2QAAMAAFgMa4B9QwIMAAAAWyEBBgAAsBrWAPuEBBgAAAC2QgIMAABgNSTAPiEBBgAAgK2QAAMAAFiM47vD7GsEKhJgAAAA2AoJMAAAgNWwBtgnJMAAAACwFRJgAAAAi+FJcL4hAQYAAICtkAADAABYDWuAfUICDAAAAFshAQYAALCiAE5ozUYCDAAAAFuhAQYAAICtsAQCAADAYtgGzTckwAAAALAVEmAAAACrYRs0n5AAAwAAwGfvv/++hg8fruTkZDkcDq1Zs8bjfcMwNHv2bCUnJysyMlL9+/fXrl27PMZUVFRo6tSpiouLU1RUlEaMGKGDBw96jCkpKVF6erqcTqecTqfS09N1/Phxr2qlAQYAALCYs2uAzT68UV5erh49emjhwoXnfP/pp5/WvHnztHDhQm3fvl2JiYm69dZbdeLECfeYjIwMrV69WqtWrdKmTZt08uRJDRs2TDU1Ne4x48aNU25urrKzs5Wdna3c3Fylp6d7VStLIAAAAOCztLQ0paWlnfM9wzC0YMECzZo1S6NHj5YkLVu2TAkJCVq5cqV+9atfqbS0VC+99JKWL1+uQYMGSZJefvllpaSkaP369RoyZIj27Nmj7Oxsbd26VX369JEkLVmyRKmpqcrLy1Pnzp3rVSsJMAAAgNUYjXRIKisr8zgqKiq8Ljc/P1+FhYUaPHiw+1x4eLhuvvlmbd68WZKUk5OjqqoqjzHJycnq2rWre8yWLVvkdDrdza8k9e3bV06n0z2mPmiAAQAAcF4pKSnu9bZOp1OZmZlez1FYWChJSkhI8DifkJDgfq+wsFBhYWFq2bLlBcfEx8fXmT8+Pt49pj5YAgEAAGAxjbkPcEFBgWJiYtznw8PDL35Oh8PjtWEYdc792I/HnGt8feb5IRJgAAAAnFdMTIzHcTENcGJioiTVSWmLiorcqXBiYqIqKytVUlJywTFHjhypM39xcXGddPlCaIABAACsphHXADeEDh06KDExUevWrXOfq6ys1MaNG9WvXz9JUq9evRQaGuox5vDhw9q5c6d7TGpqqkpLS/XRRx+5x2zbtk2lpaXuMfXBEggAAAD47OTJk/rqq6/cr/Pz85Wbm6vY2Fi1a9dOGRkZmjt3rjp27KiOHTtq7ty5atasmcaNGydJcjqdmjhxombMmKFWrVopNjZWM2fOVLdu3dy7QnTp0kVDhw7VpEmTtHjxYknS5MmTNWzYsHrvACHRAAMAAFhPE3wS3I4dOzRgwAD36+nTp0uSxo8fr6ysLD3wwAM6ffq0pkyZopKSEvXp00fvvPOOoqOj3Z+ZP3++QkJCNGbMGJ0+fVoDBw5UVlaWgoOD3WNWrFihadOmuXeLGDFixHn3Hj4fh2EYAfWgu7KyMjmdTvXXSIU4Qv1dDgAAaOKqjSq9pzdUWlrqcbNXU3S2z+k+Ya6CwyJMvVZN5Rl9lvWwJX4u3iIBBgAAsJjG3AUiEHETHAAAAGyFBBgAAMBqmuAaYCshAQYAAICtkAADAABYjMMw5DB5HwOz5/cnEmAAAADYCgkwAACA1bAG2CckwAAAALAVEmAAAACLYR9g35AAAwAAwFZIgAEAAKyGNcA+IQEGAACArZAAAwAAWAxrgH1DAgwAAABbIQEGAACwGtYA+4QEGAAAALZCAgwAAGAxrAH2DQkwAAAAbIUEGAAAwGpYA+wTEmAAAADYCg0wAAAAbIUlEAAAABYUyDepmY0EGAAAALZCAgwAAGA1hlF7mH2NAEUCDAAAAFshAQYAALAYHoThGxJgAAAA2AoJMAAAgNXwIAyfkAADAADAVkiAAQAALMbhqj3MvkagIgEGAACArZAAAwAAWA1rgH1CAgwAAABbIQFGwBo2/qh+/utixcZXaf8XEXrh0WTt/Ki5v8sC4Edj7z+i639WqpTLK1R5Jki7dzTTS3OSdPDrCH+XBniFfYB9QwKMgHTziBLd+/gh/fXZeE0Z3Ek7t0XpiRX5at2m0t+lAfCj7qnl+ntWnDKGddRDd16q4GBDc/+6V+GRNf4uDUAjalIN8Ouvv64hQ4YoLi5ODodDubm5/i4JFjV68lH986+xyl7ZSgVfReiFx9qo+FCohv3Xt/4uDYAfzbrrUq17NVb7v4jQ3t2Reua/2ymhbZU6dj/t79IA7xhG4xwBqkk1wOXl5br++uv15JNP+rsUWFhIqEsdu59SzsZoj/M5G6N1Ze9yP1UFoCmKiqlNfk8cD/ZzJQAaU5NaA5yeni5J2rdvn38LgaXFxNYoOEQ6ftTzH+/jxSFqGV/tp6oAND2GJs8+pJ3borQ/L9LfxQBeYQ2wb5pUA3wxKioqVFFR4X5dVlbmx2rQlPz4b24cDgX0li4AvHPf3G/UoctpzRh1ub9LAdDImtQSiIuRmZkpp9PpPlJSUvxdEvys7Fiwaqqllq09015nXLVKii3/Zz4ADWDKEweVOrhMD/zHZTp6OMzf5QDeMxrpCFB+a4BXrFih5s2bu48PPvjgouZ56KGHVFpa6j4KCgoauFJYTXVVkL78rJmuuemEx/lrbjqh3Tui/FQVgKbB0H1zDur6tFI98PPLdKQg3N8FAfADv8VhI0aMUJ8+fdyv27Rpc1HzhIeHKzyc38Dg6fU/xem3zxboi88itWdHlH72i28V36ZKb/+llb9LA+BH98/9RgNuL9Hsuzvo9MkgtWxdJUkqPxGsyjOW/0tR2AhrgH3jtwY4Ojpa0dHRPz0QuAgb32yp6JY1uuu/jyg2vlr78yL0P7/ooKJv+KtOwM6GT6jdCvH3r3/tcf73GSla92qsP0oC4AdNakHksWPHdODAAR06dEiSlJeXJ0lKTExUYmKiP0uDBb21LE5vLYvzdxkAmpAhyT38XQLQMBpjn172AW4cb775pnr27KnbbrtNknTnnXeqZ8+eeuGFF/xcGQAAAAJFk0qAJ0yYoAkTJvi7DAAAgCaNNcC+aVIJMAAAAGC2JpUAAwAAoB4aY59eEmAAAAAgMJAAAwAAWAxrgH1DAgwAAABbIQEGAACwGpdRe5h9jQBFAgwAAABbIQEGAACwGnaB8AkJMAAAAGyFBhgAAAC2whIIAAAAi3GoEbZBM3d6vyIBBgAAgK2QAAMAAFiNYdQeZl8jQJEAAwAAwFZIgAEAACyGRyH7hgQYAAAAtkICDAAAYDU8CMMnJMAAAACwFRJgAAAAi3EYhhwm79Jg9vz+RAIMAAAAWyEBBgAAsBrXd4fZ1whQJMAAAACwFRJgAAAAi2ENsG9IgAEAAGArJMAAAABWwz7APiEBBgAAgK2QAAMAAFiNYdQeZl8jQJEAAwAAwFZIgAEAACzGYdQeZl8jUJEAAwAAwFZIgAEAAKyGNcA+IQEGAACAT2bPni2Hw+FxJCYmut83DEOzZ89WcnKyIiMj1b9/f+3atctjjoqKCk2dOlVxcXGKiorSiBEjdPDgQVPqpQEGAACwGIercQ5vXHXVVTp8+LD7+Pzzz93vPf3005o3b54WLlyo7du3KzExUbfeeqtOnDjhHpORkaHVq1dr1apV2rRpk06ePKlhw4appqamoX5sbiyBAAAAgM9CQkI8Ut+zDMPQggULNGvWLI0ePVqStGzZMiUkJGjlypX61a9+pdLSUr300ktavny5Bg0aJEl6+eWXlZKSovXr12vIkCENWisJMAAAgNWcXQNs9uGFL7/8UsnJyerQoYPuvPNO7d27V5KUn5+vwsJCDR482D02PDxcN998szZv3ixJysnJUVVVlceY5ORkde3a1T2mIZEAAwAA4LzKyso8XoeHhys8PNzjXJ8+ffSXv/xFnTp10pEjR/TEE0+oX79+2rVrlwoLCyVJCQkJHp9JSEjQ/v37JUmFhYUKCwtTy5Yt64w5+/mGRAIMAABgNUYjHZJSUlLkdDrdR2ZmZp1y0tLSdMcdd6hbt24aNGiQ3n77bUm1Sx3Ocjgcnl/BMOqcq/M16zHmYpAAAwAA4LwKCgoUExPjfv3j9PdcoqKi1K1bN3355ZcaNWqUpNqUNykpyT2mqKjInQonJiaqsrJSJSUlHilwUVGR+vXr10Df5HskwAAAABbjMIxGOSQpJibG46hPA1xRUaE9e/YoKSlJHTp0UGJiotatW+d+v7KyUhs3bnQ3t7169VJoaKjHmMOHD2vnzp2mNMAkwAAAAPDJzJkzNXz4cLVr105FRUV64oknVFZWpvHjx8vhcCgjI0Nz585Vx44d1bFjR82dO1fNmjXTuHHjJElOp1MTJ07UjBkz1KpVK8XGxmrmzJnuJRUNjQYYAADAaprYk+AOHjyo//zP/9TRo0fVunVr9e3bV1u3blX79u0lSQ888IBOnz6tKVOmqKSkRH369NE777yj6Oho9xzz589XSEiIxowZo9OnT2vgwIHKyspScHBwg381h2EE1nPuysrK5HQ61V8jFeII9Xc5AACgias2qvSe3lBpaanHWtem6GyfM6DXQwoJiTD1WtXVZ/RuTqYlfi7eIgEGAACwGkOSl09qu6hrBChuggMAAICtkAADAABYzA93aTDzGoGKBBgAAAC2QgMMAAAAW2EJBAAAgNUYaoRt0Myd3p9IgAEAAGArJMAAAABW08QehGE1JMAAAACwFRJgAAAAq3FJcjTCNQIUCTAAAABshQQYAADAYngQhm9IgAEAAGArJMAAAABWwy4QPiEBBgAAgK2QAAMAAFgNCbBPSIABAABgKyTAAAAAVkMC7BMSYAAAANgKCTAAAIDV8CQ4n5AAAwAAwFZIgAEAACyGJ8H5hgQYAAAAtkICDAAAYDXsAuETEmAAAADYCgkwAACA1bgMyWFyQusiAQYAAAACAgkwAACA1bAG2CckwAAAALAVEmAAAADLaYQEWCTAAAAAQEAgAQYAALAa1gD7hAQYAAAAtkICDAAAYDUuQ6av0WUfYAAAACAwkAADAABYjeGqPcy+RoAiAQYAAICtkAADAABYDbtA+IQEGAAAALZCAwwAAABbYQkEAACA1bANmk9IgAEAAGArJMAAAABWw01wPiEBBgAAgK2QAAMAAFiNoUZIgM2d3p9IgAEAAGArJMAAAABWwxpgn5AAAwAAwFZIgAEAAKzG5ZLkaoRrBCYSYAAAANgKCTAAAIDVsAbYJyTAAAAAsBUSYAAAAKshAfYJCTAAAABshQQYAADAalyGTH9Um4sEGAAAAAgIJMAAAAAWYxguGYa5+/SaPb8/kQADAADAVkiAAQAArMYwzF+jyy4QAAAAQGAgAQYAALAaoxF2gSABBgAAAAIDCTAAAIDVuFySw+RdGtgFAgAAAAgMJMAAAABWwxpgn5AAAwAAwFZIgAEAACzGcLlkmLwGmCfBAQAAAAGCBBgAAMBqWAPsExJgAAAA2AoJMAAAgNW4DMlBAnyxSIABAABgKyTAAAAAVmMYksx+EhwJMAAAABAQSIABAAAsxnAZMkxeA2yQAAMAAACBgQYYAAAAtsISCAAAAKsxXDL/JjgehQwAAABc0PPPP68OHTooIiJCvXr10gcffODvks6JBhgAAMBiDJfRKIc3XnnlFWVkZGjWrFn65JNPdOONNyotLU0HDhww6adw8WiAAQAA4LN58+Zp4sSJuueee9SlSxctWLBAKSkpWrRokb9Lq4MGGAAAwGoMV+Mc9VRZWamcnBwNHjzY4/zgwYO1efPmhv72Pgu4m+DO7llXrSopcLevAwAADaRaVZKste9tY/Q5Z38uZWVlHufDw8MVHh7uce7o0aOqqalRQkKCx/mEhAQVFhaaW+hFCLgG+MSJE5KkTVrr50oAAICVnDhxQk6n099lXFBYWJgSExO1qbBx+pzmzZsrJSXF49xjjz2m2bNnn3O8w+HweG0YRp1zTUHANcDJyckqKChQdHR0k/yBo3GVlZUpJSVFBQUFiomJ8Xc5AJoIfm/ADxmGoRMnTig5OdnfpfykiIgI5efnq7KyslGud64G9sfpryTFxcUpODi4TtpbVFRUJxVuCgKuAQ4KClLbtm39XQaamJiYGP4jB6AOfm/AWU09+f2hiIgIRURE+LsMD2FhYerVq5fWrVun22+/3X1+3bp1GjlypB8rO7eAa4ABAADQ+KZPn6709HT17t1bqamp+tOf/qQDBw7o3nvv9XdpddAAAwAAwGdjx47Vt99+q//93//V4cOH1bVrV61du1bt27f3d2l10AAjoIWHh+uxxx4753olAPbF7w2AOaZMmaIpU6b4u4yf5DCstOcHAAAA4CMehAEAAABboQEGAACArdAAAwAAwFZogBGQ3n//fQ0fPlzJyclyOBxas2aNv0sC0IS8/vrrGjJkiOLi4uRwOJSbm+vvkgA0IhpgBKTy8nL16NFDCxcu9HcpAJqg8vJyXX/99XryySf9XQoAP2AbNASktLQ0paWl+bsMAE1Uenq6JGnfvn3+LQSAX5AAAwAAwFZogAEAAGArNMAAgIC2YsUKNW/e3H188MEH/i4JgJ+xBhgAENBGjBihPn36uF+3adPGj9UAaApogAEAAS06OlrR0dH+LgNAE0IDjIB08uRJffXVV+7X+fn5ys3NVWxsrNq1a+fHygA0BceOHdOBAwd06NAhSVJeXp4kKTExUYmJif4sDUAjcBiGYfi7CKChvffeexowYECd8+PHj1dWVlbjFwSgScnKytLdd99d5/xjjz2m2bNnN35BABoVDTAAAABshV0gAAAAYCs0wAAAALAVGmAAAADYCg0wAAAAbIUGGAAAALZCAwwAAABboQEGAACArdAAAwAAwFZogAE0KbNnz9bVV1/tfj1hwgSNGjWq0evYt2+fHA6HcnNzzzvmkksu0YIFC+o9Z1ZWllq0aOFzbQ6HQ2vWrPF5HgCwKxpgAD9pwoQJcjgccjgcCg0N1aWXXqqZM2eqvLzc9Gv/4Q9/qPfjq+vTtAIAEOLvAgBYw9ChQ7V06VJVVVXpgw8+0D333KPy8nItWrSoztiqqiqFhoY2yHWdTmeDzAMAwFkkwADqJTw8XImJiUpJSdG4ceN01113uf8a/uyyhT//+c+69NJLFR4eLsMwVFpaqsmTJys+Pl4xMTG65ZZb9Omnn3rM++STTyohIUHR0dGaOHGizpw54/H+j5dAuFwuPfXUU7r88ssVHh6udu3aac6cOZKkDh06SJJ69uwph8Oh/v37uz+3dOlSdenSRREREbriiiv0/PPPe1zno48+Us+ePRUREaHevXvrk08+8fpnNG/ePHXr1k1RUVFKSUnRlClTdPLkyTrj1qxZo06dOikiIkK33nqrCgoKPN7/+9//rl69eikiIkKXXnqpHn/8cVVXV3tdDwDg3GiAAVyUyMhIVVVVuV9/9dVXevXVV/W3v/3NvQThtttuU2FhodauXaucnBxdc801GjhwoI4dOyZJevXVV/XYY49pzpw52rFjh5KSkuo0pj/20EMP6amnntIjjzyi3bt3a+XKlUpISJBU28RK0vr163X48GG9/vrrkqQlS5Zo1qxZmjNnjvbs2aO5c+fqkUce0bJlyyRJ5eXlGjZsmDp37qycnBzNnj1bM2fO9PpnEhQUpGeffVY7d+7UsmXLtGHDBj3wwAMeY06dOqU5c+Zo2bJl+vDDD1VWVqY777zT/f4///lP/eIXv9C0adO0e/duLV68WFlZWe4mHwDQAAwA+Anjx483Ro4c6X69bds2o1WrVsaYMWMMwzCMxx57zAgNDTWKiorcY/71r38ZMTExxpkzZzzmuuyyy4zFixcbhmEYqampxr333uvxfp8+fYwePXqc89plZWVGeHi4sWTJknPWmZ+fb0gyPvnkE4/zKSkpxsqVKz3O/e53vzNSU1MNwzCMxYsXG7GxsUZ5ebn7/UWLFp1zrh9q3769MX/+/PO+/+qrrxqtWrVyv166dKkhydi6dav73J49ewxJxrZt2wzDMIwbb7zRmDt3rsc8y5cvN5KSktyvJRmrV68+73UBABfGGmAA9fLWW2+pefPmqq6uVlVVlUaOHKnnnnvO/X779u3VunVr9+ucnBydPHlSrVq18pjn9OnT+vrrryVJe/bs0b333uvxfmpqqt59991z1rBnzx5VVFRo4MCB9a67uLhYBQUFmjhxoiZNmuQ+X11d7V5fvGfPHvXo0UPNmjXzqMNb7777rubOnavdu3errKxM1dXVOnPmjMrLyxUVFSVJCgkJUe/evd2fueKKK9SiRQvt2bNH1113nXJycrR9+3aPxLempkZnzpzRqVOnPGoEAFwcGmAA9TJgwAAtWrRIoaGhSk5OrnOT29kG7yyXy6WkpCS99957dea62K3AIiMjvf6My+WSVLsMok+fPh7vBQcHS5IMw7ioen5o//79+tnPfqZ7771Xv/vd7xQbG6tNmzZp4sSJHktFpNptzH7s7DmXy6XHH39co0ePrjMmIiLC5zoBADTAAOopKipKl19+eb3HX3PNNSosLFRISIguueSSc47p0qWLtm7dqv/6r/9yn9u6det55+zYsaMiIyP1r3/9S/fcc0+d98PCwiTVJqZnJSQkqE2bNtq7d6/uuuuuc8575ZVXavny5Tp9+rS7yb5QHeeyY8cOVVdX65lnnlFQUO3tFa+++mqdcdXV1dqxY4euu+46SVJeXp6OHz+uK664QlLtzy0vL8+rnzUAwDs0wABMMWjQIKWmpmrUqFF66qmn1LlzZx06dEhr167VqFGj1Lt3b/3mN7/R+PHj1bt3b91www1asWKFdu3apUsvvfScc0ZEROjBBx/UAw88oLCwMF1//fUqLi7Wrl27NHHiRMXHxysyMlLZ2dlq27atIiIi5HQ6NXv2bE2bNk0xMTFKS0tTRUWFduzYoZKSEk2fPl3jxo3TrFmzNHHiRP3P//yP9u3bp9///vdefd/LLrtM1dXVeu655zR8+HB9+OGHeuGFF+qMCw0N1dSpU/Xss88qNDRU999/v/r27etuiB999FENGzZMKSkp+vnPf66goCB99tln+vzzz/XEE094/38EAKAOdoEAYAqHw6G1a9fqpptu0i9/+Ut16tRJd955p/bt2+fetWHs2LF69NFH9eCDD6pXr17av3+/fv3rX19w3kceeUQzZszQo48+qi5dumjs2LEqKiqSVLu+9tlnn9XixYuVnJyskSNHSpLuuecevfjii8rKylK3bt108803Kysry71tWvPmzfX3v/9du3fvVs+ePTVr1iw99dRTXn3fq6++WvPmzdNTTz2lrl27asWKFcrMzKwzrlmzZnrwwQc1btw4paamKjIyUqtWrXK/P2TIEL311ltat26drr32WvXt21fz5s1T+/btvaoHAHB+DqMhFr8BAAAAFkECDAAAAFuhAQYAAICt0AADAADAVmiAAQAAYCs0wAAAALAVGmAAAADYCg0wAAAAbIUGGAAAALZCAwwAAABboQEGAACArdAAAwAAwFZogAEAAGAr/x9/TR1/YuKaDwAAAABJRU5ErkJggg==\n",
551 | "text/plain": [
552 | ""
553 | ]
554 | },
555 | "metadata": {},
556 | "output_type": "display_data"
557 | }
558 | ],
559 | "source": [
560 | "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
561 | "\n",
562 | "cm = confusion_matrix(df['is_anomaly'], df['baseline'], labels=[1, -1])\n",
563 | "\n",
564 | "disp_cm = ConfusionMatrixDisplay(cm, display_labels=[1, -1])\n",
565 | "\n",
566 | "disp_cm.plot();\n",
567 | "\n",
568 | "plt.grid(False)\n",
569 | "plt.tight_layout()"
570 | ]
571 | },
572 | {
573 | "cell_type": "markdown",
574 | "id": "5ea210c8",
575 | "metadata": {},
576 | "source": [
577 | "## Isolation forest "
578 | ]
579 | },
580 | {
581 | "cell_type": "code",
582 | "execution_count": 14,
583 | "id": "85431508",
584 | "metadata": {},
585 | "outputs": [],
586 | "source": [
587 | "from sklearn.ensemble import IsolationForest"
588 | ]
589 | },
590 | {
591 | "cell_type": "code",
592 | "execution_count": 15,
593 | "id": "fedb4d9d",
594 | "metadata": {},
595 | "outputs": [],
596 | "source": [
597 | "train = df[:3550]\n",
598 | "test = df[3550:]"
599 | ]
600 | },
601 | {
602 | "cell_type": "code",
603 | "execution_count": 16,
604 | "id": "5703fff9",
605 | "metadata": {},
606 | "outputs": [
607 | {
608 | "data": {
609 | "text/html": [
610 | "IsolationForest(contamination=0.00028169014084507044, random_state=42) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. "
611 | ],
612 | "text/plain": [
613 | "IsolationForest(contamination=0.00028169014084507044, random_state=42)"
614 | ]
615 | },
616 | "execution_count": 16,
617 | "metadata": {},
618 | "output_type": "execute_result"
619 | }
620 | ],
621 | "source": [
622 | "contamination = 1/len(train)\n",
623 | "\n",
624 | "iso_forest = IsolationForest(contamination=contamination, random_state=42)\n",
625 | "\n",
626 | "X_train = train['value'].values.reshape(-1,1)\n",
627 | "\n",
628 | "iso_forest.fit(X_train)"
629 | ]
630 | },
631 | {
632 | "cell_type": "code",
633 | "execution_count": 17,
634 | "id": "18da3719",
635 | "metadata": {},
636 | "outputs": [],
637 | "source": [
638 | "preds_iso_forest = iso_forest.predict(test['value'].values.reshape(-1,1))"
639 | ]
640 | },
641 | {
642 | "cell_type": "markdown",
643 | "id": "cfe72649",
644 | "metadata": {},
645 | "source": [
646 | "### Evaluation "
647 | ]
648 | },
649 | {
650 | "cell_type": "code",
651 | "execution_count": 18,
652 | "id": "d9e38d0d",
653 | "metadata": {},
654 | "outputs": [
655 | {
656 | "data": {
657 | "image/png": "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AAAA382lCJyWYO/ytgmpud25c2dIi7lcpv4YAAAA4AQhNbdvvvmm3XW0uZ/06a9YV1y0ywAAAGh7PKEsqLCPAgMAAADaq1Z/oQwAAAARFolzaA0955bkFgAAAI5BcgsAAGAaktugSG4BAADgGGfU3D711FO68sorlZ2drYMHD0qSVqxYoZdeeqlNiwMAAADCEXZzu2rVKs2ePVvXXHONvv76a3m9XknSWWedpRUrVrR1fQAAAPgGlxWZy0RhN7cPP/ywHn/8cc2fP18dOnTwjw8ePFi7d+9u0+IAAACAcIT9hbKSkhINGjSo2bjb7VZtbW2bFAUAAIBvwRfKggo7ue3Zs6d27drVbPy1115T375926ImAAAA4IyEndzefffduv3223XixAlZlqW//vWveuaZZ1RQUKA//OEPdtQIAACA05HcBhV2c3vzzTerqalJ8+bN0/HjxzVlyhR17dpVDz74oG644QY7agQAAABCckYPcbj11lt166236ssvv5TP51NmZmZb1wUAAIAgInGagamnJbTqCWUZGRltVQcAAADQamE3tz179pTL5Qr6/meffdaqggAAAPAdLNfJy+57GCjs5jYvLy/gdWNjo3bu3KkNGzbo7rvvbqu6AAAAgLCF3dzeddddLY7/93//t3bs2NHqggAAAPAdOC0hqLDPuQ1m7NixeuGFF9pqOQAAACBsrfpC2emef/55paent9VyAAAACILTEoILu7kdNGhQwBfKLMtSWVmZjh07pkceeaRNiwMAAADCEXZze9111wW8jomJ0dlnn63hw4frggsuaKu6AAAAEAx7boMKq7ltamrSOeecozFjxsjj8dhVEwAAAHBGwvpCWWxsrH75y1+qvr7ernoAAADwXax/7bu16zI1uQ37tIQhQ4Zo586ddtQCAAAAtErYe25nzpypOXPm6PDhw8rNzVVycnLA+wMGDGiz4gAAANAC9twGFXJz+/Of/1wrVqzQ9ddfL0m68847/e+5XC5ZliWXyyWv19v2VQIAAAAhCLm5LSoq0pIlS1RSUmJnPQAAAPguJLdBhdzcWtbJX2GPHj1sKwYAAABojbD23J7+8AYAAABEB08oCy6s5rZPnz7f2eB+9dVXrSoIAAAAOFNhNbeLFi1SWlqaXbUAAAAArRJWc3vDDTcoMzPTrloAAACAVgm5uWW/LQAAQDvBaQlB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\n",
658 | "text/plain": [
659 | ""
660 | ]
661 | },
662 | "metadata": {},
663 | "output_type": "display_data"
664 | }
665 | ],
666 | "source": [
667 | "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
668 | "\n",
669 | "cm = confusion_matrix(test['is_anomaly'], preds_iso_forest, labels=[1, -1])\n",
670 | "\n",
671 | "disp_cm = ConfusionMatrixDisplay(cm, display_labels=[1, -1])\n",
672 | "\n",
673 | "disp_cm.plot();\n",
674 | "\n",
675 | "plt.grid(False)\n",
676 | "plt.tight_layout()"
677 | ]
678 | },
679 | {
680 | "cell_type": "markdown",
681 | "id": "a6648be1",
682 | "metadata": {},
683 | "source": [
684 | "## Local outlier factor (LOF) "
685 | ]
686 | },
687 | {
688 | "cell_type": "code",
689 | "execution_count": 19,
690 | "id": "87188535",
691 | "metadata": {},
692 | "outputs": [
693 | {
694 | "data": {
695 | "text/html": [
696 | "LocalOutlierFactor(contamination=0.00028169014084507044, novelty=True) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. "
697 | ],
698 | "text/plain": [
699 | "LocalOutlierFactor(contamination=0.00028169014084507044, novelty=True)"
700 | ]
701 | },
702 | "execution_count": 19,
703 | "metadata": {},
704 | "output_type": "execute_result"
705 | }
706 | ],
707 | "source": [
708 | "from sklearn.neighbors import LocalOutlierFactor\n",
709 | "\n",
710 | "lof = LocalOutlierFactor(contamination=contamination, novelty=True)\n",
711 | "\n",
712 | "lof.fit(X_train)"
713 | ]
714 | },
715 | {
716 | "cell_type": "code",
717 | "execution_count": 20,
718 | "id": "5441f006",
719 | "metadata": {},
720 | "outputs": [],
721 | "source": [
722 | "preds_lof = lof.predict(test['value'].values.reshape(-1,1))"
723 | ]
724 | },
725 | {
726 | "cell_type": "code",
727 | "execution_count": 21,
728 | "id": "598a300e",
729 | "metadata": {},
730 | "outputs": [
731 | {
732 | "data": {
733 | "image/png": "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\n",
734 | "text/plain": [
735 | ""
736 | ]
737 | },
738 | "metadata": {},
739 | "output_type": "display_data"
740 | }
741 | ],
742 | "source": [
743 | "cm = confusion_matrix(test['is_anomaly'], preds_lof, labels=[1, -1])\n",
744 | "\n",
745 | "disp_cm = ConfusionMatrixDisplay(cm, display_labels=[1, -1])\n",
746 | "\n",
747 | "disp_cm.plot();"
748 | ]
749 | },
750 | {
751 | "cell_type": "code",
752 | "execution_count": null,
753 | "id": "530af617",
754 | "metadata": {},
755 | "outputs": [],
756 | "source": []
757 | }
758 | ],
759 | "metadata": {
760 | "kernelspec": {
761 | "display_name": "Python 3 (ipykernel)",
762 | "language": "python",
763 | "name": "python3"
764 | },
765 | "language_info": {
766 | "codemirror_mode": {
767 | "name": "ipython",
768 | "version": 3
769 | },
770 | "file_extension": ".py",
771 | "mimetype": "text/x-python",
772 | "name": "python",
773 | "nbconvert_exporter": "python",
774 | "pygments_lexer": "ipython3",
775 | "version": "3.9.16"
776 | }
777 | },
778 | "nbformat": 4,
779 | "nbformat_minor": 5
780 | }
781 |
--------------------------------------------------------------------------------