Format: application/octet-stream
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 2,
6 "id": "75a7336a",
7 "metadata": {},
8 "outputs": [],
9 "source": [
10 "%matplotlib notebook\n",
11 "import numpy as np\n",
12 "import pandas as pd\n",
13 "import seaborn as sns\n",
14 "import matplotlib.pyplot as plt\n",
15 "\n",
16 "from sklearn.model_selection import train_test_split\n",
17 "from sklearn.neighbors import KNeighborsClassifier\n",
18 "\n",
19 "#np.set_printoptions(precision=2)\n",
20 "\n",
21 "\n",
22 "fruits = pd.read_table('Source/readonly/fruit_data_with_colors.txt')\n",
23 "\n",
24 "feature_names_fruits = ['height', 'width', 'mass', 'color_score']"
25 ]
26 },
27 {
28 "cell_type": "code",
29 "execution_count": 3,
30 "id": "8615abad",
31 "metadata": {},
32 "outputs": [],
33 "source": [
34 "features= fruits[feature_names_fruits]\n",
35 "label= fruits.fruit_label"
36 ]
37 },
38 {
39 "cell_type": "code",
40 "execution_count": 4,
41 "id": "9acc60c5",
42 "metadata": {},
43 "outputs": [],
44 "source": [
45 "target_names_fruits = ['apple', 'mandarin', 'orange', 'lemon']"
46 ]
47 },
48 {
49 "cell_type": "code",
50 "execution_count": 5,
51 "id": "2dbdcb8c",
52 "metadata": {},
53 "outputs": [],
54 "source": [
55 "X_train, X_test, y_train, y_test = train_test_split(features, label, random_state=0)"
56 ]
57 },
58 {
59 "cell_type": "code",
60 "execution_count": 6,
61 "id": "9f3b8682",
62 "metadata": {},
63 "outputs": [],
64 "source": [
65 "from sklearn.preprocessing import MinMaxScaler\n",
66 "scaler = MinMaxScaler()\n",
67 "X_train_scaled = scaler.fit_transform(X_train)\n",
68 "X_test_scaled = scaler.transform(X_test)"
69 ]
70 },
71 {
72 "cell_type": "code",
73 "execution_count": 7,
74 "id": "5a9dce41",
75 "metadata": {},
76 "outputs": [
77 {
78 "name": "stdout",
79 "output_type": "stream",
80 "text": [
81 "train 0.9545454545454546\n",
82 "test 1.0\n",
83 "orange\n"
84 ]
85 }
86 ],
87 "source": [
88 "knn = KNeighborsClassifier(n_neighbors = 5)\n",
89 "knn.fit(X_train_scaled, y_train)\n",
90 "\n",
91 "\n",
92 "print('train',knn.score(X_train_scaled, y_train))\n",
93 "print('test',knn.score(X_test_scaled, y_test))\n",
94 "\n",
95 "example_fruit = [[5.5, 2.2, 10, 0.70]]\n",
96 "\n",
97 "\n",
98 "print(target_names_fruits[knn.predict(example_fruit)[0]-1])"
99 ]
100 },
101 {
102 "cell_type": "code",
103 "execution_count": null,
104 "id": "0f905335",
105 "metadata": {},
106 "outputs": [],
107 "source": []
108 },
109 {
110 "cell_type": "code",
111 "execution_count": null,
112 "id": "6f688553",
113 "metadata": {},
114 "outputs": [],
115 "source": []
116 },
117 {
118 "cell_type": "code",
119 "execution_count": null,
120 "id": "24fd6553",
121 "metadata": {},
122 "outputs": [],
123 "source": []
124 },
125 {
126 "cell_type": "code",
127 "execution_count": 8,
128 "id": "d8e0d391",
129 "metadata": {},
130 "outputs": [],
131 "source": [
132 "from sklearn.datasets import make_classification, make_blobs\n",
133 "from matplotlib.colors import ListedColormap\n",
134 "from sklearn.datasets import load_breast_cancer\n",
135 "from adspy_shared_utilities import load_crime_dataset"
136 ]
137 },
138 {
139 "cell_type": "code",
140 "execution_count": 9,
141 "id": "bb170936",
142 "metadata": {},
143 "outputs": [],
144 "source": [
145 "cmap_bold = ListedColormap(['#FFFF00', '#00FF00', '#0000FF','#000000'])"
146 ]
147 },
148 {
149 "cell_type": "code",
150 "execution_count": 10,
151 "id": "520aaa3b",
152 "metadata": {},
153 "outputs": [
154 {
155 "data": {
156 "application/javascript": [
157 "/* Put everything inside the global mpl namespace */\n",
158 "/* global mpl */\n",
159 "window.mpl = {};\n",
160 "\n",
161 "mpl.get_websocket_type = function () {\n",
162 " if (typeof WebSocket !== 'undefined') {\n",
163 " return WebSocket;\n",
164 " } else if (typeof MozWebSocket !== 'undefined') {\n",
165 " return MozWebSocket;\n",
166 " } else {\n",
167 " alert(\n",
168 " 'Your browser does not have WebSocket support. ' +\n",
169 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
170 " 'Firefox 4 and 5 are also supported but you ' +\n",
171 " 'have to enable WebSockets in about:config.'\n",
172 " );\n",
173 " }\n",
174 "};\n",
175 "\n",
176 "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
177 " this.id = figure_id;\n",
178 "\n",
179 " this.ws = websocket;\n",
180 "\n",
181 " this.supports_binary = this.ws.binaryType !== undefined;\n",
182 "\n",
183 " if (!this.supports_binary) {\n",
184 " var warnings = document.getElementById('mpl-warnings');\n",
185 " if (warnings) {\n",
186 " warnings.style.display = 'block';\n",
187 " warnings.textContent =\n",
188 " 'This browser does not support binary websocket messages. ' +\n",
189 " 'Performance may be slow.';\n",
190 " }\n",
191 " }\n",
192 "\n",
193 " this.imageObj = new Image();\n",
194 "\n",
195 " this.context = undefined;\n",
196 " this.message = undefined;\n",
197 " this.canvas = undefined;\n",
198 " this.rubberband_canvas = undefined;\n",
199 " this.rubberband_context = undefined;\n",
200 " this.format_dropdown = undefined;\n",
201 "\n",
202 " this.image_mode = 'full';\n",
203 "\n",
204 " this.root = document.createElement('div');\n",
205 " this.root.setAttribute('style', 'display: inline-block');\n",
206 " this._root_extra_style(this.root);\n",
207 "\n",
208 " parent_element.appendChild(this.root);\n",
209 "\n",
210 " this._init_header(this);\n",
211 " this._init_canvas(this);\n",
212 " this._init_toolbar(this);\n",
213 "\n",
214 " var fig = this;\n",
215 "\n",
216 " this.waiting = false;\n",
217 "\n",
218 " this.ws.onopen = function () {\n",
219 " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
220 " fig.send_message('send_image_mode', {});\n",
221 " if (fig.ratio !== 1) {\n",
222 " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
223 " }\n",
224 " fig.send_message('refresh', {});\n",
225 " };\n",
226 "\n",
227 " this.imageObj.onload = function () {\n",
228 " if (fig.image_mode === 'full') {\n",
229 " // Full images could contain transparency (where diff images\n",
230 " // almost always do), so we need to clear the canvas so that\n",
231 " // there is no ghosting.\n",
232 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
233 " }\n",
234 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
235 " };\n",
236 "\n",
237 " this.imageObj.onunload = function () {\n",
238 " fig.ws.close();\n",
239 " };\n",
240 "\n",
241 " this.ws.onmessage = this._make_on_message_function(this);\n",
242 "\n",
243 " this.ondownload = ondownload;\n",
244 "};\n",
245 "\n",
246 "mpl.figure.prototype._init_header = function () {\n",
247 " var titlebar = document.createElement('div');\n",
248 " titlebar.classList =\n",
249 " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
250 " var titletext = document.createElement('div');\n",
251 " titletext.classList = 'ui-dialog-title';\n",
252 " titletext.setAttribute(\n",
253 " 'style',\n",
254 " 'width: 100%; text-align: center; padding: 3px;'\n",
255 " );\n",
256 " titlebar.appendChild(titletext);\n",
257 " this.root.appendChild(titlebar);\n",
258 " this.header = titletext;\n",
259 "};\n",
260 "\n",
261 "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
262 "\n",
263 "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
264 "\n",
265 "mpl.figure.prototype._init_canvas = function () {\n",
266 " var fig = this;\n",
267 "\n",
268 " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
269 " canvas_div.setAttribute(\n",
270 " 'style',\n",
271 " 'border: 1px solid #ddd;' +\n",
272 " 'box-sizing: content-box;' +\n",
273 " 'clear: both;' +\n",
274 " 'min-height: 1px;' +\n",
275 " 'min-width: 1px;' +\n",
276 " 'outline: 0;' +\n",
277 " 'overflow: hidden;' +\n",
278 " 'position: relative;' +\n",
279 " 'resize: both;'\n",
280 " );\n",
281 "\n",
282 " function on_keyboard_event_closure(name) {\n",
283 " return function (event) {\n",
284 " return fig.key_event(event, name);\n",
285 " };\n",
286 " }\n",
287 "\n",
288 " canvas_div.addEventListener(\n",
289 " 'keydown',\n",
290 " on_keyboard_event_closure('key_press')\n",
291 " );\n",
292 " canvas_div.addEventListener(\n",
293 " 'keyup',\n",
294 " on_keyboard_event_closure('key_release')\n",
295 " );\n",
296 "\n",
297 " this._canvas_extra_style(canvas_div);\n",
298 " this.root.appendChild(canvas_div);\n",
299 "\n",
300 " var canvas = (this.canvas = document.createElement('canvas'));\n",
301 " canvas.classList.add('mpl-canvas');\n",
302 " canvas.setAttribute('style', 'box-sizing: content-box;');\n",
303 "\n",
304 " this.context = canvas.getContext('2d');\n",
305 "\n",
306 " var backingStore =\n",
307 " this.context.backingStorePixelRatio ||\n",
308 " this.context.webkitBackingStorePixelRatio ||\n",
309 " this.context.mozBackingStorePixelRatio ||\n",
310 " this.context.msBackingStorePixelRatio ||\n",
311 " this.context.oBackingStorePixelRatio ||\n",
312 " this.context.backingStorePixelRatio ||\n",
313 " 1;\n",
314 "\n",
315 " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
316 "\n",
317 " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
318 " 'canvas'\n",
319 " ));\n",
320 " rubberband_canvas.setAttribute(\n",
321 " 'style',\n",
322 " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
323 " );\n",
324 "\n",
325 " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
326 " if (this.ResizeObserver === undefined) {\n",
327 " if (window.ResizeObserver !== undefined) {\n",
328 " this.ResizeObserver = window.ResizeObserver;\n",
329 " } else {\n",
330 " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
331 " this.ResizeObserver = obs.ResizeObserver;\n",
332 " }\n",
333 " }\n",
334 "\n",
335 " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
336 " var nentries = entries.length;\n",
337 " for (var i = 0; i < nentries; i++) {\n",
338 " var entry = entries[i];\n",
339 " var width, height;\n",
340 " if (entry.contentBoxSize) {\n",
341 " if (entry.contentBoxSize instanceof Array) {\n",
342 " // Chrome 84 implements new version of spec.\n",
343 " width = entry.contentBoxSize[0].inlineSize;\n",
344 " height = entry.contentBoxSize[0].blockSize;\n",
345 " } else {\n",
346 " // Firefox implements old version of spec.\n",
347 " width = entry.contentBoxSize.inlineSize;\n",
348 " height = entry.contentBoxSize.blockSize;\n",
349 " }\n",
350 " } else {\n",
351 " // Chrome <84 implements even older version of spec.\n",
352 " width = entry.contentRect.width;\n",
353 " height = entry.contentRect.height;\n",
354 " }\n",
355 "\n",
356 " // Keep the size of the canvas and rubber band canvas in sync with\n",
357 " // the canvas container.\n",
358 " if (entry.devicePixelContentBoxSize) {\n",
359 " // Chrome 84 implements new version of spec.\n",
360 " canvas.setAttribute(\n",
361 " 'width',\n",
362 " entry.devicePixelContentBoxSize[0].inlineSize\n",
363 " );\n",
364 " canvas.setAttribute(\n",
365 " 'height',\n",
366 " entry.devicePixelContentBoxSize[0].blockSize\n",
367 " );\n",
368 " } else {\n",
369 " canvas.setAttribute('width', width * fig.ratio);\n",
370 " canvas.setAttribute('height', height * fig.ratio);\n",
371 " }\n",
372 " canvas.setAttribute(\n",
373 " 'style',\n",
374 " 'width: ' + width + 'px; height: ' + height + 'px;'\n",
375 " );\n",
376 "\n",
377 " rubberband_canvas.setAttribute('width', width);\n",
378 " rubberband_canvas.setAttribute('height', height);\n",
379 "\n",
380 " // And update the size in Python. We ignore the initial 0/0 size\n",
381 " // that occurs as the element is placed into the DOM, which should\n",
382 " // otherwise not happen due to the minimum size styling.\n",
383 " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
384 " fig.request_resize(width, height);\n",
385 " }\n",
386 " }\n",
387 " });\n",
388 " this.resizeObserverInstance.observe(canvas_div);\n",
389 "\n",
390 " function on_mouse_event_closure(name) {\n",
391 " return function (event) {\n",
392 " return fig.mouse_event(event, name);\n",
393 " };\n",
394 " }\n",
395 "\n",
396 " rubberband_canvas.addEventListener(\n",
397 " 'mousedown',\n",
398 " on_mouse_event_closure('button_press')\n",
399 " );\n",
400 " rubberband_canvas.addEventListener(\n",
401 " 'mouseup',\n",
402 " on_mouse_event_closure('button_release')\n",
403 " );\n",
404 " // Throttle sequential mouse events to 1 every 20ms.\n",
405 " rubberband_canvas.addEventListener(\n",
406 " 'mousemove',\n",
407 " on_mouse_event_closure('motion_notify')\n",
408 " );\n",
409 "\n",
410 " rubberband_canvas.addEventListener(\n",
411 " 'mouseenter',\n",
412 " on_mouse_event_closure('figure_enter')\n",
413 " );\n",
414 " rubberband_canvas.addEventListener(\n",
415 " 'mouseleave',\n",
416 " on_mouse_event_closure('figure_leave')\n",
417 " );\n",
418 "\n",
419 " canvas_div.addEventListener('wheel', function (event) {\n",
420 " if (event.deltaY < 0) {\n",
421 " event.step = 1;\n",
422 " } else {\n",
423 " event.step = -1;\n",
424 " }\n",
425 " on_mouse_event_closure('scroll')(event);\n",
426 " });\n",
427 "\n",
428 " canvas_div.appendChild(canvas);\n",
429 " canvas_div.appendChild(rubberband_canvas);\n",
430 "\n",
431 " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
432 " this.rubberband_context.strokeStyle = '#000000';\n",
433 "\n",
434 " this._resize_canvas = function (width, height, forward) {\n",
435 " if (forward) {\n",
436 " canvas_div.style.width = width + 'px';\n",
437 " canvas_div.style.height = height + 'px';\n",
438 " }\n",
439 " };\n",
440 "\n",
441 " // Disable right mouse context menu.\n",
442 " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
443 " event.preventDefault();\n",
444 " return false;\n",
445 " });\n",
446 "\n",
447 " function set_focus() {\n",
448 " canvas.focus();\n",
449 " canvas_div.focus();\n",
450 " }\n",
451 "\n",
452 " window.setTimeout(set_focus, 100);\n",
453 "};\n",
454 "\n",
455 "mpl.figure.prototype._init_toolbar = function () {\n",
456 " var fig = this;\n",
457 "\n",
458 " var toolbar = document.createElement('div');\n",
459 " toolbar.classList = 'mpl-toolbar';\n",
460 " this.root.appendChild(toolbar);\n",
461 "\n",
462 " function on_click_closure(name) {\n",
463 " return function (_event) {\n",
464 " return fig.toolbar_button_onclick(name);\n",
465 " };\n",
466 " }\n",
467 "\n",
468 " function on_mouseover_closure(tooltip) {\n",
469 " return function (event) {\n",
470 " if (!event.currentTarget.disabled) {\n",
471 " return fig.toolbar_button_onmouseover(tooltip);\n",
472 " }\n",
473 " };\n",
474 " }\n",
475 "\n",
476 " fig.buttons = {};\n",
477 " var buttonGroup = document.createElement('div');\n",
478 " buttonGroup.classList = 'mpl-button-group';\n",
479 " for (var toolbar_ind in mpl.toolbar_items) {\n",
480 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
481 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
482 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
483 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
484 "\n",
485 " if (!name) {\n",
486 " /* Instead of a spacer, we start a new button group. */\n",
487 " if (buttonGroup.hasChildNodes()) {\n",
488 " toolbar.appendChild(buttonGroup);\n",
489 " }\n",
490 " buttonGroup = document.createElement('div');\n",
491 " buttonGroup.classList = 'mpl-button-group';\n",
492 " continue;\n",
493 " }\n",
494 "\n",
495 " var button = (fig.buttons[name] = document.createElement('button'));\n",
496 " button.classList = 'mpl-widget';\n",
497 " button.setAttribute('role', 'button');\n",
498 " button.setAttribute('aria-disabled', 'false');\n",
499 " button.addEventListener('click', on_click_closure(method_name));\n",
500 " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
501 "\n",
502 " var icon_img = document.createElement('img');\n",
503 " icon_img.src = '_images/' + image + '.png';\n",
504 " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
505 " icon_img.alt = tooltip;\n",
506 " button.appendChild(icon_img);\n",
507 "\n",
508 " buttonGroup.appendChild(button);\n",
509 " }\n",
510 "\n",
511 " if (buttonGroup.hasChildNodes()) {\n",
512 " toolbar.appendChild(buttonGroup);\n",
513 " }\n",
514 "\n",
515 " var fmt_picker = document.createElement('select');\n",
516 " fmt_picker.classList = 'mpl-widget';\n",
517 " toolbar.appendChild(fmt_picker);\n",
518 " this.format_dropdown = fmt_picker;\n",
519 "\n",
520 " for (var ind in mpl.extensions) {\n",
521 " var fmt = mpl.extensions[ind];\n",
522 " var option = document.createElement('option');\n",
523 " option.selected = fmt === mpl.default_extension;\n",
524 " option.innerHTML = fmt;\n",
525 " fmt_picker.appendChild(option);\n",
526 " }\n",
527 "\n",
528 " var status_bar = document.createElement('span');\n",
529 " status_bar.classList = 'mpl-message';\n",
530 " toolbar.appendChild(status_bar);\n",
531 " this.message = status_bar;\n",
532 "};\n",
533 "\n",
534 "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
535 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
536 " // which will in turn request a refresh of the image.\n",
537 " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
538 "};\n",
539 "\n",
540 "mpl.figure.prototype.send_message = function (type, properties) {\n",
541 " properties['type'] = type;\n",
542 " properties['figure_id'] = this.id;\n",
543 " this.ws.send(JSON.stringify(properties));\n",
544 "};\n",
545 "\n",
546 "mpl.figure.prototype.send_draw_message = function () {\n",
547 " if (!this.waiting) {\n",
548 " this.waiting = true;\n",
549 " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
550 " }\n",
551 "};\n",
552 "\n",
553 "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
554 " var format_dropdown = fig.format_dropdown;\n",
555 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
556 " fig.ondownload(fig, format);\n",
557 "};\n",
558 "\n",
559 "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
560 " var size = msg['size'];\n",
561 " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
562 " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
563 " fig.send_message('refresh', {});\n",
564 " }\n",
565 "};\n",
566 "\n",
567 "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
568 " var x0 = msg['x0'] / fig.ratio;\n",
569 " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
570 " var x1 = msg['x1'] / fig.ratio;\n",
571 " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
572 " x0 = Math.floor(x0) + 0.5;\n",
573 " y0 = Math.floor(y0) + 0.5;\n",
574 " x1 = Math.floor(x1) + 0.5;\n",
575 " y1 = Math.floor(y1) + 0.5;\n",
576 " var min_x = Math.min(x0, x1);\n",
577 " var min_y = Math.min(y0, y1);\n",
578 " var width = Math.abs(x1 - x0);\n",
579 " var height = Math.abs(y1 - y0);\n",
580 "\n",
581 " fig.rubberband_context.clearRect(\n",
582 " 0,\n",
583 " 0,\n",
584 " fig.canvas.width / fig.ratio,\n",
585 " fig.canvas.height / fig.ratio\n",
586 " );\n",
587 "\n",
588 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
589 "};\n",
590 "\n",
591 "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
592 " // Updates the figure title.\n",
593 " fig.header.textContent = msg['label'];\n",
594 "};\n",
595 "\n",
596 "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
597 " var cursor = msg['cursor'];\n",
598 " switch (cursor) {\n",
599 " case 0:\n",
600 " cursor = 'pointer';\n",
601 " break;\n",
602 " case 1:\n",
603 " cursor = 'default';\n",
604 " break;\n",
605 " case 2:\n",
606 " cursor = 'crosshair';\n",
607 " break;\n",
608 " case 3:\n",
609 " cursor = 'move';\n",
610 " break;\n",
611 " }\n",
612 " fig.rubberband_canvas.style.cursor = cursor;\n",
613 "};\n",
614 "\n",
615 "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
616 " fig.message.textContent = msg['message'];\n",
617 "};\n",
618 "\n",
619 "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
620 " // Request the server to send over a new figure.\n",
621 " fig.send_draw_message();\n",
622 "};\n",
623 "\n",
624 "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
625 " fig.image_mode = msg['mode'];\n",
626 "};\n",
627 "\n",
628 "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
629 " for (var key in msg) {\n",
630 " if (!(key in fig.buttons)) {\n",
631 " continue;\n",
632 " }\n",
633 " fig.buttons[key].disabled = !msg[key];\n",
634 " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
635 " }\n",
636 "};\n",
637 "\n",
638 "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
639 " if (msg['mode'] === 'PAN') {\n",
640 " fig.buttons['Pan'].classList.add('active');\n",
641 " fig.buttons['Zoom'].classList.remove('active');\n",
642 " } else if (msg['mode'] === 'ZOOM') {\n",
643 " fig.buttons['Pan'].classList.remove('active');\n",
644 " fig.buttons['Zoom'].classList.add('active');\n",
645 " } else {\n",
646 " fig.buttons['Pan'].classList.remove('active');\n",
647 " fig.buttons['Zoom'].classList.remove('active');\n",
648 " }\n",
649 "};\n",
650 "\n",
651 "mpl.figure.prototype.updated_canvas_event = function () {\n",
652 " // Called whenever the canvas gets updated.\n",
653 " this.send_message('ack', {});\n",
654 "};\n",
655 "\n",
656 "// A function to construct a web socket function for onmessage handling.\n",
657 "// Called in the figure constructor.\n",
658 "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
659 " return function socket_on_message(evt) {\n",
660 " if (evt.data instanceof Blob) {\n",
661 " /* FIXME: We get \"Resource interpreted as Image but\n",
662 " * transferred with MIME type text/plain:\" errors on\n",
663 " * Chrome. But how to set the MIME type? It doesn't seem\n",
664 " * to be part of the websocket stream */\n",
665 " evt.data.type = 'image/png';\n",
666 "\n",
667 " /* Free the memory for the previous frames */\n",
668 " if (fig.imageObj.src) {\n",
669 " (window.URL || window.webkitURL).revokeObjectURL(\n",
670 " fig.imageObj.src\n",
671 " );\n",
672 " }\n",
673 "\n",
674 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
675 " evt.data\n",
676 " );\n",
677 " fig.updated_canvas_event();\n",
678 " fig.waiting = false;\n",
679 " return;\n",
680 " } else if (\n",
681 " typeof evt.data === 'string' &&\n",
682 " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
683 " ) {\n",
684 " fig.imageObj.src = evt.data;\n",
685 " fig.updated_canvas_event();\n",
686 " fig.waiting = false;\n",
687 " return;\n",
688 " }\n",
689 "\n",
690 " var msg = JSON.parse(evt.data);\n",
691 " var msg_type = msg['type'];\n",
692 "\n",
693 " // Call the \"handle_{type}\" callback, which takes\n",
694 " // the figure and JSON message as its only arguments.\n",
695 " try {\n",
696 " var callback = fig['handle_' + msg_type];\n",
697 " } catch (e) {\n",
698 " console.log(\n",
699 " \"No handler for the '\" + msg_type + \"' message type: \",\n",
700 " msg\n",
701 " );\n",
702 " return;\n",
703 " }\n",
704 "\n",
705 " if (callback) {\n",
706 " try {\n",
707 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
708 " callback(fig, msg);\n",
709 " } catch (e) {\n",
710 " console.log(\n",
711 " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
712 " e,\n",
713 " e.stack,\n",
714 " msg\n",
715 " );\n",
716 " }\n",
717 " }\n",
718 " };\n",
719 "};\n",
720 "\n",
721 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
722 "mpl.findpos = function (e) {\n",
723 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
724 " var targ;\n",
725 " if (!e) {\n",
726 " e = window.event;\n",
727 " }\n",
728 " if (e.target) {\n",
729 " targ = e.target;\n",
730 " } else if (e.srcElement) {\n",
731 " targ = e.srcElement;\n",
732 " }\n",
733 " if (targ.nodeType === 3) {\n",
734 " // defeat Safari bug\n",
735 " targ = targ.parentNode;\n",
736 " }\n",
737 "\n",
738 " // pageX,Y are the mouse positions relative to the document\n",
739 " var boundingRect = targ.getBoundingClientRect();\n",
740 " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
741 " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
742 "\n",
743 " return { x: x, y: y };\n",
744 "};\n",
745 "\n",
746 "/*\n",
747 " * return a copy of an object with only non-object keys\n",
748 " * we need this to avoid circular references\n",
749 " * http://stackoverflow.com/a/24161582/3208463\n",
750 " */\n",
751 "function simpleKeys(original) {\n",
752 " return Object.keys(original).reduce(function (obj, key) {\n",
753 " if (typeof original[key] !== 'object') {\n",
754 " obj[key] = original[key];\n",
755 " }\n",
756 " return obj;\n",
757 " }, {});\n",
758 "}\n",
759 "\n",
760 "mpl.figure.prototype.mouse_event = function (event, name) {\n",
761 " var canvas_pos = mpl.findpos(event);\n",
762 "\n",
763 " if (name === 'button_press') {\n",
764 " this.canvas.focus();\n",
765 " this.canvas_div.focus();\n",
766 " }\n",
767 "\n",
768 " var x = canvas_pos.x * this.ratio;\n",
769 " var y = canvas_pos.y * this.ratio;\n",
770 "\n",
771 " this.send_message(name, {\n",
772 " x: x,\n",
773 " y: y,\n",
774 " button: event.button,\n",
775 " step: event.step,\n",
776 " guiEvent: simpleKeys(event),\n",
777 " });\n",
778 "\n",
779 " /* This prevents the web browser from automatically changing to\n",
780 " * the text insertion cursor when the button is pressed. We want\n",
781 " * to control all of the cursor setting manually through the\n",
782 " * 'cursor' event from matplotlib */\n",
783 " event.preventDefault();\n",
784 " return false;\n",
785 "};\n",
786 "\n",
787 "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
788 " // Handle any extra behaviour associated with a key event\n",
789 "};\n",
790 "\n",
791 "mpl.figure.prototype.key_event = function (event, name) {\n",
792 " // Prevent repeat events\n",
793 " if (name === 'key_press') {\n",
794 " if (event.which === this._key) {\n",
795 " return;\n",
796 " } else {\n",
797 " this._key = event.which;\n",
798 " }\n",
799 " }\n",
800 " if (name === 'key_release') {\n",
801 " this._key = null;\n",
802 " }\n",
803 "\n",
804 " var value = '';\n",
805 " if (event.ctrlKey && event.which !== 17) {\n",
806 " value += 'ctrl+';\n",
807 " }\n",
808 " if (event.altKey && event.which !== 18) {\n",
809 " value += 'alt+';\n",
810 " }\n",
811 " if (event.shiftKey && event.which !== 16) {\n",
812 " value += 'shift+';\n",
813 " }\n",
814 "\n",
815 " value += 'k';\n",
816 " value += event.which.toString();\n",
817 "\n",
818 " this._key_event_extra(event, name);\n",
819 "\n",
820 " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
821 " return false;\n",
822 "};\n",
823 "\n",
824 "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
825 " if (name === 'download') {\n",
826 " this.handle_save(this, null);\n",
827 " } else {\n",
828 " this.send_message('toolbar_button', { name: name });\n",
829 " }\n",
830 "};\n",
831 "\n",
832 "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
833 " this.message.textContent = tooltip;\n",
834 "};\n",
835 "\n",
836 "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
837 "// prettier-ignore\n",
838 "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
839 "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
840 "\n",
841 "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
842 "\n",
843 "mpl.default_extension = \"png\";/* global mpl */\n",
844 "\n",
845 "var comm_websocket_adapter = function (comm) {\n",
846 " // Create a \"websocket\"-like object which calls the given IPython comm\n",
847 " // object with the appropriate methods. Currently this is a non binary\n",
848 " // socket, so there is still some room for performance tuning.\n",
849 " var ws = {};\n",
850 "\n",
851 " ws.close = function () {\n",
852 " comm.close();\n",
853 " };\n",
854 " ws.send = function (m) {\n",
855 " //console.log('sending', m);\n",
856 " comm.send(m);\n",
857 " };\n",
858 " // Register the callback with on_msg.\n",
859 " comm.on_msg(function (msg) {\n",
860 " //console.log('receiving', msg['content']['data'], msg);\n",
861 " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
862 " ws.onmessage(msg['content']['data']);\n",
863 " });\n",
864 " return ws;\n",
865 "};\n",
866 "\n",
867 "mpl.mpl_figure_comm = function (comm, msg) {\n",
868 " // This is the function which gets called when the mpl process\n",
869 " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
870 "\n",
871 " var id = msg.content.data.id;\n",
872 " // Get hold of the div created by the display call when the Comm\n",
873 " // socket was opened in Python.\n",
874 " var element = document.getElementById(id);\n",
875 " var ws_proxy = comm_websocket_adapter(comm);\n",
876 "\n",
877 " function ondownload(figure, _format) {\n",
878 " window.open(figure.canvas.toDataURL());\n",
879 " }\n",
880 "\n",
881 " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
882 "\n",
883 " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
884 " // web socket which is closed, not our websocket->open comm proxy.\n",
885 " ws_proxy.onopen();\n",
886 "\n",
887 " fig.parent_element = element;\n",
888 " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
889 " if (!fig.cell_info) {\n",
890 " console.error('Failed to find cell for figure', id, fig);\n",
891 " return;\n",
892 " }\n",
893 " fig.cell_info[0].output_area.element.on(\n",
894 " 'cleared',\n",
895 " { fig: fig },\n",
896 " fig._remove_fig_handler\n",
897 " );\n",
898 "};\n",
899 "\n",
900 "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
901 " var width = fig.canvas.width / fig.ratio;\n",
902 " fig.cell_info[0].output_area.element.off(\n",
903 " 'cleared',\n",
904 " fig._remove_fig_handler\n",
905 " );\n",
906 " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
907 "\n",
908 " // Update the output cell to use the data from the current canvas.\n",
909 " fig.push_to_output();\n",
910 " var dataURL = fig.canvas.toDataURL();\n",
911 " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
912 " // the notebook keyboard shortcuts fail.\n",
913 " IPython.keyboard_manager.enable();\n",
914 " fig.parent_element.innerHTML =\n",
915 " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
916 " fig.close_ws(fig, msg);\n",
917 "};\n",
918 "\n",
919 "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
920 " fig.send_message('closing', msg);\n",
921 " // fig.ws.close()\n",
922 "};\n",
923 "\n",
924 "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
925 " // Turn the data on the canvas into data in the output cell.\n",
926 " var width = this.canvas.width / this.ratio;\n",
927 " var dataURL = this.canvas.toDataURL();\n",
928 " this.cell_info[1]['text/html'] =\n",
929 " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
930 "};\n",
931 "\n",
932 "mpl.figure.prototype.updated_canvas_event = function () {\n",
933 " // Tell IPython that the notebook contents must change.\n",
934 " IPython.notebook.set_dirty(true);\n",
935 " this.send_message('ack', {});\n",
936 " var fig = this;\n",
937 " // Wait a second, then push the new image to the DOM so\n",
938 " // that it is saved nicely (might be nice to debounce this).\n",
939 " setTimeout(function () {\n",
940 " fig.push_to_output();\n",
941 " }, 1000);\n",
942 "};\n",
943 "\n",
944 "mpl.figure.prototype._init_toolbar = function () {\n",
945 " var fig = this;\n",
946 "\n",
947 " var toolbar = document.createElement('div');\n",
948 " toolbar.classList = 'btn-toolbar';\n",
949 " this.root.appendChild(toolbar);\n",
950 "\n",
951 " function on_click_closure(name) {\n",
952 " return function (_event) {\n",
953 " return fig.toolbar_button_onclick(name);\n",
954 " };\n",
955 " }\n",
956 "\n",
957 " function on_mouseover_closure(tooltip) {\n",
958 " return function (event) {\n",
959 " if (!event.currentTarget.disabled) {\n",
960 " return fig.toolbar_button_onmouseover(tooltip);\n",
961 " }\n",
962 " };\n",
963 " }\n",
964 "\n",
965 " fig.buttons = {};\n",
966 " var buttonGroup = document.createElement('div');\n",
967 " buttonGroup.classList = 'btn-group';\n",
968 " var button;\n",
969 " for (var toolbar_ind in mpl.toolbar_items) {\n",
970 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
971 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
972 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
973 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
974 "\n",
975 " if (!name) {\n",
976 " /* Instead of a spacer, we start a new button group. */\n",
977 " if (buttonGroup.hasChildNodes()) {\n",
978 " toolbar.appendChild(buttonGroup);\n",
979 " }\n",
980 " buttonGroup = document.createElement('div');\n",
981 " buttonGroup.classList = 'btn-group';\n",
982 " continue;\n",
983 " }\n",
984 "\n",
985 " button = fig.buttons[name] = document.createElement('button');\n",
986 " button.classList = 'btn btn-default';\n",
987 " button.href = '#';\n",
988 " button.title = name;\n",
989 " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
990 " button.addEventListener('click', on_click_closure(method_name));\n",
991 " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
992 " buttonGroup.appendChild(button);\n",
993 " }\n",
994 "\n",
995 " if (buttonGroup.hasChildNodes()) {\n",
996 " toolbar.appendChild(buttonGroup);\n",
997 " }\n",
998 "\n",
999 " // Add the status bar.\n",
1000 " var status_bar = document.createElement('span');\n",
1001 " status_bar.classList = 'mpl-message pull-right';\n",
1002 " toolbar.appendChild(status_bar);\n",
1003 " this.message = status_bar;\n",
1004 "\n",
1005 " // Add the close button to the window.\n",
1006 " var buttongrp = document.createElement('div');\n",
1007 " buttongrp.classList = 'btn-group inline pull-right';\n",
1008 " button = document.createElement('button');\n",
1009 " button.classList = 'btn btn-mini btn-primary';\n",
1010 " button.href = '#';\n",
1011 " button.title = 'Stop Interaction';\n",
1012 " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
1013 " button.addEventListener('click', function (_evt) {\n",
1014 " fig.handle_close(fig, {});\n",
1015 " });\n",
1016 " button.addEventListener(\n",
1017 " 'mouseover',\n",
1018 " on_mouseover_closure('Stop Interaction')\n",
1019 " );\n",
1020 " buttongrp.appendChild(button);\n",
1021 " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
1022 " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
1023 "};\n",
1024 "\n",
1025 "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
1026 " var fig = event.data.fig;\n",
1027 " if (event.target !== this) {\n",
1028 " // Ignore bubbled events from children.\n",
1029 " return;\n",
1030 " }\n",
1031 " fig.close_ws(fig, {});\n",
1032 "};\n",
1033 "\n",
1034 "mpl.figure.prototype._root_extra_style = function (el) {\n",
1035 " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
1036 "};\n",
1037 "\n",
1038 "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
1039 " // this is important to make the div 'focusable\n",
1040 " el.setAttribute('tabindex', 0);\n",
1041 " // reach out to IPython and tell the keyboard manager to turn it's self\n",
1042 " // off when our div gets focus\n",
1043 "\n",
1044 " // location in version 3\n",
1045 " if (IPython.notebook.keyboard_manager) {\n",
1046 " IPython.notebook.keyboard_manager.register_events(el);\n",
1047 " } else {\n",
1048 " // location in version 2\n",
1049 " IPython.keyboard_manager.register_events(el);\n",
1050 " }\n",
1051 "};\n",
1052 "\n",
1053 "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
1054 " var manager = IPython.notebook.keyboard_manager;\n",
1055 " if (!manager) {\n",
1056 " manager = IPython.keyboard_manager;\n",
1057 " }\n",
1058 "\n",
1059 " // Check for shift+enter\n",
1060 " if (event.shiftKey && event.which === 13) {\n",
1061 " this.canvas_div.blur();\n",
1062 " // select the cell after this one\n",
1063 " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
1064 " IPython.notebook.select(index + 1);\n",
1065 " }\n",
1066 "};\n",
1067 "\n",
1068 "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
1069 " fig.ondownload(fig, null);\n",
1070 "};\n",
1071 "\n",
1072 "mpl.find_output_cell = function (html_output) {\n",
1073 " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
1074 " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
1075 " // IPython event is triggered only after the cells have been serialised, which for\n",
1076 " // our purposes (turning an active figure into a static one), is too late.\n",
1077 " var cells = IPython.notebook.get_cells();\n",
1078 " var ncells = cells.length;\n",
1079 " for (var i = 0; i < ncells; i++) {\n",
1080 " var cell = cells[i];\n",
1081 " if (cell.cell_type === 'code') {\n",
1082 " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
1083 " var data = cell.output_area.outputs[j];\n",
1084 " if (data.data) {\n",
1085 " // IPython >= 3 moved mimebundle to data attribute of output\n",
1086 " data = data.data;\n",
1087 " }\n",
1088 " if (data['text/html'] === html_output) {\n",
1089 " return [cell, data, j];\n",
1090 " }\n",
1091 " }\n",
1092 " }\n",
1093 " }\n",
1094 "};\n",
1095 "\n",
1096 "// Register the function which deals with the matplotlib target/channel.\n",
1097 "// The kernel may be null if the page has been refreshed.\n",
1098 "if (IPython.notebook.kernel !== null) {\n",
1099 " IPython.notebook.kernel.comm_manager.register_target(\n",
1100 " 'matplotlib',\n",
1101 " mpl.mpl_figure_comm\n",
1102 " );\n",
1103 "}\n"
1104 ],
1105 "text/plain": [
1106 "<IPython.core.display.Javascript object>"
1107 ]
1108 },
1109 "metadata": {},
1110 "output_type": "display_data"
1111 },
1112 {
1113 "data": {
1114 "text/html": [
1115 "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydCZhVxZn+vxYV2ZsGmiV0h0VoFGUx0MZgWCQIiTruIJlxQQcIyWSisrQx8080oxgWNTOOCLiA0REXXDKgkTiBhggzadRAOxpaaVQaAVkaEGQT5P+8B+p6OH2WOrfOvffcvu95Hp9E+1Sdql9959R7v6rvq7xjx44dE14kQAIkQAIkQAIkQAI5QyCPAjBnxpodJQESIAESIAESIAGLAAUgDYEESIAESIAESIAEcowABWCODTi7SwIkQAIkQAIkQAIUgLQBEiABEiABEiABEsgxAhSAOTbg7C4JkAAJkAAJkAAJUADSBkiABEiABEiABEggxwhQAObYgLO7JEACJEACJEACJEABSBsgARIgARIgARIggRwjQAGYYwPO7pIACZAACZAACZAABSBtgARIgARIgARIgARyjAAFYI4NOLtLAiRAAiRAAiRAAhSAtAESIAESIAESIAESyDECFIA5NuDsLgmQAAmQAAmQAAlQANIGSIAESIAESIAESCDHCFAA5tiAs7skQAIkQAIkQAIkQAFIGyABEiABEiABEiCBHCNAAZhjA87ukgAJkAAJkAAJkAAFIG2ABEiABEiABEiABHKMAAVgjg04u0sCJEACJEACJEACFIC0ARIgARIgARIgARLIMQIUgDk24OwuCZAACZAACZAACVAA0gZIgARIgARIgARIIMcIUADm2ICzuyRAAiRAAiRAAiRAAUgbIAESIAESIAESIIEcI0ABmGMDzu6SAAmQAAmQAAmQAAUgbYAESIAESIAESIAEcowABWCODTi7SwIkQAIkQAIkQAIUgLQBEiABEiABEiABEsgxAhSAOTbg7C4JkAAJkAAJkAAJUADSBkiABEiABEiABEggxwhQAObYgLO7JEACJEACJEACJEABSBsgARIgARIgARIggRwjQAGYYwPO7pIACZAACZAACZAABSBtgARIgARIgARIgARyjAAFYI4NOLtLAiRAAiRAAiRAAhSAtAESIAESIAESIAESyDECFID1bMD/8pe/yG9+8xt5++235bPPPpP8/Hzp0qWLfOc735H7778/1r296aabpLy8XD7++ONYtzPujevUqZMMHjxY5s+fH/emJt0+2Ejnzp1lxowZMmnSJN96wGHMmDHy0Ucf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gAACCCCAgLMCBEBnu44TRwABBBBAAAEEggkQAIO50QoBBBBAAAEEEHBWgADoWNddf/31sn79etm5c6c0b95crrzySpk0aZJ5mjlbeoEtW7bII488IkuWLJHvvvvOWN1yyy0yevRoqV+/PmxZBCZMmCCLFi0yNadW+r2ZbHUFnn32WZk8ebJ8++23ct5558lTTz0ll112GVQZBJYvX268Pv74Y2P2xhtvSN++ffHKIqBPgnj99dfliy++kIYNG8oll1xifvd37NgRtywC06dPF/3RcUA3fX+OGTNGrrnmmsS7EQAdK4Enn3xSunXrJq1atZIdO3bIgw8+aK5g1apVjl1J4U73nXfekfnz58uAAQOkQ4cO8umnn8pdd90lt956q0yZMqVwJ+LgK40dO1aaNWsm+r3Xs2bNIgCm6UOtLa0lDYHdu3eXGTNmyAsvvCCff/65nHHGGQ72ev5PefHixbJy5Urp0qWL9OvXjwDogbxPnz7Sv39/ueiii+TXX381f8Bu3LjR1FmjRo08HCGZu7z11ltSr14987tftzlz5pg/PtatW2fCYJI3AqDjvb9w4ULzl7M+G+qEE05w/GoKd/r6C0D/Kty8eXPhXtThV5o9e7YMGzaMAJimDy+++GITZLSeUts555xj3pc6a8OWXUC/R50ZQP9V8sMPP8ipp54qH3zwgfTo0cP/ARLcokWLFiYE3nHHHQlWECEAOtz9e/bskXvvvdfMBH744YcOX0nhT/2hhx4SnRlcu3Zt4V/cwVckAKbvtF9++UVOPPFEefXVV+XGG2+s3emBBx4wH5vr4MxGAMxHDXzzzTdy1llnmVnA888/Px8vEbtjHj582LxXBw4caGYAzz333Nhdo58LIgD60YrIviNGjJBnnnlGfvrpJ+natau8/fbb0rJly4icXfRPY9OmTWbGZurUqXLnnXdG/4QjcIYEwPSdUF1dLW3atDEfZ+o9Want0UcfNR81ffnllxHovWifAjOA/vunpqZGbrjhBtm7d6+sWLHC/wES1kJDst469fPPP0vjxo3llVdekWuvvTZhCnUvlwAYgRIYN26cjB8/PuuZrFmzRiorK80+u3btEp3927p1q2nXtGlTEwL1F2mSNr9uaqMD9uWXX25+9D6tJG5B3AiA2QOg3oOrA0xq08UzL730krlhny27AAHQf4UMHTrULM7ST37Ky8v9HyBhLXSmftu2beYWltdee8387tfZeWYA9U8JtqIKaKDTn2xb27ZtpUGDBnV20ZvzKyoqzCKQowegol5QgV7cr5uGv169eones6WBprS0tEBnGq2X8eumZ08ATN+HfARsX9sEQH+G999/v7z55puiK6nbtWvnrzF7GwF9ekb79u3Ngq0kb8wAOt77VVVVZqXh0qVLpWfPno5fTf5OX++T1PB34YUXyssvv2xWhbF5FyAAZrbSPyi0rnQVcGrTmQX9iI5FILlrjACY20j30LkaDX+6YGbZsmXm/j+2YAK9e/c2Eyf6ey3JGwHQod5fvXq16M+ll15qngGoK1j1eUb6HK3PPvtMysrKHLqawp1q6mNfDcpz5849JvydfvrphTsRB19JPzbR2w10tbmumkvdb6SPVNB7adjEPGJIHwPz3HPPmVn4mTNnyvPPP2/ek2eeeSZEaQR+/PFH0UUMunXu3FmeeOIJ8wears7k0TnpS2bIkCHm3rUFCxYc8+w/vQVInwvIll5g1KhR5pl/GvgOHDgg8+bNk4kTJ5pFgFdddVWi2QiADnW/3siqqws3bNggBw8eNM8C1GdD6YpWvRGdLb2A/pV3++23p/1H7oDIXjWDBg0yixmO35hxPlZEZ/8ef/xx88eYrsjU53XyaI7MtaUzWBr4jt90dWbSZ2UyqWW6x/vFF18UfZ+ypRfQR728//775r2pYblTp06iCymTHv5UiwDIuwYBBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAgRAagABBBBAAAEEEEiYAAEwYR3O5SKAAAIIIIAAAv8FWD7peQ1kiF8AAAAASUVORK5CYII=\" width=\"640\">"
1116 ],
1117 "text/plain": [
1118 "<IPython.core.display.HTML object>"
1119 ]
1120 },
1121 "metadata": {},
1122 "output_type": "display_data"
1123 }
1124 ],
1125 "source": [
1126 "from sklearn.datasets import make_regression\n",
1127 "plt.figure()\n",
1128 "plt.title('Sample regression problem with one input variable')\n",
1129 "X_R1, y_R1 = make_regression(n_samples = 1000, n_features=1,\n",
1130 " n_informative=1, bias = 150.0,\n",
1131 " noise = 30, random_state=0)\n",
1132 "plt.scatter(X_R1, y_R1, marker= 'o', s=25)\n",
1133 "plt.show()"
1134 ]
1135 },
1136 {
1137 "cell_type": "code",
1138 "execution_count": 18,
1139 "id": "82ea4f47",
1140 "metadata": {},
1141 "outputs": [
1142 {
1143 "data": {
1144 "application/javascript": [
1145 "/* Put everything inside the global mpl namespace */\n",
1146 "/* global mpl */\n",
1147 "window.mpl = {};\n",
1148 "\n",
1149 "mpl.get_websocket_type = function () {\n",
1150 " if (typeof WebSocket !== 'undefined') {\n",
1151 " return WebSocket;\n",
1152 " } else if (typeof MozWebSocket !== 'undefined') {\n",
1153 " return MozWebSocket;\n",
1154 " } else {\n",
1155 " alert(\n",
1156 " 'Your browser does not have WebSocket support. ' +\n",
1157 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
1158 " 'Firefox 4 and 5 are also supported but you ' +\n",
1159 " 'have to enable WebSockets in about:config.'\n",
1160 " );\n",
1161 " }\n",
1162 "};\n",
1163 "\n",
1164 "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
1165 " this.id = figure_id;\n",
1166 "\n",
1167 " this.ws = websocket;\n",
1168 "\n",
1169 " this.supports_binary = this.ws.binaryType !== undefined;\n",
1170 "\n",
1171 " if (!this.supports_binary) {\n",
1172 " var warnings = document.getElementById('mpl-warnings');\n",
1173 " if (warnings) {\n",
1174 " warnings.style.display = 'block';\n",
1175 " warnings.textContent =\n",
1176 " 'This browser does not support binary websocket messages. ' +\n",
1177 " 'Performance may be slow.';\n",
1178 " }\n",
1179 " }\n",
1180 "\n",
1181 " this.imageObj = new Image();\n",
1182 "\n",
1183 " this.context = undefined;\n",
1184 " this.message = undefined;\n",
1185 " this.canvas = undefined;\n",
1186 " this.rubberband_canvas = undefined;\n",
1187 " this.rubberband_context = undefined;\n",
1188 " this.format_dropdown = undefined;\n",
1189 "\n",
1190 " this.image_mode = 'full';\n",
1191 "\n",
1192 " this.root = document.createElement('div');\n",
1193 " this.root.setAttribute('style', 'display: inline-block');\n",
1194 " this._root_extra_style(this.root);\n",
1195 "\n",
1196 " parent_element.appendChild(this.root);\n",
1197 "\n",
1198 " this._init_header(this);\n",
1199 " this._init_canvas(this);\n",
1200 " this._init_toolbar(this);\n",
1201 "\n",
1202 " var fig = this;\n",
1203 "\n",
1204 " this.waiting = false;\n",
1205 "\n",
1206 " this.ws.onopen = function () {\n",
1207 " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
1208 " fig.send_message('send_image_mode', {});\n",
1209 " if (fig.ratio !== 1) {\n",
1210 " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
1211 " }\n",
1212 " fig.send_message('refresh', {});\n",
1213 " };\n",
1214 "\n",
1215 " this.imageObj.onload = function () {\n",
1216 " if (fig.image_mode === 'full') {\n",
1217 " // Full images could contain transparency (where diff images\n",
1218 " // almost always do), so we need to clear the canvas so that\n",
1219 " // there is no ghosting.\n",
1220 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
1221 " }\n",
1222 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
1223 " };\n",
1224 "\n",
1225 " this.imageObj.onunload = function () {\n",
1226 " fig.ws.close();\n",
1227 " };\n",
1228 "\n",
1229 " this.ws.onmessage = this._make_on_message_function(this);\n",
1230 "\n",
1231 " this.ondownload = ondownload;\n",
1232 "};\n",
1233 "\n",
1234 "mpl.figure.prototype._init_header = function () {\n",
1235 " var titlebar = document.createElement('div');\n",
1236 " titlebar.classList =\n",
1237 " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
1238 " var titletext = document.createElement('div');\n",
1239 " titletext.classList = 'ui-dialog-title';\n",
1240 " titletext.setAttribute(\n",
1241 " 'style',\n",
1242 " 'width: 100%; text-align: center; padding: 3px;'\n",
1243 " );\n",
1244 " titlebar.appendChild(titletext);\n",
1245 " this.root.appendChild(titlebar);\n",
1246 " this.header = titletext;\n",
1247 "};\n",
1248 "\n",
1249 "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
1250 "\n",
1251 "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
1252 "\n",
1253 "mpl.figure.prototype._init_canvas = function () {\n",
1254 " var fig = this;\n",
1255 "\n",
1256 " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
1257 " canvas_div.setAttribute(\n",
1258 " 'style',\n",
1259 " 'border: 1px solid #ddd;' +\n",
1260 " 'box-sizing: content-box;' +\n",
1261 " 'clear: both;' +\n",
1262 " 'min-height: 1px;' +\n",
1263 " 'min-width: 1px;' +\n",
1264 " 'outline: 0;' +\n",
1265 " 'overflow: hidden;' +\n",
1266 " 'position: relative;' +\n",
1267 " 'resize: both;'\n",
1268 " );\n",
1269 "\n",
1270 " function on_keyboard_event_closure(name) {\n",
1271 " return function (event) {\n",
1272 " return fig.key_event(event, name);\n",
1273 " };\n",
1274 " }\n",
1275 "\n",
1276 " canvas_div.addEventListener(\n",
1277 " 'keydown',\n",
1278 " on_keyboard_event_closure('key_press')\n",
1279 " );\n",
1280 " canvas_div.addEventListener(\n",
1281 " 'keyup',\n",
1282 " on_keyboard_event_closure('key_release')\n",
1283 " );\n",
1284 "\n",
1285 " this._canvas_extra_style(canvas_div);\n",
1286 " this.root.appendChild(canvas_div);\n",
1287 "\n",
1288 " var canvas = (this.canvas = document.createElement('canvas'));\n",
1289 " canvas.classList.add('mpl-canvas');\n",
1290 " canvas.setAttribute('style', 'box-sizing: content-box;');\n",
1291 "\n",
1292 " this.context = canvas.getContext('2d');\n",
1293 "\n",
1294 " var backingStore =\n",
1295 " this.context.backingStorePixelRatio ||\n",
1296 " this.context.webkitBackingStorePixelRatio ||\n",
1297 " this.context.mozBackingStorePixelRatio ||\n",
1298 " this.context.msBackingStorePixelRatio ||\n",
1299 " this.context.oBackingStorePixelRatio ||\n",
1300 " this.context.backingStorePixelRatio ||\n",
1301 " 1;\n",
1302 "\n",
1303 " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
1304 "\n",
1305 " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
1306 " 'canvas'\n",
1307 " ));\n",
1308 " rubberband_canvas.setAttribute(\n",
1309 " 'style',\n",
1310 " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
1311 " );\n",
1312 "\n",
1313 " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
1314 " if (this.ResizeObserver === undefined) {\n",
1315 " if (window.ResizeObserver !== undefined) {\n",
1316 " this.ResizeObserver = window.ResizeObserver;\n",
1317 " } else {\n",
1318 " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
1319 " this.ResizeObserver = obs.ResizeObserver;\n",
1320 " }\n",
1321 " }\n",
1322 "\n",
1323 " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
1324 " var nentries = entries.length;\n",
1325 " for (var i = 0; i < nentries; i++) {\n",
1326 " var entry = entries[i];\n",
1327 " var width, height;\n",
1328 " if (entry.contentBoxSize) {\n",
1329 " if (entry.contentBoxSize instanceof Array) {\n",
1330 " // Chrome 84 implements new version of spec.\n",
1331 " width = entry.contentBoxSize[0].inlineSize;\n",
1332 " height = entry.contentBoxSize[0].blockSize;\n",
1333 " } else {\n",
1334 " // Firefox implements old version of spec.\n",
1335 " width = entry.contentBoxSize.inlineSize;\n",
1336 " height = entry.contentBoxSize.blockSize;\n",
1337 " }\n",
1338 " } else {\n",
1339 " // Chrome <84 implements even older version of spec.\n",
1340 " width = entry.contentRect.width;\n",
1341 " height = entry.contentRect.height;\n",
1342 " }\n",
1343 "\n",
1344 " // Keep the size of the canvas and rubber band canvas in sync with\n",
1345 " // the canvas container.\n",
1346 " if (entry.devicePixelContentBoxSize) {\n",
1347 " // Chrome 84 implements new version of spec.\n",
1348 " canvas.setAttribute(\n",
1349 " 'width',\n",
1350 " entry.devicePixelContentBoxSize[0].inlineSize\n",
1351 " );\n",
1352 " canvas.setAttribute(\n",
1353 " 'height',\n",
1354 " entry.devicePixelContentBoxSize[0].blockSize\n",
1355 " );\n",
1356 " } else {\n",
1357 " canvas.setAttribute('width', width * fig.ratio);\n",
1358 " canvas.setAttribute('height', height * fig.ratio);\n",
1359 " }\n",
1360 " canvas.setAttribute(\n",
1361 " 'style',\n",
1362 " 'width: ' + width + 'px; height: ' + height + 'px;'\n",
1363 " );\n",
1364 "\n",
1365 " rubberband_canvas.setAttribute('width', width);\n",
1366 " rubberband_canvas.setAttribute('height', height);\n",
1367 "\n",
1368 " // And update the size in Python. We ignore the initial 0/0 size\n",
1369 " // that occurs as the element is placed into the DOM, which should\n",
1370 " // otherwise not happen due to the minimum size styling.\n",
1371 " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
1372 " fig.request_resize(width, height);\n",
1373 " }\n",
1374 " }\n",
1375 " });\n",
1376 " this.resizeObserverInstance.observe(canvas_div);\n",
1377 "\n",
1378 " function on_mouse_event_closure(name) {\n",
1379 " return function (event) {\n",
1380 " return fig.mouse_event(event, name);\n",
1381 " };\n",
1382 " }\n",
1383 "\n",
1384 " rubberband_canvas.addEventListener(\n",
1385 " 'mousedown',\n",
1386 " on_mouse_event_closure('button_press')\n",
1387 " );\n",
1388 " rubberband_canvas.addEventListener(\n",
1389 " 'mouseup',\n",
1390 " on_mouse_event_closure('button_release')\n",
1391 " );\n",
1392 " // Throttle sequential mouse events to 1 every 20ms.\n",
1393 " rubberband_canvas.addEventListener(\n",
1394 " 'mousemove',\n",
1395 " on_mouse_event_closure('motion_notify')\n",
1396 " );\n",
1397 "\n",
1398 " rubberband_canvas.addEventListener(\n",
1399 " 'mouseenter',\n",
1400 " on_mouse_event_closure('figure_enter')\n",
1401 " );\n",
1402 " rubberband_canvas.addEventListener(\n",
1403 " 'mouseleave',\n",
1404 " on_mouse_event_closure('figure_leave')\n",
1405 " );\n",
1406 "\n",
1407 " canvas_div.addEventListener('wheel', function (event) {\n",
1408 " if (event.deltaY < 0) {\n",
1409 " event.step = 1;\n",
1410 " } else {\n",
1411 " event.step = -1;\n",
1412 " }\n",
1413 " on_mouse_event_closure('scroll')(event);\n",
1414 " });\n",
1415 "\n",
1416 " canvas_div.appendChild(canvas);\n",
1417 " canvas_div.appendChild(rubberband_canvas);\n",
1418 "\n",
1419 " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
1420 " this.rubberband_context.strokeStyle = '#000000';\n",
1421 "\n",
1422 " this._resize_canvas = function (width, height, forward) {\n",
1423 " if (forward) {\n",
1424 " canvas_div.style.width = width + 'px';\n",
1425 " canvas_div.style.height = height + 'px';\n",
1426 " }\n",
1427 " };\n",
1428 "\n",
1429 " // Disable right mouse context menu.\n",
1430 " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
1431 " event.preventDefault();\n",
1432 " return false;\n",
1433 " });\n",
1434 "\n",
1435 " function set_focus() {\n",
1436 " canvas.focus();\n",
1437 " canvas_div.focus();\n",
1438 " }\n",
1439 "\n",
1440 " window.setTimeout(set_focus, 100);\n",
1441 "};\n",
1442 "\n",
1443 "mpl.figure.prototype._init_toolbar = function () {\n",
1444 " var fig = this;\n",
1445 "\n",
1446 " var toolbar = document.createElement('div');\n",
1447 " toolbar.classList = 'mpl-toolbar';\n",
1448 " this.root.appendChild(toolbar);\n",
1449 "\n",
1450 " function on_click_closure(name) {\n",
1451 " return function (_event) {\n",
1452 " return fig.toolbar_button_onclick(name);\n",
1453 " };\n",
1454 " }\n",
1455 "\n",
1456 " function on_mouseover_closure(tooltip) {\n",
1457 " return function (event) {\n",
1458 " if (!event.currentTarget.disabled) {\n",
1459 " return fig.toolbar_button_onmouseover(tooltip);\n",
1460 " }\n",
1461 " };\n",
1462 " }\n",
1463 "\n",
1464 " fig.buttons = {};\n",
1465 " var buttonGroup = document.createElement('div');\n",
1466 " buttonGroup.classList = 'mpl-button-group';\n",
1467 " for (var toolbar_ind in mpl.toolbar_items) {\n",
1468 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
1469 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
1470 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
1471 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
1472 "\n",
1473 " if (!name) {\n",
1474 " /* Instead of a spacer, we start a new button group. */\n",
1475 " if (buttonGroup.hasChildNodes()) {\n",
1476 " toolbar.appendChild(buttonGroup);\n",
1477 " }\n",
1478 " buttonGroup = document.createElement('div');\n",
1479 " buttonGroup.classList = 'mpl-button-group';\n",
1480 " continue;\n",
1481 " }\n",
1482 "\n",
1483 " var button = (fig.buttons[name] = document.createElement('button'));\n",
1484 " button.classList = 'mpl-widget';\n",
1485 " button.setAttribute('role', 'button');\n",
1486 " button.setAttribute('aria-disabled', 'false');\n",
1487 " button.addEventListener('click', on_click_closure(method_name));\n",
1488 " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
1489 "\n",
1490 " var icon_img = document.createElement('img');\n",
1491 " icon_img.src = '_images/' + image + '.png';\n",
1492 " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
1493 " icon_img.alt = tooltip;\n",
1494 " button.appendChild(icon_img);\n",
1495 "\n",
1496 " buttonGroup.appendChild(button);\n",
1497 " }\n",
1498 "\n",
1499 " if (buttonGroup.hasChildNodes()) {\n",
1500 " toolbar.appendChild(buttonGroup);\n",
1501 " }\n",
1502 "\n",
1503 " var fmt_picker = document.createElement('select');\n",
1504 " fmt_picker.classList = 'mpl-widget';\n",
1505 " toolbar.appendChild(fmt_picker);\n",
1506 " this.format_dropdown = fmt_picker;\n",
1507 "\n",
1508 " for (var ind in mpl.extensions) {\n",
1509 " var fmt = mpl.extensions[ind];\n",
1510 " var option = document.createElement('option');\n",
1511 " option.selected = fmt === mpl.default_extension;\n",
1512 " option.innerHTML = fmt;\n",
1513 " fmt_picker.appendChild(option);\n",
1514 " }\n",
1515 "\n",
1516 " var status_bar = document.createElement('span');\n",
1517 " status_bar.classList = 'mpl-message';\n",
1518 " toolbar.appendChild(status_bar);\n",
1519 " this.message = status_bar;\n",
1520 "};\n",
1521 "\n",
1522 "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
1523 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
1524 " // which will in turn request a refresh of the image.\n",
1525 " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
1526 "};\n",
1527 "\n",
1528 "mpl.figure.prototype.send_message = function (type, properties) {\n",
1529 " properties['type'] = type;\n",
1530 " properties['figure_id'] = this.id;\n",
1531 " this.ws.send(JSON.stringify(properties));\n",
1532 "};\n",
1533 "\n",
1534 "mpl.figure.prototype.send_draw_message = function () {\n",
1535 " if (!this.waiting) {\n",
1536 " this.waiting = true;\n",
1537 " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
1538 " }\n",
1539 "};\n",
1540 "\n",
1541 "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
1542 " var format_dropdown = fig.format_dropdown;\n",
1543 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
1544 " fig.ondownload(fig, format);\n",
1545 "};\n",
1546 "\n",
1547 "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
1548 " var size = msg['size'];\n",
1549 " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
1550 " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
1551 " fig.send_message('refresh', {});\n",
1552 " }\n",
1553 "};\n",
1554 "\n",
1555 "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
1556 " var x0 = msg['x0'] / fig.ratio;\n",
1557 " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
1558 " var x1 = msg['x1'] / fig.ratio;\n",
1559 " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
1560 " x0 = Math.floor(x0) + 0.5;\n",
1561 " y0 = Math.floor(y0) + 0.5;\n",
1562 " x1 = Math.floor(x1) + 0.5;\n",
1563 " y1 = Math.floor(y1) + 0.5;\n",
1564 " var min_x = Math.min(x0, x1);\n",
1565 " var min_y = Math.min(y0, y1);\n",
1566 " var width = Math.abs(x1 - x0);\n",
1567 " var height = Math.abs(y1 - y0);\n",
1568 "\n",
1569 " fig.rubberband_context.clearRect(\n",
1570 " 0,\n",
1571 " 0,\n",
1572 " fig.canvas.width / fig.ratio,\n",
1573 " fig.canvas.height / fig.ratio\n",
1574 " );\n",
1575 "\n",
1576 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
1577 "};\n",
1578 "\n",
1579 "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
1580 " // Updates the figure title.\n",
1581 " fig.header.textContent = msg['label'];\n",
1582 "};\n",
1583 "\n",
1584 "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
1585 " var cursor = msg['cursor'];\n",
1586 " switch (cursor) {\n",
1587 " case 0:\n",
1588 " cursor = 'pointer';\n",
1589 " break;\n",
1590 " case 1:\n",
1591 " cursor = 'default';\n",
1592 " break;\n",
1593 " case 2:\n",
1594 " cursor = 'crosshair';\n",
1595 " break;\n",
1596 " case 3:\n",
1597 " cursor = 'move';\n",
1598 " break;\n",
1599 " }\n",
1600 " fig.rubberband_canvas.style.cursor = cursor;\n",
1601 "};\n",
1602 "\n",
1603 "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
1604 " fig.message.textContent = msg['message'];\n",
1605 "};\n",
1606 "\n",
1607 "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
1608 " // Request the server to send over a new figure.\n",
1609 " fig.send_draw_message();\n",
1610 "};\n",
1611 "\n",
1612 "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
1613 " fig.image_mode = msg['mode'];\n",
1614 "};\n",
1615 "\n",
1616 "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
1617 " for (var key in msg) {\n",
1618 " if (!(key in fig.buttons)) {\n",
1619 " continue;\n",
1620 " }\n",
1621 " fig.buttons[key].disabled = !msg[key];\n",
1622 " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
1623 " }\n",
1624 "};\n",
1625 "\n",
1626 "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
1627 " if (msg['mode'] === 'PAN') {\n",
1628 " fig.buttons['Pan'].classList.add('active');\n",
1629 " fig.buttons['Zoom'].classList.remove('active');\n",
1630 " } else if (msg['mode'] === 'ZOOM') {\n",
1631 " fig.buttons['Pan'].classList.remove('active');\n",
1632 " fig.buttons['Zoom'].classList.add('active');\n",
1633 " } else {\n",
1634 " fig.buttons['Pan'].classList.remove('active');\n",
1635 " fig.buttons['Zoom'].classList.remove('active');\n",
1636 " }\n",
1637 "};\n",
1638 "\n",
1639 "mpl.figure.prototype.updated_canvas_event = function () {\n",
1640 " // Called whenever the canvas gets updated.\n",
1641 " this.send_message('ack', {});\n",
1642 "};\n",
1643 "\n",
1644 "// A function to construct a web socket function for onmessage handling.\n",
1645 "// Called in the figure constructor.\n",
1646 "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
1647 " return function socket_on_message(evt) {\n",
1648 " if (evt.data instanceof Blob) {\n",
1649 " /* FIXME: We get \"Resource interpreted as Image but\n",
1650 " * transferred with MIME type text/plain:\" errors on\n",
1651 " * Chrome. But how to set the MIME type? It doesn't seem\n",
1652 " * to be part of the websocket stream */\n",
1653 " evt.data.type = 'image/png';\n",
1654 "\n",
1655 " /* Free the memory for the previous frames */\n",
1656 " if (fig.imageObj.src) {\n",
1657 " (window.URL || window.webkitURL).revokeObjectURL(\n",
1658 " fig.imageObj.src\n",
1659 " );\n",
1660 " }\n",
1661 "\n",
1662 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
1663 " evt.data\n",
1664 " );\n",
1665 " fig.updated_canvas_event();\n",
1666 " fig.waiting = false;\n",
1667 " return;\n",
1668 " } else if (\n",
1669 " typeof evt.data === 'string' &&\n",
1670 " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
1671 " ) {\n",
1672 " fig.imageObj.src = evt.data;\n",
1673 " fig.updated_canvas_event();\n",
1674 " fig.waiting = false;\n",
1675 " return;\n",
1676 " }\n",
1677 "\n",
1678 " var msg = JSON.parse(evt.data);\n",
1679 " var msg_type = msg['type'];\n",
1680 "\n",
1681 " // Call the \"handle_{type}\" callback, which takes\n",
1682 " // the figure and JSON message as its only arguments.\n",
1683 " try {\n",
1684 " var callback = fig['handle_' + msg_type];\n",
1685 " } catch (e) {\n",
1686 " console.log(\n",
1687 " \"No handler for the '\" + msg_type + \"' message type: \",\n",
1688 " msg\n",
1689 " );\n",
1690 " return;\n",
1691 " }\n",
1692 "\n",
1693 " if (callback) {\n",
1694 " try {\n",
1695 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
1696 " callback(fig, msg);\n",
1697 " } catch (e) {\n",
1698 " console.log(\n",
1699 " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
1700 " e,\n",
1701 " e.stack,\n",
1702 " msg\n",
1703 " );\n",
1704 " }\n",
1705 " }\n",
1706 " };\n",
1707 "};\n",
1708 "\n",
1709 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
1710 "mpl.findpos = function (e) {\n",
1711 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
1712 " var targ;\n",
1713 " if (!e) {\n",
1714 " e = window.event;\n",
1715 " }\n",
1716 " if (e.target) {\n",
1717 " targ = e.target;\n",
1718 " } else if (e.srcElement) {\n",
1719 " targ = e.srcElement;\n",
1720 " }\n",
1721 " if (targ.nodeType === 3) {\n",
1722 " // defeat Safari bug\n",
1723 " targ = targ.parentNode;\n",
1724 " }\n",
1725 "\n",
1726 " // pageX,Y are the mouse positions relative to the document\n",
1727 " var boundingRect = targ.getBoundingClientRect();\n",
1728 " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
1729 " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
1730 "\n",
1731 " return { x: x, y: y };\n",
1732 "};\n",
1733 "\n",
1734 "/*\n",
1735 " * return a copy of an object with only non-object keys\n",
1736 " * we need this to avoid circular references\n",
1737 " * http://stackoverflow.com/a/24161582/3208463\n",
1738 " */\n",
1739 "function simpleKeys(original) {\n",
1740 " return Object.keys(original).reduce(function (obj, key) {\n",
1741 " if (typeof original[key] !== 'object') {\n",
1742 " obj[key] = original[key];\n",
1743 " }\n",
1744 " return obj;\n",
1745 " }, {});\n",
1746 "}\n",
1747 "\n",
1748 "mpl.figure.prototype.mouse_event = function (event, name) {\n",
1749 " var canvas_pos = mpl.findpos(event);\n",
1750 "\n",
1751 " if (name === 'button_press') {\n",
1752 " this.canvas.focus();\n",
1753 " this.canvas_div.focus();\n",
1754 " }\n",
1755 "\n",
1756 " var x = canvas_pos.x * this.ratio;\n",
1757 " var y = canvas_pos.y * this.ratio;\n",
1758 "\n",
1759 " this.send_message(name, {\n",
1760 " x: x,\n",
1761 " y: y,\n",
1762 " button: event.button,\n",
1763 " step: event.step,\n",
1764 " guiEvent: simpleKeys(event),\n",
1765 " });\n",
1766 "\n",
1767 " /* This prevents the web browser from automatically changing to\n",
1768 " * the text insertion cursor when the button is pressed. We want\n",
1769 " * to control all of the cursor setting manually through the\n",
1770 " * 'cursor' event from matplotlib */\n",
1771 " event.preventDefault();\n",
1772 " return false;\n",
1773 "};\n",
1774 "\n",
1775 "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
1776 " // Handle any extra behaviour associated with a key event\n",
1777 "};\n",
1778 "\n",
1779 "mpl.figure.prototype.key_event = function (event, name) {\n",
1780 " // Prevent repeat events\n",
1781 " if (name === 'key_press') {\n",
1782 " if (event.which === this._key) {\n",
1783 " return;\n",
1784 " } else {\n",
1785 " this._key = event.which;\n",
1786 " }\n",
1787 " }\n",
1788 " if (name === 'key_release') {\n",
1789 " this._key = null;\n",
1790 " }\n",
1791 "\n",
1792 " var value = '';\n",
1793 " if (event.ctrlKey && event.which !== 17) {\n",
1794 " value += 'ctrl+';\n",
1795 " }\n",
1796 " if (event.altKey && event.which !== 18) {\n",
1797 " value += 'alt+';\n",
1798 " }\n",
1799 " if (event.shiftKey && event.which !== 16) {\n",
1800 " value += 'shift+';\n",
1801 " }\n",
1802 "\n",
1803 " value += 'k';\n",
1804 " value += event.which.toString();\n",
1805 "\n",
1806 " this._key_event_extra(event, name);\n",
1807 "\n",
1808 " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
1809 " return false;\n",
1810 "};\n",
1811 "\n",
1812 "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
1813 " if (name === 'download') {\n",
1814 " this.handle_save(this, null);\n",
1815 " } else {\n",
1816 " this.send_message('toolbar_button', { name: name });\n",
1817 " }\n",
1818 "};\n",
1819 "\n",
1820 "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
1821 " this.message.textContent = tooltip;\n",
1822 "};\n",
1823 "\n",
1824 "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
1825 "// prettier-ignore\n",
1826 "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
1827 "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
1828 "\n",
1829 "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
1830 "\n",
1831 "mpl.default_extension = \"png\";/* global mpl */\n",
1832 "\n",
1833 "var comm_websocket_adapter = function (comm) {\n",
1834 " // Create a \"websocket\"-like object which calls the given IPython comm\n",
1835 " // object with the appropriate methods. Currently this is a non binary\n",
1836 " // socket, so there is still some room for performance tuning.\n",
1837 " var ws = {};\n",
1838 "\n",
1839 " ws.close = function () {\n",
1840 " comm.close();\n",
1841 " };\n",
1842 " ws.send = function (m) {\n",
1843 " //console.log('sending', m);\n",
1844 " comm.send(m);\n",
1845 " };\n",
1846 " // Register the callback with on_msg.\n",
1847 " comm.on_msg(function (msg) {\n",
1848 " //console.log('receiving', msg['content']['data'], msg);\n",
1849 " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
1850 " ws.onmessage(msg['content']['data']);\n",
1851 " });\n",
1852 " return ws;\n",
1853 "};\n",
1854 "\n",
1855 "mpl.mpl_figure_comm = function (comm, msg) {\n",
1856 " // This is the function which gets called when the mpl process\n",
1857 " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
1858 "\n",
1859 " var id = msg.content.data.id;\n",
1860 " // Get hold of the div created by the display call when the Comm\n",
1861 " // socket was opened in Python.\n",
1862 " var element = document.getElementById(id);\n",
1863 " var ws_proxy = comm_websocket_adapter(comm);\n",
1864 "\n",
1865 " function ondownload(figure, _format) {\n",
1866 " window.open(figure.canvas.toDataURL());\n",
1867 " }\n",
1868 "\n",
1869 " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
1870 "\n",
1871 " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
1872 " // web socket which is closed, not our websocket->open comm proxy.\n",
1873 " ws_proxy.onopen();\n",
1874 "\n",
1875 " fig.parent_element = element;\n",
1876 " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
1877 " if (!fig.cell_info) {\n",
1878 " console.error('Failed to find cell for figure', id, fig);\n",
1879 " return;\n",
1880 " }\n",
1881 " fig.cell_info[0].output_area.element.on(\n",
1882 " 'cleared',\n",
1883 " { fig: fig },\n",
1884 " fig._remove_fig_handler\n",
1885 " );\n",
1886 "};\n",
1887 "\n",
1888 "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
1889 " var width = fig.canvas.width / fig.ratio;\n",
1890 " fig.cell_info[0].output_area.element.off(\n",
1891 " 'cleared',\n",
1892 " fig._remove_fig_handler\n",
1893 " );\n",
1894 " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
1895 "\n",
1896 " // Update the output cell to use the data from the current canvas.\n",
1897 " fig.push_to_output();\n",
1898 " var dataURL = fig.canvas.toDataURL();\n",
1899 " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
1900 " // the notebook keyboard shortcuts fail.\n",
1901 " IPython.keyboard_manager.enable();\n",
1902 " fig.parent_element.innerHTML =\n",
1903 " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
1904 " fig.close_ws(fig, msg);\n",
1905 "};\n",
1906 "\n",
1907 "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
1908 " fig.send_message('closing', msg);\n",
1909 " // fig.ws.close()\n",
1910 "};\n",
1911 "\n",
1912 "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
1913 " // Turn the data on the canvas into data in the output cell.\n",
1914 " var width = this.canvas.width / this.ratio;\n",
1915 " var dataURL = this.canvas.toDataURL();\n",
1916 " this.cell_info[1]['text/html'] =\n",
1917 " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
1918 "};\n",
1919 "\n",
1920 "mpl.figure.prototype.updated_canvas_event = function () {\n",
1921 " // Tell IPython that the notebook contents must change.\n",
1922 " IPython.notebook.set_dirty(true);\n",
1923 " this.send_message('ack', {});\n",
1924 " var fig = this;\n",
1925 " // Wait a second, then push the new image to the DOM so\n",
1926 " // that it is saved nicely (might be nice to debounce this).\n",
1927 " setTimeout(function () {\n",
1928 " fig.push_to_output();\n",
1929 " }, 1000);\n",
1930 "};\n",
1931 "\n",
1932 "mpl.figure.prototype._init_toolbar = function () {\n",
1933 " var fig = this;\n",
1934 "\n",
1935 " var toolbar = document.createElement('div');\n",
1936 " toolbar.classList = 'btn-toolbar';\n",
1937 " this.root.appendChild(toolbar);\n",
1938 "\n",
1939 " function on_click_closure(name) {\n",
1940 " return function (_event) {\n",
1941 " return fig.toolbar_button_onclick(name);\n",
1942 " };\n",
1943 " }\n",
1944 "\n",
1945 " function on_mouseover_closure(tooltip) {\n",
1946 " return function (event) {\n",
1947 " if (!event.currentTarget.disabled) {\n",
1948 " return fig.toolbar_button_onmouseover(tooltip);\n",
1949 " }\n",
1950 " };\n",
1951 " }\n",
1952 "\n",
1953 " fig.buttons = {};\n",
1954 " var buttonGroup = document.createElement('div');\n",
1955 " buttonGroup.classList = 'btn-group';\n",
1956 " var button;\n",
1957 " for (var toolbar_ind in mpl.toolbar_items) {\n",
1958 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
1959 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
1960 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
1961 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
1962 "\n",
1963 " if (!name) {\n",
1964 " /* Instead of a spacer, we start a new button group. */\n",
1965 " if (buttonGroup.hasChildNodes()) {\n",
1966 " toolbar.appendChild(buttonGroup);\n",
1967 " }\n",
1968 " buttonGroup = document.createElement('div');\n",
1969 " buttonGroup.classList = 'btn-group';\n",
1970 " continue;\n",
1971 " }\n",
1972 "\n",
1973 " button = fig.buttons[name] = document.createElement('button');\n",
1974 " button.classList = 'btn btn-default';\n",
1975 " button.href = '#';\n",
1976 " button.title = name;\n",
1977 " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
1978 " button.addEventListener('click', on_click_closure(method_name));\n",
1979 " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
1980 " buttonGroup.appendChild(button);\n",
1981 " }\n",
1982 "\n",
1983 " if (buttonGroup.hasChildNodes()) {\n",
1984 " toolbar.appendChild(buttonGroup);\n",
1985 " }\n",
1986 "\n",
1987 " // Add the status bar.\n",
1988 " var status_bar = document.createElement('span');\n",
1989 " status_bar.classList = 'mpl-message pull-right';\n",
1990 " toolbar.appendChild(status_bar);\n",
1991 " this.message = status_bar;\n",
1992 "\n",
1993 " // Add the close button to the window.\n",
1994 " var buttongrp = document.createElement('div');\n",
1995 " buttongrp.classList = 'btn-group inline pull-right';\n",
1996 " button = document.createElement('button');\n",
1997 " button.classList = 'btn btn-mini btn-primary';\n",
1998 " button.href = '#';\n",
1999 " button.title = 'Stop Interaction';\n",
2000 " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
2001 " button.addEventListener('click', function (_evt) {\n",
2002 " fig.handle_close(fig, {});\n",
2003 " });\n",
2004 " button.addEventListener(\n",
2005 " 'mouseover',\n",
2006 " on_mouseover_closure('Stop Interaction')\n",
2007 " );\n",
2008 " buttongrp.appendChild(button);\n",
2009 " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
2010 " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
2011 "};\n",
2012 "\n",
2013 "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
2014 " var fig = event.data.fig;\n",
2015 " if (event.target !== this) {\n",
2016 " // Ignore bubbled events from children.\n",
2017 " return;\n",
2018 " }\n",
2019 " fig.close_ws(fig, {});\n",
2020 "};\n",
2021 "\n",
2022 "mpl.figure.prototype._root_extra_style = function (el) {\n",
2023 " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
2024 "};\n",
2025 "\n",
2026 "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
2027 " // this is important to make the div 'focusable\n",
2028 " el.setAttribute('tabindex', 0);\n",
2029 " // reach out to IPython and tell the keyboard manager to turn it's self\n",
2030 " // off when our div gets focus\n",
2031 "\n",
2032 " // location in version 3\n",
2033 " if (IPython.notebook.keyboard_manager) {\n",
2034 " IPython.notebook.keyboard_manager.register_events(el);\n",
2035 " } else {\n",
2036 " // location in version 2\n",
2037 " IPython.keyboard_manager.register_events(el);\n",
2038 " }\n",
2039 "};\n",
2040 "\n",
2041 "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
2042 " var manager = IPython.notebook.keyboard_manager;\n",
2043 " if (!manager) {\n",
2044 " manager = IPython.keyboard_manager;\n",
2045 " }\n",
2046 "\n",
2047 " // Check for shift+enter\n",
2048 " if (event.shiftKey && event.which === 13) {\n",
2049 " this.canvas_div.blur();\n",
2050 " // select the cell after this one\n",
2051 " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
2052 " IPython.notebook.select(index + 1);\n",
2053 " }\n",
2054 "};\n",
2055 "\n",
2056 "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
2057 " fig.ondownload(fig, null);\n",
2058 "};\n",
2059 "\n",
2060 "mpl.find_output_cell = function (html_output) {\n",
2061 " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
2062 " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
2063 " // IPython event is triggered only after the cells have been serialised, which for\n",
2064 " // our purposes (turning an active figure into a static one), is too late.\n",
2065 " var cells = IPython.notebook.get_cells();\n",
2066 " var ncells = cells.length;\n",
2067 " for (var i = 0; i < ncells; i++) {\n",
2068 " var cell = cells[i];\n",
2069 " if (cell.cell_type === 'code') {\n",
2070 " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
2071 " var data = cell.output_area.outputs[j];\n",
2072 " if (data.data) {\n",
2073 " // IPython >= 3 moved mimebundle to data attribute of output\n",
2074 " data = data.data;\n",
2075 " }\n",
2076 " if (data['text/html'] === html_output) {\n",
2077 " return [cell, data, j];\n",
2078 " }\n",
2079 " }\n",
2080 " }\n",
2081 " }\n",
2082 "};\n",
2083 "\n",
2084 "// Register the function which deals with the matplotlib target/channel.\n",
2085 "// The kernel may be null if the page has been refreshed.\n",
2086 "if (IPython.notebook.kernel !== null) {\n",
2087 " IPython.notebook.kernel.comm_manager.register_target(\n",
2088 " 'matplotlib',\n",
2089 " mpl.mpl_figure_comm\n",
2090 " );\n",
2091 "}\n"
2092 ],
2093 "text/plain": [
2094 "<IPython.core.display.Javascript object>"
2095 ]
2096 },
2097 "metadata": {},
2098 "output_type": "display_data"
2099 },
2100 {
2101 "data": {
2102 "text/html": [
2103 "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xu2dCdxdRXn/nzcBwhaIsRD2EBDQJG1lKzuIZYm1SgSLtI2AmgCiVPCvUElJgRAQsbhVWUQBwYViIWgtYalCwmYBxQIJKLKILAEUUhAJhbz/z+/Aebm5773vPec+Z5lzzvd8Pnxs887MmfnOM/P85pmZcwcGBwcHjQcCEIAABCAAAQhAoDEEBhCAjelrGgoBCEAAAhCAAAQiAghADAECEIAABCAAAQg0jAACsGEdTnMhAAEIQAACEIAAAhAbgAAEIAABCEAAAg0jgABsWIfTXAhAAAIQgAAEIIAAxAYgAAEIQAACEIBAwwggABvW4TQXAhCAAAQgAAEIIACxAQhAAAIQgAAEINAwAgjAhnU4zYUABCAAAQhAAAIIQGwAAhCAAAQgAAEINIwAArBhHU5zIQABCEAAAhCAAAIQG4AABCAAAQhAAAINI4AAbFiH01wIQAACEIAABCCAAMQGIAABCEAAAhCAQMMIIAAb1uE0FwIQgAAEIAABCCAAsQEIQAACEIAABCDQMAIIwIZ1OM2FAAQgAAEIQAACCEBsAAIQgAAEIAABCDSMAAKwYR1OcyEAAQhAAAIQgAACEBuAAAQgAAEIQAACDSOAAGxYh9NcCEAAAhCAAAQggADEBiAAAQhAAAIQgEDDCCAAG9bhNBcCEIAABCAAAQggALEBCEAAAhCAAAQg0DACCMCGdTjNhQAEIAABCEAAAghAbAACEIAABCAAAQg0jAACsGEdTnMhAAEIQAACEIAAAhAbgAAEIAABCEAAAg0jgABsWIfTXAhAAAIQgAAEIIAAxAYgAAEIQAACEIBAwwggABvW4TQXAhCAAAQgAAEIIACxAQhAAAIQgAAEINAwAgjAhnU4zYUABCAAAQhAAAIIQGwAAhCAAAQgAAEINIwAArBhHU5zIQABCEAAAhCAAAIQG4AABCAAAQhAAAINI4AArHiH/8///I994QtfsBtuuMGeeOIJW2WVVWzrrbe2Qw45xGbOnGnjx48PtoXveMc7orqp7jz5ErjooovsQx/6kD300EO2+eab5/uyEks//PDD7fvf/7698MILPWshDrJBsany0z6OXnzxRfvc5z4XtS3+W9y+k08+2U455RR7+umn7U/+5E+q3Oyo7nF7BgcHg2jL448/bueff75Nnz7d3v72twdRp7gSmmf33ntv+8lPfjLMLnpVNJ4/br/9dtthhx1GTK4xqHc9/PDDvYrl7yUTQACW3AGe13/961+3o48+2rbZZpvofydPnmz/93//Z3fccYfpb3/+539uV155pecVueZFAOaKd6XC5fB//etf27bbbmtjxowp7sUFv6mJAnDx4sURZY1/Pc8884ytt9569s///M+RQGp96iYAf/vb35r+23nnnQu2tM6v09y744472oUXXmiyxZCe//3f/zXZiuxknXXWSVU1BGAqXJVJjACsTFetXNFbb73V9thjD9t3331t/vz5w5z6yy+/bAsWLLD3vve9wbYwFAGo6MFLL71ka6yxRiGsFKFZc801C3lX1V+iBc3AwEAU2U7yNFEAtnNpkgBMYhNFpglRAKYdQ514IQCLtKLi3oUALI51pm96z3veEwm8Bx980DbddNOeZa9YscI+//nP2ze/+c1oG3Dddde1adOm2emnn26bbLLJUH6JMjkQRRD/3//7f/bzn//cJkyYEEUTtIX4ox/9yE466SS77777bMstt7SzzjorKid+4gjDz372M5s7d65df/31kQNXfbVVrchE/HQSgBKu2r669NJLo3pqpfrXf/3X0b/FeT/72c/aiSeeaFdddVVUbvzI+f/bv/2b/fSnP7U//dM/7cpE9fnYxz5mU6dOtS996UtRZOzLX/6yHXXUUfarX/0qaqvqvWzZMttiiy3s4x//eJS+9bn33nvtuOOOs5tuusnWWmstO/jgg+2v/uqvorq2brHEPL/2ta/ZP/7jP9pdd90VifLvfe97phX5qaeeav/+7/9ujz32WNS+v/mbv7F58+ZFZcbP5ZdfHvWdmGsy32CDDaItHPWlHvWt+vGSSy6x3/zmN9FiYLPNNrOPfOQj9olPfCJK020LWGWIwf333x+J0r322isq621ve9tKXLWtqrr/wz/8gy1cuNDe9KY3RW1W2l4RRW21irXqI7a//OUvbaONNrJjjz02Ki9+4i2qb33rW9G7xEjHGhS1eOtb3xq1N2ldZQMq+7bbbova9YEPfCCyoVbh3WkLOGmfxDa0/fbbm+xR3KdMmWL/+q//ajvttFPUX+pzRV7/4i/+ItoWfMtb3tLVJmVPYiT7lQ3oufPOO6PtNkVs9Pf4kf3IXvR3Pa3jSNtukyZNGvaeww47LLKBeHzec889dtppp9l//ud/2uqrr27vfve7o/GpeaHXk6YfkthMkjHfrU6dtoBje9O41TyxZMkSmzhxoh1//PH24Q9/eKioeExce+219p3vfCeaT5YvX27vfOc7IzvT2I+fbscFWtnH9tte106RWKX5xS9+EW0TX3DBBdHYaH2uvvrqaD5RndTfDzzwQDQvaL5R32v8bbfddtH4a53rRhpDTz755LAtYAlW2arGydKlS6O5fpdddolsWsziJw2rTlvAWmSfc8450TjQXCOb+8u//MtoTLZy7mV7/D1bAgjAbHkWUtqrr74aCSMNfA3cJM+RRx4ZDT5NihIpchQSchqIEmvxeSBNaHIO+v81YUocfuUrX7H/+I//iM4OSQhoUpWjkHiRQJQIlUPXE0/ImjwkEPbZZ5/IeeldOpsox7zqqqsOc1z6BwkZOaJFixZF7951113tkUceiUSD3qfJSlE6TSZqg6Kger/epS0XTe6dJtN2PnLeG2+8sb35zW+ORJkE1frrrx8JVb1T4unTn/509O/XXHNN5BjnzJkT1UOPRInYS6SJgfJ+97vfjeotru0C8O67747Sqk1y8qNGjYoc+2677RZtX4nnn/3Zn0Wc9B6Jilg4q41KJwFz6KGHRv0lJj/+8Y9NQkmPJut/+qd/iv7bc889I5Eosfjcc88N1bmTADzjjDOid//t3/6tzZgxw373u99F/af/1VmfrbbaKipfE7raJ8EvRyWnJREoga/0qvNIj5znK6+8YqNHj47Si+u3v/3t6D8tID71qU9F2WPnpb6RE1J7xUr/93nnnZeqrnqHbF7bcbfcckskdrRQ+eEPf9jVqSsym6RPVIBsRXanuqr++v9POOGEaPEksaUxMWvWrGgR8clPfjJyrBJDStft0RjSgkZt1XPmmWdGY+6Pf/xj5PT1d3GU3Wqxor/raRUhEjDiqLaqr3QOWI8WF+q/eHzq2IhsSrsIss/PfOYz9nd/93dDi4pudczaZpKO+W716SYA4zlS41vsNS9oIXXjjTdGY0RPPCa0gNZOioT3o48+Go0jLWp0vnrcuHFR2iQCUIuHK664IlooqwzNZXo0h7YuslvbIhGnRYmEXeujvlE/qt8V/dZ4+8EPfhCNBfXl73//e7v44ouj+UlzoPqz1xhSe9rPAGo+V//raIjOi2tuk1DTokv/xX4hDatOAvCII46IeGtRJtaqv+bOZ599NhLC6iOe4gkgAItn7n6jVmpycLroIcfc65EYUERH5wS/+tWvDiX/7//+7yhaIRGg1WXsTDRJSmxJiOjRYJXIWW211aKVaCz24hWsomfHHHNMlDaekBUdO/vss4fepRX23//930eRPf1vu+PS/6+Ij8SIImIHHnjgUN54W0URlY9+9KPRv0ukSIioLueee67tvvvuUR5FwXo9csISlIowaiUdP3KaEmH6r/WMjNomB6ID3kovIadVs4RyfO5KZSi/JuR2ASie//Vf/xVFFuJHom327NmRIG49VK22v//9748iM+9617vsX/7lXyKBITHXLToj0SAhKUfQ7WkXgCpP7OQQFNWNHzlACb+DDjooEmh6NKHL2bRGp/TvcnCKnsq+RnrkPBUhU/10LjV+9ttvv6j9cjpygrEAlIMWs/jpp66K4LRGFxUpEW85Wok8Pe1OPWmfKK9sSGNQ4yGO1ipaEx/+16IqFnuqi6KdcsAjRaY/+MEPRmJVTPXIUSqaJyf9xS9+MRLE+rvqr6iV/t5pHCXZAlbkRYuc+FGEW5E9ieBuIrWffuhlM2nGfCcb6yYANUcq0qTFnB4d8ZBYl8jTfKEnHhPve9/7IuEWPzFjLRpkM51sJU7bvouRdgtYi2vZqeqqBbIeiaINN9wwWqxrnun0SOBKPCvqrMVwPNd2G0MqI8klEJUrVhJkGjPxGErDql0AKkgh4aq5TIuh+NGcpTZrfo0XMyNOJPwxcwIIwMyR5l9gWgGoFZ3EnwSfIiKtT3wgOI4kakLTFp3ETusjsSCHqckxfrR1o5WytorjiSqekFsFpNIrcqHonaIjElN62idPRaEkRp566qlhTkirdAmDyy67bKWJWluWWiGrbnpn69Zpt56Qg2uf9DXpjR07NhKYrcJVZVx33XXRdkwsyiSaFZWRQ299JJI0+bULQKWTiG59JFiff/75oW28+G+qh8SnnLMmRa381UaJJUV05PzlyFofReIUnVRU6IADDogm2/ZD3u0CMN5ianfQKldtlYDRlpEetUnRRokDRSDjR1EjCROxGOlR34itIg2tT1wnRU7FI3ZQ7eItbV3VDxJBipTFT7w1KlaKzuhpF4BJ+0R5ZUNarGhhEz8aN4rEiIucZ/xIrO2///5R9FHOutsT81D0UAJAi404UiqBrMWNoiYqWyIhPrPaPo6SCECJ9jhqpPoo6ij7UZ93i8ak7YckNpN2zLez6yYAxU/R89ZH40IRPbVDT8xbAlsLntZHtqEte0XiO9lKnNYrADUvaG6VMIptRgtdCXItMCXw9Gj+jI/GaNGhKH/8aOEZt6nbGFLaTgJQt+U1JrTw1BiRAIwf2YN8R1pW7QJQ401tk221f5VCEWgJWS0EeYongAAsnrn7jWm3gLWS1RasojvtWxHaotWWos6+6YnPrGnyaZ8QtX2preDWJz4LpbNPeuIJWau7dqGiiIkm4fhmcvvkqYhGPOF2gqQImiJp8SMOilIqEtkuGkaCrDq3R0O11dJtmyYuSw5NURo5BkVmJAxbH53JVNSuXQDqHFjrGS7lUZRNE3m3R9vZ3/jGN6I/K7KkKOvNN98cnVGSU1BkQgJEj5yD/q7oqrYZtdUqsSwBGUcX2wWg0qotsfhqrYe2DSWiYifT7WJF0k9wyJmqvd146RKThGvsoNpFadq6SjS1Oki1Lb7ko0ictvT1tAvANH3SbvcqLxaZrdva+ve4XdqCVHS326Mxo4WOjmrIvuTYJeYU5ZeT1qJM/aojFK3joB8B2P4ZmCSfCUrbD50+x9NuM2nHfDu7kc4Ats9V7ZziNrdGhePydatYYy2OqifZAlbetBFA5dFRGS2sNQ9r7OrMqOyrVRQpEqfdGx0z0IJQiwMdj9BYlaiNP6XVbQy12mHr/KTzhbIl+QcFB7Rw1Lu1CNR/8SeS0rBqF4A6ChEv+jvZvs4AxlHvkeZt/pY9AQRg9kwLKVEDV6s+bWP2Ei69IoDaWoxXy1kJwH4igBI0EgkSUp0eRZFaoxZaWepMks6vSEwpapXkQHEn563oliY/iaL2Cx9xXeSUFVXqFgGMJ8lOl0DaBbWE8B/+8IeuZ6509qb9e31ySIrUqs3aapbTUDmtj7bpJKK1ra9tcol+RY/SRgDl+LQ1qycLAZgmAtgulHpFntrr2m8EME2f5CEAxVr2raMN6nttg6u/48ii/m9FTHQuUFHG+ClKAKbthyQCMO2Yz0MAJokA6hKS5pn2IzdaFGusxgKsHwEYc9X/astaCzzN2YrAxY8iZ1ok6axz66O5XwvSdgHYabHRHgHU+VQJSe0exOebVbbmGe2kKDrbLgCTsGoXgLJVLUa12Ox0YUz/NtLRiEIcakNfggCsaMe3fgZGESKdz2t9FAGRkNL5MJ0v0QSmVaQiZfGjg/5abSqapCihnqwEYLczgNrG0sQSv0v/G09eitzob3J0ElkjPRKKipBIBCqqI6epc4qKkrWzaC+nk/NWGkUjFBnRVvlIZaQ9A6goTrsA1JlLbYvo3zvd2hyp7fHZS0UEFMns9MTnzhR51DZ/tzOAarPsJ34UhZJDUaRKEZ+sBGC3M4Dqa20NtZ4BbHde8dmzpHWVAOx2BrA14tke1UnTJ3kJQC0+FAFVJFBnLBX506MLJxrD2k5uP8rRLgB1tECLGdlp+9mqbt8BTBIBTNsPSQRgmjHfyc6ziAB2OwPYelxAc40WU62RfAlziTUdy4jnMB1z0IWu1vPKvVyMdjLUvypHAlC7KRoTrWd+tfBsPb+oMnVcRkcKFBHsRwDq0oreoQWlLsvEj+YVnT+Mb47r33udAWxl1S4ANSfreIWO7yjayRMOAQRgOH2Ruibxh6DlGHR2TZORhJ8iItpG0uo03m7VjUil12dBtE0Z3wLW6kvp4/NSWQnA+BawnHZ8C1i3EFvFVbvj0kQowaqtD9VT4lTbXRIliqppBazJWpEpCT61V9EubYVISGh7TIJI59JGeroJQN1600SlrUDxlECQM1V0Uee3dPNWj7biNMnHt4B1ZkpnwXReT9s4rTcNu/FU9E/RHAlOiWWVp7MwEkpy8jpXKRGsG7Zqvz6ZoNW+nLDEjbat1G9iIGbqa2336oag6qB8ui2trX0xHOkWsKKeisQoYhj/SkT7LeAkzrwb8/ZbwDqfJXEp5y+BIqESLwR0KaVT9CK+fZqkrorSdLoFLFvUOc74aReASftE+fMSgLqMEJ9Ha7UjHQlQ9EcRGy0oZPPx0+lzSmqbzmvqaICiR3FE2SMA9b40/ZDEZpKO+W62lYUAlNjWGdv4FrAWxBozOrsbn1mLharmBfWPxpjO5ElE6SJDLMC0kyDWut2rRfXaa68dnfGLL851a4ci9jp7LOEuO40vYMXpJcYkoHRRSXOFPgGkowaavzWv9iMAVbbEoxahGodx1FlHT3SuV/NtewQwCatOt4DlfzTmtcDRPK25U/O45jFF/+LLfamdIBlcBBCALnzlZ1Y0SGeaJJC0atTEpQlJokCruPjbefF3ADW4W78DqAm903cAvWcANUFpcla95Cy1UpUwU5RuJMel82wSOIoUKnKpCx6qnyYq3YZVtExiSIfYdd5Njj5+dBFFlyckenUbs9vTTQAqvYSxVrPaYtVlFJ2vkSDUeZj4RqDSSdQq8qgJTNErCVNNbJqo1SeapPV0E4D6mwSHJnQJHvWJDvUrAqBzmTrrI2GpVb5W5HJGEouqj4SetlUkVvXIcegQtyISckhiIieicz3xt7y6RXhkDxIJ4qn3q76KTLbebs5iC1gCVZ/H0FaTRKkcoiLSEr/x0+usXJq6KkKu8rWYULv0WQ05zNZLQp3OdSXpkzwFoAS+FmOqsy56xJ9Mim/R66a7+rr16SQAda5LY0GLGm3ptX8HsJ8zgPE70/RD+0/ydRJsvcb8SN9PzEIAasGl+UaLPLHSIkRzUOt7tZjS/KIbxFoAyp4lALVg0tP6c5a62ax/17k2Lci7fQewtQ81JuJbwNrd0BzQ+sguNP+pjmIqgam5O77Q1K8A1NlnLba1uFU/KAqpdir6LLtqF4BJWHX7KTgtYHTZSL5F/khzgN6ncRp/caJ8j9qsGiAAm9Xfube2bj81lQaYvnWl6JMiab22odOUW/W08Yd52w/lV71d1L/aBNL8ukW1W0rtIdCZAAIQy8iUQFMEoD7HoRWsLp1oRS5xo5tuWpHrbzxvEEAAYg0hEkAAhtgr1KlIAgjAImk34F1NEYDafpED0fk8bZ1om1ifZNB2yki/9tAAExjWRARgE3s9/DYjAMPvI2qYLwEEYL58KR0CEIAABCAAAQgERwABGFyXUCEIQAACEIAABCCQLwEEYL58KR0CEIAABCAAAQgERwABGFyXUCEIQAACEIAABCCQLwEEYL58KR0CEIAABCAAAQgERwAB6OgSfcxSHwXV75xy89MBkqwQgAAEIACBAgno4976pSd9zqv1l3UKrELpr0IAOrpAnwDRT+PwQAACEIAABCBQPQL6jefWX8OqXgv6rzECsH92tmzZsuinuWRA+g1HHghAAAIQgAAEwiegn81UAEc/s7fuuuuGX+EcaogAdECVAclwJAQRgA6QZIUABCAAAQgUSAD/bYYAdBgcBuSAR1YIQAACEIBASQTw3whAl+lhQC58ZIYABCAAAQiUQgD/jQB0GR4G5MJHZghAAAIQgEApBPDfCECX4WFALnxkhgAEIAABCJRCAP+NAHQZHgbkwkdmCEAAAhCAQCkE8N8IQJfhYUAufGSGAAQgAAEIlEIA/40AdBkeBuTCR2YIQAACEIBAKQTw3whAl+E10YBe+r9X7fmXXrGxq69iq6862sWPzBCAAAQgAIEyCDTRf7dz5juADstrkgHd/vDv7YJFD9p1i5faikGzUQNm+06eYLP22MJ22Hy8gyJZIQABCEAAAsUSaJL/7kYWAeiwuaYY0CW3PWJz5t9jo0YN2KtSf68/o0cN2IoVgzZ3+lSbsfNEB0myQgACEIAABIoj0BT/PRJRBKDD3ppgQIr8HXzurfaG7BsObMDMLj9qFyKBDlsiKwQgAAEIFEegCf67F00EYC9CI/y9CQZ05CV32PVLnlop8teORJFAbQefO2N7B02yQgACEIAABIoh0AT/3YskArAXoQYLQF34mDxnQXTmr9ejM4GLT53GxZBeoPg7BCAAAQiUTgAByC1glxHW3YCefn657Tjv+sSMbp+9j603dkzi9CSEAAQgAAEIlEGg7v47CVMigEkodUlTdwMiAugwDrJCAAIQgECwBOruv5OARwAmodRQAahmJzkDqO3f/aZswBlAhy2RFQIQgAAEiiOAAGQL2GVtTTCgJLeABXHWHpNs9rsnu3iSGQIQgAAEIFAEgSb4714ciQD2IjTC35tiQPN+tNi+vuihEUnxKRiHIZEVAhCAAAQKJdAU/z0SVASgw+SaYkDaBo5/AaQbLj4F4zAkskIAAhCAQKEEmuK/EYA5mVUTDIiLIDkZD8VCAAIQgEBpBJrgv3vBJQLYi1DDt4D5FIzDQMgKAQhAAAJBEkAAcgnEZZhNMCAigC4TITMEIAABCARIoAn+uxd2IoC9CDU8AqjmJ/kUDGcAHYZEVghAAAIQKJQAApAIoMvgmmJAST4Fwy1glymRGQIQgAAECiTQFP89ElIigA6Da5IBXXrbI3bS/Hts1KgBe7Xlx4EV+VuxYtDmTp9qM3ae6KBJVghAAAIQgEAxBJrkv7sRRQA6bK1pBnTHw7+3C256yK6990mTBox/AWTm7pNsh83HO0iSFQIQgAAEIFAcgab5705kaysAzzjjDLviiivsvvvuszXWWMN23XVXO/PMM22bbbYZ4nD44YfbxRdfvBKXnXbayW677bZEVthUA9LFkOdfesXGrr6Krb7q6ESsSAQBCEAAAhAIhUBT/Xcr/9oKwGnTptkhhxxiO+64o73yyis2e/Zsu/vuu23x4sW21lprRQwkAJcuXWoXXnjhEJPVVlvNxo9PFs3CgEIZytQDAhCAAAQgkJwA/rtBl0CefvppW3/99e3GG2+0Pffcc0gAPvfcczZ//vzkVtOSEgPqCxuZIAABCECgJgSquiOE/26QAHzggQdsq622iqKAU6dOHRKAEn+K+o0bN8722msvmzdvXiQUkzwYUBJKpIEABCAAgboR0NchLlj04NDPhOpM+L6TJ9isPbaoxJlw/HdDBODg4KAdcMAB9uyzz9qiRYuGxuFll11ma6+9tk2cONEeeughO+mkk6Lt4jvvvNPGjBkzbLwuX77c9F/8yIA23XRTW7Zsma2zzjp1G9+0BwIQgAAEIDCMwCW3PWJzKv5VCARgQwTgxz72MfvRj35kN910k22yySZdh/MTTzwRicHvfe97duCBBw5Ld/LJJ9spp5wy7N8RgMyQEIAABCDQBAJ1+S4sArABAvCYY46JzvgtXLjQJk2a1HN8apt45syZdsIJJxAB7EmLBBCAAAQg0CQCdfllKARgjQWgtn0l/q688kq74YYbovN/vZ7f/e53tvHGG9v5559vhx56aK/khgH1REQCCEAAAhCoCYE6/TY8/rvGAvDoo4+273znO3bVVVet9O2/ddddN/ou4AsvvGDa0j3ooINsww03tIcffthOPPFE+81vfmNLliyxsWPH9hyyGFBPRCSAAAQgAIGaEHj6+eW247zrE7fm9tn72Hpjh5+nT1xAjgnx3zUWgAMD+nXa4Y+++afv//3xj3+06dOn289//nPTp2AkAvfee2+bO3dudLEjyYMBJaFEGghAAAIQqAMBIoB16MU32lDbD0EX0U0IwCIo8w4IQAACEAiFAGcAQ+kJfz0QgA6GCEAHvIplrerHTiuGmepCAAKBE+AWcOAdlKJ6CMAUsNqTIgAd8CqSteofO60IZqoJAQhUiMCltz1iJ/EdwAr1WOeqIgAdXYgAdMCrQNY6fOy0ApipIgQgUEECd+iXQG56yK6990lbMWimXwLZb8oGNnP3SfwSSEX6EwHo6CgEoANe4Fnrss0ROGaqBwEIVJxAVY/H4L9rfAu4iDGFARVBuZx31OWgczn0eCsEIACBsAngvxGALgvFgFz4gs1cp08dBAuZikEAAhAokQD+GwHoMj8MyIUv2Mx1+thpsJCpGAQgAIESCeC/EYAu88OAXPiCzUwEMNiuoWIQgAAEMiGA/0YAugwJA3LhCzozZwCD7h4qBwEIQMBFAP+NAKycAVX1xpULdAmZuQVcAnReCQEIQKAgAghABKDL1Io0ID5I7OqqvjLX4WOnfTWcTBCAAARqTqBI/x0qSr4D6OiZogyIDxI7OsmZteofO3U2n+wQgAAEakmgKP8dMjwEoKN3ijAgtiIdHVHe9VMAACAASURBVJRhVrbeM4RJURCAAARKJlCE/y65iT1fjwDsiah7giIMiMsIjg4iKwQgAAEIQKADgSL8d+jgEYCOHsrbgPgciaNzyAoBCEAAAhDoQiBv/10F8AhARy/lbUB8kNjROWSFAAQgAAEIIAC72gAC0DE88haARAAdnUNWCEAAAhCAAAIQAZjHKMhbAKrOnAHMo+coEwIQgAAEmkygCP8dOl8igI4eKsKAuAXs6CCyQgACtSLAbfxadWepjSnCf5fawAQvRwAmgNQtSVEGxAeJHZ1EVghAoPIE+BB+5bswuAYU5b+Da3hLhRCAjt4p0oD4ILGjo8gKAQhUlgAfwq9s1wVd8SL9d6ggEICOninDgNgCcXQYWSEAgUoR4AhMpbqrUpUtw3+HBggB6OgRDMgBj6wQgAAEehDgEhwmkhcB/LcZAtBhXRiQAx5ZIQABCIxAgM9gYR55EsB/IwBd9oUBufCRGQIQgEBXAnwIH+PIkwD+GwHosi8MyIWPzBCAAAS6EiACiHHkSQD/jQB02RcG5MJHZghAAAIjEuAMIAaSFwH8NwLQZVsYkAsfmSEAAQiMSIBbwBhIXgTw3whAl21hQC58ZIYABCDQkwAfwu+JiAR9EMB/IwD7MJs3smBALnxkhgAEIJCIAB/CT4SJRCkI4L8RgCnMZXjSMg2ID0K7uo7MEIBABQkw71Ww0wKtcpn+OxQkfAfQ0RNlGBC/ienoMLJCAAIQgAAEzKwM/x0aeASgo0eKNiB+E9PRWWSFAAQgAAEIvE6gaP8dIngEoKNXijQgbsM5OoqsEIAABCAAgRYCRfrvUMEjAB09U6QB8T0sR0eRFQIQgAAESiEQ6rnNIv13KeATvBQBmABStyRFGRBfxHd0UiBZQ50EA8FDNSAAgZoRCP28elH+O+RuRQA6eqcoA+I3MR2dVHLW0CfBkvHweghAoIYEqnBevSj/HXL3IgAdvVOUAREBdHRSiVmzngSJIpbYmbwaAhBIRKAq59WL8t+JoJWUCAHoAF+kAXEG0NFRJWTNchIkilhCB/JKCECgLwJV8VVF+u++QBaQCQHogFykAWUpKBxNJmtCAllNgllHERNWn2QQgAAEUhOo0m5Vkf47NciCMiAAHaCLNiB+E9PRWQVmzWoSrLLoZ7u6QIPjVRAIhECVzqsX7b8D6aKVqoEAdPRKGQbEb2I6OqygrGknwQsO3d72mbzBsNplFUUsqNnRa9iuLpI274JAWASyWvwW0aoy/HcR7UrzDgRgGlptacs0ICIsjo7LOWuaSTCuymnTp9qMnScO1SxNGaMGzBafOs1WX3V0zi0buXi2q0vFz8shEASBNAvXL37g7fb8S6/Y2NVXKXz+KtN/B9FRZoYAdPRE3gaEyHN0TslZk0yCrVUcMLPLj9rFdth8fPTPaaOIt8/ex9YbO6a0Vld5u7o0aLwYAjUkkGQuULP/YtKb7I6Hn7UVg2ZaxO47eYLN2mOLoTkwbzR5+++8659F+QhAB8W8DIhtNEenBJI16SQYV3f0qIFoAjx3xvbRP1UtAphE8La3MZCuohoQgEDGBEY6r/6qFJ+ZaT6I/+/4/1+xYtDmtu2GZFy1oeLy8t951TePchGADqp5GBDbaI4OCSxrPAm+Nt31ftq3cqsiqqomVnv3BCkgAAEvgU7n1XfcfLz99KHfj1h0+26Itx7d8ufhv/Oqa17lIgAdZLM2oCRRo6IGhwMLWVsIXL94qc381h2JmbRu5VbFHqq2XZ24M0gIAQi4CbQeZfrE935u1y95aqXIX/sLitopyNp/u0GVUAAC0AE9awOqSsTHgaxxWb3RsSp8+sfbxsYZBQ2GQAMJhDZPZO2/q9ilCEBHr2VpQKENDgcWsrYR8Ar7Knz6x9tGjAYCEKg3gdB2CrL031XtOQSgo+eyNKDQBocDC1nbCGS1lRvyrfCs2ojxQAAC9SQQWpAjS/9d1R5DADp6LksDCm1wOLCQtQOBKmzlejuuCW30MiI/BJpMIKSdgiz9d1X7FAHo6LmsDSikweHAQtYuBKqwlevtvCa00cuI/BBoKoGQdgqy9t9V7FMEoKPXsjagkAaHAwtZexAIeSs3q85rQhuzYkU5EGgSgVB2CrL231XsQwSgo9fyMKBQBocDC1khAAEIQAACXQmEsFOQh/+uWpcjAB09lpcBhTA4HFjICgEIQAACEOhJoMydgrz8d89GB5QAAejojLwNqMzB4cBCVghAAAIQgEDQBPL230E3/vXKIQAdvYQBOeCRFQIQgAAEIDACgTyDIPhvMwSgY/hhQA54ZIUABCAAAQh0IKALkRcsetCuW7zUVgya6XfS9508wWbtsYXtsPn4TJjhvxGALkPCgFz4yAwBCEAAAhBYicAltz1ic+bfY6NGDaz0m8H6jeAVKwZt7vSpNmPniW5q+G8EoMuIMCAXPjJDAAIQgAAEhggU+Sk0/DcC0DX0MCAXPjJDAAIQgAAEhggU+WMI+O8aC8AzzjjDrrjiCrvvvvtsjTXWsF133dXOPPNM22abbYaMbXBw0E455RQ7//zz7dlnn7WddtrJvvrVr9qUKVMSDUkMKBEmEkEAAhCAAARGJFD0z6Hiv2ssAKdNm2aHHHKI7bjjjvbKK6/Y7Nmz7e6777bFixfbWmutFRmiBOG8efPsoosusq233tpOO+00W7hwod1///02duzYnsMVA+qJiAQQgAAEIACBngSefn657Tjv+p7p4gS3z97H1hs7JnH69oT47xoLwPbOfvrpp2399de3G2+80fbcc09T9G+jjTayY4891k444YQo+fLly23ChAmRMDzyyCN7GhYG1BMRCSAAAQhAAAI9CRAB7Iko8wSN+QzMAw88YFtttVUUBZw6dao9+OCDtuWWW9rPfvYz23bbbYfAHnDAATZu3Di7+OKLe8JGAPZERAIIQAACEIBAIgKcAUyEKbNEjRCAivZJ2Omc36JFiyJ4t9xyi+2222722GOPRZHA+DniiCPskUcesWuuuWYYZEUI9V/8SABuuummtmzZMltnnXUy6xQKggAEIFBVAnl+vLeqTKh3MgLcAk7GKatUjRCAH/vYx+xHP/qR3XTTTbbJJpusJAAff/xx23DDDYd4zpo1yx599FFbsGDBMMYnn3xydGmk/UEAZmWOlAMBCFSVQBEf760qG+qdnMCltz1iJ/EdwOTAHClrLwCPOeYYmz9/fnS5Y9KkSUOo+tkCJgLosDSyQgACtSVQ1Md7awuQhq1E4A79EshND9m19z459Esg+03ZwGbuPolfAsnQVmorALXtK/F35ZVX2g033BCd/2t94ksgxx13nB1//PHRn15++eXoogiXQDK0MIqCAARqTaDIbbtag6RxwwjkeZyAM/w1vgV89NFH23e+8x276qqrVvr237rrrht9F1CPhJ6+F3jhhRdGAvH000+PxCKfgWEmggAEPATydFyeeuWRt8iD+3nUnzKbSQABWGMBODAw0NGqJfYOP/zw6G/xh6DPO++8lT4ErVvCSR4MKAkl0kCgOQSadg6u6E93NMeSaGneBPDfNRaAeRuPyseAiqDMOyBQDQJNPAdX9Md7q2EJ1LIKBPDfCECXnWJALnxkhkBtCDT1HBwRwNqYcOMagv9GALqMHgNy4SMzBGpDoMnn4Jrc9toYcAMbgv9GALrMHgNy4SMzBGpBoOlRsKZFP5t0wacWA7RLI/DfCECXfWNALnxkhkAtCHAOzqyoj/eWaTBNu+BTJusi3o3/RgC67AwDcuEjMwRqQaDpEcC4E4v4eG9ZBtPECz5lsS7qvfhvBKDL1jAgFz4yQ6A2BDgH90ZX1m2LtGlb3LUZlD0agv9GALpsHQNy4SMzBGpDAJFQm64c1hDEfT37Fv+NAHRZNgbkwkdmCNSKQBPOwdWqwxI0hu39BJAqmgT/jQB0mS4G5MJHZgjUjkCdz8HVrrMSNIgLPgkgVTQJ/hsB6DJdDMiFj8wQqC2Bup2Dizuqru3qZohEAGs7RPklL0MAuqwbAdgbX9McRm8ipIBA+QTSjssmfwKFM4DF2Wtau/TUDP+NAPTYDyuIEeg12WG4jIrMEMiRQD/jsumfQOGCT44G+XrR/dilt1YIQASgy4YwoM74mu4wXEZFZgjkRKCfcYn4ea0zuOCTk1GaWT92mUVt8N8IQJcdYUDD8eEwXCZFZgjkQqDfccn25xvdwQWf7E2zX7vMoib4bwSgy44woOH4cBgukyIzBHIh0M+4bOIFiCRn0JKkyaUTa1hoP3aZFQb8NwLQZUsY0Mr4mugwXAZEZggUQKDfcdmkT6CUcQatgK4P+hX92mVWjcJ/IwBdtoQBrYyvSQ7DZThkhkCBBPodl2U76KIQlXUGraj2hfqefu0yq/bgvxGALlvCgIgAugwow8xsS2UIs2ZFeYRcmVt0RXRDmWfQimhfyO+QXb7tpAU2mKCSowbMFp86zVZfdXSC1MmS4L8RgMkspUsqDGg4mLo7DJfB5JCZrascoNawyH7HZd0FUr9camgihTdJkdeT5t/T872jRw3YvpMn2Lkztu+ZNk0C/DcCMI29DEuLAQ3HV3eH4TKYjDOzdZUx0BoX5xmXdf0EiicyWmNTKaRpSewxrsiAmV1+1C62w+bjM60b/hsB6DIoDKgzvro6DJexZJw5yQSa18SZcVMoriACnnFZx0+glH0GraBuD/I1SSKvccVPmz7VZuw8MfN24L8RgC6jwoC646ujw3AZS8aZk0ygeW2dZNwUiiuQgHdc1umsKRHAAg2v5VVpuA8MmC389N623tgxmZ7/U3Xw3whA1wioogEVPYEX/T5Xh1Ykc5oJNI/D0xXBRDVHIMC4fA0OC6nih0nayKtqqHlM5wBn7bFFZlvBVfTfWffWwODgYJJLOFm/txblVcmAuCxQC5OLGpF2Ar199j7RCpoHAhBYmQBHKYq3iDQL2NbaaUdjxYpBm5vRlnCV/HdevYQAdJCtigFxWcDRyQFmTTOBEgEMsAOpUlAEPGcjg2pIhSqTJPLarTlZnW2uiv/Os1sRgA66VTAgVriODg44a5IJlDOAAXcgVQuKgPdsZFCNqUBlkvilbs3Ial6rgv/OuysRgA7CVTAghIKjgwPOmmQCzWqlHDAGqgaBTAlwNjJTnCMW1i3ymqQGWexsVMF/J2HhSYMAdNAL3YDYKnR0bgWyNnHrCgddAcOkihBISKA98powW5TMe7Y5dP+dhkW/aRGA/ZKrwDVyLgs4OrciWZuydcUlpuQGiUhOzqpbShj6GaYpQbyfeWG57XHmTwr7aTgEIJ+BSWOjw9KGbkBEAF3dW1jmLJxNFmUU1uCUL+ISUzJgVRbJodhvlRkms5KwUxV5ZCl0/11ETxEBdFCuggEVOaAcKBuZFWfTu9s569ibkVJUVSSHNAaqyjCZhVQjVZHjvQr+O+9eQwA6CFfBgIocUP2iDGX132/9+8mHs0lGLekC5i/fur7Ne9+f2tjVV8n8FwOS1bS8VFUY453ohDQGqsqwPKvL781FnW2ugv/Oj/JrJSMAHYSrYkBFDai0KENa/aetuyc9ziYZvTRHGOIS8/jFgGS1LS9VUpGsX1I4d8b25VW05c2hjYEqMgyiI1NUIs1Cv4izzVXx3ykQp06KAEyN7I0MVTKgIgZUGpQhrf7T1DuLtDibZBTTXmKKS836FwOS1bacVGlEchafzsiqlSGNgaoyzKov8i7Hs9BPIxrTtqNK/jtt25KmRwAmJdUhXRUNKM8BlRRlaKv/pPXOIh3OJjnFNKw6ldqE7yCmFcneT2ck773uKdP0axGitYoMs+iHIsoIeaFfRf+ddZ8hAB1EMaD+4IW0+u+vBf3nwtmkY5fEVrqVmNUvBqSrcbGpQxNTSVof2hioIsMknMtOE/pCH//NGUDXGMGA0uNr+mTb9PantZgkTmSkMouIIKVtU9bpk4jkkMRwiGOgagyztqE8yuuXaVG7VPhvBKDL7jGg9PhCW/2nb4E/R78To//N1SzB85NRanEI2555kk8ikkPbDg9tDFSRYZ425S27H5F/92PL7IJFD9p1i5faikGzvC904b8RgC47x4DS4+tnYlh91dHpXxRwDpxN+s7p9yejmhABFM1Qb/p36+kQx0DVGI40ioqKonWrQ9qF/gnT3mqfW3CfjRo1YK9K/b3+5HmhC/+NAEzviVpyYED94Qtt9d9fK3y56uRsfCTS5Y4d22eu+B/7yf1Pr+Qs2ksKadszXSv7Sx3aTf9erQhxDGTJsAwR5rlx26u/0vw9zUJf0Wk9b8i+4W/KI4KN/0YAprHpYWnLMKAyJhUXpA6ZQ1z9Z93GJOVl6WySvK9OabCh7r1ZpTki1DHgYViWCAvtxm3Shf6b117NfvfCy4Uv5srw36HNwdwCdvRIkQZU1qTiwDNi1hBX/3m1tVe5HmfTq+w6/x0bqk/v1mUMlCXCQlwQJamTLHhgwGxwpPDf62ae9XGOIv13qCMVAejomaIMqKxJxYEmUdZQV/+JKk+iIAhgQ0F0A5XQZaOHf28Hn3tr4VuZgp802lb0r8H0WqTp7N9nF9yX2H6yvNBVlP9O3LgSEiIAHdCLMKAyJxUHmlRZ67L6T9VoEmdKABvKFCeF9UGgLBGW5rxd1lG0JJhGWqRN3XhdmzxnQXTrt9eTdd2L8N+92lT23xGAjh4owoA0qcTX4rtVVQNjvykbBPM7nw6kZIUABCBQOQJlirC0N26zjKKl6ahui7SyhHMR/jsNnzLSIgAd1PM2IA2Yt81ZkOh8hM5RLDl1mtXtkymO7iErBCAAgUIIlCnCyhSfWcAta5crb/+dBZu8y0AAOgjnbUBlTioOLGSFAAQg0CgCZYuwsqJoWXVyr7OCc6dPtRk7T8zqdVE5efvvTCubU2EIQAfYvA3ouRdftrefel3iGt41Z18bt+ZqidOTEAKtBDhHhz1AoH8CZYqwsqJo/dManrPoC115++8s2eRVFgLQQTZvAyIC6OicmmQtQpTV7RNDNel6mlExAmWLsDKiaHl0URFzHhHA13oOAeiw4LwFYHQG8KQFI35WIK6+vpS+ZC5nAB3dGVTWokRZXT8xFFRnUpnGEChbhBUdRatyx+btv6vABgHo6KUiDEjbCtcuXjriRRBdANmfW8COngwra1GirOyIRVjUqQ0E3iDgiUKFIMI89W+KHRThv0NniQB09FARBoSTdnRQBbMW2d9lnlmqYNdQ5QYQyDLyjggL22CK8N9hE2AL2NU/RRlQ2dsKLkh9ZG7yxFmUKCv71mIfZkEWCORKoKjIe66NoPDEBIry34krVEJCIoAO6EUaUAjbCg5UibJmufpO9MLAEhUpyrhgFFjnU51SCRQZeS+1obx8iECR/jtU7AhAR8+UYUB1jY6x+jYrUpQVKTYdQ4ysXQjUdR4oq8OLiryX1T7eO5xAGf47tH5AADp6BANywGvJyur7NRhFizKcXjb2W2QpTY+S58G66HGXRxsoMz0B/DdnANNbTUsODMiFbygzQuQNjkWyQHhnY79FlUKUPB/SRUbe82kBpfZDAP+NAOzHbobyYEAufKVEvfw1zreEokVZ0y4Y5dt7+ZVetF3k15LwSiYCGF6fFFEj/DcC0GVnGJALX5SZ1fdwhkWLsiZcMPJbarklFBkZLrel5bwdvuVwL/Ot+G8EoMv+MCAXPiKAI+ArQ5RxscBvz3mUQIQqD6orl0mENX/Gob0B/40AdNkkBuTCN5SZ1Xd3joiybGysyqUQJS+m94qOvBfTKt7SjQD+u8YCcOHChXbWWWfZnXfeaU888YRdeeWVNn369CFbOPzww+3iiy9eyTZ22mknu+222xKPGAwoMaoRE7L6zoYjpdSTABHA4vq1jMh7ca3jTa0E8N81FoBXX3213XzzzbbddtvZQQcd1FEALl261C688MIhm1httdVs/PjxiUcJBpQYVc+ErL57IiJBgwkQJS+284m8F8u7jLfhv2ssAFsNamBgoKMAfO6552z+/Pl92x4G1De6jhlZfWfLk9LqQ4AoeX36kpaEQQD/3XABKPGnqN+4ceNsr732snnz5tn666/f1TqXL19u+i9+ZECbbrqpLVu2zNZZZ50wrLoGtWD1XYNOpAmZEyBKnjlSCmwwAQRggwXgZZddZmuvvbZNnDjRHnroITvppJPslVdeic4MjhkzpuOwOPnkk+2UU04Z9jcEYINnEZoOgQ4E8lrEECXH3CCQDQEEYIMFYLsJ6aKIxOD3vvc9O/DAAztaGBHAbAYepUCgrgSK+qm2vARmXfuFdkGgnQACEAG4kk1stdVWNnPmTDvhhBMSjRYMKBEmEkGgEQT4qbZGdDONrAkB/DcCcMiUf/e739nGG29s559/vh166KGJTBwDSoSJRBCoPQEuadS+i2lgzQjgv2ssAF944QV74IEHIpPddttt7eyzz7a99947+syL/tN5Pn0eZsMNN7SHH37YTjzxRPvNb35jS5YssbFjxyYydQwoESYSQaD2BPhMS+27mAbWjAD+u8YC8IYbbogEX/tz2GGH2TnnnBN9FPrnP/+56VMwEoFKO3fu3OhWb9IHA0pKinRVJhDaebMQ6zN5zgJbMdi7l0cNmC0+dZqtvuro3olJAQEI5EYA/11jAZib1bQUjAEVQZl3lEWgqAsNSdsXWn3ievNTbUl7kHQQCIcA/hsB6LJGDMiFj8wBEwjtQkNo9WntujQ/1TZgZkvmEgEM2PSpWkMI4L8RgC5Tx4CG4wtte87VwQ3NHNqFhtDq08kskpwBjPPtP2WCzdpjC9th8+Q/O9lQU8y92cxXuSMO9gX4bwSgyzgxoDfwhbo95+rghmZOImZGjxqwfSdPsHNnbJ87pdDq06nBSURqnE/sVqwYtLnTp9qMnSfmzo8XDCfAfIVV4L8RgK5RgAG9hi/k7TlXBzcwc5rtzCIuNIRWn5FMottPtXXLo+3gy4/ahUhgweOsyPmKCGPBnZvidfhvBGAKcxmeFAMySxL5wNG5zKzQzKFdaEhbn0XH722bjl+zUGatL4t/qm3BPU/2rEORUdSelWlIgqLmKyKM4RsU/hsB6LJSDMisCttzrk5uWObQIm5p6qOuUlRSW9NlnrFLU+cioqgNM+ERm1vEfFVkhJG+7Z8A/hsB2L/1mFnTDQhH5zKfYDMX4STTND5JfVrLK/uMXdqo5e2z97H1xo5Jg4S0fRAoYr4qKsLYR/PJ0kag6f5bOAYGBwcTfL4U2+lEoOkGhKOr57gIzYklqU+nnijr6EERQqOelpdvq4qYr5IsVhT13W/KBoVcoMqXaLVLb7r/RgA67bfpBhSSo+OwtdOY27J3u9BQVnQt7QULNafMM3ZJhECZ9cvWWqpRWt7zVZryRew7M3eyXd/yJ9WAV8NaNt1/IwCdRo0BlX8GkMPWTiMeIXt8oeHae5+MfuYsjlzM3H1SKTdX4/pcc8+TlnTboqwzdkmilmVFKPOzmPBLzlOYp40witZpfAqoNKPBf7MF7DI+DKjcW8ActnaZb+LMoUVXf/vsi7b7mT9JXP+yztiFFkVNDKzGCfMU5mkjgFEEhk8BlWZt+G8EoMv4MKDX8JXh6PKcyNMaRWgCKW39q5ZevN960oLE1b6vxJ9eCy2KmhhajRPmOV8liTC2ouUYQHmGhv9GALqsDwN6A1/Rji7JRJv35Mr2s2v49J25SgIwbiSLhL67O5eMec1XSRam7Q0q65hCGrB1tF/8NwIwzRgYlhYDGo6viIkizVZLXpMr28+uoePKnPasVT9bwEXYsQsCmTMhkEc/K8L4T/PvSVW/fmw01Qv6TFznRS7+GwHY57B4LRsG5MLXd+YiBMBIlUuyyudsT9/d2zNjnguAOju8nmBJkBmBmx942v7+gv9OVF5ei9RELx8hUd0XufhvBKBrjGBALnx9Z85TACSpVAjbz0nqWec0efRB3R1ene0hxLblYaNFtbMJi1z8NwLQNZ4wIBc+V+ayJteyxacLWo0yZ+2gsi6vRqhpSp8EqmxTZc2vfaLuKxv+GwHYl+HEmTAgFz5X5rIm17K3n13QapY5y9ucoTm8PM6m1az7K9GcLG20qAY3ZZGL/0YAusYUBuTC585cxuTalMnR3TkFFZDFbc6Q+rTuZxCbKGyzsNGChlP0mqYscvHfCEDXuMKAXPgyyVzG5BpatCgTkBUvxCMsQnF4dT6DWHdhm2T4eGw0SflZpQlpQZRVmzqVg/9GALrsCwNy4cs0c5GTa1nbz5kCo7AhAiE4vDrbVJ2FbV2HURMWufhvBKBr/GJALnyVzlzG9nOlgQVe+bIdXtnvz6t76ixs82LWq9wiFrtN6Df8NwKw11gb8e8YkAtf5TOXsf1ceWiBNqBMhxdCBDKvbila2BYhjvJi1avcorfR677IxX8jAHuNOQSgi1AzMtfZ6TSjB19rZVkOL5QziFn3dRHCNh579y/9X7vk1kfsusVLbcWgmT6uvO/kCTZrjy1sh83HZ920wssraxu9zotcBCAC0DWQMSAXPjJDIDgCZTi8IoRSkaBjUab/3eNzP0n86jQ/h9YeDev0Ev0W+IoVgzZ3+lSbsfPExPUILWGZ0emYRR0XufhvBKBrrGNALnxkhkCwBIp2eEVvleYBvtMWpaJxSZ40P4fWLRrW7T1V/1nGOthGEhsoOg3+GwHosjkMyIWPzBCAwOsEQojyeDqjmyiT+OqlARWp03btuTO271mFJJzaCxkYMNt/ygaJyu9ZgYIT1C06XDC+EV+H/0YAuuyxSAMqOiLhAkNmCEAgNYGyziCmrmhbhn5EWWsRaSJ0SaJhndqjdyyZO81WX3W0t7mF5q/r+dBCIXZ5WZH+O4T2dhwXg4ODvRZooda99HoVYUBF3/wqHSoVgECDCZRxBtGLu19RlvaMXppoWKc2pTlj6GWSVf40bU6zjZ5V/apcThH+O3Q+AwjA/rsobwMq6+ZX/0TIjqao4gAAIABJREFUCQEIZEGgKhH/NAJFXOItYYmV/aZsYDN3n5T4lm7aaFh7P9w1Z18bt+ZqWXRPoWUkEdhpttELrXzAL8vbfwfc9KGqIQAdvZSnASXZVkmzdeJoJlkhAAEIdCSQVpTddMLeNmaV0TZ29VVSb8emFZvtFa5iBFBtwBfkM/jy9N/51Dj7UhGADqZ5GhCrPkfHkBUCOROoSoQuZwyWRpR126JMwzLJvNipzboIsuTU6p0BjNtS1fOhedufp/w8/benXkXmRQA6aOdlQFlMqo5mkRUCEOhCgDO5w8EkEWWdtij7YZkkGtZew3i7Ockt45ANv4rnQ0PmmZf/DrnN7XVDADp6Ky8DSrutUtWtDQd6skKgcAKcye2MPIkoaz+u4mHZLRrWzSDqdlQmTcS08EFSoRfm5b8rhMAQgI7eysuAiAA6OoWsEMiBQD8iJ4dqBFtkmi3KLFi2R8M6gUl7yzhYuFQsFwJ5+e9cKptToQhAB9g8DajfbRVHc8gKAQh0IcB47G0aSbcos2QZR8N+qd8Cvu03du29Tw79FnDaW8a9W0iKOhHI039XhRMC0NFTeRpQFqtkR9PICgEIvE6AiHw6UxhpizJvlmyPpuurJqfO039XhSsC0NFTeRtQmm0VRzPICgEIjECAM7nZmQcss2NJST4CeftvX+2KyY0AdHAuwoCSbqs4mkFWCEBgBAJ5R62aBB+WTertsNtahP8OmwC/BezqnyINiK0NV1eRGQIuAlmeW3NVpC1zFeeFUFlm2S+UFT6BIv13qDSIADp6BgNywCMrBCpEILQzuf18Qy8U3KGxDIUL9SiWAP6bCKDL4jAgFz4yQ6BSBEI5k+v5hl4owENhGQoP6lE8Afw3AtBldRiQCx+ZIVA5AmWfya1T9KxslpUzPiqcKQH8NwLQZVAYkAsfmSFQWQJlnb2r4/m5slhW1vioeCYE8N8IQJchYUAufGSGAARSEOAGbQpYJIVADwL4bwSga5BgQC58ZIYABFIQ4Bt6KWCRFAIIwJ42wC3gnoi6J0AAOuCRFQIQSEUgiwhgkdutRb4rFUgSQ8DM8N9EAF0DAQNy4SMzBCCQkkC/ZwCL/GxMke9KiY/kEBgigP9GALqGAwbkwkdmCEAgJYF+bgEX+dmYIt+VEh3JIbASAfw3AtA1JDAgFz4yQwACfRBI8w29fgRjH1WKshT5rn7rSD4IxATw3whA12jAgFz4yAwBCPRJIOk39PrdMu6nWkW+q5/6kQcCrQTw3whA14jAgFz4yAwBCDgJjHTRIotLI0mrV+S7ktaJdH4Cdb7Ig/9GALpGCAbkwkdmCEAgRwJFfjamyHfliIyiXyfQhIs8+G8EoGvAY0AufGSGQGUJVCEyUmRULqt3VYFrZY02YcWbcpEH/40ATDgkOifDgFz4yAyByhGoWmSkyHN5nndVjWvlDDdhhZt0kQf/jQBMOCzCFoCsml3dSGYIJCJQxchIkQ6933dVkWsig6lgIo+Ir1pzEYAIQJfNlm1ArJpd3UdmCCQm0K+4SfyCHBOm+WyMtxpp31Vlrl5WoeXPahs/tHZ1q0/Z/jsETvwUnKMXyjQgVs2OjiMrBFISqHpkJOlnY1Ji6Zg8zbuqzjULXqGU0bSLPGX671D6HAHo6ImyDIhVs6PTyAqBlATqFBkp8rhIr3fViWtKkwoyedP6oyz/HVLnIwAdvVGWAbFqdnQaWSGQkkDTIiMp8fSdHK59o8stY5N8S1n+O7fO66Pg2grAhQsX2llnnWV33nmnPfHEE3bllVfa9OnThxANDg7aKaecYueff749++yzttNOO9lXv/pVmzJlSmKMeRpQt9Vz01ZpiTuDhBDIiQBjLh+wcM2Hq6fUJu0u5em/PX1QZN7aCsCrr77abr75Zttuu+3soIMOGiYAzzzzTJs3b55ddNFFtvXWW9tpp51mEo3333+/jR07NlEf5GFAvS52sGpO1DUkgkCmBJoUGckUXI/C4Fok7WTvSnuRJ1mp4aXKw3+H18qRa1RbAdja7IGBgZUEoKJ/G220kR177LF2wgknREmXL19uEyZMMAnDI488MlE/Zm1ASS52vH/7TWzynAW2YrB3FUcNmC0+dZqtvuro3okLStHrXFBB1eA1EEhFoEmRkVRgnInh6gSYU/Y0F3lyqkLuxWbtv3OvcA4vaKQAfPDBB23LLbe0n/3sZ7btttsOYT3ggANs3LhxdvHFFydCnaUBpZkIv77oQbt+yVP26ggqcPSoAdt38gQ7d8b2idqSd6Jekc2830/5EPASaEpkxMspbX64piVWXPo6L9iz9N/F9Ui2b2qkALzllltst912s8ceeyyKBMbPEUccYY888ohdc801HSkrSqj/4kcGtOmmm9qyZctsnXXWcfVMmq2Qj+w+yQ4+91YbKQg4YGaXH7WL7bD5eFe9ssicJLI5Y+eJWbyKMiDgJjCS02tCZMQNsI8C4NoHNLK4CCAAG/Ih6PYt4FgAPv7447bhhhsOGdGsWbPs0UcftQULFnQ0rJNPPjm6ONL+eAVgP4ehv3/nb+2k+ffYqFEDK0UCFflbsWLQ5k6faiGIqjSRzRDEqmtGIXOlCaSJUtc5MlJmJ8K1TPrNejcCsKECsN8t4LwigP1e7KjCqjlNZDOU7epmTYO0VgSIUmMHeRJA2OZJt7+yEYANFYDxJZDjjjvOjj/++Mh6Xn75ZVt//fVLuQTSTwSw9WJHqJOLt139DWtyQSAdAaLU6XhllTqet1YdPWD/9+qgjV19laAurGXRzjRR5SzeRxnJCSAAaywAX3jhBXvggQcia9BFj7PPPtv23ntvGz9+vG222WaR0DvjjDPswgsvtK222spOP/10u+GGG0r7DExekbIyxWG/kc3kQ5iUEPATyGvs+WtWzxJiUXTt4qU22HKQWeeW95sywWbtsUUQZ5e99Ikqewnmmx8BWGMBKDEnwdf+HHbYYdG3/+IPQZ933nkrfQh66tSpia0uSwPKOgoRwsqTCGBiUyJhSQSw0WLBx6JoYMA6fspK/67bbaGcYe6XTtbzeb/1IF93Aln676pybsQt4Lw6J2sDyupzCCGtPImu5GV9lJsFAaLUWVBMVkYSURSXFNJXDJK1buVUzHv9UCs2T9b+u9jaZ/M2BKCDYx4G5L3YkWSSzXtybd12vvuxZZX6ZI3DHMhaQQJNiwCWeSQkiSiKTSi075imMe2m2VQaNiGlzcN/h9S+JHVBACah1CVNngbU70SdZJLNa3Lttu282fg17YJFDwX/yRqHKZC1wgTKHDNFYSv7SEgaURQzCfGXjJL0F1HlJJTKT5On/y6/dclqgABMxqljqtAMKM0km/Xk2mvbeeYek+zRZ/9o1977ZHT2R+/fb8oGNnP3SbU48O0wI7KWTCCEqHmeCHqNzSLO26UVRTGP22fvY+uNHZMnnszLLnMezrwxNS4wNP9dBmoEoIN6aAaUdpLNanJN40CnbryuPf/SK7X85IPDlMhaMoGszt+W3Ixhr08zNvP8EHsaUVT1CKDq34Socmi2nrY+ofnvtPXPIj0C0EExNANKM8lmGQFksnMYEVmDIeA9fxtMQ1oqEtLYTFKXuOp5HVMpqo9CEd5FtbeK7wnNf5fBEAHooB6iASWZZLOcXMsSnY5uIysERiTQ7/nb0LCGNjaTiKKYYd4X1Yroq7pGlYtgV8Q7QvTfRbS79R0IQAfxEA0oySSb5eRa1razo9vICoFGEAhxbMaiqO7fAYwNLM+ocl0WKmUNxhD9d9EsEIAO4qEaUJErz9CiDI7uJCsEakUg1LEZi6Jr7n1y2C+B7D+1nhfDshRrZd/orssgCdV/F8kXAeigHbIB5bnybEdW9Lazo8vIWhMCWTrUmiDp2IyQx2YTfgs4a9sK4UZ31m0qq7yQ/XdRTBCADtJVMKAiHGXR286OLiNrBgSKsKlu1ST6ka4DGZvpeIWcmr7Mtneq4L+zbfHw0hCADsIY0Bvwitx2dnQZWR0EyhZfRD/66zzGZn/cQssVcjQ3NFZJ6oP/NkMAJrGULmkwoJXBFLnt7Og2svZBoGzxRfSjj05rycLY9PErO3eo5znL5uJ5P/4bAeixH8OAOuMrc4vQ1aFk7kggBPFF9CMb42RsZsOx6FJCvNFdNIOs34f/RgC6bAoDcuErNTOOMDn+ssVXP9EPtY5fnEnex6QMm0A/Y2D1VUeH3aiSa4f/RgC6TBADcuErJXPZ59hKabTjpSE4nrTRj3ds8ye28JfPDP3m9L6TJ9isPbbgN6cddkDW8gmUvRArn0C2NcB/IwBdFoUBufAVnrnsc2yFNziDF6YVX1n9vnRr1dOIUOXTzxyuGHyjBP3yzYoVgzZ3+lSbsfPEDKhQBASKJxDCUYziW53fG/HfCECXdWFALnyFZmby7A93GvGV5e9Lt9c2SfSjVwuz/AUcjhD0os3f8yDAje7sqOK/EYAua8KAXPgKzZxEQGT5G8mFNi7nl4XALomA74Uhi/7lCEEvyvw9bwLc6M6GMP4bAeiyJAzIha9r5qyjK6FEsfKhlX+pScRXltG1bi0aKfrxauue7whIPFFKjhDkb2u8ITmBrOfJ5G+uR0r8NwLQZckYkAvfsMx5RVdCOMeWLaniSwtl66lT9GOvbdazn9z3dGIo/ZxTDEUEJ24kCSEAgREJ4L8RgK4hggG58K2UOc/oChHAbPoppK2n1uiHWjd5zoKVLn50a3G/EUBtg1+7eKkNtlwuaX/HwIDZ/lM2sHNnbJ8N8BFKIfqTO2JeUHMC+G8EoMvEMSAXvqHMRURXQjjHlg2t8ksJUXzk2b9q79tOWmAjaL+hTtFW+JK50yyvb7DlFSUv36qoAQSKJYD/RgC6LA4DcuEbypyn845fUoTIzIYGpfRDIM/+DeUIQZ5R8n6YkwcCVSaA/0YAuuwXA3LhizIXuT0byjk2PzVK6EQgr/597sWX7e2nXpcY+l1z9rVxa66WOH2ShHkK3CTvJw0E6kYA/40AdNk0BuTCF2UuOroS0jk2Pz1KaCeQR/8WbaOderWIKDnWBIEmEcB/IwBd9o4BufAVHgFsrW2I59j8NCkhJpBl/0ZnAOcsGPECSPxeXQRZcmq2ZwCLjJJjQRBoCgH8NwLQZesYkAvfUGaiG9lwpJT8CMhGr1u8dMSbxrphvF8Ot4BDiEDmR5aSIVAOAfw3AtBleRiQC99QZs43ZcORUvIjUKaNEgHMr18pubkE8N8IQJf1Y0AufCtlzusAf3Y1pKSmEyjTRomSN936aH/WBPDfCECXTWFALnzDMudxgD/bGlJa0wmUZaNlRiCb3ue0v54E8N8IQJdlY0AufF0zZ3mAP58aUmrTCZRho2VGIJve37S/fgTw3whAl1VjQC58ZIYABFISKCsCmbKaJIdA8ATw3whAl5FiQC58ZIYABPokUEYEss+qkg0CQRLAfyMAXYaJAbnwkRkCEIAABCBQCgH8NwLQZXgYkAsfmSEAAQhAAAKlEMB/IwBdhocBufCRGQIQgAAEIFAKAfw3AtBleBiQCx+ZIQABCEAAAqUQwH8jAF2GhwG58JEZAhCAAAQgUAoB/DcC0GV4GJALH5khAAEIQAACpRDAfyMAXYaHAbnwkRkCEIAABCBQCgH8NwLQZXgYkAsfmSEAAQhAAAKlEMB/IwBdhocBufCRGQIQgAAEIFAKAfw3AtBleBiQCx+ZIQABCEAAAqUQwH8jAF2GhwG58JEZAhCAAAQgUAoB/DcC0GV4GJALH5khAIEGEOB3ixvQyRVsIv4bAegyWwzIhY/MEIBAjQnc/vDv7YJFD9p1i5faikGzUQNm+06eYLP22MJ22Hx8jVtO06pAAP+NAHTZKQbkwkdmCECgpgQuue0RmzP/Hhs1asBelfp7/Rk9asBWrBi0udOn2oydJ9a09b2bRVS0N6O8U+C/EYAuG8OAXPjIDAEI1JCAIn8Hn3urvSH7hjdywMwuP2qXxkUCiYqGY/D4bwSgyxoxIBc+MkMAAjUkcOQld9j1S55aKfLX3kxFArUdfO6M7WtIoHOTiIqG1dX4bwSgyyIxIBc+MkMAAjUjoK3NyXMWRGf+ej06E7j41Gm2+qqjeyWt/N+JiobXhfhvBKDLKjEgFz4yQwACNSPw9PPLbcd51ydu1e2z97H1xo5JnL6qCYmKhtdz+G8EoMsqMSAXPjJDAAI1I0AEcHiHwiRMI8d/IwBdlokBufCRGQIQqCEBol0rdypR0TCNHP+NAHRZJgbkwkdmCECghgQ477ZypxIBDNPI8d8IQJdlYkAufGSGQKUJ8C23zt0nLhfd/LCdueA+vgP4OiKiouENdfw3AtBllRiQCx+ZIVBJAnzLrXO3tXPRt/50wePpF5bb4Ou/BLLflA1s5u6TGvn9P76NGNZwx38jAF0WiQG58JEZApUjwLfcOnfZSFz0SyD/OO2tdvhumzfiky/djPrS2x6xk/h1lGDGPP4bAegyRgzIhY/MEKgUAc62dY/8Ed1KZsp36PeRb3rIrr33yaHfR25qVDQZsfxS4b8RgC7rwoBc+MgMgUoR4BxX5+6CS3oz5vxoemZZ58B/IwBdNoUBufCRGQKVIcBNzs5dBZfKmDAVbSOA/0YAugYFBuTCR2YIVIYA33Lr3FVwqYwJU1EE4DAbGBgc1P2s5j0nn3yynXLKKSs1fMKECfbkk08mhoEATIyKhBCoNAEiXUQAK23AVH4YAfx3gyOAEoDf//737frr3/jdytGjR9t6662XeKhgQIlRkRAClSfAWbfOXQiXypt2IxuA/264AJw/f77dddddfRs/BtQ3OjJCoHIEuAXcucvgUjlTpsJmhv9uuAA866yzbN1117UxY8bYTjvtZKeffrptscUWiQcHBpQYFQkhUAsCfMutczfCpRbm3ahG4L8bLACvvvpqe/HFF23rrbe2pUuX2mmnnWb33Xef3XvvvfbmN7+540BYvny56b/4kQFtuummtmzZMltnnXUaNXhoLASaSoBvuXXuebg0dURUs90IwAYLwHaT/cMf/mBbbrmlHX/88fbJT36yo0V3ujiihAjAak4A1BoCHgJ8y60zPbh4rIq8RRFAACIAV7K1fffd197ylrfYOeecQwSwqFHIeyAAAQhAAAIFE0AAIgCHTE5bu4oAHnHEETZnzpxEpogBJcJEIghAAAIQgEBQBPDfDRaAn/rUp+w973mPbbbZZvbUU09FZwBvvPFGu/vuu23ixImJDBUDSoSJRBCAAAQgAIGgCOC/GywADznkEFu4cKE988wz0bf/dt55Z5s7d65Nnjw5sZFiQIlRkRACEIAABCAQDAH8d4MFYBZWiAFlQZEyIAABCEAAAsUSwH8jAF0WhwG58JE5JQFuV6YERnIIQAACXQjgvxGArsGBAbnwkTkhAf3SwgWLHrTrFi+1FYNmowbM9p08wWbtsYXtsPn4hKWQDAIQgAAEYgL4bwSgazRgQC58ZE5A4JLbHrE58++xUaMG7FWpv9ef0aMGbMWKQZs7farN2DnZpaUEryMJBCAAgUYQwH8jAF2GjgG58JG5BwF+YxUTgQAEIJAPAfw3AtBlWRiQCx+ZexA48pI77PolT60U+WvPokigtoPPnbE9PCEAAQhAICEB/DcCMKGpdE6GAbnwkXkEArrwMXnOgujMX69HZwIXnzrNVl91dK+k/B0CEIAABMwM/40AdA0EDMiFj8wjEHj6+eW247zrEzO6ffY+tt7YMYnTkxACEIBAkwngvxGALvvHgFz4yEwEEBuAAAQgUAoB/DcC0GV4GJALH5l7EOAMICYCAQhAIB8C+G8EoMuyMCAXPjL3IMAtYEwEAhCAQD4E8N8IQJdlYUAufGROQODS2x6xk/gOYAJSJIEABCCQnAD+GwGY3Fo6pMSAXPjInJDAHfolkJsesmvvfXLol0D2m7KBzdx9Er8EkpAhySAAAQi0EsB/IwBdIwIDcuEjc0oC/BZwSmAkhwAEINCFAP4bAegaHBiQCx+ZIQABCEAAAqUQwH8jAF2GhwG58JEZAhCAAAQgUAoB/DcC0GV4GJALH5khAAEIQAACpRDAfyMAXYaHAbnwkRkCEIAABCBQCgH8NwLQZXgYkAsfmSEAAQhAAAKlEMB/IwBdhocBufCRGQIQgAAEIFAKAfw3AtBleBiQC19jMvP5lsZ0NQ2FAAQqQgD/jQB0mSoG5MJX+8z6KbcLFj1o1y1eOvQB530nT7BZe2zBB5xr3/s0EAIQCJkA/hsB6LJPDMiFr9aZL7ntEZvDT7jVuo9pHAQgUF0C+G8EoMt6MSAXvtpmVuTv4HNvtcERWjhgZpcftQuRwNpaAQ2DAARCJoD/RgC67BMDcuGrbeYjL7nDrl/ylL26orsEHD1qwLQdfO6M7WvLgYZBAAIQCJUA/hsB6LJNDMiFr5aZdeFj8pwF0Zm/Xs+oAbPFp06z1Vcd3Sspf4cABCAAgQwJ4L8RgC5zwoBc+GqZ+ennl9uO865P3LbbZ+9j640dkzg9CSEAAQhAwE8A/40AdFkRBuTCV8vMRABr2a00CgIQqBkB/DcC0GXSGJALX20zcwawtl1LwyAAgZoQwH8jAF2mjAG58NU2M7eAa9u1NAwCEKgJAfw3AtBlyhiQC1+tM1962yN2Et8BrHUf0zgIQKC6BPDfCECX9WJALny1z3yHfgnkpofs2nufHPolkP2mbGAzd5/E9/9q3/s0EAIQCJkA/hsB6LJPDMiFrzGZ+S3gxnQ1DYUABCpCAP+NAHSZKgbkwkdmCEAAAhCAQCkE8N8IQJfhYUAufGSGAAQgAAEIlEIA/40AdBkeBuTCR2YIQAACEIBAKQTw3whAl+FhQC58ZIYABCAAAQiUQgD/jQB0GR4G5MJHZghAAAIQgEApBPDfCECX4WFALnxkhgAEIAABCJRCAP+NAHQZHgbkwkdmCEAAAhCAQCkE8N8IQJfhYUAufGSGAAQgAAEIlEIA/40AdBkeBuTCR2YIQAACEIBAKQTw3whAl+EtW7bMxo0bZ48++qits846rrLIDAEIQAACEIBAMQQkADfddFN77rnnbN111y3mpYG9ZWBwcHAwsDpVpjq//e1vIwPigQAEIAABCECgegQUwNlkk02qV/EMaowAdEBcsWKFPf744zZ27FgbGBhIVVK8+iB6mAqbKzHMXfhSZ4Z3amTuDDB3I0xVALxT4cokcVbMFft6/vnnbaONNrJRo0ZlUreqFYIALKnHOH9QPHiYF8sc3sXy1ttgXixzeBfLGxvPljcCMFueiUtj4kiMKrOEMM8MZaKC4J0IU6aJYJ4pzp6FwbsnoswTwDw7pAjA7FimKgkjToUrk8QwzwRj4kLgnRhVZglhnhnKRAXBOxGmTBPBPDucCMDsWKYqafny5XbGGWfYZz7zGRszZkyqvCTujwDM++PWby5490uu/3ww759dPznh3Q81Xx6Y+/i15kYAZseSkiAAAQhAAAIQgEAlCCAAK9FNVBICEIAABCAAAQhkRwABmB1LSoIABCAAAQhAAAKVIIAArEQ3UUkIQAACEIAABCCQHQEEYHYsKQkCEIAABCAAAQhUggACMMdu+trXvmZnnXWWPfHEEzZlyhT74he/aHvssUfXN9544432yU9+0u69997o6+THH3+8HXXUUTnWsH5Fp2F+xRVX2DnnnGN33XWX6WaZ+ujkk0+2/fffv35gcmpRGt6tVbj55pttr732sqlTp0b8eZITSMtctn3qqafapZdeak8++WT0s1ezZ8+2D3/4w8lf2uCUaXl/+9vfts997nP2q1/9KvqN2WnTptnnP/95e/Ob39xgismavnDhwshn3nnnnZHfvPLKK2369OkjZsZvJmPbKRUCsH92I+a87LLL7IMf/KBp8thtt93svPPOswsuuMAWL15sm2222bC8Dz30UOQMZ82aZUceeaTJQR599NH23e9+1w466KCcalmvYtMyP/bYYyOhvffee9u4cePswgsvjCbqn/70p7btttvWC04OrUnLO67CsmXLbLvttrO3vOUttnTpUgRgir7ph/kBBxwQcT7ttNMi5k899ZS98sortuuuu6Z4czOTpuV90003RQubL3zhC/ae97zHHnvssWgRv9VWW0VihmdkAldffXXk+zQ/yO/1EoD4TZ9FIQB9/Lrm3mmnnSIjVoQpft72trdFqxl9/6/9OeGEE+wHP/iBLVmyZOhPmjh+8Ytf2K233ppTLetVbFrmnVqvKOAHPvABmzNnTr3g5NCafnkfcsghkUMcPXq0zZ8/HwGYom/SMl+wYIGJ94MPPmjjx49P8SaSikBa3lpAas7/9a9/PQTwK1/5ShQR1O++8yQnMDAw0FMA4jeT8+yUEgHo49cx98svv2xrrrmmXX755fa+971vKM0nPvGJyNkpZN3+7LnnnlHU6Utf+tLQn7T6Ofjgg+3FF1+0VVddNYea1qfIfpi3t37FihW2+eabR1vvH//4x+sDJ4eW9MtbUVZFxbWoUUQKAZi8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\" width=\"640\">"
2104 ],
2105 "text/plain": [
2106 "<IPython.core.display.HTML object>"
2107 ]
2108 },
2109 "metadata": {},
2110 "output_type": "display_data"
2111 }
2112 ],
2113 "source": [
2114 "from sklearn.datasets import make_friedman1\n",
2115 "plt.figure()\n",
2116 "plt.title('Complex regression problem with one input variable')\n",
2117 "X_F1, y_F1 = make_friedman1(n_samples = 100,\n",
2118 " n_features = 8, random_state=0)\n",
2119 "\n",
2120 "plt.scatter(X_F1[:,2], y_F1, marker= 'o', s=50)\n",
2121 "plt.show()"
2122 ]
2123 },
2124 {
2125 "cell_type": "code",
2126 "execution_count": 13,
2127 "id": "b1615c05",
2128 "metadata": {},
2129 "outputs": [
2130 {
2131 "data": {
2132 "application/javascript": [
2133 "/* Put everything inside the global mpl namespace */\n",
2134 "/* global mpl */\n",
2135 "window.mpl = {};\n",
2136 "\n",
2137 "mpl.get_websocket_type = function () {\n",
2138 " if (typeof WebSocket !== 'undefined') {\n",
2139 " return WebSocket;\n",
2140 " } else if (typeof MozWebSocket !== 'undefined') {\n",
2141 " return MozWebSocket;\n",
2142 " } else {\n",
2143 " alert(\n",
2144 " 'Your browser does not have WebSocket support. ' +\n",
2145 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
2146 " 'Firefox 4 and 5 are also supported but you ' +\n",
2147 " 'have to enable WebSockets in about:config.'\n",
2148 " );\n",
2149 " }\n",
2150 "};\n",
2151 "\n",
2152 "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
2153 " this.id = figure_id;\n",
2154 "\n",
2155 " this.ws = websocket;\n",
2156 "\n",
2157 " this.supports_binary = this.ws.binaryType !== undefined;\n",
2158 "\n",
2159 " if (!this.supports_binary) {\n",
2160 " var warnings = document.getElementById('mpl-warnings');\n",
2161 " if (warnings) {\n",
2162 " warnings.style.display = 'block';\n",
2163 " warnings.textContent =\n",
2164 " 'This browser does not support binary websocket messages. ' +\n",
2165 " 'Performance may be slow.';\n",
2166 " }\n",
2167 " }\n",
2168 "\n",
2169 " this.imageObj = new Image();\n",
2170 "\n",
2171 " this.context = undefined;\n",
2172 " this.message = undefined;\n",
2173 " this.canvas = undefined;\n",
2174 " this.rubberband_canvas = undefined;\n",
2175 " this.rubberband_context = undefined;\n",
2176 " this.format_dropdown = undefined;\n",
2177 "\n",
2178 " this.image_mode = 'full';\n",
2179 "\n",
2180 " this.root = document.createElement('div');\n",
2181 " this.root.setAttribute('style', 'display: inline-block');\n",
2182 " this._root_extra_style(this.root);\n",
2183 "\n",
2184 " parent_element.appendChild(this.root);\n",
2185 "\n",
2186 " this._init_header(this);\n",
2187 " this._init_canvas(this);\n",
2188 " this._init_toolbar(this);\n",
2189 "\n",
2190 " var fig = this;\n",
2191 "\n",
2192 " this.waiting = false;\n",
2193 "\n",
2194 " this.ws.onopen = function () {\n",
2195 " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
2196 " fig.send_message('send_image_mode', {});\n",
2197 " if (fig.ratio !== 1) {\n",
2198 " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
2199 " }\n",
2200 " fig.send_message('refresh', {});\n",
2201 " };\n",
2202 "\n",
2203 " this.imageObj.onload = function () {\n",
2204 " if (fig.image_mode === 'full') {\n",
2205 " // Full images could contain transparency (where diff images\n",
2206 " // almost always do), so we need to clear the canvas so that\n",
2207 " // there is no ghosting.\n",
2208 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
2209 " }\n",
2210 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
2211 " };\n",
2212 "\n",
2213 " this.imageObj.onunload = function () {\n",
2214 " fig.ws.close();\n",
2215 " };\n",
2216 "\n",
2217 " this.ws.onmessage = this._make_on_message_function(this);\n",
2218 "\n",
2219 " this.ondownload = ondownload;\n",
2220 "};\n",
2221 "\n",
2222 "mpl.figure.prototype._init_header = function () {\n",
2223 " var titlebar = document.createElement('div');\n",
2224 " titlebar.classList =\n",
2225 " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
2226 " var titletext = document.createElement('div');\n",
2227 " titletext.classList = 'ui-dialog-title';\n",
2228 " titletext.setAttribute(\n",
2229 " 'style',\n",
2230 " 'width: 100%; text-align: center; padding: 3px;'\n",
2231 " );\n",
2232 " titlebar.appendChild(titletext);\n",
2233 " this.root.appendChild(titlebar);\n",
2234 " this.header = titletext;\n",
2235 "};\n",
2236 "\n",
2237 "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
2238 "\n",
2239 "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
2240 "\n",
2241 "mpl.figure.prototype._init_canvas = function () {\n",
2242 " var fig = this;\n",
2243 "\n",
2244 " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
2245 " canvas_div.setAttribute(\n",
2246 " 'style',\n",
2247 " 'border: 1px solid #ddd;' +\n",
2248 " 'box-sizing: content-box;' +\n",
2249 " 'clear: both;' +\n",
2250 " 'min-height: 1px;' +\n",
2251 " 'min-width: 1px;' +\n",
2252 " 'outline: 0;' +\n",
2253 " 'overflow: hidden;' +\n",
2254 " 'position: relative;' +\n",
2255 " 'resize: both;'\n",
2256 " );\n",
2257 "\n",
2258 " function on_keyboard_event_closure(name) {\n",
2259 " return function (event) {\n",
2260 " return fig.key_event(event, name);\n",
2261 " };\n",
2262 " }\n",
2263 "\n",
2264 " canvas_div.addEventListener(\n",
2265 " 'keydown',\n",
2266 " on_keyboard_event_closure('key_press')\n",
2267 " );\n",
2268 " canvas_div.addEventListener(\n",
2269 " 'keyup',\n",
2270 " on_keyboard_event_closure('key_release')\n",
2271 " );\n",
2272 "\n",
2273 " this._canvas_extra_style(canvas_div);\n",
2274 " this.root.appendChild(canvas_div);\n",
2275 "\n",
2276 " var canvas = (this.canvas = document.createElement('canvas'));\n",
2277 " canvas.classList.add('mpl-canvas');\n",
2278 " canvas.setAttribute('style', 'box-sizing: content-box;');\n",
2279 "\n",
2280 " this.context = canvas.getContext('2d');\n",
2281 "\n",
2282 " var backingStore =\n",
2283 " this.context.backingStorePixelRatio ||\n",
2284 " this.context.webkitBackingStorePixelRatio ||\n",
2285 " this.context.mozBackingStorePixelRatio ||\n",
2286 " this.context.msBackingStorePixelRatio ||\n",
2287 " this.context.oBackingStorePixelRatio ||\n",
2288 " this.context.backingStorePixelRatio ||\n",
2289 " 1;\n",
2290 "\n",
2291 " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
2292 "\n",
2293 " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
2294 " 'canvas'\n",
2295 " ));\n",
2296 " rubberband_canvas.setAttribute(\n",
2297 " 'style',\n",
2298 " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
2299 " );\n",
2300 "\n",
2301 " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
2302 " if (this.ResizeObserver === undefined) {\n",
2303 " if (window.ResizeObserver !== undefined) {\n",
2304 " this.ResizeObserver = window.ResizeObserver;\n",
2305 " } else {\n",
2306 " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
2307 " this.ResizeObserver = obs.ResizeObserver;\n",
2308 " }\n",
2309 " }\n",
2310 "\n",
2311 " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
2312 " var nentries = entries.length;\n",
2313 " for (var i = 0; i < nentries; i++) {\n",
2314 " var entry = entries[i];\n",
2315 " var width, height;\n",
2316 " if (entry.contentBoxSize) {\n",
2317 " if (entry.contentBoxSize instanceof Array) {\n",
2318 " // Chrome 84 implements new version of spec.\n",
2319 " width = entry.contentBoxSize[0].inlineSize;\n",
2320 " height = entry.contentBoxSize[0].blockSize;\n",
2321 " } else {\n",
2322 " // Firefox implements old version of spec.\n",
2323 " width = entry.contentBoxSize.inlineSize;\n",
2324 " height = entry.contentBoxSize.blockSize;\n",
2325 " }\n",
2326 " } else {\n",
2327 " // Chrome <84 implements even older version of spec.\n",
2328 " width = entry.contentRect.width;\n",
2329 " height = entry.contentRect.height;\n",
2330 " }\n",
2331 "\n",
2332 " // Keep the size of the canvas and rubber band canvas in sync with\n",
2333 " // the canvas container.\n",
2334 " if (entry.devicePixelContentBoxSize) {\n",
2335 " // Chrome 84 implements new version of spec.\n",
2336 " canvas.setAttribute(\n",
2337 " 'width',\n",
2338 " entry.devicePixelContentBoxSize[0].inlineSize\n",
2339 " );\n",
2340 " canvas.setAttribute(\n",
2341 " 'height',\n",
2342 " entry.devicePixelContentBoxSize[0].blockSize\n",
2343 " );\n",
2344 " } else {\n",
2345 " canvas.setAttribute('width', width * fig.ratio);\n",
2346 " canvas.setAttribute('height', height * fig.ratio);\n",
2347 " }\n",
2348 " canvas.setAttribute(\n",
2349 " 'style',\n",
2350 " 'width: ' + width + 'px; height: ' + height + 'px;'\n",
2351 " );\n",
2352 "\n",
2353 " rubberband_canvas.setAttribute('width', width);\n",
2354 " rubberband_canvas.setAttribute('height', height);\n",
2355 "\n",
2356 " // And update the size in Python. We ignore the initial 0/0 size\n",
2357 " // that occurs as the element is placed into the DOM, which should\n",
2358 " // otherwise not happen due to the minimum size styling.\n",
2359 " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
2360 " fig.request_resize(width, height);\n",
2361 " }\n",
2362 " }\n",
2363 " });\n",
2364 " this.resizeObserverInstance.observe(canvas_div);\n",
2365 "\n",
2366 " function on_mouse_event_closure(name) {\n",
2367 " return function (event) {\n",
2368 " return fig.mouse_event(event, name);\n",
2369 " };\n",
2370 " }\n",
2371 "\n",
2372 " rubberband_canvas.addEventListener(\n",
2373 " 'mousedown',\n",
2374 " on_mouse_event_closure('button_press')\n",
2375 " );\n",
2376 " rubberband_canvas.addEventListener(\n",
2377 " 'mouseup',\n",
2378 " on_mouse_event_closure('button_release')\n",
2379 " );\n",
2380 " // Throttle sequential mouse events to 1 every 20ms.\n",
2381 " rubberband_canvas.addEventListener(\n",
2382 " 'mousemove',\n",
2383 " on_mouse_event_closure('motion_notify')\n",
2384 " );\n",
2385 "\n",
2386 " rubberband_canvas.addEventListener(\n",
2387 " 'mouseenter',\n",
2388 " on_mouse_event_closure('figure_enter')\n",
2389 " );\n",
2390 " rubberband_canvas.addEventListener(\n",
2391 " 'mouseleave',\n",
2392 " on_mouse_event_closure('figure_leave')\n",
2393 " );\n",
2394 "\n",
2395 " canvas_div.addEventListener('wheel', function (event) {\n",
2396 " if (event.deltaY < 0) {\n",
2397 " event.step = 1;\n",
2398 " } else {\n",
2399 " event.step = -1;\n",
2400 " }\n",
2401 " on_mouse_event_closure('scroll')(event);\n",
2402 " });\n",
2403 "\n",
2404 " canvas_div.appendChild(canvas);\n",
2405 " canvas_div.appendChild(rubberband_canvas);\n",
2406 "\n",
2407 " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
2408 " this.rubberband_context.strokeStyle = '#000000';\n",
2409 "\n",
2410 " this._resize_canvas = function (width, height, forward) {\n",
2411 " if (forward) {\n",
2412 " canvas_div.style.width = width + 'px';\n",
2413 " canvas_div.style.height = height + 'px';\n",
2414 " }\n",
2415 " };\n",
2416 "\n",
2417 " // Disable right mouse context menu.\n",
2418 " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
2419 " event.preventDefault();\n",
2420 " return false;\n",
2421 " });\n",
2422 "\n",
2423 " function set_focus() {\n",
2424 " canvas.focus();\n",
2425 " canvas_div.focus();\n",
2426 " }\n",
2427 "\n",
2428 " window.setTimeout(set_focus, 100);\n",
2429 "};\n",
2430 "\n",
2431 "mpl.figure.prototype._init_toolbar = function () {\n",
2432 " var fig = this;\n",
2433 "\n",
2434 " var toolbar = document.createElement('div');\n",
2435 " toolbar.classList = 'mpl-toolbar';\n",
2436 " this.root.appendChild(toolbar);\n",
2437 "\n",
2438 " function on_click_closure(name) {\n",
2439 " return function (_event) {\n",
2440 " return fig.toolbar_button_onclick(name);\n",
2441 " };\n",
2442 " }\n",
2443 "\n",
2444 " function on_mouseover_closure(tooltip) {\n",
2445 " return function (event) {\n",
2446 " if (!event.currentTarget.disabled) {\n",
2447 " return fig.toolbar_button_onmouseover(tooltip);\n",
2448 " }\n",
2449 " };\n",
2450 " }\n",
2451 "\n",
2452 " fig.buttons = {};\n",
2453 " var buttonGroup = document.createElement('div');\n",
2454 " buttonGroup.classList = 'mpl-button-group';\n",
2455 " for (var toolbar_ind in mpl.toolbar_items) {\n",
2456 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
2457 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
2458 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
2459 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
2460 "\n",
2461 " if (!name) {\n",
2462 " /* Instead of a spacer, we start a new button group. */\n",
2463 " if (buttonGroup.hasChildNodes()) {\n",
2464 " toolbar.appendChild(buttonGroup);\n",
2465 " }\n",
2466 " buttonGroup = document.createElement('div');\n",
2467 " buttonGroup.classList = 'mpl-button-group';\n",
2468 " continue;\n",
2469 " }\n",
2470 "\n",
2471 " var button = (fig.buttons[name] = document.createElement('button'));\n",
2472 " button.classList = 'mpl-widget';\n",
2473 " button.setAttribute('role', 'button');\n",
2474 " button.setAttribute('aria-disabled', 'false');\n",
2475 " button.addEventListener('click', on_click_closure(method_name));\n",
2476 " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
2477 "\n",
2478 " var icon_img = document.createElement('img');\n",
2479 " icon_img.src = '_images/' + image + '.png';\n",
2480 " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
2481 " icon_img.alt = tooltip;\n",
2482 " button.appendChild(icon_img);\n",
2483 "\n",
2484 " buttonGroup.appendChild(button);\n",
2485 " }\n",
2486 "\n",
2487 " if (buttonGroup.hasChildNodes()) {\n",
2488 " toolbar.appendChild(buttonGroup);\n",
2489 " }\n",
2490 "\n",
2491 " var fmt_picker = document.createElement('select');\n",
2492 " fmt_picker.classList = 'mpl-widget';\n",
2493 " toolbar.appendChild(fmt_picker);\n",
2494 " this.format_dropdown = fmt_picker;\n",
2495 "\n",
2496 " for (var ind in mpl.extensions) {\n",
2497 " var fmt = mpl.extensions[ind];\n",
2498 " var option = document.createElement('option');\n",
2499 " option.selected = fmt === mpl.default_extension;\n",
2500 " option.innerHTML = fmt;\n",
2501 " fmt_picker.appendChild(option);\n",
2502 " }\n",
2503 "\n",
2504 " var status_bar = document.createElement('span');\n",
2505 " status_bar.classList = 'mpl-message';\n",
2506 " toolbar.appendChild(status_bar);\n",
2507 " this.message = status_bar;\n",
2508 "};\n",
2509 "\n",
2510 "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
2511 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
2512 " // which will in turn request a refresh of the image.\n",
2513 " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
2514 "};\n",
2515 "\n",
2516 "mpl.figure.prototype.send_message = function (type, properties) {\n",
2517 " properties['type'] = type;\n",
2518 " properties['figure_id'] = this.id;\n",
2519 " this.ws.send(JSON.stringify(properties));\n",
2520 "};\n",
2521 "\n",
2522 "mpl.figure.prototype.send_draw_message = function () {\n",
2523 " if (!this.waiting) {\n",
2524 " this.waiting = true;\n",
2525 " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
2526 " }\n",
2527 "};\n",
2528 "\n",
2529 "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
2530 " var format_dropdown = fig.format_dropdown;\n",
2531 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
2532 " fig.ondownload(fig, format);\n",
2533 "};\n",
2534 "\n",
2535 "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
2536 " var size = msg['size'];\n",
2537 " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
2538 " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
2539 " fig.send_message('refresh', {});\n",
2540 " }\n",
2541 "};\n",
2542 "\n",
2543 "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
2544 " var x0 = msg['x0'] / fig.ratio;\n",
2545 " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
2546 " var x1 = msg['x1'] / fig.ratio;\n",
2547 " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
2548 " x0 = Math.floor(x0) + 0.5;\n",
2549 " y0 = Math.floor(y0) + 0.5;\n",
2550 " x1 = Math.floor(x1) + 0.5;\n",
2551 " y1 = Math.floor(y1) + 0.5;\n",
2552 " var min_x = Math.min(x0, x1);\n",
2553 " var min_y = Math.min(y0, y1);\n",
2554 " var width = Math.abs(x1 - x0);\n",
2555 " var height = Math.abs(y1 - y0);\n",
2556 "\n",
2557 " fig.rubberband_context.clearRect(\n",
2558 " 0,\n",
2559 " 0,\n",
2560 " fig.canvas.width / fig.ratio,\n",
2561 " fig.canvas.height / fig.ratio\n",
2562 " );\n",
2563 "\n",
2564 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
2565 "};\n",
2566 "\n",
2567 "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
2568 " // Updates the figure title.\n",
2569 " fig.header.textContent = msg['label'];\n",
2570 "};\n",
2571 "\n",
2572 "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
2573 " var cursor = msg['cursor'];\n",
2574 " switch (cursor) {\n",
2575 " case 0:\n",
2576 " cursor = 'pointer';\n",
2577 " break;\n",
2578 " case 1:\n",
2579 " cursor = 'default';\n",
2580 " break;\n",
2581 " case 2:\n",
2582 " cursor = 'crosshair';\n",
2583 " break;\n",
2584 " case 3:\n",
2585 " cursor = 'move';\n",
2586 " break;\n",
2587 " }\n",
2588 " fig.rubberband_canvas.style.cursor = cursor;\n",
2589 "};\n",
2590 "\n",
2591 "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
2592 " fig.message.textContent = msg['message'];\n",
2593 "};\n",
2594 "\n",
2595 "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
2596 " // Request the server to send over a new figure.\n",
2597 " fig.send_draw_message();\n",
2598 "};\n",
2599 "\n",
2600 "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
2601 " fig.image_mode = msg['mode'];\n",
2602 "};\n",
2603 "\n",
2604 "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
2605 " for (var key in msg) {\n",
2606 " if (!(key in fig.buttons)) {\n",
2607 " continue;\n",
2608 " }\n",
2609 " fig.buttons[key].disabled = !msg[key];\n",
2610 " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
2611 " }\n",
2612 "};\n",
2613 "\n",
2614 "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
2615 " if (msg['mode'] === 'PAN') {\n",
2616 " fig.buttons['Pan'].classList.add('active');\n",
2617 " fig.buttons['Zoom'].classList.remove('active');\n",
2618 " } else if (msg['mode'] === 'ZOOM') {\n",
2619 " fig.buttons['Pan'].classList.remove('active');\n",
2620 " fig.buttons['Zoom'].classList.add('active');\n",
2621 " } else {\n",
2622 " fig.buttons['Pan'].classList.remove('active');\n",
2623 " fig.buttons['Zoom'].classList.remove('active');\n",
2624 " }\n",
2625 "};\n",
2626 "\n",
2627 "mpl.figure.prototype.updated_canvas_event = function () {\n",
2628 " // Called whenever the canvas gets updated.\n",
2629 " this.send_message('ack', {});\n",
2630 "};\n",
2631 "\n",
2632 "// A function to construct a web socket function for onmessage handling.\n",
2633 "// Called in the figure constructor.\n",
2634 "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
2635 " return function socket_on_message(evt) {\n",
2636 " if (evt.data instanceof Blob) {\n",
2637 " /* FIXME: We get \"Resource interpreted as Image but\n",
2638 " * transferred with MIME type text/plain:\" errors on\n",
2639 " * Chrome. But how to set the MIME type? It doesn't seem\n",
2640 " * to be part of the websocket stream */\n",
2641 " evt.data.type = 'image/png';\n",
2642 "\n",
2643 " /* Free the memory for the previous frames */\n",
2644 " if (fig.imageObj.src) {\n",
2645 " (window.URL || window.webkitURL).revokeObjectURL(\n",
2646 " fig.imageObj.src\n",
2647 " );\n",
2648 " }\n",
2649 "\n",
2650 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
2651 " evt.data\n",
2652 " );\n",
2653 " fig.updated_canvas_event();\n",
2654 " fig.waiting = false;\n",
2655 " return;\n",
2656 " } else if (\n",
2657 " typeof evt.data === 'string' &&\n",
2658 " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
2659 " ) {\n",
2660 " fig.imageObj.src = evt.data;\n",
2661 " fig.updated_canvas_event();\n",
2662 " fig.waiting = false;\n",
2663 " return;\n",
2664 " }\n",
2665 "\n",
2666 " var msg = JSON.parse(evt.data);\n",
2667 " var msg_type = msg['type'];\n",
2668 "\n",
2669 " // Call the \"handle_{type}\" callback, which takes\n",
2670 " // the figure and JSON message as its only arguments.\n",
2671 " try {\n",
2672 " var callback = fig['handle_' + msg_type];\n",
2673 " } catch (e) {\n",
2674 " console.log(\n",
2675 " \"No handler for the '\" + msg_type + \"' message type: \",\n",
2676 " msg\n",
2677 " );\n",
2678 " return;\n",
2679 " }\n",
2680 "\n",
2681 " if (callback) {\n",
2682 " try {\n",
2683 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
2684 " callback(fig, msg);\n",
2685 " } catch (e) {\n",
2686 " console.log(\n",
2687 " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
2688 " e,\n",
2689 " e.stack,\n",
2690 " msg\n",
2691 " );\n",
2692 " }\n",
2693 " }\n",
2694 " };\n",
2695 "};\n",
2696 "\n",
2697 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
2698 "mpl.findpos = function (e) {\n",
2699 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
2700 " var targ;\n",
2701 " if (!e) {\n",
2702 " e = window.event;\n",
2703 " }\n",
2704 " if (e.target) {\n",
2705 " targ = e.target;\n",
2706 " } else if (e.srcElement) {\n",
2707 " targ = e.srcElement;\n",
2708 " }\n",
2709 " if (targ.nodeType === 3) {\n",
2710 " // defeat Safari bug\n",
2711 " targ = targ.parentNode;\n",
2712 " }\n",
2713 "\n",
2714 " // pageX,Y are the mouse positions relative to the document\n",
2715 " var boundingRect = targ.getBoundingClientRect();\n",
2716 " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
2717 " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
2718 "\n",
2719 " return { x: x, y: y };\n",
2720 "};\n",
2721 "\n",
2722 "/*\n",
2723 " * return a copy of an object with only non-object keys\n",
2724 " * we need this to avoid circular references\n",
2725 " * http://stackoverflow.com/a/24161582/3208463\n",
2726 " */\n",
2727 "function simpleKeys(original) {\n",
2728 " return Object.keys(original).reduce(function (obj, key) {\n",
2729 " if (typeof original[key] !== 'object') {\n",
2730 " obj[key] = original[key];\n",
2731 " }\n",
2732 " return obj;\n",
2733 " }, {});\n",
2734 "}\n",
2735 "\n",
2736 "mpl.figure.prototype.mouse_event = function (event, name) {\n",
2737 " var canvas_pos = mpl.findpos(event);\n",
2738 "\n",
2739 " if (name === 'button_press') {\n",
2740 " this.canvas.focus();\n",
2741 " this.canvas_div.focus();\n",
2742 " }\n",
2743 "\n",
2744 " var x = canvas_pos.x * this.ratio;\n",
2745 " var y = canvas_pos.y * this.ratio;\n",
2746 "\n",
2747 " this.send_message(name, {\n",
2748 " x: x,\n",
2749 " y: y,\n",
2750 " button: event.button,\n",
2751 " step: event.step,\n",
2752 " guiEvent: simpleKeys(event),\n",
2753 " });\n",
2754 "\n",
2755 " /* This prevents the web browser from automatically changing to\n",
2756 " * the text insertion cursor when the button is pressed. We want\n",
2757 " * to control all of the cursor setting manually through the\n",
2758 " * 'cursor' event from matplotlib */\n",
2759 " event.preventDefault();\n",
2760 " return false;\n",
2761 "};\n",
2762 "\n",
2763 "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
2764 " // Handle any extra behaviour associated with a key event\n",
2765 "};\n",
2766 "\n",
2767 "mpl.figure.prototype.key_event = function (event, name) {\n",
2768 " // Prevent repeat events\n",
2769 " if (name === 'key_press') {\n",
2770 " if (event.which === this._key) {\n",
2771 " return;\n",
2772 " } else {\n",
2773 " this._key = event.which;\n",
2774 " }\n",
2775 " }\n",
2776 " if (name === 'key_release') {\n",
2777 " this._key = null;\n",
2778 " }\n",
2779 "\n",
2780 " var value = '';\n",
2781 " if (event.ctrlKey && event.which !== 17) {\n",
2782 " value += 'ctrl+';\n",
2783 " }\n",
2784 " if (event.altKey && event.which !== 18) {\n",
2785 " value += 'alt+';\n",
2786 " }\n",
2787 " if (event.shiftKey && event.which !== 16) {\n",
2788 " value += 'shift+';\n",
2789 " }\n",
2790 "\n",
2791 " value += 'k';\n",
2792 " value += event.which.toString();\n",
2793 "\n",
2794 " this._key_event_extra(event, name);\n",
2795 "\n",
2796 " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
2797 " return false;\n",
2798 "};\n",
2799 "\n",
2800 "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
2801 " if (name === 'download') {\n",
2802 " this.handle_save(this, null);\n",
2803 " } else {\n",
2804 " this.send_message('toolbar_button', { name: name });\n",
2805 " }\n",
2806 "};\n",
2807 "\n",
2808 "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
2809 " this.message.textContent = tooltip;\n",
2810 "};\n",
2811 "\n",
2812 "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
2813 "// prettier-ignore\n",
2814 "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
2815 "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
2816 "\n",
2817 "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
2818 "\n",
2819 "mpl.default_extension = \"png\";/* global mpl */\n",
2820 "\n",
2821 "var comm_websocket_adapter = function (comm) {\n",
2822 " // Create a \"websocket\"-like object which calls the given IPython comm\n",
2823 " // object with the appropriate methods. Currently this is a non binary\n",
2824 " // socket, so there is still some room for performance tuning.\n",
2825 " var ws = {};\n",
2826 "\n",
2827 " ws.close = function () {\n",
2828 " comm.close();\n",
2829 " };\n",
2830 " ws.send = function (m) {\n",
2831 " //console.log('sending', m);\n",
2832 " comm.send(m);\n",
2833 " };\n",
2834 " // Register the callback with on_msg.\n",
2835 " comm.on_msg(function (msg) {\n",
2836 " //console.log('receiving', msg['content']['data'], msg);\n",
2837 " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
2838 " ws.onmessage(msg['content']['data']);\n",
2839 " });\n",
2840 " return ws;\n",
2841 "};\n",
2842 "\n",
2843 "mpl.mpl_figure_comm = function (comm, msg) {\n",
2844 " // This is the function which gets called when the mpl process\n",
2845 " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
2846 "\n",
2847 " var id = msg.content.data.id;\n",
2848 " // Get hold of the div created by the display call when the Comm\n",
2849 " // socket was opened in Python.\n",
2850 " var element = document.getElementById(id);\n",
2851 " var ws_proxy = comm_websocket_adapter(comm);\n",
2852 "\n",
2853 " function ondownload(figure, _format) {\n",
2854 " window.open(figure.canvas.toDataURL());\n",
2855 " }\n",
2856 "\n",
2857 " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
2858 "\n",
2859 " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
2860 " // web socket which is closed, not our websocket->open comm proxy.\n",
2861 " ws_proxy.onopen();\n",
2862 "\n",
2863 " fig.parent_element = element;\n",
2864 " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
2865 " if (!fig.cell_info) {\n",
2866 " console.error('Failed to find cell for figure', id, fig);\n",
2867 " return;\n",
2868 " }\n",
2869 " fig.cell_info[0].output_area.element.on(\n",
2870 " 'cleared',\n",
2871 " { fig: fig },\n",
2872 " fig._remove_fig_handler\n",
2873 " );\n",
2874 "};\n",
2875 "\n",
2876 "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
2877 " var width = fig.canvas.width / fig.ratio;\n",
2878 " fig.cell_info[0].output_area.element.off(\n",
2879 " 'cleared',\n",
2880 " fig._remove_fig_handler\n",
2881 " );\n",
2882 " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
2883 "\n",
2884 " // Update the output cell to use the data from the current canvas.\n",
2885 " fig.push_to_output();\n",
2886 " var dataURL = fig.canvas.toDataURL();\n",
2887 " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
2888 " // the notebook keyboard shortcuts fail.\n",
2889 " IPython.keyboard_manager.enable();\n",
2890 " fig.parent_element.innerHTML =\n",
2891 " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
2892 " fig.close_ws(fig, msg);\n",
2893 "};\n",
2894 "\n",
2895 "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
2896 " fig.send_message('closing', msg);\n",
2897 " // fig.ws.close()\n",
2898 "};\n",
2899 "\n",
2900 "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
2901 " // Turn the data on the canvas into data in the output cell.\n",
2902 " var width = this.canvas.width / this.ratio;\n",
2903 " var dataURL = this.canvas.toDataURL();\n",
2904 " this.cell_info[1]['text/html'] =\n",
2905 " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
2906 "};\n",
2907 "\n",
2908 "mpl.figure.prototype.updated_canvas_event = function () {\n",
2909 " // Tell IPython that the notebook contents must change.\n",
2910 " IPython.notebook.set_dirty(true);\n",
2911 " this.send_message('ack', {});\n",
2912 " var fig = this;\n",
2913 " // Wait a second, then push the new image to the DOM so\n",
2914 " // that it is saved nicely (might be nice to debounce this).\n",
2915 " setTimeout(function () {\n",
2916 " fig.push_to_output();\n",
2917 " }, 1000);\n",
2918 "};\n",
2919 "\n",
2920 "mpl.figure.prototype._init_toolbar = function () {\n",
2921 " var fig = this;\n",
2922 "\n",
2923 " var toolbar = document.createElement('div');\n",
2924 " toolbar.classList = 'btn-toolbar';\n",
2925 " this.root.appendChild(toolbar);\n",
2926 "\n",
2927 " function on_click_closure(name) {\n",
2928 " return function (_event) {\n",
2929 " return fig.toolbar_button_onclick(name);\n",
2930 " };\n",
2931 " }\n",
2932 "\n",
2933 " function on_mouseover_closure(tooltip) {\n",
2934 " return function (event) {\n",
2935 " if (!event.currentTarget.disabled) {\n",
2936 " return fig.toolbar_button_onmouseover(tooltip);\n",
2937 " }\n",
2938 " };\n",
2939 " }\n",
2940 "\n",
2941 " fig.buttons = {};\n",
2942 " var buttonGroup = document.createElement('div');\n",
2943 " buttonGroup.classList = 'btn-group';\n",
2944 " var button;\n",
2945 " for (var toolbar_ind in mpl.toolbar_items) {\n",
2946 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
2947 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
2948 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
2949 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
2950 "\n",
2951 " if (!name) {\n",
2952 " /* Instead of a spacer, we start a new button group. */\n",
2953 " if (buttonGroup.hasChildNodes()) {\n",
2954 " toolbar.appendChild(buttonGroup);\n",
2955 " }\n",
2956 " buttonGroup = document.createElement('div');\n",
2957 " buttonGroup.classList = 'btn-group';\n",
2958 " continue;\n",
2959 " }\n",
2960 "\n",
2961 " button = fig.buttons[name] = document.createElement('button');\n",
2962 " button.classList = 'btn btn-default';\n",
2963 " button.href = '#';\n",
2964 " button.title = name;\n",
2965 " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
2966 " button.addEventListener('click', on_click_closure(method_name));\n",
2967 " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
2968 " buttonGroup.appendChild(button);\n",
2969 " }\n",
2970 "\n",
2971 " if (buttonGroup.hasChildNodes()) {\n",
2972 " toolbar.appendChild(buttonGroup);\n",
2973 " }\n",
2974 "\n",
2975 " // Add the status bar.\n",
2976 " var status_bar = document.createElement('span');\n",
2977 " status_bar.classList = 'mpl-message pull-right';\n",
2978 " toolbar.appendChild(status_bar);\n",
2979 " this.message = status_bar;\n",
2980 "\n",
2981 " // Add the close button to the window.\n",
2982 " var buttongrp = document.createElement('div');\n",
2983 " buttongrp.classList = 'btn-group inline pull-right';\n",
2984 " button = document.createElement('button');\n",
2985 " button.classList = 'btn btn-mini btn-primary';\n",
2986 " button.href = '#';\n",
2987 " button.title = 'Stop Interaction';\n",
2988 " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
2989 " button.addEventListener('click', function (_evt) {\n",
2990 " fig.handle_close(fig, {});\n",
2991 " });\n",
2992 " button.addEventListener(\n",
2993 " 'mouseover',\n",
2994 " on_mouseover_closure('Stop Interaction')\n",
2995 " );\n",
2996 " buttongrp.appendChild(button);\n",
2997 " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
2998 " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
2999 "};\n",
3000 "\n",
3001 "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
3002 " var fig = event.data.fig;\n",
3003 " if (event.target !== this) {\n",
3004 " // Ignore bubbled events from children.\n",
3005 " return;\n",
3006 " }\n",
3007 " fig.close_ws(fig, {});\n",
3008 "};\n",
3009 "\n",
3010 "mpl.figure.prototype._root_extra_style = function (el) {\n",
3011 " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
3012 "};\n",
3013 "\n",
3014 "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
3015 " // this is important to make the div 'focusable\n",
3016 " el.setAttribute('tabindex', 0);\n",
3017 " // reach out to IPython and tell the keyboard manager to turn it's self\n",
3018 " // off when our div gets focus\n",
3019 "\n",
3020 " // location in version 3\n",
3021 " if (IPython.notebook.keyboard_manager) {\n",
3022 " IPython.notebook.keyboard_manager.register_events(el);\n",
3023 " } else {\n",
3024 " // location in version 2\n",
3025 " IPython.keyboard_manager.register_events(el);\n",
3026 " }\n",
3027 "};\n",
3028 "\n",
3029 "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
3030 " var manager = IPython.notebook.keyboard_manager;\n",
3031 " if (!manager) {\n",
3032 " manager = IPython.keyboard_manager;\n",
3033 " }\n",
3034 "\n",
3035 " // Check for shift+enter\n",
3036 " if (event.shiftKey && event.which === 13) {\n",
3037 " this.canvas_div.blur();\n",
3038 " // select the cell after this one\n",
3039 " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
3040 " IPython.notebook.select(index + 1);\n",
3041 " }\n",
3042 "};\n",
3043 "\n",
3044 "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
3045 " fig.ondownload(fig, null);\n",
3046 "};\n",
3047 "\n",
3048 "mpl.find_output_cell = function (html_output) {\n",
3049 " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
3050 " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
3051 " // IPython event is triggered only after the cells have been serialised, which for\n",
3052 " // our purposes (turning an active figure into a static one), is too late.\n",
3053 " var cells = IPython.notebook.get_cells();\n",
3054 " var ncells = cells.length;\n",
3055 " for (var i = 0; i < ncells; i++) {\n",
3056 " var cell = cells[i];\n",
3057 " if (cell.cell_type === 'code') {\n",
3058 " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
3059 " var data = cell.output_area.outputs[j];\n",
3060 " if (data.data) {\n",
3061 " // IPython >= 3 moved mimebundle to data attribute of output\n",
3062 " data = data.data;\n",
3063 " }\n",
3064 " if (data['text/html'] === html_output) {\n",
3065 " return [cell, data, j];\n",
3066 " }\n",
3067 " }\n",
3068 " }\n",
3069 " }\n",
3070 "};\n",
3071 "\n",
3072 "// Register the function which deals with the matplotlib target/channel.\n",
3073 "// The kernel may be null if the page has been refreshed.\n",
3074 "if (IPython.notebook.kernel !== null) {\n",
3075 " IPython.notebook.kernel.comm_manager.register_target(\n",
3076 " 'matplotlib',\n",
3077 " mpl.mpl_figure_comm\n",
3078 " );\n",
3079 "}\n"
3080 ],
3081 "text/plain": [
3082 "<IPython.core.display.Javascript object>"
3083 ]
3084 },
3085 "metadata": {},
3086 "output_type": "display_data"
3087 },
3088 {
3089 "data": {
3090 "text/html": [
3091 "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydBbhVxfrGX0IURUAUFBUVscEOTDBQMK7FNVHswI6reC3ALuyOi0mY2HFNDLy2ogh2IWLzxwSE//NbrIWbzY6199rnnB3vPM95xHNm1pr5rW/NvOubmW8azZw5c6acTMAETMAETMAETMAEaoZAIwvAmnnWbqgJmIAJmIAJmIAJBAQsAG0IJmACJmACJmACJlBjBCwAa+yBu7kmYAImYAImYAImYAFoGzABEzABEzABEzCBGiNgAVhjD9zNNQETMAETMAETMAELQNuACZiACZiACZiACdQYAQvAGnvgbq4JmIAJmIAJmIAJWADaBkzABEzABEzABEygxghYANbYA3dzTcAETMAETMAETMAC0DZgAiZgAiZgAiZgAjVGwAKwxh64m2sCJmACJmACJmACFoC2ARMwARMwARMwAROoMQIWgDX2wN1cEzABEzABEzABE7AAtA2YgAmYgAmYgAmYQI0RsACssQfu5pqACZiACZiACZiABaBtwARMwARMwARMwARqjIAFYI09cDfXBEzABEzABEzABCwAbQMmYAImYAImYAImUGMELABr7IG7uSZgAiZgAiZgAiZgAWgbMAETMAETMAETMIEaI2ABWGMP3M01ARMwARMwARMwAQtA24AJmIAJmIAJmIAJ1BgBC8Aae+BurgmYgAmYgAmYgAlYANoGTMAETMAETMAETKDGCFgA1tgDd3NNwARMwARMwARMwALQNmACJmACJmACJmACNUbAArDGHribawImYAImYAImYAIWgLYBEzABEzABEzABE6gxAhaANfbA3VwTMAETMAETMAETsAC0DZiACZiACZiACZhAjRGwAKyxB+7mmoAJmIAJmIAJmIAFoG3ABEzABEzABEzABGqMgAVgjT1wN9cETMAETMAETMAELABtAyZgAiZgAiZgAiZQYwQsAGvsgbu5JmACJmACJmACJmABaBswARMwARMwARMwgRojUDUC8H//+5/OO+88vf7665o0aZJat26tZZddVhtuuKEGDx5c1o9133331bPPPqvPPvusJPUcOHCgBg0apO+++06LLLJIzmtuuummwd+5fzUmmHbs2FFDhgwRnBsiZXq+P/74ow477DA9/fTTwXPaYYcdNHLkSDVq1EgDBgwQz7Au0jnnnKNVVllFO+644xyX5/lvttlmeuaZZxTZRF3cv6GvWYvvRib7y2YHN998s/bbbz+9+uqrWmeddQp+XI888oheeeWVOrPfQiu0zDLLBPZMu4pJp556qm699VZ9/fXXatGihX7++ediLtNgZXI9j6Rsim3U1KlTddRRR+n+++/Xt99+q1VXXVVvvfVWsZfLWu6ll17SE088oWOOOSbQA05zE6gKAfjwww9r++23D170gw46SO3bt9fEiRP12muvafjw4frqq6/K+tk3pAAcO3ZswAZRUI2pHATgxx9/rP/7v//TmmuuORvxscceq6uvvlr/+c9/1KlTJ7Vp00YrrLCCXn75ZS255JLBT10kBrF//vOfcw2I1A9bwA5atmxZF7cui2vWogDMZH/Z7CCpADziiCN01VVXaebMmWXxvN98883AnnnHCk0IFD6UTjnlFG299daad955ixLFhd63lPlzPY8kbJLU8bLLLgtE2RVXXKG11147ENaIwFKniy66SCeccII+/fRTIXadqlQAdu/eXRMmTNC4cePUtGnTOVo5Y8YMNW7cuKyffUMKwIYC8/vvv2u++eYLPF51mcpBAGZq35ZbbhnYbCTA65JB6rWzDfz1df9S3+evv/7S9OnTg8E5TqpFAZiJS60IwDg2kS3P2WefLTyAzCi1a9cuyaVml/3tt980//zzl+RacS5SboKcOuOkueOOOwSLukx1JQDra+yqSzbRtavCA9ilS5fgKwLvSb40YsQI3XTTTRozZkzgzufLgOm30047TQsssMDs4oiyu+++O/AiHn300XrhhReCL0n+fdJJJwX3+te//iW+opZYYongK3GfffaZXT76ksYFPXTo0MDd/eeff2rzzTcXX0BMT0cpkwDkC/qaa67R9ddfr/HjxwdiaYstttAFF1wwR9lM7Y0GuTfeeENnnnmmnnzyyUBo/eMf/9All1yitm3bzi6WPgUcCaYLL7wwEM58pTFFyRcaZddff/3ZZWHDSwYLOslFF11UG2ywQTAVv/TSS8/F4vHHHw88sg8++KC+//57jRo1St26dQv47LHHHnM0hWkXeDKdtO6662Z9rIgoprsfffTRoA5MeTPtjxeC+mQSgB999JHo3HmmlF9ooYW01lpriWmx1C9RPh743W233aYvvvgiEBlLLbWUDjjggMAOSLDh2XN/pjOw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8ZKuCkUg3hvWchEIemlJbP5Yr2xr74rVPYE333xTa621Vt4bMR283Xbb6b777sub1xlMoD4JePy2AExkbzagRPhcuOwJTAxDwnAUHMGf8eLw4+m8sn90dVzB4cOHa4899oh1lxVWWEHjx4+PldeZTKC+CHj8tgBMZGs2oET4XNgETKBCCbC5o3fv3rFq36VLF40ZMyZWXmcygfoi4PHbAjCRrdmAEuFzYRMwgQolMGnSJC255JLBbt9ciY0gRx99tAYPHlyhLXW1q5WAx28LwES2bQNKhM+FTcAEKpjA7rvvrnvuuSenCCQO4AcffKDllnO4oAp+1FVZdY/fFoCJDNsGlAifC5uACVQwga+//lrrrbee8AZm8wSef/75OvHEEyu4la56tRLw+G0BmMi2bUCJ8LmwCZhAhROYMGGC+vXrp4ceeiiIBYjHj/+2b99eZ511lvbfn5BCTiZQfgQ8flsAJrJKG1AifC5sAiZQJQQ+//xzPfXUU/rjjz+07LLLqkePHsGJIE4mUK4EPH5bACayTRtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAImYAIm0CAEPH5bACYyPBtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAImYAIm0CAEPH5bACYyPBtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAImYAIm0CAEPH5bACYyPBtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAImYAIm0CAEPH5bACYyPBtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAImYAIm0CAEPH5bACYyPBtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAImYAIm0CAEPH5bACYyPBtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAImYAIm0CAEPH5bACYyPBtQInwubAImYAImYAINQsDjtwVgIsOzASXC58ImYAIVQOC7777TiBEjNGHCBC244ILaYYcd1Llz5wqouatoAtkJePy2AEz0ftiAEuFzYRMwgTImMHXqVB1//PG69tprNWPGDDVp0iT4719//aVNN91Ut99+u5ZYYokyboGrZgIWgLlsoNHMmTNn2kiKI2ABWBw3lzIBEyhvAgi9XXbZRffdd58yDRFNmzZV+/bt9dprr6ldu3bl3RjXzgQyEPD4bQ9gohfDBpQIXx0Vnibpv5I+l7SApK0kLVZH9/JlTaA6CTz44IPafvvtczYOj+Chhx6qK6+8sjohuFVVTcDjtwVgIgO3ASXCV+LCOLKvljRI0neSGknid00k7SLpCkmLlPievpwJVCeBnj176qmnngqme3Ol+eefX5MmTVKLFi2qE4RbVbUEPH5bACYybhtQInwlLnyqpLOzXBMRuKyklyW1KfF9fTkTqD4CbPb45ZdfYjXsf//7n9Zbb71YeZ3JBMqFgMdvC8BEtmgDSoSvhIXfkLR2nushAg+RdFUJ7+tLmUB1EsCj9+uvv8Zq3OjRo7X++uvHyutMJlAuBDx+WwAmskUbUCJ8JSx8gKRbJU3Pc83mkr6R1LKE9/alTKD6CGy44YbCs8dmkFxpnnnm0TfffKM2bexZrz4rqO4Wefy2AExk4TagRPhKWLiDpK9iXu8pSZvHzOtsJlCbBIYOHao+ffrkbDw7gffYYw/deisfX04mUFkEPH5bACayWBtQInwlLLyopG9jXu9RSb1i5nU2E6hNAtOmTVP37t31yiuvZNwIwg5g1gkSBqZTp061CcmtrmgCHr8tABMZsA0oEb4SFu4u6UVJuXcszrrhR5I8YJUQvi9VpQQmT56sPffcU4888ojw9jEd3LhxY02fPl0dO3bUyJEjtdpqq1Vp692saifg8dsCMJGN24AS4Sth4WGS9sxzPTaBbCLpmRLe15cygeon8M477wTTvNFRcDvuuKMIE4MX0MkEKpWAx28LwES2awNKhK+EhadKYhfiO1m8gMQEZLB6VtJGJbyvL2UCJmACJlCJBDx+WwAmslsbUCJ8JS5M8OdtJb0qqWnKjmDEH7t/R0jarsT39OVMwARMwAQqkYDHbwvARHZrA0qErw4KE7KCXb43SfpU0oKSOM6qr6TWdXA/X9IETMAETKASCXj8tgBMZLc2oET4XNgETMAETMAEGoSAx28LwESGZwNKhM+FTcAETMAETKBBCHj8tgBMZHg2oET4XNgETMAETMAEGoSAx28LwESGV9sGxEHxnBW6kKRmiTi6sAmYgAmYgAnUJ4HaHr9nkW40c+bMmfUJvVzude655+ree+/VuHHj1Lx5c3H25fnnn68VV1wxdhVrz4AwlfskXSrp+ZDTfJL2lnScpJVis3PGQgn8IOn1cHfzKpKWKfQCzm8CJmACJhASqL3xe+5HX7MCsFevXtp999217rrrBpHtTznlFI0ZM0Zjx47VAgssEOslqS0DQvwdLemKMKZe6qkbhF3h50FJPWKxc6a4BL6W9G9JBLuellJoK0nnSFo77oWczwRMwARMwAJwtg3UrABMfwu+++47tWvXTs8995y6desW6yWpLQF4g6SDc3CJ4u19KGnxWPycKR+BL8MA15xzPD0tM4GtEd2PSdo034X8dxMwARMwgRQCtTV+Z370FoAhl48++kjLL7984AXs0qVLrBeldgwI79/ykj6RlGvFAKLkNEkDYvFzpnwEtpA0KoP4i8o1DuMbTpDEVHy29LakoZIQkqzZ3CUUloh2JxMwAROoPQK1M35nf7YWgEiamTO1ww476KefftLzz0dr2+aG9ueff4qfKGFAHTp0EIemt2zZsorfoLckrRmzfZ0kfRQzr7NlJzBO0soxAd0arsNMz866wd0lPRl6C6O/401k6vheSUvFvIezmYAJmED1ELAArOFNIKlmfPjhh+vhhx/WCy+8oCWXXDKrhQ8cOFCDBg2a6+/VLwAREFvGfPM5ceOnmHmdLTsBNtocL4nTTXIlvIB49IanZfpN0oaS3s1yPjLTx0zVvyapbQEPgmlpni9l2hdQzllNwARMoHwIWABaAOrII4/UyJEjNWrUKHXs2DGnddauB/BNSWvFfHPtAYwJKk+2syUNzDH9m1r8H5IeSLvelZKOijFlf4Kkc/PUhWn/OyVdIOmNlLysPTxJUs/SNNlXMQETMIF6ImABWMMCkGlfxN99992nZ599Nlj/V2iqHQPyGsBCbSN5/tuzTOumXxlP3iGSEHypiXBGbMjJF+UJj+2kHLEcKd9f0oWS8DameiRZ88lu8MtCsZm81b6CCZiACdQHgdoZv7PTrNk1gIcddpiGDh2q+++/f47Yf61atQriAsZJtWVA14dCIxsZ7wKOYzPx8xBkezFJBNzOl4gPmOqhnSpp3nyFUv7O5p5s3u+7wynmfJd7SdIG+TL571VOgGgKN998s9588001atRI6623nvr27auFFmLzkZMJlA+B2hq/M3OvWQFI55QpDRkyRPvuu28sK60tA8ITxJQinqbI8xNhchzAWAZTcKazwl3V2QryHIgH+EhahkIF4Kc5Aksj6l7JsxaR5//PMFZhwY10gSogwIwKgfRPO+00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\" width=\"640\">"
3092 ],
3093 "text/plain": [
3094 "<IPython.core.display.HTML object>"
3095 ]
3096 },
3097 "metadata": {},
3098 "output_type": "display_data"
3099 }
3100 ],
3101 "source": [
3102 "plt.figure()\n",
3103 "plt.title('Sample binary classification problem with two informative features')\n",
3104 "X_C2, y_C2 = make_classification(n_samples = 100, n_features=2,\n",
3105 " n_redundant=0, n_informative=2,\n",
3106 " n_clusters_per_class=1, flip_y = 0.1,\n",
3107 " class_sep = 0.5, random_state=0)\n",
3108 "plt.scatter(X_C2[:, 0], X_C2[:, 1], c=y_C2,\n",
3109 " marker= 'o', s=50, cmap=cmap_bold)\n",
3110 "plt.show()"
3111 ]
3112 },
3113 {
3114 "cell_type": "code",
3115 "execution_count": 14,
3116 "id": "67caf379",
3117 "metadata": {},
3118 "outputs": [
3119 {
3120 "data": {
3121 "application/javascript": [
3122 "/* Put everything inside the global mpl namespace */\n",
3123 "/* global mpl */\n",
3124 "window.mpl = {};\n",
3125 "\n",
3126 "mpl.get_websocket_type = function () {\n",
3127 " if (typeof WebSocket !== 'undefined') {\n",
3128 " return WebSocket;\n",
3129 " } else if (typeof MozWebSocket !== 'undefined') {\n",
3130 " return MozWebSocket;\n",
3131 " } else {\n",
3132 " alert(\n",
3133 " 'Your browser does not have WebSocket support. ' +\n",
3134 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
3135 " 'Firefox 4 and 5 are also supported but you ' +\n",
3136 " 'have to enable WebSockets in about:config.'\n",
3137 " );\n",
3138 " }\n",
3139 "};\n",
3140 "\n",
3141 "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
3142 " this.id = figure_id;\n",
3143 "\n",
3144 " this.ws = websocket;\n",
3145 "\n",
3146 " this.supports_binary = this.ws.binaryType !== undefined;\n",
3147 "\n",
3148 " if (!this.supports_binary) {\n",
3149 " var warnings = document.getElementById('mpl-warnings');\n",
3150 " if (warnings) {\n",
3151 " warnings.style.display = 'block';\n",
3152 " warnings.textContent =\n",
3153 " 'This browser does not support binary websocket messages. ' +\n",
3154 " 'Performance may be slow.';\n",
3155 " }\n",
3156 " }\n",
3157 "\n",
3158 " this.imageObj = new Image();\n",
3159 "\n",
3160 " this.context = undefined;\n",
3161 " this.message = undefined;\n",
3162 " this.canvas = undefined;\n",
3163 " this.rubberband_canvas = undefined;\n",
3164 " this.rubberband_context = undefined;\n",
3165 " this.format_dropdown = undefined;\n",
3166 "\n",
3167 " this.image_mode = 'full';\n",
3168 "\n",
3169 " this.root = document.createElement('div');\n",
3170 " this.root.setAttribute('style', 'display: inline-block');\n",
3171 " this._root_extra_style(this.root);\n",
3172 "\n",
3173 " parent_element.appendChild(this.root);\n",
3174 "\n",
3175 " this._init_header(this);\n",
3176 " this._init_canvas(this);\n",
3177 " this._init_toolbar(this);\n",
3178 "\n",
3179 " var fig = this;\n",
3180 "\n",
3181 " this.waiting = false;\n",
3182 "\n",
3183 " this.ws.onopen = function () {\n",
3184 " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
3185 " fig.send_message('send_image_mode', {});\n",
3186 " if (fig.ratio !== 1) {\n",
3187 " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
3188 " }\n",
3189 " fig.send_message('refresh', {});\n",
3190 " };\n",
3191 "\n",
3192 " this.imageObj.onload = function () {\n",
3193 " if (fig.image_mode === 'full') {\n",
3194 " // Full images could contain transparency (where diff images\n",
3195 " // almost always do), so we need to clear the canvas so that\n",
3196 " // there is no ghosting.\n",
3197 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
3198 " }\n",
3199 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
3200 " };\n",
3201 "\n",
3202 " this.imageObj.onunload = function () {\n",
3203 " fig.ws.close();\n",
3204 " };\n",
3205 "\n",
3206 " this.ws.onmessage = this._make_on_message_function(this);\n",
3207 "\n",
3208 " this.ondownload = ondownload;\n",
3209 "};\n",
3210 "\n",
3211 "mpl.figure.prototype._init_header = function () {\n",
3212 " var titlebar = document.createElement('div');\n",
3213 " titlebar.classList =\n",
3214 " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
3215 " var titletext = document.createElement('div');\n",
3216 " titletext.classList = 'ui-dialog-title';\n",
3217 " titletext.setAttribute(\n",
3218 " 'style',\n",
3219 " 'width: 100%; text-align: center; padding: 3px;'\n",
3220 " );\n",
3221 " titlebar.appendChild(titletext);\n",
3222 " this.root.appendChild(titlebar);\n",
3223 " this.header = titletext;\n",
3224 "};\n",
3225 "\n",
3226 "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
3227 "\n",
3228 "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
3229 "\n",
3230 "mpl.figure.prototype._init_canvas = function () {\n",
3231 " var fig = this;\n",
3232 "\n",
3233 " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
3234 " canvas_div.setAttribute(\n",
3235 " 'style',\n",
3236 " 'border: 1px solid #ddd;' +\n",
3237 " 'box-sizing: content-box;' +\n",
3238 " 'clear: both;' +\n",
3239 " 'min-height: 1px;' +\n",
3240 " 'min-width: 1px;' +\n",
3241 " 'outline: 0;' +\n",
3242 " 'overflow: hidden;' +\n",
3243 " 'position: relative;' +\n",
3244 " 'resize: both;'\n",
3245 " );\n",
3246 "\n",
3247 " function on_keyboard_event_closure(name) {\n",
3248 " return function (event) {\n",
3249 " return fig.key_event(event, name);\n",
3250 " };\n",
3251 " }\n",
3252 "\n",
3253 " canvas_div.addEventListener(\n",
3254 " 'keydown',\n",
3255 " on_keyboard_event_closure('key_press')\n",
3256 " );\n",
3257 " canvas_div.addEventListener(\n",
3258 " 'keyup',\n",
3259 " on_keyboard_event_closure('key_release')\n",
3260 " );\n",
3261 "\n",
3262 " this._canvas_extra_style(canvas_div);\n",
3263 " this.root.appendChild(canvas_div);\n",
3264 "\n",
3265 " var canvas = (this.canvas = document.createElement('canvas'));\n",
3266 " canvas.classList.add('mpl-canvas');\n",
3267 " canvas.setAttribute('style', 'box-sizing: content-box;');\n",
3268 "\n",
3269 " this.context = canvas.getContext('2d');\n",
3270 "\n",
3271 " var backingStore =\n",
3272 " this.context.backingStorePixelRatio ||\n",
3273 " this.context.webkitBackingStorePixelRatio ||\n",
3274 " this.context.mozBackingStorePixelRatio ||\n",
3275 " this.context.msBackingStorePixelRatio ||\n",
3276 " this.context.oBackingStorePixelRatio ||\n",
3277 " this.context.backingStorePixelRatio ||\n",
3278 " 1;\n",
3279 "\n",
3280 " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
3281 "\n",
3282 " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
3283 " 'canvas'\n",
3284 " ));\n",
3285 " rubberband_canvas.setAttribute(\n",
3286 " 'style',\n",
3287 " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
3288 " );\n",
3289 "\n",
3290 " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
3291 " if (this.ResizeObserver === undefined) {\n",
3292 " if (window.ResizeObserver !== undefined) {\n",
3293 " this.ResizeObserver = window.ResizeObserver;\n",
3294 " } else {\n",
3295 " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
3296 " this.ResizeObserver = obs.ResizeObserver;\n",
3297 " }\n",
3298 " }\n",
3299 "\n",
3300 " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
3301 " var nentries = entries.length;\n",
3302 " for (var i = 0; i < nentries; i++) {\n",
3303 " var entry = entries[i];\n",
3304 " var width, height;\n",
3305 " if (entry.contentBoxSize) {\n",
3306 " if (entry.contentBoxSize instanceof Array) {\n",
3307 " // Chrome 84 implements new version of spec.\n",
3308 " width = entry.contentBoxSize[0].inlineSize;\n",
3309 " height = entry.contentBoxSize[0].blockSize;\n",
3310 " } else {\n",
3311 " // Firefox implements old version of spec.\n",
3312 " width = entry.contentBoxSize.inlineSize;\n",
3313 " height = entry.contentBoxSize.blockSize;\n",
3314 " }\n",
3315 " } else {\n",
3316 " // Chrome <84 implements even older version of spec.\n",
3317 " width = entry.contentRect.width;\n",
3318 " height = entry.contentRect.height;\n",
3319 " }\n",
3320 "\n",
3321 " // Keep the size of the canvas and rubber band canvas in sync with\n",
3322 " // the canvas container.\n",
3323 " if (entry.devicePixelContentBoxSize) {\n",
3324 " // Chrome 84 implements new version of spec.\n",
3325 " canvas.setAttribute(\n",
3326 " 'width',\n",
3327 " entry.devicePixelContentBoxSize[0].inlineSize\n",
3328 " );\n",
3329 " canvas.setAttribute(\n",
3330 " 'height',\n",
3331 " entry.devicePixelContentBoxSize[0].blockSize\n",
3332 " );\n",
3333 " } else {\n",
3334 " canvas.setAttribute('width', width * fig.ratio);\n",
3335 " canvas.setAttribute('height', height * fig.ratio);\n",
3336 " }\n",
3337 " canvas.setAttribute(\n",
3338 " 'style',\n",
3339 " 'width: ' + width + 'px; height: ' + height + 'px;'\n",
3340 " );\n",
3341 "\n",
3342 " rubberband_canvas.setAttribute('width', width);\n",
3343 " rubberband_canvas.setAttribute('height', height);\n",
3344 "\n",
3345 " // And update the size in Python. We ignore the initial 0/0 size\n",
3346 " // that occurs as the element is placed into the DOM, which should\n",
3347 " // otherwise not happen due to the minimum size styling.\n",
3348 " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
3349 " fig.request_resize(width, height);\n",
3350 " }\n",
3351 " }\n",
3352 " });\n",
3353 " this.resizeObserverInstance.observe(canvas_div);\n",
3354 "\n",
3355 " function on_mouse_event_closure(name) {\n",
3356 " return function (event) {\n",
3357 " return fig.mouse_event(event, name);\n",
3358 " };\n",
3359 " }\n",
3360 "\n",
3361 " rubberband_canvas.addEventListener(\n",
3362 " 'mousedown',\n",
3363 " on_mouse_event_closure('button_press')\n",
3364 " );\n",
3365 " rubberband_canvas.addEventListener(\n",
3366 " 'mouseup',\n",
3367 " on_mouse_event_closure('button_release')\n",
3368 " );\n",
3369 " // Throttle sequential mouse events to 1 every 20ms.\n",
3370 " rubberband_canvas.addEventListener(\n",
3371 " 'mousemove',\n",
3372 " on_mouse_event_closure('motion_notify')\n",
3373 " );\n",
3374 "\n",
3375 " rubberband_canvas.addEventListener(\n",
3376 " 'mouseenter',\n",
3377 " on_mouse_event_closure('figure_enter')\n",
3378 " );\n",
3379 " rubberband_canvas.addEventListener(\n",
3380 " 'mouseleave',\n",
3381 " on_mouse_event_closure('figure_leave')\n",
3382 " );\n",
3383 "\n",
3384 " canvas_div.addEventListener('wheel', function (event) {\n",
3385 " if (event.deltaY < 0) {\n",
3386 " event.step = 1;\n",
3387 " } else {\n",
3388 " event.step = -1;\n",
3389 " }\n",
3390 " on_mouse_event_closure('scroll')(event);\n",
3391 " });\n",
3392 "\n",
3393 " canvas_div.appendChild(canvas);\n",
3394 " canvas_div.appendChild(rubberband_canvas);\n",
3395 "\n",
3396 " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
3397 " this.rubberband_context.strokeStyle = '#000000';\n",
3398 "\n",
3399 " this._resize_canvas = function (width, height, forward) {\n",
3400 " if (forward) {\n",
3401 " canvas_div.style.width = width + 'px';\n",
3402 " canvas_div.style.height = height + 'px';\n",
3403 " }\n",
3404 " };\n",
3405 "\n",
3406 " // Disable right mouse context menu.\n",
3407 " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
3408 " event.preventDefault();\n",
3409 " return false;\n",
3410 " });\n",
3411 "\n",
3412 " function set_focus() {\n",
3413 " canvas.focus();\n",
3414 " canvas_div.focus();\n",
3415 " }\n",
3416 "\n",
3417 " window.setTimeout(set_focus, 100);\n",
3418 "};\n",
3419 "\n",
3420 "mpl.figure.prototype._init_toolbar = function () {\n",
3421 " var fig = this;\n",
3422 "\n",
3423 " var toolbar = document.createElement('div');\n",
3424 " toolbar.classList = 'mpl-toolbar';\n",
3425 " this.root.appendChild(toolbar);\n",
3426 "\n",
3427 " function on_click_closure(name) {\n",
3428 " return function (_event) {\n",
3429 " return fig.toolbar_button_onclick(name);\n",
3430 " };\n",
3431 " }\n",
3432 "\n",
3433 " function on_mouseover_closure(tooltip) {\n",
3434 " return function (event) {\n",
3435 " if (!event.currentTarget.disabled) {\n",
3436 " return fig.toolbar_button_onmouseover(tooltip);\n",
3437 " }\n",
3438 " };\n",
3439 " }\n",
3440 "\n",
3441 " fig.buttons = {};\n",
3442 " var buttonGroup = document.createElement('div');\n",
3443 " buttonGroup.classList = 'mpl-button-group';\n",
3444 " for (var toolbar_ind in mpl.toolbar_items) {\n",
3445 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
3446 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
3447 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
3448 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
3449 "\n",
3450 " if (!name) {\n",
3451 " /* Instead of a spacer, we start a new button group. */\n",
3452 " if (buttonGroup.hasChildNodes()) {\n",
3453 " toolbar.appendChild(buttonGroup);\n",
3454 " }\n",
3455 " buttonGroup = document.createElement('div');\n",
3456 " buttonGroup.classList = 'mpl-button-group';\n",
3457 " continue;\n",
3458 " }\n",
3459 "\n",
3460 " var button = (fig.buttons[name] = document.createElement('button'));\n",
3461 " button.classList = 'mpl-widget';\n",
3462 " button.setAttribute('role', 'button');\n",
3463 " button.setAttribute('aria-disabled', 'false');\n",
3464 " button.addEventListener('click', on_click_closure(method_name));\n",
3465 " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
3466 "\n",
3467 " var icon_img = document.createElement('img');\n",
3468 " icon_img.src = '_images/' + image + '.png';\n",
3469 " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
3470 " icon_img.alt = tooltip;\n",
3471 " button.appendChild(icon_img);\n",
3472 "\n",
3473 " buttonGroup.appendChild(button);\n",
3474 " }\n",
3475 "\n",
3476 " if (buttonGroup.hasChildNodes()) {\n",
3477 " toolbar.appendChild(buttonGroup);\n",
3478 " }\n",
3479 "\n",
3480 " var fmt_picker = document.createElement('select');\n",
3481 " fmt_picker.classList = 'mpl-widget';\n",
3482 " toolbar.appendChild(fmt_picker);\n",
3483 " this.format_dropdown = fmt_picker;\n",
3484 "\n",
3485 " for (var ind in mpl.extensions) {\n",
3486 " var fmt = mpl.extensions[ind];\n",
3487 " var option = document.createElement('option');\n",
3488 " option.selected = fmt === mpl.default_extension;\n",
3489 " option.innerHTML = fmt;\n",
3490 " fmt_picker.appendChild(option);\n",
3491 " }\n",
3492 "\n",
3493 " var status_bar = document.createElement('span');\n",
3494 " status_bar.classList = 'mpl-message';\n",
3495 " toolbar.appendChild(status_bar);\n",
3496 " this.message = status_bar;\n",
3497 "};\n",
3498 "\n",
3499 "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
3500 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
3501 " // which will in turn request a refresh of the image.\n",
3502 " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
3503 "};\n",
3504 "\n",
3505 "mpl.figure.prototype.send_message = function (type, properties) {\n",
3506 " properties['type'] = type;\n",
3507 " properties['figure_id'] = this.id;\n",
3508 " this.ws.send(JSON.stringify(properties));\n",
3509 "};\n",
3510 "\n",
3511 "mpl.figure.prototype.send_draw_message = function () {\n",
3512 " if (!this.waiting) {\n",
3513 " this.waiting = true;\n",
3514 " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
3515 " }\n",
3516 "};\n",
3517 "\n",
3518 "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
3519 " var format_dropdown = fig.format_dropdown;\n",
3520 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
3521 " fig.ondownload(fig, format);\n",
3522 "};\n",
3523 "\n",
3524 "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
3525 " var size = msg['size'];\n",
3526 " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
3527 " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
3528 " fig.send_message('refresh', {});\n",
3529 " }\n",
3530 "};\n",
3531 "\n",
3532 "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
3533 " var x0 = msg['x0'] / fig.ratio;\n",
3534 " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
3535 " var x1 = msg['x1'] / fig.ratio;\n",
3536 " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
3537 " x0 = Math.floor(x0) + 0.5;\n",
3538 " y0 = Math.floor(y0) + 0.5;\n",
3539 " x1 = Math.floor(x1) + 0.5;\n",
3540 " y1 = Math.floor(y1) + 0.5;\n",
3541 " var min_x = Math.min(x0, x1);\n",
3542 " var min_y = Math.min(y0, y1);\n",
3543 " var width = Math.abs(x1 - x0);\n",
3544 " var height = Math.abs(y1 - y0);\n",
3545 "\n",
3546 " fig.rubberband_context.clearRect(\n",
3547 " 0,\n",
3548 " 0,\n",
3549 " fig.canvas.width / fig.ratio,\n",
3550 " fig.canvas.height / fig.ratio\n",
3551 " );\n",
3552 "\n",
3553 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
3554 "};\n",
3555 "\n",
3556 "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
3557 " // Updates the figure title.\n",
3558 " fig.header.textContent = msg['label'];\n",
3559 "};\n",
3560 "\n",
3561 "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
3562 " var cursor = msg['cursor'];\n",
3563 " switch (cursor) {\n",
3564 " case 0:\n",
3565 " cursor = 'pointer';\n",
3566 " break;\n",
3567 " case 1:\n",
3568 " cursor = 'default';\n",
3569 " break;\n",
3570 " case 2:\n",
3571 " cursor = 'crosshair';\n",
3572 " break;\n",
3573 " case 3:\n",
3574 " cursor = 'move';\n",
3575 " break;\n",
3576 " }\n",
3577 " fig.rubberband_canvas.style.cursor = cursor;\n",
3578 "};\n",
3579 "\n",
3580 "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
3581 " fig.message.textContent = msg['message'];\n",
3582 "};\n",
3583 "\n",
3584 "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
3585 " // Request the server to send over a new figure.\n",
3586 " fig.send_draw_message();\n",
3587 "};\n",
3588 "\n",
3589 "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
3590 " fig.image_mode = msg['mode'];\n",
3591 "};\n",
3592 "\n",
3593 "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
3594 " for (var key in msg) {\n",
3595 " if (!(key in fig.buttons)) {\n",
3596 " continue;\n",
3597 " }\n",
3598 " fig.buttons[key].disabled = !msg[key];\n",
3599 " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
3600 " }\n",
3601 "};\n",
3602 "\n",
3603 "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
3604 " if (msg['mode'] === 'PAN') {\n",
3605 " fig.buttons['Pan'].classList.add('active');\n",
3606 " fig.buttons['Zoom'].classList.remove('active');\n",
3607 " } else if (msg['mode'] === 'ZOOM') {\n",
3608 " fig.buttons['Pan'].classList.remove('active');\n",
3609 " fig.buttons['Zoom'].classList.add('active');\n",
3610 " } else {\n",
3611 " fig.buttons['Pan'].classList.remove('active');\n",
3612 " fig.buttons['Zoom'].classList.remove('active');\n",
3613 " }\n",
3614 "};\n",
3615 "\n",
3616 "mpl.figure.prototype.updated_canvas_event = function () {\n",
3617 " // Called whenever the canvas gets updated.\n",
3618 " this.send_message('ack', {});\n",
3619 "};\n",
3620 "\n",
3621 "// A function to construct a web socket function for onmessage handling.\n",
3622 "// Called in the figure constructor.\n",
3623 "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
3624 " return function socket_on_message(evt) {\n",
3625 " if (evt.data instanceof Blob) {\n",
3626 " /* FIXME: We get \"Resource interpreted as Image but\n",
3627 " * transferred with MIME type text/plain:\" errors on\n",
3628 " * Chrome. But how to set the MIME type? It doesn't seem\n",
3629 " * to be part of the websocket stream */\n",
3630 " evt.data.type = 'image/png';\n",
3631 "\n",
3632 " /* Free the memory for the previous frames */\n",
3633 " if (fig.imageObj.src) {\n",
3634 " (window.URL || window.webkitURL).revokeObjectURL(\n",
3635 " fig.imageObj.src\n",
3636 " );\n",
3637 " }\n",
3638 "\n",
3639 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
3640 " evt.data\n",
3641 " );\n",
3642 " fig.updated_canvas_event();\n",
3643 " fig.waiting = false;\n",
3644 " return;\n",
3645 " } else if (\n",
3646 " typeof evt.data === 'string' &&\n",
3647 " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
3648 " ) {\n",
3649 " fig.imageObj.src = evt.data;\n",
3650 " fig.updated_canvas_event();\n",
3651 " fig.waiting = false;\n",
3652 " return;\n",
3653 " }\n",
3654 "\n",
3655 " var msg = JSON.parse(evt.data);\n",
3656 " var msg_type = msg['type'];\n",
3657 "\n",
3658 " // Call the \"handle_{type}\" callback, which takes\n",
3659 " // the figure and JSON message as its only arguments.\n",
3660 " try {\n",
3661 " var callback = fig['handle_' + msg_type];\n",
3662 " } catch (e) {\n",
3663 " console.log(\n",
3664 " \"No handler for the '\" + msg_type + \"' message type: \",\n",
3665 " msg\n",
3666 " );\n",
3667 " return;\n",
3668 " }\n",
3669 "\n",
3670 " if (callback) {\n",
3671 " try {\n",
3672 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
3673 " callback(fig, msg);\n",
3674 " } catch (e) {\n",
3675 " console.log(\n",
3676 " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
3677 " e,\n",
3678 " e.stack,\n",
3679 " msg\n",
3680 " );\n",
3681 " }\n",
3682 " }\n",
3683 " };\n",
3684 "};\n",
3685 "\n",
3686 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
3687 "mpl.findpos = function (e) {\n",
3688 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
3689 " var targ;\n",
3690 " if (!e) {\n",
3691 " e = window.event;\n",
3692 " }\n",
3693 " if (e.target) {\n",
3694 " targ = e.target;\n",
3695 " } else if (e.srcElement) {\n",
3696 " targ = e.srcElement;\n",
3697 " }\n",
3698 " if (targ.nodeType === 3) {\n",
3699 " // defeat Safari bug\n",
3700 " targ = targ.parentNode;\n",
3701 " }\n",
3702 "\n",
3703 " // pageX,Y are the mouse positions relative to the document\n",
3704 " var boundingRect = targ.getBoundingClientRect();\n",
3705 " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
3706 " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
3707 "\n",
3708 " return { x: x, y: y };\n",
3709 "};\n",
3710 "\n",
3711 "/*\n",
3712 " * return a copy of an object with only non-object keys\n",
3713 " * we need this to avoid circular references\n",
3714 " * http://stackoverflow.com/a/24161582/3208463\n",
3715 " */\n",
3716 "function simpleKeys(original) {\n",
3717 " return Object.keys(original).reduce(function (obj, key) {\n",
3718 " if (typeof original[key] !== 'object') {\n",
3719 " obj[key] = original[key];\n",
3720 " }\n",
3721 " return obj;\n",
3722 " }, {});\n",
3723 "}\n",
3724 "\n",
3725 "mpl.figure.prototype.mouse_event = function (event, name) {\n",
3726 " var canvas_pos = mpl.findpos(event);\n",
3727 "\n",
3728 " if (name === 'button_press') {\n",
3729 " this.canvas.focus();\n",
3730 " this.canvas_div.focus();\n",
3731 " }\n",
3732 "\n",
3733 " var x = canvas_pos.x * this.ratio;\n",
3734 " var y = canvas_pos.y * this.ratio;\n",
3735 "\n",
3736 " this.send_message(name, {\n",
3737 " x: x,\n",
3738 " y: y,\n",
3739 " button: event.button,\n",
3740 " step: event.step,\n",
3741 " guiEvent: simpleKeys(event),\n",
3742 " });\n",
3743 "\n",
3744 " /* This prevents the web browser from automatically changing to\n",
3745 " * the text insertion cursor when the button is pressed. We want\n",
3746 " * to control all of the cursor setting manually through the\n",
3747 " * 'cursor' event from matplotlib */\n",
3748 " event.preventDefault();\n",
3749 " return false;\n",
3750 "};\n",
3751 "\n",
3752 "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
3753 " // Handle any extra behaviour associated with a key event\n",
3754 "};\n",
3755 "\n",
3756 "mpl.figure.prototype.key_event = function (event, name) {\n",
3757 "